@atlaskit/editor-plugin-layout 10.3.4 → 10.4.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.
Files changed (67) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cjs/layoutPlugin.js +8 -0
  3. package/dist/cjs/pm-plugins/actions.js +158 -8
  4. package/dist/cjs/pm-plugins/column-resize-divider.js +7 -9
  5. package/dist/cjs/pm-plugins/consts.js +4 -1
  6. package/dist/cjs/pm-plugins/utils/redistribute-proportionally.js +141 -0
  7. package/dist/cjs/ui/LayoutColumnMenu/DeleteColumnDropdownItem.js +42 -0
  8. package/dist/cjs/ui/LayoutColumnMenu/InsertColumnDropdownItem.js +69 -0
  9. package/dist/cjs/ui/LayoutColumnMenu/VerticalAlignDropdownItem.js +7 -9
  10. package/dist/cjs/ui/LayoutColumnMenu/VerticalAlignNestedMenu.js +11 -10
  11. package/dist/cjs/ui/LayoutColumnMenu/components.js +31 -0
  12. package/dist/cjs/ui/LayoutColumnMenu/index.js +39 -11
  13. package/dist/cjs/ui/LayoutColumnMenu/keys.js +14 -2
  14. package/dist/cjs/ui/LayoutColumnMenu/layoutColumnSelection.js +21 -0
  15. package/dist/cjs/ui/LayoutColumnMenu/useCurrentLayoutColumn.js +20 -0
  16. package/dist/es2019/layoutPlugin.js +9 -1
  17. package/dist/es2019/pm-plugins/actions.js +152 -1
  18. package/dist/es2019/pm-plugins/column-resize-divider.js +8 -9
  19. package/dist/es2019/pm-plugins/consts.js +3 -0
  20. package/dist/es2019/pm-plugins/utils/redistribute-proportionally.js +113 -0
  21. package/dist/es2019/ui/LayoutColumnMenu/DeleteColumnDropdownItem.js +37 -0
  22. package/dist/es2019/ui/LayoutColumnMenu/InsertColumnDropdownItem.js +64 -0
  23. package/dist/es2019/ui/LayoutColumnMenu/VerticalAlignDropdownItem.js +6 -11
  24. package/dist/es2019/ui/LayoutColumnMenu/VerticalAlignNestedMenu.js +7 -10
  25. package/dist/es2019/ui/LayoutColumnMenu/components.js +32 -1
  26. package/dist/es2019/ui/LayoutColumnMenu/index.js +34 -13
  27. package/dist/es2019/ui/LayoutColumnMenu/keys.js +17 -2
  28. package/dist/es2019/ui/LayoutColumnMenu/layoutColumnSelection.js +9 -0
  29. package/dist/es2019/ui/LayoutColumnMenu/useCurrentLayoutColumn.js +10 -0
  30. package/dist/esm/layoutPlugin.js +9 -1
  31. package/dist/esm/pm-plugins/actions.js +156 -7
  32. package/dist/esm/pm-plugins/column-resize-divider.js +8 -9
  33. package/dist/esm/pm-plugins/consts.js +3 -0
  34. package/dist/esm/pm-plugins/utils/redistribute-proportionally.js +134 -0
  35. package/dist/esm/ui/LayoutColumnMenu/DeleteColumnDropdownItem.js +35 -0
  36. package/dist/esm/ui/LayoutColumnMenu/InsertColumnDropdownItem.js +61 -0
  37. package/dist/esm/ui/LayoutColumnMenu/VerticalAlignDropdownItem.js +8 -10
  38. package/dist/esm/ui/LayoutColumnMenu/VerticalAlignNestedMenu.js +9 -9
  39. package/dist/esm/ui/LayoutColumnMenu/components.js +32 -1
  40. package/dist/esm/ui/LayoutColumnMenu/index.js +40 -13
  41. package/dist/esm/ui/LayoutColumnMenu/keys.js +13 -1
  42. package/dist/esm/ui/LayoutColumnMenu/layoutColumnSelection.js +15 -0
  43. package/dist/esm/ui/LayoutColumnMenu/useCurrentLayoutColumn.js +14 -0
  44. package/dist/types/layoutPluginType.d.ts +4 -2
  45. package/dist/types/pm-plugins/actions.d.ts +7 -0
  46. package/dist/types/pm-plugins/consts.d.ts +3 -0
  47. package/dist/types/pm-plugins/utils/redistribute-proportionally.d.ts +2 -0
  48. package/dist/types/ui/LayoutColumnMenu/DeleteColumnDropdownItem.d.ts +8 -0
  49. package/dist/types/ui/LayoutColumnMenu/InsertColumnDropdownItem.d.ts +10 -0
  50. package/dist/types/ui/LayoutColumnMenu/keys.d.ts +3 -0
  51. package/dist/types/ui/LayoutColumnMenu/layoutColumnSelection.d.ts +7 -0
  52. package/dist/types/ui/LayoutColumnMenu/useCurrentLayoutColumn.d.ts +5 -0
  53. package/dist/types-ts4.5/layoutPluginType.d.ts +4 -2
  54. package/dist/types-ts4.5/pm-plugins/actions.d.ts +7 -0
  55. package/dist/types-ts4.5/pm-plugins/consts.d.ts +3 -0
  56. package/dist/types-ts4.5/pm-plugins/utils/redistribute-proportionally.d.ts +2 -0
  57. package/dist/types-ts4.5/ui/LayoutColumnMenu/DeleteColumnDropdownItem.d.ts +8 -0
  58. package/dist/types-ts4.5/ui/LayoutColumnMenu/InsertColumnDropdownItem.d.ts +10 -0
  59. package/dist/types-ts4.5/ui/LayoutColumnMenu/keys.d.ts +3 -0
  60. package/dist/types-ts4.5/ui/LayoutColumnMenu/layoutColumnSelection.d.ts +7 -0
  61. package/dist/types-ts4.5/ui/LayoutColumnMenu/useCurrentLayoutColumn.d.ts +5 -0
  62. package/package.json +4 -4
  63. package/dist/cjs/ui/LayoutColumnMenu/useCurrentLayoutColumnValign.js +0 -22
  64. package/dist/es2019/ui/LayoutColumnMenu/useCurrentLayoutColumnValign.js +0 -14
  65. package/dist/esm/ui/LayoutColumnMenu/useCurrentLayoutColumnValign.js +0 -16
  66. package/dist/types/ui/LayoutColumnMenu/useCurrentLayoutColumnValign.d.ts +0 -11
  67. package/dist/types-ts4.5/ui/LayoutColumnMenu/useCurrentLayoutColumnValign.d.ts +0 -11
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @atlaskit/editor-plugin-layout
2
2
 
3
+ ## 10.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`6d95dce3d9a86`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/6d95dce3d9a86) -
8
+ Add deleteLayoutColumn command to editor-plugin-layout with proportional width redistribution and
9
+ analytics tracking (EDITOR-6669)
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies
14
+
15
+ ## 10.3.5
16
+
17
+ ### Patch Changes
18
+
19
+ - [`626fb6e8ce019`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/626fb6e8ce019) -
20
+ Wire layout column menu insert actions with proportional width redistribution.
21
+ - Updated dependencies
22
+
3
23
  ## 10.3.4
4
24
 
5
25
  ### Patch Changes
@@ -309,6 +309,14 @@ var layoutPlugin = exports.layoutPlugin = function layoutPlugin(_ref) {
309
309
  return _pluginKey.pluginKey.getState(editorState);
310
310
  },
311
311
  commands: {
312
+ deleteLayoutColumn: function deleteLayoutColumn(props) {
313
+ var _api$analytics4;
314
+ return (0, _actions.deleteLayoutColumn)(api === null || api === void 0 || (_api$analytics4 = api.analytics) === null || _api$analytics4 === void 0 ? void 0 : _api$analytics4.actions)(props);
315
+ },
316
+ insertLayoutColumn: function insertLayoutColumn(side) {
317
+ var _api$analytics5;
318
+ return (0, _actions.insertLayoutColumn)(side, api === null || api === void 0 || (_api$analytics5 = api.analytics) === null || _api$analytics5 === void 0 ? void 0 : _api$analytics5.actions);
319
+ },
312
320
  setLayoutColumnValign: _actions.setLayoutColumnValign,
313
321
  toggleLayoutColumnMenu: _actions.toggleLayoutColumnMenu
314
322
  }
@@ -4,9 +4,10 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.fixColumnStructure = exports.fixColumnSizes = exports.deleteActiveLayoutNode = exports.createMultiColumnLayoutSection = exports.createDefaultLayoutSection = exports.TWO_COL_LAYOUTS = exports.THREE_COL_LAYOUTS = exports.ONE_COL_LAYOUTS = void 0;
7
+ exports.fixColumnStructure = exports.fixColumnSizes = exports.deleteLayoutColumn = exports.deleteActiveLayoutNode = exports.createMultiColumnLayoutSection = exports.createDefaultLayoutSection = exports.TWO_COL_LAYOUTS = exports.THREE_COL_LAYOUTS = exports.ONE_COL_LAYOUTS = void 0;
8
8
  exports.forceSectionToPresetLayout = forceSectionToPresetLayout;
9
- exports.toggleLayoutColumnMenu = exports.setPresetLayout = exports.setLayoutColumnValign = exports.insertLayoutColumnsWithAnalytics = exports.insertLayoutColumns = exports.getSelectedLayout = exports.getPresetLayout = void 0;
9
+ exports.getEffectiveMaxLayoutColumns = getEffectiveMaxLayoutColumns;
10
+ exports.toggleLayoutColumnMenu = exports.setPresetLayout = exports.setLayoutColumnValign = exports.insertLayoutColumnsWithAnalytics = exports.insertLayoutColumns = exports.insertLayoutColumn = exports.getSelectedLayout = exports.getPresetLayout = void 0;
10
11
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
12
  var _analytics = require("@atlaskit/editor-common/analytics");
12
13
  var _editorAnalytics = require("@atlaskit/editor-common/editor-analytics");
@@ -19,6 +20,7 @@ var _expValEqualsNoExposure = require("@atlaskit/tmp-editor-statsig/exp-val-equa
19
20
  var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
20
21
  var _consts = require("./consts");
21
22
  var _pluginKey = require("./plugin-key");
23
+ var _redistributeProportionally = require("./utils/redistribute-proportionally");
22
24
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
23
25
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
24
26
  var ONE_COL_LAYOUTS = exports.ONE_COL_LAYOUTS = ['single'];
@@ -549,9 +551,102 @@ var formatLayoutName = function formatLayoutName(layout) {
549
551
  return _analytics.LAYOUT_TYPE.THREE_WITH_SIDEBARS;
550
552
  }
551
553
  };
554
+ /**
555
+ * Returns the active maximum layout column count for the current advanced layouts experiment state.
556
+ */
557
+ function getEffectiveMaxLayoutColumns() {
558
+ return (0, _experiments.editorExperiment)('advanced_layouts', true) ? _consts.MAX_LAYOUT_COLUMNS : _consts.MAX_STANDARD_LAYOUT_COLUMNS;
559
+ }
560
+ var getSelectedLayoutColumnInSection = function getSelectedLayoutColumnInSection(_ref4) {
561
+ var doc = _ref4.doc,
562
+ selection = _ref4.selection;
563
+ var _doc$type$schema$node = doc.type.schema.nodes,
564
+ layoutColumn = _doc$type$schema$node.layoutColumn,
565
+ layoutSection = _doc$type$schema$node.layoutSection;
566
+ if (!(selection instanceof _state.NodeSelection) || selection.node.type !== layoutColumn) {
567
+ return;
568
+ }
569
+ var $from = selection.$from;
570
+ if ($from.parent.type !== layoutSection) {
571
+ return;
572
+ }
573
+ var selectedColumnIndex = $from.index($from.depth);
574
+ var selectedColumnNode = selection.node;
575
+ var selectedColumnPos = selection.from;
576
+ var layoutSectionPos = $from.before($from.depth);
577
+ return {
578
+ layoutSectionNode: $from.parent,
579
+ layoutSectionPos: layoutSectionPos,
580
+ selectedColumnIndex: selectedColumnIndex,
581
+ selectedColumnNode: selectedColumnNode,
582
+ selectedColumnPos: selectedColumnPos
583
+ };
584
+ };
585
+ var insertLayoutColumnAt = function insertLayoutColumnAt(side, editorAnalyticsAPI) {
586
+ return function (_ref5) {
587
+ var tr = _ref5.tr;
588
+ if (!(0, _expValEqualsNoExposure.expValEqualsNoExposure)('platform_editor_layout_column_menu', 'isEnabled', true)) {
589
+ return null;
590
+ }
591
+ var selectedColumn = getSelectedLayoutColumnInSection(tr);
592
+ if (!selectedColumn) {
593
+ return null;
594
+ }
595
+ var layoutSectionNode = selectedColumn.layoutSectionNode,
596
+ layoutSectionPos = selectedColumn.layoutSectionPos,
597
+ selectedColumnIndex = selectedColumn.selectedColumnIndex;
598
+ if (layoutSectionNode.childCount >= getEffectiveMaxLayoutColumns()) {
599
+ return null;
600
+ }
601
+ var insertIndex = side === 'left' ? selectedColumnIndex : selectedColumnIndex + 1;
602
+ var existingWidths = (0, _utils.mapChildren)(layoutSectionNode, function (column) {
603
+ return column.attrs.width;
604
+ });
605
+ var redistributedWidths = (0, _redistributeProportionally.redistributeProportionally)(existingWidths, insertIndex, getEffectiveMaxLayoutColumns(), _consts.MIN_LAYOUT_COLUMN_WIDTH_PERCENT);
606
+ if (redistributedWidths === existingWidths) {
607
+ return null;
608
+ }
609
+ var layoutColumn = tr.doc.type.schema.nodes.layoutColumn;
610
+ var newColumn = layoutColumn.createAndFill({
611
+ width: redistributedWidths[insertIndex]
612
+ });
613
+ if (!newColumn) {
614
+ return null;
615
+ }
616
+ var updatedColumns = [];
617
+ layoutSectionNode.forEach(function (column, _offset, index) {
618
+ if (index === insertIndex) {
619
+ updatedColumns.push(newColumn);
620
+ }
621
+ updatedColumns.push(column);
622
+ });
623
+ if (insertIndex === layoutSectionNode.childCount) {
624
+ updatedColumns.push(newColumn);
625
+ }
626
+ var updatedLayoutSectionNode = layoutSectionNode.copy(_model.Fragment.fromArray(updatedColumns));
627
+ tr.replaceWith(layoutSectionPos + 1, layoutSectionPos + layoutSectionNode.nodeSize - 1, columnWidth(updatedLayoutSectionNode, tr.doc.type.schema, redistributedWidths));
628
+ editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent({
629
+ action: _analytics.ACTION.INSERTED,
630
+ actionSubject: _analytics.ACTION_SUBJECT.DOCUMENT,
631
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.LAYOUT_COLUMN,
632
+ attributes: {
633
+ columnCount: redistributedWidths.length,
634
+ inputMethod: _analytics.INPUT_METHOD.LAYOUT_COLUMN_MENU,
635
+ selectedIndex: selectedColumnIndex,
636
+ side: side
637
+ },
638
+ eventType: _analytics.EVENT_TYPE.TRACK
639
+ })(tr);
640
+ tr.setMeta('scrollIntoView', false);
641
+ return tr;
642
+ };
643
+ };
644
+ var insertLayoutColumn = exports.insertLayoutColumn = function insertLayoutColumn(side, editorAnalyticsAPI) {
645
+ return insertLayoutColumnAt(side, editorAnalyticsAPI);
646
+ };
552
647
  var setLayoutColumnValign = exports.setLayoutColumnValign = function setLayoutColumnValign(valign) {
553
- return function (_ref4) {
554
- var tr = _ref4.tr;
648
+ return function (_ref6) {
649
+ var tr = _ref6.tr;
555
650
  if (!(0, _expValEqualsNoExposure.expValEqualsNoExposure)('platform_editor_layout_column_menu', 'isEnabled', true)) {
556
651
  return null;
557
652
  }
@@ -573,14 +668,69 @@ var setLayoutColumnValign = exports.setLayoutColumnValign = function setLayoutCo
573
668
  return tr;
574
669
  };
575
670
  };
576
- var toggleLayoutColumnMenu = exports.toggleLayoutColumnMenu = function toggleLayoutColumnMenu(_ref5) {
577
- var isOpen = _ref5.isOpen;
578
- return function (_ref6) {
579
- var tr = _ref6.tr;
671
+ var toggleLayoutColumnMenu = exports.toggleLayoutColumnMenu = function toggleLayoutColumnMenu(_ref7) {
672
+ var isOpen = _ref7.isOpen;
673
+ return function (_ref8) {
674
+ var tr = _ref8.tr;
580
675
  tr.setMeta('toggleLayoutColumnMenu', {
581
676
  isOpen: isOpen
582
677
  });
583
678
  tr.setMeta('scrollIntoView', false);
584
679
  return tr;
585
680
  };
681
+ };
682
+ var deleteLayoutColumn = exports.deleteLayoutColumn = function deleteLayoutColumn(editorAnalyticsAPI) {
683
+ return function (_ref9) {
684
+ var tr = _ref9.tr;
685
+ if (!(0, _expValEqualsNoExposure.expValEqualsNoExposure)('platform_editor_layout_column_menu', 'isEnabled', true)) {
686
+ return null;
687
+ }
688
+ var selectedColumn = getSelectedLayoutColumnInSection(tr);
689
+ if (!selectedColumn) {
690
+ return null;
691
+ }
692
+ var layoutSectionNode = selectedColumn.layoutSectionNode,
693
+ layoutSectionPos = selectedColumn.layoutSectionPos,
694
+ selectedColumnIndex = selectedColumn.selectedColumnIndex;
695
+ var emitDeleteColumnAnalytics = function emitDeleteColumnAnalytics(columnCount) {
696
+ editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent({
697
+ action: _analytics.ACTION.DELETED,
698
+ actionSubject: _analytics.ACTION_SUBJECT.DOCUMENT,
699
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.LAYOUT_COLUMN,
700
+ attributes: {
701
+ columnCount: columnCount,
702
+ inputMethod: _analytics.INPUT_METHOD.LAYOUT_COLUMN_MENU,
703
+ selectedIndex: selectedColumnIndex
704
+ },
705
+ eventType: _analytics.EVENT_TYPE.TRACK
706
+ })(tr);
707
+ };
708
+
709
+ // If only one column remains, remove the entire layoutSection
710
+ if (layoutSectionNode.childCount === 1) {
711
+ tr.delete(layoutSectionPos, layoutSectionPos + layoutSectionNode.nodeSize);
712
+ emitDeleteColumnAnalytics(0);
713
+ tr.setMeta('scrollIntoView', false);
714
+ return tr;
715
+ }
716
+
717
+ // Build new column list without the selected column
718
+ var remainingColumns = [];
719
+ layoutSectionNode.forEach(function (column, _offset, index) {
720
+ if (index !== selectedColumnIndex) {
721
+ remainingColumns.push(column);
722
+ }
723
+ });
724
+
725
+ // Redistribute widths proportionally among remaining columns using shared utility
726
+ var existingWidths = (0, _utils.mapChildren)(layoutSectionNode, function (column) {
727
+ return column.attrs.width;
728
+ });
729
+ var redistributed = (0, _redistributeProportionally.redistributeAfterDeletion)(existingWidths, selectedColumnIndex, _consts.MIN_LAYOUT_COLUMN_WIDTH_PERCENT);
730
+ var updatedLayoutSectionNode = layoutSectionNode.copy(_model.Fragment.fromArray(remainingColumns));
731
+ tr.replaceWith(layoutSectionPos + 1, layoutSectionPos + layoutSectionNode.nodeSize - 1, columnWidth(updatedLayoutSectionNode, tr.doc.type.schema, redistributed));
732
+ emitDeleteColumnAnalytics(redistributed.length);
733
+ tr.setMeta('scrollIntoView', false);
734
+ return tr;
735
+ };
586
736
  };
@@ -9,6 +9,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
9
9
  var _bindEventListener = require("bind-event-listener");
10
10
  var _model = require("@atlaskit/editor-prosemirror/model");
11
11
  var _view = require("@atlaskit/editor-prosemirror/view");
12
+ var _consts = require("./consts");
12
13
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
13
14
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
14
15
  // Class names for the column resize divider widget — must stay in sync with layout.ts in editor-core
@@ -16,9 +17,6 @@ var layoutColumnDividerClassName = 'layout-column-divider';
16
17
  var layoutColumnDividerRailClassName = 'layout-column-divider-rail';
17
18
  var layoutColumnDividerThumbClassName = 'layout-column-divider-thumb';
18
19
 
19
- // Minimum column width percentage to prevent columns from collapsing
20
- var MIN_COLUMN_WIDTH_PERCENT = 5;
21
-
22
20
  // Module-level drag state so it survives widget DOM recreation during transactions.
23
21
  var dragState = null;
24
22
 
@@ -79,12 +77,12 @@ var calcDragWidths = function calcDragWidths(clientX) {
79
77
  var deltaPercent = deltaX / columnsWidth * 100;
80
78
  var leftWidth = dragState.startLeftWidth + deltaPercent;
81
79
  var rightWidth = dragState.startRightWidth - deltaPercent;
82
- if (leftWidth < MIN_COLUMN_WIDTH_PERCENT) {
83
- leftWidth = MIN_COLUMN_WIDTH_PERCENT;
84
- rightWidth = combinedWidth - MIN_COLUMN_WIDTH_PERCENT;
85
- } else if (rightWidth < MIN_COLUMN_WIDTH_PERCENT) {
86
- rightWidth = MIN_COLUMN_WIDTH_PERCENT;
87
- leftWidth = combinedWidth - MIN_COLUMN_WIDTH_PERCENT;
80
+ if (leftWidth < _consts.MIN_LAYOUT_COLUMN_WIDTH_PERCENT) {
81
+ leftWidth = _consts.MIN_LAYOUT_COLUMN_WIDTH_PERCENT;
82
+ rightWidth = combinedWidth - _consts.MIN_LAYOUT_COLUMN_WIDTH_PERCENT;
83
+ } else if (rightWidth < _consts.MIN_LAYOUT_COLUMN_WIDTH_PERCENT) {
84
+ rightWidth = _consts.MIN_LAYOUT_COLUMN_WIDTH_PERCENT;
85
+ leftWidth = combinedWidth - _consts.MIN_LAYOUT_COLUMN_WIDTH_PERCENT;
88
86
  }
89
87
  return {
90
88
  leftWidth: leftWidth,
@@ -3,7 +3,10 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.EVEN_DISTRIBUTED_COL_WIDTHS = void 0;
6
+ exports.MIN_LAYOUT_COLUMN_WIDTH_PERCENT = exports.MAX_STANDARD_LAYOUT_COLUMNS = exports.MAX_LAYOUT_COLUMNS = exports.EVEN_DISTRIBUTED_COL_WIDTHS = void 0;
7
+ var MAX_STANDARD_LAYOUT_COLUMNS = exports.MAX_STANDARD_LAYOUT_COLUMNS = 3;
8
+ var MAX_LAYOUT_COLUMNS = exports.MAX_LAYOUT_COLUMNS = 5;
9
+ var MIN_LAYOUT_COLUMN_WIDTH_PERCENT = exports.MIN_LAYOUT_COLUMN_WIDTH_PERCENT = 5;
7
10
  var EVEN_DISTRIBUTED_COL_WIDTHS = exports.EVEN_DISTRIBUTED_COL_WIDTHS = {
8
11
  1: 100,
9
12
  2: 50,
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.redistributeProportionally = exports.redistributeAfterDeletion = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var roundLayoutColumnWidth = function roundLayoutColumnWidth(width) {
10
+ return Number(width.toFixed(2));
11
+ };
12
+ var sumWidths = function sumWidths(widths) {
13
+ return widths.reduce(function (sum, width) {
14
+ return sum + width;
15
+ }, 0);
16
+ };
17
+ var isValidWidth = function isValidWidth(width) {
18
+ return Number.isFinite(width) && width > 0;
19
+ };
20
+ var normaliseWidthsTotal = function normaliseWidthsTotal(widths, totalWidth, minWidth) {
21
+ var roundedWidths = widths.map(roundLayoutColumnWidth);
22
+ var remainder = roundLayoutColumnWidth(totalWidth - sumWidths(roundedWidths));
23
+ if (remainder === 0 || roundedWidths.length === 0) {
24
+ return roundedWidths;
25
+ }
26
+ var adjustmentIndex = 0;
27
+ roundedWidths.forEach(function (width, index) {
28
+ if (width > roundedWidths[adjustmentIndex]) {
29
+ adjustmentIndex = index;
30
+ }
31
+ });
32
+ var adjustedWidth = roundLayoutColumnWidth(roundedWidths[adjustmentIndex] + remainder);
33
+ if (adjustedWidth < minWidth) {
34
+ return roundedWidths;
35
+ }
36
+ return roundedWidths.map(function (width, index) {
37
+ return index === adjustmentIndex ? adjustedWidth : width;
38
+ });
39
+ };
40
+ var redistributeWithMinimumWidth = function redistributeWithMinimumWidth(_ref) {
41
+ var minWidth = _ref.minWidth,
42
+ totalWidth = _ref.totalWidth,
43
+ weights = _ref.weights;
44
+ if (weights.length * minWidth > totalWidth) {
45
+ return;
46
+ }
47
+ var widths = Array(weights.length).fill(0);
48
+ var clampedIndexes = new Set();
49
+ var remainingWidth = totalWidth;
50
+ var remainingWeight = sumWidths(weights);
51
+ var _loop = function _loop() {
52
+ var remainingWidthForPass = remainingWidth;
53
+ var remainingWeightForPass = remainingWeight;
54
+ var indexesToClamp = [];
55
+ weights.forEach(function (weight, index) {
56
+ if (clampedIndexes.has(index)) {
57
+ return;
58
+ }
59
+ var proportionalWidth = remainingWeightForPass > 0 ? weight / remainingWeightForPass * remainingWidthForPass : 0;
60
+ if (proportionalWidth < minWidth) {
61
+ indexesToClamp.push(index);
62
+ }
63
+ });
64
+ if (indexesToClamp.length === 0) {
65
+ return 1; // break
66
+ }
67
+ indexesToClamp.forEach(function (index) {
68
+ widths[index] = minWidth;
69
+ clampedIndexes.add(index);
70
+ remainingWidth -= minWidth;
71
+ remainingWeight -= weights[index];
72
+ });
73
+ };
74
+ while (clampedIndexes.size < weights.length) {
75
+ if (_loop()) break;
76
+ }
77
+ weights.forEach(function (weight, index) {
78
+ if (!clampedIndexes.has(index)) {
79
+ widths[index] = remainingWeight > 0 ? weight / remainingWeight * remainingWidth : minWidth;
80
+ }
81
+ });
82
+ return widths;
83
+ };
84
+ var redistributeAfterDeletion = exports.redistributeAfterDeletion = function redistributeAfterDeletion(currentWidths, removeIndex, minWidth) {
85
+ if (currentWidths.length === 0 || removeIndex < 0 || removeIndex >= currentWidths.length || !isValidWidth(minWidth)) {
86
+ return currentWidths;
87
+ }
88
+ if (currentWidths.some(function (width) {
89
+ return !isValidWidth(width);
90
+ })) {
91
+ return currentWidths.filter(function (_, i) {
92
+ return i !== removeIndex;
93
+ });
94
+ }
95
+ var remainingWidths = currentWidths.filter(function (_, i) {
96
+ return i !== removeIndex;
97
+ });
98
+ if (remainingWidths.length === 0) {
99
+ return remainingWidths;
100
+ }
101
+ var currentTotalWidth = sumWidths(currentWidths);
102
+ var targetTotalWidth = Math.round(currentTotalWidth) === 100 ? 100 : currentTotalWidth;
103
+ var redistributed = redistributeWithMinimumWidth({
104
+ weights: remainingWidths,
105
+ totalWidth: targetTotalWidth,
106
+ minWidth: minWidth
107
+ });
108
+ if (!redistributed) {
109
+ var equalWidth = roundLayoutColumnWidth(targetTotalWidth / remainingWidths.length);
110
+ return normaliseWidthsTotal(Array(remainingWidths.length).fill(equalWidth), targetTotalWidth, minWidth);
111
+ }
112
+ return normaliseWidthsTotal(redistributed, targetTotalWidth, minWidth);
113
+ };
114
+ var redistributeProportionally = exports.redistributeProportionally = function redistributeProportionally(currentWidths, insertIndex, maxColumns, minWidth) {
115
+ if (currentWidths.length === 0 || !Number.isInteger(maxColumns) || maxColumns <= 0 || currentWidths.length >= maxColumns || insertIndex < 0 || insertIndex > currentWidths.length || !isValidWidth(minWidth) || currentWidths.some(function (width) {
116
+ return !isValidWidth(width);
117
+ })) {
118
+ return currentWidths;
119
+ }
120
+ var currentTotalWidth = sumWidths(currentWidths);
121
+ if (!isValidWidth(currentTotalWidth)) {
122
+ return currentWidths;
123
+ }
124
+ var targetTotalWidth = Math.round(currentTotalWidth) === 100 ? 100 : currentTotalWidth;
125
+ var newColumnWidth = Math.max(minWidth, roundLayoutColumnWidth(targetTotalWidth / (currentWidths.length + 1)));
126
+ var existingColumnsTotalWidth = targetTotalWidth - newColumnWidth;
127
+ if (existingColumnsTotalWidth < currentWidths.length * minWidth) {
128
+ return currentWidths;
129
+ }
130
+ var redistributedExistingWidths = redistributeWithMinimumWidth({
131
+ weights: currentWidths,
132
+ totalWidth: existingColumnsTotalWidth,
133
+ minWidth: minWidth
134
+ });
135
+ if (!redistributedExistingWidths) {
136
+ return currentWidths;
137
+ }
138
+ var nextWidths = (0, _toConsumableArray2.default)(redistributedExistingWidths);
139
+ nextWidths.splice(insertIndex, 0, newColumnWidth);
140
+ return normaliseWidthsTotal(nextWidths, targetTotalWidth, minWidth);
141
+ };
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+
3
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.DeleteColumnDropdownItem = void 0;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _reactIntl = require("react-intl");
10
+ var _messages = require("@atlaskit/editor-common/messages");
11
+ var _editorToolbar = require("@atlaskit/editor-toolbar");
12
+ var _useCurrentLayoutColumn = require("./useCurrentLayoutColumn");
13
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
14
+ var DeleteColumnDropdownItem = exports.DeleteColumnDropdownItem = function DeleteColumnDropdownItem(_ref) {
15
+ var api = _ref.api;
16
+ var _useIntl = (0, _reactIntl.useIntl)(),
17
+ formatMessage = _useIntl.formatMessage;
18
+ var currentColumn = (0, _useCurrentLayoutColumn.useCurrentLayoutColumn)(api);
19
+ var onClick = (0, _react.useCallback)(function () {
20
+ var _api$layout, _api$core;
21
+ var deleteCommand = api === null || api === void 0 || (_api$layout = api.layout) === null || _api$layout === void 0 ? void 0 : _api$layout.commands.deleteLayoutColumn;
22
+ api === null || api === void 0 || (_api$core = api.core) === null || _api$core === void 0 || _api$core.actions.execute(function (props) {
23
+ var _api$layout2;
24
+ var tr = deleteCommand === null || deleteCommand === void 0 ? void 0 : deleteCommand(props);
25
+ if (!tr) {
26
+ return tr !== null && tr !== void 0 ? tr : null;
27
+ }
28
+ api === null || api === void 0 || (_api$layout2 = api.layout) === null || _api$layout2 === void 0 || _api$layout2.commands.toggleLayoutColumnMenu({
29
+ isOpen: false
30
+ })({
31
+ tr: tr
32
+ });
33
+ return tr;
34
+ });
35
+ }, [api]);
36
+ if (currentColumn === undefined) {
37
+ return null;
38
+ }
39
+ return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, {
40
+ onClick: onClick
41
+ }, formatMessage(_messages.layoutMessages.deleteColumn));
42
+ };
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.InsertColumnDropdownItem = void 0;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _reactIntl = require("react-intl");
10
+ var _messages = require("@atlaskit/editor-common/messages");
11
+ var _editorToolbar = require("@atlaskit/editor-toolbar");
12
+ var _actions = require("../../pm-plugins/actions");
13
+ var _layoutColumnSelection = require("./layoutColumnSelection");
14
+ var _useCurrentLayoutColumn = require("./useCurrentLayoutColumn");
15
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
16
+ var INSERT_COLUMN_OPTIONS = {
17
+ left: {
18
+ Icon: _editorToolbar.TableColumnAddLeftIcon,
19
+ label: _messages.layoutMessages.insertColumnLeft,
20
+ side: 'left'
21
+ },
22
+ right: {
23
+ Icon: _editorToolbar.TableColumnAddRightIcon,
24
+ label: _messages.layoutMessages.insertColumnRight,
25
+ side: 'right'
26
+ }
27
+ };
28
+ var InsertColumnDropdownItem = exports.InsertColumnDropdownItem = function InsertColumnDropdownItem(_ref) {
29
+ var api = _ref.api,
30
+ side = _ref.side;
31
+ var _useIntl = (0, _reactIntl.useIntl)(),
32
+ formatMessage = _useIntl.formatMessage;
33
+ var _INSERT_COLUMN_OPTION = INSERT_COLUMN_OPTIONS[side],
34
+ Icon = _INSERT_COLUMN_OPTION.Icon,
35
+ label = _INSERT_COLUMN_OPTION.label;
36
+ var currentColumn = (0, _useCurrentLayoutColumn.useCurrentLayoutColumn)(api);
37
+ var currentLayoutSection = (0, _useCurrentLayoutColumn.useCurrentLayoutSection)(api);
38
+ var columnCount = (0, _layoutColumnSelection.getLayoutSectionColumnCount)(currentLayoutSection);
39
+ var maxColumnCount = (0, _actions.getEffectiveMaxLayoutColumns)();
40
+ var canInsertColumn = currentColumn !== undefined && columnCount < maxColumnCount;
41
+ var onClick = (0, _react.useCallback)(function () {
42
+ var _api$layout, _api$core;
43
+ var insertCommand = api === null || api === void 0 || (_api$layout = api.layout) === null || _api$layout === void 0 ? void 0 : _api$layout.commands.insertLayoutColumn(side);
44
+ api === null || api === void 0 || (_api$core = api.core) === null || _api$core === void 0 || _api$core.actions.execute(function (props) {
45
+ var _api$layout2;
46
+ var tr = insertCommand === null || insertCommand === void 0 ? void 0 : insertCommand(props);
47
+ if (!tr) {
48
+ return tr !== null && tr !== void 0 ? tr : null;
49
+ }
50
+ api === null || api === void 0 || (_api$layout2 = api.layout) === null || _api$layout2 === void 0 || _api$layout2.commands.toggleLayoutColumnMenu({
51
+ isOpen: false
52
+ })({
53
+ tr: tr
54
+ });
55
+ return tr;
56
+ });
57
+ }, [api, side]);
58
+ if (!canInsertColumn) {
59
+ return null;
60
+ }
61
+ return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, {
62
+ elemBefore: /*#__PURE__*/_react.default.createElement(Icon, {
63
+ color: "currentColor",
64
+ label: "",
65
+ size: "small"
66
+ }),
67
+ onClick: onClick
68
+ }, formatMessage(label));
69
+ };
@@ -8,7 +8,8 @@ exports.VerticalAlignDropdownItem = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
  var _reactIntl = require("react-intl");
10
10
  var _editorToolbar = require("@atlaskit/editor-toolbar");
11
- var _useCurrentLayoutColumnValign = require("./useCurrentLayoutColumnValign");
11
+ var _layoutColumnSelection = require("./layoutColumnSelection");
12
+ var _useCurrentLayoutColumn = require("./useCurrentLayoutColumn");
12
13
  var _verticalAlignIcons = require("./verticalAlignIcons");
13
14
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
14
15
  var VerticalAlignDropdownItem = exports.VerticalAlignDropdownItem = function VerticalAlignDropdownItem(_ref) {
@@ -17,24 +18,21 @@ var VerticalAlignDropdownItem = exports.VerticalAlignDropdownItem = function Ver
17
18
  value = _ref.value;
18
19
  var _useIntl = (0, _reactIntl.useIntl)(),
19
20
  formatMessage = _useIntl.formatMessage;
20
- var _useCurrentLayoutColu = (0, _useCurrentLayoutColumnValign.useCurrentLayoutColumnValign)(api),
21
- currentValign = _useCurrentLayoutColu.currentValign,
22
- selectedColumn = _useCurrentLayoutColu.selectedColumn;
21
+ var currentColumn = (0, _useCurrentLayoutColumn.useCurrentLayoutColumn)(api);
22
+ var currentValign = (0, _react.useMemo)(function () {
23
+ return (0, _layoutColumnSelection.getLayoutColumnValign)(currentColumn);
24
+ }, [currentColumn]);
23
25
  var Icon = _verticalAlignIcons.VERTICAL_ALIGN_ICONS[value];
24
26
  var onClick = (0, _react.useCallback)(function () {
25
27
  var _api$core, _api$layout;
26
28
  api === null || api === void 0 || (_api$core = api.core) === null || _api$core === void 0 || _api$core.actions.execute(api === null || api === void 0 || (_api$layout = api.layout) === null || _api$layout === void 0 ? void 0 : _api$layout.commands.setLayoutColumnValign(value));
27
29
  }, [api, value]);
28
- if (!selectedColumn) {
29
- return null;
30
- }
31
30
  return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, {
32
31
  elemBefore: /*#__PURE__*/_react.default.createElement(Icon, {
33
32
  label: "",
34
33
  size: "small"
35
34
  }),
36
35
  isSelected: currentValign === value,
37
- onClick: onClick,
38
- testId: "layout-column-align-".concat(value)
36
+ onClick: onClick
39
37
  }, formatMessage(label));
40
38
  };
@@ -1,26 +1,29 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.VerticalAlignNestedMenu = void 0;
8
- var _react = _interopRequireDefault(require("react"));
8
+ var _react = _interopRequireWildcard(require("react"));
9
9
  var _reactIntl = require("react-intl");
10
10
  var _messages = require("@atlaskit/editor-common/messages");
11
11
  var _editorToolbar = require("@atlaskit/editor-toolbar");
12
- var _useCurrentLayoutColumnValign = require("./useCurrentLayoutColumnValign");
12
+ var _layoutColumnSelection = require("./layoutColumnSelection");
13
+ var _useCurrentLayoutColumn = require("./useCurrentLayoutColumn");
13
14
  var _verticalAlignIcons = require("./verticalAlignIcons");
15
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
14
16
  var VerticalAlignNestedMenu = exports.VerticalAlignNestedMenu = function VerticalAlignNestedMenu(_ref) {
15
17
  var api = _ref.api,
16
18
  children = _ref.children;
17
19
  var _useIntl = (0, _reactIntl.useIntl)(),
18
20
  formatMessage = _useIntl.formatMessage;
19
- var _useCurrentLayoutColu = (0, _useCurrentLayoutColumnValign.useCurrentLayoutColumnValign)(api),
20
- currentValign = _useCurrentLayoutColu.currentValign,
21
- selectedColumn = _useCurrentLayoutColu.selectedColumn;
21
+ var currentColumn = (0, _useCurrentLayoutColumn.useCurrentLayoutColumn)(api);
22
+ var currentValign = (0, _react.useMemo)(function () {
23
+ return (0, _layoutColumnSelection.getLayoutColumnValign)(currentColumn);
24
+ }, [currentColumn]);
22
25
  var TriggerIcon = currentValign ? _verticalAlignIcons.VERTICAL_ALIGN_ICONS[currentValign] : _editorToolbar.LayoutIcon;
23
- if (!selectedColumn) {
26
+ if (!currentColumn) {
24
27
  return null;
25
28
  }
26
29
  return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarNestedDropdownMenu, {
@@ -32,8 +35,6 @@ var VerticalAlignNestedMenu = exports.VerticalAlignNestedMenu = function Vertica
32
35
  label: "",
33
36
  size: "small"
34
37
  }),
35
- text: formatMessage(_messages.layoutMessages.alignColumn),
36
- testId: "layout-column-align-menu",
37
- dropdownTestId: "layout-column-align-dropdown"
38
+ text: formatMessage(_messages.layoutMessages.alignColumn)
38
39
  }, children);
39
40
  };