@rytass/bpm-core-react 0.17.8 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +8 -0
  3. package/dist/chunks/{FormBuilderView-ClLnQ1e_.js → FormBuilderView-BVKY1j_0.js} +504 -452
  4. package/dist/chunks/FormBuilderView-BVKY1j_0.js.map +1 -0
  5. package/dist/chunks/FormBuilderView-SrGltzFT.cjs +3 -0
  6. package/dist/chunks/FormBuilderView-SrGltzFT.cjs.map +1 -0
  7. package/dist/chunks/approver-filled-form-Dm3Iw7iw.cjs +2 -0
  8. package/dist/chunks/approver-filled-form-Dm3Iw7iw.cjs.map +1 -0
  9. package/dist/chunks/{approver-filled-form-DuQGPtNB.js → approver-filled-form-ZEwpmsHJ.js} +21 -8
  10. package/dist/chunks/approver-filled-form-ZEwpmsHJ.js.map +1 -0
  11. package/dist/chunks/{compose-jnvnnVfN.js → compose-B1GlrZW9.js} +3 -3
  12. package/dist/chunks/{compose-jnvnnVfN.js.map → compose-B1GlrZW9.js.map} +1 -1
  13. package/dist/chunks/{compose-Cock_B2Q.cjs → compose-DZk-SfHT.cjs} +2 -2
  14. package/dist/chunks/{compose-Cock_B2Q.cjs.map → compose-DZk-SfHT.cjs.map} +1 -1
  15. package/dist/chunks/{designer-B8Gvew_k.js → designer-BCLrjb4H.js} +886 -851
  16. package/dist/chunks/designer-BCLrjb4H.js.map +1 -0
  17. package/dist/chunks/designer-BYYxEN9L.cjs +65 -0
  18. package/dist/chunks/designer-BYYxEN9L.cjs.map +1 -0
  19. package/dist/chunks/{detail-D6X61pkg.js → detail-4F39ggBn.js} +883 -827
  20. package/dist/chunks/detail-4F39ggBn.js.map +1 -0
  21. package/dist/chunks/detail-BkMtA_0K.cjs +2 -0
  22. package/dist/chunks/detail-BkMtA_0K.cjs.map +1 -0
  23. package/dist/chunks/{orgs-Lg7tXv2u.js → orgs-8hje_l2n.js} +9 -4
  24. package/dist/chunks/orgs-8hje_l2n.js.map +1 -0
  25. package/dist/chunks/{orgs-C8usknWb.cjs → orgs-BeeDDWL1.cjs} +2 -2
  26. package/dist/chunks/orgs-BeeDDWL1.cjs.map +1 -0
  27. package/dist/chunks/users-O2L_M3BK.cjs +2 -0
  28. package/dist/chunks/users-O2L_M3BK.cjs.map +1 -0
  29. package/dist/chunks/{users-DRbuDYF1.js → users-Pl6hY5Y5.js} +160 -93
  30. package/dist/chunks/users-Pl6hY5Y5.js.map +1 -0
  31. package/dist/pages/admin/orgs/index.cjs +1 -1
  32. package/dist/pages/admin/orgs/index.js +1 -1
  33. package/dist/pages/admin/users/index.cjs +1 -1
  34. package/dist/pages/admin/users/index.js +1 -1
  35. package/dist/pages/instances/detail/index.cjs +1 -1
  36. package/dist/pages/instances/detail/index.js +1 -1
  37. package/dist/pages/templates/compose/index.cjs +1 -1
  38. package/dist/pages/templates/compose/index.js +1 -1
  39. package/dist/pages/templates/designer/index.cjs +1 -1
  40. package/dist/pages/templates/designer/index.js +1 -1
  41. package/dist/views/admin/index.cjs +1 -1
  42. package/dist/views/admin/index.js +2 -2
  43. package/dist/views/admin/orgs/index.cjs +1 -1
  44. package/dist/views/admin/orgs/index.js +1 -1
  45. package/dist/views/admin/users/index.cjs +1 -1
  46. package/dist/views/admin/users/index.js +1 -1
  47. package/dist/views/forms/builder/index.cjs +1 -1
  48. package/dist/views/forms/builder/index.js +1 -1
  49. package/dist/views/inbox/index.cjs +1 -1
  50. package/dist/views/inbox/index.cjs.map +1 -1
  51. package/dist/views/inbox/index.js +159 -78
  52. package/dist/views/inbox/index.js.map +1 -1
  53. package/dist/views/instances/detail/index.cjs +1 -1
  54. package/dist/views/instances/detail/index.js +1 -1
  55. package/dist/views/instances/detail/sections/InstanceFormSection.d.cts +9 -1
  56. package/dist/views/instances/detail/sections/InstanceFormSection.d.ts +9 -1
  57. package/dist/views/instances/detail/use-resubmit-comment-draft.d.cts +18 -0
  58. package/dist/views/instances/detail/use-resubmit-comment-draft.d.ts +18 -0
  59. package/dist/views/instances/new/index.cjs +1 -1
  60. package/dist/views/instances/new/index.cjs.map +1 -1
  61. package/dist/views/instances/new/index.js +15 -11
  62. package/dist/views/instances/new/index.js.map +1 -1
  63. package/dist/views/templates/compose/index.cjs +1 -1
  64. package/dist/views/templates/compose/index.js +1 -1
  65. package/dist/views/templates/designer/index.cjs +1 -1
  66. package/dist/views/templates/designer/index.js +1 -1
  67. package/package.json +3 -3
  68. package/dist/chunks/FormBuilderView-CUOyS07f.cjs +0 -3
  69. package/dist/chunks/FormBuilderView-CUOyS07f.cjs.map +0 -1
  70. package/dist/chunks/FormBuilderView-ClLnQ1e_.js.map +0 -1
  71. package/dist/chunks/approver-filled-form-D1DmqDVP.cjs +0 -2
  72. package/dist/chunks/approver-filled-form-D1DmqDVP.cjs.map +0 -1
  73. package/dist/chunks/approver-filled-form-DuQGPtNB.js.map +0 -1
  74. package/dist/chunks/designer-B8Gvew_k.js.map +0 -1
  75. package/dist/chunks/designer-CAEFV1ve.cjs +0 -65
  76. package/dist/chunks/designer-CAEFV1ve.cjs.map +0 -1
  77. package/dist/chunks/detail-COh5sjAt.cjs +0 -2
  78. package/dist/chunks/detail-COh5sjAt.cjs.map +0 -1
  79. package/dist/chunks/detail-D6X61pkg.js.map +0 -1
  80. package/dist/chunks/orgs-C8usknWb.cjs.map +0 -1
  81. package/dist/chunks/orgs-Lg7tXv2u.js.map +0 -1
  82. package/dist/chunks/users-DRbuDYF1.js.map +0 -1
  83. package/dist/chunks/users-DVQicZIo.cjs +0 -2
  84. package/dist/chunks/users-DVQicZIo.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users-O2L_M3BK.cjs","names":["useState","useRef","useCallback","listMemberOpenTasks","readErrorMessage","useMemo","reassignMemberTasks","Modal","styles","Typography","Table","BPMFormField","MemberPicker","Input","Button","useState","useMemo","useCallback","listMemberDirectoryPage","readOrganizationDashboard","useRef","listInactiveMembersWithOpenTasks","listMemberships","readResolvedManager","resolveMembers","_Fragment","PageHeader","ContentHeader","SectionGroup","Section","Typography","Table","FilterArea","styles","FilterLine","Filter","FormField","FormFieldLayout","Input","Modal","BaseCard","formatMemberLabel","require_rolldown_runtime","require_bpm_form_field","require_format_member_label","require_admin_pickers","react","_mezzanine_ui_react","_rytass_bpm_core_client","react_jsx_runtime","_rytass_bpm_core_client_workflow","_mezzanine_ui_core_form","_mezzanine_ui_react_ContentHeader","_rytass_bpm_core_client_organization","users_module_default","MemberTaskReassignModal","tasks","setTasks","tasksLoading","setTasksLoading","target","setTarget","reason","setReason","preview","setPreview","committed","setCommitted","busy","setBusy","error","setError","trimmedReason","inputKey","previewIsCurrent","canConfirm","result","latestRequestRef","loadTasks","request","loaded","memberId","requestError","readErrorMessage$1","member","titleById","task","runReassignment","outcomes","dryRun","shownResultRows","shownResults","shownTitleById","readOutcomeLabel","taskColumns","record","resultColumns","onClose","option","event","outcome","MEMBER_PAGE_SIZE_OPTIONS","AdminUsersView","detailMember","setDetailMember","detailMemberships","setDetailMemberships","detailManagerProfile","setDetailManagerProfile","detailResolvedManager","setDetailResolvedManager","inactiveMembers","setInactiveMembers","inactiveMembersError","setInactiveMembersError","loading","setLoading","memberPage","setMemberPage","memberPageSize","setMemberPageSize","memberTotalCount","setMemberTotalCount","members","setMembers","orgUnits","setOrgUnits","positions","setPositions","reassignMember","setReassignMember","searchText","setSearchText","orgUnitsById","orgUnit","positionsById","position","refreshMembers","memberPageResult","organization","readErrorMessage","latestInactiveRequestRef","refreshInactiveMembers","inactiveMemberRows","inactiveMemberColumns","inactiveMemberActions","rows","openDetail","memberships","resolvedManager","columns","tableActions","closeDetail","page","pageSize","from","to","total","MemberDetailModal","readOrgUnitLabel","membership","readPositionLabel","readMemberLabel","managerProfile"],"sources":["../../src/views/admin/users/users.module.scss","../../src/views/admin/users/MemberTaskReassignModal.tsx","../../src/views/admin/users/AdminUsersView.tsx"],"sourcesContent":[".memberFilterArea {\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 :global(.mzn-input),\n :global(.mzn-input-container),\n :global(.mzn-text-field) {\n width: 100%;\n min-width: 0 !important;\n }\n}\n\n.header {\n display: grid;\n gap: 4px;\n padding: 24px 24px 0;\n}\n\n.detailFields {\n display: grid;\n gap: 16px;\n}\n\n.detailSection {\n display: grid;\n gap: 8px;\n}\n\n.membershipList {\n display: grid;\n gap: 8px;\n}\n","'use client';\n\nimport {\n ChangeEvent,\n ReactElement,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { Button, Input, Modal, Table, Typography } from '@mezzanine-ui/react';\nimport type { TableColumn } from '@mezzanine-ui/core/table';\nimport type { MemberProfileRecord } from '@rytass/bpm-core-client';\nimport {\n listMemberOpenTasks,\n type MemberOpenTaskRecord,\n reassignMemberTasks,\n type TaskReassignmentResultRecord,\n} from '@rytass/bpm-core-client/workflow';\nimport { BPMFormField } from '../../../components/bpm-form-field';\nimport { MemberOption, MemberPicker } from '../../../components/admin-pickers';\nimport styles from './users.module.scss';\n\ntype TaskRow = Readonly<\n Record<string, unknown> &\n MemberOpenTaskRecord & {\n key: string;\n }\n>;\n\ntype ResultRow = Readonly<\n Record<string, unknown> & {\n instanceTitle: string;\n key: string;\n message: string | null;\n outcomeLabel: string;\n }\n>;\n\ninterface PreviewState {\n readonly inputKey: string;\n readonly results: readonly TaskReassignmentResultRecord[];\n}\n\n/**\n * A committed run keeps the titles it was started with: the task list reloads\n * right after, and a member whose every task moved no longer lists any of them.\n */\ninterface CommittedState {\n readonly results: readonly TaskReassignmentResultRecord[];\n readonly titleById: ReadonlyMap<string, string>;\n}\n\n/**\n * Administrator reassignment of a member's open tasks. Lists what the member\n * holds, takes a target and a reason, previews every task's outcome (dry run),\n * and only then commits. Confirm stays disabled until the preview matches the\n * current target and reason. Replacing a seat is not a decision: no signature\n * is written, and the task keeps its id.\n */\nexport function MemberTaskReassignModal({\n member,\n onClose,\n}: {\n readonly member: MemberProfileRecord | null;\n readonly onClose: () => void;\n}): ReactElement {\n const [tasks, setTasks] = useState<readonly MemberOpenTaskRecord[]>([]);\n const [tasksLoading, setTasksLoading] = useState(false);\n const [target, setTarget] = useState<MemberOption | null>(null);\n const [reason, setReason] = useState('');\n const [preview, setPreview] = useState<PreviewState | null>(null);\n const [committed, setCommitted] = useState<CommittedState | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const trimmedReason = reason.trim();\n const inputKey = `${target?.id ?? ''}|${trimmedReason}`;\n const previewIsCurrent = preview !== null && preview.inputKey === inputKey;\n const canConfirm =\n preview !== null &&\n previewIsCurrent &&\n preview.results.some((result) => result.outcome === 'WOULD_REASSIGN');\n\n // Only the latest request may write: switching members while an earlier\n // listing is in flight must not let its late answer replace the current one.\n const latestRequestRef = useRef(0);\n\n const loadTasks = useCallback(async (memberId: string): Promise<void> => {\n const request = latestRequestRef.current + 1;\n\n latestRequestRef.current = request;\n setTasksLoading(true);\n\n try {\n const loaded = await listMemberOpenTasks(memberId);\n\n if (latestRequestRef.current === request) {\n setTasks(loaded);\n }\n } catch (requestError: unknown) {\n if (latestRequestRef.current === request) {\n setError(readErrorMessage(requestError));\n }\n } finally {\n if (latestRequestRef.current === request) {\n setTasksLoading(false);\n }\n }\n }, []);\n\n useEffect((): void => {\n setTarget(null);\n setReason('');\n setPreview(null);\n setCommitted(null);\n setError(null);\n\n if (!member) {\n latestRequestRef.current += 1;\n setTasks([]);\n setTasksLoading(false);\n\n return;\n }\n\n setTasks([]);\n void loadTasks(member.memberId);\n }, [member, loadTasks]);\n\n const titleById = useMemo(\n (): ReadonlyMap<string, string> =>\n new Map(tasks.map((task) => [task.taskId, task.instanceTitle])),\n [tasks],\n );\n\n async function runReassignment(dryRun: boolean): Promise<void> {\n if (!member || !target || !trimmedReason) {\n return;\n }\n\n setBusy(true);\n setError(null);\n\n try {\n const outcomes = await reassignMemberTasks({\n dryRun,\n fromMemberId: member.memberId,\n reason: trimmedReason,\n toMemberId: target.id,\n });\n\n if (dryRun) {\n setPreview({ inputKey, results: outcomes });\n setCommitted(null);\n } else {\n setCommitted({ results: outcomes, titleById });\n setPreview(null);\n await loadTasks(member.memberId);\n }\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setBusy(false);\n }\n }\n\n const shownResultRows = useMemo((): ResultRow[] => {\n const shownResults = committed?.results ?? preview?.results ?? [];\n const shownTitleById = committed?.titleById ?? titleById;\n\n return shownResults.map((result) => ({\n instanceTitle: shownTitleById.get(result.taskId) ?? result.taskId,\n key: result.taskId,\n message: result.message,\n outcomeLabel: readOutcomeLabel(result.outcome),\n }));\n }, [committed, preview, titleById]);\n\n const taskColumns = useMemo(\n (): TableColumn<TaskRow>[] => [\n {\n dataIndex: 'instanceTitle',\n key: 'instanceTitle',\n title: '案件',\n width: 220,\n },\n {\n dataIndex: 'nodeLabel',\n key: 'nodeLabel',\n title: '節點',\n width: 160,\n },\n {\n key: 'memberRole',\n render: (record: TaskRow): string =>\n record.memberRole === 'ASSIGNEE' ? '指派人' : '會簽候選人',\n title: '身分',\n width: 120,\n },\n ],\n [],\n );\n const resultColumns = useMemo(\n (): TableColumn<ResultRow>[] => [\n {\n dataIndex: 'instanceTitle',\n key: 'instanceTitle',\n title: '案件',\n width: 220,\n },\n {\n dataIndex: 'outcomeLabel',\n key: 'outcomeLabel',\n title: '結果',\n width: 100,\n },\n {\n dataIndex: 'message',\n key: 'message',\n title: '說明',\n width: 160,\n },\n ],\n [],\n );\n\n return (\n <Modal\n cancelText=\"關閉\"\n confirmButtonProps={{ disabled: !canConfirm || busy }}\n confirmText=\"確認改派\"\n loading={busy}\n modalType=\"standard\"\n onCancel={onClose}\n onClose={onClose}\n onConfirm={(): void => {\n void runReassignment(false);\n }}\n open={Boolean(member)}\n showModalFooter\n showModalHeader\n size=\"regular\"\n title={member ? `改派待辦:${member.name}` : '改派待辦'}\n >\n {member ? (\n <div className={styles.detailFields}>\n <Typography variant=\"body\">\n 改派會保留任務編號,但不產生簽核紀錄;原簽核人的待辦會結案為已轉交,\n 接手人會收到新的待辦通知。\n </Typography>\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n {tasks.length ? (\n <Table\n columns={taskColumns}\n dataSource={tasks.map((task): TaskRow => ({\n ...task,\n key: task.taskId,\n }))}\n fullWidth\n loading={tasksLoading}\n />\n ) : (\n <Typography color=\"text-neutral\" variant=\"body\">\n {tasksLoading ? '載入待辦中…' : '此成員目前沒有待簽任務。'}\n </Typography>\n )}\n <BPMFormField label=\"接手人\" name=\"reassignTarget\">\n <MemberPicker\n name=\"reassignTarget\"\n onChange={(option): void => {\n setTarget(option);\n setPreview(null);\n setCommitted(null);\n }}\n placeholder=\"搜尋接手人姓名或信箱\"\n value={target}\n />\n </BPMFormField>\n <BPMFormField label=\"改派原因\" name=\"reassignReason\">\n <Input\n fullWidth\n name=\"reassignReason\"\n onChange={(event: ChangeEvent<HTMLInputElement>): void => {\n setReason(event.target.value);\n setPreview(null);\n setCommitted(null);\n }}\n placeholder=\"例如:原簽核人已離職\"\n value={reason}\n />\n </BPMFormField>\n <div className={styles.membershipList}>\n <Typography color=\"text-neutral\" variant=\"caption\">\n 先按「預覽」確認每筆任務的結果,確認無誤後再按「確認改派」。\n </Typography>\n <div>\n <Button\n disabled={\n busy || !target || !trimmedReason || tasks.length === 0\n }\n onClick={(): void => {\n void runReassignment(true);\n }}\n variant=\"base-secondary\"\n >\n 預覽\n </Button>\n </div>\n </div>\n {shownResultRows.length ? (\n <Table\n columns={resultColumns}\n dataSource={shownResultRows}\n fullWidth\n />\n ) : null}\n </div>\n ) : null}\n </Modal>\n );\n}\n\nfunction readOutcomeLabel(\n outcome: TaskReassignmentResultRecord['outcome'],\n): string {\n if (outcome === 'WOULD_REASSIGN') {\n return '會改派';\n }\n\n if (outcome === 'REASSIGNED') {\n return '已改派';\n }\n\n return '會被拒';\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '改派待辦失敗。';\n}\n","'use client';\n\nimport {\n ChangeEvent,\n ReactElement,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n BaseCard,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Table,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { formatMemberLabel } from '../../../lib/format-member-label';\nimport styles from './users.module.scss';\nimport { MemberTaskReassignModal } from './MemberTaskReassignModal';\nimport {\n listMemberDirectoryPage,\n MemberProfileRecord,\n resolveMembers,\n} from '@rytass/bpm-core-client';\nimport {\n listMemberships,\n MembershipRecord,\n OrgUnitRecord,\n PositionRecord,\n readOrganizationDashboard,\n readResolvedManager,\n ResolvedManagerRecord,\n} from '@rytass/bpm-core-client/organization';\nimport {\n type InactiveMemberWithOpenTasksRecord,\n listInactiveMembersWithOpenTasks,\n} from '@rytass/bpm-core-client/workflow';\n\ntype MemberRow = Readonly<\n Record<string, unknown> &\n MemberProfileRecord & {\n key: string;\n }\n>;\n\ntype InactiveMemberRow = Readonly<\n Record<string, unknown> &\n InactiveMemberWithOpenTasksRecord & {\n key: string;\n }\n>;\n\nconst MEMBER_PAGE_SIZE_OPTIONS = [10, 20, 50];\n\nexport function AdminUsersView(): ReactElement {\n const [detailMember, setDetailMember] = useState<MemberProfileRecord | null>(\n null,\n );\n const [detailMemberships, setDetailMemberships] = useState<\n readonly MembershipRecord[]\n >([]);\n const [detailManagerProfile, setDetailManagerProfile] =\n useState<MemberProfileRecord | null>(null);\n const [detailResolvedManager, setDetailResolvedManager] =\n useState<ResolvedManagerRecord | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [inactiveMembers, setInactiveMembers] = useState<\n readonly InactiveMemberWithOpenTasksRecord[]\n >([]);\n const [inactiveMembersError, setInactiveMembersError] = useState<\n string | null\n >(null);\n const [loading, setLoading] = useState(true);\n const [memberPage, setMemberPage] = useState(1);\n const [memberPageSize, setMemberPageSize] = useState(10);\n const [memberTotalCount, setMemberTotalCount] = useState(0);\n const [members, setMembers] = useState<readonly MemberProfileRecord[]>([]);\n const [orgUnits, setOrgUnits] = useState<readonly OrgUnitRecord[]>([]);\n const [positions, setPositions] = useState<readonly PositionRecord[]>([]);\n const [reassignMember, setReassignMember] =\n useState<MemberProfileRecord | null>(null);\n const [searchText, setSearchText] = useState('');\n\n const orgUnitsById = useMemo(\n (): ReadonlyMap<string, OrgUnitRecord> =>\n new Map(orgUnits.map((orgUnit) => [orgUnit.id, orgUnit])),\n [orgUnits],\n );\n const positionsById = useMemo(\n (): ReadonlyMap<string, PositionRecord> =>\n new Map(positions.map((position) => [position.id, position])),\n [positions],\n );\n\n const refreshMembers = useCallback(async (): Promise<void> => {\n setLoading(true);\n setError(null);\n\n try {\n const [memberPageResult, organization] = await Promise.all([\n listMemberDirectoryPage({\n page: memberPage,\n pageSize: memberPageSize,\n searchText,\n }),\n readOrganizationDashboard(),\n ]);\n\n setMembers(memberPageResult.members);\n setMemberTotalCount(memberPageResult.totalCount);\n setOrgUnits(organization.orgUnits);\n setPositions(organization.positions);\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, [memberPage, memberPageSize, searchText]);\n\n useEffect((): void => {\n void refreshMembers();\n }, [refreshMembers]);\n\n const latestInactiveRequestRef = useRef(0);\n\n // Loaded on its own so a failure here leaves the member directory usable.\n // Only the latest request may write: a reload started when the reassignment\n // closes must not be overwritten by an earlier one answering late.\n const refreshInactiveMembers = useCallback(async (): Promise<void> => {\n const request = latestInactiveRequestRef.current + 1;\n\n latestInactiveRequestRef.current = request;\n\n try {\n const loaded = await listInactiveMembersWithOpenTasks();\n\n if (latestInactiveRequestRef.current === request) {\n setInactiveMembers(loaded);\n setInactiveMembersError(null);\n }\n } catch (requestError: unknown) {\n if (latestInactiveRequestRef.current === request) {\n setInactiveMembersError(readErrorMessage(requestError));\n }\n }\n }, []);\n\n useEffect((): void => {\n void refreshInactiveMembers();\n }, [refreshInactiveMembers]);\n\n const inactiveMemberRows = useMemo(\n (): InactiveMemberRow[] =>\n inactiveMembers.map(\n (member): InactiveMemberRow => ({ ...member, key: member.memberId }),\n ),\n [inactiveMembers],\n );\n const inactiveMemberColumns = useMemo(\n (): TableColumn<InactiveMemberRow>[] => [\n { dataIndex: 'name', key: 'name', title: '姓名', width: 160 },\n { dataIndex: 'email', key: 'email', title: '信箱', width: 260 },\n {\n dataIndex: 'openTaskCount',\n key: 'openTaskCount',\n title: '待簽數',\n width: 96,\n },\n ],\n [],\n );\n const inactiveMemberActions = useMemo(\n (): TableActions<InactiveMemberRow> => ({\n render: (): ReturnType<TableActions<InactiveMemberRow>['render']> => [\n {\n name: '改派待辦',\n onClick: (record): void => {\n setReassignMember({\n customFieldsJson: '{}',\n email: record.email,\n memberId: record.memberId,\n name: record.name,\n });\n },\n },\n ],\n variant: 'base-secondary',\n width: 112,\n }),\n [],\n );\n\n const rows = useMemo(\n (): MemberRow[] =>\n members.map((member) => ({\n ...member,\n key: member.memberId,\n })),\n [members],\n );\n\n const openDetail = useCallback(\n async (member: MemberProfileRecord): Promise<void> => {\n setDetailMember(member);\n setDetailManagerProfile(null);\n setError(null);\n\n try {\n const [memberships, resolvedManager] = await Promise.all([\n listMemberships({ memberId: member.memberId }),\n readResolvedManager(member.memberId),\n ]);\n\n setDetailMemberships(memberships);\n setDetailResolvedManager(resolvedManager);\n setDetailManagerProfile(\n (\n await resolveMembers(\n resolvedManager.managerMemberId\n ? [resolvedManager.managerMemberId]\n : [],\n )\n )[0] ?? null,\n );\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n }\n },\n [],\n );\n\n const columns = useMemo(\n (): TableColumn<MemberRow>[] => [\n { dataIndex: 'name', key: 'name', title: '姓名', width: 160 },\n { dataIndex: 'email', key: 'email', title: '信箱', width: 260 },\n ],\n [],\n );\n const tableActions = useMemo(\n (): TableActions<MemberRow> => ({\n render: (): ReturnType<TableActions<MemberRow>['render']> => [\n {\n name: '檢視',\n onClick: (record): void => {\n void openDetail(record);\n },\n },\n {\n name: '改派待辦',\n onClick: (record): void => {\n setReassignMember(record);\n },\n },\n ],\n variant: 'base-secondary',\n width: 176,\n }),\n [openDetail],\n );\n\n function closeDetail(): void {\n setDetailMember(null);\n setDetailManagerProfile(null);\n setDetailMemberships([]);\n setDetailResolvedManager(null);\n }\n\n return (\n <>\n <PageHeader>\n <ContentHeader\n description=\"會員資料由 host member resolver 提供,BPM 僅維護組織歸屬與主管解析。\"\n title=\"會員對照\"\n />\n </PageHeader>\n\n <SectionGroup>\n {inactiveMemberRows.length || inactiveMembersError ? (\n <Section\n contentHeader={\n <ContentHeader\n description=\"這些會員已停用,身上仍有待簽,請改派給在職的人。\"\n title=\"已停用、仍有待簽的會員\"\n />\n }\n >\n <div data-inactive-members=\"\">\n {inactiveMembersError ? (\n <Typography color=\"text-error\" variant=\"body\">\n {inactiveMembersError}\n </Typography>\n ) : (\n <Table\n actions={inactiveMemberActions}\n columns={inactiveMemberColumns}\n dataSource={inactiveMemberRows}\n fullWidth\n />\n )}\n </div>\n </Section>\n ) : null}\n <Section\n filterArea={\n <FilterArea className={styles.memberFilterArea}>\n <FilterLine>\n <Filter span={3}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"memberSearchText\"\n >\n <Input\n fullWidth\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n setSearchText(event.target.value);\n setMemberPage(1);\n }}\n placeholder=\"搜尋姓名或信箱\"\n size=\"sub\"\n value={searchText}\n variant=\"base\"\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\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: memberPage,\n onChange: (page): void => {\n setMemberPage(page);\n },\n onChangePageSize: (pageSize): void => {\n setMemberPage(1);\n setMemberPageSize(pageSize);\n },\n pageSize: memberPageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: MEMBER_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: memberTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n\n <MemberTaskReassignModal\n member={reassignMember}\n onClose={(): void => {\n setReassignMember(null);\n // A reassignment may have cleared someone off the list.\n void refreshInactiveMembers();\n }}\n />\n\n <MemberDetailModal\n managerProfile={detailManagerProfile}\n member={detailMember}\n memberships={detailMemberships}\n onClose={closeDetail}\n orgUnitsById={orgUnitsById}\n positionsById={positionsById}\n resolvedManager={detailResolvedManager}\n />\n </>\n );\n}\n\nfunction MemberDetailModal({\n managerProfile,\n member,\n memberships,\n onClose,\n orgUnitsById,\n positionsById,\n resolvedManager,\n}: {\n readonly managerProfile: MemberProfileRecord | null;\n readonly member: MemberProfileRecord | null;\n readonly memberships: readonly MembershipRecord[];\n readonly onClose: () => void;\n readonly orgUnitsById: ReadonlyMap<string, OrgUnitRecord>;\n readonly positionsById: ReadonlyMap<string, PositionRecord>;\n readonly resolvedManager: ResolvedManagerRecord | null;\n}): ReactElement {\n return (\n <Modal\n cancelText=\"關閉\"\n confirmText=\"關閉\"\n modalType=\"standard\"\n onCancel={onClose}\n onClose={onClose}\n onConfirm={onClose}\n open={Boolean(member)}\n showModalFooter\n showModalHeader\n size=\"regular\"\n title={member?.name ?? '會員明細'}\n >\n {member ? (\n <div className={styles.detailFields}>\n <BaseCard title=\"基本資料\">\n <div className={styles.detailSection}>\n <Typography variant=\"body\">\n 信箱:{member.email?.trim() ? member.email : '未設定'}\n </Typography>\n </div>\n </BaseCard>\n <BaseCard title=\"BPM 組織歸屬\">\n <div className={styles.membershipList}>\n {memberships.length ? (\n memberships.map((membership) => (\n <Typography key={membership.id} variant=\"body\">\n {readOrgUnitLabel(orgUnitsById.get(membership.orgUnitId))}\n {' / '}\n {membership.positionId\n ? readPositionLabel(\n positionsById.get(membership.positionId),\n )\n : '未指定職位'}\n {' / '}\n {membership.isPrimary ? '主要' : '一般'}\n </Typography>\n ))\n ) : (\n <Typography color=\"text-neutral\" variant=\"body\">\n 尚未建立 BPM 組織歸屬\n </Typography>\n )}\n </div>\n </BaseCard>\n <BaseCard title=\"主管解析\">\n <Typography variant=\"body\">\n {resolvedManager?.managerMemberId\n ? readMemberLabel(managerProfile)\n : '尚未解析到主管'}\n </Typography>\n </BaseCard>\n </div>\n ) : null}\n </Modal>\n );\n}\n\nfunction readOrgUnitLabel(orgUnit: OrgUnitRecord | undefined): string {\n return orgUnit ? `${orgUnit.name} · ${orgUnit.code}` : '未知組織';\n}\n\nfunction readPositionLabel(position: PositionRecord | undefined): string {\n return position ? `${position.name} · ${position.code}` : '未知職位';\n}\n\nfunction readMemberLabel(member: MemberProfileRecord | null): string {\n return member\n ? formatMemberLabel(member.name, member.email, 'dot')\n : '主管資料尚未載入';\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '讀取會員資料失敗。';\n}\n"],"mappings":"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"}
@@ -6,7 +6,7 @@ import { useCallback as r, useEffect as i, useMemo as a, useRef as o, useState a
6
6
  import { BaseCard as c, Button as l, Filter as u, FilterArea as d, FilterLine as f, FormField as p, Input as m, Modal as h, PageHeader as g, Section as _, SectionGroup as v, Table as y, Typography as b } from "@mezzanine-ui/react";
7
7
  import { listMemberDirectoryPage as x, resolveMembers as S } from "@rytass/bpm-core-client";
8
8
  import { Fragment as C, jsx as w, jsxs as T } from "react/jsx-runtime";
9
- import { listMemberOpenTasks as E, reassignMemberTasks as D } from "@rytass/bpm-core-client/workflow";
9
+ import { listInactiveMembersWithOpenTasks as E, listMemberOpenTasks as ee, reassignMemberTasks as D } from "@rytass/bpm-core-client/workflow";
10
10
  import { FormFieldLayout as O } from "@mezzanine-ui/core/form";
11
11
  import k from "@mezzanine-ui/react/ContentHeader";
12
12
  import { listMemberships as A, readOrganizationDashboard as j, readResolvedManager as M } from "@rytass/bpm-core-client/organization";
@@ -20,48 +20,48 @@ import '../users.css';var N = {
20
20
  //#endregion
21
21
  //#region src/views/admin/users/MemberTaskReassignModal.tsx
22
22
  function P({ member: t, onClose: c }) {
23
- let [u, d] = s([]), [f, p] = s(!1), [g, _] = s(null), [v, x] = s(""), [S, C] = s(null), [O, k] = s(null), [A, j] = s(!1), [M, P] = s(null), L = v.trim(), R = `${g?.id ?? ""}|${L}`, z = S !== null && S.inputKey === R, B = S !== null && z && S.results.some((e) => e.outcome === "WOULD_REASSIGN"), V = o(0), H = r(async (e) => {
24
- let t = V.current + 1;
25
- V.current = t, p(!0);
23
+ let [u, d] = s([]), [f, p] = s(!1), [g, _] = s(null), [v, x] = s(""), [S, C] = s(null), [E, O] = s(null), [k, A] = s(!1), [j, M] = s(null), P = v.trim(), L = `${g?.id ?? ""}|${P}`, R = S !== null && S.inputKey === L, te = S !== null && R && S.results.some((e) => e.outcome === "WOULD_REASSIGN"), z = o(0), B = r(async (e) => {
24
+ let t = z.current + 1;
25
+ z.current = t, p(!0);
26
26
  try {
27
- let n = await E(e);
28
- V.current === t && d(n);
27
+ let n = await ee(e);
28
+ z.current === t && d(n);
29
29
  } catch (e) {
30
- V.current === t && P(I(e));
30
+ z.current === t && M(I(e));
31
31
  } finally {
32
- V.current === t && p(!1);
32
+ z.current === t && p(!1);
33
33
  }
34
34
  }, []);
35
35
  i(() => {
36
- _(null), x(""), C(null), k(null), P(null), t ? (d([]), H(t.memberId)) : (V.current += 1, d([]), p(!1));
37
- }, [t, H]);
38
- let U = a(() => new Map(u.map((e) => [e.taskId, e.instanceTitle])), [u]);
39
- async function W(e) {
40
- if (t && g && L) {
41
- j(!0), P(null);
36
+ _(null), x(""), C(null), O(null), M(null), t ? (d([]), B(t.memberId)) : (z.current += 1, d([]), p(!1));
37
+ }, [t, B]);
38
+ let V = a(() => new Map(u.map((e) => [e.taskId, e.instanceTitle])), [u]);
39
+ async function H(e) {
40
+ if (t && g && P) {
41
+ A(!0), M(null);
42
42
  try {
43
43
  let n = await D({
44
44
  dryRun: e,
45
45
  fromMemberId: t.memberId,
46
- reason: L,
46
+ reason: P,
47
47
  toMemberId: g.id
48
48
  });
49
49
  e ? (C({
50
- inputKey: R,
50
+ inputKey: L,
51
51
  results: n
52
- }), k(null)) : (k({
52
+ }), O(null)) : (O({
53
53
  results: n,
54
- titleById: U
55
- }), C(null), await H(t.memberId));
54
+ titleById: V
55
+ }), C(null), await B(t.memberId));
56
56
  } catch (e) {
57
- P(I(e));
57
+ M(I(e));
58
58
  } finally {
59
- j(!1);
59
+ A(!1);
60
60
  }
61
61
  }
62
62
  }
63
- let G = a(() => {
64
- let e = O?.results ?? S?.results ?? [], t = O?.titleById ?? U;
63
+ let U = a(() => {
64
+ let e = E?.results ?? S?.results ?? [], t = E?.titleById ?? V;
65
65
  return e.map((e) => ({
66
66
  instanceTitle: t.get(e.taskId) ?? e.taskId,
67
67
  key: e.taskId,
@@ -69,10 +69,10 @@ function P({ member: t, onClose: c }) {
69
69
  outcomeLabel: F(e.outcome)
70
70
  }));
71
71
  }, [
72
- O,
72
+ E,
73
73
  S,
74
- U
75
- ]), K = a(() => [
74
+ V
75
+ ]), W = a(() => [
76
76
  {
77
77
  dataIndex: "instanceTitle",
78
78
  key: "instanceTitle",
@@ -91,7 +91,7 @@ function P({ member: t, onClose: c }) {
91
91
  title: "身分",
92
92
  width: 120
93
93
  }
94
- ], []), q = a(() => [
94
+ ], []), G = a(() => [
95
95
  {
96
96
  dataIndex: "instanceTitle",
97
97
  key: "instanceTitle",
@@ -113,14 +113,14 @@ function P({ member: t, onClose: c }) {
113
113
  ], []);
114
114
  return /* @__PURE__ */ w(h, {
115
115
  cancelText: "關閉",
116
- confirmButtonProps: { disabled: !B || A },
116
+ confirmButtonProps: { disabled: !te || k },
117
117
  confirmText: "確認改派",
118
- loading: A,
118
+ loading: k,
119
119
  modalType: "standard",
120
120
  onCancel: c,
121
121
  onClose: c,
122
122
  onConfirm: () => {
123
- W(!1);
123
+ H(!1);
124
124
  },
125
125
  open: !!t,
126
126
  showModalFooter: !0,
@@ -134,13 +134,13 @@ function P({ member: t, onClose: c }) {
134
134
  variant: "body",
135
135
  children: "改派會保留任務編號,但不產生簽核紀錄;原簽核人的待辦會結案為已轉交, 接手人會收到新的待辦通知。"
136
136
  }),
137
- M ? /* @__PURE__ */ w(b, {
137
+ j ? /* @__PURE__ */ w(b, {
138
138
  color: "text-error",
139
139
  variant: "body",
140
- children: M
140
+ children: j
141
141
  }) : null,
142
142
  u.length ? /* @__PURE__ */ w(y, {
143
- columns: K,
143
+ columns: W,
144
144
  dataSource: u.map((e) => ({
145
145
  ...e,
146
146
  key: e.taskId
@@ -158,7 +158,7 @@ function P({ member: t, onClose: c }) {
158
158
  children: /* @__PURE__ */ w(n, {
159
159
  name: "reassignTarget",
160
160
  onChange: (e) => {
161
- _(e), C(null), k(null);
161
+ _(e), C(null), O(null);
162
162
  },
163
163
  placeholder: "搜尋接手人姓名或信箱",
164
164
  value: g
@@ -171,7 +171,7 @@ function P({ member: t, onClose: c }) {
171
171
  fullWidth: !0,
172
172
  name: "reassignReason",
173
173
  onChange: (e) => {
174
- x(e.target.value), C(null), k(null);
174
+ x(e.target.value), C(null), O(null);
175
175
  },
176
176
  placeholder: "例如:原簽核人已離職",
177
177
  value: v
@@ -184,17 +184,17 @@ function P({ member: t, onClose: c }) {
184
184
  variant: "caption",
185
185
  children: "先按「預覽」確認每筆任務的結果,確認無誤後再按「確認改派」。"
186
186
  }), /* @__PURE__ */ w("div", { children: /* @__PURE__ */ w(l, {
187
- disabled: A || !g || !L || u.length === 0,
187
+ disabled: k || !g || !P || u.length === 0,
188
188
  onClick: () => {
189
- W(!0);
189
+ H(!0);
190
190
  },
191
191
  variant: "base-secondary",
192
192
  children: "預覽"
193
193
  }) })]
194
194
  }),
195
- G.length ? /* @__PURE__ */ w(y, {
196
- columns: q,
197
- dataSource: G,
195
+ U.length ? /* @__PURE__ */ w(y, {
196
+ columns: G,
197
+ dataSource: U,
198
198
  fullWidth: !0
199
199
  }) : null
200
200
  ]
@@ -215,40 +215,89 @@ var L = [
215
215
  50
216
216
  ];
217
217
  function R() {
218
- let [e, t] = s(null), [n, o] = s([]), [c, l] = s(null), [h, E] = s(null), [D, F] = s(null), [I, R] = s(!0), [B, V] = s(1), [H, W] = s(10), [G, K] = s(0), [q, ee] = s([]), [J, te] = s([]), [Y, ne] = s([]), [re, X] = s(null), [Z, ie] = s(""), ae = a(() => new Map(J.map((e) => [e.id, e])), [J]), oe = a(() => new Map(Y.map((e) => [e.id, e])), [Y]), Q = r(async () => {
219
- R(!0), F(null);
218
+ let [e, t] = s(null), [n, c] = s([]), [l, h] = s(null), [ee, D] = s(null), [F, I] = s(null), [R, z] = s([]), [B, V] = s(null), [U, W] = s(!0), [G, K] = s(1), [q, ne] = s(10), [re, ie] = s(0), [J, ae] = s([]), [Y, oe] = s([]), [se, ce] = s([]), [le, X] = s(null), [Z, ue] = s(""), de = a(() => new Map(Y.map((e) => [e.id, e])), [Y]), fe = a(() => new Map(se.map((e) => [e.id, e])), [se]), pe = r(async () => {
219
+ W(!0), I(null);
220
220
  try {
221
221
  let [e, t] = await Promise.all([x({
222
- page: B,
223
- pageSize: H,
222
+ page: G,
223
+ pageSize: q,
224
224
  searchText: Z
225
225
  }), j()]);
226
- ee(e.members), K(e.totalCount), te(t.orgUnits), ne(t.positions);
226
+ ae(e.members), ie(e.totalCount), oe(t.orgUnits), ce(t.positions);
227
227
  } catch (e) {
228
- F(U(e));
228
+ I(H(e));
229
229
  } finally {
230
- R(!1);
230
+ W(!1);
231
231
  }
232
232
  }, [
233
- B,
234
- H,
233
+ G,
234
+ q,
235
235
  Z
236
236
  ]);
237
237
  i(() => {
238
- Q();
239
- }, [Q]);
240
- let se = a(() => q.map((e) => ({
238
+ pe();
239
+ }, [pe]);
240
+ let Q = o(0), $ = r(async () => {
241
+ let e = Q.current + 1;
242
+ Q.current = e;
243
+ try {
244
+ let t = await E();
245
+ Q.current === e && (z(t), V(null));
246
+ } catch (t) {
247
+ Q.current === e && V(H(t));
248
+ }
249
+ }, []);
250
+ i(() => {
251
+ $();
252
+ }, [$]);
253
+ let me = a(() => R.map((e) => ({
254
+ ...e,
255
+ key: e.memberId
256
+ })), [R]), he = a(() => [
257
+ {
258
+ dataIndex: "name",
259
+ key: "name",
260
+ title: "姓名",
261
+ width: 160
262
+ },
263
+ {
264
+ dataIndex: "email",
265
+ key: "email",
266
+ title: "信箱",
267
+ width: 260
268
+ },
269
+ {
270
+ dataIndex: "openTaskCount",
271
+ key: "openTaskCount",
272
+ title: "待簽數",
273
+ width: 96
274
+ }
275
+ ], []), ge = a(() => ({
276
+ render: () => [{
277
+ name: "改派待辦",
278
+ onClick: (e) => {
279
+ X({
280
+ customFieldsJson: "{}",
281
+ email: e.email,
282
+ memberId: e.memberId,
283
+ name: e.name
284
+ });
285
+ }
286
+ }],
287
+ variant: "base-secondary",
288
+ width: 112
289
+ }), []), _e = a(() => J.map((e) => ({
241
290
  ...e,
242
291
  key: e.memberId
243
- })), [q]), $ = r(async (e) => {
244
- t(e), l(null), F(null);
292
+ })), [J]), ve = r(async (e) => {
293
+ t(e), h(null), I(null);
245
294
  try {
246
295
  let [t, n] = await Promise.all([A({ memberId: e.memberId }), M(e.memberId)]);
247
- o(t), E(n), l((await S(n.managerMemberId ? [n.managerMemberId] : []))[0] ?? null);
296
+ c(t), D(n), h((await S(n.managerMemberId ? [n.managerMemberId] : []))[0] ?? null);
248
297
  } catch (e) {
249
- F(U(e));
298
+ I(H(e));
250
299
  }
251
- }, []), ce = a(() => [{
300
+ }, []), ye = a(() => [{
252
301
  dataIndex: "name",
253
302
  key: "name",
254
303
  title: "姓名",
@@ -258,11 +307,11 @@ function R() {
258
307
  key: "email",
259
308
  title: "信箱",
260
309
  width: 260
261
- }], []), le = a(() => ({
310
+ }], []), be = a(() => ({
262
311
  render: () => [{
263
312
  name: "檢視",
264
313
  onClick: (e) => {
265
- $(e);
314
+ ve(e);
266
315
  }
267
316
  }, {
268
317
  name: "改派待辦",
@@ -272,16 +321,34 @@ function R() {
272
321
  }],
273
322
  variant: "base-secondary",
274
323
  width: 176
275
- }), [$]);
276
- function ue() {
277
- t(null), l(null), o([]), E(null);
324
+ }), [ve]);
325
+ function xe() {
326
+ t(null), h(null), c([]), D(null);
278
327
  }
279
328
  return /* @__PURE__ */ T(C, { children: [
280
329
  /* @__PURE__ */ w(g, { children: /* @__PURE__ */ w(k, {
281
330
  description: "會員資料由 host member resolver 提供,BPM 僅維護組織歸屬與主管解析。",
282
331
  title: "會員對照"
283
332
  }) }),
284
- /* @__PURE__ */ w(v, { children: /* @__PURE__ */ T(_, {
333
+ /* @__PURE__ */ T(v, { children: [me.length || B ? /* @__PURE__ */ w(_, {
334
+ contentHeader: /* @__PURE__ */ w(k, {
335
+ description: "這些會員已停用,身上仍有待簽,請改派給在職的人。",
336
+ title: "已停用、仍有待簽的會員"
337
+ }),
338
+ children: /* @__PURE__ */ w("div", {
339
+ "data-inactive-members": "",
340
+ children: B ? /* @__PURE__ */ w(b, {
341
+ color: "text-error",
342
+ variant: "body",
343
+ children: B
344
+ }) : /* @__PURE__ */ w(y, {
345
+ actions: ge,
346
+ columns: he,
347
+ dataSource: me,
348
+ fullWidth: !0
349
+ })
350
+ })
351
+ }) : null, /* @__PURE__ */ T(_, {
285
352
  filterArea: /* @__PURE__ */ w(d, {
286
353
  className: N.memberFilterArea,
287
354
  children: /* @__PURE__ */ w(f, { children: /* @__PURE__ */ w(u, {
@@ -293,7 +360,7 @@ function R() {
293
360
  children: /* @__PURE__ */ w(m, {
294
361
  fullWidth: !0,
295
362
  onChange: (e) => {
296
- ie(e.target.value), V(1);
363
+ ue(e.target.value), K(1);
297
364
  },
298
365
  placeholder: "搜尋姓名或信箱",
299
366
  size: "sub",
@@ -303,51 +370,51 @@ function R() {
303
370
  })
304
371
  }) })
305
372
  }),
306
- children: [D ? /* @__PURE__ */ w(b, {
373
+ children: [F ? /* @__PURE__ */ w(b, {
307
374
  color: "text-error",
308
375
  variant: "body",
309
- children: D
376
+ children: F
310
377
  }) : null, /* @__PURE__ */ w(y, {
311
- actions: le,
312
- columns: ce,
313
- dataSource: se,
378
+ actions: be,
379
+ columns: ye,
380
+ dataSource: _e,
314
381
  fullWidth: !0,
315
- loading: I,
382
+ loading: U,
316
383
  pagination: {
317
- current: B,
384
+ current: G,
318
385
  onChange: (e) => {
319
- V(e);
386
+ K(e);
320
387
  },
321
388
  onChangePageSize: (e) => {
322
- V(1), W(e);
389
+ K(1), ne(e);
323
390
  },
324
- pageSize: H,
391
+ pageSize: q,
325
392
  pageSizeLabel: "每頁筆數",
326
393
  pageSizeOptions: L,
327
394
  renderResultSummary: (e, t, n) => `顯示 ${e}-${t} 筆,共 ${n} 筆`,
328
395
  showPageSizeOptions: !0,
329
- total: G
396
+ total: re
330
397
  }
331
398
  })]
332
- }) }),
399
+ })] }),
333
400
  /* @__PURE__ */ w(P, {
334
- member: re,
401
+ member: le,
335
402
  onClose: () => {
336
- X(null);
403
+ X(null), $();
337
404
  }
338
405
  }),
339
- /* @__PURE__ */ w(z, {
340
- managerProfile: c,
406
+ /* @__PURE__ */ w(te, {
407
+ managerProfile: l,
341
408
  member: e,
342
409
  memberships: n,
343
- onClose: ue,
344
- orgUnitsById: ae,
345
- positionsById: oe,
346
- resolvedManager: h
410
+ onClose: xe,
411
+ orgUnitsById: de,
412
+ positionsById: fe,
413
+ resolvedManager: ee
347
414
  })
348
415
  ] });
349
416
  }
350
- function z({ managerProfile: e, member: t, memberships: n, onClose: r, orgUnitsById: i, positionsById: a, resolvedManager: o }) {
417
+ function te({ managerProfile: e, member: t, memberships: n, onClose: r, orgUnitsById: i, positionsById: a, resolvedManager: o }) {
351
418
  return /* @__PURE__ */ w(h, {
352
419
  cancelText: "關閉",
353
420
  confirmText: "關閉",
@@ -380,9 +447,9 @@ function z({ managerProfile: e, member: t, memberships: n, onClose: r, orgUnitsB
380
447
  children: n.length ? n.map((e) => /* @__PURE__ */ T(b, {
381
448
  variant: "body",
382
449
  children: [
383
- B(i.get(e.orgUnitId)),
450
+ z(i.get(e.orgUnitId)),
384
451
  " / ",
385
- e.positionId ? V(a.get(e.positionId)) : "未指定職位",
452
+ e.positionId ? B(a.get(e.positionId)) : "未指定職位",
386
453
  " / ",
387
454
  e.isPrimary ? "主要" : "一般"
388
455
  ]
@@ -397,26 +464,26 @@ function z({ managerProfile: e, member: t, memberships: n, onClose: r, orgUnitsB
397
464
  title: "主管解析",
398
465
  children: /* @__PURE__ */ w(b, {
399
466
  variant: "body",
400
- children: o?.managerMemberId ? H(e) : "尚未解析到主管"
467
+ children: o?.managerMemberId ? V(e) : "尚未解析到主管"
401
468
  })
402
469
  })
403
470
  ]
404
471
  }) : null
405
472
  });
406
473
  }
407
- function B(e) {
474
+ function z(e) {
408
475
  return e ? `${e.name} · ${e.code}` : "未知組織";
409
476
  }
410
- function V(e) {
477
+ function B(e) {
411
478
  return e ? `${e.name} · ${e.code}` : "未知職位";
412
479
  }
413
- function H(e) {
480
+ function V(e) {
414
481
  return e ? t(e.name, e.email, "dot") : "主管資料尚未載入";
415
482
  }
416
- function U(e) {
483
+ function H(e) {
417
484
  return e instanceof Error ? e.message : "讀取會員資料失敗。";
418
485
  }
419
486
  //#endregion
420
487
  export { R as t };
421
488
 
422
- //# sourceMappingURL=users-DRbuDYF1.js.map
489
+ //# sourceMappingURL=users-Pl6hY5Y5.js.map