@m5kdev/frontend 0.3.1 → 0.3.2
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/src/modules/table/hooks/useDateRangeFilter.d.ts.map +1 -1
- package/dist/src/modules/table/hooks/useDateRangeFilter.js +9 -1
- package/dist/src/modules/table/hooks/useNuqsQueryParams.d.ts +6 -4
- package/dist/src/modules/table/hooks/useNuqsQueryParams.d.ts.map +1 -1
- package/dist/src/modules/table/hooks/useNuqsQueryParams.js +22 -10
- package/dist/src/modules/table/hooks/useNuqsTable.d.ts +5 -1
- package/dist/src/modules/table/hooks/useNuqsTable.d.ts.map +1 -1
- package/dist/src/modules/table/hooks/useNuqsTable.js +29 -6
- package/dist/src/modules/table/hooks/useQueryWithParams.d.ts +5 -1
- package/dist/src/modules/table/hooks/useQueryWithParams.d.ts.map +1 -1
- package/dist/src/modules/table/hooks/useQueryWithParams.js +32 -12
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDateRangeFilter.d.ts","sourceRoot":"","sources":["../../../../../src/modules/table/hooks/useDateRangeFilter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,
|
|
1
|
+
{"version":3,"file":"useDateRangeFilter.d.ts","sourceRoot":"","sources":["../../../../../src/modules/table/hooks/useDateRangeFilter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,sBAAsB,CAAC;AAGhF,MAAM,WAAW,qBAAqB,CAAC,KAAK;IAC1C,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;CAC9B;AAED;;;;GAIG;AAEH,KAAK,gBAAgB,CAAC,KAAK,IAAI,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAEvE;;;GAGG;AAEH,KAAK,iBAAiB,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAEnG,MAAM,WAAW,sBAAsB,CAAC,MAAM,EAAE,KAAK;IACnD,eAAe,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAM,EAAE,KAAK,EAAE,mCAG/C,sBAAsB,CAAC,MAAM,EAAE,KAAK,CAAC,KAAG,qBAAqB,CAAC,KAAK,CAuBrE,CAAC"}
|
|
@@ -14,7 +14,15 @@ export const useDateRangeFilter = ({ getQueryOptions, queryParams = {}, }) => {
|
|
|
14
14
|
queryState: { filters },
|
|
15
15
|
});
|
|
16
16
|
return {
|
|
17
|
-
params: {
|
|
17
|
+
params: {
|
|
18
|
+
filters,
|
|
19
|
+
setFilters,
|
|
20
|
+
granularity,
|
|
21
|
+
setGranularity,
|
|
22
|
+
// TODO: Review - just fixing ts errors for now
|
|
23
|
+
grouping: [],
|
|
24
|
+
setGrouping: () => { },
|
|
25
|
+
},
|
|
18
26
|
query: queryResult,
|
|
19
27
|
};
|
|
20
28
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { QueryFilters } from "@m5kdev/commons/modules/schemas/query.schema";
|
|
2
|
-
import type { PaginationState, SortingState, Updater } from "@tanstack/react-table";
|
|
2
|
+
import type { GroupingState, PaginationState, SortingState, Updater } from "@tanstack/react-table";
|
|
3
3
|
export type Order = "asc" | "desc";
|
|
4
4
|
export type Granularity = "daily" | "weekly" | "monthly" | "yearly";
|
|
5
5
|
export interface NuqsQueryParams {
|
|
@@ -15,11 +15,13 @@ export interface NuqsQueryParams {
|
|
|
15
15
|
limit?: number;
|
|
16
16
|
setPagination?: (updater: Updater<PaginationState>) => void;
|
|
17
17
|
pagination?: PaginationState;
|
|
18
|
+
grouping: GroupingState;
|
|
19
|
+
setGrouping: (updater: Updater<GroupingState>) => void;
|
|
18
20
|
}
|
|
19
21
|
/**
|
|
20
22
|
* Hook to manage all query parameters via nuqs (URL query parameters)
|
|
21
|
-
* Manages: filters, sort, order, page, limit
|
|
22
|
-
*
|
|
23
|
+
* Manages: filters, sort, order, page, limit, groupBy, granularity
|
|
24
|
+
* Accepts an optional prefix to namespace params when multiple tables share a view.
|
|
23
25
|
*/
|
|
24
|
-
export declare const useNuqsQueryParams: () => NuqsQueryParams;
|
|
26
|
+
export declare const useNuqsQueryParams: (prefix?: string) => NuqsQueryParams;
|
|
25
27
|
//# sourceMappingURL=useNuqsQueryParams.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNuqsQueryParams.d.ts","sourceRoot":"","sources":["../../../../../src/modules/table/hooks/useNuqsQueryParams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8CAA8C,CAAC;AAEjF,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"useNuqsQueryParams.d.ts","sourceRoot":"","sources":["../../../../../src/modules/table/hooks/useNuqsQueryParams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8CAA8C,CAAC;AAEjF,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAiBnG,MAAM,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAEnC,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEpE,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IAC7C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IACtD,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;IAC5D,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,QAAQ,EAAE,aAAa,CAAC;IACxB,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC;CACxD;AAED;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,MAAM,KAAG,eA6GpD,CAAC"}
|
|
@@ -1,19 +1,27 @@
|
|
|
1
1
|
import { filtersSchema } from "@m5kdev/commons/modules/schemas/query.schema";
|
|
2
|
-
import { parseAsInteger, parseAsJson, parseAsString, parseAsStringLiteral, useQueryState, } from "nuqs";
|
|
2
|
+
import { parseAsArrayOf, parseAsInteger, parseAsJson, parseAsString, parseAsStringLiteral, useQueryState, } from "nuqs";
|
|
3
3
|
import { useCallback, useEffect, useMemo } from "react";
|
|
4
4
|
const parseAsFilters = parseAsJson((value) => filtersSchema.parse(value)).withDefault([]);
|
|
5
|
+
const parseAsGrouping = parseAsArrayOf(parseAsString).withDefault([]);
|
|
5
6
|
/**
|
|
6
7
|
* Hook to manage all query parameters via nuqs (URL query parameters)
|
|
7
|
-
* Manages: filters, sort, order, page, limit
|
|
8
|
-
*
|
|
8
|
+
* Manages: filters, sort, order, page, limit, groupBy, granularity
|
|
9
|
+
* Accepts an optional prefix to namespace params when multiple tables share a view.
|
|
9
10
|
*/
|
|
10
|
-
export const useNuqsQueryParams = () => {
|
|
11
|
-
const
|
|
12
|
-
const [
|
|
13
|
-
const [
|
|
14
|
-
const [
|
|
15
|
-
const [
|
|
16
|
-
const [
|
|
11
|
+
export const useNuqsQueryParams = (prefix) => {
|
|
12
|
+
const k = (name) => (prefix ? `${prefix}_${name}` : name);
|
|
13
|
+
const [sort, setSort] = useQueryState(k("sort"), parseAsString.withDefault(""));
|
|
14
|
+
const [order, setOrder] = useQueryState(k("order"), parseAsStringLiteral(["asc", "desc"]));
|
|
15
|
+
const [page, setPage] = useQueryState(k("page"), parseAsInteger.withDefault(1));
|
|
16
|
+
const [limit, setLimit] = useQueryState(k("limit"), parseAsInteger.withDefault(10));
|
|
17
|
+
const [filters, setFilters] = useQueryState(k("filters"), parseAsFilters);
|
|
18
|
+
const [granularity, setGranularity] = useQueryState(k("granularity"), parseAsStringLiteral(["daily", "weekly", "monthly", "yearly"]).withDefault("daily"));
|
|
19
|
+
const [groupingRaw, setGroupingRaw] = useQueryState(k("groupBy"), parseAsGrouping);
|
|
20
|
+
const grouping = groupingRaw;
|
|
21
|
+
const setGrouping = useCallback((updater) => {
|
|
22
|
+
const next = typeof updater === "function" ? updater(groupingRaw) : updater;
|
|
23
|
+
setGroupingRaw(next.length > 0 ? next : null);
|
|
24
|
+
}, [groupingRaw, setGroupingRaw]);
|
|
17
25
|
const sorting = useMemo(() => {
|
|
18
26
|
if (!sort) {
|
|
19
27
|
return [];
|
|
@@ -65,6 +73,8 @@ export const useNuqsQueryParams = () => {
|
|
|
65
73
|
limit,
|
|
66
74
|
setPagination,
|
|
67
75
|
pagination,
|
|
76
|
+
grouping,
|
|
77
|
+
setGrouping,
|
|
68
78
|
}), [
|
|
69
79
|
filters,
|
|
70
80
|
setFilters,
|
|
@@ -78,5 +88,7 @@ export const useNuqsQueryParams = () => {
|
|
|
78
88
|
limit,
|
|
79
89
|
setPagination,
|
|
80
90
|
pagination,
|
|
91
|
+
grouping,
|
|
92
|
+
setGrouping,
|
|
81
93
|
]);
|
|
82
94
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { QueryFilters } from "@m5kdev/commons/modules/schemas/query.schema";
|
|
1
2
|
import type { UseQueryOptions, UseQueryResult } from "@tanstack/react-query";
|
|
2
3
|
import type { RowSelectionState, Updater } from "@tanstack/react-table";
|
|
3
4
|
import { type NuqsQueryParams } from "./useNuqsQueryParams";
|
|
@@ -27,7 +28,10 @@ type GetQueryOptionsFn<TInput, TData> = (input: TInput, ...args: any[]) => Query
|
|
|
27
28
|
export interface NuqsTableOptions<TInput, TData> {
|
|
28
29
|
getQueryOptions: GetQueryOptionsFn<TInput, TData>;
|
|
29
30
|
queryParams?: TInput;
|
|
31
|
+
prefix?: string;
|
|
32
|
+
additionalFilters?: QueryFilters;
|
|
33
|
+
onAdditionalFiltersChange?: (filters: QueryFilters) => void;
|
|
30
34
|
}
|
|
31
|
-
declare const useNuqsTable: <TInput, TData>({ getQueryOptions, queryParams, }: NuqsTableOptions<TInput, TData>) => NuqsTableReturn<TData>;
|
|
35
|
+
declare const useNuqsTable: <TInput, TData>({ getQueryOptions, queryParams, prefix, additionalFilters, onAdditionalFiltersChange, }: NuqsTableOptions<TInput, TData>) => NuqsTableReturn<TData>;
|
|
32
36
|
export default useNuqsTable;
|
|
33
37
|
//# sourceMappingURL=useNuqsTable.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNuqsTable.d.ts","sourceRoot":"","sources":["../../../../../src/modules/table/hooks/useNuqsTable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAExE,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,sBAAsB,CAAC;AAGhF,MAAM,WAAW,WAAY,SAAQ,eAAe;IAClD,YAAY,EAAE,iBAAiB,CAAC;IAChC,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;CAChE;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC;AAErC,MAAM,WAAW,eAAe,CAAC,KAAK;IACpC,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;CAC9B;AAED;;;;GAIG;AAEH,KAAK,gBAAgB,CAAC,KAAK,IAAI,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAEvE;;;GAGG;AAEH,KAAK,iBAAiB,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAEnG,MAAM,WAAW,gBAAgB,CAAC,MAAM,EAAE,KAAK;IAC7C,eAAe,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"useNuqsTable.d.ts","sourceRoot":"","sources":["../../../../../src/modules/table/hooks/useNuqsTable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8CAA8C,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAExE,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,sBAAsB,CAAC;AAGhF,MAAM,WAAW,WAAY,SAAQ,eAAe;IAClD,YAAY,EAAE,iBAAiB,CAAC;IAChC,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;CAChE;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC;AAErC,MAAM,WAAW,eAAe,CAAC,KAAK;IACpC,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;CAC9B;AAED;;;;GAIG;AAEH,KAAK,gBAAgB,CAAC,KAAK,IAAI,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAEvE;;;GAGG;AAEH,KAAK,iBAAiB,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAEnG,MAAM,WAAW,gBAAgB,CAAC,MAAM,EAAE,KAAK;IAC7C,eAAe,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,YAAY,CAAC;IACjC,yBAAyB,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;CAC7D;AAED,QAAA,MAAM,YAAY,GAAI,MAAM,EAAE,KAAK,EAAE,yFAMlC,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,KAAG,eAAe,CAAC,KAAK,CAmEzD,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -1,29 +1,52 @@
|
|
|
1
1
|
import { useCallback, useMemo, useState } from "react";
|
|
2
2
|
import { useNuqsQueryParams } from "./useNuqsQueryParams";
|
|
3
3
|
import { useQueryWithParams } from "./useQueryWithParams";
|
|
4
|
-
const useNuqsTable = ({ getQueryOptions, queryParams = {}, }) => {
|
|
5
|
-
// Get all URL query state
|
|
6
|
-
const queryState = useNuqsQueryParams();
|
|
7
|
-
// Get query result
|
|
4
|
+
const useNuqsTable = ({ getQueryOptions, queryParams = {}, prefix, additionalFilters, onAdditionalFiltersChange, }) => {
|
|
5
|
+
// Get all URL query state (includes grouping)
|
|
6
|
+
const queryState = useNuqsQueryParams(prefix);
|
|
7
|
+
// Get query result — passes grouping so limit can be overridden when grouped
|
|
8
8
|
const queryResult = useQueryWithParams({
|
|
9
9
|
getQueryOptions,
|
|
10
10
|
queryParams,
|
|
11
11
|
queryState,
|
|
12
|
+
grouping: queryState.grouping,
|
|
13
|
+
additionalFilters,
|
|
12
14
|
});
|
|
13
15
|
// Table-specific row selection state
|
|
14
16
|
const [rowSelection, setRowSelectionRaw] = useState({});
|
|
15
|
-
console.log("rowSelection", rowSelection);
|
|
16
17
|
const setRowSelection = useCallback((updater) => {
|
|
17
18
|
setRowSelectionRaw((prev) => {
|
|
18
19
|
const next = typeof updater === "function" ? updater(prev) : updater;
|
|
19
20
|
return next;
|
|
20
21
|
});
|
|
21
22
|
}, []);
|
|
23
|
+
// Merge additionalFilters into displayed filters so the table UI shows all active filters.
|
|
24
|
+
// On write, strip the additional filters so only the table's own go to the prefixed URL param.
|
|
25
|
+
const displayFilters = useMemo(() => {
|
|
26
|
+
if (!additionalFilters?.length)
|
|
27
|
+
return queryState.filters ?? [];
|
|
28
|
+
return [...additionalFilters, ...(queryState.filters ?? [])];
|
|
29
|
+
}, [additionalFilters, queryState.filters]);
|
|
30
|
+
const additionalColumnIds = useMemo(() => new Set(additionalFilters?.map((f) => f.columnId) ?? []), [additionalFilters]);
|
|
31
|
+
const wrappedSetFilters = useCallback((newFilters) => {
|
|
32
|
+
if (!additionalColumnIds.size) {
|
|
33
|
+
queryState.setFilters?.(newFilters);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const ownFilters = newFilters.filter((f) => !additionalColumnIds.has(f.columnId));
|
|
37
|
+
queryState.setFilters?.(ownFilters);
|
|
38
|
+
if (onAdditionalFiltersChange) {
|
|
39
|
+
const updatedAdditional = newFilters.filter((f) => additionalColumnIds.has(f.columnId));
|
|
40
|
+
onAdditionalFiltersChange(updatedAdditional);
|
|
41
|
+
}
|
|
42
|
+
}, [additionalColumnIds, queryState.setFilters, onAdditionalFiltersChange]);
|
|
22
43
|
const params = useMemo(() => ({
|
|
23
44
|
...queryState,
|
|
45
|
+
filters: displayFilters,
|
|
46
|
+
setFilters: wrappedSetFilters,
|
|
24
47
|
rowSelection,
|
|
25
48
|
setRowSelection,
|
|
26
|
-
}), [queryState, rowSelection, setRowSelection]);
|
|
49
|
+
}), [queryState, displayFilters, wrappedSetFilters, rowSelection, setRowSelection]);
|
|
27
50
|
return {
|
|
28
51
|
params,
|
|
29
52
|
query: queryResult,
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import type { QueryFilters } from "@m5kdev/commons/modules/schemas/query.schema";
|
|
1
2
|
import { type UseQueryOptions, type UseQueryResult } from "@tanstack/react-query";
|
|
3
|
+
import type { GroupingState } from "@tanstack/react-table";
|
|
2
4
|
import type { NuqsQueryParams } from "./useNuqsQueryParams";
|
|
3
5
|
/**
|
|
4
6
|
* Flexible query options type that accepts both standard TanStack Query options
|
|
@@ -15,12 +17,14 @@ export interface QueryWithParamsOptions<TInput, TData> {
|
|
|
15
17
|
getQueryOptions: GetQueryOptionsFn<TInput, TData>;
|
|
16
18
|
queryParams?: TInput;
|
|
17
19
|
queryState: Pick<NuqsQueryParams, "filters" | "sort" | "order" | "page" | "limit">;
|
|
20
|
+
grouping?: GroupingState;
|
|
21
|
+
additionalFilters?: QueryFilters;
|
|
18
22
|
enabled?: boolean;
|
|
19
23
|
}
|
|
20
24
|
/**
|
|
21
25
|
* Hook to integrate query state with React Query
|
|
22
26
|
* Combines queryParams with queryState and manages data fetching
|
|
23
27
|
*/
|
|
24
|
-
export declare const useQueryWithParams: <TInput, TData>({ getQueryOptions, queryParams, queryState, enabled, }: QueryWithParamsOptions<TInput, TData>) => UseQueryResult<TData>;
|
|
28
|
+
export declare const useQueryWithParams: <TInput, TData>({ getQueryOptions, queryParams, queryState, grouping, additionalFilters, enabled, }: QueryWithParamsOptions<TInput, TData>) => UseQueryResult<TData>;
|
|
25
29
|
export {};
|
|
26
30
|
//# sourceMappingURL=useQueryWithParams.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQueryWithParams.d.ts","sourceRoot":"","sources":["../../../../../src/modules/table/hooks/useQueryWithParams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAY,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"useQueryWithParams.d.ts","sourceRoot":"","sources":["../../../../../src/modules/table/hooks/useQueryWithParams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8CAA8C,CAAC;AACjF,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAY,MAAM,uBAAuB,CAAC;AAC5F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D;;;;GAIG;AAEH,KAAK,gBAAgB,CAAC,KAAK,IAAI,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAEvE;;;GAGG;AAEH,KAAK,iBAAiB,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAInG,MAAM,WAAW,sBAAsB,CAAC,MAAM,EAAE,KAAK;IACnD,eAAe,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACnF,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,iBAAiB,CAAC,EAAE,YAAY,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAM,EAAE,KAAK,EAAE,qFAO/C,sBAAsB,CAAC,MAAM,EAAE,KAAK,CAAC,KAAG,cAAc,CAAC,KAAK,CA6C9D,CAAC"}
|
|
@@ -1,24 +1,44 @@
|
|
|
1
1
|
import { useQuery } from "@tanstack/react-query";
|
|
2
|
-
import { useMemo } from "react";
|
|
2
|
+
import { useEffect, useMemo, useRef } from "react";
|
|
3
|
+
const FETCH_ALL_LIMIT = 99999;
|
|
3
4
|
/**
|
|
4
5
|
* Hook to integrate query state with React Query
|
|
5
6
|
* Combines queryParams with queryState and manages data fetching
|
|
6
7
|
*/
|
|
7
|
-
export const useQueryWithParams = ({ getQueryOptions, queryParams = {}, queryState, enabled = true, }) => {
|
|
8
|
+
export const useQueryWithParams = ({ getQueryOptions, queryParams = {}, queryState, grouping = [], additionalFilters, enabled = true, }) => {
|
|
8
9
|
const { filters, sort, order, page, limit } = queryState;
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
const isGrouped = grouping.length > 0;
|
|
11
|
+
const input = useMemo(() => {
|
|
12
|
+
let mergedFilters;
|
|
13
|
+
if (additionalFilters?.length) {
|
|
14
|
+
const additionalColumnIds = new Set(additionalFilters.map((f) => f.columnId));
|
|
15
|
+
const ownFiltersOnly = (filters ?? []).filter((f) => !additionalColumnIds.has(f.columnId));
|
|
16
|
+
mergedFilters = [...additionalFilters, ...ownFiltersOnly];
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
mergedFilters = filters;
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
...queryParams,
|
|
23
|
+
page: isGrouped ? 1 : page,
|
|
24
|
+
limit: isGrouped ? FETCH_ALL_LIMIT : limit,
|
|
25
|
+
sort,
|
|
26
|
+
order: order ?? undefined,
|
|
27
|
+
filters: mergedFilters,
|
|
28
|
+
};
|
|
29
|
+
}, [queryParams, page, limit, sort, order, filters, isGrouped, additionalFilters]);
|
|
30
|
+
const prevIsGroupedRef = useRef(isGrouped);
|
|
31
|
+
const groupingTransitioned = prevIsGroupedRef.current !== isGrouped;
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
prevIsGroupedRef.current = isGrouped;
|
|
34
|
+
}, [isGrouped]);
|
|
17
35
|
const queryOptions = useMemo(() => ({
|
|
18
36
|
...getQueryOptions(input),
|
|
19
|
-
placeholderData:
|
|
37
|
+
placeholderData: groupingTransitioned
|
|
38
|
+
? undefined
|
|
39
|
+
: (previousData) => previousData,
|
|
20
40
|
enabled,
|
|
21
|
-
}), [getQueryOptions, input, enabled]);
|
|
41
|
+
}), [getQueryOptions, input, enabled, groupingTransitioned]);
|
|
22
42
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
23
43
|
return useQuery(queryOptions);
|
|
24
44
|
};
|