@haneinfo/frontend-instances 0.5.0 → 0.7.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 (91) hide show
  1. package/README.md +117 -5
  2. package/agent-guide.md +12 -0
  3. package/dist/attachments-client.d.ts +7 -2
  4. package/dist/attachments-client.d.ts.map +1 -1
  5. package/dist/attachments-client.js +47 -11
  6. package/dist/attachments-client.js.map +1 -1
  7. package/dist/client.d.ts +11 -68
  8. package/dist/client.d.ts.map +1 -1
  9. package/dist/client.js +11 -443
  10. package/dist/client.js.map +1 -1
  11. package/dist/contracts.d.ts +202 -4
  12. package/dist/contracts.d.ts.map +1 -1
  13. package/dist/contracts.js +5 -98
  14. package/dist/contracts.js.map +1 -1
  15. package/dist/dashboard.d.ts +41 -0
  16. package/dist/dashboard.d.ts.map +1 -0
  17. package/dist/dashboard.js +72 -0
  18. package/dist/dashboard.js.map +1 -0
  19. package/dist/detail-client.d.ts +55 -0
  20. package/dist/detail-client.d.ts.map +1 -0
  21. package/dist/detail-client.js +173 -0
  22. package/dist/detail-client.js.map +1 -0
  23. package/dist/documents-client.d.ts +2 -1
  24. package/dist/documents-client.d.ts.map +1 -1
  25. package/dist/documents-client.js +13 -9
  26. package/dist/documents-client.js.map +1 -1
  27. package/dist/draft-client.d.ts +30 -0
  28. package/dist/draft-client.d.ts.map +1 -0
  29. package/dist/draft-client.js +236 -0
  30. package/dist/draft-client.js.map +1 -0
  31. package/dist/draft-session.d.ts +48 -0
  32. package/dist/draft-session.d.ts.map +1 -0
  33. package/dist/draft-session.js +267 -0
  34. package/dist/draft-session.js.map +1 -0
  35. package/dist/filter-editor.d.ts +18 -0
  36. package/dist/filter-editor.d.ts.map +1 -0
  37. package/dist/filter-editor.js +145 -0
  38. package/dist/filter-editor.js.map +1 -0
  39. package/dist/format.d.ts +152 -0
  40. package/dist/format.d.ts.map +1 -0
  41. package/dist/format.js +402 -0
  42. package/dist/format.js.map +1 -0
  43. package/dist/import-client.d.ts +31 -0
  44. package/dist/import-client.d.ts.map +1 -0
  45. package/dist/import-client.js +179 -0
  46. package/dist/import-client.js.map +1 -0
  47. package/dist/instance-management-client.d.ts +64 -0
  48. package/dist/instance-management-client.d.ts.map +1 -0
  49. package/dist/instance-management-client.js +216 -0
  50. package/dist/instance-management-client.js.map +1 -0
  51. package/dist/instance-management-messages.d.ts +51 -0
  52. package/dist/instance-management-messages.d.ts.map +1 -0
  53. package/dist/instance-management-messages.js +60 -0
  54. package/dist/instance-management-messages.js.map +1 -0
  55. package/dist/labels.d.ts +10 -0
  56. package/dist/labels.d.ts.map +1 -0
  57. package/dist/labels.js +40 -0
  58. package/dist/labels.js.map +1 -0
  59. package/dist/list-client.d.ts +39 -0
  60. package/dist/list-client.d.ts.map +1 -0
  61. package/dist/list-client.js +402 -0
  62. package/dist/list-client.js.map +1 -0
  63. package/dist/list-query.d.ts +41 -0
  64. package/dist/list-query.d.ts.map +1 -0
  65. package/dist/list-query.js +171 -0
  66. package/dist/list-query.js.map +1 -0
  67. package/dist/management-client.d.ts +6 -2
  68. package/dist/management-client.d.ts.map +1 -1
  69. package/dist/management-client.js +113 -84
  70. package/dist/management-client.js.map +1 -1
  71. package/dist/messages.d.ts +17 -4
  72. package/dist/messages.d.ts.map +1 -1
  73. package/dist/messages.js +59 -4
  74. package/dist/messages.js.map +1 -1
  75. package/dist/server.d.ts +32 -1
  76. package/dist/server.d.ts.map +1 -1
  77. package/dist/server.js +308 -44
  78. package/dist/server.js.map +1 -1
  79. package/dist/timeline.d.ts +24 -0
  80. package/dist/timeline.d.ts.map +1 -0
  81. package/dist/timeline.js +189 -0
  82. package/dist/timeline.js.map +1 -0
  83. package/dist/ui-messages.d.ts +284 -0
  84. package/dist/ui-messages.d.ts.map +1 -0
  85. package/dist/ui-messages.js +372 -0
  86. package/dist/ui-messages.js.map +1 -0
  87. package/dist/ui.d.ts +100 -0
  88. package/dist/ui.d.ts.map +1 -0
  89. package/dist/ui.js +169 -0
  90. package/dist/ui.js.map +1 -0
  91. package/package.json +4 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-editor.d.ts","sourceRoot":"","sources":["../src/filter-editor.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,MAAM,EAAa,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAKzF,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,UAQxD;AASD,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,WAOrF;AACD,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,SAAS,GAAG,SAAS,CAwB/F;AAkCD,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,MAAM,EACN,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAgB,EAChB,KAAS,GACV,EAAE;IACD,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,+BAgOA"}
@@ -0,0 +1,145 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Button, Input } from '@haneinfo/frontend-shell';
4
+ import { Plus, Trash2 } from 'lucide-react';
5
+ import { useId } from 'react';
6
+ import { operators } from './contracts.js';
7
+ import { fromZonedInput, toZonedInput } from './format.js';
8
+ import { fieldValue } from './query.js';
9
+ import { NativeSelect, TextArea, touch } from './ui.js';
10
+ export function labelOf(field, labels) {
11
+ const system = {
12
+ $state: 'state',
13
+ $number: 'number',
14
+ $submitterId: 'submitter',
15
+ $createdAt: 'createdAt',
16
+ };
17
+ return system[field.id] ? labels[system[field.id]] : field.label;
18
+ }
19
+ function newRule(fields) {
20
+ return {
21
+ kind: 'PREDICATE',
22
+ operator: 'EQ',
23
+ left: { kind: 'FIELD', fieldId: fields[0]?.id ?? '' },
24
+ right: { kind: 'LITERAL', value: '' },
25
+ };
26
+ }
27
+ /** Only literal operands are editable; other conditions are shown as readable text. */
28
+ export function editablePredicate(condition) {
29
+ const operands = Array.isArray(condition.right)
30
+ ? condition.right
31
+ : condition.right
32
+ ? [condition.right]
33
+ : [];
34
+ return condition.left?.kind === 'FIELD' && operands.every((right) => right.kind === 'LITERAL');
35
+ }
36
+ /** Normalizes literals once, immediately before the API request. */
37
+ export function prepareFilter(condition, fields) {
38
+ if (condition.kind === 'GROUP') {
39
+ const expressions = condition.expressions.flatMap((child) => {
40
+ const result = prepareFilter(child, fields);
41
+ return result ? [result] : [];
42
+ });
43
+ return expressions.length ? { ...condition, expressions } : undefined;
44
+ }
45
+ if (!editablePredicate(condition))
46
+ return condition;
47
+ const field = fields.find((f) => f.id === condition.left.fieldId);
48
+ if (!field?.filterable)
49
+ throw new Error('invalidInput');
50
+ if (condition.operator === 'NOT_EMPTY')
51
+ return { kind: 'PREDICATE', operator: condition.operator, left: condition.left };
52
+ const normalize = (literal) => ({
53
+ kind: 'LITERAL',
54
+ value: fieldValue(String(literal.value ?? ''), field),
55
+ });
56
+ if (!condition.right)
57
+ throw new Error('invalidInput');
58
+ return {
59
+ ...condition,
60
+ right: Array.isArray(condition.right)
61
+ ? condition.right.map(normalize)
62
+ : normalize(condition.right),
63
+ };
64
+ }
65
+ /** Readable text for a condition this editor cannot change (e.g. "Submitter equals the current user"). */
66
+ function describe(condition, fields, t) {
67
+ if (condition.kind === 'GROUP')
68
+ return condition.expressions
69
+ .map((child) => describe(child, fields, t))
70
+ .join(condition.operator === 'AND' ? ' · ' : ' / ');
71
+ const left = condition.left?.kind === 'FIELD'
72
+ ? labelOf(fields.find((field) => field.id === condition.left.fieldId) ??
73
+ { id: condition.left.fieldId, label: t.field }, t)
74
+ : t.field;
75
+ const operands = (Array.isArray(condition.right) ? condition.right : condition.right ? [condition.right] : []);
76
+ const right = operands
77
+ .map((operand) => operand.kind === 'CONTEXT'
78
+ ? t.contextMe
79
+ : operand.kind === 'LITERAL'
80
+ ? String(operand.value ?? '')
81
+ : t.value)
82
+ .join('、');
83
+ return `${left} ${t[condition.operator] ?? condition.operator} ${right}`.trim();
84
+ }
85
+ export function FilterEditor({ condition, fields, labels, onChange, onRemove, timeZone = 'UTC', depth = 0, }) {
86
+ const t = labels;
87
+ const id = useId();
88
+ if (condition.kind === 'GROUP')
89
+ return (_jsxs("fieldset", { className: depth
90
+ ? 'flex min-w-0 flex-col gap-3 rounded-lg border border-dashed p-3'
91
+ : 'flex min-w-0 flex-col gap-3', children: [_jsx("legend", { className: "sr-only", children: t.groupConditions }), _jsxs("div", { className: condition.expressions.length > 1 || onRemove
92
+ ? 'flex flex-wrap items-center gap-2'
93
+ : 'hidden', children: [_jsx("label", { htmlFor: `${id}-match`, className: "sr-only", children: t.operator }), _jsxs(NativeSelect, { id: `${id}-match`, "aria-label": t.operator, value: condition.operator, onChange: (e) => onChange({ ...condition, operator: e.target.value }), className: "w-full sm:w-auto", children: [_jsx("option", { value: "AND", children: t.AND }), _jsx("option", { value: "OR", children: t.OR })] }), onRemove && (_jsx(Button, { type: "button", variant: "ghost", size: "icon-sm", className: touch, "aria-label": t.remove, onClick: onRemove, children: _jsx(Trash2, { "aria-hidden": "true" }) }))] }), condition.expressions.map((child, index) => (_jsx(FilterEditor
94
+ // biome-ignore lint/suspicious/noArrayIndexKey: These controlled positional rows have no local input state.
95
+ , { condition: child, fields: fields, labels: t, depth: depth + 1, timeZone: timeZone, onChange: (value) => onChange({
96
+ ...condition,
97
+ expressions: condition.expressions.map((entry, i) => (i === index ? value : entry)),
98
+ }), onRemove: () => onChange({
99
+ ...condition,
100
+ expressions: condition.expressions.filter((_, i) => i !== index),
101
+ }) }, `${depth}-${index}`))), _jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsxs(Button, { type: "button", variant: "outline", size: "sm", className: touch, disabled: !fields.length, onClick: () => onChange({ ...condition, expressions: [...condition.expressions, newRule(fields)] }), children: [_jsx(Plus, { "aria-hidden": "true", "data-icon": "inline-start" }), t.addRule] }), depth < 4 && (_jsxs(Button, { type: "button", variant: "outline", size: "sm", className: touch, disabled: !fields.length, onClick: () => onChange({
102
+ ...condition,
103
+ expressions: [
104
+ ...condition.expressions,
105
+ { kind: 'GROUP', operator: 'OR', expressions: [newRule(fields)] },
106
+ ],
107
+ }), children: [_jsx(Plus, { "aria-hidden": "true", "data-icon": "inline-start" }), t.addGroup] }))] })] }));
108
+ if (!editablePredicate(condition))
109
+ return (_jsxs("div", { className: "flex min-w-0 items-center justify-between gap-2 rounded-lg bg-muted/50 px-3 py-2 text-sm", children: [_jsx("span", { className: "min-w-0 [overflow-wrap:anywhere]", children: describe(condition, fields, t) }), onRemove && (_jsx(Button, { type: "button", variant: "ghost", size: "icon-sm", className: touch, "aria-label": t.remove, onClick: onRemove, children: _jsx(Trash2, { "aria-hidden": "true" }) }))] }));
110
+ const field = fields.find((f) => f.id === condition.left.fieldId);
111
+ const right = condition.right;
112
+ const value = Array.isArray(right)
113
+ ? right.map((r) => String(r.value ?? '')).join('\n')
114
+ : String(right?.value ?? '');
115
+ let inputType = field?.type === 'number' ? 'number' : field?.type === 'date' ? 'date' : 'text';
116
+ if (field?.type === 'datetime')
117
+ inputType = 'datetime-local';
118
+ const shown = inputType === 'datetime-local' ? toZonedInput(value, timeZone) : value;
119
+ return (_jsxs("div", { className: "grid min-w-0 gap-2 rounded-lg border p-2 sm:grid-cols-[minmax(0,1fr)_minmax(0,1fr)_minmax(0,1fr)_auto]", children: [_jsx(NativeSelect, { "aria-label": t.field, value: field?.id ?? '', onChange: (e) => onChange({
120
+ ...condition,
121
+ left: { kind: 'FIELD', fieldId: e.target.value },
122
+ right: { kind: 'LITERAL', value: '' },
123
+ }), children: fields.map((f) => (_jsx("option", { value: f.id, children: labelOf(f, t) }, f.id))) }), _jsx(NativeSelect, { "aria-label": t.operator, value: condition.operator, onChange: (e) => onChange({
124
+ ...condition,
125
+ operator: e.target.value,
126
+ right: e.target.value === 'IN' ? [] : { kind: 'LITERAL', value: '' },
127
+ }), children: operators.map((op) => (_jsx("option", { value: op, children: t[op] }, op))) }), condition.operator === 'NOT_EMPTY' ? (_jsx("span", { "aria-hidden": "true" })) : condition.operator === 'IN' ? (_jsx(TextArea, { "aria-label": t.value, className: "min-h-9", value: value, onChange: (e) => onChange({
128
+ ...condition,
129
+ right: e.target.value.split('\n').map((v) => ({
130
+ kind: 'LITERAL',
131
+ value: field?.type === 'number' && v.trim() ? Number(v) : v,
132
+ })),
133
+ }) })) : (_jsx(Input, { type: inputType, step: "any", "aria-label": t.value, className: "h-9 max-md:h-11", value: shown, onChange: (e) => onChange({
134
+ ...condition,
135
+ right: {
136
+ kind: 'LITERAL',
137
+ value: field?.type === 'number' && e.target.value !== ''
138
+ ? Number(e.target.value)
139
+ : inputType === 'datetime-local'
140
+ ? (fromZonedInput(e.target.value, timeZone) ?? '')
141
+ : e.target.value,
142
+ },
143
+ }) })), onRemove && (_jsx(Button, { type: "button", variant: "ghost", size: "icon-sm", className: `justify-self-end ${touch}`, "aria-label": t.remove, onClick: onRemove, children: _jsx(Trash2, { "aria-hidden": "true" }) }))] }));
144
+ }
145
+ //# sourceMappingURL=filter-editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-editor.js","sourceRoot":"","sources":["../src/filter-editor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Display rendering of stored values (draft 202610-a8d3 points 2 and 3). Pure and deterministic:
3
+ * the same input, locale and time zone always give the same output on the server and in the
4
+ * browser, so server-rendered text never differs from the hydrated text.
5
+ */
6
+ import type { FormField } from './contracts.js';
7
+ export type DisplayLocale = 'zh-TW' | 'en';
8
+ export declare const DEFAULT_TIME_ZONE = "Asia/Taipei";
9
+ export interface FormatOptions {
10
+ locale: DisplayLocale | string;
11
+ timeZone: string;
12
+ /** Display names of people, by id, for user picker values. */
13
+ people?: Record<string, string | null | undefined>;
14
+ }
15
+ type Base = {
16
+ computed?: boolean;
17
+ };
18
+ export type FieldDisplay = Base & ({
19
+ kind: 'empty';
20
+ text: string;
21
+ } | {
22
+ kind: 'text';
23
+ text: string;
24
+ multiline: boolean;
25
+ long: boolean;
26
+ } | {
27
+ kind: 'number';
28
+ text: string;
29
+ value: number;
30
+ } | {
31
+ kind: 'date';
32
+ text: string;
33
+ iso: string;
34
+ full: string;
35
+ } | {
36
+ kind: 'datetime';
37
+ text: string;
38
+ iso: string;
39
+ full: string;
40
+ } | {
41
+ kind: 'time';
42
+ text: string;
43
+ } | {
44
+ kind: 'boolean';
45
+ text: string;
46
+ value: boolean;
47
+ } | {
48
+ kind: 'option';
49
+ text: string;
50
+ known: boolean;
51
+ } | {
52
+ kind: 'options';
53
+ text: string;
54
+ items: {
55
+ text: string;
56
+ known: boolean;
57
+ }[];
58
+ } | {
59
+ kind: 'table';
60
+ text: string;
61
+ columns: {
62
+ id: string;
63
+ label: string;
64
+ }[];
65
+ rows: FieldDisplay[][];
66
+ } | {
67
+ kind: 'user';
68
+ text: string;
69
+ known: boolean;
70
+ } | {
71
+ kind: 'invalid';
72
+ text: string;
73
+ });
74
+ /** The few words the renderer itself needs; everything else comes from the host catalog. */
75
+ export declare const FORMAT_WORDS: {
76
+ readonly 'zh-TW': {
77
+ readonly yes: "是";
78
+ readonly no: "否";
79
+ readonly empty: "未填寫";
80
+ readonly unknownOption: "不在選項中";
81
+ readonly computed: "自動計算";
82
+ readonly unknownUser: "未知的使用者";
83
+ readonly invalid: "無法顯示此值";
84
+ readonly rows: "{count} 筆";
85
+ };
86
+ readonly en: {
87
+ readonly yes: "Yes";
88
+ readonly no: "No";
89
+ readonly empty: "Not filled in";
90
+ readonly unknownOption: "Not one of the options";
91
+ readonly computed: "Calculated";
92
+ readonly unknownUser: "Unknown person";
93
+ readonly invalid: "This value cannot be shown";
94
+ readonly rows: "{count} rows";
95
+ };
96
+ };
97
+ export declare function displayLocale(locale: string | undefined): DisplayLocale;
98
+ export declare function formatWords(locale: string | undefined): {
99
+ readonly yes: "是";
100
+ readonly no: "否";
101
+ readonly empty: "未填寫";
102
+ readonly unknownOption: "不在選項中";
103
+ readonly computed: "自動計算";
104
+ readonly unknownUser: "未知的使用者";
105
+ readonly invalid: "無法顯示此值";
106
+ readonly rows: "{count} 筆";
107
+ } | {
108
+ readonly yes: "Yes";
109
+ readonly no: "No";
110
+ readonly empty: "Not filled in";
111
+ readonly unknownOption: "Not one of the options";
112
+ readonly computed: "Calculated";
113
+ readonly unknownUser: "Unknown person";
114
+ readonly invalid: "This value cannot be shown";
115
+ readonly rows: "{count} rows";
116
+ };
117
+ /** A long text is collapsed behind "Show all" in the UI. */
118
+ export declare const LONG_TEXT_LENGTH = 280;
119
+ /** A calendar date (YYYY-MM-DD) without any time zone conversion. */
120
+ export declare function formatDate(value: string, options: Pick<FormatOptions, 'locale'> & {
121
+ full?: boolean;
122
+ }): string | undefined;
123
+ /** An instant in the display time zone: short ("2026/10/23 13:14") or full with the zone name. */
124
+ export declare function formatDateTime(value: string | number | Date, options: Omit<FormatOptions, 'people'> & {
125
+ full?: boolean;
126
+ dateOnly?: boolean;
127
+ }): string | undefined;
128
+ /** The clock time of an instant in the display time zone (HH:mm). */
129
+ export declare function formatTime(value: string | number | Date, options: Omit<FormatOptions, 'people'>): string | undefined;
130
+ /** The calendar day of an instant in the display time zone, as YYYY-MM-DD (for grouping). */
131
+ export declare function dayKey(value: string | number | Date, timeZone: string): string;
132
+ /** "3 minutes ago"; only rendered in the browser, never on the server. */
133
+ export declare function formatRelative(value: string | number | Date, now: number, locale: string | undefined): string | undefined;
134
+ /** An instant as a `datetime-local` value (YYYY-MM-DDTHH:mm) in the display time zone. */
135
+ export declare function toZonedInput(value: unknown, timeZone: string): string;
136
+ /** A `datetime-local` value entered in the display time zone, as an ISO instant. */
137
+ export declare function fromZonedInput(value: string, timeZone: string): string | undefined;
138
+ /**
139
+ * A readable name of the display time zone (台北時間 / Taipei time). Built from a fixed table and
140
+ * the zone's city, never from ICU names, so the server and the browser agree.
141
+ */
142
+ export declare function timeZoneName(timeZone: string, locale: string | undefined): string;
143
+ export declare function formatNumber(value: number, locale: string | undefined): string;
144
+ /**
145
+ * The display value of one stored field value. Never throws: missing, malformed or unexpected data
146
+ * becomes `empty` or `invalid` instead of raw JSON.
147
+ */
148
+ export declare function formatFieldValue(field: Pick<FormField, 'type' | 'options' | 'formula' | 'columns' | 'children'>, value: unknown, options: FormatOptions): FieldDisplay;
149
+ /** One line of plain text for compact places (list cells, conflict choices, previews). */
150
+ export declare function formatFieldText(field: Pick<FormField, 'type' | 'options' | 'formula' | 'columns' | 'children'>, value: unknown, options: FormatOptions): string;
151
+ export {};
152
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}