@odoo/o-spreadsheet 17.1.10 → 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.10
6
- * @date 2024-04-05T14:00:03.890Z
7
- * @hash edc821c
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) {
@@ -550,7 +550,7 @@
550
550
  if (typeof o1 !== typeof o2)
551
551
  return false;
552
552
  if (typeof o1 !== "object")
553
- return o1 === o2;
553
+ return false;
554
554
  // Objects can have different keys if the values are undefined
555
555
  for (const key in o2) {
556
556
  if (!(key in o1) && o2[key] !== undefined) {
@@ -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();
@@ -8464,7 +8474,7 @@
8464
8474
  const xLabel = tooltipItem.dataset?.label || tooltipItem.label;
8465
8475
  // tooltipItem.parsed.y can be an object or a number for pie charts
8466
8476
  const yLabel = tooltipItem.parsed.y ?? tooltipItem.parsed;
8467
- const toolTipFormat = !format && yLabel > 1000 ? "#,##" : format;
8477
+ const toolTipFormat = !format && Math.abs(yLabel) >= 1000 ? "#,##" : format;
8468
8478
  const yLabelStr = formatValue(yLabel, { format: toolTipFormat, locale });
8469
8479
  return xLabel ? `${xLabel}: ${yLabelStr}` : yLabelStr;
8470
8480
  },
@@ -8751,7 +8761,10 @@
8751
8761
  if (isNaN(value))
8752
8762
  return value;
8753
8763
  const { locale, format } = localeFormat;
8754
- return formatValue(value, { locale, format: !format && value > 1000 ? "#,##" : format });
8764
+ return formatValue(value, {
8765
+ locale,
8766
+ format: !format && Math.abs(value) >= 1000 ? "#,##" : format,
8767
+ });
8755
8768
  },
8756
8769
  },
8757
8770
  },
@@ -9402,7 +9415,10 @@
9402
9415
  if (isNaN(value))
9403
9416
  return value;
9404
9417
  const { locale, format } = localeFormat;
9405
- return formatValue(value, { locale, format: !format && value > 1000 ? "#,##" : format });
9418
+ return formatValue(value, {
9419
+ locale,
9420
+ format: !format && Math.abs(value) >= 1000 ? "#,##" : format,
9421
+ });
9406
9422
  },
9407
9423
  },
9408
9424
  },
@@ -9629,7 +9645,7 @@
9629
9645
  const percentage = calculatePercentage(data, dataIndex);
9630
9646
  const xLabel = tooltipItem.label || tooltipItem.dataset.label;
9631
9647
  const yLabel = tooltipItem.parsed.y ?? tooltipItem.parsed;
9632
- const toolTipFormat = !format && yLabel > 1000 ? "#,##" : format;
9648
+ const toolTipFormat = !format && yLabel >= 1000 ? "#,##" : format;
9633
9649
  const yLabelStr = formatValue(yLabel, { format: toolTipFormat, locale });
9634
9650
  return xLabel ? `${xLabel}: ${yLabelStr} (${percentage}%)` : `${yLabelStr} (${percentage}%)`;
9635
9651
  };
@@ -19755,7 +19771,7 @@
19755
19771
  }
19756
19772
  const descr = addMetaInfoFromArg(addDescr);
19757
19773
  validateArguments(descr.args);
19758
- this.mapping[name] = addErrorHandling(addResultHandling(addInputHandling(descr)), name);
19774
+ this.mapping[name] = addErrorHandling(addResultHandling(addInputHandling(descr), name), name);
19759
19775
  super.add(name, descr);
19760
19776
  return this;
19761
19777
  }
@@ -19794,9 +19810,7 @@
19794
19810
  // so we fallback to a generic error
19795
19811
  if (hasStringValue(e) && isEvaluationError(e.value)) {
19796
19812
  if (hasStringMessage(e)) {
19797
- if (e.message?.includes("[[FUNCTION_NAME]]")) {
19798
- e.message = e.message.replace("[[FUNCTION_NAME]]", functionName);
19799
- }
19813
+ replaceFunctionNamePlaceholder(e, functionName);
19800
19814
  }
19801
19815
  return e;
19802
19816
  }
@@ -19811,21 +19825,29 @@
19811
19825
  return (obj?.message !== undefined &&
19812
19826
  typeof obj.message === "string");
19813
19827
  }
19814
- function addResultHandling(compute) {
19815
- return function (...args) {
19828
+ function addResultHandling(compute, functionName) {
19829
+ return function computeWithResultHandling(...args) {
19816
19830
  const result = compute.apply(this, args);
19817
19831
  if (!isMatrix(result)) {
19818
19832
  if (typeof result === "object" && result !== null && "value" in result) {
19833
+ replaceFunctionNamePlaceholder(result, functionName);
19819
19834
  return result;
19820
19835
  }
19821
19836
  return { value: result };
19822
19837
  }
19823
19838
  if (typeof result[0][0] === "object" && result[0][0] !== null && "value" in result[0][0]) {
19839
+ matrixForEach(result, (result) => replaceFunctionNamePlaceholder(result, functionName));
19824
19840
  return result;
19825
19841
  }
19826
19842
  return matrixMap(result, (row) => ({ value: row }));
19827
19843
  };
19828
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
+ }
19829
19851
  const functionRegistry = new FunctionRegistry();
19830
19852
  for (let category of categories) {
19831
19853
  const fns = category.functions;
@@ -20197,6 +20219,332 @@
20197
20219
  }
20198
20220
  }
20199
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
+
20200
20548
  const sortRange = {
20201
20549
  name: _t("Sort range"),
20202
20550
  isVisible: IS_ONLY_ONE_RANGE,
@@ -20239,32 +20587,15 @@
20239
20587
  },
20240
20588
  icon: "o-spreadsheet-Icon.SORT_DESCENDING",
20241
20589
  };
20242
- const addDataFilter = {
20243
- name: _t("Create filter"),
20244
- execute: (env) => {
20245
- const sheetId = env.model.getters.getActiveSheetId();
20246
- const selection = env.model.getters.getSelection().zones;
20247
- interactiveAddFilter(env, sheetId, selection);
20248
- },
20249
- 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),
20250
20593
  isEnabled: (env) => {
20251
20594
  const selectedZones = env.model.getters.getSelectedZones();
20252
20595
  return areZonesContinuous(...selectedZones);
20253
20596
  },
20254
20597
  icon: "o-spreadsheet-Icon.MENU_FILTER_ICON",
20255
20598
  };
20256
- const removeDataFilter = {
20257
- name: _t("Remove filter"),
20258
- execute: (env) => {
20259
- const sheetId = env.model.getters.getActiveSheetId();
20260
- env.model.dispatch("REMOVE_FILTER_TABLE", {
20261
- sheetId,
20262
- target: env.model.getters.getSelectedZones(),
20263
- });
20264
- },
20265
- isVisible: SELECTION_CONTAINS_FILTER,
20266
- icon: "o-spreadsheet-Icon.MENU_FILTER_ICON",
20267
- };
20268
20599
  const splitToColumns = {
20269
20600
  name: _t("Split text to columns"),
20270
20601
  sequence: 1,
@@ -20676,331 +21007,6 @@
20676
21007
  textColor: textColor
20677
21008
  });
20678
21009
 
20679
- function interactiveFreezeColumnsRows(env, dimension, base) {
20680
- const sheetId = env.model.getters.getActiveSheetId();
20681
- const cmd = dimension === "COL" ? "FREEZE_COLUMNS" : "FREEZE_ROWS";
20682
- const result = env.model.dispatch(cmd, { sheetId, quantity: base });
20683
- if (result.isCancelledBecause("MergeOverlap" /* CommandResult.MergeOverlap */)) {
20684
- env.raiseError(MergeErrorMessage);
20685
- }
20686
- }
20687
-
20688
- const hideCols = {
20689
- name: HIDE_COLUMNS_NAME,
20690
- execute: (env) => {
20691
- const columns = env.model.getters.getElementsFromSelection("COL");
20692
- env.model.dispatch("HIDE_COLUMNS_ROWS", {
20693
- sheetId: env.model.getters.getActiveSheetId(),
20694
- dimension: "COL",
20695
- elements: columns,
20696
- });
20697
- },
20698
- isVisible: NOT_ALL_VISIBLE_COLS_SELECTED,
20699
- icon: "o-spreadsheet-Icon.HIDE_COL",
20700
- };
20701
- const unhideCols = {
20702
- name: _t("Unhide columns"),
20703
- execute: (env) => {
20704
- const columns = env.model.getters.getElementsFromSelection("COL");
20705
- env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
20706
- sheetId: env.model.getters.getActiveSheetId(),
20707
- dimension: "COL",
20708
- elements: columns,
20709
- });
20710
- },
20711
- isVisible: (env) => {
20712
- const hiddenCols = env.model.getters
20713
- .getHiddenColsGroups(env.model.getters.getActiveSheetId())
20714
- .flat();
20715
- const currentCols = env.model.getters.getElementsFromSelection("COL");
20716
- return currentCols.some((col) => hiddenCols.includes(col));
20717
- },
20718
- };
20719
- const unhideAllCols = {
20720
- name: _t("Unhide all columns"),
20721
- execute: (env) => {
20722
- const sheetId = env.model.getters.getActiveSheetId();
20723
- env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
20724
- sheetId,
20725
- dimension: "COL",
20726
- elements: Array.from(Array(env.model.getters.getNumberCols(sheetId)).keys()),
20727
- });
20728
- },
20729
- isVisible: (env) => env.model.getters.getHiddenColsGroups(env.model.getters.getActiveSheetId()).length > 0,
20730
- };
20731
- const hideRows = {
20732
- name: HIDE_ROWS_NAME,
20733
- execute: (env) => {
20734
- const rows = env.model.getters.getElementsFromSelection("ROW");
20735
- env.model.dispatch("HIDE_COLUMNS_ROWS", {
20736
- sheetId: env.model.getters.getActiveSheetId(),
20737
- dimension: "ROW",
20738
- elements: rows,
20739
- });
20740
- },
20741
- isVisible: NOT_ALL_VISIBLE_ROWS_SELECTED,
20742
- icon: "o-spreadsheet-Icon.HIDE_ROW",
20743
- };
20744
- const unhideRows = {
20745
- name: _t("Unhide rows"),
20746
- execute: (env) => {
20747
- const columns = env.model.getters.getElementsFromSelection("ROW");
20748
- env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
20749
- sheetId: env.model.getters.getActiveSheetId(),
20750
- dimension: "ROW",
20751
- elements: columns,
20752
- });
20753
- },
20754
- isVisible: (env) => {
20755
- const hiddenRows = env.model.getters
20756
- .getHiddenRowsGroups(env.model.getters.getActiveSheetId())
20757
- .flat();
20758
- const currentRows = env.model.getters.getElementsFromSelection("ROW");
20759
- return currentRows.some((col) => hiddenRows.includes(col));
20760
- },
20761
- };
20762
- const unhideAllRows = {
20763
- name: _t("Unhide all rows"),
20764
- execute: (env) => {
20765
- const sheetId = env.model.getters.getActiveSheetId();
20766
- env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
20767
- sheetId,
20768
- dimension: "ROW",
20769
- elements: Array.from(Array(env.model.getters.getNumberRows(sheetId)).keys()),
20770
- });
20771
- },
20772
- isVisible: (env) => env.model.getters.getHiddenRowsGroups(env.model.getters.getActiveSheetId()).length > 0,
20773
- };
20774
- const unFreezePane = {
20775
- name: _t("Unfreeze"),
20776
- isVisible: (env) => {
20777
- const { xSplit, ySplit } = env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId());
20778
- return xSplit + ySplit > 0;
20779
- },
20780
- execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS_ROWS", {
20781
- sheetId: env.model.getters.getActiveSheetId(),
20782
- }),
20783
- icon: "o-spreadsheet-Icon.UNFREEZE",
20784
- };
20785
- const freezePane = {
20786
- name: _t("Freeze"),
20787
- icon: "o-spreadsheet-Icon.FREEZE",
20788
- };
20789
- const unFreezeRows = {
20790
- name: _t("No rows"),
20791
- execute: (env) => env.model.dispatch("UNFREEZE_ROWS", {
20792
- sheetId: env.model.getters.getActiveSheetId(),
20793
- }),
20794
- isReadonlyAllowed: true,
20795
- isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).ySplit,
20796
- };
20797
- const freezeFirstRow = {
20798
- name: _t("1 row"),
20799
- execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 1),
20800
- isReadonlyAllowed: true,
20801
- };
20802
- const freezeSecondRow = {
20803
- name: _t("2 rows"),
20804
- execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 2),
20805
- isReadonlyAllowed: true,
20806
- };
20807
- const freezeCurrentRow = {
20808
- name: _t("Up to current row"),
20809
- execute: (env) => {
20810
- const { bottom } = env.model.getters.getSelectedZone();
20811
- interactiveFreezeColumnsRows(env, "ROW", bottom + 1);
20812
- },
20813
- isReadonlyAllowed: true,
20814
- };
20815
- const unFreezeCols = {
20816
- name: _t("No columns"),
20817
- execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS", {
20818
- sheetId: env.model.getters.getActiveSheetId(),
20819
- }),
20820
- isReadonlyAllowed: true,
20821
- isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).xSplit,
20822
- };
20823
- const freezeFirstCol = {
20824
- name: _t("1 column"),
20825
- execute: (env) => interactiveFreezeColumnsRows(env, "COL", 1),
20826
- isReadonlyAllowed: true,
20827
- };
20828
- const freezeSecondCol = {
20829
- name: _t("2 columns"),
20830
- execute: (env) => interactiveFreezeColumnsRows(env, "COL", 2),
20831
- isReadonlyAllowed: true,
20832
- };
20833
- const freezeCurrentCol = {
20834
- name: _t("Up to current column"),
20835
- execute: (env) => {
20836
- const { right } = env.model.getters.getSelectedZone();
20837
- interactiveFreezeColumnsRows(env, "COL", right + 1);
20838
- },
20839
- isReadonlyAllowed: true,
20840
- };
20841
- const viewGridlines = {
20842
- name: (env) => env.model.getters.getGridLinesVisibility(env.model.getters.getActiveSheetId())
20843
- ? _t("Hide gridlines")
20844
- : _t("Show gridlines"),
20845
- execute: (env) => {
20846
- const sheetId = env.model.getters.getActiveSheetId();
20847
- env.model.dispatch("SET_GRID_LINES_VISIBILITY", {
20848
- sheetId,
20849
- areGridLinesVisible: !env.model.getters.getGridLinesVisibility(sheetId),
20850
- });
20851
- },
20852
- icon: "o-spreadsheet-Icon.SHOW_HIDE_GRID",
20853
- };
20854
- const viewFormulas = {
20855
- name: (env) => env.model.getters.shouldShowFormulas() ? "Hide formulas" : _t("Show formulas"),
20856
- execute: (env) => env.model.dispatch("SET_FORMULA_VISIBILITY", { show: !env.model.getters.shouldShowFormulas() }),
20857
- isReadonlyAllowed: true,
20858
- icon: "o-spreadsheet-Icon.SHOW_HIDE_FORMULA",
20859
- };
20860
- const createRemoveFilter = {
20861
- name: (env) => selectionContainsFilter(env) ? _t("Remove selected filters") : _t("Create filter"),
20862
- isActive: (env) => selectionContainsFilter(env),
20863
- isEnabled: (env) => !cannotCreateFilter(env),
20864
- execute: (env) => createRemoveFilterAction(env),
20865
- icon: "o-spreadsheet-Icon.FILTER_ICON_INACTIVE",
20866
- };
20867
- const groupColumns = {
20868
- name: (env) => {
20869
- const selection = env.model.getters.getSelectedZone();
20870
- if (selection.left === selection.right) {
20871
- return _t("Group column %s", numberToLetters(selection.left));
20872
- }
20873
- return _t("Group columns %s - %s", numberToLetters(selection.left), numberToLetters(selection.right));
20874
- },
20875
- execute: (env) => groupHeadersAction(env, "COL"),
20876
- isVisible: (env) => {
20877
- const sheetId = env.model.getters.getActiveSheetId();
20878
- const selection = env.model.getters.getSelectedZone();
20879
- const groups = env.model.getters.getHeaderGroupsInZone(sheetId, "COL", selection);
20880
- return (IS_ONLY_ONE_RANGE(env) &&
20881
- !groups.some((group) => group.start === selection.left && group.end === selection.right));
20882
- },
20883
- icon: "o-spreadsheet-Icon.GROUP_COLUMNS",
20884
- };
20885
- const groupRows = {
20886
- name: (env) => {
20887
- const selection = env.model.getters.getSelectedZone();
20888
- if (selection.top === selection.bottom) {
20889
- return _t("Group row %s", String(selection.top + 1));
20890
- }
20891
- return _t("Group rows %s - %s", String(selection.top + 1), String(selection.bottom + 1));
20892
- },
20893
- execute: (env) => groupHeadersAction(env, "ROW"),
20894
- isVisible: (env) => {
20895
- const sheetId = env.model.getters.getActiveSheetId();
20896
- const selection = env.model.getters.getSelectedZone();
20897
- const groups = env.model.getters.getHeaderGroupsInZone(sheetId, "ROW", selection);
20898
- return (IS_ONLY_ONE_RANGE(env) &&
20899
- !groups.some((group) => group.start === selection.top && group.end === selection.bottom));
20900
- },
20901
- icon: "o-spreadsheet-Icon.GROUP_ROWS",
20902
- };
20903
- const ungroupColumns = {
20904
- name: (env) => {
20905
- const selection = env.model.getters.getSelectedZone();
20906
- if (selection.left === selection.right) {
20907
- return _t("Ungroup column %s", numberToLetters(selection.left));
20908
- }
20909
- return _t("Ungroup columns %s - %s", numberToLetters(selection.left), numberToLetters(selection.right));
20910
- },
20911
- execute: (env) => ungroupHeaders(env, "COL"),
20912
- icon: "o-spreadsheet-Icon.UNGROUP_COLUMNS",
20913
- };
20914
- const ungroupRows = {
20915
- name: (env) => {
20916
- const selection = env.model.getters.getSelectedZone();
20917
- if (selection.top === selection.bottom) {
20918
- return _t("Ungroup row %s", String(selection.top + 1));
20919
- }
20920
- return _t("Ungroup rows %s - %s", String(selection.top + 1), String(selection.bottom + 1));
20921
- },
20922
- execute: (env) => ungroupHeaders(env, "ROW"),
20923
- icon: "o-spreadsheet-Icon.UNGROUP_ROWS",
20924
- };
20925
- function selectionContainsFilter(env) {
20926
- const sheetId = env.model.getters.getActiveSheetId();
20927
- const selectedZones = env.model.getters.getSelectedZones();
20928
- return env.model.getters.doesZonesContainFilter(sheetId, selectedZones);
20929
- }
20930
- function cannotCreateFilter(env) {
20931
- return !areZonesContinuous(...env.model.getters.getSelectedZones());
20932
- }
20933
- function createRemoveFilterAction(env) {
20934
- if (selectionContainsFilter(env)) {
20935
- env.model.dispatch("REMOVE_FILTER_TABLE", {
20936
- sheetId: env.model.getters.getActiveSheetId(),
20937
- target: env.model.getters.getSelectedZones(),
20938
- });
20939
- return;
20940
- }
20941
- if (cannotCreateFilter(env)) {
20942
- return;
20943
- }
20944
- env.model.selection.selectTableAroundSelection();
20945
- const sheetId = env.model.getters.getActiveSheetId();
20946
- const selection = env.model.getters.getSelectedZones();
20947
- interactiveAddFilter(env, sheetId, selection);
20948
- }
20949
- function groupHeadersAction(env, dim) {
20950
- const selection = env.model.getters.getSelectedZone();
20951
- const sheetId = env.model.getters.getActiveSheetId();
20952
- env.model.dispatch("GROUP_HEADERS", {
20953
- sheetId,
20954
- dimension: dim,
20955
- start: dim === "COL" ? selection.left : selection.top,
20956
- end: dim === "COL" ? selection.right : selection.bottom,
20957
- });
20958
- }
20959
- function ungroupHeaders(env, dim) {
20960
- const selection = env.model.getters.getSelectedZone();
20961
- const sheetId = env.model.getters.getActiveSheetId();
20962
- env.model.dispatch("UNGROUP_HEADERS", {
20963
- sheetId,
20964
- dimension: dim,
20965
- start: dim === "COL" ? selection.left : selection.top,
20966
- end: dim === "COL" ? selection.right : selection.bottom,
20967
- });
20968
- }
20969
- function canUngroupHeaders(env, dimension) {
20970
- const sheetId = env.model.getters.getActiveSheetId();
20971
- const selection = env.model.getters.getSelectedZones();
20972
- return (selection.length === 1 &&
20973
- env.model.getters.getHeaderGroupsInZone(sheetId, dimension, selection[0]).length > 0);
20974
- }
20975
-
20976
- var ACTION_VIEW = /*#__PURE__*/Object.freeze({
20977
- __proto__: null,
20978
- canUngroupHeaders: canUngroupHeaders,
20979
- createRemoveFilter: createRemoveFilter,
20980
- freezeCurrentCol: freezeCurrentCol,
20981
- freezeCurrentRow: freezeCurrentRow,
20982
- freezeFirstCol: freezeFirstCol,
20983
- freezeFirstRow: freezeFirstRow,
20984
- freezePane: freezePane,
20985
- freezeSecondCol: freezeSecondCol,
20986
- freezeSecondRow: freezeSecondRow,
20987
- groupColumns: groupColumns,
20988
- groupRows: groupRows,
20989
- hideCols: hideCols,
20990
- hideRows: hideRows,
20991
- unFreezeCols: unFreezeCols,
20992
- unFreezePane: unFreezePane,
20993
- unFreezeRows: unFreezeRows,
20994
- ungroupColumns: ungroupColumns,
20995
- ungroupRows: ungroupRows,
20996
- unhideAllCols: unhideAllCols,
20997
- unhideAllRows: unhideAllRows,
20998
- unhideCols: unhideCols,
20999
- unhideRows: unhideRows,
21000
- viewFormulas: viewFormulas,
21001
- viewGridlines: viewGridlines
21002
- });
21003
-
21004
21010
  const colMenuRegistry = new MenuItemRegistry();
21005
21011
  colMenuRegistry
21006
21012
  .add("cut", {
@@ -21647,13 +21653,8 @@
21647
21653
  sequence: 30,
21648
21654
  separator: true,
21649
21655
  })
21650
- .addChild("add_data_filter", ["data"], {
21651
- ...addDataFilter,
21652
- sequence: 40,
21653
- separator: true,
21654
- })
21655
- .addChild("remove_data_filter", ["data"], {
21656
- ...removeDataFilter,
21656
+ .addChild("add_remove_data_filter", ["data"], {
21657
+ ...addRemoveDataFilter,
21657
21658
  sequence: 40,
21658
21659
  separator: true,
21659
21660
  });
@@ -27102,6 +27103,7 @@
27102
27103
  onComposerCellFocused: { type: Function, optional: true },
27103
27104
  onComposerContentFocused: Function,
27104
27105
  isDefaultFocus: { type: Boolean, optional: true },
27106
+ onInputContextMenu: { type: Function, optional: true },
27105
27107
  };
27106
27108
  static components = { TextValueProvider, FunctionDescriptionProvider };
27107
27109
  static defaultProps = {
@@ -27460,6 +27462,11 @@
27460
27462
  }
27461
27463
  }
27462
27464
  }
27465
+ onContextMenu(ev) {
27466
+ if (this.env.model.getters.getEditionMode() === "inactive") {
27467
+ this.props.onInputContextMenu?.(ev);
27468
+ }
27469
+ }
27463
27470
  // ---------------------------------------------------------------------------
27464
27471
  // Private
27465
27472
  // ---------------------------------------------------------------------------
@@ -27727,6 +27734,7 @@
27727
27734
  onComposerCellFocused: Function,
27728
27735
  onComposerContentFocused: Function,
27729
27736
  gridDims: Object,
27737
+ onInputContextMenu: Function,
27730
27738
  };
27731
27739
  static components = { Composer };
27732
27740
  rect = this.defaultRect;
@@ -27771,6 +27779,7 @@
27771
27779
  isDefaultFocus: true,
27772
27780
  onComposerContentFocused: this.props.onComposerContentFocused,
27773
27781
  onComposerCellFocused: this.props.onComposerCellFocused,
27782
+ onInputContextMenu: this.props.onInputContextMenu,
27774
27783
  };
27775
27784
  }
27776
27785
  get containerStyle() {
@@ -28330,6 +28339,10 @@
28330
28339
  height: 0px;
28331
28340
  }
28332
28341
  }
28342
+ .o-figure-container {
28343
+ -webkit-user-select: none; // safari
28344
+ user-select: none;
28345
+ }
28333
28346
  `;
28334
28347
  /**
28335
28348
  * Each figure ⭐ is positioned inside a container `div` placed and sized
@@ -31768,29 +31781,12 @@
31768
31781
  return width;
31769
31782
  return Math.round((width / WIDTH_FACTOR) * 100) / 100;
31770
31783
  }
31771
- function convertBorderDescr(descr) {
31772
- if (!descr) {
31773
- return undefined;
31774
- }
31775
- return {
31776
- style: descr.style,
31777
- color: { rgb: descr.color },
31778
- };
31779
- }
31780
31784
  function extractStyle(cell, data) {
31781
31785
  let style = {};
31782
31786
  if (cell.style) {
31783
31787
  style = data.styles[cell.style];
31784
31788
  }
31785
31789
  const format = extractFormat(cell, data);
31786
- const exportedBorder = {};
31787
- if (cell.border) {
31788
- const border = data.borders[cell.border];
31789
- exportedBorder.left = convertBorderDescr(border.left);
31790
- exportedBorder.right = convertBorderDescr(border.right);
31791
- exportedBorder.bottom = convertBorderDescr(border.bottom);
31792
- exportedBorder.top = convertBorderDescr(border.top);
31793
- }
31794
31790
  const styles = {
31795
31791
  font: {
31796
31792
  size: style?.fontSize || DEFAULT_FONT_SIZE,
@@ -31804,7 +31800,7 @@
31804
31800
  }
31805
31801
  : { reservedAttribute: "none" },
31806
31802
  numFmt: format ? { format: format, id: 0 /* id not used for export */ } : undefined,
31807
- border: exportedBorder || {},
31803
+ border: cell.border || 0,
31808
31804
  alignment: {
31809
31805
  horizontal: style.align,
31810
31806
  vertical: style.verticalAlign
@@ -31826,15 +31822,12 @@
31826
31822
  return undefined;
31827
31823
  }
31828
31824
  function normalizeStyle(construct, styles) {
31829
- const { id: fontId } = pushElement(styles["font"], construct.fonts);
31830
- const { id: fillId } = pushElement(styles["fill"], construct.fills);
31831
- const { id: borderId } = pushElement(styles["border"], construct.borders);
31832
31825
  // Normalize this
31833
31826
  const numFmtId = convertFormat(styles["numFmt"], construct.numFmts);
31834
31827
  const style = {
31835
- fontId,
31836
- fillId,
31837
- borderId,
31828
+ fontId: pushElement(styles.font, construct.fonts),
31829
+ fillId: pushElement(styles.fill, construct.fills),
31830
+ borderId: styles.border,
31838
31831
  numFmtId,
31839
31832
  alignment: {
31840
31833
  vertical: styles.alignment.vertical,
@@ -31842,8 +31835,7 @@
31842
31835
  wrapText: styles.alignment.wrapText,
31843
31836
  },
31844
31837
  };
31845
- const { id } = pushElement(style, construct.styles);
31846
- return id;
31838
+ return pushElement(style, construct.styles);
31847
31839
  }
31848
31840
  function convertFormat(format, numFmtStructure) {
31849
31841
  if (!format) {
@@ -31851,8 +31843,7 @@
31851
31843
  }
31852
31844
  let formatId = XLSX_FORMAT_MAP[format.format];
31853
31845
  if (!formatId) {
31854
- const { id } = pushElement(format, numFmtStructure);
31855
- formatId = id + FIRST_NUMFMT_ID;
31846
+ formatId = pushElement(format, numFmtStructure) + FIRST_NUMFMT_ID;
31856
31847
  }
31857
31848
  return formatId;
31858
31849
  }
@@ -31877,20 +31868,15 @@
31877
31868
  return id;
31878
31869
  }
31879
31870
  function pushElement(property, propertyList) {
31880
- for (let [key, value] of Object.entries(propertyList)) {
31881
- if (JSON.stringify(value) === JSON.stringify(property)) {
31882
- return { id: parseInt(key, 10), list: propertyList };
31871
+ let len = propertyList.length;
31872
+ const operator = typeof property === "object" ? deepEquals : (a, b) => a === b;
31873
+ for (let i = 0; i < len; i++) {
31874
+ if (operator(property, propertyList[i])) {
31875
+ return i;
31883
31876
  }
31884
31877
  }
31885
- let elemId = propertyList.findIndex((elem) => JSON.stringify(elem) === JSON.stringify(property));
31886
- if (elemId === -1) {
31887
- propertyList.push(property);
31888
- elemId = propertyList.length - 1;
31889
- }
31890
- return {
31891
- id: elemId,
31892
- list: propertyList,
31893
- };
31878
+ propertyList[propertyList.length] = property;
31879
+ return propertyList.length - 1;
31894
31880
  }
31895
31881
  const chartIds = [];
31896
31882
  /**
@@ -32617,7 +32603,25 @@
32617
32603
  }
32618
32604
  return document;
32619
32605
  }
32620
- function getDefaultXLSXStructure() {
32606
+ function convertBorderDescr(descr) {
32607
+ if (!descr) {
32608
+ return undefined;
32609
+ }
32610
+ return {
32611
+ style: descr.style,
32612
+ color: { rgb: descr.color },
32613
+ };
32614
+ }
32615
+ function getDefaultXLSXStructure(data) {
32616
+ const xlsxBorders = Object.values(data.borders).map((border) => {
32617
+ return {
32618
+ left: convertBorderDescr(border.left),
32619
+ right: convertBorderDescr(border.right),
32620
+ bottom: convertBorderDescr(border.bottom),
32621
+ top: convertBorderDescr(border.top),
32622
+ };
32623
+ });
32624
+ const borders = [{}, ...xlsxBorders];
32621
32625
  return {
32622
32626
  relsFiles: [],
32623
32627
  sharedStrings: [],
@@ -32640,7 +32644,7 @@
32640
32644
  },
32641
32645
  ],
32642
32646
  fills: [{ reservedAttribute: "none" }, { reservedAttribute: "gray125" }],
32643
- borders: [{}],
32647
+ borders,
32644
32648
  numFmts: [],
32645
32649
  dxfs: [],
32646
32650
  };
@@ -37836,7 +37840,17 @@
37836
37840
  }
37837
37841
  }
37838
37842
  exportForExcel(data) {
37839
- this.export(data);
37843
+ for (const sheet of data.sheets) {
37844
+ for (const filterTable of this.getFilterTables(sheet.id)) {
37845
+ if (zoneToDimension(filterTable.zone).numberOfRows === 1) {
37846
+ continue;
37847
+ }
37848
+ sheet.filterTables.push({
37849
+ range: zoneToXc(filterTable.zone),
37850
+ filters: [],
37851
+ });
37852
+ }
37853
+ }
37840
37854
  }
37841
37855
  }
37842
37856
 
@@ -41556,7 +41570,9 @@
41556
41570
  this.blockedArrayFormulas = new Set();
41557
41571
  this.spreadingRelations = new SpreadingRelation();
41558
41572
  this.formulaDependencies = lazy(() => {
41559
- const dependencies = [...this.getAllCells()].flatMap((positionId) => this.getDirectDependencies(positionId).map((range) => ({
41573
+ const dependencies = [...this.getAllCells()].flatMap((positionId) => this.getDirectDependencies(positionId)
41574
+ .filter((range) => !range.invalidSheetName && !range.invalidXc)
41575
+ .map((range) => ({
41560
41576
  data: positionId,
41561
41577
  boundingBox: {
41562
41578
  zone: range.zone,
@@ -49289,7 +49305,7 @@
49289
49305
  "isFilterActive",
49290
49306
  ];
49291
49307
  filterValues = {};
49292
- hiddenRows = new Set();
49308
+ hiddenRows = {};
49293
49309
  isEvaluationDirty = false;
49294
49310
  allowDispatch(cmd) {
49295
49311
  switch (cmd.type) {
@@ -49332,11 +49348,11 @@
49332
49348
  case "UNFOLD_HEADER_GROUP":
49333
49349
  case "FOLD_ALL_HEADER_GROUPS":
49334
49350
  case "UNFOLD_ALL_HEADER_GROUPS":
49335
- this.updateHiddenRows();
49351
+ this.updateHiddenRows(cmd.sheetId);
49336
49352
  break;
49337
49353
  case "UPDATE_FILTER":
49338
49354
  this.updateFilter(cmd);
49339
- this.updateHiddenRows();
49355
+ this.updateHiddenRows(cmd.sheetId);
49340
49356
  break;
49341
49357
  case "DUPLICATE_SHEET":
49342
49358
  const filterValues = {};
@@ -49356,15 +49372,14 @@
49356
49372
  }
49357
49373
  finalize() {
49358
49374
  if (this.isEvaluationDirty) {
49359
- this.updateHiddenRows();
49375
+ for (const sheetId of this.getters.getSheetIds()) {
49376
+ this.updateHiddenRows(sheetId);
49377
+ }
49360
49378
  this.isEvaluationDirty = false;
49361
49379
  }
49362
49380
  }
49363
49381
  isRowFiltered(sheetId, row) {
49364
- if (sheetId !== this.getters.getActiveSheetId()) {
49365
- return false;
49366
- }
49367
- return this.hiddenRows.has(row);
49382
+ return !!this.hiddenRows[sheetId]?.has(row);
49368
49383
  }
49369
49384
  getCellBorderWithFilterBorder(position) {
49370
49385
  const { sheetId, col, row } = position;
@@ -49415,8 +49430,7 @@
49415
49430
  this.filterValues[sheetId] = {};
49416
49431
  this.filterValues[sheetId][id] = hiddenValues;
49417
49432
  }
49418
- updateHiddenRows() {
49419
- const sheetId = this.getters.getActiveSheetId();
49433
+ updateHiddenRows(sheetId) {
49420
49434
  const filters = this.getters
49421
49435
  .getFilters(sheetId)
49422
49436
  .sort((filter1, filter2) => filter1.zoneWithHeaders.top - filter2.zoneWithHeaders.top);
@@ -49437,7 +49451,7 @@
49437
49451
  }
49438
49452
  }
49439
49453
  }
49440
- this.hiddenRows = hiddenRows;
49454
+ this.hiddenRows[sheetId] = hiddenRows;
49441
49455
  }
49442
49456
  getCellValueAsString(sheetId, col, row) {
49443
49457
  const value = this.getters.getEvaluatedCell({ sheetId, col, row }).formattedValue;
@@ -50547,13 +50561,14 @@
50547
50561
  }
50548
50562
  }
50549
50563
  handleEvent(event) {
50564
+ const sheetId = this.getters.getActiveSheetId();
50550
50565
  if (event.options.scrollIntoView) {
50551
50566
  let { col, row } = findCellInNewZone(event.previousAnchor.zone, event.anchor.zone);
50552
50567
  if (event.mode === "updateAnchor") {
50553
50568
  const oldZone = event.previousAnchor.zone;
50554
50569
  const newZone = event.anchor.zone;
50555
50570
  // altering a zone should not move the viewport in a dimension that wasn't changed
50556
- const { top, bottom, left, right } = this.getters.getActiveMainViewport();
50571
+ const { top, bottom, left, right } = this.getMainInternalViewport(sheetId);
50557
50572
  if (oldZone.left === newZone.left && oldZone.right === newZone.right) {
50558
50573
  col = left > col || col > right ? left : col;
50559
50574
  }
@@ -50561,7 +50576,6 @@
50561
50576
  row = top > row || row > bottom ? top : row;
50562
50577
  }
50563
50578
  }
50564
- const sheetId = this.getters.getActiveSheetId();
50565
50579
  col = Math.min(col, this.getters.getNumberCols(sheetId) - 1);
50566
50580
  row = Math.min(row, this.getters.getNumberRows(sheetId) - 1);
50567
50581
  if (!this.sheetsWithDirtyViewports.has(sheetId)) {
@@ -50598,16 +50612,16 @@
50598
50612
  this.setSheetViewOffset(cmd.offsetX, cmd.offsetY);
50599
50613
  break;
50600
50614
  case "SHIFT_VIEWPORT_DOWN":
50601
- const { top } = this.getActiveMainViewport();
50602
50615
  const sheetId = this.getters.getActiveSheetId();
50603
- const shiftedOffsetY = this.clipOffsetY(this.getters.getRowDimensions(sheetId, top).start + this.sheetViewHeight);
50604
- 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);
50605
50619
  break;
50606
50620
  case "SHIFT_VIEWPORT_UP": {
50607
- const { top } = this.getActiveMainViewport();
50608
50621
  const sheetId = this.getters.getActiveSheetId();
50609
- const shiftedOffsetY = this.clipOffsetY(this.getters.getRowDimensions(sheetId, top).end - this.sheetViewHeight);
50610
- 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);
50611
50625
  break;
50612
50626
  }
50613
50627
  case "REMOVE_FILTER_TABLE":
@@ -51000,17 +51014,6 @@
51000
51014
  const { maxOffsetX, maxOffsetY } = this.getMaximumSheetOffset();
51001
51015
  Object.values(this.getSubViewports(sheetId)).forEach((viewport) => viewport.setViewportOffset(clip(offsetX, 0, maxOffsetX), clip(offsetY, 0, maxOffsetY)));
51002
51016
  }
51003
- /**
51004
- * Clip the vertical offset within the allowed range.
51005
- * Not above the sheet, nor below the sheet.
51006
- */
51007
- clipOffsetY(offsetY) {
51008
- const { height } = this.getMainViewportRect();
51009
- const maxOffset = height - this.sheetViewHeight;
51010
- offsetY = Math.min(offsetY, maxOffset);
51011
- offsetY = Math.max(offsetY, 0);
51012
- return offsetY;
51013
- }
51014
51017
  getViewportOffset(sheetId) {
51015
51018
  return {
51016
51019
  x: this.viewports[sheetId]?.bottomRight.offsetScrollbarX || 0,
@@ -51066,12 +51069,15 @@
51066
51069
  * viewport top.
51067
51070
  */
51068
51071
  shiftVertically(offset) {
51069
- const { top } = this.getActiveMainViewport();
51072
+ const sheetId = this.getters.getActiveSheetId();
51073
+ const { top } = this.getMainInternalViewport(sheetId);
51070
51074
  const { scrollX } = this.getActiveSheetScrollInfo();
51071
51075
  this.setSheetViewOffset(scrollX, offset);
51072
51076
  const { anchor } = this.getters.getSelection();
51073
- const deltaRow = this.getActiveMainViewport().top - top;
51074
- 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
+ }
51075
51081
  }
51076
51082
  getVisibleFigures() {
51077
51083
  const sheetId = this.getters.getActiveSheetId();
@@ -52002,7 +52008,6 @@
52002
52008
  cursor: pointer;
52003
52009
  }
52004
52010
  `;
52005
- let tKey = 1;
52006
52011
  class SpreadsheetDashboard extends owl.Component {
52007
52012
  static template = "o-spreadsheet-SpreadsheetDashboard";
52008
52013
  static props = {};
@@ -52081,13 +52086,9 @@
52081
52086
  coordinates: rect,
52082
52087
  position: { col, row },
52083
52088
  action,
52084
- // we can't rely on position only because a row or a column could
52085
- // be inserted at any time.
52086
- tKey: `${tKey}-${col}-${row}`,
52087
52089
  });
52088
52090
  }
52089
52091
  }
52090
- tKey++;
52091
52092
  return cells;
52092
52093
  }
52093
52094
  getClickableAction(position) {
@@ -55530,8 +55531,7 @@
55530
55531
  attrs.push(["t", "b"]);
55531
55532
  }
55532
55533
  else if (forceString || !isNumber(value, DEFAULT_LOCALE)) {
55533
- const { id } = pushElement(content, sharedStrings);
55534
- value = id.toString();
55534
+ value = pushElement(content, sharedStrings);
55535
55535
  attrs.push(["t", "s"]);
55536
55536
  }
55537
55537
  return { attrs, node: escapeXml /*xml*/ `<v>${value}</v>` };
@@ -55656,8 +55656,7 @@
55656
55656
  if (rule.style.fillColor) {
55657
55657
  dxf.fill = { fgColor: { rgb: rule.style.fillColor } };
55658
55658
  }
55659
- const { id } = pushElement(dxf, dxfs);
55660
- ruleAttributes.push(["dxfId", id]);
55659
+ ruleAttributes.push(["dxfId", pushElement(dxf, dxfs)]);
55661
55660
  return escapeXml /*xml*/ `
55662
55661
  <conditionalFormatting sqref="${cf.ranges.join(" ")}">
55663
55662
  <cfRule ${formatAttributes(ruleAttributes)}>
@@ -56467,7 +56466,7 @@
56467
56466
  */
56468
56467
  function getXLSX(data) {
56469
56468
  const files = [];
56470
- const construct = getDefaultXLSXStructure();
56469
+ const construct = getDefaultXLSXStructure(data);
56471
56470
  files.push(createWorkbook(data, construct));
56472
56471
  files.push(...createWorksheets(data, construct));
56473
56472
  files.push(createStylesSheet(construct));
@@ -57356,9 +57355,9 @@
57356
57355
  exports.tokenize = tokenize;
57357
57356
 
57358
57357
 
57359
- __info__.version = "17.1.10";
57360
- __info__.date = "2024-04-05T14:00:03.890Z";
57361
- __info__.hash = "edc821c";
57358
+ __info__.version = "17.1.12";
57359
+ __info__.date = "2024-04-18T16:45:30.109Z";
57360
+ __info__.hash = "3e90776";
57362
57361
 
57363
57362
 
57364
57363
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);