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