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