@odoo/o-spreadsheet 18.4.16 → 18.4.18

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.16
6
- * @date 2025-11-03T12:31:57.153Z
7
- * @hash 1ba569f
5
+ * @version 18.4.18
6
+ * @date 2025-11-24T07:42:07.821Z
7
+ * @hash 4f83667
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));
@@ -18539,7 +18542,7 @@ stores.inject(MyMetaStore, storeInstance);
18539
18542
  function setXcToFixedReferenceType(xc, referenceType) {
18540
18543
  let sheetName;
18541
18544
  ({ sheetName, xc } = splitReference(xc));
18542
- sheetName = sheetName ? sheetName + "!" : "";
18545
+ sheetName = sheetName ? getCanonicalSymbolName(sheetName) + "!" : "";
18543
18546
  xc = xc.replace(/\$/g, "");
18544
18547
  const splitIndex = xc.indexOf(":");
18545
18548
  if (splitIndex >= 0) {
@@ -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,
@@ -32605,6 +32608,7 @@ stores.inject(MyMetaStore, storeInstance);
32605
32608
  this.highlightStore.register(this);
32606
32609
  this.onDispose(() => {
32607
32610
  this.highlightStore.unRegister(this);
32611
+ this._cancelEdition();
32608
32612
  });
32609
32613
  }
32610
32614
  handleEvent(event) {
@@ -32639,6 +32643,7 @@ stores.inject(MyMetaStore, storeInstance);
32639
32643
  }
32640
32644
  this.selectionStart = start;
32641
32645
  this.selectionEnd = end;
32646
+ this.editionMode = "editing";
32642
32647
  this.computeFormulaCursorContext();
32643
32648
  this.computeParenthesisRelatedToCursor();
32644
32649
  this.updateAutoCompleteProvider();
@@ -33314,10 +33319,13 @@ stores.inject(MyMetaStore, storeInstance);
33314
33319
  hideHelp() {
33315
33320
  this.autoComplete.hide();
33316
33321
  }
33317
- autoCompleteOrStop(direction) {
33322
+ autoCompleteOrStop(direction, assistantForcedClosed = false) {
33318
33323
  if (this.editionMode !== "inactive") {
33319
33324
  const autoComplete = this.autoComplete;
33320
- if (autoComplete.provider && autoComplete.selectedIndex !== undefined) {
33325
+ const suppressAutocomplete = assistantForcedClosed && this.canBeToggled;
33326
+ if (!suppressAutocomplete &&
33327
+ autoComplete.provider &&
33328
+ autoComplete.selectedIndex !== undefined) {
33321
33329
  const autoCompleteValue = autoComplete.provider.proposals[autoComplete.selectedIndex]?.text;
33322
33330
  if (autoCompleteValue) {
33323
33331
  this.autoComplete.provider?.selectProposal(autoCompleteValue);
@@ -33660,16 +33668,12 @@ stores.inject(MyMetaStore, storeInstance);
33660
33668
  processTabKey(ev, direction) {
33661
33669
  ev.preventDefault();
33662
33670
  ev.stopPropagation();
33663
- if (!this.assistant.forcedClosed) {
33664
- this.props.composerStore.autoCompleteOrStop(direction);
33665
- }
33671
+ this.props.composerStore.autoCompleteOrStop(direction, this.assistant.forcedClosed);
33666
33672
  }
33667
33673
  processEnterKey(ev, direction) {
33668
33674
  ev.preventDefault();
33669
33675
  ev.stopPropagation();
33670
- if (!this.assistant.forcedClosed) {
33671
- this.props.composerStore.autoCompleteOrStop(direction);
33672
- }
33676
+ this.props.composerStore.autoCompleteOrStop(direction, this.assistant.forcedClosed);
33673
33677
  }
33674
33678
  processNewLineEvent(ev) {
33675
33679
  ev.preventDefault();
@@ -33845,7 +33849,6 @@ stores.inject(MyMetaStore, storeInstance);
33845
33849
  return;
33846
33850
  }
33847
33851
  const newSelection = this.contentHelper.getCurrentSelection();
33848
- this.props.composerStore.stopComposerRangeSelection();
33849
33852
  this.props.onComposerContentFocused();
33850
33853
  this.props.composerStore.changeComposerCursorSelection(newSelection.start, newSelection.end);
33851
33854
  this.processTokenAtCursor();
@@ -47366,10 +47369,11 @@ stores.inject(MyMetaStore, storeInstance);
47366
47369
  this.state.waitingForMove = false;
47367
47370
  }
47368
47371
  onMouseMove(ev) {
47369
- if (this.env.isMobile()) {
47370
- return;
47371
- }
47372
- if (this.state.isResizing || this.state.isMoving || this.state.isSelecting) {
47372
+ if (this.env.isMobile() ||
47373
+ this.env.model.getters.isReadonly() ||
47374
+ this.state.isResizing ||
47375
+ this.state.isMoving ||
47376
+ this.state.isSelecting) {
47373
47377
  return;
47374
47378
  }
47375
47379
  this._computeHandleDisplay(ev);
@@ -47436,6 +47440,10 @@ stores.inject(MyMetaStore, storeInstance);
47436
47440
  if (index < 0) {
47437
47441
  return;
47438
47442
  }
47443
+ if (this.env.model.getters.isReadonly()) {
47444
+ this._selectElement(index, false);
47445
+ return;
47446
+ }
47439
47447
  if (this.state.waitingForMove) {
47440
47448
  if (!this.env.model.getters.isGridSelectionActive()) {
47441
47449
  this._selectElement(index, false);
@@ -47995,6 +48003,9 @@ stores.inject(MyMetaStore, storeInstance);
47995
48003
  break;
47996
48004
  }
47997
48005
  }
48006
+ finalize() {
48007
+ this.zonesWithPreventedAnimationsInNextFrame = recomputeZones(this.zonesWithPreventedAnimationsInNextFrame);
48008
+ }
47998
48009
  get renderingLayers() {
47999
48010
  return ["Background", "Headers"];
48000
48011
  }
@@ -48793,7 +48804,7 @@ stores.inject(MyMetaStore, storeInstance);
48793
48804
  const verticalScrollFactor = 1;
48794
48805
  const horizontalScrollFactor = 1;
48795
48806
  const resetTimeoutDuration = 100;
48796
- function useTouchScroll(ref, updateScroll, canMoveUp) {
48807
+ function useTouchScroll(ref, updateScroll, canMoveUp, canMoveDown) {
48797
48808
  let lastX = 0;
48798
48809
  let lastY = 0;
48799
48810
  let velocityX = 0;
@@ -48830,7 +48841,7 @@ stores.inject(MyMetaStore, storeInstance);
48830
48841
  lastX = clientX;
48831
48842
  lastY = clientY;
48832
48843
  lastTime = currentTime;
48833
- if (canMoveUp()) {
48844
+ if ((deltaY < 0 && canMoveUp()) || (deltaY > 0 && canMoveDown())) {
48834
48845
  if (event.cancelable) {
48835
48846
  event.preventDefault();
48836
48847
  }
@@ -54730,7 +54741,6 @@ stores.inject(MyMetaStore, storeInstance);
54730
54741
  // replace the whole token
54731
54742
  start = tokenAtCursor.start;
54732
54743
  }
54733
- this.composer.stopComposerRangeSelection();
54734
54744
  this.composer.changeComposerCursorSelection(start, end);
54735
54745
  this.composer.replaceComposerCursorSelection(value);
54736
54746
  }
@@ -54748,7 +54758,6 @@ stores.inject(MyMetaStore, storeInstance);
54748
54758
  // replace the whole token
54749
54759
  start = tokenAtCursor.start;
54750
54760
  }
54751
- this.composer.stopComposerRangeSelection();
54752
54761
  this.composer.changeComposerCursorSelection(start, end);
54753
54762
  this.composer.replaceComposerCursorSelection(value);
54754
54763
  }
@@ -57447,6 +57456,7 @@ stores.inject(MyMetaStore, storeInstance);
57447
57456
  getPanelProps(panelInfo) {
57448
57457
  const state = this.computeState(panelInfo);
57449
57458
  if (state.isOpen) {
57459
+ panelInfo.currentPanelProps = state.props ?? panelInfo.currentPanelProps;
57450
57460
  return state.props ?? {};
57451
57461
  }
57452
57462
  return {};
@@ -57458,11 +57468,11 @@ stores.inject(MyMetaStore, storeInstance);
57458
57468
  }
57459
57469
  return undefined;
57460
57470
  }
57461
- open(componentTag, initialPanelProps = {}) {
57471
+ open(componentTag, currentPanelProps = {}) {
57462
57472
  if (this.screenWidthStore.isSmall) {
57463
57473
  return;
57464
57474
  }
57465
- const newPanelInfo = { initialPanelProps, componentTag, size: DEFAULT_SIDE_PANEL_SIZE };
57475
+ const newPanelInfo = { currentPanelProps, componentTag, size: DEFAULT_SIDE_PANEL_SIZE };
57466
57476
  const state = this.computeState(newPanelInfo);
57467
57477
  if (!state.isOpen) {
57468
57478
  return;
@@ -57486,8 +57496,8 @@ stores.inject(MyMetaStore, storeInstance);
57486
57496
  }
57487
57497
  this._openPanel("secondaryPanel", newPanelInfo, state);
57488
57498
  }
57489
- replace(componentTag, currentPanelKey, initialPanelProps = {}) {
57490
- const newPanelInfo = { initialPanelProps, componentTag, size: DEFAULT_SIDE_PANEL_SIZE };
57499
+ replace(componentTag, currentPanelKey, currentPanelProps = {}) {
57500
+ const newPanelInfo = { currentPanelProps, componentTag, size: DEFAULT_SIDE_PANEL_SIZE };
57491
57501
  const state = this.computeState(newPanelInfo);
57492
57502
  if (!state.isOpen) {
57493
57503
  return;
@@ -57517,10 +57527,10 @@ stores.inject(MyMetaStore, storeInstance);
57517
57527
  _openPanel(panel, newPanel, state) {
57518
57528
  const currentPanel = this[panel];
57519
57529
  if (currentPanel && newPanel.componentTag !== currentPanel.componentTag) {
57520
- currentPanel.initialPanelProps?.onCloseSidePanel?.();
57530
+ currentPanel.currentPanelProps?.onCloseSidePanel?.();
57521
57531
  }
57522
57532
  this[panel] = {
57523
- initialPanelProps: state.props ?? {},
57533
+ currentPanelProps: state.props ?? {},
57524
57534
  componentTag: newPanel.componentTag,
57525
57535
  size: currentPanel?.size || DEFAULT_SIDE_PANEL_SIZE,
57526
57536
  isCollapsed: currentPanel?.isCollapsed || false,
@@ -57542,16 +57552,16 @@ stores.inject(MyMetaStore, storeInstance);
57542
57552
  close() {
57543
57553
  if (this.mainPanel?.isPinned) {
57544
57554
  if (this.secondaryPanel) {
57545
- this.secondaryPanel.initialPanelProps.onCloseSidePanel?.();
57555
+ this.secondaryPanel.currentPanelProps.onCloseSidePanel?.();
57546
57556
  this.secondaryPanel = undefined;
57547
57557
  }
57548
57558
  return;
57549
57559
  }
57550
- this.mainPanel?.initialPanelProps.onCloseSidePanel?.();
57560
+ this.mainPanel?.currentPanelProps.onCloseSidePanel?.();
57551
57561
  this.mainPanel = undefined;
57552
57562
  }
57553
57563
  closeMainPanel() {
57554
- this.mainPanel?.initialPanelProps.onCloseSidePanel?.();
57564
+ this.mainPanel?.currentPanelProps.onCloseSidePanel?.();
57555
57565
  this.mainPanel = this.secondaryPanel || undefined;
57556
57566
  this.secondaryPanel = undefined;
57557
57567
  }
@@ -57583,7 +57593,7 @@ stores.inject(MyMetaStore, storeInstance);
57583
57593
  }
57584
57594
  this.mainPanel.isPinned = !this.mainPanel.isPinned;
57585
57595
  if (!this.mainPanel.isPinned && this.secondaryPanel) {
57586
- this.secondaryPanel?.initialPanelProps.onCloseSidePanel?.();
57596
+ this.secondaryPanel?.currentPanelProps.onCloseSidePanel?.();
57587
57597
  this.mainPanel = this.secondaryPanel;
57588
57598
  this.secondaryPanel = undefined;
57589
57599
  }
@@ -57602,7 +57612,7 @@ stores.inject(MyMetaStore, storeInstance);
57602
57612
  panelInfo.size = COLLAPSED_SIDE_PANEL_SIZE;
57603
57613
  }
57604
57614
  }
57605
- computeState({ componentTag, initialPanelProps }) {
57615
+ computeState({ componentTag, currentPanelProps: initialPanelProps, }) {
57606
57616
  const customComputeState = sidePanelRegistry.get(componentTag).computeState;
57607
57617
  const state = customComputeState
57608
57618
  ? customComputeState(this.getters, initialPanelProps)
@@ -57612,7 +57622,7 @@ stores.inject(MyMetaStore, storeInstance);
57612
57622
  changeSpreadsheetWidth(width) {
57613
57623
  this.availableWidth = width - MIN_SHEET_VIEW_WIDTH;
57614
57624
  if (this.secondaryPanel && width - this.totalPanelSize < MIN_SHEET_VIEW_WIDTH) {
57615
- this.secondaryPanel?.initialPanelProps.onCloseSidePanel?.();
57625
+ this.secondaryPanel?.currentPanelProps.onCloseSidePanel?.();
57616
57626
  this.secondaryPanel = undefined;
57617
57627
  }
57618
57628
  if (this.mainPanel && width - this.totalPanelSize < MIN_SHEET_VIEW_WIDTH) {
@@ -57772,6 +57782,10 @@ stores.inject(MyMetaStore, storeInstance);
57772
57782
  useTouchScroll(this.gridRef, this.moveCanvas.bind(this), () => {
57773
57783
  const { scrollY } = this.env.model.getters.getActiveSheetScrollInfo();
57774
57784
  return scrollY > 0;
57785
+ }, () => {
57786
+ const { maxOffsetY } = this.env.model.getters.getMaximumSheetOffset();
57787
+ const { scrollY } = this.env.model.getters.getActiveSheetScrollInfo();
57788
+ return scrollY < maxOffsetY;
57775
57789
  });
57776
57790
  }
57777
57791
  get highlights() {
@@ -74993,6 +75007,7 @@ stores.inject(MyMetaStore, storeInstance);
74993
75007
  "getFigureUI",
74994
75008
  "getPositionAnchorOffset",
74995
75009
  "getGridOffset",
75010
+ "getMaximumSheetOffset",
74996
75011
  ];
74997
75012
  viewports = {};
74998
75013
  /**
@@ -76596,6 +76611,7 @@ stores.inject(MyMetaStore, storeInstance);
76596
76611
  .add("file", {
76597
76612
  name: _t("File"),
76598
76613
  sequence: 10,
76614
+ isReadonlyAllowed: true,
76599
76615
  })
76600
76616
  .addChild("settings", ["file"], {
76601
76617
  name: _t("Settings"),
@@ -76610,6 +76626,7 @@ stores.inject(MyMetaStore, storeInstance);
76610
76626
  .add("edit", {
76611
76627
  name: _t("Edit"),
76612
76628
  sequence: 20,
76629
+ isReadonlyAllowed: true,
76613
76630
  })
76614
76631
  .addChild("undo", ["edit"], {
76615
76632
  ...undo,
@@ -76694,6 +76711,7 @@ stores.inject(MyMetaStore, storeInstance);
76694
76711
  .add("view", {
76695
76712
  name: _t("View"),
76696
76713
  sequence: 30,
76714
+ isReadonlyAllowed: true,
76697
76715
  })
76698
76716
  .addChild("unfreeze_panes", ["view"], {
76699
76717
  ...unFreezePane,
@@ -76785,6 +76803,7 @@ stores.inject(MyMetaStore, storeInstance);
76785
76803
  .add("insert", {
76786
76804
  name: _t("Insert"),
76787
76805
  sequence: 40,
76806
+ isReadonlyAllowed: true,
76788
76807
  })
76789
76808
  .addChild("insert_row", ["insert"], {
76790
76809
  ...insertRow,
@@ -76892,7 +76911,11 @@ stores.inject(MyMetaStore, storeInstance);
76892
76911
  // ---------------------------------------------------------------------
76893
76912
  // FORMAT MENU ITEMS
76894
76913
  // ---------------------------------------------------------------------
76895
- .add("format", { name: _t("Format"), sequence: 50 })
76914
+ .add("format", {
76915
+ name: _t("Format"),
76916
+ sequence: 50,
76917
+ isReadonlyAllowed: true,
76918
+ })
76896
76919
  .addChild("format_number", ["format"], {
76897
76920
  ...formatNumberMenuItemSpec,
76898
76921
  name: _t("Number"),
@@ -76984,6 +77007,7 @@ stores.inject(MyMetaStore, storeInstance);
76984
77007
  .add("data", {
76985
77008
  name: _t("Data"),
76986
77009
  sequence: 60,
77010
+ isReadonlyAllowed: true,
76987
77011
  })
76988
77012
  .addChild("sort_range", ["data"], {
76989
77013
  ...sortRange,
@@ -78074,6 +78098,10 @@ stores.inject(MyMetaStore, storeInstance);
78074
78098
  useTouchScroll(this.gridRef, this.moveCanvas.bind(this), () => {
78075
78099
  const { scrollY } = this.env.model.getters.getActiveSheetScrollInfo();
78076
78100
  return scrollY > 0;
78101
+ }, () => {
78102
+ const { maxOffsetY } = this.env.model.getters.getMaximumSheetOffset();
78103
+ const { scrollY } = this.env.model.getters.getActiveSheetScrollInfo();
78104
+ return scrollY < maxOffsetY;
78077
78105
  });
78078
78106
  }
78079
78107
  get gridContainer() {
@@ -80117,7 +80145,7 @@ stores.inject(MyMetaStore, storeInstance);
80117
80145
  border-radius: 4px;
80118
80146
  font-weight: 500;
80119
80147
  font-size: 14px;
80120
- height: 32px;
80148
+ min-height: 32px;
80121
80149
  line-height: 16px;
80122
80150
  flex-grow: 1;
80123
80151
  background-color: ${BUTTON_BG};
@@ -84921,9 +84949,9 @@ stores.inject(MyMetaStore, storeInstance);
84921
84949
  exports.tokenize = tokenize;
84922
84950
 
84923
84951
 
84924
- __info__.version = "18.4.16";
84925
- __info__.date = "2025-11-03T12:31:57.153Z";
84926
- __info__.hash = "1ba569f";
84952
+ __info__.version = "18.4.18";
84953
+ __info__.date = "2025-11-24T07:42:07.821Z";
84954
+ __info__.hash = "4f83667";
84927
84955
 
84928
84956
 
84929
84957
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);