@nccirtu/tablefy 0.8.3 → 0.9.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 +224 -200
- package/dist/columns/badge-column.d.ts +7 -0
- package/dist/columns/columns/badge-column.d.ts +7 -0
- package/dist/columns/columns/types.d.ts +7 -0
- package/dist/columns/forms/builders/actions-builder.d.ts +14 -0
- package/dist/columns/forms/builders/form-schema.d.ts +35 -0
- package/dist/columns/forms/builders/index.d.ts +5 -0
- package/dist/columns/forms/builders/section-builder.d.ts +16 -0
- package/dist/columns/forms/builders/tab-builder.d.ts +16 -0
- package/dist/columns/forms/builders/wizard-builder.d.ts +17 -0
- package/dist/columns/forms/components/field-renderer.d.ts +12 -0
- package/dist/columns/forms/components/form-actions.d.ts +9 -0
- package/dist/columns/forms/components/form-renderer.d.ts +14 -0
- package/dist/columns/forms/components/grid-layout.d.ts +7 -0
- package/dist/columns/forms/components/index.d.ts +9 -0
- package/dist/columns/forms/components/section-renderer.d.ts +14 -0
- package/dist/columns/forms/components/tab-renderer.d.ts +15 -0
- package/dist/columns/forms/components/wizard-renderer.d.ts +17 -0
- package/dist/columns/forms/fields/base-field.d.ts +24 -0
- package/dist/columns/forms/fields/checkbox-group.d.ts +12 -0
- package/dist/columns/forms/fields/checkbox.d.ts +9 -0
- package/dist/columns/forms/fields/date-picker.d.ts +15 -0
- package/dist/columns/forms/fields/file-upload.d.ts +17 -0
- package/dist/columns/forms/fields/hidden.d.ts +9 -0
- package/dist/columns/forms/fields/index.d.ts +12 -0
- package/dist/columns/forms/fields/radio-group.d.ts +14 -0
- package/dist/columns/forms/fields/repeater.d.ts +21 -0
- package/dist/columns/forms/fields/select.d.ts +16 -0
- package/dist/columns/forms/fields/text-input.d.ts +20 -0
- package/dist/columns/forms/fields/textarea.d.ts +14 -0
- package/dist/columns/forms/fields/toggle.d.ts +11 -0
- package/dist/columns/forms/index.d.ts +26 -0
- package/dist/columns/forms/types/actions.d.ts +11 -0
- package/dist/columns/forms/types/field.d.ts +98 -0
- package/dist/columns/forms/types/form.d.ts +37 -0
- package/dist/columns/forms/types/index.d.ts +4 -0
- package/dist/columns/forms/types/layout.d.ts +31 -0
- package/dist/columns/index.d.ts +2 -0
- package/dist/columns/index.esm.js +35 -12
- package/dist/columns/index.esm.js.map +1 -1
- package/dist/columns/index.js +35 -12
- package/dist/columns/index.js.map +1 -1
- package/dist/columns/inertia/index.d.ts +4 -0
- package/dist/columns/inertia/precognition.d.ts +6 -0
- package/dist/columns/inertia/types.d.ts +63 -0
- package/dist/columns/inertia/use-inertia-form.d.ts +2 -0
- package/dist/columns/inertia/use-server-table.d.ts +2 -0
- package/dist/columns/types.d.ts +7 -0
- package/dist/forms/builders/actions-builder.d.ts +14 -0
- package/dist/forms/builders/empty-state.d.ts +46 -0
- package/dist/forms/builders/form-schema.d.ts +35 -0
- package/dist/forms/builders/index.d.ts +2 -0
- package/dist/forms/builders/section-builder.d.ts +16 -0
- package/dist/forms/builders/tab-builder.d.ts +16 -0
- package/dist/forms/builders/table-schema.d.ts +45 -0
- package/dist/forms/builders/wizard-builder.d.ts +17 -0
- package/dist/forms/columns/actions-column.d.ts +26 -0
- package/dist/forms/columns/avatar-group-column.d.ts +38 -0
- package/dist/forms/columns/badge-column.d.ts +29 -0
- package/dist/forms/columns/base-column.d.ts +21 -0
- package/dist/forms/columns/button-column.d.ts +14 -0
- package/dist/forms/columns/checkbox-column.d.ts +5 -0
- package/dist/forms/columns/date-column.d.ts +24 -0
- package/dist/forms/columns/dropdown-column.d.ts +17 -0
- package/dist/forms/columns/enum-column.d.ts +52 -0
- package/dist/forms/columns/icon-column.d.ts +58 -0
- package/dist/forms/columns/image-column.d.ts +21 -0
- package/dist/forms/columns/index.d.ts +18 -0
- package/dist/forms/columns/input-column.d.ts +27 -0
- package/dist/forms/columns/link-column.d.ts +27 -0
- package/dist/forms/columns/number-column.d.ts +23 -0
- package/dist/forms/columns/progress-column.d.ts +30 -0
- package/dist/forms/columns/select-column.d.ts +24 -0
- package/dist/forms/columns/text-column.d.ts +14 -0
- package/dist/forms/columns/types.d.ts +46 -0
- package/dist/forms/components/field-renderer.d.ts +12 -0
- package/dist/forms/components/form-actions.d.ts +9 -0
- package/dist/forms/components/form-renderer.d.ts +14 -0
- package/dist/forms/components/grid-layout.d.ts +7 -0
- package/dist/forms/components/index.d.ts +9 -0
- package/dist/forms/components/section-renderer.d.ts +14 -0
- package/dist/forms/components/tab-renderer.d.ts +15 -0
- package/dist/forms/components/wizard-renderer.d.ts +17 -0
- package/dist/forms/confirm/ConfirmProvider.d.ts +6 -0
- package/dist/forms/confirm/confirm.d.ts +3 -0
- package/dist/forms/confirm/index.d.ts +3 -0
- package/dist/forms/confirm/types.d.ts +10 -0
- package/dist/forms/fields/base-field.d.ts +24 -0
- package/dist/forms/fields/checkbox-group.d.ts +12 -0
- package/dist/forms/fields/checkbox.d.ts +9 -0
- package/dist/forms/fields/date-picker.d.ts +15 -0
- package/dist/forms/fields/file-upload.d.ts +17 -0
- package/dist/forms/fields/hidden.d.ts +9 -0
- package/dist/forms/fields/index.d.ts +12 -0
- package/dist/forms/fields/radio-group.d.ts +14 -0
- package/dist/forms/fields/repeater.d.ts +21 -0
- package/dist/forms/fields/select.d.ts +16 -0
- package/dist/forms/fields/text-input.d.ts +20 -0
- package/dist/forms/fields/textarea.d.ts +14 -0
- package/dist/forms/fields/toggle.d.ts +11 -0
- package/dist/forms/forms/builders/actions-builder.d.ts +14 -0
- package/dist/forms/forms/builders/form-schema.d.ts +35 -0
- package/dist/forms/forms/builders/index.d.ts +5 -0
- package/dist/forms/forms/builders/section-builder.d.ts +16 -0
- package/dist/forms/forms/builders/tab-builder.d.ts +16 -0
- package/dist/forms/forms/builders/wizard-builder.d.ts +17 -0
- package/dist/forms/forms/components/field-renderer.d.ts +12 -0
- package/dist/forms/forms/components/form-actions.d.ts +9 -0
- package/dist/forms/forms/components/form-renderer.d.ts +14 -0
- package/dist/forms/forms/components/grid-layout.d.ts +7 -0
- package/dist/forms/forms/components/index.d.ts +9 -0
- package/dist/forms/forms/components/section-renderer.d.ts +14 -0
- package/dist/forms/forms/components/tab-renderer.d.ts +15 -0
- package/dist/forms/forms/components/wizard-renderer.d.ts +17 -0
- package/dist/forms/forms/fields/base-field.d.ts +24 -0
- package/dist/forms/forms/fields/checkbox-group.d.ts +12 -0
- package/dist/forms/forms/fields/checkbox.d.ts +9 -0
- package/dist/forms/forms/fields/date-picker.d.ts +15 -0
- package/dist/forms/forms/fields/file-upload.d.ts +17 -0
- package/dist/forms/forms/fields/hidden.d.ts +9 -0
- package/dist/forms/forms/fields/index.d.ts +12 -0
- package/dist/forms/forms/fields/radio-group.d.ts +14 -0
- package/dist/forms/forms/fields/repeater.d.ts +21 -0
- package/dist/forms/forms/fields/select.d.ts +16 -0
- package/dist/forms/forms/fields/text-input.d.ts +20 -0
- package/dist/forms/forms/fields/textarea.d.ts +14 -0
- package/dist/forms/forms/fields/toggle.d.ts +11 -0
- package/dist/forms/forms/index.d.ts +26 -0
- package/dist/forms/forms/types/actions.d.ts +11 -0
- package/dist/forms/forms/types/field.d.ts +98 -0
- package/dist/forms/forms/types/form.d.ts +37 -0
- package/dist/forms/forms/types/index.d.ts +4 -0
- package/dist/forms/forms/types/layout.d.ts +31 -0
- package/dist/forms/index.d.ts +25 -0
- package/dist/forms/index.esm.js +1052 -0
- package/dist/forms/index.esm.js.map +1 -0
- package/dist/forms/index.js +1077 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/forms/inertia/index.d.ts +4 -0
- package/dist/forms/inertia/precognition.d.ts +6 -0
- package/dist/forms/inertia/types.d.ts +63 -0
- package/dist/forms/inertia/use-inertia-form.d.ts +2 -0
- package/dist/forms/inertia/use-server-table.d.ts +2 -0
- package/dist/forms/tablefy/avatar-list.d.ts +15 -0
- package/dist/forms/tablefy/data-table-empty.d.ts +8 -0
- package/dist/forms/tablefy/data-table-header.d.ts +17 -0
- package/dist/forms/tablefy/data-table-pagination.d.ts +9 -0
- package/dist/forms/tablefy/data-table-schema.d.ts +1 -0
- package/dist/forms/tablefy/data-table.d.ts +13 -0
- package/dist/forms/tablefy/index.d.ts +6 -0
- package/dist/forms/types/actions.d.ts +21 -0
- package/dist/forms/types/empty-state.d.ts +18 -0
- package/dist/forms/types/field.d.ts +98 -0
- package/dist/forms/types/filters.d.ts +25 -0
- package/dist/forms/types/form.d.ts +37 -0
- package/dist/forms/types/index.d.ts +4 -0
- package/dist/forms/types/layout.d.ts +31 -0
- package/dist/forms/types/table.d.ts +42 -0
- package/dist/forms/utils.d.ts +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.esm.js +1085 -21
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1093 -12
- package/dist/index.js.map +1 -1
- package/dist/inertia/builders/empty-state.d.ts +46 -0
- package/dist/inertia/builders/index.d.ts +2 -0
- package/dist/inertia/builders/table-schema.d.ts +45 -0
- package/dist/inertia/columns/actions-column.d.ts +26 -0
- package/dist/inertia/columns/avatar-group-column.d.ts +38 -0
- package/dist/inertia/columns/badge-column.d.ts +29 -0
- package/dist/inertia/columns/base-column.d.ts +21 -0
- package/dist/inertia/columns/button-column.d.ts +14 -0
- package/dist/inertia/columns/checkbox-column.d.ts +5 -0
- package/dist/inertia/columns/date-column.d.ts +24 -0
- package/dist/inertia/columns/dropdown-column.d.ts +17 -0
- package/dist/inertia/columns/enum-column.d.ts +52 -0
- package/dist/inertia/columns/icon-column.d.ts +58 -0
- package/dist/inertia/columns/image-column.d.ts +21 -0
- package/dist/inertia/columns/index.d.ts +18 -0
- package/dist/inertia/columns/input-column.d.ts +27 -0
- package/dist/inertia/columns/link-column.d.ts +27 -0
- package/dist/inertia/columns/number-column.d.ts +23 -0
- package/dist/inertia/columns/progress-column.d.ts +30 -0
- package/dist/inertia/columns/select-column.d.ts +24 -0
- package/dist/inertia/columns/text-column.d.ts +14 -0
- package/dist/inertia/columns/types.d.ts +46 -0
- package/dist/inertia/confirm/ConfirmProvider.d.ts +6 -0
- package/dist/inertia/confirm/confirm.d.ts +3 -0
- package/dist/inertia/confirm/index.d.ts +3 -0
- package/dist/inertia/confirm/types.d.ts +10 -0
- package/dist/inertia/forms/builders/actions-builder.d.ts +14 -0
- package/dist/inertia/forms/builders/form-schema.d.ts +35 -0
- package/dist/inertia/forms/builders/index.d.ts +5 -0
- package/dist/inertia/forms/builders/section-builder.d.ts +16 -0
- package/dist/inertia/forms/builders/tab-builder.d.ts +16 -0
- package/dist/inertia/forms/builders/wizard-builder.d.ts +17 -0
- package/dist/inertia/forms/components/field-renderer.d.ts +12 -0
- package/dist/inertia/forms/components/form-actions.d.ts +9 -0
- package/dist/inertia/forms/components/form-renderer.d.ts +14 -0
- package/dist/inertia/forms/components/grid-layout.d.ts +7 -0
- package/dist/inertia/forms/components/index.d.ts +9 -0
- package/dist/inertia/forms/components/section-renderer.d.ts +14 -0
- package/dist/inertia/forms/components/tab-renderer.d.ts +15 -0
- package/dist/inertia/forms/components/wizard-renderer.d.ts +17 -0
- package/dist/inertia/forms/fields/base-field.d.ts +24 -0
- package/dist/inertia/forms/fields/checkbox-group.d.ts +12 -0
- package/dist/inertia/forms/fields/checkbox.d.ts +9 -0
- package/dist/inertia/forms/fields/date-picker.d.ts +15 -0
- package/dist/inertia/forms/fields/file-upload.d.ts +17 -0
- package/dist/inertia/forms/fields/hidden.d.ts +9 -0
- package/dist/inertia/forms/fields/index.d.ts +12 -0
- package/dist/inertia/forms/fields/radio-group.d.ts +14 -0
- package/dist/inertia/forms/fields/repeater.d.ts +21 -0
- package/dist/inertia/forms/fields/select.d.ts +16 -0
- package/dist/inertia/forms/fields/text-input.d.ts +20 -0
- package/dist/inertia/forms/fields/textarea.d.ts +14 -0
- package/dist/inertia/forms/fields/toggle.d.ts +11 -0
- package/dist/inertia/forms/index.d.ts +26 -0
- package/dist/inertia/forms/types/actions.d.ts +11 -0
- package/dist/inertia/forms/types/field.d.ts +98 -0
- package/dist/inertia/forms/types/form.d.ts +37 -0
- package/dist/inertia/forms/types/index.d.ts +4 -0
- package/dist/inertia/forms/types/layout.d.ts +31 -0
- package/dist/inertia/index.d.ts +25 -0
- package/dist/inertia/index.esm.js +149 -0
- package/dist/inertia/index.esm.js.map +1 -0
- package/dist/inertia/index.js +153 -0
- package/dist/inertia/index.js.map +1 -0
- package/dist/inertia/inertia/index.d.ts +4 -0
- package/dist/inertia/inertia/precognition.d.ts +6 -0
- package/dist/inertia/inertia/types.d.ts +63 -0
- package/dist/inertia/inertia/use-inertia-form.d.ts +2 -0
- package/dist/inertia/inertia/use-server-table.d.ts +2 -0
- package/dist/inertia/precognition.d.ts +6 -0
- package/dist/inertia/tablefy/avatar-list.d.ts +15 -0
- package/dist/inertia/tablefy/data-table-empty.d.ts +8 -0
- package/dist/inertia/tablefy/data-table-header.d.ts +17 -0
- package/dist/inertia/tablefy/data-table-pagination.d.ts +9 -0
- package/dist/inertia/tablefy/data-table-schema.d.ts +1 -0
- package/dist/inertia/tablefy/data-table.d.ts +13 -0
- package/dist/inertia/tablefy/index.d.ts +6 -0
- package/dist/inertia/types/actions.d.ts +21 -0
- package/dist/inertia/types/empty-state.d.ts +18 -0
- package/dist/inertia/types/filters.d.ts +25 -0
- package/dist/inertia/types/index.d.ts +4 -0
- package/dist/inertia/types/table.d.ts +42 -0
- package/dist/inertia/types.d.ts +63 -0
- package/dist/inertia/use-inertia-form.d.ts +2 -0
- package/dist/inertia/use-server-table.d.ts +2 -0
- package/dist/inertia/utils.d.ts +1 -0
- package/package.json +39 -13
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
export interface SectionConfig<TData extends Record<string, any>> {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
fields: string[];
|
|
7
|
+
columns?: number;
|
|
8
|
+
collapsible?: boolean;
|
|
9
|
+
collapsed?: boolean;
|
|
10
|
+
icon?: ReactNode;
|
|
11
|
+
hidden?: (data: TData) => boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface TabConfig<TData extends Record<string, any>> {
|
|
14
|
+
id: string;
|
|
15
|
+
label: string;
|
|
16
|
+
icon?: ReactNode;
|
|
17
|
+
fields?: string[];
|
|
18
|
+
sections?: SectionConfig<TData>[];
|
|
19
|
+
badge?: string | number | ((data: TData) => string | number);
|
|
20
|
+
disabled?: (data: TData) => boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface WizardStepConfig<TData extends Record<string, any>> {
|
|
23
|
+
id: string;
|
|
24
|
+
label: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
icon?: ReactNode;
|
|
27
|
+
fields?: string[];
|
|
28
|
+
sections?: SectionConfig<TData>[];
|
|
29
|
+
canProceed?: (data: TData) => boolean;
|
|
30
|
+
beforeNext?: (data: TData) => Promise<boolean> | boolean;
|
|
31
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export { DataTable } from "./tablefy/data-table";
|
|
2
|
+
export { DataTableSchema } from "./tablefy/data-table-schema";
|
|
3
|
+
export { TableSchema, EmptyStateBuilder } from "./builders";
|
|
4
|
+
export { AvatarGroupColumn, AvatarGroupColumn as avatarGroupColumn, } from "./columns/avatar-group-column";
|
|
5
|
+
export { BadgeColumn, BadgeColumn as badgeColumn, } from "./columns/badge-column";
|
|
6
|
+
export { ButtonColumn, ButtonColumn as buttonColumn, } from "./columns/button-column";
|
|
7
|
+
export { CheckboxColumn, CheckboxColumn as checkboxColumn, } from "./columns/checkbox-column";
|
|
8
|
+
export { DateColumn, DateColumn as dateColumn } from "./columns/date-column";
|
|
9
|
+
export { DropdownColumn, DropdownColumn as dropdownColumn, } from "./columns/dropdown-column";
|
|
10
|
+
export { IconColumn, IconColumn as iconColumn } from "./columns/icon-column";
|
|
11
|
+
export { ImageColumn } from "./columns/image-column";
|
|
12
|
+
export { InputColumn, InputColumn as inputColumn, } from "./columns/input-column";
|
|
13
|
+
export { LinkColumn } from "./columns/link-column";
|
|
14
|
+
export { NumberColumn } from "./columns/number-column";
|
|
15
|
+
export { ProgressColumn, SelectColumn } from "./columns";
|
|
16
|
+
export { ActionsColumn, ActionsColumn as actionsColumn, } from "./columns/actions-column";
|
|
17
|
+
export type { ActionItem } from "./columns/actions-column";
|
|
18
|
+
export { TextColumn, TextColumn as textColumn } from "./columns/text-column";
|
|
19
|
+
export { EnumColumn, EnumColumn as enumColumn } from "./columns/enum-column";
|
|
20
|
+
export type { EnumOption } from "./columns/enum-column";
|
|
21
|
+
export { ConfirmProvider, confirm } from "./confirm";
|
|
22
|
+
export type { ConfirmOptions } from "./confirm";
|
|
23
|
+
export type { DataTableConfig, EmptyStateConfig, FilterConfig, HeaderAction, PaginationConfig, SearchConfig, } from "./types";
|
|
24
|
+
export { FormSchema, ActionsBuilder, SectionBuilder, TabBuilder, WizardStep, TextInput, Textarea, Select, Checkbox, Toggle, RadioGroup, DatePicker, Hidden, FileUpload, CheckboxGroup, Repeater, FormRenderer, } from "./forms";
|
|
25
|
+
export type { FormSchemaConfig, FormBuildResult, FormRendererProps, BuiltField, FieldType, FieldRenderProps, BaseFieldConfig, SelectOption as FormSelectOption, FormActionConfig, SectionConfig, TabConfig, WizardStepConfig, } from "./forms";
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { useForm, router } from '@inertiajs/react';
|
|
2
|
+
import { useMemo, useCallback, useState, useRef } from 'react';
|
|
3
|
+
|
|
4
|
+
function useInertiaForm(options) {
|
|
5
|
+
const { schema, initialData, url, method = "post", onSuccess, onError, onBefore, onFinish, preserveScroll, } = options;
|
|
6
|
+
// Compute default values from schema fields
|
|
7
|
+
const defaults = useMemo(() => {
|
|
8
|
+
const d = {};
|
|
9
|
+
for (const field of schema.fields) {
|
|
10
|
+
d[field.name] =
|
|
11
|
+
field.config.defaultValue !== undefined
|
|
12
|
+
? field.config.defaultValue
|
|
13
|
+
: "";
|
|
14
|
+
}
|
|
15
|
+
return { ...d, ...initialData };
|
|
16
|
+
}, [schema, initialData]);
|
|
17
|
+
const form = useForm(defaults);
|
|
18
|
+
const handleChange = useCallback((field, value) => {
|
|
19
|
+
form.setData(field, value);
|
|
20
|
+
}, [form]);
|
|
21
|
+
const handleSubmit = useCallback(() => {
|
|
22
|
+
if (!url)
|
|
23
|
+
return;
|
|
24
|
+
const submitOptions = {
|
|
25
|
+
onSuccess: () => onSuccess?.(),
|
|
26
|
+
onError: (errors) => onError?.(errors),
|
|
27
|
+
onBefore: () => onBefore?.(),
|
|
28
|
+
onFinish: () => onFinish?.(),
|
|
29
|
+
preserveScroll,
|
|
30
|
+
};
|
|
31
|
+
switch (method) {
|
|
32
|
+
case "post":
|
|
33
|
+
form.post(url, submitOptions);
|
|
34
|
+
break;
|
|
35
|
+
case "put":
|
|
36
|
+
form.put(url, submitOptions);
|
|
37
|
+
break;
|
|
38
|
+
case "patch":
|
|
39
|
+
form.patch(url, submitOptions);
|
|
40
|
+
break;
|
|
41
|
+
case "delete":
|
|
42
|
+
form.delete(url, submitOptions);
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
}, [form, url, method, onSuccess, onError, onBefore, onFinish, preserveScroll]);
|
|
46
|
+
return {
|
|
47
|
+
data: form.data,
|
|
48
|
+
errors: form.errors,
|
|
49
|
+
onChange: handleChange,
|
|
50
|
+
onSubmit: handleSubmit,
|
|
51
|
+
processing: form.processing,
|
|
52
|
+
form,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function useServerTable(config) {
|
|
57
|
+
const { url, defaultSort = null, defaultPageSize = 15, debounce = 300, preserveState = true, preserveScroll = true, only, } = config;
|
|
58
|
+
const [state, setState] = useState({
|
|
59
|
+
search: "",
|
|
60
|
+
sort: defaultSort,
|
|
61
|
+
page: 1,
|
|
62
|
+
perPage: defaultPageSize,
|
|
63
|
+
filters: {},
|
|
64
|
+
});
|
|
65
|
+
const debounceTimer = useRef(null);
|
|
66
|
+
const visitWithState = useCallback((newState) => {
|
|
67
|
+
const params = {};
|
|
68
|
+
if (newState.search)
|
|
69
|
+
params.search = newState.search;
|
|
70
|
+
if (newState.sort) {
|
|
71
|
+
params.sort = newState.sort.id;
|
|
72
|
+
params.direction = newState.sort.desc ? "desc" : "asc";
|
|
73
|
+
}
|
|
74
|
+
params.page = newState.page;
|
|
75
|
+
params.per_page = newState.perPage;
|
|
76
|
+
for (const [key, value] of Object.entries(newState.filters)) {
|
|
77
|
+
if (value !== null && value !== undefined && value !== "") {
|
|
78
|
+
params[`filter[${key}]`] = value;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
router.visit(url, {
|
|
82
|
+
data: params,
|
|
83
|
+
preserveState,
|
|
84
|
+
preserveScroll,
|
|
85
|
+
only,
|
|
86
|
+
replace: true,
|
|
87
|
+
});
|
|
88
|
+
}, [url, preserveState, preserveScroll, only]);
|
|
89
|
+
const setSearch = useCallback((search) => {
|
|
90
|
+
const newState = { ...state, search, page: 1 };
|
|
91
|
+
setState(newState);
|
|
92
|
+
if (debounceTimer.current)
|
|
93
|
+
clearTimeout(debounceTimer.current);
|
|
94
|
+
debounceTimer.current = setTimeout(() => visitWithState(newState), debounce);
|
|
95
|
+
}, [state, debounce, visitWithState]);
|
|
96
|
+
const setSort = useCallback((sort) => {
|
|
97
|
+
const newState = { ...state, sort };
|
|
98
|
+
setState(newState);
|
|
99
|
+
visitWithState(newState);
|
|
100
|
+
}, [state, visitWithState]);
|
|
101
|
+
const setPage = useCallback((page) => {
|
|
102
|
+
const newState = { ...state, page };
|
|
103
|
+
setState(newState);
|
|
104
|
+
visitWithState(newState);
|
|
105
|
+
}, [state, visitWithState]);
|
|
106
|
+
const setPerPage = useCallback((perPage) => {
|
|
107
|
+
const newState = { ...state, perPage, page: 1 };
|
|
108
|
+
setState(newState);
|
|
109
|
+
visitWithState(newState);
|
|
110
|
+
}, [state, visitWithState]);
|
|
111
|
+
const setFilter = useCallback((key, value) => {
|
|
112
|
+
const newState = {
|
|
113
|
+
...state,
|
|
114
|
+
filters: { ...state.filters, [key]: value },
|
|
115
|
+
page: 1,
|
|
116
|
+
};
|
|
117
|
+
setState(newState);
|
|
118
|
+
visitWithState(newState);
|
|
119
|
+
}, [state, visitWithState]);
|
|
120
|
+
const resetFilters = useCallback(() => {
|
|
121
|
+
const newState = { ...state, filters: {}, page: 1 };
|
|
122
|
+
setState(newState);
|
|
123
|
+
visitWithState(newState);
|
|
124
|
+
}, [state, visitWithState]);
|
|
125
|
+
return {
|
|
126
|
+
state,
|
|
127
|
+
setSearch,
|
|
128
|
+
setSort,
|
|
129
|
+
setPage,
|
|
130
|
+
setPerPage,
|
|
131
|
+
setFilter,
|
|
132
|
+
resetFilters,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Creates a precognition onBlur handler for a form field.
|
|
138
|
+
* Requires Laravel Precognition middleware on the backend
|
|
139
|
+
* and @inertiajs/react with precognition support.
|
|
140
|
+
*/
|
|
141
|
+
function createPrecognitionBlur(form, fieldName) {
|
|
142
|
+
if (typeof form?.validate === "function") {
|
|
143
|
+
return () => form.validate(fieldName);
|
|
144
|
+
}
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export { createPrecognitionBlur, useInertiaForm, useServerTable };
|
|
149
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../src/inertia/use-inertia-form.ts","../../src/inertia/use-server-table.ts","../../src/inertia/precognition.ts"],"sourcesContent":["import { useForm as useInertiaUseForm } from \"@inertiajs/react\";\nimport { useMemo, useCallback } from \"react\";\nimport { UseInertiaFormOptions, UseInertiaFormReturn } from \"./types\";\n\nexport function useInertiaForm<TData extends Record<string, any>>(\n options: UseInertiaFormOptions<TData>,\n): UseInertiaFormReturn<TData> {\n const {\n schema,\n initialData,\n url,\n method = \"post\",\n onSuccess,\n onError,\n onBefore,\n onFinish,\n preserveScroll,\n } = options;\n\n // Compute default values from schema fields\n const defaults = useMemo(() => {\n const d: Record<string, any> = {};\n for (const field of schema.fields) {\n d[field.name] =\n field.config.defaultValue !== undefined\n ? field.config.defaultValue\n : \"\";\n }\n return { ...d, ...initialData } as TData;\n }, [schema, initialData]);\n\n const form = useInertiaUseForm<TData>(defaults);\n\n const handleChange = useCallback(\n (field: keyof TData, value: any) => {\n form.setData(field as string, value);\n },\n [form],\n );\n\n const handleSubmit = useCallback(() => {\n if (!url) return;\n\n const submitOptions = {\n onSuccess: () => onSuccess?.(),\n onError: (errors: any) => onError?.(errors),\n onBefore: () => onBefore?.(),\n onFinish: () => onFinish?.(),\n preserveScroll,\n };\n\n switch (method) {\n case \"post\":\n form.post(url, submitOptions);\n break;\n case \"put\":\n form.put(url, submitOptions);\n break;\n case \"patch\":\n form.patch(url, submitOptions);\n break;\n case \"delete\":\n form.delete(url, submitOptions);\n break;\n }\n }, [form, url, method, onSuccess, onError, onBefore, onFinish, preserveScroll]);\n\n return {\n data: form.data,\n errors: form.errors as Partial<Record<keyof TData, string>>,\n onChange: handleChange,\n onSubmit: handleSubmit,\n processing: form.processing,\n form,\n };\n}\n","import { router } from \"@inertiajs/react\";\nimport { useState, useCallback, useRef } from \"react\";\nimport {\n ServerTableConfig,\n ServerTableState,\n ServerTableReturn,\n} from \"./types\";\n\nexport function useServerTable(config: ServerTableConfig): ServerTableReturn {\n const {\n url,\n defaultSort = null,\n defaultPageSize = 15,\n debounce = 300,\n preserveState = true,\n preserveScroll = true,\n only,\n } = config;\n\n const [state, setState] = useState<ServerTableState>({\n search: \"\",\n sort: defaultSort,\n page: 1,\n perPage: defaultPageSize,\n filters: {},\n });\n\n const debounceTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const visitWithState = useCallback(\n (newState: ServerTableState) => {\n const params: Record<string, any> = {};\n\n if (newState.search) params.search = newState.search;\n if (newState.sort) {\n params.sort = newState.sort.id;\n params.direction = newState.sort.desc ? \"desc\" : \"asc\";\n }\n params.page = newState.page;\n params.per_page = newState.perPage;\n\n for (const [key, value] of Object.entries(newState.filters)) {\n if (value !== null && value !== undefined && value !== \"\") {\n params[`filter[${key}]`] = value;\n }\n }\n\n router.visit(url, {\n data: params,\n preserveState,\n preserveScroll,\n only,\n replace: true,\n });\n },\n [url, preserveState, preserveScroll, only],\n );\n\n const setSearch = useCallback(\n (search: string) => {\n const newState = { ...state, search, page: 1 };\n setState(newState);\n\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n debounceTimer.current = setTimeout(\n () => visitWithState(newState),\n debounce,\n );\n },\n [state, debounce, visitWithState],\n );\n\n const setSort = useCallback(\n (sort: { id: string; desc: boolean } | null) => {\n const newState = { ...state, sort };\n setState(newState);\n visitWithState(newState);\n },\n [state, visitWithState],\n );\n\n const setPage = useCallback(\n (page: number) => {\n const newState = { ...state, page };\n setState(newState);\n visitWithState(newState);\n },\n [state, visitWithState],\n );\n\n const setPerPage = useCallback(\n (perPage: number) => {\n const newState = { ...state, perPage, page: 1 };\n setState(newState);\n visitWithState(newState);\n },\n [state, visitWithState],\n );\n\n const setFilter = useCallback(\n (key: string, value: any) => {\n const newState = {\n ...state,\n filters: { ...state.filters, [key]: value },\n page: 1,\n };\n setState(newState);\n visitWithState(newState);\n },\n [state, visitWithState],\n );\n\n const resetFilters = useCallback(() => {\n const newState = { ...state, filters: {}, page: 1 };\n setState(newState);\n visitWithState(newState);\n }, [state, visitWithState]);\n\n return {\n state,\n setSearch,\n setSort,\n setPage,\n setPerPage,\n setFilter,\n resetFilters,\n };\n}\n","/**\n * Creates a precognition onBlur handler for a form field.\n * Requires Laravel Precognition middleware on the backend\n * and @inertiajs/react with precognition support.\n */\nexport function createPrecognitionBlur(\n form: any,\n fieldName: string,\n): (() => void) | undefined {\n if (typeof form?.validate === \"function\") {\n return () => form.validate(fieldName);\n }\n return undefined;\n}\n"],"names":["useInertiaUseForm"],"mappings":"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"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react$1 = require('@inertiajs/react');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
|
|
6
|
+
function useInertiaForm(options) {
|
|
7
|
+
const { schema, initialData, url, method = "post", onSuccess, onError, onBefore, onFinish, preserveScroll, } = options;
|
|
8
|
+
// Compute default values from schema fields
|
|
9
|
+
const defaults = react.useMemo(() => {
|
|
10
|
+
const d = {};
|
|
11
|
+
for (const field of schema.fields) {
|
|
12
|
+
d[field.name] =
|
|
13
|
+
field.config.defaultValue !== undefined
|
|
14
|
+
? field.config.defaultValue
|
|
15
|
+
: "";
|
|
16
|
+
}
|
|
17
|
+
return { ...d, ...initialData };
|
|
18
|
+
}, [schema, initialData]);
|
|
19
|
+
const form = react$1.useForm(defaults);
|
|
20
|
+
const handleChange = react.useCallback((field, value) => {
|
|
21
|
+
form.setData(field, value);
|
|
22
|
+
}, [form]);
|
|
23
|
+
const handleSubmit = react.useCallback(() => {
|
|
24
|
+
if (!url)
|
|
25
|
+
return;
|
|
26
|
+
const submitOptions = {
|
|
27
|
+
onSuccess: () => onSuccess?.(),
|
|
28
|
+
onError: (errors) => onError?.(errors),
|
|
29
|
+
onBefore: () => onBefore?.(),
|
|
30
|
+
onFinish: () => onFinish?.(),
|
|
31
|
+
preserveScroll,
|
|
32
|
+
};
|
|
33
|
+
switch (method) {
|
|
34
|
+
case "post":
|
|
35
|
+
form.post(url, submitOptions);
|
|
36
|
+
break;
|
|
37
|
+
case "put":
|
|
38
|
+
form.put(url, submitOptions);
|
|
39
|
+
break;
|
|
40
|
+
case "patch":
|
|
41
|
+
form.patch(url, submitOptions);
|
|
42
|
+
break;
|
|
43
|
+
case "delete":
|
|
44
|
+
form.delete(url, submitOptions);
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
}, [form, url, method, onSuccess, onError, onBefore, onFinish, preserveScroll]);
|
|
48
|
+
return {
|
|
49
|
+
data: form.data,
|
|
50
|
+
errors: form.errors,
|
|
51
|
+
onChange: handleChange,
|
|
52
|
+
onSubmit: handleSubmit,
|
|
53
|
+
processing: form.processing,
|
|
54
|
+
form,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function useServerTable(config) {
|
|
59
|
+
const { url, defaultSort = null, defaultPageSize = 15, debounce = 300, preserveState = true, preserveScroll = true, only, } = config;
|
|
60
|
+
const [state, setState] = react.useState({
|
|
61
|
+
search: "",
|
|
62
|
+
sort: defaultSort,
|
|
63
|
+
page: 1,
|
|
64
|
+
perPage: defaultPageSize,
|
|
65
|
+
filters: {},
|
|
66
|
+
});
|
|
67
|
+
const debounceTimer = react.useRef(null);
|
|
68
|
+
const visitWithState = react.useCallback((newState) => {
|
|
69
|
+
const params = {};
|
|
70
|
+
if (newState.search)
|
|
71
|
+
params.search = newState.search;
|
|
72
|
+
if (newState.sort) {
|
|
73
|
+
params.sort = newState.sort.id;
|
|
74
|
+
params.direction = newState.sort.desc ? "desc" : "asc";
|
|
75
|
+
}
|
|
76
|
+
params.page = newState.page;
|
|
77
|
+
params.per_page = newState.perPage;
|
|
78
|
+
for (const [key, value] of Object.entries(newState.filters)) {
|
|
79
|
+
if (value !== null && value !== undefined && value !== "") {
|
|
80
|
+
params[`filter[${key}]`] = value;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
react$1.router.visit(url, {
|
|
84
|
+
data: params,
|
|
85
|
+
preserveState,
|
|
86
|
+
preserveScroll,
|
|
87
|
+
only,
|
|
88
|
+
replace: true,
|
|
89
|
+
});
|
|
90
|
+
}, [url, preserveState, preserveScroll, only]);
|
|
91
|
+
const setSearch = react.useCallback((search) => {
|
|
92
|
+
const newState = { ...state, search, page: 1 };
|
|
93
|
+
setState(newState);
|
|
94
|
+
if (debounceTimer.current)
|
|
95
|
+
clearTimeout(debounceTimer.current);
|
|
96
|
+
debounceTimer.current = setTimeout(() => visitWithState(newState), debounce);
|
|
97
|
+
}, [state, debounce, visitWithState]);
|
|
98
|
+
const setSort = react.useCallback((sort) => {
|
|
99
|
+
const newState = { ...state, sort };
|
|
100
|
+
setState(newState);
|
|
101
|
+
visitWithState(newState);
|
|
102
|
+
}, [state, visitWithState]);
|
|
103
|
+
const setPage = react.useCallback((page) => {
|
|
104
|
+
const newState = { ...state, page };
|
|
105
|
+
setState(newState);
|
|
106
|
+
visitWithState(newState);
|
|
107
|
+
}, [state, visitWithState]);
|
|
108
|
+
const setPerPage = react.useCallback((perPage) => {
|
|
109
|
+
const newState = { ...state, perPage, page: 1 };
|
|
110
|
+
setState(newState);
|
|
111
|
+
visitWithState(newState);
|
|
112
|
+
}, [state, visitWithState]);
|
|
113
|
+
const setFilter = react.useCallback((key, value) => {
|
|
114
|
+
const newState = {
|
|
115
|
+
...state,
|
|
116
|
+
filters: { ...state.filters, [key]: value },
|
|
117
|
+
page: 1,
|
|
118
|
+
};
|
|
119
|
+
setState(newState);
|
|
120
|
+
visitWithState(newState);
|
|
121
|
+
}, [state, visitWithState]);
|
|
122
|
+
const resetFilters = react.useCallback(() => {
|
|
123
|
+
const newState = { ...state, filters: {}, page: 1 };
|
|
124
|
+
setState(newState);
|
|
125
|
+
visitWithState(newState);
|
|
126
|
+
}, [state, visitWithState]);
|
|
127
|
+
return {
|
|
128
|
+
state,
|
|
129
|
+
setSearch,
|
|
130
|
+
setSort,
|
|
131
|
+
setPage,
|
|
132
|
+
setPerPage,
|
|
133
|
+
setFilter,
|
|
134
|
+
resetFilters,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Creates a precognition onBlur handler for a form field.
|
|
140
|
+
* Requires Laravel Precognition middleware on the backend
|
|
141
|
+
* and @inertiajs/react with precognition support.
|
|
142
|
+
*/
|
|
143
|
+
function createPrecognitionBlur(form, fieldName) {
|
|
144
|
+
if (typeof form?.validate === "function") {
|
|
145
|
+
return () => form.validate(fieldName);
|
|
146
|
+
}
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
exports.createPrecognitionBlur = createPrecognitionBlur;
|
|
151
|
+
exports.useInertiaForm = useInertiaForm;
|
|
152
|
+
exports.useServerTable = useServerTable;
|
|
153
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/inertia/use-inertia-form.ts","../../src/inertia/use-server-table.ts","../../src/inertia/precognition.ts"],"sourcesContent":["import { useForm as useInertiaUseForm } from \"@inertiajs/react\";\nimport { useMemo, useCallback } from \"react\";\nimport { UseInertiaFormOptions, UseInertiaFormReturn } from \"./types\";\n\nexport function useInertiaForm<TData extends Record<string, any>>(\n options: UseInertiaFormOptions<TData>,\n): UseInertiaFormReturn<TData> {\n const {\n schema,\n initialData,\n url,\n method = \"post\",\n onSuccess,\n onError,\n onBefore,\n onFinish,\n preserveScroll,\n } = options;\n\n // Compute default values from schema fields\n const defaults = useMemo(() => {\n const d: Record<string, any> = {};\n for (const field of schema.fields) {\n d[field.name] =\n field.config.defaultValue !== undefined\n ? field.config.defaultValue\n : \"\";\n }\n return { ...d, ...initialData } as TData;\n }, [schema, initialData]);\n\n const form = useInertiaUseForm<TData>(defaults);\n\n const handleChange = useCallback(\n (field: keyof TData, value: any) => {\n form.setData(field as string, value);\n },\n [form],\n );\n\n const handleSubmit = useCallback(() => {\n if (!url) return;\n\n const submitOptions = {\n onSuccess: () => onSuccess?.(),\n onError: (errors: any) => onError?.(errors),\n onBefore: () => onBefore?.(),\n onFinish: () => onFinish?.(),\n preserveScroll,\n };\n\n switch (method) {\n case \"post\":\n form.post(url, submitOptions);\n break;\n case \"put\":\n form.put(url, submitOptions);\n break;\n case \"patch\":\n form.patch(url, submitOptions);\n break;\n case \"delete\":\n form.delete(url, submitOptions);\n break;\n }\n }, [form, url, method, onSuccess, onError, onBefore, onFinish, preserveScroll]);\n\n return {\n data: form.data,\n errors: form.errors as Partial<Record<keyof TData, string>>,\n onChange: handleChange,\n onSubmit: handleSubmit,\n processing: form.processing,\n form,\n };\n}\n","import { router } from \"@inertiajs/react\";\nimport { useState, useCallback, useRef } from \"react\";\nimport {\n ServerTableConfig,\n ServerTableState,\n ServerTableReturn,\n} from \"./types\";\n\nexport function useServerTable(config: ServerTableConfig): ServerTableReturn {\n const {\n url,\n defaultSort = null,\n defaultPageSize = 15,\n debounce = 300,\n preserveState = true,\n preserveScroll = true,\n only,\n } = config;\n\n const [state, setState] = useState<ServerTableState>({\n search: \"\",\n sort: defaultSort,\n page: 1,\n perPage: defaultPageSize,\n filters: {},\n });\n\n const debounceTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const visitWithState = useCallback(\n (newState: ServerTableState) => {\n const params: Record<string, any> = {};\n\n if (newState.search) params.search = newState.search;\n if (newState.sort) {\n params.sort = newState.sort.id;\n params.direction = newState.sort.desc ? \"desc\" : \"asc\";\n }\n params.page = newState.page;\n params.per_page = newState.perPage;\n\n for (const [key, value] of Object.entries(newState.filters)) {\n if (value !== null && value !== undefined && value !== \"\") {\n params[`filter[${key}]`] = value;\n }\n }\n\n router.visit(url, {\n data: params,\n preserveState,\n preserveScroll,\n only,\n replace: true,\n });\n },\n [url, preserveState, preserveScroll, only],\n );\n\n const setSearch = useCallback(\n (search: string) => {\n const newState = { ...state, search, page: 1 };\n setState(newState);\n\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n debounceTimer.current = setTimeout(\n () => visitWithState(newState),\n debounce,\n );\n },\n [state, debounce, visitWithState],\n );\n\n const setSort = useCallback(\n (sort: { id: string; desc: boolean } | null) => {\n const newState = { ...state, sort };\n setState(newState);\n visitWithState(newState);\n },\n [state, visitWithState],\n );\n\n const setPage = useCallback(\n (page: number) => {\n const newState = { ...state, page };\n setState(newState);\n visitWithState(newState);\n },\n [state, visitWithState],\n );\n\n const setPerPage = useCallback(\n (perPage: number) => {\n const newState = { ...state, perPage, page: 1 };\n setState(newState);\n visitWithState(newState);\n },\n [state, visitWithState],\n );\n\n const setFilter = useCallback(\n (key: string, value: any) => {\n const newState = {\n ...state,\n filters: { ...state.filters, [key]: value },\n page: 1,\n };\n setState(newState);\n visitWithState(newState);\n },\n [state, visitWithState],\n );\n\n const resetFilters = useCallback(() => {\n const newState = { ...state, filters: {}, page: 1 };\n setState(newState);\n visitWithState(newState);\n }, [state, visitWithState]);\n\n return {\n state,\n setSearch,\n setSort,\n setPage,\n setPerPage,\n setFilter,\n resetFilters,\n };\n}\n","/**\n * Creates a precognition onBlur handler for a form field.\n * Requires Laravel Precognition middleware on the backend\n * and @inertiajs/react with precognition support.\n */\nexport function createPrecognitionBlur(\n form: any,\n fieldName: string,\n): (() => void) | undefined {\n if (typeof form?.validate === \"function\") {\n return () => form.validate(fieldName);\n }\n return undefined;\n}\n"],"names":["useMemo","useInertiaUseForm","useCallback","useState","useRef","router"],"mappings":";;;;;AAIM,SAAU,cAAc,CAC5B,OAAqC,EAAA;IAErC,MAAM,EACJ,MAAM,EACN,WAAW,EACX,GAAG,EACH,MAAM,GAAG,MAAM,EACf,SAAS,EACT,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,cAAc,GACf,GAAG,OAAO,CAAC;;AAGZ,IAAA,MAAM,QAAQ,GAAGA,aAAO,CAAC,MAAK;QAC5B,MAAM,CAAC,GAAwB,EAAE,CAAC;AAClC,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE;AACjC,YAAA,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;AACX,gBAAA,KAAK,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS;AACrC,sBAAE,KAAK,CAAC,MAAM,CAAC,YAAY;sBACzB,EAAE,CAAC;SACV;AACD,QAAA,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,WAAW,EAAW,CAAC;AAC3C,KAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;AAE1B,IAAA,MAAM,IAAI,GAAGC,eAAiB,CAAQ,QAAQ,CAAC,CAAC;IAEhD,MAAM,YAAY,GAAGC,iBAAW,CAC9B,CAAC,KAAkB,EAAE,KAAU,KAAI;AACjC,QAAA,IAAI,CAAC,OAAO,CAAC,KAAe,EAAE,KAAK,CAAC,CAAC;AACvC,KAAC,EACD,CAAC,IAAI,CAAC,CACP,CAAC;AAEF,IAAA,MAAM,YAAY,GAAGA,iBAAW,CAAC,MAAK;AACpC,QAAA,IAAI,CAAC,GAAG;YAAE,OAAO;AAEjB,QAAA,MAAM,aAAa,GAAG;AACpB,YAAA,SAAS,EAAE,MAAM,SAAS,IAAI;YAC9B,OAAO,EAAE,CAAC,MAAW,KAAK,OAAO,GAAG,MAAM,CAAC;AAC3C,YAAA,QAAQ,EAAE,MAAM,QAAQ,IAAI;AAC5B,YAAA,QAAQ,EAAE,MAAM,QAAQ,IAAI;YAC5B,cAAc;SACf,CAAC;QAEF,QAAQ,MAAM;AACZ,YAAA,KAAK,MAAM;AACT,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;gBAC9B,MAAM;AACR,YAAA,KAAK,KAAK;AACR,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;gBAC7B,MAAM;AACR,YAAA,KAAK,OAAO;AACV,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;gBAC/B,MAAM;AACR,YAAA,KAAK,QAAQ;AACX,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;gBAChC,MAAM;SACT;AACH,KAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;IAEhF,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAA8C;AAC3D,QAAA,QAAQ,EAAE,YAAY;AACtB,QAAA,QAAQ,EAAE,YAAY;QACtB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,IAAI;KACL,CAAC;AACJ;;ACnEM,SAAU,cAAc,CAAC,MAAyB,EAAA;IACtD,MAAM,EACJ,GAAG,EACH,WAAW,GAAG,IAAI,EAClB,eAAe,GAAG,EAAE,EACpB,QAAQ,GAAG,GAAG,EACd,aAAa,GAAG,IAAI,EACpB,cAAc,GAAG,IAAI,EACrB,IAAI,GACL,GAAG,MAAM,CAAC;AAEX,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGC,cAAQ,CAAmB;AACnD,QAAA,MAAM,EAAE,EAAE;AACV,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,IAAI,EAAE,CAAC;AACP,QAAA,OAAO,EAAE,eAAe;AACxB,QAAA,OAAO,EAAE,EAAE;AACZ,KAAA,CAAC,CAAC;AAEH,IAAA,MAAM,aAAa,GAAGC,YAAM,CAAuC,IAAI,CAAC,CAAC;AAEzE,IAAA,MAAM,cAAc,GAAGF,iBAAW,CAChC,CAAC,QAA0B,KAAI;QAC7B,MAAM,MAAM,GAAwB,EAAE,CAAC;QAEvC,IAAI,QAAQ,CAAC,MAAM;AAAE,YAAA,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;AACrD,QAAA,IAAI,QAAQ,CAAC,IAAI,EAAE;YACjB,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;AAC/B,YAAA,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC;SACxD;AACD,QAAA,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;AAC5B,QAAA,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC;AAEnC,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC3D,YAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE;AACzD,gBAAA,MAAM,CAAC,CAAU,OAAA,EAAA,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;aAClC;SACF;AAED,QAAAG,cAAM,CAAC,KAAK,CAAC,GAAG,EAAE;AAChB,YAAA,IAAI,EAAE,MAAM;YACZ,aAAa;YACb,cAAc;YACd,IAAI;AACJ,YAAA,OAAO,EAAE,IAAI;AACd,SAAA,CAAC,CAAC;KACJ,EACD,CAAC,GAAG,EAAE,aAAa,EAAE,cAAc,EAAE,IAAI,CAAC,CAC3C,CAAC;AAEF,IAAA,MAAM,SAAS,GAAGH,iBAAW,CAC3B,CAAC,MAAc,KAAI;AACjB,QAAA,MAAM,QAAQ,GAAG,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/C,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEnB,IAAI,aAAa,CAAC,OAAO;AAAE,YAAA,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAC/D,QAAA,aAAa,CAAC,OAAO,GAAG,UAAU,CAChC,MAAM,cAAc,CAAC,QAAQ,CAAC,EAC9B,QAAQ,CACT,CAAC;KACH,EACD,CAAC,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC,CAClC,CAAC;AAEF,IAAA,MAAM,OAAO,GAAGA,iBAAW,CACzB,CAAC,IAA0C,KAAI;QAC7C,MAAM,QAAQ,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;QACpC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,cAAc,CAAC,QAAQ,CAAC,CAAC;AAC3B,KAAC,EACD,CAAC,KAAK,EAAE,cAAc,CAAC,CACxB,CAAC;AAEF,IAAA,MAAM,OAAO,GAAGA,iBAAW,CACzB,CAAC,IAAY,KAAI;QACf,MAAM,QAAQ,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;QACpC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,cAAc,CAAC,QAAQ,CAAC,CAAC;AAC3B,KAAC,EACD,CAAC,KAAK,EAAE,cAAc,CAAC,CACxB,CAAC;AAEF,IAAA,MAAM,UAAU,GAAGA,iBAAW,CAC5B,CAAC,OAAe,KAAI;AAClB,QAAA,MAAM,QAAQ,GAAG,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAChD,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,cAAc,CAAC,QAAQ,CAAC,CAAC;AAC3B,KAAC,EACD,CAAC,KAAK,EAAE,cAAc,CAAC,CACxB,CAAC;IAEF,MAAM,SAAS,GAAGA,iBAAW,CAC3B,CAAC,GAAW,EAAE,KAAU,KAAI;AAC1B,QAAA,MAAM,QAAQ,GAAG;AACf,YAAA,GAAG,KAAK;AACR,YAAA,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE;AAC3C,YAAA,IAAI,EAAE,CAAC;SACR,CAAC;QACF,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,cAAc,CAAC,QAAQ,CAAC,CAAC;AAC3B,KAAC,EACD,CAAC,KAAK,EAAE,cAAc,CAAC,CACxB,CAAC;AAEF,IAAA,MAAM,YAAY,GAAGA,iBAAW,CAAC,MAAK;AACpC,QAAA,MAAM,QAAQ,GAAG,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACpD,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,cAAc,CAAC,QAAQ,CAAC,CAAC;AAC3B,KAAC,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;IAE5B,OAAO;QACL,KAAK;QACL,SAAS;QACT,OAAO;QACP,OAAO;QACP,UAAU;QACV,SAAS;QACT,YAAY;KACb,CAAC;AACJ;;AC/HA;;;;AAIG;AACa,SAAA,sBAAsB,CACpC,IAAS,EACT,SAAiB,EAAA;AAEjB,IAAA,IAAI,OAAO,IAAI,EAAE,QAAQ,KAAK,UAAU,EAAE;QACxC,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;KACvC;AACD,IAAA,OAAO,SAAS,CAAC;AACnB;;;;;;"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { useInertiaForm } from "./use-inertia-form";
|
|
2
|
+
export { useServerTable } from "./use-server-table";
|
|
3
|
+
export { createPrecognitionBlur } from "./precognition";
|
|
4
|
+
export type { UseInertiaFormOptions, UseInertiaFormReturn, ServerTableConfig, ServerTableState, ServerTableReturn, PaginatedResponse, } from "./types";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a precognition onBlur handler for a form field.
|
|
3
|
+
* Requires Laravel Precognition middleware on the backend
|
|
4
|
+
* and @inertiajs/react with precognition support.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createPrecognitionBlur(form: any, fieldName: string): (() => void) | undefined;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { FormBuildResult } from "../forms/types/form";
|
|
2
|
+
export interface UseInertiaFormOptions<TData extends Record<string, any>> {
|
|
3
|
+
schema: FormBuildResult<TData>;
|
|
4
|
+
initialData?: Partial<TData>;
|
|
5
|
+
url?: string;
|
|
6
|
+
method?: "post" | "put" | "patch" | "delete";
|
|
7
|
+
onSuccess?: () => void;
|
|
8
|
+
onError?: (errors: Partial<Record<keyof TData, string>>) => void;
|
|
9
|
+
onBefore?: () => void;
|
|
10
|
+
onFinish?: () => void;
|
|
11
|
+
preserveScroll?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface UseInertiaFormReturn<TData extends Record<string, any>> {
|
|
14
|
+
data: TData;
|
|
15
|
+
errors: Partial<Record<keyof TData, string>>;
|
|
16
|
+
onChange: (field: keyof TData, value: any) => void;
|
|
17
|
+
onSubmit: () => void;
|
|
18
|
+
processing: boolean;
|
|
19
|
+
form: any;
|
|
20
|
+
}
|
|
21
|
+
export interface ServerTableConfig {
|
|
22
|
+
url: string;
|
|
23
|
+
defaultSort?: {
|
|
24
|
+
id: string;
|
|
25
|
+
desc: boolean;
|
|
26
|
+
};
|
|
27
|
+
defaultPageSize?: number;
|
|
28
|
+
debounce?: number;
|
|
29
|
+
preserveState?: boolean;
|
|
30
|
+
preserveScroll?: boolean;
|
|
31
|
+
only?: string[];
|
|
32
|
+
}
|
|
33
|
+
export interface ServerTableState {
|
|
34
|
+
search: string;
|
|
35
|
+
sort: {
|
|
36
|
+
id: string;
|
|
37
|
+
desc: boolean;
|
|
38
|
+
} | null;
|
|
39
|
+
page: number;
|
|
40
|
+
perPage: number;
|
|
41
|
+
filters: Record<string, any>;
|
|
42
|
+
}
|
|
43
|
+
export interface ServerTableReturn {
|
|
44
|
+
state: ServerTableState;
|
|
45
|
+
setSearch: (search: string) => void;
|
|
46
|
+
setSort: (sort: {
|
|
47
|
+
id: string;
|
|
48
|
+
desc: boolean;
|
|
49
|
+
} | null) => void;
|
|
50
|
+
setPage: (page: number) => void;
|
|
51
|
+
setPerPage: (perPage: number) => void;
|
|
52
|
+
setFilter: (key: string, value: any) => void;
|
|
53
|
+
resetFilters: () => void;
|
|
54
|
+
}
|
|
55
|
+
export interface PaginatedResponse<TData> {
|
|
56
|
+
data: TData[];
|
|
57
|
+
current_page: number;
|
|
58
|
+
last_page: number;
|
|
59
|
+
per_page: number;
|
|
60
|
+
total: number;
|
|
61
|
+
from: number | null;
|
|
62
|
+
to: number | null;
|
|
63
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a precognition onBlur handler for a form field.
|
|
3
|
+
* Requires Laravel Precognition middleware on the backend
|
|
4
|
+
* and @inertiajs/react with precognition support.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createPrecognitionBlur(form: any, fieldName: string): (() => void) | undefined;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
interface AvatarItem {
|
|
3
|
+
id: string;
|
|
4
|
+
src?: string;
|
|
5
|
+
alt?: string;
|
|
6
|
+
initials?: string;
|
|
7
|
+
}
|
|
8
|
+
interface AvatarListProps {
|
|
9
|
+
items: AvatarItem[];
|
|
10
|
+
maxVisible?: number;
|
|
11
|
+
size?: number | string;
|
|
12
|
+
[key: string]: any;
|
|
13
|
+
}
|
|
14
|
+
export declare const AvatarList: React.FC<AvatarListProps>;
|
|
15
|
+
export default AvatarList;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { EmptyStateConfig } from "../types";
|
|
2
|
+
interface DataTableEmptyProps {
|
|
3
|
+
config: EmptyStateConfig;
|
|
4
|
+
colSpan: number;
|
|
5
|
+
className?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function DataTableEmpty({ config, colSpan, className, }: DataTableEmptyProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Table as TanstackTable } from "@tanstack/react-table";
|
|
2
|
+
import { HeaderAction, SearchConfig } from "../types";
|
|
3
|
+
interface DataTableHeaderProps<TData> {
|
|
4
|
+
title?: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
actions?: HeaderAction<TData>[];
|
|
7
|
+
search?: SearchConfig;
|
|
8
|
+
searchValue?: string;
|
|
9
|
+
onSearchChange?: (value: string) => void;
|
|
10
|
+
table?: TanstackTable<TData>;
|
|
11
|
+
selectedCount?: number;
|
|
12
|
+
enableColumnVisibility?: boolean;
|
|
13
|
+
columnVisibilityLabel?: string;
|
|
14
|
+
className?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function DataTableHeader<TData>({ title, description, actions, search, searchValue, onSearchChange, table, selectedCount, enableColumnVisibility, columnVisibilityLabel, className, }: DataTableHeaderProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Table as TanstackTable } from "@tanstack/react-table";
|
|
2
|
+
import { PaginationConfig } from "../types";
|
|
3
|
+
interface DataTablePaginationProps<TData> {
|
|
4
|
+
table: TanstackTable<TData>;
|
|
5
|
+
config?: PaginationConfig;
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function DataTablePagination<TData>({ table, config, className, }: DataTablePaginationProps<TData>): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const DataTableSchema: () => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ColumnDef } from "@tanstack/react-table";
|
|
2
|
+
import { DataTableConfig } from "../types";
|
|
3
|
+
interface DataTableProps<TData, TValue> {
|
|
4
|
+
columns: ColumnDef<TData, TValue>[];
|
|
5
|
+
data: TData[];
|
|
6
|
+
config?: DataTableConfig<TData>;
|
|
7
|
+
className?: string;
|
|
8
|
+
isLoading?: boolean;
|
|
9
|
+
isError?: boolean;
|
|
10
|
+
onRetry?: () => void;
|
|
11
|
+
}
|
|
12
|
+
export declare function DataTable<TData, TValue>({ columns, data, config, className, isLoading, isError, onRetry, }: DataTableProps<TData, TValue>): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { DataTable } from "./data-table";
|
|
2
|
+
export { DataTableSchema } from "./data-table-schema";
|
|
3
|
+
export { DataTableHeader } from "./data-table-header";
|
|
4
|
+
export { DataTableEmpty } from "./data-table-empty";
|
|
5
|
+
export { DataTablePagination } from "./data-table-pagination";
|
|
6
|
+
export { AvatarList } from "./avatar-list";
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Header Action Configuration
|
|
4
|
+
* Defines actions that can be displayed in the table header
|
|
5
|
+
*/
|
|
6
|
+
export interface HeaderAction<TData = unknown> {
|
|
7
|
+
id?: string;
|
|
8
|
+
label?: string;
|
|
9
|
+
icon?: ReactNode;
|
|
10
|
+
variant?: "default" | "secondary" | "outline" | "ghost" | "destructive";
|
|
11
|
+
size?: "default" | "sm" | "lg" | "icon";
|
|
12
|
+
onClick?: () => void;
|
|
13
|
+
href?: string;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
loading?: boolean;
|
|
16
|
+
bulk?: boolean;
|
|
17
|
+
bulkOnClick?: (selectedRows: TData[]) => void;
|
|
18
|
+
hidden?: boolean;
|
|
19
|
+
render?: () => ReactNode;
|
|
20
|
+
children?: Omit<HeaderAction<TData>, "children" | "bulk">[];
|
|
21
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Empty State Configuration
|
|
4
|
+
* Defines how empty states are displayed in the table
|
|
5
|
+
*/
|
|
6
|
+
export interface EmptyStateConfig {
|
|
7
|
+
icon?: ReactNode;
|
|
8
|
+
imageUrl?: string;
|
|
9
|
+
title: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
action?: {
|
|
12
|
+
label: string;
|
|
13
|
+
onClick?: () => void;
|
|
14
|
+
href?: string;
|
|
15
|
+
icon?: ReactNode;
|
|
16
|
+
};
|
|
17
|
+
variant?: "default" | "search" | "filter" | "error" | "custom";
|
|
18
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filter Configuration
|
|
3
|
+
* Defines filters that can be applied to table data
|
|
4
|
+
*/
|
|
5
|
+
export interface FilterConfig {
|
|
6
|
+
id: string;
|
|
7
|
+
label: string;
|
|
8
|
+
type: "text" | "select" | "multi-select" | "date" | "date-range" | "boolean";
|
|
9
|
+
column: string;
|
|
10
|
+
placeholder?: string;
|
|
11
|
+
options?: Array<{
|
|
12
|
+
label: string;
|
|
13
|
+
value: string;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Search Configuration
|
|
18
|
+
* Defines search functionality for the table
|
|
19
|
+
*/
|
|
20
|
+
export interface SearchConfig {
|
|
21
|
+
enabled: boolean;
|
|
22
|
+
placeholder?: string;
|
|
23
|
+
columns?: string[];
|
|
24
|
+
debounce?: number;
|
|
25
|
+
}
|