@rytass/bpm-core-react 0.15.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/README.md +54 -6
  3. package/dist/chunks/{FormBuilderView-CLg-JYmu.js → FormBuilderView-BYL42M0d.js} +13 -33
  4. package/dist/chunks/FormBuilderView-BYL42M0d.js.map +1 -0
  5. package/dist/chunks/FormBuilderView-aBcA-_tt.cjs +3 -0
  6. package/dist/chunks/FormBuilderView-aBcA-_tt.cjs.map +1 -0
  7. package/dist/chunks/FormRendererView-DRFi_IH7.cjs +4 -0
  8. package/dist/chunks/FormRendererView-DRFi_IH7.cjs.map +1 -0
  9. package/dist/chunks/{FormRendererView-DU9LLrOF.js → FormRendererView-cZGOOjU5.js} +319 -332
  10. package/dist/chunks/FormRendererView-cZGOOjU5.js.map +1 -0
  11. package/dist/chunks/{admin-pickers-DLlG_1du.js → admin-pickers-DxhzECkD.js} +52 -51
  12. package/dist/chunks/admin-pickers-DxhzECkD.js.map +1 -0
  13. package/dist/chunks/admin-pickers-qe3j--gX.cjs +2 -0
  14. package/dist/chunks/admin-pickers-qe3j--gX.cjs.map +1 -0
  15. package/dist/chunks/approval-instance-list-page-CPXMP3PL.js.map +1 -1
  16. package/dist/chunks/approval-instance-list-page-ax0pm8bt.cjs.map +1 -1
  17. package/dist/chunks/auth-provider-4BeCw7cI.cjs.map +1 -1
  18. package/dist/chunks/auth-provider-B5oPmvk2.js.map +1 -1
  19. package/dist/chunks/bpm-form-field-Bc6k4ZEO.cjs.map +1 -1
  20. package/dist/chunks/bpm-form-field-Cao0rMol.js.map +1 -1
  21. package/dist/chunks/{categories-DGlxuC6X.js → categories-1gKxeEqw.js} +4 -10
  22. package/dist/chunks/categories-1gKxeEqw.js.map +1 -0
  23. package/dist/chunks/{categories-Yid05WAX.cjs → categories-DjENouRm.cjs} +2 -2
  24. package/dist/chunks/categories-DjENouRm.cjs.map +1 -0
  25. package/dist/chunks/{compose-BtQPBd1Q.js → compose-Crklayzy.js} +4 -4
  26. package/dist/chunks/compose-Crklayzy.js.map +1 -0
  27. package/dist/chunks/{compose-DZhTQOt4.cjs → compose-DZ7RKvUp.cjs} +2 -2
  28. package/dist/chunks/compose-DZ7RKvUp.cjs.map +1 -0
  29. package/dist/chunks/dashboard-page-BWQBSGDq.cjs +2 -0
  30. package/dist/chunks/dashboard-page-BWQBSGDq.cjs.map +1 -0
  31. package/dist/chunks/{dashboard-page-CeCLV1tp.js → dashboard-page-DdBvV6YI.js} +15 -16
  32. package/dist/chunks/dashboard-page-DdBvV6YI.js.map +1 -0
  33. package/dist/chunks/delegations-Ckf03icM.cjs +2 -0
  34. package/dist/chunks/delegations-Ckf03icM.cjs.map +1 -0
  35. package/dist/chunks/{delegations-DRupxJ4_.js → delegations-MxF3uJGW.js} +205 -215
  36. package/dist/chunks/delegations-MxF3uJGW.js.map +1 -0
  37. package/dist/chunks/delegations-V9HIe3_P.cjs +2 -0
  38. package/dist/chunks/delegations-V9HIe3_P.cjs.map +1 -0
  39. package/dist/chunks/{delegations-B8gLSt0i.js → delegations-xUt1tj8d.js} +168 -173
  40. package/dist/chunks/delegations-xUt1tj8d.js.map +1 -0
  41. package/dist/chunks/{designer-CrbBRPUU.js → designer-D9eFma1W.js} +1180 -1134
  42. package/dist/chunks/designer-D9eFma1W.js.map +1 -0
  43. package/dist/chunks/designer-sJGTGYOf.cjs +65 -0
  44. package/dist/chunks/designer-sJGTGYOf.cjs.map +1 -0
  45. package/dist/chunks/detail-DRCTnuKm.cjs +2 -0
  46. package/dist/chunks/detail-DRCTnuKm.cjs.map +1 -0
  47. package/dist/chunks/{detail-_c21WQla.js → detail-DScLf42P.js} +849 -836
  48. package/dist/chunks/detail-DScLf42P.js.map +1 -0
  49. package/dist/chunks/format-date-time-CB-LxzqT.js.map +1 -1
  50. package/dist/chunks/format-date-time-D-cx5M8z.cjs.map +1 -1
  51. package/dist/chunks/format-member-label-DudVI55w.js +13 -0
  52. package/dist/chunks/format-member-label-DudVI55w.js.map +1 -0
  53. package/dist/chunks/format-member-label-t7ANTF62.cjs +2 -0
  54. package/dist/chunks/format-member-label-t7ANTF62.cjs.map +1 -0
  55. package/dist/chunks/login-AtVxZBsC.cjs.map +1 -1
  56. package/dist/chunks/login-C6qlTC6F.js.map +1 -1
  57. package/dist/chunks/notifications-Bc4mgSds.cjs.map +1 -1
  58. package/dist/chunks/notifications-DJ5wzCye.js.map +1 -1
  59. package/dist/chunks/{orgs-BpqVu5ka.js → orgs-CY0i1fie.js} +787 -766
  60. package/dist/chunks/orgs-CY0i1fie.js.map +1 -0
  61. package/dist/chunks/orgs-Dr0FFoZo.cjs +2 -0
  62. package/dist/chunks/orgs-Dr0FFoZo.cjs.map +1 -0
  63. package/dist/chunks/providers-DHtDZFNA.cjs.map +1 -1
  64. package/dist/chunks/providers-J5eyByQj.js.map +1 -1
  65. package/dist/chunks/router-adapter--gYs13E8.cjs.map +1 -1
  66. package/dist/chunks/router-adapter-DftlFTOd.js.map +1 -1
  67. package/dist/chunks/routes-config-C1j_vFKo.cjs.map +1 -1
  68. package/dist/chunks/routes-config-yZbESPlw.js.map +1 -1
  69. package/dist/chunks/task-node-label-BF6UllxP.cjs.map +1 -1
  70. package/dist/chunks/task-node-label-CWZgOBj0.js.map +1 -1
  71. package/dist/chunks/use-bpm-member-D57LKe_u.js.map +1 -1
  72. package/dist/chunks/use-bpm-member-DpNAQtNC.cjs.map +1 -1
  73. package/dist/chunks/users-BCyePbwB.js +422 -0
  74. package/dist/chunks/users-BCyePbwB.js.map +1 -0
  75. package/dist/chunks/users-DVBJluFR.cjs +2 -0
  76. package/dist/chunks/users-DVBJluFR.cjs.map +1 -0
  77. package/dist/index.cjs +1 -1
  78. package/dist/index.cjs.map +1 -1
  79. package/dist/index.js +2 -2
  80. package/dist/index.js.map +1 -1
  81. package/dist/lib/format-member-label.d.ts +12 -0
  82. package/dist/next/index.cjs.map +1 -1
  83. package/dist/next/index.js.map +1 -1
  84. package/dist/next/workflow-chat-route.cjs.map +1 -1
  85. package/dist/next/workflow-chat-route.js.map +1 -1
  86. package/dist/pages/admin/delegations/index.cjs +1 -1
  87. package/dist/pages/admin/delegations/index.cjs.map +1 -1
  88. package/dist/pages/admin/delegations/index.js +1 -1
  89. package/dist/pages/admin/delegations/index.js.map +1 -1
  90. package/dist/pages/admin/orgs/index.cjs +1 -1
  91. package/dist/pages/admin/orgs/index.cjs.map +1 -1
  92. package/dist/pages/admin/orgs/index.js +1 -1
  93. package/dist/pages/admin/orgs/index.js.map +1 -1
  94. package/dist/pages/admin/users/index.cjs +1 -1
  95. package/dist/pages/admin/users/index.cjs.map +1 -1
  96. package/dist/pages/admin/users/index.js +1 -1
  97. package/dist/pages/admin/users/index.js.map +1 -1
  98. package/dist/pages/admin/webhook-endpoints/index.cjs.map +1 -1
  99. package/dist/pages/admin/webhook-endpoints/index.js.map +1 -1
  100. package/dist/pages/cc/index.cjs.map +1 -1
  101. package/dist/pages/cc/index.js.map +1 -1
  102. package/dist/pages/dashboard/index.cjs.map +1 -1
  103. package/dist/pages/dashboard/index.js.map +1 -1
  104. package/dist/pages/delegations/index.cjs +1 -1
  105. package/dist/pages/delegations/index.cjs.map +1 -1
  106. package/dist/pages/delegations/index.js +1 -1
  107. package/dist/pages/delegations/index.js.map +1 -1
  108. package/dist/pages/inbox/index.cjs.map +1 -1
  109. package/dist/pages/inbox/index.js.map +1 -1
  110. package/dist/pages/instances/detail/index.cjs +1 -1
  111. package/dist/pages/instances/detail/index.cjs.map +1 -1
  112. package/dist/pages/instances/detail/index.js +1 -1
  113. package/dist/pages/instances/detail/index.js.map +1 -1
  114. package/dist/pages/instances/new/index.cjs.map +1 -1
  115. package/dist/pages/instances/new/index.js.map +1 -1
  116. package/dist/pages/login/index.cjs.map +1 -1
  117. package/dist/pages/login/index.js.map +1 -1
  118. package/dist/pages/root/index.cjs.map +1 -1
  119. package/dist/pages/root/index.js.map +1 -1
  120. package/dist/pages/search/index.cjs.map +1 -1
  121. package/dist/pages/search/index.js.map +1 -1
  122. package/dist/pages/sent/index.cjs.map +1 -1
  123. package/dist/pages/sent/index.js.map +1 -1
  124. package/dist/pages/settings/notifications/index.cjs.map +1 -1
  125. package/dist/pages/settings/notifications/index.js.map +1 -1
  126. package/dist/pages/templates/categories/index.cjs +1 -1
  127. package/dist/pages/templates/categories/index.cjs.map +1 -1
  128. package/dist/pages/templates/categories/index.js +1 -1
  129. package/dist/pages/templates/categories/index.js.map +1 -1
  130. package/dist/pages/templates/compose/index.cjs +1 -1
  131. package/dist/pages/templates/compose/index.cjs.map +1 -1
  132. package/dist/pages/templates/compose/index.js +1 -1
  133. package/dist/pages/templates/compose/index.js.map +1 -1
  134. package/dist/pages/templates/designer/index.cjs +1 -1
  135. package/dist/pages/templates/designer/index.cjs.map +1 -1
  136. package/dist/pages/templates/designer/index.js +1 -1
  137. package/dist/pages/templates/designer/index.js.map +1 -1
  138. package/dist/pages/templates/index.cjs.map +1 -1
  139. package/dist/pages/templates/index.js.map +1 -1
  140. package/dist/pages/templates/versions/index.cjs.map +1 -1
  141. package/dist/pages/templates/versions/index.js.map +1 -1
  142. package/dist/views/admin/delegations/index.cjs +1 -1
  143. package/dist/views/admin/delegations/index.js +1 -2
  144. package/dist/views/admin/index.cjs +1 -1
  145. package/dist/views/admin/index.js +3 -3
  146. package/dist/views/admin/orgs/index.cjs +1 -1
  147. package/dist/views/admin/orgs/index.js +1 -2
  148. package/dist/views/admin/users/MemberTaskReassignModal.d.ts +13 -0
  149. package/dist/views/admin/users/index.cjs +1 -1
  150. package/dist/views/admin/users/index.js +1 -2
  151. package/dist/views/admin/webhook-endpoints/index.cjs.map +1 -1
  152. package/dist/views/admin/webhook-endpoints/index.js.map +1 -1
  153. package/dist/views/cc/index.cjs.map +1 -1
  154. package/dist/views/cc/index.js.map +1 -1
  155. package/dist/views/dashboard/index.cjs +1 -1
  156. package/dist/views/dashboard/index.cjs.map +1 -1
  157. package/dist/views/dashboard/index.js +1 -1
  158. package/dist/views/dashboard/index.js.map +1 -1
  159. package/dist/views/delegations/index.cjs +1 -1
  160. package/dist/views/delegations/index.js +1 -2
  161. package/dist/views/forms/builder/index.cjs +1 -1
  162. package/dist/views/forms/builder/index.js +1 -2
  163. package/dist/views/forms/renderer/index.cjs +1 -1
  164. package/dist/views/forms/renderer/index.js +1 -2
  165. package/dist/views/inbox/index.cjs +1 -1
  166. package/dist/views/inbox/index.cjs.map +1 -1
  167. package/dist/views/inbox/index.js +1 -5
  168. package/dist/views/inbox/index.js.map +1 -1
  169. package/dist/views/instances/detail/index.cjs +1 -1
  170. package/dist/views/instances/detail/index.js +1 -2
  171. package/dist/views/instances/index.js +1 -2
  172. package/dist/views/instances/new/index.cjs +1 -1
  173. package/dist/views/instances/new/index.cjs.map +1 -1
  174. package/dist/views/instances/new/index.js +4 -11
  175. package/dist/views/instances/new/index.js.map +1 -1
  176. package/dist/views/login/index.js +1 -2
  177. package/dist/views/search/index.cjs.map +1 -1
  178. package/dist/views/search/index.js.map +1 -1
  179. package/dist/views/sent/index.cjs.map +1 -1
  180. package/dist/views/sent/index.js.map +1 -1
  181. package/dist/views/settings/index.js +1 -2
  182. package/dist/views/settings/notifications/index.js +1 -2
  183. package/dist/views/templates/categories/index.cjs +1 -1
  184. package/dist/views/templates/categories/index.js +1 -2
  185. package/dist/views/templates/compose/index.cjs +1 -1
  186. package/dist/views/templates/compose/index.js +1 -2
  187. package/dist/views/templates/designer/index.cjs +1 -1
  188. package/dist/views/templates/designer/index.js +1 -2
  189. package/dist/views/templates/index.cjs +1 -1
  190. package/dist/views/templates/index.cjs.map +1 -1
  191. package/dist/views/templates/index.js +1 -1
  192. package/dist/views/templates/index.js.map +1 -1
  193. package/dist/views/templates/versions/index.cjs.map +1 -1
  194. package/dist/views/templates/versions/index.js.map +1 -1
  195. package/package.json +5 -5
  196. package/dist/chunks/FormBuilderView-6bCbIkz6.cjs +0 -3
  197. package/dist/chunks/FormBuilderView-6bCbIkz6.cjs.map +0 -1
  198. package/dist/chunks/FormBuilderView-CLg-JYmu.js.map +0 -1
  199. package/dist/chunks/FormRendererView-DU9LLrOF.js.map +0 -1
  200. package/dist/chunks/FormRendererView-gctFIqwC.cjs +0 -4
  201. package/dist/chunks/FormRendererView-gctFIqwC.cjs.map +0 -1
  202. package/dist/chunks/admin-pickers-Btvij1at.cjs +0 -2
  203. package/dist/chunks/admin-pickers-Btvij1at.cjs.map +0 -1
  204. package/dist/chunks/admin-pickers-DLlG_1du.js.map +0 -1
  205. package/dist/chunks/categories-DGlxuC6X.js.map +0 -1
  206. package/dist/chunks/categories-Yid05WAX.cjs.map +0 -1
  207. package/dist/chunks/compose-BtQPBd1Q.js.map +0 -1
  208. package/dist/chunks/compose-DZhTQOt4.cjs.map +0 -1
  209. package/dist/chunks/dashboard-page-CeCLV1tp.js.map +0 -1
  210. package/dist/chunks/dashboard-page-DooFJsxM.cjs +0 -2
  211. package/dist/chunks/dashboard-page-DooFJsxM.cjs.map +0 -1
  212. package/dist/chunks/delegations-8LsxcQM4.cjs +0 -2
  213. package/dist/chunks/delegations-8LsxcQM4.cjs.map +0 -1
  214. package/dist/chunks/delegations-B8gLSt0i.js.map +0 -1
  215. package/dist/chunks/delegations-DRupxJ4_.js.map +0 -1
  216. package/dist/chunks/delegations-DlYwMiAW.cjs +0 -2
  217. package/dist/chunks/delegations-DlYwMiAW.cjs.map +0 -1
  218. package/dist/chunks/designer-CrbBRPUU.js.map +0 -1
  219. package/dist/chunks/designer-D3_lWmfa.cjs +0 -65
  220. package/dist/chunks/designer-D3_lWmfa.cjs.map +0 -1
  221. package/dist/chunks/detail-CVXb5Vy8.cjs +0 -2
  222. package/dist/chunks/detail-CVXb5Vy8.cjs.map +0 -1
  223. package/dist/chunks/detail-_c21WQla.js.map +0 -1
  224. package/dist/chunks/orgs-BpqVu5ka.js.map +0 -1
  225. package/dist/chunks/orgs-D0-5BaHT.cjs +0 -2
  226. package/dist/chunks/orgs-D0-5BaHT.cjs.map +0 -1
  227. package/dist/chunks/users-C9LA-Rd7.cjs +0 -2
  228. package/dist/chunks/users-C9LA-Rd7.cjs.map +0 -1
  229. package/dist/chunks/users-FWrb3ehW.js +0 -214
  230. package/dist/chunks/users-FWrb3ehW.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormBuilderView-BYL42M0d.js","names":["_Fragment","BPMFormField","Fragment$1","dynamic","EDITOR_FALLBACK_STYLE","JSON_EDITOR_EXTENSIONS","json","EditorView","CodeMirror","JsonCodeEditor","name","disabled","FIELD_TYPE_OPTIONS","AlignLeftIcon","FileIcon","CurrencyDollarIcon","CalendarIcon","CheckedIcon","ListIcon","DotGridIcon","CheckedOutlineIcon","FileAttachmentIcon","UserIcon","TABLE_COLUMN_TYPE_OPTIONS","isTableColumnFieldType","option","WORKSPACE_GRID_STYLE","CANVAS_COLUMN_STYLE","SETTINGS_COLUMN_STYLE","TYPE_MENU_MAX_HEIGHT","PARAMETER_TYPE_LABELS","LINT_MISSING_PARAMETER_PATTERN","LINT_UNKNOWN_PARAMETER_PATTERN","STACK_STYLE","FIELD_LIBRARY_STYLE","FIELD_LIBRARY_BUTTON_STYLE","FIELD_LIBRARY_HEADER_STYLE","FIELD_BLOCK_ROW_STYLE","FIELD_BLOCK_TEXT_STYLE","FIELD_BLOCK_ACTIONS_STYLE","FIELD_BLOCK_REQUIRED_STYLE","FIELD_BLOCK_STYLE","FIELD_BLOCK_DRAGGING_STYLE","FIELD_BLOCK_SELECTED_CARD_STYLE","EMPTY_CANVAS_STYLE","EMPTY_CANVAS_ACTIONS_STYLE","FIELD_SETTINGS_FORM_STYLE","FIELD_SETTINGS_SECTION_STYLE","FIELD_SETTINGS_SECTION_TITLE_STYLE","FIELD_SETTINGS_BADGE_ROW_STYLE","FIELD_SETTINGS_HINT_STYLE","FIELD_SETTINGS_ROW_STYLE","FIELD_SETTINGS_ROW_WIDE_STYLE","FIELD_SETTINGS_VALUE_STYLE","FIELD_SETTINGS_TEXTAREA_STYLE","ADVANCED_SCHEMA_FORM_STYLE","ADVANCED_SCHEMA_ROW_STYLE","ADVANCED_SCHEMA_VALUE_STYLE","ADVANCED_SCHEMA_MESSAGE_STYLE","CONDITION_RULE_CONTROL_STYLE","CONDITION_RULE_GRID_STYLE","DRAG_HANDLE_STYLE","WORKBENCH_STYLE","COMPACT_STACK_STYLE","OPTION_ACTIONS_STYLE","REQUIRED_ASTERISK_STYLE","DATA_SOURCE_SETTINGS_STYLE","DATA_SOURCE_LINT_RESULT_STYLE","DATA_SOURCE_PARAMETERS_STYLE","DATA_SOURCE_CHECK_ROW_STYLE","DATA_SOURCE_TRAIT_ROW_STYLE","DATA_SOURCE_SUMMARY_STYLE","TABLE_COLUMN_SETTINGS_STYLE","TABLE_COLUMNS_SECTION_STYLE","TABLE_COLUMNS_HEADER_STYLE","DATA_SOURCE_PARAMETER_NAME_STYLE","DATA_SOURCE_PARAMETER_CELL_STYLE","applyFullWidthTextareaHost","element","EMPTY_SCHEMA","EMPTY_UI_SCHEMA","STATIC_OPTION_SOURCE_ID","CONSTANT_BINDING_ID","ROW_FIELD_BINDING_PREFIX","UNBOUND_BINDING_ID","OPTION_SOURCE_KIND_OPTIONS","OPTION_MODE_OPTIONS","BOOLEAN_DEFAULT_OPTIONS","BOOLEAN_CONDITION_VALUE_OPTIONS","CONDITION_RULE_CONFIGS","FormBuilderView","initialSchema","value","initialUiSchema","schema","setSchema","useState","uiSchema","setUiSchema","schemaJsonText","setSchemaJsonText","stringifyJson","uiSchemaJsonText","setUiSchemaJsonText","previewValues","setPreviewValues","advancedSchemaMessage","setAdvancedSchemaMessage","activeTab","setActiveTab","selectedFieldKey","setSelectedFieldKey","dataSourceCatalog","setDataSourceCatalog","dataSourceCatalogError","setDataSourceCatalogError","dataSourceCatalogState","setDataSourceCatalogState","dataSourceLint","setDataSourceLint","dataSourceLintLoading","setDataSourceLintLoading","pendingBuilderConfirmation","setPendingBuilderConfirmation","selectedColumnIndex","setSelectedColumnIndex","useEffect","active","listFormDataSources","descriptors","field","buildFormRendererValues","currentValues","selectedField","useMemo","handleAddField","nextIndex","createFieldDefinition","type","handleTabChange","nextTab","activeKey","handleRemoveField","affectedFieldKeys","isTableFieldDefinition","isFormDataSourceFieldDefinition","column","readFormDataSourceFieldDependencyKeys","fieldKey","applyRemoveField","remainingFields","item","handleFieldDragEnd","destination","result","currentSchema","moveItemByIndex","currentUiSchema","updateSelectedField","patch","updateSelectedFieldWith","previousFieldKey","nextField","updater","nextFieldKey","updatedSchema","nextSchema","renameFormDataSourceFieldBindings","commitSelectedField","updateTableField","commitTableColumn","previousColumnKey","columnIndex","currentField","index","nextColumn","renameFormTableColumnBindings","handleAddTableColumn","createTableColumnDefinition","applyRemoveTableColumn","current","handleReorderTableColumns","fromIndex","toIndex","handleOptionModeChange","readFormFieldSelectionMode","mode","currentDefaultValue","defaultValue","requestDataSourceFieldChange","handleOptionSourceChange","optionId","baseField","descriptor","readDataSourceDescriptorOptionId","candidate","parameterKeys","parameter","nextBindings","binding","handleConfirmBuilderChange","applyBuilderConfirmation","confirmation","handleLintDataSourceSchema","lintFormSchema","readLintDisplayMessage","missing","line","readLintTargetLabel","readLintParameterLabel","unknown","readFormSchemaLintMessage","fieldIndex","fieldLabel","readLintColumn","parameterKey","target","reference","updatePreviewValues","values","updateFieldRequired","updateSchemaJson","updateUiSchemaJson","SectionGroup","Section","Tab","TabItem","renderDesignTab","renderPreviewTab","renderAdvancedTab","Modal","readBuilderConfirmationTitle","Typography","Button","DragDropContext","Droppable","droppableProvided","Draggable","renderFieldBlock","draggableProvided","snapshot","renderFieldSettings","renderMainFieldSettings","renderTableColumnsSection","renderAdvancedFieldSettings","Badge","readFieldTypeLabel","renderSettingsFormRow","Input","event","renderTypeSpecificSettings","isTextFieldDefinition","Toggle","removeFieldKey","Accordion","hasConditionRules","renderConditionSettings","renderTextFieldSettings","commit","isNumberFieldDefinition","renderNumberFieldSettings","isDateFieldDefinition","renderDateFieldSettings","isFormOptionFieldDefinition","renderOptionFieldSettings","requestChange","rowColumns","renderBooleanFieldSettings","renderFileUploadFieldSettings","isMemberFieldDefinition","renderMemberFieldSettings","renderTableFieldSettings","bounds","readFormTableRowBounds","renderNumberInput","FORM_TABLE_MAX_ROWS","PlusIcon","renderTableColumnsTable","columnRows","columns","row","readTableColumn","Select","handleTableColumnTypeChange","readSelectOption","actions","TrashIcon","expandedRowKey","Table","options","renderTableColumnSettings","expanded","nextType","convertTableColumnType","discarded","readDiscardedColumnSettings","readTableColumnTypeLabel","renderSettingsTextarea","readStringDefaultValue","renderDateValuePicker","compatibleDescriptors","readCompatibleFormDataSourceDescriptors","bindingScope","currentSourceId","currentDescriptor","currentDescriptorIsCompatible","sourceOptions","readDataSourceDescriptorOption","renderDataSourceFieldSettings","renderStaticOptionFieldSettings","unsupportedCurrentSource","isFormDataSourceDescriptorCompatible","renderDataSourceDescriptorSummary","renderDataSourceParameterTable","scope","message","readDataSourceTraits","Tag","trait","rows","renderDataSourceParameterBinding","readFormDataSourceBindingValueKind","readFormDataSourceBinding","renderDataSourceConstantEditor","readBindingHint","readCompatibleBindingCount","readCompatibleFormDataSourceBindingFields","readCompatibleFormTableColumnBindingFields","bindingId","readDataSourceBindingOptionId","rowFieldOptions","bindingOptions","handleDataSourceBindingChange","readParameterTypeLabel","kind","readBindingSourceLabel","compatibleFieldCount","from","source","renderDataSourceConstantControl","parameterType","readFormDataSourceBindingValue","updateDataSourceConstant","parseOptionalNumberInput","readDataSourceConstantInputValue","upsertFormDataSourceFieldBinding","readNextDataSourceBinding","defaultValues","readFieldOptionAsSelectOption","selectedValues","nextOptions","renderFieldOptionsTable","parseStringList","readStringListInput","conditionFieldOptions","schemaField","renderConditionRule","config","expression","parsedRule","parseConditionRule","parsedConditionField","conditionField","selectedConditionField","conditionFieldSelectOptions","readFieldAsConditionSelectOption","conditionOperatorOptions","readConditionOperatorOptions","selectedOperator","readDefaultConditionOperator","selectedValue","readDefaultConditionValue","enabled","unsupportedRule","updateSelectedConditionRule","buildConditionExpression","readConditionOperatorOption","renderConditionValueControl","nextValue","onChange","isSelectFieldDefinition","Textarea","clampOptionalNumber","DateTimePicker","formatDateTimePickerValue","readDatePickerValue","DatePicker","formatDatePickerValue","optionRows","updateFieldOption","createNextFieldOption","isDragging","BaseCard","renderFieldBlockContent","wide","FormFieldLayout","control","Icon","DotDragVerticalIcon","FormRenderer","renderAdvancedSchemaRow","readDefaultDataSourceConstant","DEFAULT_COLUMN_OPTIONS","isFormStaticOptionFieldDefinition","isDefaultColumnOptions","base","entryKey","key","targetIndex","readNextOptionValue","sourceItem","items","sourceIndex","destinationIndex","remainingItems"],"sources":["../../src/views/forms/builder/json-code-editor.tsx","../../src/views/forms/builder/FormBuilderView.tsx"],"sourcesContent":["'use client';\n\nimport { CSSProperties, ReactElement } from 'react';\nimport dynamic from 'next/dynamic';\nimport { json } from '@codemirror/lang-json';\nimport { EditorView } from '@codemirror/view';\nimport type { Extension, ReactCodeMirrorProps } from '@uiw/react-codemirror';\n\nconst EDITOR_FALLBACK_STYLE: CSSProperties = {\n alignItems: 'center',\n border: '1px solid var(--mzn-color-border-neutral)',\n borderRadius: 4,\n color: 'var(--mzn-color-text-neutral)',\n display: 'flex',\n minHeight: 160,\n padding: 12,\n width: '100%',\n};\n\nconst JSON_EDITOR_EXTENSIONS: readonly Extension[] = [\n json(),\n EditorView.lineWrapping,\n EditorView.theme({\n '&': {\n border: '1px solid var(--mzn-color-border-neutral)',\n borderRadius: '4px',\n fontSize: '13px',\n width: '100%',\n },\n '&.cm-focused': {\n outline: '1px solid var(--mzn-color-border-primary)',\n },\n '.cm-content': {\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace',\n minHeight: '100%',\n },\n '.cm-editor': {\n width: '100%',\n },\n '.cm-gutters': {\n borderRight: '1px solid var(--mzn-color-border-neutral)',\n },\n '.cm-scroller': {\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace',\n },\n }),\n];\n\nconst CodeMirror = dynamic<ReactCodeMirrorProps>(\n () => import('@uiw/react-codemirror'),\n {\n loading: (): ReactElement => (\n <div style={EDITOR_FALLBACK_STYLE}>載入 JSON 編輯器</div>\n ),\n ssr: false,\n },\n);\n\ninterface JsonCodeEditorProps {\n readonly disabled?: boolean;\n readonly height: string;\n readonly name: string;\n readonly onChange: (value: string) => void;\n readonly placeholder: string;\n readonly value: string;\n}\n\nexport function JsonCodeEditor({\n disabled = false,\n height,\n name,\n onChange,\n placeholder,\n value,\n}: JsonCodeEditorProps): ReactElement {\n return (\n <CodeMirror\n aria-label={name}\n basicSetup={{\n autocompletion: true,\n bracketMatching: true,\n closeBrackets: true,\n defaultKeymap: true,\n foldGutter: true,\n highlightActiveLine: true,\n highlightSelectionMatches: true,\n lineNumbers: true,\n syntaxHighlighting: true,\n }}\n editable={!disabled}\n extensions={[...JSON_EDITOR_EXTENSIONS]}\n height={height}\n indentWithTab={false}\n onChange={onChange}\n placeholder={placeholder}\n readOnly={disabled}\n theme=\"light\"\n value={value}\n width=\"100%\"\n />\n );\n}\n","'use client';\n\nimport {\n ChangeEvent,\n CSSProperties,\n Key,\n MouseEvent,\n ReactElement,\n ReactNode,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n DragDropContext,\n Draggable,\n DraggableProvided,\n Droppable,\n DropResult,\n} from '@hello-pangea/dnd';\nimport {\n Accordion,\n BaseCard,\n Badge,\n Button,\n DatePicker,\n DateTimePicker,\n Icon,\n Input,\n Modal,\n Section,\n SectionGroup,\n Select,\n Tab,\n TabItem,\n Table,\n Tag,\n Textarea,\n Toggle,\n Typography,\n} from '@mezzanine-ui/react';\nimport {\n AlignLeftIcon,\n CalendarIcon,\n CheckedIcon,\n CheckedOutlineIcon,\n CurrencyDollarIcon,\n DotDragVerticalIcon,\n DotGridIcon,\n FileAttachmentIcon,\n FileIcon,\n ListIcon,\n PlusIcon,\n TrashIcon,\n UserIcon,\n} from '@mezzanine-ui/icons';\nimport type { IconDefinition } from '@mezzanine-ui/icons';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport {\n BooleanFieldDefinition,\n DateFieldDefinition,\n FORM_TABLE_MAX_ROWS,\n FormDataSourceBinding,\n FormDataSourceOptionFieldDefinition,\n FileUploadFieldDefinition,\n FormDefinitionSchema,\n FormFieldDefinition,\n FormFieldOption,\n FormOptionFieldDefinition,\n FormStaticOptionFieldDefinition,\n FormUiSchema,\n MemberFieldDefinition,\n NumberFieldDefinition,\n TableColumnDefinition,\n TableFieldDefinition,\n TextFieldDefinition,\n isFormDataSourceFieldDefinition,\n isFormStaticOptionFieldDefinition,\n isFormOptionFieldDefinition,\n isMemberFieldDefinition,\n isTableColumnFieldType,\n isTableFieldDefinition,\n readFormFieldSelectionMode,\n} from '@rytass/bpm-core-shared/form';\nimport {\n createFieldDefinition,\n createTableColumnDefinition,\n isFormDataSourceDescriptorCompatible,\n lintFormSchema,\n listFormDataSources,\n readCompatibleFormDataSourceBindingFields,\n readCompatibleFormTableColumnBindingFields,\n readCompatibleFormDataSourceDescriptors,\n readFormDataSourceBinding,\n readFormDataSourceBindingValue,\n readFormSchemaLintMessage,\n readFormDataSourceBindingValueKind,\n readFormDataSourceFieldDependencyKeys,\n renameFormDataSourceFieldBindings,\n renameFormTableColumnBindings,\n upsertFormDataSourceFieldBinding,\n type FormDataSourceDescriptorRecord,\n type FormDataSourceParameterType,\n} from '@rytass/bpm-core-client/form';\nimport {\n buildConditionExpression,\n buildFormRendererValues,\n clampOptionalNumber,\n formatDatePickerValue,\n formatDateTimePickerValue,\n FormRendererValues,\n isDateFieldDefinition,\n isNumberFieldDefinition,\n isSelectFieldDefinition,\n parseConditionRule,\n parseOptionalNumberInput,\n readConditionOperatorOption,\n readConditionOperatorOptions,\n readDatePickerValue,\n readDefaultConditionOperator,\n readDefaultConditionValue,\n readFieldOptionAsSelectOption,\n readFormTableRowBounds,\n readSelectOption,\n} from '@rytass/bpm-core-client/form';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport { BPMFormField } from '../../../components/bpm-form-field';\nimport { FormRenderer } from '../renderer/FormRendererView';\nimport { JsonCodeEditor } from './json-code-editor';\n\ntype FieldType = FormFieldDefinition['type'];\ntype BuilderTabKey = 'design' | 'preview' | 'advanced';\ntype FieldOptionRow = Readonly<\n Record<string, unknown> & {\n index: number;\n key: string;\n label: string;\n value: string;\n }\n>;\n\ntype FieldTypeOption = Readonly<{\n description: string;\n icon: IconDefinition;\n label: string;\n type: FieldType;\n}>;\n\ntype TableColumnRow = Readonly<\n Record<string, unknown> & {\n fieldKey: string;\n index: number;\n key: string;\n label: string;\n type: TableColumnDefinition['type'];\n }\n>;\n\ntype ConditionRuleTarget = 'readonlyWhen' | 'requiredWhen' | 'visibleWhen';\n\ntype ConditionRuleConfig = Readonly<{\n label: string;\n name: string;\n supportingText: string;\n target: ConditionRuleTarget;\n}>;\n\ntype DataSourceCatalogState = 'loading' | 'ready' | 'unavailable';\ntype FormDataSourceConstantValue = string | number | boolean | null;\n\n/**\n * How a settings renderer hands back an edited field. Passing the whole next\n * field (rather than a patch) keeps one signature for every field type, and\n * lets the same renderer serve a top-level field or a table column — the caller\n * decides where the result is written (ADR 16 §3.9).\n */\ntype FieldCommit<TField extends FormFieldDefinition> = (nextField: TField) => void;\n\n/**\n * A change that needs confirmation before it touches the schema, because it can\n * invalidate existing options, bindings or default values.\n */\ntype OptionFieldChangeRequester = (\n field: FormOptionFieldDefinition,\n nextField: FormOptionFieldDefinition,\n impact?: string,\n) => void;\n\n/**\n * Where an edited DataSource binding is written back, and which sibling columns\n * a `ROW_FIELD` binding may address. `rowColumns` is present only for a table\n * column — at the top level there is no row to read from (ADR 16 §3.4).\n */\ntype DataSourceBindingScope = Readonly<{\n commit: (nextField: FormDataSourceOptionFieldDefinition) => void;\n rowColumns?: readonly TableColumnDefinition[];\n}>;\n\ntype PendingBuilderConfirmation =\n | Readonly<{\n affectedFieldKeys: readonly string[];\n kind: 'remove-field';\n fieldKey: string;\n }>\n | Readonly<{\n fieldKey: string;\n impact: string;\n kind: 'replace-field';\n nextField: FormFieldDefinition;\n }>\n | Readonly<{\n columnIndex: number;\n columnKey: string;\n fieldKey: string;\n kind: 'remove-column';\n }>\n | Readonly<{\n columnIndex: number;\n columnKey: string;\n fieldKey: string;\n impact: string;\n kind: 'replace-column';\n nextColumn: TableColumnDefinition;\n }>;\n\nconst FIELD_TYPE_OPTIONS: readonly FieldTypeOption[] = [\n {\n description: '單行文字、姓名、編號',\n icon: AlignLeftIcon,\n label: '文字',\n type: 'text',\n },\n {\n description: '多行補充內容',\n icon: FileIcon,\n label: '長文字',\n type: 'textarea',\n },\n {\n description: '金額、數量、分數',\n icon: CurrencyDollarIcon,\n label: '數字',\n type: 'number',\n },\n {\n description: '金額與費用',\n icon: CurrencyDollarIcon,\n label: '金額',\n type: 'money',\n },\n {\n description: '日期或到期日',\n icon: CalendarIcon,\n label: '日期',\n type: 'date',\n },\n {\n description: '日期與時間',\n icon: CalendarIcon,\n label: '日期時間',\n type: 'datetime',\n },\n {\n description: '是 / 否狀態',\n icon: CheckedIcon,\n label: '開關',\n type: 'boolean',\n },\n {\n description: '固定選項擇一',\n icon: ListIcon,\n label: '下拉選單',\n type: 'select',\n },\n {\n description: '可搜尋的固定選項',\n icon: ListIcon,\n label: '自動完成',\n type: 'autocomplete',\n },\n {\n description: '固定選項單選',\n icon: DotGridIcon,\n label: '單選',\n type: 'radio',\n },\n {\n description: '固定選項複選',\n icon: CheckedOutlineIcon,\n label: '複選',\n type: 'checkbox',\n },\n {\n description: '附件或佐證資料',\n icon: FileAttachmentIcon,\n label: '附件',\n type: 'file_upload',\n },\n {\n description: '從成員名單挑選一或多位人員',\n icon: UserIcon,\n label: '人員選擇',\n type: 'member',\n },\n {\n description: '多列多欄明細',\n icon: DotGridIcon,\n label: '表格',\n type: 'table',\n },\n];\n\n/**\n * Column types a table accepts (ADR 16 §3.10). `textarea`, `radio`, `checkbox`,\n * `file_upload` and a nested `table` are excluded, so the picker is built from\n * the field library minus those rather than from a second hand-kept list.\n */\nconst TABLE_COLUMN_TYPE_OPTIONS: readonly {\n readonly id: TableColumnDefinition['type'];\n readonly name: string;\n}[] = FIELD_TYPE_OPTIONS.filter((option) =>\n isTableColumnFieldType(option.type),\n).map((option) => ({\n id: option.type as TableColumnDefinition['type'],\n name: option.label,\n}));\n\nconst WORKSPACE_GRID_STYLE: CSSProperties = {\n alignItems: 'start',\n display: 'flex',\n flexWrap: 'wrap',\n gap: 16,\n};\n\nconst CANVAS_COLUMN_STYLE: CSSProperties = {\n flex: '0.55 1 300px',\n minWidth: 0,\n};\n\n// Mezzanine's dropdown always opens downward — its Popper carries no flip or\n// shift middleware — so a select sitting at the very bottom of the page has its\n// menu clipped by the viewport with no way to scroll to it. Reserving room\n// below the settings column lets the page scroll far enough that the menu of\n// the last control still fits (see `TYPE_MENU_MAX_HEIGHT`).\nconst SETTINGS_COLUMN_TRAILING_SPACE = 260;\n\nconst SETTINGS_COLUMN_STYLE: CSSProperties = {\n flex: '1.45 1 720px',\n minWidth: 620,\n paddingBottom: SETTINGS_COLUMN_TRAILING_SPACE,\n};\n\n// Kept under the reserved space above so the whole menu fits once the page is\n// scrolled to the end.\nconst TYPE_MENU_MAX_HEIGHT = 240;\n\nconst PARAMETER_TYPE_LABELS: Readonly<\n Record<FormDataSourceDescriptorRecord['parameters'][number]['type'], string>\n> = {\n BOOLEAN: '開關',\n NUMBER: '數字',\n STRING: '文字或選單',\n STRING_ARRAY: '多選',\n};\n\nconst LINT_MISSING_PARAMETER_PATTERN =\n /^schema\\.fields\\[(\\d+)\\](?:\\.columns\\[(\\d+)\\])?\\.dataSource\\.bindings missing required parameter: (.+)$/u;\n\nconst LINT_UNKNOWN_PARAMETER_PATTERN =\n /^schema\\.fields\\[(\\d+)\\](?:\\.columns\\[(\\d+)\\])?\\.dataSource\\.bindings unknown parameter: (.+)$/u;\n\nconst STACK_STYLE: CSSProperties = {\n display: 'grid',\n gap: 12,\n};\n\nconst FIELD_LIBRARY_STYLE: CSSProperties = {\n display: 'flex',\n flexWrap: 'wrap',\n gap: 6,\n};\n\nconst FIELD_LIBRARY_BUTTON_STYLE: CSSProperties = {\n flex: '0 0 auto',\n whiteSpace: 'nowrap',\n};\n\nconst FIELD_LIBRARY_HEADER_STYLE: CSSProperties = {\n display: 'grid',\n gap: 8,\n};\n\nconst FIELD_BLOCK_ROW_STYLE: CSSProperties = {\n alignItems: 'center',\n cursor: 'grab',\n display: 'flex',\n gap: 12,\n touchAction: 'none',\n};\n\nconst FIELD_BLOCK_TEXT_STYLE: CSSProperties = {\n display: 'grid',\n flex: '1 1 auto',\n gap: 2,\n minWidth: 0,\n};\n\nconst FIELD_BLOCK_ACTIONS_STYLE: CSSProperties = {\n alignItems: 'center',\n display: 'flex',\n flex: '0 0 auto',\n gap: 4,\n};\n\nconst FIELD_BLOCK_REQUIRED_STYLE: CSSProperties = {\n alignItems: 'center',\n display: 'flex',\n gap: 6,\n};\n\nconst FIELD_BLOCK_STYLE: CSSProperties = {\n cursor: 'pointer',\n userSelect: 'none',\n};\n\nconst FIELD_BLOCK_DRAGGING_STYLE: CSSProperties = {\n filter: 'drop-shadow(0 8px 18px rgba(0, 0, 0, 0.12))',\n};\n\n// Selected field: tint the whole card with a light brand fill over the surface\n// so the active row is obvious without relying on the (removed) edit button.\nconst FIELD_BLOCK_SELECTED_CARD_STYLE: CSSProperties = {\n backgroundColor:\n 'color-mix(in srgb, var(--mzn-color-primary) 8%, var(--mzn-color-bg-surface))',\n boxShadow: 'inset 0 0 0 1px var(--mzn-color-border-primary)',\n};\n\nconst EMPTY_CANVAS_STYLE: CSSProperties = {\n alignItems: 'center',\n border: '1px dashed var(--mzn-color-border-neutral)',\n borderRadius: 6,\n display: 'grid',\n gap: 12,\n minHeight: 240,\n padding: 32,\n textAlign: 'center',\n};\n\nconst EMPTY_CANVAS_ACTIONS_STYLE: CSSProperties = {\n display: 'flex',\n gap: 8,\n justifyContent: 'center',\n};\n\nconst FIELD_SETTINGS_FORM_STYLE: CSSProperties = {\n display: 'grid',\n gap: 14,\n};\n\n// `auto-fit` alone spread these settings across six columns on a wide screen,\n// so a label and its input could sit 1,500px apart while the text inputs were\n// squeezed narrower than their own placeholder. Two columns is the readable\n// shape; rows that need the full width opt in with `gridColumn: 1 / -1`.\nconst FIELD_SETTINGS_SECTION_STYLE: CSSProperties = {\n display: 'grid',\n columnGap: 16,\n gridTemplateColumns: 'repeat(auto-fit, minmax(280px, 360px))',\n justifyContent: 'start',\n maxWidth: 736,\n rowGap: 8,\n};\n\nconst FIELD_SETTINGS_SECTION_TITLE_STYLE: CSSProperties = {\n gridColumn: '1 / -1',\n};\n\nconst FIELD_SETTINGS_BADGE_ROW_STYLE: CSSProperties = {\n alignItems: 'center',\n display: 'flex',\n gap: 8,\n gridColumn: '1 / -1',\n justifyContent: 'flex-end',\n};\n\nconst FIELD_SETTINGS_HINT_STYLE: CSSProperties = {\n gridColumn: '1 / -1',\n};\n\nconst FIELD_SETTINGS_ROW_STYLE: CSSProperties = {\n alignItems: 'start',\n display: 'block',\n width: '100%',\n};\n\nconst FIELD_SETTINGS_ROW_WIDE_STYLE: CSSProperties = {\n ...FIELD_SETTINGS_ROW_STYLE,\n gridColumn: '1 / -1',\n};\n\nconst FIELD_SETTINGS_VALUE_STYLE: CSSProperties = {\n minWidth: 0,\n width: '100%',\n};\n\nconst FIELD_SETTINGS_TEXTAREA_STYLE: CSSProperties = {\n minWidth: '100%',\n width: '100%',\n};\n\nconst ADVANCED_SCHEMA_FORM_STYLE: CSSProperties = {\n display: 'grid',\n gap: 14,\n};\n\nconst ADVANCED_SCHEMA_ROW_STYLE: CSSProperties = {\n alignItems: 'start',\n display: 'block',\n width: '100%',\n};\n\nconst ADVANCED_SCHEMA_VALUE_STYLE: CSSProperties = {\n minWidth: 0,\n width: '100%',\n};\n\nconst ADVANCED_SCHEMA_MESSAGE_STYLE: CSSProperties = {\n gridColumn: '2 / -1',\n};\n\nconst CONDITION_RULE_CONTROL_STYLE: CSSProperties = {\n display: 'grid',\n gap: 10,\n width: '100%',\n};\n\nconst CONDITION_RULE_GRID_STYLE: CSSProperties = {\n display: 'grid',\n gap: 8,\n gridTemplateColumns: 'repeat(auto-fit, minmax(160px, 1fr))',\n};\n\nconst DRAG_HANDLE_STYLE: CSSProperties = {\n display: 'inline-flex',\n};\n\nconst WORKBENCH_STYLE: CSSProperties = {\n display: 'grid',\n gap: 16,\n};\n\nconst COMPACT_STACK_STYLE: CSSProperties = {\n display: 'grid',\n gap: 8,\n};\n\nconst OPTION_ACTIONS_STYLE: CSSProperties = {\n display: 'flex',\n justifyContent: 'flex-end',\n};\n\nconst REQUIRED_ASTERISK_STYLE: CSSProperties = {\n color: 'var(--mzn-color-text-error)',\n fontSize: '0.72em',\n lineHeight: 0,\n marginLeft: 2,\n verticalAlign: 'super',\n};\n\nconst DATA_SOURCE_SETTINGS_STYLE: CSSProperties = {\n display: 'grid',\n gap: 10,\n gridColumn: '1 / -1',\n};\n\nconst DATA_SOURCE_LINT_RESULT_STYLE: CSSProperties = {\n display: 'grid',\n gap: 2,\n};\n\nconst DATA_SOURCE_PARAMETERS_STYLE: CSSProperties = {\n display: 'grid',\n gap: 8,\n};\n\n// Left-aligned with the settings it checks, rather than pushed to the far edge\n// of a panel whose other end holds the thing being checked.\nconst DATA_SOURCE_CHECK_ROW_STYLE: CSSProperties = {\n display: 'flex',\n justifyContent: 'flex-start',\n};\n\nconst DATA_SOURCE_TRAIT_ROW_STYLE: CSSProperties = {\n display: 'flex',\n flexWrap: 'wrap',\n gap: 4,\n};\n\nconst DATA_SOURCE_SUMMARY_STYLE: CSSProperties = {\n backgroundColor: 'var(--mzn-color-bg-surface-secondary)',\n borderRadius: 6,\n display: 'grid',\n gap: 4,\n padding: 10,\n};\n\n// The settings of the column being edited render inside that column's own row,\n// so the panel needs no heading of its own to say which column it belongs to.\n// Nested under its own row, so it stays a single readable column instead of\n// competing with the two-column grid above it.\nconst TABLE_COLUMN_SETTINGS_STYLE: CSSProperties = {\n ...FIELD_SETTINGS_SECTION_STYLE,\n gridTemplateColumns: 'minmax(280px, 520px)',\n padding: '4px 0 8px',\n};\n\nconst TABLE_COLUMNS_SECTION_STYLE: CSSProperties = {\n display: 'grid',\n gap: 8,\n gridColumn: '1 / -1',\n};\n\nconst TABLE_COLUMNS_HEADER_STYLE: CSSProperties = {\n alignItems: 'center',\n display: 'flex',\n gap: 12,\n justifyContent: 'space-between',\n};\n\n// One line: the name with a danger asterisk after it, rather than the name\n// above a word that says the same thing.\nconst DATA_SOURCE_PARAMETER_NAME_STYLE: CSSProperties = {\n alignItems: 'baseline',\n display: 'flex',\n gap: 2,\n};\n\nconst DATA_SOURCE_PARAMETER_CELL_STYLE: CSSProperties = {\n display: 'grid',\n gap: 4,\n};\n\nfunction applyFullWidthTextareaHost(element: HTMLDivElement | null): void {\n if (!element) {\n return;\n }\n\n element.style.width = '100%';\n}\n\nconst EMPTY_SCHEMA: FormDefinitionSchema = {\n fields: [],\n schemaVersion: 1,\n};\n\nconst EMPTY_UI_SCHEMA: FormUiSchema = {\n layout: [],\n schemaVersion: 1,\n};\n\nconst STATIC_OPTION_SOURCE_ID = '__STATIC_OPTIONS__';\nconst CONSTANT_BINDING_ID = '__CONSTANT__';\nconst ROW_FIELD_BINDING_PREFIX = '__ROW_FIELD__:';\nconst UNBOUND_BINDING_ID = '__UNBOUND__';\n\nconst OPTION_SOURCE_KIND_OPTIONS: readonly {\n readonly id: string;\n readonly name: string;\n}[] = [\n { id: STATIC_OPTION_SOURCE_ID, name: '靜態選項' },\n];\n\nconst OPTION_MODE_OPTIONS: readonly {\n readonly id: 'multiple' | 'single';\n readonly name: string;\n}[] = [\n { id: 'single', name: '單選' },\n { id: 'multiple', name: '複選' },\n];\n\nconst BOOLEAN_DEFAULT_OPTIONS: readonly {\n readonly id: string;\n readonly name: string;\n}[] = [\n { id: 'unset', name: '不預設' },\n { id: 'true', name: '是' },\n { id: 'false', name: '否' },\n];\n\nconst BOOLEAN_CONDITION_VALUE_OPTIONS: readonly {\n readonly id: string;\n readonly name: string;\n}[] = [\n { id: 'true', name: '是' },\n { id: 'false', name: '否' },\n];\n\nconst CONDITION_RULE_CONFIGS: readonly ConditionRuleConfig[] = [\n {\n label: '顯示',\n name: 'fieldVisibleWhen',\n supportingText: '符合條件時才顯示這個欄位。',\n target: 'visibleWhen',\n },\n {\n label: '必填',\n name: 'fieldRequiredWhen',\n supportingText: '符合條件時才要求填寫這個欄位。',\n target: 'requiredWhen',\n },\n {\n label: '唯讀',\n name: 'fieldReadonlyWhen',\n supportingText: '符合條件時不允許修改這個欄位。',\n target: 'readonlyWhen',\n },\n];\n\nexport interface FormBuilderViewProps {\n /**\n * Initial (or controlled) schema value.\n * If omitted, the builder starts with empty schema / uiSchema.\n */\n readonly value?: {\n readonly schema: FormDefinitionSchema;\n readonly uiSchema: FormUiSchema;\n };\n\n /** Called whenever the schema or uiSchema changes. */\n readonly onChange?: (next: {\n readonly schema: FormDefinitionSchema;\n readonly uiSchema: FormUiSchema;\n }) => void;\n}\n\nexport function FormBuilderView({\n onChange,\n value,\n}: FormBuilderViewProps): ReactElement {\n const initialSchema = value?.schema ?? EMPTY_SCHEMA;\n const initialUiSchema = value?.uiSchema ?? EMPTY_UI_SCHEMA;\n const [schema, setSchema] = useState<FormDefinitionSchema>(initialSchema);\n const [uiSchema, setUiSchema] = useState<FormUiSchema>(initialUiSchema);\n const [schemaJsonText, setSchemaJsonText] = useState(\n stringifyJson(initialSchema),\n );\n const [uiSchemaJsonText, setUiSchemaJsonText] = useState(\n stringifyJson(initialUiSchema),\n );\n const [previewValues, setPreviewValues] = useState<FormRendererValues>({});\n const [advancedSchemaMessage, setAdvancedSchemaMessage] = useState<\n string | null\n >(null);\n const [activeTab, setActiveTab] = useState<BuilderTabKey>('design');\n const [selectedFieldKey, setSelectedFieldKey] = useState<string | null>(null);\n const [dataSourceCatalog, setDataSourceCatalog] = useState<\n readonly FormDataSourceDescriptorRecord[]\n >([]);\n const [dataSourceCatalogError, setDataSourceCatalogError] = useState<\n string | null\n >(null);\n const [dataSourceCatalogState, setDataSourceCatalogState] =\n useState<DataSourceCatalogState>('loading');\n const [dataSourceLint, setDataSourceLint] = useState<\n readonly string[] | null\n >(null);\n const [dataSourceLintLoading, setDataSourceLintLoading] = useState(false);\n const [pendingBuilderConfirmation, setPendingBuilderConfirmation] =\n useState<PendingBuilderConfirmation | null>(null);\n // By index, not by key: two columns can share a key mid-edit, and looking the\n // selection up by key would then follow the wrong row — unmounting the very\n // input being typed into, since the key is edited inside the expanded row.\n const [selectedColumnIndex, setSelectedColumnIndex] = useState<number | null>(\n null,\n );\n\n useEffect((): (() => void) => {\n let active = true;\n\n void listFormDataSources()\n .then((descriptors): void => {\n if (!active) {\n return;\n }\n\n setDataSourceCatalog(descriptors);\n setDataSourceCatalogError(null);\n setDataSourceCatalogState('ready');\n })\n .catch((requestError: unknown): void => {\n if (!active) {\n return;\n }\n\n setDataSourceCatalog([]);\n void requestError;\n setDataSourceCatalogError('目前無法載入 DataSource Catalog,請稍後重試。');\n setDataSourceCatalogState('unavailable');\n });\n\n return (): void => {\n active = false;\n };\n }, []);\n useEffect((): void => {\n const hasSelectedField = schema.fields.some(\n (field) => field.fieldKey === selectedFieldKey,\n );\n\n if (hasSelectedField) {\n return;\n }\n\n setSelectedFieldKey(schema.fields[0]?.fieldKey ?? null);\n }, [schema.fields, selectedFieldKey]);\n\n useEffect((): void => {\n setPreviewValues((currentValues) =>\n buildFormRendererValues(schema.fields, currentValues),\n );\n }, [schema.fields]);\n\n useEffect((): void => {\n if (activeTab === 'advanced') {\n return;\n }\n\n setSchemaJsonText(stringifyJson(schema));\n setUiSchemaJsonText(stringifyJson(uiSchema));\n }, [activeTab, schema, uiSchema]);\n\n const selectedField = useMemo(\n (): FormFieldDefinition | null =>\n schema.fields.find((field) => field.fieldKey === selectedFieldKey) ??\n schema.fields[0] ??\n null,\n [schema.fields, selectedFieldKey],\n );\n useEffect((): void => {\n onChange?.({ schema, uiSchema });\n }, [schema, uiSchema]);\n\n function handleAddField(type: FieldType): void {\n const nextIndex = schema.fields.length + 1;\n const field = createFieldDefinition(type, nextIndex);\n\n setSchema({\n ...schema,\n fields: [...schema.fields, field],\n });\n setUiSchema({\n ...uiSchema,\n layout: [\n ...uiSchema.layout,\n {\n fieldKey: field.fieldKey,\n // A table must be FULL width or the publish lint rejects it\n // (ADR 16 §3.7).\n width:\n type === 'textarea' || type === 'file_upload' || type === 'table'\n ? 'FULL'\n : 'HALF',\n },\n ],\n });\n setSelectedFieldKey(field.fieldKey);\n setActiveTab('design');\n setAdvancedSchemaMessage(null);\n }\n\n function handleTabChange(activeKey: Key): void {\n const nextTab = activeKey as BuilderTabKey;\n\n if (nextTab === 'advanced' && activeTab !== 'advanced') {\n setSchemaJsonText(stringifyJson(schema));\n setUiSchemaJsonText(stringifyJson(uiSchema));\n }\n\n setActiveTab(nextTab);\n }\n\n function handleRemoveField(fieldKey: string): void {\n // Table columns can bind to a top-level field too, so the impact list has\n // to descend into them — otherwise deleting the field leaves a dangling\n // binding that only surfaces at publish time (ADR 16 §3.4).\n const affectedFieldKeys = schema.fields.flatMap((field) => {\n if (isTableFieldDefinition(field)) {\n return field.columns.flatMap((column) =>\n isFormDataSourceFieldDefinition(column) &&\n readFormDataSourceFieldDependencyKeys(column).includes(fieldKey)\n ? [`${field.fieldKey}.${column.fieldKey}`]\n : [],\n );\n }\n\n return isFormDataSourceFieldDefinition(field) &&\n readFormDataSourceFieldDependencyKeys(field).includes(fieldKey)\n ? [field.fieldKey]\n : [];\n });\n\n if (affectedFieldKeys.length > 0) {\n setPendingBuilderConfirmation({\n affectedFieldKeys,\n fieldKey,\n kind: 'remove-field',\n });\n\n return;\n }\n\n applyRemoveField(fieldKey);\n }\n\n function applyRemoveField(fieldKey: string): void {\n const remainingFields = schema.fields.filter(\n (field) => field.fieldKey !== fieldKey,\n );\n\n setSchema({\n ...schema,\n fields: remainingFields,\n });\n setUiSchema({\n ...uiSchema,\n layout: uiSchema.layout.filter((item) => item.fieldKey !== fieldKey),\n });\n setSelectedFieldKey(\n selectedFieldKey === fieldKey\n ? (remainingFields[0]?.fieldKey ?? null)\n : selectedFieldKey,\n );\n setAdvancedSchemaMessage(null);\n setDataSourceLint(null);\n }\n\n function handleFieldDragEnd(result: DropResult): void {\n const destination = result.destination;\n\n if (!destination) {\n return;\n }\n\n if (result.source.index === destination.index) {\n return;\n }\n\n setSchema((currentSchema) => ({\n ...currentSchema,\n fields: moveItemByIndex(\n currentSchema.fields,\n result.source.index,\n destination.index,\n ),\n }));\n setUiSchema((currentUiSchema) => ({\n ...currentUiSchema,\n layout: moveItemByIndex(\n currentUiSchema.layout,\n result.source.index,\n destination.index,\n ),\n }));\n setAdvancedSchemaMessage(null);\n }\n\n function updateSelectedField(\n patch: Partial<\n Pick<\n FormFieldDefinition,\n | 'defaultValue'\n | 'fieldKey'\n | 'label'\n | 'placeholder'\n | 'readonlyWhen'\n | 'required'\n | 'requiredWhen'\n | 'visibleWhen'\n >\n >,\n ): void {\n updateSelectedFieldWith(\n (field) => ({ ...field, ...patch }) as FormFieldDefinition,\n );\n }\n\n function updateSelectedFieldWith(\n updater: (field: FormFieldDefinition) => FormFieldDefinition,\n ): void {\n if (!selectedField) {\n return;\n }\n\n const previousFieldKey = selectedField.fieldKey;\n const nextField = updater(selectedField);\n const nextFieldKey = nextField.fieldKey;\n\n const updatedSchema = {\n ...schema,\n fields: schema.fields.map(\n (field): FormFieldDefinition =>\n field.fieldKey === previousFieldKey ? nextField : field,\n ),\n };\n const nextSchema =\n previousFieldKey === nextFieldKey\n ? updatedSchema\n : renameFormDataSourceFieldBindings(\n updatedSchema,\n previousFieldKey,\n nextFieldKey,\n );\n\n setSchema(nextSchema);\n setUiSchema({\n ...uiSchema,\n layout: uiSchema.layout.map((item) =>\n item.fieldKey === previousFieldKey\n ? { ...item, fieldKey: nextFieldKey }\n : item,\n ),\n });\n setSelectedFieldKey(nextFieldKey);\n setAdvancedSchemaMessage(null);\n setDataSourceLint(null);\n }\n\n /**\n * Commits a whole replacement field. Every type-specific settings renderer\n * takes a committer like this instead of closing over the selected field, so\n * one implementation can serve both a top-level field and a table column\n * (ADR 16 §3.9).\n */\n function commitSelectedField(nextField: FormFieldDefinition): void {\n updateSelectedFieldWith((): FormFieldDefinition => nextField);\n }\n\n function updateTableField(\n fieldKey: string,\n updater: (field: TableFieldDefinition) => TableFieldDefinition,\n ): void {\n setSchema((currentSchema) => ({\n ...currentSchema,\n fields: currentSchema.fields.map(\n (field): FormFieldDefinition =>\n field.fieldKey === fieldKey && isTableFieldDefinition(field)\n ? updater(field)\n : field,\n ),\n }));\n setAdvancedSchemaMessage(null);\n setDataSourceLint(null);\n }\n\n /**\n * Writes an edited column back into its table. Renaming a column key rewrites\n * the sibling `ROW_FIELD` bindings that address it, exactly as a top-level\n * key rename rewrites `FIELD` bindings (ADR 16 §3.9).\n */\n function commitTableColumn(\n field: TableFieldDefinition,\n columnIndex: number,\n nextColumn: TableColumnDefinition,\n ): void {\n const previousColumnKey = field.columns[columnIndex]?.fieldKey;\n\n updateTableField(field.fieldKey, (currentField) => {\n const nextField: TableFieldDefinition = {\n ...currentField,\n columns: currentField.columns.map((column, index) =>\n index === columnIndex ? nextColumn : column,\n ),\n };\n\n return typeof previousColumnKey === 'string' &&\n previousColumnKey !== nextColumn.fieldKey\n ? renameFormTableColumnBindings(\n nextField,\n previousColumnKey,\n nextColumn.fieldKey,\n )\n : nextField;\n });\n\n }\n\n function handleAddTableColumn(field: TableFieldDefinition): void {\n const column = createTableColumnDefinition(field.columns, 'text');\n\n updateTableField(field.fieldKey, (currentField) => ({\n ...currentField,\n columns: [...currentField.columns, column],\n }));\n setSelectedColumnIndex(field.columns.length);\n }\n\n /**\n * By index, not by key: two columns can share a key mid-edit (the publish\n * lint catches that later), and filtering by key would delete both.\n */\n function applyRemoveTableColumn(fieldKey: string, columnIndex: number): void {\n updateTableField(fieldKey, (currentField) => ({\n ...currentField,\n columns: currentField.columns.filter((_, index) => index !== columnIndex),\n }));\n // Removing the open column leaves its neighbour open rather than closing\n // everything, so the panel does not collapse under the designer.\n setSelectedColumnIndex((current) =>\n current === null || current < columnIndex\n ? current\n : current === columnIndex\n ? null\n : current - 1,\n );\n }\n\n function handleReorderTableColumns(\n field: TableFieldDefinition,\n fromIndex: number,\n toIndex: number,\n ): void {\n updateTableField(field.fieldKey, (currentField) => ({\n ...currentField,\n columns: moveItemByIndex(currentField.columns, fromIndex, toIndex),\n }));\n // The selection follows the column it was on, not the position it left.\n setSelectedColumnIndex((current) =>\n current === null\n ? current\n : current === fromIndex\n ? toIndex\n : current > fromIndex && current <= toIndex\n ? current - 1\n : current < fromIndex && current >= toIndex\n ? current + 1\n : current,\n );\n }\n\n function handleOptionModeChange(\n field: FormOptionFieldDefinition,\n mode: 'multiple' | 'single',\n requestChange: OptionFieldChangeRequester,\n ): void {\n if (field.type !== 'select' && field.type !== 'autocomplete') {\n return;\n }\n\n if (readFormFieldSelectionMode(field) === mode) {\n return;\n }\n\n const currentDefaultValue = field.defaultValue;\n const defaultValue =\n mode === 'multiple'\n ? typeof currentDefaultValue === 'string'\n ? [currentDefaultValue]\n : currentDefaultValue\n : Array.isArray(currentDefaultValue)\n ? currentDefaultValue[0]\n : currentDefaultValue;\n\n requestChange(\n field,\n {\n ...field,\n defaultValue,\n mode,\n },\n '選擇模式變更可能轉換或捨棄既有預設值。',\n );\n }\n\n function requestDataSourceFieldChange(\n field: FormOptionFieldDefinition,\n nextField: FormFieldDefinition,\n impact = '此變更會替換目前選項來源;既有 options、dynamic reference 或 bindings 可能失效。',\n ): void {\n if (JSON.stringify(field) === JSON.stringify(nextField)) {\n return;\n }\n\n setPendingBuilderConfirmation({\n fieldKey: field.fieldKey,\n impact,\n kind: 'replace-field',\n nextField,\n });\n }\n\n /**\n * Applies straight away, with no confirmation. Picking a source is how a\n * designer explores what is available, and a prompt on every pick trains\n * people to dismiss prompts. Switching away from a configured source does\n * drop its bindings — see docs/17 for that trade.\n */\n function handleOptionSourceChange(\n field: FormOptionFieldDefinition,\n optionId: string | undefined,\n commit: FieldCommit<FormOptionFieldDefinition>,\n ): void {\n if (!optionId) {\n return;\n }\n\n if (optionId === STATIC_OPTION_SOURCE_ID) {\n if (!isFormDataSourceFieldDefinition(field)) {\n return;\n }\n\n const { dataSource, defaultValue, ...baseField } = field;\n void dataSource;\n void defaultValue;\n commit({\n ...baseField,\n options: [],\n } as FormOptionFieldDefinition);\n\n return;\n }\n\n const descriptor = dataSourceCatalog.find(\n (candidate) => readDataSourceDescriptorOptionId(candidate) === optionId,\n );\n\n if (!descriptor) {\n return;\n }\n\n if (isFormDataSourceFieldDefinition(field)) {\n const parameterKeys = new Set(\n descriptor.parameters.map((parameter) => parameter.key),\n );\n const nextBindings = field.dataSource.bindings.filter((binding) =>\n parameterKeys.has(binding.parameter),\n );\n\n commit({\n ...field,\n dataSource: {\n bindings: nextBindings,\n key: descriptor.key,\n version: descriptor.version,\n },\n });\n\n return;\n }\n\n const { options, defaultValue, ...baseField } = field;\n void options;\n void defaultValue;\n commit({\n ...baseField,\n dataSource: {\n bindings: [],\n key: descriptor.key,\n version: descriptor.version,\n },\n } as FormDataSourceOptionFieldDefinition);\n }\n\n function handleConfirmBuilderChange(): void {\n if (!pendingBuilderConfirmation) {\n return;\n }\n\n applyBuilderConfirmation(pendingBuilderConfirmation);\n setPendingBuilderConfirmation(null);\n }\n\n function applyBuilderConfirmation(\n confirmation: PendingBuilderConfirmation,\n ): void {\n if (confirmation.kind === 'remove-field') {\n applyRemoveField(confirmation.fieldKey);\n\n return;\n }\n\n if (confirmation.kind === 'remove-column') {\n applyRemoveTableColumn(confirmation.fieldKey, confirmation.columnIndex);\n\n return;\n }\n\n if (confirmation.kind === 'replace-column') {\n updateTableField(confirmation.fieldKey, (currentField) => ({\n ...currentField,\n columns: currentField.columns.map((column) =>\n column.fieldKey === confirmation.columnKey\n ? confirmation.nextColumn\n : column,\n ),\n }));\n // A new type brings its own settings — options for a select, a range for\n // a number — so put the designer in front of them instead of leaving the\n // panel on whichever column was selected before.\n setSelectedColumnIndex(confirmation.columnIndex);\n\n return;\n }\n\n setSchema({\n ...schema,\n fields: schema.fields.map((field) =>\n field.fieldKey === confirmation.fieldKey\n ? confirmation.nextField\n : field,\n ),\n });\n setAdvancedSchemaMessage(null);\n setDataSourceLint(null);\n }\n\n async function handleLintDataSourceSchema(): Promise<void> {\n setDataSourceLintLoading(true);\n\n try {\n const result = await lintFormSchema(schema, uiSchema);\n // Lint lines carry stable `FORM_DATA_SOURCE_*` codes; show the designer\n // readable copy while keeping the field path.\n setDataSourceLint(result.errors.map(readLintDisplayMessage));\n } catch {\n setDataSourceLint(['目前無法完成 DataSource schema 驗證。']);\n } finally {\n setDataSourceLintLoading(false);\n }\n }\n\n /**\n * The backend lint speaks in schema paths and parameter keys\n * (`schema.fields[0].columns[1].dataSource.bindings missing required\n * parameter: plant`). The designer is looking at labels, so name the field,\n * the column and the parameter the way the settings panel does.\n */\n function readLintDisplayMessage(line: string): string {\n const missing = LINT_MISSING_PARAMETER_PATTERN.exec(line);\n\n if (missing?.[1] && missing[3]) {\n return `${readLintTargetLabel(missing[1], missing[2])}尚未指定必要參數「${readLintParameterLabel(missing[1], missing[2], missing[3])}」的來源`;\n }\n\n const unknown = LINT_UNKNOWN_PARAMETER_PATTERN.exec(line);\n\n if (unknown?.[1] && unknown[3]) {\n return `${readLintTargetLabel(unknown[1], unknown[2])}綁定了來源沒有的參數「${unknown[3]}」`;\n }\n\n return readFormSchemaLintMessage(line);\n }\n\n function readLintTargetLabel(\n fieldIndex: string,\n columnIndex: string | undefined,\n ): string {\n const field = schema.fields[Number(fieldIndex)];\n\n if (!field) {\n return '';\n }\n\n const fieldLabel = field.label || field.fieldKey;\n const column = readLintColumn(field, columnIndex);\n\n return column\n ? `「${fieldLabel}」表格的「${column.label || column.fieldKey}」欄`\n : `「${fieldLabel}」欄位`;\n }\n\n function readLintParameterLabel(\n fieldIndex: string,\n columnIndex: string | undefined,\n parameterKey: string,\n ): string {\n const field = schema.fields[Number(fieldIndex)];\n\n if (!field) {\n return parameterKey;\n }\n\n const target = readLintColumn(field, columnIndex) ?? field;\n const reference = isFormDataSourceFieldDefinition(target)\n ? target.dataSource\n : null;\n const descriptor = reference\n ? dataSourceCatalog.find(\n (candidate) =>\n candidate.key === reference.key &&\n candidate.version === reference.version,\n )\n : undefined;\n\n return (\n descriptor?.parameters.find(\n (parameter) => parameter.key === parameterKey,\n )?.label || parameterKey\n );\n }\n\n function readLintColumn(\n field: FormFieldDefinition,\n columnIndex: string | undefined,\n ): TableColumnDefinition | undefined {\n return typeof columnIndex === 'string' && isTableFieldDefinition(field)\n ? field.columns[Number(columnIndex)]\n : undefined;\n }\n\n function updatePreviewValues(values: FormRendererValues): void {\n setPreviewValues(values);\n }\n\n function updateFieldRequired(fieldKey: string, required: boolean): void {\n setSchema((currentSchema) => ({\n ...currentSchema,\n fields: currentSchema.fields.map(\n (field): FormFieldDefinition =>\n field.fieldKey === fieldKey\n ? ({ ...field, required } as FormFieldDefinition)\n : field,\n ),\n }));\n setAdvancedSchemaMessage(null);\n }\n\n function updateSchemaJson(value: string): void {\n setSchemaJsonText(value);\n\n try {\n setSchema(JSON.parse(value) as FormDefinitionSchema);\n setAdvancedSchemaMessage(null);\n } catch {\n setAdvancedSchemaMessage('Form Schema JSON 格式不正確');\n }\n }\n\n function updateUiSchemaJson(value: string): void {\n setUiSchemaJsonText(value);\n\n try {\n setUiSchema(JSON.parse(value) as FormUiSchema);\n setAdvancedSchemaMessage(null);\n } catch {\n setAdvancedSchemaMessage('UI Schema JSON 格式不正確');\n }\n }\n\n return (\n <>\n <>\n <SectionGroup>\n <Section>\n <div style={WORKBENCH_STYLE}>\n <Tab\n activeKey={activeTab}\n onChange={handleTabChange}\n size=\"sub\"\n >\n <TabItem key=\"design\">設計</TabItem>\n <TabItem key=\"preview\">預覽</TabItem>\n <TabItem key=\"advanced\">進階</TabItem>\n </Tab>\n\n {activeTab === 'design' ? renderDesignTab() : null}\n {activeTab === 'preview' ? renderPreviewTab() : null}\n {activeTab === 'advanced' ? renderAdvancedTab() : null}\n </div>\n </Section>\n </SectionGroup>\n </>\n {pendingBuilderConfirmation ? (\n <Modal\n cancelText=\"返回\"\n confirmText=\"確認變更\"\n modalType=\"standard\"\n onCancel={(): void => setPendingBuilderConfirmation(null)}\n onClose={(): void => setPendingBuilderConfirmation(null)}\n onConfirm={handleConfirmBuilderChange}\n open\n showModalFooter\n showModalHeader\n title={readBuilderConfirmationTitle(pendingBuilderConfirmation)}\n >\n {pendingBuilderConfirmation.kind === 'remove-field' ? (\n <div style={COMPACT_STACK_STYLE}>\n <Typography variant=\"body\">\n 此欄位仍被下列 DataSource binding 使用;移除後請重新設定這些欄位。\n </Typography>\n <Typography color=\"text-warning\" variant=\"body\">\n {pendingBuilderConfirmation.affectedFieldKeys.join('、')}\n </Typography>\n </div>\n ) : pendingBuilderConfirmation.kind === 'remove-column' ? (\n <Typography variant=\"body\">\n 移除欄「{pendingBuilderConfirmation.columnKey}\n 」後,既有案件仍保留原本的表單版本,但新版本的這一欄資料將不再被填寫。\n </Typography>\n ) : (\n <Typography variant=\"body\">\n {pendingBuilderConfirmation.impact}\n </Typography>\n )}\n </Modal>\n ) : null}\n </>\n );\n\n function renderDesignTab(): ReactElement {\n return (\n <div style={STACK_STYLE}>\n <div style={FIELD_LIBRARY_HEADER_STYLE}>\n <Typography component=\"h2\" variant=\"label-primary\">\n 新增欄位\n </Typography>\n <div style={FIELD_LIBRARY_STYLE}>\n {FIELD_TYPE_OPTIONS.map((option) => (\n <Button\n icon={option.icon}\n iconType=\"leading\"\n key={option.type}\n onClick={(): void => handleAddField(option.type)}\n size=\"sub\"\n style={FIELD_LIBRARY_BUTTON_STYLE}\n type=\"button\"\n variant=\"base-secondary\"\n >\n {option.label}\n </Button>\n ))}\n </div>\n </div>\n\n <div style={WORKSPACE_GRID_STYLE}>\n <div style={{ ...STACK_STYLE, ...CANVAS_COLUMN_STYLE }}>\n <Typography component=\"h2\" variant=\"label-primary\">\n 表單畫布\n </Typography>\n {schema.fields.length > 0 ? (\n <DragDropContext onDragEnd={handleFieldDragEnd}>\n <Droppable droppableId=\"form-builder-fields\">\n {(droppableProvided): ReactElement => (\n <div\n {...droppableProvided.droppableProps}\n ref={droppableProvided.innerRef}\n style={STACK_STYLE}\n >\n {schema.fields.map((field, index) => (\n <Draggable\n draggableId={field.fieldKey}\n index={index}\n key={field.fieldKey}\n >\n {(draggableProvided, snapshot): ReactElement =>\n renderFieldBlock(\n field,\n draggableProvided,\n snapshot.isDragging,\n )\n }\n </Draggable>\n ))}\n {droppableProvided.placeholder}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n ) : (\n <div style={EMPTY_CANVAS_STYLE}>\n <div style={STACK_STYLE}>\n <Typography component=\"h3\" variant=\"h3\">\n 尚未建立欄位\n </Typography>\n <Typography color=\"text-neutral\" variant=\"body\">\n 從上方新增第一個欄位,或直接建立常用文字欄位開始設計。\n </Typography>\n </div>\n <div style={EMPTY_CANVAS_ACTIONS_STYLE}>\n <Button\n onClick={(): void => handleAddField('text')}\n variant=\"base-primary\"\n >\n 新增文字欄位\n </Button>\n <Button\n onClick={(): void => handleAddField('textarea')}\n variant=\"base-secondary\"\n >\n 新增長文字\n </Button>\n </div>\n </div>\n )}\n </div>\n\n <div style={{ ...STACK_STYLE, ...SETTINGS_COLUMN_STYLE }}>\n <Typography component=\"h2\" variant=\"label-primary\">\n 欄位設定\n </Typography>\n {selectedField ? (\n renderFieldSettings(selectedField)\n ) : (\n <Typography color=\"text-neutral\" variant=\"body\">\n 請先新增或選取欄位。\n </Typography>\n )}\n </div>\n </div>\n </div>\n );\n }\n\n function renderFieldSettings(field: FormFieldDefinition): ReactElement {\n return (\n <div style={FIELD_SETTINGS_FORM_STYLE}>\n {renderMainFieldSettings(field)}\n {isTableFieldDefinition(field)\n ? renderTableColumnsSection(field)\n : null}\n {renderAdvancedFieldSettings(field)}\n </div>\n );\n }\n\n function renderMainFieldSettings(field: FormFieldDefinition): ReactElement {\n return (\n <div style={FIELD_SETTINGS_SECTION_STYLE}>\n <div style={FIELD_SETTINGS_BADGE_ROW_STYLE}>\n <Badge\n size=\"main\"\n text={readFieldTypeLabel(field.type)}\n variant=\"text-info\"\n />\n </div>\n {renderSettingsFormRow(\n '標題',\n 'fieldLabel',\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateSelectedField({ label: event.target.value })\n }\n placeholder=\"例如:申請金額\"\n value={field.label}\n variant=\"base\"\n />,\n )}\n {renderSettingsFormRow(\n '欄位 Key',\n 'fieldKey',\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateSelectedField({ fieldKey: event.target.value })\n }\n placeholder=\"例如:amount\"\n value={field.fieldKey}\n variant=\"base\"\n />,\n )}\n {/*\n A table has no single control to hint at — `FormTableField` never\n reads `placeholder` — so the input is hidden rather than left there\n doing nothing. Any value already stored is kept untouched.\n */}\n {isTableFieldDefinition(field)\n ? null\n : renderSettingsFormRow(\n '提示文字',\n 'fieldPlaceholder',\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateSelectedField({\n placeholder: event.target.value || undefined,\n })\n }\n placeholder=\"例如:請輸入申請金額\"\n value={field.placeholder ?? ''}\n variant=\"base\"\n />,\n )}\n {renderTypeSpecificSettings(\n field,\n commitSelectedField,\n requestDataSourceFieldChange,\n )}\n {isTextFieldDefinition(field)\n ? renderSettingsFormRow(\n '以連結顯示',\n 'fieldDisplayAsLink',\n <Toggle\n checked={field.displayAs === 'link'}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateSelectedFieldWith((current) =>\n event.target.checked\n ? isTextFieldDefinition(current)\n ? { ...current, displayAs: 'link' }\n : current\n : removeFieldKey(current, 'displayAs'),\n )\n }\n />,\n )\n : null}\n {renderSettingsFormRow(\n '只存不顯示(系統整合用)',\n 'fieldHidden',\n <Toggle\n checked={field.hidden === true}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n // A hidden field can never be required (the publish lint\n // rejects the pair), so ticking it also clears 必填.\n updateSelectedFieldWith((current) =>\n event.target.checked\n ? { ...current, hidden: true, required: false }\n : removeFieldKey(current, 'hidden'),\n )\n }\n />,\n )}\n {field.hidden === true ? (\n <Typography\n color=\"text-neutral\"\n style={FIELD_SETTINGS_HINT_STYLE}\n variant=\"body\"\n >\n 填寫、唯讀與重送畫面都不會顯示這個欄位,值仍會存下來;\n 透過 API 仍然讀得到這個值,不是權限控管。\n </Typography>\n ) : null}\n </div>\n );\n }\n\n function renderAdvancedFieldSettings(\n field: FormFieldDefinition,\n ): ReactElement {\n return (\n <Accordion\n defaultExpanded={hasConditionRules(field)}\n size=\"sub\"\n title=\"進階設定\"\n >\n <div style={FIELD_SETTINGS_SECTION_STYLE}>\n <Typography\n component=\"h3\"\n style={FIELD_SETTINGS_SECTION_TITLE_STYLE}\n variant=\"label-primary\"\n >\n 條件規則\n </Typography>\n <Typography\n color=\"text-neutral\"\n style={FIELD_SETTINGS_HINT_STYLE}\n variant=\"body\"\n >\n 只有需要根據其他欄位改變顯示、必填或唯讀狀態時才需要設定。\n </Typography>\n {renderConditionSettings(field)}\n </div>\n </Accordion>\n );\n }\n\n function renderTypeSpecificSettings(\n field: FormFieldDefinition,\n commit: FieldCommit<FormFieldDefinition>,\n requestChange: OptionFieldChangeRequester,\n /**\n * The sibling columns a `ROW_FIELD` binding may address. Present only when\n * the field being edited is itself a table column (ADR 16 §3.4).\n */\n rowColumns?: readonly TableColumnDefinition[],\n ): ReactElement | null {\n if (isTextFieldDefinition(field)) {\n return renderTextFieldSettings(field, commit);\n }\n\n if (isNumberFieldDefinition(field)) {\n return renderNumberFieldSettings(field, commit);\n }\n\n if (isDateFieldDefinition(field)) {\n return renderDateFieldSettings(field, commit);\n }\n\n if (isFormOptionFieldDefinition(field)) {\n return renderOptionFieldSettings(field, commit, requestChange, rowColumns);\n }\n\n if (field.type === 'boolean') {\n return renderBooleanFieldSettings(field, commit);\n }\n\n if (field.type === 'file_upload') {\n return renderFileUploadFieldSettings(field, commit);\n }\n\n if (isMemberFieldDefinition(field)) {\n return renderMemberFieldSettings(field, commit);\n }\n\n if (isTableFieldDefinition(field)) {\n return renderTableFieldSettings(field);\n }\n\n return null;\n }\n\n function renderTableFieldSettings(field: TableFieldDefinition): ReactElement {\n const bounds = readFormTableRowBounds(field);\n\n return (\n <>\n {renderSettingsFormRow(\n '最少列數',\n 'fieldMinRows',\n renderNumberInput(\n field.minRows,\n (value): void =>\n updateTableField(field.fieldKey, (currentField) => ({\n ...currentField,\n minRows: value,\n })),\n '例如:1',\n { max: bounds.maxRows, min: 0 },\n ),\n )}\n {renderSettingsFormRow(\n '最多列數',\n 'fieldMaxRows',\n renderNumberInput(\n field.maxRows,\n (value): void =>\n updateTableField(field.fieldKey, (currentField) => ({\n ...currentField,\n maxRows: value,\n })),\n `未設定即為 ${FORM_TABLE_MAX_ROWS}`,\n { max: FORM_TABLE_MAX_ROWS, min: Math.max(bounds.minRows, 1) },\n ),\n )}\n {renderSettingsFormRow(\n '新增列按鈕文字',\n 'fieldAddRowLabel',\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateTableField(field.fieldKey, (currentField) => ({\n ...currentField,\n addRowLabel: event.target.value || undefined,\n }))\n }\n placeholder=\"預設為「新增一列」\"\n value={field.addRowLabel ?? ''}\n variant=\"base\"\n />,\n )}\n </>\n );\n }\n\n /**\n * Rendered as a sibling of the settings grid rather than inside it: the grid\n * is capped at a readable two-column width, and this list wants the whole\n * panel. It is also deliberately not wrapped in a form field, because\n * Mezzanine caps a field's data entry at 640px — that cap is what squeezed\n * the list into a third of the panel while the settings beside it ran wide.\n */\n function renderTableColumnsSection(field: TableFieldDefinition): ReactElement {\n return (\n <div style={TABLE_COLUMNS_SECTION_STYLE}>\n <div style={TABLE_COLUMNS_HEADER_STYLE}>\n <Typography component=\"h3\" variant=\"label-primary\">\n 欄({field.columns.length})\n </Typography>\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void => handleAddTableColumn(field)}\n size=\"sub\"\n type=\"button\"\n variant=\"base-secondary\"\n >\n 新增欄\n </Button>\n </div>\n {renderTableColumnsTable(field)}\n </div>\n );\n }\n\n function renderTableColumnsTable(field: TableFieldDefinition): ReactElement {\n const columnRows: TableColumnRow[] = field.columns.map((column, index) => ({\n fieldKey: column.fieldKey,\n index,\n // Keyed by position, not by column key: the key is what this row edits,\n // so keying on it remounts the input after the first character and drops\n // the caret. Reordering rewrites the whole array anyway, which is the\n // same reason the static option table keys by index.\n key: `${field.fieldKey}-column-${index}`,\n label: column.label,\n type: column.type,\n }));\n // The stored key is a machine value the flow conditions read; it lives in\n // the expanded settings so the list stays scannable by label.\n const columns: TableColumn<TableColumnRow>[] = [\n {\n key: 'label',\n render: (row): ReactElement => (\n <Input\n fullWidth\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n commitTableColumn(field, row.index, {\n ...readTableColumn(field, row.index),\n label: event.target.value,\n })\n }\n placeholder=\"例如:數量\"\n size=\"sub\"\n value={row.label}\n variant=\"base\"\n />\n ),\n title: '標題',\n },\n {\n key: 'type',\n render: (row): ReactElement => (\n <Select\n fullWidth\n clearable={false}\n menuMaxHeight={TYPE_MENU_MAX_HEIGHT}\n onChange={(option): void =>\n handleTableColumnTypeChange(field, row.index, option?.id)\n }\n options={[...TABLE_COLUMN_TYPE_OPTIONS]}\n // Every control in a `sub` table is `sub` too, or the row is sized\n // by whichever control forgot to say so.\n size=\"sub\"\n value={readSelectOption(TABLE_COLUMN_TYPE_OPTIONS, row.type)}\n />\n ),\n title: '型別',\n },\n {\n key: 'required',\n render: (row): ReactElement => (\n <Toggle\n checked={readTableColumn(field, row.index).required === true}\n // The visible label duplicated the column header, so the name\n // moves onto the input itself rather than disappearing.\n inputProps={{\n 'aria-label': `${row.label || row.fieldKey} 必填`,\n }}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n commitTableColumn(field, row.index, {\n ...readTableColumn(field, row.index),\n required: event.target.checked,\n })\n }\n size=\"sub\"\n />\n ),\n title: '必填',\n },\n ];\n const actions: TableActions<TableColumnRow> = {\n render: (row): ReturnType<TableActions<TableColumnRow>['render']> => [\n {\n // A table with no columns cannot be published (ADR 16 §4), so the\n // last one stays.\n disabled: (): boolean => field.columns.length <= 1,\n icon: TrashIcon,\n iconType: 'leading',\n name: '移除此欄',\n onClick: (): void =>\n setPendingBuilderConfirmation({\n columnIndex: row.index,\n columnKey: row.fieldKey,\n fieldKey: field.fieldKey,\n kind: 'remove-column',\n }),\n variant: 'destructive-ghost',\n },\n ],\n width: 104,\n };\n const expandedRowKey =\n selectedColumnIndex === null\n ? undefined\n : columnRows[selectedColumnIndex]?.key;\n\n return (\n <Table\n actions={actions}\n columns={columns}\n dataSource={columnRows}\n draggable={{\n enabled: true,\n onDragEnd: (_rows, options): void =>\n handleReorderTableColumns(field, options.fromIndex, options.toIndex),\n }}\n // Expanding a row is what selects the column: the settings then sit\n // under the row they belong to, so there is nothing to guess about\n // which column is being edited.\n expandable={{\n expandedRowKeys: expandedRowKey ? [expandedRowKey] : [],\n expandedRowRender: (row): ReactNode =>\n renderTableColumnSettings(field, row.index),\n onExpand: (expanded, row): void =>\n setSelectedColumnIndex(expanded ? row.index : null),\n }}\n fullWidth\n // Rows carry form controls rather than text, so the height comes from\n // the roomy container token instead of the default compact one.\n rowHeightPreset=\"roomy\"\n showHeader\n size=\"sub\"\n />\n );\n }\n\n function renderTableColumnSettings(\n field: TableFieldDefinition,\n columnIndex: number,\n ): ReactNode {\n const column = field.columns[columnIndex];\n\n if (!column) {\n return null;\n }\n\n return (\n <div style={TABLE_COLUMN_SETTINGS_STYLE}>\n {renderSettingsFormRow(\n '欄位 Key',\n 'columnFieldKey',\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n commitTableColumn(field, columnIndex, {\n ...column,\n fieldKey: event.target.value,\n })\n }\n placeholder=\"例如:qty\"\n value={column.fieldKey}\n variant=\"base\"\n />,\n )}\n {renderSettingsFormRow(\n '提示文字',\n 'columnPlaceholder',\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n commitTableColumn(field, columnIndex, {\n ...column,\n placeholder: event.target.value || undefined,\n })\n }\n placeholder=\"例如:請輸入數量\"\n value={column.placeholder ?? ''}\n variant=\"base\"\n />,\n )}\n {renderTypeSpecificSettings(\n column,\n (nextColumn): void => {\n if (isTableColumnFieldType(nextColumn.type)) {\n commitTableColumn(\n field,\n columnIndex,\n nextColumn as TableColumnDefinition,\n );\n }\n },\n // A column's option-source and selection-mode changes apply directly:\n // the confirmation modal is reserved for the two discrete destructive\n // column actions (delete, retype).\n (_column, nextColumn): void => {\n if (isTableColumnFieldType(nextColumn.type)) {\n commitTableColumn(\n field,\n columnIndex,\n nextColumn as TableColumnDefinition,\n );\n }\n },\n field.columns,\n )}\n </div>\n );\n }\n\n function handleTableColumnTypeChange(\n field: TableFieldDefinition,\n columnIndex: number,\n optionId: string | undefined,\n ): void {\n const column = field.columns[columnIndex];\n const nextType = TABLE_COLUMN_TYPE_OPTIONS.find(\n (option) => option.id === optionId,\n )?.id;\n\n if (!column || !nextType || column.type === nextType) {\n return;\n }\n\n const nextColumn = convertTableColumnType(column, nextType);\n const discarded = readDiscardedColumnSettings(column);\n\n // Nothing configured yet means nothing to lose, and a confirmation that\n // warns about losing nothing only teaches people to dismiss confirmations.\n if (discarded.length === 0) {\n commitTableColumn(field, columnIndex, nextColumn);\n setSelectedColumnIndex(columnIndex);\n\n return;\n }\n\n setPendingBuilderConfirmation({\n columnIndex,\n columnKey: column.fieldKey,\n fieldKey: field.fieldKey,\n impact: `「${column.label || column.fieldKey}」改為${readTableColumnTypeLabel(nextType)}後,這一欄的${discarded.join('、')}會被捨棄。`,\n kind: 'replace-column',\n nextColumn,\n });\n }\n\n function readTableColumnTypeLabel(\n type: TableColumnDefinition['type'],\n ): string {\n return (\n TABLE_COLUMN_TYPE_OPTIONS.find((option) => option.id === type)?.name ??\n type\n );\n }\n\n function readTableColumn(\n field: TableFieldDefinition,\n columnIndex: number,\n ): TableColumnDefinition {\n const column = field.columns[columnIndex];\n\n if (!column) {\n throw new Error(\n `Table ${field.fieldKey} has no column at index ${columnIndex}.`,\n );\n }\n\n return column;\n }\n\n function renderTextFieldSettings(\n field: TextFieldDefinition,\n commit: FieldCommit<TextFieldDefinition>,\n ): ReactElement {\n return (\n <>\n {renderSettingsFormRow(\n '預設值',\n 'fieldDefaultValue',\n field.type === 'textarea' ? (\n renderSettingsTextarea({\n name: 'fieldDefaultValue',\n onChange: (value): void =>\n commit({ ...field, defaultValue: value || undefined }),\n placeholder: '輸入此欄位的預設文字',\n rows: 3,\n value: readStringDefaultValue(field.defaultValue),\n })\n ) : (\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n commit({\n ...field,\n defaultValue: event.target.value || undefined,\n })\n }\n placeholder=\"輸入此欄位的預設文字\"\n value={readStringDefaultValue(field.defaultValue)}\n variant=\"base\"\n />\n ),\n )}\n {renderSettingsFormRow(\n '最小長度',\n 'fieldMinLength',\n renderNumberInput(\n field.minLength,\n (value): void => commit({ ...field, minLength: value }),\n '例如:2',\n { min: 0 },\n ),\n )}\n {renderSettingsFormRow(\n '最大長度',\n 'fieldMaxLength',\n renderNumberInput(\n field.maxLength,\n (value): void => commit({ ...field, maxLength: value }),\n '例如:100',\n { min: 1 },\n ),\n )}\n </>\n );\n }\n\n function renderNumberFieldSettings(\n field: NumberFieldDefinition,\n commit: FieldCommit<NumberFieldDefinition>,\n ): ReactElement {\n return (\n <>\n {renderSettingsFormRow(\n '預設值',\n 'fieldDefaultValue',\n renderNumberInput(\n typeof field.defaultValue === 'number'\n ? field.defaultValue\n : undefined,\n (value): void => commit({ ...field, defaultValue: value }),\n field.type === 'money' ? '例如:1000' : '輸入預設數值',\n { max: field.maximum, min: field.minimum },\n ),\n )}\n {renderSettingsFormRow(\n '最小值',\n 'fieldMinimum',\n renderNumberInput(\n field.minimum,\n (value): void => commit({ ...field, minimum: value }),\n '例如:0',\n ),\n )}\n {renderSettingsFormRow(\n '最大值',\n 'fieldMaximum',\n renderNumberInput(\n field.maximum,\n (value): void => commit({ ...field, maximum: value }),\n '例如:999999',\n ),\n )}\n </>\n );\n }\n\n function renderDateFieldSettings(\n field: DateFieldDefinition,\n commit: FieldCommit<DateFieldDefinition>,\n ): ReactElement {\n return renderSettingsFormRow(\n '預設值',\n 'fieldDefaultValue',\n renderDateValuePicker(\n field,\n readStringDefaultValue(field.defaultValue),\n (value): void => commit({ ...field, defaultValue: value }),\n ),\n );\n }\n\n function renderOptionFieldSettings(\n field: FormOptionFieldDefinition,\n commit: FieldCommit<FormOptionFieldDefinition>,\n requestChange: OptionFieldChangeRequester,\n rowColumns?: readonly TableColumnDefinition[],\n ): ReactElement {\n const compatibleDescriptors = readCompatibleFormDataSourceDescriptors(\n field.type,\n dataSourceCatalog,\n );\n const bindingScope: DataSourceBindingScope = {\n commit: (nextField): void => commit(nextField),\n rowColumns,\n };\n const currentSourceId = isFormDataSourceFieldDefinition(field)\n ? readDataSourceDescriptorOptionId(field.dataSource)\n : STATIC_OPTION_SOURCE_ID;\n const currentDescriptor = isFormDataSourceFieldDefinition(field)\n ? dataSourceCatalog.find(\n (descriptor) =>\n descriptor.key === field.dataSource.key &&\n descriptor.version === field.dataSource.version,\n )\n : null;\n const currentDescriptorIsCompatible = currentDescriptor\n ? compatibleDescriptors.some(\n (descriptor) =>\n descriptor.key === currentDescriptor.key &&\n descriptor.version === currentDescriptor.version,\n )\n : false;\n const sourceOptions = [\n ...OPTION_SOURCE_KIND_OPTIONS,\n ...compatibleDescriptors.map(readDataSourceDescriptorOption),\n ...(isFormDataSourceFieldDefinition(field) &&\n !currentDescriptorIsCompatible\n ? [\n {\n id: currentSourceId,\n name: `${field.dataSource.key} v${field.dataSource.version}(目前不可用或不支援)`,\n },\n ]\n : []),\n ];\n const mode = readFormFieldSelectionMode(field);\n\n return (\n <>\n {field.type === 'select' || field.type === 'autocomplete'\n ? renderSettingsFormRow(\n '選擇模式',\n 'fieldSelectionMode',\n <Select\n clearable={false}\n onChange={(option): void => {\n if (option?.id === 'single' || option?.id === 'multiple') {\n handleOptionModeChange(field, option.id, requestChange);\n }\n }}\n options={[...OPTION_MODE_OPTIONS]}\n value={readSelectOption(OPTION_MODE_OPTIONS, mode)}\n />,\n )\n : renderSettingsFormRow(\n '選擇模式',\n 'fieldSelectionMode',\n <Typography color=\"text-neutral\" variant=\"body\">\n {mode === 'multiple' ? '固定複選' : '固定單選'}\n </Typography>,\n )}\n {renderSettingsFormRow(\n '選項來源',\n 'fieldOptionSource',\n <Select\n clearable={false}\n disabled={\n dataSourceCatalogState === 'loading' &&\n !isFormDataSourceFieldDefinition(field)\n }\n onChange={(option): void =>\n handleOptionSourceChange(field, option?.id, commit)\n }\n options={sourceOptions}\n placeholder=\"選擇選項來源\"\n value={readSelectOption(sourceOptions, currentSourceId)}\n />,\n )}\n {isFormDataSourceFieldDefinition(field)\n ? renderDataSourceFieldSettings(\n field,\n compatibleDescriptors,\n bindingScope,\n )\n : renderStaticOptionFieldSettings(field, commit)}\n </>\n );\n }\n\n function renderDataSourceFieldSettings(\n field: FormDataSourceOptionFieldDefinition,\n compatibleDescriptors: readonly FormDataSourceDescriptorRecord[],\n scope: DataSourceBindingScope,\n ): ReactElement {\n const descriptor = dataSourceCatalog.find(\n (candidate) =>\n candidate.key === field.dataSource.key &&\n candidate.version === field.dataSource.version,\n );\n const unsupportedCurrentSource =\n descriptor && !isFormDataSourceDescriptorCompatible(descriptor, field.type);\n\n return (\n <div style={DATA_SOURCE_SETTINGS_STYLE}>\n {dataSourceCatalogState === 'loading' ? (\n <Typography color=\"text-neutral\" variant=\"body\">\n 正在載入可用的選項來源…\n </Typography>\n ) : null}\n {dataSourceCatalogError ? (\n <Typography color=\"text-error\" variant=\"body\">\n {dataSourceCatalogError}\n </Typography>\n ) : null}\n {!descriptor ? (\n <Typography color=\"text-warning\" variant=\"body\">\n 找不到目前設定的來源版本。設定會保留,但這張表單在來源恢復前無法發布。\n </Typography>\n ) : null}\n {unsupportedCurrentSource ? (\n <Typography color=\"text-error\" variant=\"body\">\n 這個來源不支援目前的控制項,請改選其他來源。\n </Typography>\n ) : null}\n {descriptor ? renderDataSourceDescriptorSummary(descriptor) : null}\n {descriptor && descriptor.parameters.length > 0\n ? renderDataSourceParameterTable(field, descriptor, scope)\n : null}\n {compatibleDescriptors.length === 0 && !dataSourceCatalogError ? (\n <Typography color=\"text-warning\" variant=\"body\">\n 沒有支援目前控制項的已註冊來源。\n </Typography>\n ) : null}\n <div style={DATA_SOURCE_CHECK_ROW_STYLE}>\n {/*\n The handler lints the whole form, not this one source, so the label\n says so — and the loading state stays on the button rather than\n swapping the text and shifting everything beside it.\n */}\n <Button\n disabled={dataSourceLintLoading}\n loading={dataSourceLintLoading}\n onClick={(): void => void handleLintDataSourceSchema()}\n size=\"sub\"\n type=\"button\"\n variant=\"base-secondary\"\n >\n 檢查全部動態選項設定\n </Button>\n </div>\n {dataSourceLint ? (\n <div style={DATA_SOURCE_LINT_RESULT_STYLE}>\n {dataSourceLint.length > 0 ? (\n // One line each: joining them with a semicolon made a wall of\n // text out of what is really a checklist.\n dataSourceLint.map((message) => (\n <Typography color=\"text-error\" key={message} variant=\"caption\">\n {message}\n </Typography>\n ))\n ) : (\n <Typography color=\"text-success\" variant=\"caption\">\n 這張表單的動態選項設定都可以使用。\n </Typography>\n )}\n </div>\n ) : null}\n </div>\n );\n }\n\n function renderDataSourceDescriptorSummary(\n descriptor: FormDataSourceDescriptorRecord,\n ): ReactElement {\n return (\n <div style={DATA_SOURCE_SUMMARY_STYLE}>\n {descriptor.description ? (\n <Typography variant=\"body\">{descriptor.description}</Typography>\n ) : null}\n {/*\n What the source does, said as behaviour the designer can act on.\n Printing `supportedControls` and the revalidation enum told them the\n shape of our types, not what their form will do.\n */}\n <div style={DATA_SOURCE_TRAIT_ROW_STYLE}>\n {readDataSourceTraits(descriptor).map((trait) => (\n <Tag key={trait} label={trait} readOnly size=\"minor\" />\n ))}\n </div>\n <Typography color=\"text-neutral\" variant=\"caption\">\n 來源代號:{descriptor.key} · v{descriptor.version}\n </Typography>\n </div>\n );\n }\n\n /**\n * Every condition on one horizontal row. Stacked label/control/explanation\n * groups read as a list of unrelated controls once a source needs more than\n * one condition; a row keeps the condition, where its value comes from, and\n * what that means side by side.\n */\n function renderDataSourceParameterTable(\n field: FormDataSourceOptionFieldDefinition,\n descriptor: FormDataSourceDescriptorRecord,\n scope: DataSourceBindingScope,\n ): ReactElement {\n const rows = descriptor.parameters.map((parameter, index) => ({\n key: parameter.key,\n index,\n parameter,\n }));\n const columns: TableColumn<(typeof rows)[number]>[] = [\n {\n key: 'parameter',\n render: (row): ReactElement => (\n <div style={DATA_SOURCE_PARAMETER_NAME_STYLE}>\n <Typography variant=\"input\">\n {row.parameter.label ?? row.parameter.key}\n </Typography>\n {row.parameter.required ? (\n <Typography color=\"text-error\" variant=\"input\">\n *\n </Typography>\n ) : null}\n </div>\n ),\n title: '條件',\n width: 100,\n },\n {\n key: 'binding',\n // A binding reads as「同列:費用類別」or a field label, which the\n // control's own intrinsic width clips. `minWidth` is only honoured by a\n // resizable table, so the room has to come from `width`.\n width: 268,\n render: (row): ReactElement =>\n renderDataSourceParameterBinding(field, row.parameter, scope),\n title: '值從哪裡來',\n },\n {\n key: 'constant',\n width: 140,\n // Its own column rather than a second control stacked inside the\n // binding cell: a fixed value belongs beside the choice that asked\n // for it, not under it.\n render: (row): ReactElement =>\n readFormDataSourceBindingValueKind(\n readFormDataSourceBinding(field, row.parameter.key),\n ) === 'CONSTANT' ? (\n renderDataSourceConstantEditor(\n field,\n row.parameter.key,\n row.parameter.type,\n readFormDataSourceBinding(field, row.parameter.key),\n scope,\n )\n ) : (\n <Typography color=\"text-neutral\" variant=\"caption\">\n —\n </Typography>\n ),\n title: '固定值',\n },\n {\n key: 'meaning',\n render: (row): ReactElement => (\n <Typography color=\"text-neutral\" variant=\"caption\">\n {readBindingHint(\n readFormDataSourceBinding(field, row.parameter.key),\n row.parameter,\n scope,\n readCompatibleBindingCount(field, row.parameter, scope),\n )}\n </Typography>\n ),\n title: '填寫時的行為',\n },\n ];\n\n return (\n <div style={DATA_SOURCE_PARAMETERS_STYLE}>\n <Typography color=\"text-neutral\" variant=\"label-secondary\">\n 這個來源需要的條件\n </Typography>\n <Table\n columns={columns}\n dataSource={rows}\n fullWidth\n showHeader\n size=\"sub\"\n />\n </div>\n );\n }\n\n function readCompatibleBindingCount(\n field: FormDataSourceOptionFieldDefinition,\n parameter: FormDataSourceDescriptorRecord['parameters'][number],\n scope: DataSourceBindingScope,\n ): number {\n return (\n readCompatibleFormDataSourceBindingFields(\n parameter.type,\n schema.fields,\n field.fieldKey,\n ).length +\n (scope.rowColumns\n ? readCompatibleFormTableColumnBindingFields(\n parameter.type,\n scope.rowColumns,\n field.fieldKey,\n ).length\n : 0)\n );\n }\n\n function renderDataSourceParameterBinding(\n field: FormDataSourceOptionFieldDefinition,\n parameter: FormDataSourceDescriptorRecord['parameters'][number],\n scope: DataSourceBindingScope,\n ): ReactElement {\n const binding = readFormDataSourceBinding(field, parameter.key);\n const bindingId = readDataSourceBindingOptionId(binding);\n // Sibling columns come first: inside a table, the row is the near context\n // and the form is the far one.\n const rowFieldOptions = scope.rowColumns\n ? readCompatibleFormTableColumnBindingFields(\n parameter.type,\n scope.rowColumns,\n field.fieldKey,\n ).map((option) => ({\n id: `${ROW_FIELD_BINDING_PREFIX}${option.id}`,\n name: `同列:${option.name}`,\n }))\n : [];\n const bindingOptions = [\n ...(parameter.required\n ? []\n : [{ id: UNBOUND_BINDING_ID, name: '未綁定' }]),\n ...rowFieldOptions,\n ...readCompatibleFormDataSourceBindingFields(\n parameter.type,\n schema.fields,\n field.fieldKey,\n ),\n ...(parameter.type === 'STRING_ARRAY'\n ? []\n : [{ id: CONSTANT_BINDING_ID, name: '固定常數' }]),\n ];\n\n return (\n <div\n data-data-source-parameter={parameter.key}\n style={DATA_SOURCE_PARAMETER_CELL_STYLE}\n >\n <Select\n clearable={false}\n // Fills the column it was given rather than its own intrinsic width,\n // which cut a binding name short.\n fullWidth\n // The column header names the control now that each condition is a\n // row rather than a labelled field of its own.\n // A long field label still outruns any column width, and a single\n // select has no overflow affordance of its own, so the full text\n // stays reachable on hover.\n inputProps={{\n 'aria-label': `${parameter.label ?? parameter.key} 的值來源`,\n title: readSelectOption(bindingOptions, bindingId)?.name ?? '',\n }}\n onChange={(option): void =>\n handleDataSourceBindingChange(\n field,\n parameter.key,\n parameter.type,\n option?.id,\n scope,\n )\n }\n options={bindingOptions}\n placeholder=\"選擇欄位或常數\"\n size=\"sub\"\n value={readSelectOption(bindingOptions, bindingId)}\n />\n </div>\n );\n }\n\n function readParameterTypeLabel(\n type: FormDataSourceDescriptorRecord['parameters'][number]['type'],\n ): string {\n return PARAMETER_TYPE_LABELS[type];\n }\n\n function readBindingHint(\n binding: ReturnType<typeof readFormDataSourceBinding>,\n parameter: FormDataSourceDescriptorRecord['parameters'][number],\n scope: DataSourceBindingScope,\n compatibleFieldCount: number,\n ): string {\n const kind = readFormDataSourceBindingValueKind(binding);\n\n // Kept to a line: this is a table cell, and a paragraph in every row turns\n // the rhythm the table was introduced for back into a wall of text.\n if (kind === 'CONSTANT') {\n return '固定值,不隨填寫變動';\n }\n\n if (kind === 'FIELD') {\n return `隨欄位「${readBindingSourceLabel(binding, scope)}」變動`;\n }\n\n if (kind === 'ROW_FIELD') {\n return `隨同列「${readBindingSourceLabel(binding, scope)}」變動`;\n }\n\n if (!parameter.required) {\n return '未設定,不做這層篩選';\n }\n\n return compatibleFieldCount > 0\n ? '尚未設定,選項無法載入'\n : `沒有相容的${readParameterTypeLabel(parameter.type)}欄位,請改用固定值`;\n }\n\n /**\n * Binding hints name the source the way the designer named it, not by the\n * key the schema stores.\n */\n function readBindingSourceLabel(\n binding: ReturnType<typeof readFormDataSourceBinding>,\n scope: DataSourceBindingScope,\n ): string {\n const from = binding?.from;\n\n if (from?.kind === 'FIELD') {\n const source = schema.fields.find(\n (candidate) => candidate.fieldKey === from.fieldKey,\n );\n\n return source ? source.label || source.fieldKey : '';\n }\n\n if (from?.kind === 'ROW_FIELD') {\n const column = scope.rowColumns?.find(\n (candidate) => candidate.fieldKey === from.columnKey,\n );\n\n return column ? column.label || column.fieldKey : '';\n }\n\n return '';\n }\n\n function renderDataSourceConstantEditor(\n field: FormDataSourceOptionFieldDefinition,\n parameterKey: string,\n parameterType: FormDataSourceParameterType,\n binding: FormDataSourceBinding | null,\n scope: DataSourceBindingScope,\n ): ReactElement {\n return (\n <div data-data-source-constant={parameterKey}>\n {renderDataSourceConstantControl(\n field,\n parameterKey,\n parameterType,\n binding,\n scope,\n )}\n </div>\n );\n }\n\n function renderDataSourceConstantControl(\n field: FormDataSourceOptionFieldDefinition,\n parameterKey: string,\n parameterType: FormDataSourceParameterType,\n binding: FormDataSourceBinding | null,\n scope: DataSourceBindingScope,\n ): ReactElement {\n const value = readFormDataSourceBindingValue(field, parameterKey);\n\n if (parameterType === 'BOOLEAN') {\n const options = [\n { id: 'true', name: '是' },\n { id: 'false', name: '否' },\n ];\n\n return (\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void =>\n updateDataSourceConstant(\n field,\n parameterKey,\n option?.id === 'true',\n scope,\n )\n }\n options={options}\n size=\"sub\"\n value={readSelectOption(\n options,\n value === true ? 'true' : 'false',\n )}\n />\n );\n }\n\n if (parameterType === 'STRING_ARRAY') {\n return (\n <Typography color=\"text-warning\" variant=\"caption\">\n 這個條件要收多個值,請綁定一個複選欄位;不接受固定值。\n </Typography>\n );\n }\n\n return (\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateDataSourceConstant(\n field,\n parameterKey,\n parameterType === 'NUMBER'\n ? (parseOptionalNumberInput(event.target.value) ?? 0)\n : event.target.value,\n scope,\n )\n }\n placeholder={parameterType === 'NUMBER' ? '輸入數字' : '輸入固定值'}\n value={readDataSourceConstantInputValue(binding, parameterType)}\n variant=\"base\"\n />\n );\n }\n\n function handleDataSourceBindingChange(\n field: FormDataSourceOptionFieldDefinition,\n parameterKey: string,\n parameterType: FormDataSourceParameterType,\n optionId: string | undefined,\n scope: DataSourceBindingScope,\n ): void {\n scope.commit(\n upsertFormDataSourceFieldBinding(\n field,\n parameterKey,\n readNextDataSourceBinding(parameterKey, parameterType, optionId),\n ),\n );\n }\n\n function updateDataSourceConstant(\n field: FormDataSourceOptionFieldDefinition,\n parameterKey: string,\n value: FormDataSourceConstantValue,\n scope: DataSourceBindingScope,\n ): void {\n scope.commit(\n upsertFormDataSourceFieldBinding(field, parameterKey, {\n from: { kind: 'CONSTANT', value },\n parameter: parameterKey,\n }),\n );\n }\n\n function renderStaticOptionFieldSettings(\n field: FormStaticOptionFieldDefinition,\n commit: FieldCommit<FormStaticOptionFieldDefinition>,\n ): ReactElement {\n const mode = readFormFieldSelectionMode(field);\n const defaultValues = Array.isArray(field.defaultValue)\n ? field.defaultValue\n : [];\n const options = field.options.map(readFieldOptionAsSelectOption);\n const selectedValues = options.filter((option) =>\n defaultValues.includes(option.id),\n );\n\n return (\n <>\n {renderSettingsFormRow(\n '預設值',\n 'fieldDefaultValue',\n mode === 'multiple' ? (\n <Select\n clearable\n mode=\"multiple\"\n onChange={(nextOptions): void =>\n commit({\n ...field,\n defaultValue: nextOptions.length\n ? nextOptions.map((option) => option.id)\n : undefined,\n })\n }\n options={options}\n placeholder=\"選擇一或多個預設選項\"\n value={selectedValues}\n />\n ) : (\n <Select\n clearable\n onChange={(option): void =>\n commit({ ...field, defaultValue: option?.id || undefined })\n }\n options={options}\n placeholder=\"選擇預設選項\"\n value={\n typeof field.defaultValue === 'string'\n ? readSelectOption(options, field.defaultValue)\n : null\n }\n />\n ),\n )}\n {renderSettingsFormRow(\n '選項',\n 'fieldOptions',\n renderFieldOptionsTable(field, commit),\n true,\n )}\n </>\n );\n }\n\n function renderBooleanFieldSettings(\n field: BooleanFieldDefinition,\n commit: FieldCommit<BooleanFieldDefinition>,\n ): ReactElement {\n const defaultValue =\n typeof field.defaultValue === 'boolean'\n ? String(field.defaultValue)\n : 'unset';\n\n return renderSettingsFormRow(\n '預設值',\n 'fieldDefaultValue',\n <Select\n clearable={false}\n onChange={(option): void =>\n commit({\n ...field,\n defaultValue:\n option?.id === 'true'\n ? true\n : option?.id === 'false'\n ? false\n : undefined,\n })\n }\n options={[...BOOLEAN_DEFAULT_OPTIONS]}\n placeholder=\"選擇預設狀態\"\n value={readSelectOption(BOOLEAN_DEFAULT_OPTIONS, defaultValue)}\n />,\n );\n }\n\n function renderMemberFieldSettings(\n field: MemberFieldDefinition,\n commit: FieldCommit<MemberFieldDefinition>,\n ): ReactElement {\n return renderSettingsFormRow(\n '可複選',\n 'fieldMemberMultiple',\n <Toggle\n checked={field.multiple === true}\n label={field.multiple === true ? '可選多位' : '只能選一位'}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n // The stored shape changes with `multiple` (string vs. string[]), so\n // a default written for the other shape must not survive the switch.\n commit({\n ...field,\n defaultValue: undefined,\n multiple: event.target.checked || undefined,\n })\n }\n size=\"sub\"\n />,\n );\n }\n\n function renderFileUploadFieldSettings(\n field: FileUploadFieldDefinition,\n commit: FieldCommit<FileUploadFieldDefinition>,\n ): ReactElement {\n return (\n <>\n {renderSettingsFormRow(\n '檔案數',\n 'fieldMaxFiles',\n renderNumberInput(\n field.maxFiles,\n (value): void => commit({ ...field, maxFiles: value }),\n '例如:1',\n { min: 1 },\n ),\n )}\n {renderSettingsFormRow(\n 'MIME',\n 'fieldAcceptedMimeTypes',\n renderSettingsTextarea({\n name: 'fieldAcceptedMimeTypes',\n onChange: (value): void =>\n commit({\n ...field,\n acceptedMimeTypes: parseStringList(value),\n }),\n placeholder: '每行一個 MIME type,例如:application/pdf',\n rows: 3,\n value: readStringListInput(field.acceptedMimeTypes),\n }),\n false,\n )}\n </>\n );\n }\n\n function renderConditionSettings(field: FormFieldDefinition): ReactElement {\n // A member id is an opaque directory key — there is nothing sensible to\n // compare it with in a form-level rule, so member fields are not offered.\n const conditionFieldOptions = schema.fields.filter(\n (schemaField) =>\n schemaField.fieldKey !== field.fieldKey &&\n !isMemberFieldDefinition(schemaField),\n );\n\n if (!conditionFieldOptions.length) {\n return (\n <Typography\n color=\"text-neutral\"\n style={FIELD_SETTINGS_HINT_STYLE}\n variant=\"body\"\n >\n 目前沒有其他欄位可作為條件來源。新增更多欄位後即可設定條件規則。\n </Typography>\n );\n }\n\n return (\n <>\n {CONDITION_RULE_CONFIGS.map((config) =>\n renderConditionRule(field, config, conditionFieldOptions),\n )}\n </>\n );\n }\n\n function renderConditionRule(\n field: FormFieldDefinition,\n config: ConditionRuleConfig,\n conditionFieldOptions: readonly FormFieldDefinition[],\n ): ReactElement {\n const expression = field[config.target];\n const parsedRule = expression ? parseConditionRule(expression) : null;\n const parsedConditionField = conditionFieldOptions.find(\n (conditionField) => conditionField.fieldKey === parsedRule?.fieldKey,\n );\n const selectedConditionField =\n parsedConditionField ?? conditionFieldOptions[0];\n const conditionFieldSelectOptions = conditionFieldOptions.map(\n readFieldAsConditionSelectOption,\n );\n const conditionOperatorOptions = readConditionOperatorOptions(\n selectedConditionField,\n );\n const selectedOperator =\n parsedRule &&\n conditionOperatorOptions.some(\n (option) => option.id === parsedRule.operator,\n )\n ? parsedRule.operator\n : readDefaultConditionOperator(selectedConditionField);\n const selectedValue =\n parsedRule?.value ?? readDefaultConditionValue(selectedConditionField);\n const enabled = Boolean(expression);\n const unsupportedRule = enabled && (!parsedRule || !parsedConditionField);\n\n return renderSettingsFormRow(\n config.label,\n config.name,\n <div style={CONDITION_RULE_CONTROL_STYLE}>\n <Toggle\n checked={enabled}\n label={enabled ? '已啟用' : '不啟用'}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateSelectedConditionRule(\n config.target,\n event.target.checked\n ? buildConditionExpression(\n selectedConditionField,\n readDefaultConditionOperator(selectedConditionField),\n readDefaultConditionValue(selectedConditionField),\n )\n : undefined,\n )\n }\n size=\"sub\"\n supportingText={config.supportingText}\n />\n {enabled ? (\n unsupportedRule ? (\n <Typography color=\"text-warning\" variant=\"body\">\n 這個規則不是目前 UI 支援的格式。重新選擇條件後會取代既有規則。\n </Typography>\n ) : (\n <div style={CONDITION_RULE_GRID_STYLE}>\n <Select\n clearable={false}\n onChange={(option): void => {\n const nextField =\n conditionFieldOptions.find(\n (conditionField) =>\n conditionField.fieldKey === option?.id,\n ) ?? selectedConditionField;\n\n updateSelectedConditionRule(\n config.target,\n buildConditionExpression(\n nextField,\n readDefaultConditionOperator(nextField),\n readDefaultConditionValue(nextField),\n ),\n );\n }}\n options={conditionFieldSelectOptions}\n placeholder=\"選擇欄位\"\n value={readSelectOption(\n conditionFieldSelectOptions,\n selectedConditionField.fieldKey,\n )}\n />\n <Select\n clearable={false}\n onChange={(option): void =>\n updateSelectedConditionRule(\n config.target,\n buildConditionExpression(\n selectedConditionField,\n readConditionOperatorOption(option?.id) ??\n selectedOperator,\n selectedValue,\n ),\n )\n }\n options={[...conditionOperatorOptions]}\n placeholder=\"判斷方式\"\n value={readSelectOption(\n conditionOperatorOptions,\n selectedOperator,\n )}\n />\n {renderConditionValueControl(\n selectedConditionField,\n selectedValue,\n (nextValue): void =>\n updateSelectedConditionRule(\n config.target,\n buildConditionExpression(\n selectedConditionField,\n selectedOperator,\n nextValue,\n ),\n ),\n )}\n </div>\n )\n ) : null}\n </div>,\n true,\n );\n }\n\n function updateSelectedConditionRule(\n target: ConditionRuleTarget,\n expression: string | undefined,\n ): void {\n updateSelectedField({ [target]: expression });\n }\n\n function renderConditionValueControl(\n conditionField: FormFieldDefinition,\n value: string,\n onChange: (value: string) => void,\n ): ReactElement {\n if (conditionField.type === 'boolean') {\n return (\n <Select\n clearable={false}\n onChange={(option): void => onChange(option?.id ?? 'true')}\n options={[...BOOLEAN_CONDITION_VALUE_OPTIONS]}\n placeholder=\"比較值\"\n value={readSelectOption(\n BOOLEAN_CONDITION_VALUE_OPTIONS,\n value === 'false' ? 'false' : 'true',\n )}\n />\n );\n }\n\n if (isSelectFieldDefinition(conditionField)) {\n const options = conditionField.options.map(readFieldOptionAsSelectOption);\n\n return (\n <Select\n clearable={false}\n onChange={(option): void =>\n onChange(option?.id ?? options[0]?.id ?? '')\n }\n options={options}\n placeholder=\"比較值\"\n value={readSelectOption(options, value)}\n />\n );\n }\n\n if (isNumberFieldDefinition(conditionField)) {\n return renderNumberInput(\n parseOptionalNumberInput(value),\n (nextValue): void => onChange(String(nextValue ?? 0)),\n '比較值',\n );\n }\n\n if (isDateFieldDefinition(conditionField)) {\n return renderDateValuePicker(conditionField, value, (nextValue): void =>\n onChange(nextValue ?? ''),\n );\n }\n\n return (\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n onChange(event.target.value)\n }\n placeholder=\"比較值\"\n value={value}\n variant=\"base\"\n />\n );\n }\n\n function renderSettingsTextarea({\n name,\n onChange,\n placeholder,\n rows,\n value,\n }: {\n readonly name: string;\n readonly onChange: (value: string) => void;\n readonly placeholder: string;\n readonly rows: number;\n readonly value: string;\n }): ReactElement {\n return (\n <Textarea\n aria-label={name}\n onChange={(event: ChangeEvent<HTMLTextAreaElement>): void =>\n onChange(event.target.value)\n }\n placeholder={placeholder}\n ref={applyFullWidthTextareaHost}\n resize=\"vertical\"\n rows={rows}\n style={FIELD_SETTINGS_TEXTAREA_STYLE}\n value={value}\n />\n );\n }\n\n function renderNumberInput(\n value: number | undefined,\n onChange: (value: number | undefined) => void,\n placeholder: string,\n options: {\n readonly max?: number;\n readonly min?: number;\n readonly step?: number;\n } = {},\n ): ReactElement {\n return (\n <Input\n max={options.max}\n min={options.min}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n onChange(\n clampOptionalNumber(\n parseOptionalNumberInput(event.target.value),\n options,\n ),\n )\n }\n placeholder={placeholder}\n showSpinner\n step={options.step ?? 1}\n value={typeof value === 'number' ? String(value) : ''}\n variant=\"measure\"\n />\n );\n }\n\n function renderDateValuePicker(\n field: DateFieldDefinition,\n value: string,\n onChange: (value: string | undefined) => void,\n ): ReactElement {\n if (field.type === 'datetime') {\n return (\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n hideSecond\n onChange={(nextValue): void =>\n onChange(formatDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"選擇日期\"\n placeholderRight=\"選擇時間\"\n value={readDatePickerValue(value)}\n />\n );\n }\n\n return (\n <DatePicker\n format=\"YYYY-MM-DD\"\n onChange={(nextValue): void =>\n onChange(formatDatePickerValue(nextValue))\n }\n placeholder=\"選擇日期\"\n value={readDatePickerValue(value)}\n />\n );\n }\n\n function renderFieldOptionsTable(\n field: FormStaticOptionFieldDefinition,\n commit: FieldCommit<FormStaticOptionFieldDefinition>,\n ): ReactElement {\n const optionRows: FieldOptionRow[] = field.options.map((option, index) => ({\n index,\n key: `${field.fieldKey}-${index}`,\n label: option.label,\n value: option.value,\n }));\n const optionColumns: TableColumn<FieldOptionRow>[] = [\n {\n key: 'label',\n render: (row): ReactElement => (\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n commit({\n ...field,\n options: updateFieldOption(field.options, row.index, {\n label: event.target.value,\n }),\n })\n }\n placeholder=\"例如:主管\"\n size=\"sub\"\n value={row.label}\n variant=\"base\"\n />\n ),\n title: 'Label',\n },\n {\n key: 'value',\n render: (row): ReactElement => (\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n commit({\n ...field,\n options: updateFieldOption(field.options, row.index, {\n value: event.target.value,\n }),\n })\n }\n placeholder=\"例如:manager\"\n size=\"sub\"\n value={row.value}\n variant=\"base\"\n />\n ),\n title: 'Value',\n },\n ];\n const optionActions: TableActions<FieldOptionRow> = {\n render: (row): ReturnType<TableActions<FieldOptionRow>['render']> => [\n {\n disabled: (): boolean => field.options.length <= 1,\n icon: TrashIcon,\n iconType: 'icon-only',\n name: '移除選項',\n onClick: (): void =>\n commit({\n ...field,\n options: field.options.filter((_, index) => index !== row.index),\n }),\n variant: 'destructive-ghost',\n },\n ],\n width: 56,\n };\n\n return (\n <div style={COMPACT_STACK_STYLE}>\n <Table\n actions={optionActions}\n columns={optionColumns}\n dataSource={optionRows}\n showHeader\n size=\"sub\"\n />\n <div style={OPTION_ACTIONS_STYLE}>\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void =>\n commit({\n ...field,\n options: [\n ...field.options,\n createNextFieldOption(field.options),\n ],\n })\n }\n variant=\"base-secondary\"\n >\n 新增選項\n </Button>\n </div>\n </div>\n );\n }\n\n function renderFieldBlock(\n field: FormFieldDefinition,\n draggableProvided: DraggableProvided,\n isDragging: boolean,\n ): ReactElement {\n return (\n <div\n {...draggableProvided.draggableProps}\n data-form-builder-field-key={field.fieldKey}\n ref={draggableProvided.innerRef}\n style={{\n ...FIELD_BLOCK_STYLE,\n ...(isDragging ? FIELD_BLOCK_DRAGGING_STYLE : null),\n ...draggableProvided.draggableProps.style,\n }}\n >\n <BaseCard\n style={\n field.fieldKey === selectedField?.fieldKey\n ? FIELD_BLOCK_SELECTED_CARD_STYLE\n : undefined\n }\n >\n {renderFieldBlockContent(field, draggableProvided, isDragging)}\n </BaseCard>\n </div>\n );\n }\n\n /**\n * Settings rows lay out as `STRETCH`, not the admin default `HORIZONTAL`.\n * Horizontal sizes the data entry to the control's own intrinsic width, so a\n * number input with a spinner came out 204px wide against a text input's\n * 192px and every label shifted to compensate — measured, and the reason the\n * panel read as ragged. Stretch gives every control the same width and lines\n * both edges up.\n */\n function renderSettingsFormRow(\n label: string,\n name: string,\n control: ReactElement,\n wide = false,\n ): ReactElement {\n return (\n <div\n style={wide ? FIELD_SETTINGS_ROW_WIDE_STYLE : FIELD_SETTINGS_ROW_STYLE}\n >\n <div style={FIELD_SETTINGS_VALUE_STYLE}>\n <BPMFormField\n label={label}\n layout={\n // A wide row carries a table or a textarea, which needs the whole\n // row: stretch would squeeze it into the same 240px box as a text\n // input, so the label moves above it instead.\n wide ? FormFieldLayout.VERTICAL : FormFieldLayout.STRETCH\n }\n name={name}\n >\n {control}\n </BPMFormField>\n </div>\n </div>\n );\n }\n\n function renderFieldBlockContent(\n field: FormFieldDefinition,\n draggableProvided: DraggableProvided,\n isDragging: boolean,\n ): ReactElement {\n return (\n <div\n {...(draggableProvided.dragHandleProps ?? {})}\n aria-label=\"選取或拖曳排序欄位\"\n onClick={(): void => setSelectedFieldKey(field.fieldKey)}\n style={FIELD_BLOCK_ROW_STYLE}\n title=\"點擊選取,拖曳排序\"\n >\n <span\n aria-label=\"拖曳排序\"\n role=\"img\"\n style={DRAG_HANDLE_STYLE}\n title=\"拖曳排序\"\n >\n <Icon icon={DotDragVerticalIcon} size={20} />\n </span>\n <div style={FIELD_BLOCK_TEXT_STYLE}>\n <Typography component=\"span\" ellipsis variant=\"label-primary\">\n {field.label}\n {field.required ? (\n <sup aria-label=\"必填\" style={REQUIRED_ASTERISK_STYLE}>\n *\n </sup>\n ) : null}\n </Typography>\n <Typography\n color=\"text-neutral\"\n component=\"span\"\n ellipsis\n variant=\"caption\"\n >\n {readFieldTypeLabel(field.type)} ·\n {field.required ? ' 必填' : ' 選填'} ·{field.fieldKey}\n {field.hidden ? ' · 只存不顯示' : null}\n </Typography>\n </div>\n <div\n onClick={(event: MouseEvent<HTMLDivElement>): void =>\n event.stopPropagation()\n }\n style={FIELD_BLOCK_ACTIONS_STYLE}\n >\n <div style={FIELD_BLOCK_REQUIRED_STYLE}>\n <Toggle\n checked={Boolean(field.required)}\n disabled={isDragging || field.hidden === true}\n label=\"必填\"\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateFieldRequired(field.fieldKey, event.target.checked)\n }\n />\n </div>\n <Button\n disabled={isDragging}\n icon={TrashIcon}\n iconType=\"icon-only\"\n onClick={(): void => handleRemoveField(field.fieldKey)}\n variant=\"destructive-ghost\"\n >\n 移除欄位\n </Button>\n </div>\n </div>\n );\n }\n\n function renderPreviewTab(): ReactElement {\n return (\n <div style={STACK_STYLE}>\n <Typography component=\"h2\" variant=\"h3\">\n 填寫預覽\n </Typography>\n <FormRenderer\n dataSourceContext={{ kind: 'preview' }}\n onChange={updatePreviewValues}\n schema={schema}\n uiSchema={uiSchema}\n value={previewValues}\n />\n </div>\n );\n }\n\n function renderAdvancedTab(): ReactElement {\n return (\n <div style={STACK_STYLE}>\n <Typography component=\"h2\" variant=\"h3\">\n Schema\n </Typography>\n <div style={ADVANCED_SCHEMA_FORM_STYLE}>\n {renderAdvancedSchemaRow(\n 'Form Schema',\n 'schemaJson',\n <JsonCodeEditor\n height=\"360px\"\n name=\"schemaJson\"\n onChange={updateSchemaJson}\n placeholder=\"輸入 Form Schema JSON\"\n value={schemaJsonText}\n />,\n )}\n {renderAdvancedSchemaRow(\n 'UI Schema',\n 'uiSchemaJson',\n <JsonCodeEditor\n height=\"240px\"\n name=\"uiSchemaJson\"\n onChange={updateUiSchemaJson}\n placeholder=\"輸入 UI Schema JSON\"\n value={uiSchemaJsonText}\n />,\n )}\n {advancedSchemaMessage ? (\n <Typography\n color=\"text-error\"\n style={ADVANCED_SCHEMA_MESSAGE_STYLE}\n variant=\"body\"\n >\n {advancedSchemaMessage}\n </Typography>\n ) : null}\n </div>\n </div>\n );\n }\n\n function renderAdvancedSchemaRow(\n label: string,\n name: string,\n control: ReactElement,\n ): ReactElement {\n return (\n <div style={ADVANCED_SCHEMA_ROW_STYLE}>\n <div style={ADVANCED_SCHEMA_VALUE_STYLE}>\n <BPMFormField label={label} name={name}>\n {control}\n </BPMFormField>\n </div>\n </div>\n );\n }\n}\n\nfunction readFieldTypeLabel(type: FieldType): string {\n return (\n FIELD_TYPE_OPTIONS.find((option) => option.type === type)?.label ?? type\n );\n}\n\nfunction readDataSourceDescriptorOptionId(value: {\n readonly key: string;\n readonly version: number;\n}): string {\n return `${value.key}@${value.version}`;\n}\n\n/**\n * The descriptor's capabilities, phrased as what the filler will experience.\n * `supportedControls` is deliberately absent: the picker only ever offers\n * sources that already support this field's control, so repeating it here\n * answers a question nobody asked.\n */\nfunction readDataSourceTraits(\n descriptor: FormDataSourceDescriptorRecord,\n): readonly string[] {\n return [\n // The length gate only rejects a search that is non-empty and shorter than\n // the minimum, so a minimum of 1 rejects nothing — saying「至少 1 字」there\n // would promise a threshold the source does not have.\n descriptor.supportsSearch\n ? `可輸入關鍵字搜尋${descriptor.minimumSearchLength > 1 ? `(至少 ${descriptor.minimumSearchLength} 字)` : ''}`\n : '不支援搜尋',\n descriptor.paginationMode === 'CURSOR'\n ? `捲動載入更多(每次 ${descriptor.pageSize} 筆)`\n : `一次載入完整清單(最多 ${descriptor.maximumResultCount} 筆)`,\n // What separates the two policies is whether a returned case can reuse the\n // labels it already stored, so the tag says that rather than naming them.\n descriptor.revalidationPolicy === 'ALWAYS'\n ? '退回重送時一律重新確認'\n : '值與條件未變時沿用上次結果',\n ];\n}\n\nfunction readDataSourceDescriptorOption(\n descriptor: FormDataSourceDescriptorRecord,\n): { readonly id: string; readonly name: string } {\n return {\n id: readDataSourceDescriptorOptionId(descriptor),\n // The stored key and version identify the source when something breaks;\n // they are not how a designer picks one, so they live in the summary below\n // rather than in every line of the picker.\n name: descriptor.label,\n };\n}\n\nfunction readDataSourceBindingOptionId(\n binding: FormDataSourceBinding | null,\n): string {\n if (!binding) {\n return UNBOUND_BINDING_ID;\n }\n\n if (binding.from.kind === 'FIELD') {\n return binding.from.fieldKey;\n }\n\n return binding.from.kind === 'ROW_FIELD'\n ? `${ROW_FIELD_BINDING_PREFIX}${binding.from.columnKey}`\n : CONSTANT_BINDING_ID;\n}\n\nfunction readDefaultDataSourceConstant(\n parameterType: FormDataSourceParameterType,\n): FormDataSourceConstantValue {\n switch (parameterType) {\n case 'BOOLEAN':\n return false;\n case 'NUMBER':\n return 0;\n case 'STRING_ARRAY':\n return '';\n case 'STRING':\n return '';\n default:\n return '';\n }\n}\n\nfunction readDataSourceConstantInputValue(\n binding: FormDataSourceBinding | null,\n parameterType: FormDataSourceParameterType,\n): string {\n const value = binding?.from.kind === 'CONSTANT' ? binding.from.value : '';\n\n if (parameterType === 'NUMBER') {\n return typeof value === 'number' ? String(value) : '';\n }\n\n return typeof value === 'string' ? value : '';\n}\n\n/**\n * Maps a binding picker option back to the binding it means. Row options carry\n * a prefix because a column key and a top-level field key can spell the same\n * thing — they live in separate namespaces (ADR 16 §3.1).\n */\nfunction readNextDataSourceBinding(\n parameterKey: string,\n parameterType: FormDataSourceParameterType,\n optionId: string | undefined,\n): FormDataSourceBinding | null {\n if (!optionId || optionId === UNBOUND_BINDING_ID) {\n return null;\n }\n\n if (optionId === CONSTANT_BINDING_ID) {\n return {\n from: {\n kind: 'CONSTANT',\n value: readDefaultDataSourceConstant(parameterType),\n },\n parameter: parameterKey,\n };\n }\n\n if (optionId.startsWith(ROW_FIELD_BINDING_PREFIX)) {\n return {\n from: {\n columnKey: optionId.slice(ROW_FIELD_BINDING_PREFIX.length),\n kind: 'ROW_FIELD',\n },\n parameter: parameterKey,\n };\n }\n\n return {\n from: { fieldKey: optionId, kind: 'FIELD' },\n parameter: parameterKey,\n };\n}\n\nfunction readBuilderConfirmationTitle(\n confirmation: PendingBuilderConfirmation,\n): string {\n if (confirmation.kind === 'remove-field') {\n return '確認移除 dependency 欄位';\n }\n\n if (confirmation.kind === 'remove-column') {\n return '確認移除表格欄';\n }\n\n return confirmation.kind === 'replace-column'\n ? '確認變更欄型別'\n : '確認變更選擇模式';\n}\n\n/**\n * Keeps identity and required-ness, drops everything the old type owned. A\n * `number` column's `minimum` means nothing to a `date` one, and carrying it\n * over would leave a schema the lint rejects for the wrong reason.\n */\nconst DEFAULT_COLUMN_OPTIONS: readonly FormFieldOption[] = [\n { label: '選項 A', value: 'option_a' },\n { label: '選項 B', value: 'option_b' },\n];\n\n/**\n * What retyping a column would throw away, named the way the settings panel\n * names it. Everything type-specific goes; identity, label, required,\n * description and placeholder survive (see {@link convertTableColumnType}).\n * An empty list means the confirmation has nothing to warn about.\n */\nfunction readDiscardedColumnSettings(\n column: TableColumnDefinition,\n): readonly string[] {\n const discarded: string[] = [];\n\n if (typeof column.defaultValue !== 'undefined') {\n discarded.push('預設值');\n }\n\n if (\n column.type === 'text' &&\n (typeof column.minLength === 'number' ||\n typeof column.maxLength === 'number')\n ) {\n discarded.push('長度限制');\n }\n\n if (\n (column.type === 'number' || column.type === 'money') &&\n (typeof column.minimum === 'number' || typeof column.maximum === 'number')\n ) {\n discarded.push('數值範圍');\n }\n\n if (isFormDataSourceFieldDefinition(column)) {\n discarded.push('選項來源設定');\n } else if (\n isFormStaticOptionFieldDefinition(column) &&\n !isDefaultColumnOptions(column.options)\n ) {\n discarded.push(`${column.options.length} 個選項`);\n }\n\n if (\n (column.type === 'select' || column.type === 'autocomplete') &&\n column.mode === 'multiple'\n ) {\n discarded.push('選擇模式');\n }\n\n return discarded;\n}\n\n/**\n * The pair a column is seeded with when it becomes a select. Untouched\n * boilerplate is not the designer's work, so losing it is not worth a\n * confirmation.\n */\nfunction isDefaultColumnOptions(\n options: readonly FormFieldOption[],\n): boolean {\n return (\n options.length === DEFAULT_COLUMN_OPTIONS.length &&\n options.every(\n (option, index) =>\n option.label === DEFAULT_COLUMN_OPTIONS[index]?.label &&\n option.value === DEFAULT_COLUMN_OPTIONS[index]?.value,\n )\n );\n}\n\nfunction convertTableColumnType(\n column: TableColumnDefinition,\n type: TableColumnDefinition['type'],\n): TableColumnDefinition {\n const base = {\n fieldKey: column.fieldKey,\n label: column.label,\n required: column.required,\n ...(column.description ? { description: column.description } : {}),\n ...(column.placeholder ? { placeholder: column.placeholder } : {}),\n };\n\n return type === 'select' || type === 'autocomplete'\n ? {\n ...base,\n mode: 'single' as const,\n options: [...DEFAULT_COLUMN_OPTIONS],\n type,\n }\n : ({ ...base, type } as TableColumnDefinition);\n}\n\n/**\n * Drops an optional display key so it is absent from the saved JSON instead of\n * lingering as `undefined`. Rebuilding the object from its entries loses the\n * union's type, hence the single cast back.\n */\nfunction removeFieldKey(\n field: FormFieldDefinition,\n key: 'displayAs' | 'hidden',\n): FormFieldDefinition {\n return Object.fromEntries(\n Object.entries(field).filter(([entryKey]) => entryKey !== key),\n ) as unknown as FormFieldDefinition;\n}\n\nfunction hasConditionRules(field: FormFieldDefinition): boolean {\n return Boolean(field.visibleWhen || field.requiredWhen || field.readonlyWhen);\n}\n\nfunction readFieldAsConditionSelectOption(field: FormFieldDefinition): {\n readonly id: string;\n readonly name: string;\n} {\n return {\n id: field.fieldKey,\n name: field.label,\n };\n}\n\nfunction isTextFieldDefinition(\n field: FormFieldDefinition,\n): field is TextFieldDefinition {\n return field.type === 'text' || field.type === 'textarea';\n}\n\nfunction readStringDefaultValue(\n value: FormFieldDefinition['defaultValue'],\n): string {\n return typeof value === 'string' ? value : '';\n}\n\nfunction parseStringList(value: string): readonly string[] | undefined {\n const values = value\n .split(/[\\n,]/u)\n .map((item) => item.trim())\n .filter(Boolean);\n\n return values.length ? values : undefined;\n}\n\nfunction readStringListInput(value: readonly string[] | undefined): string {\n return value?.join('\\n') ?? '';\n}\n\nfunction stringifyJson(value: unknown): string {\n return JSON.stringify(value, null, 2);\n}\n\nfunction updateFieldOption(\n options: readonly FormFieldOption[],\n targetIndex: number,\n patch: Partial<FormFieldOption>,\n): readonly FormFieldOption[] {\n return options.map((option, index) =>\n index === targetIndex ? { ...option, ...patch } : option,\n );\n}\n\nfunction createNextFieldOption(\n options: readonly FormFieldOption[],\n): FormFieldOption {\n const nextIndex = options.length + 1;\n\n return {\n label: `選項 ${nextIndex}`,\n value: readNextOptionValue(options, nextIndex),\n };\n}\n\nfunction readNextOptionValue(\n options: readonly FormFieldOption[],\n index: number,\n): string {\n const value = `option_${index}`;\n\n return options.some((option) => option.value === value)\n ? readNextOptionValue(options, index + 1)\n : value;\n}\n\nfunction moveItemByIndex<TItem>(\n items: readonly TItem[],\n sourceIndex: number,\n destinationIndex: number,\n): TItem[] {\n const sourceItem = items[sourceIndex];\n\n if (!sourceItem || sourceIndex === destinationIndex) {\n return [...items];\n }\n\n const remainingItems = items.filter((_, index) => index !== sourceIndex);\n\n return [\n ...remainingItems.slice(0, destinationIndex),\n sourceItem,\n ...remainingItems.slice(destinationIndex),\n ];\n}\n"],"mappings":";;;;;;;;;;;;;;;AAQA,IAAMI,KAAuC;CAC3C,YAAY;CACZ,QAAQ;CACR,cAAc;CACd,OAAO;CACP,SAAS;CACT,WAAW;CACX,SAAS;CACT,OAAO;AACT,GAEMC,IAA+C;CACnDC,GAAK;CACLC,EAAW;CACXA,EAAW,MAAM;EACf,KAAK;GACH,QAAQ;GACR,cAAc;GACd,UAAU;GACV,OAAO;EACT;EACA,gBAAgB,EACd,SAAS,4CACX;EACA,eAAe;GACb,YACE;GACF,WAAW;EACb;EACA,cAAc,EACZ,OAAO,OACT;EACA,eAAe,EACb,aAAa,4CACf;EACA,gBAAgB,EACd,YACE,wFACJ;CACF,CAAC;AACH,GAEMC,IAAaL,QACX,OAAO,0BACb;CACE,eACE,kBAAC,OAAD;EAAK,OAAOC;EAAuB,UAAA;CAAgB,CAAA;CAErD,KAAK;AACP,CACF;AAWA,SAAgBK,GAAe,EAC7B,cAAW,IACX,WACA,SACA,aACA,gBACA,YACoC;CACpC,OACE,kBAACD,GAAD;EACE,cAAYE;EACZ,YAAY;GACV,gBAAgB;GAChB,iBAAiB;GACjB,eAAe;GACf,eAAe;GACf,YAAY;GACZ,qBAAqB;GACrB,2BAA2B;GAC3B,aAAa;GACb,oBAAoB;EACtB;EACA,UAAU,CAACC;EACX,YAAY,CAAC,GAAGN,CAAsB;EAC9B;EACR,eAAe;EACL;EACG;EACb,UAAUM;EACV,OAAM;EACC;EACP,OAAM;CACP,CAAA;AAEL;;;AC0HA,IAAMC,KAAiD;CACrD;EACE,aAAa;EACb,MAAMC;EACN,OAAO;EACP,MAAM;CACR;CACA;EACE,aAAa;EACb,MAAMC;EACN,OAAO;EACP,MAAM;CACR;CACA;EACE,aAAa;EACb,MAAMC;EACN,OAAO;EACP,MAAM;CACR;CACA;EACE,aAAa;EACb,MAAMA;EACN,OAAO;EACP,MAAM;CACR;CACA;EACE,aAAa;EACb,MAAMC;EACN,OAAO;EACP,MAAM;CACR;CACA;EACE,aAAa;EACb,MAAMA;EACN,OAAO;EACP,MAAM;CACR;CACA;EACE,aAAa;EACb,MAAMC;EACN,OAAO;EACP,MAAM;CACR;CACA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"}
@@ -0,0 +1,3 @@
1
+ "use client";const e=require("./rolldown-runtime-BocRIvOZ.cjs"),t=require("./bpm-form-field-Bc6k4ZEO.cjs"),n=require("./FormRendererView-DRFi_IH7.cjs");let r=require("react"),i=require("@mezzanine-ui/react"),a=require("react/jsx-runtime"),o=require("@mezzanine-ui/core/form"),s=require("@mezzanine-ui/icons"),c=require("@rytass/bpm-core-client/form"),l=require("@rytass/bpm-core-shared/form"),u=require("@hello-pangea/dnd"),d=require("next/dynamic");d=e.t(d,1);let f=require("@codemirror/lang-json"),p=require("@codemirror/view");var m={alignItems:`center`,border:`1px solid var(--mzn-color-border-neutral)`,borderRadius:4,color:`var(--mzn-color-text-neutral)`,display:`flex`,minHeight:160,padding:12,width:`100%`},h=[(0,f.json)(),p.EditorView.lineWrapping,p.EditorView.theme({"&":{border:`1px solid var(--mzn-color-border-neutral)`,borderRadius:`4px`,fontSize:`13px`,width:`100%`},"&.cm-focused":{outline:`1px solid var(--mzn-color-border-primary)`},".cm-content":{fontFamily:`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace`,minHeight:`100%`},".cm-editor":{width:`100%`},".cm-gutters":{borderRight:`1px solid var(--mzn-color-border-neutral)`},".cm-scroller":{fontFamily:`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace`}})],g=(0,d.default)(()=>import(`@uiw/react-codemirror`),{loading:()=>(0,a.jsx)(`div`,{style:m,children:`載入 JSON 編輯器`}),ssr:!1});function ee({disabled:e=!1,height:t,name:n,onChange:r,placeholder:i,value:o}){return(0,a.jsx)(g,{"aria-label":n,basicSetup:{autocompletion:!0,bracketMatching:!0,closeBrackets:!0,defaultKeymap:!0,foldGutter:!0,highlightActiveLine:!0,highlightSelectionMatches:!0,lineNumbers:!0,syntaxHighlighting:!0},editable:!e,extensions:[...h],height:t,indentWithTab:!1,onChange:r,placeholder:i,readOnly:e,theme:`light`,value:o,width:`100%`})}var _=[{description:`單行文字、姓名、編號`,icon:s.AlignLeftIcon,label:`文字`,type:`text`},{description:`多行補充內容`,icon:s.FileIcon,label:`長文字`,type:`textarea`},{description:`金額、數量、分數`,icon:s.CurrencyDollarIcon,label:`數字`,type:`number`},{description:`金額與費用`,icon:s.CurrencyDollarIcon,label:`金額`,type:`money`},{description:`日期或到期日`,icon:s.CalendarIcon,label:`日期`,type:`date`},{description:`日期與時間`,icon:s.CalendarIcon,label:`日期時間`,type:`datetime`},{description:`是 / 否狀態`,icon:s.CheckedIcon,label:`開關`,type:`boolean`},{description:`固定選項擇一`,icon:s.ListIcon,label:`下拉選單`,type:`select`},{description:`可搜尋的固定選項`,icon:s.ListIcon,label:`自動完成`,type:`autocomplete`},{description:`固定選項單選`,icon:s.DotGridIcon,label:`單選`,type:`radio`},{description:`固定選項複選`,icon:s.CheckedOutlineIcon,label:`複選`,type:`checkbox`},{description:`附件或佐證資料`,icon:s.FileAttachmentIcon,label:`附件`,type:`file_upload`},{description:`從成員名單挑選一或多位人員`,icon:s.UserIcon,label:`人員選擇`,type:`member`},{description:`多列多欄明細`,icon:s.DotGridIcon,label:`表格`,type:`table`}],v=_.filter(e=>(0,l.isTableColumnFieldType)(e.type)).map(e=>({id:e.type,name:e.label})),te={alignItems:`start`,display:`flex`,flexWrap:`wrap`,gap:16},ne={flex:`0.55 1 300px`,minWidth:0},re={flex:`1.45 1 720px`,minWidth:620,paddingBottom:260},ie=240,ae={BOOLEAN:`開關`,NUMBER:`數字`,STRING:`文字或選單`,STRING_ARRAY:`多選`},oe=/^schema\.fields\[(\d+)\](?:\.columns\[(\d+)\])?\.dataSource\.bindings missing required parameter: (.+)$/u,se=/^schema\.fields\[(\d+)\](?:\.columns\[(\d+)\])?\.dataSource\.bindings unknown parameter: (.+)$/u,y={display:`grid`,gap:12},ce={display:`flex`,flexWrap:`wrap`,gap:6},le={flex:`0 0 auto`,whiteSpace:`nowrap`},ue={display:`grid`,gap:8},de={alignItems:`center`,cursor:`grab`,display:`flex`,gap:12,touchAction:`none`},fe={display:`grid`,flex:`1 1 auto`,gap:2,minWidth:0},pe={alignItems:`center`,display:`flex`,flex:`0 0 auto`,gap:4},me={alignItems:`center`,display:`flex`,gap:6},he={cursor:`pointer`,userSelect:`none`},ge={filter:`drop-shadow(0 8px 18px rgba(0, 0, 0, 0.12))`},_e={backgroundColor:`color-mix(in srgb, var(--mzn-color-primary) 8%, var(--mzn-color-bg-surface))`,boxShadow:`inset 0 0 0 1px var(--mzn-color-border-primary)`},ve={alignItems:`center`,border:`1px dashed var(--mzn-color-border-neutral)`,borderRadius:6,display:`grid`,gap:12,minHeight:240,padding:32,textAlign:`center`},ye={display:`flex`,gap:8,justifyContent:`center`},be={display:`grid`,gap:14},xe={display:`grid`,columnGap:16,gridTemplateColumns:`repeat(auto-fit, minmax(280px, 360px))`,justifyContent:`start`,maxWidth:736,rowGap:8},Se={gridColumn:`1 / -1`},Ce={alignItems:`center`,display:`flex`,gap:8,gridColumn:`1 / -1`,justifyContent:`flex-end`},b={gridColumn:`1 / -1`},we={alignItems:`start`,display:`block`,width:`100%`},Te={...we,gridColumn:`1 / -1`},Ee={minWidth:0,width:`100%`},De={minWidth:`100%`,width:`100%`},Oe={display:`grid`,gap:14},ke={alignItems:`start`,display:`block`,width:`100%`},Ae={minWidth:0,width:`100%`},je={gridColumn:`2 / -1`},Me={display:`grid`,gap:10,width:`100%`},Ne={display:`grid`,gap:8,gridTemplateColumns:`repeat(auto-fit, minmax(160px, 1fr))`},Pe={display:`inline-flex`},Fe={display:`grid`,gap:16},Ie={display:`grid`,gap:8},Le={display:`flex`,justifyContent:`flex-end`},Re={color:`var(--mzn-color-text-error)`,fontSize:`0.72em`,lineHeight:0,marginLeft:2,verticalAlign:`super`},ze={display:`grid`,gap:10,gridColumn:`1 / -1`},Be={display:`grid`,gap:2},Ve={display:`grid`,gap:8},He={display:`flex`,justifyContent:`flex-start`},Ue={display:`flex`,flexWrap:`wrap`,gap:4},We={backgroundColor:`var(--mzn-color-bg-surface-secondary)`,borderRadius:6,display:`grid`,gap:4,padding:10},Ge={...xe,gridTemplateColumns:`minmax(280px, 520px)`,padding:`4px 0 8px`},Ke={display:`grid`,gap:8,gridColumn:`1 / -1`},qe={alignItems:`center`,display:`flex`,gap:12,justifyContent:`space-between`},Je={alignItems:`baseline`,display:`flex`,gap:2},Ye={display:`grid`,gap:4};function Xe(e){e&&(e.style.width=`100%`)}var Ze={fields:[],schemaVersion:1},Qe={layout:[],schemaVersion:1},x=`__STATIC_OPTIONS__`,S=`__CONSTANT__`,C=`__ROW_FIELD__:`,w=`__UNBOUND__`,$e=[{id:x,name:`靜態選項`}],et=[{id:`single`,name:`單選`},{id:`multiple`,name:`複選`}],tt=[{id:`unset`,name:`不預設`},{id:`true`,name:`是`},{id:`false`,name:`否`}],nt=[{id:`true`,name:`是`},{id:`false`,name:`否`}],rt=[{label:`顯示`,name:`fieldVisibleWhen`,supportingText:`符合條件時才顯示這個欄位。`,target:`visibleWhen`},{label:`必填`,name:`fieldRequiredWhen`,supportingText:`符合條件時才要求填寫這個欄位。`,target:`requiredWhen`},{label:`唯讀`,name:`fieldReadonlyWhen`,supportingText:`符合條件時不允許修改這個欄位。`,target:`readonlyWhen`}];function T({onChange:e,value:d}){let f=d?.schema??Ze,p=d?.uiSchema??Qe,[m,h]=(0,r.useState)(f),[g,T]=(0,r.useState)(p),[ct,D]=(0,r.useState)(A(f)),[pt,j]=(0,r.useState)(A(p)),[St,Ct]=(0,r.useState)({}),[wt,N]=(0,r.useState)(null),[P,Tt]=(0,r.useState)(`design`),[F,I]=(0,r.useState)(null),[L,Et]=(0,r.useState)([]),[R,Dt]=(0,r.useState)(null),[Ot,kt]=(0,r.useState)(`loading`),[z,B]=(0,r.useState)(null),[At,jt]=(0,r.useState)(!1),[V,H]=(0,r.useState)(null),[Mt,U]=(0,r.useState)(null);(0,r.useEffect)(()=>{let e=!0;return(0,c.listFormDataSources)().then(t=>{e&&(Et(t),Dt(null),kt(`ready`))}).catch(t=>{e&&(Et([]),Dt(`目前無法載入 DataSource Catalog,請稍後重試。`),kt(`unavailable`))}),()=>{e=!1}},[]),(0,r.useEffect)(()=>{m.fields.some(e=>e.fieldKey===F)||I(m.fields[0]?.fieldKey??null)},[m.fields,F]),(0,r.useEffect)(()=>{Ct(e=>(0,c.buildFormRendererValues)(m.fields,e))},[m.fields]),(0,r.useEffect)(()=>{P!==`advanced`&&(D(A(m)),j(A(g)))},[P,m,g]);let W=(0,r.useMemo)(()=>m.fields.find(e=>e.fieldKey===F)??m.fields[0]??null,[m.fields,F]);(0,r.useEffect)(()=>{e?.({schema:m,uiSchema:g})},[m,g]);function G(e){let t=m.fields.length+1,n=(0,c.createFieldDefinition)(e,t);h({...m,fields:[...m.fields,n]}),T({...g,layout:[...g.layout,{fieldKey:n.fieldKey,width:e===`textarea`||e===`file_upload`||e===`table`?`FULL`:`HALF`}]}),I(n.fieldKey),Tt(`design`),N(null)}function Nt(e){let t=e;t===`advanced`&&P!==`advanced`&&(D(A(m)),j(A(g))),Tt(t)}function Pt(e){let t=m.fields.flatMap(t=>(0,l.isTableFieldDefinition)(t)?t.columns.flatMap(n=>(0,l.isFormDataSourceFieldDefinition)(n)&&(0,c.readFormDataSourceFieldDependencyKeys)(n).includes(e)?[`${t.fieldKey}.${n.fieldKey}`]:[]):(0,l.isFormDataSourceFieldDefinition)(t)&&(0,c.readFormDataSourceFieldDependencyKeys)(t).includes(e)?[t.fieldKey]:[]);t.length>0?H({affectedFieldKeys:t,fieldKey:e,kind:`remove-field`}):Ft(e)}function Ft(e){let t=m.fields.filter(t=>t.fieldKey!==e);h({...m,fields:t}),T({...g,layout:g.layout.filter(t=>t.fieldKey!==e)}),I(F===e?t[0]?.fieldKey??null:F),N(null),B(null)}function It(e){let t=e.destination;t&&e.source.index!==t.index&&(h(n=>({...n,fields:M(n.fields,e.source.index,t.index)})),T(n=>({...n,layout:M(n.layout,e.source.index,t.index)})),N(null))}function K(e){q(t=>({...t,...e}))}function q(e){if(!W)return;let t=W.fieldKey,n=e(W),r=n.fieldKey,i={...m,fields:m.fields.map(e=>e.fieldKey===t?n:e)},a=t===r?i:(0,c.renameFormDataSourceFieldBindings)(i,t,r);h(a),T({...g,layout:g.layout.map(e=>e.fieldKey===t?{...e,fieldKey:r}:e)}),I(r),N(null),B(null)}function Lt(e){q(()=>e)}function J(e,t){h(n=>({...n,fields:n.fields.map(n=>n.fieldKey===e&&(0,l.isTableFieldDefinition)(n)?t(n):n)})),N(null),B(null)}function Y(e,t,n){let r=e.columns[t]?.fieldKey;J(e.fieldKey,e=>{let i={...e,columns:e.columns.map((e,r)=>r===t?n:e)};return typeof r==`string`&&r!==n.fieldKey?(0,c.renameFormTableColumnBindings)(i,r,n.fieldKey):i})}function Rt(e){let t=(0,c.createTableColumnDefinition)(e.columns,`text`);J(e.fieldKey,e=>({...e,columns:[...e.columns,t]})),U(e.columns.length)}function zt(e,t){J(e,e=>({...e,columns:e.columns.filter((e,n)=>n!==t)})),U(e=>e===null||e<t?e:e===t?null:e-1)}function Bt(e,t,n){J(e.fieldKey,e=>({...e,columns:M(e.columns,t,n)})),U(e=>e===null?e:e===t?n:e>t&&e<=n?e-1:e<t&&e>=n?e+1:e)}function Vt(e,t,n){if(e.type!==`select`&&e.type!==`autocomplete`||(0,l.readFormFieldSelectionMode)(e)===t)return;let r=e.defaultValue,i=t===`multiple`?typeof r==`string`?[r]:r:Array.isArray(r)?r[0]:r;n(e,{...e,defaultValue:i,mode:t},`選擇模式變更可能轉換或捨棄既有預設值。`)}function Ht(e,t,n=`此變更會替換目前選項來源;既有 options、dynamic reference 或 bindings 可能失效。`){JSON.stringify(e)!==JSON.stringify(t)&&H({fieldKey:e.fieldKey,impact:n,kind:`replace-field`,nextField:t})}function Ut(e,t,n){if(!t)return;if(t===x){if(!(0,l.isFormDataSourceFieldDefinition)(e))return;let{dataSource:t,defaultValue:r,...i}=e;n({...i,options:[]});return}let r=L.find(e=>E(e)===t);if(!r)return;if((0,l.isFormDataSourceFieldDefinition)(e)){let t=new Set(r.parameters.map(e=>e.key)),i=e.dataSource.bindings.filter(e=>t.has(e.parameter));n({...e,dataSource:{bindings:i,key:r.key,version:r.version}});return}let{options:i,defaultValue:a,...o}=e;n({...o,dataSource:{bindings:[],key:r.key,version:r.version}})}function Wt(){V&&(Gt(V),H(null))}function Gt(e){e.kind===`remove-field`?Ft(e.fieldKey):e.kind===`remove-column`?zt(e.fieldKey,e.columnIndex):e.kind===`replace-column`?(J(e.fieldKey,t=>({...t,columns:t.columns.map(t=>t.fieldKey===e.columnKey?e.nextColumn:t)})),U(e.columnIndex)):(h({...m,fields:m.fields.map(t=>t.fieldKey===e.fieldKey?e.nextField:t)}),N(null),B(null))}async function Kt(){jt(!0);try{let e=await(0,c.lintFormSchema)(m,g);B(e.errors.map(qt))}catch{B([`目前無法完成 DataSource schema 驗證。`])}finally{jt(!1)}}function qt(e){let t=oe.exec(e);if(t?.[1]&&t[3])return`${Jt(t[1],t[2])}尚未指定必要參數「${Yt(t[1],t[2],t[3])}」的來源`;let n=se.exec(e);return n?.[1]&&n[3]?`${Jt(n[1],n[2])}綁定了來源沒有的參數「${n[3]}」`:(0,c.readFormSchemaLintMessage)(e)}function Jt(e,t){let n=m.fields[Number(e)];if(!n)return``;let r=n.label||n.fieldKey,i=Xt(n,t);return i?`「${r}」表格的「${i.label||i.fieldKey}」欄`:`「${r}」欄位`}function Yt(e,t,n){let r=m.fields[Number(e)];if(!r)return n;let i=Xt(r,t)??r,a=(0,l.isFormDataSourceFieldDefinition)(i)?i.dataSource:null;return(a?L.find(e=>e.key===a.key&&e.version===a.version):void 0)?.parameters.find(e=>e.key===n)?.label||n}function Xt(e,t){return typeof t==`string`&&(0,l.isTableFieldDefinition)(e)?e.columns[Number(t)]:void 0}function Zt(e){Ct(e)}function Qt(e,t){h(n=>({...n,fields:n.fields.map(n=>n.fieldKey===e?{...n,required:t}:n)})),N(null)}function $t(e){D(e);try{h(JSON.parse(e)),N(null)}catch{N(`Form Schema JSON 格式不正確`)}}function en(e){j(e);try{T(JSON.parse(e)),N(null)}catch{N(`UI Schema JSON 格式不正確`)}}return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(a.Fragment,{children:(0,a.jsx)(i.SectionGroup,{children:(0,a.jsx)(i.Section,{children:(0,a.jsxs)(`div`,{style:Fe,children:[(0,a.jsxs)(i.Tab,{activeKey:P,onChange:Nt,size:`sub`,children:[(0,a.jsx)(i.TabItem,{children:`設計`},`design`),(0,a.jsx)(i.TabItem,{children:`預覽`},`preview`),(0,a.jsx)(i.TabItem,{children:`進階`},`advanced`)]}),P===`design`?tn():null,P===`preview`?Vn():null,P===`advanced`?Hn():null]})})})}),V?(0,a.jsx)(i.Modal,{cancelText:`返回`,confirmText:`確認變更`,modalType:`standard`,onCancel:()=>H(null),onClose:()=>H(null),onConfirm:Wt,open:!0,showModalFooter:!0,showModalHeader:!0,title:dt(V),children:V.kind===`remove-field`?(0,a.jsxs)(`div`,{style:Ie,children:[(0,a.jsx)(i.Typography,{variant:`body`,children:`此欄位仍被下列 DataSource binding 使用;移除後請重新設定這些欄位。`}),(0,a.jsx)(i.Typography,{color:`text-warning`,variant:`body`,children:V.affectedFieldKeys.join(`、`)})]}):V.kind===`remove-column`?(0,a.jsxs)(i.Typography,{variant:`body`,children:[`移除欄「`,V.columnKey,`」後,既有案件仍保留原本的表單版本,但新版本的這一欄資料將不再被填寫。`]}):(0,a.jsx)(i.Typography,{variant:`body`,children:V.impact})}):null]});function tn(){return(0,a.jsxs)(`div`,{style:y,children:[(0,a.jsxs)(`div`,{style:ue,children:[(0,a.jsx)(i.Typography,{component:`h2`,variant:`label-primary`,children:`新增欄位`}),(0,a.jsx)(`div`,{style:ce,children:_.map(e=>(0,a.jsx)(i.Button,{icon:e.icon,iconType:`leading`,onClick:()=>G(e.type),size:`sub`,style:le,type:`button`,variant:`base-secondary`,children:e.label},e.type))})]}),(0,a.jsxs)(`div`,{style:te,children:[(0,a.jsxs)(`div`,{style:{...y,...ne},children:[(0,a.jsx)(i.Typography,{component:`h2`,variant:`label-primary`,children:`表單畫布`}),m.fields.length>0?(0,a.jsx)(u.DragDropContext,{onDragEnd:It,children:(0,a.jsx)(u.Droppable,{droppableId:`form-builder-fields`,children:e=>(0,a.jsxs)(`div`,{...e.droppableProps,ref:e.innerRef,style:y,children:[m.fields.map((e,t)=>(0,a.jsx)(u.Draggable,{draggableId:e.fieldKey,index:t,children:(t,n)=>zn(e,t,n.isDragging)},e.fieldKey)),e.placeholder]})})}):(0,a.jsxs)(`div`,{style:ve,children:[(0,a.jsxs)(`div`,{style:y,children:[(0,a.jsx)(i.Typography,{component:`h3`,variant:`h3`,children:`尚未建立欄位`}),(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`body`,children:`從上方新增第一個欄位,或直接建立常用文字欄位開始設計。`})]}),(0,a.jsxs)(`div`,{style:ye,children:[(0,a.jsx)(i.Button,{onClick:()=>G(`text`),variant:`base-primary`,children:`新增文字欄位`}),(0,a.jsx)(i.Button,{onClick:()=>G(`textarea`),variant:`base-secondary`,children:`新增長文字`})]})]})]}),(0,a.jsxs)(`div`,{style:{...y,...re},children:[(0,a.jsx)(i.Typography,{component:`h2`,variant:`label-primary`,children:`欄位設定`}),W?nn(W):(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`body`,children:`請先新增或選取欄位。`})]})]})]})}function nn(e){return(0,a.jsxs)(`div`,{style:be,children:[rn(e),(0,l.isTableFieldDefinition)(e)?cn(e):null,an(e)]})}function rn(e){return(0,a.jsxs)(`div`,{style:xe,children:[(0,a.jsx)(`div`,{style:Ce,children:(0,a.jsx)(i.Badge,{size:`main`,text:it(e.type),variant:`text-info`})}),$(`標題`,`fieldLabel`,(0,a.jsx)(i.Input,{onChange:e=>K({label:e.target.value}),placeholder:`例如:申請金額`,value:e.label,variant:`base`})),$(`欄位 Key`,`fieldKey`,(0,a.jsx)(i.Input,{onChange:e=>K({fieldKey:e.target.value}),placeholder:`例如:amount`,value:e.fieldKey,variant:`base`})),(0,l.isTableFieldDefinition)(e)?null:$(`提示文字`,`fieldPlaceholder`,(0,a.jsx)(i.Input,{onChange:e=>K({placeholder:e.target.value||void 0}),placeholder:`例如:請輸入申請金額`,value:e.placeholder??``,variant:`base`})),on(e,Lt,Ht),O(e)?$(`以連結顯示`,`fieldDisplayAsLink`,(0,a.jsx)(i.Toggle,{checked:e.displayAs===`link`,onChange:e=>q(t=>e.target.checked?O(t)?{...t,displayAs:`link`}:t:ht(t,`displayAs`))})):null,$(`只存不顯示(系統整合用)`,`fieldHidden`,(0,a.jsx)(i.Toggle,{checked:e.hidden===!0,onChange:e=>q(t=>e.target.checked?{...t,hidden:!0,required:!1}:ht(t,`hidden`))})),e.hidden===!0?(0,a.jsx)(i.Typography,{color:`text-neutral`,style:b,variant:`body`,children:`填寫、唯讀與重送畫面都不會顯示這個欄位,值仍會存下來; 透過 API 仍然讀得到這個值,不是權限控管。`}):null]})}function an(e){return(0,a.jsx)(i.Accordion,{defaultExpanded:gt(e),size:`sub`,title:`進階設定`,children:(0,a.jsxs)(`div`,{style:xe,children:[(0,a.jsx)(i.Typography,{component:`h3`,style:Se,variant:`label-primary`,children:`條件規則`}),(0,a.jsx)(i.Typography,{color:`text-neutral`,style:b,variant:`body`,children:`只有需要根據其他欄位改變顯示、必填或唯讀狀態時才需要設定。`}),Nn(e)]})})}function on(e,t,n,r){return O(e)?pn(e,t):(0,c.isNumberFieldDefinition)(e)?mn(e,t):(0,c.isDateFieldDefinition)(e)?hn(e,t):(0,l.isFormOptionFieldDefinition)(e)?gn(e,t,n,r):e.type===`boolean`?An(e,t):e.type===`file_upload`?Mn(e,t):(0,l.isMemberFieldDefinition)(e)?jn(e,t):(0,l.isTableFieldDefinition)(e)?sn(e):null}function sn(e){let t=(0,c.readFormTableRowBounds)(e);return(0,a.jsxs)(a.Fragment,{children:[$(`最少列數`,`fieldMinRows`,Q(e.minRows,t=>J(e.fieldKey,e=>({...e,minRows:t})),`例如:1`,{max:t.maxRows,min:0})),$(`最多列數`,`fieldMaxRows`,Q(e.maxRows,t=>J(e.fieldKey,e=>({...e,maxRows:t})),`未設定即為 ${l.FORM_TABLE_MAX_ROWS}`,{max:l.FORM_TABLE_MAX_ROWS,min:Math.max(t.minRows,1)})),$(`新增列按鈕文字`,`fieldAddRowLabel`,(0,a.jsx)(i.Input,{onChange:t=>J(e.fieldKey,e=>({...e,addRowLabel:t.target.value||void 0})),placeholder:`預設為「新增一列」`,value:e.addRowLabel??``,variant:`base`}))]})}function cn(e){return(0,a.jsxs)(`div`,{style:Ke,children:[(0,a.jsxs)(`div`,{style:qe,children:[(0,a.jsxs)(i.Typography,{component:`h3`,variant:`label-primary`,children:[`欄(`,e.columns.length,`)`]}),(0,a.jsx)(i.Button,{icon:s.PlusIcon,iconType:`leading`,onClick:()=>Rt(e),size:`sub`,type:`button`,variant:`base-secondary`,children:`新增欄`})]}),ln(e)]})}function ln(e){let t=e.columns.map((t,n)=>({fieldKey:t.fieldKey,index:n,key:`${e.fieldKey}-column-${n}`,label:t.label,type:t.type})),n=[{key:`label`,render:t=>(0,a.jsx)(i.Input,{fullWidth:!0,onChange:n=>Y(e,t.index,{...X(e,t.index),label:n.target.value}),placeholder:`例如:數量`,size:`sub`,value:t.label,variant:`base`}),title:`標題`},{key:`type`,render:t=>(0,a.jsx)(i.Select,{fullWidth:!0,clearable:!1,menuMaxHeight:ie,onChange:n=>dn(e,t.index,n?.id),options:[...v],size:`sub`,value:(0,c.readSelectOption)(v,t.type)}),title:`型別`},{key:`required`,render:t=>(0,a.jsx)(i.Toggle,{checked:X(e,t.index).required===!0,inputProps:{"aria-label":`${t.label||t.fieldKey} 必填`},onChange:n=>Y(e,t.index,{...X(e,t.index),required:n.target.checked}),size:`sub`}),title:`必填`}],r={render:t=>[{disabled:()=>e.columns.length<=1,icon:s.TrashIcon,iconType:`leading`,name:`移除此欄`,onClick:()=>H({columnIndex:t.index,columnKey:t.fieldKey,fieldKey:e.fieldKey,kind:`remove-column`}),variant:`destructive-ghost`}],width:104},o=Mt===null?void 0:t[Mt]?.key;return(0,a.jsx)(i.Table,{actions:r,columns:n,dataSource:t,draggable:{enabled:!0,onDragEnd:(t,n)=>Bt(e,n.fromIndex,n.toIndex)},expandable:{expandedRowKeys:o?[o]:[],expandedRowRender:t=>un(e,t.index),onExpand:(e,t)=>U(e?t.index:null)},fullWidth:!0,rowHeightPreset:`roomy`,showHeader:!0,size:`sub`})}function un(e,t){let n=e.columns[t];return n?(0,a.jsxs)(`div`,{style:Ge,children:[$(`欄位 Key`,`columnFieldKey`,(0,a.jsx)(i.Input,{onChange:r=>Y(e,t,{...n,fieldKey:r.target.value}),placeholder:`例如:qty`,value:n.fieldKey,variant:`base`})),$(`提示文字`,`columnPlaceholder`,(0,a.jsx)(i.Input,{onChange:r=>Y(e,t,{...n,placeholder:r.target.value||void 0}),placeholder:`例如:請輸入數量`,value:n.placeholder??``,variant:`base`})),on(n,n=>{(0,l.isTableColumnFieldType)(n.type)&&Y(e,t,n)},(n,r)=>{(0,l.isTableColumnFieldType)(r.type)&&Y(e,t,r)},e.columns)]}):null}function dn(e,t,n){let r=e.columns[t],i=v.find(e=>e.id===n)?.id;if(!r||!i||r.type===i)return;let a=mt(r,i),o=ft(r);o.length===0?(Y(e,t,a),U(t)):H({columnIndex:t,columnKey:r.fieldKey,fieldKey:e.fieldKey,impact:`「${r.label||r.fieldKey}」改為${fn(i)}後,這一欄的${o.join(`、`)}會被捨棄。`,kind:`replace-column`,nextColumn:a})}function fn(e){return v.find(t=>t.id===e)?.name??e}function X(e,t){let n=e.columns[t];if(!n)throw Error(`Table ${e.fieldKey} has no column at index ${t}.`);return n}function pn(e,t){return(0,a.jsxs)(a.Fragment,{children:[$(`預設值`,`fieldDefaultValue`,e.type===`textarea`?In({name:`fieldDefaultValue`,onChange:n=>t({...e,defaultValue:n||void 0}),placeholder:`輸入此欄位的預設文字`,rows:3,value:k(e.defaultValue)}):(0,a.jsx)(i.Input,{onChange:n=>t({...e,defaultValue:n.target.value||void 0}),placeholder:`輸入此欄位的預設文字`,value:k(e.defaultValue),variant:`base`})),$(`最小長度`,`fieldMinLength`,Q(e.minLength,n=>t({...e,minLength:n}),`例如:2`,{min:0})),$(`最大長度`,`fieldMaxLength`,Q(e.maxLength,n=>t({...e,maxLength:n}),`例如:100`,{min:1}))]})}function mn(e,t){return(0,a.jsxs)(a.Fragment,{children:[$(`預設值`,`fieldDefaultValue`,Q(typeof e.defaultValue==`number`?e.defaultValue:void 0,n=>t({...e,defaultValue:n}),e.type===`money`?`例如:1000`:`輸入預設數值`,{max:e.maximum,min:e.minimum})),$(`最小值`,`fieldMinimum`,Q(e.minimum,n=>t({...e,minimum:n}),`例如:0`)),$(`最大值`,`fieldMaximum`,Q(e.maximum,n=>t({...e,maximum:n}),`例如:999999`))]})}function hn(e,t){return $(`預設值`,`fieldDefaultValue`,Ln(e,k(e.defaultValue),n=>t({...e,defaultValue:n})))}function gn(e,t,n,r){let o=(0,c.readCompatibleFormDataSourceDescriptors)(e.type,L),s={commit:e=>t(e),rowColumns:r},u=(0,l.isFormDataSourceFieldDefinition)(e)?E(e.dataSource):x,d=(0,l.isFormDataSourceFieldDefinition)(e)?L.find(t=>t.key===e.dataSource.key&&t.version===e.dataSource.version):null,f=d?o.some(e=>e.key===d.key&&e.version===d.version):!1,p=[...$e,...o.map(ot),...(0,l.isFormDataSourceFieldDefinition)(e)&&!f?[{id:u,name:`${e.dataSource.key} v${e.dataSource.version}(目前不可用或不支援)`}]:[]],m=(0,l.readFormFieldSelectionMode)(e);return(0,a.jsxs)(a.Fragment,{children:[e.type===`select`||e.type===`autocomplete`?$(`選擇模式`,`fieldSelectionMode`,(0,a.jsx)(i.Select,{clearable:!1,onChange:t=>{(t?.id===`single`||t?.id===`multiple`)&&Vt(e,t.id,n)},options:[...et],value:(0,c.readSelectOption)(et,m)})):$(`選擇模式`,`fieldSelectionMode`,(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`body`,children:m===`multiple`?`固定複選`:`固定單選`})),$(`選項來源`,`fieldOptionSource`,(0,a.jsx)(i.Select,{clearable:!1,disabled:Ot===`loading`&&!(0,l.isFormDataSourceFieldDefinition)(e),onChange:n=>Ut(e,n?.id,t),options:p,placeholder:`選擇選項來源`,value:(0,c.readSelectOption)(p,u)})),(0,l.isFormDataSourceFieldDefinition)(e)?_n(e,o,s):kn(e,t)]})}function _n(e,t,n){let r=L.find(t=>t.key===e.dataSource.key&&t.version===e.dataSource.version),o=r&&!(0,c.isFormDataSourceDescriptorCompatible)(r,e.type);return(0,a.jsxs)(`div`,{style:ze,children:[Ot===`loading`?(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`body`,children:`正在載入可用的選項來源…`}):null,R?(0,a.jsx)(i.Typography,{color:`text-error`,variant:`body`,children:R}):null,r?null:(0,a.jsx)(i.Typography,{color:`text-warning`,variant:`body`,children:`找不到目前設定的來源版本。設定會保留,但這張表單在來源恢復前無法發布。`}),o?(0,a.jsx)(i.Typography,{color:`text-error`,variant:`body`,children:`這個來源不支援目前的控制項,請改選其他來源。`}):null,r?vn(r):null,r&&r.parameters.length>0?yn(e,r,n):null,t.length===0&&!R?(0,a.jsx)(i.Typography,{color:`text-warning`,variant:`body`,children:`沒有支援目前控制項的已註冊來源。`}):null,(0,a.jsx)(`div`,{style:He,children:(0,a.jsx)(i.Button,{disabled:At,loading:At,onClick:()=>void Kt(),size:`sub`,type:`button`,variant:`base-secondary`,children:`檢查全部動態選項設定`})}),z?(0,a.jsx)(`div`,{style:Be,children:z.length>0?z.map(e=>(0,a.jsx)(i.Typography,{color:`text-error`,variant:`caption`,children:e},e)):(0,a.jsx)(i.Typography,{color:`text-success`,variant:`caption`,children:`這張表單的動態選項設定都可以使用。`})}):null]})}function vn(e){return(0,a.jsxs)(`div`,{style:We,children:[e.description?(0,a.jsx)(i.Typography,{variant:`body`,children:e.description}):null,(0,a.jsx)(`div`,{style:Ue,children:at(e).map(e=>(0,a.jsx)(i.Tag,{label:e,readOnly:!0,size:`minor`},e))}),(0,a.jsxs)(i.Typography,{color:`text-neutral`,variant:`caption`,children:[`來源代號:`,e.key,` · v`,e.version]})]})}function yn(e,t,n){let r=t.parameters.map((e,t)=>({key:e.key,index:t,parameter:e}));return(0,a.jsxs)(`div`,{style:Ve,children:[(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`label-secondary`,children:`這個來源需要的條件`}),(0,a.jsx)(i.Table,{columns:[{key:`parameter`,render:e=>(0,a.jsxs)(`div`,{style:Je,children:[(0,a.jsx)(i.Typography,{variant:`input`,children:e.parameter.label??e.parameter.key}),e.parameter.required?(0,a.jsx)(i.Typography,{color:`text-error`,variant:`input`,children:`*`}):null]}),title:`條件`,width:100},{key:`binding`,width:268,render:t=>xn(e,t.parameter,n),title:`值從哪裡來`},{key:`constant`,width:140,render:t=>(0,c.readFormDataSourceBindingValueKind)((0,c.readFormDataSourceBinding)(e,t.parameter.key))===`CONSTANT`?Tn(e,t.parameter.key,t.parameter.type,(0,c.readFormDataSourceBinding)(e,t.parameter.key),n):(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`caption`,children:`—`}),title:`固定值`},{key:`meaning`,render:t=>(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`caption`,children:Cn((0,c.readFormDataSourceBinding)(e,t.parameter.key),t.parameter,n,bn(e,t.parameter,n))}),title:`填寫時的行為`}],dataSource:r,fullWidth:!0,showHeader:!0,size:`sub`})]})}function bn(e,t,n){return(0,c.readCompatibleFormDataSourceBindingFields)(t.type,m.fields,e.fieldKey).length+(n.rowColumns?(0,c.readCompatibleFormTableColumnBindingFields)(t.type,n.rowColumns,e.fieldKey).length:0)}function xn(e,t,n){let r=st((0,c.readFormDataSourceBinding)(e,t.key)),o=n.rowColumns?(0,c.readCompatibleFormTableColumnBindingFields)(t.type,n.rowColumns,e.fieldKey).map(e=>({id:`${C}${e.id}`,name:`同列:${e.name}`})):[],s=[...t.required?[]:[{id:w,name:`未綁定`}],...o,...(0,c.readCompatibleFormDataSourceBindingFields)(t.type,m.fields,e.fieldKey),...t.type===`STRING_ARRAY`?[]:[{id:S,name:`固定常數`}]];return(0,a.jsx)(`div`,{"data-data-source-parameter":t.key,style:Ye,children:(0,a.jsx)(i.Select,{clearable:!1,fullWidth:!0,inputProps:{"aria-label":`${t.label??t.key} 的值來源`,title:(0,c.readSelectOption)(s,r)?.name??``},onChange:r=>Dn(e,t.key,t.type,r?.id,n),options:s,placeholder:`選擇欄位或常數`,size:`sub`,value:(0,c.readSelectOption)(s,r)})})}function Sn(e){return ae[e]}function Cn(e,t,n,r){let i=(0,c.readFormDataSourceBindingValueKind)(e);return i===`CONSTANT`?`固定值,不隨填寫變動`:i===`FIELD`?`隨欄位「${wn(e,n)}」變動`:i===`ROW_FIELD`?`隨同列「${wn(e,n)}」變動`:t.required?r>0?`尚未設定,選項無法載入`:`沒有相容的${Sn(t.type)}欄位,請改用固定值`:`未設定,不做這層篩選`}function wn(e,t){let n=e?.from;if(n?.kind===`FIELD`){let e=m.fields.find(e=>e.fieldKey===n.fieldKey);return e?e.label||e.fieldKey:``}if(n?.kind===`ROW_FIELD`){let e=t.rowColumns?.find(e=>e.fieldKey===n.columnKey);return e?e.label||e.fieldKey:``}return``}function Tn(e,t,n,r,i){return(0,a.jsx)(`div`,{"data-data-source-constant":t,children:En(e,t,n,r,i)})}function En(e,t,n,r,o){let s=(0,c.readFormDataSourceBindingValue)(e,t);if(n===`BOOLEAN`){let n=[{id:`true`,name:`是`},{id:`false`,name:`否`}];return(0,a.jsx)(i.Select,{clearable:!1,fullWidth:!0,onChange:n=>On(e,t,n?.id===`true`,o),options:n,size:`sub`,value:(0,c.readSelectOption)(n,s===!0?`true`:`false`)})}return n===`STRING_ARRAY`?(0,a.jsx)(i.Typography,{color:`text-warning`,variant:`caption`,children:`這個條件要收多個值,請綁定一個複選欄位;不接受固定值。`}):(0,a.jsx)(i.Input,{onChange:r=>On(e,t,n===`NUMBER`?(0,c.parseOptionalNumberInput)(r.target.value)??0:r.target.value,o),placeholder:n===`NUMBER`?`輸入數字`:`輸入固定值`,value:lt(r,n),variant:`base`})}function Dn(e,t,n,r,i){i.commit((0,c.upsertFormDataSourceFieldBinding)(e,t,ut(t,n,r)))}function On(e,t,n,r){r.commit((0,c.upsertFormDataSourceFieldBinding)(e,t,{from:{kind:`CONSTANT`,value:n},parameter:t}))}function kn(e,t){let n=(0,l.readFormFieldSelectionMode)(e),r=Array.isArray(e.defaultValue)?e.defaultValue:[],o=e.options.map(c.readFieldOptionAsSelectOption),s=o.filter(e=>r.includes(e.id));return(0,a.jsxs)(a.Fragment,{children:[$(`預設值`,`fieldDefaultValue`,n===`multiple`?(0,a.jsx)(i.Select,{clearable:!0,mode:`multiple`,onChange:n=>t({...e,defaultValue:n.length?n.map(e=>e.id):void 0}),options:o,placeholder:`選擇一或多個預設選項`,value:s}):(0,a.jsx)(i.Select,{clearable:!0,onChange:n=>t({...e,defaultValue:n?.id||void 0}),options:o,placeholder:`選擇預設選項`,value:typeof e.defaultValue==`string`?(0,c.readSelectOption)(o,e.defaultValue):null})),$(`選項`,`fieldOptions`,Rn(e,t),!0)]})}function An(e,t){let n=typeof e.defaultValue==`boolean`?String(e.defaultValue):`unset`;return $(`預設值`,`fieldDefaultValue`,(0,a.jsx)(i.Select,{clearable:!1,onChange:n=>t({...e,defaultValue:n?.id===`true`||n?.id!==`false`&&void 0}),options:[...tt],placeholder:`選擇預設狀態`,value:(0,c.readSelectOption)(tt,n)}))}function jn(e,t){return $(`可複選`,`fieldMemberMultiple`,(0,a.jsx)(i.Toggle,{checked:e.multiple===!0,label:e.multiple===!0?`可選多位`:`只能選一位`,onChange:n=>t({...e,defaultValue:void 0,multiple:n.target.checked||void 0}),size:`sub`}))}function Mn(e,t){return(0,a.jsxs)(a.Fragment,{children:[$(`檔案數`,`fieldMaxFiles`,Q(e.maxFiles,n=>t({...e,maxFiles:n}),`例如:1`,{min:1})),$(`MIME`,`fieldAcceptedMimeTypes`,In({name:`fieldAcceptedMimeTypes`,onChange:n=>t({...e,acceptedMimeTypes:vt(n)}),placeholder:`每行一個 MIME type,例如:application/pdf`,rows:3,value:yt(e.acceptedMimeTypes)}),!1)]})}function Nn(e){let t=m.fields.filter(t=>t.fieldKey!==e.fieldKey&&!(0,l.isMemberFieldDefinition)(t));return t.length?(0,a.jsx)(a.Fragment,{children:rt.map(n=>Pn(e,n,t))}):(0,a.jsx)(i.Typography,{color:`text-neutral`,style:b,variant:`body`,children:`目前沒有其他欄位可作為條件來源。新增更多欄位後即可設定條件規則。`})}function Pn(e,t,n){let r=e[t.target],o=r?(0,c.parseConditionRule)(r):null,s=n.find(e=>e.fieldKey===o?.fieldKey),l=s??n[0],u=n.map(_t),d=(0,c.readConditionOperatorOptions)(l),f=o&&d.some(e=>e.id===o.operator)?o.operator:(0,c.readDefaultConditionOperator)(l),p=o?.value??(0,c.readDefaultConditionValue)(l),m=!!r,h=m&&(!o||!s);return $(t.label,t.name,(0,a.jsxs)(`div`,{style:Me,children:[(0,a.jsx)(i.Toggle,{checked:m,label:m?`已啟用`:`不啟用`,onChange:e=>Z(t.target,e.target.checked?(0,c.buildConditionExpression)(l,(0,c.readDefaultConditionOperator)(l),(0,c.readDefaultConditionValue)(l)):void 0),size:`sub`,supportingText:t.supportingText}),m?h?(0,a.jsx)(i.Typography,{color:`text-warning`,variant:`body`,children:`這個規則不是目前 UI 支援的格式。重新選擇條件後會取代既有規則。`}):(0,a.jsxs)(`div`,{style:Ne,children:[(0,a.jsx)(i.Select,{clearable:!1,onChange:e=>{let r=n.find(t=>t.fieldKey===e?.id)??l;Z(t.target,(0,c.buildConditionExpression)(r,(0,c.readDefaultConditionOperator)(r),(0,c.readDefaultConditionValue)(r)))},options:u,placeholder:`選擇欄位`,value:(0,c.readSelectOption)(u,l.fieldKey)}),(0,a.jsx)(i.Select,{clearable:!1,onChange:e=>Z(t.target,(0,c.buildConditionExpression)(l,(0,c.readConditionOperatorOption)(e?.id)??f,p)),options:[...d],placeholder:`判斷方式`,value:(0,c.readSelectOption)(d,f)}),Fn(l,p,e=>Z(t.target,(0,c.buildConditionExpression)(l,f,e)))]}):null]}),!0)}function Z(e,t){K({[e]:t})}function Fn(e,t,n){if(e.type===`boolean`)return(0,a.jsx)(i.Select,{clearable:!1,onChange:e=>n(e?.id??`true`),options:[...nt],placeholder:`比較值`,value:(0,c.readSelectOption)(nt,t===`false`?`false`:`true`)});if((0,c.isSelectFieldDefinition)(e)){let r=e.options.map(c.readFieldOptionAsSelectOption);return(0,a.jsx)(i.Select,{clearable:!1,onChange:e=>n(e?.id??r[0]?.id??``),options:r,placeholder:`比較值`,value:(0,c.readSelectOption)(r,t)})}return(0,c.isNumberFieldDefinition)(e)?Q((0,c.parseOptionalNumberInput)(t),e=>n(String(e??0)),`比較值`):(0,c.isDateFieldDefinition)(e)?Ln(e,t,e=>n(e??``)):(0,a.jsx)(i.Input,{onChange:e=>n(e.target.value),placeholder:`比較值`,value:t,variant:`base`})}function In({name:e,onChange:t,placeholder:n,rows:r,value:o}){return(0,a.jsx)(i.Textarea,{"aria-label":e,onChange:e=>t(e.target.value),placeholder:n,ref:Xe,resize:`vertical`,rows:r,style:De,value:o})}function Q(e,t,n,r={}){return(0,a.jsx)(i.Input,{max:r.max,min:r.min,onChange:e=>t((0,c.clampOptionalNumber)((0,c.parseOptionalNumberInput)(e.target.value),r)),placeholder:n,showSpinner:!0,step:r.step??1,value:typeof e==`number`?String(e):``,variant:`measure`})}function Ln(e,t,n){return e.type===`datetime`?(0,a.jsx)(i.DateTimePicker,{formatDate:`YYYY-MM-DD`,formatTime:`HH:mm`,hideSecond:!0,onChange:e=>n((0,c.formatDateTimePickerValue)(e)),placeholderLeft:`選擇日期`,placeholderRight:`選擇時間`,value:(0,c.readDatePickerValue)(t)}):(0,a.jsx)(i.DatePicker,{format:`YYYY-MM-DD`,onChange:e=>n((0,c.formatDatePickerValue)(e)),placeholder:`選擇日期`,value:(0,c.readDatePickerValue)(t)})}function Rn(e,t){let n=e.options.map((t,n)=>({index:n,key:`${e.fieldKey}-${n}`,label:t.label,value:t.value}));return(0,a.jsxs)(`div`,{style:Ie,children:[(0,a.jsx)(i.Table,{actions:{render:n=>[{disabled:()=>e.options.length<=1,icon:s.TrashIcon,iconType:`icon-only`,name:`移除選項`,onClick:()=>t({...e,options:e.options.filter((e,t)=>t!==n.index)}),variant:`destructive-ghost`}],width:56},columns:[{key:`label`,render:n=>(0,a.jsx)(i.Input,{onChange:r=>t({...e,options:bt(e.options,n.index,{label:r.target.value})}),placeholder:`例如:主管`,size:`sub`,value:n.label,variant:`base`}),title:`Label`},{key:`value`,render:n=>(0,a.jsx)(i.Input,{onChange:r=>t({...e,options:bt(e.options,n.index,{value:r.target.value})}),placeholder:`例如:manager`,size:`sub`,value:n.value,variant:`base`}),title:`Value`}],dataSource:n,showHeader:!0,size:`sub`}),(0,a.jsx)(`div`,{style:Le,children:(0,a.jsx)(i.Button,{icon:s.PlusIcon,iconType:`leading`,onClick:()=>t({...e,options:[...e.options,xt(e.options)]}),variant:`base-secondary`,children:`新增選項`})})]})}function zn(e,t,n){return(0,a.jsx)(`div`,{...t.draggableProps,"data-form-builder-field-key":e.fieldKey,ref:t.innerRef,style:{...he,...n?ge:null,...t.draggableProps.style},children:(0,a.jsx)(i.BaseCard,{style:e.fieldKey===W?.fieldKey?_e:void 0,children:Bn(e,t,n)})})}function $(e,n,r,i=!1){return(0,a.jsx)(`div`,{style:i?Te:we,children:(0,a.jsx)(`div`,{style:Ee,children:(0,a.jsx)(t.t,{label:e,layout:i?o.FormFieldLayout.VERTICAL:o.FormFieldLayout.STRETCH,name:n,children:r})})})}function Bn(e,t,n){return(0,a.jsxs)(`div`,{...t.dragHandleProps??{},"aria-label":`選取或拖曳排序欄位`,onClick:()=>I(e.fieldKey),style:de,title:`點擊選取,拖曳排序`,children:[(0,a.jsx)(`span`,{"aria-label":`拖曳排序`,role:`img`,style:Pe,title:`拖曳排序`,children:(0,a.jsx)(i.Icon,{icon:s.DotDragVerticalIcon,size:20})}),(0,a.jsxs)(`div`,{style:fe,children:[(0,a.jsxs)(i.Typography,{component:`span`,ellipsis:!0,variant:`label-primary`,children:[e.label,e.required?(0,a.jsx)(`sup`,{"aria-label":`必填`,style:Re,children:`*`}):null]}),(0,a.jsxs)(i.Typography,{color:`text-neutral`,component:`span`,ellipsis:!0,variant:`caption`,children:[it(e.type),` ·`,e.required?` 必填`:` 選填`,` ·`,e.fieldKey,e.hidden?` · 只存不顯示`:null]})]}),(0,a.jsxs)(`div`,{onClick:e=>e.stopPropagation(),style:pe,children:[(0,a.jsx)(`div`,{style:me,children:(0,a.jsx)(i.Toggle,{checked:!!e.required,disabled:n||e.hidden===!0,label:`必填`,onChange:t=>Qt(e.fieldKey,t.target.checked)})}),(0,a.jsx)(i.Button,{disabled:n,icon:s.TrashIcon,iconType:`icon-only`,onClick:()=>Pt(e.fieldKey),variant:`destructive-ghost`,children:`移除欄位`})]})]})}function Vn(){return(0,a.jsxs)(`div`,{style:y,children:[(0,a.jsx)(i.Typography,{component:`h2`,variant:`h3`,children:`填寫預覽`}),(0,a.jsx)(n.t,{dataSourceContext:{kind:`preview`},onChange:Zt,schema:m,uiSchema:g,value:St})]})}function Hn(){return(0,a.jsxs)(`div`,{style:y,children:[(0,a.jsx)(i.Typography,{component:`h2`,variant:`h3`,children:`Schema`}),(0,a.jsxs)(`div`,{style:Oe,children:[Un(`Form Schema`,`schemaJson`,(0,a.jsx)(ee,{height:`360px`,name:`schemaJson`,onChange:$t,placeholder:`輸入 Form Schema JSON`,value:ct})),Un(`UI Schema`,`uiSchemaJson`,(0,a.jsx)(ee,{height:`240px`,name:`uiSchemaJson`,onChange:en,placeholder:`輸入 UI Schema JSON`,value:pt})),wt?(0,a.jsx)(i.Typography,{color:`text-error`,style:je,variant:`body`,children:wt}):null]})]})}function Un(e,n,r){return(0,a.jsx)(`div`,{style:ke,children:(0,a.jsx)(`div`,{style:Ae,children:(0,a.jsx)(t.t,{label:e,name:n,children:r})})})}}function it(e){return _.find(t=>t.type===e)?.label??e}function E(e){return`${e.key}@${e.version}`}function at(e){return[e.supportsSearch?`可輸入關鍵字搜尋${e.minimumSearchLength>1?`(至少 ${e.minimumSearchLength} 字)`:``}`:`不支援搜尋`,e.paginationMode===`CURSOR`?`捲動載入更多(每次 ${e.pageSize} 筆)`:`一次載入完整清單(最多 ${e.maximumResultCount} 筆)`,e.revalidationPolicy===`ALWAYS`?`退回重送時一律重新確認`:`值與條件未變時沿用上次結果`]}function ot(e){return{id:E(e),name:e.label}}function st(e){return e?e.from.kind===`FIELD`?e.from.fieldKey:e.from.kind===`ROW_FIELD`?`${C}${e.from.columnKey}`:S:w}function ct(e){switch(e){case`BOOLEAN`:return!1;case`NUMBER`:return 0;case`STRING_ARRAY`:return``;case`STRING`:return``;default:return``}}function lt(e,t){let n=e?.from.kind===`CONSTANT`?e.from.value:``;return t===`NUMBER`?typeof n==`number`?String(n):``:typeof n==`string`?n:``}function ut(e,t,n){return!n||n===w?null:n===S?{from:{kind:`CONSTANT`,value:ct(t)},parameter:e}:n.startsWith(C)?{from:{columnKey:n.slice(14),kind:`ROW_FIELD`},parameter:e}:{from:{fieldKey:n,kind:`FIELD`},parameter:e}}function dt(e){return e.kind===`remove-field`?`確認移除 dependency 欄位`:e.kind===`remove-column`?`確認移除表格欄`:e.kind===`replace-column`?`確認變更欄型別`:`確認變更選擇模式`}var D=[{label:`選項 A`,value:`option_a`},{label:`選項 B`,value:`option_b`}];function ft(e){let t=[];return e.defaultValue!==void 0&&t.push(`預設值`),e.type===`text`&&(typeof e.minLength==`number`||typeof e.maxLength==`number`)&&t.push(`長度限制`),(e.type===`number`||e.type===`money`)&&(typeof e.minimum==`number`||typeof e.maximum==`number`)&&t.push(`數值範圍`),(0,l.isFormDataSourceFieldDefinition)(e)?t.push(`選項來源設定`):(0,l.isFormStaticOptionFieldDefinition)(e)&&!pt(e.options)&&t.push(`${e.options.length} 個選項`),(e.type===`select`||e.type===`autocomplete`)&&e.mode===`multiple`&&t.push(`選擇模式`),t}function pt(e){return e.length===D.length&&e.every((e,t)=>e.label===D[t]?.label&&e.value===D[t]?.value)}function mt(e,t){let n={fieldKey:e.fieldKey,label:e.label,required:e.required,...e.description?{description:e.description}:{},...e.placeholder?{placeholder:e.placeholder}:{}};return t===`select`||t===`autocomplete`?{...n,mode:`single`,options:[...D],type:t}:{...n,type:t}}function ht(e,t){return Object.fromEntries(Object.entries(e).filter(([e])=>e!==t))}function gt(e){return!!(e.visibleWhen||e.requiredWhen||e.readonlyWhen)}function _t(e){return{id:e.fieldKey,name:e.label}}function O(e){return e.type===`text`||e.type===`textarea`}function k(e){return typeof e==`string`?e:``}function vt(e){let t=e.split(/[\n,]/u).map(e=>e.trim()).filter(Boolean);return t.length?t:void 0}function yt(e){return e?.join(`
2
+ `)??``}function A(e){return JSON.stringify(e,null,2)}function bt(e,t,n){return e.map((e,r)=>r===t?{...e,...n}:e)}function xt(e){let t=e.length+1;return{label:`選項 ${t}`,value:j(e,t)}}function j(e,t){let n=`option_${t}`;return e.some(e=>e.value===n)?j(e,t+1):n}function M(e,t,n){let r=e[t];if(!r||t===n)return[...e];let i=e.filter((e,n)=>n!==t);return[...i.slice(0,n),r,...i.slice(n)]}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return T}});
3
+ //# sourceMappingURL=FormBuilderView-aBcA-_tt.cjs.map