@rytass/bpm-core-react 0.16.2 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +54 -6
  3. package/dist/chunks/{compose-DO6n0NJi.js → compose-Crklayzy.js} +2 -2
  4. package/dist/chunks/{compose-DO6n0NJi.js.map → compose-Crklayzy.js.map} +1 -1
  5. package/dist/chunks/{compose-DUH9cQ-L.cjs → compose-DZ7RKvUp.cjs} +2 -2
  6. package/dist/chunks/{compose-DUH9cQ-L.cjs.map → compose-DZ7RKvUp.cjs.map} +1 -1
  7. package/dist/chunks/{delegations-BLzYnOae.cjs → delegations-V9HIe3_P.cjs} +2 -2
  8. package/dist/chunks/delegations-V9HIe3_P.cjs.map +1 -0
  9. package/dist/chunks/{delegations-_b4_xBit.js → delegations-xUt1tj8d.js} +2 -1
  10. package/dist/chunks/{delegations-_b4_xBit.js.map → delegations-xUt1tj8d.js.map} +1 -1
  11. package/dist/chunks/{designer-B-cfiob9.js → designer-D9eFma1W.js} +1002 -948
  12. package/dist/chunks/designer-D9eFma1W.js.map +1 -0
  13. package/dist/chunks/designer-sJGTGYOf.cjs +65 -0
  14. package/dist/chunks/designer-sJGTGYOf.cjs.map +1 -0
  15. package/dist/chunks/detail-DRCTnuKm.cjs +2 -0
  16. package/dist/chunks/detail-DRCTnuKm.cjs.map +1 -0
  17. package/dist/chunks/{detail-C6NdVijG.js → detail-DScLf42P.js} +183 -156
  18. package/dist/chunks/detail-DScLf42P.js.map +1 -0
  19. package/dist/chunks/{orgs-Bpp1U60k.js → orgs-CY0i1fie.js} +583 -543
  20. package/dist/chunks/orgs-CY0i1fie.js.map +1 -0
  21. package/dist/chunks/orgs-Dr0FFoZo.cjs +2 -0
  22. package/dist/chunks/orgs-Dr0FFoZo.cjs.map +1 -0
  23. package/dist/chunks/users-BCyePbwB.js +422 -0
  24. package/dist/chunks/users-BCyePbwB.js.map +1 -0
  25. package/dist/chunks/users-DVBJluFR.cjs +2 -0
  26. package/dist/chunks/users-DVBJluFR.cjs.map +1 -0
  27. package/dist/pages/admin/delegations/index.cjs +1 -1
  28. package/dist/pages/admin/delegations/index.js +1 -1
  29. package/dist/pages/admin/orgs/index.cjs +1 -1
  30. package/dist/pages/admin/orgs/index.js +1 -1
  31. package/dist/pages/admin/users/index.cjs +1 -1
  32. package/dist/pages/admin/users/index.js +1 -1
  33. package/dist/pages/instances/detail/index.cjs +1 -1
  34. package/dist/pages/instances/detail/index.js +1 -1
  35. package/dist/pages/templates/compose/index.cjs +1 -1
  36. package/dist/pages/templates/compose/index.js +1 -1
  37. package/dist/pages/templates/designer/index.cjs +1 -1
  38. package/dist/pages/templates/designer/index.js +1 -1
  39. package/dist/views/admin/delegations/index.cjs +1 -1
  40. package/dist/views/admin/delegations/index.js +1 -1
  41. package/dist/views/admin/index.cjs +1 -1
  42. package/dist/views/admin/index.js +3 -3
  43. package/dist/views/admin/orgs/index.cjs +1 -1
  44. package/dist/views/admin/orgs/index.js +1 -1
  45. package/dist/views/admin/users/MemberTaskReassignModal.d.ts +13 -0
  46. package/dist/views/admin/users/index.cjs +1 -1
  47. package/dist/views/admin/users/index.js +1 -1
  48. package/dist/views/instances/detail/index.cjs +1 -1
  49. package/dist/views/instances/detail/index.js +1 -1
  50. package/dist/views/templates/compose/index.cjs +1 -1
  51. package/dist/views/templates/compose/index.js +1 -1
  52. package/dist/views/templates/designer/index.cjs +1 -1
  53. package/dist/views/templates/designer/index.js +1 -1
  54. package/package.json +3 -3
  55. package/dist/chunks/delegations-BLzYnOae.cjs.map +0 -1
  56. package/dist/chunks/designer-2YvjP_GU.cjs +0 -65
  57. package/dist/chunks/designer-2YvjP_GU.cjs.map +0 -1
  58. package/dist/chunks/designer-B-cfiob9.js.map +0 -1
  59. package/dist/chunks/detail-C6NdVijG.js.map +0 -1
  60. package/dist/chunks/detail-DKobK4Cg.cjs +0 -2
  61. package/dist/chunks/detail-DKobK4Cg.cjs.map +0 -1
  62. package/dist/chunks/orgs-Bpp1U60k.js.map +0 -1
  63. package/dist/chunks/orgs-ywaE1_02.cjs +0 -2
  64. package/dist/chunks/orgs-ywaE1_02.cjs.map +0 -1
  65. package/dist/chunks/users-BSVo_eNe.js +0 -215
  66. package/dist/chunks/users-BSVo_eNe.js.map +0 -1
  67. package/dist/chunks/users-DFSBTDMy.cjs +0 -2
  68. package/dist/chunks/users-DFSBTDMy.cjs.map +0 -1
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/detail-DKobK4Cg.cjs");let t=require("react/jsx-runtime");var n={title:`案件詳情 | BPM Admin`};async function r({params:n}){let{id:r}=await n;return(0,t.jsx)(e.t,{instanceId:r})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/detail-DRCTnuKm.cjs");let t=require("react/jsx-runtime");var n={title:`案件詳情 | BPM Admin`};async function r({params:n}){let{id:r}=await n;return(0,t.jsx)(e.t,{instanceId:r})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../chunks/detail-C6NdVijG.js";
1
+ import { t as e } from "../../../chunks/detail-DScLf42P.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/instances/detail/index.tsx
4
4
  var n = { title: "案件詳情 | BPM Admin" };
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/compose-DUH9cQ-L.cjs");let t=require("react/jsx-runtime"),n=require("next/server");var r={title:`建立模板(表單 + 流程) | BPM Admin`,description:`以精靈式流程一次完成 BPM 表單與簽核流程設計並發佈。`};async function i(){return await(0,n.connection)(),(0,t.jsx)(e.t,{aiAssistantAvailable:!!process.env.OPENAI_API_KEY,showAiAssistant:process.env.BPM_AI_ASSISTANT_ENABLED===`true`})}exports.default=i,exports.metadata=r;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/compose-DZ7RKvUp.cjs");let t=require("react/jsx-runtime"),n=require("next/server");var r={title:`建立模板(表單 + 流程) | BPM Admin`,description:`以精靈式流程一次完成 BPM 表單與簽核流程設計並發佈。`};async function i(){return await(0,n.connection)(),(0,t.jsx)(e.t,{aiAssistantAvailable:!!process.env.OPENAI_API_KEY,showAiAssistant:process.env.BPM_AI_ASSISTANT_ENABLED===`true`})}exports.default=i,exports.metadata=r;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../chunks/compose-DO6n0NJi.js";
1
+ import { t as e } from "../../../chunks/compose-Crklayzy.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  import { connection as n } from "next/server";
4
4
  //#region src/pages/templates/compose/index.tsx
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/designer-2YvjP_GU.cjs");let t=require("react/jsx-runtime");var n={title:`流程設計器 | BPM Admin`,description:`以視覺化設計器編輯 BPM 簽核流程節點、條件與發佈版本。`};async function r({params:n}){let{id:r}=await n;return(0,t.jsx)(e.t,{aiAssistantAvailable:!!process.env.OPENAI_API_KEY,showAiAssistant:process.env.BPM_AI_ASSISTANT_ENABLED===`true`,showDryRun:process.env.BPM_TEMPLATE_DRY_RUN_ENABLED!==`false`,templateId:r})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/designer-sJGTGYOf.cjs");let t=require("react/jsx-runtime");var n={title:`流程設計器 | BPM Admin`,description:`以視覺化設計器編輯 BPM 簽核流程節點、條件與發佈版本。`};async function r({params:n}){let{id:r}=await n;return(0,t.jsx)(e.t,{aiAssistantAvailable:!!process.env.OPENAI_API_KEY,showAiAssistant:process.env.BPM_AI_ASSISTANT_ENABLED===`true`,showDryRun:process.env.BPM_TEMPLATE_DRY_RUN_ENABLED!==`false`,templateId:r})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../chunks/designer-B-cfiob9.js";
1
+ import { t as e } from "../../../chunks/designer-D9eFma1W.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/templates/designer/index.tsx
4
4
  var n = {
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/delegations-BLzYnOae.cjs");exports.AdminDelegationsView=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/delegations-V9HIe3_P.cjs");exports.AdminDelegationsView=e.t;
@@ -1 +1 @@
1
- export { t as AdminDelegationsView } from "../../../chunks/delegations-_b4_xBit.js";
1
+ export { t as AdminDelegationsView } from "../../../chunks/delegations-xUt1tj8d.js";
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/users-DFSBTDMy.cjs"),t=require("../../chunks/orgs-ywaE1_02.cjs"),n=require("../../chunks/delegations-BLzYnOae.cjs"),r=require("./webhook-endpoints/index.cjs");exports.AdminDelegationsView=n.t,exports.AdminOrgsView=t.t,exports.AdminUsersView=e.t,exports.AdminWebhookEndpointsView=r.AdminWebhookEndpointsView;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/users-DVBJluFR.cjs"),t=require("../../chunks/orgs-Dr0FFoZo.cjs"),n=require("../../chunks/delegations-V9HIe3_P.cjs"),r=require("./webhook-endpoints/index.cjs");exports.AdminDelegationsView=n.t,exports.AdminOrgsView=t.t,exports.AdminUsersView=e.t,exports.AdminWebhookEndpointsView=r.AdminWebhookEndpointsView;
@@ -1,5 +1,5 @@
1
- import { t as e } from "../../chunks/users-BSVo_eNe.js";
2
- import { t } from "../../chunks/orgs-Bpp1U60k.js";
3
- import { t as n } from "../../chunks/delegations-_b4_xBit.js";
1
+ import { t as e } from "../../chunks/users-BCyePbwB.js";
2
+ import { t } from "../../chunks/orgs-CY0i1fie.js";
3
+ import { t as n } from "../../chunks/delegations-xUt1tj8d.js";
4
4
  import { AdminWebhookEndpointsView as r } from "./webhook-endpoints/index.js";
5
5
  export { n as AdminDelegationsView, t as AdminOrgsView, e as AdminUsersView, r as AdminWebhookEndpointsView };
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/orgs-ywaE1_02.cjs");exports.AdminOrgsView=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/orgs-Dr0FFoZo.cjs");exports.AdminOrgsView=e.t;
@@ -1 +1 @@
1
- export { t as AdminOrgsView } from "../../../chunks/orgs-Bpp1U60k.js";
1
+ export { t as AdminOrgsView } from "../../../chunks/orgs-CY0i1fie.js";
@@ -0,0 +1,13 @@
1
+ import { ReactElement } from 'react';
2
+ import { MemberProfileRecord } from '@rytass/bpm-core-client';
3
+ /**
4
+ * Administrator reassignment of a member's open tasks. Lists what the member
5
+ * holds, takes a target and a reason, previews every task's outcome (dry run),
6
+ * and only then commits. Confirm stays disabled until the preview matches the
7
+ * current target and reason. Replacing a seat is not a decision: no signature
8
+ * is written, and the task keeps its id.
9
+ */
10
+ export declare function MemberTaskReassignModal({ member, onClose, }: {
11
+ readonly member: MemberProfileRecord | null;
12
+ readonly onClose: () => void;
13
+ }): ReactElement;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/users-DFSBTDMy.cjs");exports.AdminUsersView=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/users-DVBJluFR.cjs");exports.AdminUsersView=e.t;
@@ -1 +1 @@
1
- export { t as AdminUsersView } from "../../../chunks/users-BSVo_eNe.js";
1
+ export { t as AdminUsersView } from "../../../chunks/users-BCyePbwB.js";
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/detail-DKobK4Cg.cjs");exports.InstanceAttachmentsSection=e.o,exports.InstanceDetailView=e.t,exports.InstanceFormSection=e.s,exports.InstanceHistorySection=e.r,exports.InstanceSignaturesSection=e.i,exports.InstanceTasksSection=e.a,exports.InstanceWebhookDeliveriesSection=e.n;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/detail-DRCTnuKm.cjs");exports.InstanceAttachmentsSection=e.o,exports.InstanceDetailView=e.t,exports.InstanceFormSection=e.s,exports.InstanceHistorySection=e.r,exports.InstanceSignaturesSection=e.i,exports.InstanceTasksSection=e.a,exports.InstanceWebhookDeliveriesSection=e.n;
@@ -1 +1 @@
1
- export { o as InstanceAttachmentsSection, t as InstanceDetailView, s as InstanceFormSection, r as InstanceHistorySection, i as InstanceSignaturesSection, a as InstanceTasksSection, n as InstanceWebhookDeliveriesSection } from "../../../chunks/detail-C6NdVijG.js";
1
+ export { o as InstanceAttachmentsSection, t as InstanceDetailView, s as InstanceFormSection, r as InstanceHistorySection, i as InstanceSignaturesSection, a as InstanceTasksSection, n as InstanceWebhookDeliveriesSection } from "../../../chunks/detail-DScLf42P.js";
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/compose-DUH9cQ-L.cjs");exports.EMPTY_COMPOSE_FORM_SCHEMA=e.n,exports.EMPTY_COMPOSE_FORM_UI_SCHEMA=e.r,exports.TemplateComposeWizardView=e.t,exports.useTemplateComposeWizard=e.i;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/compose-DZ7RKvUp.cjs");exports.EMPTY_COMPOSE_FORM_SCHEMA=e.n,exports.EMPTY_COMPOSE_FORM_UI_SCHEMA=e.r,exports.TemplateComposeWizardView=e.t,exports.useTemplateComposeWizard=e.i;
@@ -1 +1 @@
1
- export { n as EMPTY_COMPOSE_FORM_SCHEMA, r as EMPTY_COMPOSE_FORM_UI_SCHEMA, t as TemplateComposeWizardView, i as useTemplateComposeWizard } from "../../../chunks/compose-DO6n0NJi.js";
1
+ export { n as EMPTY_COMPOSE_FORM_SCHEMA, r as EMPTY_COMPOSE_FORM_UI_SCHEMA, t as TemplateComposeWizardView, i as useTemplateComposeWizard } from "../../../chunks/compose-Crklayzy.js";
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/designer-2YvjP_GU.cjs");exports.TemplateDesignerView=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/designer-sJGTGYOf.cjs");exports.TemplateDesignerView=e.t;
@@ -1 +1 @@
1
- export { t as TemplateDesignerView } from "../../../chunks/designer-B-cfiob9.js";
1
+ export { t as TemplateDesignerView } from "../../../chunks/designer-D9eFma1W.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rytass/bpm-core-react",
3
- "version": "0.16.2",
3
+ "version": "0.17.0",
4
4
  "description": "BPM approval workflow React components and views for the Rytass BPM stack. Ships AuthProvider, NotificationDrawer + bell widget, host-facing hooks (useBPMMember / useBPMLogout / useBPMRoutes), and full page-body views for inbox / instances / templates / forms / admin / settings on top of Mezzanine UI and the BPM client functions. The host owns the navigation shell — BPM does not bundle a layout.",
5
5
  "keywords": [
6
6
  "bpm",
@@ -296,8 +296,8 @@
296
296
  "@mezzanine-ui/core": ">=1.0.0",
297
297
  "@mezzanine-ui/icons": ">=1.0.0",
298
298
  "@mezzanine-ui/react": ">=1.0.0",
299
- "@rytass/bpm-core-client": "^0.16.2",
300
- "@rytass/bpm-core-shared": "^0.16.2",
299
+ "@rytass/bpm-core-client": "^0.17.0",
300
+ "@rytass/bpm-core-shared": "^0.17.0",
301
301
  "@uiw/react-codemirror": ">=4.0.0",
302
302
  "@xyflow/react": ">=12.0.0",
303
303
  "ai": ">=6.0.0",
@@ -1 +0,0 @@
1
- {"version":3,"file":"delegations-BLzYnOae.cjs","names":["FormFieldLayout","useAuth","useState","useCallback","listDelegationRulesPage","searchMembers","useMemo","Typography","formatDateTime","revokeDelegationRule","listApprovalTemplates","createDelegationRule","_Fragment","PageHeader","ContentHeader","Button","PlusIcon","SectionGroup","Section","FilterArea","styles","FilterLine","Filter","FormField","Select","Tab","TabItem","Table","Modal","BPMFormField","AutoComplete","Input","DateTimePicker","formatMemberLabel","Tooltip","Badge","require_rolldown_runtime","require_auth_provider","require_format_date_time","require_bpm_form_field","require_format_member_label","react","_mezzanine_ui_react","react_jsx_runtime","_rytass_bpm_core_client_workflow","_mezzanine_ui_core_form","_mezzanine_ui_react_ContentHeader","_mezzanine_ui_icons","_rytass_bpm_core_client_template","delegations_module_default","DELEGATION_MODAL_FIELD_LAYOUT","DELEGATION_PAGE_SIZE_OPTIONS","DELEGATION_STATUS_TABS","SCOPE_OPTIONS","SCOPE_FILTER_OPTIONS","AdminDelegationsView","currentMemberId","member","agentMember","setAgentMember","endAt","setEndAt","error","setError","loading","setLoading","memberLoading","setMemberLoading","memberOptions","setMemberOptions","principalFilterMember","setPrincipalFilterMember","agentFilterMember","setAgentFilterMember","modalOpen","setModalOpen","principalMember","setPrincipalMember","priority","setPriority","rulePage","setRulePage","rulePageSize","setRulePageSize","ruleStatus","setRuleStatus","ruleTotalCount","setRuleTotalCount","rules","setRules","saving","setSaving","scopeTemplates","setScopeTemplates","scopeFilterType","setScopeFilterType","scopeType","setScopeType","startAt","setStartAt","templateLoading","setTemplateLoading","templateOptions","setTemplateOptions","refreshRules","rulePageResult","members","readMemberOption","requestError","readErrorMessage","membersById","option","rows","rule","readScopeLabel","selectedScopeType","columns","MemberNameWithEmailTooltip","record","DelegationStatusBadge","handleRevoke","tableActions","handleSearchMembers","searchText","handleSearchTemplates","nextOptions","readTemplateOption","mergeTemplateOptions","selectedOptions","filterTemplateOptions","openCreateModal","closeCreateModal","handleCreate","isInvalidDelegationDateRange","template","MemberAutoCompleteField","readScopeFilterOption","readDelegationStatusTabKey","activeKey","statusTab","page","pageSize","from","to","total","readScopeOptionFromValue","selectedTemplates","readTemplateOptionsFromValue","nextTemplates","currentOptions","open","event","formatDelegationDateTimePickerValue","nextValue","readDelegationDateTimePickerValue","autoComplete","onChange","readMemberOptionFromValue","readUniqueMemberOption","options","onSearch","hideLabel","label","isRecord","value","id","name","email","displayName","tooltipProps","normalizedSearchText","matches","item","availableOptions","currentOption","isSelectableDelegationScopeType","status","date","parseDelegationDateTimeValue","formatDateParts","padDatePart","startDate","endDate","parsedDate","datePart","timePart","year","month","day","hour","minute"],"sources":["../../src/views/admin/delegations/delegations.module.scss","../../src/views/admin/delegations/AdminDelegationsView.tsx"],"sourcesContent":[".delegationModalFields {\n display: grid;\n gap: 12px;\n width: 100%;\n\n :global(.mzn-form-field--horizontal) {\n align-items: flex-start;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label-area) {\n flex: 0 0 112px;\n width: 112px;\n min-width: 112px;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label) {\n flex-wrap: nowrap;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__data-entry) {\n flex: 1 1 auto;\n align-items: stretch;\n min-width: 0;\n max-width: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-auto-complete) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-input),\n :global(.mzn-input-container),\n :global(.mzn-select),\n :global(.mzn-select-trigger),\n :global(.mzn-text-field) {\n width: 100%;\n min-width: 0 !important;\n }\n\n :global(.mzn-select-trigger__input) {\n width: 100%;\n min-width: 0 !important;\n text-overflow: ellipsis;\n }\n}\n\n.delegationFilterArea {\n width: calc(100vw - 272px);\n\n :global(.mzn-filter-area__actions) {\n display: none;\n }\n\n :global(.mzn-filter-area__row) {\n align-items: flex-start;\n }\n\n :global(.mzn-form-field__label-area) {\n display: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-auto-complete) {\n width: 100%;\n }\n}\n\n.memberNameWithTooltip {\n cursor: help;\n text-decoration: underline dotted;\n text-underline-offset: 3px;\n}\n","'use client';\n\nimport {\n ChangeEvent,\n Key,\n ReactElement,\n RefCallback,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n AutoComplete,\n Badge,\n Button,\n DateTimePicker,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Select,\n Tab,\n TabItem,\n Table,\n Tooltip,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport { BPMFormField } from '../../../components/bpm-form-field';\nimport styles from './delegations.module.scss';\nimport { formatDateTime } from '../../../lib/format-date-time';\nimport { useAuth } from '../../../lib/auth-provider';\nimport {\n DelegationRuleRecord,\n DelegationRuleStatus,\n DelegationScopeType,\n MemberProfileRecord,\n createDelegationRule,\n listDelegationRulesPage,\n revokeDelegationRule,\n searchMembers,\n} from '@rytass/bpm-core-client/workflow';\nimport {\n ApprovalTemplateRecord,\n listApprovalTemplates,\n} from '@rytass/bpm-core-client/template';\nimport { formatMemberLabel } from '../../../lib/format-member-label';\n\ntype MemberOption = Readonly<{\n displayName: string;\n email: string | null;\n id: string;\n name: string;\n}>;\n\ntype TemplateOption = Readonly<{\n id: string;\n name: string;\n}>;\n\ntype ScopeOption = Readonly<{\n id: DelegationScopeType;\n name: string;\n}>;\n\ntype ScopeFilterOption = Readonly<{\n id: 'ALL_SCOPES' | DelegationScopeType;\n name: string;\n scopeType: DelegationScopeType | null;\n}>;\n\ntype DelegationRuleRow = Readonly<\n Record<string, unknown> &\n DelegationRuleRecord & {\n agentEmail: string | null;\n agentName: string;\n key: string;\n principalEmail: string | null;\n principalName: string;\n scopeLabel: string;\n }\n>;\n\nconst DELEGATION_MODAL_FIELD_LAYOUT = FormFieldLayout.HORIZONTAL;\nconst DELEGATION_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst DELEGATION_STATUS_TABS: readonly {\n readonly key: DelegationStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'ACTIVE', label: '啟用中' },\n { key: 'REVOKED', label: '已撤銷' },\n { key: 'EXPIRED', label: '已過期' },\n];\n\ntype DelegationStatusTabKey = 'ALL' | DelegationRuleStatus;\n\nconst SCOPE_OPTIONS: readonly ScopeOption[] = [\n { id: 'ALL', name: '全部簽核' },\n { id: 'TEMPLATE_LIST', name: '指定模板' },\n];\n\nconst SCOPE_FILTER_OPTIONS: readonly ScopeFilterOption[] = [\n { id: 'ALL_SCOPES', name: '全部範圍', scopeType: null },\n { id: 'ALL', name: '全部簽核', scopeType: 'ALL' },\n { id: 'TEMPLATE_LIST', name: '指定模板', scopeType: 'TEMPLATE_LIST' },\n];\n\n\nexport function AdminDelegationsView(): ReactElement {\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [agentMember, setAgentMember] = useState<MemberOption | null>(null);\n const [endAt, setEndAt] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [memberLoading, setMemberLoading] = useState(false);\n const [memberOptions, setMemberOptions] = useState<readonly MemberOption[]>(\n [],\n );\n const [principalFilterMember, setPrincipalFilterMember] =\n useState<MemberOption | null>(null);\n const [agentFilterMember, setAgentFilterMember] =\n useState<MemberOption | null>(null);\n const [modalOpen, setModalOpen] = useState(false);\n const [principalMember, setPrincipalMember] = useState<MemberOption | null>(\n null,\n );\n const [priority, setPriority] = useState('100');\n const [rulePage, setRulePage] = useState(1);\n const [rulePageSize, setRulePageSize] = useState(10);\n const [ruleStatus, setRuleStatus] = useState<DelegationStatusTabKey>('ALL');\n const [ruleTotalCount, setRuleTotalCount] = useState(0);\n const [rules, setRules] = useState<readonly DelegationRuleRecord[]>([]);\n const [saving, setSaving] = useState(false);\n const [scopeTemplates, setScopeTemplates] = useState<\n readonly TemplateOption[]\n >([]);\n const [scopeFilterType, setScopeFilterType] = useState<ScopeFilterOption>(\n SCOPE_FILTER_OPTIONS[0],\n );\n const [scopeType, setScopeType] = useState<ScopeOption>(SCOPE_OPTIONS[0]);\n const [startAt, setStartAt] = useState('');\n const [templateLoading, setTemplateLoading] = useState(false);\n const [templateOptions, setTemplateOptions] = useState<\n readonly TemplateOption[]\n >([]);\n\n const refreshRules = useCallback(async (): Promise<void> => {\n setLoading(true);\n setError(null);\n\n try {\n const [rulePageResult, members] = await Promise.all([\n listDelegationRulesPage({\n agentMemberId: agentFilterMember?.id ?? null,\n includeInactive: true,\n page: rulePage,\n pageSize: rulePageSize,\n principalMemberId: principalFilterMember?.id ?? null,\n scopeType: scopeFilterType.scopeType,\n status: ruleStatus === 'ALL' ? null : ruleStatus,\n }),\n searchMembers(''),\n ]);\n\n setRules(rulePageResult.rules);\n setRuleTotalCount(rulePageResult.totalCount);\n setMemberOptions(members.map(readMemberOption));\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, [\n agentFilterMember,\n principalFilterMember,\n rulePage,\n rulePageSize,\n ruleStatus,\n scopeFilterType,\n ]);\n\n useEffect((): void => {\n void refreshRules();\n }, [refreshRules]);\n\n const membersById = useMemo(\n (): ReadonlyMap<string, MemberOption> =>\n new Map(memberOptions.map((option) => [option.id, option])),\n [memberOptions],\n );\n const rows = useMemo(\n (): DelegationRuleRow[] =>\n rules.map((rule) => ({\n ...rule,\n agentEmail: membersById.get(rule.agentMemberId)?.email ?? null,\n agentName:\n membersById.get(rule.agentMemberId)?.displayName ??\n rule.agentMemberId,\n key: rule.id,\n principalEmail: membersById.get(rule.principalMemberId)?.email ?? null,\n principalName:\n membersById.get(rule.principalMemberId)?.displayName ??\n rule.principalMemberId,\n scopeLabel: readScopeLabel(rule),\n })),\n [membersById, rules],\n );\n const selectedScopeType =\n SCOPE_OPTIONS.find((option) => option.id === scopeType.id) ??\n SCOPE_OPTIONS[0];\n const columns = useMemo(\n (): TableColumn<DelegationRuleRow>[] => [\n {\n key: 'principal',\n render: (record: DelegationRuleRow): ReactElement => (\n <MemberNameWithEmailTooltip\n email={record.principalEmail}\n name={record.principalName}\n />\n ),\n title: '原簽核人',\n width: 220,\n },\n {\n key: 'agent',\n render: (record: DelegationRuleRow): ReactElement => (\n <MemberNameWithEmailTooltip\n email={record.agentEmail}\n name={record.agentName}\n />\n ),\n title: '代理人',\n width: 220,\n },\n { dataIndex: 'scopeLabel', key: 'scope', title: '代理範圍', width: 220 },\n {\n key: 'status',\n render: (record: DelegationRuleRow): ReactElement => (\n <DelegationStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n { dataIndex: 'priority', key: 'priority', title: '優先序', width: 100 },\n {\n key: 'startAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(record.startAt)}\n </Typography>\n ),\n title: '開始時間',\n width: 220,\n },\n {\n key: 'endAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {record.endAt ? formatDateTime(record.endAt) : '-'}\n </Typography>\n ),\n title: '結束時間',\n width: 220,\n },\n ],\n [],\n );\n const handleRevoke = useCallback(\n async (id: string): Promise<void> => {\n if (!currentMemberId) {\n return;\n }\n\n setError(null);\n\n try {\n await revokeDelegationRule({\n id,\n revokedByMemberId: currentMemberId,\n });\n await refreshRules();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n }\n },\n [currentMemberId, refreshRules],\n );\n const tableActions = useMemo(\n (): TableActions<DelegationRuleRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<DelegationRuleRow>['render']> =>\n record.status === 'ACTIVE'\n ? [\n {\n name: '撤銷',\n onClick: (): void => void handleRevoke(record.id),\n },\n ]\n : [],\n variant: 'destructive-secondary',\n width: 88,\n }),\n [handleRevoke],\n );\n\n async function handleSearchMembers(searchText: string): Promise<void> {\n setMemberLoading(true);\n\n try {\n setMemberOptions((await searchMembers(searchText)).map(readMemberOption));\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setMemberLoading(false);\n }\n }\n\n async function handleSearchTemplates(\n searchText: string,\n selectedOptions: readonly TemplateOption[] = scopeTemplates,\n ): Promise<void> {\n setTemplateLoading(true);\n\n try {\n const nextOptions = (await listApprovalTemplates()).map(\n readTemplateOption,\n );\n\n setTemplateOptions(\n mergeTemplateOptions(\n selectedOptions,\n filterTemplateOptions(nextOptions, searchText),\n ),\n );\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setTemplateLoading(false);\n }\n }\n\n function openCreateModal(): void {\n setAgentMember(null);\n setEndAt('');\n setPrincipalMember(null);\n setPriority('100');\n setScopeTemplates([]);\n setScopeType(SCOPE_OPTIONS[0]);\n setStartAt('');\n setTemplateOptions([]);\n void handleSearchTemplates('', []);\n setModalOpen(true);\n }\n\n function closeCreateModal(): void {\n if (saving) {\n return;\n }\n\n setModalOpen(false);\n }\n\n async function handleCreate(): Promise<void> {\n if (!currentMemberId) {\n return;\n }\n\n if (!principalMember || !agentMember) {\n setError('請選擇原簽核人與代理人');\n return;\n }\n\n if (selectedScopeType.id === 'TEMPLATE_LIST' && scopeTemplates.length < 1) {\n setError('請選擇至少一個簽核模板');\n return;\n }\n\n if (isInvalidDelegationDateRange(startAt, endAt)) {\n setError('結束時間必須晚於起始時間');\n return;\n }\n\n setSaving(true);\n setError(null);\n\n try {\n await createDelegationRule({\n agentMemberId: agentMember.id,\n createdByMemberId: currentMemberId,\n endAt: endAt || null,\n principalMemberId: principalMember.id,\n priority: Number(priority) || 100,\n requiresConfirmation: false,\n scopeConditionCel: null,\n scopeTemplateIds:\n selectedScopeType.id === 'TEMPLATE_LIST'\n ? scopeTemplates.map((template) => template.id)\n : [],\n scopeType: selectedScopeType.id,\n startAt: startAt || null,\n });\n setModalOpen(false);\n if (rulePage === 1) {\n await refreshRules();\n } else {\n setRulePage(1);\n }\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <>\n <PageHeader>\n <ContentHeader\n description=\"設定簽核代理規則,讓符合範圍的待簽任務自動改派給代理人。\"\n title=\"代理設定\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={openCreateModal}\n variant=\"base-primary\"\n >\n 建立代理\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.delegationFilterArea}>\n <FilterLine>\n <Filter span={2}>\n <MemberAutoCompleteField\n hideLabel\n label=\"原簽核人\"\n loading={memberLoading}\n name=\"principalFilterMemberId\"\n onChange={(option): void => {\n setPrincipalFilterMember(option);\n setRulePage(1);\n }}\n onSearch={handleSearchMembers}\n options={memberOptions}\n required={false}\n layout={FormFieldLayout.VERTICAL}\n size=\"sub\"\n value={principalFilterMember}\n />\n </Filter>\n <Filter span={2}>\n <MemberAutoCompleteField\n hideLabel\n label=\"代理人\"\n loading={memberLoading}\n name=\"agentFilterMemberId\"\n onChange={(option): void => {\n setAgentFilterMember(option);\n setRulePage(1);\n }}\n onSearch={handleSearchMembers}\n options={memberOptions}\n required={false}\n layout={FormFieldLayout.VERTICAL}\n size=\"sub\"\n value={agentFilterMember}\n />\n </Filter>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"scopeFilterType\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => {\n setScopeFilterType(readScopeFilterOption(option));\n setRulePage(1);\n }}\n options={[...SCOPE_FILTER_OPTIONS]}\n placeholder=\"代理範圍\"\n size=\"sub\"\n value={scopeFilterType}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={ruleStatus}\n onChange={(activeKey): void => {\n setRuleStatus(readDelegationStatusTabKey(activeKey));\n setRulePage(1);\n }}\n >\n {DELEGATION_STATUS_TABS.map((statusTab) => (\n <TabItem key={statusTab.key}>{statusTab.label}</TabItem>\n ))}\n </Tab>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <Table\n actions={tableActions}\n columns={columns}\n dataSource={rows}\n fullWidth\n loading={loading}\n pagination={{\n current: rulePage,\n onChange: (page): void => {\n setRulePage(page);\n },\n onChangePageSize: (pageSize): void => {\n setRulePage(1);\n setRulePageSize(pageSize);\n },\n pageSize: rulePageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: DELEGATION_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: ruleTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{\n disabled: !principalMember || !agentMember,\n }}\n confirmText=\"建立代理\"\n loading={saving}\n modalType=\"standard\"\n onCancel={closeCreateModal}\n onClose={closeCreateModal}\n onConfirm={(): void => void handleCreate()}\n open={modalOpen}\n showModalFooter\n showModalHeader\n size=\"regular\"\n supportingText=\"代理生效後,後續建立的待簽任務會依範圍自動指派。\"\n title=\"建立代理\"\n >\n <div className={styles.delegationModalFields}>\n <MemberAutoCompleteField\n label=\"原簽核人\"\n loading={memberLoading}\n name=\"principalMemberId\"\n onChange={setPrincipalMember}\n onSearch={handleSearchMembers}\n options={memberOptions}\n value={principalMember}\n />\n <MemberAutoCompleteField\n label=\"代理人\"\n loading={memberLoading}\n name=\"agentMemberId\"\n onChange={setAgentMember}\n onSearch={handleSearchMembers}\n options={memberOptions}\n value={agentMember}\n />\n <BPMFormField label=\"代理範圍\" name=\"scopeType\" required>\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void =>\n setScopeType(readScopeOptionFromValue(option))\n }\n options={[...SCOPE_OPTIONS]}\n value={selectedScopeType}\n />\n </BPMFormField>\n {selectedScopeType.id === 'TEMPLATE_LIST' ? (\n <BPMFormField label=\"簽核模板\" name=\"scopeTemplateIds\" required>\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的模板\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name: 'scopeTemplateIds',\n spellCheck: false,\n }}\n loading={templateLoading}\n loadingText=\"搜尋模板中...\"\n mode=\"multiple\"\n onChange={(nextTemplates): void => {\n const selectedTemplates =\n readTemplateOptionsFromValue(nextTemplates);\n\n setScopeTemplates(selectedTemplates);\n setTemplateOptions((currentOptions) =>\n mergeTemplateOptions(selectedTemplates, currentOptions),\n );\n }}\n onSearch={handleSearchTemplates}\n onVisibilityChange={(open): void => {\n if (open) {\n void handleSearchTemplates('');\n }\n }}\n options={[...templateOptions]}\n overflowStrategy=\"wrap\"\n placeholder=\"搜尋並選取簽核模板\"\n searchDebounceTime={300}\n value={[...scopeTemplates]}\n />\n </BPMFormField>\n ) : null}\n <BPMFormField label=\"優先序\" name=\"priority\">\n <Input\n fullWidth\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n setPriority(event.target.value)\n }\n value={priority}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"起始時間\" name=\"startAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setStartAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"留空立即生效\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(startAt)}\n />\n </BPMFormField>\n <BPMFormField label=\"結束時間\" name=\"endAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setEndAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"可留空\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(endAt)}\n />\n </BPMFormField>\n </div>\n </Modal>\n </>\n );\n}\n\nfunction MemberAutoCompleteField({\n hideLabel = false,\n label,\n layout = DELEGATION_MODAL_FIELD_LAYOUT,\n loading,\n name,\n onChange,\n onSearch,\n options,\n required = true,\n size,\n value,\n}: {\n readonly hideLabel?: boolean;\n readonly label: string;\n readonly layout?: FormFieldLayout;\n readonly loading: boolean;\n readonly name: string;\n readonly onChange: (option: MemberOption | null) => void;\n readonly onSearch: (searchText: string) => Promise<void>;\n readonly options: readonly MemberOption[];\n readonly required?: boolean;\n readonly size?: 'main' | 'sub';\n readonly value: MemberOption | null;\n}): ReactElement {\n const autoComplete = (\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的成員\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name,\n spellCheck: false,\n }}\n loading={loading}\n loadingText=\"搜尋成員中...\"\n mode=\"single\"\n onChange={(option): void => onChange(readMemberOptionFromValue(option))}\n onSearch={onSearch}\n onSearchTextChange={(searchText): void =>\n onChange(readUniqueMemberOption(searchText, options))\n }\n onVisibilityChange={(open): void => {\n if (open) {\n void onSearch('');\n }\n }}\n options={[...options]}\n placeholder={hideLabel ? label : '搜尋姓名或信箱'}\n searchDebounceTime={300}\n size={size}\n value={value}\n />\n );\n\n if (hideLabel) {\n return (\n <FormField fullWidth layout={layout} name={name}>\n {autoComplete}\n </FormField>\n );\n }\n\n return (\n <BPMFormField label={label} layout={layout} name={name} required={required}>\n {autoComplete}\n </BPMFormField>\n );\n}\n\nfunction readMemberOption(member: MemberProfileRecord): MemberOption {\n return {\n displayName: member.name,\n email: member.email,\n id: member.memberId,\n name: formatMemberLabel(member.name, member.email, 'dot'),\n };\n}\n\nfunction readMemberOptionFromValue(value: unknown): MemberOption | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const id = value.id;\n const name = value.name;\n const email = value.email;\n const displayName = value.displayName;\n\n return typeof id === 'string' && typeof name === 'string'\n ? {\n displayName: typeof displayName === 'string' ? displayName : name,\n email: typeof email === 'string' ? email : null,\n id,\n name,\n }\n : null;\n}\n\nfunction MemberNameWithEmailTooltip({\n email,\n name,\n}: {\n readonly email: string | null;\n readonly name: string;\n}): ReactElement {\n if (!email) {\n return <span>{name}</span>;\n }\n\n return (\n <Tooltip title={email}>\n {({ ref, ...tooltipProps }): ReactElement => (\n // Spread the whole payload, as `TooltipProps` asks: picking only the\n // mouse handlers drops `aria-describedby`, so assistive tech never\n // learns the open tooltip describes this name.\n <span\n {...tooltipProps}\n className={styles.memberNameWithTooltip}\n ref={ref as RefCallback<HTMLSpanElement>}\n >\n {name}\n </span>\n )}\n </Tooltip>\n );\n}\n\nfunction readUniqueMemberOption(\n searchText: string,\n options: readonly MemberOption[],\n): MemberOption | null {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return null;\n }\n\n const matches = options.filter((option) =>\n [option.id, option.name, option.email ?? ''].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n\n return matches.length === 1 ? (matches[0] ?? null) : null;\n}\n\nfunction readTemplateOption(template: ApprovalTemplateRecord): TemplateOption {\n return {\n id: template.id,\n name: template.name,\n };\n}\n\nfunction readTemplateOptionsFromValue(\n value: readonly unknown[],\n): readonly TemplateOption[] {\n return value.flatMap((item): readonly TemplateOption[] => {\n if (!isRecord(item)) {\n return [];\n }\n\n const id = item.id;\n const name = item.name;\n\n return typeof id === 'string' && typeof name === 'string'\n ? [{ id, name }]\n : [];\n });\n}\n\nfunction filterTemplateOptions(\n options: readonly TemplateOption[],\n searchText: string,\n): readonly TemplateOption[] {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return options;\n }\n\n return options.filter((option) =>\n [option.id, option.name].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n}\n\nfunction mergeTemplateOptions(\n selectedOptions: readonly TemplateOption[],\n availableOptions: readonly TemplateOption[],\n): readonly TemplateOption[] {\n return [...selectedOptions, ...availableOptions].reduce<TemplateOption[]>(\n (options, option) =>\n options.some((currentOption) => currentOption.id === option.id)\n ? options\n : [...options, option],\n [],\n );\n}\n\nfunction readScopeOptionFromValue(value: unknown): ScopeOption {\n if (!isRecord(value) || !isSelectableDelegationScopeType(value.id)) {\n return SCOPE_OPTIONS[0];\n }\n\n return (\n SCOPE_OPTIONS.find((option) => option.id === value.id) ?? SCOPE_OPTIONS[0]\n );\n}\n\nfunction readScopeFilterOption(value: unknown): ScopeFilterOption {\n if (!isRecord(value)) {\n return SCOPE_FILTER_OPTIONS[0];\n }\n\n const id = value.id;\n\n return (\n SCOPE_FILTER_OPTIONS.find((option) => option.id === id) ??\n SCOPE_FILTER_OPTIONS[0]\n );\n}\n\nfunction isSelectableDelegationScopeType(\n value: unknown,\n): value is ScopeOption['id'] {\n return value === 'ALL' || value === 'TEMPLATE_LIST';\n}\n\nfunction readScopeLabel(rule: DelegationRuleRecord): string {\n if (rule.scopeType === 'ALL') {\n return '全部簽核';\n }\n\n if (rule.scopeType === 'TEMPLATE_LIST') {\n return `指定模板:${rule.scopeTemplateIds.length}`;\n }\n\n return rule.scopeConditionCel ? `條件:${rule.scopeConditionCel}` : '條件式';\n}\n\nfunction DelegationStatusBadge({\n status,\n}: {\n readonly status: DelegationRuleRecord['status'];\n}): ReactElement {\n if (status === 'ACTIVE') {\n return <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />;\n }\n\n if (status === 'REVOKED') {\n return <Badge size=\"sub\" text=\"已撤銷\" variant=\"dot-inactive\" />;\n }\n\n if (status === 'EXPIRED') {\n return <Badge size=\"sub\" text=\"已過期\" variant=\"dot-warning\" />;\n }\n\n return <Badge size=\"sub\" text={status} variant=\"dot-info\" />;\n}\n\nfunction readDelegationStatusTabKey(activeKey: Key): DelegationStatusTabKey {\n if (\n activeKey === 'ACTIVE' ||\n activeKey === 'REVOKED' ||\n activeKey === 'EXPIRED'\n ) {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction readDelegationDateTimePickerValue(value: string): string | undefined {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date\n ? `${formatDateParts(date)}T${padDatePart(date.getHours())}:${padDatePart(\n date.getMinutes(),\n )}`\n : undefined;\n}\n\nfunction formatDelegationDateTimePickerValue(\n value: string | undefined,\n): string {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date ? date.toISOString() : '';\n}\n\nfunction isInvalidDelegationDateRange(startAt: string, endAt: string): boolean {\n if (!startAt || !endAt) {\n return false;\n }\n\n const startDate = parseDelegationDateTimeValue(startAt);\n const endDate = parseDelegationDateTimeValue(endAt);\n\n return !!startDate && !!endDate && endDate.getTime() <= startDate.getTime();\n}\n\nfunction parseDelegationDateTimeValue(value: string): Date | null {\n if (value.endsWith('Z') || /[+-]\\d{2}:\\d{2}$/.test(value)) {\n const parsedDate = new Date(value);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n }\n\n const [datePart = '', timePart = '00:00'] = value.split('T');\n const [year = 0, month = 1, day = 1] = datePart.split('-').map(Number);\n const [hour = 0, minute = 0] = timePart.split(':').map(Number);\n const parsedDate = new Date(year, month - 1, day, hour, minute);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n}\n\nfunction formatDateParts(date: Date): string {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(\n date.getDate(),\n )}`;\n}\n\nfunction padDatePart(value: number): string {\n return String(value).padStart(2, '0');\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":"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"}
@@ -1,65 +0,0 @@
1
- "use client";require('../style.css');const e=require("./rolldown-runtime-BocRIvOZ.cjs"),t=require("./router-adapter--gYs13E8.cjs"),n=require("./routes-config-C1j_vFKo.cjs"),r=require("./bpm-form-field-Bc6k4ZEO.cjs"),i=require("./format-member-label-t7ANTF62.cjs"),a=require("./admin-pickers-qe3j--gX.cjs"),o=require("./FormRendererView-DRFi_IH7.cjs");;/* empty css */const s=require("./FormBuilderView-aBcA-_tt.cjs");let c=require("react"),l=require("@mezzanine-ui/react"),u=require("react/jsx-runtime"),d=require("@mezzanine-ui/react/Drawer");d=e.t(d,1);let f=require("@mezzanine-ui/react/ContentHeader");f=e.t(f,1);let p=require("@mezzanine-ui/icons"),m=require("ai"),h=require("@rytass/bpm-core-shared"),g=require("@rytass/bpm-core-client/form"),_=require("@rytass/bpm-core-shared/form"),v=require("@rytass/bpm-core-client/organization"),y=require("@xyflow/react"),b=require("dagre");b=e.t(b,1);let x=require("@rytass/bpm-core-client/template"),ee=require("@ai-sdk/react"),S=require("@rytass/bpm-core-shared/workflow-graph");var te=[{id:`SINGLE`,name:`單人簽核`},{id:`PARALLEL_ANY`,name:`任一人同意`},{id:`PARALLEL_ALL`,name:`全部同意`},{id:`SEQUENTIAL`,name:`依序簽核`},{id:`QUORUM`,name:`達到指定門檻`}];function ne(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 re(e){return te.find(t=>t.id===e)||{id:e,name:`未知決策方式(${e})`}}function ie({directory:e,initialState:t,layout:n,onLayout:r}){let[i,a]=(0,c.useState)(t),o=(0,c.useRef)(t),s=(0,c.useRef)(e);s.current=e;let l=(0,c.useCallback)(e=>{if(!e.changed&&!e.error)return e;let t=e.effects.layout?n(e.state.definition):e.state.definition,i={...e.state,definition:t};return o.current=i,a(i),e.effects.layout&&r?.(t),{...e,state:i}},[n,r]),u=(0,c.useCallback)(e=>l((0,h.applyWorkflowCommand)(o.current,e)),[l]),d=(0,c.useCallback)(e=>l((0,h.applyWorkflowMacroCommand)(o.current,e)),[l]),f=(0,c.useCallback)(async(e,t)=>{let n=await(0,h.executeWorkflowTool)(o.current,e,t,{directory:s.current});if(n.ok&&(n.kind===`mutation`||n.kind===`macro`)){let e=l(n.result);return{...n,result:e,snapshot:(0,h.readWorkflowSnapshot)(e.state)}}return n},[l]),p=(0,c.useCallback)(e=>{let t=typeof e==`function`?e(o.current):e;o.current=t,a(t)},[]),m=(0,c.useCallback)(()=>o.current,[]),g=(0,c.useMemo)(()=>(0,h.readWorkflowSnapshot)(i),[i]);return(0,c.useMemo)(()=>({dispatch:u,dispatchMacro:d,executeTool:f,getState:m,replaceState:p,snapshot:g,state:i,tools:h.WORKFLOW_TOOLSET}),[u,d,f,m,p,g,i])}function C({controller:e,api:t=`/api/chat`}){let n=(0,c.useMemo)(()=>new m.DefaultChatTransport({api:t}),[t]),r=(0,ee.useChat)({transport:n,sendAutomaticallyWhen:m.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 ae=12;function oe(){let e=globalThis.LanguageModel;return e&&typeof e==`object`?e:null}var se={additionalProperties:!1,properties:{action:{enum:[`tool`,`message`],type:`string`},input:{type:`object`},text:{type:`string`},tool:{type:`string`}},required:[`action`],type:`object`};function ce(){return`你是「簽核流程設計器」頁面的離線 AI 助理。只能透過下列工具操作這個流程畫布,其他請求一律婉拒並引導回流程設計。
2
-
3
- 每一步只輸出一個 JSON 決策物件:
4
- - 呼叫工具:{"action":"tool","tool":"<工具名>","input":{...}}
5
- - 回覆使用者(完成或詢問):{"action":"message","text":"<繁體中文訊息>"}
6
-
7
- 規則:先用 get_workflow_snapshot 了解現況再規劃;完成後用 validate_workflow 檢查並以 message 說明做了什麼。
8
-
9
- 可用工具:
10
- ${h.WORKFLOW_TOOLSET.map(e=>`- ${e.name}(${JSON.stringify(e.inputSchema.properties??{})}): ${e.description}`).join(`
11
- `)}`}function w({controller:e}){let[t,n]=(0,c.useState)(!1),[r,i]=(0,c.useState)([]),[a,o]=(0,c.useState)(`ready`),s=(0,c.useRef)(0);(0,c.useEffect)(()=>{let e=oe();e&&e.availability().then(e=>{n(e!==`unavailable`)}).catch(()=>n(!1))},[]);let l=(0,c.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,c.useCallback)(t=>{let n=oe();n&&a===`ready`&&(l(`user`,t),o(`submitted`),le({appendMessage:l,controller:e,model:n,userText:t}).then(()=>o(`ready`)).catch(e=>{l(`assistant`,de(e)),o(`error`)}))},[l,e,a]),status:a}}async function le({appendMessage:e,controller:t,model:n,userText:r}){let i=await n.create({initialPrompts:[{content:ce(),role:`system`}]});try{let n=`使用者需求:${r}\n目前流程:${JSON.stringify(t.snapshot)}`;for(let r=0;r<ae;r+=1){let r=ue(await i.prompt(n,{responseConstraint:se}));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 ue(e){try{let t=JSON.parse(e);return typeof t==`object`&&t&&t.action!==void 0?t:null}catch{return null}}function de(e){return e instanceof Error?`離線模式發生錯誤:${e.message}`:`離線模式發生未知錯誤。`}var fe={display:`flex`,flexDirection:`column`,gap:12,height:`100%`},pe={display:`flex`,flex:1,flexDirection:`column`,gap:12,minHeight:0,overflowY:`auto`},me={display:`flex`,gap:8,paddingBottom:4},he={borderTop:`1px solid var(--mzn-color-border-neutral, #e5e7eb)`,display:`flex`,flexDirection:`column`,gap:8,paddingTop:12},ge={display:`flex`,justifyContent:`flex-end`},_e={width:`100%`},ve=`workflow-chat-input-field`,ye=`
12
- .${ve}.mzn-text-field {
13
- width: 100%;
14
- }
15
- `,be={color:`var(--mzn-color-text-secondary, #6b7280)`,fontSize:12,padding:`2px 0`},xe={"input-available":`執行中…`,"input-streaming":`準備中…`,"output-available":`完成`,"output-error":`失敗`};function Se(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 Ce({api:e,controller:t,onClose:n,open:r}){let i=C({api:e,controller:t}),a=w({controller:t}),[o,s]=(0,c.useState)(`online`),[f,p]=(0,c.useState)(``),m=o===`offline`?{messages:a.messages,send:a.send,status:a.status}:{messages:i.messages,send:e=>{i.sendMessage({text:e})},status:i.status},{messages:h,send:g}=m,_=m.status===`submitted`||m.status===`streaming`,v=(0,c.useCallback)(()=>{let e=f.trim();e&&!_&&(p(``),g(e))},[_,f,g]),y=(0,c.useCallback)(e=>{e.nativeEvent.isComposing||e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),v())},[v]);return(0,u.jsxs)(d.default,{headerTitle:`AI 流程助理`,isHeaderDisplay:!0,onClose:n,open:r,size:`medium`,children:[(0,u.jsx)(`style`,{children:ye}),(0,u.jsxs)(`div`,{style:fe,children:[a.available?(0,u.jsxs)(`div`,{style:me,children:[(0,u.jsx)(l.Button,{onClick:()=>s(`online`),variant:o===`online`?`base-primary`:`base-tertiary`,children:`線上`}),(0,u.jsx)(l.Button,{onClick:()=>s(`offline`),variant:o===`offline`?`base-primary`:`base-tertiary`,children:`離線(裝置內,實驗)`})]}):null,(0,u.jsxs)(`div`,{role:`log`,style:pe,children:[h.length===0?(0,u.jsx)(l.Typography,{color:`text-neutral`,variant:`body`,children:`用一句話描述你想要的流程,例如:「建立三關簽核:部門主管 → 經理 → 財務,金額大於十萬走財務複核」。我會直接在畫布上幫你繪製。`}):null,h.map(e=>(0,u.jsx)(c.Fragment,{children:T(e)},e.id)),_?(0,u.jsx)(l.Typography,{color:`text-neutral`,variant:`body`,children:`思考中…`}):null]}),(0,u.jsxs)(`div`,{style:he,children:[(0,u.jsx)(l.Textarea,{className:ve,disabled:_,maxLength:2e3,onChange:e=>p(e.target.value),onKeyDown:y,placeholder:`描述你想要的流程…(Enter 送出,Shift + Enter 換行)`,rows:3,style:_e,value:f}),(0,u.jsx)(`div`,{style:ge,children:(0,u.jsx)(l.Button,{disabled:_||f.trim().length===0,loading:_,onClick:v,type:`button`,variant:`base-primary`,children:`送出`})})]})]})]})}function T(e){return e.parts.map((t,n)=>{if(t.type===`text`)return(0,u.jsx)(`div`,{style:Se(e.role),children:t.text},`${e.id}-${n}`);if(t.type===`dynamic-tool`||(0,m.isToolUIPart)(t)){let r=(0,m.getToolName)(t),i=xe[t.state]??t.state;return(0,u.jsx)(`div`,{style:be,children:`⚙ ${r} · ${i}`},`${e.id}-${n}`)}return null})}function we(e,t){let n=[...new Set(e.map(e=>e.level))];return[...n.includes(t)?n:[...n,t]].sort((e,t)=>t-e).map(t=>{let n=e.filter(e=>e.level===t).map(e=>e.name);return{id:String(t),name:n.length>0?`職等 ${t}(${n.join(`、`)})`:`職等 ${t}`,value:t}})}function E(e){return e.reduce((e,t)=>Math.max(e,t.level),1)}var D={"initiator.memberId":`發起人會員編號`,"instance.id":`案件編號`,"instance.templateId":`模板編號`,"instance.templateVersionId":`模板版本編號`,"instance.title":`案件主旨`,"node.id":`節點編號`,"node.label":`節點名稱`},O={boolean:`是/否`,json:`JSON`,number:`數字`,string:`文字`,stringArray:`文字清單`};function k(e){return`${e.key}@${e.version}`}function A(e,t){return e.find(e=>e.key===t.key&&e.version===t.version)??null}function Te(e){return[`FIELD`,...e===`stringArray`?[]:[`CONSTANT`],...e===`string`||e===`json`?[`CONTEXT`]:[]]}function Ee(e,t){return e.filter(e=>(0,S.isFormFieldCompatibleWithWebhookParameter)(e,t))}function De(e,t,n){return e===`FIELD`?{fieldKey:Ee(n,t.type)[0]?.fieldKey??``,kind:`FIELD`}:e===`CONTEXT`?{kind:`CONTEXT`,path:`instance.title`}:{kind:`CONSTANT`,value:t.type===`boolean`?!0:t.type===`number`?null:``}}var Oe=/^-?\d+(\.\d+)?$/;function ke(e,t){if(e!==`number`)return t;let n=t.trim();return n?Oe.test(n)?Number(n):t:null}function Ae(e){return!(0,S.readNotifyWebhookStructureIssues)(e).some(e=>je.has(e.code))}var je=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 Me(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 Ne(e,t,n){return{bindings:e.bindings.filter(r=>{let i=t.parameters.find(e=>e.key===r.parameter);return i!==void 0&&!(0,S.readNotifyWebhookTargetCatalogIssues)({endpoint:{parameters:[{...i,required:!1}]},formFields:n,target:{...e,bindings:[r]}}).length}),endpoint:{key:t.key,version:t.version},id:e.id}}function Pe({definition:e,endpoints:t,formFields:n}){return e.nodes.flatMap(e=>e.type!==`serviceTask`||e.data.action.type!==`NOTIFY`||(0,S.readNotifyWebhookStructureIssues)(e.data.action.webhooks).length?[]:(0,S.readNotifyWebhookTargets)(e.data.action).flatMap((r,i)=>{let a=A(t,r.endpoint);return(0,S.readNotifyWebhookTargetCatalogIssues)({endpoint:a,formFields:n,target:r}).map(t=>(0,S.readNotifyWebhookCatalogIssueMessage)({endpointLabel:a?.label??k(r.endpoint),issue:t,nodeLabel:e.data.label,targetIndex:i}))}))}var j={display:`grid`,gap:`var(--mzn-spacing-gap-base)`},Fe={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)`},M={alignItems:`center`,display:`flex`,gap:`var(--mzn-spacing-gap-base)`,justifyContent:`space-between`},Ie={display:`grid`,gap:`var(--mzn-spacing-gap-base)`,gridTemplateColumns:`minmax(0, 2fr) minmax(0, 3fr)`},Le={id:`NONE`,name:`不傳送`},Re={CONSTANT:{id:`CONSTANT`,name:`固定值`},CONTEXT:{id:`CONTEXT`,name:`案件資訊`},FIELD:{id:`FIELD`,name:`表單欄位`}},ze=[{id:`true`,name:`是`},{id:`false`,name:`否`}],Be=S.NOTIFY_WEBHOOK_CONTEXT_PATHS.map(e=>({id:e,name:D[e]}));function Ve({catalog:e,catalogState:t,formFields:n,onChange:r,targets:i}){let a=e.filter(e=>!e.deprecated);if(!i.length&&(t===`unavailable`||t===`ready`&&!a.length))return null;function o(e,t){r(i.map((n,r)=>r===e?t:n))}function s(){let[e]=a;e&&r([...i,(0,S.createNotifyWebhookTarget)({key:e.key,version:e.version})])}return(0,u.jsxs)(`div`,{style:j,children:[(0,u.jsx)(l.Typography,{variant:`label-primary-highlight`,children:`Webhook`}),(0,u.jsx)(l.Typography,{color:`text-neutral`,variant:`caption`,children:`知會節點抵達時,將指定的表單欄位或案件資訊送到外部系統。`}),t===`loading`?(0,u.jsx)(l.Typography,{color:`text-neutral`,variant:`body`,children:`正在載入可用的 Webhook 端點…`}):null,t===`unavailable`?(0,u.jsx)(l.Typography,{color:`text-error`,variant:`body`,children:`目前無法載入 Webhook 端點,已設定的內容會保留,請稍後重試。`}):null,i.map((s,c)=>(0,u.jsx)(He,{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,u.jsx)(`div`,{children:(0,u.jsx)(l.Button,{disabled:t!==`ready`||!a.length||i.length>=S.NOTIFY_WEBHOOK_TARGET_LIMIT,icon:p.PlusIcon,iconType:`leading`,onClick:s,variant:`base-dashed`,children:`新增 Webhook`})}),i.length>=S.NOTIFY_WEBHOOK_TARGET_LIMIT?(0,u.jsxs)(l.Typography,{color:`text-neutral`,variant:`caption`,children:[`每個知會節點最多 `,S.NOTIFY_WEBHOOK_TARGET_LIMIT,` 個 Webhook。`]}):null]})}function He({activeEndpoints:e,catalog:t,catalogState:n,formFields:i,index:a,onChange:o,onRemove:s,target:c}){let d=A(t,c.endpoint),f=k(c.endpoint),m=[...e.map(e=>({id:k(e),name:Ke(e)})),...d&&!d.deprecated?[]:[{id:f,name:d?Ke(d):`${f}(找不到端點)`}]],h=new Set((d?.parameters??[]).map(e=>e.key)),g=d?c.bindings.filter(e=>!h.has(e.parameter)):[];return(0,u.jsxs)(`div`,{style:Fe,children:[(0,u.jsxs)(`div`,{style:M,children:[(0,u.jsxs)(l.Typography,{variant:`label-primary`,children:[`第 `,a+1,` 個 Webhook`]}),(0,u.jsx)(l.Button,{icon:p.TrashIcon,iconType:`leading`,onClick:s,variant:`destructive-text-link`,children:`移除`})]}),(0,u.jsx)(r.t,{label:`端點`,name:`webhookEndpoint-${c.id}`,required:!0,children:(0,u.jsx)(l.Select,{clearable:!1,disabled:n!==`ready`,onChange:t=>{let n=e.find(e=>k(e)===t?.id);n&&o(Ne(c,n,i??[]))},options:[...m],placeholder:`選擇端點`,value:m.find(e=>e.id===f)??null})}),n===`ready`&&!d?(0,u.jsx)(l.Typography,{color:`text-warning`,variant:`body`,children:`找不到這個端點,設定會保留;請改選其他端點或移除,否則無法發布。`}):null,d?.disabled?(0,u.jsx)(l.Typography,{color:`text-warning`,variant:`body`,children:`這個端點已被管理者停用,不會再送出;設定會保留,請改選其他端點,否則無法發布。`}):d?.deprecated?(0,u.jsx)(l.Typography,{color:`text-warning`,variant:`body`,children:`這個端點不建議再使用,設定會保留;請改選其他端點,否則無法發布。`}):null,d?.description?(0,u.jsx)(l.Typography,{color:`text-neutral`,variant:`caption`,children:d.description}):null,d&&!d.parameters.length?(0,u.jsx)(l.Typography,{color:`text-neutral`,variant:`caption`,children:`這個端點不需要參數。`}):null,(d?.parameters??[]).map(e=>(0,u.jsx)(Ue,{formFields:i,onChange:t=>o(Me(c,e.key,t)),parameter:e,source:c.bindings.find(t=>t.parameter===e.key)?.from??null,targetId:c.id},e.key)),g.map(e=>(0,u.jsxs)(`div`,{style:M,children:[(0,u.jsxs)(l.Typography,{color:`text-warning`,variant:`body`,children:[`參數「`,e.parameter,`」已不在端點定義中。`]}),(0,u.jsx)(l.Button,{onClick:()=>o(Me(c,e.parameter,null)),variant:`base-text-link`,children:`移除設定`})]},e.parameter))]})}function Ue({formFields:e,onChange:t,parameter:n,source:i,targetId:a}){let o=i?.kind===`FIELD`||Ee(e??[],n.type).length>0,s=[...n.required?[]:[Le],...Te(n.type).filter(e=>e!==`FIELD`||o).map(e=>Re[e])],c=O[n.type];return(0,u.jsx)(r.t,{hintText:[n.key,c,n.description].filter(Boolean).join(` · `),label:n.label,name:`webhookBinding-${a}-${n.key}`,required:n.required,children:(0,u.jsxs)(`div`,{style:Ie,children:[(0,u.jsx)(l.Select,{clearable:!1,onChange:r=>{let i=qe(r?.id??null);t(i?De(i,n,e??[]):null)},options:[...s],placeholder:`選擇來源`,value:i?Re[i.kind]:n.required?null:Le}),i?(0,u.jsx)(We,{formFields:e,onChange:t,parameter:n,source:i}):null]})})}function We({formFields:e,onChange:t,parameter:n,source:r}){if(r.kind===`FIELD`){if(!e)return(0,u.jsx)(l.Typography,{color:`text-neutral`,variant:`caption`,children:`請先綁定表單版本,才能選擇表單欄位。`});let i=Ee(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,u.jsx)(l.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,u.jsx)(l.Select,{clearable:!1,onChange:e=>{(0,S.isNotifyWebhookContextPath)(e?.id)&&t({kind:`CONTEXT`,path:e.id})},options:[...Be],value:Be.find(e=>e.id===r.path)??null}):n.type===`boolean`?(0,u.jsx)(l.Select,{clearable:!1,onChange:e=>t({kind:`CONSTANT`,value:e?.id===`true`}),options:[...ze],value:typeof r.value==`boolean`?ze.find(e=>e.id===String(r.value))??null:null}):(0,u.jsx)(Ge,{onChange:e=>t({kind:`CONSTANT`,value:e}),type:n.type,value:r.value})}function Ge({onChange:e,type:t,value:n}){let[r,i]=(0,c.useState)(n===null?``:String(n));return(0,c.useEffect)(()=>{i(e=>ke(t,e)===n?e:n===null?``:String(n))},[t,n]),(0,u.jsx)(l.Input,{inputProps:{inputMode:t===`number`?`decimal`:void 0},onChange:n=>{i(n.target.value),e(ke(t,n.target.value))},placeholder:t===`number`?`輸入數字`:`輸入固定值`,value:r,variant:`base`})}function Ke(e){let t=[`v${e.version}`,...e.source===`DATABASE`?[`後台維護`]:[],...e.disabled?[`已停用`]:e.deprecated?[`不建議使用`]:[]];return`${e.label}(${t.join(`,`)})`}function qe(e){return e===`FIELD`||e===`CONSTANT`||e===`CONTEXT`?e:null}function Je(e){return(e?.fields??[]).reduce((e,t)=>({...e,[t.fieldKey]:N(t)}),{})}function Ye(e){return`formMember:${e}`}function N(e){if(e.type===`number`)return 1e3;if(e.type===`boolean`)return!0;if(e.type===`member`){let t=Ye(e.fieldKey);return e.multiple?[t]:t}return(0,_.isFormStaticOptionFieldDefinition)(e)?e.type===`checkbox`?e.options[0]?[e.options[0].value]:[]:e.options[0]?.value??``:e.type===`date`?`2026-05-08`:e.type===`datetime`?`2026-05-08T09:00:00+08:00`:e.placeholder??e.label}function Xe(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;return n===`position`&&r.length===1&&r[0]?`職位:${a(r[0])}(送出時依當下人員決定)`:n===`orgUnitMember`&&r.length===1&&r[0]?`組織任一人:${i(r[0])}`:n===`orgUnitPosition`&&r.length===2&&r[0]&&r[1]?`組織職位:${i(r[0])}/${a(r[1])}`:n===`orgUnitManager`&&r.length===1&&r[0]?`組織主管:${i(r[0])}`:n===`formMember`&&r.length===1&&r[0]?`表單欄位「${(e=>t.formFields.find(t=>t.fieldKey===e)?.label||e)(r[0])}」選的人(送出時依填寫內容決定)`:n===`orgManagerChain`&&r.length===1&&r[0]?`主管鏈:簽到職等 ${r[0]}(送出時依組織決定實際主管)`:t.memberName(e)??e}var Ze=`表單中沒有「人員選擇」欄位,請先到表單設計加入`,Qe=`原本指定的欄位已不在表單中,或已不是「人員選擇」欄位,請重新選擇。`,$e=`此欄位非必填`,et=`此欄位可能被條件隱藏`,tt=`此欄位為隱藏欄位,申請人無法填寫`,P=`,空白時此關會找不到人員,發佈時會被拒絕;請在表單設計將它設為必填且不隱藏`;function nt(e){let t=[...e.required?[]:[$e],...e.visibleWhen?.trim()?[et]:[],...e.hidden?[tt]:[]];return t.length>0?`${t.join(`、`)}${P}`:void 0}function F(e){return`${e.required?``:`(非必填)`}${e.visibleWhen?.trim()?`(可能被條件隱藏)`:``}${e.hidden?`(隱藏欄位)`:``}`}function rt(e){return(e?.fields??[]).filter(_.isMemberFieldDefinition).map(e=>{let t=nt(e);return{id:e.fieldKey,name:`${e.label} (${e.fieldKey})${F(e)}`,...t?{warning:t}:{}}})}function it(e,t){let n=rt(e),r=n.find(e=>e.id===t)??null;if(r)return{options:n,problem:r.warning??null,selected:r};if(t.trim()){let e={id:t,name:`${t}(無效欄位)`};return{options:[...n,e],problem:Qe,selected:e}}return{options:n,problem:n.length===0?Ze:null,selected:null}}function at(e,t){if(!t.trim())return`依表單欄位:未設定`;let n=e?.fields.find(e=>e.fieldKey===t);return n&&!(0,_.isMemberFieldDefinition)(n)?`依表單欄位:${n.label||t}(非人員選擇欄位)`:`依表單欄位:${n?.label||t}`}function ot(e){return`${e.draftVersion===null?`尚未建立草稿`:`草稿 v${e.draftVersion}`} · ${e.publishedVersion===null?e.hasPublishedVersion?`已發布版本`:`尚未發布`:`已發布 v${e.publishedVersion}`}`}function st(e,t){return`表單:${e} v${t}`}var ct={display:`grid`,gap:16},lt={alignItems:`start`,display:`grid`,gap:16,gridTemplateColumns:`minmax(0, 1fr) 420px`},ut={border:`1px solid var(--mzn-color-border-neutral)`,borderRadius:6,height:620,minWidth:0,overflow:`hidden`},dt={alignItems:`center`,boxSizing:`border-box`,color:`var(--mzn-color-text-error)`,display:`flex`,height:26,justifyContent:`center`,lineHeight:0,padding:0,width:26},ft={alignItems:`center`,display:`flex`,height:`100%`,justifyContent:`center`,width:`100%`},pt=`workflow-designer-side-panel`,mt=96,ht=`
16
- .${pt} .mzn-form-field--stretch .mzn-form-field__label-area,
17
- .${pt} .mzn-form-field--horizontal .mzn-form-field__label-area {
18
- flex: 0 0 ${mt}px;
19
- width: ${mt}px;
20
- }
21
-
22
- .${pt} .mzn-form-field--stretch .mzn-form-field__data-entry,
23
- .${pt} .mzn-form-field--horizontal .mzn-form-field__data-entry {
24
- min-width: 0;
25
- }
26
- `,gt=`#2563eb`,I=`#64748b`,_t=`var(--mzn-color-text-error, #dc2626)`,vt=`drop-shadow(0 0 3px rgba(0, 87, 255, 0.85)) drop-shadow(0 0 9px rgba(0, 87, 255, 0.36))`,yt=`
27
- .workflow-selection-delete-control.react-flow__controls-button {
28
- align-items: center !important;
29
- display: flex !important;
30
- height: 26px !important;
31
- justify-content: center !important;
32
- padding: 0 !important;
33
- width: 26px !important;
34
- }
35
-
36
- .workflow-selection-delete-control .mzn-icon {
37
- align-items: center;
38
- display: flex;
39
- justify-content: center;
40
- }
41
-
42
- .workflow-selection-delete-control .mzn-icon svg {
43
- height: 16px !important;
44
- max-height: none !important;
45
- max-width: none !important;
46
- width: 16px !important;
47
- }
48
-
49
- .workflow-edge--selected .react-flow__edge-path,
50
- .react-flow__edge-path.workflow-edge--selected {
51
- filter: ${vt};
52
- opacity: 1 !important;
53
- stroke: ${I} !important;
54
- stroke-opacity: 1 !important;
55
- stroke-width: 1.5px !important;
56
- }
57
-
58
- .workflow-edge--selected {
59
- --xy-edge-stroke: ${I};
60
- --xy-edge-stroke-selected: ${I};
61
- --xy-edge-stroke-width: 1.5px;
62
- }
63
-
64
- `,bt={display:`grid`,gap:12},L={display:`grid`,gap:12},xt={border:`1px solid var(--mzn-color-border-neutral)`,borderRadius:6,display:`grid`,gap:8,maxHeight:360,overflow:`auto`,padding:12},St={borderBottom:`1px solid var(--mzn-color-border-neutral)`,display:`grid`,gap:4,padding:`0 0 8px`},Ct={display:`flex`,flexWrap:`wrap`,gap:8},wt={alignItems:`center`,display:`flex`,gap:8},Tt={flex:`1 1 auto`,minWidth:0},Et={flex:`0 0 auto`},Dt={display:`grid`,gap:8},R={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%`},Ot=`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)`,z=64,kt=160,At=20,jt=64,Mt=180,Nt={...R,display:`grid`,gap:8,padding:`10px 12px`},Pt={...Nt,background:`#eff6ff`,border:`1px solid #2563eb`},Ft={...Nt,background:`#f0fdfa`,border:`1px solid #0f766e`},It={...R,background:`#ffffff`},Lt={...R,background:`#ecfdf3`,border:`1px solid #2f855a`},Rt={...R,background:`#fff4ed`,border:`1px solid #c2410c`},zt={display:`block`,maxWidth:`100%`,minWidth:0},B={display:`grid`,gap:2,minWidth:0},V=`input`,H=`output`,Bt={endEvent:`結束`,exclusiveGateway:`條件分流`,parallelGateway:`並行處理`,serviceTask:`系統`,startEvent:`開始`,userTask:`簽核`},Vt=[{icon:p.UserIcon,label:`簽核節點`,type:`userTask`},{icon:p.MailIcon,label:`知會節點`,type:`serviceTask`}],Ht=[{icon:p.FilterIcon,label:`條件分流`,type:`exclusiveGateway`}],Ut=[{id:`AND`,name:`全部前置完成`},{id:`OR`,name:`任一前置完成`}],Wt=[{id:`RESTART`,name:`重新送出後從開始重跑`},{id:`FROM_RETURN_POINT`,name:`重新送出後回到退回節點`}],Gt=[{id:`NONE`,name:`不提醒`,value:null},{id:`0.5`,name:`過半時提醒`,value:.5},{id:`0.75`,name:`剩四分之一時提醒`,value:.75},{id:`0.9`,name:`剩十分之一時提醒`,value:.9}],Kt=[{id:`DIRECT`,name:`指定會員`},{id:`DYNAMIC_FORM`,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:`指定職位`}],qt=[{id:`COUNT`,name:`人數`},{id:`PERCENTAGE`,name:`百分比`}],U=[{id:`1`,name:`直屬主管`,value:1},{id:`2`,name:`第二層主管`,value:2},{id:`3`,name:`第三層主管`,value:3}],Jt=[{id:`NONE`,name:`停止流程並提示`},{id:`DIRECT`,name:`固定改派`}],Yt=[{id:`INITIATOR_MANAGER`,name:`改由申請人的直屬主管簽核`},{id:`SKIP_NODE`,name:`跳過此關`},{id:`FAIL`,name:`停止流程並提示`}],Xt={whenEmpty:`INITIATOR_MANAGER`},Zt=[{id:`EQUALS`,name:`等於`},{id:`NOT_EQUALS`,name:`不等於`},{id:`GREATER_THAN`,name:`大於`},{id:`GREATER_THAN_OR_EQUALS`,name:`大於等於`},{id:`LESS_THAN`,name:`小於`},{id:`LESS_THAN_OR_EQUALS`,name:`小於等於`},{id:`IS_FILLED`,name:`已填寫`},{id:`IS_EMPTY`,name:`未填寫`}],Qt=[`EQUALS`,`GREATER_THAN`,`GREATER_THAN_OR_EQUALS`,`LESS_THAN`,`LESS_THAN_OR_EQUALS`,`NOT_EQUALS`],$t=[{id:`NONE`,name:`未設定`},{id:`ALL`,name:`所有人`},{id:`ORG_UNIT`,name:`指定組織`},{id:`ORG_UNIT_POSITION`,name:`指定組織職位`}],en={id:`CUSTOM`,name:`既有自訂規則`},tn=`member-001`,nn={display:`flex`,flexDirection:`column`,height:`100%`},rn={flex:1,minHeight:0,overflowY:`auto`},an={borderTop:`1px solid var(--mzn-color-border-neutral)`,display:`flex`,gap:8,paddingTop:12},on={fields:[],schemaVersion:1},sn={layout:[],schemaVersion:1},cn={endEvent:W,exclusiveGateway:W,parallelGateway:W,serviceTask:W,startEvent:W,userTask:W};function ln(e,t){return typeof e==`function`?e(t):e}function un({aiAssistantAvailable:e=!0,embedded:i=!1,formSchemaOverride:m,initialInitiatorPolicyCel:h,initialWorkflowDefinition:_,onInitiatorPolicyChange:b,onWorkflowChange:ee,showAiAssistant:C=!1,showDryRun:ae=!0,templateId:oe}){let se=t.r(),ce=n.r(),[w,le]=(0,c.useState)(null),[ue,de]=(0,c.useState)(null),[fe,pe]=(0,c.useState)(``),[me,he]=(0,c.useState)(null),[ge,_e]=(0,c.useState)(null),ve=(0,c.useRef)(null),[ye,be]=(0,c.useState)(void 0),xe=(0,c.useRef)([]),Se=(0,c.useRef)([]),T=ie({directory:(0,c.useMemo)(()=>({listOrgUnits:async()=>xe.current.map(e=>({id:e.id,name:e.name})),listPositions:async()=>Se.current.map(e=>({id:e.id,name:e.name})),searchMembers:async e=>pr(await(0,x.searchMemberOptions)(e)).map(e=>({email:e.email,id:e.memberId,name:e.name}))}),[]),initialState:{definition:i&&_!=null?bn(_):wn(),editingEdgeId:null,formDefinitionVersionId:null,formSchema:null,initiatorPolicyCel:i&&h!==void 0?h:null,selectedEdgeIds:[],selectedNodeId:i&&_!=null?_.nodes[0]?.id??`start`:`start`},layout:En,onLayout:e=>{let t=Ir(e,ve.current);t&&be(t)}}),E=T.state.definition,D=T.state.formDefinitionVersionId,O=T.state.initiatorPolicyCel,k=T.state.selectedNodeId,A=T.state.selectedEdgeIds,Te=T.state.editingEdgeId,Ee=e=>T.replaceState(t=>({...t,definition:ln(e,t.definition)})),De=e=>T.replaceState(t=>({...t,formDefinitionVersionId:ln(e,t.formDefinitionVersionId)})),Oe=e=>T.replaceState(t=>({...t,initiatorPolicyCel:ln(e,t.initiatorPolicyCel)})),ke=e=>T.replaceState(t=>({...t,selectedNodeId:ln(e,t.selectedNodeId)})),je=e=>T.replaceState(t=>({...t,selectedEdgeIds:ln(e,t.selectedEdgeIds)})),Me=e=>T.replaceState(t=>({...t,editingEdgeId:ln(e,t.editingEdgeId)})),[Ne,j]=(0,c.useState)(null),[Fe,M]=(0,c.useState)(null);(0,c.useEffect)(()=>{M(null)},[k]);let[Ie,Le]=(0,c.useState)(!0),[Re,ze]=(0,c.useState)(!1),[Be,He]=(0,c.useState)(!1),[Ue,We]=(0,c.useState)([]),Ge=(0,c.useMemo)(()=>JSON.stringify({formDefinitionVersionId:D,initiatorPolicyCel:O,workflowDefinition:E}),[D,O,E]),Ke=!!fe&&Ge!==fe,[qe,Ye]=(0,c.useState)(!1),[N,Ze]=(0,c.useState)([]),[Qe,$e]=(0,c.useState)([]),et=(0,c.useRef)(0),tt=(0,c.useRef)(new Set),[P,nt]=(0,c.useState)([]),[F,rt]=(0,c.useState)([]),[at,st]=(0,c.useState)([]);xe.current=P,Se.current=F;let[mt,gt]=(0,c.useState)(!1),[I,vt]=(0,c.useState)(!1),[R,Ot]=(0,c.useState)(`{}`),[z,kt]=(0,c.useState)(null),[At,jt]=(0,c.useState)(null),[Mt,Nt]=(0,c.useState)([]),[Pt,Ft]=(0,c.useState)(`loading`),[It,Lt]=(0,c.useState)(!1),[Rt,zt]=(0,c.useState)(!1),[B,V]=(0,c.useState)(null),[H,Zt]=(0,c.useState)(!1),[Qt,un]=(0,c.useState)(!1),W=Ke||H?`保存並發布`:ue?`發布草稿`:`已發布`;(0,c.useEffect)(()=>{i?lr():Q()},[i,oe]),(0,c.useEffect)(()=>{function e(e){Ke&&(e.preventDefault(),e.returnValue=``)}return window.addEventListener(`beforeunload`,e),()=>{window.removeEventListener(`beforeunload`,e)}},[Ke]),(0,c.useEffect)(()=>{xr(E)},[E,N]),(0,c.useEffect)(()=>{Ee(e=>bn(e))},[E.edges,E.nodes]);function fn(){(!Ke||window.confirm(`目前有尚未儲存的流程草稿,確定要離開嗎?`))&&se.push(ce.templates())}let G=(0,c.useMemo)(()=>E.nodes.find(e=>e.id===k)??null,[k,E.nodes]),pn=G?rr(G):!1,mn=A.length>0||pn,K=(0,c.useCallback)(()=>{T.getState().selectedEdgeIds.forEach(e=>T.dispatch({edgeId:e,type:`deleteEdge`})),G&&rr(G)&&T.dispatch({nodeId:G.id,type:`deleteNode`})},[T,G]);(0,c.useEffect)(()=>{if(!mn)return;function e(e){(e.key===`Delete`||e.key===`Backspace`)&&(or(e.target)||(e.preventDefault(),K()))}return window.addEventListener(`keydown`,e),()=>{window.removeEventListener(`keydown`,e)}},[mn,K]);let gn=(0,c.useMemo)(()=>E.edges.find(e=>e.id===Te)??null,[Te,E.edges]),_n=(0,c.useMemo)(()=>A.length===1?E.edges.find(e=>e.id===A[0])??null:null,[A,E.edges]),vn=(0,c.useMemo)(()=>A.map(e=>E.edges.find(t=>t.id===e)??null).filter(e=>!!e),[A,E.edges]),q=(0,c.useMemo)(()=>ge??Xn(O,me),[O,ge,me]),xn=(0,c.useMemo)(()=>E.edges.map(e=>yn(e,E.nodes,A.includes(e.id))),[A,E.edges,E.nodes]),J=(0,c.useMemo)(()=>Y(Ue,D)??Y(sr(w?.formVersions??[]),D),[D,Ue,w?.formVersions]),Sn=(0,c.useMemo)(()=>fr(Ue,J),[Ue,J]),Cn=J?.schema??null,Vn=i?m??null:Cn;(0,c.useEffect)(()=>{T.getState().formSchema!==Vn&&T.replaceState(e=>({...e,formSchema:Vn}))},[T,Vn]);let Yn=(0,c.useMemo)(()=>Lr(E),[E]);(0,c.useEffect)(()=>{let e=!0;return(0,x.listWorkflowWebhookEndpoints)({includeDeprecated:!0}).then(t=>{e&&(Nt(t),Ft(`ready`))}).catch(()=>{e&&Ft(`unavailable`)}),()=>{e=!1}},[]);let X=H&&B?B.schema:Vn,$n=(0,c.useMemo)(()=>Pt===`ready`?Pe({definition:E,endpoints:Mt,formFields:X?.fields??[]})[0]??null:null,[Mt,Pt,X,E]),ir=(0,c.useMemo)(()=>E.nodes.map(e=>hn(e,N,P,F,e.id===k,q,X)),[q,N,P,F,k,X,E.nodes]),Z=(0,c.useMemo)(()=>(0,S.hasConfiguredConditionEdges)(E),[E]),ar=(0,c.useMemo)(()=>Zn(q),[q]);(0,c.useEffect)(()=>{i&&ee?.(E)},[i,E]),(0,c.useEffect)(()=>{i&&b?.(O)},[i,O]);async function lr(){Le(!0),j(null);try{let e=await(0,v.readOrganizationDashboard)();nt(e.orgUnits),rt(e.positions),st(e.memberships)}catch(e){j(Yr(e))}finally{Le(!1)}}async function Q(){Le(!0),j(null),M(null);try{let[e,t]=await Promise.all([(0,x.readTemplateDesigner)(oe),(0,v.readOrganizationDashboard)()]),n=e.versions.find(e=>e.status===`DRAFT`)??null,r=n??e.versions[0]??null;le(e),de(n),nt(t.orgUnits),rt(t.positions),st(t.memberships),We(sr(e.formVersions));let i=bn(r?.workflowDefinition??wn()),a=r?.formDefinitionVersionId??e.formVersions[0]?.id??null,o=r?.initiatorPolicyCel??null;Ee(i),De(a),Oe(o),pe(JSON.stringify({formDefinitionVersionId:a,initiatorPolicyCel:o,workflowDefinition:i})),he(r&&!e.template.currentVersionId&&!r.initiatorPolicyCel&&Tn(r.workflowDefinition)?`NONE`:null),_e(null),ke(r?.workflowDefinition.nodes[0]?.id??`start`),je([]),Me(null),V(null),Zt(!1)}catch(e){j(Yr(e))}finally{Le(!1)}}async function vr(e){He(!0),j(null);try{let t=await(0,x.searchPublishedFormVersionOptions)(e);We(fr(sr(t),J))}catch(e){j(Yr(e))}finally{He(!1)}}async function br(e){Ye(!0),j(null);let t=++et.current;try{let n=pr(await(0,x.searchMemberOptions)(e));Ze(e=>Er(e,n)),t===et.current&&$e(n)}catch(e){t===et.current&&j(Yr(e))}finally{t===et.current&&Ye(!1)}}async function xr(e){let t=Or(e),n=o.n(t.filter(e=>!N.some(t=>t.memberId===e&&!t.unresolved)),tt.current);if(n.length===0)return;let{profiles:r,skippedIds:i}=await o.r(n,x.resolveMemberOptions),a=new Set(r.map(e=>e.memberId)),s=n.filter(e=>!a.has(e)&&!i.includes(e));s.forEach(e=>tt.current.add(e)),Ze(e=>Er(e,[...pr(r),...[...s,...i].map(mr)]))}async function Sr(e){ze(!0),j(null);try{let t=Lr(E),n=Zn(q),r=e?$n:null;if(t||n||r){let e=t??n??r??`流程設定未完成`;throw j(e),Error(e)}if(H&&B!==null)await(0,x.composeApprovalTemplateWithForm)({category:w?.template.category??null,categoryId:w?.template.categoryId??null,formDefinitionId:J?.formDefinitionId??null,formDescription:null,formName:J?.formName??w?.template.name??`表單`,initiatorPolicyCel:O,notificationConfig:null,publish:e,schema:B.schema,slaDefaults:null,templateDescription:null,templateId:oe??null,templateName:w?.template.name??`模板`,uiSchema:B.uiSchema,workflowDefinition:E}),Zt(!1),V(null),await Q();else{let t=ue??await(0,x.forkApprovalTemplate)(oe),n=await(0,x.updateApprovalTemplateDraft)({formDefinitionVersionId:D,initiatorPolicyCel:O,versionId:t.id,workflowDefinition:E});de(n),e&&await(0,x.publishApprovalTemplateVersion)(n.id),await Q()}}catch(e){throw j(Yr(e)),e}finally{ze(!1)}}async function Cr(){await Sr(!1)}async function Tr(){await Sr(!0)}function Dr(){Ot(JSON.stringify(Je(X),null,2)),kt(null),jt(null),gt(!0)}function kr(){I||gt(!1)}async function jr(){vt(!0),jt(null),kt(null);try{let e=cr(R),t=await(0,x.dryRunApprovalWorkflow)({formData:e,initiatorMemberId:tn,initiatorMetadataSnapshot:yr(tn,at),workflowDefinition:E});kt(t)}catch(e){jt(Yr(e))}finally{vt(!1)}}async function Mr(){if(zt(!0),B!==null)return;let e=J?.formDefinitionId??null;if(!e)V({schema:on,uiSchema:sn});else{un(!0);try{let t=await(0,g.readFormBuilder)(e),n=t.versions.find(e=>e.status===`DRAFT`)??t.versions.find(e=>e.id===t.definition.currentVersionId)??t.versions[0]??null;V({schema:n?.schema??on,uiSchema:n?.uiSchema??sn})}catch(e){j(Yr(e))}finally{un(!1)}}}function Pr(e){let t=(0,y.applyNodeChanges)(e,ir);Ee(e=>({...e,nodes:e.nodes.map(e=>{let n=t.find(t=>t.id===e.id);return n?{...e,position:n.position}:e})}))}function Fr(e){tr(e,E.nodes)&&e.source&&e.target&&T.dispatch({source:e.source,target:e.target,type:`connectEdge`})}function Gr(e,t){e.stopPropagation(),je(n=>e.shiftKey||e.metaKey||e.ctrlKey?nr(n,t.id):[t.id]),ke(null)}function qr(){Me(null)}function Xr(e){T.dispatch({nodeType:e,type:`addNode`})}function Zr(e){G&&T.dispatch({label:e,nodeId:G.id,type:`renameNode`})}function $(e){if(!G||G.type!==`userTask`)return;let t=G.id,n=G.data.decisionPolicy;T.dispatch({approverResolver:e,nodeId:t,type:`setUserTaskApprover`}),M(null),(0,S.isOrgManagerChainDecisionPolicyInvalid)(e,n)?M({message:`主管鏈會依序加入多位主管,簽核方式已改為「依序簽核」。`,nodeId:t,policyType:`SEQUENTIAL`}):(0,S.isDecisionPolicyUnsatisfiable)(n,e)&&M({message:`簽核者已變更為 ${(0,S.readDesignTimeApproverCount)(e)} 位,不足原本設定的 ${n?.type===`QUORUM`?n.threshold:0} 位門檻,簽核政策已重設為單人簽核,請重新設定。`,nodeId:t,policyType:`SINGLE`})}function Qr(e){G&&G.type===`userTask`&&T.dispatch({nodeId:G.id,resubmitStrategy:e,type:`setUserTaskReturnResubmitStrategy`})}function $r(e){G&&G.type===`userTask`&&T.dispatch({nodeId:G.id,requireComment:e,type:`setUserTaskReturnRequireComment`})}function ei(e){G&&G.type===`userTask`&&T.dispatch({nodeId:G.id,sla:e,type:`setUserTaskSla`})}function ti(e){G&&G.type===`userTask`&&T.dispatch({excludeInitiator:e,nodeId:G.id,type:`setUserTaskExcludeInitiator`})}function ni(e){if(!G||G.type!==`userTask`)return;M(null);let t=e.type===`QUORUM`?{...e,threshold:(0,S.composeQuorumThreshold)(e.threshold,e.thresholdType)}:e;T.dispatch({decisionPolicy:t,nodeId:G.id,type:`setUserTaskDecisionPolicy`})}function ri(e){G&&G.type===`userTask`&&T.dispatch({...e,nodeId:G.id,type:`setUserTaskOptions`})}function ii(e){G&&G.type===`serviceTask`&&T.dispatch({action:e,nodeId:G.id,type:`setServiceAction`})}function ai(e){_e(e.mode===`ALL`||e.mode===`CUSTOM`?null:e),he(e.mode===`ALL`||e.mode===`CUSTOM`?null:e.mode),Oe(Qn(e,P))}function oi(e){G&&G.type!==`startEvent`&&T.dispatch({nodeId:G.id,triggerMode:e,type:`setNodeTriggerMode`})}function si(e,t){T.dispatch({edgeId:e,isDefault:t,type:`setEdgeDefault`})}function ci({edgeId:e,fieldKey:t,operator:n,value:r}){T.dispatch({edgeId:e,fieldKey:t,operator:n,type:`setEdgeCondition`,value:r})}function li(){T.dispatch({type:`autoLayout`})}return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`style`,{children:ht}),i?null:(0,u.jsx)(l.PageHeader,{children:(0,u.jsxs)(f.default,{description:ot({draftVersion:ue?.version??null,hasPublishedVersion:!!w?.template.currentVersionId,publishedVersion:w?.versions.find(e=>e.id===w.template.currentVersionId)?.version??null}),onBackClick:fn,title:w?.template.name??`流程設計器`,children:[C?(0,u.jsx)(l.Button,{disabled:!e,onClick:()=>Lt(e=>!e),variant:It?`base-primary`:`base-secondary`,children:e?`AI 助理`:`AI 助理(未設定)`}):null,(0,u.jsx)(l.Button,{"aria-label":`儲存草稿`,disabled:Re||!!Yn||!!ar,icon:p.SaveIcon,iconType:`icon-only`,onClick:()=>void Cr(),variant:`base-secondary`,children:`儲存草稿`}),ae?(0,u.jsx)(l.Button,{disabled:Ie||!!Yn||!!ar,icon:p.EyeIcon,iconType:`leading`,onClick:Dr,variant:`base-secondary`,children:`試跑流程`}):null,(0,u.jsx)(l.Button,{disabled:Re||!ue&&!Ke&&!H||!!Yn||!!ar||!!$n,icon:p.CheckedIcon,iconType:`leading`,onClick:()=>void Tr(),variant:`base-primary`,children:W})]})}),(0,u.jsx)(l.SectionGroup,{children:(0,u.jsx)(l.Section,{children:(0,u.jsxs)(`div`,{style:ct,children:[Ne?(0,u.jsx)(l.Typography,{color:`text-error`,variant:`body`,children:Ne}):null,Fe&&Fe.nodeId===G?.id&&G.type===`userTask`&&(G.data.decisionPolicy?.type??`SINGLE`)===Fe.policyType?(0,u.jsx)(l.Typography,{color:`text-warning`,variant:`body`,children:Fe.message}):null,Yn?(0,u.jsx)(l.Typography,{color:`text-error`,variant:`body`,children:Yn}):null,ar?(0,u.jsx)(l.Typography,{color:`text-error`,variant:`body`,children:ar}):null,!Yn&&$n?(0,u.jsxs)(l.Typography,{color:`text-error`,variant:`body`,children:[`發布前需修正:`,$n]}):null,i?null:(0,u.jsx)(`div`,{style:L,children:(0,u.jsx)(r.t,{hintText:Z?`已設定條件分流條件。請先移除所有條件,才能更換綁定表單版本。`:void 0,label:`綁定表單版本`,name:`formDefinitionVersionId`,required:!0,children:(0,u.jsxs)(`div`,{style:wt,children:[(0,u.jsx)(`div`,{style:Tt,children:(0,u.jsx)(l.AutoComplete,{asyncData:!0,disabled:Ie||Z,disabledOptionsFilter:!0,emptyText:`沒有符合的已發布表單版本`,isForceClearable:!!D&&!Z,loading:Be,loadingText:`搜尋表單版本中...`,mode:`single`,onChange:e=>{Z||De(e?.id??null)},onClear:()=>{Z||De(null)},onSearch:vr,onVisibilityChange:e=>{e&&!Z&&vr(``)},options:[...Sn],placeholder:`選擇已發布表單版本`,searchDebounceTime:300,value:J})}),(0,u.jsx)(l.Button,{disabled:Ie,onClick:()=>{Mr()},style:Et,variant:`base-secondary`,children:`編輯表單`})]})})}),(0,u.jsxs)(`div`,{style:lt,children:[(0,u.jsx)(`div`,{ref:ve,style:ut,children:(0,u.jsxs)(y.ReactFlow,{connectionMode:y.ConnectionMode.Strict,edges:xn,fitView:!0,isValidConnection:e=>tr(e,E.nodes),nodeTypes:cn,nodes:ir,deleteKeyCode:null,multiSelectionKeyCode:[`Shift`,`Meta`,`Control`],onConnect:Fr,onEdgeClick:Gr,onNodeClick:(e,t)=>{ke(t.id),je([])},onNodesChange:Pr,onPaneClick:()=>{ke(null),je([])},onViewportChange:be,viewport:ye,children:[(0,u.jsx)(y.Background,{}),(0,u.jsx)(`style`,{children:yt}),(0,u.jsx)(y.Controls,{children:mn?(0,u.jsx)(y.ControlButton,{"aria-label":`刪除選取項目`,className:`workflow-selection-delete-control`,onClick:K,style:dt,title:`刪除選取項目`,children:(0,u.jsx)(`span`,{style:ft,children:(0,u.jsx)(l.Icon,{color:`error`,icon:p.TrashIcon,size:16})})}):null}),(0,u.jsx)(dn,{onApplyAutoLayout:li}),(0,u.jsx)(y.MiniMap,{})]})}),(0,u.jsxs)(`div`,{className:pt,style:bt,children:[(0,u.jsx)(l.Typography,{component:`h2`,variant:`h3`,children:`流程工具`}),i&&C?(0,u.jsxs)(`div`,{style:Dt,children:[(0,u.jsx)(l.Typography,{color:`text-neutral`,variant:`caption`,children:`AI 協助`}),(0,u.jsx)(`div`,{style:Ct,children:(0,u.jsx)(l.Button,{disabled:!e,onClick:()=>Lt(e=>!e),size:`sub`,variant:It?`base-primary`:`base-secondary`,children:e?`AI 助理`:`AI 助理(未設定)`})})]}):null,(0,u.jsxs)(`div`,{style:Dt,children:[(0,u.jsx)(l.Typography,{color:`text-neutral`,variant:`caption`,children:`動作節點`}),(0,u.jsx)(`div`,{style:Ct,children:Vt.map(e=>(0,u.jsx)(l.Button,{icon:e.icon,iconType:`leading`,onClick:()=>Xr(e.type),size:`sub`,variant:`base-secondary`,children:e.label},e.type))})]}),(0,u.jsxs)(`div`,{style:Dt,children:[(0,u.jsx)(l.Typography,{color:`text-neutral`,variant:`caption`,children:`流程控制`}),(0,u.jsx)(`div`,{style:Ct,children:Ht.map(e=>(0,u.jsx)(l.Button,{icon:e.icon,iconType:`leading`,onClick:()=>Xr(e.type),size:`sub`,variant:`base-secondary`,children:e.label},e.type))})]}),vn.length>1?gi(vn):null,vn.length===1&&_n?_i(_n):null,vn.length===0&&G?di(G):null]})]})]})})}),vi(gn),!i&&ae?ui():null,C&&e?(0,u.jsx)(Ce,{controller:T,onClose:()=>Lt(!1),open:It}):null,i?null:(0,u.jsx)(d.default,{headerTitle:`編輯表單`,isHeaderDisplay:!0,onClose:()=>zt(!1),open:Rt,size:`wide`,children:(0,u.jsxs)(`div`,{style:nn,children:[(0,u.jsx)(`div`,{style:rn,children:Qt?(0,u.jsx)(l.Typography,{color:`text-neutral`,variant:`body`,children:`載入中…`}):(0,u.jsx)(s.t,{onChange:e=>{V(e)},value:B??{schema:on,uiSchema:sn}})}),(0,u.jsxs)(`div`,{style:an,children:[(0,u.jsx)(l.Button,{disabled:Qt,onClick:()=>{B!==null&&(Zt(!0),T.replaceState(e=>({...e,formSchema:B.schema}))),zt(!1)},variant:`base-primary`,children:`套用`}),(0,u.jsx)(l.Button,{onClick:()=>zt(!1),variant:`base-secondary`,children:`取消`})]})]})})]});function ui(){let e={formFields:X?.fields??[],memberName:e=>N.find(t=>t.memberId===e&&!t.unresolved)?.displayName??null,orgUnits:P,positions:F};return(0,u.jsx)(l.Modal,{cancelText:`關閉`,confirmText:`執行試跑`,loading:I,modalType:`standard`,onCancel:kr,onClose:kr,onConfirm:()=>void jr(),open:mt,showModalFooter:!0,showModalHeader:!0,size:`wide`,supportingText:`使用 ${tn} 與範例表單資料模擬目前畫布流程,不會建立案件。`,title:`試跑流程`,children:(0,u.jsxs)(`div`,{style:L,children:[(0,u.jsx)(r.t,{label:`表單資料 JSON`,name:`dryRunFormDataJson`,required:!0,children:(0,u.jsx)(l.Textarea,{onChange:e=>Ot(e.target.value),resize:`vertical`,rows:8,value:R})}),At?(0,u.jsx)(l.Typography,{color:`text-error`,variant:`body`,children:At}):null,z?(0,u.jsxs)(`div`,{style:xt,children:[(0,u.jsx)(l.Typography,{color:z.valid?`text-success`:`text-error`,variant:`label-primary-highlight`,children:z.valid?`試跑通過`:`試跑失敗`}),z.errors.map(e=>(0,u.jsx)(l.Typography,{color:`text-error`,variant:`body`,children:e},e)),z.steps.map(t=>(0,u.jsxs)(`div`,{style:St,children:[(0,u.jsxs)(l.Typography,{variant:`label-primary-highlight`,children:[t.nodeLabel,` · `,ur(t.status)]}),(0,u.jsxs)(l.Typography,{color:`text-neutral`,variant:`caption`,children:[dr(t.nodeType),t.assigneeMemberId?` · 處理者:${Xe(t.assigneeMemberId,e)}`:``,t.edgeLabel?` · 來源線段:${t.edgeLabel}`:``]}),t.edgeReason?(0,u.jsx)(l.Typography,{color:`text-neutral`,variant:`caption`,children:t.edgeReason}):null,t.entryCondition?(0,u.jsxs)(l.Typography,{color:`text-neutral`,variant:`caption`,children:[`進入條件:`,t.entryConditionMatched?`符合`:`不符合`,` ·`,` `,t.entryCondition]}):null,(0,u.jsx)(l.Typography,{color:`text-neutral`,variant:`body`,children:t.message}),(t.status===`SKIPPED`?[]:Nr(E,t.nodeId,Mt)).map(e=>(0,u.jsxs)(l.Typography,{color:`text-neutral`,variant:`caption`,children:[`將送出 Webhook:`,e.label]},e.key))]},t.id))]}):null]})})}function di(e){return(0,u.jsxs)(`div`,{style:L,children:[(0,u.jsx)(l.Typography,{component:`h2`,variant:`h3`,children:`節點屬性`}),(0,u.jsxs)(l.Typography,{color:`text-neutral`,variant:`body`,children:[Bt[e.type],` · `,e.id]}),(0,u.jsx)(r.t,{label:`顯示名稱`,name:`nodeLabel`,required:!0,children:(0,u.jsx)(l.Input,{onChange:e=>Zr(e.target.value),value:e.data.label,variant:`base`})}),e.type===`startEvent`?fi():null,e.type===`startEvent`?null:pi(e),e.type===`userTask`?mi(e):null,e.type===`serviceTask`?hi(e):null]})}function fi(){let e=q.mode===`CUSTOM`?[...$t,en]:[...$t],t=q.mode===`ORG_UNIT`||q.mode===`ORG_UNIT_POSITION`?gr(P,q.orgUnitId??``):null,n=q.mode===`ORG_UNIT_POSITION`?_r(F,q.positionId??``):null,i=q.mode===`ORG_UNIT_POSITION`?wr({includeDescendants:!!q.includeDescendants,memberships:at,orgUnitId:q.orgUnitId??``,orgUnits:P,positions:F}):[];return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(r.t,{hintText:q.mode===`CUSTOM`?`這是舊版表達式規則;切換成標準選項後會改由 UI 管理。`:void 0,label:`發起權限`,name:`initiatorPolicyMode`,required:!0,children:(0,u.jsx)(l.Select,{clearable:!1,onChange:e=>{if(e?.id===`CUSTOM`){he(null),_e(null);return}let t=Jn(e?.id??null),n=er(t);he(t===`ALL`?null:t),_e(t===`ALL`?null:n),Oe(Qn(n,P))},options:e,placeholder:`選擇誰可以發起`,value:Y(e,q.mode)})}),q.mode===`ORG_UNIT`||q.mode===`ORG_UNIT_POSITION`?(0,u.jsx)(r.t,{label:`組織`,name:`initiatorOrgUnitId`,required:!0,children:(0,u.jsx)(a.n,{name:`initiatorOrgUnitId`,onChange:e=>ai({...q,orgUnitId:e?.id??``,positionId:``,value:e?.id??``}),orgUnits:P,placeholder:`選擇組織`,value:t})}):null,q.mode===`ORG_UNIT`||q.mode===`ORG_UNIT_POSITION`?(0,u.jsx)(r.t,{label:`包含下層`,name:`initiatorIncludeDescendants`,children:(0,u.jsx)(l.Toggle,{checked:!!q.includeDescendants,onChange:e=>ai({...q,includeDescendants:e.target.checked,...q.mode===`ORG_UNIT_POSITION`?{positionId:``}:{}})})}):null,q.mode===`ORG_UNIT_POSITION`?(0,u.jsx)(r.t,{label:`職位`,name:`initiatorPositionId`,required:!0,children:(0,u.jsx)(a.r,{disabled:!q.orgUnitId?.trim(),name:`initiatorPositionId`,onChange:e=>ai({...q,positionId:e?.id??``}),placeholder:q.orgUnitId?.trim()?`選擇職位`:`請先選擇組織`,positions:i,value:n})}):null]})}function pi(e){let t=E.edges.filter(t=>t.target===e.id).length,n=t<2,i=n?`AND`:e.data.triggerMode??`AND`;return(0,u.jsx)(r.t,{hintText:n?`需要至少兩條前置連線,才可切換為任一前置完成。`:t>1?`${t} 條前置連線會依此規則觸發。`:`只有一條前置連線時,兩種設定效果相同。`,label:`前置條件`,name:`triggerMode`,required:!0,children:(0,u.jsx)(l.Select,{clearable:!1,onChange:e=>n?void 0:oi(Dn(e?.id??null)),options:[...Ut],readOnly:n,value:Y(Ut,i)})})}function mi(e){let t=e.data.approverResolver,n=Hn(t.type),i=t.type===`DIRECT`?t.memberIds.map(e=>hr(N,e)):[],o=t.type===`ORG_UNIT_MANAGER`||t.type===`ORG_UNIT_MEMBER`||t.type===`ORG_UNIT_POSITION`?gr(P,t.orgUnitId):null,s=t.type===`POSITION`||t.type===`ORG_UNIT_POSITION`?_r(F,t.positionId):null,c=t.type===`ORG_UNIT_POSITION`?wr({includeDescendants:!!t.includeDescendants,memberships:at,orgUnitId:t.orgUnitId,orgUnits:P,positions:F}):[],d=t.type===`DYNAMIC_FORM`?it(X,t.formPath):null,f=t.type===`ORG_MANAGER`?Kn(t.levelsUp):U[0],p=t.type===`ORG_MANAGER`||t.type===`ORG_MANAGER_CHAIN`||t.type===`ORG_UNIT_MANAGER`?t.fallback??{type:`NONE`}:{type:`NONE`},m=t.type===`ORG_MANAGER_CHAIN`?we(F,t.minPositionLevel):[],h=p.type===`DIRECT`&&p.memberId?hr(N,p.memberId):null,g=e.data.returnBehavior.resubmitStrategy??`RESTART`,_=e.data.sla??null,v=e.data.excludeInitiator??null,y=_?(0,S.readSlaDurationParts)(_.duration):null,b=y?.unit??`DAY`,x=In(_?.warningAt??null),ee=Kn(_?.escalateLevelsUp??1),ie=kn(e.data.decisionPolicy),C=jn(e.data.decisionPolicy);return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(r.t,{label:`簽核來源`,name:`approverResolverType`,required:!0,children:(0,u.jsx)(l.Select,{clearable:!1,onChange:e=>$(Un(e?.id??null,F)),options:[...Kt],value:Y(Kt,n)})}),t.type===`DIRECT`?(0,u.jsx)(r.t,{hintText:ne(e.data.decisionPolicy),label:`簽核者`,name:`memberId`,required:!0,children:(0,u.jsx)(l.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的成員`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:`workflow-approver-search`,spellCheck:!1},loading:qe,loadingText:`搜尋成員中...`,mode:`multiple`,onChange:e=>$({memberIds:e.map(e=>e.id),type:`DIRECT`}),onSearch:br,onVisibilityChange:e=>{e&&($e([]),br(``))},options:[...Er(i,Qe)],placeholder:`搜尋姓名或信箱`,searchDebounceTime:300,value:i})}):null,t.type===`DYNAMIC_FORM`?(0,u.jsx)(r.t,{hintText:d?.problem??`簽核人取自申請人送出表單時在該欄位選的人員。`,label:`表單欄位`,name:`approverFormPath`,required:!0,children:(0,u.jsx)(l.Select,{clearable:!1,onChange:e=>$({formPath:e?.id??``,type:`DYNAMIC_FORM`}),options:[...d?.options??[]],placeholder:`選擇人員選擇欄位`,value:d?.selected??void 0})}):null,t.type===`ORG_MANAGER`?(0,u.jsx)(r.t,{hintText:`依發起人的有效會員歸屬與主管解析規則決定簽核人。`,label:`主管層級`,name:`managerLevelsUp`,required:!0,children:(0,u.jsx)(l.Select,{clearable:!1,onChange:e=>$({baseFromInitiator:!0,levelsUp:qn(e?.id??null).value,type:`ORG_MANAGER`}),options:[...U],value:f})}):null,t.type===`ORG_MANAGER_CHAIN`?(0,u.jsx)(r.t,{hintText:`從發起人的直屬主管開始往上,職等比前一位高的主管依序加入,簽到職等達此值的主管為止。沒有職位的主管會略過。`,label:`簽到職等`,name:`minPositionLevel`,required:!0,children:(0,u.jsx)(l.Select,{clearable:!1,onChange:e=>$({...t,minPositionLevel:Number(e?.id??t.minPositionLevel)}),options:[...m],value:Y(m,String(t.minPositionLevel))})}):null,t.type===`ORG_UNIT_MANAGER`||t.type===`ORG_UNIT_MEMBER`||t.type===`ORG_UNIT_POSITION`?(0,u.jsx)(r.t,{hintText:t.type===`ORG_UNIT_MANAGER`?`依指定組織或其上層的主管解析規則決定簽核人。`:`依指定組織目前有效會員歸屬建立候選簽核人。`,label:`組織`,name:`orgUnitId`,required:!0,children:(0,u.jsx)(a.n,{name:`orgUnitId`,onChange:e=>$(t.type===`ORG_UNIT_MEMBER`?{includeDescendants:t.includeDescendants,orgUnitId:e?.id??``,type:`ORG_UNIT_MEMBER`}:t.type===`ORG_UNIT_POSITION`?{includeDescendants:t.includeDescendants,orgUnitId:e?.id??``,positionId:``,type:`ORG_UNIT_POSITION`}:{fallback:t.fallback,orgUnitId:e?.id??``,type:`ORG_UNIT_MANAGER`}),orgUnits:P,placeholder:`選擇組織`,value:o})}):null,t.type===`ORG_MANAGER`||t.type===`ORG_MANAGER_CHAIN`||t.type===`ORG_UNIT_MANAGER`?(0,u.jsxs)(u.Fragment,{children:[t.type===`ORG_MANAGER_CHAIN`?null:(0,u.jsx)(r.t,{hintText:`開啟後只取離該員最近一層的主管規則;掛在上層單位、涵蓋範圍較大的規則不會再一併加入簽核人。`,label:`只取最近一層主管`,name:`preferClosestOrgUnit`,children:(0,u.jsx)(l.Toggle,{checked:!!t.preferClosestOrgUnit,inputProps:{id:`preferClosestOrgUnit`,name:`preferClosestOrgUnit`},onChange:e=>$({...t,preferClosestOrgUnit:e.target.checked})})}),(0,u.jsx)(r.t,{hintText:t.type===`ORG_MANAGER_CHAIN`?`預設會停止流程並提示;若設定固定人,主管鏈在達到簽核職等前就結束時,會再加上該會員作為最後一關。`:`預設會停止流程並提示;若設定固定人,找不到主管時會改派給該會員。`,label:`無主管時`,name:`approverFallbackMode`,required:!0,children:(0,u.jsx)(l.Select,{clearable:!1,onChange:e=>$(Gn(t,Wn(e?.id??null)===`DIRECT`?{memberId:``,type:`DIRECT`}:{type:`NONE`})),options:[...Jt],value:Y(Jt,p.type)})}),p.type===`DIRECT`?(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(r.t,{label:`改派人員`,name:`approverFallbackMemberId`,required:!0,children:(0,u.jsx)(l.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的成員`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:`workflow-approver-fallback-search`,spellCheck:!1},loading:qe,loadingText:`搜尋成員中...`,mode:`single`,onChange:e=>$(Gn(t,{allowInitiatorSelfApproval:p.allowInitiatorSelfApproval,memberId:e?.id??``,type:`DIRECT`})),onSearch:br,onVisibilityChange:e=>{e&&($e([]),br(``))},options:[...Er(Qe,h?[h]:[])],placeholder:`搜尋姓名或信箱`,searchDebounceTime:300,value:h})}),(0,u.jsx)(r.t,{hintText:`預設禁止申請人簽自己的案件;只有此流程允許自簽時才開啟。`,label:`允許自簽`,name:`allowInitiatorSelfApproval`,children:(0,u.jsx)(l.Toggle,{checked:!!p.allowInitiatorSelfApproval,inputProps:{id:`allowInitiatorSelfApproval`,name:`allowInitiatorSelfApproval`},onChange:e=>$(Gn(t,{allowInitiatorSelfApproval:e.target.checked,memberId:p.memberId,type:`DIRECT`}))})})]}):null]}):null,t.type===`ORG_UNIT_MEMBER`||t.type===`ORG_UNIT_POSITION`?(0,u.jsx)(r.t,{label:`包含下層`,name:`includeDescendants`,children:(0,u.jsx)(l.Toggle,{checked:!!t.includeDescendants,inputProps:{id:`includeDescendants`,name:`includeDescendants`},onChange:e=>$({...t,includeDescendants:e.target.checked,...t.type===`ORG_UNIT_POSITION`?{positionId:``}:{}})})}):null,t.type===`POSITION`?(0,u.jsx)(r.t,{hintText:`指派給目前有效歸屬中擁有此職位的會員;主要歸屬優先。`,label:`職位`,name:`positionId`,required:!0,children:(0,u.jsx)(a.r,{name:`positionId`,onChange:e=>$({positionId:e?.id??``,type:`POSITION`}),placeholder:`選擇職位`,positions:F,value:s})}):null,t.type===`ORG_UNIT_POSITION`?(0,u.jsx)(r.t,{hintText:`只納入指定組織範圍內擁有此職位的有效會員。`,label:`職位`,name:`orgUnitPositionId`,required:!0,children:(0,u.jsx)(a.r,{disabled:!t.orgUnitId.trim(),name:`orgUnitPositionId`,onChange:e=>$({includeDescendants:t.includeDescendants,orgUnitId:t.orgUnitId,positionId:e?.id??``,type:`ORG_UNIT_POSITION`}),placeholder:t.orgUnitId.trim()?`選擇職位`:`請先選擇組織`,positions:c,value:s})}):null,(0,u.jsx)(r.t,{hintText:`決定這一關要幾位簽核者同意才會通過;單人簽核與任一人同意的效果完全相同,皆為其中一人同意即通過。`,label:`決策方式`,name:`decisionPolicy`,required:!0,children:(0,u.jsx)(l.Select,{clearable:!1,onChange:t=>ni(An(t?.id??null,e.data.decisionPolicy)),options:[...te.filter(e=>t.type!==`ORG_MANAGER_CHAIN`||e.id===`SEQUENTIAL`||e.id===`PARALLEL_ALL`)],value:re(ie)})}),ie===`QUORUM`?(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(r.t,{label:`門檻計算方式`,name:`quorumThresholdType`,required:!0,children:(0,u.jsx)(l.Select,{clearable:!1,onChange:e=>ni({threshold:C.threshold,thresholdType:Mn(e?.id??null),type:`QUORUM`}),options:[...qt],value:Y(qt,C.thresholdType)})}),(0,u.jsx)(r.t,{hintText:C.thresholdType===`PERCENTAGE`?`達到簽核者總數的這個百分比即通過,換算人數時無條件進位;超過 100 的輸入會自動夾至 100。`:`達到這個同意人數即通過;門檻超過實際簽核者人數時,這一關將永遠無法通過,請勿設定超過實際簽核者人數。`,label:C.thresholdType===`PERCENTAGE`?`門檻百分比`:`門檻人數`,name:`quorumThreshold`,required:!0,children:(0,u.jsx)(l.Input,{id:`quorumThreshold`,inputProps:C.thresholdType===`PERCENTAGE`?{max:100,min:1}:{min:1},inputType:`number`,name:`quorumThreshold`,onChange:e=>ni({threshold:(0,S.composeQuorumThreshold)(Number(e.target.value),C.thresholdType),thresholdType:C.thresholdType,type:`QUORUM`}),value:String(C.threshold),variant:`base`})})]}):null,e.data.returnBehavior.allowReturn?(0,u.jsx)(r.t,{hintText:`退回發起人後,重新送出時要從流程開始重跑,或直接回到退回的簽核節點。`,label:`重送策略`,name:`returnResubmitStrategy`,required:!0,children:(0,u.jsx)(l.Select,{clearable:!1,onChange:e=>Qr(On(e?.id??null)),options:[...Wt],value:Y(Wt,g)})}):null,e.data.returnBehavior.allowReturn?(0,u.jsx)(r.t,{hintText:`開啟後,簽核者按下退回時必須填寫意見,未填寫會被擋下。`,label:`退回時意見必填`,name:`returnRequireComment`,children:(0,u.jsx)(l.Toggle,{checked:e.data.returnBehavior.requireComment===!0,inputProps:{id:`returnRequireComment`,name:`returnRequireComment`},onChange:e=>$r(e.target.checked)})}):null,(0,u.jsx)(r.t,{hintText:`開啟後可設定簽核期限,逾時將依下方設定處理。`,label:`啟用時效`,name:`slaEnabled`,children:(0,u.jsx)(l.Toggle,{checked:!!_,inputProps:{id:`slaEnabled`,name:`slaEnabled`},onChange:e=>ei(e.target.checked?S.DEFAULT_SLA_CONFIG:null)})}),_&&!y?(0,u.jsx)(r.t,{hintText:`此期限混用了日與時,無法在表單中編輯。請改以單一單位設定,或透過 API 維護。`,label:`時效期限`,name:`slaDurationRaw`,children:(0,u.jsx)(l.Input,{disabled:!0,value:_.duration,variant:`base`})}):null,_&&y?(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(r.t,{label:`時效期限`,name:`slaDurationValue`,required:!0,children:(0,u.jsx)(l.Input,{id:`slaDurationValue`,inputProps:{min:1},inputType:`number`,name:`slaDurationValue`,onChange:e=>ei(Rn(_,{unit:b,value:Number(e.target.value)})),value:String(y.value),variant:`base`})}),(0,u.jsx)(r.t,{label:`期限單位`,name:`slaDurationUnit`,required:!0,children:(0,u.jsx)(l.Select,{clearable:!1,onChange:e=>ei(Rn(_,{unit:Nn(e?.id??null),value:y.value})),options:[...S.SLA_DURATION_UNIT_OPTIONS],value:Y(S.SLA_DURATION_UNIT_OPTIONS,b)})})]}):null,_&&b===`DAY`?(0,u.jsx)(r.t,{hintText:`工作日會跳過週末與行事曆上的假日,補班日仍計為工作日;行事曆由系統管理者設定。`,label:`計算方式`,name:`slaCalendar`,required:!0,children:(0,u.jsx)(l.Select,{clearable:!1,onChange:e=>ei({..._,calendar:Pn(e?.id??null)}),options:[...S.SLA_CALENDAR_MODE_OPTIONS],value:Y(S.SLA_CALENDAR_MODE_OPTIONS,_.calendar??`CALENDAR`)})}):null,_?(0,u.jsx)(r.t,{label:`逾時處理`,name:`slaOnTimeout`,required:!0,children:(0,u.jsx)(l.Select,{clearable:!1,onChange:e=>ei(zn(_,Fn(e?.id??null))),options:[...S.SLA_TIMEOUT_ACTION_OPTIONS],value:Y(S.SLA_TIMEOUT_ACTION_OPTIONS,_.onTimeout)})}):null,_?.onTimeout===`ESCALATE`?(0,u.jsx)(r.t,{hintText:`逾時後改派給簽核者的上層主管,只會升級一次。`,label:`升級層級`,name:`slaEscalateLevelsUp`,required:!0,children:(0,u.jsx)(l.Select,{clearable:!1,onChange:e=>ei({..._,escalateLevelsUp:qn(e?.id??null).value}),options:[...U],value:ee})}):null,_?(0,u.jsx)(r.t,{hintText:`在期限到達前先送出一次提醒。`,label:`預警提醒`,name:`slaWarningAt`,children:(0,u.jsx)(l.Select,{clearable:!1,onChange:e=>ei(Bn(_,Ln(e?.id??null).value)),options:[...Gt],value:x})}):null,(0,u.jsx)(r.t,{hintText:`關閉後,簽核者在此關卡看不到「拒絕」按鈕。`,label:`允許拒絕`,name:`allowReject`,children:(0,u.jsx)(l.Toggle,{checked:e.data.allowReject,inputProps:{id:`allowReject`,name:`allowReject`},onChange:e=>ri({allowReject:e.target.checked})})}),(0,u.jsx)(r.t,{hintText:`關閉後,簽核者無法把此關卡的任務轉派給其他人。`,label:`允許轉派`,name:`allowTransfer`,children:(0,u.jsx)(l.Toggle,{checked:e.data.allowTransfer,inputProps:{id:`allowTransfer`,name:`allowTransfer`},onChange:e=>ri({allowTransfer:e.target.checked})})}),(0,u.jsx)(r.t,{hintText:`開啟後,簽核者可在此關卡臨時加入其他簽核人;會簽為平行處理,加簽則需等加入者簽完才往下。`,label:`允許加簽`,name:`allowAddSigner`,children:(0,u.jsx)(l.Toggle,{checked:e.data.allowAddSigner,inputProps:{id:`allowAddSigner`,name:`allowAddSigner`},onChange:e=>ri({allowAddSigner:e.target.checked})})}),(0,u.jsx)(r.t,{hintText:`開啟後,申請人本人(含其代理人)不會成為此關的簽核人,也不能被轉簽或加簽到此關。`,label:`申請人不可簽核自己的單`,name:`excludeInitiator`,children:(0,u.jsx)(l.Toggle,{checked:!!v,inputProps:{id:`excludeInitiator`,name:`excludeInitiator`},onChange:e=>ti(e.target.checked?Xt:null)})}),v?(0,u.jsx)(r.t,{label:`排除後沒有簽核人時`,name:`excludeInitiatorWhenEmpty`,required:!0,children:(0,u.jsx)(l.Select,{clearable:!1,onChange:e=>ti({whenEmpty:Y(Yt,e?.id??null)?.id??Xt.whenEmpty}),options:[...Yt],value:Y(Yt,v.whenEmpty)})}):null]})}function hi(e){let t=e.data.action,n=Jr(t).map(e=>hr(N,e)),i=t.type===`NOTIFY`&&t.recipients.type!==`DIRECT`?Ar(t.recipients,N,P,F,X):null;function a(e){let n={memberIds:[...e],type:`DIRECT`};ii(t.type===`NOTIFY`?{...t,recipients:n}:{channels:[`IN_APP`],recipients:n,type:`NOTIFY`})}function o(e){t.type===`NOTIFY`&&ii({...t,webhooks:e})}return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(r.t,{hintText:i?`目前知會對象為「${i}」;在此選擇成員會改為指定成員。`:t.type===`NOTIFY`?`可只設定 Webhook,不指定知會對象。`:void 0,label:`知會對象`,name:`notifyMemberIds`,children:(0,u.jsx)(l.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的成員`,loading:qe,loadingText:`搜尋成員中...`,mode:`multiple`,onChange:e=>a(e.map(e=>e.id)),onSearch:br,onVisibilityChange:e=>{e&&($e([]),br(``))},options:[...Er(n,Qe)],overflowStrategy:`wrap`,placeholder:`搜尋姓名或信箱`,searchDebounceTime:300,value:[...n]})}),t.type===`NOTIFY`&&!Ae(t.webhooks)?(0,u.jsxs)(`div`,{style:L,children:[(0,u.jsx)(l.Typography,{color:`text-warning`,variant:`body`,children:`這個節點的 Webhook 設定格式錯誤,無法在此編輯。清除後可重新新增。`}),(0,u.jsx)(`div`,{children:(0,u.jsx)(l.Button,{onClick:()=>o([]),variant:`destructive-secondary`,children:`清除 Webhook 設定`})})]}):null,t.type===`NOTIFY`&&Ae(t.webhooks)?(0,u.jsx)(Ve,{catalog:Mt,catalogState:Pt,formFields:X?.fields??null,onChange:o,targets:(0,S.readNotifyWebhookTargets)(t)}):null]})}function gi(e){return(0,u.jsxs)(`div`,{style:L,children:[(0,u.jsx)(l.Typography,{component:`h2`,variant:`h3`,children:`已選取線段`}),(0,u.jsxs)(l.Typography,{color:`text-neutral`,variant:`body`,children:[`已選取 `,e.length,` 條線段,可使用 Delete 或控制面板刪除。`]})]})}function _i(e){let t=Kr(e,E.nodes);return(0,u.jsxs)(`div`,{style:L,children:[(0,u.jsx)(l.Typography,{component:`h2`,variant:`h3`,children:t?`條件設定`:`線段屬性`}),(0,u.jsxs)(l.Typography,{color:`text-neutral`,variant:`body`,children:[e.source,` → `,e.target]}),t?yi(e):(0,u.jsx)(l.Typography,{color:`text-neutral`,variant:`body`,children:`這條線會直接把流程送到下一個節點。`})]})}function vi(e){return!e||!Kr(e,E.nodes)?null:(0,u.jsx)(l.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!e.data.isDefault&&!e.data.condition},confirmText:`完成`,modalType:`standard`,onCancel:qr,onClose:qr,onConfirm:qr,open:!!Te,showModalFooter:!0,showModalHeader:!0,size:`regular`,supportingText:`條件分流的輸出連線需要指定條件,條件會直接顯示在線上。`,title:`條件設定`,children:yi(e)})}function yi(e){let t=Wr(e,E.nodes),n=Rr(J?.schema??null),i=zr(J?.schema??null,e.data.conditionFieldKey??null),a=Br(i),o=Hr(i),s=Y(a,e.data.conditionOperator??null),c=!e.data.isDefault&&!e.data.condition;return(0,u.jsxs)(`div`,{style:L,children:[(0,u.jsxs)(l.Typography,{color:`text-neutral`,variant:`body`,children:[`畫布上的這條線目前會顯示「`,(0,u.jsx)(`span`,{style:{color:c?_t:void 0},children:t??`請設定條件`}),`」。`]}),(0,u.jsx)(l.Toggle,{checked:!!e.data.isDefault,label:`其他情況走這條`,onChange:t=>si(e.id,t.target.checked)}),e.data.isDefault?(0,u.jsx)(l.Typography,{color:`text-neutral`,variant:`body`,children:`其他條件都不符合時,流程會走這條線。`}):(0,u.jsxs)(u.Fragment,{children:[J?null:(0,u.jsx)(l.Typography,{color:`text-neutral`,variant:`body`,children:`請先綁定表單版本,才能選擇條件欄位。`}),(0,u.jsx)(r.t,{label:`條件欄位`,name:`edgeConditionField`,required:!0,children:(0,u.jsx)(l.Select,{clearable:!1,onChange:t=>ci({edgeId:e.id,fieldKey:t?.id??null,operator:null,value:null}),options:[...n],placeholder:`選擇條件欄位`,value:Y(n,e.data.conditionFieldKey??null)})}),(0,u.jsx)(r.t,{label:`條件判斷`,name:`edgeConditionOperator`,required:!0,children:(0,u.jsx)(l.Select,{clearable:!1,onChange:t=>ci({edgeId:e.id,operator:Vr(t?.id??null),value:null}),options:[...a],placeholder:`選擇判斷方式`,value:s})}),s&&Ur(s.id)?(0,u.jsx)(r.t,{label:`條件值`,name:`edgeConditionValue`,required:!0,children:o.length>0?(0,u.jsx)(l.Select,{clearable:!1,onChange:t=>ci({edgeId:e.id,value:t?.id??null}),options:[...o],placeholder:`選擇條件值`,value:Y(o,e.data.conditionValue??null)}):(0,u.jsx)(l.Input,{onChange:t=>ci({edgeId:e.id,value:t.target.value}),placeholder:`輸入要比對的值`,value:e.data.conditionValue??``,variant:`base`})}):null]})]})}}function dn({onApplyAutoLayout:e}){function t(){e()}return(0,u.jsx)(y.Panel,{position:`top-right`,children:(0,u.jsx)(l.Button,{icon:p.DotGridIcon,iconType:`leading`,onClick:t,size:`sub`,variant:`base-secondary`,children:`自動排版`})})}function W({data:e,selected:t,type:n}){let r=e.approverLines??[e.approverSummary??e.label],i=fn(e),a=G(n,t);return(0,u.jsxs)(`div`,{style:a,children:[mn(e),(0,u.jsx)(`div`,{style:B,children:r.map((e,t)=>(0,u.jsx)(l.Typography,{component:`span`,ellipsis:!0,style:zt,title:e,variant:`label-primary`,children:e},`${e}_${t}`))}),(0,u.jsx)(l.Typography,{color:`text-neutral`,component:`span`,ellipsis:!0,style:zt,title:i,variant:`caption`,children:i})]})}function fn(e){return e.nodeKind===`startEvent`?e.initiatorPolicySummary??`所有人`:e.approverSummary||e.approverLines?e.label:e.nodeKind===`exclusiveGateway`?`條件在線上`:e.nodeKind===`parallelGateway`?`多條路徑同時進行`:Bt[e.nodeKind]}function G(e,t){let n=pn(e);return t?{...n,border:`1px solid var(--mzn-color-primary, #0057ff)`,boxShadow:Ot}:n}function pn(e){return e===`exclusiveGateway`?Pt:e===`parallelGateway`?Ft:e===`startEvent`?Lt:e===`endEvent`?Rt:e===`userTask`?It:R}function mn(e){return!e.hasInput&&e.hasOutput?(0,u.jsx)(y.Handle,{id:H,position:y.Position.Right,type:`source`}):e.hasInput&&!e.hasOutput?(0,u.jsx)(y.Handle,{id:V,position:y.Position.Left,type:`target`}):!e.hasInput&&!e.hasOutput?null:[(0,u.jsx)(y.Handle,{id:V,position:y.Position.Left,type:`target`},`target`),(0,u.jsx)(y.Handle,{id:H,position:y.Position.Right,type:`source`},`source`)]}function hn(e,t,n,r,i,a,o){let s=K(e);return{data:{approverLines:jr(e,t,n,r,o),approverSummary:kr(e,t,n,r,o),hasInput:ir(e),hasOutput:Z(e),initiatorPolicySummary:e.type===`startEvent`?$n(a,n,r):null,label:e.data.label,nodeKind:e.type},height:s.height,handles:gn(e),id:e.id,initialHeight:s.height,initialWidth:s.width,position:e.position,selected:i,sourcePosition:y.Position.Right,targetPosition:y.Position.Left,type:e.type,width:s.width}}function K(e){return e.type===`exclusiveGateway`||e.type===`parallelGateway`?{height:jt,width:Mt}:e.type===`serviceTask`?{height:z+(Mr(e.data.action)-1)*At,width:kt}:{height:z,width:kt}}function gn(e){let t=K(e);return[...ir(e)?[_n(t)]:[],...Z(e)?[vn(t)]:[]]}function _n({height:e}){let t=e/2-9/2;return{height:9,id:V,position:y.Position.Left,type:`target`,width:9,x:-9/2,y:t}}function vn({height:e,width:t}){let n=e/2-9/2;return{height:9,id:H,position:y.Position.Right,type:`source`,width:9,x:t-9/2,y:n}}function yn(e,t,n){let r=Wr(e,t),i=Kr(e,t),a=i&&!e.data.isDefault&&!e.data.condition,o=a?_t:i?gt:`#475569`,s=a?`#fef2f2`:i?`#eff6ff`:`#ffffff`,c=a?_t:i?gt:I;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?vt:void 0,opacity:1,stroke:I,strokeOpacity:1,strokeWidth:1.5},target:e.target,targetHandle:e.targetHandle,type:e.type??`smoothstep`}}function q(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 bn(e){return Cn(J(Sn(xn(e))))}function xn(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 J(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 Sn(e){let t=new Set(e.nodes.filter(e=>ar(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 Cn(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`?q(e,`AND`):e);return n.some((t,n)=>t!==e.nodes[n])?{...e,nodes:n}:e}function wn(){return{edges:[],meta:{schemaVersion:1},nodes:[{data:{label:`開始`},id:`start`,position:{x:80,y:160},type:`startEvent`},{data:{endState:`APPROVED`,label:`完成`,triggerMode:`AND`},id:`end`,position:{x:560,y:160},type:`endEvent`}]}}function Tn(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 En(e){let t=new b.graphlib.Graph;return t.setDefaultEdgeLabel(()=>({})),t.setGraph({rankdir:`LR`,ranksep:120}),e.nodes.forEach(e=>{t.setNode(e.id,K(e))}),e.edges.forEach(e=>{t.setEdge(e.source,e.target)}),b.layout(t),{...e,nodes:e.nodes.map(e=>{let n=t.node(e.id);return n?{...e,position:{x:n.x-K(e).width/2,y:n.y-K(e).height/2}}:e})}}function Y(e,t){return t?e.find(e=>e.id===t)??null:null}function Dn(e){return e===`OR`?`OR`:`AND`}function On(e){return e===`FROM_RETURN_POINT`?`FROM_RETURN_POINT`:`RESTART`}function kn(e){return e?.type??`SINGLE`}function An(e,t){return e===`QUORUM`?t?.type===`QUORUM`?t:{threshold:S.DEFAULT_QUORUM_THRESHOLD,thresholdType:`COUNT`,type:`QUORUM`}:e===`PARALLEL_ALL`||e===`PARALLEL_ANY`||e===`SEQUENTIAL`?{type:e}:{type:`SINGLE`}}function jn(e){return e?.type===`QUORUM`?{threshold:Number.isFinite(e.threshold)?e.threshold:S.DEFAULT_QUORUM_THRESHOLD,thresholdType:Mn(e.thresholdType??null)}:{threshold:S.DEFAULT_QUORUM_THRESHOLD,thresholdType:`COUNT`}}function Mn(e){return e===`PERCENTAGE`?`PERCENTAGE`:`COUNT`}function Nn(e){return e===`HOUR`?`HOUR`:`DAY`}function Pn(e){return e===`BUSINESS_DAY`?`BUSINESS_DAY`:`CALENDAR`}function Fn(e){return S.SLA_TIMEOUT_ACTION_OPTIONS.find(t=>t.id===e)?.id??`REMIND`}function In(e){return Gt.find(t=>t.value===e)??Gt[0]}function Ln(e){return Gt.find(t=>t.id===e)??Gt[0]}function Rn(e,t){let n=Number.isFinite(t.value)?Math.trunc(t.value):1,r=(0,S.composeSlaDuration)({unit:t.unit,value:n});return{...e,calendar:t.unit===`DAY`?e.calendar??`CALENDAR`:`CALENDAR`,duration:r}}function zn(e,t){return t===`ESCALATE`?{...e,escalateLevelsUp:e.escalateLevelsUp??1,onTimeout:t}:{...Vn(e,`escalateLevelsUp`),onTimeout:t}}function Bn(e,t){return t===null?Vn(e,`warningAt`):{...e,warningAt:t}}function Vn(e,t){return Object.fromEntries(Object.entries(e).filter(([e])=>e!==t))}function Hn(e){return e===`DYNAMIC_FORM`||e===`ORG_MANAGER`||e===`ORG_MANAGER_CHAIN`||e===`ORG_UNIT_MANAGER`||e===`ORG_UNIT_MEMBER`||e===`ORG_UNIT_POSITION`||e===`POSITION`?e:`DIRECT`}function Un(e,t){let n=Hn(e??`DIRECT`);return n===`DYNAMIC_FORM`?{formPath:``,type:`DYNAMIC_FORM`}:n===`ORG_MANAGER`?{baseFromInitiator:!0,levelsUp:1,type:`ORG_MANAGER`}:n===`ORG_MANAGER_CHAIN`?{minPositionLevel:E(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 Wn(e){return e===`DIRECT`?`DIRECT`:`NONE`}function Gn(e,t){return e.type===`ORG_MANAGER`||e.type===`ORG_MANAGER_CHAIN`||e.type===`ORG_UNIT_MANAGER`?{...e,fallback:t}:e}function Kn(e){return U.find(t=>t.value===e)??U[0]}function qn(e){return U.find(t=>t.id===e)??U[0]}function Jn(e){return e===`ORG_UNIT`||e===`ORG_UNIT_POSITION`||e===`NONE`?e:`ALL`}function Yn(e){let t=e?.trim();if(!t)return{mode:`ALL`,value:``};let n=X(t,/"([^"]+)" in subject\.orgUnitIds/gu),r=X(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 Xn(e,t){let n=Yn(e);return!t||t===`ALL`||t===`NONE`?t===`ALL`||t===`NONE`?{mode:t,value:``}:n:n.mode===t?n:er(t)}function Zn(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 X(e,t){return[...e.matchAll(t)].map(e=>e[1]).filter(e=>!!e)}function Qn(e,t){if(e.mode===`ALL`||e.mode===`NONE`)return null;let n=e.orgUnitId?.trim()??``;if(!n)return null;let r=Tr(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 $n(e,t,n){return e.mode===`NONE`?`未設定`:e.mode===`ORG_UNIT`?e.orgUnitId?`組織:${Q(t,e.orgUnitId)}`:`指定組織`:e.mode===`ORG_UNIT_POSITION`?e.orgUnitId&&e.positionId?`組織職位:${Q(t,e.orgUnitId)} / ${vr(n,e.positionId)}`:`指定組織職位`:e.mode===`CUSTOM`?`既有自訂規則`:`所有人`}function er(e){return{includeDescendants:!0,mode:e,orgUnitId:``,positionId:``,value:``}}function tr(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===H&&e.targetHandle===V&&!!(n&&Z(n))&&!!(r&&ir(r))}function nr(e,t){return e.includes(t)?e.filter(e=>e!==t):[...e,t]}function rr(e){return e.type!==`startEvent`&&e.type!==`endEvent`}function ir(e){return e.type!==`startEvent`}function Z(e){return e.type!==`endEvent`&&!ar(e)}function ar(e){return e.type===`serviceTask`&&e.data.action.type===`NOTIFY`}function or(e){return e instanceof HTMLElement?e.isContentEditable||e.tagName===`INPUT`||e.tagName===`TEXTAREA`||e.tagName===`SELECT`||!!e.closest(`[contenteditable="true"]`):!1}function sr(e){return e.map(e=>({formDefinitionId:e.formDefinitionId,formName:e.formName,id:e.id,name:st(e.formName,e.version),schema:e.schema}))}function cr(e){let t=JSON.parse(e);if(!lr(t))throw Error(`表單資料 JSON 必須是物件。`);return t}function lr(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ur(e){return e===`COMPLETED`?`完成`:e===`PASSED`?`通過`:e===`SKIPPED`?`略過`:e===`STOPPED`?`已停止`:e===`WAITING`?`將等待簽核`:e}function dr(e){return e in Bt?Bt[e]:e}function fr(e,t){return t&&!e.some(e=>e.id===t.id)?[t,...e]:e}function pr(e){return e.map(e=>({displayName:e.name,email:e.email,id:e.memberId,memberId:e.memberId,name:Fr(e.name,e.email)}))}function mr(e){return{displayName:`未知會員`,email:``,id:e,memberId:e,name:`未知會員`,unresolved:!0}}function hr(e,t){return e.find(e=>e.memberId===t)??mr(t)}function gr(e,t){let n=e.find(e=>e.id===t);return n?a.a(n):null}function _r(e,t){let n=e.find(e=>e.id===t);return n?a.o(n):null}function Q(e,t){return gr(e,t)?.name??`未指定組織`}function vr(e,t){return _r(e,t)?.name??`未指定職位`}function yr(e,t){let n=br(),r=t.filter(t=>t.memberId===e&&xr(t,n)),i=r.reduce((e,t)=>e&&Sr(e,t)<=0?e:t,null);return{customFields:{},managerMemberId:`member-002`,memberId:e,orgCode:`HQ`,orgUnitIds:Cr(r.map(e=>e.orgUnitId)),positionId:i?.positionId??null,positionIds:Cr(r.map(e=>e.positionId)),primaryOrgUnitId:i?.orgUnitId??null,roles:[`manager`]}}function br(){return new Date().toISOString().slice(0,10)}function xr(e,t){return e.effectiveFrom<=t&&(!e.effectiveTo||e.effectiveTo>=t)}function Sr(e,t){return e.isPrimary===t.isPrimary?t.effectiveFrom.localeCompare(e.effectiveFrom):e.isPrimary?-1:1}function Cr(e){return e.reduce((e,t)=>t&&!e.includes(t)?[...e,t]:e,[])}function wr({includeDescendants:e,memberships:t,orgUnitId:n,orgUnits:r,positions:i}){let a=new Set(Tr(r,n,e)),o=new Set(t.filter(e=>a.has(e.orgUnitId)).map(e=>e.positionId).filter(e=>!!e));return i.filter(e=>o.has(e.id))}function Tr(e,t,n){let r=e.find(e=>e.id===t);return r?n?e.filter(e=>e.id===r.id||e.path.startsWith(`${r.path}.`)).map(e=>e.id):[r.id]:t.trim()?[t]:[]}function Er(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 Dr(e){return e.type===`DIRECT`?e.memberIds:(e.type===`ORG_MANAGER`||e.type===`ORG_MANAGER_CHAIN`||e.type===`ORG_UNIT_MANAGER`)&&e.fallback?.type===`DIRECT`&&e.fallback.memberId?[e.fallback.memberId]:[]}function Or(e){return[...new Set(e.nodes.flatMap(e=>e.type===`userTask`?Dr(e.data.approverResolver):e.type===`serviceTask`?Jr(e.data.action):[]))]}function kr(e,t,n,r,i){return e.type===`userTask`?Ar(e.data.approverResolver,t,n,r,i):null}function Ar(e,t,n,r,i){return e.type===`DIRECT`?Pr(e.memberIds,t,`未指定簽核者`):e.type===`ORG_MANAGER`?Kn(e.levelsUp).name:e.type===`ORG_MANAGER_CHAIN`?`主管鏈:簽到職等 ${e.minPositionLevel}`:e.type===`ORG_UNIT_MANAGER`?`組織主管:${Q(n,e.orgUnitId)}`:e.type===`ORG_UNIT_MEMBER`?`組織任一人:${Q(n,e.orgUnitId)}`:e.type===`ORG_UNIT_POSITION`?`組織職位:${Q(n,e.orgUnitId)} / ${vr(r,e.positionId)}`:e.type===`POSITION`?`職位:${vr(r,e.positionId)}`:e.type===`DYNAMIC_FORM`?at(i,e.formPath):`自訂表達式`}function jr(e,t,n,r,i){if(e.type!==`serviceTask`)return null;let a=e.data.action,o=a.type===`NOTIFY`&&a.recipients.type!==`DIRECT`?[Ar(a.recipients,t,n,r,i)]:Jr(a).map(e=>hr(t,e).name),s=(0,S.readNotifyWebhookTargets)(a).length,c=[...o,...s?[`Webhook ${s} 個`]:[]];return c.length?c:[`未指定知會對象`]}function Mr(e){let t=e.type===`NOTIFY`&&e.recipients.type!==`DIRECT`?1:Jr(e).length,n=+!!(0,S.readNotifyWebhookTargets)(e).length;return Math.max(1,t+n)}function Nr(e,t,n){let r=e.nodes.find(e=>e.id===t);return r?.type===`serviceTask`&&r.data.action.type===`NOTIFY`&&Ae(r.data.action.webhooks)?(0,S.readNotifyWebhookTargets)(r.data.action).map(e=>({key:e.id,label:A(n,e.endpoint)?.label??k(e.endpoint)})):[]}function Pr(e,t,n){let r=e.map(e=>hr(t,e).name);return r.length===0?n:r.length<=2?r.join(`、`):`${r.slice(0,2).join(`、`)} 等 ${r.length} 人`}function Fr(e,t){return i.t(e,t)}function Ir(e,t){let n=t?.getBoundingClientRect();if(!n||e.nodes.length===0)return null;let r=e.nodes.reduce((e,t)=>{let n=K(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,y.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 Lr(e){let t=e.nodes.find(e=>e.type===`userTask`&&!!(0,S.readApproverResolverIssue)(e.data.approverResolver)),n=e.nodes.find(e=>e.type===`userTask`&&!!(0,S.readExcludeInitiatorIssue)(e.data.excludeInitiator)),r=e.nodes.map(e=>(0,S.readNotifyServiceTaskIssue)(e)).find(e=>e!==null)??null,i=e.edges.find(t=>Kr(t,e.nodes)&&!t.data.isDefault&&!t.data.condition),a=e.nodes.find(e=>e.type===`userTask`&&(0,S.isOrgManagerChainDecisionPolicyInvalid)(e.data.approverResolver,e.data.decisionPolicy));return t&&t.type===`userTask`?(0,S.readApproverResolverIssue)(t.data.approverResolver):a&&a.type===`userTask`?`簽核節點「${a.data.label}」使用「沿主管鏈簽核」時,決策方式必須是「依序簽核或全部同意」,否則任一位主管簽完就會結案。`:n&&n.type===`userTask`?(0,S.readExcludeInitiatorIssue)(n.data.excludeInitiator):r||(i?`條件分流的每條輸出連線都需要先設定條件。`:null)}function Rr(e){return e?.fields.map(e=>({fieldType:e.type,id:e.fieldKey,name:`${e.label} (${e.fieldKey})`}))??[]}function zr(e,t){return t?e?.fields.find(e=>e.fieldKey===t)??null:null}function Br(e){if(!e)return[];let t=(0,S.readConditionOperatorIds)(e);return Zt.filter(e=>t.includes(e.id))}function Vr(e){return Zt.some(t=>t.id===e)?e:null}function Hr(e){return e?e.type===`boolean`?[{id:`true`,name:`是`},{id:`false`,name:`否`}]:(0,_.isFormStaticOptionFieldDefinition)(e)?e.options.map(e=>({id:e.value,name:e.label})):[]:[]}function Ur(e){return Qt.includes(e)}function Wr(e,t){if(e.data.label)return e.data.label;if(Kr(e,t))return Gr(e);if(qr(e,t))return`同時進行`}function Gr(e){return e.data.isDefault?`其他情況`:`請設定條件`}function Kr(e,t){return t.some(t=>t.id===e.source&&t.type===`exclusiveGateway`)}function qr(e,t){return t.some(t=>t.id===e.source&&t.type===`parallelGateway`)}function Jr(e){return e.type===`NOTIFY`&&e.recipients.type===`DIRECT`?e.recipients.memberIds:[]}function Yr(e){return e instanceof Error?e.message.includes(`WORKFLOW_WEBHOOK_`)?`Webhook 設定未通過發布檢查:${e.message}`:(0,g.readFormSchemaLintMessage)(e.message):`發生未知錯誤`}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return un}});
65
- //# sourceMappingURL=designer-2YvjP_GU.cjs.map