@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,169 @@
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 { schema } from '@manuscripts/transform'
18
+ import { TextSelection } from 'prosemirror-state'
19
+
20
+ import {
21
+ LinkForm,
22
+ LinkFormProps,
23
+ LinkValue,
24
+ } from '../components/views/LinkForm'
25
+ import { allowedHref } from '../lib/url'
26
+ import { createEditableNodeView } from './creators'
27
+ import { LinkView } from './link'
28
+ import ReactSubView from './ReactSubView'
29
+ import { isDeleted } from '@manuscripts/track-changes-plugin'
30
+
31
+ export class LinkEditableView extends LinkView {
32
+ protected popperContainer: HTMLDivElement
33
+
34
+ public ignoreMutation = () => true
35
+
36
+ public initialise = () => {
37
+ this.createDOM()
38
+ this.updateContents()
39
+ }
40
+
41
+ public updateContents() {
42
+ super.updateContents()
43
+ this.contentDOM = this.dom
44
+
45
+ const attrs = this.node.attrs
46
+ const href = attrs.href
47
+ const title = attrs.title
48
+ // This to prevent joining other inline nodes to link LEAN-4374
49
+ this.dom.setAttribute('contenteditable', 'false')
50
+ this.dom.setAttribute('href', allowedHref(href) ? href : '')
51
+ this.dom.setAttribute('target', '_blank')
52
+ this.dom.setAttribute('title', title || '')
53
+ }
54
+
55
+ protected createDOM = () => {
56
+ this.dom = document.createElement('a')
57
+ this.dom.classList.add('link')
58
+ this.dom.addEventListener('click', this.handleClick)
59
+ }
60
+
61
+ public selectNode = () => {
62
+ if (!isDeleted(this.node)) {
63
+ this.showForm()
64
+ }
65
+ }
66
+
67
+ public destroy = () => {
68
+ this.closeForm()
69
+ }
70
+
71
+ public deselectNode = () => {
72
+ this.closeForm()
73
+ }
74
+
75
+ private showForm = () => {
76
+ if (!this.props.getCapabilities().editArticle) {
77
+ return
78
+ }
79
+
80
+ const attrs = this.node.attrs
81
+
82
+ const value: LinkValue = {
83
+ href: attrs.href,
84
+ title: attrs.title,
85
+ text: this.node.textContent,
86
+ }
87
+
88
+ const componentProps: LinkFormProps = {
89
+ value,
90
+ onCancel: this.handleCancel,
91
+ onRemove: this.handleRemove,
92
+ onSave: this.handleSave,
93
+ }
94
+
95
+ this.popperContainer = ReactSubView(
96
+ this.props,
97
+ LinkForm,
98
+ componentProps,
99
+ this.node,
100
+ this.getPos,
101
+ this.view,
102
+ ['link-editor']
103
+ )
104
+
105
+ this.props.popper.show(this.dom, this.popperContainer, 'bottom')
106
+ }
107
+
108
+ private handleClick = (e: Event) => {
109
+ if (this.props.getCapabilities().editArticle) {
110
+ e.preventDefault()
111
+ }
112
+ }
113
+
114
+ private handleCancel = () => {
115
+ const attrs = this.node.attrs
116
+ if (!this.node.content.size || !attrs.href) {
117
+ this.removeLink()
118
+ }
119
+ this.closeForm()
120
+ }
121
+
122
+ private handleRemove = () => {
123
+ this.removeLink()
124
+ this.closeForm()
125
+ }
126
+
127
+ private handleSave = (value: LinkValue) => {
128
+ const tr = this.view.state.tr
129
+
130
+ const attrs = this.node.attrs
131
+ const pos = this.getPos()
132
+
133
+ if (value.href !== attrs.href || value.title !== attrs.title) {
134
+ tr.setNodeMarkup(pos, undefined, {
135
+ ...this.node.attrs,
136
+ href: value.href,
137
+ title: value.title,
138
+ })
139
+ }
140
+ if (value.text !== this.node.textContent) {
141
+ tr.delete(pos + 1, pos + this.node.nodeSize - 1)
142
+ tr.insert(pos + 1, schema.text(value.text))
143
+ }
144
+
145
+ tr.setSelection(TextSelection.create(tr.doc, pos))
146
+ this.view.focus()
147
+ this.view.dispatch(tr)
148
+ this.closeForm()
149
+ }
150
+
151
+ private removeLink = () => {
152
+ const tr = this.view.state.tr
153
+ const pos = this.getPos()
154
+ tr.delete(pos, pos + this.node.nodeSize)
155
+ const text = this.node.textContent
156
+ if (text) {
157
+ tr.insert(pos, schema.text(text))
158
+ }
159
+ tr.setSelection(TextSelection.create(tr.doc, pos))
160
+ this.view.dispatch(tr)
161
+ }
162
+
163
+ private closeForm = () => {
164
+ this.props.popper.destroy()
165
+ this.popperContainer?.remove()
166
+ }
167
+ }
168
+
169
+ export default createEditableNodeView(LinkEditableView)
@@ -0,0 +1,46 @@
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 { ListNode, ManuscriptNode } from '@manuscripts/transform'
18
+
19
+ import { writeCssListStyleType } from '../lib/lists'
20
+ import { Trackable } from '../types'
21
+ import BlockView from './block_view'
22
+ import { createNodeOrElementView } from './creators'
23
+ import { EditableBlock } from './editable_block'
24
+
25
+ export class ListView extends BlockView<Trackable<ListNode>> {
26
+ public elementType = 'ul'
27
+
28
+ public updateContents() {
29
+ super.updateContents()
30
+ if (this.contentDOM) {
31
+ const type = this.node.attrs.listStyleType
32
+ this.contentDOM.style.listStyleType = writeCssListStyleType(type)
33
+ }
34
+ }
35
+ }
36
+
37
+ export const listCallback = (node: ManuscriptNode, dom: HTMLElement) => {
38
+ dom.classList.add('list')
39
+ const type = node.attrs.listStyleType
40
+ dom.style.listStyleType = writeCssListStyleType(type)
41
+ }
42
+ export default createNodeOrElementView(
43
+ EditableBlock(ListView),
44
+ 'ul',
45
+ listCallback
46
+ )
@@ -0,0 +1,26 @@
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 { ListItemNode } from '@manuscripts/transform'
18
+
19
+ import BlockView from './block_view'
20
+ import { createNodeOrElementView } from './creators'
21
+
22
+ export class ListItemView extends BlockView<ListItemNode> {
23
+ public elementType = 'li'
24
+ }
25
+
26
+ export default createNodeOrElementView(ListItemView, 'li')
@@ -0,0 +1,26 @@
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 { ParagraphNode } from '@manuscripts/transform'
18
+
19
+ import BlockView from './block_view'
20
+ import { createNodeOrElementView } from './creators'
21
+
22
+ export class ParagraphView extends BlockView<ParagraphNode> {
23
+ public elementType = 'p'
24
+ }
25
+
26
+ export default createNodeOrElementView(ParagraphView, 'p')
@@ -0,0 +1,21 @@
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 { createNodeOrElementView } from './creators'
18
+ import { EditableBlock } from './editable_block'
19
+ import { ParagraphView } from './paragraph'
20
+
21
+ export default createNodeOrElementView(EditableBlock(ParagraphView), 'p')
@@ -0,0 +1,35 @@
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 { ManuscriptNodeView, PlaceholderNode } from '@manuscripts/transform'
18
+
19
+ import { createPlaceholderContent } from '../lib/placeholder'
20
+ import { BaseNodeView } from './base_node_view'
21
+ import { createNodeView } from './creators'
22
+
23
+ export class PlaceholderView
24
+ extends BaseNodeView<PlaceholderNode>
25
+ implements ManuscriptNodeView
26
+ {
27
+ public ignoreMutation = () => true
28
+
29
+ public initialise = () => {
30
+ this.dom = createPlaceholderContent(this.node.attrs.label)
31
+ this.dom.classList.add('placeholder-item')
32
+ }
33
+ }
34
+
35
+ export default createNodeView(PlaceholderView)
@@ -0,0 +1,38 @@
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 { PlaceholderNode } from '@manuscripts/transform'
18
+
19
+ import { createPlaceholderContent } from '../lib/placeholder'
20
+ import BlockView from './block_view'
21
+ import { createNodeView } from './creators'
22
+
23
+ export class PlaceholderElementView extends BlockView<PlaceholderNode> {
24
+ private element: HTMLElement
25
+
26
+ public createElement = () => {
27
+ this.element = document.createElement('div')
28
+ this.element.className = 'block'
29
+ this.element.setAttribute('id', this.node.attrs.id)
30
+ this.dom.appendChild(this.element)
31
+
32
+ const content = createPlaceholderContent()
33
+ content.className = 'placeholder-item'
34
+ this.element.appendChild(content)
35
+ }
36
+ }
37
+
38
+ export default createNodeView(PlaceholderElementView)
@@ -0,0 +1,21 @@
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 { EditableBlock } from './editable_block'
19
+ import { PlaceholderElementView } from './placeholder_element'
20
+
21
+ export default createEditableNodeView(EditableBlock(PlaceholderElementView))
@@ -0,0 +1,106 @@
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 { PullquoteElementNode, schema } from '@manuscripts/transform'
19
+ import { NodeSelection } from 'prosemirror-state'
20
+ import { findChildrenByType } from 'prosemirror-utils'
21
+
22
+ import { CommentKey } from '../lib/comments'
23
+ import { setCommentSelection } from '../plugins/comments'
24
+ import BlockView from './block_view'
25
+ import { createNodeOrElementView } from './creators'
26
+ import ReactSubView from './ReactSubView'
27
+
28
+ export class PullquoteElementView extends BlockView<PullquoteElementNode> {
29
+ public elementType = 'aside'
30
+ contextMenu: HTMLElement
31
+
32
+ public ignoreMutation = () => true
33
+ public stopEvent = () => true
34
+
35
+ private handleClick = (event: Event) => {
36
+ const element = event.target as HTMLElement
37
+ // Handle click on comment marker
38
+ const marker = element.closest('.comment-marker') as HTMLElement
39
+ if (marker) {
40
+ const key = marker.dataset.key as CommentKey
41
+ const tr = this.view.state.tr
42
+ setCommentSelection(tr, key, undefined, false)
43
+ tr.setSelection(NodeSelection.create(this.view.state.doc, this.getPos()))
44
+ this.view.dispatch(tr)
45
+ return
46
+ }
47
+ }
48
+
49
+ public createElement = () => {
50
+ this.contentDOM = document.createElement(this.elementType)
51
+ this.contentDOM.className = 'block'
52
+ this.contentDOM.classList.add('pullquote')
53
+
54
+ this.dom.appendChild(this.contentDOM)
55
+
56
+ // Add click event listener to handle comment marker clicks
57
+ this.dom.addEventListener('click', this.handleClick)
58
+ }
59
+
60
+ handleAddFigure() {
61
+ const tr = this.view.state.tr
62
+ tr.insert(this.getPos() + 1, schema.nodes.quote_image.create())
63
+ this.view.dispatch(tr)
64
+ }
65
+
66
+ public actionGutterButtons = (): HTMLElement[] => {
67
+ const contextMenu = this.addFigureContextMenu()
68
+ return contextMenu ? [contextMenu] : []
69
+ }
70
+
71
+ addFigureContextMenu = (): HTMLElement | undefined => {
72
+ const can = this.props.getCapabilities()
73
+ const componentProps: ContextMenuProps = {
74
+ actions: [],
75
+ }
76
+ if (can.editArticle) {
77
+ componentProps.actions.push({
78
+ label: 'Add Image',
79
+ action: () => this.handleAddFigure(),
80
+ icon: 'AddFigure',
81
+ disabled: !!findChildrenByType(this.node, schema.nodes.quote_image)
82
+ .length,
83
+ })
84
+
85
+ this.contextMenu = ReactSubView(
86
+ this.props,
87
+ ContextMenu,
88
+ componentProps,
89
+ this.node,
90
+ this.getPos,
91
+ this.view,
92
+ ['context-menu']
93
+ )
94
+ return this.contextMenu
95
+ }
96
+ return undefined
97
+ }
98
+
99
+ public destroy = () => {
100
+ // Clean up event listener
101
+ this.dom.removeEventListener('click', this.handleClick)
102
+ super.destroy()
103
+ }
104
+ }
105
+
106
+ export default createNodeOrElementView(PullquoteElementView, 'aside')
@@ -0,0 +1,24 @@
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 { createNodeOrElementView } from './creators'
18
+ import { EditableBlock } from './editable_block'
19
+ import { PullquoteElementView } from './pullquote_element'
20
+
21
+ export default createNodeOrElementView(
22
+ EditableBlock(PullquoteElementView),
23
+ 'aside'
24
+ )
@@ -0,0 +1,84 @@
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
+ addTrackChangesAttributes,
19
+ addTrackChangesClassNames,
20
+ isDeleted,
21
+ } from '@manuscripts/track-changes-plugin'
22
+ import { plusIcon } from '../icons'
23
+ import { createEditableNodeView } from './creators'
24
+ import { FigureEditableView } from './figure_editable'
25
+
26
+ export class QuoteImageEditableView extends FigureEditableView {
27
+ closeButton: HTMLButtonElement
28
+ isInPullQuote: boolean
29
+
30
+ override createDOM() {
31
+ this.dom = document.createElement('figure')
32
+
33
+ this.container = document.createElement('div')
34
+ this.container.className = 'pullquote-figure'
35
+ this.container.contentEditable = 'false'
36
+ this.dom.appendChild(this.container)
37
+ }
38
+
39
+ override addTools() {
40
+ if (!this.closeButton) {
41
+ const closeButton = document.createElement('button')
42
+ closeButton.innerHTML = plusIcon
43
+ closeButton.classList.add('figure-remove-button', 'button-reset')
44
+
45
+ closeButton.addEventListener('click', () => {
46
+ if (this.node.attrs.src) {
47
+ this.setSrc('')
48
+ } else {
49
+ const { tr } = this.view.state
50
+ tr.delete(this.getPos(), this.getPos() + this.node.nodeSize)
51
+ this.view.dispatch(tr)
52
+ }
53
+ })
54
+
55
+ this.closeButton = closeButton
56
+ }
57
+ }
58
+
59
+ public override updateContents() {
60
+ super.updateContents()
61
+
62
+ if (!isDeleted(this.node)) {
63
+ this.container.appendChild(this.closeButton)
64
+ }
65
+ addTrackChangesAttributes(this.node.attrs, this.dom)
66
+ addTrackChangesClassNames(this.node.attrs, this.dom)
67
+ }
68
+
69
+ protected override createPlaceholder = () => {
70
+ const element = document.createElement('div')
71
+ element.classList.add('figure', 'placeholder')
72
+ element.tabIndex = 0
73
+
74
+ const instructions = document.createElement('div')
75
+ instructions.classList.add('instructions')
76
+ instructions.innerHTML = `${plusIcon}<div>Drag or click here to upload image</div>`
77
+
78
+ element.appendChild(instructions)
79
+
80
+ return element
81
+ }
82
+ }
83
+
84
+ export default createEditableNodeView(QuoteImageEditableView)
@@ -0,0 +1,64 @@
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 { SectionNode } from '@manuscripts/transform'
18
+
19
+ import { sectionTitleKey } from '../plugins/section_title'
20
+ import BlockView from './block_view'
21
+ import { createNodeView } from './creators'
22
+
23
+ export class SectionView extends BlockView<SectionNode> {
24
+ public elementType = 'section'
25
+
26
+ public initialise() {
27
+ this.createDOM()
28
+ this.createElement()
29
+ this.updateContents()
30
+ }
31
+
32
+ public createElement() {
33
+ this.contentDOM = document.createElement(this.elementType)
34
+ this.dom.appendChild(this.contentDOM)
35
+ }
36
+
37
+ public updateContents() {
38
+ super.updateContents()
39
+ this.dom.setAttribute('data-category', this.node.attrs.category)
40
+ this.handleSectionNumbering()
41
+ }
42
+
43
+ // handle sections numbering after track-changes process
44
+ //todo move to plugin
45
+ handleSectionNumbering() {
46
+ const sections = sectionTitleKey.getState(this.view.state)
47
+ if (!sections) {
48
+ return
49
+ }
50
+ sections.forEach((sectionNumber, id) => {
51
+ const section = document.getElementById(id)
52
+ const sectionTitle = section?.querySelector('h1')
53
+ if (sectionTitle) {
54
+ sectionTitle.dataset.sectionNumber = sectionNumber
55
+ }
56
+ })
57
+ }
58
+
59
+ public destroy() {
60
+ super.destroy()
61
+ }
62
+ }
63
+
64
+ export default createNodeView(SectionView)
@@ -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 BlockView from './block_view'
18
+ import { createNodeView } from './creators'
19
+
20
+ export default createNodeView(BlockView)