@manuscripts/body-editor 3.12.67 → 3.13.1

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 (289) hide show
  1. package/dist/cjs/components/toolbar/type-selector/styles.js +2 -1
  2. package/dist/cjs/versions.js +1 -1
  3. package/dist/es/components/toolbar/type-selector/styles.js +2 -1
  4. package/dist/es/versions.js +1 -1
  5. package/dist/types/components/toolbar/type-selector/styles.d.ts +2 -2
  6. package/dist/types/lib/footnotes.d.ts +4 -2
  7. package/dist/types/lib/utils.d.ts +5 -4
  8. package/dist/types/versions.d.ts +1 -1
  9. package/package.json +37 -36
  10. package/{dist/es/lib/statistics.js → src/__mocks__/styleMock.ts} +2 -14
  11. package/src/assets.ts +20 -0
  12. package/src/classes/collabProvider.ts +38 -0
  13. package/src/clipboard.ts +54 -0
  14. package/src/commands.ts +2109 -0
  15. package/src/components/ChangeHandlingForm.tsx +54 -0
  16. package/src/components/LanguageDropdown/index.tsx +343 -0
  17. package/src/components/affiliations/AffiliationForm.tsx +238 -0
  18. package/src/components/affiliations/AffiliationItem.tsx +151 -0
  19. package/src/components/affiliations/AffiliationList.tsx +71 -0
  20. package/src/components/affiliations/AffiliationsModal.tsx +676 -0
  21. package/src/components/affiliations/AffiliationsPanel.tsx +76 -0
  22. package/src/components/affiliations/CreateAffiliationModal.tsx +135 -0
  23. package/src/components/authors/AuthorDetailsForm.tsx +438 -0
  24. package/src/components/authors/AuthorList.tsx +81 -0
  25. package/src/components/authors/AuthorsModal.tsx +642 -0
  26. package/src/components/authors/AuthorsPanel.tsx +69 -0
  27. package/src/components/authors/CreateAuthorModal.tsx +172 -0
  28. package/src/components/authors/CreditDrawer.tsx +71 -0
  29. package/src/components/authors/DraggableAuthor.tsx +228 -0
  30. package/src/components/authors/useManageAffiliations.tsx +77 -0
  31. package/src/components/authors/useManageCredit.tsx +63 -0
  32. package/src/components/authors-affiliations/AuthorsAndAffiliationsModals.tsx +170 -0
  33. package/src/components/authors-affiliations/GenericPanel.tsx +164 -0
  34. package/src/components/authors-affiliations/ModalTabs.tsx +100 -0
  35. package/src/components/awards/AwardForm.tsx +338 -0
  36. package/src/components/awards/AwardModal.tsx +120 -0
  37. package/src/components/awards/DeleteAwardDiaolog.tsx +52 -0
  38. package/src/components/dialog/ConfirmationDialog.tsx +131 -0
  39. package/src/components/form/CreateModalStyles.tsx +37 -0
  40. package/src/components/form/FormFooter.tsx +54 -0
  41. package/src/components/form/FormPlaceholder.tsx +71 -0
  42. package/src/components/form/ModalFormActions.tsx +88 -0
  43. package/src/components/form/UnsavedLabel.tsx +49 -0
  44. package/src/components/hooks/use-debounce.ts +56 -0
  45. package/src/components/hooks/useAffiliationShowsErrorIndicator.ts +51 -0
  46. package/src/components/hooks/useAuthorShowsErrorIndicator.ts +73 -0
  47. package/src/components/keyboard-shortcuts-modal/FormattedShortcut.tsx +56 -0
  48. package/src/components/keyboard-shortcuts-modal/KeyboardShortcutsModal.tsx +283 -0
  49. package/src/components/keyboard-shortcuts-modal/keyboard-shortcuts.ts +304 -0
  50. package/src/components/keywords/AddKeywordInline.tsx +284 -0
  51. package/src/components/keywords/DeleteKeywordDialog.tsx +52 -0
  52. package/src/components/modal-drawer/GenericDrawer.tsx +65 -0
  53. package/src/components/modal-drawer/GenericDrawerGroup.tsx +125 -0
  54. package/src/components/outline/DraggableTree.tsx +438 -0
  55. package/src/components/outline/ManuscriptOutline.tsx +127 -0
  56. package/src/components/outline/Outline.tsx +141 -0
  57. package/src/components/references/BibliographyItemSource.ts +80 -0
  58. package/src/components/references/CitationEditor.tsx +301 -0
  59. package/src/components/references/CitationViewer.tsx +62 -0
  60. package/src/components/references/ImportBibliographyForm.tsx +232 -0
  61. package/src/components/references/ImportBibliographyModal.tsx +159 -0
  62. package/src/components/references/ReferenceForm/PersonDropDown.tsx +93 -0
  63. package/src/components/references/ReferenceForm/ReferenceForm.tsx +701 -0
  64. package/src/components/references/ReferenceForm/config.ts +133 -0
  65. package/src/components/references/ReferenceForm/styled-components.ts +156 -0
  66. package/src/components/references/ReferenceLine.tsx +43 -0
  67. package/src/components/references/ReferenceSearch.tsx +163 -0
  68. package/src/components/references/ReferenceSearchResults.tsx +113 -0
  69. package/src/components/references/ReferenceSearchResultsPlaceholder.tsx +71 -0
  70. package/src/components/references/ReferenceSearchSection.tsx +124 -0
  71. package/src/components/references/ReferencesEditor.tsx +61 -0
  72. package/src/components/references/ReferencesModal.tsx +352 -0
  73. package/src/components/references/SearchInput.tsx +98 -0
  74. package/src/components/toolbar/InsertEmbedDialog.tsx +222 -0
  75. package/src/components/toolbar/InsertTableDialog.tsx +208 -0
  76. package/src/components/toolbar/ListMenuItem.tsx +203 -0
  77. package/src/components/toolbar/helpers.ts +547 -0
  78. package/src/components/toolbar/type-selector/OptionComponent.tsx +89 -0
  79. package/src/components/toolbar/type-selector/TypeSelector.tsx +157 -0
  80. package/src/components/toolbar/type-selector/styles.ts +79 -0
  81. package/src/components/views/CrossReferenceItems.tsx +199 -0
  82. package/src/components/views/DeleteEmbedDialog.tsx +83 -0
  83. package/src/components/views/DeleteFootnoteDialog.tsx +54 -0
  84. package/src/components/views/FigureDropdown.tsx +423 -0
  85. package/src/components/views/FootnotesSelector.tsx +255 -0
  86. package/src/components/views/InsertSpecialCharacter.tsx +245 -0
  87. package/src/components/views/LinkForm.tsx +220 -0
  88. package/src/components/views/TableCellContextMenu.tsx +241 -0
  89. package/src/configs/ManuscriptsEditor.ts +140 -0
  90. package/src/configs/editor-plugins.ts +119 -0
  91. package/src/configs/editor-views.ts +139 -0
  92. package/src/icons.ts +62 -0
  93. package/src/index.ts +65 -0
  94. package/src/keys/highlight.ts +65 -0
  95. package/src/keys/index.ts +33 -0
  96. package/src/keys/keyword.ts +69 -0
  97. package/src/keys/list.ts +156 -0
  98. package/src/keys/misc.ts +112 -0
  99. package/src/keys/title.ts +221 -0
  100. package/src/lib/__tests__/__fixtures__/doc.json +388 -0
  101. package/src/lib/__tests__/__snapshots__/paste.test.ts.snap +24 -0
  102. package/src/lib/__tests__/authors.test.ts +202 -0
  103. package/src/lib/__tests__/helpers.test.ts +46 -0
  104. package/src/lib/__tests__/paste.test.ts +57 -0
  105. package/src/lib/__tests__/plugins.test.ts +176 -0
  106. package/src/lib/__tests__/url.test.ts +31 -0
  107. package/src/lib/array-reducer.ts +68 -0
  108. package/src/lib/authors-and-affiliations.ts +81 -0
  109. package/src/lib/authors.ts +67 -0
  110. package/src/lib/capabilities.ts +55 -0
  111. package/src/lib/codemirror.ts +37 -0
  112. package/src/lib/comments.ts +123 -0
  113. package/src/lib/context-menu.ts +745 -0
  114. package/src/lib/copy.ts +30 -0
  115. package/src/lib/crossref.ts +90 -0
  116. package/src/lib/dnd.ts +29 -0
  117. package/src/lib/doc.ts +167 -0
  118. package/src/lib/dompurify.ts +28 -0
  119. package/src/lib/files.ts +180 -0
  120. package/src/lib/footnotes.ts +83 -0
  121. package/src/lib/get-media-type.ts +105 -0
  122. package/src/lib/helpers.ts +199 -0
  123. package/src/lib/hierarchy.ts +117 -0
  124. package/src/lib/languages.ts +37 -0
  125. package/src/lib/lists.ts +56 -0
  126. package/src/lib/math.ts +111 -0
  127. package/src/lib/media.ts +334 -0
  128. package/src/lib/navigation-utils.ts +235 -0
  129. package/src/lib/normalize.ts +70 -0
  130. package/src/lib/paste.ts +304 -0
  131. package/src/lib/placeholder.ts +32 -0
  132. package/src/lib/platform.ts +18 -0
  133. package/src/lib/plugins.ts +22 -0
  134. package/src/lib/popper.ts +180 -0
  135. package/src/lib/position-menu.ts +184 -0
  136. package/src/lib/references.ts +94 -0
  137. package/src/lib/template.ts +29 -0
  138. package/src/lib/track-changes-utils.ts +34 -0
  139. package/{dist/types/lib/statistics.d.ts → src/lib/url.ts} +11 -8
  140. package/src/lib/use-do-with-debounce.ts +39 -0
  141. package/src/lib/utils.ts +323 -0
  142. package/src/lib/view.ts +100 -0
  143. package/src/menus.tsx +684 -0
  144. package/src/node-type-icons.tsx +83 -0
  145. package/src/plugins/__tests__/__fixtures__/deleted-footnote.json +140 -0
  146. package/src/plugins/__tests__/__fixtures__/inserted-footnote.json +153 -0
  147. package/src/plugins/__tests__/footnotes.test.ts +67 -0
  148. package/src/plugins/accessibility_element.ts +219 -0
  149. package/src/plugins/add-subtitle.ts +102 -0
  150. package/src/plugins/affiliations.ts +136 -0
  151. package/src/plugins/alt-titles.ts +219 -0
  152. package/src/plugins/bibliography.ts +235 -0
  153. package/src/plugins/comments.ts +328 -0
  154. package/src/plugins/cross-references.ts +70 -0
  155. package/src/plugins/detect-inconsistency/detect-inconsistency-utils.ts +102 -0
  156. package/src/plugins/detect-inconsistency/index.ts +55 -0
  157. package/src/plugins/detect-inconsistency/validators.ts +283 -0
  158. package/src/plugins/doi.ts +66 -0
  159. package/src/plugins/editor-props.ts +39 -0
  160. package/src/plugins/elements.ts +60 -0
  161. package/src/plugins/footnotes.ts +298 -0
  162. package/src/plugins/link.ts +53 -0
  163. package/src/plugins/lock-body.ts +136 -0
  164. package/src/plugins/move-node.ts +55 -0
  165. package/src/plugins/objects.ts +125 -0
  166. package/src/plugins/paragraphs.ts +90 -0
  167. package/src/plugins/persist.ts +64 -0
  168. package/src/plugins/persistent-cursor.ts +66 -0
  169. package/src/plugins/placeholder.ts +219 -0
  170. package/src/plugins/prevent-empty.ts +50 -0
  171. package/src/plugins/search-replace/index.ts +157 -0
  172. package/src/plugins/search-replace/lib.ts +95 -0
  173. package/src/plugins/section_category.ts +212 -0
  174. package/src/plugins/section_title/autocompletion.ts +87 -0
  175. package/src/plugins/section_title/index.ts +105 -0
  176. package/src/plugins/selected-suggestion.ts +243 -0
  177. package/src/plugins/tables-cursor-fix.ts +143 -0
  178. package/src/plugins/translations.ts +263 -0
  179. package/src/rules.ts +60 -0
  180. package/src/selection.ts +112 -0
  181. package/src/testing/default-capabilities.ts +48 -0
  182. package/src/testing/default-editor-data.ts +73 -0
  183. package/src/testing/empty-editor-doc.json +62 -0
  184. package/src/testing/polyfill-dom.ts +43 -0
  185. package/src/testing/section-categories.json +161 -0
  186. package/src/testing/setup-editor.ts +55 -0
  187. package/src/tests.ts +42 -0
  188. package/src/toolbar.tsx +259 -0
  189. package/src/types/@citation-js/core.d.ts +16 -0
  190. package/src/types/@citation-js/index.d.ts +16 -0
  191. package/src/types/@citation-js/plugin-bibtex.d.ts +16 -0
  192. package/src/types/@citation-js/plugin-csl.d.ts +16 -0
  193. package/src/types/@citation-js/plugin-doi.d.ts +16 -0
  194. package/src/types/@citation-js/plugin-enw.d.ts +16 -0
  195. package/src/types/@citation-js/plugin-pubmed.d.ts +16 -0
  196. package/src/types/@citation-js/plugin-ris.d.ts +16 -0
  197. package/src/types/citeproc.d.ts +124 -0
  198. package/src/types/css.d.ts +16 -0
  199. package/src/types/json.d.ts +17 -0
  200. package/src/types/prosemirror-dev-tools.d.ts +16 -0
  201. package/src/types/prosemirror-dropcursor.d.ts +16 -0
  202. package/src/types/styled-components.d.ts +23 -0
  203. package/src/types.ts +49 -0
  204. package/src/useEditor.ts +244 -0
  205. package/src/versions.ts +3 -0
  206. package/src/views/ReactSubView.tsx +145 -0
  207. package/src/views/abstracts.ts +46 -0
  208. package/src/views/accessibility_element.ts +86 -0
  209. package/src/views/affiliations.ts +254 -0
  210. package/src/views/alt_title.ts +85 -0
  211. package/src/views/alt_titles_section.ts +97 -0
  212. package/src/views/attachment.ts +160 -0
  213. package/src/views/attachments.ts +72 -0
  214. package/src/views/author_notes.ts +96 -0
  215. package/src/views/award.ts +194 -0
  216. package/src/views/awards.ts +59 -0
  217. package/src/views/base_node_view.ts +85 -0
  218. package/src/views/bibliography_element.ts +313 -0
  219. package/src/views/block_view.ts +100 -0
  220. package/src/views/blockquote_element.ts +26 -0
  221. package/src/views/blockquote_element_editable.ts +24 -0
  222. package/src/views/box_element.ts +33 -0
  223. package/src/views/caption.ts +37 -0
  224. package/src/views/caption_title.ts +33 -0
  225. package/src/views/citation.ts +67 -0
  226. package/src/views/citation_editable.ts +312 -0
  227. package/src/views/contributors.ts +341 -0
  228. package/src/views/creators.ts +82 -0
  229. package/src/views/cross_reference.ts +74 -0
  230. package/src/views/cross_reference_editable.ts +113 -0
  231. package/src/views/editable_block.ts +141 -0
  232. package/src/views/embed.ts +345 -0
  233. package/src/views/empty.ts +26 -0
  234. package/src/views/equation.ts +47 -0
  235. package/src/views/equation_editable.ts +84 -0
  236. package/src/views/equation_element.ts +29 -0
  237. package/src/views/equation_element_editable.ts +21 -0
  238. package/src/views/figure.ts +84 -0
  239. package/src/views/figure_editable.ts +361 -0
  240. package/src/views/figure_element.ts +197 -0
  241. package/src/views/figure_element_editable.ts +21 -0
  242. package/src/views/footnote.ts +236 -0
  243. package/src/views/footnotes_element.ts +54 -0
  244. package/src/views/general_table_footnote.ts +140 -0
  245. package/src/views/hero_image.ts +76 -0
  246. package/src/views/hero_image_editable.ts +21 -0
  247. package/src/views/image_element.ts +373 -0
  248. package/src/views/image_element_editable.ts +21 -0
  249. package/src/views/inline_equation.ts +47 -0
  250. package/src/views/inline_equation_editable.ts +70 -0
  251. package/src/views/inline_footnote.ts +264 -0
  252. package/src/views/inline_footnote_editable.ts +20 -0
  253. package/src/views/keyword.ts +127 -0
  254. package/src/views/keyword_group.ts +109 -0
  255. package/src/views/link.ts +27 -0
  256. package/src/views/link_editable.ts +169 -0
  257. package/src/views/list.ts +46 -0
  258. package/src/views/list_item.ts +26 -0
  259. package/src/views/paragraph.ts +26 -0
  260. package/src/views/paragraph_editable.ts +21 -0
  261. package/src/views/placeholder.ts +35 -0
  262. package/src/views/placeholder_element.ts +38 -0
  263. package/src/views/placeholder_element_editable.ts +21 -0
  264. package/src/views/pullquote_element.ts +106 -0
  265. package/src/views/pullquote_element_editable.ts +24 -0
  266. package/src/views/quote_image_editable.ts +84 -0
  267. package/src/views/section.ts +64 -0
  268. package/src/views/section_label.ts +20 -0
  269. package/src/views/section_title.ts +87 -0
  270. package/src/views/section_title_editable.ts +21 -0
  271. package/src/views/subtitle.ts +42 -0
  272. package/src/views/subtitle_editable.ts +20 -0
  273. package/src/views/subtitles.ts +34 -0
  274. package/src/views/subtitles_editable.ts +21 -0
  275. package/src/views/supplement.ts +236 -0
  276. package/src/views/supplement_editable.ts +20 -0
  277. package/src/views/supplements.ts +65 -0
  278. package/src/views/supplements_editable.ts +21 -0
  279. package/src/views/table_cell.ts +150 -0
  280. package/src/views/table_element.ts +33 -0
  281. package/src/views/table_element_editable.ts +21 -0
  282. package/src/views/table_element_footer.ts +41 -0
  283. package/src/views/title.ts +46 -0
  284. package/src/views/title_editable.ts +20 -0
  285. package/src/views/trans_graphical_abstract.ts +55 -0
  286. package/src/views/trans_graphical_abstract_editable.ts +21 -0
  287. package/src/views/translated_abstract.ts +53 -0
  288. package/src/views/translated_abstract_editable.ts +21 -0
  289. package/dist/cjs/lib/statistics.js +0 -38
@@ -0,0 +1,82 @@
1
+ /*!
2
+ * © 2019 Atypon Systems LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { ManuscriptNode } from '@manuscripts/transform'
18
+
19
+ import { Dispatch } from '../commands'
20
+ import { EditorProps } from '../configs/ManuscriptsEditor'
21
+ import { NodeViewCreator } from '../types'
22
+ import { BaseNodeView } from './base_node_view'
23
+ import { addTrackChangesAttributes } from '@manuscripts/track-changes-plugin'
24
+
25
+ export const createEditableNodeView =
26
+ <T extends BaseNodeView<ManuscriptNode>>(
27
+ type: new (...args: any[]) => T // eslint-disable-line @typescript-eslint/no-explicit-any
28
+ ) =>
29
+ (props: EditorProps, dispatch?: Dispatch): NodeViewCreator<T> =>
30
+ (node, view, getPos, decorations) => {
31
+ const nodeView = new type(
32
+ { ...props, dispatch },
33
+ node,
34
+ view,
35
+ getPos,
36
+ decorations
37
+ )
38
+
39
+ nodeView.initialise()
40
+
41
+ return nodeView
42
+ }
43
+
44
+ export const createNodeView = createEditableNodeView
45
+
46
+ export const createNodeOrElementView =
47
+ <T extends BaseNodeView<ManuscriptNode>>(
48
+ type: new (...args: any[]) => T, // eslint-disable-line @typescript-eslint/no-explicit-any
49
+ tagName: string,
50
+ callback?: (node: ManuscriptNode, dom: HTMLElement) => void
51
+ ) =>
52
+ (props: EditorProps): NodeViewCreator<T> =>
53
+ (node, view, getPos, decorations) => {
54
+ // TODO: look for parent Section instead?
55
+
56
+ for (const decoration of decorations) {
57
+ if (decoration.spec.element) {
58
+ const nodeView = new type(props, node, view, getPos, decorations)
59
+
60
+ nodeView.initialise()
61
+
62
+ return nodeView
63
+ }
64
+ }
65
+
66
+ const dom = document.createElement(tagName)
67
+
68
+ if (callback) {
69
+ callback(node, dom)
70
+ }
71
+ if (node.attrs.id) {
72
+ dom.id = node.attrs.id
73
+ }
74
+ addTrackChangesAttributes(node.attrs, dom)
75
+
76
+ const nodeView = {
77
+ dom,
78
+ contentDOM: dom,
79
+ }
80
+
81
+ return nodeView as T
82
+ }
@@ -0,0 +1,74 @@
1
+ /*!
2
+ * © 2019 Atypon Systems LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import {
18
+ CrossReferenceNode,
19
+ ManuscriptNodeView,
20
+ Target,
21
+ } from '@manuscripts/transform'
22
+
23
+ import { handleEnterKey } from '../lib/navigation-utils'
24
+ import { objectsKey } from '../plugins/objects'
25
+ import { Trackable } from '../types'
26
+ import { BaseNodeView } from './base_node_view'
27
+ import { createNodeView } from './creators'
28
+
29
+ export class CrossReferenceView
30
+ extends BaseNodeView<Trackable<CrossReferenceNode>>
31
+ implements ManuscriptNodeView
32
+ {
33
+ public handleClick = () => {
34
+ const rids = this.node.attrs.rids
35
+ if (!rids.length) {
36
+ return
37
+ }
38
+ this.props.navigate({
39
+ pathname: this.props.location.pathname,
40
+ hash: '#' + rids[0],
41
+ })
42
+ }
43
+
44
+ public updateContents() {
45
+ super.updateContents()
46
+ const targets = objectsKey.getState(this.view.state) as Map<string, Target>
47
+ const attrs = this.node.attrs
48
+
49
+ const label = attrs.rids.length && targets.get(attrs.rids[0])?.label
50
+ // attrs.label contains custom text inserted at cross-reference creation time
51
+ this.dom.textContent = attrs.label || label || ''
52
+ this.dom.addEventListener('click', this.handleClick)
53
+ }
54
+
55
+ public initialise = () => {
56
+ this.createDOM()
57
+ this.updateContents()
58
+ }
59
+
60
+ public ignoreMutation = () => true
61
+
62
+ public createDOM = () => {
63
+ this.dom = document.createElement('span')
64
+ this.dom.className = 'cross-reference'
65
+ this.dom.tabIndex = 0
66
+
67
+ this.dom.addEventListener(
68
+ 'keydown',
69
+ handleEnterKey(() => this.handleClick())
70
+ )
71
+ }
72
+ }
73
+
74
+ export default createNodeView(CrossReferenceView)
@@ -0,0 +1,113 @@
1
+ /*!
2
+ * © 2019 Atypon Systems LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { skipTracking } from '@manuscripts/track-changes-plugin'
18
+ import { schema, Target } from '@manuscripts/transform'
19
+ import { TextSelection } from 'prosemirror-state'
20
+
21
+ import { CrossReferenceItems } from '../components/views/CrossReferenceItems'
22
+ import { objectsKey } from '../plugins/objects'
23
+ import { createEditableNodeView } from './creators'
24
+ import { CrossReferenceView } from './cross_reference'
25
+ import ReactSubView from './ReactSubView'
26
+
27
+ export class CrossReferenceEditableView extends CrossReferenceView {
28
+ protected popperContainer: HTMLDivElement
29
+
30
+ public selectNode = () => {
31
+ const { getCapabilities } = this.props
32
+
33
+ const rids = this.node.attrs.rids
34
+ const can = getCapabilities()
35
+
36
+ if (!can?.editArticle || rids.length) {
37
+ return
38
+ }
39
+
40
+ const componentProps = {
41
+ handleSelect: this.handleSelect,
42
+ targets: this.getTargets(),
43
+ handleCancel: this.handleCancel,
44
+ currentTargetId: rids[0],
45
+ currentCustomLabel: this.node.attrs.label,
46
+ }
47
+
48
+ this.popperContainer = ReactSubView(
49
+ this.props,
50
+ CrossReferenceItems,
51
+ componentProps,
52
+ this.node,
53
+ this.getPos,
54
+ this.view,
55
+ ['cross-reference-editor']
56
+ )
57
+ this.popperContainer.setAttribute('tabindex', '0')
58
+ this.props.popper.show(this.dom, this.popperContainer, 'auto')
59
+ }
60
+
61
+ public destroy = () => {
62
+ this.props.popper.destroy()
63
+ this.popperContainer?.remove()
64
+ }
65
+
66
+ public deselectNode = () => {
67
+ this.handleCancel()
68
+ }
69
+
70
+ public getTargets = () => {
71
+ const excludedTypes = [schema.nodes.image_element.name]
72
+
73
+ const targets = objectsKey.getState(this.view.state) as Map<string, Target>
74
+
75
+ return Array.from(targets.values()).filter(
76
+ (t) => !excludedTypes.includes(t.type)
77
+ )
78
+ }
79
+
80
+ public handleCancel = () => {
81
+ if (!this.node.attrs.rids.length) {
82
+ const { state } = this.view
83
+
84
+ const pos = this.getPos()
85
+ const tr = state.tr.delete(pos, pos + this.node.nodeSize)
86
+ tr.setSelection(TextSelection.create(tr.doc, pos))
87
+ skipTracking(tr)
88
+ this.view.dispatch(tr)
89
+ } else {
90
+ this.destroy()
91
+ }
92
+ }
93
+
94
+ public handleSelect = async (rid: string, label?: string) => {
95
+ const { state } = this.view
96
+
97
+ const pos = this.getPos()
98
+
99
+ const tr = state.tr.setNodeMarkup(pos, undefined, {
100
+ ...this.node.attrs,
101
+ label,
102
+ rids: [rid],
103
+ })
104
+
105
+ const selection = TextSelection.create(tr.doc, pos)
106
+
107
+ this.view.dispatch(tr.setSelection(selection))
108
+
109
+ this.destroy()
110
+ }
111
+ }
112
+
113
+ export default createEditableNodeView(CrossReferenceEditableView)
@@ -0,0 +1,141 @@
1
+ /*!
2
+ * © 2019 Atypon Systems LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { ManuscriptNode, schema } from '@manuscripts/transform'
18
+
19
+ import { ContextMenu, contextMenuBtnClass } from '../lib/context-menu'
20
+ import { hasParent, isNotNull } from '../lib/utils'
21
+ import BlockView from './block_view'
22
+ import { createKeyboardInteraction } from '../lib/navigation-utils'
23
+
24
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
+ type Constructor<T> = new (...args: any[]) => T
26
+
27
+ export const EditableBlock = <T extends Constructor<BlockView<ManuscriptNode>>>(
28
+ Base: T
29
+ ) => {
30
+ return class extends Base {
31
+ public gutterButtons() {
32
+ const buttons = [this.createAddButton(), this.createEditButton()].filter(
33
+ isNotNull
34
+ )
35
+ // roving tabindex: first existing button is tabbable
36
+ buttons.forEach((btn) => (btn.tabIndex = -1))
37
+ if (buttons.length > 0) {
38
+ buttons[0].tabIndex = 0
39
+ }
40
+
41
+ return buttons
42
+ }
43
+
44
+ public actionGutterButtons() {
45
+ return []
46
+ }
47
+
48
+ public createAddButton() {
49
+ const hasAccess = this.props.getCapabilities()?.editArticle
50
+ if (!hasAccess) {
51
+ return null
52
+ }
53
+
54
+ const $pos = this.view.state.doc.resolve(this.getPos())
55
+ const nodeType = this.node.type
56
+ if (
57
+ nodeType === schema.nodes.hero_image ||
58
+ nodeType === schema.nodes.subtitles ||
59
+ nodeType === schema.nodes.supplements ||
60
+ hasParent($pos, [
61
+ schema.nodes.keywords,
62
+ schema.nodes.bibliography_section,
63
+ schema.nodes.footnotes_section,
64
+ ])
65
+ ) {
66
+ return null
67
+ }
68
+
69
+ const button = document.createElement('a')
70
+ button.classList.add('add-block', contextMenuBtnClass)
71
+ button.classList.add('add-block-after')
72
+ button.setAttribute('role', 'button')
73
+ button.setAttribute('aria-label', `Add an element below`)
74
+ button.setAttribute('data-balloon-pos', 'down-left')
75
+ const handleClick = (event: Event) => {
76
+ event.preventDefault()
77
+
78
+ const menu = this.createMenu()
79
+ menu.showAddMenu(event.currentTarget as Element)
80
+ }
81
+
82
+ button.addEventListener('mousedown', handleClick)
83
+ createKeyboardInteraction({
84
+ container: button,
85
+ additionalKeys: {
86
+ Enter: handleClick,
87
+ ArrowRight: () => {
88
+ const parent = button.parentElement
89
+ const editButton = parent?.querySelector(
90
+ '.edit-block'
91
+ ) as HTMLElement
92
+ if (editButton) {
93
+ editButton.focus()
94
+ }
95
+ },
96
+ },
97
+ })
98
+
99
+ return button
100
+ }
101
+
102
+ public createEditButton(): HTMLElement | null {
103
+ if (!this.props.getCapabilities()?.editArticle) {
104
+ return null
105
+ }
106
+
107
+ const button = document.createElement('a')
108
+ button.classList.add('edit-block', contextMenuBtnClass)
109
+ button.setAttribute('role', 'button')
110
+ button.setAttribute('aria-label', 'Open menu')
111
+ button.setAttribute('data-balloon-pos', 'down-left')
112
+ const handleClick = (event: Event) => {
113
+ event.preventDefault()
114
+
115
+ const menu = this.createMenu()
116
+ menu.showEditMenu(event.currentTarget as Element)
117
+ }
118
+
119
+ button.addEventListener('mousedown', handleClick)
120
+ createKeyboardInteraction({
121
+ container: button,
122
+ additionalKeys: {
123
+ Enter: handleClick,
124
+ ArrowLeft: () => {
125
+ const parent = button.parentElement
126
+ const addButton = parent?.querySelector('.add-block') as HTMLElement
127
+ if (addButton) {
128
+ addButton.focus()
129
+ }
130
+ },
131
+ },
132
+ })
133
+
134
+ return button
135
+ }
136
+
137
+ public createMenu = () => {
138
+ return new ContextMenu(this.node, this.view, this.getPos)
139
+ }
140
+ }
141
+ }