@rytass/bpm-core-react 0.22.0 → 0.24.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 +84 -0
- package/README.md +1 -0
- package/dist/chunks/FormBuilderView-Bg9ftYz-.cjs +4 -0
- package/dist/chunks/FormBuilderView-Bg9ftYz-.cjs.map +1 -0
- package/dist/chunks/{FormBuilderView-DbfbLZCI.js → FormBuilderView-CBvdcg_t.js} +675 -614
- package/dist/chunks/FormBuilderView-CBvdcg_t.js.map +1 -0
- package/dist/chunks/FormRendererView-D-p6GDQB.cjs +6 -0
- package/dist/chunks/FormRendererView-D-p6GDQB.cjs.map +1 -0
- package/dist/chunks/FormRendererView-DHXmekC3.js +1319 -0
- package/dist/chunks/FormRendererView-DHXmekC3.js.map +1 -0
- package/dist/chunks/{approval-instance-list-page-Cv5I1YPX.cjs → approval-instance-list-page-BqkG9jiR.cjs} +2 -2
- package/dist/chunks/{approval-instance-list-page-Cv5I1YPX.cjs.map → approval-instance-list-page-BqkG9jiR.cjs.map} +1 -1
- package/dist/chunks/{approval-instance-list-page-BI5fIXc-.js → approval-instance-list-page-CsSpIN4C.js} +2 -2
- package/dist/chunks/{approval-instance-list-page-BI5fIXc-.js.map → approval-instance-list-page-CsSpIN4C.js.map} +1 -1
- package/dist/chunks/compose-B43jtdyL.cjs +2 -0
- package/dist/chunks/compose-B43jtdyL.cjs.map +1 -0
- package/dist/chunks/{compose-U1zs3Yof.js → compose-C7yS6bJm.js} +162 -148
- package/dist/chunks/compose-C7yS6bJm.js.map +1 -0
- package/dist/chunks/{dashboard-page-BoqNhjT_.js → dashboard-page-DBJCsPya.js} +2 -2
- package/dist/chunks/{dashboard-page-BoqNhjT_.js.map → dashboard-page-DBJCsPya.js.map} +1 -1
- package/dist/chunks/{dashboard-page-D7YJ3udk.cjs → dashboard-page-lqlLELKs.cjs} +2 -2
- package/dist/chunks/{dashboard-page-D7YJ3udk.cjs.map → dashboard-page-lqlLELKs.cjs.map} +1 -1
- package/dist/chunks/{designer-DPG7R_WP.js → designer-B9Ut4xze.js} +1786 -1463
- package/dist/chunks/designer-B9Ut4xze.js.map +1 -0
- package/dist/chunks/designer-eXw7R9ug.cjs +69 -0
- package/dist/chunks/designer-eXw7R9ug.cjs.map +1 -0
- package/dist/chunks/{detail-CHZDNNM6.js → detail-BB_uYaoM.js} +904 -896
- package/dist/chunks/detail-BB_uYaoM.js.map +1 -0
- package/dist/chunks/detail-DN8pEzUJ.cjs +5 -0
- package/dist/chunks/detail-DN8pEzUJ.cjs.map +1 -0
- package/dist/chunks/instance-error-message-BKt07-Bo.js +270 -0
- package/dist/chunks/instance-error-message-BKt07-Bo.js.map +1 -0
- package/dist/chunks/instance-error-message-BL_X7Af8.cjs +2 -0
- package/dist/chunks/instance-error-message-BL_X7Af8.cjs.map +1 -0
- package/dist/chunks/member-profile-resolution-CJlgVdTR.js +44 -0
- package/dist/chunks/member-profile-resolution-CJlgVdTR.js.map +1 -0
- package/dist/chunks/member-profile-resolution-DiH-P-Vh.cjs +2 -0
- package/dist/chunks/member-profile-resolution-DiH-P-Vh.cjs.map +1 -0
- package/dist/chunks/{providers-CQWekD7_.js → providers-D35lBOTd.js} +2 -2
- package/dist/chunks/{providers-CQWekD7_.js.map → providers-D35lBOTd.js.map} +1 -1
- package/dist/chunks/{providers-VUOh6i0i.cjs → providers-Dz4Wqxr6.cjs} +2 -2
- package/dist/chunks/{providers-VUOh6i0i.cjs.map → providers-Dz4Wqxr6.cjs.map} +1 -1
- package/dist/chunks/{routes-config-C1j_vFKo.cjs → routes-config-BWjZDAU3.cjs} +2 -2
- package/dist/chunks/{routes-config-C1j_vFKo.cjs.map → routes-config-BWjZDAU3.cjs.map} +1 -1
- package/dist/chunks/{routes-config-BcNaWJWJ.js → routes-config-DjEOE9eP.js} +3 -2
- package/dist/chunks/{routes-config-BcNaWJWJ.js.map → routes-config-DjEOE9eP.js.map} +1 -1
- package/dist/chunks/users-C_Dtw_sR.cjs +2 -0
- package/dist/chunks/users-C_Dtw_sR.cjs.map +1 -0
- package/dist/chunks/users-wgM3TqU3.js +513 -0
- package/dist/chunks/users-wgM3TqU3.js.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +4 -4
- package/dist/lib/routes-config.d.cts +2 -0
- package/dist/lib/routes-config.d.ts +2 -0
- package/dist/next/index.cjs +1 -1
- package/dist/next/index.js +2 -2
- package/dist/pages/admin/stuck-instances/index.cjs +2 -0
- package/dist/pages/admin/stuck-instances/index.cjs.map +1 -0
- package/dist/pages/admin/stuck-instances/index.d.cts +4 -0
- package/dist/pages/admin/stuck-instances/index.d.ts +4 -0
- package/dist/pages/admin/stuck-instances/index.js +13 -0
- package/dist/pages/admin/stuck-instances/index.js.map +1 -0
- package/dist/pages/admin/users/index.cjs +1 -1
- package/dist/pages/admin/users/index.js +1 -1
- package/dist/pages/instances/detail/index.cjs +1 -1
- package/dist/pages/instances/detail/index.js +1 -1
- package/dist/pages/templates/compose/index.cjs +1 -1
- package/dist/pages/templates/compose/index.js +1 -1
- package/dist/pages/templates/designer/index.cjs +1 -1
- package/dist/pages/templates/designer/index.js +1 -1
- package/dist/views/admin/index.cjs +1 -1
- package/dist/views/admin/index.d.cts +1 -0
- package/dist/views/admin/index.d.ts +1 -0
- package/dist/views/admin/index.js +3 -2
- package/dist/views/admin/stuck-instances/AdminStuckInstancesView.d.cts +10 -0
- package/dist/views/admin/stuck-instances/AdminStuckInstancesView.d.ts +10 -0
- package/dist/views/admin/stuck-instances/StuckInstanceCancelModal.d.cts +14 -0
- package/dist/views/admin/stuck-instances/StuckInstanceCancelModal.d.ts +14 -0
- package/dist/views/admin/stuck-instances/index.cjs +2 -0
- package/dist/views/admin/stuck-instances/index.cjs.map +1 -0
- package/dist/views/admin/stuck-instances/index.d.cts +2 -0
- package/dist/views/admin/stuck-instances/index.d.ts +2 -0
- package/dist/views/admin/stuck-instances/index.js +237 -0
- package/dist/views/admin/stuck-instances/index.js.map +1 -0
- package/dist/views/admin/users/index.cjs +1 -1
- package/dist/views/admin/users/index.js +1 -1
- package/dist/views/cc/index.cjs +1 -1
- package/dist/views/cc/index.js +1 -1
- package/dist/views/dashboard/index.cjs +1 -1
- package/dist/views/dashboard/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 +26 -1
- package/dist/views/forms/renderer/FormRendererView.d.ts +26 -1
- package/dist/views/forms/renderer/index.cjs +1 -1
- package/dist/views/forms/renderer/index.js +1 -1
- package/dist/views/inbox/index.cjs +1 -1
- package/dist/views/inbox/index.js +1 -1
- package/dist/views/instances/approver-filled-form.d.cts +56 -20
- package/dist/views/instances/approver-filled-form.d.ts +56 -20
- 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 +7 -0
- package/dist/views/instances/detail/sections/InstanceFormSection.d.ts +7 -0
- package/dist/views/instances/detail/sections/InstanceTasksSection.d.cts +1 -1
- package/dist/views/instances/detail/sections/InstanceTasksSection.d.ts +1 -1
- package/dist/views/instances/new/index.cjs +1 -1
- package/dist/views/instances/new/index.js +5 -5
- package/dist/views/instances/new/index.js.map +1 -1
- package/dist/views/search/index.cjs +1 -1
- package/dist/views/search/index.js +1 -1
- package/dist/views/sent/index.cjs +1 -1
- package/dist/views/sent/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/compose/steps/ComposeReviewStep.d.cts +3 -1
- package/dist/views/templates/compose/steps/ComposeReviewStep.d.ts +3 -1
- package/dist/views/templates/compose/steps/ComposeWorkflowStep.d.cts +4 -1
- package/dist/views/templates/compose/steps/ComposeWorkflowStep.d.ts +4 -1
- package/dist/views/templates/compose/use-template-compose-wizard.d.cts +3 -1
- package/dist/views/templates/compose/use-template-compose-wizard.d.ts +3 -1
- package/dist/views/templates/designer/TemplateDesignerView.d.cts +10 -1
- package/dist/views/templates/designer/TemplateDesignerView.d.ts +10 -1
- package/dist/views/templates/designer/approver-resolver-model.d.cts +31 -0
- package/dist/views/templates/designer/approver-resolver-model.d.ts +31 -0
- package/dist/views/templates/designer/field-access-matrix/FieldAccessMatrixDrawer.d.cts +3 -1
- package/dist/views/templates/designer/field-access-matrix/FieldAccessMatrixDrawer.d.ts +3 -1
- package/dist/views/templates/designer/field-access-matrix/field-access-copy.d.cts +3 -2
- package/dist/views/templates/designer/field-access-matrix/field-access-copy.d.ts +3 -2
- package/dist/views/templates/designer/index.cjs +1 -1
- package/dist/views/templates/designer/index.js +1 -1
- package/dist/views/templates/designer/launch-mode.d.cts +19 -0
- package/dist/views/templates/designer/launch-mode.d.ts +19 -0
- package/dist/views/templates/designer/node-actor-resolver-options.d.cts +30 -3
- package/dist/views/templates/designer/node-actor-resolver-options.d.ts +30 -3
- package/dist/views/templates/designer/publish-default-value-check.d.cts +36 -0
- package/dist/views/templates/designer/publish-default-value-check.d.ts +36 -0
- package/dist/views/templates/index.cjs +1 -1
- package/dist/views/templates/index.js +1 -1
- package/dist/views/templates/versions/index.cjs +1 -1
- package/dist/views/templates/versions/index.js +1 -1
- package/package.json +23 -3
- package/dist/chunks/FormBuilderView-Bok4Y59D.cjs +0 -4
- package/dist/chunks/FormBuilderView-Bok4Y59D.cjs.map +0 -1
- package/dist/chunks/FormBuilderView-DbfbLZCI.js.map +0 -1
- package/dist/chunks/FormRendererView-CAyPXhPq.js +0 -1351
- package/dist/chunks/FormRendererView-CAyPXhPq.js.map +0 -1
- package/dist/chunks/FormRendererView-iLlHFIUR.cjs +0 -6
- package/dist/chunks/FormRendererView-iLlHFIUR.cjs.map +0 -1
- package/dist/chunks/compose-DP1N4twA.cjs +0 -2
- package/dist/chunks/compose-DP1N4twA.cjs.map +0 -1
- package/dist/chunks/compose-U1zs3Yof.js.map +0 -1
- package/dist/chunks/designer-CWL-dCQ_.cjs +0 -69
- package/dist/chunks/designer-CWL-dCQ_.cjs.map +0 -1
- package/dist/chunks/designer-DPG7R_WP.js.map +0 -1
- package/dist/chunks/detail-BUfsSal0.cjs +0 -5
- package/dist/chunks/detail-BUfsSal0.cjs.map +0 -1
- package/dist/chunks/detail-CHZDNNM6.js.map +0 -1
- package/dist/chunks/instance-error-message-BEM4O_Kj.js +0 -208
- package/dist/chunks/instance-error-message-BEM4O_Kj.js.map +0 -1
- package/dist/chunks/instance-error-message-BpCLCOjp.cjs +0 -2
- package/dist/chunks/instance-error-message-BpCLCOjp.cjs.map +0 -1
- package/dist/chunks/users-BBtiZ9QQ.js +0 -486
- package/dist/chunks/users-BBtiZ9QQ.js.map +0 -1
- package/dist/chunks/users-EqSzDhuj.cjs +0 -2
- package/dist/chunks/users-EqSzDhuj.cjs.map +0 -1
|
@@ -0,0 +1,69 @@
|
|
|
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("./workflow-chat-prompt-B803qVdt.cjs"),i=require("./FormBuilderView-Bg9ftYz-.cjs"),a=require("./routes-config-BWjZDAU3.cjs"),o=require("./organization-time-zone-provider-B7CXQril.cjs");;/* empty css */const s=require("./admin-pickers-BjbkBpSJ.cjs"),c=require("./bpm-form-field-Bc6k4ZEO.cjs"),l=require("./member-profile-resolution-DiH-P-Vh.cjs");let u=require("react"),d=require("@mezzanine-ui/react"),f=require("react/jsx-runtime"),p=require("@rytass/bpm-core-shared"),m=require("@mezzanine-ui/react/Drawer");m=e.t(m,1);let h=require("@mezzanine-ui/react/ContentHeader");h=e.t(h,1);let g=require("@rytass/bpm-core-client/template"),_=require("@rytass/bpm-core-client/form"),v=require("@mezzanine-ui/icons"),y=require("ai"),b=require("@rytass/bpm-core-shared/form"),x=require("@rytass/bpm-core-client/organization"),S=require("@xyflow/react"),C=require("dagre");C=e.t(C,1);let w=require("@rytass/bpm-core-shared/workflow-graph"),T=require("@rytass/bpm-core-shared/workflow"),E=require("@ai-sdk/react");var D={HOST_ONLY:{description:`不會出現在發起清單,使用者無法從畫面送出或重送;由串接系統以程式送件。`,id:`HOST_ONLY`,name:`僅限系統送件`},OPEN:{description:`出現在發起清單,使用者可從畫面送出。`,id:`OPEN`,name:`一般發起`}},ee=[D.OPEN,D.HOST_ONLY],O=`OPEN`;function te(e){return e===`HOST_ONLY`?`HOST_ONLY`:O}function k(e){return D[e]}function ne(e){return{launchMode:e}}function re(e,t){let n=[...new Set(e.map(e=>e.level))];return[...t===null||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 ie(e){return e.reduce((e,t)=>Math.max(e,t.level),1)}var ae=`表單中沒有「人員選擇」欄位,請先到表單設計加入`,oe=`表單中沒有單選的「人員選擇」欄位,請先到表單設計加入`,se=`表單中沒有「組織選擇」欄位,請先到表單設計加入`,ce=`原本指定的欄位已不在表單中,或已不是「人員選擇」欄位,請重新選擇。`,A=`原本指定的欄位已不在表單中,或已不是單選的「人員選擇」欄位,請重新選擇。`,j=`原本指定的欄位已不在表單中,或已不是「組織選擇」欄位,請重新選擇。`,le=`此欄位非必填`,M=`此欄位可能被條件隱藏`,N=`此欄位為隱藏欄位,申請人無法填寫`,P=`,空白時此關會找不到人員,發佈時會被拒絕;請在表單設計將它設為必填且不隱藏`,ue=`,空白時此關會找不到組織主管,發佈時會被拒絕;請在表單設計將它設為必填且不隱藏`;function de(e,t=P){let n=[...e.required?[]:[le],...e.visibleWhen?.trim()?[M]:[],...e.hidden?[N]:[]];return n.length>0?`${n.join(`、`)}${t}`:void 0}function fe(e){return`${e.required?``:`(非必填)`}${e.visibleWhen?.trim()?`(可能被條件隱藏)`:``}${e.hidden?`(隱藏欄位)`:``}`}function pe(e){let t=de(e);return{id:e.fieldKey,name:`${e.label} (${e.fieldKey})${fe(e)}`,...t?{warning:t}:{}}}function me(e){return(e?.fields??[]).filter(b.isMemberFieldDefinition).map(pe)}function F(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 F(me(e),t,{empty:ae,stale:ce})}function ge(e){return(e?.fields??[]).filter(b.isMemberFieldDefinition).filter(e=>!e.multiple).map(pe)}function _e(e,t){return F(ge(e),t,{empty:oe,stale:A})}function ve(e){return(e?.fields??[]).filter(b.isOrgUnitFieldDefinition).map(e=>{let t=de(e,ue);return{id:e.fieldKey,name:`${e.label} (${e.fieldKey})${fe(e)}`,...t?{warning:t}:{}}})}function ye(e,t){return F(ve(e),t,{empty:se,stale:j})}function be(e,t){return e?.fields.find(e=>e.fieldKey===t)?.label||t}function xe(e,t){if(!t.trim())return`依表單欄位:未設定`;let n=e?.fields.find(e=>e.fieldKey===t);return n&&!(0,b.isMemberFieldDefinition)(n)?`依表單欄位:${n.label||t}(非人員選擇欄位)`:`依表單欄位:${n?.label||t}`}function Se(e,t,n){if(!t.trim())return`依表單欄位:未設定`;let r=e?.fields.find(e=>e.fieldKey===t);return n(r,r?.label||t)}function Ce(e,t,n){return Se(e,t,(e,t)=>e&&!(0,b.isMemberFieldDefinition)(e)?`依表單欄位:${t}(非人員選擇欄位)`:e&&(0,b.isMemberFieldDefinition)(e)&&e.multiple?`依表單欄位:${t}(需為單選人員欄位)`:`依表單欄位:${t}的${n}`)}function we(e,t){return Se(e,t,(e,t)=>e&&!(0,b.isOrgUnitFieldDefinition)(e)?`依表單欄位:${t}(非組織選擇欄位)`:`依表單欄位:${t}所選組織的主管`)}var Te=[{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:`指定職位`}],Ee=[{id:`1`,name:`直屬主管`,value:1},{id:`2`,name:`第二層主管`,value:2},{id:`3`,name:`第三層主管`,value:3}],De=[{id:`0`,name:`欄位裡的人`,value:0},...Ee],Oe=[{id:`0`,name:`關卡的簽核者`,value:0},...Ee],ke=[{id:`FIXED`,name:`固定組織`},{id:`FORM_FIELD`,name:`表單欄位`}];function I(e,t){return e.find(e=>e.value===t)??{id:String(t),name:`第 ${t} 層主管`,value:t}}function L(e,t){return!Number.isInteger(t)||t<1?{id:`invalid:${t}`,name:`第 ${t} 層主管(無效)`,value:t}:I(e,t)}function R(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 z(e,t){let n=R(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:ie(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 B(e){return(0,T.isFallbackCapableApproverResolverType)(e.type)}function Ae(e,t){return B(e)?{...e,fallback:t}:e}function je(e){return Ee.find(t=>t.value===e)??Ee[0]}function Me(e){return Ee.find(t=>t.id===e)??Ee[0]}function Ne(e){return e.type===`DIRECT`?e.memberIds:B(e)&&e.fallback?.type===`DIRECT`&&e.fallback.memberId?[e.fallback.memberId]:[]}function Pe(e,t,n,r,i,a){return e.type===`DIRECT`?Fe(e.memberIds,t,`未指定簽核者`):e.type===`ORG_MANAGER`?je(e.levelsUp).name:e.type===`ORG_MANAGER_CHAIN`?Ft(e,i,a):e.type===`ORG_UNIT_MANAGER`?`組織主管:${Ie(n,e.orgUnitId)}`:e.type===`ORG_UNIT_MEMBER`?`組織任一人:${Ie(n,e.orgUnitId)}`:e.type===`ORG_UNIT_POSITION`?`組織職位:${Ie(n,e.orgUnitId)} / ${Le(r,e.positionId)}`:e.type===`POSITION`?`職位:${Le(r,e.positionId)}`:e.type===`DYNAMIC_FORM`?xe(i,e.formPath):e.type===`FORM_MEMBER_MANAGER`?Ce(i,e.formPath,L(De,e.levelsUp).name):e.type===`FORM_ORG_UNIT_MANAGER`?we(i,e.formPath):e.type===`NODE_ACTOR`?`前面關卡的簽核者:${V(e.nodeIds,a)}`:e.type===`NODE_ACTOR_MANAGER`?`前面關卡簽核者的${L(Oe,e.levelsUp).name}:${V(e.nodeIds,a)}`:e.type===`EXPRESSION`?`自訂表達式`:He((0,T.readUnsupportedApproverResolverType)(e)??``)}function V(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 Fe(e,t,n){let r=e.map(e=>Be(t,e).name);return r.length===0?n:r.length<=2?r.join(`、`):`${r.slice(0,2).join(`、`)} 等 ${r.length} 人`}function Ie(e,t){return Re(e,t)?.name??`未指定組織`}function Le(e,t){return ze(e,t)?.name??`未指定職位`}function Re(e,t){let n=e.find(e=>e.id===t);return n?s.a(n):null}function ze(e,t){let n=e.find(e=>e.id===t);return n?s.o(n):null}function Be(e,t){return e.find(e=>e.memberId===t)??Ve(t)}function Ve(e){return{displayName:`未知會員`,email:``,id:e,memberId:e,name:`未知會員`,unresolved:!0}}function He(e){return`不支援的簽核來源(${e})`}function Ue(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 He((0,T.readUnsupportedApproverResolverType)(e)??``)}}function H(e){return{...e.fallback===void 0?{}:{fallback:e.fallback},...e.preferClosestOrgUnit===void 0?{}:{preferClosestOrgUnit:e.preferClosestOrgUnit}}}function We(e){if((0,T.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{...H(e),formPath:e.formPath,levelsUp:e.levelsUp,mode:`DYNAMIC_FORM`};case`ORG_UNIT_MANAGER`:return{...H(e),formPath:``,mode:e.type,orgSource:`FIXED`,orgUnitId:e.orgUnitId};case`FORM_ORG_UNIT_MANAGER`:return{...H(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{...H(e),levelsUp:e.levelsUp,mode:`NODE_ACTOR`,nodeIds:e.nodeIds};default:return{mode:`AS_STORED`,resolver:e}}}function Ge(e){return e.mode===`AS_STORED`||e.mode===`UNSUPPORTED`?e.resolver:e.mode===`DYNAMIC_FORM`?e.levelsUp===null?{formPath:e.formPath,type:`DYNAMIC_FORM`}:{...H(e),formPath:e.formPath,levelsUp:e.levelsUp,type:`FORM_MEMBER_MANAGER`}:e.mode===`ORG_UNIT_MANAGER`?e.orgSource===`FIXED`?{...H(e),orgUnitId:e.orgUnitId,type:`ORG_UNIT_MANAGER`}:{...H(e),formPath:e.formPath,type:`FORM_ORG_UNIT_MANAGER`}:e.levelsUp===null?{nodeIds:e.nodeIds,type:`NODE_ACTOR`}:{...H(e),levelsUp:e.levelsUp,nodeIds:e.nodeIds,type:`NODE_ACTOR_MANAGER`}}function Ke(e,t){return e.mode===`DYNAMIC_FORM`||e.mode===`NODE_ACTOR`?{...e,levelsUp:t>0?t:null}:e}function qe(e,t){return e.mode===`ORG_UNIT_MANAGER`?{...e,orgSource:t,...t===`FORM_FIELD`&&e.preferClosestOrgUnit===void 0?{preferClosestOrgUnit:!0}:{}}:e}var Je=`UNSUPPORTED`,Ye=`此引擎版本不支援這種簽核來源;這裡選擇其他簽核來源會覆寫原設定`;function Xe(e){if(e.mode===`UNSUPPORTED`){let t={id:Je,name:He(e.type)};return{hint:Ye,options:[...Te,t],selected:t}}let t=e.mode===`AS_STORED`?R(e.resolver.type):e.mode;return{hint:null,options:Te,selected:Te.find(e=>e.id===t)??Te[0]}}function Ze(e,t,n){if(t===null||!Te.some(e=>e.id===t))return null;let r=We(e);return t===(r.mode===`AS_STORED`?r.resolver.type:r.mode===`UNSUPPORTED`?null:r.mode)?null:z(t,n)}function Qe(e){if(e.mode!==`DYNAMIC_FORM`&&e.mode!==`NODE_ACTOR`)return null;let t=e.mode===`DYNAMIC_FORM`?De:Oe;if(e.levelsUp===null)return{invalid:!1,options:t,selected:t[0]};let n=L(t,e.levelsUp);return{invalid:n.id.startsWith(`invalid:`),options:t.some(e=>e.id===n.id)?t:[...t,n],selected:n}}function $e(e,t){let n=Qe(e),r=n?.options.find(e=>e.id===t);return!n||!r||r.id.startsWith(`invalid:`)||r.id===n.selected.id?null:Ke(e,r.value)}function et(e){return B(e)?{fallback:e.fallback??{type:`NONE`},preferClosestOrgUnit:`preferClosestOrgUnit`in e&&!!e.preferClosestOrgUnit,showPreferClosestOrgUnit:e.type!==`ORG_MANAGER_CHAIN`}:null}function tt(e,t){return!B(e)||e.type===`ORG_MANAGER_CHAIN`?e:{...e,preferClosestOrgUnit:t}}var U=[{id:`INITIATOR`,name:`發起人`},{id:`FORM_MEMBER`,name:`表單欄位的人`},{id:`NODE_ACTOR`,name:`前面關卡的簽核者`},{id:`CHAIN_CONTINUATION`,name:`接續前面某一段主管鏈`}],nt=`UNSUPPORTED`,rt=`此引擎版本不支援這種主管鏈起點;這裡選擇其他起點會覆寫原設定`,it={id:`NONE`,name:`不指定(從鏈上第一位有職等的主管開始簽)`},at=`invalid`,ot=`起始職等不可高於簽到職等,發布前必須修正。`,st={CHAIN_CONTINUATION:`只簽比那一段實際已簽到的職等更高的主管;那一段已簽到本關職等時,本關整關略過。`,FORM_MEMBER:`依申請人送出表單時在該欄位選的人員,從他的主管開始往上簽。`,INITIATOR:`從發起人的直屬主管開始往上簽。`,NODE_ACTOR:`從所選前面關卡實際簽核的那一位開始,往上找他的主管。`};function ct(e){let t=typeof e==`object`&&e?e.type:void 0;return typeof t==`string`?t:``}function lt(e){return(0,T.isOrgManagerChainStartedFromInitiator)(e)?`INITIATOR`:(0,T.readUnsupportedOrgManagerChainStartType)({type:ct(e.startFrom)})===null?e.startFrom?.type??`INITIATOR`:null}var ut=`(已勾選略過,不能同時使用)`;function dt(e){return(0,T.isOrgManagerChainSkippingWhenStartReached)(e)&&!(0,T.isOrgManagerChainContinuation)(e)}function ft(e){let t=e.skipWhenStartReached;return(0,T.isOrgManagerChainContinuation)(e)&&(t==null||t===!1)}function pt(e){return dt(e)?U.map(e=>e.id===`CHAIN_CONTINUATION`?{...e,name:`${e.name}${ut}`}:e):U}function mt(e){let t=lt(e);if(t===null){let t={id:nt,name:ht(e)};return{hint:rt,options:[...pt(e),t],selected:t}}return{hint:st[t],options:pt(e),selected:U.find(e=>e.id===t)??U[0]}}function ht(e){let t=(0,T.readUnsupportedOrgManagerChainStartType)({type:ct(e.startFrom)})??``;return t.startsWith(`(`)?`不支援的起點${t}`:`不支援的起點(${t})`}function gt(e,t){return Object.fromEntries(Object.entries(e).filter(([e])=>e!==t))}function _t(e,t){let n=gt(e,`startFrom`);return t===`FORM_MEMBER`?{...n,startFrom:{formPath:``,type:`FORM_MEMBER`}}:t===`NODE_ACTOR`?{...n,startFrom:{nodeIds:[],type:`NODE_ACTOR`}}:t===`CHAIN_CONTINUATION`?{...gt(n,`skipWhenStartReached`),startFrom:{nodeId:``,type:`CHAIN_CONTINUATION`}}:n}function vt(e,t){let n=U.find(e=>e.id===t);return e.type!==`ORG_MANAGER_CHAIN`||!n||n.id===lt(e)||n.id===`CHAIN_CONTINUATION`&&dt(e)?null:_t(e,n.id)}function yt(e){return e.startFrom?.type===`FORM_MEMBER`?e.startFrom.formPath:null}function bt(e){return e.startFrom?.type===`NODE_ACTOR`?e.startFrom.nodeIds:null}function xt(e,t){return e.startFrom?.type===`FORM_MEMBER`?{...e,startFrom:{formPath:t,type:`FORM_MEMBER`}}:e}function St(e,t){return e.startFrom?.type===`NODE_ACTOR`?{...e,startFrom:{nodeIds:t,type:`NODE_ACTOR`}}:e}function Ct(e){return e.startFrom?.type===`CHAIN_CONTINUATION`?e.startFrom.nodeId:null}function wt(e,t){return e.startFrom?.type===`CHAIN_CONTINUATION`?{...e,startFrom:{nodeId:t,type:`CHAIN_CONTINUATION`}}:e}function Tt(e){return(0,T.isOrgManagerChainSkippingWhenStartReached)(e)}function Et(e,t){return t?{...e,skipWhenStartReached:!0}:gt(e,`skipWhenStartReached`)}function Dt(e){let t=(0,T.readOrgManagerChainStartPositionLevel)(e);return t!==null&&Number.isInteger(t)?t:null}function Ot(e,t){return{...e,minPositionLevel:t}}function kt(e,t){let n=Dt(e),r=e.startPositionLevel,i=re(t,n).filter(t=>t.value<=e.minPositionLevel||t.value===n).map(({id:e,name:t})=>({id:e,name:t})),a=[it,...i];if(n!==null)return{invalid:!1,options:a,selected:i.find(e=>e.id===String(n))??it};if(r==null)return{invalid:!1,options:a,selected:it};let o={id:at,name:`起始職等無效`};return{invalid:!0,options:[...a,o],selected:o}}function At(e,t){if(e.type!==`ORG_MANAGER_CHAIN`||t===null)return null;let n=(0,T.readOrgManagerChainStartPositionLevel)(e);if(t===`NONE`)return n===null&&e.startPositionLevel===void 0?null:gt(e,`startPositionLevel`);let r=Number(t);return Number.isFinite(r)&&r!==n?{...e,startPositionLevel:r}:null}function jt(e){let t=Dt(e);return t!==null&&t>e.minPositionLevel?ot:null}function Mt(e,t,n){let r=lt(e);if(r===null)return ht(e);if(r===`FORM_MEMBER`){let n=yt(e)??``;return n.trim()?`從表單欄位「${be(t,n)}」的主管起算`:`從表單欄位(未指定)的主管起算`}if(r===`NODE_ACTOR`){let t=bt(e)??[];return t.length>0?`從前面關卡「${V(t,n)}」簽核者的主管起算`:`從前面關卡(未指定)簽核者的主管起算`}if(r===`CHAIN_CONTINUATION`){let t=Ct(e)??``;return t.trim()?`接續前一段主管鏈「${n?.find(e=>e.id===t)?.name??t}」`:`接續前一段主管鏈(未指定)`}return null}var Nt=`預設會停止流程並提示;若設定固定人,主管鏈在達到簽核職等前就結束時,會再加上該會員作為最後一關。`;function Pt(e){let t=lt(e),n=[...t===`FORM_MEMBER`?[`找不到起點(表單欄位沒選人)`]:[],...t===`NODE_ACTOR`?[`找不到起點(前面關卡沒有同意紀錄)`]:[],...t===`CHAIN_CONTINUATION`?[`找不到起點(接續的前一段主管鏈沒有起點)`]:[],...(0,T.readOrgManagerChainStartPositionLevel)(e)===null?[]:[`鏈上沒有人達到起始職等`]];return n.length>0?`${Nt.slice(0,-1)};${n.join(`,或`)}時,則改派給該會員。`:Nt}function Ft(e,t,n){let r=Mt(e,t,n),i=(0,T.readOrgManagerChainStartPositionLevel)(e);return`主管鏈:${r?`${r},`:``}簽到職等 ${e.minPositionLevel}${i===null?``:`(從職等 ${i} 開始)`}${(0,T.isOrgManagerChainSkippingWhenStartReached)(e)?`(起點本人已達簽到職等時略過此關)`:``}`}var It=[{id:`SINGLE`,name:`單人簽核`},{id:`PARALLEL_ANY`,name:`任一人同意`},{id:`PARALLEL_ALL`,name:`全部同意`},{id:`SEQUENTIAL`,name:`依序簽核`},{id:`QUORUM`,name:`達到指定門檻`}];function Lt(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 Rt(e){return It.find(t=>t.id===e)||{id:e,name:`未知決策方式(${e})`}}function zt({directory:e,expressionTools:t,initialState:n,layout:r,onLayout:i}){let[a,o]=(0,u.useState)(n),s=(0,u.useRef)(n),c=(0,u.useRef)(e);c.current=e;let l=(0,u.useRef)(t);l.current=t;let d=(0,u.useCallback)(e=>{if(!e.changed&&!e.error)return e;let t=e.effects.layout?r(e.state.definition):e.state.definition,n={...e.state,definition:t};return s.current=n,o(n),e.effects.layout&&i?.(t),{...e,state:n}},[r,i]),f=(0,u.useCallback)(e=>d((0,p.applyWorkflowCommand)(s.current,e)),[d]),m=(0,u.useCallback)(e=>d((0,p.applyWorkflowMacroCommand)(s.current,e)),[d]),h=(0,u.useRef)(Promise.resolve()),g=(0,u.useCallback)(async(e,t)=>{let n=s.current,r=await(0,p.executeWorkflowTool)(n,e,t,{directory:c.current,expressions:l.current?.(n)});if(r.ok&&(r.kind===`mutation`||r.kind===`macro`)){if(s.current!==n)return{error:`檢查運算式期間畫布已被修改,這次變更沒有套用,請重新讀取 snapshot 後再試。`,ok:!1};let e=d(r.result);return{...r,result:e,snapshot:(0,p.readWorkflowSnapshot)(e.state)}}return r},[d]),_=(0,u.useCallback)((e,t)=>{let n=h.current.then(()=>g(e,t));return h.current=n.catch(()=>void 0),n},[g]),v=(0,u.useCallback)(e=>{let t=typeof e==`function`?e(s.current):e;s.current=t,o(t)},[]),y=(0,u.useCallback)(()=>s.current,[]),b=(0,u.useMemo)(()=>(0,p.readWorkflowSnapshot)(a),[a]);return(0,u.useMemo)(()=>({dispatch:f,dispatchMacro:m,executeTool:_,getState:y,replaceState:v,snapshot:b,state:a,tools:p.WORKFLOW_TOOLSET}),[f,m,_,y,v,b,a])}function Bt({controller:e,api:t=`/api/chat`}){let n=(0,u.useMemo)(()=>new y.DefaultChatTransport({api:t}),[t]),r=(0,E.useChat)({transport:n,sendAutomaticallyWhen:y.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 W=12;function Vt(){let e=globalThis.LanguageModel;return e&&typeof e==`object`?e:null}var Ht={additionalProperties:!1,properties:{action:{enum:[`tool`,`message`],type:`string`},input:{type:`object`},text:{type:`string`},tool:{type:`string`}},required:[`action`],type:`object`};function Ut(){let e=p.WORKFLOW_TOOLSET.map(e=>`- ${e.name}(${JSON.stringify(e.inputSchema.properties??{})}): ${e.description}`).join(`
|
|
2
|
+
`);return`你是「簽核流程設計器」頁面的離線 AI 助理。只能透過下列工具操作這個流程畫布,其他請求一律婉拒並引導回流程設計。
|
|
3
|
+
|
|
4
|
+
每一步只輸出一個 JSON 決策物件:
|
|
5
|
+
- 呼叫工具:{"action":"tool","tool":"<工具名>","input":{...}}
|
|
6
|
+
- 回覆使用者(完成或詢問):{"action":"message","text":"<繁體中文訊息>"}
|
|
7
|
+
|
|
8
|
+
規則:先用 get_workflow_snapshot 了解現況再規劃;完成後用 validate_workflow 檢查並以 message 說明做了什麼。
|
|
9
|
+
|
|
10
|
+
${r.t}
|
|
11
|
+
|
|
12
|
+
可用工具:
|
|
13
|
+
${e}`}function Wt({controller:e}){let[t,n]=(0,u.useState)(!1),[r,i]=(0,u.useState)([]),[a,o]=(0,u.useState)(`ready`),s=(0,u.useRef)(0);(0,u.useEffect)(()=>{let e=Vt();e&&e.availability().then(e=>{n(e!==`unavailable`)}).catch(()=>n(!1))},[]);let c=(0,u.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,u.useCallback)(t=>{let n=Vt();n&&a===`ready`&&(c(`user`,t),o(`submitted`),Gt({appendMessage:c,controller:e,model:n,userText:t}).then(()=>o(`ready`)).catch(e=>{c(`assistant`,G(e)),o(`error`)}))},[c,e,a]),status:a}}async function Gt({appendMessage:e,controller:t,model:n,userText:r}){let i=await n.create({initialPrompts:[{content:Ut(),role:`system`}]});try{let n=`使用者需求:${r}\n目前流程:${JSON.stringify(t.snapshot)}`;for(let r=0;r<W;r+=1){let r=Kt(await i.prompt(n,{responseConstraint:Ht}));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 Kt(e){try{let t=JSON.parse(e);return typeof t==`object`&&t&&t.action!==void 0?t:null}catch{return null}}function G(e){return e instanceof Error?`離線模式發生錯誤:${e.message}`:`離線模式發生未知錯誤。`}var qt={display:`flex`,flexDirection:`column`,gap:12,height:`100%`},K={display:`flex`,flex:1,flexDirection:`column`,gap:12,minHeight:0,overflowY:`auto`},Jt={display:`flex`,gap:8,paddingBottom:4},Yt={borderTop:`1px solid var(--mzn-color-border-neutral, #e5e7eb)`,display:`flex`,flexDirection:`column`,gap:8,paddingTop:12},Xt={display:`flex`,justifyContent:`flex-end`},Zt={width:`100%`},Qt=`workflow-chat-input-field`,$t=`
|
|
14
|
+
.${Qt}.mzn-text-field {
|
|
15
|
+
width: 100%;
|
|
16
|
+
}
|
|
17
|
+
`,en={color:`var(--mzn-color-text-secondary, #6b7280)`,fontSize:12,padding:`2px 0`},tn={"input-available":`執行中…`,"input-streaming":`準備中…`,"output-available":`完成`,"output-error":`失敗`};function nn(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 rn({api:e,controller:t,onClose:n,open:r}){let i=Bt({api:e,controller:t}),a=Wt({controller:t}),[o,s]=(0,u.useState)(`online`),[c,l]=(0,u.useState)(``),p=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}=p,_=p.status===`submitted`||p.status===`streaming`,v=(0,u.useCallback)(()=>{let e=c.trim();e&&!_&&(l(``),g(e))},[_,c,g]),y=(0,u.useCallback)(e=>{e.nativeEvent.isComposing||e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),v())},[v]);return(0,f.jsxs)(m.default,{headerTitle:`AI 流程助理`,isHeaderDisplay:!0,onClose:n,open:r,size:`medium`,children:[(0,f.jsx)(`style`,{children:$t}),(0,f.jsxs)(`div`,{style:qt,children:[a.available?(0,f.jsxs)(`div`,{style:Jt,children:[(0,f.jsx)(d.Button,{onClick:()=>s(`online`),variant:o===`online`?`base-primary`:`base-tertiary`,children:`線上`}),(0,f.jsx)(d.Button,{onClick:()=>s(`offline`),variant:o===`offline`?`base-primary`:`base-tertiary`,children:`離線(裝置內,實驗)`})]}):null,(0,f.jsxs)(`div`,{role:`log`,style:K,children:[h.length===0?(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`body`,children:`用一句話描述你想要的流程,例如:「建立三關簽核:部門主管 → 經理 → 財務,金額大於十萬走財務複核」。我會直接在畫布上幫你繪製。`}):null,h.map(e=>(0,f.jsx)(u.Fragment,{children:an(e)},e.id)),_?(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`body`,children:`思考中…`}):null]}),(0,f.jsxs)(`div`,{style:Yt,children:[(0,f.jsx)(d.Textarea,{className:Qt,disabled:_,maxLength:2e3,onChange:e=>l(e.target.value),onKeyDown:y,placeholder:`描述你想要的流程…(Enter 送出,Shift + Enter 換行)`,rows:3,style:Zt,value:c}),(0,f.jsx)(`div`,{style:Xt,children:(0,f.jsx)(d.Button,{disabled:_||c.trim().length===0,loading:_,onClick:v,type:`button`,variant:`base-primary`,children:`送出`})})]})]})]})}function an(e){return e.parts.map((t,n)=>{if(t.type===`text`)return(0,f.jsx)(`div`,{style:nn(e.role),children:t.text},`${e.id}-${n}`);if(t.type===`dynamic-tool`||(0,y.isToolUIPart)(t)){let r=(0,y.getToolName)(t),i=tn[t.state]??t.state;return(0,f.jsx)(`div`,{style:en,children:`⚙ ${r} · ${i}`},`${e.id}-${n}`)}return null})}var on={DEFAULT:`預設`,FILL_OPTIONAL:`補填(選填)`,FILL_REQUIRED:`補填(必填)`,HIDE:`隱藏`,SHOW:`顯示`,COLUMNS:`逐欄補填`},sn={NONE:`不可補填`,OPTIONAL:`選填`,REQUIRED:`必填`},cn={FILL:`填寫`,FILL_COLUMNS:`逐欄補填`,FILL_OPTIONAL:`補填(選填)`,FILL_REQUIRED:`補填(必填)`,HIDDEN:`隱藏`,NOT_SHOWN:`不顯示`,READ_ONLY:`唯讀`},ln={approverFilledFieldDataSource:`選項來自資料來源,不能補填`,approverFilledFieldFileUpload:`檔案上傳欄位不能補填`,approverFilledFieldFormRule:`表單已設定必填、顯示或預設值等規則,不能補填`,approverFilledTableDataSourceColumn:`此欄是其他資料來源欄的選項依據,相依欄也必須開放給同一節點補填`},un=`「隱藏」只影響這一關的畫面,不是權限:資料查詢仍拿得到值,不能用來保密。`;function dn(e){return`關卡 ${e.stage}`}function fn(e){let t=(0,p.readNodeFillUnits)(e);return{fill:t.length,hidden:(0,p.readNodeFieldAccess)(e).filter(e=>e.fill===`NONE`&&e.display===`HIDE`).length,required:t.filter(e=>e.fill===`REQUIRED`).length}}function pn(e){let{fill:t,hidden:n}=fn(e),r=[...t>0?[`補填 ${t}`]:[],...n>0?[`隱藏 ${n}`]:[]];return r.length?r.join(` · `):null}var mn=new Set([`fieldAccessAutoApprove`,`fieldAccessGroupPolicy`,`fieldAccessManagerChainReached`,`fieldAccessSkipNode`]);function hn(e){return mn.has(e.code)}var gn=[`NONE`,`OPTIONAL`,`REQUIRED`].map(e=>({id:e,name:sn[e]})),_n=`逐欄補填沒有選任何欄位,請至少選一欄或改回預設。`,vn={display:`grid`,gap:12,gridTemplateColumns:`minmax(0, 1fr)`,padding:`var(--mzn-spacing-padding-vertical-spacious) var(--mzn-spacing-padding-horizontal-spacious)`},yn={display:`grid`,gap:4},bn={display:`grid`};function xn(e){return e.nodes.filter(e=>e.type===`userTask`).flatMap(e=>(0,p.readNodeFieldAccess)(e).filter(p.isFieldAccessEntryValid).map(t=>({...t,nodeId:e.id})))}function Sn(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 Cn(e,t,n,r){let i=(0,p.readFieldAccessEntryForChoice)(n,r);return Sn(e,t,n,i===null?null:{...i,nodeId:t})}function wn(e,t,n,r,i){let a=e.find(e=>e.nodeId===t&&e.fieldKey===n)??null;return Sn(e,t,n,{...(0,p.updateFieldAccessColumnFill)(a,n,r,i),nodeId:t})}function Tn(e){return e.flatMap(e=>[{key:e.fieldKey,row:e},...e.cells.some(e=>e.choice===`COLUMNS`)?e.tableColumns.map(t=>({key:`${e.fieldKey}::${t.columnKey}`,row:e,tableColumn:t})):[]])}function En(e){return e.cells.some(e=>e.choice===`COLUMNS`&&e.columnFills.length===0)}function Dn(e){return e.some(e=>e.columns!==void 0&&e.columns.length===0)}function q(e){return`${e.nodeId}\u0000${e.fieldKey}`}function On(e,t,n,r){let i=new Map(t.map(e=>[q(e),e])),a=new Map(n.map(e=>[q(e),e]));return[...t,...n].filter((e,t,n)=>n.findIndex(t=>q(t)===q(e))===t&&JSON.stringify(i.get(q(e)))!==JSON.stringify(a.get(q(e)))).reduce((e,t)=>Sn(e,t.nodeId,t.fieldKey,a.get(q(t))??null),e).filter(e=>r.has(e.nodeId))}function kn(e){return new Set(e.nodes.filter(e=>e.type===`userTask`).map(e=>e.id))}function An(e){return e.columns!==void 0&&e.columns.length===0}function J(e,t,n){let r=(0,p.applyWorkflowCommand)({definition:e,editingEdgeId:null,formDefinitionVersionId:null,formSchema:t,initiatorPolicyCel:null,selectedEdgeIds:[],selectedNodeId:null},{entries:n.filter(e=>!An(e)),type:`setFieldAccessMatrix`}).state.definition,i=n.filter(An);return{...r,nodes:r.nodes.map(e=>{let t=i.filter(t=>t.nodeId===e.id);if(e.type!==`userTask`||t.length===0)return e;let n=new Set(t.map(e=>e.fieldKey)),r=(e.data.fieldAccess??[]).filter(e=>!n.has(e.fieldKey)),a=t.map(({columns:e,display:t,fieldKey:n,fill:r})=>({columns:e,display:t,fieldKey:n,fill:r}));return{...e,data:{...e.data,fieldAccess:[...r,...a]}}})}}function jn(e){return e.nodes.every(t=>t.type!==`userTask`||t.data.fieldAccess===void 0||Mn(t.data.fieldAccess)===Mn(xn({...e,nodes:[t]})))}function Mn(e){return JSON.stringify(Array.isArray(e)?e.map(Nn):e)}function Nn(e){if(typeof e!=`object`||!e||Array.isArray(e))return e;let{display:t,fieldKey:n,fill:r,columns:i}=e;return[t,n,r,Pn(i)]}function Pn(e){return Array.isArray(e)?e.map(e=>Fn(e)):e??null}function Fn(e){if(typeof e!=`object`||!e)return e;let{columnKey:t,fill:n}=e;return[t,n]}function In(e,t){return JSON.stringify(e)===JSON.stringify(t)}var Y={columns:[],issues:[],rows:[]};function Ln(e,t){let n=xn(e);return{draft:n,initial:n,pinnedFieldKeys:new Set((0,p.readFieldAccessMatrix)(e,t).rows.filter(X).map(e=>e.fieldKey))}}function X(e){return e.cells.some(e=>e.explicit!==null)||e.issues.length>0||e.notices.length>0}function Rn(e){return p.FIELD_ACCESS_CHOICES.filter(t=>t===e.choice||!e.disabledChoices.includes(t)).map(t=>({id:t,name:t===`DEFAULT`&&e.choice===`DEFAULT`?`預設:${cn[e.effective]}`:on[t]}))}function zn(e,t){if(e.applicant.effective===`FILL`)return cn.FILL;let n=e.fillNodeIds.map(e=>t.find(t=>t.nodeId===e)).filter(e=>!!e).map(dn).join(`、`);return`${cn.NOT_SHOWN}(${n} 補填)`}function Bn({definition:e,expressionReferences:t,formSchema:n,language:r,onApply:i,onClose:a,open:o}){let[s,c]=(0,u.useState)(null),[l,h]=(0,u.useState)(!0),[_,v]=(0,u.useState)(null);if(o&&s===null){let t=Ln(e,n);c(t),h(t.pinnedFieldKeys.size>0),v(null)}!o&&s!==null&&c(null);let y=(0,u.useMemo)(()=>s===null?null:On(xn(e),s.initial,s.draft,kn(e)),[e,s]),b=(0,u.useMemo)(()=>y===null?e:J(e,n,y),[e,y,n]),x=(0,u.useMemo)(()=>y===null?Y:(0,p.readFieldAccessMatrix)(b,n),[b,y,n]),S=s?.pinnedFieldKeys??new Set,C=e=>(0,g.readWorkflowLintMessage)(e,b,r),w=x.rows.filter(e=>!l||S.has(e.fieldKey)||X(e)),T=x.rows.length-w.length,E=new Set(x.rows.map(e=>e.fieldKey)),D=x.issues.filter(e=>!e.fieldKeys.some(e=>E.has(e)));function ee(e,t,n){v(null),c(r=>r===null?null:{...r,draft:Cn(r.draft,e,t,n),pinnedFieldKeys:new Set([...r.pinnedFieldKeys,t])})}function O(e,t,n,r){v(null),c(i=>i===null?null:{...i,draft:wn(i.draft,e,t,n,r),pinnedFieldKeys:new Set([...i.pinnedFieldKeys,t])})}function te(){let t=y===null?null:Dn(y)?_n:In(y,xn(e))&&jn(e)?null:i(y);t===null?a():v(t)}let k=[{ellipsis:!1,fixed:`start`,key:`field`,render:({row:e,tableColumn:n})=>n===void 0?(0,f.jsxs)(`div`,{style:bn,children:[(0,f.jsx)(d.Typography,{variant:`label-primary`,children:e.field.label}),(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`caption`,children:e.fieldKey}),t?.get(e.fieldKey)?.length?(0,f.jsx)(d.Badge,{text:`運算式引用 ${t.get(e.fieldKey)?.length??0}`,variant:`dot-info`}):null]}):(0,f.jsxs)(`div`,{style:bn,children:[(0,f.jsx)(d.Typography,{variant:`body`,children:n.label}),(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`caption`,children:n.columnKey})]}),title:`欄位`,width:180},{ellipsis:!1,key:`applicant`,render:({row:e,tableColumn:t})=>t===void 0?zn(e,x.columns):null,title:`申請人`,width:160},...x.columns.map((e,t)=>({ellipsis:!1,key:`node:${e.nodeId}`,render:({row:n,tableColumn:r})=>{let i=n.cells[t];if(r!==void 0){if(i.choice!==`COLUMNS`)return null;let t=i.columnFills.find(e=>e.columnKey===r.columnKey)?.fill??`NONE`;return(0,f.jsx)(d.Select,{clearable:!1,inputProps:{"aria-label":`${n.field.label} · ${r.label} 在${dn(e)}的補填設定`},onChange:t=>O(e.nodeId,n.fieldKey,r.columnKey,gn.find(e=>e.id===t?.id)?.id??`NONE`),options:[...gn],size:`sub`,value:gn.find(e=>e.id===t)??null})}let a=Rn(i);return(0,f.jsx)(d.Select,{clearable:!1,inputProps:{"aria-label":`${n.field.label} 在${dn(e)}的設定`},onChange:t=>ee(e.nodeId,n.fieldKey,a.find(e=>e.id===t?.id)?.id??`DEFAULT`),options:[...a],size:`sub`,value:a.find(e=>e.id===i.choice)??null})},title:(0,f.jsxs)(`div`,{style:yn,children:[(0,f.jsxs)(d.Typography,{color:`text-neutral`,variant:`caption`,children:[dn(e),e.branchLabel?` · 分支:${e.branchLabel}`:``]}),(0,f.jsx)(d.Typography,{variant:`label-primary`,children:e.label})]}),width:224})),{ellipsis:!1,key:`check`,render:({row:e,tableColumn:t})=>t===void 0?ne(e):null,title:`檢查`,width:280}];function ne(e){let t=e.issues.map(e=>C(e.message)),n=e.notices.map(e=>{let t=x.columns.find(t=>t.nodeId===e.nodeId);return`${t?dn(t):e.nodeId} 會看到空白欄位:這一關之前還沒有人補填。`}),r=e.fillNodeIds.length===0?[...e.fillBlockers.flatMap(e=>{let t=ln[e.code];return t?[t]:[]})]:[],i=En(e)?[_n]:[];return t.length+n.length+r.length+i.length===0?(0,f.jsx)(d.Badge,{text:`沒有問題`,variant:`dot-success`}):(0,f.jsxs)(`div`,{style:yn,children:[i.map(e=>(0,f.jsx)(d.Badge,{text:e,variant:`dot-error`},`empty:${e}`)),t.map(e=>(0,f.jsx)(d.Badge,{text:e,variant:`dot-warning`},`warning:${e}`)),n.map(e=>(0,f.jsx)(d.Badge,{text:e,variant:`dot-info`},`notice:${e}`)),[...new Set(r)].map(e=>(0,f.jsx)(d.Badge,{text:e,variant:`dot-info`},`blocker:${e}`))]})}return(0,f.jsx)(m.default,{bottomGhostActionText:`取消`,bottomOnGhostActionClick:a,bottomOnPrimaryActionClick:te,bottomPrimaryActionText:`套用`,headerTitle:`欄位與關卡總覽`,isBottomDisplay:!0,isHeaderDisplay:!0,onClose:a,open:o,size:`wide`,children:(0,f.jsxs)(`div`,{style:vn,children:[_===null?null:(0,f.jsxs)(`div`,{style:yn,children:[(0,f.jsx)(d.InlineMessage,{content:`無法套用,編輯內容仍保留。`,severity:`error`}),(0,f.jsx)(d.Badge,{text:_,variant:`dot-error`})]}),(0,f.jsxs)(`div`,{style:yn,children:[x.issues.length>0?(0,f.jsx)(d.InlineMessage,{content:`有 ${x.issues.length} 個欄位設定問題,處理完才能發布。`,severity:`warning`}):(0,f.jsx)(d.InlineMessage,{content:`補填由該關的簽核人在核准時填寫。`,severity:`info`}),(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`caption`,children:x.issues.length>0?`問題標示在各欄位的「檢查」欄。`:`申請人送出時看不到補填欄位。${un}發布時還會檢查條件是否在補填前就讀取這些欄位。`}),D.map(e=>(0,f.jsx)(d.Badge,{text:C(e.message),variant:`dot-warning`},e.message))]}),(0,f.jsx)(d.Toggle,{checked:l,inputProps:{"aria-label":`只看有設定或有問題的欄位`},label:`只看有設定或有問題的欄位`,onChange:e=>h(e.target.checked),size:`sub`}),T>0?(0,f.jsxs)(d.Typography,{color:`text-neutral`,variant:`caption`,children:[`已收起 `,T,` 個沒有設定也沒有問題的欄位。`]}):null,n===null?(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`body`,children:`尚未綁定表單,沒有可設定的欄位。`}):(0,f.jsx)(d.Table,{columns:k,dataSource:[...Tn(w)],fullWidth:!0})]})})}var Vn={borderTop:`1px solid var(--mzn-color-border-neutral)`,display:`grid`,gap:8,paddingTop:12},Hn={alignItems:`center`,display:`flex`,gap:8,justifyContent:`space-between`};function Un({definition:e,language:t,node:n,onOpenMatrix:r,onRemoveLegacy:i,openDisabledReason:a}){let o=fn(n),s=(0,p.readNodeFieldAccessIssues)(n).filter(hn).map(n=>(0,g.readWorkflowLintMessage)(n.message,e,t));return(0,f.jsxs)(`section`,{"aria-label":`欄位顯示與補填`,style:Vn,children:[(0,f.jsxs)(`div`,{style:Hn,children:[(0,f.jsx)(d.Typography,{component:`h3`,variant:`h3`,children:`欄位顯示與補填`}),(0,f.jsx)(d.Button,{disabled:a!==null,onClick:r,size:`sub`,title:a??void 0,variant:`base-secondary`,children:`開啟欄位總覽`})]}),(0,f.jsxs)(d.Typography,{color:`text-neutral`,variant:`body`,children:[`本關補填 `,o.fill,` 個(必填 `,o.required,`)`]}),(0,f.jsxs)(d.Typography,{color:`text-neutral`,variant:`body`,children:[`本關隱藏 `,o.hidden,` 個`]}),(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`body`,children:`其他欄位依預設`}),a?(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`caption`,children:a}):null,(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`caption`,children:un}),n.data.fieldPermissions===void 0?null:(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(d.InlineMessage,{content:`含已停用的舊欄位權限設定`,severity:`warning`}),(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`caption`,children:`舊設定(fieldPermissions)從未生效,也不會自動轉換;移除後才能發布,需要的設定請在欄位總覽重新指定。`}),(0,f.jsx)(`div`,{children:(0,f.jsx)(d.Button,{onClick:i,size:`sub`,variant:`base-secondary`,children:`移除舊設定`})})]}),s.map(e=>(0,f.jsx)(d.Badge,{text:e,variant:`dot-warning`},e))]})}var Z={en:`An unknown error occurred`,"zh-TW":`發生未知錯誤`},Wn={en:`Webhook settings failed the publish check: `,"zh-TW":`Webhook 設定未通過發布檢查:`};function Gn(e,t,n){if(!(e instanceof Error))return Z[t];let r=n?(0,g.readWorkflowLintMessage)(e.message,n,t):e.message;return r.includes(`WORKFLOW_WEBHOOK_`)?`${Wn[t]}${r}`:(0,_.readFormSchemaLintMessage)(r,t)}var Kn=`這個節點前面沒有可以選的簽核關卡,請先在它前面加入簽核節點(沒有進入條件、沒設跳過此關、沒設逾時自動核准,主管鏈也沒設略過)`,qn=`簽核人取自你選的前面關卡實際簽核的人;可複選,整組要涵蓋每條路徑。複選多個關卡時,取最近實際走到的那一關的簽核人,不是全部關卡的簽核人。`,Jn=`起點是你選的前面關卡實際簽核的那一位,從他的主管開始往上簽;只能選每次只會有一位簽核人的關卡。可複選,整組要涵蓋每條路徑,取最近實際走到的那一關的簽核者。`,Yn=`前面的簽核關卡都可能有多位簽核人,所以不能當主管鏈的起點;請改用只有一位簽核人的關卡,或改選其他起點。`,Xn=`(無法使用)`,Zn=`(已不存在)`;function Qn(e){return e.type===`userTask`}function $n(e){return e.data.label||e.id}function er(e,t,n){return nr(e,t,n,()=>!0,()=>[])}function tr(e,t,n){let r=nr(e,t,n,e=>!(0,w.canUserTaskHaveMultipleApprovers)(e),t=>(0,w.readSingleApproverSourceIssues)(e,t));return r.options.length===0&&n.length===0&&er(e,t,[]).options.length>0?{...r,problems:[Yn]}:r}function nr(e,t,n,r,i){let a=e.nodes.filter(Qn).filter(n=>n.id!==t&&(0,w.readNodeActorSourceSkipReasons)(n).length===0&&r(n)&&(0,p.readReachableWorkflowNodeIds)(e.edges,[n.id]).has(t)).map(e=>({id:e.id,name:$n(e)})),o=n.filter(e=>!a.some(t=>t.id===e)).map(t=>{let n=e.nodes.find(e=>e.id===t);return{id:t,name:n?`${$n(n)}${Xn}`:`${t}${Zn}`}}),s=[...a,...o],c=n.flatMap(e=>{let t=s.find(t=>t.id===e);return t?[t]:[]});return{options:s,problems:n.length>0?[...(0,w.readNodeActorSourceIssues)(e,t,n),...i(n)]:s.length===0?[Kn]:[],selected:c}}function rr(e){return e.nodes.filter(Qn).flatMap(t=>{let n=t.data.approverResolver,r=ir(n);return r.length===0?[]:[...(0,w.readNodeActorSourceIssues)(e,t.id,r),...n.type===`ORG_MANAGER_CHAIN`?(0,w.readSingleApproverSourceIssues)(e,r):[]].map(e=>`簽核節點「${$n(t)}」:${e}`)})}function ir(e){return e.type===`NODE_ACTOR`||e.type===`NODE_ACTOR_MANAGER`?e.nodeIds:e.type===`ORG_MANAGER_CHAIN`&&e.startFrom?.type===`NODE_ACTOR`&&Array.isArray(e.startFrom.nodeIds)?e.startFrom.nodeIds:[]}var ar=`此關的簽核人不會是你選的前面關卡實際簽核的人(含其代理人),也不能被轉簽或加簽到此關;可複選,每個關卡都會排除。只能選每條路徑都會經過、而且一定有人實際簽核的關卡(沒有進入條件、沒設跳過此關、沒設逾時自動核准,主管鏈也沒設略過);條件式的關卡、平行分支上的關卡都不支援,條件式的請改用分流把兩關放在同一條路線上,平行分支上的請改成先後串接。`,or=`這個節點前面沒有可以選的簽核關卡,請先在它前面加入簽核節點(每條路徑都會經過、沒有進入條件、沒設跳過此關、沒設逾時自動核准,主管鏈也沒設略過)`;function sr(e,t,n,r){let i=e.nodes.filter(Qn).filter(n=>n.id!==t&&(0,w.readExcludeNodeActorsIssues)(e,t,{nodeIds:[n.id],whenEmpty:`FAIL`}).length===0).map(e=>({id:e.id,name:$n(e)})),a=n.filter(e=>!i.some(t=>t.id===e)).map(t=>{let n=e.nodes.find(e=>e.id===t);return{id:t,name:n?`${$n(n)}${Xn}`:`${t}${Zn}`}}),o=[...i,...a],s=n.flatMap(e=>{let t=o.find(t=>t.id===e);return t?[t]:[]});return{options:o,problems:n.length>0?(0,w.readExcludeNodeActorsIssues)(e,t,{nodeIds:n,whenEmpty:r}):o.length===0?[or]:[],selected:s}}function cr(e){return e.nodes.filter(Qn).flatMap(t=>(0,w.readExcludeNodeActorsIssues)(e,t.id,t.data.excludeNodeActors).map(e=>`簽核節點「${$n(t)}」:${e}`))}var lr=`這個節點前面沒有可以接續的主管鏈關卡;需要是每條路徑都會經過、起點為申請人或前面關卡簽核者、本身不是接續型、沒有進入條件、也沒設跳過此關的「沿主管鏈簽核」關卡。`;function ur(e,t,n){return{...e,nodes:e.nodes.map(e=>{if(e.id!==t||!Qn(e))return e;let{excludeInitiator:r,excludeNodeActors:i,...a}=e.data;return{...e,data:{...a,approverResolver:{minPositionLevel:2**53-1,startFrom:{nodeId:n,type:`CHAIN_CONTINUATION`},type:`ORG_MANAGER_CHAIN`},...r&&r.whenEmpty!==`INITIATOR_MANAGER`?{excludeInitiator:r}:{},...i&&i.whenEmpty!==`INITIATOR_MANAGER`?{excludeNodeActors:i}:{}}}})}}function dr(e,t,n){let r=e.nodes.filter(Qn).filter(n=>n.id!==t&&n.data.approverResolver?.type===`ORG_MANAGER_CHAIN`&&(0,w.readChainContinuationSourceIssues)(ur(e,t,n.id),t).length===0).map(e=>({id:e.id,name:$n(e)})),i=n?.trim()?n:null,a=i===null||r.some(e=>e.id===i)?[]:[(()=>{let t=e.nodes.find(e=>e.id===i);return{id:i,name:t?`${$n(t)}${Xn}`:`${i}${Zn}`}})()],o=[...r,...a];return{options:o,problems:i===null?o.length===0?[lr]:[]:(0,w.readChainContinuationSourceIssues)(e,t),selected:o.find(e=>e.id===i)??null}}function fr(e){return e.nodes.filter(Qn).flatMap(t=>(0,w.readChainContinuationSourceIssues)(e,t.id).map(e=>`簽核節點「${$n(t)}」:${e}`))}function pr(e=new Date,t=p.DEFAULT_BPM_ORGANIZATION_TIME_ZONE){let n=new Map(new Intl.DateTimeFormat(`en-CA`,{day:`2-digit`,month:`2-digit`,timeZone:t,year:`numeric`}).formatToParts(e).map(e=>[e.type,e.value]));return`${n.get(`year`)}-${n.get(`month`)}-${n.get(`day`)}`}function mr(){return pr(new Date,o.n())}function hr(e,t){return e.effectiveFrom<=t&&(!e.effectiveTo||e.effectiveTo>=t)}function gr(e,t){return new Set(e.filter(e=>hr(e,t)).map(e=>e.positionId).filter(e=>!!e))}function _r({date:e,includeDescendants:t,memberships:n,orgUnitId:r,orgUnits:i,positions:a}){let o=new Set(yr(i,r,t)),s=gr(n.filter(e=>o.has(e.orgUnitId)),e);return a.filter(e=>s.has(e.id))}function vr({orgUnitId:e,positionId:t,positions:n,scopedPositions:r}){let i=!!e.trim()&&!!t&&!r.some(e=>e.id===t);return{isInactive:i,options:i?[...r,...n.filter(e=>e.id===t)]:r}}function yr(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]:[]}var br={"initiator.memberId":`發起人會員編號`,"instance.id":`案件編號`,"instance.templateId":`模板編號`,"instance.templateVersionId":`模板版本編號`,"instance.title":`案件主旨`,"node.id":`節點編號`,"node.label":`節點名稱`},xr={boolean:`是/否`,json:`JSON`,number:`數字`,string:`文字`,stringArray:`文字清單`};function Sr(e){return`${e.key}@${e.version}`}function Cr(e,t){return e.find(e=>e.key===t.key&&e.version===t.version)??null}function wr(e){return[`FIELD`,...e===`stringArray`?[]:[`CONSTANT`],...e===`string`||e===`json`?[`CONTEXT`]:[]]}function Tr(e,t){return e.filter(e=>(0,w.isFormFieldCompatibleWithWebhookParameter)(e,t))}function Er(e,t,n){if(e===`FIELD`)return{fieldKey:Tr(n,t.type)[0]?.fieldKey??``,kind:`FIELD`};if(e===`CONTEXT`)return{kind:`CONTEXT`,path:`instance.title`};if(e===`EXPRESSION`){let r=Tr(n,t.type)[0]??n[0];return{expression:r?`form.${r.fieldKey}`:``,kind:e}}return{kind:`CONSTANT`,value:t.type===`boolean`?!0:t.type===`number`?null:``}}function Dr(e,t){return e!==`stringArray`&&!!t?.length}var Or=/^-?\d+(\.\d+)?$/;function kr(e,t){if(e!==`number`)return t;let n=t.trim();return n?Or.test(n)?Number(n):t:null}function Ar(e){return!(0,w.readNotifyWebhookStructureIssues)(e).some(e=>jr.has(e.code))}var jr=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 Mr(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 Nr(e,t,n){return{bindings:e.bindings.filter(r=>{let i=t.parameters.find(e=>e.key===r.parameter);return i!==void 0&&!(0,w.readNotifyWebhookTargetCatalogIssues)({endpoint:{parameters:[{...i,required:!1}]},formFields:n,target:{...e,bindings:[r]}}).length}),endpoint:{key:t.key,version:t.version},id:e.id}}function Pr({definition:e,endpoints:t,formFields:n}){return e.nodes.flatMap(e=>e.type!==`serviceTask`||e.data.action.type!==`NOTIFY`||(0,w.readNotifyWebhookStructureIssues)(e.data.action.webhooks).length?[]:(0,w.readNotifyWebhookTargets)(e.data.action).flatMap((r,i)=>{let a=Cr(t,r.endpoint);return(0,w.readNotifyWebhookTargetCatalogIssues)({endpoint:a,formFields:n,target:r}).map(t=>(0,w.readNotifyWebhookCatalogIssueMessage)({endpointLabel:a?.label??Sr(r.endpoint),issue:t,nodeLabel:e.data.label,targetIndex:i}))}))}var Fr={display:`grid`,gap:`var(--mzn-spacing-gap-base)`},Ir={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)`},Lr={alignItems:`center`,display:`flex`,gap:`var(--mzn-spacing-gap-base)`,justifyContent:`space-between`},Rr={display:`grid`,gap:`var(--mzn-spacing-gap-base)`,gridTemplateColumns:`minmax(0, 2fr) minmax(0, 3fr)`},zr={id:`NONE`,name:`不傳送`},Q={CONSTANT:{id:`CONSTANT`,name:`固定值`},CONTEXT:{id:`CONTEXT`,name:`案件資訊`},EXPRESSION:{id:`EXPRESSION`,name:`運算式`},FIELD:{id:`FIELD`,name:`表單欄位`}},Br=[{id:`true`,name:`是`},{id:`false`,name:`否`}],Vr=w.NOTIFY_WEBHOOK_CONTEXT_PATHS.map(e=>({id:e,name:br[e]})),Hr=`目前沒有可用的 Webhook 端點,請洽 BPM 管理者或系統整合人員新增端點後再設定。`;function Ur({catalog:e,catalogState:t,formFields:n,onChange:r,targets:i}){let a=e.filter(e=>!e.deprecated);if(!i.length&&t===`unavailable`)return null;if(!i.length&&t===`ready`&&!a.length)return(0,f.jsxs)(`div`,{style:Fr,children:[(0,f.jsx)(d.Typography,{variant:`label-primary-highlight`,children:`Webhook`}),(0,f.jsx)(d.InlineMessage,{content:Hr,severity:`info`})]});function o(e,t){r(i.map((n,r)=>r===e?t:n))}function s(){let[e]=a;e&&r([...i,(0,w.createNotifyWebhookTarget)({key:e.key,version:e.version})])}return(0,f.jsxs)(`div`,{style:Fr,children:[(0,f.jsx)(d.Typography,{variant:`label-primary-highlight`,children:`Webhook`}),(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`caption`,children:`知會節點抵達時,將指定的表單欄位或案件資訊送到外部系統。`}),t===`loading`?(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`body`,children:`正在載入可用的 Webhook 端點…`}):null,t===`unavailable`?(0,f.jsx)(d.Typography,{color:`text-error`,variant:`body`,children:`目前無法載入 Webhook 端點,已設定的內容會保留,請稍後重試。`}):null,i.map((s,c)=>(0,f.jsx)(Wr,{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,f.jsx)(`div`,{children:(0,f.jsx)(d.Button,{disabled:t!==`ready`||!a.length||i.length>=w.NOTIFY_WEBHOOK_TARGET_LIMIT,icon:v.PlusIcon,iconType:`leading`,onClick:s,variant:`base-dashed`,children:`新增 Webhook`})}),i.length>=w.NOTIFY_WEBHOOK_TARGET_LIMIT?(0,f.jsxs)(d.Typography,{color:`text-neutral`,variant:`caption`,children:[`每個知會節點最多 `,w.NOTIFY_WEBHOOK_TARGET_LIMIT,` 個 Webhook。`]}):null]})}function Wr({activeEndpoints:e,catalog:t,catalogState:n,formFields:r,index:i,onChange:a,onRemove:o,target:s}){let l=Cr(t,s.endpoint),u=Sr(s.endpoint),p=[...e.map(e=>({id:Sr(e),name:Jr(e)})),...l&&!l.deprecated?[]:[{id:u,name:l?Jr(l):`${u}(找不到端點)`}]],m=new Set((l?.parameters??[]).map(e=>e.key)),h=l?s.bindings.filter(e=>!m.has(e.parameter)):[];return(0,f.jsxs)(`div`,{style:Ir,children:[(0,f.jsxs)(`div`,{style:Lr,children:[(0,f.jsxs)(d.Typography,{variant:`label-primary`,children:[`第 `,i+1,` 個 Webhook`]}),(0,f.jsx)(d.Button,{icon:v.TrashIcon,iconType:`leading`,onClick:o,variant:`destructive-text-link`,children:`移除`})]}),(0,f.jsx)(c.t,{label:`端點`,name:`webhookEndpoint-${s.id}`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,disabled:n!==`ready`,onChange:t=>{let n=e.find(e=>Sr(e)===t?.id);n&&a(Nr(s,n,r??[]))},options:[...p],placeholder:`選擇端點`,value:p.find(e=>e.id===u)??null})}),n===`ready`&&!l?(0,f.jsx)(d.Typography,{color:`text-warning`,variant:`body`,children:`找不到這個端點,設定會保留;請改選其他端點或移除,否則無法發布。`}):null,l?.disabled?(0,f.jsx)(d.Typography,{color:`text-warning`,variant:`body`,children:`這個端點已被管理者停用,不會再送出;設定會保留,請改選其他端點,否則無法發布。`}):l?.deprecated?(0,f.jsx)(d.Typography,{color:`text-warning`,variant:`body`,children:`這個端點不建議再使用,設定會保留;請改選其他端點,否則無法發布。`}):null,l?.description?(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`caption`,children:l.description}):null,l&&!l.parameters.length?(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`caption`,children:`這個端點不需要參數。`}):null,(l?.parameters??[]).map(e=>(0,f.jsx)(Gr,{formFields:r,onChange:t=>a(Mr(s,e.key,t)),parameter:e,source:s.bindings.find(t=>t.parameter===e.key)?.from??null,targetId:s.id},e.key)),h.map(e=>(0,f.jsxs)(`div`,{style:Lr,children:[(0,f.jsxs)(d.Typography,{color:`text-warning`,variant:`body`,children:[`參數「`,e.parameter,`」已不在端點定義中。`]}),(0,f.jsx)(d.Button,{onClick:()=>a(Mr(s,e.parameter,null)),variant:`base-text-link`,children:`移除設定`})]},e.parameter))]})}function Gr({formFields:e,onChange:t,parameter:n,source:r,targetId:i}){let a=r?.kind===`FIELD`||Tr(e??[],n.type).length>0,o=[...n.required?[]:[zr],...wr(n.type).filter(e=>e!==`FIELD`||a).map(e=>Q[e]),...r?.kind===`EXPRESSION`||Dr(n.type,e)?[Q.EXPRESSION]:[]],s=xr[n.type];return(0,f.jsx)(c.t,{hintText:[n.key,s,n.description].filter(Boolean).join(` · `),label:n.label,name:`webhookBinding-${i}-${n.key}`,required:n.required,children:(0,f.jsxs)(`div`,{style:Rr,children:[(0,f.jsx)(d.Select,{clearable:!1,onChange:r=>{let i=Yr(r?.id??null);t(i?Er(i,n,e??[]):null)},options:[...o],placeholder:`選擇來源`,value:r?Q[r.kind]:n.required?null:zr}),r?(0,f.jsx)(Kr,{formFields:e,onChange:t,parameter:n,source:r}):null]})})}function Kr({formFields:e,onChange:t,parameter:n,source:r}){if(r.kind===`FIELD`){if(!e)return(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`caption`,children:`請先綁定表單版本,才能選擇表單欄位。`});let i=Tr(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,f.jsx)(d.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,f.jsx)(d.Select,{clearable:!1,onChange:e=>{(0,w.isNotifyWebhookContextPath)(e?.id)&&t({kind:`CONTEXT`,path:e.id})},options:[...Vr],value:Vr.find(e=>e.id===r.path)??null}):r.kind===`EXPRESSION`?(0,f.jsx)(d.Textarea,{"aria-label":`${n.label}運算式`,onChange:e=>t({expression:e.target.value,kind:`EXPRESSION`}),placeholder:`例如 form.amount * 2(只能讀 form,只能用內建函式)`,resize:`vertical`,rows:2,value:r.expression}):n.type===`boolean`?(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>t({kind:`CONSTANT`,value:e?.id===`true`}),options:[...Br],value:typeof r.value==`boolean`?Br.find(e=>e.id===String(r.value))??null:null}):(0,f.jsx)(qr,{onChange:e=>t({kind:`CONSTANT`,value:e}),type:n.type,value:r.value})}function qr({onChange:e,type:t,value:n}){let[r,i]=(0,u.useState)(n===null?``:String(n));return(0,u.useEffect)(()=>{i(e=>kr(t,e)===n?e:n===null?``:String(n))},[t,n]),(0,f.jsx)(d.Input,{inputProps:{inputMode:t===`number`?`decimal`:void 0},onChange:n=>{i(n.target.value),e(kr(t,n.target.value))},placeholder:t===`number`?`輸入數字`:`輸入固定值`,value:r,variant:`base`})}function Jr(e){let t=[`v${e.version}`,...e.source===`DATABASE`?[`後台維護`]:[],...e.disabled?[`已停用`]:e.deprecated?[`不建議使用`]:[]];return`${e.label}(${t.join(`,`)})`}function Yr(e){return e===`FIELD`||e===`CONSTANT`||e===`CONTEXT`||e===`EXPRESSION`?e:null}function Xr(e){return(e?.fields??[]).reduce((e,t)=>({...e,[t.fieldKey]:$r(t)}),{})}function Zr(e){return`formMember:${e}`}function Qr(e){return`formOrgUnit:${e}`}function $r(e){if(e.type===`number`||e.type===`money`)return 1e3;if(e.type===`boolean`)return!0;if(e.type===`member`){let t=Zr(e.fieldKey);return e.multiple?[t]:t}if(e.type===`org_unit`)return Qr(e.fieldKey);if((0,b.isFormOptionFieldDefinition)(e)){let t=(0,b.isFormStaticOptionFieldDefinition)(e)?e.options[0]?.value:void 0;if((0,b.readFormFieldSelectionMode)(e)===`multiple`)return t===void 0?[]:[t];if((0,b.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 ei={DIRECT:!0,DYNAMIC_FORM:!0,ORG_UNIT_MANAGER:!0,ORG_UNIT_MEMBER:!0,ORG_UNIT_POSITION:!0,POSITION:!0};function ti(e){return Object.prototype.hasOwnProperty.call(ei,e)}var ni=Te.filter(e=>ti(e.id)),ri=`READ_ONLY`;function ii(e){switch(e){case`ORG_MANAGER`:return`發起人主管`;case`ORG_MANAGER_CHAIN`:return`主管鏈(簽到指定職等)`;case`EXPRESSION`:return`運算式`;default:return e}}var ai=`這種知會來源只能在範本 JSON 設定;這裡選擇其他來源會覆寫原設定。`,oi=`知會節點不支援這種來源,儲存前必須改選其他來源;這裡選擇其他來源會覆寫原設定。`,si={memberIds:[],type:`DIRECT`};function ci(e){return e.type===`NOTIFY`&&e.recipients?.type?e.recipients:si}function li(e){let t=ni.find(t=>t.id===e.type);if(t)return{hint:null,options:ni,readOnly:!1,selected:t};let n=(0,T.isNotifyRecipientResolverType)(e.type),r={id:ri,name:n?ii(e.type):`不支援的知會來源(${e.type})`};return{hint:n?ai:oi,options:[...ni,r],readOnly:!0,selected:r}}function ui(e,t,n){return t===null||!ti(t)||t===e.type?null:z(t,n)}function di(e,t){return e.type===`NOTIFY`?{...e,recipients:t}:{channels:[`IN_APP`],recipients:t,type:`NOTIFY`}}function fi(e){return e.includeDescendants===void 0?{}:{includeDescendants:e.includeDescendants}}function pi(e,t){if(e.type===`ORG_UNIT_MEMBER`)return{...fi(e),orgUnitId:t,type:`ORG_UNIT_MEMBER`};if(e.type===`ORG_UNIT_POSITION`)return{...fi(e),orgUnitId:t,positionId:``,type:`ORG_UNIT_POSITION`};if(e.type===`ORG_UNIT_MANAGER`){let n=We(e);return n.mode===`ORG_UNIT_MANAGER`?Ge({...n,orgUnitId:t}):e}return e}function mi(e,t){return e.type===`ORG_UNIT_MEMBER`?{...e,includeDescendants:t}:e.type===`ORG_UNIT_POSITION`?{...e,includeDescendants:t,positionId:``}:e}function hi(e,t){return e.type===`POSITION`?{positionId:t,type:`POSITION`}:e.type===`ORG_UNIT_POSITION`?{...e,positionId:t}:e}function gi(e,t){if(e.type!==`DYNAMIC_FORM`)return e;let n=We(e);return n.mode===`DYNAMIC_FORM`?Ge({...n,formPath:t}):e}var _i={display:`grid`,gap:`var(--mzn-spacing-gap-base)`};function vi(e){return e.startsWith(`ok:`)?`結果 ${e.slice(3)}`:e.startsWith(`err:`)?`錯誤 ${e.slice(4)}`:e}var yi={EMPTY:`欄位都沒填`,FILLED:`欄位都有值`};function bi(e){return e!==null&&e.complete}function xi({draft:e,onCancel:t,onConfirm:n,open:r,preview:i=g.previewWorkflowDialectUpgrade}){let[a,o]=(0,u.useState)(null),[s,c]=(0,u.useState)(!1);return(0,u.useEffect)(()=>{let t=!1;return o(null),c(!1),r&&i(e).then(e=>{t||o(e)}).catch(()=>{t||c(!0)}),()=>{t=!0}},[r]),(0,f.jsx)(d.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!bi(a)},confirmText:`確認升級`,loading:r&&a===null&&!s,modalType:`standard`,onCancel:t,onClose:t,onConfirm:n,open:r,showModalFooter:!0,showModalHeader:!0,size:`wide`,supportingText:`升級只改這份草稿,儲存並發布後才會影響新案件;已發布的版本維持原本的方言。`,title:`升級運算式方言到 cel-v2`,children:(0,f.jsxs)(`div`,{style:_i,children:[s?(0,f.jsx)(d.InlineMessage,{content:`無法完成升級前的比對,請稍後再試。`,severity:`error`}):null,a===null?null:(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(d.Typography,{variant:`body`,children:`共 ${a.expressionCount} 個運算式,已比對 ${a.checkedCount} 個;${a.differences.length===0?`兩種方言的結果都相同。`:`${a.differences.length} 處結果不同,請逐一確認。`}`}),a.complete?null:(0,f.jsx)(d.InlineMessage,{content:`比對逾時、沒有全部完成,不能據此升級。`,severity:`error`}),a.differences.length>0?(0,f.jsx)(d.Table,{columns:[{ellipsis:!1,key:`label`,render:({difference:t})=>(0,g.readExpressionLabelLocation)(t.label,e.workflowDefinition)??t.label,title:`位置`},{key:`sample`,render:({difference:e})=>yi[e.sample]??e.sample,title:`試算資料`,width:120},{ellipsis:!1,key:`legacy`,render:({difference:e})=>vi(e.legacyOutcome),title:`目前(cel-legacy)`},{ellipsis:!1,key:`v2`,render:({difference:e})=>vi(e.v2Outcome),title:`升級後(cel-v2)`}],dataSource:a.differences.map((e,t)=>({difference:e,key:`${e.label}:${e.sample}:${t}`})),fullWidth:!0}):null,a.v2Issues.map((t,n)=>(0,f.jsx)(d.InlineMessage,{content:(0,g.readExpressionIssueMessage)(t,e.workflowDefinition),severity:t.severity===`ERROR`?`error`:`warning`},`${t.label}:${t.code}:${n}`))]})]})})}var Si={preview:g.previewExpression,readCatalog:g.readExpressionCatalog},Ci={display:`grid`,gap:`var(--mzn-spacing-gap-base)`,gridTemplateColumns:`minmax(0, 1fr)`,minWidth:0},wi={display:`grid`,gap:`var(--mzn-spacing-gap-tight)`,gridTemplateColumns:`minmax(0, 1fr)`,minWidth:0,overflowWrap:`anywhere`},Ti={alignItems:`center`,display:`flex`,flexWrap:`wrap`,gap:`var(--mzn-spacing-gap-base)`,minWidth:0};function Ei(e){return e?[...e.roots.map(e=>({id:e,name:`${e}(根)`})),...e.fields.map(e=>({id:e.path,name:`${e.path}(${e.label})`})),...e.functions.map(e=>({id:`${e.name}(`,name:`${e.name}(${e.parameters.map(e=>e.name).join(`, `)})${e.label?`(${e.label})`:``}`}))]:[]}function Di(e){return e?e.functions.filter(e=>e.description.trim().length>0).map(e=>({id:e.name,text:`${e.name}${e.label?`(${e.label})`:``}:${e.description.trim()}`})):[]}function Oi(e,t){return e.length===0||/[\s(]$/u.test(e)?`${e}${t}`:`${e} ${t}`}function ki(e){switch(e){case`CHECKING`:return`後端檢查中`;case`INVALID`:return`未通過檢查`;case`UNAVAILABLE`:return`無法檢查`;case`VALID`:return`通過檢查`;default:return null}}var Ai={CHECKING:`dot-info`,INVALID:`dot-error`,UNAVAILABLE:`dot-warning`,VALID:`dot-success`};function ji(e){try{let t=JSON.parse(e);return typeof t!=`object`||!t||Array.isArray(t)?`樣本資料必須是 JSON 物件,例如 { "form": { "amount": 1200 } }。`:t}catch{return`樣本資料不是有效的 JSON。`}}function Mi(e){return e.outcome===`ERROR`?`試算失敗(${e.errorCode??`未知錯誤`})`:`試算結果:${e.resultJson??`null`}${e.resultType?`(${e.resultType})`:``}`}function Ni({api:e=Si,debounceMs:t=400,dialect:n,disabled:r=!1,edgeSourceNodeType:i=null,evaluable:a=!1,formDefinitionVersionId:o=null,hintText:s,label:l,name:p,onChange:m,onLintChange:h,required:_=!1,rows:v=3,targetFieldKey:y=null,usagePoint:b,value:x}){let[S,C]=(0,u.useState)({issues:[],status:`EMPTY`}),[w,T]=(0,u.useState)(null),[E,D]=(0,u.useState)(`{
|
|
18
|
+
"form": {}
|
|
19
|
+
}`),[ee,O]=(0,u.useState)(null),[te,k]=(0,u.useState)(!1),ne=(0,u.useRef)(h);ne.current=h,(0,u.useEffect)(()=>{let t=new AbortController;return e.readCatalog({formDefinitionVersionId:o,usagePoint:b},{signal:t.signal}).then(e=>T(e)).catch(()=>{t.signal.aborted||T(null)}),()=>t.abort()},[e,o,b]),(0,u.useEffect)(()=>{let r=x.trim(),a=e=>{C(e),ne.current?.(e)};if(O(null),r.length===0)return a({issues:[],status:`EMPTY`}),()=>void 0;a({issues:[],status:`CHECKING`});let s=new AbortController,c=setTimeout(()=>{e.preview({dialect:n,edgeSourceNodeType:i,expression:r,formDefinitionVersionId:o,mode:`LINT`,targetFieldKey:y,usagePoint:b},{signal:s.signal}).then(e=>a({issues:e.issues,status:e.valid?`VALID`:`INVALID`})).catch(()=>{s.signal.aborted||a({issues:[],status:`UNAVAILABLE`})})},t);return()=>{clearTimeout(c),s.abort()}},[e,t,n,i,o,y,b,x]);let re=(0,u.useMemo)(()=>Ei(w),[w]),ie=(0,u.useMemo)(()=>Di(w),[w]),ae=ki(S.status),oe=async()=>{let t=ji(E);if(typeof t==`string`)O(t);else{k(!0);try{let r=await e.preview({dialect:n,edgeSourceNodeType:i,expression:x.trim(),formDefinitionVersionId:o,mode:`EVALUATE`,sampleContext:t,targetFieldKey:y,usagePoint:b});O(r.evaluation?Mi(r.evaluation):`運算式未通過檢查,沒有試算。`)}catch{O(`無法試算,請稍後再試。`)}finally{k(!1)}}};return(0,f.jsx)(c.t,{hintText:s,label:l,name:p,required:_,severity:S.status===`INVALID`?`error`:`info`,children:(0,f.jsxs)(`div`,{style:Ci,children:[(0,f.jsx)(d.Textarea,{disabled:r,name:p,onChange:e=>m(e.target.value),resize:`vertical`,rows:v,value:x}),(0,f.jsxs)(`div`,{style:Ti,children:[ae&&S.status!==`EMPTY`?(0,f.jsx)(d.Badge,{text:ae,variant:Ai[S.status]}):null,w&&!w.functionsAvailable?(0,f.jsx)(d.Typography,{variant:`caption`,children:`宿主函式目錄暫時讀不到,只列出欄位。`}):null]}),re.length>0&&!r?(0,f.jsx)(d.Select,{clearable:!1,fullWidth:!0,onChange:e=>{e&&m(Oi(x,e.id))},options:[...re],placeholder:`插入欄位或函式`,value:null}):null,ie.length>0&&!r?(0,f.jsx)(`div`,{"aria-label":`函式說明`,role:`list`,style:wi,children:ie.map(e=>(0,f.jsx)(d.Typography,{color:`text-neutral`,role:`listitem`,variant:`caption`,children:e.text},e.id))}):null,S.status===`UNAVAILABLE`?(0,f.jsx)(d.InlineMessage,{content:`無法向後端檢查這個運算式,發布時仍會再檢查。`,severity:`warning`}):null,S.issues.map(e=>(0,f.jsx)(d.InlineMessage,{content:(0,g.readExpressionIssueMessage)(e),severity:e.severity===`ERROR`?`error`:`warning`},`${e.code}:${e.subject??``}`)),a?(0,f.jsxs)(`div`,{style:Ci,children:[(0,f.jsx)(d.Textarea,{"aria-label":`${l}試算樣本`,disabled:r,onChange:e=>D(e.target.value),resize:`vertical`,rows:3,value:E}),(0,f.jsxs)(`div`,{style:Ti,children:[(0,f.jsx)(d.Button,{disabled:r||te||S.status!==`VALID`,onClick:()=>{oe()},type:`button`,variant:`base-secondary`,children:`以樣本試算`}),ee===null?null:(0,f.jsx)(d.Typography,{variant:`body`,children:ee})]})]}):null]})})}function Pi(e,t,n=g.analyzeWorkflowExpressions,r=800){let[i,a]=(0,u.useState)(null),o=JSON.stringify(e),s=(0,u.useRef)({analysis:i,draft:e,key:o});s.current={analysis:i,draft:e,key:o},(0,u.useEffect)(()=>{if(!t)return()=>void 0;let i=new AbortController,s=setTimeout(()=>{n(e,{signal:i.signal}).then(e=>a({key:o,record:e})).catch(()=>void 0)},r);return()=>{clearTimeout(s),i.abort()}},[n,r,t,o]);let c=(0,u.useMemo)(()=>(0,g.readExpressionFieldReferences)(i?.record??null),[i]),l=(0,u.useCallback)(async()=>{let e=s.current;if(e.analysis!==null&&e.analysis.key===e.key)return(0,g.readExpressionFieldReferences)(e.analysis.record);try{let t=await n(e.draft);return a({key:e.key,record:t}),(0,g.readExpressionFieldReferences)(t)}catch{return null}},[n]);return{analysis:i?.record??null,references:c,resolveCurrentReferences:l}}var Fi={preview:e=>(0,g.previewExpression)(e),readCatalog:g.readExpressionCatalog},Ii=(e,t)=>({dialect:t.dialect,edgeSourceNodeType:t.edgeSourceNodeType,expression:t.expression,formDefinitionVersionId:e.formDefinitionVersionId,targetFieldKey:t.targetFieldKey,usagePoint:t.usagePoint});function Li(e,t=Fi){return{catalog:n=>t.readCatalog({formDefinitionVersionId:e.formDefinitionVersionId,usagePoint:n}),evaluate:async(n,r)=>(await t.preview({...Ii(e,n),mode:`EVALUATE`,sampleContext:r})).evaluation,lint:async n=>(await t.preview({...Ii(e,n),mode:`LINT`})).issues.map(t=>({code:t.code,message:(0,g.readExpressionIssueMessage)(t,e.definition),severity:t.severity}))}}function Ri(e){return e.type===`userTask`||e.type===`serviceTask`}function zi(e,t,n){return{...e,nodes:e.nodes.map(e=>{if(e.id!==t||!Ri(e))return e;let r=Object.fromEntries(Object.entries(e.data).filter(([e])=>e!==`entryCondition`));return{...e,data:n.trim()?{...r,entryCondition:n}:r}})}}function Bi(e){return!!e.data.condition?.trim()&&!e.data.conditionFieldKey}function Vi(e,t,n){return{...e,edges:e.edges.map(e=>e.id===t?{...e,data:{condition:n,isDefault:!1,label:`自訂條件`}}:e)}}function Hi(e,t){let n=e.edges.find(e=>e.id===t);return e.nodes.find(e=>e.id===n?.source)?.type??null}function Ui(e,t,n){let r=new Set(t);return e.filter(e=>!r.has(e)).map(e=>({fieldKey:e,labels:n.get(e)??[]})).filter(e=>e.labels.length>0)}async function Wi(e,t,n){let r=new Set(t),i=e.filter(e=>!r.has(e));if(i.length===0)return{kind:`allowed`};let a=await n();if(a===null)return{kind:`unverified`,fieldKeys:i};let o=Ui(e,t,a);return o.length>0?{kind:`blocked`,fields:o}:{kind:`allowed`}}var Gi={1:`直屬主管`,2:`第二層主管`,3:`第三層主管`};function Ki(e){return Gi[e]??`第 ${e} 層主管`}function qi(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=>t.nodes.find(t=>t.id===e)?.name??e,c=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])}」選的人(送出時依填寫內容決定)`;let l=(0,T.parseOrgManagerChainPlaceholder)(e);if(l){let e=l.startFrom?.type===`FORM_MEMBER`?`從表單欄位「${o(l.startFrom.formPath)}」的主管起算,`:l.startFrom?.type===`NODE_ACTOR`?`從前面關卡「${c(l.startFrom.nodeIds.join(`,`))}」簽核者的主管起算,`:l.startFrom?.type===`CHAIN_CONTINUATION`?`接續「${s(l.startFrom.nodeId)}」往上;若前一段已簽到此職等則略過,`:``,t=l.startPositionLevel===null?``:`(從職等 ${l.startPositionLevel} 開始)`,n=l.skipWhenStartReached?`(起點本人已達簽到職等時略過此關)`:``;return`主管鏈:${e}簽到職等 ${l.minPositionLevel}${t}(送出時依組織決定實際主管)${n}`}if(n===`orgManagerChain`&&r.length===1&&r[0])return`主管鏈:簽到職等 ${r[0]}(送出時依組織決定實際主管)`;let u=r.join(`:`),d=u.lastIndexOf(`:`),f=d>0?u.slice(0,d):``,p=d>0?Number(u.slice(d+1)):NaN,m=f!==``&&Number.isInteger(p)&&p>=1;return n===`formMemberManager`&&m?`表單欄位「${o(f)}」選的人的${Ki(p)}(送出時依填寫內容與組織決定)`:n===`formOrgUnitManager`&&u?`表單欄位「${o(u)}」所選組織的主管(送出時依填寫內容決定)`:n===`nodeActor`&&u?`前面關卡「${c(u)}」的簽核者(送出時依實際簽核者決定)`:n===`nodeActorManager`&&m?`前面關卡「${c(f)}」簽核者的${Ki(p)}(送出時依實際簽核者決定)`:t.memberName(e)??e}function Ji(e){return`${e.draftVersion===null?`尚未建立草稿`:`草稿 v${e.draftVersion}`} · ${e.publishedVersion===null?e.hasPublishedVersion?`已發布版本`:`尚未發布`:`已發布 v${e.publishedVersion}`}`}function Yi(e,t){return`${e} · 運算式方言 ${t}`}function Xi(e,t){return`表單:${e} v${t}`}function Zi(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function Qi(e){return typeof e==`string`?e===``?[]:[e]:typeof e==`number`||typeof e==`boolean`?[String(e)]:e!==void 0&&Zi(e)?e.filter(e=>e!==``):[]}async function $i(e){let t=e.schema.fields.flatMap(e=>{if(!(0,b.isFormOptionFieldDefinition)(e)||e.dataSource===void 0)return[];let t=e.dataSource.bindings.some(e=>e.from.kind!==`CONSTANT`),n=Qi(e.defaultValue);return t||n.length===0?[]:[{field:e,values:n}]});return(await Promise.all(t.map(async({field:t,values:n})=>{try{let r=await e.preview({fieldKey:t.fieldKey,schema:e.schema,uiSchema:e.uiSchema,values:n}),i=n.filter(e=>r.unresolvedValues.includes(e));return i.length>0?[{fieldKey:t.fieldKey,label:t.label,status:`UNRESOLVED`,values:i}]:[]}catch{return[{fieldKey:t.fieldKey,label:t.label,status:`CHECK_FAILED`,values:[]}]}}))).flat()}function ea(e){return e.status===`UNRESOLVED`?`欄位「${e.label}」的預設值「${e.values.join(`、`)}」已不在目前的選項來源中,使用者送出前需要重新選擇;建議移除或改用其他預設值。`:`欄位「${e.label}」的預設值未能檢查(選項來源查詢失敗),發佈已完成,但尚未確認此預設值是否仍有效。`}var ta=`這個組織範圍內目前沒有擁有此職位的有效會員,請改選其他職位。`,na={display:`grid`,gap:16},ra={alignItems:`start`,display:`grid`,gap:16,gridTemplateColumns:`minmax(0, 1fr) 420px`},ia={border:`1px solid var(--mzn-color-border-neutral)`,borderRadius:6,height:620,minWidth:0,overflow:`hidden`},aa={alignItems:`center`,boxSizing:`border-box`,color:`var(--mzn-color-text-error)`,display:`flex`,height:26,justifyContent:`center`,lineHeight:0,padding:0,width:26},oa={alignItems:`center`,display:`flex`,height:`100%`,justifyContent:`center`,width:`100%`},sa=`workflow-designer-side-panel`,ca=96,la=`
|
|
20
|
+
.${sa} .mzn-form-field--stretch .mzn-form-field__label-area,
|
|
21
|
+
.${sa} .mzn-form-field--horizontal .mzn-form-field__label-area {
|
|
22
|
+
flex: 0 0 ${ca}px;
|
|
23
|
+
width: ${ca}px;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.${sa} .mzn-form-field--stretch .mzn-form-field__data-entry,
|
|
27
|
+
.${sa} .mzn-form-field--horizontal .mzn-form-field__data-entry {
|
|
28
|
+
min-width: 0;
|
|
29
|
+
}
|
|
30
|
+
`,ua=`#2563eb`,da=`#64748b`,fa=`var(--mzn-color-text-error, #dc2626)`,pa=`drop-shadow(0 0 3px rgba(0, 87, 255, 0.85)) drop-shadow(0 0 9px rgba(0, 87, 255, 0.36))`,ma=`
|
|
31
|
+
.workflow-selection-delete-control.react-flow__controls-button {
|
|
32
|
+
align-items: center !important;
|
|
33
|
+
display: flex !important;
|
|
34
|
+
height: 26px !important;
|
|
35
|
+
justify-content: center !important;
|
|
36
|
+
padding: 0 !important;
|
|
37
|
+
width: 26px !important;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.workflow-selection-delete-control .mzn-icon {
|
|
41
|
+
align-items: center;
|
|
42
|
+
display: flex;
|
|
43
|
+
justify-content: center;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.workflow-selection-delete-control .mzn-icon svg {
|
|
47
|
+
height: 16px !important;
|
|
48
|
+
max-height: none !important;
|
|
49
|
+
max-width: none !important;
|
|
50
|
+
width: 16px !important;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.workflow-edge--selected .react-flow__edge-path,
|
|
54
|
+
.react-flow__edge-path.workflow-edge--selected {
|
|
55
|
+
filter: ${pa};
|
|
56
|
+
opacity: 1 !important;
|
|
57
|
+
stroke: ${da} !important;
|
|
58
|
+
stroke-opacity: 1 !important;
|
|
59
|
+
stroke-width: 1.5px !important;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.workflow-edge--selected {
|
|
63
|
+
--xy-edge-stroke: ${da};
|
|
64
|
+
--xy-edge-stroke-selected: ${da};
|
|
65
|
+
--xy-edge-stroke-width: 1.5px;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
`,ha={display:`grid`,gap:12,gridTemplateColumns:`minmax(0, 1fr)`,minWidth:0},ga={display:`grid`,gap:12,gridTemplateColumns:`minmax(0, 1fr)`,minWidth:0},_a={border:`1px solid var(--mzn-color-border-neutral)`,borderRadius:6,display:`grid`,gap:8,maxHeight:360,overflow:`auto`,padding:12},va={borderBottom:`1px solid var(--mzn-color-border-neutral)`,display:`grid`,gap:4,padding:`0 0 8px`},ya={display:`flex`,flexWrap:`wrap`,gap:8},ba={alignItems:`center`,display:`flex`,gap:8},xa={flex:`1 1 auto`,minWidth:0},Sa={flex:`0 0 auto`},Ca={display:`grid`,gap:8},wa={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%`},Ta=`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)`,Ea=64,Da=160,Oa=20,ka=24,Aa=`先綁定表單版本,才能設定欄位在各關的顯示與補填。`,ja=64,Ma=180,Na={...wa,display:`grid`,gap:8,padding:`10px 12px`},Pa={...Na,background:`#eff6ff`,border:`1px solid #2563eb`},Fa={...Na,background:`#f0fdfa`,border:`1px solid #0f766e`},Ia={...wa,background:`#ffffff`},La={...wa,background:`#ecfdf3`,border:`1px solid #2f855a`},Ra={...wa,background:`#fff4ed`,border:`1px solid #c2410c`},za={display:`block`,maxWidth:`100%`,minWidth:0},Ba={display:`grid`,gap:2,minWidth:0},Va=`input`,Ha=`output`,Ua={endEvent:`結束`,exclusiveGateway:`條件分流`,parallelGateway:`並行處理`,serviceTask:`系統`,startEvent:`開始`,userTask:`簽核`},Wa=[{icon:v.UserIcon,label:`簽核節點`,type:`userTask`},{icon:v.MailIcon,label:`知會節點`,type:`serviceTask`}],Ga=[{icon:v.FilterIcon,label:`條件分流`,type:`exclusiveGateway`}],Ka=[{id:`AND`,name:`全部前置完成`},{id:`OR`,name:`任一前置完成`}],qa=[{id:`INITIATOR`,name:`退回申請人`},{id:`PREVIOUS`,name:`退回上一個節點`},{id:`ANY`,name:`由簽核者選擇(申請人或之前的簽核節點)`}],Ja=[{id:`RESTART`,name:`重新送出後從開始重跑`},{id:`FROM_RETURN_POINT`,name:`重新送出後回到退回節點`}],Ya=[{id:`NONE`,name:`不提醒`,value:null},{id:`0.5`,name:`過半時提醒`,value:.5},{id:`0.75`,name:`剩四分之一時提醒`,value:.75},{id:`0.9`,name:`剩十分之一時提醒`,value:.9}],Xa=[{id:`COUNT`,name:`人數`},{id:`PERCENTAGE`,name:`百分比`}],Za=[{id:`NONE`,name:`停止流程並提示`},{id:`DIRECT`,name:`固定改派`},{id:`POSITION`,name:`指定職位`}],Qa={id:`UNSUPPORTED`,name:`不支援的備援設定`},$a=[{id:`INITIATOR_MANAGER`,name:`改由申請人的直屬主管簽核`},{id:`SKIP_NODE`,name:`跳過此關`},{id:`FAIL`,name:`停止流程並提示`}],eo=`往上可能簽到申請人本人;若不允許,請開啟「申請人不可簽核自己的單」。`,to=`「改由申請人的直屬主管簽核」是申請人的主管,不是主管鏈起點那一位的主管。`,no={whenEmpty:`INITIATOR_MANAGER`},ro={nodeIds:[],whenEmpty:`FAIL`},io=[`EQUALS`,`GREATER_THAN`,`GREATER_THAN_OR_EQUALS`,`LESS_THAN`,`LESS_THAN_OR_EQUALS`,`NOT_EQUALS`],ao=[{id:`NONE`,name:`未設定`},{id:`ALL`,name:`所有人`},{id:`ORG_UNIT`,name:`指定組織`},{id:`ORG_UNIT_POSITION`,name:`指定組織職位`}],oo={id:`CUSTOM`,name:`自訂運算式`},so=[{id:`NOTIFY`,name:`知會`},{id:`SET_FORM_FIELD`,name:`寫入表單欄位`}],co=`member-001`,lo={whiteSpace:`pre-line`},uo={display:`flex`,flexDirection:`column`,height:`100%`},fo={flex:1,minHeight:0,overflowY:`auto`},po={borderTop:`1px solid var(--mzn-color-border-neutral)`,display:`flex`,gap:8,paddingTop:12},mo={fields:[],schemaVersion:1},ho={layout:[],schemaVersion:1},go={endEvent:bo,exclusiveGateway:bo,parallelGateway:bo,serviceTask:bo,startEvent:bo,userTask:bo};function _o(e,t){return typeof e==`function`?e(t):e}function vo({aiAssistantAvailable:e=!0,embedded:t=!1,formSchemaOverride:r,initialInitiatorPolicyCel:y,initialLaunchMode:b,initialWorkflowDefinition:C,onInitiatorPolicyChange:E,onLaunchModeChange:D,onWorkflowChange:ie,showAiAssistant:ae=!1,showDryRun:oe=!0,templateId:se}){let ce=n.r(),A=a.r(),j=o.o(),le=mr(),[M,N]=(0,u.useState)(null),[P,ue]=(0,u.useState)(null),[de,fe]=(0,u.useState)(``),[pe,me]=(0,u.useState)(null),[F,ge]=(0,u.useState)(null),[ve,be]=(0,u.useState)(!1),[xe,Se]=(0,u.useState)(null),Ce=(0,u.useRef)(null),[we,Te]=(0,u.useState)(void 0),De=(0,u.useRef)([]),Oe=(0,u.useRef)([]),I=zt({directory:(0,u.useMemo)(()=>({listOrgUnits:async()=>De.current.map(e=>({id:e.id,name:e.name})),listPositions:async()=>Oe.current.map(e=>({id:e.id,name:e.name})),searchMembers:async e=>Ts(await(0,g.searchMemberOptions)(e)).map(e=>({email:e.email,id:e.memberId,name:e.name}))}),[]),expressionTools:Li,initialState:{definition:t&&C!=null?Mo(C):Lo(),editingEdgeId:null,formDefinitionVersionId:null,formSchema:null,initiatorPolicyCel:t&&y!==void 0?y:null,selectedEdgeIds:[],selectedNodeId:t&&C!=null?C.nodes[0]?.id??`start`:`start`},layout:zo,onLayout:e=>{let t=Is(e,Ce.current);t&&Te(t)}}),L=I.state.definition,R=I.state.formDefinitionVersionId,z=I.state.initiatorPolicyCel,B=L.expressionDialect===`cel-v2`?`cel-v2`:`cel-legacy`,Ne=I.state.selectedNodeId,V=I.state.selectedEdgeIds,Fe=I.state.editingEdgeId,Ie=e=>I.replaceState(t=>({...t,definition:_o(e,t.definition)})),Le=e=>I.replaceState(t=>({...t,formDefinitionVersionId:_o(e,t.formDefinitionVersionId)})),He=e=>I.replaceState(t=>({...t,initiatorPolicyCel:_o(e,t.initiatorPolicyCel)})),Ue=e=>I.replaceState(t=>({...t,definition:e(t.definition)})),H=e=>I.replaceState(t=>({...t,selectedNodeId:_o(e,t.selectedNodeId)})),Ke=e=>I.replaceState(t=>({...t,selectedEdgeIds:_o(e,t.selectedEdgeIds)})),Je=e=>I.replaceState(t=>({...t,editingEdgeId:_o(e,t.editingEdgeId)})),[Ye,U]=(0,u.useState)(null),[nt,rt]=(0,u.useState)([]),[it,at]=(0,u.useState)(null);(0,u.useEffect)(()=>{at(null)},[Ne]);let[ot,st]=(0,u.useState)(()=>t?te(b):O),[ct,ut]=(0,u.useState)(!0),[dt,pt]=(0,u.useState)(!1),[ht,gt]=(0,u.useState)(!1),[_t,Dt]=(0,u.useState)([]),Mt=(0,u.useMemo)(()=>JSON.stringify({formDefinitionVersionId:R,initiatorPolicyCel:z,launchMode:ot,workflowDefinition:L}),[R,z,ot,L]),Nt=!!de&&Mt!==de,[Ft,Bt]=(0,u.useState)(!1),[W,Vt]=(0,u.useState)([]),[Ht,Ut]=(0,u.useState)([]),Wt=(0,u.useRef)(0),Gt=(0,u.useRef)(0),Kt=(0,u.useRef)(new Set),[G,qt]=(0,u.useState)([]),[K,Jt]=(0,u.useState)([]),[Yt,Xt]=(0,u.useState)([]);De.current=G,Oe.current=K;let[Zt,Qt]=(0,u.useState)(!1),[$t,en]=(0,u.useState)(!1),[tn,nn]=(0,u.useState)(!1),[an,on]=(0,u.useState)(!1),[sn,cn]=(0,u.useState)(`{}`),[ln,un]=(0,u.useState)(null),[dn,fn]=(0,u.useState)(null),[pn,mn]=(0,u.useState)([]),[hn,gn]=(0,u.useState)(`loading`),[_n,vn]=(0,u.useState)(!1),[yn,bn]=(0,u.useState)(!1),[xn,Sn]=(0,u.useState)(null),[Cn,wn]=(0,u.useState)(null),Tn=Cn!==null,[En,Dn]=(0,u.useState)(!1),[q,On]=(0,u.useState)(!1),kn=Nt||Tn?`保存並發布`:P?`發布草稿`:`已發布`;(0,u.useEffect)(()=>{t?hr():yr()},[t,se]),(0,u.useEffect)(()=>{function e(e){Nt&&(e.preventDefault(),e.returnValue=``)}return window.addEventListener(`beforeunload`,e),()=>{window.removeEventListener(`beforeunload`,e)}},[Nt]),(0,u.useEffect)(()=>{Sr(L)},[L,W]),(0,u.useEffect)(()=>{Ie(e=>Mo(e))},[L.edges,L.nodes]);function An(){(!Nt||window.confirm(`目前有尚未儲存的流程草稿,確定要離開嗎?`))&&ce.push(A.templates())}let J=(0,u.useMemo)(()=>L.nodes.find(e=>e.id===Ne)??null,[Ne,L.nodes]),jn=J?ms(J):!1,Mn=V.length>0||jn,Nn=(0,u.useCallback)(()=>{I.getState().selectedEdgeIds.forEach(e=>I.dispatch({edgeId:e,type:`deleteEdge`})),J&&ms(J)&&I.dispatch({nodeId:J.id,type:`deleteNode`})},[I,J]);(0,u.useEffect)(()=>{if(!Mn)return;function e(e){e.key!==`Delete`&&e.key!==`Backspace`||vs(e.target)||(e.preventDefault(),Nn())}return window.addEventListener(`keydown`,e),()=>{window.removeEventListener(`keydown`,e)}},[Mn,Nn]);let Pn=(0,u.useMemo)(()=>L.edges.find(e=>e.id===Fe)??null,[Fe,L.edges]),Fn=(0,u.useMemo)(()=>V.length===1?L.edges.find(e=>e.id===V[0])??null:null,[V,L.edges]),In=(0,u.useMemo)(()=>V.map(e=>L.edges.find(t=>t.id===e)??null).filter(e=>!!e),[V,L.edges]),Y=(0,u.useMemo)(()=>ve?{mode:`CUSTOM`,value:z??``}:F??os(z,pe),[z,ve,F,pe]),Ln=(0,u.useMemo)(()=>L.edges.map(e=>Ao(e,L.nodes,V.includes(e.id))),[V,L.edges,L.nodes]),X=(0,u.useMemo)(()=>$(_t,R)??$(ys(M?.formVersions??[]),R),[R,_t,M?.formVersions]),Rn=(0,u.useMemo)(()=>ws(_t,X),[_t,X]),zn=X?.schema??null,Vn=t?r??null:zn;(0,u.useEffect)(()=>{I.getState().formSchema!==Vn&&I.replaceState(e=>({...e,formSchema:Vn}))},[I,Vn]);let Hn=(0,u.useMemo)(()=>Ls(L),[L]);(0,u.useEffect)(()=>{let e=!0;return(0,g.listWorkflowWebhookEndpoints)({includeDeprecated:!0}).then(t=>{e&&(mn(t),gn(`ready`))}).catch(()=>{e&&gn(`unavailable`)}),()=>{e=!1}},[]);let Z=Cn?.schema??Vn,{references:Wn,resolveCurrentReferences:Kn}=Pi({formDefinitionVersionId:R,initiatorPolicyCel:z,workflowDefinition:L},!t&&!ct),[Yn,Xn]=(0,u.useState)(null),Zn=(0,u.useMemo)(()=>hn===`ready`?Pr({definition:L,endpoints:pn,formFields:Z?.fields??[]})[0]??null:null,[pn,hn,Z,L]),Qn=(0,u.useMemo)(()=>{let[e]=(0,p.readFieldAccessMatrix)(L,Z).issues;return e?(0,g.readWorkflowLintMessage)(e.message,L,j):null},[j,Z,L]),$n=(0,u.useMemo)(()=>rr(L)[0]??null,[L]),nr=(0,u.useMemo)(()=>cr(L)[0]??null,[L]),ir=(0,u.useMemo)(()=>fr(L)[0]??null,[L]),or=Zn??Qn??$n??nr??ir,lr=(0,u.useMemo)(()=>{let e=L.nodes.map(e=>({id:e.id,name:e.data.label||e.id}));return L.nodes.map(t=>To(t,W,G,K,t.id===Ne,Y,Z,e))},[Y,W,G,K,Ne,Z,L.nodes]),ur=(0,u.useMemo)(()=>(0,w.hasConfiguredConditionEdges)(L),[L]),pr=(0,u.useMemo)(()=>ss(Y),[Y]);(0,u.useEffect)(()=>{t&&ie?.(L)},[t,L]),(0,u.useEffect)(()=>{t&&E?.(z)},[t,z]),(0,u.useEffect)(()=>{t&&D?.(ot)},[t,ot]);async function hr(){ut(!0),U(null);try{let e=await(0,x.readOrganizationDirectory)();qt(e.orgUnits),Jt(e.positions),Xt(e.memberships)}catch(e){U(Gn(e,j))}finally{ut(!1)}}async function yr(){let e=++Gt.current;ut(!0),U(null),at(null);try{let[t,n]=await Promise.all([(0,g.readTemplateDesigner)(se),(0,x.readOrganizationDirectory)()]);if(e!==Gt.current)return;let r=t.versions.find(e=>e.status===`DRAFT`)??null,i=r??t.versions[0]??null;N(t),ue(r),qt(n.orgUnits),Jt(n.positions),Xt(n.memberships),Dt(ys(t.formVersions));let a=Mo(i?.workflowDefinition??Lo()),o=i?.formDefinitionVersionId??t.formVersions[0]?.id??null,s=i?.initiatorPolicyCel??null,c=te(i?.launchMode);Ie(a),Le(o),He(s),st(c),fe(JSON.stringify({formDefinitionVersionId:o,initiatorPolicyCel:s,launchMode:c,workflowDefinition:a})),me(i&&!t.template.currentVersionId&&!i.initiatorPolicyCel&&Ro(i.workflowDefinition)?`NONE`:null),ge(null),be(!1),H(i?.workflowDefinition.nodes[0]?.id??`start`),Ke([]),Je(null),Sn(null),wn(null)}catch(t){e===Gt.current&&U(Gn(t,j))}finally{e===Gt.current&&ut(!1)}}async function br(e){gt(!0),U(null);try{let t=await(0,g.searchPublishedFormVersionOptions)(e);Dt(ws(ys(t),X))}catch(e){U(Gn(e,j))}finally{gt(!1)}}async function xr(e){Bt(!0),U(null);let t=++Wt.current;try{let n=Ts(await(0,g.searchMemberOptions)(e));Vt(e=>ks(e,n)),t===Wt.current&&Ut(n)}catch(e){t===Wt.current&&U(Gn(e,j))}finally{t===Wt.current&&Bt(!1)}}async function Sr(e){let t=As(e),n=l.t(t.filter(e=>!W.some(t=>t.memberId===e&&!t.unresolved)),Kt.current);if(n.length===0)return;let{profiles:r,skippedIds:i}=await l.n(n,g.resolveMemberOptions),a=new Set(r.map(e=>e.memberId)),o=n.filter(e=>!a.has(e)&&!i.includes(e));o.forEach(e=>Kt.current.add(e)),Vt(e=>ks(e,[...Ts(r),...[...o,...i].map(Ve)]))}async function Cr(e){pt(!0),U(null),rt([]);let t=Cn?.schema??Vn,n=Cn?.uiSchema??ho;try{let r=Ls(L),i=ss(Y),a=e?or:null;if(r||i||a){let e=r??i??a??`流程設定未完成`;throw U(e),Error(e)}if(Cn!==null)await(0,g.composeApprovalTemplateWithForm)({category:M?.template.category??null,categoryId:M?.template.categoryId??null,formDefinitionId:X?.formDefinitionId??null,formDescription:null,formName:X?.formName??M?.template.name??`表單`,initiatorPolicyCel:z,launchMode:ot,notificationConfig:null,publish:e,schema:Cn.schema,slaDefaults:null,templateDescription:null,templateId:se??null,templateName:M?.template.name??`模板`,uiSchema:Cn.uiSchema,workflowDefinition:L}),wn(null),Sn(null),await yr();else{let t=P??await(0,g.forkApprovalTemplate)(se),n=await(0,g.updateApprovalTemplateDraft)({formDefinitionVersionId:R,initiatorPolicyCel:z,versionId:t.id,workflowDefinition:L,...ne(ot)});ue(n),e&&await(0,g.publishApprovalTemplateVersion)(n.id),await yr()}e&&t!==null&&rt(await $i({preview:_.previewResolveFormFieldOptions,schema:t,uiSchema:n}))}catch(e){U(Gn(e,j,L))}finally{pt(!1)}}async function wr(){await Cr(!1)}async function Tr(){await Cr(!0)}function Er(){cn(JSON.stringify(Xr(Z),null,2)),un(null),fn(null),Qt(!0)}function Dr(){an||Qt(!1)}async function Or(){on(!0),fn(null),un(null);try{let e=bs(sn),t=await(0,g.dryRunApprovalWorkflow)({formData:e,formSchema:Z??void 0,initiatorMemberId:co,initiatorMetadataSnapshot:Es(co,Yt,le),workflowDefinition:L});un(t)}catch(e){fn(Gn(e,j))}finally{on(!1)}}async function kr(){if(Xn(null),bn(!0),xn!==null)return;let e=X?.formDefinitionId??null;if(!e)Sn({schema:mo,uiSchema:ho});else{Dn(!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;Sn({schema:n?.schema??mo,uiSchema:n?.uiSchema??ho})}catch(e){U(Gn(e,j))}finally{Dn(!1)}}}function jr(){Sn(Cn),Xn(null),bn(!1)}async function Mr(){if(xn===null){bn(!1);return}let e=xn;On(!0);try{let t=await Wi(Z?.fields.map(e=>e.fieldKey)??[],e.schema.fields.map(e=>e.fieldKey),Kn);if(t.kind===`blocked`){Xn(`運算式還在讀取這些欄位,不能改名或刪除:${t.fields.map(e=>e.fieldKey).join(`、`)}。請先修改引用它們的運算式。`);return}if(t.kind===`unverified`){Xn(`無法確認運算式是否還在讀取這些欄位:${t.fieldKeys.join(`、`)}。為避免運算式讀不到欄位,暫不套用改名或刪除,請稍後再試。`);return}Xn(null),wn(e),I.replaceState(t=>({...t,formSchema:e.schema})),bn(!1)}finally{On(!1)}}function Nr(e){let t=(0,S.applyNodeChanges)(e,lr);Ie(e=>({...e,nodes:e.nodes.map(e=>{let n=t.find(t=>t.id===e.id);return n?{...e,position:n.position}:e})}))}function Fr(e){fs(e,L.nodes)&&e.source&&e.target&&I.dispatch({source:e.source,target:e.target,type:`connectEdge`})}function Ir(e,t){e.stopPropagation(),Ke(n=>e.shiftKey||e.metaKey||e.ctrlKey?ps(n,t.id):[t.id]),H(null)}function Lr(){Je(null)}function Rr(e){I.dispatch({nodeType:e,type:`addNode`})}function zr(e){J&&I.dispatch({label:e,nodeId:J.id,type:`renameNode`})}function Q(e){if(!J||J.type!==`userTask`)return;let t=J.id,n=J.data.decisionPolicy;I.dispatch({approverResolver:e,nodeId:t,type:`setUserTaskApprover`}),at(null),(0,w.isOrgManagerChainDecisionPolicyInvalid)(e,n)?at({message:`主管鏈會依序加入多位主管,簽核方式已改為「依序簽核」。`,nodeId:t,policyType:`SEQUENTIAL`}):(0,w.isDecisionPolicyUnsatisfiable)(n,e)&&at({message:`簽核者已變更為 ${(0,w.readDesignTimeApproverCount)(e)} 位,不足原本設定的 ${n?.type===`QUORUM`?n.threshold:0} 位門檻,簽核政策已重設為單人簽核,請重新設定。`,nodeId:t,policyType:`SINGLE`})}function Br(e){J&&J.type===`userTask`&&I.dispatch({allowedTargets:e,nodeId:J.id,type:`setUserTaskReturnAllowedTargets`})}function Vr(e){J&&J.type===`userTask`&&I.dispatch({nodeId:J.id,resubmitStrategy:e,type:`setUserTaskReturnResubmitStrategy`})}function Hr(e){J&&J.type===`userTask`&&I.dispatch({nodeId:J.id,requireComment:e,type:`setUserTaskReturnRequireComment`})}function Wr(e){J&&J.type===`userTask`&&I.dispatch({nodeId:J.id,requireApprovalComment:e,type:`setUserTaskRequireApprovalComment`})}function Gr(e){J&&J.type===`userTask`&&I.dispatch({nodeId:J.id,sla:e,type:`setUserTaskSla`})}function Kr(e){J&&J.type===`userTask`&&I.dispatch({excludeInitiator:e,nodeId:J.id,type:`setUserTaskExcludeInitiator`})}function qr(e){J&&J.type===`userTask`&&I.dispatch({excludeNodeActors:e,nodeId:J.id,type:`setUserTaskExcludeNodeActors`})}function Jr(e){if(!J||J.type!==`userTask`)return;at(null);let t=e.type===`QUORUM`?{...e,threshold:(0,w.composeQuorumThreshold)(e.threshold,e.thresholdType)}:e;I.dispatch({decisionPolicy:t,nodeId:J.id,type:`setUserTaskDecisionPolicy`})}function Yr(e){J&&J.type===`userTask`&&I.dispatch({...e,nodeId:J.id,type:`setUserTaskOptions`})}function Zr(e){J&&J.type===`serviceTask`&&I.dispatch({action:e,nodeId:J.id,type:`setServiceAction`})}function Qr(e){ge(e.mode===`ALL`||e.mode===`CUSTOM`?null:e),me(e.mode===`ALL`||e.mode===`CUSTOM`?null:e.mode),He(ls(e,G))}function $r(e){J&&J.type!==`startEvent`&&I.dispatch({nodeId:J.id,triggerMode:e,type:`setNodeTriggerMode`})}function ei(e,t){I.dispatch({edgeId:e,isDefault:t,type:`setEdgeDefault`})}function ti({edgeId:e,fieldKey:t,operator:n,value:r}){I.dispatch({edgeId:e,fieldKey:t,operator:n,type:`setEdgeCondition`,value:r})}function ni(){I.dispatch({type:`autoLayout`})}return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(`style`,{children:la}),t?null:(0,f.jsx)(d.PageHeader,{children:(0,f.jsxs)(h.default,{description:Yi(Ji({draftVersion:P?.version??null,hasPublishedVersion:!!M?.template.currentVersionId,publishedVersion:M?.versions.find(e=>e.id===M.template.currentVersionId)?.version??null}),B),onBackClick:An,title:M?.template.name??`流程設計器`,children:[B===`cel-legacy`?(0,f.jsx)(d.Button,{disabled:ct||dt,onClick:()=>en(!0),variant:`base-secondary`,children:`升級到 cel-v2`}):null,ae?(0,f.jsx)(d.Button,{disabled:!e,onClick:()=>vn(e=>!e),variant:_n?`base-primary`:`base-secondary`,children:e?`AI 助理`:`AI 助理(未設定)`}):null,(0,f.jsx)(d.Button,{"aria-label":`儲存草稿`,disabled:dt||!!Hn||!!pr,icon:v.SaveIcon,iconType:`icon-only`,onClick:()=>void wr(),variant:`base-secondary`,children:`儲存草稿`}),oe?(0,f.jsx)(d.Button,{disabled:ct||!!Hn||!!pr,icon:v.EyeIcon,iconType:`leading`,onClick:Er,variant:`base-secondary`,children:`試跑流程`}):null,(0,f.jsx)(d.Button,{disabled:dt||!P&&!Nt&&!Tn||!!Hn||!!pr||!!or,icon:v.CheckedIcon,iconType:`leading`,onClick:()=>void Tr(),variant:`base-primary`,children:kn})]})}),(0,f.jsx)(d.SectionGroup,{children:(0,f.jsx)(d.Section,{children:(0,f.jsxs)(`div`,{style:na,children:[Ye?(0,f.jsx)(d.Typography,{color:`text-error`,style:lo,variant:`body`,children:Ye}):null,nt.map(e=>(0,f.jsx)(d.Typography,{color:`text-warning`,variant:`body`,children:ea(e)},`${e.fieldKey}:${e.status}`)),it&&it.nodeId===J?.id&&J.type===`userTask`&&(J.data.decisionPolicy?.type??`SINGLE`)===it.policyType?(0,f.jsx)(d.Typography,{color:`text-warning`,variant:`body`,children:it.message}):null,Hn?(0,f.jsx)(d.Typography,{color:`text-error`,variant:`body`,children:Hn}):null,pr?(0,f.jsx)(d.Typography,{color:`text-error`,variant:`body`,children:pr}):null,!Hn&&or?(0,f.jsxs)(d.Typography,{color:`text-error`,variant:`body`,children:[`發布前需修正:`,or]}):null,t?null:(0,f.jsx)(`div`,{style:ga,children:(0,f.jsx)(c.t,{hintText:ur?`已設定條件分流條件。請先移除所有條件,才能更換綁定表單版本。`:void 0,label:`綁定表單版本`,name:`formDefinitionVersionId`,required:!0,children:(0,f.jsxs)(`div`,{style:ba,children:[(0,f.jsx)(`div`,{style:xa,children:(0,f.jsx)(d.AutoComplete,{asyncData:!0,disabled:ct||ur,disabledOptionsFilter:!0,emptyText:`沒有符合的已發布表單版本`,isForceClearable:!!R&&!ur,loading:ht,loadingText:`搜尋表單版本中...`,mode:`single`,onChange:e=>{ur||Le(e?.id??null)},onClear:()=>{ur||Le(null)},onSearch:br,onVisibilityChange:e=>{e&&!ur&&br(``)},options:[...Rn],placeholder:`選擇已發布表單版本`,searchDebounceTime:300,value:X})}),(0,f.jsx)(d.Button,{disabled:ct,onClick:()=>{kr()},style:Sa,variant:`base-secondary`,children:`編輯表單`})]})})}),(0,f.jsxs)(`div`,{style:ra,children:[(0,f.jsx)(`div`,{ref:Ce,style:ia,children:(0,f.jsxs)(S.ReactFlow,{connectionMode:S.ConnectionMode.Strict,edges:Ln,fitView:!0,isValidConnection:e=>fs(e,L.nodes),nodeTypes:go,nodes:lr,deleteKeyCode:null,multiSelectionKeyCode:[`Shift`,`Meta`,`Control`],onConnect:Fr,onEdgeClick:Ir,onNodeClick:(e,t)=>{H(t.id),Ke([])},onNodesChange:Nr,onPaneClick:()=>{H(null),Ke([])},onViewportChange:Te,viewport:we,children:[(0,f.jsx)(S.Background,{}),(0,f.jsx)(`style`,{children:ma}),(0,f.jsx)(S.Controls,{children:Mn?(0,f.jsx)(S.ControlButton,{"aria-label":`刪除選取項目`,className:`workflow-selection-delete-control`,onClick:Nn,style:aa,title:`刪除選取項目`,children:(0,f.jsx)(`span`,{style:oa,children:(0,f.jsx)(d.Icon,{color:`error`,icon:v.TrashIcon,size:16})})}):null}),(0,f.jsx)(yo,{onApplyAutoLayout:ni}),(0,f.jsx)(S.MiniMap,{})]})}),(0,f.jsxs)(`div`,{className:sa,style:ha,children:[(0,f.jsx)(d.Typography,{component:`h2`,variant:`h3`,children:`流程工具`}),t&&ae?(0,f.jsxs)(`div`,{style:Ca,children:[(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`caption`,children:`AI 協助`}),(0,f.jsx)(`div`,{style:ya,children:(0,f.jsx)(d.Button,{disabled:!e,onClick:()=>vn(e=>!e),size:`sub`,variant:_n?`base-primary`:`base-secondary`,children:e?`AI 助理`:`AI 助理(未設定)`})})]}):null,(0,f.jsxs)(`div`,{style:Ca,children:[(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`caption`,children:`動作節點`}),(0,f.jsx)(`div`,{style:ya,children:Wa.map(e=>(0,f.jsx)(d.Button,{icon:e.icon,iconType:`leading`,onClick:()=>Rr(e.type),size:`sub`,variant:`base-secondary`,children:e.label},e.type))})]}),(0,f.jsxs)(`div`,{style:Ca,children:[(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`caption`,children:`流程控制`}),(0,f.jsx)(`div`,{style:ya,children:Ga.map(e=>(0,f.jsx)(d.Button,{icon:e.icon,iconType:`leading`,onClick:()=>Rr(e.type),size:`sub`,variant:`base-secondary`,children:e.label},e.type))})]}),(0,f.jsxs)(`div`,{style:Ca,children:[(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`caption`,children:`表單欄位`}),(0,f.jsx)(`div`,{style:ya,children:(0,f.jsx)(d.Button,{disabled:Z===null,onClick:()=>nn(!0),size:`sub`,title:Z===null?Aa:void 0,variant:`base-secondary`,children:`欄位總覽`})})]}),In.length>1?_i(In):null,In.length===1&&Fn?vi(Fn):null,In.length===0&&J?ii(J):null]})]})]})})}),yi(Pn),!t&&oe?ri():null,t?null:(0,f.jsx)(xi,{draft:{formDefinitionVersionId:R,initiatorPolicyCel:z,workflowDefinition:L},onCancel:()=>en(!1),onConfirm:()=>{en(!1),Ue(e=>({...e,expressionDialect:`cel-v2`}))},open:$t}),(0,f.jsx)(Bn,{definition:L,expressionReferences:Wn,formSchema:Z,language:j,onApply:e=>I.dispatch({entries:e,type:`setFieldAccessMatrix`}).error,onClose:()=>nn(!1),open:tn}),ae&&e?(0,f.jsx)(rn,{controller:I,onClose:()=>vn(!1),open:_n}):null,t?null:(0,f.jsx)(m.default,{headerTitle:`編輯表單`,isHeaderDisplay:!0,onClose:jr,open:yn,size:`wide`,children:(0,f.jsxs)(`div`,{style:uo,children:[(0,f.jsx)(`div`,{style:fo,children:En?(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`body`,children:`載入中…`}):(0,f.jsx)(i.t,{formDefinitionId:X?.formDefinitionId??null,onChange:e=>{Sn(e)},templateId:se??null,value:xn??{schema:mo,uiSchema:ho}})}),Yn?(0,f.jsx)(d.InlineMessage,{content:Yn,severity:`error`}):null,(0,f.jsxs)(`div`,{style:po,children:[(0,f.jsx)(d.Button,{disabled:En||q,loading:q,onClick:()=>{Mr()},variant:`base-primary`,children:`套用`}),(0,f.jsx)(d.Button,{disabled:q,onClick:jr,variant:`base-secondary`,children:`取消`})]})]})})]});function ri(){let e={formFields:Z?.fields??[],memberName:e=>W.find(t=>t.memberId===e&&!t.unresolved)?.displayName??null,nodes:L.nodes.map(e=>({id:e.id,name:e.data.label||e.id})),orgUnits:G,positions:K};return(0,f.jsx)(d.Modal,{cancelText:`關閉`,confirmText:`執行試跑`,loading:an,modalType:`standard`,onCancel:Dr,onClose:Dr,onConfirm:()=>void Or(),open:Zt,showModalFooter:!0,showModalHeader:!0,size:`wide`,supportingText:`使用 ${co} 與範例表單資料模擬目前畫布流程,不會建立案件。`,title:`試跑流程`,children:(0,f.jsxs)(`div`,{style:ga,children:[(0,f.jsx)(c.t,{label:`表單資料 JSON`,name:`dryRunFormDataJson`,required:!0,children:(0,f.jsx)(d.Textarea,{onChange:e=>cn(e.target.value),resize:`vertical`,rows:8,value:sn})}),dn?(0,f.jsx)(d.Typography,{color:`text-error`,variant:`body`,children:dn}):null,ln?(0,f.jsxs)(`div`,{style:_a,children:[(0,f.jsx)(d.Typography,{color:ln.valid?`text-success`:`text-error`,variant:`label-primary-highlight`,children:ln.valid?`試跑通過`:`試跑失敗`}),ln.errors.map(e=>(0,f.jsx)(d.Typography,{color:`text-error`,variant:`body`,children:e},e)),ln.steps.map(t=>(0,f.jsxs)(`div`,{style:va,children:[(0,f.jsxs)(d.Typography,{variant:`label-primary-highlight`,children:[t.nodeLabel,` · `,Ss(t.status)]}),(0,f.jsxs)(d.Typography,{color:`text-neutral`,variant:`caption`,children:[Cs(t.nodeType),t.assigneeMemberId?` · 處理者:${qi(t.assigneeMemberId,e)}`:``,t.edgeLabel?` · 來源線段:${t.edgeLabel}`:``]}),t.edgeReason?(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`caption`,children:t.edgeReason}):null,t.entryCondition?(0,f.jsxs)(d.Typography,{color:`text-neutral`,variant:`caption`,children:[`進入條件:`,t.entryConditionMatched?`符合`:`不符合`,` ·`,` `,t.entryCondition]}):null,(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`body`,children:t.message}),(t.status===`SKIPPED`?[]:Ps(L,t.nodeId,pn)).map(e=>(0,f.jsxs)(d.Typography,{color:`text-neutral`,variant:`caption`,children:[`將送出 Webhook:`,e.label]},e.key))]},t.id))]}):null]})})}function ii(e){return(0,f.jsxs)(`div`,{style:ga,children:[(0,f.jsx)(d.Typography,{component:`h2`,variant:`h3`,children:`節點屬性`}),(0,f.jsxs)(d.Typography,{color:`text-neutral`,variant:`body`,children:[Ua[e.type],` · `,e.id]}),(0,f.jsx)(c.t,{label:`顯示名稱`,name:`nodeLabel`,required:!0,children:(0,f.jsx)(d.Input,{onChange:e=>zr(e.target.value),value:e.data.label,variant:`base`})}),e.type===`startEvent`?ai():null,e.type===`startEvent`?null:oi(e),Ri(e)?(0,f.jsx)(Ni,{dialect:B,evaluable:!0,formDefinitionVersionId:R,hintText:`不符合時跳過這個節點;空白代表一律執行。`,label:`進入條件`,name:`entryCondition`,onChange:t=>Ue(n=>zi(n,e.id,t)),usagePoint:`ENTRY_CONDITION`,value:e.data.entryCondition??``}):null,e.type===`userTask`?si(e):null,e.type===`serviceTask`?fi(e):null]})}function ai(){let e=[...ao,oo],t=Y.mode===`ORG_UNIT`||Y.mode===`ORG_UNIT_POSITION`?Re(G,Y.orgUnitId??``):null,n=Y.mode===`ORG_UNIT_POSITION`?ze(K,Y.positionId??``):null,r=Y.mode===`ORG_UNIT_POSITION`?_r({date:le,includeDescendants:!!Y.includeDescendants,memberships:Yt,orgUnitId:Y.orgUnitId??``,orgUnits:G,positions:K}):[],i=vr({orgUnitId:Y.orgUnitId??``,positionId:Y.positionId??``,positions:K,scopedPositions:r});return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(c.t,{hintText:Y.mode===`CUSTOM`?`以運算式判斷誰可以發起;切換成標準選項後會改由 UI 管理。`:void 0,label:`發起權限`,name:`initiatorPolicyMode`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>{if(e?.id===`CUSTOM`){me(null),ge(null),be(!0);return}be(!1);let t=is(e?.id??null),n=ds(t);me(t===`ALL`?null:t),ge(t===`ALL`?null:n),He(ls(n,G))},options:e,placeholder:`選擇誰可以發起`,value:$(e,Y.mode)})}),(0,f.jsx)(c.t,{hintText:k(ot).description,label:`發起方式`,name:`launchMode`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>{st(te(e?.id??null))},options:[...ee],placeholder:`選擇發起方式`,value:$(ee,ot)})}),Y.mode===`CUSTOM`?(0,f.jsx)(Ni,{dialect:B,formDefinitionVersionId:R,hintText:`可讀 subject(發起人的組織、職位);空白代表所有人都能發起。`,label:`發起權限運算式`,name:`initiatorPolicyCel`,onChange:e=>He(e.trim()?e:null),usagePoint:`INITIATOR_POLICY`,value:z??``}):null,Y.mode===`ORG_UNIT`||Y.mode===`ORG_UNIT_POSITION`?(0,f.jsx)(c.t,{label:`組織`,name:`initiatorOrgUnitId`,required:!0,children:(0,f.jsx)(s.n,{name:`initiatorOrgUnitId`,onChange:e=>Qr({...Y,orgUnitId:e?.id??``,positionId:``,value:e?.id??``}),orgUnits:G,placeholder:`選擇組織`,value:t})}):null,Y.mode===`ORG_UNIT`||Y.mode===`ORG_UNIT_POSITION`?(0,f.jsx)(c.t,{label:`包含下層`,name:`initiatorIncludeDescendants`,children:(0,f.jsx)(d.Toggle,{checked:!!Y.includeDescendants,onChange:e=>Qr({...Y,includeDescendants:e.target.checked,...Y.mode===`ORG_UNIT_POSITION`?{positionId:``}:{}})})}):null,Y.mode===`ORG_UNIT_POSITION`?(0,f.jsx)(c.t,{hintText:i.isInactive?ta:void 0,label:`職位`,name:`initiatorPositionId`,required:!0,children:(0,f.jsx)(s.r,{disabled:!Y.orgUnitId?.trim(),name:`initiatorPositionId`,onChange:e=>Qr({...Y,positionId:e?.id??``}),placeholder:Y.orgUnitId?.trim()?`選擇職位`:`請先選擇組織`,positions:i.options,value:n})}):null]})}function oi(e){let t=L.edges.filter(t=>t.target===e.id).length,n=t<2,r=n?`AND`:e.data.triggerMode??`AND`;return(0,f.jsx)(c.t,{hintText:n?`需要至少兩條前置連線,才可切換為任一前置完成。`:t>1?`${t} 條前置連線會依此規則觸發。`:`只有一條前置連線時,兩種設定效果相同。`,label:`前置條件`,name:`triggerMode`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>n?void 0:$r(Bo(e?.id??null)),options:[...Ka],readOnly:n,value:$(Ka,r)})})}function si(e){let t=e.data.approverResolver,n=We(t),r=Xe(n),i=Qe(n),a=et(t),o=t.type===`DIRECT`?t.memberIds.map(e=>Be(W,e)):[],l=t.type===`ORG_UNIT_MEMBER`||t.type===`ORG_UNIT_POSITION`?Re(G,t.orgUnitId):null,u=t.type===`POSITION`||t.type===`ORG_UNIT_POSITION`?ze(K,t.positionId):null,p=t.type===`ORG_UNIT_POSITION`?_r({date:le,includeDescendants:!!t.includeDescendants,memberships:Yt,orgUnitId:t.orgUnitId,orgUnits:G,positions:K}):[],m=vr({orgUnitId:t.type===`ORG_UNIT_POSITION`?t.orgUnitId:``,positionId:t.type===`ORG_UNIT_POSITION`?t.positionId:``,positions:K,scopedPositions:p}),h=n.mode===`DYNAMIC_FORM`?n.levelsUp===null?he(Z,n.formPath):_e(Z,n.formPath):null,g=n.mode===`ORG_UNIT_MANAGER`&&n.orgSource===`FORM_FIELD`?ye(Z,n.formPath):null,_=n.mode===`ORG_UNIT_MANAGER`&&n.orgSource===`FIXED`?Re(G,n.orgUnitId):null,v=n.mode===`NODE_ACTOR`?er(L,e.id,n.nodeIds):null,y=t.type===`ORG_MANAGER`?je(t.levelsUp):Ee[0],b=a?.fallback??{type:`NONE`},x=(0,T.readUnsupportedApproverFallbackType)(b),S=x===null?Za:[...Za,Qa],C=t.type===`ORG_MANAGER_CHAIN`?re(K,t.minPositionLevel):[],E=t.type===`ORG_MANAGER_CHAIN`?t:null,D=E?lt(E):null,ee=D!==null&&D!==`INITIATOR`,O=E?mt(E):null,te=E&&D===`FORM_MEMBER`?_e(Z,yt(E)??``):null,k=E&&D===`NODE_ACTOR`?tr(L,e.id,bt(E)??[]):null,ne=E&&D===`CHAIN_CONTINUATION`?dr(L,e.id,Ct(E)):null,ie=E?kt(E,K):null,ae=E?jt(E):null,oe=b.type===`DIRECT`&&b.memberId?Be(W,b.memberId):null,se=b.type===`POSITION`?ze(K,b.positionId):null,ce=e.data.returnBehavior.resubmitStrategy??`RESTART`,A=e.data.sla??null,M=e.data.excludeInitiator??null,N=e.data.excludeNodeActors??null,P=N?sr(L,e.id,N.nodeIds,N.whenEmpty):null,ue=A?(0,w.readSlaDurationParts)(A.duration):null,de=ue?.unit??`DAY`,fe=Xo(A?.warningAt??null),pe=je(A?.escalateLevelsUp??1),me=Uo(e.data.decisionPolicy),F=Go(e.data.decisionPolicy);function ge(){return i?(0,f.jsx)(c.t,{hintText:i.invalid?`原本儲存的主管層級無效(需為第 1 層以上),請重新選擇;發布前必須修正。`:n.mode===`NODE_ACTOR`?`選「關卡的簽核者」就是簽核者本人;選主管則往上找他的主管,不會是簽核者自己。`:`選「欄位裡的人」就是欄位選的人;選主管則往上找他的主管,不會是欄位裡的人自己。`,label:`簽核人`,name:`approverSubject`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>{let t=$e(n,e?.id??null);t&&Q(Ge(t))},options:[...i.options],value:i.selected})}):null}return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(c.t,{hintText:r.hint??void 0,label:`簽核來源`,name:`approverResolverType`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>{let n=Ze(t,e?.id??null,K);n&&Q(n)},options:[...r.options],value:r.selected})}),(0,f.jsx)(c.t,{hintText:`以運算式算出簽核人 id;結果必須是會員 id 的清單。`,label:`以運算式指定`,name:`approverResolverExpressionMode`,children:(0,f.jsx)(d.Toggle,{checked:t.type===`EXPRESSION`,onChange:e=>{let n=e.target.checked?{expression:``,type:`EXPRESSION`}:Ze(t,`DIRECT`,K);n&&Q(n)}})}),t.type===`EXPRESSION`?(0,f.jsx)(Ni,{dialect:B,formDefinitionVersionId:R,label:`簽核人運算式`,name:`approverResolverExpression`,onChange:e=>Q({expression:e,type:`EXPRESSION`}),required:!0,usagePoint:`APPROVER_RESOLVER`,value:t.expression}):null,t.type===`DIRECT`?(0,f.jsx)(c.t,{hintText:Lt(e.data.decisionPolicy),label:`簽核者`,name:`memberId`,required:!0,children:(0,f.jsx)(d.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的成員`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:`workflow-approver-search`,spellCheck:!1},loading:Ft,loadingText:`搜尋成員中...`,mode:`multiple`,onChange:e=>Q({memberIds:e.map(e=>e.id),type:`DIRECT`}),onSearch:xr,onVisibilityChange:e=>{e&&(Ut([]),xr(``))},options:[...ks(o,Ht)],placeholder:`搜尋姓名或信箱`,searchDebounceTime:300,value:o})}):null,n.mode===`DYNAMIC_FORM`?(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(c.t,{hintText:h?.problem??(n.levelsUp===null?`簽核人取自申請人送出表單時在該欄位選的人員。`:`依申請人送出表單時在該欄位選的人員,往上找他的主管。`),label:`表單欄位`,name:`approverFormPath`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>Q(Ge({...n,formPath:e?.id??``})),options:[...h?.options??[]],placeholder:`選擇人員選擇欄位`,value:h?.selected??void 0})}),ge()]}):null,t.type===`ORG_MANAGER`?(0,f.jsx)(c.t,{hintText:`依發起人的有效會員歸屬與主管解析規則決定簽核人。`,label:`主管層級`,name:`managerLevelsUp`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>Q({baseFromInitiator:!0,...t.fallback?{fallback:t.fallback}:{},levelsUp:Me(e?.id??null).value,type:`ORG_MANAGER`}),options:[...Ee],value:y})}):null,t.type===`ORG_MANAGER_CHAIN`?(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(c.t,{hintText:D===`INITIATOR`?`從發起人的直屬主管開始往上,職等比前一位高的主管依序加入,簽到職等達此值的主管為止。沒有職位的主管會略過。`:`從起點的直屬主管開始往上,職等比前一位高的主管依序加入,簽到職等達此值的主管為止。沒有職位的主管會略過。${ee&&!M?eo:``}`,label:`簽到職等`,name:`minPositionLevel`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>Q(Ot(t,Number(e?.id??t.minPositionLevel))),options:[...C],value:$(C,String(t.minPositionLevel))})}),O?(0,f.jsx)(c.t,{hintText:O.hint,label:`從誰的主管開始`,name:`orgManagerChainStart`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>{let n=vt(t,e?.id??null);n&&Q(n)},options:[...O.options],value:O.selected})}):null,te?(0,f.jsx)(c.t,{hintText:te.problem??`只能選單選的人員欄位;欄位要必填、不被條件隱藏,否則送出時可能找不到起點。`,label:`表單欄位`,name:`orgManagerChainStartFormPath`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>Q(xt(t,e?.id??``)),options:[...te.options],placeholder:`選擇人員選擇欄位`,value:te.selected??void 0})}):null,k?(0,f.jsx)(c.t,{hintText:k.problems.length>0?k.problems.join(`;`):Jn,label:`關卡`,name:`orgManagerChainStartNodeIds`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!0,mode:`multiple`,onChange:e=>Q(St(t,e.map(e=>e.id))),options:[...k.options],overflowStrategy:`wrap`,placeholder:`選擇前面的簽核關卡`,value:[...k.selected]})}):null,ne&&E?(0,f.jsx)(c.t,{hintText:ne.problems.length>0?ne.problems.join(`;`):`只列出每條路徑都會經過、起點為申請人或前面關卡簽核者的主管鏈關卡;本關的簽到職等必須高於它。`,label:`接續哪一關`,name:`orgManagerChainContinuationNodeId`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>Q(wt(E,e?.id??``)),options:[...ne.options],placeholder:`選擇前面的主管鏈關卡`,value:ne.selected??void 0})}):null,ie?(0,f.jsx)(c.t,{hintText:ae??(ie.invalid?`原本儲存的起始職等無效,請重新選擇;發布前必須修正。`:`職等低於這裡的主管只會被略過、不簽核;留白則從鏈上第一位有職等的主管開始簽。不可高於「簽到職等」。`),label:`從職等幾開始簽`,name:`startPositionLevel`,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>{let n=At(t,e?.id??null);n&&Q(n)},options:[...ie.options],value:ie.selected})}):null,E?(0,f.jsx)(c.t,{hintText:ft(E)?`已選「接續前面某一段主管鏈」,不能同時使用;要用請先改選其他起點。`:`起點本人在所有在職職務裡的最高職等已達簽到職等時,本關整關略過;起點沒有職等時不略過。`,label:`起點本人已達簽到職等時略過此關`,name:`orgManagerChainSkipWhenStartReached`,children:(0,f.jsx)(d.Toggle,{checked:Tt(E),disabled:ft(E),inputProps:{id:`orgManagerChainSkipWhenStartReached`,name:`orgManagerChainSkipWhenStartReached`},onChange:e=>Q(Et(E,e.target.checked))})}):null]}):null,n.mode===`ORG_UNIT_MANAGER`?(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(c.t,{hintText:`固定組織:每張單都找同一個組織的主管;表單欄位:找申請人在表單上選的組織的主管。`,label:`組織`,name:`orgUnitSource`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>{e&&e.id!==n.orgSource&&Q(Ge(qe(n,e.id===`FORM_FIELD`?`FORM_FIELD`:`FIXED`)))},options:[...ke],value:$(ke,n.orgSource)})}),n.orgSource===`FIXED`?(0,f.jsx)(c.t,{hintText:`依指定組織或其上層的主管解析規則決定簽核人。`,label:`指定組織`,name:`orgUnitId`,required:!0,children:(0,f.jsx)(s.n,{name:`orgUnitId`,onChange:e=>Q(Ge({...n,orgUnitId:e?.id??``})),orgUnits:G,placeholder:`選擇組織`,value:_})}):(0,f.jsx)(c.t,{hintText:g?.problem??`依申請人送出表單時在該欄位選的組織,找該組織的主管。`,label:`表單欄位`,name:`approverOrgFormPath`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>Q(Ge({...n,formPath:e?.id??``})),options:[...g?.options??[]],placeholder:`選擇組織選擇欄位`,value:g?.selected??void 0})})]}):null,n.mode===`NODE_ACTOR`?(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(c.t,{hintText:v&&v.problems.length>0?v.problems.join(`;`):qn,label:`關卡`,name:`approverNodeIds`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!0,mode:`multiple`,onChange:e=>Q(Ge({...n,nodeIds:e.map(e=>e.id)})),options:[...v?.options??[]],overflowStrategy:`wrap`,placeholder:`選擇前面的簽核關卡`,value:[...v?.selected??[]]})}),ge()]}):null,t.type===`ORG_UNIT_MEMBER`||t.type===`ORG_UNIT_POSITION`?(0,f.jsx)(c.t,{hintText:`依指定組織目前有效會員歸屬建立候選簽核人。`,label:`組織`,name:`orgUnitId`,required:!0,children:(0,f.jsx)(s.n,{name:`orgUnitId`,onChange:e=>Q(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:G,placeholder:`選擇組織`,value:l})}):null,a===null?null:(0,f.jsxs)(f.Fragment,{children:[a.showPreferClosestOrgUnit?(0,f.jsx)(c.t,{hintText:`開啟後只取離該員最近一層的主管規則;掛在上層單位、涵蓋範圍較大的規則不會再一併加入簽核人。`,label:`只取最近一層主管`,name:`preferClosestOrgUnit`,children:(0,f.jsx)(d.Toggle,{checked:a.preferClosestOrgUnit,inputProps:{id:`preferClosestOrgUnit`,name:`preferClosestOrgUnit`},onChange:e=>Q(tt(t,e.target.checked))})}):null,(0,f.jsx)(c.t,{hintText:x===null?t.type===`ORG_MANAGER_CHAIN`?Pt(t):`預設會停止流程並提示;若設定固定人,找不到主管時會改派給該會員。`:`此改派設定來自較新版本的 BPMCore,本版本無法執行也無法編輯;請升級後再編輯。這裡選擇其他模式會覆寫原設定。`,label:`無主管時`,name:`approverFallbackMode`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>{e?.id!==`UNSUPPORTED`&&Q(Ae(t,rs(e?.id??null)))},options:[...S],value:x===null?$(Za,b.type):Qa})}),b.type===`DIRECT`?(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(c.t,{label:`改派人員`,name:`approverFallbackMemberId`,required:!0,children:(0,f.jsx)(d.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的成員`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:`workflow-approver-fallback-search`,spellCheck:!1},loading:Ft,loadingText:`搜尋成員中...`,mode:`single`,onChange:e=>Q(Ae(t,{allowInitiatorSelfApproval:b.allowInitiatorSelfApproval,memberId:e?.id??``,type:`DIRECT`})),onSearch:xr,onVisibilityChange:e=>{e&&(Ut([]),xr(``))},options:[...ks(Ht,oe?[oe]:[])],placeholder:`搜尋姓名或信箱`,searchDebounceTime:300,value:oe})}),(0,f.jsx)(c.t,{hintText:`預設禁止申請人簽自己的案件;只有此流程允許自簽時才開啟。`,label:`允許自簽`,name:`allowInitiatorSelfApproval`,children:(0,f.jsx)(d.Toggle,{checked:!!b.allowInitiatorSelfApproval,inputProps:{id:`allowInitiatorSelfApproval`,name:`allowInitiatorSelfApproval`},onChange:e=>Q(Ae(t,{allowInitiatorSelfApproval:e.target.checked,memberId:b.memberId,type:`DIRECT`}))})})]}):null,b.type===`POSITION`?(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(c.t,{hintText:`指派給目前有效歸屬中擁有此職位的會員;主要歸屬優先。多人時全部成為簽核人,依上方的決策政策處理。`,label:`改派職位`,name:`approverFallbackPositionId`,required:!0,children:(0,f.jsx)(s.r,{name:`approverFallbackPositionId`,onChange:e=>Q(Ae(t,{allowInitiatorSelfApproval:b.allowInitiatorSelfApproval,positionId:e?.id??``,type:`POSITION`})),placeholder:`選擇職位`,positions:K,value:se})}),(0,f.jsx)(c.t,{hintText:`預設禁止申請人簽自己的案件;只有此流程允許自簽時才開啟。`,label:`允許自簽`,name:`allowInitiatorSelfApproval`,children:(0,f.jsx)(d.Toggle,{checked:!!b.allowInitiatorSelfApproval,inputProps:{id:`allowInitiatorSelfApproval`,name:`allowInitiatorSelfApproval`},onChange:e=>Q(Ae(t,{allowInitiatorSelfApproval:e.target.checked,positionId:b.positionId,type:`POSITION`}))})})]}):null]}),t.type===`ORG_UNIT_MEMBER`||t.type===`ORG_UNIT_POSITION`?(0,f.jsx)(c.t,{label:`包含下層`,name:`includeDescendants`,children:(0,f.jsx)(d.Toggle,{checked:!!t.includeDescendants,inputProps:{id:`includeDescendants`,name:`includeDescendants`},onChange:e=>Q({...t,includeDescendants:e.target.checked,...t.type===`ORG_UNIT_POSITION`?{positionId:``}:{}})})}):null,t.type===`POSITION`?(0,f.jsx)(c.t,{hintText:`指派給目前有效歸屬中擁有此職位的會員;主要歸屬優先。`,label:`職位`,name:`positionId`,required:!0,children:(0,f.jsx)(s.r,{name:`positionId`,onChange:e=>Q({positionId:e?.id??``,type:`POSITION`}),placeholder:`選擇職位`,positions:K,value:u})}):null,t.type===`ORG_UNIT_POSITION`?(0,f.jsx)(c.t,{hintText:m.isInactive?ta:`只納入指定組織範圍內擁有此職位的有效會員。`,label:`職位`,name:`orgUnitPositionId`,required:!0,children:(0,f.jsx)(s.r,{disabled:!t.orgUnitId.trim(),name:`orgUnitPositionId`,onChange:e=>Q({includeDescendants:t.includeDescendants,orgUnitId:t.orgUnitId,positionId:e?.id??``,type:`ORG_UNIT_POSITION`}),placeholder:t.orgUnitId.trim()?`選擇職位`:`請先選擇組織`,positions:m.options,value:u})}):null,(0,f.jsx)(c.t,{hintText:`決定這一關要幾位簽核者同意才會通過;單人簽核與任一人同意的效果完全相同,皆為其中一人同意即通過。`,label:`決策方式`,name:`decisionPolicy`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:t=>Jr(Wo(t?.id??null,e.data.decisionPolicy)),options:[...It.filter(e=>t.type!==`ORG_MANAGER_CHAIN`||e.id===`SEQUENTIAL`||e.id===`PARALLEL_ALL`)],value:Rt(me)})}),me===`QUORUM`?(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(c.t,{label:`門檻計算方式`,name:`quorumThresholdType`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>Jr({threshold:F.threshold,thresholdType:Ko(e?.id??null),type:`QUORUM`}),options:[...Xa],value:$(Xa,F.thresholdType)})}),(0,f.jsx)(c.t,{hintText:F.thresholdType===`PERCENTAGE`?`達到簽核者總數的這個百分比即通過,換算人數時無條件進位;超過 100 的輸入會自動夾至 100。`:`達到這個同意人數即通過;門檻超過實際簽核者人數時,這一關將永遠無法通過,請勿設定超過實際簽核者人數。`,label:F.thresholdType===`PERCENTAGE`?`門檻百分比`:`門檻人數`,name:`quorumThreshold`,required:!0,children:(0,f.jsx)(d.Input,{id:`quorumThreshold`,inputProps:F.thresholdType===`PERCENTAGE`?{max:100,min:1}:{min:1},inputType:`number`,name:`quorumThreshold`,onChange:e=>Jr({threshold:(0,w.composeQuorumThreshold)(Number(e.target.value),F.thresholdType),thresholdType:F.thresholdType,type:`QUORUM`}),value:String(F.threshold),variant:`base`})})]}):null,e.data.returnBehavior.allowReturn?(0,f.jsx)(c.t,{hintText:`簽核者按下退回時,單子要回到哪裡。選「由簽核者選擇」時,可以退回申請人,或這一關之前任一個簽核節點。`,label:`可退回到`,name:`returnAllowedTargets`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>Br(Vo(e?.id??null)),options:[...qa],value:$(qa,e.data.returnBehavior.allowedTargets)})}):null,e.data.returnBehavior.allowReturn?(0,f.jsx)(c.t,{hintText:`退回發起人後,重新送出時要從流程開始重跑,或直接回到退回的簽核節點。`,label:`重送策略`,name:`returnResubmitStrategy`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>Vr(Ho(e?.id??null)),options:[...Ja],value:$(Ja,ce)})}):null,e.data.returnBehavior.allowReturn?(0,f.jsx)(c.t,{hintText:`開啟後,簽核者按下退回時必須填寫意見,未填寫會被擋下。`,label:`退回時意見必填`,name:`returnRequireComment`,children:(0,f.jsx)(d.Toggle,{checked:e.data.returnBehavior.requireComment===!0,inputProps:{id:`returnRequireComment`,name:`returnRequireComment`},onChange:e=>Hr(e.target.checked)})}):null,(0,f.jsx)(c.t,{hintText:`開啟後,簽核者按下同意時必須填寫意見,未填寫會被擋下;逾時自動同意不受影響。`,label:`核准時意見必填`,name:`approvalRequireComment`,children:(0,f.jsx)(d.Toggle,{checked:e.data.requireApprovalComment===!0,inputProps:{id:`approvalRequireComment`,name:`approvalRequireComment`},onChange:e=>Wr(e.target.checked)})}),(0,f.jsx)(c.t,{hintText:`開啟後可設定簽核期限,逾時將依下方設定處理。`,label:`啟用時效`,name:`slaEnabled`,children:(0,f.jsx)(d.Toggle,{checked:!!A,inputProps:{id:`slaEnabled`,name:`slaEnabled`},onChange:e=>Gr(e.target.checked?w.DEFAULT_SLA_CONFIG:null)})}),A&&!ue?(0,f.jsx)(c.t,{hintText:`此期限混用了日與時,無法在表單中編輯。請改以單一單位設定,或透過 API 維護。`,label:`時效期限`,name:`slaDurationRaw`,children:(0,f.jsx)(d.Input,{disabled:!0,value:A.duration,variant:`base`})}):null,A&&ue?(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(c.t,{label:`時效期限`,name:`slaDurationValue`,required:!0,children:(0,f.jsx)(d.Input,{id:`slaDurationValue`,inputProps:{min:1},inputType:`number`,name:`slaDurationValue`,onChange:e=>Gr(Qo(A,{unit:de,value:Number(e.target.value)})),value:String(ue.value),variant:`base`})}),(0,f.jsx)(c.t,{label:`期限單位`,name:`slaDurationUnit`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>Gr(Qo(A,{unit:qo(e?.id??null),value:ue.value})),options:[...w.SLA_DURATION_UNIT_OPTIONS],value:$(w.SLA_DURATION_UNIT_OPTIONS,de)})})]}):null,A&&de===`DAY`?(0,f.jsx)(c.t,{hintText:`工作日會跳過週末與行事曆上的假日,補班日仍計為工作日;行事曆由系統管理者設定。`,label:`計算方式`,name:`slaCalendar`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>Gr({...A,calendar:Jo(e?.id??null)}),options:[...w.SLA_CALENDAR_MODE_OPTIONS],value:$(w.SLA_CALENDAR_MODE_OPTIONS,A.calendar??`CALENDAR`)})}):null,A?(0,f.jsx)(c.t,{label:`逾時處理`,name:`slaOnTimeout`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>Gr($o(A,Yo(e?.id??null))),options:[...w.SLA_TIMEOUT_ACTION_OPTIONS],value:$(w.SLA_TIMEOUT_ACTION_OPTIONS,A.onTimeout)})}):null,A?.onTimeout===`ESCALATE`?(0,f.jsx)(c.t,{hintText:`逾時後改派給簽核者的上層主管,只會升級一次。`,label:`升級層級`,name:`slaEscalateLevelsUp`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>Gr({...A,escalateLevelsUp:Me(e?.id??null).value}),options:[...Ee],value:pe})}):null,A?(0,f.jsx)(c.t,{hintText:`在期限到達前先送出一次提醒。`,label:`預警提醒`,name:`slaWarningAt`,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>Gr(es(A,Zo(e?.id??null).value)),options:[...Ya],value:fe})}):null,(0,f.jsx)(c.t,{hintText:`關閉後,簽核者在此關卡看不到「拒絕」按鈕。`,label:`允許拒絕`,name:`allowReject`,children:(0,f.jsx)(d.Toggle,{checked:e.data.allowReject,inputProps:{id:`allowReject`,name:`allowReject`},onChange:e=>Yr({allowReject:e.target.checked})})}),(0,f.jsx)(c.t,{hintText:`關閉後,簽核者無法把此關卡的任務轉派給其他人。`,label:`允許轉派`,name:`allowTransfer`,children:(0,f.jsx)(d.Toggle,{checked:e.data.allowTransfer,inputProps:{id:`allowTransfer`,name:`allowTransfer`},onChange:e=>Yr({allowTransfer:e.target.checked})})}),(0,f.jsx)(c.t,{hintText:`開啟後,簽核者可在此關卡臨時加入其他簽核人;會簽為平行處理,加簽則需等加入者簽完才往下。`,label:`允許加簽`,name:`allowAddSigner`,children:(0,f.jsx)(d.Toggle,{checked:e.data.allowAddSigner,inputProps:{id:`allowAddSigner`,name:`allowAddSigner`},onChange:e=>Yr({allowAddSigner:e.target.checked})})}),(0,f.jsx)(c.t,{hintText:`開啟後,申請人本人(含其代理人)不會成為此關的簽核人,也不能被轉簽或加簽到此關。`,label:`申請人不可簽核自己的單`,name:`excludeInitiator`,children:(0,f.jsx)(d.Toggle,{checked:!!M,inputProps:{id:`excludeInitiator`,name:`excludeInitiator`},onChange:e=>Kr(e.target.checked?no:null)})}),M?(0,f.jsx)(c.t,{hintText:ee&&M.whenEmpty===`INITIATOR_MANAGER`?to:void 0,label:`排除後沒有簽核人時`,name:`excludeInitiatorWhenEmpty`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>Kr({whenEmpty:$($a,e?.id??null)?.id??no.whenEmpty}),options:[...$a],value:$($a,M.whenEmpty)})}):null,(0,f.jsx)(c.t,{hintText:`開啟後,實際簽核過所選前面關卡的人(含其代理人)不會成為此關的簽核人,也不能被轉簽或加簽到此關。例:信管審核與會計審核不能是同一人。臨時加簽、會簽的同意者不在此限。`,label:`不可與前面關卡同一人`,name:`excludeNodeActors`,children:(0,f.jsx)(d.Toggle,{checked:!!N,inputProps:{id:`excludeNodeActors`,name:`excludeNodeActors`},onChange:e=>qr(e.target.checked?ro:null)})}),N&&P?(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(c.t,{hintText:P.problems.length>0?P.problems.join(`;`):ar,label:`不能與以下關卡同一人`,name:`excludeNodeActorsNodeIds`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!0,mode:`multiple`,onChange:e=>qr({...N,nodeIds:e.map(e=>e.id)}),options:[...P.options],overflowStrategy:`wrap`,placeholder:`選擇前面的簽核關卡`,value:[...P.selected]})}),(0,f.jsx)(c.t,{hintText:ee&&N.whenEmpty===`INITIATOR_MANAGER`?to:void 0,label:`排除後沒有簽核人時`,name:`excludeNodeActorsWhenEmpty`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>qr({...N,whenEmpty:$($a,e?.id??null)?.id??ro.whenEmpty}),options:[...$a],value:$($a,N.whenEmpty)})})]}):null,(0,f.jsx)(Un,{definition:L,language:j,node:e,onOpenMatrix:()=>nn(!0),onRemoveLegacy:()=>{I.dispatch({nodeId:e.id,type:`removeLegacyFieldPermissions`})},openDisabledReason:Z===null?Aa:null})]})}function fi(e){let t=e.data.action,n=ci(t),r=li(n),i=r.readOnly&&r.hint?`目前知會對象為「${Pe(n,W,G,K,Z)}${n.type===`EXPRESSION`?`:${n.expression}`:``}」。${r.hint}`:r.hint,a=Ks(t).map(e=>Be(W,e)),o=n.type===`ORG_UNIT_MEMBER`||n.type===`ORG_UNIT_POSITION`||n.type===`ORG_UNIT_MANAGER`?Re(G,n.orgUnitId):null,l=n.type===`POSITION`||n.type===`ORG_UNIT_POSITION`?ze(K,n.positionId):null,u=gr(Yt,le),p=n.type===`POSITION`&&!!n.positionId&&!u.has(n.positionId),m=K.filter(e=>u.has(e.id)||p&&e.id===n.positionId),h=n.type===`ORG_UNIT_POSITION`?_r({date:le,includeDescendants:!!n.includeDescendants,memberships:Yt,orgUnitId:n.orgUnitId,orgUnits:G,positions:K}):[],g=vr({orgUnitId:n.type===`ORG_UNIT_POSITION`?n.orgUnitId:``,positionId:n.type===`ORG_UNIT_POSITION`?n.positionId:``,positions:K,scopedPositions:h}),_=n.type===`DYNAMIC_FORM`?he(Z,n.formPath):null;function v(e){Zr(di(t,e))}function y(e){t.type===`NOTIFY`&&Zr({...t,webhooks:e})}let b=(0,f.jsx)(c.t,{label:`系統動作`,name:`serviceActionType`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>{e&&e.id!==t.type&&Zr(e.id===`SET_FORM_FIELD`?{fieldPath:``,type:`SET_FORM_FIELD`,value:``}:{channels:[`IN_APP`],recipients:{memberIds:[],type:`DIRECT`},type:`NOTIFY`})},options:[...so],value:$(so,t.type)})});if(t.type===`SET_FORM_FIELD`){let e=Rs(X?.schema??null),n=t.fieldPath.replace(/^form\./u,``);return(0,f.jsxs)(f.Fragment,{children:[b,(0,f.jsx)(c.t,{label:`寫入欄位`,name:`serviceFieldPath`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>Zr({...t,fieldPath:e?.id??``}),options:[...e],placeholder:X?`選擇欄位`:`請先綁定表單版本`,value:$(e,n||null)})}),(0,f.jsx)(Ni,{dialect:B,evaluable:!0,formDefinitionVersionId:R,hintText:`運算結果會寫進上面的欄位;畫面上一律以文字顯示。`,label:`寫入的值`,name:`serviceFieldValue`,onChange:e=>Zr({...t,value:e}),required:!0,targetFieldKey:n||null,usagePoint:`SERVICE_FORM_FIELD_VALUE`,value:t.value})]})}return(0,f.jsxs)(f.Fragment,{children:[b,(0,f.jsx)(c.t,{hintText:i??void 0,label:`知會對象來源`,name:`notifyRecipientType`,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>{let t=ui(n,e?.id??null,K);t&&v(t)},options:[...r.options],value:r.selected})}),n.type===`DIRECT`?(0,f.jsx)(c.t,{hintText:t.type===`NOTIFY`?`可只設定 Webhook,不指定知會對象。`:void 0,label:`知會對象`,name:`notifyMemberIds`,children:(0,f.jsx)(d.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的成員`,loading:Ft,loadingText:`搜尋成員中...`,mode:`multiple`,onChange:e=>v({memberIds:e.map(e=>e.id),type:`DIRECT`}),onSearch:xr,onVisibilityChange:e=>{e&&(Ut([]),xr(``))},options:[...ks(a,Ht)],overflowStrategy:`wrap`,placeholder:`搜尋姓名或信箱`,searchDebounceTime:300,value:[...a]})}):null,n.type===`DYNAMIC_FORM`?(0,f.jsx)(c.t,{hintText:_?.problem??`知會對象取自申請人送出表單時在該欄位選的人員。`,label:`表單欄位`,name:`notifyFormPath`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:e=>v(gi(n,e?.id??``)),options:[..._?.options??[]],placeholder:`選擇人員選擇欄位`,value:_?.selected??void 0})}):null,n.type===`ORG_UNIT_MEMBER`||n.type===`ORG_UNIT_POSITION`||n.type===`ORG_UNIT_MANAGER`?(0,f.jsx)(c.t,{hintText:n.type===`ORG_UNIT_MANAGER`?`依指定組織或其上層的主管解析規則決定知會對象;組織沒有主管、也沒有設定替代人時,流程走到這個知會節點會送出失敗。`:`依指定組織目前有效會員歸屬決定知會對象。`,label:`組織`,name:`notifyOrgUnitId`,required:!0,children:(0,f.jsx)(s.n,{name:`notifyOrgUnitId`,onChange:e=>v(pi(n,e?.id??``)),orgUnits:G,placeholder:`選擇組織`,value:o})}):null,n.type===`ORG_UNIT_MEMBER`||n.type===`ORG_UNIT_POSITION`?(0,f.jsx)(c.t,{label:`包含下層`,name:`notifyIncludeDescendants`,children:(0,f.jsx)(d.Toggle,{checked:!!n.includeDescendants,inputProps:{id:`notifyIncludeDescendants`,name:`notifyIncludeDescendants`},onChange:e=>v(mi(n,e.target.checked))})}):null,n.type===`POSITION`?(0,f.jsx)(c.t,{hintText:p?`這個職位目前沒有任何有效歸屬的會員,送出時會找不到收件人,請改選其他職位。`:`通知目前有效歸屬中擁有此職位的會員。`,label:`職位`,name:`notifyPositionId`,required:!0,children:(0,f.jsx)(s.r,{name:`notifyPositionId`,onChange:e=>v(hi(n,e?.id??``)),placeholder:`選擇職位`,positions:m,value:l})}):null,n.type===`ORG_UNIT_POSITION`?(0,f.jsx)(c.t,{hintText:g.isInactive?ta:`只通知指定組織範圍內擁有此職位的有效會員。`,label:`職位`,name:`notifyOrgUnitPositionId`,required:!0,children:(0,f.jsx)(s.r,{disabled:!n.orgUnitId.trim(),name:`notifyOrgUnitPositionId`,onChange:e=>v(hi(n,e?.id??``)),placeholder:n.orgUnitId.trim()?`選擇職位`:`請先選擇組織`,positions:g.options,value:l})}):null,t.type===`NOTIFY`&&!Ar(t.webhooks)?(0,f.jsxs)(`div`,{style:ga,children:[(0,f.jsx)(d.Typography,{color:`text-warning`,variant:`body`,children:`這個節點的 Webhook 設定格式錯誤,無法在此編輯。清除後可重新新增。`}),(0,f.jsx)(`div`,{children:(0,f.jsx)(d.Button,{onClick:()=>y([]),variant:`destructive-secondary`,children:`清除 Webhook 設定`})})]}):null,t.type===`NOTIFY`&&Ar(t.webhooks)?(0,f.jsx)(Ur,{catalog:pn,catalogState:hn,formFields:Z?.fields??null,onChange:y,targets:(0,w.readNotifyWebhookTargets)(t)}):null]})}function _i(e){return(0,f.jsxs)(`div`,{style:ga,children:[(0,f.jsx)(d.Typography,{component:`h2`,variant:`h3`,children:`已選取線段`}),(0,f.jsxs)(d.Typography,{color:`text-neutral`,variant:`body`,children:[`已選取 `,e.length,` 條線段,可使用 Delete 或控制面板刪除。`]})]})}function vi(e){let t=Ws(e,L.nodes);return(0,f.jsxs)(`div`,{style:ga,children:[(0,f.jsx)(d.Typography,{component:`h2`,variant:`h3`,children:t?`條件設定`:`線段屬性`}),(0,f.jsxs)(d.Typography,{color:`text-neutral`,variant:`body`,children:[e.source,` → `,e.target]}),t?bi(e):(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`body`,children:`這條線會直接把流程送到下一個節點。`})]})}function yi(e){return!e||!Ws(e,L.nodes)?null:(0,f.jsx)(d.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!e.data.isDefault&&!e.data.condition},confirmText:`完成`,modalType:`standard`,onCancel:Lr,onClose:Lr,onConfirm:Lr,open:!!Fe,showModalFooter:!0,showModalHeader:!0,size:`regular`,supportingText:`條件分流的輸出連線需要指定條件,條件會直接顯示在線上。`,title:`條件設定`,children:bi(e)})}function bi(e){let t=Hs(e,L.nodes),n=Rs(X?.schema??null),r=zs(X?.schema??null,e.data.conditionFieldKey??null),i=(0,w.readConditionOperatorOptionsForField)(r),a=Bs(r),o=$(i,e.data.conditionOperator??null),s=!e.data.isDefault&&!e.data.condition,l=!e.data.isDefault&&(xe===e.id||Bi(e));return(0,f.jsxs)(`div`,{style:ga,children:[(0,f.jsxs)(d.Typography,{color:`text-neutral`,variant:`body`,children:[`畫布上的這條線目前會顯示「`,(0,f.jsx)(`span`,{style:{color:s?fa:void 0},children:t??`請設定條件`}),`」。`]}),(0,f.jsx)(d.Toggle,{checked:!!e.data.isDefault,inputProps:{"aria-label":`其他情況走這條`},label:`其他情況走這條`,onChange:t=>ei(e.id,t.target.checked)}),e.data.isDefault?null:(0,f.jsx)(d.Toggle,{checked:l,inputProps:{"aria-label":`進階:自訂運算式`},label:`進階:自訂運算式`,onChange:t=>{t.target.checked?(Se(e.id),Ue(t=>Vi(t,e.id,e.data.condition??``))):(Se(null),ti({edgeId:e.id,fieldKey:null,operator:null,value:null}))}}),l?(0,f.jsx)(Ni,{dialect:B,edgeSourceNodeType:Hi(L,e.id),evaluable:!0,formDefinitionVersionId:R,hintText:`結構化條件(欄位+判斷+值)能表達時請優先使用;這裡的運算式由後端檢查。`,label:`條件運算式`,name:`edgeConditionExpression`,onChange:t=>Ue(n=>Vi(n,e.id,t)),required:!0,usagePoint:`FLOW_CONDITION`,value:e.data.condition??``}):null,e.data.isDefault?(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`body`,children:`其他條件都不符合時,流程會走這條線。`}):l?null:(0,f.jsxs)(f.Fragment,{children:[X?null:(0,f.jsx)(d.Typography,{color:`text-neutral`,variant:`body`,children:`請先綁定表單版本,才能選擇條件欄位。`}),(0,f.jsx)(c.t,{label:`條件欄位`,name:`edgeConditionField`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:t=>ti({edgeId:e.id,fieldKey:t?.id??null,operator:null,value:null}),options:[...n],placeholder:`選擇條件欄位`,value:$(n,e.data.conditionFieldKey??null)})}),(0,f.jsx)(c.t,{label:`條件判斷`,name:`edgeConditionOperator`,required:!0,children:(0,f.jsx)(d.Select,{clearable:!1,onChange:t=>ti({edgeId:e.id,operator:(0,w.readConditionOperator)(t?.id??null),value:null}),options:[...i],placeholder:`選擇判斷方式`,value:o})}),o&&Vs(o.id)?(0,f.jsx)(c.t,{label:`條件值`,name:`edgeConditionValue`,required:!0,children:a.length>0?(0,f.jsx)(d.Select,{clearable:!1,onChange:t=>ti({edgeId:e.id,value:t?.id??null}),options:[...a],placeholder:`選擇條件值`,value:$(a,e.data.conditionValue??null)}):(0,f.jsx)(d.Input,{onChange:t=>ti({edgeId:e.id,value:t.target.value}),placeholder:`輸入要比對的值`,value:e.data.conditionValue??``,variant:`base`})}):null]})]})}}function yo({onApplyAutoLayout:e}){function t(){e()}return(0,f.jsx)(S.Panel,{position:`top-right`,children:(0,f.jsx)(d.Button,{icon:v.DotGridIcon,iconType:`leading`,onClick:t,size:`sub`,variant:`base-secondary`,children:`自動排版`})})}function bo({data:e,selected:t,type:n}){let r=e.approverLines??[e.approverSummary??e.label],i=xo(e),a=So(n,t);return(0,f.jsxs)(`div`,{style:a,children:[wo(e),(0,f.jsx)(`div`,{style:Ba,children:r.map((e,t)=>(0,f.jsx)(d.Typography,{component:`span`,ellipsis:!0,style:za,title:e,variant:`label-primary`,children:e},`${e}_${t}`))}),(0,f.jsx)(d.Typography,{color:`text-neutral`,component:`span`,ellipsis:!0,style:za,title:i,variant:`caption`,children:i}),e.fieldAccessTag?(0,f.jsx)(`span`,{children:(0,f.jsx)(d.Tag,{label:e.fieldAccessTag,readOnly:!0,size:`minor`})}):null]})}function xo(e){return e.nodeKind===`startEvent`?e.initiatorPolicySummary??`所有人`:e.approverSummary||e.approverLines?e.label:e.nodeKind===`exclusiveGateway`?`條件在線上`:e.nodeKind===`parallelGateway`?`多條路徑同時進行`:Ua[e.nodeKind]}function So(e,t){let n=Co(e);return t?{...n,border:`1px solid var(--mzn-color-primary, #0057ff)`,boxShadow:Ta}:n}function Co(e){return e===`exclusiveGateway`?Pa:e===`parallelGateway`?Fa:e===`startEvent`?La:e===`endEvent`?Ra:e===`userTask`?Ia:wa}function wo(e){return!e.hasInput&&e.hasOutput?(0,f.jsx)(S.Handle,{id:Ha,position:S.Position.Right,type:`source`}):e.hasInput&&!e.hasOutput?(0,f.jsx)(S.Handle,{id:Va,position:S.Position.Left,type:`target`}):!e.hasInput&&!e.hasOutput?null:[(0,f.jsx)(S.Handle,{id:Va,position:S.Position.Left,type:`target`},`target`),(0,f.jsx)(S.Handle,{id:Ha,position:S.Position.Right,type:`source`},`source`)]}function To(e,t,n,r,i,a,o,s){let c=Eo(e);return{data:{approverLines:Ms(e,t,n,r,o),approverSummary:js(e,t,n,r,o,s),fieldAccessTag:e.type===`userTask`?pn(e):null,hasInput:hs(e),hasOutput:gs(e),initiatorPolicySummary:e.type===`startEvent`?us(a,n,r):null,label:e.data.label,nodeKind:e.type},height:c.height,handles:Do(e),id:e.id,initialHeight:c.height,initialWidth:c.width,position:e.position,selected:i,sourcePosition:S.Position.Right,targetPosition:S.Position.Left,type:e.type,width:c.width}}function Eo(e){return e.type===`exclusiveGateway`||e.type===`parallelGateway`?{height:ja,width:Ma}:e.type===`serviceTask`?{height:Ea+(Ns(e.data.action)-1)*Oa,width:Da}:{height:Ea+(e.type===`userTask`&&pn(e)!==null?ka:0),width:Da}}function Do(e){let t=Eo(e);return[...hs(e)?[Oo(t)]:[],...gs(e)?[ko(t)]:[]]}function Oo({height:e}){let t=e/2-9/2;return{height:9,id:Va,position:S.Position.Left,type:`target`,width:9,x:-9/2,y:t}}function ko({height:e,width:t}){let n=e/2-9/2;return{height:9,id:Ha,position:S.Position.Right,type:`source`,width:9,x:t-9/2,y:n}}function Ao(e,t,n){let r=Hs(e,t),i=Ws(e,t),a=i&&!e.data.isDefault&&!e.data.condition,o=a?fa:i?ua:`#475569`,s=a?`#fef2f2`:i?`#eff6ff`:`#ffffff`,c=a?fa:i?ua:da;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?pa:void 0,opacity:1,stroke:da,strokeOpacity:1,strokeWidth:1.5},target:e.target,targetHandle:e.targetHandle,type:e.type??`smoothstep`}}function jo(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 Mo(e){return Io(Po(Fo(No(e))))}function No(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 Po(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 Fo(e){let t=new Set(e.nodes.filter(e=>_s(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 Io(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`?jo(e,`AND`):e);return n.some((t,n)=>t!==e.nodes[n])?{...e,nodes:n}:e}function Lo(){return{edges:[],expressionDialect:`cel-v2`,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 Ro(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 zo(e){let t=new C.graphlib.Graph;return t.setDefaultEdgeLabel(()=>({})),t.setGraph({rankdir:`LR`,ranksep:120}),e.nodes.forEach(e=>{t.setNode(e.id,Eo(e))}),e.edges.forEach(e=>{t.setEdge(e.source,e.target)}),C.layout(t),{...e,nodes:e.nodes.map(e=>{let n=t.node(e.id);return n?{...e,position:{x:n.x-Eo(e).width/2,y:n.y-Eo(e).height/2}}:e})}}function $(e,t){return t?e.find(e=>e.id===t)??null:null}function Bo(e){return e===`OR`?`OR`:`AND`}function Vo(e){return e===`PREVIOUS`||e===`ANY`?e:`INITIATOR`}function Ho(e){return e===`FROM_RETURN_POINT`?`FROM_RETURN_POINT`:`RESTART`}function Uo(e){return e?.type??`SINGLE`}function Wo(e,t){return e===`QUORUM`?t?.type===`QUORUM`?t:{threshold:w.DEFAULT_QUORUM_THRESHOLD,thresholdType:`COUNT`,type:`QUORUM`}:e===`PARALLEL_ALL`||e===`PARALLEL_ANY`||e===`SEQUENTIAL`?{type:e}:{type:`SINGLE`}}function Go(e){return e?.type===`QUORUM`?{threshold:Number.isFinite(e.threshold)?e.threshold:w.DEFAULT_QUORUM_THRESHOLD,thresholdType:Ko(e.thresholdType??null)}:{threshold:w.DEFAULT_QUORUM_THRESHOLD,thresholdType:`COUNT`}}function Ko(e){return e===`PERCENTAGE`?`PERCENTAGE`:`COUNT`}function qo(e){return e===`HOUR`?`HOUR`:`DAY`}function Jo(e){return e===`BUSINESS_DAY`?`BUSINESS_DAY`:`CALENDAR`}function Yo(e){return w.SLA_TIMEOUT_ACTION_OPTIONS.find(t=>t.id===e)?.id??`REMIND`}function Xo(e){return Ya.find(t=>t.value===e)??Ya[0]}function Zo(e){return Ya.find(t=>t.id===e)??Ya[0]}function Qo(e,t){let n=Number.isFinite(t.value)?Math.trunc(t.value):1,r=(0,w.composeSlaDuration)({unit:t.unit,value:n});return{...e,calendar:t.unit===`DAY`?e.calendar??`CALENDAR`:`CALENDAR`,duration:r}}function $o(e,t){return t===`ESCALATE`?{...e,escalateLevelsUp:e.escalateLevelsUp??1,onTimeout:t}:{...ts(e,`escalateLevelsUp`),onTimeout:t}}function es(e,t){return t===null?ts(e,`warningAt`):{...e,warningAt:t}}function ts(e,t){return Object.fromEntries(Object.entries(e).filter(([e])=>e!==t))}function ns(e){return e===`DIRECT`||e===`POSITION`?e:`NONE`}function rs(e){let t=ns(e);return t===`DIRECT`?{memberId:``,type:`DIRECT`}:t===`POSITION`?{positionId:``,type:`POSITION`}:{type:`NONE`}}function is(e){return e===`ORG_UNIT`||e===`ORG_UNIT_POSITION`||e===`NONE`?e:`ALL`}function as(e){let t=e?.trim();if(!t)return{mode:`ALL`,value:``};let n=cs(t,/"([^"]+)" in subject\.orgUnitIds/gu),r=cs(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 os(e,t){let n=as(e);return!t||t===`ALL`||t===`NONE`?t===`ALL`||t===`NONE`?{mode:t,value:``}:n:n.mode===t?n:ds(t)}function ss(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 cs(e,t){return[...e.matchAll(t)].map(e=>e[1]).filter(e=>!!e)}function ls(e,t){if(e.mode===`ALL`||e.mode===`NONE`)return null;let n=e.orgUnitId?.trim()??``;if(!n)return null;let r=yr(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 us(e,t,n){return e.mode===`NONE`?`未設定`:e.mode===`ORG_UNIT`?e.orgUnitId?`組織:${Ie(t,e.orgUnitId)}`:`指定組織`:e.mode===`ORG_UNIT_POSITION`?e.orgUnitId&&e.positionId?`組織職位:${Ie(t,e.orgUnitId)} / ${Le(n,e.positionId)}`:`指定組織職位`:e.mode===`CUSTOM`?`既有自訂規則`:`所有人`}function ds(e){return{includeDescendants:!0,mode:e,orgUnitId:``,positionId:``,value:``}}function fs(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===Ha&&e.targetHandle===Va&&!!(n&&gs(n))&&!!(r&&hs(r))}function ps(e,t){return e.includes(t)?e.filter(e=>e!==t):[...e,t]}function ms(e){return e.type!==`startEvent`&&e.type!==`endEvent`}function hs(e){return e.type!==`startEvent`}function gs(e){return e.type!==`endEvent`&&!_s(e)}function _s(e){return e.type===`serviceTask`&&e.data.action.type===`NOTIFY`}function vs(e){return e instanceof HTMLElement?e.isContentEditable||e.tagName===`INPUT`||e.tagName===`TEXTAREA`||e.tagName===`SELECT`||!!e.closest(`[contenteditable="true"]`):!1}function ys(e){return e.map(e=>({formDefinitionId:e.formDefinitionId,formName:e.formName,id:e.id,name:Xi(e.formName,e.version),schema:e.schema}))}function bs(e){let t=JSON.parse(e);if(!xs(t))throw Error(`表單資料 JSON 必須是物件。`);return t}function xs(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ss(e){return e===`COMPLETED`?`完成`:e===`PASSED`?`通過`:e===`SKIPPED`?`略過`:e===`STOPPED`?`已停止`:e===`WAITING`?`將等待簽核`:e}function Cs(e){return e in Ua?Ua[e]:e}function ws(e,t){return t&&!e.some(e=>e.id===t.id)?[t,...e]:e}function Ts(e){return e.map(e=>({displayName:e.name,email:e.email,id:e.memberId,memberId:e.memberId,name:Fs(e.name,e.email)}))}function Es(e,t,n){let r=t.filter(t=>t.memberId===e&&hr(t,n)),i=r.reduce((e,t)=>e&&Ds(e,t)<=0?e:t,null);return{customFields:{},managerMemberId:`member-002`,memberId:e,orgCode:`HQ`,orgUnitIds:Os(r.map(e=>e.orgUnitId)),positionId:i?.positionId??null,positionIds:Os(r.map(e=>e.positionId)),primaryOrgUnitId:i?.orgUnitId??null,roles:[`manager`]}}function Ds(e,t){return e.isPrimary===t.isPrimary?t.effectiveFrom.localeCompare(e.effectiveFrom):e.isPrimary?-1:1}function Os(e){return e.reduce((e,t)=>t&&!e.includes(t)?[...e,t]:e,[])}function ks(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 As(e){return[...new Set(e.nodes.flatMap(e=>e.type===`userTask`?Ne(e.data.approverResolver):e.type===`serviceTask`?Ks(e.data.action):[]))]}function js(e,t,n,r,i,a){return e.type===`userTask`?Pe(e.data.approverResolver,t,n,r,i,a):null}function Ms(e,t,n,r,i){if(e.type!==`serviceTask`)return null;let a=e.data.action,o=a.type===`NOTIFY`&&a.recipients.type!==`DIRECT`?[Pe(a.recipients,t,n,r,i)]:Ks(a).map(e=>Be(t,e).name),s=(0,w.readNotifyWebhookTargets)(a).length,c=[...o,...s?[`Webhook ${s} 個`]:[]];return c.length?c:[`未指定知會對象`]}function Ns(e){let t=e.type===`NOTIFY`&&e.recipients.type!==`DIRECT`?1:Ks(e).length,n=+!!(0,w.readNotifyWebhookTargets)(e).length;return Math.max(1,t+n)}function Ps(e,t,n){let r=e.nodes.find(e=>e.id===t);return r?.type===`serviceTask`&&r.data.action.type===`NOTIFY`&&Ar(r.data.action.webhooks)?(0,w.readNotifyWebhookTargets)(r.data.action).map(e=>({key:e.id,label:Cr(n,e.endpoint)?.label??Sr(e.endpoint)})):[]}function Fs(e,n){return t.t(e,n)}function Is(e,t){let n=t?.getBoundingClientRect();if(!n||e.nodes.length===0)return null;let r=e.nodes.reduce((e,t)=>{let n=Eo(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,S.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 Ls(e){let t=e.nodes.find(e=>e.type===`userTask`&&!!(0,w.readApproverResolverIssue)(e.data.approverResolver)),n=e.nodes.find(e=>e.type===`userTask`&&!!(0,w.readExcludeInitiatorIssue)(e.data.excludeInitiator)),r=e.nodes.map(e=>e.type===`userTask`?(0,w.readExcludeNodeActorsShapeIssue)(e.data.excludeNodeActors):null).find(e=>e!==null)??null,i=e.nodes.map(e=>(0,w.readNotifyServiceTaskIssue)(e)).find(e=>e!==null)??null,a=e.edges.find(t=>Ws(t,e.nodes)&&!t.data.isDefault&&!t.data.condition),o=e.nodes.find(e=>e.type===`userTask`&&(0,w.isOrgManagerChainDecisionPolicyInvalid)(e.data.approverResolver,e.data.decisionPolicy));return t&&t.type===`userTask`?(0,w.readApproverResolverIssue)(t.data.approverResolver):o&&o.type===`userTask`?`簽核節點「${o.data.label}」使用「沿主管鏈簽核」時,決策方式必須是「依序簽核或全部同意」,否則任一位主管簽完就會結案。`:n&&n.type===`userTask`?(0,w.readExcludeInitiatorIssue)(n.data.excludeInitiator):r||i||(a?`條件分流的每條輸出連線都需要先設定條件。`:null)}function Rs(e){return e?.fields.map(e=>({fieldType:e.type,id:e.fieldKey,name:`${e.label} (${e.fieldKey})`}))??[]}function zs(e,t){return t?e?.fields.find(e=>e.fieldKey===t)??null:null}function Bs(e){return e?e.type===`boolean`?[{id:`true`,name:`是`},{id:`false`,name:`否`}]:(0,b.isFormStaticOptionFieldDefinition)(e)?e.options.map(e=>({id:e.value,name:e.label})):[]:[]}function Vs(e){return io.includes(e)}function Hs(e,t){if(e.data.label)return e.data.label;if(Ws(e,t))return Us(e);if(Gs(e,t))return`同時進行`}function Us(e){return e.data.isDefault?`其他情況`:`請設定條件`}function Ws(e,t){return t.some(t=>t.id===e.source&&t.type===`exclusiveGateway`)}function Gs(e,t){return t.some(t=>t.id===e.source&&t.type===`parallelGateway`)}function Ks(e){return e.type===`NOTIFY`&&e.recipients.type===`DIRECT`?e.recipients.memberIds:[]}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return Gn}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return Ue}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return vo}});
|
|
69
|
+
//# sourceMappingURL=designer-eXw7R9ug.cjs.map
|