@odoo/o-spreadsheet 19.3.12 → 19.3.14

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.3.12
6
- * @date 2026-07-20T11:02:44.416Z
7
- * @hash 2b42707
5
+ * @version 19.3.14
6
+ * @date 2026-07-30T06:55:43.749Z
7
+ * @hash 3dd5632
8
8
  */
9
9
 
10
10
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
@@ -10252,7 +10252,7 @@ function getCalendarChartDatasetAndLabels(definition, args) {
10252
10252
  borderWidth: 1,
10253
10253
  barPercentage: 1,
10254
10254
  categoryPercentage: 1,
10255
- values: dataSetValues.data.map((cell) => isNumberResult(cell) ? cell.value : NaN)
10255
+ values: dataSetValues.data.map((cell) => isNumberResult(cell) ? cell.value : void 0)
10256
10256
  });
10257
10257
  return {
10258
10258
  labels,
@@ -11822,6 +11822,19 @@ function isOtherMobileOS() {
11822
11822
  function isMobileOS() {
11823
11823
  return isAndroid() || isIOS() || isOtherMobileOS();
11824
11824
  }
11825
+ const INTERACTIVE_ELEMENT_SELECTOR = "select, input, textarea, button, .o-select, .os-input, .o-input, .o-button, .o-button-icon, .o-button-link, .o-composer";
11826
+ /** Check if there is an interactive element (input, select, button, ...) between the event.target and event.currentTarget (inclusive)*/
11827
+ function hasInteractiveElementInEventTree(event) {
11828
+ const target = event.target;
11829
+ const root = event.currentTarget;
11830
+ if (!root || !target || !root.contains(target)) return false;
11831
+ let node = target;
11832
+ while (node && node !== root) {
11833
+ if (node.matches(INTERACTIVE_ELEMENT_SELECTOR)) return true;
11834
+ node = node.parentElement;
11835
+ }
11836
+ return root.matches(INTERACTIVE_ELEMENT_SELECTOR);
11837
+ }
11825
11838
 
11826
11839
  //#endregion
11827
11840
  //#region src/components/helpers/zoom.ts
@@ -38041,13 +38054,9 @@ var PivotLayoutConfigurator = class extends _odoo_owl.Component {
38041
38054
  dimensionsRef = (0, _odoo_owl.useRef)("pivot-dimensions");
38042
38055
  dragAndDrop = useDragAndDropListItems();
38043
38056
  AGGREGATORS = AGGREGATORS;
38044
- composerFocus;
38045
38057
  isDateOrDatetimeField = isDateOrDatetimeField;
38046
- setup() {
38047
- this.composerFocus = useStore(ComposerFocusStore);
38048
- }
38049
38058
  startDragAndDrop(dimension, event) {
38050
- if (event.button !== 0 || event.target.tagName === "SELECT") return;
38059
+ if (event.button !== 0 || hasInteractiveElementInEventTree(event)) return;
38051
38060
  const rects = this.getDimensionElementsRects();
38052
38061
  const { columns, rows } = this.props.definition;
38053
38062
  const draggableIds = [
@@ -38087,7 +38096,7 @@ var PivotLayoutConfigurator = class extends _odoo_owl.Component {
38087
38096
  return field.type === "date" ? this.props.dateGranularities : this.props.datetimeGranularities;
38088
38097
  }
38089
38098
  startDragAndDropMeasures(measure, event) {
38090
- if (event.button !== 0 || event.target.tagName === "SELECT" || event.target.tagName === "INPUT" || this.composerFocus.focusMode !== "inactive") return;
38099
+ if (event.button !== 0 || hasInteractiveElementInEventTree(event)) return;
38091
38100
  const rects = this.getDimensionElementsRects();
38092
38101
  const { measures, columns, rows } = this.props.definition;
38093
38102
  const draggableIds = measures.map((m) => m.id);
@@ -44156,7 +44165,8 @@ var Autofill = class extends _odoo_owl.Component {
44156
44165
  const { x, y } = this.state.handler ? this.state.position : this.props.position;
44157
44166
  return cssPropertiesToCss({
44158
44167
  top: `${y}px`,
44159
- left: `${x}px`
44168
+ left: `${x}px`,
44169
+ visibility: this.props.isVisible ? "visible" : "hidden"
44160
44170
  });
44161
44171
  }
44162
44172
  get styleNextValue() {
@@ -44577,7 +44587,7 @@ var CellComposerStore = class extends AbstractComposerStore {
44577
44587
  this._cancelEdition();
44578
44588
  this.resetContent();
44579
44589
  }
44580
- if (cmd.sheetIdFrom !== cmd.sheetIdTo) {
44590
+ if (this.model.selection.isListening(this) && cmd.sheetIdFrom !== cmd.sheetIdTo) {
44581
44591
  const activePosition = this.getters.getActivePosition();
44582
44592
  const { col, row } = this.getters.getNextVisibleCellPosition({
44583
44593
  sheetId: cmd.sheetIdTo,
@@ -48719,6 +48729,10 @@ var Grid = class extends _odoo_owl.Component {
48719
48729
  get displaySelectionHandler() {
48720
48730
  return this.env.isMobile() && this.composerFocusStore.activeComposer.editionMode === "inactive";
48721
48731
  }
48732
+ get clientsToDisplay() {
48733
+ const sheetId = this.env.model.getters.getActiveSheetId();
48734
+ return this.env.model.getters.getClientsToDisplay(sheetId);
48735
+ }
48722
48736
  };
48723
48737
 
48724
48738
  //#endregion
@@ -59894,12 +59908,22 @@ var TableComputedStylePlugin = class extends UIPlugin {
59894
59908
  getCellTableStyle(position) {
59895
59909
  const table = this.getters.getTable(position);
59896
59910
  if (!table) return;
59897
- return this.tableStyles[position.sheetId][table.id]().styles[position.col]?.[position.row];
59911
+ try {
59912
+ return this.tableStyles[position.sheetId][table.id]().styles[position.col]?.[position.row];
59913
+ } catch (e) {
59914
+ if (isEvaluationError(e) || e instanceof EvaluationError) return;
59915
+ throw e;
59916
+ }
59898
59917
  }
59899
59918
  getCellTableBorder(position) {
59900
59919
  const table = this.getters.getTable(position);
59901
59920
  if (!table) return;
59902
- return this.tableStyles[position.sheetId][table.id]().borders[position.col]?.[position.row];
59921
+ try {
59922
+ return this.tableStyles[position.sheetId][table.id]().borders[position.col]?.[position.row];
59923
+ } catch (e) {
59924
+ if (isEvaluationError(e) || e instanceof EvaluationError) return;
59925
+ throw e;
59926
+ }
59903
59927
  }
59904
59928
  computeTableStyle(sheetId, table) {
59905
59929
  return lazy(() => {
@@ -61242,14 +61266,13 @@ var CollaborativePlugin = class extends UIPlugin {
61242
61266
  * Get the list of others connected clients which are present in the same sheet
61243
61267
  * and with a valid position
61244
61268
  */
61245
- getClientsToDisplay() {
61269
+ getClientsToDisplay(sheetId) {
61246
61270
  try {
61247
61271
  this.getters.getCurrentClient();
61248
61272
  } catch (e) {
61249
61273
  if (e instanceof ClientDisconnectedError) return [];
61250
61274
  else throw e;
61251
61275
  }
61252
- const sheetId = this.getters.getActiveSheetId();
61253
61276
  const clients = [];
61254
61277
  for (const client of this.getters.getConnectedClients()) if (client.id !== this.getters.getCurrentClient().id && client.position && client.position.sheetId === sheetId && this.isPositionValid(client.position)) clients.push({
61255
61278
  ...client,
@@ -61260,7 +61283,7 @@ var CollaborativePlugin = class extends UIPlugin {
61260
61283
  drawLayer(renderingContext) {
61261
61284
  if (this.getters.isDashboard()) return;
61262
61285
  const { ctx, thinLineWidth, viewports, sheetId } = renderingContext;
61263
- for (const client of this.getClientsToDisplay()) {
61286
+ for (const client of this.getClientsToDisplay(sheetId)) {
61264
61287
  const { row, col } = client.position;
61265
61288
  const zone = this.getters.expandZone(sheetId, {
61266
61289
  top: row,
@@ -61563,8 +61586,8 @@ var HeaderVisibilityUIPlugin = class extends UIPlugin {
61563
61586
  getNextVisibleCellPosition({ sheetId, col, row }) {
61564
61587
  return {
61565
61588
  sheetId,
61566
- col: this.findVisibleHeader(sheetId, "COL", col, this.getters.getNumberCols(sheetId) - 1),
61567
- row: this.findVisibleHeader(sheetId, "ROW", row, this.getters.getNumberRows(sheetId) - 1)
61589
+ col: this.findVisibleHeader(sheetId, "COL", col, this.getters.getNumberCols(sheetId) - 1) || this.findVisibleHeader(sheetId, "COL", col, 0) || 0,
61590
+ row: this.findVisibleHeader(sheetId, "ROW", row, this.getters.getNumberRows(sheetId) - 1) || this.findVisibleHeader(sheetId, "ROW", row, 0) || 0
61568
61591
  };
61569
61592
  }
61570
61593
  /**
@@ -62551,7 +62574,7 @@ var SheetUIPlugin = class extends UIPlugin {
62551
62574
  if (contentWidth === 0) return 0;
62552
62575
  contentWidth += 2 * 4;
62553
62576
  if (style.wrapping === "wrap") {
62554
- const colWidth = this.getters.getColSize(this.getters.getActiveSheetId(), position.col);
62577
+ const colWidth = this.getters.getColSize(position.sheetId, position.col);
62555
62578
  return Math.min(colWidth, contentWidth);
62556
62579
  }
62557
62580
  return contentWidth;
@@ -68238,6 +68261,7 @@ var SpreadsheetDashboard = class extends _odoo_owl.Component {
68238
68261
  return (0, _odoo_owl.toRaw)(this.clickableCellsStore.clickableCells);
68239
68262
  }
68240
68263
  selectClickableCell(ev, clickableCell) {
68264
+ if (![0, 1].includes(ev.button)) return;
68241
68265
  const { position, action } = clickableCell;
68242
68266
  action(position, this.env, isMiddleClickOrCtrlClick(ev));
68243
68267
  }
@@ -84837,6 +84861,6 @@ exports.stores = stores;
84837
84861
  exports.tokenColors = tokenColors;
84838
84862
  exports.tokenize = tokenize;
84839
84863
 
84840
- __info__.version = "19.3.12";
84841
- __info__.date = "2026-07-20T11:02:44.416Z";
84842
- __info__.hash = "2b42707";
84864
+ __info__.version = "19.3.14";
84865
+ __info__.date = "2026-07-30T06:55:43.749Z";
84866
+ __info__.hash = "3dd5632";
@@ -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.3.12
6
- * @date 2026-07-20T11:02:46.174Z
7
- * @hash 2b42707
5
+ * @version 19.3.14
6
+ * @date 2026-07-30T06:55:45.398Z
7
+ * @hash 3dd5632
8
8
  */
9
9
  :root {
10
10
  --os-gray-100: light-dark(#f9fafb, #1b1d26);
@@ -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.3.12
6
- * @date 2026-07-20T11:02:44.416Z
7
- * @hash 2b42707
5
+ * @version 19.3.14
6
+ * @date 2026-07-30T06:55:43.749Z
7
+ * @hash 3dd5632
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, whenReady, xml } from "@odoo/owl";
@@ -10251,7 +10251,7 @@ function getCalendarChartDatasetAndLabels(definition, args) {
10251
10251
  borderWidth: 1,
10252
10252
  barPercentage: 1,
10253
10253
  categoryPercentage: 1,
10254
- values: dataSetValues.data.map((cell) => isNumberResult(cell) ? cell.value : NaN)
10254
+ values: dataSetValues.data.map((cell) => isNumberResult(cell) ? cell.value : void 0)
10255
10255
  });
10256
10256
  return {
10257
10257
  labels,
@@ -11821,6 +11821,19 @@ function isOtherMobileOS() {
11821
11821
  function isMobileOS() {
11822
11822
  return isAndroid() || isIOS() || isOtherMobileOS();
11823
11823
  }
11824
+ const INTERACTIVE_ELEMENT_SELECTOR = "select, input, textarea, button, .o-select, .os-input, .o-input, .o-button, .o-button-icon, .o-button-link, .o-composer";
11825
+ /** Check if there is an interactive element (input, select, button, ...) between the event.target and event.currentTarget (inclusive)*/
11826
+ function hasInteractiveElementInEventTree(event) {
11827
+ const target = event.target;
11828
+ const root = event.currentTarget;
11829
+ if (!root || !target || !root.contains(target)) return false;
11830
+ let node = target;
11831
+ while (node && node !== root) {
11832
+ if (node.matches(INTERACTIVE_ELEMENT_SELECTOR)) return true;
11833
+ node = node.parentElement;
11834
+ }
11835
+ return root.matches(INTERACTIVE_ELEMENT_SELECTOR);
11836
+ }
11824
11837
 
11825
11838
  //#endregion
11826
11839
  //#region src/components/helpers/zoom.ts
@@ -38040,13 +38053,9 @@ var PivotLayoutConfigurator = class extends Component {
38040
38053
  dimensionsRef = useRef("pivot-dimensions");
38041
38054
  dragAndDrop = useDragAndDropListItems();
38042
38055
  AGGREGATORS = AGGREGATORS;
38043
- composerFocus;
38044
38056
  isDateOrDatetimeField = isDateOrDatetimeField;
38045
- setup() {
38046
- this.composerFocus = useStore(ComposerFocusStore);
38047
- }
38048
38057
  startDragAndDrop(dimension, event) {
38049
- if (event.button !== 0 || event.target.tagName === "SELECT") return;
38058
+ if (event.button !== 0 || hasInteractiveElementInEventTree(event)) return;
38050
38059
  const rects = this.getDimensionElementsRects();
38051
38060
  const { columns, rows } = this.props.definition;
38052
38061
  const draggableIds = [
@@ -38086,7 +38095,7 @@ var PivotLayoutConfigurator = class extends Component {
38086
38095
  return field.type === "date" ? this.props.dateGranularities : this.props.datetimeGranularities;
38087
38096
  }
38088
38097
  startDragAndDropMeasures(measure, event) {
38089
- if (event.button !== 0 || event.target.tagName === "SELECT" || event.target.tagName === "INPUT" || this.composerFocus.focusMode !== "inactive") return;
38098
+ if (event.button !== 0 || hasInteractiveElementInEventTree(event)) return;
38090
38099
  const rects = this.getDimensionElementsRects();
38091
38100
  const { measures, columns, rows } = this.props.definition;
38092
38101
  const draggableIds = measures.map((m) => m.id);
@@ -44155,7 +44164,8 @@ var Autofill = class extends Component {
44155
44164
  const { x, y } = this.state.handler ? this.state.position : this.props.position;
44156
44165
  return cssPropertiesToCss({
44157
44166
  top: `${y}px`,
44158
- left: `${x}px`
44167
+ left: `${x}px`,
44168
+ visibility: this.props.isVisible ? "visible" : "hidden"
44159
44169
  });
44160
44170
  }
44161
44171
  get styleNextValue() {
@@ -44576,7 +44586,7 @@ var CellComposerStore = class extends AbstractComposerStore {
44576
44586
  this._cancelEdition();
44577
44587
  this.resetContent();
44578
44588
  }
44579
- if (cmd.sheetIdFrom !== cmd.sheetIdTo) {
44589
+ if (this.model.selection.isListening(this) && cmd.sheetIdFrom !== cmd.sheetIdTo) {
44580
44590
  const activePosition = this.getters.getActivePosition();
44581
44591
  const { col, row } = this.getters.getNextVisibleCellPosition({
44582
44592
  sheetId: cmd.sheetIdTo,
@@ -48718,6 +48728,10 @@ var Grid = class extends Component {
48718
48728
  get displaySelectionHandler() {
48719
48729
  return this.env.isMobile() && this.composerFocusStore.activeComposer.editionMode === "inactive";
48720
48730
  }
48731
+ get clientsToDisplay() {
48732
+ const sheetId = this.env.model.getters.getActiveSheetId();
48733
+ return this.env.model.getters.getClientsToDisplay(sheetId);
48734
+ }
48721
48735
  };
48722
48736
 
48723
48737
  //#endregion
@@ -59709,12 +59723,22 @@ var TableComputedStylePlugin = class extends UIPlugin {
59709
59723
  getCellTableStyle(position) {
59710
59724
  const table = this.getters.getTable(position);
59711
59725
  if (!table) return;
59712
- return this.tableStyles[position.sheetId][table.id]().styles[position.col]?.[position.row];
59726
+ try {
59727
+ return this.tableStyles[position.sheetId][table.id]().styles[position.col]?.[position.row];
59728
+ } catch (e) {
59729
+ if (isEvaluationError(e) || e instanceof EvaluationError) return;
59730
+ throw e;
59731
+ }
59713
59732
  }
59714
59733
  getCellTableBorder(position) {
59715
59734
  const table = this.getters.getTable(position);
59716
59735
  if (!table) return;
59717
- return this.tableStyles[position.sheetId][table.id]().borders[position.col]?.[position.row];
59736
+ try {
59737
+ return this.tableStyles[position.sheetId][table.id]().borders[position.col]?.[position.row];
59738
+ } catch (e) {
59739
+ if (isEvaluationError(e) || e instanceof EvaluationError) return;
59740
+ throw e;
59741
+ }
59718
59742
  }
59719
59743
  computeTableStyle(sheetId, table) {
59720
59744
  return lazy(() => {
@@ -61057,14 +61081,13 @@ var CollaborativePlugin = class extends UIPlugin {
61057
61081
  * Get the list of others connected clients which are present in the same sheet
61058
61082
  * and with a valid position
61059
61083
  */
61060
- getClientsToDisplay() {
61084
+ getClientsToDisplay(sheetId) {
61061
61085
  try {
61062
61086
  this.getters.getCurrentClient();
61063
61087
  } catch (e) {
61064
61088
  if (e instanceof ClientDisconnectedError) return [];
61065
61089
  else throw e;
61066
61090
  }
61067
- const sheetId = this.getters.getActiveSheetId();
61068
61091
  const clients = [];
61069
61092
  for (const client of this.getters.getConnectedClients()) if (client.id !== this.getters.getCurrentClient().id && client.position && client.position.sheetId === sheetId && this.isPositionValid(client.position)) clients.push({
61070
61093
  ...client,
@@ -61075,7 +61098,7 @@ var CollaborativePlugin = class extends UIPlugin {
61075
61098
  drawLayer(renderingContext) {
61076
61099
  if (this.getters.isDashboard()) return;
61077
61100
  const { ctx, thinLineWidth, viewports, sheetId } = renderingContext;
61078
- for (const client of this.getClientsToDisplay()) {
61101
+ for (const client of this.getClientsToDisplay(sheetId)) {
61079
61102
  const { row, col } = client.position;
61080
61103
  const zone = this.getters.expandZone(sheetId, {
61081
61104
  top: row,
@@ -61378,8 +61401,8 @@ var HeaderVisibilityUIPlugin = class extends UIPlugin {
61378
61401
  getNextVisibleCellPosition({ sheetId, col, row }) {
61379
61402
  return {
61380
61403
  sheetId,
61381
- col: this.findVisibleHeader(sheetId, "COL", col, this.getters.getNumberCols(sheetId) - 1),
61382
- row: this.findVisibleHeader(sheetId, "ROW", row, this.getters.getNumberRows(sheetId) - 1)
61404
+ col: this.findVisibleHeader(sheetId, "COL", col, this.getters.getNumberCols(sheetId) - 1) || this.findVisibleHeader(sheetId, "COL", col, 0) || 0,
61405
+ row: this.findVisibleHeader(sheetId, "ROW", row, this.getters.getNumberRows(sheetId) - 1) || this.findVisibleHeader(sheetId, "ROW", row, 0) || 0
61383
61406
  };
61384
61407
  }
61385
61408
  /**
@@ -62366,7 +62389,7 @@ var SheetUIPlugin = class extends UIPlugin {
62366
62389
  if (contentWidth === 0) return 0;
62367
62390
  contentWidth += 2 * 4;
62368
62391
  if (style.wrapping === "wrap") {
62369
- const colWidth = this.getters.getColSize(this.getters.getActiveSheetId(), position.col);
62392
+ const colWidth = this.getters.getColSize(position.sheetId, position.col);
62370
62393
  return Math.min(colWidth, contentWidth);
62371
62394
  }
62372
62395
  return contentWidth;
@@ -68053,6 +68076,7 @@ var SpreadsheetDashboard = class extends Component {
68053
68076
  return toRaw(this.clickableCellsStore.clickableCells);
68054
68077
  }
68055
68078
  selectClickableCell(ev, clickableCell) {
68079
+ if (![0, 1].includes(ev.button)) return;
68056
68080
  const { position, action } = clickableCell;
68057
68081
  action(position, this.env, isMiddleClickOrCtrlClick(ev));
68058
68082
  }
@@ -84594,6 +84618,6 @@ const chartHelpers = {
84594
84618
  //#endregion
84595
84619
  export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, ClientDisconnectedError, CommandResult, CompiledFormula, CorePlugin, CoreViewPlugin, DEFAULT_LOCALE, DEFAULT_LOCALES, DispatchResult, EvaluationError, LocalTransportService, Model, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, SpreadsheetPivotTable, UIPlugin, __info__, addFunction, addRenderingLayer, astToFormula, canExecuteInReadonly, categories, chartHelpers, components, constants, convertAstNodes, coreTypes, createAutocompleteArgumentsProvider, findCellInNewZone, functionCache, getCaretDownSvg, getCaretUpSvg, helpers, hooks, invalidateCFEvaluationCommands, invalidateChartEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, isCoreCommand, isSheetDependent, iterateAstNodes, links, load, lockedSheetAllowedCommands, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
84596
84620
 
84597
- __info__.version = "19.3.12";
84598
- __info__.date = "2026-07-20T11:02:44.416Z";
84599
- __info__.hash = "2b42707";
84621
+ __info__.version = "19.3.14";
84622
+ __info__.date = "2026-07-30T06:55:43.749Z";
84623
+ __info__.hash = "3dd5632";
@@ -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.3.12
6
- * @date 2026-07-20T11:02:44.416Z
7
- * @hash 2b42707
5
+ * @version 19.3.14
6
+ * @date 2026-07-30T06:55:43.749Z
7
+ * @hash 3dd5632
8
8
  */
9
9
 
10
10
  (function(exports, _odoo_owl) {
@@ -10253,7 +10253,7 @@ stores.inject(MyMetaStore, storeInstance);
10253
10253
  borderWidth: 1,
10254
10254
  barPercentage: 1,
10255
10255
  categoryPercentage: 1,
10256
- values: dataSetValues.data.map((cell) => isNumberResult(cell) ? cell.value : NaN)
10256
+ values: dataSetValues.data.map((cell) => isNumberResult(cell) ? cell.value : void 0)
10257
10257
  });
10258
10258
  return {
10259
10259
  labels,
@@ -11823,6 +11823,19 @@ stores.inject(MyMetaStore, storeInstance);
11823
11823
  function isMobileOS() {
11824
11824
  return isAndroid() || isIOS() || isOtherMobileOS();
11825
11825
  }
11826
+ const INTERACTIVE_ELEMENT_SELECTOR = "select, input, textarea, button, .o-select, .os-input, .o-input, .o-button, .o-button-icon, .o-button-link, .o-composer";
11827
+ /** Check if there is an interactive element (input, select, button, ...) between the event.target and event.currentTarget (inclusive)*/
11828
+ function hasInteractiveElementInEventTree(event) {
11829
+ const target = event.target;
11830
+ const root = event.currentTarget;
11831
+ if (!root || !target || !root.contains(target)) return false;
11832
+ let node = target;
11833
+ while (node && node !== root) {
11834
+ if (node.matches(INTERACTIVE_ELEMENT_SELECTOR)) return true;
11835
+ node = node.parentElement;
11836
+ }
11837
+ return root.matches(INTERACTIVE_ELEMENT_SELECTOR);
11838
+ }
11826
11839
 
11827
11840
  //#endregion
11828
11841
  //#region src/components/helpers/zoom.ts
@@ -38042,13 +38055,9 @@ stores.inject(MyMetaStore, storeInstance);
38042
38055
  dimensionsRef = (0, _odoo_owl.useRef)("pivot-dimensions");
38043
38056
  dragAndDrop = useDragAndDropListItems();
38044
38057
  AGGREGATORS = AGGREGATORS;
38045
- composerFocus;
38046
38058
  isDateOrDatetimeField = isDateOrDatetimeField;
38047
- setup() {
38048
- this.composerFocus = useStore(ComposerFocusStore);
38049
- }
38050
38059
  startDragAndDrop(dimension, event) {
38051
- if (event.button !== 0 || event.target.tagName === "SELECT") return;
38060
+ if (event.button !== 0 || hasInteractiveElementInEventTree(event)) return;
38052
38061
  const rects = this.getDimensionElementsRects();
38053
38062
  const { columns, rows } = this.props.definition;
38054
38063
  const draggableIds = [
@@ -38088,7 +38097,7 @@ stores.inject(MyMetaStore, storeInstance);
38088
38097
  return field.type === "date" ? this.props.dateGranularities : this.props.datetimeGranularities;
38089
38098
  }
38090
38099
  startDragAndDropMeasures(measure, event) {
38091
- if (event.button !== 0 || event.target.tagName === "SELECT" || event.target.tagName === "INPUT" || this.composerFocus.focusMode !== "inactive") return;
38100
+ if (event.button !== 0 || hasInteractiveElementInEventTree(event)) return;
38092
38101
  const rects = this.getDimensionElementsRects();
38093
38102
  const { measures, columns, rows } = this.props.definition;
38094
38103
  const draggableIds = measures.map((m) => m.id);
@@ -44157,7 +44166,8 @@ stores.inject(MyMetaStore, storeInstance);
44157
44166
  const { x, y } = this.state.handler ? this.state.position : this.props.position;
44158
44167
  return cssPropertiesToCss({
44159
44168
  top: `${y}px`,
44160
- left: `${x}px`
44169
+ left: `${x}px`,
44170
+ visibility: this.props.isVisible ? "visible" : "hidden"
44161
44171
  });
44162
44172
  }
44163
44173
  get styleNextValue() {
@@ -44578,7 +44588,7 @@ stores.inject(MyMetaStore, storeInstance);
44578
44588
  this._cancelEdition();
44579
44589
  this.resetContent();
44580
44590
  }
44581
- if (cmd.sheetIdFrom !== cmd.sheetIdTo) {
44591
+ if (this.model.selection.isListening(this) && cmd.sheetIdFrom !== cmd.sheetIdTo) {
44582
44592
  const activePosition = this.getters.getActivePosition();
44583
44593
  const { col, row } = this.getters.getNextVisibleCellPosition({
44584
44594
  sheetId: cmd.sheetIdTo,
@@ -48720,6 +48730,10 @@ stores.inject(MyMetaStore, storeInstance);
48720
48730
  get displaySelectionHandler() {
48721
48731
  return this.env.isMobile() && this.composerFocusStore.activeComposer.editionMode === "inactive";
48722
48732
  }
48733
+ get clientsToDisplay() {
48734
+ const sheetId = this.env.model.getters.getActiveSheetId();
48735
+ return this.env.model.getters.getClientsToDisplay(sheetId);
48736
+ }
48723
48737
  };
48724
48738
 
48725
48739
  //#endregion
@@ -59711,12 +59725,22 @@ stores.inject(MyMetaStore, storeInstance);
59711
59725
  getCellTableStyle(position) {
59712
59726
  const table = this.getters.getTable(position);
59713
59727
  if (!table) return;
59714
- return this.tableStyles[position.sheetId][table.id]().styles[position.col]?.[position.row];
59728
+ try {
59729
+ return this.tableStyles[position.sheetId][table.id]().styles[position.col]?.[position.row];
59730
+ } catch (e) {
59731
+ if (isEvaluationError(e) || e instanceof EvaluationError) return;
59732
+ throw e;
59733
+ }
59715
59734
  }
59716
59735
  getCellTableBorder(position) {
59717
59736
  const table = this.getters.getTable(position);
59718
59737
  if (!table) return;
59719
- return this.tableStyles[position.sheetId][table.id]().borders[position.col]?.[position.row];
59738
+ try {
59739
+ return this.tableStyles[position.sheetId][table.id]().borders[position.col]?.[position.row];
59740
+ } catch (e) {
59741
+ if (isEvaluationError(e) || e instanceof EvaluationError) return;
59742
+ throw e;
59743
+ }
59720
59744
  }
59721
59745
  computeTableStyle(sheetId, table) {
59722
59746
  return lazy(() => {
@@ -61059,14 +61083,13 @@ stores.inject(MyMetaStore, storeInstance);
61059
61083
  * Get the list of others connected clients which are present in the same sheet
61060
61084
  * and with a valid position
61061
61085
  */
61062
- getClientsToDisplay() {
61086
+ getClientsToDisplay(sheetId) {
61063
61087
  try {
61064
61088
  this.getters.getCurrentClient();
61065
61089
  } catch (e) {
61066
61090
  if (e instanceof ClientDisconnectedError) return [];
61067
61091
  else throw e;
61068
61092
  }
61069
- const sheetId = this.getters.getActiveSheetId();
61070
61093
  const clients = [];
61071
61094
  for (const client of this.getters.getConnectedClients()) if (client.id !== this.getters.getCurrentClient().id && client.position && client.position.sheetId === sheetId && this.isPositionValid(client.position)) clients.push({
61072
61095
  ...client,
@@ -61077,7 +61100,7 @@ stores.inject(MyMetaStore, storeInstance);
61077
61100
  drawLayer(renderingContext) {
61078
61101
  if (this.getters.isDashboard()) return;
61079
61102
  const { ctx, thinLineWidth, viewports, sheetId } = renderingContext;
61080
- for (const client of this.getClientsToDisplay()) {
61103
+ for (const client of this.getClientsToDisplay(sheetId)) {
61081
61104
  const { row, col } = client.position;
61082
61105
  const zone = this.getters.expandZone(sheetId, {
61083
61106
  top: row,
@@ -61380,8 +61403,8 @@ stores.inject(MyMetaStore, storeInstance);
61380
61403
  getNextVisibleCellPosition({ sheetId, col, row }) {
61381
61404
  return {
61382
61405
  sheetId,
61383
- col: this.findVisibleHeader(sheetId, "COL", col, this.getters.getNumberCols(sheetId) - 1),
61384
- row: this.findVisibleHeader(sheetId, "ROW", row, this.getters.getNumberRows(sheetId) - 1)
61406
+ col: this.findVisibleHeader(sheetId, "COL", col, this.getters.getNumberCols(sheetId) - 1) || this.findVisibleHeader(sheetId, "COL", col, 0) || 0,
61407
+ row: this.findVisibleHeader(sheetId, "ROW", row, this.getters.getNumberRows(sheetId) - 1) || this.findVisibleHeader(sheetId, "ROW", row, 0) || 0
61385
61408
  };
61386
61409
  }
61387
61410
  /**
@@ -62368,7 +62391,7 @@ stores.inject(MyMetaStore, storeInstance);
62368
62391
  if (contentWidth === 0) return 0;
62369
62392
  contentWidth += 2 * 4;
62370
62393
  if (style.wrapping === "wrap") {
62371
- const colWidth = this.getters.getColSize(this.getters.getActiveSheetId(), position.col);
62394
+ const colWidth = this.getters.getColSize(position.sheetId, position.col);
62372
62395
  return Math.min(colWidth, contentWidth);
62373
62396
  }
62374
62397
  return contentWidth;
@@ -68055,6 +68078,7 @@ stores.inject(MyMetaStore, storeInstance);
68055
68078
  return (0, _odoo_owl.toRaw)(this.clickableCellsStore.clickableCells);
68056
68079
  }
68057
68080
  selectClickableCell(ev, clickableCell) {
68081
+ if (![0, 1].includes(ev.button)) return;
68058
68082
  const { position, action } = clickableCell;
68059
68083
  action(position, this.env, isMiddleClickOrCtrlClick(ev));
68060
68084
  }
@@ -84654,8 +84678,8 @@ exports.stores = stores;
84654
84678
  exports.tokenColors = tokenColors;
84655
84679
  exports.tokenize = tokenize;
84656
84680
 
84657
- __info__.version = "19.3.12";
84658
- __info__.date = "2026-07-20T11:02:44.416Z";
84659
- __info__.hash = "2b42707";
84681
+ __info__.version = "19.3.14";
84682
+ __info__.date = "2026-07-30T06:55:43.749Z";
84683
+ __info__.hash = "3dd5632";
84660
84684
 
84661
84685
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);