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