@atlaskit/adf-schema
Version:
Shared package that contains the ADF-schema (json) and ProseMirror node/mark specs
88 lines (85 loc) • 2.34 kB
JavaScript
import { layoutColumn as layoutColumnFactory } from '../../next-schema/generated/nodeTypes';
import { uuid } from '../../utils/uuid';
import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
import { parseValign } from './types/valign';
const setColumnAttributes = (node, {
withLocalId = false
} = {}) => {
const attrs = {
'data-layout-column': 'true'
};
const {
width,
valign,
localId
} = node.attrs;
if (width) {
const baseStyle = `flex-basis: ${width}%`;
const columnWidthVar = editorExperiment('platform_editor_layout_column_resize_handle', true) ? `; --column-width: ${width}%` : '';
attrs['style'] = baseStyle + columnWidthVar;
attrs['data-column-width'] = `${width}`;
}
if (valign) {
attrs['data-valign'] = valign;
}
if (withLocalId && localId) {
attrs['data-local-id'] = localId;
}
return attrs;
};
const getColumnAttrs = ({
withLocalId = false
} = {}) => domNode => {
// eslint-disable-next-line @atlaskit/editor/no-as-casting
const dom = domNode;
const base = {
width: Number(dom.getAttribute('data-column-width')) || undefined,
...(withLocalId && {
localId: uuid.generate()
})
};
const valign = parseValign(dom.getAttribute('data-valign'));
return valign ? {
...base,
valign
} : base;
};
// We need to apply an attribute to the innermost child to help ProseMirror
// identify its boundaries better.
const LAYOUT_CONTENT_ATTRS = {
'data-layout-content': 'true'
};
/**
* @name layoutColumn_node
*/
export const layoutColumn = layoutColumnFactory({
parseDOM: [{
context: 'layoutColumn//',
tag: 'div[data-layout-column]',
skip: true
}, {
tag: 'div[data-layout-column]',
getAttrs: getColumnAttrs()
}],
toDOM(node) {
return ['div', setColumnAttributes(node), ['div', LAYOUT_CONTENT_ATTRS, 0]];
}
});
export const layoutColumnWithLocalId = layoutColumnFactory({
parseDOM: [{
context: 'layoutColumn//',
tag: 'div[data-layout-column]',
skip: true
}, {
tag: 'div[data-layout-column]',
getAttrs: getColumnAttrs({
withLocalId: true
})
}],
toDOM(node) {
return ['div', setColumnAttributes(node, {
withLocalId: true
}), ['div', LAYOUT_CONTENT_ATTRS, 0]];
}
});
export const layoutColumnStage0 = layoutColumnWithLocalId;