@modusoperandi/licit 1.4.3 → 1.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/BlockquoteInsertNewLineCommand.js.flow +70 -70
  2. package/BlockquoteNodeSpec.js.flow +29 -29
  3. package/BlockquoteToggleCommand.js.flow +56 -56
  4. package/BookmarkNodeSpec.js.flow +39 -39
  5. package/BulletListNodeSpec.js.flow +61 -61
  6. package/CZIProseMirror.js.flow +90 -90
  7. package/CodeBlockCommand.js.flow +65 -65
  8. package/CodeBlockNodeSpec.js.flow +24 -24
  9. package/CodeMarkSpec.js.flow +14 -14
  10. package/ContentPlaceholderPlugin.js.flow +183 -183
  11. package/CursorPlaceholderPlugin.js.flow +113 -113
  12. package/DocLayoutCommand.js.flow +97 -97
  13. package/DocNodeSpec.js.flow +62 -62
  14. package/EMMarkSpec.js.flow +39 -39
  15. package/EditorCommands.js.flow +124 -124
  16. package/EditorKeyMap.js.flow +173 -173
  17. package/EditorMarks.js +4 -2
  18. package/EditorMarks.js.flow +77 -74
  19. package/EditorNodes.js.flow +55 -55
  20. package/EditorPageLayoutPlugin.js.flow +67 -67
  21. package/EditorPlugins.js.flow +8 -8
  22. package/EditorSchema.js.flow +12 -12
  23. package/EditorState.js.flow +7 -7
  24. package/FontSizeMarkSpec.js.flow +54 -54
  25. package/FontTypeMarkSpec.js.flow +89 -89
  26. package/HTMLMutator.js.flow +58 -58
  27. package/HangingIndentMarkSpec.js +34 -0
  28. package/HangingIndentMarkSpec.js.flow +30 -0
  29. package/HardBreakNodeSpec.js.flow +15 -15
  30. package/HeadingNodeSpec.js.flow +42 -42
  31. package/HistoryRedoCommand.js.flow +41 -41
  32. package/HistoryUndoCommand.js.flow +41 -41
  33. package/HorizontalRuleCommand.js.flow +71 -71
  34. package/HorizontalRuleNodeSpec.js.flow +39 -39
  35. package/ImageUploadPlaceholderPlugin.js.flow +187 -187
  36. package/LICENSE +22 -22
  37. package/LinkMarkSpec.js +4 -2
  38. package/LinkMarkSpec.js.flow +38 -37
  39. package/LinkSetURLCommand.js.flow +129 -129
  40. package/LinkTooltipPlugin.js +31 -37
  41. package/LinkTooltipPlugin.js.flow +204 -217
  42. package/ListItemInsertNewLineCommand.js.flow +76 -76
  43. package/ListItemMergeCommand.js.flow +197 -197
  44. package/ListItemNodeSpec.js.flow +52 -52
  45. package/ListSplitCommand.js.flow +54 -54
  46. package/ListToggleCommand.js.flow +99 -99
  47. package/MarkNames.js +2 -1
  48. package/MarkNames.js.flow +20 -19
  49. package/MarksClearCommand.js.flow +66 -66
  50. package/NodeNames.js.flow +23 -23
  51. package/OrderedListNodeSpec.js.flow +131 -131
  52. package/OverrideMarkSpec.js.flow +49 -49
  53. package/ParagraphNodeSpec.js +21 -2
  54. package/ParagraphNodeSpec.js.flow +233 -215
  55. package/ParagraphSpacingCommand.js.flow +139 -139
  56. package/PrintCommand.js.flow +53 -53
  57. package/SelectionPlaceholderPlugin.js.flow +129 -129
  58. package/SpacerMarkSpec.js.flow +47 -47
  59. package/StrikeMarkSpec.js.flow +24 -24
  60. package/StrongMarkSpec.js.flow +39 -39
  61. package/StyleView.js.flow +18 -18
  62. package/TableBackgroundColorCommand.js.flow +79 -79
  63. package/TableBorderColorCommand.js +5 -3
  64. package/TableBorderColorCommand.js.flow +108 -106
  65. package/TableCellColorCommand.js.flow +73 -73
  66. package/TableCellMenuPlugin.js.flow +129 -129
  67. package/TableInsertCommand.js.flow +117 -117
  68. package/TableMergeCellsCommand.js.flow +113 -113
  69. package/TableNodesSpecs.js.flow +144 -144
  70. package/TablePlugins.js.flow +14 -14
  71. package/TableResizePlugin.js.flow +636 -636
  72. package/TextColorMarkSpec.js.flow +40 -40
  73. package/TextHighlightMarkSpec.js.flow +47 -47
  74. package/TextInsertTabSpaceCommand.js +0 -3
  75. package/TextInsertTabSpaceCommand.js.flow +103 -106
  76. package/TextNoWrapMarkSpec.js.flow +14 -14
  77. package/TextNodeSpec.js.flow +7 -7
  78. package/TextSelectionMarkSpec.js.flow +24 -24
  79. package/TextSubMarkSpec.js.flow +28 -28
  80. package/TextSuperMarkSpec.js.flow +28 -28
  81. package/TextUnderlineMarkSpec.js.flow +24 -24
  82. package/Types.js.flow +77 -77
  83. package/WebFontLoader.js.flow +22 -22
  84. package/blockQuoteInputRule.js.flow +36 -36
  85. package/bom.xml +8573 -8650
  86. package/browser.js.flow +7 -7
  87. package/buildEditorPlugins.js.flow +48 -48
  88. package/buildInputRules.js.flow +85 -85
  89. package/client/CollabConnector.js.flow +90 -90
  90. package/client/EditorConnection.js.flow +324 -324
  91. package/client/Licit.js +39 -39
  92. package/client/Licit.js.flow +649 -649
  93. package/client/Licit.test.js.flow +104 -104
  94. package/client/Reporter.js.flow +35 -35
  95. package/client/SimpleConnector.js.flow +61 -61
  96. package/client/http.js.flow +60 -60
  97. package/client/licit.css +12 -12
  98. package/client/throttle.js.flow +27 -27
  99. package/convertFromDOMElement.js.flow +33 -33
  100. package/convertFromHTML.js.flow +15 -15
  101. package/convertFromJSON.js.flow +53 -53
  102. package/convertToCSSPTValue.js.flow +19 -19
  103. package/convertToJSON.js.flow +7 -7
  104. package/createCommand.js.flow +62 -62
  105. package/createEditorKeyMap.js.flow +87 -87
  106. package/createEmptyEditorState.js.flow +29 -29
  107. package/createTableResizingPlugin.js.flow +86 -86
  108. package/findActionableCell.js.flow +74 -74
  109. package/findActiveMark.js.flow +32 -32
  110. package/hyphenize.js.flow +17 -17
  111. package/index.d.ts +167 -167
  112. package/index.js.flow +10 -10
  113. package/insertTable.js.flow +54 -54
  114. package/isEditorStateEmpty.js.flow +32 -32
  115. package/isTableNode.js.flow +15 -15
  116. package/joinDown.js.flow +25 -25
  117. package/joinListNode.js.flow +55 -55
  118. package/joinUp.js.flow +37 -37
  119. package/keymaps.js.flow +175 -175
  120. package/lookUpElement.js.flow +14 -14
  121. package/nodeAt.js.flow +12 -12
  122. package/normalizeHTML.js.flow +80 -80
  123. package/package.json +152 -152
  124. package/patchAnchorElements.js.flow +38 -38
  125. package/patchBreakElements.js.flow +22 -22
  126. package/patchElementInlineStyles.js.flow +92 -92
  127. package/patchListElements.js.flow +275 -275
  128. package/patchMathElements.js.flow +58 -58
  129. package/patchParagraphElements.js.flow +20 -20
  130. package/patchStyleElements.js.flow +197 -197
  131. package/patchTableElements.js.flow +88 -88
  132. package/rebaseDocWithSteps.js.flow +42 -42
  133. package/sanitizeURL.js.flow +13 -13
  134. package/splitListItem.js.flow +191 -191
  135. package/styles.css +46 -46
  136. package/toClosestFontPtSize.js.flow +22 -22
  137. package/toSafeHTMLDocument.js.flow +9 -9
  138. package/toggleBlockquote.js.flow +101 -101
  139. package/toggleCodeBlock.js.flow +102 -102
  140. package/ui/AlertInfo.js.flow +63 -63
  141. package/ui/BookmarkNodeView.js.flow +64 -64
  142. package/ui/CommandButton.js.flow +68 -68
  143. package/ui/CommandMenu.js.flow +74 -74
  144. package/ui/CommandMenuButton.js.flow +128 -128
  145. package/ui/CustomEditorView.js.flow +29 -29
  146. package/ui/CustomMenu.js.flow +14 -14
  147. package/ui/CustomMenuItem.js.flow +35 -35
  148. package/ui/CustomNodeView.js.flow +207 -207
  149. package/ui/CustomRadioButton.js.flow +63 -63
  150. package/ui/DocLayoutEditor.js.flow +130 -130
  151. package/ui/Editor.js.flow +281 -281
  152. package/ui/EditorFrameset.js.flow +79 -79
  153. package/ui/EditorToolbar.js.flow +197 -197
  154. package/ui/EditorToolbarConfig.js.flow +162 -162
  155. package/ui/FontSizeCommandMenuButton.js.flow +66 -66
  156. package/ui/FontTypeCommandMenuButton.js.flow +60 -60
  157. package/ui/Frag.js.flow +11 -11
  158. package/ui/Icon.js.flow +82 -82
  159. package/ui/ImageInlineEditor.js.flow +66 -66
  160. package/ui/KeyCodes.js.flow +12 -12
  161. package/ui/LinkTooltip.js.flow +51 -51
  162. package/ui/LinkURLEditor.js.flow +227 -227
  163. package/ui/ListItemNodeView.js.flow +101 -101
  164. package/ui/ListTypeButton.js.flow +121 -121
  165. package/ui/ListTypeCommandButton.js.flow +85 -85
  166. package/ui/ListTypeMenu.js.flow +78 -78
  167. package/ui/LoadingIndicator.js.flow +19 -19
  168. package/ui/PasteMenu.js.flow +52 -52
  169. package/ui/ResizeObserver.js.flow +105 -105
  170. package/ui/RichTextEditor.js.flow +133 -133
  171. package/ui/SelectionObserver.js.flow +134 -134
  172. package/ui/TableCellMenu.js.flow +49 -49
  173. package/ui/TableGridSizeEditor.js.flow +185 -185
  174. package/ui/TableNodeView.js.flow +36 -36
  175. package/ui/bindScrollHandler.js.flow +46 -46
  176. package/ui/canUseCSSFont.js.flow +42 -42
  177. package/ui/czi-body-layout-editor.css +16 -16
  178. package/ui/czi-bookmark-view.css +10 -10
  179. package/ui/czi-cursor-placeholder.css +36 -36
  180. package/ui/czi-custom-menu-button.css +18 -18
  181. package/ui/czi-custom-menu-item.css +30 -30
  182. package/ui/czi-custom-menu.css +8 -8
  183. package/ui/czi-custom-radio-button.css +80 -80
  184. package/ui/czi-custom-scrollbar.css +21 -21
  185. package/ui/czi-editor-frameset.css +81 -81
  186. package/ui/czi-editor-toolbar.css +122 -122
  187. package/ui/czi-editor.css +239 -216
  188. package/ui/czi-form.css +201 -201
  189. package/ui/czi-frag.css +3 -3
  190. package/ui/czi-heading.css +40 -40
  191. package/ui/czi-icon.css +72 -72
  192. package/ui/czi-image-resize-box.css +165 -165
  193. package/ui/czi-image-upload-editor.css +57 -57
  194. package/ui/czi-image-upload-placeholder.css +50 -50
  195. package/ui/czi-image-url-editor.css +38 -38
  196. package/ui/czi-image-view.css +121 -121
  197. package/ui/czi-indent.css +137 -137
  198. package/ui/czi-inline-editor.css +20 -20
  199. package/ui/czi-link-tooltip.css +112 -112
  200. package/ui/czi-list.css +406 -406
  201. package/ui/czi-loading-indicator.css +66 -66
  202. package/ui/czi-math-view.css +62 -62
  203. package/ui/czi-selection-placeholder.css +24 -24
  204. package/ui/czi-table-cell-menu.css +16 -16
  205. package/ui/czi-table-grid-size-editor.css +37 -37
  206. package/ui/czi-table.css +89 -89
  207. package/ui/czi-vars.css +47 -45
  208. package/ui/findActiveFontSize.js.flow +55 -55
  209. package/ui/findActiveFontType.js.flow +35 -35
  210. package/ui/fonts.css +460 -460
  211. package/ui/handleEditorDrop.js.flow +28 -28
  212. package/ui/handleEditorKeyDown.js.flow +39 -39
  213. package/ui/handleEditorPaste.js.flow +33 -33
  214. package/ui/htmlElementToRect.js.flow +18 -18
  215. package/ui/icon-font.css +9 -9
  216. package/ui/injectStyleSheet.js.flow +40 -40
  217. package/ui/isElementFullyVisible.js.flow +14 -14
  218. package/ui/isOffline.js.flow +8 -8
  219. package/ui/isReactClass.js.flow +12 -12
  220. package/ui/listType.css +21 -21
  221. package/ui/resolveImage.js.flow +121 -121
  222. package/ui/toCSSColor.js.flow +51 -51
  223. package/ui/toCSSLineSpacing.js.flow +53 -53
  224. package/ui/toHexColor.js.flow +26 -26
  225. package/ui/uuid.js.flow +9 -9
  226. package/uuid.js.flow +9 -9
@@ -1,68 +1,68 @@
1
- // @flow
2
-
3
- import { EditorState } from 'prosemirror-state';
4
- import { Transform } from 'prosemirror-transform';
5
- import { EditorView } from 'prosemirror-view';
6
- import * as React from 'react';
7
-
8
- import { CustomButton } from '@modusoperandi/licit-ui-commands';
9
- import { UICommand } from '@modusoperandi/licit-doc-attrs-step';
10
-
11
- class CommandButton extends React.PureComponent<any, any> {
12
- props: {
13
- className?: ?string,
14
- command: UICommand,
15
- disabled?: ?boolean,
16
- dispatch: (tr: Transform) => void,
17
- editorState: EditorState,
18
- editorView: ?EditorView,
19
- icon?: string | React.Element<any> | null,
20
- label?: string | React.Element<any> | null,
21
- title?: ?string,
22
- };
23
-
24
- render(): React.Element<any> {
25
- const {
26
- label,
27
- className,
28
- command,
29
- editorState,
30
- icon,
31
- title,
32
- editorView,
33
- } = this.props;
34
- let disabled = this.props.disabled;
35
- if (!!disabled === false) {
36
- disabled = !editorView || !command.isEnabled(editorState, editorView, '');
37
- }
38
- return (
39
- <CustomButton
40
- active={command.isActive(editorState)}
41
- className={className}
42
- disabled={disabled}
43
- icon={icon}
44
- label={label}
45
- onClick={this._onUIEnter}
46
- onMouseEnter={this._onUIEnter}
47
- title={title}
48
- value={command}
49
- />
50
- );
51
- }
52
-
53
- _onUIEnter = (
54
- command: UICommand,
55
- event: SyntheticEvent<HTMLButtonElement>
56
- ): void => {
57
- if (command.shouldRespondToUIEvent(event)) {
58
- this._execute(command, event);
59
- }
60
- };
61
-
62
- _execute = (value: any, event: SyntheticEvent<HTMLButtonElement>): void => {
63
- const { command, editorState, dispatch, editorView } = this.props;
64
- command.execute(editorState, dispatch, editorView, event);
65
- };
66
- }
67
-
68
- export default CommandButton;
1
+ // @flow
2
+
3
+ import { EditorState } from 'prosemirror-state';
4
+ import { Transform } from 'prosemirror-transform';
5
+ import { EditorView } from 'prosemirror-view';
6
+ import * as React from 'react';
7
+
8
+ import { CustomButton } from '@modusoperandi/licit-ui-commands';
9
+ import { UICommand } from '@modusoperandi/licit-doc-attrs-step';
10
+
11
+ class CommandButton extends React.PureComponent<any, any> {
12
+ props: {
13
+ className?: ?string,
14
+ command: UICommand,
15
+ disabled?: ?boolean,
16
+ dispatch: (tr: Transform) => void,
17
+ editorState: EditorState,
18
+ editorView: ?EditorView,
19
+ icon?: string | React.Element<any> | null,
20
+ label?: string | React.Element<any> | null,
21
+ title?: ?string,
22
+ };
23
+
24
+ render(): React.Element<any> {
25
+ const {
26
+ label,
27
+ className,
28
+ command,
29
+ editorState,
30
+ icon,
31
+ title,
32
+ editorView,
33
+ } = this.props;
34
+ let disabled = this.props.disabled;
35
+ if (!!disabled === false) {
36
+ disabled = !editorView || !command.isEnabled(editorState, editorView, '');
37
+ }
38
+ return (
39
+ <CustomButton
40
+ active={command.isActive(editorState)}
41
+ className={className}
42
+ disabled={disabled}
43
+ icon={icon}
44
+ label={label}
45
+ onClick={this._onUIEnter}
46
+ onMouseEnter={this._onUIEnter}
47
+ title={title}
48
+ value={command}
49
+ />
50
+ );
51
+ }
52
+
53
+ _onUIEnter = (
54
+ command: UICommand,
55
+ event: SyntheticEvent<HTMLButtonElement>
56
+ ): void => {
57
+ if (command.shouldRespondToUIEvent(event)) {
58
+ this._execute(command, event);
59
+ }
60
+ };
61
+
62
+ _execute = (value: any, event: SyntheticEvent<HTMLButtonElement>): void => {
63
+ const { command, editorState, dispatch, editorView } = this.props;
64
+ command.execute(editorState, dispatch, editorView, event);
65
+ };
66
+ }
67
+
68
+ export default CommandButton;
@@ -1,74 +1,74 @@
1
- // @flow
2
-
3
- import { EditorState } from 'prosemirror-state';
4
- import { Transform } from 'prosemirror-transform';
5
- import { EditorView } from 'prosemirror-view';
6
- import * as React from 'react';
7
-
8
- import CustomMenu from './CustomMenu.js';
9
- import CustomMenuItem from './CustomMenuItem.js';
10
- import { UICommand } from '@modusoperandi/licit-doc-attrs-step';
11
-
12
- class CommandMenu extends React.PureComponent<any, any> {
13
- _activeCommand: ?UICommand = null;
14
-
15
- props: {
16
- commandGroups: Array<{ [string]: UICommand }>,
17
- dispatch: (tr: Transform) => void,
18
- editorState: EditorState,
19
- editorView: ?EditorView,
20
- onCommand: ?Function,
21
- };
22
-
23
- render(): React.Element<any> {
24
- const { commandGroups, editorState, editorView } = this.props;
25
- const children = [];
26
- const jj = commandGroups.length - 1;
27
-
28
- commandGroups.forEach((group, ii) => {
29
- Object.keys(group).forEach((label) => {
30
- const command = group[label];
31
- let disabled = true;
32
- try {
33
- // Disable the Clear style menu when no styles applied to a paragraph
34
- disabled =
35
- !editorView || !command.isEnabled(editorState, editorView, label);
36
- } catch {
37
- disabled = false;
38
- }
39
- children.push(
40
- <CustomMenuItem
41
- active={command.isActive(editorState)}
42
- disabled={disabled}
43
- key={label}
44
- label={command.renderLabel(editorState) || label}
45
- onClick={this._onUIEnter}
46
- onMouseEnter={this._onUIEnter}
47
- value={command}
48
- />
49
- );
50
- });
51
- if (ii !== jj) {
52
- children.push(<CustomMenuItem.Separator key={`${String(ii)}-hr`} />);
53
- }
54
- });
55
- return <CustomMenu>{children}</CustomMenu>;
56
- }
57
-
58
- _onUIEnter = (command: UICommand, event: SyntheticEvent<>): void => {
59
- if (command.shouldRespondToUIEvent(event)) {
60
- this._activeCommand && this._activeCommand.cancel();
61
- this._activeCommand = command;
62
- this._execute(command, event);
63
- }
64
- };
65
-
66
- _execute = (command: UICommand, e: SyntheticEvent<>) => {
67
- const { dispatch, editorState, editorView, onCommand } = this.props;
68
- if (command.execute(editorState, dispatch, editorView, e)) {
69
- onCommand?.();
70
- }
71
- };
72
- }
73
-
74
- export default CommandMenu;
1
+ // @flow
2
+
3
+ import { EditorState } from 'prosemirror-state';
4
+ import { Transform } from 'prosemirror-transform';
5
+ import { EditorView } from 'prosemirror-view';
6
+ import * as React from 'react';
7
+
8
+ import CustomMenu from './CustomMenu.js';
9
+ import CustomMenuItem from './CustomMenuItem.js';
10
+ import { UICommand } from '@modusoperandi/licit-doc-attrs-step';
11
+
12
+ class CommandMenu extends React.PureComponent<any, any> {
13
+ _activeCommand: ?UICommand = null;
14
+
15
+ props: {
16
+ commandGroups: Array<{ [string]: UICommand }>,
17
+ dispatch: (tr: Transform) => void,
18
+ editorState: EditorState,
19
+ editorView: ?EditorView,
20
+ onCommand: ?Function,
21
+ };
22
+
23
+ render(): React.Element<any> {
24
+ const { commandGroups, editorState, editorView } = this.props;
25
+ const children = [];
26
+ const jj = commandGroups.length - 1;
27
+
28
+ commandGroups.forEach((group, ii) => {
29
+ Object.keys(group).forEach((label) => {
30
+ const command = group[label];
31
+ let disabled = true;
32
+ try {
33
+ // Disable the Clear style menu when no styles applied to a paragraph
34
+ disabled =
35
+ !editorView || !command.isEnabled(editorState, editorView, label);
36
+ } catch {
37
+ disabled = false;
38
+ }
39
+ children.push(
40
+ <CustomMenuItem
41
+ active={command.isActive(editorState)}
42
+ disabled={disabled}
43
+ key={label}
44
+ label={command.renderLabel(editorState) || label}
45
+ onClick={this._onUIEnter}
46
+ onMouseEnter={this._onUIEnter}
47
+ value={command}
48
+ />
49
+ );
50
+ });
51
+ if (ii !== jj) {
52
+ children.push(<CustomMenuItem.Separator key={`${String(ii)}-hr`} />);
53
+ }
54
+ });
55
+ return <CustomMenu>{children}</CustomMenu>;
56
+ }
57
+
58
+ _onUIEnter = (command: UICommand, event: SyntheticEvent<>): void => {
59
+ if (command.shouldRespondToUIEvent(event)) {
60
+ this._activeCommand && this._activeCommand.cancel();
61
+ this._activeCommand = command;
62
+ this._execute(command, event);
63
+ }
64
+ };
65
+
66
+ _execute = (command: UICommand, e: SyntheticEvent<>) => {
67
+ const { dispatch, editorState, editorView, onCommand } = this.props;
68
+ if (command.execute(editorState, dispatch, editorView, e)) {
69
+ onCommand?.();
70
+ }
71
+ };
72
+ }
73
+
74
+ export default CommandMenu;
@@ -1,128 +1,128 @@
1
- // @flow
2
-
3
- import cx from 'classnames';
4
- import { EditorState } from 'prosemirror-state';
5
- import { Transform } from 'prosemirror-transform';
6
- import { EditorView } from 'prosemirror-view';
7
- import * as React from 'react';
8
-
9
- import CommandMenu from './CommandMenu.js';
10
- import { CustomButton, createPopUp } from '@modusoperandi/licit-ui-commands';
11
- import { UICommand } from '@modusoperandi/licit-doc-attrs-step';
12
- import uuid from './uuid.js';
13
-
14
- class CommandMenuButton extends React.PureComponent<any, any> {
15
- props: {
16
- className?: ?string,
17
- commandGroups: Array<{ [string]: UICommand }>,
18
- disabled?: ?boolean,
19
- dispatch: (tr: Transform) => void,
20
- editorState: EditorState,
21
- editorView: ?EditorView,
22
- icon?: string | React.Element<any> | null,
23
- label?: string | React.Element<any> | null,
24
- title?: ?string,
25
- parent?: ?React.Element<any>, // the parent command button
26
- };
27
-
28
- _menu = null;
29
- _id = uuid();
30
-
31
- state = {
32
- expanded: false,
33
- };
34
-
35
- render(): React.Element<any> {
36
- const {
37
- className,
38
- label,
39
- commandGroups,
40
- editorState,
41
- editorView,
42
- icon,
43
- disabled,
44
- title,
45
- } = this.props;
46
- const enabled =
47
- !disabled &&
48
- commandGroups.some((group, ii) => {
49
- return Object.keys(group).some((label) => {
50
- const command = group[label];
51
- let disabledVal = true;
52
- try {
53
- disabledVal =
54
- !editorView || !command.isEnabled(editorState, editorView, label);
55
- } catch {
56
- disabledVal = false;
57
- }
58
- return !disabledVal;
59
- });
60
- });
61
-
62
- const { expanded } = this.state;
63
- const buttonClassName = cx(className, {
64
- 'czi-custom-menu-button': true,
65
- expanded,
66
- });
67
-
68
- return (
69
- <CustomButton
70
- className={buttonClassName}
71
- disabled={!enabled}
72
- icon={icon}
73
- id={this._id}
74
- label={label}
75
- onClick={this._onClick}
76
- title={title}
77
- />
78
- );
79
- }
80
-
81
- componentWillUnmount(): void {
82
- this._hideMenu();
83
- }
84
-
85
- _onClick = (): void => {
86
- const expanded = !this.state.expanded;
87
- this.setState({
88
- expanded,
89
- });
90
- expanded ? this._showMenu() : this._hideMenu();
91
- };
92
-
93
- _hideMenu = (): void => {
94
- const menu = this._menu;
95
- this._menu = null;
96
- menu?.close();
97
- };
98
-
99
- _showMenu = (): void => {
100
- const menu = this._menu;
101
- const menuProps = {
102
- ...this.props,
103
- onCommand: this._onCommand,
104
- };
105
- if (menu) {
106
- menu.update(menuProps);
107
- } else {
108
- this._menu = createPopUp(CommandMenu, menuProps, {
109
- anchor: document.getElementById(this._id),
110
- onClose: this._onClose,
111
- });
112
- }
113
- };
114
-
115
- _onCommand = (): void => {
116
- this.setState({ expanded: false });
117
- this._hideMenu();
118
- };
119
-
120
- _onClose = (): void => {
121
- if (this._menu) {
122
- this.setState({ expanded: false });
123
- this._menu = null;
124
- }
125
- };
126
- }
127
-
128
- export default CommandMenuButton;
1
+ // @flow
2
+
3
+ import cx from 'classnames';
4
+ import { EditorState } from 'prosemirror-state';
5
+ import { Transform } from 'prosemirror-transform';
6
+ import { EditorView } from 'prosemirror-view';
7
+ import * as React from 'react';
8
+
9
+ import CommandMenu from './CommandMenu.js';
10
+ import { CustomButton, createPopUp } from '@modusoperandi/licit-ui-commands';
11
+ import { UICommand } from '@modusoperandi/licit-doc-attrs-step';
12
+ import uuid from './uuid.js';
13
+
14
+ class CommandMenuButton extends React.PureComponent<any, any> {
15
+ props: {
16
+ className?: ?string,
17
+ commandGroups: Array<{ [string]: UICommand }>,
18
+ disabled?: ?boolean,
19
+ dispatch: (tr: Transform) => void,
20
+ editorState: EditorState,
21
+ editorView: ?EditorView,
22
+ icon?: string | React.Element<any> | null,
23
+ label?: string | React.Element<any> | null,
24
+ title?: ?string,
25
+ parent?: ?React.Element<any>, // the parent command button
26
+ };
27
+
28
+ _menu = null;
29
+ _id = uuid();
30
+
31
+ state = {
32
+ expanded: false,
33
+ };
34
+
35
+ render(): React.Element<any> {
36
+ const {
37
+ className,
38
+ label,
39
+ commandGroups,
40
+ editorState,
41
+ editorView,
42
+ icon,
43
+ disabled,
44
+ title,
45
+ } = this.props;
46
+ const enabled =
47
+ !disabled &&
48
+ commandGroups.some((group, ii) => {
49
+ return Object.keys(group).some((label) => {
50
+ const command = group[label];
51
+ let disabledVal = true;
52
+ try {
53
+ disabledVal =
54
+ !editorView || !command.isEnabled(editorState, editorView, label);
55
+ } catch {
56
+ disabledVal = false;
57
+ }
58
+ return !disabledVal;
59
+ });
60
+ });
61
+
62
+ const { expanded } = this.state;
63
+ const buttonClassName = cx(className, {
64
+ 'czi-custom-menu-button': true,
65
+ expanded,
66
+ });
67
+
68
+ return (
69
+ <CustomButton
70
+ className={buttonClassName}
71
+ disabled={!enabled}
72
+ icon={icon}
73
+ id={this._id}
74
+ label={label}
75
+ onClick={this._onClick}
76
+ title={title}
77
+ />
78
+ );
79
+ }
80
+
81
+ componentWillUnmount(): void {
82
+ this._hideMenu();
83
+ }
84
+
85
+ _onClick = (): void => {
86
+ const expanded = !this.state.expanded;
87
+ this.setState({
88
+ expanded,
89
+ });
90
+ expanded ? this._showMenu() : this._hideMenu();
91
+ };
92
+
93
+ _hideMenu = (): void => {
94
+ const menu = this._menu;
95
+ this._menu = null;
96
+ menu?.close();
97
+ };
98
+
99
+ _showMenu = (): void => {
100
+ const menu = this._menu;
101
+ const menuProps = {
102
+ ...this.props,
103
+ onCommand: this._onCommand,
104
+ };
105
+ if (menu) {
106
+ menu.update(menuProps);
107
+ } else {
108
+ this._menu = createPopUp(CommandMenu, menuProps, {
109
+ anchor: document.getElementById(this._id),
110
+ onClose: this._onClose,
111
+ });
112
+ }
113
+ };
114
+
115
+ _onCommand = (): void => {
116
+ this.setState({ expanded: false });
117
+ this._hideMenu();
118
+ };
119
+
120
+ _onClose = (): void => {
121
+ if (this._menu) {
122
+ this.setState({ expanded: false });
123
+ this._menu = null;
124
+ }
125
+ };
126
+ }
127
+
128
+ export default CommandMenuButton;
@@ -1,29 +1,29 @@
1
- // @flow
2
-
3
- import { EditorView } from 'prosemirror-view';
4
- import * as React from 'react';
5
-
6
- import type { DirectEditorProps, EditorRuntime } from '../Types.js';
7
-
8
-
9
- // https://github.com/ProseMirror/prosemirror-view/blob/master/src/index.js
10
- class CustomEditorView extends EditorView {
11
- disabled: boolean;
12
- placeholder: ?(string | React.Element<any>);
13
- readOnly: boolean;
14
- runtime: ?EditorRuntime;
15
- constructor(place: HTMLElement, props: DirectEditorProps) {
16
- super(place, props);
17
- this.runtime = null;
18
- this.readOnly = true;
19
- this.disabled = true;
20
- this.placeholder = null;
21
- }
22
-
23
- destroy() {
24
- super.destroy();
25
- this._props = {};
26
- }
27
- }
28
-
29
- export default CustomEditorView;
1
+ // @flow
2
+
3
+ import { EditorView } from 'prosemirror-view';
4
+ import * as React from 'react';
5
+
6
+ import type { DirectEditorProps, EditorRuntime } from '../Types.js';
7
+
8
+
9
+ // https://github.com/ProseMirror/prosemirror-view/blob/master/src/index.js
10
+ class CustomEditorView extends EditorView {
11
+ disabled: boolean;
12
+ placeholder: ?(string | React.Element<any>);
13
+ readOnly: boolean;
14
+ runtime: ?EditorRuntime;
15
+ constructor(place: HTMLElement, props: DirectEditorProps) {
16
+ super(place, props);
17
+ this.runtime = null;
18
+ this.readOnly = true;
19
+ this.disabled = true;
20
+ this.placeholder = null;
21
+ }
22
+
23
+ destroy() {
24
+ super.destroy();
25
+ this._props = {};
26
+ }
27
+ }
28
+
29
+ export default CustomEditorView;
@@ -1,14 +1,14 @@
1
- // @flow
2
-
3
- import * as React from 'react';
4
-
5
- class CustomMenu extends React.Component<any, any> {
6
- render(): React.Element<any> {
7
- const { children } = this.props;
8
- return (
9
- <div className="czi-custom-menu czi-custom-scrollbar">{children}</div>
10
- );
11
- }
12
- }
13
-
14
- export default CustomMenu;
1
+ // @flow
2
+
3
+ import * as React from 'react';
4
+
5
+ class CustomMenu extends React.Component<any, any> {
6
+ render(): React.Element<any> {
7
+ const { children } = this.props;
8
+ return (
9
+ <div className="czi-custom-menu czi-custom-scrollbar">{children}</div>
10
+ );
11
+ }
12
+ }
13
+
14
+ export default CustomMenu;