@deephaven/iris-grid 0.48.1-beta.0 → 0.48.1-beta.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.
Files changed (41) hide show
  1. package/dist/GotoRow.d.ts +5 -2
  2. package/dist/GotoRow.d.ts.map +1 -1
  3. package/dist/GotoRow.js +15 -7
  4. package/dist/GotoRow.js.map +1 -1
  5. package/dist/IrisGrid.d.ts +2 -0
  6. package/dist/IrisGrid.d.ts.map +1 -1
  7. package/dist/IrisGrid.js +31 -21
  8. package/dist/IrisGrid.js.map +1 -1
  9. package/dist/IrisGridCellOverflowModal.d.ts.map +1 -1
  10. package/dist/IrisGridCellOverflowModal.js.map +1 -1
  11. package/dist/IrisGridTableModelTemplate.js.map +1 -1
  12. package/dist/IrisGridUtils.js.map +1 -1
  13. package/dist/sidebar/ChartBuilder.d.ts.map +1 -1
  14. package/dist/sidebar/ChartBuilder.js.map +1 -1
  15. package/dist/sidebar/CustomColumnInput.js.map +1 -1
  16. package/dist/sidebar/TableSaver.d.ts +2 -1
  17. package/dist/sidebar/TableSaver.d.ts.map +1 -1
  18. package/dist/sidebar/TableSaver.js +16 -20
  19. package/dist/sidebar/TableSaver.js.map +1 -1
  20. package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js.map +1 -1
  21. package/dist/sidebar/conditional-formatting/ConditionEditor.js +1 -1
  22. package/dist/sidebar/conditional-formatting/ConditionEditor.js.map +1 -1
  23. package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js.map +1 -1
  24. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js.map +1 -1
  25. package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.d.ts.map +1 -1
  26. package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js.map +1 -1
  27. package/dist/sidebar/conditional-formatting/RowFormatEditor.js.map +1 -1
  28. package/dist/sidebar/conditional-formatting/StyleEditor.js.map +1 -1
  29. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.d.ts.map +1 -1
  30. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js.map +1 -1
  31. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.js.map +1 -1
  32. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js.map +1 -1
  33. package/dist/sidebar/visibility-ordering-builder/sortable-tree/PointerSensorWithInteraction.d.ts.map +1 -1
  34. package/dist/sidebar/visibility-ordering-builder/sortable-tree/PointerSensorWithInteraction.js.map +1 -1
  35. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.d.ts.map +1 -1
  36. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.js.map +1 -1
  37. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.d.ts.map +1 -1
  38. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js.map +1 -1
  39. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.d.ts.map +1 -1
  40. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js.map +1 -1
  41. package/package.json +15 -15
@@ -1 +1 @@
1
- {"version":3,"file":"ChartBuilder.js","names":["React","PureComponent","classNames","FontAwesomeIcon","Button","RadioGroup","RadioItem","vsLink","dhUnlink","dhTable","dhNewCircleLargeFilled","vsCircleLargeFilled","vsTrash","Log","shortid","BarIcon","HistogramIcon","LineIcon","PieIcon","ScatterIcon","log","module","ChartBuilder","getMaxSeriesCount","dh","type","plot","SeriesPlotStyle","PIE","HISTOGRAM","makeSeriesItem","value","id","generate","makeDefaultSeriesItems","columns","maxSeriesCount","length","name","getDefaultXAxis","constructor","props","handleAddSeries","bind","handleLinkStateChange","handleReset","handleSeriesChange","handleSeriesDeleteClick","handleSubmit","handleTypeClick","handleXAxisChange","sendChange","model","getTypes","xAxis","seriesItems","state","isLinked","LINE","BAR","SCATTER","getTypeName","getTypeIcon","getXAxisLabel","getSeriesLabel","setState","newSeriesItems","push","event","target","index","getAttribute","intIndex","parseInt","changeEvent","splice","preventDefault","onSubmit","series","map","item","debug2","slice","onChange","render","xAxisLabel","seriesLabel","isSeriesVisible","isAddSeriesVisible","chartType","key","active","column","seriesItem","i"],"sources":["../../src/sidebar/ChartBuilder.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Button, RadioGroup, RadioItem } from '@deephaven/components';\nimport {\n vsLink,\n dhUnlink,\n dhTable,\n dhNewCircleLargeFilled,\n vsCircleLargeFilled,\n vsTrash,\n} from '@deephaven/icons';\nimport type {\n Column,\n dh as DhType,\n SeriesPlotStyle,\n} from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport shortid from 'shortid';\nimport {\n BarIcon,\n HistogramIcon,\n LineIcon,\n PieIcon,\n ScatterIcon,\n} from './icons';\nimport './ChartBuilder.scss';\nimport IrisGridModel from '../IrisGridModel';\n\nconst log = Log.module('ChartBuilder');\n\nexport type ChartBuilderSettings = {\n type: SeriesPlotStyle;\n series: string[];\n xAxis: string;\n isLinked: boolean;\n};\nexport type SeriesItem = {\n id: string;\n value: string;\n};\n\ninterface ChartBuilderProps {\n model: IrisGridModel;\n onSubmit: (obj: ChartBuilderSettings) => void;\n onChange: (obj: ChartBuilderSettings) => void;\n}\ninterface ChartBuilderState {\n /** The selected chart type */\n type: SeriesPlotStyle;\n\n /** Array of column names of the series to display */\n seriesItems: readonly SeriesItem[];\n\n /** The column name to use as the x-axis */\n xAxis: string;\n\n /** Whether the newly created chart should be linked with the table (update when filters update) */\n isLinked: boolean;\n}\n/**\n * Form for configuring all the settings when creating a console.\n */\nclass ChartBuilder extends PureComponent<ChartBuilderProps, ChartBuilderState> {\n static getMaxSeriesCount(dh: DhType, type: SeriesPlotStyle): number {\n switch (type) {\n case dh.plot.SeriesPlotStyle.PIE:\n return 1;\n case dh.plot.SeriesPlotStyle.HISTOGRAM:\n return 0;\n default:\n return 100;\n }\n }\n\n static makeSeriesItem(value: string): SeriesItem {\n return { id: shortid.generate(), value };\n }\n\n static makeDefaultSeriesItems(\n dh: DhType,\n type: SeriesPlotStyle,\n columns: readonly Column[]\n ): SeriesItem[] {\n const maxSeriesCount = ChartBuilder.getMaxSeriesCount(dh, type);\n if (maxSeriesCount === 0 || columns == null || columns.length === 0) {\n return [];\n }\n\n const value = columns.length > 1 ? columns[1].name : columns[0].name;\n return [ChartBuilder.makeSeriesItem(value)];\n }\n\n static getDefaultXAxis(\n type: SeriesPlotStyle,\n columns: readonly Column[]\n ): string | null {\n if (columns != null && columns.length > 0) {\n return columns[0].name;\n }\n\n return null;\n }\n\n constructor(props: ChartBuilderProps) {\n super(props);\n\n this.handleAddSeries = this.handleAddSeries.bind(this);\n this.handleLinkStateChange = this.handleLinkStateChange.bind(this);\n this.handleReset = this.handleReset.bind(this);\n this.handleSeriesChange = this.handleSeriesChange.bind(this);\n this.handleSeriesDeleteClick = this.handleSeriesDeleteClick.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleTypeClick = this.handleTypeClick.bind(this);\n this.handleXAxisChange = this.handleXAxisChange.bind(this);\n this.sendChange = this.sendChange.bind(this);\n\n const { model } = props;\n const { columns, dh } = model;\n\n const type = this.getTypes()[0];\n const xAxis = ChartBuilder.getDefaultXAxis(type, columns) as string;\n const seriesItems = ChartBuilder.makeDefaultSeriesItems(dh, type, columns);\n\n this.state = {\n /** The selected chart type */\n type,\n\n /** Array of column names of the series to display */\n seriesItems,\n\n /** The column name to use as the x-axis */\n xAxis,\n\n /** Whether the newly created chart should be linked with the table (update when filters update) */\n isLinked: true,\n };\n }\n\n getTypes() {\n const { model } = this.props;\n const { dh } = model;\n return [\n dh.plot.SeriesPlotStyle.LINE,\n dh.plot.SeriesPlotStyle.BAR,\n dh.plot.SeriesPlotStyle.SCATTER,\n dh.plot.SeriesPlotStyle.PIE,\n // IDS-6808: Disable Histogram in Chart Builder until we pipe histogram creation through the API\n // dh.plot.SeriesPlotStyle.HISTOGRAM,\n ];\n }\n\n /**\n * Converts the provided chart type into a readable type.\n * Just replaces underscores with spaces and capitals the first letter of each word.\n */\n getTypeName(type: SeriesPlotStyle): string | SeriesPlotStyle {\n const { model } = this.props;\n const { dh } = model;\n switch (type) {\n case dh.plot.SeriesPlotStyle.LINE:\n return 'Line';\n case dh.plot.SeriesPlotStyle.BAR:\n return 'Bar';\n case dh.plot.SeriesPlotStyle.SCATTER:\n return 'Scatter';\n case dh.plot.SeriesPlotStyle.PIE:\n return 'Pie';\n case dh.plot.SeriesPlotStyle.HISTOGRAM:\n return 'Histogram';\n default:\n return type;\n }\n }\n\n getTypeIcon(type: SeriesPlotStyle): React.ReactElement | null {\n const { model } = this.props;\n const { dh } = model;\n switch (type) {\n case dh.plot.SeriesPlotStyle.LINE:\n return <LineIcon />;\n case dh.plot.SeriesPlotStyle.BAR:\n return <BarIcon />;\n case dh.plot.SeriesPlotStyle.SCATTER:\n return <ScatterIcon />;\n case dh.plot.SeriesPlotStyle.PIE:\n return <PieIcon />;\n case dh.plot.SeriesPlotStyle.HISTOGRAM:\n return <HistogramIcon />;\n default:\n return null;\n }\n }\n\n getXAxisLabel(type: SeriesPlotStyle): string {\n const { model } = this.props;\n const { dh } = model;\n switch (type) {\n case dh.plot.SeriesPlotStyle.PIE:\n return 'Labels';\n case dh.plot.SeriesPlotStyle.HISTOGRAM:\n return 'Data';\n default:\n return 'X-Axis';\n }\n }\n\n getSeriesLabel(type: SeriesPlotStyle): string {\n const { model } = this.props;\n const { dh } = model;\n switch (type) {\n case dh.plot.SeriesPlotStyle.PIE:\n return 'Values';\n default:\n return 'Series';\n }\n }\n\n handleAddSeries(): void {\n this.setState(state => {\n const { seriesItems } = state;\n const newSeriesItems = [...seriesItems];\n\n const { model } = this.props;\n const { columns } = model;\n newSeriesItems.push({\n id: shortid.generate(),\n value: columns[0].name,\n });\n\n return { seriesItems: newSeriesItems };\n }, this.sendChange);\n }\n\n handleLinkStateChange(event: React.ChangeEvent<HTMLInputElement>): void {\n this.setState({ isLinked: event.target.value === 'true' }, this.sendChange);\n }\n\n handleReset(): void {\n const { model } = this.props;\n const { columns, dh } = model;\n\n const type = this.getTypes()[0];\n const xAxis = ChartBuilder.getDefaultXAxis(type, columns) as string;\n const seriesItems = ChartBuilder.makeDefaultSeriesItems(dh, type, columns);\n const isLinked = true;\n\n this.setState({ type, seriesItems, xAxis, isLinked }, this.sendChange);\n }\n\n handleSeriesChange(event: React.ChangeEvent<HTMLSelectElement>): void {\n const { value } = event.target;\n const index = event.target.getAttribute('data-index') as string;\n const intIndex = parseInt(index, 10);\n\n this.setState(state => {\n let { seriesItems } = state;\n\n seriesItems = [...seriesItems];\n seriesItems[intIndex].value = value;\n\n return { seriesItems };\n }, this.sendChange);\n }\n\n handleSeriesDeleteClick(event: React.MouseEvent<HTMLButtonElement>): void {\n const changeEvent =\n event as unknown as React.ChangeEvent<HTMLButtonElement>;\n const index = changeEvent.target.getAttribute('data-index') as string;\n const intIndex = parseInt(index, 10);\n\n this.setState(state => {\n const { seriesItems } = state;\n const newSeriesItems = [...seriesItems];\n\n newSeriesItems.splice(intIndex, 1);\n\n return { seriesItems: newSeriesItems };\n }, this.sendChange);\n }\n\n handleSubmit(event: React.FormEvent<HTMLFormElement>): void {\n event.preventDefault();\n\n const { onSubmit } = this.props;\n const { type, seriesItems, xAxis, isLinked } = this.state;\n const series = seriesItems.map(item => item.value);\n onSubmit({\n type,\n series,\n xAxis,\n isLinked,\n });\n }\n\n handleTypeClick(event: React.MouseEvent<HTMLButtonElement>): void {\n const changeEvent =\n event as unknown as React.ChangeEvent<HTMLButtonElement>;\n const index = changeEvent.target.getAttribute('data-index') as string;\n const intIndex = parseInt(index, 10);\n\n const type = this.getTypes()[intIndex];\n\n log.debug2('handleTypeSelect', type);\n\n this.setState(state => {\n const { model } = this.props;\n const { dh } = model;\n const maxSeriesCount = ChartBuilder.getMaxSeriesCount(dh, type);\n let { seriesItems } = state;\n seriesItems = seriesItems.slice(0, maxSeriesCount);\n if (seriesItems.length === 0 && maxSeriesCount > 0) {\n const { columns } = model;\n seriesItems = ChartBuilder.makeDefaultSeriesItems(dh, type, columns);\n }\n\n return { type, seriesItems };\n }, this.sendChange);\n }\n\n handleXAxisChange(event: React.ChangeEvent<HTMLSelectElement>): void {\n const xAxis = event.target.value;\n log.debug2('x-axis change', xAxis);\n\n this.setState({ xAxis }, this.sendChange);\n }\n\n sendChange(): void {\n const { onChange } = this.props;\n const { isLinked, type, seriesItems, xAxis } = this.state;\n const series = seriesItems.map(item => item.value);\n\n onChange({ type, series, xAxis, isLinked });\n }\n\n render(): JSX.Element {\n const { model } = this.props;\n const { columns, dh } = model;\n const { seriesItems, type, xAxis, isLinked } = this.state;\n const maxSeriesCount = ChartBuilder.getMaxSeriesCount(dh, type);\n const xAxisLabel = this.getXAxisLabel(type);\n const seriesLabel = this.getSeriesLabel(type);\n const isSeriesVisible = seriesItems.length > 0;\n const isAddSeriesVisible = seriesItems.length < maxSeriesCount;\n\n return (\n <div className=\"chart-builder\">\n <form onSubmit={this.handleSubmit}>\n <div className=\"form-row\">\n <label>Select Chart Type</label>\n <div className=\"form-row\">\n {this.getTypes().map((chartType, index) => {\n const key = chartType as unknown as React.Key;\n return (\n <div key={key} className=\"col col-chart-type\">\n <button\n type=\"button\"\n className={classNames(\n 'btn',\n 'btn-icon',\n 'btn-chart-type',\n {\n active: chartType === type,\n }\n )}\n data-index={index}\n onClick={this.handleTypeClick}\n >\n {this.getTypeIcon(chartType)}\n {this.getTypeName(chartType)}\n </button>\n </div>\n );\n })}\n </div>\n </div>\n <hr />\n <div className=\"form-row form-inline\">\n <label className=\"col-2 label-left\">{xAxisLabel}</label>\n <select\n className=\"form-control custom-select select-x-axis col\"\n value={xAxis}\n onChange={this.handleXAxisChange}\n >\n {columns.map(column => (\n <option key={column.name} value={column.name}>\n {column.name}\n </option>\n ))}\n </select>\n </div>\n {isSeriesVisible && <hr />}\n {seriesItems.map((seriesItem, i) => (\n <div\n className=\"form-row form-inline form-series-item\"\n key={seriesItem.id}\n data-testid={`form-series-item-${i}`}\n >\n <label className=\"col-2 label-left\">\n {i === 0 ? seriesLabel : ''}\n </label>\n <select\n className=\"form-control custom-select select-series col\"\n value={seriesItem.value}\n onChange={this.handleSeriesChange}\n data-testid={`select-series-item-${i}`}\n data-index={i}\n >\n {columns.map(column => (\n <option key={column.name} value={column.name} data-index={i}>\n {column.name}\n </option>\n ))}\n </select>\n {seriesItems.length > 1 && (\n <Button\n kind=\"ghost\"\n className=\"btn-delete-series ml-2 px-2\"\n data-index={i}\n data-testid={`delete-series-${i}`}\n onClick={this.handleSeriesDeleteClick}\n icon={vsTrash}\n tooltip=\"Delete\"\n />\n )}\n </div>\n ))}\n {isAddSeriesVisible && (\n <div className=\"form-row\">\n <div className=\"col-2\" />\n <Button\n kind=\"ghost\"\n className=\"btn-add-series mt-1\"\n onClick={this.handleAddSeries}\n icon={dhNewCircleLargeFilled}\n >\n Add Series\n </Button>\n </div>\n )}\n <div className=\"form-row chart-builder-link\">\n <label className=\"col-2 label-right\">\n <div className=\"fa-md fa-layers\">\n <FontAwesomeIcon\n mask={dhTable}\n icon={vsCircleLargeFilled}\n transform=\"right-5 down-5\"\n />\n <FontAwesomeIcon\n icon={isLinked ? vsLink : dhUnlink}\n transform=\"grow-2 right-8 down-6\"\n />\n </div>\n </label>\n <RadioGroup\n onChange={this.handleLinkStateChange}\n value={`${isLinked}`}\n >\n <RadioItem value=\"true\">Sync State</RadioItem>\n <RadioItem value=\"false\">Freeze State</RadioItem>\n </RadioGroup>\n </div>\n <div className=\"form-row\">\n <div className=\"col-2 label-right\" />\n <div className=\"col chart-builder-link-info\">\n {isLinked\n ? 'Charts with synced state will update to match any filters or user modifications applied to the parent table.'\n : 'Freeze State disconnects the chart state from the parent table. New filters or user modifications on the parent table will not be applied.'}\n </div>\n </div>\n <div\n className={classNames('form-row', 'justify-content-end', 'my-3')}\n >\n <Button\n kind=\"secondary\"\n className=\"btn-reset\"\n onClick={this.handleReset}\n >\n Reset\n </Button>\n <Button kind=\"primary\" type=\"submit\" className=\"btn-submit\">\n Create\n </Button>\n </div>\n </form>\n </div>\n );\n }\n}\n\nexport default ChartBuilder;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,aAAa,QAAQ,OAAO;AAC5C,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,MAAM,EAAEC,UAAU,EAAEC,SAAS,QAAQ,uBAAuB;AACrE,SACEC,MAAM,EACNC,QAAQ,EACRC,OAAO,EACPC,sBAAsB,EACtBC,mBAAmB,EACnBC,OAAO,QACF,kBAAkB;AAMzB,OAAOC,GAAG,MAAM,gBAAgB;AAChC,OAAOC,OAAO,MAAM,SAAS;AAAC,SAE5BC,OAAO,EACPC,aAAa,EACbC,QAAQ,EACRC,OAAO,EACPC,WAAW;AAAA;AAAA;AAAA;AAKb,IAAMC,GAAG,GAAGP,GAAG,CAACQ,MAAM,CAAC,cAAc,CAAC;AA+BtC;AACA;AACA;AACA,MAAMC,YAAY,SAASrB,aAAa,CAAuC;EAC7E,OAAOsB,iBAAiB,CAACC,EAAU,EAAEC,IAAqB,EAAU;IAClE,QAAQA,IAAI;MACV,KAAKD,EAAE,CAACE,IAAI,CAACC,eAAe,CAACC,GAAG;QAC9B,OAAO,CAAC;MACV,KAAKJ,EAAE,CAACE,IAAI,CAACC,eAAe,CAACE,SAAS;QACpC,OAAO,CAAC;MACV;QACE,OAAO,GAAG;IAAC;EAEjB;EAEA,OAAOC,cAAc,CAACC,KAAa,EAAc;IAC/C,OAAO;MAAEC,EAAE,EAAElB,OAAO,CAACmB,QAAQ,EAAE;MAAEF;IAAM,CAAC;EAC1C;EAEA,OAAOG,sBAAsB,CAC3BV,EAAU,EACVC,IAAqB,EACrBU,OAA0B,EACZ;IACd,IAAMC,cAAc,GAAGd,YAAY,CAACC,iBAAiB,CAACC,EAAE,EAAEC,IAAI,CAAC;IAC/D,IAAIW,cAAc,KAAK,CAAC,IAAID,OAAO,IAAI,IAAI,IAAIA,OAAO,CAACE,MAAM,KAAK,CAAC,EAAE;MACnE,OAAO,EAAE;IACX;IAEA,IAAMN,KAAK,GAAGI,OAAO,CAACE,MAAM,GAAG,CAAC,GAAGF,OAAO,CAAC,CAAC,CAAC,CAACG,IAAI,GAAGH,OAAO,CAAC,CAAC,CAAC,CAACG,IAAI;IACpE,OAAO,CAAChB,YAAY,CAACQ,cAAc,CAACC,KAAK,CAAC,CAAC;EAC7C;EAEA,OAAOQ,eAAe,CACpBd,IAAqB,EACrBU,OAA0B,EACX;IACf,IAAIA,OAAO,IAAI,IAAI,IAAIA,OAAO,CAACE,MAAM,GAAG,CAAC,EAAE;MACzC,OAAOF,OAAO,CAAC,CAAC,CAAC,CAACG,IAAI;IACxB;IAEA,OAAO,IAAI;EACb;EAEAE,WAAW,CAACC,KAAwB,EAAE;IACpC,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACC,eAAe,GAAG,IAAI,CAACA,eAAe,CAACC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACC,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAACD,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAACE,WAAW,GAAG,IAAI,CAACA,WAAW,CAACF,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAACG,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACH,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAACI,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAACJ,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAACK,YAAY,GAAG,IAAI,CAACA,YAAY,CAACL,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACM,eAAe,GAAG,IAAI,CAACA,eAAe,CAACN,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACO,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACP,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACQ,UAAU,GAAG,IAAI,CAACA,UAAU,CAACR,IAAI,CAAC,IAAI,CAAC;IAE5C,IAAM;MAAES;IAAM,CAAC,GAAGX,KAAK;IACvB,IAAM;MAAEN,OAAO;MAAEX;IAAG,CAAC,GAAG4B,KAAK;IAE7B,IAAM3B,IAAI,GAAG,IAAI,CAAC4B,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC/B,IAAMC,KAAK,GAAGhC,YAAY,CAACiB,eAAe,CAACd,IAAI,EAAEU,OAAO,CAAW;IACnE,IAAMoB,WAAW,GAAGjC,YAAY,CAACY,sBAAsB,CAACV,EAAE,EAAEC,IAAI,EAAEU,OAAO,CAAC;IAE1E,IAAI,CAACqB,KAAK,GAAG;MACX;MACA/B,IAAI;MAEJ;MACA8B,WAAW;MAEX;MACAD,KAAK;MAEL;MACAG,QAAQ,EAAE;IACZ,CAAC;EACH;EAEAJ,QAAQ,GAAG;IACT,IAAM;MAAED;IAAM,CAAC,GAAG,IAAI,CAACX,KAAK;IAC5B,IAAM;MAAEjB;IAAG,CAAC,GAAG4B,KAAK;IACpB,OAAO,CACL5B,EAAE,CAACE,IAAI,CAACC,eAAe,CAAC+B,IAAI,EAC5BlC,EAAE,CAACE,IAAI,CAACC,eAAe,CAACgC,GAAG,EAC3BnC,EAAE,CAACE,IAAI,CAACC,eAAe,CAACiC,OAAO,EAC/BpC,EAAE,CAACE,IAAI,CAACC,eAAe,CAACC;IACxB;IACA;IAAA,CACD;EACH;;EAEA;AACF;AACA;AACA;EACEiC,WAAW,CAACpC,IAAqB,EAA4B;IAC3D,IAAM;MAAE2B;IAAM,CAAC,GAAG,IAAI,CAACX,KAAK;IAC5B,IAAM;MAAEjB;IAAG,CAAC,GAAG4B,KAAK;IACpB,QAAQ3B,IAAI;MACV,KAAKD,EAAE,CAACE,IAAI,CAACC,eAAe,CAAC+B,IAAI;QAC/B,OAAO,MAAM;MACf,KAAKlC,EAAE,CAACE,IAAI,CAACC,eAAe,CAACgC,GAAG;QAC9B,OAAO,KAAK;MACd,KAAKnC,EAAE,CAACE,IAAI,CAACC,eAAe,CAACiC,OAAO;QAClC,OAAO,SAAS;MAClB,KAAKpC,EAAE,CAACE,IAAI,CAACC,eAAe,CAACC,GAAG;QAC9B,OAAO,KAAK;MACd,KAAKJ,EAAE,CAACE,IAAI,CAACC,eAAe,CAACE,SAAS;QACpC,OAAO,WAAW;MACpB;QACE,OAAOJ,IAAI;IAAC;EAElB;EAEAqC,WAAW,CAACrC,IAAqB,EAA6B;IAC5D,IAAM;MAAE2B;IAAM,CAAC,GAAG,IAAI,CAACX,KAAK;IAC5B,IAAM;MAAEjB;IAAG,CAAC,GAAG4B,KAAK;IACpB,QAAQ3B,IAAI;MACV,KAAKD,EAAE,CAACE,IAAI,CAACC,eAAe,CAAC+B,IAAI;QAC/B,oBAAO,KAAC,QAAQ,KAAG;MACrB,KAAKlC,EAAE,CAACE,IAAI,CAACC,eAAe,CAACgC,GAAG;QAC9B,oBAAO,KAAC,OAAO,KAAG;MACpB,KAAKnC,EAAE,CAACE,IAAI,CAACC,eAAe,CAACiC,OAAO;QAClC,oBAAO,KAAC,WAAW,KAAG;MACxB,KAAKpC,EAAE,CAACE,IAAI,CAACC,eAAe,CAACC,GAAG;QAC9B,oBAAO,KAAC,OAAO,KAAG;MACpB,KAAKJ,EAAE,CAACE,IAAI,CAACC,eAAe,CAACE,SAAS;QACpC,oBAAO,KAAC,aAAa,KAAG;MAC1B;QACE,OAAO,IAAI;IAAC;EAElB;EAEAkC,aAAa,CAACtC,IAAqB,EAAU;IAC3C,IAAM;MAAE2B;IAAM,CAAC,GAAG,IAAI,CAACX,KAAK;IAC5B,IAAM;MAAEjB;IAAG,CAAC,GAAG4B,KAAK;IACpB,QAAQ3B,IAAI;MACV,KAAKD,EAAE,CAACE,IAAI,CAACC,eAAe,CAACC,GAAG;QAC9B,OAAO,QAAQ;MACjB,KAAKJ,EAAE,CAACE,IAAI,CAACC,eAAe,CAACE,SAAS;QACpC,OAAO,MAAM;MACf;QACE,OAAO,QAAQ;IAAC;EAEtB;EAEAmC,cAAc,CAACvC,IAAqB,EAAU;IAC5C,IAAM;MAAE2B;IAAM,CAAC,GAAG,IAAI,CAACX,KAAK;IAC5B,IAAM;MAAEjB;IAAG,CAAC,GAAG4B,KAAK;IACpB,QAAQ3B,IAAI;MACV,KAAKD,EAAE,CAACE,IAAI,CAACC,eAAe,CAACC,GAAG;QAC9B,OAAO,QAAQ;MACjB;QACE,OAAO,QAAQ;IAAC;EAEtB;EAEAc,eAAe,GAAS;IACtB,IAAI,CAACuB,QAAQ,CAACT,KAAK,IAAI;MACrB,IAAM;QAAED;MAAY,CAAC,GAAGC,KAAK;MAC7B,IAAMU,cAAc,GAAG,CAAC,GAAGX,WAAW,CAAC;MAEvC,IAAM;QAAEH;MAAM,CAAC,GAAG,IAAI,CAACX,KAAK;MAC5B,IAAM;QAAEN;MAAQ,CAAC,GAAGiB,KAAK;MACzBc,cAAc,CAACC,IAAI,CAAC;QAClBnC,EAAE,EAAElB,OAAO,CAACmB,QAAQ,EAAE;QACtBF,KAAK,EAAEI,OAAO,CAAC,CAAC,CAAC,CAACG;MACpB,CAAC,CAAC;MAEF,OAAO;QAAEiB,WAAW,EAAEW;MAAe,CAAC;IACxC,CAAC,EAAE,IAAI,CAACf,UAAU,CAAC;EACrB;EAEAP,qBAAqB,CAACwB,KAA0C,EAAQ;IACtE,IAAI,CAACH,QAAQ,CAAC;MAAER,QAAQ,EAAEW,KAAK,CAACC,MAAM,CAACtC,KAAK,KAAK;IAAO,CAAC,EAAE,IAAI,CAACoB,UAAU,CAAC;EAC7E;EAEAN,WAAW,GAAS;IAClB,IAAM;MAAEO;IAAM,CAAC,GAAG,IAAI,CAACX,KAAK;IAC5B,IAAM;MAAEN,OAAO;MAAEX;IAAG,CAAC,GAAG4B,KAAK;IAE7B,IAAM3B,IAAI,GAAG,IAAI,CAAC4B,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC/B,IAAMC,KAAK,GAAGhC,YAAY,CAACiB,eAAe,CAACd,IAAI,EAAEU,OAAO,CAAW;IACnE,IAAMoB,WAAW,GAAGjC,YAAY,CAACY,sBAAsB,CAACV,EAAE,EAAEC,IAAI,EAAEU,OAAO,CAAC;IAC1E,IAAMsB,QAAQ,GAAG,IAAI;IAErB,IAAI,CAACQ,QAAQ,CAAC;MAAExC,IAAI;MAAE8B,WAAW;MAAED,KAAK;MAAEG;IAAS,CAAC,EAAE,IAAI,CAACN,UAAU,CAAC;EACxE;EAEAL,kBAAkB,CAACsB,KAA2C,EAAQ;IACpE,IAAM;MAAErC;IAAM,CAAC,GAAGqC,KAAK,CAACC,MAAM;IAC9B,IAAMC,KAAK,GAAGF,KAAK,CAACC,MAAM,CAACE,YAAY,CAAC,YAAY,CAAW;IAC/D,IAAMC,QAAQ,GAAGC,QAAQ,CAACH,KAAK,EAAE,EAAE,CAAC;IAEpC,IAAI,CAACL,QAAQ,CAACT,KAAK,IAAI;MACrB,IAAI;QAAED;MAAY,CAAC,GAAGC,KAAK;MAE3BD,WAAW,GAAG,CAAC,GAAGA,WAAW,CAAC;MAC9BA,WAAW,CAACiB,QAAQ,CAAC,CAACzC,KAAK,GAAGA,KAAK;MAEnC,OAAO;QAAEwB;MAAY,CAAC;IACxB,CAAC,EAAE,IAAI,CAACJ,UAAU,CAAC;EACrB;EAEAJ,uBAAuB,CAACqB,KAA0C,EAAQ;IACxE,IAAMM,WAAW,GACfN,KAAwD;IAC1D,IAAME,KAAK,GAAGI,WAAW,CAACL,MAAM,CAACE,YAAY,CAAC,YAAY,CAAW;IACrE,IAAMC,QAAQ,GAAGC,QAAQ,CAACH,KAAK,EAAE,EAAE,CAAC;IAEpC,IAAI,CAACL,QAAQ,CAACT,KAAK,IAAI;MACrB,IAAM;QAAED;MAAY,CAAC,GAAGC,KAAK;MAC7B,IAAMU,cAAc,GAAG,CAAC,GAAGX,WAAW,CAAC;MAEvCW,cAAc,CAACS,MAAM,CAACH,QAAQ,EAAE,CAAC,CAAC;MAElC,OAAO;QAAEjB,WAAW,EAAEW;MAAe,CAAC;IACxC,CAAC,EAAE,IAAI,CAACf,UAAU,CAAC;EACrB;EAEAH,YAAY,CAACoB,KAAuC,EAAQ;IAC1DA,KAAK,CAACQ,cAAc,EAAE;IAEtB,IAAM;MAAEC;IAAS,CAAC,GAAG,IAAI,CAACpC,KAAK;IAC/B,IAAM;MAAEhB,IAAI;MAAE8B,WAAW;MAAED,KAAK;MAAEG;IAAS,CAAC,GAAG,IAAI,CAACD,KAAK;IACzD,IAAMsB,MAAM,GAAGvB,WAAW,CAACwB,GAAG,CAACC,IAAI,IAAIA,IAAI,CAACjD,KAAK,CAAC;IAClD8C,QAAQ,CAAC;MACPpD,IAAI;MACJqD,MAAM;MACNxB,KAAK;MACLG;IACF,CAAC,CAAC;EACJ;EAEAR,eAAe,CAACmB,KAA0C,EAAQ;IAChE,IAAMM,WAAW,GACfN,KAAwD;IAC1D,IAAME,KAAK,GAAGI,WAAW,CAACL,MAAM,CAACE,YAAY,CAAC,YAAY,CAAW;IACrE,IAAMC,QAAQ,GAAGC,QAAQ,CAACH,KAAK,EAAE,EAAE,CAAC;IAEpC,IAAM7C,IAAI,GAAG,IAAI,CAAC4B,QAAQ,EAAE,CAACmB,QAAQ,CAAC;IAEtCpD,GAAG,CAAC6D,MAAM,CAAC,kBAAkB,EAAExD,IAAI,CAAC;IAEpC,IAAI,CAACwC,QAAQ,CAACT,KAAK,IAAI;MACrB,IAAM;QAAEJ;MAAM,CAAC,GAAG,IAAI,CAACX,KAAK;MAC5B,IAAM;QAAEjB;MAAG,CAAC,GAAG4B,KAAK;MACpB,IAAMhB,cAAc,GAAGd,YAAY,CAACC,iBAAiB,CAACC,EAAE,EAAEC,IAAI,CAAC;MAC/D,IAAI;QAAE8B;MAAY,CAAC,GAAGC,KAAK;MAC3BD,WAAW,GAAGA,WAAW,CAAC2B,KAAK,CAAC,CAAC,EAAE9C,cAAc,CAAC;MAClD,IAAImB,WAAW,CAAClB,MAAM,KAAK,CAAC,IAAID,cAAc,GAAG,CAAC,EAAE;QAClD,IAAM;UAAED;QAAQ,CAAC,GAAGiB,KAAK;QACzBG,WAAW,GAAGjC,YAAY,CAACY,sBAAsB,CAACV,EAAE,EAAEC,IAAI,EAAEU,OAAO,CAAC;MACtE;MAEA,OAAO;QAAEV,IAAI;QAAE8B;MAAY,CAAC;IAC9B,CAAC,EAAE,IAAI,CAACJ,UAAU,CAAC;EACrB;EAEAD,iBAAiB,CAACkB,KAA2C,EAAQ;IACnE,IAAMd,KAAK,GAAGc,KAAK,CAACC,MAAM,CAACtC,KAAK;IAChCX,GAAG,CAAC6D,MAAM,CAAC,eAAe,EAAE3B,KAAK,CAAC;IAElC,IAAI,CAACW,QAAQ,CAAC;MAAEX;IAAM,CAAC,EAAE,IAAI,CAACH,UAAU,CAAC;EAC3C;EAEAA,UAAU,GAAS;IACjB,IAAM;MAAEgC;IAAS,CAAC,GAAG,IAAI,CAAC1C,KAAK;IAC/B,IAAM;MAAEgB,QAAQ;MAAEhC,IAAI;MAAE8B,WAAW;MAAED;IAAM,CAAC,GAAG,IAAI,CAACE,KAAK;IACzD,IAAMsB,MAAM,GAAGvB,WAAW,CAACwB,GAAG,CAACC,IAAI,IAAIA,IAAI,CAACjD,KAAK,CAAC;IAElDoD,QAAQ,CAAC;MAAE1D,IAAI;MAAEqD,MAAM;MAAExB,KAAK;MAAEG;IAAS,CAAC,CAAC;EAC7C;EAEA2B,MAAM,GAAgB;IACpB,IAAM;MAAEhC;IAAM,CAAC,GAAG,IAAI,CAACX,KAAK;IAC5B,IAAM;MAAEN,OAAO;MAAEX;IAAG,CAAC,GAAG4B,KAAK;IAC7B,IAAM;MAAEG,WAAW;MAAE9B,IAAI;MAAE6B,KAAK;MAAEG;IAAS,CAAC,GAAG,IAAI,CAACD,KAAK;IACzD,IAAMpB,cAAc,GAAGd,YAAY,CAACC,iBAAiB,CAACC,EAAE,EAAEC,IAAI,CAAC;IAC/D,IAAM4D,UAAU,GAAG,IAAI,CAACtB,aAAa,CAACtC,IAAI,CAAC;IAC3C,IAAM6D,WAAW,GAAG,IAAI,CAACtB,cAAc,CAACvC,IAAI,CAAC;IAC7C,IAAM8D,eAAe,GAAGhC,WAAW,CAAClB,MAAM,GAAG,CAAC;IAC9C,IAAMmD,kBAAkB,GAAGjC,WAAW,CAAClB,MAAM,GAAGD,cAAc;IAE9D,oBACE;MAAK,SAAS,EAAC,eAAe;MAAA,uBAC5B;QAAM,QAAQ,EAAE,IAAI,CAACY,YAAa;QAAA,wBAChC;UAAK,SAAS,EAAC,UAAU;UAAA,wBACvB;YAAA,UAAO;UAAiB,EAAQ,eAChC;YAAK,SAAS,EAAC,UAAU;YAAA,UACtB,IAAI,CAACK,QAAQ,EAAE,CAAC0B,GAAG,CAAC,CAACU,SAAS,EAAEnB,KAAK,KAAK;cACzC,IAAMoB,GAAG,GAAGD,SAAiC;cAC7C,oBACE;gBAAe,SAAS,EAAC,oBAAoB;gBAAA,uBAC3C;kBACE,IAAI,EAAC,QAAQ;kBACb,SAAS,EAAEvF,UAAU,CACnB,KAAK,EACL,UAAU,EACV,gBAAgB,EAChB;oBACEyF,MAAM,EAAEF,SAAS,KAAKhE;kBACxB,CAAC,CACD;kBACF,cAAY6C,KAAM;kBAClB,OAAO,EAAE,IAAI,CAACrB,eAAgB;kBAAA,WAE7B,IAAI,CAACa,WAAW,CAAC2B,SAAS,CAAC,EAC3B,IAAI,CAAC5B,WAAW,CAAC4B,SAAS,CAAC;gBAAA;cACrB,GAhBDC,GAAG,CAiBP;YAEV,CAAC;UAAC,EACE;QAAA,EACF,eACN,cAAM,eACN;UAAK,SAAS,EAAC,sBAAsB;UAAA,wBACnC;YAAO,SAAS,EAAC,kBAAkB;YAAA,UAAEL;UAAU,EAAS,eACxD;YACE,SAAS,EAAC,8CAA8C;YACxD,KAAK,EAAE/B,KAAM;YACb,QAAQ,EAAE,IAAI,CAACJ,iBAAkB;YAAA,UAEhCf,OAAO,CAAC4C,GAAG,CAACa,MAAM,iBACjB;cAA0B,KAAK,EAAEA,MAAM,CAACtD,IAAK;cAAA,UAC1CsD,MAAM,CAACtD;YAAI,GADDsD,MAAM,CAACtD,IAAI,CAGzB;UAAC,EACK;QAAA,EACL,EACLiD,eAAe,iBAAI,cAAM,EACzBhC,WAAW,CAACwB,GAAG,CAAC,CAACc,UAAU,EAAEC,CAAC,kBAC7B;UACE,SAAS,EAAC,uCAAuC;UAEjD,0CAAiCA,CAAC,CAAG;UAAA,wBAErC;YAAO,SAAS,EAAC,kBAAkB;YAAA,UAChCA,CAAC,KAAK,CAAC,GAAGR,WAAW,GAAG;UAAE,EACrB,eACR;YACE,SAAS,EAAC,8CAA8C;YACxD,KAAK,EAAEO,UAAU,CAAC9D,KAAM;YACxB,QAAQ,EAAE,IAAI,CAACe,kBAAmB;YAClC,4CAAmCgD,CAAC,CAAG;YACvC,cAAYA,CAAE;YAAA,UAEb3D,OAAO,CAAC4C,GAAG,CAACa,MAAM,iBACjB;cAA0B,KAAK,EAAEA,MAAM,CAACtD,IAAK;cAAC,cAAYwD,CAAE;cAAA,UACzDF,MAAM,CAACtD;YAAI,GADDsD,MAAM,CAACtD,IAAI,CAGzB;UAAC,EACK,EACRiB,WAAW,CAAClB,MAAM,GAAG,CAAC,iBACrB,KAAC,MAAM;YACL,IAAI,EAAC,OAAO;YACZ,SAAS,EAAC,6BAA6B;YACvC,cAAYyD,CAAE;YACd,uCAA8BA,CAAC,CAAG;YAClC,OAAO,EAAE,IAAI,CAAC/C,uBAAwB;YACtC,IAAI,EAAEnC,OAAQ;YACd,OAAO,EAAC;UAAQ,EAEnB;QAAA,GA7BIiF,UAAU,CAAC7D,EAAE,CA+BrB,CAAC,EACDwD,kBAAkB,iBACjB;UAAK,SAAS,EAAC,UAAU;UAAA,wBACvB;YAAK,SAAS,EAAC;UAAO,EAAG,eACzB,KAAC,MAAM;YACL,IAAI,EAAC,OAAO;YACZ,SAAS,EAAC,qBAAqB;YAC/B,OAAO,EAAE,IAAI,CAAC9C,eAAgB;YAC9B,IAAI,EAAEhC,sBAAuB;YAAA,UAC9B;UAED,EAAS;QAAA,EAEZ,eACD;UAAK,SAAS,EAAC,6BAA6B;UAAA,wBAC1C;YAAO,SAAS,EAAC,mBAAmB;YAAA,uBAClC;cAAK,SAAS,EAAC,iBAAiB;cAAA,wBAC9B,KAAC,eAAe;gBACd,IAAI,EAAED,OAAQ;gBACd,IAAI,EAAEE,mBAAoB;gBAC1B,SAAS,EAAC;cAAgB,EAC1B,eACF,KAAC,eAAe;gBACd,IAAI,EAAE8C,QAAQ,GAAGlD,MAAM,GAAGC,QAAS;gBACnC,SAAS,EAAC;cAAuB,EACjC;YAAA;UACE,EACA,eACR,MAAC,UAAU;YACT,QAAQ,EAAE,IAAI,CAACoC,qBAAsB;YACrC,KAAK,YAAKa,QAAQ,CAAG;YAAA,wBAErB,KAAC,SAAS;cAAC,KAAK,EAAC,MAAM;cAAA,UAAC;YAAU,EAAY,eAC9C,KAAC,SAAS;cAAC,KAAK,EAAC,OAAO;cAAA,UAAC;YAAY,EAAY;UAAA,EACtC;QAAA,EACT,eACN;UAAK,SAAS,EAAC,UAAU;UAAA,wBACvB;YAAK,SAAS,EAAC;UAAmB,EAAG,eACrC;YAAK,SAAS,EAAC,6BAA6B;YAAA,UACzCA,QAAQ,GACL,8GAA8G,GAC9G;UAA4I,EAC5I;QAAA,EACF,eACN;UACE,SAAS,EAAEvD,UAAU,CAAC,UAAU,EAAE,qBAAqB,EAAE,MAAM,CAAE;UAAA,wBAEjE,KAAC,MAAM;YACL,IAAI,EAAC,WAAW;YAChB,SAAS,EAAC,WAAW;YACrB,OAAO,EAAE,IAAI,CAAC2C,WAAY;YAAA,UAC3B;UAED,EAAS,eACT,KAAC,MAAM;YAAC,IAAI,EAAC,SAAS;YAAC,IAAI,EAAC,QAAQ;YAAC,SAAS,EAAC,YAAY;YAAA,UAAC;UAE5D,EAAS;QAAA,EACL;MAAA;IACD,EACH;EAEV;AACF;AAEA,eAAevB,YAAY"}
1
+ {"version":3,"file":"ChartBuilder.js","names":["React","PureComponent","classNames","FontAwesomeIcon","Button","RadioGroup","RadioItem","vsLink","dhUnlink","dhTable","dhNewCircleLargeFilled","vsCircleLargeFilled","vsTrash","Log","shortid","BarIcon","HistogramIcon","LineIcon","PieIcon","ScatterIcon","log","module","ChartBuilder","getMaxSeriesCount","dh","type","plot","SeriesPlotStyle","PIE","HISTOGRAM","makeSeriesItem","value","id","generate","makeDefaultSeriesItems","columns","maxSeriesCount","length","name","getDefaultXAxis","constructor","props","handleAddSeries","bind","handleLinkStateChange","handleReset","handleSeriesChange","handleSeriesDeleteClick","handleSubmit","handleTypeClick","handleXAxisChange","sendChange","model","getTypes","xAxis","seriesItems","state","isLinked","LINE","BAR","SCATTER","getTypeName","getTypeIcon","getXAxisLabel","getSeriesLabel","setState","newSeriesItems","push","event","target","index","getAttribute","intIndex","parseInt","changeEvent","splice","preventDefault","onSubmit","series","map","item","debug2","slice","onChange","render","xAxisLabel","seriesLabel","isSeriesVisible","isAddSeriesVisible","chartType","key","active","column","seriesItem","i"],"sources":["../../src/sidebar/ChartBuilder.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Button, RadioGroup, RadioItem } from '@deephaven/components';\nimport {\n vsLink,\n dhUnlink,\n dhTable,\n dhNewCircleLargeFilled,\n vsCircleLargeFilled,\n vsTrash,\n} from '@deephaven/icons';\nimport type {\n Column,\n dh as DhType,\n SeriesPlotStyle,\n} from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport shortid from 'shortid';\nimport {\n BarIcon,\n HistogramIcon,\n LineIcon,\n PieIcon,\n ScatterIcon,\n} from './icons';\nimport './ChartBuilder.scss';\nimport IrisGridModel from '../IrisGridModel';\n\nconst log = Log.module('ChartBuilder');\n\nexport type ChartBuilderSettings = {\n type: SeriesPlotStyle;\n series: string[];\n xAxis: string;\n isLinked: boolean;\n};\nexport type SeriesItem = {\n id: string;\n value: string;\n};\n\ninterface ChartBuilderProps {\n model: IrisGridModel;\n onSubmit: (obj: ChartBuilderSettings) => void;\n onChange: (obj: ChartBuilderSettings) => void;\n}\ninterface ChartBuilderState {\n /** The selected chart type */\n type: SeriesPlotStyle;\n\n /** Array of column names of the series to display */\n seriesItems: readonly SeriesItem[];\n\n /** The column name to use as the x-axis */\n xAxis: string;\n\n /** Whether the newly created chart should be linked with the table (update when filters update) */\n isLinked: boolean;\n}\n/**\n * Form for configuring all the settings when creating a console.\n */\nclass ChartBuilder extends PureComponent<ChartBuilderProps, ChartBuilderState> {\n static getMaxSeriesCount(dh: DhType, type: SeriesPlotStyle): number {\n switch (type) {\n case dh.plot.SeriesPlotStyle.PIE:\n return 1;\n case dh.plot.SeriesPlotStyle.HISTOGRAM:\n return 0;\n default:\n return 100;\n }\n }\n\n static makeSeriesItem(value: string): SeriesItem {\n return { id: shortid.generate(), value };\n }\n\n static makeDefaultSeriesItems(\n dh: DhType,\n type: SeriesPlotStyle,\n columns: readonly Column[]\n ): SeriesItem[] {\n const maxSeriesCount = ChartBuilder.getMaxSeriesCount(dh, type);\n if (maxSeriesCount === 0 || columns == null || columns.length === 0) {\n return [];\n }\n\n const value = columns.length > 1 ? columns[1].name : columns[0].name;\n return [ChartBuilder.makeSeriesItem(value)];\n }\n\n static getDefaultXAxis(\n type: SeriesPlotStyle,\n columns: readonly Column[]\n ): string | null {\n if (columns != null && columns.length > 0) {\n return columns[0].name;\n }\n\n return null;\n }\n\n constructor(props: ChartBuilderProps) {\n super(props);\n\n this.handleAddSeries = this.handleAddSeries.bind(this);\n this.handleLinkStateChange = this.handleLinkStateChange.bind(this);\n this.handleReset = this.handleReset.bind(this);\n this.handleSeriesChange = this.handleSeriesChange.bind(this);\n this.handleSeriesDeleteClick = this.handleSeriesDeleteClick.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleTypeClick = this.handleTypeClick.bind(this);\n this.handleXAxisChange = this.handleXAxisChange.bind(this);\n this.sendChange = this.sendChange.bind(this);\n\n const { model } = props;\n const { columns, dh } = model;\n\n const type = this.getTypes()[0];\n const xAxis = ChartBuilder.getDefaultXAxis(type, columns) as string;\n const seriesItems = ChartBuilder.makeDefaultSeriesItems(dh, type, columns);\n\n this.state = {\n /** The selected chart type */\n type,\n\n /** Array of column names of the series to display */\n seriesItems,\n\n /** The column name to use as the x-axis */\n xAxis,\n\n /** Whether the newly created chart should be linked with the table (update when filters update) */\n isLinked: true,\n };\n }\n\n getTypes(): SeriesPlotStyle[] {\n const { model } = this.props;\n const { dh } = model;\n return [\n dh.plot.SeriesPlotStyle.LINE,\n dh.plot.SeriesPlotStyle.BAR,\n dh.plot.SeriesPlotStyle.SCATTER,\n dh.plot.SeriesPlotStyle.PIE,\n // IDS-6808: Disable Histogram in Chart Builder until we pipe histogram creation through the API\n // dh.plot.SeriesPlotStyle.HISTOGRAM,\n ];\n }\n\n /**\n * Converts the provided chart type into a readable type.\n * Just replaces underscores with spaces and capitals the first letter of each word.\n */\n getTypeName(type: SeriesPlotStyle): string | SeriesPlotStyle {\n const { model } = this.props;\n const { dh } = model;\n switch (type) {\n case dh.plot.SeriesPlotStyle.LINE:\n return 'Line';\n case dh.plot.SeriesPlotStyle.BAR:\n return 'Bar';\n case dh.plot.SeriesPlotStyle.SCATTER:\n return 'Scatter';\n case dh.plot.SeriesPlotStyle.PIE:\n return 'Pie';\n case dh.plot.SeriesPlotStyle.HISTOGRAM:\n return 'Histogram';\n default:\n return type;\n }\n }\n\n getTypeIcon(type: SeriesPlotStyle): React.ReactElement | null {\n const { model } = this.props;\n const { dh } = model;\n switch (type) {\n case dh.plot.SeriesPlotStyle.LINE:\n return <LineIcon />;\n case dh.plot.SeriesPlotStyle.BAR:\n return <BarIcon />;\n case dh.plot.SeriesPlotStyle.SCATTER:\n return <ScatterIcon />;\n case dh.plot.SeriesPlotStyle.PIE:\n return <PieIcon />;\n case dh.plot.SeriesPlotStyle.HISTOGRAM:\n return <HistogramIcon />;\n default:\n return null;\n }\n }\n\n getXAxisLabel(type: SeriesPlotStyle): string {\n const { model } = this.props;\n const { dh } = model;\n switch (type) {\n case dh.plot.SeriesPlotStyle.PIE:\n return 'Labels';\n case dh.plot.SeriesPlotStyle.HISTOGRAM:\n return 'Data';\n default:\n return 'X-Axis';\n }\n }\n\n getSeriesLabel(type: SeriesPlotStyle): string {\n const { model } = this.props;\n const { dh } = model;\n switch (type) {\n case dh.plot.SeriesPlotStyle.PIE:\n return 'Values';\n default:\n return 'Series';\n }\n }\n\n handleAddSeries(): void {\n this.setState(state => {\n const { seriesItems } = state;\n const newSeriesItems = [...seriesItems];\n\n const { model } = this.props;\n const { columns } = model;\n newSeriesItems.push({\n id: shortid.generate(),\n value: columns[0].name,\n });\n\n return { seriesItems: newSeriesItems };\n }, this.sendChange);\n }\n\n handleLinkStateChange(event: React.ChangeEvent<HTMLInputElement>): void {\n this.setState({ isLinked: event.target.value === 'true' }, this.sendChange);\n }\n\n handleReset(): void {\n const { model } = this.props;\n const { columns, dh } = model;\n\n const type = this.getTypes()[0];\n const xAxis = ChartBuilder.getDefaultXAxis(type, columns) as string;\n const seriesItems = ChartBuilder.makeDefaultSeriesItems(dh, type, columns);\n const isLinked = true;\n\n this.setState({ type, seriesItems, xAxis, isLinked }, this.sendChange);\n }\n\n handleSeriesChange(event: React.ChangeEvent<HTMLSelectElement>): void {\n const { value } = event.target;\n const index = event.target.getAttribute('data-index') as string;\n const intIndex = parseInt(index, 10);\n\n this.setState(state => {\n let { seriesItems } = state;\n\n seriesItems = [...seriesItems];\n seriesItems[intIndex].value = value;\n\n return { seriesItems };\n }, this.sendChange);\n }\n\n handleSeriesDeleteClick(event: React.MouseEvent<HTMLButtonElement>): void {\n const changeEvent =\n event as unknown as React.ChangeEvent<HTMLButtonElement>;\n const index = changeEvent.target.getAttribute('data-index') as string;\n const intIndex = parseInt(index, 10);\n\n this.setState(state => {\n const { seriesItems } = state;\n const newSeriesItems = [...seriesItems];\n\n newSeriesItems.splice(intIndex, 1);\n\n return { seriesItems: newSeriesItems };\n }, this.sendChange);\n }\n\n handleSubmit(event: React.FormEvent<HTMLFormElement>): void {\n event.preventDefault();\n\n const { onSubmit } = this.props;\n const { type, seriesItems, xAxis, isLinked } = this.state;\n const series = seriesItems.map(item => item.value);\n onSubmit({\n type,\n series,\n xAxis,\n isLinked,\n });\n }\n\n handleTypeClick(event: React.MouseEvent<HTMLButtonElement>): void {\n const changeEvent =\n event as unknown as React.ChangeEvent<HTMLButtonElement>;\n const index = changeEvent.target.getAttribute('data-index') as string;\n const intIndex = parseInt(index, 10);\n\n const type = this.getTypes()[intIndex];\n\n log.debug2('handleTypeSelect', type);\n\n this.setState(state => {\n const { model } = this.props;\n const { dh } = model;\n const maxSeriesCount = ChartBuilder.getMaxSeriesCount(dh, type);\n let { seriesItems } = state;\n seriesItems = seriesItems.slice(0, maxSeriesCount);\n if (seriesItems.length === 0 && maxSeriesCount > 0) {\n const { columns } = model;\n seriesItems = ChartBuilder.makeDefaultSeriesItems(dh, type, columns);\n }\n\n return { type, seriesItems };\n }, this.sendChange);\n }\n\n handleXAxisChange(event: React.ChangeEvent<HTMLSelectElement>): void {\n const xAxis = event.target.value;\n log.debug2('x-axis change', xAxis);\n\n this.setState({ xAxis }, this.sendChange);\n }\n\n sendChange(): void {\n const { onChange } = this.props;\n const { isLinked, type, seriesItems, xAxis } = this.state;\n const series = seriesItems.map(item => item.value);\n\n onChange({ type, series, xAxis, isLinked });\n }\n\n render(): JSX.Element {\n const { model } = this.props;\n const { columns, dh } = model;\n const { seriesItems, type, xAxis, isLinked } = this.state;\n const maxSeriesCount = ChartBuilder.getMaxSeriesCount(dh, type);\n const xAxisLabel = this.getXAxisLabel(type);\n const seriesLabel = this.getSeriesLabel(type);\n const isSeriesVisible = seriesItems.length > 0;\n const isAddSeriesVisible = seriesItems.length < maxSeriesCount;\n\n return (\n <div className=\"chart-builder\">\n <form onSubmit={this.handleSubmit}>\n <div className=\"form-row\">\n <label>Select Chart Type</label>\n <div className=\"form-row\">\n {this.getTypes().map((chartType, index) => {\n const key = chartType as unknown as React.Key;\n return (\n <div key={key} className=\"col col-chart-type\">\n <button\n type=\"button\"\n className={classNames(\n 'btn',\n 'btn-icon',\n 'btn-chart-type',\n {\n active: chartType === type,\n }\n )}\n data-index={index}\n onClick={this.handleTypeClick}\n >\n {this.getTypeIcon(chartType)}\n {this.getTypeName(chartType)}\n </button>\n </div>\n );\n })}\n </div>\n </div>\n <hr />\n <div className=\"form-row form-inline\">\n <label className=\"col-2 label-left\">{xAxisLabel}</label>\n <select\n className=\"form-control custom-select select-x-axis col\"\n value={xAxis}\n onChange={this.handleXAxisChange}\n >\n {columns.map(column => (\n <option key={column.name} value={column.name}>\n {column.name}\n </option>\n ))}\n </select>\n </div>\n {isSeriesVisible && <hr />}\n {seriesItems.map((seriesItem, i) => (\n <div\n className=\"form-row form-inline form-series-item\"\n key={seriesItem.id}\n data-testid={`form-series-item-${i}`}\n >\n <label className=\"col-2 label-left\">\n {i === 0 ? seriesLabel : ''}\n </label>\n <select\n className=\"form-control custom-select select-series col\"\n value={seriesItem.value}\n onChange={this.handleSeriesChange}\n data-testid={`select-series-item-${i}`}\n data-index={i}\n >\n {columns.map(column => (\n <option key={column.name} value={column.name} data-index={i}>\n {column.name}\n </option>\n ))}\n </select>\n {seriesItems.length > 1 && (\n <Button\n kind=\"ghost\"\n className=\"btn-delete-series ml-2 px-2\"\n data-index={i}\n data-testid={`delete-series-${i}`}\n onClick={this.handleSeriesDeleteClick}\n icon={vsTrash}\n tooltip=\"Delete\"\n />\n )}\n </div>\n ))}\n {isAddSeriesVisible && (\n <div className=\"form-row\">\n <div className=\"col-2\" />\n <Button\n kind=\"ghost\"\n className=\"btn-add-series mt-1\"\n onClick={this.handleAddSeries}\n icon={dhNewCircleLargeFilled}\n >\n Add Series\n </Button>\n </div>\n )}\n <div className=\"form-row chart-builder-link\">\n <label className=\"col-2 label-right\">\n <div className=\"fa-md fa-layers\">\n <FontAwesomeIcon\n mask={dhTable}\n icon={vsCircleLargeFilled}\n transform=\"right-5 down-5\"\n />\n <FontAwesomeIcon\n icon={isLinked ? vsLink : dhUnlink}\n transform=\"grow-2 right-8 down-6\"\n />\n </div>\n </label>\n <RadioGroup\n onChange={this.handleLinkStateChange}\n value={`${isLinked}`}\n >\n <RadioItem value=\"true\">Sync State</RadioItem>\n <RadioItem value=\"false\">Freeze State</RadioItem>\n </RadioGroup>\n </div>\n <div className=\"form-row\">\n <div className=\"col-2 label-right\" />\n <div className=\"col chart-builder-link-info\">\n {isLinked\n ? 'Charts with synced state will update to match any filters or user modifications applied to the parent table.'\n : 'Freeze State disconnects the chart state from the parent table. New filters or user modifications on the parent table will not be applied.'}\n </div>\n </div>\n <div\n className={classNames('form-row', 'justify-content-end', 'my-3')}\n >\n <Button\n kind=\"secondary\"\n className=\"btn-reset\"\n onClick={this.handleReset}\n >\n Reset\n </Button>\n <Button kind=\"primary\" type=\"submit\" className=\"btn-submit\">\n Create\n </Button>\n </div>\n </form>\n </div>\n );\n }\n}\n\nexport default ChartBuilder;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CustomColumnInput.js","names":["React","useCallback","classNames","Draggable","Button","vsTrash","vsGripper","DbNameValidator","InputEditor","INPUT_TYPE","Object","freeze","NAME","FORMULA","EMPTY_FN","CustomColumnInput","eventKey","name","inputIndex","formula","onChange","onDeleteColumn","onTabInEditor","invalid","isDuplicate","isValidName","isValidColumnName","handleFormulaEditorContentChanged","formulaValue","undefined","replace","provided","snapshot","dragging","isDragging","innerRef","draggableProps","event","target","value","dragHandleProps","language"],"sources":["../../src/sidebar/CustomColumnInput.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport classNames from 'classnames';\nimport { Draggable } from 'react-beautiful-dnd';\nimport { Button } from '@deephaven/components';\nimport { vsTrash, vsGripper } from '@deephaven/icons';\nimport { DbNameValidator } from '@deephaven/utils';\nimport InputEditor from './InputEditor';\nimport { CustomColumnKey } from './CustomColumnBuilder';\n\nexport interface CustomColumnInputProps {\n eventKey: string;\n inputIndex: number;\n name: string;\n formula: string;\n onChange: (\n eventKey: string,\n inputType: CustomColumnKey,\n value: string\n ) => void;\n onDeleteColumn: (eventKey: string) => void;\n onTabInEditor: (editorIndex: number, shiftKey: boolean) => void;\n invalid: boolean;\n isDuplicate: boolean;\n}\n\nconst INPUT_TYPE = Object.freeze({\n NAME: 'name',\n FORMULA: 'formula',\n});\n\nconst EMPTY_FN = () => {\n // no-op\n};\n\nfunction CustomColumnInput({\n eventKey,\n name,\n inputIndex,\n formula,\n onChange,\n onDeleteColumn,\n onTabInEditor,\n invalid,\n isDuplicate,\n}: CustomColumnInputProps): JSX.Element {\n const isValidName = name === '' || DbNameValidator.isValidColumnName(name);\n const handleFormulaEditorContentChanged = useCallback(\n (formulaValue?: string) => {\n if (formulaValue !== undefined) {\n formulaValue.replace(/(\\r\\n|\\n|\\r)/gm, ''); // remove line break\n onChange(eventKey, INPUT_TYPE.FORMULA, formulaValue);\n }\n },\n [onChange, eventKey]\n );\n\n return (\n <Draggable\n draggableId={eventKey}\n index={inputIndex}\n disableInteractiveElementBlocking\n >\n {(provided, snapshot) => (\n <div\n className={classNames('draggable-container', {\n dragging: snapshot.isDragging,\n })}\n ref={provided.innerRef}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.draggableProps}\n >\n <div className=\"custom-column-input-container\">\n <div className=\"pb-3\">\n <div className=\"d-flex flex-row custom-column-name\">\n <input\n className={classNames('form-control custom-column-input', {\n 'is-invalid': invalid || !isValidName || isDuplicate,\n })}\n placeholder=\"Column Name\"\n value={name}\n onChange={event => {\n onChange(eventKey, INPUT_TYPE.NAME, event.target.value);\n }}\n />\n <Button\n kind=\"ghost\"\n className=\"ml-1 px-2\"\n onClick={() => {\n onDeleteColumn(eventKey);\n }}\n icon={vsTrash}\n tooltip=\"Delete custom column\"\n />\n\n <Button\n kind=\"ghost\"\n className=\"btn-drag-handle\"\n onClick={EMPTY_FN}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.dragHandleProps}\n icon={vsGripper}\n tooltip=\"Drag column to re-order\"\n />\n </div>\n {(!isValidName || isDuplicate) && (\n <p className=\"validate-label-error text-danger mb-0 mt-2 pl-1\">\n {!isValidName ? 'Invalid name' : 'Duplicate name'}\n </p>\n )}\n </div>\n <InputEditor\n editorSettings={{ language: 'deephavenDb' }}\n editorIndex={inputIndex}\n placeholder=\"Column Formula\"\n value={formula}\n onContentChanged={handleFormulaEditorContentChanged}\n onTab={onTabInEditor}\n invalid={invalid}\n />\n </div>\n <hr />\n </div>\n )}\n </Draggable>\n );\n}\n\nexport default CustomColumnInput;\n"],"mappings":"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"}
1
+ {"version":3,"file":"CustomColumnInput.js","names":["React","useCallback","classNames","Draggable","Button","vsTrash","vsGripper","DbNameValidator","InputEditor","INPUT_TYPE","Object","freeze","NAME","FORMULA","EMPTY_FN","CustomColumnInput","eventKey","name","inputIndex","formula","onChange","onDeleteColumn","onTabInEditor","invalid","isDuplicate","isValidName","isValidColumnName","handleFormulaEditorContentChanged","formulaValue","undefined","replace","provided","snapshot","dragging","isDragging","innerRef","draggableProps","event","target","value","dragHandleProps","language"],"sources":["../../src/sidebar/CustomColumnInput.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport classNames from 'classnames';\nimport { Draggable } from 'react-beautiful-dnd';\nimport { Button } from '@deephaven/components';\nimport { vsTrash, vsGripper } from '@deephaven/icons';\nimport { DbNameValidator } from '@deephaven/utils';\nimport InputEditor from './InputEditor';\nimport { CustomColumnKey } from './CustomColumnBuilder';\n\nexport interface CustomColumnInputProps {\n eventKey: string;\n inputIndex: number;\n name: string;\n formula: string;\n onChange: (\n eventKey: string,\n inputType: CustomColumnKey,\n value: string\n ) => void;\n onDeleteColumn: (eventKey: string) => void;\n onTabInEditor: (editorIndex: number, shiftKey: boolean) => void;\n invalid: boolean;\n isDuplicate: boolean;\n}\n\nconst INPUT_TYPE = Object.freeze({\n NAME: 'name',\n FORMULA: 'formula',\n});\n\nconst EMPTY_FN = (): void => {\n // no-op\n};\n\nfunction CustomColumnInput({\n eventKey,\n name,\n inputIndex,\n formula,\n onChange,\n onDeleteColumn,\n onTabInEditor,\n invalid,\n isDuplicate,\n}: CustomColumnInputProps): JSX.Element {\n const isValidName = name === '' || DbNameValidator.isValidColumnName(name);\n const handleFormulaEditorContentChanged = useCallback(\n (formulaValue?: string) => {\n if (formulaValue !== undefined) {\n formulaValue.replace(/(\\r\\n|\\n|\\r)/gm, ''); // remove line break\n onChange(eventKey, INPUT_TYPE.FORMULA, formulaValue);\n }\n },\n [onChange, eventKey]\n );\n\n return (\n <Draggable\n draggableId={eventKey}\n index={inputIndex}\n disableInteractiveElementBlocking\n >\n {(provided, snapshot) => (\n <div\n className={classNames('draggable-container', {\n dragging: snapshot.isDragging,\n })}\n ref={provided.innerRef}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.draggableProps}\n >\n <div className=\"custom-column-input-container\">\n <div className=\"pb-3\">\n <div className=\"d-flex flex-row custom-column-name\">\n <input\n className={classNames('form-control custom-column-input', {\n 'is-invalid': invalid || !isValidName || isDuplicate,\n })}\n placeholder=\"Column Name\"\n value={name}\n onChange={event => {\n onChange(eventKey, INPUT_TYPE.NAME, event.target.value);\n }}\n />\n <Button\n kind=\"ghost\"\n className=\"ml-1 px-2\"\n onClick={() => {\n onDeleteColumn(eventKey);\n }}\n icon={vsTrash}\n tooltip=\"Delete custom column\"\n />\n\n <Button\n kind=\"ghost\"\n className=\"btn-drag-handle\"\n onClick={EMPTY_FN}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.dragHandleProps}\n icon={vsGripper}\n tooltip=\"Drag column to re-order\"\n />\n </div>\n {(!isValidName || isDuplicate) && (\n <p className=\"validate-label-error text-danger mb-0 mt-2 pl-1\">\n {!isValidName ? 'Invalid name' : 'Duplicate name'}\n </p>\n )}\n </div>\n <InputEditor\n editorSettings={{ language: 'deephavenDb' }}\n editorIndex={inputIndex}\n placeholder=\"Column Formula\"\n value={formula}\n onContentChanged={handleFormulaEditorContentChanged}\n onTab={onTabInEditor}\n invalid={invalid}\n />\n </div>\n <hr />\n </div>\n )}\n </Draggable>\n );\n}\n\nexport default CustomColumnInput;\n"],"mappings":"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"}
@@ -52,7 +52,7 @@ export default class TableSaver extends PureComponent<TableSaverProps, Record<st
52
52
  streamTimeout?: ReturnType<typeof setTimeout>;
53
53
  snapshotHandlerTimeout?: ReturnType<typeof setTimeout>;
54
54
  downloadStartTime?: number;
55
- iframes: HTMLIFrameElement[];
55
+ iframe?: HTMLIFrameElement;
56
56
  useBlobFallback: boolean;
57
57
  getCachedCustomColumnFormatFlag: typeof import("@deephaven/jsapi-utils").isCustomColumnFormatDefined & import("@types/memoizee").Memoized<typeof import("@deephaven/jsapi-utils").isCustomColumnFormatDefined>;
58
58
  createWriterStream(port: MessagePort): WritableStream<{
@@ -77,6 +77,7 @@ export default class TableSaver extends PureComponent<TableSaverProps, Record<st
77
77
  }>): void;
78
78
  handleSnapshotResolved(snapshot: UpdateEventData, snapshotIndex: number, snapshotStartRow: GridRangeIndex, snapshotEndRow: GridRangeIndex): void;
79
79
  makeIframe(src: string): void;
80
+ removeIframe(): void;
80
81
  render(): null;
81
82
  }
82
83
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"TableSaver.d.ts","sourceRoot":"","sources":["../../src/sidebar/TableSaver.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TableSaver.d.ts","sourceRoot":"","sources":["../../src/sidebar/TableSaver.tsx"],"names":[],"mappings":"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"}
@@ -46,7 +46,7 @@ export default class TableSaver extends PureComponent {
46
46
  _defineProperty(this, "streamTimeout", void 0);
47
47
  _defineProperty(this, "snapshotHandlerTimeout", void 0);
48
48
  _defineProperty(this, "downloadStartTime", void 0);
49
- _defineProperty(this, "iframes", void 0);
49
+ _defineProperty(this, "iframe", void 0);
50
50
  _defineProperty(this, "useBlobFallback", void 0);
51
51
  _defineProperty(this, "getCachedCustomColumnFormatFlag", memoizeClear(FormatterUtils.isCustomColumnFormatDefined, {
52
52
  max: 10000
@@ -73,7 +73,6 @@ export default class TableSaver extends PureComponent {
73
73
  // If the stream doesn't pull for long enough time, chances are the stream is already canceled, so we stop the stream.
74
74
  // Issue ticket on Chromium: https://bugs.chromium.org/p/chromium/issues/detail?id=638494
75
75
 
76
- this.iframes = [];
77
76
  this.useBlobFallback = false;
78
77
  }
79
78
  componentDidMount() {
@@ -91,11 +90,7 @@ export default class TableSaver extends PureComponent {
91
90
  });
92
91
  }
93
92
  componentWillUnmount() {
94
- if (this.iframes.length > 0) {
95
- this.iframes.forEach(iframe => {
96
- iframe.remove();
97
- });
98
- }
93
+ this.removeIframe();
99
94
  if (this.streamTimeout) clearTimeout(this.streamTimeout);
100
95
  if (this.snapshotHandlerTimeout) clearTimeout(this.snapshotHandlerTimeout);
101
96
  }
@@ -213,15 +208,10 @@ export default class TableSaver extends PureComponent {
213
208
  }
214
209
  }
215
210
  cancelDownload() {
216
- if (this.table) {
217
- this.table.close();
218
- }
219
- if (this.tableSubscription) {
220
- this.tableSubscription.close();
221
- }
222
- if (this.fileWriter) {
223
- this.fileWriter.abort();
224
- }
211
+ var _this$table, _this$tableSubscripti, _this$fileWriter;
212
+ (_this$table = this.table) === null || _this$table === void 0 ? void 0 : _this$table.close();
213
+ (_this$tableSubscripti = this.tableSubscription) === null || _this$tableSubscripti === void 0 ? void 0 : _this$tableSubscripti.close();
214
+ (_this$fileWriter = this.fileWriter) === null || _this$fileWriter === void 0 ? void 0 : _this$fileWriter.abort();
225
215
  this.cancelableSnapshots.forEach(cancelable => {
226
216
  if (cancelable) {
227
217
  cancelable.catch(() => null);
@@ -239,6 +229,7 @@ export default class TableSaver extends PureComponent {
239
229
  this.tableSubscription = undefined;
240
230
  this.columns = undefined;
241
231
  this.chunkRows = undefined;
232
+ this.removeIframe();
242
233
  this.gridRanges = [];
243
234
  this.gridRangeCounter = 0;
244
235
  this.rangedSnapshotsTotal = [];
@@ -265,7 +256,7 @@ export default class TableSaver extends PureComponent {
265
256
  this.cancelDownload();
266
257
  }
267
258
  writeTableHeader() {
268
- var _this$fileWriter;
259
+ var _this$fileWriter2;
269
260
  var headerString = '';
270
261
  if (this.columns) {
271
262
  for (var i = 0; i < this.columns.length; i += 1) {
@@ -273,7 +264,7 @@ export default class TableSaver extends PureComponent {
273
264
  headerString += i === this.columns.length - 1 ? '\n' : ',';
274
265
  }
275
266
  }
276
- (_this$fileWriter = this.fileWriter) === null || _this$fileWriter === void 0 ? void 0 : _this$fileWriter.write({
267
+ (_this$fileWriter2 = this.fileWriter) === null || _this$fileWriter2 === void 0 ? void 0 : _this$fileWriter2.write({
277
268
  header: headerString
278
269
  }).then(() => null);
279
270
  }
@@ -464,10 +455,15 @@ export default class TableSaver extends PureComponent {
464
455
  // make a return value and make it static method
465
456
  var iframe = document.createElement('iframe');
466
457
  iframe.hidden = true;
467
- iframe.src = "download/".concat(src);
458
+ iframe.src = src;
468
459
  iframe.name = 'iframe';
469
460
  document.body.appendChild(iframe);
470
- this.iframes.push(iframe);
461
+ this.iframe = iframe;
462
+ }
463
+ removeIframe() {
464
+ var _this$iframe;
465
+ (_this$iframe = this.iframe) === null || _this$iframe === void 0 ? void 0 : _this$iframe.remove();
466
+ this.iframe = undefined;
471
467
  }
472
468
  render() {
473
469
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"TableSaver.js","names":["PureComponent","Log","memoizeClear","FormatterUtils","TableUtils","PromiseUtils","assertNotNull","IrisGridUtils","log","module","UNFORMATTED_DATE_PATTERN","isUpdateEventData","data","added","undefined","assertIsUpdateEventData","Error","TableSaver","csvEscapeString","str","replace","constructor","props","isCustomColumnFormatDefined","max","handlePortMessage","bind","handleSnapshotResolved","handleDownloadTimeout","state","gridRanges","gridRangeCounter","rangedSnapshotsTotal","rangedSnapshotCounter","includeColumnHeaders","useUnformattedValues","snapshotsTotal","snapshotCounter","snapshotsBuffer","Map","currentSnapshotIndex","snapshotPending","cancelableSnapshots","iframes","useBlobFallback","componentDidMount","getDownloadWorker","then","sw","info","postMessage","catch","error","warn","componentWillUnmount","length","forEach","iframe","remove","streamTimeout","clearTimeout","snapshotHandlerTimeout","createWriterStream","port","useBlob","chunks","encode","TextEncoder","prototype","fileName","streamConfig","write","chunk","header","push","rows","close","blob","Blob","type","link","document","createElement","href","URL","createObjectURL","download","click","abort","cancel","end","WritableStream","startDownload","frozenTable","tableSubscription","snapshotRanges","modelRanges","isDownloading","downloadStartTime","Date","now","table","columns","columnsFromRanges","encodedFileName","encodeURIComponent","escape","messageChannel","MessageChannel","port1","fileWriter","getWriter","writeCsvTable","port2","onmessage","finishDownload","onDownloadCompleted","resetTableSaver","cancelDownload","cancelable","onDownloadCanceled","chunkRows","writeTableHeader","headerString","i","name","startWriteTableBody","Math","floor","DOWNLOAD_CELL_CHUNK","map","range","endRow","startRow","ceil","reduce","total","snapshotCount","makeSnapshot","min","SNAPSHOT_BUFFER_SIZE","writeSnapshot","snapshotIndex","snapshotStartRow","snapshotEndRow","has","n","get","convertSnapshotIntoCsv","delete","updateDownloadProgress","debug2","size","onDownloadProgressUpdate","downloadProgress","estimateTime","snapshot","csvString","snapshotIterator","iterator","dh","formatter","hasNext","next","value","rowIdx","j","cellData","getData","isDateType","i18n","DateTimeFormat","format","TimeZone","getTimeZone","timeZone","toString","hasCustomColumnFormat","getCachedCustomColumnFormatFlag","formatOverride","cellFormat","getFormat","formatString","getFormattedString","currentGridRange","makeCancelable","RangeSet","ofRange","err","val","readableStreamPulling","makeIframe","setTimeout","STREAM_TIMEOUT","set","SNAPSHOT_HANDLER_TIMEOUT","src","hidden","body","appendChild","render","Promise","reject"],"sources":["../../src/sidebar/TableSaver.tsx"],"sourcesContent":["import { PureComponent } from 'react';\nimport type {\n Column,\n dh as DhType,\n DateWrapper,\n Table,\n TableData,\n TableViewportSubscription,\n UpdateEventData,\n} from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport { GridRange, GridRangeIndex, memoizeClear } from '@deephaven/grid';\nimport { Formatter, FormatterUtils, TableUtils } from '@deephaven/jsapi-utils';\nimport {\n CancelablePromise,\n PromiseUtils,\n assertNotNull,\n} from '@deephaven/utils';\nimport IrisGridUtils from '../IrisGridUtils';\n\nconst log = Log.module('TableSaver');\n\nconst UNFORMATTED_DATE_PATTERN = `yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS z`;\n\ninterface TableSaverProps {\n dh: DhType;\n getDownloadWorker: () => Promise<ServiceWorker>;\n isDownloading: boolean;\n onDownloadCompleted: () => void;\n onDownloadCanceled: () => void;\n onDownloadProgressUpdate: (\n progress: number,\n estimatedTime: number | null\n ) => void;\n formatter: Formatter;\n}\n\nfunction isUpdateEventData(data: TableData): data is UpdateEventData {\n return (data as UpdateEventData).added !== undefined;\n}\n\nfunction assertIsUpdateEventData(\n data: TableData\n): asserts data is UpdateEventData {\n if (!isUpdateEventData(data)) {\n throw new Error('event is not UpdateEventData');\n }\n}\n\nexport default class TableSaver extends PureComponent<\n TableSaverProps,\n Record<string, never>\n> {\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 defaultProps = {\n getDownloadWorker: (): Promise<never> =>\n Promise.reject(new Error('Download worker not provided')),\n isDownloading: false,\n onDownloadCompleted: (): void => undefined,\n onDownloadCanceled: (): void => undefined,\n onDownloadProgressUpdate: (): void => undefined,\n };\n\n static csvEscapeString(str: string): string {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n\n constructor(props: TableSaverProps) {\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.gridRanges = [];\n this.gridRangeCounter = 0;\n this.rangedSnapshotsTotal = [];\n this.rangedSnapshotCounter = 0;\n\n this.includeColumnHeaders = true;\n this.useUnformattedValues = false;\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 // 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\n this.iframes = [];\n\n this.useBlobFallback = false;\n }\n\n componentDidMount(): void {\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(): void {\n if (this.iframes.length > 0) {\n this.iframes.forEach(iframe => {\n iframe.remove();\n });\n }\n if (this.streamTimeout) clearTimeout(this.streamTimeout);\n if (this.snapshotHandlerTimeout) clearTimeout(this.snapshotHandlerTimeout);\n }\n\n sw?: ServiceWorker;\n\n port?: MessagePort;\n\n fileWriter?: WritableStreamDefaultWriter<unknown>;\n\n table?: Table;\n\n tableSubscription?: TableViewportSubscription;\n\n columns?: readonly Column[];\n\n fileName?: string;\n\n includeColumnHeaders: boolean;\n\n useUnformattedValues: boolean;\n\n chunkRows?: number;\n\n gridRanges: readonly GridRange[];\n\n gridRangeCounter?: number;\n\n rangedSnapshotsTotal: readonly number[];\n\n rangedSnapshotCounter?: number;\n\n snapshotsTotal: number;\n\n snapshotCounter: number;\n\n snapshotsBuffer: Map<number, UpdateEventData>;\n\n currentSnapshotIndex: number;\n\n snapshotPending: number;\n\n cancelableSnapshots: (CancelablePromise<unknown> | null)[];\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 streamTimeout?: ReturnType<typeof setTimeout>;\n\n snapshotHandlerTimeout?: ReturnType<typeof setTimeout>;\n\n downloadStartTime?: number;\n\n iframes: HTMLIFrameElement[];\n\n useBlobFallback: boolean;\n\n getCachedCustomColumnFormatFlag = memoizeClear(\n FormatterUtils.isCustomColumnFormatDefined,\n { max: 10000 }\n );\n\n createWriterStream(port: MessagePort): WritableStream<{\n rows?: string | undefined;\n header?: string | undefined;\n }> {\n // use blob fall back if it's safari\n const useBlob = this.useBlobFallback;\n const chunks = [] as BlobPart[];\n let encode: ((input?: string) => Uint8Array) | null = null;\n if (useBlob) {\n encode = TextEncoder.prototype.encode.bind(new TextEncoder());\n }\n const { fileName } = this;\n\n const streamConfig = {} as UnderlyingSink<{\n rows?: string | undefined;\n header?: string | undefined;\n }>;\n if (useBlob) {\n streamConfig.write = (chunk: { rows?: string; header?: string }) => {\n assertNotNull(encode);\n if (chunk.header !== undefined) {\n chunks.push(encode(chunk.header));\n }\n if (chunk.rows !== undefined) {\n chunks.push(encode(chunk.rows));\n }\n };\n streamConfig.close = () => {\n assertNotNull(fileName);\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: unknown) => {\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 WritableStream(streamConfig);\n }\n\n startDownload(\n fileName: string,\n frozenTable: Table,\n tableSubscription: TableViewportSubscription,\n snapshotRanges: readonly GridRange[],\n modelRanges: readonly GridRange[],\n includeColumnHeaders: boolean,\n useUnformattedValues: boolean\n ): void {\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 = IrisGridUtils.columnsFromRanges(\n modelRanges,\n frozenTable.columns\n );\n this.tableSubscription = tableSubscription;\n this.gridRanges = snapshotRanges;\n this.includeColumnHeaders = includeColumnHeaders;\n this.useUnformattedValues = useUnformattedValues;\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(includeColumnHeaders);\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(): void {\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 if (this.downloadStartTime !== undefined) {\n log.info(\n `download finished, total elapsed time ${\n (Date.now() - this.downloadStartTime) / 1000\n } seconds`\n );\n }\n }\n\n cancelDownload(): void {\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(() => null);\n cancelable.cancel();\n }\n });\n const { onDownloadCanceled } = this.props;\n onDownloadCanceled();\n this.resetTableSaver();\n }\n\n resetTableSaver(): void {\n this.table = undefined;\n this.tableSubscription = undefined;\n this.columns = undefined;\n this.chunkRows = undefined;\n\n this.gridRanges = [];\n this.gridRangeCounter = 0;\n this.rangedSnapshotsTotal = [];\n this.rangedSnapshotCounter = 0;\n\n this.includeColumnHeaders = true;\n this.useUnformattedValues = false;\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 if (this.streamTimeout != null) {\n clearTimeout(this.streamTimeout);\n }\n\n if (this.snapshotHandlerTimeout != null) {\n clearTimeout(this.snapshotHandlerTimeout);\n }\n this.streamTimeout = undefined;\n this.snapshotHandlerTimeout = undefined;\n }\n\n handleDownloadTimeout(): void {\n log.info('download canceled');\n this.cancelDownload();\n }\n\n writeTableHeader(): void {\n let headerString = '';\n if (this.columns) {\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 }\n this.fileWriter?.write({ header: headerString }).then(() => null);\n }\n\n startWriteTableBody(): void {\n if (this.columns && this.gridRanges != null) {\n this.chunkRows = Math.floor(\n TableSaver.DOWNLOAD_CELL_CHUNK / this.columns.length\n );\n\n this.rangedSnapshotsTotal = this.gridRanges.map((range: GridRange) => {\n assertNotNull(range.endRow);\n assertNotNull(range.startRow);\n assertNotNull(this.chunkRows);\n\n return Math.ceil((range.endRow - range.startRow + 1) / this.chunkRows);\n });\n this.snapshotsTotal = this.rangedSnapshotsTotal.reduce(\n (total: number, snapshotCount: number) => 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\n writeCsvTable(includeColumnHeaders: boolean): void {\n if (includeColumnHeaders) {\n this.writeTableHeader();\n }\n this.startWriteTableBody();\n }\n\n writeSnapshot(\n snapshotIndex: number,\n snapshotStartRow: GridRangeIndex,\n snapshotEndRow: GridRangeIndex\n ): void {\n if (this.currentSnapshotIndex === snapshotIndex && this.fileWriter) {\n while (this.snapshotsBuffer.has(this.currentSnapshotIndex)) {\n const n = this.snapshotsBuffer.get(this.currentSnapshotIndex);\n assertNotNull(n);\n this.fileWriter.write({\n rows: this.convertSnapshotIntoCsv(n),\n });\n this.snapshotsBuffer.delete(this.currentSnapshotIndex);\n this.currentSnapshotIndex += 1;\n\n this.updateDownloadProgress(snapshotIndex);\n }\n if (\n this.snapshotsTotal &&\n this.currentSnapshotIndex >= this.snapshotsTotal\n ) {\n this.finishDownload();\n return;\n }\n }\n\n if (\n this.snapshotCounter &&\n this.snapshotsTotal &&\n this.snapshotCounter < this.snapshotsTotal\n ) {\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: GridRangeIndex): void {\n if (\n snapshotIndex != null &&\n this.snapshotsTotal != null &&\n this.downloadStartTime != null\n ) {\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\n convertSnapshotIntoCsv(snapshot: UpdateEventData): string {\n let csvString = '';\n const snapshotIterator = snapshot.added.iterator();\n const { dh, formatter } = this.props;\n\n const rows = [];\n while (snapshotIterator.hasNext()) {\n rows.push(snapshotIterator.next().value);\n }\n\n assertNotNull(this.columns);\n\n const { useUnformattedValues } = this;\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 let cellData = null;\n if (useUnformattedValues) {\n let value = snapshot.getData(rowIdx, this.columns[j]) ?? '';\n if (value !== '' && TableUtils.isDateType(type)) {\n // value is just a long value, we should return the value formatted as a full date string\n value = dh.i18n.DateTimeFormat.format(\n UNFORMATTED_DATE_PATTERN,\n value as number | Date | DateWrapper,\n dh.i18n.TimeZone.getTimeZone(formatter.timeZone)\n );\n }\n cellData = value.toString();\n } else {\n const hasCustomColumnFormat = this.getCachedCustomColumnFormatFlag(\n formatter,\n name,\n type\n );\n let formatOverride = null;\n if (!hasCustomColumnFormat) {\n const cellFormat = snapshot.getFormat(rowIdx, this.columns[j]);\n formatOverride =\n cellFormat?.formatString != null ? cellFormat : null;\n }\n if (formatOverride) {\n cellData = formatter.getFormattedString(\n snapshot.getData(rowIdx, this.columns[j]),\n type,\n name,\n formatOverride\n );\n } else {\n cellData = formatter.getFormattedString(\n snapshot.getData(rowIdx, this.columns[j]),\n type,\n name\n );\n }\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: number): void {\n if (n <= 0) {\n return;\n }\n const { dh } = this.props;\n assertNotNull(this.gridRangeCounter);\n let i = 0;\n let currentGridRange = this.gridRanges[this.gridRangeCounter];\n\n assertNotNull(this.tableSubscription);\n assertNotNull(this.columns);\n while (i < n) {\n assertNotNull(currentGridRange);\n assertNotNull(currentGridRange.startRow);\n assertNotNull(currentGridRange.endRow);\n assertNotNull(this.rangedSnapshotCounter);\n assertNotNull(this.chunkRows);\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 assertIsUpdateEventData(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({\n data,\n }: MessageEvent<{\n download: unknown;\n readableStreamPulling: unknown;\n }>): void {\n const { download, readableStreamPulling } = data;\n if (this.useBlobFallback) {\n return;\n }\n if (download != null) {\n const { includeColumnHeaders } = this;\n this.makeIframe(`${download}`);\n this.writeCsvTable(includeColumnHeaders);\n }\n if (readableStreamPulling != null) {\n if (!this.useBlobFallback) {\n if (this.streamTimeout != null) {\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: UpdateEventData,\n snapshotIndex: number,\n snapshotStartRow: GridRangeIndex,\n snapshotEndRow: GridRangeIndex\n ): void {\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: string): void {\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.name = 'iframe';\n document.body.appendChild(iframe);\n this.iframes.push(iframe);\n }\n\n render(): null {\n return null;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TableSaver.js","names":["PureComponent","Log","memoizeClear","FormatterUtils","TableUtils","PromiseUtils","assertNotNull","IrisGridUtils","log","module","UNFORMATTED_DATE_PATTERN","isUpdateEventData","data","added","undefined","assertIsUpdateEventData","Error","TableSaver","csvEscapeString","str","replace","constructor","props","isCustomColumnFormatDefined","max","handlePortMessage","bind","handleSnapshotResolved","handleDownloadTimeout","state","gridRanges","gridRangeCounter","rangedSnapshotsTotal","rangedSnapshotCounter","includeColumnHeaders","useUnformattedValues","snapshotsTotal","snapshotCounter","snapshotsBuffer","Map","currentSnapshotIndex","snapshotPending","cancelableSnapshots","useBlobFallback","componentDidMount","getDownloadWorker","then","sw","info","postMessage","catch","error","warn","componentWillUnmount","removeIframe","streamTimeout","clearTimeout","snapshotHandlerTimeout","createWriterStream","port","useBlob","chunks","encode","TextEncoder","prototype","fileName","streamConfig","write","chunk","header","push","rows","close","blob","Blob","type","link","document","createElement","href","URL","createObjectURL","download","click","abort","cancel","end","WritableStream","startDownload","frozenTable","tableSubscription","snapshotRanges","modelRanges","isDownloading","downloadStartTime","Date","now","table","columns","columnsFromRanges","encodedFileName","encodeURIComponent","escape","messageChannel","MessageChannel","port1","fileWriter","getWriter","writeCsvTable","port2","onmessage","finishDownload","onDownloadCompleted","resetTableSaver","cancelDownload","forEach","cancelable","onDownloadCanceled","chunkRows","writeTableHeader","headerString","i","length","name","startWriteTableBody","Math","floor","DOWNLOAD_CELL_CHUNK","map","range","endRow","startRow","ceil","reduce","total","snapshotCount","makeSnapshot","min","SNAPSHOT_BUFFER_SIZE","writeSnapshot","snapshotIndex","snapshotStartRow","snapshotEndRow","has","n","get","convertSnapshotIntoCsv","delete","updateDownloadProgress","debug2","size","onDownloadProgressUpdate","downloadProgress","estimateTime","snapshot","csvString","snapshotIterator","iterator","dh","formatter","hasNext","next","value","rowIdx","j","cellData","getData","isDateType","i18n","DateTimeFormat","format","TimeZone","getTimeZone","timeZone","toString","hasCustomColumnFormat","getCachedCustomColumnFormatFlag","formatOverride","cellFormat","getFormat","formatString","getFormattedString","currentGridRange","makeCancelable","RangeSet","ofRange","err","val","readableStreamPulling","makeIframe","setTimeout","STREAM_TIMEOUT","set","SNAPSHOT_HANDLER_TIMEOUT","src","iframe","hidden","body","appendChild","remove","render","Promise","reject"],"sources":["../../src/sidebar/TableSaver.tsx"],"sourcesContent":["import { PureComponent } from 'react';\nimport type {\n Column,\n dh as DhType,\n DateWrapper,\n Table,\n TableData,\n TableViewportSubscription,\n UpdateEventData,\n} from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport { GridRange, GridRangeIndex, memoizeClear } from '@deephaven/grid';\nimport { Formatter, FormatterUtils, TableUtils } from '@deephaven/jsapi-utils';\nimport {\n CancelablePromise,\n PromiseUtils,\n assertNotNull,\n} from '@deephaven/utils';\nimport IrisGridUtils from '../IrisGridUtils';\n\nconst log = Log.module('TableSaver');\n\nconst UNFORMATTED_DATE_PATTERN = `yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS z`;\n\ninterface TableSaverProps {\n dh: DhType;\n getDownloadWorker: () => Promise<ServiceWorker>;\n isDownloading: boolean;\n onDownloadCompleted: () => void;\n onDownloadCanceled: () => void;\n onDownloadProgressUpdate: (\n progress: number,\n estimatedTime: number | null\n ) => void;\n formatter: Formatter;\n}\n\nfunction isUpdateEventData(data: TableData): data is UpdateEventData {\n return (data as UpdateEventData).added !== undefined;\n}\n\nfunction assertIsUpdateEventData(\n data: TableData\n): asserts data is UpdateEventData {\n if (!isUpdateEventData(data)) {\n throw new Error('event is not UpdateEventData');\n }\n}\n\nexport default class TableSaver extends PureComponent<\n TableSaverProps,\n Record<string, never>\n> {\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 defaultProps = {\n getDownloadWorker: (): Promise<never> =>\n Promise.reject(new Error('Download worker not provided')),\n isDownloading: false,\n onDownloadCompleted: (): void => undefined,\n onDownloadCanceled: (): void => undefined,\n onDownloadProgressUpdate: (): void => undefined,\n };\n\n static csvEscapeString(str: string): string {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n\n constructor(props: TableSaverProps) {\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.gridRanges = [];\n this.gridRangeCounter = 0;\n this.rangedSnapshotsTotal = [];\n this.rangedSnapshotCounter = 0;\n\n this.includeColumnHeaders = true;\n this.useUnformattedValues = false;\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 // 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\n this.useBlobFallback = false;\n }\n\n componentDidMount(): void {\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(): void {\n this.removeIframe();\n if (this.streamTimeout) clearTimeout(this.streamTimeout);\n if (this.snapshotHandlerTimeout) clearTimeout(this.snapshotHandlerTimeout);\n }\n\n sw?: ServiceWorker;\n\n port?: MessagePort;\n\n fileWriter?: WritableStreamDefaultWriter<unknown>;\n\n table?: Table;\n\n tableSubscription?: TableViewportSubscription;\n\n columns?: readonly Column[];\n\n fileName?: string;\n\n includeColumnHeaders: boolean;\n\n useUnformattedValues: boolean;\n\n chunkRows?: number;\n\n gridRanges: readonly GridRange[];\n\n gridRangeCounter?: number;\n\n rangedSnapshotsTotal: readonly number[];\n\n rangedSnapshotCounter?: number;\n\n snapshotsTotal: number;\n\n snapshotCounter: number;\n\n snapshotsBuffer: Map<number, UpdateEventData>;\n\n currentSnapshotIndex: number;\n\n snapshotPending: number;\n\n cancelableSnapshots: (CancelablePromise<unknown> | null)[];\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 streamTimeout?: ReturnType<typeof setTimeout>;\n\n snapshotHandlerTimeout?: ReturnType<typeof setTimeout>;\n\n downloadStartTime?: number;\n\n iframe?: HTMLIFrameElement;\n\n useBlobFallback: boolean;\n\n getCachedCustomColumnFormatFlag = memoizeClear(\n FormatterUtils.isCustomColumnFormatDefined,\n { max: 10000 }\n );\n\n createWriterStream(port: MessagePort): WritableStream<{\n rows?: string | undefined;\n header?: string | undefined;\n }> {\n // use blob fall back if it's safari\n const useBlob = this.useBlobFallback;\n const chunks = [] as BlobPart[];\n let encode: ((input?: string) => Uint8Array) | null = null;\n if (useBlob) {\n encode = TextEncoder.prototype.encode.bind(new TextEncoder());\n }\n const { fileName } = this;\n\n const streamConfig = {} as UnderlyingSink<{\n rows?: string | undefined;\n header?: string | undefined;\n }>;\n if (useBlob) {\n streamConfig.write = (chunk: { rows?: string; header?: string }) => {\n assertNotNull(encode);\n if (chunk.header !== undefined) {\n chunks.push(encode(chunk.header));\n }\n if (chunk.rows !== undefined) {\n chunks.push(encode(chunk.rows));\n }\n };\n streamConfig.close = () => {\n assertNotNull(fileName);\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: unknown) => {\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 WritableStream(streamConfig);\n }\n\n startDownload(\n fileName: string,\n frozenTable: Table,\n tableSubscription: TableViewportSubscription,\n snapshotRanges: readonly GridRange[],\n modelRanges: readonly GridRange[],\n includeColumnHeaders: boolean,\n useUnformattedValues: boolean\n ): void {\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 = IrisGridUtils.columnsFromRanges(\n modelRanges,\n frozenTable.columns\n );\n this.tableSubscription = tableSubscription;\n this.gridRanges = snapshotRanges;\n this.includeColumnHeaders = includeColumnHeaders;\n this.useUnformattedValues = useUnformattedValues;\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(includeColumnHeaders);\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(): void {\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 if (this.downloadStartTime !== undefined) {\n log.info(\n `download finished, total elapsed time ${\n (Date.now() - this.downloadStartTime) / 1000\n } seconds`\n );\n }\n }\n\n cancelDownload(): void {\n this.table?.close();\n this.tableSubscription?.close();\n this.fileWriter?.abort();\n\n this.cancelableSnapshots.forEach(cancelable => {\n if (cancelable) {\n cancelable.catch(() => null);\n cancelable.cancel();\n }\n });\n const { onDownloadCanceled } = this.props;\n onDownloadCanceled();\n this.resetTableSaver();\n }\n\n resetTableSaver(): void {\n this.table = undefined;\n this.tableSubscription = undefined;\n this.columns = undefined;\n this.chunkRows = undefined;\n this.removeIframe();\n\n this.gridRanges = [];\n this.gridRangeCounter = 0;\n this.rangedSnapshotsTotal = [];\n this.rangedSnapshotCounter = 0;\n\n this.includeColumnHeaders = true;\n this.useUnformattedValues = false;\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 if (this.streamTimeout != null) {\n clearTimeout(this.streamTimeout);\n }\n\n if (this.snapshotHandlerTimeout != null) {\n clearTimeout(this.snapshotHandlerTimeout);\n }\n this.streamTimeout = undefined;\n this.snapshotHandlerTimeout = undefined;\n }\n\n handleDownloadTimeout(): void {\n log.info('download canceled');\n this.cancelDownload();\n }\n\n writeTableHeader(): void {\n let headerString = '';\n if (this.columns) {\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 }\n this.fileWriter?.write({ header: headerString }).then(() => null);\n }\n\n startWriteTableBody(): void {\n if (this.columns && this.gridRanges != null) {\n this.chunkRows = Math.floor(\n TableSaver.DOWNLOAD_CELL_CHUNK / this.columns.length\n );\n\n this.rangedSnapshotsTotal = this.gridRanges.map((range: GridRange) => {\n assertNotNull(range.endRow);\n assertNotNull(range.startRow);\n assertNotNull(this.chunkRows);\n\n return Math.ceil((range.endRow - range.startRow + 1) / this.chunkRows);\n });\n this.snapshotsTotal = this.rangedSnapshotsTotal.reduce(\n (total: number, snapshotCount: number) => 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\n writeCsvTable(includeColumnHeaders: boolean): void {\n if (includeColumnHeaders) {\n this.writeTableHeader();\n }\n this.startWriteTableBody();\n }\n\n writeSnapshot(\n snapshotIndex: number,\n snapshotStartRow: GridRangeIndex,\n snapshotEndRow: GridRangeIndex\n ): void {\n if (this.currentSnapshotIndex === snapshotIndex && this.fileWriter) {\n while (this.snapshotsBuffer.has(this.currentSnapshotIndex)) {\n const n = this.snapshotsBuffer.get(this.currentSnapshotIndex);\n assertNotNull(n);\n this.fileWriter.write({\n rows: this.convertSnapshotIntoCsv(n),\n });\n this.snapshotsBuffer.delete(this.currentSnapshotIndex);\n this.currentSnapshotIndex += 1;\n\n this.updateDownloadProgress(snapshotIndex);\n }\n if (\n this.snapshotsTotal &&\n this.currentSnapshotIndex >= this.snapshotsTotal\n ) {\n this.finishDownload();\n return;\n }\n }\n\n if (\n this.snapshotCounter &&\n this.snapshotsTotal &&\n this.snapshotCounter < this.snapshotsTotal\n ) {\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: GridRangeIndex): void {\n if (\n snapshotIndex != null &&\n this.snapshotsTotal != null &&\n this.downloadStartTime != null\n ) {\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\n convertSnapshotIntoCsv(snapshot: UpdateEventData): string {\n let csvString = '';\n const snapshotIterator = snapshot.added.iterator();\n const { dh, formatter } = this.props;\n\n const rows = [];\n while (snapshotIterator.hasNext()) {\n rows.push(snapshotIterator.next().value);\n }\n\n assertNotNull(this.columns);\n\n const { useUnformattedValues } = this;\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 let cellData = null;\n if (useUnformattedValues) {\n let value = snapshot.getData(rowIdx, this.columns[j]) ?? '';\n if (value !== '' && TableUtils.isDateType(type)) {\n // value is just a long value, we should return the value formatted as a full date string\n value = dh.i18n.DateTimeFormat.format(\n UNFORMATTED_DATE_PATTERN,\n value as number | Date | DateWrapper,\n dh.i18n.TimeZone.getTimeZone(formatter.timeZone)\n );\n }\n cellData = value.toString();\n } else {\n const hasCustomColumnFormat = this.getCachedCustomColumnFormatFlag(\n formatter,\n name,\n type\n );\n let formatOverride = null;\n if (!hasCustomColumnFormat) {\n const cellFormat = snapshot.getFormat(rowIdx, this.columns[j]);\n formatOverride =\n cellFormat?.formatString != null ? cellFormat : null;\n }\n if (formatOverride) {\n cellData = formatter.getFormattedString(\n snapshot.getData(rowIdx, this.columns[j]),\n type,\n name,\n formatOverride\n );\n } else {\n cellData = formatter.getFormattedString(\n snapshot.getData(rowIdx, this.columns[j]),\n type,\n name\n );\n }\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: number): void {\n if (n <= 0) {\n return;\n }\n const { dh } = this.props;\n assertNotNull(this.gridRangeCounter);\n let i = 0;\n let currentGridRange = this.gridRanges[this.gridRangeCounter];\n\n assertNotNull(this.tableSubscription);\n assertNotNull(this.columns);\n while (i < n) {\n assertNotNull(currentGridRange);\n assertNotNull(currentGridRange.startRow);\n assertNotNull(currentGridRange.endRow);\n assertNotNull(this.rangedSnapshotCounter);\n assertNotNull(this.chunkRows);\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 assertIsUpdateEventData(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({\n data,\n }: MessageEvent<{\n download: unknown;\n readableStreamPulling: unknown;\n }>): void {\n const { download, readableStreamPulling } = data;\n if (this.useBlobFallback) {\n return;\n }\n if (download != null) {\n const { includeColumnHeaders } = this;\n this.makeIframe(`${download}`);\n this.writeCsvTable(includeColumnHeaders);\n }\n if (readableStreamPulling != null) {\n if (!this.useBlobFallback) {\n if (this.streamTimeout != null) {\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: UpdateEventData,\n snapshotIndex: number,\n snapshotStartRow: GridRangeIndex,\n snapshotEndRow: GridRangeIndex\n ): void {\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: string): void {\n // make a return value and make it static method\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n iframe.src = src;\n iframe.name = 'iframe';\n document.body.appendChild(iframe);\n this.iframe = iframe;\n }\n\n removeIframe(): void {\n this.iframe?.remove();\n this.iframe = undefined;\n }\n\n render(): null {\n return null;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ColumnFormatEditor.js","names":["React","useCallback","useEffect","useState","Log","ComboBox","getDefaultConditionConfigForType","getConditionConfig","getDefaultStyleConfig","FormatStyleType","ConditionEditor","StyleEditor","log","module","DEFAULT_CALLBACK","undefined","makeDefaultConfig","columns","type","name","column","config","style","ColumnFormatEditor","props","dh","onChange","selectedColumn","setColumn","find","c","conditionConfig","setConditionConfig","conditionValid","setConditionValid","selectedStyle","setStyle","handleColumnChange","value","newColumn","error","handleConditionChange","updatedConditionConfig","isValid","debug","handleStyleChange","updatedStyleConfig","updateColumnFormat","NO_FORMATTING","columnInputOptions","map","title"],"sources":["../../../src/sidebar/conditional-formatting/ColumnFormatEditor.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useState } from 'react';\nimport Log from '@deephaven/log';\nimport { ComboBox } from '@deephaven/components';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\nimport {\n BaseFormatConfig,\n ChangeCallback,\n getDefaultConditionConfigForType,\n getConditionConfig,\n getDefaultStyleConfig,\n ModelColumn,\n FormatStyleType,\n} from './ConditionalFormattingUtils';\nimport ConditionEditor from './ConditionEditor';\nimport StyleEditor from './StyleEditor';\n\nconst log = Log.module('ColumnFormatEditor');\n\nexport interface ColumnFormatEditorProps {\n columns: ModelColumn[];\n config?: BaseFormatConfig;\n dh: DhType;\n onChange?: ChangeCallback;\n}\n\nconst DEFAULT_CALLBACK = () => undefined;\n\nfunction makeDefaultConfig(columns: ModelColumn[]): BaseFormatConfig {\n const { type, name } = columns[0];\n const column = { type, name };\n const config = {\n column,\n style: getDefaultStyleConfig(),\n ...getDefaultConditionConfigForType(type),\n };\n return config;\n}\n\nfunction ColumnFormatEditor(props: ColumnFormatEditorProps): JSX.Element {\n const {\n columns,\n config = makeDefaultConfig(columns),\n dh,\n onChange = DEFAULT_CALLBACK,\n } = props;\n\n const [selectedColumn, setColumn] = useState(\n columns.find(\n c => c.name === config.column.name && c.type === config.column.type\n ) ?? columns[0]\n );\n const [conditionConfig, setConditionConfig] = useState(\n getConditionConfig(config)\n );\n const [conditionValid, setConditionValid] = useState(false);\n const [selectedStyle, setStyle] = useState(config.style);\n\n const handleColumnChange = useCallback(\n value => {\n const newColumn = columns.find(({ name }) => name === value);\n if (newColumn !== undefined) {\n setColumn(newColumn);\n if (selectedColumn.type !== newColumn.type) {\n setConditionConfig(getDefaultConditionConfigForType(newColumn.type));\n setConditionValid(false);\n }\n } else {\n log.error(`Column ${value} not found.`);\n }\n },\n [columns, selectedColumn]\n );\n\n const handleConditionChange = useCallback(\n (updatedConditionConfig, isValid) => {\n log.debug('handleConditionChange', updatedConditionConfig, isValid);\n setConditionConfig(updatedConditionConfig);\n setConditionValid(isValid);\n },\n []\n );\n\n const handleStyleChange = useCallback(updatedStyleConfig => {\n log.debug('handleStyleChange', updatedStyleConfig);\n setStyle(updatedStyleConfig);\n }, []);\n\n useEffect(\n function updateColumnFormat() {\n let isValid = conditionValid;\n\n if (selectedColumn === undefined) {\n log.debug('Column is not selected, invalidating update.');\n isValid = false;\n }\n if (\n selectedStyle === undefined ||\n selectedStyle.type === FormatStyleType.NO_FORMATTING\n ) {\n log.debug('Style is not selected, invalidating update.');\n isValid = false;\n }\n\n const { type, name } = selectedColumn;\n const column = { type, name };\n onChange(\n {\n column,\n style: selectedStyle,\n ...conditionConfig,\n },\n isValid\n );\n },\n [onChange, selectedColumn, selectedStyle, conditionConfig, conditionValid]\n );\n\n const columnInputOptions = columns.map(({ name }) => ({\n title: name,\n value: name,\n }));\n\n return (\n <div className=\"conditional-rule-editor form\">\n <div className=\"mb-2\">\n <label className=\"mb-0\">Format Cell If</label>\n <ComboBox\n defaultValue={selectedColumn?.name}\n options={columnInputOptions}\n inputPlaceholder=\"Select a column\"\n spellCheck={false}\n onChange={handleColumnChange}\n searchPlaceholder=\"Filter columns\"\n />\n </div>\n\n {selectedColumn !== undefined && (\n <>\n <ConditionEditor\n dh={dh}\n column={selectedColumn}\n config={conditionConfig}\n onChange={handleConditionChange}\n />\n <StyleEditor config={selectedStyle} onChange={handleStyleChange} />\n </>\n )}\n </div>\n );\n}\n\nexport default ColumnFormatEditor;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ColumnFormatEditor.js","names":["React","useCallback","useEffect","useState","Log","ComboBox","getDefaultConditionConfigForType","getConditionConfig","getDefaultStyleConfig","FormatStyleType","ConditionEditor","StyleEditor","log","module","DEFAULT_CALLBACK","undefined","makeDefaultConfig","columns","type","name","column","config","style","ColumnFormatEditor","props","dh","onChange","selectedColumn","setColumn","find","c","conditionConfig","setConditionConfig","conditionValid","setConditionValid","selectedStyle","setStyle","handleColumnChange","value","newColumn","error","handleConditionChange","updatedConditionConfig","isValid","debug","handleStyleChange","updatedStyleConfig","updateColumnFormat","NO_FORMATTING","columnInputOptions","map","title"],"sources":["../../../src/sidebar/conditional-formatting/ColumnFormatEditor.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useState } from 'react';\nimport Log from '@deephaven/log';\nimport { ComboBox } from '@deephaven/components';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\nimport {\n BaseFormatConfig,\n ChangeCallback,\n getDefaultConditionConfigForType,\n getConditionConfig,\n getDefaultStyleConfig,\n ModelColumn,\n FormatStyleType,\n} from './ConditionalFormattingUtils';\nimport ConditionEditor from './ConditionEditor';\nimport StyleEditor from './StyleEditor';\n\nconst log = Log.module('ColumnFormatEditor');\n\nexport interface ColumnFormatEditorProps {\n columns: ModelColumn[];\n config?: BaseFormatConfig;\n dh: DhType;\n onChange?: ChangeCallback;\n}\n\nconst DEFAULT_CALLBACK = (): void => undefined;\n\nfunction makeDefaultConfig(columns: ModelColumn[]): BaseFormatConfig {\n const { type, name } = columns[0];\n const column = { type, name };\n const config = {\n column,\n style: getDefaultStyleConfig(),\n ...getDefaultConditionConfigForType(type),\n };\n return config;\n}\n\nfunction ColumnFormatEditor(props: ColumnFormatEditorProps): JSX.Element {\n const {\n columns,\n config = makeDefaultConfig(columns),\n dh,\n onChange = DEFAULT_CALLBACK,\n } = props;\n\n const [selectedColumn, setColumn] = useState(\n columns.find(\n c => c.name === config.column.name && c.type === config.column.type\n ) ?? columns[0]\n );\n const [conditionConfig, setConditionConfig] = useState(\n getConditionConfig(config)\n );\n const [conditionValid, setConditionValid] = useState(false);\n const [selectedStyle, setStyle] = useState(config.style);\n\n const handleColumnChange = useCallback(\n value => {\n const newColumn = columns.find(({ name }) => name === value);\n if (newColumn !== undefined) {\n setColumn(newColumn);\n if (selectedColumn.type !== newColumn.type) {\n setConditionConfig(getDefaultConditionConfigForType(newColumn.type));\n setConditionValid(false);\n }\n } else {\n log.error(`Column ${value} not found.`);\n }\n },\n [columns, selectedColumn]\n );\n\n const handleConditionChange = useCallback(\n (updatedConditionConfig, isValid) => {\n log.debug('handleConditionChange', updatedConditionConfig, isValid);\n setConditionConfig(updatedConditionConfig);\n setConditionValid(isValid);\n },\n []\n );\n\n const handleStyleChange = useCallback(updatedStyleConfig => {\n log.debug('handleStyleChange', updatedStyleConfig);\n setStyle(updatedStyleConfig);\n }, []);\n\n useEffect(\n function updateColumnFormat() {\n let isValid = conditionValid;\n\n if (selectedColumn === undefined) {\n log.debug('Column is not selected, invalidating update.');\n isValid = false;\n }\n if (\n selectedStyle === undefined ||\n selectedStyle.type === FormatStyleType.NO_FORMATTING\n ) {\n log.debug('Style is not selected, invalidating update.');\n isValid = false;\n }\n\n const { type, name } = selectedColumn;\n const column = { type, name };\n onChange(\n {\n column,\n style: selectedStyle,\n ...conditionConfig,\n },\n isValid\n );\n },\n [onChange, selectedColumn, selectedStyle, conditionConfig, conditionValid]\n );\n\n const columnInputOptions = columns.map(({ name }) => ({\n title: name,\n value: name,\n }));\n\n return (\n <div className=\"conditional-rule-editor form\">\n <div className=\"mb-2\">\n <label className=\"mb-0\">Format Cell If</label>\n <ComboBox\n defaultValue={selectedColumn?.name}\n options={columnInputOptions}\n inputPlaceholder=\"Select a column\"\n spellCheck={false}\n onChange={handleColumnChange}\n searchPlaceholder=\"Filter columns\"\n />\n </div>\n\n {selectedColumn !== undefined && (\n <>\n <ConditionEditor\n dh={dh}\n column={selectedColumn}\n config={conditionConfig}\n onChange={handleConditionChange}\n />\n <StyleEditor config={selectedStyle} onChange={handleStyleChange} />\n </>\n )}\n </div>\n );\n}\n\nexport default ColumnFormatEditor;\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useEffect, useMemo, useState } from 'react';
1
+ import { useCallback, useEffect, useMemo, useState } from 'react';
2
2
  import { TableUtils } from '@deephaven/jsapi-utils';
3
3
  import Log from '@deephaven/log';
4
4
  import { StringCondition, DateCondition, getLabelForNumberCondition, getLabelForDateCondition, getLabelForStringCondition, NumberCondition, getDefaultConditionForType, getLabelForBooleanCondition, BooleanCondition, CharCondition, getLabelForCharCondition, isDateConditionValid, getDefaultValueForType } from "./ConditionalFormattingUtils.js";