hazo_collab_forms 1.9.3 → 1.9.4

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 (58) hide show
  1. package/README.md +62 -0
  2. package/dist/components/_internal_form_set.d.ts +24 -0
  3. package/dist/components/_internal_form_set.d.ts.map +1 -1
  4. package/dist/components/_internal_form_set.js +36 -3
  5. package/dist/components/_internal_form_set.js.map +1 -1
  6. package/dist/components/autofill_dropzone/autofill_dropzone.d.ts +21 -0
  7. package/dist/components/autofill_dropzone/autofill_dropzone.d.ts.map +1 -0
  8. package/dist/components/autofill_dropzone/autofill_dropzone.js +299 -0
  9. package/dist/components/autofill_dropzone/autofill_dropzone.js.map +1 -0
  10. package/dist/components/autofill_dropzone/index.d.ts +7 -0
  11. package/dist/components/autofill_dropzone/index.d.ts.map +1 -0
  12. package/dist/components/autofill_dropzone/index.js +6 -0
  13. package/dist/components/autofill_dropzone/index.js.map +1 -0
  14. package/dist/components/autofill_dropzone/overwrite_confirm_dialog.d.ts +17 -0
  15. package/dist/components/autofill_dropzone/overwrite_confirm_dialog.d.ts.map +1 -0
  16. package/dist/components/autofill_dropzone/overwrite_confirm_dialog.js +24 -0
  17. package/dist/components/autofill_dropzone/overwrite_confirm_dialog.js.map +1 -0
  18. package/dist/components/autofill_dropzone/types.d.ts +110 -0
  19. package/dist/components/autofill_dropzone/types.d.ts.map +1 -0
  20. package/dist/components/autofill_dropzone/types.js +9 -0
  21. package/dist/components/autofill_dropzone/types.js.map +1 -0
  22. package/dist/components/collab_form_file_upload.js +74 -6
  23. package/dist/components/collab_form_file_upload.js.map +1 -1
  24. package/dist/components/hazo_collab_form_data_table.d.ts.map +1 -1
  25. package/dist/components/hazo_collab_form_data_table.js +14 -2
  26. package/dist/components/hazo_collab_form_data_table.js.map +1 -1
  27. package/dist/components/hazo_collab_form_view/context.d.ts.map +1 -1
  28. package/dist/components/hazo_collab_form_view/context.js +4 -0
  29. package/dist/components/hazo_collab_form_view/context.js.map +1 -1
  30. package/dist/components/hazo_collab_form_view/types.d.ts +16 -0
  31. package/dist/components/hazo_collab_form_view/types.d.ts.map +1 -1
  32. package/dist/components/hazo_collab_form_view/views/approval_view.d.ts.map +1 -1
  33. package/dist/components/hazo_collab_form_view/views/approval_view.js +22 -17
  34. package/dist/components/hazo_collab_form_view/views/approval_view.js.map +1 -1
  35. package/dist/components/hazo_collab_form_view/views/edit_view.d.ts.map +1 -1
  36. package/dist/components/hazo_collab_form_view/views/edit_view.js +3 -1
  37. package/dist/components/hazo_collab_form_view/views/edit_view.js.map +1 -1
  38. package/dist/components/hazo_collab_form_view/views/print_view.d.ts.map +1 -1
  39. package/dist/components/hazo_collab_form_view/views/print_view.js +6 -0
  40. package/dist/components/hazo_collab_form_view/views/print_view.js.map +1 -1
  41. package/dist/components/hazo_collab_form_view/views/summary_data_table.d.ts +26 -0
  42. package/dist/components/hazo_collab_form_view/views/summary_data_table.d.ts.map +1 -0
  43. package/dist/components/hazo_collab_form_view/views/summary_data_table.js +103 -0
  44. package/dist/components/hazo_collab_form_view/views/summary_data_table.js.map +1 -0
  45. package/dist/components/hazo_collab_form_view/views/summary_view.d.ts.map +1 -1
  46. package/dist/components/hazo_collab_form_view/views/summary_view.js +28 -18
  47. package/dist/components/hazo_collab_form_view/views/summary_view.js.map +1 -1
  48. package/dist/components/index.d.ts +2 -0
  49. package/dist/components/index.d.ts.map +1 -1
  50. package/dist/components/index.js +2 -0
  51. package/dist/components/index.js.map +1 -1
  52. package/dist/components/shared/unified_field_controls/kebab_menu.js +1 -1
  53. package/dist/components/shared/unified_field_controls/kebab_menu.js.map +1 -1
  54. package/dist/components/shared/unified_field_controls/unified_field_controls.js +1 -1
  55. package/dist/components/shared/unified_field_controls/unified_field_controls.js.map +1 -1
  56. package/dist/components/shared/use_base_form_field.js +1 -1
  57. package/dist/components/shared/use_base_form_field.js.map +1 -1
  58. package/package.json +1 -1
@@ -0,0 +1,299 @@
1
+ /**
2
+ * AutofillDropzone - Compact dropzone for uploading source documents to autofill form fields.
3
+ *
4
+ * Supports multiple files: files are processed sequentially through the LLM API,
5
+ * and results are applied progressively so the user sees rows added to data tables
6
+ * one file at a time.
7
+ *
8
+ * Flow (per file):
9
+ * 1. File is uploaded via file_manager.upload()
10
+ * 2. POST request to autofill_api_endpoint with file info + field schemas
11
+ * 3. Response data is checked for overwrite conflicts (scalar values only; arrays are always appended)
12
+ * 4. If conflicts exist on the FIRST file, show confirmation dialog
13
+ * 5. On confirm (or no conflicts), call on_autofill_complete(data, attachment)
14
+ * 6. Move to next file
15
+ */
16
+ 'use client';
17
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
18
+ import { useRef, useState, useCallback, useEffect } from 'react';
19
+ import { cn } from '../../utils/cn.js';
20
+ import { HiCloudUpload } from 'react-icons/hi';
21
+ import { FaSpinner } from 'react-icons/fa';
22
+ import { OverwriteConfirmDialog } from './overwrite_confirm_dialog.js';
23
+ export function AutofillDropzone({ group_id, fields, autofill_api_endpoint, prompt_area, prompt_key, file_manager_upload, file_manager_get_download_url, on_autofill_complete, form_data, locked = false, }) {
24
+ const file_input_ref = useRef(null);
25
+ const [status, set_status] = useState('idle');
26
+ const [error_message, set_error_message] = useState(null);
27
+ const [info_message, set_info_message] = useState(null);
28
+ const [is_dragging, set_is_dragging] = useState(false);
29
+ // Multi-file progress tracking
30
+ const [progress, set_progress] = useState(null);
31
+ // Overwrite dialog state
32
+ const [show_overwrite_dialog, set_show_overwrite_dialog] = useState(false);
33
+ const [conflicts, set_conflicts] = useState([]);
34
+ // For multi-file, we store a resolve callback so the sequential loop can wait for user decision
35
+ const overwrite_resolve_ref = useRef(null);
36
+ /**
37
+ * Detect which fields have existing values that would be overwritten.
38
+ * Array values (data tables) are always appended, never treated as conflicts.
39
+ */
40
+ const detect_conflicts = useCallback((data) => {
41
+ const result = [];
42
+ for (const [field_id, new_value] of Object.entries(data)) {
43
+ if (new_value === null || new_value === undefined || new_value === '')
44
+ continue;
45
+ // Arrays (data table rows) are appended, not overwritten — skip conflict check
46
+ if (Array.isArray(new_value))
47
+ continue;
48
+ const current_value = form_data[field_id];
49
+ if (current_value !== null && current_value !== undefined && current_value !== '' && current_value !== false) {
50
+ const field_schema = fields.find((f) => f.field_id === field_id);
51
+ result.push({
52
+ field_id,
53
+ label: field_schema?.label || field_id,
54
+ current_value,
55
+ new_value,
56
+ });
57
+ }
58
+ }
59
+ return result;
60
+ }, [form_data, fields]);
61
+ // Refs for callbacks to avoid stale closures in the async sequential loop.
62
+ // Without these, process_files captures the callback from when it started,
63
+ // missing state updates from earlier files in the batch.
64
+ const on_autofill_complete_ref = useRef(on_autofill_complete);
65
+ const detect_conflicts_ref = useRef(detect_conflicts);
66
+ useEffect(() => {
67
+ on_autofill_complete_ref.current = on_autofill_complete;
68
+ detect_conflicts_ref.current = detect_conflicts;
69
+ });
70
+ /**
71
+ * Upload a single file and extract data via the autofill API.
72
+ * Returns { data, attachment } on success, or null on failure.
73
+ * Does NOT apply data — the caller is responsible for that.
74
+ */
75
+ const upload_and_extract = useCallback(async (file) => {
76
+ // Step 1: Upload
77
+ let attachment;
78
+ try {
79
+ attachment = await file_manager_upload(file, {
80
+ entity_type: 'form_field',
81
+ entity_id: group_id,
82
+ visibility: 'public',
83
+ });
84
+ }
85
+ catch (err) {
86
+ set_error_message(err instanceof Error ? err.message : `Upload failed: ${file.name}`);
87
+ return null;
88
+ }
89
+ // Step 2: Read file as base64
90
+ let file_b64;
91
+ try {
92
+ const array_buffer = await file.arrayBuffer();
93
+ const bytes = new Uint8Array(array_buffer);
94
+ let binary = '';
95
+ for (let i = 0; i < bytes.length; i++) {
96
+ binary += String.fromCharCode(bytes[i]);
97
+ }
98
+ file_b64 = btoa(binary);
99
+ }
100
+ catch {
101
+ // If base64 conversion fails, the API will fall back to download_url
102
+ }
103
+ // Step 3: Call autofill API
104
+ const download_url = file_manager_get_download_url(attachment.file_id, 'public');
105
+ const request_body = {
106
+ file_id: attachment.file_id,
107
+ file_name: attachment.file_name,
108
+ mime_type: attachment.mime_type,
109
+ download_url,
110
+ file_b64,
111
+ group_id,
112
+ prompt_area,
113
+ prompt_key,
114
+ fields,
115
+ };
116
+ let response_data;
117
+ try {
118
+ const response = await fetch(autofill_api_endpoint, {
119
+ method: 'POST',
120
+ headers: { 'Content-Type': 'application/json' },
121
+ body: JSON.stringify(request_body),
122
+ });
123
+ if (!response.ok) {
124
+ throw new Error(`Autofill API returned ${response.status}`);
125
+ }
126
+ response_data = await response.json();
127
+ }
128
+ catch (err) {
129
+ set_error_message(err instanceof Error ? err.message : `Extraction failed: ${file.name}`);
130
+ return null;
131
+ }
132
+ if (!response_data.success) {
133
+ set_error_message(response_data.error || `Extraction failed: ${file.name}`);
134
+ return null;
135
+ }
136
+ return {
137
+ data: response_data.data,
138
+ attachment,
139
+ message: response_data.message,
140
+ };
141
+ }, [group_id, fields, autofill_api_endpoint, prompt_area, prompt_key, file_manager_upload, file_manager_get_download_url]);
142
+ /**
143
+ * Process multiple files sequentially.
144
+ * Each file is uploaded, extracted, and results applied progressively.
145
+ */
146
+ const process_files = useCallback(async (files) => {
147
+ set_error_message(null);
148
+ set_info_message(null);
149
+ const total = files.length;
150
+ let completed = 0;
151
+ let had_errors = false;
152
+ let had_empty = false;
153
+ let last_info_message = null;
154
+ // Track whether the user already approved overwrites for this batch
155
+ let overwrites_approved = false;
156
+ set_progress({ current: 0, total });
157
+ for (const file of files) {
158
+ completed++;
159
+ set_progress({ current: completed, total });
160
+ // Show extracting status for each file
161
+ set_status('extracting');
162
+ const result = await upload_and_extract(file);
163
+ if (!result) {
164
+ had_errors = true;
165
+ // Continue to next file — error_message is already set
166
+ continue;
167
+ }
168
+ // Handle "no data found" message
169
+ if (result.message) {
170
+ last_info_message = result.message;
171
+ had_empty = true;
172
+ // Still apply the data (which may be empty) and attach the file
173
+ on_autofill_complete_ref.current(result.data, result.attachment);
174
+ continue;
175
+ }
176
+ // Check for scalar overwrite conflicts (only if not already approved for this batch)
177
+ if (!overwrites_approved) {
178
+ const found_conflicts = detect_conflicts_ref.current(result.data);
179
+ if (found_conflicts.length > 0) {
180
+ // Show dialog and wait for user decision
181
+ set_conflicts(found_conflicts);
182
+ set_show_overwrite_dialog(true);
183
+ set_status('idle');
184
+ const action = await new Promise((resolve) => {
185
+ overwrite_resolve_ref.current = resolve;
186
+ });
187
+ set_show_overwrite_dialog(false);
188
+ overwrite_resolve_ref.current = null;
189
+ if (action === 'cancel') {
190
+ // Skip this file's scalar data, but still attach the file and apply array data
191
+ const array_only_data = {};
192
+ for (const [key, val] of Object.entries(result.data)) {
193
+ if (Array.isArray(val))
194
+ array_only_data[key] = val;
195
+ }
196
+ if (Object.keys(array_only_data).length > 0) {
197
+ on_autofill_complete_ref.current(array_only_data, result.attachment);
198
+ }
199
+ continue;
200
+ }
201
+ // User approved — don't ask again for this batch
202
+ overwrites_approved = true;
203
+ set_status('extracting');
204
+ }
205
+ }
206
+ // Apply data — use ref to always call latest callback (avoids stale closure)
207
+ on_autofill_complete_ref.current(result.data, result.attachment);
208
+ }
209
+ // Final status
210
+ set_progress(null);
211
+ if (had_errors) {
212
+ set_status('error');
213
+ // error_message is already set from the last failure
214
+ }
215
+ else if (had_empty && !had_errors) {
216
+ set_info_message(last_info_message || 'No matching data found in some documents');
217
+ set_status('done_empty');
218
+ setTimeout(() => set_status('idle'), 5000);
219
+ }
220
+ else {
221
+ set_status('done');
222
+ setTimeout(() => set_status('idle'), 2000);
223
+ }
224
+ }, [upload_and_extract]);
225
+ // Overwrite confirmation handlers (resolve the promise)
226
+ const handle_overwrite_confirm = useCallback(() => {
227
+ overwrite_resolve_ref.current?.('confirm');
228
+ }, []);
229
+ const handle_overwrite_cancel = useCallback(() => {
230
+ overwrite_resolve_ref.current?.('cancel');
231
+ }, []);
232
+ // Drag handlers
233
+ const handle_drag_enter = useCallback((e) => {
234
+ e.preventDefault();
235
+ e.stopPropagation();
236
+ if (!locked)
237
+ set_is_dragging(true);
238
+ }, [locked]);
239
+ const handle_drag_leave = useCallback((e) => {
240
+ e.preventDefault();
241
+ e.stopPropagation();
242
+ set_is_dragging(false);
243
+ }, []);
244
+ const handle_drag_over = useCallback((e) => {
245
+ e.preventDefault();
246
+ e.stopPropagation();
247
+ }, []);
248
+ const handle_drop = useCallback((e) => {
249
+ e.preventDefault();
250
+ e.stopPropagation();
251
+ set_is_dragging(false);
252
+ if (locked || status !== 'idle')
253
+ return;
254
+ const file_list = e.dataTransfer.files;
255
+ if (file_list.length > 0) {
256
+ process_files(Array.from(file_list));
257
+ }
258
+ }, [locked, status, process_files]);
259
+ const handle_input_change = useCallback((e) => {
260
+ const file_list = e.target.files;
261
+ if (file_list && file_list.length > 0 && !locked && status === 'idle') {
262
+ process_files(Array.from(file_list));
263
+ }
264
+ if (file_input_ref.current)
265
+ file_input_ref.current.value = '';
266
+ }, [locked, status, process_files]);
267
+ const handle_click = useCallback(() => {
268
+ if (!locked && status === 'idle') {
269
+ file_input_ref.current?.click();
270
+ }
271
+ }, [locked, status]);
272
+ const handle_retry = useCallback(() => {
273
+ set_status('idle');
274
+ set_error_message(null);
275
+ set_progress(null);
276
+ }, []);
277
+ const is_busy = status === 'uploading' || status === 'extracting';
278
+ const is_disabled = locked || is_busy;
279
+ // Build status label
280
+ const get_status_label = () => {
281
+ if (!is_busy)
282
+ return '';
283
+ if (progress && progress.total > 1) {
284
+ return `Processing file ${progress.current} of ${progress.total}...`;
285
+ }
286
+ return 'Extracting data...';
287
+ };
288
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: cn('cls_autofill_dropzone flex items-center gap-2 px-3 py-1.5 mb-2 rounded-md border border-dashed transition-colors cursor-pointer select-none', is_disabled && 'opacity-50 cursor-not-allowed', is_dragging && !is_disabled
289
+ ? 'border-primary bg-primary/5'
290
+ : 'border-input hover:border-primary/50 hover:bg-muted/50', status === 'done' && 'border-green-400 bg-green-50 dark:bg-green-900/10', status === 'done_empty' && 'border-amber-400 bg-amber-50 dark:bg-amber-900/10', status === 'error' && 'border-destructive bg-destructive/5'), onDragEnter: handle_drag_enter, onDragLeave: handle_drag_leave, onDragOver: handle_drag_over, onDrop: handle_drop, onClick: handle_click, role: "button", tabIndex: is_disabled ? -1 : 0, "aria-disabled": is_disabled, "aria-label": "AI fill from document", children: [_jsx("input", { ref: file_input_ref, type: "file", className: "hidden", multiple: true, onChange: handle_input_change, disabled: is_disabled }), _jsx("div", { className: "flex-shrink-0", children: is_busy ? (_jsx(FaSpinner, { className: "h-4 w-4 text-primary animate-spin" })) : (_jsx(HiCloudUpload, { className: "h-4 w-4 text-muted-foreground" })) }), _jsxs("div", { className: "flex-1 min-w-0", children: [status === 'idle' && (_jsx("span", { className: "text-xs text-muted-foreground", children: "AI fill from document" })), is_busy && (_jsx("span", { className: "text-xs text-primary font-medium", children: get_status_label() })), status === 'done' && (_jsx("span", { className: "text-xs text-green-600 dark:text-green-400 font-medium", children: "Autofill complete" })), status === 'done_empty' && (_jsx("span", { className: "text-xs text-amber-600 dark:text-amber-400 font-medium", children: info_message || 'No matching data found in document' })), status === 'error' && (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-xs text-destructive truncate", children: error_message || 'An error occurred' }), _jsx("button", { type: "button", onClick: (e) => {
291
+ e.stopPropagation();
292
+ handle_retry();
293
+ }, className: "text-xs text-primary underline hover:no-underline flex-shrink-0", children: "Retry" })] }))] })] }), _jsx(OverwriteConfirmDialog, { open: show_overwrite_dialog, on_open_change: (open) => {
294
+ if (!open)
295
+ handle_overwrite_cancel();
296
+ }, conflicts: conflicts, on_confirm: handle_overwrite_confirm, on_cancel: handle_overwrite_cancel })] }));
297
+ }
298
+ AutofillDropzone.displayName = 'AutofillDropzone';
299
+ //# sourceMappingURL=autofill_dropzone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autofill_dropzone.js","sourceRoot":"","sources":["../../../src/components/autofill_dropzone/autofill_dropzone.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Autofill Dropzone - Upload a source document to autofill form fields via LLM extraction.
3
+ */
4
+ export { AutofillDropzone } from './autofill_dropzone.js';
5
+ export { OverwriteConfirmDialog } from './overwrite_confirm_dialog.js';
6
+ export type { AutofillFieldSchema, AutofillRequest, AutofillResponse, AutofillDropzoneProps, AutofillStatus, OverwriteConflict, } from './types.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Autofill Dropzone - Upload a source document to autofill form fields via LLM extraction.
3
+ */
4
+ export { AutofillDropzone } from './autofill_dropzone.js';
5
+ export { OverwriteConfirmDialog } from './overwrite_confirm_dialog.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Overwrite confirmation dialog for autofill.
3
+ *
4
+ * Shows a list of fields that have existing values which would be replaced
5
+ * by the autofill extraction, and asks the user to confirm or cancel.
6
+ */
7
+ import type { OverwriteConflict } from './types.js';
8
+ interface OverwriteConfirmDialogProps {
9
+ open: boolean;
10
+ on_open_change: (open: boolean) => void;
11
+ conflicts: OverwriteConflict[];
12
+ on_confirm: () => void;
13
+ on_cancel: () => void;
14
+ }
15
+ export declare function OverwriteConfirmDialog({ open, on_open_change, conflicts, on_confirm, on_cancel, }: OverwriteConfirmDialogProps): import("react/jsx-runtime").JSX.Element;
16
+ export {};
17
+ //# sourceMappingURL=overwrite_confirm_dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overwrite_confirm_dialog.d.ts","sourceRoot":"","sources":["../../../src/components/autofill_dropzone/overwrite_confirm_dialog.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,UAAU,2BAA2B;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,cAAc,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAUD,wBAAgB,sBAAsB,CAAC,EACrC,IAAI,EACJ,cAAc,EACd,SAAS,EACT,UAAU,EACV,SAAS,GACV,EAAE,2BAA2B,2CA+C7B"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Overwrite confirmation dialog for autofill.
3
+ *
4
+ * Shows a list of fields that have existing values which would be replaced
5
+ * by the autofill extraction, and asks the user to confirm or cancel.
6
+ */
7
+ 'use client';
8
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
+ import { Dialog, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescription, } from '../shared/dialog/index.js';
10
+ function format_value(value) {
11
+ if (value === null || value === undefined || value === '')
12
+ return '(empty)';
13
+ if (typeof value === 'boolean')
14
+ return value ? 'Yes' : 'No';
15
+ if (Array.isArray(value))
16
+ return `${value.length} row(s)`;
17
+ if (typeof value === 'string' && value.length > 60)
18
+ return value.slice(0, 60) + '...';
19
+ return String(value);
20
+ }
21
+ export function OverwriteConfirmDialog({ open, on_open_change, conflicts, on_confirm, on_cancel, }) {
22
+ return (_jsx(Dialog, { open: open, onOpenChange: on_open_change, children: _jsxs(DialogContent, { className: "sm:max-w-[480px]", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Overwrite existing values?" }), _jsxs(DialogDescription, { children: ["Autofill wants to replace ", conflicts.length, " field", conflicts.length !== 1 ? 's' : '', " that already have values."] })] }), _jsx("div", { className: "max-h-[300px] overflow-y-auto space-y-2 py-2", children: conflicts.map((conflict) => (_jsxs("div", { className: "text-sm border rounded-md p-2 space-y-1", children: [_jsx("div", { className: "font-medium", children: conflict.label }), _jsxs("div", { className: "grid grid-cols-[auto_1fr] gap-x-2 text-muted-foreground", children: [_jsx("span", { children: "Current:" }), _jsx("span", { className: "truncate", children: format_value(conflict.current_value) }), _jsx("span", { children: "New:" }), _jsx("span", { className: "truncate text-foreground", children: format_value(conflict.new_value) })] })] }, conflict.field_id))) }), _jsxs(DialogFooter, { className: "gap-2 sm:gap-0", children: [_jsx("button", { type: "button", onClick: on_cancel, className: "inline-flex items-center justify-center rounded-md text-sm font-medium h-9 px-4 border border-input bg-background hover:bg-accent hover:text-accent-foreground", children: "Cancel" }), _jsx("button", { type: "button", onClick: on_confirm, className: "inline-flex items-center justify-center rounded-md text-sm font-medium h-9 px-4 bg-primary text-primary-foreground hover:bg-primary/90", children: "Overwrite" })] })] }) }));
23
+ }
24
+ //# sourceMappingURL=overwrite_confirm_dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overwrite_confirm_dialog.js","sourceRoot":"","sources":["../../../src/components/autofill_dropzone/overwrite_confirm_dialog.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,CAAC;;AAGb,OAAO,EACL,MAAM,EACN,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AAWnC,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAC5E,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,KAAK,CAAC,MAAM,SAAS,CAAC;IAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC;IACtF,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,EACrC,IAAI,EACJ,cAAc,EACd,SAAS,EACT,UAAU,EACV,SAAS,GACmB;IAC5B,OAAO,CACL,KAAC,MAAM,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,cAAc,YAC9C,MAAC,aAAa,IAAC,SAAS,EAAC,kBAAkB,aACzC,MAAC,YAAY,eACX,KAAC,WAAW,6CAAyC,EACrD,MAAC,iBAAiB,6CACW,SAAS,CAAC,MAAM,YAAQ,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,kCAClE,IACP,EAEf,cAAK,SAAS,EAAC,8CAA8C,YAC1D,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAC3B,eAEE,SAAS,EAAC,yCAAyC,aAEnD,cAAK,SAAS,EAAC,aAAa,YAAE,QAAQ,CAAC,KAAK,GAAO,EACnD,eAAK,SAAS,EAAC,yDAAyD,aACtE,sCAAqB,EACrB,eAAM,SAAS,EAAC,UAAU,YAAE,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAQ,EACxE,kCAAiB,EACjB,eAAM,SAAS,EAAC,0BAA0B,YAAE,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAQ,IAChF,KATD,QAAQ,CAAC,QAAQ,CAUlB,CACP,CAAC,GACE,EAEN,MAAC,YAAY,IAAC,SAAS,EAAC,gBAAgB,aACtC,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,SAAS,EAClB,SAAS,EAAC,gKAAgK,uBAGnK,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,UAAU,EACnB,SAAS,EAAC,wIAAwI,0BAG3I,IACI,IACD,GACT,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Type definitions for the autofill dropzone feature.
3
+ *
4
+ * The autofill dropzone allows users to upload a source document (receipt, statement, etc.)
5
+ * which is sent to a consumer-provided API endpoint for LLM-based data extraction.
6
+ * The extracted data is then used to populate the group's child fields.
7
+ */
8
+ import type { FormFileAttachment } from '../../types/file_attachment.js';
9
+ import type { FileUploadOptions } from '../../types/file_manager.js';
10
+ /**
11
+ * Schema for a single field, sent to the autofill API so the LLM knows what to extract.
12
+ */
13
+ export interface AutofillFieldSchema {
14
+ /** Field identifier (used as key in response data) */
15
+ field_id: string;
16
+ /** Human-readable label */
17
+ label: string;
18
+ /** Component type (e.g., 'HazoCollabFormInputbox', 'HazoCollabFormDate', etc.) */
19
+ component_type: string;
20
+ /** Optional description for LLM context */
21
+ description?: string;
22
+ /** Input type hint (mixed, numeric, email, alpha) */
23
+ input_type?: string;
24
+ /** Options for radio/combo fields */
25
+ input_options?: Array<{
26
+ value: string;
27
+ label: string;
28
+ }>;
29
+ /** Table configuration for data-table fields */
30
+ table_config?: unknown;
31
+ }
32
+ /**
33
+ * Request payload sent to the autofill API endpoint.
34
+ */
35
+ export interface AutofillRequest {
36
+ /** Uploaded file identifier */
37
+ file_id: string;
38
+ /** Original file name */
39
+ file_name: string;
40
+ /** File MIME type */
41
+ mime_type: string;
42
+ /** URL to download the file */
43
+ download_url: string;
44
+ /** Base64-encoded file content (sent directly to avoid needing to fetch download_url) */
45
+ file_b64?: string;
46
+ /** Group identifier */
47
+ group_id: string;
48
+ /** Prompt area for LLM context (e.g., 'tax_deductions') */
49
+ prompt_area?: string;
50
+ /** Prompt key for LLM context (e.g., 'd1_car_expenses') */
51
+ prompt_key?: string;
52
+ /** Field schemas describing what to extract */
53
+ fields: AutofillFieldSchema[];
54
+ }
55
+ /**
56
+ * Response from the autofill API endpoint.
57
+ */
58
+ export interface AutofillResponse {
59
+ /** Whether extraction was successful */
60
+ success: boolean;
61
+ /** Extracted data keyed by field_id. Values are strings, booleans, or arrays (for data-tables). */
62
+ data: Record<string, unknown>;
63
+ /** Error message if extraction failed */
64
+ error?: string;
65
+ /** Informational message (e.g., "No matching data found in this document.") */
66
+ message?: string;
67
+ }
68
+ /**
69
+ * Describes a conflict where autofill would overwrite an existing value.
70
+ */
71
+ export interface OverwriteConflict {
72
+ /** Field identifier */
73
+ field_id: string;
74
+ /** Human-readable label */
75
+ label: string;
76
+ /** Current value in the form */
77
+ current_value: unknown;
78
+ /** New value from autofill */
79
+ new_value: unknown;
80
+ }
81
+ /**
82
+ * Upload flow states for the dropzone UI.
83
+ */
84
+ export type AutofillStatus = 'idle' | 'uploading' | 'extracting' | 'done' | 'done_empty' | 'error';
85
+ /**
86
+ * Props for the AutofillDropzone component.
87
+ */
88
+ export interface AutofillDropzoneProps {
89
+ /** Group identifier */
90
+ group_id: string;
91
+ /** Field schemas for the group's child fields */
92
+ fields: AutofillFieldSchema[];
93
+ /** Consumer-provided API endpoint for LLM extraction */
94
+ autofill_api_endpoint: string;
95
+ /** Prompt area for LLM context */
96
+ prompt_area?: string;
97
+ /** Prompt key for LLM context */
98
+ prompt_key?: string;
99
+ /** Upload callback from file_manager */
100
+ file_manager_upload: (file: File, options: FileUploadOptions) => Promise<FormFileAttachment>;
101
+ /** Get download URL callback from file_manager */
102
+ file_manager_get_download_url: (file_id: string, visibility?: 'public' | 'private') => string;
103
+ /** Called with extracted data and the uploaded file attachment */
104
+ on_autofill_complete: (data: Record<string, unknown>, attachment: FormFileAttachment) => void;
105
+ /** Current form data for detecting overwrites */
106
+ form_data: Record<string, unknown>;
107
+ /** Whether the group is locked (disables the dropzone) */
108
+ locked?: boolean;
109
+ }
110
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/autofill_dropzone/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Type definitions for the autofill dropzone feature.
3
+ *
4
+ * The autofill dropzone allows users to upload a source document (receipt, statement, etc.)
5
+ * which is sent to a consumer-provided API endpoint for LLM-based data extraction.
6
+ * The extracted data is then used to populate the group's child fields.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/autofill_dropzone/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}