@deephaven/iris-grid 0.6.3-beta.9 → 0.6.3

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.
Files changed (75) hide show
  1. package/dist/Formatter.d.ts +7 -14
  2. package/dist/Formatter.d.ts.map +1 -1
  3. package/dist/Formatter.js +6 -6
  4. package/dist/Formatter.js.map +1 -1
  5. package/dist/FormatterUtils.d.ts +8 -0
  6. package/dist/FormatterUtils.d.ts.map +1 -1
  7. package/dist/FormatterUtils.js +15 -0
  8. package/dist/FormatterUtils.js.map +1 -1
  9. package/dist/IrisGrid.d.ts +8 -0
  10. package/dist/IrisGrid.d.ts.map +1 -1
  11. package/dist/IrisGrid.js +39 -71
  12. package/dist/IrisGrid.js.map +1 -1
  13. package/dist/IrisGridBottomBar.js +1 -1
  14. package/dist/IrisGridModelUpdater.js +1 -1
  15. package/dist/IrisGridModelUpdater.js.map +1 -1
  16. package/dist/IrisGridRenderer.js +1 -4
  17. package/dist/IrisGridRenderer.js.map +1 -1
  18. package/dist/IrisGridTableModel.d.ts.map +1 -1
  19. package/dist/IrisGridTableModel.js +3 -7
  20. package/dist/IrisGridTableModel.js.map +1 -1
  21. package/dist/IrisGridTreeTableModel.js +1 -1
  22. package/dist/IrisGridUtils.js +32 -32
  23. package/dist/IrisGridUtils.js.map +1 -1
  24. package/dist/PendingDataBottomBar.js +1 -1
  25. package/dist/PendingDataBottomBar.js.map +1 -1
  26. package/dist/TableUtils.d.ts.map +1 -1
  27. package/dist/TableUtils.js +3 -1
  28. package/dist/TableUtils.js.map +1 -1
  29. package/dist/ToastBottomBar.js +1 -1
  30. package/dist/ToastBottomBar.js.map +1 -1
  31. package/dist/formatters/DateTimeColumnFormatter.d.ts +8 -7
  32. package/dist/formatters/DateTimeColumnFormatter.d.ts.map +1 -1
  33. package/dist/formatters/DateTimeColumnFormatter.js +1 -2
  34. package/dist/formatters/DateTimeColumnFormatter.js.map +1 -1
  35. package/dist/formatters/DecimalColumnFormatter.d.ts +55 -59
  36. package/dist/formatters/DecimalColumnFormatter.d.ts.map +1 -1
  37. package/dist/formatters/DecimalColumnFormatter.js +66 -27
  38. package/dist/formatters/DecimalColumnFormatter.js.map +1 -1
  39. package/dist/formatters/IntegerColumnFormatter.d.ts +50 -29
  40. package/dist/formatters/IntegerColumnFormatter.d.ts.map +1 -1
  41. package/dist/formatters/IntegerColumnFormatter.js +60 -19
  42. package/dist/formatters/IntegerColumnFormatter.js.map +1 -1
  43. package/dist/formatters/index.d.ts +7 -7
  44. package/dist/formatters/index.d.ts.map +1 -1
  45. package/dist/formatters/index.js +3 -3
  46. package/dist/formatters/index.js.map +1 -1
  47. package/dist/memoizeClear.js +1 -1
  48. package/dist/mousehandlers/IrisGridColumnTooltipMouseHandler.d.ts.map +1 -1
  49. package/dist/mousehandlers/IrisGridColumnTooltipMouseHandler.js +12 -4
  50. package/dist/mousehandlers/IrisGridColumnTooltipMouseHandler.js.map +1 -1
  51. package/dist/mousehandlers/IrisGridContextMenuHandler.js +1 -1
  52. package/dist/sidebar/AdvancedSettingsMenu.js +2 -2
  53. package/dist/sidebar/CustomColumnBuilder.js +2 -2
  54. package/dist/sidebar/CustomColumnBuilder.js.map +1 -1
  55. package/dist/sidebar/InputEditor.js +1 -1
  56. package/dist/sidebar/RollupRows.js +10 -10
  57. package/dist/sidebar/RollupRows.js.map +1 -1
  58. package/dist/sidebar/SelectDistinctBuilder.js +5 -5
  59. package/dist/sidebar/SelectDistinctBuilder.js.map +1 -1
  60. package/dist/sidebar/TableCsvExporter.d.ts.map +1 -1
  61. package/dist/sidebar/TableCsvExporter.js +10 -3
  62. package/dist/sidebar/TableCsvExporter.js.map +1 -1
  63. package/dist/sidebar/TableSaver.d.ts +1 -0
  64. package/dist/sidebar/TableSaver.d.ts.map +1 -1
  65. package/dist/sidebar/TableSaver.js +20 -1
  66. package/dist/sidebar/TableSaver.js.map +1 -1
  67. package/dist/sidebar/VisibilityOrderingBuilder.js +10 -10
  68. package/dist/sidebar/VisibilityOrderingBuilder.js.map +1 -1
  69. package/dist/sidebar/aggregations/AggregationEdit.js +3 -3
  70. package/dist/sidebar/aggregations/AggregationEdit.js.map +1 -1
  71. package/dist/sidebar/aggregations/AggregationUtils.js +1 -1
  72. package/dist/sidebar/aggregations/Aggregations.js +4 -4
  73. package/dist/sidebar/aggregations/Aggregations.js.map +1 -1
  74. package/dist/tsconfig.tsbuildinfo +1 -1
  75. package/package.json +12 -13
@@ -200,15 +200,18 @@ class TableCsvExporter extends Component {
200
200
  value: downloadOption,
201
201
  disabled: isDownloading
202
202
  }, /*#__PURE__*/React.createElement(RadioItem, {
203
- value: TableCsvExporter.DOWNLOAD_OPTIONS.ALL_ROWS
203
+ value: TableCsvExporter.DOWNLOAD_OPTIONS.ALL_ROWS,
204
+ "data-testid": "radio-csv-exporter-download-all"
204
205
  }, "All Rows", /*#__PURE__*/React.createElement("span", {
205
206
  className: "text-muted ml-2"
206
207
  }, "(".concat(rowCount.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,'), " rows)"))), /*#__PURE__*/React.createElement(RadioItem, {
207
- value: TableCsvExporter.DOWNLOAD_OPTIONS.SELECTED_ROWS
208
+ value: TableCsvExporter.DOWNLOAD_OPTIONS.SELECTED_ROWS,
209
+ "data-testid": "radio-csv-exporter-only-selected"
208
210
  }, "Only Selected Rows", /*#__PURE__*/React.createElement("span", {
209
211
  className: "text-muted ml-2"
210
212
  }, selectedRanges.length > 0 ? "(".concat(GridRange.rowCount(selectedRanges).toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,'), " rows)") : null)), /*#__PURE__*/React.createElement(RadioItem, {
211
- value: TableCsvExporter.DOWNLOAD_OPTIONS.CUSTOMIZED_ROWS
213
+ value: TableCsvExporter.DOWNLOAD_OPTIONS.CUSTOMIZED_ROWS,
214
+ "data-testid": "radio-csv-exporter-customized-rows"
212
215
  }, /*#__PURE__*/React.createElement("div", {
213
216
  className: "radio-input-row",
214
217
  role: "presentation",
@@ -220,6 +223,7 @@ class TableCsvExporter extends Component {
220
223
  }, /*#__PURE__*/React.createElement("select", {
221
224
  defaultValue: TableCsvExporter.DOWNLOAD_OPTIONS.FIRST,
222
225
  value: customizedDownloadOption,
226
+ "data-testid": "select-csv-exporter-customized-rows",
223
227
  className: "custom-select",
224
228
  disabled: isDownloading,
225
229
  onChange: this.handleCustomizedDownloadOptionChanged
@@ -231,6 +235,7 @@ class TableCsvExporter extends Component {
231
235
  type: "number",
232
236
  className: "form-control",
233
237
  id: "customizedRows-".concat(id),
238
+ "data-testid": "input-csv-exporter-customized-rows",
234
239
  name: "customizedRows-".concat(id),
235
240
  placeholder: "100",
236
241
  value: customizedDownloadRows,
@@ -244,6 +249,7 @@ class TableCsvExporter extends Component {
244
249
  type: "text",
245
250
  className: "form-control",
246
251
  id: "filename-".concat(id),
252
+ "data-testid": "input-csv-exporter-file-name",
247
253
  name: "filename-".concat(id),
248
254
  value: fileName,
249
255
  onChange: event => {
@@ -282,6 +288,7 @@ class TableCsvExporter extends Component {
282
288
  }
283
289
  }))), /*#__PURE__*/React.createElement("button", {
284
290
  type: "button",
291
+ "data-testid": "btn-csv-exporter-download",
285
292
  className: ClassNames('btn btn-primary btn-downloading', {
286
293
  'btn-spinner btn-cancelable': isDownloading
287
294
  }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/sidebar/TableCsvExporter.jsx"],"names":["React","Component","PropTypes","ClassNames","FontAwesomeIcon","LoadingSpinner","RadioGroup","RadioItem","GridRange","vsIssues","dh","TimeUtils","shortid","IrisGridModel","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","snapshotRanges","push","SELECTED_ROWS","sort","rangeA","rangeB","startRow","CUSTOMIZED_ROWS","Math","min","LAST","max","resetDownloadState","setState","isDownloading","onDownloadStart","onDownload","onCancel","validateOptionInput","export","then","frozenTable","tableSubscription","setViewport","getViewportData","event","target","value","length","render","tableDownloadProgress","tableDownloadEstimatedTime","tableDownloadStatus","toString","replace","DOWNLOAD_STATUS","DOWNLOADING","INITIATING","formatElapsedTime","FINISHED","CANCELED","width","propTypes","instanceOf","isRequired","string","bool","number","func","arrayOf","defaultProps"],"mappings":";;AAAA,OAAOA,KAAP,IAAgBC,SAAhB,QAAiC,OAAjC;AACA,OAAOC,SAAP,MAAsB,YAAtB;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,SAASC,eAAT,QAAgC,gCAAhC;AACA,SAASC,cAAT,EAAyBC,UAAzB,EAAqCC,SAArC,QAAsD,uBAAtD;AACA,SAASC,SAAT,QAA0B,iBAA1B;AACA,SAASC,QAAT,QAAyB,kBAAzB;AACA,OAAOC,EAAP,MAAe,uBAAf;AACA,SAASC,SAAT,QAA0B,kBAA1B;AACA,OAAOC,OAAP,MAAoB,SAApB;OACOC,a;;;AAGP,MAAMC,gBAAN,SAA+Bb,SAA/B,CAAyC;AAuBnB,SAAbc,aAAa,GAAG;AACrB,WAAOL,EAAE,CAACM,IAAH,CAAQC,cAAR,CAAuBC,MAAvB,CACLJ,gBAAgB,CAACK,oBADZ,EAEL,IAAIC,IAAJ,EAFK,CAAP;AAID;;AAEDC,EAAAA,WAAW,CAACC,KAAD,EAAQ;AACjB,UAAMA,KAAN;AAEA,SAAKC,mBAAL,GAA2B,KAAKA,mBAAL,CAAyBC,IAAzB,CAA8B,IAA9B,CAA3B;AACA,SAAKC,2BAAL,GAAmC,KAAKA,2BAAL,CAAiCD,IAAjC,CACjC,IADiC,CAAnC;AAGA,SAAKE,qCAAL,GAA6C,KAAKA,qCAAL,CAA2CF,IAA3C,CAC3C,IAD2C,CAA7C;AAGA,SAAKG,mCAAL,GAA2C,KAAKA,mCAAL,CAAyCH,IAAzC,CACzC,IADyC,CAA3C;AAIA,QAAM;AAAEI,MAAAA;AAAF,QAAWN,KAAjB;AACA,SAAKO,KAAL,GAAa;AACXC,MAAAA,QAAQ,YAAKF,IAAL,cAAad,gBAAgB,CAACC,aAAjB,EAAb,SADG;AAGXgB,MAAAA,cAAc,EAAEjB,gBAAgB,CAACkB,gBAAjB,CAAkCC,QAHvC;AAIXC,MAAAA,wBAAwB,EAAEpB,gBAAgB,CAACqB,uBAAjB,CAAyCC,KAJxD;AAKXC,MAAAA,sBAAsB,EAAEvB,gBAAgB,CAACwB,qBAL9B;AAOXC,MAAAA,YAAY,EAAE,IAPH;AAQXC,MAAAA,EAAE,EAAE5B,OAAO,CAAC6B,QAAR;AARO,KAAb;AAUD;;AAEDC,EAAAA,iBAAiB,GAAG;AAClB,QAAM;AAAEC,MAAAA,KAAF;AAASC,MAAAA;AAAT,QAA4B,KAAKtB,KAAvC;AACA,QAAM;AACJS,MAAAA,cADI;AAEJG,MAAAA,wBAFI;AAGJG,MAAAA;AAHI,QAIF,KAAKR,KAJT;AAKA,QAAM;AAAEgB,MAAAA;AAAF,QAAeF,KAArB;AACA,QAAIG,cAAc,GAAG,EAArB;;AACA,YAAQf,cAAR;AACE,WAAKjB,gBAAgB,CAACkB,gBAAjB,CAAkCC,QAAvC;AACEa,QAAAA,cAAc,CAACC,IAAf,CAAoB,IAAIvC,SAAJ,CAAc,IAAd,EAAoB,CAApB,EAAuB,IAAvB,EAA6BqC,QAAQ,GAAG,CAAxC,CAApB;AACA;;AACF,WAAK/B,gBAAgB,CAACkB,gBAAjB,CAAkCgB,aAAvC;AACEF,QAAAA,cAAc,GAAG,CAAC,GAAGF,cAAJ,EAAoBK,IAApB,CACf,CAACC,MAAD,EAASC,MAAT,KAAoBD,MAAM,CAACE,QAAP,GAAkBD,MAAM,CAACC,QAD9B,CAAjB;AAGA;;AACF,WAAKtC,gBAAgB,CAACkB,gBAAjB,CAAkCqB,eAAvC;AACE,gBAAQnB,wBAAR;AACE,eAAKpB,gBAAgB,CAACqB,uBAAjB,CAAyCC,KAA9C;AACEU,YAAAA,cAAc,CAACC,IAAf,CACE,IAAIvC,SAAJ,CACE,IADF,EAEE,CAFF,EAGE,IAHF,EAIE8C,IAAI,CAACC,GAAL,CAASlB,sBAAsB,GAAG,CAAlC,EAAqCQ,QAAQ,GAAG,CAAhD,CAJF,CADF;AAQA;;AACF,eAAK/B,gBAAgB,CAACqB,uBAAjB,CAAyCqB,IAA9C;AACEV,YAAAA,cAAc,CAACC,IAAf,CACE,IAAIvC,SAAJ,CACE,IADF,EAEE8C,IAAI,CAACG,GAAL,CAAS,CAAT,EAAYZ,QAAQ,GAAGR,sBAAvB,CAFF,EAGE,IAHF,EAIEQ,QAAQ,GAAG,CAJb,CADF;AAQA;;AACF;AACE;AAtBJ;;AAwBA;;AACF;AACE;AApCJ;;AAsCA,WAAOC,cAAP;AACD;;AAEDY,EAAAA,kBAAkB,GAAG;AACnB,SAAKC,QAAL,CAAc;AAAEpB,MAAAA,YAAY,EAAE;AAAhB,KAAd;AACD;;AAEDhB,EAAAA,mBAAmB,GAAG;AACpB,QAAM;AACJoB,MAAAA,KADI;AAEJiB,MAAAA,aAFI;AAGJC,MAAAA,eAHI;AAIJC,MAAAA,UAJI;AAKJC,MAAAA;AALI,QAMF,KAAKzC,KANT;AAOA,QAAM;AAAEQ,MAAAA;AAAF,QAAe,KAAKD,KAA1B;;AAEA,QAAI+B,aAAJ,EAAmB;AACjBG,MAAAA,QAAQ;AACR;AACD;;AAED,SAAKL,kBAAL;AAEA,QAAMZ,cAAc,GAAG,KAAKJ,iBAAL,EAAvB;;AACA,QAAI,KAAKsB,mBAAL,EAAJ,EAAgC;AAC9BH,MAAAA,eAAe;AACflB,MAAAA,KAAK,CAACsB,MAAN,GAAeC,IAAf,CAAoBC,WAAW,IAAI;AACjC,YAAMC,iBAAiB,GAAGD,WAAW,CAACE,WAAZ,CAAwB,CAAxB,EAA2B,CAA3B,CAA1B;AACAD,QAAAA,iBAAiB,CAACE,eAAlB,GAAoCJ,IAApC,CAAyC,MAAM;AAC7CJ,UAAAA,UAAU,CAAChC,QAAD,EAAWqC,WAAX,EAAwBC,iBAAxB,EAA2CtB,cAA3C,CAAV;AACD,SAFD;AAGD,OALD;AAMD;AACF;;AAEDrB,EAAAA,2BAA2B,CAAC8C,KAAD,EAAQ;AACjC,SAAKZ,QAAL,CAAc;AAAE5B,MAAAA,cAAc,EAAEwC,KAAK,CAACC,MAAN,CAAaC;AAA/B,KAAd;AACD;;AAED/C,EAAAA,qCAAqC,CAAC6C,KAAD,EAAQ;AAC3C,SAAKZ,QAAL,CAAc;AAAEzB,MAAAA,wBAAwB,EAAEqC,KAAK,CAACC,MAAN,CAAaC;AAAzC,KAAd;AACD;;AAED9C,EAAAA,mCAAmC,CAAC4C,KAAD,EAAQ;AACzC,SAAKZ,QAAL,CAAc;AAAEtB,MAAAA,sBAAsB,EAAEkC,KAAK,CAACC,MAAN,CAAaC;AAAvC,KAAd;AACD;;AAEDT,EAAAA,mBAAmB,GAAG;AACpB,QAAM;AAAEpB,MAAAA;AAAF,QAAqB,KAAKtB,KAAhC;AACA,QAAM;AAAES,MAAAA,cAAF;AAAkBM,MAAAA;AAAlB,QAA6C,KAAKR,KAAxD;;AAEA,QACEE,cAAc,KAAKjB,gBAAgB,CAACkB,gBAAjB,CAAkCgB,aAArD,IACAJ,cAAc,CAAC8B,MAAf,KAA0B,CAF5B,EAGE;AACA,WAAKf,QAAL,CAAc;AACZpB,QAAAA,YAAY,eACV,4CACE,oBAAC,eAAD;AAAiB,UAAA,IAAI,EAAE9B;AAAvB,UADF;AAFU,OAAd;AAQA,aAAO,KAAP;AACD;;AAED,QACEsB,cAAc,KAAKjB,gBAAgB,CAACkB,gBAAjB,CAAkCqB,eAArD,IACAhB,sBAAsB,IAAI,CAF5B,EAGE;AACA,WAAKsB,QAAL,CAAc;AACZpB,QAAAA,YAAY,eACV,4CACE,oBAAC,eAAD;AAAiB,UAAA,IAAI,EAAE9B;AAAvB,UADF;AAFU,OAAd;AAQA,aAAO,KAAP;AACD;;AACD,WAAO,IAAP;AACD;;AAEDkE,EAAAA,MAAM,GAAG;AACP,QAAM;AACJhC,MAAAA,KADI;AAEJiB,MAAAA,aAFI;AAGJgB,MAAAA,qBAHI;AAIJC,MAAAA,0BAJI;AAKJjC,MAAAA,cALI;AAMJkC,MAAAA;AANI,QAOF,KAAKxD,KAPT;AAQA,QAAM;AACJQ,MAAAA,QADI;AAEJC,MAAAA,cAFI;AAGJG,MAAAA,wBAHI;AAIJG,MAAAA,sBAJI;AAKJE,MAAAA,YALI;AAMJC,MAAAA;AANI,QAOF,KAAKX,KAPT;AAQA,QAAM;AAAEgB,MAAAA;AAAF,QAAeF,KAArB;AACA,wBACE;AAAK,MAAA,SAAS,EAAC;AAAf,oBACE;AAAK,MAAA,SAAS,EAAC;AAAf,uBADF,eAEE;AAAK,MAAA,SAAS,EAAC;AAAf,oBACE,oBAAC,UAAD;AACE,MAAA,QAAQ,EAAE,KAAKlB,2BADjB;AAEE,MAAA,KAAK,EAAEM,cAFT;AAGE,MAAA,QAAQ,EAAE6B;AAHZ,oBAKE,oBAAC,SAAD;AAAW,MAAA,KAAK,EAAE9C,gBAAgB,CAACkB,gBAAjB,CAAkCC;AAApD,gCAEE;AAAM,MAAA,SAAS,EAAC;AAAhB,kBACOY,QAAQ,CACVkC,QADE,GAEFC,OAFE,CAEM,yBAFN,EAEiC,KAFjC,CADP,YAFF,CALF,eAaE,oBAAC,SAAD;AAAW,MAAA,KAAK,EAAElE,gBAAgB,CAACkB,gBAAjB,CAAkCgB;AAApD,0CAEE;AAAM,MAAA,SAAS,EAAC;AAAhB,OACGJ,cAAc,CAAC8B,MAAf,GAAwB,CAAxB,cACOlE,SAAS,CAACqC,QAAV,CAAmBD,cAAnB,EACDmC,QADC,GAEDC,OAFC,CAEO,yBAFP,EAEkC,KAFlC,CADP,cAIG,IALN,CAFF,CAbF,eAuBE,oBAAC,SAAD;AACE,MAAA,KAAK,EAAElE,gBAAgB,CAACkB,gBAAjB,CAAkCqB;AAD3C,oBAGE;AACE,MAAA,SAAS,EAAC,iBADZ;AAEE,MAAA,IAAI,EAAC,cAFP;AAGE,MAAA,OAAO,EAAE,MAAM;AACb,aAAKM,QAAL,CAAc;AACZ5B,UAAAA,cAAc,EACZjB,gBAAgB,CAACkB,gBAAjB,CAAkCqB;AAFxB,SAAd;AAID;AARH,oBAUE;AACE,MAAA,YAAY,EAAEvC,gBAAgB,CAACkB,gBAAjB,CAAkCI,KADlD;AAEE,MAAA,KAAK,EAAEF,wBAFT;AAGE,MAAA,SAAS,EAAC,eAHZ;AAIE,MAAA,QAAQ,EAAE0B,aAJZ;AAKE,MAAA,QAAQ,EAAE,KAAKlC;AALjB,oBAOE;AAAQ,MAAA,KAAK,EAAC;AAAd,eAPF,eAQE;AAAQ,MAAA,KAAK,EAAC;AAAd,cARF,CAVF,eAoBE;AACE,MAAA,IAAI,EAAC,QADP;AAEE,MAAA,SAAS,EAAC,cAFZ;AAGE,MAAA,EAAE,2BAAoBc,EAApB,CAHJ;AAIE,MAAA,IAAI,2BAAoBA,EAApB,CAJN;AAKE,MAAA,WAAW,EAAC,KALd;AAME,MAAA,KAAK,EAAEH,sBANT;AAOE,MAAA,QAAQ,EAAEuB,aAPZ;AAQE,MAAA,QAAQ,EAAE,KAAKjC;AARjB,MApBF,eA8BE,wCA9BF,CAHF,CAvBF,CADF,CAFF,eAgEE;AAAK,MAAA,SAAS,EAAC;AAAf,oBACE;AAAO,MAAA,OAAO,2BAAoBa,EAApB;AAAd,mBADF,eAEE;AACE,MAAA,IAAI,EAAC,MADP;AAEE,MAAA,SAAS,EAAC,cAFZ;AAGE,MAAA,EAAE,qBAAcA,EAAd,CAHJ;AAIE,MAAA,IAAI,qBAAcA,EAAd,CAJN;AAKE,MAAA,KAAK,EAAEV,QALT;AAME,MAAA,QAAQ,EAAEyC,KAAK,IAAI;AACjB,aAAKZ,QAAL,CAAc;AAAE7B,UAAAA,QAAQ,EAAEyC,KAAK,CAACC,MAAN,CAAaC;AAAzB,SAAd;AACD,OARH;AASE,MAAA,QAAQ,EAAEb;AATZ,MAFF,CAhEF,eA8EE;AAAK,MAAA,SAAS,EAAC;AAAf,OACGrB,YAAY,iBAAI;AAAK,MAAA,SAAS,EAAC;AAAf,OAAgCA,YAAhC,CADnB,EAEGuC,mBAAmB,iBAClB;AAAK,MAAA,SAAS,EAAC;AAAf,OACG,CAACA,mBAAmB,KACnBhE,gBAAgB,CAACmE,eAAjB,CAAiCC,WADjC,IAEAJ,mBAAmB,KACjBhE,gBAAgB,CAACmE,eAAjB,CAAiCE,UAHpC,kBAIC,0CACGL,mBAAmB,KAClBhE,gBAAgB,CAACmE,eAAjB,CAAiCE,UADlC,iBAEC;AAAK,MAAA,SAAS,EAAC;AAAf,8BAHJ,EAKGL,mBAAmB,KAClBhE,gBAAgB,CAACmE,eAAjB,CAAiCC,WADlC,iBAEC;AAAK,MAAA,SAAS,EAAC;AAAf,oBACE,kCACGL,0BAA0B,IAC3BA,0BAA0B,KAAK,CAD9B,6BAEsBlE,SAAS,CAACyE,iBAAV,CACjBP,0BADiB,CAFtB,IAKG,IANN,CADF,eASE,4CAAUD,qBAAV,OATF,CAPJ,CALJ,EA0BGE,mBAAmB,KAClBhE,gBAAgB,CAACmE,eAAjB,CAAiCI,QADlC,iBAEC;AAAK,MAAA,SAAS,EAAC;AAAf,4BA5BJ,EA8BGP,mBAAmB,KAClBhE,gBAAgB,CAACmE,eAAjB,CAAiCK,QADlC,iBAEC;AAAK,MAAA,SAAS,EAAC;AAAf,2BAhCJ,EAmCG,CAACR,mBAAmB,KACnBhE,gBAAgB,CAACmE,eAAjB,CAAiCC,WADjC,IAEAJ,mBAAmB,KACjBhE,gBAAgB,CAACmE,eAAjB,CAAiCE,UAHpC,kBAIC;AAAK,MAAA,SAAS,EAAC;AAAf,oBACE;AACE,MAAA,SAAS,EAAC,yDADZ;AAEE,MAAA,KAAK,EAAE;AAAEI,QAAAA,KAAK,YAAKX,qBAAL;AAAP;AAFT,MADF,CAvCJ,EA8CGE,mBAAmB,KAClBhE,gBAAgB,CAACmE,eAAjB,CAAiCI,QADlC,iBAEC;AAAK,MAAA,SAAS,EAAC;AAAf,oBACE;AACE,MAAA,SAAS,EAAC,yBADZ;AAEE,MAAA,KAAK,EAAE;AAAEE,QAAAA,KAAK,YAAKX,qBAAL;AAAP;AAFT,MADF,CAhDJ,CAHJ,eA4DE;AACE,MAAA,IAAI,EAAC,QADP;AAEE,MAAA,SAAS,EAAEzE,UAAU,CAAC,iCAAD,EAAoC;AACvD,sCAA8ByD;AADyB,OAApC,CAFvB;AAKE,MAAA,OAAO,EAAE,KAAKrC;AALhB,OAOGqC,aAAa,iBACZ,+CACE,oBAAC,cAAD,OADF,eAEE;AAAM,MAAA,SAAS,EAAC;AAAhB,qBAFF,eAGE;AAAM,MAAA,SAAS,EAAC;AAAhB,gBAHF,CARJ,EAcG,CAACA,aAAD,IAAkB,UAdrB,CA5DF,CA9EF,CADF;AA8JD;;AA5WsC;;gBAAnC9C,gB,0BAC0B,mB;;gBAD1BA,gB,qBAGqB;AACvBqE,EAAAA,UAAU,EAAE,YADW;AAEvBD,EAAAA,WAAW,EAAE,aAFU;AAGvBG,EAAAA,QAAQ,EAAE,UAHa;AAIvBC,EAAAA,QAAQ,EAAE;AAJa,C;;gBAHrBxE,gB,sBAUsB;AACxBmB,EAAAA,QAAQ,EAAE,UADc;AAExBe,EAAAA,aAAa,EAAE,eAFS;AAGxBK,EAAAA,eAAe,EAAE;AAHO,C;;gBAVtBvC,gB,6BAgB6B;AAC/BsB,EAAAA,KAAK,EAAE,OADwB;AAE/BoB,EAAAA,IAAI,EAAE;AAFyB,C;;gBAhB7B1C,gB,2BAqB2B,G;;AA0VjCA,gBAAgB,CAAC0E,SAAjB,GAA6B;AAC3B7C,EAAAA,KAAK,EAAEzC,SAAS,CAACuF,UAAV,CAAqB5E,aAArB,EAAoC6E,UADhB;AAE3B9D,EAAAA,IAAI,EAAE1B,SAAS,CAACyF,MAAV,CAAiBD,UAFI;AAG3B9B,EAAAA,aAAa,EAAE1D,SAAS,CAAC0F,IAHE;AAI3Bd,EAAAA,mBAAmB,EAAE5E,SAAS,CAACyF,MAJJ;AAK3Bf,EAAAA,qBAAqB,EAAE1E,SAAS,CAAC2F,MALN;AAM3BhB,EAAAA,0BAA0B,EAAE3E,SAAS,CAAC2F,MANX;AAO3BhC,EAAAA,eAAe,EAAE3D,SAAS,CAAC4F,IAPA;AAQ3BhC,EAAAA,UAAU,EAAE5D,SAAS,CAAC4F,IAAV,CAAeJ,UARA;AAS3B3B,EAAAA,QAAQ,EAAE7D,SAAS,CAAC4F,IAAV,CAAeJ,UATE;AAU3B9C,EAAAA,cAAc,EAAE1C,SAAS,CAAC6F,OAAV,CAAkB7F,SAAS,CAACuF,UAAV,CAAqBjF,SAArB,CAAlB;AAVW,CAA7B;AAaAM,gBAAgB,CAACkF,YAAjB,GAAgC;AAC9BnC,EAAAA,eAAe,EAAE,MAAM,CAAE,CADK;AAE9BD,EAAAA,aAAa,EAAE,KAFe;AAG9BkB,EAAAA,mBAAmB,EAAE,EAHS;AAI9BF,EAAAA,qBAAqB,EAAE,CAJO;AAK9BC,EAAAA,0BAA0B,EAAE,IALE;AAM9BjC,EAAAA,cAAc,EAAE;AANc,CAAhC;AAQA,eAAe9B,gBAAf","sourcesContent":["import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport ClassNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { LoadingSpinner, RadioGroup, RadioItem } from '@deephaven/components';\nimport { GridRange } from '@deephaven/grid';\nimport { vsIssues } from '@deephaven/icons';\nimport dh from '@deephaven/jsapi-shim';\nimport { TimeUtils } from '@deephaven/utils';\nimport shortid from 'shortid';\nimport IrisGridModel from '../IrisGridModel';\nimport './TableCsvExporter.scss';\n\nclass TableCsvExporter extends Component {\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 getDateString() {\n return dh.i18n.DateTimeFormat.format(\n TableCsvExporter.FILENAME_DATE_FORMAT,\n new Date()\n );\n }\n\n constructor(props) {\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() {\n const { model, selectedRanges } = this.props;\n const {\n downloadOption,\n customizedDownloadOption,\n customizedDownloadRows,\n } = this.state;\n const { rowCount } = model;\n let snapshotRanges = [];\n switch (downloadOption) {\n case TableCsvExporter.DOWNLOAD_OPTIONS.ALL_ROWS:\n snapshotRanges.push(new GridRange(null, 0, null, rowCount - 1));\n break;\n case TableCsvExporter.DOWNLOAD_OPTIONS.SELECTED_ROWS:\n snapshotRanges = [...selectedRanges].sort(\n (rangeA, rangeB) => rangeA.startRow - rangeB.startRow\n );\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 null,\n 0,\n null,\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 null,\n Math.max(0, rowCount - customizedDownloadRows),\n null,\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 resetDownloadState() {\n this.setState({ errorMessage: null });\n }\n\n handleDownloadClick() {\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 if (this.validateOptionInput()) {\n onDownloadStart();\n model.export().then(frozenTable => {\n const tableSubscription = frozenTable.setViewport(0, 0);\n tableSubscription.getViewportData().then(() => {\n onDownload(fileName, frozenTable, tableSubscription, snapshotRanges);\n });\n });\n }\n }\n\n handleDownloadOptionChanged(event) {\n this.setState({ downloadOption: event.target.value });\n }\n\n handleCustomizedDownloadOptionChanged(event) {\n this.setState({ customizedDownloadOption: event.target.value });\n }\n\n handleCustomizedDownloadRowsChanged(event) {\n this.setState({ customizedDownloadRows: event.target.value });\n }\n\n validateOptionInput() {\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={vsIssues} /> 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={vsIssues} /> Number of rows to output must be\n greater than 0\n </p>\n ),\n });\n return false;\n }\n return true;\n }\n\n render() {\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 value={TableCsvExporter.DOWNLOAD_OPTIONS.ALL_ROWS}>\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 value={TableCsvExporter.DOWNLOAD_OPTIONS.SELECTED_ROWS}>\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 >\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 defaultValue={TableCsvExporter.DOWNLOAD_OPTIONS.FIRST}\n value={customizedDownloadOption}\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 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 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 && <div className=\"error-message\">{errorMessage}</div>}\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 type=\"button\"\n className={ClassNames('btn btn-primary 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\nTableCsvExporter.propTypes = {\n model: PropTypes.instanceOf(IrisGridModel).isRequired,\n name: PropTypes.string.isRequired,\n isDownloading: PropTypes.bool,\n tableDownloadStatus: PropTypes.string,\n tableDownloadProgress: PropTypes.number,\n tableDownloadEstimatedTime: PropTypes.number,\n onDownloadStart: PropTypes.func,\n onDownload: PropTypes.func.isRequired,\n onCancel: PropTypes.func.isRequired,\n selectedRanges: PropTypes.arrayOf(PropTypes.instanceOf(GridRange)),\n};\n\nTableCsvExporter.defaultProps = {\n onDownloadStart: () => {},\n isDownloading: false,\n tableDownloadStatus: '',\n tableDownloadProgress: 0,\n tableDownloadEstimatedTime: null,\n selectedRanges: [],\n};\nexport default TableCsvExporter;\n"],"file":"TableCsvExporter.js"}
1
+ {"version":3,"sources":["../../src/sidebar/TableCsvExporter.jsx"],"names":["React","Component","PropTypes","ClassNames","FontAwesomeIcon","LoadingSpinner","RadioGroup","RadioItem","GridRange","vsIssues","dh","TimeUtils","shortid","IrisGridModel","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","snapshotRanges","push","SELECTED_ROWS","sort","rangeA","rangeB","startRow","CUSTOMIZED_ROWS","Math","min","LAST","max","resetDownloadState","setState","isDownloading","onDownloadStart","onDownload","onCancel","validateOptionInput","export","then","frozenTable","tableSubscription","setViewport","getViewportData","event","target","value","length","render","tableDownloadProgress","tableDownloadEstimatedTime","tableDownloadStatus","toString","replace","DOWNLOAD_STATUS","DOWNLOADING","INITIATING","formatElapsedTime","FINISHED","CANCELED","width","propTypes","instanceOf","isRequired","string","bool","number","func","arrayOf","defaultProps"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport ClassNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { LoadingSpinner, RadioGroup, RadioItem } from '@deephaven/components';\nimport { GridRange } from '@deephaven/grid';\nimport { vsIssues } from '@deephaven/icons';\nimport dh from '@deephaven/jsapi-shim';\nimport { TimeUtils } from '@deephaven/utils';\nimport shortid from 'shortid';\nimport IrisGridModel from '../IrisGridModel';\nimport './TableCsvExporter.scss';\n\nclass TableCsvExporter extends Component {\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 getDateString() {\n return dh.i18n.DateTimeFormat.format(\n TableCsvExporter.FILENAME_DATE_FORMAT,\n new Date()\n );\n }\n\n constructor(props) {\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() {\n const { model, selectedRanges } = this.props;\n const {\n downloadOption,\n customizedDownloadOption,\n customizedDownloadRows,\n } = this.state;\n const { rowCount } = model;\n let snapshotRanges = [];\n switch (downloadOption) {\n case TableCsvExporter.DOWNLOAD_OPTIONS.ALL_ROWS:\n snapshotRanges.push(new GridRange(null, 0, null, rowCount - 1));\n break;\n case TableCsvExporter.DOWNLOAD_OPTIONS.SELECTED_ROWS:\n snapshotRanges = [...selectedRanges].sort(\n (rangeA, rangeB) => rangeA.startRow - rangeB.startRow\n );\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 null,\n 0,\n null,\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 null,\n Math.max(0, rowCount - customizedDownloadRows),\n null,\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 resetDownloadState() {\n this.setState({ errorMessage: null });\n }\n\n handleDownloadClick() {\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 if (this.validateOptionInput()) {\n onDownloadStart();\n model.export().then(frozenTable => {\n const tableSubscription = frozenTable.setViewport(0, 0);\n tableSubscription.getViewportData().then(() => {\n onDownload(fileName, frozenTable, tableSubscription, snapshotRanges);\n });\n });\n }\n }\n\n handleDownloadOptionChanged(event) {\n this.setState({ downloadOption: event.target.value });\n }\n\n handleCustomizedDownloadOptionChanged(event) {\n this.setState({ customizedDownloadOption: event.target.value });\n }\n\n handleCustomizedDownloadRowsChanged(event) {\n this.setState({ customizedDownloadRows: event.target.value });\n }\n\n validateOptionInput() {\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={vsIssues} /> 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={vsIssues} /> Number of rows to output must be\n greater than 0\n </p>\n ),\n });\n return false;\n }\n return true;\n }\n\n render() {\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 defaultValue={TableCsvExporter.DOWNLOAD_OPTIONS.FIRST}\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 && <div className=\"error-message\">{errorMessage}</div>}\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 type=\"button\"\n data-testid=\"btn-csv-exporter-download\"\n className={ClassNames('btn btn-primary 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\nTableCsvExporter.propTypes = {\n model: PropTypes.instanceOf(IrisGridModel).isRequired,\n name: PropTypes.string.isRequired,\n isDownloading: PropTypes.bool,\n tableDownloadStatus: PropTypes.string,\n tableDownloadProgress: PropTypes.number,\n tableDownloadEstimatedTime: PropTypes.number,\n onDownloadStart: PropTypes.func,\n onDownload: PropTypes.func.isRequired,\n onCancel: PropTypes.func.isRequired,\n selectedRanges: PropTypes.arrayOf(PropTypes.instanceOf(GridRange)),\n};\n\nTableCsvExporter.defaultProps = {\n onDownloadStart: () => {},\n isDownloading: false,\n tableDownloadStatus: '',\n tableDownloadProgress: 0,\n tableDownloadEstimatedTime: null,\n selectedRanges: [],\n};\nexport default TableCsvExporter;\n"],"file":"TableCsvExporter.js"}
@@ -37,6 +37,7 @@ declare class TableSaver extends PureComponent<any, any, any> {
37
37
  downloadStartTime: number | null;
38
38
  iframes: any[];
39
39
  useBlobFallback: boolean;
40
+ getCachedCustomColumnFormatFlag: ((...args: any[]) => any) & import("memoizee").Memoized<(...args: any[]) => any>;
40
41
  createWriterStream(port: any): WritableStream<any>;
41
42
  startDownload(fileName: any, frozenTable: any, tableSubscription: any, gridRanges: any): void;
42
43
  finishDownload(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"TableSaver.d.ts","sourceRoot":"","sources":["../../src/sidebar/TableSaver.jsx"],"names":[],"mappings":"AAUA;IACE,mCAAkC;IAElC,oCAAgC;IAEhC,8BAA6B;IAE7B,wCAAoC;IAEpC,yCAEC;IAED,wBAkDC;IA8WD;;aAmBC;IAED,4GAaC;IA7ND,8BAGC;IA/NC,QAAc;IACd,yBAAgB;IAChB,oDAAsB;IAEtB,WAAiB;IACjB,uBAA6B;IAC7B,aAAmB;IAEnB,cAAoB;IAEpB,yBAAqB;IAErB,kBAAoB;IACpB,yBAAyB;IACzB,4BAA8B;IAC9B,8BAA8B;IAE9B,uBAAuB;IACvB,wBAAwB;IACxB,+BAAgC;IAEhC,6BAA6B;IAC7B,wBAAwB;IACxB,2BAA6B;IAG7B;;;MAAqE;IAMrE,qCAAyB;IAEzB,8CAAkC;IAElC,iCAA6B;IAE7B,eAAiB;IAEjB,yBAAsC;IA4BxC,mDA2CC;IAED,8FAoCC;IAED,uBAoBC;IAED,uBAoBC;IAED,wBAuBC;IAOD,yBAOC;IAED,4BAiBC;IAED,sBAGC;IAED,oFA8CC;IAED,iDAgBC;IAED,8CAwBC;IAED,2BAuDC;IAsCD,2BAiBC;CAKF;;;;;;;;;;;QAYoB,sDACwC;;;;QAEtC,8CAAQ;;QACT,6CAAQ;;QACF,mDAAQ"}
1
+ {"version":3,"file":"TableSaver.d.ts","sourceRoot":"","sources":["../../src/sidebar/TableSaver.jsx"],"names":[],"mappings":"AAYA;IACE,mCAAkC;IAElC,oCAAgC;IAEhC,8BAA6B;IAE7B,wCAAoC;IAEpC,yCAEC;IAED,wBAkDC;IA+XD;;aAmBC;IAED,4GAaC;IAzOD,8BAGC;IApOC,QAAc;IACd,yBAAgB;IAChB,oDAAsB;IAEtB,WAAiB;IACjB,uBAA6B;IAC7B,aAAmB;IAEnB,cAAoB;IAEpB,yBAAqB;IAErB,kBAAoB;IACpB,yBAAyB;IACzB,4BAA8B;IAC9B,8BAA8B;IAE9B,uBAAuB;IACvB,wBAAwB;IACxB,+BAAgC;IAEhC,6BAA6B;IAC7B,wBAAwB;IACxB,2BAA6B;IAG7B;;;MAAqE;IAMrE,qCAAyB;IAEzB,8CAAkC;IAElC,iCAA6B;IAE7B,eAAiB;IAEjB,yBAAsC;IA4BxC,kHAGE;IAEF,mDA2CC;IAED,8FAoCC;IAED,uBAoBC;IAED,uBAoBC;IAED,wBAuBC;IAOD,yBAOC;IAED,4BAiBC;IAED,sBAGC;IAED,oFA8CC;IAED,iDAgBC;IAED,8CAoCC;IAED,2BAuDC;IAsCD,2BAiBC;CAKF;;;;;;;;;;;QAYoB,sDACwC;;;;QAEtC,8CAAQ;;QACT,6CAAQ;;QACF,mDAAQ"}
@@ -5,8 +5,10 @@ import PropTypes from 'prop-types';
5
5
  import { WritableStream as ponyfillWritableStream } from 'web-streams-polyfill/dist/ponyfill.js';
6
6
  import dh from '@deephaven/jsapi-shim';
7
7
  import Log from '@deephaven/log';
8
+ import { memoizeClear } from '@deephaven/grid';
8
9
  import { PromiseUtils } from '@deephaven/utils';
9
10
  import Formatter from "../Formatter.js";
11
+ import FormatterUtils from "../FormatterUtils.js";
10
12
  var log = Log.module('TableSaver');
11
13
  export default class TableSaver extends PureComponent {
12
14
  static csvEscapeString(str) {
@@ -15,6 +17,11 @@ export default class TableSaver extends PureComponent {
15
17
 
16
18
  constructor(props) {
17
19
  super(props);
20
+
21
+ _defineProperty(this, "getCachedCustomColumnFormatFlag", memoizeClear(FormatterUtils.isCustomColumnFormatDefined, {
22
+ max: 10000
23
+ }));
24
+
18
25
  this.handlePortMessage = this.handlePortMessage.bind(this);
19
26
  this.handleSnapshotResolved = this.handleSnapshotResolved.bind(this);
20
27
  this.handleDownloadTimeout = this.handleDownloadTimeout.bind(this);
@@ -320,7 +327,19 @@ export default class TableSaver extends PureComponent {
320
327
  var rowIdx = rows[i];
321
328
 
322
329
  for (var j = 0; j < this.columns.length; j += 1) {
323
- var cellData = formatter.getFormattedString(snapshot.getData(rowIdx, this.columns[j]), this.columns[j].type, this.columns[j].name);
330
+ var {
331
+ type,
332
+ name
333
+ } = this.columns[j];
334
+ var hasCustomColumnFormat = this.getCachedCustomColumnFormatFlag(formatter, type, name);
335
+ var formatOverride = null;
336
+
337
+ if (!hasCustomColumnFormat) {
338
+ var cellFormat = snapshot.getFormat(rowIdx, this.columns[j]);
339
+ formatOverride = (cellFormat === null || cellFormat === void 0 ? void 0 : cellFormat.formatString) != null ? cellFormat : null;
340
+ }
341
+
342
+ var cellData = formatter.getFormattedString(snapshot.getData(rowIdx, this.columns[j]), type, name, formatOverride);
324
343
  csvString += TableSaver.csvEscapeString(cellData);
325
344
  csvString += j === this.columns.length - 1 ? '\n' : ',';
326
345
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/sidebar/TableSaver.jsx"],"names":["PureComponent","PropTypes","WritableStream","ponyfillWritableStream","dh","Log","PromiseUtils","Formatter","log","module","TableSaver","csvEscapeString","str","replace","constructor","props","handlePortMessage","bind","handleSnapshotResolved","handleDownloadTimeout","state","sw","port","fileWriter","table","tableSubscription","columns","fileName","chunkRows","gridRanges","gridRangeCounter","rangedSnapshotsTotal","rangedSnapshotCounter","snapshotsTotal","snapshotCounter","snapshotsBuffer","Map","currentSnapshotIndex","snapshotPending","cancelableSnapshots","window","streamTimeout","snapshotHandlerTimeout","downloadStartTime","iframes","useBlobFallback","safari","componentDidMount","getDownloadWorker","then","info","postMessage","catch","error","warn","componentWillUnmount","length","forEach","iframe","remove","clearTimeout","createWriterStream","useBlob","chunks","encode","TextEncoder","prototype","streamConfig","write","chunk","push","rows","close","blob","Blob","type","link","document","createElement","href","URL","createObjectURL","download","click","abort","cancel","end","startDownload","frozenTable","isDownloading","Date","now","encodedFileName","encodeURIComponent","escape","messageChannel","MessageChannel","port1","getWriter","writeCsvTable","port2","onmessage","finishDownload","onDownloadCompleted","resetTableSaver","cancelDownload","cancelable","onDownloadCanceled","writeTableHeader","headerString","i","name","header","startWriteTableBody","Math","floor","DOWNLOAD_CELL_CHUNK","map","range","ceil","endRow","startRow","reduce","total","snapshotCount","makeSnapshot","min","SNAPSHOT_BUFFER_SIZE","writeSnapshot","snapshotIndex","snapshotStartRow","snapshotEndRow","has","convertSnapshotIntoCsv","get","delete","updateDownloadProgress","debug2","size","onDownloadProgressUpdate","downloadProgress","estimateTime","snapshot","csvString","snapshotIterator","added","iterator","formatter","hasNext","next","value","rowIdx","j","cellData","getFormattedString","getData","n","currentGridRange","makeCancelable","RangeSet","ofRange","err","val","data","readableStreamPulling","makeIframe","setTimeout","STREAM_TIMEOUT","set","SNAPSHOT_HANDLER_TIMEOUT","src","hidden","loaded","isIframe","addEventListener","body","appendChild","render","propTypes","func","bool","instanceOf","isRequired","defaultProps","Promise","reject","Error"],"mappings":"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","sourcesContent":["import { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport { WritableStream as ponyfillWritableStream } from 'web-streams-polyfill/dist/ponyfill.js';\nimport dh from '@deephaven/jsapi-shim';\nimport Log from '@deephaven/log';\nimport { PromiseUtils } from '@deephaven/utils';\nimport Formatter from '../Formatter';\n\nconst log = Log.module('TableSaver');\n\nexport default class TableSaver extends PureComponent {\n static DOWNLOAD_CELL_CHUNK = 6000;\n\n static SNAPSHOT_BUFFER_SIZE = 5;\n\n static STREAM_TIMEOUT = 8000;\n\n static SNAPSHOT_HANDLER_TIMEOUT = 5;\n\n static csvEscapeString(str) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n\n constructor(props) {\n super(props);\n\n this.handlePortMessage = this.handlePortMessage.bind(this);\n this.handleSnapshotResolved = this.handleSnapshotResolved.bind(this);\n this.handleDownloadTimeout = this.handleDownloadTimeout.bind(this);\n\n this.state = {};\n\n this.sw = null;\n this.port = null;\n this.fileWriter = null;\n\n this.table = null;\n this.tableSubscription = null;\n this.columns = null;\n\n this.fileName = null;\n\n this.chunkRows = null;\n\n this.gridRanges = [];\n this.gridRangeCounter = 0;\n this.rangedSnapshotsTotal = [];\n this.rangedSnapshotCounter = 0;\n\n this.snapshotsTotal = 0;\n this.snapshotCounter = 0;\n this.snapshotsBuffer = new Map();\n\n this.currentSnapshotIndex = 0;\n this.snapshotPending = 0;\n this.cancelableSnapshots = [];\n\n // WritableStream is not supported in Firefox (also IE) yet. use ponyfillWritableStream instead\n this.WritableStream = window.WritableStream || ponyfillWritableStream;\n\n // Due to an open issue in Chromium, readableStream.cancel() is never called when a user cancel the stream from Chromium's UI and the stream goes on even it's canceled.\n // Instead, we monitor the pull() behavior from the readableStream called when the stream wants more data to write.\n // If the stream doesn't pull for long enough time, chances are the stream is already canceled, so we stop the stream.\n // Issue ticket on Chromium: https://bugs.chromium.org/p/chromium/issues/detail?id=638494\n this.streamTimeout = null;\n\n this.snapshotHandlerTimeout = null;\n\n this.downloadStartTime = null;\n\n this.iframes = [];\n\n this.useBlobFallback = !!window.safari;\n }\n\n componentDidMount() {\n const { getDownloadWorker } = this.props;\n getDownloadWorker()\n .then(sw => {\n log.info('found active service worker');\n this.sw = sw;\n this.sw.postMessage('ping'); // just to activate the service worker\n })\n .catch(error => {\n // if service worker is not available, use blob as fallback to download table csv\n log.warn('Download csv is not optimized.', error);\n this.useBlobFallback = true;\n });\n }\n\n componentWillUnmount() {\n if (this.iframes.length > 0) {\n this.iframes.forEach(iframe => {\n iframe.remove();\n });\n }\n clearTimeout(this.streamTimeout);\n clearTimeout(this.snapshotHandlerTimeout);\n }\n\n createWriterStream(port) {\n // use blob fall back if it's safari\n const useBlob = this.useBlobFallback;\n const chunks = [];\n let encode = null;\n if (useBlob) {\n encode = TextEncoder.prototype.encode.bind(new TextEncoder());\n }\n const { fileName } = this;\n\n const streamConfig = {};\n if (useBlob) {\n streamConfig.write = chunk => {\n chunks.push(encode(chunk.rows));\n };\n streamConfig.close = () => {\n const blob = new Blob(chunks, {\n type: 'application/octet-stream; charset=utf-8',\n });\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.download = fileName;\n link.click();\n };\n streamConfig.abort = () => {\n port.postMessage({ cancel: true });\n port.close();\n };\n } else {\n streamConfig.write = chunk => {\n port.postMessage(chunk);\n };\n streamConfig.close = () => {\n port.postMessage({ end: true });\n port.close();\n };\n streamConfig.abort = () => {\n port.postMessage({ cancel: true });\n port.close();\n };\n }\n\n return new this.WritableStream(streamConfig);\n }\n\n startDownload(fileName, frozenTable, tableSubscription, gridRanges) {\n // don't trigger another download when a download is ongoing\n const { isDownloading } = this.props;\n if (isDownloading) {\n return;\n }\n\n this.downloadStartTime = Date.now();\n log.info(`start downloading ${fileName}`);\n\n this.table = frozenTable;\n this.columns = frozenTable.columns;\n this.tableSubscription = tableSubscription;\n this.gridRanges = gridRanges;\n\n // Make filename RFC5987 compatible\n const encodedFileName = encodeURIComponent(fileName.replace(/\\//g, ':'))\n .replace(/['()]/g, escape)\n .replace(/\\*/g, '%2A');\n\n const messageChannel = new MessageChannel();\n this.port = messageChannel.port1;\n this.fileName = fileName;\n this.fileWriter = this.createWriterStream(this.port).getWriter();\n\n // if the browser doesn't support stream or there's no active service worker, use blobs for table download\n if (this.useBlobFallback) {\n this.writeCsvTable();\n return;\n }\n\n if (this.sw) {\n // send file name and port to service worker\n this.sw.postMessage({ encodedFileName }, [messageChannel.port2]);\n }\n this.port.onmessage = this.handlePortMessage;\n }\n\n finishDownload() {\n if (this.table) {\n this.table.close();\n }\n if (this.tableSubscription) {\n this.tableSubscription.close();\n }\n if (this.fileWriter) {\n this.fileWriter.close();\n }\n\n const { onDownloadCompleted } = this.props;\n onDownloadCompleted();\n this.resetTableSaver();\n\n log.info(\n `download finished, total elapsed time ${\n (Date.now() - this.downloadStartTime) / 1000\n } seconds`\n );\n }\n\n cancelDownload() {\n if (this.table) {\n this.table.close();\n }\n if (this.tableSubscription) {\n this.tableSubscription.close();\n }\n if (this.fileWriter) {\n this.fileWriter.abort();\n }\n\n this.cancelableSnapshots.forEach(cancelable => {\n if (cancelable) {\n cancelable.catch(() => {});\n cancelable.cancel();\n }\n });\n const { onDownloadCanceled } = this.props;\n onDownloadCanceled();\n this.resetTableSaver();\n }\n\n resetTableSaver() {\n this.table = null;\n this.tableSubscription = null;\n this.columns = null;\n this.chunkRows = null;\n\n this.gridRanges = [];\n this.gridRangeCounter = 0;\n this.rangedSnapshotsTotal = [];\n this.rangedSnapshotCounter = 0;\n\n this.snapshotsTotal = 0;\n this.snapshotCounter = 0;\n this.snapshotsBuffer = new Map();\n\n this.currentSnapshotIndex = 0;\n this.snapshotPending = 0;\n this.cancelableSnapshots = [];\n\n clearTimeout(this.streamTimeout);\n clearTimeout(this.snapshotHandlerTimeout);\n this.streamTimeout = null;\n this.snapshotHandlerTimeout = null;\n }\n\n handleDownloadTimeout() {\n log.info('download canceled');\n this.cancelDownload();\n }\n\n writeTableHeader() {\n let headerString = '';\n for (let i = 0; i < this.columns.length; i += 1) {\n headerString += this.columns[i].name;\n headerString += i === this.columns.length - 1 ? '\\n' : ',';\n }\n this.fileWriter.write({ header: headerString }).then(() => {});\n }\n\n startWriteTableBody() {\n this.chunkRows = Math.floor(\n TableSaver.DOWNLOAD_CELL_CHUNK / this.columns.length\n );\n\n this.rangedSnapshotsTotal = this.gridRanges.map(range =>\n Math.ceil((range.endRow - range.startRow + 1) / this.chunkRows)\n );\n this.snapshotsTotal = this.rangedSnapshotsTotal.reduce(\n (total, snapshotCount) => total + snapshotCount\n );\n\n log.info(`start writing table, total snapshots: `, this.snapshotsTotal);\n\n this.makeSnapshot(\n Math.min(TableSaver.SNAPSHOT_BUFFER_SIZE, this.snapshotsTotal)\n );\n }\n\n writeCsvTable() {\n this.writeTableHeader();\n this.startWriteTableBody();\n }\n\n writeSnapshot(snapshotIndex, snapshotStartRow, snapshotEndRow) {\n if (this.currentSnapshotIndex === snapshotIndex && this.fileWriter) {\n while (this.snapshotsBuffer.has(this.currentSnapshotIndex)) {\n this.fileWriter.write({\n rows: this.convertSnapshotIntoCsv(\n this.snapshotsBuffer.get(this.currentSnapshotIndex),\n snapshotStartRow,\n snapshotEndRow\n ),\n });\n this.snapshotsBuffer.delete(this.currentSnapshotIndex);\n this.currentSnapshotIndex += 1;\n\n this.updateDownloadProgress(snapshotIndex);\n }\n if (this.currentSnapshotIndex >= this.snapshotsTotal) {\n this.finishDownload();\n return;\n }\n }\n\n if (this.snapshotCounter < this.snapshotsTotal) {\n log.debug2(\n `\n current range index: ${this.gridRangeCounter}, \n snapshotIndexCounter: ${this.snapshotCounter}, \n currentRangedSnapshotIndex : ${this.rangedSnapshotCounter}, \n snapshotpending: ${this.snapshotPending}, \n buffered ${this.snapshotsBuffer.size}\n making ${Math.min(\n TableSaver.SNAPSHOT_BUFFER_SIZE -\n this.snapshotsBuffer.size -\n this.snapshotPending,\n this.snapshotsTotal - this.snapshotCounter\n )} more snapshots\n `\n );\n this.makeSnapshot(\n Math.min(\n TableSaver.SNAPSHOT_BUFFER_SIZE -\n this.snapshotsBuffer.size -\n this.snapshotPending,\n this.snapshotsTotal - this.snapshotCounter\n )\n );\n }\n }\n\n updateDownloadProgress(snapshotIndex) {\n const { onDownloadProgressUpdate } = this.props;\n const downloadProgress = Math.floor(\n (snapshotIndex * 100) / this.snapshotsTotal\n );\n const estimateTime =\n snapshotIndex > 1\n ? Math.floor(\n ((Date.now() - this.downloadStartTime) *\n (this.snapshotsTotal - snapshotIndex)) /\n snapshotIndex /\n 1000\n )\n : null;\n\n onDownloadProgressUpdate(downloadProgress, estimateTime);\n }\n\n convertSnapshotIntoCsv(snapshot) {\n let csvString = '';\n const snapshotIterator = snapshot.added.iterator();\n const { formatter } = this.props;\n\n const rows = [];\n while (snapshotIterator.hasNext()) {\n rows.push(snapshotIterator.next().value);\n }\n\n for (let i = 0; i < rows.length; i += 1) {\n const rowIdx = rows[i];\n for (let j = 0; j < this.columns.length; j += 1) {\n const cellData = formatter.getFormattedString(\n snapshot.getData(rowIdx, this.columns[j]),\n this.columns[j].type,\n this.columns[j].name\n );\n csvString += TableSaver.csvEscapeString(cellData);\n csvString += j === this.columns.length - 1 ? '\\n' : ',';\n }\n }\n\n return csvString;\n }\n\n makeSnapshot(n) {\n if (n <= 0) {\n return;\n }\n let i = 0;\n let currentGridRange = this.gridRanges[this.gridRangeCounter];\n while (i < n) {\n const snapshotStartRow =\n currentGridRange.startRow + this.rangedSnapshotCounter * this.chunkRows;\n const snapshotEndRow = Math.min(\n snapshotStartRow + this.chunkRows - 1,\n currentGridRange.endRow\n );\n\n const snapshotIndex = this.snapshotCounter;\n this.cancelableSnapshots.push(\n PromiseUtils.makeCancelable(\n this.tableSubscription\n .snapshot(\n dh.RangeSet.ofRange(snapshotStartRow, snapshotEndRow),\n this.columns\n )\n .then(snapshot => {\n this.handleSnapshotResolved(\n snapshot,\n snapshotIndex,\n snapshotStartRow,\n snapshotEndRow\n );\n\n return snapshotIndex;\n })\n .catch(err => {\n log.error(err);\n }),\n val => {\n log.info(`snapshot ${val} has been canceled`);\n }\n )\n );\n\n this.rangedSnapshotCounter += 1;\n this.snapshotCounter += 1;\n this.snapshotPending += 1;\n\n if (\n this.rangedSnapshotCounter >=\n this.rangedSnapshotsTotal[this.gridRangeCounter]\n ) {\n this.gridRangeCounter += 1;\n this.rangedSnapshotCounter = 0;\n currentGridRange = this.gridRanges[this.gridRangeCounter];\n }\n i += 1;\n }\n }\n\n handlePortMessage({ data }) {\n const { download, readableStreamPulling } = data;\n if (this.useBlobFallback) {\n return;\n }\n if (download) {\n this.makeIframe(`${download}`);\n this.writeCsvTable();\n }\n if (readableStreamPulling) {\n if (!this.useBlobFallback) {\n clearTimeout(this.streamTimeout);\n\n this.streamTimeout = setTimeout(\n this.handleDownloadTimeout,\n TableSaver.STREAM_TIMEOUT\n );\n }\n }\n }\n\n handleSnapshotResolved(\n snapshot,\n snapshotIndex,\n snapshotStartRow,\n snapshotEndRow\n ) {\n // use time out to break writeSnapshot into an individual task in browser with timeout, so there's window for the browser to update table in needed.\n this.snapshotHandlerTimeout = setTimeout(() => {\n this.snapshotsBuffer.set(snapshotIndex, snapshot);\n this.snapshotPending -= 1;\n this.writeSnapshot(snapshotIndex, snapshotStartRow, snapshotEndRow);\n this.cancelableSnapshots[snapshotIndex] = null;\n }, TableSaver.SNAPSHOT_HANDLER_TIMEOUT);\n }\n\n makeIframe(src) {\n // make a return value and make it static method\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n iframe.src = `download/${src}`;\n iframe.loaded = false;\n iframe.name = 'iframe';\n iframe.isIframe = true;\n iframe.addEventListener(\n 'load',\n () => {\n iframe.loaded = true;\n },\n false\n );\n document.body.appendChild(iframe);\n this.iframes.push(iframe);\n }\n\n render() {\n return null;\n }\n}\n\nTableSaver.propTypes = {\n getDownloadWorker: PropTypes.func,\n isDownloading: PropTypes.bool,\n onDownloadCompleted: PropTypes.func,\n onDownloadCanceled: PropTypes.func,\n onDownloadProgressUpdate: PropTypes.func,\n formatter: PropTypes.instanceOf(Formatter).isRequired,\n};\n\nTableSaver.defaultProps = {\n getDownloadWorker: () =>\n Promise.reject(new Error('Download worker not provided')),\n isDownloading: false,\n onDownloadCompleted: () => {},\n onDownloadCanceled: () => {},\n onDownloadProgressUpdate: () => {},\n};\n"],"file":"TableSaver.js"}
1
+ {"version":3,"sources":["../../src/sidebar/TableSaver.jsx"],"names":["PureComponent","PropTypes","WritableStream","ponyfillWritableStream","dh","Log","memoizeClear","PromiseUtils","Formatter","FormatterUtils","log","module","TableSaver","csvEscapeString","str","replace","constructor","props","isCustomColumnFormatDefined","max","handlePortMessage","bind","handleSnapshotResolved","handleDownloadTimeout","state","sw","port","fileWriter","table","tableSubscription","columns","fileName","chunkRows","gridRanges","gridRangeCounter","rangedSnapshotsTotal","rangedSnapshotCounter","snapshotsTotal","snapshotCounter","snapshotsBuffer","Map","currentSnapshotIndex","snapshotPending","cancelableSnapshots","window","streamTimeout","snapshotHandlerTimeout","downloadStartTime","iframes","useBlobFallback","safari","componentDidMount","getDownloadWorker","then","info","postMessage","catch","error","warn","componentWillUnmount","length","forEach","iframe","remove","clearTimeout","createWriterStream","useBlob","chunks","encode","TextEncoder","prototype","streamConfig","write","chunk","push","rows","close","blob","Blob","type","link","document","createElement","href","URL","createObjectURL","download","click","abort","cancel","end","startDownload","frozenTable","isDownloading","Date","now","encodedFileName","encodeURIComponent","escape","messageChannel","MessageChannel","port1","getWriter","writeCsvTable","port2","onmessage","finishDownload","onDownloadCompleted","resetTableSaver","cancelDownload","cancelable","onDownloadCanceled","writeTableHeader","headerString","i","name","header","startWriteTableBody","Math","floor","DOWNLOAD_CELL_CHUNK","map","range","ceil","endRow","startRow","reduce","total","snapshotCount","makeSnapshot","min","SNAPSHOT_BUFFER_SIZE","writeSnapshot","snapshotIndex","snapshotStartRow","snapshotEndRow","has","convertSnapshotIntoCsv","get","delete","updateDownloadProgress","debug2","size","onDownloadProgressUpdate","downloadProgress","estimateTime","snapshot","csvString","snapshotIterator","added","iterator","formatter","hasNext","next","value","rowIdx","j","hasCustomColumnFormat","getCachedCustomColumnFormatFlag","formatOverride","cellFormat","getFormat","formatString","cellData","getFormattedString","getData","n","currentGridRange","makeCancelable","RangeSet","ofRange","err","val","data","readableStreamPulling","makeIframe","setTimeout","STREAM_TIMEOUT","set","SNAPSHOT_HANDLER_TIMEOUT","src","hidden","loaded","isIframe","addEventListener","body","appendChild","render","propTypes","func","bool","instanceOf","isRequired","defaultProps","Promise","reject","Error"],"mappings":"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","sourcesContent":["import { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport { WritableStream as ponyfillWritableStream } from 'web-streams-polyfill/dist/ponyfill.js';\nimport dh from '@deephaven/jsapi-shim';\nimport Log from '@deephaven/log';\nimport { memoizeClear } from '@deephaven/grid';\nimport { PromiseUtils } from '@deephaven/utils';\nimport Formatter from '../Formatter';\nimport FormatterUtils from '../FormatterUtils';\n\nconst log = Log.module('TableSaver');\n\nexport default class TableSaver extends PureComponent {\n static DOWNLOAD_CELL_CHUNK = 6000;\n\n static SNAPSHOT_BUFFER_SIZE = 5;\n\n static STREAM_TIMEOUT = 8000;\n\n static SNAPSHOT_HANDLER_TIMEOUT = 5;\n\n static csvEscapeString(str) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n\n constructor(props) {\n super(props);\n\n this.handlePortMessage = this.handlePortMessage.bind(this);\n this.handleSnapshotResolved = this.handleSnapshotResolved.bind(this);\n this.handleDownloadTimeout = this.handleDownloadTimeout.bind(this);\n\n this.state = {};\n\n this.sw = null;\n this.port = null;\n this.fileWriter = null;\n\n this.table = null;\n this.tableSubscription = null;\n this.columns = null;\n\n this.fileName = null;\n\n this.chunkRows = null;\n\n this.gridRanges = [];\n this.gridRangeCounter = 0;\n this.rangedSnapshotsTotal = [];\n this.rangedSnapshotCounter = 0;\n\n this.snapshotsTotal = 0;\n this.snapshotCounter = 0;\n this.snapshotsBuffer = new Map();\n\n this.currentSnapshotIndex = 0;\n this.snapshotPending = 0;\n this.cancelableSnapshots = [];\n\n // WritableStream is not supported in Firefox (also IE) yet. use ponyfillWritableStream instead\n this.WritableStream = window.WritableStream || ponyfillWritableStream;\n\n // Due to an open issue in Chromium, readableStream.cancel() is never called when a user cancel the stream from Chromium's UI and the stream goes on even it's canceled.\n // Instead, we monitor the pull() behavior from the readableStream called when the stream wants more data to write.\n // If the stream doesn't pull for long enough time, chances are the stream is already canceled, so we stop the stream.\n // Issue ticket on Chromium: https://bugs.chromium.org/p/chromium/issues/detail?id=638494\n this.streamTimeout = null;\n\n this.snapshotHandlerTimeout = null;\n\n this.downloadStartTime = null;\n\n this.iframes = [];\n\n this.useBlobFallback = !!window.safari;\n }\n\n componentDidMount() {\n const { getDownloadWorker } = this.props;\n getDownloadWorker()\n .then(sw => {\n log.info('found active service worker');\n this.sw = sw;\n this.sw.postMessage('ping'); // just to activate the service worker\n })\n .catch(error => {\n // if service worker is not available, use blob as fallback to download table csv\n log.warn('Download csv is not optimized.', error);\n this.useBlobFallback = true;\n });\n }\n\n componentWillUnmount() {\n if (this.iframes.length > 0) {\n this.iframes.forEach(iframe => {\n iframe.remove();\n });\n }\n clearTimeout(this.streamTimeout);\n clearTimeout(this.snapshotHandlerTimeout);\n }\n\n getCachedCustomColumnFormatFlag = memoizeClear(\n FormatterUtils.isCustomColumnFormatDefined,\n { max: 10000 }\n );\n\n createWriterStream(port) {\n // use blob fall back if it's safari\n const useBlob = this.useBlobFallback;\n const chunks = [];\n let encode = null;\n if (useBlob) {\n encode = TextEncoder.prototype.encode.bind(new TextEncoder());\n }\n const { fileName } = this;\n\n const streamConfig = {};\n if (useBlob) {\n streamConfig.write = chunk => {\n chunks.push(encode(chunk.rows));\n };\n streamConfig.close = () => {\n const blob = new Blob(chunks, {\n type: 'application/octet-stream; charset=utf-8',\n });\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.download = fileName;\n link.click();\n };\n streamConfig.abort = () => {\n port.postMessage({ cancel: true });\n port.close();\n };\n } else {\n streamConfig.write = chunk => {\n port.postMessage(chunk);\n };\n streamConfig.close = () => {\n port.postMessage({ end: true });\n port.close();\n };\n streamConfig.abort = () => {\n port.postMessage({ cancel: true });\n port.close();\n };\n }\n\n return new this.WritableStream(streamConfig);\n }\n\n startDownload(fileName, frozenTable, tableSubscription, gridRanges) {\n // don't trigger another download when a download is ongoing\n const { isDownloading } = this.props;\n if (isDownloading) {\n return;\n }\n\n this.downloadStartTime = Date.now();\n log.info(`start downloading ${fileName}`);\n\n this.table = frozenTable;\n this.columns = frozenTable.columns;\n this.tableSubscription = tableSubscription;\n this.gridRanges = gridRanges;\n\n // Make filename RFC5987 compatible\n const encodedFileName = encodeURIComponent(fileName.replace(/\\//g, ':'))\n .replace(/['()]/g, escape)\n .replace(/\\*/g, '%2A');\n\n const messageChannel = new MessageChannel();\n this.port = messageChannel.port1;\n this.fileName = fileName;\n this.fileWriter = this.createWriterStream(this.port).getWriter();\n\n // if the browser doesn't support stream or there's no active service worker, use blobs for table download\n if (this.useBlobFallback) {\n this.writeCsvTable();\n return;\n }\n\n if (this.sw) {\n // send file name and port to service worker\n this.sw.postMessage({ encodedFileName }, [messageChannel.port2]);\n }\n this.port.onmessage = this.handlePortMessage;\n }\n\n finishDownload() {\n if (this.table) {\n this.table.close();\n }\n if (this.tableSubscription) {\n this.tableSubscription.close();\n }\n if (this.fileWriter) {\n this.fileWriter.close();\n }\n\n const { onDownloadCompleted } = this.props;\n onDownloadCompleted();\n this.resetTableSaver();\n\n log.info(\n `download finished, total elapsed time ${\n (Date.now() - this.downloadStartTime) / 1000\n } seconds`\n );\n }\n\n cancelDownload() {\n if (this.table) {\n this.table.close();\n }\n if (this.tableSubscription) {\n this.tableSubscription.close();\n }\n if (this.fileWriter) {\n this.fileWriter.abort();\n }\n\n this.cancelableSnapshots.forEach(cancelable => {\n if (cancelable) {\n cancelable.catch(() => {});\n cancelable.cancel();\n }\n });\n const { onDownloadCanceled } = this.props;\n onDownloadCanceled();\n this.resetTableSaver();\n }\n\n resetTableSaver() {\n this.table = null;\n this.tableSubscription = null;\n this.columns = null;\n this.chunkRows = null;\n\n this.gridRanges = [];\n this.gridRangeCounter = 0;\n this.rangedSnapshotsTotal = [];\n this.rangedSnapshotCounter = 0;\n\n this.snapshotsTotal = 0;\n this.snapshotCounter = 0;\n this.snapshotsBuffer = new Map();\n\n this.currentSnapshotIndex = 0;\n this.snapshotPending = 0;\n this.cancelableSnapshots = [];\n\n clearTimeout(this.streamTimeout);\n clearTimeout(this.snapshotHandlerTimeout);\n this.streamTimeout = null;\n this.snapshotHandlerTimeout = null;\n }\n\n handleDownloadTimeout() {\n log.info('download canceled');\n this.cancelDownload();\n }\n\n writeTableHeader() {\n let headerString = '';\n for (let i = 0; i < this.columns.length; i += 1) {\n headerString += this.columns[i].name;\n headerString += i === this.columns.length - 1 ? '\\n' : ',';\n }\n this.fileWriter.write({ header: headerString }).then(() => {});\n }\n\n startWriteTableBody() {\n this.chunkRows = Math.floor(\n TableSaver.DOWNLOAD_CELL_CHUNK / this.columns.length\n );\n\n this.rangedSnapshotsTotal = this.gridRanges.map(range =>\n Math.ceil((range.endRow - range.startRow + 1) / this.chunkRows)\n );\n this.snapshotsTotal = this.rangedSnapshotsTotal.reduce(\n (total, snapshotCount) => total + snapshotCount\n );\n\n log.info(`start writing table, total snapshots: `, this.snapshotsTotal);\n\n this.makeSnapshot(\n Math.min(TableSaver.SNAPSHOT_BUFFER_SIZE, this.snapshotsTotal)\n );\n }\n\n writeCsvTable() {\n this.writeTableHeader();\n this.startWriteTableBody();\n }\n\n writeSnapshot(snapshotIndex, snapshotStartRow, snapshotEndRow) {\n if (this.currentSnapshotIndex === snapshotIndex && this.fileWriter) {\n while (this.snapshotsBuffer.has(this.currentSnapshotIndex)) {\n this.fileWriter.write({\n rows: this.convertSnapshotIntoCsv(\n this.snapshotsBuffer.get(this.currentSnapshotIndex),\n snapshotStartRow,\n snapshotEndRow\n ),\n });\n this.snapshotsBuffer.delete(this.currentSnapshotIndex);\n this.currentSnapshotIndex += 1;\n\n this.updateDownloadProgress(snapshotIndex);\n }\n if (this.currentSnapshotIndex >= this.snapshotsTotal) {\n this.finishDownload();\n return;\n }\n }\n\n if (this.snapshotCounter < this.snapshotsTotal) {\n log.debug2(\n `\n current range index: ${this.gridRangeCounter}, \n snapshotIndexCounter: ${this.snapshotCounter}, \n currentRangedSnapshotIndex : ${this.rangedSnapshotCounter}, \n snapshotpending: ${this.snapshotPending}, \n buffered ${this.snapshotsBuffer.size}\n making ${Math.min(\n TableSaver.SNAPSHOT_BUFFER_SIZE -\n this.snapshotsBuffer.size -\n this.snapshotPending,\n this.snapshotsTotal - this.snapshotCounter\n )} more snapshots\n `\n );\n this.makeSnapshot(\n Math.min(\n TableSaver.SNAPSHOT_BUFFER_SIZE -\n this.snapshotsBuffer.size -\n this.snapshotPending,\n this.snapshotsTotal - this.snapshotCounter\n )\n );\n }\n }\n\n updateDownloadProgress(snapshotIndex) {\n const { onDownloadProgressUpdate } = this.props;\n const downloadProgress = Math.floor(\n (snapshotIndex * 100) / this.snapshotsTotal\n );\n const estimateTime =\n snapshotIndex > 1\n ? Math.floor(\n ((Date.now() - this.downloadStartTime) *\n (this.snapshotsTotal - snapshotIndex)) /\n snapshotIndex /\n 1000\n )\n : null;\n\n onDownloadProgressUpdate(downloadProgress, estimateTime);\n }\n\n convertSnapshotIntoCsv(snapshot) {\n let csvString = '';\n const snapshotIterator = snapshot.added.iterator();\n const { formatter } = this.props;\n\n const rows = [];\n while (snapshotIterator.hasNext()) {\n rows.push(snapshotIterator.next().value);\n }\n\n for (let i = 0; i < rows.length; i += 1) {\n const rowIdx = rows[i];\n for (let j = 0; j < this.columns.length; j += 1) {\n const { type, name } = this.columns[j];\n const hasCustomColumnFormat = this.getCachedCustomColumnFormatFlag(\n formatter,\n type,\n name\n );\n let formatOverride = null;\n if (!hasCustomColumnFormat) {\n const cellFormat = snapshot.getFormat(rowIdx, this.columns[j]);\n formatOverride = cellFormat?.formatString != null ? cellFormat : null;\n }\n const cellData = formatter.getFormattedString(\n snapshot.getData(rowIdx, this.columns[j]),\n type,\n name,\n formatOverride\n );\n csvString += TableSaver.csvEscapeString(cellData);\n csvString += j === this.columns.length - 1 ? '\\n' : ',';\n }\n }\n\n return csvString;\n }\n\n makeSnapshot(n) {\n if (n <= 0) {\n return;\n }\n let i = 0;\n let currentGridRange = this.gridRanges[this.gridRangeCounter];\n while (i < n) {\n const snapshotStartRow =\n currentGridRange.startRow + this.rangedSnapshotCounter * this.chunkRows;\n const snapshotEndRow = Math.min(\n snapshotStartRow + this.chunkRows - 1,\n currentGridRange.endRow\n );\n\n const snapshotIndex = this.snapshotCounter;\n this.cancelableSnapshots.push(\n PromiseUtils.makeCancelable(\n this.tableSubscription\n .snapshot(\n dh.RangeSet.ofRange(snapshotStartRow, snapshotEndRow),\n this.columns\n )\n .then(snapshot => {\n this.handleSnapshotResolved(\n snapshot,\n snapshotIndex,\n snapshotStartRow,\n snapshotEndRow\n );\n\n return snapshotIndex;\n })\n .catch(err => {\n log.error(err);\n }),\n val => {\n log.info(`snapshot ${val} has been canceled`);\n }\n )\n );\n\n this.rangedSnapshotCounter += 1;\n this.snapshotCounter += 1;\n this.snapshotPending += 1;\n\n if (\n this.rangedSnapshotCounter >=\n this.rangedSnapshotsTotal[this.gridRangeCounter]\n ) {\n this.gridRangeCounter += 1;\n this.rangedSnapshotCounter = 0;\n currentGridRange = this.gridRanges[this.gridRangeCounter];\n }\n i += 1;\n }\n }\n\n handlePortMessage({ data }) {\n const { download, readableStreamPulling } = data;\n if (this.useBlobFallback) {\n return;\n }\n if (download) {\n this.makeIframe(`${download}`);\n this.writeCsvTable();\n }\n if (readableStreamPulling) {\n if (!this.useBlobFallback) {\n clearTimeout(this.streamTimeout);\n\n this.streamTimeout = setTimeout(\n this.handleDownloadTimeout,\n TableSaver.STREAM_TIMEOUT\n );\n }\n }\n }\n\n handleSnapshotResolved(\n snapshot,\n snapshotIndex,\n snapshotStartRow,\n snapshotEndRow\n ) {\n // use time out to break writeSnapshot into an individual task in browser with timeout, so there's window for the browser to update table in needed.\n this.snapshotHandlerTimeout = setTimeout(() => {\n this.snapshotsBuffer.set(snapshotIndex, snapshot);\n this.snapshotPending -= 1;\n this.writeSnapshot(snapshotIndex, snapshotStartRow, snapshotEndRow);\n this.cancelableSnapshots[snapshotIndex] = null;\n }, TableSaver.SNAPSHOT_HANDLER_TIMEOUT);\n }\n\n makeIframe(src) {\n // make a return value and make it static method\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n iframe.src = `download/${src}`;\n iframe.loaded = false;\n iframe.name = 'iframe';\n iframe.isIframe = true;\n iframe.addEventListener(\n 'load',\n () => {\n iframe.loaded = true;\n },\n false\n );\n document.body.appendChild(iframe);\n this.iframes.push(iframe);\n }\n\n render() {\n return null;\n }\n}\n\nTableSaver.propTypes = {\n getDownloadWorker: PropTypes.func,\n isDownloading: PropTypes.bool,\n onDownloadCompleted: PropTypes.func,\n onDownloadCanceled: PropTypes.func,\n onDownloadProgressUpdate: PropTypes.func,\n formatter: PropTypes.instanceOf(Formatter).isRequired,\n};\n\nTableSaver.defaultProps = {\n getDownloadWorker: () =>\n Promise.reject(new Error('Download worker not provided')),\n isDownloading: false,\n onDownloadCompleted: () => {},\n onDownloadCanceled: () => {},\n onDownloadProgressUpdate: () => {},\n};\n"],"file":"TableSaver.js"}
@@ -444,22 +444,22 @@ class VisibilityOrderingBuilder extends Component {
444
444
  case VisibilityOrderingBuilder.MOVE_OPTIONS.UP:
445
445
  if (GridUtils.getVisibleIndex(sortedSelectedColumns[0], movedColumns) !== firstMovableIndex // check if the first visible column has reached top
446
446
  ) {
447
- sortedSelectedColumns.forEach(columnModelIndex => {
448
- var visibleIndex = GridUtils.getVisibleIndex(columnModelIndex, movedColumns);
449
- newMoves = GridUtils.moveItem(visibleIndex, visibleIndex - 1, newMoves);
450
- });
451
- }
447
+ sortedSelectedColumns.forEach(columnModelIndex => {
448
+ var visibleIndex = GridUtils.getVisibleIndex(columnModelIndex, movedColumns);
449
+ newMoves = GridUtils.moveItem(visibleIndex, visibleIndex - 1, newMoves);
450
+ });
451
+ }
452
452
 
453
453
  break;
454
454
 
455
455
  case VisibilityOrderingBuilder.MOVE_OPTIONS.DOWN:
456
456
  if (GridUtils.getVisibleIndex(sortedSelectedColumns[0], movedColumns) !== lastMovableIndex // check if the last visible column has reached bottom
457
457
  ) {
458
- sortedSelectedColumns.forEach(columnModelIndex => {
459
- var visibleIndex = GridUtils.getVisibleIndex(columnModelIndex, movedColumns);
460
- newMoves = GridUtils.moveItem(visibleIndex, visibleIndex + 1, newMoves);
461
- });
462
- }
458
+ sortedSelectedColumns.forEach(columnModelIndex => {
459
+ var visibleIndex = GridUtils.getVisibleIndex(columnModelIndex, movedColumns);
460
+ newMoves = GridUtils.moveItem(visibleIndex, visibleIndex + 1, newMoves);
461
+ });
462
+ }
463
463
 
464
464
  break;
465
465