@manuscripts/body-editor 3.4.2 → 3.4.4

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 (34) hide show
  1. package/dist/cjs/commands.js +2 -1
  2. package/dist/cjs/components/LanguageDropdown/index.js +215 -0
  3. package/dist/cjs/components/LanguageDropdown/languages.js +134 -0
  4. package/dist/cjs/configs/editor-views.js +4 -1
  5. package/dist/cjs/icons.js +3 -2
  6. package/dist/cjs/index.js +6 -1
  7. package/dist/cjs/versions.js +1 -1
  8. package/dist/cjs/views/abstracts.js +82 -0
  9. package/dist/cjs/views/figure_element.js +2 -2
  10. package/dist/cjs/views/section_title.js +3 -0
  11. package/dist/cjs/views/translated_abstract.js +117 -0
  12. package/dist/cjs/views/translated_abstract_editable.js +21 -0
  13. package/dist/es/commands.js +2 -1
  14. package/dist/es/components/LanguageDropdown/index.js +177 -0
  15. package/dist/es/components/LanguageDropdown/languages.js +90 -0
  16. package/dist/es/configs/editor-views.js +4 -1
  17. package/dist/es/icons.js +3 -2
  18. package/dist/es/index.js +1 -0
  19. package/dist/es/versions.js +1 -1
  20. package/dist/es/views/abstracts.js +78 -0
  21. package/dist/es/views/figure_element.js +3 -3
  22. package/dist/es/views/section_title.js +3 -0
  23. package/dist/es/views/translated_abstract.js +110 -0
  24. package/dist/es/views/translated_abstract_editable.js +19 -0
  25. package/dist/types/components/LanguageDropdown/index.d.ts +27 -0
  26. package/dist/types/components/LanguageDropdown/languages.d.ts +22 -0
  27. package/dist/types/icons.d.ts +2 -1
  28. package/dist/types/index.d.ts +1 -0
  29. package/dist/types/versions.d.ts +1 -1
  30. package/dist/types/views/abstracts.d.ts +28 -0
  31. package/dist/types/views/translated_abstract.d.ts +38 -0
  32. package/dist/types/views/translated_abstract_editable.d.ts +44 -0
  33. package/package.json +3 -2
  34. package/styles/AdvancedEditor.css +88 -21
@@ -1113,7 +1113,8 @@ const isCommentingAllowed = (type) => type === transform_1.schema.nodes.title ||
1113
1113
  type === transform_1.schema.nodes.affiliations ||
1114
1114
  type === transform_1.schema.nodes.contributors ||
1115
1115
  type === transform_1.schema.nodes.image_element ||
1116
- type === transform_1.schema.nodes.hero_image;
1116
+ type === transform_1.schema.nodes.hero_image ||
1117
+ type === transform_1.schema.nodes.trans_abstract;
1117
1118
  exports.isCommentingAllowed = isCommentingAllowed;
1118
1119
  const addNodeComment = (node, state, dispatch) => {
1119
1120
  if (!(0, exports.isCommentingAllowed)(node.type)) {
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ /*!
3
+ * © 2025 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
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ var __importDefault = (this && this.__importDefault) || function (mod) {
51
+ return (mod && mod.__esModule) ? mod : { "default": mod };
52
+ };
53
+ Object.defineProperty(exports, "__esModule", { value: true });
54
+ const style_guide_1 = require("@manuscripts/style-guide");
55
+ const react_1 = __importStar(require("react"));
56
+ const styled_components_1 = __importDefault(require("styled-components"));
57
+ const languages_1 = require("./languages");
58
+ const LanguageOptionItem = ({ language, isSelected, onSelect }) => (react_1.default.createElement(StyledLanguageOption, { key: language.code, onClick: (event) => onSelect(event, language.code) },
59
+ language.name,
60
+ language.nativeName && ` (${language.nativeName})`,
61
+ isSelected && (react_1.default.createElement(TickIconWrapper, null,
62
+ react_1.default.createElement(style_guide_1.TickIcon, null)))));
63
+ const LanguageDropdown = ({ onLanguageSelect, onClose, currentLanguage = 'en', showButton = false, selectedLanguageDisplay, onCloseParent, }) => {
64
+ const [allLanguages, setAllLanguages] = (0, react_1.useState)([]);
65
+ const [isOpen, setIsOpen] = (0, react_1.useState)(!showButton);
66
+ const dropdownRef = (0, react_1.useRef)(null);
67
+ (0, react_1.useEffect)(() => {
68
+ const loadLanguages = async () => {
69
+ try {
70
+ const languages = await (0, languages_1.loadAllLanguages)();
71
+ const sortedLanguages = (0, languages_1.sortLanguagesByCommonality)(languages);
72
+ setAllLanguages(sortedLanguages);
73
+ }
74
+ catch (error) {
75
+ console.error('Failed to load language data:', error);
76
+ setAllLanguages([]);
77
+ }
78
+ };
79
+ loadLanguages();
80
+ }, []);
81
+ (0, react_1.useEffect)(() => {
82
+ const handleClickOutside = (event) => {
83
+ if (dropdownRef.current &&
84
+ !dropdownRef.current.contains(event.target)) {
85
+ setIsOpen(false);
86
+ onClose?.();
87
+ onCloseParent?.();
88
+ }
89
+ };
90
+ if (isOpen) {
91
+ document.addEventListener('mousedown', handleClickOutside);
92
+ }
93
+ return () => {
94
+ document.removeEventListener('mousedown', handleClickOutside);
95
+ };
96
+ }, [isOpen, onClose, onCloseParent]);
97
+ const toggleDropdown = (event) => {
98
+ event.stopPropagation();
99
+ setIsOpen(!isOpen);
100
+ };
101
+ const handleSelect = (event, languageCode) => {
102
+ event.stopPropagation();
103
+ onLanguageSelect(languageCode);
104
+ };
105
+ const getDisplayName = (languageCode) => {
106
+ return (0, languages_1.getSelectedLanguageName)(languageCode, allLanguages);
107
+ };
108
+ return (react_1.default.createElement(style_guide_1.DropdownContainer, { ref: dropdownRef },
109
+ showButton && (react_1.default.createElement(LanguageButton, { onClick: toggleDropdown },
110
+ react_1.default.createElement(ButtonContent, null,
111
+ react_1.default.createElement(ButtonLabel, null,
112
+ "Document language ",
113
+ react_1.default.createElement(style_guide_1.TriangleCollapsedIcon, null)),
114
+ react_1.default.createElement(SelectedLanguage, null, selectedLanguageDisplay || getDisplayName(currentLanguage))))),
115
+ isOpen && (react_1.default.createElement(DropdownMenu, { direction: "right", width: 231, height: 400, top: 18 },
116
+ !showButton && react_1.default.createElement(DropdownTitle, null, "Choose language"),
117
+ allLanguages.map((language) => (react_1.default.createElement(LanguageOptionItem, { key: language.code, language: language, isSelected: currentLanguage === language.code, onSelect: handleSelect })))))));
118
+ };
119
+ const StyledDropdownList = (0, styled_components_1.default)(style_guide_1.DropdownList) `
120
+ overflow-y: auto;
121
+ overflow-x: hidden;
122
+ border-radius: 8px;
123
+
124
+ /* Custom scrollbar styling */
125
+ &::-webkit-scrollbar {
126
+ width: 6px;
127
+ }
128
+
129
+ &::-webkit-scrollbar-track {
130
+ background: ${(props) => props.theme.colors.background.secondary};
131
+ border-radius: 3px;
132
+ }
133
+
134
+ &::-webkit-scrollbar-thumb {
135
+ background: #6e6e6e;
136
+ border-radius: 3px;
137
+ }
138
+
139
+ &::-webkit-scrollbar-thumb:hover {
140
+ background: #6e6e6e;
141
+ }
142
+ `;
143
+ const LanguageButton = styled_components_1.default.div `
144
+ display: flex;
145
+ align-items: center;
146
+ justify-content: space-between;
147
+ font-family: ${(props) => props.theme.font.family.Lato};
148
+ cursor: pointer;
149
+ font-size: 14px;
150
+ line-height: 24px;
151
+ color: ${(props) => props.theme.colors.text.primary};
152
+ padding: 10px 16px;
153
+ width: 100%;
154
+
155
+ &:hover {
156
+ background: ${(props) => props.theme.colors.background.fifth};
157
+ }
158
+ `;
159
+ const ButtonContent = styled_components_1.default.span `
160
+ display: flex;
161
+ flex-direction: column;
162
+ align-items: flex-start;
163
+ `;
164
+ const ButtonLabel = styled_components_1.default.span `
165
+ display: flex;
166
+ align-items: center;
167
+ font-size: 16px;
168
+
169
+ svg {
170
+ top: 10px;
171
+ right: -10px;
172
+ position: relative;
173
+ }
174
+ `;
175
+ const SelectedLanguage = styled_components_1.default.span `
176
+ font-size: 12px;
177
+ color: ${(props) => props.theme.colors.text.secondary};
178
+ margin-top: 2px;
179
+ `;
180
+ const DropdownMenu = (0, styled_components_1.default)(StyledDropdownList) `
181
+ // Inherits all styles from StyledDropdownList
182
+ `;
183
+ const DropdownTitle = styled_components_1.default.div `
184
+ font-family: 'PT Sans', sans-serif;
185
+ font-size: 16px;
186
+ font-style: italic;
187
+ font-weight: 400;
188
+ line-height: 32px;
189
+ color: #c9c9c9;
190
+ padding: 12px 16px 8px 16px;
191
+ border-bottom: 1px solid #c9c9c9;
192
+ margin-bottom: 4px;
193
+ `;
194
+ const TickIconWrapper = styled_components_1.default.div `
195
+ svg path {
196
+ fill: #6e6e6e;
197
+ }
198
+ `;
199
+ const StyledLanguageOption = styled_components_1.default.div `
200
+ display: flex;
201
+ align-items: center;
202
+ justify-content: space-between;
203
+ font-family: ${(props) => props.theme.font.family.Lato};
204
+ cursor: pointer;
205
+ font-size: 14px;
206
+ line-height: 24px;
207
+ color: ${(props) => props.theme.colors.text.primary};
208
+ padding: 10px 16px;
209
+ transition: background-color 0.2s ease;
210
+
211
+ &:hover {
212
+ background-color: #f2fbfc;
213
+ }
214
+ `;
215
+ exports.default = LanguageDropdown;
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.sortLanguagesByCommonality = exports.getLanguageDisplayName = exports.getSelectedLanguageName = exports.loadAllLanguages = exports.initializeLanguageData = exports.ENGLISH_FALLBACK = exports.COMMON_LANGUAGES = exports.COMMON_LANGUAGES_INFO = void 0;
40
+ const i18n_iso_languages_1 = __importDefault(require("@cospired/i18n-iso-languages"));
41
+ exports.COMMON_LANGUAGES_INFO = {
42
+ en: { englishName: 'English', nativeName: 'Default' },
43
+ es: { englishName: 'Spanish', nativeName: 'Español' },
44
+ fr: { englishName: 'French', nativeName: 'Français' },
45
+ de: { englishName: 'German', nativeName: 'Deutsch' },
46
+ it: { englishName: 'Italian', nativeName: 'Italiano' },
47
+ pt: { englishName: 'Portuguese', nativeName: 'Português' },
48
+ ru: { englishName: 'Russian', nativeName: 'Русский' },
49
+ ja: { englishName: 'Japanese', nativeName: '日本語' },
50
+ ko: { englishName: 'Korean', nativeName: '한국어' },
51
+ zh: { englishName: 'Chinese', nativeName: '中文' },
52
+ ar: { englishName: 'Arabic', nativeName: 'العربية' },
53
+ };
54
+ exports.COMMON_LANGUAGES = Object.keys(exports.COMMON_LANGUAGES_INFO);
55
+ exports.ENGLISH_FALLBACK = {
56
+ code: 'en',
57
+ name: 'English',
58
+ nativeName: 'English',
59
+ isCommon: true,
60
+ };
61
+ const initializeLanguageData = async () => {
62
+ try {
63
+ const englishLanguageData = await Promise.resolve().then(() => __importStar(require('@cospired/i18n-iso-languages/langs/en.json')));
64
+ i18n_iso_languages_1.default.registerLocale(englishLanguageData.default);
65
+ }
66
+ catch (error) {
67
+ console.error('Failed to initialize language data:', error);
68
+ throw error;
69
+ }
70
+ };
71
+ exports.initializeLanguageData = initializeLanguageData;
72
+ const loadAllLanguages = async () => {
73
+ try {
74
+ await (0, exports.initializeLanguageData)();
75
+ const languageCodes = i18n_iso_languages_1.default.getAlpha2Codes();
76
+ return Object.keys(languageCodes).map((code) => {
77
+ const commonLanguageInfo = exports.COMMON_LANGUAGES_INFO[code];
78
+ return {
79
+ code,
80
+ name: commonLanguageInfo?.englishName ||
81
+ i18n_iso_languages_1.default.getName(code, 'en') ||
82
+ code.toUpperCase(),
83
+ nativeName: commonLanguageInfo?.nativeName ||
84
+ i18n_iso_languages_1.default.getName(code, code) ||
85
+ undefined,
86
+ isCommon: exports.COMMON_LANGUAGES.includes(code),
87
+ };
88
+ });
89
+ }
90
+ catch (error) {
91
+ console.error('Failed to load languages:', error);
92
+ return [exports.ENGLISH_FALLBACK];
93
+ }
94
+ };
95
+ exports.loadAllLanguages = loadAllLanguages;
96
+ const getSelectedLanguageName = (selectedLanguage, allLanguages) => {
97
+ if (!allLanguages.length) {
98
+ return 'English (Default)';
99
+ }
100
+ const language = allLanguages.find((lang) => lang.code === selectedLanguage) ||
101
+ exports.ENGLISH_FALLBACK;
102
+ return language.nativeName && language.nativeName !== language.name
103
+ ? `${language.name} (${language.nativeName})`
104
+ : language.name;
105
+ };
106
+ exports.getSelectedLanguageName = getSelectedLanguageName;
107
+ const getLanguageDisplayName = (languageCode) => {
108
+ const languageInfo = exports.COMMON_LANGUAGES_INFO[languageCode];
109
+ if (languageInfo) {
110
+ const { englishName, nativeName } = languageInfo;
111
+ if (nativeName !== englishName && nativeName !== 'Default') {
112
+ return `${englishName} (${nativeName})`;
113
+ }
114
+ return englishName;
115
+ }
116
+ const englishName = i18n_iso_languages_1.default.getName(languageCode, 'en');
117
+ if (englishName) {
118
+ return englishName;
119
+ }
120
+ return languageCode.toUpperCase();
121
+ };
122
+ exports.getLanguageDisplayName = getLanguageDisplayName;
123
+ const sortLanguagesByCommonality = (languages) => {
124
+ return [...languages].sort((a, b) => {
125
+ if (a.isCommon && !b.isCommon) {
126
+ return -1;
127
+ }
128
+ if (!a.isCommon && b.isCommon) {
129
+ return 1;
130
+ }
131
+ return a.name.localeCompare(b.name);
132
+ });
133
+ };
134
+ exports.sortLanguagesByCommonality = sortLanguagesByCommonality;
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ const abstracts_1 = __importDefault(require("../views/abstracts"));
6
7
  const accessibility_element_1 = __importDefault(require("../views/accessibility_element"));
7
8
  const affiliations_1 = __importDefault(require("../views/affiliations"));
8
9
  const alt_title_1 = __importDefault(require("../views/alt_title"));
@@ -46,6 +47,7 @@ const table_cell_1 = __importDefault(require("../views/table_cell"));
46
47
  const table_element_editable_1 = __importDefault(require("../views/table_element_editable"));
47
48
  const table_element_footer_1 = __importDefault(require("../views/table_element_footer"));
48
49
  const title_editable_1 = __importDefault(require("../views/title_editable"));
50
+ const translated_abstract_editable_1 = __importDefault(require("../views/translated_abstract_editable"));
49
51
  exports.default = (props, dispatch) => {
50
52
  return {
51
53
  title: (0, title_editable_1.default)(props, dispatch),
@@ -97,6 +99,7 @@ exports.default = (props, dispatch) => {
97
99
  long_desc: (0, accessibility_element_1.default)(props, dispatch),
98
100
  alt_text: (0, accessibility_element_1.default)(props, dispatch),
99
101
  hero_image: (0, hero_image_editable_1.default)(props, dispatch),
100
- trans_abstract: (0, empty_1.default)('trans_abstract'),
102
+ abstracts: (0, abstracts_1.default)(props),
103
+ trans_abstract: (0, translated_abstract_editable_1.default)(props),
101
104
  };
102
105
  };
package/dist/cjs/icons.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.draggableIcon = exports.fileCorruptedIcon = exports.imageDefaultIcon = exports.imageLeftIcon = exports.imageRightIcon = exports.addFigureBtnIcon = exports.plusIcon = exports.lockIcon = exports.scrollIcon = exports.sectionCategoryIcon = exports.editIcon = exports.deleteIcon = exports.alertIcon = exports.arrowUp = exports.arrowDown = void 0;
3
+ 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 = 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");
@@ -14,9 +14,10 @@ exports.sectionCategoryIcon = renderIcon(style_guide_1.SectionCategoryIcon);
14
14
  exports.scrollIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.ScrollIcon));
15
15
  exports.lockIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.LockIcon));
16
16
  exports.plusIcon = renderIcon(style_guide_1.PlusIcon);
17
- exports.addFigureBtnIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.PlusIcon));
17
+ exports.addBtnIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.PlusIcon));
18
18
  exports.imageRightIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.ImageRightIcon));
19
19
  exports.imageLeftIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.ImageLeftIcon));
20
20
  exports.imageDefaultIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.ImageDefaultIcon));
21
21
  exports.fileCorruptedIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.FileCorruptedIcon));
22
22
  exports.draggableIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.DraggableIcon));
23
+ exports.translateIcon = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.TranslateIcon));
package/dist/cjs/index.js CHANGED
@@ -28,8 +28,11 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
28
28
  var __exportStar = (this && this.__exportStar) || function(m, exports) {
29
29
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
30
30
  };
31
+ var __importDefault = (this && this.__importDefault) || function (mod) {
32
+ return (mod && mod.__esModule) ? mod : { "default": mod };
33
+ };
31
34
  Object.defineProperty(exports, "__esModule", { value: true });
32
- exports.affiliationLabel = exports.authorLabel = exports.bibliographyItemTypes = exports.metadata = exports.getClosestMatch = exports.getNewMatch = exports.detectInconsistencyPluginKey = exports.searchReplacePluginKey = exports.bibliographyPluginKey = exports.footnotesPluginKey = exports.objectsPluginKey = exports.selectedSuggestionKey = exports.PopperManager = exports.CollabProvider = exports.TypeSelector = exports.OutlineItemIcon = exports.ManuscriptOutline = void 0;
35
+ exports.affiliationLabel = exports.authorLabel = exports.bibliographyItemTypes = exports.metadata = exports.getClosestMatch = exports.getNewMatch = exports.detectInconsistencyPluginKey = exports.searchReplacePluginKey = exports.bibliographyPluginKey = exports.footnotesPluginKey = exports.objectsPluginKey = exports.selectedSuggestionKey = exports.PopperManager = exports.CollabProvider = exports.LanguageDropdown = exports.TypeSelector = exports.OutlineItemIcon = exports.ManuscriptOutline = void 0;
33
36
  __exportStar(require("./commands"), exports);
34
37
  var ManuscriptOutline_1 = require("./components/outline/ManuscriptOutline");
35
38
  Object.defineProperty(exports, "ManuscriptOutline", { enumerable: true, get: function () { return ManuscriptOutline_1.ManuscriptOutline; } });
@@ -37,6 +40,8 @@ var Outline_1 = require("./components/outline/Outline");
37
40
  Object.defineProperty(exports, "OutlineItemIcon", { enumerable: true, get: function () { return Outline_1.OutlineItemIcon; } });
38
41
  var TypeSelector_1 = require("./components/toolbar/type-selector/TypeSelector");
39
42
  Object.defineProperty(exports, "TypeSelector", { enumerable: true, get: function () { return TypeSelector_1.TypeSelector; } });
43
+ var LanguageDropdown_1 = require("./components/LanguageDropdown");
44
+ Object.defineProperty(exports, "LanguageDropdown", { enumerable: true, get: function () { return __importDefault(LanguageDropdown_1).default; } });
40
45
  __exportStar(require("./components/toolbar/ListMenuItem"), exports);
41
46
  __exportStar(require("./components/toolbar/InsertTableDialog"), exports);
42
47
  __exportStar(require("./menus"), exports);
@@ -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.4.2';
4
+ exports.VERSION = '3.4.4';
5
5
  exports.MATHJAX_VERSION = '3.2.2';
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ /*!
3
+ * © 2025 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
+ exports.AbstractsView = void 0;
19
+ const prosemirror_state_1 = require("prosemirror-state");
20
+ const icons_1 = require("../icons");
21
+ const base_node_view_1 = require("./base_node_view");
22
+ const creators_1 = require("./creators");
23
+ class AbstractsView extends base_node_view_1.BaseNodeView {
24
+ constructor() {
25
+ super(...arguments);
26
+ this.elementType = 'div';
27
+ this.addTranslation = () => {
28
+ const { state } = this.view;
29
+ const { schema } = state;
30
+ const documentLanguage = state.doc.attrs.primaryLanguageCode || 'en';
31
+ const sectionTitle = schema.nodes.section_title.create();
32
+ const paragraph = schema.nodes.paragraph.create({
33
+ placeholder: 'Type here',
34
+ });
35
+ const transAbstractNode = schema.nodes.trans_abstract.create({
36
+ lang: documentLanguage,
37
+ }, [sectionTitle, paragraph]);
38
+ const tr = state.tr.insert(this.getPos() + this.node.nodeSize - 1, transAbstractNode);
39
+ const titlePos = this.getPos() + this.node.nodeSize;
40
+ const selection = prosemirror_state_1.TextSelection.create(tr.doc, titlePos);
41
+ tr.setSelection(selection).scrollIntoView();
42
+ this.view.dispatch(tr);
43
+ };
44
+ }
45
+ initialise() {
46
+ this.createDOM();
47
+ this.createElement();
48
+ this.updateContents();
49
+ }
50
+ createDOM() {
51
+ this.dom = document.createElement(this.elementType);
52
+ this.dom.classList.add('abstracts');
53
+ }
54
+ createElement() {
55
+ this.contentDOM = document.createElement(this.elementType);
56
+ this.dom.appendChild(this.contentDOM);
57
+ this.addTranslationBtn();
58
+ }
59
+ addTranslationBtn() {
60
+ if (this.props.getCapabilities()?.editArticle) {
61
+ const btnContainer = document.createElement('div');
62
+ btnContainer.classList.add('add-translation-container');
63
+ btnContainer.addEventListener('click', () => this.addTranslation());
64
+ const addTranslationBtn = Object.assign(document.createElement('button'), {
65
+ className: 'add-button',
66
+ innerHTML: icons_1.addBtnIcon,
67
+ title: 'Add Translation',
68
+ });
69
+ const textElement = document.createElement('span');
70
+ textElement.textContent = 'Add translation';
71
+ textElement.classList.add('add-translation-text');
72
+ btnContainer.appendChild(addTranslationBtn);
73
+ btnContainer.appendChild(textElement);
74
+ this.dom.prepend(btnContainer);
75
+ }
76
+ }
77
+ updateContents() {
78
+ super.updateContents();
79
+ }
80
+ }
81
+ exports.AbstractsView = AbstractsView;
82
+ exports.default = (0, creators_1.createNodeView)(AbstractsView);
@@ -67,8 +67,8 @@ class FigureElementView extends image_element_1.ImageElementView {
67
67
  addFigureElementButtons() {
68
68
  if (this.props.getCapabilities()?.editArticle) {
69
69
  this.addFigureBtn = Object.assign(document.createElement('button'), {
70
- className: 'add-figure-button',
71
- innerHTML: icons_1.addFigureBtnIcon,
70
+ className: 'add-button',
71
+ innerHTML: icons_1.addBtnIcon,
72
72
  title: 'Add figure',
73
73
  });
74
74
  this.addFigureBtn.addEventListener('click', () => this.addFigure());
@@ -61,6 +61,9 @@ class SectionTitleView extends block_view_1.default {
61
61
  if ($pos.node($pos.depth - 1).type === transform_1.schema.nodes.box_element) {
62
62
  this.contentDOM.setAttribute('data-placeholder', `Optional box title...`);
63
63
  }
64
+ else if ($pos.node($pos.depth).type === transform_1.schema.nodes.trans_abstract) {
65
+ this.contentDOM.setAttribute('data-placeholder', `Type new abstract title here`);
66
+ }
64
67
  else {
65
68
  this.contentDOM.setAttribute('data-placeholder', `Type heading here`);
66
69
  }
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ /*!
3
+ * © 2025 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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
18
+ return (mod && mod.__esModule) ? mod : { "default": mod };
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
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
+ const block_view_1 = __importDefault(require("./block_view"));
26
+ const creators_1 = require("./creators");
27
+ const ReactSubView_1 = __importDefault(require("./ReactSubView"));
28
+ class TransAbstractView extends block_view_1.default {
29
+ constructor() {
30
+ super(...arguments);
31
+ 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
+ }
44
+ createDOM() {
45
+ super.createDOM();
46
+ this.dom.classList.add('block-section');
47
+ }
48
+ createElement() {
49
+ super.createElement();
50
+ if (this.contentDOM) {
51
+ this.contentDOM.classList.add('trans-abstract');
52
+ }
53
+ }
54
+ updateContents() {
55
+ super.updateContents();
56
+ this.updateLanguageAttributes();
57
+ this.handleLanguageSelector();
58
+ }
59
+ destroy() {
60
+ this.cleanupLanguageButton();
61
+ super.destroy();
62
+ }
63
+ updateLanguageAttributes() {
64
+ if (this.contentDOM && this.node.attrs.lang) {
65
+ this.contentDOM.lang = this.node.attrs.lang;
66
+ }
67
+ }
68
+ handleLanguageSelector() {
69
+ this.cleanupLanguageButton();
70
+ if (this.props.getCapabilities()?.editArticle) {
71
+ this.createLanguageButton();
72
+ }
73
+ }
74
+ createLanguageButton() {
75
+ this.languageButton = document.createElement('button');
76
+ this.languageButton.classList.add('language-selector-btn');
77
+ this.languageButton.setAttribute('data-cy', 'language-selector-btn');
78
+ this.updateButtonContent();
79
+ this.languageButton.addEventListener('click', this.handleButtonClick);
80
+ this.dom.prepend(this.languageButton);
81
+ }
82
+ cleanupLanguageButton() {
83
+ if (this.languageButton) {
84
+ this.languageButton.removeEventListener('click', this.handleButtonClick);
85
+ this.languageButton.remove();
86
+ this.languageButton = null;
87
+ }
88
+ }
89
+ updateButtonContent(languageCode = this.node.attrs.lang || 'en') {
90
+ if (!this.languageButton) {
91
+ return;
92
+ }
93
+ const languageName = (0, languages_1.getLanguageDisplayName)(languageCode);
94
+ const finalLanguageName = languageCode === 'en' ? 'English (Default)' : languageName;
95
+ this.languageButton.innerHTML = `${finalLanguageName} ${icons_1.translateIcon}`;
96
+ }
97
+ showLanguageDropdown(trigger) {
98
+ const currentLanguage = this.node.attrs.lang || 'en';
99
+ this.props.popper.show(trigger, this.createDropdownContainer(currentLanguage), 'bottom-start', false);
100
+ }
101
+ createDropdownContainer(currentLanguage) {
102
+ return (0, ReactSubView_1.default)(this.props, LanguageDropdown_1.default, {
103
+ showButton: false,
104
+ currentLanguage,
105
+ onLanguageSelect: this.handleLanguageChange,
106
+ }, this.node, this.getPos.bind(this), this.view, ['abstracts-language-dropdown']);
107
+ }
108
+ updateNodeLanguage(languageCode) {
109
+ const tr = this.view.state.tr.setNodeMarkup(this.getPos(), undefined, {
110
+ ...this.node.attrs,
111
+ lang: languageCode,
112
+ });
113
+ this.view.dispatch(tr);
114
+ }
115
+ }
116
+ exports.TransAbstractView = TransAbstractView;
117
+ exports.default = (0, creators_1.createNodeView)(TransAbstractView);