@odoo/o-spreadsheet 18.1.29 → 18.1.31

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 18.1.29
6
- * @date 2025-07-11T11:11:55.442Z
7
- * @hash 3456a93
5
+ * @version 18.1.31
6
+ * @date 2025-08-04T06:52:11.010Z
7
+ * @hash 4f581fb
8
8
  */
9
9
 
10
10
  (function (exports, owl) {
@@ -10478,6 +10478,7 @@ stores.inject(MyMetaStore, storeInstance);
10478
10478
  }
10479
10479
  setup() {
10480
10480
  owl.onMounted(() => {
10481
+ registerChartJSExtensions();
10481
10482
  const runtime = this.chartRuntime;
10482
10483
  this.currentRuntime = runtime;
10483
10484
  // Note: chartJS modify the runtime in place, so it's important to give it a copy
@@ -11135,6 +11136,7 @@ stores.inject(MyMetaStore, storeInstance);
11135
11136
 
11136
11137
  autoCompleteProviders.add("dataValidation", {
11137
11138
  displayAllOnInitialContent: true,
11139
+ canBeToggled: false,
11138
11140
  getProposals(tokenAtCursor, content) {
11139
11141
  if (content.startsWith("=")) {
11140
11142
  return [];
@@ -11142,31 +11144,40 @@ stores.inject(MyMetaStore, storeInstance);
11142
11144
  if (!this.composer.currentEditedCell) {
11143
11145
  return [];
11144
11146
  }
11145
- const position = this.composer.currentEditedCell;
11146
- const rule = this.getters.getValidationRuleForCell(position);
11147
- if (!rule ||
11148
- (rule.criterion.type !== "isValueInList" && rule.criterion.type !== "isValueInRange")) {
11149
- return [];
11150
- }
11151
- let values;
11152
- if (rule.criterion.type === "isValueInList") {
11153
- values = rule.criterion.values;
11154
- }
11155
- else {
11156
- const range = this.getters.getRangeFromSheetXC(position.sheetId, rule.criterion.values[0]);
11157
- values = Array.from(new Set(this.getters
11158
- .getRangeValues(range)
11159
- .filter(isNotNull)
11160
- .map((value) => value.toString())
11161
- .filter((val) => val !== "")));
11162
- }
11163
- return values.map((value) => ({ text: value }));
11147
+ return getProposedValues(this.getters, this.composer.currentEditedCell).map((value) => ({
11148
+ text: value.value?.toString() || "",
11149
+ htmlContent: [{ value: value.label }],
11150
+ fuzzySearchKey: value.label,
11151
+ }));
11164
11152
  },
11165
11153
  selectProposal(tokenAtCursor, value) {
11166
11154
  this.composer.setCurrentContent(value);
11167
11155
  this.composer.stopEdition();
11168
11156
  },
11169
11157
  });
11158
+ function getProposedValues(getters, position) {
11159
+ const rule = getters.getValidationRuleForCell(position);
11160
+ if (!rule ||
11161
+ (rule.criterion.type !== "isValueInList" && rule.criterion.type !== "isValueInRange")) {
11162
+ return [];
11163
+ }
11164
+ let values = [];
11165
+ if (rule.criterion.type === "isValueInList") {
11166
+ values = rule.criterion.values.map((value) => ({ label: value, value }));
11167
+ }
11168
+ else {
11169
+ const labelsSet = new Set();
11170
+ const range = getters.getRangeFromSheetXC(position.sheetId, rule.criterion.values[0]);
11171
+ for (const p of positions(range.zone)) {
11172
+ const cell = getters.getEvaluatedCell({ ...p, sheetId: range.sheetId });
11173
+ if (cell.formattedValue && !labelsSet.has(cell.formattedValue)) {
11174
+ labelsSet.add(cell.formattedValue);
11175
+ values.push({ label: cell.formattedValue, value: cell.value });
11176
+ }
11177
+ }
11178
+ }
11179
+ return values;
11180
+ }
11170
11181
 
11171
11182
  function getHtmlContentFromPattern(pattern, value, highlightColor, className) {
11172
11183
  const pendingHtmlContent = [];
@@ -18937,11 +18948,17 @@ stores.inject(MyMetaStore, storeInstance);
18937
18948
  if (isEvaluationError(cellReference?.value)) {
18938
18949
  return cellReference;
18939
18950
  }
18940
- const column = cellReference === undefined
18941
- ? this.__originCellPosition?.col
18942
- : toZone(cellReference.value).left;
18943
- assert(() => column !== undefined, "In this context, the function [[FUNCTION_NAME]] needs to have a cell or range in parameter.");
18944
- return column + 1;
18951
+ if (cellReference === undefined) {
18952
+ assert(() => this.__originCellPosition?.col !== undefined, "In this context, the function [[FUNCTION_NAME]] needs to have a cell or range in parameter.");
18953
+ return this.__originCellPosition.col + 1;
18954
+ }
18955
+ const zone = this.getters.getRangeFromSheetXC(this.getters.getActiveSheetId(), cellReference.value).zone;
18956
+ if (zone.left === zone.right) {
18957
+ return zone.left + 1;
18958
+ }
18959
+ return generateMatrix(zone.right - zone.left + 1, 1, (col, row) => ({
18960
+ value: zone.left + col + 1,
18961
+ }));
18945
18962
  },
18946
18963
  isExported: true,
18947
18964
  };
@@ -19160,11 +19177,17 @@ stores.inject(MyMetaStore, storeInstance);
19160
19177
  if (isEvaluationError(cellReference?.value)) {
19161
19178
  return cellReference;
19162
19179
  }
19163
- const row = cellReference === undefined
19164
- ? this.__originCellPosition?.row
19165
- : toZone(cellReference.value).top;
19166
- assert(() => row !== undefined, "In this context, the function [[FUNCTION_NAME]] needs to have a cell or range in parameter.");
19167
- return row + 1;
19180
+ if (cellReference === undefined) {
19181
+ assert(() => this.__originCellPosition?.row !== undefined, "In this context, the function [[FUNCTION_NAME]] needs to have a cell or range in parameter.");
19182
+ return this.__originCellPosition.row + 1;
19183
+ }
19184
+ const zone = this.getters.getRangeFromSheetXC(this.getters.getActiveSheetId(), cellReference.value).zone;
19185
+ if (zone.top === zone.bottom) {
19186
+ return zone.top + 1;
19187
+ }
19188
+ return generateMatrix(1, zone.bottom - zone.top + 1, (col, row) => ({
19189
+ value: zone.top + row + 1,
19190
+ }));
19168
19191
  },
19169
19192
  isExported: true,
19170
19193
  };
@@ -21440,6 +21463,7 @@ stores.inject(MyMetaStore, storeInstance);
21440
21463
  proposals,
21441
21464
  selectProposal: provider.selectProposal,
21442
21465
  autoSelectFirstProposal: provider.autoSelectFirstProposal ?? false,
21466
+ canBeToggled: provider.canBeToggled,
21443
21467
  };
21444
21468
  }
21445
21469
  if (exactMatch && this._currentContent !== this.initialContent) {
@@ -21462,6 +21486,7 @@ stores.inject(MyMetaStore, storeInstance);
21462
21486
  proposals,
21463
21487
  selectProposal: provider.selectProposal,
21464
21488
  autoSelectFirstProposal: provider.autoSelectFirstProposal ?? false,
21489
+ canBeToggled: provider.canBeToggled,
21465
21490
  };
21466
21491
  }
21467
21492
  }
@@ -41500,9 +41525,13 @@ stores.inject(MyMetaStore, storeInstance);
41500
41525
  }
41501
41526
  }
41502
41527
  closeAssistant() {
41528
+ if (!this.canBeToggled)
41529
+ return;
41503
41530
  this.assistant.forcedClosed = true;
41504
41531
  }
41505
41532
  openAssistant() {
41533
+ if (!this.canBeToggled)
41534
+ return;
41506
41535
  this.assistant.forcedClosed = false;
41507
41536
  }
41508
41537
  onWheel(event) {
@@ -41512,6 +41541,9 @@ stores.inject(MyMetaStore, storeInstance);
41512
41541
  event.stopPropagation();
41513
41542
  }
41514
41543
  }
41544
+ get canBeToggled() {
41545
+ return this.autoCompleteState.provider?.canBeToggled ?? true;
41546
+ }
41515
41547
  // ---------------------------------------------------------------------------
41516
41548
  // Private
41517
41549
  // ---------------------------------------------------------------------------
@@ -41647,7 +41679,7 @@ stores.inject(MyMetaStore, storeInstance);
41647
41679
  }
41648
41680
  }
41649
41681
  autoComplete(value) {
41650
- if (!value || this.assistant.forcedClosed) {
41682
+ if (!value || (this.assistant.forcedClosed && this.canBeToggled)) {
41651
41683
  return;
41652
41684
  }
41653
41685
  this.autoCompleteState.provider?.selectProposal(value);
@@ -42444,7 +42476,8 @@ stores.inject(MyMetaStore, storeInstance);
42444
42476
  static props = {
42445
42477
  editedCf: Object,
42446
42478
  onCancel: Function,
42447
- onSave: Function,
42479
+ onExit: Function,
42480
+ isNewCf: Boolean,
42448
42481
  };
42449
42482
  static components = {
42450
42483
  SelectionInput,
@@ -42463,6 +42496,7 @@ stores.inject(MyMetaStore, storeInstance);
42463
42496
  getTextDecoration = getTextDecoration;
42464
42497
  colorNumberString = colorNumberString;
42465
42498
  state;
42499
+ hasEditedCf = this.props.isNewCf;
42466
42500
  setup() {
42467
42501
  this.state = owl.useState({
42468
42502
  errors: [],
@@ -42520,6 +42554,9 @@ stores.inject(MyMetaStore, storeInstance);
42520
42554
  ranges: ranges.map((xc) => this.env.model.getters.getRangeDataFromXc(sheetId, xc)),
42521
42555
  sheetId,
42522
42556
  });
42557
+ if (result.isSuccessful) {
42558
+ this.hasEditedCf = true;
42559
+ }
42523
42560
  const reasons = result.reasons.filter((r) => r !== "NoChanges" /* CommandResult.NoChanges */);
42524
42561
  if (!newCf.suppressErrors) {
42525
42562
  this.state.errors = reasons;
@@ -42541,7 +42578,15 @@ stores.inject(MyMetaStore, storeInstance);
42541
42578
  onSave() {
42542
42579
  const result = this.updateConditionalFormat({});
42543
42580
  if (result.length === 0) {
42544
- this.props.onSave();
42581
+ this.props.onExit();
42582
+ }
42583
+ }
42584
+ onCancel() {
42585
+ if (this.hasEditedCf) {
42586
+ this.props.onCancel();
42587
+ }
42588
+ else {
42589
+ this.props.onExit();
42545
42590
  }
42546
42591
  }
42547
42592
  getDefaultRules() {
@@ -46892,9 +46937,15 @@ stores.inject(MyMetaStore, storeInstance);
46892
46937
  return domain.reduce((current, acc) => this.filterDataEntriesFromDomainNode(current, acc), dataEntries);
46893
46938
  }
46894
46939
  filterDataEntriesFromDomainNode(dataEntries, domain) {
46895
- const { field, value } = domain;
46940
+ const { field, value, type } = domain;
46896
46941
  const { nameWithGranularity } = this.getDimension(field);
46897
- return dataEntries.filter((entry) => entry[nameWithGranularity]?.value === value);
46942
+ return dataEntries.filter((entry) => {
46943
+ const cellValue = entry[nameWithGranularity]?.value;
46944
+ if (type === "char") {
46945
+ return String(cellValue) === String(value);
46946
+ }
46947
+ return cellValue === value;
46948
+ });
46898
46949
  }
46899
46950
  getDimension(nameWithGranularity) {
46900
46951
  return this.definition.getDimension(nameWithGranularity);
@@ -49394,6 +49445,11 @@ stores.inject(MyMetaStore, storeInstance);
49394
49445
  rect = this.defaultRect;
49395
49446
  isEditing = false;
49396
49447
  isCellReferenceVisible = false;
49448
+ currentEditedCell = {
49449
+ col: 0,
49450
+ row: 0,
49451
+ sheetId: this.env.model.getters.getActiveSheetId(),
49452
+ };
49397
49453
  composerStore;
49398
49454
  composerFocusStore;
49399
49455
  composerInterface;
@@ -49423,7 +49479,7 @@ stores.inject(MyMetaStore, storeInstance);
49423
49479
  return this.isCellReferenceVisible;
49424
49480
  }
49425
49481
  get cellReference() {
49426
- const { col, row, sheetId } = this.composerStore.currentEditedCell;
49482
+ const { col, row, sheetId } = this.currentEditedCell;
49427
49483
  const prefixSheet = sheetId !== this.env.model.getters.getActiveSheetId();
49428
49484
  return getFullReference(prefixSheet ? this.env.model.getters.getSheetName(sheetId) : undefined, toXC(col, row));
49429
49485
  }
@@ -49515,12 +49571,17 @@ stores.inject(MyMetaStore, storeInstance);
49515
49571
  if (!isEditing && this.composerFocusStore.activeComposer !== this.composerInterface) {
49516
49572
  this.composerFocusStore.focusComposer(this.composerInterface, { focusMode: "inactive" });
49517
49573
  }
49574
+ let shouldRecomputeRect = isEditing && !deepEquals(this.currentEditedCell, this.composerStore.currentEditedCell);
49518
49575
  if (this.isEditing !== isEditing) {
49519
49576
  this.isEditing = isEditing;
49520
49577
  if (!isEditing) {
49521
49578
  this.rect = this.defaultRect;
49522
49579
  return;
49523
49580
  }
49581
+ this.currentEditedCell = this.composerStore.currentEditedCell;
49582
+ shouldRecomputeRect = true;
49583
+ }
49584
+ if (shouldRecomputeRect) {
49524
49585
  const position = this.env.model.getters.getActivePosition();
49525
49586
  const zone = this.env.model.getters.expandZone(position.sheetId, positionToZone(position));
49526
49587
  this.rect = this.env.model.getters.getVisibleRect(zone);
@@ -62488,6 +62549,23 @@ stores.inject(MyMetaStore, storeInstance);
62488
62549
  static getters = ["getRowSize", "getHeaderSize"];
62489
62550
  tallestCellInRow = {};
62490
62551
  ctx = document.createElement("canvas").getContext("2d");
62552
+ beforeHandle(cmd) {
62553
+ switch (cmd.type) {
62554
+ // Ensure rows are updated before "UPDATE_CELL" is dispatched from cell plugin.
62555
+ // "UPDATE_CELL" uses the Sheet core plugin to access row data.
62556
+ // If "ADD_COLUMNS_ROWS" has not been processed yet by header_sizes_ui,
62557
+ // size updates may apply to incorrect (pre-insert) rows.
62558
+ case "ADD_COLUMNS_ROWS":
62559
+ if (cmd.dimension === "COL") {
62560
+ return;
62561
+ }
62562
+ const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
62563
+ const newCells = Array(cmd.quantity).fill(undefined);
62564
+ const newTallestCells = insertItemsAtIndex(this.tallestCellInRow[cmd.sheetId], newCells, addIndex);
62565
+ this.history.update("tallestCellInRow", cmd.sheetId, newTallestCells);
62566
+ break;
62567
+ }
62568
+ }
62491
62569
  handle(cmd) {
62492
62570
  switch (cmd.type) {
62493
62571
  case "START":
@@ -62517,16 +62595,6 @@ stores.inject(MyMetaStore, storeInstance);
62517
62595
  this.history.update("tallestCellInRow", cmd.sheetId, tallestCells);
62518
62596
  break;
62519
62597
  }
62520
- case "ADD_COLUMNS_ROWS": {
62521
- if (cmd.dimension === "COL") {
62522
- return;
62523
- }
62524
- const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
62525
- const newCells = Array(cmd.quantity).fill(undefined);
62526
- const newTallestCells = insertItemsAtIndex(this.tallestCellInRow[cmd.sheetId], newCells, addIndex);
62527
- this.history.update("tallestCellInRow", cmd.sheetId, newTallestCells);
62528
- break;
62529
- }
62530
62598
  case "RESIZE_COLUMNS_ROWS":
62531
62599
  {
62532
62600
  const sheetId = cmd.sheetId;
@@ -68267,6 +68335,14 @@ stores.inject(MyMetaStore, storeInstance);
68267
68335
  const isBasedBefore = cmd.base < start;
68268
68336
  const deltaCol = isBasedBefore && isCol ? thickness : 0;
68269
68337
  const deltaRow = isBasedBefore && !isCol ? thickness : 0;
68338
+ const toRemove = isBasedBefore ? cmd.elements.map((el) => el + thickness) : cmd.elements;
68339
+ const originalSize = Object.fromEntries(toRemove.map((element) => {
68340
+ const size = isCol
68341
+ ? this.getters.getColSize(cmd.sheetId, element)
68342
+ : this.getters.getUserRowSize(cmd.sheetId, element);
68343
+ const isDefaultCol = isCol && size === DEFAULT_CELL_WIDTH;
68344
+ return [element, isDefaultCol ? undefined : size];
68345
+ }));
68270
68346
  const target = [
68271
68347
  {
68272
68348
  left: isCol ? start + deltaCol : 0,
@@ -68297,13 +68373,12 @@ stores.inject(MyMetaStore, storeInstance);
68297
68373
  const col = selection.left;
68298
68374
  const row = selection.top;
68299
68375
  this.setSelectionMixin({ zone: selection, cell: { col, row } }, [selection]);
68300
- const toRemove = isBasedBefore ? cmd.elements.map((el) => el + thickness) : cmd.elements;
68301
68376
  let currentIndex = isBasedBefore ? cmd.base : cmd.base + 1;
68302
68377
  const resizingGroups = {};
68303
68378
  for (const element of toRemove) {
68304
- const size = this.getters.getHeaderSize(cmd.sheetId, cmd.dimension, element);
68379
+ const size = originalSize[element];
68305
68380
  const currentSize = this.getters.getHeaderSize(cmd.sheetId, cmd.dimension, currentIndex);
68306
- if (size != currentSize) {
68381
+ if (size && size != currentSize) {
68307
68382
  resizingGroups[size] ??= [];
68308
68383
  resizingGroups[size].push(currentIndex);
68309
68384
  currentIndex += 1;
@@ -70022,14 +70097,12 @@ stores.inject(MyMetaStore, storeInstance);
70022
70097
  this.editionState = "initializing";
70023
70098
  }
70024
70099
  stopEdition() {
70025
- const input = this.sheetNameRef.el;
70026
- if (!this.state.isEditing || !input)
70100
+ if (!this.state.isEditing || !this.sheetNameRef.el)
70027
70101
  return;
70028
70102
  this.state.isEditing = false;
70029
70103
  this.editionState = "initializing";
70030
- input.blur();
70104
+ this.sheetNameRef.el.blur();
70031
70105
  const inputValue = this.getInputContent() || "";
70032
- input.innerText = inputValue;
70033
70106
  interactiveRenameSheet(this.env, this.props.sheetId, inputValue, () => this.startEdition());
70034
70107
  }
70035
70108
  cancelEdition() {
@@ -72194,7 +72267,6 @@ stores.inject(MyMetaStore, storeInstance);
72194
72267
  this.checkViewportSize();
72195
72268
  stores.on("store-updated", this, render);
72196
72269
  resizeObserver.observe(this.spreadsheetRef.el);
72197
- registerChartJSExtensions();
72198
72270
  });
72199
72271
  owl.onWillUnmount(() => {
72200
72272
  this.unbindModelEvents();
@@ -76705,9 +76777,9 @@ stores.inject(MyMetaStore, storeInstance);
76705
76777
  exports.tokenize = tokenize;
76706
76778
 
76707
76779
 
76708
- __info__.version = "18.1.29";
76709
- __info__.date = "2025-07-11T11:11:55.442Z";
76710
- __info__.hash = "3456a93";
76780
+ __info__.version = "18.1.31";
76781
+ __info__.date = "2025-08-04T06:52:11.010Z";
76782
+ __info__.hash = "4f581fb";
76711
76783
 
76712
76784
 
76713
76785
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);