@rytass/bpm-core-react 0.18.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +45 -0
- package/dist/chunks/{FormBuilderView-BVKY1j_0.js → FormBuilderView-Djlm3y4S.js} +485 -481
- package/dist/chunks/FormBuilderView-Djlm3y4S.js.map +1 -0
- package/dist/chunks/FormBuilderView-G6uRSywl.cjs +3 -0
- package/dist/chunks/FormBuilderView-G6uRSywl.cjs.map +1 -0
- package/dist/chunks/{FormRendererView-BsTwZkqU.js → FormRendererView-DHfVgbo6.js} +511 -274
- package/dist/chunks/FormRendererView-DHfVgbo6.js.map +1 -0
- package/dist/chunks/FormRendererView-DwfFbaip.cjs +6 -0
- package/dist/chunks/FormRendererView-DwfFbaip.cjs.map +1 -0
- package/dist/chunks/admin-pickers-BjbkBpSJ.cjs +2 -0
- package/dist/chunks/admin-pickers-BjbkBpSJ.cjs.map +1 -0
- package/dist/chunks/{admin-pickers-Djq3h-UR.js → admin-pickers-DfGxsjpp.js} +42 -42
- package/dist/chunks/admin-pickers-DfGxsjpp.js.map +1 -0
- package/dist/chunks/{approval-instance-list-page-CPXMP3PL.js → approval-instance-list-page-BnI4t5mD.js} +7 -8
- package/dist/chunks/{approval-instance-list-page-CPXMP3PL.js.map → approval-instance-list-page-BnI4t5mD.js.map} +1 -1
- package/dist/chunks/{approval-instance-list-page-ax0pm8bt.cjs → approval-instance-list-page-fqvmkBlg.cjs} +2 -2
- package/dist/chunks/{approval-instance-list-page-ax0pm8bt.cjs.map → approval-instance-list-page-fqvmkBlg.cjs.map} +1 -1
- package/dist/chunks/auth-provider-4BeCw7cI.cjs.map +1 -1
- package/dist/chunks/{auth-provider-B5oPmvk2.js → auth-provider-C2b-5mGt.js} +2 -3
- package/dist/chunks/{auth-provider-B5oPmvk2.js.map → auth-provider-C2b-5mGt.js.map} +1 -1
- package/dist/chunks/{bpm-form-field-Cao0rMol.js → bpm-form-field-9B-Det0u.js} +2 -3
- package/dist/chunks/{bpm-form-field-Cao0rMol.js.map → bpm-form-field-9B-Det0u.js.map} +1 -1
- package/dist/chunks/bpm-form-field-Bc6k4ZEO.cjs.map +1 -1
- package/dist/chunks/{categories-riC33J_j.js → categories-BAdxjNSA.js} +14 -15
- package/dist/chunks/{categories-riC33J_j.js.map → categories-BAdxjNSA.js.map} +1 -1
- package/dist/chunks/{categories-AxxhqjLZ.cjs → categories-DQUtVEiV.cjs} +2 -2
- package/dist/chunks/{categories-AxxhqjLZ.cjs.map → categories-DQUtVEiV.cjs.map} +1 -1
- package/dist/chunks/{compose-B1GlrZW9.js → compose-D6zBIc2Z.js} +131 -148
- package/dist/chunks/compose-D6zBIc2Z.js.map +1 -0
- package/dist/chunks/compose-NH6dsFXD.cjs +2 -0
- package/dist/chunks/compose-NH6dsFXD.cjs.map +1 -0
- package/dist/chunks/{dashboard-page-DdBvV6YI.js → dashboard-page-BoqNhjT_.js} +5 -6
- package/dist/chunks/{dashboard-page-DdBvV6YI.js.map → dashboard-page-BoqNhjT_.js.map} +1 -1
- package/dist/chunks/{dashboard-page-BWQBSGDq.cjs → dashboard-page-D7YJ3udk.cjs} +2 -2
- package/dist/chunks/{dashboard-page-BWQBSGDq.cjs.map → dashboard-page-D7YJ3udk.cjs.map} +1 -1
- package/dist/chunks/{delegations-MxF3uJGW.js → delegations-BfhCDz5e.js} +15 -16
- package/dist/chunks/{delegations-MxF3uJGW.js.map → delegations-BfhCDz5e.js.map} +1 -1
- package/dist/chunks/{delegations-Ckf03icM.cjs → delegations-BmFGcuhA.cjs} +2 -2
- package/dist/chunks/{delegations-Ckf03icM.cjs.map → delegations-BmFGcuhA.cjs.map} +1 -1
- package/dist/chunks/{delegations-V9HIe3_P.cjs → delegations-CcS0SHbf.cjs} +2 -2
- package/dist/chunks/{delegations-V9HIe3_P.cjs.map → delegations-CcS0SHbf.cjs.map} +1 -1
- package/dist/chunks/{delegations-xUt1tj8d.js → delegations-DBh5TT6G.js} +16 -17
- package/dist/chunks/{delegations-xUt1tj8d.js.map → delegations-DBh5TT6G.js.map} +1 -1
- package/dist/chunks/designer-Be9UI9Tg.cjs +65 -0
- package/dist/chunks/designer-Be9UI9Tg.cjs.map +1 -0
- package/dist/chunks/{designer-BCLrjb4H.js → designer-uhC_7m2i.js} +1791 -1407
- package/dist/chunks/designer-uhC_7m2i.js.map +1 -0
- package/dist/chunks/detail-6uw5dmTi.cjs +5 -0
- package/dist/chunks/detail-6uw5dmTi.cjs.map +1 -0
- package/dist/chunks/{detail-4F39ggBn.js → detail-_GeKqNC-.js} +1012 -972
- package/dist/chunks/detail-_GeKqNC-.js.map +1 -0
- package/dist/chunks/{format-date-time-CB-LxzqT.js → format-date-time-B0LdmWg4.js} +2 -3
- package/dist/chunks/{format-date-time-CB-LxzqT.js.map → format-date-time-B0LdmWg4.js.map} +1 -1
- package/dist/chunks/format-date-time-D-cx5M8z.cjs.map +1 -1
- package/dist/chunks/{format-member-label-DudVI55w.js → format-member-label-C73FuP-d.js} +2 -3
- package/dist/chunks/{format-member-label-DudVI55w.js.map → format-member-label-C73FuP-d.js.map} +1 -1
- package/dist/chunks/format-member-label-t7ANTF62.cjs.map +1 -1
- package/dist/chunks/{approver-filled-form-Dm3Iw7iw.cjs → instance-error-message-DTARGbGo.cjs} +2 -2
- package/dist/chunks/instance-error-message-DTARGbGo.cjs.map +1 -0
- package/dist/chunks/{approver-filled-form-ZEwpmsHJ.js → instance-error-message-q6gy5evy.js} +50 -38
- package/dist/chunks/instance-error-message-q6gy5evy.js.map +1 -0
- package/dist/chunks/language-provider-Bdnx3Gxl.cjs.map +1 -1
- package/dist/chunks/{language-provider-B3cEbLe4.js → language-provider-phkWOapf.js} +2 -3
- package/dist/chunks/{language-provider-B3cEbLe4.js.map → language-provider-phkWOapf.js.map} +1 -1
- package/dist/chunks/{login-C6qlTC6F.js → login-D6cc3bo7.js} +4 -5
- package/dist/chunks/{login-C6qlTC6F.js.map → login-D6cc3bo7.js.map} +1 -1
- package/dist/chunks/{login-AtVxZBsC.cjs → login-uvVcltrS.cjs} +2 -2
- package/dist/chunks/{login-AtVxZBsC.cjs.map → login-uvVcltrS.cjs.map} +1 -1
- package/dist/chunks/notifications-Bc4mgSds.cjs.map +1 -1
- package/dist/chunks/{notifications-DJ5wzCye.js → notifications-Cvme5Qbl.js} +2 -3
- package/dist/chunks/{notifications-DJ5wzCye.js.map → notifications-Cvme5Qbl.js.map} +1 -1
- package/dist/chunks/orgs-B_2J2tLX.cjs +2 -0
- package/dist/chunks/{orgs-BeeDDWL1.cjs.map → orgs-B_2J2tLX.cjs.map} +1 -1
- package/dist/chunks/{orgs-8hje_l2n.js → orgs-DqxMds26.js} +48 -49
- package/dist/chunks/{orgs-8hje_l2n.js.map → orgs-DqxMds26.js.map} +1 -1
- package/dist/chunks/{providers-B_d5tbCL.js → providers-BbCs23sk.js} +21 -25
- package/dist/chunks/{providers-B_d5tbCL.js.map → providers-BbCs23sk.js.map} +1 -1
- package/dist/chunks/{providers-chuJvMgv.cjs → providers-D_KAgOOu.cjs} +2 -2
- package/dist/chunks/{providers-chuJvMgv.cjs.map → providers-D_KAgOOu.cjs.map} +1 -1
- package/dist/chunks/router-adapter--gYs13E8.cjs.map +1 -1
- package/dist/chunks/{router-adapter-DftlFTOd.js → router-adapter-CkxCyzf5.js} +2 -3
- package/dist/chunks/{router-adapter-DftlFTOd.js.map → router-adapter-CkxCyzf5.js.map} +1 -1
- package/dist/chunks/{routes-config-yZbESPlw.js → routes-config-BcNaWJWJ.js} +2 -3
- package/dist/chunks/{routes-config-yZbESPlw.js.map → routes-config-BcNaWJWJ.js.map} +1 -1
- package/dist/chunks/routes-config-C1j_vFKo.cjs.map +1 -1
- package/dist/chunks/task-decision-3d17ZvZE.js +29 -0
- package/dist/chunks/task-decision-3d17ZvZE.js.map +1 -0
- package/dist/chunks/task-decision-CqZ4WQOC.cjs +2 -0
- package/dist/chunks/task-decision-CqZ4WQOC.cjs.map +1 -0
- package/dist/chunks/{use-bpm-member-D57LKe_u.js → use-bpm-member-BPzcNU1g.js} +3 -4
- package/dist/chunks/{use-bpm-member-D57LKe_u.js.map → use-bpm-member-BPzcNU1g.js.map} +1 -1
- package/dist/chunks/use-bpm-member-DpNAQtNC.cjs.map +1 -1
- package/dist/chunks/{users-Pl6hY5Y5.js → users-BBtiZ9QQ.js} +22 -25
- package/dist/chunks/{users-Pl6hY5Y5.js.map → users-BBtiZ9QQ.js.map} +1 -1
- package/dist/chunks/{users-O2L_M3BK.cjs → users-EqSzDhuj.cjs} +2 -2
- package/dist/chunks/{users-O2L_M3BK.cjs.map → users-EqSzDhuj.cjs.map} +1 -1
- package/dist/components/admin-picker-options.d.cts +11 -0
- package/dist/components/admin-picker-options.d.ts +11 -0
- package/dist/components/admin-pickers.d.cts +2 -11
- package/dist/components/admin-pickers.d.ts +2 -11
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +17 -19
- package/dist/index.js.map +1 -1
- package/dist/lib/task-decision.d.cts +16 -0
- package/dist/lib/task-decision.d.ts +16 -0
- package/dist/lib/use-org-unit-names.d.cts +10 -0
- package/dist/lib/use-org-unit-names.d.ts +10 -0
- package/dist/next/index.cjs +1 -1
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.js +7 -8
- package/dist/next/index.js.map +1 -1
- package/dist/next/workflow-chat-route.cjs +19 -1
- package/dist/next/workflow-chat-route.cjs.map +1 -1
- package/dist/next/workflow-chat-route.js +2 -3
- package/dist/next/workflow-chat-route.js.map +1 -1
- package/dist/pages/admin/delegations/index.cjs +1 -1
- package/dist/pages/admin/delegations/index.cjs.map +1 -1
- package/dist/pages/admin/delegations/index.js +2 -3
- package/dist/pages/admin/orgs/index.cjs +1 -1
- package/dist/pages/admin/orgs/index.cjs.map +1 -1
- package/dist/pages/admin/orgs/index.js +2 -3
- package/dist/pages/admin/users/index.cjs +1 -1
- package/dist/pages/admin/users/index.cjs.map +1 -1
- package/dist/pages/admin/users/index.js +2 -3
- package/dist/pages/admin/webhook-endpoints/index.cjs.map +1 -1
- package/dist/pages/admin/webhook-endpoints/index.js +1 -2
- package/dist/pages/cc/index.cjs.map +1 -1
- package/dist/pages/cc/index.js +1 -2
- package/dist/pages/dashboard/index.cjs.map +1 -1
- package/dist/pages/dashboard/index.js +1 -2
- package/dist/pages/delegations/index.cjs +1 -1
- package/dist/pages/delegations/index.cjs.map +1 -1
- package/dist/pages/delegations/index.js +2 -3
- package/dist/pages/inbox/index.cjs.map +1 -1
- package/dist/pages/inbox/index.js +1 -2
- package/dist/pages/instances/detail/index.cjs +1 -1
- package/dist/pages/instances/detail/index.cjs.map +1 -1
- package/dist/pages/instances/detail/index.js +2 -3
- package/dist/pages/instances/new/index.cjs.map +1 -1
- package/dist/pages/instances/new/index.js +1 -2
- package/dist/pages/login/index.cjs +1 -1
- package/dist/pages/login/index.cjs.map +1 -1
- package/dist/pages/login/index.js +2 -3
- package/dist/pages/root/index.cjs.map +1 -1
- package/dist/pages/root/index.js +1 -2
- package/dist/pages/search/index.cjs.map +1 -1
- package/dist/pages/search/index.js +1 -2
- package/dist/pages/sent/index.cjs.map +1 -1
- package/dist/pages/sent/index.js +1 -2
- package/dist/pages/settings/notifications/index.cjs.map +1 -1
- package/dist/pages/settings/notifications/index.js +2 -3
- package/dist/pages/templates/categories/index.cjs +1 -1
- package/dist/pages/templates/categories/index.cjs.map +1 -1
- package/dist/pages/templates/categories/index.js +2 -3
- package/dist/pages/templates/compose/index.cjs +1 -1
- package/dist/pages/templates/compose/index.cjs.map +1 -1
- package/dist/pages/templates/compose/index.js +2 -3
- package/dist/pages/templates/designer/index.cjs +1 -1
- package/dist/pages/templates/designer/index.cjs.map +1 -1
- package/dist/pages/templates/designer/index.js +2 -3
- package/dist/pages/templates/index.cjs.map +1 -1
- package/dist/pages/templates/index.js +1 -2
- package/dist/pages/templates/versions/index.cjs.map +1 -1
- package/dist/pages/templates/versions/index.js +1 -2
- package/dist/views/admin/delegations/index.cjs +1 -1
- package/dist/views/admin/delegations/index.js +1 -1
- package/dist/views/admin/index.cjs +1 -1
- package/dist/views/admin/index.js +3 -3
- package/dist/views/admin/orgs/index.cjs +1 -1
- package/dist/views/admin/orgs/index.js +1 -1
- package/dist/views/admin/users/index.cjs +1 -1
- package/dist/views/admin/users/index.js +1 -1
- package/dist/views/admin/webhook-endpoints/index.cjs +1 -1
- package/dist/views/admin/webhook-endpoints/index.cjs.map +1 -1
- package/dist/views/admin/webhook-endpoints/index.js +52 -53
- package/dist/views/admin/webhook-endpoints/index.js.map +1 -1
- package/dist/views/cc/index.cjs +1 -1
- package/dist/views/cc/index.cjs.map +1 -1
- package/dist/views/cc/index.js +2 -3
- package/dist/views/dashboard/index.cjs +1 -1
- package/dist/views/dashboard/index.cjs.map +1 -1
- package/dist/views/dashboard/index.js +2 -3
- package/dist/views/delegations/index.cjs +1 -1
- package/dist/views/delegations/index.js +1 -1
- package/dist/views/forms/builder/index.cjs +1 -1
- package/dist/views/forms/builder/index.js +1 -1
- package/dist/views/forms/renderer/FormRendererView.d.cts +24 -1
- package/dist/views/forms/renderer/FormRendererView.d.ts +24 -1
- package/dist/views/forms/renderer/file-upload-field.d.cts +84 -0
- package/dist/views/forms/renderer/file-upload-field.d.ts +84 -0
- package/dist/views/forms/renderer/form-value-readers.d.cts +7 -0
- package/dist/views/forms/renderer/form-value-readers.d.ts +7 -0
- package/dist/views/forms/renderer/index.cjs +1 -1
- package/dist/views/forms/renderer/index.d.cts +1 -0
- package/dist/views/forms/renderer/index.d.ts +1 -0
- package/dist/views/forms/renderer/index.js +1 -1
- package/dist/views/forms/renderer/org-unit-field-options.d.cts +44 -0
- package/dist/views/forms/renderer/org-unit-field-options.d.ts +44 -0
- package/dist/views/forms/renderer/org-unit-field.d.cts +23 -0
- package/dist/views/forms/renderer/org-unit-field.d.ts +23 -0
- package/dist/views/inbox/index.cjs +1 -1
- package/dist/views/inbox/index.cjs.map +1 -1
- package/dist/views/inbox/index.js +133 -137
- package/dist/views/inbox/index.js.map +1 -1
- package/dist/views/instances/approver-filled-form.d.cts +9 -2
- package/dist/views/instances/approver-filled-form.d.ts +9 -2
- package/dist/views/instances/detail/index.cjs +1 -1
- package/dist/views/instances/detail/index.js +1 -1
- package/dist/views/instances/detail/sections/InstanceFormSection.d.cts +19 -2
- package/dist/views/instances/detail/sections/InstanceFormSection.d.ts +19 -2
- package/dist/views/instances/detail/sections/InstanceHistorySection.d.cts +8 -1
- package/dist/views/instances/detail/sections/InstanceHistorySection.d.ts +8 -1
- package/dist/views/instances/detail/sections/container-helpers.d.cts +0 -1
- package/dist/views/instances/detail/sections/container-helpers.d.ts +0 -1
- package/dist/views/instances/detail/sections/shared.d.cts +3 -4
- package/dist/views/instances/detail/sections/shared.d.ts +3 -4
- package/dist/views/instances/instance-error-message.d.cts +5 -0
- package/dist/views/instances/instance-error-message.d.ts +5 -0
- package/dist/views/instances/new/index.cjs +1 -1
- package/dist/views/instances/new/index.cjs.map +1 -1
- package/dist/views/instances/new/index.js +78 -77
- package/dist/views/instances/new/index.js.map +1 -1
- package/dist/views/login/index.cjs +1 -1
- package/dist/views/login/index.js +1 -1
- package/dist/views/search/index.cjs +1 -1
- package/dist/views/search/index.cjs.map +1 -1
- package/dist/views/search/index.js +2 -3
- package/dist/views/sent/index.cjs +1 -1
- package/dist/views/sent/index.cjs.map +1 -1
- package/dist/views/sent/index.js +2 -3
- package/dist/views/settings/index.js +1 -1
- package/dist/views/settings/notifications/index.js +1 -1
- package/dist/views/templates/categories/index.cjs +1 -1
- package/dist/views/templates/categories/index.js +1 -1
- package/dist/views/templates/compose/index.cjs +1 -1
- package/dist/views/templates/compose/index.js +1 -1
- package/dist/views/templates/designer/approver-resolver-model.d.cts +211 -0
- package/dist/views/templates/designer/approver-resolver-model.d.ts +211 -0
- package/dist/views/templates/designer/dry-run-assignee-label.d.cts +2 -0
- package/dist/views/templates/designer/dry-run-assignee-label.d.ts +2 -0
- package/dist/views/templates/designer/dry-run-sample-data.d.cts +6 -0
- package/dist/views/templates/designer/dry-run-sample-data.d.ts +6 -0
- package/dist/views/templates/designer/dynamic-form-resolver-options.d.cts +25 -0
- package/dist/views/templates/designer/dynamic-form-resolver-options.d.ts +25 -0
- package/dist/views/templates/designer/index.cjs +1 -1
- package/dist/views/templates/designer/index.js +1 -1
- package/dist/views/templates/designer/node-actor-resolver-options.d.cts +38 -0
- package/dist/views/templates/designer/node-actor-resolver-options.d.ts +38 -0
- package/dist/views/templates/index.cjs +1 -1
- package/dist/views/templates/index.cjs.map +1 -1
- package/dist/views/templates/index.js +50 -51
- package/dist/views/templates/index.js.map +1 -1
- package/dist/views/templates/versions/index.cjs +1 -1
- package/dist/views/templates/versions/index.cjs.map +1 -1
- package/dist/views/templates/versions/index.js +7 -8
- package/dist/views/templates/versions/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/chunks/FormBuilderView-BVKY1j_0.js.map +0 -1
- package/dist/chunks/FormBuilderView-SrGltzFT.cjs +0 -3
- package/dist/chunks/FormBuilderView-SrGltzFT.cjs.map +0 -1
- package/dist/chunks/FormRendererView-BsTwZkqU.js.map +0 -1
- package/dist/chunks/FormRendererView-GpsE03np.cjs +0 -4
- package/dist/chunks/FormRendererView-GpsE03np.cjs.map +0 -1
- package/dist/chunks/admin-pickers-BRHk3qKq.cjs +0 -2
- package/dist/chunks/admin-pickers-BRHk3qKq.cjs.map +0 -1
- package/dist/chunks/admin-pickers-Djq3h-UR.js.map +0 -1
- package/dist/chunks/approver-filled-form-Dm3Iw7iw.cjs.map +0 -1
- package/dist/chunks/approver-filled-form-ZEwpmsHJ.js.map +0 -1
- package/dist/chunks/compose-B1GlrZW9.js.map +0 -1
- package/dist/chunks/compose-DZk-SfHT.cjs +0 -2
- package/dist/chunks/compose-DZk-SfHT.cjs.map +0 -1
- package/dist/chunks/designer-BCLrjb4H.js.map +0 -1
- package/dist/chunks/designer-BYYxEN9L.cjs +0 -65
- package/dist/chunks/designer-BYYxEN9L.cjs.map +0 -1
- package/dist/chunks/detail-4F39ggBn.js.map +0 -1
- package/dist/chunks/detail-BkMtA_0K.cjs +0 -2
- package/dist/chunks/detail-BkMtA_0K.cjs.map +0 -1
- package/dist/chunks/orgs-BeeDDWL1.cjs +0 -2
- package/dist/chunks/task-node-label-BF6UllxP.cjs +0 -2
- package/dist/chunks/task-node-label-BF6UllxP.cjs.map +0 -1
- package/dist/chunks/task-node-label-CWZgOBj0.js +0 -9
- package/dist/chunks/task-node-label-CWZgOBj0.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delegations-xUt1tj8d.js","names":["_Fragment","styles","useAuth","BPMFormField","formatMemberLabel","Fragment$1","ContentHeader","delegations_module_default","DELEGATION_MODAL_FIELD_LAYOUT","FormFieldLayout","DELEGATION_PAGE_SIZE_OPTIONS","DELEGATION_STATUS_TABS","SCOPE_OPTIONS","SCOPE_FILTER_OPTIONS","AdminDelegationsView","currentMemberId","member","agentMember","setAgentMember","useState","endAt","setEndAt","error","setError","loading","setLoading","memberLoading","setMemberLoading","memberOptions","setMemberOptions","principalFilterMember","setPrincipalFilterMember","agentFilterMember","setAgentFilterMember","modalOpen","setModalOpen","principalMember","setPrincipalMember","priority","setPriority","rulePage","setRulePage","rulePageSize","setRulePageSize","ruleStatus","setRuleStatus","ruleTotalCount","setRuleTotalCount","rules","setRules","saving","setSaving","scopeTemplates","setScopeTemplates","scopeFilterType","setScopeFilterType","scopeType","setScopeType","startAt","setStartAt","templateLoading","setTemplateLoading","templateOptions","setTemplateOptions","refreshRules","useCallback","rulePageResult","members","listDelegationRulesPage","searchMembers","readMemberOption","requestError","readErrorMessage","membersById","useMemo","option","rows","rule","readScopeLabel","selectedScopeType","columns","MemberNameWithEmailTooltip","record","DelegationStatusBadge","Typography","formatDateTime","handleRevoke","revokeDelegationRule","tableActions","handleSearchMembers","searchText","handleSearchTemplates","nextOptions","listApprovalTemplates","readTemplateOption","mergeTemplateOptions","selectedOptions","filterTemplateOptions","openCreateModal","closeCreateModal","handleCreate","isInvalidDelegationDateRange","createDelegationRule","template","PageHeader","Button","PlusIcon","SectionGroup","Section","FilterArea","FilterLine","Filter","MemberAutoCompleteField","FormField","Select","readScopeFilterOption","Tab","readDelegationStatusTabKey","activeKey","TabItem","statusTab","Table","page","pageSize","from","to","total","Modal","readScopeOptionFromValue","AutoComplete","selectedTemplates","readTemplateOptionsFromValue","nextTemplates","currentOptions","open","Input","event","DateTimePicker","formatDelegationDateTimePickerValue","nextValue","readDelegationDateTimePickerValue","autoComplete","onChange","readMemberOptionFromValue","readUniqueMemberOption","options","onSearch","hideLabel","label","isRecord","value","id","name","email","displayName","Tooltip","tooltipProps","normalizedSearchText","matches","item","availableOptions","currentOption","isSelectableDelegationScopeType","status","Badge","date","parseDelegationDateTimeValue","formatDateParts","padDatePart","startDate","endDate","parsedDate","datePart","timePart","year","month","day","hour","minute"],"sources":["../../src/views/admin/delegations/delegations.module.scss","../../src/views/admin/delegations/AdminDelegationsView.tsx"],"sourcesContent":[".delegationModalFields {\n display: grid;\n gap: 12px;\n width: 100%;\n\n :global(.mzn-form-field--horizontal) {\n align-items: flex-start;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label-area) {\n flex: 0 0 112px;\n width: 112px;\n min-width: 112px;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label) {\n flex-wrap: nowrap;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__data-entry) {\n flex: 1 1 auto;\n align-items: stretch;\n min-width: 0;\n max-width: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-auto-complete) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-input),\n :global(.mzn-input-container),\n :global(.mzn-select),\n :global(.mzn-select-trigger),\n :global(.mzn-text-field) {\n width: 100%;\n min-width: 0 !important;\n }\n\n :global(.mzn-select-trigger__input) {\n width: 100%;\n min-width: 0 !important;\n text-overflow: ellipsis;\n }\n}\n\n.delegationFilterArea {\n width: calc(100vw - 272px);\n\n :global(.mzn-filter-area__actions) {\n display: none;\n }\n\n :global(.mzn-filter-area__row) {\n align-items: flex-start;\n }\n\n :global(.mzn-form-field__label-area) {\n display: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-auto-complete) {\n width: 100%;\n }\n}\n\n.memberNameWithTooltip {\n cursor: help;\n text-decoration: underline dotted;\n text-underline-offset: 3px;\n}\n","'use client';\n\nimport {\n ChangeEvent,\n Key,\n ReactElement,\n RefCallback,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n AutoComplete,\n Badge,\n Button,\n DateTimePicker,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Select,\n Tab,\n TabItem,\n Table,\n Tooltip,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport { BPMFormField } from '../../../components/bpm-form-field';\nimport styles from './delegations.module.scss';\nimport { formatDateTime } from '../../../lib/format-date-time';\nimport { useAuth } from '../../../lib/auth-provider';\nimport {\n DelegationRuleRecord,\n DelegationRuleStatus,\n DelegationScopeType,\n MemberProfileRecord,\n createDelegationRule,\n listDelegationRulesPage,\n revokeDelegationRule,\n searchMembers,\n} from '@rytass/bpm-core-client/workflow';\nimport {\n ApprovalTemplateRecord,\n listApprovalTemplates,\n} from '@rytass/bpm-core-client/template';\nimport { formatMemberLabel } from '../../../lib/format-member-label';\n\ntype MemberOption = Readonly<{\n displayName: string;\n email: string | null;\n id: string;\n name: string;\n}>;\n\ntype TemplateOption = Readonly<{\n id: string;\n name: string;\n}>;\n\ntype ScopeOption = Readonly<{\n id: DelegationScopeType;\n name: string;\n}>;\n\ntype ScopeFilterOption = Readonly<{\n id: 'ALL_SCOPES' | DelegationScopeType;\n name: string;\n scopeType: DelegationScopeType | null;\n}>;\n\ntype DelegationRuleRow = Readonly<\n Record<string, unknown> &\n DelegationRuleRecord & {\n agentEmail: string | null;\n agentName: string;\n key: string;\n principalEmail: string | null;\n principalName: string;\n scopeLabel: string;\n }\n>;\n\nconst DELEGATION_MODAL_FIELD_LAYOUT = FormFieldLayout.HORIZONTAL;\nconst DELEGATION_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst DELEGATION_STATUS_TABS: readonly {\n readonly key: DelegationStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'ACTIVE', label: '啟用中' },\n { key: 'REVOKED', label: '已撤銷' },\n { key: 'EXPIRED', label: '已過期' },\n];\n\ntype DelegationStatusTabKey = 'ALL' | DelegationRuleStatus;\n\nconst SCOPE_OPTIONS: readonly ScopeOption[] = [\n { id: 'ALL', name: '全部簽核' },\n { id: 'TEMPLATE_LIST', name: '指定模板' },\n];\n\nconst SCOPE_FILTER_OPTIONS: readonly ScopeFilterOption[] = [\n { id: 'ALL_SCOPES', name: '全部範圍', scopeType: null },\n { id: 'ALL', name: '全部簽核', scopeType: 'ALL' },\n { id: 'TEMPLATE_LIST', name: '指定模板', scopeType: 'TEMPLATE_LIST' },\n];\n\n\nexport function AdminDelegationsView(): ReactElement {\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [agentMember, setAgentMember] = useState<MemberOption | null>(null);\n const [endAt, setEndAt] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [memberLoading, setMemberLoading] = useState(false);\n const [memberOptions, setMemberOptions] = useState<readonly MemberOption[]>(\n [],\n );\n const [principalFilterMember, setPrincipalFilterMember] =\n useState<MemberOption | null>(null);\n const [agentFilterMember, setAgentFilterMember] =\n useState<MemberOption | null>(null);\n const [modalOpen, setModalOpen] = useState(false);\n const [principalMember, setPrincipalMember] = useState<MemberOption | null>(\n null,\n );\n const [priority, setPriority] = useState('100');\n const [rulePage, setRulePage] = useState(1);\n const [rulePageSize, setRulePageSize] = useState(10);\n const [ruleStatus, setRuleStatus] = useState<DelegationStatusTabKey>('ALL');\n const [ruleTotalCount, setRuleTotalCount] = useState(0);\n const [rules, setRules] = useState<readonly DelegationRuleRecord[]>([]);\n const [saving, setSaving] = useState(false);\n const [scopeTemplates, setScopeTemplates] = useState<\n readonly TemplateOption[]\n >([]);\n const [scopeFilterType, setScopeFilterType] = useState<ScopeFilterOption>(\n SCOPE_FILTER_OPTIONS[0],\n );\n const [scopeType, setScopeType] = useState<ScopeOption>(SCOPE_OPTIONS[0]);\n const [startAt, setStartAt] = useState('');\n const [templateLoading, setTemplateLoading] = useState(false);\n const [templateOptions, setTemplateOptions] = useState<\n readonly TemplateOption[]\n >([]);\n\n const refreshRules = useCallback(async (): Promise<void> => {\n setLoading(true);\n setError(null);\n\n try {\n const [rulePageResult, members] = await Promise.all([\n listDelegationRulesPage({\n agentMemberId: agentFilterMember?.id ?? null,\n includeInactive: true,\n page: rulePage,\n pageSize: rulePageSize,\n principalMemberId: principalFilterMember?.id ?? null,\n scopeType: scopeFilterType.scopeType,\n status: ruleStatus === 'ALL' ? null : ruleStatus,\n }),\n searchMembers(''),\n ]);\n\n setRules(rulePageResult.rules);\n setRuleTotalCount(rulePageResult.totalCount);\n setMemberOptions(members.map(readMemberOption));\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, [\n agentFilterMember,\n principalFilterMember,\n rulePage,\n rulePageSize,\n ruleStatus,\n scopeFilterType,\n ]);\n\n useEffect((): void => {\n void refreshRules();\n }, [refreshRules]);\n\n const membersById = useMemo(\n (): ReadonlyMap<string, MemberOption> =>\n new Map(memberOptions.map((option) => [option.id, option])),\n [memberOptions],\n );\n const rows = useMemo(\n (): DelegationRuleRow[] =>\n rules.map((rule) => ({\n ...rule,\n agentEmail: membersById.get(rule.agentMemberId)?.email ?? null,\n agentName:\n membersById.get(rule.agentMemberId)?.displayName ??\n rule.agentMemberId,\n key: rule.id,\n principalEmail: membersById.get(rule.principalMemberId)?.email ?? null,\n principalName:\n membersById.get(rule.principalMemberId)?.displayName ??\n rule.principalMemberId,\n scopeLabel: readScopeLabel(rule),\n })),\n [membersById, rules],\n );\n const selectedScopeType =\n SCOPE_OPTIONS.find((option) => option.id === scopeType.id) ??\n SCOPE_OPTIONS[0];\n const columns = useMemo(\n (): TableColumn<DelegationRuleRow>[] => [\n {\n key: 'principal',\n render: (record: DelegationRuleRow): ReactElement => (\n <MemberNameWithEmailTooltip\n email={record.principalEmail}\n name={record.principalName}\n />\n ),\n title: '原簽核人',\n width: 220,\n },\n {\n key: 'agent',\n render: (record: DelegationRuleRow): ReactElement => (\n <MemberNameWithEmailTooltip\n email={record.agentEmail}\n name={record.agentName}\n />\n ),\n title: '代理人',\n width: 220,\n },\n { dataIndex: 'scopeLabel', key: 'scope', title: '代理範圍', width: 220 },\n {\n key: 'status',\n render: (record: DelegationRuleRow): ReactElement => (\n <DelegationStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n { dataIndex: 'priority', key: 'priority', title: '優先序', width: 100 },\n {\n key: 'startAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(record.startAt)}\n </Typography>\n ),\n title: '開始時間',\n width: 220,\n },\n {\n key: 'endAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {record.endAt ? formatDateTime(record.endAt) : '-'}\n </Typography>\n ),\n title: '結束時間',\n width: 220,\n },\n ],\n [],\n );\n const handleRevoke = useCallback(\n async (id: string): Promise<void> => {\n if (!currentMemberId) {\n return;\n }\n\n setError(null);\n\n try {\n await revokeDelegationRule({\n id,\n revokedByMemberId: currentMemberId,\n });\n await refreshRules();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n }\n },\n [currentMemberId, refreshRules],\n );\n const tableActions = useMemo(\n (): TableActions<DelegationRuleRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<DelegationRuleRow>['render']> =>\n record.status === 'ACTIVE'\n ? [\n {\n name: '撤銷',\n onClick: (): void => void handleRevoke(record.id),\n },\n ]\n : [],\n variant: 'destructive-secondary',\n width: 88,\n }),\n [handleRevoke],\n );\n\n async function handleSearchMembers(searchText: string): Promise<void> {\n setMemberLoading(true);\n\n try {\n setMemberOptions((await searchMembers(searchText)).map(readMemberOption));\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setMemberLoading(false);\n }\n }\n\n async function handleSearchTemplates(\n searchText: string,\n selectedOptions: readonly TemplateOption[] = scopeTemplates,\n ): Promise<void> {\n setTemplateLoading(true);\n\n try {\n const nextOptions = (await listApprovalTemplates()).map(\n readTemplateOption,\n );\n\n setTemplateOptions(\n mergeTemplateOptions(\n selectedOptions,\n filterTemplateOptions(nextOptions, searchText),\n ),\n );\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setTemplateLoading(false);\n }\n }\n\n function openCreateModal(): void {\n setAgentMember(null);\n setEndAt('');\n setPrincipalMember(null);\n setPriority('100');\n setScopeTemplates([]);\n setScopeType(SCOPE_OPTIONS[0]);\n setStartAt('');\n setTemplateOptions([]);\n void handleSearchTemplates('', []);\n setModalOpen(true);\n }\n\n function closeCreateModal(): void {\n if (saving) {\n return;\n }\n\n setModalOpen(false);\n }\n\n async function handleCreate(): Promise<void> {\n if (!currentMemberId) {\n return;\n }\n\n if (!principalMember || !agentMember) {\n setError('請選擇原簽核人與代理人');\n return;\n }\n\n if (selectedScopeType.id === 'TEMPLATE_LIST' && scopeTemplates.length < 1) {\n setError('請選擇至少一個簽核模板');\n return;\n }\n\n if (isInvalidDelegationDateRange(startAt, endAt)) {\n setError('結束時間必須晚於起始時間');\n return;\n }\n\n setSaving(true);\n setError(null);\n\n try {\n await createDelegationRule({\n agentMemberId: agentMember.id,\n createdByMemberId: currentMemberId,\n endAt: endAt || null,\n principalMemberId: principalMember.id,\n priority: Number(priority) || 100,\n requiresConfirmation: false,\n scopeConditionCel: null,\n scopeTemplateIds:\n selectedScopeType.id === 'TEMPLATE_LIST'\n ? scopeTemplates.map((template) => template.id)\n : [],\n scopeType: selectedScopeType.id,\n startAt: startAt || null,\n });\n setModalOpen(false);\n if (rulePage === 1) {\n await refreshRules();\n } else {\n setRulePage(1);\n }\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <>\n <PageHeader>\n <ContentHeader\n description=\"設定簽核代理規則,讓符合範圍的待簽任務自動改派給代理人。\"\n title=\"代理設定\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={openCreateModal}\n variant=\"base-primary\"\n >\n 建立代理\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.delegationFilterArea}>\n <FilterLine>\n <Filter span={2}>\n <MemberAutoCompleteField\n hideLabel\n label=\"原簽核人\"\n loading={memberLoading}\n name=\"principalFilterMemberId\"\n onChange={(option): void => {\n setPrincipalFilterMember(option);\n setRulePage(1);\n }}\n onSearch={handleSearchMembers}\n options={memberOptions}\n required={false}\n layout={FormFieldLayout.VERTICAL}\n size=\"sub\"\n value={principalFilterMember}\n />\n </Filter>\n <Filter span={2}>\n <MemberAutoCompleteField\n hideLabel\n label=\"代理人\"\n loading={memberLoading}\n name=\"agentFilterMemberId\"\n onChange={(option): void => {\n setAgentFilterMember(option);\n setRulePage(1);\n }}\n onSearch={handleSearchMembers}\n options={memberOptions}\n required={false}\n layout={FormFieldLayout.VERTICAL}\n size=\"sub\"\n value={agentFilterMember}\n />\n </Filter>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"scopeFilterType\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => {\n setScopeFilterType(readScopeFilterOption(option));\n setRulePage(1);\n }}\n options={[...SCOPE_FILTER_OPTIONS]}\n placeholder=\"代理範圍\"\n size=\"sub\"\n value={scopeFilterType}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={ruleStatus}\n onChange={(activeKey): void => {\n setRuleStatus(readDelegationStatusTabKey(activeKey));\n setRulePage(1);\n }}\n >\n {DELEGATION_STATUS_TABS.map((statusTab) => (\n <TabItem key={statusTab.key}>{statusTab.label}</TabItem>\n ))}\n </Tab>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <Table\n actions={tableActions}\n columns={columns}\n dataSource={rows}\n fullWidth\n loading={loading}\n pagination={{\n current: rulePage,\n onChange: (page): void => {\n setRulePage(page);\n },\n onChangePageSize: (pageSize): void => {\n setRulePage(1);\n setRulePageSize(pageSize);\n },\n pageSize: rulePageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: DELEGATION_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: ruleTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{\n disabled: !principalMember || !agentMember,\n }}\n confirmText=\"建立代理\"\n loading={saving}\n modalType=\"standard\"\n onCancel={closeCreateModal}\n onClose={closeCreateModal}\n onConfirm={(): void => void handleCreate()}\n open={modalOpen}\n showModalFooter\n showModalHeader\n size=\"regular\"\n supportingText=\"代理生效後,後續建立的待簽任務會依範圍自動指派。\"\n title=\"建立代理\"\n >\n <div className={styles.delegationModalFields}>\n <MemberAutoCompleteField\n label=\"原簽核人\"\n loading={memberLoading}\n name=\"principalMemberId\"\n onChange={setPrincipalMember}\n onSearch={handleSearchMembers}\n options={memberOptions}\n value={principalMember}\n />\n <MemberAutoCompleteField\n label=\"代理人\"\n loading={memberLoading}\n name=\"agentMemberId\"\n onChange={setAgentMember}\n onSearch={handleSearchMembers}\n options={memberOptions}\n value={agentMember}\n />\n <BPMFormField label=\"代理範圍\" name=\"scopeType\" required>\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void =>\n setScopeType(readScopeOptionFromValue(option))\n }\n options={[...SCOPE_OPTIONS]}\n value={selectedScopeType}\n />\n </BPMFormField>\n {selectedScopeType.id === 'TEMPLATE_LIST' ? (\n <BPMFormField label=\"簽核模板\" name=\"scopeTemplateIds\" required>\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的模板\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name: 'scopeTemplateIds',\n spellCheck: false,\n }}\n loading={templateLoading}\n loadingText=\"搜尋模板中...\"\n mode=\"multiple\"\n onChange={(nextTemplates): void => {\n const selectedTemplates =\n readTemplateOptionsFromValue(nextTemplates);\n\n setScopeTemplates(selectedTemplates);\n setTemplateOptions((currentOptions) =>\n mergeTemplateOptions(selectedTemplates, currentOptions),\n );\n }}\n onSearch={handleSearchTemplates}\n onVisibilityChange={(open): void => {\n if (open) {\n void handleSearchTemplates('');\n }\n }}\n options={[...templateOptions]}\n overflowStrategy=\"wrap\"\n placeholder=\"搜尋並選取簽核模板\"\n searchDebounceTime={300}\n value={[...scopeTemplates]}\n />\n </BPMFormField>\n ) : null}\n <BPMFormField\n hintText=\"數字越大越優先。同一位被代理人同時命中多條規則時,採用優先序最高的那條;優先序相同時採用較早建立的。\"\n label=\"優先序\"\n name=\"priority\"\n >\n <Input\n fullWidth\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n setPriority(event.target.value)\n }\n value={priority}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"起始時間\" name=\"startAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setStartAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"留空立即生效\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(startAt)}\n />\n </BPMFormField>\n <BPMFormField label=\"結束時間\" name=\"endAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setEndAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"可留空\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(endAt)}\n />\n </BPMFormField>\n </div>\n </Modal>\n </>\n );\n}\n\nfunction MemberAutoCompleteField({\n hideLabel = false,\n label,\n layout = DELEGATION_MODAL_FIELD_LAYOUT,\n loading,\n name,\n onChange,\n onSearch,\n options,\n required = true,\n size,\n value,\n}: {\n readonly hideLabel?: boolean;\n readonly label: string;\n readonly layout?: FormFieldLayout;\n readonly loading: boolean;\n readonly name: string;\n readonly onChange: (option: MemberOption | null) => void;\n readonly onSearch: (searchText: string) => Promise<void>;\n readonly options: readonly MemberOption[];\n readonly required?: boolean;\n readonly size?: 'main' | 'sub';\n readonly value: MemberOption | null;\n}): ReactElement {\n const autoComplete = (\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的成員\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name,\n spellCheck: false,\n }}\n loading={loading}\n loadingText=\"搜尋成員中...\"\n mode=\"single\"\n onChange={(option): void => onChange(readMemberOptionFromValue(option))}\n onSearch={onSearch}\n onSearchTextChange={(searchText): void =>\n onChange(readUniqueMemberOption(searchText, options))\n }\n onVisibilityChange={(open): void => {\n if (open) {\n void onSearch('');\n }\n }}\n options={[...options]}\n placeholder={hideLabel ? label : '搜尋姓名或信箱'}\n searchDebounceTime={300}\n size={size}\n value={value}\n />\n );\n\n if (hideLabel) {\n return (\n <FormField fullWidth layout={layout} name={name}>\n {autoComplete}\n </FormField>\n );\n }\n\n return (\n <BPMFormField label={label} layout={layout} name={name} required={required}>\n {autoComplete}\n </BPMFormField>\n );\n}\n\nfunction readMemberOption(member: MemberProfileRecord): MemberOption {\n return {\n displayName: member.name,\n email: member.email,\n id: member.memberId,\n name: formatMemberLabel(member.name, member.email, 'dot'),\n };\n}\n\nfunction readMemberOptionFromValue(value: unknown): MemberOption | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const id = value.id;\n const name = value.name;\n const email = value.email;\n const displayName = value.displayName;\n\n return typeof id === 'string' && typeof name === 'string'\n ? {\n displayName: typeof displayName === 'string' ? displayName : name,\n email: typeof email === 'string' ? email : null,\n id,\n name,\n }\n : null;\n}\n\nfunction MemberNameWithEmailTooltip({\n email,\n name,\n}: {\n readonly email: string | null;\n readonly name: string;\n}): ReactElement {\n if (!email) {\n return <span>{name}</span>;\n }\n\n return (\n <Tooltip title={email}>\n {({ ref, ...tooltipProps }): ReactElement => (\n // Spread the whole payload, as `TooltipProps` asks: picking only the\n // mouse handlers drops `aria-describedby`, so assistive tech never\n // learns the open tooltip describes this name.\n <span\n {...tooltipProps}\n className={styles.memberNameWithTooltip}\n ref={ref as RefCallback<HTMLSpanElement>}\n >\n {name}\n </span>\n )}\n </Tooltip>\n );\n}\n\nfunction readUniqueMemberOption(\n searchText: string,\n options: readonly MemberOption[],\n): MemberOption | null {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return null;\n }\n\n const matches = options.filter((option) =>\n [option.id, option.name, option.email ?? ''].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n\n return matches.length === 1 ? (matches[0] ?? null) : null;\n}\n\nfunction readTemplateOption(template: ApprovalTemplateRecord): TemplateOption {\n return {\n id: template.id,\n name: template.name,\n };\n}\n\nfunction readTemplateOptionsFromValue(\n value: readonly unknown[],\n): readonly TemplateOption[] {\n return value.flatMap((item): readonly TemplateOption[] => {\n if (!isRecord(item)) {\n return [];\n }\n\n const id = item.id;\n const name = item.name;\n\n return typeof id === 'string' && typeof name === 'string'\n ? [{ id, name }]\n : [];\n });\n}\n\nfunction filterTemplateOptions(\n options: readonly TemplateOption[],\n searchText: string,\n): readonly TemplateOption[] {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return options;\n }\n\n return options.filter((option) =>\n [option.id, option.name].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n}\n\nfunction mergeTemplateOptions(\n selectedOptions: readonly TemplateOption[],\n availableOptions: readonly TemplateOption[],\n): readonly TemplateOption[] {\n return [...selectedOptions, ...availableOptions].reduce<TemplateOption[]>(\n (options, option) =>\n options.some((currentOption) => currentOption.id === option.id)\n ? options\n : [...options, option],\n [],\n );\n}\n\nfunction readScopeOptionFromValue(value: unknown): ScopeOption {\n if (!isRecord(value) || !isSelectableDelegationScopeType(value.id)) {\n return SCOPE_OPTIONS[0];\n }\n\n return (\n SCOPE_OPTIONS.find((option) => option.id === value.id) ?? SCOPE_OPTIONS[0]\n );\n}\n\nfunction readScopeFilterOption(value: unknown): ScopeFilterOption {\n if (!isRecord(value)) {\n return SCOPE_FILTER_OPTIONS[0];\n }\n\n const id = value.id;\n\n return (\n SCOPE_FILTER_OPTIONS.find((option) => option.id === id) ??\n SCOPE_FILTER_OPTIONS[0]\n );\n}\n\nfunction isSelectableDelegationScopeType(\n value: unknown,\n): value is ScopeOption['id'] {\n return value === 'ALL' || value === 'TEMPLATE_LIST';\n}\n\nfunction readScopeLabel(rule: DelegationRuleRecord): string {\n if (rule.scopeType === 'ALL') {\n return '全部簽核';\n }\n\n if (rule.scopeType === 'TEMPLATE_LIST') {\n return `指定模板:${rule.scopeTemplateIds.length}`;\n }\n\n return rule.scopeConditionCel ? `條件:${rule.scopeConditionCel}` : '條件式';\n}\n\nfunction DelegationStatusBadge({\n status,\n}: {\n readonly status: DelegationRuleRecord['status'];\n}): ReactElement {\n if (status === 'ACTIVE') {\n return <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />;\n }\n\n if (status === 'REVOKED') {\n return <Badge size=\"sub\" text=\"已撤銷\" variant=\"dot-inactive\" />;\n }\n\n if (status === 'EXPIRED') {\n return <Badge size=\"sub\" text=\"已過期\" variant=\"dot-warning\" />;\n }\n\n return <Badge size=\"sub\" text={status} variant=\"dot-info\" />;\n}\n\nfunction readDelegationStatusTabKey(activeKey: Key): DelegationStatusTabKey {\n if (\n activeKey === 'ACTIVE' ||\n activeKey === 'REVOKED' ||\n activeKey === 'EXPIRED'\n ) {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction readDelegationDateTimePickerValue(value: string): string | undefined {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date\n ? `${formatDateParts(date)}T${padDatePart(date.getHours())}:${padDatePart(\n date.getMinutes(),\n )}`\n : undefined;\n}\n\nfunction formatDelegationDateTimePickerValue(\n value: string | undefined,\n): string {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date ? date.toISOString() : '';\n}\n\nfunction isInvalidDelegationDateRange(startAt: string, endAt: string): boolean {\n if (!startAt || !endAt) {\n return false;\n }\n\n const startDate = parseDelegationDateTimeValue(startAt);\n const endDate = parseDelegationDateTimeValue(endAt);\n\n return !!startDate && !!endDate && endDate.getTime() <= startDate.getTime();\n}\n\nfunction parseDelegationDateTimeValue(value: string): Date | null {\n if (value.endsWith('Z') || /[+-]\\d{2}:\\d{2}$/.test(value)) {\n const parsedDate = new Date(value);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n }\n\n const [datePart = '', timePart = '00:00'] = value.split('T');\n const [year = 0, month = 1, day = 1] = datePart.split('-').map(Number);\n const [hour = 0, minute = 0] = timePart.split(':').map(Number);\n const parsedDate = new Date(year, month - 1, day, hour, minute);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n}\n\nfunction formatDateParts(date: Date): string {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(\n date.getDate(),\n )}`;\n}\n\nfunction padDatePart(value: number): string {\n return String(value).padStart(2, '0');\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;GC4FMQ,IAAgCC,EAAgB,YAChDC,KAA+B;CAAC;CAAI;CAAI;AAAE,GAC1CC,KAGA;CACJ;EAAE,KAAK;EAAO,OAAO;CAAK;CAC1B;EAAE,KAAK;EAAU,OAAO;CAAM;CAC9B;EAAE,KAAK;EAAW,OAAO;CAAM;CAC/B;EAAE,KAAK;EAAW,OAAO;CAAM;AACjC,GAIMC,IAAwC,CAC5C;CAAE,IAAI;CAAO,MAAM;AAAO,GAC1B;CAAE,IAAI;CAAiB,MAAM;AAAO,CACtC,GAEMC,IAAqD;CACzD;EAAE,IAAI;EAAc,MAAM;EAAQ,WAAW;CAAK;CAClD;EAAE,IAAI;EAAO,MAAM;EAAQ,WAAW;CAAM;CAC5C;EAAE,IAAI;EAAiB,MAAM;EAAQ,WAAW;CAAgB;AAClE;AAGA,SAAgBC,IAAqC;CACnD,IAAM,EAAE,cAAWZ,EAAQ,GACrBa,IAAkBC,GAAQ,YAAY,MACtC,CAACC,GAAaC,KAAkBC,EAA8B,IAAI,GAClE,CAACC,GAAOC,KAAYF,EAAS,EAAE,GAC/B,CAACG,GAAOC,KAAYJ,EAAwB,IAAI,GAChD,CAACK,GAASC,KAAcN,EAAS,EAAI,GACrC,CAACO,GAAeC,KAAoBR,EAAS,EAAK,GAClD,CAACS,GAAeC,MAAoBV,EACxC,CAAC,CACH,GACM,CAACW,GAAuBC,MAC5BZ,EAA8B,IAAI,GAC9B,CAACa,GAAmBC,MACxBd,EAA8B,IAAI,GAC9B,CAACe,IAAWC,KAAgBhB,EAAS,EAAK,GAC1C,CAACiB,GAAiBC,MAAsBlB,EAC5C,IACF,GACM,CAACmB,IAAUC,MAAepB,EAAS,KAAK,GACxC,CAACqB,GAAUC,KAAetB,EAAS,CAAC,GACpC,CAACuB,GAAcC,MAAmBxB,EAAS,EAAE,GAC7C,CAACyB,GAAYC,MAAiB1B,EAAiC,KAAK,GACpE,CAAC2B,IAAgBC,MAAqB5B,EAAS,CAAC,GAChD,CAAC6B,IAAOC,MAAY9B,EAA0C,CAAC,CAAC,GAChE,CAAC+B,IAAQC,MAAahC,EAAS,EAAK,GACpC,CAACiC,GAAgBC,MAAqBlC,EAE1C,CAAC,CAAC,GACE,CAACmC,GAAiBC,MAAsBpC,EAC5CN,EAAqB,EACvB,GACM,CAAC2C,IAAWC,MAAgBtC,EAAsBP,EAAc,EAAE,GAClE,CAAC8C,GAASC,KAAcxC,EAAS,EAAE,GACnC,CAACyC,IAAiBC,MAAsB1C,EAAS,EAAK,GACtD,CAAC2C,IAAiBC,KAAsB5C,EAE5C,CAAC,CAAC,GAEE6C,IAAeC,EAAY,YAA2B;EAE1D,AADAxC,EAAW,EAAI,GACfF,EAAS,IAAI;EAEb,IAAI;GACF,IAAM,CAAC2C,GAAgBC,KAAW,MAAM,QAAQ,IAAI,CAClDC,GAAwB;IACtB,eAAepC,GAAmB,MAAM;IACxC,iBAAiB;IACjB,MAAMQ;IACN,UAAUE;IACV,mBAAmBZ,GAAuB,MAAM;IAChD,WAAWwB,EAAgB;IAC3B,QAAQV,MAAe,QAAQ,OAAOA;GACxC,CAAC,GACDyB,GAAc,EAAE,CAClB,CAAC;GAID,AAFApB,GAASiB,EAAe,KAAK,GAC7BnB,GAAkBmB,EAAe,UAAU,GAC3CrC,GAAiBsC,EAAQ,IAAIG,EAAgB,CAAC;EAChD,SAASC,GAAuB;GAC9B,EAASC,EAAiBD,CAAY,CAAC;EACzC,UAAU;GACR,EAAW,EAAK;EAClB;CACF,GAAG;EACDvC;EACAF;EACAU;EACAE;EACAE;EACAU;CACF,CAAC;CAED,QAAsB;EACpB,EAAkB;CACpB,GAAG,CAACU,CAAY,CAAC;CAEjB,IAAMS,IAAcC,QAEhB,IAAI,IAAI9C,EAAc,KAAK,MAAW,CAAC+C,EAAO,IAAIA,CAAM,CAAC,CAAC,GAC5D,CAAC/C,CAAa,CAChB,GACMgD,KAAOF,QAET1B,GAAM,KAAK,OAAU;EACnB,GAAG6B;EACH,YAAYJ,EAAY,IAAII,EAAK,aAAa,CAAC,EAAE,SAAS;EAC1D,WACEJ,EAAY,IAAII,EAAK,aAAa,CAAC,EAAE,eACrCA,EAAK;EACP,KAAKA,EAAK;EACV,gBAAgBJ,EAAY,IAAII,EAAK,iBAAiB,CAAC,EAAE,SAAS;EAClE,eACEJ,EAAY,IAAII,EAAK,iBAAiB,CAAC,EAAE,eACzCA,EAAK;EACP,YAAYC,GAAeD,CAAI;CACjC,EAAE,GACJ,CAACJ,GAAazB,EAAK,CACrB,GACM+B,IACJnE,EAAc,MAAM,MAAW+D,EAAO,OAAOnB,GAAU,EAAE,KACzD5C,EAAc,IACVoE,KAAUN,QAC0B;EACtC;GACE,KAAK;GACL,SAAS,MACP,kBAACO,IAAD;IACE,OAAOC,EAAO;IACd,MAAMA,EAAO;GACd,CAAA;GAEH,OAAO;GACP,OAAO;EACT;EACA;GACE,KAAK;GACL,SAAS,MACP,kBAACD,IAAD;IACE,OAAOC,EAAO;IACd,MAAMA,EAAO;GACd,CAAA;GAEH,OAAO;GACP,OAAO;EACT;EACA;GAAE,WAAW;GAAc,KAAK;GAAS,OAAO;GAAQ,OAAO;EAAI;EACnE;GACE,KAAK;GACL,SAAS,MACP,kBAACC,IAAD,EAAuB,QAAQD,EAAO,OAAS,CAAA;GAEjD,OAAO;GACP,OAAO;EACT;EACA;GAAE,WAAW;GAAY,KAAK;GAAY,OAAO;GAAO,OAAO;EAAI;EACnE;GACE,KAAK;GACL,SAAS,MACP,kBAACE,GAAD;IAAY,WAAU;IAAO,SAAQ;IAClC,UAAAC,EAAeH,EAAO,OAAO;GACpB,CAAA;GAEd,OAAO;GACP,OAAO;EACT;EACA;GACE,KAAK;GACL,SAAS,MACP,kBAACE,GAAD;IAAY,WAAU;IAAO,SAAQ;IAClC,UAAAF,EAAO,QAAQG,EAAeH,EAAO,KAAK,IAAI;GACrC,CAAA;GAEd,OAAO;GACP,OAAO;EACT;CACF,GACA,CAAC,CACH,GACMI,KAAerB,EACnB,OAAO,MAA8B;EACnC,IAAKlD,GAIL;KAAS,IAAI;GAEb,IAAI;IAKF,AAJA,MAAMwE,GAAqB;KACzB;KACA,mBAAmBxE;IACrB,CAAC,GACD,MAAMiD,EAAa;GACrB,SAASO,GAAuB;IAC9B,EAASC,EAAiBD,CAAY,CAAC;GACzC;EAVa;CAWf,GACA,CAACxD,GAAiBiD,CAAY,CAChC,GACMwB,KAAed,SACqB;EACtC,SACE,MAEAQ,EAAO,WAAW,WACd,CACE;GACE,MAAM;GACN,eAAqB,KAAKI,GAAaJ,EAAO,EAAE;EAClD,CACF,IACA,CAAC;EACP,SAAS;EACT,OAAO;CACT,IACA,CAACI,EAAY,CACf;CAEA,eAAeG,EAAoB,GAAmC;EACpE,EAAiB,EAAI;EAErB,IAAI;GACF,IAAkB,MAAMpB,GAAcqB,CAAU,EAAA,CAAG,IAAIpB,EAAgB,CAAC;EAC1E,SAASC,GAAuB;GAC9B,EAASC,EAAiBD,CAAY,CAAC;EACzC,UAAU;GACR,EAAiB,EAAK;EACxB;CACF;CAEA,eAAeoB,EACb,GACA,IAA6CvC,GAC9B;EACf,GAAmB,EAAI;EAEvB,IAAI;GACF,IAAMwC,KAAe,MAAMC,GAAsB,EAAA,CAAG,IAClDC,EACF;GAEA,EACEC,GACEC,GACAC,GAAsBL,GAAaF,CAAU,CAC/C,CACF;EACF,SAASnB,GAAuB;GAC9B,EAASC,EAAiBD,CAAY,CAAC;EACzC,UAAU;GACR,GAAmB,EAAK;EAC1B;CACF;CAEA,SAAS2B,KAAwB;EAU/B,AATAhF,EAAe,IAAI,GACnBG,EAAS,EAAE,GACXgB,GAAmB,IAAI,GACvBE,GAAY,KAAK,GACjBc,GAAkB,CAAC,CAAC,GACpBI,GAAa7C,EAAc,EAAE,GAC7B+C,EAAW,EAAE,GACbI,EAAmB,CAAC,CAAC,GACrB4B,EAA2B,IAAI,CAAC,CAAC,GACjCxD,EAAa,EAAI;CACnB;CAEA,SAASgE,KAAyB;EAChC,AAAIjD,MAIJf,EAAa,EAAK;CACpB;CAEA,eAAeiE,KAA8B;EAC3C,IAAKrF,GAIL;OAAI,CAACqB,KAAmB,CAACnB,GACvB,EAAS,aAAa;QAIxB,IAAI8D,EAAkB,OAAO,mBAAmB3B,EAAe,SAAS,GACtE,EAAS,aAAa;QAIxB,IAAIiD,GAA6B3C,GAAStC,CAAK,GAC7C,EAAS,cAAc;QAIzB;IACA,AADA+B,GAAU,EAAI,GACd5B,EAAS,IAAI;IAEb,IAAI;KAiBF,AAhBA,MAAM+E,GAAqB;MACzB,eAAerF,EAAY;MAC3B,mBAAmBF;MACnB,OAAOK,KAAS;MAChB,mBAAmBgB,EAAgB;MACnC,UAAU,OAAOE,EAAQ,KAAK;MAC9B,sBAAsB;MACtB,mBAAmB;MACnB,kBACEyC,EAAkB,OAAO,kBACrB3B,EAAe,KAAK,MAAamD,EAAS,EAAE,IAC5C,CAAC;MACP,WAAWxB,EAAkB;MAC7B,SAASrB,KAAW;KACtB,CAAC,GACDvB,EAAa,EAAK,GACdK,MAAa,IACf,MAAMwB,EAAa,IAEnBvB,EAAY,CAAC;IAEjB,SAAS8B,GAAuB;KAC9B,EAASC,EAAiBD,CAAY,CAAC;IACzC,UAAU;KACR,GAAU,EAAK;IACjB;GA7Bc;EAZd;CA0CF;CAEA,OACE,kBAAAvE,IAAA,EAAA,UAAA;EACI,kBAACwG,IAAD,EAAA,UACE,kBAAClG,IAAD;GACE,aAAY;GACZ,OAAM;GAEN,UAAA,kBAACmG,IAAD;IACE,MAAMC;IACN,UAAS;IACT,SAASR;IACT,SAAQ;IACT,UAAA;GAEO,CAAA;EACK,CAAA,EACL,CAAA;EAEZ,kBAACS,IAAD,EAAA,UACE,kBAACC,IAAD;GACE,YACE,kBAACC,GAAD;IAAY,WAAW5G,EAAO;IAC5B,UAAA,kBAAC6G,IAAD,EAAA,UAAA;KACE,kBAACC,GAAD;MAAQ,MAAM;MACZ,UAAA,kBAACC,GAAD;OACE,WAAA;OACA,OAAM;OACN,SAAStF;OACT,MAAK;OACL,WAAW,MAAiB;QAE1B,AADAK,GAAyB4C,CAAM,GAC/BlC,EAAY,CAAC;OACf;OACA,UAAUgD;OACV,SAAS7D;OACT,UAAU;OACV,QAAQnB,EAAgB;OACxB,MAAK;OACL,OAAOqB;MACR,CAAA;KACK,CAAA;KACR,kBAACiF,GAAD;MAAQ,MAAM;MACZ,UAAA,kBAACC,GAAD;OACE,WAAA;OACA,OAAM;OACN,SAAStF;OACT,MAAK;OACL,WAAW,MAAiB;QAE1B,AADAO,GAAqB0C,CAAM,GAC3BlC,EAAY,CAAC;OACf;OACA,UAAUgD;OACV,SAAS7D;OACT,UAAU;OACV,QAAQnB,EAAgB;OACxB,MAAK;OACL,OAAOuB;MACR,CAAA;KACK,CAAA;KACR,kBAAC+E,GAAD;MAAQ,MAAM;MACZ,UAAA,kBAACE,GAAD;OACE,WAAA;OACA,QAAQxG,EAAgB;OACxB,MAAK;OAEL,UAAA,kBAACyG,IAAD;QACE,WAAW;QACX,WAAA;QACA,WAAW,MAAiB;SAE1B,AADA3D,GAAmB4D,GAAsBxC,CAAM,CAAC,GAChDlC,EAAY,CAAC;QACf;QACA,SAAS,CAAC,GAAG5B,CAAoB;QACjC,aAAY;QACZ,MAAK;QACL,OAAOyC;OACR,CAAA;MACQ,CAAA;KACL,CAAA;IACE,EAAA,CAAA;GACF,CAAA;GAEd,KACE,kBAAC8D,IAAD;IACE,WAAWxE;IACX,WAAW,MAAoB;KAE7B,AADAC,GAAcwE,GAA2BC,CAAS,CAAC,GACnD7E,EAAY,CAAC;IACf;IAEC,UAAA9B,GAAuB,KAAK,MAC3B,kBAAC4G,IAAD,EAAA,UAA8BC,EAAU,MAAe,GAAzCA,EAAU,GAA+B,CACxD;GACE,CAAA;GA1ET,UAAA,CA6EGlG,IACC,kBAAC8D,GAAD;IAAY,OAAM;IAAa,SAAQ;IACpC,UAAA9D;GACS,CAAA,IACV,MACJ,kBAACmG,IAAD;IACE,SAASjC;IACA;IACT,YAAYZ;IACZ,WAAA;IACS;IACT,YAAY;KACV,SAASpC;KACT,WAAW,MAAe;MACxB,EAAYkF,CAAI;KAClB;KACA,mBAAmB,MAAmB;MAEpC,AADAjF,EAAY,CAAC,GACbE,GAAgBgF,CAAQ;KAC1B;KACA,UAAUjF;KACV,eAAe;KACf,iBAAiBhC;KACjB,sBAAsB,GAAM,GAAI,MAC9B,MAAMkH,EAAK,GAAGC,EAAG,OAAOC,EAAM;KAChC,qBAAqB;KACrB,OAAOhF;IACT;GACD,CAAA,CACM;EACG,CAAA,EAAA,CAAA;EAEd,kBAACiF,IAAD;GACE,YAAW;GACX,oBAAoB,EAClB,UAAU,CAAC3F,KAAmB,CAACnB,EACjC;GACA,aAAY;GACZ,SAASiC;GACT,WAAU;GACV,UAAUiD;GACV,SAASA;GACT,iBAAuB,KAAKC,GAAa;GACzC,MAAMlE;GACN,iBAAA;GACA,iBAAA;GACA,MAAK;GACL,gBAAe;GACf,OAAM;GAEN,UAAA,kBAAC,OAAD;IAAK,WAAWjC,EAAO;IAAvB,UAAA;KACE,kBAAC+G,GAAD;MACE,OAAM;MACN,SAAStF;MACT,MAAK;MACL,UAAUW;MACV,UAAUoD;MACV,SAAS7D;MACT,OAAOQ;KACR,CAAA;KACD,kBAAC4E,GAAD;MACE,OAAM;MACN,SAAStF;MACT,MAAK;MACL,UAAUR;MACV,UAAUuE;MACV,SAAS7D;MACT,OAAOX;KACR,CAAA;KACD,kBAACd,GAAD;MAAc,OAAM;MAAO,MAAK;MAAY,UAAA;MAC1C,UAAA,kBAAC+G,IAAD;OACE,WAAW;OACX,WAAA;OACA,WAAW,MACTzD,GAAauE,GAAyBrD,CAAM,CAAC;OAE/C,SAAS,CAAC,GAAG/D,CAAa;OAC1B,OAAOmE;MACR,CAAA;KACW,CAAA;KACbA,EAAkB,OAAO,kBACxB,kBAAC5E,GAAD;MAAc,OAAM;MAAO,MAAK;MAAmB,UAAA;MACjD,UAAA,kBAAC8H,GAAD;OACE,WAAA;OACA,uBAAA;OACA,WAAU;OACV,YAAY;QACV,gBAAgB;QAChB,aAAa;QACb,MAAM;QACN,YAAY;OACd;OACA,SAASrE;OACT,aAAY;OACZ,MAAK;OACL,WAAW,MAAwB;QACjC,IAAMsE,IACJC,GAA6BC,CAAa;QAG5C,AADA/E,GAAkB6E,CAAiB,GACnCnE,GAAoB,MAClBgC,GAAqBmC,GAAmBG,CAAc,CACxD;OACF;OACA,UAAU1C;OACV,qBAAqB,MAAe;QAClC,AAAI2C,KACF3C,EAA2B,EAAE;OAEjC;OACA,SAAS,CAAC,GAAG7B,EAAe;OAC5B,kBAAiB;OACjB,aAAY;OACZ,oBAAoB;OACpB,OAAO,CAAC,GAAGV,CAAc;MAC1B,CAAA;KACW,CAAA,IACZ;KACJ,kBAACjD,GAAD;MACE,UAAS;MACT,OAAM;MACN,MAAK;MAEL,UAAA,kBAACoI,IAAD;OACE,WAAA;OACA,WAAW,MACThG,GAAYiG,EAAM,OAAO,KAAK;OAEhC,OAAOlG;OACP,SAAQ;MACT,CAAA;KACW,CAAA;KACd,kBAACnC,GAAD;MAAc,OAAM;MAAO,MAAK;MAC9B,UAAA,kBAACsI,GAAD;OACE,YAAW;OACX,YAAW;OACX,WAAA;OACA,YAAA;OACA,WAAW,MACT9E,EAAW+E,EAAoCC,CAAS,CAAC;OAE3D,iBAAgB;OAChB,kBAAiB;OACjB,OAAOC,EAAkClF,CAAO;MACjD,CAAA;KACW,CAAA;KACd,kBAACvD,GAAD;MAAc,OAAM;MAAO,MAAK;MAC9B,UAAA,kBAACsI,GAAD;OACE,YAAW;OACX,YAAW;OACX,WAAA;OACA,YAAA;OACA,WAAW,MACTpH,EAASqH,EAAoCC,CAAS,CAAC;OAEzD,iBAAgB;OAChB,kBAAiB;OACjB,OAAOC,EAAkCxH,CAAK;MAC/C,CAAA;KACW,CAAA;IACX;;EACA,CAAA;CACP,EAAA,CAAA;AAER;AAEA,SAAS4F,EAAwB,EAC/B,eAAY,IACZ,UACA,YAASxG,GACT,YACA,SACA,aACA,aACA,YACA,eAAW,IACX,SACA,YAae;CACf,IAAMqI,IACJ,kBAACZ,GAAD;EACE,WAAA;EACA,uBAAA;EACA,WAAU;EACV,YAAY;GACV,gBAAgB;GAChB,aAAa;GACb;GACA,YAAY;EACd;EACS;EACT,aAAY;EACZ,MAAK;EACL,WAAW,MAAiBa,EAASC,EAA0BpE,CAAM,CAAC;EAC5D;EACV,qBAAqB,MACnBmE,EAASE,EAAuBtD,GAAYuD,CAAO,CAAC;EAEtD,qBAAqB,MAAe;GAClC,AAAIX,KACFY,EAAc,EAAE;EAEpB;EACA,SAAS,CAAC,GAAGD,CAAO;EACpB,aAAaE,IAAYC,IAAQ;EACjC,oBAAoB;EACd;EACC;CACR,CAAA;CAWH,OARID,IAEA,kBAAClC,GAAD;EAAW,WAAA;EAAkB;EAAc;EACxC,UAAA4B;CACQ,CAAA,IAKb,kBAAC1I,GAAD;EAAqB;EAAe;EAAc;EAAgB;EAC/D,UAAA0I;CACW,CAAA;AAElB;AAEA,SAASvE,GAAiB,GAA2C;CACnE,OAAO;EACL,aAAatD,EAAO;EACpB,OAAOA,EAAO;EACd,IAAIA,EAAO;EACX,MAAMZ,EAAkBY,EAAO,MAAMA,EAAO,OAAO,KAAK;CAC1D;AACF;AAEA,SAAS+H,EAA0B,GAAqC;CACtE,IAAI,CAACM,EAASC,CAAK,GACjB,OAAO;CAGT,IAAMC,IAAKD,EAAM,IACXE,IAAOF,EAAM,MACbG,IAAQH,EAAM,OACdI,IAAcJ,EAAM;CAE1B,OAAO,OAAOC,KAAO,YAAY,OAAOC,KAAS,WAC7C;EACE,aAAa,OAAOE,KAAgB,WAAWA,IAAcF;EAC7D,OAAO,OAAOC,KAAU,WAAWA,IAAQ;EAC3C;EACA;CACF,IACA;AACN;AAEA,SAASxE,GAA2B,EAClC,UACA,WAIe;CAKf,OAJKwE,IAKH,kBAACE,GAAD;EAAS,OAAOF;EACZ,WAAA,EAAE,QAAK,GAAGG,QAIV,kBAAC,QAAD;GACE,GAAIA;GACJ,WAAW3J,EAAO;GACb;GAEJ,UAAAuJ;EACG,CAAA;CAED,CAAA,IAjBF,kBAAC,QAAD,EAAA,UAAOA,EAAW,CAAA;AAmB7B;AAEA,SAASR,EACP,GACA,GACqB;CACrB,IAAMa,IAAuBnE,EAAW,KAAK,CAAC,CAAC,kBAAkB;CAEjE,IAAI,CAACmE,GACH,OAAO;CAGT,IAAMC,IAAUb,EAAQ,QAAQ,MAC9B;EAACtE,EAAO;EAAIA,EAAO;EAAMA,EAAO,SAAS;CAAE,CAAC,CAAC,MAAM,MACjD2E,EAAM,kBAAkB,CAAC,CAAC,SAASO,CAAoB,CACzD,CACF;CAEA,OAAOC,EAAQ,WAAW,IAAKA,EAAQ,MAAM,OAAQ;AACvD;AAEA,SAAShE,GAAmB,GAAkD;CAC5E,OAAO;EACL,IAAIS,EAAS;EACb,MAAMA,EAAS;CACjB;AACF;AAEA,SAAS4B,GACP,GAC2B;CAC3B,OAAOmB,EAAM,SAAS,MAAoC;EACxD,IAAI,CAACD,EAASU,CAAI,GAChB,OAAO,CAAC;EAGV,IAAMR,IAAKQ,EAAK,IACVP,IAAOO,EAAK;EAElB,OAAO,OAAOR,KAAO,YAAY,OAAOC,KAAS,WAC7C,CAAC;GAAE;GAAI;EAAK,CAAC,IACb,CAAC;CACP,CAAC;AACH;AAEA,SAASvD,GACP,GACA,GAC2B;CAC3B,IAAM4D,IAAuBnE,EAAW,KAAK,CAAC,CAAC,kBAAkB;CAMjE,OAJKmE,IAIEZ,EAAQ,QAAQ,MACrB,CAACtE,EAAO,IAAIA,EAAO,IAAI,CAAC,CAAC,MAAM,MAC7B2E,EAAM,kBAAkB,CAAC,CAAC,SAASO,CAAoB,CACzD,CACF,IAPSZ;AAQX;AAEA,SAASlD,GACP,GACA,GAC2B;CAC3B,OAAO,CAAC,GAAGC,GAAiB,GAAGgE,CAAgB,CAAC,CAAC,QAC9C,GAAS,MACRf,EAAQ,MAAM,MAAkBgB,EAAc,OAAOtF,EAAO,EAAE,IAC1DsE,IACA,CAAC,GAAGA,GAAStE,CAAM,GACzB,CAAC,CACH;AACF;AAEA,SAASqD,GAAyB,GAA6B;CAK7D,OAJI,CAACqB,EAASC,CAAK,KAAK,CAACY,EAAgCZ,EAAM,EAAE,IACxD1I,EAAc,KAIrBA,EAAc,MAAM,MAAW+D,EAAO,OAAO2E,EAAM,EAAE,KAAK1I,EAAc;AAE5E;AAEA,SAASuG,GAAsB,GAAmC;CAChE,IAAI,CAACkC,EAASC,CAAK,GACjB,OAAOzI,EAAqB;CAG9B,IAAM0I,IAAKD,EAAM;CAEjB,OACEzI,EAAqB,MAAM,MAAW8D,EAAO,OAAO4E,CAAE,KACtD1I,EAAqB;AAEzB;AAEA,SAASqJ,EACP,GAC4B;CAC5B,OAAOZ,MAAU,SAASA,MAAU;AACtC;AAEA,SAASxE,GAAe,GAAoC;CAS1D,OARID,EAAK,cAAc,QACd,SAGLA,EAAK,cAAc,kBACd,QAAQA,EAAK,iBAAiB,WAGhCA,EAAK,oBAAoB,MAAMA,EAAK,sBAAsB;AACnE;AAEA,SAASM,GAAsB,EAC7B,aAGe;CAaf,OAZIgF,MAAW,WACN,kBAACC,GAAD;EAAO,MAAK;EAAM,MAAK;EAAM,SAAQ;CAAe,CAAA,IAGzDD,MAAW,YACN,kBAACC,GAAD;EAAO,MAAK;EAAM,MAAK;EAAM,SAAQ;CAAgB,CAAA,IAG1DD,MAAW,YACN,kBAACC,GAAD;EAAO,MAAK;EAAM,MAAK;EAAM,SAAQ;CAAe,CAAA,IAGtD,kBAACA,GAAD;EAAO,MAAK;EAAM,MAAMD;EAAQ,SAAQ;CAAY,CAAA;AAC7D;AAEA,SAAS9C,GAA2B,GAAwC;CAS1E,OAPEC,MAAc,YACdA,MAAc,aACdA,MAAc,YAEPA,IAGF;AACT;AAEA,SAASsB,EAAkC,GAAmC;CAC5E,IAAMyB,IAAOf,IAAQgB,EAA6BhB,CAAK,IAAI;CAE3D,OAAOe,IACH,GAAGE,EAAgBF,CAAI,EAAE,GAAGG,EAAYH,EAAK,SAAS,CAAC,EAAE,GAAGG,EAC1DH,EAAK,WAAW,CAClB,MACA,KAAA;AACN;AAEA,SAAS3B,EACP,GACQ;CACR,IAAM2B,IAAOf,IAAQgB,EAA6BhB,CAAK,IAAI;CAE3D,OAAOe,IAAOA,EAAK,YAAY,IAAI;AACrC;AAEA,SAAShE,GAA6B,GAAiB,GAAwB;CAC7E,IAAI,CAAC3C,KAAW,CAACtC,GACf,OAAO;CAGT,IAAMqJ,IAAYH,EAA6B5G,CAAO,GAChDgH,IAAUJ,EAA6BlJ,CAAK;CAElD,OAAO,CAAC,CAACqJ,KAAa,CAAC,CAACC,KAAWA,EAAQ,QAAQ,KAAKD,EAAU,QAAQ;AAC5E;AAEA,SAASH,EAA6B,GAA4B;CAChE,IAAIhB,EAAM,SAAS,GAAG,KAAK,mBAAmB,KAAKA,CAAK,GAAG;EACzD,IAAMqB,IAAa,IAAI,KAAKrB,CAAK;EAEjC,OAAO,OAAO,MAAMqB,EAAW,QAAQ,CAAC,IAAI,OAAOA;CACrD;CAEA,IAAM,CAACC,IAAW,IAAIC,IAAW,WAAWvB,EAAM,MAAM,GAAG,GACrD,CAACwB,IAAO,GAAGC,IAAQ,GAAGC,IAAM,KAAKJ,EAAS,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,GAC/D,CAACK,IAAO,GAAGC,IAAS,KAAKL,EAAS,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,GACvDF,IAAa,IAAI,KAAKG,GAAMC,IAAQ,GAAGC,GAAKC,GAAMC,CAAM;CAE9D,OAAO,OAAO,MAAMP,EAAW,QAAQ,CAAC,IAAI,OAAOA;AACrD;AAEA,SAASJ,EAAgB,GAAoB;CAC3C,OAAO,GAAGF,EAAK,YAAY,EAAE,GAAGG,EAAYH,EAAK,SAAS,IAAI,CAAC,EAAE,GAAGG,EAClEH,EAAK,QAAQ,CACf;AACF;AAEA,SAASG,EAAY,GAAuB;CAC1C,OAAO,OAAOlB,CAAK,CAAC,CAAC,SAAS,GAAG,GAAG;AACtC;AAEA,SAAS9E,EAAiB,GAAwB;CAChD,OAAOlD,aAAiB,QAAQA,EAAM,UAAU;AAClD;AAEA,SAAS+H,EAAS,GAA4D;CAC5E,OAAO,OAAOC,KAAU,cAAYA;AACtC"}
|
|
1
|
+
{"version":3,"file":"delegations-DBh5TT6G.js","names":["_Fragment","styles","BPMFormField","formatMemberLabel","Fragment$1","ContentHeader","delegations_module_default","DELEGATION_MODAL_FIELD_LAYOUT","FormFieldLayout","DELEGATION_PAGE_SIZE_OPTIONS","DELEGATION_STATUS_TABS","SCOPE_OPTIONS","SCOPE_FILTER_OPTIONS","AdminDelegationsView","useAuth","currentMemberId","member","agentMember","setAgentMember","useState","endAt","setEndAt","error","setError","loading","setLoading","memberLoading","setMemberLoading","memberOptions","setMemberOptions","principalFilterMember","setPrincipalFilterMember","agentFilterMember","setAgentFilterMember","modalOpen","setModalOpen","principalMember","setPrincipalMember","priority","setPriority","rulePage","setRulePage","rulePageSize","setRulePageSize","ruleStatus","setRuleStatus","ruleTotalCount","setRuleTotalCount","rules","setRules","saving","setSaving","scopeTemplates","setScopeTemplates","scopeFilterType","setScopeFilterType","scopeType","setScopeType","startAt","setStartAt","templateLoading","setTemplateLoading","templateOptions","setTemplateOptions","refreshRules","useCallback","rulePageResult","members","listDelegationRulesPage","searchMembers","readMemberOption","requestError","readErrorMessage","membersById","useMemo","option","rows","rule","readScopeLabel","selectedScopeType","columns","MemberNameWithEmailTooltip","record","DelegationStatusBadge","Typography","formatDateTime","handleRevoke","revokeDelegationRule","tableActions","handleSearchMembers","searchText","handleSearchTemplates","nextOptions","listApprovalTemplates","readTemplateOption","mergeTemplateOptions","selectedOptions","filterTemplateOptions","openCreateModal","closeCreateModal","handleCreate","isInvalidDelegationDateRange","createDelegationRule","template","PageHeader","Button","PlusIcon","SectionGroup","Section","FilterArea","FilterLine","Filter","MemberAutoCompleteField","FormField","Select","readScopeFilterOption","Tab","readDelegationStatusTabKey","activeKey","TabItem","statusTab","Table","page","pageSize","from","to","total","Modal","readScopeOptionFromValue","AutoComplete","selectedTemplates","readTemplateOptionsFromValue","nextTemplates","currentOptions","open","Input","event","DateTimePicker","formatDelegationDateTimePickerValue","nextValue","readDelegationDateTimePickerValue","autoComplete","onChange","readMemberOptionFromValue","readUniqueMemberOption","options","onSearch","hideLabel","label","isRecord","value","id","name","email","displayName","Tooltip","tooltipProps","normalizedSearchText","matches","item","availableOptions","currentOption","isSelectableDelegationScopeType","status","Badge","date","parseDelegationDateTimeValue","formatDateParts","padDatePart","startDate","endDate","parsedDate","datePart","timePart","year","month","day","hour","minute"],"sources":["../../src/views/admin/delegations/delegations.module.scss","../../src/views/admin/delegations/AdminDelegationsView.tsx"],"sourcesContent":[".delegationModalFields {\n display: grid;\n gap: 12px;\n width: 100%;\n\n :global(.mzn-form-field--horizontal) {\n align-items: flex-start;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label-area) {\n flex: 0 0 112px;\n width: 112px;\n min-width: 112px;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label) {\n flex-wrap: nowrap;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__data-entry) {\n flex: 1 1 auto;\n align-items: stretch;\n min-width: 0;\n max-width: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-auto-complete) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-input),\n :global(.mzn-input-container),\n :global(.mzn-select),\n :global(.mzn-select-trigger),\n :global(.mzn-text-field) {\n width: 100%;\n min-width: 0 !important;\n }\n\n :global(.mzn-select-trigger__input) {\n width: 100%;\n min-width: 0 !important;\n text-overflow: ellipsis;\n }\n}\n\n.delegationFilterArea {\n width: calc(100vw - 272px);\n\n :global(.mzn-filter-area__actions) {\n display: none;\n }\n\n :global(.mzn-filter-area__row) {\n align-items: flex-start;\n }\n\n :global(.mzn-form-field__label-area) {\n display: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-auto-complete) {\n width: 100%;\n }\n}\n\n.memberNameWithTooltip {\n cursor: help;\n text-decoration: underline dotted;\n text-underline-offset: 3px;\n}\n","'use client';\n\nimport {\n ChangeEvent,\n Key,\n ReactElement,\n RefCallback,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n AutoComplete,\n Badge,\n Button,\n DateTimePicker,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Select,\n Tab,\n TabItem,\n Table,\n Tooltip,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport { BPMFormField } from '../../../components/bpm-form-field';\nimport styles from './delegations.module.scss';\nimport { formatDateTime } from '../../../lib/format-date-time';\nimport { useAuth } from '../../../lib/auth-provider';\nimport {\n DelegationRuleRecord,\n DelegationRuleStatus,\n DelegationScopeType,\n MemberProfileRecord,\n createDelegationRule,\n listDelegationRulesPage,\n revokeDelegationRule,\n searchMembers,\n} from '@rytass/bpm-core-client/workflow';\nimport {\n ApprovalTemplateRecord,\n listApprovalTemplates,\n} from '@rytass/bpm-core-client/template';\nimport { formatMemberLabel } from '../../../lib/format-member-label';\n\ntype MemberOption = Readonly<{\n displayName: string;\n email: string | null;\n id: string;\n name: string;\n}>;\n\ntype TemplateOption = Readonly<{\n id: string;\n name: string;\n}>;\n\ntype ScopeOption = Readonly<{\n id: DelegationScopeType;\n name: string;\n}>;\n\ntype ScopeFilterOption = Readonly<{\n id: 'ALL_SCOPES' | DelegationScopeType;\n name: string;\n scopeType: DelegationScopeType | null;\n}>;\n\ntype DelegationRuleRow = Readonly<\n Record<string, unknown> &\n DelegationRuleRecord & {\n agentEmail: string | null;\n agentName: string;\n key: string;\n principalEmail: string | null;\n principalName: string;\n scopeLabel: string;\n }\n>;\n\nconst DELEGATION_MODAL_FIELD_LAYOUT = FormFieldLayout.HORIZONTAL;\nconst DELEGATION_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst DELEGATION_STATUS_TABS: readonly {\n readonly key: DelegationStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'ACTIVE', label: '啟用中' },\n { key: 'REVOKED', label: '已撤銷' },\n { key: 'EXPIRED', label: '已過期' },\n];\n\ntype DelegationStatusTabKey = 'ALL' | DelegationRuleStatus;\n\nconst SCOPE_OPTIONS: readonly ScopeOption[] = [\n { id: 'ALL', name: '全部簽核' },\n { id: 'TEMPLATE_LIST', name: '指定模板' },\n];\n\nconst SCOPE_FILTER_OPTIONS: readonly ScopeFilterOption[] = [\n { id: 'ALL_SCOPES', name: '全部範圍', scopeType: null },\n { id: 'ALL', name: '全部簽核', scopeType: 'ALL' },\n { id: 'TEMPLATE_LIST', name: '指定模板', scopeType: 'TEMPLATE_LIST' },\n];\n\n\nexport function AdminDelegationsView(): ReactElement {\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [agentMember, setAgentMember] = useState<MemberOption | null>(null);\n const [endAt, setEndAt] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [memberLoading, setMemberLoading] = useState(false);\n const [memberOptions, setMemberOptions] = useState<readonly MemberOption[]>(\n [],\n );\n const [principalFilterMember, setPrincipalFilterMember] =\n useState<MemberOption | null>(null);\n const [agentFilterMember, setAgentFilterMember] =\n useState<MemberOption | null>(null);\n const [modalOpen, setModalOpen] = useState(false);\n const [principalMember, setPrincipalMember] = useState<MemberOption | null>(\n null,\n );\n const [priority, setPriority] = useState('100');\n const [rulePage, setRulePage] = useState(1);\n const [rulePageSize, setRulePageSize] = useState(10);\n const [ruleStatus, setRuleStatus] = useState<DelegationStatusTabKey>('ALL');\n const [ruleTotalCount, setRuleTotalCount] = useState(0);\n const [rules, setRules] = useState<readonly DelegationRuleRecord[]>([]);\n const [saving, setSaving] = useState(false);\n const [scopeTemplates, setScopeTemplates] = useState<\n readonly TemplateOption[]\n >([]);\n const [scopeFilterType, setScopeFilterType] = useState<ScopeFilterOption>(\n SCOPE_FILTER_OPTIONS[0],\n );\n const [scopeType, setScopeType] = useState<ScopeOption>(SCOPE_OPTIONS[0]);\n const [startAt, setStartAt] = useState('');\n const [templateLoading, setTemplateLoading] = useState(false);\n const [templateOptions, setTemplateOptions] = useState<\n readonly TemplateOption[]\n >([]);\n\n const refreshRules = useCallback(async (): Promise<void> => {\n setLoading(true);\n setError(null);\n\n try {\n const [rulePageResult, members] = await Promise.all([\n listDelegationRulesPage({\n agentMemberId: agentFilterMember?.id ?? null,\n includeInactive: true,\n page: rulePage,\n pageSize: rulePageSize,\n principalMemberId: principalFilterMember?.id ?? null,\n scopeType: scopeFilterType.scopeType,\n status: ruleStatus === 'ALL' ? null : ruleStatus,\n }),\n searchMembers(''),\n ]);\n\n setRules(rulePageResult.rules);\n setRuleTotalCount(rulePageResult.totalCount);\n setMemberOptions(members.map(readMemberOption));\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, [\n agentFilterMember,\n principalFilterMember,\n rulePage,\n rulePageSize,\n ruleStatus,\n scopeFilterType,\n ]);\n\n useEffect((): void => {\n void refreshRules();\n }, [refreshRules]);\n\n const membersById = useMemo(\n (): ReadonlyMap<string, MemberOption> =>\n new Map(memberOptions.map((option) => [option.id, option])),\n [memberOptions],\n );\n const rows = useMemo(\n (): DelegationRuleRow[] =>\n rules.map((rule) => ({\n ...rule,\n agentEmail: membersById.get(rule.agentMemberId)?.email ?? null,\n agentName:\n membersById.get(rule.agentMemberId)?.displayName ??\n rule.agentMemberId,\n key: rule.id,\n principalEmail: membersById.get(rule.principalMemberId)?.email ?? null,\n principalName:\n membersById.get(rule.principalMemberId)?.displayName ??\n rule.principalMemberId,\n scopeLabel: readScopeLabel(rule),\n })),\n [membersById, rules],\n );\n const selectedScopeType =\n SCOPE_OPTIONS.find((option) => option.id === scopeType.id) ??\n SCOPE_OPTIONS[0];\n const columns = useMemo(\n (): TableColumn<DelegationRuleRow>[] => [\n {\n key: 'principal',\n render: (record: DelegationRuleRow): ReactElement => (\n <MemberNameWithEmailTooltip\n email={record.principalEmail}\n name={record.principalName}\n />\n ),\n title: '原簽核人',\n width: 220,\n },\n {\n key: 'agent',\n render: (record: DelegationRuleRow): ReactElement => (\n <MemberNameWithEmailTooltip\n email={record.agentEmail}\n name={record.agentName}\n />\n ),\n title: '代理人',\n width: 220,\n },\n { dataIndex: 'scopeLabel', key: 'scope', title: '代理範圍', width: 220 },\n {\n key: 'status',\n render: (record: DelegationRuleRow): ReactElement => (\n <DelegationStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n { dataIndex: 'priority', key: 'priority', title: '優先序', width: 100 },\n {\n key: 'startAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(record.startAt)}\n </Typography>\n ),\n title: '開始時間',\n width: 220,\n },\n {\n key: 'endAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {record.endAt ? formatDateTime(record.endAt) : '-'}\n </Typography>\n ),\n title: '結束時間',\n width: 220,\n },\n ],\n [],\n );\n const handleRevoke = useCallback(\n async (id: string): Promise<void> => {\n if (!currentMemberId) {\n return;\n }\n\n setError(null);\n\n try {\n await revokeDelegationRule({\n id,\n revokedByMemberId: currentMemberId,\n });\n await refreshRules();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n }\n },\n [currentMemberId, refreshRules],\n );\n const tableActions = useMemo(\n (): TableActions<DelegationRuleRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<DelegationRuleRow>['render']> =>\n record.status === 'ACTIVE'\n ? [\n {\n name: '撤銷',\n onClick: (): void => void handleRevoke(record.id),\n },\n ]\n : [],\n variant: 'destructive-secondary',\n width: 88,\n }),\n [handleRevoke],\n );\n\n async function handleSearchMembers(searchText: string): Promise<void> {\n setMemberLoading(true);\n\n try {\n setMemberOptions((await searchMembers(searchText)).map(readMemberOption));\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setMemberLoading(false);\n }\n }\n\n async function handleSearchTemplates(\n searchText: string,\n selectedOptions: readonly TemplateOption[] = scopeTemplates,\n ): Promise<void> {\n setTemplateLoading(true);\n\n try {\n const nextOptions = (await listApprovalTemplates()).map(\n readTemplateOption,\n );\n\n setTemplateOptions(\n mergeTemplateOptions(\n selectedOptions,\n filterTemplateOptions(nextOptions, searchText),\n ),\n );\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setTemplateLoading(false);\n }\n }\n\n function openCreateModal(): void {\n setAgentMember(null);\n setEndAt('');\n setPrincipalMember(null);\n setPriority('100');\n setScopeTemplates([]);\n setScopeType(SCOPE_OPTIONS[0]);\n setStartAt('');\n setTemplateOptions([]);\n void handleSearchTemplates('', []);\n setModalOpen(true);\n }\n\n function closeCreateModal(): void {\n if (saving) {\n return;\n }\n\n setModalOpen(false);\n }\n\n async function handleCreate(): Promise<void> {\n if (!currentMemberId) {\n return;\n }\n\n if (!principalMember || !agentMember) {\n setError('請選擇原簽核人與代理人');\n return;\n }\n\n if (selectedScopeType.id === 'TEMPLATE_LIST' && scopeTemplates.length < 1) {\n setError('請選擇至少一個簽核模板');\n return;\n }\n\n if (isInvalidDelegationDateRange(startAt, endAt)) {\n setError('結束時間必須晚於起始時間');\n return;\n }\n\n setSaving(true);\n setError(null);\n\n try {\n await createDelegationRule({\n agentMemberId: agentMember.id,\n createdByMemberId: currentMemberId,\n endAt: endAt || null,\n principalMemberId: principalMember.id,\n priority: Number(priority) || 100,\n requiresConfirmation: false,\n scopeConditionCel: null,\n scopeTemplateIds:\n selectedScopeType.id === 'TEMPLATE_LIST'\n ? scopeTemplates.map((template) => template.id)\n : [],\n scopeType: selectedScopeType.id,\n startAt: startAt || null,\n });\n setModalOpen(false);\n if (rulePage === 1) {\n await refreshRules();\n } else {\n setRulePage(1);\n }\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <>\n <PageHeader>\n <ContentHeader\n description=\"設定簽核代理規則,讓符合範圍的待簽任務自動改派給代理人。\"\n title=\"代理設定\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={openCreateModal}\n variant=\"base-primary\"\n >\n 建立代理\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.delegationFilterArea}>\n <FilterLine>\n <Filter span={2}>\n <MemberAutoCompleteField\n hideLabel\n label=\"原簽核人\"\n loading={memberLoading}\n name=\"principalFilterMemberId\"\n onChange={(option): void => {\n setPrincipalFilterMember(option);\n setRulePage(1);\n }}\n onSearch={handleSearchMembers}\n options={memberOptions}\n required={false}\n layout={FormFieldLayout.VERTICAL}\n size=\"sub\"\n value={principalFilterMember}\n />\n </Filter>\n <Filter span={2}>\n <MemberAutoCompleteField\n hideLabel\n label=\"代理人\"\n loading={memberLoading}\n name=\"agentFilterMemberId\"\n onChange={(option): void => {\n setAgentFilterMember(option);\n setRulePage(1);\n }}\n onSearch={handleSearchMembers}\n options={memberOptions}\n required={false}\n layout={FormFieldLayout.VERTICAL}\n size=\"sub\"\n value={agentFilterMember}\n />\n </Filter>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"scopeFilterType\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => {\n setScopeFilterType(readScopeFilterOption(option));\n setRulePage(1);\n }}\n options={[...SCOPE_FILTER_OPTIONS]}\n placeholder=\"代理範圍\"\n size=\"sub\"\n value={scopeFilterType}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={ruleStatus}\n onChange={(activeKey): void => {\n setRuleStatus(readDelegationStatusTabKey(activeKey));\n setRulePage(1);\n }}\n >\n {DELEGATION_STATUS_TABS.map((statusTab) => (\n <TabItem key={statusTab.key}>{statusTab.label}</TabItem>\n ))}\n </Tab>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <Table\n actions={tableActions}\n columns={columns}\n dataSource={rows}\n fullWidth\n loading={loading}\n pagination={{\n current: rulePage,\n onChange: (page): void => {\n setRulePage(page);\n },\n onChangePageSize: (pageSize): void => {\n setRulePage(1);\n setRulePageSize(pageSize);\n },\n pageSize: rulePageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: DELEGATION_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: ruleTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{\n disabled: !principalMember || !agentMember,\n }}\n confirmText=\"建立代理\"\n loading={saving}\n modalType=\"standard\"\n onCancel={closeCreateModal}\n onClose={closeCreateModal}\n onConfirm={(): void => void handleCreate()}\n open={modalOpen}\n showModalFooter\n showModalHeader\n size=\"regular\"\n supportingText=\"代理生效後,後續建立的待簽任務會依範圍自動指派。\"\n title=\"建立代理\"\n >\n <div className={styles.delegationModalFields}>\n <MemberAutoCompleteField\n label=\"原簽核人\"\n loading={memberLoading}\n name=\"principalMemberId\"\n onChange={setPrincipalMember}\n onSearch={handleSearchMembers}\n options={memberOptions}\n value={principalMember}\n />\n <MemberAutoCompleteField\n label=\"代理人\"\n loading={memberLoading}\n name=\"agentMemberId\"\n onChange={setAgentMember}\n onSearch={handleSearchMembers}\n options={memberOptions}\n value={agentMember}\n />\n <BPMFormField label=\"代理範圍\" name=\"scopeType\" required>\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void =>\n setScopeType(readScopeOptionFromValue(option))\n }\n options={[...SCOPE_OPTIONS]}\n value={selectedScopeType}\n />\n </BPMFormField>\n {selectedScopeType.id === 'TEMPLATE_LIST' ? (\n <BPMFormField label=\"簽核模板\" name=\"scopeTemplateIds\" required>\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的模板\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name: 'scopeTemplateIds',\n spellCheck: false,\n }}\n loading={templateLoading}\n loadingText=\"搜尋模板中...\"\n mode=\"multiple\"\n onChange={(nextTemplates): void => {\n const selectedTemplates =\n readTemplateOptionsFromValue(nextTemplates);\n\n setScopeTemplates(selectedTemplates);\n setTemplateOptions((currentOptions) =>\n mergeTemplateOptions(selectedTemplates, currentOptions),\n );\n }}\n onSearch={handleSearchTemplates}\n onVisibilityChange={(open): void => {\n if (open) {\n void handleSearchTemplates('');\n }\n }}\n options={[...templateOptions]}\n overflowStrategy=\"wrap\"\n placeholder=\"搜尋並選取簽核模板\"\n searchDebounceTime={300}\n value={[...scopeTemplates]}\n />\n </BPMFormField>\n ) : null}\n <BPMFormField\n hintText=\"數字越大越優先。同一位被代理人同時命中多條規則時,採用優先序最高的那條;優先序相同時採用較早建立的。\"\n label=\"優先序\"\n name=\"priority\"\n >\n <Input\n fullWidth\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n setPriority(event.target.value)\n }\n value={priority}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"起始時間\" name=\"startAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setStartAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"留空立即生效\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(startAt)}\n />\n </BPMFormField>\n <BPMFormField label=\"結束時間\" name=\"endAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setEndAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"可留空\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(endAt)}\n />\n </BPMFormField>\n </div>\n </Modal>\n </>\n );\n}\n\nfunction MemberAutoCompleteField({\n hideLabel = false,\n label,\n layout = DELEGATION_MODAL_FIELD_LAYOUT,\n loading,\n name,\n onChange,\n onSearch,\n options,\n required = true,\n size,\n value,\n}: {\n readonly hideLabel?: boolean;\n readonly label: string;\n readonly layout?: FormFieldLayout;\n readonly loading: boolean;\n readonly name: string;\n readonly onChange: (option: MemberOption | null) => void;\n readonly onSearch: (searchText: string) => Promise<void>;\n readonly options: readonly MemberOption[];\n readonly required?: boolean;\n readonly size?: 'main' | 'sub';\n readonly value: MemberOption | null;\n}): ReactElement {\n const autoComplete = (\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的成員\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name,\n spellCheck: false,\n }}\n loading={loading}\n loadingText=\"搜尋成員中...\"\n mode=\"single\"\n onChange={(option): void => onChange(readMemberOptionFromValue(option))}\n onSearch={onSearch}\n onSearchTextChange={(searchText): void =>\n onChange(readUniqueMemberOption(searchText, options))\n }\n onVisibilityChange={(open): void => {\n if (open) {\n void onSearch('');\n }\n }}\n options={[...options]}\n placeholder={hideLabel ? label : '搜尋姓名或信箱'}\n searchDebounceTime={300}\n size={size}\n value={value}\n />\n );\n\n if (hideLabel) {\n return (\n <FormField fullWidth layout={layout} name={name}>\n {autoComplete}\n </FormField>\n );\n }\n\n return (\n <BPMFormField label={label} layout={layout} name={name} required={required}>\n {autoComplete}\n </BPMFormField>\n );\n}\n\nfunction readMemberOption(member: MemberProfileRecord): MemberOption {\n return {\n displayName: member.name,\n email: member.email,\n id: member.memberId,\n name: formatMemberLabel(member.name, member.email, 'dot'),\n };\n}\n\nfunction readMemberOptionFromValue(value: unknown): MemberOption | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const id = value.id;\n const name = value.name;\n const email = value.email;\n const displayName = value.displayName;\n\n return typeof id === 'string' && typeof name === 'string'\n ? {\n displayName: typeof displayName === 'string' ? displayName : name,\n email: typeof email === 'string' ? email : null,\n id,\n name,\n }\n : null;\n}\n\nfunction MemberNameWithEmailTooltip({\n email,\n name,\n}: {\n readonly email: string | null;\n readonly name: string;\n}): ReactElement {\n if (!email) {\n return <span>{name}</span>;\n }\n\n return (\n <Tooltip title={email}>\n {({ ref, ...tooltipProps }): ReactElement => (\n // Spread the whole payload, as `TooltipProps` asks: picking only the\n // mouse handlers drops `aria-describedby`, so assistive tech never\n // learns the open tooltip describes this name.\n <span\n {...tooltipProps}\n className={styles.memberNameWithTooltip}\n ref={ref as RefCallback<HTMLSpanElement>}\n >\n {name}\n </span>\n )}\n </Tooltip>\n );\n}\n\nfunction readUniqueMemberOption(\n searchText: string,\n options: readonly MemberOption[],\n): MemberOption | null {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return null;\n }\n\n const matches = options.filter((option) =>\n [option.id, option.name, option.email ?? ''].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n\n return matches.length === 1 ? (matches[0] ?? null) : null;\n}\n\nfunction readTemplateOption(template: ApprovalTemplateRecord): TemplateOption {\n return {\n id: template.id,\n name: template.name,\n };\n}\n\nfunction readTemplateOptionsFromValue(\n value: readonly unknown[],\n): readonly TemplateOption[] {\n return value.flatMap((item): readonly TemplateOption[] => {\n if (!isRecord(item)) {\n return [];\n }\n\n const id = item.id;\n const name = item.name;\n\n return typeof id === 'string' && typeof name === 'string'\n ? [{ id, name }]\n : [];\n });\n}\n\nfunction filterTemplateOptions(\n options: readonly TemplateOption[],\n searchText: string,\n): readonly TemplateOption[] {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return options;\n }\n\n return options.filter((option) =>\n [option.id, option.name].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n}\n\nfunction mergeTemplateOptions(\n selectedOptions: readonly TemplateOption[],\n availableOptions: readonly TemplateOption[],\n): readonly TemplateOption[] {\n return [...selectedOptions, ...availableOptions].reduce<TemplateOption[]>(\n (options, option) =>\n options.some((currentOption) => currentOption.id === option.id)\n ? options\n : [...options, option],\n [],\n );\n}\n\nfunction readScopeOptionFromValue(value: unknown): ScopeOption {\n if (!isRecord(value) || !isSelectableDelegationScopeType(value.id)) {\n return SCOPE_OPTIONS[0];\n }\n\n return (\n SCOPE_OPTIONS.find((option) => option.id === value.id) ?? SCOPE_OPTIONS[0]\n );\n}\n\nfunction readScopeFilterOption(value: unknown): ScopeFilterOption {\n if (!isRecord(value)) {\n return SCOPE_FILTER_OPTIONS[0];\n }\n\n const id = value.id;\n\n return (\n SCOPE_FILTER_OPTIONS.find((option) => option.id === id) ??\n SCOPE_FILTER_OPTIONS[0]\n );\n}\n\nfunction isSelectableDelegationScopeType(\n value: unknown,\n): value is ScopeOption['id'] {\n return value === 'ALL' || value === 'TEMPLATE_LIST';\n}\n\nfunction readScopeLabel(rule: DelegationRuleRecord): string {\n if (rule.scopeType === 'ALL') {\n return '全部簽核';\n }\n\n if (rule.scopeType === 'TEMPLATE_LIST') {\n return `指定模板:${rule.scopeTemplateIds.length}`;\n }\n\n return rule.scopeConditionCel ? `條件:${rule.scopeConditionCel}` : '條件式';\n}\n\nfunction DelegationStatusBadge({\n status,\n}: {\n readonly status: DelegationRuleRecord['status'];\n}): ReactElement {\n if (status === 'ACTIVE') {\n return <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />;\n }\n\n if (status === 'REVOKED') {\n return <Badge size=\"sub\" text=\"已撤銷\" variant=\"dot-inactive\" />;\n }\n\n if (status === 'EXPIRED') {\n return <Badge size=\"sub\" text=\"已過期\" variant=\"dot-warning\" />;\n }\n\n return <Badge size=\"sub\" text={status} variant=\"dot-info\" />;\n}\n\nfunction readDelegationStatusTabKey(activeKey: Key): DelegationStatusTabKey {\n if (\n activeKey === 'ACTIVE' ||\n activeKey === 'REVOKED' ||\n activeKey === 'EXPIRED'\n ) {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction readDelegationDateTimePickerValue(value: string): string | undefined {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date\n ? `${formatDateParts(date)}T${padDatePart(date.getHours())}:${padDatePart(\n date.getMinutes(),\n )}`\n : undefined;\n}\n\nfunction formatDelegationDateTimePickerValue(\n value: string | undefined,\n): string {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date ? date.toISOString() : '';\n}\n\nfunction isInvalidDelegationDateRange(startAt: string, endAt: string): boolean {\n if (!startAt || !endAt) {\n return false;\n }\n\n const startDate = parseDelegationDateTimeValue(startAt);\n const endDate = parseDelegationDateTimeValue(endAt);\n\n return !!startDate && !!endDate && endDate.getTime() <= startDate.getTime();\n}\n\nfunction parseDelegationDateTimeValue(value: string): Date | null {\n if (value.endsWith('Z') || /[+-]\\d{2}:\\d{2}$/.test(value)) {\n const parsedDate = new Date(value);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n }\n\n const [datePart = '', timePart = '00:00'] = value.split('T');\n const [year = 0, month = 1, day = 1] = datePart.split('-').map(Number);\n const [hour = 0, minute = 0] = timePart.split(':').map(Number);\n const parsedDate = new Date(year, month - 1, day, hour, minute);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n}\n\nfunction formatDateParts(date: Date): string {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(\n date.getDate(),\n )}`;\n}\n\nfunction padDatePart(value: number): string {\n return String(value).padStart(2, '0');\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use client";require('../style.css');const e=require("./rolldown-runtime-BocRIvOZ.cjs"),t=require("./format-member-label-t7ANTF62.cjs"),n=require("./router-adapter--gYs13E8.cjs"),r=require("./FormBuilderView-G6uRSywl.cjs"),i=require("./routes-config-C1j_vFKo.cjs"),a=require("./language-provider-Bdnx3Gxl.cjs");;/* empty css */const o=require("./admin-pickers-BjbkBpSJ.cjs"),s=require("./bpm-form-field-Bc6k4ZEO.cjs"),c=require("./FormRendererView-DwfFbaip.cjs");let l=require("react"),u=require("@mezzanine-ui/react"),d=require("react/jsx-runtime"),f=require("@mezzanine-ui/react/Drawer");f=e.t(f,1);let p=require("@mezzanine-ui/react/ContentHeader");p=e.t(p,1);let m=require("@mezzanine-ui/icons"),h=require("ai"),g=require("@rytass/bpm-core-shared"),_=require("@rytass/bpm-core-client/form"),v=require("@rytass/bpm-core-shared/form"),y=require("@rytass/bpm-core-client/organization"),b=require("@xyflow/react"),x=require("dagre");x=e.t(x,1);let S=require("@rytass/bpm-core-client/template"),C=require("@rytass/bpm-core-shared/workflow-graph"),ee=require("@rytass/bpm-core-shared/workflow"),te=require("@ai-sdk/react");function ne(e,t){let n=[...new Set(e.map(e=>e.level))];return[...n.includes(t)?n:[...n,t]].sort((e,t)=>t-e).map(t=>{let n=e.filter(e=>e.level===t).map(e=>e.name);return{id:String(t),name:n.length>0?`職等 ${t}(${n.join(`、`)})`:`職等 ${t}`,value:t}})}function re(e){return e.reduce((e,t)=>Math.max(e,t.level),1)}var ie=`表單中沒有「人員選擇」欄位,請先到表單設計加入`,w=`表單中沒有單選的「人員選擇」欄位,請先到表單設計加入`,T=`表單中沒有「組織選擇」欄位,請先到表單設計加入`,ae=`原本指定的欄位已不在表單中,或已不是「人員選擇」欄位,請重新選擇。`,oe=`原本指定的欄位已不在表單中,或已不是單選的「人員選擇」欄位,請重新選擇。`,E=`原本指定的欄位已不在表單中,或已不是「組織選擇」欄位,請重新選擇。`,D=`此欄位非必填`,se=`此欄位可能被條件隱藏`,ce=`此欄位為隱藏欄位,申請人無法填寫`,O=`,空白時此關會找不到人員,發佈時會被拒絕;請在表單設計將它設為必填且不隱藏`,le=`,空白時此關會找不到組織主管,發佈時會被拒絕;請在表單設計將它設為必填且不隱藏`;function ue(e,t=O){let n=[...e.required?[]:[D],...e.visibleWhen?.trim()?[se]:[],...e.hidden?[ce]:[]];return n.length>0?`${n.join(`、`)}${t}`:void 0}function de(e){return`${e.required?``:`(非必填)`}${e.visibleWhen?.trim()?`(可能被條件隱藏)`:``}${e.hidden?`(隱藏欄位)`:``}`}function fe(e){let t=ue(e);return{id:e.fieldKey,name:`${e.label} (${e.fieldKey})${de(e)}`,...t?{warning:t}:{}}}function pe(e){return(e?.fields??[]).filter(v.isMemberFieldDefinition).map(fe)}function me(e,t,n){let r=e.find(e=>e.id===t)??null;if(r)return{options:e,problem:r.warning??null,selected:r};if(t.trim()){let r={id:t,name:`${t}(無效欄位)`};return{options:[...e,r],problem:n.stale,selected:r}}return{options:e,problem:e.length===0?n.empty:null,selected:null}}function he(e,t){return me(pe(e),t,{empty:ie,stale:ae})}function ge(e){return(e?.fields??[]).filter(v.isMemberFieldDefinition).filter(e=>!e.multiple).map(fe)}function _e(e,t){return me(ge(e),t,{empty:w,stale:oe})}function ve(e){return(e?.fields??[]).filter(v.isOrgUnitFieldDefinition).map(e=>{let t=ue(e,le);return{id:e.fieldKey,name:`${e.label} (${e.fieldKey})${de(e)}`,...t?{warning:t}:{}}})}function ye(e,t){return me(ve(e),t,{empty:T,stale:E})}function be(e,t){if(!t.trim())return`依表單欄位:未設定`;let n=e?.fields.find(e=>e.fieldKey===t);return n&&!(0,v.isMemberFieldDefinition)(n)?`依表單欄位:${n.label||t}(非人員選擇欄位)`:`依表單欄位:${n?.label||t}`}function xe(e,t,n){if(!t.trim())return`依表單欄位:未設定`;let r=e?.fields.find(e=>e.fieldKey===t);return n(r,r?.label||t)}function Se(e,t,n){return xe(e,t,(e,t)=>e&&!(0,v.isMemberFieldDefinition)(e)?`依表單欄位:${t}(非人員選擇欄位)`:e&&(0,v.isMemberFieldDefinition)(e)&&e.multiple?`依表單欄位:${t}(需為單選人員欄位)`:`依表單欄位:${t}的${n}`)}function k(e,t){return xe(e,t,(e,t)=>e&&!(0,v.isOrgUnitFieldDefinition)(e)?`依表單欄位:${t}(非組織選擇欄位)`:`依表單欄位:${t}所選組織的主管`)}var A=[{id:`DIRECT`,name:`指定會員`},{id:`DYNAMIC_FORM`,name:`依表單欄位指定`},{id:`NODE_ACTOR`,name:`依前面關卡的簽核者`},{id:`ORG_MANAGER`,name:`發起人主管`},{id:`ORG_MANAGER_CHAIN`,name:`主管鏈(簽到指定職等)`},{id:`ORG_UNIT_MANAGER`,name:`指定組織主管`},{id:`ORG_UNIT_MEMBER`,name:`組織任一人`},{id:`ORG_UNIT_POSITION`,name:`組織特定職位`},{id:`POSITION`,name:`指定職位`}],j=[{id:`1`,name:`直屬主管`,value:1},{id:`2`,name:`第二層主管`,value:2},{id:`3`,name:`第三層主管`,value:3}],M=[{id:`0`,name:`欄位裡的人`,value:0},...j],N=[{id:`0`,name:`關卡的簽核者`,value:0},...j],Ce=[{id:`FIXED`,name:`固定組織`},{id:`FORM_FIELD`,name:`表單欄位`}];function we(e,t){return e.find(e=>e.value===t)??{id:String(t),name:`第 ${t} 層主管`,value:t}}function P(e,t){return!Number.isInteger(t)||t<1?{id:`invalid:${t}`,name:`第 ${t} 層主管(無效)`,value:t}:we(e,t)}function Te(e){return e===`FORM_MEMBER_MANAGER`?`DYNAMIC_FORM`:e===`FORM_ORG_UNIT_MANAGER`?`ORG_UNIT_MANAGER`:e===`NODE_ACTOR_MANAGER`?`NODE_ACTOR`:e===`DYNAMIC_FORM`||e===`NODE_ACTOR`||e===`ORG_MANAGER`||e===`ORG_MANAGER_CHAIN`||e===`ORG_UNIT_MANAGER`||e===`ORG_UNIT_MEMBER`||e===`ORG_UNIT_POSITION`||e===`POSITION`?e:`DIRECT`}function Ee(e,t){let n=Te(e??`DIRECT`);return n===`DYNAMIC_FORM`?{formPath:``,type:`DYNAMIC_FORM`}:n===`NODE_ACTOR`?{nodeIds:[],type:`NODE_ACTOR`}:n===`ORG_MANAGER`?{baseFromInitiator:!0,levelsUp:1,type:`ORG_MANAGER`}:n===`ORG_MANAGER_CHAIN`?{minPositionLevel:re(t),type:`ORG_MANAGER_CHAIN`}:n===`ORG_UNIT_MANAGER`?{orgUnitId:``,type:`ORG_UNIT_MANAGER`}:n===`ORG_UNIT_MEMBER`?{includeDescendants:!1,orgUnitId:``,type:`ORG_UNIT_MEMBER`}:n===`ORG_UNIT_POSITION`?{includeDescendants:!1,orgUnitId:``,positionId:``,type:`ORG_UNIT_POSITION`}:n===`POSITION`?{positionId:``,type:`POSITION`}:{memberIds:[],type:`DIRECT`}}function De(e){return(0,ee.isFallbackCapableApproverResolverType)(e.type)}function Oe(e,t){return De(e)?{...e,fallback:t}:e}function ke(e){return j.find(t=>t.value===e)??j[0]}function Ae(e){return j.find(t=>t.id===e)??j[0]}function je(e){return e.type===`DIRECT`?e.memberIds:De(e)&&e.fallback?.type===`DIRECT`&&e.fallback.memberId?[e.fallback.memberId]:[]}function Me(e,t,n,r,i,a){return e.type===`DIRECT`?Pe(e.memberIds,t,`未指定簽核者`):e.type===`ORG_MANAGER`?ke(e.levelsUp).name:e.type===`ORG_MANAGER_CHAIN`?`主管鏈:簽到職等 ${e.minPositionLevel}`:e.type===`ORG_UNIT_MANAGER`?`組織主管:${Fe(n,e.orgUnitId)}`:e.type===`ORG_UNIT_MEMBER`?`組織任一人:${Fe(n,e.orgUnitId)}`:e.type===`ORG_UNIT_POSITION`?`組織職位:${Fe(n,e.orgUnitId)} / ${Ie(r,e.positionId)}`:e.type===`POSITION`?`職位:${Ie(r,e.positionId)}`:e.type===`DYNAMIC_FORM`?be(i,e.formPath):e.type===`FORM_MEMBER_MANAGER`?Se(i,e.formPath,P(M,e.levelsUp).name):e.type===`FORM_ORG_UNIT_MANAGER`?k(i,e.formPath):e.type===`NODE_ACTOR`?`前面關卡的簽核者:${Ne(e.nodeIds,a)}`:e.type===`NODE_ACTOR_MANAGER`?`前面關卡簽核者的${P(N,e.levelsUp).name}:${Ne(e.nodeIds,a)}`:e.type===`EXPRESSION`?`自訂表達式`:F((0,ee.readUnsupportedApproverResolverType)(e)??``)}function Ne(e,t){if(e.length===0)return`未指定關卡`;if(!t)return`${e.length} 個關卡`;let n=e.map(e=>t.find(t=>t.id===e)?.name??`${e}(已不存在)`);return n.length<=2?n.join(`、`):`${n.slice(0,2).join(`、`)} 等 ${n.length} 關`}function Pe(e,t,n){let r=e.map(e=>ze(t,e).name);return r.length===0?n:r.length<=2?r.join(`、`):`${r.slice(0,2).join(`、`)} 等 ${r.length} 人`}function Fe(e,t){return Le(e,t)?.name??`未指定組織`}function Ie(e,t){return Re(e,t)?.name??`未指定職位`}function Le(e,t){let n=e.find(e=>e.id===t);return n?o.a(n):null}function Re(e,t){let n=e.find(e=>e.id===t);return n?o.o(n):null}function ze(e,t){return e.find(e=>e.memberId===t)??Be(t)}function Be(e){return{displayName:`未知會員`,email:``,id:e,memberId:e,name:`未知會員`,unresolved:!0}}function F(e){return`不支援的簽核來源(${e})`}function Ve(e){switch(e.type){case`DIRECT`:return`指定成員`;case`POSITION`:return`指定職位`;case`ORG_UNIT_MEMBER`:return`單位成員`;case`ORG_UNIT_POSITION`:return`單位職位`;case`ORG_MANAGER`:return`主管`;case`ORG_MANAGER_CHAIN`:return`主管鏈`;case`ORG_UNIT_MANAGER`:return`單位主管`;case`DYNAMIC_FORM`:return`依表單欄位指定`;case`EXPRESSION`:return`運算式`;case`FORM_MEMBER_MANAGER`:return`表單欄位人員的主管`;case`FORM_ORG_UNIT_MANAGER`:return`表單欄位組織的主管`;case`NODE_ACTOR`:return`前面關卡的簽核者`;case`NODE_ACTOR_MANAGER`:return`前面關卡簽核者的主管`;default:return F((0,ee.readUnsupportedApproverResolverType)(e)??``)}}function I(e){return{...e.fallback===void 0?{}:{fallback:e.fallback},...e.preferClosestOrgUnit===void 0?{}:{preferClosestOrgUnit:e.preferClosestOrgUnit}}}function He(e){if((0,ee.readUnsupportedApproverResolverType)(e)!==null)return{mode:`UNSUPPORTED`,resolver:e,type:e.type};switch(e.type){case`DYNAMIC_FORM`:return{formPath:e.formPath,levelsUp:null,mode:e.type};case`FORM_MEMBER_MANAGER`:return{...I(e),formPath:e.formPath,levelsUp:e.levelsUp,mode:`DYNAMIC_FORM`};case`ORG_UNIT_MANAGER`:return{...I(e),formPath:``,mode:e.type,orgSource:`FIXED`,orgUnitId:e.orgUnitId};case`FORM_ORG_UNIT_MANAGER`:return{...I(e),formPath:e.formPath,mode:`ORG_UNIT_MANAGER`,orgSource:`FORM_FIELD`,orgUnitId:``};case`NODE_ACTOR`:return{levelsUp:null,mode:e.type,nodeIds:e.nodeIds};case`NODE_ACTOR_MANAGER`:return{...I(e),levelsUp:e.levelsUp,mode:`NODE_ACTOR`,nodeIds:e.nodeIds};default:return{mode:`AS_STORED`,resolver:e}}}function Ue(e){return e.mode===`AS_STORED`||e.mode===`UNSUPPORTED`?e.resolver:e.mode===`DYNAMIC_FORM`?e.levelsUp===null?{formPath:e.formPath,type:`DYNAMIC_FORM`}:{...I(e),formPath:e.formPath,levelsUp:e.levelsUp,type:`FORM_MEMBER_MANAGER`}:e.mode===`ORG_UNIT_MANAGER`?e.orgSource===`FIXED`?{...I(e),orgUnitId:e.orgUnitId,type:`ORG_UNIT_MANAGER`}:{...I(e),formPath:e.formPath,type:`FORM_ORG_UNIT_MANAGER`}:e.levelsUp===null?{nodeIds:e.nodeIds,type:`NODE_ACTOR`}:{...I(e),levelsUp:e.levelsUp,nodeIds:e.nodeIds,type:`NODE_ACTOR_MANAGER`}}function We(e,t){return e.mode===`DYNAMIC_FORM`||e.mode===`NODE_ACTOR`?{...e,levelsUp:t>0?t:null}:e}function Ge(e,t){return e.mode===`ORG_UNIT_MANAGER`?{...e,orgSource:t,...t===`FORM_FIELD`&&e.preferClosestOrgUnit===void 0?{preferClosestOrgUnit:!0}:{}}:e}var Ke=`UNSUPPORTED`,qe=`此引擎版本不支援這種簽核來源;這裡選擇其他簽核來源會覆寫原設定`;function Je(e){if(e.mode===`UNSUPPORTED`){let t={id:Ke,name:F(e.type)};return{hint:qe,options:[...A,t],selected:t}}let t=e.mode===`AS_STORED`?Te(e.resolver.type):e.mode;return{hint:null,options:A,selected:A.find(e=>e.id===t)??A[0]}}function Ye(e,t,n){if(t===null||!A.some(e=>e.id===t))return null;let r=He(e);return t===(r.mode===`AS_STORED`?r.resolver.type:r.mode===`UNSUPPORTED`?null:r.mode)?null:Ee(t,n)}function Xe(e){if(e.mode!==`DYNAMIC_FORM`&&e.mode!==`NODE_ACTOR`)return null;let t=e.mode===`DYNAMIC_FORM`?M:N;if(e.levelsUp===null)return{invalid:!1,options:t,selected:t[0]};let n=P(t,e.levelsUp);return{invalid:n.id.startsWith(`invalid:`),options:t.some(e=>e.id===n.id)?t:[...t,n],selected:n}}function Ze(e,t){let n=Xe(e),r=n?.options.find(e=>e.id===t);return!n||!r||r.id.startsWith(`invalid:`)||r.id===n.selected.id?null:We(e,r.value)}function Qe(e){return De(e)?{fallback:e.fallback??{type:`NONE`},preferClosestOrgUnit:`preferClosestOrgUnit`in e&&!!e.preferClosestOrgUnit,showPreferClosestOrgUnit:e.type!==`ORG_MANAGER_CHAIN`}:null}function $e(e,t){return!De(e)||e.type===`ORG_MANAGER_CHAIN`?e:{...e,preferClosestOrgUnit:t}}var et=[{id:`SINGLE`,name:`單人簽核`},{id:`PARALLEL_ANY`,name:`任一人同意`},{id:`PARALLEL_ALL`,name:`全部同意`},{id:`SEQUENTIAL`,name:`依序簽核`},{id:`QUORUM`,name:`達到指定門檻`}];function tt(e){if(!e||e.type===`SINGLE`||e.type===`PARALLEL_ANY`)return`可指定多位;多位時所有人都會收到待辦,任一人同意即可通過。`;if(e.type===`PARALLEL_ALL`)return`可指定多位;多位時所有人都會收到待辦,全部同意後才會通過。`;if(e.type===`SEQUENTIAL`)return`依簽核人順序一次開放一位,前一位核准後才輪到下一位;任一位拒絕或退回即結束此關。`;let t=e.thresholdType===`PERCENTAGE`?`%`:` 位簽核者`;return`可指定多位;需達到 ${e.threshold}${t} 才會通過。`}function nt(e){return et.find(t=>t.id===e)||{id:e,name:`未知決策方式(${e})`}}function rt({directory:e,initialState:t,layout:n,onLayout:r}){let[i,a]=(0,l.useState)(t),o=(0,l.useRef)(t),s=(0,l.useRef)(e);s.current=e;let c=(0,l.useCallback)(e=>{if(!e.changed&&!e.error)return e;let t=e.effects.layout?n(e.state.definition):e.state.definition,i={...e.state,definition:t};return o.current=i,a(i),e.effects.layout&&r?.(t),{...e,state:i}},[n,r]),u=(0,l.useCallback)(e=>c((0,g.applyWorkflowCommand)(o.current,e)),[c]),d=(0,l.useCallback)(e=>c((0,g.applyWorkflowMacroCommand)(o.current,e)),[c]),f=(0,l.useCallback)(async(e,t)=>{let n=await(0,g.executeWorkflowTool)(o.current,e,t,{directory:s.current});if(n.ok&&(n.kind===`mutation`||n.kind===`macro`)){let e=c(n.result);return{...n,result:e,snapshot:(0,g.readWorkflowSnapshot)(e.state)}}return n},[c]),p=(0,l.useCallback)(e=>{let t=typeof e==`function`?e(o.current):e;o.current=t,a(t)},[]),m=(0,l.useCallback)(()=>o.current,[]),h=(0,l.useMemo)(()=>(0,g.readWorkflowSnapshot)(i),[i]);return(0,l.useMemo)(()=>({dispatch:u,dispatchMacro:d,executeTool:f,getState:m,replaceState:p,snapshot:h,state:i,tools:g.WORKFLOW_TOOLSET}),[u,d,f,m,p,h,i])}function it({controller:e,api:t=`/api/chat`}){let n=(0,l.useMemo)(()=>new h.DefaultChatTransport({api:t}),[t]),r=(0,te.useChat)({transport:n,sendAutomaticallyWhen:h.lastAssistantMessageIsCompleteWithToolCalls,async onToolCall({toolCall:t}){let n=await e.executeTool(t.toolName,t.input);n.ok?r.addToolOutput({output:n.kind===`query`?n.data:n.snapshot,tool:t.toolName,toolCallId:t.toolCallId}):r.addToolOutput({errorText:n.error,state:`output-error`,tool:t.toolName,toolCallId:t.toolCallId})}});return r}var at=12;function ot(){let e=globalThis.LanguageModel;return e&&typeof e==`object`?e:null}var st={additionalProperties:!1,properties:{action:{enum:[`tool`,`message`],type:`string`},input:{type:`object`},text:{type:`string`},tool:{type:`string`}},required:[`action`],type:`object`};function ct(){return`你是「簽核流程設計器」頁面的離線 AI 助理。只能透過下列工具操作這個流程畫布,其他請求一律婉拒並引導回流程設計。
|
|
2
|
+
|
|
3
|
+
每一步只輸出一個 JSON 決策物件:
|
|
4
|
+
- 呼叫工具:{"action":"tool","tool":"<工具名>","input":{...}}
|
|
5
|
+
- 回覆使用者(完成或詢問):{"action":"message","text":"<繁體中文訊息>"}
|
|
6
|
+
|
|
7
|
+
規則:先用 get_workflow_snapshot 了解現況再規劃;完成後用 validate_workflow 檢查並以 message 說明做了什麼。
|
|
8
|
+
|
|
9
|
+
可用工具:
|
|
10
|
+
${g.WORKFLOW_TOOLSET.map(e=>`- ${e.name}(${JSON.stringify(e.inputSchema.properties??{})}): ${e.description}`).join(`
|
|
11
|
+
`)}`}function lt({controller:e}){let[t,n]=(0,l.useState)(!1),[r,i]=(0,l.useState)([]),[a,o]=(0,l.useState)(`ready`),s=(0,l.useRef)(0);(0,l.useEffect)(()=>{let e=ot();e&&e.availability().then(e=>{n(e!==`unavailable`)}).catch(()=>n(!1))},[]);let c=(0,l.useCallback)((e,t)=>{s.current+=1,i(n=>[...n,{id:`chrome-${s.current}`,parts:[{text:t,type:`text`}],role:e}])},[]);return{available:t,messages:r,send:(0,l.useCallback)(t=>{let n=ot();n&&a===`ready`&&(c(`user`,t),o(`submitted`),ut({appendMessage:c,controller:e,model:n,userText:t}).then(()=>o(`ready`)).catch(e=>{c(`assistant`,ft(e)),o(`error`)}))},[c,e,a]),status:a}}async function ut({appendMessage:e,controller:t,model:n,userText:r}){let i=await n.create({initialPrompts:[{content:ct(),role:`system`}]});try{let n=`使用者需求:${r}\n目前流程:${JSON.stringify(t.snapshot)}`;for(let r=0;r<at;r+=1){let r=dt(await i.prompt(n,{responseConstraint:st}));if(!r||r.action===`message`){e(`assistant`,r?.text??`我已完成可處理的部分。`);return}if(!r.tool){e(`assistant`,`我已完成可處理的部分。`);return}let a=await t.executeTool(r.tool,r.input??{});if(a.ok){let t=a.kind===`query`?a.data:a.snapshot;e(`assistant`,`⚙ ${r.tool}`),n=`工具 ${r.tool} 已執行。最新流程:${JSON.stringify(t)}\n請決定下一步。`}else n=`工具 ${r.tool} 失敗:${a.error}\n請改用其他方式或回覆使用者。`}e(`assistant`,`已達到單次操作步數上限,請告訴我下一步。`)}finally{i.destroy()}}function dt(e){try{let t=JSON.parse(e);return typeof t==`object`&&t&&t.action!==void 0?t:null}catch{return null}}function ft(e){return e instanceof Error?`離線模式發生錯誤:${e.message}`:`離線模式發生未知錯誤。`}var L={display:`flex`,flexDirection:`column`,gap:12,height:`100%`},pt={display:`flex`,flex:1,flexDirection:`column`,gap:12,minHeight:0,overflowY:`auto`},mt={display:`flex`,gap:8,paddingBottom:4},ht={borderTop:`1px solid var(--mzn-color-border-neutral, #e5e7eb)`,display:`flex`,flexDirection:`column`,gap:8,paddingTop:12},gt={display:`flex`,justifyContent:`flex-end`},_t={width:`100%`},R=`workflow-chat-input-field`,vt=`
|
|
12
|
+
.${R}.mzn-text-field {
|
|
13
|
+
width: 100%;
|
|
14
|
+
}
|
|
15
|
+
`,z={color:`var(--mzn-color-text-secondary, #6b7280)`,fontSize:12,padding:`2px 0`},yt={"input-available":`執行中…`,"input-streaming":`準備中…`,"output-available":`完成`,"output-error":`失敗`};function bt(e){let t=e===`user`;return{alignSelf:t?`flex-end`:`flex-start`,background:t?`var(--mzn-color-primary, #2563eb)`:`var(--mzn-color-surface, #f3f4f6)`,borderRadius:10,color:t?`#fff`:`var(--mzn-color-text-primary, #111827)`,maxWidth:`85%`,padding:`8px 12px`,whiteSpace:`pre-wrap`,wordBreak:`break-word`}}function xt({api:e,controller:t,onClose:n,open:r}){let i=it({api:e,controller:t}),a=lt({controller:t}),[o,s]=(0,l.useState)(`online`),[c,p]=(0,l.useState)(``),m=o===`offline`?{messages:a.messages,send:a.send,status:a.status}:{messages:i.messages,send:e=>{i.sendMessage({text:e})},status:i.status},{messages:h,send:g}=m,_=m.status===`submitted`||m.status===`streaming`,v=(0,l.useCallback)(()=>{let e=c.trim();e&&!_&&(p(``),g(e))},[_,c,g]),y=(0,l.useCallback)(e=>{e.nativeEvent.isComposing||e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),v())},[v]);return(0,d.jsxs)(f.default,{headerTitle:`AI 流程助理`,isHeaderDisplay:!0,onClose:n,open:r,size:`medium`,children:[(0,d.jsx)(`style`,{children:vt}),(0,d.jsxs)(`div`,{style:L,children:[a.available?(0,d.jsxs)(`div`,{style:mt,children:[(0,d.jsx)(u.Button,{onClick:()=>s(`online`),variant:o===`online`?`base-primary`:`base-tertiary`,children:`線上`}),(0,d.jsx)(u.Button,{onClick:()=>s(`offline`),variant:o===`offline`?`base-primary`:`base-tertiary`,children:`離線(裝置內,實驗)`})]}):null,(0,d.jsxs)(`div`,{role:`log`,style:pt,children:[h.length===0?(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`body`,children:`用一句話描述你想要的流程,例如:「建立三關簽核:部門主管 → 經理 → 財務,金額大於十萬走財務複核」。我會直接在畫布上幫你繪製。`}):null,h.map(e=>(0,d.jsx)(l.Fragment,{children:St(e)},e.id)),_?(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`body`,children:`思考中…`}):null]}),(0,d.jsxs)(`div`,{style:ht,children:[(0,d.jsx)(u.Textarea,{className:R,disabled:_,maxLength:2e3,onChange:e=>p(e.target.value),onKeyDown:y,placeholder:`描述你想要的流程…(Enter 送出,Shift + Enter 換行)`,rows:3,style:_t,value:c}),(0,d.jsx)(`div`,{style:gt,children:(0,d.jsx)(u.Button,{disabled:_||c.trim().length===0,loading:_,onClick:v,type:`button`,variant:`base-primary`,children:`送出`})})]})]})]})}function St(e){return e.parts.map((t,n)=>{if(t.type===`text`)return(0,d.jsx)(`div`,{style:bt(e.role),children:t.text},`${e.id}-${n}`);if(t.type===`dynamic-tool`||(0,h.isToolUIPart)(t)){let r=(0,h.getToolName)(t),i=yt[t.state]??t.state;return(0,d.jsx)(`div`,{style:z,children:`⚙ ${r} · ${i}`},`${e.id}-${n}`)}return null})}var Ct={DEFAULT:`預設`,FILL_OPTIONAL:`補填(選填)`,FILL_REQUIRED:`補填(必填)`,HIDE:`隱藏`,SHOW:`顯示`},wt={FILL:`填寫`,FILL_OPTIONAL:`補填(選填)`,FILL_REQUIRED:`補填(必填)`,HIDDEN:`隱藏`,NOT_SHOWN:`不顯示`,READ_ONLY:`唯讀`},Tt={approverFilledFieldDataSource:`選項來自資料來源,不能補填`,approverFilledFieldFileUpload:`檔案上傳欄位不能補填`,approverFilledFieldFormRule:`表單已設定必填、顯示或預設值等規則,不能補填`,approverFilledTableDataSourceColumn:`表格含資料來源欄,不能補填`},Et=`開關欄位只能選填補填:開關關著也是答案,不能要求必填。`,Dt=`「隱藏」只影響這一關的畫面,不是權限:資料查詢仍拿得到值,不能用來保密。`;function Ot(e){return`關卡 ${e.stage}`}function kt(e){let t=(0,g.readNodeFieldAccess)(e);return{fill:t.filter(e=>e.fill!==`NONE`).length,hidden:t.filter(e=>e.fill===`NONE`&&e.display===`HIDE`).length,required:t.filter(e=>e.fill===`REQUIRED`).length}}function At(e){let{fill:t,hidden:n}=kt(e),r=[...t>0?[`補填 ${t}`]:[],...n>0?[`隱藏 ${n}`]:[]];return r.length?r.join(` · `):null}var jt=new Set([`fieldAccessAutoApprove`,`fieldAccessGroupPolicy`,`fieldAccessSkipNode`]);function Mt(e){return jt.has(e.code)}var Nt={display:`grid`,gap:12,gridTemplateColumns:`minmax(0, 1fr)`,padding:`var(--mzn-spacing-padding-vertical-spacious) var(--mzn-spacing-padding-horizontal-spacious)`},Pt={display:`grid`,gap:4},Ft={display:`grid`};function It(e){return e.nodes.filter(e=>e.type===`userTask`).flatMap(e=>(0,g.readNodeFieldAccess)(e).filter(g.isFieldAccessEntryValid).map(t=>({...t,nodeId:e.id})))}function Lt(e,t,n,r){let i=e.findIndex(e=>e.nodeId===t&&e.fieldKey===n);return i===-1?r===null?e:[...e,r]:e.flatMap((e,t)=>t===i?r===null?[]:[r]:[e])}function Rt(e,t,n,r){let i=(0,g.readFieldAccessEntryForChoice)(n,r);return Lt(e,t,n,i===null?null:{...i,nodeId:t})}function B(e){return`${e.nodeId}\u0000${e.fieldKey}`}function zt(e,t,n,r){let i=new Map(t.map(e=>[B(e),e])),a=new Map(n.map(e=>[B(e),e]));return[...t,...n].filter((e,t,n)=>n.findIndex(t=>B(t)===B(e))===t&&JSON.stringify(i.get(B(e)))!==JSON.stringify(a.get(B(e)))).reduce((e,t)=>Lt(e,t.nodeId,t.fieldKey,a.get(B(t))??null),e).filter(e=>r.has(e.nodeId))}function Bt(e){return new Set(e.nodes.filter(e=>e.type===`userTask`).map(e=>e.id))}function Vt(e,t,n){return(0,g.applyWorkflowCommand)({definition:e,editingEdgeId:null,formDefinitionVersionId:null,formSchema:t,initiatorPolicyCel:null,selectedEdgeIds:[],selectedNodeId:null},{entries:n,type:`setFieldAccessMatrix`}).state.definition}function V(e){return e.nodes.every(t=>t.type!==`userTask`||t.data.fieldAccess===void 0||Ht(t.data.fieldAccess)===Ht(It({...e,nodes:[t]})))}function Ht(e){return JSON.stringify(Array.isArray(e)?e.map(Ut):e)}function Ut(e){if(typeof e!=`object`||!e||Array.isArray(e))return e;let{display:t,fieldKey:n,fill:r}=e;return[t,n,r]}function Wt(e,t){return JSON.stringify(e)===JSON.stringify(t)}var Gt={columns:[],issues:[],rows:[]};function Kt(e,t){let n=It(e);return{draft:n,initial:n,pinnedFieldKeys:new Set((0,g.readFieldAccessMatrix)(e,t).rows.filter(qt).map(e=>e.fieldKey))}}function qt(e){return e.cells.some(e=>e.explicit!==null)||e.issues.length>0||e.notices.length>0}function Jt(e){return g.FIELD_ACCESS_CHOICES.filter(t=>t===e.choice||!e.disabledChoices.includes(t)).map(t=>({id:t,name:t===`DEFAULT`&&e.choice===`DEFAULT`?`預設:${wt[e.effective]}`:Ct[t]}))}function H(e,t){if(e.applicant.effective===`FILL`)return wt.FILL;let n=e.fillNodeIds.map(e=>t.find(t=>t.nodeId===e)).filter(e=>!!e).map(Ot).join(`、`);return`${wt.NOT_SHOWN}(${n} 補填)`}function Yt({definition:e,formSchema:t,language:n,onApply:r,onClose:i,open:a}){let[o,s]=(0,l.useState)(null),[c,p]=(0,l.useState)(!0),[m,h]=(0,l.useState)(null);if(a&&o===null){let n=Kt(e,t);s(n),p(n.pinnedFieldKeys.size>0),h(null)}!a&&o!==null&&s(null);let _=(0,l.useMemo)(()=>o===null?null:zt(It(e),o.initial,o.draft,Bt(e)),[e,o]),v=(0,l.useMemo)(()=>_===null?e:Vt(e,t,_),[e,_,t]),y=(0,l.useMemo)(()=>_===null?Gt:(0,g.readFieldAccessMatrix)(v,t),[v,_,t]),b=o?.pinnedFieldKeys??new Set,x=e=>(0,S.readWorkflowLintMessage)(e,v,n),C=y.rows.filter(e=>!c||b.has(e.fieldKey)||qt(e)),ee=y.rows.length-C.length,te=new Set(y.rows.map(e=>e.fieldKey)),ne=y.issues.filter(e=>!e.fieldKeys.some(e=>te.has(e)));function re(e,t,n){h(null),s(r=>r===null?null:{...r,draft:Rt(r.draft,e,t,n),pinnedFieldKeys:new Set([...r.pinnedFieldKeys,t])})}function ie(){let t=_===null||Wt(_,It(e))&&V(e)?null:r(_);t===null?i():h(t)}let w=[{ellipsis:!1,fixed:`start`,key:`field`,render:({row:e})=>(0,d.jsxs)(`div`,{style:Ft,children:[(0,d.jsx)(u.Typography,{variant:`label-primary`,children:e.field.label}),(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`caption`,children:e.fieldKey})]}),title:`欄位`,width:180},{ellipsis:!1,key:`applicant`,render:({row:e})=>H(e,y.columns),title:`申請人`,width:160},...y.columns.map((e,t)=>({ellipsis:!1,key:`node:${e.nodeId}`,render:({row:n})=>{let r=n.cells[t],i=Jt(r);return(0,d.jsx)(u.Select,{clearable:!1,inputProps:{"aria-label":`${n.field.label} 在${Ot(e)}的設定`},onChange:t=>re(e.nodeId,n.fieldKey,i.find(e=>e.id===t?.id)?.id??`DEFAULT`),options:[...i],size:`sub`,value:i.find(e=>e.id===r.choice)??null})},title:(0,d.jsxs)(`div`,{style:Pt,children:[(0,d.jsxs)(u.Typography,{color:`text-neutral`,variant:`caption`,children:[Ot(e),e.branchLabel?` · 分支:${e.branchLabel}`:``]}),(0,d.jsx)(u.Typography,{variant:`label-primary`,children:e.label})]}),width:224})),{ellipsis:!1,key:`check`,render:({row:e})=>T(e),title:`檢查`,width:280}];function T(e){let t=e.issues.map(e=>x(e.message)),n=e.notices.map(e=>{let t=y.columns.find(t=>t.nodeId===e.nodeId);return`${t?Ot(t):e.nodeId} 會看到空白欄位:這一關之前還沒有人補填。`}),r=e.fillNodeIds.length===0?[...e.fillBlockers.flatMap(e=>{let t=Tt[e.code];return t?[t]:[]}),...e.field.type===`boolean`?[Et]:[]]:[];return t.length+n.length+r.length===0?(0,d.jsx)(u.Badge,{text:`沒有問題`,variant:`dot-success`}):(0,d.jsxs)(`div`,{style:Pt,children:[t.map(e=>(0,d.jsx)(u.Badge,{text:e,variant:`dot-warning`},`warning:${e}`)),n.map(e=>(0,d.jsx)(u.Badge,{text:e,variant:`dot-info`},`notice:${e}`)),[...new Set(r)].map(e=>(0,d.jsx)(u.Badge,{text:e,variant:`dot-info`},`blocker:${e}`))]})}return(0,d.jsx)(f.default,{bottomGhostActionText:`取消`,bottomOnGhostActionClick:i,bottomOnPrimaryActionClick:ie,bottomPrimaryActionText:`套用`,headerTitle:`欄位與關卡總覽`,isBottomDisplay:!0,isHeaderDisplay:!0,onClose:i,open:a,size:`wide`,children:(0,d.jsxs)(`div`,{style:Nt,children:[m===null?null:(0,d.jsxs)(`div`,{style:Pt,children:[(0,d.jsx)(u.InlineMessage,{content:`無法套用,編輯內容仍保留。`,severity:`error`}),(0,d.jsx)(u.Badge,{text:m,variant:`dot-error`})]}),(0,d.jsxs)(`div`,{style:Pt,children:[y.issues.length>0?(0,d.jsx)(u.InlineMessage,{content:`有 ${y.issues.length} 個欄位設定問題,處理完才能發布。`,severity:`warning`}):(0,d.jsx)(u.InlineMessage,{content:`補填由該關的簽核人在核准時填寫。`,severity:`info`}),(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`caption`,children:y.issues.length>0?`問題標示在各欄位的「檢查」欄。`:`申請人送出時看不到補填欄位。${Dt}發布時還會檢查條件是否在補填前就讀取這些欄位。`}),ne.map(e=>(0,d.jsx)(u.Badge,{text:x(e.message),variant:`dot-warning`},e.message))]}),(0,d.jsx)(u.Toggle,{checked:c,inputProps:{"aria-label":`只看有設定或有問題的欄位`},label:`只看有設定或有問題的欄位`,onChange:e=>p(e.target.checked),size:`sub`}),ee>0?(0,d.jsxs)(u.Typography,{color:`text-neutral`,variant:`caption`,children:[`已收起 `,ee,` 個沒有設定也沒有問題的欄位。`]}):null,t===null?(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`body`,children:`尚未綁定表單,沒有可設定的欄位。`}):(0,d.jsx)(u.Table,{columns:w,dataSource:C.map(e=>({key:e.fieldKey,row:e})),fullWidth:!0})]})})}var Xt={borderTop:`1px solid var(--mzn-color-border-neutral)`,display:`grid`,gap:8,paddingTop:12},Zt={alignItems:`center`,display:`flex`,gap:8,justifyContent:`space-between`};function Qt({definition:e,language:t,node:n,onOpenMatrix:r,onRemoveLegacy:i,openDisabledReason:a}){let o=kt(n),s=(0,g.readNodeFieldAccessIssues)(n).filter(Mt).map(n=>(0,S.readWorkflowLintMessage)(n.message,e,t));return(0,d.jsxs)(`section`,{"aria-label":`欄位顯示與補填`,style:Xt,children:[(0,d.jsxs)(`div`,{style:Zt,children:[(0,d.jsx)(u.Typography,{component:`h3`,variant:`h3`,children:`欄位顯示與補填`}),(0,d.jsx)(u.Button,{disabled:a!==null,onClick:r,size:`sub`,title:a??void 0,variant:`base-secondary`,children:`開啟欄位總覽`})]}),(0,d.jsxs)(u.Typography,{color:`text-neutral`,variant:`body`,children:[`本關補填 `,o.fill,` 個(必填 `,o.required,`)`]}),(0,d.jsxs)(u.Typography,{color:`text-neutral`,variant:`body`,children:[`本關隱藏 `,o.hidden,` 個`]}),(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`body`,children:`其他欄位依預設`}),a?(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`caption`,children:a}):null,(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`caption`,children:Dt}),n.data.fieldPermissions===void 0?null:(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(u.InlineMessage,{content:`含已停用的舊欄位權限設定`,severity:`warning`}),(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`caption`,children:`舊設定(fieldPermissions)從未生效,也不會自動轉換;移除後才能發布,需要的設定請在欄位總覽重新指定。`}),(0,d.jsx)(`div`,{children:(0,d.jsx)(u.Button,{onClick:i,size:`sub`,variant:`base-secondary`,children:`移除舊設定`})})]}),s.map(e=>(0,d.jsx)(u.Badge,{text:e,variant:`dot-warning`},e))]})}var $t={en:`An unknown error occurred`,"zh-TW":`發生未知錯誤`},en={en:`Webhook settings failed the publish check: `,"zh-TW":`Webhook 設定未通過發布檢查:`};function U(e,t,n){if(!(e instanceof Error))return $t[t];let r=n?(0,S.readWorkflowLintMessage)(e.message,n,t):e.message;return r.includes(`WORKFLOW_WEBHOOK_`)?`${en[t]}${r}`:(0,_.readFormSchemaLintMessage)(r,t)}var tn=`這個節點前面沒有可以選的簽核關卡,請先在它前面加入簽核節點(沒有進入條件、沒設跳過此關,也沒設逾時自動核准)`,nn=`簽核人取自你選的前面關卡實際簽核的人;可複選,整組要涵蓋每條路徑。複選多個關卡時,取最近實際走到的那一關的簽核人,不是全部關卡的簽核人。`,rn=`(無法使用)`,W=`(已不存在)`;function an(e){return e.type===`userTask`}function G(e){return e.data.label||e.id}function on(e,t,n){let r=e.nodes.filter(an).filter(n=>n.id!==t&&(0,C.readNodeActorSourceSkipReasons)(n).length===0&&(0,g.readReachableWorkflowNodeIds)(e.edges,[n.id]).has(t)).map(e=>({id:e.id,name:G(e)})),i=n.filter(e=>!r.some(t=>t.id===e)).map(t=>{let n=e.nodes.find(e=>e.id===t);return{id:t,name:n?`${G(n)}${rn}`:`${t}${W}`}}),a=[...r,...i],o=n.flatMap(e=>{let t=a.find(t=>t.id===e);return t?[t]:[]});return{options:a,problems:n.length>0?(0,C.readNodeActorSourceIssues)(e,t,n):a.length===0?[tn]:[],selected:o}}function sn(e){return e.nodes.filter(an).flatMap(t=>{let n=t.data.approverResolver;return n.type!==`NODE_ACTOR`&&n.type!==`NODE_ACTOR_MANAGER`||n.nodeIds.length===0?[]:(0,C.readNodeActorSourceIssues)(e,t.id,n.nodeIds).map(e=>`簽核節點「${G(t)}」:${e}`)})}var cn={"initiator.memberId":`發起人會員編號`,"instance.id":`案件編號`,"instance.templateId":`模板編號`,"instance.templateVersionId":`模板版本編號`,"instance.title":`案件主旨`,"node.id":`節點編號`,"node.label":`節點名稱`},ln={boolean:`是/否`,json:`JSON`,number:`數字`,string:`文字`,stringArray:`文字清單`};function K(e){return`${e.key}@${e.version}`}function q(e,t){return e.find(e=>e.key===t.key&&e.version===t.version)??null}function J(e){return[`FIELD`,...e===`stringArray`?[]:[`CONSTANT`],...e===`string`||e===`json`?[`CONTEXT`]:[]]}function un(e,t){return e.filter(e=>(0,C.isFormFieldCompatibleWithWebhookParameter)(e,t))}function dn(e,t,n){return e===`FIELD`?{fieldKey:un(n,t.type)[0]?.fieldKey??``,kind:`FIELD`}:e===`CONTEXT`?{kind:`CONTEXT`,path:`instance.title`}:{kind:`CONSTANT`,value:t.type===`boolean`?!0:t.type===`number`?null:``}}var fn=/^-?\d+(\.\d+)?$/;function pn(e,t){if(e!==`number`)return t;let n=t.trim();return n?fn.test(n)?Number(n):t:null}function mn(e){return!(0,C.readNotifyWebhookStructureIssues)(e).some(e=>hn.has(e.code))}var hn=new Set([`BINDING_INVALID`,`BINDING_SOURCE_INVALID`,`BINDINGS_NOT_ARRAY`,`ENDPOINT_KEY_REQUIRED`,`ENDPOINT_VERSION_INVALID`,`TARGET_ID_REQUIRED`,`TARGET_INVALID`,`WEBHOOKS_NOT_ARRAY`]);function Y(e,t,n){let r=e.bindings.filter(e=>e.parameter!==t),i=e.bindings.findIndex(e=>e.parameter===t);if(!n)return{...e,bindings:r};let a={from:n,parameter:t};return{...e,bindings:i===-1?[...e.bindings,a]:e.bindings.map((e,t)=>t===i?a:e)}}function gn(e,t,n){return{bindings:e.bindings.filter(r=>{let i=t.parameters.find(e=>e.key===r.parameter);return i!==void 0&&!(0,C.readNotifyWebhookTargetCatalogIssues)({endpoint:{parameters:[{...i,required:!1}]},formFields:n,target:{...e,bindings:[r]}}).length}),endpoint:{key:t.key,version:t.version},id:e.id}}function _n({definition:e,endpoints:t,formFields:n}){return e.nodes.flatMap(e=>e.type!==`serviceTask`||e.data.action.type!==`NOTIFY`||(0,C.readNotifyWebhookStructureIssues)(e.data.action.webhooks).length?[]:(0,C.readNotifyWebhookTargets)(e.data.action).flatMap((r,i)=>{let a=q(t,r.endpoint);return(0,C.readNotifyWebhookTargetCatalogIssues)({endpoint:a,formFields:n,target:r}).map(t=>(0,C.readNotifyWebhookCatalogIssueMessage)({endpointLabel:a?.label??K(r.endpoint),issue:t,nodeLabel:e.data.label,targetIndex:i}))}))}var vn={display:`grid`,gap:`var(--mzn-spacing-gap-base)`},yn={borderColor:`var(--mzn-color-border-neutral)`,borderRadius:`var(--mzn-radius-base)`,borderStyle:`solid`,borderWidth:1,display:`grid`,gap:`var(--mzn-spacing-gap-base)`,padding:`var(--mzn-spacing-padding-horizontal-base)`},bn={alignItems:`center`,display:`flex`,gap:`var(--mzn-spacing-gap-base)`,justifyContent:`space-between`},xn={display:`grid`,gap:`var(--mzn-spacing-gap-base)`,gridTemplateColumns:`minmax(0, 2fr) minmax(0, 3fr)`},Sn={id:`NONE`,name:`不傳送`},Cn={CONSTANT:{id:`CONSTANT`,name:`固定值`},CONTEXT:{id:`CONTEXT`,name:`案件資訊`},FIELD:{id:`FIELD`,name:`表單欄位`}},wn=[{id:`true`,name:`是`},{id:`false`,name:`否`}],Tn=C.NOTIFY_WEBHOOK_CONTEXT_PATHS.map(e=>({id:e,name:cn[e]}));function En({catalog:e,catalogState:t,formFields:n,onChange:r,targets:i}){let a=e.filter(e=>!e.deprecated);if(!i.length&&(t===`unavailable`||t===`ready`&&!a.length))return null;function o(e,t){r(i.map((n,r)=>r===e?t:n))}function s(){let[e]=a;e&&r([...i,(0,C.createNotifyWebhookTarget)({key:e.key,version:e.version})])}return(0,d.jsxs)(`div`,{style:vn,children:[(0,d.jsx)(u.Typography,{variant:`label-primary-highlight`,children:`Webhook`}),(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`caption`,children:`知會節點抵達時,將指定的表單欄位或案件資訊送到外部系統。`}),t===`loading`?(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`body`,children:`正在載入可用的 Webhook 端點…`}):null,t===`unavailable`?(0,d.jsx)(u.Typography,{color:`text-error`,variant:`body`,children:`目前無法載入 Webhook 端點,已設定的內容會保留,請稍後重試。`}):null,i.map((s,c)=>(0,d.jsx)(Dn,{activeEndpoints:a,catalog:e,catalogState:t,formFields:n,index:c,onChange:e=>o(c,e),onRemove:()=>r(i.filter((e,t)=>t!==c)),target:s},s.id)),(0,d.jsx)(`div`,{children:(0,d.jsx)(u.Button,{disabled:t!==`ready`||!a.length||i.length>=C.NOTIFY_WEBHOOK_TARGET_LIMIT,icon:m.PlusIcon,iconType:`leading`,onClick:s,variant:`base-dashed`,children:`新增 Webhook`})}),i.length>=C.NOTIFY_WEBHOOK_TARGET_LIMIT?(0,d.jsxs)(u.Typography,{color:`text-neutral`,variant:`caption`,children:[`每個知會節點最多 `,C.NOTIFY_WEBHOOK_TARGET_LIMIT,` 個 Webhook。`]}):null]})}function Dn({activeEndpoints:e,catalog:t,catalogState:n,formFields:r,index:i,onChange:a,onRemove:o,target:c}){let l=q(t,c.endpoint),f=K(c.endpoint),p=[...e.map(e=>({id:K(e),name:jn(e)})),...l&&!l.deprecated?[]:[{id:f,name:l?jn(l):`${f}(找不到端點)`}]],h=new Set((l?.parameters??[]).map(e=>e.key)),g=l?c.bindings.filter(e=>!h.has(e.parameter)):[];return(0,d.jsxs)(`div`,{style:yn,children:[(0,d.jsxs)(`div`,{style:bn,children:[(0,d.jsxs)(u.Typography,{variant:`label-primary`,children:[`第 `,i+1,` 個 Webhook`]}),(0,d.jsx)(u.Button,{icon:m.TrashIcon,iconType:`leading`,onClick:o,variant:`destructive-text-link`,children:`移除`})]}),(0,d.jsx)(s.t,{label:`端點`,name:`webhookEndpoint-${c.id}`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,disabled:n!==`ready`,onChange:t=>{let n=e.find(e=>K(e)===t?.id);n&&a(gn(c,n,r??[]))},options:[...p],placeholder:`選擇端點`,value:p.find(e=>e.id===f)??null})}),n===`ready`&&!l?(0,d.jsx)(u.Typography,{color:`text-warning`,variant:`body`,children:`找不到這個端點,設定會保留;請改選其他端點或移除,否則無法發布。`}):null,l?.disabled?(0,d.jsx)(u.Typography,{color:`text-warning`,variant:`body`,children:`這個端點已被管理者停用,不會再送出;設定會保留,請改選其他端點,否則無法發布。`}):l?.deprecated?(0,d.jsx)(u.Typography,{color:`text-warning`,variant:`body`,children:`這個端點不建議再使用,設定會保留;請改選其他端點,否則無法發布。`}):null,l?.description?(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`caption`,children:l.description}):null,l&&!l.parameters.length?(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`caption`,children:`這個端點不需要參數。`}):null,(l?.parameters??[]).map(e=>(0,d.jsx)(On,{formFields:r,onChange:t=>a(Y(c,e.key,t)),parameter:e,source:c.bindings.find(t=>t.parameter===e.key)?.from??null,targetId:c.id},e.key)),g.map(e=>(0,d.jsxs)(`div`,{style:bn,children:[(0,d.jsxs)(u.Typography,{color:`text-warning`,variant:`body`,children:[`參數「`,e.parameter,`」已不在端點定義中。`]}),(0,d.jsx)(u.Button,{onClick:()=>a(Y(c,e.parameter,null)),variant:`base-text-link`,children:`移除設定`})]},e.parameter))]})}function On({formFields:e,onChange:t,parameter:n,source:r,targetId:i}){let a=r?.kind===`FIELD`||un(e??[],n.type).length>0,o=[...n.required?[]:[Sn],...J(n.type).filter(e=>e!==`FIELD`||a).map(e=>Cn[e])],c=ln[n.type];return(0,d.jsx)(s.t,{hintText:[n.key,c,n.description].filter(Boolean).join(` · `),label:n.label,name:`webhookBinding-${i}-${n.key}`,required:n.required,children:(0,d.jsxs)(`div`,{style:xn,children:[(0,d.jsx)(u.Select,{clearable:!1,onChange:r=>{let i=Mn(r?.id??null);t(i?dn(i,n,e??[]):null)},options:[...o],placeholder:`選擇來源`,value:r?Cn[r.kind]:n.required?null:Sn}),r?(0,d.jsx)(kn,{formFields:e,onChange:t,parameter:n,source:r}):null]})})}function kn({formFields:e,onChange:t,parameter:n,source:r}){if(r.kind===`FIELD`){if(!e)return(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`caption`,children:`請先綁定表單版本,才能選擇表單欄位。`});let i=un(e,n.type).map(e=>({id:e.fieldKey,name:`${e.label}(${e.fieldKey})`})),a=r.fieldKey&&!i.some(e=>e.id===r.fieldKey)?[...i,{id:r.fieldKey,name:`${r.fieldKey}(找不到相容欄位)`}]:i;return(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>t({fieldKey:e?.id??``,kind:`FIELD`}),options:[...a],placeholder:a.length?`選擇表單欄位`:`沒有型別相容的欄位`,value:a.find(e=>e.id===r.fieldKey)??null})}return r.kind===`CONTEXT`?(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>{(0,C.isNotifyWebhookContextPath)(e?.id)&&t({kind:`CONTEXT`,path:e.id})},options:[...Tn],value:Tn.find(e=>e.id===r.path)??null}):n.type===`boolean`?(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>t({kind:`CONSTANT`,value:e?.id===`true`}),options:[...wn],value:typeof r.value==`boolean`?wn.find(e=>e.id===String(r.value))??null:null}):(0,d.jsx)(An,{onChange:e=>t({kind:`CONSTANT`,value:e}),type:n.type,value:r.value})}function An({onChange:e,type:t,value:n}){let[r,i]=(0,l.useState)(n===null?``:String(n));return(0,l.useEffect)(()=>{i(e=>pn(t,e)===n?e:n===null?``:String(n))},[t,n]),(0,d.jsx)(u.Input,{inputProps:{inputMode:t===`number`?`decimal`:void 0},onChange:n=>{i(n.target.value),e(pn(t,n.target.value))},placeholder:t===`number`?`輸入數字`:`輸入固定值`,value:r,variant:`base`})}function jn(e){let t=[`v${e.version}`,...e.source===`DATABASE`?[`後台維護`]:[],...e.disabled?[`已停用`]:e.deprecated?[`不建議使用`]:[]];return`${e.label}(${t.join(`,`)})`}function Mn(e){return e===`FIELD`||e===`CONSTANT`||e===`CONTEXT`?e:null}function Nn(e){return(e?.fields??[]).reduce((e,t)=>({...e,[t.fieldKey]:In(t)}),{})}function Pn(e){return`formMember:${e}`}function Fn(e){return`formOrgUnit:${e}`}function In(e){if(e.type===`number`||e.type===`money`)return 1e3;if(e.type===`boolean`)return!0;if(e.type===`member`){let t=Pn(e.fieldKey);return e.multiple?[t]:t}if(e.type===`org_unit`)return Fn(e.fieldKey);if((0,v.isFormOptionFieldDefinition)(e)){let t=(0,v.isFormStaticOptionFieldDefinition)(e)?e.options[0]?.value:void 0;if((0,v.readFormFieldSelectionMode)(e)===`multiple`)return t===void 0?[]:[t];if((0,v.isFormStaticOptionFieldDefinition)(e))return t??``}return e.type===`date`?`2026-05-08`:e.type===`datetime`?`2026-05-08T09:00:00+08:00`:e.placeholder??e.label}var Ln={1:`直屬主管`,2:`第二層主管`,3:`第三層主管`};function X(e){return Ln[e]??`第 ${e} 層主管`}function Rn(e,t){let[n,...r]=e.split(`:`),i=e=>t.orgUnits.find(t=>t.id===e)?.name??e,a=e=>t.positions.find(t=>t.id===e)?.name??e,o=e=>t.formFields.find(t=>t.fieldKey===e)?.label||e,s=e=>e.split(`,`).map(e=>t.nodes.find(t=>t.id===e)?.name??e).join(`、`);if(n===`position`&&r.length===1&&r[0])return`職位:${a(r[0])}(送出時依當下人員決定)`;if(n===`orgUnitMember`&&r.length===1&&r[0])return`組織任一人:${i(r[0])}`;if(n===`orgUnitPosition`&&r.length===2&&r[0]&&r[1])return`組織職位:${i(r[0])}/${a(r[1])}`;if(n===`orgUnitManager`&&r.length===1&&r[0])return`組織主管:${i(r[0])}`;if(n===`formMember`&&r.length===1&&r[0])return`表單欄位「${o(r[0])}」選的人(送出時依填寫內容決定)`;if(n===`orgManagerChain`&&r.length===1&&r[0])return`主管鏈:簽到職等 ${r[0]}(送出時依組織決定實際主管)`;let c=r.join(`:`),l=c.lastIndexOf(`:`),u=l>0?c.slice(0,l):``,d=l>0?Number(c.slice(l+1)):NaN,f=u!==``&&Number.isInteger(d)&&d>=1;return n===`formMemberManager`&&f?`表單欄位「${o(u)}」選的人的${X(d)}(送出時依填寫內容與組織決定)`:n===`formOrgUnitManager`&&c?`表單欄位「${o(c)}」所選組織的主管(送出時依填寫內容決定)`:n===`nodeActor`&&c?`前面關卡「${s(c)}」的簽核者(送出時依實際簽核者決定)`:n===`nodeActorManager`&&f?`前面關卡「${s(u)}」簽核者的${X(d)}(送出時依實際簽核者決定)`:t.memberName(e)??e}function zn(e){return`${e.draftVersion===null?`尚未建立草稿`:`草稿 v${e.draftVersion}`} · ${e.publishedVersion===null?e.hasPublishedVersion?`已發布版本`:`尚未發布`:`已發布 v${e.publishedVersion}`}`}function Bn(e,t){return`表單:${e} v${t}`}var Vn={display:`grid`,gap:16},Hn={alignItems:`start`,display:`grid`,gap:16,gridTemplateColumns:`minmax(0, 1fr) 420px`},Un={border:`1px solid var(--mzn-color-border-neutral)`,borderRadius:6,height:620,minWidth:0,overflow:`hidden`},Wn={alignItems:`center`,boxSizing:`border-box`,color:`var(--mzn-color-text-error)`,display:`flex`,height:26,justifyContent:`center`,lineHeight:0,padding:0,width:26},Gn={alignItems:`center`,display:`flex`,height:`100%`,justifyContent:`center`,width:`100%`},Kn=`workflow-designer-side-panel`,qn=96,Jn=`
|
|
16
|
+
.${Kn} .mzn-form-field--stretch .mzn-form-field__label-area,
|
|
17
|
+
.${Kn} .mzn-form-field--horizontal .mzn-form-field__label-area {
|
|
18
|
+
flex: 0 0 ${qn}px;
|
|
19
|
+
width: ${qn}px;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.${Kn} .mzn-form-field--stretch .mzn-form-field__data-entry,
|
|
23
|
+
.${Kn} .mzn-form-field--horizontal .mzn-form-field__data-entry {
|
|
24
|
+
min-width: 0;
|
|
25
|
+
}
|
|
26
|
+
`,Yn=`#2563eb`,Z=`#64748b`,Xn=`var(--mzn-color-text-error, #dc2626)`,Zn=`drop-shadow(0 0 3px rgba(0, 87, 255, 0.85)) drop-shadow(0 0 9px rgba(0, 87, 255, 0.36))`,Qn=`
|
|
27
|
+
.workflow-selection-delete-control.react-flow__controls-button {
|
|
28
|
+
align-items: center !important;
|
|
29
|
+
display: flex !important;
|
|
30
|
+
height: 26px !important;
|
|
31
|
+
justify-content: center !important;
|
|
32
|
+
padding: 0 !important;
|
|
33
|
+
width: 26px !important;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.workflow-selection-delete-control .mzn-icon {
|
|
37
|
+
align-items: center;
|
|
38
|
+
display: flex;
|
|
39
|
+
justify-content: center;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.workflow-selection-delete-control .mzn-icon svg {
|
|
43
|
+
height: 16px !important;
|
|
44
|
+
max-height: none !important;
|
|
45
|
+
max-width: none !important;
|
|
46
|
+
width: 16px !important;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.workflow-edge--selected .react-flow__edge-path,
|
|
50
|
+
.react-flow__edge-path.workflow-edge--selected {
|
|
51
|
+
filter: ${Zn};
|
|
52
|
+
opacity: 1 !important;
|
|
53
|
+
stroke: ${Z} !important;
|
|
54
|
+
stroke-opacity: 1 !important;
|
|
55
|
+
stroke-width: 1.5px !important;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.workflow-edge--selected {
|
|
59
|
+
--xy-edge-stroke: ${Z};
|
|
60
|
+
--xy-edge-stroke-selected: ${Z};
|
|
61
|
+
--xy-edge-stroke-width: 1.5px;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
`,$n={display:`grid`,gap:12},er={display:`grid`,gap:12},tr={border:`1px solid var(--mzn-color-border-neutral)`,borderRadius:6,display:`grid`,gap:8,maxHeight:360,overflow:`auto`,padding:12},nr={borderBottom:`1px solid var(--mzn-color-border-neutral)`,display:`grid`,gap:4,padding:`0 0 8px`},rr={display:`flex`,flexWrap:`wrap`,gap:8},ir={alignItems:`center`,display:`flex`,gap:8},ar={flex:`1 1 auto`,minWidth:0},or={flex:`0 0 auto`},sr={display:`grid`,gap:8},Q={alignContent:`center`,background:`var(--mzn-color-bg-surface)`,border:`1px solid var(--mzn-color-border-neutral)`,borderRadius:6,boxShadow:`0 8px 20px rgba(15, 23, 42, 0.08)`,boxSizing:`border-box`,display:`grid`,gap:4,height:`100%`,minWidth:132,overflow:`visible`,padding:`10px 12px`,textAlign:`center`,width:`100%`},cr=`0 8px 20px rgba(15, 23, 42, 0.08), 0 0 0 1px var(--mzn-color-primary, #0057ff), 0 0 10px rgba(0, 87, 255, 0.3)`,lr=64,ur=160,dr=20,fr=24,pr=`先綁定表單版本,才能設定欄位在各關的顯示與補填。`,mr=64,hr=180,gr={...Q,display:`grid`,gap:8,padding:`10px 12px`},_r={...gr,background:`#eff6ff`,border:`1px solid #2563eb`},vr={...gr,background:`#f0fdfa`,border:`1px solid #0f766e`},yr={...Q,background:`#ffffff`},br={...Q,background:`#ecfdf3`,border:`1px solid #2f855a`},xr={...Q,background:`#fff4ed`,border:`1px solid #c2410c`},Sr={display:`block`,maxWidth:`100%`,minWidth:0},Cr={display:`grid`,gap:2,minWidth:0},wr=`input`,Tr=`output`,Er={endEvent:`結束`,exclusiveGateway:`條件分流`,parallelGateway:`並行處理`,serviceTask:`系統`,startEvent:`開始`,userTask:`簽核`},Dr=[{icon:m.UserIcon,label:`簽核節點`,type:`userTask`},{icon:m.MailIcon,label:`知會節點`,type:`serviceTask`}],Or=[{icon:m.FilterIcon,label:`條件分流`,type:`exclusiveGateway`}],kr=[{id:`AND`,name:`全部前置完成`},{id:`OR`,name:`任一前置完成`}],Ar=[{id:`INITIATOR`,name:`退回申請人`},{id:`PREVIOUS`,name:`退回上一個節點`},{id:`ANY`,name:`由簽核者選擇(申請人或之前的簽核節點)`}],jr=[{id:`RESTART`,name:`重新送出後從開始重跑`},{id:`FROM_RETURN_POINT`,name:`重新送出後回到退回節點`}],Mr=[{id:`NONE`,name:`不提醒`,value:null},{id:`0.5`,name:`過半時提醒`,value:.5},{id:`0.75`,name:`剩四分之一時提醒`,value:.75},{id:`0.9`,name:`剩十分之一時提醒`,value:.9}],Nr=[{id:`COUNT`,name:`人數`},{id:`PERCENTAGE`,name:`百分比`}],Pr=[{id:`NONE`,name:`停止流程並提示`},{id:`DIRECT`,name:`固定改派`},{id:`POSITION`,name:`指定職位`}],Fr={id:`UNSUPPORTED`,name:`不支援的備援設定`},Ir=[{id:`INITIATOR_MANAGER`,name:`改由申請人的直屬主管簽核`},{id:`SKIP_NODE`,name:`跳過此關`},{id:`FAIL`,name:`停止流程並提示`}],Lr={whenEmpty:`INITIATOR_MANAGER`},Rr=[`EQUALS`,`GREATER_THAN`,`GREATER_THAN_OR_EQUALS`,`LESS_THAN`,`LESS_THAN_OR_EQUALS`,`NOT_EQUALS`],zr=[{id:`NONE`,name:`未設定`},{id:`ALL`,name:`所有人`},{id:`ORG_UNIT`,name:`指定組織`},{id:`ORG_UNIT_POSITION`,name:`指定組織職位`}],Br={id:`CUSTOM`,name:`既有自訂規則`},Vr=`member-001`,Hr={display:`flex`,flexDirection:`column`,height:`100%`},Ur={flex:1,minHeight:0,overflowY:`auto`},Wr={borderTop:`1px solid var(--mzn-color-border-neutral)`,display:`flex`,gap:8,paddingTop:12},Gr={fields:[],schemaVersion:1},Kr={layout:[],schemaVersion:1},qr={endEvent:Zr,exclusiveGateway:Zr,parallelGateway:Zr,serviceTask:Zr,startEvent:Zr,userTask:Zr};function Jr(e,t){return typeof e==`function`?e(t):e}function Yr({aiAssistantAvailable:e=!0,embedded:t=!1,formSchemaOverride:h,initialInitiatorPolicyCel:v,initialWorkflowDefinition:x,onInitiatorPolicyChange:te,onWorkflowChange:re,showAiAssistant:ie=!1,showDryRun:w=!0,templateId:T}){let ae=n.r(),oe=i.r(),E=a.i(),[D,se]=(0,l.useState)(null),[ce,O]=(0,l.useState)(null),[le,ue]=(0,l.useState)(``),[de,fe]=(0,l.useState)(null),[pe,me]=(0,l.useState)(null),ge=(0,l.useRef)(null),[ve,be]=(0,l.useState)(void 0),xe=(0,l.useRef)([]),Se=(0,l.useRef)([]),k=rt({directory:(0,l.useMemo)(()=>({listOrgUnits:async()=>xe.current.map(e=>({id:e.id,name:e.name})),listPositions:async()=>Se.current.map(e=>({id:e.id,name:e.name})),searchMembers:async e=>na(await(0,S.searchMemberOptions)(e)).map(e=>({email:e.email,id:e.memberId,name:e.name}))}),[]),initialState:{definition:t&&x!=null?li(x):mi(),editingEdgeId:null,formDefinitionVersionId:null,formSchema:null,initiatorPolicyCel:t&&v!==void 0?v:null,selectedEdgeIds:[],selectedNodeId:t&&x!=null?x.nodes[0]?.id??`start`:`start`},layout:gi,onLayout:e=>{let t=_a(e,ge.current);t&&be(t)}}),A=k.state.definition,M=k.state.formDefinitionVersionId,N=k.state.initiatorPolicyCel,we=k.state.selectedNodeId,P=k.state.selectedEdgeIds,Te=k.state.editingEdgeId,Ee=e=>k.replaceState(t=>({...t,definition:Jr(e,t.definition)})),De=e=>k.replaceState(t=>({...t,formDefinitionVersionId:Jr(e,t.formDefinitionVersionId)})),je=e=>k.replaceState(t=>({...t,initiatorPolicyCel:Jr(e,t.initiatorPolicyCel)})),Ne=e=>k.replaceState(t=>({...t,selectedNodeId:Jr(e,t.selectedNodeId)})),Pe=e=>k.replaceState(t=>({...t,selectedEdgeIds:Jr(e,t.selectedEdgeIds)})),Fe=e=>k.replaceState(t=>({...t,editingEdgeId:Jr(e,t.editingEdgeId)})),[Ie,F]=(0,l.useState)(null),[Ve,I]=(0,l.useState)(null);(0,l.useEffect)(()=>{I(null)},[we]);let[We,Ke]=(0,l.useState)(!0),[qe,it]=(0,l.useState)(!1),[at,ot]=(0,l.useState)(!1),[st,ct]=(0,l.useState)([]),lt=(0,l.useMemo)(()=>JSON.stringify({formDefinitionVersionId:M,initiatorPolicyCel:N,workflowDefinition:A}),[M,N,A]),ut=!!le&<!==le,[dt,ft]=(0,l.useState)(!1),[L,pt]=(0,l.useState)([]),[mt,ht]=(0,l.useState)([]),gt=(0,l.useRef)(0),_t=(0,l.useRef)(new Set),[R,vt]=(0,l.useState)([]),[z,yt]=(0,l.useState)([]),[bt,St]=(0,l.useState)([]);xe.current=R,Se.current=z;let[Ct,wt]=(0,l.useState)(!1),[Tt,Et]=(0,l.useState)(!1),[Dt,Ot]=(0,l.useState)(!1),[kt,At]=(0,l.useState)(`{}`),[jt,Mt]=(0,l.useState)(null),[Nt,Pt]=(0,l.useState)(null),[Ft,It]=(0,l.useState)([]),[Lt,Rt]=(0,l.useState)(`loading`),[B,zt]=(0,l.useState)(!1),[Bt,Vt]=(0,l.useState)(!1),[V,Ht]=(0,l.useState)(null),[Ut,Wt]=(0,l.useState)(!1),[Gt,Kt]=(0,l.useState)(!1),qt=ut||Ut?`保存並發布`:ce?`發布草稿`:`已發布`;(0,l.useEffect)(()=>{t?vn():yn()},[t,T]),(0,l.useEffect)(()=>{function e(e){ut&&(e.preventDefault(),e.returnValue=``)}return window.addEventListener(`beforeunload`,e),()=>{window.removeEventListener(`beforeunload`,e)}},[ut]),(0,l.useEffect)(()=>{Sn(A)},[A,L]),(0,l.useEffect)(()=>{Ee(e=>li(e))},[A.edges,A.nodes]);function Jt(){(!ut||window.confirm(`目前有尚未儲存的流程草稿,確定要離開嗎?`))&&ae.push(oe.templates())}let H=(0,l.useMemo)(()=>A.nodes.find(e=>e.id===we)??null,[we,A.nodes]),Xt=H?Gi(H):!1,Zt=P.length>0||Xt,$t=(0,l.useCallback)(()=>{k.getState().selectedEdgeIds.forEach(e=>k.dispatch({edgeId:e,type:`deleteEdge`})),H&&Gi(H)&&k.dispatch({nodeId:H.id,type:`deleteNode`})},[k,H]);(0,l.useEffect)(()=>{if(!Zt)return;function e(e){e.key!==`Delete`&&e.key!==`Backspace`||Yi(e.target)||(e.preventDefault(),$t())}return window.addEventListener(`keydown`,e),()=>{window.removeEventListener(`keydown`,e)}},[Zt,$t]);let en=(0,l.useMemo)(()=>A.edges.find(e=>e.id===Te)??null,[Te,A.edges]),tn=(0,l.useMemo)(()=>P.length===1?A.edges.find(e=>e.id===P[0])??null:null,[P,A.edges]),rn=(0,l.useMemo)(()=>P.map(e=>A.edges.find(t=>t.id===e)??null).filter(e=>!!e),[P,A.edges]),W=(0,l.useMemo)(()=>pe??Li(N,de),[N,pe,de]),an=(0,l.useMemo)(()=>A.edges.map(e=>si(e,A.nodes,P.includes(e.id))),[P,A.edges,A.nodes]),G=(0,l.useMemo)(()=>$(st,M)??$(Xi(D?.formVersions??[]),M),[M,st,D?.formVersions]),cn=(0,l.useMemo)(()=>ta(st,G),[st,G]),ln=G?.schema??null,K=t?h??null:ln;(0,l.useEffect)(()=>{k.getState().formSchema!==K&&k.replaceState(e=>({...e,formSchema:K}))},[k,K]);let q=(0,l.useMemo)(()=>va(A),[A]);(0,l.useEffect)(()=>{let e=!0;return(0,S.listWorkflowWebhookEndpoints)({includeDeprecated:!0}).then(t=>{e&&(It(t),Rt(`ready`))}).catch(()=>{e&&Rt(`unavailable`)}),()=>{e=!1}},[]);let J=Ut&&V?V.schema:K,un=(0,l.useMemo)(()=>Lt===`ready`?_n({definition:A,endpoints:Ft,formFields:J?.fields??[]})[0]??null:null,[Ft,Lt,J,A]),dn=(0,l.useMemo)(()=>{let[e]=(0,g.readFieldAccessMatrix)(A,J).issues;return e?(0,S.readWorkflowLintMessage)(e.message,A,E):null},[E,J,A]),fn=(0,l.useMemo)(()=>sn(A)[0]??null,[A]),pn=un??dn??fn,hn=(0,l.useMemo)(()=>{let e=A.nodes.map(e=>({id:e.id,name:e.data.label||e.id}));return A.nodes.map(t=>ni(t,L,R,z,t.id===we,W,J,e))},[W,L,R,z,we,J,A.nodes]),Y=(0,l.useMemo)(()=>(0,C.hasConfiguredConditionEdges)(A),[A]),gn=(0,l.useMemo)(()=>Ri(W),[W]);(0,l.useEffect)(()=>{t&&re?.(A)},[t,A]),(0,l.useEffect)(()=>{t&&te?.(N)},[t,N]);async function vn(){Ke(!0),F(null);try{let e=await(0,y.readOrganizationDirectory)();vt(e.orgUnits),yt(e.positions),St(e.memberships)}catch(e){F(U(e,E))}finally{Ke(!1)}}async function yn(){Ke(!0),F(null),I(null);try{let[e,t]=await Promise.all([(0,S.readTemplateDesigner)(T),(0,y.readOrganizationDirectory)()]),n=e.versions.find(e=>e.status===`DRAFT`)??null,r=n??e.versions[0]??null;se(e),O(n),vt(t.orgUnits),yt(t.positions),St(t.memberships),ct(Xi(e.formVersions));let i=li(r?.workflowDefinition??mi()),a=r?.formDefinitionVersionId??e.formVersions[0]?.id??null,o=r?.initiatorPolicyCel??null;Ee(i),De(a),je(o),ue(JSON.stringify({formDefinitionVersionId:a,initiatorPolicyCel:o,workflowDefinition:i})),fe(r&&!e.template.currentVersionId&&!r.initiatorPolicyCel&&hi(r.workflowDefinition)?`NONE`:null),me(null),Ne(r?.workflowDefinition.nodes[0]?.id??`start`),Pe([]),Fe(null),Ht(null),Wt(!1)}catch(e){F(U(e,E))}finally{Ke(!1)}}async function bn(e){ot(!0),F(null);try{let t=await(0,S.searchPublishedFormVersionOptions)(e);ct(ta(Xi(t),G))}catch(e){F(U(e,E))}finally{ot(!1)}}async function xn(e){ft(!0),F(null);let t=++gt.current;try{let n=na(await(0,S.searchMemberOptions)(e));pt(e=>ua(e,n)),t===gt.current&&ht(n)}catch(e){t===gt.current&&F(U(e,E))}finally{t===gt.current&&ft(!1)}}async function Sn(e){let t=da(e),n=c.r(t.filter(e=>!L.some(t=>t.memberId===e&&!t.unresolved)),_t.current);if(n.length===0)return;let{profiles:r,skippedIds:i}=await c.i(n,S.resolveMemberOptions),a=new Set(r.map(e=>e.memberId)),o=n.filter(e=>!a.has(e)&&!i.includes(e));o.forEach(e=>_t.current.add(e)),pt(e=>ua(e,[...na(r),...[...o,...i].map(Be)]))}async function Cn(e){it(!0),F(null);try{let t=va(A),n=Ri(W),r=e?pn:null;if(t||n||r){let e=t??n??r??`流程設定未完成`;throw F(e),Error(e)}if(Ut&&V!==null)await(0,S.composeApprovalTemplateWithForm)({category:D?.template.category??null,categoryId:D?.template.categoryId??null,formDefinitionId:G?.formDefinitionId??null,formDescription:null,formName:G?.formName??D?.template.name??`表單`,initiatorPolicyCel:N,notificationConfig:null,publish:e,schema:V.schema,slaDefaults:null,templateDescription:null,templateId:T??null,templateName:D?.template.name??`模板`,uiSchema:V.uiSchema,workflowDefinition:A}),Wt(!1),Ht(null),await yn();else{let t=ce??await(0,S.forkApprovalTemplate)(T),n=await(0,S.updateApprovalTemplateDraft)({formDefinitionVersionId:M,initiatorPolicyCel:N,versionId:t.id,workflowDefinition:A});O(n),e&&await(0,S.publishApprovalTemplateVersion)(n.id),await yn()}}catch(e){F(U(e,E,A))}finally{it(!1)}}async function wn(){await Cn(!1)}async function Tn(){await Cn(!0)}function Dn(){At(JSON.stringify(Nn(J),null,2)),Mt(null),Pt(null),wt(!0)}function On(){Dt||wt(!1)}async function kn(){Ot(!0),Pt(null),Mt(null);try{let e=Zi(kt),t=await(0,S.dryRunApprovalWorkflow)({formData:e,initiatorMemberId:Vr,initiatorMetadataSnapshot:ra(Vr,bt),workflowDefinition:A});Mt(t)}catch(e){Pt(U(e,E))}finally{Ot(!1)}}async function An(){if(Vt(!0),V!==null)return;let e=G?.formDefinitionId??null;if(!e)Ht({schema:Gr,uiSchema:Kr});else{Kt(!0);try{let t=await(0,_.readFormBuilder)(e),n=t.versions.find(e=>e.status===`DRAFT`)??t.versions.find(e=>e.id===t.definition.currentVersionId)??t.versions[0]??null;Ht({schema:n?.schema??Gr,uiSchema:n?.uiSchema??Kr})}catch(e){F(U(e,E))}finally{Kt(!1)}}}function jn(e){let t=(0,b.applyNodeChanges)(e,hn);Ee(e=>({...e,nodes:e.nodes.map(e=>{let n=t.find(t=>t.id===e.id);return n?{...e,position:n.position}:e})}))}function Mn(e){Ui(e,A.nodes)&&e.source&&e.target&&k.dispatch({source:e.source,target:e.target,type:`connectEdge`})}function Pn(e,t){e.stopPropagation(),Pe(n=>e.shiftKey||e.metaKey||e.ctrlKey?Wi(n,t.id):[t.id]),Ne(null)}function Fn(){Fe(null)}function In(e){k.dispatch({nodeType:e,type:`addNode`})}function Ln(e){H&&k.dispatch({label:e,nodeId:H.id,type:`renameNode`})}function X(e){if(!H||H.type!==`userTask`)return;let t=H.id,n=H.data.decisionPolicy;k.dispatch({approverResolver:e,nodeId:t,type:`setUserTaskApprover`}),I(null),(0,C.isOrgManagerChainDecisionPolicyInvalid)(e,n)?I({message:`主管鏈會依序加入多位主管,簽核方式已改為「依序簽核」。`,nodeId:t,policyType:`SEQUENTIAL`}):(0,C.isDecisionPolicyUnsatisfiable)(n,e)&&I({message:`簽核者已變更為 ${(0,C.readDesignTimeApproverCount)(e)} 位,不足原本設定的 ${n?.type===`QUORUM`?n.threshold:0} 位門檻,簽核政策已重設為單人簽核,請重新設定。`,nodeId:t,policyType:`SINGLE`})}function Bn(e){H&&H.type===`userTask`&&k.dispatch({allowedTargets:e,nodeId:H.id,type:`setUserTaskReturnAllowedTargets`})}function qn(e){H&&H.type===`userTask`&&k.dispatch({nodeId:H.id,resubmitStrategy:e,type:`setUserTaskReturnResubmitStrategy`})}function Yn(e){H&&H.type===`userTask`&&k.dispatch({nodeId:H.id,requireComment:e,type:`setUserTaskReturnRequireComment`})}function Z(e){H&&H.type===`userTask`&&k.dispatch({nodeId:H.id,sla:e,type:`setUserTaskSla`})}function Zn(e){H&&H.type===`userTask`&&k.dispatch({excludeInitiator:e,nodeId:H.id,type:`setUserTaskExcludeInitiator`})}function Q(e){if(!H||H.type!==`userTask`)return;I(null);let t=e.type===`QUORUM`?{...e,threshold:(0,C.composeQuorumThreshold)(e.threshold,e.thresholdType)}:e;k.dispatch({decisionPolicy:t,nodeId:H.id,type:`setUserTaskDecisionPolicy`})}function cr(e){H&&H.type===`userTask`&&k.dispatch({...e,nodeId:H.id,type:`setUserTaskOptions`})}function lr(e){H&&H.type===`serviceTask`&&k.dispatch({action:e,nodeId:H.id,type:`setServiceAction`})}function ur(e){me(e.mode===`ALL`||e.mode===`CUSTOM`?null:e),fe(e.mode===`ALL`||e.mode===`CUSTOM`?null:e.mode),je(Bi(e,R))}function dr(e){H&&H.type!==`startEvent`&&k.dispatch({nodeId:H.id,triggerMode:e,type:`setNodeTriggerMode`})}function fr(e,t){k.dispatch({edgeId:e,isDefault:t,type:`setEdgeDefault`})}function mr({edgeId:e,fieldKey:t,operator:n,value:r}){k.dispatch({edgeId:e,fieldKey:t,operator:n,type:`setEdgeCondition`,value:r})}function hr(){k.dispatch({type:`autoLayout`})}return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(`style`,{children:Jn}),t?null:(0,d.jsx)(u.PageHeader,{children:(0,d.jsxs)(p.default,{description:zn({draftVersion:ce?.version??null,hasPublishedVersion:!!D?.template.currentVersionId,publishedVersion:D?.versions.find(e=>e.id===D.template.currentVersionId)?.version??null}),onBackClick:Jt,title:D?.template.name??`流程設計器`,children:[ie?(0,d.jsx)(u.Button,{disabled:!e,onClick:()=>zt(e=>!e),variant:B?`base-primary`:`base-secondary`,children:e?`AI 助理`:`AI 助理(未設定)`}):null,(0,d.jsx)(u.Button,{"aria-label":`儲存草稿`,disabled:qe||!!q||!!gn,icon:m.SaveIcon,iconType:`icon-only`,onClick:()=>void wn(),variant:`base-secondary`,children:`儲存草稿`}),w?(0,d.jsx)(u.Button,{disabled:We||!!q||!!gn,icon:m.EyeIcon,iconType:`leading`,onClick:Dn,variant:`base-secondary`,children:`試跑流程`}):null,(0,d.jsx)(u.Button,{disabled:qe||!ce&&!ut&&!Ut||!!q||!!gn||!!pn,icon:m.CheckedIcon,iconType:`leading`,onClick:()=>void Tn(),variant:`base-primary`,children:qt})]})}),(0,d.jsx)(u.SectionGroup,{children:(0,d.jsx)(u.Section,{children:(0,d.jsxs)(`div`,{style:Vn,children:[Ie?(0,d.jsx)(u.Typography,{color:`text-error`,variant:`body`,children:Ie}):null,Ve&&Ve.nodeId===H?.id&&H.type===`userTask`&&(H.data.decisionPolicy?.type??`SINGLE`)===Ve.policyType?(0,d.jsx)(u.Typography,{color:`text-warning`,variant:`body`,children:Ve.message}):null,q?(0,d.jsx)(u.Typography,{color:`text-error`,variant:`body`,children:q}):null,gn?(0,d.jsx)(u.Typography,{color:`text-error`,variant:`body`,children:gn}):null,!q&&pn?(0,d.jsxs)(u.Typography,{color:`text-error`,variant:`body`,children:[`發布前需修正:`,pn]}):null,t?null:(0,d.jsx)(`div`,{style:er,children:(0,d.jsx)(s.t,{hintText:Y?`已設定條件分流條件。請先移除所有條件,才能更換綁定表單版本。`:void 0,label:`綁定表單版本`,name:`formDefinitionVersionId`,required:!0,children:(0,d.jsxs)(`div`,{style:ir,children:[(0,d.jsx)(`div`,{style:ar,children:(0,d.jsx)(u.AutoComplete,{asyncData:!0,disabled:We||Y,disabledOptionsFilter:!0,emptyText:`沒有符合的已發布表單版本`,isForceClearable:!!M&&!Y,loading:at,loadingText:`搜尋表單版本中...`,mode:`single`,onChange:e=>{Y||De(e?.id??null)},onClear:()=>{Y||De(null)},onSearch:bn,onVisibilityChange:e=>{e&&!Y&&bn(``)},options:[...cn],placeholder:`選擇已發布表單版本`,searchDebounceTime:300,value:G})}),(0,d.jsx)(u.Button,{disabled:We,onClick:()=>{An()},style:or,variant:`base-secondary`,children:`編輯表單`})]})})}),(0,d.jsxs)(`div`,{style:Hn,children:[(0,d.jsx)(`div`,{ref:ge,style:Un,children:(0,d.jsxs)(b.ReactFlow,{connectionMode:b.ConnectionMode.Strict,edges:an,fitView:!0,isValidConnection:e=>Ui(e,A.nodes),nodeTypes:qr,nodes:hn,deleteKeyCode:null,multiSelectionKeyCode:[`Shift`,`Meta`,`Control`],onConnect:Mn,onEdgeClick:Pn,onNodeClick:(e,t)=>{Ne(t.id),Pe([])},onNodesChange:jn,onPaneClick:()=>{Ne(null),Pe([])},onViewportChange:be,viewport:ve,children:[(0,d.jsx)(b.Background,{}),(0,d.jsx)(`style`,{children:Qn}),(0,d.jsx)(b.Controls,{children:Zt?(0,d.jsx)(b.ControlButton,{"aria-label":`刪除選取項目`,className:`workflow-selection-delete-control`,onClick:$t,style:Wn,title:`刪除選取項目`,children:(0,d.jsx)(`span`,{style:Gn,children:(0,d.jsx)(u.Icon,{color:`error`,icon:m.TrashIcon,size:16})})}):null}),(0,d.jsx)(Xr,{onApplyAutoLayout:hr}),(0,d.jsx)(b.MiniMap,{})]})}),(0,d.jsxs)(`div`,{className:Kn,style:$n,children:[(0,d.jsx)(u.Typography,{component:`h2`,variant:`h3`,children:`流程工具`}),t&&ie?(0,d.jsxs)(`div`,{style:sr,children:[(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`caption`,children:`AI 協助`}),(0,d.jsx)(`div`,{style:rr,children:(0,d.jsx)(u.Button,{disabled:!e,onClick:()=>zt(e=>!e),size:`sub`,variant:B?`base-primary`:`base-secondary`,children:e?`AI 助理`:`AI 助理(未設定)`})})]}):null,(0,d.jsxs)(`div`,{style:sr,children:[(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`caption`,children:`動作節點`}),(0,d.jsx)(`div`,{style:rr,children:Dr.map(e=>(0,d.jsx)(u.Button,{icon:e.icon,iconType:`leading`,onClick:()=>In(e.type),size:`sub`,variant:`base-secondary`,children:e.label},e.type))})]}),(0,d.jsxs)(`div`,{style:sr,children:[(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`caption`,children:`流程控制`}),(0,d.jsx)(`div`,{style:rr,children:Or.map(e=>(0,d.jsx)(u.Button,{icon:e.icon,iconType:`leading`,onClick:()=>In(e.type),size:`sub`,variant:`base-secondary`,children:e.label},e.type))})]}),(0,d.jsxs)(`div`,{style:sr,children:[(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`caption`,children:`表單欄位`}),(0,d.jsx)(`div`,{style:rr,children:(0,d.jsx)(u.Button,{disabled:J===null,onClick:()=>Et(!0),size:`sub`,title:J===null?pr:void 0,variant:`base-secondary`,children:`欄位總覽`})})]}),rn.length>1?Sr(rn):null,rn.length===1&&tn?Cr(tn):null,rn.length===0&&H?_r(H):null]})]})]})})}),wr(en),!t&&w?gr():null,(0,d.jsx)(Yt,{definition:A,formSchema:J,language:E,onApply:e=>k.dispatch({entries:e,type:`setFieldAccessMatrix`}).error,onClose:()=>Et(!1),open:Tt}),ie&&e?(0,d.jsx)(xt,{controller:k,onClose:()=>zt(!1),open:B}):null,t?null:(0,d.jsx)(f.default,{headerTitle:`編輯表單`,isHeaderDisplay:!0,onClose:()=>Vt(!1),open:Bt,size:`wide`,children:(0,d.jsxs)(`div`,{style:Hr,children:[(0,d.jsx)(`div`,{style:Ur,children:Gt?(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`body`,children:`載入中…`}):(0,d.jsx)(r.t,{onChange:e=>{Ht(e)},value:V??{schema:Gr,uiSchema:Kr}})}),(0,d.jsxs)(`div`,{style:Wr,children:[(0,d.jsx)(u.Button,{disabled:Gt,onClick:()=>{V!==null&&(Wt(!0),k.replaceState(e=>({...e,formSchema:V.schema}))),Vt(!1)},variant:`base-primary`,children:`套用`}),(0,d.jsx)(u.Button,{onClick:()=>Vt(!1),variant:`base-secondary`,children:`取消`})]})]})})]});function gr(){let e={formFields:J?.fields??[],memberName:e=>L.find(t=>t.memberId===e&&!t.unresolved)?.displayName??null,nodes:A.nodes.map(e=>({id:e.id,name:e.data.label||e.id})),orgUnits:R,positions:z};return(0,d.jsx)(u.Modal,{cancelText:`關閉`,confirmText:`執行試跑`,loading:Dt,modalType:`standard`,onCancel:On,onClose:On,onConfirm:()=>void kn(),open:Ct,showModalFooter:!0,showModalHeader:!0,size:`wide`,supportingText:`使用 ${Vr} 與範例表單資料模擬目前畫布流程,不會建立案件。`,title:`試跑流程`,children:(0,d.jsxs)(`div`,{style:er,children:[(0,d.jsx)(s.t,{label:`表單資料 JSON`,name:`dryRunFormDataJson`,required:!0,children:(0,d.jsx)(u.Textarea,{onChange:e=>At(e.target.value),resize:`vertical`,rows:8,value:kt})}),Nt?(0,d.jsx)(u.Typography,{color:`text-error`,variant:`body`,children:Nt}):null,jt?(0,d.jsxs)(`div`,{style:tr,children:[(0,d.jsx)(u.Typography,{color:jt.valid?`text-success`:`text-error`,variant:`label-primary-highlight`,children:jt.valid?`試跑通過`:`試跑失敗`}),jt.errors.map(e=>(0,d.jsx)(u.Typography,{color:`text-error`,variant:`body`,children:e},e)),jt.steps.map(t=>(0,d.jsxs)(`div`,{style:nr,children:[(0,d.jsxs)(u.Typography,{variant:`label-primary-highlight`,children:[t.nodeLabel,` · `,$i(t.status)]}),(0,d.jsxs)(u.Typography,{color:`text-neutral`,variant:`caption`,children:[ea(t.nodeType),t.assigneeMemberId?` · 處理者:${Rn(t.assigneeMemberId,e)}`:``,t.edgeLabel?` · 來源線段:${t.edgeLabel}`:``]}),t.edgeReason?(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`caption`,children:t.edgeReason}):null,t.entryCondition?(0,d.jsxs)(u.Typography,{color:`text-neutral`,variant:`caption`,children:[`進入條件:`,t.entryConditionMatched?`符合`:`不符合`,` ·`,` `,t.entryCondition]}):null,(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`body`,children:t.message}),(t.status===`SKIPPED`?[]:ha(A,t.nodeId,Ft)).map(e=>(0,d.jsxs)(u.Typography,{color:`text-neutral`,variant:`caption`,children:[`將送出 Webhook:`,e.label]},e.key))]},t.id))]}):null]})})}function _r(e){return(0,d.jsxs)(`div`,{style:er,children:[(0,d.jsx)(u.Typography,{component:`h2`,variant:`h3`,children:`節點屬性`}),(0,d.jsxs)(u.Typography,{color:`text-neutral`,variant:`body`,children:[Er[e.type],` · `,e.id]}),(0,d.jsx)(s.t,{label:`顯示名稱`,name:`nodeLabel`,required:!0,children:(0,d.jsx)(u.Input,{onChange:e=>Ln(e.target.value),value:e.data.label,variant:`base`})}),e.type===`startEvent`?vr():null,e.type===`startEvent`?null:yr(e),e.type===`userTask`?br(e):null,e.type===`serviceTask`?xr(e):null]})}function vr(){let e=W.mode===`CUSTOM`?[...zr,Br]:[...zr],t=W.mode===`ORG_UNIT`||W.mode===`ORG_UNIT_POSITION`?Le(R,W.orgUnitId??``):null,n=W.mode===`ORG_UNIT_POSITION`?Re(z,W.positionId??``):null,r=W.mode===`ORG_UNIT_POSITION`?ca({includeDescendants:!!W.includeDescendants,memberships:bt,orgUnitId:W.orgUnitId??``,orgUnits:R,positions:z}):[];return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(s.t,{hintText:W.mode===`CUSTOM`?`這是舊版表達式規則;切換成標準選項後會改由 UI 管理。`:void 0,label:`發起權限`,name:`initiatorPolicyMode`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>{if(e?.id===`CUSTOM`){fe(null),me(null);return}let t=Fi(e?.id??null),n=Hi(t);fe(t===`ALL`?null:t),me(t===`ALL`?null:n),je(Bi(n,R))},options:e,placeholder:`選擇誰可以發起`,value:$(e,W.mode)})}),W.mode===`ORG_UNIT`||W.mode===`ORG_UNIT_POSITION`?(0,d.jsx)(s.t,{label:`組織`,name:`initiatorOrgUnitId`,required:!0,children:(0,d.jsx)(o.n,{name:`initiatorOrgUnitId`,onChange:e=>ur({...W,orgUnitId:e?.id??``,positionId:``,value:e?.id??``}),orgUnits:R,placeholder:`選擇組織`,value:t})}):null,W.mode===`ORG_UNIT`||W.mode===`ORG_UNIT_POSITION`?(0,d.jsx)(s.t,{label:`包含下層`,name:`initiatorIncludeDescendants`,children:(0,d.jsx)(u.Toggle,{checked:!!W.includeDescendants,onChange:e=>ur({...W,includeDescendants:e.target.checked,...W.mode===`ORG_UNIT_POSITION`?{positionId:``}:{}})})}):null,W.mode===`ORG_UNIT_POSITION`?(0,d.jsx)(s.t,{label:`職位`,name:`initiatorPositionId`,required:!0,children:(0,d.jsx)(o.r,{disabled:!W.orgUnitId?.trim(),name:`initiatorPositionId`,onChange:e=>ur({...W,positionId:e?.id??``}),placeholder:W.orgUnitId?.trim()?`選擇職位`:`請先選擇組織`,positions:r,value:n})}):null]})}function yr(e){let t=A.edges.filter(t=>t.target===e.id).length,n=t<2,r=n?`AND`:e.data.triggerMode??`AND`;return(0,d.jsx)(s.t,{hintText:n?`需要至少兩條前置連線,才可切換為任一前置完成。`:t>1?`${t} 條前置連線會依此規則觸發。`:`只有一條前置連線時,兩種設定效果相同。`,label:`前置條件`,name:`triggerMode`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>n?void 0:dr(_i(e?.id??null)),options:[...kr],readOnly:n,value:$(kr,r)})})}function br(e){let t=e.data.approverResolver,n=He(t),r=Je(n),i=Xe(n),a=Qe(t),c=t.type===`DIRECT`?t.memberIds.map(e=>ze(L,e)):[],l=t.type===`ORG_UNIT_MEMBER`||t.type===`ORG_UNIT_POSITION`?Le(R,t.orgUnitId):null,f=t.type===`POSITION`||t.type===`ORG_UNIT_POSITION`?Re(z,t.positionId):null,p=t.type===`ORG_UNIT_POSITION`?ca({includeDescendants:!!t.includeDescendants,memberships:bt,orgUnitId:t.orgUnitId,orgUnits:R,positions:z}):[],m=n.mode===`DYNAMIC_FORM`?n.levelsUp===null?he(J,n.formPath):_e(J,n.formPath):null,h=n.mode===`ORG_UNIT_MANAGER`&&n.orgSource===`FORM_FIELD`?ye(J,n.formPath):null,g=n.mode===`ORG_UNIT_MANAGER`&&n.orgSource===`FIXED`?Le(R,n.orgUnitId):null,_=n.mode===`NODE_ACTOR`?on(A,e.id,n.nodeIds):null,v=t.type===`ORG_MANAGER`?ke(t.levelsUp):j[0],y=a?.fallback??{type:`NONE`},b=(0,ee.readUnsupportedApproverFallbackType)(y),x=b===null?Pr:[...Pr,Fr],S=t.type===`ORG_MANAGER_CHAIN`?ne(z,t.minPositionLevel):[],te=y.type===`DIRECT`&&y.memberId?ze(L,y.memberId):null,re=y.type===`POSITION`?Re(z,y.positionId):null,ie=e.data.returnBehavior.resubmitStrategy??`RESTART`,w=e.data.sla??null,T=e.data.excludeInitiator??null,ae=w?(0,C.readSlaDurationParts)(w.duration):null,oe=ae?.unit??`DAY`,D=Di(w?.warningAt??null),se=ke(w?.escalateLevelsUp??1),ce=bi(e.data.decisionPolicy),O=Si(e.data.decisionPolicy);function le(){return i?(0,d.jsx)(s.t,{hintText:i.invalid?`原本儲存的主管層級無效(需為第 1 層以上),請重新選擇;發布前必須修正。`:n.mode===`NODE_ACTOR`?`選「關卡的簽核者」就是簽核者本人;選主管則往上找他的主管,不會是簽核者自己。`:`選「欄位裡的人」就是欄位選的人;選主管則往上找他的主管,不會是欄位裡的人自己。`,label:`簽核人`,name:`approverSubject`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>{let t=Ze(n,e?.id??null);t&&X(Ue(t))},options:[...i.options],value:i.selected})}):null}return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(s.t,{hintText:r.hint??void 0,label:`簽核來源`,name:`approverResolverType`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>{let n=Ye(t,e?.id??null,z);n&&X(n)},options:[...r.options],value:r.selected})}),t.type===`DIRECT`?(0,d.jsx)(s.t,{hintText:tt(e.data.decisionPolicy),label:`簽核者`,name:`memberId`,required:!0,children:(0,d.jsx)(u.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的成員`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:`workflow-approver-search`,spellCheck:!1},loading:dt,loadingText:`搜尋成員中...`,mode:`multiple`,onChange:e=>X({memberIds:e.map(e=>e.id),type:`DIRECT`}),onSearch:xn,onVisibilityChange:e=>{e&&(ht([]),xn(``))},options:[...ua(c,mt)],placeholder:`搜尋姓名或信箱`,searchDebounceTime:300,value:c})}):null,n.mode===`DYNAMIC_FORM`?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(s.t,{hintText:m?.problem??(n.levelsUp===null?`簽核人取自申請人送出表單時在該欄位選的人員。`:`依申請人送出表單時在該欄位選的人員,往上找他的主管。`),label:`表單欄位`,name:`approverFormPath`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>X(Ue({...n,formPath:e?.id??``})),options:[...m?.options??[]],placeholder:`選擇人員選擇欄位`,value:m?.selected??void 0})}),le()]}):null,t.type===`ORG_MANAGER`?(0,d.jsx)(s.t,{hintText:`依發起人的有效會員歸屬與主管解析規則決定簽核人。`,label:`主管層級`,name:`managerLevelsUp`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>X({baseFromInitiator:!0,...t.fallback?{fallback:t.fallback}:{},levelsUp:Ae(e?.id??null).value,type:`ORG_MANAGER`}),options:[...j],value:v})}):null,t.type===`ORG_MANAGER_CHAIN`?(0,d.jsx)(s.t,{hintText:`從發起人的直屬主管開始往上,職等比前一位高的主管依序加入,簽到職等達此值的主管為止。沒有職位的主管會略過。`,label:`簽到職等`,name:`minPositionLevel`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>X({...t,minPositionLevel:Number(e?.id??t.minPositionLevel)}),options:[...S],value:$(S,String(t.minPositionLevel))})}):null,n.mode===`ORG_UNIT_MANAGER`?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(s.t,{hintText:`固定組織:每張單都找同一個組織的主管;表單欄位:找申請人在表單上選的組織的主管。`,label:`組織`,name:`orgUnitSource`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>{e&&e.id!==n.orgSource&&X(Ue(Ge(n,e.id===`FORM_FIELD`?`FORM_FIELD`:`FIXED`)))},options:[...Ce],value:$(Ce,n.orgSource)})}),n.orgSource===`FIXED`?(0,d.jsx)(s.t,{hintText:`依指定組織或其上層的主管解析規則決定簽核人。`,label:`指定組織`,name:`orgUnitId`,required:!0,children:(0,d.jsx)(o.n,{name:`orgUnitId`,onChange:e=>X(Ue({...n,orgUnitId:e?.id??``})),orgUnits:R,placeholder:`選擇組織`,value:g})}):(0,d.jsx)(s.t,{hintText:h?.problem??`依申請人送出表單時在該欄位選的組織,找該組織的主管。`,label:`表單欄位`,name:`approverOrgFormPath`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>X(Ue({...n,formPath:e?.id??``})),options:[...h?.options??[]],placeholder:`選擇組織選擇欄位`,value:h?.selected??void 0})})]}):null,n.mode===`NODE_ACTOR`?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(s.t,{hintText:_&&_.problems.length>0?_.problems.join(`;`):nn,label:`關卡`,name:`approverNodeIds`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!0,mode:`multiple`,onChange:e=>X(Ue({...n,nodeIds:e.map(e=>e.id)})),options:[..._?.options??[]],overflowStrategy:`wrap`,placeholder:`選擇前面的簽核關卡`,value:[..._?.selected??[]]})}),le()]}):null,t.type===`ORG_UNIT_MEMBER`||t.type===`ORG_UNIT_POSITION`?(0,d.jsx)(s.t,{hintText:`依指定組織目前有效會員歸屬建立候選簽核人。`,label:`組織`,name:`orgUnitId`,required:!0,children:(0,d.jsx)(o.n,{name:`orgUnitId`,onChange:e=>X(t.type===`ORG_UNIT_MEMBER`?{includeDescendants:t.includeDescendants,orgUnitId:e?.id??``,type:`ORG_UNIT_MEMBER`}:{includeDescendants:t.includeDescendants,orgUnitId:e?.id??``,positionId:``,type:`ORG_UNIT_POSITION`}),orgUnits:R,placeholder:`選擇組織`,value:l})}):null,a===null?null:(0,d.jsxs)(d.Fragment,{children:[a.showPreferClosestOrgUnit?(0,d.jsx)(s.t,{hintText:`開啟後只取離該員最近一層的主管規則;掛在上層單位、涵蓋範圍較大的規則不會再一併加入簽核人。`,label:`只取最近一層主管`,name:`preferClosestOrgUnit`,children:(0,d.jsx)(u.Toggle,{checked:a.preferClosestOrgUnit,inputProps:{id:`preferClosestOrgUnit`,name:`preferClosestOrgUnit`},onChange:e=>X($e(t,e.target.checked))})}):null,(0,d.jsx)(s.t,{hintText:b===null?t.type===`ORG_MANAGER_CHAIN`?`預設會停止流程並提示;若設定固定人,主管鏈在達到簽核職等前就結束時,會再加上該會員作為最後一關。`:`預設會停止流程並提示;若設定固定人,找不到主管時會改派給該會員。`:`此改派設定來自較新版本的 BPMCore,本版本無法執行也無法編輯;請升級後再編輯。這裡選擇其他模式會覆寫原設定。`,label:`無主管時`,name:`approverFallbackMode`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>{e?.id!==`UNSUPPORTED`&&X(Oe(t,Pi(e?.id??null)))},options:[...x],value:b===null?$(Pr,y.type):Fr})}),y.type===`DIRECT`?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(s.t,{label:`改派人員`,name:`approverFallbackMemberId`,required:!0,children:(0,d.jsx)(u.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的成員`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:`workflow-approver-fallback-search`,spellCheck:!1},loading:dt,loadingText:`搜尋成員中...`,mode:`single`,onChange:e=>X(Oe(t,{allowInitiatorSelfApproval:y.allowInitiatorSelfApproval,memberId:e?.id??``,type:`DIRECT`})),onSearch:xn,onVisibilityChange:e=>{e&&(ht([]),xn(``))},options:[...ua(mt,te?[te]:[])],placeholder:`搜尋姓名或信箱`,searchDebounceTime:300,value:te})}),(0,d.jsx)(s.t,{hintText:`預設禁止申請人簽自己的案件;只有此流程允許自簽時才開啟。`,label:`允許自簽`,name:`allowInitiatorSelfApproval`,children:(0,d.jsx)(u.Toggle,{checked:!!y.allowInitiatorSelfApproval,inputProps:{id:`allowInitiatorSelfApproval`,name:`allowInitiatorSelfApproval`},onChange:e=>X(Oe(t,{allowInitiatorSelfApproval:e.target.checked,memberId:y.memberId,type:`DIRECT`}))})})]}):null,y.type===`POSITION`?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(s.t,{hintText:`指派給目前有效歸屬中擁有此職位的會員;主要歸屬優先。多人時全部成為簽核人,依上方的決策政策處理。`,label:`改派職位`,name:`approverFallbackPositionId`,required:!0,children:(0,d.jsx)(o.r,{name:`approverFallbackPositionId`,onChange:e=>X(Oe(t,{allowInitiatorSelfApproval:y.allowInitiatorSelfApproval,positionId:e?.id??``,type:`POSITION`})),placeholder:`選擇職位`,positions:z,value:re})}),(0,d.jsx)(s.t,{hintText:`預設禁止申請人簽自己的案件;只有此流程允許自簽時才開啟。`,label:`允許自簽`,name:`allowInitiatorSelfApproval`,children:(0,d.jsx)(u.Toggle,{checked:!!y.allowInitiatorSelfApproval,inputProps:{id:`allowInitiatorSelfApproval`,name:`allowInitiatorSelfApproval`},onChange:e=>X(Oe(t,{allowInitiatorSelfApproval:e.target.checked,positionId:y.positionId,type:`POSITION`}))})})]}):null]}),t.type===`ORG_UNIT_MEMBER`||t.type===`ORG_UNIT_POSITION`?(0,d.jsx)(s.t,{label:`包含下層`,name:`includeDescendants`,children:(0,d.jsx)(u.Toggle,{checked:!!t.includeDescendants,inputProps:{id:`includeDescendants`,name:`includeDescendants`},onChange:e=>X({...t,includeDescendants:e.target.checked,...t.type===`ORG_UNIT_POSITION`?{positionId:``}:{}})})}):null,t.type===`POSITION`?(0,d.jsx)(s.t,{hintText:`指派給目前有效歸屬中擁有此職位的會員;主要歸屬優先。`,label:`職位`,name:`positionId`,required:!0,children:(0,d.jsx)(o.r,{name:`positionId`,onChange:e=>X({positionId:e?.id??``,type:`POSITION`}),placeholder:`選擇職位`,positions:z,value:f})}):null,t.type===`ORG_UNIT_POSITION`?(0,d.jsx)(s.t,{hintText:`只納入指定組織範圍內擁有此職位的有效會員。`,label:`職位`,name:`orgUnitPositionId`,required:!0,children:(0,d.jsx)(o.r,{disabled:!t.orgUnitId.trim(),name:`orgUnitPositionId`,onChange:e=>X({includeDescendants:t.includeDescendants,orgUnitId:t.orgUnitId,positionId:e?.id??``,type:`ORG_UNIT_POSITION`}),placeholder:t.orgUnitId.trim()?`選擇職位`:`請先選擇組織`,positions:p,value:f})}):null,(0,d.jsx)(s.t,{hintText:`決定這一關要幾位簽核者同意才會通過;單人簽核與任一人同意的效果完全相同,皆為其中一人同意即通過。`,label:`決策方式`,name:`decisionPolicy`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:t=>Q(xi(t?.id??null,e.data.decisionPolicy)),options:[...et.filter(e=>t.type!==`ORG_MANAGER_CHAIN`||e.id===`SEQUENTIAL`||e.id===`PARALLEL_ALL`)],value:nt(ce)})}),ce===`QUORUM`?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(s.t,{label:`門檻計算方式`,name:`quorumThresholdType`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>Q({threshold:O.threshold,thresholdType:Ci(e?.id??null),type:`QUORUM`}),options:[...Nr],value:$(Nr,O.thresholdType)})}),(0,d.jsx)(s.t,{hintText:O.thresholdType===`PERCENTAGE`?`達到簽核者總數的這個百分比即通過,換算人數時無條件進位;超過 100 的輸入會自動夾至 100。`:`達到這個同意人數即通過;門檻超過實際簽核者人數時,這一關將永遠無法通過,請勿設定超過實際簽核者人數。`,label:O.thresholdType===`PERCENTAGE`?`門檻百分比`:`門檻人數`,name:`quorumThreshold`,required:!0,children:(0,d.jsx)(u.Input,{id:`quorumThreshold`,inputProps:O.thresholdType===`PERCENTAGE`?{max:100,min:1}:{min:1},inputType:`number`,name:`quorumThreshold`,onChange:e=>Q({threshold:(0,C.composeQuorumThreshold)(Number(e.target.value),O.thresholdType),thresholdType:O.thresholdType,type:`QUORUM`}),value:String(O.threshold),variant:`base`})})]}):null,e.data.returnBehavior.allowReturn?(0,d.jsx)(s.t,{hintText:`簽核者按下退回時,單子要回到哪裡。選「由簽核者選擇」時,可以退回申請人,或這一關之前任一個簽核節點。`,label:`可退回到`,name:`returnAllowedTargets`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>Bn(vi(e?.id??null)),options:[...Ar],value:$(Ar,e.data.returnBehavior.allowedTargets)})}):null,e.data.returnBehavior.allowReturn?(0,d.jsx)(s.t,{hintText:`退回發起人後,重新送出時要從流程開始重跑,或直接回到退回的簽核節點。`,label:`重送策略`,name:`returnResubmitStrategy`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>qn(yi(e?.id??null)),options:[...jr],value:$(jr,ie)})}):null,e.data.returnBehavior.allowReturn?(0,d.jsx)(s.t,{hintText:`開啟後,簽核者按下退回時必須填寫意見,未填寫會被擋下。`,label:`退回時意見必填`,name:`returnRequireComment`,children:(0,d.jsx)(u.Toggle,{checked:e.data.returnBehavior.requireComment===!0,inputProps:{id:`returnRequireComment`,name:`returnRequireComment`},onChange:e=>Yn(e.target.checked)})}):null,(0,d.jsx)(s.t,{hintText:`開啟後可設定簽核期限,逾時將依下方設定處理。`,label:`啟用時效`,name:`slaEnabled`,children:(0,d.jsx)(u.Toggle,{checked:!!w,inputProps:{id:`slaEnabled`,name:`slaEnabled`},onChange:e=>Z(e.target.checked?C.DEFAULT_SLA_CONFIG:null)})}),w&&!ae?(0,d.jsx)(s.t,{hintText:`此期限混用了日與時,無法在表單中編輯。請改以單一單位設定,或透過 API 維護。`,label:`時效期限`,name:`slaDurationRaw`,children:(0,d.jsx)(u.Input,{disabled:!0,value:w.duration,variant:`base`})}):null,w&&ae?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(s.t,{label:`時效期限`,name:`slaDurationValue`,required:!0,children:(0,d.jsx)(u.Input,{id:`slaDurationValue`,inputProps:{min:1},inputType:`number`,name:`slaDurationValue`,onChange:e=>Z(ki(w,{unit:oe,value:Number(e.target.value)})),value:String(ae.value),variant:`base`})}),(0,d.jsx)(s.t,{label:`期限單位`,name:`slaDurationUnit`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>Z(ki(w,{unit:wi(e?.id??null),value:ae.value})),options:[...C.SLA_DURATION_UNIT_OPTIONS],value:$(C.SLA_DURATION_UNIT_OPTIONS,oe)})})]}):null,w&&oe===`DAY`?(0,d.jsx)(s.t,{hintText:`工作日會跳過週末與行事曆上的假日,補班日仍計為工作日;行事曆由系統管理者設定。`,label:`計算方式`,name:`slaCalendar`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>Z({...w,calendar:Ti(e?.id??null)}),options:[...C.SLA_CALENDAR_MODE_OPTIONS],value:$(C.SLA_CALENDAR_MODE_OPTIONS,w.calendar??`CALENDAR`)})}):null,w?(0,d.jsx)(s.t,{label:`逾時處理`,name:`slaOnTimeout`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>Z(Ai(w,Ei(e?.id??null))),options:[...C.SLA_TIMEOUT_ACTION_OPTIONS],value:$(C.SLA_TIMEOUT_ACTION_OPTIONS,w.onTimeout)})}):null,w?.onTimeout===`ESCALATE`?(0,d.jsx)(s.t,{hintText:`逾時後改派給簽核者的上層主管,只會升級一次。`,label:`升級層級`,name:`slaEscalateLevelsUp`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>Z({...w,escalateLevelsUp:Ae(e?.id??null).value}),options:[...j],value:se})}):null,w?(0,d.jsx)(s.t,{hintText:`在期限到達前先送出一次提醒。`,label:`預警提醒`,name:`slaWarningAt`,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>Z(ji(w,Oi(e?.id??null).value)),options:[...Mr],value:D})}):null,(0,d.jsx)(s.t,{hintText:`關閉後,簽核者在此關卡看不到「拒絕」按鈕。`,label:`允許拒絕`,name:`allowReject`,children:(0,d.jsx)(u.Toggle,{checked:e.data.allowReject,inputProps:{id:`allowReject`,name:`allowReject`},onChange:e=>cr({allowReject:e.target.checked})})}),(0,d.jsx)(s.t,{hintText:`關閉後,簽核者無法把此關卡的任務轉派給其他人。`,label:`允許轉派`,name:`allowTransfer`,children:(0,d.jsx)(u.Toggle,{checked:e.data.allowTransfer,inputProps:{id:`allowTransfer`,name:`allowTransfer`},onChange:e=>cr({allowTransfer:e.target.checked})})}),(0,d.jsx)(s.t,{hintText:`開啟後,簽核者可在此關卡臨時加入其他簽核人;會簽為平行處理,加簽則需等加入者簽完才往下。`,label:`允許加簽`,name:`allowAddSigner`,children:(0,d.jsx)(u.Toggle,{checked:e.data.allowAddSigner,inputProps:{id:`allowAddSigner`,name:`allowAddSigner`},onChange:e=>cr({allowAddSigner:e.target.checked})})}),(0,d.jsx)(s.t,{hintText:`開啟後,申請人本人(含其代理人)不會成為此關的簽核人,也不能被轉簽或加簽到此關。`,label:`申請人不可簽核自己的單`,name:`excludeInitiator`,children:(0,d.jsx)(u.Toggle,{checked:!!T,inputProps:{id:`excludeInitiator`,name:`excludeInitiator`},onChange:e=>Zn(e.target.checked?Lr:null)})}),T?(0,d.jsx)(s.t,{label:`排除後沒有簽核人時`,name:`excludeInitiatorWhenEmpty`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:e=>Zn({whenEmpty:$(Ir,e?.id??null)?.id??Lr.whenEmpty}),options:[...Ir],value:$(Ir,T.whenEmpty)})}):null,(0,d.jsx)(Qt,{definition:A,language:E,node:e,onOpenMatrix:()=>Et(!0),onRemoveLegacy:()=>{k.dispatch({nodeId:e.id,type:`removeLegacyFieldPermissions`})},openDisabledReason:J===null?pr:null})]})}function xr(e){let t=e.data.action,n=Da(t).map(e=>ze(L,e)),r=t.type===`NOTIFY`&&t.recipients.type!==`DIRECT`?Me(t.recipients,L,R,z,J):null;function i(e){let n={memberIds:[...e],type:`DIRECT`};lr(t.type===`NOTIFY`?{...t,recipients:n}:{channels:[`IN_APP`],recipients:n,type:`NOTIFY`})}function a(e){t.type===`NOTIFY`&&lr({...t,webhooks:e})}return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(s.t,{hintText:r?`目前知會對象為「${r}」;在此選擇成員會改為指定成員。`:t.type===`NOTIFY`?`可只設定 Webhook,不指定知會對象。`:void 0,label:`知會對象`,name:`notifyMemberIds`,children:(0,d.jsx)(u.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的成員`,loading:dt,loadingText:`搜尋成員中...`,mode:`multiple`,onChange:e=>i(e.map(e=>e.id)),onSearch:xn,onVisibilityChange:e=>{e&&(ht([]),xn(``))},options:[...ua(n,mt)],overflowStrategy:`wrap`,placeholder:`搜尋姓名或信箱`,searchDebounceTime:300,value:[...n]})}),t.type===`NOTIFY`&&!mn(t.webhooks)?(0,d.jsxs)(`div`,{style:er,children:[(0,d.jsx)(u.Typography,{color:`text-warning`,variant:`body`,children:`這個節點的 Webhook 設定格式錯誤,無法在此編輯。清除後可重新新增。`}),(0,d.jsx)(`div`,{children:(0,d.jsx)(u.Button,{onClick:()=>a([]),variant:`destructive-secondary`,children:`清除 Webhook 設定`})})]}):null,t.type===`NOTIFY`&&mn(t.webhooks)?(0,d.jsx)(En,{catalog:Ft,catalogState:Lt,formFields:J?.fields??null,onChange:a,targets:(0,C.readNotifyWebhookTargets)(t)}):null]})}function Sr(e){return(0,d.jsxs)(`div`,{style:er,children:[(0,d.jsx)(u.Typography,{component:`h2`,variant:`h3`,children:`已選取線段`}),(0,d.jsxs)(u.Typography,{color:`text-neutral`,variant:`body`,children:[`已選取 `,e.length,` 條線段,可使用 Delete 或控制面板刪除。`]})]})}function Cr(e){let t=Ta(e,A.nodes);return(0,d.jsxs)(`div`,{style:er,children:[(0,d.jsx)(u.Typography,{component:`h2`,variant:`h3`,children:t?`條件設定`:`線段屬性`}),(0,d.jsxs)(u.Typography,{color:`text-neutral`,variant:`body`,children:[e.source,` → `,e.target]}),t?Tr(e):(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`body`,children:`這條線會直接把流程送到下一個節點。`})]})}function wr(e){return!e||!Ta(e,A.nodes)?null:(0,d.jsx)(u.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!e.data.isDefault&&!e.data.condition},confirmText:`完成`,modalType:`standard`,onCancel:Fn,onClose:Fn,onConfirm:Fn,open:!!Te,showModalFooter:!0,showModalHeader:!0,size:`regular`,supportingText:`條件分流的輸出連線需要指定條件,條件會直接顯示在線上。`,title:`條件設定`,children:Tr(e)})}function Tr(e){let t=Ca(e,A.nodes),n=ya(G?.schema??null),r=ba(G?.schema??null,e.data.conditionFieldKey??null),i=(0,C.readConditionOperatorOptionsForField)(r),a=xa(r),o=$(i,e.data.conditionOperator??null),c=!e.data.isDefault&&!e.data.condition;return(0,d.jsxs)(`div`,{style:er,children:[(0,d.jsxs)(u.Typography,{color:`text-neutral`,variant:`body`,children:[`畫布上的這條線目前會顯示「`,(0,d.jsx)(`span`,{style:{color:c?Xn:void 0},children:t??`請設定條件`}),`」。`]}),(0,d.jsx)(u.Toggle,{checked:!!e.data.isDefault,label:`其他情況走這條`,onChange:t=>fr(e.id,t.target.checked)}),e.data.isDefault?(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`body`,children:`其他條件都不符合時,流程會走這條線。`}):(0,d.jsxs)(d.Fragment,{children:[G?null:(0,d.jsx)(u.Typography,{color:`text-neutral`,variant:`body`,children:`請先綁定表單版本,才能選擇條件欄位。`}),(0,d.jsx)(s.t,{label:`條件欄位`,name:`edgeConditionField`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:t=>mr({edgeId:e.id,fieldKey:t?.id??null,operator:null,value:null}),options:[...n],placeholder:`選擇條件欄位`,value:$(n,e.data.conditionFieldKey??null)})}),(0,d.jsx)(s.t,{label:`條件判斷`,name:`edgeConditionOperator`,required:!0,children:(0,d.jsx)(u.Select,{clearable:!1,onChange:t=>mr({edgeId:e.id,operator:(0,C.readConditionOperator)(t?.id??null),value:null}),options:[...i],placeholder:`選擇判斷方式`,value:o})}),o&&Sa(o.id)?(0,d.jsx)(s.t,{label:`條件值`,name:`edgeConditionValue`,required:!0,children:a.length>0?(0,d.jsx)(u.Select,{clearable:!1,onChange:t=>mr({edgeId:e.id,value:t?.id??null}),options:[...a],placeholder:`選擇條件值`,value:$(a,e.data.conditionValue??null)}):(0,d.jsx)(u.Input,{onChange:t=>mr({edgeId:e.id,value:t.target.value}),placeholder:`輸入要比對的值`,value:e.data.conditionValue??``,variant:`base`})}):null]})]})}}function Xr({onApplyAutoLayout:e}){function t(){e()}return(0,d.jsx)(b.Panel,{position:`top-right`,children:(0,d.jsx)(u.Button,{icon:m.DotGridIcon,iconType:`leading`,onClick:t,size:`sub`,variant:`base-secondary`,children:`自動排版`})})}function Zr({data:e,selected:t,type:n}){let r=e.approverLines??[e.approverSummary??e.label],i=Qr(e),a=$r(n,t);return(0,d.jsxs)(`div`,{style:a,children:[ti(e),(0,d.jsx)(`div`,{style:Cr,children:r.map((e,t)=>(0,d.jsx)(u.Typography,{component:`span`,ellipsis:!0,style:Sr,title:e,variant:`label-primary`,children:e},`${e}_${t}`))}),(0,d.jsx)(u.Typography,{color:`text-neutral`,component:`span`,ellipsis:!0,style:Sr,title:i,variant:`caption`,children:i}),e.fieldAccessTag?(0,d.jsx)(`span`,{children:(0,d.jsx)(u.Tag,{label:e.fieldAccessTag,readOnly:!0,size:`minor`})}):null]})}function Qr(e){return e.nodeKind===`startEvent`?e.initiatorPolicySummary??`所有人`:e.approverSummary||e.approverLines?e.label:e.nodeKind===`exclusiveGateway`?`條件在線上`:e.nodeKind===`parallelGateway`?`多條路徑同時進行`:Er[e.nodeKind]}function $r(e,t){let n=ei(e);return t?{...n,border:`1px solid var(--mzn-color-primary, #0057ff)`,boxShadow:cr}:n}function ei(e){return e===`exclusiveGateway`?_r:e===`parallelGateway`?vr:e===`startEvent`?br:e===`endEvent`?xr:e===`userTask`?yr:Q}function ti(e){return!e.hasInput&&e.hasOutput?(0,d.jsx)(b.Handle,{id:Tr,position:b.Position.Right,type:`source`}):e.hasInput&&!e.hasOutput?(0,d.jsx)(b.Handle,{id:wr,position:b.Position.Left,type:`target`}):!e.hasInput&&!e.hasOutput?null:[(0,d.jsx)(b.Handle,{id:wr,position:b.Position.Left,type:`target`},`target`),(0,d.jsx)(b.Handle,{id:Tr,position:b.Position.Right,type:`source`},`source`)]}function ni(e,t,n,r,i,a,o,s){let c=ri(e);return{data:{approverLines:pa(e,t,n,r,o),approverSummary:fa(e,t,n,r,o,s),fieldAccessTag:e.type===`userTask`?At(e):null,hasInput:Ki(e),hasOutput:qi(e),initiatorPolicySummary:e.type===`startEvent`?Vi(a,n,r):null,label:e.data.label,nodeKind:e.type},height:c.height,handles:ii(e),id:e.id,initialHeight:c.height,initialWidth:c.width,position:e.position,selected:i,sourcePosition:b.Position.Right,targetPosition:b.Position.Left,type:e.type,width:c.width}}function ri(e){return e.type===`exclusiveGateway`||e.type===`parallelGateway`?{height:mr,width:hr}:e.type===`serviceTask`?{height:lr+(ma(e.data.action)-1)*dr,width:ur}:{height:lr+(e.type===`userTask`&&At(e)!==null?fr:0),width:ur}}function ii(e){let t=ri(e);return[...Ki(e)?[ai(t)]:[],...qi(e)?[oi(t)]:[]]}function ai({height:e}){let t=e/2-9/2;return{height:9,id:wr,position:b.Position.Left,type:`target`,width:9,x:-9/2,y:t}}function oi({height:e,width:t}){let n=e/2-9/2;return{height:9,id:Tr,position:b.Position.Right,type:`source`,width:9,x:t-9/2,y:n}}function si(e,t,n){let r=Ca(e,t),i=Ta(e,t),a=i&&!e.data.isDefault&&!e.data.condition,o=a?Xn:i?Yn:`#475569`,s=a?`#fef2f2`:i?`#eff6ff`:`#ffffff`,c=a?Xn:i?Yn:Z;return{className:n?`workflow-edge--selected`:void 0,data:e.data,id:e.id,label:r,labelBgBorderRadius:6,labelBgPadding:[8,4],labelBgStyle:{fill:s,stroke:c,strokeWidth:1},labelShowBg:!!r,labelStyle:{fill:o,fontSize:12,fontWeight:600},selected:n,source:e.source,sourceHandle:e.sourceHandle,style:{filter:n?Zn:void 0,opacity:1,stroke:Z,strokeOpacity:1,strokeWidth:1.5},target:e.target,targetHandle:e.targetHandle,type:e.type??`smoothstep`}}function ci(e,t){return e.type===`startEvent`?e:(e.type===`endEvent`||e.type===`userTask`||e.type===`serviceTask`||e.type,{...e,data:{...e.data,triggerMode:t}})}function li(e){return pi(di(fi(ui(e))))}function ui(e){let t=e.edges.map(e=>{let t=e.data??{};return e.data===t?e:{...e,data:t}});return t.some((t,n)=>t!==e.edges[n])?{...e,edges:t}:e}function di(e){let t=e.nodes.map(e=>{if(e.type!==`userTask`)return e;let t=e.data.allowAddSigner??!1,n=e.data.allowReject??!0,r=e.data.allowTransfer??!0,i=!e.data.decisionPolicy;return e.data.allowAddSigner===t&&e.data.allowReject===n&&e.data.allowTransfer===r&&!i?e:{...e,data:{...e.data,allowAddSigner:t,allowReject:n,allowTransfer:r,decisionPolicy:e.data.decisionPolicy??{type:`SINGLE`}}}});return t.some((t,n)=>t!==e.nodes[n])?{...e,nodes:t}:e}function fi(e){let t=new Set(e.nodes.filter(e=>Ji(e)).map(e=>e.id)),n=e.edges.filter(e=>!t.has(e.source));return n.length===e.edges.length?e:{...e,edges:n}}function pi(e){let t=e.edges.reduce((e,t)=>({...e,[t.target]:(e[t.target]??0)+1}),{}),n=e.nodes.map(e=>e.type===`startEvent`?e:(t[e.id]??0)<2&&e.data.triggerMode!==`AND`?ci(e,`AND`):e);return n.some((t,n)=>t!==e.nodes[n])?{...e,nodes:n}:e}function mi(){return{edges:[],meta:{schemaVersion:1},nodes:[{data:{label:`開始`},id:`start`,position:{x:80,y:160},type:`startEvent`},{data:{endState:`APPROVED`,label:`完成`,triggerMode:`AND`},id:`end`,position:{x:560,y:160},type:`endEvent`}]}}function hi(e){return e.edges.length===0&&e.nodes.length===2&&e.nodes.some(e=>e.type===`startEvent`)&&e.nodes.some(e=>e.type===`endEvent`)}function gi(e){let t=new x.graphlib.Graph;return t.setDefaultEdgeLabel(()=>({})),t.setGraph({rankdir:`LR`,ranksep:120}),e.nodes.forEach(e=>{t.setNode(e.id,ri(e))}),e.edges.forEach(e=>{t.setEdge(e.source,e.target)}),x.layout(t),{...e,nodes:e.nodes.map(e=>{let n=t.node(e.id);return n?{...e,position:{x:n.x-ri(e).width/2,y:n.y-ri(e).height/2}}:e})}}function $(e,t){return t?e.find(e=>e.id===t)??null:null}function _i(e){return e===`OR`?`OR`:`AND`}function vi(e){return e===`PREVIOUS`||e===`ANY`?e:`INITIATOR`}function yi(e){return e===`FROM_RETURN_POINT`?`FROM_RETURN_POINT`:`RESTART`}function bi(e){return e?.type??`SINGLE`}function xi(e,t){return e===`QUORUM`?t?.type===`QUORUM`?t:{threshold:C.DEFAULT_QUORUM_THRESHOLD,thresholdType:`COUNT`,type:`QUORUM`}:e===`PARALLEL_ALL`||e===`PARALLEL_ANY`||e===`SEQUENTIAL`?{type:e}:{type:`SINGLE`}}function Si(e){return e?.type===`QUORUM`?{threshold:Number.isFinite(e.threshold)?e.threshold:C.DEFAULT_QUORUM_THRESHOLD,thresholdType:Ci(e.thresholdType??null)}:{threshold:C.DEFAULT_QUORUM_THRESHOLD,thresholdType:`COUNT`}}function Ci(e){return e===`PERCENTAGE`?`PERCENTAGE`:`COUNT`}function wi(e){return e===`HOUR`?`HOUR`:`DAY`}function Ti(e){return e===`BUSINESS_DAY`?`BUSINESS_DAY`:`CALENDAR`}function Ei(e){return C.SLA_TIMEOUT_ACTION_OPTIONS.find(t=>t.id===e)?.id??`REMIND`}function Di(e){return Mr.find(t=>t.value===e)??Mr[0]}function Oi(e){return Mr.find(t=>t.id===e)??Mr[0]}function ki(e,t){let n=Number.isFinite(t.value)?Math.trunc(t.value):1,r=(0,C.composeSlaDuration)({unit:t.unit,value:n});return{...e,calendar:t.unit===`DAY`?e.calendar??`CALENDAR`:`CALENDAR`,duration:r}}function Ai(e,t){return t===`ESCALATE`?{...e,escalateLevelsUp:e.escalateLevelsUp??1,onTimeout:t}:{...Mi(e,`escalateLevelsUp`),onTimeout:t}}function ji(e,t){return t===null?Mi(e,`warningAt`):{...e,warningAt:t}}function Mi(e,t){return Object.fromEntries(Object.entries(e).filter(([e])=>e!==t))}function Ni(e){return e===`DIRECT`||e===`POSITION`?e:`NONE`}function Pi(e){let t=Ni(e);return t===`DIRECT`?{memberId:``,type:`DIRECT`}:t===`POSITION`?{positionId:``,type:`POSITION`}:{type:`NONE`}}function Fi(e){return e===`ORG_UNIT`||e===`ORG_UNIT_POSITION`||e===`NONE`?e:`ALL`}function Ii(e){let t=e?.trim();if(!t)return{mode:`ALL`,value:``};let n=zi(t,/"([^"]+)" in subject\.orgUnitIds/gu),r=zi(t,/"([^"]+)" in subject\.positionIds/gu);return n.length>0&&r.length>0?{includeDescendants:n.length>1,mode:`ORG_UNIT_POSITION`,orgUnitId:n[0],positionId:r[0],value:n[0]??``}:n.length>0?{includeDescendants:n.length>1,mode:`ORG_UNIT`,orgUnitId:n[0],value:n[0]??``}:{mode:`CUSTOM`,value:t}}function Li(e,t){let n=Ii(e);return!t||t===`ALL`||t===`NONE`?t===`ALL`||t===`NONE`?{mode:t,value:``}:n:n.mode===t?n:Hi(t)}function Ri(e){return e.mode===`NONE`?`發起權限需要選擇誰可以發起。`:(e.mode===`ORG_UNIT`||e.mode===`ORG_UNIT_POSITION`)&&!e.orgUnitId?.trim()?`指定組織發起時,需要選擇組織。`:e.mode===`ORG_UNIT_POSITION`&&!e.positionId?.trim()?`指定組織職位發起時,需要選擇職位。`:null}function zi(e,t){return[...e.matchAll(t)].map(e=>e[1]).filter(e=>!!e)}function Bi(e,t){if(e.mode===`ALL`||e.mode===`NONE`)return null;let n=e.orgUnitId?.trim()??``;if(!n)return null;let r=la(t,n,!!e.includeDescendants).map(e=>`${JSON.stringify(e)} in subject.orgUnitIds`).join(` || `);if(e.mode===`ORG_UNIT`)return r?`(${r})`:null;let i=e.positionId?.trim()??``;return i&&r?`(${r}) && ${JSON.stringify(i)} in subject.positionIds`:null}function Vi(e,t,n){return e.mode===`NONE`?`未設定`:e.mode===`ORG_UNIT`?e.orgUnitId?`組織:${Fe(t,e.orgUnitId)}`:`指定組織`:e.mode===`ORG_UNIT_POSITION`?e.orgUnitId&&e.positionId?`組織職位:${Fe(t,e.orgUnitId)} / ${Ie(n,e.positionId)}`:`指定組織職位`:e.mode===`CUSTOM`?`既有自訂規則`:`所有人`}function Hi(e){return{includeDescendants:!0,mode:e,orgUnitId:``,positionId:``,value:``}}function Ui(e,t){let n=e.source?t.find(t=>t.id===e.source)??null:null,r=e.target?t.find(t=>t.id===e.target)??null:null;return!!n&&!!r&&e.source!==e.target&&e.sourceHandle===Tr&&e.targetHandle===wr&&!!(n&&qi(n))&&!!(r&&Ki(r))}function Wi(e,t){return e.includes(t)?e.filter(e=>e!==t):[...e,t]}function Gi(e){return e.type!==`startEvent`&&e.type!==`endEvent`}function Ki(e){return e.type!==`startEvent`}function qi(e){return e.type!==`endEvent`&&!Ji(e)}function Ji(e){return e.type===`serviceTask`&&e.data.action.type===`NOTIFY`}function Yi(e){return e instanceof HTMLElement?e.isContentEditable||e.tagName===`INPUT`||e.tagName===`TEXTAREA`||e.tagName===`SELECT`||!!e.closest(`[contenteditable="true"]`):!1}function Xi(e){return e.map(e=>({formDefinitionId:e.formDefinitionId,formName:e.formName,id:e.id,name:Bn(e.formName,e.version),schema:e.schema}))}function Zi(e){let t=JSON.parse(e);if(!Qi(t))throw Error(`表單資料 JSON 必須是物件。`);return t}function Qi(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function $i(e){return e===`COMPLETED`?`完成`:e===`PASSED`?`通過`:e===`SKIPPED`?`略過`:e===`STOPPED`?`已停止`:e===`WAITING`?`將等待簽核`:e}function ea(e){return e in Er?Er[e]:e}function ta(e,t){return t&&!e.some(e=>e.id===t.id)?[t,...e]:e}function na(e){return e.map(e=>({displayName:e.name,email:e.email,id:e.memberId,memberId:e.memberId,name:ga(e.name,e.email)}))}function ra(e,t){let n=ia(),r=t.filter(t=>t.memberId===e&&aa(t,n)),i=r.reduce((e,t)=>e&&oa(e,t)<=0?e:t,null);return{customFields:{},managerMemberId:`member-002`,memberId:e,orgCode:`HQ`,orgUnitIds:sa(r.map(e=>e.orgUnitId)),positionId:i?.positionId??null,positionIds:sa(r.map(e=>e.positionId)),primaryOrgUnitId:i?.orgUnitId??null,roles:[`manager`]}}function ia(){return new Date().toISOString().slice(0,10)}function aa(e,t){return e.effectiveFrom<=t&&(!e.effectiveTo||e.effectiveTo>=t)}function oa(e,t){return e.isPrimary===t.isPrimary?t.effectiveFrom.localeCompare(e.effectiveFrom):e.isPrimary?-1:1}function sa(e){return e.reduce((e,t)=>t&&!e.includes(t)?[...e,t]:e,[])}function ca({includeDescendants:e,memberships:t,orgUnitId:n,orgUnits:r,positions:i}){let a=new Set(la(r,n,e)),o=new Set(t.filter(e=>a.has(e.orgUnitId)).map(e=>e.positionId).filter(e=>!!e));return i.filter(e=>o.has(e.id))}function la(e,t,n){let r=e.find(e=>e.id===t);return r?n?e.filter(e=>e.id===r.id||e.path.startsWith(`${r.path}.`)).map(e=>e.id):[r.id]:t.trim()?[t]:[]}function ua(e,t){let n=new Map(t.filter(e=>!e.unresolved).map(e=>[e.memberId,e])),r=new Set(e.map(e=>e.memberId)),i=t.filter(e=>!r.has(e.memberId)),a=e.map(e=>(e.unresolved?n.get(e.memberId):null)??e);return i.length>0||a.some((t,n)=>t!==e[n])?[...a,...i]:e}function da(e){return[...new Set(e.nodes.flatMap(e=>e.type===`userTask`?je(e.data.approverResolver):e.type===`serviceTask`?Da(e.data.action):[]))]}function fa(e,t,n,r,i,a){return e.type===`userTask`?Me(e.data.approverResolver,t,n,r,i,a):null}function pa(e,t,n,r,i){if(e.type!==`serviceTask`)return null;let a=e.data.action,o=a.type===`NOTIFY`&&a.recipients.type!==`DIRECT`?[Me(a.recipients,t,n,r,i)]:Da(a).map(e=>ze(t,e).name),s=(0,C.readNotifyWebhookTargets)(a).length,c=[...o,...s?[`Webhook ${s} 個`]:[]];return c.length?c:[`未指定知會對象`]}function ma(e){let t=e.type===`NOTIFY`&&e.recipients.type!==`DIRECT`?1:Da(e).length,n=+!!(0,C.readNotifyWebhookTargets)(e).length;return Math.max(1,t+n)}function ha(e,t,n){let r=e.nodes.find(e=>e.id===t);return r?.type===`serviceTask`&&r.data.action.type===`NOTIFY`&&mn(r.data.action.webhooks)?(0,C.readNotifyWebhookTargets)(r.data.action).map(e=>({key:e.id,label:q(n,e.endpoint)?.label??K(e.endpoint)})):[]}function ga(e,n){return t.t(e,n)}function _a(e,t){let n=t?.getBoundingClientRect();if(!n||e.nodes.length===0)return null;let r=e.nodes.reduce((e,t)=>{let n=ri(t);return{maxX:Math.max(e.maxX,t.position.x+n.width),maxY:Math.max(e.maxY,t.position.y+n.height),minX:Math.min(e.minX,t.position.x),minY:Math.min(e.minY,t.position.y)}},{maxX:-1/0,maxY:-1/0,minX:1/0,minY:1/0});return(0,b.getViewportForBounds)({height:r.maxY-r.minY,width:r.maxX-r.minX,x:r.minX,y:r.minY},n.width,n.height,.1,1,.2)}function va(e){let t=e.nodes.find(e=>e.type===`userTask`&&!!(0,C.readApproverResolverIssue)(e.data.approverResolver)),n=e.nodes.find(e=>e.type===`userTask`&&!!(0,C.readExcludeInitiatorIssue)(e.data.excludeInitiator)),r=e.nodes.map(e=>(0,C.readNotifyServiceTaskIssue)(e)).find(e=>e!==null)??null,i=e.edges.find(t=>Ta(t,e.nodes)&&!t.data.isDefault&&!t.data.condition),a=e.nodes.find(e=>e.type===`userTask`&&(0,C.isOrgManagerChainDecisionPolicyInvalid)(e.data.approverResolver,e.data.decisionPolicy));return t&&t.type===`userTask`?(0,C.readApproverResolverIssue)(t.data.approverResolver):a&&a.type===`userTask`?`簽核節點「${a.data.label}」使用「沿主管鏈簽核」時,決策方式必須是「依序簽核或全部同意」,否則任一位主管簽完就會結案。`:n&&n.type===`userTask`?(0,C.readExcludeInitiatorIssue)(n.data.excludeInitiator):r||(i?`條件分流的每條輸出連線都需要先設定條件。`:null)}function ya(e){return e?.fields.map(e=>({fieldType:e.type,id:e.fieldKey,name:`${e.label} (${e.fieldKey})`}))??[]}function ba(e,t){return t?e?.fields.find(e=>e.fieldKey===t)??null:null}function xa(e){return e?e.type===`boolean`?[{id:`true`,name:`是`},{id:`false`,name:`否`}]:(0,v.isFormStaticOptionFieldDefinition)(e)?e.options.map(e=>({id:e.value,name:e.label})):[]:[]}function Sa(e){return Rr.includes(e)}function Ca(e,t){if(e.data.label)return e.data.label;if(Ta(e,t))return wa(e);if(Ea(e,t))return`同時進行`}function wa(e){return e.data.isDefault?`其他情況`:`請設定條件`}function Ta(e,t){return t.some(t=>t.id===e.source&&t.type===`exclusiveGateway`)}function Ea(e,t){return t.some(t=>t.id===e.source&&t.type===`parallelGateway`)}function Da(e){return e.type===`NOTIFY`&&e.recipients.type===`DIRECT`?e.recipients.memberIds:[]}Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return Ve}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return Yr}});
|
|
65
|
+
//# sourceMappingURL=designer-Be9UI9Tg.cjs.map
|