@haneinfo/frontend-instances 0.6.0 → 0.8.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 +141 -26
- package/agent-guide.md +12 -0
- package/dist/attachments-client.d.ts +7 -2
- package/dist/attachments-client.d.ts.map +1 -1
- package/dist/attachments-client.js +47 -11
- package/dist/attachments-client.js.map +1 -1
- package/dist/client.d.ts +12 -75
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +12 -463
- package/dist/client.js.map +1 -1
- package/dist/contracts.d.ts +167 -5
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +5 -98
- package/dist/contracts.js.map +1 -1
- package/dist/dashboard.d.ts +43 -0
- package/dist/dashboard.d.ts.map +1 -0
- package/dist/dashboard.js +72 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/detail-client.d.ts +59 -0
- package/dist/detail-client.d.ts.map +1 -0
- package/dist/detail-client.js +253 -0
- package/dist/detail-client.js.map +1 -0
- package/dist/documents-client.d.ts +2 -1
- package/dist/documents-client.d.ts.map +1 -1
- package/dist/documents-client.js +13 -9
- package/dist/documents-client.js.map +1 -1
- package/dist/draft-client.d.ts +27 -3
- package/dist/draft-client.d.ts.map +1 -1
- package/dist/draft-client.js +107 -54
- package/dist/draft-client.js.map +1 -1
- package/dist/draft-session.d.ts +1 -0
- package/dist/draft-session.d.ts.map +1 -1
- package/dist/draft-session.js +2 -1
- package/dist/draft-session.js.map +1 -1
- package/dist/field-errors.d.ts +4 -0
- package/dist/field-errors.d.ts.map +1 -0
- package/dist/field-errors.js +25 -0
- package/dist/field-errors.js.map +1 -0
- package/dist/filter-editor.d.ts +18 -0
- package/dist/filter-editor.d.ts.map +1 -0
- package/dist/filter-editor.js +145 -0
- package/dist/filter-editor.js.map +1 -0
- package/dist/format.d.ts +152 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +402 -0
- package/dist/format.js.map +1 -0
- package/dist/import-client.d.ts +31 -0
- package/dist/import-client.d.ts.map +1 -0
- package/dist/import-client.js +179 -0
- package/dist/import-client.js.map +1 -0
- package/dist/instance-management-client.d.ts +23 -6
- package/dist/instance-management-client.d.ts.map +1 -1
- package/dist/instance-management-client.js +96 -70
- package/dist/instance-management-client.js.map +1 -1
- package/dist/labels.d.ts +10 -0
- package/dist/labels.d.ts.map +1 -0
- package/dist/labels.js +42 -0
- package/dist/labels.js.map +1 -0
- package/dist/list-client.d.ts +39 -0
- package/dist/list-client.d.ts.map +1 -0
- package/dist/list-client.js +403 -0
- package/dist/list-client.js.map +1 -0
- package/dist/list-query.d.ts +41 -0
- package/dist/list-query.d.ts.map +1 -0
- package/dist/list-query.js +171 -0
- package/dist/list-query.js.map +1 -0
- package/dist/management-client.d.ts +6 -2
- package/dist/management-client.d.ts.map +1 -1
- package/dist/management-client.js +113 -84
- package/dist/management-client.js.map +1 -1
- package/dist/messages.d.ts +4 -4
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +23 -5
- package/dist/messages.js.map +1 -1
- package/dist/process-client.d.ts +27 -0
- package/dist/process-client.d.ts.map +1 -0
- package/dist/process-client.js +129 -0
- package/dist/process-client.js.map +1 -0
- package/dist/process-messages.d.ts +73 -0
- package/dist/process-messages.d.ts.map +1 -0
- package/dist/process-messages.js +154 -0
- package/dist/process-messages.js.map +1 -0
- package/dist/server.d.ts +34 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +302 -50
- package/dist/server.js.map +1 -1
- package/dist/tasks-client.d.ts +38 -0
- package/dist/tasks-client.d.ts.map +1 -0
- package/dist/tasks-client.js +127 -0
- package/dist/tasks-client.js.map +1 -0
- package/dist/timeline.d.ts +24 -0
- package/dist/timeline.d.ts.map +1 -0
- package/dist/timeline.js +189 -0
- package/dist/timeline.js.map +1 -0
- package/dist/ui-messages.d.ts +284 -0
- package/dist/ui-messages.d.ts.map +1 -0
- package/dist/ui-messages.js +372 -0
- package/dist/ui-messages.js.map +1 -0
- package/dist/ui.d.ts +101 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +169 -0
- package/dist/ui.js.map +1 -0
- package/package.json +4 -2
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Button } from '@haneinfo/frontend-shell';
|
|
4
|
+
import { ChevronDown, ChevronLeft, ChevronRight, ClipboardCheck, RotateCw } from 'lucide-react';
|
|
5
|
+
import NextLink from 'next/link';
|
|
6
|
+
import { useEffect, useId, useState } from 'react';
|
|
7
|
+
import { call, ErrorMessage, useTask } from './action-client.js';
|
|
8
|
+
import { formatDateTime } from './format.js';
|
|
9
|
+
import { ManagementDialog } from './instance-management-client.js';
|
|
10
|
+
import { Card, CardHeader, EmptyState, fillText, Skeleton, StateBadge, TextArea } from './ui.js';
|
|
11
|
+
const control = 'min-h-11 whitespace-normal [overflow-wrap:anywhere]';
|
|
12
|
+
const linkClass = 'inline-flex min-h-11 min-w-0 max-w-full items-center rounded-md font-medium text-sm text-primary underline-offset-4 outline-none hover:underline focus-visible:ring-3 focus-visible:ring-ring/50 [overflow-wrap:anywhere]';
|
|
13
|
+
export function notifyTaskChange() {
|
|
14
|
+
window.dispatchEvent(new Event('haneinfo:tasks-changed'));
|
|
15
|
+
}
|
|
16
|
+
export function TaskCountBadge({ action, labels: t, }) {
|
|
17
|
+
const [count, setCount] = useState();
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
let alive = true, sequence = 0;
|
|
20
|
+
const load = async () => {
|
|
21
|
+
const request = ++sequence;
|
|
22
|
+
try {
|
|
23
|
+
const result = await call(action, { kind: 'taskCount' });
|
|
24
|
+
if (alive && request === sequence)
|
|
25
|
+
setCount(result.count);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
if (alive && request === sequence)
|
|
29
|
+
setCount(undefined);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
void load();
|
|
33
|
+
window.addEventListener('haneinfo:tasks-changed', load);
|
|
34
|
+
window.addEventListener('pageshow', load);
|
|
35
|
+
return () => {
|
|
36
|
+
alive = false;
|
|
37
|
+
window.removeEventListener('haneinfo:tasks-changed', load);
|
|
38
|
+
window.removeEventListener('pageshow', load);
|
|
39
|
+
};
|
|
40
|
+
}, [action]);
|
|
41
|
+
return count && count > 0 ? (_jsx("span", { role: "status", "data-slot": "task-count", "aria-label": fillText(t.tasksCountLabel, { count }), className: "ml-auto rounded-full bg-primary px-2 py-0.5 text-primary-foreground text-xs tabular-nums", children: count > 99 ? '99+' : count })) : null;
|
|
42
|
+
}
|
|
43
|
+
export function TaskResponse({ task: item, action, labels: t, onChanged, }) {
|
|
44
|
+
const task = useTask(), noteId = useId();
|
|
45
|
+
const [choice, setChoice] = useState();
|
|
46
|
+
const [comment, setComment] = useState('');
|
|
47
|
+
const [done, setDone] = useState(false);
|
|
48
|
+
const [stale, setStale] = useState(false);
|
|
49
|
+
const available = item.canRespond && item.status === 'OPEN' && !done && !stale;
|
|
50
|
+
const max = item.commentRules?.maxLength ?? 2000;
|
|
51
|
+
return (_jsxs("div", { className: "flex min-w-0 flex-col gap-3", "aria-busy": task.pending, children: [available ? (_jsxs(_Fragment, { children: [_jsx("label", { htmlFor: noteId, className: "font-medium text-sm", children: t.taskComment }), _jsx(TextArea, { id: noteId, maxLength: max, value: comment, disabled: task.pending, onChange: (event) => setComment(event.target.value) }), _jsx("div", { className: "flex flex-wrap gap-2", children: item.responses.map((response, index) => (_jsx(Button, { type: "button", className: control, variant: index ? 'outline' : 'default', disabled: task.pending || (item.commentRules?.required && !comment.trim()), onClick: () => setChoice(response), children: response.label }, response.key))) })] })) : (_jsx("p", { className: "text-muted-foreground text-sm", children: done ? t.taskDone : t.taskReadOnly })), _jsx(ErrorMessage, { error: task.error, labels: t }), task.error && (_jsx(Button, { type: "button", variant: "outline", className: `${control} self-start`, disabled: task.pending, onClick: () => void task.run(onChanged), children: t.retry })), _jsx("p", { role: "status", "aria-live": "polite", className: "text-muted-foreground text-sm empty:hidden", children: task.pending ? t.processWorking : done ? t.taskDone : '' }), choice && (_jsxs(ManagementDialog, { title: t.taskConfirm, onCancel: () => {
|
|
52
|
+
if (!task.pending)
|
|
53
|
+
setChoice(undefined);
|
|
54
|
+
}, children: [_jsxs("p", { className: "mb-2 break-words font-medium", children: [choice.label, " \u00B7 ", item.instance?.number ?? item.title] }), _jsx("p", { className: "mb-4 text-muted-foreground text-sm", children: t.taskConsequence }), comment && (_jsx("p", { className: "mb-4 whitespace-pre-wrap break-words rounded-lg bg-muted p-3 text-sm", children: comment })), _jsxs("div", { className: "flex flex-wrap justify-end gap-2", children: [_jsx(Button, { type: "button", variant: "outline", className: control, disabled: task.pending, onClick: () => setChoice(undefined), children: t.cancel }), _jsx(Button, { type: "button", className: control, disabled: task.pending, onClick: () => void task.run(async () => {
|
|
55
|
+
try {
|
|
56
|
+
await call(action, {
|
|
57
|
+
kind: 'respond',
|
|
58
|
+
id: item.id,
|
|
59
|
+
response: choice.key,
|
|
60
|
+
...(comment ? { comment } : {}),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
setChoice(undefined);
|
|
65
|
+
const key = error.reason?.key;
|
|
66
|
+
if (['TASK_NOT_OPEN', 'DELEGATION_ENDED', 'TASK_NOT_FOUND'].includes(key ?? '')) {
|
|
67
|
+
setStale(true);
|
|
68
|
+
await onChanged();
|
|
69
|
+
}
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
setChoice(undefined);
|
|
73
|
+
setDone(true);
|
|
74
|
+
notifyTaskChange();
|
|
75
|
+
await onChanged(true);
|
|
76
|
+
}), children: task.pending ? t.processWorking : choice.label })] })] }))] }));
|
|
77
|
+
}
|
|
78
|
+
function TaskDate({ value, locale, timeZone, }) {
|
|
79
|
+
return _jsx("time", { dateTime: value, children: formatDateTime(value, { locale, timeZone }) ?? '—' });
|
|
80
|
+
}
|
|
81
|
+
export function TaskCards({ items, action, labels: t, basePath, locale, timeZone, onChanged, instance = false, headingLevel = 3, }) {
|
|
82
|
+
const [expanded, setExpanded] = useState();
|
|
83
|
+
const group = useId();
|
|
84
|
+
const Heading = `h${headingLevel}`;
|
|
85
|
+
return (_jsx("ul", { className: "flex min-w-0 flex-col divide-y", children: items.map((item) => {
|
|
86
|
+
const panelId = `${group}-${item.id}`, open = expanded === item.id;
|
|
87
|
+
return (_jsxs("li", { className: "flex min-w-0 flex-col gap-3 p-4 sm:p-5", children: [_jsxs("div", { className: "flex min-w-0 flex-wrap items-start justify-between gap-2", children: [_jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [_jsx(Heading, { className: "font-medium text-sm [overflow-wrap:anywhere]", children: item.title }), !instance && (_jsx(NextLink, { href: `${basePath}/${encodeURIComponent(item.instanceId)}`, className: linkClass, children: item.instance?.number ?? t.taskViewRecord }))] }), _jsx(StateBadge, { label: t[`task${item.status}`], tone: item.status === 'OPEN'
|
|
88
|
+
? 'warning'
|
|
89
|
+
: item.status === 'RESPONDED'
|
|
90
|
+
? 'success'
|
|
91
|
+
: 'neutral' })] }), _jsxs("dl", { className: "grid min-w-0 grid-cols-1 gap-x-6 gap-y-2 text-sm sm:grid-cols-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("dt", { className: "text-muted-foreground text-xs", children: instance ? t.taskAssignee : t.submitter }), _jsx("dd", { className: "[overflow-wrap:anywhere]", children: (instance ? item.assigneeName : item.instance?.submitterName) ?? t.unknownPerson })] }), _jsxs("div", { children: [_jsx("dt", { className: "text-muted-foreground text-xs", children: t.createdAt }), _jsx("dd", { children: _jsx(TaskDate, { value: item.createdAt, locale: locale, timeZone: timeZone }) })] }), _jsxs("div", { children: [_jsx("dt", { className: "text-muted-foreground text-xs", children: t.taskDue }), _jsx("dd", { children: item.dueAt ? (_jsx(TaskDate, { value: item.dueAt, locale: locale, timeZone: timeZone })) : (t.taskNoDue) })] })] }), item.canRespond && (_jsxs(Button, { type: "button", variant: "outline", className: `${control} self-start`, "aria-expanded": open, "aria-controls": panelId, onClick: () => setExpanded(open ? undefined : item.id), children: [open ? t.taskCollapse : t.taskExpand, _jsx(ChevronDown, { "aria-hidden": "true", className: open ? 'rotate-180 motion-reduce:transition-none' : '' })] })), open && (_jsx("div", { id: panelId, className: "rounded-lg border bg-muted/20 p-3 sm:p-4", children: _jsx(TaskResponse, { task: item, action: action, labels: t, onChanged: onChanged }, `${item.id}-${item.status}`) })), !item.canRespond && item.status !== 'OPEN' && (_jsx("p", { className: "text-muted-foreground text-xs", children: t.taskReadOnly }))] }, item.id));
|
|
92
|
+
}) }));
|
|
93
|
+
}
|
|
94
|
+
export function TasksSkeleton() {
|
|
95
|
+
return (_jsxs("div", { className: "flex min-w-0 flex-col gap-5", "aria-busy": "true", children: [_jsx(Skeleton, { className: "h-14 w-56" }), _jsx(Skeleton, { className: "h-12 w-64" }), [1, 2, 3].map((key) => (_jsx(Skeleton, { className: "h-40 w-full" }, key)))] }));
|
|
96
|
+
}
|
|
97
|
+
export function TasksClient({ initial, action, labels: t, basePath, locale = 'zh-TW', timeZone = 'Asia/Taipei', instanceId, compact, tasksPath = '/dashboard/tasks', onResponded, standalone, }) {
|
|
98
|
+
const task = useTask();
|
|
99
|
+
const [data, setData] = useState(initial);
|
|
100
|
+
const [status, setStatus] = useState('OPEN');
|
|
101
|
+
const [page, setPage] = useState(0);
|
|
102
|
+
const [announcement, setAnnouncement] = useState('');
|
|
103
|
+
const reload = async (filter = status) => {
|
|
104
|
+
const result = await call(action, instanceId ? { kind: 'instanceTasks', id: instanceId } : { kind: 'myTasks', status: filter });
|
|
105
|
+
setData(result);
|
|
106
|
+
};
|
|
107
|
+
const items = (data?.tasks ?? []).filter((item) => status === 'ALL' || item.status === 'OPEN');
|
|
108
|
+
const size = compact ? 5 : 20, pages = Math.max(1, Math.ceil(items.length / size));
|
|
109
|
+
const current = Math.min(page, pages - 1);
|
|
110
|
+
return (_jsxs(Card, { "aria-label": instanceId ? t.tasksPending : t.tasksTitle, "aria-busy": task.pending, children: [!standalone && (_jsx(CardHeader, { title: instanceId ? t.tasksPending : t.tasksTitle, description: instanceId ? t.tasksPendingHint : t.tasksHint, action: compact ? (_jsx(NextLink, { href: tasksPath, className: linkClass, children: t.tasksViewAll })) : (_jsxs(Button, { type: "button", variant: "ghost", className: control, disabled: task.pending, onClick: () => void task.run(() => reload()), children: [_jsx(RotateCw, { "aria-hidden": "true" }), t.refresh] })) })), !instanceId && !compact && (_jsxs("div", { className: "flex flex-wrap items-center gap-2 border-b p-3", children: [['OPEN', 'ALL'].map((filter) => (_jsx(Button, { type: "button", className: control, variant: filter === status ? 'secondary' : 'ghost', "aria-pressed": status === filter, disabled: task.pending, onClick: () => void task.run(async () => {
|
|
111
|
+
await reload(filter);
|
|
112
|
+
setStatus(filter);
|
|
113
|
+
setPage(0);
|
|
114
|
+
}), children: filter === 'OPEN' ? t.tasksOpen : t.tasksAll }, filter))), standalone && (_jsxs(Button, { type: "button", variant: "ghost", className: `${control} ml-auto`, disabled: task.pending, onClick: () => void task.run(() => reload()), children: [_jsx(RotateCw, { "aria-hidden": "true" }), t.refresh] }))] })), _jsx("div", { className: "px-4 pt-3 empty:hidden", children: _jsx(ErrorMessage, { error: task.error, labels: t }) }), !data ? (_jsx("div", { className: "p-4", children: _jsx(EmptyState, { title: t.requestFailed, description: t.retry, action: _jsx(Button, { type: "button", className: control, disabled: task.pending, onClick: () => void task.run(() => reload()), children: t.retry }) }) })) : !items.length ? (_jsx("div", { className: "p-4", children: _jsx(EmptyState, { icon: _jsx(ClipboardCheck, {}), title: instanceId ? t.tasksInstanceEmpty : status === 'ALL' ? t.tasksAllEmpty : t.tasksEmpty, description: instanceId
|
|
115
|
+
? t.tasksInstanceEmptyHint
|
|
116
|
+
: status === 'ALL'
|
|
117
|
+
? t.tasksAllEmptyHint
|
|
118
|
+
: t.tasksEmptyHint, action: !instanceId ? (_jsx(NextLink, { href: basePath, className: linkClass, children: t.back })) : undefined }) })) : (_jsx(TaskCards, { items: items.slice(current * size, (current + 1) * size), action: action, labels: t, basePath: basePath, locale: locale, timeZone: timeZone, instance: !!instanceId, headingLevel: standalone ? 2 : 3, onChanged: async (responded) => {
|
|
119
|
+
await reload();
|
|
120
|
+
notifyTaskChange();
|
|
121
|
+
if (responded) {
|
|
122
|
+
setAnnouncement(t.taskDone);
|
|
123
|
+
await onResponded?.();
|
|
124
|
+
}
|
|
125
|
+
} })), !compact && items.length > size && (_jsxs("nav", { "aria-label": t.pagination, className: "flex flex-wrap items-center justify-between gap-2 border-t p-3", children: [_jsx("span", { className: "text-muted-foreground text-sm", "aria-live": "polite", children: fillText(t.pageOf, { page: current + 1, pages }) }), _jsxs("div", { className: "flex gap-2", children: [_jsxs(Button, { type: "button", variant: "outline", className: control, disabled: current === 0 || task.pending, onClick: () => setPage(current - 1), children: [_jsx(ChevronLeft, { "aria-hidden": "true" }), t.previous] }), _jsxs(Button, { type: "button", variant: "outline", className: control, disabled: current + 1 >= pages || task.pending, onClick: () => setPage(current + 1), children: [t.next, _jsx(ChevronRight, { "aria-hidden": "true" })] })] })] })), _jsx("p", { role: "status", "aria-live": "polite", className: "px-4 text-sm empty:hidden", children: announcement }), compact && items.length > size && (_jsx("p", { className: "border-t p-4 text-muted-foreground text-sm", children: fillText(t.tasksCountLabel, { count: items.length }) }))] }));
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=tasks-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks-client.js","sourceRoot":"","sources":["../src/tasks-client.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Labels, TimelineEvent } from './contracts.js';
|
|
2
|
+
export interface TimelineContext {
|
|
3
|
+
/** Document template names by code, from the documents list when available. */
|
|
4
|
+
templates?: Record<string, string>;
|
|
5
|
+
}
|
|
6
|
+
type Parts = {
|
|
7
|
+
template: string;
|
|
8
|
+
values: Record<string, string>;
|
|
9
|
+
};
|
|
10
|
+
/** The sentence template and its values for one entry. Pure; used by the text and node forms. */
|
|
11
|
+
export declare function timelineParts(event: TimelineEvent, t: Labels, context?: TimelineContext): Parts;
|
|
12
|
+
/** Plain text of an entry's sentence (tests, screen-reader summaries). */
|
|
13
|
+
export declare function timelineSentence(event: TimelineEvent, t: Labels, context?: TimelineContext): string;
|
|
14
|
+
/** Comment text with `@{id}` mention tokens shown as `@Name`. */
|
|
15
|
+
export declare function commentText(event: TimelineEvent, t: Labels): string;
|
|
16
|
+
export declare function ActivityFeed({ items, labels: t, locale, timeZone, context, }: {
|
|
17
|
+
items: TimelineEvent[];
|
|
18
|
+
labels: Labels;
|
|
19
|
+
locale: string;
|
|
20
|
+
timeZone: string;
|
|
21
|
+
context?: TimelineContext;
|
|
22
|
+
}): import("react").JSX.Element;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=timeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../src/timeline.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAkB,MAAM,gBAAgB,CAAC;AAI5E,MAAM,WAAW,eAAe;IAC9B,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED,KAAK,KAAK,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAclE,iGAAiG;AACjG,wBAAgB,aAAa,CAC3B,KAAK,EAAE,aAAa,EACpB,CAAC,EAAE,MAAM,EACT,OAAO,GAAE,eAAoB,GAC5B,KAAK,CAoGP;AACD,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,UAG1F;AAED,iEAAiE;AACjE,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAKnE;AA6BD,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,MAAM,EAAE,CAAC,EACT,MAAM,EACN,QAAQ,EACR,OAAO,GACR,EAAE;IACD,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B,+BAuCA"}
|
package/dist/timeline.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* The activity feed (draft 202610-a8d3 point 5): structured timeline entries turned into sentences
|
|
5
|
+
* with translated templates, grouped by day in the display time zone. Raw decisions and internal
|
|
6
|
+
* ids are never rendered; people appear by display name and the system as "System".
|
|
7
|
+
*/
|
|
8
|
+
import { cn } from '@haneinfo/frontend-shell';
|
|
9
|
+
import { Archive, ArrowRightLeft, BellOff, FileText, FolderTree, GitBranch, Hash, Link2, MessageSquare, Paperclip, PlayCircle, ShieldCheck, Sparkles, Tag as TagIcon, } from 'lucide-react';
|
|
10
|
+
import { useEffect, useState } from 'react';
|
|
11
|
+
import { dayKey, formatDate, formatDateTime, formatRelative, formatTime } from './format.js';
|
|
12
|
+
import { DateTimeText, fillTemplate, fillText } from './ui.js';
|
|
13
|
+
function personName(person, t) {
|
|
14
|
+
return person ? (person.name ?? t.unknownPerson) : t.systemActor;
|
|
15
|
+
}
|
|
16
|
+
/** The actor of an entry; older backends only send the deprecated `actorId`. */
|
|
17
|
+
function actorOf(event) {
|
|
18
|
+
if (event.actor !== undefined)
|
|
19
|
+
return event.actor;
|
|
20
|
+
return event.actorId ? { id: event.actorId, name: null } : null;
|
|
21
|
+
}
|
|
22
|
+
function level(value, t) {
|
|
23
|
+
return value === 'WRITE' ? t.WRITE : value === 'READ' ? t.READ : '';
|
|
24
|
+
}
|
|
25
|
+
/** The sentence template and its values for one entry. Pure; used by the text and node forms. */
|
|
26
|
+
export function timelineParts(event, t, context = {}) {
|
|
27
|
+
const actor = personName(actorOf(event), t);
|
|
28
|
+
const state = (value) => value?.label ?? t.unknownState;
|
|
29
|
+
const transition = event.transition?.label ?? '';
|
|
30
|
+
switch (event.kind) {
|
|
31
|
+
case 'START':
|
|
32
|
+
return { template: t.tlStart, values: { actor } };
|
|
33
|
+
case 'TRANSITION': {
|
|
34
|
+
const values = { actor, transition, toState: state(event.toState) };
|
|
35
|
+
if (event.trigger === 'CHOICE')
|
|
36
|
+
return { template: t.tlAutoRoute, values };
|
|
37
|
+
if (event.trigger === 'TIMER')
|
|
38
|
+
return { template: t.tlTransitionTimer, values };
|
|
39
|
+
if (event.onBehalfOf)
|
|
40
|
+
return {
|
|
41
|
+
template: t.tlTransitionOnBehalf,
|
|
42
|
+
values: { ...values, onBehalfOf: personName(event.onBehalfOf, t) },
|
|
43
|
+
};
|
|
44
|
+
return { template: t.tlTransition, values };
|
|
45
|
+
}
|
|
46
|
+
case 'CHOICE':
|
|
47
|
+
return event.outcome === 'FAILED'
|
|
48
|
+
? { template: t.tlChoiceFailed, values: { actor, fromState: state(event.fromState) } }
|
|
49
|
+
: { template: t.tlChoiceSelected, values: { actor, transition } };
|
|
50
|
+
case 'NUMBER':
|
|
51
|
+
return { template: t.tlNumber, values: { actor, number: event.text ?? '' } };
|
|
52
|
+
case 'NOTIFICATION_FAILURE':
|
|
53
|
+
return transition
|
|
54
|
+
? { template: t.tlNotificationFailure, values: { actor, transition } }
|
|
55
|
+
: { template: t.tlNotificationFailureGeneric, values: { actor } };
|
|
56
|
+
case 'COMMENT':
|
|
57
|
+
return { template: t.tlComment, values: { actor } };
|
|
58
|
+
case 'ACCESS': {
|
|
59
|
+
const principal = event.access?.principal;
|
|
60
|
+
const name = principal?.type === 'ROLE'
|
|
61
|
+
? fillText(t.rolePrincipal, { name: principal.name ?? principal.id })
|
|
62
|
+
: (principal?.name ?? t.unknownPerson);
|
|
63
|
+
const values = {
|
|
64
|
+
actor,
|
|
65
|
+
principal: name,
|
|
66
|
+
level: level(event.access?.level, t),
|
|
67
|
+
previousLevel: level(event.access?.previousLevel, t),
|
|
68
|
+
};
|
|
69
|
+
if (event.action === 'REMOVED')
|
|
70
|
+
return { template: t.tlAccessRemoved, values };
|
|
71
|
+
if (event.action === 'ADJUSTED')
|
|
72
|
+
return { template: t.tlAccessAdjusted, values };
|
|
73
|
+
return { template: t.tlAccessGranted, values };
|
|
74
|
+
}
|
|
75
|
+
case 'ATTACHMENT':
|
|
76
|
+
return {
|
|
77
|
+
template: event.action === 'DELETED' ? t.tlAttachmentDeleted : t.tlAttachmentUploaded,
|
|
78
|
+
values: { actor, file: event.text ?? '' },
|
|
79
|
+
};
|
|
80
|
+
case 'TAG':
|
|
81
|
+
return {
|
|
82
|
+
template: event.action === 'REMOVED' ? t.tlTagRemoved : t.tlTagAdded,
|
|
83
|
+
values: { actor, tag: event.text ?? '' },
|
|
84
|
+
};
|
|
85
|
+
case 'REFERENCE':
|
|
86
|
+
return {
|
|
87
|
+
template: event.action === 'UNLINKED' ? t.tlReferenceUnlinked : t.tlReferenceLinked,
|
|
88
|
+
values: { actor, other: event.reference?.other?.number ?? t.otherRecord },
|
|
89
|
+
};
|
|
90
|
+
case 'SPACE':
|
|
91
|
+
return {
|
|
92
|
+
template: event.action === 'REMOVED'
|
|
93
|
+
? t.tlSpaceRemoved
|
|
94
|
+
: event.action === 'PLACED'
|
|
95
|
+
? t.tlSpacePlaced
|
|
96
|
+
: t.tlSpaceMoved,
|
|
97
|
+
values: { actor },
|
|
98
|
+
};
|
|
99
|
+
case 'DOCUMENT': {
|
|
100
|
+
const code = event.document?.templateCode ?? '';
|
|
101
|
+
const format = event.document?.format === 'pdf' ? 'PDF' : event.document?.format === 'docx' ? 'Word' : '';
|
|
102
|
+
return {
|
|
103
|
+
template: format ? t.tlDocument : t.tlDocumentNoFormat,
|
|
104
|
+
values: {
|
|
105
|
+
actor,
|
|
106
|
+
template: context.templates?.[code] ?? t.documentUnnamed,
|
|
107
|
+
format,
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
case 'LIFECYCLE': {
|
|
112
|
+
const template = event.action === 'ARCHIVED'
|
|
113
|
+
? t.tlArchived
|
|
114
|
+
: event.action === 'RESTORED'
|
|
115
|
+
? t.tlUnarchived
|
|
116
|
+
: event.action === 'DELETED'
|
|
117
|
+
? t.tlDeleted
|
|
118
|
+
: event.action === 'UNDELETED'
|
|
119
|
+
? t.tlUndeleted
|
|
120
|
+
: t.tlUpdated;
|
|
121
|
+
return { template, values: { actor } };
|
|
122
|
+
}
|
|
123
|
+
default:
|
|
124
|
+
return { template: t.tlUpdated, values: { actor } };
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/** Plain text of an entry's sentence (tests, screen-reader summaries). */
|
|
128
|
+
export function timelineSentence(event, t, context) {
|
|
129
|
+
const { template, values } = timelineParts(event, t, context);
|
|
130
|
+
return fillText(template, values);
|
|
131
|
+
}
|
|
132
|
+
/** Comment text with `@{id}` mention tokens shown as `@Name`. */
|
|
133
|
+
export function commentText(event, t) {
|
|
134
|
+
const names = new Map((event.mentions ?? []).map((person) => [person.id, person.name]));
|
|
135
|
+
return (event.text ?? '').replace(/@\{([^}\s]{1,200})\}/g, (_, id) => names.has(id) ? `@${names.get(id) ?? t.unknownPerson}` : `@${t.unknownPerson}`);
|
|
136
|
+
}
|
|
137
|
+
const icons = {
|
|
138
|
+
START: _jsx(PlayCircle, {}),
|
|
139
|
+
TRANSITION: _jsx(ArrowRightLeft, {}),
|
|
140
|
+
CHOICE: _jsx(GitBranch, {}),
|
|
141
|
+
NUMBER: _jsx(Hash, {}),
|
|
142
|
+
NOTIFICATION_FAILURE: _jsx(BellOff, {}),
|
|
143
|
+
COMMENT: _jsx(MessageSquare, {}),
|
|
144
|
+
ACCESS: _jsx(ShieldCheck, {}),
|
|
145
|
+
ATTACHMENT: _jsx(Paperclip, {}),
|
|
146
|
+
TAG: _jsx(TagIcon, {}),
|
|
147
|
+
REFERENCE: _jsx(Link2, {}),
|
|
148
|
+
SPACE: _jsx(FolderTree, {}),
|
|
149
|
+
DOCUMENT: _jsx(FileText, {}),
|
|
150
|
+
LIFECYCLE: _jsx(Archive, {}),
|
|
151
|
+
};
|
|
152
|
+
/** Relative time is rendered only after mount, so server and first client render agree. */
|
|
153
|
+
function useNow() {
|
|
154
|
+
const [now, setNow] = useState();
|
|
155
|
+
useEffect(() => {
|
|
156
|
+
setNow(Date.now());
|
|
157
|
+
const timer = setInterval(() => setNow(Date.now()), 60_000);
|
|
158
|
+
return () => clearInterval(timer);
|
|
159
|
+
}, []);
|
|
160
|
+
return now;
|
|
161
|
+
}
|
|
162
|
+
export function ActivityFeed({ items, labels: t, locale, timeZone, context, }) {
|
|
163
|
+
const now = useNow();
|
|
164
|
+
const sorted = [...items].sort((a, b) => new Date(a.at).getTime() - new Date(b.at).getTime() || a.id.localeCompare(b.id));
|
|
165
|
+
const groups = [];
|
|
166
|
+
for (const item of sorted) {
|
|
167
|
+
const day = dayKey(item.at, timeZone);
|
|
168
|
+
const last = groups[groups.length - 1];
|
|
169
|
+
if (last?.day === day)
|
|
170
|
+
last.items.push(item);
|
|
171
|
+
else
|
|
172
|
+
groups.push({ day, items: [item] });
|
|
173
|
+
}
|
|
174
|
+
return (_jsx("div", { className: "flex min-w-0 flex-col gap-6", children: groups.map((group) => (_jsxs("section", { "aria-label": formatDate(group.day, { locale, full: true }) ?? group.day, children: [_jsx("h3", { className: "sticky top-0 z-10 mb-3 bg-background/95 py-1 font-medium text-muted-foreground text-xs backdrop-blur supports-[backdrop-filter]:bg-background/80", children: formatDate(group.day, { locale, full: true }) ?? group.day }), _jsx("ol", { className: "relative flex flex-col gap-4 before:absolute before:top-2 before:bottom-2 before:left-4 before:w-px before:bg-border", children: group.items.map((event) => (_jsx(ActivityItem, { event: event, labels: t, locale: locale, timeZone: timeZone, now: now, context: context }, event.id))) })] }, group.day))) }));
|
|
175
|
+
}
|
|
176
|
+
function ActivityItem({ event, labels: t, locale, timeZone, now, context, }) {
|
|
177
|
+
const { template, values } = timelineParts(event, t, context);
|
|
178
|
+
const actor = actorOf(event);
|
|
179
|
+
const sentence = fillTemplate(template, Object.fromEntries(Object.entries(values).map(([key, value]) => [
|
|
180
|
+
key,
|
|
181
|
+
key === 'actor' || key === 'principal' || key === 'onBehalfOf' ? (_jsx("strong", { className: cn('font-medium', key === 'actor' && !actor && 'text-muted-foreground'), children: value }, key)) : key === 'toState' || key === 'fromState' || key === 'number' || key === 'tag' ? (_jsx("span", { className: "font-medium", children: value }, key)) : (value),
|
|
182
|
+
])));
|
|
183
|
+
const clock = formatTime(event.at, { locale, timeZone }) ?? '';
|
|
184
|
+
const full = formatDateTime(event.at, { locale, timeZone, full: true }) ?? clock;
|
|
185
|
+
const relative = now === undefined ? undefined : formatRelative(event.at, now, locale);
|
|
186
|
+
const comment = event.kind === 'COMMENT';
|
|
187
|
+
return (_jsxs("li", { className: "relative flex min-w-0 gap-3", "data-kind": event.kind, children: [_jsx("span", { "aria-hidden": "true", className: cn('relative z-[1] flex size-8 shrink-0 items-center justify-center rounded-full border bg-background text-muted-foreground [&_svg]:size-4', event.kind === 'NOTIFICATION_FAILURE' && 'text-tone-danger'), children: icons[event.kind] ?? _jsx(ArrowRightLeft, {}) }), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-1.5 pt-1", children: [_jsxs("p", { className: "text-sm [overflow-wrap:anywhere]", children: [sentence, _jsxs("span", { className: "ml-2 inline-flex flex-wrap items-baseline gap-1.5 text-muted-foreground text-xs", children: [_jsx(DateTimeText, { iso: new Date(event.at).toISOString(), text: clock, full: full, focusable: true }), relative && _jsxs("span", { suppressHydrationWarning: true, children: ["\u00B7 ", relative] })] })] }), comment && (_jsxs("div", { className: "min-w-0 rounded-lg border bg-muted/40 px-3 py-2", children: [event.aiGenerated && (_jsxs("p", { className: "mb-1 inline-flex items-center gap-1 rounded-sm bg-background px-1.5 py-0.5 font-medium text-xs", children: [_jsx(Sparkles, { "aria-hidden": "true", className: "size-3" }), t.aiGenerated] })), _jsx("p", { className: "whitespace-pre-wrap text-sm [overflow-wrap:anywhere]", children: commentText(event, t) })] }))] })] }));
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=timeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.tsx"],"names":[],"mappings":"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"}
|