@deephaven/iris-grid 0.43.0 → 0.44.0
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.css +106 -0
- package/dist/AdvancedFilterCreator.css.map +1 -0
- package/dist/AdvancedFilterCreator.js +541 -0
- package/dist/AdvancedFilterCreator.js.map +1 -0
- package/dist/AdvancedFilterCreatorFilterItem.css +9 -0
- package/dist/AdvancedFilterCreatorFilterItem.css.map +1 -0
- package/dist/AdvancedFilterCreatorFilterItem.js +184 -0
- package/dist/AdvancedFilterCreatorFilterItem.js.map +1 -0
- package/dist/AdvancedFilterCreatorSelectValue.css +50 -0
- package/dist/AdvancedFilterCreatorSelectValue.css.map +1 -0
- package/dist/AdvancedFilterCreatorSelectValue.js +301 -0
- package/dist/AdvancedFilterCreatorSelectValue.js.map +1 -0
- package/dist/AdvancedFilterCreatorSelectValueList.js +272 -0
- package/dist/AdvancedFilterCreatorSelectValueList.js.map +1 -0
- package/dist/ColumnHeaderGroup.js +61 -0
- package/dist/ColumnHeaderGroup.js.map +1 -0
- package/dist/ColumnStatistics.css +76 -0
- package/dist/ColumnStatistics.css.map +1 -0
- package/dist/ColumnStatistics.js +202 -0
- package/dist/ColumnStatistics.js.map +1 -0
- package/dist/CommonTypes.js +2 -0
- package/dist/CommonTypes.js.map +1 -0
- package/dist/CrossColumnSearch.css +35 -0
- package/dist/CrossColumnSearch.css.map +1 -0
- package/dist/CrossColumnSearch.js +199 -0
- package/dist/CrossColumnSearch.js.map +1 -0
- package/dist/FilterInputField.css +56 -0
- package/dist/FilterInputField.css.map +1 -0
- package/dist/FilterInputField.js +232 -0
- package/dist/FilterInputField.js.map +1 -0
- package/dist/GotoRow.css +45 -0
- package/dist/GotoRow.css.map +1 -0
- package/dist/GotoRow.js +298 -0
- package/dist/GotoRow.js.map +1 -0
- package/dist/IrisGrid.css +359 -0
- package/dist/IrisGrid.css.map +1 -0
- package/dist/IrisGrid.js +3651 -0
- package/dist/IrisGrid.js.map +1 -0
- package/dist/IrisGridBottomBar.css +85 -0
- package/dist/IrisGridBottomBar.css.map +1 -0
- package/dist/IrisGridBottomBar.js +36 -0
- package/dist/IrisGridBottomBar.js.map +1 -0
- package/dist/IrisGridCellOverflowModal.css +17 -0
- package/dist/IrisGridCellOverflowModal.css.map +1 -0
- package/dist/IrisGridCellOverflowModal.js +157 -0
- package/dist/IrisGridCellOverflowModal.js.map +1 -0
- package/dist/IrisGridCellRendererUtils.js +20 -0
- package/dist/IrisGridCellRendererUtils.js.map +1 -0
- package/dist/IrisGridCopyHandler.css +64 -0
- package/dist/IrisGridCopyHandler.css.map +1 -0
- package/dist/IrisGridCopyHandler.js +331 -0
- package/dist/IrisGridCopyHandler.js.map +1 -0
- package/dist/IrisGridDataBarCellRenderer.js +10 -0
- package/dist/IrisGridDataBarCellRenderer.js.map +1 -0
- package/dist/IrisGridIcons.js +25 -0
- package/dist/IrisGridIcons.js.map +1 -0
- package/dist/IrisGridMetricCalculator.js +33 -0
- package/dist/IrisGridMetricCalculator.js.map +1 -0
- package/dist/IrisGridModel.js +263 -0
- package/dist/IrisGridModel.js.map +1 -0
- package/dist/IrisGridModelFactory.js +27 -0
- package/dist/IrisGridModelFactory.js.map +1 -0
- package/dist/IrisGridModelUpdater.js +96 -0
- package/dist/IrisGridModelUpdater.js.map +1 -0
- package/dist/IrisGridPartitionSelector.css +48 -0
- package/dist/IrisGridPartitionSelector.css.map +1 -0
- package/dist/IrisGridPartitionSelector.js +198 -0
- package/dist/IrisGridPartitionSelector.js.map +1 -0
- package/dist/IrisGridProxyModel.js +530 -0
- package/dist/IrisGridProxyModel.js.map +1 -0
- package/dist/IrisGridRenderer.js +779 -0
- package/dist/IrisGridRenderer.js.map +1 -0
- package/dist/IrisGridShortcuts.js +59 -0
- package/dist/IrisGridShortcuts.js.map +1 -0
- package/dist/IrisGridTableModel.js +273 -0
- package/dist/IrisGridTableModel.js.map +1 -0
- package/dist/IrisGridTableModelTemplate.js +1589 -0
- package/dist/IrisGridTableModelTemplate.js.map +1 -0
- package/dist/IrisGridTestUtils.js +121 -0
- package/dist/IrisGridTestUtils.js.map +1 -0
- package/dist/IrisGridTextCellRenderer.js +139 -0
- package/dist/IrisGridTextCellRenderer.js.map +1 -0
- package/dist/IrisGridTheme.js +96 -0
- package/dist/IrisGridTheme.js.map +1 -0
- package/dist/IrisGridTheme.module.css +69 -0
- package/dist/IrisGridTheme.module.css.map +1 -0
- package/dist/IrisGridTreeTableModel.js +145 -0
- package/dist/IrisGridTreeTableModel.js.map +1 -0
- package/dist/IrisGridUtils.js +1279 -0
- package/dist/IrisGridUtils.js.map +1 -0
- package/dist/MissingKeyError.js +15 -0
- package/dist/MissingKeyError.js.map +1 -0
- package/dist/PartitionSelectorSearch.css +22 -0
- package/dist/PartitionSelectorSearch.css.map +1 -0
- package/dist/PartitionSelectorSearch.js +317 -0
- package/dist/PartitionSelectorSearch.js.map +1 -0
- package/dist/PendingDataBottomBar.css +13 -0
- package/dist/PendingDataBottomBar.css.map +1 -0
- package/dist/PendingDataBottomBar.js +98 -0
- package/dist/PendingDataBottomBar.js.map +1 -0
- package/dist/TableViewportUpdater.js +156 -0
- package/dist/TableViewportUpdater.js.map +1 -0
- package/dist/ToastBottomBar.js +42 -0
- package/dist/ToastBottomBar.js.map +1 -0
- package/dist/TreeTableViewportUpdater.js +96 -0
- package/dist/TreeTableViewportUpdater.js.map +1 -0
- package/dist/declaration.d.js +2 -0
- package/dist/declaration.d.js.map +1 -0
- package/dist/format-context-menus/CustomFormatAction.css +25 -0
- package/dist/format-context-menus/CustomFormatAction.css.map +1 -0
- package/dist/format-context-menus/CustomFormatAction.js +132 -0
- package/dist/format-context-menus/CustomFormatAction.js.map +1 -0
- package/dist/format-context-menus/DateTimeFormatContextMenu.js +53 -0
- package/dist/format-context-menus/DateTimeFormatContextMenu.js.map +1 -0
- package/dist/format-context-menus/DecimalFormatContextMenu.js +59 -0
- package/dist/format-context-menus/DecimalFormatContextMenu.js.map +1 -0
- package/dist/format-context-menus/FormatContextMenuUtils.js +63 -0
- package/dist/format-context-menus/FormatContextMenuUtils.js.map +1 -0
- package/dist/format-context-menus/IntegerFormatContextMenu.js +43 -0
- package/dist/format-context-menus/IntegerFormatContextMenu.js.map +1 -0
- package/dist/format-context-menus/index.js +4 -0
- package/dist/format-context-menus/index.js.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/key-handlers/ClearFilterKeyHandler.js +21 -0
- package/dist/key-handlers/ClearFilterKeyHandler.js.map +1 -0
- package/dist/key-handlers/CopyKeyHandler.js +31 -0
- package/dist/key-handlers/CopyKeyHandler.js.map +1 -0
- package/dist/key-handlers/ReverseKeyHandler.js +32 -0
- package/dist/key-handlers/ReverseKeyHandler.js.map +1 -0
- package/dist/key-handlers/index.js +4 -0
- package/dist/key-handlers/index.js.map +1 -0
- package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.js +175 -0
- package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridColumnSelectMouseHandler.js +139 -0
- package/dist/mousehandlers/IrisGridColumnSelectMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridColumnTooltipMouseHandler.js +83 -0
- package/dist/mousehandlers/IrisGridColumnTooltipMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridContextMenuHandler.css +19 -0
- package/dist/mousehandlers/IrisGridContextMenuHandler.css.map +1 -0
- package/dist/mousehandlers/IrisGridContextMenuHandler.js +1220 -0
- package/dist/mousehandlers/IrisGridContextMenuHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridDataSelectMouseHandler.js +28 -0
- package/dist/mousehandlers/IrisGridDataSelectMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridFilterMouseHandler.js +80 -0
- package/dist/mousehandlers/IrisGridFilterMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridRowTreeMouseHandler.js +126 -0
- package/dist/mousehandlers/IrisGridRowTreeMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridSortMouseHandler.js +46 -0
- package/dist/mousehandlers/IrisGridSortMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridTokenMouseHandler.js +151 -0
- package/dist/mousehandlers/IrisGridTokenMouseHandler.js.map +1 -0
- package/dist/mousehandlers/PendingMouseHandler.js +39 -0
- package/dist/mousehandlers/PendingMouseHandler.js.map +1 -0
- package/dist/mousehandlers/index.js +11 -0
- package/dist/mousehandlers/index.js.map +1 -0
- package/dist/sidebar/AdvancedSettings.js +6 -0
- package/dist/sidebar/AdvancedSettings.js.map +1 -0
- package/dist/sidebar/AdvancedSettingsMenu.js +29 -0
- package/dist/sidebar/AdvancedSettingsMenu.js.map +1 -0
- package/dist/sidebar/AdvancedSettingsType.js +7 -0
- package/dist/sidebar/AdvancedSettingsType.js.map +1 -0
- package/dist/sidebar/ChartBuilder.css +56 -0
- package/dist/sidebar/ChartBuilder.css.map +1 -0
- package/dist/sidebar/ChartBuilder.js +443 -0
- package/dist/sidebar/ChartBuilder.js.map +1 -0
- package/dist/sidebar/CustomColumnBuilder.css +58 -0
- package/dist/sidebar/CustomColumnBuilder.css.map +1 -0
- package/dist/sidebar/CustomColumnBuilder.js +384 -0
- package/dist/sidebar/CustomColumnBuilder.js.map +1 -0
- package/dist/sidebar/CustomColumnInput.d.ts.map +1 -1
- package/dist/sidebar/CustomColumnInput.js +91 -0
- package/dist/sidebar/CustomColumnInput.js.map +1 -0
- package/dist/sidebar/InputEditor.css +35 -0
- package/dist/sidebar/InputEditor.css.map +1 -0
- package/dist/sidebar/InputEditor.d.ts +4 -2
- package/dist/sidebar/InputEditor.d.ts.map +1 -1
- package/dist/sidebar/InputEditor.js +180 -0
- package/dist/sidebar/InputEditor.js.map +1 -0
- package/dist/sidebar/OptionType.js +19 -0
- package/dist/sidebar/OptionType.js.map +1 -0
- package/dist/sidebar/RollupRows.css +120 -0
- package/dist/sidebar/RollupRows.css.map +1 -0
- package/dist/sidebar/RollupRows.js +519 -0
- package/dist/sidebar/RollupRows.js.map +1 -0
- package/dist/sidebar/SelectDistinctBuilder.css +41 -0
- package/dist/sidebar/SelectDistinctBuilder.css.map +1 -0
- package/dist/sidebar/SelectDistinctBuilder.js +155 -0
- package/dist/sidebar/SelectDistinctBuilder.js.map +1 -0
- package/dist/sidebar/TableCsvExporter.css +32 -0
- package/dist/sidebar/TableCsvExporter.css.map +1 -0
- package/dist/sidebar/TableCsvExporter.js +399 -0
- package/dist/sidebar/TableCsvExporter.js.map +1 -0
- package/dist/sidebar/TableSaver.js +487 -0
- package/dist/sidebar/TableSaver.js.map +1 -0
- package/dist/sidebar/aggregations/AggregationEdit.css +61 -0
- package/dist/sidebar/aggregations/AggregationEdit.css.map +1 -0
- package/dist/sidebar/aggregations/AggregationEdit.js +155 -0
- package/dist/sidebar/aggregations/AggregationEdit.js.map +1 -0
- package/dist/sidebar/aggregations/AggregationOperation.js +19 -0
- package/dist/sidebar/aggregations/AggregationOperation.js.map +1 -0
- package/dist/sidebar/aggregations/AggregationUtils.js +59 -0
- package/dist/sidebar/aggregations/AggregationUtils.js.map +1 -0
- package/dist/sidebar/aggregations/Aggregations.css +43 -0
- package/dist/sidebar/aggregations/Aggregations.css.map +1 -0
- package/dist/sidebar/aggregations/Aggregations.js +178 -0
- package/dist/sidebar/aggregations/Aggregations.js.map +1 -0
- package/dist/sidebar/aggregations/index.js +2 -0
- package/dist/sidebar/aggregations/index.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js +123 -0
- package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionEditor.js +243 -0
- package/dist/sidebar/conditional-formatting/ConditionEditor.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.css +22 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.css.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js +109 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.js +18 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.css +57 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.css.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js +150 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js +635 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js.map +1 -0
- package/dist/sidebar/conditional-formatting/RowFormatEditor.js +122 -0
- package/dist/sidebar/conditional-formatting/RowFormatEditor.js.map +1 -0
- package/dist/sidebar/conditional-formatting/StyleEditor.css +55 -0
- package/dist/sidebar/conditional-formatting/StyleEditor.css.map +1 -0
- package/dist/sidebar/conditional-formatting/StyleEditor.js +150 -0
- package/dist/sidebar/conditional-formatting/StyleEditor.js.map +1 -0
- package/dist/sidebar/icons/BarIcon.js +24 -0
- package/dist/sidebar/icons/BarIcon.js.map +1 -0
- package/dist/sidebar/icons/FormatColumnWhereIcon.js +42 -0
- package/dist/sidebar/icons/FormatColumnWhereIcon.js.map +1 -0
- package/dist/sidebar/icons/FormatRowWhereIcon.js +36 -0
- package/dist/sidebar/icons/FormatRowWhereIcon.js.map +1 -0
- package/dist/sidebar/icons/HistogramIcon.js +24 -0
- package/dist/sidebar/icons/HistogramIcon.js.map +1 -0
- package/dist/sidebar/icons/LineIcon.js +27 -0
- package/dist/sidebar/icons/LineIcon.js.map +1 -0
- package/dist/sidebar/icons/PieIcon.js +24 -0
- package/dist/sidebar/icons/PieIcon.js.map +1 -0
- package/dist/sidebar/icons/ScatterIcon.js +74 -0
- package/dist/sidebar/icons/ScatterIcon.js.map +1 -0
- package/dist/sidebar/icons/index.js +8 -0
- package/dist/sidebar/icons/index.js.map +1 -0
- package/dist/sidebar/index.d.ts +1 -0
- package/dist/sidebar/index.d.ts.map +1 -1
- package/dist/sidebar/index.js +19 -0
- package/dist/sidebar/index.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.css +68 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.css.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js +964 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilderUtils.js +132 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilderUtils.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.css +29 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.css.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.js +188 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js +81 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/PointerSensorWithInteraction.js +30 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/PointerSensorWithInteraction.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js +158 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.js +146 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js +59 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.css +139 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.css.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js +44 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.js +129 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/types.js +4 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/types.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js +261 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js.map +1 -0
- package/package.json +15 -15
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PartitionSelectorSearch.js","names":["React","Component","PropTypes","debounce","ItemList","LoadingSpinner","Log","CanceledPromiseError","log","module","DEBOUNCE_UPDATE_FILTER","PartitionSelectorSearch","handleError","error","constructor","props","updateFilter","handleFilterChange","bind","handleInputFocus","handleKeyDown","handleListKeydown","handleSelect","handleTableUpdate","handleTextChange","handleViewportChange","itemList","searchInput","timer","state","offset","itemCount","items","text","isLoading","componentDidMount","startListening","componentDidUpdate","prevProps","prevState","onListResized","componentWillUnmount","debounceUpdateFilter","cancel","stopListening","event","key","selectedValue","length","value","trim","onSelect","stopPropagation","preventDefault","focusItem","focus","debug2","table","size","setState","itemIndex","offsetIndex","data","detail","getFormattedString","column","columns","r","rows","row","get","displayValue","type","name","push","target","topRow","bottomRow","delta","Math","max","top","bottom","setViewport","dh","initialPageSize","addEventListener","Table","EVENT_UPDATED","EVENT_FILTERCHANGED","removeEventListener","filterText","filters","filter","invoke","FilterValue","ofString","applyFilter","render","listHeight","min","MAX_VISIBLE_ITEMS","DEFAULT_ROW_HEIGHT","height","undefined","func","isRequired","shape","arrayOf","string","number"],"sources":["../src/PartitionSelectorSearch.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport debounce from 'lodash.debounce';\nimport type { dh as DhType, Table } from '@deephaven/jsapi-types';\nimport { ItemList, LoadingSpinner } from '@deephaven/components';\nimport Log from '@deephaven/log';\nimport { CanceledPromiseError } from '@deephaven/utils';\nimport './PartitionSelectorSearch.scss';\nimport { ModelIndex } from '@deephaven/grid';\n\nconst log = Log.module('PartitionSelectorSearch');\nconst DEBOUNCE_UPDATE_FILTER = 150;\n\ninterface Item {\n value: string;\n displayValue: string;\n}\n\ninterface PartitionSelectorSearchProps<T> {\n dh: DhType;\n getFormattedString: (value: T, type: string, name: string) => string;\n table: Table;\n initialPageSize: number;\n onSelect: (value: string) => void;\n onListResized: () => void;\n}\ninterface PartitionSelectorSearchState {\n offset: number;\n itemCount: number;\n items: Item[];\n text: string;\n isLoading: boolean;\n}\nclass PartitionSelectorSearch<T> extends Component<\n PartitionSelectorSearchProps<T>,\n PartitionSelectorSearchState\n> {\n static MAX_VISIBLE_ITEMS = 12;\n\n static defaultProps = {\n initialPageSize: 100,\n onSelect: (): void => undefined,\n onListResized: (): void => undefined,\n };\n\n static propTypes = {\n getFormattedString: PropTypes.func.isRequired,\n table: PropTypes.shape({\n addEventListener: PropTypes.func.isRequired,\n removeEventListener: PropTypes.func.isRequired,\n columns: PropTypes.arrayOf(\n PropTypes.shape({\n name: PropTypes.string.isRequired,\n type: PropTypes.string.isRequired,\n filter: PropTypes.func.isRequired,\n })\n ),\n size: PropTypes.number.isRequired,\n applyFilter: PropTypes.func.isRequired,\n setViewport: PropTypes.func.isRequired,\n }).isRequired,\n initialPageSize: PropTypes.number,\n onSelect: PropTypes.func,\n onListResized: PropTypes.func,\n };\n\n static handleError(error: unknown): void {\n if (!(error instanceof CanceledPromiseError)) {\n log.error(error);\n }\n }\n\n constructor(props: PartitionSelectorSearchProps<T>) {\n super(props);\n\n this.handleFilterChange = this.handleFilterChange.bind(this);\n this.handleInputFocus = this.handleInputFocus.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleListKeydown = this.handleListKeydown.bind(this);\n this.handleSelect = this.handleSelect.bind(this);\n this.handleTableUpdate = this.handleTableUpdate.bind(this);\n this.handleTextChange = this.handleTextChange.bind(this);\n this.handleViewportChange = this.handleViewportChange.bind(this);\n\n this.itemList = null;\n this.searchInput = null;\n this.timer = null;\n\n this.state = {\n offset: 0,\n itemCount: 0,\n items: [],\n text: '',\n isLoading: true,\n };\n }\n\n componentDidMount(): void {\n this.startListening();\n }\n\n componentDidUpdate(\n prevProps: PartitionSelectorSearchProps<T>,\n prevState: PartitionSelectorSearchState\n ): void {\n const { isLoading, itemCount } = this.state;\n const { onListResized } = this.props;\n if (\n itemCount !== prevState.itemCount ||\n isLoading !== prevState.isLoading\n ) {\n onListResized();\n }\n }\n\n componentWillUnmount(): void {\n this.debounceUpdateFilter.cancel();\n\n this.stopListening();\n }\n\n itemList: ItemList<Item> | null;\n\n searchInput: HTMLInputElement | null;\n\n timer: null;\n\n handleKeyDown(event: React.KeyboardEvent<HTMLInputElement>): boolean {\n if (this.itemList == null) {\n return false;\n }\n\n const { items, itemCount } = this.state;\n switch (event.key) {\n case 'Enter': {\n let selectedValue = null;\n if (items.length > 0) {\n selectedValue = items[0].value;\n } else {\n const { text } = this.state;\n selectedValue = text.trim();\n }\n\n if (selectedValue.length > 0) {\n const { onSelect } = this.props;\n onSelect(selectedValue);\n }\n\n event.stopPropagation();\n event.preventDefault();\n return true;\n }\n case 'ArrowDown':\n if (itemCount > 0) {\n this.itemList.focusItem(1);\n }\n event.stopPropagation();\n event.preventDefault();\n return true;\n default:\n return false;\n }\n }\n\n handleListKeydown(event: React.KeyboardEvent<HTMLDivElement>): void {\n switch (event.key) {\n case 'Escape':\n // Do nothing\n break;\n default:\n this.focus();\n break;\n }\n }\n\n handleFilterChange(): void {\n log.debug2('handleFilterChange');\n\n const { table } = this.props;\n const itemCount = table.size;\n this.setState({ itemCount, isLoading: true });\n }\n\n handleInputFocus(): void {\n if (this.itemList) {\n this.itemList.focusItem(0);\n }\n }\n\n handleSelect(itemIndex: ModelIndex): void {\n log.debug2('handleSelect', itemIndex);\n\n const { onSelect } = this.props;\n const { offset, items } = this.state;\n const offsetIndex = itemIndex - offset;\n if (offsetIndex < 0 || items.length <= offsetIndex) {\n log.error('No data for item', itemIndex);\n return;\n }\n\n const { value } = items[offsetIndex];\n onSelect(value);\n }\n\n handleTableUpdate(event: CustomEvent): void {\n const data = event.detail;\n const { offset } = data;\n\n const items = [] as Item[];\n const { getFormattedString, table } = this.props;\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 = getFormattedString(value, column.type, column.name);\n items.push({\n displayValue,\n value,\n });\n }\n\n const itemCount = table.size;\n log.debug2('handleTableUpdate', itemCount, offset, items.length);\n this.setState({ itemCount, items, offset, isLoading: false });\n }\n\n handleTextChange(event: React.ChangeEvent<HTMLInputElement>): void {\n log.debug2('handleTextChange');\n\n const { value: text } = event.target;\n\n this.setState({ text });\n\n this.debounceUpdateFilter();\n }\n\n handleViewportChange(topRow: number, bottomRow: number): void {\n log.debug2('handleViewportChange', topRow, bottomRow);\n\n const delta = Math.max(1, bottomRow - topRow);\n const top = Math.max(0, topRow - delta);\n const bottom = bottomRow + delta;\n\n const { table } = this.props;\n table.setViewport(top, bottom);\n }\n\n debounceUpdateFilter = debounce((): void => {\n this.updateFilter();\n }, DEBOUNCE_UPDATE_FILTER);\n\n focus(): void {\n if (this.searchInput) {\n this.searchInput.focus();\n }\n }\n\n startListening(): void {\n const { dh, initialPageSize, table } = this.props;\n table.addEventListener(dh.Table.EVENT_UPDATED, this.handleTableUpdate);\n table.addEventListener(\n dh.Table.EVENT_FILTERCHANGED,\n this.handleFilterChange\n );\n table.setViewport(0, initialPageSize);\n }\n\n stopListening(): void {\n const { dh, table } = this.props;\n table.removeEventListener(dh.Table.EVENT_UPDATED, this.handleTableUpdate);\n table.removeEventListener(\n dh.Table.EVENT_FILTERCHANGED,\n this.handleFilterChange\n );\n }\n\n updateFilter(): void {\n const { dh, initialPageSize, table } = this.props;\n const { text } = this.state;\n const filterText = text.trim();\n const filters = [];\n if (filterText.length > 0) {\n const column = table.columns[0];\n const filter = column\n .filter()\n .invoke(\n 'matches',\n dh.FilterValue.ofString(`(?s)(?i).*\\\\Q${filterText}\\\\E.*`)\n );\n filters.push(filter);\n }\n\n log.debug2('updateFilter', filters);\n\n table.applyFilter(filters);\n table.setViewport(0, initialPageSize);\n }\n\n render(): JSX.Element {\n const { isLoading, itemCount, items, offset, text } = this.state;\n const listHeight =\n Math.min(itemCount, PartitionSelectorSearch.MAX_VISIBLE_ITEMS) *\n ItemList.DEFAULT_ROW_HEIGHT +\n // Adjust for ListItem vertical padding - .375rem ~ 5.25px\n 11;\n return (\n <div className=\"iris-grid-partition-selector-search\">\n <div className=\"search-container\">\n <input\n type=\"text\"\n ref={searchInput => {\n this.searchInput = searchInput;\n }}\n value={text}\n placeholder=\"Available Partitions\"\n onChange={this.handleTextChange}\n onFocus={this.handleInputFocus}\n onKeyDown={this.handleKeyDown}\n className=\"form-control input-partition\"\n />\n </div>\n {!isLoading && itemCount > 0 && (\n <div\n className=\"iris-grid-partition-selector-search-list\"\n onKeyDown={this.handleListKeydown}\n role=\"presentation\"\n style={{ height: listHeight }}\n >\n <ItemList\n ref={itemList => {\n this.itemList = itemList;\n }}\n itemCount={itemCount}\n items={items}\n offset={offset}\n onSelect={this.handleSelect}\n onViewportChange={this.handleViewportChange}\n />\n </div>\n )}\n {!isLoading && itemCount === 0 && (\n <div className=\"iris-grid-partition-selector-search-empty\">\n No results\n </div>\n )}\n {isLoading && (\n <div className=\"iris-grid-partition-selector-loading\">\n <LoadingSpinner />\n Loading...\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default PartitionSelectorSearch;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/* stylelint-disable scss/at-import-no-partial-leading-underscore */
|
|
2
|
+
.pending-data-bottom-bar {
|
|
3
|
+
background-color: #2d2a2e;
|
|
4
|
+
}
|
|
5
|
+
.pending-data-bottom-bar .buttons-container .btn-outline-primary {
|
|
6
|
+
color: #fcfcfa;
|
|
7
|
+
border-color: #fcfcfa;
|
|
8
|
+
}
|
|
9
|
+
.pending-data-bottom-bar .buttons-container .btn-outline-primary:hover {
|
|
10
|
+
background-color: #f83666;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/*# sourceMappingURL=PendingDataBottomBar.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../../../node_modules/@deephaven/components/scss/custom.scss","../src/PendingDataBottomBar.scss","../../../node_modules/@deephaven/components/scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAAA;ACEA;EACE,kBCQc;;ADNZ;EACE,OCYK;EDXL,cCWK;;ADVL;EACE,kBCuDO","file":"PendingDataBottomBar.css","sourcesContent":["/* stylelint-disable scss/at-import-no-partial-leading-underscore */\n// Consumers should be able to resolve bootstrap/ to node_modules/bootstrap\n\n//Make bootstrap functions available for use in overrides\n@import 'bootstrap/scss/_functions.scss';\n@import './bootstrap_overrides.scss';\n\n//_variable imports come after bootstrap default overrides,\n// makes all other variables and mixins from bootstrap available\n/// with just importing customer.scss\n@import 'bootstrap/scss/_variables.scss';\n@import 'bootstrap/scss/_mixins.scss';\n\n//New variables come after imports\n@import './new_variables.scss';\n","@import '@deephaven/components/scss/custom.scss';\n\n.pending-data-bottom-bar {\n background-color: $content-bg;\n .buttons-container {\n .btn-outline-primary {\n color: $gray-100;\n border-color: $gray-100;\n &:hover {\n background-color: $danger-hover;\n }\n }\n }\n}\n","// Styling overrides for bootstrap\n\n// Override / set color variables\n$red: #f95d84;\n$orange: #f37e3f;\n$yellow: #fcd65b;\n$green: #9edc6f;\n$blue: #76d9e4;\n$purple: #aa9af4;\n\n//Define some UI colors\n$interfacegray: #2d2a2e;\n$interfaceblue: #4878ea;\n$interfacewhite: #f0f0ee; //same as gray-200\n$interfaceblack: #1a171a;\n\n//Define our Gray scale\n$white: $interfacewhite;\n$gray-100: #fcfcfa;\n$gray-200: $interfacewhite;\n$gray-300: #c0bfbf;\n$gray-400: #929192;\n$gray-500: #5b5a5c;\n$gray-600: #555356;\n$gray-700: #403e41;\n$gray-800: #373438;\n$gray-850: #322f33;\n$gray-900: #211f22;\n$black: $interfaceblack;\n$content-bg: $interfacegray;\n$background: $interfaceblack;\n$foreground: $interfacewhite;\n\n//Load colors into map\n$colors: ();\n$colors: map-merge(\n (\n 'red': $red,\n 'orange': $orange,\n 'yellow': $yellow,\n 'green': $green,\n 'blue': $blue,\n 'purple': $purple,\n 'white': $white,\n 'black': $black,\n ),\n $colors\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: $interfaceblue;\n$primary-hover: darken($primary, 8%);\n$primary-dark: mix($primary, $content-bg, 25%);\n$primary-light: scale-color($primary, $lightness: -25%);\n$secondary: $gray-500;\n$secondary-hover: darken($secondary, 8%);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: $red;\n$danger-hover: darken($danger, 8%);\n$light: $gray-100;\n$mid: $gray-400; //Added a mid color, useful for input styling\n$dark: $gray-800;\n$green-dark: scale-color($green, $lightness: -45%, $saturation: -10%);\n\n$theme-colors: () !default;\n$theme-colors: map-merge(\n (\n 'primary': $primary,\n 'primary-hover': $primary-hover,\n 'primary-light': $primary-light,\n 'primary-dark': $primary-dark,\n 'secondary': $secondary,\n 'success': $success,\n 'info': $info,\n 'warning': $warning,\n 'danger': $danger,\n 'light': $light,\n 'dark': $dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n ),\n $theme-colors\n);\n\n$component-active-bg: $primary;\n$theme-color-interval: 9%;\n$yiq-contrasted-threshold: 180;\n\n// Override fonts\n$font-family-sans-serif: 'Fira Sans', -apple-system, blinkmacsystemfont,\n 'Segoe UI', 'Roboto', 'Helvetica Neue', arial, sans-serif; //fira sans then native system ui fallbacks\n$font-family-monospace: 'Fira Mono', menlo, monaco, consolas, 'Liberation Mono',\n 'Courier New', monospace;\n$font-family-base: $font-family-sans-serif;\n\n$headings-font-weight: 400;\n\n//Text overides\n$text-muted: $gray-400;\n\n//Style Selection highlight color\n//so browsers add alpha to your color by default, ignoring opacity 1\n//by setting rgba with 0.99 it tricks browser into thinking there is alpha applied\n$text-select-color: $primary-hover;\n$text-select-color-editor: lighten(\n $gray-700,\n 15%\n); //we lighten it abit to account for that 0.01 loss, and because it needs some anyways.\n\n//Grid variables, same value as default just making easily accessible\n$grid-gutter-width: 30px;\n\n//Visual Overrides\n$border-radius: 4px;\n$box-shadow: 0 0.1rem 1rem rgba($black, 45%); //because our UI is so dark, we need darker default shadows\n$box-shadow-900: 0 0.1rem 1rem rgba(0, 0, 0, 45%); //darkest shadow for $black popups over $black UI\n\n//Override Btn\n$btn-border-radius: 4rem;\n$btn-padding-x: 1.5rem;\n$btn-transition: color 0.12s ease-in-out, background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out, box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n\n//Override Inputs\n$input-bg: $gray-600;\n$input-disabled-bg: $gray-800;\n$input-color: $foreground;\n$input-border-color: $gray-400;\n$input-placeholder-color: $gray-400;\n$input-focus-border-color: rgba($primary, 85%);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: rgba($component-active-bg, 35%);\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color;\n\n//checkbox\n$custom-control-indicator-bg: $gray-600;\n$custom-control-indicator-bg-size: 75% 75%;\n$custom-control-indicator-disabled-bg: $gray-800;\n$custom-control-indicator-checked-disabled-bg: $gray-800;\n$custom-control-label-disabled-color: $gray-400;\n\n//Custom Select\n$custom-select-indicator-color: $gray-400;\n$custom-select-bg-size: 16px 16px;\n//dhSort icon encoded\n$custom-select-indicator: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M4 7l-.4-.8 4-3.7h.8l4 3.7-.4.8H4zm0 2l-.4.8 4 3.7h.8l4-3.7L12 9H4z'/%3E%3C/svg%3E\"),\n '#',\n '%23'\n);\n$custom-select-focus-box-shadow: $input-btn-focus-box-shadow;\n$custom-select-disabled-color: darken($gray-400, 5%);\n$custom-select-disabled-bg: $gray-800;\n\n//modal\n$modal-content-bg: $gray-200;\n$modal-content-border-width: 0;\n$modal-md: 550px;\n\n// Toast notification\n$toast-bg: $primary-dark;\n$toast-color: $foreground;\n$toast-error-bg: mix($danger, $content-bg, 15%);\n$toast-error-color: $foreground;\n\n//tooltips\n$tooltip-bg: $gray-700;\n$tooltip-color: $foreground;\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem rgba($black, 80%);\n\n//drowdowns\n$dropdown-bg: $gray-600;\n$dropdown-link-color: $foreground;\n$dropdown-link-hover-color: $foreground;\n$dropdown-link-hover-bg: $primary;\n$dropdown-divider-bg: $gray-700;\n\n//context menus\n$contextmenu-bg: $gray-600;\n$contextmenu-color: $foreground;\n$contextmenu-disabled-color: $text-muted;\n$contextmenu-keyboard-selected-bg: rgba($primary, 50%);\n$contextmenu-selected-bg: $primary;\n$contextmenu-selected-color: $foreground;\n\n//links\n$link-color: $gray-400;\n$link-hover-color: $foreground;\n\n//progress-bar\n$progress-bg: $gray-600;\n$progress-border-radius: 1rem;\n\n// Set global options\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-print-styles: false; //I don't think anyone should expect to \"print\" this app.\n\n// Transition times\n$transition: 0.15s;\n$transition-mid: 0.2s;\n$transition-long: 0.3s;\n$transition-slow: 0.6s;\n\n//form-validation icon, uses vsWarning icon encoded here as svg\n$form-feedback-icon-invalid-color: theme-color('danger');\n$form-feedback-icon-invalid: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cg fill='none'%3E%3Cg fill='#{$form-feedback-icon-invalid-color}'%3E%3Cpath d='M7.56 1h.88l6.54 12.26-.44.74H1.44L1 13.26 7.56 1zM8 2.28 2.28 13H13.7L8 2.28zM8.625 12v-1h-1.25v1h1.25zm-1.25-2V6h1.25v4h-1.25z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E \"),\n '#',\n '%23'\n);\n"]}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import React, { useEffect, useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
3
|
+
import { vsPass, vsWarning } from '@deephaven/icons';
|
|
4
|
+
import { Button, LoadingSpinner } from '@deephaven/components';
|
|
5
|
+
import { usePrevious } from '@deephaven/react-hooks';
|
|
6
|
+
import IrisGridBottomBar from "./IrisGridBottomBar.js";
|
|
7
|
+
import "./PendingDataBottomBar.css";
|
|
8
|
+
var HIDE_TIMEOUT = 3000;
|
|
9
|
+
var MAX_NUMBER_ROWS_SHOWN = 5;
|
|
10
|
+
export function PendingDataBottomBar(_ref) {
|
|
11
|
+
var {
|
|
12
|
+
isSaving = false,
|
|
13
|
+
onSave,
|
|
14
|
+
onDiscard,
|
|
15
|
+
discardTooltip,
|
|
16
|
+
saveTooltip,
|
|
17
|
+
error,
|
|
18
|
+
pendingDataErrors,
|
|
19
|
+
pendingDataMap,
|
|
20
|
+
onEntering,
|
|
21
|
+
onEntered,
|
|
22
|
+
onExiting,
|
|
23
|
+
onExited: _onExited
|
|
24
|
+
} = _ref;
|
|
25
|
+
var [isSuccessShown, setIsSuccessShown] = useState(false);
|
|
26
|
+
var [wasSuccessShown, setWasSuccessShown] = useState(false);
|
|
27
|
+
var successTimeout = useRef();
|
|
28
|
+
var prevIsSaving = usePrevious(isSaving);
|
|
29
|
+
var errorMessage = useMemo(() => {
|
|
30
|
+
if (pendingDataErrors.size === 0) {
|
|
31
|
+
return error;
|
|
32
|
+
}
|
|
33
|
+
if (pendingDataErrors.size <= MAX_NUMBER_ROWS_SHOWN) {
|
|
34
|
+
return "Key can't be empty (on pending row".concat(pendingDataErrors.size > 1 ? 's' : '', " ").concat(Array.from(pendingDataErrors.keys()).join(', ').trim(), ")");
|
|
35
|
+
}
|
|
36
|
+
return "Key can't be empty (on ".concat(pendingDataErrors.size, " rows)");
|
|
37
|
+
}, [error, pendingDataErrors]);
|
|
38
|
+
useEffect(function showSuccessMessage() {
|
|
39
|
+
if (prevIsSaving != null && prevIsSaving && !isSaving && errorMessage == null) {
|
|
40
|
+
setIsSuccessShown(true);
|
|
41
|
+
setWasSuccessShown(true);
|
|
42
|
+
successTimeout.current = setTimeout(() => {
|
|
43
|
+
setIsSuccessShown(false);
|
|
44
|
+
}, HIDE_TIMEOUT);
|
|
45
|
+
}
|
|
46
|
+
}, [errorMessage, isSaving, prevIsSaving]);
|
|
47
|
+
useEffect(function hideSuccessMessage() {
|
|
48
|
+
if (successTimeout.current && pendingDataMap.size > 0) {
|
|
49
|
+
// A change just occurred while the success message was still being shown, just hide the success message
|
|
50
|
+
clearTimeout(successTimeout.current);
|
|
51
|
+
setIsSuccessShown(false);
|
|
52
|
+
setWasSuccessShown(false);
|
|
53
|
+
}
|
|
54
|
+
}, [pendingDataMap]);
|
|
55
|
+
useEffect(function cleanupTimeout() {
|
|
56
|
+
return () => successTimeout.current ? clearTimeout(successTimeout.current) : undefined;
|
|
57
|
+
}, []);
|
|
58
|
+
var pendingRowCount = pendingDataMap.size;
|
|
59
|
+
var commitIcon;
|
|
60
|
+
if (isSaving) {
|
|
61
|
+
commitIcon = /*#__PURE__*/React.createElement(LoadingSpinner, null);
|
|
62
|
+
} else if (wasSuccessShown) {
|
|
63
|
+
commitIcon = vsPass;
|
|
64
|
+
}
|
|
65
|
+
return /*#__PURE__*/React.createElement(IrisGridBottomBar, {
|
|
66
|
+
className: "pending-data-bottom-bar",
|
|
67
|
+
isShown: pendingRowCount > 0 || isSuccessShown || errorMessage != null,
|
|
68
|
+
onEntering: onEntering,
|
|
69
|
+
onEntered: onEntered,
|
|
70
|
+
onExiting: onExiting,
|
|
71
|
+
onExited: () => {
|
|
72
|
+
setWasSuccessShown(false);
|
|
73
|
+
if (_onExited) {
|
|
74
|
+
_onExited();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}, errorMessage != null && errorMessage !== '' && /*#__PURE__*/React.createElement("div", {
|
|
78
|
+
className: "error-message"
|
|
79
|
+
}, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
|
|
80
|
+
icon: vsWarning
|
|
81
|
+
}), /*#__PURE__*/React.createElement("span", null, "".concat(errorMessage))), (errorMessage == null || errorMessage === '') && /*#__PURE__*/React.createElement("div", {
|
|
82
|
+
className: "status-message"
|
|
83
|
+
}, pendingRowCount > 0 && /*#__PURE__*/React.createElement("span", null, "".concat(pendingRowCount, " row").concat(pendingRowCount > 1 ? 's' : '', " pending"))), /*#__PURE__*/React.createElement("div", {
|
|
84
|
+
className: "buttons-container"
|
|
85
|
+
}, !isSaving && !wasSuccessShown && /*#__PURE__*/React.createElement(Button, {
|
|
86
|
+
kind: "secondary",
|
|
87
|
+
onClick: onDiscard,
|
|
88
|
+
tooltip: discardTooltip
|
|
89
|
+
}, "Discard"), /*#__PURE__*/React.createElement(Button, {
|
|
90
|
+
kind: wasSuccessShown ? 'success' : 'primary',
|
|
91
|
+
onClick: onSave,
|
|
92
|
+
icon: commitIcon,
|
|
93
|
+
disabled: isSaving || wasSuccessShown || errorMessage != null,
|
|
94
|
+
tooltip: saveTooltip
|
|
95
|
+
}, isSaving && "Committing...", !isSaving && wasSuccessShown && "Success", !isSaving && !wasSuccessShown && "Commit")));
|
|
96
|
+
}
|
|
97
|
+
export default PendingDataBottomBar;
|
|
98
|
+
//# sourceMappingURL=PendingDataBottomBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PendingDataBottomBar.js","names":["React","useEffect","useMemo","useRef","useState","FontAwesomeIcon","vsPass","vsWarning","Button","LoadingSpinner","usePrevious","IrisGridBottomBar","HIDE_TIMEOUT","MAX_NUMBER_ROWS_SHOWN","PendingDataBottomBar","isSaving","onSave","onDiscard","discardTooltip","saveTooltip","error","pendingDataErrors","pendingDataMap","onEntering","onEntered","onExiting","onExited","isSuccessShown","setIsSuccessShown","wasSuccessShown","setWasSuccessShown","successTimeout","prevIsSaving","errorMessage","size","Array","from","keys","join","trim","showSuccessMessage","current","setTimeout","hideSuccessMessage","clearTimeout","cleanupTimeout","undefined","pendingRowCount","commitIcon"],"sources":["../src/PendingDataBottomBar.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsPass, vsWarning } from '@deephaven/icons';\nimport { Button, LoadingSpinner } from '@deephaven/components';\nimport { usePrevious } from '@deephaven/react-hooks';\nimport IrisGridBottomBar from './IrisGridBottomBar';\nimport './PendingDataBottomBar.scss';\nimport { PendingDataErrorMap, PendingDataMap } from './CommonTypes';\n\nconst HIDE_TIMEOUT = 3000;\n\nconst MAX_NUMBER_ROWS_SHOWN = 5;\n\nexport type PendingDataBottomBarProps = {\n onSave: () => Promise<void>;\n onDiscard: () => Promise<void>;\n discardTooltip?: string;\n saveTooltip?: string;\n isSaving?: boolean;\n error?: string | null;\n pendingDataErrors: PendingDataErrorMap;\n pendingDataMap: PendingDataMap;\n onEntering?: () => void;\n onEntered?: () => void;\n onExiting?: () => void;\n onExited?: () => void;\n};\n\nexport function PendingDataBottomBar({\n isSaving = false,\n onSave,\n onDiscard,\n discardTooltip,\n saveTooltip,\n error,\n pendingDataErrors,\n pendingDataMap,\n onEntering,\n onEntered,\n onExiting,\n onExited,\n}: PendingDataBottomBarProps): JSX.Element {\n const [isSuccessShown, setIsSuccessShown] = useState(false);\n const [wasSuccessShown, setWasSuccessShown] = useState(false);\n const successTimeout = useRef<ReturnType<typeof setTimeout>>();\n const prevIsSaving = usePrevious(isSaving);\n const errorMessage = useMemo(() => {\n if (pendingDataErrors.size === 0) {\n return error;\n }\n if (pendingDataErrors.size <= MAX_NUMBER_ROWS_SHOWN) {\n return `Key can't be empty (on pending row${\n pendingDataErrors.size > 1 ? 's' : ''\n } ${Array.from(pendingDataErrors.keys()).join(', ').trim()})`;\n }\n return `Key can't be empty (on ${pendingDataErrors.size} rows)`;\n }, [error, pendingDataErrors]);\n\n useEffect(\n function showSuccessMessage() {\n if (\n prevIsSaving != null &&\n prevIsSaving &&\n !isSaving &&\n errorMessage == null\n ) {\n setIsSuccessShown(true);\n setWasSuccessShown(true);\n successTimeout.current = setTimeout(() => {\n setIsSuccessShown(false);\n }, HIDE_TIMEOUT);\n }\n },\n [errorMessage, isSaving, prevIsSaving]\n );\n\n useEffect(\n function hideSuccessMessage() {\n if (successTimeout.current && pendingDataMap.size > 0) {\n // A change just occurred while the success message was still being shown, just hide the success message\n clearTimeout(successTimeout.current);\n setIsSuccessShown(false);\n setWasSuccessShown(false);\n }\n },\n [pendingDataMap]\n );\n\n useEffect(function cleanupTimeout() {\n return () =>\n successTimeout.current ? clearTimeout(successTimeout.current) : undefined;\n }, []);\n\n const pendingRowCount = pendingDataMap.size;\n let commitIcon;\n if (isSaving) {\n commitIcon = <LoadingSpinner />;\n } else if (wasSuccessShown) {\n commitIcon = vsPass;\n }\n\n return (\n <IrisGridBottomBar\n className=\"pending-data-bottom-bar\"\n isShown={pendingRowCount > 0 || isSuccessShown || errorMessage != null}\n onEntering={onEntering}\n onEntered={onEntered}\n onExiting={onExiting}\n onExited={() => {\n setWasSuccessShown(false);\n if (onExited) {\n onExited();\n }\n }}\n >\n {errorMessage != null && errorMessage !== '' && (\n <div className=\"error-message\">\n <FontAwesomeIcon icon={vsWarning} />\n <span>{`${errorMessage}`}</span>\n </div>\n )}\n {(errorMessage == null || errorMessage === '') && (\n <div className=\"status-message\">\n {pendingRowCount > 0 && (\n <span>{`${pendingRowCount} row${\n pendingRowCount > 1 ? 's' : ''\n } pending`}</span>\n )}\n </div>\n )}\n <div className=\"buttons-container\">\n {!isSaving && !wasSuccessShown && (\n <Button kind=\"secondary\" onClick={onDiscard} tooltip={discardTooltip}>\n Discard\n </Button>\n )}\n <Button\n kind={wasSuccessShown ? 'success' : 'primary'}\n onClick={onSave}\n icon={commitIcon}\n disabled={isSaving || wasSuccessShown || errorMessage != null}\n tooltip={saveTooltip}\n >\n {isSaving && `Committing...`}\n {!isSaving && wasSuccessShown && `Success`}\n {!isSaving && !wasSuccessShown && `Commit`}\n </Button>\n </div>\n </IrisGridBottomBar>\n );\n}\n\nexport default PendingDataBottomBar;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
3
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
4
|
+
import { PureComponent } from 'react';
|
|
5
|
+
import memoize from 'memoize-one';
|
|
6
|
+
import throttle from 'lodash.throttle';
|
|
7
|
+
import { GridUtils } from '@deephaven/grid';
|
|
8
|
+
import Log from '@deephaven/log';
|
|
9
|
+
var log = Log.module('TableViewportUpdater');
|
|
10
|
+
var UPDATE_THROTTLE = 150;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Updates the viewport for an Iris table, for use in a scroll pane.
|
|
14
|
+
* Automatically throttles the viewport requests and buffers above and below.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
class TableViewportUpdater extends PureComponent {
|
|
18
|
+
constructor() {
|
|
19
|
+
super(...arguments);
|
|
20
|
+
_defineProperty(this, "subscription", void 0);
|
|
21
|
+
_defineProperty(this, "getViewportRowRange", memoize((table, top, bottom) => {
|
|
22
|
+
var viewHeight = bottom - top;
|
|
23
|
+
var viewportTop = Math.max(0, top - viewHeight * TableViewportUpdater.ROW_BUFFER_PAGES);
|
|
24
|
+
var viewportBottom = bottom + viewHeight * TableViewportUpdater.ROW_BUFFER_PAGES;
|
|
25
|
+
return [viewportTop, viewportBottom];
|
|
26
|
+
}));
|
|
27
|
+
_defineProperty(this, "getViewportColumns", memoize((table, left, right, movedColumns) => {
|
|
28
|
+
if (left == null || right == null) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
var viewWidth = right - left;
|
|
32
|
+
var viewportLeft = Math.max(0, left - viewWidth * TableViewportUpdater.COLUMN_BUFFER_PAGES);
|
|
33
|
+
var viewportRight = Math.min(right + viewWidth * TableViewportUpdater.COLUMN_BUFFER_PAGES, table.columns.length - 1);
|
|
34
|
+
|
|
35
|
+
// Need to get all the columns from the table model now
|
|
36
|
+
var columns = [];
|
|
37
|
+
for (var i = viewportLeft; i <= viewportRight; i += 1) {
|
|
38
|
+
var modelIndex = GridUtils.getModelIndex(i, movedColumns);
|
|
39
|
+
columns.push(table.columns[modelIndex]);
|
|
40
|
+
}
|
|
41
|
+
return columns;
|
|
42
|
+
}));
|
|
43
|
+
_defineProperty(this, "updateViewport", throttle((top, bottom, left, right, viewColumns) => {
|
|
44
|
+
if (bottom < top) {
|
|
45
|
+
log.error('Invalid viewport', top, bottom);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (top === 0 && bottom === 0) {
|
|
49
|
+
log.debug2('Ignoring 0-0 viewport');
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
var {
|
|
53
|
+
movedColumns,
|
|
54
|
+
table
|
|
55
|
+
} = this.props;
|
|
56
|
+
var [viewportTop, viewportBottom] = this.getViewportRowRange(table, top, bottom);
|
|
57
|
+
var columns = viewColumns !== null && viewColumns !== void 0 ? viewColumns : this.getViewportColumns(table, left, right, movedColumns);
|
|
58
|
+
log.debug2('Setting Viewport Top:', viewportTop, 'Bottom:', viewportBottom, 'Columns:', columns);
|
|
59
|
+
if (this.subscription == null) {
|
|
60
|
+
log.debug2('updateViewport creating new subscription');
|
|
61
|
+
this.subscription = table.setViewport(viewportTop, viewportBottom, columns);
|
|
62
|
+
var {
|
|
63
|
+
onSubscription
|
|
64
|
+
} = this.props;
|
|
65
|
+
onSubscription(this.subscription);
|
|
66
|
+
} else {
|
|
67
|
+
log.debug2('updateViewport using existing subscription');
|
|
68
|
+
this.subscription.setViewport(viewportTop, viewportBottom, columns);
|
|
69
|
+
}
|
|
70
|
+
}, UPDATE_THROTTLE));
|
|
71
|
+
}
|
|
72
|
+
componentDidMount() {
|
|
73
|
+
var {
|
|
74
|
+
top,
|
|
75
|
+
bottom,
|
|
76
|
+
left,
|
|
77
|
+
right,
|
|
78
|
+
table,
|
|
79
|
+
filters,
|
|
80
|
+
sorts,
|
|
81
|
+
columns,
|
|
82
|
+
customColumns
|
|
83
|
+
} = this.props;
|
|
84
|
+
table.applyFilter(filters);
|
|
85
|
+
table.applySort(sorts);
|
|
86
|
+
table.applyCustomColumns(customColumns);
|
|
87
|
+
this.updateViewport(top, bottom, left, right, columns);
|
|
88
|
+
}
|
|
89
|
+
componentDidUpdate(prevProps) {
|
|
90
|
+
var {
|
|
91
|
+
top,
|
|
92
|
+
bottom,
|
|
93
|
+
left,
|
|
94
|
+
right,
|
|
95
|
+
table,
|
|
96
|
+
filters,
|
|
97
|
+
sorts,
|
|
98
|
+
customColumns,
|
|
99
|
+
columns
|
|
100
|
+
} = this.props;
|
|
101
|
+
var isFilterChanged = filters !== prevProps.filters;
|
|
102
|
+
var isSortChanged = sorts !== prevProps.sorts;
|
|
103
|
+
var isCustomColumnsChanged = customColumns !== prevProps.customColumns;
|
|
104
|
+
var isTableChanged = table !== prevProps.table;
|
|
105
|
+
if (isFilterChanged || isSortChanged || isCustomColumnsChanged || isTableChanged) {
|
|
106
|
+
this.closeSubscription();
|
|
107
|
+
}
|
|
108
|
+
if (isFilterChanged || isTableChanged) {
|
|
109
|
+
log.debug('update table filter', filters);
|
|
110
|
+
table.applyFilter(filters);
|
|
111
|
+
}
|
|
112
|
+
if (isSortChanged || isTableChanged) {
|
|
113
|
+
log.debug('update table sort', sorts);
|
|
114
|
+
table.applySort(sorts);
|
|
115
|
+
}
|
|
116
|
+
if (isCustomColumnsChanged || isTableChanged) {
|
|
117
|
+
log.debug('update table custom columns', customColumns);
|
|
118
|
+
table.applyCustomColumns(customColumns);
|
|
119
|
+
}
|
|
120
|
+
this.updateViewport(top, bottom, left, right, columns);
|
|
121
|
+
}
|
|
122
|
+
componentWillUnmount() {
|
|
123
|
+
this.closeSubscription();
|
|
124
|
+
}
|
|
125
|
+
closeSubscription() {
|
|
126
|
+
log.debug2('closeSubscription', this.subscription);
|
|
127
|
+
if (this.subscription) {
|
|
128
|
+
this.subscription.close();
|
|
129
|
+
this.subscription = undefined;
|
|
130
|
+
var {
|
|
131
|
+
onSubscription
|
|
132
|
+
} = this.props;
|
|
133
|
+
onSubscription();
|
|
134
|
+
}
|
|
135
|
+
this.updateViewport.cancel();
|
|
136
|
+
}
|
|
137
|
+
render() {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
_defineProperty(TableViewportUpdater, "ROW_BUFFER_PAGES", 3);
|
|
142
|
+
_defineProperty(TableViewportUpdater, "COLUMN_BUFFER_PAGES", 1);
|
|
143
|
+
_defineProperty(TableViewportUpdater, "defaultProps", {
|
|
144
|
+
top: 0,
|
|
145
|
+
bottom: 0,
|
|
146
|
+
left: null,
|
|
147
|
+
right: null,
|
|
148
|
+
columns: null,
|
|
149
|
+
onSubscription: () => undefined,
|
|
150
|
+
filters: [],
|
|
151
|
+
sorts: [],
|
|
152
|
+
customColumns: [],
|
|
153
|
+
movedColumns: []
|
|
154
|
+
});
|
|
155
|
+
export default TableViewportUpdater;
|
|
156
|
+
//# sourceMappingURL=TableViewportUpdater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableViewportUpdater.js","names":["PureComponent","memoize","throttle","GridUtils","Log","log","module","UPDATE_THROTTLE","TableViewportUpdater","table","top","bottom","viewHeight","viewportTop","Math","max","ROW_BUFFER_PAGES","viewportBottom","left","right","movedColumns","viewWidth","viewportLeft","COLUMN_BUFFER_PAGES","viewportRight","min","columns","length","i","modelIndex","getModelIndex","push","viewColumns","error","debug2","props","getViewportRowRange","getViewportColumns","subscription","setViewport","onSubscription","componentDidMount","filters","sorts","customColumns","applyFilter","applySort","applyCustomColumns","updateViewport","componentDidUpdate","prevProps","isFilterChanged","isSortChanged","isCustomColumnsChanged","isTableChanged","closeSubscription","debug","componentWillUnmount","close","undefined","cancel","render"],"sources":["../src/TableViewportUpdater.tsx"],"sourcesContent":["import { PureComponent } from 'react';\nimport memoize from 'memoize-one';\nimport throttle from 'lodash.throttle';\nimport { GridUtils, MoveOperation } from '@deephaven/grid';\nimport type {\n Column,\n FilterCondition,\n Sort,\n Table,\n TableViewportSubscription,\n} from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport { ColumnName } from './CommonTypes';\n\nconst log = Log.module('TableViewportUpdater');\n\nconst UPDATE_THROTTLE = 150;\n\n/**\n * Updates the viewport for an Iris table, for use in a scroll pane.\n * Automatically throttles the viewport requests and buffers above and below.\n */\n\ninterface TableViewportUpdaterProps {\n table: Table;\n top: number;\n bottom: number;\n left: number;\n right: number;\n columns: Column[];\n filters: FilterCondition[];\n sorts: Sort[];\n customColumns: ColumnName[];\n movedColumns: MoveOperation[];\n onSubscription: (subscription?: TableViewportSubscription) => void;\n}\n\nclass TableViewportUpdater extends PureComponent<\n TableViewportUpdaterProps,\n Record<string, never>\n> {\n // Number of pages to buffer for rows/columns\n static ROW_BUFFER_PAGES = 3;\n\n static COLUMN_BUFFER_PAGES = 1;\n\n static defaultProps = {\n top: 0,\n bottom: 0,\n left: null,\n right: null,\n columns: null,\n onSubscription: (): void => undefined,\n filters: [],\n sorts: [],\n customColumns: [],\n movedColumns: [],\n };\n\n componentDidMount(): void {\n const {\n top,\n bottom,\n left,\n right,\n table,\n filters,\n sorts,\n columns,\n customColumns,\n } = this.props;\n table.applyFilter(filters);\n table.applySort(sorts);\n table.applyCustomColumns(customColumns);\n this.updateViewport(top, bottom, left, right, columns);\n }\n\n componentDidUpdate(prevProps: TableViewportUpdaterProps): void {\n const {\n top,\n bottom,\n left,\n right,\n table,\n filters,\n sorts,\n customColumns,\n columns,\n } = this.props;\n const isFilterChanged = filters !== prevProps.filters;\n const isSortChanged = sorts !== prevProps.sorts;\n const isCustomColumnsChanged = customColumns !== prevProps.customColumns;\n const isTableChanged = table !== prevProps.table;\n if (\n isFilterChanged ||\n isSortChanged ||\n isCustomColumnsChanged ||\n isTableChanged\n ) {\n this.closeSubscription();\n }\n\n if (isFilterChanged || isTableChanged) {\n log.debug('update table filter', filters);\n table.applyFilter(filters);\n }\n\n if (isSortChanged || isTableChanged) {\n log.debug('update table sort', sorts);\n table.applySort(sorts);\n }\n\n if (isCustomColumnsChanged || isTableChanged) {\n log.debug('update table custom columns', customColumns);\n table.applyCustomColumns(customColumns);\n }\n\n this.updateViewport(top, bottom, left, right, columns);\n }\n\n componentWillUnmount(): void {\n this.closeSubscription();\n }\n\n subscription?: TableViewportSubscription;\n\n // eslint-disable-next-line class-methods-use-this\n getViewportRowRange = memoize((table: Table, top: number, bottom: number) => {\n const viewHeight = bottom - top;\n const viewportTop = Math.max(\n 0,\n top - viewHeight * TableViewportUpdater.ROW_BUFFER_PAGES\n );\n const viewportBottom =\n bottom + viewHeight * TableViewportUpdater.ROW_BUFFER_PAGES;\n return [viewportTop, viewportBottom];\n });\n\n // eslint-disable-next-line class-methods-use-this\n getViewportColumns = memoize(\n (\n table: Table,\n left: number,\n right: number,\n movedColumns: MoveOperation[]\n ) => {\n if (left == null || right == null) {\n return null;\n }\n\n const viewWidth = right - left;\n const viewportLeft = Math.max(\n 0,\n left - viewWidth * TableViewportUpdater.COLUMN_BUFFER_PAGES\n );\n const viewportRight = Math.min(\n right + viewWidth * TableViewportUpdater.COLUMN_BUFFER_PAGES,\n table.columns.length - 1\n );\n\n // Need to get all the columns from the table model now\n const columns = [];\n for (let i = viewportLeft; i <= viewportRight; i += 1) {\n const modelIndex = GridUtils.getModelIndex(i, movedColumns);\n columns.push(table.columns[modelIndex]);\n }\n\n return columns;\n }\n );\n\n closeSubscription(): void {\n log.debug2('closeSubscription', this.subscription);\n if (this.subscription) {\n this.subscription.close();\n this.subscription = undefined;\n\n const { onSubscription } = this.props;\n onSubscription();\n }\n\n this.updateViewport.cancel();\n }\n\n updateViewport = throttle(\n (\n top: number,\n bottom: number,\n left: number,\n right: number,\n viewColumns: Column[]\n ): void => {\n if (bottom < top) {\n log.error('Invalid viewport', top, bottom);\n return;\n }\n\n if (top === 0 && bottom === 0) {\n log.debug2('Ignoring 0-0 viewport');\n return;\n }\n\n const { movedColumns, table } = this.props;\n const [viewportTop, viewportBottom] = this.getViewportRowRange(\n table,\n top,\n bottom\n );\n const columns =\n viewColumns ??\n this.getViewportColumns(table, left, right, movedColumns);\n log.debug2(\n 'Setting Viewport Top:',\n viewportTop,\n 'Bottom:',\n viewportBottom,\n 'Columns:',\n columns\n );\n if (this.subscription == null) {\n log.debug2('updateViewport creating new subscription');\n this.subscription = table.setViewport(\n viewportTop,\n viewportBottom,\n columns\n );\n\n const { onSubscription } = this.props;\n onSubscription(this.subscription);\n } else {\n log.debug2('updateViewport using existing subscription');\n this.subscription.setViewport(viewportTop, viewportBottom, columns);\n }\n },\n UPDATE_THROTTLE\n );\n\n render(): null {\n return null;\n }\n}\n\nexport default TableViewportUpdater;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { usePrevious } from '@deephaven/react-hooks';
|
|
3
|
+
import IrisGridBottomBar from "./IrisGridBottomBar.js";
|
|
4
|
+
import "./PendingDataBottomBar.css";
|
|
5
|
+
var HIDE_TIMEOUT = 3000;
|
|
6
|
+
export function ToastBottomBar(_ref) {
|
|
7
|
+
var {
|
|
8
|
+
children = null,
|
|
9
|
+
onEntering,
|
|
10
|
+
onEntered,
|
|
11
|
+
onExiting,
|
|
12
|
+
onExited
|
|
13
|
+
} = _ref;
|
|
14
|
+
var [isShown, setIsShown] = useState(false);
|
|
15
|
+
var timeout = useRef();
|
|
16
|
+
var prevChildren = usePrevious(children);
|
|
17
|
+
var startTimer = useCallback(() => {
|
|
18
|
+
setIsShown(true);
|
|
19
|
+
if (timeout.current) {
|
|
20
|
+
clearTimeout(timeout.current);
|
|
21
|
+
}
|
|
22
|
+
timeout.current = setTimeout(() => {
|
|
23
|
+
setIsShown(false);
|
|
24
|
+
}, HIDE_TIMEOUT);
|
|
25
|
+
}, [setIsShown, timeout]);
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
if (prevChildren !== children && children != null) {
|
|
28
|
+
startTimer();
|
|
29
|
+
}
|
|
30
|
+
}, [children, prevChildren, setIsShown, startTimer]);
|
|
31
|
+
useEffect(() => () => timeout.current ? clearTimeout(timeout.current) : undefined, []);
|
|
32
|
+
return /*#__PURE__*/React.createElement(IrisGridBottomBar, {
|
|
33
|
+
className: "toast-bottom-bar",
|
|
34
|
+
isShown: isShown,
|
|
35
|
+
onEntering: onEntering,
|
|
36
|
+
onEntered: onEntered,
|
|
37
|
+
onExiting: onExiting,
|
|
38
|
+
onExited: onExited
|
|
39
|
+
}, children);
|
|
40
|
+
}
|
|
41
|
+
export default ToastBottomBar;
|
|
42
|
+
//# sourceMappingURL=ToastBottomBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToastBottomBar.js","names":["React","useCallback","useEffect","useRef","useState","usePrevious","IrisGridBottomBar","HIDE_TIMEOUT","ToastBottomBar","children","onEntering","onEntered","onExiting","onExited","isShown","setIsShown","timeout","prevChildren","startTimer","current","clearTimeout","setTimeout","undefined"],"sources":["../src/ToastBottomBar.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { usePrevious } from '@deephaven/react-hooks';\nimport IrisGridBottomBar from './IrisGridBottomBar';\nimport './PendingDataBottomBar.scss';\n\nconst HIDE_TIMEOUT = 3000;\n\nexport type ToastBottomBarProps = {\n children?: React.ReactNode;\n onEntering?: () => void;\n onEntered?: () => void;\n onExiting?: () => void;\n onExited?: () => void;\n};\n\nexport function ToastBottomBar({\n children = null,\n onEntering,\n onEntered,\n onExiting,\n onExited,\n}: ToastBottomBarProps): JSX.Element {\n const [isShown, setIsShown] = useState(false);\n const timeout = useRef<ReturnType<typeof setTimeout>>();\n const prevChildren = usePrevious(children);\n\n const startTimer = useCallback(() => {\n setIsShown(true);\n if (timeout.current) {\n clearTimeout(timeout.current);\n }\n timeout.current = setTimeout(() => {\n setIsShown(false);\n }, HIDE_TIMEOUT);\n }, [setIsShown, timeout]);\n\n useEffect(() => {\n if (prevChildren !== children && children != null) {\n startTimer();\n }\n }, [children, prevChildren, setIsShown, startTimer]);\n\n useEffect(\n () => () => (timeout.current ? clearTimeout(timeout.current) : undefined),\n []\n );\n\n return (\n <IrisGridBottomBar\n className=\"toast-bottom-bar\"\n isShown={isShown}\n onEntering={onEntering}\n onEntered={onEntered}\n onExiting={onExiting}\n onExited={onExited}\n >\n {children}\n </IrisGridBottomBar>\n );\n}\n\nexport default ToastBottomBar;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AACvE,SAASC,WAAW,QAAQ,wBAAwB;AAAC,OAC9CC,iBAAiB;AAAA;AAGxB,IAAMC,YAAY,GAAG,IAAI;AAUzB,OAAO,SAASC,cAAc,OAMO;EAAA,IANN;IAC7BC,QAAQ,GAAG,IAAI;IACfC,UAAU;IACVC,SAAS;IACTC,SAAS;IACTC;EACmB,CAAC;EACpB,IAAM,CAACC,OAAO,EAAEC,UAAU,CAAC,GAAGX,QAAQ,CAAC,KAAK,CAAC;EAC7C,IAAMY,OAAO,GAAGb,MAAM,EAAiC;EACvD,IAAMc,YAAY,GAAGZ,WAAW,CAACI,QAAQ,CAAC;EAE1C,IAAMS,UAAU,GAAGjB,WAAW,CAAC,MAAM;IACnCc,UAAU,CAAC,IAAI,CAAC;IAChB,IAAIC,OAAO,CAACG,OAAO,EAAE;MACnBC,YAAY,CAACJ,OAAO,CAACG,OAAO,CAAC;IAC/B;IACAH,OAAO,CAACG,OAAO,GAAGE,UAAU,CAAC,MAAM;MACjCN,UAAU,CAAC,KAAK,CAAC;IACnB,CAAC,EAAER,YAAY,CAAC;EAClB,CAAC,EAAE,CAACQ,UAAU,EAAEC,OAAO,CAAC,CAAC;EAEzBd,SAAS,CAAC,MAAM;IACd,IAAIe,YAAY,KAAKR,QAAQ,IAAIA,QAAQ,IAAI,IAAI,EAAE;MACjDS,UAAU,EAAE;IACd;EACF,CAAC,EAAE,CAACT,QAAQ,EAAEQ,YAAY,EAAEF,UAAU,EAAEG,UAAU,CAAC,CAAC;EAEpDhB,SAAS,CACP,MAAM,MAAOc,OAAO,CAACG,OAAO,GAAGC,YAAY,CAACJ,OAAO,CAACG,OAAO,CAAC,GAAGG,SAAU,EACzE,EAAE,CACH;EAED,oBACE,oBAAC,iBAAiB;IAChB,SAAS,EAAC,kBAAkB;IAC5B,OAAO,EAAER,OAAQ;IACjB,UAAU,EAAEJ,UAAW;IACvB,SAAS,EAAEC,SAAU;IACrB,SAAS,EAAEC,SAAU;IACrB,QAAQ,EAAEC;EAAS,GAElBJ,QAAQ,CACS;AAExB;AAEA,eAAeD,cAAc"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
3
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
4
|
+
import { PureComponent } from 'react';
|
|
5
|
+
import throttle from 'lodash.throttle';
|
|
6
|
+
import Log from '@deephaven/log';
|
|
7
|
+
var log = Log.module('TreeTableViewportUpdater');
|
|
8
|
+
var UPDATE_THROTTLE = 150;
|
|
9
|
+
/**
|
|
10
|
+
* Updates the viewport of a TreeTable for use in a scroll pane.
|
|
11
|
+
* Automatically throttles the viewport requests and buffers above and below.
|
|
12
|
+
*/
|
|
13
|
+
class TreeTableViewportUpdater extends PureComponent {
|
|
14
|
+
constructor(props) {
|
|
15
|
+
super(props);
|
|
16
|
+
_defineProperty(this, "listenerCleanup", void 0);
|
|
17
|
+
_defineProperty(this, "updateViewport", throttle((top, bottom) => {
|
|
18
|
+
if (bottom < top) {
|
|
19
|
+
log.error('Invalid viewport', top, bottom);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (top === 0 && bottom === 0) {
|
|
23
|
+
log.debug2('Ignoring 0-0 viewport');
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
var {
|
|
27
|
+
table,
|
|
28
|
+
updateInterval
|
|
29
|
+
} = this.props;
|
|
30
|
+
var viewSize = bottom - top;
|
|
31
|
+
var viewportTop = Math.max(0, top - viewSize * 3);
|
|
32
|
+
var viewportBottom = bottom + viewSize * 3 + 1;
|
|
33
|
+
log.debug2('Setting Viewport Top:', viewportTop, 'Bottom:', viewportBottom, table);
|
|
34
|
+
if (!this.listenerCleanup) {
|
|
35
|
+
var {
|
|
36
|
+
dh,
|
|
37
|
+
onViewportUpdate
|
|
38
|
+
} = this.props;
|
|
39
|
+
this.listenerCleanup = table.addEventListener(dh.TreeTable.EVENT_UPDATED, onViewportUpdate);
|
|
40
|
+
}
|
|
41
|
+
table.setViewport(viewportTop, viewportBottom, undefined, updateInterval);
|
|
42
|
+
}, UPDATE_THROTTLE));
|
|
43
|
+
this.listenerCleanup = null;
|
|
44
|
+
}
|
|
45
|
+
componentDidMount() {
|
|
46
|
+
var {
|
|
47
|
+
top,
|
|
48
|
+
bottom,
|
|
49
|
+
table,
|
|
50
|
+
filters,
|
|
51
|
+
sorts
|
|
52
|
+
} = this.props;
|
|
53
|
+
log.debug('componentDidMount', this.props);
|
|
54
|
+
table.applyFilter(filters);
|
|
55
|
+
table.applySort(sorts);
|
|
56
|
+
this.updateViewport(top, bottom);
|
|
57
|
+
}
|
|
58
|
+
componentDidUpdate(prevProps) {
|
|
59
|
+
var {
|
|
60
|
+
top,
|
|
61
|
+
bottom,
|
|
62
|
+
table,
|
|
63
|
+
filters,
|
|
64
|
+
sorts
|
|
65
|
+
} = this.props;
|
|
66
|
+
if (filters !== prevProps.filters) {
|
|
67
|
+
log.debug('update table filter', filters);
|
|
68
|
+
table.applyFilter(filters);
|
|
69
|
+
}
|
|
70
|
+
if (sorts !== prevProps.sorts) {
|
|
71
|
+
log.debug('update table sort', sorts);
|
|
72
|
+
table.applySort(sorts);
|
|
73
|
+
}
|
|
74
|
+
this.updateViewport(top, bottom);
|
|
75
|
+
}
|
|
76
|
+
componentWillUnmount() {
|
|
77
|
+
this.updateViewport.cancel();
|
|
78
|
+
if (this.listenerCleanup) {
|
|
79
|
+
this.listenerCleanup();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
render() {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
_defineProperty(TreeTableViewportUpdater, "UPDATE_INTERVAL", 1000);
|
|
87
|
+
_defineProperty(TreeTableViewportUpdater, "defaultProps", {
|
|
88
|
+
top: 0,
|
|
89
|
+
bottom: 0,
|
|
90
|
+
onViewportUpdate: () => undefined,
|
|
91
|
+
filters: [],
|
|
92
|
+
sorts: [],
|
|
93
|
+
updateInterval: TreeTableViewportUpdater.UPDATE_INTERVAL
|
|
94
|
+
});
|
|
95
|
+
export default TreeTableViewportUpdater;
|
|
96
|
+
//# sourceMappingURL=TreeTableViewportUpdater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TreeTableViewportUpdater.js","names":["PureComponent","throttle","Log","log","module","UPDATE_THROTTLE","TreeTableViewportUpdater","constructor","props","top","bottom","error","debug2","table","updateInterval","viewSize","viewportTop","Math","max","viewportBottom","listenerCleanup","dh","onViewportUpdate","addEventListener","TreeTable","EVENT_UPDATED","setViewport","undefined","componentDidMount","filters","sorts","debug","applyFilter","applySort","updateViewport","componentDidUpdate","prevProps","componentWillUnmount","cancel","render","UPDATE_INTERVAL"],"sources":["../src/TreeTableViewportUpdater.tsx"],"sourcesContent":["import { PureComponent } from 'react';\nimport throttle from 'lodash.throttle';\nimport type {\n dh as DhType,\n EventListener,\n FilterCondition,\n RemoverFn,\n Sort,\n Table,\n} from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\n\nconst log = Log.module('TreeTableViewportUpdater');\n\nconst UPDATE_THROTTLE = 150;\n\ninterface TreeTableViewportUpdaterProps {\n dh: DhType;\n table: Table;\n top: number;\n bottom: number;\n filters: FilterCondition[];\n sorts: Sort[];\n updateInterval: number;\n onViewportUpdate: EventListener;\n}\n\n/**\n * Updates the viewport of a TreeTable for use in a scroll pane.\n * Automatically throttles the viewport requests and buffers above and below.\n */\nclass TreeTableViewportUpdater extends PureComponent<\n TreeTableViewportUpdaterProps,\n Record<string, never>\n> {\n static UPDATE_INTERVAL = 1000;\n\n static defaultProps = {\n top: 0,\n bottom: 0,\n onViewportUpdate: (): void => undefined,\n filters: [],\n sorts: [],\n updateInterval: TreeTableViewportUpdater.UPDATE_INTERVAL,\n };\n\n constructor(props: TreeTableViewportUpdaterProps) {\n super(props);\n\n this.listenerCleanup = null;\n }\n\n componentDidMount(): void {\n const { top, bottom, table, filters, sorts } = this.props;\n log.debug('componentDidMount', this.props);\n table.applyFilter(filters);\n table.applySort(sorts);\n this.updateViewport(top, bottom);\n }\n\n componentDidUpdate(prevProps: TreeTableViewportUpdaterProps): void {\n const { top, bottom, table, filters, sorts } = this.props;\n if (filters !== prevProps.filters) {\n log.debug('update table filter', filters);\n table.applyFilter(filters);\n }\n\n if (sorts !== prevProps.sorts) {\n log.debug('update table sort', sorts);\n table.applySort(sorts);\n }\n\n this.updateViewport(top, bottom);\n }\n\n componentWillUnmount(): void {\n this.updateViewport.cancel();\n if (this.listenerCleanup) {\n this.listenerCleanup();\n }\n }\n\n listenerCleanup: RemoverFn | null;\n\n updateViewport = throttle((top: number, bottom: number): void => {\n if (bottom < top) {\n log.error('Invalid viewport', top, bottom);\n return;\n }\n\n if (top === 0 && bottom === 0) {\n log.debug2('Ignoring 0-0 viewport');\n return;\n }\n\n const { table, updateInterval } = this.props;\n const viewSize = bottom - top;\n const viewportTop = Math.max(0, top - viewSize * 3);\n const viewportBottom = bottom + viewSize * 3 + 1;\n log.debug2(\n 'Setting Viewport Top:',\n viewportTop,\n 'Bottom:',\n viewportBottom,\n table\n );\n\n if (!this.listenerCleanup) {\n const { dh, onViewportUpdate } = this.props;\n this.listenerCleanup = table.addEventListener(\n dh.TreeTable.EVENT_UPDATED,\n onViewportUpdate\n );\n }\n\n table.setViewport(viewportTop, viewportBottom, undefined, updateInterval);\n }, UPDATE_THROTTLE);\n\n render(): null {\n return null;\n }\n}\n\nexport default TreeTableViewportUpdater;\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declaration.d.js","names":[],"sources":["../src/declaration.d.ts"],"sourcesContent":["declare module '*.module.scss' {\n const content: Record<string, string>;\n export default content;\n}\n\ndeclare module '*.scss';\n"],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/* stylelint-disable scss/at-import-no-partial-leading-underscore */
|
|
2
|
+
.custom-format-title {
|
|
3
|
+
margin-bottom: 0;
|
|
4
|
+
border: none;
|
|
5
|
+
display: flex;
|
|
6
|
+
width: 100%;
|
|
7
|
+
padding: 0.375rem 0.75rem;
|
|
8
|
+
white-space: nowrap;
|
|
9
|
+
text-decoration: none;
|
|
10
|
+
background-color: transparent;
|
|
11
|
+
text-align: left;
|
|
12
|
+
cursor: pointer;
|
|
13
|
+
user-select: none;
|
|
14
|
+
}
|
|
15
|
+
.custom-format-title .icon {
|
|
16
|
+
flex-grow: 0;
|
|
17
|
+
margin-right: 0.5rem;
|
|
18
|
+
width: 1rem;
|
|
19
|
+
text-align: center;
|
|
20
|
+
}
|
|
21
|
+
.custom-format-title .title {
|
|
22
|
+
flex-grow: 1;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/*# sourceMappingURL=CustomFormatAction.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../../../../node_modules/@deephaven/components/scss/custom.scss","../../src/format-context-menus/CustomFormatAction.scss"],"names":[],"mappings":"AAAA;ACEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE","file":"CustomFormatAction.css","sourcesContent":["/* stylelint-disable scss/at-import-no-partial-leading-underscore */\n// Consumers should be able to resolve bootstrap/ to node_modules/bootstrap\n\n//Make bootstrap functions available for use in overrides\n@import 'bootstrap/scss/_functions.scss';\n@import './bootstrap_overrides.scss';\n\n//_variable imports come after bootstrap default overrides,\n// makes all other variables and mixins from bootstrap available\n/// with just importing customer.scss\n@import 'bootstrap/scss/_variables.scss';\n@import 'bootstrap/scss/_mixins.scss';\n\n//New variables come after imports\n@import './new_variables.scss';\n","@import '@deephaven/components/scss/custom.scss';\n\n.custom-format-title {\n margin-bottom: 0;\n border: none;\n display: flex;\n width: 100%;\n padding: $input-btn-padding-y $input-btn-padding-x;\n white-space: nowrap;\n text-decoration: none;\n background-color: transparent;\n text-align: left;\n cursor: pointer;\n user-select: none;\n\n .icon {\n flex-grow: 0;\n margin-right: 0.5rem;\n width: 1rem;\n text-align: center;\n }\n\n .title {\n flex-grow: 1;\n }\n}\n"]}
|