@arqel-dev/ui 0.14.0 → 0.15.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/dist/ArqelCreatePage-MV4JN2MO.js +8 -0
- package/dist/{ArqelCreatePage-O6KNXPAO.js.map → ArqelCreatePage-MV4JN2MO.js.map} +1 -1
- package/dist/ArqelDashboardPage-QK3BYVK3.js +6 -0
- package/dist/{ArqelDashboardPage-PX3Y75AA.js.map → ArqelDashboardPage-QK3BYVK3.js.map} +1 -1
- package/dist/ArqelEditPage-7J3IS2BR.js +8 -0
- package/dist/{ArqelEditPage-NAMWJ5MC.js.map → ArqelEditPage-7J3IS2BR.js.map} +1 -1
- package/dist/ArqelIndexPage-R6JL5KOH.js +12 -0
- package/dist/{ArqelIndexPage-GC33PNBL.js.map → ArqelIndexPage-R6JL5KOH.js.map} +1 -1
- package/dist/ArqelShowPage-5WWUSYC7.js +6 -0
- package/dist/{ArqelShowPage-LGVTL6UZ.js.map → ArqelShowPage-5WWUSYC7.js.map} +1 -1
- package/dist/action.d.ts +1 -1
- package/dist/action.js +5 -5
- package/dist/{chunk-M6NI45DQ.js → chunk-37FLEB4N.js} +4 -4
- package/dist/{chunk-M6NI45DQ.js.map → chunk-37FLEB4N.js.map} +1 -1
- package/dist/chunk-3HN4ARGG.js +157 -0
- package/dist/chunk-3HN4ARGG.js.map +1 -0
- package/dist/{chunk-I6MWOIFR.js → chunk-4I5S6MH3.js} +6 -5
- package/dist/chunk-4I5S6MH3.js.map +1 -0
- package/dist/{chunk-PZEVKMZX.js → chunk-AZICSFBA.js} +218 -129
- package/dist/chunk-AZICSFBA.js.map +1 -0
- package/dist/{chunk-PXON56HL.js → chunk-BJER6TOI.js} +3 -3
- package/dist/{chunk-PXON56HL.js.map → chunk-BJER6TOI.js.map} +1 -1
- package/dist/{chunk-2LTZJ4R7.js → chunk-CVAMCRLL.js} +11 -6
- package/dist/chunk-CVAMCRLL.js.map +1 -0
- package/dist/{chunk-IKJYLSTK.js → chunk-FP5R6WED.js} +76 -23
- package/dist/chunk-FP5R6WED.js.map +1 -0
- package/dist/{chunk-FHRQ7PWE.js → chunk-H23VX3RR.js} +4 -3
- package/dist/chunk-H23VX3RR.js.map +1 -0
- package/dist/{chunk-47HD7ALI.js → chunk-HSDZM4AM.js} +3 -3
- package/dist/{chunk-47HD7ALI.js.map → chunk-HSDZM4AM.js.map} +1 -1
- package/dist/{chunk-MTZJDFQ6.js → chunk-MZMYV43C.js} +11 -7
- package/dist/chunk-MZMYV43C.js.map +1 -0
- package/dist/{chunk-6UJQP7KU.js → chunk-N5U2BB6T.js} +30 -116
- package/dist/chunk-N5U2BB6T.js.map +1 -0
- package/dist/{chunk-E2ORVQM5.js → chunk-N6WLCHQE.js} +3 -3
- package/dist/{chunk-E2ORVQM5.js.map → chunk-N6WLCHQE.js.map} +1 -1
- package/dist/{chunk-WKWV36PG.js → chunk-PSPJA5U6.js} +5 -3
- package/dist/chunk-PSPJA5U6.js.map +1 -0
- package/dist/{chunk-QTUBBZVT.js → chunk-UXN67E5L.js} +4 -4
- package/dist/{chunk-QTUBBZVT.js.map → chunk-UXN67E5L.js.map} +1 -1
- package/dist/{chunk-4JJS2SVS.js → chunk-ZAM5TUPP.js} +25 -9
- package/dist/chunk-ZAM5TUPP.js.map +1 -0
- package/dist/form.js +3 -3
- package/dist/index.js +9 -9
- package/dist/pages.js +19 -19
- package/dist/resource.js +3 -3
- package/dist/shell.js +3 -3
- package/dist/table.js +2 -2
- package/dist/widgets.js +2 -2
- package/package.json +6 -6
- package/src/styles/globals.css +7 -0
- package/dist/ArqelCreatePage-O6KNXPAO.js +0 -8
- package/dist/ArqelDashboardPage-PX3Y75AA.js +0 -6
- package/dist/ArqelEditPage-NAMWJ5MC.js +0 -8
- package/dist/ArqelIndexPage-GC33PNBL.js +0 -12
- package/dist/ArqelShowPage-LGVTL6UZ.js +0 -6
- package/dist/chunk-2LTZJ4R7.js.map +0 -1
- package/dist/chunk-4JJS2SVS.js.map +0 -1
- package/dist/chunk-6UJQP7KU.js.map +0 -1
- package/dist/chunk-EYAUPJ6J.js +0 -64
- package/dist/chunk-EYAUPJ6J.js.map +0 -1
- package/dist/chunk-FHRQ7PWE.js.map +0 -1
- package/dist/chunk-I6MWOIFR.js.map +0 -1
- package/dist/chunk-IKJYLSTK.js.map +0 -1
- package/dist/chunk-MTZJDFQ6.js.map +0 -1
- package/dist/chunk-PZEVKMZX.js.map +0 -1
- package/dist/chunk-WKWV36PG.js.map +0 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { ArqelCreatePage as default } from './chunk-37FLEB4N.js';
|
|
2
|
+
import './chunk-MXUXMHOK.js';
|
|
3
|
+
import './chunk-MZMYV43C.js';
|
|
4
|
+
import './chunk-ZAM5TUPP.js';
|
|
5
|
+
import './chunk-H23VX3RR.js';
|
|
6
|
+
import './chunk-B7ULUJVO.js';
|
|
7
|
+
//# sourceMappingURL=ArqelCreatePage-MV4JN2MO.js.map
|
|
8
|
+
//# sourceMappingURL=ArqelCreatePage-MV4JN2MO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelCreatePage-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelCreatePage-MV4JN2MO.js"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ArqelDashboardPage as default } from './chunk-BJER6TOI.js';
|
|
2
|
+
import './chunk-HSDZM4AM.js';
|
|
3
|
+
import './chunk-PSPJA5U6.js';
|
|
4
|
+
import './chunk-B7ULUJVO.js';
|
|
5
|
+
//# sourceMappingURL=ArqelDashboardPage-QK3BYVK3.js.map
|
|
6
|
+
//# sourceMappingURL=ArqelDashboardPage-QK3BYVK3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelDashboardPage-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelDashboardPage-QK3BYVK3.js"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { ArqelEditPage as default } from './chunk-UXN67E5L.js';
|
|
2
|
+
import './chunk-MXUXMHOK.js';
|
|
3
|
+
import './chunk-MZMYV43C.js';
|
|
4
|
+
import './chunk-ZAM5TUPP.js';
|
|
5
|
+
import './chunk-H23VX3RR.js';
|
|
6
|
+
import './chunk-B7ULUJVO.js';
|
|
7
|
+
//# sourceMappingURL=ArqelEditPage-7J3IS2BR.js.map
|
|
8
|
+
//# sourceMappingURL=ArqelEditPage-7J3IS2BR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelEditPage-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelEditPage-7J3IS2BR.js"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { ArqelIndexPage as default } from './chunk-4I5S6MH3.js';
|
|
2
|
+
import './chunk-CVAMCRLL.js';
|
|
3
|
+
import './chunk-AZICSFBA.js';
|
|
4
|
+
import './chunk-RMPOR2YZ.js';
|
|
5
|
+
import './chunk-FP5R6WED.js';
|
|
6
|
+
import './chunk-3HN4ARGG.js';
|
|
7
|
+
import './chunk-MZMYV43C.js';
|
|
8
|
+
import './chunk-ZAM5TUPP.js';
|
|
9
|
+
import './chunk-H23VX3RR.js';
|
|
10
|
+
import './chunk-B7ULUJVO.js';
|
|
11
|
+
//# sourceMappingURL=ArqelIndexPage-R6JL5KOH.js.map
|
|
12
|
+
//# sourceMappingURL=ArqelIndexPage-R6JL5KOH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelIndexPage-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelIndexPage-R6JL5KOH.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelShowPage-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelShowPage-5WWUSYC7.js"}
|
package/dist/action.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ import { VariantProps } from 'class-variance-authority';
|
|
|
8
8
|
|
|
9
9
|
declare const buttonVariants: (props?: ({
|
|
10
10
|
variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | null | undefined;
|
|
11
|
-
size?: "default" | "xs" | "sm" | "lg" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
|
|
11
|
+
size?: "default" | "xs" | "sm" | "lg" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | "icon-touch" | null | undefined;
|
|
12
12
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
13
13
|
declare function Button({ className, variant, size, asChild, ...props }: React.ComponentProps<"button"> & VariantProps<typeof buttonVariants> & {
|
|
14
14
|
asChild?: boolean;
|
package/dist/action.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { ActionButton, ActionFormModal, ActionMenu, ConfirmDialog } from './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
export { Button, buttonVariants } from './chunk-
|
|
1
|
+
export { ActionButton, ActionFormModal, ActionMenu, ConfirmDialog } from './chunk-FP5R6WED.js';
|
|
2
|
+
import './chunk-3HN4ARGG.js';
|
|
3
|
+
import './chunk-MZMYV43C.js';
|
|
4
|
+
import './chunk-ZAM5TUPP.js';
|
|
5
|
+
export { Button, buttonVariants } from './chunk-H23VX3RR.js';
|
|
6
6
|
import './chunk-B7ULUJVO.js';
|
|
7
7
|
//# sourceMappingURL=action.js.map
|
|
8
8
|
//# sourceMappingURL=action.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PageHeader } from './chunk-MXUXMHOK.js';
|
|
2
|
-
import { FormActions } from './chunk-
|
|
3
|
-
import { FormRenderer } from './chunk-
|
|
2
|
+
import { FormActions } from './chunk-MZMYV43C.js';
|
|
3
|
+
import { FormRenderer } from './chunk-ZAM5TUPP.js';
|
|
4
4
|
import { useArqelForm } from '@arqel-dev/hooks';
|
|
5
5
|
import { usePage, router } from '@inertiajs/react';
|
|
6
6
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
@@ -45,5 +45,5 @@ function ArqelCreatePage() {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
export { ArqelCreatePage };
|
|
48
|
-
//# sourceMappingURL=chunk-
|
|
49
|
-
//# sourceMappingURL=chunk-
|
|
48
|
+
//# sourceMappingURL=chunk-37FLEB4N.js.map
|
|
49
|
+
//# sourceMappingURL=chunk-37FLEB4N.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pages/ArqelCreatePage.tsx"],"names":[],"mappings":";;;;;;;AAmBA,IAAM,eAAA,GAA8B;AAAA,EAClC,QAAQ,EAAC;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AASe,SAAR,eAAA,GAAgD;AACrD,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,MAAM,MAAA,GAAU,KAAA,CAAM,MAAA,IAAU,EAAC;AACjC,EAAA,MAAM,MAAA,GAAU,MAA2C,IAAA,IAAQ,eAAA;AAEnE,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,EAAE,MAAA,EAAQ,CAAA;AAEpC,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAuB;AACrC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,EAAU,IAAA,IAAQ,EAAA;AACrC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,EAAU,SAAA,IAAa,QAAA;AAC9C,IAAA,MAAA,CAAO,KAAK,CAAA,EAAG,QAAQ,IAAI,IAAI,CAAA,CAAA,EAAI,KAAK,IAAA,EAA+B;AAAA,MACrE,cAAA,EAAgB;AAAA,KACjB,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAO,CAAA,OAAA,EAAU,KAAA,CAAM,UAAU,KAAA,IAAS,QAAQ,CAAA,CAAA,EAAI,WAAA,EAAa,IAAA,EAAM,CAAA;AAAA,oBACrF,IAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,MAAA,EAAQ,WAAU,WAAA,EAChC,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAQ,IAAA,CAAK,IAAA;AAAA,UACb,UAAU,CAAC,IAAA,EAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA,UACnD,QAAQ,IAAA,CAAK;AAAA;AAAA,OACf;AAAA,sBACA,GAAA,CAAC,WAAA,EAAA,EAAY,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,UAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAK,EAAG;AAAA,KAAA,EACnF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/pages/ArqelCreatePage.tsx"],"names":[],"mappings":";;;;;;;AAmBA,IAAM,eAAA,GAA8B;AAAA,EAClC,QAAQ,EAAC;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AASe,SAAR,eAAA,GAAgD;AACrD,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,MAAM,MAAA,GAAU,KAAA,CAAM,MAAA,IAAU,EAAC;AACjC,EAAA,MAAM,MAAA,GAAU,MAA2C,IAAA,IAAQ,eAAA;AAEnE,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,EAAE,MAAA,EAAQ,CAAA;AAEpC,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAuB;AACrC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,EAAU,IAAA,IAAQ,EAAA;AACrC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,EAAU,SAAA,IAAa,QAAA;AAC9C,IAAA,MAAA,CAAO,KAAK,CAAA,EAAG,QAAQ,IAAI,IAAI,CAAA,CAAA,EAAI,KAAK,IAAA,EAA+B;AAAA,MACrE,cAAA,EAAgB;AAAA,KACjB,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAO,CAAA,OAAA,EAAU,KAAA,CAAM,UAAU,KAAA,IAAS,QAAQ,CAAA,CAAA,EAAI,WAAA,EAAa,IAAA,EAAM,CAAA;AAAA,oBACrF,IAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,MAAA,EAAQ,WAAU,WAAA,EAChC,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAQ,IAAA,CAAK,IAAA;AAAA,UACb,UAAU,CAAC,IAAA,EAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA,UACnD,QAAQ,IAAA,CAAK;AAAA;AAAA,OACf;AAAA,sBACA,GAAA,CAAC,WAAA,EAAA,EAAY,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,UAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAK,EAAG;AAAA,KAAA,EACnF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"chunk-37FLEB4N.js","sourcesContent":["/**\n * Default Inertia page for `arqel::create`.\n *\n * Renders a `<FormRenderer>` over the schema/fields the server\n * emits (with `record: null`). Submission goes through Inertia's\n * `useForm` via `useArqelForm` from `@arqel-dev/hooks` — this page is\n * just the layout shell.\n */\n\nimport { useArqelForm } from '@arqel-dev/hooks';\nimport type { FieldSchema } from '@arqel-dev/types/fields';\nimport type { FormSchema } from '@arqel-dev/types/forms';\nimport type { ResourceCreateProps } from '@arqel-dev/types/resources';\nimport { router, usePage } from '@inertiajs/react';\nimport type { FormEvent, JSX } from 'react';\nimport { FormActions } from '../form/FormActions.js';\nimport { FormRenderer } from '../form/FormRenderer.js';\nimport { PageHeader } from '../utility/PageHeader.js';\n\nconst FALLBACK_SCHEMA: FormSchema = {\n schema: [],\n columns: 1,\n model: null,\n inline: false,\n disabled: false,\n};\n\ninterface ArqelFormShape {\n data: Record<string, unknown>;\n setData: (name: string, value: unknown) => void;\n errors: Record<string, string[]>;\n processing: boolean;\n}\n\nexport default function ArqelCreatePage(): JSX.Element {\n const page = usePage();\n const props = page.props as unknown as ResourceCreateProps;\n const fields = (props.fields ?? []) as FieldSchema[];\n const schema = (props as unknown as { form?: FormSchema }).form ?? FALLBACK_SCHEMA;\n\n const form = useArqelForm({ fields }) as unknown as ArqelFormShape;\n\n const submit = (e: FormEvent): void => {\n e.preventDefault();\n const slug = props.resource?.slug ?? '';\n const basePath = props.resource?.panelPath ?? '/admin';\n router.post(`${basePath}/${slug}`, form.data as Record<string, never>, {\n preserveScroll: true,\n });\n };\n\n return (\n <div className=\"space-y-6\">\n <PageHeader title={`Create ${props.resource?.label ?? 'record'}`} description={null} />\n <form onSubmit={submit} className=\"space-y-6\">\n <FormRenderer\n schema={schema}\n fields={fields}\n values={form.data}\n onChange={(name, value) => form.setData(name, value)}\n errors={form.errors}\n />\n <FormActions processing={form.processing} onCancel={() => window.history.back()} />\n </form>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { cn } from './chunk-B7ULUJVO.js';
|
|
2
|
+
import 'react';
|
|
3
|
+
import { XIcon } from 'lucide-react';
|
|
4
|
+
import { DropdownMenu as DropdownMenu$1, Dialog } from 'radix-ui';
|
|
5
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
function DropdownMenu({
|
|
8
|
+
...props
|
|
9
|
+
}) {
|
|
10
|
+
return /* @__PURE__ */ jsx(DropdownMenu$1.Root, { "data-slot": "dropdown-menu", ...props });
|
|
11
|
+
}
|
|
12
|
+
function DropdownMenuTrigger({
|
|
13
|
+
...props
|
|
14
|
+
}) {
|
|
15
|
+
return /* @__PURE__ */ jsx(
|
|
16
|
+
DropdownMenu$1.Trigger,
|
|
17
|
+
{
|
|
18
|
+
"data-slot": "dropdown-menu-trigger",
|
|
19
|
+
...props
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
function DropdownMenuContent({
|
|
24
|
+
className,
|
|
25
|
+
sideOffset = 4,
|
|
26
|
+
...props
|
|
27
|
+
}) {
|
|
28
|
+
return /* @__PURE__ */ jsx(DropdownMenu$1.Portal, { children: /* @__PURE__ */ jsx(
|
|
29
|
+
DropdownMenu$1.Content,
|
|
30
|
+
{
|
|
31
|
+
"data-slot": "dropdown-menu-content",
|
|
32
|
+
sideOffset,
|
|
33
|
+
className: cn(
|
|
34
|
+
"z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
|
|
35
|
+
className
|
|
36
|
+
),
|
|
37
|
+
...props
|
|
38
|
+
}
|
|
39
|
+
) });
|
|
40
|
+
}
|
|
41
|
+
function DropdownMenuItem({
|
|
42
|
+
className,
|
|
43
|
+
inset,
|
|
44
|
+
variant = "default",
|
|
45
|
+
...props
|
|
46
|
+
}) {
|
|
47
|
+
return /* @__PURE__ */ jsx(
|
|
48
|
+
DropdownMenu$1.Item,
|
|
49
|
+
{
|
|
50
|
+
"data-slot": "dropdown-menu-item",
|
|
51
|
+
"data-inset": inset,
|
|
52
|
+
"data-variant": variant,
|
|
53
|
+
className: cn(
|
|
54
|
+
"relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:text-destructive!",
|
|
55
|
+
className
|
|
56
|
+
),
|
|
57
|
+
...props
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
function Sheet({ ...props }) {
|
|
62
|
+
return /* @__PURE__ */ jsx(Dialog.Root, { "data-slot": "sheet", ...props });
|
|
63
|
+
}
|
|
64
|
+
function SheetPortal({
|
|
65
|
+
...props
|
|
66
|
+
}) {
|
|
67
|
+
return /* @__PURE__ */ jsx(Dialog.Portal, { "data-slot": "sheet-portal", ...props });
|
|
68
|
+
}
|
|
69
|
+
function SheetOverlay({
|
|
70
|
+
className,
|
|
71
|
+
...props
|
|
72
|
+
}) {
|
|
73
|
+
return /* @__PURE__ */ jsx(
|
|
74
|
+
Dialog.Overlay,
|
|
75
|
+
{
|
|
76
|
+
"data-slot": "sheet-overlay",
|
|
77
|
+
className: cn(
|
|
78
|
+
"fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0",
|
|
79
|
+
className
|
|
80
|
+
),
|
|
81
|
+
...props
|
|
82
|
+
}
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
function SheetContent({
|
|
86
|
+
className,
|
|
87
|
+
children,
|
|
88
|
+
side = "right",
|
|
89
|
+
showCloseButton = true,
|
|
90
|
+
...props
|
|
91
|
+
}) {
|
|
92
|
+
return /* @__PURE__ */ jsxs(SheetPortal, { children: [
|
|
93
|
+
/* @__PURE__ */ jsx(SheetOverlay, {}),
|
|
94
|
+
/* @__PURE__ */ jsxs(
|
|
95
|
+
Dialog.Content,
|
|
96
|
+
{
|
|
97
|
+
"data-slot": "sheet-content",
|
|
98
|
+
className: cn(
|
|
99
|
+
"fixed z-50 flex flex-col gap-4 bg-background shadow-lg transition ease-in-out data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:animate-in data-[state=open]:duration-500",
|
|
100
|
+
side === "right" && "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
|
|
101
|
+
side === "left" && "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
|
|
102
|
+
side === "top" && "inset-x-0 top-0 h-auto border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
|
|
103
|
+
side === "bottom" && "inset-x-0 bottom-0 h-auto border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
|
|
104
|
+
className
|
|
105
|
+
),
|
|
106
|
+
...props,
|
|
107
|
+
children: [
|
|
108
|
+
children,
|
|
109
|
+
showCloseButton && /* @__PURE__ */ jsxs(Dialog.Close, { className: "absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary", children: [
|
|
110
|
+
/* @__PURE__ */ jsx(XIcon, { className: "size-4" }),
|
|
111
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
|
|
112
|
+
] })
|
|
113
|
+
]
|
|
114
|
+
}
|
|
115
|
+
)
|
|
116
|
+
] });
|
|
117
|
+
}
|
|
118
|
+
function SheetHeader({ className, ...props }) {
|
|
119
|
+
return /* @__PURE__ */ jsx(
|
|
120
|
+
"div",
|
|
121
|
+
{
|
|
122
|
+
"data-slot": "sheet-header",
|
|
123
|
+
className: cn("flex flex-col gap-1.5 p-4", className),
|
|
124
|
+
...props
|
|
125
|
+
}
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
function SheetTitle({
|
|
129
|
+
className,
|
|
130
|
+
...props
|
|
131
|
+
}) {
|
|
132
|
+
return /* @__PURE__ */ jsx(
|
|
133
|
+
Dialog.Title,
|
|
134
|
+
{
|
|
135
|
+
"data-slot": "sheet-title",
|
|
136
|
+
className: cn("font-semibold text-foreground", className),
|
|
137
|
+
...props
|
|
138
|
+
}
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
function SheetDescription({
|
|
142
|
+
className,
|
|
143
|
+
...props
|
|
144
|
+
}) {
|
|
145
|
+
return /* @__PURE__ */ jsx(
|
|
146
|
+
Dialog.Description,
|
|
147
|
+
{
|
|
148
|
+
"data-slot": "sheet-description",
|
|
149
|
+
className: cn("text-sm text-muted-foreground", className),
|
|
150
|
+
...props
|
|
151
|
+
}
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle };
|
|
156
|
+
//# sourceMappingURL=chunk-3HN4ARGG.js.map
|
|
157
|
+
//# sourceMappingURL=chunk-3HN4ARGG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shadcn/ui/dropdown-menu.tsx","../src/shadcn/ui/sheet.tsx"],"names":["DropdownMenuPrimitive","jsx","SheetPrimitive","jsxs"],"mappings":"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","file":"chunk-3HN4ARGG.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\"\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/utils/cn\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:text-destructive!\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked ?? false}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[inset]:pl-8 data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","import * as React from \"react\"\nimport { XIcon } from \"lucide-react\"\nimport { Dialog as SheetPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/utils/cn\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n \"fixed z-50 flex flex-col gap-4 bg-background shadow-lg transition ease-in-out data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:animate-in data-[state=open]:duration-500\",\n side === \"right\" &&\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n side === \"left\" &&\n \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n side === \"top\" &&\n \"inset-x-0 top-0 h-auto border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n side === \"bottom\" &&\n \"inset-x-0 bottom-0 h-auto border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close className=\"absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"font-semibold text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ResourceIndex } from './chunk-
|
|
2
|
-
import { ActionButton, ActionMenu } from './chunk-
|
|
1
|
+
import { ResourceIndex } from './chunk-CVAMCRLL.js';
|
|
2
|
+
import { ActionButton, ActionMenu } from './chunk-FP5R6WED.js';
|
|
3
3
|
import { usePage, router } from '@inertiajs/react';
|
|
4
4
|
import { useMemo, useState, useRef, useEffect } from 'react';
|
|
5
5
|
import { jsx } from 'react/jsx-runtime';
|
|
@@ -166,7 +166,8 @@ function ArqelIndexPage() {
|
|
|
166
166
|
{
|
|
167
167
|
action,
|
|
168
168
|
onInvoke: () => dispatchBulkAction(action),
|
|
169
|
-
size: "sm"
|
|
169
|
+
size: "sm",
|
|
170
|
+
className: "h-11 md:h-8"
|
|
170
171
|
},
|
|
171
172
|
action.name
|
|
172
173
|
)
|
|
@@ -200,5 +201,5 @@ function ArqelIndexPage() {
|
|
|
200
201
|
}
|
|
201
202
|
|
|
202
203
|
export { ArqelIndexPage };
|
|
203
|
-
//# sourceMappingURL=chunk-
|
|
204
|
-
//# sourceMappingURL=chunk-
|
|
204
|
+
//# sourceMappingURL=chunk-4I5S6MH3.js.map
|
|
205
|
+
//# sourceMappingURL=chunk-4I5S6MH3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pages/ArqelIndexPage.tsx"],"names":[],"mappings":";;;;;;AAkCA,SAAS,kBAAkB,MAAA,EAAkE;AAC3F,EAAA,MAAM,MAAmC,EAAC;AAC1C,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC3C,IAAA,IAAI,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,IAAA,IAAQ,MAAM,EAAA,EAAI;AAC/C,IAAA,IAAI,MAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAE,WAAW,CAAA,EAAG;AACxC,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,EACX;AACA,EAAA,OAAO,GAAA;AACT;AAUA,SAAS,YAAA,CACP,MAAA,EACA,MAAA,EACA,UAAA,EACM;AACN,EAAA,MAAM,WAAW,MAAA,EAAQ,EAAA;AAOzB,EAAA,IAAI,CAAC,OAAO,GAAA,EAAK;AACf,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,eAAA,EAAkB,OAAO,IAAI,CAAA,0KAAA;AAAA,KAG/B;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAAM,OAAO,GAAA,CAAI,OAAA,CAAQ,QAAQ,MAAA,CAAO,QAAA,IAAY,EAAE,CAAC,CAAA;AAC7D,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,WAAA,EAAY;AACzC,EAAA,MAAM,IAAA,GAAgC,EAAE,GAAI,UAAA,IAAc,EAAC,EAAG;AAC9D,EAAA,IAAI,QAAA,KAAa,MAAA,EAAW,IAAA,CAAK,WAAW,CAAA,GAAI,QAAA;AAEhD,EAAA,MAAA,CAAO,MAAM,GAAA,EAAK;AAAA,IAChB,MAAA;AAAA,IACA,IAAA;AAAA,IACA,cAAA,EAAgB;AAAA,GACjB,CAAA;AACH;AAgBA,SAAS,oBAAA,CACP,cACA,MAAA,EAMgB;AAChB,EAAA,MAAM,YAAA,GAAe,OAAO,KAAA,EAAO,OAAA;AACnC,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,EAAO,eAAA,IAAmB,EAAC;AAEpD,EAAA,OAAO,YAAA,CACJ,MAAA,CAAO,CAAC,MAAA,KAAY,eAAe,YAAA,CAAa,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA,GAAI,IAAK,CAAA,CAC7E,GAAA,CAAI,CAAC,MAAA,KAAW;AACf,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,MAAA,CAAO,IAAI,CAAA;AACtC,IAAA,IAAI,QAAA,KAAa,QAAW,OAAO,MAAA;AACnC,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,GAAI,SAAS,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,QAAA,CAAS,GAAA,EAAI,GAAI,EAAC;AAAA,MAC1D,GAAI,SAAS,QAAA,KAAa,IAAA,GAAO,EAAE,QAAA,EAAU,IAAA,KAAkB;AAAC,KAClE;AAAA,EACF,CAAC,CAAA;AACL;AAEA,SAAS,WAAW,MAAA,EAA8C;AAChE,EAAA,MAAM,OAAgC,EAAC;AACvC,EAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,MAAA,CAAO,OAAO,CAAA;AAChD,EAAA,IAAI,MAAA,CAAO,KAAK,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,GAAI,OAAA;AACtD,EAAA,IAAI,OAAO,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,QAAQ,IAAI,MAAA,CAAO,MAAA;AACzD,EAAA,IAAI,MAAA,CAAO,MAAM,MAAA,EAAQ;AACvB,IAAA,IAAA,CAAK,MAAM,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,MAAA;AAC3B,IAAA,IAAI,OAAO,IAAA,CAAK,SAAA,OAAgB,WAAW,CAAA,GAAI,OAAO,IAAA,CAAK,SAAA;AAAA,EAC7D;AACA,EAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,CAAO,IAAA,GAAO,GAAG,IAAA,CAAK,MAAM,IAAI,MAAA,CAAO,IAAA;AAC1D,EAAA,IAAI,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,UAAU,IAAI,MAAA,CAAO,OAAA;AAC9C,EAAA,OAAO,IAAA;AACT;AAEe,SAAR,cAAA,GAAwF;AAC7F,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAEnB,EAAA,MAAM,cAAA,GAAiB,QAAQ,MAAM;AACnC,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,EAAC;AAC3C,IAAA,MAAM,EAAA,GAAK,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AACrD,IAAA,MAAM,UAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,EAAA,CAAG,SAAQ,EAAG;AACvC,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,sBAAsB,CAAA;AAC1C,MAAA,IAAI,IAAI,CAAC,CAAA,UAAW,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,KAAA;AAAA,IAC9B;AACA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAsC,cAAc,CAAA;AAC5F,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,IAAI,QAAA,CAAiB,KAAA,CAAM,UAAU,EAAE,CAAA;AACzE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,IAAI,QAAA,CAA6B,KAAA,CAAM,YAAY,OAAO,CAAA;AACpF,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAA,CAAyC,EAAE,CAAA;AACjF,EAAA,MAAM,iBAAA,GAAoB,OAA6C,IAAI,CAAA;AAE3E,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAwC;AACrD,IAAA,MAAM,GAAA,GAAM,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AAC5F,IAAA,MAAA,CAAO,GAAA,CAAI,GAAA,IAAO,GAAA,EAAK,IAAA,EAA+D;AAAA,MACpF,aAAA,EAAe,IAAA;AAAA,MACf,cAAA,EAAgB,IAAA;AAAA,MAChB,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,MAAM,IAAA,IAAQ,IAAA;AAElC,EAAA,MAAM,kBAAA,GAAqB,CAAC,IAAA,EAAc,KAAA,KAA6B;AACrE,IAAA,MAAM,WAAA,GAAc,EAAE,GAAG,YAAA,EAAa;AACtC,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,EAAI;AACzD,MAAA,OAAO,YAAY,IAAI,CAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,IAAI,CAAA,GAAI,KAAA;AAAA,IACtB;AACA,IAAA,eAAA,CAAgB,WAAW,CAAA;AAC3B,IAAA,KAAA,CAAM,UAAA,CAAW,EAAE,OAAA,EAAS,WAAA,EAAa,MAAA,EAAQ,aAAa,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,CAAC,CAAA;AAAA,EAC7F,CAAA;AAEA,EAAA,MAAM,qBAAqB,MAAY;AACrC,IAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,IAAA,KAAA,CAAM,UAAA,CAAW,EAAE,OAAA,EAAS,EAAC,EAAG,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,CAAC,CAAA;AAAA,EACpF,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAwB;AAClD,IAAA,cAAA,CAAe,KAAK,CAAA;AACpB,IAAA,IAAI,iBAAA,CAAkB,OAAA,EAAS,YAAA,CAAa,iBAAA,CAAkB,OAAO,CAAA;AACrE,IAAA,iBAAA,CAAkB,OAAA,GAAU,WAAW,MAAM;AAC3C,MAAA,KAAA,CAAM,UAAA,CAAW,EAAE,OAAA,EAAS,YAAA,EAAc,MAAA,EAAQ,OAAO,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,CAAC,CAAA;AAAA,IACxF,GAAG,GAAG,CAAA;AAAA,EACR,CAAA;AAEA,EAAA,SAAA;AAAA,IACE,MAAM,MAAM;AACV,MAAA,IAAI,iBAAA,CAAkB,OAAA,EAAS,YAAA,CAAa,iBAAA,CAAkB,OAAO,CAAA;AAAA,IACvE,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,MAAA,EAAgB,SAAA,KAAmC;AAC3E,IAAA,KAAA;AAAA,MACE,UAAA,CAAW;AAAA,QACT,OAAA,EAAS,YAAA;AAAA,QACT,MAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAM,EAAE,MAAA,EAAQ,SAAA,EAAU;AAAA,QAC1B;AAAA,OACD;AAAA,KACH;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,OAAA,KAA0B;AAClD,IAAA,KAAA;AAAA,MACE,UAAA,CAAW;AAAA,QACT,OAAA,EAAS,YAAA;AAAA,QACT,MAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN;AAAA,OACD;AAAA,KACH;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,mBAAA,GAAsB,CAAC,UAAA,KAA6B;AACxD,IAAA,UAAA,CAAW,UAAU,CAAA;AACrB,IAAA,KAAA;AAAA,MACE,UAAA,CAAW;AAAA,QACT,OAAA,EAAS,YAAA;AAAA,QACT,MAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV;AAAA,KACH;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,MAAA,KAA+B;AAIzD,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AACnB,IAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,WAAA,EAAY;AACzC,IAAA,MAAA,CAAO,MAAM,GAAA,EAAK;AAAA,MAChB,MAAA;AAAA,MACA,IAAA,EAAM,EAAE,UAAA,EAAY,WAAA,EAA4C;AAAA,MAChE,cAAA,EAAgB,IAAA;AAAA,MAChB,SAAA,EAAW,MAAM,cAAA,CAAe,EAAE;AAAA,KACnC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,OAAA,EAAS,IAAA,IAAQ,EAAC;AAChD,EAAA,MAAM,WAAA,GACJ,eAAA,CAAgB,MAAA,GAAS,CAAA,IAAK,WAAA,CAAY,MAAA,GAAS,CAAA,mBACjD,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA,eAAA,CAAgB,IAAI,CAAC,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAKpB,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QAEC,MAAA;AAAA,QACA,QAAA,EAAU,MAAM,kBAAA,CAAmB,MAAM,CAAA;AAAA,QACzC,IAAA,EAAK,IAAA;AAAA,QAEL,SAAA,EAAU;AAAA,OAAA;AAAA,MALL,MAAA,CAAO;AAAA;AAMd,GACD,GACH,CAAA,GACE,MAAA;AAEN,EAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,OAAA,EAAS,GAAA,IAAO,EAAC;AAC9C,EAAA,MAAM,UAAA,GACJ,cAAA,CAAe,MAAA,GAAS,CAAA,GACpB,CAAC,MAAA,qBACC,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MAIC,OAAA,EAAS,oBAAA,CAAqB,cAAA,EAAgB,MAAM,CAAA;AAAA,MACpD,UAAU,CAAC,MAAA,EAAQ,eACjB,YAAA,CAAa,MAAA,EAAQ,QAAmC,UAAU;AAAA;AAAA,GAEtE,GAEF,MAAA;AAEN,EAAA,uBACE,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,YAAA;AAAA,MACA,cAAA,EAAgB,kBAAA;AAAA,MAChB,cAAA,EAAgB,kBAAA;AAAA,MAChB,cAAA,EAAgB,kBAAA;AAAA,MAChB,YAAA,EAAc,gBAAA;AAAA,MACd,YAAA,EAAc,gBAAA;AAAA,MACd,eAAA,EAAiB,mBAAA;AAAA,MACjB,MAAA,EAAQ,WAAA;AAAA,MACR,WAAA;AAAA,MACA,iBAAA,EAAmB,CAAC,GAAA,KAAQ,cAAA,CAAe,GAAG,CAAA;AAAA,MAC7C,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe,EAAC;AAAA,MACnC,GAAI,WAAA,GAAc,EAAE,WAAA,KAAgB;AAAC;AAAA,GACxC;AAEJ","file":"chunk-4I5S6MH3.js","sourcesContent":["/**\n * Default Inertia page for `arqel::index`.\n *\n * Pulls every prop the server emits via `InertiaDataBuilder::\n * buildIndexData` / `buildTableIndexData` and forwards them to\n * `<ResourceIndex>`. Apps can override per-resource by registering\n * their own page component at `Pages/Arqel/{Slug}/Index.tsx` (the\n * lookup falls through to user pages first inside `createArqelApp`).\n *\n * Wires the standard table interactions — search / filter / sort /\n * pagination — into Inertia partial `router.get` visits so the\n * server can re-run TableQueryBuilder with the new query string.\n *\n * Query-string contract (matches `Arqel\\Table\\TableQueryBuilder`):\n * - `?search=foo` global search\n * - `?sort=column&direction=asc|desc`\n * - `?page=N&per_page=M`\n * - `?filter[name]=value` one entry per filter\n *\n * `search` is debounced (300ms) so typing doesn't hammer the\n * backend; the rest fire immediately.\n */\n\nimport type { ActionSchema } from '@arqel-dev/types/actions';\nimport type { RecordType, ResourceIndexProps } from '@arqel-dev/types/resources';\nimport type { SortDirection } from '@arqel-dev/types/tables';\nimport { router, usePage } from '@inertiajs/react';\nimport { type JSX, useEffect, useMemo, useRef, useState } from 'react';\nimport { ActionButton } from '../action/ActionButton.js';\nimport { ActionMenu } from '../action/ActionMenu.js';\nimport { ResourceIndex } from '../resource/ResourceIndex.js';\n\ntype FilterValue = unknown;\n\nfunction pruneEmptyFilters(values: Record<string, FilterValue>): Record<string, FilterValue> {\n const out: Record<string, FilterValue> = {};\n for (const [k, v] of Object.entries(values)) {\n if (v === undefined || v === null || v === '') continue;\n if (Array.isArray(v) && v.length === 0) continue;\n out[k] = v;\n }\n return out;\n}\n\ninterface VisitParams {\n filters: Record<string, FilterValue>;\n search: string;\n sort?: { column: string | null; direction: string | null } | null;\n page?: number | undefined;\n perPage?: number | undefined;\n}\n\nfunction invokeAction(\n action: ActionSchema,\n record: { id: string | number } | null,\n formValues?: Record<string, unknown>,\n): void {\n const recordId = record?.id;\n // Every dispatchable action ships a server-emitted `url` (stock verbs,\n // bulk, and custom callback actions all resolve through core's authorised\n // routes — see `Action::resolveStockUrl()`, #48/#231). An absent `url`\n // signals a misconfiguration; we must NOT fall back to the dead\n // `/arqel-dev/actions/{name}` route removed in #174. Surface it clearly\n // instead of masking it as a 404.\n if (!action.url) {\n throw new Error(\n `Arqel: action \"${action.name}\" has no url to dispatch to. Declare it on ` +\n `the Resource's actions()/headerActions()/toolbarActions() so the server ` +\n `emits its endpoint URL, or give it an explicit ->url().`,\n );\n }\n const url = action.url.replace('{id}', String(recordId ?? ''));\n const method = action.method.toLowerCase() as 'get' | 'post' | 'put' | 'patch' | 'delete';\n const data: Record<string, unknown> = { ...(formValues ?? {}) };\n if (recordId !== undefined) data['record_id'] = recordId;\n\n router.visit(url, {\n method: method as never,\n data: data as never,\n preserveScroll: true,\n });\n}\n\n/**\n * Resolve the row-action list for a single record (#140).\n *\n * Row actions are defined once at table level (label / icon / color /\n * confirmation / form), but `url(Closure)` and `disabled(Closure)`\n * actions depend on the row. The server emits those resolved values\n * per record under `record.arqel.actionOverrides`; here we merge them\n * onto the shared definitions so each row links to its own URL and\n * carries its own disabled state.\n *\n * When the server also emits `record.arqel.actions` (the visible +\n * executable action names) we filter the list against it so per-row\n * authorization/visibility is honoured.\n */\nfunction resolveRecordActions(\n tableActions: ActionSchema[],\n record: {\n arqel?: {\n actions?: string[];\n actionOverrides?: Record<string, { url?: string; disabled?: true }>;\n };\n },\n): ActionSchema[] {\n const visibleNames = record.arqel?.actions;\n const overrides = record.arqel?.actionOverrides ?? {};\n\n return tableActions\n .filter((action) => (visibleNames ? visibleNames.includes(action.name) : true))\n .map((action) => {\n const override = overrides[action.name];\n if (override === undefined) return action;\n return {\n ...action,\n ...(override.url !== undefined ? { url: override.url } : {}),\n ...(override.disabled === true ? { disabled: true as const } : {}),\n };\n });\n}\n\nfunction buildQuery(params: VisitParams): Record<string, unknown> {\n const data: Record<string, unknown> = {};\n const filters = pruneEmptyFilters(params.filters);\n if (Object.keys(filters).length > 0) data['filter'] = filters;\n if (params.search !== undefined) data['search'] = params.search;\n if (params.sort?.column) {\n data['sort'] = params.sort.column;\n if (params.sort.direction) data['direction'] = params.sort.direction;\n }\n if (params.page && params.page > 1) data['page'] = params.page;\n if (params.perPage) data['per_page'] = params.perPage;\n return data;\n}\n\nexport default function ArqelIndexPage<TRecord extends RecordType = RecordType>(): JSX.Element {\n const page = usePage();\n const props = page.props as unknown as ResourceIndexProps<TRecord>;\n\n const initialFilters = useMemo(() => {\n if (typeof window === 'undefined') return {};\n const sp = new URLSearchParams(window.location.search);\n const fromUrl: Record<string, FilterValue> = {};\n for (const [key, value] of sp.entries()) {\n const m = key.match(/^filter\\[([^\\]]+)\\]$/);\n if (m?.[1]) fromUrl[m[1]] = value;\n }\n return fromUrl;\n }, []);\n\n const [filterValues, setFilterValues] = useState<Record<string, FilterValue>>(initialFilters);\n const [searchValue, setSearchValue] = useState<string>(props.search ?? '');\n const [perPage, setPerPage] = useState<number | undefined>(props.pagination?.perPage);\n const [selectedIds, setSelectedIds] = useState<ReadonlyArray<string | number>>([]);\n const searchDebounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const visit = (data: Record<string, unknown>): void => {\n const url = typeof window !== 'undefined' ? window.location.pathname : page.url.split('?')[0];\n router.get(url ?? '/', data as Record<string, string | number | boolean | undefined>, {\n preserveState: true,\n preserveScroll: true,\n replace: true,\n });\n };\n\n const currentSort = props.sort ?? null;\n\n const handleFilterChange = (name: string, value: FilterValue): void => {\n const nextFilters = { ...filterValues };\n if (value === undefined || value === null || value === '') {\n delete nextFilters[name];\n } else {\n nextFilters[name] = value;\n }\n setFilterValues(nextFilters);\n visit(buildQuery({ filters: nextFilters, search: searchValue, sort: currentSort, perPage }));\n };\n\n const handleClearFilters = (): void => {\n setFilterValues({});\n visit(buildQuery({ filters: {}, search: searchValue, sort: currentSort, perPage }));\n };\n\n const handleSearchChange = (value: string): void => {\n setSearchValue(value);\n if (searchDebounceRef.current) clearTimeout(searchDebounceRef.current);\n searchDebounceRef.current = setTimeout(() => {\n visit(buildQuery({ filters: filterValues, search: value, sort: currentSort, perPage }));\n }, 300);\n };\n\n useEffect(\n () => () => {\n if (searchDebounceRef.current) clearTimeout(searchDebounceRef.current);\n },\n [],\n );\n\n const handleSortChange = (column: string, direction: SortDirection): void => {\n visit(\n buildQuery({\n filters: filterValues,\n search: searchValue,\n sort: { column, direction },\n perPage,\n }),\n );\n };\n\n const handlePageChange = (pageNum: number): void => {\n visit(\n buildQuery({\n filters: filterValues,\n search: searchValue,\n sort: currentSort,\n page: pageNum,\n perPage,\n }),\n );\n };\n\n const handlePerPageChange = (newPerPage: number): void => {\n setPerPage(newPerPage);\n visit(\n buildQuery({\n filters: filterValues,\n search: searchValue,\n sort: currentSort,\n perPage: newPerPage,\n }),\n );\n };\n\n const dispatchBulkAction = (action: ActionSchema): void => {\n // Every bulk action carries a stock url (core resolves\n // /admin/{slug}/bulk/{name} for any bulk action without an\n // explicit url), so there is no client-side fallback route.\n const url = action.url;\n if (url === undefined) {\n return;\n }\n const method = action.method.toLowerCase() as 'get' | 'post' | 'put' | 'patch' | 'delete';\n router.visit(url, {\n method: method as never,\n data: { record_ids: selectedIds as readonly (string | number)[] } as never,\n preserveScroll: true,\n onSuccess: () => setSelectedIds([]),\n });\n };\n\n const bulkActionsList = props.actions?.bulk ?? [];\n const bulkActions =\n bulkActionsList.length > 0 && selectedIds.length > 0 ? (\n <div className=\"flex items-center gap-2\">\n {bulkActionsList.map((action) => (\n // Route through ActionButton so destructive bulk actions that set\n // requiresConfirmation open the ConfirmDialog before dispatching,\n // matching row-action behaviour. Non-confirming actions fire\n // immediately. The visit payload is unchanged.\n <ActionButton\n key={action.name}\n action={action}\n onInvoke={() => dispatchBulkAction(action)}\n size=\"sm\"\n // 44px touch target on mobile (WCAG 2.5.5); dense 32px on >=md.\n className=\"h-11 md:h-8\"\n />\n ))}\n </div>\n ) : undefined;\n\n const rowActionsList = props.actions?.row ?? [];\n const rowActions =\n rowActionsList.length > 0\n ? (record: TRecord) => (\n <ActionMenu\n // Resolve actions against this row so closure-URL /\n // closure-disabled actions get their per-record values\n // (#140) instead of the table-level placeholder.\n actions={resolveRecordActions(rowActionsList, record)}\n onInvoke={(action, formValues) =>\n invokeAction(action, record as { id: string | number }, formValues)\n }\n />\n )\n : undefined;\n\n return (\n <ResourceIndex<TRecord>\n {...props}\n filterValues={filterValues}\n onFilterChange={handleFilterChange}\n onClearFilters={handleClearFilters}\n onSearchChange={handleSearchChange}\n onSortChange={handleSortChange}\n onPageChange={handlePageChange}\n onPerPageChange={handlePerPageChange}\n search={searchValue}\n selectedIds={selectedIds}\n onSelectionChange={(ids) => setSelectedIds(ids)}\n {...(rowActions ? { rowActions } : {})}\n {...(bulkActions ? { bulkActions } : {})}\n />\n );\n}\n"]}
|