@deephaven/iris-grid 0.22.3-beta.10 → 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.
- package/dist/IrisGrid.d.ts +1 -1
- package/dist/IrisGrid.d.ts.map +1 -1
- package/dist/IrisGrid.js +4 -4
- package/dist/IrisGrid.js.map +1 -1
- package/dist/sidebar/TableCsvExporter.css +3 -0
- package/dist/sidebar/TableCsvExporter.css.map +1 -1
- package/dist/sidebar/TableCsvExporter.d.ts +12 -6
- package/dist/sidebar/TableCsvExporter.d.ts.map +1 -1
- package/dist/sidebar/TableCsvExporter.js +91 -33
- package/dist/sidebar/TableCsvExporter.js.map +1 -1
- package/dist/sidebar/TableSaver.d.ts +4 -2
- package/dist/sidebar/TableSaver.d.ts.map +1 -1
- package/dist/sidebar/TableSaver.js +50 -17
- package/dist/sidebar/TableSaver.js.map +1 -1
- package/package.json +15 -15
|
@@ -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.
|
|
34
|
-
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
|
-
|
|
42
|
-
|
|
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
|
-
|
|
56
|
-
|
|
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 (
|
|
66
|
-
case TableCsvExporter.
|
|
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.
|
|
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.
|
|
84
|
-
switch (
|
|
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
|
-
|
|
190
|
+
handleDownloadRowOptionChanged(event) {
|
|
180
191
|
this.setState({
|
|
181
|
-
|
|
192
|
+
downloadRowOption: event.target.value
|
|
182
193
|
});
|
|
183
194
|
}
|
|
184
195
|
|
|
185
|
-
|
|
196
|
+
handleCustomizedDownloadRowOptionChanged(event) {
|
|
186
197
|
this.setState({
|
|
187
|
-
|
|
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
|
-
|
|
246
|
+
downloadRowOption,
|
|
203
247
|
customizedDownloadRows
|
|
204
248
|
} = this.state;
|
|
205
249
|
|
|
206
|
-
if (
|
|
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 (
|
|
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
|
-
|
|
239
|
-
|
|
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.
|
|
255
|
-
value:
|
|
301
|
+
onChange: this.handleDownloadRowOptionChanged,
|
|
302
|
+
value: downloadRowOption,
|
|
256
303
|
disabled: isDownloading
|
|
257
304
|
}, /*#__PURE__*/React.createElement(RadioItem, {
|
|
258
|
-
value: TableCsvExporter.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
322
|
+
downloadRowOption: TableCsvExporter.DOWNLOAD_ROW_OPTIONS.CUSTOMIZED_ROWS
|
|
276
323
|
});
|
|
277
324
|
}
|
|
278
325
|
}, /*#__PURE__*/React.createElement("select", {
|
|
279
|
-
value:
|
|
326
|
+
value: customizedDownloadRowOption,
|
|
280
327
|
"data-testid": "select-csv-exporter-customized-rows",
|
|
281
328
|
className: "custom-select",
|
|
282
329
|
disabled: isDownloading,
|
|
283
|
-
onChange: this.
|
|
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, "
|
|
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":"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"}
|
|
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":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,OAAW,EACT,MAAM,
|
|
1
|
+
{"version":3,"file":"TableSaver.d.ts","sourceRoot":"","sources":["../../src/sidebar/TableSaver.tsx"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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
|
-
|
|
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
|
|
422
|
-
var formatOverride = null;
|
|
438
|
+
var cellData = null;
|
|
423
439
|
|
|
424
|
-
if (
|
|
425
|
-
var
|
|
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
|
-
|
|
443
|
+
var value = (_snapshot$getData = snapshot.getData(rowIdx, this.columns[j])) !== null && _snapshot$getData !== void 0 ? _snapshot$getData : '';
|
|
430
444
|
|
|
431
|
-
|
|
432
|
-
|
|
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
|
-
|
|
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) {
|