@manuscripts/body-editor 3.8.2 → 3.8.3

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 (37) hide show
  1. package/dist/cjs/commands.js +25 -2
  2. package/dist/cjs/components/LanguageDropdown/index.js +3 -2
  3. package/dist/cjs/components/references/ImportBibliographyModal.js +2 -2
  4. package/dist/cjs/configs/editor-plugins.js +2 -0
  5. package/dist/cjs/icons.js +13 -13
  6. package/dist/{es/components/LanguageDropdown → cjs/lib}/languages.js +10 -10
  7. package/dist/cjs/lib/popper.js +1 -0
  8. package/dist/cjs/plugins/section_category.js +1 -1
  9. package/dist/cjs/plugins/translations.js +96 -0
  10. package/dist/cjs/versions.js +1 -1
  11. package/dist/cjs/views/figure_element.js +1 -1
  12. package/dist/cjs/views/section.js +0 -80
  13. package/dist/cjs/views/translated_abstract.js +0 -66
  14. package/dist/es/commands.js +22 -0
  15. package/dist/es/components/LanguageDropdown/index.js +3 -2
  16. package/dist/es/components/references/ImportBibliographyModal.js +2 -2
  17. package/dist/es/configs/editor-plugins.js +2 -0
  18. package/dist/es/icons.js +13 -13
  19. package/dist/{cjs/components/LanguageDropdown → es/lib}/languages.js +5 -15
  20. package/dist/es/lib/popper.js +1 -0
  21. package/dist/es/plugins/section_category.js +1 -1
  22. package/dist/es/plugins/translations.js +94 -0
  23. package/dist/es/versions.js +1 -1
  24. package/dist/es/views/figure_element.js +2 -2
  25. package/dist/es/views/section.js +0 -80
  26. package/dist/es/views/translated_abstract.js +0 -66
  27. package/dist/types/commands.d.ts +1 -0
  28. package/dist/types/components/LanguageDropdown/index.d.ts +1 -1
  29. package/dist/types/configs/ManuscriptsEditor.d.ts +1 -1
  30. package/dist/types/icons.d.ts +1 -1
  31. package/dist/types/{components/LanguageDropdown → lib}/languages.d.ts +2 -11
  32. package/dist/types/plugins/translations.d.ts +19 -0
  33. package/dist/types/versions.d.ts +1 -1
  34. package/dist/types/views/section.d.ts +0 -7
  35. package/dist/types/views/translated_abstract.d.ts +0 -11
  36. package/package.json +1 -1
  37. package/styles/AdvancedEditor.css +52 -53
@@ -15,8 +15,8 @@
15
15
  * limitations under the License.
16
16
  */
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.addHeaderRow = exports.addRows = exports.addInlineComment = exports.addNodeComment = exports.createAndFillTableElement = exports.selectAllIsolating = exports.ignoreAtomBlockNodeForward = exports.isAtEndOfTextBlock = exports.ignoreMetaNodeBackspaceCommand = exports.ignoreAtomBlockNodeBackward = exports.isTextSelection = exports.isAtStartOfTextBlock = exports.insertTOCSection = exports.insertBibliographySection = exports.insertList = exports.insertKeywords = exports.insertAward = exports.insertAffiliation = exports.insertContributors = exports.insertGraphicalAbstract = exports.insertBackmatterSection = exports.insertAbstractSection = exports.insertSection = exports.insertBoxElement = exports.insertInlineFootnote = exports.insertFootnotesElement = exports.insertTableElementFooter = exports.insertInlineEquation = exports.insertCrossReference = exports.insertInlineCitation = exports.insertLink = exports.insertSectionLabel = exports.findPosBeforeFirstSubsection = exports.insertBreak = exports.deleteBlock = exports.insertBlock = exports.insertAttachment = exports.insertSupplement = exports.insertTable = exports.insertEmbed = exports.insertFigure = exports.insertGeneralTableFootnote = exports.insertInlineTableFootnote = exports.createBlock = exports.createSelection = exports.canInsert = exports.blockActive = exports.isNodeSelection = exports.markActive = exports.addToStart = void 0;
19
- exports.paste = exports.copySelection = exports.exitEditorToContainer = exports.ignoreEnterInSubtitles = exports.insertHeroImage = exports.activateSearchReplace = exports.activateSearch = exports.autoComplete = exports.addColumns = void 0;
18
+ exports.addRows = exports.addInlineComment = exports.addNodeComment = exports.createAndFillTableElement = exports.selectAllIsolating = exports.ignoreAtomBlockNodeForward = exports.isAtEndOfTextBlock = exports.ignoreMetaNodeBackspaceCommand = exports.ignoreAtomBlockNodeBackward = exports.isTextSelection = exports.isAtStartOfTextBlock = exports.insertTransAbstract = exports.insertTOCSection = exports.insertBibliographySection = exports.insertList = exports.insertKeywords = exports.insertAward = exports.insertAffiliation = exports.insertContributors = exports.insertGraphicalAbstract = exports.insertBackmatterSection = exports.insertAbstractSection = exports.insertSection = exports.insertBoxElement = exports.insertInlineFootnote = exports.insertFootnotesElement = exports.insertTableElementFooter = exports.insertInlineEquation = exports.insertCrossReference = exports.insertInlineCitation = exports.insertLink = exports.insertSectionLabel = exports.findPosBeforeFirstSubsection = exports.insertBreak = exports.deleteBlock = exports.insertBlock = exports.insertAttachment = exports.insertSupplement = exports.insertTable = exports.insertEmbed = exports.insertFigure = exports.insertGeneralTableFootnote = exports.insertInlineTableFootnote = exports.createBlock = exports.createSelection = exports.canInsert = exports.blockActive = exports.isNodeSelection = exports.markActive = exports.addToStart = void 0;
19
+ exports.paste = exports.copySelection = exports.exitEditorToContainer = exports.ignoreEnterInSubtitles = exports.insertHeroImage = exports.activateSearchReplace = exports.activateSearch = exports.autoComplete = exports.addColumns = exports.addHeaderRow = void 0;
20
20
  const json_schema_1 = require("@manuscripts/json-schema");
21
21
  const track_changes_plugin_1 = require("@manuscripts/track-changes-plugin");
22
22
  const transform_1 = require("@manuscripts/transform");
@@ -923,6 +923,29 @@ const insertTOCSection = () => {
923
923
  return false;
924
924
  };
925
925
  exports.insertTOCSection = insertTOCSection;
926
+ const insertTransAbstract = (state, dispatch, category) => {
927
+ if (!(0, template_1.templateAllows)(state, transform_1.schema.nodes.trans_abstract)) {
928
+ return false;
929
+ }
930
+ if (!dispatch) {
931
+ return true;
932
+ }
933
+ const lang = state.doc.attrs.primaryLanguageCode || 'en';
934
+ const title = transform_1.schema.nodes.section_title.create();
935
+ const paragraph = transform_1.schema.nodes.paragraph.create();
936
+ const node = transform_1.schema.nodes.trans_abstract.create({
937
+ lang,
938
+ category,
939
+ }, [title, paragraph]);
940
+ const abstracts = (0, doc_1.findAbstractsNode)(state.doc);
941
+ const pos = abstracts.pos + abstracts.node.nodeSize - 1;
942
+ const tr = state.tr.insert(pos, node);
943
+ const selection = prosemirror_state_1.TextSelection.create(tr.doc, pos + 1);
944
+ tr.setSelection(selection).scrollIntoView();
945
+ dispatch(tr);
946
+ return true;
947
+ };
948
+ exports.insertTransAbstract = insertTransAbstract;
926
949
  const findCutBefore = ($pos) => {
927
950
  if (!$pos.parent.type.spec.isolating) {
928
951
  for (let i = $pos.depth - 1; i >= 0; i--) {
@@ -54,7 +54,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
54
54
  const style_guide_1 = require("@manuscripts/style-guide");
55
55
  const react_1 = __importStar(require("react"));
56
56
  const styled_components_1 = __importDefault(require("styled-components"));
57
- const languages_1 = require("./languages");
57
+ const languages_1 = require("../../lib/languages");
58
58
  const LanguageOptionItem = ({ language, isSelected, onSelect }) => {
59
59
  const handleKeyDown = (event) => {
60
60
  if (event.key === 'Enter') {
@@ -133,7 +133,8 @@ const LanguageDropdown = ({ onLanguageSelect, onClose, currentLanguage = 'en', s
133
133
  onLanguageSelect(languageCode);
134
134
  };
135
135
  const getDisplayName = (languageCode) => {
136
- return (0, languages_1.getSelectedLanguageName)(languageCode, languages);
136
+ const lang = (0, languages_1.getLanguage)(languageCode, languages);
137
+ return (0, languages_1.getLanguageLabel)(lang);
137
138
  };
138
139
  return (react_1.default.createElement(style_guide_1.DropdownContainer, { ref: dropdownRef },
139
140
  showButton && (react_1.default.createElement(LanguageButton, { ref: (el) => {
@@ -97,7 +97,7 @@ const ImportBibliographyModal = ({ onCancel, onSave }) => {
97
97
  react_1.default.createElement(ModalBody, null,
98
98
  react_1.default.createElement(ModalTitle, null, "Import Bibliography"),
99
99
  react_1.default.createElement("p", null,
100
- react_1.default.createElement(SpanWithExample, { "data-tooltip-id": "import-example-tooltip", "data-tooltip-content": exampleBibtex, "data-tool": true }, "BibTex"),
100
+ react_1.default.createElement(SpanWithExample, { "data-tooltip-id": "import-example-tooltip", "data-tooltip-content": exampleBibtex }, "BibTex"),
101
101
  ",",
102
102
  ' ',
103
103
  react_1.default.createElement(SpanWithExample, { "data-tooltip-id": "import-example-tooltip", "data-tooltip-content": examplePubmed }, "PubMed"),
@@ -114,7 +114,7 @@ const ImportBibliographyModal = ({ onCancel, onSave }) => {
114
114
  ' ',
115
115
  "formats are supported"),
116
116
  react_1.default.createElement(ImportBibliographyForm_1.ImportBibliographyForm, { onCancel: handleCancel, onSave: handleSave }),
117
- react_1.default.createElement(Example, { id: "import-example-tooltip", place: "bottom", render: (s) => (react_1.default.createElement("pre", null, s.content)) })))));
117
+ react_1.default.createElement(Example, { id: "import-example-tooltip", place: "bottom", render: (s) => react_1.default.createElement("pre", null, s.content) })))));
118
118
  };
119
119
  exports.ImportBibliographyModal = ImportBibliographyModal;
120
120
  const ModalBody = styled_components_1.default.div `
@@ -51,6 +51,7 @@ const section_title_1 = __importDefault(require("../plugins/section_title"));
51
51
  const section_category_1 = __importDefault(require("../plugins/section_category"));
52
52
  const selected_suggestion_1 = __importDefault(require("../plugins/selected-suggestion"));
53
53
  const tables_cursor_fix_1 = __importDefault(require("../plugins/tables-cursor-fix"));
54
+ const translations_1 = __importDefault(require("../plugins/translations"));
54
55
  const rules_1 = __importDefault(require("../rules"));
55
56
  exports.default = (props) => {
56
57
  const allPlugins = [
@@ -78,6 +79,7 @@ exports.default = (props) => {
78
79
  (0, paragraphs_1.default)(),
79
80
  (0, placeholder_1.default)(),
80
81
  (0, add_subtitle_1.default)(),
82
+ (0, translations_1.default)(props),
81
83
  (0, prosemirror_tables_1.tableEditing)(),
82
84
  (0, selected_suggestion_1.default)(),
83
85
  (0, footnotes_1.default)(props),
package/dist/cjs/icons.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.fileMainDocumentIcon = exports.linkIcon = exports.translateIcon = exports.draggableIcon = exports.fileCorruptedIcon = exports.imageDefaultIcon = exports.imageLeftIcon = exports.imageRightIcon = exports.addBtnIcon = exports.plusIcon = exports.lockIcon = exports.scrollIcon = exports.sectionCategoryIcon = exports.editIcon = exports.deleteIcon = exports.alertIcon = exports.arrowUp = exports.arrowDown = exports.addAuthorIcon = void 0;
3
+ exports.tickIcon = exports.fileMainDocumentIcon = exports.linkIcon = exports.translateIcon = exports.draggableIcon = exports.fileCorruptedIcon = exports.imageDefaultIcon = exports.imageLeftIcon = exports.imageRightIcon = exports.plusIcon = exports.lockIcon = exports.scrollIcon = exports.sectionCategoryIcon = exports.editIcon = exports.deleteIcon = exports.alertIcon = exports.arrowUp = exports.arrowDown = exports.addAuthorIcon = void 0;
4
4
  const style_guide_1 = require("@manuscripts/style-guide");
5
5
  const react_1 = require("react");
6
6
  const server_1 = require("react-dom/server");
@@ -10,17 +10,17 @@ exports.arrowDown = renderIcon(style_guide_1.ArrowDownCircleIcon);
10
10
  exports.arrowUp = renderIcon(style_guide_1.ArrowUpIcon);
11
11
  exports.alertIcon = renderIcon(style_guide_1.AlertIcon);
12
12
  exports.deleteIcon = renderIcon(style_guide_1.DeleteIcon);
13
- exports.editIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.EditIcon));
13
+ exports.editIcon = renderIcon(style_guide_1.EditIcon);
14
14
  exports.sectionCategoryIcon = renderIcon(style_guide_1.SectionCategoryIcon);
15
- exports.scrollIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.ScrollIcon));
16
- exports.lockIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.LockIcon));
15
+ exports.scrollIcon = renderIcon(style_guide_1.ScrollIcon);
16
+ exports.lockIcon = renderIcon(style_guide_1.LockIcon);
17
17
  exports.plusIcon = renderIcon(style_guide_1.PlusIcon);
18
- exports.addBtnIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.PlusIcon));
19
- exports.imageRightIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.ImageRightIcon));
20
- exports.imageLeftIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.ImageLeftIcon));
21
- exports.imageDefaultIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.ImageDefaultIcon));
22
- exports.fileCorruptedIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.FileCorruptedIcon));
23
- exports.draggableIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.DraggableIcon));
24
- exports.translateIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.TranslateIcon));
25
- exports.linkIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.LinkIcon));
26
- exports.fileMainDocumentIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.FileMainDocumentIcon));
18
+ exports.imageRightIcon = renderIcon(style_guide_1.ImageRightIcon);
19
+ exports.imageLeftIcon = renderIcon(style_guide_1.ImageLeftIcon);
20
+ exports.imageDefaultIcon = renderIcon(style_guide_1.ImageDefaultIcon);
21
+ exports.fileCorruptedIcon = renderIcon(style_guide_1.FileCorruptedIcon);
22
+ exports.draggableIcon = renderIcon(style_guide_1.DraggableIcon);
23
+ exports.translateIcon = renderIcon(style_guide_1.TranslateIcon);
24
+ exports.linkIcon = renderIcon(style_guide_1.LinkIcon);
25
+ exports.fileMainDocumentIcon = renderIcon(style_guide_1.FileMainDocumentIcon);
26
+ exports.tickIcon = renderIcon(style_guide_1.TickIcon);
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  /*!
2
3
  * © 2025 Atypon Systems LLC
3
4
  *
@@ -13,21 +14,20 @@
13
14
  * See the License for the specific language governing permissions and
14
15
  * limitations under the License.
15
16
  */
16
- export const ENGLISH_FALLBACK = {
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.getLanguageLabel = exports.getLanguage = void 0;
19
+ const ENGLISH = {
17
20
  code: 'en',
18
21
  name: 'English',
19
22
  nativeName: 'English',
20
23
  };
21
- export const getSelectedLanguageName = (selectedLanguage, allLanguages) => {
22
- if (!allLanguages.length) {
23
- return 'English (Default)';
24
- }
25
- const language = allLanguages.find((lang) => lang.code === selectedLanguage) ||
26
- ENGLISH_FALLBACK;
24
+ const getLanguage = (code, languages) => {
25
+ return languages.find((l) => l.code === code) || ENGLISH;
26
+ };
27
+ exports.getLanguage = getLanguage;
28
+ const getLanguageLabel = (language) => {
27
29
  return language.nativeName && language.nativeName !== language.name
28
30
  ? `${language.name} (${language.nativeName})`
29
31
  : language.name;
30
32
  };
31
- export const getLanguageDisplayName = (languageCode) => {
32
- return languageCode.toUpperCase();
33
- };
33
+ exports.getLanguageLabel = getLanguageLabel;
@@ -65,6 +65,7 @@ class PopperManager {
65
65
  }
66
66
  };
67
67
  if (contents.classList.contains('context-menu') ||
68
+ contents.classList.contains('language') ||
68
69
  contents.classList.contains('section-category')) {
69
70
  window.addEventListener('click', this.handleDocumentClick);
70
71
  }
@@ -16,7 +16,7 @@ exports.default = (props) => new prosemirror_state_1.Plugin({
16
16
  return value;
17
17
  }
18
18
  return buildPluginState(newState, props);
19
- }
19
+ },
20
20
  },
21
21
  props: {
22
22
  decorations: (state) => exports.sectionCategoryKey.getState(state)?.decorations || prosemirror_view_1.DecorationSet.empty,
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ /*!
3
+ * © 2019 Atypon Systems LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const transform_1 = require("@manuscripts/transform");
19
+ const prosemirror_state_1 = require("prosemirror-state");
20
+ const prosemirror_view_1 = require("prosemirror-view");
21
+ const commands_1 = require("../commands");
22
+ const icons_1 = require("../icons");
23
+ const languages_1 = require("../lib/languages");
24
+ const createMenuItem = (props, contents, handler, isSelected = false) => {
25
+ const item = document.createElement('div');
26
+ item.className = `menu-item ${isSelected ? 'selected' : ''}`;
27
+ item.textContent = contents;
28
+ item.addEventListener('mousedown', (event) => {
29
+ handler(event);
30
+ props.popper.destroy();
31
+ });
32
+ return item;
33
+ };
34
+ const createLanguageMenu = (props, selectedCode, onSelect) => {
35
+ const menu = document.createElement('div');
36
+ menu.className = 'language menu';
37
+ props.languages.forEach((language) => {
38
+ const item = createMenuItem(props, (0, languages_1.getLanguageLabel)(language), () => onSelect(language.code), selectedCode === language.code);
39
+ menu.appendChild(item);
40
+ });
41
+ return menu;
42
+ };
43
+ exports.default = (props) => new prosemirror_state_1.Plugin({
44
+ props: {
45
+ decorations: (state) => {
46
+ const can = props.getCapabilities();
47
+ const canEdit = can.editArticle && (0, commands_1.insertTransAbstract)(state);
48
+ const widgets = [];
49
+ state.doc.descendants((node, pos, parent) => {
50
+ if (node.type === transform_1.schema.nodes.section &&
51
+ parent?.type === transform_1.schema.nodes.abstracts &&
52
+ canEdit) {
53
+ widgets.push(prosemirror_view_1.Decoration.widget(pos + 1, (view) => {
54
+ const $span = document.createElement('span');
55
+ $span.className = 'add-trans-abstract';
56
+ $span.title = 'Add translation';
57
+ $span.innerHTML = `${icons_1.addAuthorIcon} <span class="add-trans-abstract-text">Add translation</span>`;
58
+ $span.addEventListener('mousedown', (event) => {
59
+ event.preventDefault();
60
+ event.stopPropagation();
61
+ (0, commands_1.insertTransAbstract)(view.state, view.dispatch, node.attrs.category);
62
+ });
63
+ return $span;
64
+ }));
65
+ }
66
+ if (node.type === transform_1.schema.nodes.trans_abstract) {
67
+ widgets.push(prosemirror_view_1.Decoration.widget(pos + 1, (view) => {
68
+ const $btn = document.createElement('span');
69
+ $btn.className = 'language-selector-btn';
70
+ $btn.setAttribute('data-cy', 'language-selector-btn');
71
+ $btn.contentEditable = 'false';
72
+ const code = node.attrs.lang || 'en';
73
+ const lang = (0, languages_1.getLanguage)(code, props.languages);
74
+ const label = (0, languages_1.getLanguageLabel)(lang);
75
+ $btn.innerHTML = `<span>${label}</span> ${icons_1.translateIcon}`;
76
+ if (canEdit) {
77
+ $btn.addEventListener('mousedown', (event) => {
78
+ event.preventDefault();
79
+ event.stopPropagation();
80
+ props.popper.destroy();
81
+ const handleSelect = (code) => {
82
+ const tr = view.state.tr.setNodeAttribute(pos, 'lang', code);
83
+ view.dispatch(tr);
84
+ };
85
+ const menu = createLanguageMenu(props, code, handleSelect);
86
+ props.popper.show($btn, menu, 'bottom-end', false);
87
+ });
88
+ }
89
+ return $btn;
90
+ }));
91
+ }
92
+ });
93
+ return prosemirror_view_1.DecorationSet.create(state.doc, widgets);
94
+ },
95
+ },
96
+ });
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MATHJAX_VERSION = exports.VERSION = void 0;
4
- exports.VERSION = '3.8.2';
4
+ exports.VERSION = '3.8.3';
5
5
  exports.MATHJAX_VERSION = '3.2.2';
@@ -70,7 +70,7 @@ class FigureElementView extends image_element_1.ImageElementView {
70
70
  if (this.props.getCapabilities()?.editArticle) {
71
71
  this.addFigureBtn = Object.assign(document.createElement('button'), {
72
72
  className: 'add-button',
73
- innerHTML: icons_1.addBtnIcon,
73
+ innerHTML: icons_1.addAuthorIcon,
74
74
  title: 'Add figure',
75
75
  });
76
76
  this.addFigureBtn.addEventListener('click', () => this.addFigure());
@@ -19,10 +19,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
19
19
  };
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
21
  exports.SectionView = void 0;
22
- const transform_1 = require("@manuscripts/transform");
23
- const prosemirror_state_1 = require("prosemirror-state");
24
- const prosemirror_utils_1 = require("prosemirror-utils");
25
- const icons_1 = require("../icons");
26
22
  const section_title_1 = require("../plugins/section_title");
27
23
  const block_view_1 = __importDefault(require("./block_view"));
28
24
  const creators_1 = require("./creators");
@@ -30,26 +26,6 @@ class SectionView extends block_view_1.default {
30
26
  constructor() {
31
27
  super(...arguments);
32
28
  this.elementType = 'section';
33
- this.addTranslationButton = null;
34
- this.addTranslation = () => {
35
- const { state } = this.view;
36
- const { schema } = state;
37
- const documentLanguage = state.doc.attrs.primaryLanguageCode || 'en';
38
- const sectionTitle = schema.nodes.section_title.create();
39
- const paragraph = schema.nodes.paragraph.create();
40
- const transAbstractNode = schema.nodes.trans_abstract.create({
41
- lang: documentLanguage,
42
- category: this.node.attrs.category,
43
- }, [sectionTitle, paragraph]);
44
- const abstracts = (0, prosemirror_utils_1.findParentNodeOfTypeClosestToPos)(this.view.state.doc.resolve(this.getPos()), schema.nodes.abstracts);
45
- if (abstracts) {
46
- const tr = state.tr.insert(abstracts.pos + abstracts.node.nodeSize - 1, transAbstractNode);
47
- const titlePos = abstracts.pos + abstracts.node.nodeSize;
48
- const selection = prosemirror_state_1.TextSelection.create(tr.doc, titlePos);
49
- tr.setSelection(selection).scrollIntoView();
50
- this.view.dispatch(tr);
51
- }
52
- };
53
29
  }
54
30
  initialise() {
55
31
  this.createDOM();
@@ -64,7 +40,6 @@ class SectionView extends block_view_1.default {
64
40
  super.updateContents();
65
41
  this.dom.setAttribute('data-category', this.node.attrs.category);
66
42
  this.handleSectionNumbering();
67
- this.handleAddTranslationButton();
68
43
  }
69
44
  handleSectionNumbering() {
70
45
  const sections = section_title_1.sectionTitleKey.getState(this.view.state);
@@ -79,62 +54,7 @@ class SectionView extends block_view_1.default {
79
54
  }
80
55
  });
81
56
  }
82
- handleAddTranslationButton() {
83
- this.cleanupAddTranslationButton();
84
- const $pos = this.view.state.doc.resolve(this.getPos());
85
- const isInAbstracts = (0, prosemirror_utils_1.findParentNodeOfTypeClosestToPos)($pos, transform_1.schema.nodes.abstracts);
86
- const isAbstractCategory = this.isAbstractCategory(this.node.attrs.category);
87
- if (isInAbstracts &&
88
- isAbstractCategory &&
89
- this.props.getCapabilities()?.editArticle) {
90
- this.createAddTranslationButton();
91
- }
92
- }
93
- isAbstractCategory(category) {
94
- const sectionCategories = this.props.sectionCategories;
95
- if (!sectionCategories) {
96
- return false;
97
- }
98
- const categoryObj = sectionCategories.get(category);
99
- if (!categoryObj) {
100
- return false;
101
- }
102
- return (categoryObj.group === 'abstracts' ||
103
- categoryObj.group === 'abstracts-graphic');
104
- }
105
- createAddTranslationButton() {
106
- const btnContainer = document.createElement('div');
107
- btnContainer.classList.add('add-translation-container');
108
- btnContainer.addEventListener('mousedown', (event) => {
109
- event.preventDefault();
110
- event.stopPropagation();
111
- this.addTranslation();
112
- });
113
- const addTranslationBtn = Object.assign(document.createElement('button'), {
114
- className: 'add-button',
115
- innerHTML: icons_1.addBtnIcon,
116
- title: 'Add Translation',
117
- type: 'button',
118
- });
119
- const textElement = document.createElement('span');
120
- textElement.textContent = 'Add translation';
121
- textElement.classList.add('add-translation-text');
122
- btnContainer.appendChild(addTranslationBtn);
123
- btnContainer.appendChild(textElement);
124
- this.dom.appendChild(btnContainer);
125
- this.addTranslationButton = addTranslationBtn;
126
- }
127
- cleanupAddTranslationButton() {
128
- if (this.addTranslationButton) {
129
- const container = this.addTranslationButton.closest('.add-translation-container');
130
- if (container) {
131
- container.remove();
132
- }
133
- this.addTranslationButton = null;
134
- }
135
- }
136
57
  destroy() {
137
- this.cleanupAddTranslationButton();
138
58
  super.destroy();
139
59
  }
140
60
  }
@@ -19,27 +19,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
19
19
  };
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
21
  exports.TransAbstractView = void 0;
22
- const LanguageDropdown_1 = __importDefault(require("../components/LanguageDropdown"));
23
- const languages_1 = require("../components/LanguageDropdown/languages");
24
- const icons_1 = require("../icons");
25
22
  const block_view_1 = __importDefault(require("./block_view"));
26
23
  const creators_1 = require("./creators");
27
- const ReactSubView_1 = __importDefault(require("./ReactSubView"));
28
24
  class TransAbstractView extends block_view_1.default {
29
25
  constructor() {
30
26
  super(...arguments);
31
27
  this.elementType = 'section';
32
- this.languageButton = null;
33
- this.handleButtonClick = (e) => {
34
- e.stopPropagation();
35
- if (this.languageButton) {
36
- this.showLanguageDropdown(this.languageButton);
37
- }
38
- };
39
- this.handleLanguageChange = (languageCode) => {
40
- this.updateNodeLanguage(languageCode);
41
- this.updateButtonContent(languageCode);
42
- };
43
28
  }
44
29
  createDOM() {
45
30
  super.createDOM();
@@ -54,11 +39,6 @@ class TransAbstractView extends block_view_1.default {
54
39
  updateContents() {
55
40
  super.updateContents();
56
41
  this.updateAttributes();
57
- this.handleLanguageSelector();
58
- }
59
- destroy() {
60
- this.cleanupLanguageButton();
61
- super.destroy();
62
42
  }
63
43
  updateAttributes() {
64
44
  if (this.contentDOM && this.node.attrs.lang) {
@@ -68,52 +48,6 @@ class TransAbstractView extends block_view_1.default {
68
48
  this.dom.setAttribute('data-category', this.node.attrs.category);
69
49
  }
70
50
  }
71
- handleLanguageSelector() {
72
- this.cleanupLanguageButton();
73
- if (this.props.getCapabilities()?.editArticle) {
74
- this.createLanguageButton();
75
- }
76
- }
77
- createLanguageButton() {
78
- this.languageButton = document.createElement('button');
79
- this.languageButton.classList.add('language-selector-btn');
80
- this.languageButton.setAttribute('data-cy', 'language-selector-btn');
81
- this.updateButtonContent();
82
- this.languageButton.addEventListener('click', this.handleButtonClick);
83
- this.dom.prepend(this.languageButton);
84
- }
85
- cleanupLanguageButton() {
86
- if (this.languageButton) {
87
- this.languageButton.removeEventListener('click', this.handleButtonClick);
88
- this.languageButton.remove();
89
- this.languageButton = null;
90
- }
91
- }
92
- updateButtonContent(languageCode = this.node.attrs.lang || 'en') {
93
- if (!this.languageButton) {
94
- return;
95
- }
96
- const languageName = (0, languages_1.getSelectedLanguageName)(languageCode, this.props.languages || []);
97
- this.languageButton.innerHTML = `${languageName} ${icons_1.translateIcon}`;
98
- }
99
- showLanguageDropdown(trigger) {
100
- const currentLanguage = this.node.attrs.lang || 'en';
101
- this.props.popper.show(trigger, this.createDropdownContainer(currentLanguage), 'bottom-start', false);
102
- }
103
- createDropdownContainer(currentLanguage) {
104
- return (0, ReactSubView_1.default)(this.props, LanguageDropdown_1.default, {
105
- showButton: false,
106
- currentLanguage,
107
- onLanguageSelect: this.handleLanguageChange,
108
- }, this.node, this.getPos.bind(this), this.view, ['abstracts-language-dropdown']);
109
- }
110
- updateNodeLanguage(languageCode) {
111
- const tr = this.view.state.tr.setNodeMarkup(this.getPos(), undefined, {
112
- ...this.node.attrs,
113
- lang: languageCode,
114
- });
115
- this.view.dispatch(tr);
116
- }
117
51
  }
118
52
  exports.TransAbstractView = TransAbstractView;
119
53
  exports.default = (0, creators_1.createNodeView)(TransAbstractView);
@@ -881,6 +881,28 @@ export const insertBibliographySection = () => {
881
881
  export const insertTOCSection = () => {
882
882
  return false;
883
883
  };
884
+ export const insertTransAbstract = (state, dispatch, category) => {
885
+ if (!templateAllows(state, schema.nodes.trans_abstract)) {
886
+ return false;
887
+ }
888
+ if (!dispatch) {
889
+ return true;
890
+ }
891
+ const lang = state.doc.attrs.primaryLanguageCode || 'en';
892
+ const title = schema.nodes.section_title.create();
893
+ const paragraph = schema.nodes.paragraph.create();
894
+ const node = schema.nodes.trans_abstract.create({
895
+ lang,
896
+ category,
897
+ }, [title, paragraph]);
898
+ const abstracts = findAbstractsNode(state.doc);
899
+ const pos = abstracts.pos + abstracts.node.nodeSize - 1;
900
+ const tr = state.tr.insert(pos, node);
901
+ const selection = TextSelection.create(tr.doc, pos + 1);
902
+ tr.setSelection(selection).scrollIntoView();
903
+ dispatch(tr);
904
+ return true;
905
+ };
884
906
  const findCutBefore = ($pos) => {
885
907
  if (!$pos.parent.type.spec.isolating) {
886
908
  for (let i = $pos.depth - 1; i >= 0; i--) {
@@ -16,7 +16,7 @@
16
16
  import { DropdownContainer, DropdownList, TickIcon, TriangleCollapsedIcon, } from '@manuscripts/style-guide';
17
17
  import React, { useEffect, useRef, useState } from 'react';
18
18
  import styled from 'styled-components';
19
- import { getSelectedLanguageName } from './languages';
19
+ import { getLanguage, getLanguageLabel } from '../../lib/languages';
20
20
  const LanguageOptionItem = ({ language, isSelected, onSelect }) => {
21
21
  const handleKeyDown = (event) => {
22
22
  if (event.key === 'Enter') {
@@ -95,7 +95,8 @@ const LanguageDropdown = ({ onLanguageSelect, onClose, currentLanguage = 'en', s
95
95
  onLanguageSelect(languageCode);
96
96
  };
97
97
  const getDisplayName = (languageCode) => {
98
- return getSelectedLanguageName(languageCode, languages);
98
+ const lang = getLanguage(languageCode, languages);
99
+ return getLanguageLabel(lang);
99
100
  };
100
101
  return (React.createElement(DropdownContainer, { ref: dropdownRef },
101
102
  showButton && (React.createElement(LanguageButton, { ref: (el) => {
@@ -58,7 +58,7 @@ export const ImportBibliographyModal = ({ onCancel, onSave }) => {
58
58
  React.createElement(ModalBody, null,
59
59
  React.createElement(ModalTitle, null, "Import Bibliography"),
60
60
  React.createElement("p", null,
61
- React.createElement(SpanWithExample, { "data-tooltip-id": "import-example-tooltip", "data-tooltip-content": exampleBibtex, "data-tool": true }, "BibTex"),
61
+ React.createElement(SpanWithExample, { "data-tooltip-id": "import-example-tooltip", "data-tooltip-content": exampleBibtex }, "BibTex"),
62
62
  ",",
63
63
  ' ',
64
64
  React.createElement(SpanWithExample, { "data-tooltip-id": "import-example-tooltip", "data-tooltip-content": examplePubmed }, "PubMed"),
@@ -75,7 +75,7 @@ export const ImportBibliographyModal = ({ onCancel, onSave }) => {
75
75
  ' ',
76
76
  "formats are supported"),
77
77
  React.createElement(ImportBibliographyForm, { onCancel: handleCancel, onSave: handleSave }),
78
- React.createElement(Example, { id: "import-example-tooltip", place: "bottom", render: (s) => (React.createElement("pre", null, s.content)) })))));
78
+ React.createElement(Example, { id: "import-example-tooltip", place: "bottom", render: (s) => React.createElement("pre", null, s.content) })))));
79
79
  };
80
80
  const ModalBody = styled.div `
81
81
  box-sizing: border-box;
@@ -46,6 +46,7 @@ import section_title from '../plugins/section_title';
46
46
  import section_category from '../plugins/section_category';
47
47
  import selected_suggestion from '../plugins/selected-suggestion';
48
48
  import table_editing_fix from '../plugins/tables-cursor-fix';
49
+ import translations from '../plugins/translations';
49
50
  import rules from '../rules';
50
51
  export default (props) => {
51
52
  const allPlugins = [
@@ -73,6 +74,7 @@ export default (props) => {
73
74
  paragraphs(),
74
75
  placeholder(),
75
76
  add_subtitle(),
77
+ translations(props),
76
78
  tableEditing(),
77
79
  selected_suggestion(),
78
80
  footnotes(props),
package/dist/es/icons.js CHANGED
@@ -1,4 +1,4 @@
1
- import { AddAuthorIcon, AlertIcon, ArrowDownCircleIcon, ArrowUpIcon, DeleteIcon, DraggableIcon, EditIcon, FileCorruptedIcon, FileMainDocumentIcon, ImageDefaultIcon, ImageLeftIcon, ImageRightIcon, LinkIcon, LockIcon, PlusIcon, ScrollIcon, SectionCategoryIcon, TranslateIcon, } from '@manuscripts/style-guide';
1
+ import { AddAuthorIcon, AlertIcon, ArrowDownCircleIcon, ArrowUpIcon, DeleteIcon, DraggableIcon, EditIcon, FileCorruptedIcon, FileMainDocumentIcon, ImageDefaultIcon, ImageLeftIcon, ImageRightIcon, LinkIcon, LockIcon, PlusIcon, ScrollIcon, SectionCategoryIcon, TickIcon, TranslateIcon, } from '@manuscripts/style-guide';
2
2
  import { createElement } from 'react';
3
3
  import { renderToStaticMarkup } from 'react-dom/server';
4
4
  const renderIcon = (c) => renderToStaticMarkup(createElement(c));
@@ -7,17 +7,17 @@ export const arrowDown = renderIcon(ArrowDownCircleIcon);
7
7
  export const arrowUp = renderIcon(ArrowUpIcon);
8
8
  export const alertIcon = renderIcon(AlertIcon);
9
9
  export const deleteIcon = renderIcon(DeleteIcon);
10
- export const editIcon = renderToStaticMarkup(createElement(EditIcon));
10
+ export const editIcon = renderIcon(EditIcon);
11
11
  export const sectionCategoryIcon = renderIcon(SectionCategoryIcon);
12
- export const scrollIcon = renderToStaticMarkup(createElement(ScrollIcon));
13
- export const lockIcon = renderToStaticMarkup(createElement(LockIcon));
12
+ export const scrollIcon = renderIcon(ScrollIcon);
13
+ export const lockIcon = renderIcon(LockIcon);
14
14
  export const plusIcon = renderIcon(PlusIcon);
15
- export const addBtnIcon = renderToStaticMarkup(createElement(PlusIcon));
16
- export const imageRightIcon = renderToStaticMarkup(createElement(ImageRightIcon));
17
- export const imageLeftIcon = renderToStaticMarkup(createElement(ImageLeftIcon));
18
- export const imageDefaultIcon = renderToStaticMarkup(createElement(ImageDefaultIcon));
19
- export const fileCorruptedIcon = renderToStaticMarkup(createElement(FileCorruptedIcon));
20
- export const draggableIcon = renderToStaticMarkup(createElement(DraggableIcon));
21
- export const translateIcon = renderToStaticMarkup(createElement(TranslateIcon));
22
- export const linkIcon = renderToStaticMarkup(createElement(LinkIcon));
23
- export const fileMainDocumentIcon = renderToStaticMarkup(createElement(FileMainDocumentIcon));
15
+ export const imageRightIcon = renderIcon(ImageRightIcon);
16
+ export const imageLeftIcon = renderIcon(ImageLeftIcon);
17
+ export const imageDefaultIcon = renderIcon(ImageDefaultIcon);
18
+ export const fileCorruptedIcon = renderIcon(FileCorruptedIcon);
19
+ export const draggableIcon = renderIcon(DraggableIcon);
20
+ export const translateIcon = renderIcon(TranslateIcon);
21
+ export const linkIcon = renderIcon(LinkIcon);
22
+ export const fileMainDocumentIcon = renderIcon(FileMainDocumentIcon);
23
+ export const tickIcon = renderIcon(TickIcon);