@deephaven/iris-grid 0.6.2 → 0.6.3-bard.4

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.
@@ -5,13 +5,13 @@ import dh from '@deephaven/jsapi-shim';
5
5
  import Log from '@deephaven/log';
6
6
  import TableColumnFormatter from "./TableColumnFormatter.js";
7
7
  var log = Log.module('IntegerColumnFormatter');
8
- /** Column formatter for integers/whole numbers */
9
8
 
10
- class IntegerColumnFormatter extends TableColumnFormatter {
9
+ /** Column formatter for integers/whole numbers */
10
+ export class IntegerColumnFormatter extends TableColumnFormatter {
11
11
  /**
12
12
  * Validates format object
13
- * @param {Object} format Format object
14
- * @returns {boolean} true for valid object
13
+ * @param format Format object
14
+ * @returns true for valid object
15
15
  */
16
16
  static isValid(format) {
17
17
  try {
@@ -21,10 +21,19 @@ class IntegerColumnFormatter extends TableColumnFormatter {
21
21
  return false;
22
22
  }
23
23
  }
24
+ /**
25
+ * Create an IntegerColumnFormat object with the parameters specified
26
+ * @param label Label for the format
27
+ * @param formatString Format string for the format
28
+ * @param multiplier Optional multiplier for the formatter
29
+ * @param type Type of format created
30
+ * @returns IntegerColumnFormat object
31
+ */
32
+
24
33
 
25
34
  static makeFormat(label, formatString) {
26
- var multiplier = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
27
- var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : TableColumnFormatter.TYPE_CONTEXT_PRESET;
35
+ var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : TableColumnFormatter.TYPE_CONTEXT_PRESET;
36
+ var multiplier = arguments.length > 3 ? arguments[3] : undefined;
28
37
  return {
29
38
  label,
30
39
  type,
@@ -32,17 +41,38 @@ class IntegerColumnFormatter extends TableColumnFormatter {
32
41
  multiplier
33
42
  };
34
43
  }
44
+ /**
45
+ * Convenient function to create a IntegerFormatObject with Preset type set
46
+ * @param label Label for this format object
47
+ * @param formatString Format string to use
48
+ * @param multiplier Multiplier to use
49
+ * @returns IntegerColumnFormat object
50
+ */
51
+
52
+
53
+ static makePresetFormat(label) {
54
+ var formatString = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
55
+ var multiplier = arguments.length > 2 ? arguments[2] : undefined;
56
+ return IntegerColumnFormatter.makeFormat(label, formatString, TableColumnFormatter.TYPE_CONTEXT_PRESET, multiplier);
57
+ }
58
+ /**
59
+ * Convenient function to create a IntegerFormatObject with a default 'Custom Format' label and Custom type
60
+ * @param formatString Format string to use
61
+ * @param multiplier Multiplier to use
62
+ * @returns IntegerColumnFormat object
63
+ */
64
+
35
65
 
36
66
  static makeCustomFormat() {
37
- var formatString = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
38
- var multiplier = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
39
- return IntegerColumnFormatter.makeFormat('Custom Format', formatString, multiplier, TableColumnFormatter.TYPE_CONTEXT_CUSTOM);
67
+ var formatString = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
68
+ var multiplier = arguments.length > 1 ? arguments[1] : undefined;
69
+ return IntegerColumnFormatter.makeFormat('Custom Format', formatString, TableColumnFormatter.TYPE_CONTEXT_CUSTOM, multiplier);
40
70
  }
41
71
  /**
42
72
  * Check if the given formats match
43
- * @param {?Object} formatA format object to check
44
- * @param {?Object} formatB format object to check
45
- * @returns {boolean} True if the formats match
73
+ * @param formatA format object to check
74
+ * @param formatB format object to check
75
+ * @returns True if the formats match
46
76
  */
47
77
 
48
78
 
@@ -50,15 +80,26 @@ class IntegerColumnFormatter extends TableColumnFormatter {
50
80
  return formatA === formatB || formatA != null && formatB != null && formatA.type === formatB.type && formatA.formatString === formatB.formatString && formatA.multiplier === formatB.multiplier;
51
81
  }
52
82
 
83
+ constructor() {
84
+ var {
85
+ defaultFormatString = IntegerColumnFormatter.DEFAULT_FORMAT_STRING
86
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
87
+ super();
88
+
89
+ _defineProperty(this, "defaultFormatString", void 0);
90
+
91
+ this.defaultFormatString = defaultFormatString;
92
+ }
53
93
  /**
54
- * @param {number} valueParam Value to format
55
- * @param {Object} format Format object
56
- * @param {string} format.formatString Format string
57
- * @param {number|null} format.multiplier Optional multiplier
58
- * @returns {string} Formatted string
94
+ * Format a value with the provided format object
95
+ * @param valueParam Value to format
96
+ * @param format Format object
97
+ * @returns Formatted string
59
98
  */
99
+
100
+
60
101
  format(valueParam, format) {
61
- var formatString = format && format.formatString || IntegerColumnFormatter.DEFAULT_FORMAT_STRING;
102
+ var formatString = format && format.formatString || this.defaultFormatString;
62
103
  var value = format && format.multiplier ? valueParam * format.multiplier : valueParam;
63
104
 
64
105
  try {
@@ -74,7 +115,7 @@ class IntegerColumnFormatter extends TableColumnFormatter {
74
115
 
75
116
  _defineProperty(IntegerColumnFormatter, "DEFAULT_FORMAT_STRING", '###,##0');
76
117
 
77
- _defineProperty(IntegerColumnFormatter, "FORMAT_MILLIONS", IntegerColumnFormatter.makeFormat('Millions', '###,##0.000 mm', 0.000001));
118
+ _defineProperty(IntegerColumnFormatter, "FORMAT_MILLIONS", IntegerColumnFormatter.makePresetFormat('Millions', '###,##0.000 mm', 0.000001));
78
119
 
79
120
  export default IntegerColumnFormatter;
80
121
  //# sourceMappingURL=IntegerColumnFormatter.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/formatters/IntegerColumnFormatter.js"],"names":["dh","Log","TableColumnFormatter","log","module","IntegerColumnFormatter","isValid","format","i18n","NumberFormat","formatString","e","makeFormat","label","multiplier","type","TYPE_CONTEXT_PRESET","makeCustomFormat","TYPE_CONTEXT_CUSTOM","isSameFormat","formatA","formatB","valueParam","DEFAULT_FORMAT_STRING","value","error"],"mappings":";;AAAA;AACA,OAAOA,EAAP,MAAe,uBAAf;AACA,OAAOC,GAAP,MAAgB,gBAAhB;OACOC,oB;AAEP,IAAMC,GAAG,GAAGF,GAAG,CAACG,MAAJ,CAAW,wBAAX,CAAZ;AAEA;;AACA,MAAMC,sBAAN,SAAqCH,oBAArC,CAA0D;AACxD;AACF;AACA;AACA;AACA;AACgB,SAAPI,OAAO,CAACC,MAAD,EAAS;AACrB,QAAI;AACFP,MAAAA,EAAE,CAACQ,IAAH,CAAQC,YAAR,CAAqBF,MAArB,CAA4BA,MAAM,CAACG,YAAnC,EAAiD,CAAjD;AACA,aAAO,IAAP;AACD,KAHD,CAGE,OAAOC,CAAP,EAAU;AACV,aAAO,KAAP;AACD;AACF;;AAEgB,SAAVC,UAAU,CACfC,KADe,EAEfH,YAFe,EAKf;AAAA,QAFAI,UAEA,uEAFa,IAEb;AAAA,QADAC,IACA,uEADOb,oBAAoB,CAACc,mBAC5B;AACA,WAAO;AACLH,MAAAA,KADK;AAELE,MAAAA,IAFK;AAGLL,MAAAA,YAHK;AAILI,MAAAA;AAJK,KAAP;AAMD;;AAEsB,SAAhBG,gBAAgB,GAAyC;AAAA,QAAxCP,YAAwC,uEAAzB,IAAyB;AAAA,QAAnBI,UAAmB,uEAAN,IAAM;AAC9D,WAAOT,sBAAsB,CAACO,UAAvB,CACL,eADK,EAELF,YAFK,EAGLI,UAHK,EAILZ,oBAAoB,CAACgB,mBAJhB,CAAP;AAMD;AAED;AACF;AACA;AACA;AACA;AACA;;;AACqB,SAAZC,YAAY,CAACC,OAAD,EAAUC,OAAV,EAAmB;AACpC,WACED,OAAO,KAAKC,OAAZ,IACCD,OAAO,IAAI,IAAX,IACCC,OAAO,IAAI,IADZ,IAECD,OAAO,CAACL,IAAR,KAAiBM,OAAO,CAACN,IAF1B,IAGCK,OAAO,CAACV,YAAR,KAAyBW,OAAO,CAACX,YAHlC,IAICU,OAAO,CAACN,UAAR,KAAuBO,OAAO,CAACP,UANnC;AAQD;;AAUD;AACF;AACA;AACA;AACA;AACA;AACA;AACEP,EAAAA,MAAM,CAACe,UAAD,EAAaf,MAAb,EAAqB;AACzB,QAAMG,YAAY,GACfH,MAAM,IAAIA,MAAM,CAACG,YAAlB,IACAL,sBAAsB,CAACkB,qBAFzB;AAGA,QAAMC,KAAK,GACTjB,MAAM,IAAIA,MAAM,CAACO,UAAjB,GAA8BQ,UAAU,GAAGf,MAAM,CAACO,UAAlD,GAA+DQ,UADjE;;AAEA,QAAI;AACF,aAAOtB,EAAE,CAACQ,IAAH,CAAQC,YAAR,CAAqBF,MAArB,CAA4BG,YAA5B,EAA0Cc,KAA1C,CAAP;AACD,KAFD,CAEE,OAAOb,CAAP,EAAU;AACVR,MAAAA,GAAG,CAACsB,KAAJ,CAAU,0BAAV;AACD;;AACD,WAAO,EAAP;AACD;;AAlFuD;;gBAApDpB,sB,2BAuD2B,S;;gBAvD3BA,sB,qBAyDqBA,sBAAsB,CAACO,UAAvB,CACvB,UADuB,EAEvB,gBAFuB,EAGvB,QAHuB,C;;AA4B3B,eAAeP,sBAAf","sourcesContent":["/* eslint class-methods-use-this: \"off\" */\nimport dh from '@deephaven/jsapi-shim';\nimport Log from '@deephaven/log';\nimport TableColumnFormatter from './TableColumnFormatter';\n\nconst log = Log.module('IntegerColumnFormatter');\n\n/** Column formatter for integers/whole numbers */\nclass IntegerColumnFormatter extends TableColumnFormatter {\n /**\n * Validates format object\n * @param {Object} format Format object\n * @returns {boolean} true for valid object\n */\n static isValid(format) {\n try {\n dh.i18n.NumberFormat.format(format.formatString, 0);\n return true;\n } catch (e) {\n return false;\n }\n }\n\n static makeFormat(\n label,\n formatString,\n multiplier = null,\n type = TableColumnFormatter.TYPE_CONTEXT_PRESET\n ) {\n return {\n label,\n type,\n formatString,\n multiplier,\n };\n }\n\n static makeCustomFormat(formatString = null, multiplier = null) {\n return IntegerColumnFormatter.makeFormat(\n 'Custom Format',\n formatString,\n multiplier,\n TableColumnFormatter.TYPE_CONTEXT_CUSTOM\n );\n }\n\n /**\n * Check if the given formats match\n * @param {?Object} formatA format object to check\n * @param {?Object} formatB format object to check\n * @returns {boolean} True if the formats match\n */\n static isSameFormat(formatA, formatB) {\n return (\n formatA === formatB ||\n (formatA != null &&\n formatB != null &&\n formatA.type === formatB.type &&\n formatA.formatString === formatB.formatString &&\n formatA.multiplier === formatB.multiplier)\n );\n }\n\n static DEFAULT_FORMAT_STRING = '###,##0';\n\n static FORMAT_MILLIONS = IntegerColumnFormatter.makeFormat(\n 'Millions',\n '###,##0.000 mm',\n 0.000001\n );\n\n /**\n * @param {number} valueParam Value to format\n * @param {Object} format Format object\n * @param {string} format.formatString Format string\n * @param {number|null} format.multiplier Optional multiplier\n * @returns {string} Formatted string\n */\n format(valueParam, format) {\n const formatString =\n (format && format.formatString) ||\n IntegerColumnFormatter.DEFAULT_FORMAT_STRING;\n const value =\n format && format.multiplier ? valueParam * format.multiplier : valueParam;\n try {\n return dh.i18n.NumberFormat.format(formatString, value);\n } catch (e) {\n log.error('Invalid format arguments');\n }\n return '';\n }\n}\n\nexport default IntegerColumnFormatter;\n"],"file":"IntegerColumnFormatter.js"}
1
+ {"version":3,"sources":["../../src/formatters/IntegerColumnFormatter.ts"],"names":["dh","Log","TableColumnFormatter","log","module","IntegerColumnFormatter","isValid","format","i18n","NumberFormat","formatString","e","makeFormat","label","type","TYPE_CONTEXT_PRESET","multiplier","makePresetFormat","makeCustomFormat","TYPE_CONTEXT_CUSTOM","isSameFormat","formatA","formatB","constructor","defaultFormatString","DEFAULT_FORMAT_STRING","valueParam","value","error"],"mappings":"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","sourcesContent":["/* eslint class-methods-use-this: \"off\" */\nimport dh from '@deephaven/jsapi-shim';\nimport Log from '@deephaven/log';\nimport TableColumnFormatter, {\n TableColumnFormat,\n} from './TableColumnFormatter';\n\nconst log = Log.module('IntegerColumnFormatter');\n\nexport type IntegerColumnFormat = TableColumnFormat & {\n multiplier?: number;\n};\n\nexport type IntegerColumnFormatterOptions = {\n // Default format string to use. Defaults to IntegerColumnFormatter.DEFAULT_FORMAT_STRING\n defaultFormatString?: string;\n};\n\n/** Column formatter for integers/whole numbers */\nexport class IntegerColumnFormatter extends TableColumnFormatter {\n /**\n * Validates format object\n * @param format Format object\n * @returns true for valid object\n */\n static isValid(format: IntegerColumnFormat): boolean {\n try {\n dh.i18n.NumberFormat.format(format.formatString, 0);\n return true;\n } catch (e) {\n return false;\n }\n }\n\n /**\n * Create an IntegerColumnFormat object with the parameters specified\n * @param label Label for the format\n * @param formatString Format string for the format\n * @param multiplier Optional multiplier for the formatter\n * @param type Type of format created\n * @returns IntegerColumnFormat object\n */\n static makeFormat(\n label: string,\n formatString: string,\n type = TableColumnFormatter.TYPE_CONTEXT_PRESET,\n multiplier?: number\n ): IntegerColumnFormat {\n return {\n label,\n type,\n formatString,\n multiplier,\n };\n }\n\n /**\n * Convenient function to create a IntegerFormatObject with Preset type set\n * @param label Label for this format object\n * @param formatString Format string to use\n * @param multiplier Multiplier to use\n * @returns IntegerColumnFormat object\n */\n static makePresetFormat(\n label: string,\n formatString = '',\n multiplier?: number\n ): IntegerColumnFormat {\n return IntegerColumnFormatter.makeFormat(\n label,\n formatString,\n TableColumnFormatter.TYPE_CONTEXT_PRESET,\n multiplier\n );\n }\n\n /**\n * Convenient function to create a IntegerFormatObject with a default 'Custom Format' label and Custom type\n * @param formatString Format string to use\n * @param multiplier Multiplier to use\n * @returns IntegerColumnFormat object\n */\n static makeCustomFormat(\n formatString = '',\n multiplier?: number\n ): IntegerColumnFormat {\n return IntegerColumnFormatter.makeFormat(\n 'Custom Format',\n formatString,\n TableColumnFormatter.TYPE_CONTEXT_CUSTOM,\n multiplier\n );\n }\n\n /**\n * Check if the given formats match\n * @param formatA format object to check\n * @param formatB format object to check\n * @returns True if the formats match\n */\n static isSameFormat(\n formatA?: IntegerColumnFormat,\n formatB?: IntegerColumnFormat\n ): boolean {\n return (\n formatA === formatB ||\n (formatA != null &&\n formatB != null &&\n formatA.type === formatB.type &&\n formatA.formatString === formatB.formatString &&\n formatA.multiplier === formatB.multiplier)\n );\n }\n\n static DEFAULT_FORMAT_STRING = '###,##0';\n\n static FORMAT_MILLIONS = IntegerColumnFormatter.makePresetFormat(\n 'Millions',\n '###,##0.000 mm',\n 0.000001\n );\n\n defaultFormatString: string;\n\n constructor({\n defaultFormatString = IntegerColumnFormatter.DEFAULT_FORMAT_STRING,\n }: IntegerColumnFormatterOptions = {}) {\n super();\n\n this.defaultFormatString = defaultFormatString;\n }\n\n /**\n * Format a value with the provided format object\n * @param valueParam Value to format\n * @param format Format object\n * @returns Formatted string\n */\n format(valueParam: number, format: IntegerColumnFormat): string {\n const formatString =\n (format && format.formatString) || this.defaultFormatString;\n const value =\n format && format.multiplier ? valueParam * format.multiplier : valueParam;\n try {\n return dh.i18n.NumberFormat.format(formatString, value);\n } catch (e) {\n log.error('Invalid format arguments');\n }\n return '';\n }\n}\n\nexport default IntegerColumnFormatter;\n"],"file":"IntegerColumnFormatter.js"}
@@ -1,8 +1,8 @@
1
- export { default as BooleanColumnFormatter } from "./BooleanColumnFormatter";
2
- export { default as CharColumnFormatter } from "./CharColumnFormatter";
3
- export { default as DateTimeColumnFormatter } from "./DateTimeColumnFormatter";
4
- export { default as DecimalColumnFormatter } from "./DecimalColumnFormatter";
5
- export { default as DefaultColumnFormatter } from "./DefaultColumnFormatter";
6
- export { default as IntegerColumnFormatter } from "./IntegerColumnFormatter";
7
- export { default as TableColumnFormatter } from "./TableColumnFormatter";
1
+ export { default as BooleanColumnFormatter } from './BooleanColumnFormatter';
2
+ export { default as CharColumnFormatter } from './CharColumnFormatter';
3
+ export * from './DateTimeColumnFormatter';
4
+ export * from './DecimalColumnFormatter';
5
+ export { default as DefaultColumnFormatter } from './DefaultColumnFormatter';
6
+ export * from './IntegerColumnFormatter';
7
+ export { default as TableColumnFormatter } from './TableColumnFormatter';
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/formatters/index.js"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/formatters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvE,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -1,8 +1,8 @@
1
1
  export { default as BooleanColumnFormatter } from "./BooleanColumnFormatter.js";
2
2
  export { default as CharColumnFormatter } from "./CharColumnFormatter.js";
3
- export { default as DateTimeColumnFormatter } from "./DateTimeColumnFormatter.js";
4
- export { default as DecimalColumnFormatter } from "./DecimalColumnFormatter.js";
3
+ export * from "./DateTimeColumnFormatter.js";
4
+ export * from "./DecimalColumnFormatter.js";
5
5
  export { default as DefaultColumnFormatter } from "./DefaultColumnFormatter.js";
6
- export { default as IntegerColumnFormatter } from "./IntegerColumnFormatter.js";
6
+ export * from "./IntegerColumnFormatter.js";
7
7
  export { default as TableColumnFormatter } from "./TableColumnFormatter.js";
8
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/formatters/index.js"],"names":["default","BooleanColumnFormatter","CharColumnFormatter","DateTimeColumnFormatter","DecimalColumnFormatter","DefaultColumnFormatter","IntegerColumnFormatter","TableColumnFormatter"],"mappings":"SAASA,OAAO,IAAIC,sB;SACXD,OAAO,IAAIE,mB;SACXF,OAAO,IAAIG,uB;SACXH,OAAO,IAAII,sB;SACXJ,OAAO,IAAIK,sB;SACXL,OAAO,IAAIM,sB;SACXN,OAAO,IAAIO,oB","sourcesContent":["export { default as BooleanColumnFormatter } from './BooleanColumnFormatter';\nexport { default as CharColumnFormatter } from './CharColumnFormatter';\nexport { default as DateTimeColumnFormatter } from './DateTimeColumnFormatter';\nexport { default as DecimalColumnFormatter } from './DecimalColumnFormatter';\nexport { default as DefaultColumnFormatter } from './DefaultColumnFormatter';\nexport { default as IntegerColumnFormatter } from './IntegerColumnFormatter';\nexport { default as TableColumnFormatter } from './TableColumnFormatter';\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../../src/formatters/index.ts"],"names":["default","BooleanColumnFormatter","CharColumnFormatter","DefaultColumnFormatter","TableColumnFormatter"],"mappings":"SAASA,OAAO,IAAIC,sB;SACXD,OAAO,IAAIE,mB;;;SAGXF,OAAO,IAAIG,sB;;SAEXH,OAAO,IAAII,oB","sourcesContent":["export { default as BooleanColumnFormatter } from './BooleanColumnFormatter';\nexport { default as CharColumnFormatter } from './CharColumnFormatter';\nexport * from './DateTimeColumnFormatter';\nexport * from './DecimalColumnFormatter';\nexport { default as DefaultColumnFormatter } from './DefaultColumnFormatter';\nexport * from './IntegerColumnFormatter';\nexport { default as TableColumnFormatter } from './TableColumnFormatter';\n"],"file":"index.js"}
@@ -1 +1 @@
1
- {"version":3,"file":"TableCsvExporter.d.ts","sourceRoot":"","sources":["../../src/sidebar/TableCsvExporter.jsx"],"names":[],"mappings":";AAaA;IACE,oCAAkD;IAElD;;;;;MAKE;IAEF;;;;MAIE;IAEF;;;MAGE;IAEF,qCAAmC;IAEnC,4BAKC;IAED,wBAyBC;IAwDD,4BA2BC;IAED,8CAEC;IAED,wDAEC;IAED,sDAEC;IA7FD,2BAgDC;IAED,2BAEC;IA2CD,+BAkCC;CAmLF;;;;;;;;;;;;;;;QAgBkB,0CAAQ"}
1
+ {"version":3,"file":"TableCsvExporter.d.ts","sourceRoot":"","sources":["../../src/sidebar/TableCsvExporter.jsx"],"names":[],"mappings":";AAaA;IACE,oCAAkD;IAElD;;;;;MAKE;IAEF;;;;MAIE;IAEF;;;MAGE;IAEF,qCAAmC;IAEnC,4BAKC;IAED,wBAyBC;IAwDD,4BA2BC;IAED,8CAEC;IAED,wDAEC;IAED,sDAEC;IA7FD,2BAgDC;IAED,2BAEC;IA2CD,+BAkCC;CA8LF;;;;;;;;;;;;;;;QAgBkB,0CAAQ"}
@@ -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":"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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 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"}