@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
  (function (exports, owl) {
@@ -1383,9 +1383,7 @@
1383
1383
  return newArray;
1384
1384
  }
1385
1385
  function insertItemsAtIndex(array, items, index) {
1386
- const newArray = [...array];
1387
- newArray.splice(index, 0, ...items);
1388
- return newArray;
1386
+ return array.slice(0, index).concat(items).concat(array.slice(index));
1389
1387
  }
1390
1388
  function replaceItemAtIndex(array, newItem, index) {
1391
1389
  const newArray = [...array];
@@ -5635,7 +5633,7 @@
5635
5633
  * Replace in place tokens "mm" and "m" that denote minutes in date format with "MM" to avoid confusion with months.
5636
5634
  *
5637
5635
  * As per OpenXML specification, in date formats if a date token "m" or "mm" is followed by a date token "s" or
5638
- * preceded by a data token "h", then it's not a month but an minute.
5636
+ * preceded by a data token "h", then it's not a month but a minute.
5639
5637
  */
5640
5638
  function convertTokensToMinutesInDateFormat(tokens) {
5641
5639
  const dateParts = tokens.filter((token) => token.type === "DATE_PART");
@@ -5678,6 +5676,9 @@
5678
5676
  case "REPEATED_CHAR":
5679
5677
  format += "*" + token.value;
5680
5678
  break;
5679
+ case "DATE_PART":
5680
+ format += token.value === "MM" ? "mm" : token.value; // Convert "MM" back to "mm" for minutes
5681
+ break;
5681
5682
  default:
5682
5683
  format += token.value;
5683
5684
  }
@@ -24853,6 +24854,7 @@ stores.inject(MyMetaStore, storeInstance);
24853
24854
  static template = "o-spreadsheet-ScorecardChart";
24854
24855
  static props = {
24855
24856
  chartId: String,
24857
+ isFullScreen: { type: Boolean, optional: true },
24856
24858
  };
24857
24859
  canvas = owl.useRef("chartContainer");
24858
24860
  get runtime() {
@@ -26772,7 +26774,7 @@ stores.inject(MyMetaStore, storeInstance);
26772
26774
  },
26773
26775
  pointLabels: {
26774
26776
  color: chartFontColor(definition.background),
26775
- callback: truncateLabel,
26777
+ callback: (label) => truncateLabel(label),
26776
26778
  },
26777
26779
  suggestedMin: minValue < 0 ? minValue - 1 : 0,
26778
26780
  },
@@ -27616,26 +27618,6 @@ stores.inject(MyMetaStore, storeInstance);
27616
27618
  return { chartJsConfig: config, background: chart.background || BACKGROUND_CHART_COLOR };
27617
27619
  }
27618
27620
 
27619
- class FullScreenChartStore extends SpreadsheetStore {
27620
- mutators = ["toggleFullScreenChart"];
27621
- fullScreenFigure = undefined;
27622
- toggleFullScreenChart(figureId) {
27623
- if (this.fullScreenFigure?.id === figureId) {
27624
- this.fullScreenFigure = undefined;
27625
- }
27626
- else {
27627
- this.makeFullScreen(figureId);
27628
- }
27629
- }
27630
- makeFullScreen(figureId) {
27631
- const sheetId = this.getters.getActiveSheetId();
27632
- const figure = this.getters.getFigure(sheetId, figureId);
27633
- if (figure) {
27634
- this.fullScreenFigure = { ...figure, x: 0, y: 0, width: 0, height: 0 };
27635
- }
27636
- }
27637
- }
27638
-
27639
27621
  const TREND_LINE_AXES_IDS = [TREND_LINE_XAXIS_ID, MOVING_AVERAGE_TREND_LINE_XAXIS_ID];
27640
27622
  const ZOOMABLE_AXIS_IDS = ["x", ...TREND_LINE_AXES_IDS];
27641
27623
  class ZoomableChartStore extends SpreadsheetStore {
@@ -27807,7 +27789,6 @@ stores.inject(MyMetaStore, storeInstance);
27807
27789
  class ZoomableChartJsComponent extends ChartJsComponent {
27808
27790
  static template = "o-spreadsheet-ZoomableChartJsComponent";
27809
27791
  store;
27810
- fullScreenChartStore;
27811
27792
  masterChartCanvas = owl.useRef("masterChartCanvas");
27812
27793
  masterChart;
27813
27794
  mode;
@@ -27818,7 +27799,6 @@ stores.inject(MyMetaStore, storeInstance);
27818
27799
  removeEventListeners = () => { };
27819
27800
  setup() {
27820
27801
  this.store = useStore(ZoomableChartStore);
27821
- this.fullScreenChartStore = useStore(FullScreenChartStore);
27822
27802
  super.setup();
27823
27803
  }
27824
27804
  unmount() {
@@ -27833,12 +27813,8 @@ stores.inject(MyMetaStore, storeInstance);
27833
27813
  `;
27834
27814
  }
27835
27815
  get sliceable() {
27836
- if (this.env.isDashboard()) {
27837
- const fullScreenFigureId = this.fullScreenChartStore.fullScreenFigure?.id;
27838
- const chartFigureId = this.env.model.getters.getFigureIdFromChartId(this.props.chartId);
27839
- if (fullScreenFigureId === chartFigureId) {
27840
- return true;
27841
- }
27816
+ if (this.props.isFullScreen) {
27817
+ return true;
27842
27818
  }
27843
27819
  const definition = this.env.model.getters.getChartDefinition(this.props.chartId);
27844
27820
  return ("zoomable" in definition && definition?.zoomable) ?? false;
@@ -27901,9 +27877,6 @@ stores.inject(MyMetaStore, storeInstance);
27901
27877
  const xMax = Math.max(...xValues);
27902
27878
  return { xMin, xMax };
27903
27879
  }
27904
- get shouldAnimate() {
27905
- return this.env.model.getters.isDashboard() && !this.sliceable;
27906
- }
27907
27880
  createChart(chartRuntime) {
27908
27881
  const chartData = chartRuntime.chartJsConfig;
27909
27882
  this.isBarChart = chartData.type === "bar";
@@ -27922,6 +27895,9 @@ stores.inject(MyMetaStore, storeInstance);
27922
27895
  const masterChartCtx = this.masterChartCanvas.el.getContext("2d");
27923
27896
  this.masterChart = new window.Chart(masterChartCtx, this.getMasterChartConfiguration(chartRuntime["masterChartConfig"]));
27924
27897
  this.resetAxesLimits();
27898
+ if (this.chart?.options) {
27899
+ this.chart.options.animation = false;
27900
+ }
27925
27901
  }
27926
27902
  updateChartJs(chartRuntime) {
27927
27903
  const chartData = chartRuntime.chartJsConfig;
@@ -27955,6 +27931,9 @@ stores.inject(MyMetaStore, storeInstance);
27955
27931
  }
27956
27932
  }
27957
27933
  this.resetAxesLimits();
27934
+ if (this.chart?.options) {
27935
+ this.chart.options.animation = false;
27936
+ }
27958
27937
  }
27959
27938
  resetAxesLimits() {
27960
27939
  if (!this.chart) {
@@ -28052,7 +28031,7 @@ stores.inject(MyMetaStore, storeInstance);
28052
28031
  onPointerDownInMasterChart(ev) {
28053
28032
  this.removeEventListeners();
28054
28033
  const position = ev.offsetX;
28055
- if (!this.masterChart?.chartArea || !this.chart?.scales.x) {
28034
+ if (!this.masterChart?.chartArea || !this.chart?.scales?.x) {
28056
28035
  return;
28057
28036
  }
28058
28037
  const { left, right, top, bottom } = this.masterChart.chartArea;
@@ -31610,6 +31589,26 @@ stores.inject(MyMetaStore, storeInstance);
31610
31589
  return matchedChart.displayName;
31611
31590
  }
31612
31591
 
31592
+ class FullScreenFigureStore extends SpreadsheetStore {
31593
+ mutators = ["toggleFullScreenFigure"];
31594
+ fullScreenFigure = undefined;
31595
+ toggleFullScreenFigure(figureId) {
31596
+ if (this.fullScreenFigure?.id === figureId) {
31597
+ this.fullScreenFigure = undefined;
31598
+ }
31599
+ else {
31600
+ this.makeFullScreen(figureId);
31601
+ }
31602
+ }
31603
+ makeFullScreen(figureId) {
31604
+ const sheetId = this.getters.getActiveSheetId();
31605
+ const figure = this.getters.getFigure(sheetId, figureId);
31606
+ if (figure) {
31607
+ this.fullScreenFigure = { ...figure, x: 0, y: 0, width: 0, height: 0 };
31608
+ }
31609
+ }
31610
+ }
31611
+
31613
31612
  /**
31614
31613
  * Repeatedly calls a callback function with a time delay between calls.
31615
31614
  */
@@ -32347,12 +32346,13 @@ stores.inject(MyMetaStore, storeInstance);
32347
32346
  class ChartDashboardMenu extends owl.Component {
32348
32347
  static template = "o-spreadsheet-ChartDashboardMenu";
32349
32348
  static components = { MenuPopover };
32350
- static props = { chartId: String };
32349
+ static props = { chartId: String, hasFullScreenButton: { type: Boolean, optional: true } };
32350
+ static defaultProps = { hasFullScreenButton: true };
32351
32351
  fullScreenFigureStore;
32352
32352
  menuState = owl.useState({ isOpen: false, anchorRect: null, menuItems: [] });
32353
32353
  setup() {
32354
32354
  super.setup();
32355
- this.fullScreenFigureStore = useStore(FullScreenChartStore);
32355
+ this.fullScreenFigureStore = useStore(FullScreenFigureStore);
32356
32356
  }
32357
32357
  getMenuItems() {
32358
32358
  return [this.fullScreenMenuItem].filter(isDefined);
@@ -32368,6 +32368,9 @@ stores.inject(MyMetaStore, storeInstance);
32368
32368
  this.menuState.menuItems = getChartMenuActions(figureId, () => { }, this.env);
32369
32369
  }
32370
32370
  get fullScreenMenuItem() {
32371
+ if (!this.props.hasFullScreenButton) {
32372
+ return undefined;
32373
+ }
32371
32374
  const definition = this.env.model.getters.getChartDefinition(this.props.chartId);
32372
32375
  const figureId = this.env.model.getters.getFigureIdFromChartId(this.props.chartId);
32373
32376
  if (definition.type === "scorecard") {
@@ -32379,7 +32382,7 @@ stores.inject(MyMetaStore, storeInstance);
32379
32382
  label: isFullScreen ? _t("Exit Full Screen") : _t("Full Screen"),
32380
32383
  class: `text-muted fa ${isFullScreen ? "fa-compress" : "fa-expand"}`,
32381
32384
  onClick: () => {
32382
- this.fullScreenFigureStore.toggleFullScreenChart(figureId);
32385
+ this.fullScreenFigureStore.toggleFullScreenFigure(figureId);
32383
32386
  },
32384
32387
  };
32385
32388
  }
@@ -32391,6 +32394,7 @@ stores.inject(MyMetaStore, storeInstance);
32391
32394
  figureUI: Object,
32392
32395
  onFigureDeleted: Function,
32393
32396
  editFigureStyle: { type: Function, optional: true },
32397
+ isFullScreen: { type: Boolean, optional: true },
32394
32398
  };
32395
32399
  static components = { ChartDashboardMenu, MenuPopover };
32396
32400
  carouselTabsRef = owl.useRef("carouselTabs");
@@ -32398,8 +32402,10 @@ stores.inject(MyMetaStore, storeInstance);
32398
32402
  menuState = owl.useState({ isOpen: false, anchorRect: null, menuItems: [] });
32399
32403
  hiddenItems = [];
32400
32404
  animationStore;
32405
+ fullScreenFigureStore;
32401
32406
  setup() {
32402
32407
  this.animationStore = useStore(ChartAnimationStore);
32408
+ this.fullScreenFigureStore = useStore(FullScreenFigureStore);
32403
32409
  owl.useEffect(() => {
32404
32410
  if (this.selectedCarouselItem?.type === "carouselDataView") {
32405
32411
  this.props.editFigureStyle?.({ "pointer-events": "none" });
@@ -32446,18 +32452,19 @@ stores.inject(MyMetaStore, storeInstance);
32446
32452
  item,
32447
32453
  });
32448
32454
  if (item.type === "chart") {
32449
- this.animationStore?.enableAnimationForChart(item.chartId);
32455
+ const animationChartId = item.chartId + (this.props.isFullScreen ? "-fullscreen" : "");
32456
+ this.animationStore?.enableAnimationForChart(animationChartId);
32450
32457
  }
32451
32458
  }
32452
32459
  get headerStyle() {
32453
32460
  const cssProperties = {};
32454
- if (this.selectedCarouselItem?.type === "carouselDataView") {
32455
- cssProperties["background-color"] = "#ffffff";
32456
- }
32457
- else if (this.selectedCarouselItem?.type === "chart") {
32461
+ if (this.selectedCarouselItem?.type === "chart") {
32458
32462
  const chart = this.env.model.getters.getChartRuntime(this.selectedCarouselItem.chartId);
32459
32463
  cssProperties["background-color"] = chart.background;
32460
32464
  }
32465
+ else {
32466
+ cssProperties["background-color"] = "#ffffff";
32467
+ }
32461
32468
  return cssPropertiesToCss(cssProperties);
32462
32469
  }
32463
32470
  get title() {
@@ -32510,6 +32517,17 @@ stores.inject(MyMetaStore, storeInstance);
32510
32517
  this.menuState.anchorRect = rect;
32511
32518
  this.menuState.menuItems = createActions(menuItems);
32512
32519
  }
32520
+ toggleFullScreen() {
32521
+ if (this.selectedCarouselItem?.type === "chart") {
32522
+ this.fullScreenFigureStore.toggleFullScreenFigure(this.props.figureUI.id);
32523
+ }
32524
+ }
32525
+ get fullScreenButtonTitle() {
32526
+ return this.props.isFullScreen ? _t("Exit Full Screen") : _t("Full Screen");
32527
+ }
32528
+ get visibleCarouselItems() {
32529
+ return this.carousel.items.filter((item) => item.type === "carouselDataView" && this.props.isFullScreen ? false : true);
32530
+ }
32513
32531
  }
32514
32532
 
32515
32533
  class ChartFigure extends owl.Component {
@@ -32518,6 +32536,7 @@ stores.inject(MyMetaStore, storeInstance);
32518
32536
  figureUI: Object,
32519
32537
  onFigureDeleted: Function,
32520
32538
  editFigureStyle: { type: Function, optional: true },
32539
+ isFullScreen: { type: Boolean, optional: true },
32521
32540
  };
32522
32541
  static components = { ChartDashboardMenu };
32523
32542
  onDoubleClick() {
@@ -58659,7 +58678,7 @@ stores.inject(MyMetaStore, storeInstance);
58659
58678
  return undefined;
58660
58679
  }
58661
58680
  get isCalculatedMeasureInvalid() {
58662
- return this.env.model.getters.getMeasureCompiledFormula(this.props.measure).isBadExpression;
58681
+ return compile(this.props.measure.computedBy?.formula ?? "").isBadExpression;
58663
58682
  }
58664
58683
  }
58665
58684
 
@@ -61537,16 +61556,16 @@ stores.inject(MyMetaStore, storeInstance);
61537
61556
  }
61538
61557
  }
61539
61558
 
61540
- class FullScreenChart extends owl.Component {
61541
- static template = "o-spreadsheet-FullScreenChart";
61559
+ class FullScreenFigure extends owl.Component {
61560
+ static template = "o-spreadsheet-FullScreenFigure";
61542
61561
  static props = {};
61543
- static components = { ChartDashboardMenu };
61544
- fullScreenChartStore;
61545
- ref = owl.useRef("fullScreenChart");
61562
+ static components = { ChartFigure };
61563
+ fullScreenFigureStore;
61564
+ ref = owl.useRef("fullScreenFigure");
61546
61565
  spreadsheetRect = useSpreadsheetRect();
61547
61566
  figureRegistry = figureRegistry;
61548
61567
  setup() {
61549
- this.fullScreenChartStore = useStore(FullScreenChartStore);
61568
+ this.fullScreenFigureStore = useStore(FullScreenFigureStore);
61550
61569
  const animationStore = useStore(ChartAnimationStore);
61551
61570
  let lastFigureId = undefined;
61552
61571
  owl.onWillUpdateProps(() => {
@@ -61558,7 +61577,7 @@ stores.inject(MyMetaStore, storeInstance);
61558
61577
  owl.useEffect((el) => el?.focus(), () => [this.ref.el]);
61559
61578
  }
61560
61579
  get figureUI() {
61561
- return this.fullScreenChartStore.fullScreenFigure;
61580
+ return this.fullScreenFigureStore.fullScreenFigure;
61562
61581
  }
61563
61582
  get chartId() {
61564
61583
  if (!this.figureUI)
@@ -61567,7 +61586,7 @@ stores.inject(MyMetaStore, storeInstance);
61567
61586
  }
61568
61587
  exitFullScreen() {
61569
61588
  if (this.figureUI) {
61570
- this.fullScreenChartStore.toggleFullScreenChart(this.figureUI.id);
61589
+ this.fullScreenFigureStore.toggleFullScreenFigure(this.figureUI.id);
61571
61590
  }
61572
61591
  }
61573
61592
  onKeyDown(ev) {
@@ -61575,15 +61594,10 @@ stores.inject(MyMetaStore, storeInstance);
61575
61594
  this.exitFullScreen();
61576
61595
  }
61577
61596
  }
61578
- get chartComponent() {
61579
- if (!this.chartId)
61597
+ get figureComponent() {
61598
+ if (!this.figureUI)
61580
61599
  return undefined;
61581
- const type = this.env.model.getters.getChartType(this.chartId);
61582
- const component = chartComponentRegistry.get(type);
61583
- if (!component) {
61584
- throw new Error(`Component is not defined for type ${type}`);
61585
- }
61586
- return component;
61600
+ return figureRegistry.get(this.figureUI.tag).Component;
61587
61601
  }
61588
61602
  }
61589
61603
 
@@ -64323,11 +64337,11 @@ stores.inject(MyMetaStore, storeInstance);
64323
64337
  break;
64324
64338
  }
64325
64339
  case "ADD_COLUMNS_ROWS": {
64326
- const sizes = [...this.sizes[cmd.sheetId][cmd.dimension]];
64340
+ const sizes = this.sizes[cmd.sheetId][cmd.dimension];
64327
64341
  const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
64328
64342
  const baseSize = sizes[cmd.base];
64329
- sizes.splice(addIndex, 0, ...Array(cmd.quantity).fill(baseSize));
64330
- this.history.update("sizes", cmd.sheetId, cmd.dimension, sizes);
64343
+ const newSizes = insertItemsAtIndex(sizes, Array(cmd.quantity).fill(baseSize), addIndex);
64344
+ this.history.update("sizes", cmd.sheetId, cmd.dimension, newSizes);
64331
64345
  break;
64332
64346
  }
64333
64347
  case "RESIZE_COLUMNS_ROWS":
@@ -64478,9 +64492,8 @@ stores.inject(MyMetaStore, storeInstance);
64478
64492
  break;
64479
64493
  }
64480
64494
  case "ADD_COLUMNS_ROWS": {
64481
- const hiddenHeaders = [...this.hiddenHeaders[cmd.sheetId][cmd.dimension]];
64482
64495
  const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
64483
- hiddenHeaders.splice(addIndex, 0, ...Array(cmd.quantity).fill(false));
64496
+ const hiddenHeaders = insertItemsAtIndex([...this.hiddenHeaders[cmd.sheetId][cmd.dimension]], Array(cmd.quantity).fill(false), addIndex);
64484
64497
  this.history.update("hiddenHeaders", cmd.sheetId, cmd.dimension, hiddenHeaders);
64485
64498
  break;
64486
64499
  }
@@ -68664,12 +68677,12 @@ stores.inject(MyMetaStore, storeInstance);
68664
68677
  this.rTrees[sheetId].remove(item, this.rtreeItemComparer);
68665
68678
  }
68666
68679
  rtreeItemComparer(left, right) {
68667
- return (left.data === right.data &&
68668
- left.boundingBox.sheetId === right.boundingBox.sheetId &&
68680
+ return (left.boundingBox.sheetId === right.boundingBox.sheetId &&
68669
68681
  left.boundingBox?.zone.left === right.boundingBox.zone.left &&
68670
68682
  left.boundingBox?.zone.top === right.boundingBox.zone.top &&
68671
68683
  left.boundingBox?.zone.right === right.boundingBox.zone.right &&
68672
- left.boundingBox?.zone.bottom === right.boundingBox.zone.bottom);
68684
+ left.boundingBox?.zone.bottom === right.boundingBox.zone.bottom &&
68685
+ deepEquals(left.data, right.data));
68673
68686
  }
68674
68687
  }
68675
68688
  /**
@@ -74924,7 +74937,10 @@ stores.inject(MyMetaStore, storeInstance);
74924
74937
  return "Success" /* CommandResult.Success */;
74925
74938
  }
74926
74939
  checkArrayFormulaInSortZone({ sheetId, zone }) {
74927
- const arrayFormulaInZone = positions(zone).some(({ col, row }) => this.getters.getArrayFormulaSpreadingOn({ sheetId, col, row }));
74940
+ const arrayFormulaInZone = positions(zone).some(({ col, row }) => {
74941
+ const originPosition = this.getters.getArrayFormulaSpreadingOn({ sheetId, col, row });
74942
+ return originPosition && !deepEquals(originPosition, { sheetId, col, row });
74943
+ });
74928
74944
  return arrayFormulaInZone ? "SortZoneWithArrayFormulas" /* CommandResult.SortZoneWithArrayFormulas */ : "Success" /* CommandResult.Success */;
74929
74945
  }
74930
74946
  /**
@@ -82216,6 +82232,9 @@ stores.inject(MyMetaStore, storeInstance);
82216
82232
  ? this.composerFocusStore.focusMode
82217
82233
  : "inactive";
82218
82234
  }
82235
+ get showFxIcon() {
82236
+ return this.focus === "inactive" && !this.composerStore.currentContent;
82237
+ }
82219
82238
  get rect() {
82220
82239
  return this.composerRef.el
82221
82240
  ? getBoundingRectAsPOJO(this.composerRef.el)
@@ -82258,12 +82277,6 @@ stores.inject(MyMetaStore, storeInstance);
82258
82277
  }
82259
82278
 
82260
82279
  const COMPOSER_MAX_HEIGHT = 300;
82261
- /* svg free of use from https://uxwing.com/formula-fx-icon/ */
82262
- const FX_SVG = /*xml*/ `
82263
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 121.8 122.9' width='16' height='16' focusable='false'>
82264
- <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'/>
82265
- </svg>
82266
- `;
82267
82280
  css /* scss */ `
82268
82281
  .o-topbar-composer-container {
82269
82282
  height: ${DESKTOP_TOPBAR_TOOLBAR_HEIGHT}px;
@@ -82275,14 +82288,6 @@ stores.inject(MyMetaStore, storeInstance);
82275
82288
  margin-bottom: -1px;
82276
82289
  border: 1px solid;
82277
82290
  font-family: ${DEFAULT_FONT};
82278
-
82279
- /* In readonly we always show the fx icon if the composer is empty, not matter the focus */
82280
- .o-composer:empty:not(:focus):not(.active)::before,
82281
- &.o-topbar-composer-readonly .o-composer:empty::before {
82282
- content: url("data:image/svg+xml,${encodeURIComponent(FX_SVG)}");
82283
- position: relative;
82284
- top: 20%;
82285
- }
82286
82291
  }
82287
82292
 
82288
82293
  .user-select-text {
@@ -82315,6 +82320,9 @@ stores.inject(MyMetaStore, storeInstance);
82315
82320
  ? this.composerFocusStore.focusMode
82316
82321
  : "inactive";
82317
82322
  }
82323
+ get showFxIcon() {
82324
+ return this.focus === "inactive" && !this.composerStore.currentContent;
82325
+ }
82318
82326
  get composerStyle() {
82319
82327
  const style = {
82320
82328
  padding: "5px 0px 5px 8px",
@@ -83666,7 +83674,7 @@ stores.inject(MyMetaStore, storeInstance);
83666
83674
  SidePanels,
83667
83675
  SpreadsheetDashboard,
83668
83676
  HeaderGroupContainer,
83669
- FullScreenChart,
83677
+ FullScreenFigure,
83670
83678
  };
83671
83679
  sidePanel;
83672
83680
  spreadsheetRef = owl.useRef("spreadsheet");
@@ -88390,6 +88398,7 @@ stores.inject(MyMetaStore, storeInstance);
88390
88398
  Grid,
88391
88399
  GridOverlay,
88392
88400
  ScorecardChart,
88401
+ GaugeChartComponent,
88393
88402
  LineConfigPanel,
88394
88403
  BarConfigPanel,
88395
88404
  PieChartDesignPanel,
@@ -88428,7 +88437,7 @@ stores.inject(MyMetaStore, storeInstance);
88428
88437
  RadioSelection,
88429
88438
  GeoChartRegionSelectSection,
88430
88439
  ChartDashboardMenu,
88431
- FullScreenChart,
88440
+ FullScreenFigure,
88432
88441
  };
88433
88442
  const hooks = {
88434
88443
  useDragAndDropListItems,
@@ -88528,9 +88537,9 @@ stores.inject(MyMetaStore, storeInstance);
88528
88537
  exports.tokenize = tokenize;
88529
88538
 
88530
88539
 
88531
- __info__.version = "19.0.3";
88532
- __info__.date = "2025-09-19T07:26:41.356Z";
88533
- __info__.hash = "84f3b74";
88540
+ __info__.version = "19.0.5";
88541
+ __info__.date = "2025-10-07T10:04:06.400Z";
88542
+ __info__.hash = "86fc442";
88534
88543
 
88535
88544
 
88536
88545
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);