@odoo/o-spreadsheet 17.1.13 → 17.1.15

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 17.1.13
6
- * @date 2024-04-26T07:39:54.100Z
7
- * @hash f2ea8c7
5
+ * @version 17.1.15
6
+ * @date 2024-05-15T09:22:23.258Z
7
+ * @hash fc959fe
8
8
  */
9
9
 
10
10
  'use strict';
@@ -543,7 +543,7 @@ function getAddHeaderStartIndex(position, base) {
543
543
  /**
544
544
  * Compares two objects.
545
545
  */
546
- function deepEquals(o1, o2) {
546
+ function deepEquals(o1, o2, ignoreFunctions) {
547
547
  if (o1 === o2)
548
548
  return true;
549
549
  if ((o1 && !o2) || (o2 && !o1))
@@ -559,13 +559,16 @@ function deepEquals(o1, o2) {
559
559
  }
560
560
  }
561
561
  for (const key in o1) {
562
- if (typeof o1[key] !== typeof o2[key])
562
+ const typeOfO1Key = typeof o1[key];
563
+ if (typeOfO1Key !== typeof o2[key])
563
564
  return false;
564
- if (typeof o1[key] === "object") {
565
- if (!deepEquals(o1[key], o2[key]))
565
+ if (typeOfO1Key === "object") {
566
+ if (!deepEquals(o1[key], o2[key], ignoreFunctions))
566
567
  return false;
567
568
  }
568
569
  else {
570
+ if (ignoreFunctions && typeOfO1Key === "function")
571
+ return true;
569
572
  if (o1[key] !== o2[key])
570
573
  return false;
571
574
  }
@@ -3625,21 +3628,22 @@ function toZoneWithoutBoundaryChanges(xc) {
3625
3628
  xc = xc.split("!").at(-1);
3626
3629
  }
3627
3630
  if (xc.includes("$")) {
3628
- xc = xc.replace(/\$/g, "");
3631
+ xc = xc.replaceAll("$", "");
3629
3632
  }
3630
- let ranges;
3633
+ let firstRangePart = "";
3634
+ let secondRangePart;
3631
3635
  if (xc.includes(":")) {
3632
- ranges = xc.split(":").map((x) => x.trim());
3636
+ [firstRangePart, secondRangePart] = xc.split(":");
3637
+ firstRangePart = firstRangePart.trim();
3638
+ secondRangePart = secondRangePart.trim();
3633
3639
  }
3634
3640
  else {
3635
- ranges = [xc.trim()];
3641
+ firstRangePart = xc.trim();
3636
3642
  }
3637
3643
  let top, bottom, left, right;
3638
3644
  let fullCol = false;
3639
3645
  let fullRow = false;
3640
3646
  let hasHeader = false;
3641
- const firstRangePart = ranges[0];
3642
- const secondRangePart = ranges[1] && ranges[1];
3643
3647
  if (isColReference(firstRangePart)) {
3644
3648
  left = right = lettersToNumber(firstRangePart);
3645
3649
  top = bottom = 0;
@@ -3656,7 +3660,7 @@ function toZoneWithoutBoundaryChanges(xc) {
3656
3660
  top = bottom = c.row;
3657
3661
  hasHeader = true;
3658
3662
  }
3659
- if (ranges.length === 2) {
3663
+ if (secondRangePart) {
3660
3664
  if (isColReference(secondRangePart)) {
3661
3665
  right = lettersToNumber(secondRangePart);
3662
3666
  fullCol = true;
@@ -4830,6 +4834,7 @@ class ChartJsComponent extends owl.Component {
4830
4834
  };
4831
4835
  canvas = owl.useRef("graphContainer");
4832
4836
  chart;
4837
+ currentRuntime;
4833
4838
  get background() {
4834
4839
  return this.chartRuntime.background;
4835
4840
  }
@@ -4846,9 +4851,18 @@ class ChartJsComponent extends owl.Component {
4846
4851
  setup() {
4847
4852
  owl.onMounted(() => {
4848
4853
  const runtime = this.chartRuntime;
4849
- this.createChart(runtime.chartJsConfig);
4854
+ this.currentRuntime = runtime;
4855
+ // Note: chartJS modify the runtime in place, so it's important to give it a copy
4856
+ this.createChart(deepCopy(runtime.chartJsConfig));
4857
+ });
4858
+ owl.onWillUnmount(() => this.chart?.destroy());
4859
+ owl.useEffect(() => {
4860
+ const runtime = this.chartRuntime;
4861
+ if (!deepEquals(runtime, this.currentRuntime, "ignoreFunctions")) {
4862
+ this.currentRuntime = runtime;
4863
+ this.updateChartJs(deepCopy(runtime));
4864
+ }
4850
4865
  });
4851
- owl.useEffect(() => this.updateChartJs(this.chartRuntime), () => [this.chartRuntime]);
4852
4866
  }
4853
4867
  createChart(chartData) {
4854
4868
  const canvas = this.canvas.el;
@@ -4876,8 +4890,7 @@ class ChartJsComponent extends owl.Component {
4876
4890
  this.chart.config.options.plugins.tooltip = chartData.options.plugins.tooltip;
4877
4891
  this.chart.config.options.plugins.legend = chartData.options.plugins.legend;
4878
4892
  this.chart.config.options.scales = chartData.options?.scales;
4879
- // ?
4880
- this.chart.update("active");
4893
+ this.chart.update();
4881
4894
  }
4882
4895
  }
4883
4896
 
@@ -7565,7 +7578,7 @@ function tokenizeString(chars) {
7565
7578
  }
7566
7579
  return null;
7567
7580
  }
7568
- const separatorRegexp = /^[\w\.!\$]+/;
7581
+ const SYMBOL_CHARS = new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.!$");
7569
7582
  /**
7570
7583
  * A "Symbol" is just basically any word-like element that can appear in a
7571
7584
  * formula, which is not a string. So:
@@ -7605,11 +7618,8 @@ function tokenizeSymbol(chars) {
7605
7618
  };
7606
7619
  }
7607
7620
  }
7608
- const match = chars.remaining().match(separatorRegexp);
7609
- if (match) {
7610
- const value = match[0];
7611
- result += value;
7612
- chars.advanceBy(value.length);
7621
+ while (chars.current && SYMBOL_CHARS.has(chars.current)) {
7622
+ result += chars.shift();
7613
7623
  }
7614
7624
  if (result.length) {
7615
7625
  const value = result;
@@ -8440,7 +8450,7 @@ function truncateLabel(label) {
8440
8450
  /**
8441
8451
  * Get a default chart js configuration
8442
8452
  */
8443
- function getDefaultChartJsRuntime(chart, labels, fontColor, { format, locale }) {
8453
+ function getDefaultChartJsRuntime(chart, labels, fontColor, { format, locale, truncateLabels }) {
8444
8454
  const options = {
8445
8455
  // https://www.chartjs.org/docs/latest/general/responsive.html
8446
8456
  responsive: true,
@@ -8487,7 +8497,7 @@ function getDefaultChartJsRuntime(chart, labels, fontColor, { format, locale })
8487
8497
  type: chart.type,
8488
8498
  options,
8489
8499
  data: {
8490
- labels: labels.map(truncateLabel),
8500
+ labels: truncateLabels ? labels.map(truncateLabel) : labels,
8491
8501
  datasets: [],
8492
8502
  },
8493
8503
  platform: undefined,
@@ -9370,9 +9380,9 @@ function canBeLinearChart(labelRange, getters) {
9370
9380
  }
9371
9381
  return true;
9372
9382
  }
9373
- function getLineConfiguration(chart, labels, localeFormat) {
9383
+ function getLineConfiguration(chart, labels, options) {
9374
9384
  const fontColor = chartFontColor(chart.background);
9375
- const config = getDefaultChartJsRuntime(chart, labels, fontColor, localeFormat);
9385
+ const config = getDefaultChartJsRuntime(chart, labels, fontColor, options);
9376
9386
  const legend = {
9377
9387
  labels: {
9378
9388
  color: fontColor,
@@ -9415,7 +9425,7 @@ function getLineConfiguration(chart, labels, localeFormat) {
9415
9425
  value = Number(value);
9416
9426
  if (isNaN(value))
9417
9427
  return value;
9418
- const { locale, format } = localeFormat;
9428
+ const { locale, format } = options;
9419
9429
  return formatValue(value, {
9420
9430
  locale,
9421
9431
  format: !format && Math.abs(value) >= 1000 ? "#,##" : format,
@@ -9448,9 +9458,10 @@ function createLineChartRuntime(chart, getters) {
9448
9458
  ({ labels, dataSetsValues } = aggregateDataForLabels(labels, dataSetsValues));
9449
9459
  }
9450
9460
  const locale = getters.getLocale();
9461
+ const truncateLabels = axisType === "category";
9451
9462
  const dataSetFormat = getChartDatasetFormat(getters, chart.dataSets);
9452
- const localeFormat = { format: dataSetFormat, locale };
9453
- const config = getLineConfiguration(chart, labels, localeFormat);
9463
+ const options = { format: dataSetFormat, locale, truncateLabels };
9464
+ const config = getLineConfiguration(chart, labels, options);
9454
9465
  const labelFormat = getChartLabelFormat(getters, chart.labelRange);
9455
9466
  if (axisType === "time") {
9456
9467
  const axis = {
@@ -28054,7 +28065,8 @@ class DataValidationOverlay extends owl.Component {
28054
28065
  get checkBoxCellPositions() {
28055
28066
  return this.env.model.getters
28056
28067
  .getVisibleCellPositions()
28057
- .filter(this.env.model.getters.isCellValidCheckbox);
28068
+ .filter((position) => this.env.model.getters.isCellValidCheckbox(position) &&
28069
+ !this.env.model.getters.isFilterHeader(position));
28058
28070
  }
28059
28071
  get listIconsCellPositions() {
28060
28072
  if (this.env.model.getters.isReadonly()) {
@@ -28062,7 +28074,8 @@ class DataValidationOverlay extends owl.Component {
28062
28074
  }
28063
28075
  return this.env.model.getters
28064
28076
  .getVisibleCellPositions()
28065
- .filter(this.env.model.getters.cellHasListDataValidationIcon);
28077
+ .filter((position) => this.env.model.getters.cellHasListDataValidationIcon(position) &&
28078
+ !this.env.model.getters.isFilterHeader(position));
28066
28079
  }
28067
28080
  }
28068
28081
 
@@ -34069,7 +34082,7 @@ const machine = {
34069
34082
  function matchReference(tokens) {
34070
34083
  let head = 0;
34071
34084
  let transitions = machine[State.LeftRef];
34072
- const matchedTokens = [];
34085
+ let matchedTokens = "";
34073
34086
  while (transitions !== undefined) {
34074
34087
  const token = tokens[head++];
34075
34088
  if (!token) {
@@ -34081,15 +34094,15 @@ function matchReference(tokens) {
34081
34094
  case undefined:
34082
34095
  return null;
34083
34096
  case State.Found:
34084
- matchedTokens.push(token);
34097
+ matchedTokens += token.value;
34085
34098
  tokens.splice(0, head);
34086
34099
  return {
34087
34100
  type: "REFERENCE",
34088
- value: concat(matchedTokens.map((token) => token.value)),
34101
+ value: matchedTokens,
34089
34102
  };
34090
34103
  default:
34091
34104
  transitions = machine[nextState];
34092
- matchedTokens.push(token);
34105
+ matchedTokens += token.value;
34093
34106
  break;
34094
34107
  }
34095
34108
  }
@@ -42504,7 +42517,7 @@ class EvaluationPlugin extends UIPlugin {
42504
42517
  ? getItemId(newFormat, data.formats)
42505
42518
  : exportedCellData.format;
42506
42519
  let content;
42507
- if (isFormula && formulaCell instanceof FormulaCellWithDependencies) {
42520
+ if (isExported && isFormula && formulaCell instanceof FormulaCellWithDependencies) {
42508
42521
  content = formulaCell.contentWithFixedReferences;
42509
42522
  }
42510
42523
  else {
@@ -57718,6 +57731,6 @@ exports.setTranslationMethod = setTranslationMethod;
57718
57731
  exports.tokenize = tokenize;
57719
57732
 
57720
57733
 
57721
- __info__.version = "17.1.13";
57722
- __info__.date = "2024-04-26T07:39:54.100Z";
57723
- __info__.hash = "f2ea8c7";
57734
+ __info__.version = "17.1.15";
57735
+ __info__.date = "2024-05-15T09:22:23.258Z";
57736
+ __info__.hash = "fc959fe";
@@ -6248,6 +6248,7 @@ declare class ChartJsComponent extends Component<Props$B, SpreadsheetChildEnv> {
6248
6248
  };
6249
6249
  private canvas;
6250
6250
  private chart?;
6251
+ private currentRuntime;
6251
6252
  get background(): string;
6252
6253
  get canvasStyle(): string;
6253
6254
  get chartRuntime(): ChartJSRuntime;
@@ -8536,7 +8537,9 @@ declare function chartFontColor(backgroundColor: Color | undefined): Color;
8536
8537
  /**
8537
8538
  * Get a default chart js configuration
8538
8539
  */
8539
- declare function getDefaultChartJsRuntime(chart: AbstractChart, labels: string[], fontColor: Color, { format, locale }: LocaleFormat): Required<ChartConfiguration>;
8540
+ declare function getDefaultChartJsRuntime(chart: AbstractChart, labels: string[], fontColor: Color, { format, locale, truncateLabels }: LocaleFormat & {
8541
+ truncateLabels?: boolean;
8542
+ }): Required<ChartConfiguration>;
8540
8543
  /** See https://www.chartjs.org/docs/latest/charts/area.html#filling-modes */
8541
8544
  declare function getFillingMode(index: number): "origin" | number;
8542
8545
 
@@ -2,12 +2,12 @@
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 17.1.13
6
- * @date 2024-04-26T07:39:54.100Z
7
- * @hash f2ea8c7
5
+ * @version 17.1.15
6
+ * @date 2024-05-15T09:22:23.258Z
7
+ * @hash fc959fe
8
8
  */
9
9
 
10
- import { Component, useRef, onMounted, useEffect, onWillPatch, useState, onWillUpdateProps, onPatched, useComponent, useExternalListener, onWillUnmount, onWillStart, xml, useChildSubEnv, useSubEnv, markRaw } from '@odoo/owl';
10
+ import { Component, useRef, onMounted, onWillUnmount, useEffect, onWillPatch, useState, onWillUpdateProps, onPatched, useComponent, useExternalListener, onWillStart, xml, useChildSubEnv, useSubEnv, markRaw } from '@odoo/owl';
11
11
 
12
12
  const CANVAS_SHIFT = 0.5;
13
13
  // Colors
@@ -541,7 +541,7 @@ function getAddHeaderStartIndex(position, base) {
541
541
  /**
542
542
  * Compares two objects.
543
543
  */
544
- function deepEquals(o1, o2) {
544
+ function deepEquals(o1, o2, ignoreFunctions) {
545
545
  if (o1 === o2)
546
546
  return true;
547
547
  if ((o1 && !o2) || (o2 && !o1))
@@ -557,13 +557,16 @@ function deepEquals(o1, o2) {
557
557
  }
558
558
  }
559
559
  for (const key in o1) {
560
- if (typeof o1[key] !== typeof o2[key])
560
+ const typeOfO1Key = typeof o1[key];
561
+ if (typeOfO1Key !== typeof o2[key])
561
562
  return false;
562
- if (typeof o1[key] === "object") {
563
- if (!deepEquals(o1[key], o2[key]))
563
+ if (typeOfO1Key === "object") {
564
+ if (!deepEquals(o1[key], o2[key], ignoreFunctions))
564
565
  return false;
565
566
  }
566
567
  else {
568
+ if (ignoreFunctions && typeOfO1Key === "function")
569
+ return true;
567
570
  if (o1[key] !== o2[key])
568
571
  return false;
569
572
  }
@@ -3623,21 +3626,22 @@ function toZoneWithoutBoundaryChanges(xc) {
3623
3626
  xc = xc.split("!").at(-1);
3624
3627
  }
3625
3628
  if (xc.includes("$")) {
3626
- xc = xc.replace(/\$/g, "");
3629
+ xc = xc.replaceAll("$", "");
3627
3630
  }
3628
- let ranges;
3631
+ let firstRangePart = "";
3632
+ let secondRangePart;
3629
3633
  if (xc.includes(":")) {
3630
- ranges = xc.split(":").map((x) => x.trim());
3634
+ [firstRangePart, secondRangePart] = xc.split(":");
3635
+ firstRangePart = firstRangePart.trim();
3636
+ secondRangePart = secondRangePart.trim();
3631
3637
  }
3632
3638
  else {
3633
- ranges = [xc.trim()];
3639
+ firstRangePart = xc.trim();
3634
3640
  }
3635
3641
  let top, bottom, left, right;
3636
3642
  let fullCol = false;
3637
3643
  let fullRow = false;
3638
3644
  let hasHeader = false;
3639
- const firstRangePart = ranges[0];
3640
- const secondRangePart = ranges[1] && ranges[1];
3641
3645
  if (isColReference(firstRangePart)) {
3642
3646
  left = right = lettersToNumber(firstRangePart);
3643
3647
  top = bottom = 0;
@@ -3654,7 +3658,7 @@ function toZoneWithoutBoundaryChanges(xc) {
3654
3658
  top = bottom = c.row;
3655
3659
  hasHeader = true;
3656
3660
  }
3657
- if (ranges.length === 2) {
3661
+ if (secondRangePart) {
3658
3662
  if (isColReference(secondRangePart)) {
3659
3663
  right = lettersToNumber(secondRangePart);
3660
3664
  fullCol = true;
@@ -4828,6 +4832,7 @@ class ChartJsComponent extends Component {
4828
4832
  };
4829
4833
  canvas = useRef("graphContainer");
4830
4834
  chart;
4835
+ currentRuntime;
4831
4836
  get background() {
4832
4837
  return this.chartRuntime.background;
4833
4838
  }
@@ -4844,9 +4849,18 @@ class ChartJsComponent extends Component {
4844
4849
  setup() {
4845
4850
  onMounted(() => {
4846
4851
  const runtime = this.chartRuntime;
4847
- this.createChart(runtime.chartJsConfig);
4852
+ this.currentRuntime = runtime;
4853
+ // Note: chartJS modify the runtime in place, so it's important to give it a copy
4854
+ this.createChart(deepCopy(runtime.chartJsConfig));
4855
+ });
4856
+ onWillUnmount(() => this.chart?.destroy());
4857
+ useEffect(() => {
4858
+ const runtime = this.chartRuntime;
4859
+ if (!deepEquals(runtime, this.currentRuntime, "ignoreFunctions")) {
4860
+ this.currentRuntime = runtime;
4861
+ this.updateChartJs(deepCopy(runtime));
4862
+ }
4848
4863
  });
4849
- useEffect(() => this.updateChartJs(this.chartRuntime), () => [this.chartRuntime]);
4850
4864
  }
4851
4865
  createChart(chartData) {
4852
4866
  const canvas = this.canvas.el;
@@ -4874,8 +4888,7 @@ class ChartJsComponent extends Component {
4874
4888
  this.chart.config.options.plugins.tooltip = chartData.options.plugins.tooltip;
4875
4889
  this.chart.config.options.plugins.legend = chartData.options.plugins.legend;
4876
4890
  this.chart.config.options.scales = chartData.options?.scales;
4877
- // ?
4878
- this.chart.update("active");
4891
+ this.chart.update();
4879
4892
  }
4880
4893
  }
4881
4894
 
@@ -7563,7 +7576,7 @@ function tokenizeString(chars) {
7563
7576
  }
7564
7577
  return null;
7565
7578
  }
7566
- const separatorRegexp = /^[\w\.!\$]+/;
7579
+ const SYMBOL_CHARS = new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.!$");
7567
7580
  /**
7568
7581
  * A "Symbol" is just basically any word-like element that can appear in a
7569
7582
  * formula, which is not a string. So:
@@ -7603,11 +7616,8 @@ function tokenizeSymbol(chars) {
7603
7616
  };
7604
7617
  }
7605
7618
  }
7606
- const match = chars.remaining().match(separatorRegexp);
7607
- if (match) {
7608
- const value = match[0];
7609
- result += value;
7610
- chars.advanceBy(value.length);
7619
+ while (chars.current && SYMBOL_CHARS.has(chars.current)) {
7620
+ result += chars.shift();
7611
7621
  }
7612
7622
  if (result.length) {
7613
7623
  const value = result;
@@ -8438,7 +8448,7 @@ function truncateLabel(label) {
8438
8448
  /**
8439
8449
  * Get a default chart js configuration
8440
8450
  */
8441
- function getDefaultChartJsRuntime(chart, labels, fontColor, { format, locale }) {
8451
+ function getDefaultChartJsRuntime(chart, labels, fontColor, { format, locale, truncateLabels }) {
8442
8452
  const options = {
8443
8453
  // https://www.chartjs.org/docs/latest/general/responsive.html
8444
8454
  responsive: true,
@@ -8485,7 +8495,7 @@ function getDefaultChartJsRuntime(chart, labels, fontColor, { format, locale })
8485
8495
  type: chart.type,
8486
8496
  options,
8487
8497
  data: {
8488
- labels: labels.map(truncateLabel),
8498
+ labels: truncateLabels ? labels.map(truncateLabel) : labels,
8489
8499
  datasets: [],
8490
8500
  },
8491
8501
  platform: undefined,
@@ -9368,9 +9378,9 @@ function canBeLinearChart(labelRange, getters) {
9368
9378
  }
9369
9379
  return true;
9370
9380
  }
9371
- function getLineConfiguration(chart, labels, localeFormat) {
9381
+ function getLineConfiguration(chart, labels, options) {
9372
9382
  const fontColor = chartFontColor(chart.background);
9373
- const config = getDefaultChartJsRuntime(chart, labels, fontColor, localeFormat);
9383
+ const config = getDefaultChartJsRuntime(chart, labels, fontColor, options);
9374
9384
  const legend = {
9375
9385
  labels: {
9376
9386
  color: fontColor,
@@ -9413,7 +9423,7 @@ function getLineConfiguration(chart, labels, localeFormat) {
9413
9423
  value = Number(value);
9414
9424
  if (isNaN(value))
9415
9425
  return value;
9416
- const { locale, format } = localeFormat;
9426
+ const { locale, format } = options;
9417
9427
  return formatValue(value, {
9418
9428
  locale,
9419
9429
  format: !format && Math.abs(value) >= 1000 ? "#,##" : format,
@@ -9446,9 +9456,10 @@ function createLineChartRuntime(chart, getters) {
9446
9456
  ({ labels, dataSetsValues } = aggregateDataForLabels(labels, dataSetsValues));
9447
9457
  }
9448
9458
  const locale = getters.getLocale();
9459
+ const truncateLabels = axisType === "category";
9449
9460
  const dataSetFormat = getChartDatasetFormat(getters, chart.dataSets);
9450
- const localeFormat = { format: dataSetFormat, locale };
9451
- const config = getLineConfiguration(chart, labels, localeFormat);
9461
+ const options = { format: dataSetFormat, locale, truncateLabels };
9462
+ const config = getLineConfiguration(chart, labels, options);
9452
9463
  const labelFormat = getChartLabelFormat(getters, chart.labelRange);
9453
9464
  if (axisType === "time") {
9454
9465
  const axis = {
@@ -28052,7 +28063,8 @@ class DataValidationOverlay extends Component {
28052
28063
  get checkBoxCellPositions() {
28053
28064
  return this.env.model.getters
28054
28065
  .getVisibleCellPositions()
28055
- .filter(this.env.model.getters.isCellValidCheckbox);
28066
+ .filter((position) => this.env.model.getters.isCellValidCheckbox(position) &&
28067
+ !this.env.model.getters.isFilterHeader(position));
28056
28068
  }
28057
28069
  get listIconsCellPositions() {
28058
28070
  if (this.env.model.getters.isReadonly()) {
@@ -28060,7 +28072,8 @@ class DataValidationOverlay extends Component {
28060
28072
  }
28061
28073
  return this.env.model.getters
28062
28074
  .getVisibleCellPositions()
28063
- .filter(this.env.model.getters.cellHasListDataValidationIcon);
28075
+ .filter((position) => this.env.model.getters.cellHasListDataValidationIcon(position) &&
28076
+ !this.env.model.getters.isFilterHeader(position));
28064
28077
  }
28065
28078
  }
28066
28079
 
@@ -34067,7 +34080,7 @@ const machine = {
34067
34080
  function matchReference(tokens) {
34068
34081
  let head = 0;
34069
34082
  let transitions = machine[State.LeftRef];
34070
- const matchedTokens = [];
34083
+ let matchedTokens = "";
34071
34084
  while (transitions !== undefined) {
34072
34085
  const token = tokens[head++];
34073
34086
  if (!token) {
@@ -34079,15 +34092,15 @@ function matchReference(tokens) {
34079
34092
  case undefined:
34080
34093
  return null;
34081
34094
  case State.Found:
34082
- matchedTokens.push(token);
34095
+ matchedTokens += token.value;
34083
34096
  tokens.splice(0, head);
34084
34097
  return {
34085
34098
  type: "REFERENCE",
34086
- value: concat(matchedTokens.map((token) => token.value)),
34099
+ value: matchedTokens,
34087
34100
  };
34088
34101
  default:
34089
34102
  transitions = machine[nextState];
34090
- matchedTokens.push(token);
34103
+ matchedTokens += token.value;
34091
34104
  break;
34092
34105
  }
34093
34106
  }
@@ -42502,7 +42515,7 @@ class EvaluationPlugin extends UIPlugin {
42502
42515
  ? getItemId(newFormat, data.formats)
42503
42516
  : exportedCellData.format;
42504
42517
  let content;
42505
- if (isFormula && formulaCell instanceof FormulaCellWithDependencies) {
42518
+ if (isExported && isFormula && formulaCell instanceof FormulaCellWithDependencies) {
42506
42519
  content = formulaCell.contentWithFixedReferences;
42507
42520
  }
42508
42521
  else {
@@ -57680,6 +57693,6 @@ const constants = {
57680
57693
  export { AbstractChart, CellErrorType, CommandResult, CorePlugin, DispatchResult, EvaluationError, Model, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, UIPlugin, __info__, addFunction, astToFormula, compile, compileTokens, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, hooks, invalidateCFEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, tokenize };
57681
57694
 
57682
57695
 
57683
- __info__.version = "17.1.13";
57684
- __info__.date = "2024-04-26T07:39:54.100Z";
57685
- __info__.hash = "f2ea8c7";
57696
+ __info__.version = "17.1.15";
57697
+ __info__.date = "2024-05-15T09:22:23.258Z";
57698
+ __info__.hash = "fc959fe";