@cryptlex/web-components 1.4.1 → 1.6.0
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/README.md +4 -13
- package/dist/components/data-table/column-picker.es.js +3 -4
- package/dist/components/data-table/column-picker.es.js.map +1 -1
- package/dist/components/data-table/data-table.es.js +79 -80
- package/dist/components/data-table/data-table.es.js.map +1 -1
- package/dist/components/data-table/page-size.es.js +5 -5
- package/dist/components/data-table/page-size.es.js.map +1 -1
- package/dist/components/data-table/paginator.es.js +25 -31
- package/dist/components/data-table/paginator.es.js.map +1 -1
- package/dist/components/data-table/table-actions.es.js +26 -27
- package/dist/components/data-table/table-actions.es.js.map +1 -1
- package/dist/components/data-table/table-content.es.js +37 -31
- package/dist/components/data-table/table-content.es.js.map +1 -1
- package/dist/components/data-table/table-filter.es.js +42 -45
- package/dist/components/data-table/table-filter.es.js.map +1 -1
- package/dist/components/key-value-card/key-value-card.es.js +17 -14
- package/dist/components/key-value-card/key-value-card.es.js.map +1 -1
- package/dist/components/sidebar/app-layout.es.js +11 -15
- package/dist/components/sidebar/app-layout.es.js.map +1 -1
- package/dist/components/sidebar/breadcrumb.es.js +2 -3
- package/dist/components/sidebar/breadcrumb.es.js.map +1 -1
- package/dist/components/sidebar/nav-main.es.js +18 -18
- package/dist/components/sidebar/nav-main.es.js.map +1 -1
- package/dist/components/static-data-table/data-table.es.js +14 -14
- package/dist/components/static-data-table/data-table.es.js.map +1 -1
- package/dist/components/ui/accordion.es.js +9 -9
- package/dist/components/ui/accordion.es.js.map +1 -1
- package/dist/components/ui/avatar.es.js +16 -16
- package/dist/components/ui/avatar.es.js.map +1 -1
- package/dist/components/ui/badge.es.js +5 -24
- package/dist/components/ui/badge.es.js.map +1 -1
- package/dist/components/ui/breadcrumb.es.js +10 -10
- package/dist/components/ui/breadcrumb.es.js.map +1 -1
- package/dist/components/ui/button.es.js +17 -17
- package/dist/components/ui/button.es.js.map +1 -1
- package/dist/components/ui/calendar.es.js +8 -8
- package/dist/components/ui/calendar.es.js.map +1 -1
- package/dist/components/ui/card.es.js +21 -21
- package/dist/components/ui/card.es.js.map +1 -1
- package/dist/components/ui/chart.es.js +76 -102
- package/dist/components/ui/chart.es.js.map +1 -1
- package/dist/components/ui/checkbox.es.js +13 -19
- package/dist/components/ui/checkbox.es.js.map +1 -1
- package/dist/components/ui/command.es.js +4 -4
- package/dist/components/ui/command.es.js.map +1 -1
- package/dist/components/ui/copy-button.es.js +20 -34
- package/dist/components/ui/copy-button.es.js.map +1 -1
- package/dist/components/ui/dialog.es.js +32 -32
- package/dist/components/ui/dialog.es.js.map +1 -1
- package/dist/components/ui/drawer.es.js +2 -2
- package/dist/components/ui/drawer.es.js.map +1 -1
- package/dist/components/ui/dropdown-menu.es.js +74 -82
- package/dist/components/ui/dropdown-menu.es.js.map +1 -1
- package/dist/components/ui/input-otp.es.js +17 -17
- package/dist/components/ui/input-otp.es.js.map +1 -1
- package/dist/components/ui/input.es.js +7 -7
- package/dist/components/ui/input.es.js.map +1 -1
- package/dist/components/ui/link-button.es.js +6 -6
- package/dist/components/ui/link-button.es.js.map +1 -1
- package/dist/components/ui/mutli-select.es.js +52 -52
- package/dist/components/ui/mutli-select.es.js.map +1 -1
- package/dist/components/ui/navigation-menu.es.js +34 -34
- package/dist/components/ui/navigation-menu.es.js.map +1 -1
- package/dist/components/ui/pagination.es.js +38 -38
- package/dist/components/ui/pagination.es.js.map +1 -1
- package/dist/components/ui/password-input.es.js +13 -13
- package/dist/components/ui/password-input.es.js.map +1 -1
- package/dist/components/ui/radio-group.es.js +11 -11
- package/dist/components/ui/radio-group.es.js.map +1 -1
- package/dist/components/ui/search-input.es.js +11 -11
- package/dist/components/ui/search-input.es.js.map +1 -1
- package/dist/components/ui/select.es.js +31 -49
- package/dist/components/ui/select.es.js.map +1 -1
- package/dist/components/ui/sheet.es.js +17 -17
- package/dist/components/ui/sheet.es.js.map +1 -1
- package/dist/components/ui/sidebar.es.js +2 -3
- package/dist/components/ui/sidebar.es.js.map +1 -1
- package/dist/components/ui/table-page-layout.es.js +2 -2
- package/dist/components/ui/table-page-layout.es.js.map +1 -1
- package/dist/components/ui/table.es.js +33 -33
- package/dist/components/ui/table.es.js.map +1 -1
- package/dist/components/ui/tabs.es.js +2 -2
- package/dist/components/ui/tabs.es.js.map +1 -1
- package/dist/components/ui/tooltip.es.js +8 -8
- package/dist/components/ui/tooltip.es.js.map +1 -1
- package/dist/index.es.d.ts +20 -48
- package/dist/index.es.js +253 -257
- package/dist/utils/index.es.js.map +1 -1
- package/lib/index.css +25 -6
- package/lib/tailwind.preset.css +59 -45
- package/lib/tokens.css +0 -9
- package/package.json +1 -1
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { jsxs as p, jsx as
|
|
2
|
-
import { useRouterState as
|
|
3
|
-
import { RotateCw as f, Plus as
|
|
1
|
+
import { jsxs as p, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { useRouterState as g, Link as d } from "@tanstack/react-router";
|
|
3
|
+
import { RotateCw as f, Plus as a, Pencil as u, Trash as w } from "lucide-react";
|
|
4
4
|
import { Button as t } from "../ui/button.es.js";
|
|
5
5
|
import "../ui/accordion.es.js";
|
|
6
6
|
import "../ui/avatar.es.js";
|
|
7
|
-
import "../ui/badge.es.js";
|
|
8
7
|
import "../ui/breadcrumb.es.js";
|
|
9
8
|
import "../ui/calendar.es.js";
|
|
10
9
|
import "../ui/card.es.js";
|
|
@@ -12,7 +11,7 @@ import "../ui/chart.es.js";
|
|
|
12
11
|
import "../ui/checkbox.es.js";
|
|
13
12
|
import "@radix-ui/react-collapsible";
|
|
14
13
|
import "../ui/command.es.js";
|
|
15
|
-
import { useState as
|
|
14
|
+
import { useState as v } from "react";
|
|
16
15
|
import "../ui/dialog.es.js";
|
|
17
16
|
import "../ui/drawer.es.js";
|
|
18
17
|
import "../ui/dropdown-menu.es.js";
|
|
@@ -35,44 +34,44 @@ import "sonner";
|
|
|
35
34
|
import "../ui/table.es.js";
|
|
36
35
|
import "../ui/tabs.es.js";
|
|
37
36
|
import "../ui/tooltip.es.js";
|
|
38
|
-
function
|
|
39
|
-
table:
|
|
40
|
-
tableActions:
|
|
41
|
-
stateToPass:
|
|
42
|
-
handleSearching:
|
|
43
|
-
dataQuery:
|
|
37
|
+
function or({
|
|
38
|
+
table: i,
|
|
39
|
+
tableActions: r,
|
|
40
|
+
stateToPass: n,
|
|
41
|
+
handleSearching: h,
|
|
42
|
+
dataQuery: o
|
|
44
43
|
}) {
|
|
45
|
-
const { location: { href: m } = {} } =
|
|
46
|
-
return /* @__PURE__ */ p("div", { className: "flex justify-between my-0
|
|
47
|
-
/* @__PURE__ */ p("div", { className: "flex gap-
|
|
48
|
-
/* @__PURE__ */
|
|
44
|
+
const { location: { href: m } = {} } = g(), [l, s] = v("");
|
|
45
|
+
return /* @__PURE__ */ p("div", { className: "flex bg-card justify-between my-0 p-4 border-t border-x gap-4 overflow-auto", children: [
|
|
46
|
+
/* @__PURE__ */ p("div", { className: "flex gap-4", children: [
|
|
47
|
+
/* @__PURE__ */ e(
|
|
49
48
|
t,
|
|
50
49
|
{
|
|
51
|
-
loading:
|
|
50
|
+
loading: o.isFetching,
|
|
52
51
|
icon: f,
|
|
53
|
-
onClick: () =>
|
|
52
|
+
onClick: () => o.refetch(),
|
|
54
53
|
variant: "outline"
|
|
55
54
|
}
|
|
56
55
|
),
|
|
57
|
-
|
|
58
|
-
/* @__PURE__ */
|
|
56
|
+
r.create && i.getSelectedRowModel().rows.length === 0 && /* @__PURE__ */ p(d, { to: `${m}/create`, children: [
|
|
57
|
+
/* @__PURE__ */ e(t, { disabled: o.isFetching, icon: a, children: "Create" }),
|
|
59
58
|
" "
|
|
60
59
|
] }),
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
i.getSelectedRowModel().rows.length > 0 && r.update && /* @__PURE__ */ e(d, { to: `${m}/edit`, state: n, children: /* @__PURE__ */ e(t, { disabled: o.isFetching, icon: u, children: "Update" }) }),
|
|
61
|
+
i.getSelectedRowModel().rows.length > 0 && (r == null ? void 0 : r.delete) && /* @__PURE__ */ e(d, { to: `${m}/delete`, state: n, children: /* @__PURE__ */ e(t, { disabled: o.isFetching, icon: w, variant: "destructive", children: "Delete" }) })
|
|
63
62
|
] }),
|
|
64
|
-
(
|
|
63
|
+
(r == null ? void 0 : r.search) && /* @__PURE__ */ e(
|
|
65
64
|
S,
|
|
66
65
|
{
|
|
67
|
-
value:
|
|
68
|
-
onChange: (
|
|
69
|
-
s(
|
|
66
|
+
value: l,
|
|
67
|
+
onChange: (c) => {
|
|
68
|
+
s(c), h(c);
|
|
70
69
|
}
|
|
71
70
|
}
|
|
72
|
-
)
|
|
71
|
+
)
|
|
73
72
|
] });
|
|
74
73
|
}
|
|
75
74
|
export {
|
|
76
|
-
|
|
75
|
+
or as default
|
|
77
76
|
};
|
|
78
77
|
//# sourceMappingURL=table-actions.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-actions.es.js","sources":["../../../lib/components/data-table/table-actions.tsx"],"sourcesContent":["import { Link, useRouterState } from '@tanstack/react-router';\n\nimport { Pencil, Plus, RotateCw, Trash } from 'lucide-react';\n\nimport type { TableActions } from '@/components/data-table/table-utils/index';\nimport { Button } from '@/components/ui/button';\nimport { SearchInput } from '@/index';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { Table } from '@tanstack/react-table';\nimport { useState } from 'react';\n\nexport default function Actions<TData>({\n table,\n tableActions,\n stateToPass,\n handleSearching,\n dataQuery,\n}: {\n table: Table<TData>;\n tableActions: TableActions;\n handleSearching: (value: string) => void;\n // TODO:Improve ts\n stateToPass: any;\n dataQuery: UseQueryResult<any, unknown>;\n}) {\n const { location: { href } = {} } = useRouterState();\n const [search, setSearch] = useState<string>('');\n return (\n <div className=\"flex justify-between my-0
|
|
1
|
+
{"version":3,"file":"table-actions.es.js","sources":["../../../lib/components/data-table/table-actions.tsx"],"sourcesContent":["import { Link, useRouterState } from '@tanstack/react-router';\n\nimport { Pencil, Plus, RotateCw, Trash } from 'lucide-react';\n\nimport type { TableActions } from '@/components/data-table/table-utils/index';\nimport { Button } from '@/components/ui/button';\nimport { SearchInput } from '@/index';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { Table } from '@tanstack/react-table';\nimport { useState } from 'react';\n\nexport default function Actions<TData>({\n table,\n tableActions,\n stateToPass,\n handleSearching,\n dataQuery,\n}: {\n table: Table<TData>;\n tableActions: TableActions;\n handleSearching: (value: string) => void;\n // TODO:Improve ts\n stateToPass: any;\n dataQuery: UseQueryResult<any, unknown>;\n}) {\n const { location: { href } = {} } = useRouterState();\n const [search, setSearch] = useState<string>('');\n return (\n <div className=\"flex bg-card justify-between my-0 p-4 border-t border-x gap-4 overflow-auto\">\n <div className=\"flex gap-4\">\n <Button\n loading={dataQuery.isFetching}\n icon={RotateCw}\n onClick={() => dataQuery.refetch()}\n variant={'outline'}\n />\n {/* //TODO: we can show the create, delete button based on permsission */}\n {/* All the creating routes will be with url /create in host app */}\n {tableActions.create && table.getSelectedRowModel().rows.length === 0 && (\n <Link to={`${href}/create`}>\n <Button disabled={dataQuery.isFetching} icon={Plus}>\n Create\n </Button>{' '}\n </Link>\n )}\n {/* All the updating routes will be with url /edit in host app */}\n {table.getSelectedRowModel().rows.length > 0 && tableActions.update && (\n <Link to={`${href}/edit`} state={stateToPass}>\n <Button disabled={dataQuery.isFetching} icon={Pencil}>\n Update\n </Button>\n </Link>\n )}\n {table.getSelectedRowModel().rows.length > 0 && tableActions?.delete && (\n <Link to={`${href}/delete`} state={stateToPass}>\n <Button disabled={dataQuery.isFetching} icon={Trash} variant={'destructive'}>\n Delete\n </Button>\n </Link>\n )}\n </div>\n {tableActions?.search && (\n <SearchInput\n value={search}\n onChange={(e) => {\n setSearch(e);\n handleSearching(e);\n }}\n />\n )}\n </div>\n );\n}\n"],"names":["Actions","table","tableActions","stateToPass","handleSearching","dataQuery","href","useRouterState","search","setSearch","useState","jsxs","jsx","Button","RotateCw","Link","Plus","Pencil","Trash","SearchInput","e"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,SAAwBA,GAAe;AAAA,EACrC,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,WAAAC;AACF,GAOG;AACK,QAAA,EAAE,UAAU,EAAE,MAAAC,MAAS,CAAC,EAAA,IAAMC,EAAe,GAC7C,CAACC,GAAQC,CAAS,IAAIC,EAAiB,EAAE;AAE7C,SAAA,gBAAAC,EAAC,OAAI,EAAA,WAAU,+EACb,UAAA;AAAA,IAAC,gBAAAA,EAAA,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,SAASR,EAAU;AAAA,UACnB,MAAMS;AAAA,UACN,SAAS,MAAMT,EAAU,QAAQ;AAAA,UACjC,SAAS;AAAA,QAAA;AAAA,MACX;AAAA,MAGCH,EAAa,UAAUD,EAAM,oBAAA,EAAsB,KAAK,WAAW,KACjE,gBAAAU,EAAAI,GAAA,EAAK,IAAI,GAAGT,CAAI,WACf,UAAA;AAAA,QAAA,gBAAAM,EAACC,KAAO,UAAUR,EAAU,YAAY,MAAMW,GAAM,UAEpD,UAAA;AAAA,QAAU;AAAA,MAAA,GACZ;AAAA,MAGDf,EAAM,oBAAoB,EAAE,KAAK,SAAS,KAAKC,EAAa,UAC1D,gBAAAU,EAAAG,GAAA,EAAK,IAAI,GAAGT,CAAI,SAAS,OAAOH,GAC/B,UAAA,gBAAAS,EAACC,GAAO,EAAA,UAAUR,EAAU,YAAY,MAAMY,GAAQ,UAAA,SAAA,CAEtD,EACF,CAAA;AAAA,MAEDhB,EAAM,oBAAoB,EAAE,KAAK,SAAS,MAAKC,KAAA,gBAAAA,EAAc,WAC5D,gBAAAU,EAACG,GAAK,EAAA,IAAI,GAAGT,CAAI,WAAW,OAAOH,GACjC,UAAC,gBAAAS,EAAAC,GAAA,EAAO,UAAUR,EAAU,YAAY,MAAMa,GAAO,SAAS,eAAe,UAAA,SAE7E,CAAA,EACF,CAAA;AAAA,IAAA,GAEJ;AAAA,KACChB,KAAA,gBAAAA,EAAc,WACb,gBAAAU;AAAA,MAACO;AAAA,MAAA;AAAA,QACC,OAAOX;AAAA,QACP,UAAU,CAACY,MAAM;AACf,UAAAX,EAAUW,CAAC,GACXhB,EAAgBgB,CAAC;AAAA,QAAA;AAAA,MACnB;AAAA,IAAA;AAAA,EACF,GAEJ;AAEJ;"}
|
|
@@ -1,48 +1,54 @@
|
|
|
1
1
|
import { jsxs as r, jsx as e, Fragment as m } from "react/jsx-runtime";
|
|
2
2
|
import { ACTIONS_COLUMN_ID as d } from "./data-table.es.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
3
|
+
import { Button as u } from "../ui/button.es.js";
|
|
4
|
+
import { Table as f, TableHeader as h, TableRow as a, TableCell as i, TableBody as x, TableFooter as N } from "../ui/table.es.js";
|
|
5
|
+
import { flexRender as g } from "@tanstack/react-table";
|
|
6
|
+
import { Info as b } from "lucide-react";
|
|
7
|
+
function I({
|
|
7
8
|
table: s,
|
|
8
|
-
columns:
|
|
9
|
-
dataQuery:
|
|
9
|
+
columns: p,
|
|
10
|
+
dataQuery: o
|
|
10
11
|
}) {
|
|
11
|
-
var
|
|
12
|
-
return /* @__PURE__ */ r(
|
|
13
|
-
/* @__PURE__ */ e(
|
|
12
|
+
var c;
|
|
13
|
+
return /* @__PURE__ */ r(f, { className: "size-full", children: [
|
|
14
|
+
/* @__PURE__ */ e(h, { className: "sticky top-0 z-10", children: s.getHeaderGroups().map((n, l) => /* @__PURE__ */ e(a, { children: n.headers.map((t) => /* @__PURE__ */ e(
|
|
14
15
|
i,
|
|
15
16
|
{
|
|
16
|
-
className: `px-4 py-2
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
t.isPlaceholder ? null : p(t.column.columnDef.header, t.getContext()),
|
|
20
|
-
{
|
|
17
|
+
className: `px-4 py-2 text-left text-sm font-medium bg-card whitespace-nowrap ${t.id === d ? "sticky right-0 z-50 text-center" : ""}`,
|
|
18
|
+
children: /* @__PURE__ */ r("span", { className: "inline-flex items-center gap-1", children: [
|
|
19
|
+
t.column.getCanSort() && /* @__PURE__ */ e(u, { size: "xs", variant: "outline", className: "font-mono", onClick: t.column.getToggleSortingHandler(), children: {
|
|
21
20
|
asc: "↑",
|
|
22
21
|
desc: "↓"
|
|
23
|
-
}[t.column.getIsSorted()] ??
|
|
24
|
-
|
|
22
|
+
}[t.column.getIsSorted()] ?? "a" }),
|
|
23
|
+
/* @__PURE__ */ e("span", { children: t.isPlaceholder ? null : g(t.column.columnDef.header, t.getContext()) })
|
|
24
|
+
] })
|
|
25
25
|
},
|
|
26
26
|
t.id
|
|
27
27
|
)) }, l)) }),
|
|
28
|
-
/* @__PURE__ */ e(
|
|
29
|
-
|
|
30
|
-
{
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
28
|
+
/* @__PURE__ */ e(x, { className: "flex-1 overflow-y-auto", children: s.getRowModel().rows.length ? (
|
|
29
|
+
// Render table data
|
|
30
|
+
s.getRowModel().rows.map((n) => /* @__PURE__ */ e(a, { className: "transition-colors data-[state=selected]:bg-muted-foreground/30 hover:bg-muted-foreground/20", "data-state": n.getIsSelected() && "selected", children: n.getVisibleCells().map((l) => /* @__PURE__ */ e(
|
|
31
|
+
i,
|
|
32
|
+
{
|
|
33
|
+
className: `
|
|
34
|
+
px-4 py-2 text-left text-sm whitespace-nowrap
|
|
35
|
+
${l.column.id === d ? "sticky right-0 w-20 bg-card" : ""}
|
|
34
36
|
`,
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
37
|
+
children: g(l.column.columnDef.cell, l.getContext())
|
|
38
|
+
},
|
|
39
|
+
l.id
|
|
40
|
+
)) }, n.id))
|
|
41
|
+
) : (
|
|
42
|
+
// Empty table
|
|
43
|
+
/* @__PURE__ */ e(a, { className: "cursor-not-allowed", children: /* @__PURE__ */ e(i, { colSpan: p.length, className: "border-none", children: /* @__PURE__ */ e("span", { className: "flex gap-3 justify-center items-center", children: !o.isFetching && (o.isError ? /* @__PURE__ */ r(m, { children: [
|
|
44
|
+
/* @__PURE__ */ e(b, {}),
|
|
45
|
+
" You don't have the required permissions. Please contact your admin."
|
|
46
|
+
] }) : (c = o.data) != null && c.data ? null : /* @__PURE__ */ e(m, { children: "No result found." })) }) }) })
|
|
47
|
+
) }),
|
|
48
|
+
o.isFetching && /* @__PURE__ */ e(N, { className: "absolute inset-0 z-20 flex justify-center items-center bg-card/80" })
|
|
43
49
|
] });
|
|
44
50
|
}
|
|
45
51
|
export {
|
|
46
|
-
|
|
52
|
+
I as TableContent
|
|
47
53
|
};
|
|
48
54
|
//# sourceMappingURL=table-content.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-content.es.js","sources":["../../../lib/components/data-table/table-content.tsx"],"sourcesContent":["import { ACTIONS_COLUMN_ID } from '@/components/data-table/data-table';\nimport {
|
|
1
|
+
{"version":3,"file":"table-content.es.js","sources":["../../../lib/components/data-table/table-content.tsx"],"sourcesContent":["import { ACTIONS_COLUMN_ID } from '@/components/data-table/data-table';\nimport { Button } from '@/components/ui/button';\nimport {\n TableBody,\n TableCell,\n Table as TableComponent,\n TableFooter,\n TableHeader,\n TableRow,\n} from '@/components/ui/table';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { ColumnDef, Table, flexRender } from '@tanstack/react-table';\nimport { Info } from 'lucide-react';\n\nexport function TableContent<TData, TValue>({\n table,\n columns,\n dataQuery,\n}: {\n table: Table<TData>;\n columns: ColumnDef<TData, TValue>[];\n dataQuery: UseQueryResult<any, unknown>;\n}) {\n return (\n <TableComponent className=\"size-full\">\n <TableHeader className=\"sticky top-0 z-10\">\n {table.getHeaderGroups().map((headerGroup, index) => (\n <TableRow key={index}>\n {headerGroup.headers.map((header) => (\n <TableCell\n key={header.id}\n className={`px-4 py-2 text-left text-sm font-medium bg-card whitespace-nowrap ${header.id === ACTIONS_COLUMN_ID ? 'sticky right-0 z-50 text-center' : ''}`}\n >\n <span className='inline-flex items-center gap-1'>\n {/* Sorting button / Indicator */}\n {header.column.getCanSort() &&\n <Button size=\"xs\" variant='outline' className='font-mono' onClick={header.column.getToggleSortingHandler()}>{{\n asc: '↑',\n desc: '↓',\n }[header.column.getIsSorted() as string] ?? \"a\"}</Button>\n }\n {/* Header text */}\n <span>\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n </span>\n </span>\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody className=\"flex-1 overflow-y-auto\">\n {table.getRowModel().rows.length ?\n // Render table data\n (\n table.getRowModel().rows.map((row) => (\n <TableRow className='transition-colors data-[state=selected]:bg-muted-foreground/30 hover:bg-muted-foreground/20' key={row.id} data-state={row.getIsSelected() && 'selected'}>\n {row.getVisibleCells().map((cell) => (\n <TableCell\n key={cell.id}\n className={`\n px-4 py-2 text-left text-sm whitespace-nowrap\n ${cell.column.id === ACTIONS_COLUMN_ID\n ? 'sticky right-0 w-20 bg-card'\n : ''\n }\n `}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n ))\n )\n :\n // Empty table\n (\n <TableRow className=\"cursor-not-allowed\">\n <TableCell colSpan={columns.length} className=\"border-none\">\n <span className=\"flex gap-3 justify-center items-center\">\n {!dataQuery.isFetching && (\n dataQuery.isError ? (\n <>\n <Info /> You don't have the required permissions. Please contact your admin.\n </>\n ) : !dataQuery.data?.data ? (\n <>No result found.</>\n ) : null\n )}\n </span>\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n {/* Loader positioned to cover entire table viewport */}\n {dataQuery.isFetching && (\n <TableFooter className=\"absolute inset-0 z-20 flex justify-center items-center bg-card/80\" />\n )}\n </TableComponent>\n );\n}\n"],"names":["TableContent","table","columns","dataQuery","jsxs","TableComponent","jsx","TableHeader","headerGroup","index","TableRow","header","TableCell","ACTIONS_COLUMN_ID","Button","flexRender","TableBody","row","cell","Fragment","Info","_a","TableFooter"],"mappings":";;;;;;AAcO,SAASA,EAA4B;AAAA,EAC1C,OAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AACF,GAIG;;AAEC,SAAA,gBAAAC,EAACC,GAAe,EAAA,WAAU,aACxB,UAAA;AAAA,IAAA,gBAAAC,EAACC,KAAY,WAAU,qBACpB,UAAMN,EAAA,kBAAkB,IAAI,CAACO,GAAaC,wBACxCC,GACE,EAAA,UAAAF,EAAY,QAAQ,IAAI,CAACG,MACxB,gBAAAL;AAAA,MAACM;AAAA,MAAA;AAAA,QAEC,WAAW,qEAAqED,EAAO,OAAOE,IAAoB,oCAAoC,EAAE;AAAA,QAExJ,UAAA,gBAAAT,EAAC,QAAK,EAAA,WAAU,kCAEb,UAAA;AAAA,UAAAO,EAAO,OAAO,WACb,KAAA,gBAAAL,EAACQ,KAAO,MAAK,MAAK,SAAQ,WAAU,WAAU,aAAY,SAASH,EAAO,OAAO,wBAA4B,GAAA,UAAA;AAAA,YAC3G,KAAK;AAAA,YACL,MAAM;AAAA,YACNA,EAAO,OAAO,YAAY,CAAW,KAAK,IAAI,CAAA;AAAA,UAGjD,gBAAAL,EAAA,QAAA,EACE,UAAOK,EAAA,gBACJ,OACAI,EAAWJ,EAAO,OAAO,UAAU,QAAQA,EAAO,WAAY,CAAA,EACpE,CAAA;AAAA,QAAA,EACF,CAAA;AAAA,MAAA;AAAA,MAjBKA,EAAO;AAAA,IAAA,CAmBf,EAAA,GAtBYF,CAuBf,CACD,GACH;AAAA,sBACCO,GAAU,EAAA,WAAU,0BAClB,UAAMf,EAAA,cAAc,KAAK;AAAA;AAAA,MAGtBA,EAAM,cAAc,KAAK,IAAI,CAACgB,wBAC3BP,GAAS,EAAA,WAAU,+FAA2G,cAAYO,EAAI,mBAAmB,YAC/J,YAAI,kBAAkB,IAAI,CAACC,MAC1B,gBAAAZ;AAAA,QAACM;AAAA,QAAA;AAAA,UAEC,WAAW;AAAA;AAAA,sBAETM,EAAK,OAAO,OAAOL,IACf,gCACA,EACJ;AAAA;AAAA,UAGD,YAAWK,EAAK,OAAO,UAAU,MAAMA,EAAK,WAAY,CAAA;AAAA,QAAA;AAAA,QATpDA,EAAK;AAAA,MAAA,CAWb,EAAA,GAdoHD,EAAI,EAe3H,CACD;AAAA;AAAA;AAAA,MAKD,gBAAAX,EAACI,KAAS,WAAU,sBAClB,4BAACE,GAAU,EAAA,SAASV,EAAQ,QAAQ,WAAU,eAC5C,UAAC,gBAAAI,EAAA,QAAA,EAAK,WAAU,0CACb,UAAA,CAACH,EAAU,eACVA,EAAU,UAEN,gBAAAC,EAAAe,GAAA,EAAA,UAAA;AAAA,QAAA,gBAAAb,EAACc,GAAK,EAAA;AAAA,QAAE;AAAA,MACV,EAAA,CAAA,KACGC,IAAAlB,EAAU,SAAV,QAAAkB,EAAgB,OAEjB,8BADA,UAAgB,mBAAA,CAAA,GAGxB,CAAA,EACF,CAAA,EACF,CAAA;AAAA,OAEN;AAAA,IAEClB,EAAU,cACR,gBAAAG,EAAAgB,GAAA,EAAY,WAAU,oEAAoE,CAAA;AAAA,EAAA,GAE/F;AAEJ;"}
|
|
@@ -2,27 +2,27 @@ import { jsxs as n, jsx as e, Fragment as M } from "react/jsx-runtime";
|
|
|
2
2
|
import { Badge as $ } from "../ui/badge.es.js";
|
|
3
3
|
import { Button as F } from "../ui/button.es.js";
|
|
4
4
|
import { Calendar as q } from "../ui/calendar.es.js";
|
|
5
|
-
import { Form as B, FormField as
|
|
5
|
+
import { Form as B, FormField as m, FormItem as s, FormLabel as u, FormControl as h, FormMessage as p } from "../ui/form.es.js";
|
|
6
6
|
import { Input as P } from "../ui/input.es.js";
|
|
7
|
-
import { Popover as
|
|
8
|
-
import { Select as N, SelectTrigger as S, SelectValue as y, SelectContent as w, SelectItem as
|
|
7
|
+
import { Popover as R, PopoverTrigger as b, PopoverContent as f } from "../ui/popover.es.js";
|
|
8
|
+
import { Select as N, SelectTrigger as S, SelectValue as y, SelectContent as w, SelectItem as g } from "../ui/select.es.js";
|
|
9
9
|
import { cn as k } from "../../utils/index.es.js";
|
|
10
10
|
import { zodResolver as U } from "@hookform/resolvers/zod";
|
|
11
11
|
import { format as X } from "date-fns";
|
|
12
12
|
import { X as Y, FilterIcon as G } from "lucide-react";
|
|
13
13
|
import { useState as T } from "react";
|
|
14
14
|
import { useForm as H } from "react-hook-form";
|
|
15
|
-
import
|
|
15
|
+
import v from "zod";
|
|
16
16
|
import { getResourceDisplayName as E, COMPARISON_OPERATOR_LABELS as j, OPERATORS_FOR_FILTER_TYPE as J, FILTER_COMPARISON_OPERATORS as K } from "./table-utils/constants.es.js";
|
|
17
|
-
const Q =
|
|
17
|
+
const Q = v.object({
|
|
18
18
|
// For identifing a filter for updation and deletion
|
|
19
|
-
id:
|
|
20
|
-
property:
|
|
21
|
-
operator:
|
|
19
|
+
id: v.string().min(1, "Field is required"),
|
|
20
|
+
property: v.string().min(1, "Field is required."),
|
|
21
|
+
operator: v.enum(K, {
|
|
22
22
|
errorMap: () => ({ message: "Invalid comparison operator" })
|
|
23
23
|
}),
|
|
24
|
-
value:
|
|
25
|
-
}),
|
|
24
|
+
value: v.string().min(1, "Field is required.")
|
|
25
|
+
}), ge = ({
|
|
26
26
|
filterableProperties: t,
|
|
27
27
|
filters: c,
|
|
28
28
|
onFiltersChange: a
|
|
@@ -54,11 +54,11 @@ const Q = g.object({
|
|
|
54
54
|
};
|
|
55
55
|
return /* @__PURE__ */ e(B, { ...l, children: /* @__PURE__ */ n("form", { onSubmit: l.handleSubmit(V), className: "flex flex-col gap-2 min-w-60", children: [
|
|
56
56
|
/* @__PURE__ */ e(
|
|
57
|
-
|
|
57
|
+
m,
|
|
58
58
|
{
|
|
59
59
|
control: l.control,
|
|
60
60
|
name: "property",
|
|
61
|
-
render: ({ field: d }) => /* @__PURE__ */ n(
|
|
61
|
+
render: ({ field: d }) => /* @__PURE__ */ n(s, { children: [
|
|
62
62
|
/* @__PURE__ */ e(u, { children: "Property" }),
|
|
63
63
|
/* @__PURE__ */ n(
|
|
64
64
|
N,
|
|
@@ -68,7 +68,7 @@ const Q = g.object({
|
|
|
68
68
|
disabled: !!r,
|
|
69
69
|
children: [
|
|
70
70
|
/* @__PURE__ */ e(h, { children: /* @__PURE__ */ e(S, { children: /* @__PURE__ */ e(y, {}) }) }),
|
|
71
|
-
/* @__PURE__ */ e(w, { autoFocus: !0, children: Object.entries(t).map(([o]) => /* @__PURE__ */ e(
|
|
71
|
+
/* @__PURE__ */ e(w, { autoFocus: !0, children: Object.entries(t).map(([o]) => /* @__PURE__ */ e(g, { value: o, children: E(o, "admin-portal") }, o)) })
|
|
72
72
|
]
|
|
73
73
|
}
|
|
74
74
|
),
|
|
@@ -78,16 +78,16 @@ const Q = g.object({
|
|
|
78
78
|
),
|
|
79
79
|
i && /* @__PURE__ */ n(M, { children: [
|
|
80
80
|
/* @__PURE__ */ e(
|
|
81
|
-
|
|
81
|
+
m,
|
|
82
82
|
{
|
|
83
83
|
control: l.control,
|
|
84
84
|
name: "operator",
|
|
85
|
-
render: ({ field: d }) => /* @__PURE__ */ n(
|
|
85
|
+
render: ({ field: d }) => /* @__PURE__ */ n(s, { children: [
|
|
86
86
|
/* @__PURE__ */ e(u, { children: "Comparison" }),
|
|
87
87
|
/* @__PURE__ */ n(N, { onValueChange: d.onChange, defaultValue: d.value, children: [
|
|
88
88
|
/* @__PURE__ */ e(h, { children: /* @__PURE__ */ e(S, { children: /* @__PURE__ */ e(y, {}) }) }),
|
|
89
89
|
/* @__PURE__ */ e(w, { children: t[i] && J[t[i]].map(
|
|
90
|
-
(o) => /* @__PURE__ */ e(
|
|
90
|
+
(o) => /* @__PURE__ */ e(g, { value: o, children: j[o] }, o)
|
|
91
91
|
) })
|
|
92
92
|
] }),
|
|
93
93
|
/* @__PURE__ */ e(p, {})
|
|
@@ -114,23 +114,21 @@ const Q = g.object({
|
|
|
114
114
|
/* @__PURE__ */ e("div", { className: "flex flex-wrap gap-2 items-center", children: c.map((r, l) => /* @__PURE__ */ n("div", { className: "flex items-center gap-2", children: [
|
|
115
115
|
/* @__PURE__ */ n("div", { className: "flex items-center", children: [
|
|
116
116
|
/* @__PURE__ */ n(
|
|
117
|
-
|
|
117
|
+
R,
|
|
118
118
|
{
|
|
119
119
|
open: x === r.id,
|
|
120
120
|
onOpenChange: (i) => {
|
|
121
121
|
i || C(null);
|
|
122
122
|
},
|
|
123
123
|
children: [
|
|
124
|
-
/* @__PURE__ */ e(
|
|
124
|
+
/* @__PURE__ */ e(b, { children: /* @__PURE__ */ e(
|
|
125
125
|
$,
|
|
126
126
|
{
|
|
127
127
|
onClick: () => C(r.id),
|
|
128
|
-
variant: "default",
|
|
129
|
-
className: "cursor-pointer h-7",
|
|
130
128
|
children: L(r)
|
|
131
129
|
}
|
|
132
130
|
) }),
|
|
133
|
-
/* @__PURE__ */ e(
|
|
131
|
+
/* @__PURE__ */ e(f, { className: "w-auto", align: "start", children: /* @__PURE__ */ e(A, { filter: r }) })
|
|
134
132
|
]
|
|
135
133
|
}
|
|
136
134
|
),
|
|
@@ -139,8 +137,7 @@ const Q = g.object({
|
|
|
139
137
|
{
|
|
140
138
|
icon: Y,
|
|
141
139
|
variant: "destructive",
|
|
142
|
-
|
|
143
|
-
size: "icon",
|
|
140
|
+
size: "sm",
|
|
144
141
|
onClick: () => _(r.id)
|
|
145
142
|
}
|
|
146
143
|
)
|
|
@@ -148,26 +145,26 @@ const Q = g.object({
|
|
|
148
145
|
l < c.length - 1 && /* @__PURE__ */ e("span", { className: "text-sm text-muted-foreground", children: "and" })
|
|
149
146
|
] }, r.id)) })
|
|
150
147
|
] }) }),
|
|
151
|
-
/* @__PURE__ */ n(
|
|
152
|
-
/* @__PURE__ */ e(
|
|
153
|
-
/* @__PURE__ */ e(
|
|
148
|
+
/* @__PURE__ */ n(R, { open: z, onOpenChange: O, children: [
|
|
149
|
+
/* @__PURE__ */ e(b, { asChild: !0, children: /* @__PURE__ */ e(F, { icon: G, variant: "outline" }) }),
|
|
150
|
+
/* @__PURE__ */ e(f, { className: "w-auto p-4", align: "start", children: /* @__PURE__ */ e(A, {}) })
|
|
154
151
|
] })
|
|
155
152
|
] });
|
|
156
153
|
}, W = ({ control: t, propertyType: c }) => {
|
|
157
154
|
switch (c) {
|
|
158
155
|
case "boolean":
|
|
159
156
|
return /* @__PURE__ */ e(
|
|
160
|
-
|
|
157
|
+
m,
|
|
161
158
|
{
|
|
162
159
|
control: t,
|
|
163
160
|
name: "value",
|
|
164
|
-
render: ({ field: a }) => /* @__PURE__ */ n(
|
|
161
|
+
render: ({ field: a }) => /* @__PURE__ */ n(s, { children: [
|
|
165
162
|
/* @__PURE__ */ e(u, { children: "Value" }),
|
|
166
163
|
/* @__PURE__ */ n(N, { onValueChange: a.onChange, defaultValue: a.value, children: [
|
|
167
164
|
/* @__PURE__ */ e(h, { children: /* @__PURE__ */ e(S, { children: /* @__PURE__ */ e(y, {}) }) }),
|
|
168
165
|
/* @__PURE__ */ n(w, { children: [
|
|
169
|
-
/* @__PURE__ */ e(
|
|
170
|
-
/* @__PURE__ */ e(
|
|
166
|
+
/* @__PURE__ */ e(g, { value: "true", children: "True" }),
|
|
167
|
+
/* @__PURE__ */ e(g, { value: "false", children: "False" })
|
|
171
168
|
] })
|
|
172
169
|
] }),
|
|
173
170
|
/* @__PURE__ */ e(p, {})
|
|
@@ -176,14 +173,14 @@ const Q = g.object({
|
|
|
176
173
|
);
|
|
177
174
|
case "objectDate":
|
|
178
175
|
return /* @__PURE__ */ e(
|
|
179
|
-
|
|
176
|
+
m,
|
|
180
177
|
{
|
|
181
178
|
control: t,
|
|
182
179
|
name: "value",
|
|
183
|
-
render: ({ field: a }) => /* @__PURE__ */ n(
|
|
180
|
+
render: ({ field: a }) => /* @__PURE__ */ n(s, { className: "flex flex-col", children: [
|
|
184
181
|
/* @__PURE__ */ e(u, { children: "Value" }),
|
|
185
|
-
/* @__PURE__ */ n(
|
|
186
|
-
/* @__PURE__ */ e(
|
|
182
|
+
/* @__PURE__ */ n(R, { children: [
|
|
183
|
+
/* @__PURE__ */ e(b, { asChild: !0, children: /* @__PURE__ */ e(h, { children: /* @__PURE__ */ e(
|
|
187
184
|
F,
|
|
188
185
|
{
|
|
189
186
|
variant: "outline",
|
|
@@ -194,7 +191,7 @@ const Q = g.object({
|
|
|
194
191
|
children: a.value ? X(new Date(a.value), "PPP") : /* @__PURE__ */ e("span", { children: "Pick a date" })
|
|
195
192
|
}
|
|
196
193
|
) }) }),
|
|
197
|
-
/* @__PURE__ */ e(
|
|
194
|
+
/* @__PURE__ */ e(f, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ e(
|
|
198
195
|
q,
|
|
199
196
|
{
|
|
200
197
|
mode: "single",
|
|
@@ -212,18 +209,18 @@ const Q = g.object({
|
|
|
212
209
|
);
|
|
213
210
|
case "role":
|
|
214
211
|
return /* @__PURE__ */ e(
|
|
215
|
-
|
|
212
|
+
m,
|
|
216
213
|
{
|
|
217
214
|
control: t,
|
|
218
215
|
name: "value",
|
|
219
|
-
render: ({ field: a }) => /* @__PURE__ */ n(
|
|
216
|
+
render: ({ field: a }) => /* @__PURE__ */ n(s, { children: [
|
|
220
217
|
/* @__PURE__ */ e(u, { children: "Value" }),
|
|
221
218
|
/* @__PURE__ */ n(N, { onValueChange: a.onChange, defaultValue: a.value, children: [
|
|
222
219
|
/* @__PURE__ */ e(h, { children: /* @__PURE__ */ e(S, { children: /* @__PURE__ */ e(y, {}) }) }),
|
|
223
220
|
/* @__PURE__ */ n(w, { children: [
|
|
224
|
-
/* @__PURE__ */ e(
|
|
225
|
-
/* @__PURE__ */ e(
|
|
226
|
-
/* @__PURE__ */ e(
|
|
221
|
+
/* @__PURE__ */ e(g, { value: "user", children: "User" }),
|
|
222
|
+
/* @__PURE__ */ e(g, { value: "organization-admin", children: "Organization Admin" }),
|
|
223
|
+
/* @__PURE__ */ e(g, { value: "reseller-admin", children: "Reseller Admin" })
|
|
227
224
|
] })
|
|
228
225
|
] }),
|
|
229
226
|
/* @__PURE__ */ e(p, {})
|
|
@@ -232,11 +229,11 @@ const Q = g.object({
|
|
|
232
229
|
);
|
|
233
230
|
case "number":
|
|
234
231
|
return /* @__PURE__ */ e(
|
|
235
|
-
|
|
232
|
+
m,
|
|
236
233
|
{
|
|
237
234
|
control: t,
|
|
238
235
|
name: "value",
|
|
239
|
-
render: ({ field: a }) => /* @__PURE__ */ n(
|
|
236
|
+
render: ({ field: a }) => /* @__PURE__ */ n(s, { children: [
|
|
240
237
|
/* @__PURE__ */ e(u, { children: "Value" }),
|
|
241
238
|
/* @__PURE__ */ e(h, { children: /* @__PURE__ */ e(P, { ...a, type: "number" }) }),
|
|
242
239
|
/* @__PURE__ */ e(p, {})
|
|
@@ -245,11 +242,11 @@ const Q = g.object({
|
|
|
245
242
|
);
|
|
246
243
|
default:
|
|
247
244
|
return /* @__PURE__ */ e(
|
|
248
|
-
|
|
245
|
+
m,
|
|
249
246
|
{
|
|
250
247
|
control: t,
|
|
251
248
|
name: "value",
|
|
252
|
-
render: ({ field: a }) => /* @__PURE__ */ n(
|
|
249
|
+
render: ({ field: a }) => /* @__PURE__ */ n(s, { children: [
|
|
253
250
|
/* @__PURE__ */ e(u, { children: "Value" }),
|
|
254
251
|
/* @__PURE__ */ e(h, { children: /* @__PURE__ */ e(P, { ...a, type: "text" }) }),
|
|
255
252
|
/* @__PURE__ */ e(p, {})
|
|
@@ -259,6 +256,6 @@ const Q = g.object({
|
|
|
259
256
|
}
|
|
260
257
|
};
|
|
261
258
|
export {
|
|
262
|
-
|
|
259
|
+
ge as TableFilter
|
|
263
260
|
};
|
|
264
261
|
//# sourceMappingURL=table-filter.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-filter.es.js","sources":["../../../lib/components/data-table/table-filter.tsx"],"sourcesContent":["import {\n COMPARISON_OPERATOR_LABELS,\n FILTER_COMPARISON_OPERATORS,\n getResourceDisplayName,\n OPERATORS_FOR_FILTER_TYPE,\n type FilterableProperties,\n type FilterablePropertyType,\n} from '@/components/data-table/table-utils';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { Calendar } from '@/components/ui/calendar';\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from '@/components/ui/form';\nimport { Input } from '@/components/ui/input';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { cn } from '@/utils';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { format } from 'date-fns';\nimport { FilterIcon, X } from 'lucide-react';\nimport { useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport z from 'zod';\nconst filterSchema = z.object({\n // For identifing a filter for updation and deletion\n id: z.string().min(1, 'Field is required'),\n property: z.string().min(1, 'Field is required.'),\n operator: z.enum(FILTER_COMPARISON_OPERATORS, {\n errorMap: () => ({ message: 'Invalid comparison operator' }),\n }),\n value: z.string().min(1, 'Field is required.'),\n});\nexport type FilterFormType = z.infer<typeof filterSchema>;\n\ninterface TableFilterProps {\n filterableProperties: FilterableProperties<any>;\n filters: FilterFormType[];\n onFiltersChange: (filters: FilterFormType[]) => void;\n}\n\nexport const TableFilter = ({\n filterableProperties,\n filters,\n onFiltersChange,\n}: TableFilterProps) => {\n const [editingFilter, setEditingFilter] = useState<string | null>(null);\n const [isAddingFilter, setIsAddingFilter] = useState(false);\n const getFilterLabel = (filter: FilterFormType): string => {\n const property = getResourceDisplayName(filter.property, 'admin-portal');\n const operatorLabel = COMPARISON_OPERATOR_LABELS[filter.operator];\n const value = filter.value;\n return `${property} ${operatorLabel} ${value}`;\n };\n\n const removeFilter = (id: string) => {\n onFiltersChange(filters.filter((filter) => filter.id !== id));\n };\n\n interface FilterFormProps {\n filter?: FilterFormType;\n }\n const FilterForm = ({ filter }: FilterFormProps) => {\n const form = useForm<FilterFormType>({\n resolver: zodResolver(filterSchema),\n defaultValues: {\n property: filter?.property || '',\n // TODO: Add dynamic default operator as per property type\n operator: filter?.operator || 'eq',\n value: filter?.value || '',\n id: filter?.id || `filter-${Date.now()}-${Math.random().toString(36)}`,\n },\n mode: 'all',\n });\n\n const watchProperty = form.watch('property');\n const handleSubmit = (values: FilterFormType) => {\n const newFilter: FilterFormType = {\n ...values,\n operator: values.operator,\n };\n\n if (filter) {\n // Update existing filter\n onFiltersChange(filters.map((f) => (f.id === filter.id ? newFilter : f)));\n setEditingFilter(null);\n } else {\n // Add new filter\n onFiltersChange([...filters, newFilter]);\n setIsAddingFilter(false);\n }\n };\n\n const handleClose = () => {\n if (filter) {\n setEditingFilter(null);\n } else {\n setIsAddingFilter(false);\n }\n };\n\n return (\n <Form {...form}>\n <form onSubmit={form.handleSubmit(handleSubmit)} className=\"flex flex-col gap-2 min-w-60\">\n <FormField\n control={form.control}\n name=\"property\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Property</FormLabel>\n <Select\n onValueChange={field.onChange}\n defaultValue={field.value}\n disabled={!!filter}\n >\n <FormControl>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n </FormControl>\n <SelectContent autoFocus>\n {Object.entries(filterableProperties).map(([key]) => (\n <SelectItem key={key} value={key}>\n {getResourceDisplayName(key, 'admin-portal')}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )}\n />\n\n {watchProperty && (\n <>\n <FormField\n control={form.control}\n name=\"operator\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Comparison</FormLabel>\n <Select onValueChange={field.onChange} defaultValue={field.value}>\n <FormControl>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n </FormControl>\n <SelectContent>\n {filterableProperties[watchProperty] &&\n OPERATORS_FOR_FILTER_TYPE[filterableProperties[watchProperty]].map(\n (op) => (\n <SelectItem key={op} value={op}>\n {COMPARISON_OPERATOR_LABELS[op]}\n </SelectItem>\n ),\n )}\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )}\n />\n {filterableProperties[watchProperty] && (\n <ValueField\n control={form.control}\n propertyType={filterableProperties[watchProperty]}\n />\n )}\n </>\n )}\n\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={handleClose}>\n Cancel\n </Button>\n <Button type=\"submit\" size=\"sm\">\n Apply Filter\n </Button>\n </div>\n </form>\n </Form>\n );\n };\n\n return (\n <div className=\"flex items-center py-2 justify-between gap-4\">\n <div className=\"flex flex-wrap gap-2 items-center\">\n {filters.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n No filters active. Add a filter to refine the results.\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-2 items-center\">\n <p className=\"text-sm text-muted-foreground\">Active Filters:</p>\n <div className=\"flex flex-wrap gap-2 items-center\">\n {filters.map((filter, index) => {\n return (\n <div key={filter.id} className=\"flex items-center gap-2\">\n <div className=\"flex items-center\">\n <Popover\n open={editingFilter === filter.id}\n onOpenChange={(open) => {\n if (!open) setEditingFilter(null);\n }}\n >\n <PopoverTrigger>\n <Badge\n onClick={() => setEditingFilter(filter.id)}\n variant=\"default\"\n className=\"cursor-pointer h-7\"\n >\n {getFilterLabel(filter)}\n </Badge>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto\" align=\"start\">\n <FilterForm filter={filter} />\n </PopoverContent>\n </Popover>\n <Button\n icon={X}\n variant=\"destructive\"\n className=\"h-7 -ml-0.5\"\n size=\"icon\"\n onClick={() => removeFilter(filter.id)}\n />\n </div>\n {index < filters.length - 1 && (\n <span className=\"text-sm text-muted-foreground\">and</span>\n )}\n </div>\n );\n })}\n </div>\n </div>\n )}\n </div>\n <Popover open={isAddingFilter} onOpenChange={setIsAddingFilter}>\n <PopoverTrigger asChild>\n <Button icon={FilterIcon} variant=\"outline\" />\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-4\" align=\"start\">\n <FilterForm />\n </PopoverContent>\n </Popover>\n </div>\n );\n};\ninterface ValueFieldProps {\n control: any;\n propertyType: FilterablePropertyType;\n}\nconst ValueField = ({ control, propertyType }: ValueFieldProps) => {\n switch (propertyType) {\n case 'boolean':\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Value</FormLabel>\n <Select onValueChange={field.onChange} defaultValue={field.value}>\n <FormControl>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n </FormControl>\n <SelectContent>\n <SelectItem value=\"true\">True</SelectItem>\n <SelectItem value=\"false\">False</SelectItem>\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n\n case 'objectDate':\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem className=\"flex flex-col\">\n <FormLabel>Value</FormLabel>\n <Popover>\n <PopoverTrigger asChild>\n <FormControl>\n <Button\n variant=\"outline\"\n className={cn(\n 'w-full pl-3 text-left font-normal',\n !field.value && 'text-muted-foreground',\n )}\n >\n {field.value ? (\n format(new Date(field.value), 'PPP')\n ) : (\n <span>Pick a date</span>\n )}\n </Button>\n </FormControl>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={field.value ? new Date(field.value) : undefined}\n onSelect={(date) => {\n if (date) {\n field.onChange(date.toISOString()); // Convert date to ISO\n }\n }}\n initialFocus\n />\n </PopoverContent>\n </Popover>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n\n case 'role':\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Value</FormLabel>\n <Select onValueChange={field.onChange} defaultValue={field.value}>\n <FormControl>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n </FormControl>\n <SelectContent>\n <SelectItem value=\"user\">User</SelectItem>\n <SelectItem value=\"organization-admin\">Organization Admin</SelectItem>\n <SelectItem value=\"reseller-admin\">Reseller Admin</SelectItem>\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n case 'number':\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Value</FormLabel>\n <FormControl>\n <Input {...field} type=\"number\" />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n\n default:\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Value</FormLabel>\n <FormControl>\n <Input {...field} type=\"text\" />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n }\n};\n"],"names":["filterSchema","z","FILTER_COMPARISON_OPERATORS","TableFilter","filterableProperties","filters","onFiltersChange","editingFilter","setEditingFilter","useState","isAddingFilter","setIsAddingFilter","getFilterLabel","filter","property","getResourceDisplayName","operatorLabel","COMPARISON_OPERATOR_LABELS","value","removeFilter","id","FilterForm","form","useForm","zodResolver","watchProperty","handleSubmit","values","newFilter","f","handleClose","jsx","Form","jsxs","FormField","field","FormItem","FormLabel","Select","FormControl","SelectTrigger","SelectValue","SelectContent","key","SelectItem","FormMessage","Fragment","OPERATORS_FOR_FILTER_TYPE","op","ValueField","Button","index","Popover","open","PopoverTrigger","Badge","PopoverContent","X","FilterIcon","control","propertyType","cn","format","Calendar","date","Input"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"table-filter.es.js","sources":["../../../lib/components/data-table/table-filter.tsx"],"sourcesContent":["import {\n COMPARISON_OPERATOR_LABELS,\n FILTER_COMPARISON_OPERATORS,\n getResourceDisplayName,\n OPERATORS_FOR_FILTER_TYPE,\n type FilterableProperties,\n type FilterablePropertyType,\n} from '@/components/data-table/table-utils';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { Calendar } from '@/components/ui/calendar';\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from '@/components/ui/form';\nimport { Input } from '@/components/ui/input';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { cn } from '@/utils';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { format } from 'date-fns';\nimport { FilterIcon, X } from 'lucide-react';\nimport { useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport z from 'zod';\nconst filterSchema = z.object({\n // For identifing a filter for updation and deletion\n id: z.string().min(1, 'Field is required'),\n property: z.string().min(1, 'Field is required.'),\n operator: z.enum(FILTER_COMPARISON_OPERATORS, {\n errorMap: () => ({ message: 'Invalid comparison operator' }),\n }),\n value: z.string().min(1, 'Field is required.'),\n});\nexport type FilterFormType = z.infer<typeof filterSchema>;\n\ninterface TableFilterProps {\n filterableProperties: FilterableProperties<any>;\n filters: FilterFormType[];\n onFiltersChange: (filters: FilterFormType[]) => void;\n}\n\nexport const TableFilter = ({\n filterableProperties,\n filters,\n onFiltersChange,\n}: TableFilterProps) => {\n const [editingFilter, setEditingFilter] = useState<string | null>(null);\n const [isAddingFilter, setIsAddingFilter] = useState(false);\n const getFilterLabel = (filter: FilterFormType): string => {\n const property = getResourceDisplayName(filter.property, 'admin-portal');\n const operatorLabel = COMPARISON_OPERATOR_LABELS[filter.operator];\n const value = filter.value;\n return `${property} ${operatorLabel} ${value}`;\n };\n\n const removeFilter = (id: string) => {\n onFiltersChange(filters.filter((filter) => filter.id !== id));\n };\n\n interface FilterFormProps {\n filter?: FilterFormType;\n }\n const FilterForm = ({ filter }: FilterFormProps) => {\n const form = useForm<FilterFormType>({\n resolver: zodResolver(filterSchema),\n defaultValues: {\n property: filter?.property || '',\n // TODO: Add dynamic default operator as per property type\n operator: filter?.operator || 'eq',\n value: filter?.value || '',\n id: filter?.id || `filter-${Date.now()}-${Math.random().toString(36)}`,\n },\n mode: 'all',\n });\n\n const watchProperty = form.watch('property');\n const handleSubmit = (values: FilterFormType) => {\n const newFilter: FilterFormType = {\n ...values,\n operator: values.operator,\n };\n\n if (filter) {\n // Update existing filter\n onFiltersChange(filters.map((f) => (f.id === filter.id ? newFilter : f)));\n setEditingFilter(null);\n } else {\n // Add new filter\n onFiltersChange([...filters, newFilter]);\n setIsAddingFilter(false);\n }\n };\n\n const handleClose = () => {\n if (filter) {\n setEditingFilter(null);\n } else {\n setIsAddingFilter(false);\n }\n };\n\n return (\n <Form {...form}>\n <form onSubmit={form.handleSubmit(handleSubmit)} className=\"flex flex-col gap-2 min-w-60\">\n <FormField\n control={form.control}\n name=\"property\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Property</FormLabel>\n <Select\n onValueChange={field.onChange}\n defaultValue={field.value}\n disabled={!!filter}\n >\n <FormControl>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n </FormControl>\n <SelectContent autoFocus>\n {Object.entries(filterableProperties).map(([key]) => (\n <SelectItem key={key} value={key}>\n {getResourceDisplayName(key, 'admin-portal')}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )}\n />\n\n {watchProperty && (\n <>\n <FormField\n control={form.control}\n name=\"operator\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Comparison</FormLabel>\n <Select onValueChange={field.onChange} defaultValue={field.value}>\n <FormControl>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n </FormControl>\n <SelectContent>\n {filterableProperties[watchProperty] &&\n OPERATORS_FOR_FILTER_TYPE[filterableProperties[watchProperty]].map(\n (op) => (\n <SelectItem key={op} value={op}>\n {COMPARISON_OPERATOR_LABELS[op]}\n </SelectItem>\n ),\n )}\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )}\n />\n {filterableProperties[watchProperty] && (\n <ValueField\n control={form.control}\n propertyType={filterableProperties[watchProperty]}\n />\n )}\n </>\n )}\n\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={handleClose}>\n Cancel\n </Button>\n <Button type=\"submit\" size=\"sm\">\n Apply Filter\n </Button>\n </div>\n </form>\n </Form>\n );\n };\n\n return (\n <div className=\"flex items-center py-2 justify-between gap-4\">\n <div className=\"flex flex-wrap gap-2 items-center\">\n {filters.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n No filters active. Add a filter to refine the results.\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-2 items-center\">\n <p className=\"text-sm text-muted-foreground\">Active Filters:</p>\n <div className=\"flex flex-wrap gap-2 items-center\">\n {filters.map((filter, index) => {\n return (\n <div key={filter.id} className=\"flex items-center gap-2\">\n <div className=\"flex items-center\">\n <Popover\n open={editingFilter === filter.id}\n onOpenChange={(open) => {\n if (!open) setEditingFilter(null);\n }}\n >\n <PopoverTrigger>\n <Badge\n onClick={() => setEditingFilter(filter.id)}\n >\n {getFilterLabel(filter)}\n </Badge>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto\" align=\"start\">\n <FilterForm filter={filter} />\n </PopoverContent>\n </Popover>\n <Button\n icon={X}\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => removeFilter(filter.id)}\n />\n </div>\n {index < filters.length - 1 && (\n <span className=\"text-sm text-muted-foreground\">and</span>\n )}\n </div>\n );\n })}\n </div>\n </div>\n )}\n </div>\n <Popover open={isAddingFilter} onOpenChange={setIsAddingFilter}>\n <PopoverTrigger asChild>\n <Button icon={FilterIcon} variant=\"outline\" />\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-4\" align=\"start\">\n <FilterForm />\n </PopoverContent>\n </Popover>\n </div>\n );\n};\ninterface ValueFieldProps {\n control: any;\n propertyType: FilterablePropertyType;\n}\nconst ValueField = ({ control, propertyType }: ValueFieldProps) => {\n switch (propertyType) {\n case 'boolean':\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Value</FormLabel>\n <Select onValueChange={field.onChange} defaultValue={field.value}>\n <FormControl>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n </FormControl>\n <SelectContent>\n <SelectItem value=\"true\">True</SelectItem>\n <SelectItem value=\"false\">False</SelectItem>\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n\n case 'objectDate':\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem className=\"flex flex-col\">\n <FormLabel>Value</FormLabel>\n <Popover>\n <PopoverTrigger asChild>\n <FormControl>\n <Button\n variant=\"outline\"\n className={cn(\n 'w-full pl-3 text-left font-normal',\n !field.value && 'text-muted-foreground',\n )}\n >\n {field.value ? (\n format(new Date(field.value), 'PPP')\n ) : (\n <span>Pick a date</span>\n )}\n </Button>\n </FormControl>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={field.value ? new Date(field.value) : undefined}\n onSelect={(date) => {\n if (date) {\n field.onChange(date.toISOString()); // Convert date to ISO\n }\n }}\n initialFocus\n />\n </PopoverContent>\n </Popover>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n\n case 'role':\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Value</FormLabel>\n <Select onValueChange={field.onChange} defaultValue={field.value}>\n <FormControl>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n </FormControl>\n <SelectContent>\n <SelectItem value=\"user\">User</SelectItem>\n <SelectItem value=\"organization-admin\">Organization Admin</SelectItem>\n <SelectItem value=\"reseller-admin\">Reseller Admin</SelectItem>\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n case 'number':\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Value</FormLabel>\n <FormControl>\n <Input {...field} type=\"number\" />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n\n default:\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Value</FormLabel>\n <FormControl>\n <Input {...field} type=\"text\" />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n }\n};\n"],"names":["filterSchema","z","FILTER_COMPARISON_OPERATORS","TableFilter","filterableProperties","filters","onFiltersChange","editingFilter","setEditingFilter","useState","isAddingFilter","setIsAddingFilter","getFilterLabel","filter","property","getResourceDisplayName","operatorLabel","COMPARISON_OPERATOR_LABELS","value","removeFilter","id","FilterForm","form","useForm","zodResolver","watchProperty","handleSubmit","values","newFilter","f","handleClose","jsx","Form","jsxs","FormField","field","FormItem","FormLabel","Select","FormControl","SelectTrigger","SelectValue","SelectContent","key","SelectItem","FormMessage","Fragment","OPERATORS_FOR_FILTER_TYPE","op","ValueField","Button","index","Popover","open","PopoverTrigger","Badge","PopoverContent","X","FilterIcon","control","propertyType","cn","format","Calendar","date","Input"],"mappings":"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"}
|