@modern-admin/react 0.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 (261) hide show
  1. package/dist/action-guard.d.ts +13 -0
  2. package/dist/action-guard.d.ts.map +1 -0
  3. package/dist/action-guard.js +15 -0
  4. package/dist/action-guard.js.map +1 -0
  5. package/dist/action-menu.d.ts +17 -0
  6. package/dist/action-menu.d.ts.map +1 -0
  7. package/dist/action-menu.jsx +80 -0
  8. package/dist/action-menu.jsx.map +1 -0
  9. package/dist/admin-app.d.ts +23 -0
  10. package/dist/admin-app.d.ts.map +1 -0
  11. package/dist/admin-app.jsx +407 -0
  12. package/dist/admin-app.jsx.map +1 -0
  13. package/dist/admin-router.d.ts +29 -0
  14. package/dist/admin-router.d.ts.map +1 -0
  15. package/dist/admin-router.jsx +215 -0
  16. package/dist/admin-router.jsx.map +1 -0
  17. package/dist/breadcrumbs.d.ts +17 -0
  18. package/dist/breadcrumbs.d.ts.map +1 -0
  19. package/dist/breadcrumbs.jsx +40 -0
  20. package/dist/breadcrumbs.jsx.map +1 -0
  21. package/dist/client.d.ts +526 -0
  22. package/dist/client.d.ts.map +1 -0
  23. package/dist/client.js +582 -0
  24. package/dist/client.js.map +1 -0
  25. package/dist/component-loader.d.ts +10 -0
  26. package/dist/component-loader.d.ts.map +1 -0
  27. package/dist/component-loader.js +23 -0
  28. package/dist/component-loader.js.map +1 -0
  29. package/dist/components/ai-assistant-widget.d.ts +3 -0
  30. package/dist/components/ai-assistant-widget.d.ts.map +1 -0
  31. package/dist/components/ai-assistant-widget.jsx +390 -0
  32. package/dist/components/ai-assistant-widget.jsx.map +1 -0
  33. package/dist/components/ai-fill-dialog.d.ts +9 -0
  34. package/dist/components/ai-fill-dialog.d.ts.map +1 -0
  35. package/dist/components/ai-fill-dialog.jsx +105 -0
  36. package/dist/components/ai-fill-dialog.jsx.map +1 -0
  37. package/dist/components/chart-builder-dialog.d.ts +10 -0
  38. package/dist/components/chart-builder-dialog.d.ts.map +1 -0
  39. package/dist/components/chart-builder-dialog.jsx +433 -0
  40. package/dist/components/chart-builder-dialog.jsx.map +1 -0
  41. package/dist/components/chart-widget.d.ts +12 -0
  42. package/dist/components/chart-widget.d.ts.map +1 -0
  43. package/dist/components/chart-widget.jsx +365 -0
  44. package/dist/components/chart-widget.jsx.map +1 -0
  45. package/dist/components/global-search-dialog.d.ts +7 -0
  46. package/dist/components/global-search-dialog.d.ts.map +1 -0
  47. package/dist/components/global-search-dialog.jsx +187 -0
  48. package/dist/components/global-search-dialog.jsx.map +1 -0
  49. package/dist/components/group-settings-dialog.d.ts +13 -0
  50. package/dist/components/group-settings-dialog.d.ts.map +1 -0
  51. package/dist/components/group-settings-dialog.jsx +53 -0
  52. package/dist/components/group-settings-dialog.jsx.map +1 -0
  53. package/dist/components/move-chart-dialog.d.ts +18 -0
  54. package/dist/components/move-chart-dialog.d.ts.map +1 -0
  55. package/dist/components/move-chart-dialog.jsx +68 -0
  56. package/dist/components/move-chart-dialog.jsx.map +1 -0
  57. package/dist/components/reference-multi-table-dialog.d.ts +12 -0
  58. package/dist/components/reference-multi-table-dialog.d.ts.map +1 -0
  59. package/dist/components/reference-multi-table-dialog.jsx +126 -0
  60. package/dist/components/reference-multi-table-dialog.jsx.map +1 -0
  61. package/dist/components/related-records-tabs.d.ts +8 -0
  62. package/dist/components/related-records-tabs.d.ts.map +1 -0
  63. package/dist/components/related-records-tabs.jsx +75 -0
  64. package/dist/components/related-records-tabs.jsx.map +1 -0
  65. package/dist/components/revisions-button.d.ts +7 -0
  66. package/dist/components/revisions-button.d.ts.map +1 -0
  67. package/dist/components/revisions-button.jsx +152 -0
  68. package/dist/components/revisions-button.jsx.map +1 -0
  69. package/dist/components/wizard-form.d.ts +43 -0
  70. package/dist/components/wizard-form.d.ts.map +1 -0
  71. package/dist/components/wizard-form.jsx +136 -0
  72. package/dist/components/wizard-form.jsx.map +1 -0
  73. package/dist/dashboard/time-series.d.ts +20 -0
  74. package/dist/dashboard/time-series.d.ts.map +1 -0
  75. package/dist/dashboard/time-series.js +108 -0
  76. package/dist/dashboard/time-series.js.map +1 -0
  77. package/dist/dialogs.d.ts +35 -0
  78. package/dist/dialogs.d.ts.map +1 -0
  79. package/dist/dialogs.jsx +152 -0
  80. package/dist/dialogs.jsx.map +1 -0
  81. package/dist/export.d.ts +39 -0
  82. package/dist/export.d.ts.map +1 -0
  83. package/dist/export.js +114 -0
  84. package/dist/export.js.map +1 -0
  85. package/dist/extension-registry.d.ts +122 -0
  86. package/dist/extension-registry.d.ts.map +1 -0
  87. package/dist/extension-registry.js +93 -0
  88. package/dist/extension-registry.js.map +1 -0
  89. package/dist/header-controls.d.ts +4 -0
  90. package/dist/header-controls.d.ts.map +1 -0
  91. package/dist/header-controls.jsx +70 -0
  92. package/dist/header-controls.jsx.map +1 -0
  93. package/dist/hooks.d.ts +104 -0
  94. package/dist/hooks.d.ts.map +1 -0
  95. package/dist/hooks.js +374 -0
  96. package/dist/hooks.js.map +1 -0
  97. package/dist/hotkey-help.d.ts +3 -0
  98. package/dist/hotkey-help.d.ts.map +1 -0
  99. package/dist/hotkey-help.jsx +32 -0
  100. package/dist/hotkey-help.jsx.map +1 -0
  101. package/dist/hotkey-registry.d.ts +18 -0
  102. package/dist/hotkey-registry.d.ts.map +1 -0
  103. package/dist/hotkey-registry.jsx +34 -0
  104. package/dist/hotkey-registry.jsx.map +1 -0
  105. package/dist/i18n.d.ts +74 -0
  106. package/dist/i18n.d.ts.map +1 -0
  107. package/dist/i18n.jsx +127 -0
  108. package/dist/i18n.jsx.map +1 -0
  109. package/dist/index.d.ts +35 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +36 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/notify.d.ts +41 -0
  114. package/dist/notify.d.ts.map +1 -0
  115. package/dist/notify.jsx +58 -0
  116. package/dist/notify.jsx.map +1 -0
  117. package/dist/pages/ai-assistant-settings-section.d.ts +3 -0
  118. package/dist/pages/ai-assistant-settings-section.d.ts.map +1 -0
  119. package/dist/pages/ai-assistant-settings-section.jsx +126 -0
  120. package/dist/pages/ai-assistant-settings-section.jsx.map +1 -0
  121. package/dist/pages/audit-log-page.d.ts +3 -0
  122. package/dist/pages/audit-log-page.d.ts.map +1 -0
  123. package/dist/pages/audit-log-page.jsx +354 -0
  124. package/dist/pages/audit-log-page.jsx.map +1 -0
  125. package/dist/pages/edit-page.d.ts +7 -0
  126. package/dist/pages/edit-page.d.ts.map +1 -0
  127. package/dist/pages/edit-page.jsx +614 -0
  128. package/dist/pages/edit-page.jsx.map +1 -0
  129. package/dist/pages/export-dialog.d.ts +11 -0
  130. package/dist/pages/export-dialog.d.ts.map +1 -0
  131. package/dist/pages/export-dialog.jsx +102 -0
  132. package/dist/pages/export-dialog.jsx.map +1 -0
  133. package/dist/pages/home-page.d.ts +3 -0
  134. package/dist/pages/home-page.d.ts.map +1 -0
  135. package/dist/pages/home-page.jsx +211 -0
  136. package/dist/pages/home-page.jsx.map +1 -0
  137. package/dist/pages/list-page.d.ts +42 -0
  138. package/dist/pages/list-page.d.ts.map +1 -0
  139. package/dist/pages/list-page.jsx +1596 -0
  140. package/dist/pages/list-page.jsx.map +1 -0
  141. package/dist/pages/login-page.d.ts +11 -0
  142. package/dist/pages/login-page.d.ts.map +1 -0
  143. package/dist/pages/login-page.jsx +157 -0
  144. package/dist/pages/login-page.jsx.map +1 -0
  145. package/dist/pages/settings-page.d.ts +5 -0
  146. package/dist/pages/settings-page.d.ts.map +1 -0
  147. package/dist/pages/settings-page.jsx +787 -0
  148. package/dist/pages/settings-page.jsx.map +1 -0
  149. package/dist/pages/settings-shared.d.ts +51 -0
  150. package/dist/pages/settings-shared.d.ts.map +1 -0
  151. package/dist/pages/settings-shared.jsx +66 -0
  152. package/dist/pages/settings-shared.jsx.map +1 -0
  153. package/dist/pages/show-page.d.ts +7 -0
  154. package/dist/pages/show-page.d.ts.map +1 -0
  155. package/dist/pages/show-page.jsx +147 -0
  156. package/dist/pages/show-page.jsx.map +1 -0
  157. package/dist/pages/wizard-create-page.d.ts +14 -0
  158. package/dist/pages/wizard-create-page.d.ts.map +1 -0
  159. package/dist/pages/wizard-create-page.jsx +106 -0
  160. package/dist/pages/wizard-create-page.jsx.map +1 -0
  161. package/dist/property-renderer.d.ts +8 -0
  162. package/dist/property-renderer.d.ts.map +1 -0
  163. package/dist/property-renderer.jsx +690 -0
  164. package/dist/property-renderer.jsx.map +1 -0
  165. package/dist/provider.d.ts +20 -0
  166. package/dist/provider.d.ts.map +1 -0
  167. package/dist/provider.jsx +32 -0
  168. package/dist/provider.jsx.map +1 -0
  169. package/dist/realtime.d.ts +22 -0
  170. package/dist/realtime.d.ts.map +1 -0
  171. package/dist/realtime.js +38 -0
  172. package/dist/realtime.js.map +1 -0
  173. package/dist/reference.d.ts +52 -0
  174. package/dist/reference.d.ts.map +1 -0
  175. package/dist/reference.jsx +224 -0
  176. package/dist/reference.jsx.map +1 -0
  177. package/dist/relations.d.ts +11 -0
  178. package/dist/relations.d.ts.map +1 -0
  179. package/dist/relations.js +36 -0
  180. package/dist/relations.js.map +1 -0
  181. package/dist/router.d.ts +82 -0
  182. package/dist/router.d.ts.map +1 -0
  183. package/dist/router.jsx +187 -0
  184. package/dist/router.jsx.map +1 -0
  185. package/dist/show-when.d.ts +7 -0
  186. package/dist/show-when.d.ts.map +1 -0
  187. package/dist/show-when.js +77 -0
  188. package/dist/show-when.js.map +1 -0
  189. package/dist/types.d.ts +194 -0
  190. package/dist/types.d.ts.map +1 -0
  191. package/dist/types.js +18 -0
  192. package/dist/types.js.map +1 -0
  193. package/dist/use-dashboard-charts.d.ts +93 -0
  194. package/dist/use-dashboard-charts.d.ts.map +1 -0
  195. package/dist/use-dashboard-charts.js +263 -0
  196. package/dist/use-dashboard-charts.js.map +1 -0
  197. package/dist/use-hotkey.d.ts +17 -0
  198. package/dist/use-hotkey.d.ts.map +1 -0
  199. package/dist/use-hotkey.js +103 -0
  200. package/dist/use-hotkey.js.map +1 -0
  201. package/dist/user-directory.d.ts +18 -0
  202. package/dist/user-directory.d.ts.map +1 -0
  203. package/dist/user-directory.js +51 -0
  204. package/dist/user-directory.js.map +1 -0
  205. package/dist/validation.d.ts +22 -0
  206. package/dist/validation.d.ts.map +1 -0
  207. package/dist/validation.js +338 -0
  208. package/dist/validation.js.map +1 -0
  209. package/package.json +59 -0
  210. package/src/action-guard.ts +20 -0
  211. package/src/action-menu.tsx +161 -0
  212. package/src/admin-app.tsx +630 -0
  213. package/src/admin-router.tsx +273 -0
  214. package/src/breadcrumbs.tsx +75 -0
  215. package/src/client.ts +1093 -0
  216. package/src/component-loader.ts +33 -0
  217. package/src/components/ai-assistant-widget.tsx +565 -0
  218. package/src/components/ai-fill-dialog.tsx +143 -0
  219. package/src/components/chart-builder-dialog.tsx +618 -0
  220. package/src/components/chart-widget.tsx +654 -0
  221. package/src/components/global-search-dialog.tsx +272 -0
  222. package/src/components/group-settings-dialog.tsx +93 -0
  223. package/src/components/move-chart-dialog.tsx +130 -0
  224. package/src/components/reference-multi-table-dialog.tsx +196 -0
  225. package/src/components/related-records-tabs.tsx +130 -0
  226. package/src/components/revisions-button.tsx +237 -0
  227. package/src/components/wizard-form.tsx +302 -0
  228. package/src/dashboard/time-series.ts +125 -0
  229. package/src/dialogs.tsx +265 -0
  230. package/src/export.ts +140 -0
  231. package/src/extension-registry.ts +195 -0
  232. package/src/header-controls.tsx +125 -0
  233. package/src/hooks.ts +509 -0
  234. package/src/hotkey-help.tsx +56 -0
  235. package/src/hotkey-registry.tsx +60 -0
  236. package/src/i18n.tsx +267 -0
  237. package/src/index.ts +192 -0
  238. package/src/notify.tsx +94 -0
  239. package/src/pages/ai-assistant-settings-section.tsx +167 -0
  240. package/src/pages/audit-log-page.tsx +580 -0
  241. package/src/pages/edit-page.tsx +743 -0
  242. package/src/pages/export-dialog.tsx +154 -0
  243. package/src/pages/home-page.tsx +318 -0
  244. package/src/pages/list-page.tsx +2645 -0
  245. package/src/pages/login-page.tsx +242 -0
  246. package/src/pages/settings-page.tsx +1143 -0
  247. package/src/pages/settings-shared.tsx +134 -0
  248. package/src/pages/show-page.tsx +223 -0
  249. package/src/pages/wizard-create-page.tsx +164 -0
  250. package/src/property-renderer.tsx +1143 -0
  251. package/src/provider.tsx +70 -0
  252. package/src/realtime.ts +55 -0
  253. package/src/reference.tsx +386 -0
  254. package/src/relations.ts +55 -0
  255. package/src/router.tsx +211 -0
  256. package/src/show-when.ts +76 -0
  257. package/src/types.ts +198 -0
  258. package/src/use-dashboard-charts.ts +362 -0
  259. package/src/use-hotkey.ts +128 -0
  260. package/src/user-directory.ts +56 -0
  261. package/src/validation.ts +361 -0
package/dist/i18n.jsx ADDED
@@ -0,0 +1,127 @@
1
+ // React bindings for @modern-admin/i18n. Wraps the I18n registry in a
2
+ // provider, persists the active locale in localStorage, and exposes a
3
+ // `useI18n()` hook that re-renders subscribers on locale changes.
4
+ import * as React from 'react';
5
+ import { I18n, builtinLocales } from '@modern-admin/i18n';
6
+ const STORAGE_KEY = 'modern-admin:locale';
7
+ const isDefined = (value) => value !== undefined;
8
+ const firstDefined = (...values) => values.find(isDefined);
9
+ const localizeAvailableValues = (availableValues, ...maps) => {
10
+ if (!availableValues)
11
+ return availableValues;
12
+ return availableValues.map((option) => ({
13
+ ...option,
14
+ label: firstDefined(...maps.map((map) => map?.[option.value]), option.label) ?? option.label,
15
+ }));
16
+ };
17
+ const localizeKeyValueField = (field, ...translations) => ({
18
+ ...field,
19
+ label: firstDefined(...translations.map((translation) => translation?.label), field.label),
20
+ description: firstDefined(...translations.map((translation) => translation?.description), field.description),
21
+ placeholder: firstDefined(...translations.map((translation) => translation?.placeholder), field.placeholder),
22
+ availableValues: field.availableValues?.map((option) => {
23
+ if (typeof option === 'string') {
24
+ const label = firstDefined(...translations.map((translation) => translation?.availableValues?.[option]), option) ??
25
+ option;
26
+ return { value: option, label };
27
+ }
28
+ return {
29
+ ...option,
30
+ label: firstDefined(...translations.map((translation) => translation?.availableValues?.[option.value]), option.label) ??
31
+ option.label,
32
+ };
33
+ }),
34
+ });
35
+ /**
36
+ * Applies translated tab labels to `relatedResources`. Each translation map
37
+ * is keyed by `resourceId`; the first map that has a matching entry wins.
38
+ * Exported for unit testing.
39
+ */
40
+ export const localizeRelatedResources = (relatedResources, ...translations) => {
41
+ if (!relatedResources)
42
+ return relatedResources;
43
+ return relatedResources.map((r) => {
44
+ const translatedLabel = firstDefined(...translations.map((map) => map?.[r.resourceId]));
45
+ return translatedLabel !== undefined ? { ...r, label: translatedLabel } : r;
46
+ });
47
+ };
48
+ const localizeProperty = (property, ...translations) => ({
49
+ ...property,
50
+ label: firstDefined(...translations.map((translation) => translation?.label), property.label) ?? property.label,
51
+ description: firstDefined(...translations.map((translation) => translation?.description), property.description),
52
+ availableValues: localizeAvailableValues(property.availableValues, ...translations.map((translation) => translation?.availableValues)),
53
+ keyValueFields: property.keyValueFields?.map((field) => localizeKeyValueField(field, ...translations.map((translation) => translation?.keyValueFields?.[field.key]))),
54
+ });
55
+ const I18nContext = React.createContext(null);
56
+ export function I18nProvider({ children, locales = builtinLocales, defaultLocale, fallbackLocale = 'en', metadataTranslations, }) {
57
+ const i18n = React.useMemo(() => {
58
+ const initial = (typeof localStorage !== 'undefined' && localStorage.getItem(STORAGE_KEY)) ||
59
+ defaultLocale ||
60
+ locales[0]?.code;
61
+ return new I18n({ locales, defaultLocale: initial ?? undefined, fallbackLocale });
62
+ }, [locales, defaultLocale, fallbackLocale]);
63
+ const [locale, setLocaleState] = React.useState(() => i18n.locale);
64
+ const localizeResource = React.useCallback((resource) => {
65
+ const localeMeta = metadataTranslations?.[locale];
66
+ const fallbackMeta = metadataTranslations?.[fallbackLocale];
67
+ const resourceLocale = localeMeta?.resources?.[resource.id];
68
+ const resourceFallback = fallbackMeta?.resources?.[resource.id];
69
+ const localizedName = firstDefined(resourceLocale?.label, resourceLocale?.name, resourceFallback?.label, resourceFallback?.name, resource.name) ??
70
+ resource.name;
71
+ const group = resource.navigation?.group;
72
+ return {
73
+ ...resource,
74
+ name: localizedName,
75
+ navigation: resource.navigation === null
76
+ ? null
77
+ : resource.navigation
78
+ ? {
79
+ ...resource.navigation,
80
+ name: firstDefined(resourceLocale?.navigation?.name, resourceFallback?.navigation?.name, resource.navigation.name),
81
+ group: firstDefined(resourceLocale?.navigation?.group, resourceFallback?.navigation?.group, group ? localeMeta?.navigation?.groups?.[group] : undefined, group ? fallbackMeta?.navigation?.groups?.[group] : undefined, resource.navigation.group),
82
+ }
83
+ : resource.navigation,
84
+ properties: resource.properties.map((property) => localizeProperty(property, resourceLocale?.properties?.[property.path], localeMeta?.properties?.[property.path], resourceFallback?.properties?.[property.path], fallbackMeta?.properties?.[property.path])),
85
+ actions: resource.actions.map((action) => {
86
+ const localizedLabel = firstDefined(resourceLocale?.actions?.[action.name]?.label, resourceFallback?.actions?.[action.name]?.label);
87
+ if (localizedLabel === undefined)
88
+ return action;
89
+ return {
90
+ ...action,
91
+ custom: { ...(action.custom ?? {}), label: localizedLabel },
92
+ };
93
+ }),
94
+ relatedResources: localizeRelatedResources(resource.relatedResources, resourceLocale?.relatedResources, resourceFallback?.relatedResources),
95
+ };
96
+ }, [fallbackLocale, locale, metadataTranslations]);
97
+ const setLocale = React.useCallback((code) => {
98
+ i18n.setLocale(code);
99
+ if (typeof localStorage !== 'undefined')
100
+ localStorage.setItem(STORAGE_KEY, code);
101
+ setLocaleState(i18n.locale);
102
+ }, [i18n]);
103
+ const value = React.useMemo(() => ({
104
+ locale,
105
+ setLocale,
106
+ t: (key, params) => i18n.t(key, params),
107
+ availableLocales: () => i18n.availableLocales(),
108
+ localizeResource,
109
+ }), [locale, setLocale, i18n, localizeResource]);
110
+ return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;
111
+ }
112
+ /** Subscribe to the active locale + translations. Falls back to a no-op
113
+ * implementation when no provider is mounted, so consumers can render
114
+ * without forcing apps to install i18n. */
115
+ export function useI18n() {
116
+ const ctx = React.useContext(I18nContext);
117
+ if (ctx)
118
+ return ctx;
119
+ return {
120
+ locale: 'en',
121
+ setLocale: () => { },
122
+ t: (k) => k,
123
+ availableLocales: () => [{ code: 'en', name: 'English' }],
124
+ localizeResource: (resource) => resource,
125
+ };
126
+ }
127
+ //# sourceMappingURL=i18n.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.jsx","sourceRoot":"","sources":["../src/i18n.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export { AdminClient, AdminApiError, type AdminClientOptions, type AuthUiProps, type AiAssistantChatEnqueueResponse, type AiAssistantChatMessage, type AiAssistantChatResponse, type AiAssistantCitation, type AiAssistantSettings, type AiAssistantTask, type ApiKeyRecord, type UploadedFileInfo, type UploadProgress, type UploadFileOptions, type UploadFilesOptions, } from './client.js';
2
+ export { ComponentLoader, type ComponentEntry } from './component-loader.js';
3
+ export { registerSidebarItem, registerSettingsSection, registerPropertyExtension, registerExtensionRoute, getSidebarExtensions, getSettingsSectionExtensions, getPropertyExtension, getRouteExtension, _resetExtensionRegistry, type SidebarExtension, type SettingsExtension, type PropertyExtension, type RouteExtension, } from './extension-registry.js';
4
+ export { ModernAdminProvider, useAdminClient, useAdminContext, type ModernAdminProviderProps, } from './provider.js';
5
+ export { useAdminConfig, useFeatures, useResource, useResources, useRecords, useRecord, useCreateRecord, useUpdateRecord, useDeleteRecord, useBulkDeleteRecords, useInvokeResourceAction, useSearchRecords, useCurrentUser, useLogin, useLogout, useAuthUiProps, useSocialLogin, type CurrentUserResult, } from './hooks.js';
6
+ export { PropertyDisplay, PropertyEditor, type PropertyDisplayProps, type PropertyEditorProps, } from './property-renderer.js';
7
+ export { ReferenceLink, ReferenceLinkList, ReferenceCombobox, ReferenceMultiCombobox, } from './reference.js';
8
+ export { I18nProvider, useI18n, type I18nProviderProps, type MetadataKeyValueFieldTranslations, type MetadataPropertyTranslations, type MetadataActionTranslations, type MetadataResourceTranslations, type MetadataLocaleTranslations, type MetadataTranslations, } from './i18n.js';
9
+ export { useHotkey, type HotkeyOptions } from './use-hotkey.js';
10
+ export { HotkeyRegistryProvider, useRegisteredHotkeys, type HotkeyDescriptor, } from './hotkey-registry.js';
11
+ export { HotkeyHelpButton } from './hotkey-help.js';
12
+ export { ThemeToggle, LanguageSwitcher } from './header-controls.js';
13
+ export { NotifyToaster, useNotify, type NotifyMessage } from './notify.js';
14
+ export { DialogsProvider, useDialogs, type DialogsApi, type ConfirmOptions, type AlertOptions, type OpenOptions, type DialogsProviderProps, } from './dialogs.js';
15
+ export { confirmGuard } from './action-guard.js';
16
+ export { buildValidationSchema, buildPropertySchema, defaultValueFor, type FormValuesGetter, type Translator, } from './validation.js';
17
+ export { evaluateShowWhen } from './show-when.js';
18
+ export { Link, useRoute, useNavigate, useOpenInNewTab, buildHref, parseLocation, type Route, type ListQueryState, type LinkProps, } from './router.js';
19
+ export { AdminApp, type AdminAppProps } from './admin-app.js';
20
+ export { LoginPage, type LoginPageProps } from './pages/login-page.js';
21
+ export { useRealtimeInvalidation, applyDeletionLocally, type RealtimeSubscriber, type RealtimeWireEvent, } from './realtime.js';
22
+ export { ResourceListPage } from './pages/list-page.js';
23
+ export { ResourceShowPage } from './pages/show-page.js';
24
+ export { ResourceEditPage } from './pages/edit-page.js';
25
+ export { ResourceWizardCreatePage, type ResourceWizardCreatePageProps, } from './pages/wizard-create-page.js';
26
+ export { WizardForm, type WizardStep, type WizardFormLabels, type WizardFormProps, } from './components/wizard-form.js';
27
+ export { HomePage } from './pages/home-page.js';
28
+ export { ExportDialog, type ExportDialogProps } from './pages/export-dialog.js';
29
+ export { PageBreadcrumbs, homeCrumb, type BreadcrumbItemSpec, type PageBreadcrumbsProps, } from './breadcrumbs.js';
30
+ export { fetchAllRecords, recordsToCsv, recordsToJson, csvEscape, downloadText, exportFilename, type ExportFormat, type FetchAllOptions, type SerializeOptions, } from './export.js';
31
+ export type { AdminConfig, AdminFeatures, ActionDescriptor, CurrentUser, ListQuery, ListResponse, PropertyJSON, RecordJSON, RecordResponse, RelatedResource, ResourceJSON, ShowWhenSpec, View, } from './types.js';
32
+ export { RelatedRecordsTabs } from './components/related-records-tabs.js';
33
+ export { ReferenceMultiTableDialog, type ReferenceMultiTableDialogProps, } from './components/reference-multi-table-dialog.js';
34
+ export { LocalStorageDashboardStore, ServerDashboardStore, useDashboardCharts, resolveRange, emitDashboardReload, type UseDashboardChartsOptions, type UseDashboardChartsResult, } from './use-dashboard-charts.js';
35
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,36 @@
1
+ // @modern-admin/react — React-side runtime: provider, hooks, property-type
2
+ // renderers, ComponentLoader, and a default <AdminApp> shell.
3
+ export { AdminClient, AdminApiError, } from './client.js';
4
+ export { ComponentLoader } from './component-loader.js';
5
+ export { registerSidebarItem, registerSettingsSection, registerPropertyExtension, registerExtensionRoute, getSidebarExtensions, getSettingsSectionExtensions, getPropertyExtension, getRouteExtension, _resetExtensionRegistry, } from './extension-registry.js';
6
+ export { ModernAdminProvider, useAdminClient, useAdminContext, } from './provider.js';
7
+ export { useAdminConfig, useFeatures, useResource, useResources, useRecords, useRecord, useCreateRecord, useUpdateRecord, useDeleteRecord, useBulkDeleteRecords, useInvokeResourceAction, useSearchRecords, useCurrentUser, useLogin, useLogout, useAuthUiProps, useSocialLogin, } from './hooks.js';
8
+ export { PropertyDisplay, PropertyEditor, } from './property-renderer.js';
9
+ export { ReferenceLink, ReferenceLinkList, ReferenceCombobox, ReferenceMultiCombobox, } from './reference.js';
10
+ export { I18nProvider, useI18n, } from './i18n.js';
11
+ export { useHotkey } from './use-hotkey.js';
12
+ export { HotkeyRegistryProvider, useRegisteredHotkeys, } from './hotkey-registry.js';
13
+ export { HotkeyHelpButton } from './hotkey-help.js';
14
+ export { ThemeToggle, LanguageSwitcher } from './header-controls.js';
15
+ export { NotifyToaster, useNotify } from './notify.js';
16
+ export { DialogsProvider, useDialogs, } from './dialogs.js';
17
+ export { confirmGuard } from './action-guard.js';
18
+ export { buildValidationSchema, buildPropertySchema, defaultValueFor, } from './validation.js';
19
+ export { evaluateShowWhen } from './show-when.js';
20
+ export { Link, useRoute, useNavigate, useOpenInNewTab, buildHref, parseLocation, } from './router.js';
21
+ export { AdminApp } from './admin-app.js';
22
+ export { LoginPage } from './pages/login-page.js';
23
+ export { useRealtimeInvalidation, applyDeletionLocally, } from './realtime.js';
24
+ export { ResourceListPage } from './pages/list-page.js';
25
+ export { ResourceShowPage } from './pages/show-page.js';
26
+ export { ResourceEditPage } from './pages/edit-page.js';
27
+ export { ResourceWizardCreatePage, } from './pages/wizard-create-page.js';
28
+ export { WizardForm, } from './components/wizard-form.js';
29
+ export { HomePage } from './pages/home-page.js';
30
+ export { ExportDialog } from './pages/export-dialog.js';
31
+ export { PageBreadcrumbs, homeCrumb, } from './breadcrumbs.js';
32
+ export { fetchAllRecords, recordsToCsv, recordsToJson, csvEscape, downloadText, exportFilename, } from './export.js';
33
+ export { RelatedRecordsTabs } from './components/related-records-tabs.js';
34
+ export { ReferenceMultiTableDialog, } from './components/reference-multi-table-dialog.js';
35
+ export { LocalStorageDashboardStore, ServerDashboardStore, useDashboardCharts, resolveRange, emitDashboardReload, } from './use-dashboard-charts.js';
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import * as React from 'react';
2
+ import { toast, type ToasterProps } from '@modern-admin/ui';
3
+ export interface NotifyMessage {
4
+ /** i18n key, e.g. 'toast:saved' */
5
+ key?: string;
6
+ /** Already-translated literal text (used as-is when present). */
7
+ message?: string;
8
+ /** Interpolation params for the `key` lookup. */
9
+ params?: Record<string, unknown>;
10
+ /** Optional secondary line. */
11
+ description?: string;
12
+ }
13
+ type Input = string | NotifyMessage;
14
+ interface NotifyApi {
15
+ success(input: Input, opts?: {
16
+ description?: string;
17
+ }): void;
18
+ error(input: Input, opts?: {
19
+ description?: string;
20
+ }): void;
21
+ info(input: Input, opts?: {
22
+ description?: string;
23
+ }): void;
24
+ warning(input: Input, opts?: {
25
+ description?: string;
26
+ }): void;
27
+ /** Show loading -> success/error around a promise. Strings are i18n keys. */
28
+ promise<T>(p: Promise<T>, messages: {
29
+ loading: Input;
30
+ success: Input | ((value: T) => Input);
31
+ error: Input | ((err: unknown) => Input);
32
+ }): Promise<T>;
33
+ /** Escape hatch for callers that want raw sonner access. */
34
+ raw: typeof toast;
35
+ }
36
+ /** The global toaster. Mount once near the root of the admin shell. */
37
+ export declare function NotifyToaster(props: ToasterProps): React.ReactElement;
38
+ /** Hook returning a translation-aware notification surface. */
39
+ export declare function useNotify(): NotifyApi;
40
+ export {};
41
+ //# sourceMappingURL=notify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../src/notify.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAW,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAGpE,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,KAAK,KAAK,GAAG,MAAM,GAAG,aAAa,CAAA;AAEnC,UAAU,SAAS;IACjB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAC5D,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAC1D,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IACzD,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAC5D,6EAA6E;IAC7E,OAAO,CAAC,CAAC,EACP,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EACb,QAAQ,EAAE;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC;QAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,KAAK,CAAC,CAAA;KAAE,GAC7G,OAAO,CAAC,CAAC,CAAC,CAAA;IACb,4DAA4D;IAC5D,GAAG,EAAE,OAAO,KAAK,CAAA;CAClB;AAED,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,CAAC,YAAY,CAErE;AAED,+DAA+D;AAC/D,wBAAgB,SAAS,IAAI,SAAS,CAgDrC"}
@@ -0,0 +1,58 @@
1
+ // Global, i18n-aware toast notifications.
2
+ //
3
+ // `useNotify()` returns a typed surface that translates message keys before
4
+ // handing them to sonner. Mount `<NotifyToaster />` once at the app root —
5
+ // it wraps the shadcn-flavoured `<Toaster />` with sensible defaults.
6
+ // Helpers also accept raw strings (already-translated) for cases where the
7
+ // caller has the literal text on hand (server error messages, etc.).
8
+ import * as React from 'react';
9
+ import { Toaster, toast } from '@modern-admin/ui';
10
+ import { useI18n } from './i18n.js';
11
+ /** The global toaster. Mount once near the root of the admin shell. */
12
+ export function NotifyToaster(props) {
13
+ return <Toaster richColors closeButton position="top-right" {...props}/>;
14
+ }
15
+ /** Hook returning a translation-aware notification surface. */
16
+ export function useNotify() {
17
+ const { t } = useI18n();
18
+ const resolve = React.useCallback((input) => {
19
+ if (typeof input === 'string')
20
+ return { title: input };
21
+ const title = input.key ? t(input.key, input.params) : (input.message ?? '');
22
+ return input.description ? { title, description: input.description } : { title };
23
+ }, [t]);
24
+ return React.useMemo(() => ({
25
+ success: (input, opts) => {
26
+ const r = resolve(input);
27
+ toast.success(r.title, { description: opts?.description ?? r.description });
28
+ },
29
+ error: (input, opts) => {
30
+ const r = resolve(input);
31
+ toast.error(r.title, { description: opts?.description ?? r.description });
32
+ },
33
+ info: (input, opts) => {
34
+ const r = resolve(input);
35
+ toast.info(r.title, { description: opts?.description ?? r.description });
36
+ },
37
+ warning: (input, opts) => {
38
+ const r = resolve(input);
39
+ toast.warning(r.title, { description: opts?.description ?? r.description });
40
+ },
41
+ promise: (p, messages) => {
42
+ toast.promise(p, {
43
+ loading: resolve(messages.loading).title,
44
+ success: (value) => {
45
+ const m = typeof messages.success === 'function' ? messages.success(value) : messages.success;
46
+ return resolve(m).title;
47
+ },
48
+ error: (err) => {
49
+ const m = typeof messages.error === 'function' ? messages.error(err) : messages.error;
50
+ return resolve(m).title;
51
+ },
52
+ });
53
+ return p;
54
+ },
55
+ raw: toast,
56
+ }), [resolve]);
57
+ }
58
+ //# sourceMappingURL=notify.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.jsx","sourceRoot":"","sources":["../src/notify.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import * as React from 'react';
2
+ export declare function AiAssistantSettingsSection(): React.ReactElement;
3
+ //# sourceMappingURL=ai-assistant-settings-section.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-assistant-settings-section.d.ts","sourceRoot":"","sources":["../../src/pages/ai-assistant-settings-section.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAU9B,wBAAgB,0BAA0B,IAAI,KAAK,CAAC,YAAY,CA4J/D"}
@@ -0,0 +1,126 @@
1
+ import * as React from 'react';
2
+ import { useMutation, useQuery } from '@tanstack/react-query';
3
+ import { Badge, Button, Input, Label, Switch, Textarea } from '@modern-admin/ui';
4
+ import { Bot, KeyRound, Save } from 'lucide-react';
5
+ import { useAdminClient } from '../provider.js';
6
+ import { useNotify } from '../notify.js';
7
+ import { useI18n } from '../i18n.js';
8
+ import { SettingsCard } from './settings-shared.js';
9
+ export function AiAssistantSettingsSection() {
10
+ const client = useAdminClient();
11
+ const notify = useNotify();
12
+ const { t } = useI18n();
13
+ const settings = useQuery({
14
+ queryKey: ['modern-admin', 'ai-assistant', 'settings'],
15
+ queryFn: () => client.getAiAssistantSettings(),
16
+ });
17
+ const [form, setForm] = React.useState({
18
+ enabled: true,
19
+ model: 'google/gemini-3.1-flash-lite-preview',
20
+ apiKey: '',
21
+ systemPrompt: '',
22
+ });
23
+ React.useEffect(() => {
24
+ if (!settings.data)
25
+ return;
26
+ setForm({
27
+ enabled: settings.data.enabled,
28
+ model: settings.data.model,
29
+ apiKey: '',
30
+ systemPrompt: settings.data.systemPrompt,
31
+ });
32
+ }, [settings.data]);
33
+ const save = useMutation({
34
+ mutationFn: async () => client.updateAiAssistantSettings({
35
+ enabled: form.enabled,
36
+ model: form.model,
37
+ ...(form.apiKey.trim() ? { apiKey: form.apiKey.trim() } : {}),
38
+ systemPrompt: form.systemPrompt,
39
+ }),
40
+ onSuccess: () => {
41
+ settings.refetch();
42
+ setForm((prev) => ({ ...prev, apiKey: '' }));
43
+ notify.success({ message: t('aiAssistant:settings.saved') });
44
+ },
45
+ onError: (err) => {
46
+ notify.error({ message: err instanceof Error ? err.message : String(err) });
47
+ },
48
+ });
49
+ if (settings.isLoading) {
50
+ return <div className="py-8 text-sm text-muted-foreground">{t('common:loading')}</div>;
51
+ }
52
+ if (settings.error) {
53
+ return (<div className="rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive">
54
+ {settings.error instanceof Error ? settings.error.message : String(settings.error)}
55
+ </div>);
56
+ }
57
+ const data = settings.data;
58
+ if (!data) {
59
+ return <div className="py-8 text-sm text-muted-foreground">{t('aiAssistant:settings.empty')}</div>;
60
+ }
61
+ return (<div className="flex flex-col gap-4">
62
+ <SettingsCard icon={Bot} title={t('aiAssistant:settings.title')} description={t('aiAssistant:settings.description')} bodyClassName="space-y-4">
63
+ <div className="flex flex-wrap items-center gap-2">
64
+ <Badge variant={data.enabled ? 'secondary' : 'outline'}>
65
+ {data.enabled ? t('aiAssistant:settings.enabled') : t('aiAssistant:settings.disabled')}
66
+ </Badge>
67
+ <Badge variant={data.configured ? 'secondary' : 'outline'}>
68
+ {data.configured ? t('aiAssistant:settings.configured') : t('aiAssistant:settings.apiKeyRequired')}
69
+ </Badge>
70
+ <Badge variant="outline">{t('aiAssistant:settings.readOnly')}</Badge>
71
+ <Badge variant="outline">{t('aiAssistant:settings.provider', { provider: data.provider })}</Badge>
72
+ </div>
73
+
74
+ <div className="grid gap-4 sm:grid-cols-2">
75
+ <div className="flex items-center justify-between rounded-lg border border-border p-3">
76
+ <div className="space-y-1">
77
+ <Label htmlFor="ai-assistant-enabled">{t('aiAssistant:settings.enableLabel')}</Label>
78
+ <p className="text-xs text-muted-foreground">
79
+ {t('aiAssistant:settings.enableHint')}
80
+ </p>
81
+ </div>
82
+ <Switch id="ai-assistant-enabled" checked={form.enabled} disabled={!data.canManage || save.isPending} onCheckedChange={(enabled) => setForm((prev) => ({ ...prev, enabled }))}/>
83
+ </div>
84
+
85
+ <div className="space-y-1.5">
86
+ <Label htmlFor="ai-assistant-model">{t('aiAssistant:settings.modelLabel')}</Label>
87
+ <Input id="ai-assistant-model" value={form.model} disabled={!data.canManage || save.isPending} onChange={(e) => setForm((prev) => ({ ...prev, model: e.target.value }))} placeholder="google/gemini-3.1-flash-lite-preview"/>
88
+ </div>
89
+ </div>
90
+
91
+ <div className="space-y-1.5">
92
+ <Label htmlFor="ai-assistant-api-key" className="flex items-center gap-2">
93
+ <KeyRound className="size-4"/>
94
+ {t('aiAssistant:settings.apiKeyLabel')}
95
+ </Label>
96
+ <Input id="ai-assistant-api-key" type="password" value={form.apiKey} disabled={!data.canManage || save.isPending} onChange={(e) => setForm((prev) => ({ ...prev, apiKey: e.target.value }))} placeholder={data.maskedApiKey ?? 'sk-or-v1-...'}/>
97
+ <p className="text-xs text-muted-foreground">
98
+ {t('aiAssistant:settings.apiKeyHint')}
99
+ </p>
100
+ </div>
101
+
102
+ <div className="space-y-1.5">
103
+ <Label htmlFor="ai-assistant-system-prompt">{t('aiAssistant:settings.systemPromptLabel')}</Label>
104
+ <Textarea id="ai-assistant-system-prompt" value={form.systemPrompt} disabled={!data.canManage || save.isPending} onChange={(e) => setForm((prev) => ({ ...prev, systemPrompt: e.target.value }))} rows={8} placeholder={t('aiAssistant:settings.systemPromptPlaceholder')}/>
105
+ </div>
106
+
107
+ <div className="flex items-center justify-between gap-3 rounded-lg border border-border p-3 text-sm">
108
+ <div>
109
+ <div className="font-medium">{t('aiAssistant:settings.accessTitle')}</div>
110
+ <div className="text-muted-foreground">
111
+ {t('aiAssistant:settings.accessDescription')}
112
+ </div>
113
+ </div>
114
+ <Badge variant="outline">{t('aiAssistant:settings.futureToolsReady')}</Badge>
115
+ </div>
116
+
117
+ <div className="flex justify-end">
118
+ <Button onClick={() => save.mutate()} disabled={!data.canManage || save.isPending || !form.model.trim()}>
119
+ <Save className="size-4"/>
120
+ {save.isPending ? t('aiAssistant:settings.saving') : t('aiAssistant:settings.save')}
121
+ </Button>
122
+ </div>
123
+ </SettingsCard>
124
+ </div>);
125
+ }
126
+ //# sourceMappingURL=ai-assistant-settings-section.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-assistant-settings-section.jsx","sourceRoot":"","sources":["../../src/pages/ai-assistant-settings-section.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAChF,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,MAAM,UAAU,0BAA0B;IACxC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;IAC/B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAA;IACvB,MAAM,QAAQ,GAAG,QAAQ,CAAC;QACxB,QAAQ,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,UAAU,CAAC;QACtD,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,sBAAsB,EAAE;KAC/C,CAAC,CAAA;IACF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;QACrC,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,sCAAsC;QAC7C,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,EAAE;KACjB,CAAC,CAAA;IAEF,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,QAAQ,CAAC,IAAI;YAAE,OAAM;QAC1B,OAAO,CAAC;YACN,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO;YAC9B,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK;YAC1B,MAAM,EAAE,EAAE;YACV,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY;SACzC,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;IAEnB,MAAM,IAAI,GAAG,WAAW,CAAC;QACvB,UAAU,EAAE,KAAK,IAAkC,EAAE,CACnD,MAAM,CAAC,yBAAyB,CAAC;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC;QACJ,SAAS,EAAE,GAAG,EAAE;YACd,QAAQ,CAAC,OAAO,EAAE,CAAA;YAClB,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;YAC5C,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAA;QAC9D,CAAC;QACD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACf,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC7E,CAAC;KACF,CAAC,CAAA;IAEF,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACxF,CAAC;IAED,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,CACL,CAAC,GAAG,CAAC,SAAS,CAAC,wFAAwF,CACrG;QAAA,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CACpF;MAAA,EAAE,GAAG,CAAC,CACP,CAAA;IACH,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAA;IAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACpG,CAAC;IAED,OAAO,CACL,CAAC,GAAG,CAAC,SAAS,CAAC,qBAAqB,CAClC;MAAA,CAAC,YAAY,CACX,IAAI,CAAC,CAAC,GAAG,CAAC,CACV,KAAK,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CACvC,WAAW,CAAC,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CACnD,aAAa,CAAC,WAAW,CAEzB;QAAA,CAAC,GAAG,CAAC,SAAS,CAAC,mCAAmC,CAChD;UAAA,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CACrD;YAAA,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,+BAA+B,CAAC,CACxF;UAAA,EAAE,KAAK,CACP;UAAA,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CACxD;YAAA,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,qCAAqC,CAAC,CACpG;UAAA,EAAE,KAAK,CACP;UAAA,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,EAAE,KAAK,CACpE;UAAA,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,+BAA+B,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,CACnG;QAAA,EAAE,GAAG,CAEL;;QAAA,CAAC,GAAG,CAAC,SAAS,CAAC,2BAA2B,CACxC;UAAA,CAAC,GAAG,CAAC,SAAS,CAAC,uEAAuE,CACpF;YAAA,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CACxB;cAAA,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,EAAE,KAAK,CACpF;cAAA,CAAC,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAC1C;gBAAA,CAAC,CAAC,CAAC,iCAAiC,CAAC,CACvC;cAAA,EAAE,CAAC,CACL;YAAA,EAAE,GAAG,CACL;YAAA,CAAC,MAAM,CACL,EAAE,CAAC,sBAAsB,CACzB,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CACtB,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,CAC5C,eAAe,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAE5E;UAAA,EAAE,GAAG,CAEL;;UAAA,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAC1B;YAAA,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,EAAE,KAAK,CACjF;YAAA,CAAC,KAAK,CACJ,EAAE,CAAC,oBAAoB,CACvB,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAClB,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,CAC5C,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CACzE,WAAW,CAAC,sCAAsC,EAEtD;UAAA,EAAE,GAAG,CACP;QAAA,EAAE,GAAG,CAEL;;QAAA,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAC1B;UAAA,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAC,SAAS,CAAC,yBAAyB,CACvE;YAAA,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAC5B;YAAA,CAAC,CAAC,CAAC,kCAAkC,CAAC,CACxC;UAAA,EAAE,KAAK,CACP;UAAA,CAAC,KAAK,CACJ,EAAE,CAAC,sBAAsB,CACzB,IAAI,CAAC,UAAU,CACf,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CACnB,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,CAC5C,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAC1E,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,cAAc,CAAC,EAEnD;UAAA,CAAC,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAC1C;YAAA,CAAC,CAAC,CAAC,iCAAiC,CAAC,CACvC;UAAA,EAAE,CAAC,CACL;QAAA,EAAE,GAAG,CAEL;;QAAA,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAC1B;UAAA,CAAC,KAAK,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,EAAE,KAAK,CAChG;UAAA,CAAC,QAAQ,CACP,EAAE,CAAC,4BAA4B,CAC/B,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CACzB,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,CAC5C,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAChF,IAAI,CAAC,CAAC,CAAC,CAAC,CACR,WAAW,CAAC,CAAC,CAAC,CAAC,8CAA8C,CAAC,CAAC,EAEnE;QAAA,EAAE,GAAG,CAEL;;QAAA,CAAC,GAAG,CAAC,SAAS,CAAC,qFAAqF,CAClG;UAAA,CAAC,GAAG,CACF;YAAA,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,EAAE,GAAG,CACzE;YAAA,CAAC,GAAG,CAAC,SAAS,CAAC,uBAAuB,CACpC;cAAA,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAC9C;YAAA,EAAE,GAAG,CACP;UAAA,EAAE,GAAG,CACL;UAAA,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC,EAAE,KAAK,CAC9E;QAAA,EAAE,GAAG,CAEL;;QAAA,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAC/B;UAAA,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CACtG;YAAA,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EACxB;YAAA,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,CACrF;UAAA,EAAE,MAAM,CACV;QAAA,EAAE,GAAG,CACP;MAAA,EAAE,YAAY,CAChB;IAAA,EAAE,GAAG,CAAC,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import * as React from 'react';
2
+ export declare function AuditLogPage(): React.ReactElement;
3
+ //# sourceMappingURL=audit-log-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-log-page.d.ts","sourceRoot":"","sources":["../../src/pages/audit-log-page.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AA4I9B,wBAAgB,YAAY,IAAI,KAAK,CAAC,YAAY,CAmLjD"}