@odoo/o-spreadsheet 19.4.0-alpha.11 → 19.4.0-alpha.12

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.0-alpha.11
6
- * @date 2026-06-03T11:42:34.595Z
7
- * @hash 6f35bc7
5
+ * @version 19.4.0-alpha.12
6
+ * @date 2026-06-06T06:24:48.209Z
7
+ * @hash a71f829
8
8
  */
9
9
 
10
10
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
@@ -4323,6 +4323,7 @@ const DEFAULT_LOCALE_DIGIT_GROUPING = "[3,0]";
4323
4323
  //#endregion
4324
4324
  //#region src/helpers/format/format_tokenizer.ts
4325
4325
  function tokenizeFormat(str) {
4326
+ str = str.replace(/\s/g, " ");
4326
4327
  const chars = new TokenizingChars(str);
4327
4328
  const result = [];
4328
4329
  let currentFormatPart = [];
@@ -10570,7 +10571,7 @@ function getChartAxisTitleRuntime(design) {
10570
10571
  font: {
10571
10572
  style: italic ? "italic" : "normal",
10572
10573
  weight: bold ? "bold" : "normal",
10573
- size: design.title.fontSize ?? 12
10574
+ size: fontSizeInPixels(design.title.fontSize ?? 12)
10574
10575
  },
10575
10576
  align: align === "left" ? "start" : align === "right" ? "end" : "center"
10576
10577
  };
@@ -11192,7 +11193,7 @@ function getTextStyle(design, defaultDesign) {
11192
11193
  font: {
11193
11194
  weight: design?.bold ?? defaultDesign?.bold ? "bold" : "normal",
11194
11195
  style: design?.italic ?? defaultDesign?.italic ? "italic" : "normal",
11195
- size: design?.fontSize ?? defaultDesign?.fontSize
11196
+ size: fontSizeInPixels(design?.fontSize ?? defaultDesign.fontSize)
11196
11197
  }
11197
11198
  };
11198
11199
  }
@@ -12128,35 +12129,35 @@ var ScorecardChartConfigBuilder = class {
12128
12129
  if (this.runtime.progressBar) baselineValueFontSize /= 1.5;
12129
12130
  return {
12130
12131
  title: {
12131
- font: getDefaultContextFont(this.runtime.title.fontSize ?? 14, this.runtime.title.bold, this.runtime.title.italic),
12132
+ font: getDefaultContextFont(fontSizeInPixels(this.runtime.title.fontSize ?? 14), this.runtime.title.bold, this.runtime.title.italic),
12132
12133
  color: this.runtime.title.color ?? this.secondaryFontColor
12133
12134
  },
12134
12135
  keyValue: {
12135
12136
  color: this.runtime.keyValueStyle?.textColor || this.runtime.fontColor,
12136
- font: getDefaultContextFont(keyValueFontSize, this.runtime.keyValueStyle?.bold, this.runtime.keyValueStyle?.italic),
12137
+ font: getDefaultContextFont(fontSizeInPixels(keyValueFontSize), this.runtime.keyValueStyle?.bold, this.runtime.keyValueStyle?.italic),
12137
12138
  strikethrough: this.runtime.keyValueStyle?.strikethrough,
12138
12139
  underline: this.runtime.keyValueStyle?.underline
12139
12140
  },
12140
12141
  keyDescr: {
12141
12142
  color: this.runtime.keyValueDescrStyle?.textColor || this.runtime.fontColor,
12142
- font: getDefaultContextFont(keyValueDescrFontSize, this.runtime.keyValueDescrStyle?.bold, this.runtime.keyValueDescrStyle?.italic),
12143
+ font: getDefaultContextFont(fontSizeInPixels(keyValueDescrFontSize), this.runtime.keyValueDescrStyle?.bold, this.runtime.keyValueDescrStyle?.italic),
12143
12144
  strikethrough: this.runtime.keyValueDescrStyle?.strikethrough,
12144
12145
  underline: this.runtime.keyValueDescrStyle?.underline
12145
12146
  },
12146
12147
  baselineValue: {
12147
- font: getDefaultContextFont(baselineValueFontSize, this.runtime.baselineStyle?.bold, this.runtime.baselineStyle?.italic),
12148
+ font: getDefaultContextFont(fontSizeInPixels(baselineValueFontSize), this.runtime.baselineStyle?.bold, this.runtime.baselineStyle?.italic),
12148
12149
  strikethrough: this.runtime.baselineStyle?.strikethrough,
12149
12150
  underline: this.runtime.baselineStyle?.underline,
12150
12151
  color: this.runtime.baselineColor || this.runtime.baselineStyle?.textColor || this.secondaryFontColor
12151
12152
  },
12152
12153
  baselineDescr: {
12153
- font: getDefaultContextFont(baselineDescrFontSize, this.runtime.baselineDescrStyle?.bold, this.runtime.baselineDescrStyle?.italic),
12154
+ font: getDefaultContextFont(fontSizeInPixels(baselineDescrFontSize), this.runtime.baselineDescrStyle?.bold, this.runtime.baselineDescrStyle?.italic),
12154
12155
  strikethrough: this.runtime.baselineDescrStyle?.strikethrough,
12155
12156
  underline: this.runtime.baselineDescrStyle?.underline,
12156
12157
  color: this.runtime.baselineDescrStyle?.textColor ?? this.secondaryFontColor
12157
12158
  },
12158
12159
  baselineArrow: this.baselineArrow === "neutral" || this.runtime.progressBar ? void 0 : {
12159
- size: this.keyValue ? .8 * baselineValueFontSize : 0,
12160
+ size: this.keyValue ? .8 * fontSizeInPixels(baselineValueFontSize) : 0,
12160
12161
  color: this.runtime.baselineColor || this.runtime.baselineStyle?.textColor || this.secondaryFontColor
12161
12162
  }
12162
12163
  };
@@ -12366,7 +12367,7 @@ function drawInflectionValues(ctx, config) {
12366
12367
  function drawTitle(ctx, config) {
12367
12368
  ctx.save();
12368
12369
  const title = config.title;
12369
- ctx.font = getDefaultContextFont(title.fontSize, title.bold, title.italic);
12370
+ ctx.font = getDefaultContextFont(fontSizeInPixels(title.fontSize), title.bold, title.italic);
12370
12371
  ctx.textBaseline = "middle";
12371
12372
  ctx.fillStyle = title.color;
12372
12373
  ctx.fillText(title.label, title.textPosition.x, title.textPosition.y);
@@ -12400,8 +12401,8 @@ function getGaugeRenderingConfig(boundingRect, runtime, ctx) {
12400
12401
  const inflectionValues = getInflectionValues(runtime, gaugeRect, textColor, ctx);
12401
12402
  let x = 0, titleWidth = 0, titleHeight = 0;
12402
12403
  if (runtime.title.text) ({width: titleWidth, height: titleHeight} = computeTextDimension(ctx, runtime.title.text, {
12403
- fontSize: 16,
12404
- ...runtime.title
12404
+ ...runtime.title,
12405
+ fontSize: fontSizeInPixels(runtime.title.fontSize ?? 16)
12405
12406
  }, "px"));
12406
12407
  switch (runtime.title.align) {
12407
12408
  case "right":
@@ -13924,10 +13925,10 @@ var GaugeChartComponent = class extends Component {
13924
13925
  let animation = null;
13925
13926
  let lastRuntime = void 0;
13926
13927
  useLayoutEffect(() => {
13927
- if (this.env.isDashboard() && lastRuntime === void 0 && this.animationStore?.animationPlayed[this.animationChartId] !== "gauge") {
13928
+ if (this.env.model.getters.isDashboard() && lastRuntime === void 0 && this.animationStore?.animationPlayed[this.animationChartId] !== "gauge") {
13928
13929
  animation = this.drawGaugeWithAnimation();
13929
13930
  this.animationStore?.disableAnimationForChart(this.animationChartId, "gauge");
13930
- } else if (this.env.isDashboard() && lastRuntime !== void 0 && !deepEquals(this.runtime, lastRuntime)) {
13931
+ } else if (this.env.model.getters.isDashboard() && lastRuntime !== void 0 && !deepEquals(this.runtime, lastRuntime)) {
13931
13932
  animation = this.drawGaugeWithAnimation();
13932
13933
  this.animationStore?.disableAnimationForChart(this.animationChartId, "gauge");
13933
13934
  } else {
@@ -15218,10 +15219,12 @@ var CarouselFigure = class extends Component {
15218
15219
  return this.carousel.title?.text ?? "";
15219
15220
  }
15220
15221
  get titleStyle() {
15221
- return cssPropertiesToCss(cellTextStyleToCss(chartStyleToCellStyle({
15222
+ const style = {
15222
15223
  ...DEFAULT_CAROUSEL_TITLE_STYLE,
15223
15224
  ...this.carousel.title
15224
- })));
15225
+ };
15226
+ style.fontSize = fontSizeInPixels(style.fontSize ?? 16);
15227
+ return cssPropertiesToCss(cellTextStyleToCss(chartStyleToCellStyle(style)));
15225
15228
  }
15226
15229
  updateTabsVisibility() {
15227
15230
  const tabsContainerEl = this.carouselTabsRef();
@@ -15384,7 +15387,7 @@ var FigureComponent = class extends Component {
15384
15387
  return figureRegistry;
15385
15388
  }
15386
15389
  getBorderWidth() {
15387
- if (this.env.isDashboard()) return 0;
15390
+ if (this.env.model.getters.isDashboard()) return 0;
15388
15391
  return this.isSelected ? ACTIVE_BORDER_WIDTH : this.borderWidth;
15389
15392
  }
15390
15393
  getBorderStyle(position) {
@@ -15526,7 +15529,7 @@ var FigureComponent = class extends Component {
15526
15529
  };
15527
15530
  }
15528
15531
  onContextMenu(ev) {
15529
- if (this.env.isDashboard()) return;
15532
+ if (this.env.model.getters.isDashboard()) return;
15530
15533
  const zoomedMouseEvent = withZoom(this.env, ev);
15531
15534
  this.openContextMenu({
15532
15535
  x: zoomedMouseEvent.clientX,
@@ -15552,7 +15555,7 @@ var FigureComponent = class extends Component {
15552
15555
  if (el) for (const property in properties) el.style.setProperty(property, properties[property] || null);
15553
15556
  }
15554
15557
  get isFigureResizable() {
15555
- return this.isSelected && !this.env.isMobile() && !this.env.isDashboard() && !this.env.model.getters.isCurrentSheetLocked();
15558
+ return this.isSelected && !this.env.isMobile() && !this.env.model.getters.isDashboard() && !this.env.model.getters.isCurrentSheetLocked();
15556
15559
  }
15557
15560
  };
15558
15561
 
@@ -28481,7 +28484,7 @@ function getSunburstShowValues(definition, args) {
28481
28484
  showLabels: definition.showLabels ?? SunburstChartDefaults.showLabels,
28482
28485
  showValues: definition.showValues ?? SunburstChartDefaults.showValues,
28483
28486
  style: {
28484
- fontSize: definition.valuesDesign?.fontSize ?? SunburstChartDefaults.valuesDesign.fontSize,
28487
+ fontSize: fontSizeInPixels(definition.valuesDesign?.fontSize ?? SunburstChartDefaults.valuesDesign.fontSize),
28485
28488
  align: definition.valuesDesign?.align ?? SunburstChartDefaults.valuesDesign.align,
28486
28489
  bold: definition.valuesDesign?.bold ?? SunburstChartDefaults.valuesDesign.bold,
28487
28490
  italic: definition.valuesDesign?.italic ?? SunburstChartDefaults.valuesDesign.italic,
@@ -28536,7 +28539,7 @@ function getChartTitle({ title, legendPosition, background }, getters) {
28536
28539
  color: title?.color ?? fontColor,
28537
28540
  align: title.align === "center" ? "center" : title.align === "right" ? "end" : "start",
28538
28541
  font: {
28539
- size: title.fontSize ?? 16,
28542
+ size: fontSizeInPixels(title.fontSize ?? 16),
28540
28543
  weight: title.bold ? "bold" : "normal",
28541
28544
  style: title.italic ? "italic" : "normal"
28542
28545
  },
@@ -38785,7 +38788,8 @@ var PivotDimensionOrder = class extends Component {
38785
38788
  static template = "o-spreadsheet-PivotDimensionOrder";
38786
38789
  props = (0, _odoo_owl.props)({
38787
38790
  dimension: types$6.PivotDimension(),
38788
- onUpdated: types$6.function([types$6.PivotDimension(), types$6.instanceOf(InputEvent)])
38791
+ onUpdated: types$6.function([types$6.PivotDimension(), types$6.instanceOf(InputEvent)]),
38792
+ "isMeasureSorted?": types$6.boolean()
38789
38793
  });
38790
38794
  static components = { Select };
38791
38795
  get orderSelectOptions() {
@@ -38796,12 +38800,20 @@ var PivotDimensionOrder = class extends Component {
38796
38800
  value: "desc",
38797
38801
  label: _t("Descending")
38798
38802
  }];
38803
+ if (this.props.isMeasureSorted) options.unshift({
38804
+ value: "measures",
38805
+ label: _t("Sorted by measure")
38806
+ });
38799
38807
  if (this.props.dimension.type === "date") return options;
38800
38808
  return [{
38801
38809
  value: "",
38802
38810
  label: _t("Unsorted")
38803
38811
  }, ...options];
38804
38812
  }
38813
+ get selectedValue() {
38814
+ if (this.props.isMeasureSorted) return "measures";
38815
+ return this.props.dimension.order || "";
38816
+ }
38805
38817
  };
38806
38818
 
38807
38819
  //#endregion
@@ -39172,7 +39184,8 @@ var PivotLayoutConfigurator = class extends Component {
39172
39184
  return this.env.model.getters.getPivotCoreDefinition(this.props.pivotId).customFields?.[dimension.nameWithGranularity];
39173
39185
  }
39174
39186
  updateOrder(updateDimension, order) {
39175
- const { rows, columns } = this.props.definition;
39187
+ const { rows, columns, sortedColumn } = this.props.definition;
39188
+ const isRow = rows.some((row) => row.nameWithGranularity === updateDimension.nameWithGranularity);
39176
39189
  this.props.onDimensionsUpdated({
39177
39190
  rows: rows.map((row) => {
39178
39191
  if (row.nameWithGranularity === updateDimension.nameWithGranularity) return {
@@ -39187,7 +39200,8 @@ var PivotLayoutConfigurator = class extends Component {
39187
39200
  order: order || void 0
39188
39201
  };
39189
39202
  return col;
39190
- })
39203
+ }),
39204
+ sortedColumn: isRow ? void 0 : sortedColumn
39191
39205
  });
39192
39206
  }
39193
39207
  updateGranularity(dimension, granularity) {
@@ -39213,6 +39227,9 @@ var PivotLayoutConfigurator = class extends Component {
39213
39227
  const possibleValues = this.env.model.getters.getPivot(this.props.pivotId).getPossibleFieldValues(dimension);
39214
39228
  return possibleValues.length > 100 ? _t("This dimension contains a lot of values (%s), and might slow down the pivot table.", possibleValues.length) : void 0;
39215
39229
  }
39230
+ get hasSortedColumn() {
39231
+ return !!this.props.definition.sortedColumn;
39232
+ }
39216
39233
  };
39217
39234
 
39218
39235
  //#endregion
@@ -59011,9 +59028,11 @@ var PivotUIPlugin = class extends CoreViewPlugin {
59011
59028
  this.refreshPivot(cmd.id);
59012
59029
  break;
59013
59030
  case "ADD_PIVOT":
59031
+ this.unusedPivotsInFormulas?.push(cmd.pivotId);
59014
59032
  this.setupPivot(cmd.pivotId);
59015
59033
  break;
59016
59034
  case "DUPLICATE_PIVOT":
59035
+ this.unusedPivotsInFormulas?.push(cmd.newPivotId);
59017
59036
  this.setupPivot(cmd.newPivotId);
59018
59037
  break;
59019
59038
  case "UPDATE_PIVOT":
@@ -59205,8 +59224,8 @@ var PivotUIPlugin = class extends CoreViewPlugin {
59205
59224
  }
59206
59225
  }
59207
59226
  for (const pivotId of this.getters.getPivotIds()) {
59208
- const pivot = this.getters.getPivot(pivotId);
59209
- for (const measure of pivot.definition.measures) if (measure.computedBy) {
59227
+ const pivot = this.getters.getPivotCoreDefinition(pivotId);
59228
+ for (const measure of pivot.measures) if (measure.computedBy) {
59210
59229
  const { sheetId } = measure.computedBy;
59211
59230
  const formula = this.getters.getMeasureCompiledFormula(pivotId, measure);
59212
59231
  const relatedPivotIds = this.getPivotIdsFromFormula(sheetId, formula);
@@ -70968,7 +70987,7 @@ var Spreadsheet = class extends Component {
70968
70987
  properties["color-scheme"] = this.props.model.getters.isDarkMode() ? "dark" : "light";
70969
70988
  if (this.state.printModeEnabled) properties["display"] = `block`;
70970
70989
  else {
70971
- if (this.env.isDashboard()) properties["grid-template-rows"] = `auto`;
70990
+ if (this.env.model.getters.isDashboard()) properties["grid-template-rows"] = `auto`;
70972
70991
  else properties["grid-template-rows"] = `min-content auto min-content`;
70973
70992
  properties["grid-template-columns"] = `auto ${this.sidePanel.mainPanel ? `${this.sidePanel.totalPanelSize || 350}px` : "auto"}`;
70974
70993
  }
@@ -70996,7 +71015,6 @@ var Spreadsheet = class extends Component {
70996
71015
  imageProvider: fileStore ? new ImageProvider(fileStore) : void 0,
70997
71016
  loadCurrencies: this.model.config.external.loadCurrencies,
70998
71017
  loadLocales: this.model.config.external.loadLocales,
70999
- isDashboard: () => this.model.getters.isDashboard(),
71000
71018
  openSidePanel: this.sidePanel.open.bind(this.sidePanel),
71001
71019
  replaceSidePanel: this.sidePanel.replace.bind(this.sidePanel),
71002
71020
  toggleSidePanel: this.sidePanel.toggle.bind(this.sidePanel),
@@ -86245,7 +86263,8 @@ const registries = {
86245
86263
  pivotToFunctionValueRegistry,
86246
86264
  migrationStepRegistry,
86247
86265
  chartJsExtensionRegistry,
86248
- onIterationEndEvaluationRegistry
86266
+ onIterationEndEvaluationRegistry,
86267
+ specificRangeTransformRegistry
86249
86268
  };
86250
86269
  const helpers = {
86251
86270
  arg,
@@ -86545,6 +86564,6 @@ exports.stores = stores;
86545
86564
  exports.tokenColors = tokenColors;
86546
86565
  exports.tokenize = tokenize;
86547
86566
 
86548
- __info__.version = "19.4.0-alpha.11";
86549
- __info__.date = "2026-06-03T11:42:34.595Z";
86550
- __info__.hash = "6f35bc7";
86567
+ __info__.version = "19.4.0-alpha.12";
86568
+ __info__.date = "2026-06-06T06:24:48.209Z";
86569
+ __info__.hash = "a71f829";
@@ -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.0-alpha.11
6
- * @date 2026-06-03T11:42:36.487Z
7
- * @hash 6f35bc7
5
+ * @version 19.4.0-alpha.12
6
+ * @date 2026-06-06T06:24:50.084Z
7
+ * @hash a71f829
8
8
  */
9
9
  :root {
10
10
  --os-gray-100: light-dark(#f9fafb, #1b1d26);
@@ -2251,6 +2251,7 @@
2251
2251
  /* Originates from src/components/headers_overlay/headers_overlay.css */
2252
2252
  .o-spreadsheet {
2253
2253
  .o-col-resizer {
2254
+ z-index: calc(var(--os-components-importance-grid) + 1);
2254
2255
  position: absolute;
2255
2256
  top: 0;
2256
2257
  left: var(--os-header-width);
@@ -2293,12 +2294,12 @@
2293
2294
  background-color: var(--os-selection-border-color);
2294
2295
  }
2295
2296
  .o-unhide:hover {
2296
- z-index: calc(var(--os-components-importance-grid) + 1);
2297
2297
  background-color: var(--os-gray-400);
2298
2298
  }
2299
2299
  }
2300
2300
 
2301
2301
  .o-row-resizer {
2302
+ z-index: calc(var(--os-components-importance-grid) + 1);
2302
2303
  position: absolute;
2303
2304
  top: var(--os-header-height);
2304
2305
  left: 0;
@@ -2340,7 +2341,6 @@
2340
2341
  background-color: var(--os-selection-border-color);
2341
2342
  }
2342
2343
  .o-unhide:hover {
2343
- z-index: calc(var(--os-components-importance-grid) + 1);
2344
2344
  background-color: var(--os-gray-400);
2345
2345
  }
2346
2346
  }
@@ -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.0-alpha.11
6
- * @date 2026-06-03T11:42:34.595Z
7
- * @hash 6f35bc7
5
+ * @version 19.4.0-alpha.12
6
+ * @date 2026-06-06T06:24:48.209Z
7
+ * @hash a71f829
8
8
  */
9
9
 
10
10
  import { App, Component, EnvPlugin, Plugin, __ODOO_COMPATIBILITY_LAYER_ADDED__, blockDom, config, markRaw, onMounted, onPatched, onWillPatch, onWillStart, onWillUnmount, onWillUpdateProps, plugin, props, providePlugins, proxy, signal, status, toRaw, types, useChildEnv, useChildSubEnv, useComponent, useEffect, useEnv, useExternalListener, useLayoutEffect, useListener, useScope, useSubEnv, whenReady, xml } from "@odoo/owl";
@@ -4322,6 +4322,7 @@ const DEFAULT_LOCALE_DIGIT_GROUPING = "[3,0]";
4322
4322
  //#endregion
4323
4323
  //#region src/helpers/format/format_tokenizer.ts
4324
4324
  function tokenizeFormat(str) {
4325
+ str = str.replace(/\s/g, " ");
4325
4326
  const chars = new TokenizingChars(str);
4326
4327
  const result = [];
4327
4328
  let currentFormatPart = [];
@@ -10569,7 +10570,7 @@ function getChartAxisTitleRuntime(design) {
10569
10570
  font: {
10570
10571
  style: italic ? "italic" : "normal",
10571
10572
  weight: bold ? "bold" : "normal",
10572
- size: design.title.fontSize ?? 12
10573
+ size: fontSizeInPixels(design.title.fontSize ?? 12)
10573
10574
  },
10574
10575
  align: align === "left" ? "start" : align === "right" ? "end" : "center"
10575
10576
  };
@@ -11191,7 +11192,7 @@ function getTextStyle(design, defaultDesign) {
11191
11192
  font: {
11192
11193
  weight: design?.bold ?? defaultDesign?.bold ? "bold" : "normal",
11193
11194
  style: design?.italic ?? defaultDesign?.italic ? "italic" : "normal",
11194
- size: design?.fontSize ?? defaultDesign?.fontSize
11195
+ size: fontSizeInPixels(design?.fontSize ?? defaultDesign.fontSize)
11195
11196
  }
11196
11197
  };
11197
11198
  }
@@ -12127,35 +12128,35 @@ var ScorecardChartConfigBuilder = class {
12127
12128
  if (this.runtime.progressBar) baselineValueFontSize /= 1.5;
12128
12129
  return {
12129
12130
  title: {
12130
- font: getDefaultContextFont(this.runtime.title.fontSize ?? 14, this.runtime.title.bold, this.runtime.title.italic),
12131
+ font: getDefaultContextFont(fontSizeInPixels(this.runtime.title.fontSize ?? 14), this.runtime.title.bold, this.runtime.title.italic),
12131
12132
  color: this.runtime.title.color ?? this.secondaryFontColor
12132
12133
  },
12133
12134
  keyValue: {
12134
12135
  color: this.runtime.keyValueStyle?.textColor || this.runtime.fontColor,
12135
- font: getDefaultContextFont(keyValueFontSize, this.runtime.keyValueStyle?.bold, this.runtime.keyValueStyle?.italic),
12136
+ font: getDefaultContextFont(fontSizeInPixels(keyValueFontSize), this.runtime.keyValueStyle?.bold, this.runtime.keyValueStyle?.italic),
12136
12137
  strikethrough: this.runtime.keyValueStyle?.strikethrough,
12137
12138
  underline: this.runtime.keyValueStyle?.underline
12138
12139
  },
12139
12140
  keyDescr: {
12140
12141
  color: this.runtime.keyValueDescrStyle?.textColor || this.runtime.fontColor,
12141
- font: getDefaultContextFont(keyValueDescrFontSize, this.runtime.keyValueDescrStyle?.bold, this.runtime.keyValueDescrStyle?.italic),
12142
+ font: getDefaultContextFont(fontSizeInPixels(keyValueDescrFontSize), this.runtime.keyValueDescrStyle?.bold, this.runtime.keyValueDescrStyle?.italic),
12142
12143
  strikethrough: this.runtime.keyValueDescrStyle?.strikethrough,
12143
12144
  underline: this.runtime.keyValueDescrStyle?.underline
12144
12145
  },
12145
12146
  baselineValue: {
12146
- font: getDefaultContextFont(baselineValueFontSize, this.runtime.baselineStyle?.bold, this.runtime.baselineStyle?.italic),
12147
+ font: getDefaultContextFont(fontSizeInPixels(baselineValueFontSize), this.runtime.baselineStyle?.bold, this.runtime.baselineStyle?.italic),
12147
12148
  strikethrough: this.runtime.baselineStyle?.strikethrough,
12148
12149
  underline: this.runtime.baselineStyle?.underline,
12149
12150
  color: this.runtime.baselineColor || this.runtime.baselineStyle?.textColor || this.secondaryFontColor
12150
12151
  },
12151
12152
  baselineDescr: {
12152
- font: getDefaultContextFont(baselineDescrFontSize, this.runtime.baselineDescrStyle?.bold, this.runtime.baselineDescrStyle?.italic),
12153
+ font: getDefaultContextFont(fontSizeInPixels(baselineDescrFontSize), this.runtime.baselineDescrStyle?.bold, this.runtime.baselineDescrStyle?.italic),
12153
12154
  strikethrough: this.runtime.baselineDescrStyle?.strikethrough,
12154
12155
  underline: this.runtime.baselineDescrStyle?.underline,
12155
12156
  color: this.runtime.baselineDescrStyle?.textColor ?? this.secondaryFontColor
12156
12157
  },
12157
12158
  baselineArrow: this.baselineArrow === "neutral" || this.runtime.progressBar ? void 0 : {
12158
- size: this.keyValue ? .8 * baselineValueFontSize : 0,
12159
+ size: this.keyValue ? .8 * fontSizeInPixels(baselineValueFontSize) : 0,
12159
12160
  color: this.runtime.baselineColor || this.runtime.baselineStyle?.textColor || this.secondaryFontColor
12160
12161
  }
12161
12162
  };
@@ -12365,7 +12366,7 @@ function drawInflectionValues(ctx, config) {
12365
12366
  function drawTitle(ctx, config) {
12366
12367
  ctx.save();
12367
12368
  const title = config.title;
12368
- ctx.font = getDefaultContextFont(title.fontSize, title.bold, title.italic);
12369
+ ctx.font = getDefaultContextFont(fontSizeInPixels(title.fontSize), title.bold, title.italic);
12369
12370
  ctx.textBaseline = "middle";
12370
12371
  ctx.fillStyle = title.color;
12371
12372
  ctx.fillText(title.label, title.textPosition.x, title.textPosition.y);
@@ -12399,8 +12400,8 @@ function getGaugeRenderingConfig(boundingRect, runtime, ctx) {
12399
12400
  const inflectionValues = getInflectionValues(runtime, gaugeRect, textColor, ctx);
12400
12401
  let x = 0, titleWidth = 0, titleHeight = 0;
12401
12402
  if (runtime.title.text) ({width: titleWidth, height: titleHeight} = computeTextDimension(ctx, runtime.title.text, {
12402
- fontSize: 16,
12403
- ...runtime.title
12403
+ ...runtime.title,
12404
+ fontSize: fontSizeInPixels(runtime.title.fontSize ?? 16)
12404
12405
  }, "px"));
12405
12406
  switch (runtime.title.align) {
12406
12407
  case "right":
@@ -13923,10 +13924,10 @@ var GaugeChartComponent = class extends Component$1 {
13923
13924
  let animation = null;
13924
13925
  let lastRuntime = void 0;
13925
13926
  useLayoutEffect$1(() => {
13926
- if (this.env.isDashboard() && lastRuntime === void 0 && this.animationStore?.animationPlayed[this.animationChartId] !== "gauge") {
13927
+ if (this.env.model.getters.isDashboard() && lastRuntime === void 0 && this.animationStore?.animationPlayed[this.animationChartId] !== "gauge") {
13927
13928
  animation = this.drawGaugeWithAnimation();
13928
13929
  this.animationStore?.disableAnimationForChart(this.animationChartId, "gauge");
13929
- } else if (this.env.isDashboard() && lastRuntime !== void 0 && !deepEquals(this.runtime, lastRuntime)) {
13930
+ } else if (this.env.model.getters.isDashboard() && lastRuntime !== void 0 && !deepEquals(this.runtime, lastRuntime)) {
13930
13931
  animation = this.drawGaugeWithAnimation();
13931
13932
  this.animationStore?.disableAnimationForChart(this.animationChartId, "gauge");
13932
13933
  } else {
@@ -15217,10 +15218,12 @@ var CarouselFigure = class extends Component$1 {
15217
15218
  return this.carousel.title?.text ?? "";
15218
15219
  }
15219
15220
  get titleStyle() {
15220
- return cssPropertiesToCss(cellTextStyleToCss(chartStyleToCellStyle({
15221
+ const style = {
15221
15222
  ...DEFAULT_CAROUSEL_TITLE_STYLE,
15222
15223
  ...this.carousel.title
15223
- })));
15224
+ };
15225
+ style.fontSize = fontSizeInPixels(style.fontSize ?? 16);
15226
+ return cssPropertiesToCss(cellTextStyleToCss(chartStyleToCellStyle(style)));
15224
15227
  }
15225
15228
  updateTabsVisibility() {
15226
15229
  const tabsContainerEl = this.carouselTabsRef();
@@ -15383,7 +15386,7 @@ var FigureComponent = class extends Component$1 {
15383
15386
  return figureRegistry;
15384
15387
  }
15385
15388
  getBorderWidth() {
15386
- if (this.env.isDashboard()) return 0;
15389
+ if (this.env.model.getters.isDashboard()) return 0;
15387
15390
  return this.isSelected ? ACTIVE_BORDER_WIDTH : this.borderWidth;
15388
15391
  }
15389
15392
  getBorderStyle(position) {
@@ -15525,7 +15528,7 @@ var FigureComponent = class extends Component$1 {
15525
15528
  };
15526
15529
  }
15527
15530
  onContextMenu(ev) {
15528
- if (this.env.isDashboard()) return;
15531
+ if (this.env.model.getters.isDashboard()) return;
15529
15532
  const zoomedMouseEvent = withZoom(this.env, ev);
15530
15533
  this.openContextMenu({
15531
15534
  x: zoomedMouseEvent.clientX,
@@ -15551,7 +15554,7 @@ var FigureComponent = class extends Component$1 {
15551
15554
  if (el) for (const property in properties) el.style.setProperty(property, properties[property] || null);
15552
15555
  }
15553
15556
  get isFigureResizable() {
15554
- return this.isSelected && !this.env.isMobile() && !this.env.isDashboard() && !this.env.model.getters.isCurrentSheetLocked();
15557
+ return this.isSelected && !this.env.isMobile() && !this.env.model.getters.isDashboard() && !this.env.model.getters.isCurrentSheetLocked();
15555
15558
  }
15556
15559
  };
15557
15560
 
@@ -28480,7 +28483,7 @@ function getSunburstShowValues(definition, args) {
28480
28483
  showLabels: definition.showLabels ?? SunburstChartDefaults.showLabels,
28481
28484
  showValues: definition.showValues ?? SunburstChartDefaults.showValues,
28482
28485
  style: {
28483
- fontSize: definition.valuesDesign?.fontSize ?? SunburstChartDefaults.valuesDesign.fontSize,
28486
+ fontSize: fontSizeInPixels(definition.valuesDesign?.fontSize ?? SunburstChartDefaults.valuesDesign.fontSize),
28484
28487
  align: definition.valuesDesign?.align ?? SunburstChartDefaults.valuesDesign.align,
28485
28488
  bold: definition.valuesDesign?.bold ?? SunburstChartDefaults.valuesDesign.bold,
28486
28489
  italic: definition.valuesDesign?.italic ?? SunburstChartDefaults.valuesDesign.italic,
@@ -28535,7 +28538,7 @@ function getChartTitle({ title, legendPosition, background }, getters) {
28535
28538
  color: title?.color ?? fontColor,
28536
28539
  align: title.align === "center" ? "center" : title.align === "right" ? "end" : "start",
28537
28540
  font: {
28538
- size: title.fontSize ?? 16,
28541
+ size: fontSizeInPixels(title.fontSize ?? 16),
28539
28542
  weight: title.bold ? "bold" : "normal",
28540
28543
  style: title.italic ? "italic" : "normal"
28541
28544
  },
@@ -38784,7 +38787,8 @@ var PivotDimensionOrder = class extends Component$1 {
38784
38787
  static template = "o-spreadsheet-PivotDimensionOrder";
38785
38788
  props = props({
38786
38789
  dimension: types$1.PivotDimension(),
38787
- onUpdated: types$1.function([types$1.PivotDimension(), types$1.instanceOf(InputEvent)])
38790
+ onUpdated: types$1.function([types$1.PivotDimension(), types$1.instanceOf(InputEvent)]),
38791
+ "isMeasureSorted?": types$1.boolean()
38788
38792
  });
38789
38793
  static components = { Select };
38790
38794
  get orderSelectOptions() {
@@ -38795,12 +38799,20 @@ var PivotDimensionOrder = class extends Component$1 {
38795
38799
  value: "desc",
38796
38800
  label: _t("Descending")
38797
38801
  }];
38802
+ if (this.props.isMeasureSorted) options.unshift({
38803
+ value: "measures",
38804
+ label: _t("Sorted by measure")
38805
+ });
38798
38806
  if (this.props.dimension.type === "date") return options;
38799
38807
  return [{
38800
38808
  value: "",
38801
38809
  label: _t("Unsorted")
38802
38810
  }, ...options];
38803
38811
  }
38812
+ get selectedValue() {
38813
+ if (this.props.isMeasureSorted) return "measures";
38814
+ return this.props.dimension.order || "";
38815
+ }
38804
38816
  };
38805
38817
 
38806
38818
  //#endregion
@@ -39171,7 +39183,8 @@ var PivotLayoutConfigurator = class extends Component$1 {
39171
39183
  return this.env.model.getters.getPivotCoreDefinition(this.props.pivotId).customFields?.[dimension.nameWithGranularity];
39172
39184
  }
39173
39185
  updateOrder(updateDimension, order) {
39174
- const { rows, columns } = this.props.definition;
39186
+ const { rows, columns, sortedColumn } = this.props.definition;
39187
+ const isRow = rows.some((row) => row.nameWithGranularity === updateDimension.nameWithGranularity);
39175
39188
  this.props.onDimensionsUpdated({
39176
39189
  rows: rows.map((row) => {
39177
39190
  if (row.nameWithGranularity === updateDimension.nameWithGranularity) return {
@@ -39186,7 +39199,8 @@ var PivotLayoutConfigurator = class extends Component$1 {
39186
39199
  order: order || void 0
39187
39200
  };
39188
39201
  return col;
39189
- })
39202
+ }),
39203
+ sortedColumn: isRow ? void 0 : sortedColumn
39190
39204
  });
39191
39205
  }
39192
39206
  updateGranularity(dimension, granularity) {
@@ -39212,6 +39226,9 @@ var PivotLayoutConfigurator = class extends Component$1 {
39212
39226
  const possibleValues = this.env.model.getters.getPivot(this.props.pivotId).getPossibleFieldValues(dimension);
39213
39227
  return possibleValues.length > 100 ? _t("This dimension contains a lot of values (%s), and might slow down the pivot table.", possibleValues.length) : void 0;
39214
39228
  }
39229
+ get hasSortedColumn() {
39230
+ return !!this.props.definition.sortedColumn;
39231
+ }
39215
39232
  };
39216
39233
 
39217
39234
  //#endregion
@@ -58826,9 +58843,11 @@ var PivotUIPlugin = class extends CoreViewPlugin {
58826
58843
  this.refreshPivot(cmd.id);
58827
58844
  break;
58828
58845
  case "ADD_PIVOT":
58846
+ this.unusedPivotsInFormulas?.push(cmd.pivotId);
58829
58847
  this.setupPivot(cmd.pivotId);
58830
58848
  break;
58831
58849
  case "DUPLICATE_PIVOT":
58850
+ this.unusedPivotsInFormulas?.push(cmd.newPivotId);
58832
58851
  this.setupPivot(cmd.newPivotId);
58833
58852
  break;
58834
58853
  case "UPDATE_PIVOT":
@@ -59020,8 +59039,8 @@ var PivotUIPlugin = class extends CoreViewPlugin {
59020
59039
  }
59021
59040
  }
59022
59041
  for (const pivotId of this.getters.getPivotIds()) {
59023
- const pivot = this.getters.getPivot(pivotId);
59024
- for (const measure of pivot.definition.measures) if (measure.computedBy) {
59042
+ const pivot = this.getters.getPivotCoreDefinition(pivotId);
59043
+ for (const measure of pivot.measures) if (measure.computedBy) {
59025
59044
  const { sheetId } = measure.computedBy;
59026
59045
  const formula = this.getters.getMeasureCompiledFormula(pivotId, measure);
59027
59046
  const relatedPivotIds = this.getPivotIdsFromFormula(sheetId, formula);
@@ -70783,7 +70802,7 @@ var Spreadsheet = class extends Component$1 {
70783
70802
  properties["color-scheme"] = this.props.model.getters.isDarkMode() ? "dark" : "light";
70784
70803
  if (this.state.printModeEnabled) properties["display"] = `block`;
70785
70804
  else {
70786
- if (this.env.isDashboard()) properties["grid-template-rows"] = `auto`;
70805
+ if (this.env.model.getters.isDashboard()) properties["grid-template-rows"] = `auto`;
70787
70806
  else properties["grid-template-rows"] = `min-content auto min-content`;
70788
70807
  properties["grid-template-columns"] = `auto ${this.sidePanel.mainPanel ? `${this.sidePanel.totalPanelSize || 350}px` : "auto"}`;
70789
70808
  }
@@ -70811,7 +70830,6 @@ var Spreadsheet = class extends Component$1 {
70811
70830
  imageProvider: fileStore ? new ImageProvider(fileStore) : void 0,
70812
70831
  loadCurrencies: this.model.config.external.loadCurrencies,
70813
70832
  loadLocales: this.model.config.external.loadLocales,
70814
- isDashboard: () => this.model.getters.isDashboard(),
70815
70833
  openSidePanel: this.sidePanel.open.bind(this.sidePanel),
70816
70834
  replaceSidePanel: this.sidePanel.replace.bind(this.sidePanel),
70817
70835
  toggleSidePanel: this.sidePanel.toggle.bind(this.sidePanel),
@@ -86060,7 +86078,8 @@ const registries = {
86060
86078
  pivotToFunctionValueRegistry,
86061
86079
  migrationStepRegistry,
86062
86080
  chartJsExtensionRegistry,
86063
- onIterationEndEvaluationRegistry
86081
+ onIterationEndEvaluationRegistry,
86082
+ specificRangeTransformRegistry
86064
86083
  };
86065
86084
  const helpers = {
86066
86085
  arg,
@@ -86266,6 +86285,6 @@ const chartHelpers = {
86266
86285
  //#endregion
86267
86286
  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 };
86268
86287
 
86269
- __info__.version = "19.4.0-alpha.11";
86270
- __info__.date = "2026-06-03T11:42:34.595Z";
86271
- __info__.hash = "6f35bc7";
86288
+ __info__.version = "19.4.0-alpha.12";
86289
+ __info__.date = "2026-06-06T06:24:48.209Z";
86290
+ __info__.hash = "a71f829";