@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.
Files changed (138) hide show
  1. package/README.md +5 -0
  2. package/dist/account.d.ts +1 -0
  3. package/dist/account.js +105 -0
  4. package/dist/account.js.map +1 -0
  5. package/dist/activity.d.ts +65 -0
  6. package/dist/activity.js +299 -0
  7. package/dist/activity.js.map +1 -0
  8. package/dist/admin-access.d.ts +4 -0
  9. package/dist/admin-access.js +177 -0
  10. package/dist/admin-access.js.map +1 -0
  11. package/dist/admin.d.ts +5 -0
  12. package/dist/admin.js +129 -0
  13. package/dist/admin.js.map +1 -0
  14. package/dist/auth-pages.d.ts +13 -0
  15. package/dist/auth-pages.js +207 -0
  16. package/dist/auth-pages.js.map +1 -0
  17. package/dist/brand-art.d.ts +24 -0
  18. package/dist/brand-art.js +33 -0
  19. package/dist/brand-art.js.map +1 -0
  20. package/dist/brand.d.ts +11 -0
  21. package/dist/brand.js +16 -0
  22. package/dist/brand.js.map +1 -0
  23. package/dist/charts.d.ts +23 -0
  24. package/dist/charts.js +259 -0
  25. package/dist/charts.js.map +1 -0
  26. package/dist/command-palette.d.ts +9 -0
  27. package/dist/command-palette.js +115 -0
  28. package/dist/command-palette.js.map +1 -0
  29. package/dist/context.d.ts +242 -0
  30. package/dist/context.js +107 -0
  31. package/dist/context.js.map +1 -0
  32. package/dist/dashboard.d.ts +66 -0
  33. package/dist/dashboard.js +144 -0
  34. package/dist/dashboard.js.map +1 -0
  35. package/dist/fields.d.ts +71 -0
  36. package/dist/fields.js +326 -0
  37. package/dist/fields.js.map +1 -0
  38. package/dist/i18n/catalog.d.ts +7 -0
  39. package/dist/i18n/catalog.js +23 -0
  40. package/dist/i18n/catalog.js.map +1 -0
  41. package/dist/i18n/locale.d.ts +15 -0
  42. package/dist/i18n/locale.js +69 -0
  43. package/dist/i18n/locale.js.map +1 -0
  44. package/dist/i18n/messages/de.d.ts +3 -0
  45. package/dist/i18n/messages/de.js +627 -0
  46. package/dist/i18n/messages/de.js.map +1 -0
  47. package/dist/i18n/messages/en.d.ts +3 -0
  48. package/dist/i18n/messages/en.js +627 -0
  49. package/dist/i18n/messages/en.js.map +1 -0
  50. package/dist/i18n/messages/es.d.ts +3 -0
  51. package/dist/i18n/messages/es.js +627 -0
  52. package/dist/i18n/messages/es.js.map +1 -0
  53. package/dist/i18n/messages/fr.d.ts +3 -0
  54. package/dist/i18n/messages/fr.js +627 -0
  55. package/dist/i18n/messages/fr.js.map +1 -0
  56. package/dist/i18n/messages/pt.d.ts +3 -0
  57. package/dist/i18n/messages/pt.js +627 -0
  58. package/dist/i18n/messages/pt.js.map +1 -0
  59. package/dist/i18n/validation.d.ts +3 -0
  60. package/dist/i18n/validation.js +36 -0
  61. package/dist/i18n/validation.js.map +1 -0
  62. package/dist/illustrations.d.ts +6 -0
  63. package/dist/illustrations.js +16 -0
  64. package/dist/illustrations.js.map +1 -0
  65. package/dist/import-dialog.d.ts +11 -0
  66. package/dist/import-dialog.js +152 -0
  67. package/dist/import-dialog.js.map +1 -0
  68. package/dist/index.d.ts +38 -0
  69. package/dist/index.js +39 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/inline-edit.d.ts +18 -0
  72. package/dist/inline-edit.js +115 -0
  73. package/dist/inline-edit.js.map +1 -0
  74. package/dist/landing.d.ts +79 -0
  75. package/dist/landing.js +122 -0
  76. package/dist/landing.js.map +1 -0
  77. package/dist/locale-switcher.d.ts +4 -0
  78. package/dist/locale-switcher.js +15 -0
  79. package/dist/locale-switcher.js.map +1 -0
  80. package/dist/map.d.ts +26 -0
  81. package/dist/map.js +232 -0
  82. package/dist/map.js.map +1 -0
  83. package/dist/notifications.d.ts +12 -0
  84. package/dist/notifications.js +75 -0
  85. package/dist/notifications.js.map +1 -0
  86. package/dist/record-mutation.d.ts +19 -0
  87. package/dist/record-mutation.js +39 -0
  88. package/dist/record-mutation.js.map +1 -0
  89. package/dist/resource-detail.d.ts +4 -0
  90. package/dist/resource-detail.js +96 -0
  91. package/dist/resource-detail.js.map +1 -0
  92. package/dist/resource-form.d.ts +11 -0
  93. package/dist/resource-form.js +92 -0
  94. package/dist/resource-form.js.map +1 -0
  95. package/dist/resource-list.d.ts +10 -0
  96. package/dist/resource-list.js +154 -0
  97. package/dist/resource-list.js.map +1 -0
  98. package/dist/saved-views.d.ts +16 -0
  99. package/dist/saved-views.js +64 -0
  100. package/dist/saved-views.js.map +1 -0
  101. package/dist/schema-editor-diagram.d.ts +14 -0
  102. package/dist/schema-editor-diagram.js +54 -0
  103. package/dist/schema-editor-diagram.js.map +1 -0
  104. package/dist/schema-editor.d.ts +98 -0
  105. package/dist/schema-editor.js +571 -0
  106. package/dist/schema-editor.js.map +1 -0
  107. package/dist/shell.d.ts +10 -0
  108. package/dist/shell.js +228 -0
  109. package/dist/shell.js.map +1 -0
  110. package/dist/skeleton.d.ts +25 -0
  111. package/dist/skeleton.js +34 -0
  112. package/dist/skeleton.js.map +1 -0
  113. package/dist/theme-catalog.d.ts +71 -0
  114. package/dist/theme-catalog.js +55 -0
  115. package/dist/theme-catalog.js.map +1 -0
  116. package/dist/theme-head.d.ts +8 -0
  117. package/dist/theme-head.js +11 -0
  118. package/dist/theme-head.js.map +1 -0
  119. package/dist/theme-preview.d.ts +2 -0
  120. package/dist/theme-preview.js +23 -0
  121. package/dist/theme-preview.js.map +1 -0
  122. package/dist/theme-switcher.d.ts +20 -0
  123. package/dist/theme-switcher.js +159 -0
  124. package/dist/theme-switcher.js.map +1 -0
  125. package/dist/theme.d.ts +24 -0
  126. package/dist/theme.js +30 -0
  127. package/dist/theme.js.map +1 -0
  128. package/dist/toast.d.ts +21 -0
  129. package/dist/toast.js +51 -0
  130. package/dist/toast.js.map +1 -0
  131. package/dist/ui.d.ts +86 -0
  132. package/dist/ui.js +106 -0
  133. package/dist/ui.js.map +1 -0
  134. package/dist/views.d.ts +23 -0
  135. package/dist/views.js +238 -0
  136. package/dist/views.js.map +1 -0
  137. package/package.json +58 -0
  138. package/styles.css +778 -0
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # @tekki-forge/runtime-admin
2
+
3
+ Forge admin runtime: metadata-driven React/Next.js UI for resources, auth, users and audit logs.
4
+
5
+ Part of [Tekki Forge](https://www.npmjs.com/package/tekki-forge), which turns a `forge.config.ts` into a production-ready full-stack app. Apps created with `forge new` install this package for you; see the [tekki-forge](https://www.npmjs.com/package/tekki-forge) package for the documentation.
@@ -0,0 +1 @@
1
+ export declare function AccountPage(): import("react").JSX.Element | null;
@@ -0,0 +1,105 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useQuery, useQueryClient } from "@tanstack/react-query";
4
+ import { useState } from "react";
5
+ import { useForge, useT } from "./context.js";
6
+ import { Alert, Button, Card, FieldShell, Input, PageHeader } from "./ui.js";
7
+ function Section({ title, description, children }) {
8
+ return (_jsxs(Card, { className: "p-6", children: [_jsx("h2", { className: "text-sm font-semibold text-ink", children: title }), description && _jsx("p", { className: "mt-1 text-sm text-ink-muted", children: description }), _jsx("div", { className: "mt-5", children: children })] }));
9
+ }
10
+ function useAction() {
11
+ const [state, setState] = useState(null);
12
+ const [loading, setLoading] = useState(false);
13
+ const t = useT();
14
+ const run = async (fn, success) => {
15
+ setLoading(true);
16
+ setState(null);
17
+ try {
18
+ const res = await fn();
19
+ if (res?.error)
20
+ setState({ tone: "error", text: res.error.message ?? t("common.somethingWentWrong") });
21
+ else if (success)
22
+ setState({ tone: "success", text: success });
23
+ return res;
24
+ }
25
+ finally {
26
+ setLoading(false);
27
+ }
28
+ };
29
+ return { state, loading, run, notice: state && _jsx(Alert, { tone: state.tone, children: state.text }) };
30
+ }
31
+ export function AccountPage() {
32
+ const { app, auth, t } = useForge();
33
+ const session = auth.useSession();
34
+ const user = session.data?.user;
35
+ if (!user)
36
+ return null;
37
+ return (_jsxs("div", { className: "mx-auto max-w-2xl space-y-6", children: [_jsx(PageHeader, { title: t("account.title"), description: user.email }), _jsx(ProfileSection, { initialName: user.name }), app.auth.emailPassword && _jsx(PasswordSection, {}), app.auth.twoFactor && _jsx(TwoFactorSection, { enabled: !!user.twoFactorEnabled }), app.auth.passkeys && _jsx(PasskeySection, {}), _jsx(SessionsSection, { currentToken: session.data?.session.token })] }));
38
+ }
39
+ function ProfileSection({ initialName }) {
40
+ const { auth, t } = useForge();
41
+ const queryClient = useQueryClient();
42
+ const [name, setName] = useState(initialName);
43
+ const a = useAction();
44
+ return (_jsx(Section, { title: t("account.profile"), children: _jsxs("form", { className: "space-y-4", onSubmit: (e) => {
45
+ e.preventDefault();
46
+ a.run(async () => {
47
+ const r = await auth.updateUser({ name });
48
+ await queryClient.invalidateQueries();
49
+ return r;
50
+ }, t("account.profileUpdated"));
51
+ }, children: [a.notice, _jsx(FieldShell, { label: t("account.name"), htmlFor: "profile-name", children: _jsx(Input, { id: "profile-name", value: name, onChange: (e) => setName(e.target.value), required: true }) }), _jsx(Button, { type: "submit", variant: "primary", loading: a.loading, children: t("common.save") })] }) }));
52
+ }
53
+ function PasswordSection() {
54
+ const { auth, t } = useForge();
55
+ const [form, setForm] = useState({ currentPassword: "", newPassword: "" });
56
+ const a = useAction();
57
+ return (_jsx(Section, { title: t("account.password"), children: _jsxs("form", { className: "space-y-4", onSubmit: (e) => {
58
+ e.preventDefault();
59
+ a.run(() => auth.changePassword({ ...form, revokeOtherSessions: true }), t("account.passwordChanged")).then(() => setForm({ currentPassword: "", newPassword: "" }));
60
+ }, children: [a.notice, _jsx(FieldShell, { label: t("account.currentPassword"), htmlFor: "current-password", children: _jsx(Input, { id: "current-password", type: "password", autoComplete: "current-password", required: true, value: form.currentPassword, onChange: (e) => setForm({ ...form, currentPassword: e.target.value }) }) }), _jsx(FieldShell, { label: t("account.newPassword"), htmlFor: "new-password", children: _jsx(Input, { id: "new-password", type: "password", autoComplete: "new-password", minLength: 8, required: true, value: form.newPassword, onChange: (e) => setForm({ ...form, newPassword: e.target.value }) }) }), _jsx(Button, { type: "submit", variant: "primary", loading: a.loading, children: t("account.changePassword") })] }) }));
61
+ }
62
+ function TwoFactorSection({ enabled }) {
63
+ const { auth, t } = useForge();
64
+ const [password, setPassword] = useState("");
65
+ const [setup, setSetup] = useState(null);
66
+ const [code, setCode] = useState("");
67
+ const a = useAction();
68
+ const secret = setup ? new URL(setup.totpURI).searchParams.get("secret") : null;
69
+ if (setup) {
70
+ return (_jsx(Section, { title: t("account.twoFactor"), description: t("account.twoFactorSetup"), children: _jsxs("div", { className: "space-y-4", children: [a.notice, _jsxs("div", { className: "forge-card-flat p-3 text-sm", children: [_jsx("p", { className: "text-ink-muted", children: t("account.secretKey") }), _jsx("p", { className: "mt-1 font-mono break-all text-ink select-all", children: secret }), _jsx("a", { href: setup.totpURI, className: "mt-2 inline-block text-xs text-link hover:underline", children: t("account.openInAuthenticator") })] }), _jsxs("div", { className: "forge-card-flat p-3 text-sm", children: [_jsx("p", { className: "text-ink-muted", children: t("account.backupCodes") }), _jsx("p", { className: "mt-1 grid grid-cols-2 gap-1 font-mono text-ink", children: setup.backupCodes.map((c) => (_jsx("span", { children: c }, c))) })] }), _jsxs("form", { className: "flex gap-2", onSubmit: (e) => {
71
+ e.preventDefault();
72
+ a.run(async () => {
73
+ const r = await auth.twoFactor.verifyTotp({ code });
74
+ if (!r.error)
75
+ window.location.reload();
76
+ return r;
77
+ });
78
+ }, children: [_jsx(Input, { "aria-label": t("account.verificationCode"), inputMode: "numeric", placeholder: "123456", value: code, onChange: (e) => setCode(e.target.value), className: "font-mono" }), _jsx(Button, { type: "submit", variant: "primary", loading: a.loading, children: t("account.verify") })] })] }) }));
79
+ }
80
+ return (_jsxs(Section, { title: t("account.twoFactor"), description: enabled ? t("account.twoFactorEnabled") : t("account.twoFactorDisabled"), children: [_jsxs("form", { className: "flex gap-2", onSubmit: (e) => {
81
+ e.preventDefault();
82
+ a.run(async () => {
83
+ const r = enabled ? await auth.twoFactor.disable({ password }) : await auth.twoFactor.enable({ password });
84
+ if (!r.error) {
85
+ if (enabled)
86
+ window.location.reload();
87
+ else
88
+ setSetup(r.data);
89
+ }
90
+ return r;
91
+ });
92
+ }, children: [_jsx(Input, { "aria-label": t("account.confirmWithPassword"), type: "password", placeholder: t("account.confirmWithPassword"), required: true, value: password, onChange: (e) => setPassword(e.target.value) }), _jsx(Button, { type: "submit", variant: enabled ? "danger" : "primary", loading: a.loading, className: "shrink-0", children: enabled ? t("account.disable2fa") : t("account.enable2fa") })] }), a.state?.tone === "error" && _jsx("div", { className: "mt-3", children: a.notice })] }));
93
+ }
94
+ function PasskeySection() {
95
+ const { auth, locale, t } = useForge();
96
+ const list = useQuery({ queryKey: ["forge", "passkeys"], queryFn: async () => (await auth.passkey.listUserPasskeys()).data ?? [] });
97
+ const a = useAction();
98
+ return (_jsx(Section, { title: t("account.passkeys"), description: t("account.passkeysDescription"), children: _jsxs("div", { className: "space-y-3", children: [a.notice, _jsx("ul", { className: "divide-y divide-line text-sm", children: list.data?.map((p) => (_jsxs("li", { className: "flex items-center justify-between py-2", children: [_jsxs("span", { children: [p.name ?? t("account.passkey"), " ", _jsx("span", { className: "text-xs text-ink-subtle", children: t("account.passkeyAdded", { date: p.createdAt ? new Date(p.createdAt).toLocaleDateString(locale) : "" }) })] }), _jsx(Button, { size: "sm", variant: "ghost", onClick: () => a.run(() => auth.passkey.deletePasskey({ id: p.id })).then(() => list.refetch()), children: t("common.remove") })] }, p.id))) }), _jsx(Button, { onClick: () => a.run(() => auth.passkey.addPasskey({ name: navigator.platform || "Passkey" }), t("account.passkeyAddedNotice")).then(() => list.refetch()), loading: a.loading, children: t("account.addPasskey") })] }) }));
99
+ }
100
+ function SessionsSection({ currentToken }) {
101
+ const { auth, locale, t } = useForge();
102
+ const list = useQuery({ queryKey: ["forge", "sessions"], queryFn: async () => ((await auth.listSessions()).data ?? []) });
103
+ return (_jsx(Section, { title: t("account.sessions"), children: _jsx("ul", { className: "divide-y divide-line text-sm", children: list.data?.map((s) => (_jsxs("li", { className: "flex items-center justify-between gap-4 py-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "truncate text-ink", children: s.userAgent ?? t("account.unknownDevice") }), _jsxs("p", { className: "text-xs text-ink-subtle", children: [s.ipAddress ?? "", " \u00B7 ", new Date(s.createdAt).toLocaleString(locale), " ", s.token === currentToken && `· ${t("account.thisDevice")}`] })] }), s.token !== currentToken && (_jsx(Button, { size: "sm", variant: "ghost", onClick: async () => { await auth.revokeSession({ token: s.token }); list.refetch(); }, children: t("account.revoke") }))] }, s.id))) }) }));
104
+ }
105
+ //# sourceMappingURL=account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.js","sourceRoot":"","sources":["../src/account.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import type { EntityIR } from "@tekki-forge/compiler";
2
+ /** Same limit as the API. */
3
+ export declare const COMMENT_MAX_LENGTH = 5000;
4
+ export interface ActivityUser {
5
+ id: string;
6
+ name: string;
7
+ image: string | null;
8
+ }
9
+ export interface CommentItem {
10
+ id: string;
11
+ body: string;
12
+ mentions: string[];
13
+ author: ActivityUser | null;
14
+ createdAt: string;
15
+ editedAt: string | null;
16
+ canEdit: boolean;
17
+ canDelete: boolean;
18
+ }
19
+ export interface TimelineEvent {
20
+ id: string;
21
+ kind: "created" | "updated" | "deleted" | "restored" | "transition" | "action" | "comment";
22
+ at: string;
23
+ actor: ActivityUser | null;
24
+ changes?: {
25
+ field: string;
26
+ label: string;
27
+ values: boolean;
28
+ from?: unknown;
29
+ to?: unknown;
30
+ }[];
31
+ transition?: {
32
+ name: string;
33
+ label: string;
34
+ from: string | null;
35
+ to: string | null;
36
+ };
37
+ action?: {
38
+ name: string;
39
+ label: string;
40
+ };
41
+ comment?: CommentItem;
42
+ }
43
+ /** Relative time ("3 hours ago"), with the exact date and time on hover. */
44
+ export declare function RelativeTime({ iso, className }: {
45
+ iso: string;
46
+ className?: string;
47
+ }): import("react").JSX.Element;
48
+ export declare function Avatar({ user, size }: {
49
+ user: ActivityUser | null;
50
+ size?: "sm" | "md";
51
+ }): import("react").JSX.Element;
52
+ /** A comment body: plain text with line breaks; mentions are highlighted. */
53
+ export declare function CommentBody({ body }: {
54
+ body: string;
55
+ }): import("react").JSX.Element;
56
+ /**
57
+ * The record's Activity panel: audit history (created, field changes, transitions, deletes) and comments in
58
+ * time order, older events on demand, and a comment box with @mentions. Everything is filtered by the API.
59
+ */
60
+ export declare function ActivityPanel({ path, entity, recordId, readOnly }: {
61
+ path: string;
62
+ entity: EntityIR;
63
+ recordId: string;
64
+ readOnly?: boolean;
65
+ }): import("react").JSX.Element;
@@ -0,0 +1,299 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useInfiniteQuery, useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
4
+ import { ArrowRightLeft, CirclePlus, History, Pencil, RotateCcw, Trash2, Zap } from "lucide-react";
5
+ import { Fragment, useEffect, useId, useMemo, useRef, useState } from "react";
6
+ import { ApiError, useForge } from "./context.js";
7
+ import { FieldValue } from "./fields.js";
8
+ import { ListSkeleton } from "./skeleton.js";
9
+ import { useToast } from "./toast.js";
10
+ import { Button, Card, ConfirmDialog, cn, inputClass } from "./ui.js";
11
+ /** Same limit as the API. */
12
+ export const COMMENT_MAX_LENGTH = 5000;
13
+ /** A mention inside a comment body: `@[Ada Lovelace](<user id>)`. */
14
+ const MENTION = /@\[([^\]\n]{1,100})\]\(([A-Za-z0-9_-]{1,64})\)/g;
15
+ /** Fill a translated template with React nodes: "{actor} created" + { actor: <b>Ada</b> }. */
16
+ function rich(template, nodes) {
17
+ return template.split(/(\{\w+\})/g).map((part, i) => {
18
+ const m = /^\{(\w+)\}$/.exec(part);
19
+ return _jsx(Fragment, { children: m && m[1] in nodes ? nodes[m[1]] : part }, i);
20
+ });
21
+ }
22
+ const UNITS = [
23
+ ["year", 31_536_000],
24
+ ["month", 2_592_000],
25
+ ["week", 604_800],
26
+ ["day", 86_400],
27
+ ["hour", 3_600],
28
+ ["minute", 60],
29
+ ];
30
+ function relativeTime(iso, locale) {
31
+ const seconds = (new Date(iso).getTime() - Date.now()) / 1000;
32
+ const rtf = new Intl.RelativeTimeFormat(locale, { numeric: "auto" });
33
+ for (const [unit, size] of UNITS)
34
+ if (Math.abs(seconds) >= size)
35
+ return rtf.format(Math.round(seconds / size), unit);
36
+ return rtf.format(0, "second");
37
+ }
38
+ /** Relative time ("3 hours ago"), with the exact date and time on hover. */
39
+ export function RelativeTime({ iso, className }) {
40
+ const { locale } = useForge();
41
+ const [, refresh] = useState(0);
42
+ useEffect(() => {
43
+ const timer = setInterval(() => refresh((n) => n + 1), 60_000);
44
+ return () => clearInterval(timer);
45
+ }, []);
46
+ const absolute = new Date(iso).toLocaleString(locale);
47
+ return (_jsx("time", { dateTime: iso, title: absolute, className: cn("tabular-nums", className), children: relativeTime(iso, locale) }));
48
+ }
49
+ const AVATAR_TONES = ["#6366f1", "#0ea5e9", "#10b981", "#f59e0b", "#f43f5e", "#8b5cf6", "#14b8a6", "#ec4899"];
50
+ function initials(name) {
51
+ const parts = name.trim().split(/\s+/).filter(Boolean);
52
+ return ((parts[0]?.[0] ?? "?") + (parts.length > 1 ? (parts[parts.length - 1][0] ?? "") : "")).toUpperCase();
53
+ }
54
+ export function Avatar({ user, size = "md" }) {
55
+ const dims = size === "sm" ? "size-6 text-[10px]" : "size-8 text-xs";
56
+ if (user?.image)
57
+ return _jsx("img", { src: user.image, alt: "", className: cn("shrink-0 rounded-full object-cover ring-1 ring-line", dims) });
58
+ const tone = user ? AVATAR_TONES[[...user.id].reduce((h, c) => (h * 31 + c.charCodeAt(0)) >>> 0, 7) % AVATAR_TONES.length] : undefined;
59
+ return (_jsx("span", { "aria-hidden": true, className: cn("flex shrink-0 items-center justify-center rounded-full font-semibold", dims, tone ? "text-white" : "bg-surface-muted text-ink-muted"), style: tone ? { backgroundColor: tone } : undefined, children: user ? initials(user.name) : "?" }));
60
+ }
61
+ /** A comment body: plain text with line breaks; mentions are highlighted. */
62
+ export function CommentBody({ body }) {
63
+ const parts = [];
64
+ let last = 0;
65
+ for (const m of body.matchAll(MENTION)) {
66
+ if (m.index > last)
67
+ parts.push(body.slice(last, m.index));
68
+ parts.push(_jsxs("span", { className: "rounded bg-primary/10 px-0.5 font-medium text-link", "data-user-id": m[2], children: ["@", m[1]] }, m.index));
69
+ last = m.index + m[0].length;
70
+ }
71
+ if (last < body.length)
72
+ parts.push(body.slice(last));
73
+ return _jsx("p", { className: "text-sm whitespace-pre-wrap break-words text-ink", children: parts });
74
+ }
75
+ /** Turn a stored body into editable text (`@Name`) plus the mentions it holds. */
76
+ function toEditable(body) {
77
+ const mentions = [];
78
+ const text = body.replace(MENTION, (_m, name, id) => {
79
+ if (!mentions.some((x) => x.id === id))
80
+ mentions.push({ id, name, image: null });
81
+ return `@${name}`;
82
+ });
83
+ return { text, mentions };
84
+ }
85
+ /** Encode `@Name` back into mention tokens for the people picked in the editor. */
86
+ function toBody(text, mentions) {
87
+ let out = text;
88
+ for (const m of [...mentions].sort((a, b) => b.name.length - a.name.length)) {
89
+ const label = m.name.replace(/[[\]\n]/g, "").slice(0, 100);
90
+ if (label)
91
+ out = out.split(`@${m.name}`).join(`@[${label}](${m.id})`);
92
+ }
93
+ return out.trim();
94
+ }
95
+ /** Text with @mention autocomplete (arrows to move, Enter or Tab to pick, Escape to close; Ctrl/⌘+Enter submits). */
96
+ function CommentEditor({ path, recordId, initial = "", submitLabel, pending, autoFocus, onSubmit, onCancel, }) {
97
+ const { api, t } = useForge();
98
+ const start = useMemo(() => toEditable(initial), [initial]);
99
+ const [text, setText] = useState(start.text);
100
+ const [mentions, setMentions] = useState(start.mentions);
101
+ const [trigger, setTrigger] = useState(null);
102
+ const [search, setSearch] = useState("");
103
+ const [active, setActive] = useState(0);
104
+ const ref = useRef(null);
105
+ const listId = useId();
106
+ useEffect(() => {
107
+ const timer = setTimeout(() => setSearch(trigger?.query ?? ""), 150);
108
+ return () => clearTimeout(timer);
109
+ }, [trigger?.query]);
110
+ const people = useQuery({
111
+ queryKey: ["resource", path, "mentionable", recordId, search],
112
+ queryFn: () => api(`/${path}/${recordId}/comments/mentionable`, { query: { search } }),
113
+ enabled: trigger !== null,
114
+ staleTime: 30_000,
115
+ });
116
+ const options = trigger ? (people.data?.data ?? []) : [];
117
+ const open = trigger !== null;
118
+ useEffect(() => setActive(0), [search]);
119
+ const detect = (value, caret) => {
120
+ const m = /(^|\s)@([^\s@[\]()]{0,30})$/u.exec(value.slice(0, caret));
121
+ setTrigger(m ? { start: caret - m[2].length - 1, query: m[2] } : null);
122
+ };
123
+ const pick = (user) => {
124
+ const el = ref.current;
125
+ if (!el || !trigger)
126
+ return;
127
+ const caret = el.selectionStart ?? text.length;
128
+ const insert = `@${user.name} `;
129
+ const next = text.slice(0, trigger.start) + insert + text.slice(caret);
130
+ setText(next);
131
+ setMentions((all) => (all.some((m) => m.id === user.id) ? all : [...all, user]));
132
+ setTrigger(null);
133
+ const pos = trigger.start + insert.length;
134
+ requestAnimationFrame(() => {
135
+ el.focus();
136
+ el.setSelectionRange(pos, pos);
137
+ });
138
+ };
139
+ const body = toBody(text, mentions);
140
+ const submit = async () => {
141
+ if (!body || pending || body.length > COMMENT_MAX_LENGTH)
142
+ return;
143
+ if ((await onSubmit(body)) && !initial) {
144
+ setText("");
145
+ setMentions([]);
146
+ }
147
+ };
148
+ const onKeyDown = (e) => {
149
+ if (open && e.key === "Escape") {
150
+ e.preventDefault();
151
+ e.stopPropagation();
152
+ setTrigger(null);
153
+ return;
154
+ }
155
+ if (open && options.length > 0) {
156
+ if (e.key === "ArrowDown" || e.key === "ArrowUp") {
157
+ e.preventDefault();
158
+ setActive((i) => (i + (e.key === "ArrowDown" ? 1 : -1) + options.length) % options.length);
159
+ return;
160
+ }
161
+ if ((e.key === "Enter" && !e.shiftKey && !e.metaKey && !e.ctrlKey) || e.key === "Tab") {
162
+ e.preventDefault();
163
+ pick(options[Math.min(active, options.length - 1)]);
164
+ return;
165
+ }
166
+ }
167
+ if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) {
168
+ e.preventDefault();
169
+ void submit();
170
+ }
171
+ else if (e.key === "Escape" && onCancel) {
172
+ e.preventDefault();
173
+ onCancel();
174
+ }
175
+ };
176
+ return (_jsxs("div", { className: "relative", children: [_jsx("textarea", { ref: ref, rows: 3, autoFocus: autoFocus, value: text, maxLength: COMMENT_MAX_LENGTH, placeholder: t("activity.placeholder"), "aria-label": t("activity.commentLabel"), role: "combobox", "aria-autocomplete": "list", "aria-expanded": open, "aria-controls": listId, "aria-activedescendant": open && options[active] ? `${listId}-${options[active].id}` : undefined, className: cn(inputClass, "min-h-20 resize-y"), onChange: (e) => {
177
+ setText(e.target.value);
178
+ detect(e.target.value, e.target.selectionStart ?? e.target.value.length);
179
+ }, onClick: (e) => detect(e.currentTarget.value, e.currentTarget.selectionStart ?? 0), onKeyUp: (e) => ["ArrowLeft", "ArrowRight", "Home", "End"].includes(e.key) && detect(e.currentTarget.value, e.currentTarget.selectionStart ?? 0), onBlur: () => setTimeout(() => setTrigger(null), 150), onKeyDown: onKeyDown }), open && (_jsxs("ul", { id: listId, role: "listbox", "aria-label": t("activity.mentionSuggestions"), className: "forge-popover absolute left-0 z-30 mt-1 max-h-64 w-72 overflow-auto py-1", children: [options.map((u, i) => (_jsxs("li", { id: `${listId}-${u.id}`, role: "option", "aria-selected": i === active, className: cn("flex cursor-pointer items-center gap-2 px-3 py-1.5 text-sm text-ink", i === active ? "bg-selected" : "hover:bg-hover"), onMouseDown: (e) => {
180
+ e.preventDefault();
181
+ pick(u);
182
+ }, onMouseEnter: () => setActive(i), children: [_jsx(Avatar, { user: u, size: "sm" }), _jsx("span", { className: "truncate", children: u.name })] }, u.id))), options.length === 0 && (_jsx("li", { role: "presentation", className: "px-3 py-2 text-sm text-ink-subtle", children: people.isFetching || search !== (trigger?.query ?? "") ? t("common.loading") : t("activity.noMatches") }))] })), _jsxs("div", { className: "mt-2 flex items-center justify-end gap-2", children: [_jsx("span", { className: "mr-auto text-xs text-ink-subtle", children: t("activity.sendHint") }), onCancel && (_jsx(Button, { size: "sm", variant: "ghost", onClick: onCancel, children: t("common.cancel") })), _jsx(Button, { size: "sm", variant: "primary", loading: pending, disabled: !body, onClick: () => void submit(), children: submitLabel })] })] }));
183
+ }
184
+ function ChangeValue({ field, value }) {
185
+ const { t } = useForge();
186
+ if (field?.relation) {
187
+ const refs = (Array.isArray(value) ? value : [value]).filter(Boolean);
188
+ if (!refs.length)
189
+ return _jsx("span", { className: "text-ink-subtle", children: "\u2014" });
190
+ return _jsx("span", { className: "font-medium text-ink", children: refs.map((r) => r.label ?? t("activity.unknownRecord")).join(", ") });
191
+ }
192
+ return (_jsx("span", { className: "inline-block max-w-[16rem] truncate align-bottom font-medium text-ink", children: _jsx(FieldValue, { field: field, value: value }) }));
193
+ }
194
+ function SystemEvent({ entity, event, stateLabel }) {
195
+ const { t } = useForge();
196
+ const actor = _jsx("span", { className: "font-medium text-ink", children: event.actor?.name ?? t("activity.someone") });
197
+ const Icon = { created: CirclePlus, updated: Pencil, deleted: Trash2, restored: RotateCcw, transition: ArrowRightLeft, action: Zap, comment: History }[event.kind];
198
+ let text;
199
+ if (event.kind === "created")
200
+ text = rich(t("activity.created"), { actor });
201
+ else if (event.kind === "updated")
202
+ text = rich(t("activity.updated"), { actor });
203
+ else if (event.kind === "deleted")
204
+ text = rich(t("activity.deleted"), { actor });
205
+ else if (event.kind === "restored")
206
+ text = rich(t("activity.restored"), { actor });
207
+ else if (event.kind === "transition") {
208
+ const tr = event.transition;
209
+ const transition = _jsx("span", { className: "font-medium text-ink", children: entity.workflow?.transitions.find((x) => x.name === tr.name)?.label ?? tr.label });
210
+ text =
211
+ tr.from && tr.to
212
+ ? rich(t("activity.transitionTo"), { actor, transition, from: stateLabel(tr.from), to: _jsx("span", { className: "font-medium text-ink", children: stateLabel(tr.to) }) })
213
+ : rich(t("activity.transition"), { actor, transition });
214
+ }
215
+ else
216
+ text = rich(t("activity.action"), { actor, action: _jsx("span", { className: "font-medium text-ink", children: entity.actions.find((a) => a.name === event.action?.name)?.label ?? event.action?.label }) });
217
+ return (_jsxs("div", { className: "flex gap-3", children: [_jsx("span", { className: "flex size-8 shrink-0 items-center justify-center", children: _jsx("span", { className: "flex size-6 items-center justify-center rounded-full bg-surface-muted text-ink-muted ring-4 ring-surface", children: _jsx(Icon, { className: "size-3.5", "aria-hidden": true }) }) }), _jsxs("div", { className: "min-w-0 flex-1 pt-1 text-sm text-ink-muted", children: [_jsxs("p", { children: [text, " ", _jsx("span", { "aria-hidden": true, children: "\u00B7" }), " ", _jsx(RelativeTime, { iso: event.at, className: "text-xs text-ink-subtle" })] }), event.changes && event.changes.length > 0 && (_jsx("ul", { className: "mt-1 space-y-0.5 text-xs", children: event.changes.map((c) => {
218
+ const field = entity.fields.find((f) => f.name === c.field);
219
+ const label = _jsx("span", { className: "text-ink", children: field?.label ?? c.label });
220
+ const empty = (v) => v === null || v === undefined || v === "" || (Array.isArray(v) && v.length === 0);
221
+ return (_jsx("li", { children: !c.values
222
+ ? rich(t("activity.changedHidden"), { field: label })
223
+ : empty(c.from)
224
+ ? rich(t("activity.set"), { field: label, to: _jsx(ChangeValue, { field: field, value: c.to }) })
225
+ : empty(c.to)
226
+ ? rich(t("activity.cleared"), { field: label, from: _jsx(ChangeValue, { field: field, value: c.from }) })
227
+ : rich(t("activity.changed"), { field: label, from: _jsx(ChangeValue, { field: field, value: c.from }), to: _jsx(ChangeValue, { field: field, value: c.to }) }) }, c.field));
228
+ }) }))] })] }));
229
+ }
230
+ function CommentEvent({ path, recordId, comment, highlighted, readOnly, onDelete }) {
231
+ const { api, locale, t, tv } = useForge();
232
+ const toast = useToast();
233
+ const queryClient = useQueryClient();
234
+ const [editing, setEditing] = useState(false);
235
+ const edit = useMutation({
236
+ mutationFn: (body) => api(`/${path}/${recordId}/comments/${comment.id}`, { method: "PATCH", body: JSON.stringify({ body }) }),
237
+ onSuccess: async () => {
238
+ setEditing(false);
239
+ toast.success(t("activity.commentUpdated"));
240
+ await queryClient.invalidateQueries({ queryKey: ["resource", path, "timeline", recordId] });
241
+ },
242
+ onError: (e) => toast.error(t("toast.failed"), errorText(e, tv)),
243
+ });
244
+ return (_jsxs("div", { id: `comment-${comment.id}`, className: "flex scroll-mt-24 gap-3", children: [_jsx(Avatar, { user: comment.author }), _jsxs("div", { className: cn("min-w-0 flex-1 rounded-[var(--forge-radius-control)] border border-line bg-surface px-3 py-2", highlighted && "ring-2 ring-primary/40"), children: [_jsxs("div", { className: "mb-1 flex items-center gap-2 text-xs", children: [_jsx("span", { className: "text-sm font-medium text-ink", children: comment.author?.name ?? t("activity.someone") }), _jsx(RelativeTime, { iso: comment.createdAt, className: "text-ink-subtle" }), comment.editedAt && (_jsxs("span", { className: "text-ink-subtle", title: new Date(comment.editedAt).toLocaleString(locale), children: ["(", t("activity.edited"), ")"] })), !editing && ((comment.canEdit && !readOnly) || comment.canDelete) && (_jsxs("span", { className: "ml-auto flex items-center gap-0.5", children: [comment.canEdit && !readOnly && (_jsx("button", { type: "button", className: "forge-btn forge-btn-ghost p-1", "aria-label": t("activity.editComment"), title: t("activity.editComment"), onClick: () => setEditing(true), children: _jsx(Pencil, { className: "size-3.5" }) })), comment.canDelete && (_jsx("button", { type: "button", className: "forge-btn forge-btn-ghost p-1 text-ink-muted hover:text-danger", "aria-label": t("activity.deleteComment"), title: t("activity.deleteComment"), onClick: onDelete, children: _jsx(Trash2, { className: "size-3.5" }) }))] }))] }), editing ? (_jsx(CommentEditor, { path: path, recordId: recordId, initial: comment.body, autoFocus: true, submitLabel: t("common.save"), pending: edit.isPending, onSubmit: (body) => edit.mutateAsync(body).then(() => true, () => false), onCancel: () => setEditing(false) })) : (_jsx(CommentBody, { body: comment.body }))] })] }));
245
+ }
246
+ function errorText(e, tv) {
247
+ const issue = e instanceof ApiError ? e.body?.issues?.[0]?.message : undefined;
248
+ return issue ? tv(issue) : e.message;
249
+ }
250
+ /**
251
+ * The record's Activity panel: audit history (created, field changes, transitions, deletes) and comments in
252
+ * time order, older events on demand, and a comment box with @mentions. Everything is filtered by the API.
253
+ */
254
+ export function ActivityPanel({ path, entity, recordId, readOnly }) {
255
+ const { api, t, tv } = useForge();
256
+ const toast = useToast();
257
+ const queryClient = useQueryClient();
258
+ const key = ["resource", path, "timeline", recordId];
259
+ const timeline = useInfiniteQuery({
260
+ queryKey: key,
261
+ queryFn: ({ pageParam }) => api(`/${path}/${recordId}/timeline`, { query: { limit: 20, before: pageParam } }),
262
+ initialPageParam: undefined,
263
+ getNextPageParam: (last) => last.nextCursor ?? undefined,
264
+ });
265
+ const [toDelete, setToDelete] = useState(null);
266
+ const [hash, setHash] = useState("");
267
+ useEffect(() => setHash(typeof window === "undefined" ? "" : window.location.hash.slice(1)), []);
268
+ const refresh = () => queryClient.invalidateQueries({ queryKey: key });
269
+ const post = useMutation({
270
+ mutationFn: (body) => api(`/${path}/${recordId}/comments`, { method: "POST", body: JSON.stringify({ body }) }),
271
+ onSuccess: async () => {
272
+ toast.success(t("activity.commentPosted"));
273
+ await refresh();
274
+ },
275
+ onError: (e) => toast.error(t("toast.failed"), errorText(e, tv)),
276
+ });
277
+ const remove = useMutation({
278
+ mutationFn: (id) => api(`/${path}/${recordId}/comments/${id}`, { method: "DELETE" }),
279
+ onSuccess: async () => {
280
+ setToDelete(null);
281
+ toast.success(t("activity.commentDeleted"));
282
+ await refresh();
283
+ },
284
+ onError: (e) => {
285
+ setToDelete(null);
286
+ toast.error(t("toast.failed"), errorText(e, tv));
287
+ },
288
+ });
289
+ // Oldest first; each API page is newest first.
290
+ const events = useMemo(() => (timeline.data?.pages.flatMap((p) => p.data) ?? []).slice().reverse(), [timeline.data]);
291
+ const stateLabel = (state) => entity.fields.find((f) => f.name === entity.workflow?.field)?.enumValues?.find((v) => v.value === state)?.label ?? state;
292
+ useEffect(() => {
293
+ if (!hash.startsWith("comment-") || !events.some((e) => `comment-${e.id}` === hash))
294
+ return;
295
+ document.getElementById(hash)?.scrollIntoView({ block: "center" });
296
+ }, [hash, events]);
297
+ return (_jsxs("section", { className: "mt-8", "aria-labelledby": "forge-activity-title", children: [_jsx("h2", { id: "forge-activity-title", className: "mb-3 text-sm font-semibold text-ink", children: t("activity.title") }), _jsxs(Card, { className: "p-[var(--forge-pad-card)]", children: [timeline.isLoading ? (_jsx(ListSkeleton, { rows: 3 })) : timeline.error ? (_jsx("p", { role: "alert", className: "text-sm text-danger", children: timeline.error.message })) : (_jsxs(_Fragment, { children: [timeline.hasNextPage && (_jsx("div", { className: "mb-4 flex justify-center", children: _jsxs(Button, { size: "sm", variant: "ghost", loading: timeline.isFetchingNextPage, onClick: () => void timeline.fetchNextPage(), children: [_jsx(History, { className: "size-3.5" }), " ", t("activity.loadEarlier")] }) })), events.length === 0 ? (_jsxs("div", { className: "py-6 text-center", children: [_jsx("p", { className: "text-sm font-medium text-ink", children: t("activity.empty") }), entity.features.comments && !readOnly && _jsx("p", { className: "mt-1 text-sm text-ink-muted", children: t("activity.emptyHint") })] })) : (_jsx("ol", { className: "relative space-y-4 before:absolute before:top-2 before:bottom-2 before:left-4 before:w-px before:bg-line", children: events.map((e) => (_jsx("li", { className: "relative", children: e.kind === "comment" && e.comment ? (_jsx(CommentEvent, { path: path, recordId: recordId, comment: e.comment, highlighted: hash === `comment-${e.id}`, readOnly: readOnly, onDelete: () => setToDelete(e.comment) })) : (_jsx(SystemEvent, { entity: entity, event: e, stateLabel: stateLabel })) }, `${e.kind}-${e.id}`))) }))] })), entity.features.comments && !readOnly && (_jsx("div", { className: "mt-5 border-t border-line pt-4", children: _jsx(CommentEditor, { path: path, recordId: recordId, submitLabel: t("activity.send"), pending: post.isPending, onSubmit: (body) => post.mutateAsync(body).then(() => true, () => false) }) }))] }), _jsx(ConfirmDialog, { open: !!toDelete, title: t("activity.deleteTitle"), message: t("detail.deleteHard"), confirmLabel: t("common.delete"), danger: true, loading: remove.isPending, onConfirm: () => toDelete && remove.mutate(toDelete.id), onClose: () => setToDelete(null) })] }));
298
+ }
299
+ //# sourceMappingURL=activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../src/activity.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /** Teams of the active organization (features.teams): create, rename, delete, manage members. */
2
+ export declare function TeamsPage(): import("react").JSX.Element;
3
+ /** Scoped API keys of the organization: create (shown once), list, revoke. */
4
+ export declare function ApiKeysPage(): import("react").JSX.Element;