@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.
- package/dist/cjs/components/toolbar/type-selector/styles.js +2 -1
- package/dist/cjs/versions.js +1 -1
- package/dist/es/components/toolbar/type-selector/styles.js +2 -1
- package/dist/es/versions.js +1 -1
- package/dist/types/components/toolbar/type-selector/styles.d.ts +2 -2
- package/dist/types/lib/footnotes.d.ts +4 -2
- package/dist/types/lib/utils.d.ts +5 -4
- package/dist/types/versions.d.ts +1 -1
- package/package.json +37 -36
- package/{dist/es/lib/statistics.js → src/__mocks__/styleMock.ts} +2 -14
- package/src/assets.ts +20 -0
- package/src/classes/collabProvider.ts +38 -0
- package/src/clipboard.ts +54 -0
- package/src/commands.ts +2109 -0
- package/src/components/ChangeHandlingForm.tsx +54 -0
- package/src/components/LanguageDropdown/index.tsx +343 -0
- package/src/components/affiliations/AffiliationForm.tsx +238 -0
- package/src/components/affiliations/AffiliationItem.tsx +151 -0
- package/src/components/affiliations/AffiliationList.tsx +71 -0
- package/src/components/affiliations/AffiliationsModal.tsx +676 -0
- package/src/components/affiliations/AffiliationsPanel.tsx +76 -0
- package/src/components/affiliations/CreateAffiliationModal.tsx +135 -0
- package/src/components/authors/AuthorDetailsForm.tsx +438 -0
- package/src/components/authors/AuthorList.tsx +81 -0
- package/src/components/authors/AuthorsModal.tsx +642 -0
- package/src/components/authors/AuthorsPanel.tsx +69 -0
- package/src/components/authors/CreateAuthorModal.tsx +172 -0
- package/src/components/authors/CreditDrawer.tsx +71 -0
- package/src/components/authors/DraggableAuthor.tsx +228 -0
- package/src/components/authors/useManageAffiliations.tsx +77 -0
- package/src/components/authors/useManageCredit.tsx +63 -0
- package/src/components/authors-affiliations/AuthorsAndAffiliationsModals.tsx +170 -0
- package/src/components/authors-affiliations/GenericPanel.tsx +164 -0
- package/src/components/authors-affiliations/ModalTabs.tsx +100 -0
- package/src/components/awards/AwardForm.tsx +338 -0
- package/src/components/awards/AwardModal.tsx +120 -0
- package/src/components/awards/DeleteAwardDiaolog.tsx +52 -0
- package/src/components/dialog/ConfirmationDialog.tsx +131 -0
- package/src/components/form/CreateModalStyles.tsx +37 -0
- package/src/components/form/FormFooter.tsx +54 -0
- package/src/components/form/FormPlaceholder.tsx +71 -0
- package/src/components/form/ModalFormActions.tsx +88 -0
- package/src/components/form/UnsavedLabel.tsx +49 -0
- package/src/components/hooks/use-debounce.ts +56 -0
- package/src/components/hooks/useAffiliationShowsErrorIndicator.ts +51 -0
- package/src/components/hooks/useAuthorShowsErrorIndicator.ts +73 -0
- package/src/components/keyboard-shortcuts-modal/FormattedShortcut.tsx +56 -0
- package/src/components/keyboard-shortcuts-modal/KeyboardShortcutsModal.tsx +283 -0
- package/src/components/keyboard-shortcuts-modal/keyboard-shortcuts.ts +304 -0
- package/src/components/keywords/AddKeywordInline.tsx +284 -0
- package/src/components/keywords/DeleteKeywordDialog.tsx +52 -0
- package/src/components/modal-drawer/GenericDrawer.tsx +65 -0
- package/src/components/modal-drawer/GenericDrawerGroup.tsx +125 -0
- package/src/components/outline/DraggableTree.tsx +438 -0
- package/src/components/outline/ManuscriptOutline.tsx +127 -0
- package/src/components/outline/Outline.tsx +141 -0
- package/src/components/references/BibliographyItemSource.ts +80 -0
- package/src/components/references/CitationEditor.tsx +301 -0
- package/src/components/references/CitationViewer.tsx +62 -0
- package/src/components/references/ImportBibliographyForm.tsx +232 -0
- package/src/components/references/ImportBibliographyModal.tsx +159 -0
- package/src/components/references/ReferenceForm/PersonDropDown.tsx +93 -0
- package/src/components/references/ReferenceForm/ReferenceForm.tsx +701 -0
- package/src/components/references/ReferenceForm/config.ts +133 -0
- package/src/components/references/ReferenceForm/styled-components.ts +156 -0
- package/src/components/references/ReferenceLine.tsx +43 -0
- package/src/components/references/ReferenceSearch.tsx +163 -0
- package/src/components/references/ReferenceSearchResults.tsx +113 -0
- package/src/components/references/ReferenceSearchResultsPlaceholder.tsx +71 -0
- package/src/components/references/ReferenceSearchSection.tsx +124 -0
- package/src/components/references/ReferencesEditor.tsx +61 -0
- package/src/components/references/ReferencesModal.tsx +352 -0
- package/src/components/references/SearchInput.tsx +98 -0
- package/src/components/toolbar/InsertEmbedDialog.tsx +222 -0
- package/src/components/toolbar/InsertTableDialog.tsx +208 -0
- package/src/components/toolbar/ListMenuItem.tsx +203 -0
- package/src/components/toolbar/helpers.ts +547 -0
- package/src/components/toolbar/type-selector/OptionComponent.tsx +89 -0
- package/src/components/toolbar/type-selector/TypeSelector.tsx +157 -0
- package/src/components/toolbar/type-selector/styles.ts +79 -0
- package/src/components/views/CrossReferenceItems.tsx +199 -0
- package/src/components/views/DeleteEmbedDialog.tsx +83 -0
- package/src/components/views/DeleteFootnoteDialog.tsx +54 -0
- package/src/components/views/FigureDropdown.tsx +423 -0
- package/src/components/views/FootnotesSelector.tsx +255 -0
- package/src/components/views/InsertSpecialCharacter.tsx +245 -0
- package/src/components/views/LinkForm.tsx +220 -0
- package/src/components/views/TableCellContextMenu.tsx +241 -0
- package/src/configs/ManuscriptsEditor.ts +140 -0
- package/src/configs/editor-plugins.ts +119 -0
- package/src/configs/editor-views.ts +139 -0
- package/src/icons.ts +62 -0
- package/src/index.ts +65 -0
- package/src/keys/highlight.ts +65 -0
- package/src/keys/index.ts +33 -0
- package/src/keys/keyword.ts +69 -0
- package/src/keys/list.ts +156 -0
- package/src/keys/misc.ts +112 -0
- package/src/keys/title.ts +221 -0
- package/src/lib/__tests__/__fixtures__/doc.json +388 -0
- package/src/lib/__tests__/__snapshots__/paste.test.ts.snap +24 -0
- package/src/lib/__tests__/authors.test.ts +202 -0
- package/src/lib/__tests__/helpers.test.ts +46 -0
- package/src/lib/__tests__/paste.test.ts +57 -0
- package/src/lib/__tests__/plugins.test.ts +176 -0
- package/src/lib/__tests__/url.test.ts +31 -0
- package/src/lib/array-reducer.ts +68 -0
- package/src/lib/authors-and-affiliations.ts +81 -0
- package/src/lib/authors.ts +67 -0
- package/src/lib/capabilities.ts +55 -0
- package/src/lib/codemirror.ts +37 -0
- package/src/lib/comments.ts +123 -0
- package/src/lib/context-menu.ts +745 -0
- package/src/lib/copy.ts +30 -0
- package/src/lib/crossref.ts +90 -0
- package/src/lib/dnd.ts +29 -0
- package/src/lib/doc.ts +167 -0
- package/src/lib/dompurify.ts +28 -0
- package/src/lib/files.ts +180 -0
- package/src/lib/footnotes.ts +83 -0
- package/src/lib/get-media-type.ts +105 -0
- package/src/lib/helpers.ts +199 -0
- package/src/lib/hierarchy.ts +117 -0
- package/src/lib/languages.ts +37 -0
- package/src/lib/lists.ts +56 -0
- package/src/lib/math.ts +111 -0
- package/src/lib/media.ts +334 -0
- package/src/lib/navigation-utils.ts +235 -0
- package/src/lib/normalize.ts +70 -0
- package/src/lib/paste.ts +304 -0
- package/src/lib/placeholder.ts +32 -0
- package/src/lib/platform.ts +18 -0
- package/src/lib/plugins.ts +22 -0
- package/src/lib/popper.ts +180 -0
- package/src/lib/position-menu.ts +184 -0
- package/src/lib/references.ts +94 -0
- package/src/lib/template.ts +29 -0
- package/src/lib/track-changes-utils.ts +34 -0
- package/{dist/types/lib/statistics.d.ts → src/lib/url.ts} +11 -8
- package/src/lib/use-do-with-debounce.ts +39 -0
- package/src/lib/utils.ts +323 -0
- package/src/lib/view.ts +100 -0
- package/src/menus.tsx +684 -0
- package/src/node-type-icons.tsx +83 -0
- package/src/plugins/__tests__/__fixtures__/deleted-footnote.json +140 -0
- package/src/plugins/__tests__/__fixtures__/inserted-footnote.json +153 -0
- package/src/plugins/__tests__/footnotes.test.ts +67 -0
- package/src/plugins/accessibility_element.ts +219 -0
- package/src/plugins/add-subtitle.ts +102 -0
- package/src/plugins/affiliations.ts +136 -0
- package/src/plugins/alt-titles.ts +219 -0
- package/src/plugins/bibliography.ts +235 -0
- package/src/plugins/comments.ts +328 -0
- package/src/plugins/cross-references.ts +70 -0
- package/src/plugins/detect-inconsistency/detect-inconsistency-utils.ts +102 -0
- package/src/plugins/detect-inconsistency/index.ts +55 -0
- package/src/plugins/detect-inconsistency/validators.ts +283 -0
- package/src/plugins/doi.ts +66 -0
- package/src/plugins/editor-props.ts +39 -0
- package/src/plugins/elements.ts +60 -0
- package/src/plugins/footnotes.ts +298 -0
- package/src/plugins/link.ts +53 -0
- package/src/plugins/lock-body.ts +136 -0
- package/src/plugins/move-node.ts +55 -0
- package/src/plugins/objects.ts +125 -0
- package/src/plugins/paragraphs.ts +90 -0
- package/src/plugins/persist.ts +64 -0
- package/src/plugins/persistent-cursor.ts +66 -0
- package/src/plugins/placeholder.ts +219 -0
- package/src/plugins/prevent-empty.ts +50 -0
- package/src/plugins/search-replace/index.ts +157 -0
- package/src/plugins/search-replace/lib.ts +95 -0
- package/src/plugins/section_category.ts +212 -0
- package/src/plugins/section_title/autocompletion.ts +87 -0
- package/src/plugins/section_title/index.ts +105 -0
- package/src/plugins/selected-suggestion.ts +243 -0
- package/src/plugins/tables-cursor-fix.ts +143 -0
- package/src/plugins/translations.ts +263 -0
- package/src/rules.ts +60 -0
- package/src/selection.ts +112 -0
- package/src/testing/default-capabilities.ts +48 -0
- package/src/testing/default-editor-data.ts +73 -0
- package/src/testing/empty-editor-doc.json +62 -0
- package/src/testing/polyfill-dom.ts +43 -0
- package/src/testing/section-categories.json +161 -0
- package/src/testing/setup-editor.ts +55 -0
- package/src/tests.ts +42 -0
- package/src/toolbar.tsx +259 -0
- package/src/types/@citation-js/core.d.ts +16 -0
- package/src/types/@citation-js/index.d.ts +16 -0
- package/src/types/@citation-js/plugin-bibtex.d.ts +16 -0
- package/src/types/@citation-js/plugin-csl.d.ts +16 -0
- package/src/types/@citation-js/plugin-doi.d.ts +16 -0
- package/src/types/@citation-js/plugin-enw.d.ts +16 -0
- package/src/types/@citation-js/plugin-pubmed.d.ts +16 -0
- package/src/types/@citation-js/plugin-ris.d.ts +16 -0
- package/src/types/citeproc.d.ts +124 -0
- package/src/types/css.d.ts +16 -0
- package/src/types/json.d.ts +17 -0
- package/src/types/prosemirror-dev-tools.d.ts +16 -0
- package/src/types/prosemirror-dropcursor.d.ts +16 -0
- package/src/types/styled-components.d.ts +23 -0
- package/src/types.ts +49 -0
- package/src/useEditor.ts +244 -0
- package/src/versions.ts +3 -0
- package/src/views/ReactSubView.tsx +145 -0
- package/src/views/abstracts.ts +46 -0
- package/src/views/accessibility_element.ts +86 -0
- package/src/views/affiliations.ts +254 -0
- package/src/views/alt_title.ts +85 -0
- package/src/views/alt_titles_section.ts +97 -0
- package/src/views/attachment.ts +160 -0
- package/src/views/attachments.ts +72 -0
- package/src/views/author_notes.ts +96 -0
- package/src/views/award.ts +194 -0
- package/src/views/awards.ts +59 -0
- package/src/views/base_node_view.ts +85 -0
- package/src/views/bibliography_element.ts +313 -0
- package/src/views/block_view.ts +100 -0
- package/src/views/blockquote_element.ts +26 -0
- package/src/views/blockquote_element_editable.ts +24 -0
- package/src/views/box_element.ts +33 -0
- package/src/views/caption.ts +37 -0
- package/src/views/caption_title.ts +33 -0
- package/src/views/citation.ts +67 -0
- package/src/views/citation_editable.ts +312 -0
- package/src/views/contributors.ts +341 -0
- package/src/views/creators.ts +82 -0
- package/src/views/cross_reference.ts +74 -0
- package/src/views/cross_reference_editable.ts +113 -0
- package/src/views/editable_block.ts +141 -0
- package/src/views/embed.ts +345 -0
- package/src/views/empty.ts +26 -0
- package/src/views/equation.ts +47 -0
- package/src/views/equation_editable.ts +84 -0
- package/src/views/equation_element.ts +29 -0
- package/src/views/equation_element_editable.ts +21 -0
- package/src/views/figure.ts +84 -0
- package/src/views/figure_editable.ts +361 -0
- package/src/views/figure_element.ts +197 -0
- package/src/views/figure_element_editable.ts +21 -0
- package/src/views/footnote.ts +236 -0
- package/src/views/footnotes_element.ts +54 -0
- package/src/views/general_table_footnote.ts +140 -0
- package/src/views/hero_image.ts +76 -0
- package/src/views/hero_image_editable.ts +21 -0
- package/src/views/image_element.ts +373 -0
- package/src/views/image_element_editable.ts +21 -0
- package/src/views/inline_equation.ts +47 -0
- package/src/views/inline_equation_editable.ts +70 -0
- package/src/views/inline_footnote.ts +264 -0
- package/src/views/inline_footnote_editable.ts +20 -0
- package/src/views/keyword.ts +127 -0
- package/src/views/keyword_group.ts +109 -0
- package/src/views/link.ts +27 -0
- package/src/views/link_editable.ts +169 -0
- package/src/views/list.ts +46 -0
- package/src/views/list_item.ts +26 -0
- package/src/views/paragraph.ts +26 -0
- package/src/views/paragraph_editable.ts +21 -0
- package/src/views/placeholder.ts +35 -0
- package/src/views/placeholder_element.ts +38 -0
- package/src/views/placeholder_element_editable.ts +21 -0
- package/src/views/pullquote_element.ts +106 -0
- package/src/views/pullquote_element_editable.ts +24 -0
- package/src/views/quote_image_editable.ts +84 -0
- package/src/views/section.ts +64 -0
- package/src/views/section_label.ts +20 -0
- package/src/views/section_title.ts +87 -0
- package/src/views/section_title_editable.ts +21 -0
- package/src/views/subtitle.ts +42 -0
- package/src/views/subtitle_editable.ts +20 -0
- package/src/views/subtitles.ts +34 -0
- package/src/views/subtitles_editable.ts +21 -0
- package/src/views/supplement.ts +236 -0
- package/src/views/supplement_editable.ts +20 -0
- package/src/views/supplements.ts +65 -0
- package/src/views/supplements_editable.ts +21 -0
- package/src/views/table_cell.ts +150 -0
- package/src/views/table_element.ts +33 -0
- package/src/views/table_element_editable.ts +21 -0
- package/src/views/table_element_footer.ts +41 -0
- package/src/views/title.ts +46 -0
- package/src/views/title_editable.ts +20 -0
- package/src/views/trans_graphical_abstract.ts +55 -0
- package/src/views/trans_graphical_abstract_editable.ts +21 -0
- package/src/views/translated_abstract.ts +53 -0
- package/src/views/translated_abstract_editable.ts +21 -0
- package/dist/cjs/lib/statistics.js +0 -38
package/src/selection.ts
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* © 2024 Atypon Systems LLC
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import {
|
|
17
|
+
CHANGE_OPERATION,
|
|
18
|
+
trackChangesPluginKey,
|
|
19
|
+
TrackedChange,
|
|
20
|
+
} from '@manuscripts/track-changes-plugin'
|
|
21
|
+
import { ManuscriptEditorState } from '@manuscripts/transform'
|
|
22
|
+
import { Node, ResolvedPos } from 'prosemirror-model'
|
|
23
|
+
import { NodeSelection, Selection } from 'prosemirror-state'
|
|
24
|
+
import { Mappable } from 'prosemirror-transform'
|
|
25
|
+
|
|
26
|
+
import { isTextSelection } from './commands'
|
|
27
|
+
|
|
28
|
+
interface NodesSelectionJSON {
|
|
29
|
+
type: 'inlineNodes' | 'nodes'
|
|
30
|
+
startNode: ResolvedPos
|
|
31
|
+
endNode: ResolvedPos
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Selecting multiple inline nodes without moving selection cursor
|
|
36
|
+
*/
|
|
37
|
+
export class InlineNodesSelection extends Selection {
|
|
38
|
+
public $startNode: ResolvedPos
|
|
39
|
+
public $endNode: ResolvedPos
|
|
40
|
+
|
|
41
|
+
constructor($from: ResolvedPos, $to: ResolvedPos) {
|
|
42
|
+
super($to, $to)
|
|
43
|
+
this.$startNode = $from
|
|
44
|
+
this.$endNode = $to
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
eq(selection: Selection): boolean {
|
|
48
|
+
return (
|
|
49
|
+
selection instanceof NodesSelection &&
|
|
50
|
+
selection.$startNode.pos == this.$startNode.pos &&
|
|
51
|
+
selection.$endNode.pos == this.$endNode.pos
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
map(doc: Node, mapping: Mappable): Selection {
|
|
56
|
+
const $from = doc.resolve(mapping.map(this.$startNode.pos))
|
|
57
|
+
const $to = doc.resolve(mapping.map(this.$endNode.pos))
|
|
58
|
+
return new NodesSelection($from, $to)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
toJSON(): NodesSelectionJSON {
|
|
62
|
+
return {
|
|
63
|
+
type: 'inlineNodes',
|
|
64
|
+
startNode: this.$startNode,
|
|
65
|
+
endNode: this.$endNode,
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export class NodesSelection extends NodeSelection {
|
|
71
|
+
public $startNode: ResolvedPos
|
|
72
|
+
public $endNode: ResolvedPos
|
|
73
|
+
|
|
74
|
+
constructor($from: ResolvedPos, $to: ResolvedPos) {
|
|
75
|
+
super($from)
|
|
76
|
+
this.$startNode = $from
|
|
77
|
+
this.$endNode = $to
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
toJSON(): NodesSelectionJSON {
|
|
81
|
+
return {
|
|
82
|
+
type: 'nodes',
|
|
83
|
+
startNode: this.$startNode,
|
|
84
|
+
endNode: this.$endNode,
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export const getSelectionChangeGroup = (state: ManuscriptEditorState) => {
|
|
90
|
+
const selection = state.selection
|
|
91
|
+
const $pos = isTextSelection(selection)
|
|
92
|
+
? selection.$cursor
|
|
93
|
+
: (selection instanceof NodesSelection ||
|
|
94
|
+
selection instanceof InlineNodesSelection) &&
|
|
95
|
+
selection.$from
|
|
96
|
+
if ($pos) {
|
|
97
|
+
return (
|
|
98
|
+
trackChangesPluginKey
|
|
99
|
+
.getState(state)
|
|
100
|
+
?.changeSet.groupChanges.find((c) => isPositionAtRange(c, $pos.pos)) ||
|
|
101
|
+
[]
|
|
102
|
+
)
|
|
103
|
+
}
|
|
104
|
+
return []
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// check if position is at the range of group changes
|
|
108
|
+
const isPositionAtRange = (changes: TrackedChange[], pos: number) =>
|
|
109
|
+
(changes.length > 1 ||
|
|
110
|
+
changes[0].dataTracked.operation === CHANGE_OPERATION.structure) &&
|
|
111
|
+
pos >= changes[0].from &&
|
|
112
|
+
pos <= changes[changes.length - 1].to
|
|
@@ -0,0 +1,48 @@
|
|
|
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
|
+
|
|
17
|
+
import { Capabilities } from '../lib/capabilities'
|
|
18
|
+
|
|
19
|
+
export const defaultCapabilities: Capabilities = {
|
|
20
|
+
/* track changes */
|
|
21
|
+
handleSuggestion: true,
|
|
22
|
+
editWithoutTracking: true,
|
|
23
|
+
rejectOwnSuggestion: true,
|
|
24
|
+
|
|
25
|
+
/* comments */
|
|
26
|
+
handleOwnComments: true,
|
|
27
|
+
handleOthersComments: true,
|
|
28
|
+
resolveOwnComment: true,
|
|
29
|
+
resolveOthersComment: true,
|
|
30
|
+
createComment: true,
|
|
31
|
+
|
|
32
|
+
/* file handling */
|
|
33
|
+
downloadFiles: true,
|
|
34
|
+
changeDesignation: true,
|
|
35
|
+
moveFile: true,
|
|
36
|
+
replaceFile: true,
|
|
37
|
+
uploadFile: true,
|
|
38
|
+
detachFile: true,
|
|
39
|
+
setMainManuscript: true,
|
|
40
|
+
|
|
41
|
+
/* editor */
|
|
42
|
+
editArticle: true,
|
|
43
|
+
formatArticle: true,
|
|
44
|
+
editMetadata: true,
|
|
45
|
+
editCitationsAndRefs: true,
|
|
46
|
+
seeEditorToolbar: true,
|
|
47
|
+
seeReferencesButtons: true,
|
|
48
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
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
|
+
ActualManuscriptNode,
|
|
19
|
+
schema,
|
|
20
|
+
SectionCategory,
|
|
21
|
+
} from '@manuscripts/transform'
|
|
22
|
+
import { createBrowserHistory } from 'history'
|
|
23
|
+
|
|
24
|
+
import { EditorProps } from '../configs/ManuscriptsEditor'
|
|
25
|
+
import { PopperManager } from '../lib/popper'
|
|
26
|
+
import { defaultCapabilities } from './default-capabilities'
|
|
27
|
+
import emptyEditorDocJson from './empty-editor-doc.json'
|
|
28
|
+
import sectionCategories from './section-categories.json'
|
|
29
|
+
|
|
30
|
+
export const defaultEditorProps: EditorProps = {
|
|
31
|
+
attributes: {
|
|
32
|
+
class: 'manuscript-editor',
|
|
33
|
+
dir: 'ltr',
|
|
34
|
+
lang: 'en-GB',
|
|
35
|
+
spellcheck: 'true',
|
|
36
|
+
tabindex: '2',
|
|
37
|
+
},
|
|
38
|
+
doc: schema.nodeFromJSON(emptyEditorDocJson) as ActualManuscriptNode,
|
|
39
|
+
locale: 'en-GB',
|
|
40
|
+
popper: new PopperManager(),
|
|
41
|
+
projectID: 'test-project-id',
|
|
42
|
+
getCurrentUser: () => ({
|
|
43
|
+
_id: 'test-user-profile-1-id',
|
|
44
|
+
userID: '',
|
|
45
|
+
}),
|
|
46
|
+
// @ts-ignore
|
|
47
|
+
history: createBrowserHistory(),
|
|
48
|
+
theme: {},
|
|
49
|
+
getFiles: () => [],
|
|
50
|
+
fileManagement: {
|
|
51
|
+
// @ts-ignore
|
|
52
|
+
upload: () => {}, // eslint-disable-line @typescript-eslint/no-empty-function
|
|
53
|
+
download: () => {}, // eslint-disable-line @typescript-eslint/no-empty-function
|
|
54
|
+
},
|
|
55
|
+
getCapabilities: () => ({
|
|
56
|
+
...defaultCapabilities,
|
|
57
|
+
editWithoutTracking: true,
|
|
58
|
+
}),
|
|
59
|
+
cslProps: {
|
|
60
|
+
style: '',
|
|
61
|
+
locale: '',
|
|
62
|
+
},
|
|
63
|
+
setComment: () => undefined,
|
|
64
|
+
setSelectedComment: () => undefined,
|
|
65
|
+
setEditorSelectedSuggestion: () => undefined,
|
|
66
|
+
sectionCategories: new Map(
|
|
67
|
+
sectionCategories.map((category: SectionCategory) => [
|
|
68
|
+
category.id,
|
|
69
|
+
category,
|
|
70
|
+
])
|
|
71
|
+
),
|
|
72
|
+
fetchOEmbedHtml: async () => undefined,
|
|
73
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "manuscript",
|
|
3
|
+
"attrs": {
|
|
4
|
+
"id": "MPManuscript:D1797375-EF63-49AF-B140-04B2FA6B8365"
|
|
5
|
+
},
|
|
6
|
+
"content": [
|
|
7
|
+
{
|
|
8
|
+
"type": "abstracts",
|
|
9
|
+
"attrs": {
|
|
10
|
+
"id": ""
|
|
11
|
+
},
|
|
12
|
+
"content": []
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"type": "body",
|
|
16
|
+
"attrs": {
|
|
17
|
+
"id": "MPSection:5346C94F-8C83-4585-811E-2209C269ED71"
|
|
18
|
+
},
|
|
19
|
+
"content": [
|
|
20
|
+
{
|
|
21
|
+
"type": "section",
|
|
22
|
+
"attrs": {
|
|
23
|
+
"id": "MPSection:5346C94F-8C83-4585-811E-2209C269ED71",
|
|
24
|
+
"category": "",
|
|
25
|
+
"titleSuppressed": false
|
|
26
|
+
},
|
|
27
|
+
"content": [
|
|
28
|
+
{
|
|
29
|
+
"type": "section_title"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"type": "paragraph",
|
|
33
|
+
"attrs": {
|
|
34
|
+
"id": "MPParagraphElement:08E4B001-BB01-4666-9E33-9355AEC3CFC3",
|
|
35
|
+
"placeholder": ""
|
|
36
|
+
},
|
|
37
|
+
"content": [
|
|
38
|
+
{
|
|
39
|
+
"type": "text",
|
|
40
|
+
"text": "test"
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"type": "backmatter",
|
|
50
|
+
"attrs": {
|
|
51
|
+
"id": "MPSection:05EA736A-BBE3-4904-B2F5-59E861208BA9"
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"type": "comments",
|
|
56
|
+
"attrs": {
|
|
57
|
+
"id": ""
|
|
58
|
+
},
|
|
59
|
+
"content": []
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
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
|
+
/**
|
|
18
|
+
* Extra methods to polyfill parts of the DOM not covered by jest-prosemirror and jsdom.
|
|
19
|
+
*
|
|
20
|
+
* jest-prosemirror implements these polyfills by default
|
|
21
|
+
* https://github.com/remirror/remirror/blob/8a6524a8da1a48b85fdde8f1c8b62375fbd5a318/packages/jest-remirror/src/jsdom-polyfills.ts
|
|
22
|
+
*/
|
|
23
|
+
import { vi } from 'vitest'
|
|
24
|
+
|
|
25
|
+
export function polyfillDom() {
|
|
26
|
+
window.scrollBy = vi.fn()
|
|
27
|
+
|
|
28
|
+
// This could return a null but ProseMirror expects an object causing an error otherwise.
|
|
29
|
+
// @ts-ignore
|
|
30
|
+
document.getSelection = vi.fn(() => ({
|
|
31
|
+
anchorNode: null,
|
|
32
|
+
anchorOffset: 0,
|
|
33
|
+
baseNode: null,
|
|
34
|
+
baseOffset: 0,
|
|
35
|
+
extentNode: null,
|
|
36
|
+
extentOffset: 0,
|
|
37
|
+
focusNode: null,
|
|
38
|
+
focusOffset: 0,
|
|
39
|
+
isCollapsed: true,
|
|
40
|
+
rangeCount: 0,
|
|
41
|
+
type: 'None',
|
|
42
|
+
}))
|
|
43
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "abstract",
|
|
4
|
+
"titles": ["Abstract"],
|
|
5
|
+
"synonyms": ["abstract"],
|
|
6
|
+
"group": "abstracts",
|
|
7
|
+
"isUnique": false
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "acknowledgements",
|
|
11
|
+
"synonyms": ["acknowledgements", "acknowledgments"],
|
|
12
|
+
"titles": ["Acknowledgements"],
|
|
13
|
+
"group": "backmatter",
|
|
14
|
+
"isUnique": true
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": "appendices",
|
|
18
|
+
"titles": ["Appendices"],
|
|
19
|
+
"synonyms": ["appendices"],
|
|
20
|
+
"isUnique": false
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": "availability",
|
|
24
|
+
"titles": ["Availability"],
|
|
25
|
+
"synonyms": ["availability", "data-availability", "data availability"],
|
|
26
|
+
"group": "backmatter",
|
|
27
|
+
"isUnique": true
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "coi-statement",
|
|
31
|
+
"synonyms": [
|
|
32
|
+
"coi-statement",
|
|
33
|
+
"competing-interests",
|
|
34
|
+
"conflict",
|
|
35
|
+
"conflict of interest",
|
|
36
|
+
"competing interests"
|
|
37
|
+
],
|
|
38
|
+
"label": "Conflict of Interest",
|
|
39
|
+
"titles": ["Conflict of Interest Statement","COI Statement", "Competing Interests"],
|
|
40
|
+
"group": "backmatter",
|
|
41
|
+
"isUnique": true
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": "con",
|
|
45
|
+
"synonyms": ["con"],
|
|
46
|
+
"titles": ["Contributed-by information"],
|
|
47
|
+
"group": "backmatter",
|
|
48
|
+
"isUnique": true
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "conclusions",
|
|
52
|
+
"synonyms": ["conclusions"],
|
|
53
|
+
"titles": ["Conclusions"],
|
|
54
|
+
"group": "body",
|
|
55
|
+
"isUnique": false
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "deceased",
|
|
59
|
+
"titles": ["Deceased"],
|
|
60
|
+
"synonyms": ["deceased"],
|
|
61
|
+
"isUnique": false
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"id": "discussion",
|
|
65
|
+
"synonyms": ["discussion"],
|
|
66
|
+
"titles": ["Discussion"],
|
|
67
|
+
"group": "body",
|
|
68
|
+
"isUnique": false
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"id": "equal",
|
|
72
|
+
"titles": ["Equal"],
|
|
73
|
+
"synonyms": ["equal"],
|
|
74
|
+
"isUnique": false
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": "ethics-statement",
|
|
78
|
+
"synonyms": ["ethics-statement"],
|
|
79
|
+
"titles": ["Ethics Statement"],
|
|
80
|
+
"group": "backmatter",
|
|
81
|
+
"isUnique": true
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"id": "financial-disclosure",
|
|
85
|
+
"synonyms": ["financial-disclosure", "funding information"],
|
|
86
|
+
"titles": ["Financial Disclosure"],
|
|
87
|
+
"group": "backmatter",
|
|
88
|
+
"isUnique": true
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"id": "abstract-teaser",
|
|
92
|
+
"titles": ["Abstract Teaser"],
|
|
93
|
+
"synonyms": ["abstract-teaser"],
|
|
94
|
+
"isUnique": false
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"id": "intro",
|
|
98
|
+
"synonyms": ["intro", "introduction"],
|
|
99
|
+
"titles": ["Introduction"],
|
|
100
|
+
"group": "body",
|
|
101
|
+
"isUnique": false
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"id": "methods",
|
|
105
|
+
"synonyms": [
|
|
106
|
+
"materials",
|
|
107
|
+
"methods",
|
|
108
|
+
"materials and methods",
|
|
109
|
+
"materials & methods"
|
|
110
|
+
],
|
|
111
|
+
"titles": ["Materials & Methods"],
|
|
112
|
+
"group": "body",
|
|
113
|
+
"isUnique": false
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"id": "present-address",
|
|
117
|
+
"titles": ["Present Address"],
|
|
118
|
+
"synonyms": ["present-address"],
|
|
119
|
+
"isUnique": false
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"id": "presented-at",
|
|
123
|
+
"titles": ["Presented at"],
|
|
124
|
+
"synonyms": ["presented-at"],
|
|
125
|
+
"isUnique": false
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"id": "previously-at",
|
|
129
|
+
"titles": ["Previously at"],
|
|
130
|
+
"synonyms": ["previously-at"],
|
|
131
|
+
"isUnique": false
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"id": "results",
|
|
135
|
+
"synonyms": ["results"],
|
|
136
|
+
"titles": ["Results"],
|
|
137
|
+
"group": "body",
|
|
138
|
+
"isUnique": false
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"id": "review",
|
|
142
|
+
"titles": ["Review"],
|
|
143
|
+
"synonyms": [],
|
|
144
|
+
"group": "body",
|
|
145
|
+
"isUnique": false
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"id": "supplementary-material",
|
|
149
|
+
"synonyms": ["supplementary-material"],
|
|
150
|
+
"titles": ["Supplementary Material"],
|
|
151
|
+
"group": "backmatter",
|
|
152
|
+
"isUnique": true
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"id": "supported-by",
|
|
156
|
+
"synonyms": ["supported-by"],
|
|
157
|
+
"titles": ["Supported By"],
|
|
158
|
+
"group": "backmatter",
|
|
159
|
+
"isUnique": true
|
|
160
|
+
}
|
|
161
|
+
]
|
|
@@ -0,0 +1,55 @@
|
|
|
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 { ProsemirrorTestChain, TestEditorView } from 'jest-prosemirror'
|
|
19
|
+
import { EditorState } from 'prosemirror-state'
|
|
20
|
+
import { EditorView } from 'prosemirror-view'
|
|
21
|
+
|
|
22
|
+
import createPlugins from '../configs/editor-plugins'
|
|
23
|
+
import createNodeViews from '../configs/editor-views'
|
|
24
|
+
import { defaultEditorProps } from './default-editor-data'
|
|
25
|
+
import { polyfillDom } from './polyfill-dom'
|
|
26
|
+
|
|
27
|
+
export function parseDoc(json: { [key: string]: unknown }) {
|
|
28
|
+
return schema.nodeFromJSON(json)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function setupEditor() {
|
|
32
|
+
polyfillDom()
|
|
33
|
+
|
|
34
|
+
const props = { ...defaultEditorProps }
|
|
35
|
+
const { doc } = props
|
|
36
|
+
const place = document.body.appendChild(document.createElement('div'))
|
|
37
|
+
const state = EditorState.create({
|
|
38
|
+
doc,
|
|
39
|
+
schema,
|
|
40
|
+
plugins: createPlugins(props),
|
|
41
|
+
})
|
|
42
|
+
const view = new EditorView(place, {
|
|
43
|
+
state,
|
|
44
|
+
scrollMargin: {
|
|
45
|
+
top: 100,
|
|
46
|
+
bottom: 100,
|
|
47
|
+
left: 0,
|
|
48
|
+
right: 0,
|
|
49
|
+
},
|
|
50
|
+
handleScrollToSelection: () => true,
|
|
51
|
+
nodeViews: createNodeViews(props, () => {}), // eslint-disable-line @typescript-eslint/no-empty-function
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
return ProsemirrorTestChain.of(view as TestEditorView)
|
|
55
|
+
}
|
package/src/tests.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
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 { TextDecoder, TextEncoder } from 'util'
|
|
18
|
+
import { v4 as uuid } from 'uuid'
|
|
19
|
+
import { expect, vi } from 'vitest'
|
|
20
|
+
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
22
|
+
expect.addSnapshotSerializer(require('jest-prosemirror/serializer'))
|
|
23
|
+
|
|
24
|
+
process.env.API_BASE_URL = 'https://127.0.0.1/'
|
|
25
|
+
|
|
26
|
+
const supportedCommands: string[] = []
|
|
27
|
+
|
|
28
|
+
Object.defineProperty(document, 'queryCommandSupported', {
|
|
29
|
+
value: (cmd: string) => supportedCommands.includes(cmd),
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
Object.defineProperty(document, 'execCommand', {
|
|
33
|
+
value: (cmd: string) => supportedCommands.includes(cmd),
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
if (!window.URL.createObjectURL) {
|
|
37
|
+
Object.defineProperty(window.URL, 'createObjectURL', {
|
|
38
|
+
value: vi.fn(() => 'blob:https://localhost/' + uuid()),
|
|
39
|
+
})
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
Object.assign(global, { TextDecoder, TextEncoder })
|