diff --git a/editors/demo/src/HHMI/HHMI.js b/editors/demo/src/HHMI/HHMI.js index 1b8623619ce3aa22d9f3bb4f7b39fdacf367f5ca..290a7b726d42f082e7ea6c131061607c1d1029fc 100644 --- a/editors/demo/src/HHMI/HHMI.js +++ b/editors/demo/src/HHMI/HHMI.js @@ -18,13 +18,13 @@ const renderImage = file => { const ReadOnlyButton = styled.button` position: absolute; - left: 550px; + left: 600px; top: 16px; `; const SubmitButton = styled.button` position: absolute; - left: 650px; + left: 700px; top: 16px; `; diff --git a/editors/demo/src/OEN/OEN.js b/editors/demo/src/OEN/OEN.js index ad9098d6dceccc1f502d185736064141a84838d1..d311b98dd5d2efa25159d4a95f20ab934e489c79 100644 --- a/editors/demo/src/OEN/OEN.js +++ b/editors/demo/src/OEN/OEN.js @@ -26,6 +26,9 @@ const user = { username: 'admin', }; +const val = `<div class="introduction" data-type="content_structure_element"><p>Intro</p></div> + <div class="outline" data-type="content_structure_element"><p>outline</p></div> `; + const Oen = () => { const editorRef = useRef(); @@ -36,7 +39,7 @@ const Oen = () => { autoFocus placeholder="Type Something..." fileUpload={file => renderImage(file)} - value="" + value={val} // readonly layout={OenLayout} // onChange={debounce(source => { diff --git a/editors/demo/src/OEN/config/config.js b/editors/demo/src/OEN/config/config.js index d1b3bd87ccf373e643c66b70692d64da77cfdbd0..ea98ba3479001fff60b074d261b5ceb9d46355cc 100644 --- a/editors/demo/src/OEN/config/config.js +++ b/editors/demo/src/OEN/config/config.js @@ -43,6 +43,7 @@ import { CustomTagInlineToolGroupService, CustomTagBlockToolGroupService, CustomTagService, + OenContainersService, } from 'wax-prosemirror-services'; import { EditoriaSchema } from 'wax-prosemirror-utilities'; @@ -152,6 +153,7 @@ export default { }, services: [ + new OenContainersService(), new CustomTagService(), new DisplayBlockLevelService(), new DisplayToolGroupService(), diff --git a/editors/demo/src/OEN/config/configMobile.js b/editors/demo/src/OEN/config/configMobile.js deleted file mode 100644 index 64ff3e489af4c88cddfcf62c5811ce434b150b20..0000000000000000000000000000000000000000 --- a/editors/demo/src/OEN/config/configMobile.js +++ /dev/null @@ -1,129 +0,0 @@ -import { emDash, ellipsis } from 'prosemirror-inputrules'; -import { columnResizing, tableEditing } from 'prosemirror-tables'; -import { - AnnotationToolGroupService, - ImageService, - InlineAnnotationsService, - LinkService, - ListsService, - ListToolGroupService, - TablesService, - TableToolGroupService, - BaseService, - BaseToolGroupService, - DisplayBlockLevelService, - DisplayToolGroupService, - ImageToolGroupService, - TextBlockLevelService, - TextToolGroupService, - NoteService, - NoteToolGroupService, - EditingSuggestingService, - TrackChangeService, - CommentsService, - CodeBlockService, - CodeBlockToolGroupService, - DisplayTextToolGroupService, - BlockDropDownToolGroupService, - HighlightService, - TextHighlightToolGroupServices, - EditorInfoToolGroupServices, - BottomInfoService, - TransformService, - TransformToolGroupService, - CustomTagInlineToolGroupService, - CustomTagBlockToolGroupService, - CustomTagService, -} from 'wax-prosemirror-services'; - -import { DefaultSchema } from 'wax-prosemirror-utilities'; - -import invisibles, { - space, - hardBreak, - paragraph, -} from '@guardian/prosemirror-invisibles'; - -const updateTitle = title => {}; - -export default { - MenuService: [ - { - templateArea: 'topBar', - toolGroups: [ - 'Base', - { - name: 'Annotations', - more: ['Superscript', 'Subscript', 'SmallCaps'], - }, - 'HighlightToolGroup', - 'TransformToolGroup', - 'CustomTagInline', - 'BlockDropDown', - 'Notes', - 'Lists', - 'Images', - 'CodeBlock', - 'Tables', - // 'TrackChange', - ], - }, - { - templateArea: 'BottomRightInfo', - toolGroups: ['InfoToolGroup'], - }, - ], - - SchemaService: DefaultSchema, - RulesService: [emDash, ellipsis], - ShortCutsService: {}, - TitleService: { updateTitle }, - EnableTrackChangeService: { enabled: false }, - - PmPlugins: [columnResizing(), tableEditing(), invisibles([hardBreak()])], - CustomTagService: { - tags: [ - { label: 'custom-tag-label-1', tagType: 'inline' }, - { label: 'custom-tag-label-2', tagType: 'inline' }, - { label: 'custom-tag-label-3', tagType: 'block' }, - ], - }, - - // Always load first CommentsService and LinkService, - //as it matters on how PM treats nodes and marks - services: [ - new DisplayBlockLevelService(), - new DisplayToolGroupService(), - new TextBlockLevelService(), - new TextToolGroupService(), - new ListsService(), - new LinkService(), - new InlineAnnotationsService(), - new TrackChangeService(), - new CommentsService(), - new ImageService(), - new TablesService(), - new BaseService(), - new BaseToolGroupService(), - new NoteService(), - new TableToolGroupService(), - new ImageToolGroupService(), - new AnnotationToolGroupService(), - new NoteToolGroupService(), - new ListToolGroupService(), - new CodeBlockService(), - new CodeBlockToolGroupService(), - new EditingSuggestingService(), - new DisplayTextToolGroupService(), - new BlockDropDownToolGroupService(), - new HighlightService(), - new TextHighlightToolGroupServices(), - new EditorInfoToolGroupServices(), - new BottomInfoService(), - new TransformService(), - new TransformToolGroupService(), - new CustomTagService(), - new CustomTagInlineToolGroupService(), - new CustomTagBlockToolGroupService(), - ], -}; diff --git a/editors/demo/src/OEN/config/index.js b/editors/demo/src/OEN/config/index.js index 3744d8f4169b8815aa0862565077396223dc711b..28307f54868afa5e0822f8156b8b1439bfd3cdd4 100644 --- a/editors/demo/src/OEN/config/index.js +++ b/editors/demo/src/OEN/config/index.js @@ -1,2 +1 @@ export { default as config } from './config'; -export { default as configMobile } from './configMobile'; diff --git a/wax-prosemirror-schema/index.js b/wax-prosemirror-schema/index.js index a03d420b0c816266be37d180d7731075eb67e162..46b0496e81eb4e7d583aaf20f48ec56af1bbe5ff 100644 --- a/wax-prosemirror-schema/index.js +++ b/wax-prosemirror-schema/index.js @@ -45,6 +45,7 @@ export { default as codeBlockNode } from './src/nodes/codeBlockNode'; export { default as mathInlineNode } from './src/nodes/mathInlineNode'; export { default as mathDisplayNode } from './src/nodes/mathDisplayNode'; export { default as customBlockNode } from './src/nodes/customBlockNode'; +export { default as OenContainerNode } from './src/nodes/OenContainerNode'; /* LIST OF TRACK CHANGES NODES */ diff --git a/wax-prosemirror-schema/src/nodes/OenContainerNode.js b/wax-prosemirror-schema/src/nodes/OenContainerNode.js new file mode 100644 index 0000000000000000000000000000000000000000..9dad997452f76212402c95cfa588c91753f337f0 --- /dev/null +++ b/wax-prosemirror-schema/src/nodes/OenContainerNode.js @@ -0,0 +1,32 @@ +const OenContainerNode = { + content: 'block+', + group: 'block', + attrs: { + class: { default: '' }, + type: { default: 'content_structure_element' }, + }, + defining: true, + parseDOM: [ + { + tag: 'div[data-type="content_structure_element"]', + getAttrs(dom) { + return { + class: dom.getAttribute('class'), + type: dom.dataset.group, + }; + }, + }, + ], + toDOM(node) { + return [ + 'div', + { + class: node.attrs.class, + 'data-type': node.attrs.type, + }, + 0, + ]; + }, +}; + +export default OenContainerNode; diff --git a/wax-prosemirror-schema/src/nodes/authorNode.js b/wax-prosemirror-schema/src/nodes/authorNode.js index 5b954aac40e5d511785831a1b592fd3cf4a7d982..ceff388df662a3bc73a5e7fa23f362cd533cce0c 100644 --- a/wax-prosemirror-schema/src/nodes/authorNode.js +++ b/wax-prosemirror-schema/src/nodes/authorNode.js @@ -1,27 +1,27 @@ const author = { - content: "inline*", - group: "block", + content: 'inline*', + group: 'block', priority: 0, defining: true, attrs: { - class: { default: "author" } + class: { default: 'author' }, }, parseDOM: [ { - tag: "p.author", + tag: 'p.author', getAttrs(hook, next) { Object.assign(hook, { - class: hook.dom.getAttribute("class") + class: hook.dom.getAttribute('class'), }); next(); - } - } + }, + }, ], toDOM(hook, next) { const attrs = { class: hook.node.attrs.class }; - hook.value = ["p", attrs, 0]; + hook.value = ['p', attrs, 0]; next(); - } + }, }; export default author; diff --git a/wax-prosemirror-services/index.js b/wax-prosemirror-services/index.js index 7e3c3d1755b9827074ad011e41e913d8be070e4d..51d1b2d171b2f8e8c5c0a69a0f35ca0811335d7d 100644 --- a/wax-prosemirror-services/index.js +++ b/wax-prosemirror-services/index.js @@ -52,6 +52,8 @@ export { default as EssayService } from './src/EssayService/EssayService'; export { default as MatchingService } from './src/MatchingService/MatchingService'; export { default as EnterService } from './src/EnterService/EnterService'; export { default as MultipleDropDownService } from './src/MultipleDropDownService/MultipleDropDownService'; + +export { default as OenContainersService } from './src/OenContainersService/OenContainersService'; /* ToolGroups */ diff --git a/wax-prosemirror-services/src/OenContainersService/OenContainersService.js b/wax-prosemirror-services/src/OenContainersService/OenContainersService.js new file mode 100644 index 0000000000000000000000000000000000000000..df00c33bd078579c4b1d6f6c376ef335b8914318 --- /dev/null +++ b/wax-prosemirror-services/src/OenContainersService/OenContainersService.js @@ -0,0 +1,19 @@ +import { OenContainerNode } from 'wax-prosemirror-schema'; +import Service from '../Service'; +import './oenContainers.css'; + +class OenContainersService extends Service { + name = 'OenContainersService'; + + boot() {} + + register() { + const createNode = this.container.get('CreateNode'); + + createNode({ + oen_container: OenContainerNode, + }); + } +} + +export default OenContainersService; diff --git a/wax-prosemirror-services/src/OenContainersService/oenContainers.css b/wax-prosemirror-services/src/OenContainersService/oenContainers.css new file mode 100644 index 0000000000000000000000000000000000000000..b073c4d39d087217de99625915d7dce63719ccd1 --- /dev/null +++ b/wax-prosemirror-services/src/OenContainersService/oenContainers.css @@ -0,0 +1,21 @@ +.introduction, .outline { + border-left: 3px solid #f5f5f7; + padding: 10px 10px 0 10px; + +} + +.introduction::before, +.outline::before { + border: 3px solid #f5f5f7; + background-color: #f5f5f7; + width: 100%; + display: block; +} + +.introduction::before { + content: 'Introduction Section'; +} + +.outline::before { + content: 'Outline Section'; +} \ No newline at end of file diff --git a/wax-prosemirror-services/src/ShortCutsService/ShortCuts.js b/wax-prosemirror-services/src/ShortCutsService/ShortCuts.js index 0823fe837e4077e9db9b8f9d29b7b68ab49c00f8..187fd9fd8df4f1fe5153d1648a27b787f321744a 100644 --- a/wax-prosemirror-services/src/ShortCutsService/ShortCuts.js +++ b/wax-prosemirror-services/src/ShortCutsService/ShortCuts.js @@ -25,11 +25,8 @@ const backSpace = chainCommands( const backSpaceShortCut = (state, dispatch, view) => { const { $from, $to } = state.selection; const { nodeBefore } = $from; - if (!nodeBefore) { - return false; - } - if (nodeBefore.type.name === 'math_inline') { + if (nodeBefore && nodeBefore.type.name === 'math_inline') { const index = $from.index($from.depth); const $beforePos = state.doc.resolve($from.posAtIndex(index - 1));