diff --git a/wax-prosemirror-components/index.js b/wax-prosemirror-components/index.js index b2125640d248588b5ce4f44b0a2eedc726502076..18efcfdac4feb6b28311751de06491679452a409 100644 --- a/wax-prosemirror-components/index.js +++ b/wax-prosemirror-components/index.js @@ -1,7 +1,7 @@ export { default as Overlay } from './src/components/Overlay'; export { default as Button } from './src/components/Button'; export { default as icons } from './src/icons/icons'; -export { default as TableDropDown } from './src/components/TableDropDown'; +export { default as TableDropDown } from './src/components/tables/TableDropDown'; export { default as ImageUpload } from './src/components/images/ImageUpload'; export { default as TitleButton } from './src/components/TitleButton'; export { default as LeftMenuTitle } from './src/components/LeftMenuTitle'; diff --git a/wax-prosemirror-components/package.json b/wax-prosemirror-components/package.json index 1d120e4e3ccd212a670bb1ba78fb1d1466b91677..591526e9122566fbd98b0d75d30d0b840f829bf5 100644 --- a/wax-prosemirror-components/package.json +++ b/wax-prosemirror-components/package.json @@ -4,7 +4,7 @@ "version": "0.0.42", "description": "Wax prosemirror UI components", "license": "MIT", - "main": "dist/index.js", + "main": "index.js", "files": [ "dist" ], diff --git a/wax-prosemirror-components/src/components/findAndReplace/ExpandedFindAndReplaceComponent.js b/wax-prosemirror-components/src/components/findAndReplace/ExpandedFindAndReplaceComponent.js index 9baaf43bab7b0a8774ac0f6ff88eaf5ffa4f9786..2d59402c5a467185c74f2bf07bcfa12943fb8ee2 100644 --- a/wax-prosemirror-components/src/components/findAndReplace/ExpandedFindAndReplaceComponent.js +++ b/wax-prosemirror-components/src/components/findAndReplace/ExpandedFindAndReplaceComponent.js @@ -135,7 +135,7 @@ const PreviousNextContainer = styled.div` } `; -const PreviousNextButton = styled.span` +const IconWrapper = styled.span` &:focus { outline: none; } @@ -333,15 +333,20 @@ const ExpandedFindAndReplaceComponent = ({ <ButtonReplace onClick={replace}>Replace</ButtonReplace> <ButtonReplaceAll onClick={replaceAll}>Replace All</ButtonReplaceAll> <PreviousNextContainer> - <StyledIcon - name="navigatePrevious" + <IconWrapper onClick={() => findPreviousMatch(searchValue, matchCaseOption)} - /> - - <StyledIcon - name="navigateNext" + role="button" + tabIndex="0" + > + <StyledIcon name="navigatePrevious" /> + </IconWrapper> + <IconWrapper onClick={() => findNextMatch(searchValue, matchCaseOption)} - /> + role="button" + tabIndex="0" + > + <StyledIcon name="navigateNext" /> + </IconWrapper> </PreviousNextContainer> </ControlContainer> </Wrapper> diff --git a/wax-prosemirror-components/src/components/TableDropDown.js b/wax-prosemirror-components/src/components/tables/TableDropDown.js similarity index 56% rename from wax-prosemirror-components/src/components/TableDropDown.js rename to wax-prosemirror-components/src/components/tables/TableDropDown.js index 5fa779bc529d363d5519b8c2606a7173cdf48559..2d13f8577f9e3b7193435825e2297326b0086a8b 100644 --- a/wax-prosemirror-components/src/components/TableDropDown.js +++ b/wax-prosemirror-components/src/components/tables/TableDropDown.js @@ -1,6 +1,5 @@ /* eslint react/prop-types: 0 */ -import React, { useMemo, useContext, useState } from 'react'; -import { TextSelection } from 'prosemirror-state'; +import React, { useMemo, useContext, useState, useEffect } from 'react'; import styled from 'styled-components'; import * as tablesFn from 'prosemirror-tables'; import { WaxContext } from 'wax-prosemirror-core'; @@ -37,26 +36,35 @@ const DropdownStyled = styled(Dropdown)` } `; -const dropDownOptions = [ - { label: 'add column before', value: 'addColumnBefore' }, - { label: 'add column after', value: 'addColumnAfter' }, - { label: 'Delete column', value: 'deleteColumn' }, - { label: 'Insert row before', value: 'addRowBefore' }, - { label: 'Insert row after', value: 'addRowAfter' }, - { label: 'Delete row', value: 'deleteRow' }, - { label: 'Delete table', value: 'deleteTable' }, - { label: 'Merge cells', value: 'mergeCells' }, - { label: 'Split cell', value: 'splitCell' }, - { label: 'Toggle header column', value: 'toggleHeaderColumn' }, - { label: 'Toggle header row', value: 'toggleHeaderRow' }, - { label: 'Toggle header cells', value: 'toggleHeaderCell' }, -]; - const TableDropDown = ({ item }) => { + const dropDownOptions = [ + { label: 'Add column before', value: 'addColumnBefore' }, + { label: 'Add column after', value: 'addColumnAfter' }, + { label: 'Delete column', value: 'deleteColumn' }, + { label: 'Insert row before', value: 'addRowBefore' }, + { label: 'Insert row after', value: 'addRowAfter' }, + { label: 'Delete row', value: 'deleteRow' }, + { label: 'Delete table', value: 'deleteTable' }, + { label: 'Merge cells', value: 'mergeCells' }, + { label: 'Split cell', value: 'splitCell' }, + { label: 'Toggle header column', value: 'toggleHeaderColumn' }, + { label: 'Toggle header row', value: 'toggleHeaderRow' }, + { label: 'Toggle header cells', value: 'toggleHeaderCell' }, + ]; + const { activeView } = useContext(WaxContext); const [selectedOption, setSelectedOption] = useState(''); + const appliedDropDownOptions = []; + dropDownOptions.forEach(option => { + if (tablesFn[option.value](activeView.state)) { + appliedDropDownOptions.push(option); + } + }); const isDisabled = item.select(activeView.state); + + useEffect(() => {}, [selectedOption]); + const TableDropDownComponent = useMemo( () => ( <DropdownStyled @@ -72,12 +80,12 @@ const TableDropDown = ({ item }) => { activeView.focus(); }); }} - options={dropDownOptions} + options={appliedDropDownOptions} placeholder="Table Options" select={isDisabled} /> ), - [isDisabled, selectedOption], + [isDisabled, selectedOption, appliedDropDownOptions], ); return TableDropDownComponent; diff --git a/wax-prosemirror-components/src/components/trackChanges/TrackChangeOptionsComponent.js b/wax-prosemirror-components/src/components/trackChanges/TrackChangeOptionsComponent.js index 2bc6ea0fe689458a35b4494d79f2faaff22f8429..d6e9b72b4c8e775aca08126f6d237f85e0719ec2 100644 --- a/wax-prosemirror-components/src/components/trackChanges/TrackChangeOptionsComponent.js +++ b/wax-prosemirror-components/src/components/trackChanges/TrackChangeOptionsComponent.js @@ -244,7 +244,7 @@ const TrackChangeOptionsComponent = ({ {inlineTracks + blockTracks} SUGGESTIONS </TotalSuggestions> <ToolsContainer>{renderTools()}</ToolsContainer> - <AcceptRejectAll + {/* <AcceptRejectAll onMouseEnter={() => setIsShownTrack(true)} onMouseLeave={() => setIsShownTrack(false)} > @@ -265,12 +265,12 @@ const TrackChangeOptionsComponent = ({ </AcceptRejectAllRow> </AcceptRejectAllControls> )} - </AcceptRejectAll> - <TotalComments>{comments} COMMENTS</TotalComments> + </AcceptRejectAll> */} + {/* <TotalComments>{comments} COMMENTS</TotalComments> <ShowComments> <span>Show comments</span> <StyledToggleOn name="toggleOn" /> - </ShowComments> + </ShowComments> */} </Wrapper> ); }; diff --git a/wax-prosemirror-core/package.json b/wax-prosemirror-core/package.json index a62b2a8164d3ed9525a6b7f6eb7db17444ab9755..9c567257e7d3966c51a147181b9ee06eae439a87 100644 --- a/wax-prosemirror-core/package.json +++ b/wax-prosemirror-core/package.json @@ -4,7 +4,7 @@ "version": "0.0.42", "description": "Wax prosemirror core", "license": "MIT", - "main": "dist/index.js", + "main": "index.js", "files": [ "dist" ], diff --git a/wax-prosemirror-plugins/package.json b/wax-prosemirror-plugins/package.json index 1c7f813eddd961844cbbf5935a1e8b64d3bd3c19..932bdabecb6a0fac82f2b8d2684d00381343664e 100644 --- a/wax-prosemirror-plugins/package.json +++ b/wax-prosemirror-plugins/package.json @@ -4,7 +4,7 @@ "version": "0.0.42", "description": "Wax prosemirror plugins", "license": "MIT", - "main": "dist/index.js", + "main": "index.js", "files": [ "dist" ], diff --git a/wax-prosemirror-schema/index.js b/wax-prosemirror-schema/index.js index fd0c54754ca8ddb00116031f1adf81aa472b81b9..a03d420b0c816266be37d180d7731075eb67e162 100644 --- a/wax-prosemirror-schema/index.js +++ b/wax-prosemirror-schema/index.js @@ -14,7 +14,6 @@ export { default as sourceMark } from './src/marks/sourceMark'; export { default as commentMark } from './src/marks/commentMark'; export { default as mathSelectMark } from './src/marks/mathSelectMark'; export { default as highlightMark } from './src/marks/highlightMark'; -export { default as transformMark } from './src/marks/transformMark'; export { default as customtagInlineMark } from './src/marks/customTagInlineMark'; /* LIST OF TRACK CHANGES MARKS diff --git a/wax-prosemirror-schema/package.json b/wax-prosemirror-schema/package.json index 0b8d338fb427e2e6f724c4ebe7d6d81bb42790b5..aff9089eee97a17dd8b32b8d2fa746e89db64a27 100644 --- a/wax-prosemirror-schema/package.json +++ b/wax-prosemirror-schema/package.json @@ -4,7 +4,7 @@ "version": "0.0.42", "description": "Wax prosemirror schema", "license": "MIT", - "main": "dist/index.js", + "main": "index.js", "files": [ "dist" ], diff --git a/wax-prosemirror-schema/src/marks/transformMark.js b/wax-prosemirror-schema/src/marks/transformMark.js deleted file mode 100644 index 8296b1f0a704caa370c56c957497954620cc6544..0000000000000000000000000000000000000000 --- a/wax-prosemirror-schema/src/marks/transformMark.js +++ /dev/null @@ -1,25 +0,0 @@ -const transform = { - excludes: 'transformCase', - - attrs: { - style: { default: null }, - }, - inclusive: false, - parseDOM: [ - { - tag: 'transform', - getAttrs(hook, next) { - Object.assign(hook, { - style: hook.dom.getAttribute('style'), - }); - next(); - }, - }, - ], - toDOM(hook, next) { - hook.value = ['transform', hook.node.attrs, 0]; // eslint-disable-line no-param-reassign - next(); - }, -}; - -export default transform; diff --git a/wax-prosemirror-services/package.json b/wax-prosemirror-services/package.json index f9491b3e2fa82ac9439d237d78169e10010ae303..84ffa498050b9fda0142f86ad59e6a007a60069e 100644 --- a/wax-prosemirror-services/package.json +++ b/wax-prosemirror-services/package.json @@ -4,7 +4,7 @@ "version": "0.0.42", "description": "Wax prosemirror services", "license": "MIT", - "main": "dist/index.js", + "main": "index.js", "files": [ "dist" ], diff --git a/wax-prosemirror-services/src/TransformService/TransformService.js b/wax-prosemirror-services/src/TransformService/TransformService.js index 2004ea3d45b3ab65a80287ee5416db8bc69d9032..fe70937d3d3509e1fd92e17df8ee0578d3e214e3 100644 --- a/wax-prosemirror-services/src/TransformService/TransformService.js +++ b/wax-prosemirror-services/src/TransformService/TransformService.js @@ -1,16 +1,8 @@ -import { transformMark } from 'wax-prosemirror-schema'; import TransformTool from './TransformTool'; import Service from '../Service'; export default class TransformService extends Service { register() { this.container.bind('TransformTool').to(TransformTool); - const createMark = this.container.get('CreateMark'); - createMark( - { - transform: transformMark, - }, - { toWaxSchema: true }, - ); } } diff --git a/wax-prosemirror-services/src/TransformService/TransformTool.js b/wax-prosemirror-services/src/TransformService/TransformTool.js index 4f1ab0c3e8f2272cfe1c34f7255f1785e87197fd..d5e0ea90cdde1f89e95e26d60389a4101d5a289e 100644 --- a/wax-prosemirror-services/src/TransformService/TransformTool.js +++ b/wax-prosemirror-services/src/TransformService/TransformTool.js @@ -1,3 +1,4 @@ +/* eslint-disable no-unused-expressions */ import React from 'react'; import { TransformCaseComponent } from 'wax-prosemirror-components'; import { isEmpty } from 'lodash'; @@ -8,6 +9,55 @@ import Tools from '../lib/Tools'; // eslint-disable-next-line no-unused-vars import titleCase from './titleCase'; +const upperLowerCase = (state, dispatch, casing) => { + // grab the current transaction and selection + let { tr } = state; + const { selection } = tr; + const marksAdd = []; + + state.doc.nodesBetween(selection.from, selection.to, (node, position) => { + if (node.marks.length > 0) { + node.marks.forEach(item => { + marksAdd.push({ + name: item.type.name, + type: item.type, + pos: DocumentHelpers.findMark(state, item.type, true), + attrs: item.attrs, + }); + }); + } + + // we only processing text, must be a selection + if (!node.isTextblock || selection.from === selection.to) return; + + // calculate the section to replace + const startPosition = Math.max(position + 1, selection.from); + const endPosition = Math.min(position + node.nodeSize, selection.to); + + // grab the content + const substringFrom = Math.max(0, selection.from - position - 1); + const substringTo = Math.max(0, selection.to - position - 1); + const updatedText = node.textContent.substring(substringFrom, substringTo); + + // set the casing + const textNode = + casing === 'upperCase' + ? state.schema.text(updatedText.toUpperCase()) + : state.schema.text(updatedText.toLocaleLowerCase()); + + // replace + tr = tr.replaceWith(startPosition, endPosition, textNode); + }); + + marksAdd.forEach(item => { + item.pos.forEach(markPos => { + tr.addMark(markPos.from, markPos.to, item.type.create(item.attrs)); + }); + }); + + dispatch(tr.scrollIntoView()); +}; + class TransformTool extends Tools { title = 'Transform'; icon = 'transformCase'; @@ -24,50 +74,68 @@ class TransformTool extends Tools { } = state; const { tr } = state; - const selectionTr = state.tr.selection; - const marksAdd = [ - { - name: '', - pos: [], - attrs: {}, - }, - ]; - let isAddMark = false; + const { selection } = state.tr; + const marksAdd = []; switch (textCase) { case 'upperCase': - dispatch( - state.tr.addMark( - $from.pos, - $to.pos, - state.schema.marks.transform.create({ - style: 'text-transform: uppercase', - }), - ), - ); + upperLowerCase(state, dispatch, 'upperCase'); break; case 'lowerCase': - dispatch( - state.tr.addMark( - $from.pos, - $to.pos, - state.schema.marks.transform.create({ - style: 'text-transform: lowercase', - }), - ), - ); + upperLowerCase(state, dispatch, 'lowerCase'); break; - case 'sentenceCase': - dispatch( - state.tr.addMark( - $from.pos, - $to.pos, - state.schema.marks.transform.create({ - style: 'text-transform: capitalize', - }), - ), - ); + case 'sentenceCase': { + state.doc.nodesBetween($from.pos, $to.pos, (node, position) => { + if (node.marks.length > 0) { + node.marks.forEach(item => { + marksAdd.push({ + name: item.type.name, + type: item.type, + pos: DocumentHelpers.findMark(state, item.type, true), + attrs: item.attrs, + }); + }); + } + + if (node.type.name !== 'code_block') { + if (!node.isTextblock || $from.pos === $to.pos) return; + const startPosition = Math.max(position + 1, $from.pos); + const endPosition = Math.min( + position + node.nodeSize, + selection.to, + ); + const substringFrom = Math.max(0, $from.pos - position - 1); + const substringTo = Math.max(0, selection.to - position - 1); + + const updatedText = node.textContent.substring( + substringFrom, + substringTo, + ); + if (updatedText.length > 0) { + const rg = /(^\w{1}|\.\s*\w{1})/gi; + + const textNode = state.schema.text( + updatedText.replace(rg, toReplace => { + return toReplace.toUpperCase(); + }), + ); + tr.replaceWith(startPosition, endPosition, textNode); + } + } + }); + + marksAdd.forEach(item => { + item.pos.forEach(markPos => { + tr.addMark( + markPos.from, + markPos.to, + item.type.create(item.attrs), + ); + }); + }); + dispatch(tr); break; + } case 'titleCase': state.doc.nodesBetween($from.pos, $to.pos, (node, position) => { if (node.marks.length > 0) { @@ -86,10 +154,10 @@ class TransformTool extends Tools { const startPosition = Math.max(position + 1, $from.pos); const endPosition = Math.min( position + node.nodeSize, - selectionTr.to, + selection.to, ); const substringFrom = Math.max(0, $from.pos - position - 1); - const substringTo = Math.max(0, selectionTr.to - position - 1); + const substringTo = Math.max(0, selection.to - position - 1); const updatedText = node.textContent.substring( substringFrom, @@ -100,22 +168,20 @@ class TransformTool extends Tools { tr.replaceWith(startPosition, endPosition, textNode); } } - isAddMark = true; }); - if (isAddMark) { - marksAdd.forEach(item => { - if (item.name !== 'transform') { - item.pos.forEach(markPos => { - tr.addMark( - markPos.from, - markPos.to, - item.type.create(item.attrs), - ); - }); - } - }); - } + marksAdd.forEach(item => { + if (item.name !== 'transform') { + item.pos.forEach(markPos => { + tr.addMark( + markPos.from, + markPos.to, + item.type.create(item.attrs), + ); + }); + } + }); + dispatch(tr); break; diff --git a/wax-prosemirror-utilities/package.json b/wax-prosemirror-utilities/package.json index 8374e65e94074277a24dabc297918af37bfc16db..603640748cc47787237ac2e3cd624d30803b4a5c 100644 --- a/wax-prosemirror-utilities/package.json +++ b/wax-prosemirror-utilities/package.json @@ -4,7 +4,7 @@ "version": "0.0.42", "description": "Wax prosemirror utilities", "license": "MIT", - "main": "dist/index.js", + "main": "index.js", "files": [ "dist" ],