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