@sapui5/sap.ui.export 1.136.2 → 1.138.0

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapui5/sap.ui.export",
3
- "version": "1.136.2",
3
+ "version": "1.138.0",
4
4
  "description": "SAPUI5 Library sap.ui.export",
5
5
  "homepage": "https://sap.github.io/ui5-tooling/pages/SAPUI5/",
6
6
  "author": "SAP SE (https://www.sap.com)",
@@ -5,7 +5,7 @@
5
5
  <vendor>SAP SE</vendor>
6
6
  <copyright>SAPUI5
7
7
  * (c) Copyright 2025 SAP SE. All rights reserved.</copyright>
8
- <version>1.136.2</version>
8
+ <version>1.138.0</version>
9
9
 
10
10
  <documentation>UI5 library: sap.ui.export</documentation>
11
11
 
@@ -27,7 +27,7 @@ sap.ui.define([
27
27
  * @class The <code>sap.ui.export.ExportBase</code> class allows you to export table data from a UI5 application to certain formats. This class is an abstract class that requires specific implementations for each file format.
28
28
  *
29
29
  * @author SAP SE
30
- * @version 1.136.2
30
+ * @version 1.138.0
31
31
  *
32
32
  * @since 1.96
33
33
  * @alias sap.ui.export.ExportBase
@@ -28,7 +28,7 @@ sap.ui.define([
28
28
  * @class The <code>sap.ui.export.ExportHandler</code> class allows you to export table data from an SAPUI5 application.
29
29
  *
30
30
  * @author SAP SE
31
- * @version 1.136.2
31
+ * @version 1.138.0
32
32
  *
33
33
  * @since 1.102
34
34
  * @alias sap.ui.export.ExportHandler
@@ -144,7 +144,7 @@ sap.ui.define([
144
144
  * @class Utilities related to export to enable reuse in integration scenarios (e.g. tables).
145
145
  *
146
146
  * @author SAP SE
147
- * @version 1.136.2
147
+ * @version 1.138.0
148
148
  *
149
149
  * @since 1.59
150
150
  * @alias sap.ui.export.ExportUtils
@@ -295,6 +295,9 @@ sap.ui.define([
295
295
  name: "sap.ui.export.fragments.SettingsDialog",
296
296
  type: "XML",
297
297
  controller: {
298
+ isSupported: function(sFileType, bFeatureEnabled) {
299
+ return sFileType !== FileType.PDF || bFeatureEnabled;
300
+ },
298
301
  isPDF: function(sValue, bFeatureEnabled) {
299
302
  return sValue === FileType.PDF && bFeatureEnabled !== false;
300
303
  },
@@ -350,9 +353,12 @@ sap.ui.define([
350
353
  return;
351
354
  }
352
355
 
353
- switch (oSelectedItem.getKey()) {
356
+ const sKey = oSelectedItem.getKey();
357
+ switch (sKey) {
354
358
  case FileType.PDF:
355
- oExportConfigModel.setProperty("/includeFilterSettings", false);
359
+ if (!oExportCapabilities?.PDF?.CoverPage) {
360
+ oExportConfigModel.setProperty("/includeFilterSettings", false);
361
+ }
356
362
  fnSetSemanticStepName(oExportConfigModel, oExportSettingsDialog.getBeginButton());
357
363
  break;
358
364
  case FileType.GSHEET:
@@ -364,6 +370,7 @@ sap.ui.define([
364
370
  Element.getElementById("exportSettingsDialog-signatureReasonLabel").setVisible(false);
365
371
  fnSetSemanticStepName(oExportConfigModel, oExportSettingsDialog.getBeginButton());
366
372
  }
373
+ oExportConfigModel.setProperty("/fileType", sKey);
367
374
  },
368
375
  onDestinationChange: function (oEvent) {
369
376
  if (!oEvent.getParameter("selectedItem")) {
@@ -1208,7 +1215,7 @@ sap.ui.define([
1208
1215
  *
1209
1216
  * @param {object} oContext Context object
1210
1217
  * @param {string} [oContext.application] Name of the application (default: "SAP UI5")
1211
- * @param {string} [oContext.version] Application version (default: "1.136.2")
1218
+ * @param {string} [oContext.version] Application version (default: "1.138.0")
1212
1219
  * @param {string} [oContext.title] Title that will be written to the file (NOT the filename)
1213
1220
  * @param {string} [oContext.modifiedBy] Optional user context that will be written to the file
1214
1221
  * @param {string} [oContext.sheetName] Name of the data sheet - Maximum length of 31 characters
@@ -1561,23 +1568,32 @@ sap.ui.define([
1561
1568
 
1562
1569
  /**
1563
1570
  * Provides Office Open XML compliant default format settings
1564
- * based on the UI5 Formatting facade.
1571
+ * based on the UI5 LocaleData facade.
1565
1572
  *
1573
+ * @param {"full"|"long"|"medium"|"short"} [sDateStyle="short"] Date style to be used for the date pattern
1574
+ * @param {"full"|"long"|"medium"|"short"} [sTimeStyle="medium"] Time style to be used for the time pattern
1566
1575
  * @returns {Object} Format settings
1567
1576
  *
1568
1577
  * @static
1569
1578
  * @private
1570
1579
  */
1571
- getFormatSettings: function() {
1580
+ getFormatSettings: function(sDateStyle = "short", sTimeStyle = "medium") {
1581
+ const aValidStyles = ["full", "long", "medium", "short"];
1582
+ if (aValidStyles.includes(sDateStyle) === false || aValidStyles.includes(sTimeStyle) === false) {
1583
+ throw new Error(`Invalid date or time style provided. Valid styles are: ${aValidStyles.join(", ")}`);
1584
+ }
1585
+
1572
1586
  if (!oDefaultFormatSettings) {
1573
1587
  const oSettings = {};
1588
+ const oLocale = new Locale(Localization.getLanguageTag());
1589
+ const oLocaleData = LocaleData.getInstance(oLocale);
1574
1590
 
1575
1591
  /*
1576
1592
  * Load default format settings from UI5 Formatting facade
1577
1593
  */
1578
1594
  oSettings.calendar = Formatting.getCalendarType();
1579
- oSettings.datePattern = Formatting.getDatePattern("medium");
1580
- oSettings.timePattern = Formatting.getTimePattern("medium");
1595
+ oSettings.datePattern = oLocaleData.getDatePattern(sDateStyle, oSettings.calendar);
1596
+ oSettings.timePattern = oLocaleData.getTimePattern(sTimeStyle, oSettings.calendar);
1581
1597
  oSettings.delimiter = !!Formatting.getNumberSymbol("group");
1582
1598
 
1583
1599
  /* Post processing: lower case, pattern specific replacement */
@@ -1590,11 +1606,11 @@ sap.ui.define([
1590
1606
  * https://unicode.org/reports/tr35/tr35-dates.html#dfst-period
1591
1607
  */
1592
1608
  if (typeof oSettings.timePattern === "string") {
1593
- oSettings.timePattern = oSettings.timePattern.toLowerCase().replace(/ a+/, " AM/PM");
1609
+ oSettings.timePattern = oSettings.timePattern.toLowerCase().replace(/\Wa/, " AM/PM");
1594
1610
  }
1595
1611
 
1596
1612
  if (oSettings.datePattern && oSettings.timePattern) {
1597
- oSettings.dateTimePattern = `${oSettings.datePattern} ${oSettings.timePattern}`;
1613
+ oSettings.dateTimePattern = oLocaleData.getCombinedDateTimePattern(sDateStyle, sTimeStyle, oSettings.calendar).toLowerCase().replace(/\Wa/, " AM/PM");
1598
1614
  }
1599
1615
 
1600
1616
  oDefaultFormatSettings = oSettings;
@@ -28,7 +28,7 @@ sap.ui.define([
28
28
  * @class The <code>sap.ui.export.PortableDocument</code> class allows you to export table data from a UI5 application to a Portable Document Format (*.PDF) file.
29
29
  *
30
30
  * @author SAP SE
31
- * @version 1.136.2
31
+ * @version 1.138.0
32
32
  *
33
33
  * @since 1.96
34
34
  * @alias sap.ui.export.PortableDocument
@@ -4,22 +4,23 @@
4
4
  */
5
5
 
6
6
  sap.ui.define([
7
- './library',
8
- './ExportBase',
9
- './ExportDialog',
10
- './ExportUtils',
11
- './SpreadsheetExport',
12
- 'sap/base/Log',
13
- "sap/base/i18n/Formatting",
14
- 'sap/ui/Device'
7
+ "./library",
8
+ "./ExportBase",
9
+ "./ExportDialog",
10
+ "./ExportUtils",
11
+ "./SpreadsheetExport",
12
+ "sap/base/Log",
13
+ "sap/base/i18n/Localization",
14
+ "sap/ui/Device",
15
+ "sap/ui/core/LocaleData"
15
16
  ],
16
- function(Library, ExportBase, ExportDialog, ExportUtils, SpreadsheetExport, Log, Formatting, Device) {
17
- 'use strict';
17
+ function(Library, ExportBase, ExportDialog, ExportUtils, SpreadsheetExport, Log, Localization, Device, LocaleData) {
18
+ "use strict";
18
19
 
19
20
  // eslint-disable-next-line
20
21
  /* global Blob */
21
22
 
22
- const CLASS_NAME = 'sap.ui.export.Spreadsheet';
23
+ const CLASS_NAME = "sap.ui.export.Spreadsheet";
23
24
  const Status = Library.Status;
24
25
 
25
26
  /**
@@ -45,85 +46,6 @@ sap.ui.define([
45
46
  * <li>Configure the exported file name.</li>
46
47
  * </ul>
47
48
  *
48
- *
49
- * <h3>Export settings object</h3>
50
- * Export settings should be provided in the constructor as an <code>mSettings</code> property map with the following fields:
51
- * <ul>
52
- * <li><code>workbook</code> - Spreadsheet properties object
53
- * <ul>
54
- * <li><code>workbook.columns</code> - Array of column configurations. Each column configuration is an object with the following fields:
55
- * <ul>
56
- * <li><code>label</code> (string) - Column header text</li>
57
- * <li><code>property</code> (string) - Field name or Array of field names in the data source feed</li>
58
- * <li><code>type</code> (string) - Optional data type of the field. See {@link sap.ui.export.EdmType} for the list of supported types.
59
- * If this property is omitted, the property is processed as a string field.</li>
60
- * <li><code>width</code> (number) - Optional width of the column in characters. There is no 1:1 correspondence between
61
- * character widths in the exported spreadsheet and CSS units.The width of one character
62
- * is approximately 0.5em in CSS units, depending on the fonts that are
63
- * used in the table and in the resulting spreadsheet. The default value is 10 characters.</li>
64
- * <li><code>textAlign</code> (string) - Horizontal alignment of cell contents. The following values of the CSS <code>text-align</code>
65
- * property are accepted: <code>[left, right, center, begin, end]</code>. If not specified, the columns are
66
- * horizontally aligned based on the property type.</li>
67
- * <li><code>scale</code> (number) - Number of digits after decimal point for numeric values</li>
68
- * <li><code>autoScale</code> (boolean) - Allows automatic scale assignment based on unit of measure</li>
69
- * <li><code>delimiter</code> (boolean) - Set to <code>true</code> to display thousands separators in numeric values.
70
- * The default value is <code>false</code>.</li>
71
- * <li><code>unit</code> (string) - Text to display as the unit of measurement or currency next to the numeric value.
72
- * It is treated as a string and has no influence on the value itself. For example, a value of 150 with the unit "%" is still 150
73
- * and not 1.5, as a user may expect.</li>
74
- * <li><code>unitProperty</code> (string) - Name of the data source field that contains the unit/currency text</li>
75
- * <li><code>displayUnit</code> (boolean) - The property applies to currency values only and defines if the currency is shown in the column.
76
- * The default value is <code>true</code>.</li>
77
- * <li><code>trueValue</code> (string) - Textual representation of a boolean type that has the value <code>true</code></li>
78
- * <li><code>falseValue</code> (string) - Textual representation of a boolean type that has the value <code>false</code></li>
79
- * <li><code>template</code> (string) - Formatting template that supports indexed placeholders within curly brackets</li>
80
- * <li><code>format</code> (string) - Output format for columns of type Date/DateTime/Time</li>
81
- * <li><code>inputFormat</code> (string) - Formatting template for string formatted dates</li>
82
- * <li><code>utc</code> (boolean) - Defines whether the <code>DateTime</code> is displayed as UTC or local time</li>
83
- * <li><code>timezone</code> (string) - Defines a fixed IANA time zone</li>
84
- * <li><code>timezoneProperty</code> (string) - References an OData property that contains the specific IANA time zone</li>
85
- * <li><code>displayTimezone</code> (boolean) - Defines whether the IANA time zone is displayed within a cell</li>
86
- * <li><code>valueMap</code> (string) - Mapping object or Map containing the values that should be mapped to a particular key</li>
87
- * <li><code>wrap</code> (boolean) - Indicates if wrapping is enabled for this particular column</li>
88
- * </ul>
89
- * </li>
90
- * <li><code>workbook.context</code> - Context object that will be applied to the generated file. It may contain the following fields:</li>
91
- * <ul>
92
- * <li><code>application</code> (string) - The application that creates the XLSX document (default: "SAP UI5")</li>
93
- * <li><code>version</code> (string) - Application version that creates the XLSX document (default: "1.136.2")</li>
94
- * <li><code>title</code> (string) - Title of the XLSX document (NOT the filename)</li>
95
- * <li><code>modifiedBy</code> (string) - User context for the XLSX document</li>
96
- * <li><code>sheetName</code> (string) - The label of the data sheet</li>
97
- * <li><code>metaSheetName</code> (string) - The label of the metadata sheet. The sheet will not be shown unless metadata entries are provided</li>
98
- * <li><code>metainfo</code> (Array) - An Array of metadata groups. Each group has a name property and an items Array which contains key/value pairs</li>
99
- * </ul>
100
- * <li><code>workbook.hierarchyLevel</code> - Name of the property that contains the hierarchy level information of each line item</li>
101
- * </ul>
102
- * <li><code>dataSource</code> - Source of spreadsheet data. It can be a JSON array with row data,
103
- * an URL or an OData properties object with the following fields:
104
- * <ul>
105
- * <li><code>type</code> (string) - Type of the data source. Currently, only OData is supported and the value have to be set to <code>"odata"</code>.</li>
106
- * <li><code>dataUrl</code> (string) - URL to table data on the server, including all select, filter, and search query parameters</li>
107
- * <li><code>serviceUrl</code> (string) - URL to the OData service. The parameter is required for OData batch requests.</li>
108
- * <li><code>count</code> (number) - Count of available records on the server</li>
109
- * <li><code>useBatch</code> (boolean) - Set to <code>true</code> if OData batch requests are used to fetch the spreadsheet data.
110
- * In this case, <code>serviceUrl</code> and <code>headers</code> have to be specified, too.</li>
111
- * <li><code>headers</code> (object) - Map of HTTP request header properties. They should correspond to the HTTP request headers that are
112
- * used to obtain table data for display in the browser.</li>
113
- * <li><code>sizeLimit</code> (number) - Maximum allowed number of records that can be obtained from the service in a single request</li>
114
- * <li><code>downloadLimit</code> (number) - Maximum allowed number of rows that can be exported. If not specified, all rows are exported.</li>
115
- * </ul>
116
- * </li>
117
- * <li><code>count</code> (number) - The maximal number of records to export. If not specified, all data from the data source is fetched.</li>
118
- * <li><code>worker</code> (boolean) - Run export process in a worker thread. Set to <code>false</code> to disable worker and run export
119
- * in a main thread. This is needed, for example, if a mock server is used to provide spreadsheet data.<br>
120
- * <b>Note:</b> In case of a strict content security policy, it is not always possible to create an export worker.
121
- * In this case, export runs in a main thread disregarding the <code>worker</code> value.</li>
122
- * <li><code>fileName</code> (string) - Optional file name for the exported file. If not specified, the spreadsheet is exported as <code>export.xlsx</code>.</li>
123
- * <li><code>showProgress</code> (boolean) - Set to <code>false</code> to suppress the progress dialog</li>
124
- * </ul>
125
- *
126
- *
127
49
  * <h3>Usage</h3>
128
50
  * To start export, create a new <code>sap.ui.export.Spreadsheet</code> object and call the <code>build</code> method.
129
51
  * Column configuration, data source, and export settings must be provided in the constructor.
@@ -174,7 +96,7 @@ sap.ui.define([
174
96
  * columns: aColumns,
175
97
  * context: {
176
98
  * application: 'Debug Test Application',
177
- * version: '1.136.2',
99
+ * version: '1.138.0',
178
100
  * title: 'Some random title',
179
101
  * modifiedBy: 'John Doe',
180
102
  * metaSheetName: 'Custom metadata',
@@ -256,37 +178,12 @@ sap.ui.define([
256
178
  * object are limited to 31 characters each. If their value exceeds
257
179
  * this maximum length, the value will be truncated.
258
180
  *
259
- * @param {object} mSettings - Export settings
260
- * @param {object} mSettings.workbook - Spreadsheet properties
261
- * @param {Array} mSettings.workbook.columns - Column configuration
262
- * @param {object} [mSettings.workbook.context] - Export context that will be applied to the exported file
263
- * @param {string} [mSettings.workbook.context.application] - Application that created this XLSX
264
- * @param {string} [mSettings.workbook.context.version] - Application version that was used to create this XLSX
265
- * @param {string} [mSettings.workbook.context.title] - Title of the XLSX document (NOT the file name)
266
- * @param {string} [mSettings.workbook.context.modifiedBy] - User context for the exported document
267
- * @param {string} [mSettings.workbook.context.sheetName] - The name of the data sheet that will be shown in Excel
268
- * @param {string} [mSettings.workbook.context.metaSheetName] - The name of the metadata sheet that will be shown in Excel
269
- * @param {Array} [mSettings.workbook.context.metainfo] - Optional Metadata that will be displayed in the additional Metadata Sheet
270
- * @param {string} [mSettings.workbook.hierarchyLevel] - Optional name of the property that contains hierarchy level information
271
- * @param {string | Object | Array | sap.ui.model.ListBinding | sap.ui.model.TreeBinding} mSettings.dataSource - Source of spreadsheet data.
272
- * A JSON array, data source properties map, <code>sap.ui.model.ListBinding</code>, <code>sap.ui.model.TreeBinding</code> or
273
- * URL to an OData source can be provided. For example, <code>"someUrl"</code> is an equivalent to
274
- * <code>{dataUrl:"someUrl", type:"OData"}</code>. An instance of <code>sap.ui.model.ListBinding</code> or
275
- * <code>sap.ui.model.TreeBinding</code> either has to implement a <code>#getDownloadUrl</code> function or needs to be a ClientListBinding.
276
- * <b>Note:</b> <code>sap.ui.model.ClientTreeBinding</code> is not supported.
277
- * @param {int} mSettings.dataSource.sizeLimit - Maximal allowed number of records that can be obtained from the service in a single request
278
- * @param {int} [mSettings.count] - The maximal number of records to export
279
- * @param {boolean} [mSettings.worker=true] - Run export process in a worker thread. Set to <code>false</code> to disable worker and run export
280
- * in a main thread. This is needed, for example, if a mock server is used to provide spreadsheet data.<br>
281
- * <b>Note:</b> In case of a strict content security policy, it is not always possible to create an export worker.
282
- * In this case, export runs in a main thread disregarding the <code>worker</code> value.
283
- * @param {string} [mSettings.fileName="export.xlsx"] - Optional file name for the exported file
284
- * @param {boolean} [mSettings.showProgress=true] - Set to <code>false</code> to suppress the progress dialog
181
+ * @param {sap.ui.export.SpreadsheetSettings} mSettings - Export settings
285
182
  *
286
183
  * @class The <code>sap.ui.export.Spreadsheet</code> class allows you to export table data from a UI5 application to a spreadsheet file.
287
184
  *
288
185
  * @author SAP SE
289
- * @version 1.136.2
186
+ * @version 1.138.0
290
187
  *
291
188
  * @since 1.50
292
189
  * @alias sap.ui.export.Spreadsheet
@@ -306,8 +203,8 @@ sap.ui.define([
306
203
 
307
204
  /* Only apply supported properties */
308
205
  // IMPORTANT: keep count before dataSource to ensure that the expected count can be used for dataSource string
309
- ['showProgress', 'worker'].forEach(function(sProperty) {
310
- if (typeof mSettings[sProperty] !== 'undefined') {
206
+ ["showProgress", "worker"].forEach(function(sProperty) {
207
+ if (typeof mSettings[sProperty] !== "undefined") {
311
208
  this._mSettings[sProperty] = mSettings[sProperty];
312
209
  }
313
210
  }.bind(this));
@@ -321,8 +218,8 @@ sap.ui.define([
321
218
  mCurrencies[sCurrencyCode] = {};
322
219
  }
323
220
 
324
- if (!isNaN(oCurrency.digits)) {
325
- mCurrencies[sCurrencyCode].scale = oCurrency.digits;
221
+ if (!isNaN(oCurrency)) {
222
+ mCurrencies[sCurrencyCode].scale = oCurrency;
326
223
  }
327
224
 
328
225
  if (!isNaN(oCurrency.UnitSpecificScale)) {
@@ -359,21 +256,22 @@ sap.ui.define([
359
256
  oWorkbookContext = mParameters.workbook.context = {};
360
257
  }
361
258
  if (!oWorkbookContext.title) {
362
- oWorkbookContext.title = oResourceBundle.getText('XLSX_DEFAULT_TITLE');
259
+ oWorkbookContext.title = oResourceBundle.getText("XLSX_DEFAULT_TITLE");
363
260
  }
364
261
  if (!oWorkbookContext.sheetName) {
365
- oWorkbookContext.sheetName = oResourceBundle.getText('XLSX_DEFAULT_SHEETNAME');
262
+ oWorkbookContext.sheetName = oResourceBundle.getText("XLSX_DEFAULT_SHEETNAME");
366
263
  }
367
264
 
368
265
  /* Initialize currency customizing for currencies and units of measure */
369
266
  const mCurrencySettings = mParameters.customizing.currency = {};
370
267
  const mUnitSettings = mParameters.customizing.unit = {};
371
- const oCustomCurrencies = Formatting.getCustomCurrencies();
268
+ const oLocaleData = LocaleData.getInstance(Localization.getLanguageTag());
269
+ const oLocaleDataCurrencies = oLocaleData.getAllCurrencyDigits();
372
270
 
373
271
  /* Attach custom currency configuration */
374
- if (oCustomCurrencies) {
375
- for (const sCurrencyCode in oCustomCurrencies) {
376
- addUnit(sCurrencyCode, oCustomCurrencies[sCurrencyCode], mCurrencySettings);
272
+ if (oLocaleDataCurrencies) {
273
+ for (const sCurrencyCode in oLocaleDataCurrencies) {
274
+ addUnit(sCurrencyCode, oLocaleDataCurrencies[sCurrencyCode], mCurrencySettings);
377
275
  }
378
276
  }
379
277
 
@@ -401,7 +299,7 @@ sap.ui.define([
401
299
  * @private
402
300
  */
403
301
  Spreadsheet.requestCodeLists = function(oMetaModel) {
404
- if (!oMetaModel.isA(['sap.ui.model.odata.ODataMetaModel', 'sap.ui.model.odata.v4.ODataMetaModel'])) {
302
+ if (!oMetaModel.isA(["sap.ui.model.odata.ODataMetaModel", "sap.ui.model.odata.v4.ODataMetaModel"])) {
405
303
  return Promise.resolve([null, null]);
406
304
  }
407
305
 
@@ -409,7 +307,7 @@ sap.ui.define([
409
307
  oMetaModel.requestCurrencyCodes(),
410
308
  oMetaModel.requestUnitsOfMeasure()
411
309
  ]).catch(function(oError) {
412
- Log.warning(CLASS_NAME + ': Code lists cannot be processed due to the following error - ' + oError);
310
+ Log.warning(CLASS_NAME + ": Code lists cannot be processed due to the following error - " + oError);
413
311
  return Promise.resolve([null, null]);
414
312
  });
415
313
  };
@@ -449,7 +347,7 @@ sap.ui.define([
449
347
  * @public
450
348
  */
451
349
  Spreadsheet.prototype.attachBeforeSave = function(oData, fnHandler, oListener) {
452
- return this.attachEvent('beforeSave', oData, fnHandler, oListener);
350
+ return this.attachEvent("beforeSave", oData, fnHandler, oListener);
453
351
  };
454
352
 
455
353
  /**
@@ -465,7 +363,7 @@ sap.ui.define([
465
363
  * @public
466
364
  */
467
365
  Spreadsheet.prototype.detachBeforeSave = function(fnHandler, oListener) {
468
- return this.detachEvent('beforeSave', fnHandler, oListener);
366
+ return this.detachEvent("beforeSave", fnHandler, oListener);
469
367
  };
470
368
 
471
369
  /**
@@ -494,7 +392,7 @@ sap.ui.define([
494
392
  * @public
495
393
  */
496
394
  Spreadsheet.prototype.getMimeType = function() {
497
- return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
395
+ return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
498
396
  };
499
397
 
500
398
  /**
@@ -511,7 +409,7 @@ sap.ui.define([
511
409
  }
512
410
 
513
411
  const iProgress = Math.round(iFetched / iTotal * 100);
514
- Log.debug('Spreadsheet export: ' + iProgress + '% loaded.');
412
+ Log.debug(`Spreadsheet export: ${iProgress}% loaded.`);
515
413
  };
516
414
 
517
415
  /**
@@ -532,7 +430,7 @@ sap.ui.define([
532
430
  /**
533
431
  * If <code>ClientListBinding</code>, we use the binding path to receive the data from the underlying model
534
432
  */
535
- if (oBinding.isA('sap.ui.model.ClientListBinding')) {
433
+ if (oBinding.isA("sap.ui.model.ClientListBinding")) {
536
434
  const aData = [];
537
435
 
538
436
  oBinding.getAllCurrentContexts().forEach(function(oContext) {
@@ -541,30 +439,30 @@ sap.ui.define([
541
439
 
542
440
  oDataSource = {
543
441
  data: aData,
544
- type: 'array'
442
+ type: "array"
545
443
  };
546
444
  }
547
445
 
548
- if (oBinding.isA('sap.ui.model.ClientTreeBinding')) {
549
- Log.error('Unable to create dataSource configuration due to not supported Binding: ' + oBinding.getMetadata().getName());
446
+ if (oBinding.isA("sap.ui.model.ClientTreeBinding")) {
447
+ Log.error("Unable to create dataSource configuration due to not supported Binding: " + oBinding.getMetadata().getName());
550
448
  }
551
449
 
552
450
  /**
553
451
  * All other <code>Bindings</code> need to provide a downloadUrl
554
452
  */
555
- if (typeof oBinding.getDownloadUrl === 'function') {
453
+ if (typeof oBinding.getDownloadUrl === "function") {
556
454
  const oModel = oBinding.getModel();
557
- const bV4ODataModel = oModel.isA('sap.ui.model.odata.v4.ODataModel');
558
- let sDataUrl = oBinding.getDownloadUrl('json');
455
+ const bV4ODataModel = oModel.isA("sap.ui.model.odata.v4.ODataModel");
456
+ let sDataUrl = oBinding.getDownloadUrl("json");
559
457
  let sServiceUrl = oModel.sServiceUrl;
560
458
 
561
459
  sDataUrl = ExportUtils.interceptUrl(sDataUrl);
562
460
  sServiceUrl = ExportUtils.interceptUrl(sServiceUrl);
563
461
 
564
- const bIgnoreCount = sDataUrl.split(/[?&]/g).some((sQuery) => sQuery?.includes('$apply') && sQuery?.includes('com.sap.vocabularies.Hierarchy.v1.TopLevels'));
462
+ const bIgnoreCount = sDataUrl.split(/[?&]/g).some((sQuery) => sQuery?.includes("$apply") && sQuery?.includes("com.sap.vocabularies.Hierarchy.v1.TopLevels"));
565
463
 
566
464
  oDataSource = {
567
- type: 'odata',
465
+ type: "odata",
568
466
  dataUrl: sDataUrl,
569
467
  serviceUrl: sServiceUrl,
570
468
  headers: bV4ODataModel ? oModel.getHttpHeaders(true) : oModel.getHeaders(),
@@ -575,8 +473,8 @@ sap.ui.define([
575
473
 
576
474
  /* Obtain CodeLists from ODataMetaModel */
577
475
  if (oModel.getMetaModel()
578
- && typeof oModel.getMetaModel().requestCurrencyCodes === 'function'
579
- && typeof oModel.getMetaModel().requestUnitsOfMeasure === 'function') {
476
+ && typeof oModel.getMetaModel().requestCurrencyCodes === "function"
477
+ && typeof oModel.getMetaModel().requestUnitsOfMeasure === "function") {
580
478
 
581
479
  this.codeListsPromise = Spreadsheet.requestCodeLists(oModel.getMetaModel(), this._mSettings);
582
480
  }
@@ -605,30 +503,30 @@ sap.ui.define([
605
503
  return null;
606
504
  }
607
505
 
608
- if (sDataSourceType == 'string') {
506
+ if (sDataSourceType == "string") {
609
507
  return {
610
508
  count: this._mSettings.count,
611
509
  dataUrl: oDataSource,
612
- type: 'odata',
510
+ type: "odata",
613
511
  useBatch: false
614
512
  };
615
513
  }
616
514
 
617
- if (sDataSourceType != 'object') {
618
- Log.error('Spreadsheet#processDataSource: Unable to apply data source of type ' + sDataSourceType);
515
+ if (sDataSourceType != "object") {
516
+ Log.error("Spreadsheet#processDataSource: Unable to apply data source of type " + sDataSourceType);
619
517
 
620
518
  return null;
621
519
  }
622
520
 
623
521
  if (oDataSource instanceof Array ) {
624
- mDataSource = {data: oDataSource, type: 'array'};
522
+ mDataSource = {data: oDataSource, type: "array"};
625
523
  }
626
524
 
627
525
  if (oDataSource.dataUrl) {
628
526
  mDataSource = oDataSource;
629
527
  }
630
528
 
631
- if (oDataSource.isA && oDataSource.isA(['sap.ui.model.ListBinding', 'sap.ui.model.TreeBinding'])) {
529
+ if (oDataSource.isA && oDataSource.isA(["sap.ui.model.ListBinding", "sap.ui.model.TreeBinding"])) {
632
530
  mDataSource = this.createDataSourceFromBinding(oDataSource);
633
531
  }
634
532
 
@@ -653,7 +551,7 @@ sap.ui.define([
653
551
  const iCount = mParameters.dataSource.count;
654
552
  const iDownloadLimit = mParameters.dataSource.downloadLimit;
655
553
  const nSizeLimit = Device.system.desktop ? 2_000_000 : 100_000; // 2.000.000 cells on desktop and 100.000 otherwise
656
- const nRows = mParameters.dataSource.type == 'array' ? mParameters.dataSource.data.length : iDownloadLimit || iCount;
554
+ const nRows = mParameters.dataSource.type == "array" ? mParameters.dataSource.data.length : iDownloadLimit || iCount;
657
555
  const nColumns = mParameters.workbook.columns.length;
658
556
 
659
557
  function onmessage(oMessage) {
@@ -677,7 +575,7 @@ sap.ui.define([
677
575
  return;
678
576
  }
679
577
 
680
- const executeDefaultAction = that.fireEvent('beforeSave', {
578
+ const executeDefaultAction = that.fireEvent("beforeSave", {
681
579
  data: oMessage.spreadsheet,
682
580
  exportDialog: progressDialog
683
581
  }, true, false);
@@ -700,7 +598,7 @@ sap.ui.define([
700
598
  fnResolve();
701
599
  }
702
600
 
703
- if (typeof oMessage.error != 'undefined') {
601
+ if (typeof oMessage.error != "undefined") {
704
602
  const sError = oMessage.error.message || oMessage.error;
705
603
  that.process = null;
706
604
 
@@ -721,7 +619,7 @@ sap.ui.define([
721
619
  function startExport() {
722
620
  if (!mParameters.showProgress) {
723
621
  if (that.process) {
724
- fnReject('Cannot start export: the process is already running');
622
+ fnReject("Cannot start export: the process is already running");
725
623
  return;
726
624
  }
727
625
 
@@ -734,7 +632,7 @@ sap.ui.define([
734
632
  progressDialog = oDialogResolve;
735
633
 
736
634
  if (that.process) {
737
- fnReject('Cannot start export: the process is already running');
635
+ fnReject("Cannot start export: the process is already running");
738
636
  return;
739
637
  }
740
638
 
@@ -755,7 +653,7 @@ sap.ui.define([
755
653
  // When there are no columns --> don't trigger the export
756
654
  if (nColumns <= 0) {
757
655
  // Consider showing a dialog to the end users instead of just this error!
758
- fnReject('No columns to export.');
656
+ fnReject("No columns to export.");
759
657
  } else if (nRows * nColumns > nSizeLimit || !nRows || nRows >= MAX_ROWS || isDownloadLimitLessThanCount(nRows, iCount)) { // Amount of rows need to be less than maximum amount because of column header
760
658
  const oDialogSettings = {
761
659
  rows: nRows,
@@ -21,7 +21,7 @@ sap.ui.define(['sap/base/Log', 'sap/ui/export/ExportUtils'], function(Log, Expor
21
21
  * Utility class to perform spreadsheet export.
22
22
  *
23
23
  * @author SAP SE
24
- * @version 1.136.2
24
+ * @version 1.138.0
25
25
  *
26
26
  * @alias sap.ui.export.SpreadsheetExport
27
27
  * @private
@@ -5,7 +5,7 @@
5
5
  <Input id="exportSettingsDialog-fileName" value="{/fileName}" liveChange=".onFileNameChange" class="sapUiTinyMarginBottom"/>
6
6
 
7
7
  <Label text="{i18n>SELECT_FORMAT}" labelFor="exportSettingsDialog-fileType"/>
8
- <Select id="exportSettingsDialog-fileType" selectedKey="{/fileType}" items="{/fileTypeCollection}" change=".onFileTypeChange" width="100%" class="sapUiTinyMarginBottom">
8
+ <Select id="exportSettingsDialog-fileType" selectedKey="{path: '/fileType', mode: 'OneWay' }" items="{/fileTypeCollection}" change=".onFileTypeChange" width="100%" class="sapUiTinyMarginBottom">
9
9
  <items>
10
10
  <core:Item key="{key}" text="{text}"/>
11
11
  </items>
@@ -18,8 +18,7 @@
18
18
  </items>
19
19
  </Select>
20
20
 
21
- <CheckBox id="exportSettingsDialog-includeFilterSettings" selected="{/includeFilterSettings}" text="{i18n>INCLUDE_FILTER_SETTINGS}" visible="{path:'/fileType', formatter: '.isSpreadsheet'}"/>
22
- <CheckBox id="exportSettingsDialog-includeFilterSettings-PDF" selected="{/includeFilterSettings}" text="{i18n>INCLUDE_FILTER_SETTINGS}" visible="{parts:['/fileType', '/capabilities/PDF/CoverPage'], formatter: '.isPDF'}" tooltip="{i18n>TOOLTIP_FILTER_SETTINGS}"/>
21
+ <CheckBox id="exportSettingsDialog-includeFilterSettings" selected="{/includeFilterSettings}" text="{i18n>INCLUDE_FILTER_SETTINGS}" visible="{parts:['/fileType', '/capabilities/PDF/CoverPage'], formatter: '.isSupported'}" tooltip="{i18n>TOOLTIP_FILTER_SETTINGS}"/>
23
22
  <CheckBox id="exportSettingsDialog-pdfArchive" selected="{/pdfArchive}" text="{i18n>ARCHIVE_FORMAT}" visible="{parts:['/fileType', '/capabilities/PDF/ArchiveFormat'], formatter: '.isPDF'}" tooltip="{i18n>TOOLTIP_ARCHIVE_FORMAT}"/>
24
23
  <CheckBox id="exportSettingsDialog-splitCells" selected="{/splitCells}" text="{i18n>SPLIT_CELLS}" visible="{path:'/fileType', formatter: '.isSpreadsheet'}"/> <!-- Will be hidden in case of PDF because it needs to be always true and is applied implicitly -->
25
24
  <CheckBox id="exportSettingsDialog-addDateTime" selected="{/addDateTime}" text="{i18n>ADD_DATE_TIME}" visible="false"/>
@@ -15,7 +15,7 @@ sap.ui.define(["sap/ui/core/Lib"], function(Library) {
15
15
  * @namespace
16
16
  * @alias sap.ui.export
17
17
  * @author SAP SE
18
- * @version 1.136.2
18
+ * @version 1.138.0
19
19
  * @public
20
20
  */
21
21
 
@@ -34,7 +34,7 @@ sap.ui.define(["sap/ui/core/Lib"], function(Library) {
34
34
  interfaces: [],
35
35
  controls: [],
36
36
  elements: [],
37
- version: "1.136.2"
37
+ version: "1.138.0"
38
38
  });
39
39
 
40
40
  /**
@@ -229,5 +229,73 @@ sap.ui.define(["sap/ui/core/Lib"], function(Library) {
229
229
  }
230
230
  });
231
231
 
232
+ /**
233
+ * @typedef {object} sap.ui.export.SpreadsheetSettings
234
+ * @property {object} workbook - Spreadsheet properties object.
235
+ * @property {sap.ui.export.Column[]} workbook.columns - Column configurations.
236
+ * @property {object} [workbook.context] - Export context that will be applied to the exported file.
237
+ * @property {string} [workbook.context.application="SAP UI5"] - The application that creates the XLSX document.
238
+ * @property {string} [workbook.context.version="1.138.0"] - Application version that creates the XLSX document.
239
+ * @property {string} [workbook.context.title] - Title of the XLSX document (NOT the file name).
240
+ * @property {string} [workbook.context.modifiedBy] - User context for the XLSX document.
241
+ * @property {string} [workbook.context.sheetName] - The label of the data sheet.
242
+ * @property {string} [workbook.context.metaSheetName] - The label of the metadata sheet. The sheet will not be shown unless metadata entries are provided
243
+ * @property {Array.<{name: string, items: Array.<{key: string, value: string}>}>} [workbook.context.metainfo] - Metadata groups with key/value pairs.
244
+ * @property {string} [workbook.hierarchyLevel] - Name of the property that contains hierarchy level information.
245
+ * @property {string|object|Array|sap.ui.model.ListBinding|sap.ui.model.TreeBinding} dataSource
246
+ * Source of spreadsheet data. Can be an array with row data, an URL, a binding instance, or an OData properties object.
247
+ * @property {"odata"} dataSource.type - Type of the data source. Currently, only OData is supported and the value has to be set to "odata".
248
+ * @property {string} dataSource.dataUrl - URL to table data on the server, including all select, filter, and search query parameters.
249
+ * @property {string} [dataSource.serviceUrl] - URL to the OData service. Required for OData batch requests.
250
+ * @property {number} [dataSource.count] - Count of available records on the server.
251
+ * @property {boolean} [dataSource.useBatch]
252
+ * Whether batch requests are used to fetch the spreadsheet data. In this case, <code>serviceUrl</code> and <code>headers</code> have to be
253
+ * specified, too.
254
+ * @property {Object.<string, string>} [dataSource.headers] - Map of HTTP request header properties.
255
+ * @property {number} [dataSource.sizeLimit] - Maximum allowed number of records that can be obtained from the service in a single request.
256
+ * @property {number} [dataSource.downloadLimit] - Maximum allowed number of rows that can be exported. If not specified, all rows are exported.
257
+ * @property {number} [count] - The maximal number of records to export. If not specified, all data from the data source is fetched.
258
+ * @property {boolean} [worker=true] - Whether to run the export process in a worker or the main thread.
259
+ * @property {string} [fileName="export.xlsx"] - File name for the exported file.
260
+ * @property {boolean} [showProgress=true] - Whether to show the progress dialog.
261
+ *
262
+ * @public
263
+ */
264
+
265
+ /**
266
+ * @typedef {object} sap.ui.export.Column
267
+ * @property {string} [label] - Column header text.
268
+ * @property {string|string[]} [property] - Field name or array of field names in the data source feed.
269
+ * @property {sap.ui.export.EdmType} [type=sap.ui.export.EdmType.String] - Data type of the field.
270
+ * @property {number} [width=10]
271
+ * Width of the column in characters. There is no 1:1 correspondence between character widths in the exported spreadsheet and CSS units. The
272
+ * width of one character is approximately 0.5em in CSS units, depending on the fonts that are used in the table and in the resulting
273
+ * spreadsheet.
274
+ * @property {string} [textAlign]
275
+ * Horizontal alignment of cell contents. Accepted values: `left`, `right`, `center`, `begin`, `end`. If not specified, the columns are
276
+ * aligned based on the type.</li>
277
+ * @property {number} [scale] - Number of digits after the decimal point for numeric values.
278
+ * @property {boolean} [autoScale] - Allows automatic scale assignment based on unit of measure.
279
+ * @property {boolean} [delimiter=false] - Whether to display thousands separators in numeric values.
280
+ * @property {string} [unit]
281
+ * Text to display as the unit of measurement or currency next to the numeric value. It is treated as a string and has no influence on the
282
+ * value itself. For example, a value of 150 with the unit "%" is still 150 and not 1.5, as a user may expect.
283
+ * @property {string} [unitProperty] - Name of the data source field that contains the unit/currency text.
284
+ * @property {boolean} [displayUnit=true] - Defines if the currency is shown in the column (applies to currency values only).
285
+ * @property {string} [trueValue] - Textual representation of a boolean type that has the value <code>true</code>.
286
+ * @property {string} [falseValue] - Textual representation of a boolean type that has the value <code>false</code>.
287
+ * @property {string} [template] - Formatting template that supports indexed placeholders within curly brackets.
288
+ * @property {string} [format] - Output format for columns of type Date/DateTime/Time.
289
+ * @property {string} [inputFormat] - Formatting template for string-formatted dates.
290
+ * @property {boolean} [utc] - Whether the <code>DateTime</code> is displayed as UTC or local time.
291
+ * @property {string} [timezone] - Defines a fixed IANA time zone.
292
+ * @property {string} [timezoneProperty] - References an OData property that contains the specific IANA time zone.
293
+ * @property {boolean} [displayTimezone] - Whether the IANA time zone is displayed within a cell.
294
+ * @property {object} [valueMap] - Mapping object or Map containing the values that should be mapped to a particular key.
295
+ * @property {boolean} [wrap] - Indicates if wrapping is enabled for this particular column.
296
+ *
297
+ * @public
298
+ */
299
+
232
300
  return thisLib;
233
301
  });
@@ -24,7 +24,7 @@
24
24
  * @param {object} mSettings Data service related part of the export configuration
25
25
  *
26
26
  * @author SAP SE
27
- * @version 1.136.2
27
+ * @version 1.138.0
28
28
  *
29
29
  * @constructor
30
30
  * @class DataProviderBase
@@ -20,7 +20,7 @@ sap.ui.define(['sap/ui/base/Object'], function(BaseObject) {
20
20
  * convenience functions like <code>sap.ui.export.util.Filter#setType</code> to improve the result.
21
21
  *
22
22
  * @author SAP SE
23
- * @version 1.136.2
23
+ * @version 1.138.0
24
24
  *
25
25
  * @since 1.110
26
26
  * @alias sap.ui.export.util.Filter