@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.
Files changed (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +226 -0
  3. package/dist/.gitkeep +0 -0
  4. package/dist/api/bootstrap.d.ts +38 -0
  5. package/dist/api/bootstrap.test.d.ts +1 -0
  6. package/dist/api/client.d.ts +30 -0
  7. package/dist/api/client.test.d.ts +1 -0
  8. package/dist/api/envelope.d.ts +24 -0
  9. package/dist/api/envelope.test.d.ts +1 -0
  10. package/dist/api/errors.d.ts +40 -0
  11. package/dist/api/errors.test.d.ts +1 -0
  12. package/dist/components/AdminApp.vue.d.ts +2 -0
  13. package/dist/components/ForbiddenPage.vue.d.ts +2 -0
  14. package/dist/components/HomePage.vue.d.ts +2 -0
  15. package/dist/components/NotFoundPage.vue.d.ts +2 -0
  16. package/dist/components/SettingsPage.vue.d.ts +2 -0
  17. package/dist/components/UnknownScreenPage.vue.d.ts +2 -0
  18. package/dist/components/auth/LoginForm.test.d.ts +1 -0
  19. package/dist/components/auth/LoginForm.vue.d.ts +17 -0
  20. package/dist/components/auth/LoginPage.test.d.ts +1 -0
  21. package/dist/components/auth/LoginPage.vue.d.ts +26 -0
  22. package/dist/components/auth/TwoFactorForm.test.d.ts +1 -0
  23. package/dist/components/auth/TwoFactorForm.vue.d.ts +8 -0
  24. package/dist/components/auth/index.d.ts +6 -0
  25. package/dist/components/createComponentRegistry.d.ts +22 -0
  26. package/dist/components/dashboard/BarChartWidget.vue.d.ts +18 -0
  27. package/dist/components/dashboard/DashboardPage.test.d.ts +1 -0
  28. package/dist/components/dashboard/DashboardPage.vue.d.ts +28 -0
  29. package/dist/components/dashboard/DonutChartWidget.vue.d.ts +13 -0
  30. package/dist/components/dashboard/GaugeWidget.vue.d.ts +29 -0
  31. package/dist/components/dashboard/HeatmapWidget.vue.d.ts +18 -0
  32. package/dist/components/dashboard/MarkdownWidget.vue.d.ts +8 -0
  33. package/dist/components/dashboard/RecentTableWidget.vue.d.ts +12 -0
  34. package/dist/components/dashboard/StatWidget.vue.d.ts +22 -0
  35. package/dist/components/dashboard/UnknownWidget.vue.d.ts +5 -0
  36. package/dist/components/dashboard/WidgetRenderer.vue.d.ts +10 -0
  37. package/dist/components/dashboard/builtin.d.ts +4 -0
  38. package/dist/components/dashboard/index.d.ts +16 -0
  39. package/dist/components/dashboard/registry.d.ts +25 -0
  40. package/dist/components/dashboard/registry.test.d.ts +1 -0
  41. package/dist/components/fields/CheckboxField.vue.d.ts +16 -0
  42. package/dist/components/fields/DateField.vue.d.ts +25 -0
  43. package/dist/components/fields/NumberField.vue.d.ts +24 -0
  44. package/dist/components/fields/SelectField.vue.d.ts +28 -0
  45. package/dist/components/fields/TextAreaField.vue.d.ts +20 -0
  46. package/dist/components/fields/TextField.vue.d.ts +22 -0
  47. package/dist/components/fields/UnknownField.vue.d.ts +6 -0
  48. package/dist/components/fields/fields.test.d.ts +1 -0
  49. package/dist/components/fields/wysiwyg/quill/QuillField.vue.d.ts +26 -0
  50. package/dist/components/fields/wysiwyg/quill/index.d.ts +12 -0
  51. package/dist/components/fields/wysiwyg/tinymce/TinymceField.vue.d.ts +31 -0
  52. package/dist/components/fields/wysiwyg/tinymce/index.d.ts +12 -0
  53. package/dist/components/gallery/FieldGalleryPage.test.d.ts +1 -0
  54. package/dist/components/gallery/FieldGalleryPage.vue.d.ts +2 -0
  55. package/dist/components/gallery/index.d.ts +1 -0
  56. package/dist/components/import/ImportWizardPage.test.d.ts +1 -0
  57. package/dist/components/import/ImportWizardPage.vue.d.ts +59 -0
  58. package/dist/components/import/index.d.ts +1 -0
  59. package/dist/components/infolist/BadgeEntry.vue.d.ts +18 -0
  60. package/dist/components/infolist/IconEntry.vue.d.ts +22 -0
  61. package/dist/components/infolist/InfolistRenderer.test.d.ts +1 -0
  62. package/dist/components/infolist/InfolistRenderer.vue.d.ts +11 -0
  63. package/dist/components/infolist/KeyValueEntry.vue.d.ts +11 -0
  64. package/dist/components/infolist/TextEntry.vue.d.ts +17 -0
  65. package/dist/components/infolist/UnknownEntry.vue.d.ts +6 -0
  66. package/dist/components/infolist/builtin.d.ts +4 -0
  67. package/dist/components/infolist/index.d.ts +13 -0
  68. package/dist/components/infolist/recordContext.d.ts +9 -0
  69. package/dist/components/infolist/registry.d.ts +19 -0
  70. package/dist/components/infolist/registry.test.d.ts +1 -0
  71. package/dist/components/layouts/ColumnsLayout.vue.d.ts +13 -0
  72. package/dist/components/layouts/RowsLayout.vue.d.ts +10 -0
  73. package/dist/components/layouts/SectionLayout.vue.d.ts +11 -0
  74. package/dist/components/layouts/TabsLayout.vue.d.ts +22 -0
  75. package/dist/components/notifications/NotificationsDrawer.test.d.ts +1 -0
  76. package/dist/components/notifications/NotificationsDrawer.vue.d.ts +13 -0
  77. package/dist/components/notifications/index.d.ts +1 -0
  78. package/dist/components/profile/ProfilePage.test.d.ts +1 -0
  79. package/dist/components/profile/ProfilePage.vue.d.ts +50 -0
  80. package/dist/components/profile/index.d.ts +1 -0
  81. package/dist/components/render/FieldRenderer.test.d.ts +1 -0
  82. package/dist/components/render/FieldRenderer.vue.d.ts +9 -0
  83. package/dist/components/render/LayoutRenderer.test.d.ts +1 -0
  84. package/dist/components/render/LayoutRenderer.vue.d.ts +10 -0
  85. package/dist/components/render/builtin.d.ts +9 -0
  86. package/dist/components/render/formState.d.ts +36 -0
  87. package/dist/components/render/formState.test.d.ts +1 -0
  88. package/dist/components/render/index.d.ts +23 -0
  89. package/dist/components/render/registry.d.ts +35 -0
  90. package/dist/components/render/registry.test.d.ts +1 -0
  91. package/dist/components/resource/ResourceFormPage.test.d.ts +1 -0
  92. package/dist/components/resource/ResourceFormPage.vue.d.ts +13 -0
  93. package/dist/components/resource/ResourceIndexPage.test.d.ts +1 -0
  94. package/dist/components/resource/ResourceIndexPage.vue.d.ts +44 -0
  95. package/dist/components/resource/ResourceViewPage.test.d.ts +1 -0
  96. package/dist/components/resource/ResourceViewPage.vue.d.ts +13 -0
  97. package/dist/components/resource/index.d.ts +6 -0
  98. package/dist/components/shell/AdminShell.vue.d.ts +35 -0
  99. package/dist/components/shell/AdminSidebar.test.d.ts +1 -0
  100. package/dist/components/shell/AdminSidebar.vue.d.ts +27 -0
  101. package/dist/components/shell/AdminTopBar.test.d.ts +1 -0
  102. package/dist/components/shell/AdminTopBar.vue.d.ts +33 -0
  103. package/dist/components/shell/index.d.ts +18 -0
  104. package/dist/components/shell/widgets/LocaleSwitcher.test.d.ts +1 -0
  105. package/dist/components/shell/widgets/LocaleSwitcher.vue.d.ts +2 -0
  106. package/dist/components/shell/widgets/NotificationBell.vue.d.ts +2 -0
  107. package/dist/components/shell/widgets/ThemeToggle.test.d.ts +1 -0
  108. package/dist/components/shell/widgets/ThemeToggle.vue.d.ts +2 -0
  109. package/dist/components/shell/widgets/UserMenu.test.d.ts +1 -0
  110. package/dist/components/shell/widgets/UserMenu.vue.d.ts +2 -0
  111. package/dist/createAdminApp.d.ts +85 -0
  112. package/dist/createAdminApp.test.d.ts +1 -0
  113. package/dist/formState-DGNcH1XQ.js +40 -0
  114. package/dist/formState-DGNcH1XQ.js.map +1 -0
  115. package/dist/formState-GlJBphEn.cjs +2 -0
  116. package/dist/formState-GlJBphEn.cjs.map +1 -0
  117. package/dist/index.cjs +2 -0
  118. package/dist/index.cjs.map +1 -0
  119. package/dist/index.d.ts +62 -0
  120. package/dist/index.mjs +4345 -0
  121. package/dist/index.mjs.map +1 -0
  122. package/dist/quill.cjs +2 -0
  123. package/dist/quill.cjs.map +1 -0
  124. package/dist/quill.mjs +71 -0
  125. package/dist/quill.mjs.map +1 -0
  126. package/dist/router/builder.d.ts +52 -0
  127. package/dist/router/builder.test.d.ts +1 -0
  128. package/dist/router/guards.d.ts +56 -0
  129. package/dist/router/guards.test.d.ts +1 -0
  130. package/dist/router/index.d.ts +63 -0
  131. package/dist/router/index.test.d.ts +1 -0
  132. package/dist/stores/auth.d.ts +142 -0
  133. package/dist/stores/auth.test.d.ts +1 -0
  134. package/dist/stores/index.d.ts +21 -0
  135. package/dist/stores/locale.d.ts +29 -0
  136. package/dist/stores/locale.test.d.ts +1 -0
  137. package/dist/stores/manifest.d.ts +515 -0
  138. package/dist/stores/manifest.test.d.ts +1 -0
  139. package/dist/stores/menu.d.ts +215 -0
  140. package/dist/stores/menu.test.d.ts +1 -0
  141. package/dist/stores/notifications.d.ts +137 -0
  142. package/dist/stores/notifications.test.d.ts +1 -0
  143. package/dist/stores/registry.d.ts +16 -0
  144. package/dist/stores/registry.test.d.ts +1 -0
  145. package/dist/stores/resourceForm.d.ts +91 -0
  146. package/dist/stores/resourceForm.test.d.ts +1 -0
  147. package/dist/stores/resourceIndex.d.ts +149 -0
  148. package/dist/stores/resourceIndex.test.d.ts +1 -0
  149. package/dist/stores/theme.d.ts +29 -0
  150. package/dist/stores/theme.test.d.ts +1 -0
  151. package/dist/style.css +1 -0
  152. package/dist/tinymce.cjs +2 -0
  153. package/dist/tinymce.cjs.map +1 -0
  154. package/dist/tinymce.mjs +80 -0
  155. package/dist/tinymce.mjs.map +1 -0
  156. package/dist/types/bootstrap.d.ts +50 -0
  157. package/package.json +162 -0
  158. package/resources/fonts/InterDisplay-Bold.woff2 +0 -0
  159. package/resources/fonts/InterDisplay-ExtraBold.woff2 +0 -0
  160. package/resources/fonts/InterDisplay-SemiBold.woff2 +0 -0
  161. package/resources/fonts/InterVariable-Italic.woff2 +0 -0
  162. package/resources/fonts/InterVariable.woff2 +0 -0
  163. 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 {};