hazo_collab_forms 5.6.1 → 5.9.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/CHANGE_LOG.md +73 -0
- package/README.md +118 -0
- package/dist/components/_internal_form_set.d.ts +7 -0
- package/dist/components/_internal_form_set.d.ts.map +1 -1
- package/dist/components/_internal_form_set.js +2 -2
- package/dist/components/_internal_form_set.js.map +1 -1
- package/dist/components/autofill_dropzone/autofill_dropzone.d.ts +1 -1
- package/dist/components/autofill_dropzone/autofill_dropzone.d.ts.map +1 -1
- package/dist/components/autofill_dropzone/autofill_dropzone.js +81 -14
- package/dist/components/autofill_dropzone/autofill_dropzone.js.map +1 -1
- package/dist/components/autofill_dropzone/external_upload_manager.d.ts +57 -0
- package/dist/components/autofill_dropzone/external_upload_manager.d.ts.map +1 -0
- package/dist/components/autofill_dropzone/external_upload_manager.js +9 -0
- package/dist/components/autofill_dropzone/external_upload_manager.js.map +1 -0
- package/dist/components/autofill_dropzone/index.d.ts +1 -0
- package/dist/components/autofill_dropzone/index.d.ts.map +1 -1
- package/dist/components/autofill_dropzone/types.d.ts +3 -0
- package/dist/components/autofill_dropzone/types.d.ts.map +1 -1
- package/dist/components/field_audit/auditor.d.ts +30 -0
- package/dist/components/field_audit/auditor.d.ts.map +1 -0
- package/dist/components/field_audit/auditor.js +91 -0
- package/dist/components/field_audit/auditor.js.map +1 -0
- package/dist/components/field_audit/context.d.ts +29 -0
- package/dist/components/field_audit/context.d.ts.map +1 -0
- package/dist/components/field_audit/context.js +123 -0
- package/dist/components/field_audit/context.js.map +1 -0
- package/dist/components/field_audit/field_audit_icon.d.ts +12 -0
- package/dist/components/field_audit/field_audit_icon.d.ts.map +1 -0
- package/dist/components/field_audit/field_audit_icon.js +23 -0
- package/dist/components/field_audit/field_audit_icon.js.map +1 -0
- package/dist/components/field_audit/field_audit_panel.d.ts +9 -0
- package/dist/components/field_audit/field_audit_panel.d.ts.map +1 -0
- package/dist/components/field_audit/field_audit_panel.js +54 -0
- package/dist/components/field_audit/field_audit_panel.js.map +1 -0
- package/dist/components/field_audit/index.d.ts +28 -0
- package/dist/components/field_audit/index.d.ts.map +1 -0
- package/dist/components/field_audit/index.js +24 -0
- package/dist/components/field_audit/index.js.map +1 -0
- package/dist/components/field_audit/types.d.ts +75 -0
- package/dist/components/field_audit/types.d.ts.map +1 -0
- package/dist/components/field_audit/types.js +10 -0
- package/dist/components/field_audit/types.js.map +1 -0
- package/dist/components/field_audit/with_field_audit.d.ts +32 -0
- package/dist/components/field_audit/with_field_audit.d.ts.map +1 -0
- package/dist/components/field_audit/with_field_audit.js +42 -0
- package/dist/components/field_audit/with_field_audit.js.map +1 -0
- package/dist/components/hazo_collab_form_checkbox.d.ts.map +1 -1
- package/dist/components/hazo_collab_form_checkbox.js +3 -1
- package/dist/components/hazo_collab_form_checkbox.js.map +1 -1
- package/dist/components/hazo_collab_form_doc.d.ts.map +1 -1
- package/dist/components/hazo_collab_form_doc.js +4 -1
- package/dist/components/hazo_collab_form_doc.js.map +1 -1
- package/dist/components/hazo_collab_form_radio.d.ts.map +1 -1
- package/dist/components/hazo_collab_form_radio.js +4 -2
- package/dist/components/hazo_collab_form_radio.js.map +1 -1
- package/dist/components/hazo_collab_form_view/context.d.ts +7 -0
- package/dist/components/hazo_collab_form_view/context.d.ts.map +1 -1
- package/dist/components/hazo_collab_form_view/context.js +41 -1
- package/dist/components/hazo_collab_form_view/context.js.map +1 -1
- package/dist/components/hazo_collab_form_view/index.d.ts +1 -1
- package/dist/components/hazo_collab_form_view/index.d.ts.map +1 -1
- package/dist/components/hazo_collab_form_view/index.js +13 -1
- package/dist/components/hazo_collab_form_view/index.js.map +1 -1
- package/dist/components/hazo_collab_form_view/types.d.ts +107 -0
- package/dist/components/hazo_collab_form_view/types.d.ts.map +1 -1
- package/dist/components/hazo_collab_form_view/views/approval_view.d.ts.map +1 -1
- package/dist/components/hazo_collab_form_view/views/approval_view.js +3 -2
- package/dist/components/hazo_collab_form_view/views/approval_view.js.map +1 -1
- package/dist/components/hazo_collab_form_view/views/edit_view.d.ts.map +1 -1
- package/dist/components/hazo_collab_form_view/views/edit_view.js +2 -2
- package/dist/components/hazo_collab_form_view/views/edit_view.js.map +1 -1
- package/dist/components/hazo_collab_form_view/views/print_view.d.ts.map +1 -1
- package/dist/components/hazo_collab_form_view/views/print_view.js +3 -2
- package/dist/components/hazo_collab_form_view/views/print_view.js.map +1 -1
- package/dist/components/hazo_collab_form_view/views/summary_view.d.ts.map +1 -1
- package/dist/components/hazo_collab_form_view/views/summary_view.js +3 -2
- package/dist/components/hazo_collab_form_view/views/summary_view.js.map +1 -1
- package/dist/components/hazo_data_form/group_renderer.d.ts +6 -2
- package/dist/components/hazo_data_form/group_renderer.d.ts.map +1 -1
- package/dist/components/hazo_data_form/group_renderer.js +3 -3
- package/dist/components/hazo_data_form/group_renderer.js.map +1 -1
- package/dist/components/hazo_data_form/hazo_data_form.d.ts +2 -1
- package/dist/components/hazo_data_form/hazo_data_form.d.ts.map +1 -1
- package/dist/components/hazo_data_form/hazo_data_form.js +13 -4
- package/dist/components/hazo_data_form/hazo_data_form.js.map +1 -1
- package/dist/components/hazo_data_form/section_renderer.d.ts +3 -2
- package/dist/components/hazo_data_form/section_renderer.d.ts.map +1 -1
- package/dist/components/hazo_data_form/section_renderer.js +2 -2
- package/dist/components/hazo_data_form/section_renderer.js.map +1 -1
- package/dist/components/hazo_data_form/shared/data_form_field_layout.d.ts +1 -1
- package/dist/components/hazo_data_form/shared/data_form_field_layout.d.ts.map +1 -1
- package/dist/components/hazo_data_form/shared/data_form_field_layout.js +19 -8
- package/dist/components/hazo_data_form/shared/data_form_field_layout.js.map +1 -1
- package/dist/components/hazo_data_form/types.d.ts +31 -1
- package/dist/components/hazo_data_form/types.d.ts.map +1 -1
- package/dist/components/index.d.ts +6 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +4 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/shared/base_field_layout.d.ts.map +1 -1
- package/dist/components/shared/base_field_layout.js +5 -1
- package/dist/components/shared/base_field_layout.js.map +1 -1
- package/dist/components/shared/field_action_slot.d.ts +22 -0
- package/dist/components/shared/field_action_slot.d.ts.map +1 -0
- package/dist/components/shared/field_action_slot.js +20 -0
- package/dist/components/shared/field_action_slot.js.map +1 -0
- package/dist/components/shared/use_field_action_slot.d.ts +32 -0
- package/dist/components/shared/use_field_action_slot.d.ts.map +1 -0
- package/dist/components/shared/use_field_action_slot.js +52 -0
- package/dist/components/shared/use_field_action_slot.js.map +1 -0
- package/dist/components/thread_form/components/key_info_drawer.d.ts +7 -1
- package/dist/components/thread_form/components/key_info_drawer.d.ts.map +1 -1
- package/dist/components/thread_form/components/key_info_drawer.js +2 -2
- package/dist/components/thread_form/components/key_info_drawer.js.map +1 -1
- package/dist/components/thread_form/index.d.ts +1 -1
- package/dist/components/thread_form/index.d.ts.map +1 -1
- package/dist/components/thread_form/index.js.map +1 -1
- package/dist/components/thread_form/thread_form.d.ts.map +1 -1
- package/dist/components/thread_form/thread_form.js +2 -2
- package/dist/components/thread_form/thread_form.js.map +1 -1
- package/dist/components/thread_form/types.d.ts +29 -1
- package/dist/components/thread_form/types.d.ts.map +1 -1
- package/dist/components/thread_form/types.js.map +1 -1
- package/dist/lib/config.js +3 -3
- package/dist/lib/config.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structural interface for an external upload manager.
|
|
3
|
+
*
|
|
4
|
+
* hazo_collab_forms declares this interface locally — it never imports from
|
|
5
|
+
* hazo_files or any other upload library. Consumers supply whatever object
|
|
6
|
+
* matches this shape (duck-typed / structural compatibility).
|
|
7
|
+
*/
|
|
8
|
+
export type ExternalJobStatus = 'queued' | 'uploading' | 'processing' | 'awaiting_confirmation' | 'done' | 'error';
|
|
9
|
+
export interface ExternalJobSnapshot {
|
|
10
|
+
job_id: string;
|
|
11
|
+
group_id: string;
|
|
12
|
+
group_label?: string;
|
|
13
|
+
status: ExternalJobStatus;
|
|
14
|
+
progress: {
|
|
15
|
+
current: number;
|
|
16
|
+
total: number;
|
|
17
|
+
} | null;
|
|
18
|
+
files: ReadonlyArray<{
|
|
19
|
+
file_name: string;
|
|
20
|
+
mime_type: string;
|
|
21
|
+
file_id?: string;
|
|
22
|
+
download_url?: string;
|
|
23
|
+
}>;
|
|
24
|
+
extracted_data: Record<string, unknown>;
|
|
25
|
+
error: string | null;
|
|
26
|
+
}
|
|
27
|
+
export interface ExternalSubmitOptions {
|
|
28
|
+
files: File[];
|
|
29
|
+
group_id: string;
|
|
30
|
+
group_label?: string;
|
|
31
|
+
metadata?: Record<string, unknown>;
|
|
32
|
+
}
|
|
33
|
+
export interface ExternalUploadManagerEvents {
|
|
34
|
+
'job:created': {
|
|
35
|
+
job: ExternalJobSnapshot;
|
|
36
|
+
};
|
|
37
|
+
'job:status_changed': {
|
|
38
|
+
job: ExternalJobSnapshot;
|
|
39
|
+
previous_status: ExternalJobStatus;
|
|
40
|
+
};
|
|
41
|
+
'job:progress': {
|
|
42
|
+
job: ExternalJobSnapshot;
|
|
43
|
+
};
|
|
44
|
+
'job:completed': {
|
|
45
|
+
job: ExternalJobSnapshot;
|
|
46
|
+
};
|
|
47
|
+
'job:error': {
|
|
48
|
+
job: ExternalJobSnapshot;
|
|
49
|
+
error: string;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export interface ExternalUploadManager {
|
|
53
|
+
submit_batch(options: ExternalSubmitOptions): string;
|
|
54
|
+
get_jobs_for_group(group_id: string): ReadonlyArray<ExternalJobSnapshot>;
|
|
55
|
+
on<K extends keyof ExternalUploadManagerEvents>(event: K, listener: (data: ExternalUploadManagerEvents[K]) => void): () => void;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=external_upload_manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external_upload_manager.d.ts","sourceRoot":"","sources":["../../../src/components/autofill_dropzone/external_upload_manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,iBAAiB,GACzB,QAAQ,GACR,WAAW,GACX,YAAY,GACZ,uBAAuB,GACvB,MAAM,GACN,OAAO,CAAC;AAEZ,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACpD,KAAK,EAAE,aAAa,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;IACH,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,2BAA2B;IAC1C,aAAa,EAAE;QAAE,GAAG,EAAE,mBAAmB,CAAA;KAAE,CAAC;IAC5C,oBAAoB,EAAE;QAAE,GAAG,EAAE,mBAAmB,CAAC;QAAC,eAAe,EAAE,iBAAiB,CAAA;KAAE,CAAC;IACvF,cAAc,EAAE;QAAE,GAAG,EAAE,mBAAmB,CAAA;KAAE,CAAC;IAC7C,eAAe,EAAE;QAAE,GAAG,EAAE,mBAAmB,CAAA;KAAE,CAAC;IAC9C,WAAW,EAAE;QAAE,GAAG,EAAE,mBAAmB,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1D;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAAC;IACrD,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAAC,mBAAmB,CAAC,CAAC;IACzE,EAAE,CAAC,CAAC,SAAS,MAAM,2BAA2B,EAC5C,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAC,CAAC,KAAK,IAAI,GACvD,MAAM,IAAI,CAAC;CACf"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structural interface for an external upload manager.
|
|
3
|
+
*
|
|
4
|
+
* hazo_collab_forms declares this interface locally — it never imports from
|
|
5
|
+
* hazo_files or any other upload library. Consumers supply whatever object
|
|
6
|
+
* matches this shape (duck-typed / structural compatibility).
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=external_upload_manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external_upload_manager.js","sourceRoot":"","sources":["../../../src/components/autofill_dropzone/external_upload_manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -4,4 +4,5 @@
|
|
|
4
4
|
export { AutofillDropzone } from './autofill_dropzone.js';
|
|
5
5
|
export { OverwriteConfirmDialog } from './overwrite_confirm_dialog.js';
|
|
6
6
|
export type { AutofillFieldSchema, AutofillRequest, AutofillResponse, AutofillDropzoneProps, AutofillStatus, OverwriteConflict, } from './types.js';
|
|
7
|
+
export type { ExternalUploadManager, ExternalJobSnapshot, ExternalJobStatus, ExternalSubmitOptions, ExternalUploadManagerEvents, } from './external_upload_manager.js';
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/autofill_dropzone/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/autofill_dropzone/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,8BAA8B,CAAC"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import type { FormFileAttachment } from '../../types/file_attachment.js';
|
|
9
9
|
import type { FileUploadOptions } from '../../types/file_manager.js';
|
|
10
|
+
import type { ExternalUploadManager } from './external_upload_manager.js';
|
|
10
11
|
/**
|
|
11
12
|
* Schema for a single field, sent to the autofill API so the LLM knows what to extract.
|
|
12
13
|
*/
|
|
@@ -106,5 +107,7 @@ export interface AutofillDropzoneProps {
|
|
|
106
107
|
form_data: Record<string, unknown>;
|
|
107
108
|
/** Whether the group is locked (disables the dropzone) */
|
|
108
109
|
locked?: boolean;
|
|
110
|
+
/** Optional background upload manager. When provided, files are submitted to this manager instead of the inline pipeline. */
|
|
111
|
+
upload_manager?: ExternalUploadManager;
|
|
109
112
|
}
|
|
110
113
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/autofill_dropzone/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/autofill_dropzone/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FormDataAuditor — invisible component that diffs `form_data` between
|
|
3
|
+
* renders and records each changed field as a `manual` audit entry.
|
|
4
|
+
*
|
|
5
|
+
* Coalescing strategy: controlled inputs fire on every keystroke, which
|
|
6
|
+
* would produce one audit entry per character. Instead, we debounce per
|
|
7
|
+
* field — when a field changes we (re)start a per-field timer, and once
|
|
8
|
+
* the user has been idle for `debounce_ms` we record ONE entry whose
|
|
9
|
+
* `prev_value` is the last committed value and whose `new_value` is the
|
|
10
|
+
* latest current value. The result is one entry per typing burst.
|
|
11
|
+
*
|
|
12
|
+
* On unmount any pending timers are flushed so we don't lose unfinished
|
|
13
|
+
* edits. Internal keys prefixed with `__` (file attachments,
|
|
14
|
+
* clarification storage, etc.) are ignored.
|
|
15
|
+
*
|
|
16
|
+
* Renders nothing.
|
|
17
|
+
*/
|
|
18
|
+
export interface FormDataAuditorProps {
|
|
19
|
+
form_data: Record<string, unknown> | undefined;
|
|
20
|
+
current_user?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Milliseconds of idle time after the last change before an entry is
|
|
23
|
+
* recorded. Keystrokes within the window are coalesced into a single
|
|
24
|
+
* audit entry. Defaults to 750ms — enough for normal typing pauses but
|
|
25
|
+
* short enough that tabbing out feels immediate.
|
|
26
|
+
*/
|
|
27
|
+
debounce_ms?: number;
|
|
28
|
+
}
|
|
29
|
+
export declare function FormDataAuditor({ form_data, current_user, debounce_ms, }: FormDataAuditorProps): null;
|
|
30
|
+
//# sourceMappingURL=auditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auditor.d.ts","sourceRoot":"","sources":["../../../src/components/field_audit/auditor.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AASD,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,YAAY,EACZ,WAAiB,GAClB,EAAE,oBAAoB,GAAG,IAAI,CAgF7B"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FormDataAuditor — invisible component that diffs `form_data` between
|
|
3
|
+
* renders and records each changed field as a `manual` audit entry.
|
|
4
|
+
*
|
|
5
|
+
* Coalescing strategy: controlled inputs fire on every keystroke, which
|
|
6
|
+
* would produce one audit entry per character. Instead, we debounce per
|
|
7
|
+
* field — when a field changes we (re)start a per-field timer, and once
|
|
8
|
+
* the user has been idle for `debounce_ms` we record ONE entry whose
|
|
9
|
+
* `prev_value` is the last committed value and whose `new_value` is the
|
|
10
|
+
* latest current value. The result is one entry per typing burst.
|
|
11
|
+
*
|
|
12
|
+
* On unmount any pending timers are flushed so we don't lose unfinished
|
|
13
|
+
* edits. Internal keys prefixed with `__` (file attachments,
|
|
14
|
+
* clarification storage, etc.) are ignored.
|
|
15
|
+
*
|
|
16
|
+
* Renders nothing.
|
|
17
|
+
*/
|
|
18
|
+
'use client';
|
|
19
|
+
import { useEffect, useRef } from 'react';
|
|
20
|
+
import { useFieldAuditOptional } from './context.js';
|
|
21
|
+
export function FormDataAuditor({ form_data, current_user, debounce_ms = 750, }) {
|
|
22
|
+
const audit = useFieldAuditOptional();
|
|
23
|
+
// Last committed values — what we'll use as `prev_value` when the next
|
|
24
|
+
// debounced entry fires. Starts at the initial form_data so we don't
|
|
25
|
+
// emit a synthetic "everything changed" entry on first mount.
|
|
26
|
+
const committed_ref = useRef({ ...(form_data ?? {}) });
|
|
27
|
+
// Live form_data, kept fresh via render so the debounced timer reads
|
|
28
|
+
// the latest value at fire time (not the value at the time we set the timer).
|
|
29
|
+
const live_ref = useRef(form_data ?? {});
|
|
30
|
+
live_ref.current = form_data ?? {};
|
|
31
|
+
// Per-field debounce state. `current_user` is captured into the closure.
|
|
32
|
+
const pending_ref = useRef(new Map());
|
|
33
|
+
// Diff each render and schedule audit entries.
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
if (!audit)
|
|
36
|
+
return;
|
|
37
|
+
const prev = committed_ref.current;
|
|
38
|
+
const curr = form_data ?? {};
|
|
39
|
+
const pending = pending_ref.current;
|
|
40
|
+
const keys = new Set([...Object.keys(prev), ...Object.keys(curr)]);
|
|
41
|
+
for (const key of keys) {
|
|
42
|
+
if (key.startsWith('__'))
|
|
43
|
+
continue;
|
|
44
|
+
const baseline = pending.get(key)?.baseline ?? prev[key];
|
|
45
|
+
const after = curr[key];
|
|
46
|
+
// If the value is back at the baseline (e.g. user typed then erased),
|
|
47
|
+
// cancel any pending entry and forget the field.
|
|
48
|
+
if (Object.is(baseline, after)) {
|
|
49
|
+
const existing = pending.get(key);
|
|
50
|
+
if (existing) {
|
|
51
|
+
clearTimeout(existing.timer);
|
|
52
|
+
pending.delete(key);
|
|
53
|
+
}
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
// Restart the per-field debounce.
|
|
57
|
+
const existing = pending.get(key);
|
|
58
|
+
if (existing) {
|
|
59
|
+
clearTimeout(existing.timer);
|
|
60
|
+
}
|
|
61
|
+
const timer = setTimeout(() => {
|
|
62
|
+
const latest = live_ref.current[key];
|
|
63
|
+
const prev_value = pending.get(key)?.baseline ?? prev[key];
|
|
64
|
+
pending.delete(key);
|
|
65
|
+
if (Object.is(prev_value, latest))
|
|
66
|
+
return;
|
|
67
|
+
audit.record_change({
|
|
68
|
+
field_id: key,
|
|
69
|
+
source: 'manual',
|
|
70
|
+
prev_value,
|
|
71
|
+
new_value: latest,
|
|
72
|
+
user: current_user,
|
|
73
|
+
});
|
|
74
|
+
committed_ref.current = { ...committed_ref.current, [key]: latest };
|
|
75
|
+
}, debounce_ms);
|
|
76
|
+
pending.set(key, { baseline, timer });
|
|
77
|
+
}
|
|
78
|
+
}, [form_data, audit, current_user, debounce_ms]);
|
|
79
|
+
// Flush any pending timers on unmount.
|
|
80
|
+
useEffect(() => {
|
|
81
|
+
return () => {
|
|
82
|
+
const pending = pending_ref.current;
|
|
83
|
+
for (const [, entry] of pending) {
|
|
84
|
+
clearTimeout(entry.timer);
|
|
85
|
+
}
|
|
86
|
+
pending.clear();
|
|
87
|
+
};
|
|
88
|
+
}, []);
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=auditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auditor.js","sourceRoot":"","sources":["../../../src/components/field_audit/auditor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FieldAuditProvider — owns the in-session audit history.
|
|
3
|
+
*
|
|
4
|
+
* State lives in React state, so it dies with the component tree. Persistence
|
|
5
|
+
* is intentionally out of scope for this release; consuming apps that need
|
|
6
|
+
* durable audit logs can keep their own copy by subscribing to record_change
|
|
7
|
+
* via the imperative API.
|
|
8
|
+
*/
|
|
9
|
+
import React from 'react';
|
|
10
|
+
import type { ReactNode } from 'react';
|
|
11
|
+
import type { FieldAuditContextValue } from './types.js';
|
|
12
|
+
declare const FieldAuditContext: React.Context<FieldAuditContextValue | undefined>;
|
|
13
|
+
/**
|
|
14
|
+
* Hook for consumers that *must* run inside a provider. Throws otherwise.
|
|
15
|
+
*/
|
|
16
|
+
export declare function useFieldAudit(): FieldAuditContextValue;
|
|
17
|
+
/**
|
|
18
|
+
* Hook for components that may render with or without an audit provider.
|
|
19
|
+
* `FieldAuditIcon` and `FieldAuditPanel` use this so they can be dropped
|
|
20
|
+
* into a slot whether or not audit is enabled — when no provider is mounted
|
|
21
|
+
* they silently render nothing.
|
|
22
|
+
*/
|
|
23
|
+
export declare function useFieldAuditOptional(): FieldAuditContextValue | undefined;
|
|
24
|
+
export interface FieldAuditProviderProps {
|
|
25
|
+
children: ReactNode;
|
|
26
|
+
}
|
|
27
|
+
export declare function FieldAuditProvider({ children }: FieldAuditProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
export { FieldAuditContext };
|
|
29
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/components/field_audit/context.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAON,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAEV,sBAAsB,EAEvB,MAAM,YAAY,CAAC;AAEpB,QAAA,MAAM,iBAAiB,mDAEtB,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,IAAI,sBAAsB,CAMtD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,sBAAsB,GAAG,SAAS,CAE1E;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,SAAS,CAAC;CACrB;AAMD,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE,uBAAuB,2CAuGvE;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FieldAuditProvider — owns the in-session audit history.
|
|
3
|
+
*
|
|
4
|
+
* State lives in React state, so it dies with the component tree. Persistence
|
|
5
|
+
* is intentionally out of scope for this release; consuming apps that need
|
|
6
|
+
* durable audit logs can keep their own copy by subscribing to record_change
|
|
7
|
+
* via the imperative API.
|
|
8
|
+
*/
|
|
9
|
+
'use client';
|
|
10
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
11
|
+
import { createContext, useCallback, useContext, useMemo, useRef, useState, } from 'react';
|
|
12
|
+
const FieldAuditContext = createContext(undefined);
|
|
13
|
+
/**
|
|
14
|
+
* Hook for consumers that *must* run inside a provider. Throws otherwise.
|
|
15
|
+
*/
|
|
16
|
+
export function useFieldAudit() {
|
|
17
|
+
const ctx = useContext(FieldAuditContext);
|
|
18
|
+
if (!ctx) {
|
|
19
|
+
throw new Error('useFieldAudit must be used inside <FieldAuditProvider>');
|
|
20
|
+
}
|
|
21
|
+
return ctx;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Hook for components that may render with or without an audit provider.
|
|
25
|
+
* `FieldAuditIcon` and `FieldAuditPanel` use this so they can be dropped
|
|
26
|
+
* into a slot whether or not audit is enabled — when no provider is mounted
|
|
27
|
+
* they silently render nothing.
|
|
28
|
+
*/
|
|
29
|
+
export function useFieldAuditOptional() {
|
|
30
|
+
return useContext(FieldAuditContext);
|
|
31
|
+
}
|
|
32
|
+
function make_id(field_id) {
|
|
33
|
+
return `${field_id}_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
34
|
+
}
|
|
35
|
+
export function FieldAuditProvider({ children }) {
|
|
36
|
+
const [entries, set_entries] = useState(() => new Map());
|
|
37
|
+
const [expanded, set_expanded] = useState(() => new Set());
|
|
38
|
+
// Mirror entries in a ref so the auto-watcher (FormDataAuditor) can read
|
|
39
|
+
// the live state without re-binding to setState and creating stale closures.
|
|
40
|
+
const entries_ref = useRef(entries);
|
|
41
|
+
entries_ref.current = entries;
|
|
42
|
+
const record_change = useCallback((input) => {
|
|
43
|
+
set_entries((prev) => {
|
|
44
|
+
const existing = prev.get(input.field_id) ?? [];
|
|
45
|
+
const last = existing[0];
|
|
46
|
+
const window_ms = input.dedup_window_ms ?? 500;
|
|
47
|
+
// Dedup against a recent entry with the same new value.
|
|
48
|
+
if (last &&
|
|
49
|
+
Object.is(last.new_value, input.new_value) &&
|
|
50
|
+
Date.now() - last.at < window_ms) {
|
|
51
|
+
// The auto-watcher fires `manual` on every form_data change; an
|
|
52
|
+
// explicit caller may classify the same change as `clarification`
|
|
53
|
+
// before/around the watcher fires. Always promote the existing
|
|
54
|
+
// entry to the more specific source.
|
|
55
|
+
if (last.source === 'manual' && input.source !== 'manual') {
|
|
56
|
+
const promoted = {
|
|
57
|
+
...last,
|
|
58
|
+
source: input.source,
|
|
59
|
+
user: input.user ?? last.user,
|
|
60
|
+
};
|
|
61
|
+
const next = new Map(prev);
|
|
62
|
+
next.set(input.field_id, [promoted, ...existing.slice(1)]);
|
|
63
|
+
return next;
|
|
64
|
+
}
|
|
65
|
+
// Otherwise treat as a duplicate and keep the existing entry.
|
|
66
|
+
return prev;
|
|
67
|
+
}
|
|
68
|
+
const entry = {
|
|
69
|
+
id: make_id(input.field_id),
|
|
70
|
+
field_id: input.field_id,
|
|
71
|
+
source: input.source,
|
|
72
|
+
at: Date.now(),
|
|
73
|
+
prev_value: input.prev_value !== undefined ? input.prev_value : last?.new_value,
|
|
74
|
+
new_value: input.new_value,
|
|
75
|
+
user: input.user,
|
|
76
|
+
};
|
|
77
|
+
const next = new Map(prev);
|
|
78
|
+
next.set(input.field_id, [entry, ...existing]);
|
|
79
|
+
return next;
|
|
80
|
+
});
|
|
81
|
+
}, []);
|
|
82
|
+
const toggle_expanded = useCallback((field_id) => {
|
|
83
|
+
set_expanded((prev) => {
|
|
84
|
+
const next = new Set(prev);
|
|
85
|
+
if (next.has(field_id))
|
|
86
|
+
next.delete(field_id);
|
|
87
|
+
else
|
|
88
|
+
next.add(field_id);
|
|
89
|
+
return next;
|
|
90
|
+
});
|
|
91
|
+
}, []);
|
|
92
|
+
const clear_field = useCallback((field_id) => {
|
|
93
|
+
set_entries((prev) => {
|
|
94
|
+
if (!prev.has(field_id))
|
|
95
|
+
return prev;
|
|
96
|
+
const next = new Map(prev);
|
|
97
|
+
next.delete(field_id);
|
|
98
|
+
return next;
|
|
99
|
+
});
|
|
100
|
+
set_expanded((prev) => {
|
|
101
|
+
if (!prev.has(field_id))
|
|
102
|
+
return prev;
|
|
103
|
+
const next = new Set(prev);
|
|
104
|
+
next.delete(field_id);
|
|
105
|
+
return next;
|
|
106
|
+
});
|
|
107
|
+
}, []);
|
|
108
|
+
const clear_all = useCallback(() => {
|
|
109
|
+
set_entries(new Map());
|
|
110
|
+
set_expanded(new Set());
|
|
111
|
+
}, []);
|
|
112
|
+
const value = useMemo(() => ({
|
|
113
|
+
entries,
|
|
114
|
+
expanded,
|
|
115
|
+
record_change,
|
|
116
|
+
toggle_expanded,
|
|
117
|
+
clear_field,
|
|
118
|
+
clear_all,
|
|
119
|
+
}), [entries, expanded, record_change, toggle_expanded, clear_field, clear_all]);
|
|
120
|
+
return (_jsx(FieldAuditContext.Provider, { value: value, children: children }));
|
|
121
|
+
}
|
|
122
|
+
export { FieldAuditContext };
|
|
123
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/components/field_audit/context.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FieldAuditIcon — designed to be dropped into the
|
|
3
|
+
* `field_action_components.row_end` slot. Renders a small clock toggle that
|
|
4
|
+
* opens/closes the audit history panel for the field.
|
|
5
|
+
*
|
|
6
|
+
* Visible whenever the field has at least one recorded entry. Hidden when
|
|
7
|
+
* the audit provider is absent (so it can sit safely in a shared slot).
|
|
8
|
+
*/
|
|
9
|
+
import React from 'react';
|
|
10
|
+
import type { FieldActionContext } from '../hazo_collab_form_view/types.js';
|
|
11
|
+
export declare function FieldAuditIcon({ field }: FieldActionContext): React.ReactElement | null;
|
|
12
|
+
//# sourceMappingURL=field_audit_icon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field_audit_icon.d.ts","sourceRoot":"","sources":["../../../src/components/field_audit/field_audit_icon.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAE5E,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE,kBAAkB,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAiDvF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FieldAuditIcon — designed to be dropped into the
|
|
3
|
+
* `field_action_components.row_end` slot. Renders a small clock toggle that
|
|
4
|
+
* opens/closes the audit history panel for the field.
|
|
5
|
+
*
|
|
6
|
+
* Visible whenever the field has at least one recorded entry. Hidden when
|
|
7
|
+
* the audit provider is absent (so it can sit safely in a shared slot).
|
|
8
|
+
*/
|
|
9
|
+
'use client';
|
|
10
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
11
|
+
import { useFieldAuditOptional } from './context.js';
|
|
12
|
+
export function FieldAuditIcon({ field }) {
|
|
13
|
+
const audit = useFieldAuditOptional();
|
|
14
|
+
if (!audit)
|
|
15
|
+
return null;
|
|
16
|
+
const list = audit.entries.get(field.id) ?? [];
|
|
17
|
+
if (list.length === 0)
|
|
18
|
+
return null;
|
|
19
|
+
const is_open = audit.expanded.has(field.id);
|
|
20
|
+
const count = list.length;
|
|
21
|
+
return (_jsxs("button", { type: "button", "data-testid": `field_audit_icon_${field.id}`, "data-state": is_open ? 'open' : 'closed', "aria-expanded": is_open, "aria-label": `Show ${count} audit ${count === 1 ? 'entry' : 'entries'} for ${field.id}`, title: `${count} change${count === 1 ? '' : 's'} recorded`, onClick: () => audit.toggle_expanded(field.id), className: "cls_field_audit_icon inline-flex items-center justify-center gap-1 h-7 px-2 rounded-md text-[11px] font-medium text-amber-700 hover:bg-amber-50 hover:text-amber-900 transition-colors", children: [_jsxs("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "h-3.5 w-3.5", children: [_jsx("circle", { cx: "12", cy: "12", r: "9" }), _jsx("polyline", { points: "12 7 12 12 15 14" })] }), _jsx("span", { className: "font-mono", children: count }), _jsx("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: `h-3 w-3 transition-transform ${is_open ? 'rotate-180' : ''}`, children: _jsx("polyline", { points: "6 9 12 15 18 9" }) })] }));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=field_audit_icon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field_audit_icon.js","sourceRoot":"","sources":["../../../src/components/field_audit/field_audit_icon.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,YAAY,CAAC;;AAGb,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAGrD,MAAM,UAAU,cAAc,CAAC,EAAE,KAAK,EAAsB;IAC1D,MAAM,KAAK,GAAG,qBAAqB,EAAE,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;IAE1B,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,iBACA,oBAAoB,KAAK,CAAC,EAAE,EAAE,gBAC/B,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,mBACxB,OAAO,gBACV,QAAQ,KAAK,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,QAAQ,KAAK,CAAC,EAAE,EAAE,EACtF,KAAK,EAAE,GAAG,KAAK,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,EAC1D,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,EAC9C,SAAS,EAAC,wLAAwL,aAElM,8BACc,MAAM,EAClB,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,SAAS,EAAC,aAAa,aAEvB,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,GAAG,EAChC,mBAAU,MAAM,EAAC,kBAAkB,GAAG,IAClC,EACN,eAAM,SAAS,EAAC,WAAW,YAAE,KAAK,GAAQ,EAC1C,6BACc,MAAM,EAClB,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,SAAS,EAAE,gCAAgC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,YAExE,mBAAU,MAAM,EAAC,gBAAgB,GAAG,GAChC,IACC,CACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FieldAuditPanel — designed to be dropped into the
|
|
3
|
+
* `field_action_components.row_below` slot. Renders the per-field history
|
|
4
|
+
* list when the icon is toggled open.
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import type { FieldActionContext } from '../hazo_collab_form_view/types.js';
|
|
8
|
+
export declare function FieldAuditPanel({ field }: FieldActionContext): React.ReactElement | null;
|
|
9
|
+
//# sourceMappingURL=field_audit_panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field_audit_panel.d.ts","sourceRoot":"","sources":["../../../src/components/field_audit/field_audit_panel.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAsD5E,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,kBAAkB,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAiCxF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FieldAuditPanel — designed to be dropped into the
|
|
3
|
+
* `field_action_components.row_below` slot. Renders the per-field history
|
|
4
|
+
* list when the icon is toggled open.
|
|
5
|
+
*/
|
|
6
|
+
'use client';
|
|
7
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
8
|
+
import { useFieldAuditOptional } from './context.js';
|
|
9
|
+
function format_value(value) {
|
|
10
|
+
if (value === undefined)
|
|
11
|
+
return '—';
|
|
12
|
+
if (value === null)
|
|
13
|
+
return 'null';
|
|
14
|
+
if (typeof value === 'string')
|
|
15
|
+
return value === '' ? '""' : `"${value}"`;
|
|
16
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
17
|
+
return String(value);
|
|
18
|
+
try {
|
|
19
|
+
return JSON.stringify(value);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return String(value);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function format_time(at) {
|
|
26
|
+
const date = new Date(at);
|
|
27
|
+
const hh = String(date.getHours()).padStart(2, '0');
|
|
28
|
+
const mm = String(date.getMinutes()).padStart(2, '0');
|
|
29
|
+
const ss = String(date.getSeconds()).padStart(2, '0');
|
|
30
|
+
return `${hh}:${mm}:${ss}`;
|
|
31
|
+
}
|
|
32
|
+
function source_label(source) {
|
|
33
|
+
switch (source) {
|
|
34
|
+
case 'manual':
|
|
35
|
+
return 'edit';
|
|
36
|
+
case 'clarification':
|
|
37
|
+
return 'clarification';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function EntryRow({ entry }) {
|
|
41
|
+
return (_jsxs("li", { className: "cls_field_audit_entry flex items-baseline gap-2 px-2 py-1 text-[11px] font-mono", children: [_jsx("span", { className: "text-amber-700/70 shrink-0", children: format_time(entry.at) }), _jsx("span", { className: "text-amber-900 shrink-0 uppercase tracking-wide text-[10px]", children: source_label(entry.source) }), entry.user && (_jsx("span", { className: "text-slate-600 shrink-0", children: entry.user })), _jsxs("span", { className: "text-slate-500 truncate", children: [format_value(entry.prev_value), " ", _jsx("span", { "aria-hidden": true, children: "\u2192" }), ' ', _jsx("span", { className: "text-emerald-700", children: format_value(entry.new_value) })] })] }));
|
|
42
|
+
}
|
|
43
|
+
export function FieldAuditPanel({ field }) {
|
|
44
|
+
const audit = useFieldAuditOptional();
|
|
45
|
+
if (!audit)
|
|
46
|
+
return null;
|
|
47
|
+
if (!audit.expanded.has(field.id))
|
|
48
|
+
return null;
|
|
49
|
+
const list = audit.entries.get(field.id) ?? [];
|
|
50
|
+
if (list.length === 0)
|
|
51
|
+
return null;
|
|
52
|
+
return (_jsxs("div", { "data-testid": `field_audit_panel_${field.id}`, className: "cls_field_audit_panel mx-3 mb-2 rounded-md border border-amber-200 bg-amber-50/60", children: [_jsxs("div", { className: "flex items-center justify-between px-2 py-1 border-b border-amber-200/60", children: [_jsxs("span", { className: "text-[10px] uppercase tracking-wide text-amber-800", children: ["Field audit \u00B7 ", list.length, " change", list.length === 1 ? '' : 's'] }), _jsx("button", { type: "button", onClick: () => audit.clear_field(field.id), "aria-label": `Clear audit history for ${field.id}`, className: "text-[10px] text-amber-700/70 hover:text-red-600", children: "Clear" })] }), _jsx("ol", { className: "divide-y divide-amber-100", children: list.map((entry) => (_jsx(EntryRow, { entry: entry }, entry.id))) })] }));
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=field_audit_panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field_audit_panel.js","sourceRoot":"","sources":["../../../src/components/field_audit/field_audit_panel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FieldAudit — in-session per-field change history.
|
|
3
|
+
*
|
|
4
|
+
* Exports:
|
|
5
|
+
* - `FieldAuditProvider` — wraps your form and holds the entries map.
|
|
6
|
+
* - `FormDataAuditor` — invisible component that auto-records changes to
|
|
7
|
+
* `form_data` as `manual` entries.
|
|
8
|
+
* - `FieldAuditIcon` — designed for the `row_end` action slot.
|
|
9
|
+
* - `FieldAuditPanel` — designed for the `row_below` action slot.
|
|
10
|
+
* - `useFieldAudit` / `useFieldAuditOptional` — context hooks (use the
|
|
11
|
+
* imperative API from inside the provider to record non-manual sources
|
|
12
|
+
* such as `clarification`).
|
|
13
|
+
*
|
|
14
|
+
* The form view components (`HazoCollabFormView`, `HazoDataForm`,
|
|
15
|
+
* `ThreadForm`) accept an `enable_field_audit?: boolean` convenience flag
|
|
16
|
+
* that mounts the provider, the auditor, and merges the icon/panel into
|
|
17
|
+
* `field_action_components` for you.
|
|
18
|
+
*/
|
|
19
|
+
export { FieldAuditProvider, FieldAuditContext, useFieldAudit, useFieldAuditOptional, } from './context.js';
|
|
20
|
+
export type { FieldAuditProviderProps } from './context.js';
|
|
21
|
+
export { FormDataAuditor } from './auditor.js';
|
|
22
|
+
export type { FormDataAuditorProps } from './auditor.js';
|
|
23
|
+
export { FieldAuditIcon } from './field_audit_icon.js';
|
|
24
|
+
export { FieldAuditPanel } from './field_audit_panel.js';
|
|
25
|
+
export { useFieldAuditWiring } from './with_field_audit.js';
|
|
26
|
+
export type { FieldAuditWiring, UseFieldAuditWiringOptions, } from './with_field_audit.js';
|
|
27
|
+
export type { AuditEntry, AuditSource, FieldAuditContextValue, RecordChangeInput, } from './types.js';
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/field_audit/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,qBAAqB,GACtB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EACV,gBAAgB,EAChB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EACV,UAAU,EACV,WAAW,EACX,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FieldAudit — in-session per-field change history.
|
|
3
|
+
*
|
|
4
|
+
* Exports:
|
|
5
|
+
* - `FieldAuditProvider` — wraps your form and holds the entries map.
|
|
6
|
+
* - `FormDataAuditor` — invisible component that auto-records changes to
|
|
7
|
+
* `form_data` as `manual` entries.
|
|
8
|
+
* - `FieldAuditIcon` — designed for the `row_end` action slot.
|
|
9
|
+
* - `FieldAuditPanel` — designed for the `row_below` action slot.
|
|
10
|
+
* - `useFieldAudit` / `useFieldAuditOptional` — context hooks (use the
|
|
11
|
+
* imperative API from inside the provider to record non-manual sources
|
|
12
|
+
* such as `clarification`).
|
|
13
|
+
*
|
|
14
|
+
* The form view components (`HazoCollabFormView`, `HazoDataForm`,
|
|
15
|
+
* `ThreadForm`) accept an `enable_field_audit?: boolean` convenience flag
|
|
16
|
+
* that mounts the provider, the auditor, and merges the icon/panel into
|
|
17
|
+
* `field_action_components` for you.
|
|
18
|
+
*/
|
|
19
|
+
export { FieldAuditProvider, FieldAuditContext, useFieldAudit, useFieldAuditOptional, } from './context.js';
|
|
20
|
+
export { FormDataAuditor } from './auditor.js';
|
|
21
|
+
export { FieldAuditIcon } from './field_audit_icon.js';
|
|
22
|
+
export { FieldAuditPanel } from './field_audit_panel.js';
|
|
23
|
+
export { useFieldAuditWiring } from './with_field_audit.js';
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/field_audit/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC"}
|