@odoo/o-spreadsheet 17.0.17 → 17.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,9 +2,9 @@
2
2
  /**
3
3
  * This file is generated by o-spreadsheet build tools. Do not edit it.
4
4
  * @see https://github.com/odoo/o-spreadsheet
5
- * @version 17.0.17
6
- * @date 2024-04-05T13:59:37.139Z
7
- * @hash 33f09d7
5
+ * @version 17.0.19
6
+ * @date 2024-04-18T16:41:42.291Z
7
+ * @hash 9f3317a
8
8
  */
9
9
 
10
10
  'use strict';
@@ -650,7 +650,7 @@ function deepEquals(o1, o2) {
650
650
  if (typeof o1 !== typeof o2)
651
651
  return false;
652
652
  if (typeof o1 !== "object")
653
- return o1 === o2;
653
+ return false;
654
654
  // Objects can have different keys if the values are undefined
655
655
  for (const key in o2) {
656
656
  if (!(key in o1) && o2[key] !== undefined) {
@@ -8120,6 +8120,7 @@ class LinkEditor extends owl.Component {
8120
8120
  this.save();
8121
8121
  }
8122
8122
  ev.stopPropagation();
8123
+ ev.preventDefault();
8123
8124
  break;
8124
8125
  case "Escape":
8125
8126
  this.cancel();
@@ -19902,6 +19903,332 @@ function interactiveAddFilter(env, sheetId, target) {
19902
19903
  }
19903
19904
  }
19904
19905
 
19906
+ function interactiveFreezeColumnsRows(env, dimension, base) {
19907
+ const sheetId = env.model.getters.getActiveSheetId();
19908
+ const cmd = dimension === "COL" ? "FREEZE_COLUMNS" : "FREEZE_ROWS";
19909
+ const result = env.model.dispatch(cmd, { sheetId, quantity: base });
19910
+ if (result.isCancelledBecause("MergeOverlap" /* CommandResult.MergeOverlap */)) {
19911
+ env.raiseError(MergeErrorMessage);
19912
+ }
19913
+ }
19914
+
19915
+ const hideCols = {
19916
+ name: HIDE_COLUMNS_NAME,
19917
+ execute: (env) => {
19918
+ const columns = env.model.getters.getElementsFromSelection("COL");
19919
+ env.model.dispatch("HIDE_COLUMNS_ROWS", {
19920
+ sheetId: env.model.getters.getActiveSheetId(),
19921
+ dimension: "COL",
19922
+ elements: columns,
19923
+ });
19924
+ },
19925
+ isVisible: NOT_ALL_VISIBLE_COLS_SELECTED,
19926
+ icon: "o-spreadsheet-Icon.HIDE_COL",
19927
+ };
19928
+ const unhideCols = {
19929
+ name: _t("Unhide columns"),
19930
+ execute: (env) => {
19931
+ const columns = env.model.getters.getElementsFromSelection("COL");
19932
+ env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
19933
+ sheetId: env.model.getters.getActiveSheetId(),
19934
+ dimension: "COL",
19935
+ elements: columns,
19936
+ });
19937
+ },
19938
+ isVisible: (env) => {
19939
+ const hiddenCols = env.model.getters
19940
+ .getHiddenColsGroups(env.model.getters.getActiveSheetId())
19941
+ .flat();
19942
+ const currentCols = env.model.getters.getElementsFromSelection("COL");
19943
+ return currentCols.some((col) => hiddenCols.includes(col));
19944
+ },
19945
+ };
19946
+ const unhideAllCols = {
19947
+ name: _t("Unhide all columns"),
19948
+ execute: (env) => {
19949
+ const sheetId = env.model.getters.getActiveSheetId();
19950
+ env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
19951
+ sheetId,
19952
+ dimension: "COL",
19953
+ elements: Array.from(Array(env.model.getters.getNumberCols(sheetId)).keys()),
19954
+ });
19955
+ },
19956
+ isVisible: (env) => env.model.getters.getHiddenColsGroups(env.model.getters.getActiveSheetId()).length > 0,
19957
+ };
19958
+ const hideRows = {
19959
+ name: HIDE_ROWS_NAME,
19960
+ execute: (env) => {
19961
+ const rows = env.model.getters.getElementsFromSelection("ROW");
19962
+ env.model.dispatch("HIDE_COLUMNS_ROWS", {
19963
+ sheetId: env.model.getters.getActiveSheetId(),
19964
+ dimension: "ROW",
19965
+ elements: rows,
19966
+ });
19967
+ },
19968
+ isVisible: NOT_ALL_VISIBLE_ROWS_SELECTED,
19969
+ icon: "o-spreadsheet-Icon.HIDE_ROW",
19970
+ };
19971
+ const unhideRows = {
19972
+ name: _t("Unhide rows"),
19973
+ execute: (env) => {
19974
+ const columns = env.model.getters.getElementsFromSelection("ROW");
19975
+ env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
19976
+ sheetId: env.model.getters.getActiveSheetId(),
19977
+ dimension: "ROW",
19978
+ elements: columns,
19979
+ });
19980
+ },
19981
+ isVisible: (env) => {
19982
+ const hiddenRows = env.model.getters
19983
+ .getHiddenRowsGroups(env.model.getters.getActiveSheetId())
19984
+ .flat();
19985
+ const currentRows = env.model.getters.getElementsFromSelection("ROW");
19986
+ return currentRows.some((col) => hiddenRows.includes(col));
19987
+ },
19988
+ };
19989
+ const unhideAllRows = {
19990
+ name: _t("Unhide all rows"),
19991
+ execute: (env) => {
19992
+ const sheetId = env.model.getters.getActiveSheetId();
19993
+ env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
19994
+ sheetId,
19995
+ dimension: "ROW",
19996
+ elements: Array.from(Array(env.model.getters.getNumberRows(sheetId)).keys()),
19997
+ });
19998
+ },
19999
+ isVisible: (env) => env.model.getters.getHiddenRowsGroups(env.model.getters.getActiveSheetId()).length > 0,
20000
+ };
20001
+ const unFreezePane = {
20002
+ name: _t("Unfreeze"),
20003
+ isVisible: (env) => {
20004
+ const { xSplit, ySplit } = env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId());
20005
+ return xSplit + ySplit > 0;
20006
+ },
20007
+ execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS_ROWS", {
20008
+ sheetId: env.model.getters.getActiveSheetId(),
20009
+ }),
20010
+ icon: "o-spreadsheet-Icon.UNFREEZE",
20011
+ };
20012
+ const freezePane = {
20013
+ name: _t("Freeze"),
20014
+ icon: "o-spreadsheet-Icon.FREEZE",
20015
+ };
20016
+ const unFreezeRows = {
20017
+ name: _t("No rows"),
20018
+ execute: (env) => env.model.dispatch("UNFREEZE_ROWS", {
20019
+ sheetId: env.model.getters.getActiveSheetId(),
20020
+ }),
20021
+ isReadonlyAllowed: true,
20022
+ isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).ySplit,
20023
+ };
20024
+ const freezeFirstRow = {
20025
+ name: _t("1 row"),
20026
+ execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 1),
20027
+ isReadonlyAllowed: true,
20028
+ };
20029
+ const freezeSecondRow = {
20030
+ name: _t("2 rows"),
20031
+ execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 2),
20032
+ isReadonlyAllowed: true,
20033
+ };
20034
+ const freezeCurrentRow = {
20035
+ name: _t("Up to current row"),
20036
+ execute: (env) => {
20037
+ const { bottom } = env.model.getters.getSelectedZone();
20038
+ interactiveFreezeColumnsRows(env, "ROW", bottom + 1);
20039
+ },
20040
+ isReadonlyAllowed: true,
20041
+ };
20042
+ const unFreezeCols = {
20043
+ name: _t("No columns"),
20044
+ execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS", {
20045
+ sheetId: env.model.getters.getActiveSheetId(),
20046
+ }),
20047
+ isReadonlyAllowed: true,
20048
+ isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).xSplit,
20049
+ };
20050
+ const freezeFirstCol = {
20051
+ name: _t("1 column"),
20052
+ execute: (env) => interactiveFreezeColumnsRows(env, "COL", 1),
20053
+ isReadonlyAllowed: true,
20054
+ };
20055
+ const freezeSecondCol = {
20056
+ name: _t("2 columns"),
20057
+ execute: (env) => interactiveFreezeColumnsRows(env, "COL", 2),
20058
+ isReadonlyAllowed: true,
20059
+ };
20060
+ const freezeCurrentCol = {
20061
+ name: _t("Up to current column"),
20062
+ execute: (env) => {
20063
+ const { right } = env.model.getters.getSelectedZone();
20064
+ interactiveFreezeColumnsRows(env, "COL", right + 1);
20065
+ },
20066
+ isReadonlyAllowed: true,
20067
+ };
20068
+ const viewGridlines = {
20069
+ name: (env) => env.model.getters.getGridLinesVisibility(env.model.getters.getActiveSheetId())
20070
+ ? _t("Hide gridlines")
20071
+ : _t("Show gridlines"),
20072
+ execute: (env) => {
20073
+ const sheetId = env.model.getters.getActiveSheetId();
20074
+ env.model.dispatch("SET_GRID_LINES_VISIBILITY", {
20075
+ sheetId,
20076
+ areGridLinesVisible: !env.model.getters.getGridLinesVisibility(sheetId),
20077
+ });
20078
+ },
20079
+ icon: "o-spreadsheet-Icon.SHOW_HIDE_GRID",
20080
+ };
20081
+ const viewFormulas = {
20082
+ name: (env) => env.model.getters.shouldShowFormulas() ? "Hide formulas" : _t("Show formulas"),
20083
+ execute: (env) => env.model.dispatch("SET_FORMULA_VISIBILITY", { show: !env.model.getters.shouldShowFormulas() }),
20084
+ isReadonlyAllowed: true,
20085
+ icon: "o-spreadsheet-Icon.SHOW_HIDE_FORMULA",
20086
+ };
20087
+ const createRemoveFilter = {
20088
+ name: (env) => selectionContainsFilter(env) ? _t("Remove selected filters") : _t("Create filter"),
20089
+ isActive: (env) => selectionContainsFilter(env),
20090
+ isEnabled: (env) => !cannotCreateFilter(env),
20091
+ execute: (env) => createRemoveFilterAction(env),
20092
+ icon: "o-spreadsheet-Icon.FILTER_ICON_INACTIVE",
20093
+ };
20094
+ const groupColumns = {
20095
+ name: (env) => {
20096
+ const selection = env.model.getters.getSelectedZone();
20097
+ if (selection.left === selection.right) {
20098
+ return _t("Group column %s", numberToLetters(selection.left));
20099
+ }
20100
+ return _t("Group columns %s - %s", numberToLetters(selection.left), numberToLetters(selection.right));
20101
+ },
20102
+ execute: (env) => groupHeadersAction(env, "COL"),
20103
+ isVisible: (env) => {
20104
+ const sheetId = env.model.getters.getActiveSheetId();
20105
+ const selection = env.model.getters.getSelectedZone();
20106
+ const groups = env.model.getters.getHeaderGroupsInZone(sheetId, "COL", selection);
20107
+ return (IS_ONLY_ONE_RANGE(env) &&
20108
+ !groups.some((group) => group.start === selection.left && group.end === selection.right));
20109
+ },
20110
+ icon: "o-spreadsheet-Icon.GROUP_COLUMNS",
20111
+ };
20112
+ const groupRows = {
20113
+ name: (env) => {
20114
+ const selection = env.model.getters.getSelectedZone();
20115
+ if (selection.top === selection.bottom) {
20116
+ return _t("Group row %s", String(selection.top + 1));
20117
+ }
20118
+ return _t("Group rows %s - %s", String(selection.top + 1), String(selection.bottom + 1));
20119
+ },
20120
+ execute: (env) => groupHeadersAction(env, "ROW"),
20121
+ isVisible: (env) => {
20122
+ const sheetId = env.model.getters.getActiveSheetId();
20123
+ const selection = env.model.getters.getSelectedZone();
20124
+ const groups = env.model.getters.getHeaderGroupsInZone(sheetId, "ROW", selection);
20125
+ return (IS_ONLY_ONE_RANGE(env) &&
20126
+ !groups.some((group) => group.start === selection.top && group.end === selection.bottom));
20127
+ },
20128
+ icon: "o-spreadsheet-Icon.GROUP_ROWS",
20129
+ };
20130
+ const ungroupColumns = {
20131
+ name: (env) => {
20132
+ const selection = env.model.getters.getSelectedZone();
20133
+ if (selection.left === selection.right) {
20134
+ return _t("Ungroup column %s", numberToLetters(selection.left));
20135
+ }
20136
+ return _t("Ungroup columns %s - %s", numberToLetters(selection.left), numberToLetters(selection.right));
20137
+ },
20138
+ execute: (env) => ungroupHeaders(env, "COL"),
20139
+ icon: "o-spreadsheet-Icon.UNGROUP_COLUMNS",
20140
+ };
20141
+ const ungroupRows = {
20142
+ name: (env) => {
20143
+ const selection = env.model.getters.getSelectedZone();
20144
+ if (selection.top === selection.bottom) {
20145
+ return _t("Ungroup row %s", String(selection.top + 1));
20146
+ }
20147
+ return _t("Ungroup rows %s - %s", String(selection.top + 1), String(selection.bottom + 1));
20148
+ },
20149
+ execute: (env) => ungroupHeaders(env, "ROW"),
20150
+ icon: "o-spreadsheet-Icon.UNGROUP_ROWS",
20151
+ };
20152
+ function selectionContainsFilter(env) {
20153
+ const sheetId = env.model.getters.getActiveSheetId();
20154
+ const selectedZones = env.model.getters.getSelectedZones();
20155
+ return env.model.getters.doesZonesContainFilter(sheetId, selectedZones);
20156
+ }
20157
+ function cannotCreateFilter(env) {
20158
+ return !areZonesContinuous(...env.model.getters.getSelectedZones());
20159
+ }
20160
+ function createRemoveFilterAction(env) {
20161
+ if (selectionContainsFilter(env)) {
20162
+ env.model.dispatch("REMOVE_FILTER_TABLE", {
20163
+ sheetId: env.model.getters.getActiveSheetId(),
20164
+ target: env.model.getters.getSelectedZones(),
20165
+ });
20166
+ return;
20167
+ }
20168
+ if (cannotCreateFilter(env)) {
20169
+ return;
20170
+ }
20171
+ env.model.selection.selectTableAroundSelection();
20172
+ const sheetId = env.model.getters.getActiveSheetId();
20173
+ const selection = env.model.getters.getSelectedZones();
20174
+ interactiveAddFilter(env, sheetId, selection);
20175
+ }
20176
+ function groupHeadersAction(env, dim) {
20177
+ const selection = env.model.getters.getSelectedZone();
20178
+ const sheetId = env.model.getters.getActiveSheetId();
20179
+ env.model.dispatch("GROUP_HEADERS", {
20180
+ sheetId,
20181
+ dimension: dim,
20182
+ start: dim === "COL" ? selection.left : selection.top,
20183
+ end: dim === "COL" ? selection.right : selection.bottom,
20184
+ });
20185
+ }
20186
+ function ungroupHeaders(env, dim) {
20187
+ const selection = env.model.getters.getSelectedZone();
20188
+ const sheetId = env.model.getters.getActiveSheetId();
20189
+ env.model.dispatch("UNGROUP_HEADERS", {
20190
+ sheetId,
20191
+ dimension: dim,
20192
+ start: dim === "COL" ? selection.left : selection.top,
20193
+ end: dim === "COL" ? selection.right : selection.bottom,
20194
+ });
20195
+ }
20196
+ function canUngroupHeaders(env, dimension) {
20197
+ const sheetId = env.model.getters.getActiveSheetId();
20198
+ const selection = env.model.getters.getSelectedZones();
20199
+ return (selection.length === 1 &&
20200
+ env.model.getters.getHeaderGroupsInZone(sheetId, dimension, selection[0]).length > 0);
20201
+ }
20202
+
20203
+ var ACTION_VIEW = /*#__PURE__*/Object.freeze({
20204
+ __proto__: null,
20205
+ canUngroupHeaders: canUngroupHeaders,
20206
+ createRemoveFilter: createRemoveFilter,
20207
+ createRemoveFilterAction: createRemoveFilterAction,
20208
+ freezeCurrentCol: freezeCurrentCol,
20209
+ freezeCurrentRow: freezeCurrentRow,
20210
+ freezeFirstCol: freezeFirstCol,
20211
+ freezeFirstRow: freezeFirstRow,
20212
+ freezePane: freezePane,
20213
+ freezeSecondCol: freezeSecondCol,
20214
+ freezeSecondRow: freezeSecondRow,
20215
+ groupColumns: groupColumns,
20216
+ groupRows: groupRows,
20217
+ hideCols: hideCols,
20218
+ hideRows: hideRows,
20219
+ unFreezeCols: unFreezeCols,
20220
+ unFreezePane: unFreezePane,
20221
+ unFreezeRows: unFreezeRows,
20222
+ ungroupColumns: ungroupColumns,
20223
+ ungroupRows: ungroupRows,
20224
+ unhideAllCols: unhideAllCols,
20225
+ unhideAllRows: unhideAllRows,
20226
+ unhideCols: unhideCols,
20227
+ unhideRows: unhideRows,
20228
+ viewFormulas: viewFormulas,
20229
+ viewGridlines: viewGridlines
20230
+ });
20231
+
19905
20232
  const sortRange = {
19906
20233
  name: _t("Sort range"),
19907
20234
  isVisible: IS_ONLY_ONE_RANGE,
@@ -19944,32 +20271,15 @@ const sortDescending = {
19944
20271
  },
19945
20272
  icon: "o-spreadsheet-Icon.SORT_DESCENDING",
19946
20273
  };
19947
- const addDataFilter = {
19948
- name: _t("Create filter"),
19949
- execute: (env) => {
19950
- const sheetId = env.model.getters.getActiveSheetId();
19951
- const selection = env.model.getters.getSelection().zones;
19952
- interactiveAddFilter(env, sheetId, selection);
19953
- },
19954
- isVisible: (env) => !SELECTION_CONTAINS_FILTER(env),
20274
+ const addRemoveDataFilter = {
20275
+ name: (env) => SELECTION_CONTAINS_FILTER(env) ? _t("Remove filter") : _t("Create filter"),
20276
+ execute: (env) => createRemoveFilterAction(env),
19955
20277
  isEnabled: (env) => {
19956
20278
  const selectedZones = env.model.getters.getSelectedZones();
19957
20279
  return areZonesContinuous(...selectedZones);
19958
20280
  },
19959
20281
  icon: "o-spreadsheet-Icon.MENU_FILTER_ICON",
19960
20282
  };
19961
- const removeDataFilter = {
19962
- name: _t("Remove filter"),
19963
- execute: (env) => {
19964
- const sheetId = env.model.getters.getActiveSheetId();
19965
- env.model.dispatch("REMOVE_FILTER_TABLE", {
19966
- sheetId,
19967
- target: env.model.getters.getSelectedZones(),
19968
- });
19969
- },
19970
- isVisible: SELECTION_CONTAINS_FILTER,
19971
- icon: "o-spreadsheet-Icon.MENU_FILTER_ICON",
19972
- };
19973
20283
  const splitToColumns = {
19974
20284
  name: _t("Split text to columns"),
19975
20285
  sequence: 1,
@@ -20375,331 +20685,6 @@ var ACTION_FORMAT = /*#__PURE__*/Object.freeze({
20375
20685
  textColor: textColor
20376
20686
  });
20377
20687
 
20378
- function interactiveFreezeColumnsRows(env, dimension, base) {
20379
- const sheetId = env.model.getters.getActiveSheetId();
20380
- const cmd = dimension === "COL" ? "FREEZE_COLUMNS" : "FREEZE_ROWS";
20381
- const result = env.model.dispatch(cmd, { sheetId, quantity: base });
20382
- if (result.isCancelledBecause("MergeOverlap" /* CommandResult.MergeOverlap */)) {
20383
- env.raiseError(MergeErrorMessage);
20384
- }
20385
- }
20386
-
20387
- const hideCols = {
20388
- name: HIDE_COLUMNS_NAME,
20389
- execute: (env) => {
20390
- const columns = env.model.getters.getElementsFromSelection("COL");
20391
- env.model.dispatch("HIDE_COLUMNS_ROWS", {
20392
- sheetId: env.model.getters.getActiveSheetId(),
20393
- dimension: "COL",
20394
- elements: columns,
20395
- });
20396
- },
20397
- isVisible: NOT_ALL_VISIBLE_COLS_SELECTED,
20398
- icon: "o-spreadsheet-Icon.HIDE_COL",
20399
- };
20400
- const unhideCols = {
20401
- name: _t("Unhide columns"),
20402
- execute: (env) => {
20403
- const columns = env.model.getters.getElementsFromSelection("COL");
20404
- env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
20405
- sheetId: env.model.getters.getActiveSheetId(),
20406
- dimension: "COL",
20407
- elements: columns,
20408
- });
20409
- },
20410
- isVisible: (env) => {
20411
- const hiddenCols = env.model.getters
20412
- .getHiddenColsGroups(env.model.getters.getActiveSheetId())
20413
- .flat();
20414
- const currentCols = env.model.getters.getElementsFromSelection("COL");
20415
- return currentCols.some((col) => hiddenCols.includes(col));
20416
- },
20417
- };
20418
- const unhideAllCols = {
20419
- name: _t("Unhide all columns"),
20420
- execute: (env) => {
20421
- const sheetId = env.model.getters.getActiveSheetId();
20422
- env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
20423
- sheetId,
20424
- dimension: "COL",
20425
- elements: Array.from(Array(env.model.getters.getNumberCols(sheetId)).keys()),
20426
- });
20427
- },
20428
- isVisible: (env) => env.model.getters.getHiddenColsGroups(env.model.getters.getActiveSheetId()).length > 0,
20429
- };
20430
- const hideRows = {
20431
- name: HIDE_ROWS_NAME,
20432
- execute: (env) => {
20433
- const rows = env.model.getters.getElementsFromSelection("ROW");
20434
- env.model.dispatch("HIDE_COLUMNS_ROWS", {
20435
- sheetId: env.model.getters.getActiveSheetId(),
20436
- dimension: "ROW",
20437
- elements: rows,
20438
- });
20439
- },
20440
- isVisible: NOT_ALL_VISIBLE_ROWS_SELECTED,
20441
- icon: "o-spreadsheet-Icon.HIDE_ROW",
20442
- };
20443
- const unhideRows = {
20444
- name: _t("Unhide rows"),
20445
- execute: (env) => {
20446
- const columns = env.model.getters.getElementsFromSelection("ROW");
20447
- env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
20448
- sheetId: env.model.getters.getActiveSheetId(),
20449
- dimension: "ROW",
20450
- elements: columns,
20451
- });
20452
- },
20453
- isVisible: (env) => {
20454
- const hiddenRows = env.model.getters
20455
- .getHiddenRowsGroups(env.model.getters.getActiveSheetId())
20456
- .flat();
20457
- const currentRows = env.model.getters.getElementsFromSelection("ROW");
20458
- return currentRows.some((col) => hiddenRows.includes(col));
20459
- },
20460
- };
20461
- const unhideAllRows = {
20462
- name: _t("Unhide all rows"),
20463
- execute: (env) => {
20464
- const sheetId = env.model.getters.getActiveSheetId();
20465
- env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
20466
- sheetId,
20467
- dimension: "ROW",
20468
- elements: Array.from(Array(env.model.getters.getNumberRows(sheetId)).keys()),
20469
- });
20470
- },
20471
- isVisible: (env) => env.model.getters.getHiddenRowsGroups(env.model.getters.getActiveSheetId()).length > 0,
20472
- };
20473
- const unFreezePane = {
20474
- name: _t("Unfreeze"),
20475
- isVisible: (env) => {
20476
- const { xSplit, ySplit } = env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId());
20477
- return xSplit + ySplit > 0;
20478
- },
20479
- execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS_ROWS", {
20480
- sheetId: env.model.getters.getActiveSheetId(),
20481
- }),
20482
- icon: "o-spreadsheet-Icon.UNFREEZE",
20483
- };
20484
- const freezePane = {
20485
- name: _t("Freeze"),
20486
- icon: "o-spreadsheet-Icon.FREEZE",
20487
- };
20488
- const unFreezeRows = {
20489
- name: _t("No rows"),
20490
- execute: (env) => env.model.dispatch("UNFREEZE_ROWS", {
20491
- sheetId: env.model.getters.getActiveSheetId(),
20492
- }),
20493
- isReadonlyAllowed: true,
20494
- isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).ySplit,
20495
- };
20496
- const freezeFirstRow = {
20497
- name: _t("1 row"),
20498
- execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 1),
20499
- isReadonlyAllowed: true,
20500
- };
20501
- const freezeSecondRow = {
20502
- name: _t("2 rows"),
20503
- execute: (env) => interactiveFreezeColumnsRows(env, "ROW", 2),
20504
- isReadonlyAllowed: true,
20505
- };
20506
- const freezeCurrentRow = {
20507
- name: _t("Up to current row"),
20508
- execute: (env) => {
20509
- const { bottom } = env.model.getters.getSelectedZone();
20510
- interactiveFreezeColumnsRows(env, "ROW", bottom + 1);
20511
- },
20512
- isReadonlyAllowed: true,
20513
- };
20514
- const unFreezeCols = {
20515
- name: _t("No columns"),
20516
- execute: (env) => env.model.dispatch("UNFREEZE_COLUMNS", {
20517
- sheetId: env.model.getters.getActiveSheetId(),
20518
- }),
20519
- isReadonlyAllowed: true,
20520
- isVisible: (env) => !!env.model.getters.getPaneDivisions(env.model.getters.getActiveSheetId()).xSplit,
20521
- };
20522
- const freezeFirstCol = {
20523
- name: _t("1 column"),
20524
- execute: (env) => interactiveFreezeColumnsRows(env, "COL", 1),
20525
- isReadonlyAllowed: true,
20526
- };
20527
- const freezeSecondCol = {
20528
- name: _t("2 columns"),
20529
- execute: (env) => interactiveFreezeColumnsRows(env, "COL", 2),
20530
- isReadonlyAllowed: true,
20531
- };
20532
- const freezeCurrentCol = {
20533
- name: _t("Up to current column"),
20534
- execute: (env) => {
20535
- const { right } = env.model.getters.getSelectedZone();
20536
- interactiveFreezeColumnsRows(env, "COL", right + 1);
20537
- },
20538
- isReadonlyAllowed: true,
20539
- };
20540
- const viewGridlines = {
20541
- name: (env) => env.model.getters.getGridLinesVisibility(env.model.getters.getActiveSheetId())
20542
- ? _t("Hide gridlines")
20543
- : _t("Show gridlines"),
20544
- execute: (env) => {
20545
- const sheetId = env.model.getters.getActiveSheetId();
20546
- env.model.dispatch("SET_GRID_LINES_VISIBILITY", {
20547
- sheetId,
20548
- areGridLinesVisible: !env.model.getters.getGridLinesVisibility(sheetId),
20549
- });
20550
- },
20551
- icon: "o-spreadsheet-Icon.SHOW_HIDE_GRID",
20552
- };
20553
- const viewFormulas = {
20554
- name: (env) => env.model.getters.shouldShowFormulas() ? "Hide formulas" : _t("Show formulas"),
20555
- execute: (env) => env.model.dispatch("SET_FORMULA_VISIBILITY", { show: !env.model.getters.shouldShowFormulas() }),
20556
- isReadonlyAllowed: true,
20557
- icon: "o-spreadsheet-Icon.SHOW_HIDE_FORMULA",
20558
- };
20559
- const createRemoveFilter = {
20560
- name: (env) => selectionContainsFilter(env) ? _t("Remove selected filters") : _t("Create filter"),
20561
- isActive: (env) => selectionContainsFilter(env),
20562
- isEnabled: (env) => !cannotCreateFilter(env),
20563
- execute: (env) => createRemoveFilterAction(env),
20564
- icon: "o-spreadsheet-Icon.FILTER_ICON_INACTIVE",
20565
- };
20566
- const groupColumns = {
20567
- name: (env) => {
20568
- const selection = env.model.getters.getSelectedZone();
20569
- if (selection.left === selection.right) {
20570
- return _t("Group column %s", numberToLetters(selection.left));
20571
- }
20572
- return _t("Group columns %s - %s", numberToLetters(selection.left), numberToLetters(selection.right));
20573
- },
20574
- execute: (env) => groupHeadersAction(env, "COL"),
20575
- isVisible: (env) => {
20576
- const sheetId = env.model.getters.getActiveSheetId();
20577
- const selection = env.model.getters.getSelectedZone();
20578
- const groups = env.model.getters.getHeaderGroupsInZone(sheetId, "COL", selection);
20579
- return (IS_ONLY_ONE_RANGE(env) &&
20580
- !groups.some((group) => group.start === selection.left && group.end === selection.right));
20581
- },
20582
- icon: "o-spreadsheet-Icon.GROUP_COLUMNS",
20583
- };
20584
- const groupRows = {
20585
- name: (env) => {
20586
- const selection = env.model.getters.getSelectedZone();
20587
- if (selection.top === selection.bottom) {
20588
- return _t("Group row %s", String(selection.top + 1));
20589
- }
20590
- return _t("Group rows %s - %s", String(selection.top + 1), String(selection.bottom + 1));
20591
- },
20592
- execute: (env) => groupHeadersAction(env, "ROW"),
20593
- isVisible: (env) => {
20594
- const sheetId = env.model.getters.getActiveSheetId();
20595
- const selection = env.model.getters.getSelectedZone();
20596
- const groups = env.model.getters.getHeaderGroupsInZone(sheetId, "ROW", selection);
20597
- return (IS_ONLY_ONE_RANGE(env) &&
20598
- !groups.some((group) => group.start === selection.top && group.end === selection.bottom));
20599
- },
20600
- icon: "o-spreadsheet-Icon.GROUP_ROWS",
20601
- };
20602
- const ungroupColumns = {
20603
- name: (env) => {
20604
- const selection = env.model.getters.getSelectedZone();
20605
- if (selection.left === selection.right) {
20606
- return _t("Ungroup column %s", numberToLetters(selection.left));
20607
- }
20608
- return _t("Ungroup columns %s - %s", numberToLetters(selection.left), numberToLetters(selection.right));
20609
- },
20610
- execute: (env) => ungroupHeaders(env, "COL"),
20611
- icon: "o-spreadsheet-Icon.UNGROUP_COLUMNS",
20612
- };
20613
- const ungroupRows = {
20614
- name: (env) => {
20615
- const selection = env.model.getters.getSelectedZone();
20616
- if (selection.top === selection.bottom) {
20617
- return _t("Ungroup row %s", String(selection.top + 1));
20618
- }
20619
- return _t("Ungroup rows %s - %s", String(selection.top + 1), String(selection.bottom + 1));
20620
- },
20621
- execute: (env) => ungroupHeaders(env, "ROW"),
20622
- icon: "o-spreadsheet-Icon.UNGROUP_ROWS",
20623
- };
20624
- function selectionContainsFilter(env) {
20625
- const sheetId = env.model.getters.getActiveSheetId();
20626
- const selectedZones = env.model.getters.getSelectedZones();
20627
- return env.model.getters.doesZonesContainFilter(sheetId, selectedZones);
20628
- }
20629
- function cannotCreateFilter(env) {
20630
- return !areZonesContinuous(...env.model.getters.getSelectedZones());
20631
- }
20632
- function createRemoveFilterAction(env) {
20633
- if (selectionContainsFilter(env)) {
20634
- env.model.dispatch("REMOVE_FILTER_TABLE", {
20635
- sheetId: env.model.getters.getActiveSheetId(),
20636
- target: env.model.getters.getSelectedZones(),
20637
- });
20638
- return;
20639
- }
20640
- if (cannotCreateFilter(env)) {
20641
- return;
20642
- }
20643
- env.model.selection.selectTableAroundSelection();
20644
- const sheetId = env.model.getters.getActiveSheetId();
20645
- const selection = env.model.getters.getSelectedZones();
20646
- interactiveAddFilter(env, sheetId, selection);
20647
- }
20648
- function groupHeadersAction(env, dim) {
20649
- const selection = env.model.getters.getSelectedZone();
20650
- const sheetId = env.model.getters.getActiveSheetId();
20651
- env.model.dispatch("GROUP_HEADERS", {
20652
- sheetId,
20653
- dimension: dim,
20654
- start: dim === "COL" ? selection.left : selection.top,
20655
- end: dim === "COL" ? selection.right : selection.bottom,
20656
- });
20657
- }
20658
- function ungroupHeaders(env, dim) {
20659
- const selection = env.model.getters.getSelectedZone();
20660
- const sheetId = env.model.getters.getActiveSheetId();
20661
- env.model.dispatch("UNGROUP_HEADERS", {
20662
- sheetId,
20663
- dimension: dim,
20664
- start: dim === "COL" ? selection.left : selection.top,
20665
- end: dim === "COL" ? selection.right : selection.bottom,
20666
- });
20667
- }
20668
- function canUngroupHeaders(env, dimension) {
20669
- const sheetId = env.model.getters.getActiveSheetId();
20670
- const selection = env.model.getters.getSelectedZones();
20671
- return (selection.length === 1 &&
20672
- env.model.getters.getHeaderGroupsInZone(sheetId, dimension, selection[0]).length > 0);
20673
- }
20674
-
20675
- var ACTION_VIEW = /*#__PURE__*/Object.freeze({
20676
- __proto__: null,
20677
- canUngroupHeaders: canUngroupHeaders,
20678
- createRemoveFilter: createRemoveFilter,
20679
- freezeCurrentCol: freezeCurrentCol,
20680
- freezeCurrentRow: freezeCurrentRow,
20681
- freezeFirstCol: freezeFirstCol,
20682
- freezeFirstRow: freezeFirstRow,
20683
- freezePane: freezePane,
20684
- freezeSecondCol: freezeSecondCol,
20685
- freezeSecondRow: freezeSecondRow,
20686
- groupColumns: groupColumns,
20687
- groupRows: groupRows,
20688
- hideCols: hideCols,
20689
- hideRows: hideRows,
20690
- unFreezeCols: unFreezeCols,
20691
- unFreezePane: unFreezePane,
20692
- unFreezeRows: unFreezeRows,
20693
- ungroupColumns: ungroupColumns,
20694
- ungroupRows: ungroupRows,
20695
- unhideAllCols: unhideAllCols,
20696
- unhideAllRows: unhideAllRows,
20697
- unhideCols: unhideCols,
20698
- unhideRows: unhideRows,
20699
- viewFormulas: viewFormulas,
20700
- viewGridlines: viewGridlines
20701
- });
20702
-
20703
20688
  const colMenuRegistry = new MenuItemRegistry();
20704
20689
  colMenuRegistry
20705
20690
  .add("cut", {
@@ -21342,13 +21327,8 @@ topbarMenuRegistry
21342
21327
  sequence: 30,
21343
21328
  separator: true,
21344
21329
  })
21345
- .addChild("add_data_filter", ["data"], {
21346
- ...addDataFilter,
21347
- sequence: 40,
21348
- separator: true,
21349
- })
21350
- .addChild("remove_data_filter", ["data"], {
21351
- ...removeDataFilter,
21330
+ .addChild("add_remove_data_filter", ["data"], {
21331
+ ...addRemoveDataFilter,
21352
21332
  sequence: 40,
21353
21333
  separator: true,
21354
21334
  });
@@ -26964,6 +26944,11 @@ class Composer extends owl.Component {
26964
26944
  }
26965
26945
  }
26966
26946
  }
26947
+ onContextMenu(ev) {
26948
+ if (this.env.model.getters.getEditionMode() === "inactive") {
26949
+ this.props.onInputContextMenu?.(ev);
26950
+ }
26951
+ }
26967
26952
  // ---------------------------------------------------------------------------
26968
26953
  // Private
26969
26954
  // ---------------------------------------------------------------------------
@@ -27201,6 +27186,7 @@ Composer.props = {
27201
27186
  onComposerCellFocused: { type: Function, optional: true },
27202
27187
  onComposerContentFocused: Function,
27203
27188
  isDefaultFocus: { type: Boolean, optional: true },
27189
+ onInputContextMenu: { type: Function, optional: true },
27204
27190
  };
27205
27191
 
27206
27192
  const COMPOSER_BORDER_WIDTH = 3 * 0.4 * window.devicePixelRatio || 1;
@@ -27276,6 +27262,7 @@ class GridComposer extends owl.Component {
27276
27262
  isDefaultFocus: true,
27277
27263
  onComposerContentFocused: this.props.onComposerContentFocused,
27278
27264
  onComposerCellFocused: this.props.onComposerCellFocused,
27265
+ onInputContextMenu: this.props.onInputContextMenu,
27279
27266
  };
27280
27267
  }
27281
27268
  get containerStyle() {
@@ -27364,6 +27351,7 @@ GridComposer.props = {
27364
27351
  onComposerContentFocused: Function,
27365
27352
  gridDims: Object,
27366
27353
  onComposerCellFocused: Function,
27354
+ onInputContextMenu: Function,
27367
27355
  };
27368
27356
 
27369
27357
  const CSS$1 = css /* scss */ `
@@ -27843,6 +27831,10 @@ css /*SCSS*/ `
27843
27831
  height: 0px;
27844
27832
  }
27845
27833
  }
27834
+ .o-figure-container {
27835
+ -webkit-user-select: none; // safari
27836
+ user-select: none;
27837
+ }
27846
27838
  `;
27847
27839
  /**
27848
27840
  * Each figure ⭐ is positioned inside a container `div` placed and sized
@@ -31317,29 +31309,12 @@ function convertWidthFromExcel(width) {
31317
31309
  return width;
31318
31310
  return Math.round((width / WIDTH_FACTOR) * 100) / 100;
31319
31311
  }
31320
- function convertBorderDescr(descr) {
31321
- if (!descr) {
31322
- return undefined;
31323
- }
31324
- return {
31325
- style: descr.style,
31326
- color: { rgb: descr.color },
31327
- };
31328
- }
31329
31312
  function extractStyle(cell, data) {
31330
31313
  let style = {};
31331
31314
  if (cell.style) {
31332
31315
  style = data.styles[cell.style];
31333
31316
  }
31334
31317
  const format = extractFormat(cell, data);
31335
- const exportedBorder = {};
31336
- if (cell.border) {
31337
- const border = data.borders[cell.border];
31338
- exportedBorder.left = convertBorderDescr(border.left);
31339
- exportedBorder.right = convertBorderDescr(border.right);
31340
- exportedBorder.bottom = convertBorderDescr(border.bottom);
31341
- exportedBorder.top = convertBorderDescr(border.top);
31342
- }
31343
31318
  const styles = {
31344
31319
  font: {
31345
31320
  size: style?.fontSize || DEFAULT_FONT_SIZE,
@@ -31353,7 +31328,7 @@ function extractStyle(cell, data) {
31353
31328
  }
31354
31329
  : { reservedAttribute: "none" },
31355
31330
  numFmt: format ? { format: format, id: 0 /* id not used for export */ } : undefined,
31356
- border: exportedBorder || {},
31331
+ border: cell.border || 0,
31357
31332
  alignment: {
31358
31333
  horizontal: style.align,
31359
31334
  vertical: style.verticalAlign
@@ -31375,15 +31350,12 @@ function extractFormat(cell, data) {
31375
31350
  return undefined;
31376
31351
  }
31377
31352
  function normalizeStyle(construct, styles) {
31378
- const { id: fontId } = pushElement(styles["font"], construct.fonts);
31379
- const { id: fillId } = pushElement(styles["fill"], construct.fills);
31380
- const { id: borderId } = pushElement(styles["border"], construct.borders);
31381
31353
  // Normalize this
31382
31354
  const numFmtId = convertFormat(styles["numFmt"], construct.numFmts);
31383
31355
  const style = {
31384
- fontId,
31385
- fillId,
31386
- borderId,
31356
+ fontId: pushElement(styles.font, construct.fonts),
31357
+ fillId: pushElement(styles.fill, construct.fills),
31358
+ borderId: styles.border,
31387
31359
  numFmtId,
31388
31360
  alignment: {
31389
31361
  vertical: styles.alignment.vertical,
@@ -31391,8 +31363,7 @@ function normalizeStyle(construct, styles) {
31391
31363
  wrapText: styles.alignment.wrapText,
31392
31364
  },
31393
31365
  };
31394
- const { id } = pushElement(style, construct.styles);
31395
- return id;
31366
+ return pushElement(style, construct.styles);
31396
31367
  }
31397
31368
  function convertFormat(format, numFmtStructure) {
31398
31369
  if (!format) {
@@ -31400,8 +31371,7 @@ function convertFormat(format, numFmtStructure) {
31400
31371
  }
31401
31372
  let formatId = XLSX_FORMAT_MAP[format.format];
31402
31373
  if (!formatId) {
31403
- const { id } = pushElement(format, numFmtStructure);
31404
- formatId = id + FIRST_NUMFMT_ID;
31374
+ formatId = pushElement(format, numFmtStructure) + FIRST_NUMFMT_ID;
31405
31375
  }
31406
31376
  return formatId;
31407
31377
  }
@@ -31426,20 +31396,15 @@ function addRelsToFile(relsFiles, path, rel) {
31426
31396
  return id;
31427
31397
  }
31428
31398
  function pushElement(property, propertyList) {
31429
- for (let [key, value] of Object.entries(propertyList)) {
31430
- if (JSON.stringify(value) === JSON.stringify(property)) {
31431
- return { id: parseInt(key, 10), list: propertyList };
31399
+ let len = propertyList.length;
31400
+ const operator = typeof property === "object" ? deepEquals : (a, b) => a === b;
31401
+ for (let i = 0; i < len; i++) {
31402
+ if (operator(property, propertyList[i])) {
31403
+ return i;
31432
31404
  }
31433
31405
  }
31434
- let elemId = propertyList.findIndex((elem) => JSON.stringify(elem) === JSON.stringify(property));
31435
- if (elemId === -1) {
31436
- propertyList.push(property);
31437
- elemId = propertyList.length - 1;
31438
- }
31439
- return {
31440
- id: elemId,
31441
- list: propertyList,
31442
- };
31406
+ propertyList[propertyList.length] = property;
31407
+ return propertyList.length - 1;
31443
31408
  }
31444
31409
  const chartIds = [];
31445
31410
  /**
@@ -32160,7 +32125,25 @@ function parseXML(xmlString, mimeType = "text/xml") {
32160
32125
  }
32161
32126
  return document;
32162
32127
  }
32163
- function getDefaultXLSXStructure() {
32128
+ function convertBorderDescr(descr) {
32129
+ if (!descr) {
32130
+ return undefined;
32131
+ }
32132
+ return {
32133
+ style: descr.style,
32134
+ color: { rgb: descr.color },
32135
+ };
32136
+ }
32137
+ function getDefaultXLSXStructure(data) {
32138
+ const xlsxBorders = Object.values(data.borders).map((border) => {
32139
+ return {
32140
+ left: convertBorderDescr(border.left),
32141
+ right: convertBorderDescr(border.right),
32142
+ bottom: convertBorderDescr(border.bottom),
32143
+ top: convertBorderDescr(border.top),
32144
+ };
32145
+ });
32146
+ const borders = [{}, ...xlsxBorders];
32164
32147
  return {
32165
32148
  relsFiles: [],
32166
32149
  sharedStrings: [],
@@ -32183,7 +32166,7 @@ function getDefaultXLSXStructure() {
32183
32166
  },
32184
32167
  ],
32185
32168
  fills: [{ reservedAttribute: "none" }, { reservedAttribute: "gray125" }],
32186
- borders: [{}],
32169
+ borders,
32187
32170
  numFmts: [],
32188
32171
  dxfs: [],
32189
32172
  };
@@ -37369,7 +37352,17 @@ class FiltersPlugin extends CorePlugin {
37369
37352
  }
37370
37353
  }
37371
37354
  exportForExcel(data) {
37372
- this.export(data);
37355
+ for (const sheet of data.sheets) {
37356
+ for (const filterTable of this.getFilterTables(sheet.id)) {
37357
+ if (zoneToDimension(filterTable.zone).numberOfRows === 1) {
37358
+ continue;
37359
+ }
37360
+ sheet.filterTables.push({
37361
+ range: zoneToXc(filterTable.zone),
37362
+ filters: [],
37363
+ });
37364
+ }
37365
+ }
37373
37366
  }
37374
37367
  }
37375
37368
 
@@ -41098,7 +41091,9 @@ class Evaluator {
41098
41091
  this.blockedArrayFormulas = new Set();
41099
41092
  this.spreadingRelations = new SpreadingRelation();
41100
41093
  this.formulaDependencies = lazy(() => {
41101
- const dependencies = [...this.getAllCells()].flatMap((positionId) => this.getDirectDependencies(positionId).map((range) => ({
41094
+ const dependencies = [...this.getAllCells()].flatMap((positionId) => this.getDirectDependencies(positionId)
41095
+ .filter((range) => !range.invalidSheetName && !range.invalidXc)
41096
+ .map((range) => ({
41102
41097
  data: positionId,
41103
41098
  boundingBox: {
41104
41099
  zone: range.zone,
@@ -48916,7 +48911,7 @@ class FilterEvaluationPlugin extends UIPlugin {
48916
48911
  "isFilterActive",
48917
48912
  ];
48918
48913
  filterValues = {};
48919
- hiddenRows = new Set();
48914
+ hiddenRows = {};
48920
48915
  isEvaluationDirty = false;
48921
48916
  allowDispatch(cmd) {
48922
48917
  switch (cmd.type) {
@@ -48959,11 +48954,11 @@ class FilterEvaluationPlugin extends UIPlugin {
48959
48954
  case "UNFOLD_HEADER_GROUP":
48960
48955
  case "FOLD_ALL_HEADER_GROUPS":
48961
48956
  case "UNFOLD_ALL_HEADER_GROUPS":
48962
- this.updateHiddenRows();
48957
+ this.updateHiddenRows(cmd.sheetId);
48963
48958
  break;
48964
48959
  case "UPDATE_FILTER":
48965
48960
  this.updateFilter(cmd);
48966
- this.updateHiddenRows();
48961
+ this.updateHiddenRows(cmd.sheetId);
48967
48962
  break;
48968
48963
  case "DUPLICATE_SHEET":
48969
48964
  const filterValues = {};
@@ -48983,15 +48978,14 @@ class FilterEvaluationPlugin extends UIPlugin {
48983
48978
  }
48984
48979
  finalize() {
48985
48980
  if (this.isEvaluationDirty) {
48986
- this.updateHiddenRows();
48981
+ for (const sheetId of this.getters.getSheetIds()) {
48982
+ this.updateHiddenRows(sheetId);
48983
+ }
48987
48984
  this.isEvaluationDirty = false;
48988
48985
  }
48989
48986
  }
48990
48987
  isRowFiltered(sheetId, row) {
48991
- if (sheetId !== this.getters.getActiveSheetId()) {
48992
- return false;
48993
- }
48994
- return this.hiddenRows.has(row);
48988
+ return !!this.hiddenRows[sheetId]?.has(row);
48995
48989
  }
48996
48990
  getCellBorderWithFilterBorder(position) {
48997
48991
  const { sheetId, col, row } = position;
@@ -49042,8 +49036,7 @@ class FilterEvaluationPlugin extends UIPlugin {
49042
49036
  this.filterValues[sheetId] = {};
49043
49037
  this.filterValues[sheetId][id] = hiddenValues;
49044
49038
  }
49045
- updateHiddenRows() {
49046
- const sheetId = this.getters.getActiveSheetId();
49039
+ updateHiddenRows(sheetId) {
49047
49040
  const filters = this.getters
49048
49041
  .getFilters(sheetId)
49049
49042
  .sort((filter1, filter2) => filter1.zoneWithHeaders.top - filter2.zoneWithHeaders.top);
@@ -49064,7 +49057,7 @@ class FilterEvaluationPlugin extends UIPlugin {
49064
49057
  }
49065
49058
  }
49066
49059
  }
49067
- this.hiddenRows = hiddenRows;
49060
+ this.hiddenRows[sheetId] = hiddenRows;
49068
49061
  }
49069
49062
  getCellValueAsString(sheetId, col, row) {
49070
49063
  const value = this.getters.getEvaluatedCell({ sheetId, col, row }).formattedValue;
@@ -50205,13 +50198,14 @@ class SheetViewPlugin extends UIPlugin {
50205
50198
  }
50206
50199
  }
50207
50200
  handleEvent(event) {
50201
+ const sheetId = this.getters.getActiveSheetId();
50208
50202
  if (event.options.scrollIntoView) {
50209
50203
  let { col, row } = findCellInNewZone(event.previousAnchor.zone, event.anchor.zone);
50210
50204
  if (event.mode === "updateAnchor") {
50211
50205
  const oldZone = event.previousAnchor.zone;
50212
50206
  const newZone = event.anchor.zone;
50213
50207
  // altering a zone should not move the viewport in a dimension that wasn't changed
50214
- const { top, bottom, left, right } = this.getters.getActiveMainViewport();
50208
+ const { top, bottom, left, right } = this.getMainInternalViewport(sheetId);
50215
50209
  if (oldZone.left === newZone.left && oldZone.right === newZone.right) {
50216
50210
  col = left > col || col > right ? left : col;
50217
50211
  }
@@ -50219,7 +50213,6 @@ class SheetViewPlugin extends UIPlugin {
50219
50213
  row = top > row || row > bottom ? top : row;
50220
50214
  }
50221
50215
  }
50222
- const sheetId = this.getters.getActiveSheetId();
50223
50216
  col = Math.min(col, this.getters.getNumberCols(sheetId) - 1);
50224
50217
  row = Math.min(row, this.getters.getNumberRows(sheetId) - 1);
50225
50218
  if (!this.sheetsWithDirtyViewports.has(sheetId)) {
@@ -50256,16 +50249,16 @@ class SheetViewPlugin extends UIPlugin {
50256
50249
  this.setSheetViewOffset(cmd.offsetX, cmd.offsetY);
50257
50250
  break;
50258
50251
  case "SHIFT_VIEWPORT_DOWN":
50259
- const { top } = this.getActiveMainViewport();
50260
50252
  const sheetId = this.getters.getActiveSheetId();
50261
- const shiftedOffsetY = this.clipOffsetY(this.getters.getRowDimensions(sheetId, top).start + this.sheetViewHeight);
50262
- this.shiftVertically(shiftedOffsetY);
50253
+ const { top, viewportHeight, offsetCorrectionY } = this.getMainInternalViewport(sheetId);
50254
+ const topRowDims = this.getters.getRowDimensions(sheetId, top);
50255
+ this.shiftVertically(topRowDims.start + viewportHeight - offsetCorrectionY);
50263
50256
  break;
50264
50257
  case "SHIFT_VIEWPORT_UP": {
50265
- const { top } = this.getActiveMainViewport();
50266
50258
  const sheetId = this.getters.getActiveSheetId();
50267
- const shiftedOffsetY = this.clipOffsetY(this.getters.getRowDimensions(sheetId, top).end - this.sheetViewHeight);
50268
- this.shiftVertically(shiftedOffsetY);
50259
+ const { top, viewportHeight, offsetCorrectionY } = this.getMainInternalViewport(sheetId);
50260
+ const topRowDims = this.getters.getRowDimensions(sheetId, top);
50261
+ this.shiftVertically(topRowDims.end - offsetCorrectionY - viewportHeight);
50269
50262
  break;
50270
50263
  }
50271
50264
  case "REMOVE_FILTER_TABLE":
@@ -50658,17 +50651,6 @@ class SheetViewPlugin extends UIPlugin {
50658
50651
  const { maxOffsetX, maxOffsetY } = this.getMaximumSheetOffset();
50659
50652
  Object.values(this.getSubViewports(sheetId)).forEach((viewport) => viewport.setViewportOffset(clip(offsetX, 0, maxOffsetX), clip(offsetY, 0, maxOffsetY)));
50660
50653
  }
50661
- /**
50662
- * Clip the vertical offset within the allowed range.
50663
- * Not above the sheet, nor below the sheet.
50664
- */
50665
- clipOffsetY(offsetY) {
50666
- const { height } = this.getMainViewportRect();
50667
- const maxOffset = height - this.sheetViewHeight;
50668
- offsetY = Math.min(offsetY, maxOffset);
50669
- offsetY = Math.max(offsetY, 0);
50670
- return offsetY;
50671
- }
50672
50654
  getViewportOffset(sheetId) {
50673
50655
  return {
50674
50656
  x: this.viewports[sheetId]?.bottomRight.offsetScrollbarX || 0,
@@ -50724,12 +50706,15 @@ class SheetViewPlugin extends UIPlugin {
50724
50706
  * viewport top.
50725
50707
  */
50726
50708
  shiftVertically(offset) {
50727
- const { top } = this.getActiveMainViewport();
50709
+ const sheetId = this.getters.getActiveSheetId();
50710
+ const { top } = this.getMainInternalViewport(sheetId);
50728
50711
  const { scrollX } = this.getActiveSheetScrollInfo();
50729
50712
  this.setSheetViewOffset(scrollX, offset);
50730
50713
  const { anchor } = this.getters.getSelection();
50731
- const deltaRow = this.getActiveMainViewport().top - top;
50732
- this.selection.selectCell(anchor.cell.col, anchor.cell.row + deltaRow);
50714
+ if (anchor.cell.row >= this.getters.getPaneDivisions(sheetId).ySplit) {
50715
+ const deltaRow = this.getMainInternalViewport(sheetId).top - top;
50716
+ this.selection.selectCell(anchor.cell.col, anchor.cell.row + deltaRow);
50717
+ }
50733
50718
  }
50734
50719
  getVisibleFigures() {
50735
50720
  const sheetId = this.getters.getActiveSheetId();
@@ -51660,7 +51645,6 @@ css /* scss */ `
51660
51645
  cursor: pointer;
51661
51646
  }
51662
51647
  `;
51663
- let tKey = 1;
51664
51648
  class SpreadsheetDashboard extends owl.Component {
51665
51649
  static template = "o-spreadsheet-SpreadsheetDashboard";
51666
51650
  static components = {
@@ -51738,13 +51722,9 @@ class SpreadsheetDashboard extends owl.Component {
51738
51722
  coordinates: rect,
51739
51723
  position: { col, row },
51740
51724
  action,
51741
- // we can't rely on position only because a row or a column could
51742
- // be inserted at any time.
51743
- tKey: `${tKey}-${col}-${row}`,
51744
51725
  });
51745
51726
  }
51746
51727
  }
51747
- tKey++;
51748
51728
  return cells;
51749
51729
  }
51750
51730
  getClickableAction(position) {
@@ -55236,8 +55216,7 @@ function addContent(content, sharedStrings, forceString = false) {
55236
55216
  attrs.push(["t", "b"]);
55237
55217
  }
55238
55218
  else if (forceString || !isNumber(value, DEFAULT_LOCALE)) {
55239
- const { id } = pushElement(content, sharedStrings);
55240
- value = id.toString();
55219
+ value = pushElement(content, sharedStrings);
55241
55220
  attrs.push(["t", "s"]);
55242
55221
  }
55243
55222
  return { attrs, node: escapeXml /*xml*/ `<v>${value}</v>` };
@@ -55362,8 +55341,7 @@ function addCellIsRule(cf, rule, dxfs) {
55362
55341
  if (rule.style.fillColor) {
55363
55342
  dxf.fill = { fgColor: { rgb: rule.style.fillColor } };
55364
55343
  }
55365
- const { id } = pushElement(dxf, dxfs);
55366
- ruleAttributes.push(["dxfId", id]);
55344
+ ruleAttributes.push(["dxfId", pushElement(dxf, dxfs)]);
55367
55345
  return escapeXml /*xml*/ `
55368
55346
  <conditionalFormatting sqref="${cf.ranges.join(" ")}">
55369
55347
  <cfRule ${formatAttributes(ruleAttributes)}>
@@ -56172,7 +56150,7 @@ function addSheetViews(sheet) {
56172
56150
  */
56173
56151
  function getXLSX(data) {
56174
56152
  const files = [];
56175
- const construct = getDefaultXLSXStructure();
56153
+ const construct = getDefaultXLSXStructure(data);
56176
56154
  files.push(createWorkbook(data, construct));
56177
56155
  files.push(...createWorksheets(data, construct));
56178
56156
  files.push(createStylesSheet(construct));
@@ -57052,6 +57030,6 @@ exports.setTranslationMethod = setTranslationMethod;
57052
57030
  exports.tokenize = tokenize;
57053
57031
 
57054
57032
 
57055
- __info__.version = "17.0.17";
57056
- __info__.date = "2024-04-05T13:59:37.139Z";
57057
- __info__.hash = "33f09d7";
57033
+ __info__.version = "17.0.19";
57034
+ __info__.date = "2024-04-18T16:41:42.291Z";
57035
+ __info__.hash = "9f3317a";