@rytass/bpm-core-react 0.13.3 → 0.13.5
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 +47 -0
- package/README.md +1 -0
- package/dist/chunks/{FormBuilderView-D4xIuPYB.js → FormBuilderView-BYLN6W-P.js} +2 -2
- package/dist/chunks/{FormBuilderView-D4xIuPYB.js.map → FormBuilderView-BYLN6W-P.js.map} +1 -1
- package/dist/chunks/{FormBuilderView-CLFlfDGe.cjs → FormBuilderView-VmdPVbg7.cjs} +2 -2
- package/dist/chunks/{FormBuilderView-CLFlfDGe.cjs.map → FormBuilderView-VmdPVbg7.cjs.map} +1 -1
- package/dist/chunks/FormRendererView-Bs8lTb4k.cjs +2 -0
- package/dist/chunks/{FormRendererView-BxGT16z0.cjs.map → FormRendererView-Bs8lTb4k.cjs.map} +1 -1
- package/dist/chunks/{FormRendererView-DUceSOXe.js → FormRendererView-UPowZZgw.js} +3 -3
- package/dist/chunks/{FormRendererView-DUceSOXe.js.map → FormRendererView-UPowZZgw.js.map} +1 -1
- package/dist/chunks/{approval-instance-list-page-BjX2kaoF.js → approval-instance-list-page-CPXMP3PL.js} +2 -2
- package/dist/chunks/{approval-instance-list-page-BjX2kaoF.js.map → approval-instance-list-page-CPXMP3PL.js.map} +1 -1
- package/dist/chunks/{approval-instance-list-page-CWiQvnfE.cjs → approval-instance-list-page-ax0pm8bt.cjs} +2 -2
- package/dist/chunks/{approval-instance-list-page-CWiQvnfE.cjs.map → approval-instance-list-page-ax0pm8bt.cjs.map} +1 -1
- package/dist/chunks/{compose-Bb-REfoB.js → compose-6P64PO1i.js} +5 -5
- package/dist/chunks/{compose-Bb-REfoB.js.map → compose-6P64PO1i.js.map} +1 -1
- package/dist/chunks/{compose-DzRYZcqe.cjs → compose-BnSRL4ml.cjs} +2 -2
- package/dist/chunks/{compose-DzRYZcqe.cjs.map → compose-BnSRL4ml.cjs.map} +1 -1
- package/dist/chunks/{dashboard-page-DJ9vOPga.js → dashboard-page-CeCLV1tp.js} +2 -2
- package/dist/chunks/{dashboard-page-DJ9vOPga.js.map → dashboard-page-CeCLV1tp.js.map} +1 -1
- package/dist/chunks/{dashboard-page-CH87L5nx.cjs → dashboard-page-DooFJsxM.cjs} +2 -2
- package/dist/chunks/{dashboard-page-CH87L5nx.cjs.map → dashboard-page-DooFJsxM.cjs.map} +1 -1
- package/dist/chunks/{delegations-vpLtus9g.cjs → delegations-8LsxcQM4.cjs} +2 -2
- package/dist/chunks/{delegations-vpLtus9g.cjs.map → delegations-8LsxcQM4.cjs.map} +1 -1
- package/dist/chunks/{delegations-0MbJ7CWj.js → delegations-B8gLSt0i.js} +4 -5
- package/dist/chunks/{delegations-0MbJ7CWj.js.map → delegations-B8gLSt0i.js.map} +1 -1
- package/dist/chunks/{delegations-DyMGIDpp.js → delegations-DRupxJ4_.js} +4 -5
- package/dist/chunks/{delegations-DyMGIDpp.js.map → delegations-DRupxJ4_.js.map} +1 -1
- package/dist/chunks/{delegations-Bc9psOZ3.cjs → delegations-DlYwMiAW.cjs} +2 -2
- package/dist/chunks/{delegations-Bc9psOZ3.cjs.map → delegations-DlYwMiAW.cjs.map} +1 -1
- package/dist/chunks/{designer-C6oIO9Kq.js → designer-C3s2kSna.js} +1342 -841
- package/dist/chunks/designer-C3s2kSna.js.map +1 -0
- package/dist/chunks/designer-_g58R6rQ.cjs +65 -0
- package/dist/chunks/designer-_g58R6rQ.cjs.map +1 -0
- package/dist/chunks/detail-Db-UOELp.cjs +2 -0
- package/dist/chunks/detail-Db-UOELp.cjs.map +1 -0
- package/dist/chunks/detail-pYEIk-jW.js +2325 -0
- package/dist/chunks/detail-pYEIk-jW.js.map +1 -0
- package/dist/chunks/{login-9bCXyjbX.cjs → login-AtVxZBsC.cjs} +2 -2
- package/dist/chunks/{login-9bCXyjbX.cjs.map → login-AtVxZBsC.cjs.map} +1 -1
- package/dist/chunks/{login-BKxpLibd.js → login-C6qlTC6F.js} +2 -2
- package/dist/chunks/{login-BKxpLibd.js.map → login-C6qlTC6F.js.map} +1 -1
- package/dist/chunks/{orgs-Cr_7zsAD.js → orgs-BpqVu5ka.js} +2 -2
- package/dist/chunks/{orgs-Cr_7zsAD.js.map → orgs-BpqVu5ka.js.map} +1 -1
- package/dist/chunks/orgs-D0-5BaHT.cjs +2 -0
- package/dist/chunks/{orgs-Bz8hBMoQ.cjs.map → orgs-D0-5BaHT.cjs.map} +1 -1
- package/dist/chunks/providers-DHtDZFNA.cjs +2 -0
- package/dist/chunks/{providers-BsEn3ikK.cjs.map → providers-DHtDZFNA.cjs.map} +1 -1
- package/dist/chunks/{providers-DjLh4oLY.js → providers-J5eyByQj.js} +7 -7
- package/dist/chunks/{providers-DjLh4oLY.js.map → providers-J5eyByQj.js.map} +1 -1
- package/dist/chunks/{routes-config-fDVHmvXi.cjs → routes-config-C1j_vFKo.cjs} +2 -2
- package/dist/chunks/routes-config-C1j_vFKo.cjs.map +1 -0
- package/dist/chunks/{routes-config-RBYQtUd0.js → routes-config-yZbESPlw.js} +3 -2
- package/dist/chunks/routes-config-yZbESPlw.js.map +1 -0
- package/dist/chunks/use-bpm-member-D57LKe_u.js +20 -0
- package/dist/chunks/use-bpm-member-D57LKe_u.js.map +1 -0
- package/dist/chunks/use-bpm-member-DpNAQtNC.cjs +2 -0
- package/dist/chunks/use-bpm-member-DpNAQtNC.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +19 -24
- package/dist/index.js.map +1 -1
- package/dist/lib/routes-config.d.ts +2 -0
- package/dist/lib/use-bpm-member.d.ts +6 -0
- package/dist/next/index.cjs +1 -1
- package/dist/next/index.js +2 -2
- package/dist/pages/admin/delegations/index.cjs +1 -1
- package/dist/pages/admin/delegations/index.js +1 -1
- package/dist/pages/admin/orgs/index.cjs +1 -1
- package/dist/pages/admin/orgs/index.js +1 -1
- package/dist/pages/admin/webhook-endpoints/index.cjs +2 -0
- package/dist/pages/admin/webhook-endpoints/index.cjs.map +1 -0
- package/dist/pages/admin/webhook-endpoints/index.d.ts +4 -0
- package/dist/pages/admin/webhook-endpoints/index.js +14 -0
- package/dist/pages/admin/webhook-endpoints/index.js.map +1 -0
- package/dist/pages/delegations/index.cjs +1 -1
- package/dist/pages/delegations/index.js +1 -1
- package/dist/pages/instances/detail/index.cjs +1 -1
- package/dist/pages/instances/detail/index.js +1 -1
- package/dist/pages/login/index.cjs +1 -1
- package/dist/pages/login/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/style.css +1 -1
- package/dist/views/admin/delegations/index.cjs +1 -1
- package/dist/views/admin/delegations/index.js +1 -1
- package/dist/views/admin/index.cjs +1 -1
- package/dist/views/admin/index.d.ts +1 -0
- package/dist/views/admin/index.js +4 -3
- package/dist/views/admin/orgs/index.cjs +1 -1
- package/dist/views/admin/orgs/index.js +1 -1
- package/dist/views/admin/webhook-endpoints/AdminWebhookEndpointsView.d.ts +8 -0
- package/dist/views/admin/webhook-endpoints/index.cjs +2 -0
- package/dist/views/admin/webhook-endpoints/index.cjs.map +1 -0
- package/dist/views/admin/webhook-endpoints/index.d.ts +1 -0
- package/dist/views/admin/webhook-endpoints/index.js +729 -0
- package/dist/views/admin/webhook-endpoints/index.js.map +1 -0
- package/dist/views/cc/index.cjs +1 -1
- package/dist/views/cc/index.js +1 -1
- package/dist/views/dashboard/index.cjs +1 -1
- package/dist/views/dashboard/index.js +1 -1
- package/dist/views/delegations/index.cjs +1 -1
- package/dist/views/delegations/index.js +1 -1
- package/dist/views/forms/builder/index.cjs +1 -1
- package/dist/views/forms/builder/index.js +1 -1
- package/dist/views/forms/renderer/index.cjs +1 -1
- package/dist/views/forms/renderer/index.js +1 -1
- package/dist/views/inbox/index.cjs +1 -1
- package/dist/views/inbox/index.js +1 -1
- package/dist/views/instances/detail/InstanceDetailView.d.ts +6 -1
- package/dist/views/instances/detail/index.cjs +1 -1
- package/dist/views/instances/detail/index.d.ts +1 -0
- package/dist/views/instances/detail/index.js +2 -2
- package/dist/views/instances/detail/sections/InstanceWebhookDeliveriesSection.d.ts +20 -0
- package/dist/views/instances/detail/sections/shared.d.ts +37 -4
- package/dist/views/instances/new/index.cjs +1 -1
- package/dist/views/instances/new/index.js +2 -2
- package/dist/views/login/index.cjs +1 -1
- package/dist/views/login/index.js +1 -1
- package/dist/views/search/index.cjs +1 -1
- package/dist/views/search/index.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/NotifyWebhookTargetsEditor.d.ts +20 -0
- package/dist/views/templates/designer/index.cjs +1 -1
- package/dist/views/templates/designer/index.js +1 -1
- package/dist/views/templates/designer/notify-webhook-designer.d.ts +74 -0
- package/dist/views/templates/index.cjs +1 -1
- package/dist/views/templates/index.js +1 -1
- package/dist/views/templates/versions/index.cjs +1 -1
- package/dist/views/templates/versions/index.js +1 -1
- package/package.json +13 -3
- package/dist/chunks/FormRendererView-BxGT16z0.cjs +0 -2
- package/dist/chunks/designer-C6oIO9Kq.js.map +0 -1
- package/dist/chunks/designer-gFUdImeZ.cjs +0 -65
- package/dist/chunks/designer-gFUdImeZ.cjs.map +0 -1
- package/dist/chunks/detail-BgKgMvYx.js +0 -2044
- package/dist/chunks/detail-BgKgMvYx.js.map +0 -1
- package/dist/chunks/detail-Dnz5aaI-.cjs +0 -2
- package/dist/chunks/detail-Dnz5aaI-.cjs.map +0 -1
- package/dist/chunks/orgs-Bz8hBMoQ.cjs +0 -2
- package/dist/chunks/providers-BsEn3ikK.cjs +0 -2
- package/dist/chunks/routes-config-RBYQtUd0.js.map +0 -1
- package/dist/chunks/routes-config-fDVHmvXi.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/views/admin/webhook-endpoints/AdminWebhookEndpointsView.tsx"],"sourcesContent":["'use client';\n\nimport {\n ChangeEvent,\n CSSProperties,\n ReactElement,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n Badge,\n Button,\n Input,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Select,\n Table,\n Textarea,\n Toggle,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon, TrashIcon } from '@mezzanine-ui/icons';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { NotifyWebhookParameterType } from '@rytass/bpm-core-shared/workflow';\nimport {\n WorkflowWebhookEndpointAuditRecord,\n WorkflowWebhookEndpointManagementRecord,\n WorkflowWebhookEndpointTestResultRecord,\n WorkflowWebhookManagedEndpointRecord,\n createWorkflowWebhookEndpoint,\n listWorkflowWebhookEndpointAudits,\n listWorkflowWebhookManagedEndpoints,\n readWorkflowWebhookEndpointManagement,\n rotateWorkflowWebhookEndpointSecret,\n setWorkflowWebhookEndpointActive,\n testWorkflowWebhookEndpoint,\n updateWorkflowWebhookEndpoint,\n} from '@rytass/bpm-core-client/template';\nimport { BPMFormField } from '../../../components/bpm-form-field';\nimport { formatDateTime } from '../../../lib/format-date-time';\n\ntype SelectOption = Readonly<{ id: string; name: string }>;\n\ntype EndpointRow = Readonly<\n Record<string, unknown> & {\n endpoint: WorkflowWebhookManagedEndpointRecord;\n key: string;\n }\n>;\n\ntype AuditRow = Readonly<\n Record<string, unknown> & {\n audit: WorkflowWebhookEndpointAuditRecord;\n key: string;\n }\n>;\n\ntype ParameterDraft = Readonly<{\n description: string;\n key: string;\n label: string;\n required: boolean;\n type: NotifyWebhookParameterType;\n}>;\n\ntype HeaderDraft = Readonly<{ name: string; value: string }>;\n\n/**\n * `mode` decides what can change: a new endpoint (or a new version of one)\n * sets everything; editing keeps the parameter contract and only replaces\n * headers when asked to.\n */\ntype EndpointDraft = Readonly<{\n deprecated: boolean;\n description: string;\n endpointId: string | null;\n headers: readonly HeaderDraft[];\n key: string;\n label: string;\n method: string;\n mode: 'create' | 'edit' | 'version';\n /** The stored URL when editing, to spot a move to another host. */\n originalUrl: string;\n parameters: readonly ParameterDraft[];\n replaceHeaders: boolean;\n signingSecret: string;\n timeoutMs: string;\n url: string;\n version: string;\n}>;\n\nconst STACK_STYLE: CSSProperties = {\n display: 'grid',\n gap: 'var(--mzn-spacing-gap-base)',\n};\n\nconst ROW_STYLE: CSSProperties = {\n alignItems: 'center',\n display: 'grid',\n gap: 'var(--mzn-spacing-gap-base)',\n gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) auto auto',\n};\n\nconst HEADER_ROW_STYLE: CSSProperties = {\n alignItems: 'center',\n display: 'grid',\n gap: 'var(--mzn-spacing-gap-base)',\n gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 2fr) auto',\n};\n\nconst METHOD_OPTIONS: readonly SelectOption[] = [\n { id: 'POST', name: 'POST' },\n { id: 'PUT', name: 'PUT' },\n { id: 'PATCH', name: 'PATCH' },\n];\n\nconst PARAMETER_TYPE_OPTIONS: readonly SelectOption[] = [\n { id: 'string', name: '文字' },\n { id: 'number', name: '數字' },\n { id: 'boolean', name: '是/否' },\n { id: 'stringArray', name: '文字清單' },\n { id: 'json', name: 'JSON' },\n];\n\nconst AUDIT_ACTION_LABELS: Readonly<\n Record<WorkflowWebhookEndpointAuditRecord['action'], string>\n> = {\n CREATED: '建立',\n DISABLED: '停用',\n ENABLED: '啟用',\n SECRET_ROTATED: '輪替金鑰',\n TEST_SENT: '測試送出',\n UPDATED: '更新',\n};\n\nconst EMPTY_DRAFT: EndpointDraft = {\n deprecated: false,\n description: '',\n endpointId: null,\n headers: [],\n key: '',\n label: '',\n method: 'POST',\n mode: 'create',\n originalUrl: '',\n parameters: [],\n replaceHeaders: true,\n signingSecret: '',\n timeoutMs: '',\n url: '',\n version: '1',\n};\n\n/**\n * Back-office management of database webhook endpoints (ADR 18 §3.13):\n * create, edit, disable, rotate the signing secret, test-send and read the\n * change history. Header values and secrets are entered here and never shown\n * again. Administrator-only on the server.\n */\nexport function AdminWebhookEndpointsView(): ReactElement {\n const [management, setManagement] =\n useState<WorkflowWebhookEndpointManagementRecord | null>(null);\n const [endpoints, setEndpoints] = useState<\n readonly WorkflowWebhookManagedEndpointRecord[]\n >([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const [draft, setDraft] = useState<EndpointDraft | null>(null);\n const [saving, setSaving] = useState(false);\n const [rotating, setRotating] =\n useState<WorkflowWebhookManagedEndpointRecord | null>(null);\n const [nextSecret, setNextSecret] = useState('');\n const [removeSecret, setRemoveSecret] = useState(false);\n const [audits, setAudits] = useState<{\n readonly endpoint: WorkflowWebhookManagedEndpointRecord;\n readonly records: readonly WorkflowWebhookEndpointAuditRecord[];\n } | null>(null);\n\n const refresh = useCallback(async (): Promise<void> => {\n setLoading(true);\n\n try {\n const nextManagement = await readWorkflowWebhookEndpointManagement();\n\n setManagement(nextManagement);\n setEndpoints(\n nextManagement.enabled\n ? await listWorkflowWebhookManagedEndpoints()\n : [],\n );\n setError(null);\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect((): void => {\n void refresh();\n }, [refresh]);\n\n const run = useCallback(\n async (work: () => Promise<string | null>): Promise<boolean> => {\n setError(null);\n setNotice(null);\n\n try {\n setNotice(await work());\n await refresh();\n\n return true;\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n\n return false;\n }\n },\n [refresh],\n );\n\n const rows = useMemo(\n (): EndpointRow[] =>\n endpoints.map((endpoint) => ({ endpoint, key: endpoint.id })),\n [endpoints],\n );\n\n const columns = useMemo(\n (): TableColumn<EndpointRow>[] => [\n {\n key: 'label',\n render: ({ endpoint }: EndpointRow): ReactElement => (\n <div style={STACK_STYLE}>\n <Typography component=\"span\" variant=\"body\">\n {endpoint.label}\n </Typography>\n <Typography color=\"text-neutral\" component=\"span\" variant=\"caption\">\n {endpoint.key}@{endpoint.version} · 參數{' '}\n {endpoint.parameters.length} 個\n </Typography>\n </div>\n ),\n title: '端點',\n width: 240,\n },\n {\n key: 'url',\n render: ({ endpoint }: EndpointRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {endpoint.method} {endpoint.url}\n </Typography>\n ),\n title: 'URL',\n width: 320,\n },\n {\n key: 'status',\n render: ({ endpoint }: EndpointRow): ReactElement =>\n !endpoint.active ? (\n <Badge size=\"sub\" text=\"已停用\" variant=\"dot-inactive\" />\n ) : endpoint.deprecated ? (\n <Badge size=\"sub\" text=\"不建議使用\" variant=\"dot-warning\" />\n ) : (\n <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />\n ),\n title: '狀態',\n width: 120,\n },\n {\n key: 'credentials',\n render: ({ endpoint }: EndpointRow): ReactElement => (\n <div style={STACK_STYLE}>\n <Typography component=\"span\" variant=\"body\">\n {endpoint.hasSigningSecret ? '已設定簽章金鑰' : '未簽章'}\n </Typography>\n <Typography color=\"text-neutral\" component=\"span\" variant=\"caption\">\n {endpoint.headerNames.length\n ? `Header:${endpoint.headerNames.join('、')}`\n : '沒有自訂 header'}\n </Typography>\n </div>\n ),\n title: '憑證',\n width: 200,\n },\n {\n key: 'updatedAt',\n render: ({ endpoint }: EndpointRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(endpoint.updatedAt)}\n </Typography>\n ),\n title: '更新時間',\n width: 180,\n },\n ],\n [],\n );\n\n const actions = useMemo(\n (): TableActions<EndpointRow> => ({\n render: ({\n endpoint,\n }): ReturnType<TableActions<EndpointRow>['render']> => [\n {\n name: '編輯',\n onClick: (): void => setDraft(readEditDraft(endpoint, 'edit')),\n },\n {\n name: '建立新版本',\n onClick: (): void => setDraft(readEditDraft(endpoint, 'version')),\n },\n {\n name: '測試送出',\n onClick: (): void => {\n void run(async () =>\n readTestNotice(\n endpoint,\n await testWorkflowWebhookEndpoint(endpoint.id),\n ),\n );\n },\n },\n {\n name: '輪替金鑰',\n onClick: (): void => {\n setNextSecret('');\n setRemoveSecret(false);\n setRotating(endpoint);\n },\n },\n {\n name: endpoint.active ? '停用' : '啟用',\n onClick: (): void => {\n void run(async () => {\n await setWorkflowWebhookEndpointActive(\n endpoint.id,\n !endpoint.active,\n );\n\n return `已${endpoint.active ? '停用' : '啟用'}「${endpoint.label}」。`;\n });\n },\n },\n {\n name: '異動紀錄',\n onClick: (): void => {\n void listWorkflowWebhookEndpointAudits(endpoint.id)\n .then((records): void => setAudits({ endpoint, records }))\n .catch((requestError: unknown): void =>\n setError(readErrorMessage(requestError)),\n );\n },\n },\n ],\n variant: 'base-secondary',\n width: 180,\n }),\n [run],\n );\n\n async function handleSaveDraft(): Promise<void> {\n if (!draft) {\n return;\n }\n\n setSaving(true);\n\n const saved = await run(async () => {\n const parameters = draft.parameters.map((parameter) => ({\n description: parameter.description.trim() || null,\n key: parameter.key.trim(),\n label: parameter.label.trim(),\n required: parameter.required,\n type: parameter.type,\n }));\n const headers = draft.headers\n .filter((header) => header.name.trim())\n .map((header) => ({ name: header.name.trim(), value: header.value }));\n const timeoutMs = draft.timeoutMs.trim() ? Number(draft.timeoutMs) : null;\n\n if (draft.mode === 'edit' && draft.endpointId) {\n await updateWorkflowWebhookEndpoint({\n deprecated: draft.deprecated,\n description: draft.description,\n headers:\n draft.replaceHeaders || isOriginChanged(draft) ? headers : null,\n id: draft.endpointId,\n label: draft.label,\n method: draft.method,\n parameters,\n timeoutMs,\n url: draft.url,\n });\n\n return `已更新「${draft.label}」。`;\n }\n\n await createWorkflowWebhookEndpoint({\n deprecated: draft.deprecated,\n description: draft.description,\n headers,\n key: draft.key,\n label: draft.label,\n method: draft.method,\n parameters,\n signingSecret: draft.signingSecret || null,\n timeoutMs,\n url: draft.url,\n version: Number(draft.version),\n });\n\n return `已建立「${draft.label}」v${draft.version},設計器現在可以選用。`;\n });\n\n setSaving(false);\n\n if (saved) {\n setDraft(null);\n }\n }\n\n async function handleRotate(): Promise<void> {\n if (!rotating) {\n return;\n }\n\n const endpoint = rotating;\n const done = await run(async () => {\n await rotateWorkflowWebhookEndpointSecret(\n endpoint.id,\n removeSecret ? null : nextSecret,\n );\n\n return removeSecret\n ? `已移除「${endpoint.label}」的簽章金鑰,之後的請求不再簽章。`\n : `已輪替「${endpoint.label}」的簽章金鑰,接收端需改用新金鑰驗簽。`;\n });\n\n if (done) {\n setRotating(null);\n setNextSecret('');\n }\n }\n\n const enabled = Boolean(management?.enabled);\n\n return (\n <>\n <PageHeader>\n <ContentHeader\n description=\"維護知會節點可呼叫的外部系統端點。Header 值與簽章金鑰加密保存,儲存後不會再顯示。\"\n title=\"Webhook 端點\"\n >\n <Button\n disabled={!enabled}\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void => setDraft(EMPTY_DRAFT)}\n variant=\"base-primary\"\n >\n 新增端點\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section>\n <div style={STACK_STYLE}>\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n {notice ? (\n <Typography color=\"text-success\" variant=\"body\">\n {notice}\n </Typography>\n ) : null}\n {management && !enabled ? (\n <Typography color=\"text-warning\" variant=\"body\">\n 此伺服器未啟用後台維護的 Webhook 端點:需要設定\n workflowWebhookTargetSources 含 DATABASE、URL\n 白名單與加密金鑰。程式註冊的端點不受影響。\n </Typography>\n ) : null}\n {enabled ? (\n <Typography color=\"text-neutral\" variant=\"caption\">\n 允許的 URL:{management?.allowedUrlPatterns.join('、')}\n </Typography>\n ) : null}\n <Table\n actions={actions}\n columns={columns}\n dataSource={rows}\n fullWidth\n loading={loading}\n />\n </div>\n </Section>\n </SectionGroup>\n\n {draft ? (\n <EndpointDraftModal\n draft={draft}\n onCancel={(): void => setDraft(null)}\n onChange={setDraft}\n onConfirm={(): void => void handleSaveDraft()}\n saving={saving}\n />\n ) : null}\n\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{ disabled: !removeSecret && !nextSecret }}\n confirmText={removeSecret ? '移除金鑰' : '輪替金鑰'}\n modalType=\"standard\"\n onCancel={(): void => setRotating(null)}\n onClose={(): void => setRotating(null)}\n onConfirm={(): void => void handleRotate()}\n open={Boolean(rotating)}\n showModalFooter\n showModalHeader\n supportingText=\"新金鑰會加密保存,不會再顯示;請同時更新接收端的驗簽金鑰。\"\n title={`輪替簽章金鑰:${rotating?.label ?? ''}`}\n >\n <div style={STACK_STYLE}>\n <BPMFormField label=\"移除金鑰\" name=\"removeSigningSecret\">\n <Toggle\n checked={removeSecret}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n setRemoveSecret(event.target.checked)\n }\n />\n </BPMFormField>\n {removeSecret ? null : (\n <BPMFormField label=\"新金鑰\" name=\"nextSigningSecret\" required>\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n setNextSecret(event.target.value)\n }\n value={nextSecret}\n inputProps={{ autoComplete: 'new-password' }}\n variant=\"password\"\n />\n </BPMFormField>\n )}\n </div>\n </Modal>\n\n <Modal\n confirmText=\"關閉\"\n modalType=\"standard\"\n onClose={(): void => setAudits(null)}\n onConfirm={(): void => setAudits(null)}\n open={Boolean(audits)}\n showModalFooter\n showModalHeader\n size=\"wide\"\n supportingText=\"只記錄誰在何時變更了哪些欄位,不記錄任何值。\"\n title={`異動紀錄:${audits?.endpoint.label ?? ''}`}\n >\n <Table\n columns={AUDIT_COLUMNS}\n dataSource={(audits?.records ?? []).map((audit): AuditRow => ({\n audit,\n key: audit.id,\n }))}\n fullWidth\n />\n </Modal>\n </>\n );\n}\n\nconst AUDIT_COLUMNS: TableColumn<AuditRow>[] = [\n {\n key: 'createdAt',\n render: ({ audit }: AuditRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(audit.createdAt)}\n </Typography>\n ),\n title: '時間',\n width: 180,\n },\n {\n key: 'action',\n render: ({ audit }: AuditRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {AUDIT_ACTION_LABELS[audit.action]}\n </Typography>\n ),\n title: '動作',\n width: 120,\n },\n {\n key: 'changedFields',\n render: ({ audit }: AuditRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {audit.changedFields.join('、') || '—'}\n </Typography>\n ),\n title: '欄位',\n width: 280,\n },\n {\n key: 'actor',\n render: ({ audit }: AuditRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {audit.actorMemberId ?? '系統'}\n </Typography>\n ),\n title: '操作者',\n width: 160,\n },\n];\n\nfunction EndpointDraftModal({\n draft,\n onCancel,\n onChange,\n onConfirm,\n saving,\n}: {\n readonly draft: EndpointDraft;\n readonly onCancel: () => void;\n readonly onChange: (draft: EndpointDraft) => void;\n readonly onConfirm: () => void;\n readonly saving: boolean;\n}): ReactElement {\n const editing = draft.mode === 'edit';\n // Stored header values must not follow the URL to another host, so a new\n // host always means entering the headers again.\n const originChanged = isOriginChanged(draft);\n const replaceHeaders = draft.replaceHeaders || originChanged;\n const update = (patch: Partial<EndpointDraft>): void =>\n onChange({ ...draft, ...patch });\n const updateParameter = (\n index: number,\n patch: Partial<ParameterDraft>,\n ): void =>\n update({\n parameters: draft.parameters.map((parameter, current) =>\n current === index ? { ...parameter, ...patch } : parameter,\n ),\n });\n const updateHeader = (index: number, patch: Partial<HeaderDraft>): void =>\n update({\n headers: draft.headers.map((header, current) =>\n current === index ? { ...header, ...patch } : header,\n ),\n });\n const text =\n (field: keyof EndpointDraft) =>\n (event: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>): void =>\n update({ [field]: event.target.value });\n\n return (\n <Modal\n cancelText=\"取消\"\n confirmText={editing ? '儲存' : '建立'}\n loading={saving}\n modalType=\"standard\"\n onCancel={onCancel}\n onClose={onCancel}\n onConfirm={onConfirm}\n open\n showModalFooter\n showModalHeader\n size=\"wide\"\n supportingText={\n editing\n ? '參數的鍵、型別與必填是這個版本的契約,無法修改;需要變更請建立新版本。'\n : draft.mode === 'version'\n ? '新版本可調整參數;既有模板仍使用舊版本,直到設計者改選。'\n : 'URL 需符合伺服器設定的白名單。'\n }\n title={\n editing\n ? `編輯端點:${draft.label}`\n : draft.mode === 'version'\n ? `建立新版本:${draft.key}`\n : '新增 Webhook 端點'\n }\n >\n <div style={STACK_STYLE}>\n <BPMFormField label=\"Key\" name=\"endpointKey\" required>\n <Input\n {...(draft.mode === 'create' ? {} : { readonly: true as const })}\n onChange={text('key')}\n placeholder=\"例如 crm.lead-created\"\n value={draft.key}\n inputProps={{ autoComplete: 'off' }}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"版本\" name=\"endpointVersion\" required>\n <Input\n {...(editing ? { readonly: true as const } : {})}\n inputProps={{ autoComplete: 'off', inputMode: 'numeric' }}\n onChange={text('version')}\n value={draft.version}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"名稱\" name=\"endpointLabel\" required>\n <Input\n onChange={text('label')}\n placeholder=\"例如 CRM 建立名單\"\n value={draft.label}\n inputProps={{ autoComplete: 'off' }}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"說明\" name=\"endpointDescription\">\n <Textarea\n onChange={text('description')}\n rows={2}\n value={draft.description}\n />\n </BPMFormField>\n <BPMFormField label=\"URL\" name=\"endpointUrl\" required>\n <Input\n onChange={text('url')}\n placeholder=\"https://\"\n value={draft.url}\n inputProps={{ autoComplete: 'off' }}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"Method\" name=\"endpointMethod\" required>\n <Select\n clearable={false}\n onChange={(option): void =>\n update({ method: option?.id ?? 'POST' })\n }\n options={[...METHOD_OPTIONS]}\n value={\n METHOD_OPTIONS.find((option) => option.id === draft.method) ??\n null\n }\n />\n </BPMFormField>\n <BPMFormField\n hintText=\"留空使用預設 10 秒,上限 30000 毫秒。\"\n label=\"逾時(毫秒)\"\n name=\"endpointTimeout\"\n >\n <Input\n inputProps={{ autoComplete: 'off', inputMode: 'numeric' }}\n onChange={text('timeoutMs')}\n value={draft.timeoutMs}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"不建議使用\" name=\"endpointDeprecated\">\n <Toggle\n checked={draft.deprecated}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n update({ deprecated: event.target.checked })\n }\n />\n </BPMFormField>\n {editing ? null : (\n <BPMFormField\n hintText=\"選填;設定後 BPM 以 HMAC-SHA256 簽章,儲存後不會再顯示。\"\n label=\"簽章金鑰\"\n name=\"endpointSigningSecret\"\n >\n <Input\n onChange={text('signingSecret')}\n placeholder=\"選填,儲存後不再顯示\"\n value={draft.signingSecret}\n inputProps={{ autoComplete: 'new-password' }}\n variant=\"password\"\n />\n </BPMFormField>\n )}\n\n <Typography variant=\"label-primary-highlight\">Headers</Typography>\n {editing ? (\n <BPMFormField\n hintText={\n originChanged\n ? 'URL 已改到其他主機,必須重新輸入 header(留空代表不帶任何 header)。'\n : '現有 header 的值不會顯示;開啟後以下列內容取代全部 header。'\n }\n label=\"取代 headers\"\n name=\"endpointReplaceHeaders\"\n >\n <Toggle\n checked={replaceHeaders}\n disabled={originChanged}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n update({ replaceHeaders: event.target.checked })\n }\n />\n </BPMFormField>\n ) : null}\n {replaceHeaders\n ? draft.headers.map((header, index): ReactElement => (\n <div key={index} style={HEADER_ROW_STYLE}>\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateHeader(index, { name: event.target.value })\n }\n placeholder=\"名稱,例如 Authorization\"\n inputProps={{ autoComplete: 'off' }}\n value={header.name}\n variant=\"base\"\n />\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateHeader(index, { value: event.target.value })\n }\n placeholder=\"值\"\n value={header.value}\n inputProps={{ autoComplete: 'new-password' }}\n variant=\"password\"\n />\n <Button\n icon={TrashIcon}\n iconType=\"icon-only\"\n onClick={(): void =>\n update({\n headers: draft.headers.filter(\n (_header, current) => current !== index,\n ),\n })\n }\n variant=\"destructive-text-link\"\n >\n 移除 header\n </Button>\n </div>\n ))\n : null}\n {replaceHeaders ? (\n <div>\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void =>\n update({ headers: [...draft.headers, { name: '', value: '' }] })\n }\n variant=\"base-dashed\"\n >\n 新增 header\n </Button>\n </div>\n ) : null}\n\n <Typography variant=\"label-primary-highlight\">參數</Typography>\n {draft.parameters.map((parameter, index): ReactElement => (\n <div key={index} style={ROW_STYLE}>\n <Input\n {...(editing ? { readonly: true as const } : {})}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateParameter(index, { key: event.target.value })\n }\n placeholder=\"參數鍵\"\n inputProps={{ autoComplete: 'off' }}\n value={parameter.key}\n variant=\"base\"\n />\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateParameter(index, { label: event.target.value })\n }\n placeholder=\"顯示名稱\"\n inputProps={{ autoComplete: 'off' }}\n value={parameter.label}\n variant=\"base\"\n />\n <Select\n clearable={false}\n disabled={editing}\n onChange={(option): void =>\n updateParameter(index, {\n type: readParameterType(option?.id ?? null),\n })\n }\n options={[...PARAMETER_TYPE_OPTIONS]}\n value={\n PARAMETER_TYPE_OPTIONS.find(\n (option) => option.id === parameter.type,\n ) ?? null\n }\n />\n <Toggle\n checked={parameter.required}\n disabled={editing}\n label=\"必填\"\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateParameter(index, { required: event.target.checked })\n }\n />\n <Button\n disabled={editing}\n icon={TrashIcon}\n iconType=\"icon-only\"\n onClick={(): void =>\n update({\n parameters: draft.parameters.filter(\n (_parameter, current) => current !== index,\n ),\n })\n }\n variant=\"destructive-text-link\"\n >\n 移除參數\n </Button>\n </div>\n ))}\n {editing ? null : (\n <div>\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void =>\n update({\n parameters: [\n ...draft.parameters,\n {\n description: '',\n key: '',\n label: '',\n required: false,\n type: 'string',\n },\n ],\n })\n }\n variant=\"base-dashed\"\n >\n 新增參數\n </Button>\n </div>\n )}\n </div>\n </Modal>\n );\n}\n\nfunction readEditDraft(\n endpoint: WorkflowWebhookManagedEndpointRecord,\n mode: 'edit' | 'version',\n): EndpointDraft {\n return {\n deprecated: endpoint.deprecated,\n description: endpoint.description ?? '',\n endpointId: mode === 'edit' ? endpoint.id : null,\n headers: [],\n key: endpoint.key,\n label: endpoint.label,\n method: endpoint.method,\n mode,\n originalUrl: endpoint.url,\n parameters: endpoint.parameters.map((parameter) => ({\n description: parameter.description ?? '',\n key: parameter.key,\n label: parameter.label,\n required: parameter.required,\n type: parameter.type,\n })),\n // A new version starts without credentials: they are not readable.\n replaceHeaders: mode === 'version',\n signingSecret: '',\n timeoutMs: endpoint.timeoutMs ? String(endpoint.timeoutMs) : '',\n url: endpoint.url,\n version: String(\n mode === 'version' ? endpoint.version + 1 : endpoint.version,\n ),\n };\n}\n\nfunction readTestNotice(\n endpoint: WorkflowWebhookManagedEndpointRecord,\n result: WorkflowWebhookEndpointTestResultRecord,\n): string {\n if (result.ok) {\n return `測試送出成功:「${endpoint.label}」回應 HTTP ${result.status ?? ''}。`;\n }\n\n throw new Error(\n `測試送出失敗:「${endpoint.label}」${result.status ? `回應 HTTP ${result.status}` : ''}(${result.errorCode ?? '未知錯誤'})${result.errorDetail ? `:${result.errorDetail}` : ''}`,\n );\n}\n\nfunction isOriginChanged(draft: EndpointDraft): boolean {\n if (draft.mode !== 'edit') {\n return false;\n }\n\n const origin = (url: string): string => {\n try {\n return new URL(url.trim()).origin;\n } catch {\n return url.trim();\n }\n };\n\n return origin(draft.url) !== origin(draft.originalUrl);\n}\n\nfunction readParameterType(id: string | null): NotifyWebhookParameterType {\n return PARAMETER_TYPE_OPTIONS.some((option) => option.id === id)\n ? (id as NotifyWebhookParameterType)\n : 'string';\n}\n\nfunction readErrorMessage(error: unknown): string {\n if (!(error instanceof Error)) {\n return '發生未知錯誤';\n }\n\n const message = error.message;\n\n if (message.includes('WORKFLOW_WEBHOOK_URL_NOT_ALLOWED')) {\n return 'URL 不在伺服器允許的白名單內。';\n }\n\n if (message.includes('WORKFLOW_WEBHOOK_ENDPOINT_KEY_CONFLICT')) {\n return '這個 Key 已由程式註冊的端點使用,請換一個。';\n }\n\n if (message.includes('WORKFLOW_WEBHOOK_ENDPOINT_CONTRACT_CHANGED')) {\n return '參數契約不能修改,請改用「建立新版本」。';\n }\n\n if (message.includes('WORKFLOW_WEBHOOK_TEST_RATE_LIMITED')) {\n return '測試送出太頻繁,請稍後再試(每 10 秒一次、10 分鐘最多 5 次)。';\n }\n\n return message;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './AdminWebhookEndpointsView';
|