@odoo/o-spreadsheet 17.1.11 → 17.1.12

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.
@@ -2,9 +2,9 @@
2
2
  /**
3
3
  * This file is generated by o-spreadsheet build tools. Do not edit it.
4
4
  * @see https://github.com/odoo/o-spreadsheet
5
- * @version 17.1.11
6
- * @date 2024-04-10T12:27:11.107Z
7
- * @hash 246caf7
5
+ * @version 17.1.12
6
+ * @date 2024-04-18T16:45:30.109Z
7
+ * @hash 3e90776
8
8
  */
9
9
 
10
10
  (function (exports, owl) {
@@ -2476,6 +2476,15 @@
2476
2476
  }
2477
2477
  return generateMatrix(matrix.length, matrix[0].length, (col, row) => fn(matrix[col][row]));
2478
2478
  }
2479
+ function matrixForEach(matrix, fn) {
2480
+ const numberOfCols = matrix.length;
2481
+ const numberOfRows = matrix[0]?.length ?? 0;
2482
+ for (let col = 0; col < numberOfCols; col++) {
2483
+ for (let row = 0; row < numberOfRows; row++) {
2484
+ fn(matrix[col][row]);
2485
+ }
2486
+ }
2487
+ }
2479
2488
  function transposeMatrix(matrix) {
2480
2489
  if (!matrix.length) {
2481
2490
  return [];
@@ -8179,6 +8188,7 @@
8179
8188
  this.save();
8180
8189
  }
8181
8190
  ev.stopPropagation();
8191
+ ev.preventDefault();
8182
8192
  break;
8183
8193
  case "Escape":
8184
8194
  this.cancel();
@@ -19761,7 +19771,7 @@
19761
19771
  }
19762
19772
  const descr = addMetaInfoFromArg(addDescr);
19763
19773
  validateArguments(descr.args);
19764
- this.mapping[name] = addErrorHandling(addResultHandling(addInputHandling(descr)), name);
19774
+ this.mapping[name] = addErrorHandling(addResultHandling(addInputHandling(descr), name), name);
19765
19775
  super.add(name, descr);
19766
19776
  return this;
19767
19777
  }
@@ -19800,9 +19810,7 @@
19800
19810
  // so we fallback to a generic error
19801
19811
  if (hasStringValue(e) && isEvaluationError(e.value)) {
19802
19812
  if (hasStringMessage(e)) {
19803
- if (e.message?.includes("[[FUNCTION_NAME]]")) {
19804
- e.message = e.message.replace("[[FUNCTION_NAME]]", functionName);
19805
- }
19813
+ replaceFunctionNamePlaceholder(e, functionName);
19806
19814
  }
19807
19815
  return e;
19808
19816
  }
@@ -19817,21 +19825,29 @@
19817
19825
  return (obj?.message !== undefined &&
19818
19826
  typeof obj.message === "string");
19819
19827
  }
19820
- function addResultHandling(compute) {
19821
- return function (...args) {
19828
+ function addResultHandling(compute, functionName) {
19829
+ return function computeWithResultHandling(...args) {
19822
19830
  const result = compute.apply(this, args);
19823
19831
  if (!isMatrix(result)) {
19824
19832
  if (typeof result === "object" && result !== null && "value" in result) {
19833
+ replaceFunctionNamePlaceholder(result, functionName);
19825
19834
  return result;
19826
19835
  }
19827
19836
  return { value: result };
19828
19837
  }
19829
19838
  if (typeof result[0][0] === "object" && result[0][0] !== null && "value" in result[0][0]) {
19839
+ matrixForEach(result, (result) => replaceFunctionNamePlaceholder(result, functionName));
19830
19840
  return result;
19831
19841
  }
19832
19842
  return matrixMap(result, (row) => ({ value: row }));
19833
19843
  };
19834
19844
  }
19845
+ function replaceFunctionNamePlaceholder(fPayload, functionName) {
19846
+ // for performance reasons: change in place and only if needed
19847
+ if (fPayload.message?.includes("[[FUNCTION_NAME]]")) {
19848
+ fPayload.message = fPayload.message.replace("[[FUNCTION_NAME]]", functionName);
19849
+ }
19850
+ }
19835
19851
  const functionRegistry = new FunctionRegistry();
19836
19852
  for (let category of categories) {
19837
19853
  const fns = category.functions;
@@ -20203,6 +20219,332 @@
20203
20219
  }
20204
20220
  }
20205
20221
 
20222
+ function interactiveFreezeColumnsRows(env, dimension, base) {
20223
+ const sheetId = env.model.getters.getActiveSheetId();
20224
+ const cmd = dimension === "COL" ? "FREEZE_COLUMNS" : "FREEZE_ROWS";
20225
+ const result = env.model.dispatch(cmd, { sheetId, quantity: base });
20226
+ if (result.isCancelledBecause("MergeOverlap" /* CommandResult.MergeOverlap */)) {
20227
+ env.raiseError(MergeErrorMessage);
20228
+ }
20229
+ }
20230
+
20231
+ const hideCols = {
20232
+ name: HIDE_COLUMNS_NAME,
20233
+ execute: (env) => {
20234
+ const columns = env.model.getters.getElementsFromSelection("COL");
20235
+ env.model.dispatch("HIDE_COLUMNS_ROWS", {
20236
+ sheetId: env.model.getters.getActiveSheetId(),
20237
+ dimension: "COL",
20238
+ elements: columns,
20239
+ });
20240
+ },
20241
+ isVisible: NOT_ALL_VISIBLE_COLS_SELECTED,
20242
+ icon: "o-spreadsheet-Icon.HIDE_COL",
20243
+ };
20244
+ const unhideCols = {
20245
+ name: _t("Unhide columns"),
20246
+ execute: (env) => {
20247
+ const columns = env.model.getters.getElementsFromSelection("COL");
20248
+ env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
20249
+ sheetId: env.model.getters.getActiveSheetId(),
20250
+ dimension: "COL",
20251
+ elements: columns,
20252
+ });
20253
+ },
20254
+ isVisible: (env) => {
20255
+ const hiddenCols = env.model.getters
20256
+ .getHiddenColsGroups(env.model.getters.getActiveSheetId())
20257
+ .flat();
20258
+ const currentCols = env.model.getters.getElementsFromSelection("COL");
20259
+ return currentCols.some((col) => hiddenCols.includes(col));
20260
+ },
20261
+ };
20262
+ const unhideAllCols = {
20263
+ name: _t("Unhide all columns"),
20264
+ execute: (env) => {
20265
+ const sheetId = env.model.getters.getActiveSheetId();
20266
+ env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
20267
+ sheetId,
20268
+ dimension: "COL",
20269
+ elements: Array.from(Array(env.model.getters.getNumberCols(sheetId)).keys()),
20270
+ });
20271
+ },
20272
+ isVisible: (env) => env.model.getters.getHiddenColsGroups(env.model.getters.getActiveSheetId()).length > 0,
20273
+ };
20274
+ const hideRows = {
20275
+ name: HIDE_ROWS_NAME,
20276
+ execute: (env) => {
20277
+ const rows = env.model.getters.getElementsFromSelection("ROW");
20278
+ env.model.dispatch("HIDE_COLUMNS_ROWS", {
20279
+ sheetId: env.model.getters.getActiveSheetId(),
20280
+ dimension: "ROW",
20281
+ elements: rows,
20282
+ });
20283
+ },
20284
+ isVisible: NOT_ALL_VISIBLE_ROWS_SELECTED,
20285
+ icon: "o-spreadsheet-Icon.HIDE_ROW",
20286
+ };
20287
+ const unhideRows = {
20288
+ name: _t("Unhide rows"),
20289
+ execute: (env) => {
20290
+ const columns = env.model.getters.getElementsFromSelection("ROW");
20291
+ env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
20292
+ sheetId: env.model.getters.getActiveSheetId(),
20293
+ dimension: "ROW",
20294
+ elements: columns,
20295
+ });
20296
+ },
20297
+ isVisible: (env) => {
20298
+ const hiddenRows = env.model.getters
20299
+ .getHiddenRowsGroups(env.model.getters.getActiveSheetId())
20300
+ .flat();
20301
+ const currentRows = env.model.getters.getElementsFromSelection("ROW");
20302
+ return currentRows.some((col) => hiddenRows.includes(col));
20303
+ },
20304
+ };
20305
+ const unhideAllRows = {
20306
+ name: _t("Unhide all rows"),
20307
+ execute: (env) => {
20308
+ const sheetId = env.model.getters.getActiveSheetId();
20309
+ env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
20310
+ sheetId,
20311
+ dimension: "ROW",
20312
+ elements: Array.from(Array(env.model.getters.getNumberRows(sheetId)).keys()),
20313
+ });
20314
+ },
20315
+ isVisible: (env) => env.model.getters.getHiddenRowsGroups(env.model.getters.getActiveSheetId()).length > 0,
20316
+ };
20317
+ const unFreezePane = {
20318
+ name: _t("Unfreeze"),
20319
+ isVisible: (env) => {
20320
+ const { xSplit, ySplit } = env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId());
20321
+ return xSplit + ySplit > 0;
20322
+ },
20323
+ execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS_ROWS", {
20324
+ sheetId: env.model.getters.getActiveSheetId(),
20325
+ }),
20326
+ icon: "o-spreadsheet-Icon.UNFREEZE",
20327
+ };
20328
+ const freezePane = {
20329
+ name: _t("Freeze"),
20330
+ icon: "o-spreadsheet-Icon.FREEZE",
20331
+ };
20332
+ const unFreezeRows = {
20333
+ name: _t("No rows"),
20334
+ execute: (env) => env.model.dispatch("UNFREEZE_ROWS", {
20335
+ sheetId: env.model.getters.getActiveSheetId(),
20336
+ }),
20337
+ isReadonlyAllowed: true,
20338
+ isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).ySplit,
20339
+ };
20340
+ const freezeFirstRow = {
20341
+ name: _t("1 row"),
20342
+ execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 1),
20343
+ isReadonlyAllowed: true,
20344
+ };
20345
+ const freezeSecondRow = {
20346
+ name: _t("2 rows"),
20347
+ execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 2),
20348
+ isReadonlyAllowed: true,
20349
+ };
20350
+ const freezeCurrentRow = {
20351
+ name: _t("Up to current row"),
20352
+ execute: (env) => {
20353
+ const { bottom } = env.model.getters.getSelectedZone();
20354
+ interactiveFreezeColumnsRows(env, "ROW", bottom + 1);
20355
+ },
20356
+ isReadonlyAllowed: true,
20357
+ };
20358
+ const unFreezeCols = {
20359
+ name: _t("No columns"),
20360
+ execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS", {
20361
+ sheetId: env.model.getters.getActiveSheetId(),
20362
+ }),
20363
+ isReadonlyAllowed: true,
20364
+ isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).xSplit,
20365
+ };
20366
+ const freezeFirstCol = {
20367
+ name: _t("1 column"),
20368
+ execute: (env) => interactiveFreezeColumnsRows(env, "COL", 1),
20369
+ isReadonlyAllowed: true,
20370
+ };
20371
+ const freezeSecondCol = {
20372
+ name: _t("2 columns"),
20373
+ execute: (env) => interactiveFreezeColumnsRows(env, "COL", 2),
20374
+ isReadonlyAllowed: true,
20375
+ };
20376
+ const freezeCurrentCol = {
20377
+ name: _t("Up to current column"),
20378
+ execute: (env) => {
20379
+ const { right } = env.model.getters.getSelectedZone();
20380
+ interactiveFreezeColumnsRows(env, "COL", right + 1);
20381
+ },
20382
+ isReadonlyAllowed: true,
20383
+ };
20384
+ const viewGridlines = {
20385
+ name: (env) => env.model.getters.getGridLinesVisibility(env.model.getters.getActiveSheetId())
20386
+ ? _t("Hide gridlines")
20387
+ : _t("Show gridlines"),
20388
+ execute: (env) => {
20389
+ const sheetId = env.model.getters.getActiveSheetId();
20390
+ env.model.dispatch("SET_GRID_LINES_VISIBILITY", {
20391
+ sheetId,
20392
+ areGridLinesVisible: !env.model.getters.getGridLinesVisibility(sheetId),
20393
+ });
20394
+ },
20395
+ icon: "o-spreadsheet-Icon.SHOW_HIDE_GRID",
20396
+ };
20397
+ const viewFormulas = {
20398
+ name: (env) => env.model.getters.shouldShowFormulas() ? "Hide formulas" : _t("Show formulas"),
20399
+ execute: (env) => env.model.dispatch("SET_FORMULA_VISIBILITY", { show: !env.model.getters.shouldShowFormulas() }),
20400
+ isReadonlyAllowed: true,
20401
+ icon: "o-spreadsheet-Icon.SHOW_HIDE_FORMULA",
20402
+ };
20403
+ const createRemoveFilter = {
20404
+ name: (env) => selectionContainsFilter(env) ? _t("Remove selected filters") : _t("Create filter"),
20405
+ isActive: (env) => selectionContainsFilter(env),
20406
+ isEnabled: (env) => !cannotCreateFilter(env),
20407
+ execute: (env) => createRemoveFilterAction(env),
20408
+ icon: "o-spreadsheet-Icon.FILTER_ICON_INACTIVE",
20409
+ };
20410
+ const groupColumns = {
20411
+ name: (env) => {
20412
+ const selection = env.model.getters.getSelectedZone();
20413
+ if (selection.left === selection.right) {
20414
+ return _t("Group column %s", numberToLetters(selection.left));
20415
+ }
20416
+ return _t("Group columns %s - %s", numberToLetters(selection.left), numberToLetters(selection.right));
20417
+ },
20418
+ execute: (env) => groupHeadersAction(env, "COL"),
20419
+ isVisible: (env) => {
20420
+ const sheetId = env.model.getters.getActiveSheetId();
20421
+ const selection = env.model.getters.getSelectedZone();
20422
+ const groups = env.model.getters.getHeaderGroupsInZone(sheetId, "COL", selection);
20423
+ return (IS_ONLY_ONE_RANGE(env) &&
20424
+ !groups.some((group) => group.start === selection.left && group.end === selection.right));
20425
+ },
20426
+ icon: "o-spreadsheet-Icon.GROUP_COLUMNS",
20427
+ };
20428
+ const groupRows = {
20429
+ name: (env) => {
20430
+ const selection = env.model.getters.getSelectedZone();
20431
+ if (selection.top === selection.bottom) {
20432
+ return _t("Group row %s", String(selection.top + 1));
20433
+ }
20434
+ return _t("Group rows %s - %s", String(selection.top + 1), String(selection.bottom + 1));
20435
+ },
20436
+ execute: (env) => groupHeadersAction(env, "ROW"),
20437
+ isVisible: (env) => {
20438
+ const sheetId = env.model.getters.getActiveSheetId();
20439
+ const selection = env.model.getters.getSelectedZone();
20440
+ const groups = env.model.getters.getHeaderGroupsInZone(sheetId, "ROW", selection);
20441
+ return (IS_ONLY_ONE_RANGE(env) &&
20442
+ !groups.some((group) => group.start === selection.top && group.end === selection.bottom));
20443
+ },
20444
+ icon: "o-spreadsheet-Icon.GROUP_ROWS",
20445
+ };
20446
+ const ungroupColumns = {
20447
+ name: (env) => {
20448
+ const selection = env.model.getters.getSelectedZone();
20449
+ if (selection.left === selection.right) {
20450
+ return _t("Ungroup column %s", numberToLetters(selection.left));
20451
+ }
20452
+ return _t("Ungroup columns %s - %s", numberToLetters(selection.left), numberToLetters(selection.right));
20453
+ },
20454
+ execute: (env) => ungroupHeaders(env, "COL"),
20455
+ icon: "o-spreadsheet-Icon.UNGROUP_COLUMNS",
20456
+ };
20457
+ const ungroupRows = {
20458
+ name: (env) => {
20459
+ const selection = env.model.getters.getSelectedZone();
20460
+ if (selection.top === selection.bottom) {
20461
+ return _t("Ungroup row %s", String(selection.top + 1));
20462
+ }
20463
+ return _t("Ungroup rows %s - %s", String(selection.top + 1), String(selection.bottom + 1));
20464
+ },
20465
+ execute: (env) => ungroupHeaders(env, "ROW"),
20466
+ icon: "o-spreadsheet-Icon.UNGROUP_ROWS",
20467
+ };
20468
+ function selectionContainsFilter(env) {
20469
+ const sheetId = env.model.getters.getActiveSheetId();
20470
+ const selectedZones = env.model.getters.getSelectedZones();
20471
+ return env.model.getters.doesZonesContainFilter(sheetId, selectedZones);
20472
+ }
20473
+ function cannotCreateFilter(env) {
20474
+ return !areZonesContinuous(...env.model.getters.getSelectedZones());
20475
+ }
20476
+ function createRemoveFilterAction(env) {
20477
+ if (selectionContainsFilter(env)) {
20478
+ env.model.dispatch("REMOVE_FILTER_TABLE", {
20479
+ sheetId: env.model.getters.getActiveSheetId(),
20480
+ target: env.model.getters.getSelectedZones(),
20481
+ });
20482
+ return;
20483
+ }
20484
+ if (cannotCreateFilter(env)) {
20485
+ return;
20486
+ }
20487
+ env.model.selection.selectTableAroundSelection();
20488
+ const sheetId = env.model.getters.getActiveSheetId();
20489
+ const selection = env.model.getters.getSelectedZones();
20490
+ interactiveAddFilter(env, sheetId, selection);
20491
+ }
20492
+ function groupHeadersAction(env, dim) {
20493
+ const selection = env.model.getters.getSelectedZone();
20494
+ const sheetId = env.model.getters.getActiveSheetId();
20495
+ env.model.dispatch("GROUP_HEADERS", {
20496
+ sheetId,
20497
+ dimension: dim,
20498
+ start: dim === "COL" ? selection.left : selection.top,
20499
+ end: dim === "COL" ? selection.right : selection.bottom,
20500
+ });
20501
+ }
20502
+ function ungroupHeaders(env, dim) {
20503
+ const selection = env.model.getters.getSelectedZone();
20504
+ const sheetId = env.model.getters.getActiveSheetId();
20505
+ env.model.dispatch("UNGROUP_HEADERS", {
20506
+ sheetId,
20507
+ dimension: dim,
20508
+ start: dim === "COL" ? selection.left : selection.top,
20509
+ end: dim === "COL" ? selection.right : selection.bottom,
20510
+ });
20511
+ }
20512
+ function canUngroupHeaders(env, dimension) {
20513
+ const sheetId = env.model.getters.getActiveSheetId();
20514
+ const selection = env.model.getters.getSelectedZones();
20515
+ return (selection.length === 1 &&
20516
+ env.model.getters.getHeaderGroupsInZone(sheetId, dimension, selection[0]).length > 0);
20517
+ }
20518
+
20519
+ var ACTION_VIEW = /*#__PURE__*/Object.freeze({
20520
+ __proto__: null,
20521
+ canUngroupHeaders: canUngroupHeaders,
20522
+ createRemoveFilter: createRemoveFilter,
20523
+ createRemoveFilterAction: createRemoveFilterAction,
20524
+ freezeCurrentCol: freezeCurrentCol,
20525
+ freezeCurrentRow: freezeCurrentRow,
20526
+ freezeFirstCol: freezeFirstCol,
20527
+ freezeFirstRow: freezeFirstRow,
20528
+ freezePane: freezePane,
20529
+ freezeSecondCol: freezeSecondCol,
20530
+ freezeSecondRow: freezeSecondRow,
20531
+ groupColumns: groupColumns,
20532
+ groupRows: groupRows,
20533
+ hideCols: hideCols,
20534
+ hideRows: hideRows,
20535
+ unFreezeCols: unFreezeCols,
20536
+ unFreezePane: unFreezePane,
20537
+ unFreezeRows: unFreezeRows,
20538
+ ungroupColumns: ungroupColumns,
20539
+ ungroupRows: ungroupRows,
20540
+ unhideAllCols: unhideAllCols,
20541
+ unhideAllRows: unhideAllRows,
20542
+ unhideCols: unhideCols,
20543
+ unhideRows: unhideRows,
20544
+ viewFormulas: viewFormulas,
20545
+ viewGridlines: viewGridlines
20546
+ });
20547
+
20206
20548
  const sortRange = {
20207
20549
  name: _t("Sort range"),
20208
20550
  isVisible: IS_ONLY_ONE_RANGE,
@@ -20245,32 +20587,15 @@
20245
20587
  },
20246
20588
  icon: "o-spreadsheet-Icon.SORT_DESCENDING",
20247
20589
  };
20248
- const addDataFilter = {
20249
- name: _t("Create filter"),
20250
- execute: (env) => {
20251
- const sheetId = env.model.getters.getActiveSheetId();
20252
- const selection = env.model.getters.getSelection().zones;
20253
- interactiveAddFilter(env, sheetId, selection);
20254
- },
20255
- isVisible: (env) => !SELECTION_CONTAINS_FILTER(env),
20590
+ const addRemoveDataFilter = {
20591
+ name: (env) => SELECTION_CONTAINS_FILTER(env) ? _t("Remove filter") : _t("Create filter"),
20592
+ execute: (env) => createRemoveFilterAction(env),
20256
20593
  isEnabled: (env) => {
20257
20594
  const selectedZones = env.model.getters.getSelectedZones();
20258
20595
  return areZonesContinuous(...selectedZones);
20259
20596
  },
20260
20597
  icon: "o-spreadsheet-Icon.MENU_FILTER_ICON",
20261
20598
  };
20262
- const removeDataFilter = {
20263
- name: _t("Remove filter"),
20264
- execute: (env) => {
20265
- const sheetId = env.model.getters.getActiveSheetId();
20266
- env.model.dispatch("REMOVE_FILTER_TABLE", {
20267
- sheetId,
20268
- target: env.model.getters.getSelectedZones(),
20269
- });
20270
- },
20271
- isVisible: SELECTION_CONTAINS_FILTER,
20272
- icon: "o-spreadsheet-Icon.MENU_FILTER_ICON",
20273
- };
20274
20599
  const splitToColumns = {
20275
20600
  name: _t("Split text to columns"),
20276
20601
  sequence: 1,
@@ -20682,331 +21007,6 @@
20682
21007
  textColor: textColor
20683
21008
  });
20684
21009
 
20685
- function interactiveFreezeColumnsRows(env, dimension, base) {
20686
- const sheetId = env.model.getters.getActiveSheetId();
20687
- const cmd = dimension === "COL" ? "FREEZE_COLUMNS" : "FREEZE_ROWS";
20688
- const result = env.model.dispatch(cmd, { sheetId, quantity: base });
20689
- if (result.isCancelledBecause("MergeOverlap" /* CommandResult.MergeOverlap */)) {
20690
- env.raiseError(MergeErrorMessage);
20691
- }
20692
- }
20693
-
20694
- const hideCols = {
20695
- name: HIDE_COLUMNS_NAME,
20696
- execute: (env) => {
20697
- const columns = env.model.getters.getElementsFromSelection("COL");
20698
- env.model.dispatch("HIDE_COLUMNS_ROWS", {
20699
- sheetId: env.model.getters.getActiveSheetId(),
20700
- dimension: "COL",
20701
- elements: columns,
20702
- });
20703
- },
20704
- isVisible: NOT_ALL_VISIBLE_COLS_SELECTED,
20705
- icon: "o-spreadsheet-Icon.HIDE_COL",
20706
- };
20707
- const unhideCols = {
20708
- name: _t("Unhide columns"),
20709
- execute: (env) => {
20710
- const columns = env.model.getters.getElementsFromSelection("COL");
20711
- env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
20712
- sheetId: env.model.getters.getActiveSheetId(),
20713
- dimension: "COL",
20714
- elements: columns,
20715
- });
20716
- },
20717
- isVisible: (env) => {
20718
- const hiddenCols = env.model.getters
20719
- .getHiddenColsGroups(env.model.getters.getActiveSheetId())
20720
- .flat();
20721
- const currentCols = env.model.getters.getElementsFromSelection("COL");
20722
- return currentCols.some((col) => hiddenCols.includes(col));
20723
- },
20724
- };
20725
- const unhideAllCols = {
20726
- name: _t("Unhide all columns"),
20727
- execute: (env) => {
20728
- const sheetId = env.model.getters.getActiveSheetId();
20729
- env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
20730
- sheetId,
20731
- dimension: "COL",
20732
- elements: Array.from(Array(env.model.getters.getNumberCols(sheetId)).keys()),
20733
- });
20734
- },
20735
- isVisible: (env) => env.model.getters.getHiddenColsGroups(env.model.getters.getActiveSheetId()).length > 0,
20736
- };
20737
- const hideRows = {
20738
- name: HIDE_ROWS_NAME,
20739
- execute: (env) => {
20740
- const rows = env.model.getters.getElementsFromSelection("ROW");
20741
- env.model.dispatch("HIDE_COLUMNS_ROWS", {
20742
- sheetId: env.model.getters.getActiveSheetId(),
20743
- dimension: "ROW",
20744
- elements: rows,
20745
- });
20746
- },
20747
- isVisible: NOT_ALL_VISIBLE_ROWS_SELECTED,
20748
- icon: "o-spreadsheet-Icon.HIDE_ROW",
20749
- };
20750
- const unhideRows = {
20751
- name: _t("Unhide rows"),
20752
- execute: (env) => {
20753
- const columns = env.model.getters.getElementsFromSelection("ROW");
20754
- env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
20755
- sheetId: env.model.getters.getActiveSheetId(),
20756
- dimension: "ROW",
20757
- elements: columns,
20758
- });
20759
- },
20760
- isVisible: (env) => {
20761
- const hiddenRows = env.model.getters
20762
- .getHiddenRowsGroups(env.model.getters.getActiveSheetId())
20763
- .flat();
20764
- const currentRows = env.model.getters.getElementsFromSelection("ROW");
20765
- return currentRows.some((col) => hiddenRows.includes(col));
20766
- },
20767
- };
20768
- const unhideAllRows = {
20769
- name: _t("Unhide all rows"),
20770
- execute: (env) => {
20771
- const sheetId = env.model.getters.getActiveSheetId();
20772
- env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
20773
- sheetId,
20774
- dimension: "ROW",
20775
- elements: Array.from(Array(env.model.getters.getNumberRows(sheetId)).keys()),
20776
- });
20777
- },
20778
- isVisible: (env) => env.model.getters.getHiddenRowsGroups(env.model.getters.getActiveSheetId()).length > 0,
20779
- };
20780
- const unFreezePane = {
20781
- name: _t("Unfreeze"),
20782
- isVisible: (env) => {
20783
- const { xSplit, ySplit } = env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId());
20784
- return xSplit + ySplit > 0;
20785
- },
20786
- execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS_ROWS", {
20787
- sheetId: env.model.getters.getActiveSheetId(),
20788
- }),
20789
- icon: "o-spreadsheet-Icon.UNFREEZE",
20790
- };
20791
- const freezePane = {
20792
- name: _t("Freeze"),
20793
- icon: "o-spreadsheet-Icon.FREEZE",
20794
- };
20795
- const unFreezeRows = {
20796
- name: _t("No rows"),
20797
- execute: (env) => env.model.dispatch("UNFREEZE_ROWS", {
20798
- sheetId: env.model.getters.getActiveSheetId(),
20799
- }),
20800
- isReadonlyAllowed: true,
20801
- isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).ySplit,
20802
- };
20803
- const freezeFirstRow = {
20804
- name: _t("1 row"),
20805
- execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 1),
20806
- isReadonlyAllowed: true,
20807
- };
20808
- const freezeSecondRow = {
20809
- name: _t("2 rows"),
20810
- execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 2),
20811
- isReadonlyAllowed: true,
20812
- };
20813
- const freezeCurrentRow = {
20814
- name: _t("Up to current row"),
20815
- execute: (env) => {
20816
- const { bottom } = env.model.getters.getSelectedZone();
20817
- interactiveFreezeColumnsRows(env, "ROW", bottom + 1);
20818
- },
20819
- isReadonlyAllowed: true,
20820
- };
20821
- const unFreezeCols = {
20822
- name: _t("No columns"),
20823
- execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS", {
20824
- sheetId: env.model.getters.getActiveSheetId(),
20825
- }),
20826
- isReadonlyAllowed: true,
20827
- isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).xSplit,
20828
- };
20829
- const freezeFirstCol = {
20830
- name: _t("1 column"),
20831
- execute: (env) => interactiveFreezeColumnsRows(env, "COL", 1),
20832
- isReadonlyAllowed: true,
20833
- };
20834
- const freezeSecondCol = {
20835
- name: _t("2 columns"),
20836
- execute: (env) => interactiveFreezeColumnsRows(env, "COL", 2),
20837
- isReadonlyAllowed: true,
20838
- };
20839
- const freezeCurrentCol = {
20840
- name: _t("Up to current column"),
20841
- execute: (env) => {
20842
- const { right } = env.model.getters.getSelectedZone();
20843
- interactiveFreezeColumnsRows(env, "COL", right + 1);
20844
- },
20845
- isReadonlyAllowed: true,
20846
- };
20847
- const viewGridlines = {
20848
- name: (env) => env.model.getters.getGridLinesVisibility(env.model.getters.getActiveSheetId())
20849
- ? _t("Hide gridlines")
20850
- : _t("Show gridlines"),
20851
- execute: (env) => {
20852
- const sheetId = env.model.getters.getActiveSheetId();
20853
- env.model.dispatch("SET_GRID_LINES_VISIBILITY", {
20854
- sheetId,
20855
- areGridLinesVisible: !env.model.getters.getGridLinesVisibility(sheetId),
20856
- });
20857
- },
20858
- icon: "o-spreadsheet-Icon.SHOW_HIDE_GRID",
20859
- };
20860
- const viewFormulas = {
20861
- name: (env) => env.model.getters.shouldShowFormulas() ? "Hide formulas" : _t("Show formulas"),
20862
- execute: (env) => env.model.dispatch("SET_FORMULA_VISIBILITY", { show: !env.model.getters.shouldShowFormulas() }),
20863
- isReadonlyAllowed: true,
20864
- icon: "o-spreadsheet-Icon.SHOW_HIDE_FORMULA",
20865
- };
20866
- const createRemoveFilter = {
20867
- name: (env) => selectionContainsFilter(env) ? _t("Remove selected filters") : _t("Create filter"),
20868
- isActive: (env) => selectionContainsFilter(env),
20869
- isEnabled: (env) => !cannotCreateFilter(env),
20870
- execute: (env) => createRemoveFilterAction(env),
20871
- icon: "o-spreadsheet-Icon.FILTER_ICON_INACTIVE",
20872
- };
20873
- const groupColumns = {
20874
- name: (env) => {
20875
- const selection = env.model.getters.getSelectedZone();
20876
- if (selection.left === selection.right) {
20877
- return _t("Group column %s", numberToLetters(selection.left));
20878
- }
20879
- return _t("Group columns %s - %s", numberToLetters(selection.left), numberToLetters(selection.right));
20880
- },
20881
- execute: (env) => groupHeadersAction(env, "COL"),
20882
- isVisible: (env) => {
20883
- const sheetId = env.model.getters.getActiveSheetId();
20884
- const selection = env.model.getters.getSelectedZone();
20885
- const groups = env.model.getters.getHeaderGroupsInZone(sheetId, "COL", selection);
20886
- return (IS_ONLY_ONE_RANGE(env) &&
20887
- !groups.some((group) => group.start === selection.left && group.end === selection.right));
20888
- },
20889
- icon: "o-spreadsheet-Icon.GROUP_COLUMNS",
20890
- };
20891
- const groupRows = {
20892
- name: (env) => {
20893
- const selection = env.model.getters.getSelectedZone();
20894
- if (selection.top === selection.bottom) {
20895
- return _t("Group row %s", String(selection.top + 1));
20896
- }
20897
- return _t("Group rows %s - %s", String(selection.top + 1), String(selection.bottom + 1));
20898
- },
20899
- execute: (env) => groupHeadersAction(env, "ROW"),
20900
- isVisible: (env) => {
20901
- const sheetId = env.model.getters.getActiveSheetId();
20902
- const selection = env.model.getters.getSelectedZone();
20903
- const groups = env.model.getters.getHeaderGroupsInZone(sheetId, "ROW", selection);
20904
- return (IS_ONLY_ONE_RANGE(env) &&
20905
- !groups.some((group) => group.start === selection.top && group.end === selection.bottom));
20906
- },
20907
- icon: "o-spreadsheet-Icon.GROUP_ROWS",
20908
- };
20909
- const ungroupColumns = {
20910
- name: (env) => {
20911
- const selection = env.model.getters.getSelectedZone();
20912
- if (selection.left === selection.right) {
20913
- return _t("Ungroup column %s", numberToLetters(selection.left));
20914
- }
20915
- return _t("Ungroup columns %s - %s", numberToLetters(selection.left), numberToLetters(selection.right));
20916
- },
20917
- execute: (env) => ungroupHeaders(env, "COL"),
20918
- icon: "o-spreadsheet-Icon.UNGROUP_COLUMNS",
20919
- };
20920
- const ungroupRows = {
20921
- name: (env) => {
20922
- const selection = env.model.getters.getSelectedZone();
20923
- if (selection.top === selection.bottom) {
20924
- return _t("Ungroup row %s", String(selection.top + 1));
20925
- }
20926
- return _t("Ungroup rows %s - %s", String(selection.top + 1), String(selection.bottom + 1));
20927
- },
20928
- execute: (env) => ungroupHeaders(env, "ROW"),
20929
- icon: "o-spreadsheet-Icon.UNGROUP_ROWS",
20930
- };
20931
- function selectionContainsFilter(env) {
20932
- const sheetId = env.model.getters.getActiveSheetId();
20933
- const selectedZones = env.model.getters.getSelectedZones();
20934
- return env.model.getters.doesZonesContainFilter(sheetId, selectedZones);
20935
- }
20936
- function cannotCreateFilter(env) {
20937
- return !areZonesContinuous(...env.model.getters.getSelectedZones());
20938
- }
20939
- function createRemoveFilterAction(env) {
20940
- if (selectionContainsFilter(env)) {
20941
- env.model.dispatch("REMOVE_FILTER_TABLE", {
20942
- sheetId: env.model.getters.getActiveSheetId(),
20943
- target: env.model.getters.getSelectedZones(),
20944
- });
20945
- return;
20946
- }
20947
- if (cannotCreateFilter(env)) {
20948
- return;
20949
- }
20950
- env.model.selection.selectTableAroundSelection();
20951
- const sheetId = env.model.getters.getActiveSheetId();
20952
- const selection = env.model.getters.getSelectedZones();
20953
- interactiveAddFilter(env, sheetId, selection);
20954
- }
20955
- function groupHeadersAction(env, dim) {
20956
- const selection = env.model.getters.getSelectedZone();
20957
- const sheetId = env.model.getters.getActiveSheetId();
20958
- env.model.dispatch("GROUP_HEADERS", {
20959
- sheetId,
20960
- dimension: dim,
20961
- start: dim === "COL" ? selection.left : selection.top,
20962
- end: dim === "COL" ? selection.right : selection.bottom,
20963
- });
20964
- }
20965
- function ungroupHeaders(env, dim) {
20966
- const selection = env.model.getters.getSelectedZone();
20967
- const sheetId = env.model.getters.getActiveSheetId();
20968
- env.model.dispatch("UNGROUP_HEADERS", {
20969
- sheetId,
20970
- dimension: dim,
20971
- start: dim === "COL" ? selection.left : selection.top,
20972
- end: dim === "COL" ? selection.right : selection.bottom,
20973
- });
20974
- }
20975
- function canUngroupHeaders(env, dimension) {
20976
- const sheetId = env.model.getters.getActiveSheetId();
20977
- const selection = env.model.getters.getSelectedZones();
20978
- return (selection.length === 1 &&
20979
- env.model.getters.getHeaderGroupsInZone(sheetId, dimension, selection[0]).length > 0);
20980
- }
20981
-
20982
- var ACTION_VIEW = /*#__PURE__*/Object.freeze({
20983
- __proto__: null,
20984
- canUngroupHeaders: canUngroupHeaders,
20985
- createRemoveFilter: createRemoveFilter,
20986
- freezeCurrentCol: freezeCurrentCol,
20987
- freezeCurrentRow: freezeCurrentRow,
20988
- freezeFirstCol: freezeFirstCol,
20989
- freezeFirstRow: freezeFirstRow,
20990
- freezePane: freezePane,
20991
- freezeSecondCol: freezeSecondCol,
20992
- freezeSecondRow: freezeSecondRow,
20993
- groupColumns: groupColumns,
20994
- groupRows: groupRows,
20995
- hideCols: hideCols,
20996
- hideRows: hideRows,
20997
- unFreezeCols: unFreezeCols,
20998
- unFreezePane: unFreezePane,
20999
- unFreezeRows: unFreezeRows,
21000
- ungroupColumns: ungroupColumns,
21001
- ungroupRows: ungroupRows,
21002
- unhideAllCols: unhideAllCols,
21003
- unhideAllRows: unhideAllRows,
21004
- unhideCols: unhideCols,
21005
- unhideRows: unhideRows,
21006
- viewFormulas: viewFormulas,
21007
- viewGridlines: viewGridlines
21008
- });
21009
-
21010
21010
  const colMenuRegistry = new MenuItemRegistry();
21011
21011
  colMenuRegistry
21012
21012
  .add("cut", {
@@ -21653,13 +21653,8 @@
21653
21653
  sequence: 30,
21654
21654
  separator: true,
21655
21655
  })
21656
- .addChild("add_data_filter", ["data"], {
21657
- ...addDataFilter,
21658
- sequence: 40,
21659
- separator: true,
21660
- })
21661
- .addChild("remove_data_filter", ["data"], {
21662
- ...removeDataFilter,
21656
+ .addChild("add_remove_data_filter", ["data"], {
21657
+ ...addRemoveDataFilter,
21663
21658
  sequence: 40,
21664
21659
  separator: true,
21665
21660
  });
@@ -28344,6 +28339,10 @@
28344
28339
  height: 0px;
28345
28340
  }
28346
28341
  }
28342
+ .o-figure-container {
28343
+ -webkit-user-select: none; // safari
28344
+ user-select: none;
28345
+ }
28347
28346
  `;
28348
28347
  /**
28349
28348
  * Each figure ⭐ is positioned inside a container `div` placed and sized
@@ -49306,7 +49305,7 @@
49306
49305
  "isFilterActive",
49307
49306
  ];
49308
49307
  filterValues = {};
49309
- hiddenRows = new Set();
49308
+ hiddenRows = {};
49310
49309
  isEvaluationDirty = false;
49311
49310
  allowDispatch(cmd) {
49312
49311
  switch (cmd.type) {
@@ -49349,11 +49348,11 @@
49349
49348
  case "UNFOLD_HEADER_GROUP":
49350
49349
  case "FOLD_ALL_HEADER_GROUPS":
49351
49350
  case "UNFOLD_ALL_HEADER_GROUPS":
49352
- this.updateHiddenRows();
49351
+ this.updateHiddenRows(cmd.sheetId);
49353
49352
  break;
49354
49353
  case "UPDATE_FILTER":
49355
49354
  this.updateFilter(cmd);
49356
- this.updateHiddenRows();
49355
+ this.updateHiddenRows(cmd.sheetId);
49357
49356
  break;
49358
49357
  case "DUPLICATE_SHEET":
49359
49358
  const filterValues = {};
@@ -49373,15 +49372,14 @@
49373
49372
  }
49374
49373
  finalize() {
49375
49374
  if (this.isEvaluationDirty) {
49376
- this.updateHiddenRows();
49375
+ for (const sheetId of this.getters.getSheetIds()) {
49376
+ this.updateHiddenRows(sheetId);
49377
+ }
49377
49378
  this.isEvaluationDirty = false;
49378
49379
  }
49379
49380
  }
49380
49381
  isRowFiltered(sheetId, row) {
49381
- if (sheetId !== this.getters.getActiveSheetId()) {
49382
- return false;
49383
- }
49384
- return this.hiddenRows.has(row);
49382
+ return !!this.hiddenRows[sheetId]?.has(row);
49385
49383
  }
49386
49384
  getCellBorderWithFilterBorder(position) {
49387
49385
  const { sheetId, col, row } = position;
@@ -49432,8 +49430,7 @@
49432
49430
  this.filterValues[sheetId] = {};
49433
49431
  this.filterValues[sheetId][id] = hiddenValues;
49434
49432
  }
49435
- updateHiddenRows() {
49436
- const sheetId = this.getters.getActiveSheetId();
49433
+ updateHiddenRows(sheetId) {
49437
49434
  const filters = this.getters
49438
49435
  .getFilters(sheetId)
49439
49436
  .sort((filter1, filter2) => filter1.zoneWithHeaders.top - filter2.zoneWithHeaders.top);
@@ -49454,7 +49451,7 @@
49454
49451
  }
49455
49452
  }
49456
49453
  }
49457
- this.hiddenRows = hiddenRows;
49454
+ this.hiddenRows[sheetId] = hiddenRows;
49458
49455
  }
49459
49456
  getCellValueAsString(sheetId, col, row) {
49460
49457
  const value = this.getters.getEvaluatedCell({ sheetId, col, row }).formattedValue;
@@ -50564,13 +50561,14 @@
50564
50561
  }
50565
50562
  }
50566
50563
  handleEvent(event) {
50564
+ const sheetId = this.getters.getActiveSheetId();
50567
50565
  if (event.options.scrollIntoView) {
50568
50566
  let { col, row } = findCellInNewZone(event.previousAnchor.zone, event.anchor.zone);
50569
50567
  if (event.mode === "updateAnchor") {
50570
50568
  const oldZone = event.previousAnchor.zone;
50571
50569
  const newZone = event.anchor.zone;
50572
50570
  // altering a zone should not move the viewport in a dimension that wasn't changed
50573
- const { top, bottom, left, right } = this.getters.getActiveMainViewport();
50571
+ const { top, bottom, left, right } = this.getMainInternalViewport(sheetId);
50574
50572
  if (oldZone.left === newZone.left && oldZone.right === newZone.right) {
50575
50573
  col = left > col || col > right ? left : col;
50576
50574
  }
@@ -50578,7 +50576,6 @@
50578
50576
  row = top > row || row > bottom ? top : row;
50579
50577
  }
50580
50578
  }
50581
- const sheetId = this.getters.getActiveSheetId();
50582
50579
  col = Math.min(col, this.getters.getNumberCols(sheetId) - 1);
50583
50580
  row = Math.min(row, this.getters.getNumberRows(sheetId) - 1);
50584
50581
  if (!this.sheetsWithDirtyViewports.has(sheetId)) {
@@ -50615,16 +50612,16 @@
50615
50612
  this.setSheetViewOffset(cmd.offsetX, cmd.offsetY);
50616
50613
  break;
50617
50614
  case "SHIFT_VIEWPORT_DOWN":
50618
- const { top } = this.getActiveMainViewport();
50619
50615
  const sheetId = this.getters.getActiveSheetId();
50620
- const shiftedOffsetY = this.clipOffsetY(this.getters.getRowDimensions(sheetId, top).start + this.sheetViewHeight);
50621
- this.shiftVertically(shiftedOffsetY);
50616
+ const { top, viewportHeight, offsetCorrectionY } = this.getMainInternalViewport(sheetId);
50617
+ const topRowDims = this.getters.getRowDimensions(sheetId, top);
50618
+ this.shiftVertically(topRowDims.start + viewportHeight - offsetCorrectionY);
50622
50619
  break;
50623
50620
  case "SHIFT_VIEWPORT_UP": {
50624
- const { top } = this.getActiveMainViewport();
50625
50621
  const sheetId = this.getters.getActiveSheetId();
50626
- const shiftedOffsetY = this.clipOffsetY(this.getters.getRowDimensions(sheetId, top).end - this.sheetViewHeight);
50627
- this.shiftVertically(shiftedOffsetY);
50622
+ const { top, viewportHeight, offsetCorrectionY } = this.getMainInternalViewport(sheetId);
50623
+ const topRowDims = this.getters.getRowDimensions(sheetId, top);
50624
+ this.shiftVertically(topRowDims.end - offsetCorrectionY - viewportHeight);
50628
50625
  break;
50629
50626
  }
50630
50627
  case "REMOVE_FILTER_TABLE":
@@ -51017,17 +51014,6 @@
51017
51014
  const { maxOffsetX, maxOffsetY } = this.getMaximumSheetOffset();
51018
51015
  Object.values(this.getSubViewports(sheetId)).forEach((viewport) => viewport.setViewportOffset(clip(offsetX, 0, maxOffsetX), clip(offsetY, 0, maxOffsetY)));
51019
51016
  }
51020
- /**
51021
- * Clip the vertical offset within the allowed range.
51022
- * Not above the sheet, nor below the sheet.
51023
- */
51024
- clipOffsetY(offsetY) {
51025
- const { height } = this.getMainViewportRect();
51026
- const maxOffset = height - this.sheetViewHeight;
51027
- offsetY = Math.min(offsetY, maxOffset);
51028
- offsetY = Math.max(offsetY, 0);
51029
- return offsetY;
51030
- }
51031
51017
  getViewportOffset(sheetId) {
51032
51018
  return {
51033
51019
  x: this.viewports[sheetId]?.bottomRight.offsetScrollbarX || 0,
@@ -51083,12 +51069,15 @@
51083
51069
  * viewport top.
51084
51070
  */
51085
51071
  shiftVertically(offset) {
51086
- const { top } = this.getActiveMainViewport();
51072
+ const sheetId = this.getters.getActiveSheetId();
51073
+ const { top } = this.getMainInternalViewport(sheetId);
51087
51074
  const { scrollX } = this.getActiveSheetScrollInfo();
51088
51075
  this.setSheetViewOffset(scrollX, offset);
51089
51076
  const { anchor } = this.getters.getSelection();
51090
- const deltaRow = this.getActiveMainViewport().top - top;
51091
- this.selection.selectCell(anchor.cell.col, anchor.cell.row + deltaRow);
51077
+ if (anchor.cell.row >= this.getters.getPaneDivisions(sheetId).ySplit) {
51078
+ const deltaRow = this.getMainInternalViewport(sheetId).top - top;
51079
+ this.selection.selectCell(anchor.cell.col, anchor.cell.row + deltaRow);
51080
+ }
51092
51081
  }
51093
51082
  getVisibleFigures() {
51094
51083
  const sheetId = this.getters.getActiveSheetId();
@@ -52019,7 +52008,6 @@
52019
52008
  cursor: pointer;
52020
52009
  }
52021
52010
  `;
52022
- let tKey = 1;
52023
52011
  class SpreadsheetDashboard extends owl.Component {
52024
52012
  static template = "o-spreadsheet-SpreadsheetDashboard";
52025
52013
  static props = {};
@@ -52098,13 +52086,9 @@
52098
52086
  coordinates: rect,
52099
52087
  position: { col, row },
52100
52088
  action,
52101
- // we can't rely on position only because a row or a column could
52102
- // be inserted at any time.
52103
- tKey: `${tKey}-${col}-${row}`,
52104
52089
  });
52105
52090
  }
52106
52091
  }
52107
- tKey++;
52108
52092
  return cells;
52109
52093
  }
52110
52094
  getClickableAction(position) {
@@ -57371,9 +57355,9 @@
57371
57355
  exports.tokenize = tokenize;
57372
57356
 
57373
57357
 
57374
- __info__.version = "17.1.11";
57375
- __info__.date = "2024-04-10T12:27:11.107Z";
57376
- __info__.hash = "246caf7";
57358
+ __info__.version = "17.1.12";
57359
+ __info__.date = "2024-04-18T16:45:30.109Z";
57360
+ __info__.hash = "3e90776";
57377
57361
 
57378
57362
 
57379
57363
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);