@atlaskit/editor-plugin-table 1.1.1 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/cjs/index.js +0 -2
- package/dist/cjs/plugins/table/commands/clear.js +4 -16
- package/dist/cjs/plugins/table/commands/collapse.js +0 -6
- package/dist/cjs/plugins/table/commands/go-to-next-cell.js +7 -18
- package/dist/cjs/plugins/table/commands/hover.js +7 -37
- package/dist/cjs/plugins/table/commands/index.js +0 -8
- package/dist/cjs/plugins/table/commands/insert.js +17 -56
- package/dist/cjs/plugins/table/commands/misc.js +36 -132
- package/dist/cjs/plugins/table/commands/referentiality.js +0 -4
- package/dist/cjs/plugins/table/commands/selection.js +21 -87
- package/dist/cjs/plugins/table/commands/sort.js +2 -23
- package/dist/cjs/plugins/table/commands/split-cell.js +3 -11
- package/dist/cjs/plugins/table/commands/toggle.js +8 -34
- package/dist/cjs/plugins/table/commands-with-analytics.js +50 -139
- package/dist/cjs/plugins/table/create-plugin-config.js +0 -6
- package/dist/cjs/plugins/table/event-handlers.js +58 -160
- package/dist/cjs/plugins/table/handlers.js +10 -39
- package/dist/cjs/plugins/table/index.js +47 -91
- package/dist/cjs/plugins/table/nodeviews/OverflowShadowsObserver.js +8 -41
- package/dist/cjs/plugins/table/nodeviews/TableComponent.js +82 -188
- package/dist/cjs/plugins/table/nodeviews/table.js +12 -70
- package/dist/cjs/plugins/table/nodeviews/tableCell.js +15 -39
- package/dist/cjs/plugins/table/nodeviews/update-overflow-shadows.js +3 -15
- package/dist/cjs/plugins/table/pm-plugins/decorations/plugin.js +0 -18
- package/dist/cjs/plugins/table/pm-plugins/decorations/utils/column-controls.js +8 -27
- package/dist/cjs/plugins/table/pm-plugins/decorations/utils/column-resizing.js +8 -20
- package/dist/cjs/plugins/table/pm-plugins/decorations/utils/compose-decorations.js +1 -3
- package/dist/cjs/plugins/table/pm-plugins/decorations/utils/index.js +0 -3
- package/dist/cjs/plugins/table/pm-plugins/keymap.js +2 -15
- package/dist/cjs/plugins/table/pm-plugins/main.js +20 -72
- package/dist/cjs/plugins/table/pm-plugins/plugin-factory.js +25 -42
- package/dist/cjs/plugins/table/pm-plugins/plugin-key.js +0 -2
- package/dist/cjs/plugins/table/pm-plugins/safari-delayed-dom-selection-syncing-workaround.js +8 -8
- package/dist/cjs/plugins/table/pm-plugins/safari-delete-composition-text-issue-workaround.js +4 -23
- package/dist/cjs/plugins/table/pm-plugins/sticky-headers/commands.js +0 -5
- package/dist/cjs/plugins/table/pm-plugins/sticky-headers/index.js +0 -5
- package/dist/cjs/plugins/table/pm-plugins/sticky-headers/nodeviews/dom.js +4 -13
- package/dist/cjs/plugins/table/pm-plugins/sticky-headers/nodeviews/tableRow.js +56 -138
- package/dist/cjs/plugins/table/pm-plugins/sticky-headers/plugin-key.js +0 -2
- package/dist/cjs/plugins/table/pm-plugins/sticky-headers/plugin-state.js +15 -30
- package/dist/cjs/plugins/table/pm-plugins/sticky-headers/plugin.js +0 -6
- package/dist/cjs/plugins/table/pm-plugins/sticky-headers/util.js +0 -5
- package/dist/cjs/plugins/table/pm-plugins/table-local-id.js +13 -44
- package/dist/cjs/plugins/table/pm-plugins/table-resizing/commands.js +12 -42
- package/dist/cjs/plugins/table/pm-plugins/table-resizing/event-handlers.js +16 -52
- package/dist/cjs/plugins/table/pm-plugins/table-resizing/index.js +0 -4
- package/dist/cjs/plugins/table/pm-plugins/table-resizing/plugin-factory.js +0 -10
- package/dist/cjs/plugins/table/pm-plugins/table-resizing/plugin-key.js +0 -2
- package/dist/cjs/plugins/table/pm-plugins/table-resizing/plugin.js +5 -19
- package/dist/cjs/plugins/table/pm-plugins/table-resizing/reducer.js +0 -10
- package/dist/cjs/plugins/table/pm-plugins/table-resizing/utils/colgroup.js +0 -15
- package/dist/cjs/plugins/table/pm-plugins/table-resizing/utils/column-state.js +8 -28
- package/dist/cjs/plugins/table/pm-plugins/table-resizing/utils/content-width.js +3 -23
- package/dist/cjs/plugins/table/pm-plugins/table-resizing/utils/dom.js +4 -46
- package/dist/cjs/plugins/table/pm-plugins/table-resizing/utils/index.js +0 -9
- package/dist/cjs/plugins/table/pm-plugins/table-resizing/utils/misc.js +15 -36
- package/dist/cjs/plugins/table/pm-plugins/table-resizing/utils/resize-column.js +1 -4
- package/dist/cjs/plugins/table/pm-plugins/table-resizing/utils/resize-logic.js +15 -71
- package/dist/cjs/plugins/table/pm-plugins/table-resizing/utils/resize-state.js +34 -82
- package/dist/cjs/plugins/table/pm-plugins/table-resizing/utils/scale-table.js +12 -36
- package/dist/cjs/plugins/table/pm-plugins/table-resizing/utils/unit-to-number.js +0 -2
- package/dist/cjs/plugins/table/pm-plugins/table-selection-keymap.js +0 -5
- package/dist/cjs/plugins/table/reducer.js +0 -24
- package/dist/cjs/plugins/table/toolbar.js +14 -94
- package/dist/cjs/plugins/table/transforms/column-width.js +12 -45
- package/dist/cjs/plugins/table/transforms/delete-columns.js +11 -76
- package/dist/cjs/plugins/table/transforms/delete-rows.js +4 -42
- package/dist/cjs/plugins/table/transforms/fix-tables.js +24 -61
- package/dist/cjs/plugins/table/transforms/index.js +0 -7
- package/dist/cjs/plugins/table/transforms/merge.js +14 -90
- package/dist/cjs/plugins/table/transforms/metadata.js +0 -5
- package/dist/cjs/plugins/table/transforms/replace-table.js +2 -13
- package/dist/cjs/plugins/table/transforms/split.js +18 -32
- package/dist/cjs/plugins/table/types.js +0 -11
- package/dist/cjs/plugins/table/ui/FloatingContextualButton/index.js +10 -51
- package/dist/cjs/plugins/table/ui/FloatingContextualButton/styles.js +0 -12
- package/dist/cjs/plugins/table/ui/FloatingContextualMenu/ContextualMenu.js +46 -145
- package/dist/cjs/plugins/table/ui/FloatingContextualMenu/index.js +12 -35
- package/dist/cjs/plugins/table/ui/FloatingContextualMenu/styles.js +0 -11
- package/dist/cjs/plugins/table/ui/FloatingDeleteButton/DeleteButton.js +5 -12
- package/dist/cjs/plugins/table/ui/FloatingDeleteButton/getPopUpOptions.js +3 -16
- package/dist/cjs/plugins/table/ui/FloatingDeleteButton/index.js +19 -89
- package/dist/cjs/plugins/table/ui/FloatingInsertButton/InsertButton.js +6 -31
- package/dist/cjs/plugins/table/ui/FloatingInsertButton/getPopupOptions.js +5 -22
- package/dist/cjs/plugins/table/ui/FloatingInsertButton/index.js +25 -80
- package/dist/cjs/plugins/table/ui/LayoutButton/index.js +16 -64
- package/dist/cjs/plugins/table/ui/TableFloatingControls/CornerControls/index.js +14 -47
- package/dist/cjs/plugins/table/ui/TableFloatingControls/NumberColumn/index.js +20 -48
- package/dist/cjs/plugins/table/ui/TableFloatingControls/RowControls/index.js +10 -43
- package/dist/cjs/plugins/table/ui/TableFloatingControls/index.js +33 -74
- package/dist/cjs/plugins/table/ui/common-styles.js +6 -19
- package/dist/cjs/plugins/table/ui/consts.js +3 -8
- package/dist/cjs/plugins/table/ui/messages.js +0 -3
- package/dist/cjs/plugins/table/ui/ui-styles.js +0 -32
- package/dist/cjs/plugins/table/utils/analytics.js +4 -19
- package/dist/cjs/plugins/table/utils/collapse.js +4 -21
- package/dist/cjs/plugins/table/utils/column-controls.js +25 -61
- package/dist/cjs/plugins/table/utils/decoration.js +46 -114
- package/dist/cjs/plugins/table/utils/dom.js +4 -51
- package/dist/cjs/plugins/table/utils/get-allow-add-column-custom-step.js +0 -2
- package/dist/cjs/plugins/table/utils/index.js +0 -10
- package/dist/cjs/plugins/table/utils/nodes.js +5 -48
- package/dist/cjs/plugins/table/utils/paste.js +22 -47
- package/dist/cjs/plugins/table/utils/row-controls.js +6 -67
- package/dist/cjs/plugins/table/utils/selection.js +3 -36
- package/dist/cjs/plugins/table/utils/table.js +0 -11
- package/dist/cjs/plugins/table/utils/update-plugin-state-decorations.js +0 -4
- package/dist/cjs/plugins/table-plugin.js +0 -3
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/plugins/table/commands/clear.js +3 -8
- package/dist/es2019/plugins/table/commands/collapse.js +0 -3
- package/dist/es2019/plugins/table/commands/go-to-next-cell.js +4 -7
- package/dist/es2019/plugins/table/commands/hover.js +7 -17
- package/dist/es2019/plugins/table/commands/insert.js +16 -36
- package/dist/es2019/plugins/table/commands/misc.js +37 -67
- package/dist/es2019/plugins/table/commands/selection.js +7 -62
- package/dist/es2019/plugins/table/commands/sort.js +0 -12
- package/dist/es2019/plugins/table/commands/split-cell.js +0 -4
- package/dist/es2019/plugins/table/commands/toggle.js +13 -15
- package/dist/es2019/plugins/table/commands-with-analytics.js +4 -14
- package/dist/es2019/plugins/table/event-handlers.js +14 -62
- package/dist/es2019/plugins/table/handlers.js +16 -26
- package/dist/es2019/plugins/table/index.js +12 -25
- package/dist/es2019/plugins/table/nodeviews/OverflowShadowsObserver.js +8 -40
- package/dist/es2019/plugins/table/nodeviews/TableComponent.js +27 -100
- package/dist/es2019/plugins/table/nodeviews/table.js +3 -33
- package/dist/es2019/plugins/table/nodeviews/tableCell.js +7 -16
- package/dist/es2019/plugins/table/nodeviews/update-overflow-shadows.js +3 -10
- package/dist/es2019/plugins/table/pm-plugins/decorations/plugin.js +0 -5
- package/dist/es2019/plugins/table/pm-plugins/decorations/utils/column-controls.js +4 -13
- package/dist/es2019/plugins/table/pm-plugins/decorations/utils/column-resizing.js +0 -3
- package/dist/es2019/plugins/table/pm-plugins/keymap.js +2 -3
- package/dist/es2019/plugins/table/pm-plugins/main.js +19 -43
- package/dist/es2019/plugins/table/pm-plugins/plugin-factory.js +2 -6
- package/dist/es2019/plugins/table/pm-plugins/safari-delayed-dom-selection-syncing-workaround.js +8 -3
- package/dist/es2019/plugins/table/pm-plugins/safari-delete-composition-text-issue-workaround.js +0 -12
- package/dist/es2019/plugins/table/pm-plugins/sticky-headers/nodeviews/dom.js +4 -9
- package/dist/es2019/plugins/table/pm-plugins/sticky-headers/nodeviews/tableRow.js +55 -130
- package/dist/es2019/plugins/table/pm-plugins/sticky-headers/plugin-state.js +2 -9
- package/dist/es2019/plugins/table/pm-plugins/sticky-headers/util.js +0 -3
- package/dist/es2019/plugins/table/pm-plugins/table-local-id.js +20 -39
- package/dist/es2019/plugins/table/pm-plugins/table-resizing/commands.js +7 -15
- package/dist/es2019/plugins/table/pm-plugins/table-resizing/event-handlers.js +9 -27
- package/dist/es2019/plugins/table/pm-plugins/table-resizing/plugin-factory.js +2 -4
- package/dist/es2019/plugins/table/pm-plugins/table-resizing/plugin.js +2 -5
- package/dist/es2019/plugins/table/pm-plugins/table-resizing/reducer.js +8 -8
- package/dist/es2019/plugins/table/pm-plugins/table-resizing/utils/colgroup.js +0 -4
- package/dist/es2019/plugins/table/pm-plugins/table-resizing/utils/column-state.js +8 -11
- package/dist/es2019/plugins/table/pm-plugins/table-resizing/utils/content-width.js +4 -21
- package/dist/es2019/plugins/table/pm-plugins/table-resizing/utils/dom.js +3 -22
- package/dist/es2019/plugins/table/pm-plugins/table-resizing/utils/misc.js +10 -18
- package/dist/es2019/plugins/table/pm-plugins/table-resizing/utils/resize-logic.js +29 -59
- package/dist/es2019/plugins/table/pm-plugins/table-resizing/utils/resize-state.js +54 -51
- package/dist/es2019/plugins/table/pm-plugins/table-resizing/utils/scale-table.js +9 -14
- package/dist/es2019/plugins/table/reducer.js +26 -30
- package/dist/es2019/plugins/table/toolbar.js +5 -48
- package/dist/es2019/plugins/table/transforms/column-width.js +16 -28
- package/dist/es2019/plugins/table/transforms/delete-columns.js +17 -58
- package/dist/es2019/plugins/table/transforms/delete-rows.js +8 -25
- package/dist/es2019/plugins/table/transforms/fix-tables.js +25 -42
- package/dist/es2019/plugins/table/transforms/merge.js +22 -70
- package/dist/es2019/plugins/table/transforms/metadata.js +3 -2
- package/dist/es2019/plugins/table/transforms/replace-table.js +0 -2
- package/dist/es2019/plugins/table/transforms/split.js +16 -19
- package/dist/es2019/plugins/table/types.js +2 -4
- package/dist/es2019/plugins/table/ui/FloatingContextualButton/index.js +2 -16
- package/dist/es2019/plugins/table/ui/FloatingContextualMenu/ContextualMenu.js +8 -54
- package/dist/es2019/plugins/table/ui/FloatingContextualMenu/index.js +4 -13
- package/dist/es2019/plugins/table/ui/FloatingDeleteButton/DeleteButton.js +0 -2
- package/dist/es2019/plugins/table/ui/FloatingDeleteButton/getPopUpOptions.js +2 -11
- package/dist/es2019/plugins/table/ui/FloatingDeleteButton/index.js +13 -49
- package/dist/es2019/plugins/table/ui/FloatingInsertButton/InsertButton.js +0 -8
- package/dist/es2019/plugins/table/ui/FloatingInsertButton/getPopupOptions.js +16 -24
- package/dist/es2019/plugins/table/ui/FloatingInsertButton/index.js +3 -31
- package/dist/es2019/plugins/table/ui/LayoutButton/index.js +2 -29
- package/dist/es2019/plugins/table/ui/TableFloatingControls/CornerControls/index.js +0 -12
- package/dist/es2019/plugins/table/ui/TableFloatingControls/NumberColumn/index.js +6 -12
- package/dist/es2019/plugins/table/ui/TableFloatingControls/RowControls/index.js +0 -9
- package/dist/es2019/plugins/table/ui/TableFloatingControls/index.js +4 -19
- package/dist/es2019/plugins/table/ui/common-styles.js +6 -5
- package/dist/es2019/plugins/table/ui/consts.js +4 -3
- package/dist/es2019/plugins/table/ui/ui-styles.js +0 -10
- package/dist/es2019/plugins/table/utils/analytics.js +0 -8
- package/dist/es2019/plugins/table/utils/collapse.js +3 -14
- package/dist/es2019/plugins/table/utils/column-controls.js +22 -37
- package/dist/es2019/plugins/table/utils/decoration.js +13 -51
- package/dist/es2019/plugins/table/utils/dom.js +3 -19
- package/dist/es2019/plugins/table/utils/nodes.js +2 -15
- package/dist/es2019/plugins/table/utils/paste.js +17 -22
- package/dist/es2019/plugins/table/utils/row-controls.js +12 -45
- package/dist/es2019/plugins/table/utils/selection.js +0 -21
- package/dist/es2019/plugins/table/utils/table.js +0 -2
- package/dist/es2019/version.json +1 -1
- package/dist/esm/plugins/table/commands/clear.js +3 -8
- package/dist/esm/plugins/table/commands/collapse.js +0 -3
- package/dist/esm/plugins/table/commands/go-to-next-cell.js +6 -9
- package/dist/esm/plugins/table/commands/hover.js +8 -18
- package/dist/esm/plugins/table/commands/insert.js +16 -36
- package/dist/esm/plugins/table/commands/misc.js +39 -78
- package/dist/esm/plugins/table/commands/selection.js +21 -78
- package/dist/esm/plugins/table/commands/sort.js +2 -14
- package/dist/esm/plugins/table/commands/split-cell.js +3 -8
- package/dist/esm/plugins/table/commands/toggle.js +11 -20
- package/dist/esm/plugins/table/commands-with-analytics.js +50 -85
- package/dist/esm/plugins/table/create-plugin-config.js +0 -3
- package/dist/esm/plugins/table/event-handlers.js +58 -123
- package/dist/esm/plugins/table/handlers.js +11 -29
- package/dist/esm/plugins/table/index.js +47 -60
- package/dist/esm/plugins/table/nodeviews/OverflowShadowsObserver.js +8 -44
- package/dist/esm/plugins/table/nodeviews/TableComponent.js +82 -181
- package/dist/esm/plugins/table/nodeviews/table.js +12 -52
- package/dist/esm/plugins/table/nodeviews/tableCell.js +15 -33
- package/dist/esm/plugins/table/nodeviews/update-overflow-shadows.js +3 -10
- package/dist/esm/plugins/table/pm-plugins/decorations/plugin.js +0 -5
- package/dist/esm/plugins/table/pm-plugins/decorations/utils/column-controls.js +8 -19
- package/dist/esm/plugins/table/pm-plugins/decorations/utils/column-resizing.js +8 -13
- package/dist/esm/plugins/table/pm-plugins/decorations/utils/compose-decorations.js +1 -1
- package/dist/esm/plugins/table/pm-plugins/keymap.js +2 -3
- package/dist/esm/plugins/table/pm-plugins/main.js +20 -47
- package/dist/esm/plugins/table/pm-plugins/plugin-factory.js +25 -37
- package/dist/esm/plugins/table/pm-plugins/safari-delayed-dom-selection-syncing-workaround.js +8 -3
- package/dist/esm/plugins/table/pm-plugins/safari-delete-composition-text-issue-workaround.js +3 -15
- package/dist/esm/plugins/table/pm-plugins/sticky-headers/nodeviews/dom.js +4 -9
- package/dist/esm/plugins/table/pm-plugins/sticky-headers/nodeviews/tableRow.js +58 -147
- package/dist/esm/plugins/table/pm-plugins/sticky-headers/plugin-state.js +15 -27
- package/dist/esm/plugins/table/pm-plugins/sticky-headers/util.js +0 -3
- package/dist/esm/plugins/table/pm-plugins/table-local-id.js +14 -37
- package/dist/esm/plugins/table/pm-plugins/table-resizing/commands.js +12 -24
- package/dist/esm/plugins/table/pm-plugins/table-resizing/event-handlers.js +16 -36
- package/dist/esm/plugins/table/pm-plugins/table-resizing/plugin-factory.js +0 -6
- package/dist/esm/plugins/table/pm-plugins/table-resizing/plugin.js +5 -8
- package/dist/esm/plugins/table/pm-plugins/table-resizing/reducer.js +0 -7
- package/dist/esm/plugins/table/pm-plugins/table-resizing/utils/colgroup.js +0 -4
- package/dist/esm/plugins/table/pm-plugins/table-resizing/utils/column-state.js +8 -12
- package/dist/esm/plugins/table/pm-plugins/table-resizing/utils/content-width.js +5 -22
- package/dist/esm/plugins/table/pm-plugins/table-resizing/utils/dom.js +4 -23
- package/dist/esm/plugins/table/pm-plugins/table-resizing/utils/misc.js +15 -23
- package/dist/esm/plugins/table/pm-plugins/table-resizing/utils/resize-logic.js +15 -60
- package/dist/esm/plugins/table/pm-plugins/table-resizing/utils/resize-state.js +34 -55
- package/dist/esm/plugins/table/pm-plugins/table-resizing/utils/scale-table.js +12 -24
- package/dist/esm/plugins/table/reducer.js +0 -20
- package/dist/esm/plugins/table/toolbar.js +13 -63
- package/dist/esm/plugins/table/transforms/column-width.js +12 -32
- package/dist/esm/plugins/table/transforms/delete-columns.js +11 -62
- package/dist/esm/plugins/table/transforms/delete-rows.js +4 -30
- package/dist/esm/plugins/table/transforms/fix-tables.js +24 -49
- package/dist/esm/plugins/table/transforms/merge.js +16 -75
- package/dist/esm/plugins/table/transforms/metadata.js +3 -2
- package/dist/esm/plugins/table/transforms/replace-table.js +2 -6
- package/dist/esm/plugins/table/transforms/split.js +18 -29
- package/dist/esm/plugins/table/types.js +0 -6
- package/dist/esm/plugins/table/ui/FloatingContextualButton/index.js +10 -31
- package/dist/esm/plugins/table/ui/FloatingContextualButton/styles.js +0 -2
- package/dist/esm/plugins/table/ui/FloatingContextualMenu/ContextualMenu.js +46 -126
- package/dist/esm/plugins/table/ui/FloatingContextualMenu/index.js +13 -24
- package/dist/esm/plugins/table/ui/FloatingContextualMenu/styles.js +0 -2
- package/dist/esm/plugins/table/ui/FloatingDeleteButton/DeleteButton.js +5 -7
- package/dist/esm/plugins/table/ui/FloatingDeleteButton/getPopUpOptions.js +3 -13
- package/dist/esm/plugins/table/ui/FloatingDeleteButton/index.js +19 -68
- package/dist/esm/plugins/table/ui/FloatingInsertButton/InsertButton.js +6 -14
- package/dist/esm/plugins/table/ui/FloatingInsertButton/getPopupOptions.js +5 -18
- package/dist/esm/plugins/table/ui/FloatingInsertButton/index.js +25 -57
- package/dist/esm/plugins/table/ui/LayoutButton/index.js +16 -47
- package/dist/esm/plugins/table/ui/TableFloatingControls/CornerControls/index.js +14 -35
- package/dist/esm/plugins/table/ui/TableFloatingControls/NumberColumn/index.js +20 -38
- package/dist/esm/plugins/table/ui/TableFloatingControls/RowControls/index.js +10 -29
- package/dist/esm/plugins/table/ui/TableFloatingControls/index.js +33 -62
- package/dist/esm/plugins/table/ui/common-styles.js +6 -7
- package/dist/esm/plugins/table/ui/consts.js +4 -3
- package/dist/esm/plugins/table/ui/ui-styles.js +0 -12
- package/dist/esm/plugins/table/utils/analytics.js +4 -13
- package/dist/esm/plugins/table/utils/collapse.js +4 -15
- package/dist/esm/plugins/table/utils/column-controls.js +25 -41
- package/dist/esm/plugins/table/utils/decoration.js +46 -88
- package/dist/esm/plugins/table/utils/dom.js +4 -20
- package/dist/esm/plugins/table/utils/nodes.js +5 -18
- package/dist/esm/plugins/table/utils/paste.js +24 -29
- package/dist/esm/plugins/table/utils/row-controls.js +6 -46
- package/dist/esm/plugins/table/utils/selection.js +3 -26
- package/dist/esm/plugins/table/utils/table.js +0 -2
- package/dist/esm/version.json +1 -1
- package/package.json +2 -2
|
@@ -5,19 +5,15 @@ import { removeEmptyColumns } from './merge';
|
|
|
5
5
|
import { setMeta } from './metadata';
|
|
6
6
|
export const deleteRows = (rect, isHeaderRowRequired = false) => tr => {
|
|
7
7
|
const table = findTable(tr.selection);
|
|
8
|
-
|
|
9
8
|
if (!table) {
|
|
10
9
|
return tr;
|
|
11
10
|
}
|
|
12
|
-
|
|
13
11
|
const rowsToDelete = [];
|
|
14
12
|
const map = TableMap.get(table.node);
|
|
15
|
-
|
|
16
13
|
for (let i = rect.top; i < rect.bottom; i++) {
|
|
17
14
|
// skip header row if its required
|
|
18
15
|
if (isHeaderRowRequired) {
|
|
19
16
|
const cell = table.node.nodeAt(map.map[i * map.width]);
|
|
20
|
-
|
|
21
17
|
if (cell && cell.type !== cell.type.schema.nodes.tableHeader) {
|
|
22
18
|
rowsToDelete.push(i);
|
|
23
19
|
}
|
|
@@ -25,34 +21,27 @@ export const deleteRows = (rect, isHeaderRowRequired = false) => tr => {
|
|
|
25
21
|
rowsToDelete.push(i);
|
|
26
22
|
}
|
|
27
23
|
}
|
|
28
|
-
|
|
29
24
|
if (!rowsToDelete.length) {
|
|
30
25
|
return tr;
|
|
31
26
|
}
|
|
32
|
-
|
|
33
27
|
const rows = [];
|
|
34
28
|
const seen = {};
|
|
35
29
|
const deletedCells = {};
|
|
36
|
-
|
|
37
30
|
for (let rowIndex = 0; rowIndex < map.height; rowIndex++) {
|
|
38
31
|
const rowCells = [];
|
|
39
32
|
const row = table.node.child(rowIndex);
|
|
40
|
-
|
|
41
33
|
for (let colIndex = 0; colIndex < map.width; colIndex++) {
|
|
42
34
|
const cellPos = map.map[rowIndex * map.width + colIndex];
|
|
43
35
|
const cell = table.node.nodeAt(cellPos);
|
|
44
|
-
|
|
45
36
|
if (!cell) {
|
|
46
37
|
continue;
|
|
47
38
|
}
|
|
48
|
-
|
|
49
39
|
const cellsInRow = map.cellsInRect({
|
|
50
40
|
left: 0,
|
|
51
41
|
top: rowIndex,
|
|
52
42
|
right: map.width,
|
|
53
43
|
bottom: rowIndex + 1
|
|
54
44
|
});
|
|
55
|
-
|
|
56
45
|
if (rowsToDelete.indexOf(rowIndex) === -1 && !seen[cellPos]) {
|
|
57
46
|
// decrement rowspans for row-spanning cells that overlap deleted rows
|
|
58
47
|
if (cellsInRow.indexOf(cellPos) > -1) {
|
|
@@ -62,9 +51,9 @@ export const deleteRows = (rect, isHeaderRowRequired = false) => tr => {
|
|
|
62
51
|
overlappingRows += 1;
|
|
63
52
|
}
|
|
64
53
|
});
|
|
65
|
-
|
|
66
54
|
if (overlappingRows > 0) {
|
|
67
|
-
const newCell = cell.type.createChecked({
|
|
55
|
+
const newCell = cell.type.createChecked({
|
|
56
|
+
...cell.attrs,
|
|
68
57
|
rowspan: cell.attrs.rowspan - overlappingRows
|
|
69
58
|
}, cell.content, cell.marks);
|
|
70
59
|
rowCells.push(newCell);
|
|
@@ -73,22 +62,21 @@ export const deleteRows = (rect, isHeaderRowRequired = false) => tr => {
|
|
|
73
62
|
}
|
|
74
63
|
} else if (deletedCells[cellPos]) {
|
|
75
64
|
// if we're removing a row-spanning cell, we need to add missing cells to rows below
|
|
76
|
-
const attrs = {
|
|
65
|
+
const attrs = {
|
|
66
|
+
...cell.attrs,
|
|
77
67
|
colspan: 1,
|
|
78
68
|
rowspan: 1
|
|
79
69
|
};
|
|
80
|
-
|
|
81
70
|
if (cell.attrs.colwidth) {
|
|
82
71
|
const pos = colIndex > 0 ? colIndex - map.colCount(cellPos) : 0;
|
|
83
72
|
attrs.colwidth = cell.attrs.colwidth.slice().splice(pos, 1);
|
|
84
73
|
}
|
|
85
|
-
|
|
86
74
|
const newCell = cell.type.createChecked(attrs, cell.type.schema.nodes.paragraph.createChecked(), cell.marks);
|
|
87
75
|
rowCells.push(newCell);
|
|
88
76
|
continue;
|
|
89
|
-
}
|
|
90
|
-
|
|
77
|
+
}
|
|
91
78
|
|
|
79
|
+
// normal cells that we want to keep
|
|
92
80
|
if (!seen[cellPos]) {
|
|
93
81
|
seen[cellPos] = true;
|
|
94
82
|
rowCells.push(cell);
|
|
@@ -97,36 +85,31 @@ export const deleteRows = (rect, isHeaderRowRequired = false) => tr => {
|
|
|
97
85
|
deletedCells[cellPos] = true;
|
|
98
86
|
}
|
|
99
87
|
}
|
|
100
|
-
|
|
101
88
|
if (rowCells.length) {
|
|
102
89
|
rows.push(row.type.createChecked(row.attrs, rowCells, row.marks));
|
|
103
90
|
}
|
|
104
91
|
}
|
|
105
|
-
|
|
106
92
|
if (!rows.length) {
|
|
107
93
|
return setMeta({
|
|
108
94
|
type: 'DELETE_ROWS',
|
|
109
95
|
problem: 'EMPTY_TABLE'
|
|
110
96
|
})(tr);
|
|
111
97
|
}
|
|
112
|
-
|
|
113
98
|
const newTable = table.node.type.createChecked(table.node.attrs, rows, table.node.marks);
|
|
114
99
|
const fixedTable = removeEmptyColumns(newTable);
|
|
115
|
-
|
|
116
100
|
if (fixedTable === null) {
|
|
117
101
|
return setMeta({
|
|
118
102
|
type: 'DELETE_ROWS',
|
|
119
103
|
problem: 'REMOVE_EMPTY_COLUMNS'
|
|
120
104
|
})(tr);
|
|
121
105
|
}
|
|
122
|
-
|
|
123
106
|
const cursorPos = getNextCursorPos(newTable, rowsToDelete);
|
|
124
107
|
return setMeta({
|
|
125
108
|
type: 'DELETE_ROWS'
|
|
126
|
-
})(tr.replaceWith(table.pos, table.pos + table.node.nodeSize, fixedTable)
|
|
109
|
+
})(tr.replaceWith(table.pos, table.pos + table.node.nodeSize, fixedTable)
|
|
110
|
+
// move cursor before the deleted rows if possible, otherwise - to the first row
|
|
127
111
|
.setSelection(Selection.near(tr.doc.resolve(table.pos + cursorPos))));
|
|
128
112
|
};
|
|
129
|
-
|
|
130
113
|
function getNextCursorPos(table, deletedRows) {
|
|
131
114
|
const minRow = Math.min(...deletedRows);
|
|
132
115
|
const nextRowWithCursor = minRow > 0 ? minRow - 1 : 0;
|
|
@@ -12,7 +12,6 @@ export const fireAnalytics = (properties = {}) => sendLogs({
|
|
|
12
12
|
user: '-'
|
|
13
13
|
}]
|
|
14
14
|
});
|
|
15
|
-
|
|
16
15
|
const validateTableCellNodeAttrs = ({
|
|
17
16
|
colspan,
|
|
18
17
|
rowspan,
|
|
@@ -27,7 +26,6 @@ const validateTableCellNodeAttrs = ({
|
|
|
27
26
|
spanValue: colspan
|
|
28
27
|
});
|
|
29
28
|
}
|
|
30
|
-
|
|
31
29
|
if (rowspan && rowspan < 0) {
|
|
32
30
|
reportInvalidTableCellSpanAttrs({
|
|
33
31
|
nodeType: 'tableCell',
|
|
@@ -37,17 +35,16 @@ const validateTableCellNodeAttrs = ({
|
|
|
37
35
|
spanValue: rowspan
|
|
38
36
|
});
|
|
39
37
|
}
|
|
40
|
-
|
|
41
38
|
return;
|
|
42
|
-
};
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// We attempt to patch the document when we have extra, unneeded, column widths
|
|
43
42
|
// Take this node for example:
|
|
44
43
|
//
|
|
45
44
|
// ['td', { colwidth: [100, 100, 100], colspan: 2 }]
|
|
46
45
|
//
|
|
47
46
|
// This row only spans two columns, yet it contains widths for 3.
|
|
48
47
|
// We remove the third width here, assumed duplicate content.
|
|
49
|
-
|
|
50
|
-
|
|
51
48
|
export const removeExtraneousColumnWidths = (node, basePos, tr, reportInvalidTableCellSpanAttrs) => {
|
|
52
49
|
let hasProblems = false;
|
|
53
50
|
tr = replaceCells(tr, node, basePos, cell => {
|
|
@@ -56,7 +53,6 @@ export const removeExtraneousColumnWidths = (node, basePos, tr, reportInvalidTab
|
|
|
56
53
|
colspan,
|
|
57
54
|
rowspan
|
|
58
55
|
} = cell.attrs;
|
|
59
|
-
|
|
60
56
|
if (reportInvalidTableCellSpanAttrs) {
|
|
61
57
|
validateTableCellNodeAttrs({
|
|
62
58
|
colspan,
|
|
@@ -64,24 +60,21 @@ export const removeExtraneousColumnWidths = (node, basePos, tr, reportInvalidTab
|
|
|
64
60
|
tableLocalId: node.attrs.localId
|
|
65
61
|
}, reportInvalidTableCellSpanAttrs);
|
|
66
62
|
}
|
|
67
|
-
|
|
68
63
|
if (colwidth && colwidth.length > colspan) {
|
|
69
64
|
hasProblems = true;
|
|
70
|
-
return cell.type.createChecked({
|
|
65
|
+
return cell.type.createChecked({
|
|
66
|
+
...cell.attrs,
|
|
71
67
|
colwidth: colwidth.slice(0, colspan)
|
|
72
68
|
}, cell.content, cell.marks);
|
|
73
69
|
}
|
|
74
|
-
|
|
75
70
|
return cell;
|
|
76
71
|
});
|
|
77
|
-
|
|
78
72
|
if (hasProblems) {
|
|
79
73
|
fireAnalytics({
|
|
80
74
|
message: 'removeExtraneousColumnWidths'
|
|
81
75
|
});
|
|
82
76
|
return true;
|
|
83
77
|
}
|
|
84
|
-
|
|
85
78
|
return false;
|
|
86
79
|
};
|
|
87
80
|
export const fixTables = (tr, reportInvalidTableCellSpanAttrs) => {
|
|
@@ -92,11 +85,12 @@ export const fixTables = (tr, reportInvalidTableCellSpanAttrs) => {
|
|
|
92
85
|
hasProblems = removeExtraneousColumnWidths(node, tr.mapping.map(pos), tr, reportInvalidTableCellSpanAttrs);
|
|
93
86
|
}
|
|
94
87
|
});
|
|
95
|
-
|
|
96
88
|
if (hasProblems) {
|
|
97
89
|
return tr;
|
|
98
90
|
}
|
|
99
|
-
};
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
// When we get a table with an 'auto' attribute, we want to:
|
|
100
94
|
// 1. render with table-layout: auto
|
|
101
95
|
// 2. capture the column widths
|
|
102
96
|
// 3. set the column widths as attributes, and remove the 'auto' attribute,
|
|
@@ -107,7 +101,6 @@ export const fixTables = (tr, reportInvalidTableCellSpanAttrs) => {
|
|
|
107
101
|
//
|
|
108
102
|
// We use this when migrating TinyMCE tables for Confluence, for example:
|
|
109
103
|
// https://pug.jira-dev.com/wiki/spaces/AEC/pages/3362882215/How+do+we+map+TinyMCE+tables+to+Fabric+tables
|
|
110
|
-
|
|
111
104
|
export const fixAutoSizedTable = (view, tableNode, tableRef, tablePos, opts) => {
|
|
112
105
|
let {
|
|
113
106
|
tr
|
|
@@ -117,30 +110,31 @@ export const fixAutoSizedTable = (view, tableNode, tableRef, tablePos, opts) =>
|
|
|
117
110
|
const colWidths = parseDOMColumnWidths(domAtPos, tableNode, tableStart, tableRef);
|
|
118
111
|
const totalContentWidth = colWidths.reduce((acc, current) => acc + current, 0);
|
|
119
112
|
const tableLayout = getLayoutBasedOnWidth(totalContentWidth);
|
|
120
|
-
const maxLayoutSize = getLayoutSize(tableLayout, opts.containerWidth, {});
|
|
113
|
+
const maxLayoutSize = getLayoutSize(tableLayout, opts.containerWidth, {});
|
|
114
|
+
|
|
115
|
+
// Content width will generally not meet the constraints of the layout
|
|
121
116
|
// whether it be below or above, so we scale our columns widths
|
|
122
117
|
// to meet these requirements
|
|
123
|
-
|
|
124
118
|
let scale = 1;
|
|
125
|
-
|
|
126
119
|
if (totalContentWidth !== maxLayoutSize) {
|
|
127
120
|
scale = maxLayoutSize / totalContentWidth;
|
|
128
121
|
}
|
|
129
|
-
|
|
130
122
|
const scaledColumnWidths = colWidths.map(width => Math.floor(width * scale));
|
|
131
123
|
tr = replaceCells(tr, tableNode, tablePos, (cell, _rowIndex, colIndex) => {
|
|
132
124
|
const newColWidths = scaledColumnWidths.slice(colIndex, colIndex + cell.attrs.colspan);
|
|
133
|
-
return cell.type.createChecked({
|
|
125
|
+
return cell.type.createChecked({
|
|
126
|
+
...cell.attrs,
|
|
134
127
|
colwidth: newColWidths.length ? newColWidths : null
|
|
135
128
|
}, cell.content, cell.marks);
|
|
136
|
-
});
|
|
129
|
+
});
|
|
137
130
|
|
|
138
|
-
|
|
131
|
+
// clear autosizing on the table node
|
|
132
|
+
return tr.setNodeMarkup(tablePos, undefined, {
|
|
133
|
+
...tableNode.attrs,
|
|
139
134
|
layout: tableLayout,
|
|
140
135
|
__autoSize: false
|
|
141
136
|
}).setMeta('addToHistory', false);
|
|
142
137
|
};
|
|
143
|
-
|
|
144
138
|
const getLayoutBasedOnWidth = totalWidth => {
|
|
145
139
|
if (totalWidth > akEditorWideLayoutWidth) {
|
|
146
140
|
return 'full-width';
|
|
@@ -150,20 +144,15 @@ const getLayoutBasedOnWidth = totalWidth => {
|
|
|
150
144
|
return 'default';
|
|
151
145
|
}
|
|
152
146
|
};
|
|
153
|
-
|
|
154
147
|
function parseDOMColumnWidths(domAtPos, tableNode, tableStart, tableRef) {
|
|
155
148
|
const row = tableRef.querySelector('tr');
|
|
156
|
-
|
|
157
149
|
if (!row) {
|
|
158
150
|
return [];
|
|
159
151
|
}
|
|
160
|
-
|
|
161
152
|
let cols = [];
|
|
162
|
-
|
|
163
153
|
for (let col = 0; col < row.childElementCount; col++) {
|
|
164
154
|
const currentCol = row.children[col];
|
|
165
155
|
const colspan = Number(currentCol.getAttribute('colspan') || 1);
|
|
166
|
-
|
|
167
156
|
for (let span = 0; span < colspan; span++) {
|
|
168
157
|
const colIdx = col + span;
|
|
169
158
|
const cells = getCellsRefsInColumn(colIdx, tableNode, tableStart, domAtPos);
|
|
@@ -173,44 +162,38 @@ function parseDOMColumnWidths(domAtPos, tableNode, tableStart, tableRef) {
|
|
|
173
162
|
cols[colIdx] = Math.max(colWidth, tableCellMinWidth);
|
|
174
163
|
}
|
|
175
164
|
}
|
|
176
|
-
|
|
177
165
|
return cols;
|
|
178
|
-
}
|
|
179
|
-
|
|
166
|
+
}
|
|
180
167
|
|
|
168
|
+
// TODO: move to prosemirror-utils
|
|
181
169
|
const replaceCells = (tr, table, tablePos, modifyCell) => {
|
|
182
170
|
const rows = [];
|
|
183
171
|
let modifiedCells = 0;
|
|
184
|
-
|
|
185
172
|
for (let rowIndex = 0; rowIndex < table.childCount; rowIndex++) {
|
|
186
173
|
const row = table.child(rowIndex);
|
|
187
174
|
const cells = [];
|
|
188
|
-
|
|
189
175
|
for (let colIndex = 0; colIndex < row.childCount; colIndex++) {
|
|
190
|
-
const cell = row.child(colIndex);
|
|
176
|
+
const cell = row.child(colIndex);
|
|
177
|
+
|
|
178
|
+
// FIXME
|
|
191
179
|
// The rowIndex and colIndex are not accurate in a merged cell scenario
|
|
192
180
|
// e.g. table with 5 columns might have only one cell in a row, colIndex will be 1, where it should be 4
|
|
193
|
-
|
|
194
181
|
const node = modifyCell(cell, rowIndex, colIndex);
|
|
195
|
-
|
|
196
182
|
if (node.sameMarkup(cell) === false) {
|
|
197
183
|
modifiedCells++;
|
|
198
184
|
}
|
|
199
|
-
|
|
200
185
|
cells.push(node);
|
|
201
186
|
}
|
|
202
|
-
|
|
203
187
|
if (cells.length) {
|
|
204
188
|
rows.push(row.type.createChecked(row.attrs, cells, row.marks));
|
|
205
189
|
}
|
|
206
|
-
}
|
|
207
|
-
// If no cells are modified our counter will be zero.
|
|
208
|
-
|
|
190
|
+
}
|
|
209
191
|
|
|
192
|
+
// Check if the table has changed before replacing.
|
|
193
|
+
// If no cells are modified our counter will be zero.
|
|
210
194
|
if (rows.length && modifiedCells !== 0) {
|
|
211
195
|
const newTable = table.type.createChecked(table.attrs, rows, table.marks);
|
|
212
196
|
return tr.replaceWith(tablePos, tablePos + table.nodeSize, newTable);
|
|
213
197
|
}
|
|
214
|
-
|
|
215
198
|
return tr;
|
|
216
199
|
};
|
|
@@ -3,17 +3,16 @@ import { Selection } from 'prosemirror-state';
|
|
|
3
3
|
import { TableMap } from '@atlaskit/editor-tables/table-map';
|
|
4
4
|
import { CellSelection } from '@atlaskit/editor-tables/cell-selection';
|
|
5
5
|
import { findTable, getSelectionRect } from '@atlaskit/editor-tables/utils';
|
|
6
|
-
import { setMeta } from './metadata';
|
|
6
|
+
import { setMeta } from './metadata';
|
|
7
7
|
|
|
8
|
+
// re-creates table node with merged cells
|
|
8
9
|
export function mergeCells(tr) {
|
|
9
10
|
const {
|
|
10
11
|
selection
|
|
11
12
|
} = tr;
|
|
12
|
-
|
|
13
13
|
if (!(selection instanceof CellSelection) || !canMergeCells(tr)) {
|
|
14
14
|
return tr;
|
|
15
15
|
}
|
|
16
|
-
|
|
17
16
|
const rect = getSelectionRect(selection);
|
|
18
17
|
const table = findTable(selection);
|
|
19
18
|
const map = TableMap.get(table.node);
|
|
@@ -21,53 +20,45 @@ export function mergeCells(tr) {
|
|
|
21
20
|
const selectedCells = map.cellsInRect(rect);
|
|
22
21
|
let mergedCellPos;
|
|
23
22
|
const rows = [];
|
|
24
|
-
|
|
25
23
|
for (let rowIndex = 0; rowIndex < map.height; rowIndex++) {
|
|
26
24
|
const rowCells = [];
|
|
27
25
|
const row = table.node.child(rowIndex);
|
|
28
|
-
|
|
29
26
|
for (let colIndex = 0; colIndex < map.width; colIndex++) {
|
|
30
27
|
const cellPos = map.map[rowIndex * map.width + colIndex];
|
|
31
28
|
const cell = table.node.nodeAt(cellPos);
|
|
32
|
-
|
|
33
29
|
if (!cell || seen.indexOf(cellPos) > -1) {
|
|
34
30
|
continue;
|
|
35
31
|
}
|
|
32
|
+
seen.push(cellPos);
|
|
36
33
|
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
// merged cell
|
|
39
35
|
if (colIndex === rect.left && rowIndex === rect.top) {
|
|
40
|
-
mergedCellPos = cellPos;
|
|
41
|
-
|
|
36
|
+
mergedCellPos = cellPos;
|
|
37
|
+
// merge content of the selected cells, dropping empty cells
|
|
42
38
|
let content = isEmptyCell(cell) ? Fragment.empty : cell.content;
|
|
43
39
|
const seenContent = [mergedCellPos];
|
|
44
|
-
|
|
45
40
|
for (let i = rect.top; i < rect.bottom; i++) {
|
|
46
41
|
for (let j = rect.left; j < rect.right; j++) {
|
|
47
42
|
const pos = map.map[i * map.width + j];
|
|
48
|
-
|
|
49
43
|
if (seenContent.indexOf(pos) === -1) {
|
|
50
44
|
seenContent.push(pos);
|
|
51
45
|
const copyCell = table.node.nodeAt(pos);
|
|
52
|
-
|
|
53
46
|
if (copyCell && !isEmptyCell(copyCell)) {
|
|
54
47
|
content = content.append(copyCell.content);
|
|
55
48
|
}
|
|
56
49
|
}
|
|
57
50
|
}
|
|
58
51
|
}
|
|
59
|
-
|
|
60
52
|
const rowspan = rect.bottom - rect.top;
|
|
61
|
-
|
|
62
53
|
if (rowspan < 1) {
|
|
63
54
|
return setMeta({
|
|
64
55
|
type: 'MERGE_CELLS',
|
|
65
56
|
problem: 'NEGATIVE_ROWSPAN'
|
|
66
57
|
})(tr);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
58
|
+
}
|
|
59
|
+
// update colspan and rowspan of the merged cell to span the selection
|
|
60
|
+
const attrs = addColSpan({
|
|
61
|
+
...cell.attrs,
|
|
71
62
|
rowspan
|
|
72
63
|
}, cell.attrs.colspan, rect.right - rect.left - cell.attrs.colspan);
|
|
73
64
|
const newCell = content === Fragment.empty ? cell.type.createAndFill(attrs, content, cell.marks) : cell.type.createChecked(attrs, content, cell.marks);
|
|
@@ -78,7 +69,6 @@ export function mergeCells(tr) {
|
|
|
78
69
|
rowCells.push(cell);
|
|
79
70
|
}
|
|
80
71
|
}
|
|
81
|
-
|
|
82
72
|
if (rowCells.length) {
|
|
83
73
|
rows.push(row.type.createChecked(row.attrs, rowCells, row.marks));
|
|
84
74
|
} else {
|
|
@@ -87,56 +77,49 @@ export function mergeCells(tr) {
|
|
|
87
77
|
const prevRow = rows[i];
|
|
88
78
|
const cells = [];
|
|
89
79
|
let rowChanged = false;
|
|
90
|
-
|
|
91
80
|
for (let j = 0; j < prevRow.childCount; j++) {
|
|
92
81
|
const cell = prevRow.child(j);
|
|
93
82
|
const {
|
|
94
83
|
rowspan
|
|
95
84
|
} = cell.attrs;
|
|
96
|
-
|
|
97
85
|
if (rowspan && rowspan + i - 1 >= rows.length) {
|
|
98
86
|
rowChanged = true;
|
|
99
|
-
|
|
100
87
|
if (rowspan < 2) {
|
|
101
88
|
return setMeta({
|
|
102
89
|
type: 'MERGE_CELLS',
|
|
103
90
|
problem: 'NEGATIVE_ROWSPAN'
|
|
104
91
|
})(tr);
|
|
105
92
|
}
|
|
106
|
-
|
|
107
|
-
|
|
93
|
+
cells.push(cell.type.createChecked({
|
|
94
|
+
...cell.attrs,
|
|
108
95
|
rowspan: rowspan - 1
|
|
109
96
|
}, cell.content, cell.marks));
|
|
110
97
|
} else {
|
|
111
98
|
cells.push(cell);
|
|
112
99
|
}
|
|
113
100
|
}
|
|
114
|
-
|
|
115
101
|
if (rowChanged) {
|
|
116
102
|
rows[i] = row.type.createChecked(prevRow.attrs, cells, prevRow.marks);
|
|
117
103
|
}
|
|
118
104
|
}
|
|
119
105
|
}
|
|
120
|
-
}
|
|
121
|
-
|
|
106
|
+
}
|
|
122
107
|
|
|
108
|
+
// empty tables? cancel merging like nothing happened
|
|
123
109
|
if (!rows.length) {
|
|
124
110
|
return setMeta({
|
|
125
111
|
type: 'MERGE_CELLS',
|
|
126
112
|
problem: 'EMPTY_TABLE'
|
|
127
113
|
})(tr);
|
|
128
114
|
}
|
|
129
|
-
|
|
130
115
|
const newTable = table.node.type.createChecked(table.node.attrs, rows, table.node.marks);
|
|
131
116
|
const fixedTable = removeEmptyColumns(newTable);
|
|
132
|
-
|
|
133
117
|
if (fixedTable === null) {
|
|
134
118
|
return setMeta({
|
|
135
119
|
type: 'MERGE_CELLS',
|
|
136
120
|
problem: 'REMOVE_EMPTY_COLUMNS'
|
|
137
121
|
})(tr);
|
|
138
122
|
}
|
|
139
|
-
|
|
140
123
|
return setMeta({
|
|
141
124
|
type: 'MERGE_CELLS'
|
|
142
125
|
})(tr.replaceWith(table.pos, table.pos + table.node.nodeSize, fixedTable).setSelection(Selection.near(tr.doc.resolve((mergedCellPos || 0) + table.start))));
|
|
@@ -145,50 +128,39 @@ export function canMergeCells(tr) {
|
|
|
145
128
|
const {
|
|
146
129
|
selection
|
|
147
130
|
} = tr;
|
|
148
|
-
|
|
149
131
|
if (!(selection instanceof CellSelection) || selection.$anchorCell.pos === selection.$headCell.pos) {
|
|
150
132
|
return false;
|
|
151
133
|
}
|
|
152
|
-
|
|
153
134
|
const rect = getSelectionRect(selection);
|
|
154
|
-
|
|
155
135
|
if (!rect) {
|
|
156
136
|
return false;
|
|
157
137
|
}
|
|
158
|
-
|
|
159
138
|
const table = selection.$anchorCell.node(-1);
|
|
160
139
|
const map = TableMap.get(table);
|
|
161
|
-
|
|
162
140
|
if (cellsOverlapRectangle(map, rect)) {
|
|
163
141
|
return false;
|
|
164
142
|
}
|
|
165
|
-
|
|
166
143
|
return true;
|
|
167
144
|
}
|
|
168
|
-
|
|
169
145
|
function isEmptyCell(cell) {
|
|
170
146
|
const {
|
|
171
147
|
content
|
|
172
148
|
} = cell;
|
|
173
149
|
return content.childCount === 1 && content.firstChild && content.firstChild.isTextblock && content.firstChild.childCount === 0;
|
|
174
150
|
}
|
|
175
|
-
|
|
176
151
|
function addColSpan(attrs, pos, span = 1) {
|
|
177
|
-
const newAttrs = {
|
|
152
|
+
const newAttrs = {
|
|
153
|
+
...attrs,
|
|
178
154
|
colspan: (attrs.colspan || 1) + span
|
|
179
155
|
};
|
|
180
|
-
|
|
181
156
|
if (newAttrs.colwidth) {
|
|
182
157
|
newAttrs.colwidth = newAttrs.colwidth.slice();
|
|
183
|
-
|
|
184
158
|
for (let i = 0; i < span; i++) {
|
|
185
159
|
newAttrs.colwidth.splice(pos, 0, 0);
|
|
186
160
|
}
|
|
187
161
|
}
|
|
188
|
-
|
|
189
162
|
return newAttrs;
|
|
190
163
|
}
|
|
191
|
-
|
|
192
164
|
function cellsOverlapRectangle({
|
|
193
165
|
width,
|
|
194
166
|
height,
|
|
@@ -198,33 +170,27 @@ function cellsOverlapRectangle({
|
|
|
198
170
|
let indexLeft = indexTop;
|
|
199
171
|
let indexBottom = (rect.bottom - 1) * width + rect.left;
|
|
200
172
|
let indexRight = indexTop + (rect.right - rect.left - 1);
|
|
201
|
-
|
|
202
173
|
for (let i = rect.top; i < rect.bottom; i++) {
|
|
203
174
|
if (rect.left > 0 && map[indexLeft] === map[indexLeft - 1] || rect.right < width && map[indexRight] === map[indexRight + 1]) {
|
|
204
175
|
return true;
|
|
205
176
|
}
|
|
206
|
-
|
|
207
177
|
indexLeft += width;
|
|
208
178
|
indexRight += width;
|
|
209
179
|
}
|
|
210
|
-
|
|
211
180
|
for (let i = rect.left; i < rect.right; i++) {
|
|
212
181
|
if (rect.top > 0 && map[indexTop] === map[indexTop - width] || rect.bottom < height && map[indexBottom] === map[indexBottom + width]) {
|
|
213
182
|
return true;
|
|
214
183
|
}
|
|
215
|
-
|
|
216
184
|
indexTop++;
|
|
217
185
|
indexBottom++;
|
|
218
186
|
}
|
|
219
|
-
|
|
220
187
|
return false;
|
|
221
|
-
}
|
|
222
|
-
|
|
188
|
+
}
|
|
223
189
|
|
|
190
|
+
// returns an array of numbers, each number indicates the minimum colSpan in each column
|
|
224
191
|
function getMinColSpans(table) {
|
|
225
192
|
const map = TableMap.get(table);
|
|
226
193
|
const minColspans = [];
|
|
227
|
-
|
|
228
194
|
for (let colIndex = map.width - 1; colIndex >= 0; colIndex--) {
|
|
229
195
|
const cellsPositions = map.cellsInRect({
|
|
230
196
|
left: colIndex,
|
|
@@ -232,17 +198,15 @@ function getMinColSpans(table) {
|
|
|
232
198
|
top: 0,
|
|
233
199
|
bottom: map.height
|
|
234
200
|
});
|
|
235
|
-
|
|
236
201
|
if (cellsPositions.length) {
|
|
237
202
|
const colspans = cellsPositions.map(cellPos => {
|
|
238
203
|
const cell = table.nodeAt(cellPos);
|
|
239
|
-
|
|
240
204
|
if (cell) {
|
|
241
205
|
return cell.attrs.colspan;
|
|
242
206
|
}
|
|
243
207
|
});
|
|
244
|
-
const minColspan = Math.min(...colspans);
|
|
245
|
-
|
|
208
|
+
const minColspan = Math.min(...colspans);
|
|
209
|
+
// only care about the case when the next column is invisible
|
|
246
210
|
if (!minColspans[colIndex + 1]) {
|
|
247
211
|
minColspans[colIndex] = minColspan;
|
|
248
212
|
} else {
|
|
@@ -250,42 +214,34 @@ function getMinColSpans(table) {
|
|
|
250
214
|
}
|
|
251
215
|
}
|
|
252
216
|
}
|
|
253
|
-
|
|
254
217
|
return minColspans;
|
|
255
218
|
}
|
|
256
|
-
|
|
257
219
|
export function removeEmptyColumns(table) {
|
|
258
220
|
const map = TableMap.get(table);
|
|
259
221
|
const minColSpans = getMinColSpans(table);
|
|
260
|
-
|
|
261
222
|
if (!minColSpans.some(colspan => colspan > 1)) {
|
|
262
223
|
return table;
|
|
263
224
|
}
|
|
264
|
-
|
|
265
225
|
const rows = [];
|
|
266
|
-
|
|
267
226
|
for (let rowIndex = 0; rowIndex < map.height; rowIndex++) {
|
|
268
227
|
const cellsByCols = {};
|
|
269
228
|
const cols = Object.keys(minColSpans).map(Number);
|
|
270
|
-
|
|
271
229
|
for (let idx in cols) {
|
|
272
230
|
const colIndex = cols[idx];
|
|
273
231
|
const cellPos = map.map[colIndex + rowIndex * map.width];
|
|
274
232
|
const rect = map.findCell(cellPos);
|
|
275
233
|
const cell = cellsByCols[rect.left] || table.nodeAt(cellPos);
|
|
276
|
-
|
|
277
234
|
if (cell && rect.top === rowIndex) {
|
|
278
235
|
if (minColSpans[colIndex] > 1) {
|
|
279
236
|
const colspan = cell.attrs.colspan - minColSpans[colIndex] + 1;
|
|
280
|
-
|
|
281
237
|
if (colspan < 1) {
|
|
282
238
|
return null;
|
|
283
239
|
}
|
|
284
|
-
|
|
285
240
|
const {
|
|
286
241
|
colwidth
|
|
287
242
|
} = cell.attrs;
|
|
288
|
-
const newCell = cell.type.createChecked({
|
|
243
|
+
const newCell = cell.type.createChecked({
|
|
244
|
+
...cell.attrs,
|
|
289
245
|
colspan,
|
|
290
246
|
colwidth: colwidth ? colwidth.slice(0, colspan) : null
|
|
291
247
|
}, cell.content, cell.marks);
|
|
@@ -295,18 +251,14 @@ export function removeEmptyColumns(table) {
|
|
|
295
251
|
}
|
|
296
252
|
}
|
|
297
253
|
}
|
|
298
|
-
|
|
299
254
|
const rowCells = Object.keys(cellsByCols).map(col => cellsByCols[col]);
|
|
300
255
|
const row = table.child(rowIndex);
|
|
301
|
-
|
|
302
256
|
if (row) {
|
|
303
257
|
rows.push(row.type.createChecked(row.attrs, rowCells, row.marks));
|
|
304
258
|
}
|
|
305
259
|
}
|
|
306
|
-
|
|
307
260
|
if (!rows.length) {
|
|
308
261
|
return null;
|
|
309
262
|
}
|
|
310
|
-
|
|
311
263
|
return table.type.createChecked(table.attrs, rows, table.marks);
|
|
312
264
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { pluginKey } from '../pm-plugins/plugin-key';
|
|
2
|
-
import { fireAnalytics } from './fix-tables';
|
|
2
|
+
import { fireAnalytics } from './fix-tables';
|
|
3
|
+
|
|
4
|
+
// Set metadata on a ProseMirror transaction for debugging purposes in Synchrony
|
|
3
5
|
|
|
4
6
|
export const setMeta = meta => tr => {
|
|
5
7
|
if ('problem' in meta) {
|
|
6
8
|
// Send analytics event whenever we encounter with a problem
|
|
7
9
|
fireAnalytics(meta);
|
|
8
10
|
}
|
|
9
|
-
|
|
10
11
|
return tr.setMeta(pluginKey, meta);
|
|
11
12
|
};
|
|
@@ -6,7 +6,6 @@ import { getSelectedTableInfo } from '../utils';
|
|
|
6
6
|
export const replaceSelectedTable = (state, content, inputMethod, editorAnalyticsAPI) => {
|
|
7
7
|
if (isTableSelected(state.selection)) {
|
|
8
8
|
const table = findTable(state.selection);
|
|
9
|
-
|
|
10
9
|
if (table) {
|
|
11
10
|
const slice = typeof content === 'string' ? new Slice(Fragment.from(state.schema.text(content)), 0, 0) : content;
|
|
12
11
|
let tr = state.tr.replace(table.pos, table.pos + table.node.nodeSize, slice);
|
|
@@ -28,6 +27,5 @@ export const replaceSelectedTable = (state, content, inputMethod, editorAnalytic
|
|
|
28
27
|
return tr;
|
|
29
28
|
}
|
|
30
29
|
}
|
|
31
|
-
|
|
32
30
|
return state.tr;
|
|
33
31
|
};
|