@m5kdev/frontend 0.20.51 → 0.21.1
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/index.d.mts +25 -0
- package/dist/src/index.d.ts +25 -0
- package/dist/src/index.js +83 -0
- package/dist/src/index.mjs +25 -0
- package/dist/src/modules/auth/auth.client.d.mts +708 -0
- package/dist/src/modules/auth/auth.client.d.mts.map +1 -0
- package/dist/src/modules/auth/auth.client.d.ts +708 -0
- package/dist/src/modules/auth/auth.client.d.ts.map +1 -0
- package/dist/src/modules/auth/auth.client.js +72 -0
- package/dist/src/modules/auth/auth.client.js.map +1 -0
- package/dist/src/modules/auth/auth.client.mjs +71 -0
- package/dist/src/modules/auth/auth.client.mjs.map +1 -0
- package/dist/src/modules/auth/auth.context.d.mts +15 -0
- package/dist/src/modules/auth/auth.context.d.mts.map +1 -0
- package/dist/src/modules/auth/auth.context.d.ts +15 -0
- package/dist/src/modules/auth/auth.context.d.ts.map +1 -0
- package/dist/src/modules/auth/auth.context.js +13 -0
- package/dist/src/modules/auth/auth.context.js.map +1 -0
- package/dist/src/modules/auth/auth.context.mjs +13 -0
- package/dist/src/modules/auth/auth.context.mjs.map +1 -0
- package/dist/src/modules/auth/auth.lib.d.mts +1251 -1380
- package/dist/src/modules/auth/auth.lib.d.mts.map +1 -1
- package/dist/src/modules/auth/auth.lib.d.ts +1251 -1380
- package/dist/src/modules/auth/auth.lib.d.ts.map +1 -1
- package/dist/src/modules/auth/auth.lib.js +18 -63
- package/dist/src/modules/auth/auth.lib.js.map +1 -1
- package/dist/src/modules/auth/auth.lib.mjs +10 -64
- package/dist/src/modules/auth/auth.lib.mjs.map +1 -1
- package/dist/src/modules/auth/components/AuthProvider.d.mts +9 -10
- package/dist/src/modules/auth/components/AuthProvider.d.mts.map +1 -1
- package/dist/src/modules/auth/components/AuthProvider.d.ts +9 -10
- package/dist/src/modules/auth/components/AuthProvider.d.ts.map +1 -1
- package/dist/src/modules/auth/components/AuthProvider.js +20 -42
- package/dist/src/modules/auth/components/AuthProvider.js.map +1 -1
- package/dist/src/modules/auth/components/AuthProvider.mjs +22 -43
- package/dist/src/modules/auth/components/AuthProvider.mjs.map +1 -1
- package/dist/src/modules/auth/hooks/useAuth.d.mts.map +1 -1
- package/dist/src/modules/auth/hooks/useAuth.d.ts.map +1 -1
- package/dist/src/modules/auth/hooks/useAuth.js +5 -3
- package/dist/src/modules/auth/hooks/useAuth.js.map +1 -1
- package/dist/src/modules/auth/hooks/useAuth.mjs +3 -1
- package/dist/src/modules/auth/hooks/useAuth.mjs.map +1 -1
- package/dist/src/modules/auth/hooks/useAuthAdmin.d.mts +10 -19
- package/dist/src/modules/auth/hooks/useAuthAdmin.d.mts.map +1 -1
- package/dist/src/modules/auth/hooks/useAuthAdmin.d.ts +10 -19
- package/dist/src/modules/auth/hooks/useAuthAdmin.d.ts.map +1 -1
- package/dist/src/modules/auth/hooks/useAuthAdmin.js +20 -12
- package/dist/src/modules/auth/hooks/useAuthAdmin.js.map +1 -1
- package/dist/src/modules/auth/hooks/useAuthAdmin.mjs +14 -6
- package/dist/src/modules/auth/hooks/useAuthAdmin.mjs.map +1 -1
- package/dist/src/modules/auth/hooks/useAuthClient.d.mts +707 -0
- package/dist/src/modules/auth/hooks/useAuthClient.d.mts.map +1 -0
- package/dist/src/modules/auth/hooks/useAuthClient.d.ts +707 -0
- package/dist/src/modules/auth/hooks/useAuthClient.d.ts.map +1 -0
- package/dist/src/modules/auth/hooks/useAuthClient.js +12 -0
- package/dist/src/modules/auth/hooks/useAuthClient.js.map +1 -0
- package/dist/src/modules/auth/hooks/useAuthClient.mjs +11 -0
- package/dist/src/modules/auth/hooks/useAuthClient.mjs.map +1 -0
- package/dist/src/modules/auth/hooks/useMemberInvite.js +3 -2
- package/dist/src/modules/auth/hooks/useMemberInvite.js.map +1 -1
- package/dist/src/modules/auth/hooks/useMemberInvite.mjs +2 -1
- package/dist/src/modules/auth/hooks/useMemberInvite.mjs.map +1 -1
- package/dist/src/modules/auth/hooks/useOrganizationAccess.d.mts +1 -1
- package/dist/src/modules/auth/hooks/useOrganizationAccess.d.ts +1 -1
- package/dist/src/modules/auth/hooks/useSession.d.mts +4 -37
- package/dist/src/modules/auth/hooks/useSession.d.mts.map +1 -1
- package/dist/src/modules/auth/hooks/useSession.d.ts +4 -37
- package/dist/src/modules/auth/hooks/useSession.d.ts.map +1 -1
- package/dist/src/modules/auth/hooks/useSession.js +3 -2
- package/dist/src/modules/auth/hooks/useSession.js.map +1 -1
- package/dist/src/modules/auth/hooks/useSession.mjs +3 -2
- package/dist/src/modules/auth/hooks/useSession.mjs.map +1 -1
- package/dist/src/modules/billing/components/BillingProvider.d.mts +1 -1
- package/dist/src/modules/billing/components/BillingProvider.d.mts.map +1 -1
- package/dist/src/modules/billing/components/BillingProvider.d.ts +1 -1
- package/dist/src/modules/billing/components/BillingProvider.d.ts.map +1 -1
- package/dist/src/modules/file/hooks/useS3Upload.d.mts +15 -2
- package/dist/src/modules/file/hooks/useS3Upload.d.mts.map +1 -1
- package/dist/src/modules/file/hooks/useS3Upload.d.ts +15 -2
- package/dist/src/modules/file/hooks/useS3Upload.d.ts.map +1 -1
- package/dist/src/modules/file/hooks/useS3Upload.js +29 -4
- package/dist/src/modules/file/hooks/useS3Upload.js.map +1 -1
- package/dist/src/modules/file/hooks/useS3Upload.mjs +29 -5
- package/dist/src/modules/file/hooks/useS3Upload.mjs.map +1 -1
- package/dist/src/modules/file/hooks/useUpload.d.mts +6 -4
- package/dist/src/modules/file/hooks/useUpload.d.mts.map +1 -1
- package/dist/src/modules/file/hooks/useUpload.d.ts +6 -4
- package/dist/src/modules/file/hooks/useUpload.d.ts.map +1 -1
- package/dist/src/modules/file/hooks/useUpload.js +10 -7
- package/dist/src/modules/file/hooks/useUpload.js.map +1 -1
- package/dist/src/modules/file/hooks/useUpload.mjs +10 -7
- package/dist/src/modules/file/hooks/useUpload.mjs.map +1 -1
- package/dist/src/modules/table/hooks/useQueryWithParams.d.mts +2 -2
- package/dist/src/modules/table/hooks/useQueryWithParams.d.mts.map +1 -1
- package/dist/src/modules/table/hooks/useQueryWithParams.d.ts +2 -2
- package/dist/src/modules/table/hooks/useQueryWithParams.d.ts.map +1 -1
- package/dist/src/modules/table/hooks/useQueryWithParams.js.map +1 -1
- package/dist/src/modules/table/hooks/useQueryWithParams.mjs.map +1 -1
- package/dist/src/modules/table/hooks/useTableQueryParams.d.mts +7 -0
- package/dist/src/modules/table/hooks/useTableQueryParams.d.mts.map +1 -0
- package/dist/src/modules/table/hooks/useTableQueryParams.d.ts +7 -0
- package/dist/src/modules/table/hooks/useTableQueryParams.d.ts.map +1 -0
- package/dist/src/modules/table/hooks/useTableQueryParams.js +95 -0
- package/dist/src/modules/table/hooks/useTableQueryParams.js.map +1 -0
- package/dist/src/modules/table/hooks/useTableQueryParams.mjs +94 -0
- package/dist/src/modules/table/hooks/useTableQueryParams.mjs.map +1 -0
- package/dist/src/modules/table/queryParams.d.mts +34 -0
- package/dist/src/modules/table/queryParams.d.mts.map +1 -0
- package/dist/src/modules/table/queryParams.d.ts +34 -0
- package/dist/src/modules/table/queryParams.d.ts.map +1 -0
- package/dist/src/modules/table/{hooks/useNuqsQueryParams.js → queryParams.js} +14 -130
- package/dist/src/modules/table/queryParams.js.map +1 -0
- package/dist/src/modules/table/{hooks/useNuqsQueryParams.mjs → queryParams.mjs} +10 -130
- package/dist/src/modules/table/queryParams.mjs.map +1 -0
- package/dist/src/utils/date.d.mts +1 -1
- package/package.json +24 -6
- package/dist/src/modules/table/hooks/useDateRangeFilter.d.mts +0 -34
- package/dist/src/modules/table/hooks/useDateRangeFilter.d.mts.map +0 -1
- package/dist/src/modules/table/hooks/useDateRangeFilter.d.ts +0 -34
- package/dist/src/modules/table/hooks/useDateRangeFilter.d.ts.map +0 -1
- package/dist/src/modules/table/hooks/useDateRangeFilter.js +0 -30
- package/dist/src/modules/table/hooks/useDateRangeFilter.js.map +0 -1
- package/dist/src/modules/table/hooks/useDateRangeFilter.mjs +0 -29
- package/dist/src/modules/table/hooks/useDateRangeFilter.mjs.map +0 -1
- package/dist/src/modules/table/hooks/useNuqsQueryParams.d.mts +0 -34
- package/dist/src/modules/table/hooks/useNuqsQueryParams.d.mts.map +0 -1
- package/dist/src/modules/table/hooks/useNuqsQueryParams.d.ts +0 -34
- package/dist/src/modules/table/hooks/useNuqsQueryParams.d.ts.map +0 -1
- package/dist/src/modules/table/hooks/useNuqsQueryParams.js.map +0 -1
- package/dist/src/modules/table/hooks/useNuqsQueryParams.mjs.map +0 -1
- package/dist/src/modules/table/hooks/useNuqsTable.d.mts +0 -46
- package/dist/src/modules/table/hooks/useNuqsTable.d.mts.map +0 -1
- package/dist/src/modules/table/hooks/useNuqsTable.d.ts +0 -46
- package/dist/src/modules/table/hooks/useNuqsTable.d.ts.map +0 -1
- package/dist/src/modules/table/hooks/useNuqsTable.js +0 -58
- package/dist/src/modules/table/hooks/useNuqsTable.js.map +0 -1
- package/dist/src/modules/table/hooks/useNuqsTable.mjs +0 -58
- package/dist/src/modules/table/hooks/useNuqsTable.mjs.map +0 -1
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { QueryFilters } from "@m5kdev/commons/modules/schemas/query.schema";
|
|
2
|
-
import { GroupingState, PaginationState, SortingState, Updater } from "@tanstack/react-table";
|
|
3
|
-
|
|
4
|
-
//#region src/modules/table/hooks/useNuqsQueryParams.d.ts
|
|
5
|
-
type Order = "asc" | "desc";
|
|
6
|
-
type Granularity = "daily" | "weekly" | "monthly" | "yearly";
|
|
7
|
-
interface NuqsQueryParams {
|
|
8
|
-
/** Global search string from URL (`q`); absent when not in URL. */
|
|
9
|
-
q: string | null;
|
|
10
|
-
setQ: (value: string | null) => void;
|
|
11
|
-
filters?: QueryFilters;
|
|
12
|
-
setFilters?: (filters: QueryFilters) => void;
|
|
13
|
-
granularity?: Granularity;
|
|
14
|
-
setGranularity?: (value: Granularity) => void;
|
|
15
|
-
sort?: string;
|
|
16
|
-
order?: Order | null;
|
|
17
|
-
setSorting?: (updater: Updater<SortingState>) => void;
|
|
18
|
-
sorting?: SortingState;
|
|
19
|
-
page?: number;
|
|
20
|
-
limit?: number;
|
|
21
|
-
setPagination?: (updater: Updater<PaginationState>) => void;
|
|
22
|
-
pagination?: PaginationState;
|
|
23
|
-
grouping: GroupingState;
|
|
24
|
-
setGrouping: (updater: Updater<GroupingState>) => void;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Hook to manage all query parameters via nuqs (URL query parameters)
|
|
28
|
-
* Manages: `f` (filters as tuple arrays), `q`, `s`/`o`, `p`/`l`, `g`, `r`
|
|
29
|
-
* Accepts an optional prefix to namespace params when multiple tables share a view.
|
|
30
|
-
*/
|
|
31
|
-
declare const useNuqsQueryParams: (prefix?: string) => NuqsQueryParams;
|
|
32
|
-
//#endregion
|
|
33
|
-
export { Granularity, NuqsQueryParams, Order, useNuqsQueryParams };
|
|
34
|
-
//# sourceMappingURL=useNuqsQueryParams.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useNuqsQueryParams.d.mts","names":[],"sources":["../../../../../src/modules/table/hooks/useNuqsQueryParams.ts"],"mappings":";;;;KAoOY,KAAA;AAAA,KAEA,WAAA;AAAA,UAEK,eAAA;EAJA;EAMf,CAAA;EACA,IAAA,GAAO,KAAA;EACP,OAAA,GAAU,YAAA;EACV,UAAA,IAAc,OAAA,EAAS,YAAA;EACvB,WAAA,GAAc,WAAA;EACd,cAAA,IAAkB,KAAA,EAAO,WAAA;EACzB,IAAA;EACA,KAAA,GAAQ,KAAA;EACR,UAAA,IAAc,OAAA,EAAS,OAAA,CAAQ,YAAA;EAC/B,OAAA,GAAU,YAAA;EACV,IAAA;EACA,KAAA;EACA,aAAA,IAAiB,OAAA,EAAS,OAAA,CAAQ,eAAA;EAClC,UAAA,GAAa,eAAA;EACb,QAAA,EAAU,aAAA;EACV,WAAA,GAAc,OAAA,EAAS,OAAA,CAAQ,aAAA;AAAA;;;;;;cAQpB,kBAAA,GAAsB,MAAA,cAAkB,eAAA"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { QueryFilters } from "@m5kdev/commons/modules/schemas/query.schema";
|
|
2
|
-
import { GroupingState, PaginationState, SortingState, Updater } from "@tanstack/react-table";
|
|
3
|
-
|
|
4
|
-
//#region src/modules/table/hooks/useNuqsQueryParams.d.ts
|
|
5
|
-
type Order = "asc" | "desc";
|
|
6
|
-
type Granularity = "daily" | "weekly" | "monthly" | "yearly";
|
|
7
|
-
interface NuqsQueryParams {
|
|
8
|
-
/** Global search string from URL (`q`); absent when not in URL. */
|
|
9
|
-
q: string | null;
|
|
10
|
-
setQ: (value: string | null) => void;
|
|
11
|
-
filters?: QueryFilters;
|
|
12
|
-
setFilters?: (filters: QueryFilters) => void;
|
|
13
|
-
granularity?: Granularity;
|
|
14
|
-
setGranularity?: (value: Granularity) => void;
|
|
15
|
-
sort?: string;
|
|
16
|
-
order?: Order | null;
|
|
17
|
-
setSorting?: (updater: Updater<SortingState>) => void;
|
|
18
|
-
sorting?: SortingState;
|
|
19
|
-
page?: number;
|
|
20
|
-
limit?: number;
|
|
21
|
-
setPagination?: (updater: Updater<PaginationState>) => void;
|
|
22
|
-
pagination?: PaginationState;
|
|
23
|
-
grouping: GroupingState;
|
|
24
|
-
setGrouping: (updater: Updater<GroupingState>) => void;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Hook to manage all query parameters via nuqs (URL query parameters)
|
|
28
|
-
* Manages: `f` (filters as tuple arrays), `q`, `s`/`o`, `p`/`l`, `g`, `r`
|
|
29
|
-
* Accepts an optional prefix to namespace params when multiple tables share a view.
|
|
30
|
-
*/
|
|
31
|
-
declare const useNuqsQueryParams: (prefix?: string) => NuqsQueryParams;
|
|
32
|
-
//#endregion
|
|
33
|
-
export { Granularity, NuqsQueryParams, Order, useNuqsQueryParams };
|
|
34
|
-
//# sourceMappingURL=useNuqsQueryParams.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useNuqsQueryParams.d.ts","names":[],"sources":["../../../../../src/modules/table/hooks/useNuqsQueryParams.ts"],"mappings":";;;;KAoOY,KAAA;AAAA,KAEA,WAAA;AAAA,UAEK,eAAA;EAJA;EAMf,CAAA;EACA,IAAA,GAAO,KAAA;EACP,OAAA,GAAU,YAAA;EACV,UAAA,IAAc,OAAA,EAAS,YAAA;EACvB,WAAA,GAAc,WAAA;EACd,cAAA,IAAkB,KAAA,EAAO,WAAA;EACzB,IAAA;EACA,KAAA,GAAQ,KAAA;EACR,UAAA,IAAc,OAAA,EAAS,OAAA,CAAQ,YAAA;EAC/B,OAAA,GAAU,YAAA;EACV,IAAA;EACA,KAAA;EACA,aAAA,IAAiB,OAAA,EAAS,OAAA,CAAQ,eAAA;EAClC,UAAA,GAAa,eAAA;EACb,QAAA,EAAU,aAAA;EACV,WAAA,GAAc,OAAA,EAAS,OAAA,CAAQ,aAAA;AAAA;;;;;;cAQpB,kBAAA,GAAsB,MAAA,cAAkB,eAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useNuqsQueryParams.js","names":["z","parseAsString","filterSchema","parseAsInteger","filtersSchema"],"sources":["../../../../../src/modules/table/hooks/useNuqsQueryParams.ts"],"sourcesContent":["import type { QueryFilter, QueryFilters } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport { filterSchema, filtersSchema } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport type { GroupingState, PaginationState, SortingState, Updater } from \"@tanstack/react-table\";\r\nimport {\r\n createParser,\r\n parseAsArrayOf,\r\n parseAsInteger,\r\n parseAsString,\r\n parseAsStringLiteral,\r\n useQueryState,\r\n} from \"nuqs\";\r\nimport { useCallback, useEffect, useMemo } from \"react\";\r\nimport { z } from \"zod\";\r\n\r\n/** Each row: [columnId, type, method, value, valueTo?, endColumnId?] — validated after parse */\r\nconst filtersRawSchema = z.array(z.array(z.string()).min(4).max(6));\r\n\r\n/** Escape `\\`, `|`, `;` so we can split filters without JSON quotes/brackets. */\r\nfunction escapeFilterField(raw: string): string {\r\n return raw.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\|/g, \"\\\\|\").replace(/;/g, \"\\\\;\");\r\n}\r\n\r\nfunction unescapeFilterField(encoded: string): string {\r\n let out = \"\";\r\n for (let i = 0; i < encoded.length; i++) {\r\n const c = encoded[i];\r\n if (c === \"\\\\\" && i + 1 < encoded.length) {\r\n const next = encoded[i + 1];\r\n if (next === \"\\\\\" || next === \"|\" || next === \";\") {\r\n out += next;\r\n i++;\r\n continue;\r\n }\r\n }\r\n out += c;\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Split on `delimiter` only when not escaped as `\\` + delimiter.\r\n */\r\nfunction splitByEscapedDelimiter(s: string, delimiter: string): string[] {\r\n if (delimiter.length !== 1) {\r\n throw new Error(\"splitByEscapedDelimiter expects a single-character delimiter\");\r\n }\r\n const parts: string[] = [];\r\n let buf = \"\";\r\n for (let i = 0; i < s.length; i++) {\r\n const c = s[i];\r\n if (c === \"\\\\\" && i + 1 < s.length) {\r\n buf += c + s[i + 1];\r\n i++;\r\n continue;\r\n }\r\n if (c === delimiter) {\r\n parts.push(unescapeFilterField(buf));\r\n buf = \"\";\r\n continue;\r\n }\r\n buf += c;\r\n }\r\n parts.push(unescapeFilterField(buf));\r\n return parts;\r\n}\r\n\r\nfunction serializeFiltersParam(rows: string[][]): string {\r\n if (rows.length === 0) {\r\n return \"\";\r\n }\r\n return rows.map((row) => row.map(escapeFilterField).join(\"|\")).join(\";\");\r\n}\r\n\r\nfunction parseFiltersParam(value: string): string[][] | null {\r\n const trimmed = value.trim();\r\n if (trimmed === \"\") {\r\n return [];\r\n }\r\n const rowStrings = splitByEscapedDelimiter(trimmed, \";\");\r\n const rows: string[][] = [];\r\n for (const row of rowStrings) {\r\n if (row === \"\") {\r\n continue;\r\n }\r\n const fields = splitByEscapedDelimiter(row, \"|\");\r\n if (fields.length >= 4 && fields.length <= 6) {\r\n rows.push(fields);\r\n }\r\n }\r\n const parsed = filtersRawSchema.safeParse(rows);\r\n return parsed.success ? parsed.data : null;\r\n}\r\n\r\nconst parseAsFilterTuples = createParser<string[][]>({\r\n parse: (value) => parseFiltersParam(value),\r\n serialize: (rows) => serializeFiltersParam(rows),\r\n eq: (a, b) => JSON.stringify(a) === JSON.stringify(b),\r\n}).withDefault([]);\r\n\r\nconst parseAsGrouping = parseAsArrayOf(parseAsString).withDefault([]);\r\n\r\nconst NULLISH_METHODS: ReadonlySet<QueryFilter[\"method\"]> = new Set([\r\n \"isEmpty\",\r\n \"isNotEmpty\",\r\n \"is_null\",\r\n \"is_not_null\",\r\n]);\r\n\r\nfunction encodeFilterValue(filter: QueryFilter): string {\r\n if (NULLISH_METHODS.has(filter.method)) {\r\n return typeof filter.value === \"string\" ? filter.value : \"\";\r\n }\r\n const { type, method, value } = filter;\r\n switch (type) {\r\n case \"number\":\r\n return String(value as number);\r\n case \"boolean\":\r\n return (value as boolean) ? \"true\" : \"false\";\r\n case \"enum\":\r\n case \"jsonArray\":\r\n if (method === \"oneOf\" && Array.isArray(value)) {\r\n return JSON.stringify(value);\r\n }\r\n if (Array.isArray(value)) {\r\n return JSON.stringify(value);\r\n }\r\n return String(value);\r\n default:\r\n return String(value);\r\n }\r\n}\r\n\r\nfunction decodeFilterValue(\r\n type: QueryFilter[\"type\"],\r\n method: QueryFilter[\"method\"],\r\n valueStr: string\r\n): QueryFilter[\"value\"] {\r\n if (NULLISH_METHODS.has(method)) {\r\n return valueStr;\r\n }\r\n switch (type) {\r\n case \"number\": {\r\n const n = Number.parseFloat(valueStr);\r\n return Number.isNaN(n) ? 0 : n;\r\n }\r\n case \"boolean\":\r\n return valueStr === \"true\";\r\n case \"enum\":\r\n case \"jsonArray\":\r\n if (method === \"oneOf\") {\r\n try {\r\n const parsed = JSON.parse(valueStr) as unknown;\r\n return Array.isArray(parsed) ? parsed.map(String) : [];\r\n } catch {\r\n return [];\r\n }\r\n }\r\n if (valueStr.startsWith(\"[\")) {\r\n try {\r\n const parsed = JSON.parse(valueStr) as unknown;\r\n if (Array.isArray(parsed)) {\r\n return parsed.map(String);\r\n }\r\n } catch {\r\n /* use raw string */\r\n }\r\n }\r\n return valueStr;\r\n default:\r\n return valueStr;\r\n }\r\n}\r\n\r\n/** Builds URL tuple; omits optional tails when unused (endColumnId requires valueTo slot — may be \"\"). */\r\nfunction encodeFilterToTuple(filter: QueryFilter): string[] {\r\n const tuple: string[] = [filter.columnId, filter.type, filter.method, encodeFilterValue(filter)];\r\n const hasValueTo = filter.valueTo != null && filter.valueTo !== \"\";\r\n const hasEndColumnId = filter.endColumnId != null && filter.endColumnId !== \"\";\r\n\r\n if (hasValueTo && filter.valueTo != null) {\r\n tuple.push(filter.valueTo);\r\n }\r\n\r\n if (hasEndColumnId && filter.endColumnId != null) {\r\n if (!hasValueTo) {\r\n tuple.push(\"\");\r\n }\r\n tuple.push(filter.endColumnId);\r\n }\r\n\r\n return tuple;\r\n}\r\n\r\nfunction decodeTupleToFilter(parts: readonly string[]): QueryFilter | null {\r\n if (parts.length < 4 || parts.length > 6) {\r\n return null;\r\n }\r\n\r\n const [columnId, typeStr, methodStr, valueStr, valueToStr, endColumnIdStr] = parts;\r\n\r\n const typeParsed = filterSchema.shape.type.safeParse(typeStr);\r\n const methodParsed = filterSchema.shape.method.safeParse(methodStr);\r\n if (!typeParsed.success || !methodParsed.success) {\r\n return null;\r\n }\r\n\r\n const type = typeParsed.data;\r\n const method = methodParsed.data;\r\n const value = decodeFilterValue(type, method, valueStr);\r\n\r\n const candidate: QueryFilter = {\r\n columnId,\r\n type,\r\n method,\r\n value,\r\n };\r\n\r\n if (valueToStr !== undefined) {\r\n candidate.valueTo = valueToStr;\r\n }\r\n if (endColumnIdStr !== undefined) {\r\n candidate.endColumnId = endColumnIdStr;\r\n }\r\n\r\n const parsed = filterSchema.safeParse(candidate);\r\n return parsed.success ? parsed.data : null;\r\n}\r\n\r\nexport type Order = \"asc\" | \"desc\";\r\n\r\nexport type Granularity = \"daily\" | \"weekly\" | \"monthly\" | \"yearly\";\r\n\r\nexport interface NuqsQueryParams {\r\n /** Global search string from URL (`q`); absent when not in URL. */\r\n q: string | null;\r\n setQ: (value: string | null) => void;\r\n filters?: QueryFilters;\r\n setFilters?: (filters: QueryFilters) => void;\r\n granularity?: Granularity;\r\n setGranularity?: (value: Granularity) => void;\r\n sort?: string;\r\n order?: Order | null;\r\n setSorting?: (updater: Updater<SortingState>) => void;\r\n sorting?: SortingState;\r\n page?: number;\r\n limit?: number;\r\n setPagination?: (updater: Updater<PaginationState>) => void;\r\n pagination?: PaginationState;\r\n grouping: GroupingState;\r\n setGrouping: (updater: Updater<GroupingState>) => void;\r\n}\r\n\r\n/**\r\n * Hook to manage all query parameters via nuqs (URL query parameters)\r\n * Manages: `f` (filters as tuple arrays), `q`, `s`/`o`, `p`/`l`, `g`, `r`\r\n * Accepts an optional prefix to namespace params when multiple tables share a view.\r\n */\r\nexport const useNuqsQueryParams = (prefix?: string): NuqsQueryParams => {\r\n const k = (name: string) => (prefix ? `${prefix}_${name}` : name);\r\n\r\n const [sort, setSort] = useQueryState<string>(k(\"s\"), parseAsString.withDefault(\"\"));\r\n const [order, setOrder] = useQueryState<Order>(k(\"o\"), parseAsStringLiteral([\"asc\", \"desc\"]));\r\n const [page, setPage] = useQueryState<number>(k(\"p\"), parseAsInteger.withDefault(1));\r\n const [limit, setLimit] = useQueryState<number>(k(\"l\"), parseAsInteger.withDefault(10));\r\n const [qRaw, setQRaw] = useQueryState(k(\"q\"), parseAsString);\r\n const [filtersRaw, setFiltersRaw] = useQueryState<string[][]>(k(\"f\"), parseAsFilterTuples);\r\n\r\n const filters = useMemo((): QueryFilters => {\r\n const decoded = filtersRaw\r\n .map((row) => decodeTupleToFilter(row))\r\n .filter((f): f is QueryFilter => f != null);\r\n const parsed = filtersSchema.safeParse(decoded);\r\n return parsed.success ? parsed.data : [];\r\n }, [filtersRaw]);\r\n\r\n const setFilters = useCallback(\r\n (next: QueryFilters) => {\r\n void setFiltersRaw(next.length === 0 ? null : next.map(encodeFilterToTuple));\r\n },\r\n [setFiltersRaw]\r\n );\r\n\r\n const setQ = useCallback(\r\n (value: string | null) => {\r\n void setQRaw(value === \"\" || value == null ? null : value);\r\n },\r\n [setQRaw]\r\n );\r\n const [granularity, setGranularity] = useQueryState<Granularity>(\r\n k(\"r\"),\r\n parseAsStringLiteral([\"daily\", \"weekly\", \"monthly\", \"yearly\"]).withDefault(\"daily\")\r\n );\r\n const [groupingRaw, setGroupingRaw] = useQueryState<string[]>(k(\"g\"), parseAsGrouping);\r\n const grouping: GroupingState = groupingRaw;\r\n\r\n const setGrouping = useCallback(\r\n (updater: Updater<GroupingState>) => {\r\n const next = typeof updater === \"function\" ? updater(groupingRaw) : updater;\r\n setGroupingRaw(next.length > 0 ? next : null);\r\n },\r\n [groupingRaw, setGroupingRaw]\r\n );\r\n\r\n const sorting = useMemo(() => {\r\n if (!sort) {\r\n return [];\r\n }\r\n const effectiveOrder = order ?? \"asc\";\r\n return [{ id: sort, desc: effectiveOrder === \"desc\" }];\r\n }, [sort, order]);\r\n\r\n const pagination = useMemo(() => ({ pageIndex: page - 1, pageSize: limit }), [page, limit]);\r\n\r\n const setSorting = useCallback(\r\n (updater: Updater<SortingState>) => {\r\n const currentSorting: SortingState = sort\r\n ? [{ id: sort, desc: (order ?? \"asc\") === \"desc\" }]\r\n : [];\r\n\r\n const next = typeof updater === \"function\" ? updater(currentSorting) : updater;\r\n const first = next[0];\r\n\r\n if (!first || !first.id) {\r\n setSort(\"\");\r\n setOrder(null);\r\n return;\r\n }\r\n\r\n setSort(first.id);\r\n setOrder(first.desc ? \"desc\" : \"asc\");\r\n },\r\n [sort, order, setSort, setOrder]\r\n );\r\n\r\n useEffect(() => {\r\n if (sort && !order) {\r\n setOrder(\"asc\");\r\n }\r\n }, [sort, order, setOrder]);\r\n\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: dependent on page and limit only\r\n const setPagination = useCallback(\r\n (updater: Updater<PaginationState>) => {\r\n const currentState = { pageIndex: page - 1, pageSize: limit };\r\n const next = typeof updater === \"function\" ? updater(currentState) : updater;\r\n setPage((next.pageIndex ?? 0) + 1);\r\n setLimit(next.pageSize ?? 10);\r\n },\r\n [page, limit]\r\n );\r\n\r\n return useMemo(\r\n () => ({\r\n q: qRaw,\r\n setQ,\r\n filters,\r\n setFilters,\r\n granularity,\r\n setGranularity,\r\n sort,\r\n order,\r\n setSorting,\r\n sorting,\r\n page,\r\n limit,\r\n setPagination,\r\n pagination,\r\n grouping,\r\n setGrouping,\r\n }),\r\n [\r\n qRaw,\r\n setQ,\r\n filters,\r\n setFilters,\r\n granularity,\r\n setGranularity,\r\n sort,\r\n order,\r\n setSorting,\r\n sorting,\r\n page,\r\n limit,\r\n setPagination,\r\n pagination,\r\n grouping,\r\n setGrouping,\r\n ]\r\n );\r\n};\r\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useNuqsQueryParams.mjs","names":[],"sources":["../../../../../src/modules/table/hooks/useNuqsQueryParams.ts"],"sourcesContent":["import type { QueryFilter, QueryFilters } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport { filterSchema, filtersSchema } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport type { GroupingState, PaginationState, SortingState, Updater } from \"@tanstack/react-table\";\r\nimport {\r\n createParser,\r\n parseAsArrayOf,\r\n parseAsInteger,\r\n parseAsString,\r\n parseAsStringLiteral,\r\n useQueryState,\r\n} from \"nuqs\";\r\nimport { useCallback, useEffect, useMemo } from \"react\";\r\nimport { z } from \"zod\";\r\n\r\n/** Each row: [columnId, type, method, value, valueTo?, endColumnId?] — validated after parse */\r\nconst filtersRawSchema = z.array(z.array(z.string()).min(4).max(6));\r\n\r\n/** Escape `\\`, `|`, `;` so we can split filters without JSON quotes/brackets. */\r\nfunction escapeFilterField(raw: string): string {\r\n return raw.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\|/g, \"\\\\|\").replace(/;/g, \"\\\\;\");\r\n}\r\n\r\nfunction unescapeFilterField(encoded: string): string {\r\n let out = \"\";\r\n for (let i = 0; i < encoded.length; i++) {\r\n const c = encoded[i];\r\n if (c === \"\\\\\" && i + 1 < encoded.length) {\r\n const next = encoded[i + 1];\r\n if (next === \"\\\\\" || next === \"|\" || next === \";\") {\r\n out += next;\r\n i++;\r\n continue;\r\n }\r\n }\r\n out += c;\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Split on `delimiter` only when not escaped as `\\` + delimiter.\r\n */\r\nfunction splitByEscapedDelimiter(s: string, delimiter: string): string[] {\r\n if (delimiter.length !== 1) {\r\n throw new Error(\"splitByEscapedDelimiter expects a single-character delimiter\");\r\n }\r\n const parts: string[] = [];\r\n let buf = \"\";\r\n for (let i = 0; i < s.length; i++) {\r\n const c = s[i];\r\n if (c === \"\\\\\" && i + 1 < s.length) {\r\n buf += c + s[i + 1];\r\n i++;\r\n continue;\r\n }\r\n if (c === delimiter) {\r\n parts.push(unescapeFilterField(buf));\r\n buf = \"\";\r\n continue;\r\n }\r\n buf += c;\r\n }\r\n parts.push(unescapeFilterField(buf));\r\n return parts;\r\n}\r\n\r\nfunction serializeFiltersParam(rows: string[][]): string {\r\n if (rows.length === 0) {\r\n return \"\";\r\n }\r\n return rows.map((row) => row.map(escapeFilterField).join(\"|\")).join(\";\");\r\n}\r\n\r\nfunction parseFiltersParam(value: string): string[][] | null {\r\n const trimmed = value.trim();\r\n if (trimmed === \"\") {\r\n return [];\r\n }\r\n const rowStrings = splitByEscapedDelimiter(trimmed, \";\");\r\n const rows: string[][] = [];\r\n for (const row of rowStrings) {\r\n if (row === \"\") {\r\n continue;\r\n }\r\n const fields = splitByEscapedDelimiter(row, \"|\");\r\n if (fields.length >= 4 && fields.length <= 6) {\r\n rows.push(fields);\r\n }\r\n }\r\n const parsed = filtersRawSchema.safeParse(rows);\r\n return parsed.success ? parsed.data : null;\r\n}\r\n\r\nconst parseAsFilterTuples = createParser<string[][]>({\r\n parse: (value) => parseFiltersParam(value),\r\n serialize: (rows) => serializeFiltersParam(rows),\r\n eq: (a, b) => JSON.stringify(a) === JSON.stringify(b),\r\n}).withDefault([]);\r\n\r\nconst parseAsGrouping = parseAsArrayOf(parseAsString).withDefault([]);\r\n\r\nconst NULLISH_METHODS: ReadonlySet<QueryFilter[\"method\"]> = new Set([\r\n \"isEmpty\",\r\n \"isNotEmpty\",\r\n \"is_null\",\r\n \"is_not_null\",\r\n]);\r\n\r\nfunction encodeFilterValue(filter: QueryFilter): string {\r\n if (NULLISH_METHODS.has(filter.method)) {\r\n return typeof filter.value === \"string\" ? filter.value : \"\";\r\n }\r\n const { type, method, value } = filter;\r\n switch (type) {\r\n case \"number\":\r\n return String(value as number);\r\n case \"boolean\":\r\n return (value as boolean) ? \"true\" : \"false\";\r\n case \"enum\":\r\n case \"jsonArray\":\r\n if (method === \"oneOf\" && Array.isArray(value)) {\r\n return JSON.stringify(value);\r\n }\r\n if (Array.isArray(value)) {\r\n return JSON.stringify(value);\r\n }\r\n return String(value);\r\n default:\r\n return String(value);\r\n }\r\n}\r\n\r\nfunction decodeFilterValue(\r\n type: QueryFilter[\"type\"],\r\n method: QueryFilter[\"method\"],\r\n valueStr: string\r\n): QueryFilter[\"value\"] {\r\n if (NULLISH_METHODS.has(method)) {\r\n return valueStr;\r\n }\r\n switch (type) {\r\n case \"number\": {\r\n const n = Number.parseFloat(valueStr);\r\n return Number.isNaN(n) ? 0 : n;\r\n }\r\n case \"boolean\":\r\n return valueStr === \"true\";\r\n case \"enum\":\r\n case \"jsonArray\":\r\n if (method === \"oneOf\") {\r\n try {\r\n const parsed = JSON.parse(valueStr) as unknown;\r\n return Array.isArray(parsed) ? parsed.map(String) : [];\r\n } catch {\r\n return [];\r\n }\r\n }\r\n if (valueStr.startsWith(\"[\")) {\r\n try {\r\n const parsed = JSON.parse(valueStr) as unknown;\r\n if (Array.isArray(parsed)) {\r\n return parsed.map(String);\r\n }\r\n } catch {\r\n /* use raw string */\r\n }\r\n }\r\n return valueStr;\r\n default:\r\n return valueStr;\r\n }\r\n}\r\n\r\n/** Builds URL tuple; omits optional tails when unused (endColumnId requires valueTo slot — may be \"\"). */\r\nfunction encodeFilterToTuple(filter: QueryFilter): string[] {\r\n const tuple: string[] = [filter.columnId, filter.type, filter.method, encodeFilterValue(filter)];\r\n const hasValueTo = filter.valueTo != null && filter.valueTo !== \"\";\r\n const hasEndColumnId = filter.endColumnId != null && filter.endColumnId !== \"\";\r\n\r\n if (hasValueTo && filter.valueTo != null) {\r\n tuple.push(filter.valueTo);\r\n }\r\n\r\n if (hasEndColumnId && filter.endColumnId != null) {\r\n if (!hasValueTo) {\r\n tuple.push(\"\");\r\n }\r\n tuple.push(filter.endColumnId);\r\n }\r\n\r\n return tuple;\r\n}\r\n\r\nfunction decodeTupleToFilter(parts: readonly string[]): QueryFilter | null {\r\n if (parts.length < 4 || parts.length > 6) {\r\n return null;\r\n }\r\n\r\n const [columnId, typeStr, methodStr, valueStr, valueToStr, endColumnIdStr] = parts;\r\n\r\n const typeParsed = filterSchema.shape.type.safeParse(typeStr);\r\n const methodParsed = filterSchema.shape.method.safeParse(methodStr);\r\n if (!typeParsed.success || !methodParsed.success) {\r\n return null;\r\n }\r\n\r\n const type = typeParsed.data;\r\n const method = methodParsed.data;\r\n const value = decodeFilterValue(type, method, valueStr);\r\n\r\n const candidate: QueryFilter = {\r\n columnId,\r\n type,\r\n method,\r\n value,\r\n };\r\n\r\n if (valueToStr !== undefined) {\r\n candidate.valueTo = valueToStr;\r\n }\r\n if (endColumnIdStr !== undefined) {\r\n candidate.endColumnId = endColumnIdStr;\r\n }\r\n\r\n const parsed = filterSchema.safeParse(candidate);\r\n return parsed.success ? parsed.data : null;\r\n}\r\n\r\nexport type Order = \"asc\" | \"desc\";\r\n\r\nexport type Granularity = \"daily\" | \"weekly\" | \"monthly\" | \"yearly\";\r\n\r\nexport interface NuqsQueryParams {\r\n /** Global search string from URL (`q`); absent when not in URL. */\r\n q: string | null;\r\n setQ: (value: string | null) => void;\r\n filters?: QueryFilters;\r\n setFilters?: (filters: QueryFilters) => void;\r\n granularity?: Granularity;\r\n setGranularity?: (value: Granularity) => void;\r\n sort?: string;\r\n order?: Order | null;\r\n setSorting?: (updater: Updater<SortingState>) => void;\r\n sorting?: SortingState;\r\n page?: number;\r\n limit?: number;\r\n setPagination?: (updater: Updater<PaginationState>) => void;\r\n pagination?: PaginationState;\r\n grouping: GroupingState;\r\n setGrouping: (updater: Updater<GroupingState>) => void;\r\n}\r\n\r\n/**\r\n * Hook to manage all query parameters via nuqs (URL query parameters)\r\n * Manages: `f` (filters as tuple arrays), `q`, `s`/`o`, `p`/`l`, `g`, `r`\r\n * Accepts an optional prefix to namespace params when multiple tables share a view.\r\n */\r\nexport const useNuqsQueryParams = (prefix?: string): NuqsQueryParams => {\r\n const k = (name: string) => (prefix ? `${prefix}_${name}` : name);\r\n\r\n const [sort, setSort] = useQueryState<string>(k(\"s\"), parseAsString.withDefault(\"\"));\r\n const [order, setOrder] = useQueryState<Order>(k(\"o\"), parseAsStringLiteral([\"asc\", \"desc\"]));\r\n const [page, setPage] = useQueryState<number>(k(\"p\"), parseAsInteger.withDefault(1));\r\n const [limit, setLimit] = useQueryState<number>(k(\"l\"), parseAsInteger.withDefault(10));\r\n const [qRaw, setQRaw] = useQueryState(k(\"q\"), parseAsString);\r\n const [filtersRaw, setFiltersRaw] = useQueryState<string[][]>(k(\"f\"), parseAsFilterTuples);\r\n\r\n const filters = useMemo((): QueryFilters => {\r\n const decoded = filtersRaw\r\n .map((row) => decodeTupleToFilter(row))\r\n .filter((f): f is QueryFilter => f != null);\r\n const parsed = filtersSchema.safeParse(decoded);\r\n return parsed.success ? parsed.data : [];\r\n }, [filtersRaw]);\r\n\r\n const setFilters = useCallback(\r\n (next: QueryFilters) => {\r\n void setFiltersRaw(next.length === 0 ? null : next.map(encodeFilterToTuple));\r\n },\r\n [setFiltersRaw]\r\n );\r\n\r\n const setQ = useCallback(\r\n (value: string | null) => {\r\n void setQRaw(value === \"\" || value == null ? null : value);\r\n },\r\n [setQRaw]\r\n );\r\n const [granularity, setGranularity] = useQueryState<Granularity>(\r\n k(\"r\"),\r\n parseAsStringLiteral([\"daily\", \"weekly\", \"monthly\", \"yearly\"]).withDefault(\"daily\")\r\n );\r\n const [groupingRaw, setGroupingRaw] = useQueryState<string[]>(k(\"g\"), parseAsGrouping);\r\n const grouping: GroupingState = groupingRaw;\r\n\r\n const setGrouping = useCallback(\r\n (updater: Updater<GroupingState>) => {\r\n const next = typeof updater === \"function\" ? updater(groupingRaw) : updater;\r\n setGroupingRaw(next.length > 0 ? next : null);\r\n },\r\n [groupingRaw, setGroupingRaw]\r\n );\r\n\r\n const sorting = useMemo(() => {\r\n if (!sort) {\r\n return [];\r\n }\r\n const effectiveOrder = order ?? \"asc\";\r\n return [{ id: sort, desc: effectiveOrder === \"desc\" }];\r\n }, [sort, order]);\r\n\r\n const pagination = useMemo(() => ({ pageIndex: page - 1, pageSize: limit }), [page, limit]);\r\n\r\n const setSorting = useCallback(\r\n (updater: Updater<SortingState>) => {\r\n const currentSorting: SortingState = sort\r\n ? [{ id: sort, desc: (order ?? \"asc\") === \"desc\" }]\r\n : [];\r\n\r\n const next = typeof updater === \"function\" ? updater(currentSorting) : updater;\r\n const first = next[0];\r\n\r\n if (!first || !first.id) {\r\n setSort(\"\");\r\n setOrder(null);\r\n return;\r\n }\r\n\r\n setSort(first.id);\r\n setOrder(first.desc ? \"desc\" : \"asc\");\r\n },\r\n [sort, order, setSort, setOrder]\r\n );\r\n\r\n useEffect(() => {\r\n if (sort && !order) {\r\n setOrder(\"asc\");\r\n }\r\n }, [sort, order, setOrder]);\r\n\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: dependent on page and limit only\r\n const setPagination = useCallback(\r\n (updater: Updater<PaginationState>) => {\r\n const currentState = { pageIndex: page - 1, pageSize: limit };\r\n const next = typeof updater === \"function\" ? updater(currentState) : updater;\r\n setPage((next.pageIndex ?? 0) + 1);\r\n setLimit(next.pageSize ?? 10);\r\n },\r\n [page, limit]\r\n );\r\n\r\n return useMemo(\r\n () => ({\r\n q: qRaw,\r\n setQ,\r\n filters,\r\n setFilters,\r\n granularity,\r\n setGranularity,\r\n sort,\r\n order,\r\n setSorting,\r\n sorting,\r\n page,\r\n limit,\r\n setPagination,\r\n pagination,\r\n grouping,\r\n setGrouping,\r\n }),\r\n [\r\n qRaw,\r\n setQ,\r\n filters,\r\n setFilters,\r\n granularity,\r\n setGranularity,\r\n sort,\r\n order,\r\n setSorting,\r\n sorting,\r\n page,\r\n limit,\r\n setPagination,\r\n pagination,\r\n grouping,\r\n setGrouping,\r\n ]\r\n );\r\n};\r\n"],"mappings":"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"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { NuqsQueryParams } from "./useNuqsQueryParams.mjs";
|
|
2
|
-
import { UseQueryOptions, UseQueryResult } from "@tanstack/react-query";
|
|
3
|
-
import { QueryFilters } from "@m5kdev/commons/modules/schemas/query.schema";
|
|
4
|
-
import { RowSelectionState, Updater } from "@tanstack/react-table";
|
|
5
|
-
|
|
6
|
-
//#region src/modules/table/hooks/useNuqsTable.d.ts
|
|
7
|
-
interface TableParams extends NuqsQueryParams {
|
|
8
|
-
rowSelection: RowSelectionState;
|
|
9
|
-
setRowSelection: (updater: Updater<RowSelectionState>) => void;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Alias for TableParams - used by TablePagination and other table components
|
|
13
|
-
*/
|
|
14
|
-
type TableProps = TableParams;
|
|
15
|
-
interface NuqsTableReturn<TData> {
|
|
16
|
-
params: TableParams;
|
|
17
|
-
query: UseQueryResult<TData>;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Flexible query options type that accepts both standard TanStack Query options
|
|
21
|
-
* and tRPC's queryOptions function return type.
|
|
22
|
-
* Uses permissive generics to handle type differences between TanStack Query and tRPC.
|
|
23
|
-
*/
|
|
24
|
-
type QueryOptionsLike<TData> = UseQueryOptions<TData, any, TData, any>;
|
|
25
|
-
/**
|
|
26
|
-
* Function type that accepts both standard query options functions and tRPC's queryOptions.
|
|
27
|
-
* tRPC's queryOptions accepts (input, opts?) while standard functions may only accept (input).
|
|
28
|
-
*/
|
|
29
|
-
type GetQueryOptionsFn<TInput, TData> = (input: TInput, ...args: any[]) => QueryOptionsLike<TData>;
|
|
30
|
-
interface NuqsTableOptions<TInput, TData> {
|
|
31
|
-
getQueryOptions: GetQueryOptionsFn<TInput, TData>;
|
|
32
|
-
queryParams?: TInput;
|
|
33
|
-
prefix?: string;
|
|
34
|
-
additionalFilters?: QueryFilters;
|
|
35
|
-
onAdditionalFiltersChange?: (filters: QueryFilters) => void;
|
|
36
|
-
}
|
|
37
|
-
declare const useNuqsTable: <TInput, TData>({
|
|
38
|
-
getQueryOptions,
|
|
39
|
-
queryParams,
|
|
40
|
-
prefix,
|
|
41
|
-
additionalFilters,
|
|
42
|
-
onAdditionalFiltersChange
|
|
43
|
-
}: NuqsTableOptions<TInput, TData>) => NuqsTableReturn<TData>;
|
|
44
|
-
//#endregion
|
|
45
|
-
export { NuqsTableOptions, NuqsTableReturn, TableParams, TableProps, useNuqsTable as default };
|
|
46
|
-
//# sourceMappingURL=useNuqsTable.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useNuqsTable.d.mts","names":[],"sources":["../../../../../src/modules/table/hooks/useNuqsTable.ts"],"mappings":";;;;;;UAOiB,WAAA,SAAoB,eAAA;EACnC,YAAA,EAAc,iBAAA;EACd,eAAA,GAAkB,OAAA,EAAS,OAAA,CAAQ,iBAAA;AAAA;;;;KAMzB,UAAA,GAAa,WAAA;AAAA,UAER,eAAA;EACf,MAAA,EAAQ,WAAA;EACR,KAAA,EAAO,cAAA,CAAe,KAAA;AAAA;;;;;;KASnB,gBAAA,UAA0B,eAAA,CAAgB,KAAA,OAAY,KAAA;;;AAb3D;;KAoBK,iBAAA,mBAAoC,KAAA,EAAO,MAAA,KAAW,IAAA,YAAgB,gBAAA,CAAiB,KAAA;AAAA,UAE3E,gBAAA;EACf,eAAA,EAAiB,iBAAA,CAAkB,MAAA,EAAQ,KAAA;EAC3C,WAAA,GAAc,MAAA;EACd,MAAA;EACA,iBAAA,GAAoB,YAAA;EACpB,yBAAA,IAA6B,OAAA,EAAS,YAAA;AAAA;AAAA,cAGlC,YAAA;EAA+B,eAAA;EAAA,WAAA;EAAA,MAAA;EAAA,iBAAA;EAAA;AAAA,GAMlC,gBAAA,CAAiB,MAAA,EAAQ,KAAA,MAAS,eAAA,CAAgB,KAAA"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { NuqsQueryParams } from "./useNuqsQueryParams.js";
|
|
2
|
-
import { UseQueryOptions, UseQueryResult } from "@tanstack/react-query";
|
|
3
|
-
import { QueryFilters } from "@m5kdev/commons/modules/schemas/query.schema";
|
|
4
|
-
import { RowSelectionState, Updater } from "@tanstack/react-table";
|
|
5
|
-
|
|
6
|
-
//#region src/modules/table/hooks/useNuqsTable.d.ts
|
|
7
|
-
interface TableParams extends NuqsQueryParams {
|
|
8
|
-
rowSelection: RowSelectionState;
|
|
9
|
-
setRowSelection: (updater: Updater<RowSelectionState>) => void;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Alias for TableParams - used by TablePagination and other table components
|
|
13
|
-
*/
|
|
14
|
-
type TableProps = TableParams;
|
|
15
|
-
interface NuqsTableReturn<TData> {
|
|
16
|
-
params: TableParams;
|
|
17
|
-
query: UseQueryResult<TData>;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Flexible query options type that accepts both standard TanStack Query options
|
|
21
|
-
* and tRPC's queryOptions function return type.
|
|
22
|
-
* Uses permissive generics to handle type differences between TanStack Query and tRPC.
|
|
23
|
-
*/
|
|
24
|
-
type QueryOptionsLike<TData> = UseQueryOptions<TData, any, TData, any>;
|
|
25
|
-
/**
|
|
26
|
-
* Function type that accepts both standard query options functions and tRPC's queryOptions.
|
|
27
|
-
* tRPC's queryOptions accepts (input, opts?) while standard functions may only accept (input).
|
|
28
|
-
*/
|
|
29
|
-
type GetQueryOptionsFn<TInput, TData> = (input: TInput, ...args: any[]) => QueryOptionsLike<TData>;
|
|
30
|
-
interface NuqsTableOptions<TInput, TData> {
|
|
31
|
-
getQueryOptions: GetQueryOptionsFn<TInput, TData>;
|
|
32
|
-
queryParams?: TInput;
|
|
33
|
-
prefix?: string;
|
|
34
|
-
additionalFilters?: QueryFilters;
|
|
35
|
-
onAdditionalFiltersChange?: (filters: QueryFilters) => void;
|
|
36
|
-
}
|
|
37
|
-
declare const useNuqsTable: <TInput, TData>({
|
|
38
|
-
getQueryOptions,
|
|
39
|
-
queryParams,
|
|
40
|
-
prefix,
|
|
41
|
-
additionalFilters,
|
|
42
|
-
onAdditionalFiltersChange
|
|
43
|
-
}: NuqsTableOptions<TInput, TData>) => NuqsTableReturn<TData>;
|
|
44
|
-
//#endregion
|
|
45
|
-
export { NuqsTableOptions, NuqsTableReturn, TableParams, TableProps, useNuqsTable as default };
|
|
46
|
-
//# sourceMappingURL=useNuqsTable.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useNuqsTable.d.ts","names":[],"sources":["../../../../../src/modules/table/hooks/useNuqsTable.ts"],"mappings":";;;;;;UAOiB,WAAA,SAAoB,eAAA;EACnC,YAAA,EAAc,iBAAA;EACd,eAAA,GAAkB,OAAA,EAAS,OAAA,CAAQ,iBAAA;AAAA;;;;KAMzB,UAAA,GAAa,WAAA;AAAA,UAER,eAAA;EACf,MAAA,EAAQ,WAAA;EACR,KAAA,EAAO,cAAA,CAAe,KAAA;AAAA;;;;;;KASnB,gBAAA,UAA0B,eAAA,CAAgB,KAAA,OAAY,KAAA;;;AAb3D;;KAoBK,iBAAA,mBAAoC,KAAA,EAAO,MAAA,KAAW,IAAA,YAAgB,gBAAA,CAAiB,KAAA;AAAA,UAE3E,gBAAA;EACf,eAAA,EAAiB,iBAAA,CAAkB,MAAA,EAAQ,KAAA;EAC3C,WAAA,GAAc,MAAA;EACd,MAAA;EACA,iBAAA,GAAoB,YAAA;EACpB,yBAAA,IAA6B,OAAA,EAAS,YAAA;AAAA;AAAA,cAGlC,YAAA;EAA+B,eAAA;EAAA,WAAA;EAAA,MAAA;EAAA,iBAAA;EAAA;AAAA,GAMlC,gBAAA,CAAiB,MAAA,EAAQ,KAAA,MAAS,eAAA,CAAgB,KAAA"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
const require_src_modules_table_hooks_useNuqsQueryParams = require("./useNuqsQueryParams.js");
|
|
2
|
-
const require_src_modules_table_hooks_useQueryWithParams = require("./useQueryWithParams.js");
|
|
3
|
-
let react = require("react");
|
|
4
|
-
//#region src/modules/table/hooks/useNuqsTable.ts
|
|
5
|
-
const useNuqsTable = ({ getQueryOptions, queryParams = {}, prefix, additionalFilters, onAdditionalFiltersChange }) => {
|
|
6
|
-
const queryState = require_src_modules_table_hooks_useNuqsQueryParams.useNuqsQueryParams(prefix);
|
|
7
|
-
const queryResult = require_src_modules_table_hooks_useQueryWithParams.useQueryWithParams({
|
|
8
|
-
getQueryOptions,
|
|
9
|
-
queryParams,
|
|
10
|
-
queryState,
|
|
11
|
-
grouping: queryState.grouping,
|
|
12
|
-
additionalFilters
|
|
13
|
-
});
|
|
14
|
-
const [rowSelection, setRowSelectionRaw] = (0, react.useState)({});
|
|
15
|
-
const setRowSelection = (0, react.useCallback)((updater) => {
|
|
16
|
-
setRowSelectionRaw((prev) => {
|
|
17
|
-
return typeof updater === "function" ? updater(prev) : updater;
|
|
18
|
-
});
|
|
19
|
-
}, []);
|
|
20
|
-
const displayFilters = (0, react.useMemo)(() => {
|
|
21
|
-
if (!additionalFilters?.length) return queryState.filters ?? [];
|
|
22
|
-
return [...additionalFilters, ...queryState.filters ?? []];
|
|
23
|
-
}, [additionalFilters, queryState.filters]);
|
|
24
|
-
const additionalColumnIds = (0, react.useMemo)(() => new Set(additionalFilters?.map((f) => f.columnId) ?? []), [additionalFilters]);
|
|
25
|
-
const wrappedSetFilters = (0, react.useCallback)((newFilters) => {
|
|
26
|
-
if (!additionalColumnIds.size) {
|
|
27
|
-
queryState.setFilters?.(newFilters);
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
const ownFilters = newFilters.filter((f) => !additionalColumnIds.has(f.columnId));
|
|
31
|
-
queryState.setFilters?.(ownFilters);
|
|
32
|
-
if (onAdditionalFiltersChange) onAdditionalFiltersChange(newFilters.filter((f) => additionalColumnIds.has(f.columnId)));
|
|
33
|
-
}, [
|
|
34
|
-
additionalColumnIds,
|
|
35
|
-
queryState.setFilters,
|
|
36
|
-
onAdditionalFiltersChange
|
|
37
|
-
]);
|
|
38
|
-
return {
|
|
39
|
-
params: (0, react.useMemo)(() => ({
|
|
40
|
-
...queryState,
|
|
41
|
-
filters: displayFilters,
|
|
42
|
-
setFilters: wrappedSetFilters,
|
|
43
|
-
rowSelection,
|
|
44
|
-
setRowSelection
|
|
45
|
-
}), [
|
|
46
|
-
queryState,
|
|
47
|
-
displayFilters,
|
|
48
|
-
wrappedSetFilters,
|
|
49
|
-
rowSelection,
|
|
50
|
-
setRowSelection
|
|
51
|
-
]),
|
|
52
|
-
query: queryResult
|
|
53
|
-
};
|
|
54
|
-
};
|
|
55
|
-
//#endregion
|
|
56
|
-
module.exports = useNuqsTable;
|
|
57
|
-
|
|
58
|
-
//# sourceMappingURL=useNuqsTable.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useNuqsTable.js","names":["useNuqsQueryParams","useQueryWithParams"],"sources":["../../../../../src/modules/table/hooks/useNuqsTable.ts"],"sourcesContent":["import type { QueryFilters } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport type { UseQueryOptions, UseQueryResult } from \"@tanstack/react-query\";\r\nimport type { RowSelectionState, Updater } from \"@tanstack/react-table\";\r\nimport { useCallback, useMemo, useState } from \"react\";\r\nimport { type NuqsQueryParams, useNuqsQueryParams } from \"./useNuqsQueryParams\";\r\nimport { useQueryWithParams } from \"./useQueryWithParams\";\r\n\r\nexport interface TableParams extends NuqsQueryParams {\r\n rowSelection: RowSelectionState;\r\n setRowSelection: (updater: Updater<RowSelectionState>) => void;\r\n}\r\n\r\n/**\r\n * Alias for TableParams - used by TablePagination and other table components\r\n */\r\nexport type TableProps = TableParams;\r\n\r\nexport interface NuqsTableReturn<TData> {\r\n params: TableParams;\r\n query: UseQueryResult<TData>;\r\n}\r\n\r\n/**\r\n * Flexible query options type that accepts both standard TanStack Query options\r\n * and tRPC's queryOptions function return type.\r\n * Uses permissive generics to handle type differences between TanStack Query and tRPC.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype QueryOptionsLike<TData> = UseQueryOptions<TData, any, TData, any>;\r\n\r\n/**\r\n * Function type that accepts both standard query options functions and tRPC's queryOptions.\r\n * tRPC's queryOptions accepts (input, opts?) while standard functions may only accept (input).\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype GetQueryOptionsFn<TInput, TData> = (input: TInput, ...args: any[]) => QueryOptionsLike<TData>;\r\n\r\nexport interface NuqsTableOptions<TInput, TData> {\r\n getQueryOptions: GetQueryOptionsFn<TInput, TData>;\r\n queryParams?: TInput;\r\n prefix?: string;\r\n additionalFilters?: QueryFilters;\r\n onAdditionalFiltersChange?: (filters: QueryFilters) => void;\r\n}\r\n\r\nconst useNuqsTable = <TInput, TData>({\r\n getQueryOptions,\r\n queryParams = {} as TInput,\r\n prefix,\r\n additionalFilters,\r\n onAdditionalFiltersChange,\r\n}: NuqsTableOptions<TInput, TData>): NuqsTableReturn<TData> => {\r\n // Get all URL query state (includes grouping)\r\n const queryState = useNuqsQueryParams(prefix);\r\n\r\n // Get query result — passes grouping so limit can be overridden when grouped\r\n const queryResult = useQueryWithParams({\r\n getQueryOptions,\r\n queryParams,\r\n queryState,\r\n grouping: queryState.grouping,\r\n additionalFilters,\r\n });\r\n\r\n // Table-specific row selection state\r\n const [rowSelection, setRowSelectionRaw] = useState<RowSelectionState>({});\r\n\r\n const setRowSelection = useCallback((updater: Updater<RowSelectionState>) => {\r\n setRowSelectionRaw((prev: RowSelectionState) => {\r\n const next = typeof updater === \"function\" ? updater(prev) : updater;\r\n return next;\r\n });\r\n }, []);\r\n\r\n // Merge additionalFilters into displayed filters so the table UI shows all active filters.\r\n // On write, strip the additional filters so only the table's own go to the prefixed URL param.\r\n const displayFilters = useMemo<QueryFilters>(() => {\r\n if (!additionalFilters?.length) return queryState.filters ?? [];\r\n return [...additionalFilters, ...(queryState.filters ?? [])];\r\n }, [additionalFilters, queryState.filters]);\r\n\r\n const additionalColumnIds = useMemo(\r\n () => new Set(additionalFilters?.map((f) => f.columnId) ?? []),\r\n [additionalFilters]\r\n );\r\n\r\n const wrappedSetFilters = useCallback(\r\n (newFilters: QueryFilters) => {\r\n if (!additionalColumnIds.size) {\r\n queryState.setFilters?.(newFilters);\r\n return;\r\n }\r\n const ownFilters = newFilters.filter((f) => !additionalColumnIds.has(f.columnId));\r\n queryState.setFilters?.(ownFilters);\r\n\r\n if (onAdditionalFiltersChange) {\r\n const updatedAdditional = newFilters.filter((f) => additionalColumnIds.has(f.columnId));\r\n onAdditionalFiltersChange(updatedAdditional);\r\n }\r\n },\r\n [additionalColumnIds, queryState.setFilters, onAdditionalFiltersChange]\r\n );\r\n\r\n const params = useMemo(\r\n () => ({\r\n ...queryState,\r\n filters: displayFilters,\r\n setFilters: wrappedSetFilters,\r\n rowSelection,\r\n setRowSelection,\r\n }),\r\n [queryState, displayFilters, wrappedSetFilters, rowSelection, setRowSelection]\r\n );\r\n\r\n return {\r\n params,\r\n query: queryResult,\r\n };\r\n};\r\n\r\nexport default useNuqsTable;\r\n"],"mappings":";;;;AA6CA,MAAM,gBAA+B,EACnC,iBACA,cAAc,EAAE,EAChB,QACA,mBACA,gCAC6D;CAE7D,MAAM,aAAaA,mDAAAA,mBAAmB,OAAO;CAG7C,MAAM,cAAcC,mDAAAA,mBAAmB;EACrC;EACA;EACA;EACA,UAAU,WAAW;EACrB;EACD,CAAC;CAGF,MAAM,CAAC,cAAc,uBAAA,GAAA,MAAA,UAAkD,EAAE,CAAC;CAE1E,MAAM,mBAAA,GAAA,MAAA,cAA+B,YAAwC;AAC3E,sBAAoB,SAA4B;AAE9C,UADa,OAAO,YAAY,aAAa,QAAQ,KAAK,GAAG;IAE7D;IACD,EAAE,CAAC;CAIN,MAAM,kBAAA,GAAA,MAAA,eAA6C;AACjD,MAAI,CAAC,mBAAmB,OAAQ,QAAO,WAAW,WAAW,EAAE;AAC/D,SAAO,CAAC,GAAG,mBAAmB,GAAI,WAAW,WAAW,EAAE,CAAE;IAC3D,CAAC,mBAAmB,WAAW,QAAQ,CAAC;CAE3C,MAAM,uBAAA,GAAA,MAAA,eACE,IAAI,IAAI,mBAAmB,KAAK,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC,EAC9D,CAAC,kBAAkB,CACpB;CAED,MAAM,qBAAA,GAAA,MAAA,cACH,eAA6B;AAC5B,MAAI,CAAC,oBAAoB,MAAM;AAC7B,cAAW,aAAa,WAAW;AACnC;;EAEF,MAAM,aAAa,WAAW,QAAQ,MAAM,CAAC,oBAAoB,IAAI,EAAE,SAAS,CAAC;AACjF,aAAW,aAAa,WAAW;AAEnC,MAAI,0BAEF,2BAD0B,WAAW,QAAQ,MAAM,oBAAoB,IAAI,EAAE,SAAS,CAAC,CAC3C;IAGhD;EAAC;EAAqB,WAAW;EAAY;EAA0B,CACxE;AAaD,QAAO;EACL,SAAA,GAAA,MAAA,gBAXO;GACL,GAAG;GACH,SAAS;GACT,YAAY;GACZ;GACA;GACD,GACD;GAAC;GAAY;GAAgB;GAAmB;GAAc;GAAgB,CAC/E;EAIC,OAAO;EACR"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { useNuqsQueryParams } from "./useNuqsQueryParams.mjs";
|
|
2
|
-
import { useQueryWithParams } from "./useQueryWithParams.mjs";
|
|
3
|
-
import { useCallback, useMemo, useState } from "react";
|
|
4
|
-
//#region src/modules/table/hooks/useNuqsTable.ts
|
|
5
|
-
const useNuqsTable = ({ getQueryOptions, queryParams = {}, prefix, additionalFilters, onAdditionalFiltersChange }) => {
|
|
6
|
-
const queryState = useNuqsQueryParams(prefix);
|
|
7
|
-
const queryResult = useQueryWithParams({
|
|
8
|
-
getQueryOptions,
|
|
9
|
-
queryParams,
|
|
10
|
-
queryState,
|
|
11
|
-
grouping: queryState.grouping,
|
|
12
|
-
additionalFilters
|
|
13
|
-
});
|
|
14
|
-
const [rowSelection, setRowSelectionRaw] = useState({});
|
|
15
|
-
const setRowSelection = useCallback((updater) => {
|
|
16
|
-
setRowSelectionRaw((prev) => {
|
|
17
|
-
return typeof updater === "function" ? updater(prev) : updater;
|
|
18
|
-
});
|
|
19
|
-
}, []);
|
|
20
|
-
const displayFilters = useMemo(() => {
|
|
21
|
-
if (!additionalFilters?.length) return queryState.filters ?? [];
|
|
22
|
-
return [...additionalFilters, ...queryState.filters ?? []];
|
|
23
|
-
}, [additionalFilters, queryState.filters]);
|
|
24
|
-
const additionalColumnIds = useMemo(() => new Set(additionalFilters?.map((f) => f.columnId) ?? []), [additionalFilters]);
|
|
25
|
-
const wrappedSetFilters = useCallback((newFilters) => {
|
|
26
|
-
if (!additionalColumnIds.size) {
|
|
27
|
-
queryState.setFilters?.(newFilters);
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
const ownFilters = newFilters.filter((f) => !additionalColumnIds.has(f.columnId));
|
|
31
|
-
queryState.setFilters?.(ownFilters);
|
|
32
|
-
if (onAdditionalFiltersChange) onAdditionalFiltersChange(newFilters.filter((f) => additionalColumnIds.has(f.columnId)));
|
|
33
|
-
}, [
|
|
34
|
-
additionalColumnIds,
|
|
35
|
-
queryState.setFilters,
|
|
36
|
-
onAdditionalFiltersChange
|
|
37
|
-
]);
|
|
38
|
-
return {
|
|
39
|
-
params: useMemo(() => ({
|
|
40
|
-
...queryState,
|
|
41
|
-
filters: displayFilters,
|
|
42
|
-
setFilters: wrappedSetFilters,
|
|
43
|
-
rowSelection,
|
|
44
|
-
setRowSelection
|
|
45
|
-
}), [
|
|
46
|
-
queryState,
|
|
47
|
-
displayFilters,
|
|
48
|
-
wrappedSetFilters,
|
|
49
|
-
rowSelection,
|
|
50
|
-
setRowSelection
|
|
51
|
-
]),
|
|
52
|
-
query: queryResult
|
|
53
|
-
};
|
|
54
|
-
};
|
|
55
|
-
//#endregion
|
|
56
|
-
export { useNuqsTable as default };
|
|
57
|
-
|
|
58
|
-
//# sourceMappingURL=useNuqsTable.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useNuqsTable.mjs","names":[],"sources":["../../../../../src/modules/table/hooks/useNuqsTable.ts"],"sourcesContent":["import type { QueryFilters } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport type { UseQueryOptions, UseQueryResult } from \"@tanstack/react-query\";\r\nimport type { RowSelectionState, Updater } from \"@tanstack/react-table\";\r\nimport { useCallback, useMemo, useState } from \"react\";\r\nimport { type NuqsQueryParams, useNuqsQueryParams } from \"./useNuqsQueryParams\";\r\nimport { useQueryWithParams } from \"./useQueryWithParams\";\r\n\r\nexport interface TableParams extends NuqsQueryParams {\r\n rowSelection: RowSelectionState;\r\n setRowSelection: (updater: Updater<RowSelectionState>) => void;\r\n}\r\n\r\n/**\r\n * Alias for TableParams - used by TablePagination and other table components\r\n */\r\nexport type TableProps = TableParams;\r\n\r\nexport interface NuqsTableReturn<TData> {\r\n params: TableParams;\r\n query: UseQueryResult<TData>;\r\n}\r\n\r\n/**\r\n * Flexible query options type that accepts both standard TanStack Query options\r\n * and tRPC's queryOptions function return type.\r\n * Uses permissive generics to handle type differences between TanStack Query and tRPC.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype QueryOptionsLike<TData> = UseQueryOptions<TData, any, TData, any>;\r\n\r\n/**\r\n * Function type that accepts both standard query options functions and tRPC's queryOptions.\r\n * tRPC's queryOptions accepts (input, opts?) while standard functions may only accept (input).\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype GetQueryOptionsFn<TInput, TData> = (input: TInput, ...args: any[]) => QueryOptionsLike<TData>;\r\n\r\nexport interface NuqsTableOptions<TInput, TData> {\r\n getQueryOptions: GetQueryOptionsFn<TInput, TData>;\r\n queryParams?: TInput;\r\n prefix?: string;\r\n additionalFilters?: QueryFilters;\r\n onAdditionalFiltersChange?: (filters: QueryFilters) => void;\r\n}\r\n\r\nconst useNuqsTable = <TInput, TData>({\r\n getQueryOptions,\r\n queryParams = {} as TInput,\r\n prefix,\r\n additionalFilters,\r\n onAdditionalFiltersChange,\r\n}: NuqsTableOptions<TInput, TData>): NuqsTableReturn<TData> => {\r\n // Get all URL query state (includes grouping)\r\n const queryState = useNuqsQueryParams(prefix);\r\n\r\n // Get query result — passes grouping so limit can be overridden when grouped\r\n const queryResult = useQueryWithParams({\r\n getQueryOptions,\r\n queryParams,\r\n queryState,\r\n grouping: queryState.grouping,\r\n additionalFilters,\r\n });\r\n\r\n // Table-specific row selection state\r\n const [rowSelection, setRowSelectionRaw] = useState<RowSelectionState>({});\r\n\r\n const setRowSelection = useCallback((updater: Updater<RowSelectionState>) => {\r\n setRowSelectionRaw((prev: RowSelectionState) => {\r\n const next = typeof updater === \"function\" ? updater(prev) : updater;\r\n return next;\r\n });\r\n }, []);\r\n\r\n // Merge additionalFilters into displayed filters so the table UI shows all active filters.\r\n // On write, strip the additional filters so only the table's own go to the prefixed URL param.\r\n const displayFilters = useMemo<QueryFilters>(() => {\r\n if (!additionalFilters?.length) return queryState.filters ?? [];\r\n return [...additionalFilters, ...(queryState.filters ?? [])];\r\n }, [additionalFilters, queryState.filters]);\r\n\r\n const additionalColumnIds = useMemo(\r\n () => new Set(additionalFilters?.map((f) => f.columnId) ?? []),\r\n [additionalFilters]\r\n );\r\n\r\n const wrappedSetFilters = useCallback(\r\n (newFilters: QueryFilters) => {\r\n if (!additionalColumnIds.size) {\r\n queryState.setFilters?.(newFilters);\r\n return;\r\n }\r\n const ownFilters = newFilters.filter((f) => !additionalColumnIds.has(f.columnId));\r\n queryState.setFilters?.(ownFilters);\r\n\r\n if (onAdditionalFiltersChange) {\r\n const updatedAdditional = newFilters.filter((f) => additionalColumnIds.has(f.columnId));\r\n onAdditionalFiltersChange(updatedAdditional);\r\n }\r\n },\r\n [additionalColumnIds, queryState.setFilters, onAdditionalFiltersChange]\r\n );\r\n\r\n const params = useMemo(\r\n () => ({\r\n ...queryState,\r\n filters: displayFilters,\r\n setFilters: wrappedSetFilters,\r\n rowSelection,\r\n setRowSelection,\r\n }),\r\n [queryState, displayFilters, wrappedSetFilters, rowSelection, setRowSelection]\r\n );\r\n\r\n return {\r\n params,\r\n query: queryResult,\r\n };\r\n};\r\n\r\nexport default useNuqsTable;\r\n"],"mappings":";;;;AA6CA,MAAM,gBAA+B,EACnC,iBACA,cAAc,EAAE,EAChB,QACA,mBACA,gCAC6D;CAE7D,MAAM,aAAa,mBAAmB,OAAO;CAG7C,MAAM,cAAc,mBAAmB;EACrC;EACA;EACA;EACA,UAAU,WAAW;EACrB;EACD,CAAC;CAGF,MAAM,CAAC,cAAc,sBAAsB,SAA4B,EAAE,CAAC;CAE1E,MAAM,kBAAkB,aAAa,YAAwC;AAC3E,sBAAoB,SAA4B;AAE9C,UADa,OAAO,YAAY,aAAa,QAAQ,KAAK,GAAG;IAE7D;IACD,EAAE,CAAC;CAIN,MAAM,iBAAiB,cAA4B;AACjD,MAAI,CAAC,mBAAmB,OAAQ,QAAO,WAAW,WAAW,EAAE;AAC/D,SAAO,CAAC,GAAG,mBAAmB,GAAI,WAAW,WAAW,EAAE,CAAE;IAC3D,CAAC,mBAAmB,WAAW,QAAQ,CAAC;CAE3C,MAAM,sBAAsB,cACpB,IAAI,IAAI,mBAAmB,KAAK,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC,EAC9D,CAAC,kBAAkB,CACpB;CAED,MAAM,oBAAoB,aACvB,eAA6B;AAC5B,MAAI,CAAC,oBAAoB,MAAM;AAC7B,cAAW,aAAa,WAAW;AACnC;;EAEF,MAAM,aAAa,WAAW,QAAQ,MAAM,CAAC,oBAAoB,IAAI,EAAE,SAAS,CAAC;AACjF,aAAW,aAAa,WAAW;AAEnC,MAAI,0BAEF,2BAD0B,WAAW,QAAQ,MAAM,oBAAoB,IAAI,EAAE,SAAS,CAAC,CAC3C;IAGhD;EAAC;EAAqB,WAAW;EAAY;EAA0B,CACxE;AAaD,QAAO;EACL,QAZa,eACN;GACL,GAAG;GACH,SAAS;GACT,YAAY;GACZ;GACA;GACD,GACD;GAAC;GAAY;GAAgB;GAAmB;GAAc;GAAgB,CAC/E;EAIC,OAAO;EACR"}
|