@manuscripts/body-editor 3.12.67 → 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,96 @@
1
+ /*!
2
+ * © 2023 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 { AuthorNotesNode, ManuscriptNode } from '@manuscripts/transform'
18
+
19
+ import { createHeader } from '../lib/utils'
20
+ import { Trackable } from '../types'
21
+ import BlockView from './block_view'
22
+ import { createNodeView } from './creators'
23
+
24
+ export class AuthorNotesView extends BlockView<Trackable<AuthorNotesNode>> {
25
+ container: HTMLElement
26
+ allowedTypes = ['corresp', 'footnote', 'paragraph']
27
+ correspondenceHeader = 'Correspondence'
28
+ genericHeader = 'Author notes'
29
+ genericHeaderIsDisplayed: boolean
30
+
31
+ public ignoreMutation = () => true
32
+ public stopEvent = () => true
33
+
34
+ public createElement = () => {
35
+ this.container = document.createElement('div')
36
+ this.container.classList.add('block', 'author-notes-container')
37
+ this.dom.appendChild(this.container)
38
+ }
39
+
40
+ public updateContents() {
41
+ super.updateContents()
42
+ this.genericHeaderIsDisplayed = false
43
+ this.dom.setAttribute('contenteditable', 'false')
44
+ this.container.innerHTML = ''
45
+
46
+ const items: { [key: string]: ManuscriptNode[] } = {}
47
+ this.allowedTypes.forEach((type) => (items[type] = []))
48
+
49
+ // Fill items with nodes of allowed types
50
+ this.node.descendants((node) => {
51
+ if (this.allowedTypes.includes(node.type.name)) {
52
+ items[node.type.name].push(node)
53
+ return false
54
+ }
55
+ })
56
+
57
+ this.allowedTypes.forEach((typeName) => {
58
+ if (items[typeName] && items[typeName].length) {
59
+ const content = this.createContent(typeName, items[typeName])
60
+ if (content) {
61
+ this.container.appendChild(content)
62
+ }
63
+ }
64
+ })
65
+ }
66
+
67
+ public createContent = (typeName: string, nodes: ManuscriptNode[]) => {
68
+ let isNotEmpty = false
69
+ if (nodes.length) {
70
+ const container = document.createElement('div')
71
+ container.classList.add(`${typeName}s-container`)
72
+ // Show title 'Correspondence' for corresp items
73
+ // or 'Author notes' for other items, but only once
74
+ if (typeName === this.allowedTypes[0]) {
75
+ container.append(createHeader(typeName, this.correspondenceHeader))
76
+ } else if (!this.genericHeaderIsDisplayed) {
77
+ this.genericHeaderIsDisplayed = true
78
+ container.append(createHeader(typeName, this.genericHeader))
79
+ }
80
+
81
+ nodes.forEach((node) => {
82
+ if (node.textContent) {
83
+ isNotEmpty = true
84
+ const div = document.createElement('div')
85
+ div.classList.add(typeName)
86
+ div.textContent = node.textContent
87
+ container.append(div)
88
+ }
89
+ })
90
+ return isNotEmpty ? container : null
91
+ }
92
+ return null
93
+ }
94
+ }
95
+
96
+ export default createNodeView(AuthorNotesView)
@@ -0,0 +1,194 @@
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 { AwardNode, schema } from '@manuscripts/transform'
19
+
20
+ import { AwardModal, AwardModalProps } from '../components/awards/AwardModal'
21
+ import {
22
+ DeleteAwardDialog,
23
+ DeleteAwardDialogProps,
24
+ } from '../components/awards/DeleteAwardDiaolog'
25
+ import { updateNodeAttrs } from '../lib/view'
26
+ import { Trackable, TrackableAttributes } from '../types'
27
+ import BlockView from './block_view'
28
+ import { createNodeView } from './creators'
29
+ import ReactSubView from './ReactSubView'
30
+ import { isDeleted } from '@manuscripts/track-changes-plugin'
31
+
32
+ export type AwardAttrs = TrackableAttributes<AwardNode>
33
+ export class AwardView extends BlockView<Trackable<AwardNode>> {
34
+ protected popperContainer: HTMLDivElement
35
+ private dialog: HTMLElement
36
+ contextMenu: HTMLElement
37
+
38
+ public ignoreMutation = () => true
39
+ public stopEvent = () => true
40
+
41
+ public updateContents() {
42
+ super.updateContents()
43
+ if (!this.contentDOM) {
44
+ return
45
+ }
46
+ const { recipient, code, source } = this.node.attrs
47
+ if (!source) {
48
+ return
49
+ }
50
+
51
+ this.contentDOM.innerHTML = ''
52
+ const notAvailable = 'N/A'
53
+ const fragment = document.createDocumentFragment()
54
+
55
+ fragment.appendChild(this.createAwardFragment('award-source', '', source))
56
+
57
+ fragment.appendChild(
58
+ this.createAwardFragment(
59
+ 'award-code',
60
+ 'Grant Number(s): ',
61
+ code ? code.split(';').join(', ') : notAvailable
62
+ )
63
+ )
64
+
65
+ fragment.appendChild(
66
+ this.createAwardFragment(
67
+ 'award-recipient',
68
+ 'Recipient: ',
69
+ recipient ? recipient : notAvailable
70
+ )
71
+ )
72
+ this.contentDOM.appendChild(fragment)
73
+ this.updateClasses()
74
+ }
75
+
76
+ private createAwardFragment = (
77
+ className: string,
78
+ title: string,
79
+ content: string
80
+ ): HTMLDivElement => {
81
+ const awardFragment = document.createElement('div')
82
+ awardFragment.classList.add(className)
83
+ if (title) {
84
+ const titleElement = document.createElement('span')
85
+ titleElement.classList.add('title')
86
+ titleElement.textContent = title
87
+ awardFragment.appendChild(titleElement)
88
+ }
89
+ if (content) {
90
+ const contentElement = document.createElement('span')
91
+ contentElement.classList.add('content')
92
+ contentElement.textContent = content
93
+ awardFragment.appendChild(contentElement)
94
+ }
95
+ return awardFragment
96
+ }
97
+
98
+ public awardContextMenu = (): HTMLElement | undefined => {
99
+ const can = this.props.getCapabilities()
100
+ if (!can.editArticle || isDeleted(this.node)) {
101
+ return undefined
102
+ }
103
+ const componentProps: ContextMenuProps = {
104
+ actions: [
105
+ {
106
+ label: 'Edit Funder Info',
107
+ action: () => {
108
+ this.props.popper.destroy()
109
+ this.showAwardModal(this.node)
110
+ },
111
+ icon: 'Edit',
112
+ },
113
+ {
114
+ label: 'Delete Funder Info',
115
+ action: () => {
116
+ this.props.popper.destroy()
117
+ this.showDeleteAwardDialog()
118
+ },
119
+ icon: 'Delete',
120
+ },
121
+ ],
122
+ }
123
+ this.contextMenu = ReactSubView(
124
+ this.props,
125
+ ContextMenu,
126
+ componentProps,
127
+ this.node,
128
+ this.getPos,
129
+ this.view,
130
+ ['context-menu']
131
+ )
132
+ return this.contextMenu
133
+ }
134
+
135
+ public actionGutterButtons = (): HTMLElement[] => {
136
+ const contextMenu = this.awardContextMenu()
137
+ return contextMenu ? [contextMenu] : []
138
+ }
139
+
140
+ showAwardModal = (award: AwardNode) => {
141
+ this.dialog?.remove()
142
+ this.popperContainer?.remove()
143
+
144
+ const componentProps: AwardModalProps = {
145
+ initialData: award?.attrs || ({} as AwardAttrs),
146
+ onSaveAward: this.handleSaveAward,
147
+ }
148
+ this.popperContainer = ReactSubView(
149
+ this.props,
150
+ AwardModal,
151
+ componentProps,
152
+ this.node,
153
+ this.getPos,
154
+ this.view,
155
+ ['award-editor']
156
+ )
157
+ this.props.popper.show(this.dom, this.popperContainer, 'auto', false)
158
+ }
159
+
160
+ showDeleteAwardDialog = () => {
161
+ this.dialog?.remove()
162
+ const componentProps: DeleteAwardDialogProps = {
163
+ handleDelete: this.handleDeleteAward,
164
+ }
165
+
166
+ this.popperContainer = ReactSubView(
167
+ this.props,
168
+ DeleteAwardDialog,
169
+ componentProps,
170
+ this.node,
171
+ this.getPos,
172
+ this.view,
173
+ ['award-editor']
174
+ )
175
+ this.props.popper.show(this.dom, this.popperContainer, 'auto', false)
176
+ }
177
+
178
+ handleSaveAward = (award: AwardAttrs) => {
179
+ updateNodeAttrs(this.view, schema.nodes.award, award)
180
+ }
181
+
182
+ handleDeleteAward = () => {
183
+ const award = this.node
184
+ const pos = this.getPos()
185
+ if (award) {
186
+ const tr = this.view.state.tr
187
+ const from = pos
188
+ const to = pos + award.nodeSize
189
+ this.view.dispatch(tr.delete(from, to))
190
+ }
191
+ }
192
+ }
193
+
194
+ export default createNodeView(AwardView)
@@ -0,0 +1,59 @@
1
+ /*!
2
+ * © 2024 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 { AwardsNode } from '@manuscripts/transform'
18
+
19
+ import { createHeader } from '../lib/utils'
20
+ import { BaseNodeView } from './base_node_view'
21
+ import { createNodeView } from './creators'
22
+
23
+ export class AwardsView extends BaseNodeView<AwardsNode> {
24
+ public elementType = 'div'
25
+ container: HTMLElement
26
+
27
+ public initialise() {
28
+ this.createDOM()
29
+ this.createElement()
30
+ this.updateContents()
31
+ }
32
+
33
+ public createDOM() {
34
+ this.dom = document.createElement(this.elementType)
35
+ this.dom.classList.add(`block-${this.node.type.name}`)
36
+ }
37
+
38
+ public createElement = () => {
39
+ this.contentDOM = document.createElement(this.elementType)
40
+ this.contentDOM.className = 'block'
41
+ }
42
+
43
+ public updateContents() {
44
+ super.updateContents()
45
+ if (!this.contentDOM) {
46
+ return
47
+ }
48
+ this.dom.innerHTML = ''
49
+ this.dom.setAttribute('contenteditable', 'false')
50
+ this.contentDOM.setAttribute('contenteditable', 'false')
51
+
52
+ if (this.node.content.size !== 0) {
53
+ const header = createHeader(this.node.type.name, 'Funder Information')
54
+ this.dom.append(header, this.contentDOM)
55
+ }
56
+ }
57
+ }
58
+
59
+ export default createNodeView(AwardsView)
@@ -0,0 +1,85 @@
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 { ManuscriptEditorView, ManuscriptNode } from '@manuscripts/transform'
18
+ import { NodeView } from 'prosemirror-view'
19
+
20
+ import { EditorProps } from '../configs/ManuscriptsEditor'
21
+ import {
22
+ addTrackChangesAttributes,
23
+ addTrackChangesClassNames,
24
+ } from '@manuscripts/track-changes-plugin'
25
+
26
+ export class BaseNodeView<Node extends ManuscriptNode> implements NodeView {
27
+ public dom: HTMLElement
28
+ public contentDOM?: HTMLElement
29
+ public elementType = 'div'
30
+
31
+ public constructor(
32
+ public readonly props: EditorProps,
33
+ public node: Node,
34
+ public readonly view: ManuscriptEditorView,
35
+ public readonly getPos: () => number
36
+ ) {}
37
+
38
+ public update(newNode: ManuscriptNode) {
39
+ // if (!newNode.sameMarkup(this.node)) return false
40
+ if (newNode.attrs.id !== this.node.attrs.id) {
41
+ return false
42
+ }
43
+ if (newNode.type.name !== this.node.type.name) {
44
+ return false
45
+ }
46
+ this.node = newNode as Node
47
+ this.updateContents()
48
+ this.props.popper.update()
49
+ return true
50
+ }
51
+
52
+ public initialise() {
53
+ // extend this
54
+ }
55
+
56
+ public updateContents() {
57
+ //this should be in initialize
58
+ if (this.node.attrs.id) {
59
+ this.dom.id = this.node.attrs.id
60
+ }
61
+ if (this.contentDOM) {
62
+ this.contentDOM.removeAttribute('id')
63
+ }
64
+ this.handleTrackChanges()
65
+ // extend this
66
+ }
67
+
68
+ public handleTrackChanges() {
69
+ addTrackChangesAttributes(this.node.attrs, this.dom)
70
+ addTrackChangesClassNames(this.node.attrs, this.dom)
71
+ }
72
+
73
+ public selectNode() {
74
+ this.dom.classList.add('ProseMirror-selectednode')
75
+ }
76
+
77
+ public deselectNode() {
78
+ this.dom.classList.remove('ProseMirror-selectednode')
79
+ this.props.popper.destroy()
80
+ }
81
+
82
+ public destroy() {
83
+ this.props.popper.destroy()
84
+ }
85
+ }