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