@odoo/o-spreadsheet 16.4.28 → 16.4.30

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.
@@ -614,7 +614,7 @@
614
614
  if (typeof o1 !== typeof o2)
615
615
  return false;
616
616
  if (typeof o1 !== "object")
617
- return o1 === o2;
617
+ return false;
618
618
  // Objects can have different keys if the values are undefined
619
619
  const keys = new Set();
620
620
  Object.keys(o1).forEach((key) => keys.add(key));
@@ -15798,6 +15798,7 @@
15798
15798
  this.save();
15799
15799
  }
15800
15800
  ev.stopPropagation();
15801
+ ev.preventDefault();
15801
15802
  break;
15802
15803
  case "Escape":
15803
15804
  this.cancel();
@@ -19337,6 +19338,243 @@
19337
19338
  }
19338
19339
  }
19339
19340
 
19341
+ function interactiveFreezeColumnsRows(env, dimension, base) {
19342
+ const sheetId = env.model.getters.getActiveSheetId();
19343
+ const cmd = dimension === "COL" ? "FREEZE_COLUMNS" : "FREEZE_ROWS";
19344
+ const result = env.model.dispatch(cmd, { sheetId, quantity: base });
19345
+ if (result.isCancelledBecause(68 /* CommandResult.MergeOverlap */)) {
19346
+ env.raiseError(MergeErrorMessage);
19347
+ }
19348
+ }
19349
+
19350
+ const hideCols = {
19351
+ name: HIDE_COLUMNS_NAME,
19352
+ execute: (env) => {
19353
+ const columns = env.model.getters.getElementsFromSelection("COL");
19354
+ env.model.dispatch("HIDE_COLUMNS_ROWS", {
19355
+ sheetId: env.model.getters.getActiveSheetId(),
19356
+ dimension: "COL",
19357
+ elements: columns,
19358
+ });
19359
+ },
19360
+ isVisible: NOT_ALL_VISIBLE_COLS_SELECTED,
19361
+ icon: "o-spreadsheet-Icon.HIDE_COL",
19362
+ };
19363
+ const unhideCols = {
19364
+ name: _lt("Unhide columns"),
19365
+ execute: (env) => {
19366
+ const columns = env.model.getters.getElementsFromSelection("COL");
19367
+ env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
19368
+ sheetId: env.model.getters.getActiveSheetId(),
19369
+ dimension: "COL",
19370
+ elements: columns,
19371
+ });
19372
+ },
19373
+ isVisible: (env) => {
19374
+ const hiddenCols = env.model.getters
19375
+ .getHiddenColsGroups(env.model.getters.getActiveSheetId())
19376
+ .flat();
19377
+ const currentCols = env.model.getters.getElementsFromSelection("COL");
19378
+ return currentCols.some((col) => hiddenCols.includes(col));
19379
+ },
19380
+ };
19381
+ const unhideAllCols = {
19382
+ name: _lt("Unhide all columns"),
19383
+ execute: (env) => {
19384
+ const sheetId = env.model.getters.getActiveSheetId();
19385
+ env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
19386
+ sheetId,
19387
+ dimension: "COL",
19388
+ elements: Array.from(Array(env.model.getters.getNumberCols(sheetId)).keys()),
19389
+ });
19390
+ },
19391
+ isVisible: (env) => env.model.getters.getHiddenColsGroups(env.model.getters.getActiveSheetId()).length > 0,
19392
+ };
19393
+ const hideRows = {
19394
+ name: HIDE_ROWS_NAME,
19395
+ execute: (env) => {
19396
+ const rows = env.model.getters.getElementsFromSelection("ROW");
19397
+ env.model.dispatch("HIDE_COLUMNS_ROWS", {
19398
+ sheetId: env.model.getters.getActiveSheetId(),
19399
+ dimension: "ROW",
19400
+ elements: rows,
19401
+ });
19402
+ },
19403
+ isVisible: NOT_ALL_VISIBLE_ROWS_SELECTED,
19404
+ icon: "o-spreadsheet-Icon.HIDE_ROW",
19405
+ };
19406
+ const unhideRows = {
19407
+ name: _lt("Unhide rows"),
19408
+ execute: (env) => {
19409
+ const columns = env.model.getters.getElementsFromSelection("ROW");
19410
+ env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
19411
+ sheetId: env.model.getters.getActiveSheetId(),
19412
+ dimension: "ROW",
19413
+ elements: columns,
19414
+ });
19415
+ },
19416
+ isVisible: (env) => {
19417
+ const hiddenRows = env.model.getters
19418
+ .getHiddenRowsGroups(env.model.getters.getActiveSheetId())
19419
+ .flat();
19420
+ const currentRows = env.model.getters.getElementsFromSelection("ROW");
19421
+ return currentRows.some((col) => hiddenRows.includes(col));
19422
+ },
19423
+ };
19424
+ const unhideAllRows = {
19425
+ name: _lt("Unhide all rows"),
19426
+ execute: (env) => {
19427
+ const sheetId = env.model.getters.getActiveSheetId();
19428
+ env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
19429
+ sheetId,
19430
+ dimension: "ROW",
19431
+ elements: Array.from(Array(env.model.getters.getNumberRows(sheetId)).keys()),
19432
+ });
19433
+ },
19434
+ isVisible: (env) => env.model.getters.getHiddenRowsGroups(env.model.getters.getActiveSheetId()).length > 0,
19435
+ };
19436
+ const unFreezePane = {
19437
+ name: _lt("Unfreeze"),
19438
+ isVisible: (env) => {
19439
+ const { xSplit, ySplit } = env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId());
19440
+ return xSplit + ySplit > 0;
19441
+ },
19442
+ execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS_ROWS", {
19443
+ sheetId: env.model.getters.getActiveSheetId(),
19444
+ }),
19445
+ icon: "o-spreadsheet-Icon.UNFREEZE",
19446
+ };
19447
+ const freezePane = {
19448
+ name: _lt("Freeze"),
19449
+ icon: "o-spreadsheet-Icon.FREEZE",
19450
+ };
19451
+ const unFreezeRows = {
19452
+ name: _lt("No rows"),
19453
+ execute: (env) => env.model.dispatch("UNFREEZE_ROWS", {
19454
+ sheetId: env.model.getters.getActiveSheetId(),
19455
+ }),
19456
+ isReadonlyAllowed: true,
19457
+ isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).ySplit,
19458
+ };
19459
+ const freezeFirstRow = {
19460
+ name: _lt("1 row"),
19461
+ execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 1),
19462
+ isReadonlyAllowed: true,
19463
+ };
19464
+ const freezeSecondRow = {
19465
+ name: _lt("2 rows"),
19466
+ execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 2),
19467
+ isReadonlyAllowed: true,
19468
+ };
19469
+ const freezeCurrentRow = {
19470
+ name: _lt("Up to current row"),
19471
+ execute: (env) => {
19472
+ const { bottom } = env.model.getters.getSelectedZone();
19473
+ interactiveFreezeColumnsRows(env, "ROW", bottom + 1);
19474
+ },
19475
+ isReadonlyAllowed: true,
19476
+ };
19477
+ const unFreezeCols = {
19478
+ name: _lt("No columns"),
19479
+ execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS", {
19480
+ sheetId: env.model.getters.getActiveSheetId(),
19481
+ }),
19482
+ isReadonlyAllowed: true,
19483
+ isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).xSplit,
19484
+ };
19485
+ const freezeFirstCol = {
19486
+ name: _lt("1 column"),
19487
+ execute: (env) => interactiveFreezeColumnsRows(env, "COL", 1),
19488
+ isReadonlyAllowed: true,
19489
+ };
19490
+ const freezeSecondCol = {
19491
+ name: _lt("2 columns"),
19492
+ execute: (env) => interactiveFreezeColumnsRows(env, "COL", 2),
19493
+ isReadonlyAllowed: true,
19494
+ };
19495
+ const freezeCurrentCol = {
19496
+ name: _lt("Up to current column"),
19497
+ execute: (env) => {
19498
+ const { right } = env.model.getters.getSelectedZone();
19499
+ interactiveFreezeColumnsRows(env, "COL", right + 1);
19500
+ },
19501
+ isReadonlyAllowed: true,
19502
+ };
19503
+ const viewGridlines = {
19504
+ name: (env) => env.model.getters.getGridLinesVisibility(env.model.getters.getActiveSheetId())
19505
+ ? _lt("Hide gridlines")
19506
+ : _lt("Show gridlines"),
19507
+ execute: (env) => {
19508
+ const sheetId = env.model.getters.getActiveSheetId();
19509
+ env.model.dispatch("SET_GRID_LINES_VISIBILITY", {
19510
+ sheetId,
19511
+ areGridLinesVisible: !env.model.getters.getGridLinesVisibility(sheetId),
19512
+ });
19513
+ },
19514
+ icon: "o-spreadsheet-Icon.SHOW_HIDE_GRID",
19515
+ };
19516
+ const viewFormulas = {
19517
+ name: (env) => env.model.getters.shouldShowFormulas() ? _lt("Hide formulas") : _lt("Show formulas"),
19518
+ execute: (env) => env.model.dispatch("SET_FORMULA_VISIBILITY", { show: !env.model.getters.shouldShowFormulas() }),
19519
+ isReadonlyAllowed: true,
19520
+ icon: "o-spreadsheet-Icon.SHOW_HIDE_FORMULA",
19521
+ };
19522
+ const createRemoveFilter = {
19523
+ name: (env) => selectionContainsFilter(env) ? _lt("Remove selected filters") : _lt("Create filter"),
19524
+ isActive: (env) => selectionContainsFilter(env),
19525
+ isEnabled: (env) => !cannotCreateFilter(env),
19526
+ execute: (env) => createRemoveFilterAction(env),
19527
+ icon: "o-spreadsheet-Icon.FILTER_ICON_INACTIVE",
19528
+ };
19529
+ function selectionContainsFilter(env) {
19530
+ const sheetId = env.model.getters.getActiveSheetId();
19531
+ const selectedZones = env.model.getters.getSelectedZones();
19532
+ return env.model.getters.doesZonesContainFilter(sheetId, selectedZones);
19533
+ }
19534
+ function cannotCreateFilter(env) {
19535
+ return !areZonesContinuous(...env.model.getters.getSelectedZones());
19536
+ }
19537
+ function createRemoveFilterAction(env) {
19538
+ if (selectionContainsFilter(env)) {
19539
+ env.model.dispatch("REMOVE_FILTER_TABLE", {
19540
+ sheetId: env.model.getters.getActiveSheetId(),
19541
+ target: env.model.getters.getSelectedZones(),
19542
+ });
19543
+ return;
19544
+ }
19545
+ if (cannotCreateFilter(env)) {
19546
+ return;
19547
+ }
19548
+ env.model.selection.selectTableAroundSelection();
19549
+ const sheetId = env.model.getters.getActiveSheetId();
19550
+ const selection = env.model.getters.getSelectedZones();
19551
+ interactiveAddFilter(env, sheetId, selection);
19552
+ }
19553
+
19554
+ var ACTION_VIEW = /*#__PURE__*/Object.freeze({
19555
+ __proto__: null,
19556
+ hideCols: hideCols,
19557
+ unhideCols: unhideCols,
19558
+ unhideAllCols: unhideAllCols,
19559
+ hideRows: hideRows,
19560
+ unhideRows: unhideRows,
19561
+ unhideAllRows: unhideAllRows,
19562
+ unFreezePane: unFreezePane,
19563
+ freezePane: freezePane,
19564
+ unFreezeRows: unFreezeRows,
19565
+ freezeFirstRow: freezeFirstRow,
19566
+ freezeSecondRow: freezeSecondRow,
19567
+ freezeCurrentRow: freezeCurrentRow,
19568
+ unFreezeCols: unFreezeCols,
19569
+ freezeFirstCol: freezeFirstCol,
19570
+ freezeSecondCol: freezeSecondCol,
19571
+ freezeCurrentCol: freezeCurrentCol,
19572
+ viewGridlines: viewGridlines,
19573
+ viewFormulas: viewFormulas,
19574
+ createRemoveFilter: createRemoveFilter,
19575
+ createRemoveFilterAction: createRemoveFilterAction
19576
+ });
19577
+
19340
19578
  const sortRange = {
19341
19579
  name: _lt("Sort range"),
19342
19580
  isVisible: IS_ONLY_ONE_RANGE,
@@ -19360,32 +19598,15 @@
19360
19598
  },
19361
19599
  icon: "o-spreadsheet-Icon.SORT_DESCENDING",
19362
19600
  };
19363
- const addDataFilter = {
19364
- name: _lt("Create filter"),
19365
- execute: (env) => {
19366
- const sheetId = env.model.getters.getActiveSheetId();
19367
- const selection = env.model.getters.getSelection().zones;
19368
- interactiveAddFilter(env, sheetId, selection);
19369
- },
19370
- isVisible: (env) => !SELECTION_CONTAINS_FILTER(env),
19601
+ const addRemoveDataFilter = {
19602
+ name: (env) => SELECTION_CONTAINS_FILTER(env) ? _lt("Remove filter") : _lt("Create filter"),
19603
+ execute: (env) => createRemoveFilterAction(env),
19371
19604
  isEnabled: (env) => {
19372
19605
  const selectedZones = env.model.getters.getSelectedZones();
19373
19606
  return areZonesContinuous(...selectedZones);
19374
19607
  },
19375
19608
  icon: "o-spreadsheet-Icon.MENU_FILTER_ICON",
19376
19609
  };
19377
- const removeDataFilter = {
19378
- name: _lt("Remove filter"),
19379
- execute: (env) => {
19380
- const sheetId = env.model.getters.getActiveSheetId();
19381
- env.model.dispatch("REMOVE_FILTER_TABLE", {
19382
- sheetId,
19383
- target: env.model.getters.getSelectedZones(),
19384
- });
19385
- },
19386
- isVisible: SELECTION_CONTAINS_FILTER,
19387
- icon: "o-spreadsheet-Icon.MENU_FILTER_ICON",
19388
- };
19389
19610
  const splitToColumns = {
19390
19611
  name: _lt("Split text to columns"),
19391
19612
  sequence: 1,
@@ -19765,242 +19986,6 @@
19765
19986
  clearFormat: clearFormat
19766
19987
  });
19767
19988
 
19768
- function interactiveFreezeColumnsRows(env, dimension, base) {
19769
- const sheetId = env.model.getters.getActiveSheetId();
19770
- const cmd = dimension === "COL" ? "FREEZE_COLUMNS" : "FREEZE_ROWS";
19771
- const result = env.model.dispatch(cmd, { sheetId, quantity: base });
19772
- if (result.isCancelledBecause(68 /* CommandResult.MergeOverlap */)) {
19773
- env.raiseError(MergeErrorMessage);
19774
- }
19775
- }
19776
-
19777
- const hideCols = {
19778
- name: HIDE_COLUMNS_NAME,
19779
- execute: (env) => {
19780
- const columns = env.model.getters.getElementsFromSelection("COL");
19781
- env.model.dispatch("HIDE_COLUMNS_ROWS", {
19782
- sheetId: env.model.getters.getActiveSheetId(),
19783
- dimension: "COL",
19784
- elements: columns,
19785
- });
19786
- },
19787
- isVisible: NOT_ALL_VISIBLE_COLS_SELECTED,
19788
- icon: "o-spreadsheet-Icon.HIDE_COL",
19789
- };
19790
- const unhideCols = {
19791
- name: _lt("Unhide columns"),
19792
- execute: (env) => {
19793
- const columns = env.model.getters.getElementsFromSelection("COL");
19794
- env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
19795
- sheetId: env.model.getters.getActiveSheetId(),
19796
- dimension: "COL",
19797
- elements: columns,
19798
- });
19799
- },
19800
- isVisible: (env) => {
19801
- const hiddenCols = env.model.getters
19802
- .getHiddenColsGroups(env.model.getters.getActiveSheetId())
19803
- .flat();
19804
- const currentCols = env.model.getters.getElementsFromSelection("COL");
19805
- return currentCols.some((col) => hiddenCols.includes(col));
19806
- },
19807
- };
19808
- const unhideAllCols = {
19809
- name: _lt("Unhide all columns"),
19810
- execute: (env) => {
19811
- const sheetId = env.model.getters.getActiveSheetId();
19812
- env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
19813
- sheetId,
19814
- dimension: "COL",
19815
- elements: Array.from(Array(env.model.getters.getNumberCols(sheetId)).keys()),
19816
- });
19817
- },
19818
- isVisible: (env) => env.model.getters.getHiddenColsGroups(env.model.getters.getActiveSheetId()).length > 0,
19819
- };
19820
- const hideRows = {
19821
- name: HIDE_ROWS_NAME,
19822
- execute: (env) => {
19823
- const rows = env.model.getters.getElementsFromSelection("ROW");
19824
- env.model.dispatch("HIDE_COLUMNS_ROWS", {
19825
- sheetId: env.model.getters.getActiveSheetId(),
19826
- dimension: "ROW",
19827
- elements: rows,
19828
- });
19829
- },
19830
- isVisible: NOT_ALL_VISIBLE_ROWS_SELECTED,
19831
- icon: "o-spreadsheet-Icon.HIDE_ROW",
19832
- };
19833
- const unhideRows = {
19834
- name: _lt("Unhide rows"),
19835
- execute: (env) => {
19836
- const columns = env.model.getters.getElementsFromSelection("ROW");
19837
- env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
19838
- sheetId: env.model.getters.getActiveSheetId(),
19839
- dimension: "ROW",
19840
- elements: columns,
19841
- });
19842
- },
19843
- isVisible: (env) => {
19844
- const hiddenRows = env.model.getters
19845
- .getHiddenRowsGroups(env.model.getters.getActiveSheetId())
19846
- .flat();
19847
- const currentRows = env.model.getters.getElementsFromSelection("ROW");
19848
- return currentRows.some((col) => hiddenRows.includes(col));
19849
- },
19850
- };
19851
- const unhideAllRows = {
19852
- name: _lt("Unhide all rows"),
19853
- execute: (env) => {
19854
- const sheetId = env.model.getters.getActiveSheetId();
19855
- env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
19856
- sheetId,
19857
- dimension: "ROW",
19858
- elements: Array.from(Array(env.model.getters.getNumberRows(sheetId)).keys()),
19859
- });
19860
- },
19861
- isVisible: (env) => env.model.getters.getHiddenRowsGroups(env.model.getters.getActiveSheetId()).length > 0,
19862
- };
19863
- const unFreezePane = {
19864
- name: _lt("Unfreeze"),
19865
- isVisible: (env) => {
19866
- const { xSplit, ySplit } = env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId());
19867
- return xSplit + ySplit > 0;
19868
- },
19869
- execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS_ROWS", {
19870
- sheetId: env.model.getters.getActiveSheetId(),
19871
- }),
19872
- icon: "o-spreadsheet-Icon.UNFREEZE",
19873
- };
19874
- const freezePane = {
19875
- name: _lt("Freeze"),
19876
- icon: "o-spreadsheet-Icon.FREEZE",
19877
- };
19878
- const unFreezeRows = {
19879
- name: _lt("No rows"),
19880
- execute: (env) => env.model.dispatch("UNFREEZE_ROWS", {
19881
- sheetId: env.model.getters.getActiveSheetId(),
19882
- }),
19883
- isReadonlyAllowed: true,
19884
- isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).ySplit,
19885
- };
19886
- const freezeFirstRow = {
19887
- name: _lt("1 row"),
19888
- execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 1),
19889
- isReadonlyAllowed: true,
19890
- };
19891
- const freezeSecondRow = {
19892
- name: _lt("2 rows"),
19893
- execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 2),
19894
- isReadonlyAllowed: true,
19895
- };
19896
- const freezeCurrentRow = {
19897
- name: _lt("Up to current row"),
19898
- execute: (env) => {
19899
- const { bottom } = env.model.getters.getSelectedZone();
19900
- interactiveFreezeColumnsRows(env, "ROW", bottom + 1);
19901
- },
19902
- isReadonlyAllowed: true,
19903
- };
19904
- const unFreezeCols = {
19905
- name: _lt("No columns"),
19906
- execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS", {
19907
- sheetId: env.model.getters.getActiveSheetId(),
19908
- }),
19909
- isReadonlyAllowed: true,
19910
- isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).xSplit,
19911
- };
19912
- const freezeFirstCol = {
19913
- name: _lt("1 column"),
19914
- execute: (env) => interactiveFreezeColumnsRows(env, "COL", 1),
19915
- isReadonlyAllowed: true,
19916
- };
19917
- const freezeSecondCol = {
19918
- name: _lt("2 columns"),
19919
- execute: (env) => interactiveFreezeColumnsRows(env, "COL", 2),
19920
- isReadonlyAllowed: true,
19921
- };
19922
- const freezeCurrentCol = {
19923
- name: _lt("Up to current column"),
19924
- execute: (env) => {
19925
- const { right } = env.model.getters.getSelectedZone();
19926
- interactiveFreezeColumnsRows(env, "COL", right + 1);
19927
- },
19928
- isReadonlyAllowed: true,
19929
- };
19930
- const viewGridlines = {
19931
- name: (env) => env.model.getters.getGridLinesVisibility(env.model.getters.getActiveSheetId())
19932
- ? _lt("Hide gridlines")
19933
- : _lt("Show gridlines"),
19934
- execute: (env) => {
19935
- const sheetId = env.model.getters.getActiveSheetId();
19936
- env.model.dispatch("SET_GRID_LINES_VISIBILITY", {
19937
- sheetId,
19938
- areGridLinesVisible: !env.model.getters.getGridLinesVisibility(sheetId),
19939
- });
19940
- },
19941
- icon: "o-spreadsheet-Icon.SHOW_HIDE_GRID",
19942
- };
19943
- const viewFormulas = {
19944
- name: (env) => env.model.getters.shouldShowFormulas() ? _lt("Hide formulas") : _lt("Show formulas"),
19945
- execute: (env) => env.model.dispatch("SET_FORMULA_VISIBILITY", { show: !env.model.getters.shouldShowFormulas() }),
19946
- isReadonlyAllowed: true,
19947
- icon: "o-spreadsheet-Icon.SHOW_HIDE_FORMULA",
19948
- };
19949
- const createRemoveFilter = {
19950
- name: (env) => selectionContainsFilter(env) ? _lt("Remove selected filters") : _lt("Create filter"),
19951
- isActive: (env) => selectionContainsFilter(env),
19952
- isEnabled: (env) => !cannotCreateFilter(env),
19953
- execute: (env) => createRemoveFilterAction(env),
19954
- icon: "o-spreadsheet-Icon.FILTER_ICON_INACTIVE",
19955
- };
19956
- function selectionContainsFilter(env) {
19957
- const sheetId = env.model.getters.getActiveSheetId();
19958
- const selectedZones = env.model.getters.getSelectedZones();
19959
- return env.model.getters.doesZonesContainFilter(sheetId, selectedZones);
19960
- }
19961
- function cannotCreateFilter(env) {
19962
- return !areZonesContinuous(...env.model.getters.getSelectedZones());
19963
- }
19964
- function createRemoveFilterAction(env) {
19965
- if (selectionContainsFilter(env)) {
19966
- env.model.dispatch("REMOVE_FILTER_TABLE", {
19967
- sheetId: env.model.getters.getActiveSheetId(),
19968
- target: env.model.getters.getSelectedZones(),
19969
- });
19970
- return;
19971
- }
19972
- if (cannotCreateFilter(env)) {
19973
- return;
19974
- }
19975
- env.model.selection.selectTableAroundSelection();
19976
- const sheetId = env.model.getters.getActiveSheetId();
19977
- const selection = env.model.getters.getSelectedZones();
19978
- interactiveAddFilter(env, sheetId, selection);
19979
- }
19980
-
19981
- var ACTION_VIEW = /*#__PURE__*/Object.freeze({
19982
- __proto__: null,
19983
- hideCols: hideCols,
19984
- unhideCols: unhideCols,
19985
- unhideAllCols: unhideAllCols,
19986
- hideRows: hideRows,
19987
- unhideRows: unhideRows,
19988
- unhideAllRows: unhideAllRows,
19989
- unFreezePane: unFreezePane,
19990
- freezePane: freezePane,
19991
- unFreezeRows: unFreezeRows,
19992
- freezeFirstRow: freezeFirstRow,
19993
- freezeSecondRow: freezeSecondRow,
19994
- freezeCurrentRow: freezeCurrentRow,
19995
- unFreezeCols: unFreezeCols,
19996
- freezeFirstCol: freezeFirstCol,
19997
- freezeSecondCol: freezeSecondCol,
19998
- freezeCurrentCol: freezeCurrentCol,
19999
- viewGridlines: viewGridlines,
20000
- viewFormulas: viewFormulas,
20001
- createRemoveFilter: createRemoveFilter
20002
- });
20003
-
20004
19989
  const colMenuRegistry = new MenuItemRegistry();
20005
19990
  colMenuRegistry
20006
19991
  .add("cut", {
@@ -20575,12 +20560,8 @@
20575
20560
  sequence: 20,
20576
20561
  separator: true,
20577
20562
  })
20578
- .addChild("add_data_filter", ["data"], {
20579
- ...addDataFilter,
20580
- sequence: 30,
20581
- })
20582
- .addChild("remove_data_filter", ["data"], {
20583
- ...removeDataFilter,
20563
+ .addChild("add_remove_data_filter", ["data"], {
20564
+ ...addRemoveDataFilter,
20584
20565
  sequence: 30,
20585
20566
  });
20586
20567
 
@@ -24463,6 +24444,11 @@
24463
24444
  }
24464
24445
  }
24465
24446
  }
24447
+ onContextMenu(ev) {
24448
+ if (this.env.model.getters.getEditionMode() === "inactive") {
24449
+ this.props.onInputContextMenu?.(ev);
24450
+ }
24451
+ }
24466
24452
  // ---------------------------------------------------------------------------
24467
24453
  // Private
24468
24454
  // ---------------------------------------------------------------------------
@@ -24687,6 +24673,7 @@
24687
24673
  onComposerCellFocused: { type: Function, optional: true },
24688
24674
  onComposerContentFocused: Function,
24689
24675
  isDefaultFocus: { type: Boolean, optional: true },
24676
+ onInputContextMenu: { type: Function, optional: true },
24690
24677
  };
24691
24678
 
24692
24679
  const COMPOSER_BORDER_WIDTH = 3 * 0.4 * window.devicePixelRatio || 1;
@@ -24763,6 +24750,7 @@
24763
24750
  isDefaultFocus: true,
24764
24751
  onComposerContentFocused: this.props.onComposerContentFocused,
24765
24752
  onComposerCellFocused: this.props.onComposerCellFocused,
24753
+ onInputContextMenu: this.props.onInputContextMenu,
24766
24754
  };
24767
24755
  }
24768
24756
  get containerStyle() {
@@ -24851,6 +24839,7 @@
24851
24839
  onComposerContentFocused: Function,
24852
24840
  gridDims: Object,
24853
24841
  onComposerCellFocused: Function,
24842
+ onInputContextMenu: Function,
24854
24843
  };
24855
24844
 
24856
24845
  const CSS$1 = css /* scss */ `
@@ -27200,8 +27189,8 @@
27200
27189
  else if (this.env.model.getters.getActiveRows().has(row)) {
27201
27190
  type = "ROW";
27202
27191
  }
27203
- const { x, y, width, height } = this.env.model.getters.getVisibleRect(lastZone);
27204
- this.toggleContextMenu(type, x + width, y + height);
27192
+ const { x, y, width } = this.env.model.getters.getVisibleRect(lastZone);
27193
+ this.toggleContextMenu(type, this.canvasPosition.x + x + width, this.canvasPosition.y + y);
27205
27194
  }
27206
27195
  onCellRightClicked(col, row, { x, y }) {
27207
27196
  const zones = this.env.model.getters.getSelectedZones();
@@ -28491,29 +28480,12 @@
28491
28480
  return width;
28492
28481
  return Math.round((width / WIDTH_FACTOR) * 100) / 100;
28493
28482
  }
28494
- function convertBorderDescr(descr) {
28495
- if (!descr) {
28496
- return undefined;
28497
- }
28498
- return {
28499
- style: descr.style,
28500
- color: { rgb: descr.color },
28501
- };
28502
- }
28503
28483
  function extractStyle(cell, data) {
28504
28484
  let style = {};
28505
28485
  if (cell.style) {
28506
28486
  style = data.styles[cell.style];
28507
28487
  }
28508
28488
  const format = extractFormat(cell, data);
28509
- const exportedBorder = {};
28510
- if (cell.border) {
28511
- const border = data.borders[cell.border];
28512
- exportedBorder.left = convertBorderDescr(border.left);
28513
- exportedBorder.right = convertBorderDescr(border.right);
28514
- exportedBorder.bottom = convertBorderDescr(border.bottom);
28515
- exportedBorder.top = convertBorderDescr(border.top);
28516
- }
28517
28489
  const styles = {
28518
28490
  font: {
28519
28491
  size: style?.fontSize || DEFAULT_FONT_SIZE,
@@ -28527,7 +28499,7 @@
28527
28499
  }
28528
28500
  : { reservedAttribute: "none" },
28529
28501
  numFmt: format ? { format: format, id: 0 /* id not used for export */ } : undefined,
28530
- border: exportedBorder || {},
28502
+ border: cell.border || 0,
28531
28503
  alignment: {
28532
28504
  horizontal: style.align,
28533
28505
  vertical: style.verticalAlign
@@ -28549,15 +28521,12 @@
28549
28521
  return undefined;
28550
28522
  }
28551
28523
  function normalizeStyle(construct, styles) {
28552
- const { id: fontId } = pushElement(styles["font"], construct.fonts);
28553
- const { id: fillId } = pushElement(styles["fill"], construct.fills);
28554
- const { id: borderId } = pushElement(styles["border"], construct.borders);
28555
28524
  // Normalize this
28556
28525
  const numFmtId = convertFormat(styles["numFmt"], construct.numFmts);
28557
28526
  const style = {
28558
- fontId,
28559
- fillId,
28560
- borderId,
28527
+ fontId: pushElement(styles.font, construct.fonts),
28528
+ fillId: pushElement(styles.fill, construct.fills),
28529
+ borderId: styles.border,
28561
28530
  numFmtId,
28562
28531
  alignment: {
28563
28532
  vertical: styles.alignment.vertical,
@@ -28565,8 +28534,7 @@
28565
28534
  wrapText: styles.alignment.wrapText,
28566
28535
  },
28567
28536
  };
28568
- const { id } = pushElement(style, construct.styles);
28569
- return id;
28537
+ return pushElement(style, construct.styles);
28570
28538
  }
28571
28539
  function convertFormat(format, numFmtStructure) {
28572
28540
  if (!format) {
@@ -28574,8 +28542,7 @@
28574
28542
  }
28575
28543
  let formatId = XLSX_FORMAT_MAP[format.format];
28576
28544
  if (!formatId) {
28577
- const { id } = pushElement(format, numFmtStructure);
28578
- formatId = id + FIRST_NUMFMT_ID;
28545
+ formatId = pushElement(format, numFmtStructure) + FIRST_NUMFMT_ID;
28579
28546
  }
28580
28547
  return formatId;
28581
28548
  }
@@ -28600,20 +28567,15 @@
28600
28567
  return id;
28601
28568
  }
28602
28569
  function pushElement(property, propertyList) {
28603
- for (let [key, value] of Object.entries(propertyList)) {
28604
- if (JSON.stringify(value) === JSON.stringify(property)) {
28605
- return { id: parseInt(key, 10), list: propertyList };
28570
+ let len = propertyList.length;
28571
+ const operator = typeof property === "object" ? deepEquals : (a, b) => a === b;
28572
+ for (let i = 0; i < len; i++) {
28573
+ if (operator(property, propertyList[i])) {
28574
+ return i;
28606
28575
  }
28607
28576
  }
28608
- let elemId = propertyList.findIndex((elem) => JSON.stringify(elem) === JSON.stringify(property));
28609
- if (elemId === -1) {
28610
- propertyList.push(property);
28611
- elemId = propertyList.length - 1;
28612
- }
28613
- return {
28614
- id: elemId,
28615
- list: propertyList,
28616
- };
28577
+ propertyList[propertyList.length] = property;
28578
+ return propertyList.length - 1;
28617
28579
  }
28618
28580
  const chartIds = [];
28619
28581
  /**
@@ -29334,7 +29296,25 @@
29334
29296
  }
29335
29297
  return document;
29336
29298
  }
29337
- function getDefaultXLSXStructure() {
29299
+ function convertBorderDescr(descr) {
29300
+ if (!descr) {
29301
+ return undefined;
29302
+ }
29303
+ return {
29304
+ style: descr.style,
29305
+ color: { rgb: descr.color },
29306
+ };
29307
+ }
29308
+ function getDefaultXLSXStructure(data) {
29309
+ const xlsxBorders = Object.values(data.borders).map((border) => {
29310
+ return {
29311
+ left: convertBorderDescr(border.left),
29312
+ right: convertBorderDescr(border.right),
29313
+ bottom: convertBorderDescr(border.bottom),
29314
+ top: convertBorderDescr(border.top),
29315
+ };
29316
+ });
29317
+ const borders = [{}, ...xlsxBorders];
29338
29318
  return {
29339
29319
  relsFiles: [],
29340
29320
  sharedStrings: [],
@@ -29357,7 +29337,7 @@
29357
29337
  },
29358
29338
  ],
29359
29339
  fills: [{ reservedAttribute: "none" }, { reservedAttribute: "gray125" }],
29360
- borders: [{}],
29340
+ borders,
29361
29341
  numFmts: [],
29362
29342
  dxfs: [],
29363
29343
  };
@@ -33422,7 +33402,17 @@
33422
33402
  }
33423
33403
  }
33424
33404
  exportForExcel(data) {
33425
- this.export(data);
33405
+ for (const sheet of data.sheets) {
33406
+ for (const filterTable of this.getFilterTables(sheet.id)) {
33407
+ if (zoneToDimension(filterTable.zone).numberOfRows === 1) {
33408
+ continue;
33409
+ }
33410
+ sheet.filterTables.push({
33411
+ range: zoneToXc(filterTable.zone),
33412
+ filters: [],
33413
+ });
33414
+ }
33415
+ }
33426
33416
  }
33427
33417
  }
33428
33418
 
@@ -36716,7 +36706,9 @@
36716
36706
  this.blockedArrayFormulas = new Set();
36717
36707
  this.spreadingRelations = new SpreadingRelation();
36718
36708
  this.formulaDependencies = lazy(() => {
36719
- const dependencies = [...this.getAllCells()].flatMap((positionId) => this.getDirectDependencies(positionId).map((range) => ({
36709
+ const dependencies = [...this.getAllCells()].flatMap((positionId) => this.getDirectDependencies(positionId)
36710
+ .filter((range) => !range.invalidSheetName && !range.invalidXc)
36711
+ .map((range) => ({
36720
36712
  data: positionId,
36721
36713
  boundingBox: {
36722
36714
  zone: range.zone,
@@ -45251,13 +45243,14 @@
45251
45243
  }
45252
45244
  }
45253
45245
  handleEvent(event) {
45246
+ const sheetId = this.getters.getActiveSheetId();
45254
45247
  if (event.options.scrollIntoView) {
45255
45248
  let { col, row } = findCellInNewZone(event.previousAnchor.zone, event.anchor.zone);
45256
45249
  if (event.mode === "updateAnchor") {
45257
45250
  const oldZone = event.previousAnchor.zone;
45258
45251
  const newZone = event.anchor.zone;
45259
45252
  // altering a zone should not move the viewport in a dimension that wasn't changed
45260
- const { top, bottom, left, right } = this.getters.getActiveMainViewport();
45253
+ const { top, bottom, left, right } = this.getMainInternalViewport(sheetId);
45261
45254
  if (oldZone.left === newZone.left && oldZone.right === newZone.right) {
45262
45255
  col = left > col || col > right ? left : col;
45263
45256
  }
@@ -45265,7 +45258,6 @@
45265
45258
  row = top > row || row > bottom ? top : row;
45266
45259
  }
45267
45260
  }
45268
- const sheetId = this.getters.getActiveSheetId();
45269
45261
  col = Math.min(col, this.getters.getNumberCols(sheetId) - 1);
45270
45262
  row = Math.min(row, this.getters.getNumberRows(sheetId) - 1);
45271
45263
  this.refreshViewport(this.getters.getActiveSheetId(), { col, row });
@@ -45291,16 +45283,16 @@
45291
45283
  this.setSheetViewOffset(cmd.offsetX, cmd.offsetY);
45292
45284
  break;
45293
45285
  case "SHIFT_VIEWPORT_DOWN":
45294
- const { top } = this.getActiveMainViewport();
45295
45286
  const sheetId = this.getters.getActiveSheetId();
45296
- const shiftedOffsetY = this.clipOffsetY(this.getters.getRowDimensions(sheetId, top).start + this.sheetViewHeight);
45297
- this.shiftVertically(shiftedOffsetY);
45287
+ const { top, viewportHeight, offsetCorrectionY } = this.getMainInternalViewport(sheetId);
45288
+ const topRowDims = this.getters.getRowDimensions(sheetId, top);
45289
+ this.shiftVertically(topRowDims.start + viewportHeight - offsetCorrectionY);
45298
45290
  break;
45299
45291
  case "SHIFT_VIEWPORT_UP": {
45300
- const { top } = this.getActiveMainViewport();
45301
45292
  const sheetId = this.getters.getActiveSheetId();
45302
- const shiftedOffsetY = this.clipOffsetY(this.getters.getRowDimensions(sheetId, top).end - this.sheetViewHeight);
45303
- this.shiftVertically(shiftedOffsetY);
45293
+ const { top, viewportHeight, offsetCorrectionY } = this.getMainInternalViewport(sheetId);
45294
+ const topRowDims = this.getters.getRowDimensions(sheetId, top);
45295
+ this.shiftVertically(topRowDims.end - offsetCorrectionY - viewportHeight);
45304
45296
  break;
45305
45297
  }
45306
45298
  case "REMOVE_COLUMNS_ROWS":
@@ -45662,17 +45654,6 @@
45662
45654
  const { maxOffsetX, maxOffsetY } = this.getMaximumSheetOffset();
45663
45655
  Object.values(this.getSubViewports(sheetId)).forEach((viewport) => viewport.setViewportOffset(clip(offsetX, 0, maxOffsetX), clip(offsetY, 0, maxOffsetY)));
45664
45656
  }
45665
- /**
45666
- * Clip the vertical offset within the allowed range.
45667
- * Not above the sheet, nor below the sheet.
45668
- */
45669
- clipOffsetY(offsetY) {
45670
- const { height } = this.getMainViewportRect();
45671
- const maxOffset = height - this.sheetViewHeight;
45672
- offsetY = Math.min(offsetY, maxOffset);
45673
- offsetY = Math.max(offsetY, 0);
45674
- return offsetY;
45675
- }
45676
45657
  getViewportOffset(sheetId) {
45677
45658
  return {
45678
45659
  x: this.viewports[sheetId]?.bottomRight.offsetScrollbarX || 0,
@@ -45728,12 +45709,15 @@
45728
45709
  * viewport top.
45729
45710
  */
45730
45711
  shiftVertically(offset) {
45731
- const { top } = this.getActiveMainViewport();
45712
+ const sheetId = this.getters.getActiveSheetId();
45713
+ const { top } = this.getMainInternalViewport(sheetId);
45732
45714
  const { scrollX } = this.getActiveSheetScrollInfo();
45733
45715
  this.setSheetViewOffset(scrollX, offset);
45734
45716
  const { anchor } = this.getters.getSelection();
45735
- const deltaRow = this.getActiveMainViewport().top - top;
45736
- this.selection.selectCell(anchor.cell.col, anchor.cell.row + deltaRow);
45717
+ if (anchor.cell.row >= this.getters.getPaneDivisions(sheetId).ySplit) {
45718
+ const deltaRow = this.getMainInternalViewport(sheetId).top - top;
45719
+ this.selection.selectCell(anchor.cell.col, anchor.cell.row + deltaRow);
45720
+ }
45737
45721
  }
45738
45722
  getVisibleFigures() {
45739
45723
  const sheetId = this.getters.getActiveSheetId();
@@ -46749,7 +46733,6 @@
46749
46733
  cursor: pointer;
46750
46734
  }
46751
46735
  `;
46752
- let tKey = 1;
46753
46736
  class SpreadsheetDashboard extends owl.Component {
46754
46737
  static template = "o-spreadsheet-SpreadsheetDashboard";
46755
46738
  static components = {
@@ -46827,13 +46810,9 @@
46827
46810
  coordinates: rect,
46828
46811
  position: { col, row },
46829
46812
  action,
46830
- // we can't rely on position only because a row or a column could
46831
- // be inserted at any time.
46832
- tKey: `${tKey}-${col}-${row}`,
46833
46813
  });
46834
46814
  }
46835
46815
  }
46836
- tKey++;
46837
46816
  return cells;
46838
46817
  }
46839
46818
  getClickableAction(position) {
@@ -49990,8 +49969,7 @@
49990
49969
  attrs.push(["t", "b"]);
49991
49970
  }
49992
49971
  else if (forceString || !isNumber(value, DEFAULT_LOCALE)) {
49993
- const { id } = pushElement(content, sharedStrings);
49994
- value = id.toString();
49972
+ value = pushElement(content, sharedStrings);
49995
49973
  attrs.push(["t", "s"]);
49996
49974
  }
49997
49975
  return { attrs, node: escapeXml /*xml*/ `<v>${value}</v>` };
@@ -50116,8 +50094,7 @@
50116
50094
  if (rule.style.fillColor) {
50117
50095
  dxf.fill = { fgColor: { rgb: rule.style.fillColor } };
50118
50096
  }
50119
- const { id } = pushElement(dxf, dxfs);
50120
- ruleAttributes.push(["dxfId", id]);
50097
+ ruleAttributes.push(["dxfId", pushElement(dxf, dxfs)]);
50121
50098
  return escapeXml /*xml*/ `
50122
50099
  <conditionalFormatting sqref="${cf.ranges.join(" ")}">
50123
50100
  <cfRule ${formatAttributes(ruleAttributes)}>
@@ -50926,7 +50903,7 @@
50926
50903
  */
50927
50904
  function getXLSX(data) {
50928
50905
  const files = [];
50929
- const construct = getDefaultXLSXStructure();
50906
+ const construct = getDefaultXLSXStructure(data);
50930
50907
  files.push(createWorkbook(data, construct));
50931
50908
  files.push(...createWorksheets(data, construct));
50932
50909
  files.push(createStylesSheet(construct));
@@ -51783,9 +51760,9 @@
51783
51760
  Object.defineProperty(exports, '__esModule', { value: true });
51784
51761
 
51785
51762
 
51786
- __info__.version = '16.4.28';
51787
- __info__.date = '2024-04-05T13:59:39.997Z';
51788
- __info__.hash = '7127826';
51763
+ __info__.version = '16.4.30';
51764
+ __info__.date = '2024-04-18T16:39:04.255Z';
51765
+ __info__.hash = '39b015c';
51789
51766
 
51790
51767
 
51791
51768
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);