@manuscripts/body-editor 3.12.67 → 3.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
@@ -0,0 +1,82 @@
|
|
|
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 { ManuscriptNode } from '@manuscripts/transform'
|
|
18
|
+
|
|
19
|
+
import { Dispatch } from '../commands'
|
|
20
|
+
import { EditorProps } from '../configs/ManuscriptsEditor'
|
|
21
|
+
import { NodeViewCreator } from '../types'
|
|
22
|
+
import { BaseNodeView } from './base_node_view'
|
|
23
|
+
import { addTrackChangesAttributes } from '@manuscripts/track-changes-plugin'
|
|
24
|
+
|
|
25
|
+
export const createEditableNodeView =
|
|
26
|
+
<T extends BaseNodeView<ManuscriptNode>>(
|
|
27
|
+
type: new (...args: any[]) => T // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
28
|
+
) =>
|
|
29
|
+
(props: EditorProps, dispatch?: Dispatch): NodeViewCreator<T> =>
|
|
30
|
+
(node, view, getPos, decorations) => {
|
|
31
|
+
const nodeView = new type(
|
|
32
|
+
{ ...props, dispatch },
|
|
33
|
+
node,
|
|
34
|
+
view,
|
|
35
|
+
getPos,
|
|
36
|
+
decorations
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
nodeView.initialise()
|
|
40
|
+
|
|
41
|
+
return nodeView
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export const createNodeView = createEditableNodeView
|
|
45
|
+
|
|
46
|
+
export const createNodeOrElementView =
|
|
47
|
+
<T extends BaseNodeView<ManuscriptNode>>(
|
|
48
|
+
type: new (...args: any[]) => T, // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
49
|
+
tagName: string,
|
|
50
|
+
callback?: (node: ManuscriptNode, dom: HTMLElement) => void
|
|
51
|
+
) =>
|
|
52
|
+
(props: EditorProps): NodeViewCreator<T> =>
|
|
53
|
+
(node, view, getPos, decorations) => {
|
|
54
|
+
// TODO: look for parent Section instead?
|
|
55
|
+
|
|
56
|
+
for (const decoration of decorations) {
|
|
57
|
+
if (decoration.spec.element) {
|
|
58
|
+
const nodeView = new type(props, node, view, getPos, decorations)
|
|
59
|
+
|
|
60
|
+
nodeView.initialise()
|
|
61
|
+
|
|
62
|
+
return nodeView
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const dom = document.createElement(tagName)
|
|
67
|
+
|
|
68
|
+
if (callback) {
|
|
69
|
+
callback(node, dom)
|
|
70
|
+
}
|
|
71
|
+
if (node.attrs.id) {
|
|
72
|
+
dom.id = node.attrs.id
|
|
73
|
+
}
|
|
74
|
+
addTrackChangesAttributes(node.attrs, dom)
|
|
75
|
+
|
|
76
|
+
const nodeView = {
|
|
77
|
+
dom,
|
|
78
|
+
contentDOM: dom,
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return nodeView as T
|
|
82
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
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
|
+
CrossReferenceNode,
|
|
19
|
+
ManuscriptNodeView,
|
|
20
|
+
Target,
|
|
21
|
+
} from '@manuscripts/transform'
|
|
22
|
+
|
|
23
|
+
import { handleEnterKey } from '../lib/navigation-utils'
|
|
24
|
+
import { objectsKey } from '../plugins/objects'
|
|
25
|
+
import { Trackable } from '../types'
|
|
26
|
+
import { BaseNodeView } from './base_node_view'
|
|
27
|
+
import { createNodeView } from './creators'
|
|
28
|
+
|
|
29
|
+
export class CrossReferenceView
|
|
30
|
+
extends BaseNodeView<Trackable<CrossReferenceNode>>
|
|
31
|
+
implements ManuscriptNodeView
|
|
32
|
+
{
|
|
33
|
+
public handleClick = () => {
|
|
34
|
+
const rids = this.node.attrs.rids
|
|
35
|
+
if (!rids.length) {
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
this.props.navigate({
|
|
39
|
+
pathname: this.props.location.pathname,
|
|
40
|
+
hash: '#' + rids[0],
|
|
41
|
+
})
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public updateContents() {
|
|
45
|
+
super.updateContents()
|
|
46
|
+
const targets = objectsKey.getState(this.view.state) as Map<string, Target>
|
|
47
|
+
const attrs = this.node.attrs
|
|
48
|
+
|
|
49
|
+
const label = attrs.rids.length && targets.get(attrs.rids[0])?.label
|
|
50
|
+
// attrs.label contains custom text inserted at cross-reference creation time
|
|
51
|
+
this.dom.textContent = attrs.label || label || ''
|
|
52
|
+
this.dom.addEventListener('click', this.handleClick)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public initialise = () => {
|
|
56
|
+
this.createDOM()
|
|
57
|
+
this.updateContents()
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public ignoreMutation = () => true
|
|
61
|
+
|
|
62
|
+
public createDOM = () => {
|
|
63
|
+
this.dom = document.createElement('span')
|
|
64
|
+
this.dom.className = 'cross-reference'
|
|
65
|
+
this.dom.tabIndex = 0
|
|
66
|
+
|
|
67
|
+
this.dom.addEventListener(
|
|
68
|
+
'keydown',
|
|
69
|
+
handleEnterKey(() => this.handleClick())
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export default createNodeView(CrossReferenceView)
|
|
@@ -0,0 +1,113 @@
|
|
|
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 { skipTracking } from '@manuscripts/track-changes-plugin'
|
|
18
|
+
import { schema, Target } from '@manuscripts/transform'
|
|
19
|
+
import { TextSelection } from 'prosemirror-state'
|
|
20
|
+
|
|
21
|
+
import { CrossReferenceItems } from '../components/views/CrossReferenceItems'
|
|
22
|
+
import { objectsKey } from '../plugins/objects'
|
|
23
|
+
import { createEditableNodeView } from './creators'
|
|
24
|
+
import { CrossReferenceView } from './cross_reference'
|
|
25
|
+
import ReactSubView from './ReactSubView'
|
|
26
|
+
|
|
27
|
+
export class CrossReferenceEditableView extends CrossReferenceView {
|
|
28
|
+
protected popperContainer: HTMLDivElement
|
|
29
|
+
|
|
30
|
+
public selectNode = () => {
|
|
31
|
+
const { getCapabilities } = this.props
|
|
32
|
+
|
|
33
|
+
const rids = this.node.attrs.rids
|
|
34
|
+
const can = getCapabilities()
|
|
35
|
+
|
|
36
|
+
if (!can?.editArticle || rids.length) {
|
|
37
|
+
return
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const componentProps = {
|
|
41
|
+
handleSelect: this.handleSelect,
|
|
42
|
+
targets: this.getTargets(),
|
|
43
|
+
handleCancel: this.handleCancel,
|
|
44
|
+
currentTargetId: rids[0],
|
|
45
|
+
currentCustomLabel: this.node.attrs.label,
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
this.popperContainer = ReactSubView(
|
|
49
|
+
this.props,
|
|
50
|
+
CrossReferenceItems,
|
|
51
|
+
componentProps,
|
|
52
|
+
this.node,
|
|
53
|
+
this.getPos,
|
|
54
|
+
this.view,
|
|
55
|
+
['cross-reference-editor']
|
|
56
|
+
)
|
|
57
|
+
this.popperContainer.setAttribute('tabindex', '0')
|
|
58
|
+
this.props.popper.show(this.dom, this.popperContainer, 'auto')
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
public destroy = () => {
|
|
62
|
+
this.props.popper.destroy()
|
|
63
|
+
this.popperContainer?.remove()
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public deselectNode = () => {
|
|
67
|
+
this.handleCancel()
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public getTargets = () => {
|
|
71
|
+
const excludedTypes = [schema.nodes.image_element.name]
|
|
72
|
+
|
|
73
|
+
const targets = objectsKey.getState(this.view.state) as Map<string, Target>
|
|
74
|
+
|
|
75
|
+
return Array.from(targets.values()).filter(
|
|
76
|
+
(t) => !excludedTypes.includes(t.type)
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public handleCancel = () => {
|
|
81
|
+
if (!this.node.attrs.rids.length) {
|
|
82
|
+
const { state } = this.view
|
|
83
|
+
|
|
84
|
+
const pos = this.getPos()
|
|
85
|
+
const tr = state.tr.delete(pos, pos + this.node.nodeSize)
|
|
86
|
+
tr.setSelection(TextSelection.create(tr.doc, pos))
|
|
87
|
+
skipTracking(tr)
|
|
88
|
+
this.view.dispatch(tr)
|
|
89
|
+
} else {
|
|
90
|
+
this.destroy()
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
public handleSelect = async (rid: string, label?: string) => {
|
|
95
|
+
const { state } = this.view
|
|
96
|
+
|
|
97
|
+
const pos = this.getPos()
|
|
98
|
+
|
|
99
|
+
const tr = state.tr.setNodeMarkup(pos, undefined, {
|
|
100
|
+
...this.node.attrs,
|
|
101
|
+
label,
|
|
102
|
+
rids: [rid],
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
const selection = TextSelection.create(tr.doc, pos)
|
|
106
|
+
|
|
107
|
+
this.view.dispatch(tr.setSelection(selection))
|
|
108
|
+
|
|
109
|
+
this.destroy()
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export default createEditableNodeView(CrossReferenceEditableView)
|
|
@@ -0,0 +1,141 @@
|
|
|
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 { ManuscriptNode, schema } from '@manuscripts/transform'
|
|
18
|
+
|
|
19
|
+
import { ContextMenu, contextMenuBtnClass } from '../lib/context-menu'
|
|
20
|
+
import { hasParent, isNotNull } from '../lib/utils'
|
|
21
|
+
import BlockView from './block_view'
|
|
22
|
+
import { createKeyboardInteraction } from '../lib/navigation-utils'
|
|
23
|
+
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
25
|
+
type Constructor<T> = new (...args: any[]) => T
|
|
26
|
+
|
|
27
|
+
export const EditableBlock = <T extends Constructor<BlockView<ManuscriptNode>>>(
|
|
28
|
+
Base: T
|
|
29
|
+
) => {
|
|
30
|
+
return class extends Base {
|
|
31
|
+
public gutterButtons() {
|
|
32
|
+
const buttons = [this.createAddButton(), this.createEditButton()].filter(
|
|
33
|
+
isNotNull
|
|
34
|
+
)
|
|
35
|
+
// roving tabindex: first existing button is tabbable
|
|
36
|
+
buttons.forEach((btn) => (btn.tabIndex = -1))
|
|
37
|
+
if (buttons.length > 0) {
|
|
38
|
+
buttons[0].tabIndex = 0
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return buttons
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public actionGutterButtons() {
|
|
45
|
+
return []
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public createAddButton() {
|
|
49
|
+
const hasAccess = this.props.getCapabilities()?.editArticle
|
|
50
|
+
if (!hasAccess) {
|
|
51
|
+
return null
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const $pos = this.view.state.doc.resolve(this.getPos())
|
|
55
|
+
const nodeType = this.node.type
|
|
56
|
+
if (
|
|
57
|
+
nodeType === schema.nodes.hero_image ||
|
|
58
|
+
nodeType === schema.nodes.subtitles ||
|
|
59
|
+
nodeType === schema.nodes.supplements ||
|
|
60
|
+
hasParent($pos, [
|
|
61
|
+
schema.nodes.keywords,
|
|
62
|
+
schema.nodes.bibliography_section,
|
|
63
|
+
schema.nodes.footnotes_section,
|
|
64
|
+
])
|
|
65
|
+
) {
|
|
66
|
+
return null
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const button = document.createElement('a')
|
|
70
|
+
button.classList.add('add-block', contextMenuBtnClass)
|
|
71
|
+
button.classList.add('add-block-after')
|
|
72
|
+
button.setAttribute('role', 'button')
|
|
73
|
+
button.setAttribute('aria-label', `Add an element below`)
|
|
74
|
+
button.setAttribute('data-balloon-pos', 'down-left')
|
|
75
|
+
const handleClick = (event: Event) => {
|
|
76
|
+
event.preventDefault()
|
|
77
|
+
|
|
78
|
+
const menu = this.createMenu()
|
|
79
|
+
menu.showAddMenu(event.currentTarget as Element)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
button.addEventListener('mousedown', handleClick)
|
|
83
|
+
createKeyboardInteraction({
|
|
84
|
+
container: button,
|
|
85
|
+
additionalKeys: {
|
|
86
|
+
Enter: handleClick,
|
|
87
|
+
ArrowRight: () => {
|
|
88
|
+
const parent = button.parentElement
|
|
89
|
+
const editButton = parent?.querySelector(
|
|
90
|
+
'.edit-block'
|
|
91
|
+
) as HTMLElement
|
|
92
|
+
if (editButton) {
|
|
93
|
+
editButton.focus()
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
return button
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
public createEditButton(): HTMLElement | null {
|
|
103
|
+
if (!this.props.getCapabilities()?.editArticle) {
|
|
104
|
+
return null
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const button = document.createElement('a')
|
|
108
|
+
button.classList.add('edit-block', contextMenuBtnClass)
|
|
109
|
+
button.setAttribute('role', 'button')
|
|
110
|
+
button.setAttribute('aria-label', 'Open menu')
|
|
111
|
+
button.setAttribute('data-balloon-pos', 'down-left')
|
|
112
|
+
const handleClick = (event: Event) => {
|
|
113
|
+
event.preventDefault()
|
|
114
|
+
|
|
115
|
+
const menu = this.createMenu()
|
|
116
|
+
menu.showEditMenu(event.currentTarget as Element)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
button.addEventListener('mousedown', handleClick)
|
|
120
|
+
createKeyboardInteraction({
|
|
121
|
+
container: button,
|
|
122
|
+
additionalKeys: {
|
|
123
|
+
Enter: handleClick,
|
|
124
|
+
ArrowLeft: () => {
|
|
125
|
+
const parent = button.parentElement
|
|
126
|
+
const addButton = parent?.querySelector('.add-block') as HTMLElement
|
|
127
|
+
if (addButton) {
|
|
128
|
+
addButton.focus()
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
return button
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
public createMenu = () => {
|
|
138
|
+
return new ContextMenu(this.node, this.view, this.getPos)
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|