@odoo/o-spreadsheet 18.4.14 → 18.4.17

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.4.14
6
- * @date 2025-10-16T06:39:40.249Z
7
- * @hash bc55c40
5
+ * @version 18.4.17
6
+ * @date 2025-11-12T14:15:30.592Z
7
+ * @hash a8ebab8
8
8
  */
9
9
 
10
10
  'use strict';
@@ -5928,7 +5928,10 @@ function isInside(col, row, zone) {
5928
5928
  * Check if a zone is inside another
5929
5929
  */
5930
5930
  function isZoneInside(smallZone, biggerZone) {
5931
- return isEqual(union(biggerZone, smallZone), biggerZone);
5931
+ return (smallZone.left >= biggerZone.left &&
5932
+ smallZone.right <= biggerZone.right &&
5933
+ smallZone.top >= biggerZone.top &&
5934
+ smallZone.bottom <= biggerZone.bottom);
5932
5935
  }
5933
5936
  function zoneToDimension(zone) {
5934
5937
  return {
@@ -6489,7 +6492,7 @@ function getRangeString(range, forSheetId, getSheetName, options = { useBoundedR
6489
6492
  let sheetName = "";
6490
6493
  if (prefixSheet) {
6491
6494
  if (range.invalidSheetName) {
6492
- sheetName = range.invalidSheetName;
6495
+ sheetName = getCanonicalSymbolName(range.invalidSheetName);
6493
6496
  }
6494
6497
  else {
6495
6498
  sheetName = getCanonicalSymbolName(getSheetName(range.sheetId));
@@ -23107,7 +23110,7 @@ let ScorecardChart$1 = class ScorecardChart extends AbstractChart {
23107
23110
  return {
23108
23111
  background: context.background,
23109
23112
  type: "scorecard",
23110
- keyValue: context.range ? context.range[0].dataRange : undefined,
23113
+ keyValue: context.range?.[0]?.dataRange,
23111
23114
  title: context.title || { text: "" },
23112
23115
  baselineMode: DEFAULT_SCORECARD_BASELINE_MODE,
23113
23116
  baselineColorUp: DEFAULT_SCORECARD_BASELINE_COLOR_UP,
@@ -27428,7 +27431,7 @@ class GaugeChart extends AbstractChart {
27428
27431
  background: context.background,
27429
27432
  title: context.title || { text: "" },
27430
27433
  type: "gauge",
27431
- dataRange: context.range ? context.range[0].dataRange : undefined,
27434
+ dataRange: context.range?.[0]?.dataRange,
27432
27435
  sectionRule: {
27433
27436
  colors: {
27434
27437
  lowerColor: DEFAULT_GAUGE_LOWER_COLOR,
@@ -32235,7 +32238,7 @@ class ContentEditableHelper {
32235
32238
  else {
32236
32239
  text += NEWLINE;
32237
32240
  }
32238
- emptyParagraph = ["<br>", "<span><br></span>"].includes(current.value.innerHTML);
32241
+ emptyParagraph = isEmptyParagraph(current.value);
32239
32242
  continue;
32240
32243
  }
32241
32244
  if (!current.value.hasChildNodes()) {
@@ -32256,6 +32259,21 @@ function compareContentToSpanElement(content, node) {
32256
32259
  const sameContent = node.innerText === content.value;
32257
32260
  return sameColor && sameClass && sameContent;
32258
32261
  }
32262
+ const doc = new DOMParser();
32263
+ const brNode = doc.parseFromString("<br>", "text/html").body.firstChild;
32264
+ const spanBrNode = doc.parseFromString("<span><br></span>", "text/html").body.firstChild;
32265
+ function isEmptyParagraph(node) {
32266
+ if (node.childNodes.length > 1)
32267
+ return false;
32268
+ const node2 = node.firstChild?.cloneNode(true);
32269
+ if (!node2)
32270
+ return true;
32271
+ if (!(node2 instanceof Element))
32272
+ return false;
32273
+ node2.removeAttribute("class");
32274
+ node2.removeAttribute("style");
32275
+ return node2.isEqualNode(brNode) || node2.isEqualNode(spanBrNode) || false;
32276
+ }
32259
32277
 
32260
32278
  // -----------------------------------------------------------------------------
32261
32279
  // Formula Assistant component
@@ -32591,6 +32609,7 @@ class AbstractComposerStore extends SpreadsheetStore {
32591
32609
  this.highlightStore.register(this);
32592
32610
  this.onDispose(() => {
32593
32611
  this.highlightStore.unRegister(this);
32612
+ this._cancelEdition();
32594
32613
  });
32595
32614
  }
32596
32615
  handleEvent(event) {
@@ -41815,8 +41834,10 @@ const LEGACY_VERSION_MAPPING = {
41815
41834
  17: "17.4",
41816
41835
  16: "17.3",
41817
41836
  15: "17.2",
41837
+ "14.5": "16.4.1",
41818
41838
  14: "16.4",
41819
41839
  13: "16.3",
41840
+ "12.5": "15.4.1",
41820
41841
  12: "15.4",
41821
41842
  // not accurate starting at this point
41822
41843
  11: "0.10",
@@ -47979,6 +48000,9 @@ class GridRenderer extends SpreadsheetStore {
47979
48000
  break;
47980
48001
  }
47981
48002
  }
48003
+ finalize() {
48004
+ this.zonesWithPreventedAnimationsInNextFrame = recomputeZones(this.zonesWithPreventedAnimationsInNextFrame);
48005
+ }
47982
48006
  get renderingLayers() {
47983
48007
  return ["Background", "Headers"];
47984
48008
  }
@@ -76580,6 +76604,7 @@ topbarMenuRegistry
76580
76604
  .add("file", {
76581
76605
  name: _t("File"),
76582
76606
  sequence: 10,
76607
+ isReadonlyAllowed: true,
76583
76608
  })
76584
76609
  .addChild("settings", ["file"], {
76585
76610
  name: _t("Settings"),
@@ -76594,6 +76619,7 @@ topbarMenuRegistry
76594
76619
  .add("edit", {
76595
76620
  name: _t("Edit"),
76596
76621
  sequence: 20,
76622
+ isReadonlyAllowed: true,
76597
76623
  })
76598
76624
  .addChild("undo", ["edit"], {
76599
76625
  ...undo,
@@ -76678,6 +76704,7 @@ topbarMenuRegistry
76678
76704
  .add("view", {
76679
76705
  name: _t("View"),
76680
76706
  sequence: 30,
76707
+ isReadonlyAllowed: true,
76681
76708
  })
76682
76709
  .addChild("unfreeze_panes", ["view"], {
76683
76710
  ...unFreezePane,
@@ -76769,6 +76796,7 @@ topbarMenuRegistry
76769
76796
  .add("insert", {
76770
76797
  name: _t("Insert"),
76771
76798
  sequence: 40,
76799
+ isReadonlyAllowed: true,
76772
76800
  })
76773
76801
  .addChild("insert_row", ["insert"], {
76774
76802
  ...insertRow,
@@ -76876,7 +76904,11 @@ topbarMenuRegistry
76876
76904
  // ---------------------------------------------------------------------
76877
76905
  // FORMAT MENU ITEMS
76878
76906
  // ---------------------------------------------------------------------
76879
- .add("format", { name: _t("Format"), sequence: 50 })
76907
+ .add("format", {
76908
+ name: _t("Format"),
76909
+ sequence: 50,
76910
+ isReadonlyAllowed: true,
76911
+ })
76880
76912
  .addChild("format_number", ["format"], {
76881
76913
  ...formatNumberMenuItemSpec,
76882
76914
  name: _t("Number"),
@@ -76968,6 +77000,7 @@ topbarMenuRegistry
76968
77000
  .add("data", {
76969
77001
  name: _t("Data"),
76970
77002
  sequence: 60,
77003
+ isReadonlyAllowed: true,
76971
77004
  })
76972
77005
  .addChild("sort_range", ["data"], {
76973
77006
  ...sortRange,
@@ -84905,6 +84938,6 @@ exports.tokenColors = tokenColors;
84905
84938
  exports.tokenize = tokenize;
84906
84939
 
84907
84940
 
84908
- __info__.version = "18.4.14";
84909
- __info__.date = "2025-10-16T06:39:40.249Z";
84910
- __info__.hash = "bc55c40";
84941
+ __info__.version = "18.4.17";
84942
+ __info__.date = "2025-11-12T14:15:30.592Z";
84943
+ __info__.hash = "a8ebab8";
@@ -11696,6 +11696,7 @@ declare class GridRenderer extends SpreadsheetStore {
11696
11696
  private animations;
11697
11697
  constructor(get: Get);
11698
11698
  handle(cmd: Command): void;
11699
+ finalize(): void;
11699
11700
  get renderingLayers(): readonly ["Background", "Headers"];
11700
11701
  drawLayer(renderingContext: GridRenderingContext, layer: LayerName, timeStamp: number | undefined): void;
11701
11702
  private drawGlobalBackground;
@@ -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.4.14
6
- * @date 2025-10-16T06:39:40.249Z
7
- * @hash bc55c40
5
+ * @version 18.4.17
6
+ * @date 2025-11-12T14:15:30.592Z
7
+ * @hash a8ebab8
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';
@@ -5926,7 +5926,10 @@ function isInside(col, row, zone) {
5926
5926
  * Check if a zone is inside another
5927
5927
  */
5928
5928
  function isZoneInside(smallZone, biggerZone) {
5929
- return isEqual(union(biggerZone, smallZone), biggerZone);
5929
+ return (smallZone.left >= biggerZone.left &&
5930
+ smallZone.right <= biggerZone.right &&
5931
+ smallZone.top >= biggerZone.top &&
5932
+ smallZone.bottom <= biggerZone.bottom);
5930
5933
  }
5931
5934
  function zoneToDimension(zone) {
5932
5935
  return {
@@ -6487,7 +6490,7 @@ function getRangeString(range, forSheetId, getSheetName, options = { useBoundedR
6487
6490
  let sheetName = "";
6488
6491
  if (prefixSheet) {
6489
6492
  if (range.invalidSheetName) {
6490
- sheetName = range.invalidSheetName;
6493
+ sheetName = getCanonicalSymbolName(range.invalidSheetName);
6491
6494
  }
6492
6495
  else {
6493
6496
  sheetName = getCanonicalSymbolName(getSheetName(range.sheetId));
@@ -23105,7 +23108,7 @@ let ScorecardChart$1 = class ScorecardChart extends AbstractChart {
23105
23108
  return {
23106
23109
  background: context.background,
23107
23110
  type: "scorecard",
23108
- keyValue: context.range ? context.range[0].dataRange : undefined,
23111
+ keyValue: context.range?.[0]?.dataRange,
23109
23112
  title: context.title || { text: "" },
23110
23113
  baselineMode: DEFAULT_SCORECARD_BASELINE_MODE,
23111
23114
  baselineColorUp: DEFAULT_SCORECARD_BASELINE_COLOR_UP,
@@ -27426,7 +27429,7 @@ class GaugeChart extends AbstractChart {
27426
27429
  background: context.background,
27427
27430
  title: context.title || { text: "" },
27428
27431
  type: "gauge",
27429
- dataRange: context.range ? context.range[0].dataRange : undefined,
27432
+ dataRange: context.range?.[0]?.dataRange,
27430
27433
  sectionRule: {
27431
27434
  colors: {
27432
27435
  lowerColor: DEFAULT_GAUGE_LOWER_COLOR,
@@ -32233,7 +32236,7 @@ class ContentEditableHelper {
32233
32236
  else {
32234
32237
  text += NEWLINE;
32235
32238
  }
32236
- emptyParagraph = ["<br>", "<span><br></span>"].includes(current.value.innerHTML);
32239
+ emptyParagraph = isEmptyParagraph(current.value);
32237
32240
  continue;
32238
32241
  }
32239
32242
  if (!current.value.hasChildNodes()) {
@@ -32254,6 +32257,21 @@ function compareContentToSpanElement(content, node) {
32254
32257
  const sameContent = node.innerText === content.value;
32255
32258
  return sameColor && sameClass && sameContent;
32256
32259
  }
32260
+ const doc = new DOMParser();
32261
+ const brNode = doc.parseFromString("<br>", "text/html").body.firstChild;
32262
+ const spanBrNode = doc.parseFromString("<span><br></span>", "text/html").body.firstChild;
32263
+ function isEmptyParagraph(node) {
32264
+ if (node.childNodes.length > 1)
32265
+ return false;
32266
+ const node2 = node.firstChild?.cloneNode(true);
32267
+ if (!node2)
32268
+ return true;
32269
+ if (!(node2 instanceof Element))
32270
+ return false;
32271
+ node2.removeAttribute("class");
32272
+ node2.removeAttribute("style");
32273
+ return node2.isEqualNode(brNode) || node2.isEqualNode(spanBrNode) || false;
32274
+ }
32257
32275
 
32258
32276
  // -----------------------------------------------------------------------------
32259
32277
  // Formula Assistant component
@@ -32589,6 +32607,7 @@ class AbstractComposerStore extends SpreadsheetStore {
32589
32607
  this.highlightStore.register(this);
32590
32608
  this.onDispose(() => {
32591
32609
  this.highlightStore.unRegister(this);
32610
+ this._cancelEdition();
32592
32611
  });
32593
32612
  }
32594
32613
  handleEvent(event) {
@@ -41813,8 +41832,10 @@ const LEGACY_VERSION_MAPPING = {
41813
41832
  17: "17.4",
41814
41833
  16: "17.3",
41815
41834
  15: "17.2",
41835
+ "14.5": "16.4.1",
41816
41836
  14: "16.4",
41817
41837
  13: "16.3",
41838
+ "12.5": "15.4.1",
41818
41839
  12: "15.4",
41819
41840
  // not accurate starting at this point
41820
41841
  11: "0.10",
@@ -47977,6 +47998,9 @@ class GridRenderer extends SpreadsheetStore {
47977
47998
  break;
47978
47999
  }
47979
48000
  }
48001
+ finalize() {
48002
+ this.zonesWithPreventedAnimationsInNextFrame = recomputeZones(this.zonesWithPreventedAnimationsInNextFrame);
48003
+ }
47980
48004
  get renderingLayers() {
47981
48005
  return ["Background", "Headers"];
47982
48006
  }
@@ -76578,6 +76602,7 @@ topbarMenuRegistry
76578
76602
  .add("file", {
76579
76603
  name: _t("File"),
76580
76604
  sequence: 10,
76605
+ isReadonlyAllowed: true,
76581
76606
  })
76582
76607
  .addChild("settings", ["file"], {
76583
76608
  name: _t("Settings"),
@@ -76592,6 +76617,7 @@ topbarMenuRegistry
76592
76617
  .add("edit", {
76593
76618
  name: _t("Edit"),
76594
76619
  sequence: 20,
76620
+ isReadonlyAllowed: true,
76595
76621
  })
76596
76622
  .addChild("undo", ["edit"], {
76597
76623
  ...undo,
@@ -76676,6 +76702,7 @@ topbarMenuRegistry
76676
76702
  .add("view", {
76677
76703
  name: _t("View"),
76678
76704
  sequence: 30,
76705
+ isReadonlyAllowed: true,
76679
76706
  })
76680
76707
  .addChild("unfreeze_panes", ["view"], {
76681
76708
  ...unFreezePane,
@@ -76767,6 +76794,7 @@ topbarMenuRegistry
76767
76794
  .add("insert", {
76768
76795
  name: _t("Insert"),
76769
76796
  sequence: 40,
76797
+ isReadonlyAllowed: true,
76770
76798
  })
76771
76799
  .addChild("insert_row", ["insert"], {
76772
76800
  ...insertRow,
@@ -76874,7 +76902,11 @@ topbarMenuRegistry
76874
76902
  // ---------------------------------------------------------------------
76875
76903
  // FORMAT MENU ITEMS
76876
76904
  // ---------------------------------------------------------------------
76877
- .add("format", { name: _t("Format"), sequence: 50 })
76905
+ .add("format", {
76906
+ name: _t("Format"),
76907
+ sequence: 50,
76908
+ isReadonlyAllowed: true,
76909
+ })
76878
76910
  .addChild("format_number", ["format"], {
76879
76911
  ...formatNumberMenuItemSpec,
76880
76912
  name: _t("Number"),
@@ -76966,6 +76998,7 @@ topbarMenuRegistry
76966
76998
  .add("data", {
76967
76999
  name: _t("Data"),
76968
77000
  sequence: 60,
77001
+ isReadonlyAllowed: true,
76969
77002
  })
76970
77003
  .addChild("sort_range", ["data"], {
76971
77004
  ...sortRange,
@@ -84855,6 +84888,6 @@ const chartHelpers = { ...CHART_HELPERS, ...CHART_RUNTIME_HELPERS };
84855
84888
  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, helpers, hooks, invalidateCFEvaluationCommands, invalidateChartEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
84856
84889
 
84857
84890
 
84858
- __info__.version = "18.4.14";
84859
- __info__.date = "2025-10-16T06:39:40.249Z";
84860
- __info__.hash = "bc55c40";
84891
+ __info__.version = "18.4.17";
84892
+ __info__.date = "2025-11-12T14:15:30.592Z";
84893
+ __info__.hash = "a8ebab8";
@@ -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.4.14
6
- * @date 2025-10-16T06:39:40.249Z
7
- * @hash bc55c40
5
+ * @version 18.4.17
6
+ * @date 2025-11-12T14:15:30.592Z
7
+ * @hash a8ebab8
8
8
  */
9
9
 
10
10
  (function (exports, owl) {
@@ -5927,7 +5927,10 @@
5927
5927
  * Check if a zone is inside another
5928
5928
  */
5929
5929
  function isZoneInside(smallZone, biggerZone) {
5930
- return isEqual(union(biggerZone, smallZone), biggerZone);
5930
+ return (smallZone.left >= biggerZone.left &&
5931
+ smallZone.right <= biggerZone.right &&
5932
+ smallZone.top >= biggerZone.top &&
5933
+ smallZone.bottom <= biggerZone.bottom);
5931
5934
  }
5932
5935
  function zoneToDimension(zone) {
5933
5936
  return {
@@ -6488,7 +6491,7 @@
6488
6491
  let sheetName = "";
6489
6492
  if (prefixSheet) {
6490
6493
  if (range.invalidSheetName) {
6491
- sheetName = range.invalidSheetName;
6494
+ sheetName = getCanonicalSymbolName(range.invalidSheetName);
6492
6495
  }
6493
6496
  else {
6494
6497
  sheetName = getCanonicalSymbolName(getSheetName(range.sheetId));
@@ -23106,7 +23109,7 @@ stores.inject(MyMetaStore, storeInstance);
23106
23109
  return {
23107
23110
  background: context.background,
23108
23111
  type: "scorecard",
23109
- keyValue: context.range ? context.range[0].dataRange : undefined,
23112
+ keyValue: context.range?.[0]?.dataRange,
23110
23113
  title: context.title || { text: "" },
23111
23114
  baselineMode: DEFAULT_SCORECARD_BASELINE_MODE,
23112
23115
  baselineColorUp: DEFAULT_SCORECARD_BASELINE_COLOR_UP,
@@ -27427,7 +27430,7 @@ stores.inject(MyMetaStore, storeInstance);
27427
27430
  background: context.background,
27428
27431
  title: context.title || { text: "" },
27429
27432
  type: "gauge",
27430
- dataRange: context.range ? context.range[0].dataRange : undefined,
27433
+ dataRange: context.range?.[0]?.dataRange,
27431
27434
  sectionRule: {
27432
27435
  colors: {
27433
27436
  lowerColor: DEFAULT_GAUGE_LOWER_COLOR,
@@ -32234,7 +32237,7 @@ stores.inject(MyMetaStore, storeInstance);
32234
32237
  else {
32235
32238
  text += NEWLINE;
32236
32239
  }
32237
- emptyParagraph = ["<br>", "<span><br></span>"].includes(current.value.innerHTML);
32240
+ emptyParagraph = isEmptyParagraph(current.value);
32238
32241
  continue;
32239
32242
  }
32240
32243
  if (!current.value.hasChildNodes()) {
@@ -32255,6 +32258,21 @@ stores.inject(MyMetaStore, storeInstance);
32255
32258
  const sameContent = node.innerText === content.value;
32256
32259
  return sameColor && sameClass && sameContent;
32257
32260
  }
32261
+ const doc = new DOMParser();
32262
+ const brNode = doc.parseFromString("<br>", "text/html").body.firstChild;
32263
+ const spanBrNode = doc.parseFromString("<span><br></span>", "text/html").body.firstChild;
32264
+ function isEmptyParagraph(node) {
32265
+ if (node.childNodes.length > 1)
32266
+ return false;
32267
+ const node2 = node.firstChild?.cloneNode(true);
32268
+ if (!node2)
32269
+ return true;
32270
+ if (!(node2 instanceof Element))
32271
+ return false;
32272
+ node2.removeAttribute("class");
32273
+ node2.removeAttribute("style");
32274
+ return node2.isEqualNode(brNode) || node2.isEqualNode(spanBrNode) || false;
32275
+ }
32258
32276
 
32259
32277
  // -----------------------------------------------------------------------------
32260
32278
  // Formula Assistant component
@@ -32590,6 +32608,7 @@ stores.inject(MyMetaStore, storeInstance);
32590
32608
  this.highlightStore.register(this);
32591
32609
  this.onDispose(() => {
32592
32610
  this.highlightStore.unRegister(this);
32611
+ this._cancelEdition();
32593
32612
  });
32594
32613
  }
32595
32614
  handleEvent(event) {
@@ -41814,8 +41833,10 @@ stores.inject(MyMetaStore, storeInstance);
41814
41833
  17: "17.4",
41815
41834
  16: "17.3",
41816
41835
  15: "17.2",
41836
+ "14.5": "16.4.1",
41817
41837
  14: "16.4",
41818
41838
  13: "16.3",
41839
+ "12.5": "15.4.1",
41819
41840
  12: "15.4",
41820
41841
  // not accurate starting at this point
41821
41842
  11: "0.10",
@@ -47978,6 +47999,9 @@ stores.inject(MyMetaStore, storeInstance);
47978
47999
  break;
47979
48000
  }
47980
48001
  }
48002
+ finalize() {
48003
+ this.zonesWithPreventedAnimationsInNextFrame = recomputeZones(this.zonesWithPreventedAnimationsInNextFrame);
48004
+ }
47981
48005
  get renderingLayers() {
47982
48006
  return ["Background", "Headers"];
47983
48007
  }
@@ -76579,6 +76603,7 @@ stores.inject(MyMetaStore, storeInstance);
76579
76603
  .add("file", {
76580
76604
  name: _t("File"),
76581
76605
  sequence: 10,
76606
+ isReadonlyAllowed: true,
76582
76607
  })
76583
76608
  .addChild("settings", ["file"], {
76584
76609
  name: _t("Settings"),
@@ -76593,6 +76618,7 @@ stores.inject(MyMetaStore, storeInstance);
76593
76618
  .add("edit", {
76594
76619
  name: _t("Edit"),
76595
76620
  sequence: 20,
76621
+ isReadonlyAllowed: true,
76596
76622
  })
76597
76623
  .addChild("undo", ["edit"], {
76598
76624
  ...undo,
@@ -76677,6 +76703,7 @@ stores.inject(MyMetaStore, storeInstance);
76677
76703
  .add("view", {
76678
76704
  name: _t("View"),
76679
76705
  sequence: 30,
76706
+ isReadonlyAllowed: true,
76680
76707
  })
76681
76708
  .addChild("unfreeze_panes", ["view"], {
76682
76709
  ...unFreezePane,
@@ -76768,6 +76795,7 @@ stores.inject(MyMetaStore, storeInstance);
76768
76795
  .add("insert", {
76769
76796
  name: _t("Insert"),
76770
76797
  sequence: 40,
76798
+ isReadonlyAllowed: true,
76771
76799
  })
76772
76800
  .addChild("insert_row", ["insert"], {
76773
76801
  ...insertRow,
@@ -76875,7 +76903,11 @@ stores.inject(MyMetaStore, storeInstance);
76875
76903
  // ---------------------------------------------------------------------
76876
76904
  // FORMAT MENU ITEMS
76877
76905
  // ---------------------------------------------------------------------
76878
- .add("format", { name: _t("Format"), sequence: 50 })
76906
+ .add("format", {
76907
+ name: _t("Format"),
76908
+ sequence: 50,
76909
+ isReadonlyAllowed: true,
76910
+ })
76879
76911
  .addChild("format_number", ["format"], {
76880
76912
  ...formatNumberMenuItemSpec,
76881
76913
  name: _t("Number"),
@@ -76967,6 +76999,7 @@ stores.inject(MyMetaStore, storeInstance);
76967
76999
  .add("data", {
76968
77000
  name: _t("Data"),
76969
77001
  sequence: 60,
77002
+ isReadonlyAllowed: true,
76970
77003
  })
76971
77004
  .addChild("sort_range", ["data"], {
76972
77005
  ...sortRange,
@@ -84904,9 +84937,9 @@ stores.inject(MyMetaStore, storeInstance);
84904
84937
  exports.tokenize = tokenize;
84905
84938
 
84906
84939
 
84907
- __info__.version = "18.4.14";
84908
- __info__.date = "2025-10-16T06:39:40.249Z";
84909
- __info__.hash = "bc55c40";
84940
+ __info__.version = "18.4.17";
84941
+ __info__.date = "2025-11-12T14:15:30.592Z";
84942
+ __info__.hash = "a8ebab8";
84910
84943
 
84911
84944
 
84912
84945
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);