@rytass/bpm-core-react 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/dist/chunks/FormBuilderView-CAqjOYAP.cjs +3 -0
- package/dist/chunks/{FormBuilderView-D6baVqBY.cjs.map → FormBuilderView-CAqjOYAP.cjs.map} +1 -1
- package/dist/chunks/{FormBuilderView-QtREqV4j.js → FormBuilderView-TzSezeqC.js} +18 -16
- package/dist/chunks/{FormBuilderView-QtREqV4j.js.map → FormBuilderView-TzSezeqC.js.map} +1 -1
- package/dist/chunks/{FormRendererView-D8QHLvd0.js → FormRendererView-BurlEDUu.js} +44 -41
- package/dist/chunks/{FormRendererView-D8QHLvd0.js.map → FormRendererView-BurlEDUu.js.map} +1 -1
- package/dist/chunks/FormRendererView-Dde1s3I0.cjs +2 -0
- package/dist/chunks/{FormRendererView-Cw9LiidV.cjs.map → FormRendererView-Dde1s3I0.cjs.map} +1 -1
- package/dist/chunks/admin-pickers-Btvij1at.cjs.map +1 -1
- package/dist/chunks/admin-pickers-DLlG_1du.js.map +1 -1
- package/dist/chunks/approval-instance-list-page-BjX2kaoF.js.map +1 -1
- package/dist/chunks/approval-instance-list-page-CWiQvnfE.cjs +2 -0
- package/dist/chunks/{approval-instance-list-page-C408vxE2.cjs.map → approval-instance-list-page-CWiQvnfE.cjs.map} +1 -1
- package/dist/chunks/auth-provider-4BeCw7cI.cjs.map +1 -1
- package/dist/chunks/auth-provider-B5oPmvk2.js.map +1 -1
- package/dist/chunks/bpm-form-field-Bc6k4ZEO.cjs.map +1 -1
- package/dist/chunks/categories-DGlxuC6X.js.map +1 -1
- package/dist/chunks/categories-Yid05WAX.cjs +2 -0
- package/dist/chunks/{categories-DUfldZ_9.cjs.map → categories-Yid05WAX.cjs.map} +1 -1
- package/dist/chunks/{compose-D-OS-Ngs.js → compose-CUOe5Ia9.js} +4 -4
- package/dist/chunks/{compose-D-OS-Ngs.js.map → compose-CUOe5Ia9.js.map} +1 -1
- package/dist/chunks/compose-CyRkXdeu.cjs +2 -0
- package/dist/chunks/{compose-CODnd9-2.cjs.map → compose-CyRkXdeu.cjs.map} +1 -1
- package/dist/chunks/dashboard-page-CH87L5nx.cjs +2 -0
- package/dist/chunks/{dashboard-page-DwHQY6Ki.cjs.map → dashboard-page-CH87L5nx.cjs.map} +1 -1
- package/dist/chunks/dashboard-page-DJ9vOPga.js.map +1 -1
- package/dist/chunks/{delegations-DLEEFBlH.js → delegations-0MbJ7CWj.js} +3 -2
- package/dist/chunks/{delegations-DLEEFBlH.js.map → delegations-0MbJ7CWj.js.map} +1 -1
- package/dist/chunks/delegations-Bc9psOZ3.cjs +2 -0
- package/dist/chunks/{delegations-CGj-tZNO.cjs.map → delegations-Bc9psOZ3.cjs.map} +1 -1
- package/dist/chunks/{delegations-DqMpI_Nk.js → delegations-DyMGIDpp.js} +3 -2
- package/dist/chunks/{delegations-DqMpI_Nk.js.map → delegations-DyMGIDpp.js.map} +1 -1
- package/dist/chunks/delegations-vpLtus9g.cjs +2 -0
- package/dist/chunks/{delegations-kbMOSEif.cjs.map → delegations-vpLtus9g.cjs.map} +1 -1
- package/dist/chunks/{designer-DDSxwtjV.js → designer-Cb3WAC46.js} +39 -30
- package/dist/chunks/{designer-DDSxwtjV.js.map → designer-Cb3WAC46.js.map} +1 -1
- package/dist/chunks/designer-zLliyrHu.cjs +65 -0
- package/dist/chunks/{designer-Cdn10NNl.cjs.map → designer-zLliyrHu.cjs.map} +1 -1
- package/dist/chunks/detail-Bp2Nv0cs.cjs +2 -0
- package/dist/chunks/{detail-CtVu5NTi.cjs.map → detail-Bp2Nv0cs.cjs.map} +1 -1
- package/dist/chunks/{detail-DAPz2qyn.js → detail-Cmw-aQcu.js} +4 -4
- package/dist/chunks/{detail-DAPz2qyn.js.map → detail-Cmw-aQcu.js.map} +1 -1
- package/dist/chunks/format-date-time-CB-LxzqT.js.map +1 -1
- package/dist/chunks/format-date-time-D-cx5M8z.cjs +2 -0
- package/dist/chunks/{format-date-time-XxBzF0F5.cjs.map → format-date-time-D-cx5M8z.cjs.map} +1 -1
- package/dist/chunks/login-9bCXyjbX.cjs.map +1 -1
- package/dist/chunks/login-BKxpLibd.js.map +1 -1
- package/dist/chunks/notifications-Bc4mgSds.cjs +2 -0
- package/dist/chunks/{notifications--hwl-DR0.cjs.map → notifications-Bc4mgSds.cjs.map} +1 -1
- package/dist/chunks/notifications-DJ5wzCye.js.map +1 -1
- package/dist/chunks/{orgs-DytLvZ_X.js → orgs-B930facb.js} +11 -10
- package/dist/chunks/{orgs-DytLvZ_X.js.map → orgs-B930facb.js.map} +1 -1
- package/dist/chunks/orgs-BefGgeyc.cjs +2 -0
- package/dist/chunks/{orgs-Ni22buHs.cjs.map → orgs-BefGgeyc.cjs.map} +1 -1
- package/dist/chunks/providers-BsEn3ikK.cjs +2 -0
- package/dist/chunks/{providers-D_zTbkQH.cjs.map → providers-BsEn3ikK.cjs.map} +1 -1
- package/dist/chunks/{providers-DEqcuXw9.js → providers-DjLh4oLY.js} +3 -3
- package/dist/chunks/{providers-DEqcuXw9.js.map → providers-DjLh4oLY.js.map} +1 -1
- package/dist/chunks/{chunk-CMqjfN_6.cjs → rolldown-runtime-BocRIvOZ.cjs} +1 -1
- package/dist/chunks/router-adapter--gYs13E8.cjs.map +1 -1
- package/dist/chunks/routes-config-fDVHmvXi.cjs.map +1 -1
- package/dist/chunks/users-C9LA-Rd7.cjs +2 -0
- package/dist/chunks/{users-0HqlM_VQ.cjs.map → users-C9LA-Rd7.cjs.map} +1 -1
- package/dist/chunks/users-FWrb3ehW.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/next/index.cjs +1 -1
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.js +9 -9
- package/dist/next/index.js.map +1 -1
- package/dist/next/workflow-chat-route.cjs +1 -1
- package/dist/next/workflow-chat-route.cjs.map +1 -1
- package/dist/next/workflow-chat-route.js +2 -1
- package/dist/next/workflow-chat-route.js.map +1 -1
- package/dist/pages/admin/delegations/index.cjs +1 -1
- package/dist/pages/admin/delegations/index.cjs.map +1 -1
- package/dist/pages/admin/delegations/index.js +1 -1
- package/dist/pages/admin/orgs/index.cjs +1 -1
- package/dist/pages/admin/orgs/index.cjs.map +1 -1
- package/dist/pages/admin/orgs/index.js +1 -1
- package/dist/pages/admin/users/index.cjs +1 -1
- package/dist/pages/admin/users/index.cjs.map +1 -1
- package/dist/pages/cc/index.cjs.map +1 -1
- package/dist/pages/dashboard/index.cjs.map +1 -1
- package/dist/pages/delegations/index.cjs +1 -1
- package/dist/pages/delegations/index.cjs.map +1 -1
- package/dist/pages/delegations/index.js +1 -1
- package/dist/pages/inbox/index.cjs.map +1 -1
- package/dist/pages/instances/detail/index.cjs +1 -1
- package/dist/pages/instances/detail/index.cjs.map +1 -1
- package/dist/pages/instances/detail/index.js +1 -1
- package/dist/pages/instances/new/index.cjs.map +1 -1
- package/dist/pages/login/index.cjs.map +1 -1
- package/dist/pages/root/index.cjs.map +1 -1
- package/dist/pages/search/index.cjs.map +1 -1
- package/dist/pages/sent/index.cjs.map +1 -1
- package/dist/pages/settings/notifications/index.cjs +1 -1
- package/dist/pages/settings/notifications/index.cjs.map +1 -1
- package/dist/pages/templates/categories/index.cjs +1 -1
- package/dist/pages/templates/categories/index.cjs.map +1 -1
- package/dist/pages/templates/compose/index.cjs +1 -1
- package/dist/pages/templates/compose/index.cjs.map +1 -1
- package/dist/pages/templates/compose/index.js +1 -1
- package/dist/pages/templates/designer/index.cjs +1 -1
- package/dist/pages/templates/designer/index.cjs.map +1 -1
- package/dist/pages/templates/designer/index.js +1 -1
- package/dist/pages/templates/index.cjs.map +1 -1
- package/dist/pages/templates/versions/index.cjs.map +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.js +2 -2
- package/dist/views/admin/orgs/index.cjs +1 -1
- package/dist/views/admin/orgs/index.js +1 -1
- package/dist/views/admin/users/index.cjs +1 -1
- package/dist/views/cc/index.cjs +1 -1
- package/dist/views/cc/index.cjs.map +1 -1
- package/dist/views/dashboard/index.cjs +1 -1
- package/dist/views/dashboard/index.cjs.map +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.cjs.map +1 -1
- package/dist/views/inbox/index.js.map +1 -1
- package/dist/views/instances/detail/index.cjs +1 -1
- package/dist/views/instances/detail/index.js +1 -1
- package/dist/views/instances/new/index.cjs +1 -1
- package/dist/views/instances/new/index.cjs.map +1 -1
- package/dist/views/instances/new/index.js +1 -1
- package/dist/views/instances/new/index.js.map +1 -1
- package/dist/views/search/index.cjs +1 -1
- package/dist/views/search/index.cjs.map +1 -1
- package/dist/views/sent/index.cjs +1 -1
- package/dist/views/sent/index.cjs.map +1 -1
- package/dist/views/settings/index.cjs +1 -1
- package/dist/views/settings/notifications/index.cjs +1 -1
- package/dist/views/templates/categories/index.cjs +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/index.cjs +1 -1
- package/dist/views/templates/designer/index.js +1 -1
- package/dist/views/templates/index.cjs +1 -1
- package/dist/views/templates/index.cjs.map +1 -1
- package/dist/views/templates/index.js.map +1 -1
- package/dist/views/templates/versions/index.cjs +1 -1
- package/dist/views/templates/versions/index.cjs.map +1 -1
- package/dist/views/templates/versions/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/chunks/FormBuilderView-D6baVqBY.cjs +0 -3
- package/dist/chunks/FormRendererView-Cw9LiidV.cjs +0 -2
- package/dist/chunks/approval-instance-list-page-C408vxE2.cjs +0 -2
- package/dist/chunks/categories-DUfldZ_9.cjs +0 -2
- package/dist/chunks/compose-CODnd9-2.cjs +0 -2
- package/dist/chunks/dashboard-page-DwHQY6Ki.cjs +0 -2
- package/dist/chunks/delegations-CGj-tZNO.cjs +0 -2
- package/dist/chunks/delegations-kbMOSEif.cjs +0 -2
- package/dist/chunks/designer-Cdn10NNl.cjs +0 -65
- package/dist/chunks/detail-CtVu5NTi.cjs +0 -2
- package/dist/chunks/format-date-time-XxBzF0F5.cjs +0 -2
- package/dist/chunks/notifications--hwl-DR0.cjs +0 -2
- package/dist/chunks/orgs-Ni22buHs.cjs +0 -2
- package/dist/chunks/providers-D_zTbkQH.cjs +0 -2
- package/dist/chunks/users-0HqlM_VQ.cjs +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delegations-DqMpI_Nk.js","names":[],"sources":["../../src/views/delegations/delegations.module.scss","../../src/views/delegations/DelegationsView.tsx"],"sourcesContent":[".delegationFilterArea {\n :global(.mzn-filter-area__actions) {\n display: none;\n }\n\n :global(.mzn-form-field__label-area) {\n display: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n}\n\n.delegationModalFields {\n display: grid;\n gap: 12px;\n width: 100%;\n\n :global(.mzn-form-field--horizontal) {\n align-items: flex-start;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label-area) {\n flex: 0 0 112px;\n width: 112px;\n min-width: 112px;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label) {\n flex-wrap: nowrap;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__data-entry) {\n flex: 1 1 auto;\n align-items: stretch;\n min-width: 0;\n max-width: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-autocomplete) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-input),\n :global(.mzn-input-container),\n :global(.mzn-picker),\n :global(.mzn-select),\n :global(.mzn-select-trigger),\n :global(.mzn-text-field) {\n width: 100%;\n min-width: 0 !important;\n }\n\n :global(.mzn-select-trigger__input) {\n width: 100%;\n min-width: 0 !important;\n text-overflow: ellipsis;\n }\n}\n\n.memberNameWithTooltip {\n cursor: help;\n text-decoration: underline dotted;\n text-underline-offset: 3px;\n}\n","'use client';\n\nimport {\n Key,\n ReactElement,\n RefCallback,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n AutoComplete,\n Badge,\n Button,\n DateTimePicker,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Select,\n Tab,\n TabItem,\n Table,\n Tooltip,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { BPMFormField } from '../../components/bpm-form-field';\nimport { formatDateTime } from '../../lib/format-date-time';\nimport { useAuth } from '../../lib/auth-provider';\nimport {\n DelegationRuleRecord,\n DelegationRuleStatus,\n DelegationScopeType,\n MemberProfileRecord,\n createDelegationRule,\n listDelegationRulesPage,\n revokeDelegationRule,\n searchMembers,\n} from '@rytass/bpm-core-client/workflow';\nimport {\n ApprovalTemplateRecord,\n listApprovalTemplates,\n} from '@rytass/bpm-core-client/template';\nimport styles from './delegations.module.scss';\n\ntype DelegationStatusTabKey = 'ALL' | DelegationRuleStatus;\n\ntype MemberOption = Readonly<{\n displayName: string;\n email: string | null;\n id: string;\n name: string;\n}>;\n\ntype ScopeOption = Readonly<{\n id: DelegationScopeType;\n name: string;\n}>;\n\ntype ScopeFilterOption = Readonly<{\n id: 'ALL_SCOPES' | DelegationScopeType;\n name: string;\n scopeType: DelegationScopeType | null;\n}>;\n\ntype TemplateOption = Readonly<{\n id: string;\n name: string;\n}>;\n\ntype DelegationRuleRow = Readonly<\n Record<string, unknown> &\n DelegationRuleRecord & {\n agentEmail: string | null;\n agentName: string;\n key: string;\n scopeLabel: string;\n }\n>;\n\nconst DELEGATION_MODAL_FIELD_LAYOUT = FormFieldLayout.HORIZONTAL;\nconst DELEGATION_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst DELEGATION_STATUS_TABS: readonly {\n readonly key: DelegationStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'ACTIVE', label: '啟用中' },\n { key: 'REVOKED', label: '已撤銷' },\n { key: 'EXPIRED', label: '已過期' },\n];\nconst SCOPE_FILTER_OPTIONS: readonly ScopeFilterOption[] = [\n { id: 'ALL_SCOPES', name: '全部範圍', scopeType: null },\n { id: 'ALL', name: '全部簽核', scopeType: 'ALL' },\n { id: 'TEMPLATE_LIST', name: '指定模板', scopeType: 'TEMPLATE_LIST' },\n];\nconst SCOPE_OPTIONS: readonly ScopeOption[] = [\n { id: 'ALL', name: '全部簽核' },\n { id: 'TEMPLATE_LIST', name: '指定模板' },\n];\n\nexport function DelegationsView(): ReactElement {\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [agentMember, setAgentMember] = useState<MemberOption | null>(null);\n const [endAt, setEndAt] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [memberLoading, setMemberLoading] = useState(false);\n const [memberOptions, setMemberOptions] = useState<readonly MemberOption[]>(\n [],\n );\n const [modalOpen, setModalOpen] = useState(false);\n const [rulePage, setRulePage] = useState(1);\n const [rulePageSize, setRulePageSize] = useState(10);\n const [ruleStatus, setRuleStatus] = useState<DelegationStatusTabKey>('ALL');\n const [ruleTotalCount, setRuleTotalCount] = useState(0);\n const [rules, setRules] = useState<readonly DelegationRuleRecord[]>([]);\n const [saving, setSaving] = useState(false);\n const [scopeFilterType, setScopeFilterType] = useState<ScopeFilterOption>(\n SCOPE_FILTER_OPTIONS[0],\n );\n const [scopeTemplates, setScopeTemplates] = useState<\n readonly TemplateOption[]\n >([]);\n const [scopeType, setScopeType] = useState<ScopeOption>(SCOPE_OPTIONS[0]);\n const [startAt, setStartAt] = useState('');\n const [templateLoading, setTemplateLoading] = useState(false);\n const [templateOptions, setTemplateOptions] = useState<\n readonly TemplateOption[]\n >([]);\n const refreshRequestIdRef = useRef(0);\n\n const refreshRules = useCallback(async (): Promise<void> => {\n const requestId = refreshRequestIdRef.current + 1;\n refreshRequestIdRef.current = requestId;\n\n if (!currentMemberId) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const [rulePageResult, members] = await Promise.all([\n listDelegationRulesPage({\n includeInactive: true,\n page: rulePage,\n pageSize: rulePageSize,\n principalMemberId: currentMemberId,\n scopeType: scopeFilterType.scopeType,\n status: ruleStatus === 'ALL' ? null : ruleStatus,\n }),\n searchMembers(''),\n ]);\n\n if (requestId === refreshRequestIdRef.current) {\n setRules(rulePageResult.rules);\n setRuleTotalCount(rulePageResult.totalCount);\n setMemberOptions(members.map(readMemberOption));\n }\n } catch (requestError: unknown) {\n if (requestId === refreshRequestIdRef.current) {\n setError(readErrorMessage(requestError));\n }\n } finally {\n if (requestId === refreshRequestIdRef.current) {\n setLoading(false);\n }\n }\n }, [currentMemberId, rulePage, rulePageSize, ruleStatus, scopeFilterType]);\n\n useEffect((): void => {\n void refreshRules();\n }, [refreshRules]);\n\n const membersById = useMemo(\n (): ReadonlyMap<string, MemberOption> =>\n new Map(memberOptions.map((option) => [option.id, option])),\n [memberOptions],\n );\n const rows = useMemo(\n (): DelegationRuleRow[] =>\n rules.map((rule) => ({\n ...rule,\n agentEmail: membersById.get(rule.agentMemberId)?.email ?? null,\n agentName:\n membersById.get(rule.agentMemberId)?.displayName ??\n rule.agentMemberId,\n key: rule.id,\n scopeLabel: readScopeLabel(rule),\n })),\n [membersById, rules],\n );\n const selectedScopeType =\n SCOPE_OPTIONS.find((option) => option.id === scopeType.id) ??\n SCOPE_OPTIONS[0];\n const columns = useMemo(\n (): TableColumn<DelegationRuleRow>[] => [\n {\n key: 'agent',\n render: (record: DelegationRuleRow): ReactElement => (\n <MemberNameWithEmailTooltip\n email={record.agentEmail}\n name={record.agentName}\n />\n ),\n title: '代理人',\n width: 220,\n },\n { dataIndex: 'scopeLabel', key: 'scope', title: '代理範圍', width: 220 },\n {\n key: 'status',\n render: (record: DelegationRuleRow): ReactElement => (\n <DelegationStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n {\n key: 'startAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(record.startAt)}\n </Typography>\n ),\n title: '開始時間',\n width: 220,\n },\n {\n key: 'endAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {record.endAt ? formatDateTime(record.endAt) : '-'}\n </Typography>\n ),\n title: '結束時間',\n width: 220,\n },\n ],\n [],\n );\n const handleRevoke = useCallback(\n async (id: string): Promise<void> => {\n if (!currentMemberId) {\n return;\n }\n\n setError(null);\n\n try {\n await revokeDelegationRule({\n id,\n revokedByMemberId: currentMemberId,\n });\n await refreshRules();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n }\n },\n [currentMemberId, refreshRules],\n );\n const tableActions = useMemo(\n (): TableActions<DelegationRuleRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<DelegationRuleRow>['render']> =>\n record.status === 'ACTIVE'\n ? [\n {\n name: '撤銷',\n onClick: (): void => void handleRevoke(record.id),\n },\n ]\n : [],\n variant: 'destructive-secondary',\n width: 88,\n }),\n [handleRevoke],\n );\n\n async function handleSearchMembers(searchText: string): Promise<void> {\n setMemberLoading(true);\n\n try {\n setMemberOptions((await searchMembers(searchText)).map(readMemberOption));\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setMemberLoading(false);\n }\n }\n\n async function handleSearchTemplates(\n searchText: string,\n selectedOptions: readonly TemplateOption[] = scopeTemplates,\n ): Promise<void> {\n setTemplateLoading(true);\n\n try {\n const nextOptions = (await listApprovalTemplates()).map(\n readTemplateOption,\n );\n\n setTemplateOptions(\n mergeTemplateOptions(\n selectedOptions,\n filterTemplateOptions(nextOptions, searchText),\n ),\n );\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setTemplateLoading(false);\n }\n }\n\n function openCreateModal(): void {\n setAgentMember(null);\n setEndAt('');\n setScopeTemplates([]);\n setScopeType(SCOPE_OPTIONS[0]);\n setStartAt('');\n setTemplateOptions([]);\n void handleSearchTemplates('', []);\n setModalOpen(true);\n }\n\n function closeCreateModal(): void {\n if (saving) {\n return;\n }\n\n setModalOpen(false);\n }\n\n async function handleCreate(): Promise<void> {\n if (!currentMemberId) {\n return;\n }\n\n if (!agentMember) {\n setError('請選擇代理人');\n return;\n }\n\n if (agentMember.id === currentMemberId) {\n setError('代理人不可設定為自己');\n return;\n }\n\n if (selectedScopeType.id === 'TEMPLATE_LIST' && scopeTemplates.length < 1) {\n setError('請選擇至少一個簽核模板');\n return;\n }\n\n if (isInvalidDelegationDateRange(startAt, endAt)) {\n setError('結束時間必須晚於起始時間');\n return;\n }\n\n setSaving(true);\n setError(null);\n\n try {\n await createDelegationRule({\n agentMemberId: agentMember.id,\n createdByMemberId: currentMemberId,\n endAt: endAt || null,\n principalMemberId: currentMemberId,\n priority: 100,\n requiresConfirmation: false,\n scopeConditionCel: null,\n scopeTemplateIds:\n selectedScopeType.id === 'TEMPLATE_LIST'\n ? scopeTemplates.map((template) => template.id)\n : [],\n scopeType: selectedScopeType.id,\n startAt: startAt || null,\n });\n setModalOpen(false);\n\n if (rulePage === 1) {\n await refreshRules();\n } else {\n setRulePage(1);\n }\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <>\n <PageHeader>\n <ContentHeader\n description=\"設定自己的簽核代理,讓指定期間內的新待簽任務自動交由代理人處理。\"\n title=\"我的代理\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={openCreateModal}\n variant=\"base-primary\"\n >\n 建立代理\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.delegationFilterArea} size=\"sub\">\n <FilterLine>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"scopeFilterType\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => {\n setScopeFilterType(readScopeFilterOption(option));\n setRulePage(1);\n }}\n options={[...SCOPE_FILTER_OPTIONS]}\n placeholder=\"代理範圍\"\n size=\"sub\"\n value={scopeFilterType}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={ruleStatus}\n onChange={(activeKey): void => {\n setRuleStatus(readDelegationStatusTabKey(activeKey));\n setRulePage(1);\n }}\n >\n {DELEGATION_STATUS_TABS.map((statusTab) => (\n <TabItem key={statusTab.key}>{statusTab.label}</TabItem>\n ))}\n </Tab>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <Table\n actions={tableActions}\n columns={columns}\n dataSource={rows}\n fullWidth\n loading={loading}\n pagination={{\n current: rulePage,\n onChange: (page): void => {\n setRulePage(page);\n },\n onChangePageSize: (pageSize): void => {\n setRulePage(1);\n setRulePageSize(pageSize);\n },\n pageSize: rulePageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: DELEGATION_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: ruleTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{\n disabled: !agentMember,\n }}\n confirmText=\"建立代理\"\n loading={saving}\n modalType=\"standard\"\n onCancel={closeCreateModal}\n onClose={closeCreateModal}\n onConfirm={(): void => void handleCreate()}\n open={modalOpen}\n showModalFooter\n showModalHeader\n size=\"regular\"\n supportingText=\"代理生效後,後續建立的待簽任務會依範圍自動指派給代理人。\"\n title=\"建立個人代理\"\n >\n <div className={styles.delegationModalFields}>\n <MemberAutoCompleteField\n label=\"代理人\"\n loading={memberLoading}\n name=\"agentMemberId\"\n onChange={setAgentMember}\n onSearch={handleSearchMembers}\n options={memberOptions}\n value={agentMember}\n />\n <BPMFormField label=\"代理範圍\" name=\"scopeType\" required>\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void =>\n setScopeType(readScopeOptionFromValue(option))\n }\n options={[...SCOPE_OPTIONS]}\n placeholder=\"選擇代理範圍\"\n value={selectedScopeType}\n />\n </BPMFormField>\n {selectedScopeType.id === 'TEMPLATE_LIST' ? (\n <BPMFormField label=\"簽核模板\" name=\"scopeTemplateIds\" required>\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的模板\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name: 'scopeTemplateIds',\n spellCheck: false,\n }}\n loading={templateLoading}\n loadingText=\"搜尋模板中...\"\n mode=\"multiple\"\n onChange={(nextTemplates): void => {\n const selectedTemplates =\n readTemplateOptionsFromValue(nextTemplates);\n\n setScopeTemplates(selectedTemplates);\n setTemplateOptions((currentOptions) =>\n mergeTemplateOptions(selectedTemplates, currentOptions),\n );\n }}\n onSearch={handleSearchTemplates}\n onVisibilityChange={(open): void => {\n if (open) {\n void handleSearchTemplates('');\n }\n }}\n options={[...templateOptions]}\n overflowStrategy=\"wrap\"\n placeholder=\"搜尋並選取簽核模板\"\n searchDebounceTime={300}\n value={[...scopeTemplates]}\n />\n </BPMFormField>\n ) : null}\n <BPMFormField label=\"起始時間\" name=\"startAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setStartAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"留空立即生效\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(startAt)}\n />\n </BPMFormField>\n <BPMFormField label=\"結束時間\" name=\"endAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setEndAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"可留空\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(endAt)}\n />\n </BPMFormField>\n </div>\n </Modal>\n </>\n );\n}\n\nfunction MemberAutoCompleteField({\n label,\n loading,\n name,\n onChange,\n onSearch,\n options,\n value,\n}: {\n readonly label: string;\n readonly loading: boolean;\n readonly name: string;\n readonly onChange: (option: MemberOption | null) => void;\n readonly onSearch: (searchText: string) => Promise<void>;\n readonly options: readonly MemberOption[];\n readonly value: MemberOption | null;\n}): ReactElement {\n return (\n <BPMFormField\n label={label}\n layout={DELEGATION_MODAL_FIELD_LAYOUT}\n name={name}\n required\n >\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的成員\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name,\n spellCheck: false,\n }}\n loading={loading}\n loadingText=\"搜尋成員中...\"\n mode=\"single\"\n onChange={(option): void => onChange(readMemberOptionFromValue(option))}\n onSearch={onSearch}\n onSearchTextChange={(searchText): void =>\n onChange(readUniqueMemberOption(searchText, options))\n }\n onVisibilityChange={(open): void => {\n if (open) {\n void onSearch('');\n }\n }}\n options={[...options]}\n placeholder=\"搜尋姓名或信箱\"\n searchDebounceTime={300}\n value={value}\n />\n </BPMFormField>\n );\n}\n\nfunction MemberNameWithEmailTooltip({\n email,\n name,\n}: {\n readonly email: string | null;\n readonly name: string;\n}): ReactElement {\n if (!email) {\n return <span>{name}</span>;\n }\n\n return (\n <Tooltip title={email}>\n {({ onMouseEnter, onMouseLeave, ref }): ReactElement => (\n <span\n className={styles.memberNameWithTooltip}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n ref={ref as RefCallback<HTMLSpanElement>}\n >\n {name}\n </span>\n )}\n </Tooltip>\n );\n}\n\nfunction readMemberOption(member: MemberProfileRecord): MemberOption {\n return {\n displayName: member.name,\n email: member.email,\n id: member.memberId,\n name: `${member.name} (${member.email})`,\n };\n}\n\nfunction readMemberOptionFromValue(value: unknown): MemberOption | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const displayName = value.displayName;\n const email = value.email;\n const id = value.id;\n const name = value.name;\n\n return typeof id === 'string' && typeof name === 'string'\n ? {\n displayName: typeof displayName === 'string' ? displayName : name,\n email: typeof email === 'string' ? email : null,\n id,\n name,\n }\n : null;\n}\n\nfunction readUniqueMemberOption(\n searchText: string,\n options: readonly MemberOption[],\n): MemberOption | null {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return null;\n }\n\n const matches = options.filter((option) =>\n [option.id, option.name, option.email ?? ''].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n\n return matches.length === 1 ? (matches[0] ?? null) : null;\n}\n\nfunction readTemplateOption(template: ApprovalTemplateRecord): TemplateOption {\n return {\n id: template.id,\n name: template.name,\n };\n}\n\nfunction readTemplateOptionsFromValue(\n value: readonly unknown[],\n): readonly TemplateOption[] {\n return value.flatMap((item): readonly TemplateOption[] => {\n if (!isRecord(item)) {\n return [];\n }\n\n const id = item.id;\n const name = item.name;\n\n return typeof id === 'string' && typeof name === 'string'\n ? [{ id, name }]\n : [];\n });\n}\n\nfunction filterTemplateOptions(\n options: readonly TemplateOption[],\n searchText: string,\n): readonly TemplateOption[] {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return options;\n }\n\n return options.filter((option) =>\n [option.id, option.name].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n}\n\nfunction mergeTemplateOptions(\n selectedOptions: readonly TemplateOption[],\n availableOptions: readonly TemplateOption[],\n): readonly TemplateOption[] {\n return [...selectedOptions, ...availableOptions].reduce<TemplateOption[]>(\n (options, option) =>\n options.some((currentOption) => currentOption.id === option.id)\n ? options\n : [...options, option],\n [],\n );\n}\n\nfunction readScopeFilterOption(value: unknown): ScopeFilterOption {\n if (!isRecord(value)) {\n return SCOPE_FILTER_OPTIONS[0];\n }\n\n const id = value.id;\n\n return (\n SCOPE_FILTER_OPTIONS.find((option) => option.id === id) ??\n SCOPE_FILTER_OPTIONS[0]\n );\n}\n\nfunction readScopeLabel(rule: DelegationRuleRecord): string {\n if (rule.scopeType === 'ALL') {\n return '全部簽核';\n }\n\n if (rule.scopeType === 'TEMPLATE_LIST') {\n return `指定模板:${rule.scopeTemplateIds.length}`;\n }\n\n return rule.scopeConditionCel ? `條件:${rule.scopeConditionCel}` : '條件式';\n}\n\nfunction readScopeOptionFromValue(value: unknown): ScopeOption {\n if (!isRecord(value) || !isSelectableDelegationScopeType(value.id)) {\n return SCOPE_OPTIONS[0];\n }\n\n return (\n SCOPE_OPTIONS.find((option) => option.id === value.id) ?? SCOPE_OPTIONS[0]\n );\n}\n\nfunction isSelectableDelegationScopeType(\n value: unknown,\n): value is ScopeOption['id'] {\n return value === 'ALL' || value === 'TEMPLATE_LIST';\n}\n\nfunction DelegationStatusBadge({\n status,\n}: {\n readonly status: DelegationRuleRecord['status'];\n}): ReactElement {\n if (status === 'ACTIVE') {\n return <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />;\n }\n\n if (status === 'REVOKED') {\n return <Badge size=\"sub\" text=\"已撤銷\" variant=\"dot-inactive\" />;\n }\n\n if (status === 'EXPIRED') {\n return <Badge size=\"sub\" text=\"已過期\" variant=\"dot-warning\" />;\n }\n\n return <Badge size=\"sub\" text={status} variant=\"dot-info\" />;\n}\n\nfunction readDelegationStatusTabKey(activeKey: Key): DelegationStatusTabKey {\n if (\n activeKey === 'ACTIVE' ||\n activeKey === 'REVOKED' ||\n activeKey === 'EXPIRED'\n ) {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction readDelegationDateTimePickerValue(value: string): string | undefined {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date\n ? `${formatDateParts(date)}T${padDatePart(date.getHours())}:${padDatePart(\n date.getMinutes(),\n )}`\n : undefined;\n}\n\nfunction formatDelegationDateTimePickerValue(\n value: string | undefined,\n): string {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date ? date.toISOString() : '';\n}\n\nfunction isInvalidDelegationDateRange(startAt: string, endAt: string): boolean {\n if (!startAt || !endAt) {\n return false;\n }\n\n const startDate = parseDelegationDateTimeValue(startAt);\n const endDate = parseDelegationDateTimeValue(endAt);\n\n return !!startDate && !!endDate && endDate.getTime() <= startDate.getTime();\n}\n\nfunction parseDelegationDateTimeValue(value: string): Date | null {\n if (value.endsWith('Z') || /[+-]\\d{2}:\\d{2}$/.test(value)) {\n const parsedDate = new Date(value);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n }\n\n const [datePart = '', timePart = '00:00'] = value.split('T');\n const [year = 0, month = 1, day = 1] = datePart.split('-').map(Number);\n const [hour = 0, minute = 0] = timePart.split(':').map(Number);\n const parsedDate = new Date(year, month - 1, day, hour, minute);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n}\n\nfunction formatDateParts(date: Date): string {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(\n date.getDate(),\n )}`;\n}\n\nfunction padDatePart(value: number): string {\n return String(value).padStart(2, '0');\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"delegations-DyMGIDpp.js","names":[],"sources":["../../src/views/delegations/delegations.module.scss","../../src/views/delegations/DelegationsView.tsx"],"sourcesContent":[".delegationFilterArea {\n :global(.mzn-filter-area__actions) {\n display: none;\n }\n\n :global(.mzn-form-field__label-area) {\n display: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n}\n\n.delegationModalFields {\n display: grid;\n gap: 12px;\n width: 100%;\n\n :global(.mzn-form-field--horizontal) {\n align-items: flex-start;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label-area) {\n flex: 0 0 112px;\n width: 112px;\n min-width: 112px;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label) {\n flex-wrap: nowrap;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__data-entry) {\n flex: 1 1 auto;\n align-items: stretch;\n min-width: 0;\n max-width: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-autocomplete) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-input),\n :global(.mzn-input-container),\n :global(.mzn-picker),\n :global(.mzn-select),\n :global(.mzn-select-trigger),\n :global(.mzn-text-field) {\n width: 100%;\n min-width: 0 !important;\n }\n\n :global(.mzn-select-trigger__input) {\n width: 100%;\n min-width: 0 !important;\n text-overflow: ellipsis;\n }\n}\n\n.memberNameWithTooltip {\n cursor: help;\n text-decoration: underline dotted;\n text-underline-offset: 3px;\n}\n","'use client';\n\nimport {\n Key,\n ReactElement,\n RefCallback,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n AutoComplete,\n Badge,\n Button,\n DateTimePicker,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Select,\n Tab,\n TabItem,\n Table,\n Tooltip,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { BPMFormField } from '../../components/bpm-form-field';\nimport { formatDateTime } from '../../lib/format-date-time';\nimport { useAuth } from '../../lib/auth-provider';\nimport {\n DelegationRuleRecord,\n DelegationRuleStatus,\n DelegationScopeType,\n MemberProfileRecord,\n createDelegationRule,\n listDelegationRulesPage,\n revokeDelegationRule,\n searchMembers,\n} from '@rytass/bpm-core-client/workflow';\nimport {\n ApprovalTemplateRecord,\n listApprovalTemplates,\n} from '@rytass/bpm-core-client/template';\nimport styles from './delegations.module.scss';\n\ntype DelegationStatusTabKey = 'ALL' | DelegationRuleStatus;\n\ntype MemberOption = Readonly<{\n displayName: string;\n email: string | null;\n id: string;\n name: string;\n}>;\n\ntype ScopeOption = Readonly<{\n id: DelegationScopeType;\n name: string;\n}>;\n\ntype ScopeFilterOption = Readonly<{\n id: 'ALL_SCOPES' | DelegationScopeType;\n name: string;\n scopeType: DelegationScopeType | null;\n}>;\n\ntype TemplateOption = Readonly<{\n id: string;\n name: string;\n}>;\n\ntype DelegationRuleRow = Readonly<\n Record<string, unknown> &\n DelegationRuleRecord & {\n agentEmail: string | null;\n agentName: string;\n key: string;\n scopeLabel: string;\n }\n>;\n\nconst DELEGATION_MODAL_FIELD_LAYOUT = FormFieldLayout.HORIZONTAL;\nconst DELEGATION_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst DELEGATION_STATUS_TABS: readonly {\n readonly key: DelegationStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'ACTIVE', label: '啟用中' },\n { key: 'REVOKED', label: '已撤銷' },\n { key: 'EXPIRED', label: '已過期' },\n];\nconst SCOPE_FILTER_OPTIONS: readonly ScopeFilterOption[] = [\n { id: 'ALL_SCOPES', name: '全部範圍', scopeType: null },\n { id: 'ALL', name: '全部簽核', scopeType: 'ALL' },\n { id: 'TEMPLATE_LIST', name: '指定模板', scopeType: 'TEMPLATE_LIST' },\n];\nconst SCOPE_OPTIONS: readonly ScopeOption[] = [\n { id: 'ALL', name: '全部簽核' },\n { id: 'TEMPLATE_LIST', name: '指定模板' },\n];\n\nexport function DelegationsView(): ReactElement {\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [agentMember, setAgentMember] = useState<MemberOption | null>(null);\n const [endAt, setEndAt] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [memberLoading, setMemberLoading] = useState(false);\n const [memberOptions, setMemberOptions] = useState<readonly MemberOption[]>(\n [],\n );\n const [modalOpen, setModalOpen] = useState(false);\n const [rulePage, setRulePage] = useState(1);\n const [rulePageSize, setRulePageSize] = useState(10);\n const [ruleStatus, setRuleStatus] = useState<DelegationStatusTabKey>('ALL');\n const [ruleTotalCount, setRuleTotalCount] = useState(0);\n const [rules, setRules] = useState<readonly DelegationRuleRecord[]>([]);\n const [saving, setSaving] = useState(false);\n const [scopeFilterType, setScopeFilterType] = useState<ScopeFilterOption>(\n SCOPE_FILTER_OPTIONS[0],\n );\n const [scopeTemplates, setScopeTemplates] = useState<\n readonly TemplateOption[]\n >([]);\n const [scopeType, setScopeType] = useState<ScopeOption>(SCOPE_OPTIONS[0]);\n const [startAt, setStartAt] = useState('');\n const [templateLoading, setTemplateLoading] = useState(false);\n const [templateOptions, setTemplateOptions] = useState<\n readonly TemplateOption[]\n >([]);\n const refreshRequestIdRef = useRef(0);\n\n const refreshRules = useCallback(async (): Promise<void> => {\n const requestId = refreshRequestIdRef.current + 1;\n refreshRequestIdRef.current = requestId;\n\n if (!currentMemberId) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const [rulePageResult, members] = await Promise.all([\n listDelegationRulesPage({\n includeInactive: true,\n page: rulePage,\n pageSize: rulePageSize,\n principalMemberId: currentMemberId,\n scopeType: scopeFilterType.scopeType,\n status: ruleStatus === 'ALL' ? null : ruleStatus,\n }),\n searchMembers(''),\n ]);\n\n if (requestId === refreshRequestIdRef.current) {\n setRules(rulePageResult.rules);\n setRuleTotalCount(rulePageResult.totalCount);\n setMemberOptions(members.map(readMemberOption));\n }\n } catch (requestError: unknown) {\n if (requestId === refreshRequestIdRef.current) {\n setError(readErrorMessage(requestError));\n }\n } finally {\n if (requestId === refreshRequestIdRef.current) {\n setLoading(false);\n }\n }\n }, [currentMemberId, rulePage, rulePageSize, ruleStatus, scopeFilterType]);\n\n useEffect((): void => {\n void refreshRules();\n }, [refreshRules]);\n\n const membersById = useMemo(\n (): ReadonlyMap<string, MemberOption> =>\n new Map(memberOptions.map((option) => [option.id, option])),\n [memberOptions],\n );\n const rows = useMemo(\n (): DelegationRuleRow[] =>\n rules.map((rule) => ({\n ...rule,\n agentEmail: membersById.get(rule.agentMemberId)?.email ?? null,\n agentName:\n membersById.get(rule.agentMemberId)?.displayName ??\n rule.agentMemberId,\n key: rule.id,\n scopeLabel: readScopeLabel(rule),\n })),\n [membersById, rules],\n );\n const selectedScopeType =\n SCOPE_OPTIONS.find((option) => option.id === scopeType.id) ??\n SCOPE_OPTIONS[0];\n const columns = useMemo(\n (): TableColumn<DelegationRuleRow>[] => [\n {\n key: 'agent',\n render: (record: DelegationRuleRow): ReactElement => (\n <MemberNameWithEmailTooltip\n email={record.agentEmail}\n name={record.agentName}\n />\n ),\n title: '代理人',\n width: 220,\n },\n { dataIndex: 'scopeLabel', key: 'scope', title: '代理範圍', width: 220 },\n {\n key: 'status',\n render: (record: DelegationRuleRow): ReactElement => (\n <DelegationStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n {\n key: 'startAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(record.startAt)}\n </Typography>\n ),\n title: '開始時間',\n width: 220,\n },\n {\n key: 'endAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {record.endAt ? formatDateTime(record.endAt) : '-'}\n </Typography>\n ),\n title: '結束時間',\n width: 220,\n },\n ],\n [],\n );\n const handleRevoke = useCallback(\n async (id: string): Promise<void> => {\n if (!currentMemberId) {\n return;\n }\n\n setError(null);\n\n try {\n await revokeDelegationRule({\n id,\n revokedByMemberId: currentMemberId,\n });\n await refreshRules();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n }\n },\n [currentMemberId, refreshRules],\n );\n const tableActions = useMemo(\n (): TableActions<DelegationRuleRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<DelegationRuleRow>['render']> =>\n record.status === 'ACTIVE'\n ? [\n {\n name: '撤銷',\n onClick: (): void => void handleRevoke(record.id),\n },\n ]\n : [],\n variant: 'destructive-secondary',\n width: 88,\n }),\n [handleRevoke],\n );\n\n async function handleSearchMembers(searchText: string): Promise<void> {\n setMemberLoading(true);\n\n try {\n setMemberOptions((await searchMembers(searchText)).map(readMemberOption));\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setMemberLoading(false);\n }\n }\n\n async function handleSearchTemplates(\n searchText: string,\n selectedOptions: readonly TemplateOption[] = scopeTemplates,\n ): Promise<void> {\n setTemplateLoading(true);\n\n try {\n const nextOptions = (await listApprovalTemplates()).map(\n readTemplateOption,\n );\n\n setTemplateOptions(\n mergeTemplateOptions(\n selectedOptions,\n filterTemplateOptions(nextOptions, searchText),\n ),\n );\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setTemplateLoading(false);\n }\n }\n\n function openCreateModal(): void {\n setAgentMember(null);\n setEndAt('');\n setScopeTemplates([]);\n setScopeType(SCOPE_OPTIONS[0]);\n setStartAt('');\n setTemplateOptions([]);\n void handleSearchTemplates('', []);\n setModalOpen(true);\n }\n\n function closeCreateModal(): void {\n if (saving) {\n return;\n }\n\n setModalOpen(false);\n }\n\n async function handleCreate(): Promise<void> {\n if (!currentMemberId) {\n return;\n }\n\n if (!agentMember) {\n setError('請選擇代理人');\n return;\n }\n\n if (agentMember.id === currentMemberId) {\n setError('代理人不可設定為自己');\n return;\n }\n\n if (selectedScopeType.id === 'TEMPLATE_LIST' && scopeTemplates.length < 1) {\n setError('請選擇至少一個簽核模板');\n return;\n }\n\n if (isInvalidDelegationDateRange(startAt, endAt)) {\n setError('結束時間必須晚於起始時間');\n return;\n }\n\n setSaving(true);\n setError(null);\n\n try {\n await createDelegationRule({\n agentMemberId: agentMember.id,\n createdByMemberId: currentMemberId,\n endAt: endAt || null,\n principalMemberId: currentMemberId,\n priority: 100,\n requiresConfirmation: false,\n scopeConditionCel: null,\n scopeTemplateIds:\n selectedScopeType.id === 'TEMPLATE_LIST'\n ? scopeTemplates.map((template) => template.id)\n : [],\n scopeType: selectedScopeType.id,\n startAt: startAt || null,\n });\n setModalOpen(false);\n\n if (rulePage === 1) {\n await refreshRules();\n } else {\n setRulePage(1);\n }\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <>\n <PageHeader>\n <ContentHeader\n description=\"設定自己的簽核代理,讓指定期間內的新待簽任務自動交由代理人處理。\"\n title=\"我的代理\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={openCreateModal}\n variant=\"base-primary\"\n >\n 建立代理\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.delegationFilterArea} size=\"sub\">\n <FilterLine>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"scopeFilterType\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => {\n setScopeFilterType(readScopeFilterOption(option));\n setRulePage(1);\n }}\n options={[...SCOPE_FILTER_OPTIONS]}\n placeholder=\"代理範圍\"\n size=\"sub\"\n value={scopeFilterType}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={ruleStatus}\n onChange={(activeKey): void => {\n setRuleStatus(readDelegationStatusTabKey(activeKey));\n setRulePage(1);\n }}\n >\n {DELEGATION_STATUS_TABS.map((statusTab) => (\n <TabItem key={statusTab.key}>{statusTab.label}</TabItem>\n ))}\n </Tab>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <Table\n actions={tableActions}\n columns={columns}\n dataSource={rows}\n fullWidth\n loading={loading}\n pagination={{\n current: rulePage,\n onChange: (page): void => {\n setRulePage(page);\n },\n onChangePageSize: (pageSize): void => {\n setRulePage(1);\n setRulePageSize(pageSize);\n },\n pageSize: rulePageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: DELEGATION_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: ruleTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{\n disabled: !agentMember,\n }}\n confirmText=\"建立代理\"\n loading={saving}\n modalType=\"standard\"\n onCancel={closeCreateModal}\n onClose={closeCreateModal}\n onConfirm={(): void => void handleCreate()}\n open={modalOpen}\n showModalFooter\n showModalHeader\n size=\"regular\"\n supportingText=\"代理生效後,後續建立的待簽任務會依範圍自動指派給代理人。\"\n title=\"建立個人代理\"\n >\n <div className={styles.delegationModalFields}>\n <MemberAutoCompleteField\n label=\"代理人\"\n loading={memberLoading}\n name=\"agentMemberId\"\n onChange={setAgentMember}\n onSearch={handleSearchMembers}\n options={memberOptions}\n value={agentMember}\n />\n <BPMFormField label=\"代理範圍\" name=\"scopeType\" required>\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void =>\n setScopeType(readScopeOptionFromValue(option))\n }\n options={[...SCOPE_OPTIONS]}\n placeholder=\"選擇代理範圍\"\n value={selectedScopeType}\n />\n </BPMFormField>\n {selectedScopeType.id === 'TEMPLATE_LIST' ? (\n <BPMFormField label=\"簽核模板\" name=\"scopeTemplateIds\" required>\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的模板\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name: 'scopeTemplateIds',\n spellCheck: false,\n }}\n loading={templateLoading}\n loadingText=\"搜尋模板中...\"\n mode=\"multiple\"\n onChange={(nextTemplates): void => {\n const selectedTemplates =\n readTemplateOptionsFromValue(nextTemplates);\n\n setScopeTemplates(selectedTemplates);\n setTemplateOptions((currentOptions) =>\n mergeTemplateOptions(selectedTemplates, currentOptions),\n );\n }}\n onSearch={handleSearchTemplates}\n onVisibilityChange={(open): void => {\n if (open) {\n void handleSearchTemplates('');\n }\n }}\n options={[...templateOptions]}\n overflowStrategy=\"wrap\"\n placeholder=\"搜尋並選取簽核模板\"\n searchDebounceTime={300}\n value={[...scopeTemplates]}\n />\n </BPMFormField>\n ) : null}\n <BPMFormField label=\"起始時間\" name=\"startAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setStartAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"留空立即生效\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(startAt)}\n />\n </BPMFormField>\n <BPMFormField label=\"結束時間\" name=\"endAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setEndAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"可留空\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(endAt)}\n />\n </BPMFormField>\n </div>\n </Modal>\n </>\n );\n}\n\nfunction MemberAutoCompleteField({\n label,\n loading,\n name,\n onChange,\n onSearch,\n options,\n value,\n}: {\n readonly label: string;\n readonly loading: boolean;\n readonly name: string;\n readonly onChange: (option: MemberOption | null) => void;\n readonly onSearch: (searchText: string) => Promise<void>;\n readonly options: readonly MemberOption[];\n readonly value: MemberOption | null;\n}): ReactElement {\n return (\n <BPMFormField\n label={label}\n layout={DELEGATION_MODAL_FIELD_LAYOUT}\n name={name}\n required\n >\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的成員\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name,\n spellCheck: false,\n }}\n loading={loading}\n loadingText=\"搜尋成員中...\"\n mode=\"single\"\n onChange={(option): void => onChange(readMemberOptionFromValue(option))}\n onSearch={onSearch}\n onSearchTextChange={(searchText): void =>\n onChange(readUniqueMemberOption(searchText, options))\n }\n onVisibilityChange={(open): void => {\n if (open) {\n void onSearch('');\n }\n }}\n options={[...options]}\n placeholder=\"搜尋姓名或信箱\"\n searchDebounceTime={300}\n value={value}\n />\n </BPMFormField>\n );\n}\n\nfunction MemberNameWithEmailTooltip({\n email,\n name,\n}: {\n readonly email: string | null;\n readonly name: string;\n}): ReactElement {\n if (!email) {\n return <span>{name}</span>;\n }\n\n return (\n <Tooltip title={email}>\n {({ onMouseEnter, onMouseLeave, ref }): ReactElement => (\n <span\n className={styles.memberNameWithTooltip}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n ref={ref as RefCallback<HTMLSpanElement>}\n >\n {name}\n </span>\n )}\n </Tooltip>\n );\n}\n\nfunction readMemberOption(member: MemberProfileRecord): MemberOption {\n return {\n displayName: member.name,\n email: member.email,\n id: member.memberId,\n name: `${member.name} (${member.email})`,\n };\n}\n\nfunction readMemberOptionFromValue(value: unknown): MemberOption | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const displayName = value.displayName;\n const email = value.email;\n const id = value.id;\n const name = value.name;\n\n return typeof id === 'string' && typeof name === 'string'\n ? {\n displayName: typeof displayName === 'string' ? displayName : name,\n email: typeof email === 'string' ? email : null,\n id,\n name,\n }\n : null;\n}\n\nfunction readUniqueMemberOption(\n searchText: string,\n options: readonly MemberOption[],\n): MemberOption | null {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return null;\n }\n\n const matches = options.filter((option) =>\n [option.id, option.name, option.email ?? ''].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n\n return matches.length === 1 ? (matches[0] ?? null) : null;\n}\n\nfunction readTemplateOption(template: ApprovalTemplateRecord): TemplateOption {\n return {\n id: template.id,\n name: template.name,\n };\n}\n\nfunction readTemplateOptionsFromValue(\n value: readonly unknown[],\n): readonly TemplateOption[] {\n return value.flatMap((item): readonly TemplateOption[] => {\n if (!isRecord(item)) {\n return [];\n }\n\n const id = item.id;\n const name = item.name;\n\n return typeof id === 'string' && typeof name === 'string'\n ? [{ id, name }]\n : [];\n });\n}\n\nfunction filterTemplateOptions(\n options: readonly TemplateOption[],\n searchText: string,\n): readonly TemplateOption[] {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return options;\n }\n\n return options.filter((option) =>\n [option.id, option.name].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n}\n\nfunction mergeTemplateOptions(\n selectedOptions: readonly TemplateOption[],\n availableOptions: readonly TemplateOption[],\n): readonly TemplateOption[] {\n return [...selectedOptions, ...availableOptions].reduce<TemplateOption[]>(\n (options, option) =>\n options.some((currentOption) => currentOption.id === option.id)\n ? options\n : [...options, option],\n [],\n );\n}\n\nfunction readScopeFilterOption(value: unknown): ScopeFilterOption {\n if (!isRecord(value)) {\n return SCOPE_FILTER_OPTIONS[0];\n }\n\n const id = value.id;\n\n return (\n SCOPE_FILTER_OPTIONS.find((option) => option.id === id) ??\n SCOPE_FILTER_OPTIONS[0]\n );\n}\n\nfunction readScopeLabel(rule: DelegationRuleRecord): string {\n if (rule.scopeType === 'ALL') {\n return '全部簽核';\n }\n\n if (rule.scopeType === 'TEMPLATE_LIST') {\n return `指定模板:${rule.scopeTemplateIds.length}`;\n }\n\n return rule.scopeConditionCel ? `條件:${rule.scopeConditionCel}` : '條件式';\n}\n\nfunction readScopeOptionFromValue(value: unknown): ScopeOption {\n if (!isRecord(value) || !isSelectableDelegationScopeType(value.id)) {\n return SCOPE_OPTIONS[0];\n }\n\n return (\n SCOPE_OPTIONS.find((option) => option.id === value.id) ?? SCOPE_OPTIONS[0]\n );\n}\n\nfunction isSelectableDelegationScopeType(\n value: unknown,\n): value is ScopeOption['id'] {\n return value === 'ALL' || value === 'TEMPLATE_LIST';\n}\n\nfunction DelegationStatusBadge({\n status,\n}: {\n readonly status: DelegationRuleRecord['status'];\n}): ReactElement {\n if (status === 'ACTIVE') {\n return <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />;\n }\n\n if (status === 'REVOKED') {\n return <Badge size=\"sub\" text=\"已撤銷\" variant=\"dot-inactive\" />;\n }\n\n if (status === 'EXPIRED') {\n return <Badge size=\"sub\" text=\"已過期\" variant=\"dot-warning\" />;\n }\n\n return <Badge size=\"sub\" text={status} variant=\"dot-info\" />;\n}\n\nfunction readDelegationStatusTabKey(activeKey: Key): DelegationStatusTabKey {\n if (\n activeKey === 'ACTIVE' ||\n activeKey === 'REVOKED' ||\n activeKey === 'EXPIRED'\n ) {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction readDelegationDateTimePickerValue(value: string): string | undefined {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date\n ? `${formatDateParts(date)}T${padDatePart(date.getHours())}:${padDatePart(\n date.getMinutes(),\n )}`\n : undefined;\n}\n\nfunction formatDelegationDateTimePickerValue(\n value: string | undefined,\n): string {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date ? date.toISOString() : '';\n}\n\nfunction isInvalidDelegationDateRange(startAt: string, endAt: string): boolean {\n if (!startAt || !endAt) {\n return false;\n }\n\n const startDate = parseDelegationDateTimeValue(startAt);\n const endDate = parseDelegationDateTimeValue(endAt);\n\n return !!startDate && !!endDate && endDate.getTime() <= startDate.getTime();\n}\n\nfunction parseDelegationDateTimeValue(value: string): Date | null {\n if (value.endsWith('Z') || /[+-]\\d{2}:\\d{2}$/.test(value)) {\n const parsedDate = new Date(value);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n }\n\n const [datePart = '', timePart = '00:00'] = value.split('T');\n const [year = 0, month = 1, day = 1] = datePart.split('-').map(Number);\n const [hour = 0, minute = 0] = timePart.split(':').map(Number);\n const parsedDate = new Date(year, month - 1, day, hour, minute);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n}\n\nfunction formatDateParts(date: Date): string {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(\n date.getDate(),\n )}`;\n}\n\nfunction padDatePart(value: number): string {\n return String(value).padStart(2, '0');\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";require('../delegations2.css');const e=require("./rolldown-runtime-BocRIvOZ.cjs"),t=require("./auth-provider-4BeCw7cI.cjs"),n=require("./format-date-time-D-cx5M8z.cjs"),r=require("./bpm-form-field-Bc6k4ZEO.cjs");let i=require("react"),a=require("@mezzanine-ui/react"),o=require("react/jsx-runtime"),s=require("@rytass/bpm-core-client/workflow"),c=require("@mezzanine-ui/core/form"),l=require("@mezzanine-ui/react/ContentHeader");l=e.t(l,1);let ee=require("@mezzanine-ui/icons"),te=require("@rytass/bpm-core-client/template");var u={delegationFilterArea:`bpm_delegationFilterArea_hAA4C`,delegationModalFields:`bpm_delegationModalFields_1aOVW`,memberNameWithTooltip:`bpm_memberNameWithTooltip_6Mojc`},d=c.FormFieldLayout.HORIZONTAL,ne=[10,20,50],re=[{key:`ALL`,label:`全部`},{key:`ACTIVE`,label:`啟用中`},{key:`REVOKED`,label:`已撤銷`},{key:`EXPIRED`,label:`已過期`}],f=[{id:`ALL_SCOPES`,name:`全部範圍`,scopeType:null},{id:`ALL`,name:`全部簽核`,scopeType:`ALL`},{id:`TEMPLATE_LIST`,name:`指定模板`,scopeType:`TEMPLATE_LIST`}],p=[{id:`ALL`,name:`全部簽核`},{id:`TEMPLATE_LIST`,name:`指定模板`}];function m(){let{member:e}=t.n(),d=e?.memberId??null,[m,g]=(0,i.useState)(null),[_,y]=(0,i.useState)(``),[S,C]=(0,i.useState)(null),[w,E]=(0,i.useState)(!0),[he,D]=(0,i.useState)(!1),[O,k]=(0,i.useState)([]),[ge,A]=(0,i.useState)(!1),[j,M]=(0,i.useState)(1),[N,_e]=(0,i.useState)(10),[P,ve]=(0,i.useState)(`ALL`),[ye,be]=(0,i.useState)(0),[F,xe]=(0,i.useState)([]),[I,L]=(0,i.useState)(!1),[R,Se]=(0,i.useState)(f[0]),[z,B]=(0,i.useState)([]),[Ce,V]=(0,i.useState)(p[0]),[H,U]=(0,i.useState)(``),[we,W]=(0,i.useState)(!1),[Te,G]=(0,i.useState)([]),K=(0,i.useRef)(0),q=(0,i.useCallback)(async()=>{let e=K.current+1;if(K.current=e,!d){E(!1);return}E(!0),C(null);try{let[t,n]=await Promise.all([(0,s.listDelegationRulesPage)({includeInactive:!0,page:j,pageSize:N,principalMemberId:d,scopeType:R.scopeType,status:P===`ALL`?null:P}),(0,s.searchMembers)(``)]);e===K.current&&(xe(t.rules),be(t.totalCount),k(n.map(h)))}catch(t){e===K.current&&C(T(t))}finally{e===K.current&&E(!1)}},[d,j,N,P,R]);(0,i.useEffect)(()=>{q()},[q]);let J=(0,i.useMemo)(()=>new Map(O.map(e=>[e.id,e])),[O]),Ee=(0,i.useMemo)(()=>F.map(e=>({...e,agentEmail:J.get(e.agentMemberId)?.email??null,agentName:J.get(e.agentMemberId)?.displayName??e.agentMemberId,key:e.id,scopeLabel:ue(e)})),[J,F]),Y=p.find(e=>e.id===Ce.id)??p[0],X=(0,i.useMemo)(()=>[{key:`agent`,render:e=>(0,o.jsx)(ae,{email:e.agentEmail,name:e.agentName}),title:`代理人`,width:220},{dataIndex:`scopeLabel`,key:`scope`,title:`代理範圍`,width:220},{key:`status`,render:e=>(0,o.jsx)(fe,{status:e.status}),title:`狀態`,width:120},{key:`startAt`,render:e=>(0,o.jsx)(a.Typography,{component:`span`,variant:`body`,children:n.t(e.startAt)}),title:`開始時間`,width:220},{key:`endAt`,render:e=>(0,o.jsx)(a.Typography,{component:`span`,variant:`body`,children:e.endAt?n.t(e.endAt):`-`}),title:`結束時間`,width:220}],[]),Z=(0,i.useCallback)(async e=>{if(d){C(null);try{await(0,s.revokeDelegationRule)({id:e,revokedByMemberId:d}),await q()}catch(e){C(T(e))}}},[d,q]),De=(0,i.useMemo)(()=>({render:e=>e.status===`ACTIVE`?[{name:`撤銷`,onClick:()=>void Z(e.id)}]:[],variant:`destructive-secondary`,width:88}),[Z]);async function Oe(e){D(!0);try{k((await(0,s.searchMembers)(e)).map(h))}catch(e){C(T(e))}finally{D(!1)}}async function Q(e,t=z){W(!0);try{let n=(await(0,te.listApprovalTemplates)()).map(oe);G(v(t,ce(n,e)))}catch(e){C(T(e))}finally{W(!1)}}function ke(){g(null),y(``),B([]),V(p[0]),U(``),G([]),Q(``,[]),A(!0)}function $(){I||A(!1)}async function Ae(){if(d){if(!m){C(`請選擇代理人`);return}if(m.id===d){C(`代理人不可設定為自己`);return}if(Y.id===`TEMPLATE_LIST`&&z.length<1){C(`請選擇至少一個簽核模板`);return}if(me(H,_)){C(`結束時間必須晚於起始時間`);return}L(!0),C(null);try{await(0,s.createDelegationRule)({agentMemberId:m.id,createdByMemberId:d,endAt:_||null,principalMemberId:d,priority:100,requiresConfirmation:!1,scopeConditionCel:null,scopeTemplateIds:Y.id===`TEMPLATE_LIST`?z.map(e=>e.id):[],scopeType:Y.id,startAt:H||null}),A(!1),j===1?await q():M(1)}catch(e){C(T(e))}finally{L(!1)}}}return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.PageHeader,{children:(0,o.jsx)(l.default,{description:`設定自己的簽核代理,讓指定期間內的新待簽任務自動交由代理人處理。`,title:`我的代理`,children:(0,o.jsx)(a.Button,{icon:ee.PlusIcon,iconType:`leading`,onClick:ke,variant:`base-primary`,children:`建立代理`})})}),(0,o.jsx)(a.SectionGroup,{children:(0,o.jsxs)(a.Section,{filterArea:(0,o.jsx)(a.FilterArea,{className:u.delegationFilterArea,size:`sub`,children:(0,o.jsx)(a.FilterLine,{children:(0,o.jsx)(a.Filter,{span:2,children:(0,o.jsx)(a.FormField,{fullWidth:!0,layout:c.FormFieldLayout.VERTICAL,name:`scopeFilterType`,children:(0,o.jsx)(a.Select,{clearable:!1,fullWidth:!0,onChange:e=>{Se(le(e)),M(1)},options:[...f],placeholder:`代理範圍`,size:`sub`,value:R})})})})}),tab:(0,o.jsx)(a.Tab,{activeKey:P,onChange:e=>{ve(pe(e)),M(1)},children:re.map(e=>(0,o.jsx)(a.TabItem,{children:e.label},e.key))}),children:[S?(0,o.jsx)(a.Typography,{color:`text-error`,variant:`body`,children:S}):null,(0,o.jsx)(a.Table,{actions:De,columns:X,dataSource:Ee,fullWidth:!0,loading:w,pagination:{current:j,onChange:e=>{M(e)},onChangePageSize:e=>{M(1),_e(e)},pageSize:N,pageSizeLabel:`每頁筆數`,pageSizeOptions:ne,renderResultSummary:(e,t,n)=>`顯示 ${e}-${t} 筆,共 ${n} 筆`,showPageSizeOptions:!0,total:ye}})]})}),(0,o.jsx)(a.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!m},confirmText:`建立代理`,loading:I,modalType:`standard`,onCancel:$,onClose:$,onConfirm:()=>void Ae(),open:ge,showModalFooter:!0,showModalHeader:!0,size:`regular`,supportingText:`代理生效後,後續建立的待簽任務會依範圍自動指派給代理人。`,title:`建立個人代理`,children:(0,o.jsxs)(`div`,{className:u.delegationModalFields,children:[(0,o.jsx)(ie,{label:`代理人`,loading:he,name:`agentMemberId`,onChange:g,onSearch:Oe,options:O,value:m}),(0,o.jsx)(r.t,{label:`代理範圍`,name:`scopeType`,required:!0,children:(0,o.jsx)(a.Select,{clearable:!1,fullWidth:!0,onChange:e=>V(de(e)),options:[...p],placeholder:`選擇代理範圍`,value:Y})}),Y.id===`TEMPLATE_LIST`?(0,o.jsx)(r.t,{label:`簽核模板`,name:`scopeTemplateIds`,required:!0,children:(0,o.jsx)(a.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的模板`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:`scopeTemplateIds`,spellCheck:!1},loading:we,loadingText:`搜尋模板中...`,mode:`multiple`,onChange:e=>{let t=se(e);B(t),G(e=>v(t,e))},onSearch:Q,onVisibilityChange:e=>{e&&Q(``)},options:[...Te],overflowStrategy:`wrap`,placeholder:`搜尋並選取簽核模板`,searchDebounceTime:300,value:[...z]})}):null,(0,o.jsx)(r.t,{label:`起始時間`,name:`startAt`,children:(0,o.jsx)(a.DateTimePicker,{formatDate:`YYYY-MM-DD`,formatTime:`HH:mm`,fullWidth:!0,hideSecond:!0,onChange:e=>U(x(e)),placeholderLeft:`留空立即生效`,placeholderRight:`選擇時間`,value:b(H)})}),(0,o.jsx)(r.t,{label:`結束時間`,name:`endAt`,children:(0,o.jsx)(a.DateTimePicker,{formatDate:`YYYY-MM-DD`,formatTime:`HH:mm`,fullWidth:!0,hideSecond:!0,onChange:e=>y(x(e)),placeholderLeft:`可留空`,placeholderRight:`選擇時間`,value:b(_)})})]})})]})}function ie({label:e,loading:t,name:n,onChange:i,onSearch:s,options:c,value:l}){return(0,o.jsx)(r.t,{label:e,layout:d,name:n,required:!0,children:(0,o.jsx)(a.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的成員`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:n,spellCheck:!1},loading:t,loadingText:`搜尋成員中...`,mode:`single`,onChange:e=>i(g(e)),onSearch:s,onSearchTextChange:e=>i(_(e,c)),onVisibilityChange:e=>{e&&s(``)},options:[...c],placeholder:`搜尋姓名或信箱`,searchDebounceTime:300,value:l})})}function ae({email:e,name:t}){return e?(0,o.jsx)(a.Tooltip,{title:e,children:({onMouseEnter:e,onMouseLeave:n,ref:r})=>(0,o.jsx)(`span`,{className:u.memberNameWithTooltip,onMouseEnter:e,onMouseLeave:n,ref:r,children:t})}):(0,o.jsx)(`span`,{children:t})}function h(e){return{displayName:e.name,email:e.email,id:e.memberId,name:`${e.name} (${e.email})`}}function g(e){if(!E(e))return null;let t=e.displayName,n=e.email,r=e.id,i=e.name;return typeof r==`string`&&typeof i==`string`?{displayName:typeof t==`string`?t:i,email:typeof n==`string`?n:null,id:r,name:i}:null}function _(e,t){let n=e.trim().toLocaleLowerCase();if(!n)return null;let r=t.filter(e=>[e.id,e.name,e.email??``].some(e=>e.toLocaleLowerCase().includes(n)));return r.length===1?r[0]??null:null}function oe(e){return{id:e.id,name:e.name}}function se(e){return e.flatMap(e=>{if(!E(e))return[];let t=e.id,n=e.name;return typeof t==`string`&&typeof n==`string`?[{id:t,name:n}]:[]})}function ce(e,t){let n=t.trim().toLocaleLowerCase();return n?e.filter(e=>[e.id,e.name].some(e=>e.toLocaleLowerCase().includes(n))):e}function v(e,t){return[...e,...t].reduce((e,t)=>e.some(e=>e.id===t.id)?e:[...e,t],[])}function le(e){if(!E(e))return f[0];let t=e.id;return f.find(e=>e.id===t)??f[0]}function ue(e){return e.scopeType===`ALL`?`全部簽核`:e.scopeType===`TEMPLATE_LIST`?`指定模板:${e.scopeTemplateIds.length}`:e.scopeConditionCel?`條件:${e.scopeConditionCel}`:`條件式`}function de(e){return!E(e)||!y(e.id)?p[0]:p.find(t=>t.id===e.id)??p[0]}function y(e){return e===`ALL`||e===`TEMPLATE_LIST`}function fe({status:e}){return e===`ACTIVE`?(0,o.jsx)(a.Badge,{size:`sub`,text:`啟用中`,variant:`dot-success`}):e===`REVOKED`?(0,o.jsx)(a.Badge,{size:`sub`,text:`已撤銷`,variant:`dot-inactive`}):e===`EXPIRED`?(0,o.jsx)(a.Badge,{size:`sub`,text:`已過期`,variant:`dot-warning`}):(0,o.jsx)(a.Badge,{size:`sub`,text:e,variant:`dot-info`})}function pe(e){return e===`ACTIVE`||e===`REVOKED`||e===`EXPIRED`?e:`ALL`}function b(e){let t=e?S(e):null;return t?`${C(t)}T${w(t.getHours())}:${w(t.getMinutes())}`:void 0}function x(e){let t=e?S(e):null;return t?t.toISOString():``}function me(e,t){if(!e||!t)return!1;let n=S(e),r=S(t);return!!n&&!!r&&r.getTime()<=n.getTime()}function S(e){if(e.endsWith(`Z`)||/[+-]\d{2}:\d{2}$/.test(e)){let t=new Date(e);return Number.isNaN(t.getTime())?null:t}let[t=``,n=`00:00`]=e.split(`T`),[r=0,i=1,a=1]=t.split(`-`).map(Number),[o=0,s=0]=n.split(`:`).map(Number),c=new Date(r,i-1,a,o,s);return Number.isNaN(c.getTime())?null:c}function C(e){return`${e.getFullYear()}-${w(e.getMonth()+1)}-${w(e.getDate())}`}function w(e){return String(e).padStart(2,`0`)}function T(e){return e instanceof Error?e.message:`發生未知錯誤`}function E(e){return typeof e==`object`&&!!e}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return m}});
|
|
2
|
+
//# sourceMappingURL=delegations-vpLtus9g.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delegations-kbMOSEif.cjs","names":[],"sources":["../../src/views/delegations/delegations.module.scss","../../src/views/delegations/DelegationsView.tsx"],"sourcesContent":[".delegationFilterArea {\n :global(.mzn-filter-area__actions) {\n display: none;\n }\n\n :global(.mzn-form-field__label-area) {\n display: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n}\n\n.delegationModalFields {\n display: grid;\n gap: 12px;\n width: 100%;\n\n :global(.mzn-form-field--horizontal) {\n align-items: flex-start;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label-area) {\n flex: 0 0 112px;\n width: 112px;\n min-width: 112px;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label) {\n flex-wrap: nowrap;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__data-entry) {\n flex: 1 1 auto;\n align-items: stretch;\n min-width: 0;\n max-width: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-autocomplete) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-input),\n :global(.mzn-input-container),\n :global(.mzn-picker),\n :global(.mzn-select),\n :global(.mzn-select-trigger),\n :global(.mzn-text-field) {\n width: 100%;\n min-width: 0 !important;\n }\n\n :global(.mzn-select-trigger__input) {\n width: 100%;\n min-width: 0 !important;\n text-overflow: ellipsis;\n }\n}\n\n.memberNameWithTooltip {\n cursor: help;\n text-decoration: underline dotted;\n text-underline-offset: 3px;\n}\n","'use client';\n\nimport {\n Key,\n ReactElement,\n RefCallback,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n AutoComplete,\n Badge,\n Button,\n DateTimePicker,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Select,\n Tab,\n TabItem,\n Table,\n Tooltip,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { BPMFormField } from '../../components/bpm-form-field';\nimport { formatDateTime } from '../../lib/format-date-time';\nimport { useAuth } from '../../lib/auth-provider';\nimport {\n DelegationRuleRecord,\n DelegationRuleStatus,\n DelegationScopeType,\n MemberProfileRecord,\n createDelegationRule,\n listDelegationRulesPage,\n revokeDelegationRule,\n searchMembers,\n} from '@rytass/bpm-core-client/workflow';\nimport {\n ApprovalTemplateRecord,\n listApprovalTemplates,\n} from '@rytass/bpm-core-client/template';\nimport styles from './delegations.module.scss';\n\ntype DelegationStatusTabKey = 'ALL' | DelegationRuleStatus;\n\ntype MemberOption = Readonly<{\n displayName: string;\n email: string | null;\n id: string;\n name: string;\n}>;\n\ntype ScopeOption = Readonly<{\n id: DelegationScopeType;\n name: string;\n}>;\n\ntype ScopeFilterOption = Readonly<{\n id: 'ALL_SCOPES' | DelegationScopeType;\n name: string;\n scopeType: DelegationScopeType | null;\n}>;\n\ntype TemplateOption = Readonly<{\n id: string;\n name: string;\n}>;\n\ntype DelegationRuleRow = Readonly<\n Record<string, unknown> &\n DelegationRuleRecord & {\n agentEmail: string | null;\n agentName: string;\n key: string;\n scopeLabel: string;\n }\n>;\n\nconst DELEGATION_MODAL_FIELD_LAYOUT = FormFieldLayout.HORIZONTAL;\nconst DELEGATION_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst DELEGATION_STATUS_TABS: readonly {\n readonly key: DelegationStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'ACTIVE', label: '啟用中' },\n { key: 'REVOKED', label: '已撤銷' },\n { key: 'EXPIRED', label: '已過期' },\n];\nconst SCOPE_FILTER_OPTIONS: readonly ScopeFilterOption[] = [\n { id: 'ALL_SCOPES', name: '全部範圍', scopeType: null },\n { id: 'ALL', name: '全部簽核', scopeType: 'ALL' },\n { id: 'TEMPLATE_LIST', name: '指定模板', scopeType: 'TEMPLATE_LIST' },\n];\nconst SCOPE_OPTIONS: readonly ScopeOption[] = [\n { id: 'ALL', name: '全部簽核' },\n { id: 'TEMPLATE_LIST', name: '指定模板' },\n];\n\nexport function DelegationsView(): ReactElement {\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [agentMember, setAgentMember] = useState<MemberOption | null>(null);\n const [endAt, setEndAt] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [memberLoading, setMemberLoading] = useState(false);\n const [memberOptions, setMemberOptions] = useState<readonly MemberOption[]>(\n [],\n );\n const [modalOpen, setModalOpen] = useState(false);\n const [rulePage, setRulePage] = useState(1);\n const [rulePageSize, setRulePageSize] = useState(10);\n const [ruleStatus, setRuleStatus] = useState<DelegationStatusTabKey>('ALL');\n const [ruleTotalCount, setRuleTotalCount] = useState(0);\n const [rules, setRules] = useState<readonly DelegationRuleRecord[]>([]);\n const [saving, setSaving] = useState(false);\n const [scopeFilterType, setScopeFilterType] = useState<ScopeFilterOption>(\n SCOPE_FILTER_OPTIONS[0],\n );\n const [scopeTemplates, setScopeTemplates] = useState<\n readonly TemplateOption[]\n >([]);\n const [scopeType, setScopeType] = useState<ScopeOption>(SCOPE_OPTIONS[0]);\n const [startAt, setStartAt] = useState('');\n const [templateLoading, setTemplateLoading] = useState(false);\n const [templateOptions, setTemplateOptions] = useState<\n readonly TemplateOption[]\n >([]);\n const refreshRequestIdRef = useRef(0);\n\n const refreshRules = useCallback(async (): Promise<void> => {\n const requestId = refreshRequestIdRef.current + 1;\n refreshRequestIdRef.current = requestId;\n\n if (!currentMemberId) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const [rulePageResult, members] = await Promise.all([\n listDelegationRulesPage({\n includeInactive: true,\n page: rulePage,\n pageSize: rulePageSize,\n principalMemberId: currentMemberId,\n scopeType: scopeFilterType.scopeType,\n status: ruleStatus === 'ALL' ? null : ruleStatus,\n }),\n searchMembers(''),\n ]);\n\n if (requestId === refreshRequestIdRef.current) {\n setRules(rulePageResult.rules);\n setRuleTotalCount(rulePageResult.totalCount);\n setMemberOptions(members.map(readMemberOption));\n }\n } catch (requestError: unknown) {\n if (requestId === refreshRequestIdRef.current) {\n setError(readErrorMessage(requestError));\n }\n } finally {\n if (requestId === refreshRequestIdRef.current) {\n setLoading(false);\n }\n }\n }, [currentMemberId, rulePage, rulePageSize, ruleStatus, scopeFilterType]);\n\n useEffect((): void => {\n void refreshRules();\n }, [refreshRules]);\n\n const membersById = useMemo(\n (): ReadonlyMap<string, MemberOption> =>\n new Map(memberOptions.map((option) => [option.id, option])),\n [memberOptions],\n );\n const rows = useMemo(\n (): DelegationRuleRow[] =>\n rules.map((rule) => ({\n ...rule,\n agentEmail: membersById.get(rule.agentMemberId)?.email ?? null,\n agentName:\n membersById.get(rule.agentMemberId)?.displayName ??\n rule.agentMemberId,\n key: rule.id,\n scopeLabel: readScopeLabel(rule),\n })),\n [membersById, rules],\n );\n const selectedScopeType =\n SCOPE_OPTIONS.find((option) => option.id === scopeType.id) ??\n SCOPE_OPTIONS[0];\n const columns = useMemo(\n (): TableColumn<DelegationRuleRow>[] => [\n {\n key: 'agent',\n render: (record: DelegationRuleRow): ReactElement => (\n <MemberNameWithEmailTooltip\n email={record.agentEmail}\n name={record.agentName}\n />\n ),\n title: '代理人',\n width: 220,\n },\n { dataIndex: 'scopeLabel', key: 'scope', title: '代理範圍', width: 220 },\n {\n key: 'status',\n render: (record: DelegationRuleRow): ReactElement => (\n <DelegationStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n {\n key: 'startAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(record.startAt)}\n </Typography>\n ),\n title: '開始時間',\n width: 220,\n },\n {\n key: 'endAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {record.endAt ? formatDateTime(record.endAt) : '-'}\n </Typography>\n ),\n title: '結束時間',\n width: 220,\n },\n ],\n [],\n );\n const handleRevoke = useCallback(\n async (id: string): Promise<void> => {\n if (!currentMemberId) {\n return;\n }\n\n setError(null);\n\n try {\n await revokeDelegationRule({\n id,\n revokedByMemberId: currentMemberId,\n });\n await refreshRules();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n }\n },\n [currentMemberId, refreshRules],\n );\n const tableActions = useMemo(\n (): TableActions<DelegationRuleRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<DelegationRuleRow>['render']> =>\n record.status === 'ACTIVE'\n ? [\n {\n name: '撤銷',\n onClick: (): void => void handleRevoke(record.id),\n },\n ]\n : [],\n variant: 'destructive-secondary',\n width: 88,\n }),\n [handleRevoke],\n );\n\n async function handleSearchMembers(searchText: string): Promise<void> {\n setMemberLoading(true);\n\n try {\n setMemberOptions((await searchMembers(searchText)).map(readMemberOption));\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setMemberLoading(false);\n }\n }\n\n async function handleSearchTemplates(\n searchText: string,\n selectedOptions: readonly TemplateOption[] = scopeTemplates,\n ): Promise<void> {\n setTemplateLoading(true);\n\n try {\n const nextOptions = (await listApprovalTemplates()).map(\n readTemplateOption,\n );\n\n setTemplateOptions(\n mergeTemplateOptions(\n selectedOptions,\n filterTemplateOptions(nextOptions, searchText),\n ),\n );\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setTemplateLoading(false);\n }\n }\n\n function openCreateModal(): void {\n setAgentMember(null);\n setEndAt('');\n setScopeTemplates([]);\n setScopeType(SCOPE_OPTIONS[0]);\n setStartAt('');\n setTemplateOptions([]);\n void handleSearchTemplates('', []);\n setModalOpen(true);\n }\n\n function closeCreateModal(): void {\n if (saving) {\n return;\n }\n\n setModalOpen(false);\n }\n\n async function handleCreate(): Promise<void> {\n if (!currentMemberId) {\n return;\n }\n\n if (!agentMember) {\n setError('請選擇代理人');\n return;\n }\n\n if (agentMember.id === currentMemberId) {\n setError('代理人不可設定為自己');\n return;\n }\n\n if (selectedScopeType.id === 'TEMPLATE_LIST' && scopeTemplates.length < 1) {\n setError('請選擇至少一個簽核模板');\n return;\n }\n\n if (isInvalidDelegationDateRange(startAt, endAt)) {\n setError('結束時間必須晚於起始時間');\n return;\n }\n\n setSaving(true);\n setError(null);\n\n try {\n await createDelegationRule({\n agentMemberId: agentMember.id,\n createdByMemberId: currentMemberId,\n endAt: endAt || null,\n principalMemberId: currentMemberId,\n priority: 100,\n requiresConfirmation: false,\n scopeConditionCel: null,\n scopeTemplateIds:\n selectedScopeType.id === 'TEMPLATE_LIST'\n ? scopeTemplates.map((template) => template.id)\n : [],\n scopeType: selectedScopeType.id,\n startAt: startAt || null,\n });\n setModalOpen(false);\n\n if (rulePage === 1) {\n await refreshRules();\n } else {\n setRulePage(1);\n }\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <>\n <PageHeader>\n <ContentHeader\n description=\"設定自己的簽核代理,讓指定期間內的新待簽任務自動交由代理人處理。\"\n title=\"我的代理\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={openCreateModal}\n variant=\"base-primary\"\n >\n 建立代理\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.delegationFilterArea} size=\"sub\">\n <FilterLine>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"scopeFilterType\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => {\n setScopeFilterType(readScopeFilterOption(option));\n setRulePage(1);\n }}\n options={[...SCOPE_FILTER_OPTIONS]}\n placeholder=\"代理範圍\"\n size=\"sub\"\n value={scopeFilterType}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={ruleStatus}\n onChange={(activeKey): void => {\n setRuleStatus(readDelegationStatusTabKey(activeKey));\n setRulePage(1);\n }}\n >\n {DELEGATION_STATUS_TABS.map((statusTab) => (\n <TabItem key={statusTab.key}>{statusTab.label}</TabItem>\n ))}\n </Tab>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <Table\n actions={tableActions}\n columns={columns}\n dataSource={rows}\n fullWidth\n loading={loading}\n pagination={{\n current: rulePage,\n onChange: (page): void => {\n setRulePage(page);\n },\n onChangePageSize: (pageSize): void => {\n setRulePage(1);\n setRulePageSize(pageSize);\n },\n pageSize: rulePageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: DELEGATION_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: ruleTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{\n disabled: !agentMember,\n }}\n confirmText=\"建立代理\"\n loading={saving}\n modalType=\"standard\"\n onCancel={closeCreateModal}\n onClose={closeCreateModal}\n onConfirm={(): void => void handleCreate()}\n open={modalOpen}\n showModalFooter\n showModalHeader\n size=\"regular\"\n supportingText=\"代理生效後,後續建立的待簽任務會依範圍自動指派給代理人。\"\n title=\"建立個人代理\"\n >\n <div className={styles.delegationModalFields}>\n <MemberAutoCompleteField\n label=\"代理人\"\n loading={memberLoading}\n name=\"agentMemberId\"\n onChange={setAgentMember}\n onSearch={handleSearchMembers}\n options={memberOptions}\n value={agentMember}\n />\n <BPMFormField label=\"代理範圍\" name=\"scopeType\" required>\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void =>\n setScopeType(readScopeOptionFromValue(option))\n }\n options={[...SCOPE_OPTIONS]}\n placeholder=\"選擇代理範圍\"\n value={selectedScopeType}\n />\n </BPMFormField>\n {selectedScopeType.id === 'TEMPLATE_LIST' ? (\n <BPMFormField label=\"簽核模板\" name=\"scopeTemplateIds\" required>\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的模板\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name: 'scopeTemplateIds',\n spellCheck: false,\n }}\n loading={templateLoading}\n loadingText=\"搜尋模板中...\"\n mode=\"multiple\"\n onChange={(nextTemplates): void => {\n const selectedTemplates =\n readTemplateOptionsFromValue(nextTemplates);\n\n setScopeTemplates(selectedTemplates);\n setTemplateOptions((currentOptions) =>\n mergeTemplateOptions(selectedTemplates, currentOptions),\n );\n }}\n onSearch={handleSearchTemplates}\n onVisibilityChange={(open): void => {\n if (open) {\n void handleSearchTemplates('');\n }\n }}\n options={[...templateOptions]}\n overflowStrategy=\"wrap\"\n placeholder=\"搜尋並選取簽核模板\"\n searchDebounceTime={300}\n value={[...scopeTemplates]}\n />\n </BPMFormField>\n ) : null}\n <BPMFormField label=\"起始時間\" name=\"startAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setStartAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"留空立即生效\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(startAt)}\n />\n </BPMFormField>\n <BPMFormField label=\"結束時間\" name=\"endAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setEndAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"可留空\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(endAt)}\n />\n </BPMFormField>\n </div>\n </Modal>\n </>\n );\n}\n\nfunction MemberAutoCompleteField({\n label,\n loading,\n name,\n onChange,\n onSearch,\n options,\n value,\n}: {\n readonly label: string;\n readonly loading: boolean;\n readonly name: string;\n readonly onChange: (option: MemberOption | null) => void;\n readonly onSearch: (searchText: string) => Promise<void>;\n readonly options: readonly MemberOption[];\n readonly value: MemberOption | null;\n}): ReactElement {\n return (\n <BPMFormField\n label={label}\n layout={DELEGATION_MODAL_FIELD_LAYOUT}\n name={name}\n required\n >\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的成員\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name,\n spellCheck: false,\n }}\n loading={loading}\n loadingText=\"搜尋成員中...\"\n mode=\"single\"\n onChange={(option): void => onChange(readMemberOptionFromValue(option))}\n onSearch={onSearch}\n onSearchTextChange={(searchText): void =>\n onChange(readUniqueMemberOption(searchText, options))\n }\n onVisibilityChange={(open): void => {\n if (open) {\n void onSearch('');\n }\n }}\n options={[...options]}\n placeholder=\"搜尋姓名或信箱\"\n searchDebounceTime={300}\n value={value}\n />\n </BPMFormField>\n );\n}\n\nfunction MemberNameWithEmailTooltip({\n email,\n name,\n}: {\n readonly email: string | null;\n readonly name: string;\n}): ReactElement {\n if (!email) {\n return <span>{name}</span>;\n }\n\n return (\n <Tooltip title={email}>\n {({ onMouseEnter, onMouseLeave, ref }): ReactElement => (\n <span\n className={styles.memberNameWithTooltip}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n ref={ref as RefCallback<HTMLSpanElement>}\n >\n {name}\n </span>\n )}\n </Tooltip>\n );\n}\n\nfunction readMemberOption(member: MemberProfileRecord): MemberOption {\n return {\n displayName: member.name,\n email: member.email,\n id: member.memberId,\n name: `${member.name} (${member.email})`,\n };\n}\n\nfunction readMemberOptionFromValue(value: unknown): MemberOption | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const displayName = value.displayName;\n const email = value.email;\n const id = value.id;\n const name = value.name;\n\n return typeof id === 'string' && typeof name === 'string'\n ? {\n displayName: typeof displayName === 'string' ? displayName : name,\n email: typeof email === 'string' ? email : null,\n id,\n name,\n }\n : null;\n}\n\nfunction readUniqueMemberOption(\n searchText: string,\n options: readonly MemberOption[],\n): MemberOption | null {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return null;\n }\n\n const matches = options.filter((option) =>\n [option.id, option.name, option.email ?? ''].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n\n return matches.length === 1 ? (matches[0] ?? null) : null;\n}\n\nfunction readTemplateOption(template: ApprovalTemplateRecord): TemplateOption {\n return {\n id: template.id,\n name: template.name,\n };\n}\n\nfunction readTemplateOptionsFromValue(\n value: readonly unknown[],\n): readonly TemplateOption[] {\n return value.flatMap((item): readonly TemplateOption[] => {\n if (!isRecord(item)) {\n return [];\n }\n\n const id = item.id;\n const name = item.name;\n\n return typeof id === 'string' && typeof name === 'string'\n ? [{ id, name }]\n : [];\n });\n}\n\nfunction filterTemplateOptions(\n options: readonly TemplateOption[],\n searchText: string,\n): readonly TemplateOption[] {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return options;\n }\n\n return options.filter((option) =>\n [option.id, option.name].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n}\n\nfunction mergeTemplateOptions(\n selectedOptions: readonly TemplateOption[],\n availableOptions: readonly TemplateOption[],\n): readonly TemplateOption[] {\n return [...selectedOptions, ...availableOptions].reduce<TemplateOption[]>(\n (options, option) =>\n options.some((currentOption) => currentOption.id === option.id)\n ? options\n : [...options, option],\n [],\n );\n}\n\nfunction readScopeFilterOption(value: unknown): ScopeFilterOption {\n if (!isRecord(value)) {\n return SCOPE_FILTER_OPTIONS[0];\n }\n\n const id = value.id;\n\n return (\n SCOPE_FILTER_OPTIONS.find((option) => option.id === id) ??\n SCOPE_FILTER_OPTIONS[0]\n );\n}\n\nfunction readScopeLabel(rule: DelegationRuleRecord): string {\n if (rule.scopeType === 'ALL') {\n return '全部簽核';\n }\n\n if (rule.scopeType === 'TEMPLATE_LIST') {\n return `指定模板:${rule.scopeTemplateIds.length}`;\n }\n\n return rule.scopeConditionCel ? `條件:${rule.scopeConditionCel}` : '條件式';\n}\n\nfunction readScopeOptionFromValue(value: unknown): ScopeOption {\n if (!isRecord(value) || !isSelectableDelegationScopeType(value.id)) {\n return SCOPE_OPTIONS[0];\n }\n\n return (\n SCOPE_OPTIONS.find((option) => option.id === value.id) ?? SCOPE_OPTIONS[0]\n );\n}\n\nfunction isSelectableDelegationScopeType(\n value: unknown,\n): value is ScopeOption['id'] {\n return value === 'ALL' || value === 'TEMPLATE_LIST';\n}\n\nfunction DelegationStatusBadge({\n status,\n}: {\n readonly status: DelegationRuleRecord['status'];\n}): ReactElement {\n if (status === 'ACTIVE') {\n return <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />;\n }\n\n if (status === 'REVOKED') {\n return <Badge size=\"sub\" text=\"已撤銷\" variant=\"dot-inactive\" />;\n }\n\n if (status === 'EXPIRED') {\n return <Badge size=\"sub\" text=\"已過期\" variant=\"dot-warning\" />;\n }\n\n return <Badge size=\"sub\" text={status} variant=\"dot-info\" />;\n}\n\nfunction readDelegationStatusTabKey(activeKey: Key): DelegationStatusTabKey {\n if (\n activeKey === 'ACTIVE' ||\n activeKey === 'REVOKED' ||\n activeKey === 'EXPIRED'\n ) {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction readDelegationDateTimePickerValue(value: string): string | undefined {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date\n ? `${formatDateParts(date)}T${padDatePart(date.getHours())}:${padDatePart(\n date.getMinutes(),\n )}`\n : undefined;\n}\n\nfunction formatDelegationDateTimePickerValue(\n value: string | undefined,\n): string {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date ? date.toISOString() : '';\n}\n\nfunction isInvalidDelegationDateRange(startAt: string, endAt: string): boolean {\n if (!startAt || !endAt) {\n return false;\n }\n\n const startDate = parseDelegationDateTimeValue(startAt);\n const endDate = parseDelegationDateTimeValue(endAt);\n\n return !!startDate && !!endDate && endDate.getTime() <= startDate.getTime();\n}\n\nfunction parseDelegationDateTimeValue(value: string): Date | null {\n if (value.endsWith('Z') || /[+-]\\d{2}:\\d{2}$/.test(value)) {\n const parsedDate = new Date(value);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n }\n\n const [datePart = '', timePart = '00:00'] = value.split('T');\n const [year = 0, month = 1, day = 1] = datePart.split('-').map(Number);\n const [hour = 0, minute = 0] = timePart.split(':').map(Number);\n const parsedDate = new Date(year, month - 1, day, hour, minute);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n}\n\nfunction formatDateParts(date: Date): string {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(\n date.getDate(),\n )}`;\n}\n\nfunction padDatePart(value: number): string {\n return String(value).padStart(2, '0');\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"delegations-vpLtus9g.cjs","names":[],"sources":["../../src/views/delegations/delegations.module.scss","../../src/views/delegations/DelegationsView.tsx"],"sourcesContent":[".delegationFilterArea {\n :global(.mzn-filter-area__actions) {\n display: none;\n }\n\n :global(.mzn-form-field__label-area) {\n display: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n}\n\n.delegationModalFields {\n display: grid;\n gap: 12px;\n width: 100%;\n\n :global(.mzn-form-field--horizontal) {\n align-items: flex-start;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label-area) {\n flex: 0 0 112px;\n width: 112px;\n min-width: 112px;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label) {\n flex-wrap: nowrap;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__data-entry) {\n flex: 1 1 auto;\n align-items: stretch;\n min-width: 0;\n max-width: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-autocomplete) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-input),\n :global(.mzn-input-container),\n :global(.mzn-picker),\n :global(.mzn-select),\n :global(.mzn-select-trigger),\n :global(.mzn-text-field) {\n width: 100%;\n min-width: 0 !important;\n }\n\n :global(.mzn-select-trigger__input) {\n width: 100%;\n min-width: 0 !important;\n text-overflow: ellipsis;\n }\n}\n\n.memberNameWithTooltip {\n cursor: help;\n text-decoration: underline dotted;\n text-underline-offset: 3px;\n}\n","'use client';\n\nimport {\n Key,\n ReactElement,\n RefCallback,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n AutoComplete,\n Badge,\n Button,\n DateTimePicker,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Select,\n Tab,\n TabItem,\n Table,\n Tooltip,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { BPMFormField } from '../../components/bpm-form-field';\nimport { formatDateTime } from '../../lib/format-date-time';\nimport { useAuth } from '../../lib/auth-provider';\nimport {\n DelegationRuleRecord,\n DelegationRuleStatus,\n DelegationScopeType,\n MemberProfileRecord,\n createDelegationRule,\n listDelegationRulesPage,\n revokeDelegationRule,\n searchMembers,\n} from '@rytass/bpm-core-client/workflow';\nimport {\n ApprovalTemplateRecord,\n listApprovalTemplates,\n} from '@rytass/bpm-core-client/template';\nimport styles from './delegations.module.scss';\n\ntype DelegationStatusTabKey = 'ALL' | DelegationRuleStatus;\n\ntype MemberOption = Readonly<{\n displayName: string;\n email: string | null;\n id: string;\n name: string;\n}>;\n\ntype ScopeOption = Readonly<{\n id: DelegationScopeType;\n name: string;\n}>;\n\ntype ScopeFilterOption = Readonly<{\n id: 'ALL_SCOPES' | DelegationScopeType;\n name: string;\n scopeType: DelegationScopeType | null;\n}>;\n\ntype TemplateOption = Readonly<{\n id: string;\n name: string;\n}>;\n\ntype DelegationRuleRow = Readonly<\n Record<string, unknown> &\n DelegationRuleRecord & {\n agentEmail: string | null;\n agentName: string;\n key: string;\n scopeLabel: string;\n }\n>;\n\nconst DELEGATION_MODAL_FIELD_LAYOUT = FormFieldLayout.HORIZONTAL;\nconst DELEGATION_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst DELEGATION_STATUS_TABS: readonly {\n readonly key: DelegationStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'ACTIVE', label: '啟用中' },\n { key: 'REVOKED', label: '已撤銷' },\n { key: 'EXPIRED', label: '已過期' },\n];\nconst SCOPE_FILTER_OPTIONS: readonly ScopeFilterOption[] = [\n { id: 'ALL_SCOPES', name: '全部範圍', scopeType: null },\n { id: 'ALL', name: '全部簽核', scopeType: 'ALL' },\n { id: 'TEMPLATE_LIST', name: '指定模板', scopeType: 'TEMPLATE_LIST' },\n];\nconst SCOPE_OPTIONS: readonly ScopeOption[] = [\n { id: 'ALL', name: '全部簽核' },\n { id: 'TEMPLATE_LIST', name: '指定模板' },\n];\n\nexport function DelegationsView(): ReactElement {\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [agentMember, setAgentMember] = useState<MemberOption | null>(null);\n const [endAt, setEndAt] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [memberLoading, setMemberLoading] = useState(false);\n const [memberOptions, setMemberOptions] = useState<readonly MemberOption[]>(\n [],\n );\n const [modalOpen, setModalOpen] = useState(false);\n const [rulePage, setRulePage] = useState(1);\n const [rulePageSize, setRulePageSize] = useState(10);\n const [ruleStatus, setRuleStatus] = useState<DelegationStatusTabKey>('ALL');\n const [ruleTotalCount, setRuleTotalCount] = useState(0);\n const [rules, setRules] = useState<readonly DelegationRuleRecord[]>([]);\n const [saving, setSaving] = useState(false);\n const [scopeFilterType, setScopeFilterType] = useState<ScopeFilterOption>(\n SCOPE_FILTER_OPTIONS[0],\n );\n const [scopeTemplates, setScopeTemplates] = useState<\n readonly TemplateOption[]\n >([]);\n const [scopeType, setScopeType] = useState<ScopeOption>(SCOPE_OPTIONS[0]);\n const [startAt, setStartAt] = useState('');\n const [templateLoading, setTemplateLoading] = useState(false);\n const [templateOptions, setTemplateOptions] = useState<\n readonly TemplateOption[]\n >([]);\n const refreshRequestIdRef = useRef(0);\n\n const refreshRules = useCallback(async (): Promise<void> => {\n const requestId = refreshRequestIdRef.current + 1;\n refreshRequestIdRef.current = requestId;\n\n if (!currentMemberId) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const [rulePageResult, members] = await Promise.all([\n listDelegationRulesPage({\n includeInactive: true,\n page: rulePage,\n pageSize: rulePageSize,\n principalMemberId: currentMemberId,\n scopeType: scopeFilterType.scopeType,\n status: ruleStatus === 'ALL' ? null : ruleStatus,\n }),\n searchMembers(''),\n ]);\n\n if (requestId === refreshRequestIdRef.current) {\n setRules(rulePageResult.rules);\n setRuleTotalCount(rulePageResult.totalCount);\n setMemberOptions(members.map(readMemberOption));\n }\n } catch (requestError: unknown) {\n if (requestId === refreshRequestIdRef.current) {\n setError(readErrorMessage(requestError));\n }\n } finally {\n if (requestId === refreshRequestIdRef.current) {\n setLoading(false);\n }\n }\n }, [currentMemberId, rulePage, rulePageSize, ruleStatus, scopeFilterType]);\n\n useEffect((): void => {\n void refreshRules();\n }, [refreshRules]);\n\n const membersById = useMemo(\n (): ReadonlyMap<string, MemberOption> =>\n new Map(memberOptions.map((option) => [option.id, option])),\n [memberOptions],\n );\n const rows = useMemo(\n (): DelegationRuleRow[] =>\n rules.map((rule) => ({\n ...rule,\n agentEmail: membersById.get(rule.agentMemberId)?.email ?? null,\n agentName:\n membersById.get(rule.agentMemberId)?.displayName ??\n rule.agentMemberId,\n key: rule.id,\n scopeLabel: readScopeLabel(rule),\n })),\n [membersById, rules],\n );\n const selectedScopeType =\n SCOPE_OPTIONS.find((option) => option.id === scopeType.id) ??\n SCOPE_OPTIONS[0];\n const columns = useMemo(\n (): TableColumn<DelegationRuleRow>[] => [\n {\n key: 'agent',\n render: (record: DelegationRuleRow): ReactElement => (\n <MemberNameWithEmailTooltip\n email={record.agentEmail}\n name={record.agentName}\n />\n ),\n title: '代理人',\n width: 220,\n },\n { dataIndex: 'scopeLabel', key: 'scope', title: '代理範圍', width: 220 },\n {\n key: 'status',\n render: (record: DelegationRuleRow): ReactElement => (\n <DelegationStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n {\n key: 'startAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(record.startAt)}\n </Typography>\n ),\n title: '開始時間',\n width: 220,\n },\n {\n key: 'endAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {record.endAt ? formatDateTime(record.endAt) : '-'}\n </Typography>\n ),\n title: '結束時間',\n width: 220,\n },\n ],\n [],\n );\n const handleRevoke = useCallback(\n async (id: string): Promise<void> => {\n if (!currentMemberId) {\n return;\n }\n\n setError(null);\n\n try {\n await revokeDelegationRule({\n id,\n revokedByMemberId: currentMemberId,\n });\n await refreshRules();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n }\n },\n [currentMemberId, refreshRules],\n );\n const tableActions = useMemo(\n (): TableActions<DelegationRuleRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<DelegationRuleRow>['render']> =>\n record.status === 'ACTIVE'\n ? [\n {\n name: '撤銷',\n onClick: (): void => void handleRevoke(record.id),\n },\n ]\n : [],\n variant: 'destructive-secondary',\n width: 88,\n }),\n [handleRevoke],\n );\n\n async function handleSearchMembers(searchText: string): Promise<void> {\n setMemberLoading(true);\n\n try {\n setMemberOptions((await searchMembers(searchText)).map(readMemberOption));\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setMemberLoading(false);\n }\n }\n\n async function handleSearchTemplates(\n searchText: string,\n selectedOptions: readonly TemplateOption[] = scopeTemplates,\n ): Promise<void> {\n setTemplateLoading(true);\n\n try {\n const nextOptions = (await listApprovalTemplates()).map(\n readTemplateOption,\n );\n\n setTemplateOptions(\n mergeTemplateOptions(\n selectedOptions,\n filterTemplateOptions(nextOptions, searchText),\n ),\n );\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setTemplateLoading(false);\n }\n }\n\n function openCreateModal(): void {\n setAgentMember(null);\n setEndAt('');\n setScopeTemplates([]);\n setScopeType(SCOPE_OPTIONS[0]);\n setStartAt('');\n setTemplateOptions([]);\n void handleSearchTemplates('', []);\n setModalOpen(true);\n }\n\n function closeCreateModal(): void {\n if (saving) {\n return;\n }\n\n setModalOpen(false);\n }\n\n async function handleCreate(): Promise<void> {\n if (!currentMemberId) {\n return;\n }\n\n if (!agentMember) {\n setError('請選擇代理人');\n return;\n }\n\n if (agentMember.id === currentMemberId) {\n setError('代理人不可設定為自己');\n return;\n }\n\n if (selectedScopeType.id === 'TEMPLATE_LIST' && scopeTemplates.length < 1) {\n setError('請選擇至少一個簽核模板');\n return;\n }\n\n if (isInvalidDelegationDateRange(startAt, endAt)) {\n setError('結束時間必須晚於起始時間');\n return;\n }\n\n setSaving(true);\n setError(null);\n\n try {\n await createDelegationRule({\n agentMemberId: agentMember.id,\n createdByMemberId: currentMemberId,\n endAt: endAt || null,\n principalMemberId: currentMemberId,\n priority: 100,\n requiresConfirmation: false,\n scopeConditionCel: null,\n scopeTemplateIds:\n selectedScopeType.id === 'TEMPLATE_LIST'\n ? scopeTemplates.map((template) => template.id)\n : [],\n scopeType: selectedScopeType.id,\n startAt: startAt || null,\n });\n setModalOpen(false);\n\n if (rulePage === 1) {\n await refreshRules();\n } else {\n setRulePage(1);\n }\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <>\n <PageHeader>\n <ContentHeader\n description=\"設定自己的簽核代理,讓指定期間內的新待簽任務自動交由代理人處理。\"\n title=\"我的代理\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={openCreateModal}\n variant=\"base-primary\"\n >\n 建立代理\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.delegationFilterArea} size=\"sub\">\n <FilterLine>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"scopeFilterType\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => {\n setScopeFilterType(readScopeFilterOption(option));\n setRulePage(1);\n }}\n options={[...SCOPE_FILTER_OPTIONS]}\n placeholder=\"代理範圍\"\n size=\"sub\"\n value={scopeFilterType}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={ruleStatus}\n onChange={(activeKey): void => {\n setRuleStatus(readDelegationStatusTabKey(activeKey));\n setRulePage(1);\n }}\n >\n {DELEGATION_STATUS_TABS.map((statusTab) => (\n <TabItem key={statusTab.key}>{statusTab.label}</TabItem>\n ))}\n </Tab>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <Table\n actions={tableActions}\n columns={columns}\n dataSource={rows}\n fullWidth\n loading={loading}\n pagination={{\n current: rulePage,\n onChange: (page): void => {\n setRulePage(page);\n },\n onChangePageSize: (pageSize): void => {\n setRulePage(1);\n setRulePageSize(pageSize);\n },\n pageSize: rulePageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: DELEGATION_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: ruleTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{\n disabled: !agentMember,\n }}\n confirmText=\"建立代理\"\n loading={saving}\n modalType=\"standard\"\n onCancel={closeCreateModal}\n onClose={closeCreateModal}\n onConfirm={(): void => void handleCreate()}\n open={modalOpen}\n showModalFooter\n showModalHeader\n size=\"regular\"\n supportingText=\"代理生效後,後續建立的待簽任務會依範圍自動指派給代理人。\"\n title=\"建立個人代理\"\n >\n <div className={styles.delegationModalFields}>\n <MemberAutoCompleteField\n label=\"代理人\"\n loading={memberLoading}\n name=\"agentMemberId\"\n onChange={setAgentMember}\n onSearch={handleSearchMembers}\n options={memberOptions}\n value={agentMember}\n />\n <BPMFormField label=\"代理範圍\" name=\"scopeType\" required>\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void =>\n setScopeType(readScopeOptionFromValue(option))\n }\n options={[...SCOPE_OPTIONS]}\n placeholder=\"選擇代理範圍\"\n value={selectedScopeType}\n />\n </BPMFormField>\n {selectedScopeType.id === 'TEMPLATE_LIST' ? (\n <BPMFormField label=\"簽核模板\" name=\"scopeTemplateIds\" required>\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的模板\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name: 'scopeTemplateIds',\n spellCheck: false,\n }}\n loading={templateLoading}\n loadingText=\"搜尋模板中...\"\n mode=\"multiple\"\n onChange={(nextTemplates): void => {\n const selectedTemplates =\n readTemplateOptionsFromValue(nextTemplates);\n\n setScopeTemplates(selectedTemplates);\n setTemplateOptions((currentOptions) =>\n mergeTemplateOptions(selectedTemplates, currentOptions),\n );\n }}\n onSearch={handleSearchTemplates}\n onVisibilityChange={(open): void => {\n if (open) {\n void handleSearchTemplates('');\n }\n }}\n options={[...templateOptions]}\n overflowStrategy=\"wrap\"\n placeholder=\"搜尋並選取簽核模板\"\n searchDebounceTime={300}\n value={[...scopeTemplates]}\n />\n </BPMFormField>\n ) : null}\n <BPMFormField label=\"起始時間\" name=\"startAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setStartAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"留空立即生效\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(startAt)}\n />\n </BPMFormField>\n <BPMFormField label=\"結束時間\" name=\"endAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setEndAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"可留空\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(endAt)}\n />\n </BPMFormField>\n </div>\n </Modal>\n </>\n );\n}\n\nfunction MemberAutoCompleteField({\n label,\n loading,\n name,\n onChange,\n onSearch,\n options,\n value,\n}: {\n readonly label: string;\n readonly loading: boolean;\n readonly name: string;\n readonly onChange: (option: MemberOption | null) => void;\n readonly onSearch: (searchText: string) => Promise<void>;\n readonly options: readonly MemberOption[];\n readonly value: MemberOption | null;\n}): ReactElement {\n return (\n <BPMFormField\n label={label}\n layout={DELEGATION_MODAL_FIELD_LAYOUT}\n name={name}\n required\n >\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的成員\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name,\n spellCheck: false,\n }}\n loading={loading}\n loadingText=\"搜尋成員中...\"\n mode=\"single\"\n onChange={(option): void => onChange(readMemberOptionFromValue(option))}\n onSearch={onSearch}\n onSearchTextChange={(searchText): void =>\n onChange(readUniqueMemberOption(searchText, options))\n }\n onVisibilityChange={(open): void => {\n if (open) {\n void onSearch('');\n }\n }}\n options={[...options]}\n placeholder=\"搜尋姓名或信箱\"\n searchDebounceTime={300}\n value={value}\n />\n </BPMFormField>\n );\n}\n\nfunction MemberNameWithEmailTooltip({\n email,\n name,\n}: {\n readonly email: string | null;\n readonly name: string;\n}): ReactElement {\n if (!email) {\n return <span>{name}</span>;\n }\n\n return (\n <Tooltip title={email}>\n {({ onMouseEnter, onMouseLeave, ref }): ReactElement => (\n <span\n className={styles.memberNameWithTooltip}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n ref={ref as RefCallback<HTMLSpanElement>}\n >\n {name}\n </span>\n )}\n </Tooltip>\n );\n}\n\nfunction readMemberOption(member: MemberProfileRecord): MemberOption {\n return {\n displayName: member.name,\n email: member.email,\n id: member.memberId,\n name: `${member.name} (${member.email})`,\n };\n}\n\nfunction readMemberOptionFromValue(value: unknown): MemberOption | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const displayName = value.displayName;\n const email = value.email;\n const id = value.id;\n const name = value.name;\n\n return typeof id === 'string' && typeof name === 'string'\n ? {\n displayName: typeof displayName === 'string' ? displayName : name,\n email: typeof email === 'string' ? email : null,\n id,\n name,\n }\n : null;\n}\n\nfunction readUniqueMemberOption(\n searchText: string,\n options: readonly MemberOption[],\n): MemberOption | null {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return null;\n }\n\n const matches = options.filter((option) =>\n [option.id, option.name, option.email ?? ''].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n\n return matches.length === 1 ? (matches[0] ?? null) : null;\n}\n\nfunction readTemplateOption(template: ApprovalTemplateRecord): TemplateOption {\n return {\n id: template.id,\n name: template.name,\n };\n}\n\nfunction readTemplateOptionsFromValue(\n value: readonly unknown[],\n): readonly TemplateOption[] {\n return value.flatMap((item): readonly TemplateOption[] => {\n if (!isRecord(item)) {\n return [];\n }\n\n const id = item.id;\n const name = item.name;\n\n return typeof id === 'string' && typeof name === 'string'\n ? [{ id, name }]\n : [];\n });\n}\n\nfunction filterTemplateOptions(\n options: readonly TemplateOption[],\n searchText: string,\n): readonly TemplateOption[] {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return options;\n }\n\n return options.filter((option) =>\n [option.id, option.name].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n}\n\nfunction mergeTemplateOptions(\n selectedOptions: readonly TemplateOption[],\n availableOptions: readonly TemplateOption[],\n): readonly TemplateOption[] {\n return [...selectedOptions, ...availableOptions].reduce<TemplateOption[]>(\n (options, option) =>\n options.some((currentOption) => currentOption.id === option.id)\n ? options\n : [...options, option],\n [],\n );\n}\n\nfunction readScopeFilterOption(value: unknown): ScopeFilterOption {\n if (!isRecord(value)) {\n return SCOPE_FILTER_OPTIONS[0];\n }\n\n const id = value.id;\n\n return (\n SCOPE_FILTER_OPTIONS.find((option) => option.id === id) ??\n SCOPE_FILTER_OPTIONS[0]\n );\n}\n\nfunction readScopeLabel(rule: DelegationRuleRecord): string {\n if (rule.scopeType === 'ALL') {\n return '全部簽核';\n }\n\n if (rule.scopeType === 'TEMPLATE_LIST') {\n return `指定模板:${rule.scopeTemplateIds.length}`;\n }\n\n return rule.scopeConditionCel ? `條件:${rule.scopeConditionCel}` : '條件式';\n}\n\nfunction readScopeOptionFromValue(value: unknown): ScopeOption {\n if (!isRecord(value) || !isSelectableDelegationScopeType(value.id)) {\n return SCOPE_OPTIONS[0];\n }\n\n return (\n SCOPE_OPTIONS.find((option) => option.id === value.id) ?? SCOPE_OPTIONS[0]\n );\n}\n\nfunction isSelectableDelegationScopeType(\n value: unknown,\n): value is ScopeOption['id'] {\n return value === 'ALL' || value === 'TEMPLATE_LIST';\n}\n\nfunction DelegationStatusBadge({\n status,\n}: {\n readonly status: DelegationRuleRecord['status'];\n}): ReactElement {\n if (status === 'ACTIVE') {\n return <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />;\n }\n\n if (status === 'REVOKED') {\n return <Badge size=\"sub\" text=\"已撤銷\" variant=\"dot-inactive\" />;\n }\n\n if (status === 'EXPIRED') {\n return <Badge size=\"sub\" text=\"已過期\" variant=\"dot-warning\" />;\n }\n\n return <Badge size=\"sub\" text={status} variant=\"dot-info\" />;\n}\n\nfunction readDelegationStatusTabKey(activeKey: Key): DelegationStatusTabKey {\n if (\n activeKey === 'ACTIVE' ||\n activeKey === 'REVOKED' ||\n activeKey === 'EXPIRED'\n ) {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction readDelegationDateTimePickerValue(value: string): string | undefined {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date\n ? `${formatDateParts(date)}T${padDatePart(date.getHours())}:${padDatePart(\n date.getMinutes(),\n )}`\n : undefined;\n}\n\nfunction formatDelegationDateTimePickerValue(\n value: string | undefined,\n): string {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date ? date.toISOString() : '';\n}\n\nfunction isInvalidDelegationDateRange(startAt: string, endAt: string): boolean {\n if (!startAt || !endAt) {\n return false;\n }\n\n const startDate = parseDelegationDateTimeValue(startAt);\n const endDate = parseDelegationDateTimeValue(endAt);\n\n return !!startDate && !!endDate && endDate.getTime() <= startDate.getTime();\n}\n\nfunction parseDelegationDateTimeValue(value: string): Date | null {\n if (value.endsWith('Z') || /[+-]\\d{2}:\\d{2}$/.test(value)) {\n const parsedDate = new Date(value);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n }\n\n const [datePart = '', timePart = '00:00'] = value.split('T');\n const [year = 0, month = 1, day = 1] = datePart.split('-').map(Number);\n const [hour = 0, minute = 0] = timePart.split(':').map(Number);\n const parsedDate = new Date(year, month - 1, day, hour, minute);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n}\n\nfunction formatDateParts(date: Date): string {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(\n date.getDate(),\n )}`;\n}\n\nfunction padDatePart(value: number): string {\n return String(value).padStart(2, '0');\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { r as t } from "./routes-config-RBYQtUd0.js";
|
|
|
4
4
|
import { t as n } from "./bpm-form-field-Cao0rMol.js";
|
|
5
5
|
import { a as r, n as i, o as a, r as o } from "./admin-pickers-DLlG_1du.js";
|
|
6
6
|
import '../style.css';/* empty css */
|
|
7
|
-
import { t as s } from "./FormBuilderView-
|
|
7
|
+
import { t as s } from "./FormBuilderView-TzSezeqC.js";
|
|
8
8
|
import { Fragment as c, useCallback as l, useEffect as u, useMemo as d, useRef as f, useState as p } from "react";
|
|
9
9
|
import { AutoComplete as m, Button as h, Icon as g, Input as _, Modal as v, PageHeader as ee, Section as te, SectionGroup as ne, Select as y, Textarea as b, Toggle as x, Typography as S } from "@mezzanine-ui/react";
|
|
10
10
|
import { Fragment as C, jsx as w, jsxs as T } from "react/jsx-runtime";
|
|
@@ -72,28 +72,28 @@ function nt({ directory: e, initialState: t, layout: n, onLayout: r }) {
|
|
|
72
72
|
//#endregion
|
|
73
73
|
//#region src/views/templates/designer/use-workflow-chat.ts
|
|
74
74
|
function rt({ controller: e, api: t = "/api/chat" }) {
|
|
75
|
-
let n = Ge({
|
|
76
|
-
transport:
|
|
75
|
+
let n = d(() => new pe({ api: t }), [t]), r = Ge({
|
|
76
|
+
transport: n,
|
|
77
77
|
sendAutomaticallyWhen: ge,
|
|
78
78
|
async onToolCall({ toolCall: t }) {
|
|
79
|
-
let
|
|
80
|
-
if (
|
|
81
|
-
|
|
82
|
-
output:
|
|
79
|
+
let n = await e.executeTool(t.toolName, t.input);
|
|
80
|
+
if (n.ok) {
|
|
81
|
+
r.addToolOutput({
|
|
82
|
+
output: n.kind === "query" ? n.data : n.snapshot,
|
|
83
83
|
tool: t.toolName,
|
|
84
84
|
toolCallId: t.toolCallId
|
|
85
85
|
});
|
|
86
86
|
return;
|
|
87
87
|
}
|
|
88
|
-
|
|
89
|
-
errorText:
|
|
88
|
+
r.addToolOutput({
|
|
89
|
+
errorText: n.error,
|
|
90
90
|
state: "output-error",
|
|
91
91
|
tool: t.toolName,
|
|
92
92
|
toolCallId: t.toolCallId
|
|
93
93
|
});
|
|
94
94
|
}
|
|
95
95
|
});
|
|
96
|
-
return
|
|
96
|
+
return r;
|
|
97
97
|
}
|
|
98
98
|
//#endregion
|
|
99
99
|
//#region src/views/templates/designer/chrome-workflow-chat.ts
|
|
@@ -351,13 +351,20 @@ function _t({ api: e, controller: t, onClose: n, open: r }) {
|
|
|
351
351
|
});
|
|
352
352
|
}
|
|
353
353
|
function vt(e) {
|
|
354
|
-
return e.parts.map((t, n) =>
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
354
|
+
return e.parts.map((t, n) => {
|
|
355
|
+
if (t.type === "text") return /* @__PURE__ */ w("div", {
|
|
356
|
+
style: gt(e.role),
|
|
357
|
+
children: t.text
|
|
358
|
+
}, `${e.id}-${n}`);
|
|
359
|
+
if (t.type === "dynamic-tool" || he(t)) {
|
|
360
|
+
let r = me(t), i = ht[t.state] ?? t.state;
|
|
361
|
+
return /* @__PURE__ */ w("div", {
|
|
362
|
+
style: mt,
|
|
363
|
+
children: `⚙ ${r} · ${i}`
|
|
364
|
+
}, `${e.id}-${n}`);
|
|
365
|
+
}
|
|
366
|
+
return null;
|
|
367
|
+
});
|
|
361
368
|
}
|
|
362
369
|
//#endregion
|
|
363
370
|
//#region src/views/templates/designer/TemplateDesignerView.tsx
|
|
@@ -825,7 +832,7 @@ function xn({ aiAssistantAvailable: r = !0, embedded: a = !1, formSchemaOverride
|
|
|
825
832
|
u(() => {
|
|
826
833
|
if (!xr) return;
|
|
827
834
|
function e(e) {
|
|
828
|
-
e.key
|
|
835
|
+
(e.key === "Delete" || e.key === "Backspace") && (Sr(e.target) || (e.preventDefault(), Tr()));
|
|
829
836
|
}
|
|
830
837
|
return window.addEventListener("keydown", e), () => {
|
|
831
838
|
window.removeEventListener("keydown", e);
|
|
@@ -894,7 +901,8 @@ function xn({ aiAssistantAvailable: r = !0, embedded: a = !1, formSchemaOverride
|
|
|
894
901
|
async function ni(e) {
|
|
895
902
|
P(!0), N(null);
|
|
896
903
|
try {
|
|
897
|
-
|
|
904
|
+
let t = await Ue(e);
|
|
905
|
+
F(Ar(Cr(t), Y));
|
|
898
906
|
} catch (e) {
|
|
899
907
|
N(li(e));
|
|
900
908
|
} finally {
|
|
@@ -948,13 +956,13 @@ function xn({ aiAssistantAvailable: r = !0, embedded: a = !1, formSchemaOverride
|
|
|
948
956
|
workflowDefinition: k
|
|
949
957
|
}), In(!1), Pn(null), await Xr();
|
|
950
958
|
else {
|
|
951
|
-
let t = await We({
|
|
959
|
+
let t = ye ?? await Re(he), n = await We({
|
|
952
960
|
formDefinitionVersionId: A,
|
|
953
961
|
initiatorPolicyCel: j,
|
|
954
|
-
versionId:
|
|
962
|
+
versionId: t.id,
|
|
955
963
|
workflowDefinition: k
|
|
956
964
|
});
|
|
957
|
-
be(
|
|
965
|
+
be(n), e && await ze(n.id), await Xr();
|
|
958
966
|
}
|
|
959
967
|
} catch (e) {
|
|
960
968
|
throw N(li(e)), e;
|
|
@@ -977,12 +985,13 @@ function xn({ aiAssistantAvailable: r = !0, embedded: a = !1, formSchemaOverride
|
|
|
977
985
|
async function hi() {
|
|
978
986
|
xn(!0), H(null), Tn(null);
|
|
979
987
|
try {
|
|
980
|
-
|
|
981
|
-
formData:
|
|
988
|
+
let e = Er(V), t = await Le({
|
|
989
|
+
formData: e,
|
|
982
990
|
initiatorMemberId: pn,
|
|
983
991
|
initiatorMetadataSnapshot: Ir(pn, Yt),
|
|
984
992
|
workflowDefinition: k
|
|
985
|
-
})
|
|
993
|
+
});
|
|
994
|
+
Tn(t);
|
|
986
995
|
} catch (e) {
|
|
987
996
|
H(li(e));
|
|
988
997
|
} finally {
|
|
@@ -2187,7 +2196,7 @@ function xn({ aiAssistantAvailable: r = !0, embedded: a = !1, formSchemaOverride
|
|
|
2187
2196
|
});
|
|
2188
2197
|
}
|
|
2189
2198
|
function Hi(e) {
|
|
2190
|
-
let t = ai(e, k.nodes), r = Qr(Y?.schema ?? null), i = $r(Y?.schema ?? null, e.data.conditionFieldKey ?? null), a = ei(i), o = ri(i), s = W(a, e.data.conditionOperator ?? null);
|
|
2199
|
+
let t = ai(e, k.nodes), r = Qr(Y?.schema ?? null), i = $r(Y?.schema ?? null, e.data.conditionFieldKey ?? null), a = ei(i), o = ri(i), s = W(a, e.data.conditionOperator ?? null), c = !e.data.isDefault && !e.data.condition;
|
|
2191
2200
|
return /* @__PURE__ */ T("div", {
|
|
2192
2201
|
style: Mt,
|
|
2193
2202
|
children: [
|
|
@@ -2197,7 +2206,7 @@ function xn({ aiAssistantAvailable: r = !0, embedded: a = !1, formSchemaOverride
|
|
|
2197
2206
|
children: [
|
|
2198
2207
|
"畫布上的這條線目前會顯示「",
|
|
2199
2208
|
/* @__PURE__ */ w("span", {
|
|
2200
|
-
style: { color:
|
|
2209
|
+
style: { color: c ? Ot : void 0 },
|
|
2201
2210
|
children: t ?? "請設定條件"
|
|
2202
2211
|
}),
|
|
2203
2212
|
"」。"
|
|
@@ -2296,9 +2305,9 @@ function Sn({ onApplyAutoLayout: e }) {
|
|
|
2296
2305
|
});
|
|
2297
2306
|
}
|
|
2298
2307
|
function V({ data: e, selected: t, type: n }) {
|
|
2299
|
-
let r = e.approverLines ?? [e.approverSummary ?? e.label], i = Cn(e);
|
|
2308
|
+
let r = e.approverLines ?? [e.approverSummary ?? e.label], i = Cn(e), a = wn(n, t);
|
|
2300
2309
|
return /* @__PURE__ */ T("div", {
|
|
2301
|
-
style:
|
|
2310
|
+
style: a,
|
|
2302
2311
|
children: [
|
|
2303
2312
|
En(e),
|
|
2304
2313
|
/* @__PURE__ */ w("div", {
|
|
@@ -3035,4 +3044,4 @@ function li(e) {
|
|
|
3035
3044
|
//#endregion
|
|
3036
3045
|
export { xn as t };
|
|
3037
3046
|
|
|
3038
|
-
//# sourceMappingURL=designer-
|
|
3047
|
+
//# sourceMappingURL=designer-Cb3WAC46.js.map
|