@modusoperandi/licit 0.13.1 → 0.13.10

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 (728) hide show
  1. package/.babelrc +54 -54
  2. package/.dockerignore +4 -4
  3. package/.eslintignore +3 -3
  4. package/.eslintrc.js +84 -80
  5. package/.flowconfig +37 -37
  6. package/.github/workflows/build.yml +29 -35
  7. package/.github/workflows/lint.yml +30 -30
  8. package/.prettierignore +5 -5
  9. package/.prettierrc +4 -4
  10. package/.stylelintignore +1 -1
  11. package/.stylelintrc.json +13 -13
  12. package/.travis.yml +18 -18
  13. package/CODEOWNERS +40 -40
  14. package/LICENSE +22 -22
  15. package/README.md +300 -286
  16. package/babel.config.json +54 -0
  17. package/build_collab_server.py +7 -7
  18. package/build_image_server.py +7 -7
  19. package/dist/BlockquoteInsertNewLineCommand.js.flow +55 -55
  20. package/dist/BlockquoteNodeSpec.js.flow +30 -30
  21. package/dist/BlockquoteToggleCommand.js.flow +34 -34
  22. package/dist/BookmarkNodeSpec.js.flow +39 -39
  23. package/dist/BulletListNodeSpec.js.flow +61 -61
  24. package/dist/CZIProseMirror.js.flow +90 -90
  25. package/dist/CodeBlockCommand.js +2 -2
  26. package/dist/CodeBlockCommand.js.flow +43 -43
  27. package/dist/CodeBlockNodeSpec.js.flow +24 -24
  28. package/dist/CodeMarkSpec.js.flow +14 -14
  29. package/dist/ContentPlaceholderPlugin.js.flow +187 -187
  30. package/dist/CursorPlaceholderPlugin.js.flow +115 -115
  31. package/dist/DocLayoutCommand.js +2 -4
  32. package/dist/DocLayoutCommand.js.flow +94 -94
  33. package/dist/DocNodeSpec.js.flow +64 -64
  34. package/dist/EMMarkSpec.js.flow +14 -14
  35. package/dist/EditorCommands.js +22 -34
  36. package/dist/EditorCommands.js.flow +128 -128
  37. package/dist/EditorKeyMap.js.flow +187 -187
  38. package/dist/EditorMarks.js.flow +71 -71
  39. package/dist/EditorNodes.js.flow +60 -60
  40. package/dist/EditorPageLayoutPlugin.js.flow +67 -67
  41. package/dist/EditorPlugins.js.flow +8 -8
  42. package/dist/EditorSchema.js.flow +12 -12
  43. package/dist/EditorState.js.flow +7 -7
  44. package/dist/FontSizeMarkSpec.js.flow +49 -49
  45. package/dist/FontTypeMarkSpec.js.flow +80 -80
  46. package/dist/HTMLMutator.js.flow +59 -59
  47. package/dist/HardBreakNodeSpec.js.flow +15 -15
  48. package/dist/HeadingNodeSpec.js.flow +54 -54
  49. package/dist/HistoryRedoCommand.js.flow +20 -20
  50. package/dist/HistoryUndoCommand.js.flow +20 -20
  51. package/dist/HorizontalRuleCommand.js.flow +49 -49
  52. package/dist/HorizontalRuleNodeSpec.js.flow +39 -39
  53. package/dist/ImageFromURLCommand.js.flow +14 -14
  54. package/dist/ImageNodeSpec.js.flow +90 -90
  55. package/dist/ImageSourceCommand.js +2 -4
  56. package/dist/ImageSourceCommand.js.flow +117 -117
  57. package/dist/ImageUploadCommand.js.flow +36 -36
  58. package/dist/ImageUploadPlaceholderPlugin.js.flow +192 -192
  59. package/dist/LinkMarkSpec.js.flow +32 -32
  60. package/dist/LinkSetURLCommand.js +4 -8
  61. package/dist/LinkSetURLCommand.js.flow +103 -103
  62. package/dist/LinkTooltipPlugin.js +9 -15
  63. package/dist/LinkTooltipPlugin.js.flow +203 -203
  64. package/dist/ListItemInsertNewLineCommand.js.flow +55 -55
  65. package/dist/ListItemMergeCommand.js.flow +177 -177
  66. package/dist/ListItemNodeSpec.js.flow +51 -51
  67. package/dist/ListSplitCommand.js.flow +32 -32
  68. package/dist/ListToggleCommand.js +4 -10
  69. package/dist/ListToggleCommand.js.flow +77 -77
  70. package/dist/MarkNames.js.flow +18 -18
  71. package/dist/MarksClearCommand.js +3 -3
  72. package/dist/MarksClearCommand.js.flow +42 -42
  73. package/dist/MathEditCommand.js +2 -2
  74. package/dist/MathEditCommand.js.flow +110 -110
  75. package/dist/MathNodeSpec.js.flow +46 -46
  76. package/dist/NodeNames.js.flow +23 -23
  77. package/dist/OrderedListNodeSpec.js.flow +132 -132
  78. package/dist/ParagraphNodeSpec.js +1 -3
  79. package/dist/ParagraphNodeSpec.js.flow +156 -160
  80. package/dist/ParagraphSpacingCommand.js.flow +121 -121
  81. package/dist/PrintCommand.js.flow +31 -31
  82. package/dist/SelectionPlaceholderPlugin.js.flow +131 -131
  83. package/dist/SpacerMarkSpec.js.flow +47 -47
  84. package/dist/StrikeMarkSpec.js.flow +21 -21
  85. package/dist/StrongMarkSpec.js.flow +25 -25
  86. package/dist/StyleView.js.flow +19 -19
  87. package/dist/TableBackgroundColorCommand.js +3 -7
  88. package/dist/TableBackgroundColorCommand.js.flow +75 -75
  89. package/dist/TableBorderColorCommand.js +3 -7
  90. package/dist/TableBorderColorCommand.js.flow +75 -75
  91. package/dist/TableCellColorCommand.js +3 -7
  92. package/dist/TableCellColorCommand.js.flow +71 -71
  93. package/dist/TableCellMenuPlugin.js +4 -6
  94. package/dist/TableCellMenuPlugin.js.flow +125 -125
  95. package/dist/TableInsertCommand.js +3 -5
  96. package/dist/TableInsertCommand.js.flow +112 -112
  97. package/dist/TableMergeCellsCommand.js.flow +90 -90
  98. package/dist/TableNodesSpecs.js.flow +78 -78
  99. package/dist/TablePlugins.js.flow +14 -14
  100. package/dist/TableResizePlugin.js.flow +631 -631
  101. package/dist/TextColorMarkSpec.js.flow +35 -35
  102. package/dist/TextHighlightMarkSpec.js.flow +38 -38
  103. package/dist/TextInsertTabSpaceCommand.js +2 -4
  104. package/dist/TextInsertTabSpaceCommand.js.flow +83 -83
  105. package/dist/TextNoWrapMarkSpec.js.flow +14 -14
  106. package/dist/TextNodeSpec.js.flow +7 -7
  107. package/dist/TextSelectionMarkSpec.js.flow +24 -24
  108. package/dist/TextSubMarkSpec.js.flow +20 -20
  109. package/dist/TextSuperMarkSpec.js.flow +20 -20
  110. package/dist/TextUnderlineMarkSpec.js.flow +27 -27
  111. package/dist/Types.js.flow +75 -75
  112. package/dist/WebFontLoader.js.flow +22 -22
  113. package/dist/blockQuoteInputRule.js.flow +36 -36
  114. package/dist/bom.xml +10778 -4658
  115. package/dist/browser.js.flow +7 -7
  116. package/dist/buildEditorPlugins.js.flow +51 -51
  117. package/dist/buildInputRules.js.flow +81 -81
  118. package/dist/client/CollabConnector.js +17 -2
  119. package/dist/client/CollabConnector.js.flow +86 -71
  120. package/dist/client/EditorConnection.js +17 -6
  121. package/dist/client/EditorConnection.js.flow +318 -307
  122. package/dist/client/Licit.js +159 -85
  123. package/dist/client/Licit.js.flow +638 -562
  124. package/dist/client/Licit.test.js +50 -22
  125. package/dist/client/Licit.test.js.flow +98 -65
  126. package/dist/client/Reporter.js.flow +37 -37
  127. package/dist/client/SimpleConnector.js +3 -1
  128. package/dist/client/SimpleConnector.js.flow +55 -53
  129. package/dist/client/http.js +12 -0
  130. package/dist/client/http.js.flow +70 -66
  131. package/dist/client/licit.css +12 -12
  132. package/dist/client/throttle.js.flow +27 -27
  133. package/dist/convertFromDOMElement.js.flow +36 -36
  134. package/dist/convertFromHTML.js +1 -4
  135. package/dist/convertFromHTML.js.flow +17 -19
  136. package/dist/convertFromJSON.js +12 -28
  137. package/dist/convertFromJSON.js.flow +56 -78
  138. package/dist/convertToCSSPTValue.js.flow +22 -22
  139. package/dist/convertToJSON.js.flow +7 -7
  140. package/dist/createCommand.js.flow +40 -40
  141. package/dist/createEditorKeyMap.js.flow +94 -94
  142. package/dist/createEmptyEditorState.js +6 -12
  143. package/dist/createEmptyEditorState.js.flow +31 -41
  144. package/dist/createTableResizingPlugin.js.flow +86 -86
  145. package/dist/findActionableCell.js.flow +74 -74
  146. package/dist/findActiveMark.js.flow +32 -32
  147. package/dist/hyphenize.js.flow +17 -17
  148. package/dist/index.js +11 -1
  149. package/dist/index.js.flow +10 -10
  150. package/dist/insertTable.js.flow +56 -56
  151. package/dist/isEditorStateEmpty.js.flow +32 -32
  152. package/dist/isTableNode.js.flow +15 -15
  153. package/dist/joinDown.js.flow +27 -27
  154. package/dist/joinListNode.js +2 -2
  155. package/dist/joinListNode.js.flow +55 -55
  156. package/dist/joinUp.js.flow +39 -39
  157. package/dist/keymaps.js.flow +185 -185
  158. package/dist/lookUpElement.js.flow +14 -14
  159. package/dist/nodeAt.js.flow +12 -12
  160. package/dist/normalizeHTML.js.flow +78 -78
  161. package/dist/patchAnchorElements.js.flow +38 -38
  162. package/dist/patchBreakElements.js.flow +22 -22
  163. package/dist/patchElementInlineStyles.js.flow +92 -92
  164. package/dist/patchListElements.js.flow +276 -276
  165. package/dist/patchMathElements.js.flow +60 -60
  166. package/dist/patchParagraphElements.js.flow +20 -20
  167. package/dist/patchStyleElements.js +3 -5
  168. package/dist/patchStyleElements.js.flow +194 -194
  169. package/dist/patchTableElements.js.flow +89 -89
  170. package/dist/rebaseDocWithSteps.js.flow +42 -42
  171. package/dist/sanitizeURL.js.flow +13 -13
  172. package/dist/splitListItem.js.flow +191 -191
  173. package/dist/styles.css +19 -19
  174. package/dist/styles0.css +29 -29
  175. package/dist/toClosestFontPtSize.js.flow +22 -22
  176. package/dist/toSafeHTMLDocument.js.flow +9 -9
  177. package/dist/toggleBlockquote.js +6 -14
  178. package/dist/toggleBlockquote.js.flow +91 -91
  179. package/dist/toggleCodeBlock.js +4 -10
  180. package/dist/toggleCodeBlock.js.flow +102 -102
  181. package/dist/ui/AlertInfo.js.flow +64 -64
  182. package/dist/ui/BookmarkNodeView.js.flow +66 -66
  183. package/dist/ui/CommandButton.js +2 -4
  184. package/dist/ui/CommandButton.js.flow +68 -68
  185. package/dist/ui/CommandMenu.js.flow +75 -75
  186. package/dist/ui/CommandMenuButton.js +3 -5
  187. package/dist/ui/CommandMenuButton.js.flow +131 -131
  188. package/dist/ui/CustomEditorView.js.flow +28 -28
  189. package/dist/ui/CustomMenu.js.flow +17 -17
  190. package/dist/ui/CustomMenuItem.js +3 -5
  191. package/dist/ui/CustomMenuItem.js.flow +36 -36
  192. package/dist/ui/CustomNodeView.js.flow +200 -200
  193. package/dist/ui/CustomRadioButton.js +6 -6
  194. package/dist/ui/CustomRadioButton.js.flow +65 -65
  195. package/dist/ui/DocLayoutEditor.js +4 -6
  196. package/dist/ui/DocLayoutEditor.js.flow +146 -146
  197. package/dist/ui/Editor.js +0 -1
  198. package/dist/ui/Editor.js.flow +290 -291
  199. package/dist/ui/EditorFrameset.js.flow +81 -81
  200. package/dist/ui/EditorToolbar.js +2 -2
  201. package/dist/ui/EditorToolbar.js.flow +211 -211
  202. package/dist/ui/EditorToolbarConfig.js.flow +172 -172
  203. package/dist/ui/FontSizeCommandMenuButton.js +3 -3
  204. package/dist/ui/FontSizeCommandMenuButton.js.flow +66 -66
  205. package/dist/ui/FontTypeCommandMenuButton.js +3 -3
  206. package/dist/ui/FontTypeCommandMenuButton.js.flow +49 -49
  207. package/dist/ui/Frag.js.flow +13 -13
  208. package/dist/ui/Icon.js.flow +89 -89
  209. package/dist/ui/ImageAlignEditor.js +4 -4
  210. package/dist/ui/ImageAlignEditor.js.flow +60 -60
  211. package/dist/ui/ImageInlineEditor.js +4 -4
  212. package/dist/ui/ImageInlineEditor.js.flow +67 -67
  213. package/dist/ui/ImageNodeView.js +3 -5
  214. package/dist/ui/ImageNodeView.js.flow +404 -404
  215. package/dist/ui/ImageResizeBox.js +3 -3
  216. package/dist/ui/ImageResizeBox.js.flow +219 -219
  217. package/dist/ui/ImageURLEditor.js +4 -6
  218. package/dist/ui/ImageURLEditor.js.flow +119 -119
  219. package/dist/ui/ImageUploadEditor.js +3 -5
  220. package/dist/ui/ImageUploadEditor.js.flow +117 -117
  221. package/dist/ui/KeyCodes.js.flow +12 -12
  222. package/dist/ui/LinkTooltip.js +4 -4
  223. package/dist/ui/LinkTooltip.js.flow +85 -85
  224. package/dist/ui/LinkURLEditor.js +4 -6
  225. package/dist/ui/LinkURLEditor.js.flow +111 -111
  226. package/dist/ui/ListItemNodeView.js.flow +98 -98
  227. package/dist/ui/ListTypeButton.js +3 -5
  228. package/dist/ui/ListTypeButton.js.flow +131 -131
  229. package/dist/ui/ListTypeCommandButton.js.flow +85 -85
  230. package/dist/ui/ListTypeMenu.js.flow +70 -70
  231. package/dist/ui/LoadingIndicator.js.flow +20 -20
  232. package/dist/ui/MathEditor.js +4 -6
  233. package/dist/ui/MathEditor.js.flow +78 -78
  234. package/dist/ui/MathInlineEditor.js +4 -6
  235. package/dist/ui/MathInlineEditor.js.flow +102 -102
  236. package/dist/ui/MathNodeView.js +3 -5
  237. package/dist/ui/MathNodeView.js.flow +175 -175
  238. package/dist/ui/PasteMenu.js.flow +57 -57
  239. package/dist/ui/ResizeObserver.js.flow +106 -106
  240. package/dist/ui/RichTextEditor.js.flow +133 -133
  241. package/dist/ui/SelectionObserver.js.flow +134 -134
  242. package/dist/ui/TableCellMenu.js.flow +38 -38
  243. package/dist/ui/TableGridSizeEditor.js +6 -8
  244. package/dist/ui/TableGridSizeEditor.js.flow +184 -184
  245. package/dist/ui/TableNodeView.js.flow +22 -22
  246. package/dist/ui/bindScrollHandler.js.flow +46 -46
  247. package/dist/ui/canUseCSSFont.js.flow +43 -43
  248. package/dist/ui/czi-body-layout-editor.css +16 -16
  249. package/dist/ui/czi-bookmark-view.css +10 -10
  250. package/dist/ui/czi-cursor-placeholder.css +36 -36
  251. package/dist/ui/czi-custom-menu-button.css +18 -18
  252. package/dist/ui/czi-custom-menu-item.css +30 -30
  253. package/dist/ui/czi-custom-menu.css +8 -8
  254. package/dist/ui/czi-custom-radio-button.css +80 -80
  255. package/dist/ui/czi-custom-scrollbar.css +21 -21
  256. package/dist/ui/czi-editor-frameset.css +81 -81
  257. package/dist/ui/czi-editor-toolbar.css +122 -122
  258. package/dist/ui/czi-editor.css +220 -220
  259. package/dist/ui/czi-form.css +104 -104
  260. package/dist/ui/czi-frag.css +3 -3
  261. package/dist/ui/czi-heading.css +40 -40
  262. package/dist/ui/czi-icon.css +72 -72
  263. package/dist/ui/czi-image-resize-box.css +165 -165
  264. package/dist/ui/czi-image-upload-editor.css +57 -57
  265. package/dist/ui/czi-image-upload-placeholder.css +50 -50
  266. package/dist/ui/czi-image-url-editor.css +38 -38
  267. package/dist/ui/czi-image-view.css +125 -125
  268. package/dist/ui/czi-indent.css +137 -137
  269. package/dist/ui/czi-inline-editor.css +20 -20
  270. package/dist/ui/czi-link-tooltip.css +71 -71
  271. package/dist/ui/czi-list.css +410 -410
  272. package/dist/ui/czi-loading-indicator.css +111 -111
  273. package/dist/ui/czi-math-view.css +62 -62
  274. package/dist/ui/czi-selection-placeholder.css +24 -24
  275. package/dist/ui/czi-table-cell-menu.css +14 -14
  276. package/dist/ui/czi-table-grid-size-editor.css +37 -37
  277. package/dist/ui/czi-table.css +86 -86
  278. package/dist/ui/czi-vars.css +2 -46
  279. package/dist/ui/findActiveFontSize.js.flow +58 -58
  280. package/dist/ui/findActiveFontType.js.flow +38 -38
  281. package/dist/ui/fonts.css +471 -471
  282. package/dist/ui/handleEditorDrop.js.flow +28 -28
  283. package/dist/ui/handleEditorKeyDown.js.flow +39 -39
  284. package/dist/ui/handleEditorPaste.js.flow +33 -33
  285. package/dist/ui/htmlElementToRect.js.flow +18 -18
  286. package/dist/ui/icon-font.css +10 -10
  287. package/dist/ui/injectStyleSheet.js.flow +42 -42
  288. package/dist/ui/isElementFullyVisible.js +2 -2
  289. package/dist/ui/isElementFullyVisible.js.flow +23 -23
  290. package/dist/ui/isOffline.js.flow +8 -8
  291. package/dist/ui/isReactClass.js.flow +12 -12
  292. package/dist/ui/listType.css +21 -21
  293. package/dist/ui/mathquill-editor/MathQuillEditor.js.flow +159 -159
  294. package/dist/ui/mathquill-editor/MathQuillEditorSymbols.js.flow +483 -483
  295. package/dist/ui/mathquill-editor/MathQuillEditorSymbolsPanel.js +2 -2
  296. package/dist/ui/mathquill-editor/MathQuillEditorSymbolsPanel.js.flow +48 -48
  297. package/dist/ui/mathquill-editor/czi-mathquill-editor-symbols-panel.css +39 -39
  298. package/dist/ui/mathquill-editor/czi-mathquill-editor.css +50 -50
  299. package/dist/ui/mathquill-editor/mathquill-import-kludge.js.flow +24 -24
  300. package/dist/ui/renderLaTeXAsHTML.js.flow +46 -46
  301. package/dist/ui/resolveImage.js.flow +123 -123
  302. package/dist/ui/toCSSColor.js.flow +51 -51
  303. package/dist/ui/toCSSLineSpacing.js +1 -36
  304. package/dist/ui/toCSSLineSpacing.js.flow +55 -82
  305. package/dist/ui/toHexColor.js.flow +26 -26
  306. package/dist/ui/uuid.js.flow +9 -9
  307. package/dist/uuid.js.flow +9 -9
  308. package/flow-typed/@modusoperandilicit-customstyles.js +5 -5
  309. package/flow-typed/@modusoperandilicit-doc-attrs-step.js +5 -5
  310. package/flow-typed/@modusoperandilicit-ui-commands.js +5 -0
  311. package/flow-typed/create-emotion.js +5 -5
  312. package/flow-typed/docs-editor.js +3 -3
  313. package/flow-typed/draft-convert.js +3 -3
  314. package/flow-typed/draft-js.js +3 -3
  315. package/flow-typed/flatted.js +5 -5
  316. package/flow-typed/jquery.js +5 -5
  317. package/flow-typed/katex.js +6 -6
  318. package/flow-typed/mathquill.js +5 -5
  319. package/flow-typed/prosemirror-collab.js +5 -5
  320. package/flow-typed/prosemirror-commands.js +5 -5
  321. package/flow-typed/prosemirror-dev-tools.js +5 -5
  322. package/flow-typed/prosemirror-dropcursor.js +5 -5
  323. package/flow-typed/prosemirror-gapcursor.js +5 -5
  324. package/flow-typed/prosemirror-history.js +5 -5
  325. package/flow-typed/prosemirror-inputrules.js +5 -5
  326. package/flow-typed/prosemirror-keymap.js +5 -5
  327. package/flow-typed/prosemirror-model.js +5 -5
  328. package/flow-typed/prosemirror-state.js +5 -5
  329. package/flow-typed/prosemirror-tables.js +5 -5
  330. package/flow-typed/prosemirror-transform.js +5 -5
  331. package/flow-typed/prosemirror-utils.js +5 -5
  332. package/flow-typed/prosemirror-view.js +5 -5
  333. package/flow-typed/resize-observer-polyfill.js +5 -5
  334. package/flow-typed/uuid.js +5 -5
  335. package/jest.config.js +207 -0
  336. package/jest.setup.js +5 -5
  337. package/licit/client/CustomLicitRuntime.js +95 -95
  338. package/licit/client/CustomStyleRuntime.js +136 -136
  339. package/licit/client/index.js +367 -366
  340. package/licit/index.html +11 -11
  341. package/licit/server/collab/instance.js +224 -221
  342. package/licit/server/collab/route.js +69 -69
  343. package/licit/server/collab/server.js +297 -297
  344. package/licit/server/collab/start.js +13 -13
  345. package/licit/server/image/start.js +58 -58
  346. package/lint.sh +4 -4
  347. package/package.json +167 -163
  348. package/run_collab_server.py +21 -21
  349. package/run_image_server.py +20 -20
  350. package/run_web_server.py +25 -25
  351. package/scripts/build_bin.js +10 -10
  352. package/scripts/build_bin.py +103 -103
  353. package/scripts/ci_check_dist.sh +13 -13
  354. package/scripts/env.js +6 -6
  355. package/scripts/webserver.js +35 -35
  356. package/sonar-project.properties +11 -11
  357. package/src/BlockquoteInsertNewLineCommand.js +55 -55
  358. package/src/BlockquoteNodeSpec.js +30 -30
  359. package/src/BlockquoteToggleCommand.js +34 -34
  360. package/src/BookmarkNodeSpec.js +39 -39
  361. package/src/BulletListNodeSpec.js +61 -61
  362. package/src/CZIProseMirror.js +90 -90
  363. package/src/CodeBlockCommand.js +43 -43
  364. package/src/CodeBlockNodeSpec.js +24 -24
  365. package/src/CodeMarkSpec.js +14 -14
  366. package/src/ContentPlaceholderPlugin.js +187 -187
  367. package/src/CursorPlaceholderPlugin.js +115 -115
  368. package/src/DocLayoutCommand.js +94 -94
  369. package/src/DocNodeSpec.js +64 -64
  370. package/src/EMMarkSpec.js +14 -14
  371. package/src/EditorCommands.js +128 -128
  372. package/src/EditorKeyMap.js +187 -187
  373. package/src/EditorMarks.js +71 -71
  374. package/src/EditorNodes.js +60 -60
  375. package/src/EditorPageLayoutPlugin.js +67 -67
  376. package/src/EditorPlugins.js +8 -8
  377. package/src/EditorSchema.js +12 -12
  378. package/src/EditorState.js +7 -7
  379. package/src/FontSizeMarkSpec.js +49 -49
  380. package/src/FontTypeMarkSpec.js +80 -80
  381. package/src/HTMLMutator.js +59 -59
  382. package/src/HardBreakNodeSpec.js +15 -15
  383. package/src/HeadingNodeSpec.js +54 -54
  384. package/src/HistoryRedoCommand.js +20 -20
  385. package/src/HistoryUndoCommand.js +20 -20
  386. package/src/HorizontalRuleCommand.js +49 -49
  387. package/src/HorizontalRuleNodeSpec.js +39 -39
  388. package/src/ImageFromURLCommand.js +14 -14
  389. package/src/ImageNodeSpec.js +90 -90
  390. package/src/ImageSourceCommand.js +117 -117
  391. package/src/ImageUploadCommand.js +36 -36
  392. package/src/ImageUploadPlaceholderPlugin.js +192 -192
  393. package/src/LinkMarkSpec.js +32 -32
  394. package/src/LinkSetURLCommand.js +103 -103
  395. package/src/LinkTooltipPlugin.js +203 -203
  396. package/src/ListItemInsertNewLineCommand.js +55 -55
  397. package/src/ListItemMergeCommand.js +177 -177
  398. package/src/ListItemNodeSpec.js +51 -51
  399. package/src/ListSplitCommand.js +32 -32
  400. package/src/ListToggleCommand.js +77 -77
  401. package/src/MarkNames.js +18 -18
  402. package/src/MarksClearCommand.js +42 -42
  403. package/src/MathEditCommand.js +110 -110
  404. package/src/MathNodeSpec.js +46 -46
  405. package/src/NodeNames.js +23 -23
  406. package/src/OrderedListNodeSpec.js +132 -132
  407. package/src/ParagraphNodeSpec.js +156 -160
  408. package/src/ParagraphSpacingCommand.js +121 -121
  409. package/src/PrintCommand.js +31 -31
  410. package/src/SelectionPlaceholderPlugin.js +131 -131
  411. package/src/SpacerMarkSpec.js +47 -47
  412. package/src/StrikeMarkSpec.js +21 -21
  413. package/src/StrongMarkSpec.js +25 -25
  414. package/src/StyleView.js +19 -19
  415. package/src/TableBackgroundColorCommand.js +75 -75
  416. package/src/TableBorderColorCommand.js +75 -75
  417. package/src/TableCellColorCommand.js +71 -71
  418. package/src/TableCellMenuPlugin.js +125 -125
  419. package/src/TableInsertCommand.js +112 -112
  420. package/src/TableMergeCellsCommand.js +90 -90
  421. package/src/TableNodesSpecs.js +78 -78
  422. package/src/TablePlugins.js +14 -14
  423. package/src/TableResizePlugin.js +631 -631
  424. package/src/TextColorMarkSpec.js +35 -35
  425. package/src/TextHighlightMarkSpec.js +38 -38
  426. package/src/TextInsertTabSpaceCommand.js +83 -83
  427. package/src/TextNoWrapMarkSpec.js +14 -14
  428. package/src/TextNodeSpec.js +7 -7
  429. package/src/TextSelectionMarkSpec.js +24 -24
  430. package/src/TextSubMarkSpec.js +20 -20
  431. package/src/TextSuperMarkSpec.js +20 -20
  432. package/src/TextUnderlineMarkSpec.js +27 -27
  433. package/src/Types.js +75 -75
  434. package/src/WebFontLoader.js +22 -22
  435. package/src/blockQuoteInputRule.js +36 -36
  436. package/src/browser.js +7 -7
  437. package/src/buildEditorPlugins.js +51 -51
  438. package/src/buildInputRules.js +81 -81
  439. package/src/client/CollabConnector.js +86 -71
  440. package/src/client/EditorConnection.js +318 -307
  441. package/src/client/Licit.js +638 -562
  442. package/src/client/Licit.test.js +98 -65
  443. package/src/client/Reporter.js +37 -37
  444. package/src/client/SimpleConnector.js +55 -53
  445. package/src/client/http.js +70 -66
  446. package/src/client/licit.css +12 -12
  447. package/src/client/throttle.js +27 -27
  448. package/src/convertFromDOMElement.js +36 -36
  449. package/src/convertFromHTML.js +17 -19
  450. package/src/convertFromJSON.js +56 -78
  451. package/src/convertToCSSPTValue.js +22 -22
  452. package/src/convertToJSON.js +7 -7
  453. package/src/createCommand.js +40 -40
  454. package/src/createEditorKeyMap.js +94 -94
  455. package/src/createEmptyEditorState.js +31 -41
  456. package/src/createTableResizingPlugin.js +86 -86
  457. package/src/findActionableCell.js +74 -74
  458. package/src/findActiveMark.js +32 -32
  459. package/src/hyphenize.js +17 -17
  460. package/src/index.js +10 -10
  461. package/src/insertTable.js +56 -56
  462. package/src/isEditorStateEmpty.js +32 -32
  463. package/src/isTableNode.js +15 -15
  464. package/src/joinDown.js +27 -27
  465. package/src/joinListNode.js +55 -55
  466. package/src/joinUp.js +39 -39
  467. package/src/keymaps.js +185 -185
  468. package/src/lookUpElement.js +14 -14
  469. package/src/nodeAt.js +12 -12
  470. package/src/normalizeHTML.js +78 -78
  471. package/src/patchAnchorElements.js +38 -38
  472. package/src/patchBreakElements.js +22 -22
  473. package/src/patchElementInlineStyles.js +92 -92
  474. package/src/patchListElements.js +276 -276
  475. package/src/patchMathElements.js +60 -60
  476. package/src/patchParagraphElements.js +20 -20
  477. package/src/patchStyleElements.js +194 -194
  478. package/src/patchTableElements.js +89 -89
  479. package/src/rebaseDocWithSteps.js +42 -42
  480. package/src/sanitizeURL.js +13 -13
  481. package/src/splitListItem.js +191 -191
  482. package/src/styles.css +19 -19
  483. package/src/styles0.css +29 -29
  484. package/src/toClosestFontPtSize.js +22 -22
  485. package/src/toSafeHTMLDocument.js +9 -9
  486. package/src/toggleBlockquote.js +91 -91
  487. package/src/toggleCodeBlock.js +102 -102
  488. package/src/ui/AlertInfo.js +64 -64
  489. package/src/ui/BookmarkNodeView.js +66 -66
  490. package/src/ui/CommandButton.js +68 -68
  491. package/src/ui/CommandMenu.js +75 -75
  492. package/src/ui/CommandMenuButton.js +131 -131
  493. package/src/ui/CustomEditorView.js +28 -28
  494. package/src/ui/CustomMenu.js +17 -17
  495. package/src/ui/CustomMenuItem.js +36 -36
  496. package/src/ui/CustomNodeView.js +200 -200
  497. package/src/ui/CustomRadioButton.js +65 -65
  498. package/src/ui/DocLayoutEditor.js +146 -146
  499. package/src/ui/Editor.js +290 -291
  500. package/src/ui/EditorFrameset.js +81 -81
  501. package/src/ui/EditorToolbar.js +211 -211
  502. package/src/ui/EditorToolbarConfig.js +172 -172
  503. package/src/ui/FontSizeCommandMenuButton.js +66 -66
  504. package/src/ui/FontTypeCommandMenuButton.js +49 -49
  505. package/src/ui/Frag.js +13 -13
  506. package/src/ui/Icon.js +89 -89
  507. package/src/ui/ImageAlignEditor.js +60 -60
  508. package/src/ui/ImageInlineEditor.js +67 -67
  509. package/src/ui/ImageNodeView.js +404 -404
  510. package/src/ui/ImageResizeBox.js +219 -219
  511. package/src/ui/ImageURLEditor.js +119 -119
  512. package/src/ui/ImageUploadEditor.js +117 -117
  513. package/src/ui/KeyCodes.js +12 -12
  514. package/src/ui/LinkTooltip.js +85 -85
  515. package/src/ui/LinkURLEditor.js +111 -111
  516. package/src/ui/ListItemNodeView.js +98 -98
  517. package/src/ui/ListTypeButton.js +131 -131
  518. package/src/ui/ListTypeCommandButton.js +85 -85
  519. package/src/ui/ListTypeMenu.js +70 -70
  520. package/src/ui/LoadingIndicator.js +20 -20
  521. package/src/ui/MathEditor.js +78 -78
  522. package/src/ui/MathInlineEditor.js +102 -102
  523. package/src/ui/MathNodeView.js +175 -175
  524. package/src/ui/PasteMenu.js +57 -57
  525. package/src/ui/ResizeObserver.js +106 -106
  526. package/src/ui/RichTextEditor.js +133 -133
  527. package/src/ui/SelectionObserver.js +134 -134
  528. package/src/ui/TableCellMenu.js +38 -38
  529. package/src/ui/TableGridSizeEditor.js +184 -184
  530. package/src/ui/TableNodeView.js +22 -22
  531. package/src/ui/bindScrollHandler.js +46 -46
  532. package/src/ui/canUseCSSFont.js +43 -43
  533. package/src/ui/czi-body-layout-editor.css +16 -16
  534. package/src/ui/czi-bookmark-view.css +10 -10
  535. package/src/ui/czi-cursor-placeholder.css +36 -36
  536. package/src/ui/czi-custom-menu-button.css +18 -18
  537. package/src/ui/czi-custom-menu-item.css +30 -30
  538. package/src/ui/czi-custom-menu.css +8 -8
  539. package/src/ui/czi-custom-radio-button.css +80 -80
  540. package/src/ui/czi-custom-scrollbar.css +21 -21
  541. package/src/ui/czi-editor-frameset.css +81 -81
  542. package/src/ui/czi-editor-toolbar.css +122 -122
  543. package/src/ui/czi-editor.css +220 -220
  544. package/src/ui/czi-form.css +104 -104
  545. package/src/ui/czi-frag.css +3 -3
  546. package/src/ui/czi-heading.css +40 -40
  547. package/src/ui/czi-icon.css +72 -72
  548. package/src/ui/czi-image-resize-box.css +165 -165
  549. package/src/ui/czi-image-upload-editor.css +57 -57
  550. package/src/ui/czi-image-upload-placeholder.css +50 -50
  551. package/src/ui/czi-image-url-editor.css +38 -38
  552. package/src/ui/czi-image-view.css +125 -125
  553. package/src/ui/czi-indent.css +137 -137
  554. package/src/ui/czi-inline-editor.css +20 -20
  555. package/src/ui/czi-link-tooltip.css +71 -71
  556. package/src/ui/czi-list.css +410 -410
  557. package/src/ui/czi-loading-indicator.css +111 -111
  558. package/src/ui/czi-math-view.css +62 -62
  559. package/src/ui/czi-selection-placeholder.css +24 -24
  560. package/src/ui/czi-table-cell-menu.css +14 -14
  561. package/src/ui/czi-table-grid-size-editor.css +37 -37
  562. package/src/ui/czi-table.css +86 -86
  563. package/src/ui/czi-vars.css +2 -46
  564. package/src/ui/findActiveFontSize.js +58 -58
  565. package/src/ui/findActiveFontType.js +38 -38
  566. package/src/ui/fonts.css +471 -471
  567. package/src/ui/handleEditorDrop.js +28 -28
  568. package/src/ui/handleEditorKeyDown.js +39 -39
  569. package/src/ui/handleEditorPaste.js +33 -33
  570. package/src/ui/htmlElementToRect.js +18 -18
  571. package/src/ui/icon-font.css +10 -10
  572. package/src/ui/injectStyleSheet.js +42 -42
  573. package/src/ui/isElementFullyVisible.js +23 -23
  574. package/src/ui/isOffline.js +8 -8
  575. package/src/ui/isReactClass.js +12 -12
  576. package/src/ui/listType.css +21 -21
  577. package/src/ui/mathquill-editor/MathQuillEditor.js +159 -159
  578. package/src/ui/mathquill-editor/MathQuillEditorSymbols.js +483 -483
  579. package/src/ui/mathquill-editor/MathQuillEditorSymbolsPanel.js +48 -48
  580. package/src/ui/mathquill-editor/czi-mathquill-editor-symbols-panel.css +39 -39
  581. package/src/ui/mathquill-editor/czi-mathquill-editor.css +50 -50
  582. package/src/ui/mathquill-editor/mathquill-import-kludge.js +24 -24
  583. package/src/ui/renderLaTeXAsHTML.js +46 -46
  584. package/src/ui/resolveImage.js +123 -123
  585. package/src/ui/toCSSColor.js +51 -51
  586. package/src/ui/toCSSLineSpacing.js +55 -82
  587. package/src/ui/toHexColor.js +26 -26
  588. package/src/ui/uuid.js +9 -9
  589. package/src/uuid.js +9 -9
  590. package/style-service.Dockerfile +26 -26
  591. package/utils/build_bin.js +9 -9
  592. package/utils/build_image_server.js +71 -69
  593. package/utils/build_licit_collab_server.js +75 -73
  594. package/utils/build_web_server.js +40 -40
  595. package/utils/env.js +6 -6
  596. package/webpack.config.js +126 -120
  597. package/build_customstyle_server.py +0 -7
  598. package/dist/FontSizeCommand.js +0 -80
  599. package/dist/FontSizeCommand.js.flow +0 -57
  600. package/dist/FontTypeCommand.js +0 -137
  601. package/dist/FontTypeCommand.js.flow +0 -100
  602. package/dist/HeadingCommand.js +0 -65
  603. package/dist/HeadingCommand.js.flow +0 -51
  604. package/dist/IndentCommand.js +0 -57
  605. package/dist/IndentCommand.js.flow +0 -41
  606. package/dist/MarkToggleCommand.js +0 -90
  607. package/dist/MarkToggleCommand.js.flow +0 -66
  608. package/dist/TextAlignCommand.js +0 -151
  609. package/dist/TextAlignCommand.js.flow +0 -122
  610. package/dist/TextColorCommand.js +0 -114
  611. package/dist/TextColorCommand.js.flow +0 -87
  612. package/dist/TextHighlightCommand.js +0 -118
  613. package/dist/TextHighlightCommand.js.flow +0 -91
  614. package/dist/TextLineSpacingCommand.js +0 -177
  615. package/dist/TextLineSpacingCommand.js.flow +0 -157
  616. package/dist/applyMark.js +0 -84
  617. package/dist/applyMark.js.flow +0 -61
  618. package/dist/clearMarks.js +0 -160
  619. package/dist/clearMarks.js.flow +0 -128
  620. package/dist/compareNumber.js +0 -18
  621. package/dist/compareNumber.js.flow +0 -11
  622. package/dist/consolidateListNodes.js +0 -291
  623. package/dist/consolidateListNodes.js.flow +0 -281
  624. package/dist/coverage/lcov-report/block-navigation.js +0 -82
  625. package/dist/coverage/lcov-report/block-navigation.js.flow +0 -87
  626. package/dist/coverage/lcov-report/prettify.js +0 -994
  627. package/dist/coverage/lcov-report/prettify.js.flow +0 -2
  628. package/dist/coverage/lcov-report/sorter.js +0 -211
  629. package/dist/coverage/lcov-report/sorter.js.flow +0 -196
  630. package/dist/findNodesWithSameMark.js +0 -89
  631. package/dist/findNodesWithSameMark.js.flow +0 -89
  632. package/dist/isBulletListNode.js +0 -14
  633. package/dist/isBulletListNode.js.flow +0 -9
  634. package/dist/isInsideListItem.js +0 -19
  635. package/dist/isInsideListItem.js.flow +0 -13
  636. package/dist/isListNode.js +0 -22
  637. package/dist/isListNode.js.flow +0 -13
  638. package/dist/isNodeSelectionForNodeType.js +0 -19
  639. package/dist/isNodeSelectionForNodeType.js.flow +0 -15
  640. package/dist/isOrderedListNode.js +0 -14
  641. package/dist/isOrderedListNode.js.flow +0 -9
  642. package/dist/isTextStyleMarkCommandEnabled.js +0 -59
  643. package/dist/isTextStyleMarkCommandEnabled.js.flow +0 -49
  644. package/dist/noop.js +0 -11
  645. package/dist/noop.js.flow +0 -5
  646. package/dist/toggleHeading.js +0 -135
  647. package/dist/toggleHeading.js.flow +0 -113
  648. package/dist/toggleList.js +0 -431
  649. package/dist/toggleList.js.flow +0 -450
  650. package/dist/transformAndPreserveTextSelection.js +0 -173
  651. package/dist/transformAndPreserveTextSelection.js.flow +0 -151
  652. package/dist/ui/ColorEditor.js +0 -118
  653. package/dist/ui/ColorEditor.js.flow +0 -101
  654. package/dist/ui/CustomButton.js +0 -64
  655. package/dist/ui/CustomButton.js.flow +0 -33
  656. package/dist/ui/PointerSurface.js +0 -173
  657. package/dist/ui/PointerSurface.js.flow +0 -141
  658. package/dist/ui/PopUp.js +0 -129
  659. package/dist/ui/PopUp.js.flow +0 -77
  660. package/dist/ui/PopUpManager.js +0 -266
  661. package/dist/ui/PopUpManager.js.flow +0 -213
  662. package/dist/ui/PopUpPosition.js +0 -156
  663. package/dist/ui/PopUpPosition.js.flow +0 -104
  664. package/dist/ui/PopUpTypes.js +0 -1
  665. package/dist/ui/PopUpTypes.js.flow +0 -0
  666. package/dist/ui/TooltipSurface.js +0 -99
  667. package/dist/ui/TooltipSurface.js.flow +0 -76
  668. package/dist/ui/clamp.js +0 -18
  669. package/dist/ui/clamp.js.flow +0 -11
  670. package/dist/ui/createPopUp.js +0 -199
  671. package/dist/ui/createPopUp.js.flow +0 -205
  672. package/dist/ui/czi-animations.css +0 -15
  673. package/dist/ui/czi-color-editor.css +0 -56
  674. package/dist/ui/czi-custom-button.css +0 -93
  675. package/dist/ui/czi-pop-up.css +0 -32
  676. package/dist/ui/czi-tooltip-surface.css +0 -45
  677. package/dist/ui/preventEventDefault.js +0 -10
  678. package/dist/ui/preventEventDefault.js.flow +0 -5
  679. package/dist/ui/rects.js +0 -58
  680. package/dist/ui/rects.js.flow +0 -47
  681. package/dist/updateIndentLevel.js +0 -232
  682. package/dist/updateIndentLevel.js.flow +0 -211
  683. package/flow-typed/@molicit-citation.js +0 -5
  684. package/licit/server/customstyles/start.js +0 -184
  685. package/run_customstyle_server.py +0 -20
  686. package/src/FontSizeCommand.js +0 -57
  687. package/src/FontTypeCommand.js +0 -100
  688. package/src/HeadingCommand.js +0 -51
  689. package/src/IndentCommand.js +0 -41
  690. package/src/MarkToggleCommand.js +0 -66
  691. package/src/TextAlignCommand.js +0 -122
  692. package/src/TextColorCommand.js +0 -87
  693. package/src/TextHighlightCommand.js +0 -91
  694. package/src/TextLineSpacingCommand.js +0 -157
  695. package/src/applyMark.js +0 -61
  696. package/src/clearMarks.js +0 -128
  697. package/src/compareNumber.js +0 -11
  698. package/src/consolidateListNodes.js +0 -281
  699. package/src/findNodesWithSameMark.js +0 -89
  700. package/src/isBulletListNode.js +0 -9
  701. package/src/isInsideListItem.js +0 -13
  702. package/src/isListNode.js +0 -13
  703. package/src/isNodeSelectionForNodeType.js +0 -15
  704. package/src/isOrderedListNode.js +0 -9
  705. package/src/isTextStyleMarkCommandEnabled.js +0 -49
  706. package/src/noop.js +0 -5
  707. package/src/toggleHeading.js +0 -113
  708. package/src/toggleList.js +0 -450
  709. package/src/transformAndPreserveTextSelection.js +0 -151
  710. package/src/ui/ColorEditor.js +0 -101
  711. package/src/ui/CustomButton.js +0 -33
  712. package/src/ui/PointerSurface.js +0 -141
  713. package/src/ui/PopUp.js +0 -77
  714. package/src/ui/PopUpManager.js +0 -213
  715. package/src/ui/PopUpPosition.js +0 -104
  716. package/src/ui/PopUpTypes.js +0 -0
  717. package/src/ui/TooltipSurface.js +0 -76
  718. package/src/ui/clamp.js +0 -11
  719. package/src/ui/createPopUp.js +0 -205
  720. package/src/ui/czi-animations.css +0 -15
  721. package/src/ui/czi-color-editor.css +0 -56
  722. package/src/ui/czi-custom-button.css +0 -93
  723. package/src/ui/czi-pop-up.css +0 -32
  724. package/src/ui/czi-tooltip-surface.css +0 -45
  725. package/src/ui/preventEventDefault.js +0 -5
  726. package/src/ui/rects.js +0 -47
  727. package/src/updateIndentLevel.js +0 -211
  728. package/utils/build_customstyle_server.js +0 -70
@@ -1,562 +1,638 @@
1
- // @flow
2
- import { EditorState, TextSelection, Plugin } from 'prosemirror-state';
3
- import { Node } from 'prosemirror-model';
4
- import { Transform } from 'prosemirror-transform';
5
- import { EditorView } from 'prosemirror-view';
6
- import * as React from 'react';
7
- import ReactDOM from 'react-dom';
8
- import { stringify } from 'flatted';
9
-
10
- import convertFromJSON from '../convertFromJSON';
11
- import RichTextEditor from '../ui/RichTextEditor';
12
- import uuid from '../uuid';
13
- import SimpleConnector from './SimpleConnector';
14
- import CollabConnector from './CollabConnector';
15
- import { EMPTY_DOC_JSON } from '../createEmptyEditorState';
16
- import type { EditorRuntime } from '../Types';
17
- import createPopUp from '../ui/createPopUp';
18
- import { atViewportCenter } from '../ui/PopUpPosition';
19
- import AlertInfo from '../ui/AlertInfo';
20
- import { SetDocAttrStep } from '@modusoperandi/licit-doc-attrs-step';
21
- import './licit.css';
22
- import DefaultEditorPlugins from '../buildEditorPlugins';
23
- import { Schema } from 'prosemirror-model';
24
- import EditorMarks from '../EditorMarks';
25
- import EditorNodes from '../EditorNodes';
26
-
27
- const ATTR_OBJID = 'objectId';
28
- const ATTR_OBJMETADATA = 'objectMetaData';
29
- /**
30
- * LICIT properties:
31
- * docID {string} [] Collaborative Doument ID
32
- * collabServiceURL {string} [/collaboration-service] Collaboration Service URL
33
- * debug {boolean} [false] To enable/disable ProseMirror Debug Tools, available only in development.
34
- * width {string} [100%] Width of the editor.
35
- * height {string} [100%] Height of the editor.
36
- * readOnly {boolean} [false] To enable/disable editing mode.
37
- * onChange {@callback} [null] Fires after each significant change.
38
- * @param data {JSON} Modified document data.
39
- * onReady {@callback} [null] Fires when the editor is fully ready.
40
- * @param ref {LICIT} Rerefence of the editor.
41
- * data {JSON} [null] Document data to be loaded into the editor.
42
- * disabled {boolean} [false] Disable the editor.
43
- * embedded {boolean} [false] Disable/Enable inline behaviour.
44
- * plugins [plugins] External Plugins into the editor.
45
- */
46
- class Licit extends React.Component<any, any> {
47
- _runtime: EditorRuntime;
48
- _connector: any;
49
- _clientID: string;
50
- _editorView: EditorView; // This will be handy in updating document's content.
51
- _skipSCU: boolean; // Flag to decide whether to skip shouldComponentUpdate
52
- _defaultEditorSchema: Schema;
53
- _defaultEditorPlugins: Array<Plugin>;
54
- _devTools: Promise<any>;
55
- _applyDevTools: any;
56
-
57
- _popUp = null;
58
-
59
- /**
60
- * Provides access to prosemirror view.
61
- */
62
- get editorView(): EditorView {
63
- return this._editorView;
64
- }
65
-
66
- constructor(props: any, context: any) {
67
- super(props, context);
68
- this.initialize(props);
69
- }
70
-
71
- initialize(props: any) {
72
- this._clientID = uuid();
73
- this._editorView = null;
74
- this._skipSCU = true;
75
-
76
- const noop = function () {};
77
-
78
- // [FS] IRAD-981 2020-06-10
79
- // Component's configurations.
80
- // [FS] IRAD-1552 2021-08-26
81
- // Collaboration server / client should allow string values for document identifiers.
82
- const docID = props.docID || ''; // Empty means collaborative.
83
- const collaborative = docID !== '';
84
- // [FS] IRAD-1553 2021-08-26
85
- // Configurable Collaboration Service URL.
86
- const collabServiceURL = props.collabServiceURL || '/collaboration-service';
87
- const debug = props.debug || false;
88
- // Default width and height to undefined
89
- const width = props.width || undefined;
90
- const height = props.height || undefined;
91
- const onChangeCB =
92
- typeof props.onChange === 'function' ? props.onChange : noop;
93
- const onReadyCB =
94
- typeof props.onReady === 'function' ? props.onReady : noop;
95
- const readOnly = props.readOnly || false;
96
- const data = props.data || null;
97
- const disabled = props.disabled || false;
98
- const embedded = props.embedded || false; // [FS] IRAD-996 2020-06-30
99
- // [FS] 2020-07-03
100
- // Handle Image Upload from Angular App
101
- const runtime = props.runtime || null;
102
- const plugins = props.plugins || null;
103
-
104
- this._defaultEditorSchema = new Schema({
105
- nodes: EditorNodes,
106
- marks: EditorMarks,
107
- });
108
- this._defaultEditorPlugins = new DefaultEditorPlugins(
109
- this._defaultEditorSchema
110
- ).get();
111
-
112
- let editorState = convertFromJSON(
113
- data,
114
- null,
115
- this._defaultEditorSchema,
116
- plugins,
117
- this._defaultEditorPlugins
118
- );
119
- // [FS] IRAD-1067 2020-09-19
120
- // The editorState will return null if the doc Json is mal-formed
121
- if (null === editorState) {
122
- editorState = convertFromJSON(
123
- EMPTY_DOC_JSON,
124
- null,
125
- this._defaultEditorSchema,
126
- plugins,
127
- this._defaultEditorPlugins
128
- );
129
- this.showAlert();
130
- }
131
-
132
- const setState = this.setState.bind(this);
133
- this._connector = collaborative
134
- ? new CollabConnector(
135
- editorState,
136
- setState,
137
- {
138
- docID,
139
- collabServiceURL,
140
- },
141
- this._defaultEditorSchema,
142
- this._defaultEditorPlugins,
143
- // [FS] IRAD-1578 2021-09-27
144
- this.onReady.bind(this)
145
- )
146
- : new SimpleConnector(editorState, setState);
147
-
148
- // FS IRAD-989 2020-18-06
149
- // updating properties should automatically render the changes
150
-
151
- this.state = {
152
- docID,
153
- collabServiceURL,
154
- data,
155
- editorState,
156
- width,
157
- height,
158
- readOnly,
159
- onChangeCB,
160
- onReadyCB,
161
- debug,
162
- disabled,
163
- embedded,
164
- runtime,
165
- };
166
-
167
- // FS IRAD-1040 2020-26-08
168
- // Get the modified schema from editorstate and send it to collab server
169
- if (this._connector.updateSchema) {
170
- // Use known editorState to update schema.
171
- this._connector.updateSchema(editorState.schema);
172
- }
173
- }
174
-
175
- // [FS] IRAD-1578 2021-09-27
176
- onReady(state: EditorState) {
177
- const collabEditing = this.state.docID !== '';
178
-
179
- if (collabEditing) {
180
- this._editorView && this._editorView.focus();
181
- if (this.state.onReadyCB) {
182
- this.state.onReadyCB(this);
183
- }
184
- }
185
- }
186
-
187
- // [FS] IRAD-1067 2020-09-19
188
- // Alert funtion to show document is corrupted
189
- showAlert() {
190
- const anchor = null;
191
- this._popUp = createPopUp(AlertInfo, null, {
192
- anchor,
193
- position: atViewportCenter,
194
- onClose: (val) => {
195
- if (this._popUp) {
196
- this._popUp = null;
197
- }
198
- },
199
- });
200
- }
201
-
202
- resetCounters(transaction: Transform) {
203
- for (let index = 1; index <= 10; index++) {
204
- const counterVar = 'set-cust-style-counter-' + index;
205
- const setCounterVal = window[counterVar];
206
- if (setCounterVal) {
207
- delete window[counterVar];
208
- }
209
- }
210
- this.setCounterFlags(transaction, true);
211
- }
212
-
213
- setCounterFlags(transaction: Transform, reset: boolean) {
214
- let modified = false;
215
- let counterFlags = null;
216
- const existingCFlags = transaction.doc.attrs.counterFlags;
217
- if (reset && !existingCFlags) {
218
- return;
219
- }
220
-
221
- for (let index = 1; index <= 10; index++) {
222
- const counterVar = 'set-cust-style-counter-' + index;
223
-
224
- const setCounterVal = window[counterVar];
225
- if (setCounterVal) {
226
- if (!counterFlags) {
227
- counterFlags = {};
228
- }
229
- counterFlags[counterVar] = true;
230
-
231
- if (!existingCFlags) {
232
- modified = true;
233
- }
234
- }
235
- if (!modified) {
236
- if (existingCFlags) {
237
- if (setCounterVal) {
238
- modified = undefined == existingCFlags[counterVar];
239
- } else {
240
- modified = undefined != existingCFlags[counterVar];
241
- }
242
- } else {
243
- modified = setCounterVal;
244
- }
245
- }
246
- }
247
-
248
- if (modified) {
249
- const tr = this._editorView.state.tr.step(
250
- new SetDocAttrStep('counterFlags', counterFlags)
251
- );
252
- this._editorView.dispatch(tr);
253
- }
254
- }
255
-
256
- getDeletedArtifactIds() {
257
- if (this._connector.getDeletedArtifactIds) {
258
- this._connector.getDeletedArtifactIds(this.state.editorState.schema);
259
- }
260
- }
261
-
262
- isNodeHasAttribute(node: Node, attrName: string) {
263
- return node.attrs && node.attrs[attrName];
264
- }
265
-
266
- setContent = (content: any = {}): void => {
267
- // [FS] IRAD-1571 2021-09-27
268
- // dispatch a transaction that MUST start from the view�s current state;
269
- const editorState = this._editorView.state;
270
- const { doc, schema } = editorState;
271
- let { tr } = editorState;
272
- const document = schema.nodeFromJSON(content ? content : EMPTY_DOC_JSON);
273
-
274
- const selection = TextSelection.create(doc, 0, doc.content.size);
275
-
276
- tr = tr.setSelection(selection).replaceSelectionWith(document, false);
277
- // [FS] IRAD-1092 2020-12-03
278
- // set the value for object metadata and objectId
279
- tr = this.isNodeHasAttribute(document, ATTR_OBJMETADATA)
280
- ? tr.step(
281
- new SetDocAttrStep(ATTR_OBJMETADATA, document.attrs.objectMetaData)
282
- )
283
- : tr;
284
- tr = this.isNodeHasAttribute(document, ATTR_OBJID)
285
- ? tr.step(new SetDocAttrStep(ATTR_OBJID, document.attrs.objectId))
286
- : tr;
287
-
288
- this._skipSCU = true;
289
- this._editorView.dispatch(tr);
290
- };
291
-
292
- shouldComponentUpdate(nextProps: any, nextState: any) {
293
- // Only interested if properties are set from outside.
294
- if (!this._skipSCU) {
295
- this._skipSCU = false;
296
- let dataChanged = false;
297
-
298
- // [FS] IRAD-1571 2021-09-27
299
- // dispatch a transaction that MUST start from the view�s current state;
300
- // [FS] IRAD-1589 2021-10-04
301
- // Do a proper circular JSON comparison.
302
- if (stringify(this.state.data) !== stringify(nextState.data)) {
303
- const editorState = this._editorView.state;
304
- const nextDoc = editorState.schema.nodeFromJSON(
305
- nextState.data ? nextState.data : EMPTY_DOC_JSON
306
- );
307
- dataChanged = !nextDoc.eq(editorState.doc);
308
- }
309
-
310
- if (dataChanged) {
311
- // data changed, so update document content
312
- this.setContent(nextState.data);
313
- }
314
-
315
- if (this.state.docID !== nextState.docID) {
316
- // Collaborative mode changed
317
- const collabEditing = nextState.docID !== '';
318
- const editorState = this._editorView.state;
319
- const setState = this.setState.bind(this);
320
- const docID = nextState.docID || '';
321
- const collabServiceURL =
322
- nextState.collabServiceURL || '/collaboration-service';
323
- // create new connector
324
- this._connector = collabEditing
325
- ? new CollabConnector(
326
- editorState,
327
- setState,
328
- {
329
- docID,
330
- collabServiceURL,
331
- },
332
- this._defaultEditorSchema,
333
- this._defaultEditorPlugins,
334
- // [FS] IRAD-1578 2021-09-27
335
- this.onReady.bind(this)
336
- )
337
- : new SimpleConnector(editorState, setState);
338
- }
339
- }
340
-
341
- return true;
342
- }
343
-
344
- render(): React.Element<any> {
345
- const {
346
- editorState,
347
- width,
348
- height,
349
- readOnly,
350
- disabled,
351
- embedded,
352
- runtime,
353
- } = this.state;
354
- // [FS] IRAD-978 2020-06-05
355
- // Using 100vw & 100vh (100% viewport) is not ideal for a component which is expected to be a part of a page,
356
- // so changing it to 100% width & height which will occupy the area relative to its parent.
357
- return (
358
- <RichTextEditor
359
- disabled={disabled}
360
- editorState={editorState}
361
- embedded={embedded}
362
- height={height}
363
- onChange={this._onChange}
364
- onReady={this._onReady}
365
- readOnly={readOnly}
366
- runtime={runtime}
367
- width={width}
368
- />
369
- );
370
- }
371
-
372
- _onChange = (data: { state: EditorState, transaction: Transform }): void => {
373
- const { transaction } = data;
374
-
375
- /*
376
- ** ProseMirror Debug Tool's Snapshot creates a new state and sets that to editor view's state.
377
- ** This results in the connector's state as an orphan and thus transaction mismatch error.
378
- ** To resolve check and update the connector's state to keep in sync.
379
- */
380
-
381
- if (this._editorView) {
382
- const isSameState =
383
- this._connector._editorState == this._editorView.state;
384
- let invokeOnEdit = false;
385
-
386
- if (!isSameState) {
387
- this._connector._editorState = this._editorView.state;
388
- invokeOnEdit = true;
389
- } else {
390
- // [FS] IRAD-1264 2021-03-19
391
- // check if in non-collab mode.
392
- if (!(this._connector instanceof CollabConnector)) {
393
- invokeOnEdit = true;
394
- }
395
- }
396
- if (invokeOnEdit) {
397
- // [FS] IRAD-1236 2020-03-05
398
- // Only need to call if there is any difference in collab mode OR always in non-collab mode.
399
- this._connector.onEdit(transaction, this._editorView);
400
- }
401
-
402
- if (transaction.docChanged) {
403
- const docJson = transaction.doc.toJSON();
404
- let isEmpty = false;
405
-
406
- if (docJson.content && docJson.content.length === 1) {
407
- if (
408
- !docJson.content[0].content ||
409
- (docJson.content[0].content &&
410
- docJson.content[0].content[0].text &&
411
- '' === docJson.content[0].content[0].text.trim())
412
- ) {
413
- isEmpty = true;
414
- }
415
- }
416
-
417
- // setCFlags is/was always the opposite of isEmpty.
418
- if (isEmpty) {
419
- this.resetCounters(transaction);
420
- } else {
421
- this.setCounterFlags(transaction, false);
422
- }
423
-
424
- // Changing 2nd parameter from boolean to object was not in any way
425
- // backwards compatible. Any conditional logic placed on isEmpty was
426
- // broken. Reverting that change, then adding view as a 3rd parameter.
427
- this.state.onChangeCB(docJson, isEmpty, this._editorView);
428
-
429
- this.closeOpenedPopupModels();
430
- }
431
- }
432
- };
433
- // [FS] IRAD-1173 2021-02-25
434
- // Bug fix: Transaction mismatch error when a dialog is opened and keep typing.
435
- closeOpenedPopupModels() {
436
- const element = document.getElementsByClassName('czi-pop-up-element')[0];
437
- if (element && element.parentElement) {
438
- element.parentElement.removeChild(element);
439
- }
440
- }
441
-
442
- _onReady = (editorView: EditorView): void => {
443
- // [FS][06-APR-2020][IRAD-922]
444
- // Showing focus in the editor.
445
- const { state, dispatch } = editorView;
446
- this._editorView = editorView;
447
- const tr = state.tr;
448
- const doc = state.doc;
449
- const trx = tr.setSelection(TextSelection.create(doc, 0, doc.content.size));
450
- dispatch(trx.scrollIntoView());
451
-
452
- // [FS] IRAD-1578 2021-09-27
453
- // In collab mode, fire onRead only after getting the response from collab server.
454
- if (this.state.onReadyCB && this.state.docID === '') {
455
- editorView.focus();
456
- this.state.onReadyCB(this);
457
- }
458
-
459
- this.initDevTool(this.state.debug, editorView);
460
- };
461
-
462
- initDevTool(debug: boolean, editorView: EditorView): void {
463
- // [FS] IRAD-1575 2021-09-27
464
- if (debug) {
465
- if (!this._devTools) {
466
- this._devTools = new Promise(async (resolve, reject) => {
467
- try {
468
- // Method is exported as both the default and named, Using named
469
- // for clarity and future proofing.
470
- const { applyDevTools } = await import('prosemirror-dev-tools');
471
- // got the pm dev tools instance.
472
- this._applyDevTools = applyDevTools;
473
- // Attach debug tools to current editor instance.
474
- this._applyDevTools(editorView);
475
- resolve(() => {
476
- // [FS] IRAD-1571 2021-10-08
477
- // Prosemirror Dev Tools handles as if one only instance is used in a page and
478
- // hence handling removal here gracefully.
479
- const place = document.querySelector(
480
- '.'.concat('__prosemirror-dev-tools__')
481
- );
482
- if (place) {
483
- ReactDOM.unmountComponentAtNode(place);
484
- place.innerHTML = '';
485
- }
486
- });
487
- } catch (error) {
488
- reject();
489
- }
490
- });
491
- }
492
-
493
- // Attach debug tools to current editor instance.
494
- if (this._devTools && this._applyDevTools) {
495
- this._applyDevTools(editorView);
496
- }
497
- }
498
- }
499
-
500
- destroyDevTool(): void {
501
- // [FS] IRAD-1569 2021-09-15
502
- // Unmount dev tools when component is destroyed,
503
- // so that toggle effect is not occuring when the document is retrieved each time.
504
- if (this._devTools) {
505
- // Call the applyDevTools method again to trigger DOM removal
506
- // prosemirror-dev-tools has outstanding pull-requests that affect
507
- // dom removal. this may need to be addressed once those have been merged.
508
- this._devTools.then((removeDevTools) => removeDevTools());
509
- }
510
- }
511
-
512
- componentWillUnmount(): void {
513
- this.destroyDevTool();
514
- }
515
-
516
- /**
517
- * LICIT properties:
518
- * docID {number} [0] Collaborative Doument ID
519
- * debug {boolean} [false] To enable/disable ProseMirror Debug Tools, available only in development.
520
- * width {string} [100%] Width of the editor.
521
- * height {height} [100%] Height of the editor.
522
- * readOnly {boolean} [false] To enable/disable editing mode.
523
- * onChange {@callback} [null] Fires after each significant change.
524
- * @param data {JSON} Modified document data.
525
- * onReady {@callback} [null] Fires when the editor is fully ready.
526
- * @param ref {LICIT} Rerefence of the editor.
527
- * data {JSON} [null] Document data to be loaded into the editor.
528
- * disabled {boolean} [false] Disable the editor.
529
- * embedded {boolean} [false] Disable/Enable inline behaviour.
530
- */
531
- setProps = (props: any): void => {
532
- // [FS] IRAD-1571 2021-10-08
533
- // Since the debug lies outside the editor,
534
- // any change to debug tool must be refreshed here.
535
- if (this.state.debug !== props.debug) {
536
- // change in debug flag.
537
- if (props.debug) {
538
- this.initDevTool(true, this._editorView);
539
- } else {
540
- this.destroyDevTool();
541
- }
542
- }
543
-
544
- if (this.state.readOnly) {
545
- // It should be possible to load content into the editor in readonly as well.
546
- // It should not be necessary to make the component writable any time during the process
547
- const propsCopy = {};
548
- this._skipSCU = true;
549
- Object.assign(propsCopy, props);
550
- // make writable without content change
551
- propsCopy.readOnly = false;
552
- delete propsCopy.data;
553
- this.setState(propsCopy);
554
- }
555
- // Need to go through shouldComponentUpdate lifecycle here, when updated from outside,
556
- // so that content is modified gracefully using transaction so that undo/redo works too.
557
- this._skipSCU = false;
558
- this.setState(props);
559
- };
560
- }
561
-
562
- export default Licit;
1
+ // @flow
2
+ import { EditorState, TextSelection, Plugin } from 'prosemirror-state';
3
+ import { Node, Schema } from 'prosemirror-model';
4
+ import { Transform } from 'prosemirror-transform';
5
+ import { EditorView } from 'prosemirror-view';
6
+ import * as React from 'react';
7
+ import ReactDOM from 'react-dom';
8
+ import { stringify } from 'flatted';
9
+
10
+ import convertFromJSON from '../convertFromJSON';
11
+ import RichTextEditor from '../ui/RichTextEditor';
12
+ import uuid from '../uuid';
13
+ import SimpleConnector from './SimpleConnector';
14
+ import CollabConnector from './CollabConnector';
15
+ import { EMPTY_DOC_JSON } from '../createEmptyEditorState';
16
+ import type { EditorRuntime } from '../Types';
17
+ import {
18
+ createPopUp,
19
+ atViewportCenter,
20
+ } from '@modusoperandi/licit-ui-commands';
21
+ import AlertInfo from '../ui/AlertInfo';
22
+ import { SetDocAttrStep } from '@modusoperandi/licit-doc-attrs-step';
23
+ import './licit.css';
24
+ import DefaultEditorPlugins from '../buildEditorPlugins';
25
+ import EditorMarks from '../EditorMarks';
26
+ import EditorNodes from '../EditorNodes';
27
+ import convertFromHTML from '../convertFromHTML';
28
+
29
+ export const DataType = Object.freeze({
30
+ JSON: Symbol('json'),
31
+ HTML: Symbol('html'),
32
+ });
33
+
34
+ /**
35
+ * LICIT properties:
36
+ * docID {string} [] Collaborative Doument ID
37
+ * collabServiceURL {string} [/collaboration-service] Collaboration Service URL
38
+ * debug {boolean} [false] To enable/disable ProseMirror Debug Tools, available only in development.
39
+ * width {string} [100%] Width of the editor.
40
+ * height {string} [100%] Height of the editor.
41
+ * readOnly {boolean} [false] To enable/disable editing mode.
42
+ * onChange {@callback} [null] Fires after each significant change.
43
+ * @param data {JSON} Modified document data.
44
+ * onReady {@callback} [null] Fires when the editor is fully ready.
45
+ * @param ref {LICIT} Rerefence of the editor.
46
+ * data {JSON|HTML} [null] Document data to be loaded into the editor.
47
+ * dataType {JSON|HTML} [JSON] Document data to be loaded into the editor.
48
+ * disabled {boolean} [false] Disable the editor.
49
+ * embedded {boolean} [false] Disable/Enable inline behaviour.
50
+ * plugins [plugins] External Plugins into the editor.
51
+ */
52
+ class Licit extends React.Component<any, any> {
53
+ _runtime: EditorRuntime;
54
+ _connector: any;
55
+ _clientID: string;
56
+ _editorView: EditorView; // This will be handy in updating document's content.
57
+ _skipSCU: boolean; // Flag to decide whether to skip shouldComponentUpdate
58
+ _defaultEditorSchema: Schema;
59
+ _defaultEditorPlugins: Array<Plugin>;
60
+ _devTools: Promise<any>;
61
+ _applyDevTools: any;
62
+
63
+ _popUp = null;
64
+
65
+ /**
66
+ * Provides access to prosemirror view.
67
+ */
68
+ get editorView(): EditorView {
69
+ return this._editorView;
70
+ }
71
+
72
+ constructor(props: any, context: any) {
73
+ super(props, context);
74
+ this.initialize(props);
75
+ }
76
+
77
+ initialize(props: any) {
78
+ this._clientID = uuid();
79
+ this._editorView = null;
80
+ this._skipSCU = true;
81
+
82
+ const noop = function () {};
83
+
84
+ // [FS] IRAD-981 2020-06-10
85
+ // Component's configurations.
86
+ // [FS] IRAD-1552 2021-08-26
87
+ // Collaboration server / client should allow string values for document identifiers.
88
+ const docID = props.docID || ''; // Empty means collaborative.
89
+ const collaborative = docID !== '';
90
+ // [FS] IRAD-1553 2021-08-26
91
+ // Configurable Collaboration Service URL.
92
+ const collabServiceURL = props.collabServiceURL || '/collaboration-service';
93
+ const debug = props.debug || false;
94
+ // Default width and height to undefined
95
+ const width = props.width || undefined;
96
+ const height = props.height || undefined;
97
+ const onChangeCB =
98
+ typeof props.onChange === 'function' ? props.onChange : noop;
99
+ const onReadyCB =
100
+ typeof props.onReady === 'function' ? props.onReady : noop;
101
+ const readOnly = props.readOnly || false;
102
+ let data = props.data || null;
103
+ const dataType = props.dataType || DataType.JSON;
104
+ const disabled = props.disabled || false;
105
+ const embedded = props.embedded || false; // [FS] IRAD-996 2020-06-30
106
+ // [FS] 2020-07-03
107
+ // Handle Image Upload from Angular App
108
+ const runtime = props.runtime || null;
109
+ const plugins = props.plugins || null;
110
+
111
+ this._defaultEditorSchema = new Schema({
112
+ nodes: EditorNodes,
113
+ marks: EditorMarks,
114
+ });
115
+ this._defaultEditorPlugins = new DefaultEditorPlugins(
116
+ this._defaultEditorSchema
117
+ ).get();
118
+
119
+ const editorState = this.initEditorState(plugins, dataType, data);
120
+ data = editorState.doc;
121
+
122
+ const setState = this.setState.bind(this);
123
+ this._connector = collaborative
124
+ ? new CollabConnector(
125
+ editorState,
126
+ setState,
127
+ {
128
+ docID,
129
+ collabServiceURL,
130
+ },
131
+ this._defaultEditorSchema,
132
+ this._defaultEditorPlugins,
133
+ // [FS] IRAD-1578 2021-09-27
134
+ this.onReady.bind(this)
135
+ )
136
+ : new SimpleConnector(editorState, setState);
137
+
138
+ // FS IRAD-989 2020-18-06
139
+ // updating properties should automatically render the changes
140
+
141
+ this.state = {
142
+ docID,
143
+ collabServiceURL,
144
+ data,
145
+ editorState,
146
+ width,
147
+ height,
148
+ readOnly,
149
+ onChangeCB,
150
+ onReadyCB,
151
+ debug,
152
+ disabled,
153
+ embedded,
154
+ runtime,
155
+ };
156
+
157
+ // FS IRAD-1040 2020-26-08
158
+ // Get the modified schema from editorstate and send it to collab server
159
+ if (this._connector.updateSchema) {
160
+ // Use known editorState to update schema.
161
+ this._connector.updateSchema(editorState.schema, data);
162
+ }
163
+ }
164
+
165
+ initEditorState(plugins: Array<Plugin>, dataType: DataType, data: any) {
166
+ let editorState = null;
167
+ const effectivePlugins = this.getEffectivePlugins(
168
+ this._defaultEditorSchema,
169
+ this._defaultEditorPlugins,
170
+ plugins
171
+ );
172
+ if (DataType.JSON === dataType) {
173
+ editorState = convertFromJSON(
174
+ data,
175
+ null,
176
+ effectivePlugins.schema,
177
+ effectivePlugins.plugins
178
+ );
179
+ // [FS] IRAD-1067 2020-09-19
180
+ // The editorState will return null if the doc Json is mal-formed
181
+ if (null === editorState) {
182
+ editorState = convertFromJSON(
183
+ EMPTY_DOC_JSON,
184
+ null,
185
+ effectivePlugins.schema,
186
+ effectivePlugins.plugins
187
+ );
188
+ this.showAlert();
189
+ }
190
+ } else {
191
+ editorState = convertFromHTML(
192
+ data,
193
+ effectivePlugins.schema,
194
+ effectivePlugins.plugins
195
+ );
196
+ }
197
+
198
+ return editorState;
199
+ }
200
+
201
+ getEffectivePlugins(
202
+ schema: Schema,
203
+ defaultPlugins: Array<Plugin>,
204
+ plugins: Array<Plugin>
205
+ ): { plugins: Array<Plugin>, schema: Schema } {
206
+ const effectivePlugins = defaultPlugins;
207
+
208
+ if (plugins) {
209
+ for (const p of plugins) {
210
+ if (!effectivePlugins.includes(p)) {
211
+ effectivePlugins.push(p);
212
+ if (p.getEffectiveSchema) {
213
+ schema = p.getEffectiveSchema(schema);
214
+ }
215
+
216
+ if (p.initKeyCommands) {
217
+ effectivePlugins.push(p.initKeyCommands());
218
+ }
219
+ }
220
+ }
221
+ }
222
+ return { plugins: effectivePlugins, schema };
223
+ }
224
+
225
+ // [FS] IRAD-1578 2021-09-27
226
+ onReady(state: EditorState) {
227
+ const collabEditing = this.state.docID !== '';
228
+
229
+ if (collabEditing) {
230
+ this._editorView && this._editorView.focus();
231
+ if (this.state.onReadyCB) {
232
+ this.state.onReadyCB(this);
233
+ }
234
+ }
235
+ }
236
+
237
+ // [FS] IRAD-1067 2020-09-19
238
+ // Alert funtion to show document is corrupted
239
+ showAlert() {
240
+ const anchor = null;
241
+ this._popUp = createPopUp(AlertInfo, null, {
242
+ anchor,
243
+ position: atViewportCenter,
244
+ onClose: (val) => {
245
+ if (this._popUp) {
246
+ this._popUp = null;
247
+ }
248
+ },
249
+ });
250
+ }
251
+
252
+ resetCounters(transaction: Transform) {
253
+ for (let index = 1; index <= 10; index++) {
254
+ const counterVar = 'set-cust-style-counter-' + index;
255
+ const setCounterVal = window[counterVar];
256
+ if (setCounterVal) {
257
+ delete window[counterVar];
258
+ }
259
+ }
260
+ this.setCounterFlags(transaction, true);
261
+ }
262
+
263
+ setCounterFlags(transaction: Transform, reset: boolean) {
264
+ let modified = false;
265
+ let counterFlags = null;
266
+ const existingCFlags = transaction.doc.attrs.counterFlags;
267
+ if (reset && !existingCFlags) {
268
+ return;
269
+ }
270
+
271
+ for (let index = 1; index <= 10; index++) {
272
+ const counterVar = 'set-cust-style-counter-' + index;
273
+
274
+ const setCounterVal = window[counterVar];
275
+ if (setCounterVal) {
276
+ if (!counterFlags) {
277
+ counterFlags = {};
278
+ }
279
+ counterFlags[counterVar] = true;
280
+
281
+ if (!existingCFlags) {
282
+ modified = true;
283
+ }
284
+ }
285
+ if (!modified) {
286
+ if (existingCFlags) {
287
+ if (setCounterVal) {
288
+ modified = undefined == existingCFlags[counterVar];
289
+ } else {
290
+ modified = undefined != existingCFlags[counterVar];
291
+ }
292
+ } else {
293
+ modified = setCounterVal;
294
+ }
295
+ }
296
+ }
297
+
298
+ if (modified) {
299
+ const tr = this._editorView.state.tr.step(
300
+ new SetDocAttrStep('counterFlags', counterFlags)
301
+ );
302
+ this._editorView.dispatch(tr);
303
+ }
304
+ }
305
+
306
+ getDeletedArtifactIds() {
307
+ if (this._connector.getDeletedArtifactIds) {
308
+ this._connector.getDeletedArtifactIds(this.state.editorState.schema);
309
+ }
310
+ }
311
+
312
+ isNodeHasAttribute(node: Node, attrName: string) {
313
+ return node.attrs && node.attrs[attrName];
314
+ }
315
+
316
+ setContent = (content: any = {}): void => {
317
+ // [FS] IRAD-1571 2021-09-27
318
+ // dispatch a transaction that MUST start from the view’s current state;
319
+ const editorState = this._editorView.state;
320
+ const { doc, schema } = editorState;
321
+ let { tr } = editorState;
322
+ const document = schema.nodeFromJSON(content ? content : EMPTY_DOC_JSON);
323
+
324
+ // [FS] IRAD-1593 2021-10-12
325
+ // Reset lastKeyCode since the content is set dynamically and so lastKeyCode is invalid now.
326
+ this._editorView.lastKeyCode = null;
327
+
328
+ const selection = TextSelection.create(doc, 0, doc.content.size);
329
+
330
+ tr = tr.setSelection(selection).replaceSelectionWith(document, false);
331
+ // [FS] IRAD-1092 2020-12-03
332
+ // set the value for object metadata and objectId
333
+ // Should update all document attributes.
334
+ Object.keys(document.attrs).forEach((attr) => {
335
+ tr = tr.step(new SetDocAttrStep(attr, document.attrs[attr]));
336
+ });
337
+
338
+ this._skipSCU = true;
339
+ this._editorView.dispatch(tr);
340
+ };
341
+
342
+ hasDataChanged(nextData: any) {
343
+ let dataChanged = false;
344
+
345
+ // [FS] IRAD-1571 2021-09-27
346
+ // dispatch a transaction that MUST start from the view’s current state;
347
+ // [FS] IRAD-1589 2021-10-04
348
+ // Do a proper circular JSON comparison.
349
+ if (stringify(this.state.data) !== stringify(nextData)) {
350
+ const editorState = this._editorView.state;
351
+ const nextDoc = editorState.schema.nodeFromJSON(
352
+ nextData ? nextData : EMPTY_DOC_JSON
353
+ );
354
+ dataChanged = !nextDoc.eq(editorState.doc);
355
+ }
356
+
357
+ return dataChanged;
358
+ }
359
+
360
+ changeContent(data: any) {
361
+ if (this.hasDataChanged(data)) {
362
+ // FS IRAD-1592 2021-11-10
363
+ // Release here quickly, so that update doesn't care about at this point.
364
+ // data changed, so update document content
365
+ setTimeout(this.setContent.bind(this, data), 1);
366
+ }
367
+ }
368
+
369
+ shouldComponentUpdate(nextProps: any, nextState: any) {
370
+ // Only interested if properties are set from outside.
371
+ if (!this._skipSCU) {
372
+ this._skipSCU = false;
373
+
374
+ this.changeContent(nextState.data);
375
+
376
+ if (this.state.docID !== nextState.docID) {
377
+ setTimeout(this.setDocID.bind(this, nextState), 1);
378
+ }
379
+ }
380
+
381
+ return true;
382
+ }
383
+
384
+ setDocID(nextState: any) {
385
+ // Collaborative mode changed
386
+ const collabEditing = nextState.docID !== '';
387
+ const editorState = this._editorView.state;
388
+ const setState = this.setState.bind(this);
389
+ const docID = nextState.docID || '';
390
+ const collabServiceURL =
391
+ nextState.collabServiceURL || '/collaboration-service';
392
+
393
+ if (this._connector) {
394
+ this._connector.cleanUp();
395
+ }
396
+ // create new connector
397
+ this._connector = collabEditing
398
+ ? new CollabConnector(
399
+ editorState,
400
+ setState,
401
+ {
402
+ docID,
403
+ collabServiceURL,
404
+ },
405
+ this._defaultEditorSchema,
406
+ this._defaultEditorPlugins,
407
+ // [FS] IRAD-1578 2021-09-27
408
+ this.onReady.bind(this)
409
+ )
410
+ : new SimpleConnector(editorState, setState);
411
+
412
+ // FS IRAD-1592 2021-11-10
413
+ // Notify collab server
414
+ if (this._connector.updateSchema) {
415
+ // Use known editorState to update schema.
416
+ this._connector.updateSchema(editorState.schema);
417
+ }
418
+ }
419
+
420
+ render(): React.Element<any> {
421
+ const {
422
+ editorState,
423
+ width,
424
+ height,
425
+ readOnly,
426
+ disabled,
427
+ embedded,
428
+ runtime,
429
+ } = this.state;
430
+ // [FS] IRAD-978 2020-06-05
431
+ // Using 100vw & 100vh (100% viewport) is not ideal for a component which is expected to be a part of a page,
432
+ // so changing it to 100% width & height which will occupy the area relative to its parent.
433
+ return (
434
+ <RichTextEditor
435
+ disabled={disabled}
436
+ editorState={editorState}
437
+ embedded={embedded}
438
+ height={height}
439
+ onChange={this._onChange}
440
+ onReady={this._onReady}
441
+ readOnly={readOnly}
442
+ runtime={runtime}
443
+ width={width}
444
+ />
445
+ );
446
+ }
447
+
448
+ _onChange = (data: { state: EditorState, transaction: Transform }): void => {
449
+ const { transaction } = data;
450
+
451
+ /*
452
+ ** ProseMirror Debug Tool's Snapshot creates a new state and sets that to editor view's state.
453
+ ** This results in the connector's state as an orphan and thus transaction mismatch error.
454
+ ** To resolve check and update the connector's state to keep in sync.
455
+ */
456
+
457
+ if (this._editorView) {
458
+ const isSameState =
459
+ this._connector._editorState == this._editorView.state;
460
+ let invokeOnEdit = false;
461
+
462
+ if (!isSameState) {
463
+ this._connector._editorState = this._editorView.state;
464
+ invokeOnEdit = true;
465
+ } else {
466
+ // [FS] IRAD-1264 2021-03-19
467
+ // check if in non-collab mode.
468
+ if (!(this._connector instanceof CollabConnector)) {
469
+ invokeOnEdit = true;
470
+ }
471
+ }
472
+ if (invokeOnEdit) {
473
+ // [FS] IRAD-1236 2020-03-05
474
+ // Only need to call if there is any difference in collab mode OR always in non-collab mode.
475
+ this._connector.onEdit(transaction, this._editorView);
476
+ }
477
+
478
+ if (transaction.docChanged) {
479
+ const docJson = transaction.doc.toJSON();
480
+ let isEmpty = false;
481
+
482
+ if (docJson.content && docJson.content.length === 1) {
483
+ if (
484
+ !docJson.content[0].content ||
485
+ (docJson.content[0].content &&
486
+ docJson.content[0].content[0].text &&
487
+ '' === docJson.content[0].content[0].text.trim())
488
+ ) {
489
+ isEmpty = true;
490
+ }
491
+ }
492
+
493
+ // setCFlags is/was always the opposite of isEmpty.
494
+ if (isEmpty) {
495
+ this.resetCounters(transaction);
496
+ } else {
497
+ this.setCounterFlags(transaction, false);
498
+ }
499
+
500
+ // Changing 2nd parameter from boolean to object was not in any way
501
+ // backwards compatible. Any conditional logic placed on isEmpty was
502
+ // broken. Reverting that change, then adding view as a 3rd parameter.
503
+ this.state.onChangeCB(docJson, isEmpty, this._editorView);
504
+
505
+ this.closeOpenedPopupModels();
506
+ }
507
+ }
508
+ };
509
+ // [FS] IRAD-1173 2021-02-25
510
+ // Bug fix: Transaction mismatch error when a dialog is opened and keep typing.
511
+ closeOpenedPopupModels() {
512
+ const element = document.getElementsByClassName('czi-pop-up-element')[0];
513
+ if (element && element.parentElement) {
514
+ element.parentElement.removeChild(element);
515
+ }
516
+ }
517
+
518
+ _onReady = (editorView: EditorView): void => {
519
+ // [FS][06-APR-2020][IRAD-922]
520
+ // Showing focus in the editor.
521
+ const { state, dispatch } = editorView;
522
+ this._editorView = editorView;
523
+ const tr = state.tr;
524
+ const doc = state.doc;
525
+ const trx = tr.setSelection(TextSelection.create(doc, 0, doc.content.size));
526
+ dispatch(trx.scrollIntoView());
527
+
528
+ // [FS] IRAD-1578 2021-09-27
529
+ // In collab mode, fire onRead only after getting the response from collab server.
530
+ if (this.state.onReadyCB && this.state.docID === '') {
531
+ editorView.focus();
532
+ this.state.onReadyCB(this);
533
+ }
534
+
535
+ this.initDevTool(this.state.debug, editorView);
536
+ };
537
+
538
+ initDevTool(debug: boolean, editorView: EditorView): void {
539
+ // [FS] IRAD-1575 2021-09-27
540
+ if (debug) {
541
+ if (!this._devTools) {
542
+ this._devTools = new Promise(async (resolve, reject) => {
543
+ try {
544
+ // Method is exported as both the default and named, Using named
545
+ // for clarity and future proofing.
546
+ const { applyDevTools } = await import('prosemirror-dev-tools');
547
+ // got the pm dev tools instance.
548
+ this._applyDevTools = applyDevTools;
549
+ // Attach debug tools to current editor instance.
550
+ this._applyDevTools(editorView);
551
+ resolve(() => {
552
+ // [FS] IRAD-1571 2021-10-08
553
+ // Prosemirror Dev Tools handles as if one only instance is used in a page and
554
+ // hence handling removal here gracefully.
555
+ const place = document.querySelector(
556
+ '.'.concat('__prosemirror-dev-tools__')
557
+ );
558
+ if (place) {
559
+ ReactDOM.unmountComponentAtNode(place);
560
+ place.innerHTML = '';
561
+ }
562
+ });
563
+ } catch (error) {
564
+ reject();
565
+ }
566
+ });
567
+ }
568
+
569
+ // Attach debug tools to current editor instance.
570
+ if (this._devTools && this._applyDevTools) {
571
+ this._applyDevTools(editorView);
572
+ }
573
+ }
574
+ }
575
+
576
+ destroyDevTool(): void {
577
+ // [FS] IRAD-1569 2021-09-15
578
+ // Unmount dev tools when component is destroyed,
579
+ // so that toggle effect is not occuring when the document is retrieved each time.
580
+ if (this._devTools) {
581
+ // Call the applyDevTools method again to trigger DOM removal
582
+ // prosemirror-dev-tools has outstanding pull-requests that affect
583
+ // dom removal. this may need to be addressed once those have been merged.
584
+ this._devTools.then((removeDevTools) => removeDevTools());
585
+ }
586
+ }
587
+
588
+ componentWillUnmount(): void {
589
+ this.destroyDevTool();
590
+ }
591
+
592
+ /**
593
+ * LICIT properties:
594
+ * docID {number} [0] Collaborative Doument ID
595
+ * debug {boolean} [false] To enable/disable ProseMirror Debug Tools, available only in development.
596
+ * width {string} [100%] Width of the editor.
597
+ * height {height} [100%] Height of the editor.
598
+ * readOnly {boolean} [false] To enable/disable editing mode.
599
+ * onChange {@callback} [null] Fires after each significant change.
600
+ * @param data {JSON} Modified document data.
601
+ * onReady {@callback} [null] Fires when the editor is fully ready.
602
+ * @param ref {LICIT} Rerefence of the editor.
603
+ * data {JSON} [null] Document data to be loaded into the editor.
604
+ * disabled {boolean} [false] Disable the editor.
605
+ * embedded {boolean} [false] Disable/Enable inline behaviour.
606
+ */
607
+ setProps = (props: any): void => {
608
+ // [FS] IRAD-1571 2021-10-08
609
+ // Since the debug lies outside the editor,
610
+ // any change to debug tool must be refreshed here.
611
+ if (this.state.debug !== props.debug) {
612
+ // change in debug flag.
613
+ if (props.debug) {
614
+ this.initDevTool(true, this._editorView);
615
+ } else {
616
+ this.destroyDevTool();
617
+ }
618
+ }
619
+
620
+ if (this.state.readOnly) {
621
+ // It should be possible to load content into the editor in readonly as well.
622
+ // It should not be necessary to make the component writable any time during the process
623
+ const propsCopy = {};
624
+ this._skipSCU = true;
625
+ Object.assign(propsCopy, props);
626
+ // make writable without content change
627
+ propsCopy.readOnly = false;
628
+ delete propsCopy.data;
629
+ this.setState(propsCopy);
630
+ }
631
+ // Need to go through shouldComponentUpdate lifecycle here, when updated from outside,
632
+ // so that content is modified gracefully using transaction so that undo/redo works too.
633
+ this._skipSCU = false;
634
+ this.setState(props);
635
+ };
636
+ }
637
+
638
+ export default Licit;