@odoo/o-spreadsheet 16.0.11 → 16.0.13

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.
@@ -1617,27 +1617,36 @@ function removeTrailingZeroes(numberString) {
1617
1617
  }
1618
1618
  return numberString.slice(0, i + 1) || undefined;
1619
1619
  }
1620
+ const leadingZeroesRegexp = /^0+/;
1620
1621
  /**
1621
1622
  * Limit the size of the decimal part of a number to the given number of digits.
1622
1623
  */
1623
1624
  function limitDecimalDigits(decimalDigits, maxDecimals) {
1625
+ var _a;
1624
1626
  let integerDigits = "0";
1625
1627
  let resultDecimalDigits = decimalDigits;
1626
1628
  // Note : we'd want to simply use number.toFixed() to handle the max digits & rounding,
1627
1629
  // but it has very strange behaviour. Ex: 12.345.toFixed(2) => "12.35", but 1.345.toFixed(2) => "1.34"
1628
1630
  let slicedDecimalDigits = decimalDigits.slice(0, maxDecimals);
1629
1631
  const i = maxDecimals;
1630
- if (Number(Number(decimalDigits[i]) < 5)) {
1632
+ if (Number(decimalDigits[i]) < 5) {
1631
1633
  return { integerDigits, decimalDigits: slicedDecimalDigits };
1632
1634
  }
1633
1635
  // round up
1636
+ const leadingZeroes = ((_a = slicedDecimalDigits.match(leadingZeroesRegexp)) === null || _a === void 0 ? void 0 : _a[0]) || "";
1634
1637
  const slicedRoundedUp = (Number(slicedDecimalDigits) + 1).toString();
1635
- if (slicedRoundedUp.length > slicedDecimalDigits.length) {
1636
- integerDigits = (Number(integerDigits) + 1).toString();
1638
+ const withoutLeadingZeroes = slicedDecimalDigits.slice(leadingZeroes.length);
1639
+ // e.g. carry over from 99 to 100
1640
+ const carryOver = slicedRoundedUp.length > withoutLeadingZeroes.length;
1641
+ if (carryOver && !leadingZeroes) {
1642
+ integerDigits = "1";
1637
1643
  resultDecimalDigits = undefined;
1638
1644
  }
1645
+ else if (carryOver) {
1646
+ resultDecimalDigits = leadingZeroes.slice(0, -1) + slicedRoundedUp;
1647
+ }
1639
1648
  else {
1640
- resultDecimalDigits = slicedRoundedUp;
1649
+ resultDecimalDigits = leadingZeroes + slicedRoundedUp;
1641
1650
  }
1642
1651
  return { integerDigits, decimalDigits: resultDecimalDigits };
1643
1652
  }
@@ -8363,6 +8372,7 @@ css /* scss */ `
8363
8372
  .o-color-picker-toggler {
8364
8373
  display: flex;
8365
8374
  .o-color-picker-toggler-sign {
8375
+ display: flex;
8366
8376
  margin: auto auto;
8367
8377
  width: 55%;
8368
8378
  height: 55%;
@@ -20235,6 +20245,7 @@ class Composer extends owl.Component {
20235
20245
  this.autocompleteAPI.moveDown();
20236
20246
  }
20237
20247
  }
20248
+ this.updateCursorIfNeeded();
20238
20249
  }
20239
20250
  processTabKey(ev) {
20240
20251
  ev.preventDefault();
@@ -20291,9 +20302,12 @@ class Composer extends owl.Component {
20291
20302
  }
20292
20303
  else {
20293
20304
  ev.stopPropagation();
20305
+ this.updateCursorIfNeeded();
20294
20306
  }
20295
- const { start, end } = this.contentHelper.getCurrentSelection();
20307
+ }
20308
+ updateCursorIfNeeded() {
20296
20309
  if (!this.env.model.getters.isSelectingForComposer()) {
20310
+ const { start, end } = this.contentHelper.getCurrentSelection();
20297
20311
  this.env.model.dispatch("CHANGE_COMPOSER_CURSOR_SELECTION", { start, end });
20298
20312
  this.isKeyStillDown = true;
20299
20313
  }
@@ -33182,14 +33196,19 @@ class FilterEvaluationPlugin extends UIPlugin {
33182
33196
  if (!filter)
33183
33197
  continue;
33184
33198
  const valuesInFilterZone = filter.filteredZone
33185
- ? positions(filter.filteredZone)
33186
- .map((pos) => { var _a; return (_a = this.getters.getCell(sheetData.id, pos.col, pos.row)) === null || _a === void 0 ? void 0 : _a.formattedValue; })
33187
- .filter(isNonEmptyString)
33199
+ ? positions(filter.filteredZone).map((pos) => { var _a; return (_a = this.getters.getCell(sheetData.id, pos.col, pos.row)) === null || _a === void 0 ? void 0 : _a.formattedValue; })
33188
33200
  : [];
33189
- // In xlsx, filtered values = values that are displayed, not values that are hidden
33190
- const xlsxFilteredValues = valuesInFilterZone.filter((val) => !filteredValues.includes(val));
33191
- filters.push({ colId: i, filteredValues: [...new Set(xlsxFilteredValues)] });
33192
- // In xlsx, filter header should ALWAYS be a string and should be unique
33201
+ if (filteredValues.length) {
33202
+ const xlsxDisplayedValues = valuesInFilterZone
33203
+ .filter(isNonEmptyString)
33204
+ .filter((val) => !filteredValues.includes(val));
33205
+ filters.push({
33206
+ colId: i,
33207
+ displayedValues: [...new Set(xlsxDisplayedValues)],
33208
+ displayBlanks: !filteredValues.includes("") && valuesInFilterZone.some((val) => !val),
33209
+ });
33210
+ }
33211
+ // In xlsx, filter header should ALWAYS be a string and should be unique in the table
33193
33212
  const headerPosition = { col: filter.col, row: filter.zoneWithHeaders.top };
33194
33213
  const headerString = (_a = this.getters.getCell(sheetData.id, headerPosition.col, headerPosition.row)) === null || _a === void 0 ? void 0 : _a.formattedValue;
33195
33214
  const headerName = this.getUniqueColNameForExcel(i, headerString, headerNames);
@@ -41880,15 +41899,10 @@ function addAutoFilter(table) {
41880
41899
  `;
41881
41900
  }
41882
41901
  function addFilterColumns(table) {
41883
- const tableZone = toZone(table.range);
41884
41902
  const columns = [];
41885
- for (const i of range(0, zoneToDimension(tableZone).width)) {
41886
- const filter = table.filters[i];
41887
- if (!filter || !filter.filteredValues.length) {
41888
- continue;
41889
- }
41903
+ for (const filter of table.filters) {
41890
41904
  const colXml = escapeXml /*xml*/ `
41891
- <filterColumn ${formatAttributes([["colId", i]])}>
41905
+ <filterColumn ${formatAttributes([["colId", filter.colId]])}>
41892
41906
  ${addFilter(filter)}
41893
41907
  </filterColumn>
41894
41908
  `;
@@ -41897,9 +41911,10 @@ function addFilterColumns(table) {
41897
41911
  return columns;
41898
41912
  }
41899
41913
  function addFilter(filter) {
41900
- const filterValues = filter.filteredValues.map((val) => escapeXml /*xml*/ `<filter ${formatAttributes([["val", val]])}/>`);
41914
+ const filterValues = filter.displayedValues.map((val) => escapeXml /*xml*/ `<filter ${formatAttributes([["val", val]])}/>`);
41915
+ const filterAttributes = filter.displayBlanks ? [["blank", 1]] : [];
41901
41916
  return escapeXml /*xml*/ `
41902
- <filters>
41917
+ <filters ${formatAttributes(filterAttributes)}>
41903
41918
  ${joinXmlNodes(filterValues)}
41904
41919
  </filters>
41905
41920
  `;
@@ -42802,6 +42817,6 @@ exports.setTranslationMethod = setTranslationMethod;
42802
42817
  exports.tokenize = tokenize;
42803
42818
 
42804
42819
 
42805
- __info__.version = '16.0.11';
42806
- __info__.date = '2023-05-25T12:57:28.152Z';
42807
- __info__.hash = 'd27e998';
42820
+ __info__.version = '16.0.13';
42821
+ __info__.date = '2023-06-12T13:44:11.940Z';
42822
+ __info__.hash = '3c9ec1e';
@@ -836,7 +836,8 @@ interface ExcelFilterTableData {
836
836
  }
837
837
  interface ExcelFilterData {
838
838
  colId: number;
839
- filteredValues: string[];
839
+ displayedValues: string[];
840
+ displayBlanks?: boolean;
840
841
  }
841
842
 
842
843
  declare type ClientId = string;
@@ -5544,6 +5545,7 @@ declare class Composer extends Component<Props$j, SpreadsheetChildEnv> {
5544
5545
  onCompositionStart(): void;
5545
5546
  onCompositionEnd(): void;
5546
5547
  onKeydown(ev: KeyboardEvent): void;
5548
+ private updateCursorIfNeeded;
5547
5549
  onInput(): void;
5548
5550
  onKeyup(ev: KeyboardEvent): void;
5549
5551
  onMousedown(ev: MouseEvent): void;
@@ -1613,27 +1613,36 @@ function removeTrailingZeroes(numberString) {
1613
1613
  }
1614
1614
  return numberString.slice(0, i + 1) || undefined;
1615
1615
  }
1616
+ const leadingZeroesRegexp = /^0+/;
1616
1617
  /**
1617
1618
  * Limit the size of the decimal part of a number to the given number of digits.
1618
1619
  */
1619
1620
  function limitDecimalDigits(decimalDigits, maxDecimals) {
1621
+ var _a;
1620
1622
  let integerDigits = "0";
1621
1623
  let resultDecimalDigits = decimalDigits;
1622
1624
  // Note : we'd want to simply use number.toFixed() to handle the max digits & rounding,
1623
1625
  // but it has very strange behaviour. Ex: 12.345.toFixed(2) => "12.35", but 1.345.toFixed(2) => "1.34"
1624
1626
  let slicedDecimalDigits = decimalDigits.slice(0, maxDecimals);
1625
1627
  const i = maxDecimals;
1626
- if (Number(Number(decimalDigits[i]) < 5)) {
1628
+ if (Number(decimalDigits[i]) < 5) {
1627
1629
  return { integerDigits, decimalDigits: slicedDecimalDigits };
1628
1630
  }
1629
1631
  // round up
1632
+ const leadingZeroes = ((_a = slicedDecimalDigits.match(leadingZeroesRegexp)) === null || _a === void 0 ? void 0 : _a[0]) || "";
1630
1633
  const slicedRoundedUp = (Number(slicedDecimalDigits) + 1).toString();
1631
- if (slicedRoundedUp.length > slicedDecimalDigits.length) {
1632
- integerDigits = (Number(integerDigits) + 1).toString();
1634
+ const withoutLeadingZeroes = slicedDecimalDigits.slice(leadingZeroes.length);
1635
+ // e.g. carry over from 99 to 100
1636
+ const carryOver = slicedRoundedUp.length > withoutLeadingZeroes.length;
1637
+ if (carryOver && !leadingZeroes) {
1638
+ integerDigits = "1";
1633
1639
  resultDecimalDigits = undefined;
1634
1640
  }
1641
+ else if (carryOver) {
1642
+ resultDecimalDigits = leadingZeroes.slice(0, -1) + slicedRoundedUp;
1643
+ }
1635
1644
  else {
1636
- resultDecimalDigits = slicedRoundedUp;
1645
+ resultDecimalDigits = leadingZeroes + slicedRoundedUp;
1637
1646
  }
1638
1647
  return { integerDigits, decimalDigits: resultDecimalDigits };
1639
1648
  }
@@ -8359,6 +8368,7 @@ css /* scss */ `
8359
8368
  .o-color-picker-toggler {
8360
8369
  display: flex;
8361
8370
  .o-color-picker-toggler-sign {
8371
+ display: flex;
8362
8372
  margin: auto auto;
8363
8373
  width: 55%;
8364
8374
  height: 55%;
@@ -20231,6 +20241,7 @@ class Composer extends Component {
20231
20241
  this.autocompleteAPI.moveDown();
20232
20242
  }
20233
20243
  }
20244
+ this.updateCursorIfNeeded();
20234
20245
  }
20235
20246
  processTabKey(ev) {
20236
20247
  ev.preventDefault();
@@ -20287,9 +20298,12 @@ class Composer extends Component {
20287
20298
  }
20288
20299
  else {
20289
20300
  ev.stopPropagation();
20301
+ this.updateCursorIfNeeded();
20290
20302
  }
20291
- const { start, end } = this.contentHelper.getCurrentSelection();
20303
+ }
20304
+ updateCursorIfNeeded() {
20292
20305
  if (!this.env.model.getters.isSelectingForComposer()) {
20306
+ const { start, end } = this.contentHelper.getCurrentSelection();
20293
20307
  this.env.model.dispatch("CHANGE_COMPOSER_CURSOR_SELECTION", { start, end });
20294
20308
  this.isKeyStillDown = true;
20295
20309
  }
@@ -33178,14 +33192,19 @@ class FilterEvaluationPlugin extends UIPlugin {
33178
33192
  if (!filter)
33179
33193
  continue;
33180
33194
  const valuesInFilterZone = filter.filteredZone
33181
- ? positions(filter.filteredZone)
33182
- .map((pos) => { var _a; return (_a = this.getters.getCell(sheetData.id, pos.col, pos.row)) === null || _a === void 0 ? void 0 : _a.formattedValue; })
33183
- .filter(isNonEmptyString)
33195
+ ? positions(filter.filteredZone).map((pos) => { var _a; return (_a = this.getters.getCell(sheetData.id, pos.col, pos.row)) === null || _a === void 0 ? void 0 : _a.formattedValue; })
33184
33196
  : [];
33185
- // In xlsx, filtered values = values that are displayed, not values that are hidden
33186
- const xlsxFilteredValues = valuesInFilterZone.filter((val) => !filteredValues.includes(val));
33187
- filters.push({ colId: i, filteredValues: [...new Set(xlsxFilteredValues)] });
33188
- // In xlsx, filter header should ALWAYS be a string and should be unique
33197
+ if (filteredValues.length) {
33198
+ const xlsxDisplayedValues = valuesInFilterZone
33199
+ .filter(isNonEmptyString)
33200
+ .filter((val) => !filteredValues.includes(val));
33201
+ filters.push({
33202
+ colId: i,
33203
+ displayedValues: [...new Set(xlsxDisplayedValues)],
33204
+ displayBlanks: !filteredValues.includes("") && valuesInFilterZone.some((val) => !val),
33205
+ });
33206
+ }
33207
+ // In xlsx, filter header should ALWAYS be a string and should be unique in the table
33189
33208
  const headerPosition = { col: filter.col, row: filter.zoneWithHeaders.top };
33190
33209
  const headerString = (_a = this.getters.getCell(sheetData.id, headerPosition.col, headerPosition.row)) === null || _a === void 0 ? void 0 : _a.formattedValue;
33191
33210
  const headerName = this.getUniqueColNameForExcel(i, headerString, headerNames);
@@ -41876,15 +41895,10 @@ function addAutoFilter(table) {
41876
41895
  `;
41877
41896
  }
41878
41897
  function addFilterColumns(table) {
41879
- const tableZone = toZone(table.range);
41880
41898
  const columns = [];
41881
- for (const i of range(0, zoneToDimension(tableZone).width)) {
41882
- const filter = table.filters[i];
41883
- if (!filter || !filter.filteredValues.length) {
41884
- continue;
41885
- }
41899
+ for (const filter of table.filters) {
41886
41900
  const colXml = escapeXml /*xml*/ `
41887
- <filterColumn ${formatAttributes([["colId", i]])}>
41901
+ <filterColumn ${formatAttributes([["colId", filter.colId]])}>
41888
41902
  ${addFilter(filter)}
41889
41903
  </filterColumn>
41890
41904
  `;
@@ -41893,9 +41907,10 @@ function addFilterColumns(table) {
41893
41907
  return columns;
41894
41908
  }
41895
41909
  function addFilter(filter) {
41896
- const filterValues = filter.filteredValues.map((val) => escapeXml /*xml*/ `<filter ${formatAttributes([["val", val]])}/>`);
41910
+ const filterValues = filter.displayedValues.map((val) => escapeXml /*xml*/ `<filter ${formatAttributes([["val", val]])}/>`);
41911
+ const filterAttributes = filter.displayBlanks ? [["blank", 1]] : [];
41897
41912
  return escapeXml /*xml*/ `
41898
- <filters>
41913
+ <filters ${formatAttributes(filterAttributes)}>
41899
41914
  ${joinXmlNodes(filterValues)}
41900
41915
  </filters>
41901
41916
  `;
@@ -42770,6 +42785,6 @@ function addFunction(functionName, functionDescription) {
42770
42785
  export { AbstractChart, CommandResult, CorePlugin, DATETIME_FORMAT, DispatchResult, EvaluationError, Model, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, UIPlugin, __info__, addFunction, astToFormula, cellTypes, compile, components, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, invalidateEvaluationCommands, load, parse, readonlyAllowedCommands, registries, setTranslationMethod, tokenize };
42771
42786
 
42772
42787
 
42773
- __info__.version = '16.0.11';
42774
- __info__.date = '2023-05-25T12:57:28.152Z';
42775
- __info__.hash = 'd27e998';
42788
+ __info__.version = '16.0.13';
42789
+ __info__.date = '2023-06-12T13:44:11.940Z';
42790
+ __info__.hash = '3c9ec1e';
@@ -1614,27 +1614,36 @@
1614
1614
  }
1615
1615
  return numberString.slice(0, i + 1) || undefined;
1616
1616
  }
1617
+ const leadingZeroesRegexp = /^0+/;
1617
1618
  /**
1618
1619
  * Limit the size of the decimal part of a number to the given number of digits.
1619
1620
  */
1620
1621
  function limitDecimalDigits(decimalDigits, maxDecimals) {
1622
+ var _a;
1621
1623
  let integerDigits = "0";
1622
1624
  let resultDecimalDigits = decimalDigits;
1623
1625
  // Note : we'd want to simply use number.toFixed() to handle the max digits & rounding,
1624
1626
  // but it has very strange behaviour. Ex: 12.345.toFixed(2) => "12.35", but 1.345.toFixed(2) => "1.34"
1625
1627
  let slicedDecimalDigits = decimalDigits.slice(0, maxDecimals);
1626
1628
  const i = maxDecimals;
1627
- if (Number(Number(decimalDigits[i]) < 5)) {
1629
+ if (Number(decimalDigits[i]) < 5) {
1628
1630
  return { integerDigits, decimalDigits: slicedDecimalDigits };
1629
1631
  }
1630
1632
  // round up
1633
+ const leadingZeroes = ((_a = slicedDecimalDigits.match(leadingZeroesRegexp)) === null || _a === void 0 ? void 0 : _a[0]) || "";
1631
1634
  const slicedRoundedUp = (Number(slicedDecimalDigits) + 1).toString();
1632
- if (slicedRoundedUp.length > slicedDecimalDigits.length) {
1633
- integerDigits = (Number(integerDigits) + 1).toString();
1635
+ const withoutLeadingZeroes = slicedDecimalDigits.slice(leadingZeroes.length);
1636
+ // e.g. carry over from 99 to 100
1637
+ const carryOver = slicedRoundedUp.length > withoutLeadingZeroes.length;
1638
+ if (carryOver && !leadingZeroes) {
1639
+ integerDigits = "1";
1634
1640
  resultDecimalDigits = undefined;
1635
1641
  }
1642
+ else if (carryOver) {
1643
+ resultDecimalDigits = leadingZeroes.slice(0, -1) + slicedRoundedUp;
1644
+ }
1636
1645
  else {
1637
- resultDecimalDigits = slicedRoundedUp;
1646
+ resultDecimalDigits = leadingZeroes + slicedRoundedUp;
1638
1647
  }
1639
1648
  return { integerDigits, decimalDigits: resultDecimalDigits };
1640
1649
  }
@@ -8360,6 +8369,7 @@
8360
8369
  .o-color-picker-toggler {
8361
8370
  display: flex;
8362
8371
  .o-color-picker-toggler-sign {
8372
+ display: flex;
8363
8373
  margin: auto auto;
8364
8374
  width: 55%;
8365
8375
  height: 55%;
@@ -20232,6 +20242,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
20232
20242
  this.autocompleteAPI.moveDown();
20233
20243
  }
20234
20244
  }
20245
+ this.updateCursorIfNeeded();
20235
20246
  }
20236
20247
  processTabKey(ev) {
20237
20248
  ev.preventDefault();
@@ -20288,9 +20299,12 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
20288
20299
  }
20289
20300
  else {
20290
20301
  ev.stopPropagation();
20302
+ this.updateCursorIfNeeded();
20291
20303
  }
20292
- const { start, end } = this.contentHelper.getCurrentSelection();
20304
+ }
20305
+ updateCursorIfNeeded() {
20293
20306
  if (!this.env.model.getters.isSelectingForComposer()) {
20307
+ const { start, end } = this.contentHelper.getCurrentSelection();
20294
20308
  this.env.model.dispatch("CHANGE_COMPOSER_CURSOR_SELECTION", { start, end });
20295
20309
  this.isKeyStillDown = true;
20296
20310
  }
@@ -33179,14 +33193,19 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
33179
33193
  if (!filter)
33180
33194
  continue;
33181
33195
  const valuesInFilterZone = filter.filteredZone
33182
- ? positions(filter.filteredZone)
33183
- .map((pos) => { var _a; return (_a = this.getters.getCell(sheetData.id, pos.col, pos.row)) === null || _a === void 0 ? void 0 : _a.formattedValue; })
33184
- .filter(isNonEmptyString)
33196
+ ? positions(filter.filteredZone).map((pos) => { var _a; return (_a = this.getters.getCell(sheetData.id, pos.col, pos.row)) === null || _a === void 0 ? void 0 : _a.formattedValue; })
33185
33197
  : [];
33186
- // In xlsx, filtered values = values that are displayed, not values that are hidden
33187
- const xlsxFilteredValues = valuesInFilterZone.filter((val) => !filteredValues.includes(val));
33188
- filters.push({ colId: i, filteredValues: [...new Set(xlsxFilteredValues)] });
33189
- // In xlsx, filter header should ALWAYS be a string and should be unique
33198
+ if (filteredValues.length) {
33199
+ const xlsxDisplayedValues = valuesInFilterZone
33200
+ .filter(isNonEmptyString)
33201
+ .filter((val) => !filteredValues.includes(val));
33202
+ filters.push({
33203
+ colId: i,
33204
+ displayedValues: [...new Set(xlsxDisplayedValues)],
33205
+ displayBlanks: !filteredValues.includes("") && valuesInFilterZone.some((val) => !val),
33206
+ });
33207
+ }
33208
+ // In xlsx, filter header should ALWAYS be a string and should be unique in the table
33190
33209
  const headerPosition = { col: filter.col, row: filter.zoneWithHeaders.top };
33191
33210
  const headerString = (_a = this.getters.getCell(sheetData.id, headerPosition.col, headerPosition.row)) === null || _a === void 0 ? void 0 : _a.formattedValue;
33192
33211
  const headerName = this.getUniqueColNameForExcel(i, headerString, headerNames);
@@ -41877,15 +41896,10 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
41877
41896
  `;
41878
41897
  }
41879
41898
  function addFilterColumns(table) {
41880
- const tableZone = toZone(table.range);
41881
41899
  const columns = [];
41882
- for (const i of range(0, zoneToDimension(tableZone).width)) {
41883
- const filter = table.filters[i];
41884
- if (!filter || !filter.filteredValues.length) {
41885
- continue;
41886
- }
41900
+ for (const filter of table.filters) {
41887
41901
  const colXml = escapeXml /*xml*/ `
41888
- <filterColumn ${formatAttributes([["colId", i]])}>
41902
+ <filterColumn ${formatAttributes([["colId", filter.colId]])}>
41889
41903
  ${addFilter(filter)}
41890
41904
  </filterColumn>
41891
41905
  `;
@@ -41894,9 +41908,10 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
41894
41908
  return columns;
41895
41909
  }
41896
41910
  function addFilter(filter) {
41897
- const filterValues = filter.filteredValues.map((val) => escapeXml /*xml*/ `<filter ${formatAttributes([["val", val]])}/>`);
41911
+ const filterValues = filter.displayedValues.map((val) => escapeXml /*xml*/ `<filter ${formatAttributes([["val", val]])}/>`);
41912
+ const filterAttributes = filter.displayBlanks ? [["blank", 1]] : [];
41898
41913
  return escapeXml /*xml*/ `
41899
- <filters>
41914
+ <filters ${formatAttributes(filterAttributes)}>
41900
41915
  ${joinXmlNodes(filterValues)}
41901
41916
  </filters>
41902
41917
  `;
@@ -42801,9 +42816,9 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
42801
42816
  Object.defineProperty(exports, '__esModule', { value: true });
42802
42817
 
42803
42818
 
42804
- __info__.version = '16.0.11';
42805
- __info__.date = '2023-05-25T12:57:28.152Z';
42806
- __info__.hash = 'd27e998';
42819
+ __info__.version = '16.0.13';
42820
+ __info__.date = '2023-06-12T13:44:11.940Z';
42821
+ __info__.hash = '3c9ec1e';
42807
42822
 
42808
42823
 
42809
42824
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);