diff --git a/packages/iris-grid/src/IrisGridPartitionSelector.tsx b/packages/iris-grid/src/IrisGridPartitionSelector.tsx index 963c08afc..e08d8dfb8 100644 --- a/packages/iris-grid/src/IrisGridPartitionSelector.tsx +++ b/packages/iris-grid/src/IrisGridPartitionSelector.tsx @@ -6,7 +6,7 @@ import { vsChevronRight, vsMerge, vsKey } from '@deephaven/icons'; import Log from '@deephaven/log'; import { Picker } from '@deephaven/jsapi-components'; import type { dh } from '@deephaven/jsapi-types'; -import { TableUtils } from '@deephaven/jsapi-utils'; +import { FilterConditionFactory, TableUtils } from '@deephaven/jsapi-utils'; import { assertNotNull, Pending, PromiseUtils } from '@deephaven/utils'; import './IrisGridPartitionSelector.scss'; import { PartitionConfig, PartitionedGridModel } from './PartitionedGridModel'; @@ -26,7 +26,7 @@ interface IrisGridPartitionSelectorState { partitionTables: dh.Table[] | null; /** The filters to apply to each partition table */ - partitionFilters: dh.FilterCondition[][] | null; + partitionFilters: FilterConditionFactory[][] | null; } class IrisGridPartitionSelector extends Component< IrisGridPartitionSelectorProps, @@ -145,19 +145,13 @@ class IrisGridPartitionSelector extends Component< index: number, selectedValue: unknown ): Promise { - const { model, partitionConfig: prevConfig } = this.props; + const { partitionConfig: prevConfig } = this.props; log.debug('handlePartitionSelect', index, selectedValue, prevConfig); const newPartitions = [...prevConfig.partitions]; newPartitions[index] = selectedValue; - // If it's the last partition changed, we know it's already a valid value, just emit it - if (index === model.partitionColumns.length - 1) { - this.sendUpdate({ partitions: newPartitions, mode: 'partition' }); - return; - } - const { keysTable } = this.state; // Otherwise, we need to get the value from a filtered key table assertNotNull(keysTable); @@ -184,7 +178,7 @@ class IrisGridPartitionSelector extends Component< // Core JSAPI returns undefined for null table values, // coalesce with null to differentiate null from no selection in the dropdown // https://github.com/deephaven/deephaven-core/issues/5400 - partitions: t.columns.map(column => data.rows[0].get(column) ?? null), + partitions: t.columns.map(column => data.rows[0].get(column)), mode: 'partition', }; t.close(); @@ -247,10 +241,11 @@ class IrisGridPartitionSelector extends Component< this.setState({ partitionFilters }); } - getPartitionFilters(partitionTables: dh.Table[]): dh.FilterCondition[][] { + getPartitionFilters(partitionTables: dh.Table[]): FilterConditionFactory[][] { const { model, partitionConfig } = this.props; const { partitions } = partitionConfig; log.debug('getPartitionFilters', partitionConfig); + console.log('getPartitionFilters', partitionConfig); if (partitions.length !== partitionTables.length) { throw new Error( @@ -259,7 +254,7 @@ class IrisGridPartitionSelector extends Component< } // The filters are applied in order, so we need to build up the filters for each partition - const partitionFilters: dh.FilterCondition[][] = []; + const partitionFilters: FilterConditionFactory[][] = []; for (let i = 0; i < partitions.length; i += 1) { if (i === 0) { // There's no reason to ever filter the first table @@ -270,10 +265,23 @@ class IrisGridPartitionSelector extends Component< const previousColumn = model.partitionColumns[i - 1]; const partitionFilter = [ ...previousFilter, - this.tableUtils.makeNullableEqFilter( - previousColumn, - previousPartition - ), + (table: dh.Table | dh.TreeTable | null | undefined) => { + if (table == null) { + return null; + } + const filterConditionTest = this.tableUtils.makeNullableEqFilter( + table.findColumn(previousColumn.name), + // previousColumn, + previousPartition + ); + console.log( + 'tester', + previousColumn, + previousPartition, + filterConditionTest + ); + return filterConditionTest; + }, ]; partitionFilters.push(partitionFilter); } @@ -296,11 +304,13 @@ class IrisGridPartitionSelector extends Component< const { partitions } = partitionConfig; - if (partitionFilters !== null && partitionTables !== null) { - partitionFilters.forEach((filter, index) => { - partitionTables[index].applyFilter(filter as dh.FilterCondition[]); - }); - } + // if (partitionFilters !== null && partitionTables !== null) { + // partitionFilters.forEach((filter, index) => { + // partitionTables[index].applyFilter(filter as dh.FilterCondition[]); + // // setting the viewport 0,50 + // }); + // } + console.log(partitionTables, 'partition table'); const partitionSelectors = model.partitionColumns.map((column, index) => (
{partitionTables?.[index] && ( @@ -318,6 +328,7 @@ class IrisGridPartitionSelector extends Component< isDisabled={ (index > 0 && partitionConfig.mode !== 'partition') || isLoading } + additionalFilterFactories={partitionFilters?.[index]} /> )} {model.partitionColumns.length - 1 === index || ( diff --git a/packages/jsapi-components/src/spectrum/PickerProps.ts b/packages/jsapi-components/src/spectrum/PickerProps.ts index 7112e3646..7252c0acf 100644 --- a/packages/jsapi-components/src/spectrum/PickerProps.ts +++ b/packages/jsapi-components/src/spectrum/PickerProps.ts @@ -4,7 +4,7 @@ import { SpectrumPickerProps, } from '@deephaven/components'; import { dh as DhType } from '@deephaven/jsapi-types'; -import { Settings } from '@deephaven/jsapi-utils'; +import { FilterConditionFactory, Settings } from '@deephaven/jsapi-utils'; export type PickerWithTableProps = Omit< PickerPropsT, @@ -20,6 +20,8 @@ export type PickerWithTableProps = Omit< iconColumn?: string; settings?: Settings; + + additionalFilterFactories?: FilterConditionFactory[]; }; export type PickerProps = PickerWithTableProps< diff --git a/packages/jsapi-components/src/spectrum/utils/usePickerProps.ts b/packages/jsapi-components/src/spectrum/utils/usePickerProps.ts index 14b657a15..557d4036a 100644 --- a/packages/jsapi-components/src/spectrum/utils/usePickerProps.ts +++ b/packages/jsapi-components/src/spectrum/utils/usePickerProps.ts @@ -40,6 +40,7 @@ export type UsePickerPassthroughProps = Omit< | 'labelColumn' | 'iconColumn' | 'settings' + | 'additionalFilterFactories' | 'onChange' | 'onSelectionChange' >; @@ -53,6 +54,7 @@ export function usePickerProps({ keyColumn: keyColumnName, labelColumn: labelColumnName, iconColumn: iconColumnName, + additionalFilterFactories, settings, onChange, onSelectionChange, @@ -74,9 +76,18 @@ export function usePickerProps({ // applied in `useSearchableViewportData`.) const { data: tableCopy } = usePromiseFactory( TableUtils.copyTableAndApplyFilters, - [tableSource] + [tableSource, ...(additionalFilterFactories ?? [])] ); + useEffect(() => { + console.log( + '[TESTING] additionalFilters', + additionalFilterFactories, + tableCopy?.columns, + tableCopy?.size + ); + }, [additionalFilterFactories, tableCopy]); + const keyColumn = useMemo( () => tableCopy == null ? null : getItemKeyColumn(tableCopy, keyColumnName),