@dskripchenko/laravel-admin 1.1.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/LICENSE +21 -0
- package/README.md +226 -0
- package/dist/.gitkeep +0 -0
- package/dist/api/bootstrap.d.ts +38 -0
- package/dist/api/bootstrap.test.d.ts +1 -0
- package/dist/api/client.d.ts +30 -0
- package/dist/api/client.test.d.ts +1 -0
- package/dist/api/envelope.d.ts +24 -0
- package/dist/api/envelope.test.d.ts +1 -0
- package/dist/api/errors.d.ts +40 -0
- package/dist/api/errors.test.d.ts +1 -0
- package/dist/components/AdminApp.vue.d.ts +2 -0
- package/dist/components/ForbiddenPage.vue.d.ts +2 -0
- package/dist/components/HomePage.vue.d.ts +2 -0
- package/dist/components/NotFoundPage.vue.d.ts +2 -0
- package/dist/components/SettingsPage.vue.d.ts +2 -0
- package/dist/components/UnknownScreenPage.vue.d.ts +2 -0
- package/dist/components/auth/LoginForm.test.d.ts +1 -0
- package/dist/components/auth/LoginForm.vue.d.ts +17 -0
- package/dist/components/auth/LoginPage.test.d.ts +1 -0
- package/dist/components/auth/LoginPage.vue.d.ts +26 -0
- package/dist/components/auth/TwoFactorForm.test.d.ts +1 -0
- package/dist/components/auth/TwoFactorForm.vue.d.ts +8 -0
- package/dist/components/auth/index.d.ts +6 -0
- package/dist/components/createComponentRegistry.d.ts +22 -0
- package/dist/components/dashboard/BarChartWidget.vue.d.ts +18 -0
- package/dist/components/dashboard/DashboardPage.test.d.ts +1 -0
- package/dist/components/dashboard/DashboardPage.vue.d.ts +28 -0
- package/dist/components/dashboard/DonutChartWidget.vue.d.ts +13 -0
- package/dist/components/dashboard/GaugeWidget.vue.d.ts +29 -0
- package/dist/components/dashboard/HeatmapWidget.vue.d.ts +18 -0
- package/dist/components/dashboard/MarkdownWidget.vue.d.ts +8 -0
- package/dist/components/dashboard/RecentTableWidget.vue.d.ts +12 -0
- package/dist/components/dashboard/StatWidget.vue.d.ts +22 -0
- package/dist/components/dashboard/UnknownWidget.vue.d.ts +5 -0
- package/dist/components/dashboard/WidgetRenderer.vue.d.ts +10 -0
- package/dist/components/dashboard/builtin.d.ts +4 -0
- package/dist/components/dashboard/index.d.ts +16 -0
- package/dist/components/dashboard/registry.d.ts +25 -0
- package/dist/components/dashboard/registry.test.d.ts +1 -0
- package/dist/components/fields/CheckboxField.vue.d.ts +16 -0
- package/dist/components/fields/DateField.vue.d.ts +25 -0
- package/dist/components/fields/NumberField.vue.d.ts +24 -0
- package/dist/components/fields/SelectField.vue.d.ts +28 -0
- package/dist/components/fields/TextAreaField.vue.d.ts +20 -0
- package/dist/components/fields/TextField.vue.d.ts +22 -0
- package/dist/components/fields/UnknownField.vue.d.ts +6 -0
- package/dist/components/fields/fields.test.d.ts +1 -0
- package/dist/components/fields/wysiwyg/quill/QuillField.vue.d.ts +26 -0
- package/dist/components/fields/wysiwyg/quill/index.d.ts +12 -0
- package/dist/components/fields/wysiwyg/tinymce/TinymceField.vue.d.ts +31 -0
- package/dist/components/fields/wysiwyg/tinymce/index.d.ts +12 -0
- package/dist/components/gallery/FieldGalleryPage.test.d.ts +1 -0
- package/dist/components/gallery/FieldGalleryPage.vue.d.ts +2 -0
- package/dist/components/gallery/index.d.ts +1 -0
- package/dist/components/import/ImportWizardPage.test.d.ts +1 -0
- package/dist/components/import/ImportWizardPage.vue.d.ts +59 -0
- package/dist/components/import/index.d.ts +1 -0
- package/dist/components/infolist/BadgeEntry.vue.d.ts +18 -0
- package/dist/components/infolist/IconEntry.vue.d.ts +22 -0
- package/dist/components/infolist/InfolistRenderer.test.d.ts +1 -0
- package/dist/components/infolist/InfolistRenderer.vue.d.ts +11 -0
- package/dist/components/infolist/KeyValueEntry.vue.d.ts +11 -0
- package/dist/components/infolist/TextEntry.vue.d.ts +17 -0
- package/dist/components/infolist/UnknownEntry.vue.d.ts +6 -0
- package/dist/components/infolist/builtin.d.ts +4 -0
- package/dist/components/infolist/index.d.ts +13 -0
- package/dist/components/infolist/recordContext.d.ts +9 -0
- package/dist/components/infolist/registry.d.ts +19 -0
- package/dist/components/infolist/registry.test.d.ts +1 -0
- package/dist/components/layouts/ColumnsLayout.vue.d.ts +13 -0
- package/dist/components/layouts/RowsLayout.vue.d.ts +10 -0
- package/dist/components/layouts/SectionLayout.vue.d.ts +11 -0
- package/dist/components/layouts/TabsLayout.vue.d.ts +22 -0
- package/dist/components/notifications/NotificationsDrawer.test.d.ts +1 -0
- package/dist/components/notifications/NotificationsDrawer.vue.d.ts +13 -0
- package/dist/components/notifications/index.d.ts +1 -0
- package/dist/components/profile/ProfilePage.test.d.ts +1 -0
- package/dist/components/profile/ProfilePage.vue.d.ts +50 -0
- package/dist/components/profile/index.d.ts +1 -0
- package/dist/components/render/FieldRenderer.test.d.ts +1 -0
- package/dist/components/render/FieldRenderer.vue.d.ts +9 -0
- package/dist/components/render/LayoutRenderer.test.d.ts +1 -0
- package/dist/components/render/LayoutRenderer.vue.d.ts +10 -0
- package/dist/components/render/builtin.d.ts +9 -0
- package/dist/components/render/formState.d.ts +36 -0
- package/dist/components/render/formState.test.d.ts +1 -0
- package/dist/components/render/index.d.ts +23 -0
- package/dist/components/render/registry.d.ts +35 -0
- package/dist/components/render/registry.test.d.ts +1 -0
- package/dist/components/resource/ResourceFormPage.test.d.ts +1 -0
- package/dist/components/resource/ResourceFormPage.vue.d.ts +13 -0
- package/dist/components/resource/ResourceIndexPage.test.d.ts +1 -0
- package/dist/components/resource/ResourceIndexPage.vue.d.ts +44 -0
- package/dist/components/resource/ResourceViewPage.test.d.ts +1 -0
- package/dist/components/resource/ResourceViewPage.vue.d.ts +13 -0
- package/dist/components/resource/index.d.ts +6 -0
- package/dist/components/shell/AdminShell.vue.d.ts +35 -0
- package/dist/components/shell/AdminSidebar.test.d.ts +1 -0
- package/dist/components/shell/AdminSidebar.vue.d.ts +27 -0
- package/dist/components/shell/AdminTopBar.test.d.ts +1 -0
- package/dist/components/shell/AdminTopBar.vue.d.ts +33 -0
- package/dist/components/shell/index.d.ts +18 -0
- package/dist/components/shell/widgets/LocaleSwitcher.test.d.ts +1 -0
- package/dist/components/shell/widgets/LocaleSwitcher.vue.d.ts +2 -0
- package/dist/components/shell/widgets/NotificationBell.vue.d.ts +2 -0
- package/dist/components/shell/widgets/ThemeToggle.test.d.ts +1 -0
- package/dist/components/shell/widgets/ThemeToggle.vue.d.ts +2 -0
- package/dist/components/shell/widgets/UserMenu.test.d.ts +1 -0
- package/dist/components/shell/widgets/UserMenu.vue.d.ts +2 -0
- package/dist/createAdminApp.d.ts +85 -0
- package/dist/createAdminApp.test.d.ts +1 -0
- package/dist/formState-DGNcH1XQ.js +40 -0
- package/dist/formState-DGNcH1XQ.js.map +1 -0
- package/dist/formState-GlJBphEn.cjs +2 -0
- package/dist/formState-GlJBphEn.cjs.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +62 -0
- package/dist/index.mjs +4345 -0
- package/dist/index.mjs.map +1 -0
- package/dist/quill.cjs +2 -0
- package/dist/quill.cjs.map +1 -0
- package/dist/quill.mjs +71 -0
- package/dist/quill.mjs.map +1 -0
- package/dist/router/builder.d.ts +52 -0
- package/dist/router/builder.test.d.ts +1 -0
- package/dist/router/guards.d.ts +56 -0
- package/dist/router/guards.test.d.ts +1 -0
- package/dist/router/index.d.ts +63 -0
- package/dist/router/index.test.d.ts +1 -0
- package/dist/stores/auth.d.ts +142 -0
- package/dist/stores/auth.test.d.ts +1 -0
- package/dist/stores/index.d.ts +21 -0
- package/dist/stores/locale.d.ts +29 -0
- package/dist/stores/locale.test.d.ts +1 -0
- package/dist/stores/manifest.d.ts +515 -0
- package/dist/stores/manifest.test.d.ts +1 -0
- package/dist/stores/menu.d.ts +215 -0
- package/dist/stores/menu.test.d.ts +1 -0
- package/dist/stores/notifications.d.ts +137 -0
- package/dist/stores/notifications.test.d.ts +1 -0
- package/dist/stores/registry.d.ts +16 -0
- package/dist/stores/registry.test.d.ts +1 -0
- package/dist/stores/resourceForm.d.ts +91 -0
- package/dist/stores/resourceForm.test.d.ts +1 -0
- package/dist/stores/resourceIndex.d.ts +149 -0
- package/dist/stores/resourceIndex.test.d.ts +1 -0
- package/dist/stores/theme.d.ts +29 -0
- package/dist/stores/theme.test.d.ts +1 -0
- package/dist/style.css +1 -0
- package/dist/tinymce.cjs +2 -0
- package/dist/tinymce.cjs.map +1 -0
- package/dist/tinymce.mjs +80 -0
- package/dist/tinymce.mjs.map +1 -0
- package/dist/types/bootstrap.d.ts +50 -0
- package/package.json +162 -0
- package/resources/fonts/InterDisplay-Bold.woff2 +0 -0
- package/resources/fonts/InterDisplay-ExtraBold.woff2 +0 -0
- package/resources/fonts/InterDisplay-SemiBold.woff2 +0 -0
- package/resources/fonts/InterVariable-Italic.woff2 +0 -0
- package/resources/fonts/InterVariable.woff2 +0 -0
- package/resources/fonts/fonts.css +69 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Menu store: дерево пунктов сайдбара.
|
|
3
|
+
*
|
|
4
|
+
* Источник — /system/menu (backend строит из ResourceRegistry/ScreenRegistry/
|
|
5
|
+
* Settings + plugin-вкладов). Фронт фильтрует по permission'ам залогиненного
|
|
6
|
+
* пользователя через auth-store.
|
|
7
|
+
*/
|
|
8
|
+
export interface MenuItem {
|
|
9
|
+
/** Уникальный идентификатор. */
|
|
10
|
+
key: string;
|
|
11
|
+
/** Текст пункта. */
|
|
12
|
+
label: string;
|
|
13
|
+
/** Имя icon'а (опционально — host-проект сам резолвит icon-set). */
|
|
14
|
+
icon?: string | null;
|
|
15
|
+
/** URL (внутренний router-target) либо null для группы. */
|
|
16
|
+
url?: string | null;
|
|
17
|
+
/** Имя router-route (если задано — приоритет над url). */
|
|
18
|
+
routeName?: string | null;
|
|
19
|
+
/** Бейдж справа (число unread, ярлык вроде "new"). */
|
|
20
|
+
badge?: string | number | null;
|
|
21
|
+
/** Группа (header в sidebar). */
|
|
22
|
+
group?: string | null;
|
|
23
|
+
/** Сортировочный вес. */
|
|
24
|
+
order?: number;
|
|
25
|
+
/** Permission-keys; если заданы — пункт виден только при hasAnyPermission. */
|
|
26
|
+
permissions?: string[];
|
|
27
|
+
/** Вложенные пункты. */
|
|
28
|
+
children?: MenuItem[];
|
|
29
|
+
}
|
|
30
|
+
export interface MenuGroup {
|
|
31
|
+
/** Заголовок группы (null = пункты без группы). */
|
|
32
|
+
group: string | null;
|
|
33
|
+
items: MenuItem[];
|
|
34
|
+
}
|
|
35
|
+
export declare const useMenuStore: import("pinia").StoreDefinition<"admin-menu", Pick<{
|
|
36
|
+
items: import("vue").Ref<{
|
|
37
|
+
key: string;
|
|
38
|
+
label: string;
|
|
39
|
+
icon?: string | null
|
|
40
|
+
/** URL (внутренний router-target) либо null для группы. */
|
|
41
|
+
| undefined;
|
|
42
|
+
url?: string | null
|
|
43
|
+
/** Имя router-route (если задано — приоритет над url). */
|
|
44
|
+
| undefined;
|
|
45
|
+
routeName?: string | null
|
|
46
|
+
/** Бейдж справа (число unread, ярлык вроде "new"). */
|
|
47
|
+
| undefined;
|
|
48
|
+
badge?: string | number | null
|
|
49
|
+
/** Группа (header в sidebar). */
|
|
50
|
+
| undefined;
|
|
51
|
+
group?: string | null
|
|
52
|
+
/** Сортировочный вес. */
|
|
53
|
+
| undefined;
|
|
54
|
+
order?: number
|
|
55
|
+
/** Permission-keys; если заданы — пункт виден только при hasAnyPermission. */
|
|
56
|
+
| undefined;
|
|
57
|
+
permissions?: string[]
|
|
58
|
+
/** Вложенные пункты. */
|
|
59
|
+
| undefined;
|
|
60
|
+
children?: /*elided*/ any[] | undefined;
|
|
61
|
+
}[], MenuItem[] | {
|
|
62
|
+
key: string;
|
|
63
|
+
label: string;
|
|
64
|
+
icon?: string | null
|
|
65
|
+
/** URL (внутренний router-target) либо null для группы. */
|
|
66
|
+
| undefined;
|
|
67
|
+
url?: string | null
|
|
68
|
+
/** Имя router-route (если задано — приоритет над url). */
|
|
69
|
+
| undefined;
|
|
70
|
+
routeName?: string | null
|
|
71
|
+
/** Бейдж справа (число unread, ярлык вроде "new"). */
|
|
72
|
+
| undefined;
|
|
73
|
+
badge?: string | number | null
|
|
74
|
+
/** Группа (header в sidebar). */
|
|
75
|
+
| undefined;
|
|
76
|
+
group?: string | null
|
|
77
|
+
/** Сортировочный вес. */
|
|
78
|
+
| undefined;
|
|
79
|
+
order?: number
|
|
80
|
+
/** Permission-keys; если заданы — пункт виден только при hasAnyPermission. */
|
|
81
|
+
| undefined;
|
|
82
|
+
permissions?: string[]
|
|
83
|
+
/** Вложенные пункты. */
|
|
84
|
+
| undefined;
|
|
85
|
+
children?: /*elided*/ any[] | undefined;
|
|
86
|
+
}[]>;
|
|
87
|
+
loading: import("vue").Ref<boolean, boolean>;
|
|
88
|
+
error: import("vue").Ref<Error | null, Error | null>;
|
|
89
|
+
isLoaded: import("vue").Ref<boolean, boolean>;
|
|
90
|
+
visibleItems: import("vue").ComputedRef<MenuItem[]>;
|
|
91
|
+
groupedItems: import("vue").ComputedRef<MenuGroup[]>;
|
|
92
|
+
load: (force?: boolean) => Promise<MenuItem[]>;
|
|
93
|
+
setItems: (next: MenuItem[]) => void;
|
|
94
|
+
reset: () => void;
|
|
95
|
+
}, "items" | "loading" | "error" | "isLoaded">, Pick<{
|
|
96
|
+
items: import("vue").Ref<{
|
|
97
|
+
key: string;
|
|
98
|
+
label: string;
|
|
99
|
+
icon?: string | null
|
|
100
|
+
/** URL (внутренний router-target) либо null для группы. */
|
|
101
|
+
| undefined;
|
|
102
|
+
url?: string | null
|
|
103
|
+
/** Имя router-route (если задано — приоритет над url). */
|
|
104
|
+
| undefined;
|
|
105
|
+
routeName?: string | null
|
|
106
|
+
/** Бейдж справа (число unread, ярлык вроде "new"). */
|
|
107
|
+
| undefined;
|
|
108
|
+
badge?: string | number | null
|
|
109
|
+
/** Группа (header в sidebar). */
|
|
110
|
+
| undefined;
|
|
111
|
+
group?: string | null
|
|
112
|
+
/** Сортировочный вес. */
|
|
113
|
+
| undefined;
|
|
114
|
+
order?: number
|
|
115
|
+
/** Permission-keys; если заданы — пункт виден только при hasAnyPermission. */
|
|
116
|
+
| undefined;
|
|
117
|
+
permissions?: string[]
|
|
118
|
+
/** Вложенные пункты. */
|
|
119
|
+
| undefined;
|
|
120
|
+
children?: /*elided*/ any[] | undefined;
|
|
121
|
+
}[], MenuItem[] | {
|
|
122
|
+
key: string;
|
|
123
|
+
label: string;
|
|
124
|
+
icon?: string | null
|
|
125
|
+
/** URL (внутренний router-target) либо null для группы. */
|
|
126
|
+
| undefined;
|
|
127
|
+
url?: string | null
|
|
128
|
+
/** Имя router-route (если задано — приоритет над url). */
|
|
129
|
+
| undefined;
|
|
130
|
+
routeName?: string | null
|
|
131
|
+
/** Бейдж справа (число unread, ярлык вроде "new"). */
|
|
132
|
+
| undefined;
|
|
133
|
+
badge?: string | number | null
|
|
134
|
+
/** Группа (header в sidebar). */
|
|
135
|
+
| undefined;
|
|
136
|
+
group?: string | null
|
|
137
|
+
/** Сортировочный вес. */
|
|
138
|
+
| undefined;
|
|
139
|
+
order?: number
|
|
140
|
+
/** Permission-keys; если заданы — пункт виден только при hasAnyPermission. */
|
|
141
|
+
| undefined;
|
|
142
|
+
permissions?: string[]
|
|
143
|
+
/** Вложенные пункты. */
|
|
144
|
+
| undefined;
|
|
145
|
+
children?: /*elided*/ any[] | undefined;
|
|
146
|
+
}[]>;
|
|
147
|
+
loading: import("vue").Ref<boolean, boolean>;
|
|
148
|
+
error: import("vue").Ref<Error | null, Error | null>;
|
|
149
|
+
isLoaded: import("vue").Ref<boolean, boolean>;
|
|
150
|
+
visibleItems: import("vue").ComputedRef<MenuItem[]>;
|
|
151
|
+
groupedItems: import("vue").ComputedRef<MenuGroup[]>;
|
|
152
|
+
load: (force?: boolean) => Promise<MenuItem[]>;
|
|
153
|
+
setItems: (next: MenuItem[]) => void;
|
|
154
|
+
reset: () => void;
|
|
155
|
+
}, "visibleItems" | "groupedItems">, Pick<{
|
|
156
|
+
items: import("vue").Ref<{
|
|
157
|
+
key: string;
|
|
158
|
+
label: string;
|
|
159
|
+
icon?: string | null
|
|
160
|
+
/** URL (внутренний router-target) либо null для группы. */
|
|
161
|
+
| undefined;
|
|
162
|
+
url?: string | null
|
|
163
|
+
/** Имя router-route (если задано — приоритет над url). */
|
|
164
|
+
| undefined;
|
|
165
|
+
routeName?: string | null
|
|
166
|
+
/** Бейдж справа (число unread, ярлык вроде "new"). */
|
|
167
|
+
| undefined;
|
|
168
|
+
badge?: string | number | null
|
|
169
|
+
/** Группа (header в sidebar). */
|
|
170
|
+
| undefined;
|
|
171
|
+
group?: string | null
|
|
172
|
+
/** Сортировочный вес. */
|
|
173
|
+
| undefined;
|
|
174
|
+
order?: number
|
|
175
|
+
/** Permission-keys; если заданы — пункт виден только при hasAnyPermission. */
|
|
176
|
+
| undefined;
|
|
177
|
+
permissions?: string[]
|
|
178
|
+
/** Вложенные пункты. */
|
|
179
|
+
| undefined;
|
|
180
|
+
children?: /*elided*/ any[] | undefined;
|
|
181
|
+
}[], MenuItem[] | {
|
|
182
|
+
key: string;
|
|
183
|
+
label: string;
|
|
184
|
+
icon?: string | null
|
|
185
|
+
/** URL (внутренний router-target) либо null для группы. */
|
|
186
|
+
| undefined;
|
|
187
|
+
url?: string | null
|
|
188
|
+
/** Имя router-route (если задано — приоритет над url). */
|
|
189
|
+
| undefined;
|
|
190
|
+
routeName?: string | null
|
|
191
|
+
/** Бейдж справа (число unread, ярлык вроде "new"). */
|
|
192
|
+
| undefined;
|
|
193
|
+
badge?: string | number | null
|
|
194
|
+
/** Группа (header в sidebar). */
|
|
195
|
+
| undefined;
|
|
196
|
+
group?: string | null
|
|
197
|
+
/** Сортировочный вес. */
|
|
198
|
+
| undefined;
|
|
199
|
+
order?: number
|
|
200
|
+
/** Permission-keys; если заданы — пункт виден только при hasAnyPermission. */
|
|
201
|
+
| undefined;
|
|
202
|
+
permissions?: string[]
|
|
203
|
+
/** Вложенные пункты. */
|
|
204
|
+
| undefined;
|
|
205
|
+
children?: /*elided*/ any[] | undefined;
|
|
206
|
+
}[]>;
|
|
207
|
+
loading: import("vue").Ref<boolean, boolean>;
|
|
208
|
+
error: import("vue").Ref<Error | null, Error | null>;
|
|
209
|
+
isLoaded: import("vue").Ref<boolean, boolean>;
|
|
210
|
+
visibleItems: import("vue").ComputedRef<MenuItem[]>;
|
|
211
|
+
groupedItems: import("vue").ComputedRef<MenuGroup[]>;
|
|
212
|
+
load: (force?: boolean) => Promise<MenuItem[]>;
|
|
213
|
+
setItems: (next: MenuItem[]) => void;
|
|
214
|
+
reset: () => void;
|
|
215
|
+
}, "reset" | "load" | "setItems">>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notifications store: список + unread count + read/delete actions.
|
|
3
|
+
*
|
|
4
|
+
* Bell-badge polling реализуется на уровне UI через setInterval +
|
|
5
|
+
* вызов loadUnread() — store сам не polling'ит, чтобы не дублировать
|
|
6
|
+
* SetInterval'ы между tab'ами.
|
|
7
|
+
*/
|
|
8
|
+
import type { AdminBootstrap } from '../types/bootstrap';
|
|
9
|
+
export interface NotificationItem {
|
|
10
|
+
id: string;
|
|
11
|
+
type: string;
|
|
12
|
+
data: Record<string, unknown>;
|
|
13
|
+
read_at: string | null;
|
|
14
|
+
created_at: string | null;
|
|
15
|
+
}
|
|
16
|
+
export type NotificationFilter = 'all' | 'unread' | 'read';
|
|
17
|
+
export declare const useNotificationsStore: import("pinia").StoreDefinition<"admin-notifications", Pick<{
|
|
18
|
+
items: import("vue").Ref<{
|
|
19
|
+
id: string;
|
|
20
|
+
type: string;
|
|
21
|
+
data: Record<string, unknown>;
|
|
22
|
+
read_at: string | null;
|
|
23
|
+
created_at: string | null;
|
|
24
|
+
}[], NotificationItem[] | {
|
|
25
|
+
id: string;
|
|
26
|
+
type: string;
|
|
27
|
+
data: Record<string, unknown>;
|
|
28
|
+
read_at: string | null;
|
|
29
|
+
created_at: string | null;
|
|
30
|
+
}[]>;
|
|
31
|
+
unreadCount: import("vue").Ref<number, number>;
|
|
32
|
+
loading: import("vue").Ref<boolean, boolean>;
|
|
33
|
+
meta: import("vue").Ref<{
|
|
34
|
+
page: number;
|
|
35
|
+
per_page: number;
|
|
36
|
+
total: number;
|
|
37
|
+
last_page: number;
|
|
38
|
+
} | null, {
|
|
39
|
+
page: number;
|
|
40
|
+
per_page: number;
|
|
41
|
+
total: number;
|
|
42
|
+
last_page: number;
|
|
43
|
+
} | {
|
|
44
|
+
page: number;
|
|
45
|
+
per_page: number;
|
|
46
|
+
total: number;
|
|
47
|
+
last_page: number;
|
|
48
|
+
} | null>;
|
|
49
|
+
lastFilter: import("vue").Ref<NotificationFilter, NotificationFilter>;
|
|
50
|
+
hasUnread: import("vue").ComputedRef<boolean>;
|
|
51
|
+
hydrate: (bootstrap: AdminBootstrap) => void;
|
|
52
|
+
load: (filter?: NotificationFilter, page?: number) => Promise<void>;
|
|
53
|
+
loadUnread: () => Promise<void>;
|
|
54
|
+
markAsRead: (id: string) => Promise<void>;
|
|
55
|
+
markAllAsRead: () => Promise<void>;
|
|
56
|
+
destroy: (id: string) => Promise<void>;
|
|
57
|
+
}, "meta" | "items" | "unreadCount" | "loading" | "lastFilter">, Pick<{
|
|
58
|
+
items: import("vue").Ref<{
|
|
59
|
+
id: string;
|
|
60
|
+
type: string;
|
|
61
|
+
data: Record<string, unknown>;
|
|
62
|
+
read_at: string | null;
|
|
63
|
+
created_at: string | null;
|
|
64
|
+
}[], NotificationItem[] | {
|
|
65
|
+
id: string;
|
|
66
|
+
type: string;
|
|
67
|
+
data: Record<string, unknown>;
|
|
68
|
+
read_at: string | null;
|
|
69
|
+
created_at: string | null;
|
|
70
|
+
}[]>;
|
|
71
|
+
unreadCount: import("vue").Ref<number, number>;
|
|
72
|
+
loading: import("vue").Ref<boolean, boolean>;
|
|
73
|
+
meta: import("vue").Ref<{
|
|
74
|
+
page: number;
|
|
75
|
+
per_page: number;
|
|
76
|
+
total: number;
|
|
77
|
+
last_page: number;
|
|
78
|
+
} | null, {
|
|
79
|
+
page: number;
|
|
80
|
+
per_page: number;
|
|
81
|
+
total: number;
|
|
82
|
+
last_page: number;
|
|
83
|
+
} | {
|
|
84
|
+
page: number;
|
|
85
|
+
per_page: number;
|
|
86
|
+
total: number;
|
|
87
|
+
last_page: number;
|
|
88
|
+
} | null>;
|
|
89
|
+
lastFilter: import("vue").Ref<NotificationFilter, NotificationFilter>;
|
|
90
|
+
hasUnread: import("vue").ComputedRef<boolean>;
|
|
91
|
+
hydrate: (bootstrap: AdminBootstrap) => void;
|
|
92
|
+
load: (filter?: NotificationFilter, page?: number) => Promise<void>;
|
|
93
|
+
loadUnread: () => Promise<void>;
|
|
94
|
+
markAsRead: (id: string) => Promise<void>;
|
|
95
|
+
markAllAsRead: () => Promise<void>;
|
|
96
|
+
destroy: (id: string) => Promise<void>;
|
|
97
|
+
}, "hasUnread">, Pick<{
|
|
98
|
+
items: import("vue").Ref<{
|
|
99
|
+
id: string;
|
|
100
|
+
type: string;
|
|
101
|
+
data: Record<string, unknown>;
|
|
102
|
+
read_at: string | null;
|
|
103
|
+
created_at: string | null;
|
|
104
|
+
}[], NotificationItem[] | {
|
|
105
|
+
id: string;
|
|
106
|
+
type: string;
|
|
107
|
+
data: Record<string, unknown>;
|
|
108
|
+
read_at: string | null;
|
|
109
|
+
created_at: string | null;
|
|
110
|
+
}[]>;
|
|
111
|
+
unreadCount: import("vue").Ref<number, number>;
|
|
112
|
+
loading: import("vue").Ref<boolean, boolean>;
|
|
113
|
+
meta: import("vue").Ref<{
|
|
114
|
+
page: number;
|
|
115
|
+
per_page: number;
|
|
116
|
+
total: number;
|
|
117
|
+
last_page: number;
|
|
118
|
+
} | null, {
|
|
119
|
+
page: number;
|
|
120
|
+
per_page: number;
|
|
121
|
+
total: number;
|
|
122
|
+
last_page: number;
|
|
123
|
+
} | {
|
|
124
|
+
page: number;
|
|
125
|
+
per_page: number;
|
|
126
|
+
total: number;
|
|
127
|
+
last_page: number;
|
|
128
|
+
} | null>;
|
|
129
|
+
lastFilter: import("vue").Ref<NotificationFilter, NotificationFilter>;
|
|
130
|
+
hasUnread: import("vue").ComputedRef<boolean>;
|
|
131
|
+
hydrate: (bootstrap: AdminBootstrap) => void;
|
|
132
|
+
load: (filter?: NotificationFilter, page?: number) => Promise<void>;
|
|
133
|
+
loadUnread: () => Promise<void>;
|
|
134
|
+
markAsRead: (id: string) => Promise<void>;
|
|
135
|
+
markAllAsRead: () => Promise<void>;
|
|
136
|
+
destroy: (id: string) => Promise<void>;
|
|
137
|
+
}, "hydrate" | "load" | "loadUnread" | "markAsRead" | "markAllAsRead" | "destroy">>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Глобальный registry AdminClient'а для Pinia stores.
|
|
3
|
+
*
|
|
4
|
+
* Stores не получают client через параметры — это сильно усложняет API
|
|
5
|
+
* (`useAuthStore(client)` каждый раз). Вместо этого client регистрируется
|
|
6
|
+
* один раз при bootstrap'е приложения через `setAdminClient()`, и stores
|
|
7
|
+
* читают его через `getAdminClient()`.
|
|
8
|
+
*
|
|
9
|
+
* Это singleton-pattern — допустим в случае admin-SPA, потому что
|
|
10
|
+
* client всегда один на весь жизненный цикл.
|
|
11
|
+
*/
|
|
12
|
+
import type { AdminClient } from '../api/client';
|
|
13
|
+
export declare function setAdminClient(client: AdminClient): void;
|
|
14
|
+
export declare function getAdminClient(): AdminClient;
|
|
15
|
+
export declare function clearAdminClient(): void;
|
|
16
|
+
export declare function hasAdminClient(): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useResourceFormStore — state для Resource Create/Edit/View screens.
|
|
3
|
+
*
|
|
4
|
+
* Управляет:
|
|
5
|
+
* - mode ('create' | 'edit' | 'view')
|
|
6
|
+
* - record (raw из API), state (working copy в form-state, но мы держим
|
|
7
|
+
* reference на initial для unsaved-changes detection)
|
|
8
|
+
* - errors (field-keyed) — устанавливаются при ValidationError
|
|
9
|
+
* - loading/saving/deleting — для disable submit / show spinner
|
|
10
|
+
* - dirty (computed) — есть ли несохранённые изменения
|
|
11
|
+
*
|
|
12
|
+
* Endpoints (laravel-admin contract):
|
|
13
|
+
* GET /resources/{slug}/read — fetch one (id в filter[id])
|
|
14
|
+
* POST /resources/{slug}/create
|
|
15
|
+
* POST /resources/{slug}/update
|
|
16
|
+
* POST /resources/{slug}/destroy
|
|
17
|
+
*/
|
|
18
|
+
export type FormMode = 'create' | 'edit' | 'view';
|
|
19
|
+
export declare const useResourceFormStore: import("pinia").StoreDefinition<"admin-resource-form", Pick<{
|
|
20
|
+
slug: import("vue").Ref<string | null, string | null>;
|
|
21
|
+
mode: import("vue").Ref<FormMode, FormMode>;
|
|
22
|
+
recordId: import("vue").Ref<string | number | null, string | number | null>;
|
|
23
|
+
state: import("vue").Ref<Record<string, unknown>, Record<string, unknown>>;
|
|
24
|
+
initial: import("vue").Ref<Record<string, unknown>, Record<string, unknown>>;
|
|
25
|
+
errors: import("vue").Ref<Record<string, string[]>, Record<string, string[]>>;
|
|
26
|
+
loading: import("vue").Ref<boolean, boolean>;
|
|
27
|
+
saving: import("vue").Ref<boolean, boolean>;
|
|
28
|
+
deleting: import("vue").Ref<boolean, boolean>;
|
|
29
|
+
error: import("vue").Ref<Error | null, Error | null>;
|
|
30
|
+
isCreate: import("vue").ComputedRef<boolean>;
|
|
31
|
+
isEdit: import("vue").ComputedRef<boolean>;
|
|
32
|
+
isView: import("vue").ComputedRef<boolean>;
|
|
33
|
+
isDirty: import("vue").ComputedRef<boolean>;
|
|
34
|
+
hasError: import("vue").ComputedRef<boolean>;
|
|
35
|
+
reset: () => void;
|
|
36
|
+
prepareCreate: (resourceSlug: string, defaults?: Record<string, unknown>) => void;
|
|
37
|
+
load: (resourceSlug: string, id: string | number, targetMode?: "edit" | "view") => Promise<void>;
|
|
38
|
+
setField: (name: string, value: unknown) => void;
|
|
39
|
+
setErrors: (next: Record<string, string[]>) => void;
|
|
40
|
+
clearErrors: () => void;
|
|
41
|
+
save: () => Promise<string | number>;
|
|
42
|
+
destroy: () => Promise<void>;
|
|
43
|
+
}, "state" | "loading" | "mode" | "error" | "slug" | "recordId" | "initial" | "errors" | "saving" | "deleting">, Pick<{
|
|
44
|
+
slug: import("vue").Ref<string | null, string | null>;
|
|
45
|
+
mode: import("vue").Ref<FormMode, FormMode>;
|
|
46
|
+
recordId: import("vue").Ref<string | number | null, string | number | null>;
|
|
47
|
+
state: import("vue").Ref<Record<string, unknown>, Record<string, unknown>>;
|
|
48
|
+
initial: import("vue").Ref<Record<string, unknown>, Record<string, unknown>>;
|
|
49
|
+
errors: import("vue").Ref<Record<string, string[]>, Record<string, string[]>>;
|
|
50
|
+
loading: import("vue").Ref<boolean, boolean>;
|
|
51
|
+
saving: import("vue").Ref<boolean, boolean>;
|
|
52
|
+
deleting: import("vue").Ref<boolean, boolean>;
|
|
53
|
+
error: import("vue").Ref<Error | null, Error | null>;
|
|
54
|
+
isCreate: import("vue").ComputedRef<boolean>;
|
|
55
|
+
isEdit: import("vue").ComputedRef<boolean>;
|
|
56
|
+
isView: import("vue").ComputedRef<boolean>;
|
|
57
|
+
isDirty: import("vue").ComputedRef<boolean>;
|
|
58
|
+
hasError: import("vue").ComputedRef<boolean>;
|
|
59
|
+
reset: () => void;
|
|
60
|
+
prepareCreate: (resourceSlug: string, defaults?: Record<string, unknown>) => void;
|
|
61
|
+
load: (resourceSlug: string, id: string | number, targetMode?: "edit" | "view") => Promise<void>;
|
|
62
|
+
setField: (name: string, value: unknown) => void;
|
|
63
|
+
setErrors: (next: Record<string, string[]>) => void;
|
|
64
|
+
clearErrors: () => void;
|
|
65
|
+
save: () => Promise<string | number>;
|
|
66
|
+
destroy: () => Promise<void>;
|
|
67
|
+
}, "hasError" | "isCreate" | "isEdit" | "isView" | "isDirty">, Pick<{
|
|
68
|
+
slug: import("vue").Ref<string | null, string | null>;
|
|
69
|
+
mode: import("vue").Ref<FormMode, FormMode>;
|
|
70
|
+
recordId: import("vue").Ref<string | number | null, string | number | null>;
|
|
71
|
+
state: import("vue").Ref<Record<string, unknown>, Record<string, unknown>>;
|
|
72
|
+
initial: import("vue").Ref<Record<string, unknown>, Record<string, unknown>>;
|
|
73
|
+
errors: import("vue").Ref<Record<string, string[]>, Record<string, string[]>>;
|
|
74
|
+
loading: import("vue").Ref<boolean, boolean>;
|
|
75
|
+
saving: import("vue").Ref<boolean, boolean>;
|
|
76
|
+
deleting: import("vue").Ref<boolean, boolean>;
|
|
77
|
+
error: import("vue").Ref<Error | null, Error | null>;
|
|
78
|
+
isCreate: import("vue").ComputedRef<boolean>;
|
|
79
|
+
isEdit: import("vue").ComputedRef<boolean>;
|
|
80
|
+
isView: import("vue").ComputedRef<boolean>;
|
|
81
|
+
isDirty: import("vue").ComputedRef<boolean>;
|
|
82
|
+
hasError: import("vue").ComputedRef<boolean>;
|
|
83
|
+
reset: () => void;
|
|
84
|
+
prepareCreate: (resourceSlug: string, defaults?: Record<string, unknown>) => void;
|
|
85
|
+
load: (resourceSlug: string, id: string | number, targetMode?: "edit" | "view") => Promise<void>;
|
|
86
|
+
setField: (name: string, value: unknown) => void;
|
|
87
|
+
setErrors: (next: Record<string, string[]>) => void;
|
|
88
|
+
clearErrors: () => void;
|
|
89
|
+
save: () => Promise<string | number>;
|
|
90
|
+
destroy: () => Promise<void>;
|
|
91
|
+
}, "reset" | "load" | "destroy" | "prepareCreate" | "setField" | "setErrors" | "clearErrors" | "save">>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useResourceIndexStore — list-page state для одного Resource'а.
|
|
3
|
+
*
|
|
4
|
+
* Поддерживает:
|
|
5
|
+
* - items + pagination meta из envelope payload
|
|
6
|
+
* - filters (typed Record<string, unknown>) — отправляются как query
|
|
7
|
+
* - sort (key + direction)
|
|
8
|
+
* - selection (Set<row-id>) для bulk-actions; tri-state header-checkbox
|
|
9
|
+
* - loading/error состояния (UI рендерит UidSkeleton/UidErrorState)
|
|
10
|
+
*
|
|
11
|
+
* Один store-instance переиспользуется на разных Resource-страницах через
|
|
12
|
+
* `useResourceIndexStore(slug)` с явным `setSlug` — это даёт чистый reset
|
|
13
|
+
* между resource'ами.
|
|
14
|
+
*/
|
|
15
|
+
export interface IndexMeta {
|
|
16
|
+
page: number;
|
|
17
|
+
per_page: number;
|
|
18
|
+
total: number;
|
|
19
|
+
last_page: number;
|
|
20
|
+
}
|
|
21
|
+
export interface IndexParams {
|
|
22
|
+
page?: number;
|
|
23
|
+
per_page?: number;
|
|
24
|
+
sort?: string | null;
|
|
25
|
+
direction?: 'asc' | 'desc' | null;
|
|
26
|
+
search?: string | null;
|
|
27
|
+
filters?: Record<string, unknown>;
|
|
28
|
+
}
|
|
29
|
+
export declare const useResourceIndexStore: import("pinia").StoreDefinition<"admin-resource-index", Pick<{
|
|
30
|
+
slug: import("vue").Ref<string | null, string | null>;
|
|
31
|
+
items: import("vue").Ref<Record<string, unknown>[], Record<string, unknown>[]>;
|
|
32
|
+
meta: import("vue").Ref<{
|
|
33
|
+
page: number;
|
|
34
|
+
per_page: number;
|
|
35
|
+
total: number;
|
|
36
|
+
last_page: number;
|
|
37
|
+
}, IndexMeta | {
|
|
38
|
+
page: number;
|
|
39
|
+
per_page: number;
|
|
40
|
+
total: number;
|
|
41
|
+
last_page: number;
|
|
42
|
+
}>;
|
|
43
|
+
loading: import("vue").Ref<boolean, boolean>;
|
|
44
|
+
error: import("vue").Ref<Error | null, Error | null>;
|
|
45
|
+
search: import("vue").Ref<string, string>;
|
|
46
|
+
filters: import("vue").Ref<Record<string, unknown>, Record<string, unknown>>;
|
|
47
|
+
sortKey: import("vue").Ref<string | null, string | null>;
|
|
48
|
+
sortDirection: import("vue").Ref<"desc" | "asc", "desc" | "asc">;
|
|
49
|
+
selection: import("vue").Ref<Set<string | number> & Omit<Set<string | number>, keyof Set<any>>, Set<string | number> | (Set<string | number> & Omit<Set<string | number>, keyof Set<any>>)>;
|
|
50
|
+
isEmpty: import("vue").ComputedRef<boolean>;
|
|
51
|
+
hasError: import("vue").ComputedRef<boolean>;
|
|
52
|
+
hasSelection: import("vue").ComputedRef<boolean>;
|
|
53
|
+
selectedCount: import("vue").ComputedRef<number>;
|
|
54
|
+
selectionState: import("vue").ComputedRef<"mixed" | "all" | "none">;
|
|
55
|
+
setSlug: (next: string | null) => void;
|
|
56
|
+
reset: () => void;
|
|
57
|
+
load: (override?: IndexParams) => Promise<void>;
|
|
58
|
+
setSearch: (value: string) => Promise<void>;
|
|
59
|
+
setFilter: (key: string, value: unknown) => Promise<void>;
|
|
60
|
+
clearFilters: () => Promise<void>;
|
|
61
|
+
setSort: (key: string, direction?: "asc" | "desc") => Promise<void>;
|
|
62
|
+
toggleSort: (key: string) => Promise<void>;
|
|
63
|
+
setPage: (page: number) => Promise<void>;
|
|
64
|
+
toggleRow: (id: string | number) => void;
|
|
65
|
+
toggleAllOnPage: () => void;
|
|
66
|
+
clearSelection: () => void;
|
|
67
|
+
isSelected: (id: string | number) => boolean;
|
|
68
|
+
rowId: (row: Record<string, unknown>) => string | number;
|
|
69
|
+
}, "meta" | "search" | "items" | "loading" | "error" | "slug" | "filters" | "sortKey" | "sortDirection" | "selection">, Pick<{
|
|
70
|
+
slug: import("vue").Ref<string | null, string | null>;
|
|
71
|
+
items: import("vue").Ref<Record<string, unknown>[], Record<string, unknown>[]>;
|
|
72
|
+
meta: import("vue").Ref<{
|
|
73
|
+
page: number;
|
|
74
|
+
per_page: number;
|
|
75
|
+
total: number;
|
|
76
|
+
last_page: number;
|
|
77
|
+
}, IndexMeta | {
|
|
78
|
+
page: number;
|
|
79
|
+
per_page: number;
|
|
80
|
+
total: number;
|
|
81
|
+
last_page: number;
|
|
82
|
+
}>;
|
|
83
|
+
loading: import("vue").Ref<boolean, boolean>;
|
|
84
|
+
error: import("vue").Ref<Error | null, Error | null>;
|
|
85
|
+
search: import("vue").Ref<string, string>;
|
|
86
|
+
filters: import("vue").Ref<Record<string, unknown>, Record<string, unknown>>;
|
|
87
|
+
sortKey: import("vue").Ref<string | null, string | null>;
|
|
88
|
+
sortDirection: import("vue").Ref<"desc" | "asc", "desc" | "asc">;
|
|
89
|
+
selection: import("vue").Ref<Set<string | number> & Omit<Set<string | number>, keyof Set<any>>, Set<string | number> | (Set<string | number> & Omit<Set<string | number>, keyof Set<any>>)>;
|
|
90
|
+
isEmpty: import("vue").ComputedRef<boolean>;
|
|
91
|
+
hasError: import("vue").ComputedRef<boolean>;
|
|
92
|
+
hasSelection: import("vue").ComputedRef<boolean>;
|
|
93
|
+
selectedCount: import("vue").ComputedRef<number>;
|
|
94
|
+
selectionState: import("vue").ComputedRef<"mixed" | "all" | "none">;
|
|
95
|
+
setSlug: (next: string | null) => void;
|
|
96
|
+
reset: () => void;
|
|
97
|
+
load: (override?: IndexParams) => Promise<void>;
|
|
98
|
+
setSearch: (value: string) => Promise<void>;
|
|
99
|
+
setFilter: (key: string, value: unknown) => Promise<void>;
|
|
100
|
+
clearFilters: () => Promise<void>;
|
|
101
|
+
setSort: (key: string, direction?: "asc" | "desc") => Promise<void>;
|
|
102
|
+
toggleSort: (key: string) => Promise<void>;
|
|
103
|
+
setPage: (page: number) => Promise<void>;
|
|
104
|
+
toggleRow: (id: string | number) => void;
|
|
105
|
+
toggleAllOnPage: () => void;
|
|
106
|
+
clearSelection: () => void;
|
|
107
|
+
isSelected: (id: string | number) => boolean;
|
|
108
|
+
rowId: (row: Record<string, unknown>) => string | number;
|
|
109
|
+
}, "isEmpty" | "hasError" | "hasSelection" | "selectedCount" | "selectionState">, Pick<{
|
|
110
|
+
slug: import("vue").Ref<string | null, string | null>;
|
|
111
|
+
items: import("vue").Ref<Record<string, unknown>[], Record<string, unknown>[]>;
|
|
112
|
+
meta: import("vue").Ref<{
|
|
113
|
+
page: number;
|
|
114
|
+
per_page: number;
|
|
115
|
+
total: number;
|
|
116
|
+
last_page: number;
|
|
117
|
+
}, IndexMeta | {
|
|
118
|
+
page: number;
|
|
119
|
+
per_page: number;
|
|
120
|
+
total: number;
|
|
121
|
+
last_page: number;
|
|
122
|
+
}>;
|
|
123
|
+
loading: import("vue").Ref<boolean, boolean>;
|
|
124
|
+
error: import("vue").Ref<Error | null, Error | null>;
|
|
125
|
+
search: import("vue").Ref<string, string>;
|
|
126
|
+
filters: import("vue").Ref<Record<string, unknown>, Record<string, unknown>>;
|
|
127
|
+
sortKey: import("vue").Ref<string | null, string | null>;
|
|
128
|
+
sortDirection: import("vue").Ref<"desc" | "asc", "desc" | "asc">;
|
|
129
|
+
selection: import("vue").Ref<Set<string | number> & Omit<Set<string | number>, keyof Set<any>>, Set<string | number> | (Set<string | number> & Omit<Set<string | number>, keyof Set<any>>)>;
|
|
130
|
+
isEmpty: import("vue").ComputedRef<boolean>;
|
|
131
|
+
hasError: import("vue").ComputedRef<boolean>;
|
|
132
|
+
hasSelection: import("vue").ComputedRef<boolean>;
|
|
133
|
+
selectedCount: import("vue").ComputedRef<number>;
|
|
134
|
+
selectionState: import("vue").ComputedRef<"mixed" | "all" | "none">;
|
|
135
|
+
setSlug: (next: string | null) => void;
|
|
136
|
+
reset: () => void;
|
|
137
|
+
load: (override?: IndexParams) => Promise<void>;
|
|
138
|
+
setSearch: (value: string) => Promise<void>;
|
|
139
|
+
setFilter: (key: string, value: unknown) => Promise<void>;
|
|
140
|
+
clearFilters: () => Promise<void>;
|
|
141
|
+
setSort: (key: string, direction?: "asc" | "desc") => Promise<void>;
|
|
142
|
+
toggleSort: (key: string) => Promise<void>;
|
|
143
|
+
setPage: (page: number) => Promise<void>;
|
|
144
|
+
toggleRow: (id: string | number) => void;
|
|
145
|
+
toggleAllOnPage: () => void;
|
|
146
|
+
clearSelection: () => void;
|
|
147
|
+
isSelected: (id: string | number) => boolean;
|
|
148
|
+
rowId: (row: Record<string, unknown>) => string | number;
|
|
149
|
+
}, "reset" | "load" | "setSlug" | "setSearch" | "setFilter" | "clearFilters" | "setSort" | "toggleSort" | "setPage" | "toggleRow" | "toggleAllOnPage" | "clearSelection" | "isSelected" | "rowId">>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme store: текущая тема + список доступных + persist через API.
|
|
3
|
+
*
|
|
4
|
+
* Side effect: применяет `<html data-theme="...">` при изменении.
|
|
5
|
+
* SPA рассчитывает на это для CSS-vars overrides.
|
|
6
|
+
*/
|
|
7
|
+
import type { AdminBootstrap } from '../types/bootstrap';
|
|
8
|
+
export declare const useThemeStore: import("pinia").StoreDefinition<"admin-theme", Pick<{
|
|
9
|
+
current: import("vue").Ref<string, string>;
|
|
10
|
+
available: import("vue").Ref<string[], string[]>;
|
|
11
|
+
isDark: import("vue").ComputedRef<boolean>;
|
|
12
|
+
hydrate: (bootstrap: AdminBootstrap) => void;
|
|
13
|
+
applyLocal: (theme: string) => void;
|
|
14
|
+
setTheme: (theme: string) => Promise<void>;
|
|
15
|
+
}, "current" | "available">, Pick<{
|
|
16
|
+
current: import("vue").Ref<string, string>;
|
|
17
|
+
available: import("vue").Ref<string[], string[]>;
|
|
18
|
+
isDark: import("vue").ComputedRef<boolean>;
|
|
19
|
+
hydrate: (bootstrap: AdminBootstrap) => void;
|
|
20
|
+
applyLocal: (theme: string) => void;
|
|
21
|
+
setTheme: (theme: string) => Promise<void>;
|
|
22
|
+
}, "isDark">, Pick<{
|
|
23
|
+
current: import("vue").Ref<string, string>;
|
|
24
|
+
available: import("vue").Ref<string[], string[]>;
|
|
25
|
+
isDark: import("vue").ComputedRef<boolean>;
|
|
26
|
+
hydrate: (bootstrap: AdminBootstrap) => void;
|
|
27
|
+
applyLocal: (theme: string) => void;
|
|
28
|
+
setTheme: (theme: string) => Promise<void>;
|
|
29
|
+
}, "hydrate" | "applyLocal" | "setTheme">>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|