@odoo/o-spreadsheet 19.0.3 → 19.0.5

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.0.3
6
- * @date 2025-09-19T07:26:41.356Z
7
- * @hash 84f3b74
5
+ * @version 19.0.5
6
+ * @date 2025-10-07T10:04:06.400Z
7
+ * @hash 86fc442
8
8
  */
9
9
 
10
10
  import { useEnv, useSubEnv, onWillUnmount, useComponent, status, Component, useRef, onMounted, useEffect, App, blockDom, useState, onPatched, useExternalListener, onWillUpdateProps, onWillStart, onWillPatch, xml, useChildSubEnv, markRaw, toRaw } from '@odoo/owl';
@@ -1382,9 +1382,7 @@ function removeIndexesFromArray(array, indexes) {
1382
1382
  return newArray;
1383
1383
  }
1384
1384
  function insertItemsAtIndex(array, items, index) {
1385
- const newArray = [...array];
1386
- newArray.splice(index, 0, ...items);
1387
- return newArray;
1385
+ return array.slice(0, index).concat(items).concat(array.slice(index));
1388
1386
  }
1389
1387
  function replaceItemAtIndex(array, newItem, index) {
1390
1388
  const newArray = [...array];
@@ -5634,7 +5632,7 @@ function tokensToTextInternalFormat(tokens) {
5634
5632
  * Replace in place tokens "mm" and "m" that denote minutes in date format with "MM" to avoid confusion with months.
5635
5633
  *
5636
5634
  * As per OpenXML specification, in date formats if a date token "m" or "mm" is followed by a date token "s" or
5637
- * preceded by a data token "h", then it's not a month but an minute.
5635
+ * preceded by a data token "h", then it's not a month but a minute.
5638
5636
  */
5639
5637
  function convertTokensToMinutesInDateFormat(tokens) {
5640
5638
  const dateParts = tokens.filter((token) => token.type === "DATE_PART");
@@ -5677,6 +5675,9 @@ function internalFormatPartToFormat(internalFormat) {
5677
5675
  case "REPEATED_CHAR":
5678
5676
  format += "*" + token.value;
5679
5677
  break;
5678
+ case "DATE_PART":
5679
+ format += token.value === "MM" ? "mm" : token.value; // Convert "MM" back to "mm" for minutes
5680
+ break;
5680
5681
  default:
5681
5682
  format += token.value;
5682
5683
  }
@@ -24852,6 +24853,7 @@ class ScorecardChart extends Component {
24852
24853
  static template = "o-spreadsheet-ScorecardChart";
24853
24854
  static props = {
24854
24855
  chartId: String,
24856
+ isFullScreen: { type: Boolean, optional: true },
24855
24857
  };
24856
24858
  canvas = useRef("chartContainer");
24857
24859
  get runtime() {
@@ -26771,7 +26773,7 @@ function getRadarChartScales(definition, args) {
26771
26773
  },
26772
26774
  pointLabels: {
26773
26775
  color: chartFontColor(definition.background),
26774
- callback: truncateLabel,
26776
+ callback: (label) => truncateLabel(label),
26775
26777
  },
26776
26778
  suggestedMin: minValue < 0 ? minValue - 1 : 0,
26777
26779
  },
@@ -27615,26 +27617,6 @@ function createBarChartRuntime(chart, getters) {
27615
27617
  return { chartJsConfig: config, background: chart.background || BACKGROUND_CHART_COLOR };
27616
27618
  }
27617
27619
 
27618
- class FullScreenChartStore extends SpreadsheetStore {
27619
- mutators = ["toggleFullScreenChart"];
27620
- fullScreenFigure = undefined;
27621
- toggleFullScreenChart(figureId) {
27622
- if (this.fullScreenFigure?.id === figureId) {
27623
- this.fullScreenFigure = undefined;
27624
- }
27625
- else {
27626
- this.makeFullScreen(figureId);
27627
- }
27628
- }
27629
- makeFullScreen(figureId) {
27630
- const sheetId = this.getters.getActiveSheetId();
27631
- const figure = this.getters.getFigure(sheetId, figureId);
27632
- if (figure) {
27633
- this.fullScreenFigure = { ...figure, x: 0, y: 0, width: 0, height: 0 };
27634
- }
27635
- }
27636
- }
27637
-
27638
27620
  const TREND_LINE_AXES_IDS = [TREND_LINE_XAXIS_ID, MOVING_AVERAGE_TREND_LINE_XAXIS_ID];
27639
27621
  const ZOOMABLE_AXIS_IDS = ["x", ...TREND_LINE_AXES_IDS];
27640
27622
  class ZoomableChartStore extends SpreadsheetStore {
@@ -27806,7 +27788,6 @@ chartJsExtensionRegistry.add("zoomWindowPlugin", {
27806
27788
  class ZoomableChartJsComponent extends ChartJsComponent {
27807
27789
  static template = "o-spreadsheet-ZoomableChartJsComponent";
27808
27790
  store;
27809
- fullScreenChartStore;
27810
27791
  masterChartCanvas = useRef("masterChartCanvas");
27811
27792
  masterChart;
27812
27793
  mode;
@@ -27817,7 +27798,6 @@ class ZoomableChartJsComponent extends ChartJsComponent {
27817
27798
  removeEventListeners = () => { };
27818
27799
  setup() {
27819
27800
  this.store = useStore(ZoomableChartStore);
27820
- this.fullScreenChartStore = useStore(FullScreenChartStore);
27821
27801
  super.setup();
27822
27802
  }
27823
27803
  unmount() {
@@ -27832,12 +27812,8 @@ class ZoomableChartJsComponent extends ChartJsComponent {
27832
27812
  `;
27833
27813
  }
27834
27814
  get sliceable() {
27835
- if (this.env.isDashboard()) {
27836
- const fullScreenFigureId = this.fullScreenChartStore.fullScreenFigure?.id;
27837
- const chartFigureId = this.env.model.getters.getFigureIdFromChartId(this.props.chartId);
27838
- if (fullScreenFigureId === chartFigureId) {
27839
- return true;
27840
- }
27815
+ if (this.props.isFullScreen) {
27816
+ return true;
27841
27817
  }
27842
27818
  const definition = this.env.model.getters.getChartDefinition(this.props.chartId);
27843
27819
  return ("zoomable" in definition && definition?.zoomable) ?? false;
@@ -27900,9 +27876,6 @@ class ZoomableChartJsComponent extends ChartJsComponent {
27900
27876
  const xMax = Math.max(...xValues);
27901
27877
  return { xMin, xMax };
27902
27878
  }
27903
- get shouldAnimate() {
27904
- return this.env.model.getters.isDashboard() && !this.sliceable;
27905
- }
27906
27879
  createChart(chartRuntime) {
27907
27880
  const chartData = chartRuntime.chartJsConfig;
27908
27881
  this.isBarChart = chartData.type === "bar";
@@ -27921,6 +27894,9 @@ class ZoomableChartJsComponent extends ChartJsComponent {
27921
27894
  const masterChartCtx = this.masterChartCanvas.el.getContext("2d");
27922
27895
  this.masterChart = new window.Chart(masterChartCtx, this.getMasterChartConfiguration(chartRuntime["masterChartConfig"]));
27923
27896
  this.resetAxesLimits();
27897
+ if (this.chart?.options) {
27898
+ this.chart.options.animation = false;
27899
+ }
27924
27900
  }
27925
27901
  updateChartJs(chartRuntime) {
27926
27902
  const chartData = chartRuntime.chartJsConfig;
@@ -27954,6 +27930,9 @@ class ZoomableChartJsComponent extends ChartJsComponent {
27954
27930
  }
27955
27931
  }
27956
27932
  this.resetAxesLimits();
27933
+ if (this.chart?.options) {
27934
+ this.chart.options.animation = false;
27935
+ }
27957
27936
  }
27958
27937
  resetAxesLimits() {
27959
27938
  if (!this.chart) {
@@ -28051,7 +28030,7 @@ class ZoomableChartJsComponent extends ChartJsComponent {
28051
28030
  onPointerDownInMasterChart(ev) {
28052
28031
  this.removeEventListeners();
28053
28032
  const position = ev.offsetX;
28054
- if (!this.masterChart?.chartArea || !this.chart?.scales.x) {
28033
+ if (!this.masterChart?.chartArea || !this.chart?.scales?.x) {
28055
28034
  return;
28056
28035
  }
28057
28036
  const { left, right, top, bottom } = this.masterChart.chartArea;
@@ -31609,6 +31588,26 @@ function getCarouselItemTitle(getters, item) {
31609
31588
  return matchedChart.displayName;
31610
31589
  }
31611
31590
 
31591
+ class FullScreenFigureStore extends SpreadsheetStore {
31592
+ mutators = ["toggleFullScreenFigure"];
31593
+ fullScreenFigure = undefined;
31594
+ toggleFullScreenFigure(figureId) {
31595
+ if (this.fullScreenFigure?.id === figureId) {
31596
+ this.fullScreenFigure = undefined;
31597
+ }
31598
+ else {
31599
+ this.makeFullScreen(figureId);
31600
+ }
31601
+ }
31602
+ makeFullScreen(figureId) {
31603
+ const sheetId = this.getters.getActiveSheetId();
31604
+ const figure = this.getters.getFigure(sheetId, figureId);
31605
+ if (figure) {
31606
+ this.fullScreenFigure = { ...figure, x: 0, y: 0, width: 0, height: 0 };
31607
+ }
31608
+ }
31609
+ }
31610
+
31612
31611
  /**
31613
31612
  * Repeatedly calls a callback function with a time delay between calls.
31614
31613
  */
@@ -32346,12 +32345,13 @@ class MenuPopover extends Component {
32346
32345
  class ChartDashboardMenu extends Component {
32347
32346
  static template = "o-spreadsheet-ChartDashboardMenu";
32348
32347
  static components = { MenuPopover };
32349
- static props = { chartId: String };
32348
+ static props = { chartId: String, hasFullScreenButton: { type: Boolean, optional: true } };
32349
+ static defaultProps = { hasFullScreenButton: true };
32350
32350
  fullScreenFigureStore;
32351
32351
  menuState = useState({ isOpen: false, anchorRect: null, menuItems: [] });
32352
32352
  setup() {
32353
32353
  super.setup();
32354
- this.fullScreenFigureStore = useStore(FullScreenChartStore);
32354
+ this.fullScreenFigureStore = useStore(FullScreenFigureStore);
32355
32355
  }
32356
32356
  getMenuItems() {
32357
32357
  return [this.fullScreenMenuItem].filter(isDefined);
@@ -32367,6 +32367,9 @@ class ChartDashboardMenu extends Component {
32367
32367
  this.menuState.menuItems = getChartMenuActions(figureId, () => { }, this.env);
32368
32368
  }
32369
32369
  get fullScreenMenuItem() {
32370
+ if (!this.props.hasFullScreenButton) {
32371
+ return undefined;
32372
+ }
32370
32373
  const definition = this.env.model.getters.getChartDefinition(this.props.chartId);
32371
32374
  const figureId = this.env.model.getters.getFigureIdFromChartId(this.props.chartId);
32372
32375
  if (definition.type === "scorecard") {
@@ -32378,7 +32381,7 @@ class ChartDashboardMenu extends Component {
32378
32381
  label: isFullScreen ? _t("Exit Full Screen") : _t("Full Screen"),
32379
32382
  class: `text-muted fa ${isFullScreen ? "fa-compress" : "fa-expand"}`,
32380
32383
  onClick: () => {
32381
- this.fullScreenFigureStore.toggleFullScreenChart(figureId);
32384
+ this.fullScreenFigureStore.toggleFullScreenFigure(figureId);
32382
32385
  },
32383
32386
  };
32384
32387
  }
@@ -32390,6 +32393,7 @@ class CarouselFigure extends Component {
32390
32393
  figureUI: Object,
32391
32394
  onFigureDeleted: Function,
32392
32395
  editFigureStyle: { type: Function, optional: true },
32396
+ isFullScreen: { type: Boolean, optional: true },
32393
32397
  };
32394
32398
  static components = { ChartDashboardMenu, MenuPopover };
32395
32399
  carouselTabsRef = useRef("carouselTabs");
@@ -32397,8 +32401,10 @@ class CarouselFigure extends Component {
32397
32401
  menuState = useState({ isOpen: false, anchorRect: null, menuItems: [] });
32398
32402
  hiddenItems = [];
32399
32403
  animationStore;
32404
+ fullScreenFigureStore;
32400
32405
  setup() {
32401
32406
  this.animationStore = useStore(ChartAnimationStore);
32407
+ this.fullScreenFigureStore = useStore(FullScreenFigureStore);
32402
32408
  useEffect(() => {
32403
32409
  if (this.selectedCarouselItem?.type === "carouselDataView") {
32404
32410
  this.props.editFigureStyle?.({ "pointer-events": "none" });
@@ -32445,18 +32451,19 @@ class CarouselFigure extends Component {
32445
32451
  item,
32446
32452
  });
32447
32453
  if (item.type === "chart") {
32448
- this.animationStore?.enableAnimationForChart(item.chartId);
32454
+ const animationChartId = item.chartId + (this.props.isFullScreen ? "-fullscreen" : "");
32455
+ this.animationStore?.enableAnimationForChart(animationChartId);
32449
32456
  }
32450
32457
  }
32451
32458
  get headerStyle() {
32452
32459
  const cssProperties = {};
32453
- if (this.selectedCarouselItem?.type === "carouselDataView") {
32454
- cssProperties["background-color"] = "#ffffff";
32455
- }
32456
- else if (this.selectedCarouselItem?.type === "chart") {
32460
+ if (this.selectedCarouselItem?.type === "chart") {
32457
32461
  const chart = this.env.model.getters.getChartRuntime(this.selectedCarouselItem.chartId);
32458
32462
  cssProperties["background-color"] = chart.background;
32459
32463
  }
32464
+ else {
32465
+ cssProperties["background-color"] = "#ffffff";
32466
+ }
32460
32467
  return cssPropertiesToCss(cssProperties);
32461
32468
  }
32462
32469
  get title() {
@@ -32509,6 +32516,17 @@ class CarouselFigure extends Component {
32509
32516
  this.menuState.anchorRect = rect;
32510
32517
  this.menuState.menuItems = createActions(menuItems);
32511
32518
  }
32519
+ toggleFullScreen() {
32520
+ if (this.selectedCarouselItem?.type === "chart") {
32521
+ this.fullScreenFigureStore.toggleFullScreenFigure(this.props.figureUI.id);
32522
+ }
32523
+ }
32524
+ get fullScreenButtonTitle() {
32525
+ return this.props.isFullScreen ? _t("Exit Full Screen") : _t("Full Screen");
32526
+ }
32527
+ get visibleCarouselItems() {
32528
+ return this.carousel.items.filter((item) => item.type === "carouselDataView" && this.props.isFullScreen ? false : true);
32529
+ }
32512
32530
  }
32513
32531
 
32514
32532
  class ChartFigure extends Component {
@@ -32517,6 +32535,7 @@ class ChartFigure extends Component {
32517
32535
  figureUI: Object,
32518
32536
  onFigureDeleted: Function,
32519
32537
  editFigureStyle: { type: Function, optional: true },
32538
+ isFullScreen: { type: Boolean, optional: true },
32520
32539
  };
32521
32540
  static components = { ChartDashboardMenu };
32522
32541
  onDoubleClick() {
@@ -58658,7 +58677,7 @@ class PivotMeasureEditor extends Component {
58658
58677
  return undefined;
58659
58678
  }
58660
58679
  get isCalculatedMeasureInvalid() {
58661
- return this.env.model.getters.getMeasureCompiledFormula(this.props.measure).isBadExpression;
58680
+ return compile(this.props.measure.computedBy?.formula ?? "").isBadExpression;
58662
58681
  }
58663
58682
  }
58664
58683
 
@@ -61536,16 +61555,16 @@ class ClickableCellSortIcon extends Component {
61536
61555
  }
61537
61556
  }
61538
61557
 
61539
- class FullScreenChart extends Component {
61540
- static template = "o-spreadsheet-FullScreenChart";
61558
+ class FullScreenFigure extends Component {
61559
+ static template = "o-spreadsheet-FullScreenFigure";
61541
61560
  static props = {};
61542
- static components = { ChartDashboardMenu };
61543
- fullScreenChartStore;
61544
- ref = useRef("fullScreenChart");
61561
+ static components = { ChartFigure };
61562
+ fullScreenFigureStore;
61563
+ ref = useRef("fullScreenFigure");
61545
61564
  spreadsheetRect = useSpreadsheetRect();
61546
61565
  figureRegistry = figureRegistry;
61547
61566
  setup() {
61548
- this.fullScreenChartStore = useStore(FullScreenChartStore);
61567
+ this.fullScreenFigureStore = useStore(FullScreenFigureStore);
61549
61568
  const animationStore = useStore(ChartAnimationStore);
61550
61569
  let lastFigureId = undefined;
61551
61570
  onWillUpdateProps(() => {
@@ -61557,7 +61576,7 @@ class FullScreenChart extends Component {
61557
61576
  useEffect((el) => el?.focus(), () => [this.ref.el]);
61558
61577
  }
61559
61578
  get figureUI() {
61560
- return this.fullScreenChartStore.fullScreenFigure;
61579
+ return this.fullScreenFigureStore.fullScreenFigure;
61561
61580
  }
61562
61581
  get chartId() {
61563
61582
  if (!this.figureUI)
@@ -61566,7 +61585,7 @@ class FullScreenChart extends Component {
61566
61585
  }
61567
61586
  exitFullScreen() {
61568
61587
  if (this.figureUI) {
61569
- this.fullScreenChartStore.toggleFullScreenChart(this.figureUI.id);
61588
+ this.fullScreenFigureStore.toggleFullScreenFigure(this.figureUI.id);
61570
61589
  }
61571
61590
  }
61572
61591
  onKeyDown(ev) {
@@ -61574,15 +61593,10 @@ class FullScreenChart extends Component {
61574
61593
  this.exitFullScreen();
61575
61594
  }
61576
61595
  }
61577
- get chartComponent() {
61578
- if (!this.chartId)
61596
+ get figureComponent() {
61597
+ if (!this.figureUI)
61579
61598
  return undefined;
61580
- const type = this.env.model.getters.getChartType(this.chartId);
61581
- const component = chartComponentRegistry.get(type);
61582
- if (!component) {
61583
- throw new Error(`Component is not defined for type ${type}`);
61584
- }
61585
- return component;
61599
+ return figureRegistry.get(this.figureUI.tag).Component;
61586
61600
  }
61587
61601
  }
61588
61602
 
@@ -64322,11 +64336,11 @@ class HeaderSizePlugin extends CorePlugin {
64322
64336
  break;
64323
64337
  }
64324
64338
  case "ADD_COLUMNS_ROWS": {
64325
- const sizes = [...this.sizes[cmd.sheetId][cmd.dimension]];
64339
+ const sizes = this.sizes[cmd.sheetId][cmd.dimension];
64326
64340
  const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
64327
64341
  const baseSize = sizes[cmd.base];
64328
- sizes.splice(addIndex, 0, ...Array(cmd.quantity).fill(baseSize));
64329
- this.history.update("sizes", cmd.sheetId, cmd.dimension, sizes);
64342
+ const newSizes = insertItemsAtIndex(sizes, Array(cmd.quantity).fill(baseSize), addIndex);
64343
+ this.history.update("sizes", cmd.sheetId, cmd.dimension, newSizes);
64330
64344
  break;
64331
64345
  }
64332
64346
  case "RESIZE_COLUMNS_ROWS":
@@ -64477,9 +64491,8 @@ class HeaderVisibilityPlugin extends CorePlugin {
64477
64491
  break;
64478
64492
  }
64479
64493
  case "ADD_COLUMNS_ROWS": {
64480
- const hiddenHeaders = [...this.hiddenHeaders[cmd.sheetId][cmd.dimension]];
64481
64494
  const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
64482
- hiddenHeaders.splice(addIndex, 0, ...Array(cmd.quantity).fill(false));
64495
+ const hiddenHeaders = insertItemsAtIndex([...this.hiddenHeaders[cmd.sheetId][cmd.dimension]], Array(cmd.quantity).fill(false), addIndex);
64483
64496
  this.history.update("hiddenHeaders", cmd.sheetId, cmd.dimension, hiddenHeaders);
64484
64497
  break;
64485
64498
  }
@@ -68663,12 +68676,12 @@ class SpreadsheetRTree {
68663
68676
  this.rTrees[sheetId].remove(item, this.rtreeItemComparer);
68664
68677
  }
68665
68678
  rtreeItemComparer(left, right) {
68666
- return (left.data === right.data &&
68667
- left.boundingBox.sheetId === right.boundingBox.sheetId &&
68679
+ return (left.boundingBox.sheetId === right.boundingBox.sheetId &&
68668
68680
  left.boundingBox?.zone.left === right.boundingBox.zone.left &&
68669
68681
  left.boundingBox?.zone.top === right.boundingBox.zone.top &&
68670
68682
  left.boundingBox?.zone.right === right.boundingBox.zone.right &&
68671
- left.boundingBox?.zone.bottom === right.boundingBox.zone.bottom);
68683
+ left.boundingBox?.zone.bottom === right.boundingBox.zone.bottom &&
68684
+ deepEquals(left.data, right.data));
68672
68685
  }
68673
68686
  }
68674
68687
  /**
@@ -74923,7 +74936,10 @@ class SortPlugin extends UIPlugin {
74923
74936
  return "Success" /* CommandResult.Success */;
74924
74937
  }
74925
74938
  checkArrayFormulaInSortZone({ sheetId, zone }) {
74926
- const arrayFormulaInZone = positions(zone).some(({ col, row }) => this.getters.getArrayFormulaSpreadingOn({ sheetId, col, row }));
74939
+ const arrayFormulaInZone = positions(zone).some(({ col, row }) => {
74940
+ const originPosition = this.getters.getArrayFormulaSpreadingOn({ sheetId, col, row });
74941
+ return originPosition && !deepEquals(originPosition, { sheetId, col, row });
74942
+ });
74927
74943
  return arrayFormulaInZone ? "SortZoneWithArrayFormulas" /* CommandResult.SortZoneWithArrayFormulas */ : "Success" /* CommandResult.Success */;
74928
74944
  }
74929
74945
  /**
@@ -82215,6 +82231,9 @@ class SmallBottomBar extends Component {
82215
82231
  ? this.composerFocusStore.focusMode
82216
82232
  : "inactive";
82217
82233
  }
82234
+ get showFxIcon() {
82235
+ return this.focus === "inactive" && !this.composerStore.currentContent;
82236
+ }
82218
82237
  get rect() {
82219
82238
  return this.composerRef.el
82220
82239
  ? getBoundingRectAsPOJO(this.composerRef.el)
@@ -82257,12 +82276,6 @@ class SmallBottomBar extends Component {
82257
82276
  }
82258
82277
 
82259
82278
  const COMPOSER_MAX_HEIGHT = 300;
82260
- /* svg free of use from https://uxwing.com/formula-fx-icon/ */
82261
- const FX_SVG = /*xml*/ `
82262
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 121.8 122.9' width='16' height='16' focusable='false'>
82263
- <path d='m28 34-4 5v2h10l-6 40c-4 22-6 28-7 30-2 2-3 3-5 3-3 0-7-2-9-4H4c-2 2-4 4-4 7s4 6 8 6 9-2 15-8c8-7 13-17 18-39l7-35 13-1 3-6H49c4-23 7-27 11-27 2 0 5 2 8 6h4c1-1 4-4 4-7 0-2-3-6-9-6-5 0-13 4-20 10-6 7-9 14-11 24h-8zm41 16c4-5 7-7 8-7s2 1 5 9l3 12c-7 11-12 17-16 17l-3-1-2-1c-3 0-6 3-6 7s3 7 7 7c6 0 12-6 22-23l3 10c3 9 6 13 10 13 5 0 11-4 18-15l-3-4c-4 6-7 8-8 8-2 0-4-3-6-10l-5-15 8-10 6-4 3 1 3 2c2 0 6-3 6-7s-2-7-6-7c-6 0-11 5-21 20l-2-6c-3-9-5-14-9-14-5 0-12 6-18 15l3 3z' fill='#BDBDBD'/>
82264
- </svg>
82265
- `;
82266
82279
  css /* scss */ `
82267
82280
  .o-topbar-composer-container {
82268
82281
  height: ${DESKTOP_TOPBAR_TOOLBAR_HEIGHT}px;
@@ -82274,14 +82287,6 @@ css /* scss */ `
82274
82287
  margin-bottom: -1px;
82275
82288
  border: 1px solid;
82276
82289
  font-family: ${DEFAULT_FONT};
82277
-
82278
- /* In readonly we always show the fx icon if the composer is empty, not matter the focus */
82279
- .o-composer:empty:not(:focus):not(.active)::before,
82280
- &.o-topbar-composer-readonly .o-composer:empty::before {
82281
- content: url("data:image/svg+xml,${encodeURIComponent(FX_SVG)}");
82282
- position: relative;
82283
- top: 20%;
82284
- }
82285
82290
  }
82286
82291
 
82287
82292
  .user-select-text {
@@ -82314,6 +82319,9 @@ class TopBarComposer extends Component {
82314
82319
  ? this.composerFocusStore.focusMode
82315
82320
  : "inactive";
82316
82321
  }
82322
+ get showFxIcon() {
82323
+ return this.focus === "inactive" && !this.composerStore.currentContent;
82324
+ }
82317
82325
  get composerStyle() {
82318
82326
  const style = {
82319
82327
  padding: "5px 0px 5px 8px",
@@ -83665,7 +83673,7 @@ class Spreadsheet extends Component {
83665
83673
  SidePanels,
83666
83674
  SpreadsheetDashboard,
83667
83675
  HeaderGroupContainer,
83668
- FullScreenChart,
83676
+ FullScreenFigure,
83669
83677
  };
83670
83678
  sidePanel;
83671
83679
  spreadsheetRef = useRef("spreadsheet");
@@ -88389,6 +88397,7 @@ const components = {
88389
88397
  Grid,
88390
88398
  GridOverlay,
88391
88399
  ScorecardChart,
88400
+ GaugeChartComponent,
88392
88401
  LineConfigPanel,
88393
88402
  BarConfigPanel,
88394
88403
  PieChartDesignPanel,
@@ -88427,7 +88436,7 @@ const components = {
88427
88436
  RadioSelection,
88428
88437
  GeoChartRegionSelectSection,
88429
88438
  ChartDashboardMenu,
88430
- FullScreenChart,
88439
+ FullScreenFigure,
88431
88440
  };
88432
88441
  const hooks = {
88433
88442
  useDragAndDropListItems,
@@ -88477,6 +88486,6 @@ const chartHelpers = { ...CHART_HELPERS, ...CHART_RUNTIME_HELPERS };
88477
88486
  export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, ClientDisconnectedError, CommandResult, CorePlugin, CoreViewPlugin, DispatchResult, EvaluationError, LocalTransportService, Model, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, SpreadsheetPivotTable, UIPlugin, __info__, addFunction, addRenderingLayer, astToFormula, chartHelpers, compile, compileTokens, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, getCaretDownSvg, getCaretUpSvg, helpers, hooks, invalidateCFEvaluationCommands, invalidateChartEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
88478
88487
 
88479
88488
 
88480
- __info__.version = "19.0.3";
88481
- __info__.date = "2025-09-19T07:26:41.356Z";
88482
- __info__.hash = "84f3b74";
88489
+ __info__.version = "19.0.5";
88490
+ __info__.date = "2025-10-07T10:04:06.400Z";
88491
+ __info__.hash = "86fc442";