@atlaskit/editor-plugin-table 7.13.4 → 7.14.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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @atlaskit/editor-plugin-table
2
2
 
3
+ ## 7.14.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#99771](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/99771)
8
+ [`3cd9b2d8ae80`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/3cd9b2d8ae80) -
9
+ [ux] ED-22923 Tables - Added alignment toolbat button
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies
14
+
3
15
  ## 7.13.4
4
16
 
5
17
  ### Patch Changes
@@ -18,6 +18,9 @@
18
18
  "../src/**/test.*"
19
19
  ],
20
20
  "references": [
21
+ {
22
+ "path": "../../../design-system/button/afm-cc/tsconfig.json"
23
+ },
21
24
  {
22
25
  "path": "../../custom-steps/afm-cc/tsconfig.json"
23
26
  },
@@ -5,7 +5,8 @@ var _typeof = require("@babel/runtime/helpers/typeof");
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.getToolbarMenuConfig = exports.getToolbarConfig = exports.getToolbarCellOptionsConfig = exports.getLockBtnConfig = exports.getDistributeConfig = exports.getClosestSelectionRect = exports.getClosestSelectionOrTableRect = void 0;
8
+ exports.getToolbarMenuConfig = exports.getToolbarConfig = exports.getToolbarCellOptionsConfig = exports.getLockBtnConfig = exports.getDistributeConfig = exports.getClosestSelectionRect = exports.getClosestSelectionOrTableRect = exports.getAlignmentOptionsConfig = void 0;
9
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
10
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
11
  var _react = require("@emotion/react");
11
12
  var _customSteps = require("@atlaskit/custom-steps");
@@ -19,6 +20,8 @@ var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
19
20
  var _shortcut = require("@atlaskit/editor-shared-styles/shortcut");
20
21
  var _tableMap = require("@atlaskit/editor-tables/table-map");
21
22
  var _utils3 = require("@atlaskit/editor-tables/utils");
23
+ var _alignImageCenter = _interopRequireDefault(require("@atlaskit/icon/glyph/editor/align-image-center"));
24
+ var _alignImageLeft = _interopRequireDefault(require("@atlaskit/icon/glyph/editor/align-image-left"));
22
25
  var _layoutThreeEqual = _interopRequireDefault(require("@atlaskit/icon/glyph/editor/layout-three-equal"));
23
26
  var _remove = _interopRequireDefault(require("@atlaskit/icon/glyph/editor/remove"));
24
27
  var _preferences = _interopRequireDefault(require("@atlaskit/icon/glyph/preferences"));
@@ -31,6 +34,7 @@ var _resizeState = require("./pm-plugins/table-resizing/utils/resize-state");
31
34
  var _tableWidth = require("./pm-plugins/table-width");
32
35
  var _transforms = require("./transforms");
33
36
  var _types = require("./types");
37
+ var _FloatingAlignmentButtons = require("./ui/FloatingAlignmentButtons/FloatingAlignmentButtons");
34
38
  var _icons = require("./ui/icons");
35
39
  var _utils4 = require("./utils");
36
40
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
@@ -324,6 +328,8 @@ var getToolbarConfig = exports.getToolbarConfig = function getToolbarConfig(getE
324
328
  if (tableObject && pluginState.editorHasFocus && !isWidthResizing) {
325
329
  var nodeType = state.schema.nodes.table;
326
330
  var menu = getToolbarMenuConfig(config, pluginState, intl, editorAnalyticsAPI);
331
+ var alignmentMenu;
332
+ alignmentMenu = (0, _platformFeatureFlags.getBooleanFF)('platform.editor.table.allow-table-alignment') ? getAlignmentOptionsConfig(pluginState, intl, editorAnalyticsAPI) : [];
327
333
  var cellItems;
328
334
  cellItems = pluginState.isDragAndDropEnabled ? [] : getCellItems(state, getEditorView(), intl, getEditorContainerWidth, editorAnalyticsAPI, options === null || options === void 0 ? void 0 : options.isTableScalingEnabled);
329
335
  var columnSettingsItems;
@@ -380,7 +386,7 @@ var getToolbarConfig = exports.getToolbarConfig = function getToolbarConfig(getE
380
386
  },
381
387
  zIndex: _editorSharedStyles.akEditorFloatingPanelZIndex + 1,
382
388
  // Place the context menu slightly above the others
383
- items: [menu, separator(menu.hidden)].concat((0, _toConsumableArray2.default)(cellItems), (0, _toConsumableArray2.default)(columnSettingsItems), colorPicker, [{
389
+ items: [menu, separator(menu.hidden)].concat((0, _toConsumableArray2.default)(alignmentMenu), [separator(alignmentMenu.length === 0)], (0, _toConsumableArray2.default)(cellItems), (0, _toConsumableArray2.default)(columnSettingsItems), colorPicker, [{
384
390
  type: 'extensions-placeholder',
385
391
  separator: 'end'
386
392
  }, {
@@ -586,4 +592,65 @@ var highlightColumnsHandler = function highlightColumnsHandler(state, dispatch)
586
592
  return true;
587
593
  }
588
594
  return false;
595
+ };
596
+ var getAlignmentOptionsConfig = exports.getAlignmentOptionsConfig = function getAlignmentOptionsConfig(state, _ref6, editorAnalyticsAPI) {
597
+ var formatMessage = _ref6.formatMessage;
598
+ var alignmentIcons = [{
599
+ id: 'editor.table.alignLeft',
600
+ value: 'align-start',
601
+ icon: _alignImageLeft.default
602
+ }, {
603
+ id: 'editor.table.alignCenter',
604
+ value: 'center',
605
+ icon: _alignImageCenter.default
606
+ }];
607
+
608
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
609
+ var layoutToMessages = {
610
+ center: _messages.tableMessages.alignTableCenter,
611
+ 'align-start': _messages.tableMessages.alignTableLeft
612
+ };
613
+ var alignmentButtons = alignmentIcons.map(function (alignmentIcon) {
614
+ var id = alignmentIcon.id,
615
+ value = alignmentIcon.value,
616
+ icon = alignmentIcon.icon;
617
+ return {
618
+ id: id,
619
+ type: 'button',
620
+ icon: icon,
621
+ title: formatMessage(layoutToMessages[value]),
622
+ selected: false,
623
+ // TODO - get the correct selected state based on the selected layout attr
624
+ onClick: makeAlignment()
625
+ };
626
+ });
627
+ var alignmentOptions = {
628
+ render: function render(props) {
629
+ return (0, _react.jsx)(_FloatingAlignmentButtons.FloatingAlignmentButtons, (0, _extends2.default)({
630
+ alignmentButtons: alignmentButtons
631
+ }, props));
632
+ },
633
+ width: 60,
634
+ height: 32
635
+ };
636
+ var alignmentToolbarItem = [{
637
+ id: 'table-layout',
638
+ testId: 'table-layout-dropdown',
639
+ type: 'dropdown',
640
+ options: alignmentOptions,
641
+ title: formatMessage(_messages.tableMessages.tableAlignmentOptions),
642
+ // TODO - get the correct title based on the selected layout attr
643
+ icon: _alignImageCenter.default // TODO - get the correct icon based on the selected layout attr
644
+ }];
645
+ return alignmentToolbarItem;
646
+ };
647
+ var makeAlignment = function makeAlignment() {
648
+ return function (state, dispatch) {
649
+ var tableObject = (0, _utils3.findTable)(state.selection);
650
+ if (!tableObject || !dispatch) {
651
+ return false;
652
+ }
653
+ // TODO Add alignment logic here
654
+ return true;
655
+ };
589
656
  };
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FloatingAlignmentButtons = void 0;
7
+ var _react = require("@emotion/react");
8
+ var _button = require("@atlaskit/button");
9
+ var _ui = require("@atlaskit/editor-common/ui");
10
+ var _primitives = require("@atlaskit/primitives");
11
+ /** @jsx jsx */
12
+
13
+ var containerStyles = (0, _primitives.xcss)({
14
+ marginLeft: 'space.100'
15
+ });
16
+ var FloatingAlignmentButtons = exports.FloatingAlignmentButtons = function FloatingAlignmentButtons(_ref) {
17
+ var alignmentButtons = _ref.alignmentButtons,
18
+ dispatchCommand = _ref.dispatchCommand;
19
+ return (0, _react.jsx)(_primitives.Box, {
20
+ xcss: containerStyles
21
+ }, (0, _react.jsx)(_button.ButtonGroup, null, alignmentButtons.map(function (item, idx) {
22
+ switch (item.type) {
23
+ case 'separator':
24
+ return (0, _react.jsx)(_ui.FloatingToolbarSeparator, {
25
+ key: idx
26
+ });
27
+ case 'button':
28
+ var ButtonIcon = item.icon;
29
+ return (0, _react.jsx)(_ui.FloatingToolbarButton, {
30
+ key: idx,
31
+ icon: item.icon ? (0, _react.jsx)(ButtonIcon, {
32
+ label: item.title
33
+ }) : undefined,
34
+ title: item.title,
35
+ selected: item.selected,
36
+ disabled: item.disabled,
37
+ onClick: function onClick() {
38
+ dispatchCommand(item.onClick);
39
+ }
40
+ });
41
+ }
42
+ })));
43
+ };
@@ -1,3 +1,4 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
1
2
  /** @jsx jsx */
2
3
  import { jsx } from '@emotion/react';
3
4
  import { TableSortOrder as SortOrder } from '@atlaskit/custom-steps';
@@ -11,6 +12,8 @@ import { akEditorFloatingPanelZIndex } from '@atlaskit/editor-shared-styles';
11
12
  import { shortcutStyle } from '@atlaskit/editor-shared-styles/shortcut';
12
13
  import { Rect, TableMap } from '@atlaskit/editor-tables/table-map';
13
14
  import { findCellRectClosestToPos, findTable, getSelectionRect, isSelectionType, splitCell } from '@atlaskit/editor-tables/utils';
15
+ import EditorAlignImageCenter from '@atlaskit/icon/glyph/editor/align-image-center';
16
+ import EditorAlignImageLeft from '@atlaskit/icon/glyph/editor/align-image-left';
14
17
  import DistributeColumnIcon from '@atlaskit/icon/glyph/editor/layout-three-equal';
15
18
  import RemoveIcon from '@atlaskit/icon/glyph/editor/remove';
16
19
  import TableOptionsIcon from '@atlaskit/icon/glyph/preferences';
@@ -23,6 +26,7 @@ import { getNewResizeStateFromSelectedColumns } from './pm-plugins/table-resizin
23
26
  import { pluginKey as tableWidthPluginKey } from './pm-plugins/table-width';
24
27
  import { canMergeCells } from './transforms';
25
28
  import { TableCssClassName } from './types';
29
+ import { FloatingAlignmentButtons } from './ui/FloatingAlignmentButtons/FloatingAlignmentButtons';
26
30
  import { DisplayModeIcon } from './ui/icons';
27
31
  import { getMergedCellsPositions, getSelectedColumnIndexes, getSelectedRowIndexes, isTableNested } from './utils';
28
32
  export const getToolbarMenuConfig = (config, state, {
@@ -310,6 +314,8 @@ export const getToolbarConfig = (getEditorContainerWidth, editorAnalyticsAPI, ge
310
314
  if (tableObject && pluginState.editorHasFocus && !isWidthResizing) {
311
315
  const nodeType = state.schema.nodes.table;
312
316
  const menu = getToolbarMenuConfig(config, pluginState, intl, editorAnalyticsAPI);
317
+ let alignmentMenu;
318
+ alignmentMenu = getBooleanFF('platform.editor.table.allow-table-alignment') ? getAlignmentOptionsConfig(pluginState, intl, editorAnalyticsAPI) : [];
313
319
  let cellItems;
314
320
  cellItems = pluginState.isDragAndDropEnabled ? [] : getCellItems(state, getEditorView(), intl, getEditorContainerWidth, editorAnalyticsAPI, options === null || options === void 0 ? void 0 : options.isTableScalingEnabled);
315
321
  let columnSettingsItems;
@@ -360,7 +366,7 @@ export const getToolbarConfig = (getEditorContainerWidth, editorAnalyticsAPI, ge
360
366
  },
361
367
  zIndex: akEditorFloatingPanelZIndex + 1,
362
368
  // Place the context menu slightly above the others
363
- items: [menu, separator(menu.hidden), ...cellItems, ...columnSettingsItems, ...colorPicker, {
369
+ items: [menu, separator(menu.hidden), ...alignmentMenu, separator(alignmentMenu.length === 0), ...cellItems, ...columnSettingsItems, ...colorPicker, {
364
370
  type: 'extensions-placeholder',
365
371
  separator: 'end'
366
372
  }, {
@@ -553,4 +559,68 @@ const highlightColumnsHandler = (state, dispatch) => {
553
559
  return true;
554
560
  }
555
561
  return false;
562
+ };
563
+ export const getAlignmentOptionsConfig = (state, {
564
+ formatMessage
565
+ }, editorAnalyticsAPI) => {
566
+ const alignmentIcons = [{
567
+ id: 'editor.table.alignLeft',
568
+ value: 'align-start',
569
+ icon: EditorAlignImageLeft
570
+ }, {
571
+ id: 'editor.table.alignCenter',
572
+ value: 'center',
573
+ icon: EditorAlignImageCenter
574
+ }];
575
+
576
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
577
+ const layoutToMessages = {
578
+ center: messages.alignTableCenter,
579
+ 'align-start': messages.alignTableLeft
580
+ };
581
+ const alignmentButtons = alignmentIcons.map(alignmentIcon => {
582
+ const {
583
+ id,
584
+ value,
585
+ icon
586
+ } = alignmentIcon;
587
+ return {
588
+ id: id,
589
+ type: 'button',
590
+ icon: icon,
591
+ title: formatMessage(layoutToMessages[value]),
592
+ selected: false,
593
+ // TODO - get the correct selected state based on the selected layout attr
594
+ onClick: makeAlignment()
595
+ };
596
+ });
597
+ const alignmentOptions = {
598
+ render: props => {
599
+ return jsx(FloatingAlignmentButtons, _extends({
600
+ alignmentButtons: alignmentButtons
601
+ }, props));
602
+ },
603
+ width: 60,
604
+ height: 32
605
+ };
606
+ const alignmentToolbarItem = [{
607
+ id: 'table-layout',
608
+ testId: 'table-layout-dropdown',
609
+ type: 'dropdown',
610
+ options: alignmentOptions,
611
+ title: formatMessage(messages.tableAlignmentOptions),
612
+ // TODO - get the correct title based on the selected layout attr
613
+ icon: EditorAlignImageCenter // TODO - get the correct icon based on the selected layout attr
614
+ }];
615
+ return alignmentToolbarItem;
616
+ };
617
+ const makeAlignment = () => {
618
+ return (state, dispatch) => {
619
+ const tableObject = findTable(state.selection);
620
+ if (!tableObject || !dispatch) {
621
+ return false;
622
+ }
623
+ // TODO Add alignment logic here
624
+ return true;
625
+ };
556
626
  };
@@ -0,0 +1,37 @@
1
+ /** @jsx jsx */
2
+ import { jsx } from '@emotion/react';
3
+ import { ButtonGroup } from '@atlaskit/button';
4
+ import { FloatingToolbarButton as Button, FloatingToolbarSeparator } from '@atlaskit/editor-common/ui';
5
+ import { Box, xcss } from '@atlaskit/primitives';
6
+ const containerStyles = xcss({
7
+ marginLeft: 'space.100'
8
+ });
9
+ export const FloatingAlignmentButtons = ({
10
+ alignmentButtons,
11
+ dispatchCommand
12
+ }) => {
13
+ return jsx(Box, {
14
+ xcss: containerStyles
15
+ }, jsx(ButtonGroup, null, alignmentButtons.map((item, idx) => {
16
+ switch (item.type) {
17
+ case 'separator':
18
+ return jsx(FloatingToolbarSeparator, {
19
+ key: idx
20
+ });
21
+ case 'button':
22
+ const ButtonIcon = item.icon;
23
+ return jsx(Button, {
24
+ key: idx,
25
+ icon: item.icon ? jsx(ButtonIcon, {
26
+ label: item.title
27
+ }) : undefined,
28
+ title: item.title,
29
+ selected: item.selected,
30
+ disabled: item.disabled,
31
+ onClick: () => {
32
+ dispatchCommand(item.onClick);
33
+ }
34
+ });
35
+ }
36
+ })));
37
+ };
@@ -1,3 +1,4 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
1
2
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
3
  /** @jsx jsx */
3
4
  import { jsx } from '@emotion/react';
@@ -12,6 +13,8 @@ import { akEditorFloatingPanelZIndex } from '@atlaskit/editor-shared-styles';
12
13
  import { shortcutStyle } from '@atlaskit/editor-shared-styles/shortcut';
13
14
  import { Rect, TableMap } from '@atlaskit/editor-tables/table-map';
14
15
  import { findCellRectClosestToPos, findTable, getSelectionRect, isSelectionType, splitCell } from '@atlaskit/editor-tables/utils';
16
+ import EditorAlignImageCenter from '@atlaskit/icon/glyph/editor/align-image-center';
17
+ import EditorAlignImageLeft from '@atlaskit/icon/glyph/editor/align-image-left';
15
18
  import DistributeColumnIcon from '@atlaskit/icon/glyph/editor/layout-three-equal';
16
19
  import RemoveIcon from '@atlaskit/icon/glyph/editor/remove';
17
20
  import TableOptionsIcon from '@atlaskit/icon/glyph/preferences';
@@ -24,6 +27,7 @@ import { getNewResizeStateFromSelectedColumns } from './pm-plugins/table-resizin
24
27
  import { pluginKey as tableWidthPluginKey } from './pm-plugins/table-width';
25
28
  import { canMergeCells } from './transforms';
26
29
  import { TableCssClassName } from './types';
30
+ import { FloatingAlignmentButtons } from './ui/FloatingAlignmentButtons/FloatingAlignmentButtons';
27
31
  import { DisplayModeIcon } from './ui/icons';
28
32
  import { getMergedCellsPositions, getSelectedColumnIndexes, getSelectedRowIndexes, isTableNested } from './utils';
29
33
  export var getToolbarMenuConfig = function getToolbarMenuConfig(config, state, _ref, editorAnalyticsAPI) {
@@ -313,6 +317,8 @@ export var getToolbarConfig = function getToolbarConfig(getEditorContainerWidth,
313
317
  if (tableObject && pluginState.editorHasFocus && !isWidthResizing) {
314
318
  var nodeType = state.schema.nodes.table;
315
319
  var menu = getToolbarMenuConfig(config, pluginState, intl, editorAnalyticsAPI);
320
+ var alignmentMenu;
321
+ alignmentMenu = getBooleanFF('platform.editor.table.allow-table-alignment') ? getAlignmentOptionsConfig(pluginState, intl, editorAnalyticsAPI) : [];
316
322
  var cellItems;
317
323
  cellItems = pluginState.isDragAndDropEnabled ? [] : getCellItems(state, getEditorView(), intl, getEditorContainerWidth, editorAnalyticsAPI, options === null || options === void 0 ? void 0 : options.isTableScalingEnabled);
318
324
  var columnSettingsItems;
@@ -369,7 +375,7 @@ export var getToolbarConfig = function getToolbarConfig(getEditorContainerWidth,
369
375
  },
370
376
  zIndex: akEditorFloatingPanelZIndex + 1,
371
377
  // Place the context menu slightly above the others
372
- items: [menu, separator(menu.hidden)].concat(_toConsumableArray(cellItems), _toConsumableArray(columnSettingsItems), colorPicker, [{
378
+ items: [menu, separator(menu.hidden)].concat(_toConsumableArray(alignmentMenu), [separator(alignmentMenu.length === 0)], _toConsumableArray(cellItems), _toConsumableArray(columnSettingsItems), colorPicker, [{
373
379
  type: 'extensions-placeholder',
374
380
  separator: 'end'
375
381
  }, {
@@ -575,4 +581,65 @@ var highlightColumnsHandler = function highlightColumnsHandler(state, dispatch)
575
581
  return true;
576
582
  }
577
583
  return false;
584
+ };
585
+ export var getAlignmentOptionsConfig = function getAlignmentOptionsConfig(state, _ref6, editorAnalyticsAPI) {
586
+ var formatMessage = _ref6.formatMessage;
587
+ var alignmentIcons = [{
588
+ id: 'editor.table.alignLeft',
589
+ value: 'align-start',
590
+ icon: EditorAlignImageLeft
591
+ }, {
592
+ id: 'editor.table.alignCenter',
593
+ value: 'center',
594
+ icon: EditorAlignImageCenter
595
+ }];
596
+
597
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
598
+ var layoutToMessages = {
599
+ center: messages.alignTableCenter,
600
+ 'align-start': messages.alignTableLeft
601
+ };
602
+ var alignmentButtons = alignmentIcons.map(function (alignmentIcon) {
603
+ var id = alignmentIcon.id,
604
+ value = alignmentIcon.value,
605
+ icon = alignmentIcon.icon;
606
+ return {
607
+ id: id,
608
+ type: 'button',
609
+ icon: icon,
610
+ title: formatMessage(layoutToMessages[value]),
611
+ selected: false,
612
+ // TODO - get the correct selected state based on the selected layout attr
613
+ onClick: makeAlignment()
614
+ };
615
+ });
616
+ var alignmentOptions = {
617
+ render: function render(props) {
618
+ return jsx(FloatingAlignmentButtons, _extends({
619
+ alignmentButtons: alignmentButtons
620
+ }, props));
621
+ },
622
+ width: 60,
623
+ height: 32
624
+ };
625
+ var alignmentToolbarItem = [{
626
+ id: 'table-layout',
627
+ testId: 'table-layout-dropdown',
628
+ type: 'dropdown',
629
+ options: alignmentOptions,
630
+ title: formatMessage(messages.tableAlignmentOptions),
631
+ // TODO - get the correct title based on the selected layout attr
632
+ icon: EditorAlignImageCenter // TODO - get the correct icon based on the selected layout attr
633
+ }];
634
+ return alignmentToolbarItem;
635
+ };
636
+ var makeAlignment = function makeAlignment() {
637
+ return function (state, dispatch) {
638
+ var tableObject = findTable(state.selection);
639
+ if (!tableObject || !dispatch) {
640
+ return false;
641
+ }
642
+ // TODO Add alignment logic here
643
+ return true;
644
+ };
578
645
  };
@@ -0,0 +1,36 @@
1
+ /** @jsx jsx */
2
+ import { jsx } from '@emotion/react';
3
+ import { ButtonGroup } from '@atlaskit/button';
4
+ import { FloatingToolbarButton as Button, FloatingToolbarSeparator } from '@atlaskit/editor-common/ui';
5
+ import { Box, xcss } from '@atlaskit/primitives';
6
+ var containerStyles = xcss({
7
+ marginLeft: 'space.100'
8
+ });
9
+ export var FloatingAlignmentButtons = function FloatingAlignmentButtons(_ref) {
10
+ var alignmentButtons = _ref.alignmentButtons,
11
+ dispatchCommand = _ref.dispatchCommand;
12
+ return jsx(Box, {
13
+ xcss: containerStyles
14
+ }, jsx(ButtonGroup, null, alignmentButtons.map(function (item, idx) {
15
+ switch (item.type) {
16
+ case 'separator':
17
+ return jsx(FloatingToolbarSeparator, {
18
+ key: idx
19
+ });
20
+ case 'button':
21
+ var ButtonIcon = item.icon;
22
+ return jsx(Button, {
23
+ key: idx,
24
+ icon: item.icon ? jsx(ButtonIcon, {
25
+ label: item.title
26
+ }) : undefined,
27
+ title: item.title,
28
+ selected: item.selected,
29
+ disabled: item.disabled,
30
+ onClick: function onClick() {
31
+ dispatchCommand(item.onClick);
32
+ }
33
+ });
34
+ }
35
+ })));
36
+ };
@@ -12,3 +12,4 @@ export declare const getClosestSelectionOrTableRect: (state: EditorState) => Rec
12
12
  export declare const getToolbarConfig: (getEditorContainerWidth: GetEditorContainerWidth, editorAnalyticsAPI: EditorAnalyticsAPI | undefined | null, getEditorFeatureFlags: GetEditorFeatureFlags, getEditorView: () => EditorView | null, options?: TablePluginOptions) => (config: PluginConfig) => FloatingToolbarHandler;
13
13
  export declare const getLockBtnConfig: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined | null) => Command;
14
14
  export declare const getDistributeConfig: (getEditorContainerWidth: GetEditorContainerWidth, editorAnalyticsAPI: EditorAnalyticsAPI | undefined | null, isTableScalingEnabled?: boolean) => Command;
15
+ export declare const getAlignmentOptionsConfig: (state: ToolbarMenuState, { formatMessage }: ToolbarMenuContext, editorAnalyticsAPI: EditorAnalyticsAPI | undefined | null) => Array<FloatingToolbarDropdown<Command>>;
@@ -0,0 +1,9 @@
1
+ /** @jsx jsx */
2
+ import { jsx } from '@emotion/react';
3
+ import type { Command, FloatingToolbarItem } from '@atlaskit/editor-common/types';
4
+ type Props = {
5
+ alignmentButtons: FloatingToolbarItem<Command>[];
6
+ dispatchCommand: (command: Command) => void;
7
+ };
8
+ export declare const FloatingAlignmentButtons: ({ alignmentButtons, dispatchCommand, }: Props) => jsx.JSX.Element;
9
+ export {};
@@ -12,3 +12,4 @@ export declare const getClosestSelectionOrTableRect: (state: EditorState) => Rec
12
12
  export declare const getToolbarConfig: (getEditorContainerWidth: GetEditorContainerWidth, editorAnalyticsAPI: EditorAnalyticsAPI | undefined | null, getEditorFeatureFlags: GetEditorFeatureFlags, getEditorView: () => EditorView | null, options?: TablePluginOptions) => (config: PluginConfig) => FloatingToolbarHandler;
13
13
  export declare const getLockBtnConfig: (editorAnalyticsAPI: EditorAnalyticsAPI | undefined | null) => Command;
14
14
  export declare const getDistributeConfig: (getEditorContainerWidth: GetEditorContainerWidth, editorAnalyticsAPI: EditorAnalyticsAPI | undefined | null, isTableScalingEnabled?: boolean) => Command;
15
+ export declare const getAlignmentOptionsConfig: (state: ToolbarMenuState, { formatMessage }: ToolbarMenuContext, editorAnalyticsAPI: EditorAnalyticsAPI | undefined | null) => Array<FloatingToolbarDropdown<Command>>;
@@ -0,0 +1,9 @@
1
+ /** @jsx jsx */
2
+ import { jsx } from '@emotion/react';
3
+ import type { Command, FloatingToolbarItem } from '@atlaskit/editor-common/types';
4
+ type Props = {
5
+ alignmentButtons: FloatingToolbarItem<Command>[];
6
+ dispatchCommand: (command: Command) => void;
7
+ };
8
+ export declare const FloatingAlignmentButtons: ({ alignmentButtons, dispatchCommand, }: Props) => jsx.JSX.Element;
9
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-table",
3
- "version": "7.13.4",
3
+ "version": "7.14.0",
4
4
  "description": "Table plugin for the @atlaskit/editor",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -29,8 +29,9 @@
29
29
  },
30
30
  "dependencies": {
31
31
  "@atlaskit/adf-schema": "^36.1.0",
32
+ "@atlaskit/button": "^17.14.0",
32
33
  "@atlaskit/custom-steps": "^0.1.0",
33
- "@atlaskit/editor-common": "^79.4.0",
34
+ "@atlaskit/editor-common": "^79.5.0",
34
35
  "@atlaskit/editor-palette": "1.6.0",
35
36
  "@atlaskit/editor-plugin-accessibility-utils": "^1.1.0",
36
37
  "@atlaskit/editor-plugin-analytics": "^1.1.0",
@@ -138,6 +139,9 @@
138
139
  },
139
140
  "platform.editor.table.live-pages-sorting_4malx": {
140
141
  "type": "boolean"
142
+ },
143
+ "platform.editor.table.allow-table-alignment": {
144
+ "type": "boolean"
141
145
  }
142
146
  }
143
147
  }
package/src/toolbar.tsx CHANGED
@@ -18,6 +18,7 @@ import type {
18
18
  Command,
19
19
  CommandDispatch,
20
20
  ConfirmDialogOptions,
21
+ DropdownOptions,
21
22
  DropdownOptionT,
22
23
  FloatingToolbarDropdown,
23
24
  FloatingToolbarHandler,
@@ -49,6 +50,8 @@ import {
49
50
  isSelectionType,
50
51
  splitCell,
51
52
  } from '@atlaskit/editor-tables/utils';
53
+ import EditorAlignImageCenter from '@atlaskit/icon/glyph/editor/align-image-center';
54
+ import EditorAlignImageLeft from '@atlaskit/icon/glyph/editor/align-image-left';
52
55
  import DistributeColumnIcon from '@atlaskit/icon/glyph/editor/layout-three-equal';
53
56
  import RemoveIcon from '@atlaskit/icon/glyph/editor/remove';
54
57
  import TableOptionsIcon from '@atlaskit/icon/glyph/preferences';
@@ -93,6 +96,7 @@ import type {
93
96
  ToolbarMenuState,
94
97
  } from './types';
95
98
  import { TableCssClassName } from './types';
99
+ import { FloatingAlignmentButtons } from './ui/FloatingAlignmentButtons/FloatingAlignmentButtons';
96
100
  import { DisplayModeIcon } from './ui/icons';
97
101
  import {
98
102
  getMergedCellsPositions,
@@ -474,6 +478,14 @@ export const getToolbarConfig =
474
478
  editorAnalyticsAPI,
475
479
  );
476
480
 
481
+ let alignmentMenu: Array<FloatingToolbarItem<Command>>;
482
+
483
+ alignmentMenu = getBooleanFF(
484
+ 'platform.editor.table.allow-table-alignment',
485
+ )
486
+ ? getAlignmentOptionsConfig(pluginState, intl, editorAnalyticsAPI)
487
+ : [];
488
+
477
489
  let cellItems: Array<FloatingToolbarItem<Command>>;
478
490
  cellItems = pluginState.isDragAndDropEnabled
479
491
  ? []
@@ -568,6 +580,8 @@ export const getToolbarConfig =
568
580
  items: [
569
581
  menu,
570
582
  separator(menu.hidden),
583
+ ...alignmentMenu,
584
+ separator(alignmentMenu.length === 0),
571
585
  ...cellItems,
572
586
  ...columnSettingsItems,
573
587
  ...colorPicker,
@@ -871,3 +885,86 @@ const highlightColumnsHandler = (
871
885
  }
872
886
  return false;
873
887
  };
888
+
889
+ export const getAlignmentOptionsConfig = (
890
+ state: ToolbarMenuState,
891
+ { formatMessage }: ToolbarMenuContext,
892
+ editorAnalyticsAPI: EditorAnalyticsAPI | undefined | null,
893
+ ): Array<FloatingToolbarDropdown<Command>> => {
894
+ type AlignmentIcon = {
895
+ id?: string;
896
+ value: string;
897
+ icon: React.ComponentClass<any>;
898
+ };
899
+
900
+ const alignmentIcons: AlignmentIcon[] = [
901
+ {
902
+ id: 'editor.table.alignLeft',
903
+ value: 'align-start',
904
+ icon: EditorAlignImageLeft,
905
+ },
906
+ {
907
+ id: 'editor.table.alignCenter',
908
+ value: 'center',
909
+ icon: EditorAlignImageCenter,
910
+ },
911
+ ];
912
+
913
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
914
+ const layoutToMessages: Record<string, any> = {
915
+ center: messages.alignTableCenter,
916
+ 'align-start': messages.alignTableLeft,
917
+ };
918
+
919
+ const alignmentButtons = alignmentIcons.map<FloatingToolbarItem<Command>>(
920
+ (alignmentIcon) => {
921
+ const { id, value, icon } = alignmentIcon;
922
+ return {
923
+ id: id,
924
+ type: 'button',
925
+ icon: icon,
926
+ title: formatMessage(layoutToMessages[value]),
927
+ selected: false, // TODO - get the correct selected state based on the selected layout attr
928
+ onClick: makeAlignment(),
929
+ };
930
+ },
931
+ );
932
+
933
+ const alignmentOptions: DropdownOptions<Command> = {
934
+ render: (props) => {
935
+ return (
936
+ <FloatingAlignmentButtons
937
+ alignmentButtons={alignmentButtons}
938
+ {...props}
939
+ />
940
+ );
941
+ },
942
+ width: 60,
943
+ height: 32,
944
+ };
945
+
946
+ const alignmentToolbarItem: Array<FloatingToolbarDropdown<Command>> = [
947
+ {
948
+ id: 'table-layout',
949
+ testId: 'table-layout-dropdown',
950
+ type: 'dropdown',
951
+ options: alignmentOptions,
952
+ title: formatMessage(messages.tableAlignmentOptions), // TODO - get the correct title based on the selected layout attr
953
+ icon: EditorAlignImageCenter, // TODO - get the correct icon based on the selected layout attr
954
+ },
955
+ ];
956
+
957
+ return alignmentToolbarItem;
958
+ };
959
+
960
+ const makeAlignment = (): Command => {
961
+ return (state, dispatch) => {
962
+ const tableObject = findTable(state.selection);
963
+
964
+ if (!tableObject || !dispatch) {
965
+ return false;
966
+ }
967
+ // TODO Add alignment logic here
968
+ return true;
969
+ };
970
+ };
@@ -0,0 +1,56 @@
1
+ /** @jsx jsx */
2
+ import { jsx } from '@emotion/react';
3
+
4
+ import { ButtonGroup } from '@atlaskit/button';
5
+ import type {
6
+ Command,
7
+ FloatingToolbarItem,
8
+ } from '@atlaskit/editor-common/types';
9
+ import {
10
+ FloatingToolbarButton as Button,
11
+ FloatingToolbarSeparator,
12
+ } from '@atlaskit/editor-common/ui';
13
+ import { Box, xcss } from '@atlaskit/primitives';
14
+
15
+ const containerStyles = xcss({
16
+ marginLeft: 'space.100',
17
+ });
18
+
19
+ type Props = {
20
+ alignmentButtons: FloatingToolbarItem<Command>[];
21
+ dispatchCommand: (command: Command) => void;
22
+ };
23
+
24
+ export const FloatingAlignmentButtons = ({
25
+ alignmentButtons,
26
+ dispatchCommand,
27
+ }: Props) => {
28
+ return (
29
+ <Box xcss={containerStyles}>
30
+ <ButtonGroup>
31
+ {alignmentButtons.map((item, idx) => {
32
+ switch (item.type) {
33
+ case 'separator':
34
+ return <FloatingToolbarSeparator key={idx} />;
35
+ case 'button':
36
+ const ButtonIcon = item.icon as React.ComponentClass<any>;
37
+ return (
38
+ <Button
39
+ key={idx}
40
+ icon={
41
+ item.icon ? <ButtonIcon label={item.title} /> : undefined
42
+ }
43
+ title={item.title}
44
+ selected={item.selected}
45
+ disabled={item.disabled}
46
+ onClick={() => {
47
+ dispatchCommand(item.onClick);
48
+ }}
49
+ />
50
+ );
51
+ }
52
+ })}
53
+ </ButtonGroup>
54
+ </Box>
55
+ );
56
+ };
package/tsconfig.app.json CHANGED
@@ -33,6 +33,9 @@
33
33
  "outDir": "../../../tsDist/@atlaskit__editor-plugin-table/app"
34
34
  },
35
35
  "references": [
36
+ {
37
+ "path": "../../design-system/button/tsconfig.app.json"
38
+ },
36
39
  {
37
40
  "path": "../custom-steps/tsconfig.app.json"
38
41
  },