diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-core/src/query/types/Filter.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-core/src/query/types/Filter.ts index 8d800c4ff7c0b..8fd26fab5e9fb 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-core/src/query/types/Filter.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-core/src/query/types/Filter.ts @@ -6,11 +6,14 @@ import { isBinaryOperator, isSetOperator, } from './Operator'; +import { TimeGranularity } from '../../time-format'; interface BaseSimpleAdhocFilter { expressionType: 'SIMPLE'; clause: 'WHERE' | 'HAVING'; subject: string; + timeGrain?: TimeGranularity; + isExtra?: boolean; } export type UnaryAdhocFilter = BaseSimpleAdhocFilter & { diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-core/src/query/types/Query.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-core/src/query/types/Query.ts index a6bf9dee4d0c3..ada5627c2ee84 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-core/src/query/types/Query.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-core/src/query/types/Query.ts @@ -29,6 +29,8 @@ import { TimeGranularity } from '../../time-format'; export type QueryObjectFilterClause = { col: string; + grain?: TimeGranularity; + isExtra?: boolean; } & ( | { op: BinaryOperator; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/plugin-chart-table/src/TableChart.tsx b/superset-frontend/temporary_superset_ui/superset-ui/plugins/plugin-chart-table/src/TableChart.tsx index cae47e7bdb2d1..6387d7584cabc 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/plugin-chart-table/src/TableChart.tsx +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/plugin-chart-table/src/TableChart.tsx @@ -22,7 +22,16 @@ import { extent as d3Extent, max as d3Max } from 'd3-array'; import { FaSort } from '@react-icons/all-files/fa/FaSort'; import { FaSortDown as FaSortDesc } from '@react-icons/all-files/fa/FaSortDown'; import { FaSortUp as FaSortAsc } from '@react-icons/all-files/fa/FaSortUp'; -import { DataRecord, DataRecordValue, GenericDataType, t, tn } from '@superset-ui/core'; +import { + DataRecord, + DataRecordValue, + DTTM_ALIAS, + ensureIsArray, + GenericDataType, + getTimeFormatterForGranularity, + t, + tn, +} from '@superset-ui/core'; import { DataColumnMeta, TableChartTransformedProps } from './types'; import DataTable, { @@ -146,6 +155,7 @@ export default function TableChart( }, ) { const { + timeGrain, height, width, data, @@ -167,6 +177,10 @@ export default function TableChart( sticky = true, // whether to use sticky header columnColorFormatters, } = props; + const timestampFormatter = useCallback( + value => getTimeFormatterForGranularity(timeGrain)(value), + [timeGrain], + ); const handleChange = useCallback( (filters: { [x: string]: DataRecordValue[] }) => { @@ -176,14 +190,25 @@ export default function TableChart( const groupBy = Object.keys(filters); const groupByValues = Object.values(filters); + const labelElements: string[] = []; + groupBy.forEach(col => { + const isTimestamp = col === DTTM_ALIAS; + const filterValues = ensureIsArray(filters?.[col]); + if (filterValues.length) { + const valueLabels = filterValues.map(value => + isTimestamp ? timestampFormatter(value) : value, + ); + labelElements.push(`${valueLabels.join(', ')}`); + } + }); setDataMask({ extraFormData: { filters: groupBy.length === 0 ? [] : groupBy.map(col => { - const val = filters?.[col]; - if (val === null || val === undefined) + const val = ensureIsArray(filters?.[col]); + if (!val.length) return { col, op: 'IS NULL', @@ -191,11 +216,13 @@ export default function TableChart( return { col, op: 'IN', - val: val as (string | number | boolean)[], + val: val.map(el => (el instanceof Date ? el.getTime() : el!)), + grain: col === DTTM_ALIAS ? timeGrain : undefined, }; }), }, filterState: { + label: labelElements.join(', '), value: groupByValues.length ? groupByValues : null, filters: filters && Object.keys(filters).length ? filters : null, }, diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/plugin-chart-table/src/transformProps.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/plugin-chart-table/src/transformProps.ts index 8c6381b17c9e3..48bebf1c0c26d 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/plugin-chart-table/src/transformProps.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/plugin-chart-table/src/transformProps.ts @@ -206,6 +206,7 @@ const transformProps = (chartProps: TableChartProps): TableChartTransformedProps show_totals: showTotals, conditional_formatting: conditionalFormatting, } = formData; + const timeGrain = extractTimegrain(formData); const [metrics, percentMetrics, columns] = processColumns(chartProps); @@ -249,6 +250,7 @@ const transformProps = (chartProps: TableChartProps): TableChartTransformedProps emitFilter, onChangeFilter, columnColorFormatters, + timeGrain, }; }; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/plugin-chart-table/src/types.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/plugin-chart-table/src/types.ts index 9b4a38df51f2b..e95f55441edf1 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/plugin-chart-table/src/types.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/plugin-chart-table/src/types.ts @@ -83,6 +83,7 @@ export interface TableChartProps extends ChartProps { } export interface TableChartTransformedProps { + timeGrain?: TimeGranularity; height: number; width: number; rowCount?: number; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/plugins/plugin-chart-table/src/utils/DateWithFormatter.ts b/superset-frontend/temporary_superset_ui/superset-ui/plugins/plugin-chart-table/src/utils/DateWithFormatter.ts index a227e0c458a7f..03003ba5e5920 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/plugins/plugin-chart-table/src/utils/DateWithFormatter.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/plugins/plugin-chart-table/src/utils/DateWithFormatter.ts @@ -31,7 +31,10 @@ export default class DateWithFormatter extends Date { constructor( input: DataRecordValue, - { formatter = String, forceUTC = true }: { formatter?: TimeFormatFunction; forceUTC?: boolean }, + { + formatter = String, + forceUTC = true, + }: { formatter?: TimeFormatFunction; forceUTC?: boolean } = {}, ) { let value = input; // assuming timestamps without a timezone is in UTC time