@odoo/o-spreadsheet 19.4.4 → 19.4.6

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.4.4
6
- * @date 2026-07-23T07:49:22.265Z
7
- * @hash 6b3c312
5
+ * @version 19.4.6
6
+ * @date 2026-08-10T12:33:32.728Z
7
+ * @hash 5c667fe
8
8
  */
9
9
 
10
10
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
@@ -348,6 +348,19 @@ function isOtherMobileOS() {
348
348
  function isMobileOS() {
349
349
  return isAndroid() || isIOS() || isOtherMobileOS();
350
350
  }
351
+ const INTERACTIVE_ELEMENT_SELECTOR = "select, input, textarea, button, .o-select, .os-input, .o-input, .o-button, .o-button-icon, .o-button-link, .o-composer";
352
+ /** Check if there is an interactive element (input, select, button, ...) between the event.target and event.currentTarget (inclusive)*/
353
+ function hasInteractiveElementInEventTree(event) {
354
+ const target = event.target;
355
+ const root = event.currentTarget;
356
+ if (!root || !target || !root.contains(target)) return false;
357
+ let node = target;
358
+ while (node && node !== root) {
359
+ if (node.matches(INTERACTIVE_ELEMENT_SELECTOR)) return true;
360
+ node = node.parentElement;
361
+ }
362
+ return root.matches(INTERACTIVE_ELEMENT_SELECTOR);
363
+ }
351
364
 
352
365
  //#endregion
353
366
  //#region src/actions/action.ts
@@ -8903,6 +8916,25 @@ const funnelTooltipPositioner = function(elements) {
8903
8916
  };
8904
8917
  };
8905
8918
 
8919
+ //#endregion
8920
+ //#region src/components/figures/chart/chartJs/chartjs_geo_projection_plugin.ts
8921
+ /**
8922
+ * ChartJS plugin to apply custom changes to a d3 projection.
8923
+ *
8924
+ * We pass the projection as a string instead of a customized d3 object so
8925
+ * Chart.js creates a fresh projection instance. Custom changes (e.g. rotation)
8926
+ * are then applied in `beforeUpdate`.
8927
+ *
8928
+ * This is important because Chart.js mutates the projection instance at runtime,
8929
+ * and a customize d3 projection object would not be copied during deepCopy.
8930
+ */
8931
+ const geoProjectionPlugin = {
8932
+ id: "geoProjection",
8933
+ beforeUpdate(chart) {
8934
+ if (chart.options?.scales?.projection?.projection === "conicConformal") chart.scales?.projection?.projection?.rotate([100, 0]);
8935
+ }
8936
+ };
8937
+
8906
8938
  //#endregion
8907
8939
  //#region src/components/figures/chart/chartJs/chartjs_minor_grid_plugin.ts
8908
8940
  const chartMinorGridPlugin = {
@@ -10706,7 +10738,7 @@ function getGeoChartScales(definition, args) {
10706
10738
  const format = axisFormats?.y || axisFormats?.y1;
10707
10739
  return {
10708
10740
  projection: {
10709
- projection: getGeoChartProjection(region?.defaultProjection || "mercator"),
10741
+ projection: region?.defaultProjection || "mercator",
10710
10742
  axis: "x"
10711
10743
  },
10712
10744
  color: {
@@ -10758,10 +10790,6 @@ function getFunnelChartScales(definition, args) {
10758
10790
  }
10759
10791
  };
10760
10792
  }
10761
- function getGeoChartProjection(projection) {
10762
- if (globalThis.ChartGeo && projection === "conicConformal") return globalThis.ChartGeo.geoConicConformal().rotate([100, 0]);
10763
- return projection;
10764
- }
10765
10793
  function getChartAxisTitleRuntime(design) {
10766
10794
  if (design?.title?.text) {
10767
10795
  const { text, color, align, italic, bold } = design.title;
@@ -10963,7 +10991,7 @@ function getCalendarChartDatasetAndLabels(definition, args) {
10963
10991
  borderWidth: 1,
10964
10992
  barPercentage: 1,
10965
10993
  categoryPercentage: 1,
10966
- values: dataSetValues.data.map((cell) => isNumberResult(cell) ? cell.value : NaN)
10994
+ values: dataSetValues.data.map((cell) => isNumberResult(cell) ? cell.value : void 0)
10967
10995
  });
10968
10996
  return {
10969
10997
  labels,
@@ -11722,6 +11750,10 @@ chartJsExtensionRegistry.add("chartBackgroundPlugin", {
11722
11750
  register: (Chart) => Chart.register(chartBackgroundPlugin),
11723
11751
  unregister: (Chart) => Chart.unregister(chartBackgroundPlugin)
11724
11752
  });
11753
+ chartJsExtensionRegistry.add("geoProjectionPlugin", {
11754
+ register: (Chart) => Chart.register(geoProjectionPlugin),
11755
+ unregister: (Chart) => Chart.unregister(geoProjectionPlugin)
11756
+ });
11725
11757
  var ChartJsComponent = class extends Component {
11726
11758
  static template = "o-spreadsheet-ChartJsComponent";
11727
11759
  props = (0, _odoo_owl.useProps)({
@@ -15571,7 +15603,7 @@ var FigureComponent = class extends Component {
15571
15603
  figures.push({
15572
15604
  sheetId,
15573
15605
  figureId,
15574
- ...this.postionInBoundary(this.env.model.getters.getFigureUI(sheetId, figure), ev.key, ev.shiftKey)
15606
+ ...this.positionInBoundary(sheetId, this.env.model.getters.getFigureUI(sheetId, figure), ev.key, ev.shiftKey)
15575
15607
  });
15576
15608
  }
15577
15609
  this.env.model.dispatch("MOVE_FIGURES", { figures });
@@ -15591,21 +15623,23 @@ var FigureComponent = class extends Component {
15591
15623
  break;
15592
15624
  }
15593
15625
  }
15594
- postionInBoundary(position, key, shift) {
15595
- const sheetId = this.env.model.getters.getActiveSheetId();
15626
+ positionInBoundary(sheetId, figure, key, shift) {
15596
15627
  const shiftAmount = shift ? 1 : 5;
15597
- let { col, row, offset } = position;
15628
+ let { col, row, offset } = figure;
15598
15629
  offset = { ...offset };
15630
+ const maxAnchor = this.env.model.getters.getMaxAnchorOffset(sheetId, figure.height, figure.width);
15599
15631
  switch (key) {
15600
15632
  case "ArrowUp":
15601
15633
  if (offset.y < shiftAmount) {
15602
15634
  row--;
15635
+ while (row > 0 && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row--;
15603
15636
  offset.y = this.env.model.getters.getRowSize(sheetId, row) - shiftAmount + offset.y;
15604
15637
  } else offset.y -= shiftAmount;
15605
15638
  break;
15606
15639
  case "ArrowLeft":
15607
15640
  if (offset.x < shiftAmount) {
15608
15641
  col--;
15642
+ while (col > 0 && this.env.model.getters.isColHiddenByUser(sheetId, col)) col--;
15609
15643
  offset.x = this.env.model.getters.getColSize(sheetId, col) - shiftAmount + offset.x;
15610
15644
  } else offset.x -= shiftAmount;
15611
15645
  break;
@@ -15613,6 +15647,7 @@ var FigureComponent = class extends Component {
15613
15647
  const rowSize = this.env.model.getters.getRowSize(sheetId, row);
15614
15648
  if (offset.y + shiftAmount >= rowSize) {
15615
15649
  row++;
15650
+ while (row <= maxAnchor.row && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row++;
15616
15651
  offset.y = offset.y + shiftAmount - rowSize;
15617
15652
  } else offset.y += shiftAmount;
15618
15653
  break;
@@ -15620,9 +15655,24 @@ var FigureComponent = class extends Component {
15620
15655
  const colSize = this.env.model.getters.getColSize(sheetId, col);
15621
15656
  if (offset.x + shiftAmount >= colSize) {
15622
15657
  col++;
15658
+ while (col <= maxAnchor.col && this.env.model.getters.isColHiddenByUser(sheetId, col)) col++;
15623
15659
  offset.x = offset.x + shiftAmount - colSize;
15624
15660
  } else offset.x += shiftAmount;
15625
15661
  }
15662
+ if (col < 0) {
15663
+ col = 0;
15664
+ offset.x = 0;
15665
+ } else if (col > maxAnchor.col || col === maxAnchor.col && offset.x > maxAnchor.offset.x) {
15666
+ col = maxAnchor.col;
15667
+ offset.x = maxAnchor.offset.x;
15668
+ }
15669
+ if (row < 0) {
15670
+ row = 0;
15671
+ offset.y = 0;
15672
+ } else if (row > maxAnchor.row || row === maxAnchor.row && offset.y > maxAnchor.offset.y) {
15673
+ row = maxAnchor.row;
15674
+ offset.y = maxAnchor.offset.y;
15675
+ }
15626
15676
  return {
15627
15677
  col,
15628
15678
  row,
@@ -39315,13 +39365,9 @@ var PivotLayoutConfigurator = class extends Component {
39315
39365
  dimensionsRef = (0, _odoo_owl.signal)(null);
39316
39366
  dragAndDrop = useDragAndDropListItems();
39317
39367
  AGGREGATORS = AGGREGATORS;
39318
- composerFocus;
39319
39368
  isDateOrDatetimeField = isDateOrDatetimeField;
39320
- setup() {
39321
- this.composerFocus = useStore(ComposerFocusStore);
39322
- }
39323
39369
  startDragAndDrop(dimension, event) {
39324
- if (event.button !== 0 || event.target.tagName === "SELECT") return;
39370
+ if (event.button !== 0 || hasInteractiveElementInEventTree(event)) return;
39325
39371
  const rects = this.getDimensionElementsRects();
39326
39372
  const { columns, rows } = this.props.definition;
39327
39373
  const draggableIds = [
@@ -39361,7 +39407,7 @@ var PivotLayoutConfigurator = class extends Component {
39361
39407
  return field.type === "date" ? this.props.dateGranularities : this.props.datetimeGranularities;
39362
39408
  }
39363
39409
  startDragAndDropMeasures(measure, event) {
39364
- if (event.button !== 0 || event.target.tagName === "SELECT" || event.target.tagName === "INPUT" || this.composerFocus.focusMode !== "inactive") return;
39410
+ if (event.button !== 0 || hasInteractiveElementInEventTree(event)) return;
39365
39411
  const rects = this.getDimensionElementsRects();
39366
39412
  const { measures, columns, rows } = this.props.definition;
39367
39413
  const draggableIds = measures.map((m) => m.id);
@@ -46012,7 +46058,13 @@ var CellComposerStore = class extends AbstractComposerStore {
46012
46058
  const cell = this.getters.getEvaluatedCell(position);
46013
46059
  if (cell.link && !isFormula(content)) content = markdownLink(content, cell.link.url);
46014
46060
  const currentFormat = this.getters.getCell(position)?.format;
46015
- const afterFormat = currentFormat === "@" || currentFormat && isDateTimeFormat(currentFormat) ? void 0 : detectDateFormat(content, this.getters.getLocale());
46061
+ const isCurrentFormatDate = currentFormat && isDateTimeFormat(currentFormat);
46062
+ const contentDateFormat = detectDateFormat(content, this.getters.getLocale());
46063
+ let afterFormat;
46064
+ if (currentFormat !== "@") {
46065
+ if (contentDateFormat && !isCurrentFormatDate) afterFormat = contentDateFormat;
46066
+ else if (isCurrentFormatDate && isNumber(content, this.getters.getLocale())) afterFormat = "";
46067
+ }
46016
46068
  this.addHeadersForSpreadingFormula(content);
46017
46069
  result = this.model.dispatch("UPDATE_CELL", {
46018
46070
  ...this.currentEditedCell,
@@ -51719,7 +51771,7 @@ var CellPlugin = class extends CorePlugin {
51719
51771
  positionsByStyle[styleId] ??= [];
51720
51772
  positionsByStyle[styleId].push(position);
51721
51773
  }
51722
- if (cell.format) {
51774
+ if (cell.format !== void 0) {
51723
51775
  const formatId = getItemId(cell.format, formats);
51724
51776
  positionsByFormat[formatId] ??= [];
51725
51777
  positionsByFormat[formatId].push(position);
@@ -52896,22 +52948,19 @@ var DefaultPlugin = class extends CorePlugin {
52896
52948
  getDefaultFormatInCell(sheetId, zones, priorities) {
52897
52949
  const defaults = [];
52898
52950
  for (const position of zones.flatMap((zone) => cellPositions(sheetId, zone))) {
52899
- if (this.getters.getCell(position)?.format) continue;
52951
+ if (this.getters.getCell(position)?.format !== void 0) continue;
52900
52952
  const rowDefault = this.format[sheetId]?.rowDefault?.[position.row];
52901
- if (rowDefault) {
52953
+ if (rowDefault !== void 0) {
52902
52954
  if (priorities.shouldUseDefaultRow) defaults.push([position, rowDefault]);
52903
52955
  continue;
52904
52956
  }
52905
52957
  const colDefault = this.format[sheetId]?.colDefault?.[position.col];
52906
- if (colDefault) {
52958
+ if (colDefault !== void 0) {
52907
52959
  if (priorities.shouldUseDefaultCol) defaults.push([position, colDefault]);
52908
52960
  continue;
52909
52961
  }
52910
- const sheetDefault = this.format[sheetId]?.sheetDefault;
52911
- if (sheetDefault) {
52912
- if (priorities.shouldUseDefaultSheet) defaults.push([position, sheetDefault]);
52913
- continue;
52914
- }
52962
+ const sheetDefault = this.format[sheetId]?.sheetDefault ?? "";
52963
+ if (priorities.shouldUseDefaultSheet) defaults.push([position, sheetDefault]);
52915
52964
  }
52916
52965
  return defaults;
52917
52966
  }
@@ -64504,7 +64553,7 @@ var SheetUIPlugin = class extends UIPlugin {
64504
64553
  if (contentWidth === 0) return 0;
64505
64554
  contentWidth += 2 * 4;
64506
64555
  if (style.wrapping === "wrap") {
64507
- const colWidth = this.getters.getColSize(this.getters.getActiveSheetId(), position.col);
64556
+ const colWidth = this.getters.getColSize(position.sheetId, position.col);
64508
64557
  return Math.min(colWidth, contentWidth);
64509
64558
  }
64510
64559
  return contentWidth;
@@ -67870,6 +67919,10 @@ function inverseCreateFigure(cmd) {
67870
67919
  }
67871
67920
  function inverseCreateChart(cmd) {
67872
67921
  return [{
67922
+ type: "DELETE_CHART",
67923
+ chartId: cmd.chartId,
67924
+ sheetId: cmd.sheetId
67925
+ }, {
67873
67926
  type: "DELETE_FIGURE",
67874
67927
  figureId: cmd.figureId,
67875
67928
  sheetId: cmd.sheetId
@@ -69747,6 +69800,7 @@ var SpreadsheetDashboard = class extends Component {
69747
69800
  return (0, _odoo_owl.toRaw)(this.clickableCellsStore.clickableCells);
69748
69801
  }
69749
69802
  selectClickableCell(ev, clickableCell) {
69803
+ if (![0, 1].includes(ev.button)) return;
69750
69804
  const { position, action } = clickableCell;
69751
69805
  action(position, this.env, isMiddleClickOrCtrlClick(ev));
69752
69806
  }
@@ -87705,7 +87759,8 @@ const components = {
87705
87759
  FullScreenFigure,
87706
87760
  NumberInput,
87707
87761
  TopBar,
87708
- Composer
87762
+ Composer,
87763
+ CarouselFigure
87709
87764
  };
87710
87765
  const hooks = {
87711
87766
  useDragAndDropListItems,
@@ -87859,6 +87914,6 @@ exports.stores = stores;
87859
87914
  exports.tokenColors = tokenColors;
87860
87915
  exports.tokenize = tokenize;
87861
87916
 
87862
- __info__.version = "19.4.4";
87863
- __info__.date = "2026-07-23T07:49:22.265Z";
87864
- __info__.hash = "6b3c312";
87917
+ __info__.version = "19.4.6";
87918
+ __info__.date = "2026-08-10T12:33:32.728Z";
87919
+ __info__.hash = "5c667fe";
@@ -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.4.4
6
- * @date 2026-07-23T07:49:24.023Z
7
- * @hash 6b3c312
5
+ * @version 19.4.6
6
+ * @date 2026-08-10T12:33:34.157Z
7
+ * @hash 5c667fe
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.4.4
6
- * @date 2026-07-23T07:49:22.265Z
7
- * @hash 6b3c312
5
+ * @version 19.4.6
6
+ * @date 2026-08-10T12:33:32.728Z
7
+ * @hash 5c667fe
8
8
  */
9
9
 
10
10
  import * as owl from "@odoo/owl";
@@ -347,6 +347,19 @@ function isOtherMobileOS() {
347
347
  function isMobileOS() {
348
348
  return isAndroid() || isIOS() || isOtherMobileOS();
349
349
  }
350
+ const INTERACTIVE_ELEMENT_SELECTOR = "select, input, textarea, button, .o-select, .os-input, .o-input, .o-button, .o-button-icon, .o-button-link, .o-composer";
351
+ /** Check if there is an interactive element (input, select, button, ...) between the event.target and event.currentTarget (inclusive)*/
352
+ function hasInteractiveElementInEventTree(event) {
353
+ const target = event.target;
354
+ const root = event.currentTarget;
355
+ if (!root || !target || !root.contains(target)) return false;
356
+ let node = target;
357
+ while (node && node !== root) {
358
+ if (node.matches(INTERACTIVE_ELEMENT_SELECTOR)) return true;
359
+ node = node.parentElement;
360
+ }
361
+ return root.matches(INTERACTIVE_ELEMENT_SELECTOR);
362
+ }
350
363
 
351
364
  //#endregion
352
365
  //#region src/actions/action.ts
@@ -8902,6 +8915,25 @@ const funnelTooltipPositioner = function(elements) {
8902
8915
  };
8903
8916
  };
8904
8917
 
8918
+ //#endregion
8919
+ //#region src/components/figures/chart/chartJs/chartjs_geo_projection_plugin.ts
8920
+ /**
8921
+ * ChartJS plugin to apply custom changes to a d3 projection.
8922
+ *
8923
+ * We pass the projection as a string instead of a customized d3 object so
8924
+ * Chart.js creates a fresh projection instance. Custom changes (e.g. rotation)
8925
+ * are then applied in `beforeUpdate`.
8926
+ *
8927
+ * This is important because Chart.js mutates the projection instance at runtime,
8928
+ * and a customize d3 projection object would not be copied during deepCopy.
8929
+ */
8930
+ const geoProjectionPlugin = {
8931
+ id: "geoProjection",
8932
+ beforeUpdate(chart) {
8933
+ if (chart.options?.scales?.projection?.projection === "conicConformal") chart.scales?.projection?.projection?.rotate([100, 0]);
8934
+ }
8935
+ };
8936
+
8905
8937
  //#endregion
8906
8938
  //#region src/components/figures/chart/chartJs/chartjs_minor_grid_plugin.ts
8907
8939
  const chartMinorGridPlugin = {
@@ -10705,7 +10737,7 @@ function getGeoChartScales(definition, args) {
10705
10737
  const format = axisFormats?.y || axisFormats?.y1;
10706
10738
  return {
10707
10739
  projection: {
10708
- projection: getGeoChartProjection(region?.defaultProjection || "mercator"),
10740
+ projection: region?.defaultProjection || "mercator",
10709
10741
  axis: "x"
10710
10742
  },
10711
10743
  color: {
@@ -10757,10 +10789,6 @@ function getFunnelChartScales(definition, args) {
10757
10789
  }
10758
10790
  };
10759
10791
  }
10760
- function getGeoChartProjection(projection) {
10761
- if (globalThis.ChartGeo && projection === "conicConformal") return globalThis.ChartGeo.geoConicConformal().rotate([100, 0]);
10762
- return projection;
10763
- }
10764
10792
  function getChartAxisTitleRuntime(design) {
10765
10793
  if (design?.title?.text) {
10766
10794
  const { text, color, align, italic, bold } = design.title;
@@ -10962,7 +10990,7 @@ function getCalendarChartDatasetAndLabels(definition, args) {
10962
10990
  borderWidth: 1,
10963
10991
  barPercentage: 1,
10964
10992
  categoryPercentage: 1,
10965
- values: dataSetValues.data.map((cell) => isNumberResult(cell) ? cell.value : NaN)
10993
+ values: dataSetValues.data.map((cell) => isNumberResult(cell) ? cell.value : void 0)
10966
10994
  });
10967
10995
  return {
10968
10996
  labels,
@@ -11721,6 +11749,10 @@ chartJsExtensionRegistry.add("chartBackgroundPlugin", {
11721
11749
  register: (Chart) => Chart.register(chartBackgroundPlugin),
11722
11750
  unregister: (Chart) => Chart.unregister(chartBackgroundPlugin)
11723
11751
  });
11752
+ chartJsExtensionRegistry.add("geoProjectionPlugin", {
11753
+ register: (Chart) => Chart.register(geoProjectionPlugin),
11754
+ unregister: (Chart) => Chart.unregister(geoProjectionPlugin)
11755
+ });
11724
11756
  var ChartJsComponent = class extends Component {
11725
11757
  static template = "o-spreadsheet-ChartJsComponent";
11726
11758
  props = useProps({
@@ -15570,7 +15602,7 @@ var FigureComponent = class extends Component {
15570
15602
  figures.push({
15571
15603
  sheetId,
15572
15604
  figureId,
15573
- ...this.postionInBoundary(this.env.model.getters.getFigureUI(sheetId, figure), ev.key, ev.shiftKey)
15605
+ ...this.positionInBoundary(sheetId, this.env.model.getters.getFigureUI(sheetId, figure), ev.key, ev.shiftKey)
15574
15606
  });
15575
15607
  }
15576
15608
  this.env.model.dispatch("MOVE_FIGURES", { figures });
@@ -15590,21 +15622,23 @@ var FigureComponent = class extends Component {
15590
15622
  break;
15591
15623
  }
15592
15624
  }
15593
- postionInBoundary(position, key, shift) {
15594
- const sheetId = this.env.model.getters.getActiveSheetId();
15625
+ positionInBoundary(sheetId, figure, key, shift) {
15595
15626
  const shiftAmount = shift ? 1 : 5;
15596
- let { col, row, offset } = position;
15627
+ let { col, row, offset } = figure;
15597
15628
  offset = { ...offset };
15629
+ const maxAnchor = this.env.model.getters.getMaxAnchorOffset(sheetId, figure.height, figure.width);
15598
15630
  switch (key) {
15599
15631
  case "ArrowUp":
15600
15632
  if (offset.y < shiftAmount) {
15601
15633
  row--;
15634
+ while (row > 0 && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row--;
15602
15635
  offset.y = this.env.model.getters.getRowSize(sheetId, row) - shiftAmount + offset.y;
15603
15636
  } else offset.y -= shiftAmount;
15604
15637
  break;
15605
15638
  case "ArrowLeft":
15606
15639
  if (offset.x < shiftAmount) {
15607
15640
  col--;
15641
+ while (col > 0 && this.env.model.getters.isColHiddenByUser(sheetId, col)) col--;
15608
15642
  offset.x = this.env.model.getters.getColSize(sheetId, col) - shiftAmount + offset.x;
15609
15643
  } else offset.x -= shiftAmount;
15610
15644
  break;
@@ -15612,6 +15646,7 @@ var FigureComponent = class extends Component {
15612
15646
  const rowSize = this.env.model.getters.getRowSize(sheetId, row);
15613
15647
  if (offset.y + shiftAmount >= rowSize) {
15614
15648
  row++;
15649
+ while (row <= maxAnchor.row && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row++;
15615
15650
  offset.y = offset.y + shiftAmount - rowSize;
15616
15651
  } else offset.y += shiftAmount;
15617
15652
  break;
@@ -15619,9 +15654,24 @@ var FigureComponent = class extends Component {
15619
15654
  const colSize = this.env.model.getters.getColSize(sheetId, col);
15620
15655
  if (offset.x + shiftAmount >= colSize) {
15621
15656
  col++;
15657
+ while (col <= maxAnchor.col && this.env.model.getters.isColHiddenByUser(sheetId, col)) col++;
15622
15658
  offset.x = offset.x + shiftAmount - colSize;
15623
15659
  } else offset.x += shiftAmount;
15624
15660
  }
15661
+ if (col < 0) {
15662
+ col = 0;
15663
+ offset.x = 0;
15664
+ } else if (col > maxAnchor.col || col === maxAnchor.col && offset.x > maxAnchor.offset.x) {
15665
+ col = maxAnchor.col;
15666
+ offset.x = maxAnchor.offset.x;
15667
+ }
15668
+ if (row < 0) {
15669
+ row = 0;
15670
+ offset.y = 0;
15671
+ } else if (row > maxAnchor.row || row === maxAnchor.row && offset.y > maxAnchor.offset.y) {
15672
+ row = maxAnchor.row;
15673
+ offset.y = maxAnchor.offset.y;
15674
+ }
15625
15675
  return {
15626
15676
  col,
15627
15677
  row,
@@ -39314,13 +39364,9 @@ var PivotLayoutConfigurator = class extends Component {
39314
39364
  dimensionsRef = signal(null);
39315
39365
  dragAndDrop = useDragAndDropListItems();
39316
39366
  AGGREGATORS = AGGREGATORS;
39317
- composerFocus;
39318
39367
  isDateOrDatetimeField = isDateOrDatetimeField;
39319
- setup() {
39320
- this.composerFocus = useStore(ComposerFocusStore);
39321
- }
39322
39368
  startDragAndDrop(dimension, event) {
39323
- if (event.button !== 0 || event.target.tagName === "SELECT") return;
39369
+ if (event.button !== 0 || hasInteractiveElementInEventTree(event)) return;
39324
39370
  const rects = this.getDimensionElementsRects();
39325
39371
  const { columns, rows } = this.props.definition;
39326
39372
  const draggableIds = [
@@ -39360,7 +39406,7 @@ var PivotLayoutConfigurator = class extends Component {
39360
39406
  return field.type === "date" ? this.props.dateGranularities : this.props.datetimeGranularities;
39361
39407
  }
39362
39408
  startDragAndDropMeasures(measure, event) {
39363
- if (event.button !== 0 || event.target.tagName === "SELECT" || event.target.tagName === "INPUT" || this.composerFocus.focusMode !== "inactive") return;
39409
+ if (event.button !== 0 || hasInteractiveElementInEventTree(event)) return;
39364
39410
  const rects = this.getDimensionElementsRects();
39365
39411
  const { measures, columns, rows } = this.props.definition;
39366
39412
  const draggableIds = measures.map((m) => m.id);
@@ -46011,7 +46057,13 @@ var CellComposerStore = class extends AbstractComposerStore {
46011
46057
  const cell = this.getters.getEvaluatedCell(position);
46012
46058
  if (cell.link && !isFormula(content)) content = markdownLink(content, cell.link.url);
46013
46059
  const currentFormat = this.getters.getCell(position)?.format;
46014
- const afterFormat = currentFormat === "@" || currentFormat && isDateTimeFormat(currentFormat) ? void 0 : detectDateFormat(content, this.getters.getLocale());
46060
+ const isCurrentFormatDate = currentFormat && isDateTimeFormat(currentFormat);
46061
+ const contentDateFormat = detectDateFormat(content, this.getters.getLocale());
46062
+ let afterFormat;
46063
+ if (currentFormat !== "@") {
46064
+ if (contentDateFormat && !isCurrentFormatDate) afterFormat = contentDateFormat;
46065
+ else if (isCurrentFormatDate && isNumber(content, this.getters.getLocale())) afterFormat = "";
46066
+ }
46015
46067
  this.addHeadersForSpreadingFormula(content);
46016
46068
  result = this.model.dispatch("UPDATE_CELL", {
46017
46069
  ...this.currentEditedCell,
@@ -51718,7 +51770,7 @@ var CellPlugin = class extends CorePlugin {
51718
51770
  positionsByStyle[styleId] ??= [];
51719
51771
  positionsByStyle[styleId].push(position);
51720
51772
  }
51721
- if (cell.format) {
51773
+ if (cell.format !== void 0) {
51722
51774
  const formatId = getItemId(cell.format, formats);
51723
51775
  positionsByFormat[formatId] ??= [];
51724
51776
  positionsByFormat[formatId].push(position);
@@ -52895,22 +52947,19 @@ var DefaultPlugin = class extends CorePlugin {
52895
52947
  getDefaultFormatInCell(sheetId, zones, priorities) {
52896
52948
  const defaults = [];
52897
52949
  for (const position of zones.flatMap((zone) => cellPositions(sheetId, zone))) {
52898
- if (this.getters.getCell(position)?.format) continue;
52950
+ if (this.getters.getCell(position)?.format !== void 0) continue;
52899
52951
  const rowDefault = this.format[sheetId]?.rowDefault?.[position.row];
52900
- if (rowDefault) {
52952
+ if (rowDefault !== void 0) {
52901
52953
  if (priorities.shouldUseDefaultRow) defaults.push([position, rowDefault]);
52902
52954
  continue;
52903
52955
  }
52904
52956
  const colDefault = this.format[sheetId]?.colDefault?.[position.col];
52905
- if (colDefault) {
52957
+ if (colDefault !== void 0) {
52906
52958
  if (priorities.shouldUseDefaultCol) defaults.push([position, colDefault]);
52907
52959
  continue;
52908
52960
  }
52909
- const sheetDefault = this.format[sheetId]?.sheetDefault;
52910
- if (sheetDefault) {
52911
- if (priorities.shouldUseDefaultSheet) defaults.push([position, sheetDefault]);
52912
- continue;
52913
- }
52961
+ const sheetDefault = this.format[sheetId]?.sheetDefault ?? "";
52962
+ if (priorities.shouldUseDefaultSheet) defaults.push([position, sheetDefault]);
52914
52963
  }
52915
52964
  return defaults;
52916
52965
  }
@@ -64319,7 +64368,7 @@ var SheetUIPlugin = class extends UIPlugin {
64319
64368
  if (contentWidth === 0) return 0;
64320
64369
  contentWidth += 2 * 4;
64321
64370
  if (style.wrapping === "wrap") {
64322
- const colWidth = this.getters.getColSize(this.getters.getActiveSheetId(), position.col);
64371
+ const colWidth = this.getters.getColSize(position.sheetId, position.col);
64323
64372
  return Math.min(colWidth, contentWidth);
64324
64373
  }
64325
64374
  return contentWidth;
@@ -67685,6 +67734,10 @@ function inverseCreateFigure(cmd) {
67685
67734
  }
67686
67735
  function inverseCreateChart(cmd) {
67687
67736
  return [{
67737
+ type: "DELETE_CHART",
67738
+ chartId: cmd.chartId,
67739
+ sheetId: cmd.sheetId
67740
+ }, {
67688
67741
  type: "DELETE_FIGURE",
67689
67742
  figureId: cmd.figureId,
67690
67743
  sheetId: cmd.sheetId
@@ -69562,6 +69615,7 @@ var SpreadsheetDashboard = class extends Component {
69562
69615
  return toRaw(this.clickableCellsStore.clickableCells);
69563
69616
  }
69564
69617
  selectClickableCell(ev, clickableCell) {
69618
+ if (![0, 1].includes(ev.button)) return;
69565
69619
  const { position, action } = clickableCell;
69566
69620
  action(position, this.env, isMiddleClickOrCtrlClick(ev));
69567
69621
  }
@@ -87520,7 +87574,8 @@ const components = {
87520
87574
  FullScreenFigure,
87521
87575
  NumberInput,
87522
87576
  TopBar,
87523
- Composer
87577
+ Composer,
87578
+ CarouselFigure
87524
87579
  };
87525
87580
  const hooks = {
87526
87581
  useDragAndDropListItems,
@@ -87580,6 +87635,6 @@ const chartHelpers = {
87580
87635
  //#endregion
87581
87636
  export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, BadExpressionError, CHART_TYPES, CellErrorType, CellValueType, CircularDependencyError, ClientDisconnectedError, ClipboardMIMEType, CommandResult, CompiledFormula, CorePlugin, CoreViewPlugin, DEFAULT_LOCALE, DEFAULT_LOCALES, DEFAULT_LOCALE_DIGIT_GROUPING, DIRECTION, DispatchResult, DivisionByZeroError, EvaluationError, InvalidReferenceError, LocalTransportService, Model, NEXT_VALUE, NotAvailableError, NumberTooLargeError, OrderedLayers, PREVIOUS_VALUE, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, SplillBlockedError, Spreadsheet, SpreadsheetPivotTable, UIPlugin, UnknownFunctionError, __info__, addFunction, addRenderingLayer, astToFormula, availableConditionalFormatOperators, availableDataValidationOperators, availableFiltersOperators, borderPositions, borderStyles, canExecuteInReadonly, categories, chartHelpers, compatibility, components, composerFocusTypes, constants, convertAstNodes, coreTypes, createAutocompleteArgumentsProvider, errorTypes, filterDateCriterionOperators, filterNumberCriterionOperators, filterTextCriterionOperators, findCellInNewZone, functionCache, getCaretDownSvg, getCaretUpSvg, helpers, hooks, invalidSubtotalFormulasCommands, invalidateBordersCommands, invalidateCFEvaluationCommands, invalidateChartEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, isCoreCommand, isHeadersDependant, isMatrix, isPositionDependent, isRangeDependant, isSheetDependent, isTargetDependent, isZoneDependent, iterateAstNodes, links, load, lockedSheetAllowedCommands, parse, parseTokens, readonlyAllowedCommands, registries, schemeToColorScale, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
87582
87637
 
87583
- __info__.version = "19.4.4";
87584
- __info__.date = "2026-07-23T07:49:22.265Z";
87585
- __info__.hash = "6b3c312";
87638
+ __info__.version = "19.4.6";
87639
+ __info__.date = "2026-08-10T12:33:32.728Z";
87640
+ __info__.hash = "5c667fe";