@tekki-forge/runtime-admin 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/README.md +5 -0
- package/dist/account.d.ts +1 -0
- package/dist/account.js +105 -0
- package/dist/account.js.map +1 -0
- package/dist/activity.d.ts +65 -0
- package/dist/activity.js +299 -0
- package/dist/activity.js.map +1 -0
- package/dist/admin-access.d.ts +4 -0
- package/dist/admin-access.js +177 -0
- package/dist/admin-access.js.map +1 -0
- package/dist/admin.d.ts +5 -0
- package/dist/admin.js +129 -0
- package/dist/admin.js.map +1 -0
- package/dist/auth-pages.d.ts +13 -0
- package/dist/auth-pages.js +207 -0
- package/dist/auth-pages.js.map +1 -0
- package/dist/brand-art.d.ts +24 -0
- package/dist/brand-art.js +33 -0
- package/dist/brand-art.js.map +1 -0
- package/dist/brand.d.ts +11 -0
- package/dist/brand.js +16 -0
- package/dist/brand.js.map +1 -0
- package/dist/charts.d.ts +23 -0
- package/dist/charts.js +259 -0
- package/dist/charts.js.map +1 -0
- package/dist/command-palette.d.ts +9 -0
- package/dist/command-palette.js +115 -0
- package/dist/command-palette.js.map +1 -0
- package/dist/context.d.ts +242 -0
- package/dist/context.js +107 -0
- package/dist/context.js.map +1 -0
- package/dist/dashboard.d.ts +66 -0
- package/dist/dashboard.js +144 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/fields.d.ts +71 -0
- package/dist/fields.js +326 -0
- package/dist/fields.js.map +1 -0
- package/dist/i18n/catalog.d.ts +7 -0
- package/dist/i18n/catalog.js +23 -0
- package/dist/i18n/catalog.js.map +1 -0
- package/dist/i18n/locale.d.ts +15 -0
- package/dist/i18n/locale.js +69 -0
- package/dist/i18n/locale.js.map +1 -0
- package/dist/i18n/messages/de.d.ts +3 -0
- package/dist/i18n/messages/de.js +627 -0
- package/dist/i18n/messages/de.js.map +1 -0
- package/dist/i18n/messages/en.d.ts +3 -0
- package/dist/i18n/messages/en.js +627 -0
- package/dist/i18n/messages/en.js.map +1 -0
- package/dist/i18n/messages/es.d.ts +3 -0
- package/dist/i18n/messages/es.js +627 -0
- package/dist/i18n/messages/es.js.map +1 -0
- package/dist/i18n/messages/fr.d.ts +3 -0
- package/dist/i18n/messages/fr.js +627 -0
- package/dist/i18n/messages/fr.js.map +1 -0
- package/dist/i18n/messages/pt.d.ts +3 -0
- package/dist/i18n/messages/pt.js +627 -0
- package/dist/i18n/messages/pt.js.map +1 -0
- package/dist/i18n/validation.d.ts +3 -0
- package/dist/i18n/validation.js +36 -0
- package/dist/i18n/validation.js.map +1 -0
- package/dist/illustrations.d.ts +6 -0
- package/dist/illustrations.js +16 -0
- package/dist/illustrations.js.map +1 -0
- package/dist/import-dialog.d.ts +11 -0
- package/dist/import-dialog.js +152 -0
- package/dist/import-dialog.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/inline-edit.d.ts +18 -0
- package/dist/inline-edit.js +115 -0
- package/dist/inline-edit.js.map +1 -0
- package/dist/landing.d.ts +79 -0
- package/dist/landing.js +122 -0
- package/dist/landing.js.map +1 -0
- package/dist/locale-switcher.d.ts +4 -0
- package/dist/locale-switcher.js +15 -0
- package/dist/locale-switcher.js.map +1 -0
- package/dist/map.d.ts +26 -0
- package/dist/map.js +232 -0
- package/dist/map.js.map +1 -0
- package/dist/notifications.d.ts +12 -0
- package/dist/notifications.js +75 -0
- package/dist/notifications.js.map +1 -0
- package/dist/record-mutation.d.ts +19 -0
- package/dist/record-mutation.js +39 -0
- package/dist/record-mutation.js.map +1 -0
- package/dist/resource-detail.d.ts +4 -0
- package/dist/resource-detail.js +96 -0
- package/dist/resource-detail.js.map +1 -0
- package/dist/resource-form.d.ts +11 -0
- package/dist/resource-form.js +92 -0
- package/dist/resource-form.js.map +1 -0
- package/dist/resource-list.d.ts +10 -0
- package/dist/resource-list.js +154 -0
- package/dist/resource-list.js.map +1 -0
- package/dist/saved-views.d.ts +16 -0
- package/dist/saved-views.js +64 -0
- package/dist/saved-views.js.map +1 -0
- package/dist/schema-editor-diagram.d.ts +14 -0
- package/dist/schema-editor-diagram.js +54 -0
- package/dist/schema-editor-diagram.js.map +1 -0
- package/dist/schema-editor.d.ts +98 -0
- package/dist/schema-editor.js +571 -0
- package/dist/schema-editor.js.map +1 -0
- package/dist/shell.d.ts +10 -0
- package/dist/shell.js +228 -0
- package/dist/shell.js.map +1 -0
- package/dist/skeleton.d.ts +25 -0
- package/dist/skeleton.js +34 -0
- package/dist/skeleton.js.map +1 -0
- package/dist/theme-catalog.d.ts +71 -0
- package/dist/theme-catalog.js +55 -0
- package/dist/theme-catalog.js.map +1 -0
- package/dist/theme-head.d.ts +8 -0
- package/dist/theme-head.js +11 -0
- package/dist/theme-head.js.map +1 -0
- package/dist/theme-preview.d.ts +2 -0
- package/dist/theme-preview.js +23 -0
- package/dist/theme-preview.js.map +1 -0
- package/dist/theme-switcher.d.ts +20 -0
- package/dist/theme-switcher.js +159 -0
- package/dist/theme-switcher.js.map +1 -0
- package/dist/theme.d.ts +24 -0
- package/dist/theme.js +30 -0
- package/dist/theme.js.map +1 -0
- package/dist/toast.d.ts +21 -0
- package/dist/toast.js +51 -0
- package/dist/toast.js.map +1 -0
- package/dist/ui.d.ts +86 -0
- package/dist/ui.js +106 -0
- package/dist/ui.js.map +1 -0
- package/dist/views.d.ts +23 -0
- package/dist/views.js +238 -0
- package/dist/views.js.map +1 -0
- package/package.json +58 -0
- package/styles.css +778 -0
package/dist/ui.js
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { Box, Briefcase, Building2, Calendar, CheckSquare, CreditCard, FileText, Folder, Layers, LoaderCircle, Mail, MapPin, Package, ShoppingCart, Star, Tag, Ticket, Users, X, } from "lucide-react";
|
|
4
|
+
import { useEffect } from "react";
|
|
5
|
+
import { useT } from "./context.js";
|
|
6
|
+
import { Illustration } from "./illustrations.js";
|
|
7
|
+
export function cn(...classes) {
|
|
8
|
+
return classes.filter(Boolean).join(" ");
|
|
9
|
+
}
|
|
10
|
+
const ICONS = {
|
|
11
|
+
folder: Folder,
|
|
12
|
+
users: Users,
|
|
13
|
+
user: Users,
|
|
14
|
+
briefcase: Briefcase,
|
|
15
|
+
building: Building2,
|
|
16
|
+
"file-text": FileText,
|
|
17
|
+
box: Box,
|
|
18
|
+
tag: Tag,
|
|
19
|
+
layers: Layers,
|
|
20
|
+
star: Star,
|
|
21
|
+
calendar: Calendar,
|
|
22
|
+
"credit-card": CreditCard,
|
|
23
|
+
mail: Mail,
|
|
24
|
+
"map-pin": MapPin,
|
|
25
|
+
package: Package,
|
|
26
|
+
"shopping-cart": ShoppingCart,
|
|
27
|
+
ticket: Ticket,
|
|
28
|
+
"check-square": CheckSquare,
|
|
29
|
+
};
|
|
30
|
+
export function ResourceIcon({ name, className }) {
|
|
31
|
+
const Icon = ICONS[name] ?? Folder;
|
|
32
|
+
return _jsx(Icon, { className: className ?? "size-4", "aria-hidden": true });
|
|
33
|
+
}
|
|
34
|
+
/** Visual treatment comes from the active Forge style (styles.css); utilities only size and lay out. */
|
|
35
|
+
const VARIANTS = {
|
|
36
|
+
primary: "forge-btn forge-btn-primary",
|
|
37
|
+
secondary: "forge-btn forge-btn-secondary",
|
|
38
|
+
ghost: "forge-btn forge-btn-ghost",
|
|
39
|
+
danger: "forge-btn forge-btn-danger",
|
|
40
|
+
"danger-ghost": "forge-btn forge-btn-danger-ghost",
|
|
41
|
+
};
|
|
42
|
+
export function Button({ variant = "secondary", size = "md", loading, className, children, ...props }) {
|
|
43
|
+
return (_jsxs("button", { type: "button", ...props, disabled: props.disabled || loading, className: cn("inline-flex items-center justify-center gap-1.5 font-medium", size === "sm" ? "h-7 px-2.5 text-xs" : "h-[var(--forge-control-h)] px-3.5 text-sm", VARIANTS[variant], className), children: [loading && _jsx(LoaderCircle, { className: "size-3.5 animate-spin", "aria-hidden": true }), children] }));
|
|
44
|
+
}
|
|
45
|
+
export const inputClass = "forge-input block w-full px-3 py-[var(--forge-control-y)] text-sm";
|
|
46
|
+
export function Input({ className, ...props }) {
|
|
47
|
+
return _jsx("input", { ...props, className: cn(inputClass, className) });
|
|
48
|
+
}
|
|
49
|
+
export function Textarea({ className, ...props }) {
|
|
50
|
+
return _jsx("textarea", { rows: 4, ...props, className: cn(inputClass, "min-h-20", className) });
|
|
51
|
+
}
|
|
52
|
+
export function Select({ className, children, ...props }) {
|
|
53
|
+
return (_jsx("select", { ...props, className: cn(inputClass, "pr-8", className), children: children }));
|
|
54
|
+
}
|
|
55
|
+
export function Label({ children, htmlFor, required }) {
|
|
56
|
+
return (_jsxs("label", { htmlFor: htmlFor, className: "mb-1.5 block text-sm font-medium text-ink", children: [children, required && _jsx("span", { className: "ml-0.5 text-danger", children: "*" })] }));
|
|
57
|
+
}
|
|
58
|
+
export function FieldShell({ label, htmlFor, required, error, hint, children }) {
|
|
59
|
+
return (_jsxs("div", { children: [_jsx(Label, { htmlFor: htmlFor, required: required, children: label }), children, error ? _jsx("p", { className: "mt-1 text-xs text-danger", children: error }) : hint ? _jsx("p", { className: "mt-1 text-xs text-ink-muted", children: hint }) : null] }));
|
|
60
|
+
}
|
|
61
|
+
const BADGE_TONES = ["#6366f1", "#10b981", "#f59e0b", "#0ea5e9", "#f43f5e", "#8b5cf6"];
|
|
62
|
+
export function Badge({ children, tone }) {
|
|
63
|
+
const color = tone === undefined ? undefined : BADGE_TONES[tone % BADGE_TONES.length];
|
|
64
|
+
return (_jsx("span", { className: "forge-badge inline-flex items-center px-2 py-0.5 text-xs font-medium", style: color ? { "--tone": color } : undefined, children: children }));
|
|
65
|
+
}
|
|
66
|
+
export function Card({ children, className }) {
|
|
67
|
+
return _jsx("div", { className: cn("forge-card", className), children: children });
|
|
68
|
+
}
|
|
69
|
+
export function PageHeader({ title, description, actions }) {
|
|
70
|
+
return (_jsxs("div", { className: "mb-6 flex flex-wrap items-end justify-between gap-4", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("h1", { className: "forge-heading truncate text-xl font-semibold tracking-tight text-ink", children: title }), description && _jsx("p", { className: "mt-1 text-sm text-ink-muted", children: description })] }), actions && _jsx("div", { className: "flex flex-wrap items-center gap-2", children: actions })] }));
|
|
71
|
+
}
|
|
72
|
+
export function Spinner({ label }) {
|
|
73
|
+
const t = useT();
|
|
74
|
+
return (_jsxs("div", { className: "flex items-center justify-center gap-2 py-16 text-sm text-ink-muted", role: "status", children: [_jsx(LoaderCircle, { className: "size-4 animate-spin", "aria-hidden": true }), " ", label ?? t("common.loading")] }));
|
|
75
|
+
}
|
|
76
|
+
export function EmptyState({ title, description, action, illustration }) {
|
|
77
|
+
return (_jsxs("div", { className: "forge-empty flex flex-col items-center justify-center px-6 py-16 text-center", children: [illustration && _jsx(Illustration, { name: illustration, className: "forge-illustration mb-4 text-ink-subtle" }), _jsx("p", { className: "text-sm font-medium text-ink", children: title }), description && _jsx("p", { className: "mt-1 max-w-sm text-sm text-ink-muted", children: description }), action && _jsx("div", { className: "mt-4", children: action })] }));
|
|
78
|
+
}
|
|
79
|
+
export function Alert({ tone = "error", children }) {
|
|
80
|
+
return (_jsx("div", { role: tone === "error" ? "alert" : "status", "data-forge-alert": tone, className: "forge-alert px-3 py-2 text-sm", children: children }));
|
|
81
|
+
}
|
|
82
|
+
const DIALOG_WIDTH = { md: "max-w-md", lg: "max-w-2xl", xl: "max-w-4xl" };
|
|
83
|
+
export function Dialog({ open, onClose, title, children, footer, size = "md", }) {
|
|
84
|
+
const t = useT();
|
|
85
|
+
useEffect(() => {
|
|
86
|
+
if (!open)
|
|
87
|
+
return;
|
|
88
|
+
const onKey = (e) => e.key === "Escape" && onClose();
|
|
89
|
+
window.addEventListener("keydown", onKey);
|
|
90
|
+
return () => window.removeEventListener("keydown", onKey);
|
|
91
|
+
}, [open, onClose]);
|
|
92
|
+
if (!open)
|
|
93
|
+
return null;
|
|
94
|
+
return (_jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center p-4", children: [_jsx("div", { className: "forge-overlay absolute inset-0", onClick: onClose, "aria-hidden": true }), _jsxs("div", { role: "dialog", "aria-modal": "true", "aria-label": title, className: cn("forge-dialog relative flex max-h-[90vh] w-full flex-col", DIALOG_WIDTH[size]), children: [_jsxs("div", { className: "flex items-center justify-between border-b border-line px-5 py-3", children: [_jsx("h2", { className: "text-sm font-semibold text-ink", children: title }), _jsx("button", { type: "button", onClick: onClose, className: "forge-btn forge-btn-ghost p-1", "aria-label": t("common.close"), children: _jsx(X, { className: "size-4" }) })] }), _jsx("div", { className: "min-h-0 overflow-y-auto px-5 py-4 text-sm text-ink", children: children }), footer && _jsx("div", { className: "flex justify-end gap-2 border-t border-line px-5 py-3", children: footer })] })] }));
|
|
95
|
+
}
|
|
96
|
+
export function ConfirmDialog({ open, title, message, confirmLabel, danger, loading, onConfirm, onClose, }) {
|
|
97
|
+
const t = useT();
|
|
98
|
+
return (_jsx(Dialog, { open: open, onClose: onClose, title: title, footer: _jsxs(_Fragment, { children: [_jsx(Button, { onClick: onClose, children: t("common.cancel") }), _jsx(Button, { variant: danger ? "danger" : "primary", loading: loading, onClick: onConfirm, children: confirmLabel ?? t("common.confirm") })] }), children: message }));
|
|
99
|
+
}
|
|
100
|
+
export function Pagination({ page, pages, total, onPage }) {
|
|
101
|
+
const t = useT();
|
|
102
|
+
const nums = new Set([1, pages, page - 1, page, page + 1].filter((n) => n >= 1 && n <= pages));
|
|
103
|
+
const sorted = [...nums].sort((a, b) => a - b);
|
|
104
|
+
return (_jsxs("div", { className: "flex items-center justify-between gap-4 border-t border-line px-4 py-3 text-sm text-ink-muted", children: [_jsx("span", { children: t("pagination.results", { count: total }) }), _jsxs("nav", { className: "flex items-center gap-1", "aria-label": t("pagination.label"), children: [_jsx(Button, { size: "sm", variant: "ghost", disabled: page <= 1, onClick: () => onPage(page - 1), children: t("pagination.previous") }), sorted.map((n, i) => (_jsxs("span", { className: "flex items-center", children: [i > 0 && sorted[i - 1] < n - 1 && _jsx("span", { className: "px-1", children: "\u2026" }), _jsx(Button, { size: "sm", variant: n === page ? "secondary" : "ghost", "aria-current": n === page ? "page" : undefined, onClick: () => onPage(n), children: n })] }, n))), _jsx(Button, { size: "sm", variant: "ghost", disabled: page >= pages, onClick: () => onPage(page + 1), children: t("pagination.next") })] })] }));
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=ui.js.map
|
package/dist/ui.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EACL,GAAG,EACH,SAAS,EACT,SAAS,EACT,QAAQ,EACR,WAAW,EACX,UAAU,EACV,QAAQ,EACR,MAAM,EACN,MAAM,EACN,YAAY,EACZ,IAAI,EACJ,MAAM,EACN,OAAO,EACP,YAAY,EACZ,IAAI,EACJ,GAAG,EACH,MAAM,EACN,KAAK,EACL,CAAC,GAEF,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,SAAS,EAA+H,MAAM,OAAO,CAAC;AAC/J,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,YAAY,EAAyB,MAAM,oBAAoB,CAAC;AAEzE,MAAM,UAAU,EAAE,CAAC,GAAG,OAA8C;IAClE,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,KAAK,GAA+B;IACxC,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,KAAK;IACX,SAAS,EAAE,SAAS;IACpB,QAAQ,EAAE,SAAS;IACnB,WAAW,EAAE,QAAQ;IACrB,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,QAAQ;IAClB,aAAa,EAAE,UAAU;IACzB,IAAI,EAAE,IAAI;IACV,SAAS,EAAE,MAAM;IACjB,OAAO,EAAE,OAAO;IAChB,eAAe,EAAE,YAAY;IAC7B,MAAM,EAAE,MAAM;IACd,cAAc,EAAE,WAAW;CAC5B,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,EAAwC;IACpF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;IACnC,OAAO,KAAC,IAAI,IAAC,SAAS,EAAE,SAAS,IAAI,QAAQ,wBAAgB,CAAC;AAChE,CAAC;AAGD,wGAAwG;AACxG,MAAM,QAAQ,GAA4B;IACxC,OAAO,EAAE,6BAA6B;IACtC,SAAS,EAAE,+BAA+B;IAC1C,KAAK,EAAE,2BAA2B;IAClC,MAAM,EAAE,4BAA4B;IACpC,cAAc,EAAE,kCAAkC;CACnD,CAAC;AAEF,MAAM,UAAU,MAAM,CAAC,EACrB,OAAO,GAAG,WAAW,EACrB,IAAI,GAAG,IAAI,EACX,OAAO,EACP,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EAC+F;IACvG,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,KACT,KAAK,EACT,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,OAAO,EACnC,SAAS,EAAE,EAAE,CACX,6DAA6D,EAC7D,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,2CAA2C,EAClF,QAAQ,CAAC,OAAO,CAAC,EACjB,SAAS,CACV,aAEA,OAAO,IAAI,KAAC,YAAY,IAAC,SAAS,EAAC,uBAAuB,wBAAe,EACzE,QAAQ,IACF,CACV,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,mEAAmE,CAAC;AAE9F,MAAM,UAAU,KAAK,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAyC;IAClF,OAAO,mBAAW,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,GAAI,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA+C;IAC3F,OAAO,mBAAU,IAAI,EAAE,CAAC,KAAM,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,GAAI,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAA2C;IAC/F,OAAO,CACL,oBAAY,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,YAC5D,QAAQ,GACF,CACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAiE;IAClH,OAAO,CACL,iBAAO,OAAO,EAAE,OAAO,EAAE,SAAS,EAAC,2CAA2C,aAC3E,QAAQ,EACR,QAAQ,IAAI,eAAM,SAAS,EAAC,oBAAoB,kBAAS,IACpD,CACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAA+G;IACzL,OAAO,CACL,0BACE,KAAC,KAAK,IAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,YACxC,KAAK,GACA,EACP,QAAQ,EACR,KAAK,CAAC,CAAC,CAAC,YAAG,SAAS,EAAC,0BAA0B,YAAE,KAAK,GAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAG,SAAS,EAAC,6BAA6B,YAAE,IAAI,GAAK,CAAC,CAAC,CAAC,IAAI,IAC9H,CACP,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAEvF,MAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAA0C;IAC9E,MAAM,KAAK,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACtF,OAAO,CACL,eAAM,SAAS,EAAC,sEAAsE,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,QAAQ,EAAE,KAAK,EAA0B,CAAC,CAAC,CAAC,SAAS,YAC3J,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAA+C;IACvF,OAAO,cAAK,SAAS,EAAE,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,YAAG,QAAQ,GAAO,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAsE;IAC5H,OAAO,CACL,eAAK,SAAS,EAAC,qDAAqD,aAClE,eAAK,SAAS,EAAC,SAAS,aACtB,aAAI,SAAS,EAAC,sEAAsE,YAAE,KAAK,GAAM,EAChG,WAAW,IAAI,YAAG,SAAS,EAAC,6BAA6B,YAAE,WAAW,GAAK,IACxE,EACL,OAAO,IAAI,cAAK,SAAS,EAAC,mCAAmC,YAAE,OAAO,GAAO,IAC1E,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAE,KAAK,EAAsB;IACnD,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,OAAO,CACL,eAAK,SAAS,EAAC,qEAAqE,EAAC,IAAI,EAAC,QAAQ,aAChG,KAAC,YAAY,IAAC,SAAS,EAAC,qBAAqB,wBAAe,OAAE,KAAK,IAAI,CAAC,CAAC,gBAAgB,CAAC,IACtF,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAgG;IACnK,OAAO,CACL,eAAK,SAAS,EAAC,8EAA8E,aAC1F,YAAY,IAAI,KAAC,YAAY,IAAC,IAAI,EAAE,YAAY,EAAE,SAAS,EAAC,yCAAyC,GAAG,EACzG,YAAG,SAAS,EAAC,8BAA8B,YAAE,KAAK,GAAK,EACtD,WAAW,IAAI,YAAG,SAAS,EAAC,sCAAsC,YAAE,WAAW,GAAK,EACpF,MAAM,IAAI,cAAK,SAAS,EAAC,MAAM,YAAE,MAAM,GAAO,IAC3C,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,EAAE,IAAI,GAAG,OAAO,EAAE,QAAQ,EAAgE;IAC9G,OAAO,CACL,cAAK,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,sBAAoB,IAAI,EAAE,SAAS,EAAC,+BAA+B,YAChH,QAAQ,GACL,CACP,CAAC;AACJ,CAAC;AAED,MAAM,YAAY,GAAG,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAW,CAAC;AAEnF,MAAM,UAAU,MAAM,CAAC,EACrB,IAAI,EACJ,OAAO,EACP,KAAK,EACL,QAAQ,EACR,MAAM,EACN,IAAI,GAAG,IAAI,GAQZ;IACC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,KAAK,GAAG,CAAC,CAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,EAAE,CAAC;QACpE,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,CACL,eAAK,SAAS,EAAC,yDAAyD,aACtE,cAAK,SAAS,EAAC,gCAAgC,EAAC,OAAO,EAAE,OAAO,wBAAgB,EAChF,eAAK,IAAI,EAAC,QAAQ,gBAAY,MAAM,gBAAa,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,yDAAyD,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,aAClJ,eAAK,SAAS,EAAC,kEAAkE,aAC/E,aAAI,SAAS,EAAC,gCAAgC,YAAE,KAAK,GAAM,EAC3D,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAC,+BAA+B,gBAAa,CAAC,CAAC,cAAc,CAAC,YAC7G,KAAC,CAAC,IAAC,SAAS,EAAC,QAAQ,GAAG,GACjB,IACL,EACN,cAAK,SAAS,EAAC,oDAAoD,YAAE,QAAQ,GAAO,EACnF,MAAM,IAAI,cAAK,SAAS,EAAC,uDAAuD,YAAE,MAAM,GAAO,IAC5F,IACF,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAC5B,IAAI,EACJ,KAAK,EACL,OAAO,EACP,YAAY,EACZ,MAAM,EACN,OAAO,EACP,SAAS,EACT,OAAO,GAUR;IACC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,OAAO,CACL,KAAC,MAAM,IACL,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,MAAM,EACJ,8BACE,KAAC,MAAM,IAAC,OAAO,EAAE,OAAO,YAAG,CAAC,CAAC,eAAe,CAAC,GAAU,EACvD,KAAC,MAAM,IAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,YACjF,YAAY,IAAI,CAAC,CAAC,gBAAgB,CAAC,GAC7B,IACR,YAGJ,OAAO,GACD,CACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAA+E;IACpI,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;IAC/F,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,OAAO,CACL,eAAK,SAAS,EAAC,+FAA+F,aAC5G,yBAAO,CAAC,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,GAAQ,EACxD,eAAK,SAAS,EAAC,yBAAyB,gBAAa,CAAC,CAAC,kBAAkB,CAAC,aACxE,KAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,YACnF,CAAC,CAAC,qBAAqB,CAAC,GAClB,EACR,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACpB,gBAAc,SAAS,EAAC,mBAAmB,aACxC,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,GAAG,CAAC,IAAI,eAAM,SAAS,EAAC,MAAM,uBAAS,EACnE,KAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,kBAAgB,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,YACnI,CAAC,GACK,KAJA,CAAC,CAKL,CACR,CAAC,EACF,KAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAE,IAAI,IAAI,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,YACvF,CAAC,CAAC,iBAAiB,CAAC,GACd,IACL,IACF,CACP,CAAC;AACJ,CAAC"}
|
package/dist/views.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { EntityIR, ResourceMeta } from "@tekki-forge/compiler";
|
|
2
|
+
type Params = Record<string, string>;
|
|
3
|
+
export declare const VIEW_ROW_LIMIT = 500;
|
|
4
|
+
/** List filters without UI-only state, for the views that load many rows at once. */
|
|
5
|
+
export declare function viewQuery(params: Params, fixed?: Params): Params;
|
|
6
|
+
export declare function TruncationNotice({ shown, total }: {
|
|
7
|
+
shown: number;
|
|
8
|
+
total: number;
|
|
9
|
+
}): import("react").JSX.Element | null;
|
|
10
|
+
export declare function BoardView({ entity, resource, params, fixed }: {
|
|
11
|
+
entity: EntityIR;
|
|
12
|
+
resource: ResourceMeta;
|
|
13
|
+
params: Params;
|
|
14
|
+
fixed?: Params;
|
|
15
|
+
}): import("react").JSX.Element;
|
|
16
|
+
export declare function CalendarView({ entity, resource, params, fixed, setParams }: {
|
|
17
|
+
entity: EntityIR;
|
|
18
|
+
resource: ResourceMeta;
|
|
19
|
+
params: Params;
|
|
20
|
+
fixed?: Params;
|
|
21
|
+
setParams: (p: Params) => void;
|
|
22
|
+
}): import("react").JSX.Element;
|
|
23
|
+
export {};
|
package/dist/views.js
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { can, canWriteField, ruleAllowsRecord } from "@tekki-forge/runtime-permissions";
|
|
4
|
+
import { useQuery } from "@tanstack/react-query";
|
|
5
|
+
import { ChevronLeft, ChevronRight, Plus } from "lucide-react";
|
|
6
|
+
import Link from "next/link";
|
|
7
|
+
import { useMemo, useState } from "react";
|
|
8
|
+
import { ApiError, useForge, useMe } from "./context.js";
|
|
9
|
+
import { FieldValue } from "./fields.js";
|
|
10
|
+
import { useRecordChange } from "./record-mutation.js";
|
|
11
|
+
import { Alert, Badge, Button, ConfirmDialog, Spinner, cn } from "./ui.js";
|
|
12
|
+
export const VIEW_ROW_LIMIT = 500;
|
|
13
|
+
/** List filters without UI-only state, for the views that load many rows at once. */
|
|
14
|
+
export function viewQuery(params, fixed) {
|
|
15
|
+
const { page: _page, pageSize: _size, view: _view, month: _month, ...rest } = params;
|
|
16
|
+
return { ...rest, ...fixed, pageSize: String(VIEW_ROW_LIMIT) };
|
|
17
|
+
}
|
|
18
|
+
export function TruncationNotice({ shown, total }) {
|
|
19
|
+
const { t } = useForge();
|
|
20
|
+
if (total <= shown)
|
|
21
|
+
return null;
|
|
22
|
+
return (_jsx("p", { className: "border-b border-line px-4 py-2 text-xs text-ink-muted", children: t("views.truncated", { shown, total }) }));
|
|
23
|
+
}
|
|
24
|
+
function useViewRows(resource, query) {
|
|
25
|
+
const { api } = useForge();
|
|
26
|
+
return useQuery({ queryKey: ["resource", resource.path, "list", query], queryFn: () => api(`/${resource.path}`, { query }) });
|
|
27
|
+
}
|
|
28
|
+
const NONE = "__none";
|
|
29
|
+
export function BoardView({ entity, resource, params, fixed }) {
|
|
30
|
+
const board = entity.views.board;
|
|
31
|
+
const field = entity.fields.find((f) => f.name === board.groupBy);
|
|
32
|
+
const workflow = entity.workflow?.field === field.name ? entity.workflow : undefined;
|
|
33
|
+
const { t } = useForge();
|
|
34
|
+
const { principal } = useMe();
|
|
35
|
+
const list = useViewRows(resource, viewQuery(params, fixed));
|
|
36
|
+
const change = useRecordChange(resource);
|
|
37
|
+
const [dragging, setDragging] = useState(null);
|
|
38
|
+
const [over, setOver] = useState(null);
|
|
39
|
+
const [confirm, setConfirm] = useState(null);
|
|
40
|
+
const [error, setError] = useState(null);
|
|
41
|
+
const rows = list.data?.data ?? [];
|
|
42
|
+
const keyOf = (row) => {
|
|
43
|
+
if (field.relation)
|
|
44
|
+
return row[field.relation.foreignKey] ?? NONE;
|
|
45
|
+
if (field.kind === "boolean")
|
|
46
|
+
return String(!!row[field.name]);
|
|
47
|
+
return row[field.name] ?? NONE;
|
|
48
|
+
};
|
|
49
|
+
const columns = useMemo(() => {
|
|
50
|
+
if (field.kind === "enum") {
|
|
51
|
+
const cols = field.enumValues.map((v, i) => ({ key: v.value, label: v.label, value: v.value, tone: i }));
|
|
52
|
+
return field.required && !rows.some((r) => keyOf(r) === NONE) ? cols : [...cols, { key: NONE, label: t("common.none"), value: null }];
|
|
53
|
+
}
|
|
54
|
+
if (field.kind === "boolean")
|
|
55
|
+
return [{ key: "true", label: t("common.yes"), value: true, tone: 1 }, { key: "false", label: t("common.no"), value: false }];
|
|
56
|
+
const seen = new Map();
|
|
57
|
+
for (const r of rows)
|
|
58
|
+
if (r[field.name])
|
|
59
|
+
seen.set(r[field.name].id, r[field.name].label);
|
|
60
|
+
const cols = [...seen].sort((a, b) => a[1].localeCompare(b[1])).map(([id, label]) => ({ key: id, label, value: id }));
|
|
61
|
+
return field.required ? cols : [...cols, { key: NONE, label: t("common.none"), value: null }];
|
|
62
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
63
|
+
}, [rows, field, t]);
|
|
64
|
+
/** The transition (workflow) or permission that allows moving `row` into `col`; null when not allowed. */
|
|
65
|
+
const moveFor = (row, col) => {
|
|
66
|
+
if (keyOf(row) === col.key || row.deletedAt)
|
|
67
|
+
return null;
|
|
68
|
+
if (workflow) {
|
|
69
|
+
const tr = workflow.transitions.find((x) => x.to === col.value && (x.from.length === 0 || x.from.includes(row[field.name])) && ruleAllowsRecord(entity, x.permission, principal, row));
|
|
70
|
+
return tr ? { transition: tr } : null;
|
|
71
|
+
}
|
|
72
|
+
if (col.value === null && field.required)
|
|
73
|
+
return null;
|
|
74
|
+
return canWriteField(entity, field.name, principal, row) ? {} : null;
|
|
75
|
+
};
|
|
76
|
+
const move = (row, col, confirmed = false) => {
|
|
77
|
+
const m = moveFor(row, col);
|
|
78
|
+
if (!m)
|
|
79
|
+
return;
|
|
80
|
+
setError(null);
|
|
81
|
+
if (m.transition && (m.transition.confirm || m.transition.variant === "danger") && !confirmed) {
|
|
82
|
+
setConfirm({ row, transition: m.transition });
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const optimistic = field.relation
|
|
86
|
+
? { [field.relation.foreignKey]: col.value, [field.name]: col.value ? { id: col.value, label: col.label } : null }
|
|
87
|
+
: { [field.name]: col.value };
|
|
88
|
+
const patch = field.relation ? { [field.relation.foreignKey]: col.value } : { [field.apiName]: col.value };
|
|
89
|
+
change.mutate({ id: row.id, ...(m.transition ? { transition: m.transition.name } : { patch }), optimistic }, { onError: (e) => setError(e instanceof ApiError ? e.message : t("views.board.moveFailed")) });
|
|
90
|
+
};
|
|
91
|
+
if (list.isLoading)
|
|
92
|
+
return _jsx(Spinner, {});
|
|
93
|
+
if (list.error)
|
|
94
|
+
return _jsx("div", { className: "p-3", children: _jsx(Alert, { children: list.error.message }) });
|
|
95
|
+
return (_jsxs("div", { children: [_jsx(TruncationNotice, { shown: rows.length, total: list.data?.meta.total ?? 0 }), error && (_jsx("div", { className: "p-3 pb-0", children: _jsx(Alert, { children: error }) })), _jsx("div", { className: "flex gap-3 overflow-x-auto p-3", role: "list", "aria-label": t("views.board.label", { items: resource.pluralLabel, field: field.label.toLowerCase() }), children: columns.map((col) => {
|
|
96
|
+
const cards = rows.filter((r) => keyOf(r) === col.key);
|
|
97
|
+
const droppable = dragging ? !!moveFor(dragging, col) : false;
|
|
98
|
+
return (_jsxs("section", { role: "listitem", "aria-label": col.label, "data-forge-column": col.key, onDragOver: (e) => {
|
|
99
|
+
if (!droppable)
|
|
100
|
+
return;
|
|
101
|
+
e.preventDefault();
|
|
102
|
+
e.dataTransfer.dropEffect = "move";
|
|
103
|
+
setOver(col.key);
|
|
104
|
+
}, onDragLeave: () => setOver((o) => (o === col.key ? null : o)), onDrop: (e) => {
|
|
105
|
+
e.preventDefault();
|
|
106
|
+
setOver(null);
|
|
107
|
+
if (dragging)
|
|
108
|
+
move(dragging, col);
|
|
109
|
+
setDragging(null);
|
|
110
|
+
}, className: cn("forge-board-column flex w-72 shrink-0 flex-col rounded-[var(--forge-radius)] bg-surface-muted/60 transition-opacity", dragging && !droppable && keyOf(dragging) !== col.key && "opacity-50", over === col.key && "ring-2 ring-primary"), children: [_jsxs("header", { className: "flex items-center justify-between px-3 py-2", children: [col.tone !== undefined ? _jsx(Badge, { tone: col.tone, children: col.label }) : _jsx("span", { className: "text-xs font-medium text-ink-muted", children: col.label }), _jsx("span", { className: "text-xs text-ink-subtle tabular-nums", children: cards.length })] }), _jsx("ul", { className: "flex min-h-24 flex-col gap-2 px-2 pb-2", children: cards.map((row) => {
|
|
111
|
+
const targets = columns.filter((c) => moveFor(row, c));
|
|
112
|
+
return (_jsxs("li", { draggable: targets.length > 0, onDragStart: (e) => {
|
|
113
|
+
e.dataTransfer.setData("text/plain", row.id);
|
|
114
|
+
e.dataTransfer.effectAllowed = "move";
|
|
115
|
+
setDragging(row);
|
|
116
|
+
}, onDragEnd: () => {
|
|
117
|
+
setDragging(null);
|
|
118
|
+
setOver(null);
|
|
119
|
+
}, className: cn("forge-card group p-3 text-sm", targets.length > 0 && "cursor-grab active:cursor-grabbing", dragging?.id === row.id && "opacity-40"), children: [_jsx(Link, { href: `/${resource.path}/${row.id}`, className: "block font-medium text-ink hover:text-link", draggable: false, children: row[board.title] ? String(row[board.title]) : t("common.untitled") }), board.fields.length > 0 && (_jsx("dl", { className: "mt-2 space-y-1 text-xs", children: board.fields.map((name) => {
|
|
120
|
+
const f = entity.fields.find((x) => x.name === name);
|
|
121
|
+
return (_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx("dt", { className: "text-ink-subtle", children: f?.label ?? name }), _jsx("dd", { className: "min-w-0 truncate text-right text-ink-muted", children: _jsx(FieldValue, { field: f, value: row[name], cell: f ? undefined : "datetime" }) })] }, name));
|
|
122
|
+
}) })), targets.length > 0 && (_jsxs("select", { "aria-label": t("views.board.moveCard", { card: String(row[board.title] ?? t("views.board.card")) }), value: "", onChange: (e) => {
|
|
123
|
+
const col = columns.find((c) => c.key === e.target.value);
|
|
124
|
+
if (col)
|
|
125
|
+
move(row, col);
|
|
126
|
+
}, className: "forge-input mt-2 h-7 w-full px-2 py-0 text-xs opacity-0 focus:opacity-100 group-hover:opacity-100", children: [_jsx("option", { value: "", children: workflow ? t("views.board.moveTo") : t("views.board.setField", { field: field.label.toLowerCase() }) }), targets.map((c) => (_jsx("option", { value: c.key, children: moveFor(row, c)?.transition?.label ?? c.label }, c.key)))] }))] }, row.id));
|
|
127
|
+
}) })] }, col.key));
|
|
128
|
+
}) }), _jsx(ConfirmDialog, { open: !!confirm, title: confirm?.transition.label ?? "", message: confirm?.transition.confirm ?? t("detail.transitionConfirm", { item: resource.label.toLowerCase(), state: columns.find((x) => x.value === confirm?.transition.to)?.label ?? confirm?.transition.to.replaceAll("_", " ") ?? "" }), danger: confirm?.transition.variant === "danger", confirmLabel: confirm?.transition.label ?? t("common.confirm"), onConfirm: () => {
|
|
129
|
+
const c = confirm;
|
|
130
|
+
setConfirm(null);
|
|
131
|
+
const col = columns.find((x) => x.value === c.transition.to);
|
|
132
|
+
if (col)
|
|
133
|
+
move(c.row, col, true);
|
|
134
|
+
}, onClose: () => setConfirm(null) })] }));
|
|
135
|
+
}
|
|
136
|
+
// ─── Calendar ─────────────────────────────────────────────────────────────────────────────
|
|
137
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
138
|
+
/** Local calendar day of a Date as YYYY-MM-DD. */
|
|
139
|
+
const dayKey = (d) => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
|
|
140
|
+
const parseDay = (key) => {
|
|
141
|
+
const [y, m, d] = key.split("-").map(Number);
|
|
142
|
+
return new Date(y, m - 1, d);
|
|
143
|
+
};
|
|
144
|
+
const addDays = (key, n) => {
|
|
145
|
+
const d = parseDay(key);
|
|
146
|
+
d.setDate(d.getDate() + n);
|
|
147
|
+
return dayKey(d);
|
|
148
|
+
};
|
|
149
|
+
const daysBetween = (a, b) => Math.round((parseDay(b).getTime() - parseDay(a).getTime()) / 86_400_000);
|
|
150
|
+
const MAX_PER_DAY = 3;
|
|
151
|
+
export function CalendarView({ entity, resource, params, fixed, setParams }) {
|
|
152
|
+
const cal = entity.views.calendar;
|
|
153
|
+
const dateField = entity.fields.find((f) => f.name === cal.date);
|
|
154
|
+
const endField = cal.end ? entity.fields.find((f) => f.name === cal.end) : undefined;
|
|
155
|
+
const { locale, t } = useForge();
|
|
156
|
+
const { principal } = useMe();
|
|
157
|
+
const change = useRecordChange(resource);
|
|
158
|
+
const [expanded, setExpanded] = useState(null);
|
|
159
|
+
const [error, setError] = useState(null);
|
|
160
|
+
const [overDay, setOverDay] = useState(null);
|
|
161
|
+
const [dragging, setDragging] = useState(null);
|
|
162
|
+
const today = dayKey(new Date());
|
|
163
|
+
const month = /^\d{4}-\d{2}$/.test(params.month ?? "") ? params.month : today.slice(0, 7);
|
|
164
|
+
const first = parseDay(`${month}-01`);
|
|
165
|
+
const gridStart = addDays(`${month}-01`, -((first.getDay() + 6) % 7)); // Monday
|
|
166
|
+
const days = Array.from({ length: 42 }, (_, i) => addDays(gridStart, i));
|
|
167
|
+
const gridEnd = days[41];
|
|
168
|
+
// Items that start before the grid but end inside it are included when there is an end field.
|
|
169
|
+
const from = endField ? addDays(gridStart, -62) : gridStart;
|
|
170
|
+
const bound = (key, end) => (dateField.kind === "date" ? key : (end ? new Date(parseDay(addDays(key, 1)).getTime() - 1) : parseDay(key)).toISOString());
|
|
171
|
+
const query = { ...viewQuery(params, fixed), sort: cal.date, [`${cal.date}.gte`]: bound(from, false), [`${cal.date}.lte`]: bound(gridEnd, true) };
|
|
172
|
+
const list = useViewRows(resource, query);
|
|
173
|
+
const keyOfValue = (kind, v) => (v ? (kind === "date" ? String(v).slice(0, 10) : dayKey(new Date(String(v)))) : null);
|
|
174
|
+
const items = (list.data?.data ?? [])
|
|
175
|
+
.map((row) => {
|
|
176
|
+
const start = keyOfValue(dateField.kind, row[cal.date]);
|
|
177
|
+
const endRaw = endField ? keyOfValue(endField.kind, row[endField.name]) : null;
|
|
178
|
+
return start ? { row, start, end: endRaw && endRaw >= start ? endRaw : start } : null;
|
|
179
|
+
})
|
|
180
|
+
.filter((x) => !!x && x.end >= gridStart && x.start <= gridEnd);
|
|
181
|
+
const canMove = (row) => canWriteField(entity, dateField.name, principal, row) && (!endField || canWriteField(entity, endField.name, principal, row));
|
|
182
|
+
const canCreate = can(entity, "create", principal);
|
|
183
|
+
const shift = (value, kind, delta) => {
|
|
184
|
+
if (!value)
|
|
185
|
+
return value;
|
|
186
|
+
if (kind === "date")
|
|
187
|
+
return addDays(String(value).slice(0, 10), delta);
|
|
188
|
+
const d = new Date(String(value));
|
|
189
|
+
d.setDate(d.getDate() + delta); // local days keep the wall-clock time across DST changes
|
|
190
|
+
return d.toISOString();
|
|
191
|
+
};
|
|
192
|
+
const moveTo = (item, day) => {
|
|
193
|
+
const delta = daysBetween(item.start, day);
|
|
194
|
+
if (!delta || !canMove(item.row))
|
|
195
|
+
return;
|
|
196
|
+
setError(null);
|
|
197
|
+
const patch = { [dateField.apiName]: shift(item.row[cal.date], dateField.kind, delta) };
|
|
198
|
+
if (endField && item.row[endField.name])
|
|
199
|
+
patch[endField.apiName] = shift(item.row[endField.name], endField.kind, delta);
|
|
200
|
+
change.mutate({ id: item.row.id, patch, optimistic: patch }, { onError: (e) => setError(e instanceof ApiError ? e.message : t("views.calendar.rescheduleFailed")) });
|
|
201
|
+
};
|
|
202
|
+
const monthLabel = new Intl.DateTimeFormat(locale, { month: "long", year: "numeric" }).format(first);
|
|
203
|
+
const weekdays = Array.from({ length: 7 }, (_, i) => new Intl.DateTimeFormat(locale, { weekday: "short" }).format(parseDay(addDays(gridStart, i))));
|
|
204
|
+
const goto = (m) => setParams({ ...params, month: m });
|
|
205
|
+
const shiftMonth = (n) => {
|
|
206
|
+
const d = new Date(first);
|
|
207
|
+
d.setMonth(d.getMonth() + n);
|
|
208
|
+
goto(dayKey(d).slice(0, 7));
|
|
209
|
+
};
|
|
210
|
+
return (_jsxs("div", { children: [_jsxs("div", { className: "flex items-center gap-2 border-b border-line px-3 py-2", children: [_jsx("h2", { className: "text-sm font-semibold text-ink capitalize", "aria-live": "polite", children: monthLabel }), _jsxs("div", { className: "ml-auto flex items-center gap-1", children: [_jsx(Button, { size: "sm", variant: "ghost", "aria-label": t("views.calendar.previousMonth"), onClick: () => shiftMonth(-1), children: _jsx(ChevronLeft, { className: "size-4" }) }), _jsx(Button, { size: "sm", onClick: () => goto(today.slice(0, 7)), children: t("views.calendar.today") }), _jsx(Button, { size: "sm", variant: "ghost", "aria-label": t("views.calendar.nextMonth"), onClick: () => shiftMonth(1), children: _jsx(ChevronRight, { className: "size-4" }) })] })] }), list.data && _jsx(TruncationNotice, { shown: list.data.data.length, total: list.data.meta.total }), (error || list.error) && (_jsx("div", { className: "p-3 pb-0", children: _jsx(Alert, { children: error ?? list.error?.message }) })), _jsx("div", { className: cn("overflow-x-auto", list.isFetching && "opacity-80"), children: _jsxs("div", { className: "grid min-w-[42rem] grid-cols-7 text-xs", role: "grid", "aria-label": t("views.calendar.label", { items: resource.pluralLabel, month: monthLabel }), children: [weekdays.map((w) => (_jsx("div", { role: "columnheader", className: "border-b border-line px-2 py-1.5 font-medium text-ink-subtle", children: w }, w))), days.map((day) => {
|
|
211
|
+
const inMonth = day.startsWith(month);
|
|
212
|
+
const dayItems = items.filter((it) => it.start <= day && it.end >= day);
|
|
213
|
+
const visible = expanded === day ? dayItems : dayItems.slice(0, MAX_PER_DAY);
|
|
214
|
+
return (_jsxs("div", { role: "gridcell", "aria-label": parseDay(day).toLocaleDateString(locale, { dateStyle: "full" }), "data-forge-day": day, onDragOver: (e) => {
|
|
215
|
+
if (!dragging)
|
|
216
|
+
return;
|
|
217
|
+
e.preventDefault();
|
|
218
|
+
setOverDay(day);
|
|
219
|
+
}, onDragLeave: () => setOverDay((d) => (d === day ? null : d)), onDrop: (e) => {
|
|
220
|
+
e.preventDefault();
|
|
221
|
+
setOverDay(null);
|
|
222
|
+
if (dragging)
|
|
223
|
+
moveTo(dragging, day);
|
|
224
|
+
setDragging(null);
|
|
225
|
+
}, className: cn("group relative min-h-28 border-r border-b border-line p-1", !inMonth && "bg-surface-muted/40 text-ink-subtle", overDay === day && "ring-2 ring-primary ring-inset"), children: [_jsxs("div", { className: "flex items-center justify-between px-1", children: [_jsx("span", { className: cn("inline-flex size-6 items-center justify-center rounded-full tabular-nums", day === today && "bg-primary font-semibold text-primary-foreground"), children: Number(day.slice(8)) }), canCreate && (_jsx(Link, { href: `/${resource.path}/new?${new URLSearchParams({ ...Object.fromEntries(Object.entries(fixed ?? {}).map(([k, v]) => [`${k}Id`, v])), [dateField.apiName]: dateField.kind === "date" ? day : `${day}T09:00` }).toString()}`, "aria-label": t("views.calendar.newOn", { item: resource.label.toLowerCase(), date: day }), className: "forge-btn forge-btn-ghost p-0.5 opacity-0 group-hover:opacity-100 focus:opacity-100", children: _jsx(Plus, { className: "size-3.5" }) }))] }), _jsx("ul", { className: "mt-1 space-y-0.5", children: visible.map((it) => {
|
|
226
|
+
const movable = canMove(it.row);
|
|
227
|
+
const time = dateField.kind === "datetime" && it.start === day ? new Date(String(it.row[cal.date])).toLocaleTimeString(locale, { hour: "2-digit", minute: "2-digit" }) : null;
|
|
228
|
+
return (_jsx("li", { draggable: movable, onDragStart: (e) => {
|
|
229
|
+
e.dataTransfer.setData("text/plain", it.row.id);
|
|
230
|
+
setDragging(it);
|
|
231
|
+
}, onDragEnd: () => {
|
|
232
|
+
setDragging(null);
|
|
233
|
+
setOverDay(null);
|
|
234
|
+
}, children: _jsxs(Link, { href: `/${resource.path}/${it.row.id}`, draggable: false, className: cn("forge-calendar-item block truncate rounded px-1.5 py-0.5 text-[11px] leading-4", it.start < day ? "rounded-l-none" : "", it.end > day ? "rounded-r-none" : "", movable && "cursor-grab"), title: String(it.row[cal.title] ?? t("common.untitled")), children: [time && _jsx("span", { className: "mr-1 tabular-nums opacity-70", children: time }), String(it.row[cal.title] ?? t("common.untitled"))] }) }, it.row.id));
|
|
235
|
+
}) }), dayItems.length > MAX_PER_DAY && (_jsx("button", { type: "button", onClick: () => setExpanded(expanded === day ? null : day), className: "mt-0.5 px-1.5 text-[11px] text-ink-muted hover:text-link", children: expanded === day ? t("views.calendar.showLess") : t("views.calendar.more", { count: dayItems.length - MAX_PER_DAY }) }))] }, day));
|
|
236
|
+
})] }) })] }));
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.js","sourceRoot":"","sources":["../src/views.tsx"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tekki-forge/runtime-admin",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Forge admin runtime: metadata-driven React/Next.js UI for resources, auth, users and audit logs",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"code-generator",
|
|
7
|
+
"forge",
|
|
8
|
+
"full-stack",
|
|
9
|
+
"tekki-forge"
|
|
10
|
+
],
|
|
11
|
+
"author": "Mahy KANE",
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"type": "module",
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"default": "./dist/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./styles.css": "./styles.css"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist",
|
|
25
|
+
"styles.css"
|
|
26
|
+
],
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=22"
|
|
29
|
+
},
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public"
|
|
32
|
+
},
|
|
33
|
+
"sideEffects": false,
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@tanstack/react-query": "^5.104.0",
|
|
36
|
+
"lucide-react": "^1.49.0",
|
|
37
|
+
"@tekki-forge/runtime-permissions": "^0.1.0",
|
|
38
|
+
"@tekki-forge/runtime-schema": "^0.1.0",
|
|
39
|
+
"@tekki-forge/compiler": "^0.1.0",
|
|
40
|
+
"@tekki-forge/runtime-auth": "^0.1.0"
|
|
41
|
+
},
|
|
42
|
+
"peerDependencies": {
|
|
43
|
+
"next": "^16.0.0",
|
|
44
|
+
"react": "^19.0.0",
|
|
45
|
+
"react-dom": "^19.0.0"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@types/react": "^19.2.0",
|
|
49
|
+
"@types/react-dom": "^19.2.0",
|
|
50
|
+
"next": "16.3.7",
|
|
51
|
+
"react": "19.3.0",
|
|
52
|
+
"react-dom": "19.3.0"
|
|
53
|
+
},
|
|
54
|
+
"scripts": {
|
|
55
|
+
"build": "tsc -p tsconfig.json",
|
|
56
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
57
|
+
}
|
|
58
|
+
}
|