@odoo/o-spreadsheet 19.4.5 → 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.5
6
- * @date 2026-07-30T06:55:39.923Z
7
- * @hash 9308e17
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' });
@@ -8916,6 +8916,25 @@ const funnelTooltipPositioner = function(elements) {
8916
8916
  };
8917
8917
  };
8918
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
+
8919
8938
  //#endregion
8920
8939
  //#region src/components/figures/chart/chartJs/chartjs_minor_grid_plugin.ts
8921
8940
  const chartMinorGridPlugin = {
@@ -10719,7 +10738,7 @@ function getGeoChartScales(definition, args) {
10719
10738
  const format = axisFormats?.y || axisFormats?.y1;
10720
10739
  return {
10721
10740
  projection: {
10722
- projection: getGeoChartProjection(region?.defaultProjection || "mercator"),
10741
+ projection: region?.defaultProjection || "mercator",
10723
10742
  axis: "x"
10724
10743
  },
10725
10744
  color: {
@@ -10771,10 +10790,6 @@ function getFunnelChartScales(definition, args) {
10771
10790
  }
10772
10791
  };
10773
10792
  }
10774
- function getGeoChartProjection(projection) {
10775
- if (globalThis.ChartGeo && projection === "conicConformal") return globalThis.ChartGeo.geoConicConformal().rotate([100, 0]);
10776
- return projection;
10777
- }
10778
10793
  function getChartAxisTitleRuntime(design) {
10779
10794
  if (design?.title?.text) {
10780
10795
  const { text, color, align, italic, bold } = design.title;
@@ -11735,6 +11750,10 @@ chartJsExtensionRegistry.add("chartBackgroundPlugin", {
11735
11750
  register: (Chart) => Chart.register(chartBackgroundPlugin),
11736
11751
  unregister: (Chart) => Chart.unregister(chartBackgroundPlugin)
11737
11752
  });
11753
+ chartJsExtensionRegistry.add("geoProjectionPlugin", {
11754
+ register: (Chart) => Chart.register(geoProjectionPlugin),
11755
+ unregister: (Chart) => Chart.unregister(geoProjectionPlugin)
11756
+ });
11738
11757
  var ChartJsComponent = class extends Component {
11739
11758
  static template = "o-spreadsheet-ChartJsComponent";
11740
11759
  props = (0, _odoo_owl.useProps)({
@@ -15584,7 +15603,7 @@ var FigureComponent = class extends Component {
15584
15603
  figures.push({
15585
15604
  sheetId,
15586
15605
  figureId,
15587
- ...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)
15588
15607
  });
15589
15608
  }
15590
15609
  this.env.model.dispatch("MOVE_FIGURES", { figures });
@@ -15604,21 +15623,23 @@ var FigureComponent = class extends Component {
15604
15623
  break;
15605
15624
  }
15606
15625
  }
15607
- postionInBoundary(position, key, shift) {
15608
- const sheetId = this.env.model.getters.getActiveSheetId();
15626
+ positionInBoundary(sheetId, figure, key, shift) {
15609
15627
  const shiftAmount = shift ? 1 : 5;
15610
- let { col, row, offset } = position;
15628
+ let { col, row, offset } = figure;
15611
15629
  offset = { ...offset };
15630
+ const maxAnchor = this.env.model.getters.getMaxAnchorOffset(sheetId, figure.height, figure.width);
15612
15631
  switch (key) {
15613
15632
  case "ArrowUp":
15614
15633
  if (offset.y < shiftAmount) {
15615
15634
  row--;
15635
+ while (row > 0 && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row--;
15616
15636
  offset.y = this.env.model.getters.getRowSize(sheetId, row) - shiftAmount + offset.y;
15617
15637
  } else offset.y -= shiftAmount;
15618
15638
  break;
15619
15639
  case "ArrowLeft":
15620
15640
  if (offset.x < shiftAmount) {
15621
15641
  col--;
15642
+ while (col > 0 && this.env.model.getters.isColHiddenByUser(sheetId, col)) col--;
15622
15643
  offset.x = this.env.model.getters.getColSize(sheetId, col) - shiftAmount + offset.x;
15623
15644
  } else offset.x -= shiftAmount;
15624
15645
  break;
@@ -15626,6 +15647,7 @@ var FigureComponent = class extends Component {
15626
15647
  const rowSize = this.env.model.getters.getRowSize(sheetId, row);
15627
15648
  if (offset.y + shiftAmount >= rowSize) {
15628
15649
  row++;
15650
+ while (row <= maxAnchor.row && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row++;
15629
15651
  offset.y = offset.y + shiftAmount - rowSize;
15630
15652
  } else offset.y += shiftAmount;
15631
15653
  break;
@@ -15633,9 +15655,24 @@ var FigureComponent = class extends Component {
15633
15655
  const colSize = this.env.model.getters.getColSize(sheetId, col);
15634
15656
  if (offset.x + shiftAmount >= colSize) {
15635
15657
  col++;
15658
+ while (col <= maxAnchor.col && this.env.model.getters.isColHiddenByUser(sheetId, col)) col++;
15636
15659
  offset.x = offset.x + shiftAmount - colSize;
15637
15660
  } else offset.x += shiftAmount;
15638
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
+ }
15639
15676
  return {
15640
15677
  col,
15641
15678
  row,
@@ -46021,7 +46058,13 @@ var CellComposerStore = class extends AbstractComposerStore {
46021
46058
  const cell = this.getters.getEvaluatedCell(position);
46022
46059
  if (cell.link && !isFormula(content)) content = markdownLink(content, cell.link.url);
46023
46060
  const currentFormat = this.getters.getCell(position)?.format;
46024
- 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
+ }
46025
46068
  this.addHeadersForSpreadingFormula(content);
46026
46069
  result = this.model.dispatch("UPDATE_CELL", {
46027
46070
  ...this.currentEditedCell,
@@ -67876,6 +67919,10 @@ function inverseCreateFigure(cmd) {
67876
67919
  }
67877
67920
  function inverseCreateChart(cmd) {
67878
67921
  return [{
67922
+ type: "DELETE_CHART",
67923
+ chartId: cmd.chartId,
67924
+ sheetId: cmd.sheetId
67925
+ }, {
67879
67926
  type: "DELETE_FIGURE",
67880
67927
  figureId: cmd.figureId,
67881
67928
  sheetId: cmd.sheetId
@@ -87712,7 +87759,8 @@ const components = {
87712
87759
  FullScreenFigure,
87713
87760
  NumberInput,
87714
87761
  TopBar,
87715
- Composer
87762
+ Composer,
87763
+ CarouselFigure
87716
87764
  };
87717
87765
  const hooks = {
87718
87766
  useDragAndDropListItems,
@@ -87866,6 +87914,6 @@ exports.stores = stores;
87866
87914
  exports.tokenColors = tokenColors;
87867
87915
  exports.tokenize = tokenize;
87868
87916
 
87869
- __info__.version = "19.4.5";
87870
- __info__.date = "2026-07-30T06:55:39.923Z";
87871
- __info__.hash = "9308e17";
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.5
6
- * @date 2026-07-30T06:55:41.389Z
7
- * @hash 9308e17
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.5
6
- * @date 2026-07-30T06:55:39.923Z
7
- * @hash 9308e17
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";
@@ -8915,6 +8915,25 @@ const funnelTooltipPositioner = function(elements) {
8915
8915
  };
8916
8916
  };
8917
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
+
8918
8937
  //#endregion
8919
8938
  //#region src/components/figures/chart/chartJs/chartjs_minor_grid_plugin.ts
8920
8939
  const chartMinorGridPlugin = {
@@ -10718,7 +10737,7 @@ function getGeoChartScales(definition, args) {
10718
10737
  const format = axisFormats?.y || axisFormats?.y1;
10719
10738
  return {
10720
10739
  projection: {
10721
- projection: getGeoChartProjection(region?.defaultProjection || "mercator"),
10740
+ projection: region?.defaultProjection || "mercator",
10722
10741
  axis: "x"
10723
10742
  },
10724
10743
  color: {
@@ -10770,10 +10789,6 @@ function getFunnelChartScales(definition, args) {
10770
10789
  }
10771
10790
  };
10772
10791
  }
10773
- function getGeoChartProjection(projection) {
10774
- if (globalThis.ChartGeo && projection === "conicConformal") return globalThis.ChartGeo.geoConicConformal().rotate([100, 0]);
10775
- return projection;
10776
- }
10777
10792
  function getChartAxisTitleRuntime(design) {
10778
10793
  if (design?.title?.text) {
10779
10794
  const { text, color, align, italic, bold } = design.title;
@@ -11734,6 +11749,10 @@ chartJsExtensionRegistry.add("chartBackgroundPlugin", {
11734
11749
  register: (Chart) => Chart.register(chartBackgroundPlugin),
11735
11750
  unregister: (Chart) => Chart.unregister(chartBackgroundPlugin)
11736
11751
  });
11752
+ chartJsExtensionRegistry.add("geoProjectionPlugin", {
11753
+ register: (Chart) => Chart.register(geoProjectionPlugin),
11754
+ unregister: (Chart) => Chart.unregister(geoProjectionPlugin)
11755
+ });
11737
11756
  var ChartJsComponent = class extends Component {
11738
11757
  static template = "o-spreadsheet-ChartJsComponent";
11739
11758
  props = useProps({
@@ -15583,7 +15602,7 @@ var FigureComponent = class extends Component {
15583
15602
  figures.push({
15584
15603
  sheetId,
15585
15604
  figureId,
15586
- ...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)
15587
15606
  });
15588
15607
  }
15589
15608
  this.env.model.dispatch("MOVE_FIGURES", { figures });
@@ -15603,21 +15622,23 @@ var FigureComponent = class extends Component {
15603
15622
  break;
15604
15623
  }
15605
15624
  }
15606
- postionInBoundary(position, key, shift) {
15607
- const sheetId = this.env.model.getters.getActiveSheetId();
15625
+ positionInBoundary(sheetId, figure, key, shift) {
15608
15626
  const shiftAmount = shift ? 1 : 5;
15609
- let { col, row, offset } = position;
15627
+ let { col, row, offset } = figure;
15610
15628
  offset = { ...offset };
15629
+ const maxAnchor = this.env.model.getters.getMaxAnchorOffset(sheetId, figure.height, figure.width);
15611
15630
  switch (key) {
15612
15631
  case "ArrowUp":
15613
15632
  if (offset.y < shiftAmount) {
15614
15633
  row--;
15634
+ while (row > 0 && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row--;
15615
15635
  offset.y = this.env.model.getters.getRowSize(sheetId, row) - shiftAmount + offset.y;
15616
15636
  } else offset.y -= shiftAmount;
15617
15637
  break;
15618
15638
  case "ArrowLeft":
15619
15639
  if (offset.x < shiftAmount) {
15620
15640
  col--;
15641
+ while (col > 0 && this.env.model.getters.isColHiddenByUser(sheetId, col)) col--;
15621
15642
  offset.x = this.env.model.getters.getColSize(sheetId, col) - shiftAmount + offset.x;
15622
15643
  } else offset.x -= shiftAmount;
15623
15644
  break;
@@ -15625,6 +15646,7 @@ var FigureComponent = class extends Component {
15625
15646
  const rowSize = this.env.model.getters.getRowSize(sheetId, row);
15626
15647
  if (offset.y + shiftAmount >= rowSize) {
15627
15648
  row++;
15649
+ while (row <= maxAnchor.row && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row++;
15628
15650
  offset.y = offset.y + shiftAmount - rowSize;
15629
15651
  } else offset.y += shiftAmount;
15630
15652
  break;
@@ -15632,9 +15654,24 @@ var FigureComponent = class extends Component {
15632
15654
  const colSize = this.env.model.getters.getColSize(sheetId, col);
15633
15655
  if (offset.x + shiftAmount >= colSize) {
15634
15656
  col++;
15657
+ while (col <= maxAnchor.col && this.env.model.getters.isColHiddenByUser(sheetId, col)) col++;
15635
15658
  offset.x = offset.x + shiftAmount - colSize;
15636
15659
  } else offset.x += shiftAmount;
15637
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
+ }
15638
15675
  return {
15639
15676
  col,
15640
15677
  row,
@@ -46020,7 +46057,13 @@ var CellComposerStore = class extends AbstractComposerStore {
46020
46057
  const cell = this.getters.getEvaluatedCell(position);
46021
46058
  if (cell.link && !isFormula(content)) content = markdownLink(content, cell.link.url);
46022
46059
  const currentFormat = this.getters.getCell(position)?.format;
46023
- 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
+ }
46024
46067
  this.addHeadersForSpreadingFormula(content);
46025
46068
  result = this.model.dispatch("UPDATE_CELL", {
46026
46069
  ...this.currentEditedCell,
@@ -67691,6 +67734,10 @@ function inverseCreateFigure(cmd) {
67691
67734
  }
67692
67735
  function inverseCreateChart(cmd) {
67693
67736
  return [{
67737
+ type: "DELETE_CHART",
67738
+ chartId: cmd.chartId,
67739
+ sheetId: cmd.sheetId
67740
+ }, {
67694
67741
  type: "DELETE_FIGURE",
67695
67742
  figureId: cmd.figureId,
67696
67743
  sheetId: cmd.sheetId
@@ -87527,7 +87574,8 @@ const components = {
87527
87574
  FullScreenFigure,
87528
87575
  NumberInput,
87529
87576
  TopBar,
87530
- Composer
87577
+ Composer,
87578
+ CarouselFigure
87531
87579
  };
87532
87580
  const hooks = {
87533
87581
  useDragAndDropListItems,
@@ -87587,6 +87635,6 @@ const chartHelpers = {
87587
87635
  //#endregion
87588
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 };
87589
87637
 
87590
- __info__.version = "19.4.5";
87591
- __info__.date = "2026-07-30T06:55:39.923Z";
87592
- __info__.hash = "9308e17";
87638
+ __info__.version = "19.4.6";
87639
+ __info__.date = "2026-08-10T12:33:32.728Z";
87640
+ __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.5
6
- * @date 2026-07-30T06:55:39.923Z
7
- * @hash 9308e17
5
+ * @version 19.4.6
6
+ * @date 2026-08-10T12:33:32.728Z
7
+ * @hash 5c667fe
8
8
  */
9
9
 
10
10
  (function(exports, _odoo_owl) {
@@ -8917,6 +8917,25 @@ set(value) {
8917
8917
  };
8918
8918
  };
8919
8919
 
8920
+ //#endregion
8921
+ //#region src/components/figures/chart/chartJs/chartjs_geo_projection_plugin.ts
8922
+ /**
8923
+ * ChartJS plugin to apply custom changes to a d3 projection.
8924
+ *
8925
+ * We pass the projection as a string instead of a customized d3 object so
8926
+ * Chart.js creates a fresh projection instance. Custom changes (e.g. rotation)
8927
+ * are then applied in `beforeUpdate`.
8928
+ *
8929
+ * This is important because Chart.js mutates the projection instance at runtime,
8930
+ * and a customize d3 projection object would not be copied during deepCopy.
8931
+ */
8932
+ const geoProjectionPlugin = {
8933
+ id: "geoProjection",
8934
+ beforeUpdate(chart) {
8935
+ if (chart.options?.scales?.projection?.projection === "conicConformal") chart.scales?.projection?.projection?.rotate([100, 0]);
8936
+ }
8937
+ };
8938
+
8920
8939
  //#endregion
8921
8940
  //#region src/components/figures/chart/chartJs/chartjs_minor_grid_plugin.ts
8922
8941
  const chartMinorGridPlugin = {
@@ -10720,7 +10739,7 @@ set(value) {
10720
10739
  const format = axisFormats?.y || axisFormats?.y1;
10721
10740
  return {
10722
10741
  projection: {
10723
- projection: getGeoChartProjection(region?.defaultProjection || "mercator"),
10742
+ projection: region?.defaultProjection || "mercator",
10724
10743
  axis: "x"
10725
10744
  },
10726
10745
  color: {
@@ -10772,10 +10791,6 @@ set(value) {
10772
10791
  }
10773
10792
  };
10774
10793
  }
10775
- function getGeoChartProjection(projection) {
10776
- if (globalThis.ChartGeo && projection === "conicConformal") return globalThis.ChartGeo.geoConicConformal().rotate([100, 0]);
10777
- return projection;
10778
- }
10779
10794
  function getChartAxisTitleRuntime(design) {
10780
10795
  if (design?.title?.text) {
10781
10796
  const { text, color, align, italic, bold } = design.title;
@@ -11736,6 +11751,10 @@ set(value) {
11736
11751
  register: (Chart) => Chart.register(chartBackgroundPlugin),
11737
11752
  unregister: (Chart) => Chart.unregister(chartBackgroundPlugin)
11738
11753
  });
11754
+ chartJsExtensionRegistry.add("geoProjectionPlugin", {
11755
+ register: (Chart) => Chart.register(geoProjectionPlugin),
11756
+ unregister: (Chart) => Chart.unregister(geoProjectionPlugin)
11757
+ });
11739
11758
  var ChartJsComponent = class extends Component {
11740
11759
  static template = "o-spreadsheet-ChartJsComponent";
11741
11760
  props = (0, _odoo_owl.useProps)({
@@ -15585,7 +15604,7 @@ set(value) {
15585
15604
  figures.push({
15586
15605
  sheetId,
15587
15606
  figureId,
15588
- ...this.postionInBoundary(this.env.model.getters.getFigureUI(sheetId, figure), ev.key, ev.shiftKey)
15607
+ ...this.positionInBoundary(sheetId, this.env.model.getters.getFigureUI(sheetId, figure), ev.key, ev.shiftKey)
15589
15608
  });
15590
15609
  }
15591
15610
  this.env.model.dispatch("MOVE_FIGURES", { figures });
@@ -15605,21 +15624,23 @@ set(value) {
15605
15624
  break;
15606
15625
  }
15607
15626
  }
15608
- postionInBoundary(position, key, shift) {
15609
- const sheetId = this.env.model.getters.getActiveSheetId();
15627
+ positionInBoundary(sheetId, figure, key, shift) {
15610
15628
  const shiftAmount = shift ? 1 : 5;
15611
- let { col, row, offset } = position;
15629
+ let { col, row, offset } = figure;
15612
15630
  offset = { ...offset };
15631
+ const maxAnchor = this.env.model.getters.getMaxAnchorOffset(sheetId, figure.height, figure.width);
15613
15632
  switch (key) {
15614
15633
  case "ArrowUp":
15615
15634
  if (offset.y < shiftAmount) {
15616
15635
  row--;
15636
+ while (row > 0 && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row--;
15617
15637
  offset.y = this.env.model.getters.getRowSize(sheetId, row) - shiftAmount + offset.y;
15618
15638
  } else offset.y -= shiftAmount;
15619
15639
  break;
15620
15640
  case "ArrowLeft":
15621
15641
  if (offset.x < shiftAmount) {
15622
15642
  col--;
15643
+ while (col > 0 && this.env.model.getters.isColHiddenByUser(sheetId, col)) col--;
15623
15644
  offset.x = this.env.model.getters.getColSize(sheetId, col) - shiftAmount + offset.x;
15624
15645
  } else offset.x -= shiftAmount;
15625
15646
  break;
@@ -15627,6 +15648,7 @@ set(value) {
15627
15648
  const rowSize = this.env.model.getters.getRowSize(sheetId, row);
15628
15649
  if (offset.y + shiftAmount >= rowSize) {
15629
15650
  row++;
15651
+ while (row <= maxAnchor.row && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row++;
15630
15652
  offset.y = offset.y + shiftAmount - rowSize;
15631
15653
  } else offset.y += shiftAmount;
15632
15654
  break;
@@ -15634,9 +15656,24 @@ set(value) {
15634
15656
  const colSize = this.env.model.getters.getColSize(sheetId, col);
15635
15657
  if (offset.x + shiftAmount >= colSize) {
15636
15658
  col++;
15659
+ while (col <= maxAnchor.col && this.env.model.getters.isColHiddenByUser(sheetId, col)) col++;
15637
15660
  offset.x = offset.x + shiftAmount - colSize;
15638
15661
  } else offset.x += shiftAmount;
15639
15662
  }
15663
+ if (col < 0) {
15664
+ col = 0;
15665
+ offset.x = 0;
15666
+ } else if (col > maxAnchor.col || col === maxAnchor.col && offset.x > maxAnchor.offset.x) {
15667
+ col = maxAnchor.col;
15668
+ offset.x = maxAnchor.offset.x;
15669
+ }
15670
+ if (row < 0) {
15671
+ row = 0;
15672
+ offset.y = 0;
15673
+ } else if (row > maxAnchor.row || row === maxAnchor.row && offset.y > maxAnchor.offset.y) {
15674
+ row = maxAnchor.row;
15675
+ offset.y = maxAnchor.offset.y;
15676
+ }
15640
15677
  return {
15641
15678
  col,
15642
15679
  row,
@@ -46022,7 +46059,13 @@ set(value) {
46022
46059
  const cell = this.getters.getEvaluatedCell(position);
46023
46060
  if (cell.link && !isFormula(content)) content = markdownLink(content, cell.link.url);
46024
46061
  const currentFormat = this.getters.getCell(position)?.format;
46025
- const afterFormat = currentFormat === "@" || currentFormat && isDateTimeFormat(currentFormat) ? void 0 : detectDateFormat(content, this.getters.getLocale());
46062
+ const isCurrentFormatDate = currentFormat && isDateTimeFormat(currentFormat);
46063
+ const contentDateFormat = detectDateFormat(content, this.getters.getLocale());
46064
+ let afterFormat;
46065
+ if (currentFormat !== "@") {
46066
+ if (contentDateFormat && !isCurrentFormatDate) afterFormat = contentDateFormat;
46067
+ else if (isCurrentFormatDate && isNumber(content, this.getters.getLocale())) afterFormat = "";
46068
+ }
46026
46069
  this.addHeadersForSpreadingFormula(content);
46027
46070
  result = this.model.dispatch("UPDATE_CELL", {
46028
46071
  ...this.currentEditedCell,
@@ -67693,6 +67736,10 @@ set(value) {
67693
67736
  }
67694
67737
  function inverseCreateChart(cmd) {
67695
67738
  return [{
67739
+ type: "DELETE_CHART",
67740
+ chartId: cmd.chartId,
67741
+ sheetId: cmd.sheetId
67742
+ }, {
67696
67743
  type: "DELETE_FIGURE",
67697
67744
  figureId: cmd.figureId,
67698
67745
  sheetId: cmd.sheetId
@@ -87529,7 +87576,8 @@ set(value) {
87529
87576
  FullScreenFigure,
87530
87577
  NumberInput,
87531
87578
  TopBar,
87532
- Composer
87579
+ Composer,
87580
+ CarouselFigure
87533
87581
  };
87534
87582
  const hooks = {
87535
87583
  useDragAndDropListItems,
@@ -87683,8 +87731,8 @@ exports.stores = stores;
87683
87731
  exports.tokenColors = tokenColors;
87684
87732
  exports.tokenize = tokenize;
87685
87733
 
87686
- __info__.version = "19.4.5";
87687
- __info__.date = "2026-07-30T06:55:39.923Z";
87688
- __info__.hash = "9308e17";
87734
+ __info__.version = "19.4.6";
87735
+ __info__.date = "2026-08-10T12:33:32.728Z";
87736
+ __info__.hash = "5c667fe";
87689
87737
 
87690
87738
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);