hazo_collab_forms 6.1.1 → 6.4.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.
Files changed (353) hide show
  1. package/CHANGE_LOG.md +117 -0
  2. package/README.md +73 -3
  3. package/dist/audit/lazy_audit_icon.d.ts.map +1 -1
  4. package/dist/audit/lazy_audit_icon.js +3 -8
  5. package/dist/audit/lazy_audit_icon.js.map +1 -1
  6. package/dist/components/_internal_form_set.js +1 -1
  7. package/dist/components/_internal_form_set.js.map +1 -1
  8. package/dist/components/autofill_dropzone/autofill_dropzone.js +1 -1
  9. package/dist/components/autofill_dropzone/autofill_dropzone.js.map +1 -1
  10. package/dist/components/clarification/clarification_badge.js +1 -1
  11. package/dist/components/clarification/clarification_badge.js.map +1 -1
  12. package/dist/components/clarification/clarification_card.js +1 -1
  13. package/dist/components/clarification/clarification_card.js.map +1 -1
  14. package/dist/components/clarification/clarification_dialog.js +1 -2
  15. package/dist/components/clarification/clarification_dialog.js.map +1 -1
  16. package/dist/components/clarification/clarification_group_card.js +1 -1
  17. package/dist/components/clarification/clarification_group_card.js.map +1 -1
  18. package/dist/components/clarification/clarification_item_body.js +1 -1
  19. package/dist/components/clarification/clarification_item_body.js.map +1 -1
  20. package/dist/components/clarification/clarification_response_form.js +1 -1
  21. package/dist/components/clarification/clarification_response_form.js.map +1 -1
  22. package/dist/components/clarification/clarification_section.js +1 -1
  23. package/dist/components/clarification/clarification_section.js.map +1 -1
  24. package/dist/components/clarification/clarification_thread.js +1 -1
  25. package/dist/components/clarification/clarification_thread.js.map +1 -1
  26. package/dist/components/clarification/resolution_status_strip.js +1 -1
  27. package/dist/components/clarification/resolution_status_strip.js.map +1 -1
  28. package/dist/components/collab_form_file_upload.js +2 -3
  29. package/dist/components/collab_form_file_upload.js.map +1 -1
  30. package/dist/components/data_ok_checkbox.js +1 -1
  31. package/dist/components/data_ok_checkbox.js.map +1 -1
  32. package/dist/components/data_ok_multi_state.d.ts.map +1 -1
  33. package/dist/components/data_ok_multi_state.js +1 -1
  34. package/dist/components/data_ok_multi_state.js.map +1 -1
  35. package/dist/components/hazo_add_field_dialog/components/field_type_combobox.js +1 -1
  36. package/dist/components/hazo_add_field_dialog/components/field_type_combobox.js.map +1 -1
  37. package/dist/components/hazo_add_field_dialog/components/library_search.js +1 -1
  38. package/dist/components/hazo_add_field_dialog/components/library_search.js.map +1 -1
  39. package/dist/components/hazo_add_field_dialog/components/pending_field_item.js +1 -1
  40. package/dist/components/hazo_add_field_dialog/components/pending_field_item.js.map +1 -1
  41. package/dist/components/hazo_add_field_dialog/components/question_input.js +1 -1
  42. package/dist/components/hazo_add_field_dialog/components/question_input.js.map +1 -1
  43. package/dist/components/hazo_add_field_dialog/hazo_add_field_dialog.js +1 -1
  44. package/dist/components/hazo_add_field_dialog/hazo_add_field_dialog.js.map +1 -1
  45. package/dist/components/hazo_add_field_dialog/options/options_list_editor.js +1 -1
  46. package/dist/components/hazo_add_field_dialog/options/options_list_editor.js.map +1 -1
  47. package/dist/components/hazo_add_group_dialog/hazo_add_group_dialog.js +1 -1
  48. package/dist/components/hazo_add_group_dialog/hazo_add_group_dialog.js.map +1 -1
  49. package/dist/components/hazo_collab_form_base.d.ts.map +1 -1
  50. package/dist/components/hazo_collab_form_base.js +24 -45
  51. package/dist/components/hazo_collab_form_base.js.map +1 -1
  52. package/dist/components/hazo_collab_form_checkbox.js +1 -1
  53. package/dist/components/hazo_collab_form_checkbox.js.map +1 -1
  54. package/dist/components/hazo_collab_form_combo.d.ts.map +1 -1
  55. package/dist/components/hazo_collab_form_combo.js +1 -1
  56. package/dist/components/hazo_collab_form_combo.js.map +1 -1
  57. package/dist/components/hazo_collab_form_computed.js +1 -1
  58. package/dist/components/hazo_collab_form_computed.js.map +1 -1
  59. package/dist/components/hazo_collab_form_currency.js +1 -1
  60. package/dist/components/hazo_collab_form_currency.js.map +1 -1
  61. package/dist/components/hazo_collab_form_data_table.d.ts.map +1 -1
  62. package/dist/components/hazo_collab_form_data_table.js +5 -13
  63. package/dist/components/hazo_collab_form_data_table.js.map +1 -1
  64. package/dist/components/hazo_collab_form_date.d.ts.map +1 -1
  65. package/dist/components/hazo_collab_form_date.js +1 -1
  66. package/dist/components/hazo_collab_form_date.js.map +1 -1
  67. package/dist/components/hazo_collab_form_doc.js +1 -1
  68. package/dist/components/hazo_collab_form_doc.js.map +1 -1
  69. package/dist/components/hazo_collab_form_file_textbox/file_textbox_panel.js +1 -1
  70. package/dist/components/hazo_collab_form_file_textbox/file_textbox_panel.js.map +1 -1
  71. package/dist/components/hazo_collab_form_file_textbox/file_upload_zone.js +1 -1
  72. package/dist/components/hazo_collab_form_file_textbox/file_upload_zone.js.map +1 -1
  73. package/dist/components/hazo_collab_form_file_textbox/hazo_collab_form_file_textbox.js +1 -1
  74. package/dist/components/hazo_collab_form_file_textbox/hazo_collab_form_file_textbox.js.map +1 -1
  75. package/dist/components/hazo_collab_form_file_textbox/tag_pills.js +1 -1
  76. package/dist/components/hazo_collab_form_file_textbox/tag_pills.js.map +1 -1
  77. package/dist/components/hazo_collab_form_file_textbox/validation_dialog.js +1 -2
  78. package/dist/components/hazo_collab_form_file_textbox/validation_dialog.js.map +1 -1
  79. package/dist/components/hazo_collab_form_group.js +1 -1
  80. package/dist/components/hazo_collab_form_group.js.map +1 -1
  81. package/dist/components/hazo_collab_form_inputbox.js +1 -1
  82. package/dist/components/hazo_collab_form_inputbox.js.map +1 -1
  83. package/dist/components/hazo_collab_form_masked.js +1 -1
  84. package/dist/components/hazo_collab_form_masked.js.map +1 -1
  85. package/dist/components/hazo_collab_form_percentage.js +1 -1
  86. package/dist/components/hazo_collab_form_percentage.js.map +1 -1
  87. package/dist/components/hazo_collab_form_radio.js +1 -1
  88. package/dist/components/hazo_collab_form_radio.js.map +1 -1
  89. package/dist/components/hazo_collab_form_static_text.js +1 -1
  90. package/dist/components/hazo_collab_form_static_text.js.map +1 -1
  91. package/dist/components/hazo_collab_form_summary_row.js +1 -1
  92. package/dist/components/hazo_collab_form_summary_row.js.map +1 -1
  93. package/dist/components/hazo_collab_form_textarea.js +1 -1
  94. package/dist/components/hazo_collab_form_textarea.js.map +1 -1
  95. package/dist/components/hazo_collab_form_view/index.js +1 -1
  96. package/dist/components/hazo_collab_form_view/index.js.map +1 -1
  97. package/dist/components/hazo_collab_form_view/views/approval_view.js +1 -1
  98. package/dist/components/hazo_collab_form_view/views/approval_view.js.map +1 -1
  99. package/dist/components/hazo_collab_form_view/views/edit_view.js +1 -1
  100. package/dist/components/hazo_collab_form_view/views/edit_view.js.map +1 -1
  101. package/dist/components/hazo_collab_form_view/views/print_view.js +1 -1
  102. package/dist/components/hazo_collab_form_view/views/print_view.js.map +1 -1
  103. package/dist/components/hazo_collab_form_view/views/summary_data_table.js +1 -1
  104. package/dist/components/hazo_collab_form_view/views/summary_data_table.js.map +1 -1
  105. package/dist/components/hazo_collab_form_view/views/summary_view.js +2 -3
  106. package/dist/components/hazo_collab_form_view/views/summary_view.js.map +1 -1
  107. package/dist/components/hazo_data_form/field_renderers/boolean_field.js +1 -1
  108. package/dist/components/hazo_data_form/field_renderers/boolean_field.js.map +1 -1
  109. package/dist/components/hazo_data_form/field_renderers/currency_field.js +1 -1
  110. package/dist/components/hazo_data_form/field_renderers/currency_field.js.map +1 -1
  111. package/dist/components/hazo_data_form/field_renderers/date_field.js +1 -1
  112. package/dist/components/hazo_data_form/field_renderers/date_field.js.map +1 -1
  113. package/dist/components/hazo_data_form/field_renderers/email_field.js +1 -1
  114. package/dist/components/hazo_data_form/field_renderers/email_field.js.map +1 -1
  115. package/dist/components/hazo_data_form/field_renderers/masked_field.js +1 -1
  116. package/dist/components/hazo_data_form/field_renderers/masked_field.js.map +1 -1
  117. package/dist/components/hazo_data_form/field_renderers/number_field.js +1 -1
  118. package/dist/components/hazo_data_form/field_renderers/number_field.js.map +1 -1
  119. package/dist/components/hazo_data_form/field_renderers/option_field.js +1 -1
  120. package/dist/components/hazo_data_form/field_renderers/option_field.js.map +1 -1
  121. package/dist/components/hazo_data_form/field_renderers/percentage_field.js +1 -1
  122. package/dist/components/hazo_data_form/field_renderers/percentage_field.js.map +1 -1
  123. package/dist/components/hazo_data_form/field_renderers/static_text_field.js +1 -1
  124. package/dist/components/hazo_data_form/field_renderers/static_text_field.js.map +1 -1
  125. package/dist/components/hazo_data_form/field_renderers/summary_row_field.js +1 -1
  126. package/dist/components/hazo_data_form/field_renderers/summary_row_field.js.map +1 -1
  127. package/dist/components/hazo_data_form/field_renderers/table_field.js +1 -1
  128. package/dist/components/hazo_data_form/field_renderers/table_field.js.map +1 -1
  129. package/dist/components/hazo_data_form/field_renderers/table_reference_accordion.js +1 -1
  130. package/dist/components/hazo_data_form/field_renderers/table_reference_accordion.js.map +1 -1
  131. package/dist/components/hazo_data_form/field_renderers/tel_field.js +1 -1
  132. package/dist/components/hazo_data_form/field_renderers/tel_field.js.map +1 -1
  133. package/dist/components/hazo_data_form/field_renderers/text_field.js +1 -1
  134. package/dist/components/hazo_data_form/field_renderers/text_field.js.map +1 -1
  135. package/dist/components/hazo_data_form/field_renderers/textarea_field.js +1 -1
  136. package/dist/components/hazo_data_form/field_renderers/textarea_field.js.map +1 -1
  137. package/dist/components/hazo_data_form/file_manager_button.js +1 -1
  138. package/dist/components/hazo_data_form/file_manager_button.js.map +1 -1
  139. package/dist/components/hazo_data_form/ghost_form_panel.js +1 -1
  140. package/dist/components/hazo_data_form/ghost_form_panel.js.map +1 -1
  141. package/dist/components/hazo_data_form/group_renderer.js +1 -1
  142. package/dist/components/hazo_data_form/group_renderer.js.map +1 -1
  143. package/dist/components/hazo_data_form/hazo_data_form.d.ts.map +1 -1
  144. package/dist/components/hazo_data_form/hazo_data_form.js +4 -6
  145. package/dist/components/hazo_data_form/hazo_data_form.js.map +1 -1
  146. package/dist/components/hazo_data_form/pdf_panel.d.ts.map +1 -1
  147. package/dist/components/hazo_data_form/pdf_panel.js +3 -8
  148. package/dist/components/hazo_data_form/pdf_panel.js.map +1 -1
  149. package/dist/components/hazo_data_form/section_renderer.js +1 -1
  150. package/dist/components/hazo_data_form/section_renderer.js.map +1 -1
  151. package/dist/components/hazo_data_form/shared/data_form_badge.js +1 -1
  152. package/dist/components/hazo_data_form/shared/data_form_badge.js.map +1 -1
  153. package/dist/components/hazo_data_form/shared/data_form_field_layout.js +1 -1
  154. package/dist/components/hazo_data_form/shared/data_form_field_layout.js.map +1 -1
  155. package/dist/components/hazo_data_form/shared/data_form_file_column.js +1 -1
  156. package/dist/components/hazo_data_form/shared/data_form_file_column.js.map +1 -1
  157. package/dist/components/hazo_data_form/shared/data_form_help_tooltip.js +1 -1
  158. package/dist/components/hazo_data_form/shared/data_form_help_tooltip.js.map +1 -1
  159. package/dist/components/hazo_data_form/shared/data_form_label.js +1 -1
  160. package/dist/components/hazo_data_form/shared/data_form_label.js.map +1 -1
  161. package/dist/components/hazo_data_form/shared/data_form_reference_value.js +1 -1
  162. package/dist/components/hazo_data_form/shared/data_form_reference_value.js.map +1 -1
  163. package/dist/components/hazo_edit_field_dialog/hazo_edit_field_dialog.js +1 -1
  164. package/dist/components/hazo_edit_field_dialog/hazo_edit_field_dialog.js.map +1 -1
  165. package/dist/components/hazo_edit_group_dialog/hazo_edit_group_dialog.js +1 -1
  166. package/dist/components/hazo_edit_group_dialog/hazo_edit_group_dialog.js.map +1 -1
  167. package/dist/components/hazo_field_library/components/area_combobox.js +1 -1
  168. package/dist/components/hazo_field_library/components/area_combobox.js.map +1 -1
  169. package/dist/components/hazo_field_library/components/element_editor.js +1 -1
  170. package/dist/components/hazo_field_library/components/element_editor.js.map +1 -1
  171. package/dist/components/hazo_field_library/components/element_list.js +1 -1
  172. package/dist/components/hazo_field_library/components/element_list.js.map +1 -1
  173. package/dist/components/hazo_field_library/components/import_export_dialog.js +1 -1
  174. package/dist/components/hazo_field_library/components/import_export_dialog.js.map +1 -1
  175. package/dist/components/hazo_field_library/components/raw_json_viewer.js +1 -1
  176. package/dist/components/hazo_field_library/components/raw_json_viewer.js.map +1 -1
  177. package/dist/components/hazo_field_library/components/reference_picker.js +1 -1
  178. package/dist/components/hazo_field_library/components/reference_picker.js.map +1 -1
  179. package/dist/components/hazo_field_library/components/toolbar.js +1 -1
  180. package/dist/components/hazo_field_library/components/toolbar.js.map +1 -1
  181. package/dist/components/hazo_field_library/field_library.js +1 -1
  182. package/dist/components/hazo_field_library/field_library.js.map +1 -1
  183. package/dist/components/hazo_field_selector_dialog/components/field_autocomplete.d.ts.map +1 -1
  184. package/dist/components/hazo_field_selector_dialog/components/field_autocomplete.js.map +1 -1
  185. package/dist/components/hazo_field_selector_dialog/components/sortable_field_item.d.ts.map +1 -1
  186. package/dist/components/hazo_field_selector_dialog/components/sortable_field_item.js.map +1 -1
  187. package/dist/components/hazo_rfi_box/hazo_rfi_box.js +1 -1
  188. package/dist/components/hazo_rfi_box/hazo_rfi_box.js.map +1 -1
  189. package/dist/components/hazo_rfi_box/rfi_option_tag_selector.js +1 -1
  190. package/dist/components/hazo_rfi_box/rfi_option_tag_selector.js.map +1 -1
  191. package/dist/components/hazo_rfi_box/rfi_review_actions.js +1 -1
  192. package/dist/components/hazo_rfi_box/rfi_review_actions.js.map +1 -1
  193. package/dist/components/hazo_rfi_box/rfi_send_back_form.js +1 -1
  194. package/dist/components/hazo_rfi_box/rfi_send_back_form.js.map +1 -1
  195. package/dist/components/hazo_template_generator/components/field_editor.js +1 -1
  196. package/dist/components/hazo_template_generator/components/field_editor.js.map +1 -1
  197. package/dist/components/hazo_template_generator/components/preview_dialog.js +1 -1
  198. package/dist/components/hazo_template_generator/components/preview_dialog.js.map +1 -1
  199. package/dist/components/hazo_template_generator/components/preview_panel.js +1 -1
  200. package/dist/components/hazo_template_generator/components/preview_panel.js.map +1 -1
  201. package/dist/components/hazo_template_generator/components/section_tree.js +1 -1
  202. package/dist/components/hazo_template_generator/components/section_tree.js.map +1 -1
  203. package/dist/components/hazo_template_generator/components/tabs/basic_tab.js +1 -1
  204. package/dist/components/hazo_template_generator/components/tabs/basic_tab.js.map +1 -1
  205. package/dist/components/hazo_template_generator/components/tabs/icons_behaviour_tab.js +1 -1
  206. package/dist/components/hazo_template_generator/components/tabs/icons_behaviour_tab.js.map +1 -1
  207. package/dist/components/hazo_template_generator/components/tabs/section_tab.js +1 -1
  208. package/dist/components/hazo_template_generator/components/tabs/section_tab.js.map +1 -1
  209. package/dist/components/hazo_template_generator/components/tabs/type_tab.js +1 -1
  210. package/dist/components/hazo_template_generator/components/tabs/type_tab.js.map +1 -1
  211. package/dist/components/hazo_template_generator/components/tabs/validation_tab.js +1 -1
  212. package/dist/components/hazo_template_generator/components/tabs/validation_tab.js.map +1 -1
  213. package/dist/components/hazo_template_generator/components/toolbar.js +1 -1
  214. package/dist/components/hazo_template_generator/components/toolbar.js.map +1 -1
  215. package/dist/components/hazo_template_generator/components/type_editors/data_table_editor.js +1 -1
  216. package/dist/components/hazo_template_generator/components/type_editors/data_table_editor.js.map +1 -1
  217. package/dist/components/hazo_template_generator/components/type_editors/input_options_editor.js +1 -1
  218. package/dist/components/hazo_template_generator/components/type_editors/input_options_editor.js.map +1 -1
  219. package/dist/components/hazo_template_generator/components/ui/resizable.js +1 -1
  220. package/dist/components/hazo_template_generator/components/ui/resizable.js.map +1 -1
  221. package/dist/components/hazo_template_generator/components/ui/switch.js +1 -1
  222. package/dist/components/hazo_template_generator/components/ui/switch.js.map +1 -1
  223. package/dist/components/hazo_template_generator/template_generator.js +1 -1
  224. package/dist/components/hazo_template_generator/template_generator.js.map +1 -1
  225. package/dist/components/hazo_validation_rule_editor/components/clarification_settings.js +1 -1
  226. package/dist/components/hazo_validation_rule_editor/components/clarification_settings.js.map +1 -1
  227. package/dist/components/hazo_validation_rule_editor/components/prompt_editor.js +1 -1
  228. package/dist/components/hazo_validation_rule_editor/components/prompt_editor.js.map +1 -1
  229. package/dist/components/hazo_validation_rule_editor/components/rule_editor.js +1 -1
  230. package/dist/components/hazo_validation_rule_editor/components/rule_editor.js.map +1 -1
  231. package/dist/components/hazo_validation_rule_editor/components/rule_list.js +1 -1
  232. package/dist/components/hazo_validation_rule_editor/components/rule_list.js.map +1 -1
  233. package/dist/components/hazo_validation_rule_editor/components/variable_chain_input.js +1 -1
  234. package/dist/components/hazo_validation_rule_editor/components/variable_chain_input.js.map +1 -1
  235. package/dist/components/hazo_validation_rule_editor/validation_rule_editor.js +1 -1
  236. package/dist/components/hazo_validation_rule_editor/validation_rule_editor.js.map +1 -1
  237. package/dist/components/multi_state_radio.d.ts.map +1 -1
  238. package/dist/components/multi_state_radio.js +1 -1
  239. package/dist/components/multi_state_radio.js.map +1 -1
  240. package/dist/components/shared/base_field_layout.js +1 -1
  241. package/dist/components/shared/base_field_layout.js.map +1 -1
  242. package/dist/components/shared/button/button.js +1 -1
  243. package/dist/components/shared/button/button.js.map +1 -1
  244. package/dist/components/shared/collapsible_card/collapsible_card.js +1 -1
  245. package/dist/components/shared/collapsible_card/collapsible_card.js.map +1 -1
  246. package/dist/components/shared/dialog/dialog.js +1 -1
  247. package/dist/components/shared/dialog/dialog.js.map +1 -1
  248. package/dist/components/shared/document_type_editor.js +1 -1
  249. package/dist/components/shared/document_type_editor.js.map +1 -1
  250. package/dist/components/shared/editor_theme/components.js +1 -1
  251. package/dist/components/shared/editor_theme/components.js.map +1 -1
  252. package/dist/components/shared/field_accordion.js +1 -1
  253. package/dist/components/shared/field_accordion.js.map +1 -1
  254. package/dist/components/shared/field_tooltip/field_tooltip.d.ts.map +1 -1
  255. package/dist/components/shared/field_tooltip/field_tooltip.js.map +1 -1
  256. package/dist/components/shared/file_bar/file_bar.js +1 -1
  257. package/dist/components/shared/file_bar/file_bar.js.map +1 -1
  258. package/dist/components/shared/file_bar/file_bar_tag.js +1 -1
  259. package/dist/components/shared/file_bar/file_bar_tag.js.map +1 -1
  260. package/dist/components/shared/file_status_icon.js +1 -1
  261. package/dist/components/shared/file_status_icon.js.map +1 -1
  262. package/dist/components/shared/ihelp_icon.js +1 -2
  263. package/dist/components/shared/ihelp_icon.js.map +1 -1
  264. package/dist/components/shared/rule_result_card.js +1 -1
  265. package/dist/components/shared/rule_result_card.js.map +1 -1
  266. package/dist/components/shared/summary_files/summary_files.js +1 -1
  267. package/dist/components/shared/summary_files/summary_files.js.map +1 -1
  268. package/dist/components/shared/unified_field_controls/kebab_menu.js +1 -1
  269. package/dist/components/shared/unified_field_controls/kebab_menu.js.map +1 -1
  270. package/dist/components/shared/unified_field_controls/unified_field_controls.js +1 -1
  271. package/dist/components/shared/unified_field_controls/unified_field_controls.js.map +1 -1
  272. package/dist/components/status_badges.js +1 -1
  273. package/dist/components/status_badges.js.map +1 -1
  274. package/dist/components/thread_form/components/collected_data_view.d.ts +15 -1
  275. package/dist/components/thread_form/components/collected_data_view.d.ts.map +1 -1
  276. package/dist/components/thread_form/components/collected_data_view.js +95 -2
  277. package/dist/components/thread_form/components/collected_data_view.js.map +1 -1
  278. package/dist/components/thread_form/index.d.ts +6 -0
  279. package/dist/components/thread_form/index.d.ts.map +1 -1
  280. package/dist/components/thread_form/index.js +4 -0
  281. package/dist/components/thread_form/index.js.map +1 -1
  282. package/dist/components/thread_form/lib/build_export_sheets.d.ts +47 -0
  283. package/dist/components/thread_form/lib/build_export_sheets.d.ts.map +1 -0
  284. package/dist/components/thread_form/lib/build_export_sheets.js +149 -0
  285. package/dist/components/thread_form/lib/build_export_sheets.js.map +1 -0
  286. package/dist/components/thread_form/lib/export_sheets_to_file.d.ts +21 -0
  287. package/dist/components/thread_form/lib/export_sheets_to_file.d.ts.map +1 -0
  288. package/dist/components/thread_form/lib/export_sheets_to_file.js +81 -0
  289. package/dist/components/thread_form/lib/export_sheets_to_file.js.map +1 -0
  290. package/dist/components/thread_form/lib/export_sheets_to_google.d.ts +60 -0
  291. package/dist/components/thread_form/lib/export_sheets_to_google.d.ts.map +1 -0
  292. package/dist/components/thread_form/lib/export_sheets_to_google.js +172 -0
  293. package/dist/components/thread_form/lib/export_sheets_to_google.js.map +1 -0
  294. package/dist/components/thread_form/thread_form.d.ts.map +1 -1
  295. package/dist/components/thread_form/thread_form.js +2 -2
  296. package/dist/components/thread_form/thread_form.js.map +1 -1
  297. package/dist/components/thread_form/types.d.ts +31 -0
  298. package/dist/components/thread_form/types.d.ts.map +1 -1
  299. package/dist/components/thread_form/types.js.map +1 -1
  300. package/dist/lib/autofill_handler.d.ts +1 -1
  301. package/dist/lib/autofill_handler.d.ts.map +1 -1
  302. package/dist/lib/autofill_handler.js +14 -5
  303. package/dist/lib/autofill_handler.js.map +1 -1
  304. package/dist/lib/classification_handler.d.ts +1 -1
  305. package/dist/lib/classification_handler.d.ts.map +1 -1
  306. package/dist/lib/classification_handler.js +8 -3
  307. package/dist/lib/classification_handler.js.map +1 -1
  308. package/dist/lib/config/hazo_collab_forms_config.d.ts +50 -0
  309. package/dist/lib/config/hazo_collab_forms_config.d.ts.map +1 -0
  310. package/dist/lib/config/hazo_collab_forms_config.js +84 -0
  311. package/dist/lib/config/hazo_collab_forms_config.js.map +1 -0
  312. package/dist/lib/content_gate_handler.d.ts +1 -1
  313. package/dist/lib/content_gate_handler.d.ts.map +1 -1
  314. package/dist/lib/content_gate_handler.js +8 -3
  315. package/dist/lib/content_gate_handler.js.map +1 -1
  316. package/dist/lib/create_data_route.d.ts +4 -4
  317. package/dist/lib/create_data_route.d.ts.map +1 -1
  318. package/dist/lib/create_data_route.js +17 -3
  319. package/dist/lib/create_data_route.js.map +1 -1
  320. package/dist/lib/periodic_coverage_runner.d.ts.map +1 -1
  321. package/dist/lib/periodic_coverage_runner.js +6 -1
  322. package/dist/lib/periodic_coverage_runner.js.map +1 -1
  323. package/dist/lib/resolution_handler.d.ts +1 -1
  324. package/dist/lib/resolution_handler.d.ts.map +1 -1
  325. package/dist/lib/resolution_handler.js +3 -2
  326. package/dist/lib/resolution_handler.js.map +1 -1
  327. package/dist/lib/validation_handler.d.ts +1 -1
  328. package/dist/lib/validation_handler.d.ts.map +1 -1
  329. package/dist/lib/validation_handler.js +28 -8
  330. package/dist/lib/validation_handler.js.map +1 -1
  331. package/dist/lib/with_route_context.d.ts +17 -0
  332. package/dist/lib/with_route_context.d.ts.map +1 -0
  333. package/dist/lib/with_route_context.js +26 -0
  334. package/dist/lib/with_route_context.js.map +1 -0
  335. package/dist/utils/index.d.ts +1 -1
  336. package/dist/utils/index.js +1 -1
  337. package/dist/utils/logger.d.ts +25 -0
  338. package/dist/utils/logger.d.ts.map +1 -0
  339. package/dist/utils/logger.js +42 -0
  340. package/dist/utils/logger.js.map +1 -0
  341. package/dist/utils/uuid.d.ts +10 -0
  342. package/dist/utils/uuid.d.ts.map +1 -0
  343. package/dist/utils/uuid.js +13 -0
  344. package/dist/utils/uuid.js.map +1 -0
  345. package/package.json +26 -15
  346. package/dist/utils/cn.d.ts +0 -12
  347. package/dist/utils/cn.d.ts.map +0 -1
  348. package/dist/utils/cn.js +0 -15
  349. package/dist/utils/cn.js.map +0 -1
  350. package/dist/utils/optional_import.d.ts +0 -18
  351. package/dist/utils/optional_import.d.ts.map +0 -1
  352. package/dist/utils/optional_import.js +0 -32
  353. package/dist/utils/optional_import.js.map +0 -1
@@ -29,6 +29,10 @@ export { use_thread_form } from './hooks/use_thread_form.js';
29
29
  export { use_file_pipeline } from './hooks/use_file_pipeline.js';
30
30
  // Utilities
31
31
  export { format_extracted_field, prettify_key, is_iso_date, CURRENCY_KEY_REGEX, } from './utils/format_extracted_field.js';
32
+ // Export helpers (Collected Data → Excel / CSV / Google Sheets)
33
+ export { build_export_sheets, safe_cell, sanitize_sheet_name, is_safe_http_url, } from './lib/build_export_sheets.js';
34
+ export { export_sheets_to_file, cell_value } from './lib/export_sheets_to_file.js';
35
+ export { export_sheets_to_google, to_cell_value } from './lib/export_sheets_to_google.js';
32
36
  // Sample data (for testing/demos)
33
37
  export { SAMPLE_THREAD_FORM } from './sample_data.js';
34
38
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/thread_form/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AA6ChE,YAAY;AACZ,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE9E,8CAA8C;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAE9H,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAElE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAGhF,QAAQ;AACR,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAG7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGjE,YAAY;AACZ,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,WAAW,EACX,kBAAkB,GACnB,MAAM,mCAAmC,CAAC;AAG3C,kCAAkC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/thread_form/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AA6ChE,YAAY;AACZ,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE9E,8CAA8C;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAE9H,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAElE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAGhF,QAAQ;AACR,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAG7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGjE,YAAY;AACZ,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,WAAW,EACX,kBAAkB,GACnB,MAAM,mCAAmC,CAAC;AAG3C,gEAAgE;AAChE,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAEnF,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAG1F,kCAAkC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * build_export_sheets — turn selected Collected-Data ContentItems into a
3
+ * spreadsheet spec (one sheet per category, columns = File Name + extracted
4
+ * fields). Pure and client-safe; shared by the xlsx/csv download and the
5
+ * Google Sheets export. Ported from taxclientdocs's lib/collected-data-excel.ts,
6
+ * adapted to the package's own category grouping (mirrors `gather_categories`
7
+ * in collected_data_view.tsx).
8
+ */
9
+ import type { ContentItem, ClassificationResult, ClassificationDocumentType } from '../types.js';
10
+ export interface ColumnSpec {
11
+ key: string;
12
+ label: string;
13
+ }
14
+ /** A clickable cell: shown as `text`, linking to `url`. */
15
+ export interface LinkCell {
16
+ text: string;
17
+ url: string;
18
+ }
19
+ export type SheetCell = string | number | null | LinkCell;
20
+ export interface SheetSpec {
21
+ /** Display category label (matches the Collected Data tab header). */
22
+ category: string;
23
+ /** Excel-safe, ≤31-char, de-duplicated worksheet name. */
24
+ sheet_name: string;
25
+ columns: ColumnSpec[];
26
+ rows: SheetCell[][];
27
+ }
28
+ /** Only absolute http(s) URLs may be embedded in an exported sheet (defence in depth). */
29
+ export declare function is_safe_http_url(url: string): boolean;
30
+ /**
31
+ * Neutralize formula injection: Excel/CSV treats cells starting with =, +, -, @,
32
+ * tab, or CR as formulas. Prefix with a single quote to force literal text.
33
+ * Strip ASCII control characters (except normal whitespace) as defence-in-depth.
34
+ */
35
+ export declare function safe_cell(v: string): string;
36
+ /** Strip Excel-invalid chars and clamp to 31 chars. Falls back to "Sheet". */
37
+ export declare function sanitize_sheet_name(name: string): string;
38
+ /**
39
+ * Build one SheetSpec per document category from the given (already-selected)
40
+ * items. Only file-type items are included. Columns = File Name + the union of
41
+ * extracted_fields keys in the bucket, ordered by the matching document type's
42
+ * expected_fields when available.
43
+ */
44
+ export declare function build_export_sheets(items: ContentItem[], document_types?: ClassificationDocumentType[], classification_results?: Map<string, ClassificationResult>,
45
+ /** file_id → absolute URL. When present, the File Name cell becomes a clickable LinkCell. */
46
+ file_links?: Map<string, string>): SheetSpec[];
47
+ //# sourceMappingURL=build_export_sheets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build_export_sheets.d.ts","sourceRoot":"","sources":["../../../../src/components/thread_form/lib/build_export_sheets.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAGjG,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,2DAA2D;AAC3D,MAAM,WAAW,QAAQ;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;CAAE;AACxD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC;AAE1D,MAAM,WAAW,SAAS;IACxB,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;CACrB;AAED,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI3C;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIxD;AA0CD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,EAAE,EACpB,cAAc,GAAE,0BAA0B,EAAO,EACjD,sBAAsB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC;AAC1D,6FAA6F;AAC7F,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,SAAS,EAAE,CAwEb"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * build_export_sheets — turn selected Collected-Data ContentItems into a
3
+ * spreadsheet spec (one sheet per category, columns = File Name + extracted
4
+ * fields). Pure and client-safe; shared by the xlsx/csv download and the
5
+ * Google Sheets export. Ported from taxclientdocs's lib/collected-data-excel.ts,
6
+ * adapted to the package's own category grouping (mirrors `gather_categories`
7
+ * in collected_data_view.tsx).
8
+ */
9
+ import { prettify_key } from '../utils/format_extracted_field.js';
10
+ /** Only absolute http(s) URLs may be embedded in an exported sheet (defence in depth). */
11
+ export function is_safe_http_url(url) {
12
+ return /^https?:\/\//i.test(url);
13
+ }
14
+ /**
15
+ * Neutralize formula injection: Excel/CSV treats cells starting with =, +, -, @,
16
+ * tab, or CR as formulas. Prefix with a single quote to force literal text.
17
+ * Strip ASCII control characters (except normal whitespace) as defence-in-depth.
18
+ */
19
+ export function safe_cell(v) {
20
+ // eslint-disable-next-line no-control-regex
21
+ const stripped = v.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '');
22
+ return /^[=+\-@\t\r]/.test(stripped) ? `'${stripped}` : stripped;
23
+ }
24
+ /** Strip Excel-invalid chars and clamp to 31 chars. Falls back to "Sheet". */
25
+ export function sanitize_sheet_name(name) {
26
+ // Excel disallows: [ ] : * ? / \
27
+ const stripped = name.replace(/[[\]:*?/\\]/g, '').trim();
28
+ return stripped.slice(0, 31) || 'Sheet';
29
+ }
30
+ /** Title Case a snake_case / space-separated doc type (mirrors gather_categories). */
31
+ function title_case(s) {
32
+ return s.replace(/_/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase());
33
+ }
34
+ /** Resolve the display category label for a file item (matches the tab UI). */
35
+ function category_label_for(item, classification_results) {
36
+ if (item.category_label)
37
+ return item.category_label;
38
+ if (item.classification_result)
39
+ return title_case(item.classification_result.document_type);
40
+ const cr = classification_results?.get(item.content_id);
41
+ if (cr)
42
+ return title_case(cr.document_type);
43
+ return 'Uploaded Files';
44
+ }
45
+ /** Raw document_type (the type_id used to look up expected_fields), if any. */
46
+ function raw_doc_type_for(item, classification_results) {
47
+ return (item.classification_result?.document_type ??
48
+ classification_results?.get(item.content_id)?.document_type);
49
+ }
50
+ /** Extracted fields for a file item, from the item or the pipeline result map. */
51
+ function extracted_fields_for(item, classification_results) {
52
+ return (item.classification_result?.extracted_fields ??
53
+ classification_results?.get(item.content_id)?.extracted_fields ??
54
+ {});
55
+ }
56
+ /**
57
+ * Build one SheetSpec per document category from the given (already-selected)
58
+ * items. Only file-type items are included. Columns = File Name + the union of
59
+ * extracted_fields keys in the bucket, ordered by the matching document type's
60
+ * expected_fields when available.
61
+ */
62
+ export function build_export_sheets(items, document_types = [], classification_results,
63
+ /** file_id → absolute URL. When present, the File Name cell becomes a clickable LinkCell. */
64
+ file_links) {
65
+ const doctype_map = new Map(document_types.map((d) => [d.type_id, d]));
66
+ // Bucket file items by display category, preserving first-appearance order.
67
+ const buckets = new Map();
68
+ for (const item of items) {
69
+ if (item.type !== 'file')
70
+ continue;
71
+ const label = category_label_for(item, classification_results);
72
+ let bucket = buckets.get(label);
73
+ if (!bucket) {
74
+ bucket = { items: [], raw_doc_type: undefined };
75
+ buckets.set(label, bucket);
76
+ }
77
+ bucket.items.push(item);
78
+ if (!bucket.raw_doc_type)
79
+ bucket.raw_doc_type = raw_doc_type_for(item, classification_results);
80
+ }
81
+ const used_names = new Set();
82
+ const sheets = [];
83
+ for (const [label, bucket] of buckets) {
84
+ const spec = bucket.raw_doc_type ? doctype_map.get(bucket.raw_doc_type) : undefined;
85
+ // Union of all extracted_fields keys in this bucket.
86
+ const key_set = new Set();
87
+ for (const item of bucket.items) {
88
+ for (const k of Object.keys(extracted_fields_for(item, classification_results))) {
89
+ key_set.add(k);
90
+ }
91
+ }
92
+ // Order: expected_fields order first, then any remaining keys.
93
+ const ordered = [];
94
+ if (spec?.expected_fields) {
95
+ for (const ef of spec.expected_fields)
96
+ if (key_set.has(ef.key))
97
+ ordered.push(ef.key);
98
+ }
99
+ for (const k of key_set)
100
+ if (!ordered.includes(k))
101
+ ordered.push(k);
102
+ const columns = [
103
+ { key: '__file_name', label: 'File Name' },
104
+ ...ordered.map((k) => {
105
+ const ef_spec = spec?.expected_fields?.find((e) => e.key === k);
106
+ return { key: k, label: ef_spec?.label ?? prettify_key(k) };
107
+ }),
108
+ ];
109
+ const rows = bucket.items.map((item) => {
110
+ const ef = extracted_fields_for(item, classification_results);
111
+ const file_name = safe_cell(item.file?.file_name ?? '');
112
+ const link_url = item.file?.file_id ? file_links?.get(item.file.file_id) : undefined;
113
+ const name_cell = link_url && is_safe_http_url(link_url) ? { text: file_name, url: link_url } : file_name;
114
+ const row = [name_cell];
115
+ for (const col of columns.slice(1)) {
116
+ const val = ef[col.key];
117
+ if (val === undefined || val === null)
118
+ row.push(null);
119
+ else if (typeof val === 'number')
120
+ row.push(val);
121
+ else if (Array.isArray(val) || typeof val === 'object')
122
+ row.push(safe_cell(JSON.stringify(val)));
123
+ else
124
+ row.push(safe_cell(String(val)));
125
+ }
126
+ return row;
127
+ });
128
+ sheets.push({
129
+ category: label,
130
+ sheet_name: dedupe_sheet_name(sanitize_sheet_name(label), used_names),
131
+ columns,
132
+ rows,
133
+ });
134
+ }
135
+ return sheets;
136
+ }
137
+ /** Ensure a unique, ≤31-char sheet name by appending " (2)", " (3)", … on collision. */
138
+ function dedupe_sheet_name(base, used) {
139
+ let name = base;
140
+ let n = 2;
141
+ while (used.has(name)) {
142
+ const suffix = ` (${n})`;
143
+ name = base.slice(0, 31 - suffix.length) + suffix;
144
+ n++;
145
+ }
146
+ used.add(name);
147
+ return name;
148
+ }
149
+ //# sourceMappingURL=build_export_sheets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build_export_sheets.js","sourceRoot":"","sources":["../../../../src/components/thread_form/lib/build_export_sheets.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAoBlE,0FAA0F;AAC1F,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,4CAA4C;IAC5C,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,mCAAmC,EAAE,EAAE,CAAC,CAAC;IACpE,OAAO,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;AACnE,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,iCAAiC;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC;AAC1C,CAAC;AAED,sFAAsF;AACtF,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,+EAA+E;AAC/E,SAAS,kBAAkB,CACzB,IAAiB,EACjB,sBAA0D;IAE1D,IAAI,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC,cAAc,CAAC;IACpD,IAAI,IAAI,CAAC,qBAAqB;QAAE,OAAO,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;IAC5F,MAAM,EAAE,GAAG,sBAAsB,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,IAAI,EAAE;QAAE,OAAO,UAAU,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;IAC5C,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,+EAA+E;AAC/E,SAAS,gBAAgB,CACvB,IAAiB,EACjB,sBAA0D;IAE1D,OAAO,CACL,IAAI,CAAC,qBAAqB,EAAE,aAAa;QACzC,sBAAsB,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,aAAa,CAC5D,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,SAAS,oBAAoB,CAC3B,IAAiB,EACjB,sBAA0D;IAE1D,OAAO,CACL,IAAI,CAAC,qBAAqB,EAAE,gBAAgB;QAC5C,sBAAsB,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,gBAAgB;QAC9D,EAAE,CACwB,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAoB,EACpB,iBAA+C,EAAE,EACjD,sBAA0D;AAC1D,6FAA6F;AAC7F,UAAgC;IAEhC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvE,4EAA4E;IAC5E,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2D,CAAC;IACnF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QACnC,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;QAC/D,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,YAAY;YAAE,MAAM,CAAC,YAAY,GAAG,gBAAgB,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEpF,qDAAqD;QACrD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC,EAAE,CAAC;gBAChF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAED,+DAA+D;QAC/D,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,IAAI,EAAE,eAAe,EAAE,CAAC;YAC1B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,eAAe;gBAAE,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACvF,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnE,MAAM,OAAO,GAAiB;YAC5B,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE;YAC1C,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACnB,MAAM,OAAO,GAAG,IAAI,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;gBAChE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,CAAC,CAAC;SACH,CAAC;QAEF,MAAM,IAAI,GAAkB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACpD,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;YAC9D,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACrF,MAAM,SAAS,GACb,QAAQ,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1F,MAAM,GAAG,GAAgB,CAAC,SAAS,CAAC,CAAC;YACrC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnC,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACxB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;oBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;qBACjD,IAAI,OAAO,GAAG,KAAK,QAAQ;oBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;qBAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,KAAK,QAAQ;oBAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;oBAC5F,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxC,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,iBAAiB,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;YACrE,OAAO;YACP,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wFAAwF;AACxF,SAAS,iBAAiB,CAAC,IAAY,EAAE,IAAiB;IACxD,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC;QACzB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;QAClD,CAAC,EAAE,CAAC;IACN,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACf,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * export_sheets_to_file — generate an .xlsx or .csv file from a SheetSpec[] and
3
+ * trigger a browser download. Uses SheetJS, loaded via dynamic import as an
4
+ * OPTIONAL peer dependency: if `xlsx` is not installed the call is a no-op
5
+ * (returns false) so consumers who don't export never pay the bundle cost.
6
+ */
7
+ import { type SheetSpec, type SheetCell } from './build_export_sheets.js';
8
+ /** The plain value an aoa cell carries (LinkCell → its display text). */
9
+ export declare function cell_value(cell: SheetCell): string | number | null;
10
+ export type ExportFormat = 'xlsx' | 'csv';
11
+ export interface ExportOptions {
12
+ format: ExportFormat;
13
+ /** Base filename WITHOUT extension. */
14
+ filename: string;
15
+ }
16
+ /**
17
+ * Returns true when a file was generated and the download was triggered;
18
+ * false when there was nothing to export or the optional `xlsx` peer is absent.
19
+ */
20
+ export declare function export_sheets_to_file(sheets: SheetSpec[], options: ExportOptions): Promise<boolean>;
21
+ //# sourceMappingURL=export_sheets_to_file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export_sheets_to_file.d.ts","sourceRoot":"","sources":["../../../../src/components/thread_form/lib/export_sheets_to_file.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAoB,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE5F,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAElE;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,CAAC;AAE1C,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,EAAE,EACnB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,OAAO,CAAC,CA4ClB"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * export_sheets_to_file — generate an .xlsx or .csv file from a SheetSpec[] and
3
+ * trigger a browser download. Uses SheetJS, loaded via dynamic import as an
4
+ * OPTIONAL peer dependency: if `xlsx` is not installed the call is a no-op
5
+ * (returns false) so consumers who don't export never pay the bundle cost.
6
+ */
7
+ import { is_safe_http_url } from './build_export_sheets.js';
8
+ /** The plain value an aoa cell carries (LinkCell → its display text). */
9
+ export function cell_value(cell) {
10
+ return cell && typeof cell === 'object' ? cell.text : cell;
11
+ }
12
+ /**
13
+ * Returns true when a file was generated and the download was triggered;
14
+ * false when there was nothing to export or the optional `xlsx` peer is absent.
15
+ */
16
+ export async function export_sheets_to_file(sheets, options) {
17
+ if (!sheets.length)
18
+ return false;
19
+ let XLSX;
20
+ try {
21
+ XLSX = await import('xlsx');
22
+ }
23
+ catch {
24
+ // eslint-disable-next-line no-console
25
+ console.warn('[hazo_collab_forms] Export skipped: optional peer dependency "xlsx" is not installed.');
26
+ return false;
27
+ }
28
+ if (options.format === 'csv') {
29
+ const csv = build_csv(XLSX, sheets);
30
+ // Prepend a UTF-8 BOM so Excel opens it with the correct encoding.
31
+ download_blob(`${csv}`, `${options.filename}.csv`, 'text/csv;charset=utf-8');
32
+ return true;
33
+ }
34
+ const wb = XLSX.utils.book_new();
35
+ for (const sheet of sheets) {
36
+ const aoa = [sheet.columns.map((c) => c.label), ...sheet.rows.map((row) => row.map(cell_value))];
37
+ const ws = XLSX.utils.aoa_to_sheet(aoa);
38
+ // Apply hyperlinks for LinkCells (data rows start at r=1; r=0 is the header).
39
+ sheet.rows.forEach((row, ri) => {
40
+ row.forEach((cell, ci) => {
41
+ if (cell && typeof cell === 'object' && is_safe_http_url(cell.url)) {
42
+ const addr = XLSX.utils.encode_cell({ r: ri + 1, c: ci });
43
+ const target = ws[addr];
44
+ if (target)
45
+ target.l = { Target: cell.url };
46
+ }
47
+ });
48
+ });
49
+ XLSX.utils.book_append_sheet(wb, ws, sheet.sheet_name);
50
+ }
51
+ const buffer = XLSX.write(wb, { bookType: 'xlsx', type: 'array' });
52
+ download_blob(buffer, `${options.filename}.xlsx`, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
53
+ return true;
54
+ }
55
+ /**
56
+ * Multi-sheet CSV: one file, each category preceded by a `# <Category>` banner,
57
+ * sections separated by a blank line. Per-category column sets differ, so a
58
+ * single flat header would be wrong — the banner keeps each block self-describing.
59
+ */
60
+ function build_csv(XLSX, sheets) {
61
+ const parts = [];
62
+ for (const sheet of sheets) {
63
+ const aoa = [sheet.columns.map((c) => c.label), ...sheet.rows.map((row) => row.map(cell_value))];
64
+ const ws = XLSX.utils.aoa_to_sheet(aoa);
65
+ parts.push(`# ${sheet.category}`);
66
+ parts.push(XLSX.utils.sheet_to_csv(ws));
67
+ }
68
+ return parts.join('\n');
69
+ }
70
+ function download_blob(data, filename, mime) {
71
+ const blob = new Blob([data], { type: mime });
72
+ const url = URL.createObjectURL(blob);
73
+ const a = document.createElement('a');
74
+ a.href = url;
75
+ a.download = filename;
76
+ document.body.appendChild(a);
77
+ a.click();
78
+ document.body.removeChild(a);
79
+ URL.revokeObjectURL(url);
80
+ }
81
+ //# sourceMappingURL=export_sheets_to_file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export_sheets_to_file.js","sourceRoot":"","sources":["../../../../src/components/thread_form/lib/export_sheets_to_file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * export_sheets_to_google — create a populated Google Sheet from a SheetSpec[]
3
+ * entirely in the browser. Uses Google Identity Services (GIS) to pop up a
4
+ * consent dialog and obtain a short-lived `drive.file` access token, then
5
+ * creates a multi-tab spreadsheet via the Sheets REST API.
6
+ *
7
+ * No server route, no stored credentials. The consumer supplies a Google OAuth
8
+ * Web client ID (whose authorized JS origins include the consuming app's
9
+ * domain) and enables the Sheets API in their Google Cloud project.
10
+ */
11
+ import { type SheetSpec, type SheetCell } from './build_export_sheets.js';
12
+ export interface GoogleSheetsExportOptions {
13
+ /** Google OAuth Web client ID (public; configured in Google Cloud console). */
14
+ client_id: string;
15
+ /** Spreadsheet title. */
16
+ filename: string;
17
+ }
18
+ interface TokenResponse {
19
+ access_token?: string;
20
+ /** Lifetime in seconds (GIS returns ~3600). Used to cache the token. */
21
+ expires_in?: number;
22
+ error?: string;
23
+ }
24
+ interface TokenClient {
25
+ callback: (resp: TokenResponse) => void;
26
+ requestAccessToken: (overrides?: {
27
+ prompt?: string;
28
+ }) => void;
29
+ }
30
+ interface GisOAuth2 {
31
+ initTokenClient: (config: {
32
+ client_id: string;
33
+ scope: string;
34
+ callback: (resp: TokenResponse) => void;
35
+ }) => TokenClient;
36
+ }
37
+ declare global {
38
+ interface Window {
39
+ google?: {
40
+ accounts?: {
41
+ oauth2?: GisOAuth2;
42
+ };
43
+ };
44
+ }
45
+ }
46
+ /**
47
+ * Returns a full Sheets API CellData object for a SheetCell.
48
+ * LinkCells use textFormatRuns (native Sheets hyperlink) rather than =HYPERLINK() formula,
49
+ * which is more reliable across locales and API creation vs edit contexts.
50
+ */
51
+ export declare function to_cell_value(cell: SheetCell): Record<string, unknown>;
52
+ /**
53
+ * Create the spreadsheet and return its URL. Throws on auth cancellation or API
54
+ * failure (the caller surfaces a toast).
55
+ */
56
+ export declare function export_sheets_to_google(sheets: SheetSpec[], options: GoogleSheetsExportOptions): Promise<{
57
+ url: string;
58
+ }>;
59
+ export {};
60
+ //# sourceMappingURL=export_sheets_to_google.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export_sheets_to_google.d.ts","sourceRoot":"","sources":["../../../../src/components/thread_form/lib/export_sheets_to_google.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAoB,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAM5F,MAAM,WAAW,yBAAyB;IACxC,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAGD,UAAU,aAAa;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AACD,UAAU,WAAW;IACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IACxC,kBAAkB,EAAE,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC/D;AACD,UAAU,SAAS;IACjB,eAAe,EAAE,CAAC,MAAM,EAAE;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;KACzC,KAAK,WAAW,CAAC;CACnB;AACD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,MAAM,CAAC,EAAE;YAAE,QAAQ,CAAC,EAAE;gBAAE,MAAM,CAAC,EAAE,SAAS,CAAA;aAAE,CAAA;SAAE,CAAC;KAChD;CACF;AA2GD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAetE;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,SAAS,EAAE,EACnB,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CA6B1B"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * export_sheets_to_google — create a populated Google Sheet from a SheetSpec[]
3
+ * entirely in the browser. Uses Google Identity Services (GIS) to pop up a
4
+ * consent dialog and obtain a short-lived `drive.file` access token, then
5
+ * creates a multi-tab spreadsheet via the Sheets REST API.
6
+ *
7
+ * No server route, no stored credentials. The consumer supplies a Google OAuth
8
+ * Web client ID (whose authorized JS origins include the consuming app's
9
+ * domain) and enables the Sheets API in their Google Cloud project.
10
+ */
11
+ import { is_safe_http_url } from './build_export_sheets.js';
12
+ const GIS_SRC = 'https://accounts.google.com/gsi/client';
13
+ const DRIVE_FILE_SCOPE = 'https://www.googleapis.com/auth/drive.file';
14
+ const SHEETS_CREATE_URL = 'https://sheets.googleapis.com/v4/spreadsheets';
15
+ let gis_load_promise = null;
16
+ // In-memory token cache + reused token client, keyed by client_id. The browser
17
+ // implicit-token flow can't issue refresh tokens, so the token still expires
18
+ // (~1h) and is never persisted across reloads — but within a session this means
19
+ // repeated exports reuse one grant instead of popping consent every time.
20
+ const TOKEN_EXPIRY_BUFFER_MS = 60000; // refresh a minute before actual expiry
21
+ let token_client = null;
22
+ let token_client_id = null;
23
+ let cached_token = null;
24
+ /** Inject the GIS client script once and resolve when it's ready. */
25
+ function load_gis() {
26
+ if (typeof window === 'undefined') {
27
+ return Promise.reject(new Error('Google Sheets export requires a browser environment.'));
28
+ }
29
+ if (window.google?.accounts?.oauth2)
30
+ return Promise.resolve();
31
+ if (gis_load_promise)
32
+ return gis_load_promise;
33
+ gis_load_promise = new Promise((resolve, reject) => {
34
+ const existing = document.querySelector(`script[src="${GIS_SRC}"]`);
35
+ if (existing) {
36
+ existing.addEventListener('load', () => resolve());
37
+ existing.addEventListener('error', () => reject(new Error('Failed to load Google Identity Services.')));
38
+ return;
39
+ }
40
+ const script = document.createElement('script');
41
+ script.src = GIS_SRC;
42
+ script.async = true;
43
+ script.defer = true;
44
+ script.onload = () => resolve();
45
+ script.onerror = () => {
46
+ gis_load_promise = null;
47
+ reject(new Error('Failed to load Google Identity Services.'));
48
+ };
49
+ document.head.appendChild(script);
50
+ });
51
+ return gis_load_promise;
52
+ }
53
+ /**
54
+ * Resolve a `drive.file` access token, reusing a cached one while it's valid so
55
+ * repeated exports don't re-prompt. Only acquires a fresh token (with `prompt:
56
+ * ''`, which reuses a prior grant silently when possible) once the cache lapses.
57
+ */
58
+ async function request_access_token(client_id) {
59
+ // Reuse a still-valid token — no popup, no network round-trip to Google.
60
+ if (cached_token && cached_token.expires_at - TOKEN_EXPIRY_BUFFER_MS > Date.now()) {
61
+ return cached_token.value;
62
+ }
63
+ await load_gis();
64
+ const oauth2 = window.google?.accounts?.oauth2;
65
+ if (!oauth2)
66
+ throw new Error('Google Identity Services unavailable.');
67
+ // Reuse one token client per client_id; its callback is rebound per request.
68
+ if (!token_client || token_client_id !== client_id) {
69
+ token_client = oauth2.initTokenClient({
70
+ client_id,
71
+ scope: DRIVE_FILE_SCOPE,
72
+ callback: () => { },
73
+ });
74
+ token_client_id = client_id;
75
+ }
76
+ const client = token_client;
77
+ return new Promise((resolve, reject) => {
78
+ client.callback = (resp) => {
79
+ if (resp.error || !resp.access_token) {
80
+ reject(new Error(resp.error || 'Google authorization was cancelled.'));
81
+ return;
82
+ }
83
+ cached_token = {
84
+ value: resp.access_token,
85
+ expires_at: Date.now() + (resp.expires_in ?? 3600) * 1000,
86
+ };
87
+ resolve(resp.access_token);
88
+ };
89
+ // prompt: '' → don't force the consent screen when a grant already exists.
90
+ client.requestAccessToken({ prompt: '' });
91
+ });
92
+ }
93
+ /** Map a SheetSpec[] to a Sheets API `Spreadsheet` resource (header row + data). */
94
+ function build_spreadsheet_resource(sheets, title) {
95
+ return {
96
+ properties: { title },
97
+ sheets: sheets.map((sheet) => ({
98
+ properties: { title: sheet.sheet_name },
99
+ data: [
100
+ {
101
+ startRow: 0,
102
+ startColumn: 0,
103
+ rowData: [
104
+ { values: sheet.columns.map((c) => ({ userEnteredValue: { stringValue: c.label } })) },
105
+ ...sheet.rows.map((row) => ({
106
+ values: row.map((cell) => to_cell_value(cell)),
107
+ })),
108
+ ],
109
+ },
110
+ ],
111
+ })),
112
+ };
113
+ }
114
+ /**
115
+ * Returns a full Sheets API CellData object for a SheetCell.
116
+ * LinkCells use textFormatRuns (native Sheets hyperlink) rather than =HYPERLINK() formula,
117
+ * which is more reliable across locales and API creation vs edit contexts.
118
+ */
119
+ export function to_cell_value(cell) {
120
+ if (cell === null)
121
+ return { userEnteredValue: {} };
122
+ if (typeof cell === 'number')
123
+ return { userEnteredValue: { numberValue: cell } };
124
+ if (typeof cell === 'object') {
125
+ if (is_safe_http_url(cell.url)) {
126
+ return {
127
+ userEnteredValue: { stringValue: cell.text },
128
+ textFormatRuns: [
129
+ { startIndex: 0, format: { link: { uri: cell.url } } },
130
+ ],
131
+ };
132
+ }
133
+ return { userEnteredValue: { stringValue: cell.text } };
134
+ }
135
+ return { userEnteredValue: { stringValue: cell } };
136
+ }
137
+ /**
138
+ * Create the spreadsheet and return its URL. Throws on auth cancellation or API
139
+ * failure (the caller surfaces a toast).
140
+ */
141
+ export async function export_sheets_to_google(sheets, options) {
142
+ if (!sheets.length)
143
+ throw new Error('Nothing to export.');
144
+ if (!options.client_id)
145
+ throw new Error('Missing Google client ID.');
146
+ const access_token = await request_access_token(options.client_id);
147
+ const res = await fetch(SHEETS_CREATE_URL, {
148
+ method: 'POST',
149
+ headers: {
150
+ Authorization: `Bearer ${access_token}`,
151
+ 'Content-Type': 'application/json',
152
+ },
153
+ body: JSON.stringify(build_spreadsheet_resource(sheets, options.filename)),
154
+ });
155
+ if (!res.ok) {
156
+ let message = `Google Sheets API error (${res.status}).`;
157
+ try {
158
+ const body = (await res.json());
159
+ if (body.error?.message)
160
+ message = body.error.message;
161
+ }
162
+ catch {
163
+ /* keep default message */
164
+ }
165
+ throw new Error(message);
166
+ }
167
+ const data = (await res.json());
168
+ if (!data.spreadsheetUrl)
169
+ throw new Error('Google Sheets API returned no spreadsheet URL.');
170
+ return { url: data.spreadsheetUrl };
171
+ }
172
+ //# sourceMappingURL=export_sheets_to_google.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export_sheets_to_google.js","sourceRoot":"","sources":["../../../../src/components/thread_form/lib/export_sheets_to_google.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"thread_form.d.ts","sourceRoot":"","sources":["../../../src/components/thread_form/thread_form.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAuI,aAAa,EAAE,MAAM,YAAY,CAAC;AA2BtM,eAAO,MAAM,UAAU,2GAsuDrB,CAAC"}
1
+ {"version":3,"file":"thread_form.d.ts","sourceRoot":"","sources":["../../../src/components/thread_form/thread_form.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAuI,aAAa,EAAE,MAAM,YAAY,CAAC;AA2BtM,eAAO,MAAM,UAAU,2GAgvDrB,CAAC"}
@@ -26,7 +26,7 @@ function normalize_file_mime(file_type, file_name) {
26
26
  return file_type;
27
27
  return infer_mime_type(file_name);
28
28
  }
29
- export const ThreadForm = forwardRef(function ThreadForm({ data, role, current_user, on_form_change, on_task_update, on_message_add, on_message_edit, on_message_delete, on_selection_change, on_send_form, on_close_form, on_export_data, on_request_analysis, on_request_reanalysis, file_manager, pdf_viewer, show_json_viewer, classification_api_url, validation_api_url, validation_rules_api_url, content_gate_api_url, resolution_api_url, response_extraction_api_url, available_document_types, available_tags, on_update_content_item, on_log, view_button_variant, show_info_icon, show_extracted_fields, render_collected_item_details, collected_data_locale, collected_data_currency_code, collected_data_truncate_chars, on_request_reextraction,
29
+ export const ThreadForm = forwardRef(function ThreadForm({ data, role, current_user, on_form_change, on_task_update, on_message_add, on_message_edit, on_message_delete, on_selection_change, on_send_form, on_close_form, on_export_data, on_request_analysis, on_request_reanalysis, file_manager, pdf_viewer, show_json_viewer, classification_api_url, validation_api_url, validation_rules_api_url, content_gate_api_url, resolution_api_url, response_extraction_api_url, available_document_types, available_tags, on_update_content_item, on_log, view_button_variant, show_info_icon, show_extracted_fields, render_collected_item_details, collected_data_locale, collected_data_currency_code, collected_data_truncate_chars, on_request_reextraction, enable_export, export_filename, google_client_id, export_file_links, get_external_links,
30
30
  // ── Key-Info drawer (H.7) ──
31
31
  key_info_sections, key_info_form_data, on_key_info_form_data_change, field_metadata, on_metadata_change, show_confirm_action, key_info_title, key_info_default_expanded, field_action_components, enable_field_audit, audit_debounce_ms, key_info_field_columns, key_info_highlight_empty_required, task_number_offset, }, forwarded_ref) {
32
32
  const [expanded_tasks, set_expanded_tasks] = useState(() => {
@@ -1405,6 +1405,6 @@ key_info_sections, key_info_form_data, on_key_info_form_data_change, field_metad
1405
1405
  else
1406
1406
  next.add(task.task_id);
1407
1407
  return next;
1408
- }), on_toggle_complete: handle_toggle_complete, on_delete_task: handle_delete_task, on_approve_task: handle_approve_task, on_reopen_task: handle_reopen_task, on_rename_task: handle_rename_task, on_send: handle_send, on_send_comment: handle_send_comment, on_add_question: handle_add_question, on_view_file: handle_view_file, on_remove_file: handle_remove_file, on_accept: handle_accept, on_edit_message: handle_edit_message, on_delete_message: handle_delete_message, upload_file: handle_upload_file, on_dismiss: handle_dismiss, on_send_to_client: handle_send_to_client, on_send_back_issues: handle_send_back_issues, on_submit_decisions: handle_submit_decisions, on_update_content_item: handle_update_content_item, file_statuses: pipeline.file_statuses, classification_results: pipeline.classification_results, validation_results: pipeline.validation_results, file_manager: file_manager?.callbacks, on_replacement_files: handle_replacement_files, view_button_variant: view_button_variant, show_info_icon: show_info_icon, sent_back_resolved_ids: sent_back_resolved_ids, resolving: resolution_running.has(task.task_id), available_document_types: available_document_types, on_change_document_type: handle_change_document_type, keep_selections: keep_selections_effective, on_keep_change: handle_selection_change, on_reply_to_issue: handle_reply_to_issue }, task.task_id))), active_tab === 'review' && review_tasks.length > 0 && (_jsxs("div", { className: "flex items-center gap-3 pt-4", children: [_jsx("button", { className: "text-xs text-[#2563EB] hover:underline cursor-pointer", children: "Accept all passed" }), _jsx("button", { className: "text-xs text-[#2563EB] hover:underline cursor-pointer", children: "Send all issues" })] }))] })), active_tab === 'collected' && (_jsx(CollectedDataView, { data: data, classification_results: pipeline.classification_results, on_selection_change: handle_selection_change, on_export: on_export_data, on_view_file: handle_view_file, show_extracted_fields: show_extracted_fields, render_item_details: render_collected_item_details, document_types: available_document_types, locale: collected_data_locale, currency_code: collected_data_currency_code, truncate_chars: collected_data_truncate_chars, role: role, on_request_reextraction: on_request_reextraction }))] }), viewed_item && (_jsx(ThreadPdfSidePanel, { item: viewed_item, file_url: viewed_file_url, PdfViewer: pdf_viewer || null, on_close: handle_close_pdf }))] }), show_json && (_jsxs("div", { className: "fixed right-0 top-0 bottom-0 w-[500px] bg-white border-l shadow-lg z-50 flex flex-col", children: [_jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-b", children: [_jsx("span", { className: "text-sm font-medium", children: "JSON" }), _jsx("button", { onClick: () => set_show_json(false), className: "text-gray-400 hover:text-gray-600 cursor-pointer", children: "\u2715" })] }), _jsx("pre", { className: "flex-1 overflow-auto p-4 text-xs font-mono bg-gray-50", children: JSON.stringify(data, null, 2) })] })), _jsx(AddQuestionDialog, { open: show_add_question, on_close: () => set_show_add_question(false), on_add: handle_add_task, agent_id: current_user.id }), _jsx(AgentComposeDialog, { open: !!compose_context, context: compose_context || undefined, on_close: () => set_compose_context(null), on_send: handle_compose_send, agent_name: current_user.name })] }));
1408
+ }), on_toggle_complete: handle_toggle_complete, on_delete_task: handle_delete_task, on_approve_task: handle_approve_task, on_reopen_task: handle_reopen_task, on_rename_task: handle_rename_task, on_send: handle_send, on_send_comment: handle_send_comment, on_add_question: handle_add_question, on_view_file: handle_view_file, on_remove_file: handle_remove_file, on_accept: handle_accept, on_edit_message: handle_edit_message, on_delete_message: handle_delete_message, upload_file: handle_upload_file, on_dismiss: handle_dismiss, on_send_to_client: handle_send_to_client, on_send_back_issues: handle_send_back_issues, on_submit_decisions: handle_submit_decisions, on_update_content_item: handle_update_content_item, file_statuses: pipeline.file_statuses, classification_results: pipeline.classification_results, validation_results: pipeline.validation_results, file_manager: file_manager?.callbacks, on_replacement_files: handle_replacement_files, view_button_variant: view_button_variant, show_info_icon: show_info_icon, sent_back_resolved_ids: sent_back_resolved_ids, resolving: resolution_running.has(task.task_id), available_document_types: available_document_types, on_change_document_type: handle_change_document_type, keep_selections: keep_selections_effective, on_keep_change: handle_selection_change, on_reply_to_issue: handle_reply_to_issue }, task.task_id))), active_tab === 'review' && review_tasks.length > 0 && (_jsxs("div", { className: "flex items-center gap-3 pt-4", children: [_jsx("button", { className: "text-xs text-[#2563EB] hover:underline cursor-pointer", children: "Accept all passed" }), _jsx("button", { className: "text-xs text-[#2563EB] hover:underline cursor-pointer", children: "Send all issues" })] }))] })), active_tab === 'collected' && (_jsx(CollectedDataView, { data: data, classification_results: pipeline.classification_results, on_selection_change: handle_selection_change, on_export: on_export_data, on_view_file: handle_view_file, show_extracted_fields: show_extracted_fields, render_item_details: render_collected_item_details, document_types: available_document_types, locale: collected_data_locale, currency_code: collected_data_currency_code, truncate_chars: collected_data_truncate_chars, role: role, on_request_reextraction: on_request_reextraction, enable_export: enable_export, export_filename: export_filename, google_client_id: google_client_id, export_file_links: export_file_links, get_external_links: get_external_links }))] }), viewed_item && (_jsx(ThreadPdfSidePanel, { item: viewed_item, file_url: viewed_file_url, PdfViewer: pdf_viewer || null, on_close: handle_close_pdf }))] }), show_json && (_jsxs("div", { className: "fixed right-0 top-0 bottom-0 w-[500px] bg-white border-l shadow-lg z-50 flex flex-col", children: [_jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-b", children: [_jsx("span", { className: "text-sm font-medium", children: "JSON" }), _jsx("button", { onClick: () => set_show_json(false), className: "text-gray-400 hover:text-gray-600 cursor-pointer", children: "\u2715" })] }), _jsx("pre", { className: "flex-1 overflow-auto p-4 text-xs font-mono bg-gray-50", children: JSON.stringify(data, null, 2) })] })), _jsx(AddQuestionDialog, { open: show_add_question, on_close: () => set_show_add_question(false), on_add: handle_add_task, agent_id: current_user.id }), _jsx(AgentComposeDialog, { open: !!compose_context, context: compose_context || undefined, on_close: () => set_compose_context(null), on_send: handle_compose_send, agent_name: current_user.name })] }));
1409
1409
  });
1410
1410
  //# sourceMappingURL=thread_form.js.map