@modusoperandi/licit 0.1.10 → 0.13.3

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