@deephaven/iris-grid 0.22.3-beta.15 → 0.22.3-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AdvancedFilterCreator.js +7 -65
- package/dist/AdvancedFilterCreator.js.map +1 -1
- package/dist/AdvancedFilterCreatorFilterItem.js +0 -23
- package/dist/AdvancedFilterCreatorFilterItem.js.map +1 -1
- package/dist/AdvancedFilterCreatorSelectValue.js +0 -52
- package/dist/AdvancedFilterCreatorSelectValue.js.map +1 -1
- package/dist/AdvancedFilterCreatorSelectValueList.js +2 -42
- package/dist/AdvancedFilterCreatorSelectValueList.js.map +1 -1
- package/dist/ColumnHeaderGroup.js +0 -11
- package/dist/ColumnHeaderGroup.js.map +1 -1
- package/dist/ColumnStatistics.js +1 -20
- package/dist/ColumnStatistics.js.map +1 -1
- package/dist/CrossColumnSearch.js +2 -23
- package/dist/CrossColumnSearch.js.map +1 -1
- package/dist/FilterInputField.js +2 -36
- package/dist/FilterInputField.js.map +1 -1
- package/dist/GotoRow.d.ts +1 -1
- package/dist/GotoRow.d.ts.map +1 -1
- package/dist/GotoRow.js +2 -7
- package/dist/GotoRow.js.map +1 -1
- package/dist/IrisGrid.d.ts +41 -35
- package/dist/IrisGrid.d.ts.map +1 -1
- package/dist/IrisGrid.js +77 -519
- package/dist/IrisGrid.js.map +1 -1
- package/dist/IrisGridBottomBar.d.ts +1 -1
- package/dist/IrisGridBottomBar.d.ts.map +1 -1
- package/dist/IrisGridBottomBar.js +2 -2
- package/dist/IrisGridBottomBar.js.map +1 -1
- package/dist/IrisGridCellOverflowModal.js +6 -21
- package/dist/IrisGridCellOverflowModal.js.map +1 -1
- package/dist/IrisGridCopyHandler.js +3 -50
- package/dist/IrisGridCopyHandler.js.map +1 -1
- package/dist/IrisGridMetricCalculator.js +2 -12
- package/dist/IrisGridMetricCalculator.js.map +1 -1
- package/dist/IrisGridModel.js +32 -58
- package/dist/IrisGridModel.js.map +1 -1
- package/dist/IrisGridModelFactory.js +0 -7
- package/dist/IrisGridModelFactory.js.map +1 -1
- package/dist/IrisGridModelUpdater.js +0 -4
- package/dist/IrisGridModelUpdater.js.map +1 -1
- package/dist/IrisGridPartitionSelector.js +0 -23
- package/dist/IrisGridPartitionSelector.js.map +1 -1
- package/dist/IrisGridProxyModel.js +9 -153
- package/dist/IrisGridProxyModel.js.map +1 -1
- package/dist/IrisGridRenderer.js +41 -183
- package/dist/IrisGridRenderer.js.map +1 -1
- package/dist/IrisGridShortcuts.js.map +1 -1
- package/dist/IrisGridTableModel.d.ts +2 -2
- package/dist/IrisGridTableModel.d.ts.map +1 -1
- package/dist/IrisGridTableModel.js +10 -90
- package/dist/IrisGridTableModel.js.map +1 -1
- package/dist/IrisGridTableModelTemplate.d.ts +2 -2
- package/dist/IrisGridTableModelTemplate.d.ts.map +1 -1
- package/dist/IrisGridTableModelTemplate.js +70 -461
- package/dist/IrisGridTableModelTemplate.js.map +1 -1
- package/dist/IrisGridTestUtils.js +0 -23
- package/dist/IrisGridTestUtils.js.map +1 -1
- package/dist/IrisGridTheme.js.map +1 -1
- package/dist/IrisGridTreeTableModel.js +3 -42
- package/dist/IrisGridTreeTableModel.js.map +1 -1
- package/dist/IrisGridUtils.d.ts +11 -5
- package/dist/IrisGridUtils.d.ts.map +1 -1
- package/dist/IrisGridUtils.js +98 -196
- package/dist/IrisGridUtils.js.map +1 -1
- package/dist/MissingKeyError.js +0 -7
- package/dist/MissingKeyError.js.map +1 -1
- package/dist/PartitionSelectorSearch.js +2 -48
- package/dist/PartitionSelectorSearch.js.map +1 -1
- package/dist/PendingDataBottomBar.d.ts +1 -1
- package/dist/PendingDataBottomBar.d.ts.map +1 -1
- package/dist/PendingDataBottomBar.js +2 -7
- package/dist/PendingDataBottomBar.js.map +1 -1
- package/dist/TableViewportUpdater.d.ts +2 -2
- package/dist/TableViewportUpdater.d.ts.map +1 -1
- package/dist/TableViewportUpdater.js +3 -29
- package/dist/TableViewportUpdater.js.map +1 -1
- package/dist/ToastBottomBar.d.ts +1 -1
- package/dist/ToastBottomBar.d.ts.map +1 -1
- package/dist/ToastBottomBar.js +2 -4
- package/dist/ToastBottomBar.js.map +1 -1
- package/dist/TreeTableViewportUpdater.js +0 -21
- package/dist/TreeTableViewportUpdater.js.map +1 -1
- package/dist/format-context-menus/CustomFormatAction.js +4 -25
- package/dist/format-context-menus/CustomFormatAction.js.map +1 -1
- package/dist/format-context-menus/DateTimeFormatContextMenu.js +0 -7
- package/dist/format-context-menus/DateTimeFormatContextMenu.js.map +1 -1
- package/dist/format-context-menus/DecimalFormatContextMenu.js +0 -9
- package/dist/format-context-menus/DecimalFormatContextMenu.js.map +1 -1
- package/dist/format-context-menus/FormatContextMenuUtils.js +3 -9
- package/dist/format-context-menus/FormatContextMenuUtils.js.map +1 -1
- package/dist/format-context-menus/IntegerFormatContextMenu.js +0 -8
- package/dist/format-context-menus/IntegerFormatContextMenu.js.map +1 -1
- package/dist/format-context-menus/index.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/key-handlers/ClearFilterKeyHandler.js +0 -8
- package/dist/key-handlers/ClearFilterKeyHandler.js.map +1 -1
- package/dist/key-handlers/CopyKeyHandler.js +1 -10
- package/dist/key-handlers/CopyKeyHandler.js.map +1 -1
- package/dist/key-handlers/ReverseKeyHandler.js +0 -11
- package/dist/key-handlers/ReverseKeyHandler.js.map +1 -1
- package/dist/key-handlers/index.js.map +1 -1
- package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.js +2 -32
- package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.js.map +1 -1
- package/dist/mousehandlers/IrisGridColumnSelectMouseHandler.js +4 -34
- package/dist/mousehandlers/IrisGridColumnSelectMouseHandler.js.map +1 -1
- package/dist/mousehandlers/IrisGridColumnTooltipMouseHandler.js +0 -20
- package/dist/mousehandlers/IrisGridColumnTooltipMouseHandler.js.map +1 -1
- package/dist/mousehandlers/IrisGridContextMenuHandler.js +15 -105
- package/dist/mousehandlers/IrisGridContextMenuHandler.js.map +1 -1
- package/dist/mousehandlers/IrisGridDataSelectMouseHandler.js +0 -9
- package/dist/mousehandlers/IrisGridDataSelectMouseHandler.js.map +1 -1
- package/dist/mousehandlers/IrisGridFilterMouseHandler.js +0 -17
- package/dist/mousehandlers/IrisGridFilterMouseHandler.js.map +1 -1
- package/dist/mousehandlers/IrisGridSortMouseHandler.js +2 -15
- package/dist/mousehandlers/IrisGridSortMouseHandler.js.map +1 -1
- package/dist/mousehandlers/PendingMouseHandler.js +0 -6
- package/dist/mousehandlers/PendingMouseHandler.js.map +1 -1
- package/dist/mousehandlers/index.js.map +1 -1
- package/dist/sidebar/AdvancedSettings.js.map +1 -1
- package/dist/sidebar/AdvancedSettingsMenu.d.ts +4 -4
- package/dist/sidebar/AdvancedSettingsMenu.d.ts.map +1 -1
- package/dist/sidebar/AdvancedSettingsMenu.js +2 -6
- package/dist/sidebar/AdvancedSettingsMenu.js.map +1 -1
- package/dist/sidebar/AdvancedSettingsType.js +0 -2
- package/dist/sidebar/AdvancedSettingsType.js.map +1 -1
- package/dist/sidebar/ChartBuilder.js +2 -46
- package/dist/sidebar/ChartBuilder.js.map +1 -1
- package/dist/sidebar/CustomColumnBuilder.js +6 -58
- package/dist/sidebar/CustomColumnBuilder.js.map +1 -1
- package/dist/sidebar/CustomColumnInput.js +4 -15
- package/dist/sidebar/CustomColumnInput.js.map +1 -1
- package/dist/sidebar/InputEditor.js +5 -36
- package/dist/sidebar/InputEditor.js.map +1 -1
- package/dist/sidebar/OptionType.js +0 -2
- package/dist/sidebar/OptionType.js.map +1 -1
- package/dist/sidebar/RollupRows.js +9 -65
- package/dist/sidebar/RollupRows.js.map +1 -1
- package/dist/sidebar/SelectDistinctBuilder.js +0 -13
- package/dist/sidebar/SelectDistinctBuilder.js.map +1 -1
- package/dist/sidebar/TableCsvExporter.js +0 -52
- package/dist/sidebar/TableCsvExporter.js.map +1 -1
- package/dist/sidebar/TableSaver.d.ts +1 -1
- package/dist/sidebar/TableSaver.d.ts.map +1 -1
- package/dist/sidebar/TableSaver.js +10 -123
- package/dist/sidebar/TableSaver.js.map +1 -1
- package/dist/sidebar/VisibilityOrderingBuilder.d.ts +3 -2
- package/dist/sidebar/VisibilityOrderingBuilder.d.ts.map +1 -1
- package/dist/sidebar/VisibilityOrderingBuilder.js +37 -116
- package/dist/sidebar/VisibilityOrderingBuilder.js.map +1 -1
- package/dist/sidebar/aggregations/AggregationEdit.d.ts +1 -1
- package/dist/sidebar/aggregations/AggregationEdit.d.ts.map +1 -1
- package/dist/sidebar/aggregations/AggregationEdit.js +2 -14
- package/dist/sidebar/aggregations/AggregationEdit.js.map +1 -1
- package/dist/sidebar/aggregations/AggregationOperation.js +0 -2
- package/dist/sidebar/aggregations/AggregationOperation.js.map +1 -1
- package/dist/sidebar/aggregations/AggregationUtils.js +2 -5
- package/dist/sidebar/aggregations/AggregationUtils.js.map +1 -1
- package/dist/sidebar/aggregations/Aggregations.d.ts +1 -1
- package/dist/sidebar/aggregations/Aggregations.d.ts.map +1 -1
- package/dist/sidebar/aggregations/Aggregations.js +2 -12
- package/dist/sidebar/aggregations/Aggregations.js.map +1 -1
- package/dist/sidebar/conditional-formatting/ColumnFormatEditor.d.ts +1 -1
- package/dist/sidebar/conditional-formatting/ColumnFormatEditor.d.ts.map +1 -1
- package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js +2 -16
- package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js.map +1 -1
- package/dist/sidebar/conditional-formatting/ConditionEditor.d.ts +1 -1
- package/dist/sidebar/conditional-formatting/ConditionEditor.d.ts.map +1 -1
- package/dist/sidebar/conditional-formatting/ConditionEditor.js +2 -35
- package/dist/sidebar/conditional-formatting/ConditionEditor.js.map +1 -1
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.d.ts +1 -1
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.d.ts.map +1 -1
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js +2 -12
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js.map +1 -1
- package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.js +0 -3
- package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.js.map +1 -1
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.d.ts +1 -1
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.d.ts.map +1 -1
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js +16 -26
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js.map +1 -1
- package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js +9 -172
- package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js.map +1 -1
- package/dist/sidebar/conditional-formatting/RowFormatEditor.d.ts +1 -1
- package/dist/sidebar/conditional-formatting/RowFormatEditor.d.ts.map +1 -1
- package/dist/sidebar/conditional-formatting/RowFormatEditor.js +2 -16
- package/dist/sidebar/conditional-formatting/RowFormatEditor.js.map +1 -1
- package/dist/sidebar/conditional-formatting/StyleEditor.d.ts +1 -1
- package/dist/sidebar/conditional-formatting/StyleEditor.d.ts.map +1 -1
- package/dist/sidebar/conditional-formatting/StyleEditor.js +2 -12
- package/dist/sidebar/conditional-formatting/StyleEditor.js.map +1 -1
- package/dist/sidebar/icons/BarIcon.js +0 -3
- package/dist/sidebar/icons/BarIcon.js.map +1 -1
- package/dist/sidebar/icons/FormatColumnWhereIcon.js +2 -5
- package/dist/sidebar/icons/FormatColumnWhereIcon.js.map +1 -1
- package/dist/sidebar/icons/FormatRowWhereIcon.js +2 -5
- package/dist/sidebar/icons/FormatRowWhereIcon.js.map +1 -1
- package/dist/sidebar/icons/HistogramIcon.js +0 -3
- package/dist/sidebar/icons/HistogramIcon.js.map +1 -1
- package/dist/sidebar/icons/LineIcon.js +0 -3
- package/dist/sidebar/icons/LineIcon.js.map +1 -1
- package/dist/sidebar/icons/PieIcon.js +0 -3
- package/dist/sidebar/icons/PieIcon.js.map +1 -1
- package/dist/sidebar/icons/ScatterIcon.js +0 -3
- package/dist/sidebar/icons/ScatterIcon.js.map +1 -1
- package/dist/sidebar/icons/index.js.map +1 -1
- package/dist/sidebar/index.js.map +1 -1
- package/package.json +15 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdvancedFilterCreatorSelectValueList.js","names":["React","PureComponent","CSSTransition","dh","LoadingSpinner","SelectValueList","Log","log","module","AdvancedFilterCreatorSelectValueList","indexOf","value","values","i","length","v","valueOf","constructor","props","handleSelect","bind","handleViewportChange","handleSelectionUpdate","handleTableUpdate","list","selectedValues","state","itemCount","items","offset","isLoading","componentDidMount","table","startListening","componentDidUpdate","prevProps","filters","invertSelection","stopListening","resetViewport","setState","applyFilter","componentWillUnmount","itemIndex","selectedIndex","splice","push","isSelected","visibleItemIndex","onChange","top","bottom","updateViewport","updateItemSelection","event","formatter","data","detail","column","columns","r","rows","row","get","displayValue","getFormattedString","type","name","isValueSelected","debug2","size","addEventListener","Table","EVENT_UPDATED","removeEventListener","topRow","bottomRow","item","viewportSize","Math","max","setViewport","render","undefined"],"sources":["../src/AdvancedFilterCreatorSelectValueList.tsx"],"sourcesContent":["/* eslint react/no-did-update-set-state: \"off\" */\nimport React, { PureComponent } from 'react';\nimport { CSSTransition } from 'react-transition-group';\nimport dh, { FilterCondition, Table } from '@deephaven/jsapi-shim';\nimport { Formatter } from '@deephaven/jsapi-utils';\nimport {\n LoadingSpinner,\n SelectValueList,\n SelectItem,\n} from '@deephaven/components';\nimport Log from '@deephaven/log';\n\nconst log = Log.module('AdvancedFilterCreatorSelectValueList');\n\ninterface AdvancedFilterCreatorSelectValueListProps<T> {\n selectedValues: T[];\n table?: Table;\n filters: FilterCondition[];\n invertSelection: boolean;\n onChange: (selectedValues: T[], invertSelection: boolean) => void;\n formatter: Formatter;\n}\n\ninterface AdvancedFilterCreatorSelectValueListState<T> {\n itemCount: number;\n items: SelectItem<T>[];\n offset: number;\n selectedValues: T[];\n isLoading: boolean;\n}\n/**\n * Select values from a long scrollable list.\n * Swaps items in and out for infinite scrolling\n */\nclass AdvancedFilterCreatorSelectValueList<T = unknown> extends PureComponent<\n AdvancedFilterCreatorSelectValueListProps<T>,\n AdvancedFilterCreatorSelectValueListState<T>\n> {\n static defaultProps = {\n invertSelection: true,\n selectedValues: [],\n onChange: (): void => undefined,\n };\n\n /**\n * Get the index of a value in an array. Has some special handling for some types, like DateTimes and Longs.\n * @param value The value to search for\n * @param values The array of values to search within\n */\n static indexOf(\n value: { valueof?: unknown },\n values: { valueof?: unknown }[]\n ): number {\n for (let i = 0; i < values.length; i += 1) {\n const v = values[i];\n if (\n v === value ||\n (v != null &&\n v.valueOf != null &&\n value != null &&\n value.valueOf != null &&\n v.valueOf() === value.valueOf())\n ) {\n return i;\n }\n }\n\n return -1;\n }\n\n constructor(props: AdvancedFilterCreatorSelectValueListProps<T>) {\n super(props);\n\n this.handleSelect = this.handleSelect.bind(this);\n this.handleViewportChange = this.handleViewportChange.bind(this);\n this.handleSelectionUpdate = this.handleSelectionUpdate.bind(this);\n this.handleTableUpdate = this.handleTableUpdate.bind(this);\n\n this.list = null;\n\n const { selectedValues } = this.props;\n\n this.state = {\n itemCount: 0,\n items: [],\n offset: 0,\n selectedValues,\n isLoading: true,\n };\n }\n\n componentDidMount(): void {\n const { table } = this.props;\n if (table) this.startListening(table);\n }\n\n componentDidUpdate(\n prevProps: AdvancedFilterCreatorSelectValueListProps<T>\n ): void {\n const { filters, invertSelection, selectedValues, table } = this.props;\n if (prevProps.table !== table) {\n if (prevProps.table) this.stopListening(prevProps.table);\n if (table) this.startListening(table);\n this.resetViewport();\n }\n\n if (prevProps.invertSelection !== invertSelection) {\n this.setState({ selectedValues: [] }, this.handleSelectionUpdate);\n }\n\n if (prevProps.selectedValues !== selectedValues) {\n this.setState({ selectedValues }, this.handleSelectionUpdate);\n }\n\n if (prevProps.filters !== filters) {\n table?.applyFilter(filters);\n this.resetViewport();\n }\n }\n\n componentWillUnmount(): void {\n const { table } = this.props;\n if (table) this.stopListening(table);\n }\n\n list: SelectValueList<T> | null;\n\n handleSelect(itemIndex: number, value: T): void {\n const { invertSelection } = this.props;\n let { selectedValues } = this.state;\n selectedValues = [...selectedValues];\n const selectedIndex = AdvancedFilterCreatorSelectValueList.indexOf(\n value,\n selectedValues\n );\n if (selectedIndex >= 0) {\n selectedValues.splice(selectedIndex, 1);\n } else {\n selectedValues.push(value);\n }\n\n let isSelected = selectedIndex < 0;\n if (invertSelection) {\n isSelected = !isSelected;\n }\n\n const { offset } = this.state;\n let { items } = this.state;\n items = [...items];\n const visibleItemIndex = itemIndex - offset;\n if (visibleItemIndex >= 0 && visibleItemIndex < items.length) {\n items[visibleItemIndex].isSelected = isSelected;\n }\n\n this.setState({ items, selectedValues });\n\n const { onChange } = this.props;\n onChange(selectedValues, invertSelection);\n }\n\n handleViewportChange(top: number, bottom: number): void {\n this.updateViewport(top, bottom);\n }\n\n handleSelectionUpdate(): void {\n this.updateItemSelection();\n }\n\n handleTableUpdate(event: CustomEvent): void {\n const { table, formatter } = this.props;\n if (!table) return;\n\n const data = event.detail;\n const { offset } = data;\n const items = [];\n const column = table.columns[0];\n for (let r = 0; r < data.rows.length; r += 1) {\n const row = data.rows[r];\n const value = row.get(column);\n const displayValue = formatter.getFormattedString(\n value,\n column.type,\n column.name\n );\n const isSelected = this.isValueSelected(value);\n items.push({\n displayValue,\n value,\n isSelected,\n });\n }\n\n log.debug2('Received table update:', offset, items.length);\n\n const itemCount = table.size;\n this.setState({ itemCount, items, offset, isLoading: false });\n }\n\n isValueSelected(value: T): boolean {\n const { invertSelection } = this.props;\n const { selectedValues } = this.state;\n\n // Need to check if any of the valueOf matches, timestamp value that is equal\n const selectedIndex = AdvancedFilterCreatorSelectValueList.indexOf(\n value,\n selectedValues\n );\n\n return invertSelection ? selectedIndex < 0 : selectedIndex >= 0;\n }\n\n startListening(table: Table): void {\n table.addEventListener(dh.Table.EVENT_UPDATED, this.handleTableUpdate);\n }\n\n stopListening(table: Table): void {\n table.removeEventListener(dh.Table.EVENT_UPDATED, this.handleTableUpdate);\n }\n\n resetViewport(): void {\n if (this.list && this.list.topRow != null && this.list.bottomRow != null) {\n this.updateViewport(this.list.topRow, this.list.bottomRow, true);\n }\n }\n\n updateItemSelection(): void {\n let { items } = this.state;\n\n items = [...items];\n\n for (let i = 0; i < items.length; i += 1) {\n const item = items[i];\n const { value } = item;\n item.isSelected = this.isValueSelected(value);\n }\n\n this.setState({ items });\n }\n\n updateViewport(top: number, bottom: number, isLoading = false): void {\n const { table } = this.props;\n if (table == null) {\n return;\n }\n\n if (isLoading) {\n this.setState({ isLoading: true });\n }\n\n const viewportSize = bottom - top + 1;\n const topRow = Math.max(0, top - viewportSize * 3);\n const bottomRow = Math.max(topRow, bottom + viewportSize * 3);\n\n log.debug2('Setting viewport', topRow, ',', bottomRow);\n table.setViewport(topRow, bottomRow);\n }\n\n render(): React.ReactElement {\n const { offset, isLoading, items, itemCount } = this.state;\n\n return (\n <div className=\"select-value-list-wrapper\">\n <SelectValueList\n itemCount={itemCount}\n items={items}\n offset={offset}\n onSelect={this.handleSelect}\n onViewportChange={this.handleViewportChange}\n ref={list => {\n this.list = list;\n }}\n />\n <CSSTransition\n in={isLoading}\n timeout={250}\n classNames=\"fade\"\n mountOnEnter\n unmountOnExit\n >\n <div className=\"loading-list\">\n <LoadingSpinner className=\"loading-spinner-large\" />\n </div>\n </CSSTransition>\n </div>\n );\n }\n}\n\nexport default AdvancedFilterCreatorSelectValueList;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AdvancedFilterCreatorSelectValueList.js","names":["React","PureComponent","CSSTransition","dh","LoadingSpinner","SelectValueList","Log","log","module","AdvancedFilterCreatorSelectValueList","indexOf","value","values","i","length","v","valueOf","constructor","props","handleSelect","bind","handleViewportChange","handleSelectionUpdate","handleTableUpdate","list","selectedValues","state","itemCount","items","offset","isLoading","componentDidMount","table","startListening","componentDidUpdate","prevProps","filters","invertSelection","stopListening","resetViewport","setState","applyFilter","componentWillUnmount","itemIndex","selectedIndex","splice","push","isSelected","visibleItemIndex","onChange","top","bottom","updateViewport","updateItemSelection","event","formatter","data","detail","column","columns","r","rows","row","get","displayValue","getFormattedString","type","name","isValueSelected","debug2","size","addEventListener","Table","EVENT_UPDATED","removeEventListener","topRow","bottomRow","item","viewportSize","Math","max","setViewport","render","undefined"],"sources":["../src/AdvancedFilterCreatorSelectValueList.tsx"],"sourcesContent":["/* eslint react/no-did-update-set-state: \"off\" */\nimport React, { PureComponent } from 'react';\nimport { CSSTransition } from 'react-transition-group';\nimport dh, { FilterCondition, Table } from '@deephaven/jsapi-shim';\nimport { Formatter } from '@deephaven/jsapi-utils';\nimport {\n LoadingSpinner,\n SelectValueList,\n SelectItem,\n} from '@deephaven/components';\nimport Log from '@deephaven/log';\n\nconst log = Log.module('AdvancedFilterCreatorSelectValueList');\n\ninterface AdvancedFilterCreatorSelectValueListProps<T> {\n selectedValues: T[];\n table?: Table;\n filters: FilterCondition[];\n invertSelection: boolean;\n onChange: (selectedValues: T[], invertSelection: boolean) => void;\n formatter: Formatter;\n}\n\ninterface AdvancedFilterCreatorSelectValueListState<T> {\n itemCount: number;\n items: SelectItem<T>[];\n offset: number;\n selectedValues: T[];\n isLoading: boolean;\n}\n/**\n * Select values from a long scrollable list.\n * Swaps items in and out for infinite scrolling\n */\nclass AdvancedFilterCreatorSelectValueList<T = unknown> extends PureComponent<\n AdvancedFilterCreatorSelectValueListProps<T>,\n AdvancedFilterCreatorSelectValueListState<T>\n> {\n static defaultProps = {\n invertSelection: true,\n selectedValues: [],\n onChange: (): void => undefined,\n };\n\n /**\n * Get the index of a value in an array. Has some special handling for some types, like DateTimes and Longs.\n * @param value The value to search for\n * @param values The array of values to search within\n */\n static indexOf(\n value: { valueof?: unknown },\n values: { valueof?: unknown }[]\n ): number {\n for (let i = 0; i < values.length; i += 1) {\n const v = values[i];\n if (\n v === value ||\n (v != null &&\n v.valueOf != null &&\n value != null &&\n value.valueOf != null &&\n v.valueOf() === value.valueOf())\n ) {\n return i;\n }\n }\n\n return -1;\n }\n\n constructor(props: AdvancedFilterCreatorSelectValueListProps<T>) {\n super(props);\n\n this.handleSelect = this.handleSelect.bind(this);\n this.handleViewportChange = this.handleViewportChange.bind(this);\n this.handleSelectionUpdate = this.handleSelectionUpdate.bind(this);\n this.handleTableUpdate = this.handleTableUpdate.bind(this);\n\n this.list = null;\n\n const { selectedValues } = this.props;\n\n this.state = {\n itemCount: 0,\n items: [],\n offset: 0,\n selectedValues,\n isLoading: true,\n };\n }\n\n componentDidMount(): void {\n const { table } = this.props;\n if (table) this.startListening(table);\n }\n\n componentDidUpdate(\n prevProps: AdvancedFilterCreatorSelectValueListProps<T>\n ): void {\n const { filters, invertSelection, selectedValues, table } = this.props;\n if (prevProps.table !== table) {\n if (prevProps.table) this.stopListening(prevProps.table);\n if (table) this.startListening(table);\n this.resetViewport();\n }\n\n if (prevProps.invertSelection !== invertSelection) {\n this.setState({ selectedValues: [] }, this.handleSelectionUpdate);\n }\n\n if (prevProps.selectedValues !== selectedValues) {\n this.setState({ selectedValues }, this.handleSelectionUpdate);\n }\n\n if (prevProps.filters !== filters) {\n table?.applyFilter(filters);\n this.resetViewport();\n }\n }\n\n componentWillUnmount(): void {\n const { table } = this.props;\n if (table) this.stopListening(table);\n }\n\n list: SelectValueList<T> | null;\n\n handleSelect(itemIndex: number, value: T): void {\n const { invertSelection } = this.props;\n let { selectedValues } = this.state;\n selectedValues = [...selectedValues];\n const selectedIndex = AdvancedFilterCreatorSelectValueList.indexOf(\n value,\n selectedValues\n );\n if (selectedIndex >= 0) {\n selectedValues.splice(selectedIndex, 1);\n } else {\n selectedValues.push(value);\n }\n\n let isSelected = selectedIndex < 0;\n if (invertSelection) {\n isSelected = !isSelected;\n }\n\n const { offset } = this.state;\n let { items } = this.state;\n items = [...items];\n const visibleItemIndex = itemIndex - offset;\n if (visibleItemIndex >= 0 && visibleItemIndex < items.length) {\n items[visibleItemIndex].isSelected = isSelected;\n }\n\n this.setState({ items, selectedValues });\n\n const { onChange } = this.props;\n onChange(selectedValues, invertSelection);\n }\n\n handleViewportChange(top: number, bottom: number): void {\n this.updateViewport(top, bottom);\n }\n\n handleSelectionUpdate(): void {\n this.updateItemSelection();\n }\n\n handleTableUpdate(event: CustomEvent): void {\n const { table, formatter } = this.props;\n if (!table) return;\n\n const data = event.detail;\n const { offset } = data;\n const items = [];\n const column = table.columns[0];\n for (let r = 0; r < data.rows.length; r += 1) {\n const row = data.rows[r];\n const value = row.get(column);\n const displayValue = formatter.getFormattedString(\n value,\n column.type,\n column.name\n );\n const isSelected = this.isValueSelected(value);\n items.push({\n displayValue,\n value,\n isSelected,\n });\n }\n\n log.debug2('Received table update:', offset, items.length);\n\n const itemCount = table.size;\n this.setState({ itemCount, items, offset, isLoading: false });\n }\n\n isValueSelected(value: T): boolean {\n const { invertSelection } = this.props;\n const { selectedValues } = this.state;\n\n // Need to check if any of the valueOf matches, timestamp value that is equal\n const selectedIndex = AdvancedFilterCreatorSelectValueList.indexOf(\n value,\n selectedValues\n );\n\n return invertSelection ? selectedIndex < 0 : selectedIndex >= 0;\n }\n\n startListening(table: Table): void {\n table.addEventListener(dh.Table.EVENT_UPDATED, this.handleTableUpdate);\n }\n\n stopListening(table: Table): void {\n table.removeEventListener(dh.Table.EVENT_UPDATED, this.handleTableUpdate);\n }\n\n resetViewport(): void {\n if (this.list && this.list.topRow != null && this.list.bottomRow != null) {\n this.updateViewport(this.list.topRow, this.list.bottomRow, true);\n }\n }\n\n updateItemSelection(): void {\n let { items } = this.state;\n\n items = [...items];\n\n for (let i = 0; i < items.length; i += 1) {\n const item = items[i];\n const { value } = item;\n item.isSelected = this.isValueSelected(value);\n }\n\n this.setState({ items });\n }\n\n updateViewport(top: number, bottom: number, isLoading = false): void {\n const { table } = this.props;\n if (table == null) {\n return;\n }\n\n if (isLoading) {\n this.setState({ isLoading: true });\n }\n\n const viewportSize = bottom - top + 1;\n const topRow = Math.max(0, top - viewportSize * 3);\n const bottomRow = Math.max(topRow, bottom + viewportSize * 3);\n\n log.debug2('Setting viewport', topRow, ',', bottomRow);\n table.setViewport(topRow, bottomRow);\n }\n\n render(): React.ReactElement {\n const { offset, isLoading, items, itemCount } = this.state;\n\n return (\n <div className=\"select-value-list-wrapper\">\n <SelectValueList\n itemCount={itemCount}\n items={items}\n offset={offset}\n onSelect={this.handleSelect}\n onViewportChange={this.handleViewportChange}\n ref={list => {\n this.list = list;\n }}\n />\n <CSSTransition\n in={isLoading}\n timeout={250}\n classNames=\"fade\"\n mountOnEnter\n unmountOnExit\n >\n <div className=\"loading-list\">\n <LoadingSpinner className=\"loading-spinner-large\" />\n </div>\n </CSSTransition>\n </div>\n );\n }\n}\n\nexport default AdvancedFilterCreatorSelectValueList;\n"],"mappings":";AAAA;AACA,OAAOA,KAAK,IAAIC,aAAa,QAAQ,OAAO;AAC5C,SAASC,aAAa,QAAQ,wBAAwB;AACtD,OAAOC,EAAE,MAAkC,uBAAuB;AAElE,SACEC,cAAc,EACdC,eAAe,QAEV,uBAAuB;AAC9B,OAAOC,GAAG,MAAM,gBAAgB;AAEhC,IAAMC,GAAG,GAAGD,GAAG,CAACE,MAAM,CAAC,sCAAsC,CAAC;AAkB9D;AACA;AACA;AACA;AACA,MAAMC,oCAAoC,SAAsBR,aAAa,CAG3E;EAOA;AACF;AACA;AACA;AACA;EACE,OAAOS,OAAO,CACZC,KAA4B,EAC5BC,MAA+B,EACvB;IACR,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGD,MAAM,CAACE,MAAM,EAAED,CAAC,IAAI,CAAC,EAAE;MACzC,IAAME,CAAC,GAAGH,MAAM,CAACC,CAAC,CAAC;MACnB,IACEE,CAAC,KAAKJ,KAAK,IACVI,CAAC,IAAI,IAAI,IACRA,CAAC,CAACC,OAAO,IAAI,IAAI,IACjBL,KAAK,IAAI,IAAI,IACbA,KAAK,CAACK,OAAO,IAAI,IAAI,IACrBD,CAAC,CAACC,OAAO,EAAE,KAAKL,KAAK,CAACK,OAAO,EAAG,EAClC;QACA,OAAOH,CAAC;MACV;IACF;IAEA,OAAO,CAAC,CAAC;EACX;EAEAI,WAAW,CAACC,KAAmD,EAAE;IAC/D,KAAK,CAACA,KAAK,CAAC;IAAC;IAEb,IAAI,CAACC,YAAY,GAAG,IAAI,CAACA,YAAY,CAACC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACC,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAACD,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAACE,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAACF,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAACG,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACH,IAAI,CAAC,IAAI,CAAC;IAE1D,IAAI,CAACI,IAAI,GAAG,IAAI;IAEhB,IAAM;MAAEC;IAAe,CAAC,GAAG,IAAI,CAACP,KAAK;IAErC,IAAI,CAACQ,KAAK,GAAG;MACXC,SAAS,EAAE,CAAC;MACZC,KAAK,EAAE,EAAE;MACTC,MAAM,EAAE,CAAC;MACTJ,cAAc;MACdK,SAAS,EAAE;IACb,CAAC;EACH;EAEAC,iBAAiB,GAAS;IACxB,IAAM;MAAEC;IAAM,CAAC,GAAG,IAAI,CAACd,KAAK;IAC5B,IAAIc,KAAK,EAAE,IAAI,CAACC,cAAc,CAACD,KAAK,CAAC;EACvC;EAEAE,kBAAkB,CAChBC,SAAuD,EACjD;IACN,IAAM;MAAEC,OAAO;MAAEC,eAAe;MAAEZ,cAAc;MAAEO;IAAM,CAAC,GAAG,IAAI,CAACd,KAAK;IACtE,IAAIiB,SAAS,CAACH,KAAK,KAAKA,KAAK,EAAE;MAC7B,IAAIG,SAAS,CAACH,KAAK,EAAE,IAAI,CAACM,aAAa,CAACH,SAAS,CAACH,KAAK,CAAC;MACxD,IAAIA,KAAK,EAAE,IAAI,CAACC,cAAc,CAACD,KAAK,CAAC;MACrC,IAAI,CAACO,aAAa,EAAE;IACtB;IAEA,IAAIJ,SAAS,CAACE,eAAe,KAAKA,eAAe,EAAE;MACjD,IAAI,CAACG,QAAQ,CAAC;QAAEf,cAAc,EAAE;MAAG,CAAC,EAAE,IAAI,CAACH,qBAAqB,CAAC;IACnE;IAEA,IAAIa,SAAS,CAACV,cAAc,KAAKA,cAAc,EAAE;MAC/C,IAAI,CAACe,QAAQ,CAAC;QAAEf;MAAe,CAAC,EAAE,IAAI,CAACH,qBAAqB,CAAC;IAC/D;IAEA,IAAIa,SAAS,CAACC,OAAO,KAAKA,OAAO,EAAE;MACjCJ,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAES,WAAW,CAACL,OAAO,CAAC;MAC3B,IAAI,CAACG,aAAa,EAAE;IACtB;EACF;EAEAG,oBAAoB,GAAS;IAC3B,IAAM;MAAEV;IAAM,CAAC,GAAG,IAAI,CAACd,KAAK;IAC5B,IAAIc,KAAK,EAAE,IAAI,CAACM,aAAa,CAACN,KAAK,CAAC;EACtC;EAIAb,YAAY,CAACwB,SAAiB,EAAEhC,KAAQ,EAAQ;IAC9C,IAAM;MAAE0B;IAAgB,CAAC,GAAG,IAAI,CAACnB,KAAK;IACtC,IAAI;MAAEO;IAAe,CAAC,GAAG,IAAI,CAACC,KAAK;IACnCD,cAAc,GAAG,CAAC,GAAGA,cAAc,CAAC;IACpC,IAAMmB,aAAa,GAAGnC,oCAAoC,CAACC,OAAO,CAChEC,KAAK,EACLc,cAAc,CACf;IACD,IAAImB,aAAa,IAAI,CAAC,EAAE;MACtBnB,cAAc,CAACoB,MAAM,CAACD,aAAa,EAAE,CAAC,CAAC;IACzC,CAAC,MAAM;MACLnB,cAAc,CAACqB,IAAI,CAACnC,KAAK,CAAC;IAC5B;IAEA,IAAIoC,UAAU,GAAGH,aAAa,GAAG,CAAC;IAClC,IAAIP,eAAe,EAAE;MACnBU,UAAU,GAAG,CAACA,UAAU;IAC1B;IAEA,IAAM;MAAElB;IAAO,CAAC,GAAG,IAAI,CAACH,KAAK;IAC7B,IAAI;MAAEE;IAAM,CAAC,GAAG,IAAI,CAACF,KAAK;IAC1BE,KAAK,GAAG,CAAC,GAAGA,KAAK,CAAC;IAClB,IAAMoB,gBAAgB,GAAGL,SAAS,GAAGd,MAAM;IAC3C,IAAImB,gBAAgB,IAAI,CAAC,IAAIA,gBAAgB,GAAGpB,KAAK,CAACd,MAAM,EAAE;MAC5Dc,KAAK,CAACoB,gBAAgB,CAAC,CAACD,UAAU,GAAGA,UAAU;IACjD;IAEA,IAAI,CAACP,QAAQ,CAAC;MAAEZ,KAAK;MAAEH;IAAe,CAAC,CAAC;IAExC,IAAM;MAAEwB;IAAS,CAAC,GAAG,IAAI,CAAC/B,KAAK;IAC/B+B,QAAQ,CAACxB,cAAc,EAAEY,eAAe,CAAC;EAC3C;EAEAhB,oBAAoB,CAAC6B,GAAW,EAAEC,MAAc,EAAQ;IACtD,IAAI,CAACC,cAAc,CAACF,GAAG,EAAEC,MAAM,CAAC;EAClC;EAEA7B,qBAAqB,GAAS;IAC5B,IAAI,CAAC+B,mBAAmB,EAAE;EAC5B;EAEA9B,iBAAiB,CAAC+B,KAAkB,EAAQ;IAC1C,IAAM;MAAEtB,KAAK;MAAEuB;IAAU,CAAC,GAAG,IAAI,CAACrC,KAAK;IACvC,IAAI,CAACc,KAAK,EAAE;IAEZ,IAAMwB,IAAI,GAAGF,KAAK,CAACG,MAAM;IACzB,IAAM;MAAE5B;IAAO,CAAC,GAAG2B,IAAI;IACvB,IAAM5B,KAAK,GAAG,EAAE;IAChB,IAAM8B,MAAM,GAAG1B,KAAK,CAAC2B,OAAO,CAAC,CAAC,CAAC;IAC/B,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,IAAI,CAACK,IAAI,CAAC/C,MAAM,EAAE8C,CAAC,IAAI,CAAC,EAAE;MAC5C,IAAME,GAAG,GAAGN,IAAI,CAACK,IAAI,CAACD,CAAC,CAAC;MACxB,IAAMjD,KAAK,GAAGmD,GAAG,CAACC,GAAG,CAACL,MAAM,CAAC;MAC7B,IAAMM,YAAY,GAAGT,SAAS,CAACU,kBAAkB,CAC/CtD,KAAK,EACL+C,MAAM,CAACQ,IAAI,EACXR,MAAM,CAACS,IAAI,CACZ;MACD,IAAMpB,UAAU,GAAG,IAAI,CAACqB,eAAe,CAACzD,KAAK,CAAC;MAC9CiB,KAAK,CAACkB,IAAI,CAAC;QACTkB,YAAY;QACZrD,KAAK;QACLoC;MACF,CAAC,CAAC;IACJ;IAEAxC,GAAG,CAAC8D,MAAM,CAAC,wBAAwB,EAAExC,MAAM,EAAED,KAAK,CAACd,MAAM,CAAC;IAE1D,IAAMa,SAAS,GAAGK,KAAK,CAACsC,IAAI;IAC5B,IAAI,CAAC9B,QAAQ,CAAC;MAAEb,SAAS;MAAEC,KAAK;MAAEC,MAAM;MAAEC,SAAS,EAAE;IAAM,CAAC,CAAC;EAC/D;EAEAsC,eAAe,CAACzD,KAAQ,EAAW;IACjC,IAAM;MAAE0B;IAAgB,CAAC,GAAG,IAAI,CAACnB,KAAK;IACtC,IAAM;MAAEO;IAAe,CAAC,GAAG,IAAI,CAACC,KAAK;;IAErC;IACA,IAAMkB,aAAa,GAAGnC,oCAAoC,CAACC,OAAO,CAChEC,KAAK,EACLc,cAAc,CACf;IAED,OAAOY,eAAe,GAAGO,aAAa,GAAG,CAAC,GAAGA,aAAa,IAAI,CAAC;EACjE;EAEAX,cAAc,CAACD,KAAY,EAAQ;IACjCA,KAAK,CAACuC,gBAAgB,CAACpE,EAAE,CAACqE,KAAK,CAACC,aAAa,EAAE,IAAI,CAAClD,iBAAiB,CAAC;EACxE;EAEAe,aAAa,CAACN,KAAY,EAAQ;IAChCA,KAAK,CAAC0C,mBAAmB,CAACvE,EAAE,CAACqE,KAAK,CAACC,aAAa,EAAE,IAAI,CAAClD,iBAAiB,CAAC;EAC3E;EAEAgB,aAAa,GAAS;IACpB,IAAI,IAAI,CAACf,IAAI,IAAI,IAAI,CAACA,IAAI,CAACmD,MAAM,IAAI,IAAI,IAAI,IAAI,CAACnD,IAAI,CAACoD,SAAS,IAAI,IAAI,EAAE;MACxE,IAAI,CAACxB,cAAc,CAAC,IAAI,CAAC5B,IAAI,CAACmD,MAAM,EAAE,IAAI,CAACnD,IAAI,CAACoD,SAAS,EAAE,IAAI,CAAC;IAClE;EACF;EAEAvB,mBAAmB,GAAS;IAC1B,IAAI;MAAEzB;IAAM,CAAC,GAAG,IAAI,CAACF,KAAK;IAE1BE,KAAK,GAAG,CAAC,GAAGA,KAAK,CAAC;IAElB,KAAK,IAAIf,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGe,KAAK,CAACd,MAAM,EAAED,CAAC,IAAI,CAAC,EAAE;MACxC,IAAMgE,IAAI,GAAGjD,KAAK,CAACf,CAAC,CAAC;MACrB,IAAM;QAAEF;MAAM,CAAC,GAAGkE,IAAI;MACtBA,IAAI,CAAC9B,UAAU,GAAG,IAAI,CAACqB,eAAe,CAACzD,KAAK,CAAC;IAC/C;IAEA,IAAI,CAAC6B,QAAQ,CAAC;MAAEZ;IAAM,CAAC,CAAC;EAC1B;EAEAwB,cAAc,CAACF,GAAW,EAAEC,MAAc,EAA2B;IAAA,IAAzBrB,SAAS,uEAAG,KAAK;IAC3D,IAAM;MAAEE;IAAM,CAAC,GAAG,IAAI,CAACd,KAAK;IAC5B,IAAIc,KAAK,IAAI,IAAI,EAAE;MACjB;IACF;IAEA,IAAIF,SAAS,EAAE;MACb,IAAI,CAACU,QAAQ,CAAC;QAAEV,SAAS,EAAE;MAAK,CAAC,CAAC;IACpC;IAEA,IAAMgD,YAAY,GAAG3B,MAAM,GAAGD,GAAG,GAAG,CAAC;IACrC,IAAMyB,MAAM,GAAGI,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE9B,GAAG,GAAG4B,YAAY,GAAG,CAAC,CAAC;IAClD,IAAMF,SAAS,GAAGG,IAAI,CAACC,GAAG,CAACL,MAAM,EAAExB,MAAM,GAAG2B,YAAY,GAAG,CAAC,CAAC;IAE7DvE,GAAG,CAAC8D,MAAM,CAAC,kBAAkB,EAAEM,MAAM,EAAE,GAAG,EAAEC,SAAS,CAAC;IACtD5C,KAAK,CAACiD,WAAW,CAACN,MAAM,EAAEC,SAAS,CAAC;EACtC;EAEAM,MAAM,GAAuB;IAC3B,IAAM;MAAErD,MAAM;MAAEC,SAAS;MAAEF,KAAK;MAAED;IAAU,CAAC,GAAG,IAAI,CAACD,KAAK;IAE1D,oBACE;MAAK,SAAS,EAAC;IAA2B,gBACxC,oBAAC,eAAe;MACd,SAAS,EAAEC,SAAU;MACrB,KAAK,EAAEC,KAAM;MACb,MAAM,EAAEC,MAAO;MACf,QAAQ,EAAE,IAAI,CAACV,YAAa;MAC5B,gBAAgB,EAAE,IAAI,CAACE,oBAAqB;MAC5C,GAAG,EAAEG,IAAI,IAAI;QACX,IAAI,CAACA,IAAI,GAAGA,IAAI;MAClB;IAAE,EACF,eACF,oBAAC,aAAa;MACZ,EAAE,EAAEM,SAAU;MACd,OAAO,EAAE,GAAI;MACb,UAAU,EAAC,MAAM;MACjB,YAAY;MACZ,aAAa;IAAA,gBAEb;MAAK,SAAS,EAAC;IAAc,gBAC3B,oBAAC,cAAc;MAAC,SAAS,EAAC;IAAuB,EAAG,CAChD,CACQ,CACZ;EAEV;AACF;AAAC,gBA5PKrB,oCAAoC,kBAIlB;EACpB4B,eAAe,EAAE,IAAI;EACrBZ,cAAc,EAAE,EAAE;EAClBwB,QAAQ,EAAE,MAAYkC;AACxB,CAAC;AAsPH,eAAe1E,oCAAoC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
-
|
|
3
2
|
import { GridUtils } from '@deephaven/grid';
|
|
4
3
|
import memoizeOne from 'memoize-one';
|
|
5
4
|
import Log from '@deephaven/log';
|
|
@@ -16,36 +15,26 @@ export default class ColumnHeaderGroup {
|
|
|
16
15
|
depth,
|
|
17
16
|
childIndexes
|
|
18
17
|
} = _ref;
|
|
19
|
-
|
|
20
18
|
_defineProperty(this, "name", void 0);
|
|
21
|
-
|
|
22
19
|
_defineProperty(this, "children", void 0);
|
|
23
|
-
|
|
24
20
|
_defineProperty(this, "depth", void 0);
|
|
25
|
-
|
|
26
21
|
_defineProperty(this, "color", void 0);
|
|
27
|
-
|
|
28
22
|
_defineProperty(this, "childIndexes", void 0);
|
|
29
|
-
|
|
30
23
|
_defineProperty(this, "getVisibleRange", memoizeOne(movedItems => {
|
|
31
24
|
var flattenedIndexes = this.childIndexes.flat();
|
|
32
25
|
var visibleIndexes = GridUtils.getVisibleIndexes(flattenedIndexes, movedItems);
|
|
33
26
|
var start = Math.min(...visibleIndexes);
|
|
34
27
|
var end = Math.max(...visibleIndexes);
|
|
35
|
-
|
|
36
28
|
if (end - start !== flattenedIndexes.length - 1) {
|
|
37
29
|
log.warn("Column header group ".concat(this.name, " is not contiguous"));
|
|
38
30
|
}
|
|
39
|
-
|
|
40
31
|
return [start, end];
|
|
41
32
|
}));
|
|
42
|
-
|
|
43
33
|
this.name = name;
|
|
44
34
|
this.children = children;
|
|
45
35
|
this.color = color;
|
|
46
36
|
this.depth = depth;
|
|
47
37
|
this.childIndexes = childIndexes;
|
|
48
38
|
}
|
|
49
|
-
|
|
50
39
|
}
|
|
51
40
|
//# sourceMappingURL=ColumnHeaderGroup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColumnHeaderGroup.js","names":["GridUtils","memoizeOne","Log","log","module","isColumnHeaderGroup","x","ColumnHeaderGroup","constructor","name","children","color","depth","childIndexes","movedItems","flattenedIndexes","flat","visibleIndexes","getVisibleIndexes","start","Math","min","end","max","length","warn"],"sources":["../src/ColumnHeaderGroup.ts"],"sourcesContent":["import {\n MoveOperation,\n GridUtils,\n ModelIndex,\n BoundedAxisRange,\n IColumnHeaderGroup,\n} from '@deephaven/grid';\nimport memoizeOne from 'memoize-one';\nimport Log from '@deephaven/log';\n\nconst log = Log.module('ColumnHeaderGroup');\n\nexport function isColumnHeaderGroup(x: unknown): x is ColumnHeaderGroup {\n return x instanceof ColumnHeaderGroup;\n}\n\nexport default class ColumnHeaderGroup implements IColumnHeaderGroup {\n name: string;\n\n children: string[];\n\n depth: number;\n\n color?: string;\n\n childIndexes: (ModelIndex | ModelIndex[])[];\n\n constructor({\n name,\n children,\n color,\n depth,\n childIndexes,\n }: {\n name: string;\n children: string[];\n color?: string;\n depth: number;\n childIndexes: (ModelIndex | ModelIndex[])[];\n }) {\n this.name = name;\n this.children = children;\n this.color = color;\n this.depth = depth;\n this.childIndexes = childIndexes;\n }\n\n getVisibleRange = memoizeOne(\n (movedItems: MoveOperation[]): BoundedAxisRange => {\n const flattenedIndexes = this.childIndexes.flat();\n const visibleIndexes = GridUtils.getVisibleIndexes(\n flattenedIndexes,\n movedItems\n );\n\n const start = Math.min(...visibleIndexes);\n const end = Math.max(...visibleIndexes);\n\n if (end - start !== flattenedIndexes.length - 1) {\n log.warn(`Column header group ${this.name} is not contiguous`);\n }\n\n return [start, end];\n }\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ColumnHeaderGroup.js","names":["GridUtils","memoizeOne","Log","log","module","isColumnHeaderGroup","x","ColumnHeaderGroup","constructor","name","children","color","depth","childIndexes","movedItems","flattenedIndexes","flat","visibleIndexes","getVisibleIndexes","start","Math","min","end","max","length","warn"],"sources":["../src/ColumnHeaderGroup.ts"],"sourcesContent":["import {\n MoveOperation,\n GridUtils,\n ModelIndex,\n BoundedAxisRange,\n IColumnHeaderGroup,\n} from '@deephaven/grid';\nimport memoizeOne from 'memoize-one';\nimport Log from '@deephaven/log';\n\nconst log = Log.module('ColumnHeaderGroup');\n\nexport function isColumnHeaderGroup(x: unknown): x is ColumnHeaderGroup {\n return x instanceof ColumnHeaderGroup;\n}\n\nexport default class ColumnHeaderGroup implements IColumnHeaderGroup {\n name: string;\n\n children: string[];\n\n depth: number;\n\n color?: string;\n\n childIndexes: (ModelIndex | ModelIndex[])[];\n\n constructor({\n name,\n children,\n color,\n depth,\n childIndexes,\n }: {\n name: string;\n children: string[];\n color?: string;\n depth: number;\n childIndexes: (ModelIndex | ModelIndex[])[];\n }) {\n this.name = name;\n this.children = children;\n this.color = color;\n this.depth = depth;\n this.childIndexes = childIndexes;\n }\n\n getVisibleRange = memoizeOne(\n (movedItems: MoveOperation[]): BoundedAxisRange => {\n const flattenedIndexes = this.childIndexes.flat();\n const visibleIndexes = GridUtils.getVisibleIndexes(\n flattenedIndexes,\n movedItems\n );\n\n const start = Math.min(...visibleIndexes);\n const end = Math.max(...visibleIndexes);\n\n if (end - start !== flattenedIndexes.length - 1) {\n log.warn(`Column header group ${this.name} is not contiguous`);\n }\n\n return [start, end];\n }\n );\n}\n"],"mappings":";AAAA,SAEEA,SAAS,QAIJ,iBAAiB;AACxB,OAAOC,UAAU,MAAM,aAAa;AACpC,OAAOC,GAAG,MAAM,gBAAgB;AAEhC,IAAMC,GAAG,GAAGD,GAAG,CAACE,MAAM,CAAC,mBAAmB,CAAC;AAE3C,OAAO,SAASC,mBAAmB,CAACC,CAAU,EAA0B;EACtE,OAAOA,CAAC,YAAYC,iBAAiB;AACvC;AAEA,eAAe,MAAMA,iBAAiB,CAA+B;EAWnEC,WAAW,OAYR;IAAA,IAZS;MACVC,IAAI;MACJC,QAAQ;MACRC,KAAK;MACLC,KAAK;MACLC;IAOF,CAAC;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA,yCAQiBZ,UAAU,CACzBa,UAA2B,IAAuB;MACjD,IAAMC,gBAAgB,GAAG,IAAI,CAACF,YAAY,CAACG,IAAI,EAAE;MACjD,IAAMC,cAAc,GAAGjB,SAAS,CAACkB,iBAAiB,CAChDH,gBAAgB,EAChBD,UAAU,CACX;MAED,IAAMK,KAAK,GAAGC,IAAI,CAACC,GAAG,CAAC,GAAGJ,cAAc,CAAC;MACzC,IAAMK,GAAG,GAAGF,IAAI,CAACG,GAAG,CAAC,GAAGN,cAAc,CAAC;MAEvC,IAAIK,GAAG,GAAGH,KAAK,KAAKJ,gBAAgB,CAACS,MAAM,GAAG,CAAC,EAAE;QAC/CrB,GAAG,CAACsB,IAAI,+BAAwB,IAAI,CAAChB,IAAI,wBAAqB;MAChE;MAEA,OAAO,CAACU,KAAK,EAAEG,GAAG,CAAC;IACrB,CAAC,CACF;IAxBC,IAAI,CAACb,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACC,QAAQ,GAAGA,QAAQ;IACxB,IAAI,CAACC,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACC,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACC,YAAY,GAAGA,YAAY;EAClC;AAoBF"}
|
package/dist/ColumnStatistics.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
-
|
|
3
2
|
import React, { Component } from 'react';
|
|
4
3
|
import classNames from 'classnames';
|
|
5
4
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
@@ -13,20 +12,16 @@ var log = Log.module('ColumnStatistics');
|
|
|
13
12
|
var STATS_LABEL_OVERRIDES = {
|
|
14
13
|
SIZE: 'Number of Rows'
|
|
15
14
|
};
|
|
16
|
-
|
|
17
15
|
class ColumnStatistics extends Component {
|
|
18
16
|
/** Automatically generate the statistics when the row count is below this threshold */
|
|
17
|
+
|
|
19
18
|
static getStatsLabel(operation) {
|
|
20
19
|
var _STATS_LABEL_OVERRIDE;
|
|
21
|
-
|
|
22
20
|
return (_STATS_LABEL_OVERRIDE = STATS_LABEL_OVERRIDES[operation]) !== null && _STATS_LABEL_OVERRIDE !== void 0 ? _STATS_LABEL_OVERRIDE : operation.split(' ').map(w => w[0].toUpperCase() + w.substr(1).toLowerCase()).join(' ');
|
|
23
21
|
}
|
|
24
|
-
|
|
25
22
|
constructor(props) {
|
|
26
23
|
super(props);
|
|
27
|
-
|
|
28
24
|
_defineProperty(this, "cancelablePromise", void 0);
|
|
29
|
-
|
|
30
25
|
this.handleError = this.handleError.bind(this);
|
|
31
26
|
this.handleGenerateStatistics = this.handleGenerateStatistics.bind(this);
|
|
32
27
|
this.handleStatistics = this.handleStatistics.bind(this);
|
|
@@ -38,17 +33,14 @@ class ColumnStatistics extends Component {
|
|
|
38
33
|
numRows: 0
|
|
39
34
|
};
|
|
40
35
|
}
|
|
41
|
-
|
|
42
36
|
componentDidMount() {
|
|
43
37
|
this.maybeGenerateStatistics();
|
|
44
38
|
}
|
|
45
|
-
|
|
46
39
|
componentWillUnmount() {
|
|
47
40
|
if (this.cancelablePromise) {
|
|
48
41
|
this.cancelablePromise.cancel();
|
|
49
42
|
}
|
|
50
43
|
}
|
|
51
|
-
|
|
52
44
|
maybeGenerateStatistics() {
|
|
53
45
|
var {
|
|
54
46
|
model
|
|
@@ -57,7 +49,6 @@ class ColumnStatistics extends Component {
|
|
|
57
49
|
this.setState({
|
|
58
50
|
numRows
|
|
59
51
|
});
|
|
60
|
-
|
|
61
52
|
if (!model.isColumnStatisticsAvailable) {
|
|
62
53
|
this.setState({
|
|
63
54
|
loading: false
|
|
@@ -66,7 +57,6 @@ class ColumnStatistics extends Component {
|
|
|
66
57
|
this.handleGenerateStatistics();
|
|
67
58
|
}
|
|
68
59
|
}
|
|
69
|
-
|
|
70
60
|
handleGenerateStatistics() {
|
|
71
61
|
this.setState({
|
|
72
62
|
loading: true
|
|
@@ -78,7 +68,6 @@ class ColumnStatistics extends Component {
|
|
|
78
68
|
this.cancelablePromise = PromiseUtils.makeCancelable(model.columnStatistics(column));
|
|
79
69
|
this.cancelablePromise.then(this.handleStatistics).catch(this.handleError);
|
|
80
70
|
}
|
|
81
|
-
|
|
82
71
|
handleStatistics(stats) {
|
|
83
72
|
log.debug('Received statistics', stats);
|
|
84
73
|
var {
|
|
@@ -108,13 +97,11 @@ class ColumnStatistics extends Component {
|
|
|
108
97
|
});
|
|
109
98
|
onStatistics();
|
|
110
99
|
}
|
|
111
|
-
|
|
112
100
|
handleError(error) {
|
|
113
101
|
if (error != null && PromiseUtils.isCanceled(error)) {
|
|
114
102
|
log.debug('Called handleError on a cancelled promise result');
|
|
115
103
|
return;
|
|
116
104
|
}
|
|
117
|
-
|
|
118
105
|
log.error('Error generating statistics', error);
|
|
119
106
|
this.setState({
|
|
120
107
|
error,
|
|
@@ -122,7 +109,6 @@ class ColumnStatistics extends Component {
|
|
|
122
109
|
statistics: null
|
|
123
110
|
});
|
|
124
111
|
}
|
|
125
|
-
|
|
126
112
|
render() {
|
|
127
113
|
var {
|
|
128
114
|
column,
|
|
@@ -138,7 +124,6 @@ class ColumnStatistics extends Component {
|
|
|
138
124
|
var statisticElements = [];
|
|
139
125
|
var columnType = column.type.substring(column.type.lastIndexOf('.') + 1);
|
|
140
126
|
var description = column.description === null ? null : column.description;
|
|
141
|
-
|
|
142
127
|
if (statistics != null) {
|
|
143
128
|
for (var i = 0; i < statistics.length; i += 1) {
|
|
144
129
|
var {
|
|
@@ -158,7 +143,6 @@ class ColumnStatistics extends Component {
|
|
|
158
143
|
statisticElements.push(statisticElement);
|
|
159
144
|
}
|
|
160
145
|
}
|
|
161
|
-
|
|
162
146
|
var rowCountLabel = isExpandableGridModel(model) && model.hasExpandableRows ? 'Expanded Rows' : 'Number of Rows';
|
|
163
147
|
var formattedRowCount = model.displayString(numRows, 'long');
|
|
164
148
|
var columnIndex = model.getColumnIndexByName(column.name);
|
|
@@ -205,10 +189,7 @@ class ColumnStatistics extends Component {
|
|
|
205
189
|
className: "mr-2"
|
|
206
190
|
}), "Calculating Stats..."));
|
|
207
191
|
}
|
|
208
|
-
|
|
209
192
|
}
|
|
210
|
-
|
|
211
193
|
_defineProperty(ColumnStatistics, "AUTO_GENERATE_LIMIT", 100000);
|
|
212
|
-
|
|
213
194
|
export default ColumnStatistics;
|
|
214
195
|
//# sourceMappingURL=ColumnStatistics.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColumnStatistics.js","names":["React","Component","classNames","FontAwesomeIcon","Button","CopyButton","LoadingSpinner","dhFreeze","dhRefresh","vsLock","Log","PromiseUtils","isExpandableGridModel","log","module","STATS_LABEL_OVERRIDES","SIZE","ColumnStatistics","getStatsLabel","operation","split","map","w","toUpperCase","substr","toLowerCase","join","constructor","props","handleError","bind","handleGenerateStatistics","handleStatistics","cancelablePromise","state","error","loading","statistics","numRows","componentDidMount","maybeGenerateStatistics","componentWillUnmount","cancel","model","rowCount","pendingRowCount","setState","isColumnStatisticsAvailable","AUTO_GENERATE_LIMIT","column","makeCancelable","columnStatistics","then","catch","stats","debug","onStatistics","statisticsMap","forEach","value","push","type","getType","uniqueValues","className","isCanceled","render","showGenerateStatistics","statisticElements","columnType","substring","lastIndexOf","description","i","length","formattedValue","displayString","name","statisticElement","rowCountLabel","hasExpandableRows","formattedRowCount","columnIndex","getColumnIndexByName","isColumnMovable","isColumnFrozen"],"sources":["../src/ColumnStatistics.tsx"],"sourcesContent":["import React, { Component, Key } from 'react';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Button, CopyButton, LoadingSpinner } from '@deephaven/components';\nimport { dhFreeze, dhRefresh, vsLock } from '@deephaven/icons';\nimport {\n Column,\n ColumnStatistics as APIColumnStatistics,\n} from '@deephaven/jsapi-shim';\nimport Log from '@deephaven/log';\nimport { CancelablePromise, PromiseUtils } from '@deephaven/utils';\nimport { isExpandableGridModel } from '@deephaven/grid';\nimport './ColumnStatistics.scss';\nimport IrisGridModel from './IrisGridModel';\n\nconst log = Log.module('ColumnStatistics');\nconst STATS_LABEL_OVERRIDES: Record<string, string> = {\n SIZE: 'Number of Rows',\n};\n\ninterface Statistic {\n operation: Key;\n className?: string;\n value: unknown;\n type: string;\n}\n\ninterface ColumnStatisticsProps {\n column: Column;\n model: IrisGridModel;\n onStatistics: () => void;\n}\ninterface ColumnStatisticsState {\n error: unknown;\n loading: boolean;\n statistics: Statistic[] | null;\n numRows: number;\n}\n\nclass ColumnStatistics extends Component<\n ColumnStatisticsProps,\n ColumnStatisticsState\n> {\n /** Automatically generate the statistics when the row count is below this threshold */\n static AUTO_GENERATE_LIMIT = 100000;\n\n static getStatsLabel(operation: string): string {\n return (\n STATS_LABEL_OVERRIDES[operation] ??\n operation\n .split(' ')\n .map(w => w[0].toUpperCase() + w.substr(1).toLowerCase())\n .join(' ')\n );\n }\n\n constructor(props: ColumnStatisticsProps) {\n super(props);\n\n this.handleError = this.handleError.bind(this);\n this.handleGenerateStatistics = this.handleGenerateStatistics.bind(this);\n this.handleStatistics = this.handleStatistics.bind(this);\n\n this.cancelablePromise = null;\n\n this.state = {\n error: null,\n loading: false,\n statistics: null,\n numRows: 0,\n };\n }\n\n componentDidMount(): void {\n this.maybeGenerateStatistics();\n }\n\n componentWillUnmount(): void {\n if (this.cancelablePromise) {\n this.cancelablePromise.cancel();\n }\n }\n\n cancelablePromise: CancelablePromise<APIColumnStatistics> | null;\n\n maybeGenerateStatistics(): void {\n const { model } = this.props;\n\n const numRows = model.rowCount - model.pendingRowCount;\n this.setState({ numRows });\n if (!model.isColumnStatisticsAvailable) {\n this.setState({ loading: false });\n } else if (numRows < ColumnStatistics.AUTO_GENERATE_LIMIT) {\n this.handleGenerateStatistics();\n }\n }\n\n handleGenerateStatistics(): void {\n this.setState({ loading: true });\n\n const { column, model } = this.props;\n\n this.cancelablePromise = PromiseUtils.makeCancelable(\n model.columnStatistics(column)\n );\n\n this.cancelablePromise.then(this.handleStatistics).catch(this.handleError);\n }\n\n handleStatistics(stats: APIColumnStatistics): void {\n log.debug('Received statistics', stats);\n\n const { model, onStatistics } = this.props;\n const statistics: Statistic[] = [];\n\n stats.statisticsMap.forEach((value, operation) => {\n statistics.push({\n operation: ColumnStatistics.getStatsLabel(operation),\n value,\n type: stats.getType(operation),\n });\n });\n\n stats.uniqueValues.forEach((value, operation) => {\n statistics.push({\n operation,\n className: 'column-statistics-unique-value',\n value,\n type: 'long',\n });\n });\n\n this.setState({\n loading: false,\n statistics,\n numRows: model.rowCount - model.pendingRowCount,\n });\n\n onStatistics();\n }\n\n handleError(error: Error): void {\n if (error != null && PromiseUtils.isCanceled(error)) {\n log.debug('Called handleError on a cancelled promise result');\n return;\n }\n\n log.error('Error generating statistics', error);\n this.setState({\n error,\n loading: false,\n statistics: null,\n });\n }\n\n render(): React.ReactElement {\n const { column, model } = this.props;\n const { error, loading, statistics, numRows } = this.state;\n const showGenerateStatistics =\n !loading &&\n error == null &&\n statistics == null &&\n model.isColumnStatisticsAvailable;\n const statisticElements = [];\n const columnType = column.type.substring(column.type.lastIndexOf('.') + 1);\n const description = column.description === null ? null : column.description;\n if (statistics != null) {\n for (let i = 0; i < statistics.length; i += 1) {\n const { operation, className, value, type } = statistics[i];\n const formattedValue = !type\n ? model.displayString(value, column.type, column.name)\n : model.displayString(value, type);\n const statisticElement = (\n <React.Fragment key={operation}>\n <div\n className={classNames('column-statistic-operation', className)}\n >\n {operation}\n </div>\n <div className=\"column-statistic-value\">{formattedValue}</div>\n </React.Fragment>\n );\n statisticElements.push(statisticElement);\n }\n }\n const rowCountLabel =\n isExpandableGridModel(model) && model.hasExpandableRows\n ? 'Expanded Rows'\n : 'Number of Rows';\n const formattedRowCount = model.displayString(numRows, 'long');\n const columnIndex = model.getColumnIndexByName(column.name);\n return (\n <div className=\"column-statistics\">\n <div className=\"column-statistics-title\">\n {column.name}\n <span className=\"column-statistics-type\"> ({columnType})</span>\n <CopyButton\n className=\"column-statistics-copy\"\n tooltip=\"Copy column name\"\n copy={column.name}\n />\n </div>\n {description != null && (\n <div className=\"column-statistics-description\">{description}</div>\n )}\n {columnIndex != null && !model.isColumnMovable(columnIndex) && (\n <div className=\"column-statistics-status\">\n <FontAwesomeIcon\n icon={model.isColumnFrozen(columnIndex) ? dhFreeze : vsLock}\n className=\"mr-1\"\n />\n {model.isColumnFrozen(columnIndex) ? 'Frozen' : 'Not movable'}\n </div>\n )}\n <div className=\"column-statistics-grid\">\n {statistics == null && (\n <>\n <div className=\"column-statistic-operation\">{rowCountLabel}</div>\n <div className=\"column-statistic-value\">{formattedRowCount}</div>\n </>\n )}\n\n {statisticElements}\n </div>\n {showGenerateStatistics && (\n <Button\n kind=\"ghost\"\n className=\"px-0\"\n onClick={this.handleGenerateStatistics}\n >\n Generate Stats\n </Button>\n )}\n {error != null && <div className=\"error-message\">{`${error}`}</div>}\n {statistics && !loading && (\n <Button\n kind=\"ghost\"\n className=\"px-0\"\n onClick={this.handleGenerateStatistics}\n icon={<FontAwesomeIcon icon={dhRefresh} className=\"mr-1\" />}\n >\n Refresh\n </Button>\n )}\n {loading && (\n <div className=\"column-statistics-loading\">\n <LoadingSpinner className=\"mr-2\" />\n Calculating Stats...\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default ColumnStatistics;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ColumnStatistics.js","names":["React","Component","classNames","FontAwesomeIcon","Button","CopyButton","LoadingSpinner","dhFreeze","dhRefresh","vsLock","Log","PromiseUtils","isExpandableGridModel","log","module","STATS_LABEL_OVERRIDES","SIZE","ColumnStatistics","getStatsLabel","operation","split","map","w","toUpperCase","substr","toLowerCase","join","constructor","props","handleError","bind","handleGenerateStatistics","handleStatistics","cancelablePromise","state","error","loading","statistics","numRows","componentDidMount","maybeGenerateStatistics","componentWillUnmount","cancel","model","rowCount","pendingRowCount","setState","isColumnStatisticsAvailable","AUTO_GENERATE_LIMIT","column","makeCancelable","columnStatistics","then","catch","stats","debug","onStatistics","statisticsMap","forEach","value","push","type","getType","uniqueValues","className","isCanceled","render","showGenerateStatistics","statisticElements","columnType","substring","lastIndexOf","description","i","length","formattedValue","displayString","name","statisticElement","rowCountLabel","hasExpandableRows","formattedRowCount","columnIndex","getColumnIndexByName","isColumnMovable","isColumnFrozen"],"sources":["../src/ColumnStatistics.tsx"],"sourcesContent":["import React, { Component, Key } from 'react';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Button, CopyButton, LoadingSpinner } from '@deephaven/components';\nimport { dhFreeze, dhRefresh, vsLock } from '@deephaven/icons';\nimport {\n Column,\n ColumnStatistics as APIColumnStatistics,\n} from '@deephaven/jsapi-shim';\nimport Log from '@deephaven/log';\nimport { CancelablePromise, PromiseUtils } from '@deephaven/utils';\nimport { isExpandableGridModel } from '@deephaven/grid';\nimport './ColumnStatistics.scss';\nimport IrisGridModel from './IrisGridModel';\n\nconst log = Log.module('ColumnStatistics');\nconst STATS_LABEL_OVERRIDES: Record<string, string> = {\n SIZE: 'Number of Rows',\n};\n\ninterface Statistic {\n operation: Key;\n className?: string;\n value: unknown;\n type: string;\n}\n\ninterface ColumnStatisticsProps {\n column: Column;\n model: IrisGridModel;\n onStatistics: () => void;\n}\ninterface ColumnStatisticsState {\n error: unknown;\n loading: boolean;\n statistics: Statistic[] | null;\n numRows: number;\n}\n\nclass ColumnStatistics extends Component<\n ColumnStatisticsProps,\n ColumnStatisticsState\n> {\n /** Automatically generate the statistics when the row count is below this threshold */\n static AUTO_GENERATE_LIMIT = 100000;\n\n static getStatsLabel(operation: string): string {\n return (\n STATS_LABEL_OVERRIDES[operation] ??\n operation\n .split(' ')\n .map(w => w[0].toUpperCase() + w.substr(1).toLowerCase())\n .join(' ')\n );\n }\n\n constructor(props: ColumnStatisticsProps) {\n super(props);\n\n this.handleError = this.handleError.bind(this);\n this.handleGenerateStatistics = this.handleGenerateStatistics.bind(this);\n this.handleStatistics = this.handleStatistics.bind(this);\n\n this.cancelablePromise = null;\n\n this.state = {\n error: null,\n loading: false,\n statistics: null,\n numRows: 0,\n };\n }\n\n componentDidMount(): void {\n this.maybeGenerateStatistics();\n }\n\n componentWillUnmount(): void {\n if (this.cancelablePromise) {\n this.cancelablePromise.cancel();\n }\n }\n\n cancelablePromise: CancelablePromise<APIColumnStatistics> | null;\n\n maybeGenerateStatistics(): void {\n const { model } = this.props;\n\n const numRows = model.rowCount - model.pendingRowCount;\n this.setState({ numRows });\n if (!model.isColumnStatisticsAvailable) {\n this.setState({ loading: false });\n } else if (numRows < ColumnStatistics.AUTO_GENERATE_LIMIT) {\n this.handleGenerateStatistics();\n }\n }\n\n handleGenerateStatistics(): void {\n this.setState({ loading: true });\n\n const { column, model } = this.props;\n\n this.cancelablePromise = PromiseUtils.makeCancelable(\n model.columnStatistics(column)\n );\n\n this.cancelablePromise.then(this.handleStatistics).catch(this.handleError);\n }\n\n handleStatistics(stats: APIColumnStatistics): void {\n log.debug('Received statistics', stats);\n\n const { model, onStatistics } = this.props;\n const statistics: Statistic[] = [];\n\n stats.statisticsMap.forEach((value, operation) => {\n statistics.push({\n operation: ColumnStatistics.getStatsLabel(operation),\n value,\n type: stats.getType(operation),\n });\n });\n\n stats.uniqueValues.forEach((value, operation) => {\n statistics.push({\n operation,\n className: 'column-statistics-unique-value',\n value,\n type: 'long',\n });\n });\n\n this.setState({\n loading: false,\n statistics,\n numRows: model.rowCount - model.pendingRowCount,\n });\n\n onStatistics();\n }\n\n handleError(error: Error): void {\n if (error != null && PromiseUtils.isCanceled(error)) {\n log.debug('Called handleError on a cancelled promise result');\n return;\n }\n\n log.error('Error generating statistics', error);\n this.setState({\n error,\n loading: false,\n statistics: null,\n });\n }\n\n render(): React.ReactElement {\n const { column, model } = this.props;\n const { error, loading, statistics, numRows } = this.state;\n const showGenerateStatistics =\n !loading &&\n error == null &&\n statistics == null &&\n model.isColumnStatisticsAvailable;\n const statisticElements = [];\n const columnType = column.type.substring(column.type.lastIndexOf('.') + 1);\n const description = column.description === null ? null : column.description;\n if (statistics != null) {\n for (let i = 0; i < statistics.length; i += 1) {\n const { operation, className, value, type } = statistics[i];\n const formattedValue = !type\n ? model.displayString(value, column.type, column.name)\n : model.displayString(value, type);\n const statisticElement = (\n <React.Fragment key={operation}>\n <div\n className={classNames('column-statistic-operation', className)}\n >\n {operation}\n </div>\n <div className=\"column-statistic-value\">{formattedValue}</div>\n </React.Fragment>\n );\n statisticElements.push(statisticElement);\n }\n }\n const rowCountLabel =\n isExpandableGridModel(model) && model.hasExpandableRows\n ? 'Expanded Rows'\n : 'Number of Rows';\n const formattedRowCount = model.displayString(numRows, 'long');\n const columnIndex = model.getColumnIndexByName(column.name);\n return (\n <div className=\"column-statistics\">\n <div className=\"column-statistics-title\">\n {column.name}\n <span className=\"column-statistics-type\"> ({columnType})</span>\n <CopyButton\n className=\"column-statistics-copy\"\n tooltip=\"Copy column name\"\n copy={column.name}\n />\n </div>\n {description != null && (\n <div className=\"column-statistics-description\">{description}</div>\n )}\n {columnIndex != null && !model.isColumnMovable(columnIndex) && (\n <div className=\"column-statistics-status\">\n <FontAwesomeIcon\n icon={model.isColumnFrozen(columnIndex) ? dhFreeze : vsLock}\n className=\"mr-1\"\n />\n {model.isColumnFrozen(columnIndex) ? 'Frozen' : 'Not movable'}\n </div>\n )}\n <div className=\"column-statistics-grid\">\n {statistics == null && (\n <>\n <div className=\"column-statistic-operation\">{rowCountLabel}</div>\n <div className=\"column-statistic-value\">{formattedRowCount}</div>\n </>\n )}\n\n {statisticElements}\n </div>\n {showGenerateStatistics && (\n <Button\n kind=\"ghost\"\n className=\"px-0\"\n onClick={this.handleGenerateStatistics}\n >\n Generate Stats\n </Button>\n )}\n {error != null && <div className=\"error-message\">{`${error}`}</div>}\n {statistics && !loading && (\n <Button\n kind=\"ghost\"\n className=\"px-0\"\n onClick={this.handleGenerateStatistics}\n icon={<FontAwesomeIcon icon={dhRefresh} className=\"mr-1\" />}\n >\n Refresh\n </Button>\n )}\n {loading && (\n <div className=\"column-statistics-loading\">\n <LoadingSpinner className=\"mr-2\" />\n Calculating Stats...\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default ColumnStatistics;\n"],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
-
|
|
3
2
|
import React, { PureComponent } from 'react';
|
|
4
3
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
5
4
|
import { Checkbox, Popper, SearchInput, Tooltip } from '@deephaven/components';
|
|
@@ -7,25 +6,19 @@ import { dhGearFilled, dhCheckSquare, dhSquareFilled, dhRemoveSquareFilled, dhWa
|
|
|
7
6
|
import dh from '@deephaven/jsapi-shim';
|
|
8
7
|
import { TableUtils } from '@deephaven/jsapi-utils';
|
|
9
8
|
import "./CrossColumnSearch.css";
|
|
10
|
-
|
|
11
9
|
class CrossColumnSearch extends PureComponent {
|
|
12
10
|
static createSearchFilter(searchValue, selectedColumns, columns, invertSelection) {
|
|
13
11
|
var filterColumns = invertSelection ? columns.filter(column => !selectedColumns.includes(column.name)).map(column => column.name) : selectedColumns;
|
|
14
|
-
|
|
15
12
|
if (searchValue && filterColumns.length > 0) {
|
|
16
13
|
var filterValue = dh.FilterValue.ofString(searchValue);
|
|
17
14
|
var searchFilter = filterColumns.length === columns.length ? dh.FilterCondition.search(filterValue) : dh.FilterCondition.search(filterValue, columns.filter(column => filterColumns.includes(column.name)).map(column => column.filter()));
|
|
18
15
|
return searchFilter;
|
|
19
16
|
}
|
|
20
|
-
|
|
21
17
|
return undefined;
|
|
22
18
|
}
|
|
23
|
-
|
|
24
19
|
constructor(props) {
|
|
25
20
|
super(props);
|
|
26
|
-
|
|
27
21
|
_defineProperty(this, "searchField", void 0);
|
|
28
|
-
|
|
29
22
|
this.handleSearchValueChange = this.handleSearchValueChange.bind(this);
|
|
30
23
|
this.toggleColumn = this.toggleColumn.bind(this);
|
|
31
24
|
this.selectAll = this.selectAll.bind(this);
|
|
@@ -36,13 +29,10 @@ class CrossColumnSearch extends PureComponent {
|
|
|
36
29
|
isConfigureColumnsShown: false
|
|
37
30
|
};
|
|
38
31
|
}
|
|
39
|
-
|
|
40
32
|
focus() {
|
|
41
33
|
var _this$searchField$cur;
|
|
42
|
-
|
|
43
34
|
(_this$searchField$cur = this.searchField.current) === null || _this$searchField$cur === void 0 ? void 0 : _this$searchField$cur.focus();
|
|
44
35
|
}
|
|
45
|
-
|
|
46
36
|
handleSearchValueChange(event) {
|
|
47
37
|
var {
|
|
48
38
|
onChange,
|
|
@@ -51,7 +41,6 @@ class CrossColumnSearch extends PureComponent {
|
|
|
51
41
|
} = this.props;
|
|
52
42
|
onChange(event.target.value, selectedColumns, invertSelection);
|
|
53
43
|
}
|
|
54
|
-
|
|
55
44
|
sendColumnChange(selectedColumns, invertSelection) {
|
|
56
45
|
var {
|
|
57
46
|
onChange,
|
|
@@ -59,7 +48,6 @@ class CrossColumnSearch extends PureComponent {
|
|
|
59
48
|
} = this.props;
|
|
60
49
|
onChange(value, selectedColumns, invertSelection);
|
|
61
50
|
}
|
|
62
|
-
|
|
63
51
|
setInvertSelection(invertSelection) {
|
|
64
52
|
var {
|
|
65
53
|
onChange,
|
|
@@ -67,13 +55,11 @@ class CrossColumnSearch extends PureComponent {
|
|
|
67
55
|
} = this.props;
|
|
68
56
|
onChange(value, [], invertSelection);
|
|
69
57
|
}
|
|
70
|
-
|
|
71
58
|
toggleColumn(name) {
|
|
72
59
|
var {
|
|
73
60
|
selectedColumns,
|
|
74
61
|
invertSelection
|
|
75
62
|
} = this.props;
|
|
76
|
-
|
|
77
63
|
if (selectedColumns.includes(name)) {
|
|
78
64
|
this.sendColumnChange(selectedColumns.filter(c => c !== name), invertSelection);
|
|
79
65
|
} else {
|
|
@@ -82,22 +68,18 @@ class CrossColumnSearch extends PureComponent {
|
|
|
82
68
|
this.sendColumnChange(update, invertSelection);
|
|
83
69
|
}
|
|
84
70
|
}
|
|
85
|
-
|
|
86
71
|
selectAll() {
|
|
87
72
|
this.setInvertSelection(true);
|
|
88
73
|
}
|
|
89
|
-
|
|
90
74
|
clear() {
|
|
91
75
|
this.setInvertSelection(false);
|
|
92
76
|
}
|
|
93
|
-
|
|
94
77
|
selectNumbers() {
|
|
95
78
|
var {
|
|
96
79
|
columns
|
|
97
80
|
} = this.props;
|
|
98
81
|
this.sendColumnChange(columns.filter(c => TableUtils.isNumberType(c.type)).map(column => column.name), false);
|
|
99
82
|
}
|
|
100
|
-
|
|
101
83
|
render() {
|
|
102
84
|
var {
|
|
103
85
|
value,
|
|
@@ -109,10 +91,10 @@ class CrossColumnSearch extends PureComponent {
|
|
|
109
91
|
isConfigureColumnsShown
|
|
110
92
|
} = this.state;
|
|
111
93
|
var hasAllColumnsSelected = selectedColumns.length === 0 && invertSelection === true || selectedColumns.length === columns.length && invertSelection === false;
|
|
112
|
-
var hasNoColumnsSelected = selectedColumns.length === 0 && invertSelection === false || selectedColumns.length === columns.length && invertSelection === true;
|
|
94
|
+
var hasNoColumnsSelected = selectedColumns.length === 0 && invertSelection === false || selectedColumns.length === columns.length && invertSelection === true;
|
|
113
95
|
|
|
96
|
+
// set icon layers
|
|
114
97
|
var icon;
|
|
115
|
-
|
|
116
98
|
if (hasAllColumnsSelected) {
|
|
117
99
|
// icon if all columns selected for search
|
|
118
100
|
icon = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
|
|
@@ -147,7 +129,6 @@ class CrossColumnSearch extends PureComponent {
|
|
|
147
129
|
transform: "shrink-4 down-5 right-7"
|
|
148
130
|
}));
|
|
149
131
|
}
|
|
150
|
-
|
|
151
132
|
return /*#__PURE__*/React.createElement("div", {
|
|
152
133
|
className: "cross-column-container"
|
|
153
134
|
}, /*#__PURE__*/React.createElement(SearchInput, {
|
|
@@ -212,8 +193,6 @@ class CrossColumnSearch extends PureComponent {
|
|
|
212
193
|
icon: dhWarningCircleFilled
|
|
213
194
|
}), " Select at least one column to search.")))));
|
|
214
195
|
}
|
|
215
|
-
|
|
216
196
|
}
|
|
217
|
-
|
|
218
197
|
export default CrossColumnSearch;
|
|
219
198
|
//# sourceMappingURL=CrossColumnSearch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CrossColumnSearch.js","names":["React","PureComponent","FontAwesomeIcon","Checkbox","Popper","SearchInput","Tooltip","dhGearFilled","dhCheckSquare","dhSquareFilled","dhRemoveSquareFilled","dhWarningCircleFilled","vsCircleLargeFilled","dh","TableUtils","CrossColumnSearch","createSearchFilter","searchValue","selectedColumns","columns","invertSelection","filterColumns","filter","column","includes","name","map","length","filterValue","FilterValue","ofString","searchFilter","FilterCondition","search","undefined","constructor","props","handleSearchValueChange","bind","toggleColumn","selectAll","clear","selectNumbers","searchField","createRef","state","isConfigureColumnsShown","focus","current","event","onChange","target","value","sendColumnChange","setInvertSelection","c","update","slice","push","isNumberType","type","render","hasAllColumnsSelected","hasNoColumnsSelected","icon","setState","substring","lastIndexOf"],"sources":["../src/CrossColumnSearch.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Checkbox, Popper, SearchInput, Tooltip } from '@deephaven/components';\nimport {\n dhGearFilled,\n dhCheckSquare,\n dhSquareFilled,\n dhRemoveSquareFilled,\n dhWarningCircleFilled,\n vsCircleLargeFilled,\n} from '@deephaven/icons';\nimport dh, { Column, FilterCondition } from '@deephaven/jsapi-shim';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport './CrossColumnSearch.scss';\nimport { ColumnName } from './CommonTypes';\n\ninterface CrossColumnSearchProps {\n value: string;\n selectedColumns: ColumnName[];\n invertSelection: boolean;\n onChange: (\n value: string,\n selectedColumns: ColumnName[],\n invertSelection: boolean\n ) => void;\n columns: Column[];\n}\n\ninterface CrossColumnSearchState {\n isConfigureColumnsShown: boolean;\n}\nclass CrossColumnSearch extends PureComponent<\n CrossColumnSearchProps,\n CrossColumnSearchState\n> {\n static createSearchFilter(\n searchValue: string,\n selectedColumns: ColumnName[],\n columns: Column[],\n invertSelection: boolean\n ): FilterCondition | undefined {\n const filterColumns = invertSelection\n ? columns\n .filter(column => !selectedColumns.includes(column.name))\n .map(column => column.name)\n : selectedColumns;\n if (searchValue && filterColumns.length > 0) {\n const filterValue = dh.FilterValue.ofString(searchValue);\n const searchFilter =\n filterColumns.length === columns.length\n ? dh.FilterCondition.search(filterValue)\n : dh.FilterCondition.search(\n filterValue,\n columns\n .filter(column => filterColumns.includes(column.name))\n .map(column => column.filter())\n );\n return searchFilter;\n }\n return undefined;\n }\n\n constructor(props: CrossColumnSearchProps) {\n super(props);\n this.handleSearchValueChange = this.handleSearchValueChange.bind(this);\n this.toggleColumn = this.toggleColumn.bind(this);\n this.selectAll = this.selectAll.bind(this);\n this.clear = this.clear.bind(this);\n this.selectNumbers = this.selectNumbers.bind(this);\n\n this.searchField = React.createRef();\n\n this.state = {\n isConfigureColumnsShown: false,\n };\n }\n\n searchField: React.RefObject<SearchInput>;\n\n focus(): void {\n this.searchField.current?.focus();\n }\n\n handleSearchValueChange(event: React.ChangeEvent<HTMLInputElement>): void {\n const { onChange, selectedColumns, invertSelection } = this.props;\n onChange(event.target.value, selectedColumns, invertSelection);\n }\n\n sendColumnChange(\n selectedColumns: ColumnName[],\n invertSelection: boolean\n ): void {\n const { onChange, value } = this.props;\n onChange(value, selectedColumns, invertSelection);\n }\n\n setInvertSelection(invertSelection: boolean): void {\n const { onChange, value } = this.props;\n onChange(value, [], invertSelection);\n }\n\n toggleColumn(name: string): void {\n const { selectedColumns, invertSelection } = this.props;\n if (selectedColumns.includes(name)) {\n this.sendColumnChange(\n selectedColumns.filter(c => c !== name),\n invertSelection\n );\n } else {\n const update = selectedColumns.slice();\n update.push(name);\n this.sendColumnChange(update, invertSelection);\n }\n }\n\n selectAll(): void {\n this.setInvertSelection(true);\n }\n\n clear(): void {\n this.setInvertSelection(false);\n }\n\n selectNumbers(): void {\n const { columns } = this.props;\n this.sendColumnChange(\n columns\n .filter(c => TableUtils.isNumberType(c.type))\n .map(column => column.name),\n false\n );\n }\n\n render(): React.ReactElement {\n const { value, selectedColumns, invertSelection, columns } = this.props;\n const { isConfigureColumnsShown } = this.state;\n const hasAllColumnsSelected =\n (selectedColumns.length === 0 && invertSelection === true) ||\n (selectedColumns.length === columns.length && invertSelection === false);\n const hasNoColumnsSelected =\n (selectedColumns.length === 0 && invertSelection === false) ||\n (selectedColumns.length === columns.length && invertSelection === true);\n\n // set icon layers\n let icon;\n if (hasAllColumnsSelected) {\n // icon if all columns selected for search\n icon = (\n <>\n <FontAwesomeIcon\n icon={dhSquareFilled}\n mask={dhGearFilled}\n transform=\"shrink-2 down-5 right-7\"\n />\n <FontAwesomeIcon\n icon={dhCheckSquare}\n className=\"text-primary\"\n transform=\"shrink-4 down-5 right-7\"\n />\n </>\n );\n } else if (hasNoColumnsSelected) {\n // icon error, no columns selected for searching\n icon = (\n <>\n <FontAwesomeIcon\n icon={vsCircleLargeFilled}\n mask={dhGearFilled}\n transform=\"shrink-1 down-5 right-7\"\n />\n <FontAwesomeIcon\n icon={dhWarningCircleFilled}\n className=\"text-danger\"\n transform=\"shrink-4 down-5 right-7\"\n />\n </>\n );\n } else {\n // icon if some columns selected, but not all\n icon = (\n <>\n <FontAwesomeIcon\n icon={dhSquareFilled}\n mask={dhGearFilled}\n transform=\"shrink-2 down-5 right-7\"\n />\n <FontAwesomeIcon\n icon={dhRemoveSquareFilled}\n className=\"text-primary\"\n transform=\"shrink-4 down-5 right-7\"\n />\n </>\n );\n }\n\n return (\n <div className=\"cross-column-container\">\n <SearchInput\n className=\"cross-column-search\"\n placeholder=\"Search Data...\"\n value={value}\n onChange={this.handleSearchValueChange}\n ref={this.searchField}\n />\n <button\n type=\"button\"\n className=\"btn btn-link btn-link-icon px-2\"\n onClick={() => {\n if (isConfigureColumnsShown) {\n this.setState({ isConfigureColumnsShown: false });\n } else {\n this.setState({ isConfigureColumnsShown: true });\n }\n }}\n >\n <div className=\"fa-layers\">{icon}</div>\n <Tooltip>Configure Columns</Tooltip>\n <Popper\n isShown={isConfigureColumnsShown}\n className=\"cross-column-popper\"\n onExited={() => {\n this.setState({ isConfigureColumnsShown: false });\n }}\n closeOnBlur\n interactive\n >\n <div className=\"cross-column-popup\">\n Searched Columns\n <div className=\"cross-column-scroll\">\n {columns.map(column => (\n <React.Fragment key={column.name}>\n <Checkbox\n className=\"cross-column-checkbox\"\n checked={\n invertSelection\n ? !selectedColumns.includes(column.name)\n : selectedColumns.includes(column.name)\n }\n onChange={() => this.toggleColumn(column.name)}\n >\n {column.name}\n </Checkbox>\n\n {column.type.substring(column.type.lastIndexOf('.') + 1)}\n </React.Fragment>\n ))}\n </div>\n <div className=\"cross-column-button-bar\">\n <button\n type=\"button\"\n className=\"btn btn-link\"\n onClick={this.selectAll}\n >\n Select All\n </button>\n <button\n type=\"button\"\n className=\"btn btn-link\"\n onClick={this.clear}\n >\n Clear\n </button>\n <button\n type=\"button\"\n className=\"btn btn-link\"\n onClick={this.selectNumbers}\n >\n Numbers Only\n </button>\n </div>\n {hasNoColumnsSelected && (\n <p className=\"text-danger\">\n <FontAwesomeIcon icon={dhWarningCircleFilled} /> Select at\n least one column to search.\n </p>\n )}\n </div>\n </Popper>\n </button>\n </div>\n );\n }\n}\n\nexport default CrossColumnSearch;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CrossColumnSearch.js","names":["React","PureComponent","FontAwesomeIcon","Checkbox","Popper","SearchInput","Tooltip","dhGearFilled","dhCheckSquare","dhSquareFilled","dhRemoveSquareFilled","dhWarningCircleFilled","vsCircleLargeFilled","dh","TableUtils","CrossColumnSearch","createSearchFilter","searchValue","selectedColumns","columns","invertSelection","filterColumns","filter","column","includes","name","map","length","filterValue","FilterValue","ofString","searchFilter","FilterCondition","search","undefined","constructor","props","handleSearchValueChange","bind","toggleColumn","selectAll","clear","selectNumbers","searchField","createRef","state","isConfigureColumnsShown","focus","current","event","onChange","target","value","sendColumnChange","setInvertSelection","c","update","slice","push","isNumberType","type","render","hasAllColumnsSelected","hasNoColumnsSelected","icon","setState","substring","lastIndexOf"],"sources":["../src/CrossColumnSearch.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Checkbox, Popper, SearchInput, Tooltip } from '@deephaven/components';\nimport {\n dhGearFilled,\n dhCheckSquare,\n dhSquareFilled,\n dhRemoveSquareFilled,\n dhWarningCircleFilled,\n vsCircleLargeFilled,\n} from '@deephaven/icons';\nimport dh, { Column, FilterCondition } from '@deephaven/jsapi-shim';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport './CrossColumnSearch.scss';\nimport { ColumnName } from './CommonTypes';\n\ninterface CrossColumnSearchProps {\n value: string;\n selectedColumns: ColumnName[];\n invertSelection: boolean;\n onChange: (\n value: string,\n selectedColumns: ColumnName[],\n invertSelection: boolean\n ) => void;\n columns: Column[];\n}\n\ninterface CrossColumnSearchState {\n isConfigureColumnsShown: boolean;\n}\nclass CrossColumnSearch extends PureComponent<\n CrossColumnSearchProps,\n CrossColumnSearchState\n> {\n static createSearchFilter(\n searchValue: string,\n selectedColumns: ColumnName[],\n columns: Column[],\n invertSelection: boolean\n ): FilterCondition | undefined {\n const filterColumns = invertSelection\n ? columns\n .filter(column => !selectedColumns.includes(column.name))\n .map(column => column.name)\n : selectedColumns;\n if (searchValue && filterColumns.length > 0) {\n const filterValue = dh.FilterValue.ofString(searchValue);\n const searchFilter =\n filterColumns.length === columns.length\n ? dh.FilterCondition.search(filterValue)\n : dh.FilterCondition.search(\n filterValue,\n columns\n .filter(column => filterColumns.includes(column.name))\n .map(column => column.filter())\n );\n return searchFilter;\n }\n return undefined;\n }\n\n constructor(props: CrossColumnSearchProps) {\n super(props);\n this.handleSearchValueChange = this.handleSearchValueChange.bind(this);\n this.toggleColumn = this.toggleColumn.bind(this);\n this.selectAll = this.selectAll.bind(this);\n this.clear = this.clear.bind(this);\n this.selectNumbers = this.selectNumbers.bind(this);\n\n this.searchField = React.createRef();\n\n this.state = {\n isConfigureColumnsShown: false,\n };\n }\n\n searchField: React.RefObject<SearchInput>;\n\n focus(): void {\n this.searchField.current?.focus();\n }\n\n handleSearchValueChange(event: React.ChangeEvent<HTMLInputElement>): void {\n const { onChange, selectedColumns, invertSelection } = this.props;\n onChange(event.target.value, selectedColumns, invertSelection);\n }\n\n sendColumnChange(\n selectedColumns: ColumnName[],\n invertSelection: boolean\n ): void {\n const { onChange, value } = this.props;\n onChange(value, selectedColumns, invertSelection);\n }\n\n setInvertSelection(invertSelection: boolean): void {\n const { onChange, value } = this.props;\n onChange(value, [], invertSelection);\n }\n\n toggleColumn(name: string): void {\n const { selectedColumns, invertSelection } = this.props;\n if (selectedColumns.includes(name)) {\n this.sendColumnChange(\n selectedColumns.filter(c => c !== name),\n invertSelection\n );\n } else {\n const update = selectedColumns.slice();\n update.push(name);\n this.sendColumnChange(update, invertSelection);\n }\n }\n\n selectAll(): void {\n this.setInvertSelection(true);\n }\n\n clear(): void {\n this.setInvertSelection(false);\n }\n\n selectNumbers(): void {\n const { columns } = this.props;\n this.sendColumnChange(\n columns\n .filter(c => TableUtils.isNumberType(c.type))\n .map(column => column.name),\n false\n );\n }\n\n render(): React.ReactElement {\n const { value, selectedColumns, invertSelection, columns } = this.props;\n const { isConfigureColumnsShown } = this.state;\n const hasAllColumnsSelected =\n (selectedColumns.length === 0 && invertSelection === true) ||\n (selectedColumns.length === columns.length && invertSelection === false);\n const hasNoColumnsSelected =\n (selectedColumns.length === 0 && invertSelection === false) ||\n (selectedColumns.length === columns.length && invertSelection === true);\n\n // set icon layers\n let icon;\n if (hasAllColumnsSelected) {\n // icon if all columns selected for search\n icon = (\n <>\n <FontAwesomeIcon\n icon={dhSquareFilled}\n mask={dhGearFilled}\n transform=\"shrink-2 down-5 right-7\"\n />\n <FontAwesomeIcon\n icon={dhCheckSquare}\n className=\"text-primary\"\n transform=\"shrink-4 down-5 right-7\"\n />\n </>\n );\n } else if (hasNoColumnsSelected) {\n // icon error, no columns selected for searching\n icon = (\n <>\n <FontAwesomeIcon\n icon={vsCircleLargeFilled}\n mask={dhGearFilled}\n transform=\"shrink-1 down-5 right-7\"\n />\n <FontAwesomeIcon\n icon={dhWarningCircleFilled}\n className=\"text-danger\"\n transform=\"shrink-4 down-5 right-7\"\n />\n </>\n );\n } else {\n // icon if some columns selected, but not all\n icon = (\n <>\n <FontAwesomeIcon\n icon={dhSquareFilled}\n mask={dhGearFilled}\n transform=\"shrink-2 down-5 right-7\"\n />\n <FontAwesomeIcon\n icon={dhRemoveSquareFilled}\n className=\"text-primary\"\n transform=\"shrink-4 down-5 right-7\"\n />\n </>\n );\n }\n\n return (\n <div className=\"cross-column-container\">\n <SearchInput\n className=\"cross-column-search\"\n placeholder=\"Search Data...\"\n value={value}\n onChange={this.handleSearchValueChange}\n ref={this.searchField}\n />\n <button\n type=\"button\"\n className=\"btn btn-link btn-link-icon px-2\"\n onClick={() => {\n if (isConfigureColumnsShown) {\n this.setState({ isConfigureColumnsShown: false });\n } else {\n this.setState({ isConfigureColumnsShown: true });\n }\n }}\n >\n <div className=\"fa-layers\">{icon}</div>\n <Tooltip>Configure Columns</Tooltip>\n <Popper\n isShown={isConfigureColumnsShown}\n className=\"cross-column-popper\"\n onExited={() => {\n this.setState({ isConfigureColumnsShown: false });\n }}\n closeOnBlur\n interactive\n >\n <div className=\"cross-column-popup\">\n Searched Columns\n <div className=\"cross-column-scroll\">\n {columns.map(column => (\n <React.Fragment key={column.name}>\n <Checkbox\n className=\"cross-column-checkbox\"\n checked={\n invertSelection\n ? !selectedColumns.includes(column.name)\n : selectedColumns.includes(column.name)\n }\n onChange={() => this.toggleColumn(column.name)}\n >\n {column.name}\n </Checkbox>\n\n {column.type.substring(column.type.lastIndexOf('.') + 1)}\n </React.Fragment>\n ))}\n </div>\n <div className=\"cross-column-button-bar\">\n <button\n type=\"button\"\n className=\"btn btn-link\"\n onClick={this.selectAll}\n >\n Select All\n </button>\n <button\n type=\"button\"\n className=\"btn btn-link\"\n onClick={this.clear}\n >\n Clear\n </button>\n <button\n type=\"button\"\n className=\"btn btn-link\"\n onClick={this.selectNumbers}\n >\n Numbers Only\n </button>\n </div>\n {hasNoColumnsSelected && (\n <p className=\"text-danger\">\n <FontAwesomeIcon icon={dhWarningCircleFilled} /> Select at\n least one column to search.\n </p>\n )}\n </div>\n </Popper>\n </button>\n </div>\n );\n }\n}\n\nexport default CrossColumnSearch;\n"],"mappings":"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"}
|