@omnitend/dashboard-for-laravel 0.4.7
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/LICENSE +21 -0
- package/README.md +397 -0
- package/dist/components/base/DAccordion.vue.d.ts +12 -0
- package/dist/components/base/DAccordionItem.vue.d.ts +12 -0
- package/dist/components/base/DAlert.vue.d.ts +12 -0
- package/dist/components/base/DAvatar.vue.d.ts +12 -0
- package/dist/components/base/DBadge.vue.d.ts +12 -0
- package/dist/components/base/DBreadcrumb.vue.d.ts +12 -0
- package/dist/components/base/DButton.vue.d.ts +29 -0
- package/dist/components/base/DButtonGroup.vue.d.ts +12 -0
- package/dist/components/base/DButtonToolbar.vue.d.ts +12 -0
- package/dist/components/base/DCard.vue.d.ts +12 -0
- package/dist/components/base/DCarousel.vue.d.ts +12 -0
- package/dist/components/base/DCarouselSlide.vue.d.ts +12 -0
- package/dist/components/base/DCol.vue.d.ts +12 -0
- package/dist/components/base/DCollapse.vue.d.ts +12 -0
- package/dist/components/base/DContainer.vue.d.ts +12 -0
- package/dist/components/base/DDropdown.vue.d.ts +12 -0
- package/dist/components/base/DDropdownDivider.vue.d.ts +2 -0
- package/dist/components/base/DDropdownItem.vue.d.ts +12 -0
- package/dist/components/base/DForm.vue.d.ts +12 -0
- package/dist/components/base/DFormCheckbox.vue.d.ts +12 -0
- package/dist/components/base/DFormGroup.vue.d.ts +12 -0
- package/dist/components/base/DFormInput.vue.d.ts +2 -0
- package/dist/components/base/DFormInvalidFeedback.vue.d.ts +12 -0
- package/dist/components/base/DFormRadio.vue.d.ts +12 -0
- package/dist/components/base/DFormSelect.vue.d.ts +12 -0
- package/dist/components/base/DFormSpinbutton.vue.d.ts +12 -0
- package/dist/components/base/DFormTags.vue.d.ts +12 -0
- package/dist/components/base/DFormText.vue.d.ts +12 -0
- package/dist/components/base/DFormTextarea.vue.d.ts +2 -0
- package/dist/components/base/DImage.vue.d.ts +12 -0
- package/dist/components/base/DInputGroup.vue.d.ts +12 -0
- package/dist/components/base/DLink.vue.d.ts +12 -0
- package/dist/components/base/DListGroup.vue.d.ts +12 -0
- package/dist/components/base/DListGroupItem.vue.d.ts +12 -0
- package/dist/components/base/DModal.vue.d.ts +12 -0
- package/dist/components/base/DNav.vue.d.ts +12 -0
- package/dist/components/base/DNavItem.vue.d.ts +12 -0
- package/dist/components/base/DNavbar.vue.d.ts +12 -0
- package/dist/components/base/DNavbarBrand.vue.d.ts +12 -0
- package/dist/components/base/DNavbarNav.vue.d.ts +12 -0
- package/dist/components/base/DNavbarToggle.vue.d.ts +12 -0
- package/dist/components/base/DOffcanvas.vue.d.ts +12 -0
- package/dist/components/base/DOverlay.vue.d.ts +12 -0
- package/dist/components/base/DPagination.vue.d.ts +2 -0
- package/dist/components/base/DPlaceholder.vue.d.ts +12 -0
- package/dist/components/base/DPopover.vue.d.ts +12 -0
- package/dist/components/base/DProgress.vue.d.ts +12 -0
- package/dist/components/base/DRow.vue.d.ts +12 -0
- package/dist/components/base/DSpinner.vue.d.ts +2 -0
- package/dist/components/base/DTab.vue.d.ts +12 -0
- package/dist/components/base/DTable.vue.d.ts +26 -0
- package/dist/components/base/DTabs.vue.d.ts +12 -0
- package/dist/components/base/DToast.vue.d.ts +12 -0
- package/dist/components/base/DToaster.vue.d.ts +12 -0
- package/dist/components/base/DTooltip.vue.d.ts +12 -0
- package/dist/components/extended/DXBasicForm.vue.d.ts +39 -0
- package/dist/components/extended/DXDashboard.vue.d.ts +52 -0
- package/dist/components/extended/DXDashboardNavbar.vue.d.ts +53 -0
- package/dist/components/extended/DXDashboardSidebar.vue.d.ts +37 -0
- package/dist/components/extended/DXForm.vue.d.ts +31 -0
- package/dist/components/extended/DXTable.vue.d.ts +190 -0
- package/dist/composables/defineForm.d.ts +35 -0
- package/dist/composables/useForm.d.ts +46 -0
- package/dist/composables/useToast.d.ts +1 -0
- package/dist/dashboard-for-laravel.js +17748 -0
- package/dist/dashboard-for-laravel.js.map +1 -0
- package/dist/dashboard-for-laravel.umd.cjs +11 -0
- package/dist/dashboard-for-laravel.umd.cjs.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/style.css +5 -0
- package/dist/types/index.d.ts +37 -0
- package/dist/types/navigation.d.ts +17 -0
- package/dist/utils/api.d.ts +30 -0
- package/docs/public/api-reference.json +1932 -0
- package/docs/public/docs-map.md +85 -0
- package/docs/public/llms.txt +110 -0
- package/package.json +116 -0
- package/resources/css/theme.scss +219 -0
- package/resources/js/components/base/DAccordion.vue +21 -0
- package/resources/js/components/base/DAccordionItem.vue +14 -0
- package/resources/js/components/base/DAlert.vue +14 -0
- package/resources/js/components/base/DAvatar.vue +21 -0
- package/resources/js/components/base/DBadge.vue +14 -0
- package/resources/js/components/base/DBreadcrumb.vue +21 -0
- package/resources/js/components/base/DButton.vue +58 -0
- package/resources/js/components/base/DButtonGroup.vue +21 -0
- package/resources/js/components/base/DButtonToolbar.vue +21 -0
- package/resources/js/components/base/DCard.vue +35 -0
- package/resources/js/components/base/DCarousel.vue +21 -0
- package/resources/js/components/base/DCarouselSlide.vue +14 -0
- package/resources/js/components/base/DCol.vue +14 -0
- package/resources/js/components/base/DCollapse.vue +34 -0
- package/resources/js/components/base/DContainer.vue +14 -0
- package/resources/js/components/base/DDropdown.vue +16 -0
- package/resources/js/components/base/DDropdownDivider.vue +7 -0
- package/resources/js/components/base/DDropdownItem.vue +14 -0
- package/resources/js/components/base/DForm.vue +21 -0
- package/resources/js/components/base/DFormCheckbox.vue +14 -0
- package/resources/js/components/base/DFormGroup.vue +11 -0
- package/resources/js/components/base/DFormInput.vue +7 -0
- package/resources/js/components/base/DFormInvalidFeedback.vue +16 -0
- package/resources/js/components/base/DFormRadio.vue +21 -0
- package/resources/js/components/base/DFormSelect.vue +14 -0
- package/resources/js/components/base/DFormSpinbutton.vue +21 -0
- package/resources/js/components/base/DFormTags.vue +21 -0
- package/resources/js/components/base/DFormText.vue +16 -0
- package/resources/js/components/base/DFormTextarea.vue +7 -0
- package/resources/js/components/base/DImage.vue +21 -0
- package/resources/js/components/base/DInputGroup.vue +21 -0
- package/resources/js/components/base/DLink.vue +21 -0
- package/resources/js/components/base/DListGroup.vue +21 -0
- package/resources/js/components/base/DListGroupItem.vue +14 -0
- package/resources/js/components/base/DModal.vue +11 -0
- package/resources/js/components/base/DNav.vue +14 -0
- package/resources/js/components/base/DNavItem.vue +14 -0
- package/resources/js/components/base/DNavbar.vue +21 -0
- package/resources/js/components/base/DNavbarBrand.vue +14 -0
- package/resources/js/components/base/DNavbarNav.vue +14 -0
- package/resources/js/components/base/DNavbarToggle.vue +14 -0
- package/resources/js/components/base/DOffcanvas.vue +11 -0
- package/resources/js/components/base/DOverlay.vue +21 -0
- package/resources/js/components/base/DPagination.vue +7 -0
- package/resources/js/components/base/DPlaceholder.vue +21 -0
- package/resources/js/components/base/DPopover.vue +21 -0
- package/resources/js/components/base/DProgress.vue +21 -0
- package/resources/js/components/base/DRow.vue +14 -0
- package/resources/js/components/base/DSpinner.vue +7 -0
- package/resources/js/components/base/DTab.vue +14 -0
- package/resources/js/components/base/DTable.vue +62 -0
- package/resources/js/components/base/DTabs.vue +21 -0
- package/resources/js/components/base/DToast.vue +16 -0
- package/resources/js/components/base/DToaster.vue +16 -0
- package/resources/js/components/base/DTooltip.vue +21 -0
- package/resources/js/components/extended/DXBasicForm.vue +177 -0
- package/resources/js/components/extended/DXDashboard.vue +208 -0
- package/resources/js/components/extended/DXDashboardNavbar.vue +112 -0
- package/resources/js/components/extended/DXDashboardSidebar.vue +233 -0
- package/resources/js/components/extended/DXForm.vue +44 -0
- package/resources/js/components/extended/DXTable.vue +1345 -0
- package/resources/js/composables/defineForm.ts +78 -0
- package/resources/js/composables/useForm.ts +272 -0
- package/resources/js/composables/useToast.ts +1 -0
- package/resources/js/index.ts +118 -0
- package/resources/js/types/index.ts +61 -0
- package/resources/js/types/navigation.ts +19 -0
- package/resources/js/utils/api.ts +182 -0
- package/scripts/mcp-server.mjs +359 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Navigation } from '../../types/navigation';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
navigation: Navigation;
|
|
4
|
+
currentUrl: string;
|
|
5
|
+
collapsed?: boolean;
|
|
6
|
+
hidden?: boolean;
|
|
7
|
+
title?: string;
|
|
8
|
+
};
|
|
9
|
+
declare var __VLS_1: {
|
|
10
|
+
collapsed: boolean;
|
|
11
|
+
title: string;
|
|
12
|
+
}, __VLS_3: {
|
|
13
|
+
item: import("../..").NavigationItem;
|
|
14
|
+
isActive: boolean;
|
|
15
|
+
collapsed: boolean;
|
|
16
|
+
};
|
|
17
|
+
type __VLS_Slots = {} & {
|
|
18
|
+
brand?: (props: typeof __VLS_1) => any;
|
|
19
|
+
} & {
|
|
20
|
+
link?: (props: typeof __VLS_3) => any;
|
|
21
|
+
};
|
|
22
|
+
declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
23
|
+
toggle: () => any;
|
|
24
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
25
|
+
onToggle?: (() => any) | undefined;
|
|
26
|
+
}>, {
|
|
27
|
+
collapsed: boolean;
|
|
28
|
+
hidden: boolean;
|
|
29
|
+
title: string;
|
|
30
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
31
|
+
declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
|
|
32
|
+
export default _default;
|
|
33
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
34
|
+
new (): {
|
|
35
|
+
$slots: S;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { DefineFormReturn } from "../../composables/defineForm";
|
|
2
|
+
interface Props {
|
|
3
|
+
/** Form object from defineForm */
|
|
4
|
+
form: DefineFormReturn<any>;
|
|
5
|
+
/** Submit button text */
|
|
6
|
+
submitText?: string;
|
|
7
|
+
/** Submit button loading text */
|
|
8
|
+
submitLoadingText?: string;
|
|
9
|
+
/** Show submit button */
|
|
10
|
+
showSubmit?: boolean;
|
|
11
|
+
}
|
|
12
|
+
declare var __VLS_10: string | number, __VLS_11: any;
|
|
13
|
+
type __VLS_Slots = {} & {
|
|
14
|
+
[K in NonNullable<typeof __VLS_10>]?: (props: typeof __VLS_11) => any;
|
|
15
|
+
};
|
|
16
|
+
declare const __VLS_component: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
17
|
+
submit: () => any;
|
|
18
|
+
}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{
|
|
19
|
+
onSubmit?: (() => any) | undefined;
|
|
20
|
+
}>, {
|
|
21
|
+
submitText: string;
|
|
22
|
+
submitLoadingText: string;
|
|
23
|
+
showSubmit: boolean;
|
|
24
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
25
|
+
declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
|
|
26
|
+
export default _default;
|
|
27
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
28
|
+
new (): {
|
|
29
|
+
$slots: S;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
export type FilterType = 'text' | 'select' | 'number' | 'date' | false;
|
|
2
|
+
export interface FilterOption {
|
|
3
|
+
value: string;
|
|
4
|
+
text: string;
|
|
5
|
+
}
|
|
6
|
+
export interface TableField {
|
|
7
|
+
key: string;
|
|
8
|
+
label?: string;
|
|
9
|
+
sortable?: boolean;
|
|
10
|
+
hint?: string;
|
|
11
|
+
filter?: FilterType;
|
|
12
|
+
filterOptions?: FilterOption[];
|
|
13
|
+
filterPlaceholder?: string;
|
|
14
|
+
[key: string]: any;
|
|
15
|
+
}
|
|
16
|
+
export interface PaginationData {
|
|
17
|
+
current_page: number;
|
|
18
|
+
per_page: number;
|
|
19
|
+
total: number;
|
|
20
|
+
from: number;
|
|
21
|
+
to: number;
|
|
22
|
+
last_page?: number;
|
|
23
|
+
total_unfiltered?: number;
|
|
24
|
+
}
|
|
25
|
+
export interface BTableSortBy {
|
|
26
|
+
key: string;
|
|
27
|
+
order?: 'asc' | 'desc';
|
|
28
|
+
}
|
|
29
|
+
export interface BTableProviderContext {
|
|
30
|
+
sortBy?: BTableSortBy[];
|
|
31
|
+
filter?: string;
|
|
32
|
+
currentPage: number;
|
|
33
|
+
perPage: number;
|
|
34
|
+
}
|
|
35
|
+
export type BTableProvider<T = any> = (context: Readonly<BTableProviderContext>) => Promise<T[] | undefined> | T[] | undefined;
|
|
36
|
+
export interface EditTab {
|
|
37
|
+
/** Unique key for this tab */
|
|
38
|
+
key: string;
|
|
39
|
+
/** Display label (optional, auto-derived from key if omitted) */
|
|
40
|
+
label?: string;
|
|
41
|
+
/** Field keys to display in this tab (from editFields) */
|
|
42
|
+
fieldKeys: string[];
|
|
43
|
+
/** Conditional display (optional) */
|
|
44
|
+
when?: boolean | ((item: any) => boolean);
|
|
45
|
+
/** Lazy load tab content (optional, default false) */
|
|
46
|
+
lazy?: boolean;
|
|
47
|
+
}
|
|
48
|
+
export interface Props<TItem = any> {
|
|
49
|
+
/** Table title */
|
|
50
|
+
title?: string;
|
|
51
|
+
/** Name for item (singular) - automatically pluralized (e.g., "product" → "products") */
|
|
52
|
+
itemName?: string;
|
|
53
|
+
/** Table data items (Inertia mode) */
|
|
54
|
+
items?: TItem[];
|
|
55
|
+
/** Provider function for API mode (alternative to items/apiUrl) */
|
|
56
|
+
provider?: BTableProvider<TItem>;
|
|
57
|
+
/** API endpoint URL for auto-provider mode (alternative to provider function) */
|
|
58
|
+
apiUrl?: string;
|
|
59
|
+
/** Table field definitions */
|
|
60
|
+
fields: TableField[];
|
|
61
|
+
/** Sort configuration (v-model support) */
|
|
62
|
+
sortBy?: BTableSortBy[];
|
|
63
|
+
/** Filter values (v-model support) - key is field key, value is filter string */
|
|
64
|
+
filters?: Record<string, string>;
|
|
65
|
+
/** Dynamic filter options from server - key is field key, value is array of values */
|
|
66
|
+
filterValues?: Record<string, string[]>;
|
|
67
|
+
/** Inertia route URL (if provided, handles navigation automatically) */
|
|
68
|
+
inertiaUrl?: string;
|
|
69
|
+
/** Loading/busy state (v-model support) */
|
|
70
|
+
busy?: boolean;
|
|
71
|
+
/** Loading state (deprecated, use busy instead) */
|
|
72
|
+
loading?: boolean;
|
|
73
|
+
/** Loading text */
|
|
74
|
+
loadingText?: string;
|
|
75
|
+
/** Error message */
|
|
76
|
+
error?: string | null;
|
|
77
|
+
/** Pagination data (Inertia mode) */
|
|
78
|
+
pagination?: PaginationData;
|
|
79
|
+
/** Show pagination controls */
|
|
80
|
+
showPagination?: boolean;
|
|
81
|
+
/** Show per-page selector */
|
|
82
|
+
showPerPageSelector?: boolean;
|
|
83
|
+
/** Per-page options for selector */
|
|
84
|
+
perPageOptions?: number[];
|
|
85
|
+
/** Current page (for provider mode) */
|
|
86
|
+
currentPage?: number;
|
|
87
|
+
/** Items per page (for provider mode, v-model support) */
|
|
88
|
+
perPage?: number;
|
|
89
|
+
/** Striped rows */
|
|
90
|
+
striped?: boolean;
|
|
91
|
+
/** Hover effect on rows */
|
|
92
|
+
hover?: boolean;
|
|
93
|
+
/** Responsive table */
|
|
94
|
+
responsive?: boolean;
|
|
95
|
+
/** Fluid container */
|
|
96
|
+
fluid?: boolean;
|
|
97
|
+
/** Container CSS class */
|
|
98
|
+
containerClass?: string;
|
|
99
|
+
/** Column size (Bootstrap grid) */
|
|
100
|
+
columnSize?: string | number;
|
|
101
|
+
/** Form field definitions for edit modal (if provided, enables edit on row click) */
|
|
102
|
+
editFields?: any[];
|
|
103
|
+
/** Tab definitions for organizing edit modal content */
|
|
104
|
+
editTabs?: EditTab[];
|
|
105
|
+
/** Edit modal title (can be function for dynamic titles) */
|
|
106
|
+
editModalTitle?: string | ((item: any) => string);
|
|
107
|
+
/** Edit modal size */
|
|
108
|
+
editModalSize?: 'sm' | 'md' | 'lg' | 'xl';
|
|
109
|
+
/** API endpoint pattern for updates (e.g., "/api/products/:id") */
|
|
110
|
+
editUrl?: string;
|
|
111
|
+
/** API endpoint pattern for deletions (e.g., "/api/products/:id") */
|
|
112
|
+
deleteUrl?: string;
|
|
113
|
+
}
|
|
114
|
+
declare const _default: <T = any>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
|
|
115
|
+
props: __VLS_PrettifyLocal<Pick<Partial<{}> & Omit<{
|
|
116
|
+
readonly "onUpdate:sortBy"?: ((sortBy: BTableSortBy[]) => any) | undefined;
|
|
117
|
+
readonly "onUpdate:busy"?: ((busy: boolean) => any) | undefined;
|
|
118
|
+
readonly onRowClicked?: ((item: T, index: number, event: MouseEvent) => any) | undefined;
|
|
119
|
+
readonly onPageChange?: ((page: number) => any) | undefined;
|
|
120
|
+
readonly onSortChange?: ((sort: {
|
|
121
|
+
key: string;
|
|
122
|
+
order: "asc" | "desc";
|
|
123
|
+
}) => any) | undefined;
|
|
124
|
+
readonly onFilterChange?: ((filters: Record<string, string>) => any) | undefined;
|
|
125
|
+
readonly onPerPageChange?: ((perPage: number) => any) | undefined;
|
|
126
|
+
readonly onRowUpdated?: ((item: T, response: any) => any) | undefined;
|
|
127
|
+
readonly onEditError?: ((item: T, error: any) => any) | undefined;
|
|
128
|
+
readonly onRowDeleted?: ((item: T, response: any) => any) | undefined;
|
|
129
|
+
readonly onDeleteError?: ((item: T, error: any) => any) | undefined;
|
|
130
|
+
readonly "onUpdate:filters"?: ((filters: Record<string, string>) => any) | undefined;
|
|
131
|
+
readonly "onUpdate:perPage"?: ((perPage: number) => any) | undefined;
|
|
132
|
+
} & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, never>, "onUpdate:sortBy" | "onUpdate:busy" | "onRowClicked" | "onPageChange" | "onSortChange" | "onFilterChange" | "onPerPageChange" | "onRowUpdated" | "onEditError" | "onRowDeleted" | "onDeleteError" | "onUpdate:filters" | "onUpdate:perPage"> & Props<T> & Partial<{}>> & import("vue").PublicProps;
|
|
133
|
+
expose(exposed: import("vue").ShallowUnwrapRef<{
|
|
134
|
+
refresh: () => void;
|
|
135
|
+
}>): void;
|
|
136
|
+
attrs: any;
|
|
137
|
+
slots: {
|
|
138
|
+
[x: string]: ((props: any) => any) | undefined;
|
|
139
|
+
} & {
|
|
140
|
+
[x: string]: ((props: any) => any) | undefined;
|
|
141
|
+
} & {
|
|
142
|
+
[x: `tab-content(${string})`]: ((props: {
|
|
143
|
+
item: import("@vue/reactivity").DistributeRef<[T | null] extends [import("vue").Ref<any, any>] ? import("@vue/shared").IfAny<import("vue").Ref<any, any> & T, import("vue").Ref<import("vue").Ref<any, any> & T, import("vue").Ref<any, any> & T>, import("vue").Ref<any, any> & T> : import("vue").Ref<import("vue").UnwrapRef<T> | null, T | import("vue").UnwrapRef<T> | null>>;
|
|
144
|
+
tab: EditTab;
|
|
145
|
+
}) => any) | undefined;
|
|
146
|
+
} & {
|
|
147
|
+
[x: `tab-before(${string})`]: ((props: {
|
|
148
|
+
item: import("@vue/reactivity").DistributeRef<[T | null] extends [import("vue").Ref<any, any>] ? import("@vue/shared").IfAny<import("vue").Ref<any, any> & T, import("vue").Ref<import("vue").Ref<any, any> & T, import("vue").Ref<any, any> & T>, import("vue").Ref<any, any> & T> : import("vue").Ref<import("vue").UnwrapRef<T> | null, T | import("vue").UnwrapRef<T> | null>>;
|
|
149
|
+
tab: EditTab;
|
|
150
|
+
}) => any) | undefined;
|
|
151
|
+
} & {
|
|
152
|
+
[x: `edit-span(${string})`]: ((props: {
|
|
153
|
+
item: import("@vue/reactivity").DistributeRef<[T | null] extends [import("vue").Ref<any, any>] ? import("@vue/shared").IfAny<import("vue").Ref<any, any> & T, import("vue").Ref<import("vue").Ref<any, any> & T, import("vue").Ref<any, any> & T>, import("vue").Ref<any, any> & T> : import("vue").Ref<import("vue").UnwrapRef<T> | null, T | import("vue").UnwrapRef<T> | null>>;
|
|
154
|
+
value: any;
|
|
155
|
+
update: (v: any) => any;
|
|
156
|
+
close: () => void;
|
|
157
|
+
}) => any) | undefined;
|
|
158
|
+
} & {
|
|
159
|
+
[x: `edit-value(${string})`]: ((props: {
|
|
160
|
+
item: import("@vue/reactivity").DistributeRef<[T | null] extends [import("vue").Ref<any, any>] ? import("@vue/shared").IfAny<import("vue").Ref<any, any> & T, import("vue").Ref<import("vue").Ref<any, any> & T, import("vue").Ref<any, any> & T>, import("vue").Ref<any, any> & T> : import("vue").Ref<import("vue").UnwrapRef<T> | null, T | import("vue").UnwrapRef<T> | null>>;
|
|
161
|
+
value: any;
|
|
162
|
+
update: (v: any) => any;
|
|
163
|
+
field: any;
|
|
164
|
+
}) => any) | undefined;
|
|
165
|
+
} & {
|
|
166
|
+
[x: `edit-value(${string})`]: ((props: {
|
|
167
|
+
item: import("@vue/reactivity").DistributeRef<[T | null] extends [import("vue").Ref<any, any>] ? import("@vue/shared").IfAny<import("vue").Ref<any, any> & T, import("vue").Ref<import("vue").Ref<any, any> & T, import("vue").Ref<any, any> & T>, import("vue").Ref<any, any> & T> : import("vue").Ref<import("vue").UnwrapRef<T> | null, T | import("vue").UnwrapRef<T> | null>>;
|
|
168
|
+
value: any;
|
|
169
|
+
update: (v: any) => any;
|
|
170
|
+
field: any;
|
|
171
|
+
}) => any) | undefined;
|
|
172
|
+
} & {
|
|
173
|
+
[x: `tab-after(${string})`]: ((props: {
|
|
174
|
+
item: import("@vue/reactivity").DistributeRef<[T | null] extends [import("vue").Ref<any, any>] ? import("@vue/shared").IfAny<import("vue").Ref<any, any> & T, import("vue").Ref<import("vue").Ref<any, any> & T, import("vue").Ref<any, any> & T>, import("vue").Ref<any, any> & T> : import("vue").Ref<import("vue").UnwrapRef<T> | null, T | import("vue").UnwrapRef<T> | null>>;
|
|
175
|
+
tab: EditTab;
|
|
176
|
+
}) => any) | undefined;
|
|
177
|
+
} & {
|
|
178
|
+
header?: (props: {}) => any;
|
|
179
|
+
};
|
|
180
|
+
emit: ((evt: "update:sortBy", sortBy: BTableSortBy[]) => void) & ((evt: "update:busy", busy: boolean) => void) & ((evt: "rowClicked", item: T, index: number, event: MouseEvent) => void) & ((evt: "pageChange", page: number) => void) & ((evt: "sortChange", sort: {
|
|
181
|
+
key: string;
|
|
182
|
+
order: "asc" | "desc";
|
|
183
|
+
}) => void) & ((evt: "filterChange", filters: Record<string, string>) => void) & ((evt: "perPageChange", perPage: number) => void) & ((evt: "rowUpdated", item: T, response: any) => void) & ((evt: "editError", item: T, error: any) => void) & ((evt: "rowDeleted", item: T, response: any) => void) & ((evt: "deleteError", item: T, error: any) => void) & ((evt: "update:filters", filters: Record<string, string>) => void) & ((evt: "update:perPage", perPage: number) => void);
|
|
184
|
+
}>) => import("vue").VNode & {
|
|
185
|
+
__ctx?: Awaited<typeof __VLS_setup>;
|
|
186
|
+
};
|
|
187
|
+
export default _default;
|
|
188
|
+
type __VLS_PrettifyLocal<T> = {
|
|
189
|
+
[K in keyof T]: T[K];
|
|
190
|
+
} & {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type UseFormReturn } from "./useForm";
|
|
2
|
+
import type { FieldDefinition } from "../types";
|
|
3
|
+
/**
|
|
4
|
+
* Extended field definition that includes default value
|
|
5
|
+
*/
|
|
6
|
+
export interface FormFieldDefinition<TValue = any> extends FieldDefinition {
|
|
7
|
+
/** Default/initial value for the field */
|
|
8
|
+
default: TValue;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Infer data type from field definitions
|
|
12
|
+
*/
|
|
13
|
+
type InferFormData<TFields extends readonly FormFieldDefinition[]> = {
|
|
14
|
+
[K in TFields[number] as K["key"]]: K["default"];
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Return type for defineForm
|
|
18
|
+
*/
|
|
19
|
+
export interface DefineFormReturn<TData extends Record<string, any>> {
|
|
20
|
+
form: UseFormReturn<TData>;
|
|
21
|
+
fields: FieldDefinition[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Define a form with type-safe field definitions.
|
|
25
|
+
* Reduces duplication by inferring initial values from field definitions.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* const { form, fields } = defineForm([
|
|
29
|
+
* { key: "email", type: "email", label: "Email", default: "", required: true },
|
|
30
|
+
* { key: "password", type: "password", label: "Password", default: "", required: true },
|
|
31
|
+
* { key: "remember", type: "checkbox", label: "Remember me", default: false },
|
|
32
|
+
* ] as const);
|
|
33
|
+
*/
|
|
34
|
+
export declare function defineForm<const TFields extends readonly FormFieldDefinition[]>(fieldDefinitions: TFields): DefineFormReturn<InferFormData<TFields>>;
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type ComputedRef, type WritableComputedRef } from "vue";
|
|
2
|
+
import { type ApiError } from "../utils/api";
|
|
3
|
+
export interface ValidationErrors {
|
|
4
|
+
[key: string]: string[];
|
|
5
|
+
}
|
|
6
|
+
export type FormError = ApiError;
|
|
7
|
+
export interface FormSubmitOptions<TPayload = unknown, TResponse = unknown> {
|
|
8
|
+
onSuccess?: (data: TResponse) => void;
|
|
9
|
+
onError?: (error: FormError) => void;
|
|
10
|
+
onBefore?: (payload: TPayload) => void;
|
|
11
|
+
onFinish?: () => void;
|
|
12
|
+
transform?: (payload: TPayload) => unknown;
|
|
13
|
+
preserveErrors?: boolean;
|
|
14
|
+
resetOnSuccess?: boolean;
|
|
15
|
+
signal?: AbortSignal;
|
|
16
|
+
}
|
|
17
|
+
export interface FormState<TData extends Record<string, any>> {
|
|
18
|
+
data: TData;
|
|
19
|
+
errors: ValidationErrors;
|
|
20
|
+
processing: boolean;
|
|
21
|
+
message: string;
|
|
22
|
+
touched: Record<string, boolean>;
|
|
23
|
+
recentlySuccessful: boolean;
|
|
24
|
+
shouldShowMessage: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface UseFormReturn<TData extends Record<string, any>> extends FormState<TData> {
|
|
27
|
+
hasErrors: ComputedRef<boolean>;
|
|
28
|
+
hasError: (field: keyof TData | string) => boolean;
|
|
29
|
+
getError: (field: keyof TData | string) => string;
|
|
30
|
+
getState: (field: keyof TData | string) => true | false | null;
|
|
31
|
+
setErrors: (errors?: ValidationErrors) => void;
|
|
32
|
+
setMessage: (message: string) => void;
|
|
33
|
+
clearErrors: () => void;
|
|
34
|
+
clearError: (field: keyof TData | string) => void;
|
|
35
|
+
reset: (only?: Array<keyof TData>) => void;
|
|
36
|
+
field: <K extends keyof TData>(key: K) => WritableComputedRef<TData[K]>;
|
|
37
|
+
fields: {
|
|
38
|
+
[K in keyof TData]: WritableComputedRef<TData[K]>;
|
|
39
|
+
};
|
|
40
|
+
submit: <TResponse = unknown>(method: "get" | "post" | "put" | "patch" | "delete", url: string, options?: FormSubmitOptions<TData, TResponse>) => Promise<TResponse>;
|
|
41
|
+
post: <TResponse = unknown>(url: string, options?: FormSubmitOptions<TData, TResponse>) => Promise<TResponse>;
|
|
42
|
+
put: <TResponse = unknown>(url: string, options?: FormSubmitOptions<TData, TResponse>) => Promise<TResponse>;
|
|
43
|
+
patch: <TResponse = unknown>(url: string, options?: FormSubmitOptions<TData, TResponse>) => Promise<TResponse>;
|
|
44
|
+
delete: <TResponse = unknown>(url: string, options?: FormSubmitOptions<TData, TResponse>) => Promise<TResponse>;
|
|
45
|
+
}
|
|
46
|
+
export declare function useForm<TData extends Record<string, any>>(initialData?: TData): UseFormReturn<TData>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useToast } from 'bootstrap-vue-next';
|