@odoo/o-spreadsheet 19.0.36 → 19.0.38

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 19.0.36
6
- * @date 2026-05-27T05:57:35.932Z
7
- * @hash 3f73c94
5
+ * @version 19.0.38
6
+ * @date 2026-06-17T08:50:59.627Z
7
+ * @hash f469250
8
8
  */
9
9
 
10
10
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
@@ -3473,6 +3473,7 @@ function emptyDataErrorMessage(argName) {
3473
3473
  //#endregion
3474
3474
  //#region src/helpers/format/format_tokenizer.ts
3475
3475
  function tokenizeFormat(str) {
3476
+ str = str.replace(/\s/g, " ");
3476
3477
  const chars = new TokenizingChars(str);
3477
3478
  const result = [];
3478
3479
  let currentFormatPart = [];
@@ -39290,11 +39291,10 @@ const INSERT_TABLE = (env) => {
39290
39291
  if (interactiveCreateTable(env, env.model.getters.getActiveSheetId()).isSuccessful) env.openSidePanel("TableSidePanel", {});
39291
39292
  };
39292
39293
  const DELETE_SELECTED_TABLE = (env) => {
39293
- const position = env.model.getters.getActivePosition();
39294
- const table = env.model.getters.getTable(position);
39294
+ const table = env.model.getters.getFirstTableInSelection();
39295
39295
  if (!table) return;
39296
39296
  env.model.dispatch("REMOVE_TABLE", {
39297
- sheetId: position.sheetId,
39297
+ sheetId: env.model.getters.getActiveSheetId(),
39298
39298
  target: [table.range.zone]
39299
39299
  });
39300
39300
  };
@@ -43585,8 +43585,12 @@ var CellComposerStore = class extends AbstractComposerStore {
43585
43585
  }
43586
43586
  stopEdition(direction) {
43587
43587
  if (this.canStopEdition()) {
43588
+ const { col, row } = this.currentEditedCell;
43588
43589
  this._stopEdition();
43589
- if (direction) this.model.selection.moveAnchorCell(direction, 1);
43590
+ if (direction) {
43591
+ this.model.selection.selectCell(col, row);
43592
+ this.model.selection.moveAnchorCell(direction, 1);
43593
+ }
43590
43594
  return;
43591
43595
  }
43592
43596
  const editedCell = this.currentEditedCell;
@@ -51416,9 +51420,9 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
51416
51420
  allSheetsMatches = [];
51417
51421
  activeSheetMatches = [];
51418
51422
  specificRangeMatches = [];
51423
+ selectedMatchPosition = null;
51419
51424
  currentSearchRegex = null;
51420
51425
  initialShowFormulaState;
51421
- preserveSelectedMatchIndex = false;
51422
51426
  irreplaceableMatchCount = 0;
51423
51427
  isSearchDirty = false;
51424
51428
  shouldFinalizeUpdateSelection = false;
@@ -51540,7 +51544,10 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
51540
51544
  */
51541
51545
  _updateSearch(toSearch, searchOptions) {
51542
51546
  this.searchOptions = searchOptions;
51543
- if (toSearch !== this.toSearch) this.selectedMatchIndex = null;
51547
+ if (toSearch !== this.toSearch) {
51548
+ this.selectedMatchIndex = null;
51549
+ this.selectedMatchPosition = null;
51550
+ }
51544
51551
  this.toSearch = toSearch;
51545
51552
  this.currentSearchRegex = getSearchRegex(this.toSearch, this.searchOptions);
51546
51553
  this.refreshSearch({
@@ -51552,8 +51559,14 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
51552
51559
  * refresh the matches according to the current search options
51553
51560
  */
51554
51561
  refreshSearch(options) {
51555
- if (!this.preserveSelectedMatchIndex) this.selectedMatchIndex = null;
51556
51562
  this.findMatches();
51563
+ if (this.selectedMatchPosition) if (this.selectedMatchPosition.sheetId !== this.getters.getActiveSheetId()) {
51564
+ this.selectedMatchIndex = null;
51565
+ this.selectedMatchPosition = null;
51566
+ } else {
51567
+ const index = this.searchMatches.findIndex((match) => match.sheetId === this.selectedMatchPosition?.sheetId && match.col === this.selectedMatchPosition?.col && match.row === this.selectedMatchPosition?.row);
51568
+ if (index !== -1) this.selectedMatchIndex = index;
51569
+ }
51557
51570
  this.selectNextCell(0, options);
51558
51571
  }
51559
51572
  getSheetsInSearchOrder() {
@@ -51621,6 +51634,7 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
51621
51634
  const matches = this.searchMatches;
51622
51635
  if (!matches.length) {
51623
51636
  this.selectedMatchIndex = null;
51637
+ this.selectedMatchPosition = null;
51624
51638
  return;
51625
51639
  }
51626
51640
  let nextIndex;
@@ -51634,14 +51648,13 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
51634
51648
  } else nextIndex = this.selectedMatchIndex + indexChange;
51635
51649
  nextIndex = (nextIndex + matches.length) % matches.length;
51636
51650
  this.selectedMatchIndex = nextIndex;
51651
+ this.selectedMatchPosition = matches[this.selectedMatchIndex];
51637
51652
  const selectedMatch = matches[nextIndex];
51638
51653
  if (options.jumpToMatchSheet && this.getters.getActiveSheetId() !== selectedMatch.sheetId) {
51639
- this.preserveSelectedMatchIndex = true;
51640
51654
  this.model.dispatch("ACTIVATE_SHEET", {
51641
51655
  sheetIdFrom: this.getters.getActiveSheetId(),
51642
51656
  sheetIdTo: selectedMatch.sheetId
51643
51657
  });
51644
- this.preserveSelectedMatchIndex = false;
51645
51658
  this.isSearchDirty = false;
51646
51659
  }
51647
51660
  this.model.selection.getBackToDefault();
@@ -51652,7 +51665,6 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
51652
51665
  */
51653
51666
  replace() {
51654
51667
  if (this.selectedMatchIndex === null) return;
51655
- this.preserveSelectedMatchIndex = true;
51656
51668
  this.shouldFinalizeUpdateSelection = true;
51657
51669
  this.model.dispatch("REPLACE_SEARCH", {
51658
51670
  searchString: this.toSearch,
@@ -51660,7 +51672,6 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
51660
51672
  matches: [this.searchMatches[this.selectedMatchIndex]],
51661
51673
  searchOptions: this.searchOptions
51662
51674
  });
51663
- this.preserveSelectedMatchIndex = false;
51664
51675
  }
51665
51676
  /**
51666
51677
  * Apply the replace function to all the matches one time.
@@ -63096,7 +63107,7 @@ iconsOnCellRegistry.add("pivot_collapse", (getters, position) => {
63096
63107
  const definition = getters.getPivotCoreDefinition(pivotId);
63097
63108
  const isDashboard = getters.isDashboard();
63098
63109
  const fields = pivotCell.dimension === "COL" ? definition.columns : definition.rows;
63099
- const hasIcon = !isDashboard && pivotCell.domain.length !== fields.length;
63110
+ const hasIcon = !isDashboard && !getters.shouldShowFormulas() && pivotCell.domain.length !== fields.length;
63100
63111
  const isCollapsed = (definition.collapsedDomains?.[pivotCell.dimension] ?? []).some((domain) => deepEquals(domain, pivotCell.domain));
63101
63112
  const indent = pivotCell.dimension === "ROW" ? (pivotCell.domain.length - 1) * 15 : 0;
63102
63113
  return {
@@ -64048,9 +64059,11 @@ var PivotUIPlugin = class extends CoreViewPlugin {
64048
64059
  this.refreshPivot(cmd.id);
64049
64060
  break;
64050
64061
  case "ADD_PIVOT":
64062
+ this.unusedPivots?.push(cmd.pivotId);
64051
64063
  this.setupPivot(cmd.pivotId);
64052
64064
  break;
64053
64065
  case "DUPLICATE_PIVOT":
64066
+ this.unusedPivots?.push(cmd.newPivotId);
64054
64067
  this.setupPivot(cmd.newPivotId);
64055
64068
  break;
64056
64069
  case "UPDATE_PIVOT":
@@ -64250,8 +64263,8 @@ var PivotUIPlugin = class extends CoreViewPlugin {
64250
64263
  }
64251
64264
  }
64252
64265
  for (const pivotId of this.getters.getPivotIds()) {
64253
- const pivot = this.getters.getPivot(pivotId);
64254
- for (const measure of pivot.definition.measures) if (measure.computedBy) {
64266
+ const pivot = this.getters.getPivotCoreDefinition(pivotId);
64267
+ for (const measure of pivot.measures) if (measure.computedBy) {
64255
64268
  const { sheetId } = measure.computedBy;
64256
64269
  const formula = this.getters.getMeasureCompiledFormula(pivotId, measure);
64257
64270
  const relatedPivotIds = this.getPivotIdsFromFormula(sheetId, formula);
@@ -67459,7 +67472,8 @@ const invalidateTableStyleCommandsSet = new Set([
67459
67472
  "REMOVE_TABLE",
67460
67473
  "RESIZE_TABLE",
67461
67474
  "CREATE_TABLE_STYLE",
67462
- "REMOVE_TABLE_STYLE"
67475
+ "REMOVE_TABLE_STYLE",
67476
+ "DELETE_CONTENT"
67463
67477
  ]);
67464
67478
  function doesCommandInvalidatesTableStyle(cmd) {
67465
67479
  return invalidateTableStyleCommandsSet.has(cmd.type);
@@ -76849,6 +76863,11 @@ function lineAttributes(params) {
76849
76863
  `;
76850
76864
  }
76851
76865
  function insertText(text, fontColor = "000000", fontsize = 16, style = {}) {
76866
+ const textProperties = [
76867
+ ["b", style.bold ? "1" : "0"],
76868
+ ["i", style.italic ? "1" : "0"],
76869
+ ["sz", fontsize * 100]
76870
+ ];
76852
76871
  return escapeXml`
76853
76872
  <c:tx>
76854
76873
  <c:rich>
@@ -76856,13 +76875,13 @@ function insertText(text, fontColor = "000000", fontsize = 16, style = {}) {
76856
76875
  <a:lstStyle />
76857
76876
  <a:p>
76858
76877
  <a:pPr lvl="0">
76859
- <a:defRPr b="${style?.bold ? 1 : 0}" i="${style?.italic ? 1 : 0}">
76878
+ <a:defRPr ${formatAttributes(textProperties)}>
76860
76879
  ${solidFill(fontColor)}
76861
76880
  <a:latin typeface="+mn-lt"/>
76862
76881
  </a:defRPr>
76863
76882
  </a:pPr>
76864
76883
  <a:r> <!-- Runs -->
76865
- <a:rPr b="${style?.bold ? 1 : 0}" i="${style?.italic ? 1 : 0}" sz="${fontsize * 100}"/>
76884
+ <a:rPr ${formatAttributes(textProperties)}/>
76866
76885
  <a:t>${text}</a:t>
76867
76886
  </a:r>
76868
76887
  </a:p>
@@ -79559,6 +79578,6 @@ exports.stores = stores;
79559
79578
  exports.tokenColors = tokenColors;
79560
79579
  exports.tokenize = tokenize;
79561
79580
 
79562
- __info__.version = "19.0.36";
79563
- __info__.date = "2026-05-27T05:57:35.932Z";
79564
- __info__.hash = "3f73c94";
79581
+ __info__.version = "19.0.38";
79582
+ __info__.date = "2026-06-17T08:50:59.627Z";
79583
+ __info__.hash = "f469250";
@@ -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 19.0.36
6
- * @date 2026-05-27T05:57:37.639Z
7
- * @hash 3f73c94
5
+ * @version 19.0.38
6
+ * @date 2026-06-17T08:51:01.002Z
7
+ * @hash f469250
8
8
  */
9
9
  /* Originates from src/components/top_bar/top_bar.scss */
10
10
  @media (max-width: 1200px) {
@@ -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 19.0.36
6
- * @date 2026-05-27T05:57:35.932Z
7
- * @hash 3f73c94
5
+ * @version 19.0.38
6
+ * @date 2026-06-17T08:50:59.627Z
7
+ * @hash f469250
8
8
  */
9
9
 
10
10
  import { App, Component, blockDom, markRaw, onMounted, onPatched, onWillPatch, onWillStart, onWillUnmount, onWillUpdateProps, status, toRaw, useChildSubEnv, useComponent, useEffect, useEnv, useExternalListener, useRef, useState, useSubEnv, xml } from "@odoo/owl";
@@ -3472,6 +3472,7 @@ function emptyDataErrorMessage(argName) {
3472
3472
  //#endregion
3473
3473
  //#region src/helpers/format/format_tokenizer.ts
3474
3474
  function tokenizeFormat(str) {
3475
+ str = str.replace(/\s/g, " ");
3475
3476
  const chars = new TokenizingChars(str);
3476
3477
  const result = [];
3477
3478
  let currentFormatPart = [];
@@ -39289,11 +39290,10 @@ const INSERT_TABLE = (env) => {
39289
39290
  if (interactiveCreateTable(env, env.model.getters.getActiveSheetId()).isSuccessful) env.openSidePanel("TableSidePanel", {});
39290
39291
  };
39291
39292
  const DELETE_SELECTED_TABLE = (env) => {
39292
- const position = env.model.getters.getActivePosition();
39293
- const table = env.model.getters.getTable(position);
39293
+ const table = env.model.getters.getFirstTableInSelection();
39294
39294
  if (!table) return;
39295
39295
  env.model.dispatch("REMOVE_TABLE", {
39296
- sheetId: position.sheetId,
39296
+ sheetId: env.model.getters.getActiveSheetId(),
39297
39297
  target: [table.range.zone]
39298
39298
  });
39299
39299
  };
@@ -43584,8 +43584,12 @@ var CellComposerStore = class extends AbstractComposerStore {
43584
43584
  }
43585
43585
  stopEdition(direction) {
43586
43586
  if (this.canStopEdition()) {
43587
+ const { col, row } = this.currentEditedCell;
43587
43588
  this._stopEdition();
43588
- if (direction) this.model.selection.moveAnchorCell(direction, 1);
43589
+ if (direction) {
43590
+ this.model.selection.selectCell(col, row);
43591
+ this.model.selection.moveAnchorCell(direction, 1);
43592
+ }
43589
43593
  return;
43590
43594
  }
43591
43595
  const editedCell = this.currentEditedCell;
@@ -51415,9 +51419,9 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
51415
51419
  allSheetsMatches = [];
51416
51420
  activeSheetMatches = [];
51417
51421
  specificRangeMatches = [];
51422
+ selectedMatchPosition = null;
51418
51423
  currentSearchRegex = null;
51419
51424
  initialShowFormulaState;
51420
- preserveSelectedMatchIndex = false;
51421
51425
  irreplaceableMatchCount = 0;
51422
51426
  isSearchDirty = false;
51423
51427
  shouldFinalizeUpdateSelection = false;
@@ -51539,7 +51543,10 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
51539
51543
  */
51540
51544
  _updateSearch(toSearch, searchOptions) {
51541
51545
  this.searchOptions = searchOptions;
51542
- if (toSearch !== this.toSearch) this.selectedMatchIndex = null;
51546
+ if (toSearch !== this.toSearch) {
51547
+ this.selectedMatchIndex = null;
51548
+ this.selectedMatchPosition = null;
51549
+ }
51543
51550
  this.toSearch = toSearch;
51544
51551
  this.currentSearchRegex = getSearchRegex(this.toSearch, this.searchOptions);
51545
51552
  this.refreshSearch({
@@ -51551,8 +51558,14 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
51551
51558
  * refresh the matches according to the current search options
51552
51559
  */
51553
51560
  refreshSearch(options) {
51554
- if (!this.preserveSelectedMatchIndex) this.selectedMatchIndex = null;
51555
51561
  this.findMatches();
51562
+ if (this.selectedMatchPosition) if (this.selectedMatchPosition.sheetId !== this.getters.getActiveSheetId()) {
51563
+ this.selectedMatchIndex = null;
51564
+ this.selectedMatchPosition = null;
51565
+ } else {
51566
+ const index = this.searchMatches.findIndex((match) => match.sheetId === this.selectedMatchPosition?.sheetId && match.col === this.selectedMatchPosition?.col && match.row === this.selectedMatchPosition?.row);
51567
+ if (index !== -1) this.selectedMatchIndex = index;
51568
+ }
51556
51569
  this.selectNextCell(0, options);
51557
51570
  }
51558
51571
  getSheetsInSearchOrder() {
@@ -51620,6 +51633,7 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
51620
51633
  const matches = this.searchMatches;
51621
51634
  if (!matches.length) {
51622
51635
  this.selectedMatchIndex = null;
51636
+ this.selectedMatchPosition = null;
51623
51637
  return;
51624
51638
  }
51625
51639
  let nextIndex;
@@ -51633,14 +51647,13 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
51633
51647
  } else nextIndex = this.selectedMatchIndex + indexChange;
51634
51648
  nextIndex = (nextIndex + matches.length) % matches.length;
51635
51649
  this.selectedMatchIndex = nextIndex;
51650
+ this.selectedMatchPosition = matches[this.selectedMatchIndex];
51636
51651
  const selectedMatch = matches[nextIndex];
51637
51652
  if (options.jumpToMatchSheet && this.getters.getActiveSheetId() !== selectedMatch.sheetId) {
51638
- this.preserveSelectedMatchIndex = true;
51639
51653
  this.model.dispatch("ACTIVATE_SHEET", {
51640
51654
  sheetIdFrom: this.getters.getActiveSheetId(),
51641
51655
  sheetIdTo: selectedMatch.sheetId
51642
51656
  });
51643
- this.preserveSelectedMatchIndex = false;
51644
51657
  this.isSearchDirty = false;
51645
51658
  }
51646
51659
  this.model.selection.getBackToDefault();
@@ -51651,7 +51664,6 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
51651
51664
  */
51652
51665
  replace() {
51653
51666
  if (this.selectedMatchIndex === null) return;
51654
- this.preserveSelectedMatchIndex = true;
51655
51667
  this.shouldFinalizeUpdateSelection = true;
51656
51668
  this.model.dispatch("REPLACE_SEARCH", {
51657
51669
  searchString: this.toSearch,
@@ -51659,7 +51671,6 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
51659
51671
  matches: [this.searchMatches[this.selectedMatchIndex]],
51660
51672
  searchOptions: this.searchOptions
51661
51673
  });
51662
- this.preserveSelectedMatchIndex = false;
51663
51674
  }
51664
51675
  /**
51665
51676
  * Apply the replace function to all the matches one time.
@@ -62911,7 +62922,7 @@ iconsOnCellRegistry.add("pivot_collapse", (getters, position) => {
62911
62922
  const definition = getters.getPivotCoreDefinition(pivotId);
62912
62923
  const isDashboard = getters.isDashboard();
62913
62924
  const fields = pivotCell.dimension === "COL" ? definition.columns : definition.rows;
62914
- const hasIcon = !isDashboard && pivotCell.domain.length !== fields.length;
62925
+ const hasIcon = !isDashboard && !getters.shouldShowFormulas() && pivotCell.domain.length !== fields.length;
62915
62926
  const isCollapsed = (definition.collapsedDomains?.[pivotCell.dimension] ?? []).some((domain) => deepEquals(domain, pivotCell.domain));
62916
62927
  const indent = pivotCell.dimension === "ROW" ? (pivotCell.domain.length - 1) * 15 : 0;
62917
62928
  return {
@@ -63863,9 +63874,11 @@ var PivotUIPlugin = class extends CoreViewPlugin {
63863
63874
  this.refreshPivot(cmd.id);
63864
63875
  break;
63865
63876
  case "ADD_PIVOT":
63877
+ this.unusedPivots?.push(cmd.pivotId);
63866
63878
  this.setupPivot(cmd.pivotId);
63867
63879
  break;
63868
63880
  case "DUPLICATE_PIVOT":
63881
+ this.unusedPivots?.push(cmd.newPivotId);
63869
63882
  this.setupPivot(cmd.newPivotId);
63870
63883
  break;
63871
63884
  case "UPDATE_PIVOT":
@@ -64065,8 +64078,8 @@ var PivotUIPlugin = class extends CoreViewPlugin {
64065
64078
  }
64066
64079
  }
64067
64080
  for (const pivotId of this.getters.getPivotIds()) {
64068
- const pivot = this.getters.getPivot(pivotId);
64069
- for (const measure of pivot.definition.measures) if (measure.computedBy) {
64081
+ const pivot = this.getters.getPivotCoreDefinition(pivotId);
64082
+ for (const measure of pivot.measures) if (measure.computedBy) {
64070
64083
  const { sheetId } = measure.computedBy;
64071
64084
  const formula = this.getters.getMeasureCompiledFormula(pivotId, measure);
64072
64085
  const relatedPivotIds = this.getPivotIdsFromFormula(sheetId, formula);
@@ -67274,7 +67287,8 @@ const invalidateTableStyleCommandsSet = new Set([
67274
67287
  "REMOVE_TABLE",
67275
67288
  "RESIZE_TABLE",
67276
67289
  "CREATE_TABLE_STYLE",
67277
- "REMOVE_TABLE_STYLE"
67290
+ "REMOVE_TABLE_STYLE",
67291
+ "DELETE_CONTENT"
67278
67292
  ]);
67279
67293
  function doesCommandInvalidatesTableStyle(cmd) {
67280
67294
  return invalidateTableStyleCommandsSet.has(cmd.type);
@@ -76664,6 +76678,11 @@ function lineAttributes(params) {
76664
76678
  `;
76665
76679
  }
76666
76680
  function insertText(text, fontColor = "000000", fontsize = 16, style = {}) {
76681
+ const textProperties = [
76682
+ ["b", style.bold ? "1" : "0"],
76683
+ ["i", style.italic ? "1" : "0"],
76684
+ ["sz", fontsize * 100]
76685
+ ];
76667
76686
  return escapeXml`
76668
76687
  <c:tx>
76669
76688
  <c:rich>
@@ -76671,13 +76690,13 @@ function insertText(text, fontColor = "000000", fontsize = 16, style = {}) {
76671
76690
  <a:lstStyle />
76672
76691
  <a:p>
76673
76692
  <a:pPr lvl="0">
76674
- <a:defRPr b="${style?.bold ? 1 : 0}" i="${style?.italic ? 1 : 0}">
76693
+ <a:defRPr ${formatAttributes(textProperties)}>
76675
76694
  ${solidFill(fontColor)}
76676
76695
  <a:latin typeface="+mn-lt"/>
76677
76696
  </a:defRPr>
76678
76697
  </a:pPr>
76679
76698
  <a:r> <!-- Runs -->
76680
- <a:rPr b="${style?.bold ? 1 : 0}" i="${style?.italic ? 1 : 0}" sz="${fontsize * 100}"/>
76699
+ <a:rPr ${formatAttributes(textProperties)}/>
76681
76700
  <a:t>${text}</a:t>
76682
76701
  </a:r>
76683
76702
  </a:p>
@@ -79323,6 +79342,6 @@ const chartHelpers = {
79323
79342
  //#endregion
79324
79343
  export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, ClientDisconnectedError, CommandResult, CorePlugin, CoreViewPlugin, DispatchResult, EvaluationError, LocalTransportService, Model, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, SpreadsheetPivotTable, UIPlugin, __info__, addFunction, addRenderingLayer, astToFormula, chartHelpers, compile, compileTokens, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, getCaretDownSvg, getCaretUpSvg, helpers, hooks, invalidateCFEvaluationCommands, invalidateChartEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
79325
79344
 
79326
- __info__.version = "19.0.36";
79327
- __info__.date = "2026-05-27T05:57:35.932Z";
79328
- __info__.hash = "3f73c94";
79345
+ __info__.version = "19.0.38";
79346
+ __info__.date = "2026-06-17T08:50:59.627Z";
79347
+ __info__.hash = "f469250";
@@ -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 19.0.36
6
- * @date 2026-05-27T05:57:35.932Z
7
- * @hash 3f73c94
5
+ * @version 19.0.38
6
+ * @date 2026-06-17T08:50:59.627Z
7
+ * @hash f469250
8
8
  */
9
9
 
10
10
  (function(exports, _odoo_owl) {
@@ -3474,6 +3474,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3474
3474
  //#endregion
3475
3475
  //#region src/helpers/format/format_tokenizer.ts
3476
3476
  function tokenizeFormat(str) {
3477
+ str = str.replace(/\s/g, " ");
3477
3478
  const chars = new TokenizingChars(str);
3478
3479
  const result = [];
3479
3480
  let currentFormatPart = [];
@@ -39291,11 +39292,10 @@ stores.inject(MyMetaStore, storeInstance);
39291
39292
  if (interactiveCreateTable(env, env.model.getters.getActiveSheetId()).isSuccessful) env.openSidePanel("TableSidePanel", {});
39292
39293
  };
39293
39294
  const DELETE_SELECTED_TABLE = (env) => {
39294
- const position = env.model.getters.getActivePosition();
39295
- const table = env.model.getters.getTable(position);
39295
+ const table = env.model.getters.getFirstTableInSelection();
39296
39296
  if (!table) return;
39297
39297
  env.model.dispatch("REMOVE_TABLE", {
39298
- sheetId: position.sheetId,
39298
+ sheetId: env.model.getters.getActiveSheetId(),
39299
39299
  target: [table.range.zone]
39300
39300
  });
39301
39301
  };
@@ -43586,8 +43586,12 @@ stores.inject(MyMetaStore, storeInstance);
43586
43586
  }
43587
43587
  stopEdition(direction) {
43588
43588
  if (this.canStopEdition()) {
43589
+ const { col, row } = this.currentEditedCell;
43589
43590
  this._stopEdition();
43590
- if (direction) this.model.selection.moveAnchorCell(direction, 1);
43591
+ if (direction) {
43592
+ this.model.selection.selectCell(col, row);
43593
+ this.model.selection.moveAnchorCell(direction, 1);
43594
+ }
43591
43595
  return;
43592
43596
  }
43593
43597
  const editedCell = this.currentEditedCell;
@@ -51417,9 +51421,9 @@ stores.inject(MyMetaStore, storeInstance);
51417
51421
  allSheetsMatches = [];
51418
51422
  activeSheetMatches = [];
51419
51423
  specificRangeMatches = [];
51424
+ selectedMatchPosition = null;
51420
51425
  currentSearchRegex = null;
51421
51426
  initialShowFormulaState;
51422
- preserveSelectedMatchIndex = false;
51423
51427
  irreplaceableMatchCount = 0;
51424
51428
  isSearchDirty = false;
51425
51429
  shouldFinalizeUpdateSelection = false;
@@ -51541,7 +51545,10 @@ stores.inject(MyMetaStore, storeInstance);
51541
51545
  */
51542
51546
  _updateSearch(toSearch, searchOptions) {
51543
51547
  this.searchOptions = searchOptions;
51544
- if (toSearch !== this.toSearch) this.selectedMatchIndex = null;
51548
+ if (toSearch !== this.toSearch) {
51549
+ this.selectedMatchIndex = null;
51550
+ this.selectedMatchPosition = null;
51551
+ }
51545
51552
  this.toSearch = toSearch;
51546
51553
  this.currentSearchRegex = getSearchRegex(this.toSearch, this.searchOptions);
51547
51554
  this.refreshSearch({
@@ -51553,8 +51560,14 @@ stores.inject(MyMetaStore, storeInstance);
51553
51560
  * refresh the matches according to the current search options
51554
51561
  */
51555
51562
  refreshSearch(options) {
51556
- if (!this.preserveSelectedMatchIndex) this.selectedMatchIndex = null;
51557
51563
  this.findMatches();
51564
+ if (this.selectedMatchPosition) if (this.selectedMatchPosition.sheetId !== this.getters.getActiveSheetId()) {
51565
+ this.selectedMatchIndex = null;
51566
+ this.selectedMatchPosition = null;
51567
+ } else {
51568
+ const index = this.searchMatches.findIndex((match) => match.sheetId === this.selectedMatchPosition?.sheetId && match.col === this.selectedMatchPosition?.col && match.row === this.selectedMatchPosition?.row);
51569
+ if (index !== -1) this.selectedMatchIndex = index;
51570
+ }
51558
51571
  this.selectNextCell(0, options);
51559
51572
  }
51560
51573
  getSheetsInSearchOrder() {
@@ -51622,6 +51635,7 @@ stores.inject(MyMetaStore, storeInstance);
51622
51635
  const matches = this.searchMatches;
51623
51636
  if (!matches.length) {
51624
51637
  this.selectedMatchIndex = null;
51638
+ this.selectedMatchPosition = null;
51625
51639
  return;
51626
51640
  }
51627
51641
  let nextIndex;
@@ -51635,14 +51649,13 @@ stores.inject(MyMetaStore, storeInstance);
51635
51649
  } else nextIndex = this.selectedMatchIndex + indexChange;
51636
51650
  nextIndex = (nextIndex + matches.length) % matches.length;
51637
51651
  this.selectedMatchIndex = nextIndex;
51652
+ this.selectedMatchPosition = matches[this.selectedMatchIndex];
51638
51653
  const selectedMatch = matches[nextIndex];
51639
51654
  if (options.jumpToMatchSheet && this.getters.getActiveSheetId() !== selectedMatch.sheetId) {
51640
- this.preserveSelectedMatchIndex = true;
51641
51655
  this.model.dispatch("ACTIVATE_SHEET", {
51642
51656
  sheetIdFrom: this.getters.getActiveSheetId(),
51643
51657
  sheetIdTo: selectedMatch.sheetId
51644
51658
  });
51645
- this.preserveSelectedMatchIndex = false;
51646
51659
  this.isSearchDirty = false;
51647
51660
  }
51648
51661
  this.model.selection.getBackToDefault();
@@ -51653,7 +51666,6 @@ stores.inject(MyMetaStore, storeInstance);
51653
51666
  */
51654
51667
  replace() {
51655
51668
  if (this.selectedMatchIndex === null) return;
51656
- this.preserveSelectedMatchIndex = true;
51657
51669
  this.shouldFinalizeUpdateSelection = true;
51658
51670
  this.model.dispatch("REPLACE_SEARCH", {
51659
51671
  searchString: this.toSearch,
@@ -51661,7 +51673,6 @@ stores.inject(MyMetaStore, storeInstance);
51661
51673
  matches: [this.searchMatches[this.selectedMatchIndex]],
51662
51674
  searchOptions: this.searchOptions
51663
51675
  });
51664
- this.preserveSelectedMatchIndex = false;
51665
51676
  }
51666
51677
  /**
51667
51678
  * Apply the replace function to all the matches one time.
@@ -62913,7 +62924,7 @@ stores.inject(MyMetaStore, storeInstance);
62913
62924
  const definition = getters.getPivotCoreDefinition(pivotId);
62914
62925
  const isDashboard = getters.isDashboard();
62915
62926
  const fields = pivotCell.dimension === "COL" ? definition.columns : definition.rows;
62916
- const hasIcon = !isDashboard && pivotCell.domain.length !== fields.length;
62927
+ const hasIcon = !isDashboard && !getters.shouldShowFormulas() && pivotCell.domain.length !== fields.length;
62917
62928
  const isCollapsed = (definition.collapsedDomains?.[pivotCell.dimension] ?? []).some((domain) => deepEquals(domain, pivotCell.domain));
62918
62929
  const indent = pivotCell.dimension === "ROW" ? (pivotCell.domain.length - 1) * 15 : 0;
62919
62930
  return {
@@ -63865,9 +63876,11 @@ stores.inject(MyMetaStore, storeInstance);
63865
63876
  this.refreshPivot(cmd.id);
63866
63877
  break;
63867
63878
  case "ADD_PIVOT":
63879
+ this.unusedPivots?.push(cmd.pivotId);
63868
63880
  this.setupPivot(cmd.pivotId);
63869
63881
  break;
63870
63882
  case "DUPLICATE_PIVOT":
63883
+ this.unusedPivots?.push(cmd.newPivotId);
63871
63884
  this.setupPivot(cmd.newPivotId);
63872
63885
  break;
63873
63886
  case "UPDATE_PIVOT":
@@ -64067,8 +64080,8 @@ stores.inject(MyMetaStore, storeInstance);
64067
64080
  }
64068
64081
  }
64069
64082
  for (const pivotId of this.getters.getPivotIds()) {
64070
- const pivot = this.getters.getPivot(pivotId);
64071
- for (const measure of pivot.definition.measures) if (measure.computedBy) {
64083
+ const pivot = this.getters.getPivotCoreDefinition(pivotId);
64084
+ for (const measure of pivot.measures) if (measure.computedBy) {
64072
64085
  const { sheetId } = measure.computedBy;
64073
64086
  const formula = this.getters.getMeasureCompiledFormula(pivotId, measure);
64074
64087
  const relatedPivotIds = this.getPivotIdsFromFormula(sheetId, formula);
@@ -67276,7 +67289,8 @@ stores.inject(MyMetaStore, storeInstance);
67276
67289
  "REMOVE_TABLE",
67277
67290
  "RESIZE_TABLE",
67278
67291
  "CREATE_TABLE_STYLE",
67279
- "REMOVE_TABLE_STYLE"
67292
+ "REMOVE_TABLE_STYLE",
67293
+ "DELETE_CONTENT"
67280
67294
  ]);
67281
67295
  function doesCommandInvalidatesTableStyle(cmd) {
67282
67296
  return invalidateTableStyleCommandsSet.has(cmd.type);
@@ -76666,6 +76680,11 @@ stores.inject(MyMetaStore, storeInstance);
76666
76680
  `;
76667
76681
  }
76668
76682
  function insertText(text, fontColor = "000000", fontsize = 16, style = {}) {
76683
+ const textProperties = [
76684
+ ["b", style.bold ? "1" : "0"],
76685
+ ["i", style.italic ? "1" : "0"],
76686
+ ["sz", fontsize * 100]
76687
+ ];
76669
76688
  return escapeXml`
76670
76689
  <c:tx>
76671
76690
  <c:rich>
@@ -76673,13 +76692,13 @@ stores.inject(MyMetaStore, storeInstance);
76673
76692
  <a:lstStyle />
76674
76693
  <a:p>
76675
76694
  <a:pPr lvl="0">
76676
- <a:defRPr b="${style?.bold ? 1 : 0}" i="${style?.italic ? 1 : 0}">
76695
+ <a:defRPr ${formatAttributes(textProperties)}>
76677
76696
  ${solidFill(fontColor)}
76678
76697
  <a:latin typeface="+mn-lt"/>
76679
76698
  </a:defRPr>
76680
76699
  </a:pPr>
76681
76700
  <a:r> <!-- Runs -->
76682
- <a:rPr b="${style?.bold ? 1 : 0}" i="${style?.italic ? 1 : 0}" sz="${fontsize * 100}"/>
76701
+ <a:rPr ${formatAttributes(textProperties)}/>
76683
76702
  <a:t>${text}</a:t>
76684
76703
  </a:r>
76685
76704
  </a:p>
@@ -79376,8 +79395,8 @@ exports.stores = stores;
79376
79395
  exports.tokenColors = tokenColors;
79377
79396
  exports.tokenize = tokenize;
79378
79397
 
79379
- __info__.version = "19.0.36";
79380
- __info__.date = "2026-05-27T05:57:35.932Z";
79381
- __info__.hash = "3f73c94";
79398
+ __info__.version = "19.0.38";
79399
+ __info__.date = "2026-06-17T08:50:59.627Z";
79400
+ __info__.hash = "f469250";
79382
79401
 
79383
79402
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);