hazo_collab_forms 1.9.0 → 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/components/_internal_form_set.d.ts +18 -15
- package/dist/components/_internal_form_set.d.ts.map +1 -1
- package/dist/components/_internal_form_set.js +14 -11
- package/dist/components/_internal_form_set.js.map +1 -1
- package/dist/components/collab_form_file_upload.d.ts +7 -8
- package/dist/components/collab_form_file_upload.d.ts.map +1 -1
- package/dist/components/collab_form_file_upload.js +31 -20
- package/dist/components/collab_form_file_upload.js.map +1 -1
- package/dist/components/hazo_add_field_dialog/components/pending_field_item.d.ts +1 -1
- package/dist/components/hazo_add_field_dialog/components/pending_field_item.js +2 -2
- package/dist/components/hazo_add_field_dialog/components/pending_field_item.js.map +1 -1
- package/dist/components/hazo_add_field_dialog/components/pending_field_list.d.ts +1 -1
- package/dist/components/hazo_add_field_dialog/hazo_add_field_dialog.js +7 -7
- package/dist/components/hazo_add_field_dialog/hazo_add_field_dialog.js.map +1 -1
- package/dist/components/hazo_add_field_dialog/types.d.ts +4 -4
- package/dist/components/hazo_add_field_dialog/types.d.ts.map +1 -1
- package/dist/components/hazo_add_field_dialog/utils/library_to_pending.js +2 -2
- package/dist/components/hazo_add_field_dialog/utils/library_to_pending.js.map +1 -1
- package/dist/components/hazo_add_group_dialog/hazo_add_group_dialog.js +6 -6
- package/dist/components/hazo_add_group_dialog/hazo_add_group_dialog.js.map +1 -1
- package/dist/components/hazo_collab_form_base.d.ts +11 -15
- package/dist/components/hazo_collab_form_base.d.ts.map +1 -1
- package/dist/components/hazo_collab_form_base.js +7 -7
- package/dist/components/hazo_collab_form_base.js.map +1 -1
- package/dist/components/hazo_collab_form_checkbox.d.ts +1 -24
- package/dist/components/hazo_collab_form_checkbox.d.ts.map +1 -1
- package/dist/components/hazo_collab_form_checkbox.js +15 -141
- package/dist/components/hazo_collab_form_checkbox.js.map +1 -1
- package/dist/components/hazo_collab_form_combo.d.ts +0 -44
- package/dist/components/hazo_collab_form_combo.d.ts.map +1 -1
- package/dist/components/hazo_collab_form_combo.js +24 -199
- package/dist/components/hazo_collab_form_combo.js.map +1 -1
- package/dist/components/hazo_collab_form_data_table.d.ts.map +1 -1
- package/dist/components/hazo_collab_form_data_table.js +2 -1
- package/dist/components/hazo_collab_form_data_table.js.map +1 -1
- package/dist/components/hazo_collab_form_date.d.ts +1 -59
- package/dist/components/hazo_collab_form_date.d.ts.map +1 -1
- package/dist/components/hazo_collab_form_date.js +34 -194
- package/dist/components/hazo_collab_form_date.js.map +1 -1
- package/dist/components/hazo_collab_form_doc.d.ts.map +1 -1
- package/dist/components/hazo_collab_form_doc.js +8 -7
- package/dist/components/hazo_collab_form_doc.js.map +1 -1
- package/dist/components/hazo_collab_form_group.js +5 -5
- package/dist/components/hazo_collab_form_group.js.map +1 -1
- package/dist/components/hazo_collab_form_inputbox.d.ts +0 -17
- package/dist/components/hazo_collab_form_inputbox.d.ts.map +1 -1
- package/dist/components/hazo_collab_form_inputbox.js +25 -148
- package/dist/components/hazo_collab_form_inputbox.js.map +1 -1
- package/dist/components/hazo_collab_form_radio.d.ts +1 -36
- package/dist/components/hazo_collab_form_radio.d.ts.map +1 -1
- package/dist/components/hazo_collab_form_radio.js +18 -143
- package/dist/components/hazo_collab_form_radio.js.map +1 -1
- package/dist/components/hazo_collab_form_textarea.d.ts +0 -17
- package/dist/components/hazo_collab_form_textarea.d.ts.map +1 -1
- package/dist/components/hazo_collab_form_textarea.js +14 -141
- package/dist/components/hazo_collab_form_textarea.js.map +1 -1
- package/dist/components/hazo_collab_form_view/hooks/use_view_callbacks.d.ts +36 -0
- package/dist/components/hazo_collab_form_view/hooks/use_view_callbacks.d.ts.map +1 -0
- package/dist/components/hazo_collab_form_view/hooks/use_view_callbacks.js +82 -0
- package/dist/components/hazo_collab_form_view/hooks/use_view_callbacks.js.map +1 -0
- package/dist/components/hazo_collab_form_view/types.d.ts +4 -3
- package/dist/components/hazo_collab_form_view/types.d.ts.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 +8 -80
- package/dist/components/hazo_collab_form_view/views/edit_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 +51 -271
- package/dist/components/hazo_collab_form_view/views/summary_view.js.map +1 -1
- package/dist/components/hazo_edit_field_dialog/hazo_edit_field_dialog.js +8 -8
- package/dist/components/hazo_edit_field_dialog/hazo_edit_field_dialog.js.map +1 -1
- package/dist/components/hazo_edit_field_dialog/types.d.ts +4 -4
- package/dist/components/hazo_edit_field_dialog/types.d.ts.map +1 -1
- package/dist/components/hazo_edit_group_dialog/hazo_edit_group_dialog.js +15 -15
- package/dist/components/hazo_edit_group_dialog/hazo_edit_group_dialog.js.map +1 -1
- package/dist/components/hazo_edit_group_dialog/types.d.ts +4 -4
- package/dist/components/hazo_edit_group_dialog/types.d.ts.map +1 -1
- package/dist/components/hazo_field_library/hooks/use_elements.d.ts.map +1 -1
- package/dist/components/hazo_field_library/hooks/use_elements.js +2 -1
- package/dist/components/hazo_field_library/hooks/use_elements.js.map +1 -1
- package/dist/components/hazo_field_selector_dialog/utils.d.ts.map +1 -1
- package/dist/components/hazo_field_selector_dialog/utils.js +2 -1
- package/dist/components/hazo_field_selector_dialog/utils.js.map +1 -1
- package/dist/components/hazo_template_generator/components/section_tree.js +1 -1
- package/dist/components/hazo_template_generator/components/section_tree.js.map +1 -1
- package/dist/components/hazo_template_generator/components/tabs/basic_tab.d.ts.map +1 -1
- package/dist/components/hazo_template_generator/components/tabs/basic_tab.js +6 -3
- package/dist/components/hazo_template_generator/components/tabs/basic_tab.js.map +1 -1
- package/dist/components/hazo_template_generator/components/tabs/section_tab.d.ts.map +1 -1
- package/dist/components/hazo_template_generator/components/tabs/section_tab.js +8 -4
- package/dist/components/hazo_template_generator/components/tabs/section_tab.js.map +1 -1
- package/dist/components/hazo_template_generator/types.d.ts.map +1 -1
- package/dist/components/hazo_template_generator/types.js +6 -3
- package/dist/components/hazo_template_generator/types.js.map +1 -1
- package/dist/components/hazo_template_generator/utils/validation.js +1 -1
- package/dist/components/hazo_template_generator/utils/validation.js.map +1 -1
- package/dist/components/shared/base_field_layout.d.ts +40 -0
- package/dist/components/shared/base_field_layout.d.ts.map +1 -0
- package/dist/components/shared/base_field_layout.js +34 -0
- package/dist/components/shared/base_field_layout.js.map +1 -0
- package/dist/components/shared/file_settings/file_settings_checkboxes.d.ts +13 -13
- package/dist/components/shared/file_settings/file_settings_checkboxes.d.ts.map +1 -1
- package/dist/components/shared/file_settings/file_settings_checkboxes.js +8 -25
- package/dist/components/shared/file_settings/file_settings_checkboxes.js.map +1 -1
- package/dist/components/shared/row_color_utils.d.ts +16 -0
- package/dist/components/shared/row_color_utils.d.ts.map +1 -0
- package/dist/components/shared/row_color_utils.js +21 -0
- package/dist/components/shared/row_color_utils.js.map +1 -0
- package/dist/components/shared/strip_base_props.d.ts +16 -0
- package/dist/components/shared/strip_base_props.d.ts.map +1 -0
- package/dist/components/shared/strip_base_props.js +91 -0
- package/dist/components/shared/strip_base_props.js.map +1 -0
- package/dist/components/shared/summary_utils/file_helpers.d.ts +11 -0
- package/dist/components/shared/summary_utils/file_helpers.d.ts.map +1 -0
- package/dist/components/shared/summary_utils/file_helpers.js +16 -0
- package/dist/components/shared/summary_utils/file_helpers.js.map +1 -0
- package/dist/components/shared/summary_utils/index.d.ts +1 -0
- package/dist/components/shared/summary_utils/index.d.ts.map +1 -1
- package/dist/components/shared/summary_utils/index.js +1 -0
- package/dist/components/shared/summary_utils/index.js.map +1 -1
- package/dist/components/shared/unified_field_controls/index.d.ts +1 -0
- package/dist/components/shared/unified_field_controls/index.d.ts.map +1 -1
- package/dist/components/shared/unified_field_controls/index.js +2 -1
- package/dist/components/shared/unified_field_controls/index.js.map +1 -1
- package/dist/components/shared/unified_field_controls/use_field_control_props.d.ts +68 -0
- package/dist/components/shared/unified_field_controls/use_field_control_props.d.ts.map +1 -0
- package/dist/components/shared/unified_field_controls/use_field_control_props.js +105 -0
- package/dist/components/shared/unified_field_controls/use_field_control_props.js.map +1 -0
- package/dist/components/shared/use_base_form_field.d.ts +190 -0
- package/dist/components/shared/use_base_form_field.d.ts.map +1 -0
- package/dist/components/shared/use_base_form_field.js +264 -0
- package/dist/components/shared/use_base_form_field.js.map +1 -0
- package/dist/config/api_endpoints.d.ts +19 -0
- package/dist/config/api_endpoints.d.ts.map +1 -0
- package/dist/config/api_endpoints.js +19 -0
- package/dist/config/api_endpoints.js.map +1 -0
- package/dist/config/defaults.d.ts +17 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +17 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/utils/filter_dom_props.d.ts.map +1 -1
- package/dist/utils/filter_dom_props.js +2 -1
- package/dist/utils/filter_dom_props.js.map +1 -1
- package/dist/utils/use_chat_messages_check.d.ts.map +1 -1
- package/dist/utils/use_chat_messages_check.js +4 -2
- package/dist/utils/use_chat_messages_check.js.map +1 -1
- package/dist/utils/use_collab_chat.d.ts.map +1 -1
- package/dist/utils/use_collab_chat.js +2 -1
- package/dist/utils/use_collab_chat.js.map +1 -1
- package/dist/utils/use_field_chat_status.d.ts.map +1 -1
- package/dist/utils/use_field_chat_status.js +5 -3
- package/dist/utils/use_field_chat_status.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,158 +7,32 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
7
7
|
import React from 'react';
|
|
8
8
|
import { cn } from '../utils/cn.js';
|
|
9
9
|
import { get_dom_safe_props } from '../utils/filter_dom_props.js';
|
|
10
|
-
import {
|
|
10
|
+
import { CollabFormFieldContainer, CollabFormFieldLabel, CollabFormFieldError, CollabFormFieldReferenceTag, CollabFormFileUploadSection, CollabFormAddEntryIcon, CollabFormDeleteEntryIcon, } from './hazo_collab_form_base.js';
|
|
11
11
|
import { UnifiedFieldControls } from './shared/unified_field_controls/index.js';
|
|
12
|
+
import { use_base_form_field } from './shared/use_base_form_field.js';
|
|
13
|
+
import { strip_base_props } from './shared/strip_base_props.js';
|
|
12
14
|
/**
|
|
13
15
|
* Collaboration form checkbox component
|
|
14
|
-
*
|
|
16
|
+
* Has a unique layout: checkbox + inline label + controls on right, not using BaseFieldLayout
|
|
15
17
|
*/
|
|
16
18
|
export const HazoCollabFormCheckbox = React.forwardRef((props, ref) => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const [internal_files, set_internal_files] = React.useState([]);
|
|
20
|
-
// Internal validation error state
|
|
21
|
-
const [validation_error, set_validation_error] = React.useState(null);
|
|
22
|
-
// Use controlled files if provided, otherwise use internal state
|
|
23
|
-
const current_files = props.files !== undefined ? props.files : internal_files;
|
|
24
|
-
// Expose get_file_data method and forward ref to checkbox element
|
|
25
|
-
React.useImperativeHandle(ref, () => {
|
|
26
|
-
return {
|
|
27
|
-
...component_ref.current,
|
|
28
|
-
get_file_data: () => current_files,
|
|
29
|
-
};
|
|
30
|
-
}, [current_files]);
|
|
31
|
-
const { label, tooltip, error, field_id, field_data_id, field_name, checked, onChange, checkbox_label, additional_context, on_chat_click, chat_status, is_chat_active, chat_background_color = 'bg-muted', is_data_ok_default, container_class_name, label_class_name, label_actions, checkbox_wrapper_class_name, checkbox_label_class_name, error_class_name, required, multi_state_radio, data_ok_checked, on_data_ok_change, data_ok_mode, data_ok_value, on_data_ok_value_change, data_ok_default, data_ok_hidden_states, data_ok_editable, disable_data_ok, disable_chat, accept_files, files_dir, max_size, min_files, max_files, file_accept, file_processor, file_validator, field_validator, files: controlled_files, on_files_change,
|
|
32
|
-
// Notes props
|
|
33
|
-
enable_notes, disable_notes, notes, on_notes_change, has_notes, is_notes_active, notes_panel_style, notes_background_color, notes_save_mode, current_user, className, id,
|
|
34
|
-
// HazoChat props
|
|
35
|
-
hazo_chat_group_id, hazo_chat_reference_id, hazo_chat_reference_type, hazo_chat_api_base_url, hazo_chat_timezone, hazo_chat_title, hazo_chat_subtitle, hazo_chat_realtime_mode, hazo_chat_polling_interval, hazo_chat_messages_per_page, hazo_chat_class_name, hazo_chat_on_close, hazo_chat_is_open, hazo_chat_on_open_change, hazo_chat_show_sidebar_toggle, hazo_chat_show_delete_button, hazo_chat_bubble_radius,
|
|
36
|
-
// Reference tag props
|
|
37
|
-
reference_value, reference_label, reference_tag_background_color,
|
|
38
|
-
// Visibility toggle props
|
|
39
|
-
enable_visibility_toggle, disable_visibility_toggle, visibility = 'visible', on_visibility_change, user_role = 'responder',
|
|
40
|
-
// Additional entry props
|
|
41
|
-
additional_entry, max_additional_entries, entry_index, entry_count, on_add_entry, on_delete_entry, is_additional_entry,
|
|
42
|
-
// Delete field props
|
|
43
|
-
enable_delete, disable_delete, on_delete,
|
|
44
|
-
// Lock field props
|
|
45
|
-
enable_lock, disable_lock, locked = false, on_lock_change,
|
|
46
|
-
// Skip/N/A field props
|
|
47
|
-
enable_skip, disable_skip, skipped = false, on_skip_change,
|
|
48
|
-
// Edit actions display mode
|
|
49
|
-
edit_actions_display,
|
|
50
|
-
// Action buttons styling
|
|
51
|
-
action_buttons_borderless,
|
|
52
|
-
// File visibility props
|
|
53
|
-
enable_file_visibility, private_files_permission, private_files, on_private_files_change,
|
|
54
|
-
// Consolidated dropdown props
|
|
55
|
-
include_chat_in_dropdown, include_notes_in_dropdown, extract_active_chat, extract_active_notes,
|
|
56
|
-
// HazoChat read-only mode
|
|
57
|
-
hazo_chat_read_only, icons_behaviour, active_role, ...checkbox_props } = props;
|
|
58
|
-
const { field_id_final, handle_chat_icon_click, handle_chat_close, chat_is_open, is_chat_disabled } = use_collab_form_field({
|
|
59
|
-
label,
|
|
60
|
-
field_id,
|
|
61
|
-
id,
|
|
62
|
-
field_data_id,
|
|
63
|
-
field_name,
|
|
64
|
-
on_chat_click,
|
|
65
|
-
hazo_chat_group_id,
|
|
66
|
-
hazo_chat_on_open_change,
|
|
67
|
-
hazo_chat_is_open,
|
|
68
|
-
hazo_chat_on_close,
|
|
69
|
-
});
|
|
70
|
-
// Check visibility - responders cannot see hidden fields
|
|
71
|
-
const is_hidden = visibility === 'hidden';
|
|
72
|
-
if (is_hidden && user_role === 'responder') {
|
|
19
|
+
const base = use_base_form_field(props, ref);
|
|
20
|
+
if (base.should_hide)
|
|
73
21
|
return null;
|
|
74
|
-
}
|
|
75
|
-
// Determine if field should be disabled when chat is active
|
|
76
|
-
// Use is_chat_active if provided, otherwise use chat_is_open
|
|
77
|
-
const is_chat_field_disabled = is_chat_active !== undefined ? is_chat_active : chat_is_open;
|
|
78
|
-
// Field is disabled if chat is active OR if field is locked
|
|
79
|
-
const is_field_disabled = (checkbox_props?.disabled) || is_chat_field_disabled || locked || skipped;
|
|
80
|
-
// Chat is disabled when field is hidden (for authors viewing hidden fields)
|
|
81
|
-
const is_chat_effectively_disabled = is_chat_disabled || is_hidden;
|
|
82
|
-
// Determine if this field should show add entry button
|
|
83
|
-
const show_add_entry = additional_entry && on_add_entry && (entry_count === undefined || entry_index === entry_count - 1) && (entry_count === undefined || entry_count < (max_additional_entries ?? 10));
|
|
84
|
-
// Combined error: external error takes priority over validation error
|
|
85
|
-
const display_error = error || validation_error || undefined;
|
|
86
|
-
// Handler to adapt data OK changes for both checkbox and multi-state modes
|
|
87
|
-
const handle_data_ok_unified_change = React.useCallback((value) => {
|
|
88
|
-
if (typeof value === 'boolean') {
|
|
89
|
-
on_data_ok_change?.(value);
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
on_data_ok_value_change?.(value);
|
|
93
|
-
}
|
|
94
|
-
}, [on_data_ok_change, on_data_ok_value_change]);
|
|
95
|
-
/**
|
|
96
|
-
* Handle checkbox change event with validation
|
|
97
|
-
*/
|
|
22
|
+
const { checked, onChange, field_validator, checkbox_label, checkbox_wrapper_class_name, checkbox_label_class_name, } = props;
|
|
98
23
|
const handle_change = React.useCallback((e) => {
|
|
99
24
|
const new_value = e.target.checked;
|
|
100
|
-
// Run field validator if provided
|
|
101
25
|
if (field_validator) {
|
|
102
|
-
|
|
103
|
-
set_validation_error(error_result);
|
|
26
|
+
base.set_validation_error(field_validator(new_value));
|
|
104
27
|
}
|
|
105
28
|
onChange(new_value);
|
|
106
|
-
}, [field_validator, onChange]);
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
deleted: false,
|
|
114
|
-
visibility,
|
|
115
|
-
notes,
|
|
116
|
-
chat_status,
|
|
117
|
-
}, callbacks: {
|
|
118
|
-
on_data_ok_change: handle_data_ok_unified_change,
|
|
119
|
-
on_skip_change,
|
|
120
|
-
on_notes_change: on_notes_change,
|
|
121
|
-
on_chat_click: handle_chat_icon_click,
|
|
122
|
-
on_visibility_change,
|
|
123
|
-
on_lock_change,
|
|
124
|
-
on_delete: on_delete ? () => on_delete(field_data_id || field_id_final) : undefined,
|
|
125
|
-
}, config: {
|
|
126
|
-
data_ok_mode: data_ok_mode === 'multi_state' ? 'multi_state' : 'checkbox',
|
|
127
|
-
data_ok_hidden_states,
|
|
128
|
-
chat_group_id: hazo_chat_group_id,
|
|
129
|
-
current_user,
|
|
130
|
-
field_data_id: field_data_id || field_id_final,
|
|
131
|
-
label,
|
|
132
|
-
chat_api_base_url: hazo_chat_api_base_url,
|
|
133
|
-
chat_timezone: hazo_chat_timezone,
|
|
134
|
-
chat_read_only: hazo_chat_read_only,
|
|
135
|
-
notes_panel_style,
|
|
136
|
-
notes_background_color,
|
|
137
|
-
notes_save_mode,
|
|
138
|
-
}, fallback_visibility: {
|
|
139
|
-
data_ok: !disable_data_ok,
|
|
140
|
-
skip: enable_skip && !disable_skip,
|
|
141
|
-
notes: enable_notes && !disable_notes,
|
|
142
|
-
chat: !disable_chat && !!hazo_chat_group_id,
|
|
143
|
-
visibility: enable_visibility_toggle && !disable_visibility_toggle,
|
|
144
|
-
lock: enable_lock && !disable_lock,
|
|
145
|
-
delete: enable_delete && !disable_delete,
|
|
146
|
-
}, fallback_enabled: {
|
|
147
|
-
data_ok: data_ok_editable !== false,
|
|
148
|
-
skip: !disable_skip,
|
|
149
|
-
notes: !disable_notes,
|
|
150
|
-
chat: !is_chat_effectively_disabled,
|
|
151
|
-
visibility: !disable_visibility_toggle,
|
|
152
|
-
lock: !disable_lock,
|
|
153
|
-
delete: !disable_delete,
|
|
154
|
-
} })] })] }), _jsx(CollabFormFieldReferenceTag, { reference_value: reference_value, reference_label: reference_label, reference_tag_background_color: reference_tag_background_color }), _jsx(CollabFormFieldError, { field_id_final: field_id_final, error: display_error, error_class_name: error_class_name }), _jsx(CollabFormFileUploadSection, { field_id_final: field_id_final, accept_files: accept_files && !locked, files_dir: files_dir, max_size: max_size, min_files: min_files, max_files: max_files, file_accept: file_accept, file_processor: file_processor, file_validator: file_validator, files: current_files, on_files_change: (new_files) => {
|
|
155
|
-
if (controlled_files === undefined) {
|
|
156
|
-
set_internal_files(new_files);
|
|
157
|
-
}
|
|
158
|
-
if (on_files_change) {
|
|
159
|
-
on_files_change(new_files);
|
|
160
|
-
}
|
|
161
|
-
}, component_ref: component_ref, enable_file_visibility: enable_file_visibility, private_files_permission: private_files_permission, private_files: private_files, on_private_files_change: on_private_files_change })] }));
|
|
29
|
+
}, [field_validator, onChange, base.set_validation_error]);
|
|
30
|
+
const checkbox_label_text = checkbox_label ?? base.label_props.label;
|
|
31
|
+
// Strip base props for DOM rest attributes
|
|
32
|
+
const rest_props = strip_base_props(props);
|
|
33
|
+
delete rest_props.checked;
|
|
34
|
+
delete rest_props.onChange;
|
|
35
|
+
return (_jsxs(CollabFormFieldContainer, { ...base.container_props, children: [_jsx(CollabFormFieldLabel, { ...base.label_props }), _jsxs("div", { className: cn('cls_collab_checkbox_wrapper flex items-center gap-2', checkbox_wrapper_class_name, base.is_hidden && base.user_role === 'author' && 'opacity-50'), suppressHydrationWarning: true, children: [_jsx("input", { ref: base.component_ref, id: base.field_id_final, type: "checkbox", checked: checked, onChange: handle_change, disabled: base.is_field_disabled, className: cn('cls_collab_checkbox h-4 w-4 rounded border border-input bg-transparent text-primary shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50', base.display_error && 'border-destructive focus-visible:ring-destructive', base.locked && 'bg-slate-100', base.skipped && 'bg-slate-100 opacity-60', base.className), "aria-invalid": base.display_error ? 'true' : 'false', "aria-describedby": base.display_error ? `${base.field_id_final}-error` : undefined, ...get_dom_safe_props(rest_props) }), _jsx("label", { htmlFor: base.field_id_final, className: cn('cls_collab_checkbox_label text-sm font-medium leading-none cursor-pointer peer-disabled:cursor-not-allowed peer-disabled:opacity-70 flex-1', checkbox_label_class_name), children: checkbox_label_text }), _jsxs("div", { className: "cls_collab_checkbox_actions flex items-center gap-2 flex-shrink-0", children: [base.entry_props.show_add_entry && (_jsx(CollabFormAddEntryIcon, { label: base.entry_props.label, field_id: base.entry_props.field_id, on_add_entry: base.entry_props.on_add_entry, borderless: base.entry_props.action_buttons_borderless })), base.entry_props.is_additional_entry && base.entry_props.on_delete_entry && (_jsx(CollabFormDeleteEntryIcon, { label: base.entry_props.label, field_id: base.entry_props.field_id, on_delete_entry: base.entry_props.on_delete_entry })), _jsx(UnifiedFieldControls, { ...base.controls_props })] })] }), _jsx(CollabFormFieldReferenceTag, { ...base.reference_tag_props }), _jsx(CollabFormFieldError, { ...base.error_props }), _jsx(CollabFormFileUploadSection, { ...base.file_upload_props })] }));
|
|
162
36
|
});
|
|
163
37
|
HazoCollabFormCheckbox.displayName = 'HazoCollabFormCheckbox';
|
|
164
38
|
//# sourceMappingURL=hazo_collab_form_checkbox.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hazo_collab_form_checkbox.js","sourceRoot":"","sources":["../../src/components/hazo_collab_form_checkbox.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,CAAC;;AAEb,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"hazo_collab_form_checkbox.js","sourceRoot":"","sources":["../../src/components/hazo_collab_form_checkbox.tsx"],"names":[],"mappings":"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"}
|
|
@@ -14,73 +14,29 @@ import { type CollabFormFieldBaseProps, type FileData } from './hazo_collab_form
|
|
|
14
14
|
* Option type for combobox
|
|
15
15
|
*/
|
|
16
16
|
export interface ComboboxOption {
|
|
17
|
-
/**
|
|
18
|
-
* Value of the option
|
|
19
|
-
*/
|
|
20
17
|
value: string;
|
|
21
|
-
/**
|
|
22
|
-
* Label to display for the option
|
|
23
|
-
*/
|
|
24
18
|
label: string;
|
|
25
19
|
}
|
|
26
20
|
/**
|
|
27
21
|
* Props for the HazoCollabFormCombo component
|
|
28
22
|
*/
|
|
29
23
|
export interface HazoCollabFormComboProps extends CollabFormFieldBaseProps {
|
|
30
|
-
/**
|
|
31
|
-
* Array of options to display in the combobox
|
|
32
|
-
*/
|
|
33
24
|
options: ComboboxOption[];
|
|
34
|
-
/**
|
|
35
|
-
* Current selected value
|
|
36
|
-
*/
|
|
37
25
|
value: string;
|
|
38
|
-
/**
|
|
39
|
-
* Callback when selection changes
|
|
40
|
-
*/
|
|
41
26
|
onChange: (value: string) => void;
|
|
42
|
-
/**
|
|
43
|
-
* Placeholder text when no option is selected
|
|
44
|
-
*/
|
|
45
27
|
placeholder?: string;
|
|
46
|
-
/**
|
|
47
|
-
* Placeholder text for the search input
|
|
48
|
-
*/
|
|
49
28
|
search_placeholder?: string;
|
|
50
|
-
/**
|
|
51
|
-
* Message to show when no options are found
|
|
52
|
-
*/
|
|
53
29
|
empty_message?: string;
|
|
54
|
-
/**
|
|
55
|
-
* Whether to enable the search input bar
|
|
56
|
-
* Default: false (search bar hidden)
|
|
57
|
-
*/
|
|
58
30
|
enable_search?: boolean;
|
|
59
|
-
/**
|
|
60
|
-
* Additional context data for chat functionality
|
|
61
|
-
*/
|
|
62
31
|
additional_context?: Record<string, unknown>;
|
|
63
|
-
/**
|
|
64
|
-
* Custom className for the combobox wrapper
|
|
65
|
-
*/
|
|
66
32
|
combo_wrapper_class_name?: string;
|
|
67
|
-
/**
|
|
68
|
-
* Custom className for the button trigger
|
|
69
|
-
*/
|
|
70
33
|
button_class_name?: string;
|
|
71
|
-
/**
|
|
72
|
-
* Whether the combobox is disabled
|
|
73
|
-
*/
|
|
74
34
|
disabled?: boolean;
|
|
75
35
|
}
|
|
76
36
|
/**
|
|
77
37
|
* Exposed methods for HazoCollabFormCombo
|
|
78
38
|
*/
|
|
79
39
|
export interface HazoCollabFormComboRef {
|
|
80
|
-
/**
|
|
81
|
-
* Get the current files data
|
|
82
|
-
* Returns array of FileData objects
|
|
83
|
-
*/
|
|
84
40
|
get_file_data: () => FileData[];
|
|
85
41
|
}
|
|
86
42
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hazo_collab_form_combo.d.ts","sourceRoot":"","sources":["../../src/components/hazo_collab_form_combo.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAGnD,OAAO,
|
|
1
|
+
{"version":3,"file":"hazo_collab_form_combo.d.ts","sourceRoot":"","sources":["../../src/components/hazo_collab_form_combo.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAGnD,OAAO,EAML,KAAK,wBAAwB,EAC7B,KAAK,QAAQ,EACd,MAAM,4BAA4B,CAAC;AAIpC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,wBAAwB;IACxE,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,QAAQ,EAAE,CAAC;CACjC;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,6HAsP9B,CAAC"}
|
|
@@ -13,132 +13,27 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
13
13
|
import React, { useState, useEffect } from 'react';
|
|
14
14
|
import { cn } from '../utils/cn.js';
|
|
15
15
|
import { use_logger } from '../logger/context.js';
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
16
|
+
import { CollabFormFieldContainer, CollabFormFieldLabel, CollabFormFieldError, CollabFormFieldReferenceTag, CollabFormFileUploadSection, } from './hazo_collab_form_base.js';
|
|
17
|
+
import { BaseFieldLayout } from './shared/base_field_layout.js';
|
|
18
|
+
import { use_base_form_field } from './shared/use_base_form_field.js';
|
|
18
19
|
/**
|
|
19
20
|
* Collaboration form combobox component
|
|
20
21
|
* Displays a labeled combobox field with error message and chat icon
|
|
21
22
|
*/
|
|
22
23
|
export const HazoCollabFormCombo = React.forwardRef((props, ref) => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const [validation_error, set_validation_error] = React.useState(null);
|
|
28
|
-
// Use controlled files if provided, otherwise use internal state
|
|
29
|
-
const current_files = props.files !== undefined ? props.files : internal_files;
|
|
30
|
-
// Expose get_file_data method and forward ref to button element
|
|
31
|
-
React.useImperativeHandle(ref, () => {
|
|
32
|
-
return {
|
|
33
|
-
...component_ref.current,
|
|
34
|
-
get_file_data: () => current_files,
|
|
35
|
-
};
|
|
36
|
-
}, [current_files]);
|
|
37
|
-
const { label, tooltip, error, field_id, field_data_id, field_name, options, value, onChange, placeholder = 'Select an option...', search_placeholder = 'Search...', empty_message = 'No option found.', enable_search = false, additional_context, on_chat_click, chat_status, is_chat_active, chat_background_color = 'bg-muted', is_data_ok_default, container_class_name, label_class_name, label_actions, combo_wrapper_class_name, button_class_name, error_class_name, field_width_class_name, required, multi_state_radio, data_ok_checked, on_data_ok_change, data_ok_mode, data_ok_value, on_data_ok_value_change, data_ok_default, data_ok_hidden_states, data_ok_editable, disable_data_ok, disable_chat, accept_files, files_dir, max_size, min_files, max_files, file_accept, file_processor, file_validator, field_validator, files: controlled_files, on_files_change,
|
|
38
|
-
// Notes props
|
|
39
|
-
enable_notes, disable_notes, notes, on_notes_change, has_notes, is_notes_active, notes_panel_style, notes_background_color, notes_save_mode, current_user, disabled, id,
|
|
40
|
-
// HazoChat props
|
|
41
|
-
hazo_chat_group_id, hazo_chat_reference_id, hazo_chat_reference_type, hazo_chat_api_base_url, hazo_chat_timezone, hazo_chat_title, hazo_chat_subtitle, hazo_chat_realtime_mode, hazo_chat_polling_interval, hazo_chat_messages_per_page, hazo_chat_class_name, hazo_chat_on_close, hazo_chat_is_open, hazo_chat_on_open_change, hazo_chat_show_sidebar_toggle, hazo_chat_show_delete_button, hazo_chat_bubble_radius,
|
|
42
|
-
// Reference tag props
|
|
43
|
-
reference_value, reference_label, reference_tag_background_color,
|
|
44
|
-
// Visibility toggle props
|
|
45
|
-
enable_visibility_toggle, disable_visibility_toggle, visibility = 'visible', on_visibility_change, user_role = 'responder',
|
|
46
|
-
// Additional entry props
|
|
47
|
-
additional_entry, max_additional_entries, entry_index, entry_count, on_add_entry, on_delete_entry, is_additional_entry,
|
|
48
|
-
// Delete field props
|
|
49
|
-
enable_delete, disable_delete, on_delete,
|
|
50
|
-
// Lock field props
|
|
51
|
-
enable_lock, disable_lock, locked = false, on_lock_change,
|
|
52
|
-
// Skip/N/A field props
|
|
53
|
-
enable_skip, disable_skip, skipped = false, on_skip_change,
|
|
54
|
-
// Edit actions display mode
|
|
55
|
-
edit_actions_display,
|
|
56
|
-
// Action buttons styling
|
|
57
|
-
action_buttons_borderless,
|
|
58
|
-
// File visibility props
|
|
59
|
-
enable_file_visibility, private_files_permission, private_files, on_private_files_change,
|
|
60
|
-
// Consolidated dropdown props
|
|
61
|
-
include_chat_in_dropdown, include_notes_in_dropdown, extract_active_chat, extract_active_notes,
|
|
62
|
-
// HazoChat read-only mode
|
|
63
|
-
hazo_chat_read_only, icons_behaviour, active_role, } = props;
|
|
24
|
+
const base = use_base_form_field(props, ref);
|
|
25
|
+
if (base.should_hide)
|
|
26
|
+
return null;
|
|
27
|
+
const { options, value, onChange, field_validator, placeholder = 'Select an option...', search_placeholder = 'Search...', empty_message = 'No option found.', enable_search = false, combo_wrapper_class_name, button_class_name, } = props;
|
|
64
28
|
const logger = use_logger();
|
|
65
29
|
const [open, set_open] = useState(false);
|
|
66
|
-
const { field_id_final, handle_chat_icon_click, handle_chat_close, chat_is_open, is_chat_disabled } = use_collab_form_field({
|
|
67
|
-
label,
|
|
68
|
-
field_id,
|
|
69
|
-
id,
|
|
70
|
-
field_data_id,
|
|
71
|
-
field_name,
|
|
72
|
-
on_chat_click,
|
|
73
|
-
hazo_chat_group_id,
|
|
74
|
-
hazo_chat_on_open_change,
|
|
75
|
-
hazo_chat_is_open,
|
|
76
|
-
hazo_chat_on_close,
|
|
77
|
-
});
|
|
78
|
-
// Check visibility - responders cannot see hidden fields
|
|
79
|
-
const is_hidden = visibility === 'hidden';
|
|
80
|
-
if (is_hidden && user_role === 'responder') {
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
// Determine if field should be disabled when chat is active
|
|
84
|
-
// Use is_chat_active if provided, otherwise use chat_is_open
|
|
85
|
-
const is_chat_field_disabled = is_chat_active !== undefined ? is_chat_active : chat_is_open;
|
|
86
|
-
// Field is disabled if chat is active OR if field is locked
|
|
87
|
-
const is_field_disabled = disabled || is_chat_field_disabled || locked || skipped;
|
|
88
|
-
// Chat is disabled when field is hidden (for authors viewing hidden fields)
|
|
89
|
-
const is_chat_effectively_disabled = is_chat_disabled || is_hidden;
|
|
90
|
-
// Determine if this field should show add entry button
|
|
91
|
-
const show_add_entry = additional_entry && on_add_entry && (entry_count === undefined || entry_index === entry_count - 1) && (entry_count === undefined || entry_count < (max_additional_entries ?? 10));
|
|
92
|
-
// Combined error: external error takes priority over validation error
|
|
93
|
-
const display_error = error || validation_error || undefined;
|
|
94
|
-
// Handler to adapt data OK changes for both checkbox and multi-state modes
|
|
95
|
-
const handle_data_ok_unified_change = React.useCallback((value) => {
|
|
96
|
-
if (typeof value === 'boolean') {
|
|
97
|
-
on_data_ok_change?.(value);
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
on_data_ok_value_change?.(value);
|
|
101
|
-
}
|
|
102
|
-
}, [on_data_ok_change, on_data_ok_value_change]);
|
|
103
|
-
// Helper object for chat props to pass to CollabFormFieldContainer
|
|
104
|
-
const chat_container_props = {
|
|
105
|
-
hazo_chat_is_open: chat_is_open,
|
|
106
|
-
hazo_chat_group_id,
|
|
107
|
-
hazo_chat_reference_id,
|
|
108
|
-
hazo_chat_reference_type,
|
|
109
|
-
hazo_chat_api_base_url,
|
|
110
|
-
hazo_chat_timezone,
|
|
111
|
-
hazo_chat_title,
|
|
112
|
-
hazo_chat_subtitle,
|
|
113
|
-
hazo_chat_realtime_mode,
|
|
114
|
-
hazo_chat_polling_interval,
|
|
115
|
-
hazo_chat_messages_per_page,
|
|
116
|
-
hazo_chat_class_name,
|
|
117
|
-
hazo_chat_on_close: handle_chat_close,
|
|
118
|
-
hazo_chat_show_sidebar_toggle,
|
|
119
|
-
hazo_chat_show_delete_button,
|
|
120
|
-
hazo_chat_bubble_radius,
|
|
121
|
-
field_data_id,
|
|
122
|
-
field_name,
|
|
123
|
-
label,
|
|
124
|
-
files: current_files,
|
|
125
|
-
};
|
|
126
|
-
/**
|
|
127
|
-
* Get the label for the selected value
|
|
128
|
-
*/
|
|
129
|
-
const selected_label = value
|
|
130
|
-
? options.find((option) => option.value === value)?.label || placeholder
|
|
131
|
-
: placeholder;
|
|
132
30
|
// Dynamic imports for shadcn components
|
|
133
|
-
// These will be resolved by the consuming application's bundler
|
|
134
31
|
const [Components, setComponents] = React.useState(null);
|
|
135
32
|
const [is_loading, set_is_loading] = React.useState(true);
|
|
136
33
|
useEffect(() => {
|
|
137
34
|
const loadComponents = async () => {
|
|
138
35
|
try {
|
|
139
36
|
set_is_loading(true);
|
|
140
|
-
// Try to import from consuming app's components directory
|
|
141
|
-
// This path will be resolved by Next.js/webpack in the consuming app
|
|
142
37
|
// @ts-expect-error - These modules are provided by the consuming application
|
|
143
38
|
const popoverModule = await import('@/components/ui/popover').catch(() => null);
|
|
144
39
|
// @ts-expect-error - These modules are provided by the consuming application
|
|
@@ -179,115 +74,45 @@ export const HazoCollabFormCombo = React.forwardRef((props, ref) => {
|
|
|
179
74
|
}, []);
|
|
180
75
|
/**
|
|
181
76
|
* Handle option selection by value with validation
|
|
182
|
-
* When an option is selected, call onChange with the option value
|
|
183
|
-
* If the same option is selected again, deselect it (empty value)
|
|
184
77
|
*/
|
|
185
78
|
const handle_select_by_value = React.useCallback((selected_value) => {
|
|
186
79
|
const new_value = selected_value === value ? '' : selected_value;
|
|
187
|
-
// Run field validator if provided
|
|
188
80
|
if (field_validator) {
|
|
189
|
-
|
|
190
|
-
set_validation_error(error_result);
|
|
81
|
+
base.set_validation_error(field_validator(new_value));
|
|
191
82
|
}
|
|
192
83
|
onChange(new_value);
|
|
193
84
|
set_open(false);
|
|
194
|
-
}, [value, onChange, field_validator]);
|
|
85
|
+
}, [value, onChange, field_validator, base.set_validation_error]);
|
|
195
86
|
/**
|
|
196
87
|
* Handle option selection by label (fallback)
|
|
197
|
-
* Used when CommandItem value is set to option.label for search
|
|
198
88
|
*/
|
|
199
89
|
const handle_select_by_label = React.useCallback((selected_label) => {
|
|
200
|
-
// Find the option by label (since CommandItem value is set to option.label for better search)
|
|
201
90
|
const matching_option = options.find((opt) => opt.label === selected_label);
|
|
202
91
|
if (matching_option) {
|
|
203
92
|
handle_select_by_value(matching_option.value);
|
|
204
93
|
}
|
|
205
94
|
}, [options, handle_select_by_value]);
|
|
206
|
-
|
|
95
|
+
const selected_label = value
|
|
96
|
+
? options.find((option) => option.value === value)?.label || placeholder
|
|
97
|
+
: placeholder;
|
|
98
|
+
// Show loading state while components are loading
|
|
207
99
|
if (is_loading) {
|
|
208
|
-
return (_jsxs(CollabFormFieldContainer, {
|
|
209
|
-
if (controlled_files === undefined) {
|
|
210
|
-
set_internal_files(new_files);
|
|
211
|
-
}
|
|
212
|
-
if (on_files_change) {
|
|
213
|
-
on_files_change(new_files);
|
|
214
|
-
}
|
|
215
|
-
}, component_ref: component_ref })] }));
|
|
100
|
+
return (_jsxs(CollabFormFieldContainer, { ...base.container_props, children: [_jsx(CollabFormFieldLabel, { ...base.label_props }), _jsx("div", { className: cn('cls_collab_combo_wrapper flex items-center gap-2', combo_wrapper_class_name), suppressHydrationWarning: true, children: _jsx("div", { className: cn(base.field_width_class_name || 'flex-1', base.field_width_class_name && 'flex-shrink-0'), children: _jsx("div", { className: cn('w-full h-9 rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm md:text-sm flex items-center', base.display_error && 'border-destructive', button_class_name), children: _jsx("span", { className: "truncate text-muted-foreground", children: placeholder }) }) }) }), _jsx(CollabFormFieldReferenceTag, { ...base.reference_tag_props }), _jsx(CollabFormFieldError, { ...base.error_props }), _jsx(CollabFormFileUploadSection, { ...base.file_upload_props })] }));
|
|
216
101
|
}
|
|
217
102
|
// Fallback UI if components failed to load
|
|
218
103
|
if (!Components) {
|
|
219
|
-
return (_jsxs(CollabFormFieldContainer, {
|
|
220
|
-
if (controlled_files === undefined) {
|
|
221
|
-
set_internal_files(new_files);
|
|
222
|
-
}
|
|
223
|
-
if (on_files_change) {
|
|
224
|
-
on_files_change(new_files);
|
|
225
|
-
}
|
|
226
|
-
}, component_ref: component_ref })] }));
|
|
104
|
+
return (_jsxs(CollabFormFieldContainer, { ...base.container_props, children: [_jsx(CollabFormFieldLabel, { ...base.label_props }), _jsx("div", { className: cn('cls_collab_combo_wrapper flex items-center gap-2', combo_wrapper_class_name), suppressHydrationWarning: true, children: _jsx("div", { className: cn(base.field_width_class_name || 'flex-1', base.field_width_class_name && 'flex-shrink-0'), children: _jsxs("div", { className: "w-full rounded-md border border-destructive bg-destructive/10 px-3 py-2 text-sm text-destructive", children: [_jsx("div", { className: "font-medium", children: "Missing shadcn/ui components" }), _jsxs("div", { className: "mt-1 text-xs opacity-90", children: ["Run: ", _jsx("code", { className: "bg-destructive/20 px-1 rounded", children: "npx hazo-collab-forms-setup --combo" })] }), _jsxs("div", { className: "mt-1 text-xs opacity-70", children: ["Or manually: ", _jsx("code", { className: "bg-destructive/20 px-1 rounded", children: "npx shadcn@latest add popover command" })] })] }) }) }), _jsx(CollabFormFieldReferenceTag, { ...base.reference_tag_props }), _jsx(CollabFormFieldError, { ...base.error_props }), _jsx(CollabFormFileUploadSection, { ...base.file_upload_props })] }));
|
|
227
105
|
}
|
|
228
106
|
const { Popover, PopoverTrigger, PopoverContent, Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, Check, ChevronsUpDown, } = Components;
|
|
229
|
-
return (
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
}, className: "cursor-pointer", style: { pointerEvents: 'auto', cursor: 'pointer' }, children: [_jsx(Check, { className: cn('mr-2 h-4 w-4', value === option.value ? 'opacity-100' : 'opacity-0') }), option.label] }, option.value))) })] })] }) })] }) }), show_add_entry && (_jsx(CollabFormAddEntryIcon, { label: label, field_id: field_data_id || field_id_final, on_add_entry: on_add_entry, borderless: action_buttons_borderless })), is_additional_entry && on_delete_entry && (_jsx(CollabFormDeleteEntryIcon, { label: label, field_id: field_data_id || field_id_final, on_delete_entry: on_delete_entry })), _jsx(UnifiedFieldControls, { field_id: field_data_id || field_id_final, icons_behaviour: icons_behaviour, active_role: active_role, metadata: {
|
|
239
|
-
data_ok: data_ok_value ?? data_ok_checked,
|
|
240
|
-
skipped,
|
|
241
|
-
locked,
|
|
242
|
-
deleted: false,
|
|
243
|
-
visibility,
|
|
244
|
-
notes,
|
|
245
|
-
chat_status,
|
|
246
|
-
}, callbacks: {
|
|
247
|
-
on_data_ok_change: handle_data_ok_unified_change,
|
|
248
|
-
on_skip_change,
|
|
249
|
-
on_notes_change: on_notes_change,
|
|
250
|
-
on_chat_click: handle_chat_icon_click,
|
|
251
|
-
on_visibility_change,
|
|
252
|
-
on_lock_change,
|
|
253
|
-
on_delete: on_delete ? () => on_delete(field_data_id || field_id_final) : undefined,
|
|
254
|
-
}, config: {
|
|
255
|
-
data_ok_mode: data_ok_mode === 'multi_state' ? 'multi_state' : 'checkbox',
|
|
256
|
-
data_ok_hidden_states,
|
|
257
|
-
chat_group_id: hazo_chat_group_id,
|
|
258
|
-
current_user,
|
|
259
|
-
field_data_id: field_data_id || field_id_final,
|
|
260
|
-
label,
|
|
261
|
-
chat_api_base_url: hazo_chat_api_base_url,
|
|
262
|
-
chat_timezone: hazo_chat_timezone,
|
|
263
|
-
chat_read_only: hazo_chat_read_only,
|
|
264
|
-
notes_panel_style,
|
|
265
|
-
notes_background_color,
|
|
266
|
-
notes_save_mode,
|
|
267
|
-
}, fallback_visibility: {
|
|
268
|
-
data_ok: !disable_data_ok,
|
|
269
|
-
skip: enable_skip && !disable_skip,
|
|
270
|
-
notes: enable_notes && !disable_notes,
|
|
271
|
-
chat: !disable_chat && !!hazo_chat_group_id,
|
|
272
|
-
visibility: enable_visibility_toggle && !disable_visibility_toggle,
|
|
273
|
-
lock: enable_lock && !disable_lock,
|
|
274
|
-
delete: enable_delete && !disable_delete,
|
|
275
|
-
}, fallback_enabled: {
|
|
276
|
-
data_ok: data_ok_editable !== false,
|
|
277
|
-
skip: !disable_skip,
|
|
278
|
-
notes: !disable_notes,
|
|
279
|
-
chat: !is_chat_effectively_disabled,
|
|
280
|
-
visibility: !disable_visibility_toggle,
|
|
281
|
-
lock: !disable_lock,
|
|
282
|
-
delete: !disable_delete,
|
|
283
|
-
} })] }), _jsx(CollabFormFieldReferenceTag, { reference_value: reference_value, reference_label: reference_label, reference_tag_background_color: reference_tag_background_color }), _jsx(CollabFormFieldError, { field_id_final: field_id_final, error: display_error, error_class_name: error_class_name }), _jsx(CollabFormFileUploadSection, { field_id_final: field_id_final, accept_files: accept_files && !locked, files_dir: files_dir, max_size: max_size, min_files: min_files, max_files: max_files, file_accept: file_accept, file_processor: file_processor, file_validator: file_validator, files: current_files, on_files_change: (new_files) => {
|
|
284
|
-
if (controlled_files === undefined) {
|
|
285
|
-
set_internal_files(new_files);
|
|
286
|
-
}
|
|
287
|
-
if (on_files_change) {
|
|
288
|
-
on_files_change(new_files);
|
|
289
|
-
}
|
|
290
|
-
}, component_ref: component_ref, enable_file_visibility: enable_file_visibility, private_files_permission: private_files_permission, private_files: private_files, on_private_files_change: on_private_files_change })] }));
|
|
107
|
+
return (_jsx(BaseFieldLayout, { base: base, wrapper_class_name: "cls_collab_combo_wrapper", wrapper_extra_class_name: combo_wrapper_class_name, children: _jsxs(Popover, { open: open, onOpenChange: set_open, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { ref: base.component_ref, type: "button", role: "combobox", "aria-expanded": open, "aria-controls": `${base.field_id_final}-combobox`, disabled: base.is_field_disabled, className: cn('cls_collab_combo_button w-full h-9 justify-between rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm flex items-center', base.display_error && 'border-destructive focus-visible:ring-destructive', base.locked && 'bg-slate-100', base.skipped && 'bg-slate-100 opacity-60', button_class_name), "aria-invalid": base.display_error ? 'true' : 'false', "aria-describedby": base.display_error ? `${base.field_id_final}-error` : undefined, children: [_jsx("span", { className: cn('truncate', !value && 'text-muted-foreground'), children: selected_label }), _jsx(ChevronsUpDown, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })] }) }), _jsx(PopoverContent, { className: "w-[var(--radix-popover-trigger-width)] p-0", align: "start", id: `${base.field_id_final}-combobox`, children: _jsxs(Command, { children: [enable_search && (_jsx(CommandInput, { placeholder: search_placeholder, className: "h-9" })), _jsxs(CommandList, { children: [_jsx(CommandEmpty, { children: empty_message }), _jsx(CommandGroup, { children: options.map((option) => (_jsxs(CommandItem, { value: option.value, keywords: [option.label], onSelect: (currentValue) => {
|
|
108
|
+
logger.debug('[HazoCollabFormCombo] onSelect called', { value: currentValue });
|
|
109
|
+
handle_select_by_value(currentValue);
|
|
110
|
+
}, onClick: (e) => {
|
|
111
|
+
e.preventDefault();
|
|
112
|
+
e.stopPropagation();
|
|
113
|
+
logger.debug('[HazoCollabFormCombo] onClick called', { value: option.value });
|
|
114
|
+
handle_select_by_value(option.value);
|
|
115
|
+
}, className: "cursor-pointer", style: { pointerEvents: 'auto', cursor: 'pointer' }, children: [_jsx(Check, { className: cn('mr-2 h-4 w-4', value === option.value ? 'opacity-100' : 'opacity-0') }), option.label] }, option.value))) })] })] }) })] }) }));
|
|
291
116
|
});
|
|
292
117
|
HazoCollabFormCombo.displayName = 'HazoCollabFormCombo';
|
|
293
118
|
//# sourceMappingURL=hazo_collab_form_combo.js.map
|