@manuscripts/body-editor 3.12.66 → 3.13.0

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,264 @@
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 { ContextMenu, ContextMenuProps } from '@manuscripts/style-guide'
18
+ import {
19
+ FootnoteNode,
20
+ InlineFootnoteNode,
21
+ ManuscriptNodeView,
22
+ } from '@manuscripts/transform'
23
+ import { NodeSelection, TextSelection } from 'prosemirror-state'
24
+
25
+ import { insertFootnotesElement } from '../commands'
26
+ import {
27
+ FootnotesSelector,
28
+ FootnotesSelectorProps,
29
+ } from '../components/views/FootnotesSelector'
30
+ import { handleEnterKey } from '../lib/navigation-utils'
31
+ import {
32
+ createFootnote,
33
+ findFootnotesContainerNode,
34
+ getFootnotesElementState,
35
+ } from '../lib/footnotes'
36
+ import { Trackable } from '../types'
37
+ import { BaseNodeView } from './base_node_view'
38
+ import { createNodeView } from './creators'
39
+ import ReactSubView from './ReactSubView'
40
+ import { isDeleted, isPendingInsert } from '@manuscripts/track-changes-plugin'
41
+
42
+ export class InlineFootnoteView
43
+ extends BaseNodeView<Trackable<InlineFootnoteNode>>
44
+ implements ManuscriptNodeView
45
+ {
46
+ protected popperContainer: HTMLDivElement
47
+
48
+ showContextMenu = () => {
49
+ this.props.popper.destroy()
50
+ const can = this.props.getCapabilities()
51
+ const showEditIcon = can?.editArticle
52
+
53
+ const componentProps: ContextMenuProps = {
54
+ actions: [
55
+ ...(showEditIcon
56
+ ? [
57
+ {
58
+ label: 'Edit',
59
+ action: () => {
60
+ this.props.popper.destroy()
61
+ this.showFootnotesSelector()
62
+ },
63
+ icon: 'Edit',
64
+ },
65
+ ]
66
+ : []),
67
+ {
68
+ label: 'Go to footnote',
69
+ action: () => {
70
+ this.props.popper.destroy()
71
+ this.scrollToReferencedFootnote()
72
+ },
73
+ icon: 'Scroll',
74
+ },
75
+ ],
76
+ }
77
+ this.props.popper.show(
78
+ this.dom,
79
+ ReactSubView(
80
+ this.props,
81
+ ContextMenu,
82
+ componentProps,
83
+ this.node,
84
+ this.getPos,
85
+ this.view,
86
+ ['context-menu']
87
+ ),
88
+ 'right-start',
89
+ false
90
+ )
91
+ }
92
+
93
+ handleClick = () => {
94
+ if (isDeleted(this.node)) {
95
+ return
96
+ }
97
+ this.showContextMenu()
98
+ }
99
+
100
+ scrollToReferencedFootnote = () => {
101
+ const state = this.view.state
102
+ const fn = getFootnotesElementState(state, this.node.attrs.id)
103
+
104
+ if (!fn) {
105
+ return
106
+ }
107
+
108
+ let nodePos: number | undefined = undefined
109
+
110
+ for (const [node, pos] of fn.footnotes) {
111
+ if (node.attrs.id === this.node.attrs.rids[0]) {
112
+ nodePos = pos
113
+ }
114
+ }
115
+
116
+ if (nodePos && this.props.dispatch) {
117
+ const selection = NodeSelection.create(this.view.state.doc, nodePos + 1)
118
+
119
+ this.props.dispatch(
120
+ this.view.state.tr.setSelection(selection).scrollIntoView()
121
+ )
122
+ }
123
+ }
124
+
125
+ showFootnotesSelector = () => {
126
+ if (!this.props.getCapabilities().editArticle) {
127
+ return
128
+ }
129
+
130
+ const state = this.view.state
131
+ const pos = this.getPos()
132
+ const container = findFootnotesContainerNode(state.doc, pos)
133
+ const fn = getFootnotesElementState(state, container.node.attrs.id)
134
+
135
+ const footnotes = fn ? fn.footnotes.map((n) => n[0]) : []
136
+ const labels = fn ? fn.labels : new Map<string, string>()
137
+
138
+ const props: FootnotesSelectorProps = {
139
+ footnotes,
140
+ inlineFootnote: this.node,
141
+ labels,
142
+ onCancel: this.handleCancel,
143
+ onAdd: this.handleAdd,
144
+ onInsert: this.handleInsert,
145
+ }
146
+
147
+ this.popperContainer = ReactSubView(
148
+ this.props,
149
+ FootnotesSelector,
150
+ props,
151
+ this.node,
152
+ this.getPos,
153
+ this.view,
154
+ ['footnote-editor']
155
+ )
156
+ this.popperContainer.setAttribute('tabindex', '0')
157
+ this.props.popper.show(this.dom, this.popperContainer, 'auto', false)
158
+ }
159
+
160
+ public updateContents() {
161
+ super.updateContents()
162
+ const state = this.view.state
163
+ const fn = getFootnotesElementState(state, this.node.attrs.id)
164
+ if (!fn) {
165
+ this.dom.innerText = '?'
166
+ return
167
+ }
168
+
169
+ this.dom.innerText = fn.labels.get(this.node.attrs.id) || '?'
170
+ }
171
+
172
+ public initialise = () => {
173
+ this.dom = this.createDOM()
174
+ this.dom.classList.add('footnote-marker')
175
+ this.dom.tabIndex = 0
176
+ this.dom.addEventListener('click', this.handleClick)
177
+ this.dom.addEventListener(
178
+ 'keydown',
179
+ handleEnterKey(() => this.handleClick())
180
+ )
181
+ this.updateContents()
182
+ }
183
+
184
+ selectNode = () => {
185
+ this.dom.classList.add('footnote-marker-selected')
186
+ if (!this.node.attrs.rids.length) {
187
+ this.showFootnotesSelector()
188
+ }
189
+ }
190
+
191
+ public deselectNode() {
192
+ this.dom.classList.remove('footnote-marker-selected')
193
+ }
194
+
195
+ public ignoreMutation = () => true
196
+
197
+ public createDOM = () => {
198
+ return document.createElement('span')
199
+ }
200
+
201
+ public destroy = () => {
202
+ this.props.popper.destroy()
203
+ this.popperContainer?.remove()
204
+ }
205
+
206
+ handleCancel = () => {
207
+ const tr = this.view.state.tr
208
+ const rids = this.node.attrs.rids
209
+ if (!rids.length) {
210
+ const pos = this.getPos()
211
+ tr.delete(pos, pos + this.node.nodeSize)
212
+ this.view.dispatch(tr)
213
+ }
214
+ this.destroy()
215
+ }
216
+
217
+ handleAdd = () => {
218
+ const state = this.view.state
219
+ const pos = this.getPos()
220
+ const container = findFootnotesContainerNode(state.doc, pos)
221
+ const fn = getFootnotesElementState(state, container.node.attrs.id)
222
+ const tr = this.view.state.tr
223
+ const footnote = createFootnote()
224
+ const rids = this.node.attrs.rids
225
+ tr.setNodeAttribute(pos, 'rids', [...rids, footnote.attrs.id])
226
+ let fnPos: number
227
+ if (fn) {
228
+ fnPos = fn.element[1] + fn.element[0].nodeSize - 1
229
+ } else {
230
+ const [elementNode, elementPos] = insertFootnotesElement(tr, [
231
+ container.node,
232
+ container.pos,
233
+ ])
234
+ fnPos = elementPos + elementNode.nodeSize - 1
235
+ }
236
+ tr.insert(fnPos, footnote)
237
+ const selection = TextSelection.create(tr.doc, fnPos + 2)
238
+ tr.setSelection(selection).scrollIntoView()
239
+ this.view.dispatch(tr)
240
+ this.view.focus()
241
+ this.destroy()
242
+ }
243
+
244
+ handleInsert = (footnotes: FootnoteNode[]) => {
245
+ const pos = this.getPos()
246
+ const tr = this.view.state.tr
247
+
248
+ if (footnotes.length) {
249
+ const rids = footnotes.map((note) => note.attrs.id)
250
+ if (rids.length) {
251
+ tr.setNodeAttribute(pos, 'rids', rids)
252
+ } else if (isPendingInsert(this.node)) {
253
+ tr.delete(pos, pos + this.node.nodeSize)
254
+ }
255
+ } else {
256
+ tr.delete(pos, pos + this.node.nodeSize)
257
+ }
258
+ this.view.dispatch(tr)
259
+
260
+ this.destroy()
261
+ }
262
+ }
263
+
264
+ export default createNodeView(InlineFootnoteView)
@@ -0,0 +1,20 @@
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 { createEditableNodeView } from './creators'
18
+ import { InlineFootnoteView } from './inline_footnote'
19
+
20
+ export default createEditableNodeView(InlineFootnoteView)
@@ -0,0 +1,127 @@
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 { KeywordNode, ManuscriptNodeView } from '@manuscripts/transform'
18
+ import { TextSelection } from 'prosemirror-state'
19
+
20
+ import {
21
+ DeleteKeywordDialog,
22
+ DeleteKeywordDialogProps,
23
+ } from '../components/keywords/DeleteKeywordDialog'
24
+ import { handleEnterKey } from '../lib/navigation-utils'
25
+ import { Trackable } from '../types'
26
+ import { BaseNodeView } from './base_node_view'
27
+ import { createNodeView } from './creators'
28
+ import ReactSubView from './ReactSubView'
29
+ import { isDeleted } from '@manuscripts/track-changes-plugin'
30
+
31
+ //todo fix
32
+ const deleteIcon =
33
+ '<svg width="8px" height="8px" viewBox="0 0 26 26" xmlns="http://www.w3.org/2000/svg">\n' +
34
+ ' <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">\n' +
35
+ ' <g fill="#6E6E6E">\n' +
36
+ ' <rect id="Rectangle-23-Copy" transform="translate(13.000000, 13.000000) rotate(-45.000000) translate(-13.000000, -13.000000) " x="-3" y="11" width="32" height="4" rx="2"></rect>\n' +
37
+ ' <rect id="Rectangle-23-Copy-2" transform="translate(13.000000, 13.000000) scale(1, -1) rotate(-45.000000) translate(-13.000000, -13.000000) " x="-3" y="11" width="32" height="4" rx="2"></rect>\n' +
38
+ ' </g>\n' +
39
+ ' </g>\n' +
40
+ '</svg>'
41
+
42
+ export class KeywordView
43
+ extends BaseNodeView<Trackable<KeywordNode>>
44
+ implements ManuscriptNodeView
45
+ {
46
+ private dialog: HTMLElement
47
+
48
+ private isFirstKeyword(): boolean {
49
+ const pos = this.getPos()
50
+ const parent = this.view.state.doc.resolve(pos).parent
51
+ for (let i = 0; i < parent.childCount; i++) {
52
+ const child = parent.child(i)
53
+ if (!isDeleted(child)) {
54
+ return child === this.node
55
+ }
56
+ }
57
+ return false
58
+ }
59
+ public initialise = () => {
60
+ this.createDOM()
61
+ this.updateContents()
62
+ }
63
+
64
+ public createDOM = () => {
65
+ this.dom = document.createElement('span')
66
+ this.dom.classList.add('keyword')
67
+ this.dom.tabIndex = this.isFirstKeyword() ? 0 : -1
68
+ this.dom.addEventListener(
69
+ 'keydown',
70
+ handleEnterKey(() => this.showConfirmationDialog())
71
+ )
72
+ this.contentDOM = document.createElement('span')
73
+ }
74
+
75
+ public updateContents() {
76
+ super.updateContents()
77
+ this.dom.innerHTML = ''
78
+ this.dom.appendChild(this.contentDOM as HTMLElement)
79
+
80
+ const can = this.props.getCapabilities()
81
+
82
+ if (can.editArticle) {
83
+ const svg = new DOMParser()
84
+ .parseFromString(deleteIcon, 'image/svg+xml')
85
+ .querySelector('svg') as SVGElement
86
+ svg.classList.add('delete-keyword')
87
+ svg.addEventListener('click', this.showConfirmationDialog)
88
+ this.dom.appendChild(svg)
89
+ }
90
+ }
91
+
92
+ private showConfirmationDialog = () => {
93
+ this.dialog?.remove()
94
+
95
+ const keyword = this.node
96
+ const pos = this.getPos()
97
+
98
+ const handleDelete = () => {
99
+ const tr = this.view.state.tr
100
+ tr.setSelection(
101
+ TextSelection.near(this.view.state.doc.resolve(0))
102
+ ).delete(pos, pos + keyword.nodeSize + 1)
103
+ this.view.dispatch(tr)
104
+ }
105
+
106
+ const componentProps: DeleteKeywordDialogProps = {
107
+ keyword: keyword.textContent,
108
+ handleDelete: handleDelete,
109
+ }
110
+
111
+ this.dialog = ReactSubView(
112
+ this.props,
113
+ DeleteKeywordDialog,
114
+ componentProps,
115
+ this.node,
116
+ this.getPos,
117
+ this.view,
118
+ ['keywords-delete']
119
+ )
120
+
121
+ if (this.dialog) {
122
+ this.dom.appendChild(this.dialog)
123
+ }
124
+ }
125
+ }
126
+
127
+ export default createNodeView(KeywordView)
@@ -0,0 +1,109 @@
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 { KeywordGroupNode } from '@manuscripts/transform'
18
+
19
+ import { AddKeywordInline } from '../components/keywords/AddKeywordInline'
20
+ import { createKeyboardInteraction } from '../lib/navigation-utils'
21
+ import BlockView from './block_view'
22
+ import { createNodeView } from './creators'
23
+ import ReactSubView from './ReactSubView'
24
+ import { isDeleted } from '@manuscripts/track-changes-plugin'
25
+
26
+ export class KeywordGroupView extends BlockView<KeywordGroupNode> {
27
+ private element: HTMLElement
28
+ private addingTools: HTMLDivElement
29
+ private removeKeydownListener?: () => void
30
+
31
+ public ignoreMutation = () => true
32
+
33
+ public createElement = () => {
34
+ this.element = document.createElement('div')
35
+ this.element.classList.add('block', 'keyword-group-container')
36
+ this.dom.appendChild(this.element)
37
+
38
+ this.contentDOM = document.createElement('div')
39
+ this.contentDOM.classList.add('keyword-group')
40
+ this.contentDOM.setAttribute('id', this.node.attrs.id)
41
+ this.contentDOM.setAttribute('contenteditable', 'false')
42
+
43
+ this.element.appendChild(this.contentDOM)
44
+
45
+ this.removeKeydownListener = createKeyboardInteraction({
46
+ container: this.element,
47
+ navigation: {
48
+ getItems: () =>
49
+ Array.from(
50
+ this.element.querySelectorAll<HTMLElement>(
51
+ '.keyword:not(.deleted), .keyword-add'
52
+ )
53
+ ),
54
+ arrowKeys: { forward: 'ArrowRight', backward: 'ArrowLeft' },
55
+ },
56
+ })
57
+
58
+ if (this.props.getCapabilities().editArticle) {
59
+ this.addingTools = ReactSubView(
60
+ this.props,
61
+ AddKeywordInline,
62
+ { getUpdatedNode: () => this.node },
63
+ this.node,
64
+ this.getPos,
65
+ this.view,
66
+ ['keywords-editor']
67
+ )
68
+ }
69
+
70
+ if (this.addingTools) {
71
+ this.element.appendChild(this.addingTools)
72
+ }
73
+ }
74
+
75
+ public updateContents() {
76
+ super.updateContents()
77
+ this.setKeywordsTabIndices()
78
+ }
79
+
80
+ private setKeywordsTabIndices() {
81
+ const container = this.contentDOM
82
+ if (!container) {
83
+ return
84
+ }
85
+ let firstFocusableFound = false
86
+ for (let i = 0; i < this.node.childCount; i++) {
87
+ const child = this.node.child(i)
88
+ const keyword = container.querySelector<HTMLElement>(
89
+ `.keyword[id="${child.attrs.id}"]`
90
+ ) as HTMLElement | undefined
91
+ if (!keyword) {
92
+ continue
93
+ }
94
+ if (!isDeleted(child) && !firstFocusableFound) {
95
+ keyword.tabIndex = 0
96
+ firstFocusableFound = true
97
+ } else {
98
+ keyword.tabIndex = -1
99
+ }
100
+ }
101
+ }
102
+
103
+ public destroy() {
104
+ this.removeKeydownListener?.()
105
+ super.destroy()
106
+ }
107
+ }
108
+
109
+ export default createNodeView(KeywordGroupView)
@@ -0,0 +1,27 @@
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 { LinkNode, ManuscriptNodeView } from '@manuscripts/transform'
18
+
19
+ import { Trackable } from '../types'
20
+ import { BaseNodeView } from './base_node_view'
21
+ import { createNodeView } from './creators'
22
+
23
+ export class LinkView
24
+ extends BaseNodeView<Trackable<LinkNode>>
25
+ implements ManuscriptNodeView {}
26
+
27
+ export default createNodeView(LinkView)