diff --git a/wax-prosemirror-components/index.js b/wax-prosemirror-components/index.js index 785517f65f213393ff79a1b3feea05cc75c533e5..ee58d0f06078cb31159373cdb9c5027ce71cadb7 100644 --- a/wax-prosemirror-components/index.js +++ b/wax-prosemirror-components/index.js @@ -7,7 +7,6 @@ export { default as TableDropDown } from './src/components/tables/TableDropDown' export { default as TitleButton } from './src/components/TitleButton'; export { default as ToolGroupComponent } from './src/components/ToolGroupComponent'; export { default as ToolGroups } from './src/components/ToolGroups'; -export { default as NoteEditorContainer } from './src/components/notes/NoteEditorContainer'; export { default as LinkComponent } from './src/components/link/LinkComponent'; export { default as CommentBubbleComponent } from './src/components/comments/CommentBubbleComponent'; export { default as RightArea } from './src/components/rightArea/RightArea'; diff --git a/wax-prosemirror-components/src/ui/tabs/OENToolGroup.js b/wax-prosemirror-components/src/ui/tabs/OENToolGroup.js new file mode 100644 index 0000000000000000000000000000000000000000..7b8da6ecd564de9d2e8fa5e30f3aec0ff68a3f96 --- /dev/null +++ b/wax-prosemirror-components/src/ui/tabs/OENToolGroup.js @@ -0,0 +1,125 @@ +import React, { useContext, useMemo } from 'react'; +import styled, { css } from 'styled-components'; +import { WaxContext } from 'wax-prosemirror-core'; +import { wrapIn } from 'prosemirror-commands'; +import { v4 as uuidv4 } from 'uuid'; +import { liftTarget } from 'prosemirror-transform'; +import MenuButton from '../buttons/MenuButton'; + +const activeStyles = css` + pointer-events: none; +`; + +const GroupName = styled.div` + font-size: 14px; + margin-bottom: 4px; + text-transform: uppercase; +`; + +const OENToolWrapper = styled.div` + display: flex; + margin-bottom: 4px; +`; + +const Box = styled.div` + background: #bfc4cd; + border-radius: 4px; + height: 22px; + position: relative; + right: 3px; + top: 3px; + width: 22px; + z-index: 999; +`; + +const StyledButton = styled(MenuButton)` + border-radius: 4px; + left: -33px; + margin-left: 4px; + padding-left: 25px; + position: relative; + + ${props => props.active && activeStyles} +`; + +const OENToolGroup = ({ item }) => { + const { + app, + pmViews: { main }, + activeView, + activeViewId, + } = useContext(WaxContext); + + const { state } = main; + const isEditable = main.props.editable(editable => { + return editable; + }); + let isDisabled = !item.select(state, activeViewId, activeView); + if (!isEditable) isDisabled = true; + + const OENToolsConfig = app.config.get('config.OENContainersService'); + + const containersActive = item.active(main.state, OENToolsConfig); + + return useMemo( + () => ( + <> + {OENToolsConfig.map(groupTool => { + return ( + <div key={uuidv4()}> + <GroupName key={uuidv4()}>{groupTool.groupHeader} </GroupName> + {groupTool.items.map(tool => ( + <OENToolWrapper key={uuidv4()}> + <Box key={uuidv4()} /> + <StyledButton + active={containersActive[tool.className] || false} + disabled={isDisabled} + key={uuidv4()} + label={tool.displayName} + onMouseDown={() => { + const { from, to } = main.state.selection; + let isInOenContainer = false; + + main.state.doc.nodesBetween(from, to, (node, pos) => { + if ( + node.type.name === 'oen_container' || + node.type.name === 'oen_aside' + ) { + isInOenContainer = true; + } + }); + + if (isInOenContainer) { + const range = main.state.selection.$from.blockRange( + main.state.selection.$to, + ); + const target = range && liftTarget(range); + if (target == null) return false; + main.dispatch(main.state.tr.lift(range, target)); + } + const node = tool.isSection + ? 'oen_section' + : 'oen_container'; + + wrapIn(main.state.config.schema.nodes[node], { + class: tool.className, + })(main.state, main.dispatch); + + setTimeout(() => { + main.focus(); + }); + }} + title={tool.displayName} + /> + </OENToolWrapper> + ))} + </div> + ); + })} + </> + ), + [isDisabled, containersActive], + ); +}; + +export default OENToolGroup; diff --git a/wax-prosemirror-services/src/NoteService/Editor.js b/wax-prosemirror-services/src/NoteService/Editor.js index a4477ce248d9ceef1840a915ba1865fa7e92adb2..fa60ceeedd16487287586192e464a762cbea1e04 100644 --- a/wax-prosemirror-services/src/NoteService/Editor.js +++ b/wax-prosemirror-services/src/NoteService/Editor.js @@ -14,7 +14,7 @@ import { DocumentHelpers, trackedTransaction, } from 'wax-prosemirror-core'; -import { NoteEditorContainer } from 'wax-prosemirror-components'; +import NoteEditorContainer from './components/NoteEditorContainer'; const NoteContainer = styled.div` display: flex; diff --git a/wax-prosemirror-components/src/components/notes/NoteEditorContainer.js b/wax-prosemirror-services/src/NoteService/components/NoteEditorContainer.js similarity index 100% rename from wax-prosemirror-components/src/components/notes/NoteEditorContainer.js rename to wax-prosemirror-services/src/NoteService/components/NoteEditorContainer.js diff --git a/wax-prosemirror-components/src/components/notes/NoteNumber.js b/wax-prosemirror-services/src/NoteService/components/NoteNumber.js similarity index 100% rename from wax-prosemirror-components/src/components/notes/NoteNumber.js rename to wax-prosemirror-services/src/NoteService/components/NoteNumber.js