@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.
- package/dist/action-guard.d.ts +13 -0
- package/dist/action-guard.d.ts.map +1 -0
- package/dist/action-guard.js +15 -0
- package/dist/action-guard.js.map +1 -0
- package/dist/action-menu.d.ts +17 -0
- package/dist/action-menu.d.ts.map +1 -0
- package/dist/action-menu.jsx +80 -0
- package/dist/action-menu.jsx.map +1 -0
- package/dist/admin-app.d.ts +23 -0
- package/dist/admin-app.d.ts.map +1 -0
- package/dist/admin-app.jsx +407 -0
- package/dist/admin-app.jsx.map +1 -0
- package/dist/admin-router.d.ts +29 -0
- package/dist/admin-router.d.ts.map +1 -0
- package/dist/admin-router.jsx +215 -0
- package/dist/admin-router.jsx.map +1 -0
- package/dist/breadcrumbs.d.ts +17 -0
- package/dist/breadcrumbs.d.ts.map +1 -0
- package/dist/breadcrumbs.jsx +40 -0
- package/dist/breadcrumbs.jsx.map +1 -0
- package/dist/client.d.ts +526 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +582 -0
- package/dist/client.js.map +1 -0
- package/dist/component-loader.d.ts +10 -0
- package/dist/component-loader.d.ts.map +1 -0
- package/dist/component-loader.js +23 -0
- package/dist/component-loader.js.map +1 -0
- package/dist/components/ai-assistant-widget.d.ts +3 -0
- package/dist/components/ai-assistant-widget.d.ts.map +1 -0
- package/dist/components/ai-assistant-widget.jsx +390 -0
- package/dist/components/ai-assistant-widget.jsx.map +1 -0
- package/dist/components/ai-fill-dialog.d.ts +9 -0
- package/dist/components/ai-fill-dialog.d.ts.map +1 -0
- package/dist/components/ai-fill-dialog.jsx +105 -0
- package/dist/components/ai-fill-dialog.jsx.map +1 -0
- package/dist/components/chart-builder-dialog.d.ts +10 -0
- package/dist/components/chart-builder-dialog.d.ts.map +1 -0
- package/dist/components/chart-builder-dialog.jsx +433 -0
- package/dist/components/chart-builder-dialog.jsx.map +1 -0
- package/dist/components/chart-widget.d.ts +12 -0
- package/dist/components/chart-widget.d.ts.map +1 -0
- package/dist/components/chart-widget.jsx +365 -0
- package/dist/components/chart-widget.jsx.map +1 -0
- package/dist/components/global-search-dialog.d.ts +7 -0
- package/dist/components/global-search-dialog.d.ts.map +1 -0
- package/dist/components/global-search-dialog.jsx +187 -0
- package/dist/components/global-search-dialog.jsx.map +1 -0
- package/dist/components/group-settings-dialog.d.ts +13 -0
- package/dist/components/group-settings-dialog.d.ts.map +1 -0
- package/dist/components/group-settings-dialog.jsx +53 -0
- package/dist/components/group-settings-dialog.jsx.map +1 -0
- package/dist/components/move-chart-dialog.d.ts +18 -0
- package/dist/components/move-chart-dialog.d.ts.map +1 -0
- package/dist/components/move-chart-dialog.jsx +68 -0
- package/dist/components/move-chart-dialog.jsx.map +1 -0
- package/dist/components/reference-multi-table-dialog.d.ts +12 -0
- package/dist/components/reference-multi-table-dialog.d.ts.map +1 -0
- package/dist/components/reference-multi-table-dialog.jsx +126 -0
- package/dist/components/reference-multi-table-dialog.jsx.map +1 -0
- package/dist/components/related-records-tabs.d.ts +8 -0
- package/dist/components/related-records-tabs.d.ts.map +1 -0
- package/dist/components/related-records-tabs.jsx +75 -0
- package/dist/components/related-records-tabs.jsx.map +1 -0
- package/dist/components/revisions-button.d.ts +7 -0
- package/dist/components/revisions-button.d.ts.map +1 -0
- package/dist/components/revisions-button.jsx +152 -0
- package/dist/components/revisions-button.jsx.map +1 -0
- package/dist/components/wizard-form.d.ts +43 -0
- package/dist/components/wizard-form.d.ts.map +1 -0
- package/dist/components/wizard-form.jsx +136 -0
- package/dist/components/wizard-form.jsx.map +1 -0
- package/dist/dashboard/time-series.d.ts +20 -0
- package/dist/dashboard/time-series.d.ts.map +1 -0
- package/dist/dashboard/time-series.js +108 -0
- package/dist/dashboard/time-series.js.map +1 -0
- package/dist/dialogs.d.ts +35 -0
- package/dist/dialogs.d.ts.map +1 -0
- package/dist/dialogs.jsx +152 -0
- package/dist/dialogs.jsx.map +1 -0
- package/dist/export.d.ts +39 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +114 -0
- package/dist/export.js.map +1 -0
- package/dist/extension-registry.d.ts +122 -0
- package/dist/extension-registry.d.ts.map +1 -0
- package/dist/extension-registry.js +93 -0
- package/dist/extension-registry.js.map +1 -0
- package/dist/header-controls.d.ts +4 -0
- package/dist/header-controls.d.ts.map +1 -0
- package/dist/header-controls.jsx +70 -0
- package/dist/header-controls.jsx.map +1 -0
- package/dist/hooks.d.ts +104 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +374 -0
- package/dist/hooks.js.map +1 -0
- package/dist/hotkey-help.d.ts +3 -0
- package/dist/hotkey-help.d.ts.map +1 -0
- package/dist/hotkey-help.jsx +32 -0
- package/dist/hotkey-help.jsx.map +1 -0
- package/dist/hotkey-registry.d.ts +18 -0
- package/dist/hotkey-registry.d.ts.map +1 -0
- package/dist/hotkey-registry.jsx +34 -0
- package/dist/hotkey-registry.jsx.map +1 -0
- package/dist/i18n.d.ts +74 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.jsx +127 -0
- package/dist/i18n.jsx.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/notify.d.ts +41 -0
- package/dist/notify.d.ts.map +1 -0
- package/dist/notify.jsx +58 -0
- package/dist/notify.jsx.map +1 -0
- package/dist/pages/ai-assistant-settings-section.d.ts +3 -0
- package/dist/pages/ai-assistant-settings-section.d.ts.map +1 -0
- package/dist/pages/ai-assistant-settings-section.jsx +126 -0
- package/dist/pages/ai-assistant-settings-section.jsx.map +1 -0
- package/dist/pages/audit-log-page.d.ts +3 -0
- package/dist/pages/audit-log-page.d.ts.map +1 -0
- package/dist/pages/audit-log-page.jsx +354 -0
- package/dist/pages/audit-log-page.jsx.map +1 -0
- package/dist/pages/edit-page.d.ts +7 -0
- package/dist/pages/edit-page.d.ts.map +1 -0
- package/dist/pages/edit-page.jsx +614 -0
- package/dist/pages/edit-page.jsx.map +1 -0
- package/dist/pages/export-dialog.d.ts +11 -0
- package/dist/pages/export-dialog.d.ts.map +1 -0
- package/dist/pages/export-dialog.jsx +102 -0
- package/dist/pages/export-dialog.jsx.map +1 -0
- package/dist/pages/home-page.d.ts +3 -0
- package/dist/pages/home-page.d.ts.map +1 -0
- package/dist/pages/home-page.jsx +211 -0
- package/dist/pages/home-page.jsx.map +1 -0
- package/dist/pages/list-page.d.ts +42 -0
- package/dist/pages/list-page.d.ts.map +1 -0
- package/dist/pages/list-page.jsx +1596 -0
- package/dist/pages/list-page.jsx.map +1 -0
- package/dist/pages/login-page.d.ts +11 -0
- package/dist/pages/login-page.d.ts.map +1 -0
- package/dist/pages/login-page.jsx +157 -0
- package/dist/pages/login-page.jsx.map +1 -0
- package/dist/pages/settings-page.d.ts +5 -0
- package/dist/pages/settings-page.d.ts.map +1 -0
- package/dist/pages/settings-page.jsx +787 -0
- package/dist/pages/settings-page.jsx.map +1 -0
- package/dist/pages/settings-shared.d.ts +51 -0
- package/dist/pages/settings-shared.d.ts.map +1 -0
- package/dist/pages/settings-shared.jsx +66 -0
- package/dist/pages/settings-shared.jsx.map +1 -0
- package/dist/pages/show-page.d.ts +7 -0
- package/dist/pages/show-page.d.ts.map +1 -0
- package/dist/pages/show-page.jsx +147 -0
- package/dist/pages/show-page.jsx.map +1 -0
- package/dist/pages/wizard-create-page.d.ts +14 -0
- package/dist/pages/wizard-create-page.d.ts.map +1 -0
- package/dist/pages/wizard-create-page.jsx +106 -0
- package/dist/pages/wizard-create-page.jsx.map +1 -0
- package/dist/property-renderer.d.ts +8 -0
- package/dist/property-renderer.d.ts.map +1 -0
- package/dist/property-renderer.jsx +690 -0
- package/dist/property-renderer.jsx.map +1 -0
- package/dist/provider.d.ts +20 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.jsx +32 -0
- package/dist/provider.jsx.map +1 -0
- package/dist/realtime.d.ts +22 -0
- package/dist/realtime.d.ts.map +1 -0
- package/dist/realtime.js +38 -0
- package/dist/realtime.js.map +1 -0
- package/dist/reference.d.ts +52 -0
- package/dist/reference.d.ts.map +1 -0
- package/dist/reference.jsx +224 -0
- package/dist/reference.jsx.map +1 -0
- package/dist/relations.d.ts +11 -0
- package/dist/relations.d.ts.map +1 -0
- package/dist/relations.js +36 -0
- package/dist/relations.js.map +1 -0
- package/dist/router.d.ts +82 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.jsx +187 -0
- package/dist/router.jsx.map +1 -0
- package/dist/show-when.d.ts +7 -0
- package/dist/show-when.d.ts.map +1 -0
- package/dist/show-when.js +77 -0
- package/dist/show-when.js.map +1 -0
- package/dist/types.d.ts +194 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +18 -0
- package/dist/types.js.map +1 -0
- package/dist/use-dashboard-charts.d.ts +93 -0
- package/dist/use-dashboard-charts.d.ts.map +1 -0
- package/dist/use-dashboard-charts.js +263 -0
- package/dist/use-dashboard-charts.js.map +1 -0
- package/dist/use-hotkey.d.ts +17 -0
- package/dist/use-hotkey.d.ts.map +1 -0
- package/dist/use-hotkey.js +103 -0
- package/dist/use-hotkey.js.map +1 -0
- package/dist/user-directory.d.ts +18 -0
- package/dist/user-directory.d.ts.map +1 -0
- package/dist/user-directory.js +51 -0
- package/dist/user-directory.js.map +1 -0
- package/dist/validation.d.ts +22 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +338 -0
- package/dist/validation.js.map +1 -0
- package/package.json +59 -0
- package/src/action-guard.ts +20 -0
- package/src/action-menu.tsx +161 -0
- package/src/admin-app.tsx +630 -0
- package/src/admin-router.tsx +273 -0
- package/src/breadcrumbs.tsx +75 -0
- package/src/client.ts +1093 -0
- package/src/component-loader.ts +33 -0
- package/src/components/ai-assistant-widget.tsx +565 -0
- package/src/components/ai-fill-dialog.tsx +143 -0
- package/src/components/chart-builder-dialog.tsx +618 -0
- package/src/components/chart-widget.tsx +654 -0
- package/src/components/global-search-dialog.tsx +272 -0
- package/src/components/group-settings-dialog.tsx +93 -0
- package/src/components/move-chart-dialog.tsx +130 -0
- package/src/components/reference-multi-table-dialog.tsx +196 -0
- package/src/components/related-records-tabs.tsx +130 -0
- package/src/components/revisions-button.tsx +237 -0
- package/src/components/wizard-form.tsx +302 -0
- package/src/dashboard/time-series.ts +125 -0
- package/src/dialogs.tsx +265 -0
- package/src/export.ts +140 -0
- package/src/extension-registry.ts +195 -0
- package/src/header-controls.tsx +125 -0
- package/src/hooks.ts +509 -0
- package/src/hotkey-help.tsx +56 -0
- package/src/hotkey-registry.tsx +60 -0
- package/src/i18n.tsx +267 -0
- package/src/index.ts +192 -0
- package/src/notify.tsx +94 -0
- package/src/pages/ai-assistant-settings-section.tsx +167 -0
- package/src/pages/audit-log-page.tsx +580 -0
- package/src/pages/edit-page.tsx +743 -0
- package/src/pages/export-dialog.tsx +154 -0
- package/src/pages/home-page.tsx +318 -0
- package/src/pages/list-page.tsx +2645 -0
- package/src/pages/login-page.tsx +242 -0
- package/src/pages/settings-page.tsx +1143 -0
- package/src/pages/settings-shared.tsx +134 -0
- package/src/pages/show-page.tsx +223 -0
- package/src/pages/wizard-create-page.tsx +164 -0
- package/src/property-renderer.tsx +1143 -0
- package/src/provider.tsx +70 -0
- package/src/realtime.ts +55 -0
- package/src/reference.tsx +386 -0
- package/src/relations.ts +55 -0
- package/src/router.tsx +211 -0
- package/src/show-when.ts +76 -0
- package/src/types.ts +198 -0
- package/src/use-dashboard-charts.ts +362 -0
- package/src/use-hotkey.ts +128 -0
- package/src/user-directory.ts +56 -0
- package/src/validation.ts +361 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ActionDescriptor } from './types.js';
|
|
2
|
+
import type { ConfirmOptions, DialogsApi } from './dialogs.js';
|
|
3
|
+
/**
|
|
4
|
+
* If `action.guard` is set, shows a confirm dialog with that text as the
|
|
5
|
+
* description before proceeding. Returns `true` if the action should run
|
|
6
|
+
* (no guard configured, or user clicked Confirm), `false` if cancelled.
|
|
7
|
+
*
|
|
8
|
+
* Usage at an invoke call-site:
|
|
9
|
+
* if (!await confirmGuard(action, dialogs)) return
|
|
10
|
+
* invoke.mutate(...)
|
|
11
|
+
*/
|
|
12
|
+
export declare function confirmGuard(action: Pick<ActionDescriptor, 'guard'>, dialogs: Pick<DialogsApi, 'confirm'>, extra?: Omit<ConfirmOptions, 'description'>): Promise<boolean>;
|
|
13
|
+
//# sourceMappingURL=action-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-guard.d.ts","sourceRoot":"","sources":["../src/action-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAE9D;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,EACvC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,EACpC,KAAK,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,GAC1C,OAAO,CAAC,OAAO,CAAC,CAGlB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* If `action.guard` is set, shows a confirm dialog with that text as the
|
|
3
|
+
* description before proceeding. Returns `true` if the action should run
|
|
4
|
+
* (no guard configured, or user clicked Confirm), `false` if cancelled.
|
|
5
|
+
*
|
|
6
|
+
* Usage at an invoke call-site:
|
|
7
|
+
* if (!await confirmGuard(action, dialogs)) return
|
|
8
|
+
* invoke.mutate(...)
|
|
9
|
+
*/
|
|
10
|
+
export async function confirmGuard(action, dialogs, extra) {
|
|
11
|
+
if (!action.guard)
|
|
12
|
+
return true;
|
|
13
|
+
return dialogs.confirm({ description: action.guard, ...extra });
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=action-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-guard.js","sourceRoot":"","sources":["../src/action-guard.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAuC,EACvC,OAAoC,EACpC,KAA2C;IAE3C,IAAI,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IAC9B,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC,CAAA;AACjE,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { ActionDescriptor } from './types.js';
|
|
3
|
+
export interface ActionMenuProps {
|
|
4
|
+
actions: ActionDescriptor[];
|
|
5
|
+
onAction(action: ActionDescriptor): void;
|
|
6
|
+
t: (key: string, params?: Record<string, string | number>) => string;
|
|
7
|
+
trigger?: React.ReactElement;
|
|
8
|
+
menuLabel?: string;
|
|
9
|
+
align?: 'start' | 'center' | 'end';
|
|
10
|
+
}
|
|
11
|
+
export declare function ActionMenuItems({ actions, onAction, }: {
|
|
12
|
+
actions: ActionDescriptor[];
|
|
13
|
+
onAction(action: ActionDescriptor): void;
|
|
14
|
+
}): React.ReactElement | null;
|
|
15
|
+
export declare function ActionMenu({ actions, onAction, t, trigger, menuLabel, align, }: ActionMenuProps): React.ReactElement | null;
|
|
16
|
+
export declare function MoreActionsMenu({ actions, onAction, t, menuLabel, }: Omit<ActionMenuProps, 'trigger' | 'align'>): React.ReactElement | null;
|
|
17
|
+
//# sourceMappingURL=action-menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-menu.d.ts","sourceRoot":"","sources":["../src/action-menu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAe9B,OAAO,KAAK,EAAE,gBAAgB,EAAe,MAAM,YAAY,CAAA;AAY/D,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAA;IACxC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,CAAA;IACpE,OAAO,CAAC,EAAE,KAAK,CAAC,YAAY,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAA;CACnC;AA+DD,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACP,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAA;CACzC,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAI5B;AAED,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,QAAQ,EACR,CAAC,EACD,OAAO,EACP,SAAS,EACT,KAAa,GACd,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAqB7C;AAED,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACP,QAAQ,EACR,CAAC,EACD,SAAS,GACV,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAgBxE"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from '@modern-admin/ui';
|
|
3
|
+
import { MoreHorizontal, Zap } from 'lucide-react';
|
|
4
|
+
const getActionLabel = (action) => typeof action.custom?.label === 'string' ? action.custom.label : action.name;
|
|
5
|
+
const buildActionMenuTree = (actions) => {
|
|
6
|
+
const root = [];
|
|
7
|
+
const groups = new Map();
|
|
8
|
+
const ensureGroup = (target, path, depth) => {
|
|
9
|
+
if (depth >= path.length)
|
|
10
|
+
return target;
|
|
11
|
+
const segment = path[depth];
|
|
12
|
+
const key = path
|
|
13
|
+
.slice(0, depth + 1)
|
|
14
|
+
.map((item) => item.name)
|
|
15
|
+
.join('>');
|
|
16
|
+
let group = groups.get(key);
|
|
17
|
+
if (!group) {
|
|
18
|
+
group = { key, group: segment, items: [] };
|
|
19
|
+
groups.set(key, group);
|
|
20
|
+
target.push({ kind: 'group', group });
|
|
21
|
+
}
|
|
22
|
+
return ensureGroup(group.items, path, depth + 1);
|
|
23
|
+
};
|
|
24
|
+
for (const action of actions) {
|
|
25
|
+
const nesting = action.nesting ?? [];
|
|
26
|
+
const target = nesting.length > 0 ? ensureGroup(root, nesting, 0) : root;
|
|
27
|
+
target.push({ kind: 'action', action });
|
|
28
|
+
}
|
|
29
|
+
return root;
|
|
30
|
+
};
|
|
31
|
+
const renderNodes = (nodes, onAction) => nodes.map((node) => {
|
|
32
|
+
if (node.kind === 'action') {
|
|
33
|
+
return (<DropdownMenuItem key={node.action.name} onSelect={() => onAction(node.action)}>
|
|
34
|
+
<Zap className="size-4"/> {getActionLabel(node.action)}
|
|
35
|
+
</DropdownMenuItem>);
|
|
36
|
+
}
|
|
37
|
+
return (<DropdownMenuSub key={node.group.key}>
|
|
38
|
+
<DropdownMenuSubTrigger>
|
|
39
|
+
{node.group.group.name}
|
|
40
|
+
</DropdownMenuSubTrigger>
|
|
41
|
+
<DropdownMenuPortal>
|
|
42
|
+
<DropdownMenuSubContent>
|
|
43
|
+
{renderNodes(node.group.items, onAction)}
|
|
44
|
+
</DropdownMenuSubContent>
|
|
45
|
+
</DropdownMenuPortal>
|
|
46
|
+
</DropdownMenuSub>);
|
|
47
|
+
});
|
|
48
|
+
export function ActionMenuItems({ actions, onAction, }) {
|
|
49
|
+
const nodes = React.useMemo(() => buildActionMenuTree(actions), [actions]);
|
|
50
|
+
if (nodes.length === 0)
|
|
51
|
+
return null;
|
|
52
|
+
return <>{renderNodes(nodes, onAction)}</>;
|
|
53
|
+
}
|
|
54
|
+
export function ActionMenu({ actions, onAction, t, trigger, menuLabel, align = 'end', }) {
|
|
55
|
+
const nodes = React.useMemo(() => buildActionMenuTree(actions), [actions]);
|
|
56
|
+
if (nodes.length === 0)
|
|
57
|
+
return null;
|
|
58
|
+
return (<DropdownMenu>
|
|
59
|
+
<DropdownMenuTrigger asChild>
|
|
60
|
+
{trigger ?? (<Button variant="outline" size="sm">
|
|
61
|
+
<Zap className="size-4"/>
|
|
62
|
+
{t('common:actions')}
|
|
63
|
+
</Button>)}
|
|
64
|
+
</DropdownMenuTrigger>
|
|
65
|
+
<DropdownMenuContent align={align}>
|
|
66
|
+
<DropdownMenuLabel>{menuLabel ?? t('common:actions')}</DropdownMenuLabel>
|
|
67
|
+
<DropdownMenuSeparator />
|
|
68
|
+
<ActionMenuItems actions={actions} onAction={onAction}/>
|
|
69
|
+
</DropdownMenuContent>
|
|
70
|
+
</DropdownMenu>);
|
|
71
|
+
}
|
|
72
|
+
export function MoreActionsMenu({ actions, onAction, t, menuLabel, }) {
|
|
73
|
+
if (actions.length === 0)
|
|
74
|
+
return null;
|
|
75
|
+
return (<ActionMenu actions={actions} onAction={onAction} t={t} menuLabel={menuLabel} trigger={(<Button variant="ghost" size="icon" className="h-8 w-8">
|
|
76
|
+
<MoreHorizontal className="size-4"/>
|
|
77
|
+
<span className="sr-only">{t('common:openMenu')}</span>
|
|
78
|
+
</Button>)}/>);
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=action-menu.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-menu.jsx","sourceRoot":"","sources":["../src/action-menu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export interface AdminAppProps {
|
|
3
|
+
/** Optional helper line shown under the title on the login screen — e.g.
|
|
4
|
+
* demo credentials. */
|
|
5
|
+
loginHint?: React.ReactNode;
|
|
6
|
+
/**
|
|
7
|
+
* URL prefix where the SPA is mounted (e.g. `/admin`). Injected
|
|
8
|
+
* automatically from `window.__MODERN_ADMIN__.basePath` by the standalone
|
|
9
|
+
* bundle. Drives the router basepath so all navigation and deep-link
|
|
10
|
+
* refreshes stay under the correct prefix. Defaults to `''` (root mount).
|
|
11
|
+
*/
|
|
12
|
+
basePath?: string;
|
|
13
|
+
/**
|
|
14
|
+
* When true, the sidebar resource list appends the raw resource id in
|
|
15
|
+
* parentheses next to the localized label (e.g. "Posts (posts)") when
|
|
16
|
+
* the label differs from the id. Defaults to `false` to keep the
|
|
17
|
+
* sidebar tidy. The home-page resource tiles and selector dropdowns
|
|
18
|
+
* (chart builder, etc.) always render both — they are not affected.
|
|
19
|
+
*/
|
|
20
|
+
showSidebarResourceIds?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function AdminApp({ loginHint, basePath, showSidebarResourceIds, }?: AdminAppProps): React.ReactElement;
|
|
23
|
+
//# sourceMappingURL=admin-app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-app.d.ts","sourceRoot":"","sources":["../src/admin-app.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AA8f9B,MAAM,WAAW,aAAa;IAC5B;4BACwB;IACxB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC3B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;OAMG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAA;CACjC;AA6ED,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,QAAQ,EACR,sBAAsB,GACvB,GAAE,aAAkB,GAAG,KAAK,CAAC,YAAY,CAezC"}
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
// Top-level CRUD shell. Composes provider + router + sidebar + content.
|
|
2
|
+
// Sidebar is the shadcn `<Sidebar>` recipe — collapsible to icons on
|
|
3
|
+
// desktop and rendered as a Sheet on mobile via the `useSidebar` context.
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { Avatar, AvatarFallback, AvatarImage, Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupLabel, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarProvider, cn, useSidebar, } from '@modern-admin/ui';
|
|
6
|
+
import { BookOpen, ChevronDown, ChevronLeft, Database, FileText, FolderOpen, FolderTree, Home, Image, LayoutGrid, Loader2, LogOut, History, Mail, Menu, MessageSquare, Package, Search, Settings, ShoppingCart, Tag, User, Users, } from 'lucide-react';
|
|
7
|
+
import { getSidebarExtensions } from './extension-registry.js';
|
|
8
|
+
import { useAdminConfig, useCurrentUser, useFeatures, useLogout, useResources } from './hooks.js';
|
|
9
|
+
import { LoginPage } from './pages/login-page.js';
|
|
10
|
+
import { Link, useRoute, useNavigate } from './router.js';
|
|
11
|
+
import { AdminRouterProvider } from './admin-router.js';
|
|
12
|
+
import { useI18n } from './i18n.js';
|
|
13
|
+
import { LanguageSwitcher, ThemeToggle } from './header-controls.js';
|
|
14
|
+
import { NotifyToaster } from './notify.js';
|
|
15
|
+
import { DialogsProvider } from './dialogs.js';
|
|
16
|
+
import { HotkeyRegistryProvider } from './hotkey-registry.js';
|
|
17
|
+
import { HotkeyHelpButton } from './hotkey-help.js';
|
|
18
|
+
import { AiAssistantWidget } from './components/ai-assistant-widget.js';
|
|
19
|
+
import { GlobalSearchDialog } from './components/global-search-dialog.js';
|
|
20
|
+
import { useHotkey } from './use-hotkey.js';
|
|
21
|
+
const ICON_MAP = {
|
|
22
|
+
BookOpen,
|
|
23
|
+
Database,
|
|
24
|
+
FileText,
|
|
25
|
+
FolderOpen,
|
|
26
|
+
FolderTree,
|
|
27
|
+
Home,
|
|
28
|
+
Image,
|
|
29
|
+
LayoutGrid,
|
|
30
|
+
Mail,
|
|
31
|
+
MessageSquare,
|
|
32
|
+
Package,
|
|
33
|
+
Settings,
|
|
34
|
+
ShoppingCart,
|
|
35
|
+
Tag,
|
|
36
|
+
Users,
|
|
37
|
+
};
|
|
38
|
+
function NavIcon({ name, className }) {
|
|
39
|
+
const Icon = (name && ICON_MAP[name]) || Database;
|
|
40
|
+
return <Icon className={className}/>;
|
|
41
|
+
}
|
|
42
|
+
function buildNavGroups(resources) {
|
|
43
|
+
const groupMap = new Map();
|
|
44
|
+
const ungrouped = [];
|
|
45
|
+
for (const r of resources) {
|
|
46
|
+
if (r.navigation === null)
|
|
47
|
+
continue; // explicitly hidden
|
|
48
|
+
const group = r.navigation?.name ?? r.navigation?.group;
|
|
49
|
+
if (group) {
|
|
50
|
+
const list = groupMap.get(group) ?? [];
|
|
51
|
+
list.push(r);
|
|
52
|
+
groupMap.set(group, list);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
ungrouped.push(r);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const groups = Array.from(groupMap.entries()).map(([label, rs]) => ({ label, resources: rs }));
|
|
59
|
+
return { groups, ungrouped };
|
|
60
|
+
}
|
|
61
|
+
// ─── Sidebar group collapse persistence ───────────────────────────────────────
|
|
62
|
+
const SIDEBAR_GROUPS_KEY = 'sidebar:groups:collapsed';
|
|
63
|
+
function loadCollapsedGroups() {
|
|
64
|
+
if (typeof localStorage === 'undefined')
|
|
65
|
+
return new Set();
|
|
66
|
+
try {
|
|
67
|
+
const raw = localStorage.getItem(SIDEBAR_GROUPS_KEY);
|
|
68
|
+
return raw ? new Set(JSON.parse(raw)) : new Set();
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return new Set();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function saveCollapsedGroups(collapsed) {
|
|
75
|
+
if (typeof localStorage === 'undefined')
|
|
76
|
+
return;
|
|
77
|
+
try {
|
|
78
|
+
localStorage.setItem(SIDEBAR_GROUPS_KEY, JSON.stringify([...collapsed]));
|
|
79
|
+
}
|
|
80
|
+
catch { /* quota / private mode — ignore */ }
|
|
81
|
+
}
|
|
82
|
+
function isResourceActive(route, resourceId) {
|
|
83
|
+
return ((route.name === 'list' || route.name === 'show' || route.name === 'edit' || route.name === 'new') &&
|
|
84
|
+
'resourceId' in route &&
|
|
85
|
+
route.resourceId === resourceId);
|
|
86
|
+
}
|
|
87
|
+
function ResourceMenuItem({ resource, showId, }) {
|
|
88
|
+
const route = useRoute();
|
|
89
|
+
const active = isResourceActive(route, resource.id);
|
|
90
|
+
const hasAlias = resource.name !== resource.id;
|
|
91
|
+
const withId = showId && hasAlias;
|
|
92
|
+
const tooltip = withId ? `${resource.name} (${resource.id})` : resource.name;
|
|
93
|
+
return (<SidebarMenuItem>
|
|
94
|
+
<SidebarMenuButton asChild isActive={active} tooltip={tooltip}>
|
|
95
|
+
<Link to={{ name: 'list', resourceId: resource.id }}>
|
|
96
|
+
<NavIcon name={resource.navigation?.icon}/>
|
|
97
|
+
<span className="min-w-0 flex-1 truncate">
|
|
98
|
+
{resource.name}
|
|
99
|
+
{withId && (<span className="ml-0.5 text-xs opacity-60"> ({resource.id})</span>)}
|
|
100
|
+
</span>
|
|
101
|
+
</Link>
|
|
102
|
+
</SidebarMenuButton>
|
|
103
|
+
</SidebarMenuItem>);
|
|
104
|
+
}
|
|
105
|
+
// ─── Desktop collapse pill — round chevron on the right edge of the sidebar.
|
|
106
|
+
// Sits half-outside the sidebar (translate-x-1/2) and rotates the chevron
|
|
107
|
+
// when the sidebar is in icon/collapsed state. Hidden on mobile (the
|
|
108
|
+
// header burger handles that).
|
|
109
|
+
function SidebarCollapseToggle() {
|
|
110
|
+
const { state, toggleSidebar } = useSidebar();
|
|
111
|
+
const collapsed = state === 'collapsed';
|
|
112
|
+
return (<button type="button" onClick={toggleSidebar} aria-label={collapsed ? 'Expand sidebar' : 'Collapse sidebar'} className="absolute right-0 top-24 z-50 hidden h-5 w-5 translate-x-1/2 items-center justify-center rounded-full border border-border bg-card shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground md:flex">
|
|
113
|
+
<ChevronLeft className="size-3 transition-transform duration-300" style={{ transform: collapsed ? 'rotate(180deg)' : 'rotate(0deg)' }}/>
|
|
114
|
+
</button>);
|
|
115
|
+
}
|
|
116
|
+
// ─── Sidebar ─────────────────────────────────────────────────────────────────
|
|
117
|
+
function AppSidebar({ showResourceIds }) {
|
|
118
|
+
const resources = useResources();
|
|
119
|
+
const features = useFeatures();
|
|
120
|
+
const { t } = useI18n();
|
|
121
|
+
const route = useRoute();
|
|
122
|
+
const { data: config } = useAdminConfig();
|
|
123
|
+
const appName = config?.branding?.companyName ?? t('common:appName');
|
|
124
|
+
const { groups, ungrouped } = React.useMemo(() => buildNavGroups(resources), [resources]);
|
|
125
|
+
const { isMobile, setOpenMobile, state } = useSidebar();
|
|
126
|
+
const [collapsedGroups, setCollapsedGroups] = React.useState(loadCollapsedGroups);
|
|
127
|
+
const toggleGroup = React.useCallback((label) => {
|
|
128
|
+
setCollapsedGroups((prev) => {
|
|
129
|
+
const next = new Set(prev);
|
|
130
|
+
if (next.has(label))
|
|
131
|
+
next.delete(label);
|
|
132
|
+
else
|
|
133
|
+
next.add(label);
|
|
134
|
+
saveCollapsedGroups(next);
|
|
135
|
+
return next;
|
|
136
|
+
});
|
|
137
|
+
}, []);
|
|
138
|
+
// Auto-close the mobile drawer whenever the route changes (link tap).
|
|
139
|
+
const routeKey = `${route.name}:${'resourceId' in route ? route.resourceId : ''}:${'recordId' in route ? route.recordId : ''}`;
|
|
140
|
+
React.useEffect(() => {
|
|
141
|
+
if (isMobile)
|
|
142
|
+
setOpenMobile(false);
|
|
143
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
144
|
+
}, [routeKey]);
|
|
145
|
+
const homeActive = route.name === 'home';
|
|
146
|
+
const auditActive = route.name === 'audit-log';
|
|
147
|
+
return (<Sidebar collapsible="icon">
|
|
148
|
+
<SidebarHeader className="h-12 flex-row items-center gap-2 border-b border-border px-3 py-0 sm:h-14 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:px-0">
|
|
149
|
+
<Database className="size-4 shrink-0 text-primary"/>
|
|
150
|
+
<span className="truncate text-sm font-semibold group-data-[collapsible=icon]:hidden">
|
|
151
|
+
{appName}
|
|
152
|
+
</span>
|
|
153
|
+
</SidebarHeader>
|
|
154
|
+
<SidebarContent>
|
|
155
|
+
<SidebarGroup>
|
|
156
|
+
<SidebarMenu>
|
|
157
|
+
<SidebarMenuItem>
|
|
158
|
+
<SidebarMenuButton asChild isActive={homeActive} tooltip={t('common:home')}>
|
|
159
|
+
<Link to={{ name: 'home' }}>
|
|
160
|
+
<Home />
|
|
161
|
+
<span>{t('common:home')}</span>
|
|
162
|
+
</Link>
|
|
163
|
+
</SidebarMenuButton>
|
|
164
|
+
</SidebarMenuItem>
|
|
165
|
+
{features.auditLog && (<SidebarMenuItem>
|
|
166
|
+
<SidebarMenuButton asChild isActive={auditActive} tooltip={t('audit:title')}>
|
|
167
|
+
<Link to={{ name: 'audit-log' }}>
|
|
168
|
+
<History />
|
|
169
|
+
<span>{t('audit:title')}</span>
|
|
170
|
+
</Link>
|
|
171
|
+
</SidebarMenuButton>
|
|
172
|
+
</SidebarMenuItem>)}
|
|
173
|
+
{getSidebarExtensions()
|
|
174
|
+
.filter((ext) => !ext.featureGate || !!features[ext.featureGate])
|
|
175
|
+
.map((ext) => {
|
|
176
|
+
const extActive = route.name === 'extension' && route.key === ext.extensionKey;
|
|
177
|
+
return (<SidebarMenuItem key={ext.key}>
|
|
178
|
+
<SidebarMenuButton asChild isActive={extActive} tooltip={ext.label}>
|
|
179
|
+
<Link to={{ name: 'extension', key: ext.extensionKey }}>
|
|
180
|
+
<ext.icon />
|
|
181
|
+
<span>{ext.label}</span>
|
|
182
|
+
</Link>
|
|
183
|
+
</SidebarMenuButton>
|
|
184
|
+
</SidebarMenuItem>);
|
|
185
|
+
})}
|
|
186
|
+
{ungrouped.map((r) => (<ResourceMenuItem key={r.id} resource={r} showId={showResourceIds}/>))}
|
|
187
|
+
</SidebarMenu>
|
|
188
|
+
</SidebarGroup>
|
|
189
|
+
|
|
190
|
+
{groups.map((group) => {
|
|
191
|
+
// In icon mode the label is hidden (opacity-0) and items show as
|
|
192
|
+
// icon-only tooltips — always show items regardless of collapse state.
|
|
193
|
+
const isOpen = state === 'collapsed' || !collapsedGroups.has(group.label);
|
|
194
|
+
return (<SidebarGroup key={group.label}>
|
|
195
|
+
<SidebarGroupLabel asChild>
|
|
196
|
+
<button type="button" className="w-full cursor-pointer justify-between hover:bg-accent hover:text-accent-foreground" onClick={() => toggleGroup(group.label)}>
|
|
197
|
+
{group.label}
|
|
198
|
+
<ChevronDown className={cn('size-4 shrink-0 transition-transform duration-200', !isOpen && '-rotate-90')}/>
|
|
199
|
+
</button>
|
|
200
|
+
</SidebarGroupLabel>
|
|
201
|
+
{isOpen && (<SidebarMenu>
|
|
202
|
+
{group.resources.map((r) => (<ResourceMenuItem key={r.id} resource={r} showId={showResourceIds}/>))}
|
|
203
|
+
</SidebarMenu>)}
|
|
204
|
+
</SidebarGroup>);
|
|
205
|
+
})}
|
|
206
|
+
</SidebarContent>
|
|
207
|
+
<SidebarFooter />
|
|
208
|
+
<SidebarCollapseToggle />
|
|
209
|
+
</Sidebar>);
|
|
210
|
+
}
|
|
211
|
+
// ─── Header ───────────────────────────────────────────────────────────────────
|
|
212
|
+
function userInitials(user) {
|
|
213
|
+
const source = user.name?.trim() || user.email?.trim() || user.id;
|
|
214
|
+
const parts = source.split(/\s+|[._@-]/).filter(Boolean);
|
|
215
|
+
if (parts.length === 0)
|
|
216
|
+
return '?';
|
|
217
|
+
if (parts.length === 1)
|
|
218
|
+
return parts[0].slice(0, 2).toUpperCase();
|
|
219
|
+
return (parts[0][0] + parts[1][0]).toUpperCase();
|
|
220
|
+
}
|
|
221
|
+
function UserMenu({ user }) {
|
|
222
|
+
const { t } = useI18n();
|
|
223
|
+
const logout = useLogout();
|
|
224
|
+
const navigate = useNavigate();
|
|
225
|
+
const features = useFeatures();
|
|
226
|
+
const initials = userInitials(user);
|
|
227
|
+
const display = user.name || user.email || user.id;
|
|
228
|
+
// First section advertised by the backend — the entry in the user menu
|
|
229
|
+
// jumps straight there. When every section is disabled (no api-keys,
|
|
230
|
+
// no webhooks, no ai-assistant) the Settings entry is hidden entirely.
|
|
231
|
+
const firstSettingsSection = features.apiKeys ? 'api-keys'
|
|
232
|
+
: features.webhooks ? 'webhooks'
|
|
233
|
+
: features.aiAssistant ? 'ai-assistant'
|
|
234
|
+
: null;
|
|
235
|
+
return (<DropdownMenu>
|
|
236
|
+
<DropdownMenuTrigger asChild>
|
|
237
|
+
<Button variant="ghost" className="h-9 gap-2 px-2" aria-label={display}>
|
|
238
|
+
<Avatar className="size-7">
|
|
239
|
+
{user.avatarUrl && <AvatarImage src={user.avatarUrl} alt={display}/>}
|
|
240
|
+
<AvatarFallback className="text-xs">{initials}</AvatarFallback>
|
|
241
|
+
</Avatar>
|
|
242
|
+
<span className="hidden max-w-[10rem] truncate text-sm sm:inline">{display}</span>
|
|
243
|
+
</Button>
|
|
244
|
+
</DropdownMenuTrigger>
|
|
245
|
+
<DropdownMenuContent align="end" sideOffset={8} className="w-56 p-1">
|
|
246
|
+
<DropdownMenuLabel className="flex items-center gap-2 px-3 py-2">
|
|
247
|
+
<Avatar className="size-8">
|
|
248
|
+
{user.avatarUrl && <AvatarImage src={user.avatarUrl} alt={display}/>}
|
|
249
|
+
<AvatarFallback className="text-xs">{initials}</AvatarFallback>
|
|
250
|
+
</Avatar>
|
|
251
|
+
<div className="flex min-w-0 flex-col">
|
|
252
|
+
<span className="truncate text-sm font-medium">{display}</span>
|
|
253
|
+
{user.email && user.email !== display && (<span className="truncate text-xs text-muted-foreground">{user.email}</span>)}
|
|
254
|
+
{user.role && (<span className="truncate text-xs uppercase tracking-wide text-muted-foreground">
|
|
255
|
+
{user.role}
|
|
256
|
+
</span>)}
|
|
257
|
+
</div>
|
|
258
|
+
</DropdownMenuLabel>
|
|
259
|
+
{firstSettingsSection && (<>
|
|
260
|
+
<DropdownMenuSeparator />
|
|
261
|
+
<DropdownMenuItem className="gap-3 px-3 py-2" onSelect={(e) => {
|
|
262
|
+
e.preventDefault();
|
|
263
|
+
navigate({ name: 'settings', section: firstSettingsSection });
|
|
264
|
+
}}>
|
|
265
|
+
<Settings className="size-4 text-muted-foreground"/>
|
|
266
|
+
<span>{t('settings:menuItem')}</span>
|
|
267
|
+
</DropdownMenuItem>
|
|
268
|
+
</>)}
|
|
269
|
+
<DropdownMenuSeparator />
|
|
270
|
+
<DropdownMenuItem className="gap-3 px-3 py-2" disabled={logout.isPending} onSelect={(e) => {
|
|
271
|
+
e.preventDefault();
|
|
272
|
+
logout.mutate();
|
|
273
|
+
}}>
|
|
274
|
+
<LogOut className="size-4 text-muted-foreground"/>
|
|
275
|
+
<span>{t('auth:logout')}</span>
|
|
276
|
+
</DropdownMenuItem>
|
|
277
|
+
</DropdownMenuContent>
|
|
278
|
+
</DropdownMenu>);
|
|
279
|
+
}
|
|
280
|
+
/** Header trigger that opens the cross-resource command palette. Renders
|
|
281
|
+
* as a full-width "search" button on desktop (with a ⌘K hint) and collapses
|
|
282
|
+
* to an icon-only button on mobile. */
|
|
283
|
+
function GlobalSearchTrigger({ onOpen, }) {
|
|
284
|
+
const { t } = useI18n();
|
|
285
|
+
// Detect macOS so the keyboard hint reads ⌘K vs Ctrl+K. Falls back to
|
|
286
|
+
// platform-agnostic mod key on SSR / unknown UAs.
|
|
287
|
+
const isMac = React.useMemo(() => {
|
|
288
|
+
if (typeof navigator === 'undefined')
|
|
289
|
+
return false;
|
|
290
|
+
return /Mac|iPhone|iPad|iPod/i.test(navigator.platform || navigator.userAgent);
|
|
291
|
+
}, []);
|
|
292
|
+
return (<>
|
|
293
|
+
<Button variant="outline" size="sm" onClick={onOpen} aria-label={t('globalSearch:title')} className="hidden h-9 w-full max-w-xs justify-start gap-2 px-3 text-muted-foreground sm:inline-flex">
|
|
294
|
+
<Search className="size-4"/>
|
|
295
|
+
<span className="flex-1 truncate text-left text-sm">
|
|
296
|
+
{t('globalSearch:trigger')}
|
|
297
|
+
</span>
|
|
298
|
+
<kbd className="pointer-events-none ml-2 inline-flex h-5 select-none items-center gap-0.5 rounded border border-border bg-muted px-1.5 font-mono text-[10px] font-medium">
|
|
299
|
+
{isMac ? <span aria-hidden="true">⌘</span> : <span aria-hidden="true">Ctrl</span>}
|
|
300
|
+
<span aria-hidden="true">K</span>
|
|
301
|
+
</kbd>
|
|
302
|
+
</Button>
|
|
303
|
+
<Button variant="ghost" size="icon" onClick={onOpen} aria-label={t('globalSearch:title')} className="sm:hidden">
|
|
304
|
+
<Search className="size-4"/>
|
|
305
|
+
</Button>
|
|
306
|
+
</>);
|
|
307
|
+
}
|
|
308
|
+
function Header({ user }) {
|
|
309
|
+
const { t } = useI18n();
|
|
310
|
+
const { setOpenMobile } = useSidebar();
|
|
311
|
+
const [searchOpen, setSearchOpen] = React.useState(false);
|
|
312
|
+
// Cmd+K on macOS, Ctrl+K elsewhere — both expressed via `mod`. Allowed in
|
|
313
|
+
// input contexts so users can pop the palette while typing in any field.
|
|
314
|
+
useHotkey('mod+k', () => setSearchOpen((prev) => !prev), {
|
|
315
|
+
allowInInput: true,
|
|
316
|
+
description: t('globalSearch:hotkey'),
|
|
317
|
+
group: t('common:search'),
|
|
318
|
+
});
|
|
319
|
+
return (<header className="sticky top-0 z-30 flex h-12 shrink-0 items-center gap-1 border-b border-border bg-card px-2 sm:h-14 sm:gap-3 sm:px-6">
|
|
320
|
+
<Button variant="ghost" size="icon" className="md:hidden" onClick={() => setOpenMobile(true)} aria-label={t('common:openMenu')}>
|
|
321
|
+
<Menu className="size-5"/>
|
|
322
|
+
</Button>
|
|
323
|
+
<GlobalSearchTrigger onOpen={() => setSearchOpen(true)}/>
|
|
324
|
+
<div className="ml-auto flex items-center gap-1">
|
|
325
|
+
<HotkeyHelpButton />
|
|
326
|
+
<LanguageSwitcher />
|
|
327
|
+
<ThemeToggle />
|
|
328
|
+
{user ? (<UserMenu user={user}/>) : (<Button variant="ghost" size="icon" disabled aria-label={t('auth:login')}>
|
|
329
|
+
<User className="size-4 opacity-50"/>
|
|
330
|
+
</Button>)}
|
|
331
|
+
</div>
|
|
332
|
+
<GlobalSearchDialog open={searchOpen} onOpenChange={setSearchOpen}/>
|
|
333
|
+
</header>);
|
|
334
|
+
}
|
|
335
|
+
function FullscreenSpinner() {
|
|
336
|
+
const { t } = useI18n();
|
|
337
|
+
return (<div role="status" aria-busy="true" aria-live="polite" className="flex min-h-screen flex-col items-center justify-center gap-6 bg-background p-6">
|
|
338
|
+
<div className="flex items-center gap-3">
|
|
339
|
+
<span className="flex size-12 items-center justify-center rounded-2xl bg-primary/10 ring-1 ring-primary/20">
|
|
340
|
+
<Database className="size-6 text-primary"/>
|
|
341
|
+
</span>
|
|
342
|
+
<span className="text-xl font-semibold tracking-tight">
|
|
343
|
+
{t('common:appName')}
|
|
344
|
+
</span>
|
|
345
|
+
</div>
|
|
346
|
+
<div className="flex items-center gap-2 text-sm text-muted-foreground">
|
|
347
|
+
<Loader2 className="size-4 animate-spin" aria-hidden="true"/>
|
|
348
|
+
<span>{t('common:loading')}</span>
|
|
349
|
+
</div>
|
|
350
|
+
</div>);
|
|
351
|
+
}
|
|
352
|
+
// `ShellLayout` is the rootRoute component supplied to TSR via context.
|
|
353
|
+
// `useCurrentUser()` here is safe — provider/query state is set up upstream
|
|
354
|
+
// in `AdminApp`, and by the time this layout renders the user is guaranteed
|
|
355
|
+
// to be authenticated (otherwise `AdminApp` short-circuits to `<LoginPage/>`).
|
|
356
|
+
function ShellLayout({ children, showSidebarResourceIds, }) {
|
|
357
|
+
const { user } = useCurrentUser();
|
|
358
|
+
return (<HotkeyRegistryProvider>
|
|
359
|
+
<DialogsProvider>
|
|
360
|
+
<SidebarProvider>
|
|
361
|
+
<AppSidebar showResourceIds={showSidebarResourceIds}/>
|
|
362
|
+
{/* `h-svh` on SidebarInset is the key to the scroll layout: it
|
|
363
|
+
constrains the inset to exactly the viewport height, which lets
|
|
364
|
+
the inner `<main overflow-auto>` (flex-1) actually scroll
|
|
365
|
+
internally instead of letting the whole page scroll. Without
|
|
366
|
+
this, `min-h-svh` made the inset grow with content, the main
|
|
367
|
+
never overflowed, and `position: sticky` inside it had no
|
|
368
|
+
scrolling ancestor to pin against.
|
|
369
|
+
|
|
370
|
+
`overflow-hidden` is also required: without it, the inner
|
|
371
|
+
`<main overflow-auto>`'s clipped descendant layout boxes still
|
|
372
|
+
propagate into the SidebarInset's (and document's) scrollHeight,
|
|
373
|
+
producing a second, page-level scrollbar that scrolls the whole
|
|
374
|
+
SidebarInset out of view into empty background. */}
|
|
375
|
+
<SidebarInset className="h-svh min-w-0 overflow-hidden">
|
|
376
|
+
<Header user={user}/>
|
|
377
|
+
{/* Padding has no `pb`: sticky footers (e.g. list-page paginator)
|
|
378
|
+
must be able to reach the viewport bottom, but `position: sticky`
|
|
379
|
+
is bounded by its containing block, which lives inside `<main>`'s
|
|
380
|
+
padding. With `pb-0`, the sticky element can extend all the way
|
|
381
|
+
down. Children that don't have a sticky footer add their own
|
|
382
|
+
bottom spacing via the `pb-4 sm:pb-6` class. */}
|
|
383
|
+
<main className="min-h-0 min-w-0 flex-1 overflow-auto px-2 pt-2 sm:px-6 sm:pt-6">
|
|
384
|
+
{children}
|
|
385
|
+
</main>
|
|
386
|
+
<AiAssistantWidget />
|
|
387
|
+
</SidebarInset>
|
|
388
|
+
<NotifyToaster />
|
|
389
|
+
</SidebarProvider>
|
|
390
|
+
</DialogsProvider>
|
|
391
|
+
</HotkeyRegistryProvider>);
|
|
392
|
+
}
|
|
393
|
+
export function AdminApp({ loginHint, basePath, showSidebarResourceIds, } = {}) {
|
|
394
|
+
const { user, isLoading, isAuthenticated } = useCurrentUser();
|
|
395
|
+
const showIds = showSidebarResourceIds ?? false;
|
|
396
|
+
// Capture the option in a stable layout component so the router doesn't
|
|
397
|
+
// remount the whole shell whenever the prop reference changes.
|
|
398
|
+
const Layout = React.useMemo(() => function ConfiguredShellLayout({ children }) {
|
|
399
|
+
return <ShellLayout showSidebarResourceIds={showIds}>{children}</ShellLayout>;
|
|
400
|
+
}, [showIds]);
|
|
401
|
+
if (isLoading)
|
|
402
|
+
return <FullscreenSpinner />;
|
|
403
|
+
if (!isAuthenticated || !user)
|
|
404
|
+
return <LoginPage hint={loginHint}/>;
|
|
405
|
+
return <AdminRouterProvider ShellLayout={Layout} basepath={basePath ?? ''}/>;
|
|
406
|
+
}
|
|
407
|
+
//# sourceMappingURL=admin-app.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-app.jsx","sourceRoot":"","sources":["../src/admin-app.tsx"],"names":[],"mappings":"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"}
|