@odoo/o-spreadsheet 19.3.10 → 19.3.11

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.10
6
- * @date 2026-07-01T05:04:42.999Z
7
- * @hash 040ae04
5
+ * @version 19.3.11
6
+ * @date 2026-07-13T06:26:28.422Z
7
+ * @hash 35c06d3
8
8
  */
9
9
 
10
10
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
@@ -14141,7 +14141,7 @@ function filterInvalidCalendarDataPoints(labels, datasets) {
14141
14141
  */
14142
14142
  function filterInvalidHierarchicalPoints(values, hierarchy) {
14143
14143
  const numberOfDataPoints = Math.max(values.length, ...hierarchy.map((dataset) => dataset.data?.length || 0));
14144
- const isEmpty = (value) => value === null || value === "";
14144
+ const isEmpty = (value) => value === void 0 || value === null || value === "";
14145
14145
  const dataPointsIndexes = range(0, numberOfDataPoints).filter((dataPointIndex) => {
14146
14146
  const groups = hierarchy.map((dataset) => dataset.data?.[dataPointIndex]);
14147
14147
  if (isEmpty(groups[0]?.value)) return false;
@@ -57126,13 +57126,13 @@ var EvaluationConditionalFormatPlugin = class extends CoreViewPlugin {
57126
57126
  const minValue = this.parsePoint(sheetId, range, rule.minimum, "min");
57127
57127
  const midValue = rule.midpoint ? this.parsePoint(sheetId, range, rule.midpoint) : null;
57128
57128
  const maxValue = this.parsePoint(sheetId, range, rule.maximum, "max");
57129
- if (minValue === null || maxValue === null || minValue >= maxValue || midValue && (minValue >= midValue || midValue >= maxValue)) return;
57129
+ if (minValue === null || maxValue === null || minValue >= maxValue || midValue !== null && (minValue >= midValue || midValue >= maxValue)) return;
57130
57130
  const zone = this.getters.getRangeFromSheetXC(sheetId, range).zone;
57131
57131
  const colorThresholds = [{
57132
57132
  value: minValue,
57133
57133
  color: rule.minimum.color
57134
57134
  }];
57135
- if (rule.midpoint && midValue) colorThresholds.push({
57135
+ if (rule.midpoint && midValue !== null) colorThresholds.push({
57136
57136
  value: midValue,
57137
57137
  color: rule.midpoint.color
57138
57138
  });
@@ -64445,11 +64445,23 @@ var GridSelectionPlugin = class extends UIPlugin {
64445
64445
  ctx.strokeStyle = SELECTION_BORDER_COLOR;
64446
64446
  ctx.lineWidth = 1.5 * thinLineWidth;
64447
64447
  for (const zone of zones) {
64448
+ if (!viewports.isZoneVisibleInViewport(sheetId, zone)) continue;
64448
64449
  const { x, y, width, height } = viewports.getVisibleRect(sheetId, zone);
64449
64450
  ctx.globalCompositeOperation = "multiply";
64450
- ctx.fillRect(x, y, width, height);
64451
- ctx.globalCompositeOperation = "source-over";
64452
- ctx.strokeRect(x, y, width, height);
64451
+ const currentLineWidth = ctx.lineWidth;
64452
+ if (height === 0 || width === 0) ctx.lineWidth = 3 * thinLineWidth;
64453
+ if (height === 0 && width === 0) {
64454
+ ctx.beginPath();
64455
+ ctx.arc(x, y, 3, 0, 2 * Math.PI);
64456
+ ctx.fill();
64457
+ ctx.globalCompositeOperation = "source-over";
64458
+ ctx.stroke();
64459
+ } else {
64460
+ ctx.fillRect(x, y, width, height);
64461
+ ctx.globalCompositeOperation = "source-over";
64462
+ ctx.strokeRect(x, y, width, height);
64463
+ }
64464
+ ctx.lineWidth = currentLineWidth;
64453
64465
  }
64454
64466
  ctx.globalCompositeOperation = "source-over";
64455
64467
  const position = renderingContext.activePosition;
@@ -64596,6 +64608,9 @@ var InternalViewport = class {
64596
64608
  this.adjustViewportZoneX();
64597
64609
  this.adjustViewportZoneY();
64598
64610
  }
64611
+ isZoneVisible(zone) {
64612
+ return intersection(zone, this) !== void 0;
64613
+ }
64599
64614
  /**
64600
64615
  *
64601
64616
  * Computes the visible coordinates & dimensions of a given zone inside the viewport
@@ -64876,6 +64891,9 @@ var ViewportCollection = class {
64876
64891
  isVisibleInViewport({ sheetId, col, row }) {
64877
64892
  return this.getSubViewports(sheetId).some((pane) => pane.isVisible(col, row));
64878
64893
  }
64894
+ isZoneVisibleInViewport(sheetId, zone) {
64895
+ return this.getSubViewports(sheetId).some((pane) => pane.isZoneVisible(zone));
64896
+ }
64879
64897
  getScrollBarWidth() {
64880
64898
  return 15 / this.zoomLevel;
64881
64899
  }
@@ -69407,18 +69425,28 @@ var NamedRangeSelector = class extends _odoo_owl.Component {
69407
69425
  return;
69408
69426
  }
69409
69427
  const activeSheetId = this.env.model.getters.getActiveSheetId();
69410
- if (activeSheetId !== sheetId) this.env.model.dispatch("ACTIVATE_SHEET", {
69411
- sheetIdFrom: activeSheetId,
69412
- sheetIdTo: sheetId
69413
- });
69414
- this.env.model.selection.selectCell(zone.right, zone.bottom);
69428
+ if (activeSheetId !== sheetId) {
69429
+ if (!this.env.model.getters.getSheet(sheetId).isVisible) {
69430
+ this.env.notifyUser({
69431
+ text: _t("The sheet on which the range is defined is hidden."),
69432
+ type: "info",
69433
+ sticky: false
69434
+ });
69435
+ return;
69436
+ }
69437
+ this.env.model.dispatch("ACTIVATE_SHEET", {
69438
+ sheetIdFrom: activeSheetId,
69439
+ sheetIdTo: sheetId
69440
+ });
69441
+ }
69442
+ this.env.model.selection.selectCell(zone.right, zone.bottom, { allowsHiddenSelection: true });
69415
69443
  this.env.model.selection.selectZone({
69416
69444
  cell: {
69417
69445
  col: zone.left,
69418
69446
  row: zone.top
69419
69447
  },
69420
69448
  zone
69421
- });
69449
+ }, { allowsHiddenSelection: true });
69422
69450
  }
69423
69451
  get selectionKey() {
69424
69452
  return `${this.env.model.getters.getActiveSheetId()}-${zoneToXc(this.selectedZone)}`;
@@ -71827,7 +71855,7 @@ var SelectionStreamProcessorImpl = class {
71827
71855
  /**
71828
71856
  * Select a single cell as the new anchor.
71829
71857
  */
71830
- selectCell(col, row) {
71858
+ selectCell(col, row, options) {
71831
71859
  const zone = positionToZone({
71832
71860
  col,
71833
71861
  row
@@ -71838,7 +71866,10 @@ var SelectionStreamProcessorImpl = class {
71838
71866
  col,
71839
71867
  row
71840
71868
  }
71841
- }, { scrollIntoView: true });
71869
+ }, {
71870
+ scrollIntoView: true,
71871
+ ...options
71872
+ });
71842
71873
  }
71843
71874
  /**
71844
71875
  * Set the selection to one of the cells adjacent to the current anchor cell.
@@ -72193,15 +72224,21 @@ var SelectionStreamProcessorImpl = class {
72193
72224
  return DispatchResult.Success;
72194
72225
  }
72195
72226
  checkEventAnchorZone(event) {
72196
- return this.checkAnchorZone(event.anchor);
72227
+ return this.checkAnchorZone(event.anchor, event.options);
72197
72228
  }
72198
- checkAnchorZone(anchor) {
72229
+ checkAnchorZone(anchor, options) {
72199
72230
  const { cell, zone } = anchor;
72200
72231
  if (!isInside(cell.col, cell.row, zone)) return "InvalidAnchorZone";
72201
72232
  const { left, right, top, bottom } = zone;
72202
72233
  const sheetId = this.getters.getActiveSheetId();
72203
- const refCol = this.getters.findVisibleHeader(sheetId, "COL", left, right);
72204
- if (this.getters.findVisibleHeader(sheetId, "ROW", top, bottom) === void 0 || refCol === void 0) return "SelectionOutOfBound";
72234
+ if (!options?.allowsHiddenSelection) {
72235
+ const refCol = this.getters.findVisibleHeader(sheetId, "COL", left, right);
72236
+ if (this.getters.findVisibleHeader(sheetId, "ROW", top, bottom) === void 0 || refCol === void 0) return "SelectionOutOfBound";
72237
+ } else {
72238
+ const numberCols = this.getters.getNumberCols(sheetId);
72239
+ const numberRows = this.getters.getNumberRows(sheetId);
72240
+ if (left < 0 || right > numberCols - 1 || top < 0 || bottom > numberRows - 1) return "SelectionOutOfBound";
72241
+ }
72205
72242
  return "Success";
72206
72243
  }
72207
72244
  checkAnchorZoneOrThrow(anchor) {
@@ -84752,6 +84789,6 @@ exports.stores = stores;
84752
84789
  exports.tokenColors = tokenColors;
84753
84790
  exports.tokenize = tokenize;
84754
84791
 
84755
- __info__.version = "19.3.10";
84756
- __info__.date = "2026-07-01T05:04:42.999Z";
84757
- __info__.hash = "040ae04";
84792
+ __info__.version = "19.3.11";
84793
+ __info__.date = "2026-07-13T06:26:28.422Z";
84794
+ __info__.hash = "35c06d3";
@@ -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.10
6
- * @date 2026-07-01T05:04:44.638Z
7
- * @hash 040ae04
5
+ * @version 19.3.11
6
+ * @date 2026-07-13T06:26:30.150Z
7
+ * @hash 35c06d3
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.10
6
- * @date 2026-07-01T05:04:42.999Z
7
- * @hash 040ae04
5
+ * @version 19.3.11
6
+ * @date 2026-07-13T06:26:28.422Z
7
+ * @hash 35c06d3
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";
@@ -14140,7 +14140,7 @@ function filterInvalidCalendarDataPoints(labels, datasets) {
14140
14140
  */
14141
14141
  function filterInvalidHierarchicalPoints(values, hierarchy) {
14142
14142
  const numberOfDataPoints = Math.max(values.length, ...hierarchy.map((dataset) => dataset.data?.length || 0));
14143
- const isEmpty = (value) => value === null || value === "";
14143
+ const isEmpty = (value) => value === void 0 || value === null || value === "";
14144
14144
  const dataPointsIndexes = range(0, numberOfDataPoints).filter((dataPointIndex) => {
14145
14145
  const groups = hierarchy.map((dataset) => dataset.data?.[dataPointIndex]);
14146
14146
  if (isEmpty(groups[0]?.value)) return false;
@@ -56941,13 +56941,13 @@ var EvaluationConditionalFormatPlugin = class extends CoreViewPlugin {
56941
56941
  const minValue = this.parsePoint(sheetId, range, rule.minimum, "min");
56942
56942
  const midValue = rule.midpoint ? this.parsePoint(sheetId, range, rule.midpoint) : null;
56943
56943
  const maxValue = this.parsePoint(sheetId, range, rule.maximum, "max");
56944
- if (minValue === null || maxValue === null || minValue >= maxValue || midValue && (minValue >= midValue || midValue >= maxValue)) return;
56944
+ if (minValue === null || maxValue === null || minValue >= maxValue || midValue !== null && (minValue >= midValue || midValue >= maxValue)) return;
56945
56945
  const zone = this.getters.getRangeFromSheetXC(sheetId, range).zone;
56946
56946
  const colorThresholds = [{
56947
56947
  value: minValue,
56948
56948
  color: rule.minimum.color
56949
56949
  }];
56950
- if (rule.midpoint && midValue) colorThresholds.push({
56950
+ if (rule.midpoint && midValue !== null) colorThresholds.push({
56951
56951
  value: midValue,
56952
56952
  color: rule.midpoint.color
56953
56953
  });
@@ -64260,11 +64260,23 @@ var GridSelectionPlugin = class extends UIPlugin {
64260
64260
  ctx.strokeStyle = SELECTION_BORDER_COLOR;
64261
64261
  ctx.lineWidth = 1.5 * thinLineWidth;
64262
64262
  for (const zone of zones) {
64263
+ if (!viewports.isZoneVisibleInViewport(sheetId, zone)) continue;
64263
64264
  const { x, y, width, height } = viewports.getVisibleRect(sheetId, zone);
64264
64265
  ctx.globalCompositeOperation = "multiply";
64265
- ctx.fillRect(x, y, width, height);
64266
- ctx.globalCompositeOperation = "source-over";
64267
- ctx.strokeRect(x, y, width, height);
64266
+ const currentLineWidth = ctx.lineWidth;
64267
+ if (height === 0 || width === 0) ctx.lineWidth = 3 * thinLineWidth;
64268
+ if (height === 0 && width === 0) {
64269
+ ctx.beginPath();
64270
+ ctx.arc(x, y, 3, 0, 2 * Math.PI);
64271
+ ctx.fill();
64272
+ ctx.globalCompositeOperation = "source-over";
64273
+ ctx.stroke();
64274
+ } else {
64275
+ ctx.fillRect(x, y, width, height);
64276
+ ctx.globalCompositeOperation = "source-over";
64277
+ ctx.strokeRect(x, y, width, height);
64278
+ }
64279
+ ctx.lineWidth = currentLineWidth;
64268
64280
  }
64269
64281
  ctx.globalCompositeOperation = "source-over";
64270
64282
  const position = renderingContext.activePosition;
@@ -64411,6 +64423,9 @@ var InternalViewport = class {
64411
64423
  this.adjustViewportZoneX();
64412
64424
  this.adjustViewportZoneY();
64413
64425
  }
64426
+ isZoneVisible(zone) {
64427
+ return intersection(zone, this) !== void 0;
64428
+ }
64414
64429
  /**
64415
64430
  *
64416
64431
  * Computes the visible coordinates & dimensions of a given zone inside the viewport
@@ -64691,6 +64706,9 @@ var ViewportCollection = class {
64691
64706
  isVisibleInViewport({ sheetId, col, row }) {
64692
64707
  return this.getSubViewports(sheetId).some((pane) => pane.isVisible(col, row));
64693
64708
  }
64709
+ isZoneVisibleInViewport(sheetId, zone) {
64710
+ return this.getSubViewports(sheetId).some((pane) => pane.isZoneVisible(zone));
64711
+ }
64694
64712
  getScrollBarWidth() {
64695
64713
  return 15 / this.zoomLevel;
64696
64714
  }
@@ -69222,18 +69240,28 @@ var NamedRangeSelector = class extends Component {
69222
69240
  return;
69223
69241
  }
69224
69242
  const activeSheetId = this.env.model.getters.getActiveSheetId();
69225
- if (activeSheetId !== sheetId) this.env.model.dispatch("ACTIVATE_SHEET", {
69226
- sheetIdFrom: activeSheetId,
69227
- sheetIdTo: sheetId
69228
- });
69229
- this.env.model.selection.selectCell(zone.right, zone.bottom);
69243
+ if (activeSheetId !== sheetId) {
69244
+ if (!this.env.model.getters.getSheet(sheetId).isVisible) {
69245
+ this.env.notifyUser({
69246
+ text: _t("The sheet on which the range is defined is hidden."),
69247
+ type: "info",
69248
+ sticky: false
69249
+ });
69250
+ return;
69251
+ }
69252
+ this.env.model.dispatch("ACTIVATE_SHEET", {
69253
+ sheetIdFrom: activeSheetId,
69254
+ sheetIdTo: sheetId
69255
+ });
69256
+ }
69257
+ this.env.model.selection.selectCell(zone.right, zone.bottom, { allowsHiddenSelection: true });
69230
69258
  this.env.model.selection.selectZone({
69231
69259
  cell: {
69232
69260
  col: zone.left,
69233
69261
  row: zone.top
69234
69262
  },
69235
69263
  zone
69236
- });
69264
+ }, { allowsHiddenSelection: true });
69237
69265
  }
69238
69266
  get selectionKey() {
69239
69267
  return `${this.env.model.getters.getActiveSheetId()}-${zoneToXc(this.selectedZone)}`;
@@ -71642,7 +71670,7 @@ var SelectionStreamProcessorImpl = class {
71642
71670
  /**
71643
71671
  * Select a single cell as the new anchor.
71644
71672
  */
71645
- selectCell(col, row) {
71673
+ selectCell(col, row, options) {
71646
71674
  const zone = positionToZone({
71647
71675
  col,
71648
71676
  row
@@ -71653,7 +71681,10 @@ var SelectionStreamProcessorImpl = class {
71653
71681
  col,
71654
71682
  row
71655
71683
  }
71656
- }, { scrollIntoView: true });
71684
+ }, {
71685
+ scrollIntoView: true,
71686
+ ...options
71687
+ });
71657
71688
  }
71658
71689
  /**
71659
71690
  * Set the selection to one of the cells adjacent to the current anchor cell.
@@ -72008,15 +72039,21 @@ var SelectionStreamProcessorImpl = class {
72008
72039
  return DispatchResult.Success;
72009
72040
  }
72010
72041
  checkEventAnchorZone(event) {
72011
- return this.checkAnchorZone(event.anchor);
72042
+ return this.checkAnchorZone(event.anchor, event.options);
72012
72043
  }
72013
- checkAnchorZone(anchor) {
72044
+ checkAnchorZone(anchor, options) {
72014
72045
  const { cell, zone } = anchor;
72015
72046
  if (!isInside(cell.col, cell.row, zone)) return "InvalidAnchorZone";
72016
72047
  const { left, right, top, bottom } = zone;
72017
72048
  const sheetId = this.getters.getActiveSheetId();
72018
- const refCol = this.getters.findVisibleHeader(sheetId, "COL", left, right);
72019
- if (this.getters.findVisibleHeader(sheetId, "ROW", top, bottom) === void 0 || refCol === void 0) return "SelectionOutOfBound";
72049
+ if (!options?.allowsHiddenSelection) {
72050
+ const refCol = this.getters.findVisibleHeader(sheetId, "COL", left, right);
72051
+ if (this.getters.findVisibleHeader(sheetId, "ROW", top, bottom) === void 0 || refCol === void 0) return "SelectionOutOfBound";
72052
+ } else {
72053
+ const numberCols = this.getters.getNumberCols(sheetId);
72054
+ const numberRows = this.getters.getNumberRows(sheetId);
72055
+ if (left < 0 || right > numberCols - 1 || top < 0 || bottom > numberRows - 1) return "SelectionOutOfBound";
72056
+ }
72020
72057
  return "Success";
72021
72058
  }
72022
72059
  checkAnchorZoneOrThrow(anchor) {
@@ -84509,6 +84546,6 @@ const chartHelpers = {
84509
84546
  //#endregion
84510
84547
  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 };
84511
84548
 
84512
- __info__.version = "19.3.10";
84513
- __info__.date = "2026-07-01T05:04:42.999Z";
84514
- __info__.hash = "040ae04";
84549
+ __info__.version = "19.3.11";
84550
+ __info__.date = "2026-07-13T06:26:28.422Z";
84551
+ __info__.hash = "35c06d3";
@@ -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.10
6
- * @date 2026-07-01T05:04:42.999Z
7
- * @hash 040ae04
5
+ * @version 19.3.11
6
+ * @date 2026-07-13T06:26:28.422Z
7
+ * @hash 35c06d3
8
8
  */
9
9
 
10
10
  (function(exports, _odoo_owl) {
@@ -14142,7 +14142,7 @@ stores.inject(MyMetaStore, storeInstance);
14142
14142
  */
14143
14143
  function filterInvalidHierarchicalPoints(values, hierarchy) {
14144
14144
  const numberOfDataPoints = Math.max(values.length, ...hierarchy.map((dataset) => dataset.data?.length || 0));
14145
- const isEmpty = (value) => value === null || value === "";
14145
+ const isEmpty = (value) => value === void 0 || value === null || value === "";
14146
14146
  const dataPointsIndexes = range(0, numberOfDataPoints).filter((dataPointIndex) => {
14147
14147
  const groups = hierarchy.map((dataset) => dataset.data?.[dataPointIndex]);
14148
14148
  if (isEmpty(groups[0]?.value)) return false;
@@ -56943,13 +56943,13 @@ stores.inject(MyMetaStore, storeInstance);
56943
56943
  const minValue = this.parsePoint(sheetId, range, rule.minimum, "min");
56944
56944
  const midValue = rule.midpoint ? this.parsePoint(sheetId, range, rule.midpoint) : null;
56945
56945
  const maxValue = this.parsePoint(sheetId, range, rule.maximum, "max");
56946
- if (minValue === null || maxValue === null || minValue >= maxValue || midValue && (minValue >= midValue || midValue >= maxValue)) return;
56946
+ if (minValue === null || maxValue === null || minValue >= maxValue || midValue !== null && (minValue >= midValue || midValue >= maxValue)) return;
56947
56947
  const zone = this.getters.getRangeFromSheetXC(sheetId, range).zone;
56948
56948
  const colorThresholds = [{
56949
56949
  value: minValue,
56950
56950
  color: rule.minimum.color
56951
56951
  }];
56952
- if (rule.midpoint && midValue) colorThresholds.push({
56952
+ if (rule.midpoint && midValue !== null) colorThresholds.push({
56953
56953
  value: midValue,
56954
56954
  color: rule.midpoint.color
56955
56955
  });
@@ -64262,11 +64262,23 @@ stores.inject(MyMetaStore, storeInstance);
64262
64262
  ctx.strokeStyle = SELECTION_BORDER_COLOR;
64263
64263
  ctx.lineWidth = 1.5 * thinLineWidth;
64264
64264
  for (const zone of zones) {
64265
+ if (!viewports.isZoneVisibleInViewport(sheetId, zone)) continue;
64265
64266
  const { x, y, width, height } = viewports.getVisibleRect(sheetId, zone);
64266
64267
  ctx.globalCompositeOperation = "multiply";
64267
- ctx.fillRect(x, y, width, height);
64268
- ctx.globalCompositeOperation = "source-over";
64269
- ctx.strokeRect(x, y, width, height);
64268
+ const currentLineWidth = ctx.lineWidth;
64269
+ if (height === 0 || width === 0) ctx.lineWidth = 3 * thinLineWidth;
64270
+ if (height === 0 && width === 0) {
64271
+ ctx.beginPath();
64272
+ ctx.arc(x, y, 3, 0, 2 * Math.PI);
64273
+ ctx.fill();
64274
+ ctx.globalCompositeOperation = "source-over";
64275
+ ctx.stroke();
64276
+ } else {
64277
+ ctx.fillRect(x, y, width, height);
64278
+ ctx.globalCompositeOperation = "source-over";
64279
+ ctx.strokeRect(x, y, width, height);
64280
+ }
64281
+ ctx.lineWidth = currentLineWidth;
64270
64282
  }
64271
64283
  ctx.globalCompositeOperation = "source-over";
64272
64284
  const position = renderingContext.activePosition;
@@ -64413,6 +64425,9 @@ stores.inject(MyMetaStore, storeInstance);
64413
64425
  this.adjustViewportZoneX();
64414
64426
  this.adjustViewportZoneY();
64415
64427
  }
64428
+ isZoneVisible(zone) {
64429
+ return intersection(zone, this) !== void 0;
64430
+ }
64416
64431
  /**
64417
64432
  *
64418
64433
  * Computes the visible coordinates & dimensions of a given zone inside the viewport
@@ -64693,6 +64708,9 @@ stores.inject(MyMetaStore, storeInstance);
64693
64708
  isVisibleInViewport({ sheetId, col, row }) {
64694
64709
  return this.getSubViewports(sheetId).some((pane) => pane.isVisible(col, row));
64695
64710
  }
64711
+ isZoneVisibleInViewport(sheetId, zone) {
64712
+ return this.getSubViewports(sheetId).some((pane) => pane.isZoneVisible(zone));
64713
+ }
64696
64714
  getScrollBarWidth() {
64697
64715
  return 15 / this.zoomLevel;
64698
64716
  }
@@ -69224,18 +69242,28 @@ stores.inject(MyMetaStore, storeInstance);
69224
69242
  return;
69225
69243
  }
69226
69244
  const activeSheetId = this.env.model.getters.getActiveSheetId();
69227
- if (activeSheetId !== sheetId) this.env.model.dispatch("ACTIVATE_SHEET", {
69228
- sheetIdFrom: activeSheetId,
69229
- sheetIdTo: sheetId
69230
- });
69231
- this.env.model.selection.selectCell(zone.right, zone.bottom);
69245
+ if (activeSheetId !== sheetId) {
69246
+ if (!this.env.model.getters.getSheet(sheetId).isVisible) {
69247
+ this.env.notifyUser({
69248
+ text: _t("The sheet on which the range is defined is hidden."),
69249
+ type: "info",
69250
+ sticky: false
69251
+ });
69252
+ return;
69253
+ }
69254
+ this.env.model.dispatch("ACTIVATE_SHEET", {
69255
+ sheetIdFrom: activeSheetId,
69256
+ sheetIdTo: sheetId
69257
+ });
69258
+ }
69259
+ this.env.model.selection.selectCell(zone.right, zone.bottom, { allowsHiddenSelection: true });
69232
69260
  this.env.model.selection.selectZone({
69233
69261
  cell: {
69234
69262
  col: zone.left,
69235
69263
  row: zone.top
69236
69264
  },
69237
69265
  zone
69238
- });
69266
+ }, { allowsHiddenSelection: true });
69239
69267
  }
69240
69268
  get selectionKey() {
69241
69269
  return `${this.env.model.getters.getActiveSheetId()}-${zoneToXc(this.selectedZone)}`;
@@ -71644,7 +71672,7 @@ stores.inject(MyMetaStore, storeInstance);
71644
71672
  /**
71645
71673
  * Select a single cell as the new anchor.
71646
71674
  */
71647
- selectCell(col, row) {
71675
+ selectCell(col, row, options) {
71648
71676
  const zone = positionToZone({
71649
71677
  col,
71650
71678
  row
@@ -71655,7 +71683,10 @@ stores.inject(MyMetaStore, storeInstance);
71655
71683
  col,
71656
71684
  row
71657
71685
  }
71658
- }, { scrollIntoView: true });
71686
+ }, {
71687
+ scrollIntoView: true,
71688
+ ...options
71689
+ });
71659
71690
  }
71660
71691
  /**
71661
71692
  * Set the selection to one of the cells adjacent to the current anchor cell.
@@ -72010,15 +72041,21 @@ stores.inject(MyMetaStore, storeInstance);
72010
72041
  return DispatchResult.Success;
72011
72042
  }
72012
72043
  checkEventAnchorZone(event) {
72013
- return this.checkAnchorZone(event.anchor);
72044
+ return this.checkAnchorZone(event.anchor, event.options);
72014
72045
  }
72015
- checkAnchorZone(anchor) {
72046
+ checkAnchorZone(anchor, options) {
72016
72047
  const { cell, zone } = anchor;
72017
72048
  if (!isInside(cell.col, cell.row, zone)) return "InvalidAnchorZone";
72018
72049
  const { left, right, top, bottom } = zone;
72019
72050
  const sheetId = this.getters.getActiveSheetId();
72020
- const refCol = this.getters.findVisibleHeader(sheetId, "COL", left, right);
72021
- if (this.getters.findVisibleHeader(sheetId, "ROW", top, bottom) === void 0 || refCol === void 0) return "SelectionOutOfBound";
72051
+ if (!options?.allowsHiddenSelection) {
72052
+ const refCol = this.getters.findVisibleHeader(sheetId, "COL", left, right);
72053
+ if (this.getters.findVisibleHeader(sheetId, "ROW", top, bottom) === void 0 || refCol === void 0) return "SelectionOutOfBound";
72054
+ } else {
72055
+ const numberCols = this.getters.getNumberCols(sheetId);
72056
+ const numberRows = this.getters.getNumberRows(sheetId);
72057
+ if (left < 0 || right > numberCols - 1 || top < 0 || bottom > numberRows - 1) return "SelectionOutOfBound";
72058
+ }
72022
72059
  return "Success";
72023
72060
  }
72024
72061
  checkAnchorZoneOrThrow(anchor) {
@@ -84569,8 +84606,8 @@ exports.stores = stores;
84569
84606
  exports.tokenColors = tokenColors;
84570
84607
  exports.tokenize = tokenize;
84571
84608
 
84572
- __info__.version = "19.3.10";
84573
- __info__.date = "2026-07-01T05:04:42.999Z";
84574
- __info__.hash = "040ae04";
84609
+ __info__.version = "19.3.11";
84610
+ __info__.date = "2026-07-13T06:26:28.422Z";
84611
+ __info__.hash = "35c06d3";
84575
84612
 
84576
84613
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);