@odoo/o-spreadsheet 19.0.8 → 19.0.10

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.8
6
- * @date 2025-10-30T12:25:04.355Z
7
- * @hash 559e4e5
5
+ * @version 19.0.10
6
+ * @date 2025-11-12T14:15:51.076Z
7
+ * @hash 18ac688
8
8
  */
9
9
 
10
10
  import { useEnv, useSubEnv, onWillUnmount, useComponent, status, Component, useRef, onMounted, useEffect, App, blockDom, useState, onPatched, useExternalListener, onWillUpdateProps, onWillStart, onWillPatch, xml, useChildSubEnv, markRaw, toRaw } from '@odoo/owl';
@@ -2499,7 +2499,10 @@ function isInside(col, row, zone) {
2499
2499
  * Check if a zone is inside another
2500
2500
  */
2501
2501
  function isZoneInside(smallZone, biggerZone) {
2502
- return isEqual(union(biggerZone, smallZone), biggerZone);
2502
+ return (smallZone.left >= biggerZone.left &&
2503
+ smallZone.right <= biggerZone.right &&
2504
+ smallZone.top >= biggerZone.top &&
2505
+ smallZone.bottom <= biggerZone.bottom);
2503
2506
  }
2504
2507
  function zoneToDimension(zone) {
2505
2508
  return {
@@ -6902,7 +6905,7 @@ function getRangeString(range, forSheetId, getSheetName, options = { useBoundedR
6902
6905
  let sheetName = "";
6903
6906
  if (prefixSheet) {
6904
6907
  if (range.invalidSheetName) {
6905
- sheetName = range.invalidSheetName;
6908
+ sheetName = getCanonicalSymbolName(range.invalidSheetName);
6906
6909
  }
6907
6910
  else {
6908
6911
  sheetName = getCanonicalSymbolName(getSheetName(range.sheetId));
@@ -24418,7 +24421,7 @@ let ScorecardChart$1 = class ScorecardChart extends AbstractChart {
24418
24421
  return {
24419
24422
  background: context.background,
24420
24423
  type: "scorecard",
24421
- keyValue: context.range ? context.range[0].dataRange : undefined,
24424
+ keyValue: context.range?.[0]?.dataRange,
24422
24425
  title: context.title || { text: "" },
24423
24426
  baselineMode: DEFAULT_SCORECARD_BASELINE_MODE,
24424
24427
  baselineColorUp: DEFAULT_SCORECARD_BASELINE_COLOR_UP,
@@ -29127,7 +29130,7 @@ class GaugeChart extends AbstractChart {
29127
29130
  background: context.background,
29128
29131
  title: context.title || { text: "" },
29129
29132
  type: "gauge",
29130
- dataRange: context.range ? context.range[0].dataRange : undefined,
29133
+ dataRange: context.range?.[0]?.dataRange,
29131
29134
  sectionRule: {
29132
29135
  colors: {
29133
29136
  lowerColor: DEFAULT_GAUGE_LOWER_COLOR,
@@ -31019,8 +31022,7 @@ function generateMasterChartConfig(chartJsConfig) {
31019
31022
  .filter((ds) => !isTrendLineAxis(ds["xAxisID"]))
31020
31023
  .map((ds) => ({
31021
31024
  ...ds,
31022
- pointRadius: 0,
31023
- showLine: true,
31025
+ pointRadius: ds.showLine === false ? 2 : 0, // Show points only for scatter plots
31024
31026
  })),
31025
31027
  },
31026
31028
  options: {
@@ -34131,7 +34133,7 @@ class ContentEditableHelper {
34131
34133
  else {
34132
34134
  text += NEWLINE;
34133
34135
  }
34134
- emptyParagraph = ["<br>", "<span><br></span>"].includes(current.value.innerHTML);
34136
+ emptyParagraph = isEmptyParagraph(current.value);
34135
34137
  continue;
34136
34138
  }
34137
34139
  if (!current.value.hasChildNodes()) {
@@ -34152,6 +34154,21 @@ function compareContentToSpanElement(content, node) {
34152
34154
  const sameContent = node.innerText === content.value;
34153
34155
  return sameColor && sameClass && sameContent;
34154
34156
  }
34157
+ const doc = new DOMParser();
34158
+ const brNode = doc.parseFromString("<br>", "text/html").body.firstChild;
34159
+ const spanBrNode = doc.parseFromString("<span><br></span>", "text/html").body.firstChild;
34160
+ function isEmptyParagraph(node) {
34161
+ if (node.childNodes.length > 1)
34162
+ return false;
34163
+ const node2 = node.firstChild?.cloneNode(true);
34164
+ if (!node2)
34165
+ return true;
34166
+ if (!(node2 instanceof Element))
34167
+ return false;
34168
+ node2.removeAttribute("class");
34169
+ node2.removeAttribute("style");
34170
+ return node2.isEqualNode(brNode) || node2.isEqualNode(spanBrNode) || false;
34171
+ }
34155
34172
 
34156
34173
  class FunctionDescriptionProvider extends Component {
34157
34174
  static template = "o-spreadsheet-FunctionDescriptionProvider";
@@ -35147,6 +35164,7 @@ class AbstractComposerStore extends SpreadsheetStore {
35147
35164
  this.highlightStore.register(this);
35148
35165
  this.onDispose(() => {
35149
35166
  this.highlightStore.unRegister(this);
35167
+ this._cancelEdition();
35150
35168
  });
35151
35169
  }
35152
35170
  handleEvent(event) {
@@ -52174,6 +52192,9 @@ class GridRenderer extends SpreadsheetStore {
52174
52192
  break;
52175
52193
  }
52176
52194
  }
52195
+ finalize() {
52196
+ this.zonesWithPreventedAnimationsInNextFrame = recomputeZones(this.zonesWithPreventedAnimationsInNextFrame);
52197
+ }
52177
52198
  get renderingLayers() {
52178
52199
  return ["Background", "Headers"];
52179
52200
  }
@@ -80471,6 +80492,7 @@ topbarMenuRegistry
80471
80492
  .add("file", {
80472
80493
  name: _t("File"),
80473
80494
  sequence: 10,
80495
+ isReadonlyAllowed: true,
80474
80496
  })
80475
80497
  .addChild("settings", ["file"], {
80476
80498
  name: _t("Settings"),
@@ -80485,6 +80507,7 @@ topbarMenuRegistry
80485
80507
  .add("edit", {
80486
80508
  name: _t("Edit"),
80487
80509
  sequence: 20,
80510
+ isReadonlyAllowed: true,
80488
80511
  })
80489
80512
  .addChild("undo", ["edit"], {
80490
80513
  ...undo,
@@ -80569,6 +80592,7 @@ topbarMenuRegistry
80569
80592
  .add("view", {
80570
80593
  name: _t("View"),
80571
80594
  sequence: 30,
80595
+ isReadonlyAllowed: true,
80572
80596
  })
80573
80597
  .addChild("unfreeze_panes", ["view"], {
80574
80598
  ...unFreezePane,
@@ -80660,6 +80684,7 @@ topbarMenuRegistry
80660
80684
  .add("insert", {
80661
80685
  name: _t("Insert"),
80662
80686
  sequence: 40,
80687
+ isReadonlyAllowed: true,
80663
80688
  })
80664
80689
  .addChild("insert_row", ["insert"], {
80665
80690
  ...insertRow,
@@ -80771,7 +80796,11 @@ topbarMenuRegistry
80771
80796
  // ---------------------------------------------------------------------
80772
80797
  // FORMAT MENU ITEMS
80773
80798
  // ---------------------------------------------------------------------
80774
- .add("format", { name: _t("Format"), sequence: 50 })
80799
+ .add("format", {
80800
+ name: _t("Format"),
80801
+ sequence: 50,
80802
+ isReadonlyAllowed: true,
80803
+ })
80775
80804
  .addChild("format_number", ["format"], {
80776
80805
  ...formatNumberMenuItemSpec,
80777
80806
  name: _t("Number"),
@@ -80863,6 +80892,7 @@ topbarMenuRegistry
80863
80892
  .add("data", {
80864
80893
  name: _t("Data"),
80865
80894
  sequence: 60,
80895
+ isReadonlyAllowed: true,
80866
80896
  })
80867
80897
  .addChild("sort_range", ["data"], {
80868
80898
  ...sortRange,
@@ -88902,6 +88932,6 @@ const chartHelpers = { ...CHART_HELPERS, ...CHART_RUNTIME_HELPERS };
88902
88932
  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 };
88903
88933
 
88904
88934
 
88905
- __info__.version = "19.0.8";
88906
- __info__.date = "2025-10-30T12:25:04.355Z";
88907
- __info__.hash = "559e4e5";
88935
+ __info__.version = "19.0.10";
88936
+ __info__.date = "2025-11-12T14:15:51.076Z";
88937
+ __info__.hash = "18ac688";
@@ -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.8
6
- * @date 2025-10-30T12:25:04.355Z
7
- * @hash 559e4e5
5
+ * @version 19.0.10
6
+ * @date 2025-11-12T14:15:51.076Z
7
+ * @hash 18ac688
8
8
  */
9
9
 
10
10
  (function (exports, owl) {
@@ -2500,7 +2500,10 @@
2500
2500
  * Check if a zone is inside another
2501
2501
  */
2502
2502
  function isZoneInside(smallZone, biggerZone) {
2503
- return isEqual(union(biggerZone, smallZone), biggerZone);
2503
+ return (smallZone.left >= biggerZone.left &&
2504
+ smallZone.right <= biggerZone.right &&
2505
+ smallZone.top >= biggerZone.top &&
2506
+ smallZone.bottom <= biggerZone.bottom);
2504
2507
  }
2505
2508
  function zoneToDimension(zone) {
2506
2509
  return {
@@ -6903,7 +6906,7 @@
6903
6906
  let sheetName = "";
6904
6907
  if (prefixSheet) {
6905
6908
  if (range.invalidSheetName) {
6906
- sheetName = range.invalidSheetName;
6909
+ sheetName = getCanonicalSymbolName(range.invalidSheetName);
6907
6910
  }
6908
6911
  else {
6909
6912
  sheetName = getCanonicalSymbolName(getSheetName(range.sheetId));
@@ -24419,7 +24422,7 @@ stores.inject(MyMetaStore, storeInstance);
24419
24422
  return {
24420
24423
  background: context.background,
24421
24424
  type: "scorecard",
24422
- keyValue: context.range ? context.range[0].dataRange : undefined,
24425
+ keyValue: context.range?.[0]?.dataRange,
24423
24426
  title: context.title || { text: "" },
24424
24427
  baselineMode: DEFAULT_SCORECARD_BASELINE_MODE,
24425
24428
  baselineColorUp: DEFAULT_SCORECARD_BASELINE_COLOR_UP,
@@ -29128,7 +29131,7 @@ stores.inject(MyMetaStore, storeInstance);
29128
29131
  background: context.background,
29129
29132
  title: context.title || { text: "" },
29130
29133
  type: "gauge",
29131
- dataRange: context.range ? context.range[0].dataRange : undefined,
29134
+ dataRange: context.range?.[0]?.dataRange,
29132
29135
  sectionRule: {
29133
29136
  colors: {
29134
29137
  lowerColor: DEFAULT_GAUGE_LOWER_COLOR,
@@ -31020,8 +31023,7 @@ stores.inject(MyMetaStore, storeInstance);
31020
31023
  .filter((ds) => !isTrendLineAxis(ds["xAxisID"]))
31021
31024
  .map((ds) => ({
31022
31025
  ...ds,
31023
- pointRadius: 0,
31024
- showLine: true,
31026
+ pointRadius: ds.showLine === false ? 2 : 0, // Show points only for scatter plots
31025
31027
  })),
31026
31028
  },
31027
31029
  options: {
@@ -34132,7 +34134,7 @@ stores.inject(MyMetaStore, storeInstance);
34132
34134
  else {
34133
34135
  text += NEWLINE;
34134
34136
  }
34135
- emptyParagraph = ["<br>", "<span><br></span>"].includes(current.value.innerHTML);
34137
+ emptyParagraph = isEmptyParagraph(current.value);
34136
34138
  continue;
34137
34139
  }
34138
34140
  if (!current.value.hasChildNodes()) {
@@ -34153,6 +34155,21 @@ stores.inject(MyMetaStore, storeInstance);
34153
34155
  const sameContent = node.innerText === content.value;
34154
34156
  return sameColor && sameClass && sameContent;
34155
34157
  }
34158
+ const doc = new DOMParser();
34159
+ const brNode = doc.parseFromString("<br>", "text/html").body.firstChild;
34160
+ const spanBrNode = doc.parseFromString("<span><br></span>", "text/html").body.firstChild;
34161
+ function isEmptyParagraph(node) {
34162
+ if (node.childNodes.length > 1)
34163
+ return false;
34164
+ const node2 = node.firstChild?.cloneNode(true);
34165
+ if (!node2)
34166
+ return true;
34167
+ if (!(node2 instanceof Element))
34168
+ return false;
34169
+ node2.removeAttribute("class");
34170
+ node2.removeAttribute("style");
34171
+ return node2.isEqualNode(brNode) || node2.isEqualNode(spanBrNode) || false;
34172
+ }
34156
34173
 
34157
34174
  class FunctionDescriptionProvider extends owl.Component {
34158
34175
  static template = "o-spreadsheet-FunctionDescriptionProvider";
@@ -35148,6 +35165,7 @@ stores.inject(MyMetaStore, storeInstance);
35148
35165
  this.highlightStore.register(this);
35149
35166
  this.onDispose(() => {
35150
35167
  this.highlightStore.unRegister(this);
35168
+ this._cancelEdition();
35151
35169
  });
35152
35170
  }
35153
35171
  handleEvent(event) {
@@ -52175,6 +52193,9 @@ stores.inject(MyMetaStore, storeInstance);
52175
52193
  break;
52176
52194
  }
52177
52195
  }
52196
+ finalize() {
52197
+ this.zonesWithPreventedAnimationsInNextFrame = recomputeZones(this.zonesWithPreventedAnimationsInNextFrame);
52198
+ }
52178
52199
  get renderingLayers() {
52179
52200
  return ["Background", "Headers"];
52180
52201
  }
@@ -80472,6 +80493,7 @@ stores.inject(MyMetaStore, storeInstance);
80472
80493
  .add("file", {
80473
80494
  name: _t("File"),
80474
80495
  sequence: 10,
80496
+ isReadonlyAllowed: true,
80475
80497
  })
80476
80498
  .addChild("settings", ["file"], {
80477
80499
  name: _t("Settings"),
@@ -80486,6 +80508,7 @@ stores.inject(MyMetaStore, storeInstance);
80486
80508
  .add("edit", {
80487
80509
  name: _t("Edit"),
80488
80510
  sequence: 20,
80511
+ isReadonlyAllowed: true,
80489
80512
  })
80490
80513
  .addChild("undo", ["edit"], {
80491
80514
  ...undo,
@@ -80570,6 +80593,7 @@ stores.inject(MyMetaStore, storeInstance);
80570
80593
  .add("view", {
80571
80594
  name: _t("View"),
80572
80595
  sequence: 30,
80596
+ isReadonlyAllowed: true,
80573
80597
  })
80574
80598
  .addChild("unfreeze_panes", ["view"], {
80575
80599
  ...unFreezePane,
@@ -80661,6 +80685,7 @@ stores.inject(MyMetaStore, storeInstance);
80661
80685
  .add("insert", {
80662
80686
  name: _t("Insert"),
80663
80687
  sequence: 40,
80688
+ isReadonlyAllowed: true,
80664
80689
  })
80665
80690
  .addChild("insert_row", ["insert"], {
80666
80691
  ...insertRow,
@@ -80772,7 +80797,11 @@ stores.inject(MyMetaStore, storeInstance);
80772
80797
  // ---------------------------------------------------------------------
80773
80798
  // FORMAT MENU ITEMS
80774
80799
  // ---------------------------------------------------------------------
80775
- .add("format", { name: _t("Format"), sequence: 50 })
80800
+ .add("format", {
80801
+ name: _t("Format"),
80802
+ sequence: 50,
80803
+ isReadonlyAllowed: true,
80804
+ })
80776
80805
  .addChild("format_number", ["format"], {
80777
80806
  ...formatNumberMenuItemSpec,
80778
80807
  name: _t("Number"),
@@ -80864,6 +80893,7 @@ stores.inject(MyMetaStore, storeInstance);
80864
80893
  .add("data", {
80865
80894
  name: _t("Data"),
80866
80895
  sequence: 60,
80896
+ isReadonlyAllowed: true,
80867
80897
  })
80868
80898
  .addChild("sort_range", ["data"], {
80869
80899
  ...sortRange,
@@ -88953,9 +88983,9 @@ stores.inject(MyMetaStore, storeInstance);
88953
88983
  exports.tokenize = tokenize;
88954
88984
 
88955
88985
 
88956
- __info__.version = "19.0.8";
88957
- __info__.date = "2025-10-30T12:25:04.355Z";
88958
- __info__.hash = "559e4e5";
88986
+ __info__.version = "19.0.10";
88987
+ __info__.date = "2025-11-12T14:15:51.076Z";
88988
+ __info__.hash = "18ac688";
88959
88989
 
88960
88990
 
88961
88991
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);