@manuscripts/body-editor 3.12.67 → 3.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/dist/cjs/components/toolbar/type-selector/styles.js +2 -1
  2. package/dist/cjs/versions.js +1 -1
  3. package/dist/es/components/toolbar/type-selector/styles.js +2 -1
  4. package/dist/es/versions.js +1 -1
  5. package/dist/types/components/toolbar/type-selector/styles.d.ts +2 -2
  6. package/dist/types/lib/footnotes.d.ts +4 -2
  7. package/dist/types/lib/utils.d.ts +5 -4
  8. package/dist/types/versions.d.ts +1 -1
  9. package/package.json +37 -36
  10. package/{dist/es/lib/statistics.js → src/__mocks__/styleMock.ts} +2 -14
  11. package/src/assets.ts +20 -0
  12. package/src/classes/collabProvider.ts +38 -0
  13. package/src/clipboard.ts +54 -0
  14. package/src/commands.ts +2109 -0
  15. package/src/components/ChangeHandlingForm.tsx +54 -0
  16. package/src/components/LanguageDropdown/index.tsx +343 -0
  17. package/src/components/affiliations/AffiliationForm.tsx +238 -0
  18. package/src/components/affiliations/AffiliationItem.tsx +151 -0
  19. package/src/components/affiliations/AffiliationList.tsx +71 -0
  20. package/src/components/affiliations/AffiliationsModal.tsx +676 -0
  21. package/src/components/affiliations/AffiliationsPanel.tsx +76 -0
  22. package/src/components/affiliations/CreateAffiliationModal.tsx +135 -0
  23. package/src/components/authors/AuthorDetailsForm.tsx +438 -0
  24. package/src/components/authors/AuthorList.tsx +81 -0
  25. package/src/components/authors/AuthorsModal.tsx +642 -0
  26. package/src/components/authors/AuthorsPanel.tsx +69 -0
  27. package/src/components/authors/CreateAuthorModal.tsx +172 -0
  28. package/src/components/authors/CreditDrawer.tsx +71 -0
  29. package/src/components/authors/DraggableAuthor.tsx +228 -0
  30. package/src/components/authors/useManageAffiliations.tsx +77 -0
  31. package/src/components/authors/useManageCredit.tsx +63 -0
  32. package/src/components/authors-affiliations/AuthorsAndAffiliationsModals.tsx +170 -0
  33. package/src/components/authors-affiliations/GenericPanel.tsx +164 -0
  34. package/src/components/authors-affiliations/ModalTabs.tsx +100 -0
  35. package/src/components/awards/AwardForm.tsx +338 -0
  36. package/src/components/awards/AwardModal.tsx +120 -0
  37. package/src/components/awards/DeleteAwardDiaolog.tsx +52 -0
  38. package/src/components/dialog/ConfirmationDialog.tsx +131 -0
  39. package/src/components/form/CreateModalStyles.tsx +37 -0
  40. package/src/components/form/FormFooter.tsx +54 -0
  41. package/src/components/form/FormPlaceholder.tsx +71 -0
  42. package/src/components/form/ModalFormActions.tsx +88 -0
  43. package/src/components/form/UnsavedLabel.tsx +49 -0
  44. package/src/components/hooks/use-debounce.ts +56 -0
  45. package/src/components/hooks/useAffiliationShowsErrorIndicator.ts +51 -0
  46. package/src/components/hooks/useAuthorShowsErrorIndicator.ts +73 -0
  47. package/src/components/keyboard-shortcuts-modal/FormattedShortcut.tsx +56 -0
  48. package/src/components/keyboard-shortcuts-modal/KeyboardShortcutsModal.tsx +283 -0
  49. package/src/components/keyboard-shortcuts-modal/keyboard-shortcuts.ts +304 -0
  50. package/src/components/keywords/AddKeywordInline.tsx +284 -0
  51. package/src/components/keywords/DeleteKeywordDialog.tsx +52 -0
  52. package/src/components/modal-drawer/GenericDrawer.tsx +65 -0
  53. package/src/components/modal-drawer/GenericDrawerGroup.tsx +125 -0
  54. package/src/components/outline/DraggableTree.tsx +438 -0
  55. package/src/components/outline/ManuscriptOutline.tsx +127 -0
  56. package/src/components/outline/Outline.tsx +141 -0
  57. package/src/components/references/BibliographyItemSource.ts +80 -0
  58. package/src/components/references/CitationEditor.tsx +301 -0
  59. package/src/components/references/CitationViewer.tsx +62 -0
  60. package/src/components/references/ImportBibliographyForm.tsx +232 -0
  61. package/src/components/references/ImportBibliographyModal.tsx +159 -0
  62. package/src/components/references/ReferenceForm/PersonDropDown.tsx +93 -0
  63. package/src/components/references/ReferenceForm/ReferenceForm.tsx +701 -0
  64. package/src/components/references/ReferenceForm/config.ts +133 -0
  65. package/src/components/references/ReferenceForm/styled-components.ts +156 -0
  66. package/src/components/references/ReferenceLine.tsx +43 -0
  67. package/src/components/references/ReferenceSearch.tsx +163 -0
  68. package/src/components/references/ReferenceSearchResults.tsx +113 -0
  69. package/src/components/references/ReferenceSearchResultsPlaceholder.tsx +71 -0
  70. package/src/components/references/ReferenceSearchSection.tsx +124 -0
  71. package/src/components/references/ReferencesEditor.tsx +61 -0
  72. package/src/components/references/ReferencesModal.tsx +352 -0
  73. package/src/components/references/SearchInput.tsx +98 -0
  74. package/src/components/toolbar/InsertEmbedDialog.tsx +222 -0
  75. package/src/components/toolbar/InsertTableDialog.tsx +208 -0
  76. package/src/components/toolbar/ListMenuItem.tsx +203 -0
  77. package/src/components/toolbar/helpers.ts +547 -0
  78. package/src/components/toolbar/type-selector/OptionComponent.tsx +89 -0
  79. package/src/components/toolbar/type-selector/TypeSelector.tsx +157 -0
  80. package/src/components/toolbar/type-selector/styles.ts +79 -0
  81. package/src/components/views/CrossReferenceItems.tsx +199 -0
  82. package/src/components/views/DeleteEmbedDialog.tsx +83 -0
  83. package/src/components/views/DeleteFootnoteDialog.tsx +54 -0
  84. package/src/components/views/FigureDropdown.tsx +423 -0
  85. package/src/components/views/FootnotesSelector.tsx +255 -0
  86. package/src/components/views/InsertSpecialCharacter.tsx +245 -0
  87. package/src/components/views/LinkForm.tsx +220 -0
  88. package/src/components/views/TableCellContextMenu.tsx +241 -0
  89. package/src/configs/ManuscriptsEditor.ts +140 -0
  90. package/src/configs/editor-plugins.ts +119 -0
  91. package/src/configs/editor-views.ts +139 -0
  92. package/src/icons.ts +62 -0
  93. package/src/index.ts +65 -0
  94. package/src/keys/highlight.ts +65 -0
  95. package/src/keys/index.ts +33 -0
  96. package/src/keys/keyword.ts +69 -0
  97. package/src/keys/list.ts +156 -0
  98. package/src/keys/misc.ts +112 -0
  99. package/src/keys/title.ts +221 -0
  100. package/src/lib/__tests__/__fixtures__/doc.json +388 -0
  101. package/src/lib/__tests__/__snapshots__/paste.test.ts.snap +24 -0
  102. package/src/lib/__tests__/authors.test.ts +202 -0
  103. package/src/lib/__tests__/helpers.test.ts +46 -0
  104. package/src/lib/__tests__/paste.test.ts +57 -0
  105. package/src/lib/__tests__/plugins.test.ts +176 -0
  106. package/src/lib/__tests__/url.test.ts +31 -0
  107. package/src/lib/array-reducer.ts +68 -0
  108. package/src/lib/authors-and-affiliations.ts +81 -0
  109. package/src/lib/authors.ts +67 -0
  110. package/src/lib/capabilities.ts +55 -0
  111. package/src/lib/codemirror.ts +37 -0
  112. package/src/lib/comments.ts +123 -0
  113. package/src/lib/context-menu.ts +745 -0
  114. package/src/lib/copy.ts +30 -0
  115. package/src/lib/crossref.ts +90 -0
  116. package/src/lib/dnd.ts +29 -0
  117. package/src/lib/doc.ts +167 -0
  118. package/src/lib/dompurify.ts +28 -0
  119. package/src/lib/files.ts +180 -0
  120. package/src/lib/footnotes.ts +83 -0
  121. package/src/lib/get-media-type.ts +105 -0
  122. package/src/lib/helpers.ts +199 -0
  123. package/src/lib/hierarchy.ts +117 -0
  124. package/src/lib/languages.ts +37 -0
  125. package/src/lib/lists.ts +56 -0
  126. package/src/lib/math.ts +111 -0
  127. package/src/lib/media.ts +334 -0
  128. package/src/lib/navigation-utils.ts +235 -0
  129. package/src/lib/normalize.ts +70 -0
  130. package/src/lib/paste.ts +304 -0
  131. package/src/lib/placeholder.ts +32 -0
  132. package/src/lib/platform.ts +18 -0
  133. package/src/lib/plugins.ts +22 -0
  134. package/src/lib/popper.ts +180 -0
  135. package/src/lib/position-menu.ts +184 -0
  136. package/src/lib/references.ts +94 -0
  137. package/src/lib/template.ts +29 -0
  138. package/src/lib/track-changes-utils.ts +34 -0
  139. package/{dist/types/lib/statistics.d.ts → src/lib/url.ts} +11 -8
  140. package/src/lib/use-do-with-debounce.ts +39 -0
  141. package/src/lib/utils.ts +323 -0
  142. package/src/lib/view.ts +100 -0
  143. package/src/menus.tsx +684 -0
  144. package/src/node-type-icons.tsx +83 -0
  145. package/src/plugins/__tests__/__fixtures__/deleted-footnote.json +140 -0
  146. package/src/plugins/__tests__/__fixtures__/inserted-footnote.json +153 -0
  147. package/src/plugins/__tests__/footnotes.test.ts +67 -0
  148. package/src/plugins/accessibility_element.ts +219 -0
  149. package/src/plugins/add-subtitle.ts +102 -0
  150. package/src/plugins/affiliations.ts +136 -0
  151. package/src/plugins/alt-titles.ts +219 -0
  152. package/src/plugins/bibliography.ts +235 -0
  153. package/src/plugins/comments.ts +328 -0
  154. package/src/plugins/cross-references.ts +70 -0
  155. package/src/plugins/detect-inconsistency/detect-inconsistency-utils.ts +102 -0
  156. package/src/plugins/detect-inconsistency/index.ts +55 -0
  157. package/src/plugins/detect-inconsistency/validators.ts +283 -0
  158. package/src/plugins/doi.ts +66 -0
  159. package/src/plugins/editor-props.ts +39 -0
  160. package/src/plugins/elements.ts +60 -0
  161. package/src/plugins/footnotes.ts +298 -0
  162. package/src/plugins/link.ts +53 -0
  163. package/src/plugins/lock-body.ts +136 -0
  164. package/src/plugins/move-node.ts +55 -0
  165. package/src/plugins/objects.ts +125 -0
  166. package/src/plugins/paragraphs.ts +90 -0
  167. package/src/plugins/persist.ts +64 -0
  168. package/src/plugins/persistent-cursor.ts +66 -0
  169. package/src/plugins/placeholder.ts +219 -0
  170. package/src/plugins/prevent-empty.ts +50 -0
  171. package/src/plugins/search-replace/index.ts +157 -0
  172. package/src/plugins/search-replace/lib.ts +95 -0
  173. package/src/plugins/section_category.ts +212 -0
  174. package/src/plugins/section_title/autocompletion.ts +87 -0
  175. package/src/plugins/section_title/index.ts +105 -0
  176. package/src/plugins/selected-suggestion.ts +243 -0
  177. package/src/plugins/tables-cursor-fix.ts +143 -0
  178. package/src/plugins/translations.ts +263 -0
  179. package/src/rules.ts +60 -0
  180. package/src/selection.ts +112 -0
  181. package/src/testing/default-capabilities.ts +48 -0
  182. package/src/testing/default-editor-data.ts +73 -0
  183. package/src/testing/empty-editor-doc.json +62 -0
  184. package/src/testing/polyfill-dom.ts +43 -0
  185. package/src/testing/section-categories.json +161 -0
  186. package/src/testing/setup-editor.ts +55 -0
  187. package/src/tests.ts +42 -0
  188. package/src/toolbar.tsx +259 -0
  189. package/src/types/@citation-js/core.d.ts +16 -0
  190. package/src/types/@citation-js/index.d.ts +16 -0
  191. package/src/types/@citation-js/plugin-bibtex.d.ts +16 -0
  192. package/src/types/@citation-js/plugin-csl.d.ts +16 -0
  193. package/src/types/@citation-js/plugin-doi.d.ts +16 -0
  194. package/src/types/@citation-js/plugin-enw.d.ts +16 -0
  195. package/src/types/@citation-js/plugin-pubmed.d.ts +16 -0
  196. package/src/types/@citation-js/plugin-ris.d.ts +16 -0
  197. package/src/types/citeproc.d.ts +124 -0
  198. package/src/types/css.d.ts +16 -0
  199. package/src/types/json.d.ts +17 -0
  200. package/src/types/prosemirror-dev-tools.d.ts +16 -0
  201. package/src/types/prosemirror-dropcursor.d.ts +16 -0
  202. package/src/types/styled-components.d.ts +23 -0
  203. package/src/types.ts +49 -0
  204. package/src/useEditor.ts +244 -0
  205. package/src/versions.ts +3 -0
  206. package/src/views/ReactSubView.tsx +145 -0
  207. package/src/views/abstracts.ts +46 -0
  208. package/src/views/accessibility_element.ts +86 -0
  209. package/src/views/affiliations.ts +254 -0
  210. package/src/views/alt_title.ts +85 -0
  211. package/src/views/alt_titles_section.ts +97 -0
  212. package/src/views/attachment.ts +160 -0
  213. package/src/views/attachments.ts +72 -0
  214. package/src/views/author_notes.ts +96 -0
  215. package/src/views/award.ts +194 -0
  216. package/src/views/awards.ts +59 -0
  217. package/src/views/base_node_view.ts +85 -0
  218. package/src/views/bibliography_element.ts +313 -0
  219. package/src/views/block_view.ts +100 -0
  220. package/src/views/blockquote_element.ts +26 -0
  221. package/src/views/blockquote_element_editable.ts +24 -0
  222. package/src/views/box_element.ts +33 -0
  223. package/src/views/caption.ts +37 -0
  224. package/src/views/caption_title.ts +33 -0
  225. package/src/views/citation.ts +67 -0
  226. package/src/views/citation_editable.ts +312 -0
  227. package/src/views/contributors.ts +341 -0
  228. package/src/views/creators.ts +82 -0
  229. package/src/views/cross_reference.ts +74 -0
  230. package/src/views/cross_reference_editable.ts +113 -0
  231. package/src/views/editable_block.ts +141 -0
  232. package/src/views/embed.ts +345 -0
  233. package/src/views/empty.ts +26 -0
  234. package/src/views/equation.ts +47 -0
  235. package/src/views/equation_editable.ts +84 -0
  236. package/src/views/equation_element.ts +29 -0
  237. package/src/views/equation_element_editable.ts +21 -0
  238. package/src/views/figure.ts +84 -0
  239. package/src/views/figure_editable.ts +361 -0
  240. package/src/views/figure_element.ts +197 -0
  241. package/src/views/figure_element_editable.ts +21 -0
  242. package/src/views/footnote.ts +236 -0
  243. package/src/views/footnotes_element.ts +54 -0
  244. package/src/views/general_table_footnote.ts +140 -0
  245. package/src/views/hero_image.ts +76 -0
  246. package/src/views/hero_image_editable.ts +21 -0
  247. package/src/views/image_element.ts +373 -0
  248. package/src/views/image_element_editable.ts +21 -0
  249. package/src/views/inline_equation.ts +47 -0
  250. package/src/views/inline_equation_editable.ts +70 -0
  251. package/src/views/inline_footnote.ts +264 -0
  252. package/src/views/inline_footnote_editable.ts +20 -0
  253. package/src/views/keyword.ts +127 -0
  254. package/src/views/keyword_group.ts +109 -0
  255. package/src/views/link.ts +27 -0
  256. package/src/views/link_editable.ts +169 -0
  257. package/src/views/list.ts +46 -0
  258. package/src/views/list_item.ts +26 -0
  259. package/src/views/paragraph.ts +26 -0
  260. package/src/views/paragraph_editable.ts +21 -0
  261. package/src/views/placeholder.ts +35 -0
  262. package/src/views/placeholder_element.ts +38 -0
  263. package/src/views/placeholder_element_editable.ts +21 -0
  264. package/src/views/pullquote_element.ts +106 -0
  265. package/src/views/pullquote_element_editable.ts +24 -0
  266. package/src/views/quote_image_editable.ts +84 -0
  267. package/src/views/section.ts +64 -0
  268. package/src/views/section_label.ts +20 -0
  269. package/src/views/section_title.ts +87 -0
  270. package/src/views/section_title_editable.ts +21 -0
  271. package/src/views/subtitle.ts +42 -0
  272. package/src/views/subtitle_editable.ts +20 -0
  273. package/src/views/subtitles.ts +34 -0
  274. package/src/views/subtitles_editable.ts +21 -0
  275. package/src/views/supplement.ts +236 -0
  276. package/src/views/supplement_editable.ts +20 -0
  277. package/src/views/supplements.ts +65 -0
  278. package/src/views/supplements_editable.ts +21 -0
  279. package/src/views/table_cell.ts +150 -0
  280. package/src/views/table_element.ts +33 -0
  281. package/src/views/table_element_editable.ts +21 -0
  282. package/src/views/table_element_footer.ts +41 -0
  283. package/src/views/title.ts +46 -0
  284. package/src/views/title_editable.ts +20 -0
  285. package/src/views/trans_graphical_abstract.ts +55 -0
  286. package/src/views/trans_graphical_abstract_editable.ts +21 -0
  287. package/src/views/translated_abstract.ts +53 -0
  288. package/src/views/translated_abstract_editable.ts +21 -0
  289. package/dist/cjs/lib/statistics.js +0 -38
@@ -0,0 +1,345 @@
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
+ import { EmbedNode } from '@manuscripts/transform'
17
+ import { isEqual } from 'lodash'
18
+ import { NodeSelection } from 'prosemirror-state'
19
+
20
+ import {
21
+ NoPreviewMessageWithLink,
22
+ openEmbedDialog,
23
+ } from '../components/toolbar/InsertEmbedDialog'
24
+ import { getMediaTypeInfo } from '../lib/get-media-type'
25
+ import {
26
+ addInteractionHandlers,
27
+ createFileHandlers,
28
+ createFileUploader,
29
+ createMediaPlaceholder,
30
+ createReactTools,
31
+ createUnsupportedFormat,
32
+ FileHandlers,
33
+ MediaType,
34
+ } from '../lib/media'
35
+ import { allowedHref } from '../lib/url'
36
+ import { Trackable } from '../types'
37
+ import BlockView from './block_view'
38
+ import { createEditableNodeView } from './creators'
39
+ import { EditableBlock } from './editable_block'
40
+ import ReactSubView from './ReactSubView'
41
+
42
+ export class EmbedView extends BlockView<Trackable<EmbedNode>> {
43
+ private container: HTMLElement
44
+ private figureBlock: HTMLElement
45
+ private preview: HTMLElement | null = null
46
+ public reactTools: HTMLDivElement | null = null
47
+ public ignoreMutation = () => true
48
+ private initialized = false
49
+ private previousAttrs: {
50
+ href?: string
51
+ mimetype?: string
52
+ mimeSubtype?: string
53
+ } = {}
54
+
55
+ public createElement = () => {
56
+ this.container = document.createElement('div')
57
+ this.container.classList.add('block')
58
+ this.dom.appendChild(this.container)
59
+ const figureBlock = document.createElement('div')
60
+ figureBlock.classList.add('figure-block')
61
+ this.container.appendChild(figureBlock)
62
+
63
+ this.contentDOM = document.createElement('div')
64
+ figureBlock.appendChild(this.contentDOM)
65
+
66
+ this.figureBlock = figureBlock
67
+ }
68
+
69
+ upload = async (file: File) => {
70
+ const mediaInfo = getMediaTypeInfo(file)
71
+
72
+ const result = await this.props.fileManagement.upload(file)
73
+
74
+ const pos = this.getPos()
75
+ const tr = this.view.state.tr
76
+ tr.setNodeMarkup(pos, undefined, {
77
+ ...this.node.attrs,
78
+ href: result.id,
79
+ mimetype: mediaInfo.mimetype,
80
+ mimeSubtype: mediaInfo.mimeSubtype,
81
+ })
82
+
83
+ this.view.dispatch(tr)
84
+ }
85
+
86
+ public updateContents() {
87
+ super.updateContents()
88
+ const { href, mimetype, mimeSubtype } = this.node.attrs
89
+
90
+ const currentAttrs = { href, mimetype, mimeSubtype }
91
+ const contentChanged =
92
+ !this.initialized || !isEqual(this.previousAttrs, currentAttrs)
93
+
94
+ if (contentChanged) {
95
+ this.initialized = true
96
+ this.previousAttrs = currentAttrs
97
+ this.updateMediaPreview()
98
+ this.manageReactTools()
99
+ }
100
+ }
101
+
102
+ private manageReactTools() {
103
+ this.reactTools?.remove()
104
+
105
+ let handlers: FileHandlers | undefined
106
+ const can = this.props.getCapabilities()
107
+
108
+ if (this.isUploadedFile()) {
109
+ handlers = createFileHandlers(
110
+ this.node.attrs,
111
+ 'href',
112
+ this.view,
113
+ this.props,
114
+ this.setHref
115
+ )
116
+ if (can.uploadFile) {
117
+ handlers.handleUpload = createFileUploader(
118
+ this.upload,
119
+ 'video/*,audio/*'
120
+ )
121
+ }
122
+ } else if (this.isEmbedLink()) {
123
+ handlers = this.createEmbedHandlers()
124
+ }
125
+
126
+ if (handlers) {
127
+ this.reactTools = createReactTools(
128
+ this.node,
129
+ this.view,
130
+ this.getPos,
131
+ this.props,
132
+ handlers,
133
+ true,
134
+ () => false
135
+ )
136
+ if (this.reactTools) {
137
+ if (this.preview) {
138
+ this.preview.insertBefore(this.reactTools, this.preview.firstChild)
139
+ } else {
140
+ this.dom.insertBefore(this.reactTools, this.dom.firstChild)
141
+ }
142
+ }
143
+ }
144
+ }
145
+
146
+ protected setHref = (href: string) => {
147
+ const { tr } = this.view.state
148
+ const pos = this.getPos()
149
+ tr.setNodeMarkup(pos, undefined, {
150
+ ...this.node.attrs,
151
+ href: href,
152
+ })
153
+ tr.setSelection(NodeSelection.create(tr.doc, pos))
154
+ this.view.dispatch(tr)
155
+ }
156
+
157
+ private isUploadedFile(): boolean {
158
+ const { href } = this.node.attrs
159
+ if (!href) {
160
+ return false
161
+ }
162
+
163
+ const files = this.props.getFiles()
164
+ return files.some((file) => file.id === href)
165
+ }
166
+
167
+ private isEmbedLink(): boolean {
168
+ const { href } = this.node.attrs
169
+ return !!(href && allowedHref(href) && !this.isUploadedFile())
170
+ }
171
+
172
+ private async updateMediaPreview() {
173
+ const preview = document.createElement('div')
174
+ preview.classList.add('media-preview')
175
+ preview.setAttribute('contenteditable', 'false')
176
+
177
+ const oldPreview = this.preview
178
+ ? this.preview
179
+ : this.figureBlock.querySelector('.media-preview')
180
+ if (oldPreview) {
181
+ this.figureBlock.replaceChild(preview, oldPreview)
182
+ } else {
183
+ this.figureBlock.prepend(preview)
184
+ }
185
+ this.preview = preview
186
+
187
+ const href = this.node.attrs.href
188
+
189
+ let object: HTMLElement
190
+
191
+ if (!href) {
192
+ object = createMediaPlaceholder(
193
+ MediaType.Media,
194
+ this.view,
195
+ this.getPos,
196
+ this.props
197
+ )
198
+ } else if (this.isUploadedFile()) {
199
+ const files = this.props.getFiles()
200
+ const file = files.find((f) => f.id === href)
201
+
202
+ if (file) {
203
+ const mediaInfo = getMediaTypeInfo(file.name)
204
+ const isValidMediaFile = mediaInfo.isAudio || mediaInfo.isVideo
205
+ object = isValidMediaFile
206
+ ? this.createMedia() ||
207
+ createUnsupportedFormat(
208
+ file.name,
209
+ this.props.getCapabilities().editArticle
210
+ )
211
+ : createUnsupportedFormat(
212
+ file.name,
213
+ this.props.getCapabilities().editArticle
214
+ )
215
+ } else {
216
+ object = createMediaPlaceholder(
217
+ MediaType.Media,
218
+ this.view,
219
+ this.getPos,
220
+ this.props
221
+ )
222
+ }
223
+ } else if (this.isEmbedLink()) {
224
+ object = await this.createEmbedPreview()
225
+ } else {
226
+ object = createMediaPlaceholder(
227
+ MediaType.Media,
228
+ this.view,
229
+ this.getPos,
230
+ this.props
231
+ )
232
+ }
233
+
234
+ const can = this.props.getCapabilities()
235
+ if (can.uploadFile && object.classList.contains('placeholder')) {
236
+ addInteractionHandlers(object, this.upload, 'video/*,audio/*')
237
+ }
238
+
239
+ preview.appendChild(object)
240
+ }
241
+
242
+ private createEmbedHandlers(): FileHandlers {
243
+ const handlers: FileHandlers = {}
244
+
245
+ handlers.handleReplaceEmbed = () => {
246
+ openEmbedDialog(this.view, this.getPos())
247
+ }
248
+
249
+ return handlers
250
+ }
251
+
252
+ private async createEmbedPreview(): Promise<HTMLElement> {
253
+ const container = document.createElement('div')
254
+ container.classList.add('embed-preview')
255
+
256
+ try {
257
+ const html = await this.props.fetchOEmbedHtml(
258
+ this.node.attrs.href,
259
+ 643,
260
+ 363
261
+ )
262
+ if (html) {
263
+ container.innerHTML = html
264
+ } else {
265
+ this.showUnavailableMessage(container)
266
+ }
267
+ } catch (error) {
268
+ this.showUnavailableMessage(container)
269
+ }
270
+
271
+ return container
272
+ }
273
+
274
+ private showUnavailableMessage(container: HTMLElement) {
275
+ container.appendChild(
276
+ ReactSubView(
277
+ this.props,
278
+ NoPreviewMessageWithLink,
279
+ { href: this.node.attrs.href },
280
+ this.node,
281
+ this.getPos,
282
+ this.view
283
+ )
284
+ )
285
+ }
286
+
287
+ public createMedia = () => {
288
+ const { href } = this.node.attrs
289
+ if (!href) {
290
+ return null
291
+ }
292
+
293
+ const files = this.props.getFiles()
294
+ const file = files.find((f) => f.id === href)
295
+ if (!file) {
296
+ return null
297
+ }
298
+
299
+ const mediaUrl = file.link || file.id
300
+
301
+ if (!mediaUrl) {
302
+ return null
303
+ }
304
+
305
+ const mediaInfo = getMediaTypeInfo(file.name)
306
+
307
+ if (mediaInfo.isVideo) {
308
+ const video = document.createElement('video')
309
+ video.controls = true
310
+ video.style.maxWidth = '100%'
311
+ video.style.height = '250px'
312
+
313
+ const source = document.createElement('source')
314
+ source.src = mediaUrl
315
+
316
+ video.appendChild(source)
317
+ video.appendChild(
318
+ document.createTextNode('Your browser does not support the video tag.')
319
+ )
320
+
321
+ return video
322
+ } else if (mediaInfo.isAudio) {
323
+ const audio = document.createElement('audio')
324
+ audio.controls = true
325
+ audio.style.width = '100%'
326
+
327
+ const source = document.createElement('source')
328
+ source.src = mediaUrl
329
+
330
+ audio.appendChild(source)
331
+ audio.appendChild(
332
+ document.createTextNode('Your browser does not support the audio tag.')
333
+ )
334
+
335
+ return audio
336
+ } else {
337
+ return createUnsupportedFormat(
338
+ file.name,
339
+ this.props.getCapabilities().editArticle
340
+ )
341
+ }
342
+ }
343
+ }
344
+
345
+ export default createEditableNodeView(EditableBlock(EmbedView))
@@ -0,0 +1,26 @@
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
+ /**
18
+ * empty section that represents prosemirror meta node
19
+ */
20
+ export default (type: string) => () => {
21
+ const dom = document.createElement('div')
22
+ dom.setAttribute('data-type', type)
23
+ dom.setAttribute('contenteditable', 'false')
24
+ dom.style.display = 'inline'
25
+ return { dom }
26
+ }
@@ -0,0 +1,47 @@
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 { EquationNode, ManuscriptNodeView } from '@manuscripts/transform'
18
+
19
+ import { renderMath } from '../lib/math'
20
+ import { Trackable } from '../types'
21
+ import { BaseNodeView } from './base_node_view'
22
+ import { createNodeView } from './creators'
23
+
24
+ export class EquationView
25
+ extends BaseNodeView<Trackable<EquationNode>>
26
+ implements ManuscriptNodeView
27
+ {
28
+ public initialise = () => {
29
+ this.createDOM()
30
+ this.updateContents()
31
+ }
32
+
33
+ public createDOM = () => {
34
+ this.dom = document.createElement('div')
35
+ this.dom.classList.add('equation')
36
+ }
37
+
38
+ public updateContents() {
39
+ super.updateContents()
40
+ this.dom.innerHTML = this.node.attrs.contents
41
+ renderMath(this.dom)
42
+ }
43
+
44
+ public ignoreMutation = () => true
45
+ }
46
+
47
+ export default createNodeView(EquationView)
@@ -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 { NodeSelection } from 'prosemirror-state'
18
+
19
+ import { createEditableNodeView } from './creators'
20
+ import { EquationView } from './equation'
21
+
22
+ export class EquationEditableView extends EquationView {
23
+ public selectNode = async () => {
24
+ if (!this.props.getCapabilities().editArticle) {
25
+ return
26
+ }
27
+
28
+ const { createEditor } = await import('../lib/codemirror')
29
+
30
+ const placeholder = 'Enter LaTeX equation, e.g. "a^2 = \\sqrt{b^2 + c^2}"'
31
+
32
+ const input = await createEditor({
33
+ value: this.node.attrs.contents || '',
34
+ mode: 'stex',
35
+ placeholder,
36
+ autofocus: true,
37
+ extraKeys: {
38
+ Esc: () => {
39
+ this.props.popper.destroy()
40
+ this.view.focus()
41
+ },
42
+ },
43
+ })
44
+
45
+ input.on('changes', async () => {
46
+ const contents = input.getValue()
47
+
48
+ const pos = this.getPos()
49
+
50
+ const { tr } = this.view.state
51
+
52
+ const format = contents.includes('mml:math') ? 'mathml' : 'tex'
53
+ tr.setNodeMarkup(pos, undefined, {
54
+ ...this.node.attrs,
55
+ contents,
56
+ format,
57
+ }).setSelection(NodeSelection.create(tr.doc, pos))
58
+
59
+ this.view.dispatch(tr)
60
+ })
61
+
62
+ const wrapper = document.createElement('div')
63
+ wrapper.appendChild(input.getWrapperElement())
64
+ wrapper.className = 'equation-editor'
65
+
66
+ const infoLink = document.createElement('a')
67
+ infoLink.target = '_blank'
68
+ infoLink.textContent = '?'
69
+ infoLink.title = ''
70
+ infoLink.href = 'https://en.wikibooks.org/wiki/LaTeX/Mathematics#Symbols'
71
+ infoLink.className = 'equation-editor-info'
72
+
73
+ wrapper.appendChild(infoLink)
74
+
75
+ this.props.popper.show(this.dom, wrapper, 'bottom')
76
+
77
+ window.requestAnimationFrame(() => {
78
+ input.refresh()
79
+ input.focus()
80
+ })
81
+ }
82
+ }
83
+
84
+ export default createEditableNodeView(EquationEditableView)
@@ -0,0 +1,29 @@
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 { EquationElementNode } from '@manuscripts/transform'
18
+
19
+ import { Trackable } from '../types'
20
+ import BlockView from './block_view'
21
+ import { createNodeView } from './creators'
22
+
23
+ export class EquationElementView extends BlockView<
24
+ Trackable<EquationElementNode>
25
+ > {
26
+ public elementType = 'figure'
27
+ }
28
+
29
+ export default createNodeView(EquationElementView)
@@ -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 { EquationElementView } from './equation_element'
20
+
21
+ export default createEditableNodeView(EditableBlock(EquationElementView))
@@ -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 { FigureNode, 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 FigureView
24
+ extends BaseNodeView<Trackable<FigureNode>>
25
+ implements ManuscriptNodeView
26
+ {
27
+ protected container: HTMLElement
28
+
29
+ public initialise() {
30
+ this.createDOM()
31
+ this.updateContents()
32
+ }
33
+
34
+ public ignoreMutation = () => true
35
+
36
+ public updateContents() {
37
+ super.updateContents()
38
+ while (this.container.hasChildNodes()) {
39
+ this.container.removeChild(this.container.firstChild as Node)
40
+ }
41
+
42
+ const object = this.createFigureImage() || this.createFigurePlaceholder()
43
+
44
+ this.container.appendChild(object)
45
+ }
46
+
47
+ public createFigureImage = () => {
48
+ const { src } = this.node.attrs
49
+
50
+ if (src) {
51
+ const element = document.createElement('img')
52
+ element.classList.add('figure-image')
53
+ element.src = src
54
+ return element
55
+ }
56
+ }
57
+
58
+ public createFigurePlaceholder = () => {
59
+ const element = document.createElement('div')
60
+ element.classList.add('figure')
61
+ element.classList.add('placeholder')
62
+
63
+ const instructions = document.createElement('div')
64
+ instructions.textContent = 'No image here yet…'
65
+ element.appendChild(instructions)
66
+
67
+ return element
68
+ }
69
+
70
+ protected createDOM() {
71
+ this.dom = document.createElement('figure')
72
+
73
+ this.container = document.createElement('div')
74
+ this.container.className = 'figure'
75
+ this.container.contentEditable = 'false'
76
+ this.dom.appendChild(this.container)
77
+
78
+ this.contentDOM = document.createElement('div')
79
+ this.contentDOM.setAttribute('tabindex', '1337') // allow focus in this node
80
+ this.dom.appendChild(this.contentDOM)
81
+ }
82
+ }
83
+
84
+ export default createNodeView(FigureView)