@fougere/admin 0.3.0-alpha.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 (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +71 -0
  3. package/dist/dashboard.d.ts +74 -0
  4. package/dist/dashboard.d.ts.map +1 -0
  5. package/dist/dashboard.js +334 -0
  6. package/dist/dashboard.js.map +1 -0
  7. package/dist/extensions.d.ts +27 -0
  8. package/dist/extensions.d.ts.map +1 -0
  9. package/dist/extensions.js +74 -0
  10. package/dist/extensions.js.map +1 -0
  11. package/dist/facets.d.ts +60 -0
  12. package/dist/facets.d.ts.map +1 -0
  13. package/dist/facets.js +39 -0
  14. package/dist/facets.js.map +1 -0
  15. package/dist/index.d.ts +19 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +19 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/provider.d.ts +163 -0
  20. package/dist/provider.d.ts.map +1 -0
  21. package/dist/provider.js +205 -0
  22. package/dist/provider.js.map +1 -0
  23. package/dist/react.d.ts +70 -0
  24. package/dist/react.d.ts.map +1 -0
  25. package/dist/react.js +235 -0
  26. package/dist/react.js.map +1 -0
  27. package/dist/resources.d.ts +69 -0
  28. package/dist/resources.d.ts.map +1 -0
  29. package/dist/resources.js +92 -0
  30. package/dist/resources.js.map +1 -0
  31. package/dist/runtime.d.ts +22 -0
  32. package/dist/runtime.d.ts.map +1 -0
  33. package/dist/runtime.js +36 -0
  34. package/dist/runtime.js.map +1 -0
  35. package/dist/theme.d.ts +10 -0
  36. package/dist/theme.d.ts.map +1 -0
  37. package/dist/theme.js +419 -0
  38. package/dist/theme.js.map +1 -0
  39. package/dist/topology-page.d.ts +8 -0
  40. package/dist/topology-page.d.ts.map +1 -0
  41. package/dist/topology-page.js +69 -0
  42. package/dist/topology-page.js.map +1 -0
  43. package/dist/topology.d.ts +46 -0
  44. package/dist/topology.d.ts.map +1 -0
  45. package/dist/topology.js +58 -0
  46. package/dist/topology.js.map +1 -0
  47. package/package.json +76 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Fougere contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,71 @@
1
+ # @fougere/admin
2
+
3
+ An extensible React Admin renderer derived at runtime from Fougere's identity card.
4
+ It does not generate project files: every load discovers the latest resources, derives
5
+ the admin model, applies additive extensions, and renders it.
6
+
7
+ ```tsx
8
+ import { defineAdminExtension } from '@fougere/admin';
9
+ import { FougereAdmin } from '@fougere/admin/react';
10
+
11
+ const extensions = [
12
+ defineAdminExtension({
13
+ resource: 'post',
14
+ label: 'Articles',
15
+ facets: {
16
+ editorial: {
17
+ title: 'title',
18
+ state: {
19
+ field: 'status',
20
+ draft: ['draft'],
21
+ published: ['published'],
22
+ },
23
+ },
24
+ },
25
+ }),
26
+ ];
27
+
28
+ export const BackOffice = () => (
29
+ <FougereAdmin endpoint="/api/fougere/call" extensions={extensions} />
30
+ );
31
+ ```
32
+
33
+ ## Facets
34
+
35
+ Facets expose semantic notions without coupling the renderer to entity names. Fougere
36
+ ships `editorial` and `users`; contributor packages can add values such as `media`,
37
+ `moderation`, or `commerce`. Facet objects merge recursively, while arrays replace.
38
+
39
+ ## Dashboard widgets
40
+
41
+ The CMS dashboard is composed from stable widget ids. Project code changes only what it
42
+ owns, so new default widgets still appear after package upgrades.
43
+
44
+ ```tsx
45
+ <FougereAdmin
46
+ dashboardExtensions={[
47
+ { widget: 'fougere.recent-content', span: 7 },
48
+ { widget: 'fougere.users', span: 5 },
49
+ {
50
+ widget: 'acme.analytics',
51
+ component: AnalyticsWidget,
52
+ zone: 'main',
53
+ span: 12,
54
+ after: 'fougere.recent-content',
55
+ },
56
+ ]}
57
+ />
58
+ ```
59
+
60
+ An existing widget can be moved, resized, replaced or hidden. A new id with a component
61
+ contributes a widget. `useFougereDashboard()` exposes discovered resources, loading state,
62
+ base metrics, and navigation to contributed widgets. React Admin's regular `dashboard`
63
+ prop remains the full replacement escape hatch.
64
+
65
+ ## Rendering escape hatches
66
+
67
+ - `renderers.fields['resource.field']` and `renderers.inputs[...]` replace one field.
68
+ - `resourceComponents.resource` replaces a list, show, edit, create, or icon component.
69
+ - ordinary React Admin props replace the theme, layout, dashboard, auth, and i18n layers.
70
+
71
+ Unmentioned resources and fields always retain their derived renderer.
@@ -0,0 +1,74 @@
1
+ import { type SvgIconProps } from '@mui/material';
2
+ import { type ComponentType, type ReactElement } from 'react';
3
+ import { type ResourceOptions } from 'react-admin';
4
+ import type { AdminFacets } from './facets.js';
5
+ export interface FougereResourceOptions extends ResourceOptions {
6
+ primary: string;
7
+ facets: AdminFacets;
8
+ /** The frond that owns this door — the card groups by it, so the panel can too. */
9
+ frond?: string;
10
+ /** What the door answers, with each op's kind. `query` reads, `command` writes. */
11
+ operations?: ReadonlyArray<{
12
+ name: string;
13
+ kind: 'query' | 'command';
14
+ }>;
15
+ /** How many columns the shape yields — a rough measure of an entity's width. */
16
+ fieldCount?: number;
17
+ }
18
+ export interface FougereDashboardResource {
19
+ name: string;
20
+ label: string;
21
+ primary: string;
22
+ facets: AdminFacets;
23
+ hasCreate: boolean;
24
+ hasEdit: boolean;
25
+ hasShow: boolean;
26
+ total: number;
27
+ rows: Array<Record<string, unknown>>;
28
+ states: Record<string, number>;
29
+ }
30
+ export interface FougereDashboardMetrics {
31
+ content: number;
32
+ drafts: number;
33
+ published: number;
34
+ users: number;
35
+ }
36
+ export interface FougereDashboardContextValue {
37
+ loading: boolean;
38
+ resources: FougereDashboardResource[];
39
+ editorial: FougereDashboardResource[];
40
+ users: FougereDashboardResource[];
41
+ metrics: FougereDashboardMetrics;
42
+ navigate(view: 'list' | 'show' | 'edit' | 'create', resource: string, id?: string | number): void;
43
+ }
44
+ /** Data shared by built-in and contributed widgets. */
45
+ export declare function useFougereDashboard(): FougereDashboardContextValue;
46
+ export type FougereDashboardZone = 'hero' | 'metrics' | 'main';
47
+ export interface FougereDashboardWidget {
48
+ id: string;
49
+ zone: FougereDashboardZone;
50
+ /** Twelve-column width for `main`, four-column width for `metrics`. */
51
+ span: number;
52
+ component: ComponentType;
53
+ hidden?: boolean;
54
+ }
55
+ /** A delta over stable widget ids; a component on a new id contributes a new widget. */
56
+ export interface FougereDashboardExtension {
57
+ widget: string;
58
+ component?: ComponentType;
59
+ zone?: FougereDashboardZone;
60
+ span?: number;
61
+ hidden?: boolean;
62
+ before?: string;
63
+ after?: string;
64
+ }
65
+ export declare function applyDashboardExtensions(defaults: readonly FougereDashboardWidget[], extensions?: readonly FougereDashboardExtension[]): FougereDashboardWidget[];
66
+ type IconProps = SvgIconProps;
67
+ export declare const FougereContentIcon: (props: IconProps) => import("react").JSX.Element;
68
+ export declare const FougereUsersIcon: (props: IconProps) => import("react").JSX.Element;
69
+ export declare const FOUGERE_DASHBOARD_WIDGETS: readonly FougereDashboardWidget[];
70
+ export declare function FougereDashboard({ extensions }: {
71
+ extensions?: readonly FougereDashboardExtension[];
72
+ }): ReactElement;
73
+ export {};
74
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../src/dashboard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,334 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Box, Button, ButtonBase, Card, CardContent, Chip, Skeleton, SvgIcon, Typography, } from '@mui/material';
4
+ import { createContext, useContext, useEffect, useMemo, useState, } from 'react';
5
+ import { useDataProvider, useLocaleState, useRedirect, useResourceDefinitions, useTranslate, Title, } from 'react-admin';
6
+ const DashboardContext = createContext(undefined);
7
+ /** Data shared by built-in and contributed widgets. */
8
+ export function useFougereDashboard() {
9
+ const context = useContext(DashboardContext);
10
+ if (!context)
11
+ throw new Error('useFougereDashboard must be used inside FougereDashboard');
12
+ return context;
13
+ }
14
+ export function applyDashboardExtensions(defaults, extensions = []) {
15
+ const widgets = defaults.map((widget) => ({ ...widget }));
16
+ for (const extension of extensions) {
17
+ let index = widgets.findIndex((widget) => widget.id === extension.widget);
18
+ if (index === -1) {
19
+ if (!extension.component) {
20
+ throw new Error(`Dashboard widget '${extension.widget}' does not exist; a new widget needs a component`);
21
+ }
22
+ widgets.push({
23
+ id: extension.widget,
24
+ component: extension.component,
25
+ zone: extension.zone ?? 'main',
26
+ span: extension.span ?? 4,
27
+ hidden: extension.hidden,
28
+ });
29
+ index = widgets.length - 1;
30
+ }
31
+ else {
32
+ const current = widgets[index];
33
+ widgets[index] = {
34
+ ...current,
35
+ ...(extension.component ? { component: extension.component } : {}),
36
+ ...(extension.zone ? { zone: extension.zone } : {}),
37
+ ...(extension.span !== undefined ? { span: extension.span } : {}),
38
+ ...(extension.hidden !== undefined ? { hidden: extension.hidden } : {}),
39
+ };
40
+ }
41
+ const anchorId = extension.before ?? extension.after;
42
+ if (!anchorId)
43
+ continue;
44
+ const moving = widgets.splice(index, 1)[0];
45
+ const anchor = widgets.findIndex((widget) => widget.id === anchorId);
46
+ if (anchor === -1)
47
+ widgets.push(moving);
48
+ else
49
+ widgets.splice(anchor + (extension.after ? 1 : 0), 0, moving);
50
+ }
51
+ return widgets.filter((widget) => !widget.hidden);
52
+ }
53
+ export const FougereContentIcon = (props) => (_jsx(SvgIcon, { ...props, children: _jsx("path", { d: "M6 2h9l5 5v15H6a2 2 0 0 1-2-2V4c0-1.1.9-2 2-2Zm8 2H6v16h12V8h-4V4Zm-6 7h8v2H8v-2Zm0 4h8v2H8v-2Z" }) }));
54
+ const DraftIcon = (props) => (_jsx(SvgIcon, { ...props, children: _jsx("path", { d: "M12 2a10 10 0 1 0 10 10A10 10 0 0 0 12 2Zm1 11H7v-2h4V5h2v8Z" }) }));
55
+ const PublishedIcon = (props) => (_jsx(SvgIcon, { ...props, children: _jsx("path", { d: "M9 16.2 4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2Z" }) }));
56
+ export const FougereUsersIcon = (props) => (_jsx(SvgIcon, { ...props, children: _jsx("path", { d: "M16 11c1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3 1.34 3 3 3Zm-8 0c1.66 0 3-1.34 3-3S9.66 5 8 5 5 6.34 5 8s1.34 3 3 3Zm0 2c-2.33 0-7 1.17-7 3.5V19h10v-2.5c0-.87.34-1.62.91-2.26C10.55 13.41 8.9 13 8 13Zm8 0c-.9 0-2.55.41-3.91 1.24.57.64.91 1.39.91 2.26V19h10v-2.5c0-2.33-4.67-3.5-7-3.5Z" }) }));
57
+ const ArrowIcon = (props) => (_jsx(SvgIcon, { ...props, children: _jsx("path", { d: "m9.3 5.3 6.7 6.7-6.7 6.7-1.4-1.4 5.3-5.3-5.3-5.3 1.4-1.4Z" }) }));
58
+ const AddIcon = (props) => (_jsx(SvgIcon, { ...props, children: _jsx("path", { d: "M11 5h2v14h-2zM5 11h14v2H5z" }) }));
59
+ const unique = (values) => [...new Set(values.filter((value) => !!value))];
60
+ /**
61
+ * Every visible sentence, under a key, with the English wording as its fallback.
62
+ *
63
+ * The keys live under `fougere.admin.*` — react-admin's own namespace is
64
+ * `resources.*` and `ra.*`, and writing into it would collide with what it ships.
65
+ * This is the same convention `FormField.labelKey` states for a field: the schema
66
+ * carries no display text, and neither does a widget.
67
+ */
68
+ function useLabels() {
69
+ const translate = useTranslate();
70
+ return (key, fallback, options) => translate(`fougere.admin.${key}`, { _: fallback, ...options });
71
+ }
72
+ /**
73
+ * What names a row, and nothing is guessed.
74
+ *
75
+ * A declared facet says which field is the title; the primary key is the fallback,
76
+ * because a row always has one and it identifies without pretending to describe.
77
+ * The list here used to continue `'title', 'name', 'email'` — recognition by an
78
+ * English word, which is what this package stopped doing on 2026-08-21: an entity
79
+ * spelling `titre` got its id, and nothing said the facet was missing.
80
+ */
81
+ function titleOf(row, resource) {
82
+ const editorial = resource.facets.editorial;
83
+ const users = resource.facets.users;
84
+ for (const key of unique([editorial?.title, users?.name, resource.primary])) {
85
+ const value = row[key];
86
+ if (typeof value === 'string' || typeof value === 'number')
87
+ return String(value);
88
+ }
89
+ return '';
90
+ }
91
+ /** When a row last moved — from the declared facet only, for the reason `titleOf` gives. */
92
+ function timestampOf(row, resource) {
93
+ const editorial = resource.facets.editorial;
94
+ for (const key of unique([editorial?.updatedAt, editorial?.createdAt])) {
95
+ const value = row[key];
96
+ if (typeof value === 'string' || value instanceof Date) {
97
+ const timestamp = value instanceof Date ? value.getTime() : new Date(value).getTime();
98
+ if (!Number.isNaN(timestamp))
99
+ return timestamp;
100
+ }
101
+ }
102
+ return 0;
103
+ }
104
+ /**
105
+ * The viewer's locale, never a fixed one: react-admin already holds which language is
106
+ * on, and `Intl` is the only thing here that formats without a translation key.
107
+ */
108
+ const dateLabel = (timestamp, locale, fallback) => timestamp
109
+ ? new Intl.DateTimeFormat(locale, { day: 'numeric', month: 'short' }).format(timestamp)
110
+ : fallback;
111
+ function MetricCard({ label, value, hint, icon, }) {
112
+ const { loading } = useFougereDashboard();
113
+ return (_jsx(Card, { sx: { height: '100%' }, children: _jsxs(CardContent, { sx: { p: 2.5, '&:last-child': { pb: 2.5 } }, children: [_jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 1, color: 'text.secondary' }, children: [_jsx(Box, { sx: { display: 'grid', placeItems: 'center', fontSize: 18, opacity: .7 }, children: icon }), _jsx(Typography, { variant: "body2", sx: { fontWeight: 600 }, children: label })] }), loading
114
+ ? _jsx(Skeleton, { width: 72, height: 44, sx: { mt: .75 } })
115
+ : (_jsx(Typography, { sx: { mt: .5, fontSize: '2rem', lineHeight: 1.05, fontWeight: 680, letterSpacing: '-.045em', fontVariantNumeric: 'tabular-nums' }, children: value })), _jsx(Typography, { variant: "caption", color: "text.secondary", sx: { display: 'block', mt: .75 }, children: hint })] }) }));
116
+ }
117
+ function OverviewWidget() {
118
+ const { editorial, users, navigate } = useFougereDashboard();
119
+ const t = useLabels();
120
+ const [locale] = useLocaleState();
121
+ const content = editorial.find((resource) => resource.hasCreate);
122
+ const user = users.find((resource) => resource.hasCreate);
123
+ const today = new Intl.DateTimeFormat(locale, { weekday: 'long', day: 'numeric', month: 'long' }).format(new Date());
124
+ return (_jsxs(Box, { sx: {
125
+ display: 'flex', alignItems: { xs: 'flex-start', sm: 'flex-end' },
126
+ justifyContent: 'space-between', flexDirection: { xs: 'column', sm: 'row' },
127
+ gap: 2, mb: 1,
128
+ }, children: [_jsxs(Box, { children: [_jsx(Typography, { variant: "overline", sx: { color: 'text.secondary', letterSpacing: '.08em' }, children: today }), _jsx(Typography, { component: "h1", sx: { fontSize: { xs: '1.5rem', md: '1.75rem' }, fontWeight: 660, letterSpacing: '-.03em', mt: .25 }, children: t('overview.title', 'Overview') })] }), _jsxs(Box, { sx: { display: 'flex', gap: 1, flexShrink: 0 }, children: [user && (_jsx(Button, { variant: "text", startIcon: _jsx(FougereUsersIcon, {}), onClick: () => navigate('create', user.name), children: t('action.inviteUser', 'Invite a user') })), content && (_jsx(Button, { variant: "contained", startIcon: _jsx(AddIcon, {}), onClick: () => navigate('create', content.name), children: t('action.createContent', 'Create content') }))] })] }));
129
+ }
130
+ const ContentMetricWidget = () => {
131
+ const { metrics, editorial } = useFougereDashboard();
132
+ const t = useLabels();
133
+ return _jsx(MetricCard, { label: t('metric.content', 'Content'), value: metrics.content, hint: t('metric.contentHint', `${editorial.length} collections`, { smart_count: editorial.length }), icon: _jsx(FougereContentIcon, {}) });
134
+ };
135
+ const DraftMetricWidget = () => {
136
+ const { metrics } = useFougereDashboard();
137
+ const t = useLabels();
138
+ return _jsx(MetricCard, { label: t('metric.drafts', 'Drafts'), value: metrics.drafts, hint: t('metric.draftsHint', 'To finish or review'), icon: _jsx(DraftIcon, {}) });
139
+ };
140
+ const PublishedMetricWidget = () => {
141
+ const { metrics } = useFougereDashboard();
142
+ const t = useLabels();
143
+ return _jsx(MetricCard, { label: t('metric.published', 'Published'), value: metrics.published, hint: t('metric.publishedHint', 'Currently visible'), icon: _jsx(PublishedIcon, {}) });
144
+ };
145
+ const UsersMetricWidget = () => {
146
+ const { metrics, users } = useFougereDashboard();
147
+ const t = useLabels();
148
+ return _jsx(MetricCard, { label: t('metric.users', 'Users'), value: metrics.users, hint: users.length ? t('metric.usersHint', 'Managed accounts') : t('metric.noUsersFacet', 'No users facet declared'), icon: _jsx(FougereUsersIcon, {}) });
149
+ };
150
+ function RecentContentWidget() {
151
+ const { loading, editorial, navigate } = useFougereDashboard();
152
+ const t = useLabels();
153
+ const [locale] = useLocaleState();
154
+ const recent = useMemo(() => editorial.flatMap((resource) => resource.rows.map((row) => ({
155
+ resource, row, date: timestampOf(row, resource),
156
+ }))).sort((a, b) => b.date - a.date).slice(0, 6), [editorial]);
157
+ return (_jsx(Card, { sx: { height: '100%' }, children: _jsxs(CardContent, { sx: { p: 0, '&:last-child': { pb: 0 } }, children: [_jsxs(Box, { sx: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', px: 2.5, pt: 2.25, pb: 1.75 }, children: [_jsxs(Box, { children: [_jsx(Typography, { variant: "h5", children: t('recent.title', 'Recent activity') }), _jsx(Typography, { variant: "body2", color: "text.secondary", sx: { mt: .4 }, children: t('recent.subtitle', 'The most recently edited content') })] }), editorial[0] && _jsx(Button, { size: "small", endIcon: _jsx(ArrowIcon, {}), onClick: () => navigate('list', editorial[0].name), children: t('action.seeAll', 'See all') })] }), loading ? _jsx(Box, { sx: { px: 2.5, pb: 2.5 }, children: [1, 2, 3, 4].map((key) => _jsx(Skeleton, { height: 58 }, key)) })
158
+ : recent.length === 0 ? _jsx(Typography, { color: "text.secondary", sx: { px: 2.5, pb: 2.5 }, children: t('recent.empty', 'No content yet.') })
159
+ : recent.map(({ resource, row, date }, index) => {
160
+ const facet = resource.facets.editorial;
161
+ const state = facet.state && typeof row[facet.state.field] === 'string' ? String(row[facet.state.field]) : undefined;
162
+ const id = row.id;
163
+ return (_jsxs(ButtonBase, { onClick: () => resource.hasShow && id !== undefined ? navigate('show', resource.name, id) : navigate('list', resource.name), sx: { display: 'grid', gridTemplateColumns: 'minmax(0,1fr) auto auto', alignItems: 'center', gap: 2, width: '100%', minHeight: 60, px: 2.5, py: 1.2, borderTop: 1, borderColor: 'divider', textAlign: 'left', '&:hover': { bgcolor: 'action.hover' }, '&.Mui-focusVisible': { outline: 2, outlineOffset: -2, outlineColor: 'primary.main' } }, children: [_jsxs(Box, { sx: { minWidth: 0 }, children: [_jsx(Typography, { noWrap: true, sx: { fontWeight: 650 }, children: titleOf(row, resource) }), _jsx(Typography, { variant: "caption", color: "text.secondary", children: resource.label })] }), state && _jsx(Chip, { label: state, size: "small" }), _jsx(Typography, { variant: "caption", color: "text.secondary", sx: { minWidth: 52, textAlign: 'right' }, children: dateLabel(date, locale, t('recent.undated', 'Recently')) })] }, `${resource.name}-${String(id ?? index)}`));
164
+ })] }) }));
165
+ }
166
+ function UsersWidget() {
167
+ const { loading, users, navigate } = useFougereDashboard();
168
+ const t = useLabels();
169
+ const resource = users[0];
170
+ const facet = resource?.facets.users;
171
+ return (_jsx(Card, { sx: { height: '100%' }, children: _jsxs(CardContent, { sx: { p: 0, '&:last-child': { pb: 0 } }, children: [_jsxs(Box, { sx: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', px: 2.5, pt: 2.25, pb: 1.75 }, children: [_jsxs(Box, { children: [_jsx(Typography, { variant: "h5", children: t('users.title', 'Users') }), _jsx(Typography, { variant: "body2", color: "text.secondary", sx: { mt: .4 }, children: t('users.subtitle', 'Access and roles') })] }), resource?.hasCreate && _jsx(Button, { size: "small", startIcon: _jsx(AddIcon, {}), onClick: () => navigate('create', resource.name), children: t('action.invite', 'Invite') })] }), loading ? _jsx(Box, { sx: { px: 2.5, pb: 2.5 }, children: [1, 2, 3].map((key) => _jsx(Skeleton, { height: 58 }, key)) })
172
+ : !resource || !facet ? _jsx(Typography, { color: "text.secondary", sx: { px: 2.5, pb: 2.5 }, children: t('users.empty', 'Declare a `users` facet to fill this panel.') })
173
+ : resource.rows.slice(0, 5).map((row, index) => {
174
+ const id = row.id;
175
+ const role = facet.role && typeof row[facet.role] === 'string' ? String(row[facet.role]) : undefined;
176
+ const state = facet.state && typeof row[facet.state.field] === 'string' ? String(row[facet.state.field]) : undefined;
177
+ return (_jsxs(ButtonBase, { onClick: () => id !== undefined && resource.hasEdit ? navigate('edit', resource.name, id) : navigate('list', resource.name), sx: { display: 'grid', gridTemplateColumns: 'minmax(0,1fr) auto', alignItems: 'center', gap: 1.5, width: '100%', minHeight: 60, px: 2.5, py: 1.1, borderTop: 1, borderColor: 'divider', textAlign: 'left', '&:hover': { bgcolor: 'action.hover' }, '&.Mui-focusVisible': { outline: 2, outlineOffset: -2, outlineColor: 'primary.main' } }, children: [_jsxs(Box, { sx: { minWidth: 0 }, children: [_jsx(Typography, { noWrap: true, sx: { fontWeight: 650 }, children: titleOf(row, resource) }), _jsx(Typography, { variant: "caption", color: "text.secondary", noWrap: true, children: role ?? (facet.email ? String(row[facet.email] ?? '') : '') })] }), state && _jsx(Chip, { label: state, size: "small" })] }, String(id ?? index)));
178
+ }), resource && _jsx(Box, { sx: { borderTop: 1, borderColor: 'divider', p: 1.25 }, children: _jsx(Button, { fullWidth: true, endIcon: _jsx(ArrowIcon, {}), onClick: () => navigate('list', resource.name), children: t('action.manageUsers', 'Manage users') }) })] }) }));
179
+ }
180
+ /**
181
+ * What the application IS, as opposed to what it holds.
182
+ *
183
+ * Every other widget counts rows; this one counts the shape that produced them —
184
+ * fronds, doors, operations split by kind, and how wide each entity is. All of it comes
185
+ * from the same card the menu was built from, so it costs no query at all.
186
+ *
187
+ * **Remotes are not in it, and the card is why.** `identityCardOf` maps `app.fronds`,
188
+ * which holds what this process scanned; a frond named in `remotes:` lives in a separate
189
+ * index (`boot/remote.ts`), discovered lazily at the first miss. So a consumer's card
190
+ * announces its own fronds and never the ones it routes to. Saying "1 frond" while three
191
+ * answer would be a lie the panel invented, so the count is labelled for what it is.
192
+ */
193
+ function StructureWidget() {
194
+ const t = useLabels();
195
+ const definitions = useResourceDefinitions();
196
+ const structure = useMemo(() => {
197
+ const byFrond = new Map();
198
+ let queries = 0;
199
+ let commands = 0;
200
+ let fields = 0;
201
+ for (const definition of Object.values(definitions)) {
202
+ const options = definition.options;
203
+ const frond = options?.frond ?? '—';
204
+ const ops = options?.operations ?? [];
205
+ const q = ops.filter((op) => op.kind === 'query').length;
206
+ const c = ops.length - q;
207
+ const width = options?.fieldCount ?? 0;
208
+ queries += q;
209
+ commands += c;
210
+ fields += width;
211
+ const held = byFrond.get(frond) ?? { doors: 0, queries: 0, commands: 0, fields: 0 };
212
+ byFrond.set(frond, {
213
+ doors: held.doors + 1,
214
+ queries: held.queries + q,
215
+ commands: held.commands + c,
216
+ fields: held.fields + width,
217
+ });
218
+ }
219
+ return {
220
+ fronds: [...byFrond.entries()].map(([name, counts]) => ({ name, ...counts })),
221
+ doors: Object.keys(definitions).length,
222
+ queries, commands, fields,
223
+ };
224
+ }, [definitions]);
225
+ const totals = [
226
+ ['structure.fronds', 'Fronds', structure.fronds.length],
227
+ ['structure.doors', 'Doors', structure.doors],
228
+ ['structure.queries', 'Queries', structure.queries],
229
+ ['structure.commands', 'Commands', structure.commands],
230
+ ];
231
+ return (_jsx(Card, { sx: { height: '100%' }, children: _jsxs(CardContent, { sx: { p: 0, '&:last-child': { pb: 0 } }, children: [_jsxs(Box, { sx: { px: 2.5, pt: 2.25, pb: 1.75 }, children: [_jsx(Typography, { variant: "h5", children: t('structure.title', 'Structure') }), _jsx(Typography, { variant: "body2", color: "text.secondary", sx: { mt: .4 }, children: t('structure.subtitle', 'What the identity card announces about this app') })] }), _jsx(Box, { sx: {
232
+ display: 'grid', gridTemplateColumns: 'repeat(4, minmax(0,1fr))',
233
+ borderTop: 1, borderColor: 'divider',
234
+ }, children: totals.map(([key, fallback, value], index) => (_jsxs(Box, { sx: { px: 2.5, py: 1.75, borderLeft: index ? 1 : 0, borderColor: 'divider' }, children: [_jsx(Typography, { sx: { fontSize: '1.5rem', fontWeight: 680, letterSpacing: '-.04em', fontVariantNumeric: 'tabular-nums' }, children: value }), _jsx(Typography, { variant: "caption", color: "text.secondary", children: t(key, fallback) })] }, key))) }), structure.fronds.map((frond) => (_jsxs(Box, { sx: {
235
+ display: 'grid', gridTemplateColumns: 'minmax(0,1fr) auto', alignItems: 'center',
236
+ gap: 2, px: 2.5, py: 1.4, borderTop: 1, borderColor: 'divider',
237
+ }, children: [_jsxs(Box, { sx: { minWidth: 0 }, children: [_jsx(Typography, { noWrap: true, sx: { fontWeight: 640 }, children: frond.name }), _jsxs(Typography, { variant: "caption", color: "text.secondary", children: [t('structure.frondDoors', `${frond.doors} doors`, { smart_count: frond.doors }), ' · ', t('structure.frondFields', `${frond.fields} fields`, { smart_count: frond.fields })] })] }), _jsxs(Box, { sx: { display: 'flex', gap: .75 }, children: [_jsx(Chip, { size: "small", label: `${frond.queries} ${t('structure.read', 'read')}` }), _jsx(Chip, { size: "small", label: `${frond.commands} ${t('structure.write', 'write')}` })] })] }, frond.name))), _jsx(Box, { sx: { px: 2.5, py: 1.5, borderTop: 1, borderColor: 'divider' }, children: _jsx(Typography, { variant: "caption", color: "text.secondary", children: t('structure.localOnly', 'Local fronds only — a card does not announce what it routes to. Topology says where a call goes.') }) })] }) }));
238
+ }
239
+ function CollectionsWidget() {
240
+ const t = useLabels();
241
+ const { loading, resources, navigate } = useFougereDashboard();
242
+ return (_jsx(Card, { children: _jsxs(CardContent, { sx: { p: 2.5, '&:last-child': { pb: 2.5 } }, children: [_jsx(Typography, { variant: "h5", children: t('collections.title', 'Collections') }), _jsx(Typography, { variant: "body2", color: "text.secondary", sx: { mt: .4, mb: 2 }, children: t('collections.subtitle', 'Every door the card announced') }), _jsx(Box, { sx: { display: 'grid', gridTemplateColumns: { xs: '1fr', sm: 'repeat(2,minmax(0,1fr))', lg: 'repeat(3,minmax(0,1fr))' }, gap: 1 }, children: loading ? [1, 2, 3].map((key) => _jsx(Skeleton, { height: 58 }, key)) : resources.map((resource) => (_jsxs(Box, { component: "button", onClick: () => navigate('list', resource.name), sx: { appearance: 'none', width: '100%', display: 'flex', alignItems: 'center', gap: 1.5, p: 1.25, color: 'text.primary', bgcolor: 'transparent', border: 0, borderRadius: 2, textAlign: 'left', cursor: 'pointer', font: 'inherit', '&:hover': { bgcolor: 'action.hover' } }, children: [_jsx(Box, { sx: { display: 'grid', placeItems: 'center', width: 34, height: 34, borderRadius: 2, color: 'primary.main', bgcolor: 'action.hover' }, children: resource.facets.users ? _jsx(FougereUsersIcon, { fontSize: "small" }) : _jsx(FougereContentIcon, { fontSize: "small" }) }), _jsxs(Box, { sx: { minWidth: 0, flex: 1 }, children: [_jsx(Typography, { noWrap: true, sx: { fontSize: '.875rem', fontWeight: 650 }, children: resource.label }), _jsx(Typography, { variant: "caption", color: "text.secondary", children: t('resource.rows', `${resource.total} rows`, { smart_count: resource.total }) })] }), _jsx(ArrowIcon, { fontSize: "small", sx: { color: 'text.secondary' } })] }, resource.name))) })] }) }));
243
+ }
244
+ export const FOUGERE_DASHBOARD_WIDGETS = [
245
+ { id: 'fougere.overview', zone: 'hero', span: 12, component: OverviewWidget },
246
+ { id: 'fougere.content-total', zone: 'metrics', span: 1, component: ContentMetricWidget },
247
+ { id: 'fougere.drafts', zone: 'metrics', span: 1, component: DraftMetricWidget },
248
+ { id: 'fougere.published', zone: 'metrics', span: 1, component: PublishedMetricWidget },
249
+ { id: 'fougere.users-total', zone: 'metrics', span: 1, component: UsersMetricWidget },
250
+ { id: 'fougere.recent-content', zone: 'main', span: 8, component: RecentContentWidget },
251
+ { id: 'fougere.users', zone: 'main', span: 4, component: UsersWidget },
252
+ { id: 'fougere.structure', zone: 'main', span: 12, component: StructureWidget },
253
+ { id: 'fougere.collections', zone: 'main', span: 12, component: CollectionsWidget },
254
+ ];
255
+ const EMPTY_EXTENSIONS = [];
256
+ export function FougereDashboard({ extensions = EMPTY_EXTENSIONS }) {
257
+ const definitions = useResourceDefinitions();
258
+ const dataProvider = useDataProvider();
259
+ const redirect = useRedirect();
260
+ const [resources, setResources] = useState([]);
261
+ const [loading, setLoading] = useState(true);
262
+ const resourceKey = Object.values(definitions).filter((definition) => definition.hasList).map((definition) => definition.name).sort().join('\u0000');
263
+ useEffect(() => {
264
+ let active = true;
265
+ const listable = Object.values(definitions).filter((definition) => definition.hasList);
266
+ if (!listable.length) {
267
+ setResources([]);
268
+ setLoading(false);
269
+ return () => { active = false; };
270
+ }
271
+ setLoading(true);
272
+ void Promise.all(listable.map(async (definition) => {
273
+ const options = definition.options;
274
+ const facets = options?.facets ?? {};
275
+ const editorial = facets.editorial;
276
+ const stateValues = unique([...(editorial?.state?.draft ?? []), ...(editorial?.state?.published ?? [])]);
277
+ const primary = options?.primary ?? 'id';
278
+ try {
279
+ const page = await dataProvider.getList(definition.name, { pagination: { page: 1, perPage: 8 }, sort: { field: primary, order: 'DESC' }, filter: {} });
280
+ const states = editorial?.state ? Object.fromEntries(await Promise.all(stateValues.map(async (state) => {
281
+ try {
282
+ const filtered = await dataProvider.getList(definition.name, { pagination: { page: 1, perPage: 1 }, sort: { field: primary, order: 'DESC' }, filter: { [editorial.state.field]: state } });
283
+ return [state, filtered.total ?? filtered.data.length];
284
+ }
285
+ catch {
286
+ return [state, 0];
287
+ }
288
+ }))) : {};
289
+ return { name: definition.name, label: options?.label ?? definition.name, primary, facets, hasCreate: !!definition.hasCreate, hasEdit: !!definition.hasEdit, hasShow: !!definition.hasShow, total: page.total ?? page.data.length, rows: page.data, states };
290
+ }
291
+ catch {
292
+ return { name: definition.name, label: options?.label ?? definition.name, primary, facets, hasCreate: !!definition.hasCreate, hasEdit: !!definition.hasEdit, hasShow: !!definition.hasShow, total: 0, rows: [], states: {} };
293
+ }
294
+ })).then((loaded) => { if (active)
295
+ setResources(loaded); }).finally(() => { if (active)
296
+ setLoading(false); });
297
+ return () => { active = false; };
298
+ }, [dataProvider, resourceKey]);
299
+ const editorial = resources.filter((resource) => !!resource.facets.editorial);
300
+ const users = resources.filter((resource) => !!resource.facets.users);
301
+ const metrics = useMemo(() => ({
302
+ content: editorial.reduce((sum, resource) => sum + resource.total, 0),
303
+ drafts: editorial.reduce((sum, resource) => {
304
+ const facet = resource.facets.editorial;
305
+ return sum + (facet.state?.draft ?? []).reduce((subtotal, state) => subtotal + (resource.states[state] ?? 0), 0);
306
+ }, 0),
307
+ published: editorial.reduce((sum, resource) => {
308
+ const facet = resource.facets.editorial;
309
+ return sum + (facet.state?.published ?? []).reduce((subtotal, state) => subtotal + (resource.states[state] ?? 0), 0);
310
+ }, 0),
311
+ users: users.reduce((sum, resource) => sum + resource.total, 0),
312
+ }), [editorial, users]);
313
+ const t = useLabels();
314
+ const context = useMemo(() => ({
315
+ loading, resources, editorial, users, metrics,
316
+ navigate: (view, resource, id) => redirect(view, resource, id),
317
+ }), [loading, resources, editorial, users, metrics, redirect]);
318
+ const widgets = useMemo(() => applyDashboardExtensions(FOUGERE_DASHBOARD_WIDGETS, extensions), [extensions]);
319
+ const renderZone = (zone) => widgets.filter((widget) => widget.zone === zone).map((widget) => {
320
+ const Widget = widget.component;
321
+ const gridColumn = zone === 'main'
322
+ ? {
323
+ xs: 'span 12',
324
+ md: `span ${Math.min(12, Math.max(6, widget.span))}`,
325
+ lg: `span ${Math.min(12, Math.max(1, widget.span))}`,
326
+ }
327
+ : zone === 'metrics'
328
+ ? { xs: 'span 1', lg: `span ${Math.min(4, Math.max(1, widget.span))}` }
329
+ : undefined;
330
+ return _jsx(Box, { sx: gridColumn ? { gridColumn } : undefined, children: _jsx(Widget, {}) }, widget.id);
331
+ });
332
+ return (_jsxs(DashboardContext.Provider, { value: context, children: [_jsx(Title, { title: t('overview.title', 'Overview') }), _jsxs(Box, { sx: { width: '100%', maxWidth: 1440, mx: 'auto', pb: 4 }, children: [_jsx(Box, { sx: { display: 'grid', gap: 2, mb: 3.5 }, children: renderZone('hero') }), _jsx(Box, { sx: { display: 'grid', gridTemplateColumns: { xs: '1fr', sm: 'repeat(2,minmax(0,1fr))', lg: 'repeat(4,minmax(0,1fr))' }, gap: 2, mb: 3 }, children: renderZone('metrics') }), _jsx(Box, { sx: { display: 'grid', gridTemplateColumns: 'repeat(12,minmax(0,1fr))', gap: 2 }, children: renderZone('main') })] })] }));
333
+ }
334
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../src/dashboard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type AdminResource } from './resources.js';
2
+ import { type AdminFacets } from './facets.js';
3
+ export interface AdminFieldExtension {
4
+ /** Changes the fallback in every derived view of this field. */
5
+ label?: string;
6
+ /** Removes the field from derived tables, shows and forms. */
7
+ hidden?: boolean;
8
+ }
9
+ export interface AdminOperationExtension {
10
+ label?: string;
11
+ /** `false` explicitly removes a confirmation added by an earlier extension. */
12
+ confirm?: string | false;
13
+ }
14
+ export interface AdminExtension {
15
+ /** Registration key from the card (`post`, not `Post`). */
16
+ resource: string;
17
+ label?: string;
18
+ /** Adds or refines semantic notions without replacing the derived resource. */
19
+ facets?: AdminFacets;
20
+ fields?: Record<string, AdminFieldExtension>;
21
+ operations?: Record<string, AdminOperationExtension>;
22
+ }
23
+ /** Typed identity helper for extensions kept in their own module. */
24
+ export declare function defineAdminExtension<const T extends AdminExtension>(extension: T): T;
25
+ /** Apply deltas to the latest derived model. Unmentioned and future resources pass through. */
26
+ export declare function applyAdminExtensions(resources: readonly AdminResource[], extensions?: readonly AdminExtension[]): AdminResource[];
27
+ //# sourceMappingURL=extensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAuC,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAEjE,MAAM,WAAW,mBAAmB;IAClC,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;CACtD;AAED,qEAAqE;AACrE,wBAAgB,oBAAoB,CAAC,KAAK,CAAC,CAAC,SAAS,cAAc,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,CAEpF;AAsDD,+FAA+F;AAC/F,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,SAAS,aAAa,EAAE,EACnC,UAAU,GAAE,SAAS,cAAc,EAAO,GACzC,aAAa,EAAE,CAqBjB"}