@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,157 @@
1
+ /*!
2
+ * © 2025 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 {
17
+ ManuscriptEditorView,
18
+ ManuscriptNodeType,
19
+ schema,
20
+ } from '@manuscripts/transform'
21
+ import { EditorState, Transaction } from 'prosemirror-state'
22
+ import { hasParentNodeOfType } from 'prosemirror-utils'
23
+ import React from 'react'
24
+ import { OnChangeValue } from 'react-select'
25
+
26
+ import { findClosestParentElement } from '../../../lib/hierarchy'
27
+ import { isEditAllowed } from '../../../lib/utils'
28
+ import {
29
+ demoteSectionToParagraph,
30
+ findSelectedOption,
31
+ optionName,
32
+ promoteParagraphToSection,
33
+ titleCase,
34
+ } from '../helpers'
35
+ import { CustomControl, OptionComponent } from './OptionComponent'
36
+ import { customStyles, StyledSelect } from './styles'
37
+ import { isDeleted } from '@manuscripts/track-changes-plugin'
38
+
39
+ export interface Option {
40
+ action?: (
41
+ state: EditorState,
42
+ dispatch: (tr: Transaction) => void,
43
+ view?: ManuscriptEditorView
44
+ ) => void
45
+ isDisabled: boolean
46
+ isSelected: boolean
47
+ label: string
48
+ nodeType: ManuscriptNodeType
49
+ }
50
+
51
+ const buildOptions = (state: EditorState): Option[] => {
52
+ const {
53
+ doc,
54
+ selection: { $from, $to },
55
+ schema,
56
+ } = state
57
+ const { nodes } = schema
58
+
59
+ if (!$from.sameParent($to)) {
60
+ return []
61
+ }
62
+
63
+ const parentElement = findClosestParentElement($from)
64
+
65
+ if (!parentElement) {
66
+ return []
67
+ }
68
+
69
+ const parentElementType = parentElement.node.type
70
+ const options: Option[] = []
71
+
72
+ switch (parentElementType) {
73
+ case parentElementType.schema.nodes.section: {
74
+ const sectionDepth = Math.max(1, $from.depth - 1)
75
+ const beforeSection = $from.before(sectionDepth)
76
+ const $beforeSection = doc.resolve(beforeSection)
77
+ const sectionOffset = $beforeSection.parentOffset
78
+ const section = $from.node(sectionDepth)
79
+ !isDeleted(section) &&
80
+ options.push({
81
+ nodeType: nodes.paragraph,
82
+ label: 'Paragraph',
83
+ action: demoteSectionToParagraph,
84
+ isDisabled:
85
+ (sectionDepth <= 1 && sectionOffset <= 1) || isDeleted(section),
86
+ isSelected: false,
87
+ })
88
+ options.push({
89
+ nodeType: nodes.section,
90
+ label: 'Heading',
91
+ isDisabled: true,
92
+ isSelected: true,
93
+ })
94
+ return options
95
+ }
96
+ case parentElementType.schema.nodes.paragraph: {
97
+ const paragraph = $from.node($from.depth)
98
+ options.push({
99
+ nodeType: nodes.paragraph,
100
+ label: 'Paragraph',
101
+ isDisabled: true,
102
+ isSelected: true,
103
+ })
104
+ !isDeleted(paragraph) &&
105
+ options.push({
106
+ nodeType: nodes.section,
107
+ label: 'Heading',
108
+ action: promoteParagraphToSection,
109
+ isDisabled: isDeleted(paragraph),
110
+ isSelected: false,
111
+ })
112
+ return options
113
+ }
114
+ default: {
115
+ options.push({
116
+ nodeType: parentElementType,
117
+ label: titleCase(optionName(parentElementType)),
118
+ isDisabled: true,
119
+ isSelected: true,
120
+ })
121
+ return options
122
+ }
123
+ }
124
+ }
125
+
126
+ export const TypeSelector: React.FC<{
127
+ state: EditorState
128
+ dispatch: (tr: Transaction) => void
129
+ view?: ManuscriptEditorView
130
+ }> = ({ state, dispatch, view }) => {
131
+ const options = buildOptions(state)
132
+ const isInBody = hasParentNodeOfType(schema.nodes.body)(state.selection)
133
+ return (
134
+ <StyledSelect
135
+ onChange={(value: OnChangeValue<Option, false>) => {
136
+ if (value && value.action) {
137
+ value.action(state, dispatch, view)
138
+ }
139
+ }}
140
+ value={
141
+ options.length === 1
142
+ ? (options[0] as Option | undefined)
143
+ : findSelectedOption(options)
144
+ }
145
+ options={options}
146
+ components={{
147
+ Control: CustomControl,
148
+ Option: OptionComponent,
149
+ }}
150
+ classNamePrefix="type-selector"
151
+ styles={customStyles}
152
+ isDisabled={options.length <= 1 || !isInBody || !isEditAllowed(state)}
153
+ isSearchable={false}
154
+ tabIndex={-1}
155
+ />
156
+ )
157
+ }
@@ -0,0 +1,79 @@
1
+ /*!
2
+ * © 2025 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 Select, { CSSObjectWithLabel, GroupBase, Props } from 'react-select'
17
+ import styled from 'styled-components'
18
+
19
+ import { Option } from './TypeSelector'
20
+
21
+ const TypeSelect: React.ComponentType<Props<Option, false, GroupBase<Option>>> = Select
22
+
23
+ export const StyledSelect = styled(TypeSelect)`
24
+ .type-selector__control:hover {
25
+ border-color: ${(props) => props.theme.colors.border.secondary};
26
+ }
27
+
28
+ .type-selector__control:focus-visible {
29
+ border-color: ${(props) => props.theme.colors.outline.focus} !important;
30
+ box-shadow: 0 0 0 1px ${(props) => props.theme.colors.outline.focus} !important;
31
+ outline: none;
32
+
33
+ .type-selector__dropdown-indicator {
34
+ color: #6e6e6e;
35
+ }
36
+ }
37
+ `
38
+
39
+ export const customStyles = {
40
+ control: (styles: CSSObjectWithLabel): CSSObjectWithLabel => ({
41
+ ...styles,
42
+ backgroundColor: '#fff',
43
+ borderWidth: 1,
44
+ borderStyle: 'solid',
45
+ borderColor: '#e2e2e2',
46
+ boxShadow: 'none',
47
+ fontSize: '14px',
48
+ minHeight: 0,
49
+ padding: 0,
50
+ width: 200,
51
+ overflowX: 'hidden',
52
+ textOverflow: 'ellipsis',
53
+ cursor: 'pointer',
54
+ height: 32,
55
+ }),
56
+ indicatorSeparator: (): CSSObjectWithLabel => ({
57
+ display: 'none',
58
+ }),
59
+ dropdownIndicator: (styles: CSSObjectWithLabel): CSSObjectWithLabel => ({
60
+ ...styles,
61
+ padding: '0 4px',
62
+ }),
63
+ menu: (styles: CSSObjectWithLabel): CSSObjectWithLabel => ({
64
+ ...styles,
65
+ width: '200px',
66
+ }),
67
+ singleValue: (styles: CSSObjectWithLabel): CSSObjectWithLabel => ({
68
+ ...styles,
69
+ padding: 0,
70
+ }),
71
+ valueContainer: (styles: CSSObjectWithLabel): CSSObjectWithLabel => ({
72
+ ...styles,
73
+ padding: '1px 8px',
74
+ }),
75
+ container: (styles: CSSObjectWithLabel): CSSObjectWithLabel => ({
76
+ ...styles,
77
+ border: 'none',
78
+ }),
79
+ }
@@ -0,0 +1,199 @@
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
+ ButtonGroup,
19
+ PrimaryButton,
20
+ SecondaryButton,
21
+ TextArea,
22
+ withFocusTrap,
23
+ withListNavigation,
24
+ withNavigableListItem,
25
+ } from '@manuscripts/style-guide'
26
+ import { Target } from '@manuscripts/transform'
27
+ import React, { useEffect, useRef, useState } from 'react'
28
+ import styled from 'styled-components'
29
+
30
+ const Container = withFocusTrap(styled.div`
31
+ padding: ${(props) => props.theme.grid.unit * 3}px
32
+ ${(props) => props.theme.grid.unit * 4}px;
33
+ display: flex;
34
+ flex-direction: column;
35
+ max-height: 60vh;
36
+ overflow: hidden;
37
+ `)
38
+
39
+ const Actions = styled.div`
40
+ display: flex;
41
+ align-items: center;
42
+ justify-content: flex-end;
43
+ flex-shrink: 0;
44
+ `
45
+
46
+ const Items = withListNavigation(styled.div`
47
+ flex: 1;
48
+ overflow-y: auto;
49
+ padding: ${(props) => props.theme.grid.unit * 3}px;
50
+ `)
51
+
52
+ const CrossReferenceItem = withNavigableListItem(styled.div<{
53
+ isSelected: boolean
54
+ }>`
55
+ cursor: pointer;
56
+ padding: ${(props) => props.theme.grid.unit * 4}px;
57
+ background-color: ${(props) =>
58
+ props.isSelected
59
+ ? props.theme.colors.background.selected
60
+ : props.theme.colors.background.primary};
61
+ transition: background-color 0.1s;
62
+ border: solid
63
+ ${(props) =>
64
+ props.isSelected
65
+ ? props.theme.colors.brand.medium
66
+ : props.theme.colors.border.secondary};
67
+ border-width: 1px 0;
68
+ z-index: ${(props) => (props.isSelected ? '1' : '0')};
69
+
70
+ &:hover {
71
+ background-color: ${(props) => props.theme.colors.background.selected};
72
+ }
73
+ `)
74
+
75
+ const Label = styled.span`
76
+ color: ${(props) => props.theme.colors.text.primary};
77
+ `
78
+
79
+ const Caption = styled.span`
80
+ color: ${(props) => props.theme.colors.text.secondary};
81
+ `
82
+
83
+ const Heading = styled.div`
84
+ display: flex;
85
+ align-items: center;
86
+ justify-content: space-between;
87
+ flex-shrink: 0;
88
+ font-weight: ${(props) => props.theme.font.weight.bold};
89
+ `
90
+
91
+ const Empty = styled.div`
92
+ margin-bottom: ${(props) => props.theme.grid.unit * 4}px;
93
+ color: ${(props) => props.theme.colors.text.tertiary};
94
+ `
95
+ const DefaultLabelWrapper = styled.div`
96
+ margin-bottom: ${(props) => props.theme.grid.unit * 2}px;
97
+ `
98
+
99
+ const CustomTextArea = styled(TextArea)`
100
+ width: 100%;
101
+ height: 75px;
102
+ color: ${(props) => props.theme.colors.text.secondary};
103
+ background-color: ${(props) =>
104
+ props.theme.colors.background.primary} !important;
105
+ border: 1px solid ${(props) => props.theme.colors.border.secondary};
106
+ border-radius: ${(props) => props.theme.grid.radius.small};
107
+ padding: ${(props) => props.theme.grid.unit * 2}px;
108
+ `
109
+
110
+ // trim a caption, avoiding cutting words
111
+ const trimmedCaption = (caption: string, limit: number): string => {
112
+ if (caption.length <= limit) {
113
+ return caption
114
+ }
115
+
116
+ const captionSearch = new RegExp(`^(.{${limit}}[^\\s]*).*`)
117
+
118
+ return caption.replace(captionSearch, '$1…')
119
+ }
120
+
121
+ interface Props {
122
+ targets: Target[]
123
+ handleSelect: (id: string, customLabel?: string) => void
124
+ handleCancel: () => void
125
+ currentTargetId?: string
126
+ currentCustomLabel?: string
127
+ }
128
+
129
+ export const CrossReferenceItems: React.FC<Props> = ({
130
+ targets,
131
+ handleSelect,
132
+ handleCancel,
133
+ currentTargetId,
134
+ currentCustomLabel,
135
+ }) => {
136
+ const [selectedItem, setSelectedItem] = useState<string>('')
137
+ const customTextRef = useRef<HTMLTextAreaElement>(null)
138
+
139
+ useEffect(() => {
140
+ if (currentTargetId) {
141
+ setSelectedItem(currentTargetId)
142
+ }
143
+ }, [currentTargetId])
144
+
145
+ return (
146
+ <Container>
147
+ <Heading>Insert Cross-reference</Heading>
148
+
149
+ <Items>
150
+ {targets.length ? (
151
+ targets.map((target) => (
152
+ <CrossReferenceItem
153
+ key={target.id}
154
+ isSelected={selectedItem === target.id}
155
+ onClick={() => setSelectedItem(target.id)}
156
+ >
157
+ <DefaultLabelWrapper>
158
+ <Label>{target.label}</Label>
159
+ <Caption>
160
+ {target.caption && ': ' + trimmedCaption(target.caption, 200)}
161
+ </Caption>
162
+ </DefaultLabelWrapper>
163
+ {selectedItem === target.id && (
164
+ <CustomTextArea
165
+ ref={customTextRef}
166
+ placeholder={'Or type custom text'}
167
+ defaultValue={
168
+ currentTargetId &&
169
+ currentTargetId === selectedItem &&
170
+ currentCustomLabel
171
+ ? currentCustomLabel
172
+ : ''
173
+ }
174
+ />
175
+ )}
176
+ </CrossReferenceItem>
177
+ ))
178
+ ) : (
179
+ <Empty>No cross-reference targets available.</Empty>
180
+ )}
181
+ </Items>
182
+
183
+ <Actions>
184
+ <ButtonGroup>
185
+ <SecondaryButton onClick={handleCancel}>Cancel</SecondaryButton>
186
+ <PrimaryButton
187
+ onClick={() =>
188
+ selectedItem &&
189
+ handleSelect(selectedItem, customTextRef.current?.value || '')
190
+ }
191
+ disabled={!selectedItem}
192
+ >
193
+ Insert
194
+ </PrimaryButton>
195
+ </ButtonGroup>
196
+ </Actions>
197
+ </Container>
198
+ )
199
+ }
@@ -0,0 +1,83 @@
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
+ import { Category, Dialog } from '@manuscripts/style-guide'
17
+ import { EmbedNode } from '@manuscripts/transform'
18
+ import { EditorView } from 'prosemirror-view'
19
+ import React, { useState } from 'react'
20
+
21
+ import { getEditorProps } from '../../plugins/editor-props'
22
+ import ReactSubView from '../../views/ReactSubView'
23
+
24
+ const DeleteEmbedDialog: React.FC<{
25
+ deleteNode: () => void
26
+ }> = ({ deleteNode }) => {
27
+ const [isOpen, setOpen] = useState(true)
28
+
29
+ return (
30
+ <Dialog
31
+ isOpen={isOpen}
32
+ actions={{
33
+ primary: {
34
+ action: () => {
35
+ deleteNode()
36
+ setOpen(false)
37
+ },
38
+ title: 'Delete',
39
+ },
40
+ secondary: {
41
+ action: () => setOpen(false),
42
+ title: 'Cancel',
43
+ },
44
+ }}
45
+ category={Category.confirmation}
46
+ header={'Delete Media'}
47
+ message={
48
+ <>
49
+ <span>This action will delete the media from the page.</span>
50
+ <br />
51
+ <br />
52
+ <span>Do you want to continue?</span>
53
+ </>
54
+ }
55
+ />
56
+ )
57
+ }
58
+
59
+ export const openDeleteEmbedDialog = (
60
+ view: EditorView,
61
+ node: EmbedNode,
62
+ pos: number
63
+ ) => {
64
+ const { state, dispatch } = view
65
+ const props = getEditorProps(state)
66
+
67
+ const dialog = ReactSubView(
68
+ props,
69
+ DeleteEmbedDialog,
70
+ {
71
+ deleteNode: () => {
72
+ const from = pos
73
+ const to = from + node.nodeSize
74
+ dispatch(state.tr.delete(from, to))
75
+ },
76
+ },
77
+ state.doc,
78
+ () => 0,
79
+ view
80
+ )
81
+
82
+ document.body.appendChild(dialog)
83
+ }
@@ -0,0 +1,54 @@
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
+ import { Category, Dialog } from '@manuscripts/style-guide'
17
+ import React, { useState } from 'react'
18
+
19
+ export interface DeleteFootnoteDialogProps {
20
+ header: string
21
+ message: string
22
+ handleDelete: () => void
23
+ }
24
+
25
+ export const DeleteFootnoteDialog: React.FC<DeleteFootnoteDialogProps> = ({
26
+ header,
27
+ message,
28
+ handleDelete,
29
+ }) => {
30
+ const [isOpen, setOpen] = useState(true)
31
+
32
+ return (
33
+ <Dialog
34
+ className="delete-footnote-dialog"
35
+ isOpen={isOpen}
36
+ actions={{
37
+ primary: {
38
+ action: () => {
39
+ setOpen(false)
40
+ handleDelete()
41
+ },
42
+ title: 'Delete',
43
+ },
44
+ secondary: {
45
+ action: () => setOpen(false),
46
+ title: 'Cancel',
47
+ },
48
+ }}
49
+ category={Category.confirmation}
50
+ header={header}
51
+ message={message}
52
+ />
53
+ )
54
+ }