@kopexa/extension-table 17.0.45 → 17.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-2NBDRVYL.mjs +428 -0
- package/dist/chunk-3SWV7BGP.mjs +638 -0
- package/dist/chunk-4QSZXHZO.mjs +276 -0
- package/dist/chunk-5B5XIL2G.mjs +457 -0
- package/dist/chunk-62B2LU2Q.mjs +603 -0
- package/dist/chunk-6FHFDGJO.mjs +251 -0
- package/dist/chunk-CD62W5C3.mjs +165 -0
- package/dist/chunk-CN73TYHV.mjs +190 -0
- package/dist/chunk-CPDSPBS6.mjs +276 -0
- package/dist/chunk-E7W2KRZG.mjs +49 -0
- package/dist/chunk-G6GHC2WO.mjs +276 -0
- package/dist/chunk-GBTQVIN5.mjs +174 -0
- package/dist/chunk-GDEXPEW5.mjs +52 -0
- package/dist/chunk-GQLZBIWF.mjs +198 -0
- package/dist/chunk-IRJ6RAVQ.mjs +116 -0
- package/dist/chunk-J4VOSZCZ.mjs +59 -0
- package/dist/chunk-KIYFW7MP.mjs +122 -0
- package/dist/chunk-KTRZVXJC.mjs +306 -0
- package/dist/chunk-LUA32VH4.mjs +35 -0
- package/dist/{chunk-SNJF4UW6.mjs → chunk-MB52MZQ4.mjs} +7 -8
- package/dist/chunk-PTX5UYV6.mjs +10 -0
- package/dist/chunk-TEGO6KUS.mjs +96 -0
- package/dist/chunk-VIBVRWS4.mjs +197 -0
- package/dist/chunk-VQV757EG.mjs +113 -0
- package/dist/chunk-XRNQXADK.mjs +149 -0
- package/dist/chunk-ZVPJDJBO.mjs +134 -0
- package/dist/{kit.d.mts → extensions/kit.d.mts} +1 -3
- package/dist/{kit.d.ts → extensions/kit.d.ts} +1 -3
- package/dist/extensions/kit.js +1041 -0
- package/dist/extensions/kit.mjs +15 -0
- package/dist/extensions/table-cell.d.mts +6 -0
- package/dist/extensions/table-cell.d.ts +6 -0
- package/dist/extensions/table-cell.js +70 -0
- package/dist/{table/icons.mjs → extensions/table-cell.mjs} +3 -3
- package/dist/extensions/table-handle-plugin.d.mts +46 -0
- package/dist/extensions/table-handle-plugin.d.ts +46 -0
- package/dist/extensions/table-handle-plugin.js +1100 -0
- package/dist/extensions/table-handle-plugin.mjs +18 -0
- package/dist/extensions/table-handle.d.mts +19 -0
- package/dist/extensions/table-handle.d.ts +19 -0
- package/dist/extensions/table-handle.js +865 -0
- package/dist/extensions/table-handle.mjs +11 -0
- package/dist/{table → extensions}/table.d.mts +2 -2
- package/dist/{table → extensions}/table.d.ts +2 -2
- package/dist/extensions/table.js +138 -0
- package/dist/extensions/table.mjs +9 -0
- package/dist/hooks/use-resize-overlay.d.mts +5 -0
- package/dist/hooks/use-resize-overlay.d.ts +5 -0
- package/dist/hooks/use-resize-overlay.js +83 -0
- package/dist/hooks/use-resize-overlay.mjs +9 -0
- package/dist/hooks/use-table-add-row-column.d.mts +57 -0
- package/dist/hooks/use-table-add-row-column.d.ts +57 -0
- package/dist/hooks/use-table-add-row-column.js +551 -0
- package/dist/hooks/use-table-add-row-column.mjs +11 -0
- package/dist/hooks/use-table-align-cell.d.mts +148 -0
- package/dist/hooks/use-table-align-cell.d.ts +148 -0
- package/dist/hooks/use-table-align-cell.js +655 -0
- package/dist/hooks/use-table-align-cell.mjs +13 -0
- package/dist/hooks/use-table-clear-row-column-content.d.mts +103 -0
- package/dist/hooks/use-table-clear-row-column-content.d.ts +103 -0
- package/dist/hooks/use-table-clear-row-column-content.js +681 -0
- package/dist/hooks/use-table-clear-row-column-content.mjs +11 -0
- package/dist/hooks/use-table-delete-row-column.d.mts +87 -0
- package/dist/hooks/use-table-delete-row-column.d.ts +87 -0
- package/dist/hooks/use-table-delete-row-column.js +459 -0
- package/dist/hooks/use-table-delete-row-column.mjs +11 -0
- package/dist/hooks/use-table-duplicate-row-column.d.mts +49 -0
- package/dist/hooks/use-table-duplicate-row-column.d.ts +49 -0
- package/dist/hooks/use-table-duplicate-row-column.js +758 -0
- package/dist/hooks/use-table-duplicate-row-column.mjs +11 -0
- package/dist/hooks/use-table-handle-positioning.d.mts +42 -0
- package/dist/hooks/use-table-handle-positioning.d.ts +42 -0
- package/dist/hooks/use-table-handle-positioning.js +190 -0
- package/dist/hooks/use-table-handle-positioning.mjs +10 -0
- package/dist/hooks/use-table-handle-state.d.mts +28 -0
- package/dist/hooks/use-table-handle-state.d.ts +28 -0
- package/dist/hooks/use-table-handle-state.js +76 -0
- package/dist/hooks/use-table-handle-state.mjs +9 -0
- package/dist/hooks/use-table-header-row-column.d.mts +58 -0
- package/dist/hooks/use-table-header-row-column.d.ts +58 -0
- package/dist/hooks/use-table-header-row-column.js +603 -0
- package/dist/hooks/use-table-header-row-column.mjs +13 -0
- package/dist/hooks/use-table-merge-split-cell.d.mts +123 -0
- package/dist/hooks/use-table-merge-split-cell.d.ts +123 -0
- package/dist/hooks/use-table-merge-split-cell.js +331 -0
- package/dist/hooks/use-table-merge-split-cell.mjs +12 -0
- package/dist/hooks/use-table-move-row-column.d.mts +101 -0
- package/dist/hooks/use-table-move-row-column.d.ts +101 -0
- package/dist/hooks/use-table-move-row-column.js +621 -0
- package/dist/hooks/use-table-move-row-column.mjs +13 -0
- package/dist/hooks/use-table-sort-row-column.d.mts +118 -0
- package/dist/hooks/use-table-sort-row-column.d.ts +118 -0
- package/dist/hooks/use-table-sort-row-column.js +623 -0
- package/dist/hooks/use-table-sort-row-column.mjs +13 -0
- package/dist/index.d.mts +18 -5
- package/dist/index.d.ts +18 -5
- package/dist/index.js +4939 -910
- package/dist/index.mjs +43 -18
- package/dist/lib/constants.d.mts +4 -0
- package/dist/lib/constants.d.ts +4 -0
- package/dist/{table-row.js → lib/constants.js} +10 -10
- package/dist/lib/constants.mjs +10 -0
- package/dist/lib/create-image.d.mts +12 -0
- package/dist/lib/create-image.d.ts +12 -0
- package/dist/lib/create-image.js +221 -0
- package/dist/lib/create-image.mjs +8 -0
- package/dist/lib/table-utils.d.mts +263 -0
- package/dist/lib/table-utils.d.ts +263 -0
- package/dist/lib/table-utils.js +488 -0
- package/dist/lib/table-utils.mjs +40 -0
- package/dist/messages.d.mts +174 -0
- package/dist/messages.d.ts +174 -0
- package/dist/messages.js +213 -0
- package/dist/{table-row.mjs → messages.mjs} +3 -3
- package/dist/ui/table-alignment-menu.d.mts +25 -0
- package/dist/ui/table-alignment-menu.d.ts +25 -0
- package/dist/ui/table-alignment-menu.js +758 -0
- package/dist/ui/table-alignment-menu.mjs +14 -0
- package/dist/ui/table-cell-handle-menu.d.mts +12 -0
- package/dist/ui/table-cell-handle-menu.d.ts +12 -0
- package/dist/ui/table-cell-handle-menu.js +1317 -0
- package/dist/ui/table-cell-handle-menu.mjs +17 -0
- package/dist/ui/table-handle-menu.d.mts +23 -0
- package/dist/ui/table-handle-menu.d.ts +23 -0
- package/dist/ui/table-handle-menu.js +2598 -0
- package/dist/ui/table-handle-menu.mjs +21 -0
- package/dist/ui/table-handle.d.mts +48 -0
- package/dist/ui/table-handle.d.ts +48 -0
- package/dist/ui/table-handle.js +3126 -0
- package/dist/ui/table-handle.mjs +22 -0
- package/dist/ui/table-selection-overlay.d.mts +14 -0
- package/dist/ui/table-selection-overlay.d.ts +14 -0
- package/dist/ui/table-selection-overlay.js +553 -0
- package/dist/ui/table-selection-overlay.mjs +11 -0
- package/package.json +16 -12
- package/dist/chunk-6NY5XWR7.mjs +0 -11
- package/dist/chunk-74O2ORPO.mjs +0 -81
- package/dist/chunk-7NEAULTF.mjs +0 -58
- package/dist/chunk-ARSGMUXM.mjs +0 -116
- package/dist/chunk-BAQU2YT5.mjs +0 -41
- package/dist/chunk-DF6ZMJLL.mjs +0 -40
- package/dist/chunk-FKOIW52J.mjs +0 -11
- package/dist/chunk-GMNNSVR3.mjs +0 -540
- package/dist/chunk-IMRHHVEF.mjs +0 -113
- package/dist/chunk-NTWXQSW6.mjs +0 -13
- package/dist/chunk-OPDSKEZR.mjs +0 -93
- package/dist/chunk-YSUOVRY4.mjs +0 -1
- package/dist/kit.js +0 -1024
- package/dist/kit.mjs +0 -19
- package/dist/table/icons.d.mts +0 -13
- package/dist/table/icons.d.ts +0 -13
- package/dist/table/icons.js +0 -81
- package/dist/table/index.d.mts +0 -3
- package/dist/table/index.d.ts +0 -3
- package/dist/table/index.js +0 -809
- package/dist/table/index.mjs +0 -15
- package/dist/table/table-controls.d.mts +0 -15
- package/dist/table/table-controls.d.ts +0 -15
- package/dist/table/table-controls.js +0 -131
- package/dist/table/table-controls.mjs +0 -8
- package/dist/table/table-view.d.mts +0 -43
- package/dist/table/table-view.d.ts +0 -43
- package/dist/table/table-view.js +0 -610
- package/dist/table/table-view.mjs +0 -12
- package/dist/table/table.js +0 -807
- package/dist/table/table.mjs +0 -14
- package/dist/table/utilities/col-style.d.mts +0 -3
- package/dist/table/utilities/col-style.d.ts +0 -3
- package/dist/table/utilities/col-style.js +0 -36
- package/dist/table/utilities/col-style.mjs +0 -8
- package/dist/table/utilities/delete-table-when-all-cells-selected.d.mts +0 -5
- package/dist/table/utilities/delete-table-when-all-cells-selected.d.ts +0 -5
- package/dist/table/utilities/delete-table-when-all-cells-selected.js +0 -66
- package/dist/table/utilities/delete-table-when-all-cells-selected.mjs +0 -40
- package/dist/table/utilities/get-table-node-types.d.mts +0 -7
- package/dist/table/utilities/get-table-node-types.d.ts +0 -7
- package/dist/table/utilities/get-table-node-types.js +0 -44
- package/dist/table/utilities/get-table-node-types.mjs +0 -21
- package/dist/table/utilities/insert-line-above-table-action.d.mts +0 -5
- package/dist/table/utilities/insert-line-above-table-action.d.ts +0 -5
- package/dist/table/utilities/insert-line-above-table-action.js +0 -64
- package/dist/table/utilities/insert-line-above-table-action.mjs +0 -8
- package/dist/table/utilities/insert-line-below-table-action.d.mts +0 -5
- package/dist/table/utilities/insert-line-below-table-action.d.ts +0 -5
- package/dist/table/utilities/insert-line-below-table-action.js +0 -63
- package/dist/table/utilities/insert-line-below-table-action.mjs +0 -8
- package/dist/table/utilities/is-cell-selection.d.mts +0 -5
- package/dist/table/utilities/is-cell-selection.d.ts +0 -5
- package/dist/table/utilities/is-cell-selection.js +0 -34
- package/dist/table/utilities/is-cell-selection.mjs +0 -8
- package/dist/table-cell.d.mts +0 -8
- package/dist/table-cell.d.ts +0 -8
- package/dist/table-cell.js +0 -139
- package/dist/table-cell.mjs +0 -8
- package/dist/table-header.d.mts +0 -6
- package/dist/table-header.d.ts +0 -6
- package/dist/table-header.js +0 -104
- package/dist/table-header.mjs +0 -8
- package/dist/table-row.d.mts +0 -6
- package/dist/table-row.d.ts +0 -6
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
messages
|
|
4
|
+
} from "./chunk-CN73TYHV.mjs";
|
|
5
|
+
import {
|
|
6
|
+
getRowOrColumnCells,
|
|
7
|
+
getTable,
|
|
8
|
+
getTableSelectionType,
|
|
9
|
+
isCellEmpty
|
|
10
|
+
} from "./chunk-5B5XIL2G.mjs";
|
|
11
|
+
|
|
12
|
+
// src/hooks/use-table-sort-row-column.ts
|
|
13
|
+
import { isExtensionAvailable, useTiptapEditor } from "@kopexa/editor-utils";
|
|
14
|
+
import { useSafeIntl } from "@kopexa/i18n";
|
|
15
|
+
import { ArrowDownAZIcon, ArrowDownZAIcon } from "@kopexa/icons";
|
|
16
|
+
import { useCallback, useMemo } from "react";
|
|
17
|
+
var REQUIRED_EXTENSIONS = ["tableHandleExtension"];
|
|
18
|
+
var sortMessageKeys = {
|
|
19
|
+
row: {
|
|
20
|
+
asc: messages.sort_row_asc,
|
|
21
|
+
desc: messages.sort_row_desc
|
|
22
|
+
},
|
|
23
|
+
column: {
|
|
24
|
+
asc: messages.sort_column_asc,
|
|
25
|
+
desc: messages.sort_column_desc
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
var tableSortRowColumnIcons = {
|
|
29
|
+
asc: ArrowDownAZIcon,
|
|
30
|
+
desc: ArrowDownZAIcon
|
|
31
|
+
};
|
|
32
|
+
function isCellHeader(cellNode) {
|
|
33
|
+
var _a;
|
|
34
|
+
if (!cellNode) return false;
|
|
35
|
+
return cellNode.type.name === "tableHeader" || cellNode.type.name === "table_header" || ((_a = cellNode.attrs) == null ? void 0 : _a.header) === true;
|
|
36
|
+
}
|
|
37
|
+
function getCellSortText(cellNode) {
|
|
38
|
+
if (!cellNode) return "";
|
|
39
|
+
let text = "";
|
|
40
|
+
cellNode.descendants((node) => {
|
|
41
|
+
if (node.isText) {
|
|
42
|
+
text += node.text || "";
|
|
43
|
+
}
|
|
44
|
+
return true;
|
|
45
|
+
});
|
|
46
|
+
return text.trim().toLowerCase();
|
|
47
|
+
}
|
|
48
|
+
function canSortRowColumn({
|
|
49
|
+
editor,
|
|
50
|
+
index,
|
|
51
|
+
orientation,
|
|
52
|
+
tablePos
|
|
53
|
+
}) {
|
|
54
|
+
if (!editor || !editor.isEditable || !isExtensionAvailable(editor, REQUIRED_EXTENSIONS)) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const table = getTable(editor, tablePos);
|
|
59
|
+
if (!table) return false;
|
|
60
|
+
const cellData = getRowOrColumnCells(editor, index, orientation, tablePos);
|
|
61
|
+
if (cellData.orientation === "row") {
|
|
62
|
+
if (table.map.width < 2) return false;
|
|
63
|
+
} else {
|
|
64
|
+
if (table.map.height < 2) return false;
|
|
65
|
+
}
|
|
66
|
+
if (cellData.mergedCells.length > 0) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
const hasContent = cellData.cells.some(
|
|
70
|
+
(cellInfo) => cellInfo.node && !isCellHeader(cellInfo.node) && !isCellEmpty(cellInfo.node)
|
|
71
|
+
);
|
|
72
|
+
if (!hasContent) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
return true;
|
|
76
|
+
} catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function tableSortRowColumn({
|
|
81
|
+
editor,
|
|
82
|
+
index,
|
|
83
|
+
orientation,
|
|
84
|
+
direction,
|
|
85
|
+
tablePos
|
|
86
|
+
}) {
|
|
87
|
+
if (!canSortRowColumn({ editor, index, orientation, tablePos }) || !editor)
|
|
88
|
+
return false;
|
|
89
|
+
try {
|
|
90
|
+
const { state, view } = editor;
|
|
91
|
+
const tr = state.tr;
|
|
92
|
+
const cellData = getRowOrColumnCells(editor, index, orientation, tablePos);
|
|
93
|
+
if (cellData.mergedCells.length > 0) {
|
|
94
|
+
console.warn(
|
|
95
|
+
`Cannot sort ${orientation} ${index}: contains merged cells`
|
|
96
|
+
);
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
if (cellData.cells.length < 2) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
const allItems = cellData.cells.map(
|
|
103
|
+
(cellInfo, originalIndex) => {
|
|
104
|
+
const isHeader = isCellHeader(cellInfo.node);
|
|
105
|
+
const isEmpty = cellInfo.node ? isCellEmpty(cellInfo.node) : true;
|
|
106
|
+
return {
|
|
107
|
+
sortText: getCellSortText(cellInfo.node),
|
|
108
|
+
originalNode: cellInfo.node,
|
|
109
|
+
cellInfo,
|
|
110
|
+
originalIndex,
|
|
111
|
+
isHeader,
|
|
112
|
+
isEmpty
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
);
|
|
116
|
+
const dataItems = allItems.filter((item) => !item.isHeader);
|
|
117
|
+
if (dataItems.length < 2) {
|
|
118
|
+
console.log("No sortable data cells found (excluding headers)");
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
dataItems.sort((a, b) => {
|
|
122
|
+
if (a.isEmpty && !b.isEmpty) return 1;
|
|
123
|
+
if (!a.isEmpty && b.isEmpty) return -1;
|
|
124
|
+
if (a.isEmpty && b.isEmpty) return 0;
|
|
125
|
+
const comparison = a.sortText.localeCompare(b.sortText, void 0, {
|
|
126
|
+
sensitivity: "base"
|
|
127
|
+
});
|
|
128
|
+
return direction === "asc" ? comparison : -comparison;
|
|
129
|
+
});
|
|
130
|
+
const newCellNodes = [];
|
|
131
|
+
let dataIndex = 0;
|
|
132
|
+
for (let i = 0; i < allItems.length; i++) {
|
|
133
|
+
const originalItem = allItems[i];
|
|
134
|
+
const targetCell = cellData.cells[i];
|
|
135
|
+
if (!targetCell || !originalItem) continue;
|
|
136
|
+
let nodeToPlace = null;
|
|
137
|
+
if (originalItem.isHeader) {
|
|
138
|
+
nodeToPlace = originalItem.originalNode;
|
|
139
|
+
} else {
|
|
140
|
+
const sortedDataItem = dataItems[dataIndex];
|
|
141
|
+
nodeToPlace = (sortedDataItem == null ? void 0 : sortedDataItem.originalNode) || null;
|
|
142
|
+
dataIndex++;
|
|
143
|
+
}
|
|
144
|
+
if (nodeToPlace && targetCell.node) {
|
|
145
|
+
const cellType = targetCell.node.type;
|
|
146
|
+
const newCellNode = cellType.create(
|
|
147
|
+
nodeToPlace.attrs,
|
|
148
|
+
nodeToPlace.content,
|
|
149
|
+
nodeToPlace.marks
|
|
150
|
+
);
|
|
151
|
+
newCellNodes.push(newCellNode);
|
|
152
|
+
} else {
|
|
153
|
+
newCellNodes.push(targetCell.node);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const cellsToReplace = [...cellData.cells].reverse();
|
|
157
|
+
const newNodesToPlace = [...newCellNodes].reverse();
|
|
158
|
+
cellsToReplace.forEach((targetCell, reverseIndex) => {
|
|
159
|
+
const newNode = newNodesToPlace[reverseIndex];
|
|
160
|
+
if (newNode && targetCell.node) {
|
|
161
|
+
const cellEnd = targetCell.pos + targetCell.node.nodeSize;
|
|
162
|
+
tr.replaceWith(targetCell.pos, cellEnd, newNode);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
if (tr.docChanged) {
|
|
166
|
+
view.dispatch(tr);
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
return false;
|
|
170
|
+
} catch (error) {
|
|
171
|
+
console.error(`Error sorting table ${orientation}:`, error);
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function shouldShowButton({
|
|
176
|
+
editor,
|
|
177
|
+
index,
|
|
178
|
+
orientation,
|
|
179
|
+
hideWhenUnavailable,
|
|
180
|
+
tablePos
|
|
181
|
+
}) {
|
|
182
|
+
if (!editor || !editor.isEditable) return false;
|
|
183
|
+
if (!isExtensionAvailable(editor, REQUIRED_EXTENSIONS)) return false;
|
|
184
|
+
const table = getTable(editor, tablePos);
|
|
185
|
+
if (!table) return false;
|
|
186
|
+
const selectionType = getTableSelectionType(
|
|
187
|
+
editor,
|
|
188
|
+
index,
|
|
189
|
+
orientation,
|
|
190
|
+
tablePos
|
|
191
|
+
);
|
|
192
|
+
if (!selectionType) return false;
|
|
193
|
+
return hideWhenUnavailable ? canSortRowColumn({ editor, index, orientation, tablePos }) : true;
|
|
194
|
+
}
|
|
195
|
+
function useTableSortRowColumn(config = { direction: "asc" }) {
|
|
196
|
+
const {
|
|
197
|
+
editor: providedEditor,
|
|
198
|
+
index,
|
|
199
|
+
orientation,
|
|
200
|
+
tablePos,
|
|
201
|
+
direction,
|
|
202
|
+
hideWhenUnavailable = false,
|
|
203
|
+
onSorted
|
|
204
|
+
} = config;
|
|
205
|
+
const { editor } = useTiptapEditor(providedEditor);
|
|
206
|
+
const intl = useSafeIntl();
|
|
207
|
+
const selectionType = getTableSelectionType(editor, index, orientation);
|
|
208
|
+
const isVisible = shouldShowButton({
|
|
209
|
+
editor,
|
|
210
|
+
index,
|
|
211
|
+
orientation,
|
|
212
|
+
hideWhenUnavailable,
|
|
213
|
+
tablePos
|
|
214
|
+
});
|
|
215
|
+
const canPerformSort = canSortRowColumn({
|
|
216
|
+
editor,
|
|
217
|
+
index,
|
|
218
|
+
orientation,
|
|
219
|
+
tablePos
|
|
220
|
+
});
|
|
221
|
+
const handleSort = useCallback(() => {
|
|
222
|
+
const success = tableSortRowColumn({
|
|
223
|
+
editor,
|
|
224
|
+
index,
|
|
225
|
+
orientation,
|
|
226
|
+
direction,
|
|
227
|
+
tablePos
|
|
228
|
+
});
|
|
229
|
+
if (success) onSorted == null ? void 0 : onSorted();
|
|
230
|
+
return success;
|
|
231
|
+
}, [editor, index, orientation, direction, tablePos, onSorted]);
|
|
232
|
+
const label = useMemo(() => {
|
|
233
|
+
const orient = (selectionType == null ? void 0 : selectionType.orientation) || "row";
|
|
234
|
+
return intl.formatMessage(sortMessageKeys[orient][direction]);
|
|
235
|
+
}, [intl, selectionType, direction]);
|
|
236
|
+
const Icon = useMemo(() => {
|
|
237
|
+
return tableSortRowColumnIcons[direction] || ArrowDownAZIcon;
|
|
238
|
+
}, [direction]);
|
|
239
|
+
return {
|
|
240
|
+
isVisible,
|
|
241
|
+
canSortRowColumn: canPerformSort,
|
|
242
|
+
handleSort,
|
|
243
|
+
label,
|
|
244
|
+
Icon
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export {
|
|
249
|
+
tableSortRowColumnIcons,
|
|
250
|
+
useTableSortRowColumn
|
|
251
|
+
};
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
messages
|
|
4
|
+
} from "./chunk-CN73TYHV.mjs";
|
|
5
|
+
import {
|
|
6
|
+
getIndexCoordinates,
|
|
7
|
+
getRowOrColumnCells,
|
|
8
|
+
getTableSelectionType,
|
|
9
|
+
selectCellsByCoords
|
|
10
|
+
} from "./chunk-5B5XIL2G.mjs";
|
|
11
|
+
|
|
12
|
+
// src/hooks/use-table-header-row-column.ts
|
|
13
|
+
import {
|
|
14
|
+
isExtensionAvailable,
|
|
15
|
+
isValidPosition,
|
|
16
|
+
useTiptapEditor
|
|
17
|
+
} from "@kopexa/editor-utils";
|
|
18
|
+
import { useSafeIntl } from "@kopexa/i18n";
|
|
19
|
+
import { TableHeaderColumnIcon, TableHeaderRowIcon } from "@kopexa/icons";
|
|
20
|
+
import { CellSelection, toggleHeader } from "@tiptap/pm/tables";
|
|
21
|
+
import { useCallback } from "react";
|
|
22
|
+
var REQUIRED_EXTENSIONS = ["table"];
|
|
23
|
+
var headerMessageKeys = {
|
|
24
|
+
row: messages.header_row,
|
|
25
|
+
column: messages.header_column
|
|
26
|
+
};
|
|
27
|
+
var tableHeaderRowColumnIcons = {
|
|
28
|
+
row: TableHeaderRowIcon,
|
|
29
|
+
column: TableHeaderColumnIcon
|
|
30
|
+
};
|
|
31
|
+
function canToggleHeader({
|
|
32
|
+
editor,
|
|
33
|
+
index,
|
|
34
|
+
orientation,
|
|
35
|
+
tablePos
|
|
36
|
+
}) {
|
|
37
|
+
if (!editor || !editor.isEditable || !isExtensionAvailable(editor, REQUIRED_EXTENSIONS)) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
const selectionType = getTableSelectionType(
|
|
41
|
+
editor,
|
|
42
|
+
index,
|
|
43
|
+
orientation,
|
|
44
|
+
tablePos
|
|
45
|
+
);
|
|
46
|
+
if (!selectionType) return false;
|
|
47
|
+
return selectionType.index === 0;
|
|
48
|
+
}
|
|
49
|
+
function toggleTableHeader({
|
|
50
|
+
editor,
|
|
51
|
+
index,
|
|
52
|
+
orientation,
|
|
53
|
+
tablePos
|
|
54
|
+
}) {
|
|
55
|
+
if (!editor) return false;
|
|
56
|
+
if (!canToggleHeader({ editor, index, orientation, tablePos })) return false;
|
|
57
|
+
try {
|
|
58
|
+
const selectionType = getTableSelectionType(
|
|
59
|
+
editor,
|
|
60
|
+
index,
|
|
61
|
+
orientation,
|
|
62
|
+
tablePos
|
|
63
|
+
);
|
|
64
|
+
if (!selectionType) return false;
|
|
65
|
+
const isRow = selectionType.orientation === "row";
|
|
66
|
+
if (editor.state.selection instanceof CellSelection) {
|
|
67
|
+
return isRow ? editor.commands.toggleHeaderRow() : editor.commands.toggleHeaderColumn();
|
|
68
|
+
}
|
|
69
|
+
if (!isValidPosition(tablePos)) return false;
|
|
70
|
+
const cellCoords = getIndexCoordinates({
|
|
71
|
+
editor,
|
|
72
|
+
index: selectionType.index,
|
|
73
|
+
orientation: selectionType.orientation,
|
|
74
|
+
tablePos
|
|
75
|
+
});
|
|
76
|
+
if (!cellCoords) return false;
|
|
77
|
+
const stateWithCellSel = selectCellsByCoords(editor, tablePos, cellCoords, {
|
|
78
|
+
mode: "state"
|
|
79
|
+
});
|
|
80
|
+
if (!stateWithCellSel) return false;
|
|
81
|
+
const dispatch = (tr) => editor.view.dispatch(tr);
|
|
82
|
+
return isRow ? toggleHeader("row")(stateWithCellSel, dispatch) : toggleHeader("column")(stateWithCellSel, dispatch);
|
|
83
|
+
} catch {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function shouldShowButton({
|
|
88
|
+
editor,
|
|
89
|
+
index,
|
|
90
|
+
orientation,
|
|
91
|
+
hideWhenUnavailable,
|
|
92
|
+
tablePos
|
|
93
|
+
}) {
|
|
94
|
+
if (!editor || !editor.isEditable) return false;
|
|
95
|
+
if (!isExtensionAvailable(editor, REQUIRED_EXTENSIONS)) return false;
|
|
96
|
+
if (hideWhenUnavailable) {
|
|
97
|
+
return canToggleHeader({ editor, index, orientation, tablePos });
|
|
98
|
+
}
|
|
99
|
+
const selectionType = getTableSelectionType(editor, index, orientation);
|
|
100
|
+
return Boolean(selectionType);
|
|
101
|
+
}
|
|
102
|
+
function useTableHeaderRowColumn(config) {
|
|
103
|
+
var _a, _b;
|
|
104
|
+
const {
|
|
105
|
+
editor: providedEditor,
|
|
106
|
+
index,
|
|
107
|
+
orientation,
|
|
108
|
+
tablePos,
|
|
109
|
+
hideWhenUnavailable = false,
|
|
110
|
+
onToggled
|
|
111
|
+
} = config;
|
|
112
|
+
const { editor } = useTiptapEditor(providedEditor);
|
|
113
|
+
const intl = useSafeIntl();
|
|
114
|
+
const selectionType = getTableSelectionType(editor, index, orientation);
|
|
115
|
+
const isVisible = shouldShowButton({
|
|
116
|
+
editor,
|
|
117
|
+
index,
|
|
118
|
+
orientation,
|
|
119
|
+
hideWhenUnavailable,
|
|
120
|
+
tablePos
|
|
121
|
+
});
|
|
122
|
+
const canPerformToggle = canToggleHeader({
|
|
123
|
+
editor,
|
|
124
|
+
index,
|
|
125
|
+
orientation,
|
|
126
|
+
tablePos
|
|
127
|
+
});
|
|
128
|
+
let isActive = false;
|
|
129
|
+
if ((editor == null ? void 0 : editor.state.selection) instanceof CellSelection) {
|
|
130
|
+
isActive = (editor == null ? void 0 : editor.isActive("tableHeader")) || false;
|
|
131
|
+
} else {
|
|
132
|
+
const rowsOrCols = getRowOrColumnCells(
|
|
133
|
+
editor,
|
|
134
|
+
index,
|
|
135
|
+
selectionType == null ? void 0 : selectionType.orientation,
|
|
136
|
+
tablePos
|
|
137
|
+
);
|
|
138
|
+
if (rowsOrCols) {
|
|
139
|
+
const secondIndex = rowsOrCols.cells.length > 1 ? 1 : 0;
|
|
140
|
+
isActive = ((_b = (_a = rowsOrCols.cells[secondIndex]) == null ? void 0 : _a.node) == null ? void 0 : _b.type.name) === "tableHeader" || false;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const handleToggle = useCallback(() => {
|
|
144
|
+
const success = toggleTableHeader({ editor, index, orientation, tablePos });
|
|
145
|
+
if (success) onToggled == null ? void 0 : onToggled();
|
|
146
|
+
return success;
|
|
147
|
+
}, [editor, index, orientation, tablePos, onToggled]);
|
|
148
|
+
const label = intl.formatMessage(
|
|
149
|
+
headerMessageKeys[(selectionType == null ? void 0 : selectionType.orientation) || "row"]
|
|
150
|
+
);
|
|
151
|
+
const Icon = tableHeaderRowColumnIcons[(selectionType == null ? void 0 : selectionType.orientation) || "row"];
|
|
152
|
+
return {
|
|
153
|
+
isVisible,
|
|
154
|
+
canToggleHeader: canPerformToggle,
|
|
155
|
+
handleToggle,
|
|
156
|
+
label,
|
|
157
|
+
Icon,
|
|
158
|
+
isActive
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export {
|
|
163
|
+
tableHeaderRowColumnIcons,
|
|
164
|
+
useTableHeaderRowColumn
|
|
165
|
+
};
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/messages.ts
|
|
4
|
+
import { defineMessages } from "@kopexa/i18n";
|
|
5
|
+
var messages = defineMessages({
|
|
6
|
+
// Row/Column actions (aria labels)
|
|
7
|
+
row_actions: {
|
|
8
|
+
id: "editor.table.row_actions",
|
|
9
|
+
defaultMessage: "Row actions",
|
|
10
|
+
description: "ARIA label for row actions menu button"
|
|
11
|
+
},
|
|
12
|
+
column_actions: {
|
|
13
|
+
id: "editor.table.column_actions",
|
|
14
|
+
defaultMessage: "Column actions",
|
|
15
|
+
description: "ARIA label for column actions menu button"
|
|
16
|
+
},
|
|
17
|
+
cell_options: {
|
|
18
|
+
id: "editor.table.cell_options",
|
|
19
|
+
defaultMessage: "Table cells option",
|
|
20
|
+
description: "ARIA label for cell options menu button"
|
|
21
|
+
},
|
|
22
|
+
// Alignment
|
|
23
|
+
alignment: {
|
|
24
|
+
id: "editor.table.alignment",
|
|
25
|
+
defaultMessage: "Alignment",
|
|
26
|
+
description: "Label for alignment submenu"
|
|
27
|
+
},
|
|
28
|
+
align_left: {
|
|
29
|
+
id: "editor.table.align_left",
|
|
30
|
+
defaultMessage: "Align left",
|
|
31
|
+
description: "Label for align left action"
|
|
32
|
+
},
|
|
33
|
+
align_center: {
|
|
34
|
+
id: "editor.table.align_center",
|
|
35
|
+
defaultMessage: "Align center",
|
|
36
|
+
description: "Label for align center action"
|
|
37
|
+
},
|
|
38
|
+
align_right: {
|
|
39
|
+
id: "editor.table.align_right",
|
|
40
|
+
defaultMessage: "Align right",
|
|
41
|
+
description: "Label for align right action"
|
|
42
|
+
},
|
|
43
|
+
justify: {
|
|
44
|
+
id: "editor.table.justify",
|
|
45
|
+
defaultMessage: "Justify",
|
|
46
|
+
description: "Label for justify action"
|
|
47
|
+
},
|
|
48
|
+
align_top: {
|
|
49
|
+
id: "editor.table.align_top",
|
|
50
|
+
defaultMessage: "Align top",
|
|
51
|
+
description: "Label for vertical align top action"
|
|
52
|
+
},
|
|
53
|
+
align_middle: {
|
|
54
|
+
id: "editor.table.align_middle",
|
|
55
|
+
defaultMessage: "Align middle",
|
|
56
|
+
description: "Label for vertical align middle action"
|
|
57
|
+
},
|
|
58
|
+
align_bottom: {
|
|
59
|
+
id: "editor.table.align_bottom",
|
|
60
|
+
defaultMessage: "Align bottom",
|
|
61
|
+
description: "Label for vertical align bottom action"
|
|
62
|
+
},
|
|
63
|
+
// Add row/column
|
|
64
|
+
insert_row_above: {
|
|
65
|
+
id: "editor.table.insert_row_above",
|
|
66
|
+
defaultMessage: "Insert row above",
|
|
67
|
+
description: "Label for insert row above action"
|
|
68
|
+
},
|
|
69
|
+
insert_row_below: {
|
|
70
|
+
id: "editor.table.insert_row_below",
|
|
71
|
+
defaultMessage: "Insert row below",
|
|
72
|
+
description: "Label for insert row below action"
|
|
73
|
+
},
|
|
74
|
+
insert_column_left: {
|
|
75
|
+
id: "editor.table.insert_column_left",
|
|
76
|
+
defaultMessage: "Insert column left",
|
|
77
|
+
description: "Label for insert column left action"
|
|
78
|
+
},
|
|
79
|
+
insert_column_right: {
|
|
80
|
+
id: "editor.table.insert_column_right",
|
|
81
|
+
defaultMessage: "Insert column right",
|
|
82
|
+
description: "Label for insert column right action"
|
|
83
|
+
},
|
|
84
|
+
// Delete row/column
|
|
85
|
+
delete_row: {
|
|
86
|
+
id: "editor.table.delete_row",
|
|
87
|
+
defaultMessage: "Delete row",
|
|
88
|
+
description: "Label for delete row action"
|
|
89
|
+
},
|
|
90
|
+
delete_column: {
|
|
91
|
+
id: "editor.table.delete_column",
|
|
92
|
+
defaultMessage: "Delete column",
|
|
93
|
+
description: "Label for delete column action"
|
|
94
|
+
},
|
|
95
|
+
// Move row/column
|
|
96
|
+
move_row_up: {
|
|
97
|
+
id: "editor.table.move_row_up",
|
|
98
|
+
defaultMessage: "Move row up",
|
|
99
|
+
description: "Label for move row up action"
|
|
100
|
+
},
|
|
101
|
+
move_row_down: {
|
|
102
|
+
id: "editor.table.move_row_down",
|
|
103
|
+
defaultMessage: "Move row down",
|
|
104
|
+
description: "Label for move row down action"
|
|
105
|
+
},
|
|
106
|
+
move_column_left: {
|
|
107
|
+
id: "editor.table.move_column_left",
|
|
108
|
+
defaultMessage: "Move column left",
|
|
109
|
+
description: "Label for move column left action"
|
|
110
|
+
},
|
|
111
|
+
move_column_right: {
|
|
112
|
+
id: "editor.table.move_column_right",
|
|
113
|
+
defaultMessage: "Move column right",
|
|
114
|
+
description: "Label for move column right action"
|
|
115
|
+
},
|
|
116
|
+
// Sort
|
|
117
|
+
sort_row_asc: {
|
|
118
|
+
id: "editor.table.sort_row_asc",
|
|
119
|
+
defaultMessage: "Sort row A-Z",
|
|
120
|
+
description: "Label for sort row ascending action"
|
|
121
|
+
},
|
|
122
|
+
sort_row_desc: {
|
|
123
|
+
id: "editor.table.sort_row_desc",
|
|
124
|
+
defaultMessage: "Sort row Z-A",
|
|
125
|
+
description: "Label for sort row descending action"
|
|
126
|
+
},
|
|
127
|
+
sort_column_asc: {
|
|
128
|
+
id: "editor.table.sort_column_asc",
|
|
129
|
+
defaultMessage: "Sort column A-Z",
|
|
130
|
+
description: "Label for sort column ascending action"
|
|
131
|
+
},
|
|
132
|
+
sort_column_desc: {
|
|
133
|
+
id: "editor.table.sort_column_desc",
|
|
134
|
+
defaultMessage: "Sort column Z-A",
|
|
135
|
+
description: "Label for sort column descending action"
|
|
136
|
+
},
|
|
137
|
+
// Duplicate
|
|
138
|
+
duplicate_row: {
|
|
139
|
+
id: "editor.table.duplicate_row",
|
|
140
|
+
defaultMessage: "Duplicate row",
|
|
141
|
+
description: "Label for duplicate row action"
|
|
142
|
+
},
|
|
143
|
+
duplicate_column: {
|
|
144
|
+
id: "editor.table.duplicate_column",
|
|
145
|
+
defaultMessage: "Duplicate column",
|
|
146
|
+
description: "Label for duplicate column action"
|
|
147
|
+
},
|
|
148
|
+
// Header
|
|
149
|
+
header_row: {
|
|
150
|
+
id: "editor.table.header_row",
|
|
151
|
+
defaultMessage: "Header row",
|
|
152
|
+
description: "Label for toggle header row action"
|
|
153
|
+
},
|
|
154
|
+
header_column: {
|
|
155
|
+
id: "editor.table.header_column",
|
|
156
|
+
defaultMessage: "Header column",
|
|
157
|
+
description: "Label for toggle header column action"
|
|
158
|
+
},
|
|
159
|
+
// Merge/Split
|
|
160
|
+
merge_cells: {
|
|
161
|
+
id: "editor.table.merge_cells",
|
|
162
|
+
defaultMessage: "Merge cells",
|
|
163
|
+
description: "Label for merge cells action"
|
|
164
|
+
},
|
|
165
|
+
split_cell: {
|
|
166
|
+
id: "editor.table.split_cell",
|
|
167
|
+
defaultMessage: "Split cell",
|
|
168
|
+
description: "Label for split cell action"
|
|
169
|
+
},
|
|
170
|
+
// Clear contents
|
|
171
|
+
clear_row_contents: {
|
|
172
|
+
id: "editor.table.clear_row_contents",
|
|
173
|
+
defaultMessage: "Clear row contents",
|
|
174
|
+
description: "Label for clear row contents action"
|
|
175
|
+
},
|
|
176
|
+
clear_column_contents: {
|
|
177
|
+
id: "editor.table.clear_column_contents",
|
|
178
|
+
defaultMessage: "Clear column contents",
|
|
179
|
+
description: "Label for clear column contents action"
|
|
180
|
+
},
|
|
181
|
+
clear_contents: {
|
|
182
|
+
id: "editor.table.clear_contents",
|
|
183
|
+
defaultMessage: "Clear contents",
|
|
184
|
+
description: "Label for clear contents action (generic)"
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
export {
|
|
189
|
+
messages
|
|
190
|
+
};
|