@manuscripts/body-editor 2.3.3-LEAN-4053.1 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/cjs/commands.js +207 -94
  2. package/dist/cjs/components/views/DeleteFootnoteDialog.js +2 -2
  3. package/dist/cjs/components/views/FootnotesSelector.js +18 -17
  4. package/dist/cjs/configs/editor-plugins.js +2 -0
  5. package/dist/cjs/configs/editor-views.js +4 -6
  6. package/dist/cjs/index.js +0 -1
  7. package/dist/cjs/lib/context-menu.js +91 -13
  8. package/dist/cjs/lib/doc.js +4 -27
  9. package/dist/cjs/lib/footnotes.js +122 -31
  10. package/dist/cjs/menus.js +11 -1
  11. package/dist/cjs/plugins/footnotes/index.js +215 -0
  12. package/dist/cjs/plugins/footnotes/widgets.js +136 -0
  13. package/dist/cjs/plugins/placeholder.js +12 -19
  14. package/dist/cjs/plugins/table-footnote.js +46 -0
  15. package/dist/cjs/testing/default-editor-data.js +1 -1
  16. package/dist/cjs/testing/setup-editor.js +0 -1
  17. package/dist/cjs/versions.js +1 -1
  18. package/dist/cjs/views/editable_block.js +1 -1
  19. package/dist/cjs/views/footnote.js +15 -85
  20. package/dist/cjs/views/footnote_editable.js +21 -0
  21. package/dist/cjs/views/footnotes_element.js +2 -8
  22. package/dist/cjs/views/footnotes_element_editable.js +22 -0
  23. package/dist/cjs/views/inline_footnote.js +124 -78
  24. package/dist/cjs/views/section_title.js +6 -1
  25. package/dist/cjs/views/table_element_footer.js +5 -2
  26. package/dist/cjs/views/table_element_footer_editable.js +20 -0
  27. package/dist/es/commands.js +204 -93
  28. package/dist/es/components/views/DeleteFootnoteDialog.js +2 -2
  29. package/dist/es/components/views/FootnotesSelector.js +18 -17
  30. package/dist/es/configs/editor-plugins.js +2 -0
  31. package/dist/es/configs/editor-views.js +2 -4
  32. package/dist/es/index.js +0 -1
  33. package/dist/es/lib/context-menu.js +91 -16
  34. package/dist/es/lib/doc.js +4 -25
  35. package/dist/es/lib/footnotes.js +116 -28
  36. package/dist/es/menus.js +12 -2
  37. package/dist/es/plugins/footnotes/index.js +211 -0
  38. package/dist/es/plugins/footnotes/widgets.js +127 -0
  39. package/dist/es/plugins/placeholder.js +11 -20
  40. package/dist/es/plugins/table-footnote.js +44 -0
  41. package/dist/es/testing/default-editor-data.js +1 -1
  42. package/dist/es/testing/setup-editor.js +0 -1
  43. package/dist/es/versions.js +1 -1
  44. package/dist/es/views/editable_block.js +1 -1
  45. package/dist/es/views/footnote.js +15 -86
  46. package/dist/es/views/footnote_editable.js +19 -0
  47. package/dist/es/views/footnotes_element.js +2 -8
  48. package/dist/es/views/footnotes_element_editable.js +20 -0
  49. package/dist/es/views/inline_footnote.js +128 -82
  50. package/dist/es/views/section_title.js +6 -1
  51. package/dist/es/views/table_element_footer.js +5 -4
  52. package/dist/es/views/table_element_footer_editable.js +18 -0
  53. package/dist/types/commands.d.ts +14 -9
  54. package/dist/types/components/views/DeleteFootnoteDialog.d.ts +2 -0
  55. package/dist/types/components/views/FootnotesSelector.d.ts +6 -7
  56. package/dist/types/configs/editor-views.d.ts +35 -22
  57. package/dist/types/index.d.ts +0 -1
  58. package/dist/types/lib/context-menu.d.ts +3 -1
  59. package/dist/types/lib/doc.d.ts +0 -2
  60. package/dist/types/lib/footnotes.d.ts +19 -8
  61. package/dist/types/plugins/{footnotes.d.ts → footnotes/index.d.ts} +10 -16
  62. package/dist/types/plugins/footnotes/widgets.d.ts +22 -0
  63. package/dist/types/plugins/placeholder.d.ts +2 -0
  64. package/dist/types/plugins/table-footnote.d.ts +3 -0
  65. package/dist/types/versions.d.ts +1 -1
  66. package/dist/types/views/footnote.d.ts +6 -12
  67. package/dist/types/views/footnote_editable.d.ts +51 -0
  68. package/dist/types/views/footnotes_element.d.ts +0 -1
  69. package/dist/types/views/footnotes_element_editable.d.ts +51 -0
  70. package/dist/types/views/inline_footnote.d.ts +14 -8
  71. package/dist/types/views/table_element_footer.d.ts +2 -2
  72. package/dist/types/views/{general_table_footnote.d.ts → table_element_footer_editable.d.ts} +2 -10
  73. package/package.json +2 -2
  74. package/styles/AdvancedEditor.css +10 -3
  75. package/styles/Editor.css +64 -33
  76. package/dist/cjs/icons.js +0 -8
  77. package/dist/cjs/plugins/footnotes.js +0 -177
  78. package/dist/cjs/views/general_table_footnote.js +0 -78
  79. package/dist/es/icons.js +0 -5
  80. package/dist/es/plugins/footnotes.js +0 -174
  81. package/dist/es/views/general_table_footnote.js +0 -71
  82. package/dist/types/icons.d.ts +0 -2
@@ -15,7 +15,7 @@
15
15
  * limitations under the License.
16
16
  */
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.autoComplete = exports.mergeCellsWithSpace = exports.addColumns = 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.insertContributors = exports.insertAbstract = exports.insertBackMatterSection = exports.insertSection = exports.insertGraphicalAbstract = 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.insertSupplement = exports.insertTable = exports.insertFigure = exports.insertGeneralTableFootnote = exports.insertInlineTableFootnote = exports.createBlock = exports.createSelection = exports.canInsert = exports.blockActive = exports.isNodeSelection = exports.markActive = exports.addToStart = void 0;
18
+ exports.autoComplete = exports.mergeCellsWithSpace = exports.addColumns = exports.addRows = exports.insertBoxElement = exports.insertTableFootnote = 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.insertContributors = exports.insertAbstract = exports.insertBackMatterSection = exports.insertSection = exports.insertGraphicalAbstract = exports.insertInlineFootnote = exports.insertFootnote = exports.createFootnote = exports.insertInlineEquation = exports.insertCrossReference = exports.insertInlineCitation = exports.insertLink = exports.insertSectionLabel = exports.findPosBeforeFirstSubsection = exports.insertBreak = exports.deleteBlock = exports.insertBlock = exports.insertSupplement = exports.insertTable = exports.insertFigure = exports.insertGeneralFootnote = exports.undoFootnoteDelete = exports.createBlock = exports.createSelection = exports.canInsert = exports.blockActive = exports.isNodeSelection = exports.markActive = exports.addToStart = void 0;
19
19
  const json_schema_1 = require("@manuscripts/json-schema");
20
20
  const track_changes_plugin_1 = require("@manuscripts/track-changes-plugin");
21
21
  const transform_1 = require("@manuscripts/transform");
@@ -34,6 +34,7 @@ const track_changes_utils_1 = require("./lib/track-changes-utils");
34
34
  const utils_1 = require("./lib/utils");
35
35
  const comments_2 = require("./plugins/comments");
36
36
  const editor_props_1 = require("./plugins/editor-props");
37
+ const footnotes_2 = require("./plugins/footnotes");
37
38
  const autocompletion_1 = require("./plugins/section_title/autocompletion");
38
39
  const addToStart = (state, dispatch) => {
39
40
  const { selection } = state;
@@ -91,7 +92,8 @@ exports.blockActive = blockActive;
91
92
  const canInsert = (type) => (state) => {
92
93
  var _a;
93
94
  const { $from, $to } = state.selection;
94
- if ($from.node().type === transform_1.schema.nodes.title && $from.pos === $to.pos) {
95
+ if (($from.node().type === transform_1.schema.nodes.title || $from.node().type === transform_1.schema.nodes.section_title) &&
96
+ $from.pos === $to.pos) {
95
97
  return false;
96
98
  }
97
99
  const initDepth = ((_a = (0, prosemirror_utils_1.findParentNodeOfType)(transform_1.schema.nodes.box_element)(state.selection)) === null || _a === void 0 ? void 0 : _a.depth) ||
@@ -159,40 +161,48 @@ const createBlock = (nodeType, position, state, dispatch, attrs) => {
159
161
  }
160
162
  };
161
163
  exports.createBlock = createBlock;
162
- const insertInlineTableFootnote = (state, dispatch) => {
163
- const $pos = state.selection.$to;
164
- const table = (0, prosemirror_utils_1.findParentNodeOfTypeClosestToPos)($pos, transform_1.schema.nodes.table);
165
- if (!table) {
166
- return false;
167
- }
168
- if (!dispatch) {
169
- return true;
170
- }
171
- return (0, exports.insertInlineFootnote)(state, dispatch);
164
+ const undoFootnoteDelete = (tr, footnote, position) => {
165
+ const updatedAttrs = Object.assign(Object.assign({}, footnote.node.attrs), { dataTracked: null });
166
+ tr.setNodeMarkup(position, undefined, updatedAttrs, footnote.node.marks);
172
167
  };
173
- exports.insertInlineTableFootnote = insertInlineTableFootnote;
174
- const insertGeneralTableFootnote = (state, dispatch) => {
175
- const $pos = state.selection.$to;
176
- const container = (0, prosemirror_utils_1.findParentNodeOfTypeClosestToPos)($pos, transform_1.schema.nodes.table_element);
177
- const existing = (0, prosemirror_utils_1.findChildrenByType)(container.node, transform_1.schema.nodes.general_table_footnote);
178
- if (existing) {
179
- return false;
168
+ exports.undoFootnoteDelete = undoFootnoteDelete;
169
+ const insertGeneralFootnote = (tableElementNode, position, view, tableElementFooter) => {
170
+ const { state, dispatch } = view;
171
+ const paragraph = state.schema.nodes.paragraph.create({
172
+ placeholder: 'Add general note here',
173
+ });
174
+ const generalNote = state.schema.nodes.general_table_footnote.create({}, [
175
+ paragraph,
176
+ ]);
177
+ const tableColGroup = (0, prosemirror_utils_1.findChildrenByType)(tableElementNode, transform_1.schema.nodes.table_colgroup)[0];
178
+ const table = (0, prosemirror_utils_1.findChildrenByType)(tableElementNode, transform_1.schema.nodes.table)[0];
179
+ const tr = state.tr;
180
+ const pos = (tableElementFooter === null || tableElementFooter === void 0 ? void 0 : tableElementFooter.length)
181
+ ? position + tableElementFooter[0].pos + 2
182
+ : position +
183
+ (!tableColGroup
184
+ ? table.pos + table.node.nodeSize
185
+ : tableColGroup.pos + tableColGroup.node.nodeSize);
186
+ if (tableElementFooter === null || tableElementFooter === void 0 ? void 0 : tableElementFooter.length) {
187
+ if ((0, track_changes_utils_1.isDeleted)(tableElementFooter[0].node)) {
188
+ const tableElementFooterPos = tr.mapping.map(position + tableElementFooter[0].pos + 1);
189
+ (0, exports.undoFootnoteDelete)(tr, tableElementFooter[0], tableElementFooterPos);
190
+ }
191
+ tr.insert(pos, generalNote);
180
192
  }
181
- if (!dispatch) {
182
- return true;
193
+ else {
194
+ const tableElementFooter = transform_1.schema.nodes.table_element_footer.create({
195
+ id: (0, transform_1.generateNodeID)(transform_1.schema.nodes.table_element_footer),
196
+ }, [generalNote]);
197
+ tr.insert(pos, tableElementFooter);
198
+ }
199
+ if (dispatch && pos) {
200
+ const selection = (0, exports.createSelection)(state.schema.nodes.paragraph, pos, tr.doc);
201
+ view === null || view === void 0 ? void 0 : view.focus();
202
+ dispatch(tr.setSelection(selection).scrollIntoView());
183
203
  }
184
- const tr = state.tr;
185
- const footer = (0, exports.insertTableElementFooter)(tr, [container.node, container.pos]);
186
- const pos = footer.pos + 1;
187
- const node = transform_1.schema.nodes.general_table_footnote.create({}, [
188
- transform_1.schema.nodes.paragraph.create(),
189
- ]);
190
- tr.insert(pos, node);
191
- const selection = prosemirror_state_1.TextSelection.create(tr.doc, pos + 1);
192
- tr.setSelection(selection).scrollIntoView();
193
- dispatch(tr);
194
204
  };
195
- exports.insertGeneralTableFootnote = insertGeneralTableFootnote;
205
+ exports.insertGeneralFootnote = insertGeneralFootnote;
196
206
  const insertFigure = (file, state, dispatch) => {
197
207
  const position = findBlockInsertPosition(state);
198
208
  if (position === null || !dispatch) {
@@ -393,83 +403,88 @@ const insertInlineEquation = (state, dispatch) => {
393
403
  return true;
394
404
  };
395
405
  exports.insertInlineEquation = insertInlineEquation;
396
- const insertTableElementFooter = (tr, table) => {
397
- const footer = (0, prosemirror_utils_1.findChildrenByType)(table[0], transform_1.schema.nodes.table_element_footer)[0];
398
- if (footer) {
399
- const pos = tr.mapping.map(table[1] + footer.pos + 1);
400
- if ((0, track_changes_utils_1.isDeleted)(footer.node)) {
401
- reinstateNode(tr, footer.node, pos);
402
- }
403
- return {
404
- node: footer.node,
405
- pos,
406
- };
407
- }
408
- const pos = tr.mapping.map(table[1] + table[0].nodeSize - 2);
409
- const node = transform_1.schema.nodes.table_element_footer.create();
410
- tr.insert(pos, node);
411
- return {
412
- node,
413
- pos,
414
- };
406
+ const createFootnote = (state, kind) => {
407
+ return transform_1.schema.nodes.footnote.createAndFill({
408
+ id: (0, transform_1.generateNodeID)(transform_1.schema.nodes.footnote),
409
+ kind,
410
+ });
415
411
  };
416
- exports.insertTableElementFooter = insertTableElementFooter;
417
- const insertFootnotesElement = (tr, container) => {
418
- let pos;
419
- if ((0, transform_1.isTableElementNode)(container[0])) {
420
- const footer = (0, exports.insertTableElementFooter)(tr, container);
421
- pos = footer.pos + footer.node.nodeSize - 1;
412
+ exports.createFootnote = createFootnote;
413
+ const insertFootnote = (state, tr, footnote) => {
414
+ const footnotesSection = (0, prosemirror_utils_1.findChildrenByType)(tr.doc, transform_1.schema.nodes.footnotes_section)[0];
415
+ let selectionPos = 0;
416
+ if (!footnotesSection) {
417
+ const section = state.schema.nodes.footnotes_section.create({}, [
418
+ state.schema.nodes.section_title.create({}, state.schema.text('Footnotes')),
419
+ state.schema.nodes.footnotes_element.create({}, footnote),
420
+ ]);
421
+ const backmatter = (0, prosemirror_utils_1.findChildrenByType)(tr.doc, transform_1.schema.nodes.backmatter)[0];
422
+ const sectionPos = backmatter.pos + 1;
423
+ tr.insert(sectionPos, section);
424
+ let footnotePos = 0;
425
+ section.descendants((n, pos) => {
426
+ if ((0, transform_1.isFootnoteNode)(n)) {
427
+ footnotePos = pos;
428
+ n.descendants((childNode, childPos) => {
429
+ if ((0, transform_1.isParagraphNode)(childNode)) {
430
+ footnotePos += childPos;
431
+ }
432
+ });
433
+ }
434
+ });
435
+ selectionPos = sectionPos + footnotePos;
422
436
  }
423
437
  else {
424
- const section = (0, doc_1.insertFootnotesSection)(tr);
425
- pos = section.pos + section.node.nodeSize - 1;
426
- }
427
- const node = transform_1.schema.nodes.footnotes_element.create();
428
- tr.insert(pos, node);
429
- return [node, pos];
430
- };
431
- exports.insertFootnotesElement = insertFootnotesElement;
432
- const insertInlineFootnote = (state, dispatch) => {
433
- const pos = state.selection.to;
434
- const tr = state.tr;
435
- const container = (0, footnotes_1.findFootnotesContainerNode)(state.doc, pos);
436
- const fn = (0, footnotes_1.getFootnotesElementState)(state, container.node.attrs.id);
437
- const hasUnusedFootnotes = fn && fn.unusedFootnoteIDs.size > 0;
438
- const footnote = !hasUnusedFootnotes && (0, footnotes_1.createFootnote)();
439
- const node = transform_1.schema.nodes.inline_footnote.create({
440
- rids: footnote ? [footnote.attrs.id] : [],
441
- });
442
- tr.insert(pos, node);
443
- if (footnote) {
444
- let element;
445
- if (fn) {
446
- element = [fn.element[0], tr.mapping.map(fn.element[1])];
438
+ const footnoteElement = (0, prosemirror_utils_1.findChildrenByType)(footnotesSection.node, transform_1.schema.nodes.footnotes_element).pop();
439
+ if (footnoteElement) {
440
+ if ((0, track_changes_utils_1.isDeleted)(footnoteElement.node)) {
441
+ const footnoteElementPos = footnotesSection.pos + footnoteElement.pos + 1;
442
+ (0, exports.undoFootnoteDelete)(tr, footnoteElement, footnoteElementPos);
443
+ const updatedAttrs = Object.assign(Object.assign({}, footnoteElement.node.attrs), { dataTracked: null });
444
+ tr.setNodeMarkup(footnoteElementPos, undefined, updatedAttrs, footnoteElement.node.marks);
445
+ }
446
+ const pos = footnotesSection.pos +
447
+ footnoteElement.pos +
448
+ footnoteElement.node.nodeSize -
449
+ 1;
450
+ tr.insert(pos, footnote);
451
+ selectionPos = pos + 2;
447
452
  }
448
453
  else {
449
- element = (0, exports.insertFootnotesElement)(tr, [container.node, container.pos]);
454
+ const footnoteElement = transform_1.schema.nodes.footnotes_element.create({}, footnote);
455
+ const pos = footnotesSection.pos + footnotesSection.node.nodeSize - 1;
456
+ tr.insert(pos, footnoteElement);
457
+ selectionPos = pos + 2;
450
458
  }
451
- if ((0, track_changes_utils_1.isDeleted)(element[0])) {
452
- reinstateNode(tr, element[0], element[1]);
453
- }
454
- const fnPos = element[1] + element[0].nodeSize - 1;
455
- tr.insert(fnPos, footnote);
456
- const selection = prosemirror_state_1.TextSelection.create(tr.doc, fnPos + 2);
457
- tr.setSelection(selection).scrollIntoView();
458
459
  }
459
- else {
460
- const selection = prosemirror_state_1.NodeSelection.create(tr.doc, pos);
460
+ if (selectionPos) {
461
+ const selection = prosemirror_state_1.TextSelection.near(tr.doc.resolve(selectionPos));
461
462
  tr.setSelection(selection).scrollIntoView();
462
463
  }
464
+ return tr;
465
+ };
466
+ exports.insertFootnote = insertFootnote;
467
+ const insertInlineFootnote = (kind) => (state, dispatch) => {
468
+ const fnState = footnotes_2.footnotesKey.getState(state);
469
+ const hasUnusedNodes = fnState && fnState.unusedFootnotes.size > 0;
470
+ const footnote = !hasUnusedNodes
471
+ ? (0, exports.createFootnote)(state, kind)
472
+ : null;
473
+ const insertedAt = state.selection.to;
474
+ let tr = state.tr;
475
+ const node = state.schema.nodes.inline_footnote.create({
476
+ rids: footnote ? [footnote.attrs.id] : [],
477
+ });
478
+ tr.insert(insertedAt, node);
479
+ if (footnote) {
480
+ tr = (0, exports.insertFootnote)(state, tr, footnote);
481
+ }
463
482
  if (dispatch) {
464
483
  dispatch(tr);
465
484
  }
466
485
  return true;
467
486
  };
468
487
  exports.insertInlineFootnote = insertInlineFootnote;
469
- const reinstateNode = (tr, node, pos) => {
470
- const attrs = Object.assign(Object.assign({}, node.attrs), { dataTracked: null });
471
- tr.setNodeMarkup(pos, null, attrs);
472
- };
473
488
  const insertGraphicalAbstract = (state, dispatch, view) => {
474
489
  if ((0, utils_1.getChildOfType)(state.doc, transform_1.schema.nodes.graphical_abstract_section, true)) {
475
490
  return false;
@@ -1004,6 +1019,104 @@ const addInlineComment = (state, dispatch) => {
1004
1019
  return false;
1005
1020
  };
1006
1021
  exports.addInlineComment = addInlineComment;
1022
+ const insertTableFootnote = (tableElementNode, position, view, inlineFootnote) => {
1023
+ const { state, dispatch } = view;
1024
+ const tr = state.tr;
1025
+ const footnote = transform_1.schema.nodes.footnote.createAndFill({
1026
+ id: (0, transform_1.generateNodeID)(transform_1.schema.nodes.footnote),
1027
+ kind: 'footnote',
1028
+ });
1029
+ const insertedAt = state.selection.to;
1030
+ let footnoteIndex;
1031
+ if (inlineFootnote) {
1032
+ const contents = inlineFootnote.node.attrs.contents.split(',').map(Number);
1033
+ footnoteIndex = Math.max(...contents) + 1;
1034
+ tr.setNodeMarkup(inlineFootnote.pos, undefined, {
1035
+ rids: [...inlineFootnote.node.attrs.rids, footnote.attrs.id],
1036
+ contents: inlineFootnote.node.attrs.contents + ',' + footnoteIndex,
1037
+ });
1038
+ }
1039
+ else {
1040
+ const inlineFootnotes = (0, prosemirror_utils_1.findChildrenByType)(tableElementNode, transform_1.schema.nodes.inline_footnote);
1041
+ footnoteIndex =
1042
+ inlineFootnotes.filter(({ pos }) => position + pos <= insertedAt).length +
1043
+ 1;
1044
+ const inlineFootnoteNode = state.schema.nodes.inline_footnote.create({
1045
+ rids: [footnote.attrs.id],
1046
+ contents: footnoteIndex === -1 ? inlineFootnotes.length : footnoteIndex,
1047
+ });
1048
+ tr.insert(insertedAt, inlineFootnoteNode);
1049
+ }
1050
+ let insertionPos = position;
1051
+ const footnotesElement = (0, prosemirror_utils_1.findChildrenByType)(tableElementNode, transform_1.schema.nodes.footnotes_element).pop();
1052
+ if (footnotesElement) {
1053
+ if ((0, track_changes_utils_1.isDeleted)(footnotesElement.node)) {
1054
+ const footnotesElementPos = tr.mapping.map(position + footnotesElement.pos + 1);
1055
+ (0, exports.undoFootnoteDelete)(tr, footnotesElement, footnotesElementPos);
1056
+ }
1057
+ const footnotePos = (0, footnotes_1.getNewFootnotePos)(footnotesElement, footnoteIndex);
1058
+ insertionPos = tr.mapping.map(position + footnotePos);
1059
+ tr.insert(insertionPos, footnote);
1060
+ }
1061
+ else {
1062
+ const footnoteElement = state.schema.nodes.footnotes_element.create({}, footnote);
1063
+ const tableElementFooter = (0, prosemirror_utils_1.findChildrenByType)(tableElementNode, transform_1.schema.nodes.table_element_footer)[0];
1064
+ if (tableElementFooter) {
1065
+ if ((0, track_changes_utils_1.isDeleted)(tableElementFooter.node)) {
1066
+ const tableElementFooterPos = tr.mapping.map(position + tableElementFooter.pos + 1);
1067
+ (0, exports.undoFootnoteDelete)(tr, tableElementFooter, tableElementFooterPos);
1068
+ }
1069
+ const pos = tableElementFooter.pos;
1070
+ insertionPos = position + pos + tableElementFooter.node.nodeSize;
1071
+ tr.insert(tr.mapping.map(insertionPos), footnoteElement);
1072
+ }
1073
+ else {
1074
+ const tableElementFooter = transform_1.schema.nodes.table_element_footer.create({
1075
+ id: (0, transform_1.generateNodeID)(transform_1.schema.nodes.table_element_footer),
1076
+ }, [footnoteElement]);
1077
+ const tableColGroup = (0, prosemirror_utils_1.findChildrenByType)(tableElementNode, transform_1.schema.nodes.table_colgroup)[0];
1078
+ const table = (0, prosemirror_utils_1.findChildrenByType)(tableElementNode, transform_1.schema.nodes.table)[0];
1079
+ if (tableColGroup) {
1080
+ insertionPos =
1081
+ position + tableColGroup.pos + tableColGroup.node.nodeSize;
1082
+ tr.insert(tr.mapping.map(insertionPos), tableElementFooter);
1083
+ }
1084
+ else {
1085
+ insertionPos = position + table.pos + table.node.nodeSize;
1086
+ tr.insert(tr.mapping.map(insertionPos), tableElementFooter);
1087
+ }
1088
+ }
1089
+ }
1090
+ dispatch(tr);
1091
+ const textSelection = prosemirror_state_1.TextSelection.near(view.state.tr.doc.resolve(insertionPos + 1));
1092
+ view.focus();
1093
+ dispatch(view.state.tr.setSelection(textSelection).scrollIntoView());
1094
+ };
1095
+ exports.insertTableFootnote = insertTableFootnote;
1096
+ const insertBoxElement = (state, dispatch) => {
1097
+ const selection = state.selection;
1098
+ const isBody = (0, prosemirror_utils_1.hasParentNodeOfType)(transform_1.schema.nodes.body)(selection);
1099
+ const isBoxText = (0, prosemirror_utils_1.hasParentNodeOfType)(transform_1.schema.nodes.box_element)(selection);
1100
+ if (!isBody || isBoxText) {
1101
+ return false;
1102
+ }
1103
+ const position = findBlockInsertPosition(state);
1104
+ const paragraph = transform_1.schema.nodes.paragraph.create({});
1105
+ const section = transform_1.schema.nodes.section.createAndFill({}, [
1106
+ transform_1.schema.nodes.section_title.create(),
1107
+ paragraph,
1108
+ ]);
1109
+ const BoxElementNode = transform_1.schema.nodes.box_element.createAndFill({}, [
1110
+ transform_1.schema.nodes.figcaption.create({}, [transform_1.schema.nodes.caption_title.create()]),
1111
+ section,
1112
+ ]);
1113
+ if (position && dispatch) {
1114
+ const tr = state.tr.insert(position, BoxElementNode);
1115
+ dispatch(tr);
1116
+ }
1117
+ return true;
1118
+ };
1119
+ exports.insertBoxElement = insertBoxElement;
1007
1120
  const addRows = (direction) => (state, dispatch) => {
1008
1121
  if (dispatch) {
1009
1122
  const { tr } = state;
@@ -26,7 +26,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.DeleteFootnoteDialog = void 0;
27
27
  const style_guide_1 = require("@manuscripts/style-guide");
28
28
  const react_1 = __importStar(require("react"));
29
- const DeleteFootnoteDialog = ({ handleDelete, }) => {
29
+ const DeleteFootnoteDialog = ({ footnoteType, footnoteMessage, handleDelete, }) => {
30
30
  const [isOpen, setOpen] = (0, react_1.useState)(true);
31
31
  return (react_1.default.createElement(style_guide_1.Dialog, { className: "delete-footnote-dialog", isOpen: isOpen, actions: {
32
32
  primary: {
@@ -40,6 +40,6 @@ const DeleteFootnoteDialog = ({ handleDelete, }) => {
40
40
  action: () => setOpen(false),
41
41
  title: 'Cancel',
42
42
  },
43
- }, category: style_guide_1.Category.confirmation, header: `Delete footnote`, message: `This action will entirely remove the footnote from the list because it will no longer be used.` }));
43
+ }, category: style_guide_1.Category.confirmation, header: `Delete ${footnoteType}`, message: `${footnoteMessage}` }));
44
44
  };
45
45
  exports.DeleteFootnoteDialog = DeleteFootnoteDialog;
@@ -76,12 +76,12 @@ const AddNewFootnote = (0, styled_components_1.default)(style_guide_1.ButtonGrou
76
76
  }
77
77
  }
78
78
  `;
79
- const FootnotesSelector = ({ footnotes, inlineFootnote, labels, onAdd, onInsert, onCancel, addNewLabel, }) => {
79
+ const FootnotesSelector = ({ notes, inlineFootnote, onAdd, onInsert, onCancel, addNewLabel }) => {
80
80
  let selectedNotesMap;
81
81
  if (inlineFootnote) {
82
82
  const rids = inlineFootnote.attrs.rids;
83
- const selectedNotes = footnotes.filter((node) => rids.includes(node.attrs.id));
84
- selectedNotesMap = new Map(selectedNotes.map((node) => [node.attrs.id, node]));
83
+ const selectedNotes = notes.filter(({ node }) => rids.includes(node.attrs.id));
84
+ selectedNotesMap = new Map(selectedNotes.map(({ node }) => [node.attrs.id, node]));
85
85
  }
86
86
  const [selections, setSelections] = (0, react_1.useState)(new Map(selectedNotesMap));
87
87
  const toggleSelection = (item) => {
@@ -99,11 +99,11 @@ const FootnotesSelector = ({ footnotes, inlineFootnote, labels, onAdd, onInsert,
99
99
  return selections.has(item.attrs.id);
100
100
  };
101
101
  const handleClick = () => {
102
- return onInsert(footnotes.filter((node) => selections.has(node.attrs.id)));
102
+ return onInsert(notes.filter(({ node }) => selections.has(node.attrs.id)));
103
103
  };
104
104
  return (react_1.default.createElement(Container, null,
105
105
  react_1.default.createElement(NotesContainer, null,
106
- react_1.default.createElement(FootnotesList, { footnotes: footnotes, inlineFootnote: inlineFootnote, labels: labels, isSelected: isSelected, onSelect: toggleSelection })),
106
+ react_1.default.createElement(FootnotesList, { notes: notes, inlineFootnote: inlineFootnote, isSelected: isSelected, onSelect: toggleSelection })),
107
107
  react_1.default.createElement(Actions, null,
108
108
  react_1.default.createElement(AddNewFootnote, null,
109
109
  react_1.default.createElement(style_guide_1.IconTextButton, { onClick: onAdd },
@@ -114,28 +114,29 @@ const FootnotesSelector = ({ footnotes, inlineFootnote, labels, onAdd, onInsert,
114
114
  react_1.default.createElement(style_guide_1.PrimaryButton, { onClick: handleClick, disabled: selections.size === 0 && !inlineFootnote }, inlineFootnote ? 'Update' : 'Insert')))));
115
115
  };
116
116
  exports.FootnotesSelector = FootnotesSelector;
117
- const FootnotesList = ({ footnotes, inlineFootnote, labels, isSelected, onSelect }) => {
118
- const rids = inlineFootnote === null || inlineFootnote === void 0 ? void 0 : inlineFootnote.attrs.rids;
117
+ const FootnotesList = ({ notes, isSelected, onSelect, inlineFootnote }) => {
119
118
  const selectedNotes = [];
120
119
  const remainingNotes = [];
121
- footnotes.forEach((footnote) => {
122
- const isNoteSelected = rids === null || rids === void 0 ? void 0 : rids.includes(footnote.attrs.id);
120
+ notes.forEach((note) => {
121
+ const isNoteSelected = inlineFootnote && inlineFootnote.attrs.rids.includes(note.node.attrs.id);
123
122
  if (isNoteSelected) {
124
- selectedNotes.push(footnote);
123
+ selectedNotes.push(note);
125
124
  }
126
125
  else {
127
- remainingNotes.push(footnote);
126
+ remainingNotes.push(note);
128
127
  }
129
128
  });
130
129
  return (react_1.default.createElement(NotesListContainer, null,
131
- selectedNotes.map((footnote) => (react_1.default.createElement(FootnoteItem, { key: footnote.attrs.id, footnote: footnote, label: labels.get(footnote.attrs.id), isSelected: isSelected, onSelect: onSelect }))),
130
+ selectedNotes.map((note) => (react_1.default.createElement(FootnoteItem, { key: note.node.attrs.id, note: note, isSelected: isSelected, onSelect: onSelect }))),
132
131
  selectedNotes.length > 0 && remainingNotes.length > 0 && react_1.default.createElement(Separator, null),
133
- remainingNotes.map((footnote) => (react_1.default.createElement(FootnoteItem, { key: footnote.attrs.id, footnote: footnote, label: labels.get(footnote.attrs.id), isSelected: isSelected, onSelect: onSelect })))));
132
+ remainingNotes.map((note) => (react_1.default.createElement(FootnoteItem, { key: note.node.attrs.id, note: note, isSelected: isSelected, onSelect: onSelect })))));
134
133
  };
135
- const FootnoteItem = ({ footnote, label, isSelected, onSelect }) => {
136
- return (react_1.default.createElement(FootnoteItemContainer, { onClick: () => onSelect(footnote) },
137
- react_1.default.createElement(StatusIcon, null, isSelected(footnote) ? (react_1.default.createElement(style_guide_1.AddedIcon, { "data-cy": 'plus-icon-ok' })) : (react_1.default.createElement(style_guide_1.AddIcon, { "data-cy": 'plus-icon' }))),
138
- react_1.default.createElement(NoteText, null, (label ? label + '. ' : '') + footnote.textContent)));
134
+ const FootnoteItem = ({ note, isSelected, onSelect }) => {
135
+ var _a;
136
+ const { node, index } = note;
137
+ return (react_1.default.createElement(FootnoteItemContainer, { onClick: () => onSelect(node) },
138
+ react_1.default.createElement(StatusIcon, null, isSelected(node) ? (react_1.default.createElement(style_guide_1.AddedIcon, { "data-cy": 'plus-icon-ok' })) : (react_1.default.createElement(style_guide_1.AddIcon, { "data-cy": 'plus-icon' }))),
139
+ react_1.default.createElement(NoteText, null, (index ? index + '. ' : '') + ((_a = node.firstChild) === null || _a === void 0 ? void 0 : _a.textContent))));
139
140
  };
140
141
  const Separator = styled_components_1.default.div `
141
142
  height: 0;
@@ -41,6 +41,7 @@ const section_title_1 = __importDefault(require("../plugins/section_title"));
41
41
  const section_category_1 = __importDefault(require("../plugins/section-category"));
42
42
  const sections_1 = __importDefault(require("../plugins/sections"));
43
43
  const selected_suggestion_1 = __importDefault(require("../plugins/selected-suggestion"));
44
+ const table_footnote_1 = __importDefault(require("../plugins/table-footnote"));
44
45
  const tables_cursor_fix_1 = __importDefault(require("../plugins/tables-cursor-fix"));
45
46
  const toc_1 = __importDefault(require("../plugins/toc"));
46
47
  const rules_1 = __importDefault(require("../rules"));
@@ -72,6 +73,7 @@ exports.default = (props) => {
72
73
  (0, prosemirror_tables_1.tableEditing)(),
73
74
  (0, selected_suggestion_1.default)(),
74
75
  (0, footnotes_1.default)(props),
76
+ (0, table_footnote_1.default)(),
75
77
  (0, editor_props_1.default)(props),
76
78
  (0, doi_1.default)(),
77
79
  (0, section_category_1.default)(props),
@@ -31,9 +31,8 @@ const equation_editable_1 = __importDefault(require("../views/equation_editable"
31
31
  const equation_element_editable_1 = __importDefault(require("../views/equation_element_editable"));
32
32
  const figure_editable_1 = __importDefault(require("../views/figure_editable"));
33
33
  const figure_element_editable_1 = __importDefault(require("../views/figure_element_editable"));
34
- const footnote_1 = __importDefault(require("../views/footnote"));
34
+ const footnote_editable_1 = __importDefault(require("../views/footnote_editable"));
35
35
  const footnotes_element_1 = __importDefault(require("../views/footnotes_element"));
36
- const general_table_footnote_1 = __importDefault(require("../views/general_table_footnote"));
37
36
  const inline_equation_editable_1 = __importDefault(require("../views/inline_equation_editable"));
38
37
  const inline_footnote_editable_1 = __importDefault(require("../views/inline_footnote_editable"));
39
38
  const keyword_1 = __importDefault(require("../views/keyword"));
@@ -50,7 +49,7 @@ const section_label_1 = __importDefault(require("../views/section_label"));
50
49
  const section_title_editable_1 = __importDefault(require("../views/section_title_editable"));
51
50
  const table_cell_1 = __importDefault(require("../views/table_cell"));
52
51
  const table_element_editable_1 = __importDefault(require("../views/table_element_editable"));
53
- const table_element_footer_1 = __importDefault(require("../views/table_element_footer"));
52
+ const table_element_footer_editable_1 = __importDefault(require("../views/table_element_footer_editable"));
54
53
  const title_editable_1 = __importDefault(require("../views/title_editable"));
55
54
  const toc_element_editable_1 = __importDefault(require("../views/toc_element_editable"));
56
55
  exports.default = (props, dispatch) => {
@@ -67,9 +66,8 @@ exports.default = (props, dispatch) => {
67
66
  equation_element: (0, equation_element_editable_1.default)(props),
68
67
  figure: (0, figure_editable_1.default)(props, dispatch),
69
68
  figure_element: (0, figure_element_editable_1.default)(props, dispatch),
70
- footnote: (0, footnote_1.default)(props),
69
+ footnote: (0, footnote_editable_1.default)(props),
71
70
  footnotes_element: (0, footnotes_element_1.default)(props),
72
- general_table_footnote: (0, general_table_footnote_1.default)(props, dispatch),
73
71
  inline_equation: (0, inline_equation_editable_1.default)(props),
74
72
  inline_footnote: (0, inline_footnote_editable_1.default)(props, dispatch),
75
73
  keyword: (0, keyword_1.default)(props, dispatch),
@@ -87,7 +85,7 @@ exports.default = (props, dispatch) => {
87
85
  table_element: (0, table_element_editable_1.default)(props),
88
86
  table_cell: (0, table_cell_1.default)(props),
89
87
  table_header: (0, table_cell_1.default)(props),
90
- table_element_footer: (0, table_element_footer_1.default)(props),
88
+ table_element_footer: (0, table_element_footer_editable_1.default)(props),
91
89
  toc_element: (0, toc_element_editable_1.default)(props),
92
90
  comments: (0, empty_1.default)('comments'),
93
91
  supplements: (0, empty_1.default)('supplements'),
package/dist/cjs/index.js CHANGED
@@ -47,7 +47,6 @@ Object.defineProperty(exports, "PopperManager", { enumerable: true, get: functio
47
47
  __exportStar(require("./toolbar"), exports);
48
48
  __exportStar(require("./lib/comments"), exports);
49
49
  __exportStar(require("./lib/files"), exports);
50
- __exportStar(require("./lib/footnotes"), exports);
51
50
  __exportStar(require("./lib/doc"), exports);
52
51
  __exportStar(require("./plugins/comments"), exports);
53
52
  var selected_suggestion_1 = require("./plugins/selected-suggestion");