@deephaven/iris-grid 0.22.3-beta.11 → 0.22.3-beta.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.
@@ -11,7 +11,7 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
11
11
  import React, { Component } from 'react';
12
12
  import ClassNames from 'classnames';
13
13
  import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
14
- import { Button, LoadingSpinner, RadioGroup, RadioItem } from '@deephaven/components';
14
+ import { Button, Checkbox, LoadingSpinner, RadioGroup, RadioItem } from '@deephaven/components';
15
15
  import { GridRange, GridUtils } from '@deephaven/grid';
16
16
  import { vsWarning } from '@deephaven/icons';
17
17
  import dh from '@deephaven/jsapi-shim';
@@ -30,17 +30,23 @@ class TableCsvExporter extends Component {
30
30
  constructor(props) {
31
31
  super(props);
32
32
  this.handleDownloadClick = this.handleDownloadClick.bind(this);
33
- this.handleDownloadOptionChanged = this.handleDownloadOptionChanged.bind(this);
34
- this.handleCustomizedDownloadOptionChanged = this.handleCustomizedDownloadOptionChanged.bind(this);
33
+ this.handleDownloadRowOptionChanged = this.handleDownloadRowOptionChanged.bind(this);
34
+ this.handleCustomizedDownloadRowOptionChanged = this.handleCustomizedDownloadRowOptionChanged.bind(this);
35
35
  this.handleCustomizedDownloadRowsChanged = this.handleCustomizedDownloadRowsChanged.bind(this);
36
+ this.handleIncludeColumnHeadersChanged = this.handleIncludeColumnHeadersChanged.bind(this);
37
+ this.handleIncludeHiddenColumnsChanged = this.handleIncludeHiddenColumnsChanged.bind(this);
38
+ this.handleUseUnformattedValuesChanged = this.handleUseUnformattedValuesChanged.bind(this);
36
39
  var {
37
40
  name
38
41
  } = props;
39
42
  this.state = {
40
43
  fileName: "".concat(name, "-").concat(TableCsvExporter.getDateString(), ".csv"),
41
- downloadOption: TableCsvExporter.DOWNLOAD_OPTIONS.ALL_ROWS,
42
- customizedDownloadOption: TableCsvExporter.CUSTOMIZED_ROWS_OPTIONS.FIRST,
44
+ downloadRowOption: TableCsvExporter.DOWNLOAD_ROW_OPTIONS.ALL_ROWS,
45
+ customizedDownloadRowOption: TableCsvExporter.CUSTOMIZED_ROWS_OPTIONS.FIRST,
43
46
  customizedDownloadRows: TableCsvExporter.DEFAULT_DOWNLOAD_ROWS,
47
+ includeColumnHeaders: true,
48
+ includeHiddenColumns: false,
49
+ useUnformattedValues: false,
44
50
  errorMessage: null,
45
51
  id: shortid.generate()
46
52
  };
@@ -52,8 +58,8 @@ class TableCsvExporter extends Component {
52
58
  selectedRanges
53
59
  } = this.props;
54
60
  var {
55
- downloadOption,
56
- customizedDownloadOption,
61
+ downloadRowOption,
62
+ customizedDownloadRowOption,
57
63
  customizedDownloadRows
58
64
  } = this.state;
59
65
  var {
@@ -62,12 +68,12 @@ class TableCsvExporter extends Component {
62
68
  } = model;
63
69
  var snapshotRanges = [];
64
70
 
65
- switch (downloadOption) {
66
- case TableCsvExporter.DOWNLOAD_OPTIONS.ALL_ROWS:
71
+ switch (downloadRowOption) {
72
+ case TableCsvExporter.DOWNLOAD_ROW_OPTIONS.ALL_ROWS:
67
73
  snapshotRanges.push(new GridRange(0, 0, columnCount - 1, rowCount - 1));
68
74
  break;
69
75
 
70
- case TableCsvExporter.DOWNLOAD_OPTIONS.SELECTED_ROWS:
76
+ case TableCsvExporter.DOWNLOAD_ROW_OPTIONS.SELECTED_ROWS:
71
77
  snapshotRanges = selectedRanges.map(range => _objectSpread(_objectSpread({}, range), {}, {
72
78
  startColumn: 0,
73
79
  endColumn: columnCount - 1
@@ -80,8 +86,8 @@ class TableCsvExporter extends Component {
80
86
  });
81
87
  break;
82
88
 
83
- case TableCsvExporter.DOWNLOAD_OPTIONS.CUSTOMIZED_ROWS:
84
- switch (customizedDownloadOption) {
89
+ case TableCsvExporter.DOWNLOAD_ROW_OPTIONS.CUSTOMIZED_ROWS:
90
+ switch (customizedDownloadRowOption) {
85
91
  case TableCsvExporter.CUSTOMIZED_ROWS_OPTIONS.FIRST:
86
92
  snapshotRanges.push(new GridRange(0, 0, columnCount - 1, Math.min(customizedDownloadRows - 1, rowCount - 1)));
87
93
  break;
@@ -108,10 +114,13 @@ class TableCsvExporter extends Component {
108
114
  userColumnWidths,
109
115
  movedColumns
110
116
  } = this.props;
117
+ var {
118
+ includeHiddenColumns
119
+ } = this.state;
111
120
  var hiddenColumns = IrisGridUtils.getHiddenColumns(userColumnWidths);
112
121
  var modelRanges = GridUtils.getModelRanges(ranges, movedColumns);
113
122
 
114
- if (hiddenColumns.length > 0) {
123
+ if (!includeHiddenColumns && hiddenColumns.length > 0) {
115
124
  var subtractRanges = hiddenColumns.map(GridRange.makeColumn);
116
125
  modelRanges = GridRange.subtractRangesFromRanges(modelRanges, subtractRanges);
117
126
  }
@@ -137,7 +146,9 @@ class TableCsvExporter extends Component {
137
146
  onCancel
138
147
  } = _this.props;
139
148
  var {
140
- fileName
149
+ fileName,
150
+ includeColumnHeaders,
151
+ useUnformattedValues
141
152
  } = _this.state;
142
153
 
143
154
  if (isDownloading) {
@@ -160,7 +171,7 @@ class TableCsvExporter extends Component {
160
171
  var _tableSubscription = _frozenTable.setViewport(0, 0);
161
172
 
162
173
  yield _tableSubscription.getViewportData();
163
- onDownload(fileName, _frozenTable, _tableSubscription, snapshotRanges, modelRanges);
174
+ onDownload(fileName, _frozenTable, _tableSubscription, snapshotRanges, modelRanges, includeColumnHeaders, useUnformattedValues);
164
175
  } catch (error) {
165
176
  log.error('CSV download failed', error);
166
177
 
@@ -176,15 +187,15 @@ class TableCsvExporter extends Component {
176
187
  })();
177
188
  }
178
189
 
179
- handleDownloadOptionChanged(event) {
190
+ handleDownloadRowOptionChanged(event) {
180
191
  this.setState({
181
- downloadOption: event.target.value
192
+ downloadRowOption: event.target.value
182
193
  });
183
194
  }
184
195
 
185
- handleCustomizedDownloadOptionChanged(event) {
196
+ handleCustomizedDownloadRowOptionChanged(event) {
186
197
  this.setState({
187
- customizedDownloadOption: event.target.value
198
+ customizedDownloadRowOption: event.target.value
188
199
  });
189
200
  }
190
201
 
@@ -194,16 +205,49 @@ class TableCsvExporter extends Component {
194
205
  });
195
206
  }
196
207
 
208
+ handleIncludeColumnHeadersChanged() {
209
+ this.setState(_ref => {
210
+ var {
211
+ includeColumnHeaders
212
+ } = _ref;
213
+ return {
214
+ includeColumnHeaders: !includeColumnHeaders
215
+ };
216
+ });
217
+ }
218
+
219
+ handleIncludeHiddenColumnsChanged() {
220
+ this.setState(_ref2 => {
221
+ var {
222
+ includeHiddenColumns
223
+ } = _ref2;
224
+ return {
225
+ includeHiddenColumns: !includeHiddenColumns
226
+ };
227
+ });
228
+ }
229
+
230
+ handleUseUnformattedValuesChanged() {
231
+ this.setState(_ref3 => {
232
+ var {
233
+ useUnformattedValues
234
+ } = _ref3;
235
+ return {
236
+ useUnformattedValues: !useUnformattedValues
237
+ };
238
+ });
239
+ }
240
+
197
241
  validateOptionInput() {
198
242
  var {
199
243
  selectedRanges
200
244
  } = this.props;
201
245
  var {
202
- downloadOption,
246
+ downloadRowOption,
203
247
  customizedDownloadRows
204
248
  } = this.state;
205
249
 
206
- if (downloadOption === TableCsvExporter.DOWNLOAD_OPTIONS.SELECTED_ROWS && selectedRanges.length === 0) {
250
+ if (downloadRowOption === TableCsvExporter.DOWNLOAD_ROW_OPTIONS.SELECTED_ROWS && selectedRanges.length === 0) {
207
251
  this.setState({
208
252
  errorMessage: /*#__PURE__*/React.createElement("p", null, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
209
253
  icon: vsWarning
@@ -212,7 +256,7 @@ class TableCsvExporter extends Component {
212
256
  return false;
213
257
  }
214
258
 
215
- if (downloadOption === TableCsvExporter.DOWNLOAD_OPTIONS.CUSTOMIZED_ROWS && customizedDownloadRows <= 0) {
259
+ if (downloadRowOption === TableCsvExporter.DOWNLOAD_ROW_OPTIONS.CUSTOMIZED_ROWS && customizedDownloadRows <= 0) {
216
260
  this.setState({
217
261
  errorMessage: /*#__PURE__*/React.createElement("p", null, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
218
262
  icon: vsWarning
@@ -235,9 +279,12 @@ class TableCsvExporter extends Component {
235
279
  } = this.props;
236
280
  var {
237
281
  fileName,
238
- downloadOption,
239
- customizedDownloadOption,
282
+ downloadRowOption,
283
+ customizedDownloadRowOption,
240
284
  customizedDownloadRows,
285
+ includeColumnHeaders,
286
+ includeHiddenColumns,
287
+ useUnformattedValues,
241
288
  errorMessage,
242
289
  id
243
290
  } = this.state;
@@ -251,36 +298,36 @@ class TableCsvExporter extends Component {
251
298
  }, "Download Rows"), /*#__PURE__*/React.createElement("div", {
252
299
  className: "form-group"
253
300
  }, /*#__PURE__*/React.createElement(RadioGroup, {
254
- onChange: this.handleDownloadOptionChanged,
255
- value: downloadOption,
301
+ onChange: this.handleDownloadRowOptionChanged,
302
+ value: downloadRowOption,
256
303
  disabled: isDownloading
257
304
  }, /*#__PURE__*/React.createElement(RadioItem, {
258
- value: TableCsvExporter.DOWNLOAD_OPTIONS.ALL_ROWS,
305
+ value: TableCsvExporter.DOWNLOAD_ROW_OPTIONS.ALL_ROWS,
259
306
  "data-testid": "radio-csv-exporter-download-all"
260
307
  }, "All Rows", /*#__PURE__*/React.createElement("span", {
261
308
  className: "text-muted ml-2"
262
309
  }, "(".concat(rowCount.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,'), " rows)"))), /*#__PURE__*/React.createElement(RadioItem, {
263
- value: TableCsvExporter.DOWNLOAD_OPTIONS.SELECTED_ROWS,
310
+ value: TableCsvExporter.DOWNLOAD_ROW_OPTIONS.SELECTED_ROWS,
264
311
  "data-testid": "radio-csv-exporter-only-selected"
265
312
  }, "Only Selected Rows", /*#__PURE__*/React.createElement("span", {
266
313
  className: "text-muted ml-2"
267
314
  }, selectedRanges.length > 0 ? "(".concat(GridRange.rowCount(selectedRanges).toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,'), " rows)") : null)), /*#__PURE__*/React.createElement(RadioItem, {
268
- value: TableCsvExporter.DOWNLOAD_OPTIONS.CUSTOMIZED_ROWS,
315
+ value: TableCsvExporter.DOWNLOAD_ROW_OPTIONS.CUSTOMIZED_ROWS,
269
316
  "data-testid": "radio-csv-exporter-customized-rows"
270
317
  }, /*#__PURE__*/React.createElement("div", {
271
318
  className: "radio-input-row",
272
319
  role: "presentation",
273
320
  onClick: () => {
274
321
  this.setState({
275
- downloadOption: TableCsvExporter.DOWNLOAD_OPTIONS.CUSTOMIZED_ROWS
322
+ downloadRowOption: TableCsvExporter.DOWNLOAD_ROW_OPTIONS.CUSTOMIZED_ROWS
276
323
  });
277
324
  }
278
325
  }, /*#__PURE__*/React.createElement("select", {
279
- value: customizedDownloadOption,
326
+ value: customizedDownloadRowOption,
280
327
  "data-testid": "select-csv-exporter-customized-rows",
281
328
  className: "custom-select",
282
329
  disabled: isDownloading,
283
- onChange: this.handleCustomizedDownloadOptionChanged
330
+ onChange: this.handleCustomizedDownloadRowOptionChanged
284
331
  }, /*#__PURE__*/React.createElement("option", {
285
332
  value: "FIRST"
286
333
  }, "First"), /*#__PURE__*/React.createElement("option", {
@@ -313,6 +360,17 @@ class TableCsvExporter extends Component {
313
360
  },
314
361
  disabled: isDownloading
315
362
  })), /*#__PURE__*/React.createElement("div", {
363
+ className: "checkbox-options"
364
+ }, /*#__PURE__*/React.createElement(Checkbox, {
365
+ checked: includeColumnHeaders,
366
+ onChange: this.handleIncludeColumnHeadersChanged
367
+ }, "Include column headers"), /*#__PURE__*/React.createElement(Checkbox, {
368
+ checked: includeHiddenColumns,
369
+ onChange: this.handleIncludeHiddenColumnsChanged
370
+ }, "Include hidden columns"), /*#__PURE__*/React.createElement(Checkbox, {
371
+ checked: useUnformattedValues,
372
+ onChange: this.handleUseUnformattedValuesChanged
373
+ }, "Use unformatted values")), /*#__PURE__*/React.createElement("div", {
316
374
  className: "section-footer flex-column"
317
375
  }, errorMessage != null && /*#__PURE__*/React.createElement("div", {
318
376
  className: "error-message"
@@ -365,7 +423,7 @@ _defineProperty(TableCsvExporter, "DOWNLOAD_STATUS", {
365
423
  CANCELED: 'CANCELED'
366
424
  });
367
425
 
368
- _defineProperty(TableCsvExporter, "DOWNLOAD_OPTIONS", {
426
+ _defineProperty(TableCsvExporter, "DOWNLOAD_ROW_OPTIONS", {
369
427
  ALL_ROWS: 'ALL_ROWS',
370
428
  SELECTED_ROWS: 'SELECTED_ROWS',
371
429
  CUSTOMIZED_ROWS: 'CUSTOMIZED_ROWS'
@@ -1 +1 @@
1
- {"version":3,"file":"TableCsvExporter.js","names":["React","Component","ClassNames","FontAwesomeIcon","Button","LoadingSpinner","RadioGroup","RadioItem","GridRange","GridUtils","vsWarning","dh","TimeUtils","shortid","Log","IrisGridUtils","log","module","TableCsvExporter","getDateString","i18n","DateTimeFormat","format","FILENAME_DATE_FORMAT","Date","constructor","props","handleDownloadClick","bind","handleDownloadOptionChanged","handleCustomizedDownloadOptionChanged","handleCustomizedDownloadRowsChanged","name","state","fileName","downloadOption","DOWNLOAD_OPTIONS","ALL_ROWS","customizedDownloadOption","CUSTOMIZED_ROWS_OPTIONS","FIRST","customizedDownloadRows","DEFAULT_DOWNLOAD_ROWS","errorMessage","id","generate","getSnapshotRanges","model","selectedRanges","rowCount","columnCount","snapshotRanges","push","SELECTED_ROWS","map","range","startColumn","endColumn","sort","rangeA","rangeB","startRow","CUSTOMIZED_ROWS","Math","min","LAST","max","getModelRanges","ranges","userColumnWidths","movedColumns","hiddenColumns","getHiddenColumns","modelRanges","length","subtractRanges","makeColumn","subtractRangesFromRanges","resetDownloadState","setState","isDownloading","onDownloadStart","onDownload","onCancel","validateOptionInput","frozenTable","export","tableSubscription","setViewport","getViewportData","error","event","target","value","parseInt","render","tableDownloadProgress","tableDownloadEstimatedTime","tableDownloadStatus","toString","replace","DOWNLOAD_STATUS","DOWNLOADING","INITIATING","formatElapsedTime","FINISHED","CANCELED","width","undefined"],"sources":["../../src/sidebar/TableCsvExporter.tsx"],"sourcesContent":["import React, { Component, ReactElement } from 'react';\nimport ClassNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n Button,\n LoadingSpinner,\n RadioGroup,\n RadioItem,\n} from '@deephaven/components';\nimport {\n GridRange,\n GridUtils,\n ModelSizeMap,\n MoveOperation,\n} from '@deephaven/grid';\nimport { vsWarning } from '@deephaven/icons';\nimport dh, { Table, TableViewportSubscription } from '@deephaven/jsapi-shim';\nimport { TimeUtils } from '@deephaven/utils';\nimport shortid from 'shortid';\nimport './TableCsvExporter.scss';\nimport Log from '@deephaven/log';\nimport IrisGridModel from '../IrisGridModel';\nimport IrisGridUtils from '../IrisGridUtils';\n\nconst log = Log.module('TableCsvExporter');\ninterface TableCsvExporterProps {\n model: IrisGridModel;\n name: string;\n userColumnWidths: ModelSizeMap;\n movedColumns: MoveOperation[];\n isDownloading: boolean;\n tableDownloadStatus: string;\n tableDownloadProgress: number;\n tableDownloadEstimatedTime: number;\n onDownloadStart: () => void;\n onDownload: (\n fileName: string,\n frozenTable: Table,\n tableSubscription: TableViewportSubscription,\n snapshotRanges: GridRange[],\n modelRanges: GridRange[]\n ) => void;\n onCancel: () => void;\n selectedRanges: GridRange[];\n}\n\ninterface TableCsvExporterState {\n fileName: string;\n\n downloadOption: string;\n customizedDownloadOption: string;\n customizedDownloadRows: number;\n\n errorMessage: React.ReactNode;\n id: string;\n}\nclass TableCsvExporter extends Component<\n TableCsvExporterProps,\n TableCsvExporterState\n> {\n static FILENAME_DATE_FORMAT = 'yyyy-MM-dd-HHmmss';\n\n static DOWNLOAD_STATUS = {\n INITIATING: 'INITIATING',\n DOWNLOADING: 'DOWNLOADING',\n FINISHED: 'FINISHED',\n CANCELED: 'CANCELED',\n };\n\n static DOWNLOAD_OPTIONS = {\n ALL_ROWS: 'ALL_ROWS',\n SELECTED_ROWS: 'SELECTED_ROWS',\n CUSTOMIZED_ROWS: 'CUSTOMIZED_ROWS',\n };\n\n static CUSTOMIZED_ROWS_OPTIONS = {\n FIRST: 'FIRST',\n LAST: 'LAST',\n };\n\n static DEFAULT_DOWNLOAD_ROWS = 100;\n\n static defaultProps = {\n onDownloadStart: (): void => undefined,\n isDownloading: false,\n tableDownloadStatus: '',\n tableDownloadProgress: 0,\n tableDownloadEstimatedTime: null,\n selectedRanges: [],\n };\n\n static getDateString(): string {\n return dh.i18n.DateTimeFormat.format(\n TableCsvExporter.FILENAME_DATE_FORMAT,\n new Date()\n );\n }\n\n constructor(props: TableCsvExporterProps) {\n super(props);\n\n this.handleDownloadClick = this.handleDownloadClick.bind(this);\n this.handleDownloadOptionChanged = this.handleDownloadOptionChanged.bind(\n this\n );\n this.handleCustomizedDownloadOptionChanged = this.handleCustomizedDownloadOptionChanged.bind(\n this\n );\n this.handleCustomizedDownloadRowsChanged = this.handleCustomizedDownloadRowsChanged.bind(\n this\n );\n\n const { name } = props;\n this.state = {\n fileName: `${name}-${TableCsvExporter.getDateString()}.csv`,\n\n downloadOption: TableCsvExporter.DOWNLOAD_OPTIONS.ALL_ROWS,\n customizedDownloadOption: TableCsvExporter.CUSTOMIZED_ROWS_OPTIONS.FIRST,\n customizedDownloadRows: TableCsvExporter.DEFAULT_DOWNLOAD_ROWS,\n\n errorMessage: null,\n id: shortid.generate(),\n };\n }\n\n getSnapshotRanges(): GridRange[] {\n const { model, selectedRanges } = this.props;\n const {\n downloadOption,\n customizedDownloadOption,\n customizedDownloadRows,\n } = this.state;\n const { rowCount, columnCount } = model;\n let snapshotRanges = [] as GridRange[];\n switch (downloadOption) {\n case TableCsvExporter.DOWNLOAD_OPTIONS.ALL_ROWS:\n snapshotRanges.push(new GridRange(0, 0, columnCount - 1, rowCount - 1));\n break;\n case TableCsvExporter.DOWNLOAD_OPTIONS.SELECTED_ROWS:\n snapshotRanges = selectedRanges\n .map(range => ({\n ...range,\n startColumn: 0,\n endColumn: columnCount - 1,\n }))\n .sort((rangeA, rangeB) => {\n if (rangeA.startRow != null && rangeB.startRow != null) {\n return rangeA.startRow - rangeB.startRow;\n }\n return 0;\n }) as GridRange[];\n break;\n case TableCsvExporter.DOWNLOAD_OPTIONS.CUSTOMIZED_ROWS:\n switch (customizedDownloadOption) {\n case TableCsvExporter.CUSTOMIZED_ROWS_OPTIONS.FIRST:\n snapshotRanges.push(\n new GridRange(\n 0,\n 0,\n columnCount - 1,\n Math.min(customizedDownloadRows - 1, rowCount - 1)\n )\n );\n break;\n case TableCsvExporter.CUSTOMIZED_ROWS_OPTIONS.LAST:\n snapshotRanges.push(\n new GridRange(\n 0,\n Math.max(0, rowCount - customizedDownloadRows),\n columnCount - 1,\n rowCount - 1\n )\n );\n break;\n default:\n break;\n }\n break;\n default:\n break;\n }\n return snapshotRanges;\n }\n\n getModelRanges(ranges: GridRange[]): GridRange[] {\n const { userColumnWidths, movedColumns } = this.props;\n const hiddenColumns = IrisGridUtils.getHiddenColumns(userColumnWidths);\n let modelRanges = GridUtils.getModelRanges(ranges, movedColumns);\n if (hiddenColumns.length > 0) {\n const subtractRanges = hiddenColumns.map(GridRange.makeColumn);\n modelRanges = GridRange.subtractRangesFromRanges(\n modelRanges,\n subtractRanges\n );\n }\n return modelRanges;\n }\n\n resetDownloadState(): void {\n this.setState({ errorMessage: null });\n }\n\n async handleDownloadClick(): Promise<void> {\n const {\n model,\n isDownloading,\n onDownloadStart,\n onDownload,\n onCancel,\n } = this.props;\n const { fileName } = this.state;\n\n if (isDownloading) {\n onCancel();\n return;\n }\n\n this.resetDownloadState();\n\n const snapshotRanges = this.getSnapshotRanges();\n const modelRanges = this.getModelRanges(snapshotRanges);\n if (this.validateOptionInput()) {\n onDownloadStart();\n try {\n const frozenTable = await model.export();\n const tableSubscription = frozenTable.setViewport(0, 0);\n await tableSubscription.getViewportData();\n onDownload(\n fileName,\n frozenTable,\n tableSubscription,\n snapshotRanges,\n modelRanges\n );\n } catch (error) {\n log.error('CSV download failed', error);\n\n this.setState({\n errorMessage: (\n <p>\n <FontAwesomeIcon icon={vsWarning} /> {`${error}`}\n </p>\n ),\n });\n onCancel();\n }\n }\n }\n\n handleDownloadOptionChanged(\n event: React.ChangeEvent<HTMLInputElement>\n ): void {\n this.setState({ downloadOption: event.target.value });\n }\n\n handleCustomizedDownloadOptionChanged(\n event: React.ChangeEvent<HTMLSelectElement>\n ): void {\n this.setState({ customizedDownloadOption: event.target.value });\n }\n\n handleCustomizedDownloadRowsChanged(\n event: React.ChangeEvent<HTMLInputElement>\n ): void {\n this.setState({ customizedDownloadRows: parseInt(event.target.value, 10) });\n }\n\n validateOptionInput(): boolean {\n const { selectedRanges } = this.props;\n const { downloadOption, customizedDownloadRows } = this.state;\n\n if (\n downloadOption === TableCsvExporter.DOWNLOAD_OPTIONS.SELECTED_ROWS &&\n selectedRanges.length === 0\n ) {\n this.setState({\n errorMessage: (\n <p>\n <FontAwesomeIcon icon={vsWarning} /> No rows selected. Please select\n some rows in the table.\n </p>\n ),\n });\n return false;\n }\n\n if (\n downloadOption === TableCsvExporter.DOWNLOAD_OPTIONS.CUSTOMIZED_ROWS &&\n customizedDownloadRows <= 0\n ) {\n this.setState({\n errorMessage: (\n <p>\n <FontAwesomeIcon icon={vsWarning} /> Number of rows to output must\n be greater than 0\n </p>\n ),\n });\n return false;\n }\n return true;\n }\n\n render(): ReactElement {\n const {\n model,\n isDownloading,\n tableDownloadProgress,\n tableDownloadEstimatedTime,\n selectedRanges,\n tableDownloadStatus,\n } = this.props;\n const {\n fileName,\n downloadOption,\n customizedDownloadOption,\n customizedDownloadRows,\n errorMessage,\n id,\n } = this.state;\n const { rowCount } = model;\n return (\n <div className=\"table-csv-exporter\">\n <div className=\"section-title\">Download Rows</div>\n <div className=\"form-group\">\n <RadioGroup\n onChange={this.handleDownloadOptionChanged}\n value={downloadOption}\n disabled={isDownloading}\n >\n <RadioItem\n value={TableCsvExporter.DOWNLOAD_OPTIONS.ALL_ROWS}\n data-testid=\"radio-csv-exporter-download-all\"\n >\n All Rows\n <span className=\"text-muted ml-2\">\n {`(${rowCount\n .toString()\n .replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '$1,')} rows)`}\n </span>\n </RadioItem>\n <RadioItem\n value={TableCsvExporter.DOWNLOAD_OPTIONS.SELECTED_ROWS}\n data-testid=\"radio-csv-exporter-only-selected\"\n >\n Only Selected Rows\n <span className=\"text-muted ml-2\">\n {selectedRanges.length > 0\n ? `(${GridRange.rowCount(selectedRanges)\n .toString()\n .replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '$1,')} rows)`\n : null}\n </span>\n </RadioItem>\n <RadioItem\n value={TableCsvExporter.DOWNLOAD_OPTIONS.CUSTOMIZED_ROWS}\n data-testid=\"radio-csv-exporter-customized-rows\"\n >\n <div\n className=\"radio-input-row\"\n role=\"presentation\"\n onClick={() => {\n this.setState({\n downloadOption:\n TableCsvExporter.DOWNLOAD_OPTIONS.CUSTOMIZED_ROWS,\n });\n }}\n >\n <select\n value={customizedDownloadOption}\n data-testid=\"select-csv-exporter-customized-rows\"\n className=\"custom-select\"\n disabled={isDownloading}\n onChange={this.handleCustomizedDownloadOptionChanged}\n >\n <option value=\"FIRST\">First</option>\n <option value=\"LAST\">Last</option>\n </select>\n <input\n type=\"number\"\n className=\"form-control\"\n id={`customizedRows-${id}`}\n data-testid=\"input-csv-exporter-customized-rows\"\n name={`customizedRows-${id}`}\n placeholder=\"100\"\n value={customizedDownloadRows}\n disabled={isDownloading}\n onChange={this.handleCustomizedDownloadRowsChanged}\n />\n <div>Rows</div>\n </div>\n </RadioItem>\n </RadioGroup>\n </div>\n <div className=\"form-group\">\n <label htmlFor={`customizedRows-${id}`}>File Name</label>\n <input\n type=\"text\"\n className=\"form-control\"\n id={`filename-${id}`}\n data-testid=\"input-csv-exporter-file-name\"\n name={`filename-${id}`}\n value={fileName}\n onChange={event => {\n this.setState({ fileName: event.target.value });\n }}\n disabled={isDownloading}\n />\n </div>\n <div className=\"section-footer flex-column\">\n {errorMessage != null && (\n <div className=\"error-message\">{errorMessage}</div>\n )}\n {tableDownloadStatus && (\n <div className=\"download-status\">\n {(tableDownloadStatus ===\n TableCsvExporter.DOWNLOAD_STATUS.DOWNLOADING ||\n tableDownloadStatus ===\n TableCsvExporter.DOWNLOAD_STATUS.INITIATING) && (\n <>\n {tableDownloadStatus ===\n TableCsvExporter.DOWNLOAD_STATUS.INITIATING && (\n <div className=\"text-muted\">Starting Download...</div>\n )}\n {tableDownloadStatus ===\n TableCsvExporter.DOWNLOAD_STATUS.DOWNLOADING && (\n <div className=\"text-muted d-flex justify-content-between\">\n <span>\n {tableDownloadEstimatedTime ||\n tableDownloadEstimatedTime === 0\n ? `Estimated time: ${TimeUtils.formatElapsedTime(\n tableDownloadEstimatedTime\n )}`\n : null}\n </span>\n <span>{`${tableDownloadProgress}%`}</span>\n </div>\n )}\n </>\n )}\n {tableDownloadStatus ===\n TableCsvExporter.DOWNLOAD_STATUS.FINISHED && (\n <div className=\"text-muted text-right\">Download Completed</div>\n )}\n {tableDownloadStatus ===\n TableCsvExporter.DOWNLOAD_STATUS.CANCELED && (\n <div className=\"text-muted\">Download Canceled</div>\n )}\n\n {(tableDownloadStatus ===\n TableCsvExporter.DOWNLOAD_STATUS.DOWNLOADING ||\n tableDownloadStatus ===\n TableCsvExporter.DOWNLOAD_STATUS.INITIATING) && (\n <div className=\"progress\">\n <div\n className=\"progress-bar progress-bar-striped progress-bar-animated\"\n style={{ width: `${tableDownloadProgress}%` }}\n />\n </div>\n )}\n {tableDownloadStatus ===\n TableCsvExporter.DOWNLOAD_STATUS.FINISHED && (\n <div className=\"progress\">\n <div\n className=\"progress-bar bg-success\"\n style={{ width: `${tableDownloadProgress}%` }}\n />\n </div>\n )}\n </div>\n )}\n <Button\n kind=\"primary\"\n data-testid=\"btn-csv-exporter-download\"\n className={ClassNames('btn-downloading', {\n 'btn-spinner btn-cancelable': isDownloading,\n })}\n onClick={this.handleDownloadClick}\n >\n {isDownloading && (\n <span>\n <LoadingSpinner />\n <span className=\"btn-normal-content\">Downloading</span>\n <span className=\"btn-hover-content\">Cancel</span>\n </span>\n )}\n {!isDownloading && 'Download'}\n </Button>\n </div>\n </div>\n );\n }\n}\n\nexport default TableCsvExporter;\n"],"mappings":";;;;;;;;;;AAAA,OAAOA,KAAP,IAAgBC,SAAhB,QAA+C,OAA/C;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,SAASC,eAAT,QAAgC,gCAAhC;AACA,SACEC,MADF,EAEEC,cAFF,EAGEC,UAHF,EAIEC,SAJF,QAKO,uBALP;AAMA,SACEC,SADF,EAEEC,SAFF,QAKO,iBALP;AAMA,SAASC,SAAT,QAA0B,kBAA1B;AACA,OAAOC,EAAP,MAAqD,uBAArD;AACA,SAASC,SAAT,QAA0B,kBAA1B;AACA,OAAOC,OAAP,MAAoB,SAApB;;AAEA,OAAOC,GAAP,MAAgB,gBAAhB;OAEOC,a;AAEP,IAAMC,GAAG,GAAGF,GAAG,CAACG,MAAJ,CAAW,kBAAX,CAAZ;;AAgCA,MAAMC,gBAAN,SAA+BjB,SAA/B,CAGE;EAgCoB,OAAbkB,aAAa,GAAW;IAC7B,OAAOR,EAAE,CAACS,IAAH,CAAQC,cAAR,CAAuBC,MAAvB,CACLJ,gBAAgB,CAACK,oBADZ,EAEL,IAAIC,IAAJ,EAFK,CAAP;EAID;;EAEDC,WAAW,CAACC,KAAD,EAA+B;IACxC,MAAMA,KAAN;IAEA,KAAKC,mBAAL,GAA2B,KAAKA,mBAAL,CAAyBC,IAAzB,CAA8B,IAA9B,CAA3B;IACA,KAAKC,2BAAL,GAAmC,KAAKA,2BAAL,CAAiCD,IAAjC,CACjC,IADiC,CAAnC;IAGA,KAAKE,qCAAL,GAA6C,KAAKA,qCAAL,CAA2CF,IAA3C,CAC3C,IAD2C,CAA7C;IAGA,KAAKG,mCAAL,GAA2C,KAAKA,mCAAL,CAAyCH,IAAzC,CACzC,IADyC,CAA3C;IAIA,IAAM;MAAEI;IAAF,IAAWN,KAAjB;IACA,KAAKO,KAAL,GAAa;MACXC,QAAQ,YAAKF,IAAL,cAAad,gBAAgB,CAACC,aAAjB,EAAb,SADG;MAGXgB,cAAc,EAAEjB,gBAAgB,CAACkB,gBAAjB,CAAkCC,QAHvC;MAIXC,wBAAwB,EAAEpB,gBAAgB,CAACqB,uBAAjB,CAAyCC,KAJxD;MAKXC,sBAAsB,EAAEvB,gBAAgB,CAACwB,qBAL9B;MAOXC,YAAY,EAAE,IAPH;MAQXC,EAAE,EAAE/B,OAAO,CAACgC,QAAR;IARO,CAAb;EAUD;;EAEDC,iBAAiB,GAAgB;IAC/B,IAAM;MAAEC,KAAF;MAASC;IAAT,IAA4B,KAAKtB,KAAvC;IACA,IAAM;MACJS,cADI;MAEJG,wBAFI;MAGJG;IAHI,IAIF,KAAKR,KAJT;IAKA,IAAM;MAAEgB,QAAF;MAAYC;IAAZ,IAA4BH,KAAlC;IACA,IAAII,cAAc,GAAG,EAArB;;IACA,QAAQhB,cAAR;MACE,KAAKjB,gBAAgB,CAACkB,gBAAjB,CAAkCC,QAAvC;QACEc,cAAc,CAACC,IAAf,CAAoB,IAAI5C,SAAJ,CAAc,CAAd,EAAiB,CAAjB,EAAoB0C,WAAW,GAAG,CAAlC,EAAqCD,QAAQ,GAAG,CAAhD,CAApB;QACA;;MACF,KAAK/B,gBAAgB,CAACkB,gBAAjB,CAAkCiB,aAAvC;QACEF,cAAc,GAAGH,cAAc,CAC5BM,GADc,CACVC,KAAK,oCACLA,KADK;UAERC,WAAW,EAAE,CAFL;UAGRC,SAAS,EAAEP,WAAW,GAAG;QAHjB,EADK,EAMdQ,IANc,CAMT,CAACC,MAAD,EAASC,MAAT,KAAoB;UACxB,IAAID,MAAM,CAACE,QAAP,IAAmB,IAAnB,IAA2BD,MAAM,CAACC,QAAP,IAAmB,IAAlD,EAAwD;YACtD,OAAOF,MAAM,CAACE,QAAP,GAAkBD,MAAM,CAACC,QAAhC;UACD;;UACD,OAAO,CAAP;QACD,CAXc,CAAjB;QAYA;;MACF,KAAK3C,gBAAgB,CAACkB,gBAAjB,CAAkC0B,eAAvC;QACE,QAAQxB,wBAAR;UACE,KAAKpB,gBAAgB,CAACqB,uBAAjB,CAAyCC,KAA9C;YACEW,cAAc,CAACC,IAAf,CACE,IAAI5C,SAAJ,CACE,CADF,EAEE,CAFF,EAGE0C,WAAW,GAAG,CAHhB,EAIEa,IAAI,CAACC,GAAL,CAASvB,sBAAsB,GAAG,CAAlC,EAAqCQ,QAAQ,GAAG,CAAhD,CAJF,CADF;YAQA;;UACF,KAAK/B,gBAAgB,CAACqB,uBAAjB,CAAyC0B,IAA9C;YACEd,cAAc,CAACC,IAAf,CACE,IAAI5C,SAAJ,CACE,CADF,EAEEuD,IAAI,CAACG,GAAL,CAAS,CAAT,EAAYjB,QAAQ,GAAGR,sBAAvB,CAFF,EAGES,WAAW,GAAG,CAHhB,EAIED,QAAQ,GAAG,CAJb,CADF;YAQA;;UACF;YACE;QAtBJ;;QAwBA;;MACF;QACE;IA7CJ;;IA+CA,OAAOE,cAAP;EACD;;EAEDgB,cAAc,CAACC,MAAD,EAAmC;IAC/C,IAAM;MAAEC,gBAAF;MAAoBC;IAApB,IAAqC,KAAK5C,KAAhD;IACA,IAAM6C,aAAa,GAAGxD,aAAa,CAACyD,gBAAd,CAA+BH,gBAA/B,CAAtB;IACA,IAAII,WAAW,GAAGhE,SAAS,CAAC0D,cAAV,CAAyBC,MAAzB,EAAiCE,YAAjC,CAAlB;;IACA,IAAIC,aAAa,CAACG,MAAd,GAAuB,CAA3B,EAA8B;MAC5B,IAAMC,cAAc,GAAGJ,aAAa,CAACjB,GAAd,CAAkB9C,SAAS,CAACoE,UAA5B,CAAvB;MACAH,WAAW,GAAGjE,SAAS,CAACqE,wBAAV,CACZJ,WADY,EAEZE,cAFY,CAAd;IAID;;IACD,OAAOF,WAAP;EACD;;EAEDK,kBAAkB,GAAS;IACzB,KAAKC,QAAL,CAAc;MAAEpC,YAAY,EAAE;IAAhB,CAAd;EACD;;EAEKhB,mBAAmB,GAAkB;IAAA;;IAAA;MACzC,IAAM;QACJoB,KADI;QAEJiC,aAFI;QAGJC,eAHI;QAIJC,UAJI;QAKJC;MALI,IAMF,KAAI,CAACzD,KANT;MAOA,IAAM;QAAEQ;MAAF,IAAe,KAAI,CAACD,KAA1B;;MAEA,IAAI+C,aAAJ,EAAmB;QACjBG,QAAQ;QACR;MACD;;MAED,KAAI,CAACL,kBAAL;;MAEA,IAAM3B,cAAc,GAAG,KAAI,CAACL,iBAAL,EAAvB;;MACA,IAAM2B,WAAW,GAAG,KAAI,CAACN,cAAL,CAAoBhB,cAApB,CAApB;;MACA,IAAI,KAAI,CAACiC,mBAAL,EAAJ,EAAgC;QAC9BH,eAAe;;QACf,IAAI;UACF,IAAMI,YAAW,SAAStC,KAAK,CAACuC,MAAN,EAA1B;;UACA,IAAMC,kBAAiB,GAAGF,YAAW,CAACG,WAAZ,CAAwB,CAAxB,EAA2B,CAA3B,CAA1B;;UACA,MAAMD,kBAAiB,CAACE,eAAlB,EAAN;UACAP,UAAU,CACRhD,QADQ,EAERmD,YAFQ,EAGRE,kBAHQ,EAIRpC,cAJQ,EAKRsB,WALQ,CAAV;QAOD,CAXD,CAWE,OAAOiB,KAAP,EAAc;UACd1E,GAAG,CAAC0E,KAAJ,CAAU,qBAAV,EAAiCA,KAAjC;;UAEA,KAAI,CAACX,QAAL,CAAc;YACZpC,YAAY,eACV,4CACE,oBAAC,eAAD;cAAiB,IAAI,EAAEjC;YAAvB,EADF,iBAC2CgF,KAD3C;UAFU,CAAd;;UAOAP,QAAQ;QACT;MACF;IA5CwC;EA6C1C;;EAEDtD,2BAA2B,CACzB8D,KADyB,EAEnB;IACN,KAAKZ,QAAL,CAAc;MAAE5C,cAAc,EAAEwD,KAAK,CAACC,MAAN,CAAaC;IAA/B,CAAd;EACD;;EAED/D,qCAAqC,CACnC6D,KADmC,EAE7B;IACN,KAAKZ,QAAL,CAAc;MAAEzC,wBAAwB,EAAEqD,KAAK,CAACC,MAAN,CAAaC;IAAzC,CAAd;EACD;;EAED9D,mCAAmC,CACjC4D,KADiC,EAE3B;IACN,KAAKZ,QAAL,CAAc;MAAEtC,sBAAsB,EAAEqD,QAAQ,CAACH,KAAK,CAACC,MAAN,CAAaC,KAAd,EAAqB,EAArB;IAAlC,CAAd;EACD;;EAEDT,mBAAmB,GAAY;IAC7B,IAAM;MAAEpC;IAAF,IAAqB,KAAKtB,KAAhC;IACA,IAAM;MAAES,cAAF;MAAkBM;IAAlB,IAA6C,KAAKR,KAAxD;;IAEA,IACEE,cAAc,KAAKjB,gBAAgB,CAACkB,gBAAjB,CAAkCiB,aAArD,IACAL,cAAc,CAAC0B,MAAf,KAA0B,CAF5B,EAGE;MACA,KAAKK,QAAL,CAAc;QACZpC,YAAY,eACV,4CACE,oBAAC,eAAD;UAAiB,IAAI,EAAEjC;QAAvB,EADF;MAFU,CAAd;MAQA,OAAO,KAAP;IACD;;IAED,IACEyB,cAAc,KAAKjB,gBAAgB,CAACkB,gBAAjB,CAAkC0B,eAArD,IACArB,sBAAsB,IAAI,CAF5B,EAGE;MACA,KAAKsC,QAAL,CAAc;QACZpC,YAAY,eACV,4CACE,oBAAC,eAAD;UAAiB,IAAI,EAAEjC;QAAvB,EADF;MAFU,CAAd;MAQA,OAAO,KAAP;IACD;;IACD,OAAO,IAAP;EACD;;EAEDqF,MAAM,GAAiB;IACrB,IAAM;MACJhD,KADI;MAEJiC,aAFI;MAGJgB,qBAHI;MAIJC,0BAJI;MAKJjD,cALI;MAMJkD;IANI,IAOF,KAAKxE,KAPT;IAQA,IAAM;MACJQ,QADI;MAEJC,cAFI;MAGJG,wBAHI;MAIJG,sBAJI;MAKJE,YALI;MAMJC;IANI,IAOF,KAAKX,KAPT;IAQA,IAAM;MAAEgB;IAAF,IAAeF,KAArB;IACA,oBACE;MAAK,SAAS,EAAC;IAAf,gBACE;MAAK,SAAS,EAAC;IAAf,mBADF,eAEE;MAAK,SAAS,EAAC;IAAf,gBACE,oBAAC,UAAD;MACE,QAAQ,EAAE,KAAKlB,2BADjB;MAEE,KAAK,EAAEM,cAFT;MAGE,QAAQ,EAAE6C;IAHZ,gBAKE,oBAAC,SAAD;MACE,KAAK,EAAE9D,gBAAgB,CAACkB,gBAAjB,CAAkCC,QAD3C;MAEE,eAAY;IAFd,4BAKE;MAAM,SAAS,EAAC;IAAhB,cACOY,QAAQ,CACVkD,QADE,GAEFC,OAFE,CAEM,yBAFN,EAEiC,KAFjC,CADP,YALF,CALF,eAgBE,oBAAC,SAAD;MACE,KAAK,EAAElF,gBAAgB,CAACkB,gBAAjB,CAAkCiB,aAD3C;MAEE,eAAY;IAFd,sCAKE;MAAM,SAAS,EAAC;IAAhB,GACGL,cAAc,CAAC0B,MAAf,GAAwB,CAAxB,cACOlE,SAAS,CAACyC,QAAV,CAAmBD,cAAnB,EACDmD,QADC,GAEDC,OAFC,CAEO,yBAFP,EAEkC,KAFlC,CADP,cAIG,IALN,CALF,CAhBF,eA6BE,oBAAC,SAAD;MACE,KAAK,EAAElF,gBAAgB,CAACkB,gBAAjB,CAAkC0B,eAD3C;MAEE,eAAY;IAFd,gBAIE;MACE,SAAS,EAAC,iBADZ;MAEE,IAAI,EAAC,cAFP;MAGE,OAAO,EAAE,MAAM;QACb,KAAKiB,QAAL,CAAc;UACZ5C,cAAc,EACZjB,gBAAgB,CAACkB,gBAAjB,CAAkC0B;QAFxB,CAAd;MAID;IARH,gBAUE;MACE,KAAK,EAAExB,wBADT;MAEE,eAAY,qCAFd;MAGE,SAAS,EAAC,eAHZ;MAIE,QAAQ,EAAE0C,aAJZ;MAKE,QAAQ,EAAE,KAAKlD;IALjB,gBAOE;MAAQ,KAAK,EAAC;IAAd,WAPF,eAQE;MAAQ,KAAK,EAAC;IAAd,UARF,CAVF,eAoBE;MACE,IAAI,EAAC,QADP;MAEE,SAAS,EAAC,cAFZ;MAGE,EAAE,2BAAoBc,EAApB,CAHJ;MAIE,eAAY,oCAJd;MAKE,IAAI,2BAAoBA,EAApB,CALN;MAME,WAAW,EAAC,KANd;MAOE,KAAK,EAAEH,sBAPT;MAQE,QAAQ,EAAEuC,aARZ;MASE,QAAQ,EAAE,KAAKjD;IATjB,EApBF,eA+BE,wCA/BF,CAJF,CA7BF,CADF,CAFF,eAwEE;MAAK,SAAS,EAAC;IAAf,gBACE;MAAO,OAAO,2BAAoBa,EAApB;IAAd,eADF,eAEE;MACE,IAAI,EAAC,MADP;MAEE,SAAS,EAAC,cAFZ;MAGE,EAAE,qBAAcA,EAAd,CAHJ;MAIE,eAAY,8BAJd;MAKE,IAAI,qBAAcA,EAAd,CALN;MAME,KAAK,EAAEV,QANT;MAOE,QAAQ,EAAEyD,KAAK,IAAI;QACjB,KAAKZ,QAAL,CAAc;UAAE7C,QAAQ,EAAEyD,KAAK,CAACC,MAAN,CAAaC;QAAzB,CAAd;MACD,CATH;MAUE,QAAQ,EAAEb;IAVZ,EAFF,CAxEF,eAuFE;MAAK,SAAS,EAAC;IAAf,GACGrC,YAAY,IAAI,IAAhB,iBACC;MAAK,SAAS,EAAC;IAAf,GAAgCA,YAAhC,CAFJ,EAIGuD,mBAAmB,iBAClB;MAAK,SAAS,EAAC;IAAf,GACG,CAACA,mBAAmB,KACnBhF,gBAAgB,CAACmF,eAAjB,CAAiCC,WADjC,IAEAJ,mBAAmB,KACjBhF,gBAAgB,CAACmF,eAAjB,CAAiCE,UAHpC,kBAIC,0CACGL,mBAAmB,KAClBhF,gBAAgB,CAACmF,eAAjB,CAAiCE,UADlC,iBAEC;MAAK,SAAS,EAAC;IAAf,0BAHJ,EAKGL,mBAAmB,KAClBhF,gBAAgB,CAACmF,eAAjB,CAAiCC,WADlC,iBAEC;MAAK,SAAS,EAAC;IAAf,gBACE,kCACGL,0BAA0B,IAC3BA,0BAA0B,KAAK,CAD9B,6BAEsBrF,SAAS,CAAC4F,iBAAV,CACjBP,0BADiB,CAFtB,IAKG,IANN,CADF,eASE,4CAAUD,qBAAV,OATF,CAPJ,CALJ,EA0BGE,mBAAmB,KAClBhF,gBAAgB,CAACmF,eAAjB,CAAiCI,QADlC,iBAEC;MAAK,SAAS,EAAC;IAAf,wBA5BJ,EA8BGP,mBAAmB,KAClBhF,gBAAgB,CAACmF,eAAjB,CAAiCK,QADlC,iBAEC;MAAK,SAAS,EAAC;IAAf,uBAhCJ,EAmCG,CAACR,mBAAmB,KACnBhF,gBAAgB,CAACmF,eAAjB,CAAiCC,WADjC,IAEAJ,mBAAmB,KACjBhF,gBAAgB,CAACmF,eAAjB,CAAiCE,UAHpC,kBAIC;MAAK,SAAS,EAAC;IAAf,gBACE;MACE,SAAS,EAAC,yDADZ;MAEE,KAAK,EAAE;QAAEI,KAAK,YAAKX,qBAAL;MAAP;IAFT,EADF,CAvCJ,EA8CGE,mBAAmB,KAClBhF,gBAAgB,CAACmF,eAAjB,CAAiCI,QADlC,iBAEC;MAAK,SAAS,EAAC;IAAf,gBACE;MACE,SAAS,EAAC,yBADZ;MAEE,KAAK,EAAE;QAAEE,KAAK,YAAKX,qBAAL;MAAP;IAFT,EADF,CAhDJ,CALJ,eA8DE,oBAAC,MAAD;MACE,IAAI,EAAC,SADP;MAEE,eAAY,2BAFd;MAGE,SAAS,EAAE9F,UAAU,CAAC,iBAAD,EAAoB;QACvC,8BAA8B8E;MADS,CAApB,CAHvB;MAME,OAAO,EAAE,KAAKrD;IANhB,GAQGqD,aAAa,iBACZ,+CACE,oBAAC,cAAD,OADF,eAEE;MAAM,SAAS,EAAC;IAAhB,iBAFF,eAGE;MAAM,SAAS,EAAC;IAAhB,YAHF,CATJ,EAeG,CAACA,aAAD,IAAkB,UAfrB,CA9DF,CAvFF,CADF;EA0KD;;AAhbD;;gBAHI9D,gB,0BAI0B,mB;;gBAJ1BA,gB,qBAMqB;EACvBqF,UAAU,EAAE,YADW;EAEvBD,WAAW,EAAE,aAFU;EAGvBG,QAAQ,EAAE,UAHa;EAIvBC,QAAQ,EAAE;AAJa,C;;gBANrBxF,gB,sBAasB;EACxBmB,QAAQ,EAAE,UADc;EAExBgB,aAAa,EAAE,eAFS;EAGxBS,eAAe,EAAE;AAHO,C;;gBAbtB5C,gB,6BAmB6B;EAC/BsB,KAAK,EAAE,OADwB;EAE/ByB,IAAI,EAAE;AAFyB,C;;gBAnB7B/C,gB,2BAwB2B,G;;gBAxB3BA,gB,kBA0BkB;EACpB+D,eAAe,EAAE,MAAY2B,SADT;EAEpB5B,aAAa,EAAE,KAFK;EAGpBkB,mBAAmB,EAAE,EAHD;EAIpBF,qBAAqB,EAAE,CAJH;EAKpBC,0BAA0B,EAAE,IALR;EAMpBjD,cAAc,EAAE;AANI,C;;AA4ZxB,eAAe9B,gBAAf"}
1
+ {"version":3,"file":"TableCsvExporter.js","names":["React","Component","ClassNames","FontAwesomeIcon","Button","Checkbox","LoadingSpinner","RadioGroup","RadioItem","GridRange","GridUtils","vsWarning","dh","TimeUtils","shortid","Log","IrisGridUtils","log","module","TableCsvExporter","getDateString","i18n","DateTimeFormat","format","FILENAME_DATE_FORMAT","Date","constructor","props","handleDownloadClick","bind","handleDownloadRowOptionChanged","handleCustomizedDownloadRowOptionChanged","handleCustomizedDownloadRowsChanged","handleIncludeColumnHeadersChanged","handleIncludeHiddenColumnsChanged","handleUseUnformattedValuesChanged","name","state","fileName","downloadRowOption","DOWNLOAD_ROW_OPTIONS","ALL_ROWS","customizedDownloadRowOption","CUSTOMIZED_ROWS_OPTIONS","FIRST","customizedDownloadRows","DEFAULT_DOWNLOAD_ROWS","includeColumnHeaders","includeHiddenColumns","useUnformattedValues","errorMessage","id","generate","getSnapshotRanges","model","selectedRanges","rowCount","columnCount","snapshotRanges","push","SELECTED_ROWS","map","range","startColumn","endColumn","sort","rangeA","rangeB","startRow","CUSTOMIZED_ROWS","Math","min","LAST","max","getModelRanges","ranges","userColumnWidths","movedColumns","hiddenColumns","getHiddenColumns","modelRanges","length","subtractRanges","makeColumn","subtractRangesFromRanges","resetDownloadState","setState","isDownloading","onDownloadStart","onDownload","onCancel","validateOptionInput","frozenTable","export","tableSubscription","setViewport","getViewportData","error","event","target","value","parseInt","render","tableDownloadProgress","tableDownloadEstimatedTime","tableDownloadStatus","toString","replace","DOWNLOAD_STATUS","DOWNLOADING","INITIATING","formatElapsedTime","FINISHED","CANCELED","width","undefined"],"sources":["../../src/sidebar/TableCsvExporter.tsx"],"sourcesContent":["import React, { Component, ReactElement } from 'react';\nimport ClassNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n Button,\n Checkbox,\n LoadingSpinner,\n RadioGroup,\n RadioItem,\n} from '@deephaven/components';\nimport {\n GridRange,\n GridUtils,\n ModelSizeMap,\n MoveOperation,\n} from '@deephaven/grid';\nimport { vsWarning } from '@deephaven/icons';\nimport dh, { Table, TableViewportSubscription } from '@deephaven/jsapi-shim';\nimport { TimeUtils } from '@deephaven/utils';\nimport shortid from 'shortid';\nimport './TableCsvExporter.scss';\nimport Log from '@deephaven/log';\nimport IrisGridModel from '../IrisGridModel';\nimport IrisGridUtils from '../IrisGridUtils';\n\nconst log = Log.module('TableCsvExporter');\ninterface TableCsvExporterProps {\n model: IrisGridModel;\n name: string;\n userColumnWidths: ModelSizeMap;\n movedColumns: MoveOperation[];\n isDownloading: boolean;\n tableDownloadStatus: string;\n tableDownloadProgress: number;\n tableDownloadEstimatedTime: number;\n onDownloadStart: () => void;\n onDownload: (\n fileName: string,\n frozenTable: Table,\n tableSubscription: TableViewportSubscription,\n snapshotRanges: GridRange[],\n modelRanges: GridRange[],\n includeColumnHeaders: boolean,\n useUnformattedValues: boolean\n ) => void;\n onCancel: () => void;\n selectedRanges: GridRange[];\n}\n\ninterface TableCsvExporterState {\n fileName: string;\n\n downloadRowOption: string;\n customizedDownloadRowOption: string;\n customizedDownloadRows: number;\n\n includeColumnHeaders: boolean;\n includeHiddenColumns: boolean;\n useUnformattedValues: boolean;\n\n errorMessage: React.ReactNode;\n id: string;\n}\nclass TableCsvExporter extends Component<\n TableCsvExporterProps,\n TableCsvExporterState\n> {\n static FILENAME_DATE_FORMAT = 'yyyy-MM-dd-HHmmss';\n\n static DOWNLOAD_STATUS = {\n INITIATING: 'INITIATING',\n DOWNLOADING: 'DOWNLOADING',\n FINISHED: 'FINISHED',\n CANCELED: 'CANCELED',\n };\n\n static DOWNLOAD_ROW_OPTIONS = {\n ALL_ROWS: 'ALL_ROWS',\n SELECTED_ROWS: 'SELECTED_ROWS',\n CUSTOMIZED_ROWS: 'CUSTOMIZED_ROWS',\n };\n\n static CUSTOMIZED_ROWS_OPTIONS = {\n FIRST: 'FIRST',\n LAST: 'LAST',\n };\n\n static DEFAULT_DOWNLOAD_ROWS = 100;\n\n static defaultProps = {\n onDownloadStart: (): void => undefined,\n isDownloading: false,\n tableDownloadStatus: '',\n tableDownloadProgress: 0,\n tableDownloadEstimatedTime: null,\n selectedRanges: [],\n };\n\n static getDateString(): string {\n return dh.i18n.DateTimeFormat.format(\n TableCsvExporter.FILENAME_DATE_FORMAT,\n new Date()\n );\n }\n\n constructor(props: TableCsvExporterProps) {\n super(props);\n\n this.handleDownloadClick = this.handleDownloadClick.bind(this);\n this.handleDownloadRowOptionChanged = this.handleDownloadRowOptionChanged.bind(\n this\n );\n this.handleCustomizedDownloadRowOptionChanged = this.handleCustomizedDownloadRowOptionChanged.bind(\n this\n );\n this.handleCustomizedDownloadRowsChanged = this.handleCustomizedDownloadRowsChanged.bind(\n this\n );\n this.handleIncludeColumnHeadersChanged = this.handleIncludeColumnHeadersChanged.bind(\n this\n );\n this.handleIncludeHiddenColumnsChanged = this.handleIncludeHiddenColumnsChanged.bind(\n this\n );\n this.handleUseUnformattedValuesChanged = this.handleUseUnformattedValuesChanged.bind(\n this\n );\n\n const { name } = props;\n this.state = {\n fileName: `${name}-${TableCsvExporter.getDateString()}.csv`,\n\n downloadRowOption: TableCsvExporter.DOWNLOAD_ROW_OPTIONS.ALL_ROWS,\n customizedDownloadRowOption:\n TableCsvExporter.CUSTOMIZED_ROWS_OPTIONS.FIRST,\n customizedDownloadRows: TableCsvExporter.DEFAULT_DOWNLOAD_ROWS,\n\n includeColumnHeaders: true,\n includeHiddenColumns: false,\n useUnformattedValues: false,\n\n errorMessage: null,\n id: shortid.generate(),\n };\n }\n\n getSnapshotRanges(): GridRange[] {\n const { model, selectedRanges } = this.props;\n const {\n downloadRowOption,\n customizedDownloadRowOption,\n customizedDownloadRows,\n } = this.state;\n const { rowCount, columnCount } = model;\n let snapshotRanges = [] as GridRange[];\n switch (downloadRowOption) {\n case TableCsvExporter.DOWNLOAD_ROW_OPTIONS.ALL_ROWS:\n snapshotRanges.push(new GridRange(0, 0, columnCount - 1, rowCount - 1));\n break;\n case TableCsvExporter.DOWNLOAD_ROW_OPTIONS.SELECTED_ROWS:\n snapshotRanges = selectedRanges\n .map(range => ({\n ...range,\n startColumn: 0,\n endColumn: columnCount - 1,\n }))\n .sort((rangeA, rangeB) => {\n if (rangeA.startRow != null && rangeB.startRow != null) {\n return rangeA.startRow - rangeB.startRow;\n }\n return 0;\n }) as GridRange[];\n break;\n case TableCsvExporter.DOWNLOAD_ROW_OPTIONS.CUSTOMIZED_ROWS:\n switch (customizedDownloadRowOption) {\n case TableCsvExporter.CUSTOMIZED_ROWS_OPTIONS.FIRST:\n snapshotRanges.push(\n new GridRange(\n 0,\n 0,\n columnCount - 1,\n Math.min(customizedDownloadRows - 1, rowCount - 1)\n )\n );\n break;\n case TableCsvExporter.CUSTOMIZED_ROWS_OPTIONS.LAST:\n snapshotRanges.push(\n new GridRange(\n 0,\n Math.max(0, rowCount - customizedDownloadRows),\n columnCount - 1,\n rowCount - 1\n )\n );\n break;\n default:\n break;\n }\n break;\n default:\n break;\n }\n return snapshotRanges;\n }\n\n getModelRanges(ranges: GridRange[]): GridRange[] {\n const { userColumnWidths, movedColumns } = this.props;\n const { includeHiddenColumns } = this.state;\n const hiddenColumns = IrisGridUtils.getHiddenColumns(userColumnWidths);\n let modelRanges = GridUtils.getModelRanges(ranges, movedColumns);\n if (!includeHiddenColumns && hiddenColumns.length > 0) {\n const subtractRanges = hiddenColumns.map(GridRange.makeColumn);\n modelRanges = GridRange.subtractRangesFromRanges(\n modelRanges,\n subtractRanges\n );\n }\n return modelRanges;\n }\n\n resetDownloadState(): void {\n this.setState({ errorMessage: null });\n }\n\n async handleDownloadClick(): Promise<void> {\n const {\n model,\n isDownloading,\n onDownloadStart,\n onDownload,\n onCancel,\n } = this.props;\n const { fileName, includeColumnHeaders, useUnformattedValues } = this.state;\n\n if (isDownloading) {\n onCancel();\n return;\n }\n\n this.resetDownloadState();\n\n const snapshotRanges = this.getSnapshotRanges();\n const modelRanges = this.getModelRanges(snapshotRanges);\n if (this.validateOptionInput()) {\n onDownloadStart();\n try {\n const frozenTable = await model.export();\n const tableSubscription = frozenTable.setViewport(0, 0);\n await tableSubscription.getViewportData();\n onDownload(\n fileName,\n frozenTable,\n tableSubscription,\n snapshotRanges,\n modelRanges,\n includeColumnHeaders,\n useUnformattedValues\n );\n } catch (error) {\n log.error('CSV download failed', error);\n\n this.setState({\n errorMessage: (\n <p>\n <FontAwesomeIcon icon={vsWarning} /> {`${error}`}\n </p>\n ),\n });\n onCancel();\n }\n }\n }\n\n handleDownloadRowOptionChanged(\n event: React.ChangeEvent<HTMLInputElement>\n ): void {\n this.setState({ downloadRowOption: event.target.value });\n }\n\n handleCustomizedDownloadRowOptionChanged(\n event: React.ChangeEvent<HTMLSelectElement>\n ): void {\n this.setState({ customizedDownloadRowOption: event.target.value });\n }\n\n handleCustomizedDownloadRowsChanged(\n event: React.ChangeEvent<HTMLInputElement>\n ): void {\n this.setState({ customizedDownloadRows: parseInt(event.target.value, 10) });\n }\n\n handleIncludeColumnHeadersChanged(): void {\n this.setState(({ includeColumnHeaders }) => ({\n includeColumnHeaders: !includeColumnHeaders,\n }));\n }\n\n handleIncludeHiddenColumnsChanged(): void {\n this.setState(({ includeHiddenColumns }) => ({\n includeHiddenColumns: !includeHiddenColumns,\n }));\n }\n\n handleUseUnformattedValuesChanged(): void {\n this.setState(({ useUnformattedValues }) => ({\n useUnformattedValues: !useUnformattedValues,\n }));\n }\n\n validateOptionInput(): boolean {\n const { selectedRanges } = this.props;\n const { downloadRowOption, customizedDownloadRows } = this.state;\n\n if (\n downloadRowOption ===\n TableCsvExporter.DOWNLOAD_ROW_OPTIONS.SELECTED_ROWS &&\n selectedRanges.length === 0\n ) {\n this.setState({\n errorMessage: (\n <p>\n <FontAwesomeIcon icon={vsWarning} /> No rows selected. Please select\n some rows in the table.\n </p>\n ),\n });\n return false;\n }\n\n if (\n downloadRowOption ===\n TableCsvExporter.DOWNLOAD_ROW_OPTIONS.CUSTOMIZED_ROWS &&\n customizedDownloadRows <= 0\n ) {\n this.setState({\n errorMessage: (\n <p>\n <FontAwesomeIcon icon={vsWarning} /> Number of rows to output must\n be greater than 0\n </p>\n ),\n });\n return false;\n }\n return true;\n }\n\n render(): ReactElement {\n const {\n model,\n isDownloading,\n tableDownloadProgress,\n tableDownloadEstimatedTime,\n selectedRanges,\n tableDownloadStatus,\n } = this.props;\n const {\n fileName,\n downloadRowOption,\n customizedDownloadRowOption,\n customizedDownloadRows,\n includeColumnHeaders,\n includeHiddenColumns,\n useUnformattedValues,\n errorMessage,\n id,\n } = this.state;\n const { rowCount } = model;\n return (\n <div className=\"table-csv-exporter\">\n <div className=\"section-title\">Download Rows</div>\n <div className=\"form-group\">\n <RadioGroup\n onChange={this.handleDownloadRowOptionChanged}\n value={downloadRowOption}\n disabled={isDownloading}\n >\n <RadioItem\n value={TableCsvExporter.DOWNLOAD_ROW_OPTIONS.ALL_ROWS}\n data-testid=\"radio-csv-exporter-download-all\"\n >\n All Rows\n <span className=\"text-muted ml-2\">\n {`(${rowCount\n .toString()\n .replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '$1,')} rows)`}\n </span>\n </RadioItem>\n <RadioItem\n value={TableCsvExporter.DOWNLOAD_ROW_OPTIONS.SELECTED_ROWS}\n data-testid=\"radio-csv-exporter-only-selected\"\n >\n Only Selected Rows\n <span className=\"text-muted ml-2\">\n {selectedRanges.length > 0\n ? `(${GridRange.rowCount(selectedRanges)\n .toString()\n .replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '$1,')} rows)`\n : null}\n </span>\n </RadioItem>\n <RadioItem\n value={TableCsvExporter.DOWNLOAD_ROW_OPTIONS.CUSTOMIZED_ROWS}\n data-testid=\"radio-csv-exporter-customized-rows\"\n >\n <div\n className=\"radio-input-row\"\n role=\"presentation\"\n onClick={() => {\n this.setState({\n downloadRowOption:\n TableCsvExporter.DOWNLOAD_ROW_OPTIONS.CUSTOMIZED_ROWS,\n });\n }}\n >\n <select\n value={customizedDownloadRowOption}\n data-testid=\"select-csv-exporter-customized-rows\"\n className=\"custom-select\"\n disabled={isDownloading}\n onChange={this.handleCustomizedDownloadRowOptionChanged}\n >\n <option value=\"FIRST\">First</option>\n <option value=\"LAST\">Last</option>\n </select>\n <input\n type=\"number\"\n className=\"form-control\"\n id={`customizedRows-${id}`}\n data-testid=\"input-csv-exporter-customized-rows\"\n name={`customizedRows-${id}`}\n placeholder=\"100\"\n value={customizedDownloadRows}\n disabled={isDownloading}\n onChange={this.handleCustomizedDownloadRowsChanged}\n />\n <div>Rows</div>\n </div>\n </RadioItem>\n </RadioGroup>\n </div>\n <div className=\"form-group\">\n <label htmlFor={`customizedRows-${id}`}>File Name</label>\n <input\n type=\"text\"\n className=\"form-control\"\n id={`filename-${id}`}\n data-testid=\"input-csv-exporter-file-name\"\n name={`filename-${id}`}\n value={fileName}\n onChange={event => {\n this.setState({ fileName: event.target.value });\n }}\n disabled={isDownloading}\n />\n </div>\n <div className=\"checkbox-options\">\n <Checkbox\n checked={includeColumnHeaders}\n onChange={this.handleIncludeColumnHeadersChanged}\n >\n Include column headers\n </Checkbox>\n <Checkbox\n checked={includeHiddenColumns}\n onChange={this.handleIncludeHiddenColumnsChanged}\n >\n Include hidden columns\n </Checkbox>\n <Checkbox\n checked={useUnformattedValues}\n onChange={this.handleUseUnformattedValuesChanged}\n >\n Use unformatted values\n </Checkbox>\n </div>\n <div className=\"section-footer flex-column\">\n {errorMessage != null && (\n <div className=\"error-message\">{errorMessage}</div>\n )}\n {tableDownloadStatus && (\n <div className=\"download-status\">\n {(tableDownloadStatus ===\n TableCsvExporter.DOWNLOAD_STATUS.DOWNLOADING ||\n tableDownloadStatus ===\n TableCsvExporter.DOWNLOAD_STATUS.INITIATING) && (\n <>\n {tableDownloadStatus ===\n TableCsvExporter.DOWNLOAD_STATUS.INITIATING && (\n <div className=\"text-muted\">Starting Download...</div>\n )}\n {tableDownloadStatus ===\n TableCsvExporter.DOWNLOAD_STATUS.DOWNLOADING && (\n <div className=\"text-muted d-flex justify-content-between\">\n <span>\n {tableDownloadEstimatedTime ||\n tableDownloadEstimatedTime === 0\n ? `Estimated time: ${TimeUtils.formatElapsedTime(\n tableDownloadEstimatedTime\n )}`\n : null}\n </span>\n <span>{`${tableDownloadProgress}%`}</span>\n </div>\n )}\n </>\n )}\n {tableDownloadStatus ===\n TableCsvExporter.DOWNLOAD_STATUS.FINISHED && (\n <div className=\"text-muted text-right\">Download Completed</div>\n )}\n {tableDownloadStatus ===\n TableCsvExporter.DOWNLOAD_STATUS.CANCELED && (\n <div className=\"text-muted\">Download Canceled</div>\n )}\n\n {(tableDownloadStatus ===\n TableCsvExporter.DOWNLOAD_STATUS.DOWNLOADING ||\n tableDownloadStatus ===\n TableCsvExporter.DOWNLOAD_STATUS.INITIATING) && (\n <div className=\"progress\">\n <div\n className=\"progress-bar progress-bar-striped progress-bar-animated\"\n style={{ width: `${tableDownloadProgress}%` }}\n />\n </div>\n )}\n {tableDownloadStatus ===\n TableCsvExporter.DOWNLOAD_STATUS.FINISHED && (\n <div className=\"progress\">\n <div\n className=\"progress-bar bg-success\"\n style={{ width: `${tableDownloadProgress}%` }}\n />\n </div>\n )}\n </div>\n )}\n <Button\n kind=\"primary\"\n data-testid=\"btn-csv-exporter-download\"\n className={ClassNames('btn-downloading', {\n 'btn-spinner btn-cancelable': isDownloading,\n })}\n onClick={this.handleDownloadClick}\n >\n {isDownloading && (\n <span>\n <LoadingSpinner />\n <span className=\"btn-normal-content\">Downloading</span>\n <span className=\"btn-hover-content\">Cancel</span>\n </span>\n )}\n {!isDownloading && 'Download'}\n </Button>\n </div>\n </div>\n );\n }\n}\n\nexport default TableCsvExporter;\n"],"mappings":"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"}
@@ -34,6 +34,8 @@ export default class TableSaver extends PureComponent<TableSaverProps, Record<st
34
34
  tableSubscription?: TableViewportSubscription;
35
35
  columns?: Column[];
36
36
  fileName?: string;
37
+ includeColumnHeaders: boolean;
38
+ useUnformattedValues: boolean;
37
39
  chunkRows?: number;
38
40
  gridRanges: GridRange[];
39
41
  gridRangeCounter?: number;
@@ -59,14 +61,14 @@ export default class TableSaver extends PureComponent<TableSaverProps, Record<st
59
61
  rows?: string | undefined;
60
62
  header?: string | undefined;
61
63
  }>;
62
- startDownload(fileName: string, frozenTable: Table, tableSubscription: TableViewportSubscription, snapshotRanges: GridRange[], modelRanges: GridRange[]): void;
64
+ startDownload(fileName: string, frozenTable: Table, tableSubscription: TableViewportSubscription, snapshotRanges: GridRange[], modelRanges: GridRange[], includeColumnHeaders: boolean, useUnformattedValues: boolean): void;
63
65
  finishDownload(): void;
64
66
  cancelDownload(): void;
65
67
  resetTableSaver(): void;
66
68
  handleDownloadTimeout(): void;
67
69
  writeTableHeader(): void;
68
70
  startWriteTableBody(): void;
69
- writeCsvTable(): void;
71
+ writeCsvTable(includeColumnHeaders: boolean): void;
70
72
  writeSnapshot(snapshotIndex: number, snapshotStartRow: GridRangeIndex, snapshotEndRow: GridRangeIndex): void;
71
73
  updateDownloadProgress(snapshotIndex: GridRangeIndex): void;
72
74
  convertSnapshotIntoCsv(snapshot: UpdateEventData): string;
@@ -1 +1 @@
1
- {"version":3,"file":"TableSaver.d.ts","sourceRoot":"","sources":["../../src/sidebar/TableSaver.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TableSaver.d.ts","sourceRoot":"","sources":["../../src/sidebar/TableSaver.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,OAAW,EACT,MAAM,EAEN,KAAK,EAEL,yBAAyB,EACzB,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,SAAS,EAAE,cAAc,EAAgB,MAAM,iBAAiB,CAAC;AAE1E,OAAO,EAAE,SAAS,EAA8B,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EACL,iBAAiB,EAGlB,MAAM,kBAAkB,CAAC;AAO1B,UAAU,eAAe;IACvB,iBAAiB,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;IAChD,aAAa,EAAE,OAAO,CAAC;IACvB,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,wBAAwB,EAAE,CACxB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GAAG,IAAI,KACzB,IAAI,CAAC;IACV,SAAS,EAAE,SAAS,CAAC;CACtB;AAcD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,aAAa,CACnD,eAAe,EACf,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CACtB;IACC,MAAM,CAAC,mBAAmB,SAAQ;IAElC,MAAM,CAAC,oBAAoB,SAAK;IAEhC,MAAM,CAAC,cAAc,SAAQ;IAE7B,MAAM,CAAC,wBAAwB,SAAK;IAEpC,MAAM,CAAC,YAAY;iCACM,QAAQ,KAAK,CAAC;;mCAGZ,IAAI;kCACL,IAAI;wCACE,IAAI;MAClC;IAEF,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;gBAI/B,KAAK,EAAE,eAAe;IAsClC,iBAAiB,IAAI,IAAI;IAezB,oBAAoB,IAAI,IAAI;IAU5B,EAAE,CAAC,EAAE,aAAa,CAAC;IAEnB,IAAI,CAAC,EAAE,WAAW,CAAC;IAEnB,UAAU,CAAC,EAAE,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAElD,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd,iBAAiB,CAAC,EAAE,yBAAyB,CAAC;IAE9C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,oBAAoB,EAAE,OAAO,CAAC;IAE9B,oBAAoB,EAAE,OAAO,CAAC;IAE9B,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,UAAU,EAAE,SAAS,EAAE,CAAC;IAExB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAE/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B,cAAc,EAAE,MAAM,CAAC;IAEvB,eAAe,EAAE,MAAM,CAAC;IAExB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAE9C,oBAAoB,EAAE,MAAM,CAAC;IAE7B,eAAe,EAAE,MAAM,CAAC;IAExB,mBAAmB,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;IAK3D,cAAc;;;MAAmD;IAOjE,aAAa,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IAE9C,sBAAsB,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IAEvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAE7B,eAAe,EAAE,OAAO,CAAC;IAEzB,+BAA+B,yKAG7B;IAEF,kBAAkB,CAChB,IAAI,EAAE,WAAW,GAChB,cAAc,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC7B,CAAC;IAuDF,aAAa,CACX,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,KAAK,EAClB,iBAAiB,EAAE,yBAAyB,EAC5C,cAAc,EAAE,SAAS,EAAE,EAC3B,WAAW,EAAE,SAAS,EAAE,EACxB,oBAAoB,EAAE,OAAO,EAC7B,oBAAoB,EAAE,OAAO,GAC5B,IAAI;IA2CP,cAAc,IAAI,IAAI;IAwBtB,cAAc,IAAI,IAAI;IAsBtB,eAAe,IAAI,IAAI;IAiCvB,qBAAqB,IAAI,IAAI;IAK7B,gBAAgB,IAAI,IAAI;IAWxB,mBAAmB,IAAI,IAAI;IAyB3B,aAAa,CAAC,oBAAoB,EAAE,OAAO,GAAG,IAAI;IAOlD,aAAa,CACX,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,cAAc,EAChC,cAAc,EAAE,cAAc,GAC7B,IAAI;IAqDP,sBAAsB,CAAC,aAAa,EAAE,cAAc,GAAG,IAAI;IAwB3D,sBAAsB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM;IAgEzD,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAmE7B,iBAAiB,CAAC,EAChB,IAAI,GACL,EAAE,YAAY,CAAC;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,qBAAqB,EAAE,OAAO,CAAC;KAChC,CAAC,GAAG,IAAI;IAuBT,sBAAsB,CACpB,QAAQ,EAAE,eAAe,EACzB,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,cAAc,EAChC,cAAc,EAAE,cAAc,GAC7B,IAAI;IAUP,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAU7B,MAAM,IAAI,IAAI;CAGf"}
@@ -5,10 +5,11 @@ import { WritableStream as ponyfillWritableStream } from 'web-streams-polyfill/p
5
5
  import dh from '@deephaven/jsapi-shim';
6
6
  import Log from '@deephaven/log';
7
7
  import { memoizeClear } from '@deephaven/grid';
8
- import { FormatterUtils } from '@deephaven/jsapi-utils';
8
+ import { FormatterUtils, TableUtils } from '@deephaven/jsapi-utils';
9
9
  import { PromiseUtils, assertNotNull } from '@deephaven/utils';
10
10
  import IrisGridUtils from "../IrisGridUtils.js";
11
11
  var log = Log.module('TableSaver');
12
+ var UNFORMATTED_DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS z";
12
13
 
13
14
  function isUpdateEventData(data) {
14
15
  return data.added !== undefined;
@@ -44,6 +45,10 @@ export default class TableSaver extends PureComponent {
44
45
 
45
46
  _defineProperty(this, "fileName", void 0);
46
47
 
48
+ _defineProperty(this, "includeColumnHeaders", void 0);
49
+
50
+ _defineProperty(this, "useUnformattedValues", void 0);
51
+
47
52
  _defineProperty(this, "chunkRows", void 0);
48
53
 
49
54
  _defineProperty(this, "gridRanges", void 0);
@@ -90,6 +95,8 @@ export default class TableSaver extends PureComponent {
90
95
  this.gridRangeCounter = 0;
91
96
  this.rangedSnapshotsTotal = [];
92
97
  this.rangedSnapshotCounter = 0;
98
+ this.includeColumnHeaders = true;
99
+ this.useUnformattedValues = false;
93
100
  this.snapshotsTotal = 0;
94
101
  this.snapshotCounter = 0;
95
102
  this.snapshotsBuffer = new Map();
@@ -200,7 +207,7 @@ export default class TableSaver extends PureComponent {
200
207
  return new this.WritableStream(streamConfig);
201
208
  }
202
209
 
203
- startDownload(fileName, frozenTable, tableSubscription, snapshotRanges, modelRanges) {
210
+ startDownload(fileName, frozenTable, tableSubscription, snapshotRanges, modelRanges, includeColumnHeaders, useUnformattedValues) {
204
211
  // don't trigger another download when a download is ongoing
205
212
  var {
206
213
  isDownloading
@@ -215,7 +222,9 @@ export default class TableSaver extends PureComponent {
215
222
  this.table = frozenTable;
216
223
  this.columns = IrisGridUtils.columnsFromRanges(modelRanges, frozenTable.columns);
217
224
  this.tableSubscription = tableSubscription;
218
- this.gridRanges = snapshotRanges; // Make filename RFC5987 compatible
225
+ this.gridRanges = snapshotRanges;
226
+ this.includeColumnHeaders = includeColumnHeaders;
227
+ this.useUnformattedValues = useUnformattedValues; // Make filename RFC5987 compatible
219
228
 
220
229
  var encodedFileName = encodeURIComponent(fileName.replace(/\//g, ':')).replace(/['()]/g, escape).replace(/\*/g, '%2A');
221
230
  var messageChannel = new MessageChannel();
@@ -224,7 +233,7 @@ export default class TableSaver extends PureComponent {
224
233
  this.fileWriter = this.createWriterStream(this.port).getWriter(); // if the browser doesn't support stream or there's no active service worker, use blobs for table download
225
234
 
226
235
  if (this.useBlobFallback) {
227
- this.writeCsvTable();
236
+ this.writeCsvTable(includeColumnHeaders);
228
237
  return;
229
238
  }
230
239
 
@@ -297,6 +306,8 @@ export default class TableSaver extends PureComponent {
297
306
  this.gridRangeCounter = 0;
298
307
  this.rangedSnapshotsTotal = [];
299
308
  this.rangedSnapshotCounter = 0;
309
+ this.includeColumnHeaders = true;
310
+ this.useUnformattedValues = false;
300
311
  this.snapshotsTotal = 0;
301
312
  this.snapshotCounter = 0;
302
313
  this.snapshotsBuffer = new Map();
@@ -353,8 +364,11 @@ export default class TableSaver extends PureComponent {
353
364
  }
354
365
  }
355
366
 
356
- writeCsvTable() {
357
- this.writeTableHeader();
367
+ writeCsvTable(includeColumnHeaders) {
368
+ if (includeColumnHeaders) {
369
+ this.writeTableHeader();
370
+ }
371
+
358
372
  this.startWriteTableBody();
359
373
  }
360
374
 
@@ -407,6 +421,9 @@ export default class TableSaver extends PureComponent {
407
421
  }
408
422
 
409
423
  assertNotNull(this.columns);
424
+ var {
425
+ useUnformattedValues
426
+ } = this;
410
427
 
411
428
  for (var i = 0; i < rows.length; i += 1) {
412
429
  var rowIdx = rows[i];
@@ -418,20 +435,33 @@ export default class TableSaver extends PureComponent {
418
435
  type,
419
436
  name
420
437
  } = this.columns[j];
421
- var hasCustomColumnFormat = this.getCachedCustomColumnFormatFlag(formatter, name, type);
422
- var formatOverride = null;
438
+ var cellData = null;
423
439
 
424
- if (!hasCustomColumnFormat) {
425
- var cellFormat = snapshot.getFormat(rowIdx, this.columns[j]);
426
- formatOverride = (cellFormat === null || cellFormat === void 0 ? void 0 : cellFormat.formatString) != null ? cellFormat : null;
427
- }
440
+ if (useUnformattedValues) {
441
+ var _snapshot$getData;
428
442
 
429
- var cellData = null;
443
+ var value = (_snapshot$getData = snapshot.getData(rowIdx, this.columns[j])) !== null && _snapshot$getData !== void 0 ? _snapshot$getData : '';
430
444
 
431
- if (formatOverride) {
432
- cellData = formatter.getFormattedString(snapshot.getData(rowIdx, this.columns[j]), type, name, formatOverride);
445
+ if (value !== '' && TableUtils.isDateType(type)) {
446
+ // value is just a long value, we should return the value formatted as a full date string
447
+ value = dh.i18n.DateTimeFormat.format(UNFORMATTED_DATE_PATTERN, value, dh.i18n.TimeZone.getTimeZone(formatter.timeZone));
448
+ }
449
+
450
+ cellData = value.toString();
433
451
  } else {
434
- cellData = formatter.getFormattedString(snapshot.getData(rowIdx, this.columns[j]), type, name);
452
+ var hasCustomColumnFormat = this.getCachedCustomColumnFormatFlag(formatter, name, type);
453
+ var formatOverride = null;
454
+
455
+ if (!hasCustomColumnFormat) {
456
+ var cellFormat = snapshot.getFormat(rowIdx, this.columns[j]);
457
+ formatOverride = (cellFormat === null || cellFormat === void 0 ? void 0 : cellFormat.formatString) != null ? cellFormat : null;
458
+ }
459
+
460
+ if (formatOverride) {
461
+ cellData = formatter.getFormattedString(snapshot.getData(rowIdx, this.columns[j]), type, name, formatOverride);
462
+ } else {
463
+ cellData = formatter.getFormattedString(snapshot.getData(rowIdx, this.columns[j]), type, name);
464
+ }
435
465
  }
436
466
 
437
467
  csvString += TableSaver.csvEscapeString(cellData);
@@ -509,8 +539,11 @@ export default class TableSaver extends PureComponent {
509
539
  }
510
540
 
511
541
  if (download != null) {
542
+ var {
543
+ includeColumnHeaders
544
+ } = this;
512
545
  this.makeIframe("".concat(download));
513
- this.writeCsvTable();
546
+ this.writeCsvTable(includeColumnHeaders);
514
547
  }
515
548
 
516
549
  if (readableStreamPulling != null) {