* feat: improve text filters (WIP) * move function to bottom * apply some styles * fix selection of TextFilterOptions * rename value to operand * remove unused file * merge filters/filters into filters/utils * fix regression of not putting url params correctly * move makeWhereClause to filters/utils * fix negative, empty, and not empty operators * fix initial filtering from search state (url) * fix type errors * do not send an empty array to query * update yarn.lock * i18n for text filter operators * extract logic as useColumnFilters() * add missing import * fix type error * revert yarn.lock * use i18n * insensitive text match * move data-table to @calcom/features * fix type errors * fix type errors * fix type errors * feat: support DataTable filters for Insights Routing WIP * remove unused filters * remove additionalFilters and fix types * clean up filter components * support icons for ActiveFilters * support filters on json * fix filter ui * fix type error and clean up * revert changes * revert change * clean up * revert change * fix compatibility with insights booking page * remove unused params * fix type errors * update yarn.lock * fix field filter and adjust ui * chore: update yarn.lock * fix text filter * add Clear Filters button * add more test data * feat: support numeric filter WIP * feat: support numeric filter * feat: move People to an external filter * fixing query states * rename state to activeFilters * add useDataTable * fix ResponseCellValue bug and enable resizing for RoutingFormResponsesTable * fix response values * truncate attribute text * seed booking attendees * fix accessor (no actual change though) * add a gap * rename * use pathname as default identifier for DataTable * fix type error * support text filter for assignment reason * Apply suggestions from code review Co-authored-by: Alex van Andel <me@alexvanandel.com> * rename fields to headers * use safeParse * fix type error * push yarn.lock with faker * fix MemberList --------- Co-authored-by: Udit Takkar <udit222001@gmail.com> Co-authored-by: Alex van Andel <me@alexvanandel.com> Co-authored-by: sean-brydon <sean@cal.com>
81 lines
2.3 KiB
TypeScript
81 lines
2.3 KiB
TypeScript
"use client";
|
|
|
|
import { useQueryState, parseAsArrayOf, parseAsJson } from "nuqs";
|
|
import { createContext, useCallback, useState, type Dispatch, type SetStateAction } from "react";
|
|
import { z } from "zod";
|
|
|
|
import { type FilterValue, ZFilterValue } from "./types";
|
|
|
|
const dataTableFiltersSchema = z.object({
|
|
f: z.string(),
|
|
v: ZFilterValue.optional(),
|
|
});
|
|
|
|
type ActiveFilter = z.infer<typeof dataTableFiltersSchema>;
|
|
|
|
export type DataTableContextType = {
|
|
activeFilters: ActiveFilter[];
|
|
setActiveFilters: (filters: ActiveFilter[]) => void;
|
|
clearAll: () => void;
|
|
updateFilter: (columnId: string, value: FilterValue) => void;
|
|
removeFilter: (columnId: string) => void;
|
|
|
|
displayedExternalFilters: string[];
|
|
setDisplayedExternalFilters: Dispatch<SetStateAction<string[]>>;
|
|
removeDisplayedExternalFilter: (key: string) => void;
|
|
};
|
|
|
|
export const DataTableContext = createContext<DataTableContextType | null>(null);
|
|
|
|
export function DataTableProvider({ children }: { children: React.ReactNode }) {
|
|
const [activeFilters, setActiveFilters] = useQueryState(
|
|
"activeFilters",
|
|
parseAsArrayOf(parseAsJson(dataTableFiltersSchema.parse)).withDefault([])
|
|
);
|
|
|
|
const [displayedExternalFilters, setDisplayedExternalFilters] = useState<string[]>([]);
|
|
|
|
const removeDisplayedExternalFilter = useCallback(
|
|
(key: string) => {
|
|
setDisplayedExternalFilters((prev) => prev.filter((f) => f !== key));
|
|
},
|
|
[setDisplayedExternalFilters]
|
|
);
|
|
|
|
const clearAll = useCallback(() => {
|
|
setActiveFilters([]);
|
|
}, [setActiveFilters]);
|
|
|
|
const updateFilter = useCallback(
|
|
(columnId: string, value: FilterValue) => {
|
|
setActiveFilters((prev) => {
|
|
return prev.map((item) => (item.f === columnId ? { ...item, v: value } : item));
|
|
});
|
|
},
|
|
[setActiveFilters]
|
|
);
|
|
|
|
const removeFilter = useCallback(
|
|
(columnId: string) => {
|
|
setActiveFilters((prev) => prev.filter((filter) => filter.f !== columnId));
|
|
},
|
|
[setActiveFilters]
|
|
);
|
|
|
|
return (
|
|
<DataTableContext.Provider
|
|
value={{
|
|
activeFilters,
|
|
setActiveFilters,
|
|
clearAll,
|
|
updateFilter,
|
|
removeFilter,
|
|
displayedExternalFilters,
|
|
setDisplayedExternalFilters,
|
|
removeDisplayedExternalFilter,
|
|
}}>
|
|
{children}
|
|
</DataTableContext.Provider>
|
|
);
|
|
}
|