@odoo/o-spreadsheet 16.3.0-alpha.3 → 16.3.0-alpha.4

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.
@@ -113,6 +113,7 @@ const FILTERS_COLOR = "#188038";
113
113
  const BACKGROUND_HEADER_FILTER_COLOR = "#E6F4EA";
114
114
  const BACKGROUND_HEADER_SELECTED_FILTER_COLOR = "#CEEAD6";
115
115
  const SEPARATOR_COLOR = "#E0E2E4";
116
+ const ICONS_COLOR = "#4A4F59";
116
117
  // Color picker defaults as upper case HEX to match `toHex`helper
117
118
  const COLOR_PICKER_DEFAULTS = [
118
119
  "#000000",
@@ -219,8 +220,10 @@ const FILTER_ICON_MARGIN = 2;
219
220
  const FILTER_ICON_EDGE_LENGTH = 17;
220
221
  // Menus
221
222
  const MENU_WIDTH = 250;
222
- const MENU_VERTICAL_PADDING = 8;
223
- const MENU_ITEM_HEIGHT = 28;
223
+ const MENU_VERTICAL_PADDING = 6;
224
+ const MENU_ITEM_HEIGHT = 26;
225
+ const MENU_ITEM_PADDING_HORIZONTAL = 13;
226
+ const MENU_ITEM_PADDING_VERTICAL = 4;
224
227
  const MENU_SEPARATOR_BORDER_WIDTH = 1;
225
228
  const MENU_SEPARATOR_PADDING = 5;
226
229
  // Fonts
@@ -228,6 +231,7 @@ const DEFAULT_FONT_WEIGHT = "400";
228
231
  const DEFAULT_FONT_SIZE = 10;
229
232
  const HEADER_FONT_SIZE = 11;
230
233
  const DEFAULT_FONT = "'Roboto', arial";
234
+ const DEFAULT_VERTICAL_ALIGN = "middle";
231
235
  // Borders
232
236
  const DEFAULT_BORDER_DESC = ["thin", "#000"];
233
237
  const DEFAULT_FILTER_BORDER_DESC = ["thin", FILTERS_COLOR];
@@ -270,15 +274,22 @@ var ComponentsImportance;
270
274
  ComponentsImportance[ComponentsImportance["Highlight"] = 5] = "Highlight";
271
275
  ComponentsImportance[ComponentsImportance["Figure"] = 10] = "Figure";
272
276
  ComponentsImportance[ComponentsImportance["ScrollBar"] = 15] = "ScrollBar";
273
- ComponentsImportance[ComponentsImportance["Dropdown"] = 16] = "Dropdown";
277
+ ComponentsImportance[ComponentsImportance["GridPopover"] = 19] = "GridPopover";
274
278
  ComponentsImportance[ComponentsImportance["GridComposer"] = 20] = "GridComposer";
275
- ComponentsImportance[ComponentsImportance["TopBarComposer"] = 21] = "TopBarComposer";
279
+ ComponentsImportance[ComponentsImportance["Dropdown"] = 21] = "Dropdown";
276
280
  ComponentsImportance[ComponentsImportance["IconPicker"] = 25] = "IconPicker";
277
- ComponentsImportance[ComponentsImportance["Popover"] = 30] = "Popover";
281
+ ComponentsImportance[ComponentsImportance["TopBarComposer"] = 30] = "TopBarComposer";
282
+ ComponentsImportance[ComponentsImportance["Popover"] = 35] = "Popover";
278
283
  ComponentsImportance[ComponentsImportance["FigureAnchor"] = 1000] = "FigureAnchor";
279
284
  ComponentsImportance[ComponentsImportance["FigureSnapLine"] = 1001] = "FigureSnapLine";
280
285
  })(ComponentsImportance || (ComponentsImportance = {}));
281
- const DEFAULT_SHEETVIEW_SIZE = 1000;
286
+ let DEFAULT_SHEETVIEW_SIZE = 0;
287
+ function getDefaultSheetViewSize() {
288
+ return DEFAULT_SHEETVIEW_SIZE;
289
+ }
290
+ function setDefaultSheetViewSize(size) {
291
+ DEFAULT_SHEETVIEW_SIZE = size;
292
+ }
282
293
  const MAXIMAL_FREEZABLE_RATIO = 0.85;
283
294
  const NEWLINE = "\n";
284
295
  const FONT_SIZES = [6, 7, 8, 9, 10, 11, 12, 14, 18, 24, 36];
@@ -5181,6 +5192,11 @@ class Popover extends Component {
5181
5192
  this.currentPosition = newPosition;
5182
5193
  });
5183
5194
  }
5195
+ get popoverStyle() {
5196
+ return cssPropertiesToCss({
5197
+ "z-index": `${this.props.zIndex}`,
5198
+ });
5199
+ }
5184
5200
  }
5185
5201
  Popover.template = "o-spreadsheet-Popover";
5186
5202
  Popover.defaultProps = {
@@ -5189,6 +5205,7 @@ Popover.defaultProps = {
5189
5205
  onMouseWheel: () => { },
5190
5206
  onPopoverMoved: () => { },
5191
5207
  onPopoverHidden: () => { },
5208
+ zIndex: ComponentsImportance.Popover,
5192
5209
  };
5193
5210
  Popover.props = {
5194
5211
  anchorRect: Object,
@@ -5200,6 +5217,7 @@ Popover.props = {
5200
5217
  onMouseWheel: { type: Function, optional: true },
5201
5218
  onPopoverHidden: { type: Function, optional: true },
5202
5219
  onPopoverMoved: { type: Function, optional: true },
5220
+ zIndex: { type: Number, optional: true },
5203
5221
  slots: Object,
5204
5222
  };
5205
5223
  class PopoverPositionContext {
@@ -5343,7 +5361,7 @@ css /* scss */ `
5343
5361
  align-items: center;
5344
5362
  box-sizing: border-box;
5345
5363
  height: ${MENU_ITEM_HEIGHT}px;
5346
- padding: 4px 16px;
5364
+ padding: ${MENU_ITEM_PADDING_VERTICAL}px ${MENU_ITEM_PADDING_HORIZONTAL}px;
5347
5365
  cursor: pointer;
5348
5366
  user-select: none;
5349
5367
 
@@ -5357,11 +5375,18 @@ css /* scss */ `
5357
5375
  display: flex;
5358
5376
  justify-content: space-between;
5359
5377
  }
5378
+
5360
5379
  .o-menu-item-icon {
5361
- margin-top: auto;
5362
- margin-bottom: auto;
5380
+ display: inline-block;
5381
+ margin-right: calc(${MENU_ITEM_PADDING_HORIZONTAL}px * 3 / 5);
5382
+ width: ${MENU_ITEM_HEIGHT - 2 * MENU_ITEM_PADDING_VERTICAL}px;
5383
+ line-height: ${MENU_ITEM_HEIGHT - 2 * MENU_ITEM_PADDING_VERTICAL}px;
5384
+
5385
+ .o-icon {
5386
+ color: ${ICONS_COLOR};
5387
+ }
5363
5388
  }
5364
- .o-icon {
5389
+ .o-menu-item-root {
5365
5390
  width: 10px;
5366
5391
  }
5367
5392
 
@@ -5441,12 +5466,22 @@ class Menu extends Component {
5441
5466
  onPopoverMoved: () => this.closeSubMenu(),
5442
5467
  };
5443
5468
  }
5469
+ get childrenHaveIcon() {
5470
+ return this.props.menuItems.some((menuItem) => !menuItem.icon && !!menuItem.isActive);
5471
+ }
5472
+ getIconName(menu) {
5473
+ var _a;
5474
+ if ((_a = menu.isActive) === null || _a === void 0 ? void 0 : _a.call(menu, this.env)) {
5475
+ return "o-spreadsheet-Icon.CHECK";
5476
+ }
5477
+ return "";
5478
+ }
5444
5479
  getColor(menu) {
5445
5480
  return menu.textColor ? `color: ${menu.textColor}` : undefined;
5446
5481
  }
5447
5482
  async activateMenu(menu) {
5448
5483
  var _a, _b, _c;
5449
- const result = await ((_a = menu.action) === null || _a === void 0 ? void 0 : _a.call(menu, this.env));
5484
+ const result = await ((_a = menu.execute) === null || _a === void 0 ? void 0 : _a.call(menu, this.env));
5450
5485
  this.close();
5451
5486
  (_c = (_b = this.props).onMenuClicked) === null || _c === void 0 ? void 0 : _c.call(_b, { detail: result });
5452
5487
  }
@@ -5467,7 +5502,7 @@ class Menu extends Component {
5467
5502
  return menu.name(this.env);
5468
5503
  }
5469
5504
  isRoot(menu) {
5470
- return !menu.action;
5505
+ return !menu.execute;
5471
5506
  }
5472
5507
  isEnabled(menu) {
5473
5508
  if (menu.isEnabled(this.env)) {
@@ -5514,7 +5549,7 @@ class Menu extends Component {
5514
5549
  }
5515
5550
  }
5516
5551
  onMouseOver(menu, position, ev) {
5517
- if (menu.isEnabled(this.env)) {
5552
+ if (this.isEnabled(menu)) {
5518
5553
  if (this.isRoot(menu)) {
5519
5554
  this.openSubMenu(menu, position, ev);
5520
5555
  }
@@ -5651,11 +5686,82 @@ LinkDisplay.props = {
5651
5686
  onClosed: { type: Function, optional: true },
5652
5687
  };
5653
5688
 
5654
- function createMenu(menuItems) {
5655
- return menuItems.map(createMenuItem).sort((a, b) => a.sequence - b.sequence);
5689
+ const linkSheet = {
5690
+ name: _lt("Link sheet"),
5691
+ children: [
5692
+ (env) => {
5693
+ const sheets = env.model.getters
5694
+ .getSheetIds()
5695
+ .map((sheetId) => env.model.getters.getSheet(sheetId));
5696
+ return sheets.map((sheet) => ({
5697
+ id: sheet.id,
5698
+ name: sheet.name,
5699
+ execute: () => markdownLink(sheet.name, buildSheetLink(sheet.id)),
5700
+ }));
5701
+ },
5702
+ ],
5703
+ };
5704
+ const deleteSheet = {
5705
+ name: _lt("Delete"),
5706
+ isVisible: (env) => {
5707
+ return env.model.getters.getSheetIds().length > 1;
5708
+ },
5709
+ execute: (env) => env.askConfirmation(_lt("Are you sure you want to delete this sheet ?"), () => {
5710
+ env.model.dispatch("DELETE_SHEET", { sheetId: env.model.getters.getActiveSheetId() });
5711
+ }),
5712
+ };
5713
+ const duplicateSheet = {
5714
+ name: _lt("Duplicate"),
5715
+ execute: (env) => {
5716
+ const sheetIdFrom = env.model.getters.getActiveSheetId();
5717
+ const sheetIdTo = env.model.uuidGenerator.uuidv4();
5718
+ env.model.dispatch("DUPLICATE_SHEET", {
5719
+ sheetId: sheetIdFrom,
5720
+ sheetIdTo,
5721
+ });
5722
+ env.model.dispatch("ACTIVATE_SHEET", { sheetIdFrom, sheetIdTo });
5723
+ },
5724
+ };
5725
+ const renameSheet = (args) => {
5726
+ return {
5727
+ name: _lt("Rename"),
5728
+ execute: args.renameSheetCallback,
5729
+ };
5730
+ };
5731
+ const sheetMoveRight = {
5732
+ name: _lt("Move right"),
5733
+ isVisible: (env) => {
5734
+ const sheetId = env.model.getters.getActiveSheetId();
5735
+ const sheetIds = env.model.getters.getVisibleSheetIds();
5736
+ return sheetIds.indexOf(sheetId) !== sheetIds.length - 1;
5737
+ },
5738
+ execute: (env) => env.model.dispatch("MOVE_SHEET", {
5739
+ sheetId: env.model.getters.getActiveSheetId(),
5740
+ delta: 1,
5741
+ }),
5742
+ };
5743
+ const sheetMoveLeft = {
5744
+ name: _lt("Move left"),
5745
+ isVisible: (env) => {
5746
+ const sheetId = env.model.getters.getActiveSheetId();
5747
+ return env.model.getters.getVisibleSheetIds()[0] !== sheetId;
5748
+ },
5749
+ execute: (env) => env.model.dispatch("MOVE_SHEET", {
5750
+ sheetId: env.model.getters.getActiveSheetId(),
5751
+ delta: -1,
5752
+ }),
5753
+ };
5754
+ const hideSheet = {
5755
+ name: _lt("Hide sheet"),
5756
+ isVisible: (env) => env.model.getters.getVisibleSheetIds().length !== 1,
5757
+ execute: (env) => env.model.dispatch("HIDE_SHEET", { sheetId: env.model.getters.getActiveSheetId() }),
5758
+ };
5759
+
5760
+ function createActions(menuItems) {
5761
+ return menuItems.map(createAction).sort((a, b) => a.sequence - b.sequence);
5656
5762
  }
5657
5763
  const uuidGenerator$1 = new UuidGenerator();
5658
- function createMenuItem(item) {
5764
+ function createAction(item) {
5659
5765
  const name = item.name;
5660
5766
  const children = item.children;
5661
5767
  return {
@@ -5663,23 +5769,25 @@ function createMenuItem(item) {
5663
5769
  name: typeof name === "function" ? name : () => name,
5664
5770
  isVisible: item.isVisible ? item.isVisible : () => true,
5665
5771
  isEnabled: item.isEnabled ? item.isEnabled : () => true,
5666
- action: item.action,
5772
+ isActive: item.isActive,
5773
+ execute: item.execute,
5667
5774
  children: children
5668
5775
  ? (env) => {
5669
5776
  return children
5670
5777
  .map((child) => (typeof child === "function" ? child(env) : child))
5671
5778
  .flat()
5672
- .map(createMenuItem);
5779
+ .map(createAction);
5673
5780
  }
5674
5781
  : () => [],
5675
5782
  isReadonlyAllowed: item.isReadonlyAllowed || false,
5676
5783
  separator: item.separator || false,
5677
- icon: item.icon,
5784
+ icon: item.icon || "",
5678
5785
  description: item.description || "",
5679
5786
  textColor: item.textColor,
5680
5787
  sequence: item.sequence || 0,
5681
5788
  };
5682
- }
5789
+ }
5790
+
5683
5791
  /**
5684
5792
  * The class Registry is extended in order to add the function addChild
5685
5793
  *
@@ -5726,7 +5834,7 @@ class MenuItemRegistry extends Registry {
5726
5834
  return this;
5727
5835
  }
5728
5836
  getMenuItems() {
5729
- return createMenu(this.getAll());
5837
+ return createActions(this.getAll());
5730
5838
  }
5731
5839
  }
5732
5840
 
@@ -5734,20 +5842,9 @@ class MenuItemRegistry extends Registry {
5734
5842
  // Link Menu Registry
5735
5843
  //------------------------------------------------------------------------------
5736
5844
  const linkMenuRegistry = new MenuItemRegistry();
5737
- linkMenuRegistry
5738
- .add("sheet", {
5739
- name: _lt("Link sheet"),
5845
+ linkMenuRegistry.add("sheet", {
5846
+ ...linkSheet,
5740
5847
  sequence: 10,
5741
- })
5742
- .addChild("sheet_list", ["sheet"], (env) => {
5743
- const sheets = env.model.getters
5744
- .getSheetIds()
5745
- .map((sheetId) => env.model.getters.getSheet(sheetId));
5746
- return sheets.map((sheet) => ({
5747
- id: sheet.id,
5748
- name: sheet.name,
5749
- action: () => markdownLink(sheet.name, buildSheetLink(sheet.id)),
5750
- }));
5751
5848
  });
5752
5849
 
5753
5850
  const MENU_OFFSET_X = 320;
@@ -6411,18 +6508,6 @@ const ChartTerms = {
6411
6508
  [43 /* CommandResult.GaugeUpperInflectionPointNaN */]: _lt("The upper inflection point value must be a number"),
6412
6509
  },
6413
6510
  };
6414
- const NumberFormatTerms = {
6415
- Automatic: _lt("Automatic"),
6416
- Number: _lt("Number"),
6417
- Percent: _lt("Percent"),
6418
- Currency: _lt("Currency"),
6419
- CurrencyRounded: _lt("Currency rounded"),
6420
- Date: _lt("Date"),
6421
- Time: _lt("Time"),
6422
- DateTime: _lt("Date time"),
6423
- Duration: _lt("Duration"),
6424
- CustomCurrency: _lt("Custom currency"),
6425
- };
6426
6511
  const CustomCurrencyTerms = {
6427
6512
  Custom: _lt("Custom"),
6428
6513
  };
@@ -7966,7 +8051,7 @@ function getChartMenu(figureId, onFigureDeleted, env) {
7966
8051
  id: "edit",
7967
8052
  name: _lt("Edit"),
7968
8053
  sequence: 1,
7969
- action: () => {
8054
+ execute: () => {
7970
8055
  env.model.dispatch("SELECT_FIGURE", { id: figureId });
7971
8056
  env.openSidePanel("ChartPanel");
7972
8057
  },
@@ -7975,7 +8060,7 @@ function getChartMenu(figureId, onFigureDeleted, env) {
7975
8060
  getCutMenuItem(figureId, env),
7976
8061
  getDeleteMenuItem(figureId, onFigureDeleted, env),
7977
8062
  ];
7978
- return createMenu(menuItemSpecs);
8063
+ return createActions(menuItemSpecs);
7979
8064
  }
7980
8065
  function getImageMenuRegistry(figureId, onFigureDeleted, env) {
7981
8066
  const menuItemSpecs = [
@@ -7985,7 +8070,7 @@ function getImageMenuRegistry(figureId, onFigureDeleted, env) {
7985
8070
  id: "reset_size",
7986
8071
  name: _lt("Reset size"),
7987
8072
  sequence: 4,
7988
- action: () => {
8073
+ execute: () => {
7989
8074
  const size = env.model.getters.getImageSize(figureId);
7990
8075
  const { height, width } = getMaxFigureSize(env.model.getters, size);
7991
8076
  env.model.dispatch("UPDATE_FIGURE", {
@@ -7998,7 +8083,7 @@ function getImageMenuRegistry(figureId, onFigureDeleted, env) {
7998
8083
  },
7999
8084
  getDeleteMenuItem(figureId, onFigureDeleted, env),
8000
8085
  ];
8001
- return createMenu(menuItemSpecs);
8086
+ return createActions(menuItemSpecs);
8002
8087
  }
8003
8088
  function getCopyMenuItem(figureId, env) {
8004
8089
  return {
@@ -8006,7 +8091,7 @@ function getCopyMenuItem(figureId, env) {
8006
8091
  name: _lt("Copy"),
8007
8092
  sequence: 2,
8008
8093
  description: "Ctrl+C",
8009
- action: async () => {
8094
+ execute: async () => {
8010
8095
  env.model.dispatch("SELECT_FIGURE", { id: figureId });
8011
8096
  env.model.dispatch("COPY");
8012
8097
  await env.clipboard.write(env.model.getters.getClipboardContent());
@@ -8019,7 +8104,7 @@ function getCutMenuItem(figureId, env) {
8019
8104
  name: _lt("Cut"),
8020
8105
  sequence: 3,
8021
8106
  description: "Ctrl+X",
8022
- action: async () => {
8107
+ execute: async () => {
8023
8108
  env.model.dispatch("SELECT_FIGURE", { id: figureId });
8024
8109
  env.model.dispatch("CUT");
8025
8110
  await env.clipboard.write(env.model.getters.getClipboardContent());
@@ -8031,7 +8116,7 @@ function getDeleteMenuItem(figureId, onFigureDeleted, env) {
8031
8116
  id: "delete",
8032
8117
  name: _lt("Delete"),
8033
8118
  sequence: 10,
8034
- action: () => {
8119
+ execute: () => {
8035
8120
  env.model.dispatch("DELETE_FIGURE", {
8036
8121
  sheetId: env.model.getters.getActiveSheetId(),
8037
8122
  id: figureId,
@@ -8138,6 +8223,22 @@ function inverseUnhideColumnsRows(cmd) {
8138
8223
  ];
8139
8224
  }
8140
8225
 
8226
+ const AddMergeInteractiveContent = {
8227
+ MergeIsDestructive: _lt("Merging these cells will only preserve the top-leftmost value. Merge anyway?"),
8228
+ MergeInFilter: _lt("You can't merge cells inside of an existing filter."),
8229
+ };
8230
+ function interactiveAddMerge(env, sheetId, target) {
8231
+ const result = env.model.dispatch("ADD_MERGE", { sheetId, target });
8232
+ if (result.isCancelledBecause(80 /* CommandResult.MergeInFilter */)) {
8233
+ env.raiseError(AddMergeInteractiveContent.MergeInFilter);
8234
+ }
8235
+ else if (result.isCancelledBecause(3 /* CommandResult.MergeIsDestructive */)) {
8236
+ env.askConfirmation(AddMergeInteractiveContent.MergeIsDestructive, () => {
8237
+ env.model.dispatch("ADD_MERGE", { sheetId, target, force: true });
8238
+ });
8239
+ }
8240
+ }
8241
+
8141
8242
  /**
8142
8243
  * Create a function used to create a Chart based on the definition
8143
8244
  */
@@ -8493,9 +8594,9 @@ const CUT_ACTION = async (env) => {
8493
8594
  interactiveCut(env);
8494
8595
  await env.clipboard.write(env.model.getters.getClipboardContent());
8495
8596
  };
8496
- const PASTE_ACTION = async (env) => paste(env);
8497
- const PASTE_VALUE_ACTION = async (env) => paste(env, "onlyValue");
8498
- async function paste(env, pasteOption) {
8597
+ const PASTE_ACTION = async (env) => paste$1(env);
8598
+ const PASTE_VALUE_ACTION = async (env) => paste$1(env, "onlyValue");
8599
+ async function paste$1(env, pasteOption) {
8499
8600
  const spreadsheetClipboard = env.model.getters.getClipboardTextContent();
8500
8601
  const osClipboard = await env.clipboard.readText();
8501
8602
  switch (osClipboard.status) {
@@ -9049,365 +9150,159 @@ const IS_ONLY_ONE_RANGE = (env) => {
9049
9150
  return env.model.getters.getSelectedZones().length === 1;
9050
9151
  };
9051
9152
 
9052
- //------------------------------------------------------------------------------
9053
- // Context Menu Registry
9054
- //------------------------------------------------------------------------------
9055
- const cellMenuRegistry = new MenuItemRegistry();
9056
- cellMenuRegistry
9057
- .add("cut", {
9058
- name: _lt("Cut"),
9059
- description: "Ctrl+X",
9060
- sequence: 10,
9061
- action: CUT_ACTION,
9062
- })
9063
- .add("copy", {
9153
+ const undo = {
9154
+ name: _lt("Undo"),
9155
+ description: "Ctrl+Z",
9156
+ execute: UNDO_ACTION,
9157
+ isEnabled: (env) => env.model.getters.canUndo(),
9158
+ icon: "o-spreadsheet-Icon.UNDO",
9159
+ };
9160
+ const redo = {
9161
+ name: _lt("Redo"),
9162
+ description: "Ctrl+Y",
9163
+ execute: REDO_ACTION,
9164
+ isEnabled: (env) => env.model.getters.canRedo(),
9165
+ icon: "o-spreadsheet-Icon.REDO",
9166
+ };
9167
+ const copy = {
9064
9168
  name: _lt("Copy"),
9065
9169
  description: "Ctrl+C",
9066
- sequence: 20,
9067
9170
  isReadonlyAllowed: true,
9068
- action: COPY_ACTION,
9069
- })
9070
- .add("paste", {
9071
- name: _lt("Paste"),
9072
- description: "Ctrl+V",
9073
- sequence: 30,
9074
- action: PASTE_ACTION,
9075
- })
9076
- .add("paste_special", {
9077
- name: _lt("Paste special"),
9078
- sequence: 40,
9079
- separator: true,
9080
- isVisible: IS_NOT_CUT_OPERATION,
9081
- })
9082
- .addChild("paste_value_only", ["paste_special"], {
9083
- name: _lt("Paste values only"),
9084
- sequence: 10,
9085
- action: PASTE_VALUE_ACTION,
9086
- })
9087
- .addChild("paste_format_only", ["paste_special"], {
9088
- name: _lt("Paste format only"),
9089
- sequence: 20,
9090
- action: PASTE_FORMAT_ACTION,
9091
- })
9092
- .add("add_row_before", {
9093
- name: CELL_INSERT_ROWS_BEFORE_NAME,
9094
- sequence: 70,
9095
- action: INSERT_ROWS_BEFORE_ACTION,
9096
- isVisible: IS_ONLY_ONE_RANGE,
9097
- })
9098
- .add("add_column_before", {
9099
- name: CELL_INSERT_COLUMNS_BEFORE_NAME,
9100
- sequence: 90,
9101
- action: INSERT_COLUMNS_BEFORE_ACTION,
9102
- isVisible: IS_ONLY_ONE_RANGE,
9103
- })
9104
- .add("insert_cell", {
9105
- name: _lt("Insert cells"),
9106
- sequence: 100,
9107
- isVisible: IS_ONLY_ONE_RANGE,
9108
- separator: true,
9109
- })
9110
- .addChild("insert_cell_down", ["insert_cell"], {
9111
- name: _lt("Shift down"),
9112
- sequence: 10,
9113
- action: INSERT_CELL_SHIFT_DOWN,
9114
- })
9115
- .addChild("insert_cell_right", ["insert_cell"], {
9116
- name: _lt("Shift right"),
9117
- sequence: 20,
9118
- action: INSERT_CELL_SHIFT_RIGHT,
9119
- })
9120
- .add("delete_row", {
9121
- name: REMOVE_ROWS_NAME,
9122
- sequence: 110,
9123
- action: REMOVE_ROWS_ACTION,
9124
- isVisible: IS_ONLY_ONE_RANGE,
9125
- })
9126
- .add("delete_column", {
9127
- name: REMOVE_COLUMNS_NAME,
9128
- sequence: 120,
9129
- action: REMOVE_COLUMNS_ACTION,
9130
- isVisible: IS_ONLY_ONE_RANGE,
9131
- })
9132
- .add("delete_cell", {
9133
- name: _lt("Delete cells"),
9134
- sequence: 130,
9135
- isVisible: IS_ONLY_ONE_RANGE,
9136
- })
9137
- .addChild("delete_cell_up", ["delete_cell"], {
9138
- name: _lt("Shift up"),
9139
- sequence: 10,
9140
- action: DELETE_CELL_SHIFT_UP,
9141
- })
9142
- .addChild("delete_cell_down", ["delete_cell"], {
9143
- name: _lt("Shift left"),
9144
- sequence: 20,
9145
- action: DELETE_CELL_SHIFT_LEFT,
9146
- })
9147
- .add("insert_link", {
9148
- name: _lt("Insert link"),
9149
- separator: true,
9150
- sequence: 150,
9151
- action: INSERT_LINK,
9152
- });
9153
-
9154
- const colMenuRegistry = new MenuItemRegistry();
9155
- colMenuRegistry
9156
- .add("cut", {
9171
+ execute: COPY_ACTION,
9172
+ };
9173
+ const cut = {
9157
9174
  name: _lt("Cut"),
9158
9175
  description: "Ctrl+X",
9159
- sequence: 10,
9160
- action: CUT_ACTION,
9161
- })
9162
- .add("copy", {
9163
- name: _lt("Copy"),
9164
- description: "Ctrl+C",
9165
- sequence: 20,
9166
- isReadonlyAllowed: true,
9167
- action: COPY_ACTION,
9168
- })
9169
- .add("paste", {
9176
+ execute: CUT_ACTION,
9177
+ };
9178
+ const paste = {
9170
9179
  name: _lt("Paste"),
9171
9180
  description: "Ctrl+V",
9172
- sequence: 30,
9173
- action: PASTE_ACTION,
9174
- })
9175
- .add("paste_special", {
9181
+ execute: PASTE_ACTION,
9182
+ };
9183
+ const pasteSpecial = {
9176
9184
  name: _lt("Paste special"),
9177
- sequence: 40,
9178
- separator: true,
9179
9185
  isVisible: IS_NOT_CUT_OPERATION,
9180
- })
9181
- .addChild("paste_value_only", ["paste_special"], {
9186
+ };
9187
+ const pasteSpecialValue = {
9182
9188
  name: _lt("Paste value only"),
9183
- sequence: 10,
9184
- action: PASTE_VALUE_ACTION,
9185
- })
9186
- .addChild("paste_format_only", ["paste_special"], {
9189
+ execute: PASTE_VALUE_ACTION,
9190
+ };
9191
+ const pasteSpecialFormat = {
9187
9192
  name: _lt("Paste format only"),
9188
- sequence: 20,
9189
- action: PASTE_FORMAT_ACTION,
9190
- })
9191
- .add("sort_columns", {
9192
- name: (env) => env.model.getters.getActiveCols().size > 1 ? _lt("Sort columns") : _lt("Sort column"),
9193
- sequence: 50,
9193
+ execute: PASTE_FORMAT_ACTION,
9194
+ };
9195
+ const findAndReplace = {
9196
+ name: _lt("Find and replace"),
9197
+ description: "Ctrl+H",
9198
+ isReadonlyAllowed: true,
9199
+ execute: OPEN_FAR_SIDEPANEL_ACTION,
9200
+ };
9201
+ const deleteValues = {
9202
+ name: _lt("Delete values"),
9203
+ execute: DELETE_CONTENT_ACTION,
9204
+ };
9205
+ const deleteRows = {
9206
+ name: REMOVE_ROWS_NAME,
9207
+ execute: REMOVE_ROWS_ACTION,
9208
+ };
9209
+ const deleteRow = {
9210
+ ...deleteRows,
9194
9211
  isVisible: IS_ONLY_ONE_RANGE,
9195
- separator: true,
9196
- })
9197
- .addChild("sort_ascending", ["sort_columns"], {
9198
- name: _lt("Ascending (A ⟶ Z)"),
9199
- sequence: 10,
9200
- action: SORT_CELLS_ASCENDING,
9201
- })
9202
- .addChild("sort_descending", ["sort_columns"], {
9203
- name: _lt("Descending (Z ⟶ A)"),
9204
- sequence: 20,
9205
- action: SORT_CELLS_DESCENDING,
9206
- })
9207
- .add("add_column_before", {
9208
- name: COLUMN_INSERT_COLUMNS_BEFORE_NAME,
9209
- sequence: 70,
9210
- action: INSERT_COLUMNS_BEFORE_ACTION,
9211
- })
9212
- .add("add_column_after", {
9213
- name: COLUMN_INSERT_COLUMNS_AFTER_NAME,
9214
- sequence: 80,
9215
- action: INSERT_COLUMNS_AFTER_ACTION,
9216
- })
9217
- .add("delete_column", {
9212
+ };
9213
+ const clearRows = {
9214
+ name: DELETE_CONTENT_ROWS_NAME,
9215
+ execute: DELETE_CONTENT_ROWS_ACTION,
9216
+ };
9217
+ const deleteCols = {
9218
9218
  name: REMOVE_COLUMNS_NAME,
9219
- sequence: 90,
9220
- action: REMOVE_COLUMNS_ACTION,
9221
- })
9222
- .add("clear_column", {
9219
+ execute: REMOVE_COLUMNS_ACTION,
9220
+ };
9221
+ const deleteCol = {
9222
+ ...deleteCols,
9223
+ isVisible: IS_ONLY_ONE_RANGE,
9224
+ };
9225
+ const clearCols = {
9223
9226
  name: DELETE_CONTENT_COLUMNS_NAME,
9224
- sequence: 100,
9225
- action: DELETE_CONTENT_COLUMNS_ACTION,
9226
- })
9227
- .add("hide_columns", {
9228
- name: HIDE_COLUMNS_NAME,
9229
- sequence: 85,
9230
- action: HIDE_COLUMNS_ACTION,
9231
- isVisible: (env) => {
9232
- const sheetId = env.model.getters.getActiveSheetId();
9233
- const hiddenCols = env.model.getters.getHiddenColsGroups(sheetId).flat();
9234
- return (env.model.getters.getNumberCols(sheetId) >
9235
- hiddenCols.length + env.model.getters.getElementsFromSelection("COL").length);
9236
- },
9237
- separator: true,
9238
- })
9239
- .add("unhide_columns", {
9240
- name: _lt("Unhide columns"),
9241
- sequence: 86,
9242
- action: UNHIDE_COLUMNS_ACTION,
9243
- isVisible: (env) => {
9244
- const hiddenCols = env.model.getters
9245
- .getHiddenColsGroups(env.model.getters.getActiveSheetId())
9246
- .flat();
9247
- const currentCols = env.model.getters.getElementsFromSelection("COL");
9248
- return currentCols.some((col) => hiddenCols.includes(col));
9249
- },
9250
- separator: true,
9251
- })
9252
- .add("conditional_formatting", {
9253
- name: _lt("Conditional formatting"),
9254
- sequence: 110,
9255
- action: OPEN_CF_SIDEPANEL_ACTION,
9256
- });
9227
+ execute: DELETE_CONTENT_COLUMNS_ACTION,
9228
+ };
9229
+ const deleteCells = {
9230
+ name: _lt("Delete cells"),
9231
+ isVisible: IS_ONLY_ONE_RANGE,
9232
+ };
9233
+ const deleteCellShiftUp = {
9234
+ name: _lt("Delete cell and shift up"),
9235
+ execute: DELETE_CELL_SHIFT_UP,
9236
+ };
9237
+ const deleteCellShiftLeft = {
9238
+ name: _lt("Delete cell and shift left"),
9239
+ execute: DELETE_CELL_SHIFT_LEFT,
9240
+ };
9241
+ const mergeCells = {
9242
+ name: _lt("Merge cells"),
9243
+ isEnabled: (env) => !cannotMerge(env),
9244
+ isActive: (env) => isInMerge(env),
9245
+ execute: (env) => toggleMerge(env),
9246
+ icon: "o-spreadsheet-Icon.MERGE_CELL",
9247
+ };
9248
+ function cannotMerge(env) {
9249
+ const zones = env.model.getters.getSelectedZones();
9250
+ const { top, left, right, bottom } = env.model.getters.getSelectedZone();
9251
+ const { sheetId } = env.model.getters.getActivePosition();
9252
+ const { xSplit, ySplit } = env.model.getters.getPaneDivisions(sheetId);
9253
+ return (zones.length > 1 ||
9254
+ (top === bottom && left === right) ||
9255
+ (left < xSplit && xSplit <= right) ||
9256
+ (top < ySplit && ySplit <= bottom));
9257
+ }
9258
+ function isInMerge(env) {
9259
+ if (!cannotMerge(env)) {
9260
+ const zones = env.model.getters.getSelectedZones();
9261
+ const { col, row, sheetId } = env.model.getters.getActivePosition();
9262
+ const zone = env.model.getters.expandZone(sheetId, positionToZone({ col, row }));
9263
+ return isEqual(zones[0], zone);
9264
+ }
9265
+ return false;
9266
+ }
9267
+ function toggleMerge(env) {
9268
+ if (cannotMerge(env)) {
9269
+ return;
9270
+ }
9271
+ const zones = env.model.getters.getSelectedZones();
9272
+ const target = [zones[zones.length - 1]];
9273
+ const sheetId = env.model.getters.getActiveSheetId();
9274
+ if (isInMerge(env)) {
9275
+ env.model.dispatch("REMOVE_MERGE", { sheetId, target });
9276
+ }
9277
+ else {
9278
+ interactiveAddMerge(env, sheetId, target);
9279
+ }
9280
+ }
9257
9281
 
9258
- const rowMenuRegistry = new MenuItemRegistry();
9259
- rowMenuRegistry
9260
- .add("cut", {
9261
- name: _lt("Cut"),
9262
- sequence: 10,
9263
- description: "Ctrl+X",
9264
- action: CUT_ACTION,
9265
- })
9266
- .add("copy", {
9267
- name: _lt("Copy"),
9268
- description: "Ctrl+C",
9269
- sequence: 20,
9270
- isReadonlyAllowed: true,
9271
- action: COPY_ACTION,
9272
- })
9273
- .add("paste", {
9274
- name: _lt("Paste"),
9275
- description: "Ctrl+V",
9276
- sequence: 30,
9277
- action: PASTE_ACTION,
9278
- })
9279
- .add("paste_special", {
9280
- name: _lt("Paste special"),
9281
- sequence: 40,
9282
- separator: true,
9283
- isVisible: IS_NOT_CUT_OPERATION,
9284
- })
9285
- .addChild("paste_value_only", ["paste_special"], {
9286
- name: _lt("Paste value only"),
9287
- sequence: 10,
9288
- action: PASTE_VALUE_ACTION,
9289
- })
9290
- .addChild("paste_format_only", ["paste_special"], {
9291
- name: _lt("Paste format only"),
9292
- sequence: 20,
9293
- action: PASTE_FORMAT_ACTION,
9294
- })
9295
- .add("add_row_before", {
9296
- name: ROW_INSERT_ROWS_BEFORE_NAME,
9297
- sequence: 50,
9298
- action: INSERT_ROWS_BEFORE_ACTION,
9299
- })
9300
- .add("add_row_after", {
9301
- name: ROW_INSERT_ROWS_AFTER_NAME,
9302
- sequence: 60,
9303
- action: INSERT_ROWS_AFTER_ACTION,
9304
- })
9305
- .add("delete_row", {
9306
- name: REMOVE_ROWS_NAME,
9307
- sequence: 70,
9308
- action: REMOVE_ROWS_ACTION,
9309
- })
9310
- .add("clear_row", {
9311
- name: DELETE_CONTENT_ROWS_NAME,
9312
- sequence: 80,
9313
- action: DELETE_CONTENT_ROWS_ACTION,
9314
- })
9315
- .add("hide_rows", {
9316
- name: HIDE_ROWS_NAME,
9317
- sequence: 85,
9318
- action: HIDE_ROWS_ACTION,
9319
- isVisible: (env) => {
9320
- const sheetId = env.model.getters.getActiveSheetId();
9321
- const hiddenRows = env.model.getters.getHiddenRowsGroups(sheetId).flat();
9322
- return (env.model.getters.getNumberRows(sheetId) >
9323
- hiddenRows.length + env.model.getters.getElementsFromSelection("ROW").length);
9324
- },
9325
- separator: true,
9326
- })
9327
- .add("unhide_rows", {
9328
- name: _lt("Unhide rows"),
9329
- sequence: 86,
9330
- action: UNHIDE_ROWS_ACTION,
9331
- isVisible: (env) => {
9332
- const hiddenRows = env.model.getters
9333
- .getHiddenRowsGroups(env.model.getters.getActiveSheetId())
9334
- .flat();
9335
- const currentRows = env.model.getters.getElementsFromSelection("ROW");
9336
- return currentRows.some((col) => hiddenRows.includes(col));
9337
- },
9338
- separator: true,
9339
- })
9340
- .add("conditional_formatting", {
9341
- name: _lt("Conditional formatting"),
9342
- sequence: 90,
9343
- action: OPEN_CF_SIDEPANEL_ACTION,
9282
+ var ACTION_EDIT = /*#__PURE__*/Object.freeze({
9283
+ __proto__: null,
9284
+ undo: undo,
9285
+ redo: redo,
9286
+ copy: copy,
9287
+ cut: cut,
9288
+ paste: paste,
9289
+ pasteSpecial: pasteSpecial,
9290
+ pasteSpecialValue: pasteSpecialValue,
9291
+ pasteSpecialFormat: pasteSpecialFormat,
9292
+ findAndReplace: findAndReplace,
9293
+ deleteValues: deleteValues,
9294
+ deleteRows: deleteRows,
9295
+ deleteRow: deleteRow,
9296
+ clearRows: clearRows,
9297
+ deleteCols: deleteCols,
9298
+ deleteCol: deleteCol,
9299
+ clearCols: clearCols,
9300
+ deleteCells: deleteCells,
9301
+ deleteCellShiftUp: deleteCellShiftUp,
9302
+ deleteCellShiftLeft: deleteCellShiftLeft,
9303
+ mergeCells: mergeCells
9344
9304
  });
9345
9305
 
9346
- function getSheetMenuRegistry(args) {
9347
- const sheetMenuRegistry = new MenuItemRegistry();
9348
- sheetMenuRegistry
9349
- .add("delete", {
9350
- name: _lt("Delete"),
9351
- sequence: 10,
9352
- isVisible: (env) => {
9353
- return env.model.getters.getSheetIds().length > 1;
9354
- },
9355
- action: (env) => env.askConfirmation(_lt("Are you sure you want to delete this sheet ?"), () => {
9356
- env.model.dispatch("DELETE_SHEET", { sheetId: env.model.getters.getActiveSheetId() });
9357
- }),
9358
- })
9359
- .add("duplicate", {
9360
- name: _lt("Duplicate"),
9361
- sequence: 20,
9362
- action: (env) => {
9363
- const sheetIdFrom = env.model.getters.getActiveSheetId();
9364
- const sheetIdTo = env.model.uuidGenerator.uuidv4();
9365
- env.model.dispatch("DUPLICATE_SHEET", {
9366
- sheetId: sheetIdFrom,
9367
- sheetIdTo,
9368
- });
9369
- env.model.dispatch("ACTIVATE_SHEET", { sheetIdFrom, sheetIdTo });
9370
- },
9371
- })
9372
- .add("rename", {
9373
- name: _lt("Rename"),
9374
- sequence: 30,
9375
- action: () => args.renameSheetCallback(),
9376
- })
9377
- .add("move_right", {
9378
- name: _lt("Move right"),
9379
- sequence: 40,
9380
- isVisible: (env) => {
9381
- const sheetId = env.model.getters.getActiveSheetId();
9382
- const sheetIds = env.model.getters.getVisibleSheetIds();
9383
- return sheetIds.indexOf(sheetId) !== sheetIds.length - 1;
9384
- },
9385
- action: (env) => env.model.dispatch("MOVE_SHEET", {
9386
- sheetId: env.model.getters.getActiveSheetId(),
9387
- delta: 1,
9388
- }),
9389
- })
9390
- .add("move_left", {
9391
- name: _lt("Move left"),
9392
- sequence: 50,
9393
- isVisible: (env) => {
9394
- const sheetId = env.model.getters.getActiveSheetId();
9395
- return env.model.getters.getVisibleSheetIds()[0] !== sheetId;
9396
- },
9397
- action: (env) => env.model.dispatch("MOVE_SHEET", {
9398
- sheetId: env.model.getters.getActiveSheetId(),
9399
- delta: -1,
9400
- }),
9401
- })
9402
- .add("hide_sheet", {
9403
- name: _lt("Hide sheet"),
9404
- sequence: 60,
9405
- isVisible: (env) => env.model.getters.getVisibleSheetIds().length !== 1,
9406
- action: (env) => env.model.dispatch("HIDE_SHEET", { sheetId: env.model.getters.getActiveSheetId() }),
9407
- });
9408
- return sheetMenuRegistry;
9409
- }
9410
-
9411
9306
  //------------------------------------------------------------------------------
9412
9307
  // Arg description DSL
9413
9308
  //------------------------------------------------------------------------------
@@ -16168,6 +16063,593 @@ for (let category of categories) {
16168
16063
  }
16169
16064
  }
16170
16065
 
16066
+ const rowInsertRowBefore = {
16067
+ name: ROW_INSERT_ROWS_BEFORE_NAME,
16068
+ execute: INSERT_ROWS_BEFORE_ACTION,
16069
+ };
16070
+ const topBarInsertRowsBefore = {
16071
+ ...rowInsertRowBefore,
16072
+ name: MENU_INSERT_ROWS_BEFORE_NAME,
16073
+ isVisible: (env) => env.model.getters.getActiveCols().size === 0,
16074
+ };
16075
+ const cellInsertRowsBefore = {
16076
+ ...rowInsertRowBefore,
16077
+ name: CELL_INSERT_ROWS_BEFORE_NAME,
16078
+ isVisible: IS_ONLY_ONE_RANGE,
16079
+ };
16080
+ const rowInsertRowsAfter = {
16081
+ execute: INSERT_ROWS_AFTER_ACTION,
16082
+ name: ROW_INSERT_ROWS_AFTER_NAME,
16083
+ };
16084
+ const topBarInsertRowsAfter = {
16085
+ ...rowInsertRowsAfter,
16086
+ name: MENU_INSERT_ROWS_AFTER_NAME,
16087
+ isVisible: (env) => env.model.getters.getActiveCols().size === 0,
16088
+ };
16089
+ const colInsertColsBefore = {
16090
+ name: COLUMN_INSERT_COLUMNS_BEFORE_NAME,
16091
+ execute: INSERT_COLUMNS_BEFORE_ACTION,
16092
+ };
16093
+ const topBarInsertColsBefore = {
16094
+ ...colInsertColsBefore,
16095
+ name: MENU_INSERT_COLUMNS_BEFORE_NAME,
16096
+ isVisible: (env) => env.model.getters.getActiveRows().size === 0,
16097
+ };
16098
+ const cellInsertColsBefore = {
16099
+ ...colInsertColsBefore,
16100
+ name: CELL_INSERT_COLUMNS_BEFORE_NAME,
16101
+ isVisible: IS_ONLY_ONE_RANGE,
16102
+ };
16103
+ const colInsertColsAfter = {
16104
+ name: COLUMN_INSERT_COLUMNS_AFTER_NAME,
16105
+ execute: INSERT_COLUMNS_AFTER_ACTION,
16106
+ };
16107
+ const topBarInsertColsAfter = {
16108
+ ...colInsertColsAfter,
16109
+ name: MENU_INSERT_COLUMNS_AFTER_NAME,
16110
+ execute: INSERT_COLUMNS_AFTER_ACTION,
16111
+ isVisible: (env) => env.model.getters.getActiveRows().size === 0,
16112
+ };
16113
+ const insertCell = {
16114
+ name: _lt("Insert cells"),
16115
+ isVisible: IS_ONLY_ONE_RANGE,
16116
+ };
16117
+ const insertCellShiftDown = {
16118
+ name: _lt("Insert cells and shift down"),
16119
+ execute: INSERT_CELL_SHIFT_DOWN,
16120
+ };
16121
+ const insertCellShiftRight = {
16122
+ name: _lt("Insert cells and shift right"),
16123
+ execute: INSERT_CELL_SHIFT_RIGHT,
16124
+ };
16125
+ const insertChart = {
16126
+ name: _lt("Chart"),
16127
+ execute: CREATE_CHART,
16128
+ };
16129
+ const insertImage = {
16130
+ name: _lt("Image"),
16131
+ execute: CREATE_IMAGE,
16132
+ isVisible: (env) => env.imageProvider !== undefined,
16133
+ };
16134
+ const insertFunction = {
16135
+ name: _lt("Function"),
16136
+ };
16137
+ const insertFunctionSum = {
16138
+ name: _lt("SUM"),
16139
+ execute: (env) => env.startCellEdition(`=SUM(`),
16140
+ };
16141
+ const insertFunctionAverage = {
16142
+ name: _lt("AVERAGE"),
16143
+ execute: (env) => env.startCellEdition(`=AVERAGE(`),
16144
+ };
16145
+ const insertFunctionCount = {
16146
+ name: _lt("COUNT"),
16147
+ execute: (env) => env.startCellEdition(`=COUNT(`),
16148
+ };
16149
+ const insertFunctionMax = {
16150
+ name: _lt("MAX"),
16151
+ execute: (env) => env.startCellEdition(`=MAX(`),
16152
+ };
16153
+ const insertFunctionMin = {
16154
+ name: _lt("MIN"),
16155
+ execute: (env) => env.startCellEdition(`=MIN(`),
16156
+ };
16157
+ const categorieFunctionAll = {
16158
+ name: _lt("All"),
16159
+ children: allFunctionListMenuBuilder(),
16160
+ };
16161
+ function allFunctionListMenuBuilder() {
16162
+ const fnNames = functionRegistry.getKeys();
16163
+ return createFormulaFunctions(fnNames);
16164
+ }
16165
+ const categoriesFunctionListMenuBuilder = () => {
16166
+ const functions = functionRegistry.content;
16167
+ const categories = [...new Set(functionRegistry.getAll().map((fn) => fn.category))].filter(isDefined$1);
16168
+ return categories.sort().map((category, i) => {
16169
+ const functionsInCategory = Object.keys(functions).filter((key) => functions[key].category === category);
16170
+ return {
16171
+ name: category,
16172
+ children: createFormulaFunctions(functionsInCategory),
16173
+ };
16174
+ });
16175
+ };
16176
+ const insertLink = {
16177
+ name: _lt("Link"),
16178
+ execute: INSERT_LINK,
16179
+ };
16180
+ const insertSheet = {
16181
+ name: _lt("New sheet"),
16182
+ execute: CREATE_SHEET_ACTION,
16183
+ };
16184
+ function createFormulaFunctions(fnNames) {
16185
+ return fnNames.sort().map((fnName, i) => {
16186
+ return {
16187
+ name: fnName,
16188
+ sequence: i * 10,
16189
+ execute: (env) => env.startCellEdition(`=${fnName}(`),
16190
+ };
16191
+ });
16192
+ }
16193
+
16194
+ //------------------------------------------------------------------------------
16195
+ // Context Menu Registry
16196
+ //------------------------------------------------------------------------------
16197
+ const cellMenuRegistry = new MenuItemRegistry();
16198
+ cellMenuRegistry
16199
+ .add("cut", {
16200
+ ...cut,
16201
+ sequence: 10,
16202
+ })
16203
+ .add("copy", {
16204
+ ...copy,
16205
+ sequence: 20,
16206
+ })
16207
+ .add("paste", {
16208
+ ...paste,
16209
+ sequence: 30,
16210
+ })
16211
+ .add("paste_special", {
16212
+ ...pasteSpecial,
16213
+ sequence: 40,
16214
+ separator: true,
16215
+ })
16216
+ .addChild("paste_value_only", ["paste_special"], {
16217
+ ...pasteSpecialValue,
16218
+ sequence: 10,
16219
+ })
16220
+ .addChild("paste_format_only", ["paste_special"], {
16221
+ ...pasteSpecialFormat,
16222
+ sequence: 20,
16223
+ })
16224
+ .add("add_row_before", {
16225
+ ...cellInsertRowsBefore,
16226
+ sequence: 70,
16227
+ })
16228
+ .add("add_column_before", {
16229
+ ...cellInsertColsBefore,
16230
+ sequence: 90,
16231
+ })
16232
+ .add("insert_cell", {
16233
+ ...insertCell,
16234
+ sequence: 100,
16235
+ separator: true,
16236
+ })
16237
+ .addChild("insert_cell_down", ["insert_cell"], {
16238
+ ...insertCellShiftDown,
16239
+ name: _lt("Shift down"),
16240
+ sequence: 10,
16241
+ })
16242
+ .addChild("insert_cell_right", ["insert_cell"], {
16243
+ ...insertCellShiftRight,
16244
+ name: _lt("Shift right"),
16245
+ sequence: 20,
16246
+ })
16247
+ .add("delete_row", {
16248
+ ...deleteRow,
16249
+ sequence: 110,
16250
+ })
16251
+ .add("delete_column", {
16252
+ ...deleteCol,
16253
+ sequence: 120,
16254
+ })
16255
+ .add("delete_cell", {
16256
+ ...deleteCells,
16257
+ sequence: 130,
16258
+ })
16259
+ .addChild("delete_cell_up", ["delete_cell"], {
16260
+ ...deleteCellShiftUp,
16261
+ name: _lt("Shift up"),
16262
+ sequence: 10,
16263
+ })
16264
+ .addChild("delete_cell_left", ["delete_cell"], {
16265
+ ...deleteCellShiftLeft,
16266
+ name: _lt("Shift left"),
16267
+ sequence: 20,
16268
+ })
16269
+ .add("insert_link", {
16270
+ ...insertLink,
16271
+ name: _lt("Insert link"),
16272
+ sequence: 150,
16273
+ separator: true,
16274
+ });
16275
+
16276
+ const sortRange = {
16277
+ name: _lt("Sort range"),
16278
+ isVisible: IS_ONLY_ONE_RANGE,
16279
+ };
16280
+ const sortAscending = {
16281
+ name: _lt("Ascending (A ⟶ Z)"),
16282
+ execute: SORT_CELLS_ASCENDING,
16283
+ };
16284
+ const sortDescending = {
16285
+ name: _lt("Descending (Z ⟶ A)"),
16286
+ execute: SORT_CELLS_DESCENDING,
16287
+ };
16288
+ const addDataFilter = {
16289
+ name: _lt("Create filter"),
16290
+ execute: FILTERS_CREATE_FILTER_TABLE,
16291
+ isVisible: (env) => !SELECTION_CONTAINS_FILTER(env),
16292
+ isEnabled: (env) => SELECTION_IS_CONTINUOUS(env),
16293
+ icon: "o-spreadsheet-Icon.FILTER_ICON_INACTIVE",
16294
+ };
16295
+ const removeDataFilter = {
16296
+ name: _lt("Remove filter"),
16297
+ execute: FILTERS_REMOVE_FILTER_TABLE,
16298
+ isVisible: SELECTION_CONTAINS_FILTER,
16299
+ icon: "o-spreadsheet-Icon.FILTER_ICON_INACTIVE",
16300
+ };
16301
+
16302
+ const formatNumberAutomatic = {
16303
+ name: _lt("Automatic"),
16304
+ execute: FORMAT_AUTOMATIC_ACTION,
16305
+ isActive: (env) => isAutomaticFormatSelected(env),
16306
+ };
16307
+ const formatNumberNumber = {
16308
+ name: _lt("Number"),
16309
+ description: "1,000.12",
16310
+ execute: FORMAT_NUMBER_ACTION,
16311
+ isActive: (env) => isFormatSelected(env, "#,##0.00"),
16312
+ };
16313
+ const formatPercent = {
16314
+ name: _lt("Format as percent"),
16315
+ execute: FORMAT_PERCENT_ACTION,
16316
+ icon: "o-spreadsheet-Icon.PERCENT",
16317
+ };
16318
+ const formatNumberPercent = {
16319
+ name: _lt("Percent"),
16320
+ description: "10.12%",
16321
+ execute: FORMAT_PERCENT_ACTION,
16322
+ isActive: (env) => isFormatSelected(env, "0.00%"),
16323
+ };
16324
+ const formatNumberCurrency = {
16325
+ name: _lt("Currency"),
16326
+ description: "$1,000.12",
16327
+ execute: FORMAT_CURRENCY_ACTION,
16328
+ isActive: (env) => isFormatSelected(env, "[$$]#,##0.00"),
16329
+ };
16330
+ const formatNumberCurrencyRounded = {
16331
+ name: _lt("Currency rounded"),
16332
+ description: "$1,000",
16333
+ execute: FORMAT_CURRENCY_ROUNDED_ACTION,
16334
+ isActive: (env) => isFormatSelected(env, "[$$]#,##0"),
16335
+ };
16336
+ const formatCustomCurrency = {
16337
+ name: _lt("Custom currency"),
16338
+ isVisible: (env) => env.loadCurrencies !== undefined,
16339
+ execute: OPEN_CUSTOM_CURRENCY_SIDEPANEL_ACTION,
16340
+ };
16341
+ const formatNumberDate = {
16342
+ name: _lt("Date"),
16343
+ description: "9/26/2008",
16344
+ execute: FORMAT_DATE_ACTION,
16345
+ isActive: (env) => isFormatSelected(env, "m/d/yyyy"),
16346
+ };
16347
+ const formatNumberTime = {
16348
+ name: _lt("Time"),
16349
+ description: "10:43:00 PM",
16350
+ execute: FORMAT_TIME_ACTION,
16351
+ isActive: (env) => isFormatSelected(env, "hh:mm:ss a"),
16352
+ };
16353
+ const formatNumberDateTime = {
16354
+ name: _lt("Date time"),
16355
+ description: "9/26/2008 22:43:00",
16356
+ execute: FORMAT_DATE_TIME_ACTION,
16357
+ isActive: (env) => isFormatSelected(env, "m/d/yyyy hh:mm:ss"),
16358
+ };
16359
+ const formatNumberDuration = {
16360
+ name: _lt("Duration"),
16361
+ description: "27:51:38",
16362
+ execute: FORMAT_DURATION_ACTION,
16363
+ isActive: (env) => isFormatSelected(env, "hhhh:mm:ss"),
16364
+ };
16365
+ const incraseDecimalPlaces = {
16366
+ name: _lt("Increase decimal places"),
16367
+ icon: "o-spreadsheet-Icon.INCREASE_DECIMAL",
16368
+ execute: (env) => env.model.dispatch("SET_DECIMAL", {
16369
+ sheetId: env.model.getters.getActiveSheetId(),
16370
+ target: env.model.getters.getSelectedZones(),
16371
+ step: 1,
16372
+ }),
16373
+ };
16374
+ const decraseDecimalPlaces = {
16375
+ name: _lt("Decrease decimal places"),
16376
+ icon: "o-spreadsheet-Icon.DECRASE_DECIMAL",
16377
+ execute: (env) => env.model.dispatch("SET_DECIMAL", {
16378
+ sheetId: env.model.getters.getActiveSheetId(),
16379
+ target: env.model.getters.getSelectedZones(),
16380
+ step: -1,
16381
+ }),
16382
+ };
16383
+ const formatBold = {
16384
+ name: _lt("Bold"),
16385
+ description: "Ctrl+B",
16386
+ execute: FORMAT_BOLD_ACTION,
16387
+ icon: "o-spreadsheet-Icon.BOLD",
16388
+ isActive: (env) => !!env.model.getters.getCurrentStyle().bold,
16389
+ };
16390
+ const formatItalic = {
16391
+ name: _lt("Italic"),
16392
+ description: "Ctrl+I",
16393
+ execute: FORMAT_ITALIC_ACTION,
16394
+ icon: "o-spreadsheet-Icon.ITALIC",
16395
+ isActive: (env) => !!env.model.getters.getCurrentStyle().italic,
16396
+ };
16397
+ const formatUnderline = {
16398
+ name: _lt("Underline"),
16399
+ description: "Ctrl+U",
16400
+ execute: FORMAT_UNDERLINE_ACTION,
16401
+ icon: "o-spreadsheet-Icon.UNDERLINE",
16402
+ isActive: (env) => !!env.model.getters.getCurrentStyle().underline,
16403
+ };
16404
+ const formatStrikethrough = {
16405
+ name: _lt("Strikethrough"),
16406
+ execute: FORMAT_STRIKETHROUGH_ACTION,
16407
+ icon: "o-spreadsheet-Icon.STRIKE",
16408
+ isActive: (env) => !!env.model.getters.getCurrentStyle().strikethrough,
16409
+ };
16410
+ const formatFontSize = {
16411
+ name: _lt("Font size"),
16412
+ children: fontSizeMenuBuilder(),
16413
+ };
16414
+ const formatAlignment = {
16415
+ name: _lt("Alignment"),
16416
+ icon: "o-spreadsheet-Icon.ALIGN_LEFT",
16417
+ };
16418
+ const formatAlignmentHorizontal = {
16419
+ name: _lt("Horizontal align"),
16420
+ icon: "o-spreadsheet-Icon.ALIGN_LEFT",
16421
+ };
16422
+ const formatAlignmentLeft = {
16423
+ name: _lt("Left"),
16424
+ execute: (env) => setStyle(env, { align: "left" }),
16425
+ isActive: (env) => getHorizontalAlign(env) === "left",
16426
+ icon: "o-spreadsheet-Icon.ALIGN_LEFT",
16427
+ };
16428
+ const formatAlignmentCenter = {
16429
+ name: _lt("Center"),
16430
+ execute: (env) => setStyle(env, { align: "center" }),
16431
+ isActive: (env) => getHorizontalAlign(env) === "center",
16432
+ icon: "o-spreadsheet-Icon.ALIGN_CENTER",
16433
+ };
16434
+ const formatAlignmentRight = {
16435
+ name: _lt("Right"),
16436
+ execute: (env) => setStyle(env, { align: "right" }),
16437
+ isActive: (env) => getHorizontalAlign(env) === "right",
16438
+ icon: "o-spreadsheet-Icon.ALIGN_RIGHT",
16439
+ };
16440
+ const formatAlignmentVertical = {
16441
+ name: _lt("Vertical align"),
16442
+ icon: "o-spreadsheet-Icon.ALIGN_MIDDLE",
16443
+ };
16444
+ const formatAlignmentTop = {
16445
+ name: _lt("Top"),
16446
+ execute: (env) => setStyle(env, { verticalAlign: "top" }),
16447
+ isActive: (env) => (env.model.getters.getCurrentStyle().verticalAlign || DEFAULT_VERTICAL_ALIGN) === "top",
16448
+ icon: "o-spreadsheet-Icon.ALIGN_TOP",
16449
+ };
16450
+ const formatAlignmentMiddle = {
16451
+ name: _lt("Middle"),
16452
+ execute: (env) => setStyle(env, { verticalAlign: "middle" }),
16453
+ isActive: (env) => (env.model.getters.getCurrentStyle().verticalAlign || DEFAULT_VERTICAL_ALIGN) === "middle",
16454
+ icon: "o-spreadsheet-Icon.ALIGN_MIDDLE",
16455
+ };
16456
+ const formatAlignmentBottom = {
16457
+ name: _lt("Bottom"),
16458
+ execute: (env) => setStyle(env, { verticalAlign: "bottom" }),
16459
+ isActive: (env) => (env.model.getters.getCurrentStyle().verticalAlign || DEFAULT_VERTICAL_ALIGN) === "bottom",
16460
+ icon: "o-spreadsheet-Icon.ALIGN_BOTTOM",
16461
+ };
16462
+ const formatWrapping = {
16463
+ name: _lt("Wrapping"),
16464
+ icon: "o-spreadsheet-Icon.WRAPPING_OVERFLOW",
16465
+ };
16466
+ const formatWrappingOverflow = {
16467
+ name: _lt("Overflow"),
16468
+ execute: (env) => setStyle(env, { wrapping: "overflow" }),
16469
+ isActive: (env) => (env.model.getters.getCurrentStyle().wrapping || "overflow") === "overflow",
16470
+ icon: "o-spreadsheet-Icon.WRAPPING_OVERFLOW",
16471
+ };
16472
+ const formatWrappingWrap = {
16473
+ name: _lt("Wrap"),
16474
+ execute: (env) => setStyle(env, { wrapping: "wrap" }),
16475
+ isActive: (env) => env.model.getters.getCurrentStyle().wrapping === "wrap",
16476
+ icon: "o-spreadsheet-Icon.WRAPPING_WRAP",
16477
+ };
16478
+ const formatWrappingClip = {
16479
+ name: _lt("Clip"),
16480
+ execute: (env) => setStyle(env, { wrapping: "clip" }),
16481
+ isActive: (env) => env.model.getters.getCurrentStyle().wrapping === "clip",
16482
+ icon: "o-spreadsheet-Icon.WRAPPING_CLIP",
16483
+ };
16484
+ const textColor = {
16485
+ name: _lt("Text Color"),
16486
+ icon: "o-spreadsheet-Icon.TEXT_COLOR",
16487
+ };
16488
+ const fillColor = {
16489
+ name: _lt("Fill Color"),
16490
+ icon: "o-spreadsheet-Icon.FILL_COLOR",
16491
+ };
16492
+ const formatCF = {
16493
+ name: _lt("Conditional formatting"),
16494
+ execute: OPEN_CF_SIDEPANEL_ACTION,
16495
+ };
16496
+ const paintFormat = {
16497
+ name: _lt("Paint Format"),
16498
+ execute: (env) => env.model.dispatch("ACTIVATE_PAINT_FORMAT", {
16499
+ target: env.model.getters.getSelectedZones(),
16500
+ }),
16501
+ icon: "o-spreadsheet-Icon.PAINT_FORMAT",
16502
+ isActive: (env) => env.model.getters.isPaintingFormat(),
16503
+ };
16504
+ const clearFormat = {
16505
+ name: _lt("Clear formatting"),
16506
+ execute: FORMAT_CLEARFORMAT_ACTION,
16507
+ icon: "o-spreadsheet-Icon.CLEAR_FORMAT",
16508
+ };
16509
+ const borders = {
16510
+ name: _lt("Borders"),
16511
+ icon: "o-spreadsheet-Icon.BORDERS",
16512
+ };
16513
+ const bordersAll = {
16514
+ name: _lt("All borders"),
16515
+ execute: (env) => setBorder(env, "all"),
16516
+ icon: "o-spreadsheet-Icon.BORDERS",
16517
+ };
16518
+ const bordersInner = {
16519
+ name: _lt("Inner borders"),
16520
+ execute: (env) => setBorder(env, "hv"),
16521
+ icon: "o-spreadsheet-Icon.BORDER_HV",
16522
+ };
16523
+ const bordersHorizontal = {
16524
+ name: _lt("Horizontal borders"),
16525
+ execute: (env) => setBorder(env, "h"),
16526
+ icon: "o-spreadsheet-Icon.BORDER_H",
16527
+ };
16528
+ const bordersVertical = {
16529
+ name: _lt("Vertical borders"),
16530
+ execute: (env) => setBorder(env, "v"),
16531
+ icon: "o-spreadsheet-Icon.BORDER_V",
16532
+ };
16533
+ const bordersExternal = {
16534
+ name: _lt("External borders"),
16535
+ execute: (env) => setBorder(env, "external"),
16536
+ icon: "o-spreadsheet-Icon.BORDER_EXTERNAL",
16537
+ };
16538
+ const bordersLeft = {
16539
+ name: _lt("Left borders"),
16540
+ execute: (env) => setBorder(env, "left"),
16541
+ icon: "o-spreadsheet-Icon.BORDER_LEFT",
16542
+ };
16543
+ const bordersTop = {
16544
+ name: _lt("Top borders"),
16545
+ execute: (env) => setBorder(env, "top"),
16546
+ icon: "o-spreadsheet-Icon.BORDER_TOP",
16547
+ };
16548
+ const bordersRight = {
16549
+ name: _lt("Right borders"),
16550
+ execute: (env) => setBorder(env, "right"),
16551
+ icon: "o-spreadsheet-Icon.BORDER_RIGHT",
16552
+ };
16553
+ const bordersBottom = {
16554
+ name: _lt("Bottom borders"),
16555
+ execute: (env) => setBorder(env, "bottom"),
16556
+ icon: "o-spreadsheet-Icon.BORDER_BOTTOM",
16557
+ };
16558
+ const bordersClear = {
16559
+ name: _lt("Clear borders"),
16560
+ execute: (env) => setBorder(env, "clear"),
16561
+ icon: "o-spreadsheet-Icon.BORDER_CLEAR",
16562
+ };
16563
+ function fontSizeMenuBuilder() {
16564
+ return FONT_SIZES.map((fs) => {
16565
+ return {
16566
+ name: fs.toString(),
16567
+ sequence: fs,
16568
+ id: `font_size_${fs}`,
16569
+ execute: (env) => setStyle(env, { fontSize: fs }),
16570
+ isActive: (env) => isFontSizeSelected(env, fs),
16571
+ };
16572
+ });
16573
+ }
16574
+ function isAutomaticFormatSelected(env) {
16575
+ const activeCell = env.model.getters.getActiveCell();
16576
+ return !activeCell || !activeCell.format;
16577
+ }
16578
+ function isFormatSelected(env, format) {
16579
+ const activeCell = env.model.getters.getActiveCell();
16580
+ return activeCell && activeCell.format === format;
16581
+ }
16582
+ function isFontSizeSelected(env, fontSize) {
16583
+ const currentFontSize = env.model.getters.getCurrentStyle().fontSize || DEFAULT_FONT_SIZE;
16584
+ return currentFontSize === fontSize;
16585
+ }
16586
+ function setBorder(env, command) {
16587
+ env.model.dispatch("SET_FORMATTING", {
16588
+ sheetId: env.model.getters.getActiveSheetId(),
16589
+ target: env.model.getters.getSelectedZones(),
16590
+ border: command,
16591
+ });
16592
+ }
16593
+ function getHorizontalAlign(env) {
16594
+ const style = env.model.getters.getCurrentStyle();
16595
+ if (style.align) {
16596
+ return style.align;
16597
+ }
16598
+ const cell = env.model.getters.getActiveCell();
16599
+ return cell.defaultAlign;
16600
+ }
16601
+
16602
+ var ACTION_FORMAT = /*#__PURE__*/Object.freeze({
16603
+ __proto__: null,
16604
+ formatNumberAutomatic: formatNumberAutomatic,
16605
+ formatNumberNumber: formatNumberNumber,
16606
+ formatPercent: formatPercent,
16607
+ formatNumberPercent: formatNumberPercent,
16608
+ formatNumberCurrency: formatNumberCurrency,
16609
+ formatNumberCurrencyRounded: formatNumberCurrencyRounded,
16610
+ formatCustomCurrency: formatCustomCurrency,
16611
+ formatNumberDate: formatNumberDate,
16612
+ formatNumberTime: formatNumberTime,
16613
+ formatNumberDateTime: formatNumberDateTime,
16614
+ formatNumberDuration: formatNumberDuration,
16615
+ incraseDecimalPlaces: incraseDecimalPlaces,
16616
+ decraseDecimalPlaces: decraseDecimalPlaces,
16617
+ formatBold: formatBold,
16618
+ formatItalic: formatItalic,
16619
+ formatUnderline: formatUnderline,
16620
+ formatStrikethrough: formatStrikethrough,
16621
+ formatFontSize: formatFontSize,
16622
+ formatAlignment: formatAlignment,
16623
+ formatAlignmentHorizontal: formatAlignmentHorizontal,
16624
+ formatAlignmentLeft: formatAlignmentLeft,
16625
+ formatAlignmentCenter: formatAlignmentCenter,
16626
+ formatAlignmentRight: formatAlignmentRight,
16627
+ formatAlignmentVertical: formatAlignmentVertical,
16628
+ formatAlignmentTop: formatAlignmentTop,
16629
+ formatAlignmentMiddle: formatAlignmentMiddle,
16630
+ formatAlignmentBottom: formatAlignmentBottom,
16631
+ formatWrapping: formatWrapping,
16632
+ formatWrappingOverflow: formatWrappingOverflow,
16633
+ formatWrappingWrap: formatWrappingWrap,
16634
+ formatWrappingClip: formatWrappingClip,
16635
+ textColor: textColor,
16636
+ fillColor: fillColor,
16637
+ formatCF: formatCF,
16638
+ paintFormat: paintFormat,
16639
+ clearFormat: clearFormat,
16640
+ borders: borders,
16641
+ bordersAll: bordersAll,
16642
+ bordersInner: bordersInner,
16643
+ bordersHorizontal: bordersHorizontal,
16644
+ bordersVertical: bordersVertical,
16645
+ bordersExternal: bordersExternal,
16646
+ bordersLeft: bordersLeft,
16647
+ bordersTop: bordersTop,
16648
+ bordersRight: bordersRight,
16649
+ bordersBottom: bordersBottom,
16650
+ bordersClear: bordersClear
16651
+ });
16652
+
16171
16653
  function interactiveFreezeColumnsRows(env, dimension, base) {
16172
16654
  const sheetId = env.model.getters.getActiveSheetId();
16173
16655
  const cmd = dimension === "COL" ? "FREEZE_COLUMNS" : "FREEZE_ROWS";
@@ -16177,524 +16659,740 @@ function interactiveFreezeColumnsRows(env, dimension, base) {
16177
16659
  }
16178
16660
  }
16179
16661
 
16180
- const topbarMenuRegistry = new MenuItemRegistry();
16181
- topbarMenuRegistry
16182
- .add("file", { name: _lt("File"), sequence: 10 })
16183
- .add("edit", { name: _lt("Edit"), sequence: 20 })
16184
- .add("view", { name: _lt("View"), sequence: 30 })
16185
- .add("insert", { name: _lt("Insert"), sequence: 40 })
16186
- .add("format", { name: _lt("Format"), sequence: 50 })
16187
- .add("data", { name: _lt("Data"), sequence: 60 })
16188
- .addChild("save", ["file"], {
16189
- name: _lt("Save"),
16190
- description: "Ctrl+S",
16191
- sequence: 10,
16192
- action: () => console.log("Not implemented"),
16193
- })
16194
- .addChild("undo", ["edit"], {
16195
- name: _lt("Undo"),
16196
- description: "Ctrl+Z",
16662
+ const hideCols = {
16663
+ name: HIDE_COLUMNS_NAME,
16664
+ execute: HIDE_COLUMNS_ACTION,
16665
+ isVisible: (env) => {
16666
+ const sheetId = env.model.getters.getActiveSheetId();
16667
+ const hiddenCols = env.model.getters.getHiddenColsGroups(sheetId).flat();
16668
+ return (env.model.getters.getNumberCols(sheetId) >
16669
+ hiddenCols.length + env.model.getters.getElementsFromSelection("COL").length);
16670
+ },
16671
+ };
16672
+ const unhideCols = {
16673
+ name: _lt("Unhide columns"),
16674
+ execute: UNHIDE_COLUMNS_ACTION,
16675
+ isVisible: (env) => {
16676
+ const hiddenCols = env.model.getters
16677
+ .getHiddenColsGroups(env.model.getters.getActiveSheetId())
16678
+ .flat();
16679
+ const currentCols = env.model.getters.getElementsFromSelection("COL");
16680
+ return currentCols.some((col) => hiddenCols.includes(col));
16681
+ },
16682
+ };
16683
+ const unhideAllCols = {
16684
+ name: _lt("Unhide all columns"),
16685
+ execute: UNHIDE_ALL_COLUMNS_ACTION,
16686
+ isVisible: (env) => env.model.getters.getHiddenColsGroups(env.model.getters.getActiveSheetId()).length > 0,
16687
+ };
16688
+ const hideRows = {
16689
+ name: HIDE_ROWS_NAME,
16690
+ execute: HIDE_ROWS_ACTION,
16691
+ isVisible: (env) => {
16692
+ const sheetId = env.model.getters.getActiveSheetId();
16693
+ const hiddenRows = env.model.getters.getHiddenRowsGroups(sheetId).flat();
16694
+ return (env.model.getters.getNumberRows(sheetId) >
16695
+ hiddenRows.length + env.model.getters.getElementsFromSelection("ROW").length);
16696
+ },
16697
+ };
16698
+ const unhideRows = {
16699
+ name: _lt("Unhide rows"),
16700
+ execute: UNHIDE_ROWS_ACTION,
16701
+ isVisible: (env) => {
16702
+ const hiddenRows = env.model.getters
16703
+ .getHiddenRowsGroups(env.model.getters.getActiveSheetId())
16704
+ .flat();
16705
+ const currentRows = env.model.getters.getElementsFromSelection("ROW");
16706
+ return currentRows.some((col) => hiddenRows.includes(col));
16707
+ },
16708
+ };
16709
+ const unhideAllRows = {
16710
+ name: _lt("Unhide all rows"),
16711
+ execute: UNHIDE_ALL_ROWS_ACTION,
16712
+ isVisible: (env) => env.model.getters.getHiddenRowsGroups(env.model.getters.getActiveSheetId()).length > 0,
16713
+ };
16714
+ const unFreezePane = {
16715
+ name: _lt("Unfreeze"),
16716
+ isVisible: (env) => {
16717
+ const { xSplit, ySplit } = env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId());
16718
+ return xSplit + ySplit > 0;
16719
+ },
16720
+ execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS_ROWS", {
16721
+ sheetId: env.model.getters.getActiveSheetId(),
16722
+ }),
16723
+ };
16724
+ const freezePane = {
16725
+ name: _lt("Freeze"),
16726
+ };
16727
+ const unFreezeRows = {
16728
+ name: _lt("No rows"),
16729
+ execute: (env) => env.model.dispatch("UNFREEZE_ROWS", {
16730
+ sheetId: env.model.getters.getActiveSheetId(),
16731
+ }),
16732
+ isReadonlyAllowed: true,
16733
+ isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).ySplit,
16734
+ };
16735
+ const freezeFirstRow = {
16736
+ name: _lt("1 row"),
16737
+ execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 1),
16738
+ isReadonlyAllowed: true,
16739
+ };
16740
+ const freezeSecondRow = {
16741
+ name: _lt("2 rows"),
16742
+ execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 2),
16743
+ isReadonlyAllowed: true,
16744
+ };
16745
+ const freezeCurrentRow = {
16746
+ name: _lt("Up to current row"),
16747
+ execute: (env) => {
16748
+ const { bottom } = env.model.getters.getSelectedZone();
16749
+ interactiveFreezeColumnsRows(env, "ROW", bottom + 1);
16750
+ },
16751
+ isReadonlyAllowed: true,
16752
+ };
16753
+ const unFreezeCols = {
16754
+ name: _lt("No columns"),
16755
+ execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS", {
16756
+ sheetId: env.model.getters.getActiveSheetId(),
16757
+ }),
16758
+ isReadonlyAllowed: true,
16759
+ isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).xSplit,
16760
+ };
16761
+ const freezeFirstCol = {
16762
+ name: _lt("1 column"),
16763
+ execute: (env) => interactiveFreezeColumnsRows(env, "COL", 1),
16764
+ isReadonlyAllowed: true,
16765
+ };
16766
+ const freezeSecondCol = {
16767
+ name: _lt("2 columns"),
16768
+ execute: (env) => interactiveFreezeColumnsRows(env, "COL", 2),
16769
+ isReadonlyAllowed: true,
16770
+ };
16771
+ const freezeCurrentCol = {
16772
+ name: _lt("Up to current column"),
16773
+ execute: (env) => {
16774
+ const { right } = env.model.getters.getSelectedZone();
16775
+ interactiveFreezeColumnsRows(env, "COL", right + 1);
16776
+ },
16777
+ isReadonlyAllowed: true,
16778
+ };
16779
+ const viewGridlines = {
16780
+ name: (env) => env.model.getters.getGridLinesVisibility(env.model.getters.getActiveSheetId())
16781
+ ? _lt("Hide gridlines")
16782
+ : _lt("Show gridlines"),
16783
+ execute: SET_GRID_LINES_VISIBILITY_ACTION,
16784
+ };
16785
+ const viewFormulas = {
16786
+ name: (env) => env.model.getters.shouldShowFormulas() ? _lt("Hide formulas") : _lt("Show formulas"),
16787
+ execute: SET_FORMULA_VISIBILITY_ACTION,
16788
+ isReadonlyAllowed: true,
16789
+ };
16790
+ const createRemoveFilter = {
16791
+ name: (env) => selectionContainsFilter(env) ? _lt("Remove selected filters") : _lt("Create filter"),
16792
+ isActive: (env) => selectionContainsFilter(env),
16793
+ isEnabled: (env) => !cannotCreateFilter(env),
16794
+ execute: (env) => createRemoveFilterAction(env),
16795
+ icon: "o-spreadsheet-Icon.FILTER_ICON_INACTIVE",
16796
+ };
16797
+ function selectionContainsFilter(env) {
16798
+ const sheetId = env.model.getters.getActiveSheetId();
16799
+ const selectedZones = env.model.getters.getSelectedZones();
16800
+ return env.model.getters.doesZonesContainFilter(sheetId, selectedZones);
16801
+ }
16802
+ function cannotCreateFilter(env) {
16803
+ return !areZonesContinuous(...env.model.getters.getSelectedZones());
16804
+ }
16805
+ function createRemoveFilterAction(env) {
16806
+ if (selectionContainsFilter(env)) {
16807
+ env.model.dispatch("REMOVE_FILTER_TABLE", {
16808
+ sheetId: env.model.getters.getActiveSheetId(),
16809
+ target: env.model.getters.getSelectedZones(),
16810
+ });
16811
+ return;
16812
+ }
16813
+ if (cannotCreateFilter(env)) {
16814
+ return;
16815
+ }
16816
+ env.model.selection.selectTableAroundSelection();
16817
+ const sheetId = env.model.getters.getActiveSheetId();
16818
+ const selection = env.model.getters.getSelectedZones();
16819
+ interactiveAddFilter(env, sheetId, selection);
16820
+ }
16821
+
16822
+ var ACTION_VIEW = /*#__PURE__*/Object.freeze({
16823
+ __proto__: null,
16824
+ hideCols: hideCols,
16825
+ unhideCols: unhideCols,
16826
+ unhideAllCols: unhideAllCols,
16827
+ hideRows: hideRows,
16828
+ unhideRows: unhideRows,
16829
+ unhideAllRows: unhideAllRows,
16830
+ unFreezePane: unFreezePane,
16831
+ freezePane: freezePane,
16832
+ unFreezeRows: unFreezeRows,
16833
+ freezeFirstRow: freezeFirstRow,
16834
+ freezeSecondRow: freezeSecondRow,
16835
+ freezeCurrentRow: freezeCurrentRow,
16836
+ unFreezeCols: unFreezeCols,
16837
+ freezeFirstCol: freezeFirstCol,
16838
+ freezeSecondCol: freezeSecondCol,
16839
+ freezeCurrentCol: freezeCurrentCol,
16840
+ viewGridlines: viewGridlines,
16841
+ viewFormulas: viewFormulas,
16842
+ createRemoveFilter: createRemoveFilter
16843
+ });
16844
+
16845
+ const colMenuRegistry = new MenuItemRegistry();
16846
+ colMenuRegistry
16847
+ .add("cut", {
16848
+ ...cut,
16197
16849
  sequence: 10,
16198
- action: UNDO_ACTION,
16199
16850
  })
16200
- .addChild("redo", ["edit"], {
16201
- name: _lt("Redo"),
16202
- description: "Ctrl+Y",
16851
+ .add("copy", {
16852
+ ...copy,
16203
16853
  sequence: 20,
16204
- action: REDO_ACTION,
16205
- separator: true,
16206
16854
  })
16207
- .addChild("copy", ["edit"], {
16208
- name: _lt("Copy"),
16209
- description: "Ctrl+C",
16855
+ .add("paste", {
16856
+ ...paste,
16210
16857
  sequence: 30,
16211
- isReadonlyAllowed: true,
16212
- action: COPY_ACTION,
16213
16858
  })
16214
- .addChild("cut", ["edit"], {
16215
- name: _lt("Cut"),
16216
- description: "Ctrl+X",
16859
+ .add("paste_special", {
16860
+ ...pasteSpecial,
16217
16861
  sequence: 40,
16218
- action: CUT_ACTION,
16862
+ separator: true,
16219
16863
  })
16220
- .addChild("paste", ["edit"], {
16221
- name: _lt("Paste"),
16222
- description: "Ctrl+V",
16223
- sequence: 50,
16224
- action: PASTE_ACTION,
16864
+ .addChild("paste_value_only", ["paste_special"], {
16865
+ ...pasteSpecialValue,
16866
+ sequence: 10,
16225
16867
  })
16226
- .addChild("paste_special", ["edit"], {
16227
- name: _lt("Paste special"),
16228
- sequence: 60,
16868
+ .addChild("paste_format_only", ["paste_special"], {
16869
+ ...pasteSpecialFormat,
16870
+ sequence: 20,
16871
+ })
16872
+ .add("sort_columns", {
16873
+ ...sortRange,
16874
+ name: (env) => env.model.getters.getActiveCols().size > 1 ? _lt("Sort columns") : _lt("Sort column"),
16875
+ sequence: 50,
16229
16876
  separator: true,
16230
- isVisible: IS_NOT_CUT_OPERATION,
16231
16877
  })
16232
- .addChild("paste_special_value", ["edit", "paste_special"], {
16233
- name: _lt("Paste value only"),
16878
+ .addChild("sort_ascending", ["sort_columns"], {
16879
+ ...sortAscending,
16234
16880
  sequence: 10,
16235
- action: PASTE_VALUE_ACTION,
16236
16881
  })
16237
- .addChild("paste_special_format", ["edit", "paste_special"], {
16238
- name: _lt("Paste format only"),
16882
+ .addChild("sort_descending", ["sort_columns"], {
16883
+ ...sortDescending,
16239
16884
  sequence: 20,
16240
- action: PASTE_FORMAT_ACTION,
16241
16885
  })
16242
- .addChild("sort_range", ["data"], {
16243
- name: _lt("Sort range"),
16244
- sequence: 20,
16245
- isVisible: IS_ONLY_ONE_RANGE,
16886
+ .add("add_column_before", {
16887
+ ...colInsertColsBefore,
16888
+ sequence: 70,
16889
+ })
16890
+ .add("add_column_after", {
16891
+ ...colInsertColsAfter,
16892
+ sequence: 80,
16893
+ })
16894
+ .add("delete_column", {
16895
+ ...deleteCols,
16896
+ sequence: 90,
16897
+ })
16898
+ .add("clear_column", {
16899
+ ...clearCols,
16900
+ sequence: 100,
16901
+ })
16902
+ .add("hide_columns", {
16903
+ ...hideCols,
16904
+ sequence: 85,
16246
16905
  separator: true,
16247
16906
  })
16248
- .addChild("sort_ascending", ["data", "sort_range"], {
16249
- name: _lt("Ascending (A ⟶ Z)"),
16907
+ .add("unhide_columns", {
16908
+ ...unhideCols,
16909
+ sequence: 86,
16910
+ separator: true,
16911
+ })
16912
+ .add("conditional_formatting", {
16913
+ ...formatCF,
16914
+ sequence: 110,
16915
+ });
16916
+
16917
+ const numberFormatMenuRegistry = new MenuItemRegistry();
16918
+ numberFormatMenuRegistry
16919
+ .add("format_number_automatic", {
16920
+ ...formatNumberAutomatic,
16250
16921
  sequence: 10,
16251
- action: SORT_CELLS_ASCENDING,
16922
+ separator: true,
16252
16923
  })
16253
- .addChild("sort_descending", ["data", "sort_range"], {
16254
- name: _lt("Descending (Z ⟶ A)"),
16924
+ .add("format_number_number", {
16925
+ ...formatNumberNumber,
16255
16926
  sequence: 20,
16256
- action: SORT_CELLS_DESCENDING,
16257
16927
  })
16258
- .addChild("find_and_replace", ["edit"], {
16259
- name: _lt("Find and replace"),
16260
- description: "Ctrl+H",
16261
- sequence: 65,
16262
- isReadonlyAllowed: true,
16263
- action: OPEN_FAR_SIDEPANEL_ACTION,
16928
+ .add("format_number_percent", {
16929
+ ...formatNumberPercent,
16930
+ sequence: 30,
16264
16931
  separator: true,
16265
16932
  })
16266
- .addChild("edit_delete_cell_values", ["edit"], {
16267
- name: _lt("Delete values"),
16268
- sequence: 70,
16269
- action: DELETE_CONTENT_ACTION,
16933
+ .add("format_number_currency", {
16934
+ ...formatNumberCurrency,
16935
+ sequence: 40,
16270
16936
  })
16271
- .addChild("edit_delete_row", ["edit"], {
16272
- name: REMOVE_ROWS_NAME,
16273
- sequence: 80,
16274
- action: REMOVE_ROWS_ACTION,
16937
+ .add("format_number_currency_rounded", {
16938
+ ...formatNumberCurrencyRounded,
16939
+ sequence: 50,
16275
16940
  })
16276
- .addChild("edit_delete_column", ["edit"], {
16277
- name: REMOVE_COLUMNS_NAME,
16278
- sequence: 90,
16279
- action: REMOVE_COLUMNS_ACTION,
16941
+ .add("format_custom_currency", {
16942
+ ...formatCustomCurrency,
16943
+ sequence: 60,
16944
+ separator: true,
16280
16945
  })
16281
- .addChild("edit_delete_cell_shift_up", ["edit"], {
16282
- name: _lt("Delete cell and shift up"),
16283
- sequence: 93,
16284
- action: DELETE_CELL_SHIFT_UP,
16946
+ .add("format_number_date", {
16947
+ ...formatNumberDate,
16948
+ sequence: 70,
16285
16949
  })
16286
- .addChild("edit_delete_cell_shift_left", ["edit"], {
16287
- name: _lt("Delete cell and shift left"),
16288
- sequence: 97,
16289
- action: DELETE_CELL_SHIFT_LEFT,
16950
+ .add("format_number_time", {
16951
+ ...formatNumberTime,
16952
+ sequence: 80,
16290
16953
  })
16291
- .addChild("edit_unhide_columns", ["edit"], {
16292
- name: _lt("Unhide all columns"),
16293
- sequence: 100,
16294
- action: UNHIDE_ALL_COLUMNS_ACTION,
16295
- isVisible: (env) => env.model.getters.getHiddenColsGroups(env.model.getters.getActiveSheetId()).length > 0,
16954
+ .add("format_number_date_time", {
16955
+ ...formatNumberDateTime,
16956
+ sequence: 90,
16296
16957
  })
16297
- .addChild("edit_unhide_rows", ["edit"], {
16298
- name: _lt("Unhide all rows"),
16958
+ .add("format_number_duration", {
16959
+ ...formatNumberDuration,
16299
16960
  sequence: 100,
16300
- action: UNHIDE_ALL_ROWS_ACTION,
16301
- isVisible: (env) => env.model.getters.getHiddenRowsGroups(env.model.getters.getActiveSheetId()).length > 0,
16302
- })
16303
- .addChild("insert_row_before", ["insert"], {
16304
- name: MENU_INSERT_ROWS_BEFORE_NAME,
16961
+ separator: true,
16962
+ });
16963
+ const formatNumberMenuItemSpec = {
16964
+ name: _lt("More formats"),
16965
+ icon: "o-spreadsheet-Icon.NUMBER_FORMATS",
16966
+ children: [() => numberFormatMenuRegistry.getAll()],
16967
+ };
16968
+
16969
+ const rowMenuRegistry = new MenuItemRegistry();
16970
+ rowMenuRegistry
16971
+ .add("cut", {
16972
+ ...cut,
16305
16973
  sequence: 10,
16306
- action: INSERT_ROWS_BEFORE_ACTION,
16307
- isVisible: (env) => env.model.getters.getActiveCols().size === 0,
16308
16974
  })
16309
- .addChild("insert_row_after", ["insert"], {
16310
- name: MENU_INSERT_ROWS_AFTER_NAME,
16975
+ .add("copy", {
16976
+ ...copy,
16311
16977
  sequence: 20,
16312
- action: INSERT_ROWS_AFTER_ACTION,
16313
- isVisible: (env) => env.model.getters.getActiveCols().size === 0,
16314
- separator: true,
16315
16978
  })
16316
- .addChild("insert_column_before", ["insert"], {
16317
- name: MENU_INSERT_COLUMNS_BEFORE_NAME,
16979
+ .add("paste", {
16980
+ ...paste,
16318
16981
  sequence: 30,
16319
- action: INSERT_COLUMNS_BEFORE_ACTION,
16320
- isVisible: (env) => env.model.getters.getActiveRows().size === 0,
16321
16982
  })
16322
- .addChild("insert_column_after", ["insert"], {
16323
- name: MENU_INSERT_COLUMNS_AFTER_NAME,
16983
+ .add("paste_special", {
16984
+ ...pasteSpecial,
16324
16985
  sequence: 40,
16325
- action: INSERT_COLUMNS_AFTER_ACTION,
16326
- isVisible: (env) => env.model.getters.getActiveRows().size === 0,
16327
16986
  separator: true,
16328
16987
  })
16329
- .addChild("insert_insert_cell_shift_down", ["insert"], {
16330
- name: _lt("Insert cells and shift down"),
16331
- sequence: 43,
16332
- action: INSERT_CELL_SHIFT_DOWN,
16988
+ .addChild("paste_value_only", ["paste_special"], {
16989
+ ...pasteSpecialValue,
16990
+ sequence: 10,
16333
16991
  })
16334
- .addChild("insert_insert_cell_shift_right", ["insert"], {
16335
- name: _lt("Insert cells and shift right"),
16336
- sequence: 47,
16337
- action: INSERT_CELL_SHIFT_RIGHT,
16338
- separator: true,
16992
+ .addChild("paste_format_only", ["paste_special"], {
16993
+ ...pasteSpecialFormat,
16994
+ sequence: 20,
16339
16995
  })
16340
- .addChild("insert_chart", ["insert"], {
16341
- name: _lt("Chart"),
16996
+ .add("add_row_before", {
16997
+ ...rowInsertRowBefore,
16342
16998
  sequence: 50,
16343
- action: CREATE_CHART,
16344
- })
16345
- .addChild("insert_image", ["insert"], {
16346
- name: _lt("Image"),
16347
- sequence: 55,
16348
- action: CREATE_IMAGE,
16349
- isVisible: (env) => env.imageProvider !== undefined,
16350
16999
  })
16351
- .addChild("insert_function", ["insert"], {
16352
- name: _lt("Function"),
17000
+ .add("add_row_after", {
17001
+ ...rowInsertRowsAfter,
16353
17002
  sequence: 60,
16354
17003
  })
16355
- .addChild("insert_function_sum", ["insert", "insert_function"], {
16356
- name: _lt("SUM"),
16357
- action: (env) => env.startCellEdition(`=SUM(`),
16358
- sequence: 0,
17004
+ .add("delete_row", {
17005
+ ...deleteRows,
17006
+ sequence: 70,
16359
17007
  })
16360
- .addChild("insert_function_average", ["insert", "insert_function"], {
16361
- name: _lt("AVERAGE"),
16362
- action: (env) => env.startCellEdition(`=AVERAGE(`),
17008
+ .add("clear_row", {
17009
+ ...clearRows,
17010
+ sequence: 80,
17011
+ })
17012
+ .add("hide_rows", {
17013
+ ...hideRows,
17014
+ sequence: 85,
17015
+ separator: true,
17016
+ })
17017
+ .add("unhide_rows", {
17018
+ ...unhideRows,
17019
+ sequence: 86,
17020
+ separator: true,
17021
+ })
17022
+ .add("conditional_formatting", {
17023
+ ...formatCF,
17024
+ sequence: 90,
17025
+ });
17026
+
17027
+ function getSheetMenuRegistry(args) {
17028
+ const sheetMenuRegistry = new MenuItemRegistry();
17029
+ sheetMenuRegistry
17030
+ .add("delete", {
17031
+ ...deleteSheet,
17032
+ sequence: 10,
17033
+ })
17034
+ .add("duplicate", {
17035
+ ...duplicateSheet,
17036
+ sequence: 20,
17037
+ })
17038
+ .add("rename", {
17039
+ ...renameSheet(args),
17040
+ sequence: 30,
17041
+ })
17042
+ .add("move_right", {
17043
+ ...sheetMoveRight,
17044
+ sequence: 40,
17045
+ })
17046
+ .add("move_left", {
17047
+ ...sheetMoveLeft,
17048
+ sequence: 50,
17049
+ })
17050
+ .add("hide_sheet", {
17051
+ ...hideSheet,
17052
+ sequence: 60,
17053
+ });
17054
+ return sheetMenuRegistry;
17055
+ }
17056
+
17057
+ const topbarMenuRegistry = new MenuItemRegistry();
17058
+ topbarMenuRegistry
17059
+ // ---------------------------------------------------------------------
17060
+ // FILE MENU ITEMS
17061
+ // ---------------------------------------------------------------------
17062
+ .add("file", {
17063
+ name: _lt("File"),
16363
17064
  sequence: 10,
16364
17065
  })
16365
- .addChild("insert_function_count", ["insert", "insert_function"], {
16366
- name: _lt("COUNT"),
16367
- action: (env) => env.startCellEdition(`=COUNT(`),
17066
+ // ---------------------------------------------------------------------
17067
+ // EDIT MENU ITEMS
17068
+ // ---------------------------------------------------------------------
17069
+ .add("edit", {
17070
+ name: _lt("Edit"),
16368
17071
  sequence: 20,
16369
17072
  })
16370
- .addChild("insert_function_max", ["insert", "insert_function"], {
16371
- name: _lt("MAX"),
16372
- action: (env) => env.startCellEdition(`=MAX(`),
17073
+ .addChild("undo", ["edit"], {
17074
+ ...undo,
17075
+ sequence: 10,
17076
+ })
17077
+ .addChild("redo", ["edit"], {
17078
+ ...redo,
17079
+ sequence: 20,
17080
+ separator: true,
17081
+ })
17082
+ .addChild("copy", ["edit"], {
17083
+ ...copy,
16373
17084
  sequence: 30,
16374
17085
  })
16375
- .addChild("insert_function_min", ["insert", "insert_function"], {
16376
- name: _lt("MIN"),
16377
- action: (env) => env.startCellEdition(`=MIN(`),
17086
+ .addChild("cut", ["edit"], {
17087
+ ...cut,
16378
17088
  sequence: 40,
16379
- separator: true,
16380
17089
  })
16381
- .addChild("categorie_function_all", ["insert", "insert_function"], {
16382
- name: _lt("All"),
17090
+ .addChild("paste", ["edit"], {
17091
+ ...paste,
16383
17092
  sequence: 50,
16384
17093
  })
16385
- .addChild("all_function_list", ["insert", "insert_function", "categorie_function_all"], () => {
16386
- const fnNames = functionRegistry.getKeys();
16387
- return createFormulaFunctionMenuItems(fnNames);
17094
+ .addChild("paste_special", ["edit"], {
17095
+ ...pasteSpecial,
17096
+ sequence: 60,
17097
+ separator: true,
16388
17098
  })
16389
- .addChild("categories_function_list", ["insert", "insert_function"], () => {
16390
- const functions = functionRegistry.content;
16391
- const categories = [...new Set(functionRegistry.getAll().map((fn) => fn.category))].filter(isDefined$1);
16392
- return categories.sort().map((category, i) => {
16393
- const functionsInCategory = Object.keys(functions).filter((key) => functions[key].category === category);
16394
- return {
16395
- name: category,
16396
- sequence: 60 + i * 10,
16397
- children: createFormulaFunctionMenuItems(functionsInCategory),
16398
- };
16399
- });
17099
+ .addChild("paste_special_value", ["edit", "paste_special"], {
17100
+ ...pasteSpecialValue,
17101
+ sequence: 10,
16400
17102
  })
16401
- .addChild("insert_link", ["insert"], {
16402
- name: _lt("Link"),
17103
+ .addChild("paste_special_format", ["edit", "paste_special"], {
17104
+ ...pasteSpecialFormat,
17105
+ sequence: 20,
17106
+ })
17107
+ .addChild("find_and_replace", ["edit"], {
17108
+ ...findAndReplace,
17109
+ sequence: 65,
16403
17110
  separator: true,
17111
+ })
17112
+ .addChild("edit_delete_cell_values", ["edit"], {
17113
+ ...deleteValues,
16404
17114
  sequence: 70,
16405
- action: INSERT_LINK,
16406
17115
  })
16407
- .addChild("insert_sheet", ["insert"], {
16408
- name: _lt("New sheet"),
17116
+ .addChild("edit_delete_row", ["edit"], {
17117
+ ...deleteRows,
16409
17118
  sequence: 80,
16410
- action: CREATE_SHEET_ACTION,
16411
- separator: true,
17119
+ })
17120
+ .addChild("edit_delete_column", ["edit"], {
17121
+ ...deleteCols,
17122
+ sequence: 90,
17123
+ })
17124
+ .addChild("edit_delete_cell_shift_up", ["edit"], {
17125
+ ...deleteCellShiftUp,
17126
+ sequence: 93,
17127
+ })
17128
+ .addChild("edit_delete_cell_shift_left", ["edit"], {
17129
+ ...deleteCellShiftLeft,
17130
+ sequence: 97,
17131
+ })
17132
+ .addChild("edit_unhide_columns", ["edit"], {
17133
+ ...unhideAllCols,
17134
+ sequence: 100,
17135
+ })
17136
+ .addChild("edit_unhide_rows", ["edit"], {
17137
+ ...unhideAllRows,
17138
+ sequence: 100,
17139
+ })
17140
+ // ---------------------------------------------------------------------
17141
+ // VIEW MENU ITEMS
17142
+ // ---------------------------------------------------------------------
17143
+ .add("view", {
17144
+ name: _lt("View"),
17145
+ sequence: 30,
16412
17146
  })
16413
17147
  .addChild("unfreeze_panes", ["view"], {
16414
- name: _lt("Unfreeze"),
17148
+ ...unFreezePane,
16415
17149
  sequence: 4,
16416
- isVisible: (env) => {
16417
- const { xSplit, ySplit } = env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId());
16418
- return xSplit + ySplit > 0;
16419
- },
16420
- action: (env) => env.model.dispatch("UNFREEZE_COLUMNS_ROWS", {
16421
- sheetId: env.model.getters.getActiveSheetId(),
16422
- }),
16423
17150
  })
16424
17151
  .addChild("freeze_panes", ["view"], {
16425
- name: _lt("Freeze"),
17152
+ ...freezePane,
16426
17153
  sequence: 5,
16427
17154
  separator: true,
16428
17155
  })
16429
17156
  .addChild("unfreeze_rows", ["view", "freeze_panes"], {
16430
- name: _lt("No rows"),
16431
- action: (env) => env.model.dispatch("UNFREEZE_ROWS", {
16432
- sheetId: env.model.getters.getActiveSheetId(),
16433
- }),
16434
- isReadonlyAllowed: true,
17157
+ ...unFreezeRows,
16435
17158
  sequence: 5,
16436
- isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).ySplit,
16437
17159
  })
16438
17160
  .addChild("freeze_first_row", ["view", "freeze_panes"], {
16439
- name: _lt("1 row"),
16440
- action: (env) => interactiveFreezeColumnsRows(env, "ROW", 1),
16441
- isReadonlyAllowed: true,
17161
+ ...freezeFirstRow,
16442
17162
  sequence: 10,
16443
17163
  })
16444
17164
  .addChild("freeze_second_row", ["view", "freeze_panes"], {
16445
- name: _lt("2 rows"),
16446
- action: (env) => interactiveFreezeColumnsRows(env, "ROW", 2),
16447
- isReadonlyAllowed: true,
17165
+ ...freezeSecondRow,
16448
17166
  sequence: 15,
16449
17167
  })
16450
17168
  .addChild("freeze_current_row", ["view", "freeze_panes"], {
16451
- name: _lt("Up to current row"),
16452
- action: (env) => {
16453
- const { bottom } = env.model.getters.getSelectedZone();
16454
- interactiveFreezeColumnsRows(env, "ROW", bottom + 1);
16455
- },
16456
- isReadonlyAllowed: true,
17169
+ ...freezeCurrentRow,
16457
17170
  sequence: 20,
16458
17171
  separator: true,
16459
17172
  })
16460
17173
  .addChild("unfreeze_columns", ["view", "freeze_panes"], {
16461
- name: _lt("No columns"),
16462
- action: (env) => env.model.dispatch("UNFREEZE_COLUMNS", {
16463
- sheetId: env.model.getters.getActiveSheetId(),
16464
- }),
16465
- isReadonlyAllowed: true,
17174
+ ...unFreezeCols,
16466
17175
  sequence: 25,
16467
- isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).xSplit,
16468
17176
  })
16469
17177
  .addChild("freeze_first_col", ["view", "freeze_panes"], {
16470
- name: _lt("1 column"),
16471
- action: (env) => interactiveFreezeColumnsRows(env, "COL", 1),
16472
- isReadonlyAllowed: true,
17178
+ ...freezeFirstCol,
16473
17179
  sequence: 30,
16474
17180
  })
16475
17181
  .addChild("freeze_second_col", ["view", "freeze_panes"], {
16476
- name: _lt("2 columns"),
16477
- action: (env) => interactiveFreezeColumnsRows(env, "COL", 2),
16478
- isReadonlyAllowed: true,
17182
+ ...freezeSecondCol,
16479
17183
  sequence: 35,
16480
17184
  })
16481
17185
  .addChild("freeze_current_col", ["view", "freeze_panes"], {
16482
- name: _lt("Up to current column"),
16483
- action: (env) => {
16484
- const { right } = env.model.getters.getSelectedZone();
16485
- interactiveFreezeColumnsRows(env, "COL", right + 1);
16486
- },
16487
- isReadonlyAllowed: true,
17186
+ ...freezeCurrentCol,
16488
17187
  sequence: 40,
16489
17188
  })
16490
17189
  .addChild("view_gridlines", ["view"], {
16491
- name: (env) => env.model.getters.getGridLinesVisibility(env.model.getters.getActiveSheetId())
16492
- ? _lt("Hide gridlines")
16493
- : _lt("Show gridlines"),
16494
- action: SET_GRID_LINES_VISIBILITY_ACTION,
17190
+ ...viewGridlines,
16495
17191
  sequence: 10,
16496
17192
  })
16497
17193
  .addChild("view_formulas", ["view"], {
16498
- name: (env) => env.model.getters.shouldShowFormulas() ? _lt("Hide formulas") : _lt("Show formulas"),
16499
- action: SET_FORMULA_VISIBILITY_ACTION,
16500
- isReadonlyAllowed: true,
17194
+ ...viewFormulas,
16501
17195
  sequence: 15,
16502
17196
  })
16503
- .addChild("format_number", ["format"], {
16504
- name: _lt("Numbers"),
16505
- sequence: 10,
16506
- separator: true,
17197
+ // ---------------------------------------------------------------------
17198
+ // INSERT MENU ITEMS
17199
+ // ---------------------------------------------------------------------
17200
+ .add("insert", {
17201
+ name: _lt("Insert"),
17202
+ sequence: 40,
16507
17203
  })
16508
- .addChild("format_number_automatic", ["format", "format_number"], {
16509
- name: NumberFormatTerms.Automatic,
17204
+ .addChild("insert_row_before", ["insert"], {
17205
+ ...topBarInsertRowsBefore,
16510
17206
  sequence: 10,
16511
- separator: true,
16512
- action: FORMAT_AUTOMATIC_ACTION,
16513
17207
  })
16514
- .addChild("format_number_number", ["format", "format_number"], {
16515
- name: NumberFormatTerms.Number,
16516
- description: "1,000.12",
17208
+ .addChild("insert_row_after", ["insert"], {
17209
+ ...topBarInsertRowsAfter,
16517
17210
  sequence: 20,
16518
- action: FORMAT_NUMBER_ACTION,
17211
+ separator: true,
16519
17212
  })
16520
- .addChild("format_number_percent", ["format", "format_number"], {
16521
- name: NumberFormatTerms.Percent,
16522
- description: "10.12%",
17213
+ .addChild("insert_column_before", ["insert"], {
17214
+ ...topBarInsertColsBefore,
16523
17215
  sequence: 30,
16524
- separator: true,
16525
- action: FORMAT_PERCENT_ACTION,
16526
17216
  })
16527
- .addChild("format_number_currency", ["format", "format_number"], {
16528
- name: NumberFormatTerms.Currency,
16529
- description: "$1,000.12",
16530
- sequence: 37,
16531
- action: FORMAT_CURRENCY_ACTION,
17217
+ .addChild("insert_column_after", ["insert"], {
17218
+ ...topBarInsertColsAfter,
17219
+ sequence: 40,
17220
+ separator: true,
16532
17221
  })
16533
- .addChild("format_number_currency_rounded", ["format", "format_number"], {
16534
- name: NumberFormatTerms.CurrencyRounded,
16535
- description: "$1,000",
16536
- sequence: 38,
16537
- action: FORMAT_CURRENCY_ROUNDED_ACTION,
17222
+ .addChild("insert_insert_cell_shift_down", ["insert"], {
17223
+ ...insertCellShiftDown,
17224
+ sequence: 43,
16538
17225
  })
16539
- .addChild("format_custom_currency", ["format", "format_number"], {
16540
- name: NumberFormatTerms.CustomCurrency,
16541
- sequence: 39,
17226
+ .addChild("insert_insert_cell_shift_right", ["insert"], {
17227
+ ...insertCellShiftRight,
17228
+ sequence: 47,
16542
17229
  separator: true,
16543
- isVisible: (env) => env.loadCurrencies !== undefined,
16544
- action: OPEN_CUSTOM_CURRENCY_SIDEPANEL_ACTION,
16545
- })
16546
- .addChild("format_number_date", ["format", "format_number"], {
16547
- name: NumberFormatTerms.Date,
16548
- description: "9/26/2008",
16549
- sequence: 40,
16550
- action: FORMAT_DATE_ACTION,
16551
17230
  })
16552
- .addChild("format_number_time", ["format", "format_number"], {
16553
- name: NumberFormatTerms.Time,
16554
- description: "10:43:00 PM",
17231
+ .addChild("insert_chart", ["insert"], {
17232
+ ...insertChart,
16555
17233
  sequence: 50,
16556
- action: FORMAT_TIME_ACTION,
16557
17234
  })
16558
- .addChild("format_number_date_time", ["format", "format_number"], {
16559
- name: NumberFormatTerms.DateTime,
16560
- description: "9/26/2008 22:43:00",
17235
+ .addChild("insert_image", ["insert"], {
17236
+ ...insertImage,
17237
+ sequence: 55,
17238
+ })
17239
+ .addChild("insert_function", ["insert"], {
17240
+ ...insertFunction,
16561
17241
  sequence: 60,
16562
- action: FORMAT_DATE_TIME_ACTION,
16563
17242
  })
16564
- .addChild("format_number_duration", ["format", "format_number"], {
16565
- name: NumberFormatTerms.Duration,
16566
- description: "27:51:38",
17243
+ .addChild("insert_function_sum", ["insert", "insert_function"], {
17244
+ ...insertFunctionSum,
17245
+ sequence: 0,
17246
+ })
17247
+ .addChild("insert_function_average", ["insert", "insert_function"], {
17248
+ ...insertFunctionAverage,
17249
+ sequence: 10,
17250
+ })
17251
+ .addChild("insert_function_count", ["insert", "insert_function"], {
17252
+ ...insertFunctionCount,
17253
+ sequence: 20,
17254
+ })
17255
+ .addChild("insert_function_max", ["insert", "insert_function"], {
17256
+ ...insertFunctionMax,
17257
+ sequence: 30,
17258
+ })
17259
+ .addChild("insert_function_min", ["insert", "insert_function"], {
17260
+ ...insertFunctionMin,
17261
+ sequence: 40,
17262
+ separator: true,
17263
+ })
17264
+ .addChild("categorie_function_all", ["insert", "insert_function"], {
17265
+ ...categorieFunctionAll,
17266
+ sequence: 50,
17267
+ })
17268
+ .addChild("categories_function_list", ["insert", "insert_function"], categoriesFunctionListMenuBuilder)
17269
+ .addChild("insert_link", ["insert"], {
17270
+ ...insertLink,
17271
+ separator: true,
16567
17272
  sequence: 70,
17273
+ })
17274
+ .addChild("insert_sheet", ["insert"], {
17275
+ ...insertSheet,
17276
+ sequence: 80,
17277
+ separator: true,
17278
+ })
17279
+ // ---------------------------------------------------------------------
17280
+ // FORMAT MENU ITEMS
17281
+ // ---------------------------------------------------------------------
17282
+ .add("format", { name: _lt("Format"), sequence: 50 })
17283
+ .addChild("format_number", ["format"], {
17284
+ ...formatNumberMenuItemSpec,
17285
+ name: _lt("Number"),
17286
+ sequence: 10,
16568
17287
  separator: true,
16569
- action: FORMAT_DURATION_ACTION,
16570
17288
  })
16571
17289
  .addChild("format_bold", ["format"], {
16572
- name: _lt("Bold"),
17290
+ ...formatBold,
16573
17291
  sequence: 20,
16574
- description: "Ctrl+B",
16575
- action: FORMAT_BOLD_ACTION,
16576
17292
  })
16577
17293
  .addChild("format_italic", ["format"], {
16578
- name: _lt("Italic"),
17294
+ ...formatItalic,
16579
17295
  sequence: 30,
16580
- description: "Ctrl+I",
16581
- action: FORMAT_ITALIC_ACTION,
16582
17296
  })
16583
17297
  .addChild("format_underline", ["format"], {
16584
- name: _lt("Underline"),
16585
- description: "Ctrl+U",
17298
+ ...formatUnderline,
16586
17299
  sequence: 40,
16587
- action: FORMAT_UNDERLINE_ACTION,
16588
17300
  })
16589
17301
  .addChild("format_strikethrough", ["format"], {
16590
- name: _lt("Strikethrough"),
17302
+ ...formatStrikethrough,
16591
17303
  sequence: 50,
16592
- action: FORMAT_STRIKETHROUGH_ACTION,
16593
17304
  separator: true,
16594
17305
  })
16595
17306
  .addChild("format_font_size", ["format"], {
16596
- name: _lt("Font size"),
17307
+ ...formatFontSize,
16597
17308
  sequence: 60,
16598
17309
  separator: true,
16599
17310
  })
16600
17311
  .addChild("format_alignment", ["format"], {
16601
- name: _lt("Alignment"),
17312
+ ...formatAlignment,
16602
17313
  sequence: 70,
16603
17314
  })
16604
17315
  .addChild("format_alignment_left", ["format", "format_alignment"], {
16605
- name: "Left",
17316
+ ...formatAlignmentLeft,
16606
17317
  sequence: 10,
16607
- action: (env) => setStyle(env, { align: "left" }),
16608
17318
  })
16609
17319
  .addChild("format_alignment_center", ["format", "format_alignment"], {
16610
- name: "Center",
17320
+ ...formatAlignmentCenter,
16611
17321
  sequence: 20,
16612
- action: (env) => setStyle(env, { align: "center" }),
16613
17322
  })
16614
17323
  .addChild("format_alignment_right", ["format", "format_alignment"], {
16615
- name: "Right",
17324
+ ...formatAlignmentRight,
16616
17325
  sequence: 30,
16617
- action: (env) => setStyle(env, { align: "right" }),
16618
17326
  separator: true,
16619
17327
  })
16620
17328
  .addChild("format_alignment_top", ["format", "format_alignment"], {
16621
- name: "Top",
17329
+ ...formatAlignmentTop,
16622
17330
  sequence: 40,
16623
- action: (env) => setStyle(env, { verticalAlign: "top" }),
16624
17331
  })
16625
17332
  .addChild("format_alignment_middle", ["format", "format_alignment"], {
16626
- name: "Middle",
17333
+ ...formatAlignmentMiddle,
16627
17334
  sequence: 50,
16628
- action: (env) => setStyle(env, { verticalAlign: "middle" }),
16629
17335
  })
16630
17336
  .addChild("format_alignment_bottom", ["format", "format_alignment"], {
16631
- name: "Bottom",
17337
+ ...formatAlignmentBottom,
16632
17338
  sequence: 60,
16633
- action: (env) => setStyle(env, { verticalAlign: "bottom" }),
16634
17339
  separator: true,
16635
17340
  })
16636
17341
  .addChild("format_wrapping", ["format"], {
16637
- name: _lt("Wrapping"),
17342
+ ...formatWrapping,
16638
17343
  sequence: 80,
16639
17344
  separator: true,
16640
17345
  })
16641
17346
  .addChild("format_wrapping_overflow", ["format", "format_wrapping"], {
16642
- name: _lt("Overflow"),
17347
+ ...formatWrappingOverflow,
16643
17348
  sequence: 10,
16644
- action: (env) => setStyle(env, { wrapping: "overflow" }),
16645
17349
  })
16646
17350
  .addChild("format_wrapping_wrap", ["format", "format_wrapping"], {
16647
- name: _lt("Wrap"),
17351
+ ...formatWrappingWrap,
16648
17352
  sequence: 20,
16649
- action: (env) => setStyle(env, { wrapping: "wrap" }),
16650
17353
  })
16651
17354
  .addChild("format_wrapping_clip", ["format", "format_wrapping"], {
16652
- name: _lt("Clip"),
17355
+ ...formatWrappingClip,
16653
17356
  sequence: 30,
16654
- action: (env) => setStyle(env, { wrapping: "clip" }),
16655
17357
  })
16656
17358
  .addChild("format_cf", ["format"], {
16657
- name: _lt("Conditional formatting"),
17359
+ ...formatCF,
16658
17360
  sequence: 90,
16659
- action: OPEN_CF_SIDEPANEL_ACTION,
16660
17361
  separator: true,
16661
17362
  })
16662
17363
  .addChild("format_clearFormat", ["format"], {
16663
- name: _lt("Clear formatting"),
17364
+ ...clearFormat,
16664
17365
  sequence: 100,
16665
- action: FORMAT_CLEARFORMAT_ACTION,
16666
17366
  separator: true,
17367
+ })
17368
+ // ---------------------------------------------------------------------
17369
+ // DATA MENU ITEMS
17370
+ // ---------------------------------------------------------------------
17371
+ .add("data", {
17372
+ name: _lt("Data"),
17373
+ sequence: 60,
17374
+ })
17375
+ .addChild("sort_range", ["data"], {
17376
+ ...sortRange,
17377
+ sequence: 20,
17378
+ separator: true,
17379
+ })
17380
+ .addChild("sort_ascending", ["data", "sort_range"], {
17381
+ ...sortAscending,
17382
+ sequence: 10,
17383
+ })
17384
+ .addChild("sort_descending", ["data", "sort_range"], {
17385
+ ...sortDescending,
17386
+ sequence: 20,
16667
17387
  })
16668
17388
  .addChild("add_data_filter", ["data"], {
16669
- name: _lt("Create filter"),
17389
+ ...addDataFilter,
16670
17390
  sequence: 10,
16671
- action: FILTERS_CREATE_FILTER_TABLE,
16672
- isVisible: (env) => !SELECTION_CONTAINS_FILTER(env),
16673
- isEnabled: (env) => SELECTION_IS_CONTINUOUS(env),
16674
17391
  })
16675
17392
  .addChild("remove_data_filter", ["data"], {
16676
- name: _lt("Remove filter"),
17393
+ ...removeDataFilter,
16677
17394
  sequence: 10,
16678
- action: FILTERS_REMOVE_FILTER_TABLE,
16679
- isVisible: SELECTION_CONTAINS_FILTER,
16680
- });
16681
- // Font-sizes
16682
- for (let fs of FONT_SIZES) {
16683
- topbarMenuRegistry.addChild(`format_font_size_${fs}`, ["format", "format_font_size"], {
16684
- name: fs.toString(),
16685
- sequence: fs,
16686
- action: (env) => setStyle(env, { fontSize: fs }),
16687
- });
16688
- }
16689
- function createFormulaFunctionMenuItems(fnNames) {
16690
- return fnNames.sort().map((fnName, i) => {
16691
- return {
16692
- name: fnName,
16693
- sequence: i * 10,
16694
- action: (env) => env.startCellEdition(`=${fnName}(`),
16695
- };
16696
- });
16697
- }
17395
+ });
16698
17396
 
16699
17397
  class OTRegistry extends Registry {
16700
17398
  /**
@@ -17277,8 +17975,9 @@ ColorPicker.props = {
17277
17975
 
17278
17976
  css /* scss */ `
17279
17977
  .o-color-picker-widget {
17280
- display: inline-block;
17978
+ display: flex;
17281
17979
  position: relative;
17980
+ align-items: center;
17282
17981
 
17283
17982
  .o-color-picker-button-style {
17284
17983
  display: flex;
@@ -17294,6 +17993,7 @@ css /* scss */ `
17294
17993
  }
17295
17994
 
17296
17995
  .o-color-picker-button {
17996
+ height: 30px;
17297
17997
  > span {
17298
17998
  border-bottom: 4px solid;
17299
17999
  height: 16px;
@@ -21312,6 +22012,10 @@ GridOverlay.props = {
21312
22012
  };
21313
22013
 
21314
22014
  class GridPopover extends Component {
22015
+ constructor() {
22016
+ super(...arguments);
22017
+ this.zIndex = ComponentsImportance.GridPopover;
22018
+ }
21315
22019
  get cellPopover() {
21316
22020
  const popover = this.env.model.getters.getCellPopover(this.props.hoveredCell);
21317
22021
  if (!popover.isOpen) {
@@ -33174,48 +33878,66 @@ class InternalViewport {
33174
33878
  this.adjustPositionY(row);
33175
33879
  }
33176
33880
  }
33177
- adjustPositionX(col) {
33881
+ adjustPositionX(targetCol) {
33178
33882
  const sheetId = this.sheetId;
33179
- const { start, end } = this.getters.getColDimensions(sheetId, col);
33180
- while (end > this.offsetX + this.offsetCorrectionX + this.viewportWidth &&
33181
- this.offsetX + this.offsetCorrectionX < start) {
33182
- this.offsetX = this.getters.getColDimensions(sheetId, this.left).end - this.offsetCorrectionX;
33183
- this.offsetScrollbarX = this.offsetX;
33184
- this.adjustViewportZoneX();
33185
- }
33186
- while (col < this.left) {
33187
- let leftCol;
33188
- for (leftCol = this.left; leftCol >= 0; leftCol--) {
33189
- if (!this.getters.isColHidden(sheetId, leftCol)) {
33883
+ const { end } = this.getters.getColDimensions(sheetId, targetCol);
33884
+ const maxCol = this.getters.getNumberCols(sheetId);
33885
+ if (this.offsetX + this.offsetCorrectionX + this.viewportWidth < end) {
33886
+ for (let col = this.left; this.offsetX + this.offsetCorrectionX + this.viewportWidth < end; col++) {
33887
+ if (col > maxCol) {
33190
33888
  break;
33191
33889
  }
33890
+ if (this.getters.isColHidden(sheetId, col)) {
33891
+ continue;
33892
+ }
33893
+ this.offsetX = this.getters.getColDimensions(sheetId, col).end - this.offsetCorrectionX;
33894
+ this.offsetScrollbarX = this.offsetX;
33895
+ this.adjustViewportZoneX();
33896
+ }
33897
+ }
33898
+ else if (this.left > targetCol) {
33899
+ for (let col = this.left; col >= targetCol; col--) {
33900
+ if (col < 0) {
33901
+ break;
33902
+ }
33903
+ if (this.getters.isColHidden(sheetId, col)) {
33904
+ continue;
33905
+ }
33906
+ this.offsetX = this.getters.getColDimensions(sheetId, col).start - this.offsetCorrectionX;
33907
+ this.offsetScrollbarX = this.offsetX;
33908
+ this.adjustViewportZoneX();
33192
33909
  }
33193
- this.offsetX =
33194
- this.getters.getColDimensions(sheetId, leftCol - 1).start - this.offsetCorrectionX;
33195
- this.offsetScrollbarX = this.offsetX;
33196
- this.adjustViewportZoneX();
33197
33910
  }
33198
33911
  }
33199
- adjustPositionY(row) {
33912
+ adjustPositionY(targetRow) {
33200
33913
  const sheetId = this.sheetId;
33201
- while (this.getters.getRowDimensions(sheetId, row).end >
33202
- this.offsetY + this.viewportHeight + this.offsetCorrectionY &&
33203
- this.offsetY + this.offsetCorrectionY < this.getters.getRowDimensions(sheetId, row).start) {
33204
- this.offsetY = this.getters.getRowDimensions(sheetId, this.top).end - this.offsetCorrectionY;
33205
- this.offsetScrollbarY = this.offsetY;
33206
- this.adjustViewportZoneY();
33207
- }
33208
- while (row < this.top) {
33209
- let topRow;
33210
- for (topRow = this.top; topRow >= 0; topRow--) {
33211
- if (!this.getters.isRowHidden(sheetId, topRow)) {
33914
+ const { end } = this.getters.getRowDimensions(sheetId, targetRow);
33915
+ const maxRow = this.getters.getNumberRows(sheetId);
33916
+ if (this.offsetY + this.viewportHeight + this.offsetCorrectionY < end) {
33917
+ for (let row = this.top; this.offsetY + this.viewportHeight + this.offsetCorrectionY < end; row++) {
33918
+ if (row > maxRow) {
33919
+ break;
33920
+ }
33921
+ if (this.getters.isRowHidden(sheetId, row)) {
33922
+ continue;
33923
+ }
33924
+ this.offsetY = this.getters.getRowDimensions(sheetId, row).end - this.offsetCorrectionY;
33925
+ this.offsetScrollbarY = this.offsetY;
33926
+ this.adjustViewportZoneY();
33927
+ }
33928
+ }
33929
+ else if (this.top > targetRow) {
33930
+ for (let row = this.top; row >= targetRow; row--) {
33931
+ if (row < 0) {
33212
33932
  break;
33213
33933
  }
33934
+ if (this.getters.isRowHidden(sheetId, row)) {
33935
+ continue;
33936
+ }
33937
+ this.offsetY = this.getters.getRowDimensions(sheetId, row).start - this.offsetCorrectionY;
33938
+ this.offsetScrollbarY = this.offsetY;
33939
+ this.adjustViewportZoneY();
33214
33940
  }
33215
- this.offsetY =
33216
- this.getters.getRowDimensions(sheetId, topRow - 1).start - this.offsetCorrectionY;
33217
- this.offsetScrollbarY = this.offsetY;
33218
- this.adjustViewportZoneY();
33219
33941
  }
33220
33942
  }
33221
33943
  setViewportOffset(offsetX, offsetY) {
@@ -33408,8 +34130,8 @@ class SheetViewPlugin extends UIPlugin {
33408
34130
  * In the absence of a component (standalone model), is it mandatory to set reasonable default values
33409
34131
  * to ensure the correct operation of this plugin.
33410
34132
  */
33411
- this.sheetViewWidth = DEFAULT_SHEETVIEW_SIZE;
33412
- this.sheetViewHeight = DEFAULT_SHEETVIEW_SIZE;
34133
+ this.sheetViewWidth = getDefaultSheetViewSize();
34134
+ this.sheetViewHeight = getDefaultSheetViewSize();
33413
34135
  this.gridOffsetX = 0;
33414
34136
  this.gridOffsetY = 0;
33415
34137
  this.sheetsWithDirtyViewports = new Set();
@@ -39840,7 +40562,7 @@ const coreViewsPluginRegistry = new Registry()
39840
40562
  const clickableCellRegistry = new Registry();
39841
40563
  clickableCellRegistry.add("link", {
39842
40564
  condition: (position, env) => !!env.model.getters.getEvaluatedCell(position).link,
39843
- action: (position, env) => openLink(env.model.getters.getEvaluatedCell(position).link, env),
40565
+ execute: (position, env) => openLink(env.model.getters.getEvaluatedCell(position).link, env),
39844
40566
  sequence: 5,
39845
40567
  });
39846
40568
 
@@ -40297,7 +41019,7 @@ class BottomBarStatistic extends Component {
40297
41019
  name: this.getComposedFnName(fnName, fnValue),
40298
41020
  sequence: i,
40299
41021
  isReadonlyAllowed: true,
40300
- action: () => {
41022
+ execute: () => {
40301
41023
  this.selectedStatisticFn = fnName;
40302
41024
  },
40303
41025
  });
@@ -40465,10 +41187,6 @@ css /* scss */ `
40465
41187
  font-size: 15px;
40466
41188
  border-top: 1px solid lightgrey;
40467
41189
 
40468
- .o-add-sheet.disabled {
40469
- cursor: not-allowed;
40470
- }
40471
-
40472
41190
  .o-sheet-item {
40473
41191
  cursor: pointer;
40474
41192
  &:hover {
@@ -40574,7 +41292,7 @@ class BottomBar extends Component {
40574
41292
  sequence: i,
40575
41293
  isReadonlyAllowed: true,
40576
41294
  textColor: sheet.isVisible ? undefined : "grey",
40577
- action: (env) => {
41295
+ execute: (env) => {
40578
41296
  env.model.dispatch("ACTIVATE_SHEET", { sheetIdFrom: from, sheetIdTo: sheetId });
40579
41297
  },
40580
41298
  });
@@ -40831,7 +41549,7 @@ class SpreadsheetDashboard extends Component {
40831
41549
  getClickableAction(position) {
40832
41550
  for (const items of clickableCellRegistry.getAll().sort((a, b) => a.sequence - b.sequence)) {
40833
41551
  if (items.condition(position, this.env)) {
40834
- return items.action;
41552
+ return items.execute;
40835
41553
  }
40836
41554
  }
40837
41555
  return false;
@@ -41059,21 +41777,66 @@ SidePanel.props = {
41059
41777
  onCloseSidePanel: Function,
41060
41778
  };
41061
41779
 
41062
- const AddMergeInteractiveContent = {
41063
- MergeIsDestructive: _lt("Merging these cells will only preserve the top-leftmost value. Merge anyway?"),
41064
- MergeInFilter: _lt("You can't merge cells inside of an existing filter."),
41065
- };
41066
- function interactiveAddMerge(env, sheetId, target) {
41067
- const result = env.model.dispatch("ADD_MERGE", { sheetId, target });
41068
- if (result.isCancelledBecause(80 /* CommandResult.MergeInFilter */)) {
41069
- env.raiseError(AddMergeInteractiveContent.MergeInFilter);
41780
+ css /* scss */ `
41781
+ .o-menu-item-button {
41782
+ display: flex;
41783
+ justify-content: center;
41784
+ align-items: center;
41785
+ margin: 2px;
41786
+ padding: 0px 3px;
41787
+ border-radius: 2px;
41788
+ min-width: 20px;
41789
+ }
41790
+ .o-disabled {
41791
+ opacity: 0.6;
41792
+ cursor: default;
41793
+ }
41794
+ `;
41795
+ class ActionButton extends Component {
41796
+ constructor() {
41797
+ super(...arguments);
41798
+ this.actionButton = createAction(this.props.action);
41070
41799
  }
41071
- else if (result.isCancelledBecause(3 /* CommandResult.MergeIsDestructive */)) {
41072
- env.askConfirmation(AddMergeInteractiveContent.MergeIsDestructive, () => {
41073
- env.model.dispatch("ADD_MERGE", { sheetId, target, force: true });
41074
- });
41800
+ setup() {
41801
+ onWillUpdateProps(() => (this.actionButton = createAction(this.props.action)));
41075
41802
  }
41076
- }
41803
+ get isVisible() {
41804
+ return this.actionButton.isVisible(this.env);
41805
+ }
41806
+ get isEnabled() {
41807
+ return this.actionButton.isEnabled(this.env);
41808
+ }
41809
+ get isActive() {
41810
+ var _a, _b;
41811
+ return (_b = (_a = this.actionButton).isActive) === null || _b === void 0 ? void 0 : _b.call(_a, this.env);
41812
+ }
41813
+ get title() {
41814
+ const name = this.actionButton.name(this.env);
41815
+ const description = this.actionButton.description;
41816
+ return name + (description ? ` (${description})` : "");
41817
+ }
41818
+ get iconTitle() {
41819
+ return this.actionButton.icon;
41820
+ }
41821
+ onClick(ev) {
41822
+ var _a, _b, _c, _d;
41823
+ if (this.isEnabled) {
41824
+ (_b = (_a = this.props).onClick) === null || _b === void 0 ? void 0 : _b.call(_a, ev);
41825
+ (_d = (_c = this.actionButton).execute) === null || _d === void 0 ? void 0 : _d.call(_c, this.env);
41826
+ }
41827
+ }
41828
+ get buttonStyle() {
41829
+ if (this.props.selectedColor) {
41830
+ return cssPropertiesToCss({
41831
+ "border-bottom": `4px solid ${this.props.selectedColor}`,
41832
+ height: "16px",
41833
+ "margin-top": "2px",
41834
+ });
41835
+ }
41836
+ return "";
41837
+ }
41838
+ }
41839
+ ActionButton.template = "o-spreadsheet-ActionButton";
41077
41840
 
41078
41841
  const COMPOSER_MAX_HEIGHT = 100;
41079
41842
  css /* scss */ `
@@ -41135,6 +41898,14 @@ css /* scss */ `
41135
41898
  input::-webkit-inner-spin-button {
41136
41899
  -webkit-appearance: none;
41137
41900
  }
41901
+
41902
+ .o-text-options > div {
41903
+ line-height: 26px;
41904
+ padding: 3px 12px;
41905
+ &:hover {
41906
+ background-color: rgba(0, 0, 0, 0.08);
41907
+ }
41908
+ }
41138
41909
  }
41139
41910
  `;
41140
41911
  class FontSizeEditor extends Component {
@@ -41203,41 +41974,6 @@ FontSizeEditor.props = {
41203
41974
  dropdownStyle: String,
41204
41975
  };
41205
41976
 
41206
- const FORMATS = [
41207
- { name: "automatic", text: NumberFormatTerms.Automatic },
41208
- { name: "number", text: NumberFormatTerms.Number, description: "1,000.12", value: "#,##0.00" },
41209
- { name: "percent", text: NumberFormatTerms.Percent, description: "10.12%", value: "0.00%" },
41210
- {
41211
- name: "currency",
41212
- text: NumberFormatTerms.Currency,
41213
- description: "$1,000.12",
41214
- value: "[$$]#,##0.00",
41215
- },
41216
- {
41217
- name: "currency_rounded",
41218
- text: NumberFormatTerms.CurrencyRounded,
41219
- description: "$1,000",
41220
- value: "[$$]#,##0",
41221
- },
41222
- { name: "date", text: NumberFormatTerms.Date, description: "9/26/2008", value: "m/d/yyyy" },
41223
- { name: "time", text: NumberFormatTerms.Time, description: "10:43:00 PM", value: "hh:mm:ss a" },
41224
- {
41225
- name: "datetime",
41226
- text: NumberFormatTerms.DateTime,
41227
- description: "9/26/2008 22:43:00",
41228
- value: "m/d/yyyy hh:mm:ss",
41229
- },
41230
- {
41231
- name: "duration",
41232
- text: NumberFormatTerms.Duration,
41233
- description: "27:51:38",
41234
- value: "hhhh:mm:ss",
41235
- },
41236
- ];
41237
- const CUSTOM_FORMATS = [
41238
- { name: "custom_currency", text: NumberFormatTerms.CustomCurrency, sidePanel: "CustomCurrency" },
41239
- ];
41240
- const ICONS_COLOR = "#4A4F59";
41241
41977
  // If we ever change these colors, make sure the filter tool stays green to match the icon in the grid
41242
41978
  const ACTIVE_BG_COLOR = BACKGROUND_HEADER_FILTER_COLOR;
41243
41979
  const ACTIVE_FONT_COLOR = FILTERS_COLOR;
@@ -41302,23 +42038,10 @@ css /* scss */ `
41302
42038
 
41303
42039
  /* Toolbar */
41304
42040
  .o-toolbar-tools {
41305
- .o-tool {
41306
- display: flex;
41307
- justify-content: center;
41308
- align-items: center;
41309
- margin: 2px;
41310
- padding: 0px 3px;
41311
- border-radius: 2px;
41312
- min-width: 20px;
41313
- }
41314
-
41315
- .o-filter-tool {
41316
- margin-right: 8px;
41317
- }
41318
-
41319
- .o-border-dropdown {
41320
- padding: 4px;
41321
- }
42041
+ display: flex;
42042
+ flex-shrink: 0;
42043
+ margin: 0px 6px 0px 16px;
42044
+ cursor: default;
41322
42045
 
41323
42046
  .o-divider {
41324
42047
  display: inline-block;
@@ -41332,59 +42055,28 @@ css /* scss */ `
41332
42055
  display: flex;
41333
42056
  align-items: center;
41334
42057
 
41335
- .o-dropdown-button {
42058
+ > span {
41336
42059
  height: 30px;
41337
42060
  }
41338
42061
 
41339
- .o-text-options > div {
41340
- line-height: 26px;
41341
- padding: 3px 12px;
41342
- &:hover {
41343
- background-color: rgba(0, 0, 0, 0.08);
41344
- }
41345
- }
41346
-
41347
42062
  .o-dropdown-content {
41348
42063
  position: absolute;
41349
42064
  top: 100%;
41350
42065
  left: 0;
41351
42066
  overflow-y: auto;
41352
42067
  overflow-x: hidden;
42068
+ padding: 2px;
41353
42069
  z-index: ${ComponentsImportance.Dropdown};
41354
42070
  box-shadow: 1px 2px 5px 2px rgba(51, 51, 51, 0.15);
41355
42071
  background-color: white;
41356
42072
 
41357
42073
  .o-dropdown-line {
41358
42074
  display: flex;
41359
- margin: 1px;
41360
42075
 
41361
- .o-line-item {
42076
+ > span {
41362
42077
  padding: 4px;
41363
- width: 18px;
41364
- height: 18px;
41365
- }
41366
- }
41367
-
41368
- &.o-format-tool {
41369
- padding: 5px 0;
41370
- width: 250px;
41371
- font-size: 12px;
41372
- > div {
41373
- padding: 0 20px;
41374
- white-space: nowrap;
41375
-
41376
- &.o-dropdown-active:before {
41377
- content: "✓";
41378
- font-weight: bold;
41379
- position: absolute;
41380
- left: 5px;
41381
- }
41382
42078
  }
41383
42079
  }
41384
-
41385
- .o-dropdown-align-item {
41386
- padding: 7px 10px;
41387
- }
41388
42080
  }
41389
42081
  }
41390
42082
  }
@@ -41394,24 +42086,20 @@ css /* scss */ `
41394
42086
  class TopBar extends Component {
41395
42087
  constructor() {
41396
42088
  super(...arguments);
41397
- this.commonFormats = FORMATS;
41398
- this.customFormats = CUSTOM_FORMATS;
41399
- this.currentFormatName = "automatic";
41400
- this.style = {};
41401
42089
  this.state = useState({
41402
42090
  menuState: { isOpen: false, position: null, menuItems: [] },
41403
42091
  activeTool: "",
42092
+ fillColor: "#ffffff",
42093
+ textColor: "#000000",
41404
42094
  });
41405
42095
  this.isSelectingMenu = false;
41406
42096
  this.openedEl = null;
41407
- this.inMerge = false;
41408
- this.cannotMerge = false;
41409
- this.undoTool = false;
41410
- this.redoTool = false;
41411
- this.paintFormatTool = false;
41412
- this.fillColor = "#ffffff";
41413
- this.textColor = "#000000";
41414
42097
  this.menus = [];
42098
+ this.EDIT = ACTION_EDIT;
42099
+ this.FORMAT = ACTION_FORMAT;
42100
+ this.VIEW = ACTION_VIEW;
42101
+ this.formatNumberMenuItemSpec = formatNumberMenuItemSpec;
42102
+ this.isntToolbarMenu = false;
41415
42103
  }
41416
42104
  get dropdownStyle() {
41417
42105
  return `max-height:${this.props.dropdownMaxHeight}px`;
@@ -41441,28 +42129,8 @@ class TopBar extends Component {
41441
42129
  this.props.onClick();
41442
42130
  this.closeMenus();
41443
42131
  }
41444
- toggleStyle(style) {
41445
- setStyle(this.env, { [style]: !this.style[style] });
41446
- }
41447
- toggleFormat(formatName) {
41448
- const formatter = FORMATS.find((f) => f.name === formatName);
41449
- const value = (formatter && formatter.value) || "";
41450
- setFormatter(this.env, value);
41451
- }
41452
- toggleHorizontalAlign(align) {
41453
- setStyle(this.env, { align });
41454
- this.onClick();
41455
- }
41456
- toggleVerticalAlign(verticalAlign) {
41457
- setStyle(this.env, { verticalAlign });
41458
- this.onClick();
41459
- }
41460
- toggleTextWrapping(wrapping) {
41461
- setStyle(this.env, { wrapping });
41462
- this.onClick();
41463
- }
41464
42132
  onMenuMouseOver(menu, ev) {
41465
- if (this.isSelectingMenu) {
42133
+ if (this.isSelectingMenu && this.isntToolbarMenu) {
41466
42134
  this.openMenu(menu, ev);
41467
42135
  }
41468
42136
  }
@@ -41473,15 +42141,27 @@ class TopBar extends Component {
41473
42141
  this.openedEl = isOpen ? null : ev.target;
41474
42142
  }
41475
42143
  toggleContextMenu(menu, ev) {
41476
- if (this.state.menuState.isOpen) {
42144
+ if (this.state.menuState.isOpen && this.isntToolbarMenu) {
41477
42145
  this.closeMenus();
41478
42146
  }
41479
42147
  else {
41480
42148
  this.openMenu(menu, ev);
42149
+ this.isntToolbarMenu = true;
42150
+ }
42151
+ }
42152
+ toggleToolbarContextMenu(menuSpec, ev) {
42153
+ if (this.state.menuState.isOpen && !this.isntToolbarMenu) {
42154
+ this.closeMenus();
42155
+ }
42156
+ else {
42157
+ const menu = createAction(menuSpec);
42158
+ this.openMenu(menu, ev);
42159
+ this.isntToolbarMenu = false;
41481
42160
  }
41482
42161
  }
41483
42162
  openMenu(menu, ev) {
41484
- const { left, top, height } = ev.target.getBoundingClientRect();
42163
+ const { left, top, height } = ev.currentTarget.getBoundingClientRect();
42164
+ this.state.activeTool = "";
41485
42165
  this.state.menuState.isOpen = true;
41486
42166
  this.state.menuState.position = { x: left, y: top + height };
41487
42167
  this.state.menuState.menuItems = menu.children(this.env);
@@ -41498,134 +42178,28 @@ class TopBar extends Component {
41498
42178
  this.openedEl = null;
41499
42179
  }
41500
42180
  updateCellState() {
41501
- const zones = this.env.model.getters.getSelectedZones();
41502
- const { col, row, sheetId } = this.env.model.getters.getActivePosition();
41503
- this.inMerge = false;
41504
- const { top, left, right, bottom } = this.env.model.getters.getSelectedZone();
41505
- const { xSplit, ySplit } = this.env.model.getters.getPaneDivisions(sheetId);
41506
- this.cannotMerge =
41507
- zones.length > 1 ||
41508
- (top === bottom && left === right) ||
41509
- (left < xSplit && xSplit <= right) ||
41510
- (top < ySplit && ySplit <= bottom);
41511
- if (!this.cannotMerge) {
41512
- const zone = this.env.model.getters.expandZone(sheetId, positionToZone({ col, row }));
41513
- this.inMerge = isEqual(zones[0], zone);
41514
- }
41515
- this.undoTool = this.env.model.getters.canUndo();
41516
- this.redoTool = this.env.model.getters.canRedo();
41517
- this.paintFormatTool = this.env.model.getters.isPaintingFormat();
41518
- const cell = this.env.model.getters.getActiveCell();
41519
- if (cell.format) {
41520
- const currentFormat = this.commonFormats.find((f) => f.value === cell.format);
41521
- this.currentFormatName = currentFormat ? currentFormat.name : "";
41522
- }
41523
- else {
41524
- this.currentFormatName = "automatic";
41525
- }
41526
- this.style = { ...this.env.model.getters.getCurrentStyle() };
41527
- this.style.align = this.style.align || cell.defaultAlign;
41528
- this.fillColor = this.style.fillColor || "#ffffff";
41529
- this.textColor = this.style.textColor || "#000000";
42181
+ const style = this.env.model.getters.getCurrentStyle();
42182
+ this.state.fillColor = style.fillColor || "#ffffff";
42183
+ this.state.textColor = style.textColor || "#000000";
41530
42184
  this.menus = topbarMenuRegistry.getMenuItems();
41531
42185
  }
41532
42186
  getMenuName(menu) {
41533
42187
  return menu.name(this.env);
41534
42188
  }
41535
- toggleMerge() {
41536
- if (this.cannotMerge) {
41537
- return;
41538
- }
41539
- const zones = this.env.model.getters.getSelectedZones();
41540
- const target = [zones[zones.length - 1]];
41541
- const sheetId = this.env.model.getters.getActiveSheetId();
41542
- if (this.inMerge) {
41543
- this.env.model.dispatch("REMOVE_MERGE", { sheetId, target });
41544
- }
41545
- else {
41546
- interactiveAddMerge(this.env, sheetId, target);
41547
- }
41548
- }
41549
42189
  setColor(target, color) {
41550
42190
  setStyle(this.env, { [target]: color });
41551
42191
  this.onClick();
41552
42192
  }
41553
- setBorder(command) {
41554
- this.env.model.dispatch("SET_FORMATTING", {
41555
- sheetId: this.env.model.getters.getActiveSheetId(),
41556
- target: this.env.model.getters.getSelectedZones(),
41557
- border: command,
41558
- });
41559
- this.onClick();
41560
- }
41561
- setFormat(format, custom) {
41562
- if (!custom) {
41563
- this.toggleFormat(format);
41564
- }
41565
- else {
41566
- this.openCustomFormatSidePanel(format);
41567
- }
41568
- this.onClick();
41569
- }
41570
- openCustomFormatSidePanel(custom) {
41571
- const customFormatter = CUSTOM_FORMATS.find((c) => c.name === custom);
41572
- const sidePanel = (customFormatter && customFormatter.sidePanel) || "";
41573
- this.env.openSidePanel(sidePanel);
41574
- }
41575
- setDecimal(step) {
41576
- this.env.model.dispatch("SET_DECIMAL", {
41577
- sheetId: this.env.model.getters.getActiveSheetId(),
41578
- target: this.env.model.getters.getSelectedZones(),
41579
- step: step,
41580
- });
41581
- }
41582
- paintFormat() {
41583
- this.env.model.dispatch("ACTIVATE_PAINT_FORMAT", {
41584
- target: this.env.model.getters.getSelectedZones(),
41585
- });
41586
- }
41587
- clearFormatting() {
41588
- this.env.model.dispatch("CLEAR_FORMATTING", {
41589
- sheetId: this.env.model.getters.getActiveSheetId(),
41590
- target: this.env.model.getters.getSelectedZones(),
41591
- });
41592
- }
41593
- doAction(action) {
41594
- action(this.env);
41595
- this.closeMenus();
41596
- }
41597
- undo() {
41598
- this.env.model.dispatch("REQUEST_UNDO");
41599
- }
41600
- redo() {
41601
- this.env.model.dispatch("REQUEST_REDO");
41602
- }
41603
- get selectionContainsFilter() {
41604
- const sheetId = this.env.model.getters.getActiveSheetId();
41605
- const selectedZones = this.env.model.getters.getSelectedZones();
41606
- return this.env.model.getters.doesZonesContainFilter(sheetId, selectedZones);
41607
- }
41608
- get cannotCreateFilter() {
41609
- return !areZonesContinuous(...this.env.model.getters.getSelectedZones());
41610
- }
41611
- createFilter() {
41612
- if (this.cannotCreateFilter) {
41613
- return;
41614
- }
41615
- this.env.model.selection.selectTableAroundSelection();
41616
- const sheetId = this.env.model.getters.getActiveSheetId();
41617
- const selection = this.env.model.getters.getSelectedZones();
41618
- interactiveAddFilter(this.env, sheetId, selection);
41619
- }
41620
- removeFilter() {
41621
- this.env.model.dispatch("REMOVE_FILTER_TABLE", {
41622
- sheetId: this.env.model.getters.getActiveSheetId(),
41623
- target: this.env.model.getters.getSelectedZones(),
41624
- });
41625
- }
41626
42193
  }
41627
42194
  TopBar.template = "o-spreadsheet-TopBar";
41628
- TopBar.components = { ColorPickerWidget, Menu, TopBarComposer, FontSizeEditor };
42195
+ TopBar.components = {
42196
+ ColorPickerWidget,
42197
+ ColorPicker,
42198
+ Menu,
42199
+ TopBarComposer,
42200
+ FontSizeEditor,
42201
+ ActionButton,
42202
+ };
41629
42203
  TopBar.props = {
41630
42204
  onClick: Function,
41631
42205
  focusComposer: String,
@@ -41735,6 +42309,10 @@ css /* scss */ `
41735
42309
  height: ${CF_ICON_EDGE_LENGTH}px;
41736
42310
  vertical-align: sub;
41737
42311
  }
42312
+
42313
+ .o-text-icon {
42314
+ vertical-align: middle;
42315
+ }
41738
42316
  `;
41739
42317
  // -----------------------------------------------------------------------------
41740
42318
  // GRID STYLE
@@ -45506,6 +46084,7 @@ const registries = {
45506
46084
  inverseCommandRegistry,
45507
46085
  urlRegistry,
45508
46086
  cellPopoverRegistry,
46087
+ numberFormatMenuRegistry,
45509
46088
  };
45510
46089
  const helpers = {
45511
46090
  arg,
@@ -45563,9 +46142,9 @@ function addFunction(functionName, functionDescription) {
45563
46142
  functionRegistry.add(functionName, functionDescription);
45564
46143
  }
45565
46144
 
45566
- export { AbstractChart, CommandResult, CorePlugin, DATETIME_FORMAT, DispatchResult, EvaluationError, Model, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, UIPlugin, __info__, addFunction, astToFormula, compile, components, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, invalidateEvaluationCommands, links, load, parse, readonlyAllowedCommands, registries, setTranslationMethod, tokenize };
46145
+ export { AbstractChart, CommandResult, CorePlugin, DATETIME_FORMAT, DispatchResult, EvaluationError, Model, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, UIPlugin, __info__, addFunction, astToFormula, compile, components, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, invalidateEvaluationCommands, links, load, parse, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, tokenize };
45567
46146
 
45568
46147
 
45569
- __info__.version = '16.3.0-alpha.3';
45570
- __info__.date = '2023-04-13T08:30:41.165Z';
45571
- __info__.hash = '573e679';
46148
+ __info__.version = '16.3.0-alpha.4';
46149
+ __info__.date = '2023-04-14T12:49:16.671Z';
46150
+ __info__.hash = '6824b8a';