Skip to content

Commit 1ab4b9d

Browse files
authored
chore: Fix circular dependency in tanstack-table.d.ts (calcom#25411)
* chore: Fix circular dependency in tanstack-table.d.ts * fix: Re-export TextFilterOperator * Unable to export non-type values from @calcom/types * Refactor data-table types in a way that ensures type-safety as before * Add FilterPopover and further fixups * Fix further type errors missed earlier * More hidden type errors * Type error in useFilterValue
1 parent f3d0475 commit 1ab4b9d

17 files changed

Lines changed: 140 additions & 110 deletions

apps/web/modules/insights/insights-view.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
ColumnFilterType,
1111
type FilterableColumn,
1212
} from "@calcom/features/data-table";
13+
import type { FilterType } from "@calcom/types/data-table";
1314
import { useDataTable } from "@calcom/features/data-table/hooks/useDataTable";
1415
import { useSegments } from "@calcom/features/data-table/hooks/useSegments";
1516
import {
@@ -53,13 +54,13 @@ export default function InsightsPage({ timeZone }: { timeZone: string }) {
5354
);
5455
}
5556

56-
const createdAtColumn: Extract<FilterableColumn, { type: ColumnFilterType.DATE_RANGE }> = {
57+
const createdAtColumn: Extract<FilterableColumn, { type: Extract<FilterType, "dr"> }> = {
5758
id: "createdAt",
5859
title: "createdAt",
5960
type: ColumnFilterType.DATE_RANGE,
6061
};
6162

62-
const startTimeColumn: Extract<FilterableColumn, { type: ColumnFilterType.DATE_RANGE }> = {
63+
const startTimeColumn: Extract<FilterableColumn, { type: Extract<FilterType, "dr"> }> = {
6364
id: "startTime",
6465
title: "startTime",
6566
type: ColumnFilterType.DATE_RANGE,

packages/features/data-table/components/filters/BaseSelectFilterOptions.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,26 +18,26 @@ import { Icon } from "@calcom/ui/components/icon";
1818

1919
import { useDataTable, useFilterValue } from "../../hooks";
2020
import type {
21-
ColumnFilterType,
2221
FacetedValue,
2322
FilterableColumn as _FilterableColumn,
2423
FilterValueSchema,
2524
} from "../../lib/types";
25+
import type { FilterType } from "@calcom/types/data-table";
2626

2727
type FilterableColumn = Extract<
2828
_FilterableColumn,
29-
{ type: ColumnFilterType.MULTI_SELECT | ColumnFilterType.SINGLE_SELECT }
29+
{ type: Extract<FilterType, "ms" | "ss"> }
3030
>;
3131

32-
type FilterableSelectColumn<T extends ColumnFilterType.MULTI_SELECT | ColumnFilterType.SINGLE_SELECT> =
32+
type FilterableSelectColumn<T extends Extract<FilterType, "ms" | "ss">> =
3333
Extract<FilterableColumn, { type: T }>;
3434

35-
type FilterValue<T extends ColumnFilterType.MULTI_SELECT | ColumnFilterType.SINGLE_SELECT> = ReturnType<
35+
type FilterValue<T extends Extract<FilterType, "ms" | "ss">> = ReturnType<
3636
typeof useFilterValue<T, FilterValueSchema<T>>
3737
>;
3838

3939
export type BaseSelectFilterOptionsProps<
40-
T extends ColumnFilterType.MULTI_SELECT | ColumnFilterType.SINGLE_SELECT
40+
T extends Extract<FilterType, "ms" | "ss">
4141
> = {
4242
column: FilterableSelectColumn<T>;
4343
filterValueSchema: FilterValueSchema<T>;
@@ -88,7 +88,7 @@ function getSectionedOptions(options: FacetedValue[]) {
8888
}
8989

9090
export function BaseSelectFilterOptions<
91-
T extends ColumnFilterType.MULTI_SELECT | ColumnFilterType.SINGLE_SELECT
91+
T extends Extract<FilterType, "ms" | "ss">
9292
>({
9393
column,
9494
filterValueSchema,

packages/features/data-table/components/filters/DateRangeFilter.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,11 @@ import {
3333
import { preserveLocalTime } from "../../lib/preserveLocalTime";
3434
import type { FilterableColumn, DateRangeFilterOptions } from "../../lib/types";
3535
import { ZDateRangeFilterValue, ColumnFilterType } from "../../lib/types";
36+
import type { FilterType } from "@calcom/types/data-table";
3637
import { useFilterPopoverOpen } from "./useFilterPopoverOpen";
3738

3839
type DateRangeFilterProps = {
39-
column: Extract<FilterableColumn, { type: ColumnFilterType.DATE_RANGE }>;
40+
column: Extract<FilterableColumn, { type: Extract<FilterType, "dr"> }>;
4041
options?: DateRangeFilterOptions;
4142
showColumnName?: boolean;
4243
showClearButton?: boolean;

packages/features/data-table/components/filters/FilterPopover.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
// eslint-disable-next-line no-restricted-imports
1+
22
import startCase from "lodash/startCase";
33

4+
import type { FilterType } from "@calcom/types/data-table";
45
import { Badge } from "@calcom/ui/components/badge";
56
import { Button } from "@calcom/ui/components/button";
67
import type { IconName } from "@calcom/ui/components/icon";
@@ -18,7 +19,7 @@ import { FilterOptions } from "./FilterOptions";
1819
import { useFilterPopoverOpen } from "./useFilterPopoverOpen";
1920
import { numberFilterOperatorOptions, useTextFilterOperatorOptions } from "./utils";
2021

21-
const FILTER_ICONS: Record<ColumnFilterType, IconName> = {
22+
const FILTER_ICONS: Record<FilterType, IconName> = {
2223
[ColumnFilterType.TEXT]: "file-text",
2324
[ColumnFilterType.NUMBER]: "binary",
2425
[ColumnFilterType.MULTI_SELECT]: "layers",
@@ -84,11 +85,11 @@ function AppliedSelectFilterValue({ column, filterValue }: SelectedLabelsProps)
8485
let moreCount = 0;
8586

8687
if (isSingleSelectFilterValue(filterValue)) {
87-
const options = (column as Extract<FilterableColumn, { type: ColumnFilterType.SINGLE_SELECT }>).options;
88+
const options = (column as FilterableColumn & { type: "ss" }).options;
8889
text = options.find((opt) => opt.value === filterValue.data)?.label;
8990
moreCount = 0;
9091
} else if (isMultiSelectFilterValue(filterValue)) {
91-
const options = (column as Extract<FilterableColumn, { type: ColumnFilterType.MULTI_SELECT }>).options;
92+
const options = (column as FilterableColumn & { type: "ms" }).options;
9293
text = options.find((opt) => opt.value === filterValue.data[0])?.label;
9394
moreCount = filterValue.data.length - 1;
9495
}

packages/features/data-table/components/filters/MultiSelectFilterOptions.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,18 @@
33
import { useDataTable } from "../../hooks";
44
import type { FilterableColumn } from "../../lib/types";
55
import { ZMultiSelectFilterValue, ColumnFilterType } from "../../lib/types";
6+
import type { FilterType } from "@calcom/types/data-table";
67
import { BaseSelectFilterOptions } from "./BaseSelectFilterOptions";
78

89
export type MultiSelectFilterOptionsProps = {
9-
column: Extract<FilterableColumn, { type: ColumnFilterType.MULTI_SELECT }>;
10+
column: Extract<FilterableColumn, { type: Extract<FilterType, "ms"> }>;
1011
};
1112

1213
export function MultiSelectFilterOptions({ column }: MultiSelectFilterOptionsProps) {
1314
const { updateFilter } = useDataTable();
1415

1516
return (
16-
<BaseSelectFilterOptions<ColumnFilterType.MULTI_SELECT>
17+
<BaseSelectFilterOptions<Extract<FilterType, "ms">>
1718
column={column}
1819
filterValueSchema={ZMultiSelectFilterValue}
1920
testIdPrefix="select-filter-options"

packages/features/data-table/components/filters/NumberFilterOptions.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ import { Form, Select, NumberInput } from "@calcom/ui/components/form";
99
import { useFilterValue, useDataTable } from "../../hooks";
1010
import type { FilterableColumn } from "../../lib/types";
1111
import { ZNumberFilterValue, ColumnFilterType } from "../../lib/types";
12+
import type { FilterType } from "@calcom/types/data-table";
1213
import { numberFilterOperatorOptions } from "./utils";
1314

1415
export type NumberFilterOptionsProps = {
15-
column: Extract<FilterableColumn, { type: ColumnFilterType.NUMBER }>;
16+
column: Extract<FilterableColumn, { type: Extract<FilterType, "n"> }>;
1617
};
1718

1819
export function NumberFilterOptions({ column }: NumberFilterOptionsProps) {

packages/features/data-table/components/filters/SingleSelectFilterOptions.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
"use client";
22

3+
import type { FilterType } from "@calcom/types/data-table";
4+
35
import { useDataTable } from "../../hooks";
46
import type { FilterableColumn } from "../../lib/types";
57
import { ZSingleSelectFilterValue, ColumnFilterType } from "../../lib/types";
68
import { BaseSelectFilterOptions } from "./BaseSelectFilterOptions";
79

810
export type SingleSelectFilterOptionsProps = {
9-
column: Extract<FilterableColumn, { type: ColumnFilterType.SINGLE_SELECT }>;
11+
column: Extract<FilterableColumn, { type: Extract<FilterType, "ss"> }>;
1012
};
1113

1214
export function SingleSelectFilterOptions({ column }: SingleSelectFilterOptionsProps) {
1315
const { updateFilter } = useDataTable();
1416

1517
return (
16-
<BaseSelectFilterOptions<ColumnFilterType.SINGLE_SELECT>
18+
<BaseSelectFilterOptions<Extract<FilterType, "ss">>
1719
column={column}
1820
filterValueSchema={ZSingleSelectFilterValue}
1921
testIdPrefix="select-filter-options"

packages/features/data-table/components/filters/TextFilterOptions.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ import { Form, Select, Input } from "@calcom/ui/components/form";
99
import { useFilterValue, useDataTable } from "../../hooks";
1010
import type { FilterableColumn } from "../../lib/types";
1111
import { ZTextFilterValue, ColumnFilterType } from "../../lib/types";
12+
import type { FilterType } from "@calcom/types/data-table";
1213
import { useTextFilterOperatorOptions } from "./utils";
1314

1415
export type TextFilterOptionsProps = {
15-
column: Extract<FilterableColumn, { type: ColumnFilterType.TEXT }>;
16+
column: Extract<FilterableColumn, { type: Extract<FilterType, "t"> }>;
1617
};
1718

1819
export function TextFilterOptions({ column }: TextFilterOptionsProps) {

packages/features/data-table/hooks/useFilterValue.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { useMemo } from "react";
22
import type { z } from "zod";
33

4-
import type { FilterValueSchema, ColumnFilterType, ZFilterValue } from "../lib/types";
4+
import type { FilterValueSchema, ZFilterValue } from "../lib/types";
5+
import type { FilterType } from "@calcom/types/data-table";
56
import { useDataTable } from "./useDataTable";
67

78
export function useFilterValue<
8-
T extends ColumnFilterType,
9+
T extends FilterType,
910
TSchema extends FilterValueSchema<T> | typeof ZFilterValue
1011
>(columnId: string, schema: TSchema) {
1112
const { activeFilters } = useDataTable();

packages/features/data-table/lib/types.ts

Lines changed: 30 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
11
import type { SortingState, ColumnSort } from "@tanstack/react-table";
22
import { z } from "zod";
33

4-
import type { IconName } from "@calcom/ui/components/icon";
4+
import type { TextFilterOperator, FilterType } from "@calcom/types/data-table";
5+
export type { ColumnFilterMeta, FilterableColumn } from "@calcom/types/data-table";
6+
7+
const ColumnFilterType = {
8+
SINGLE_SELECT: "ss",
9+
MULTI_SELECT: "ms",
10+
TEXT: "t",
11+
NUMBER: "n",
12+
DATE_RANGE: "dr",
13+
} as const satisfies Record<string, FilterType>;
14+
15+
type ColumnFilterTypeValues = typeof ColumnFilterType;
516

617
export type { SortingState } from "@tanstack/react-table";
718

819
export const SYSTEM_SEGMENT_PREFIX = "system_";
920

10-
export enum ColumnFilterType {
11-
SINGLE_SELECT = "ss",
12-
MULTI_SELECT = "ms",
13-
TEXT = "t",
14-
NUMBER = "n",
15-
DATE_RANGE = "dr",
16-
}
21+
export { ColumnFilterType, TextFilterOperator };
1722

1823
export const textFilterOperators = [
1924
"equals",
@@ -26,12 +31,10 @@ export const textFilterOperators = [
2631
"isNotEmpty",
2732
] as const;
2833

29-
export type TextFilterOperator = (typeof textFilterOperators)[number];
30-
3134
export const ZTextFilterOperator = z.enum(textFilterOperators);
3235

3336
export type SingleSelectFilterValue = {
34-
type: ColumnFilterType.SINGLE_SELECT;
37+
type: ColumnFilterTypeValues["SINGLE_SELECT"];
3538
data: string | number;
3639
};
3740

@@ -41,7 +44,7 @@ export const ZSingleSelectFilterValue = z.object({
4144
}) satisfies z.ZodType<SingleSelectFilterValue>;
4245

4346
export type MultiSelectFilterValue = {
44-
type: ColumnFilterType.MULTI_SELECT;
47+
type: ColumnFilterTypeValues["MULTI_SELECT"];
4548
data: Array<string | number>;
4649
};
4750

@@ -51,7 +54,7 @@ export const ZMultiSelectFilterValue = z.object({
5154
}) satisfies z.ZodType<MultiSelectFilterValue>;
5255

5356
export type TextFilterValue = {
54-
type: ColumnFilterType.TEXT;
57+
type: ColumnFilterTypeValues["TEXT"];
5558
data: {
5659
operator: TextFilterOperator;
5760
operand: string;
@@ -73,7 +76,7 @@ export type NumberFilterOperator = (typeof numberFilterOperators)[number];
7376
export const ZNumberFilterOperator = z.enum(numberFilterOperators);
7477

7578
export type NumberFilterValue = {
76-
type: ColumnFilterType.NUMBER;
79+
type: ColumnFilterTypeValues["NUMBER"];
7780
data: {
7881
operator: NumberFilterOperator;
7982
operand: number;
@@ -89,7 +92,7 @@ export const ZNumberFilterValue = z.object({
8992
}) satisfies z.ZodType<NumberFilterValue>;
9093

9194
export type DateRangeFilterValue = {
92-
type: ColumnFilterType.DATE_RANGE;
95+
type: ColumnFilterTypeValues["DATE_RANGE"];
9396
data: {
9497
startDate: string | null;
9598
endDate: string | null;
@@ -124,48 +127,6 @@ export type TextFilterOptions = {
124127
placeholder?: string;
125128
};
126129

127-
export type ColumnFilterMeta =
128-
| {
129-
type: ColumnFilterType.DATE_RANGE;
130-
icon?: IconName;
131-
dateRangeOptions?: DateRangeFilterOptions;
132-
}
133-
| {
134-
type: ColumnFilterType.TEXT;
135-
icon?: IconName;
136-
textOptions?: TextFilterOptions;
137-
}
138-
| {
139-
type?: Exclude<ColumnFilterType, ColumnFilterType.DATE_RANGE | ColumnFilterType.TEXT>;
140-
icon?: IconName;
141-
};
142-
143-
export type FilterableColumn = {
144-
id: string;
145-
title: string;
146-
icon?: IconName;
147-
} & (
148-
| {
149-
type: ColumnFilterType.SINGLE_SELECT;
150-
options: FacetedValue[];
151-
}
152-
| {
153-
type: ColumnFilterType.MULTI_SELECT;
154-
options: FacetedValue[];
155-
}
156-
| {
157-
type: ColumnFilterType.TEXT;
158-
textOptions?: TextFilterOptions;
159-
}
160-
| {
161-
type: ColumnFilterType.NUMBER;
162-
}
163-
| {
164-
type: ColumnFilterType.DATE_RANGE;
165-
dateRangeOptions?: DateRangeFilterOptions;
166-
}
167-
);
168-
169130
export type ColumnFilter = {
170131
id: string;
171132
value: FilterValue;
@@ -176,32 +137,32 @@ export const ZColumnFilter = z.object({
176137
value: ZFilterValue,
177138
}) satisfies z.ZodType<ColumnFilter>;
178139

179-
export type FilterValueSchema<T extends ColumnFilterType> = T extends ColumnFilterType.SINGLE_SELECT
140+
export type FilterValueSchema<T extends FilterType> = T extends ColumnFilterTypeValues["SINGLE_SELECT"]
180141
? typeof ZSingleSelectFilterValue
181-
: T extends ColumnFilterType.MULTI_SELECT
142+
: T extends ColumnFilterTypeValues["MULTI_SELECT"]
182143
? typeof ZMultiSelectFilterValue
183-
: T extends ColumnFilterType.TEXT
144+
: T extends ColumnFilterTypeValues["TEXT"]
184145
? typeof ZTextFilterValue
185-
: T extends ColumnFilterType.NUMBER
146+
: T extends ColumnFilterTypeValues["NUMBER"]
186147
? typeof ZNumberFilterValue
187-
: T extends ColumnFilterType.DATE_RANGE
148+
: T extends ColumnFilterTypeValues["DATE_RANGE"]
188149
? typeof ZDateRangeFilterValue
189150
: never;
190151

191-
export type FilterValue<T extends ColumnFilterType = ColumnFilterType> =
192-
T extends ColumnFilterType.SINGLE_SELECT
152+
export type FilterValue<T extends FilterType = FilterType> =
153+
T extends ColumnFilterTypeValues["SINGLE_SELECT"]
193154
? SingleSelectFilterValue
194-
: T extends ColumnFilterType.MULTI_SELECT
155+
: T extends ColumnFilterTypeValues["MULTI_SELECT"]
195156
? MultiSelectFilterValue
196-
: T extends ColumnFilterType.TEXT
157+
: T extends ColumnFilterTypeValues["TEXT"]
197158
? TextFilterValue
198-
: T extends ColumnFilterType.NUMBER
159+
: T extends ColumnFilterTypeValues["NUMBER"]
199160
? NumberFilterValue
200-
: T extends ColumnFilterType.DATE_RANGE
161+
: T extends ColumnFilterTypeValues["DATE_RANGE"]
201162
? DateRangeFilterValue
202163
: never;
203164

204-
export type TypedColumnFilter<T extends ColumnFilterType> = {
165+
export type TypedColumnFilter<T extends FilterType> = {
205166
id: string;
206167
value: FilterValue<T>;
207168
};

0 commit comments

Comments
 (0)