@atlaskit/editor-plugin-table 5.6.7 → 5.7.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.
- package/CHANGELOG.md +13 -0
- package/dist/cjs/nodeviews/TableResizer.js +1 -1
- package/dist/cjs/types.js +1 -0
- package/dist/cjs/ui/FloatingContextualMenu/ContextualMenu.js +238 -99
- package/dist/cjs/ui/FloatingContextualMenu/styles.js +1 -1
- package/dist/cjs/ui/consts.js +6 -1
- package/dist/cjs/ui/icons/MergeCellsIcon.js +34 -0
- package/dist/cjs/ui/icons/SplitCellIcon.js +41 -0
- package/dist/cjs/ui/icons/index.js +14 -0
- package/dist/es2019/nodeviews/TableResizer.js +2 -2
- package/dist/es2019/types.js +1 -0
- package/dist/es2019/ui/FloatingContextualMenu/ContextualMenu.js +248 -71
- package/dist/es2019/ui/FloatingContextualMenu/styles.js +20 -0
- package/dist/es2019/ui/consts.js +5 -0
- package/dist/es2019/ui/icons/MergeCellsIcon.js +25 -0
- package/dist/es2019/ui/icons/SplitCellIcon.js +32 -0
- package/dist/es2019/ui/icons/index.js +2 -0
- package/dist/esm/nodeviews/TableResizer.js +2 -2
- package/dist/esm/types.js +1 -0
- package/dist/esm/ui/FloatingContextualMenu/ContextualMenu.js +238 -98
- package/dist/esm/ui/FloatingContextualMenu/styles.js +1 -1
- package/dist/esm/ui/consts.js +5 -0
- package/dist/esm/ui/icons/MergeCellsIcon.js +27 -0
- package/dist/esm/ui/icons/SplitCellIcon.js +34 -0
- package/dist/esm/ui/icons/index.js +2 -0
- package/dist/types/types.d.ts +1 -0
- package/dist/types/ui/FloatingContextualMenu/ContextualMenu.d.ts +12 -2
- package/dist/types/ui/consts.d.ts +1 -0
- package/dist/types/ui/icons/MergeCellsIcon.d.ts +2 -0
- package/dist/types/ui/icons/SplitCellIcon.d.ts +2 -0
- package/dist/types/ui/icons/index.d.ts +2 -0
- package/dist/types-ts4.5/types.d.ts +1 -0
- package/dist/types-ts4.5/ui/FloatingContextualMenu/ContextualMenu.d.ts +12 -2
- package/dist/types-ts4.5/ui/consts.d.ts +1 -0
- package/dist/types-ts4.5/ui/icons/MergeCellsIcon.d.ts +2 -0
- package/dist/types-ts4.5/ui/icons/SplitCellIcon.d.ts +2 -0
- package/dist/types-ts4.5/ui/icons/index.d.ts +2 -0
- package/package.json +11 -4
- package/src/nodeviews/TableResizer.tsx +3 -1
- package/src/types.ts +1 -0
- package/src/ui/FloatingContextualMenu/ContextualMenu.tsx +316 -68
- package/src/ui/FloatingContextualMenu/styles.ts +20 -0
- package/src/ui/consts.ts +5 -0
- package/src/ui/icons/MergeCellsIcon.tsx +32 -0
- package/src/ui/icons/SplitCellIcon.tsx +40 -0
- package/src/ui/icons/index.ts +2 -0
|
@@ -2,6 +2,8 @@ export { DragHandleIcon } from './DragHandleIcon';
|
|
|
2
2
|
export { DragInMotionIcon } from './DragInMotionIcon';
|
|
3
3
|
export { DragHandleDisabledIcon } from './DragHandleDisabledIcon';
|
|
4
4
|
export { MinimisedHandleIcon } from './MinimisedHandle';
|
|
5
|
+
export { MergeCellsIcon } from './MergeCellsIcon';
|
|
6
|
+
export { SplitCellIcon } from './SplitCellIcon';
|
|
5
7
|
export { AddRowAboveIcon } from './AddRowAboveIcon';
|
|
6
8
|
export { AddRowBelowIcon } from './AddRowBelowIcon';
|
|
7
9
|
export { AddColLeftIcon } from './AddColLeftIcon';
|
|
@@ -329,6 +329,7 @@ export declare const TableCssClassName: {
|
|
|
329
329
|
CONTEXTUAL_MENU_BUTTON: string;
|
|
330
330
|
CONTEXTUAL_MENU_BUTTON_FIXED: string;
|
|
331
331
|
CONTEXTUAL_MENU_ICON: string;
|
|
332
|
+
CONTEXTUAL_MENU_ICON_SMALL: string;
|
|
332
333
|
SELECTED_CELL: string;
|
|
333
334
|
NODEVIEW_WRAPPER: string;
|
|
334
335
|
TABLE_SELECTED: string;
|
|
@@ -28,9 +28,19 @@ export declare class ContextualMenu extends Component<Props & WrappedComponentPr
|
|
|
28
28
|
static defaultProps: {
|
|
29
29
|
boundariesElement: HTMLElement | undefined;
|
|
30
30
|
};
|
|
31
|
-
render(): jsx.JSX.Element
|
|
31
|
+
render(): jsx.JSX.Element;
|
|
32
32
|
private handleSubMenuRef;
|
|
33
|
-
private
|
|
33
|
+
private createBackgroundColorItem;
|
|
34
|
+
private createMergeSplitCellItems;
|
|
35
|
+
private createInsertColumnItem;
|
|
36
|
+
private createInsertRowItem;
|
|
37
|
+
private createClearCellsItem;
|
|
38
|
+
private createDeleteColumnItem;
|
|
39
|
+
private createDeleteRowItem;
|
|
40
|
+
private createDistributeColumnsItem;
|
|
41
|
+
private createSortColumnItems;
|
|
42
|
+
private createOriginalContextMenuItems;
|
|
43
|
+
private createNewContextMenuItems;
|
|
34
44
|
private onMenuItemActivated;
|
|
35
45
|
private toggleOpen;
|
|
36
46
|
private handleOpenChange;
|
|
@@ -51,6 +51,7 @@ export declare const TABLE_SNAP_GAP = 9;
|
|
|
51
51
|
export declare const TABLE_HIGHLIGHT_GAP = 10;
|
|
52
52
|
export declare const TABLE_HIGHLIGHT_TOLERANCE = 2;
|
|
53
53
|
export declare const STICKY_HEADER_TOGGLE_TOLERANCE_MS = 5;
|
|
54
|
+
export declare const TABLE_GUIDELINE_VISIBLE_ADJUSTMENT = -68;
|
|
54
55
|
export declare const dragMenuDropdownWidth = 240;
|
|
55
56
|
export declare const dragTableInsertColumnButtonSize = 16;
|
|
56
57
|
export declare const dropTargetExtendedWidth = 150;
|
|
@@ -2,6 +2,8 @@ export { DragHandleIcon } from './DragHandleIcon';
|
|
|
2
2
|
export { DragInMotionIcon } from './DragInMotionIcon';
|
|
3
3
|
export { DragHandleDisabledIcon } from './DragHandleDisabledIcon';
|
|
4
4
|
export { MinimisedHandleIcon } from './MinimisedHandle';
|
|
5
|
+
export { MergeCellsIcon } from './MergeCellsIcon';
|
|
6
|
+
export { SplitCellIcon } from './SplitCellIcon';
|
|
5
7
|
export { AddRowAboveIcon } from './AddRowAboveIcon';
|
|
6
8
|
export { AddRowBelowIcon } from './AddRowBelowIcon';
|
|
7
9
|
export { AddColLeftIcon } from './AddColLeftIcon';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/editor-plugin-table",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.7.1",
|
|
4
4
|
"description": "Table plugin for the @atlaskit/editor",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"registry": "https://registry.npmjs.org/"
|
|
@@ -24,12 +24,13 @@
|
|
|
24
24
|
"atlassian": {
|
|
25
25
|
"team": "Editor: Jenga",
|
|
26
26
|
"singleton": true,
|
|
27
|
-
"releaseModel": "continuous"
|
|
27
|
+
"releaseModel": "continuous",
|
|
28
|
+
"runReact18": false
|
|
28
29
|
},
|
|
29
30
|
"dependencies": {
|
|
30
31
|
"@atlaskit/adf-schema": "^35.2.0",
|
|
31
32
|
"@atlaskit/custom-steps": "^0.0.10",
|
|
32
|
-
"@atlaskit/editor-common": "^76.
|
|
33
|
+
"@atlaskit/editor-common": "^76.29.0",
|
|
33
34
|
"@atlaskit/editor-palette": "1.5.2",
|
|
34
35
|
"@atlaskit/editor-plugin-analytics": "^0.4.0",
|
|
35
36
|
"@atlaskit/editor-plugin-content-insertion": "^0.1.0",
|
|
@@ -46,7 +47,7 @@
|
|
|
46
47
|
"@atlaskit/pragmatic-drag-and-drop-hitbox": "^0.12.0",
|
|
47
48
|
"@atlaskit/primitives": "^1.15.0",
|
|
48
49
|
"@atlaskit/theme": "^12.6.0",
|
|
49
|
-
"@atlaskit/tokens": "^1.
|
|
50
|
+
"@atlaskit/tokens": "^1.32.0",
|
|
50
51
|
"@atlaskit/tooltip": "^18.1.0",
|
|
51
52
|
"@babel/runtime": "^7.0.0",
|
|
52
53
|
"@emotion/react": "^11.7.1",
|
|
@@ -141,6 +142,12 @@
|
|
|
141
142
|
},
|
|
142
143
|
"platform.editor.a11y.table-selection_9uv33": {
|
|
143
144
|
"type": "boolean"
|
|
145
|
+
},
|
|
146
|
+
"platform.editor.table.new-cell-context-menu-styling": {
|
|
147
|
+
"type": "boolean"
|
|
148
|
+
},
|
|
149
|
+
"platform.editor.menu.group-items": {
|
|
150
|
+
"type": "boolean"
|
|
144
151
|
}
|
|
145
152
|
}
|
|
146
153
|
}
|
|
@@ -41,6 +41,7 @@ import {
|
|
|
41
41
|
} from '../pm-plugins/table-resizing/utils';
|
|
42
42
|
import { pluginKey as tableWidthPluginKey } from '../pm-plugins/table-width';
|
|
43
43
|
import {
|
|
44
|
+
TABLE_GUIDELINE_VISIBLE_ADJUSTMENT,
|
|
44
45
|
TABLE_HIGHLIGHT_GAP,
|
|
45
46
|
TABLE_HIGHLIGHT_TOLERANCE,
|
|
46
47
|
TABLE_SNAP_GAP,
|
|
@@ -140,7 +141,8 @@ const getVisibleGuidelines = (
|
|
|
140
141
|
guideline.position &&
|
|
141
142
|
guideline.position.x !== undefined &&
|
|
142
143
|
typeof guideline.position.x === 'number' &&
|
|
143
|
-
Math.abs(guideline.position.x * 2) <
|
|
144
|
+
Math.abs(guideline.position.x * 2) <
|
|
145
|
+
containerWidth + TABLE_GUIDELINE_VISIBLE_ADJUSTMENT
|
|
144
146
|
);
|
|
145
147
|
});
|
|
146
148
|
};
|
package/src/types.ts
CHANGED
|
@@ -368,6 +368,7 @@ export const TableCssClassName = {
|
|
|
368
368
|
CONTEXTUAL_MENU_BUTTON: `${tablePrefixSelector}-contextual-menu-button`,
|
|
369
369
|
CONTEXTUAL_MENU_BUTTON_FIXED: `${tablePrefixSelector}-contextual-menu-button-fixed`,
|
|
370
370
|
CONTEXTUAL_MENU_ICON: `${tablePrefixSelector}-contextual-submenu-icon`,
|
|
371
|
+
CONTEXTUAL_MENU_ICON_SMALL: `${tablePrefixSelector}-contextual-submenu-icon-small`,
|
|
371
372
|
|
|
372
373
|
// come from prosemirror-table
|
|
373
374
|
SELECTED_CELL: 'selectedCell',
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable @atlaskit/design-system/prefer-primitives */
|
|
1
2
|
/** @jsx jsx */
|
|
2
3
|
import { Component } from 'react';
|
|
3
4
|
|
|
@@ -39,6 +40,10 @@ import type { EditorView } from '@atlaskit/editor-prosemirror/view';
|
|
|
39
40
|
import { shortcutStyle } from '@atlaskit/editor-shared-styles/shortcut';
|
|
40
41
|
import type { Rect } from '@atlaskit/editor-tables/table-map';
|
|
41
42
|
import { splitCell } from '@atlaskit/editor-tables/utils';
|
|
43
|
+
import CrossCircleIcon from '@atlaskit/icon/glyph/cross-circle';
|
|
44
|
+
import EditorBackgroundColorIcon from '@atlaskit/icon/glyph/editor/background-color';
|
|
45
|
+
import RemoveIcon from '@atlaskit/icon/glyph/editor/remove';
|
|
46
|
+
import { getBooleanFF } from '@atlaskit/platform-feature-flags';
|
|
42
47
|
|
|
43
48
|
import {
|
|
44
49
|
clearHoverSelection,
|
|
@@ -69,6 +74,12 @@ import {
|
|
|
69
74
|
getSelectedRowIndexes,
|
|
70
75
|
} from '../../utils';
|
|
71
76
|
import { contextualMenuDropdownWidth } from '../consts';
|
|
77
|
+
import {
|
|
78
|
+
AddColRightIcon,
|
|
79
|
+
AddRowBelowIcon,
|
|
80
|
+
MergeCellsIcon,
|
|
81
|
+
SplitCellIcon,
|
|
82
|
+
} from '../icons';
|
|
72
83
|
|
|
73
84
|
import { cellColourPreviewStyles } from './styles';
|
|
74
85
|
|
|
@@ -105,11 +116,14 @@ export class ContextualMenu extends Component<
|
|
|
105
116
|
};
|
|
106
117
|
|
|
107
118
|
render() {
|
|
108
|
-
const { isOpen, mountPoint, offset, boundariesElement } =
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
119
|
+
const { isOpen, mountPoint, offset, boundariesElement, editorView } =
|
|
120
|
+
this.props;
|
|
121
|
+
const { isDragAndDropEnabled } = getPluginState(editorView.state);
|
|
122
|
+
const items =
|
|
123
|
+
isDragAndDropEnabled &&
|
|
124
|
+
getBooleanFF('platform.editor.table.new-cell-context-menu-styling')
|
|
125
|
+
? this.createNewContextMenuItems()
|
|
126
|
+
: this.createOriginalContextMenuItems();
|
|
113
127
|
|
|
114
128
|
return (
|
|
115
129
|
<div
|
|
@@ -134,6 +148,15 @@ export class ContextualMenu extends Component<
|
|
|
134
148
|
fitWidth={contextualMenuDropdownWidth}
|
|
135
149
|
boundariesElement={boundariesElement}
|
|
136
150
|
offset={offset}
|
|
151
|
+
section={
|
|
152
|
+
isDragAndDropEnabled &&
|
|
153
|
+
getBooleanFF(
|
|
154
|
+
'platform.editor.table.new-cell-context-menu-styling',
|
|
155
|
+
) &&
|
|
156
|
+
getBooleanFF('platform.editor.menu.group-items')
|
|
157
|
+
? { hasSeparator: true }
|
|
158
|
+
: undefined
|
|
159
|
+
}
|
|
137
160
|
/>
|
|
138
161
|
</div>
|
|
139
162
|
);
|
|
@@ -154,24 +177,19 @@ export class ContextualMenu extends Component<
|
|
|
154
177
|
}
|
|
155
178
|
};
|
|
156
179
|
|
|
157
|
-
private
|
|
180
|
+
private createBackgroundColorItem = () => {
|
|
158
181
|
const {
|
|
159
|
-
allowMergeCells,
|
|
160
|
-
allowColumnSorting,
|
|
161
182
|
allowBackgroundColor,
|
|
162
183
|
editorView: { state },
|
|
163
184
|
isOpen,
|
|
164
|
-
selectionRect,
|
|
165
185
|
intl: { formatMessage },
|
|
166
186
|
editorView,
|
|
167
187
|
} = this.props;
|
|
168
|
-
const items: any[] = [];
|
|
169
188
|
const { isSubmenuOpen } = this.state;
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
} = getPluginState(editorView.state);
|
|
189
|
+
const { targetCellPosition, isDragAndDropEnabled } = getPluginState(
|
|
190
|
+
editorView.state,
|
|
191
|
+
);
|
|
192
|
+
|
|
175
193
|
if (allowBackgroundColor) {
|
|
176
194
|
const node =
|
|
177
195
|
isOpen && targetCellPosition
|
|
@@ -180,14 +198,35 @@ export class ContextualMenu extends Component<
|
|
|
180
198
|
const background = hexToEditorBackgroundPaletteColor(
|
|
181
199
|
node?.attrs?.background || '#ffffff',
|
|
182
200
|
);
|
|
183
|
-
|
|
184
|
-
content:
|
|
201
|
+
return {
|
|
202
|
+
content:
|
|
203
|
+
isDragAndDropEnabled &&
|
|
204
|
+
getBooleanFF('platform.editor.table.new-cell-context-menu-styling')
|
|
205
|
+
? formatMessage(messages.backgroundColor)
|
|
206
|
+
: formatMessage(messages.cellBackground),
|
|
185
207
|
value: { name: 'background' },
|
|
208
|
+
elemBefore:
|
|
209
|
+
isDragAndDropEnabled &&
|
|
210
|
+
getBooleanFF(
|
|
211
|
+
'platform.editor.table.new-cell-context-menu-styling',
|
|
212
|
+
) ? (
|
|
213
|
+
<EditorBackgroundColorIcon
|
|
214
|
+
label={formatMessage(messages.backgroundColor)}
|
|
215
|
+
size="medium"
|
|
216
|
+
/>
|
|
217
|
+
) : undefined,
|
|
186
218
|
elemAfter: (
|
|
187
219
|
<div className={DropdownMenuSharedCssClassName.SUBMENU}>
|
|
188
220
|
<div
|
|
189
221
|
css={cellColourPreviewStyles(background)}
|
|
190
|
-
className={
|
|
222
|
+
className={
|
|
223
|
+
isDragAndDropEnabled &&
|
|
224
|
+
getBooleanFF(
|
|
225
|
+
'platform.editor.table.new-cell-context-menu-styling',
|
|
226
|
+
)
|
|
227
|
+
? ClassName.CONTEXTUAL_MENU_ICON_SMALL
|
|
228
|
+
: ClassName.CONTEXTUAL_MENU_ICON
|
|
229
|
+
}
|
|
191
230
|
/>
|
|
192
231
|
{isSubmenuOpen && (
|
|
193
232
|
<div
|
|
@@ -209,72 +248,232 @@ export class ContextualMenu extends Component<
|
|
|
209
248
|
)}
|
|
210
249
|
</div>
|
|
211
250
|
),
|
|
212
|
-
}
|
|
251
|
+
} as MenuItem;
|
|
213
252
|
}
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
private createMergeSplitCellItems = () => {
|
|
256
|
+
const {
|
|
257
|
+
allowMergeCells,
|
|
258
|
+
editorView: { state },
|
|
259
|
+
intl: { formatMessage },
|
|
260
|
+
editorView,
|
|
261
|
+
} = this.props;
|
|
262
|
+
const { isDragAndDropEnabled } = getPluginState(editorView.state);
|
|
214
263
|
|
|
215
|
-
|
|
216
|
-
|
|
264
|
+
if (allowMergeCells) {
|
|
265
|
+
return [
|
|
266
|
+
{
|
|
267
|
+
content: formatMessage(messages.mergeCells),
|
|
268
|
+
value: { name: 'merge' },
|
|
269
|
+
isDisabled: !canMergeCells(state.tr),
|
|
270
|
+
elemBefore:
|
|
271
|
+
isDragAndDropEnabled &&
|
|
272
|
+
getBooleanFF(
|
|
273
|
+
'platform.editor.table.new-cell-context-menu-styling',
|
|
274
|
+
) ? (
|
|
275
|
+
<MergeCellsIcon />
|
|
276
|
+
) : undefined,
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
content: formatMessage(messages.splitCell),
|
|
280
|
+
value: { name: 'split' },
|
|
281
|
+
isDisabled: !splitCell(state),
|
|
282
|
+
elemBefore:
|
|
283
|
+
isDragAndDropEnabled &&
|
|
284
|
+
getBooleanFF(
|
|
285
|
+
'platform.editor.table.new-cell-context-menu-styling',
|
|
286
|
+
) ? (
|
|
287
|
+
<SplitCellIcon />
|
|
288
|
+
) : undefined,
|
|
289
|
+
},
|
|
290
|
+
] as MenuItem[];
|
|
291
|
+
}
|
|
292
|
+
return [];
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
private createInsertColumnItem = () => {
|
|
296
|
+
const {
|
|
297
|
+
intl: { formatMessage },
|
|
298
|
+
editorView,
|
|
299
|
+
} = this.props;
|
|
300
|
+
const { isDragAndDropEnabled } = getPluginState(editorView.state);
|
|
301
|
+
|
|
302
|
+
return {
|
|
303
|
+
content: formatMessage(
|
|
304
|
+
isDragAndDropEnabled &&
|
|
305
|
+
getBooleanFF('platform.editor.table.new-cell-context-menu-styling')
|
|
306
|
+
? messages.addColumn
|
|
307
|
+
: messages.insertColumn,
|
|
308
|
+
),
|
|
217
309
|
value: { name: 'insert_column' },
|
|
218
310
|
elemAfter: <div css={shortcutStyle}>{tooltip(addColumnAfter)}</div>,
|
|
219
|
-
|
|
311
|
+
elemBefore:
|
|
312
|
+
isDragAndDropEnabled &&
|
|
313
|
+
getBooleanFF('platform.editor.table.new-cell-context-menu-styling') ? (
|
|
314
|
+
<AddColRightIcon />
|
|
315
|
+
) : undefined,
|
|
316
|
+
} as MenuItem;
|
|
317
|
+
};
|
|
220
318
|
|
|
221
|
-
|
|
222
|
-
|
|
319
|
+
private createInsertRowItem = () => {
|
|
320
|
+
const {
|
|
321
|
+
intl: { formatMessage },
|
|
322
|
+
editorView,
|
|
323
|
+
} = this.props;
|
|
324
|
+
const { isDragAndDropEnabled } = getPluginState(editorView.state);
|
|
325
|
+
|
|
326
|
+
return {
|
|
327
|
+
content: formatMessage(
|
|
328
|
+
isDragAndDropEnabled &&
|
|
329
|
+
getBooleanFF('platform.editor.table.new-cell-context-menu-styling')
|
|
330
|
+
? messages.addRow
|
|
331
|
+
: messages.insertRow,
|
|
332
|
+
),
|
|
223
333
|
value: { name: 'insert_row' },
|
|
224
334
|
elemAfter: <div css={shortcutStyle}>{tooltip(addRowAfter)}</div>,
|
|
225
|
-
|
|
335
|
+
elemBefore:
|
|
336
|
+
isDragAndDropEnabled &&
|
|
337
|
+
getBooleanFF('platform.editor.table.new-cell-context-menu-styling') ? (
|
|
338
|
+
<AddRowBelowIcon />
|
|
339
|
+
) : undefined,
|
|
340
|
+
} as MenuItem;
|
|
341
|
+
};
|
|
226
342
|
|
|
343
|
+
private createClearCellsItem = () => {
|
|
344
|
+
const {
|
|
345
|
+
selectionRect,
|
|
346
|
+
intl: { formatMessage },
|
|
347
|
+
editorView,
|
|
348
|
+
} = this.props;
|
|
349
|
+
const { isDragAndDropEnabled } = getPluginState(editorView.state);
|
|
227
350
|
const { top, bottom, right, left } = selectionRect;
|
|
228
351
|
const noOfColumns = right - left;
|
|
229
352
|
const noOfRows = bottom - top;
|
|
230
353
|
|
|
231
|
-
|
|
354
|
+
return {
|
|
355
|
+
content: formatMessage(messages.clearCells, {
|
|
356
|
+
0: Math.max(noOfColumns, noOfRows),
|
|
357
|
+
}),
|
|
358
|
+
value: { name: 'clear' },
|
|
359
|
+
elemAfter: <div css={shortcutStyle}>{tooltip(backspace)}</div>,
|
|
360
|
+
elemBefore:
|
|
361
|
+
isDragAndDropEnabled &&
|
|
362
|
+
getBooleanFF('platform.editor.table.new-cell-context-menu-styling') ? (
|
|
363
|
+
<CrossCircleIcon
|
|
364
|
+
label={formatMessage(messages.clearCells, {
|
|
365
|
+
0: Math.max(noOfColumns, noOfRows),
|
|
366
|
+
})}
|
|
367
|
+
/>
|
|
368
|
+
) : undefined,
|
|
369
|
+
} as MenuItem;
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
private createDeleteColumnItem = () => {
|
|
373
|
+
const {
|
|
374
|
+
selectionRect,
|
|
375
|
+
intl: { formatMessage },
|
|
376
|
+
editorView,
|
|
377
|
+
} = this.props;
|
|
378
|
+
const { isDragAndDropEnabled } = getPluginState(editorView.state);
|
|
379
|
+
|
|
380
|
+
const { right, left } = selectionRect;
|
|
381
|
+
const noOfColumns = right - left;
|
|
382
|
+
|
|
383
|
+
return {
|
|
232
384
|
content: formatMessage(messages.removeColumns, {
|
|
233
385
|
0: noOfColumns,
|
|
234
386
|
}),
|
|
235
387
|
value: { name: 'delete_column' },
|
|
236
|
-
|
|
388
|
+
elemBefore:
|
|
389
|
+
isDragAndDropEnabled &&
|
|
390
|
+
getBooleanFF('platform.editor.table.new-cell-context-menu-styling') ? (
|
|
391
|
+
<RemoveIcon
|
|
392
|
+
label={formatMessage(messages.removeColumns, {
|
|
393
|
+
0: noOfColumns,
|
|
394
|
+
})}
|
|
395
|
+
/>
|
|
396
|
+
) : undefined,
|
|
397
|
+
} as MenuItem;
|
|
398
|
+
};
|
|
399
|
+
|
|
400
|
+
private createDeleteRowItem = () => {
|
|
401
|
+
const {
|
|
402
|
+
selectionRect,
|
|
403
|
+
intl: { formatMessage },
|
|
404
|
+
editorView,
|
|
405
|
+
} = this.props;
|
|
406
|
+
const { isDragAndDropEnabled } = getPluginState(editorView.state);
|
|
237
407
|
|
|
238
|
-
|
|
408
|
+
const { bottom, top } = selectionRect;
|
|
409
|
+
const noOfRows = bottom - top;
|
|
410
|
+
|
|
411
|
+
return {
|
|
239
412
|
content: formatMessage(messages.removeRows, {
|
|
240
413
|
0: noOfRows,
|
|
241
414
|
}),
|
|
242
415
|
value: { name: 'delete_row' },
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
isDisabled: !splitCell(state),
|
|
255
|
-
});
|
|
256
|
-
}
|
|
416
|
+
elemBefore:
|
|
417
|
+
isDragAndDropEnabled &&
|
|
418
|
+
getBooleanFF('platform.editor.table.new-cell-context-menu-styling') ? (
|
|
419
|
+
<RemoveIcon
|
|
420
|
+
label={formatMessage(messages.removeRows, {
|
|
421
|
+
0: noOfRows,
|
|
422
|
+
})}
|
|
423
|
+
/>
|
|
424
|
+
) : undefined,
|
|
425
|
+
} as MenuItem;
|
|
426
|
+
};
|
|
257
427
|
|
|
258
|
-
|
|
428
|
+
private createDistributeColumnsItem = () => {
|
|
429
|
+
const {
|
|
430
|
+
selectionRect,
|
|
431
|
+
intl: { formatMessage },
|
|
432
|
+
editorView,
|
|
433
|
+
getEditorContainerWidth,
|
|
434
|
+
} = this.props;
|
|
435
|
+
const {
|
|
436
|
+
isDragAndDropEnabled,
|
|
437
|
+
pluginConfig: { allowDistributeColumns },
|
|
438
|
+
} = getPluginState(editorView.state);
|
|
439
|
+
if (
|
|
440
|
+
allowDistributeColumns &&
|
|
441
|
+
(!isDragAndDropEnabled ||
|
|
442
|
+
!getBooleanFF('platform.editor.table.new-cell-context-menu-styling'))
|
|
443
|
+
) {
|
|
259
444
|
const newResizeState = getNewResizeStateFromSelectedColumns(
|
|
260
445
|
selectionRect,
|
|
261
|
-
state,
|
|
446
|
+
editorView.state,
|
|
262
447
|
editorView.domAtPos.bind(editorView),
|
|
263
|
-
|
|
448
|
+
getEditorContainerWidth,
|
|
264
449
|
);
|
|
265
450
|
|
|
266
451
|
const wouldChange = newResizeState?.changed ?? false;
|
|
267
452
|
|
|
268
|
-
|
|
453
|
+
return {
|
|
269
454
|
content: formatMessage(messages.distributeColumns),
|
|
270
455
|
value: { name: 'distribute_columns' },
|
|
271
456
|
isDisabled: !wouldChange,
|
|
272
|
-
}
|
|
457
|
+
} as MenuItem;
|
|
273
458
|
}
|
|
459
|
+
return null;
|
|
460
|
+
};
|
|
274
461
|
|
|
275
|
-
|
|
462
|
+
private createSortColumnItems = () => {
|
|
463
|
+
const {
|
|
464
|
+
intl: { formatMessage },
|
|
465
|
+
editorView,
|
|
466
|
+
allowColumnSorting,
|
|
467
|
+
} = this.props;
|
|
468
|
+
const { isDragAndDropEnabled } = getPluginState(editorView.state);
|
|
469
|
+
|
|
470
|
+
if (
|
|
471
|
+
allowColumnSorting &&
|
|
472
|
+
(!isDragAndDropEnabled ||
|
|
473
|
+
!getBooleanFF('platform.editor.table.new-cell-context-menu-styling'))
|
|
474
|
+
) {
|
|
276
475
|
const hasMergedCellsInTable =
|
|
277
|
-
getMergedCellsPositions(state.tr).length > 0;
|
|
476
|
+
getMergedCellsPositions(editorView.state.tr).length > 0;
|
|
278
477
|
const warning = hasMergedCellsInTable
|
|
279
478
|
? {
|
|
280
479
|
tooltipDescription: formatMessage(messages.canNotSortTable),
|
|
@@ -282,28 +481,77 @@ export class ContextualMenu extends Component<
|
|
|
282
481
|
}
|
|
283
482
|
: {};
|
|
284
483
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
484
|
+
return [
|
|
485
|
+
{
|
|
486
|
+
content: formatMessage(messages.sortColumnASC),
|
|
487
|
+
value: { name: 'sort_column_asc' },
|
|
488
|
+
...warning,
|
|
489
|
+
},
|
|
490
|
+
{
|
|
491
|
+
content: formatMessage(messages.sortColumnDESC),
|
|
492
|
+
value: { name: 'sort_column_desc' },
|
|
493
|
+
...warning,
|
|
494
|
+
},
|
|
495
|
+
] as MenuItem[];
|
|
296
496
|
}
|
|
297
497
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
498
|
+
return null;
|
|
499
|
+
};
|
|
500
|
+
|
|
501
|
+
private createOriginalContextMenuItems = () => {
|
|
502
|
+
let items: MenuItem[] = [];
|
|
503
|
+
const backgroundColorItem = this.createBackgroundColorItem();
|
|
504
|
+
backgroundColorItem && items.push(backgroundColorItem);
|
|
505
|
+
|
|
506
|
+
items.push(this.createInsertColumnItem());
|
|
507
|
+
|
|
508
|
+
items.push(this.createInsertRowItem());
|
|
509
|
+
|
|
510
|
+
items.push(this.createDeleteColumnItem());
|
|
511
|
+
|
|
512
|
+
items.push(this.createDeleteRowItem());
|
|
513
|
+
|
|
514
|
+
items.push(...this.createMergeSplitCellItems());
|
|
515
|
+
|
|
516
|
+
const distributeColumnsItem = this.createDistributeColumnsItem();
|
|
517
|
+
distributeColumnsItem && items.push(distributeColumnsItem);
|
|
518
|
+
|
|
519
|
+
const sortColumnItems = this.createSortColumnItems();
|
|
520
|
+
sortColumnItems && items.push(...sortColumnItems);
|
|
521
|
+
|
|
522
|
+
items.push(this.createClearCellsItem());
|
|
523
|
+
|
|
524
|
+
return [{ items }];
|
|
525
|
+
};
|
|
305
526
|
|
|
306
|
-
|
|
527
|
+
private createNewContextMenuItems = () => {
|
|
528
|
+
const backgroundColorItem = this.createBackgroundColorItem();
|
|
529
|
+
const mergeSplitCellItems = this.createMergeSplitCellItems();
|
|
530
|
+
const insertColumnItem = this.createInsertColumnItem();
|
|
531
|
+
const insertRowItem = this.createInsertRowItem();
|
|
532
|
+
const clearCellsItem = this.createClearCellsItem();
|
|
533
|
+
const deleteColumnItem = this.createDeleteColumnItem();
|
|
534
|
+
const deleteRowItem = this.createDeleteRowItem();
|
|
535
|
+
|
|
536
|
+
// Group items so when table.menu.group-items FF is enabled, a divider shows under split cell, above add column
|
|
537
|
+
let items: { items: MenuItem[] }[] = [
|
|
538
|
+
{
|
|
539
|
+
items: [],
|
|
540
|
+
},
|
|
541
|
+
{
|
|
542
|
+
items: [],
|
|
543
|
+
},
|
|
544
|
+
];
|
|
545
|
+
|
|
546
|
+
backgroundColorItem && items[0].items.push(backgroundColorItem);
|
|
547
|
+
items[0].items.push(...mergeSplitCellItems);
|
|
548
|
+
items[1].items.push(insertColumnItem);
|
|
549
|
+
items[1].items.push(insertRowItem);
|
|
550
|
+
items[1].items.push(clearCellsItem);
|
|
551
|
+
items[1].items.push(deleteColumnItem);
|
|
552
|
+
items[1].items.push(deleteRowItem);
|
|
553
|
+
|
|
554
|
+
return items;
|
|
307
555
|
};
|
|
308
556
|
|
|
309
557
|
private onMenuItemActivated = ({ item }: { item: DropdownItem }) => {
|
|
@@ -53,4 +53,24 @@ export const tablePopupStyles = css`
|
|
|
53
53
|
color: ${token('color.icon', N90)};
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
|
+
|
|
57
|
+
.${ClassName.CONTEXTUAL_MENU_ICON_SMALL} {
|
|
58
|
+
display: flex;
|
|
59
|
+
|
|
60
|
+
&::before {
|
|
61
|
+
content: '';
|
|
62
|
+
display: block;
|
|
63
|
+
border: 1px solid ${tableBackgroundBorderColor};
|
|
64
|
+
border-radius: ${token('border.radius', '3px')};
|
|
65
|
+
width: 14px;
|
|
66
|
+
height: 14px;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
&::after {
|
|
70
|
+
content: '›';
|
|
71
|
+
margin-left: ${token('space.050', '4px')};
|
|
72
|
+
line-height: 14px;
|
|
73
|
+
color: ${token('color.icon', N90)};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
56
76
|
`;
|
package/src/ui/consts.ts
CHANGED
|
@@ -131,6 +131,11 @@ export const TABLE_SNAP_GAP = 9;
|
|
|
131
131
|
export const TABLE_HIGHLIGHT_GAP = 10;
|
|
132
132
|
export const TABLE_HIGHLIGHT_TOLERANCE = 2;
|
|
133
133
|
export const STICKY_HEADER_TOGGLE_TOLERANCE_MS = 5;
|
|
134
|
+
// This adjustment value represents a pixel amount by which the container width needs to be adjusted when determining
|
|
135
|
+
// which guidelines are visible and most importantly CAN BE snapped too within the view. This value can be affected by
|
|
136
|
+
// table margins and padding. For example a guideline at 1800px and the view at 1860px wide, means the guidelines is visible
|
|
137
|
+
// BUT it cannot be snapped to during resize due to padding being applied to the resizer wrapper. This accommodates that difference.
|
|
138
|
+
export const TABLE_GUIDELINE_VISIBLE_ADJUSTMENT = -68;
|
|
134
139
|
|
|
135
140
|
export const dragMenuDropdownWidth = 240;
|
|
136
141
|
export const dragTableInsertColumnButtonSize = 16;
|