@rytass/bpm-core-react 0.2.0 → 0.3.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/dist/chunks/app-navigation-BRRFCkxZ.cjs +2 -0
- package/dist/chunks/{app-navigation-DAC5gFbG.cjs.map → app-navigation-BRRFCkxZ.cjs.map} +1 -1
- package/dist/chunks/{app-navigation-CATITRM7.js → app-navigation-rxhpHCch.js} +2 -3
- package/dist/chunks/{app-navigation-CATITRM7.js.map → app-navigation-rxhpHCch.js.map} +1 -1
- package/dist/chunks/approval-instance-list-page-2vUWc5-c.cjs +2 -0
- package/dist/chunks/{approval-instance-list-page-DIAmwhvl.cjs.map → approval-instance-list-page-2vUWc5-c.cjs.map} +1 -1
- package/dist/chunks/{approval-instance-list-page-B6vAGvOb.js → approval-instance-list-page-BgE4vQw8.js} +3 -3
- package/dist/chunks/{approval-instance-list-page-B6vAGvOb.js.map → approval-instance-list-page-BgE4vQw8.js.map} +1 -1
- package/dist/chunks/auth-provider-BV8Iiwfb.cjs +2 -0
- package/dist/chunks/auth-provider-BV8Iiwfb.cjs.map +1 -0
- package/dist/chunks/auth-provider-Bnox5gsx.js +98 -0
- package/dist/chunks/auth-provider-Bnox5gsx.js.map +1 -0
- package/dist/chunks/builder-B8X-m6C5.cjs +3 -0
- package/dist/chunks/builder-B8X-m6C5.cjs.map +1 -0
- package/dist/chunks/{FormBuilderView-CvChAvgD.js → builder-Du_0apkh.js} +3 -3
- package/dist/chunks/builder-Du_0apkh.js.map +1 -0
- package/dist/chunks/{TemplateCategoriesView-CgZciaSd.js → categories-DG4k7S8V.js} +86 -85
- package/dist/chunks/categories-DG4k7S8V.js.map +1 -0
- package/dist/chunks/categories-DshBQG33.cjs +2 -0
- package/dist/chunks/categories-DshBQG33.cjs.map +1 -0
- package/dist/chunks/{dashboard-page-BsW8t104.js → dashboard-page-CTBwpu_D.js} +3 -4
- package/dist/chunks/{dashboard-page-BsW8t104.js.map → dashboard-page-CTBwpu_D.js.map} +1 -1
- package/dist/chunks/dashboard-page-DcDiWQp2.cjs +2 -0
- package/dist/chunks/{dashboard-page-udYhnyMW.cjs.map → dashboard-page-DcDiWQp2.cjs.map} +1 -1
- package/dist/chunks/{AdminDelegationsView-DydMZ9ED.js → delegations-BAZQbElH.js} +4 -4
- package/dist/chunks/delegations-BAZQbElH.js.map +1 -0
- package/dist/chunks/{DelegationsView-DQUqOUV5.js → delegations-DzrckrPp.js} +4 -4
- package/dist/chunks/delegations-DzrckrPp.js.map +1 -0
- package/dist/chunks/delegations-Z8hTajLj.cjs +2 -0
- package/dist/chunks/delegations-Z8hTajLj.cjs.map +1 -0
- package/dist/chunks/delegations-hb9JoVZe.cjs +2 -0
- package/dist/chunks/delegations-hb9JoVZe.cjs.map +1 -0
- package/dist/chunks/{InstanceDetailView-C-A-LOCG.js → detail-DilI0PPe.js} +10 -10
- package/dist/chunks/detail-DilI0PPe.js.map +1 -0
- package/dist/chunks/detail-DuRg3Y7b.cjs +2 -0
- package/dist/chunks/detail-DuRg3Y7b.cjs.map +1 -0
- package/dist/chunks/{format-date-time-BQyH5U8z.cjs → format-date-time-hKLVMxq4.cjs} +2 -2
- package/dist/chunks/{format-date-time-BQyH5U8z.cjs.map → format-date-time-hKLVMxq4.cjs.map} +1 -1
- package/dist/chunks/{LoginView-a1iu3cfc.js → login-C20yVxbc.js} +9 -9
- package/dist/chunks/login-C20yVxbc.js.map +1 -0
- package/dist/chunks/login-CQ9MfwcC.cjs +2 -0
- package/dist/chunks/login-CQ9MfwcC.cjs.map +1 -0
- package/dist/chunks/{SettingsNotificationsView-B6F6fa7U.js → notifications-B2Lk3grg.js} +4 -4
- package/dist/chunks/notifications-B2Lk3grg.js.map +1 -0
- package/dist/chunks/notifications-C8ADhnxF.cjs +2 -0
- package/dist/chunks/notifications-C8ADhnxF.cjs.map +1 -0
- package/dist/chunks/orgs-CGv3VNDR.cjs +2 -0
- package/dist/chunks/orgs-CGv3VNDR.cjs.map +1 -0
- package/dist/chunks/{AdminOrgsView-DZaVAbaQ.js → orgs-c29y74w2.js} +52 -52
- package/dist/chunks/orgs-c29y74w2.js.map +1 -0
- package/dist/chunks/templates-Cd0WFheA.cjs +2 -0
- package/dist/chunks/templates-Cd0WFheA.cjs.map +1 -0
- package/dist/chunks/{TemplatesView-BLj9f-XI.js → templates-Dn9QHFSy.js} +4 -4
- package/dist/chunks/templates-Dn9QHFSy.js.map +1 -0
- package/dist/chunks/users-B-trMu0E.cjs +2 -0
- package/dist/chunks/users-B-trMu0E.cjs.map +1 -0
- package/dist/chunks/{AdminUsersView-C0oO05Br.js → users-itVXXRj7.js} +3 -3
- package/dist/chunks/users-itVXXRj7.js.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +12 -13
- package/dist/index.js.map +1 -1
- package/dist/next/BPMNextProviders.d.ts +6 -0
- package/dist/next/index.cjs +2 -0
- package/dist/next/index.cjs.map +1 -0
- package/dist/next/index.d.ts +1 -0
- package/dist/next/index.js +33 -0
- package/dist/next/index.js.map +1 -0
- 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/delegations/index.js.map +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/orgs/index.js.map +1 -1
- package/dist/pages/admin/users/index.cjs +1 -1
- package/dist/pages/admin/users/index.cjs.map +1 -1
- package/dist/pages/admin/users/index.js +1 -1
- package/dist/pages/admin/users/index.js.map +1 -1
- package/dist/pages/cc/index.cjs +1 -1
- package/dist/pages/cc/index.cjs.map +1 -1
- package/dist/pages/cc/index.js +1 -1
- package/dist/pages/cc/index.js.map +1 -1
- package/dist/pages/dashboard/index.cjs +1 -1
- package/dist/pages/dashboard/index.cjs.map +1 -1
- package/dist/pages/dashboard/index.js +1 -1
- package/dist/pages/dashboard/index.js.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/delegations/index.js.map +1 -1
- package/dist/pages/forms/builder/index.cjs +1 -1
- package/dist/pages/forms/builder/index.cjs.map +1 -1
- package/dist/pages/forms/builder/index.d.ts +5 -7
- package/dist/pages/forms/builder/index.js +1 -1
- package/dist/pages/forms/builder/index.js.map +1 -1
- package/dist/pages/forms/index.cjs +1 -1
- package/dist/pages/forms/index.cjs.map +1 -1
- package/dist/pages/forms/index.js +1 -1
- package/dist/pages/forms/index.js.map +1 -1
- package/dist/pages/inbox/index.cjs +1 -1
- package/dist/pages/inbox/index.cjs.map +1 -1
- package/dist/pages/inbox/index.js +1 -1
- package/dist/pages/inbox/index.js.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.d.ts +1 -1
- package/dist/pages/instances/detail/index.js +1 -1
- package/dist/pages/instances/detail/index.js.map +1 -1
- package/dist/pages/instances/new/index.cjs +1 -1
- package/dist/pages/instances/new/index.cjs.map +1 -1
- package/dist/pages/instances/new/index.d.ts +5 -1
- package/dist/pages/instances/new/index.js +4 -3
- package/dist/pages/instances/new/index.js.map +1 -1
- package/dist/pages/login/index.cjs +1 -1
- package/dist/pages/login/index.cjs.map +1 -1
- package/dist/pages/login/index.d.ts +5 -1
- package/dist/pages/login/index.js +4 -3
- package/dist/pages/login/index.js.map +1 -1
- package/dist/pages/root/index.cjs +1 -1
- package/dist/pages/root/index.cjs.map +1 -1
- package/dist/pages/root/index.d.ts +7 -5
- package/dist/pages/root/index.js +5 -6
- package/dist/pages/root/index.js.map +1 -1
- package/dist/pages/search/index.cjs +1 -1
- package/dist/pages/search/index.cjs.map +1 -1
- package/dist/pages/search/index.js +1 -1
- package/dist/pages/search/index.js.map +1 -1
- package/dist/pages/sent/index.cjs +1 -1
- package/dist/pages/sent/index.cjs.map +1 -1
- package/dist/pages/sent/index.js +1 -1
- package/dist/pages/sent/index.js.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/settings/notifications/index.js +1 -1
- package/dist/pages/settings/notifications/index.js.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/categories/index.js +1 -1
- package/dist/pages/templates/categories/index.js.map +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.d.ts +2 -4
- package/dist/pages/templates/designer/index.js +1 -1
- package/dist/pages/templates/designer/index.js.map +1 -1
- package/dist/pages/templates/index.cjs +1 -1
- package/dist/pages/templates/index.cjs.map +1 -1
- package/dist/pages/templates/index.js +1 -1
- package/dist/pages/templates/index.js.map +1 -1
- package/dist/pages/templates/versions/index.cjs +1 -1
- package/dist/pages/templates/versions/index.cjs.map +1 -1
- package/dist/pages/templates/versions/index.d.ts +2 -4
- package/dist/pages/templates/versions/index.js +1 -1
- package/dist/pages/templates/versions/index.js.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 -0
- package/dist/views/admin/index.d.ts +3 -0
- package/dist/views/admin/index.js +4 -0
- 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/admin/users/index.js +1 -1
- package/dist/views/cc/index.cjs +2 -1
- package/dist/views/cc/index.cjs.map +1 -0
- package/dist/views/cc/index.js +19 -2
- package/dist/views/cc/index.js.map +1 -0
- package/dist/views/dashboard/index.cjs +2 -1
- package/dist/views/dashboard/index.cjs.map +1 -0
- package/dist/views/dashboard/index.js +11 -2
- package/dist/views/dashboard/index.js.map +1 -0
- 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/index.cjs +2 -1
- package/dist/views/forms/index.cjs.map +1 -0
- package/dist/views/forms/index.d.ts +1 -0
- package/dist/views/forms/index.js +186 -2
- package/dist/views/forms/index.js.map +1 -0
- package/dist/views/inbox/index.cjs +2 -1
- package/dist/views/inbox/index.cjs.map +1 -0
- package/dist/views/inbox/index.js +290 -2
- package/dist/views/inbox/index.js.map +1 -0
- package/dist/views/instances/detail/index.cjs +1 -1
- package/dist/views/instances/detail/index.js +1 -1
- package/dist/views/instances/index.cjs +1 -0
- package/dist/views/instances/index.d.ts +1 -0
- package/dist/views/instances/index.js +2 -0
- package/dist/views/instances/new/InstanceNewView.d.ts +3 -3
- package/dist/views/instances/new/index.cjs +2 -1
- package/dist/views/instances/new/index.cjs.map +1 -0
- package/dist/views/instances/new/index.js +189 -2
- package/dist/views/instances/new/index.js.map +1 -0
- package/dist/views/login/index.cjs +1 -1
- package/dist/views/login/index.js +1 -1
- package/dist/views/search/index.cjs +2 -1
- package/dist/views/search/index.cjs.map +1 -0
- package/dist/views/search/index.js +19 -2
- package/dist/views/search/index.js.map +1 -0
- package/dist/views/sent/index.cjs +2 -1
- package/dist/views/sent/index.cjs.map +1 -0
- package/dist/views/sent/index.js +19 -2
- package/dist/views/sent/index.js.map +1 -0
- package/dist/views/settings/index.cjs +1 -0
- package/dist/views/settings/index.d.ts +1 -0
- package/dist/views/settings/index.js +2 -0
- package/dist/views/settings/notifications/index.cjs +1 -1
- package/dist/views/settings/notifications/index.js +1 -1
- package/dist/views/templates/categories/index.cjs +1 -1
- package/dist/views/templates/categories/index.js +1 -1
- package/dist/views/templates/designer/index.cjs +51 -1
- package/dist/views/templates/designer/index.cjs.map +1 -0
- package/dist/views/templates/designer/index.js +2272 -2
- package/dist/views/templates/designer/index.js.map +1 -0
- package/dist/views/templates/index.cjs +1 -1
- package/dist/views/templates/index.d.ts +2 -0
- package/dist/views/templates/index.js +4 -2
- package/dist/views/templates/versions/index.cjs +2 -1
- package/dist/views/templates/versions/index.cjs.map +1 -0
- package/dist/views/templates/versions/index.js +110 -2
- package/dist/views/templates/versions/index.js.map +1 -0
- package/dist/views/workflow/index.cjs +1 -0
- package/dist/views/workflow/index.d.ts +4 -0
- package/dist/views/workflow/index.js +5 -0
- package/package.json +28 -3
- package/dist/chunks/AdminDelegationsView-CqNmlVWx.cjs +0 -2
- package/dist/chunks/AdminDelegationsView-CqNmlVWx.cjs.map +0 -1
- package/dist/chunks/AdminDelegationsView-DydMZ9ED.js.map +0 -1
- package/dist/chunks/AdminOrgsView-DZaVAbaQ.js.map +0 -1
- package/dist/chunks/AdminOrgsView-bSsIyMvk.cjs +0 -2
- package/dist/chunks/AdminOrgsView-bSsIyMvk.cjs.map +0 -1
- package/dist/chunks/AdminUsersView-C0oO05Br.js.map +0 -1
- package/dist/chunks/AdminUsersView-DlArLlIr.cjs +0 -2
- package/dist/chunks/AdminUsersView-DlArLlIr.cjs.map +0 -1
- package/dist/chunks/CcView-BsVsya5F.cjs +0 -2
- package/dist/chunks/CcView-BsVsya5F.cjs.map +0 -1
- package/dist/chunks/CcView-Bv0GzA5C.js +0 -19
- package/dist/chunks/CcView-Bv0GzA5C.js.map +0 -1
- package/dist/chunks/DashboardView-Dk1ZQmmk.js +0 -11
- package/dist/chunks/DashboardView-Dk1ZQmmk.js.map +0 -1
- package/dist/chunks/DashboardView-_0zh-rxT.cjs +0 -2
- package/dist/chunks/DashboardView-_0zh-rxT.cjs.map +0 -1
- package/dist/chunks/DelegationsView-DQUqOUV5.js.map +0 -1
- package/dist/chunks/DelegationsView-pKeFV2LN.cjs +0 -2
- package/dist/chunks/DelegationsView-pKeFV2LN.cjs.map +0 -1
- package/dist/chunks/FormBuilderView-BKtyW55e.cjs +0 -3
- package/dist/chunks/FormBuilderView-BKtyW55e.cjs.map +0 -1
- package/dist/chunks/FormBuilderView-CvChAvgD.js.map +0 -1
- package/dist/chunks/FormsView-DYEuik8W.js +0 -185
- package/dist/chunks/FormsView-DYEuik8W.js.map +0 -1
- package/dist/chunks/FormsView-RjJEkIfZ.cjs +0 -2
- package/dist/chunks/FormsView-RjJEkIfZ.cjs.map +0 -1
- package/dist/chunks/InboxView-DDWwmWhA.cjs +0 -2
- package/dist/chunks/InboxView-DDWwmWhA.cjs.map +0 -1
- package/dist/chunks/InboxView-YSoyrYLk.js +0 -291
- package/dist/chunks/InboxView-YSoyrYLk.js.map +0 -1
- package/dist/chunks/InstanceDetailView-C-A-LOCG.js.map +0 -1
- package/dist/chunks/InstanceDetailView-l_kNDCz2.cjs +0 -2
- package/dist/chunks/InstanceDetailView-l_kNDCz2.cjs.map +0 -1
- package/dist/chunks/InstanceNewView-B5hz-FWd.js +0 -190
- package/dist/chunks/InstanceNewView-B5hz-FWd.js.map +0 -1
- package/dist/chunks/InstanceNewView-CdCsxQIu.cjs +0 -2
- package/dist/chunks/InstanceNewView-CdCsxQIu.cjs.map +0 -1
- package/dist/chunks/LoginView-BED07v-7.cjs +0 -2
- package/dist/chunks/LoginView-BED07v-7.cjs.map +0 -1
- package/dist/chunks/LoginView-a1iu3cfc.js.map +0 -1
- package/dist/chunks/RootClientView-rXJt4TDd.cjs +0 -2
- package/dist/chunks/RootClientView-rXJt4TDd.cjs.map +0 -1
- package/dist/chunks/RootClientView-wAkXUEZw.js +0 -34
- package/dist/chunks/RootClientView-wAkXUEZw.js.map +0 -1
- package/dist/chunks/SearchView-CgXPssgE.cjs +0 -2
- package/dist/chunks/SearchView-CgXPssgE.cjs.map +0 -1
- package/dist/chunks/SearchView-WXMbZwRw.js +0 -19
- package/dist/chunks/SearchView-WXMbZwRw.js.map +0 -1
- package/dist/chunks/SentView-BTDoFBrG.cjs +0 -2
- package/dist/chunks/SentView-BTDoFBrG.cjs.map +0 -1
- package/dist/chunks/SentView-CdOL92Rq.js +0 -19
- package/dist/chunks/SentView-CdOL92Rq.js.map +0 -1
- package/dist/chunks/SettingsNotificationsView-B6F6fa7U.js.map +0 -1
- package/dist/chunks/SettingsNotificationsView-Bnz0CmoJ.cjs +0 -2
- package/dist/chunks/SettingsNotificationsView-Bnz0CmoJ.cjs.map +0 -1
- package/dist/chunks/TemplateCategoriesView-CgZciaSd.js.map +0 -1
- package/dist/chunks/TemplateCategoriesView-U0stGUBc.cjs +0 -2
- package/dist/chunks/TemplateCategoriesView-U0stGUBc.cjs.map +0 -1
- package/dist/chunks/TemplateDesignerView-A38DyYD4.cjs +0 -51
- package/dist/chunks/TemplateDesignerView-A38DyYD4.cjs.map +0 -1
- package/dist/chunks/TemplateDesignerView-Dffx-VZ-.js +0 -2272
- package/dist/chunks/TemplateDesignerView-Dffx-VZ-.js.map +0 -1
- package/dist/chunks/TemplateVersionsView-6sVQbBem.js +0 -110
- package/dist/chunks/TemplateVersionsView-6sVQbBem.js.map +0 -1
- package/dist/chunks/TemplateVersionsView-CMqw3ieU.cjs +0 -2
- package/dist/chunks/TemplateVersionsView-CMqw3ieU.cjs.map +0 -1
- package/dist/chunks/TemplatesView-BLj9f-XI.js.map +0 -1
- package/dist/chunks/TemplatesView-DIOQTUUl.cjs +0 -2
- package/dist/chunks/TemplatesView-DIOQTUUl.cjs.map +0 -1
- package/dist/chunks/app-navigation-DAC5gFbG.cjs +0 -2
- package/dist/chunks/approval-instance-list-page-DIAmwhvl.cjs +0 -2
- package/dist/chunks/auth-provider-D2P-qWmY.cjs +0 -2
- package/dist/chunks/auth-provider-D2P-qWmY.cjs.map +0 -1
- package/dist/chunks/auth-provider-TTO9eNZV.js +0 -83
- package/dist/chunks/auth-provider-TTO9eNZV.js.map +0 -1
- package/dist/chunks/dashboard-page-udYhnyMW.cjs +0 -2
- package/dist/chunks/router-adapter-BdHZXLS3.js +0 -23
- package/dist/chunks/router-adapter-BdHZXLS3.js.map +0 -1
- package/dist/chunks/router-adapter-BybHrCNP.cjs +0 -2
- package/dist/chunks/router-adapter-BybHrCNP.cjs.map +0 -1
- package/dist/chunks/templates.module-B5bg_goX.js +0 -8
- package/dist/chunks/templates.module-B5bg_goX.js.map +0 -1
- package/dist/chunks/templates.module-ClRnQQX4.cjs +0 -2
- package/dist/chunks/templates.module-ClRnQQX4.cjs.map +0 -1
- package/dist/pages/admin/delegations/AdminDelegationsClientView.cjs +0 -2
- package/dist/pages/admin/delegations/AdminDelegationsClientView.cjs.map +0 -1
- package/dist/pages/admin/delegations/AdminDelegationsClientView.d.ts +0 -3
- package/dist/pages/admin/delegations/AdminDelegationsClientView.js +0 -28
- package/dist/pages/admin/delegations/AdminDelegationsClientView.js.map +0 -1
- package/dist/pages/admin/orgs/AdminOrgsClientView.cjs +0 -2
- package/dist/pages/admin/orgs/AdminOrgsClientView.cjs.map +0 -1
- package/dist/pages/admin/orgs/AdminOrgsClientView.d.ts +0 -3
- package/dist/pages/admin/orgs/AdminOrgsClientView.js +0 -28
- package/dist/pages/admin/orgs/AdminOrgsClientView.js.map +0 -1
- package/dist/pages/admin/users/AdminUsersClientView.cjs +0 -2
- package/dist/pages/admin/users/AdminUsersClientView.cjs.map +0 -1
- package/dist/pages/admin/users/AdminUsersClientView.d.ts +0 -3
- package/dist/pages/admin/users/AdminUsersClientView.js +0 -28
- package/dist/pages/admin/users/AdminUsersClientView.js.map +0 -1
- package/dist/pages/cc/CcClientView.cjs +0 -2
- package/dist/pages/cc/CcClientView.cjs.map +0 -1
- package/dist/pages/cc/CcClientView.d.ts +0 -7
- package/dist/pages/cc/CcClientView.js +0 -28
- package/dist/pages/cc/CcClientView.js.map +0 -1
- package/dist/pages/dashboard/DashboardClientView.cjs +0 -2
- package/dist/pages/dashboard/DashboardClientView.cjs.map +0 -1
- package/dist/pages/dashboard/DashboardClientView.d.ts +0 -9
- package/dist/pages/dashboard/DashboardClientView.js +0 -28
- package/dist/pages/dashboard/DashboardClientView.js.map +0 -1
- package/dist/pages/delegations/DelegationsClientView.cjs +0 -2
- package/dist/pages/delegations/DelegationsClientView.cjs.map +0 -1
- package/dist/pages/delegations/DelegationsClientView.d.ts +0 -3
- package/dist/pages/delegations/DelegationsClientView.js +0 -28
- package/dist/pages/delegations/DelegationsClientView.js.map +0 -1
- package/dist/pages/forms/FormsClientView.cjs +0 -2
- package/dist/pages/forms/FormsClientView.cjs.map +0 -1
- package/dist/pages/forms/FormsClientView.d.ts +0 -10
- package/dist/pages/forms/FormsClientView.js +0 -28
- package/dist/pages/forms/FormsClientView.js.map +0 -1
- package/dist/pages/forms/builder/FormBuilderClientView.cjs +0 -2
- package/dist/pages/forms/builder/FormBuilderClientView.cjs.map +0 -1
- package/dist/pages/forms/builder/FormBuilderClientView.d.ts +0 -11
- package/dist/pages/forms/builder/FormBuilderClientView.js +0 -28
- package/dist/pages/forms/builder/FormBuilderClientView.js.map +0 -1
- package/dist/pages/inbox/InboxClientView.cjs +0 -2
- package/dist/pages/inbox/InboxClientView.cjs.map +0 -1
- package/dist/pages/inbox/InboxClientView.d.ts +0 -9
- package/dist/pages/inbox/InboxClientView.js +0 -28
- package/dist/pages/inbox/InboxClientView.js.map +0 -1
- package/dist/pages/instances/detail/InstanceDetailClientView.cjs +0 -2
- package/dist/pages/instances/detail/InstanceDetailClientView.cjs.map +0 -1
- package/dist/pages/instances/detail/InstanceDetailClientView.d.ts +0 -9
- package/dist/pages/instances/detail/InstanceDetailClientView.js +0 -28
- package/dist/pages/instances/detail/InstanceDetailClientView.js.map +0 -1
- package/dist/pages/instances/new/InstanceNewClientView.cjs +0 -2
- package/dist/pages/instances/new/InstanceNewClientView.cjs.map +0 -1
- package/dist/pages/instances/new/InstanceNewClientView.d.ts +0 -8
- package/dist/pages/instances/new/InstanceNewClientView.js +0 -28
- package/dist/pages/instances/new/InstanceNewClientView.js.map +0 -1
- package/dist/pages/login/LoginClientView.cjs +0 -2
- package/dist/pages/login/LoginClientView.cjs.map +0 -1
- package/dist/pages/login/LoginClientView.d.ts +0 -11
- package/dist/pages/login/LoginClientView.js +0 -29
- package/dist/pages/login/LoginClientView.js.map +0 -1
- package/dist/pages/root/RootClientView.cjs +0 -1
- package/dist/pages/root/RootClientView.d.ts +0 -8
- package/dist/pages/root/RootClientView.js +0 -2
- package/dist/pages/search/SearchClientView.cjs +0 -2
- package/dist/pages/search/SearchClientView.cjs.map +0 -1
- package/dist/pages/search/SearchClientView.d.ts +0 -7
- package/dist/pages/search/SearchClientView.js +0 -28
- package/dist/pages/search/SearchClientView.js.map +0 -1
- package/dist/pages/sent/SentClientView.cjs +0 -2
- package/dist/pages/sent/SentClientView.cjs.map +0 -1
- package/dist/pages/sent/SentClientView.d.ts +0 -7
- package/dist/pages/sent/SentClientView.js +0 -28
- package/dist/pages/sent/SentClientView.js.map +0 -1
- package/dist/pages/settings/notifications/SettingsNotificationsClientView.cjs +0 -2
- package/dist/pages/settings/notifications/SettingsNotificationsClientView.cjs.map +0 -1
- package/dist/pages/settings/notifications/SettingsNotificationsClientView.d.ts +0 -3
- package/dist/pages/settings/notifications/SettingsNotificationsClientView.js +0 -28
- package/dist/pages/settings/notifications/SettingsNotificationsClientView.js.map +0 -1
- package/dist/pages/templates/TemplatesClientView.cjs +0 -2
- package/dist/pages/templates/TemplatesClientView.cjs.map +0 -1
- package/dist/pages/templates/TemplatesClientView.d.ts +0 -3
- package/dist/pages/templates/TemplatesClientView.js +0 -28
- package/dist/pages/templates/TemplatesClientView.js.map +0 -1
- package/dist/pages/templates/categories/TemplateCategoriesClientView.cjs +0 -2
- package/dist/pages/templates/categories/TemplateCategoriesClientView.cjs.map +0 -1
- package/dist/pages/templates/categories/TemplateCategoriesClientView.d.ts +0 -3
- package/dist/pages/templates/categories/TemplateCategoriesClientView.js +0 -28
- package/dist/pages/templates/categories/TemplateCategoriesClientView.js.map +0 -1
- package/dist/pages/templates/designer/TemplateDesignerClientView.cjs +0 -2
- package/dist/pages/templates/designer/TemplateDesignerClientView.cjs.map +0 -1
- package/dist/pages/templates/designer/TemplateDesignerClientView.d.ts +0 -3
- package/dist/pages/templates/designer/TemplateDesignerClientView.js +0 -28
- package/dist/pages/templates/designer/TemplateDesignerClientView.js.map +0 -1
- package/dist/pages/templates/versions/TemplateVersionsClientView.cjs +0 -2
- package/dist/pages/templates/versions/TemplateVersionsClientView.cjs.map +0 -1
- package/dist/pages/templates/versions/TemplateVersionsClientView.d.ts +0 -3
- package/dist/pages/templates/versions/TemplateVersionsClientView.js +0 -28
- package/dist/pages/templates/versions/TemplateVersionsClientView.js.map +0 -1
- /package/dist/{templates.css → categories.css} +0 -0
- /package/dist/{AdminDelegationsView.css → delegations.css} +0 -0
- /package/dist/{DelegationsView.css → delegations2.css} +0 -0
- /package/dist/{InstanceDetailView.css → detail.css} +0 -0
- /package/dist/{LoginView.css → login.css} +0 -0
- /package/dist/{SettingsNotificationsView.css → notifications.css} +0 -0
- /package/dist/{AdminOrgsView.css → orgs.css} +0 -0
- /package/dist/{AdminUsersView.css → users.css} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InstanceDetailView-C-A-LOCG.js","names":[],"sources":["../../src/components/pdf-preview.module.scss","../../src/components/pdf-preview.tsx","../../src/views/instances/detail/InstanceDetailView.tsx"],"sourcesContent":[".root {\n display: grid;\n gap: 12px;\n width: min(86vw, 1080px);\n}\n\n.toolbar {\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n justify-content: space-between;\n}\n\n.pageControls,\n.zoomControls {\n align-items: center;\n display: flex;\n gap: 8px;\n}\n\n.counter {\n min-width: 92px;\n text-align: center;\n white-space: nowrap;\n}\n\n.viewport {\n align-items: flex-start;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n display: flex;\n height: min(72vh, 760px);\n justify-content: center;\n min-height: 420px;\n overflow: auto;\n padding: 16px;\n}\n\n.page {\n background: #ffffff;\n box-shadow: 0 12px 32px rgb(15 23 42 / 14%);\n color: #111827;\n}\n\n.state {\n align-items: center;\n display: flex;\n justify-content: center;\n min-height: 320px;\n width: 100%;\n}\n\n@media (max-width: 720px) {\n .root {\n width: 92vw;\n }\n\n .toolbar {\n align-items: stretch;\n display: grid;\n }\n\n .pageControls,\n .zoomControls {\n justify-content: space-between;\n }\n\n .counter {\n min-width: 84px;\n }\n\n .viewport {\n height: 68vh;\n min-height: 360px;\n padding: 12px;\n }\n}\n","'use client';\n\nimport {\n ReactElement,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { Button, Typography } from '@mezzanine-ui/react';\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n DownloadIcon,\n ZoomInIcon,\n ZoomOutIcon,\n} from '@mezzanine-ui/icons';\nimport { Document, Page, pdfjs } from 'react-pdf';\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport styles from './pdf-preview.module.scss';\n\n// pdfjs ships its worker as a separate chunk. Consumers should call\n// `configurePdfWorker(url)` (or set `pdfjs.GlobalWorkerOptions.workerSrc`\n// directly) before the first `<PDFPreview>` mounts. The library does not\n// hard-bundle a worker path because consumer bundlers may need to resolve\n// it through CDN, public/ asset pipeline, or pinned version.\nexport function configurePdfWorker(workerSrc: string): void {\n pdfjs.GlobalWorkerOptions.workerSrc = workerSrc;\n}\n\nconst DEFAULT_VIEWPORT_WIDTH = 760;\nconst MAX_PAGE_WIDTH = 920;\nconst MIN_PAGE_WIDTH = 320;\nconst PAGE_HORIZONTAL_PADDING = 32;\nconst MIN_SCALE = 0.75;\nconst MAX_SCALE = 1.75;\nconst SCALE_STEP = 0.25;\n\nexport interface PDFPreviewProps {\n readonly filename: string;\n readonly fileUrl: string;\n readonly onDownload?: () => void;\n}\n\n/**\n * Mezzanine-styled PDF preview powered by `react-pdf`. Used by the instance\n * detail view to preview PDF attachments inline.\n */\nexport function PDFPreview({\n filename,\n fileUrl,\n onDownload,\n}: PDFPreviewProps): ReactElement {\n const viewportRef = useRef<HTMLDivElement | null>(null);\n const [numPages, setNumPages] = useState<number | null>(null);\n const [pageNumber, setPageNumber] = useState(1);\n const [scale, setScale] = useState(1);\n const [viewportWidth, setViewportWidth] = useState(DEFAULT_VIEWPORT_WIDTH);\n\n useEffect((): (() => void) | undefined => {\n const viewport = viewportRef.current;\n\n if (!viewport || typeof ResizeObserver === 'undefined') {\n return undefined;\n }\n\n const observer = new ResizeObserver((entries): void => {\n const nextWidth = entries[0]?.contentRect.width;\n\n if (nextWidth) {\n setViewportWidth(nextWidth);\n }\n });\n\n observer.observe(viewport);\n\n return (): void => observer.disconnect();\n }, []);\n\n useEffect((): void => {\n setNumPages(null);\n setPageNumber(1);\n setScale(1);\n }, [fileUrl]);\n\n const pageWidth = useMemo((): number => {\n const availableWidth = Math.max(\n MIN_PAGE_WIDTH,\n viewportWidth - PAGE_HORIZONTAL_PADDING,\n );\n const baseWidth = Math.min(MAX_PAGE_WIDTH, availableWidth);\n\n return Math.round(baseWidth * scale);\n }, [scale, viewportWidth]);\n\n const loadDocument = useCallback((document: PDFDocumentProxy): void => {\n setNumPages(document.numPages);\n setPageNumber(1);\n }, []);\n\n const hasPreviousPage = pageNumber > 1;\n const hasNextPage = numPages !== null && pageNumber < numPages;\n const canZoomOut = scale > MIN_SCALE;\n const canZoomIn = scale < MAX_SCALE;\n const pageLabel =\n numPages === null\n ? `第 ${pageNumber} 頁`\n : `第 ${pageNumber} / ${numPages} 頁`;\n const zoomLabel = `${Math.round(scale * 100)}%`;\n\n return (\n <section aria-label={`${filename} PDF 預覽`} className={styles.root}>\n <div className={styles.toolbar}>\n <div className={styles.pageControls} aria-label=\"頁面切換\">\n <Button\n aria-label=\"上一頁\"\n disabled={!hasPreviousPage}\n icon={ChevronLeftIcon}\n onClick={(): void => {\n setPageNumber((currentPageNumber) =>\n Math.max(1, currentPageNumber - 1),\n );\n }}\n size=\"minor\"\n variant=\"base-secondary\"\n />\n <Typography\n className={styles.counter}\n component=\"span\"\n variant=\"body\"\n >\n {pageLabel}\n </Typography>\n <Button\n aria-label=\"下一頁\"\n disabled={!hasNextPage}\n icon={ChevronRightIcon}\n onClick={(): void => {\n setPageNumber((currentPageNumber) =>\n numPages === null\n ? currentPageNumber\n : Math.min(numPages, currentPageNumber + 1),\n );\n }}\n size=\"minor\"\n variant=\"base-secondary\"\n />\n </div>\n <div className={styles.zoomControls} aria-label=\"縮放\">\n <Button\n aria-label=\"縮小\"\n disabled={!canZoomOut}\n icon={ZoomOutIcon}\n onClick={(): void => {\n setScale((currentScale) =>\n Math.max(MIN_SCALE, currentScale - SCALE_STEP),\n );\n }}\n size=\"minor\"\n variant=\"base-secondary\"\n />\n <Typography\n className={styles.counter}\n component=\"span\"\n variant=\"body\"\n >\n {zoomLabel}\n </Typography>\n <Button\n aria-label=\"放大\"\n disabled={!canZoomIn}\n icon={ZoomInIcon}\n onClick={(): void => {\n setScale((currentScale) =>\n Math.min(MAX_SCALE, currentScale + SCALE_STEP),\n );\n }}\n size=\"minor\"\n variant=\"base-secondary\"\n />\n </div>\n {onDownload ? (\n <Button\n icon={DownloadIcon}\n iconType=\"leading\"\n onClick={onDownload}\n size=\"minor\"\n variant=\"base-primary\"\n >\n 下載\n </Button>\n ) : null}\n </div>\n <div className={styles.viewport} ref={viewportRef}>\n <Document\n error={<PDFPreviewState message=\"PDF 無法載入。\" />}\n file={fileUrl}\n loading={<PDFPreviewState message=\"正在載入 PDF...\" />}\n noData={<PDFPreviewState message=\"沒有可預覽的 PDF。\" />}\n onLoadSuccess={loadDocument}\n >\n <Page\n className={styles.page}\n loading={<PDFPreviewState message=\"正在載入頁面...\" />}\n pageNumber={pageNumber}\n renderAnnotationLayer\n renderTextLayer\n width={pageWidth}\n />\n </Document>\n </div>\n </section>\n );\n}\n\nfunction PDFPreviewState({\n message,\n}: {\n readonly message: string;\n}): ReactElement {\n return (\n <div className={styles.state}>\n <Typography color=\"text-neutral\" variant=\"body\">\n {message}\n </Typography>\n </div>\n );\n}\n","'use client';\n\nimport {\n ChangeEvent,\n CSSProperties,\n Fragment,\n RefCallback,\n ReactElement,\n forwardRef,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n Background,\n Controls,\n Handle,\n Position,\n ReactFlow,\n type Edge as FlowEdge,\n type Node as FlowNode,\n type NodeProps,\n} from '@xyflow/react';\nimport * as dagre from 'dagre';\nimport {\n AutoComplete,\n Button,\n Layout,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Select,\n Stepper,\n Table,\n Textarea,\n Tooltip,\n Typography,\n type StepProps,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { stepClasses } from '@mezzanine-ui/core/stepper';\nimport {\n CheckedIcon,\n DangerousOutlineIcon,\n DownloadIcon,\n FileSearchIcon,\n RefreshCcwIcon,\n ShareIcon,\n UserIcon,\n} from '@mezzanine-ui/icons';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { FormFieldDefinition } from '@rytass/bpm-core-shared/form';\nimport {\n WorkflowDefinition,\n WorkflowNode,\n} from '@rytass/bpm-core-shared/workflow';\nimport {\n focusFormRendererField,\n validateFormRendererValues,\n} from '@rytass/bpm-core-client/form';\nimport {\n ActivityLogRecord,\n AttachmentRecord,\n ApprovalInstanceRecord,\n MemberProfileRecord,\n SignatureRecord,\n SignatureVerificationRecord,\n cancelApprovalInstance,\n decideTask,\n listAttachments,\n listTaskDecisions,\n readApprovalInstance,\n readAttachmentDownloadUrl,\n readAttachmentPreviewUrl,\n readInstanceSignatures,\n resubmitApprovalInstance,\n resolveMemberProfiles,\n searchMembers,\n TaskDecisionRecord,\n TaskRecord,\n WorkflowFormData,\n WorkflowTokenRecord,\n uploadAttachment,\n} from '@rytass/bpm-core-client/workflow';\nimport { BPMFormField } from '../../../components/bpm-form-field';\nimport { formatDateTime } from '../../../lib/format-date-time';\nimport { useAuth } from '../../../lib/auth-provider';\nimport { AppNavigation } from '../../../components/app-navigation';\nimport { FormRenderer } from '../../forms/renderer/FormRendererView';\nimport { PDFPreview } from '../../../components/pdf-preview';\n\nconst SECTION_BODY_STYLE: CSSProperties = {\n display: 'grid',\n gap: 16,\n};\n\nconst BUTTON_ROW_STYLE: CSSProperties = {\n display: 'flex',\n flexWrap: 'wrap',\n gap: 8,\n};\n\nconst FLOW_NODE_LAYOUT_WIDTH = 184;\nconst FLOW_NODE_LAYOUT_HEIGHT = 96;\n\nconst FLOW_MODAL_BODY_STYLE: CSSProperties = {\n display: 'grid',\n gap: 16,\n};\n\nconst REJECT_REASON_FORM_STYLE: CSSProperties = {\n display: 'grid',\n gap: 12,\n width: '100%',\n};\n\nconst REJECT_REASON_TEXTAREA_STYLE: CSSProperties = {\n minWidth: '100%',\n width: '100%',\n};\n\nconst MODAL_FORM_STYLE: CSSProperties = {\n display: 'grid',\n gap: 12,\n width: '100%',\n};\n\nconst FLOW_CANVAS_STYLE: CSSProperties = {\n background: '#f8fafc',\n border: '1px solid #e2e8f0',\n borderRadius: 8,\n height: 'min(64vh, 620px)',\n minHeight: 440,\n overflow: 'hidden',\n width: 'min(80vw, 1040px)',\n};\n\nconst NODE_STYLE: CSSProperties = {\n background: '#ffffff',\n border: '1px solid #cbd5e1',\n borderRadius: 8,\n boxShadow: '0 8px 18px rgba(15, 23, 42, 0.08)',\n display: 'grid',\n gap: 6,\n minHeight: 82,\n padding: 12,\n width: 184,\n};\n\nconst NODE_STATUS_STYLE: CSSProperties = {\n borderRadius: 999,\n fontSize: 12,\n fontWeight: 600,\n justifySelf: 'start',\n lineHeight: '18px',\n padding: '0 8px',\n};\n\nconst NODE_SECONDARY_STYLE: CSSProperties = {\n color: '#64748b',\n fontSize: 12,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n};\n\nconst NODE_HANDLE_STYLE: CSSProperties = {\n opacity: 0,\n};\n\nconst EDGE_SUMMARY_STYLE: CSSProperties = {\n display: 'flex',\n flexWrap: 'wrap',\n gap: 8,\n};\n\nconst EDGE_SUMMARY_ITEM_STYLE: CSSProperties = {\n alignItems: 'center',\n background: '#ffffff',\n border: '1px solid #cbd5e1',\n borderRadius: 8,\n color: '#334155',\n display: 'inline-flex',\n fontSize: 12,\n fontWeight: 600,\n gap: 6,\n lineHeight: '20px',\n padding: '4px 8px',\n};\n\nconst HISTORY_MEMBER_NAME_STYLE: CSSProperties = {\n cursor: 'help',\n textDecoration: 'underline dotted',\n textUnderlineOffset: 3,\n};\n\nconst HISTORY_DANGER_TEXT_STYLE: CSSProperties = {\n color: 'var(--mzn-color-text-error)',\n};\n\nfunction applyFullWidthTextareaHost(element: HTMLDivElement | null): void {\n if (!element) {\n return;\n }\n\n element.style.width = '100%';\n}\n\nconst READONLY_FLOW_NODE_TYPES = {\n workflowRuntime: WorkflowRuntimeNodeCard,\n};\n\ntype RuntimeTone =\n | 'cancelled'\n | 'completed'\n | 'current'\n | 'neutral'\n | 'waiting';\n\ninterface RuntimeNodeData extends Record<string, unknown> {\n readonly kindLabel: string;\n readonly label: string;\n readonly secondaryLabel: string;\n readonly statusLabel: string;\n readonly tone: RuntimeTone;\n}\n\ntype RuntimeFlowNode = FlowNode<RuntimeNodeData, 'workflowRuntime'>;\ntype RuntimeFlowEdge = FlowEdge<\n Readonly<Record<string, unknown>>,\n 'smoothstep'\n>;\n\ntype TaskRow = Readonly<\n Record<string, unknown> &\n TaskRecord & {\n assigneeLabel: string;\n key: string;\n nodeLabel: string;\n statusLabel: string;\n }\n>;\n\ntype AttachmentRow = Readonly<\n Record<string, unknown> & {\n attachment: AttachmentRecord;\n createdAt: string;\n filename: string;\n id: string;\n key: string;\n mimeType: string;\n sizeLabel: string;\n }\n>;\n\ntype SignatureRow = Readonly<\n Record<string, unknown> & {\n algorithm: string;\n hashLabel: string;\n key: string;\n keyVersion: number;\n signedAtLabel: string;\n signerMemberId: string;\n }\n>;\n\ntype MemberOption = Readonly<{\n email: string | null;\n id: string;\n name: string;\n}>;\n\ninterface ActivityStepRecord {\n readonly descriptionParts: readonly ActivityStepDescriptionPart[];\n readonly error: boolean;\n readonly forcePending?: boolean;\n readonly id: string;\n readonly title: string;\n}\n\ntype ActivityStepDescriptionPart =\n | Readonly<{ text: string; type: 'text' }>\n | Readonly<{ text: string; type: 'dangerText' }>\n | Readonly<{\n email: string | null;\n label: string;\n memberId: string | null;\n prefix: string;\n type: 'member';\n }>;\n\nexport interface InstanceDetailViewProps {\n /** Approval instance id (Next.js `params.id` resolved by the page shim). */\n readonly instanceId: string;\n}\n\n/**\n * Framework-agnostic view for the BPM approval instance detail page.\n * Mechanical port of `apps/client/src/app/instances/[id]/page.tsx`. The\n * `instanceId` is provided by the host page wrapper (typically resolved\n * from `params.id` in the Next.js Server Component shim).\n */\nexport function InstanceDetailView({\n instanceId,\n}: InstanceDetailViewProps): ReactElement {\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [activityLogs, setActivityLogs] = useState<\n readonly ActivityLogRecord[]\n >([]);\n const [instance, setInstance] = useState<ApprovalInstanceRecord | null>(null);\n const [taskDecisions, setTaskDecisions] = useState<\n readonly TaskDecisionRecord[]\n >([]);\n const [attachments, setAttachments] = useState<readonly AttachmentRecord[]>(\n [],\n );\n const [signatures, setSignatures] = useState<readonly SignatureRecord[]>([]);\n const [signatureVerification, setSignatureVerification] =\n useState<SignatureVerificationRecord | null>(null);\n const [tasks, setTasks] = useState<readonly TaskRecord[]>([]);\n const [workflowTokens, setWorkflowTokens] = useState<\n readonly WorkflowTokenRecord[]\n >([]);\n const [memberProfiles, setMemberProfiles] = useState<\n readonly MemberProfileRecord[]\n >([]);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [deciding, setDeciding] = useState(false);\n const [workflowModalOpen, setWorkflowModalOpen] = useState(false);\n const [cancelComment, setCancelComment] = useState('');\n const [cancelModalOpen, setCancelModalOpen] = useState(false);\n const [rejectReason, setRejectReason] = useState('');\n const [rejectReasonError, setRejectReasonError] = useState<string | null>(\n null,\n );\n const [rejectReasonModalOpen, setRejectReasonModalOpen] = useState(false);\n const [returnComment, setReturnComment] = useState('');\n const [returnModalOpen, setReturnModalOpen] = useState(false);\n const [returnTargetNodeId, setReturnTargetNodeId] = useState<string | null>(\n null,\n );\n const [transferComment, setTransferComment] = useState('');\n const [transferMember, setTransferMember] = useState<MemberOption | null>(\n null,\n );\n const [transferMemberLoading, setTransferMemberLoading] = useState(false);\n const [transferMemberOptions, setTransferMemberOptions] = useState<\n readonly MemberOption[]\n >([]);\n const [transferModalOpen, setTransferModalOpen] = useState(false);\n const [resubmitFormErrors, setResubmitFormErrors] = useState<\n Readonly<Record<string, string>>\n >({});\n const [resubmitFormData, setResubmitFormData] = useState<WorkflowFormData>(\n {},\n );\n const [previewAttachment, setPreviewAttachment] =\n useState<AttachmentRecord | null>(null);\n const [previewUrl, setPreviewUrl] = useState<string | null>(null);\n const trimmedRejectReason = rejectReason.trim();\n const trimmedCancelComment = cancelComment.trim();\n const trimmedReturnComment = returnComment.trim();\n const trimmedTransferComment = transferComment.trim();\n\n useEffect((): void => {\n void refreshInstance();\n }, [currentMemberId, instanceId]);\n\n useEffect((): void => {\n setResubmitFormData(instance?.formData ?? {});\n }, [instance]);\n\n const currentTask = useMemo(\n (): TaskRecord | null =>\n tasks.find(\n (task) =>\n canMemberActOnTask(task, currentMemberId) &&\n (task.status === 'PENDING' || task.status === 'IN_PROGRESS'),\n ) ?? null,\n [currentMemberId, tasks],\n );\n const currentTaskNode = useMemo(\n (): WorkflowNode | null =>\n currentTask && instance\n ? (instance.workflowSnapshot.nodes.find(\n (node) => node.id === currentTask.nodeId,\n ) ?? null)\n : null,\n [currentTask, instance],\n );\n const returnTargetOptions = useMemo(\n (): readonly { readonly id: string; readonly name: string }[] =>\n currentTaskNode && instance\n ? readReturnTargetOptions(instance.workflowSnapshot, currentTaskNode)\n : [],\n [currentTaskNode, instance],\n );\n const canReturnCurrentTask =\n currentTaskNode?.type === 'userTask' &&\n currentTaskNode.data.returnBehavior.allowReturn;\n const selectedReturnTargetOption =\n returnTargetOptions.find((option) => option.id === returnTargetNodeId) ??\n returnTargetOptions[0] ??\n null;\n const canCancelInstance = Boolean(\n instance &&\n instance.initiatorMemberId === currentMemberId &&\n (instance.state === 'RUNNING' || instance.state === 'RETURNED'),\n );\n const canResubmitInstance = Boolean(\n instance &&\n instance.initiatorMemberId === currentMemberId &&\n instance.state === 'RETURNED',\n );\n const memberProfilesById = useMemo(\n (): ReadonlyMap<string, MemberProfileRecord> =>\n new Map(memberProfiles.map((profile) => [profile.memberId, profile])),\n [memberProfiles],\n );\n const taskRows = useMemo(\n (): TaskRow[] =>\n tasks.map((task) => ({\n ...task,\n assigneeLabel: readTaskAssigneeLabel(task, memberProfilesById),\n key: task.id,\n nodeLabel: readNodeDisplayLabel(\n task.nodeId,\n instance?.workflowSnapshot ?? null,\n ),\n statusLabel: readTaskStatusLabel(task.status),\n })),\n [instance, memberProfilesById, tasks],\n );\n const taskDecisionsByTaskId = useMemo(\n (): ReadonlyMap<string, TaskDecisionRecord> =>\n readLatestTaskDecisionsByTaskId(taskDecisions),\n [taskDecisions],\n );\n const signaturesById = useMemo(\n (): ReadonlyMap<string, SignatureRecord> =>\n new Map(signatures.map((signature) => [signature.id, signature])),\n [signatures],\n );\n const activitySteps = useMemo(\n (): ActivityStepRecord[] =>\n readActivityStepRecords(\n activityLogs,\n tasks,\n workflowTokens,\n instance?.workflowSnapshot ?? null,\n instance?.state ?? 'RUNNING',\n memberProfilesById,\n taskDecisionsByTaskId,\n signaturesById,\n signatureVerification,\n ),\n [\n activityLogs,\n instance,\n memberProfilesById,\n signatureVerification,\n signaturesById,\n taskDecisionsByTaskId,\n tasks,\n workflowTokens,\n ],\n );\n const currentActivityStep = useMemo(\n (): number => readCurrentActivityStep(activitySteps),\n [activitySteps],\n );\n const layoutedWorkflowSnapshot = useMemo(\n (): WorkflowDefinition | null =>\n instance\n ? layoutRuntimeWorkflowDefinition(instance.workflowSnapshot)\n : null,\n [instance],\n );\n const flowNodes = useMemo(\n (): RuntimeFlowNode[] =>\n instance && layoutedWorkflowSnapshot\n ? readRuntimeFlowNodes(\n layoutedWorkflowSnapshot,\n tasks,\n workflowTokens,\n instance.state,\n )\n : [],\n [instance, layoutedWorkflowSnapshot, tasks, workflowTokens],\n );\n const flowEdges = useMemo(\n (): RuntimeFlowEdge[] =>\n layoutedWorkflowSnapshot\n ? readRuntimeFlowEdges(layoutedWorkflowSnapshot)\n : [],\n [layoutedWorkflowSnapshot],\n );\n const edgeSummaries = useMemo(\n (): readonly string[] =>\n instance ? readEdgeSummaries(instance.workflowSnapshot) : [],\n [instance],\n );\n const taskColumns = useMemo(\n (): TableColumn<TaskRow>[] => [\n { dataIndex: 'nodeLabel', key: 'nodeLabel', title: '節點', width: 180 },\n {\n key: 'assigneeMemberId',\n title: '處理者',\n render: (record: TaskRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {record.assigneeLabel}\n </Typography>\n ),\n width: 180,\n },\n {\n dataIndex: 'statusLabel',\n key: 'statusLabel',\n title: '狀態',\n width: 120,\n },\n {\n key: 'createdAt',\n render: (record: TaskRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(record.createdAt)}\n </Typography>\n ),\n title: '建立時間',\n width: 220,\n },\n ],\n [],\n );\n const attachmentRows = useMemo(\n (): AttachmentRow[] =>\n attachments.map((attachment) => ({\n attachment,\n createdAt: attachment.createdAt,\n filename: attachment.filename,\n id: attachment.id,\n key: attachment.id,\n mimeType: attachment.mimeType,\n sizeLabel: formatFileSize(Number(attachment.sizeBytes)),\n })),\n [attachments],\n );\n const attachmentColumns = useMemo(\n (): TableColumn<AttachmentRow>[] => [\n { dataIndex: 'filename', key: 'filename', title: '檔名', width: 260 },\n { dataIndex: 'mimeType', key: 'mimeType', title: '類型', width: 180 },\n { dataIndex: 'sizeLabel', key: 'sizeLabel', title: '大小', width: 120 },\n {\n key: 'createdAt',\n render: (record: AttachmentRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(record.createdAt)}\n </Typography>\n ),\n title: '上傳時間',\n width: 220,\n },\n ],\n [],\n );\n const attachmentActions = useMemo(\n (): TableActions<AttachmentRow> => ({\n render: (record): ReturnType<TableActions<AttachmentRow>['render']> => [\n ...(record.mimeType === 'application/pdf'\n ? [\n {\n icon: FileSearchIcon,\n iconType: 'leading' as const,\n name: '預覽',\n onClick: (): void => {\n void handlePreviewAttachment(record.attachment);\n },\n },\n ]\n : []),\n {\n icon: DownloadIcon,\n iconType: 'leading',\n name: '下載',\n onClick: (): void => {\n void handleDownloadAttachment(record.attachment);\n },\n },\n ],\n variant: 'base-secondary',\n width: 160,\n }),\n [],\n );\n const signatureRows = useMemo(\n (): SignatureRow[] =>\n signatures.map((signature) => ({\n algorithm: signature.algorithm,\n hashLabel: readShortHash(signature.signedPayloadHash),\n key: signature.id,\n keyVersion: signature.keyVersion,\n signedAtLabel: formatDateTime(signature.signedAt),\n signerMemberId: signature.signerMemberId,\n })),\n [signatures],\n );\n const signatureColumns = useMemo(\n (): TableColumn<SignatureRow>[] => [\n {\n dataIndex: 'signerMemberId',\n key: 'signerMemberId',\n title: '簽章者',\n width: 160,\n },\n { dataIndex: 'algorithm', key: 'algorithm', title: '演算法', width: 150 },\n {\n dataIndex: 'keyVersion',\n key: 'keyVersion',\n title: 'Key 版本',\n width: 100,\n },\n {\n dataIndex: 'hashLabel',\n key: 'hashLabel',\n title: 'Payload Hash',\n width: 180,\n },\n {\n dataIndex: 'signedAtLabel',\n key: 'signedAtLabel',\n title: '簽章時間',\n width: 220,\n },\n ],\n [],\n );\n\n async function refreshInstance(): Promise<void> {\n setLoading(true);\n setError(null);\n\n try {\n const nextRecord = await readApprovalInstance(instanceId);\n setActivityLogs(nextRecord.activityLogs);\n setInstance(nextRecord.instance);\n setTasks(nextRecord.tasks);\n setWorkflowTokens(nextRecord.workflowTokens);\n const [\n nextTaskDecisions,\n nextMemberProfiles,\n nextAttachments,\n nextSignatures,\n ] = await Promise.all([\n readTaskDecisionsForTasks(nextRecord.tasks),\n readMemberProfilesForTimeline(nextRecord),\n listAttachments(nextRecord.instance.id),\n readInstanceSignatures(nextRecord.instance.id),\n ]);\n setTaskDecisions(nextTaskDecisions);\n setMemberProfiles(nextMemberProfiles);\n setAttachments(nextAttachments);\n setSignatures(nextSignatures.signatures);\n setSignatureVerification(nextSignatures.verification);\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }\n\n async function handleUploadAttachment(\n field: FormFieldDefinition,\n file: File,\n ): Promise<{ readonly id: string }> {\n if (!currentMemberId) {\n throw new Error('尚未登入,無法上傳附件');\n }\n\n const attachment = await uploadAttachment({\n file,\n formFieldPath: `form.${field.fieldKey}`,\n });\n\n return { id: attachment.id };\n }\n\n async function handleDownloadAttachment(\n attachment: AttachmentRecord,\n ): Promise<void> {\n if (!currentMemberId) {\n return;\n }\n\n const url = await readAttachmentDownloadUrl({\n id: attachment.id,\n });\n\n window.open(url, '_blank', 'noopener,noreferrer');\n }\n\n async function handlePreviewAttachment(\n attachment: AttachmentRecord,\n ): Promise<void> {\n if (!currentMemberId) {\n return;\n }\n\n const url = await readAttachmentPreviewUrl({\n id: attachment.id,\n });\n\n setPreviewAttachment(attachment);\n setPreviewUrl(url);\n }\n\n async function handleDecision({\n action,\n comment,\n returnToNodeId = null,\n transferToMemberId = null,\n }: Readonly<{\n action: 'APPROVED' | 'REJECTED' | 'RETURNED' | 'TRANSFERRED';\n comment: string | null;\n returnToNodeId?: string | null;\n transferToMemberId?: string | null;\n }>): Promise<void> {\n if (!currentMemberId || !currentTask) {\n return;\n }\n\n setDeciding(true);\n setError(null);\n\n try {\n await decideTask({\n action,\n comment,\n decidedByMemberId: currentMemberId,\n returnToNodeId,\n taskId: currentTask.id,\n transferToMemberId,\n });\n setRejectReasonModalOpen(false);\n setReturnModalOpen(false);\n setTransferModalOpen(false);\n setRejectReason('');\n setReturnComment('');\n setTransferComment('');\n setTransferMember(null);\n setReturnTargetNodeId(null);\n setRejectReasonError(null);\n await refreshInstance();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setDeciding(false);\n }\n }\n\n function openRejectReasonModal(): void {\n setRejectReason('');\n setRejectReasonError(null);\n setRejectReasonModalOpen(true);\n }\n\n function closeRejectReasonModal(): void {\n if (deciding) {\n return;\n }\n\n setRejectReasonModalOpen(false);\n setRejectReason('');\n setRejectReasonError(null);\n }\n\n function openReturnModal(): void {\n setReturnComment('');\n setReturnTargetNodeId(returnTargetOptions[0]?.id ?? null);\n setReturnModalOpen(true);\n }\n\n function closeReturnModal(): void {\n if (deciding) {\n return;\n }\n\n setReturnModalOpen(false);\n setReturnComment('');\n setReturnTargetNodeId(null);\n }\n\n function openTransferModal(): void {\n setTransferComment('');\n setTransferMember(null);\n setTransferModalOpen(true);\n void handleSearchTransferMembers('');\n }\n\n function closeTransferModal(): void {\n if (deciding) {\n return;\n }\n\n setTransferModalOpen(false);\n setTransferComment('');\n setTransferMember(null);\n }\n\n async function handleSearchTransferMembers(\n searchText: string,\n ): Promise<void> {\n setTransferMemberLoading(true);\n\n try {\n setTransferMemberOptions(\n (await searchMembers(searchText))\n .filter((searchedMember) => searchedMember.memberId !== currentMemberId)\n .map(readMemberOption),\n );\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setTransferMemberLoading(false);\n }\n }\n\n async function handleRejectConfirm(): Promise<void> {\n if (!trimmedRejectReason) {\n setRejectReasonError('請輸入拒絕原因');\n return;\n }\n\n await handleDecision({\n action: 'REJECTED',\n comment: trimmedRejectReason,\n });\n }\n\n async function handleTransferConfirm(): Promise<void> {\n if (!transferMember) {\n setError('請選擇轉派對象');\n return;\n }\n\n await handleDecision({\n action: 'TRANSFERRED',\n comment: trimmedTransferComment || null,\n transferToMemberId: transferMember.id,\n });\n }\n\n async function handleReturnConfirm(): Promise<void> {\n await handleDecision({\n action: 'RETURNED',\n comment: trimmedReturnComment || null,\n returnToNodeId: selectedReturnTargetOption?.id ?? null,\n });\n }\n\n async function handleCancelInstance(): Promise<void> {\n if (!currentMemberId || !instance || !canCancelInstance) {\n return;\n }\n\n setDeciding(true);\n setError(null);\n setResubmitFormErrors({});\n\n if (\n instance.formDefinitionSnapshot.schema &&\n instance.formDefinitionSnapshot.uiSchema\n ) {\n const validation = validateFormRendererValues({\n schema: instance.formDefinitionSnapshot.schema,\n uiSchema: instance.formDefinitionSnapshot.uiSchema,\n values: resubmitFormData,\n });\n\n if (!validation.valid) {\n setResubmitFormErrors(validation.errors);\n setError('請先補齊必填欄位。');\n\n if (validation.firstInvalidFieldKey) {\n focusFormRendererField(validation.firstInvalidFieldKey);\n }\n\n setDeciding(false);\n\n return;\n }\n }\n\n try {\n await cancelApprovalInstance({\n cancelledByMemberId: currentMemberId,\n comment: trimmedCancelComment || null,\n instanceId: instance.id,\n });\n setCancelComment('');\n setCancelModalOpen(false);\n await refreshInstance();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setDeciding(false);\n }\n }\n\n async function handleResubmitInstance(): Promise<void> {\n if (!currentMemberId || !instance || !canResubmitInstance) {\n return;\n }\n\n setDeciding(true);\n setError(null);\n\n try {\n await resubmitApprovalInstance({\n formData: resubmitFormData,\n initiatorMemberId: currentMemberId,\n instanceId: instance.id,\n title: instance.title,\n });\n await refreshInstance();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setDeciding(false);\n }\n }\n\n return (\n <Layout>\n <AppNavigation activeHref=\"/inbox\" />\n\n <Layout.Main>\n <PageHeader>\n <ContentHeader\n description={\n instance\n ? `${readInstanceStateLabel(instance.state)} · ${formatDateTime(\n instance.startedAt,\n )}`\n : '載入案件內容。'\n }\n title={instance?.title ?? '簽核案件'}\n >\n {instance ? (\n <Button\n aria-label=\"查看流程圖\"\n icon={ShareIcon}\n iconType=\"icon-only\"\n onClick={(): void => setWorkflowModalOpen(true)}\n title=\"查看流程圖\"\n variant=\"base-secondary\"\n >\n 流程圖\n </Button>\n ) : null}\n {canCancelInstance ? (\n <Button\n disabled={deciding}\n icon={DangerousOutlineIcon}\n iconType=\"leading\"\n onClick={(): void => setCancelModalOpen(true)}\n variant=\"destructive-secondary\"\n >\n 取消案件\n </Button>\n ) : null}\n {currentTask ? (\n <>\n {canReturnCurrentTask ? (\n <Button\n disabled={deciding}\n icon={RefreshCcwIcon}\n iconType=\"leading\"\n onClick={openReturnModal}\n variant=\"base-secondary\"\n >\n 退回\n </Button>\n ) : null}\n <Button\n disabled={deciding}\n icon={UserIcon}\n iconType=\"leading\"\n onClick={openTransferModal}\n variant=\"base-secondary\"\n >\n 轉派\n </Button>\n <Button\n disabled={deciding}\n icon={DangerousOutlineIcon}\n iconType=\"leading\"\n onClick={openRejectReasonModal}\n variant=\"destructive-secondary\"\n >\n 拒絕\n </Button>\n <Button\n disabled={deciding}\n icon={CheckedIcon}\n iconType=\"leading\"\n onClick={(): void =>\n void handleDecision({ action: 'APPROVED', comment: null })\n }\n variant=\"base-primary\"\n >\n 同意\n </Button>\n </>\n ) : null}\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section>\n <div style={SECTION_BODY_STYLE}>\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n {loading ? (\n <Typography color=\"text-neutral\" variant=\"body\">\n 載入中...\n </Typography>\n ) : null}\n {instance?.formDefinitionSnapshot.schema &&\n instance.formDefinitionSnapshot.uiSchema ? (\n <>\n <FormRenderer\n errors={resubmitFormErrors}\n onChange={(values): void => {\n setResubmitFormData(values);\n setResubmitFormErrors({});\n }}\n onUploadAttachment={\n canResubmitInstance ? handleUploadAttachment : undefined\n }\n readonly={!canResubmitInstance}\n schema={instance.formDefinitionSnapshot.schema}\n uiSchema={instance.formDefinitionSnapshot.uiSchema}\n value={\n canResubmitInstance ? resubmitFormData : instance.formData\n }\n />\n {canResubmitInstance ? (\n <div style={BUTTON_ROW_STYLE}>\n <Button\n disabled={deciding}\n icon={RefreshCcwIcon}\n iconType=\"leading\"\n onClick={(): void => void handleResubmitInstance()}\n variant=\"base-primary\"\n >\n 重新送出\n </Button>\n </div>\n ) : null}\n </>\n ) : (\n <Typography color=\"text-neutral\" variant=\"body\">\n 此案件沒有可顯示的表單快照。\n </Typography>\n )}\n </div>\n </Section>\n\n <Section>\n <div style={SECTION_BODY_STYLE}>\n <Typography component=\"h2\" variant=\"h3\">\n 附件\n </Typography>\n {attachmentRows.length > 0 ? (\n <Table\n actions={attachmentActions}\n columns={attachmentColumns}\n dataSource={attachmentRows}\n fullWidth\n />\n ) : (\n <Typography color=\"text-neutral\" variant=\"body\">\n 此案件沒有附件。\n </Typography>\n )}\n </div>\n </Section>\n\n <Section>\n <Typography component=\"h2\" variant=\"h3\">\n 任務\n </Typography>\n <Table columns={taskColumns} dataSource={taskRows} fullWidth />\n </Section>\n\n <Section>\n <div style={SECTION_BODY_STYLE}>\n <Typography component=\"h2\" variant=\"h3\">\n 簽章\n </Typography>\n <Typography\n color={\n signatureVerification?.valid ? 'text-success' : 'text-error'\n }\n variant=\"body\"\n >\n {signatureVerification\n ? signatureVerification.valid\n ? `簽章鏈已驗證,共 ${signatureVerification.checkedCount} 筆。`\n : `簽章鏈驗證失敗:${signatureVerification.errors.join('、')}`\n : '尚無簽章紀錄。'}\n </Typography>\n {signatureRows.length > 0 ? (\n <Table\n columns={signatureColumns}\n dataSource={signatureRows}\n fullWidth\n />\n ) : null}\n </div>\n </Section>\n\n <Section>\n <div style={SECTION_BODY_STYLE}>\n <Typography component=\"h2\" variant=\"h3\">\n 歷程\n </Typography>\n {activitySteps.length > 0 ? (\n <Stepper\n currentStep={currentActivityStep}\n orientation=\"vertical\"\n type=\"dot\"\n >\n {activitySteps.map((activityStep) => (\n <ActivityHistoryStep\n descriptionParts={activityStep.descriptionParts}\n error={activityStep.error}\n forcePending={activityStep.forcePending}\n key={activityStep.id}\n title={activityStep.title}\n />\n ))}\n </Stepper>\n ) : (\n <Typography color=\"text-neutral\" variant=\"body\">\n 尚無歷程紀錄。\n </Typography>\n )}\n </div>\n </Section>\n </SectionGroup>\n\n {instance ? (\n <Modal\n modalType=\"standard\"\n onClose={(): void => setWorkflowModalOpen(false)}\n open={workflowModalOpen}\n showModalHeader\n size=\"wide\"\n supportingText={`${readInstanceStateLabel(\n instance.state,\n )} · ${formatDateTime(instance.startedAt)}`}\n title=\"流程圖\"\n >\n <div style={FLOW_MODAL_BODY_STYLE}>\n <div style={FLOW_CANVAS_STYLE}>\n <ReactFlow\n edges={flowEdges}\n fitView\n fitViewOptions={{ padding: 0.18 }}\n maxZoom={1.2}\n minZoom={0.2}\n nodes={flowNodes}\n nodesDraggable={false}\n nodesFocusable={false}\n nodeTypes={READONLY_FLOW_NODE_TYPES}\n panOnDrag\n proOptions={{ hideAttribution: true }}\n >\n <Background />\n <Controls showInteractive={false} />\n </ReactFlow>\n </div>\n {edgeSummaries.length > 0 ? (\n <div style={EDGE_SUMMARY_STYLE}>\n {edgeSummaries.map((summary) => (\n <span key={summary} style={EDGE_SUMMARY_ITEM_STYLE}>\n {summary}\n </span>\n ))}\n </div>\n ) : null}\n </div>\n </Modal>\n ) : null}\n <Modal\n modalType=\"standard\"\n onClose={(): void => {\n setPreviewAttachment(null);\n setPreviewUrl(null);\n }}\n open={Boolean(previewAttachment && previewUrl)}\n showModalHeader\n size=\"wide\"\n supportingText={previewAttachment?.filename ?? undefined}\n title=\"PDF 預覽\"\n >\n {previewUrl ? (\n <PDFPreview\n filename={previewAttachment?.filename ?? 'PDF 預覽'}\n fileUrl={previewUrl}\n onDownload={\n previewAttachment\n ? (): void => void handleDownloadAttachment(previewAttachment)\n : undefined\n }\n />\n ) : null}\n </Modal>\n <Modal\n cancelText=\"保留案件\"\n confirmButtonProps={{ variant: 'destructive-primary' }}\n confirmText=\"確認取消\"\n loading={deciding}\n modalStatusType=\"error\"\n modalType=\"standard\"\n onCancel={(): void => setCancelModalOpen(false)}\n onClose={(): void => setCancelModalOpen(false)}\n onConfirm={(): void => void handleCancelInstance()}\n open={cancelModalOpen}\n showModalFooter\n showModalHeader\n supportingText=\"取消後會關閉目前待簽任務與候選簽核人。\"\n title=\"取消案件\"\n >\n <div style={SECTION_BODY_STYLE}>\n <Typography variant=\"body\">\n 確定要取消「{instance?.title ?? ''}」嗎?\n </Typography>\n <BPMFormField label=\"取消原因\" name=\"cancelComment\">\n <Textarea\n onChange={(event): void =>\n setCancelComment(event.target.value)\n }\n placeholder=\"可填寫取消原因\"\n resize=\"vertical\"\n rows={3}\n value={cancelComment}\n />\n </BPMFormField>\n </div>\n </Modal>\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{\n disabled: !trimmedRejectReason,\n variant: 'destructive-primary',\n }}\n confirmText=\"送出拒絕\"\n loading={deciding}\n modalStatusType=\"error\"\n modalType=\"standard\"\n onCancel={closeRejectReasonModal}\n onClose={closeRejectReasonModal}\n onConfirm={(): void => void handleRejectConfirm()}\n open={rejectReasonModalOpen}\n showModalFooter\n showModalHeader\n size=\"regular\"\n supportingText=\"拒絕案件時必須留下原因,供發起人與後續追蹤查看。\"\n title=\"拒絕原因\"\n >\n <div style={REJECT_REASON_FORM_STYLE}>\n <BPMFormField label=\"拒絕原因\" name=\"rejectReason\" required>\n <Textarea\n autoFocus\n onChange={(event: ChangeEvent<HTMLTextAreaElement>): void => {\n setRejectReason(event.target.value);\n setRejectReasonError(null);\n }}\n placeholder=\"請說明拒絕原因\"\n ref={applyFullWidthTextareaHost}\n resize=\"vertical\"\n rows={4}\n style={REJECT_REASON_TEXTAREA_STYLE}\n type={rejectReasonError ? 'error' : 'default'}\n value={rejectReason}\n />\n </BPMFormField>\n {rejectReasonError ? (\n <Typography color=\"text-error\" variant=\"body\">\n {rejectReasonError}\n </Typography>\n ) : null}\n </div>\n </Modal>\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{\n disabled: !transferMember,\n }}\n confirmText=\"送出轉派\"\n loading={deciding}\n modalType=\"standard\"\n onCancel={closeTransferModal}\n onClose={closeTransferModal}\n onConfirm={(): void => void handleTransferConfirm()}\n open={transferModalOpen}\n showModalFooter\n showModalHeader\n size=\"regular\"\n supportingText=\"轉派後,原任務會保留轉派紀錄,新的待簽任務會指派給指定成員。\"\n title=\"轉派簽核\"\n >\n <div style={MODAL_FORM_STYLE}>\n <BPMFormField label=\"轉派對象\" name=\"transferToMemberId\" required>\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的成員\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name: 'transfer-member-search',\n spellCheck: false,\n }}\n loading={transferMemberLoading}\n loadingText=\"搜尋成員中...\"\n mode=\"single\"\n onChange={(option): void =>\n setTransferMember(readMemberOptionFromValue(option))\n }\n onSearch={handleSearchTransferMembers}\n onSearchTextChange={(searchText): void =>\n setTransferMember(\n readUniqueMemberOption(searchText, transferMemberOptions),\n )\n }\n onVisibilityChange={(open): void => {\n if (open) {\n void handleSearchTransferMembers('');\n }\n }}\n options={[...transferMemberOptions]}\n placeholder=\"搜尋姓名或信箱\"\n searchDebounceTime={300}\n value={transferMember}\n />\n </BPMFormField>\n <BPMFormField label=\"轉派說明\" name=\"transferComment\">\n <Textarea\n onChange={(event: ChangeEvent<HTMLTextAreaElement>): void =>\n setTransferComment(event.target.value)\n }\n placeholder=\"可補充轉派原因\"\n ref={applyFullWidthTextareaHost}\n resize=\"vertical\"\n rows={4}\n style={REJECT_REASON_TEXTAREA_STYLE}\n value={transferComment}\n />\n </BPMFormField>\n </div>\n </Modal>\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{\n disabled: !selectedReturnTargetOption,\n }}\n confirmText=\"送出退回\"\n loading={deciding}\n modalType=\"standard\"\n onCancel={closeReturnModal}\n onClose={closeReturnModal}\n onConfirm={(): void => void handleReturnConfirm()}\n open={returnModalOpen}\n showModalFooter\n showModalHeader\n size=\"regular\"\n supportingText=\"退回後,流程會回到指定節點並等待重新處理。\"\n title=\"退回簽核\"\n >\n <div style={MODAL_FORM_STYLE}>\n <BPMFormField label=\"退回節點\" name=\"returnTargetNodeId\" required>\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void =>\n setReturnTargetNodeId(option?.id ?? null)\n }\n options={[...returnTargetOptions]}\n placeholder=\"選擇退回節點\"\n value={selectedReturnTargetOption}\n />\n </BPMFormField>\n <BPMFormField label=\"退回說明\" name=\"returnComment\">\n <Textarea\n onChange={(event: ChangeEvent<HTMLTextAreaElement>): void =>\n setReturnComment(event.target.value)\n }\n placeholder=\"可補充需要修改的內容\"\n ref={applyFullWidthTextareaHost}\n resize=\"vertical\"\n rows={4}\n style={REJECT_REASON_TEXTAREA_STYLE}\n value={returnComment}\n />\n </BPMFormField>\n </div>\n </Modal>\n </Layout.Main>\n </Layout>\n );\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction formatFileSize(sizeBytes: number): string {\n if (!Number.isFinite(sizeBytes) || sizeBytes <= 0) {\n return '-';\n }\n\n if (sizeBytes < 1024) {\n return `${sizeBytes} B`;\n }\n\n if (sizeBytes < 1024 * 1024) {\n return `${(sizeBytes / 1024).toFixed(1)} KB`;\n }\n\n return `${(sizeBytes / 1024 / 1024).toFixed(1)} MB`;\n}\n\nfunction readShortHash(hash: string): string {\n return hash.length > 16 ? `${hash.slice(0, 12)}...` : hash;\n}\n\nfunction joinClassNames(\n ...classNames: readonly (string | null | undefined)[]\n): string {\n return classNames\n .filter((className): className is string =>\n isPresentText(className ?? null),\n )\n .join(' ');\n}\n\ninterface ActivityHistoryStepProps extends StepProps {\n readonly descriptionParts: readonly ActivityStepDescriptionPart[];\n readonly forcePending?: boolean;\n}\n\nconst ActivityHistoryStep = forwardRef<\n HTMLDivElement,\n ActivityHistoryStepProps\n>(function ActivityHistoryStep(\n {\n className,\n descriptionParts,\n error,\n forcePending = false,\n index = 0,\n orientation,\n status = 'pending',\n title,\n type = 'number',\n ...rest\n },\n ref,\n): ReactElement {\n const displayStatus = forcePending ? 'pending' : status;\n\n return (\n <div\n {...rest}\n className={joinClassNames(\n stepClasses.host,\n type === 'dot' ? stepClasses.dot : null,\n error && displayStatus !== 'processing' ? stepClasses.error : null,\n orientation === 'horizontal' ? stepClasses.horizontal : null,\n type === 'number' ? stepClasses.number : null,\n displayStatus === 'pending' ? stepClasses.pending : null,\n displayStatus === 'processing' ? stepClasses.processing : null,\n error && displayStatus === 'processing'\n ? stepClasses.processingError\n : null,\n !error && displayStatus === 'succeeded' ? stepClasses.succeeded : null,\n orientation === 'vertical' ? stepClasses.vertical : null,\n className,\n )}\n ref={ref}\n >\n {type === 'dot' ? (\n <span\n className={joinClassNames(\n stepClasses.statusIndicator,\n stepClasses.statusIndicatorDot,\n )}\n />\n ) : (\n <span className={stepClasses.statusIndicator}>{index + 1}</span>\n )}\n <div className={stepClasses.textContainer}>\n <Typography\n className={stepClasses.title}\n variant=\"label-primary-highlight\"\n >\n {title}\n <span className={stepClasses.titleConnectLine} />\n </Typography>\n {descriptionParts.length > 0 ? (\n <Typography className={stepClasses.description} variant=\"caption\">\n {descriptionParts.map((part, partIndex) => (\n <Fragment key={`${part.type}-${partIndex}`}>\n {partIndex > 0 ? ' · ' : null}\n {renderActivityDescriptionPart(part)}\n </Fragment>\n ))}\n </Typography>\n ) : null}\n </div>\n </div>\n );\n});\n\nfunction renderActivityDescriptionPart(\n part: ActivityStepDescriptionPart,\n): ReactElement | string {\n if (part.type === 'text') {\n return part.text;\n }\n\n if (part.type === 'dangerText') {\n return <span style={HISTORY_DANGER_TEXT_STYLE}>{part.text}</span>;\n }\n\n if (!part.email) {\n return `${part.prefix}:${part.label}`;\n }\n\n return (\n <>\n {part.prefix}:\n <Tooltip title={part.email}>\n {({ onMouseEnter, onMouseLeave, ref }): ReactElement => (\n <span\n data-testid={\n part.memberId ? `member-tooltip-${part.memberId}` : undefined\n }\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n ref={ref as RefCallback<HTMLSpanElement>}\n style={HISTORY_MEMBER_NAME_STYLE}\n >\n {part.label}\n </span>\n )}\n </Tooltip>\n </>\n );\n}\n\nasync function readMemberProfilesForTimeline({\n activityLogs,\n tasks,\n}: {\n readonly activityLogs: readonly ActivityLogRecord[];\n readonly tasks: readonly TaskRecord[];\n}): Promise<readonly MemberProfileRecord[]> {\n const memberIds = [\n ...new Set(\n [\n ...activityLogs.map((activityLog) => activityLog.actorMemberId),\n ...tasks.map((task) => task.assigneeMemberId),\n ...tasks.map((task) => task.originalAssigneeMemberId),\n ...tasks.flatMap((task) => task.candidateMemberIds),\n ...tasks.flatMap((task) =>\n readDelegationChain(task.delegationChainJson).flatMap((step) => [\n step.from,\n step.to,\n ]),\n ),\n ].filter(isPresentText),\n ),\n ];\n\n try {\n return await resolveMemberProfiles(memberIds);\n } catch {\n return [];\n }\n}\n\nasync function readTaskDecisionsForTasks(\n tasks: readonly TaskRecord[],\n): Promise<readonly TaskDecisionRecord[]> {\n const decisionLists = await Promise.all(\n tasks.map((task) => listTaskDecisions(task.id)),\n );\n\n return decisionLists.flat();\n}\n\nfunction readLatestTaskDecisionsByTaskId(\n taskDecisions: readonly TaskDecisionRecord[],\n): ReadonlyMap<string, TaskDecisionRecord> {\n return taskDecisions.reduce<ReadonlyMap<string, TaskDecisionRecord>>(\n (decisionsByTaskId, decision) => {\n const currentDecision = decisionsByTaskId.get(decision.taskId);\n const nextDecision =\n !currentDecision ||\n new Date(decision.decidedAt).getTime() >\n new Date(currentDecision.decidedAt).getTime()\n ? decision\n : currentDecision;\n\n return new Map(decisionsByTaskId).set(decision.taskId, nextDecision);\n },\n new Map(),\n );\n}\n\nfunction readActivityStepRecords(\n activityLogs: readonly ActivityLogRecord[],\n tasks: readonly TaskRecord[],\n tokens: readonly WorkflowTokenRecord[],\n workflow: WorkflowDefinition | null,\n instanceState: ApprovalInstanceRecord['state'],\n memberProfilesById: ReadonlyMap<string, MemberProfileRecord>,\n taskDecisionsByTaskId: ReadonlyMap<string, TaskDecisionRecord>,\n signaturesById: ReadonlyMap<string, SignatureRecord>,\n signatureVerification: SignatureVerificationRecord | null,\n): ActivityStepRecord[] {\n const historySteps = activityLogs\n .filter(isUserMeaningfulActivity)\n .map((activityLog): ActivityStepRecord => {\n const payload = readActivityPayload(activityLog);\n const nodeLabel = readActivityNodeLabel(activityLog.nodeId, workflow);\n const descriptionParts = [\n readTextDescriptionPart(\n nodeLabel ? `節點:${nodeLabel}` : '節點:全流程',\n ),\n readMemberDescriptionPart(\n '操作者',\n activityLog.actorMemberId,\n memberProfilesById,\n '系統',\n ),\n readTextDescriptionPart(\n `時間:${formatActivityDateTime(activityLog.createdAt)}`,\n ),\n ...readActivityDetailParts(\n activityLog,\n payload,\n workflow,\n taskDecisionsByTaskId,\n signaturesById,\n signatureVerification,\n memberProfilesById,\n ),\n ].filter(isActivityDescriptionPart);\n\n return {\n descriptionParts,\n error: isActivityError(activityLog, payload),\n id: activityLog.id,\n title: readActivityEventLabel(activityLog.eventType, payload),\n };\n });\n const pendingTaskSteps = tasks.filter(isPendingTask).map(\n (task): ActivityStepRecord => ({\n descriptionParts: [\n readTextDescriptionPart(\n `節點:${readNodeDisplayLabel(task.nodeId, workflow)}`,\n ),\n readMemberDescriptionPart(\n '處理者',\n task.assigneeMemberId,\n memberProfilesById,\n '未指定',\n ),\n readTextDescriptionPart(\n `建立時間:${formatActivityDateTime(task.createdAt)}`,\n ),\n ].filter(isActivityDescriptionPart),\n error: false,\n id: `pending-task-${task.id}`,\n title: task.status === 'IN_PROGRESS' ? '簽核處理中' : '等待簽核處理',\n }),\n );\n const representedNodeIds = new Set(\n [\n ...activityLogs\n .filter(isUserMeaningfulActivity)\n .map((activityLog) => activityLog.nodeId),\n ...tasks.map((task) => task.nodeId),\n ].filter(isPresentText),\n );\n const futureNodeSteps = workflow\n ? readFutureTimelineNodes(\n workflow,\n tasks,\n tokens,\n instanceState,\n representedNodeIds,\n ).map(\n (node): ActivityStepRecord => ({\n descriptionParts: [\n readTextDescriptionPart(\n `${readNodeKindLabel(node.type)} · 尚未抵達`,\n ),\n ].filter(isActivityDescriptionPart),\n error: false,\n forcePending: true,\n id: `future-node-${node.id}`,\n title: readFutureNodeStepTitle(node),\n }),\n )\n : [];\n\n return [...historySteps, ...pendingTaskSteps, ...futureNodeSteps];\n}\n\nfunction readTextDescriptionPart(\n text: string | null,\n): ActivityStepDescriptionPart | null {\n return isPresentText(text) ? { text, type: 'text' } : null;\n}\n\nfunction readDangerTextDescriptionPart(\n text: string | null,\n): ActivityStepDescriptionPart | null {\n return isPresentText(text) ? { text, type: 'dangerText' } : null;\n}\n\nfunction readMemberDescriptionPart(\n prefix: string,\n memberId: string | null,\n memberProfilesById: ReadonlyMap<string, MemberProfileRecord>,\n fallbackLabel: string,\n): ActivityStepDescriptionPart {\n const profile = memberId ? memberProfilesById.get(memberId) : null;\n\n return {\n email: profile?.email ?? null,\n label: profile?.name ?? fallbackLabel,\n memberId,\n prefix,\n type: 'member',\n };\n}\n\nfunction readMemberDisplayText(\n memberId: string | null,\n memberProfilesById: ReadonlyMap<string, MemberProfileRecord>,\n): string {\n if (!memberId) {\n return '-';\n }\n\n const profile = memberProfilesById.get(memberId);\n\n return profile ? `${profile.name}(${profile.email})` : memberId;\n}\n\nfunction isActivityDescriptionPart(\n part: ActivityStepDescriptionPart | null,\n): part is ActivityStepDescriptionPart {\n return Boolean(part);\n}\n\nfunction readCurrentActivityStep(\n activitySteps: readonly ActivityStepRecord[],\n): number {\n const firstPendingStepIndex = activitySteps.findIndex(\n (activityStep) =>\n activityStep.id.startsWith('pending-task-') ||\n activityStep.id.startsWith('future-node-'),\n );\n\n return firstPendingStepIndex === -1\n ? activitySteps.length\n : firstPendingStepIndex;\n}\n\nfunction isUserMeaningfulActivity(activityLog: ActivityLogRecord): boolean {\n return (\n activityLog.eventType === 'INSTANCE_STARTED' ||\n activityLog.eventType === 'TASK_DECIDED' ||\n activityLog.eventType === 'SLA_TRIGGERED'\n );\n}\n\nfunction isFutureTimelineNode(\n node: WorkflowNode,\n tasks: readonly TaskRecord[],\n tokens: readonly WorkflowTokenRecord[],\n instanceState: ApprovalInstanceRecord['state'],\n representedNodeIds: ReadonlySet<string>,\n): boolean {\n if (node.type === 'startEvent' || representedNodeIds.has(node.id)) {\n return false;\n }\n\n if (instanceState === 'REJECTED') {\n return true;\n }\n\n const state = readNodeRuntimeState(node, tasks, tokens, instanceState);\n\n return state.tone === 'neutral' || state.tone === 'waiting';\n}\n\nfunction readFutureTimelineNodes(\n workflow: WorkflowDefinition,\n tasks: readonly TaskRecord[],\n tokens: readonly WorkflowTokenRecord[],\n instanceState: ApprovalInstanceRecord['state'],\n representedNodeIds: ReadonlySet<string>,\n): readonly WorkflowNode[] {\n if (instanceState !== 'RUNNING' && instanceState !== 'REJECTED') {\n return [];\n }\n\n const futureNodes = workflow.nodes.filter((node) =>\n isFutureTimelineNode(\n node,\n tasks,\n tokens,\n instanceState,\n representedNodeIds,\n ),\n );\n const reachableDistances = readReachableFutureNodeDistances(\n workflow,\n futureNodes,\n tasks,\n tokens,\n representedNodeIds,\n );\n const originalNodeIndexes = new Map(\n workflow.nodes.map((node, index) => [node.id, index]),\n );\n\n return futureNodes\n .filter((node) => reachableDistances.has(node.id))\n .sort((left, right) => {\n const leftDistance = reachableDistances.get(left.id) ?? 0;\n const rightDistance = reachableDistances.get(right.id) ?? 0;\n\n if (leftDistance !== rightDistance) {\n return leftDistance - rightDistance;\n }\n\n if (left.position.x !== right.position.x) {\n return left.position.x - right.position.x;\n }\n\n if (left.position.y !== right.position.y) {\n return left.position.y - right.position.y;\n }\n\n return (\n (originalNodeIndexes.get(left.id) ?? 0) -\n (originalNodeIndexes.get(right.id) ?? 0)\n );\n });\n}\n\nfunction readReachableFutureNodeDistances(\n workflow: WorkflowDefinition,\n futureNodes: readonly WorkflowNode[],\n tasks: readonly TaskRecord[],\n tokens: readonly WorkflowTokenRecord[],\n representedNodeIds: ReadonlySet<string>,\n): ReadonlyMap<string, number> {\n const futureNodeIds = new Set(futureNodes.map((node) => node.id));\n const outgoingNodeIds = workflow.edges.reduce<\n ReadonlyMap<string, readonly string[]>\n >((groups, edge) => {\n const nextTargets = [...(groups.get(edge.source) ?? []), edge.target];\n\n return new Map(groups).set(edge.source, nextTargets);\n }, new Map());\n const frontierNodeIds = readFutureTimelineFrontierNodeIds(\n workflow,\n tasks,\n tokens,\n representedNodeIds,\n );\n\n return frontierNodeIds.reduce<ReadonlyMap<string, number>>(\n (distances, nodeId) =>\n mergeFutureNodeDistances(\n distances,\n readFutureNodeDistancesFrom(nodeId, outgoingNodeIds, futureNodeIds),\n ),\n new Map(),\n );\n}\n\nfunction readFutureTimelineFrontierNodeIds(\n workflow: WorkflowDefinition,\n tasks: readonly TaskRecord[],\n tokens: readonly WorkflowTokenRecord[],\n representedNodeIds: ReadonlySet<string>,\n): readonly string[] {\n const tokenNodeIds = tokens\n .filter((token) => token.status === 'ACTIVE' || token.status === 'WAITING')\n .map((token) => token.currentNodeId);\n const pendingTaskNodeIds = tasks\n .filter(isPendingTask)\n .map((task) => task.nodeId);\n const representedFrontierNodeIds = workflow.nodes\n .filter((node) => representedNodeIds.has(node.id))\n .map((node) => node.id);\n const activeFrontierNodeIds = [\n ...new Set([\n ...tokenNodeIds,\n ...pendingTaskNodeIds,\n ...representedFrontierNodeIds,\n ]),\n ];\n const startNodeIds = workflow.nodes\n .filter((node) => node.type === 'startEvent')\n .map((node) => node.id);\n\n return activeFrontierNodeIds.length > 0\n ? activeFrontierNodeIds\n : startNodeIds;\n}\n\nfunction readFutureNodeDistancesFrom(\n startNodeId: string,\n outgoingNodeIds: ReadonlyMap<string, readonly string[]>,\n futureNodeIds: ReadonlySet<string>,\n): ReadonlyMap<string, number> {\n const initialQueue: readonly {\n readonly distance: number;\n readonly nodeId: string;\n }[] = [{ distance: 0, nodeId: startNodeId }];\n\n return walkFutureNodeDistances(initialQueue, outgoingNodeIds, futureNodeIds);\n}\n\nfunction walkFutureNodeDistances(\n queue: readonly { readonly distance: number; readonly nodeId: string }[],\n outgoingNodeIds: ReadonlyMap<string, readonly string[]>,\n futureNodeIds: ReadonlySet<string>,\n visitedNodeIds: ReadonlySet<string> = new Set(),\n distances: ReadonlyMap<string, number> = new Map(),\n): ReadonlyMap<string, number> {\n const [current, ...restQueue] = queue;\n\n if (!current) {\n return distances;\n }\n\n if (visitedNodeIds.has(current.nodeId)) {\n return walkFutureNodeDistances(\n restQueue,\n outgoingNodeIds,\n futureNodeIds,\n visitedNodeIds,\n distances,\n );\n }\n\n const nextVisitedNodeIds = new Set(visitedNodeIds).add(current.nodeId);\n const nextDistances = futureNodeIds.has(current.nodeId)\n ? new Map(distances).set(\n current.nodeId,\n Math.min(\n distances.get(current.nodeId) ?? current.distance,\n current.distance,\n ),\n )\n : distances;\n const nextQueue = [\n ...restQueue,\n ...(outgoingNodeIds.get(current.nodeId) ?? []).map((nodeId) => ({\n distance: current.distance + 1,\n nodeId,\n })),\n ];\n\n return walkFutureNodeDistances(\n nextQueue,\n outgoingNodeIds,\n futureNodeIds,\n nextVisitedNodeIds,\n nextDistances,\n );\n}\n\nfunction mergeFutureNodeDistances(\n currentDistances: ReadonlyMap<string, number>,\n nextDistances: ReadonlyMap<string, number>,\n): ReadonlyMap<string, number> {\n return [...nextDistances.entries()].reduce<ReadonlyMap<string, number>>(\n (mergedDistances, [nodeId, distance]) =>\n new Map(mergedDistances).set(\n nodeId,\n Math.min(mergedDistances.get(nodeId) ?? distance, distance),\n ),\n currentDistances,\n );\n}\n\nfunction readFutureNodeStepTitle(node: WorkflowNode): string {\n if (node.type === 'userTask') {\n return `未來簽核:${node.data.label}`;\n }\n\n if (node.type === 'serviceTask') {\n return `未來知會:${node.data.label}`;\n }\n\n if (node.type === 'exclusiveGateway') {\n return `未來分流:${node.data.label}`;\n }\n\n if (node.type === 'parallelGateway') {\n return `未來匯合:${node.data.label}`;\n }\n\n if (node.type === 'endEvent') {\n return `流程完成:${node.data.label}`;\n }\n\n return `未來節點:${node.data.label}`;\n}\n\nfunction readActivityPayload(\n activityLog: ActivityLogRecord,\n): Readonly<Record<string, unknown>> {\n try {\n const payload = JSON.parse(activityLog.payloadJson) as unknown;\n\n return isRecord(payload) ? payload : {};\n } catch {\n return {};\n }\n}\n\nfunction readActivityEventLabel(\n eventType: string,\n payload: Readonly<Record<string, unknown>>,\n): string {\n if (eventType === 'INSTANCE_STARTED') {\n return '案件已發起';\n }\n\n if (eventType === 'TOKEN_CREATED') {\n return '流程路徑已建立';\n }\n\n if (eventType === 'ENGINE_PROCESS_REQUESTED') {\n return '流程引擎已處理';\n }\n\n if (eventType === 'TOKEN_ADVANCED') {\n return '流程已前進';\n }\n\n if (eventType === 'TASK_CREATED') {\n return '待簽任務已建立';\n }\n\n if (eventType === 'TASK_DECIDED') {\n return readTaskDecisionEventLabel(readStringField(payload, 'action'));\n }\n\n if (eventType === 'SLA_TRIGGERED') {\n return '時限提醒已觸發';\n }\n\n return eventType;\n}\n\nfunction readTaskDecisionEventLabel(action: string | null): string {\n if (action === 'APPROVED') {\n return '已同意';\n }\n\n if (action === 'REJECTED') {\n return '已拒絕';\n }\n\n if (action === 'RETURNED') {\n return '已退回';\n }\n\n if (action === 'TRANSFERRED') {\n return '已轉派';\n }\n\n return '簽核已決議';\n}\n\nfunction readActivityDetail(\n activityLog: ActivityLogRecord,\n payload: Readonly<Record<string, unknown>>,\n workflow: WorkflowDefinition | null,\n memberProfilesById: ReadonlyMap<string, MemberProfileRecord>,\n): string | null {\n if (activityLog.eventType === 'TASK_CREATED') {\n const assigneeMemberId = readStringField(payload, 'assigneeMemberId');\n const originalAssigneeMemberId = readStringField(\n payload,\n 'originalAssigneeMemberId',\n );\n\n if (!assigneeMemberId) {\n const candidateMemberIds = readStringArrayField(\n payload,\n 'candidateMemberIds',\n );\n\n return candidateMemberIds.length\n ? `候選簽核人:${candidateMemberIds\n .map((memberId) =>\n readMemberDisplayText(memberId, memberProfilesById),\n )\n .join('、')}`\n : null;\n }\n\n const assigneeLabel = readMemberDisplayText(\n assigneeMemberId,\n memberProfilesById,\n );\n const originalAssigneeLabel = readMemberDisplayText(\n originalAssigneeMemberId,\n memberProfilesById,\n );\n\n return originalAssigneeMemberId &&\n originalAssigneeMemberId !== assigneeMemberId\n ? `待簽人:${assigneeLabel}(原簽核人:${originalAssigneeLabel})`\n : `待簽人:${assigneeLabel}`;\n }\n\n if (activityLog.eventType === 'TASK_DECIDED') {\n const action = readStringField(payload, 'action');\n const comment = readStringField(payload, 'comment');\n const decisionLabel = action\n ? `決議:${readTaskDecisionActionLabel(action)}`\n : null;\n\n const transferToMemberId = readStringField(payload, 'transferToMemberId');\n\n return action === 'REJECTED' && comment\n ? [decisionLabel, `拒絕原因:${comment}`]\n .filter(isPresentText)\n .join(' · ')\n : action === 'TRANSFERRED'\n ? [\n decisionLabel,\n `轉派給:${readMemberDisplayText(\n transferToMemberId,\n memberProfilesById,\n )}`,\n ]\n .filter(isPresentText)\n .join(' · ')\n : decisionLabel;\n }\n\n if (activityLog.eventType === 'TOKEN_ADVANCED') {\n const action = readStringField(payload, 'action');\n\n if (action) {\n return `流程結果:${readTaskDecisionActionLabel(action)}`;\n }\n\n const arrivedCount = readNumberField(payload, 'arrivedCount');\n const requiredCount = readNumberField(payload, 'requiredCount');\n\n if (arrivedCount !== null && requiredCount !== null) {\n return `等待匯合:${arrivedCount}/${requiredCount}`;\n }\n\n const fromNodeId = readStringField(payload, 'fromNodeId');\n const toNodeId = readStringField(payload, 'toNodeId');\n\n if (fromNodeId && toNodeId) {\n return `由 ${readNodeDisplayLabel(fromNodeId, workflow)} 前進至 ${readNodeDisplayLabel(toNodeId, workflow)}`;\n }\n }\n\n if (activityLog.eventType === 'ENGINE_PROCESS_REQUESTED') {\n const state = readStringField(payload, 'state');\n\n return state ? `案件狀態:${readInstanceStateLabel(state)}` : null;\n }\n\n return null;\n}\n\nfunction readActivityDetailParts(\n activityLog: ActivityLogRecord,\n payload: Readonly<Record<string, unknown>>,\n workflow: WorkflowDefinition | null,\n taskDecisionsByTaskId: ReadonlyMap<string, TaskDecisionRecord>,\n signaturesById: ReadonlyMap<string, SignatureRecord>,\n signatureVerification: SignatureVerificationRecord | null,\n memberProfilesById: ReadonlyMap<string, MemberProfileRecord>,\n): readonly ActivityStepDescriptionPart[] {\n if (activityLog.eventType !== 'TASK_DECIDED') {\n return [\n readTextDescriptionPart(\n readActivityDetail(\n activityLog,\n payload,\n workflow,\n memberProfilesById,\n ),\n ),\n ].filter(isActivityDescriptionPart);\n }\n\n const taskDecision = activityLog.taskId\n ? taskDecisionsByTaskId.get(activityLog.taskId)\n : null;\n const action =\n readStringField(payload, 'action') ?? taskDecision?.action ?? null;\n const comment =\n readStringField(payload, 'comment') ?? taskDecision?.comment ?? null;\n const transferToMemberId =\n readStringField(payload, 'transferToMemberId') ??\n taskDecision?.transferToMemberId ??\n null;\n const signatureId =\n readStringField(payload, 'signatureId') ??\n taskDecision?.signatureId ??\n null;\n const signature = signatureId ? signaturesById.get(signatureId) : null;\n const decisionLabel = action\n ? `決議:${readTaskDecisionActionLabel(action)}`\n : null;\n\n return [\n readTextDescriptionPart(decisionLabel),\n action === 'REJECTED'\n ? readDangerTextDescriptionPart(`拒絕原因:${comment ?? '-'}`)\n : null,\n action === 'RETURNED'\n ? readTextDescriptionPart(`退回說明:${comment ?? '-'}`)\n : null,\n action === 'TRANSFERRED'\n ? readTextDescriptionPart(\n `轉派給:${readMemberDisplayText(\n transferToMemberId,\n memberProfilesById,\n )}`,\n )\n : null,\n action === 'TRANSFERRED'\n ? readTextDescriptionPart(`轉派說明:${comment ?? '-'}`)\n : null,\n signature\n ? readTextDescriptionPart(\n signatureVerification?.valid\n ? `簽章:已驗證(${readShortHash(signature.signedPayloadHash)})`\n : `簽章:待檢查(${readShortHash(signature.signedPayloadHash)})`,\n )\n : null,\n ].filter(isActivityDescriptionPart);\n}\n\nfunction readActivityNodeLabel(\n nodeId: string | null,\n workflow: WorkflowDefinition | null,\n): string | null {\n return nodeId ? readNodeDisplayLabel(nodeId, workflow) : null;\n}\n\nfunction readNodeDisplayLabel(\n nodeId: string,\n workflow: WorkflowDefinition | null,\n): string {\n return (\n workflow?.nodes.find((node) => node.id === nodeId)?.data.label ?? nodeId\n );\n}\n\nfunction readReturnTargetOptions(\n workflow: WorkflowDefinition,\n node: WorkflowNode,\n): readonly { readonly id: string; readonly name: string }[] {\n if (node.type !== 'userTask' || !node.data.returnBehavior.allowReturn) {\n return [];\n }\n\n if (node.data.returnBehavior.allowedTargets === 'ANY') {\n return workflow.nodes\n .filter((candidate) => candidate.id !== node.id)\n .map((candidate) => ({\n id: candidate.id,\n name: `${candidate.data.label}(${readNodeKindLabel(candidate.type)})`,\n }));\n }\n\n const targetNodeId =\n node.data.returnBehavior.allowedTargets === 'INITIATOR'\n ? workflow.nodes.find((candidate) => candidate.type === 'startEvent')?.id\n : workflow.edges.find((edge) => edge.target === node.id)?.source;\n const targetNode = workflow.nodes.find(\n (candidate) => candidate.id === targetNodeId,\n );\n\n return targetNode\n ? [\n {\n id: targetNode.id,\n name: `${targetNode.data.label}(${readNodeKindLabel(\n targetNode.type,\n )})`,\n },\n ]\n : [];\n}\n\nfunction readTaskDecisionActionLabel(action: string): string {\n if (action === 'APPROVED') {\n return '同意';\n }\n\n if (action === 'REJECTED') {\n return '拒絕';\n }\n\n if (action === 'RETURNED') {\n return '退回';\n }\n\n if (action === 'TRANSFERRED') {\n return '轉派';\n }\n\n return action;\n}\n\nfunction readTaskStatusLabel(status: TaskRecord['status']): string {\n if (status === 'PENDING') {\n return '待處理';\n }\n\n if (status === 'IN_PROGRESS') {\n return '處理中';\n }\n\n if (status === 'COMPLETED') {\n return '已完成';\n }\n\n if (status === 'CANCELLED') {\n return '已取消';\n }\n\n if (status === 'TRANSFERRED') {\n return '已轉派';\n }\n\n return status;\n}\n\nfunction readTaskAssigneeLabel(\n task: TaskRecord,\n memberProfilesById: ReadonlyMap<string, MemberProfileRecord> = new Map(),\n): string {\n const delegationChain = readDelegationChain(task.delegationChainJson);\n\n if (!task.assigneeMemberId) {\n return task.candidateMemberIds.length\n ? `候選 ${task.candidateMemberIds\n .map((memberId) => readMemberDisplayText(memberId, memberProfilesById))\n .join('、')}`\n : '未指定';\n }\n\n const assigneeLabel = readMemberDisplayText(\n task.assigneeMemberId,\n memberProfilesById,\n );\n const originalAssigneeLabel = readMemberDisplayText(\n task.originalAssigneeMemberId,\n memberProfilesById,\n );\n\n if (\n delegationChain.length === 0 ||\n task.originalAssigneeMemberId === task.assigneeMemberId\n ) {\n return assigneeLabel;\n }\n\n return `${assigneeLabel}(原:${originalAssigneeLabel})`;\n}\n\nfunction canMemberActOnTask(\n task: TaskRecord,\n memberId: string | null,\n): boolean {\n if (!memberId) {\n return false;\n }\n\n return (\n task.assigneeMemberId === memberId ||\n task.candidateMemberIds.includes(memberId)\n );\n}\n\nfunction readInstanceStateLabel(state: string): string {\n if (state === 'APPROVED') {\n return '已同意';\n }\n\n if (state === 'CANCELLED') {\n return '已取消';\n }\n\n if (state === 'DRAFT') {\n return '草稿';\n }\n\n if (state === 'EXPIRED') {\n return '已逾期';\n }\n\n if (state === 'REJECTED') {\n return '已拒絕';\n }\n\n if (state === 'RETURNED') {\n return '已退回';\n }\n\n if (state === 'RUNNING') {\n return '進行中';\n }\n\n return state;\n}\n\nfunction isActivityError(\n activityLog: ActivityLogRecord,\n payload: Readonly<Record<string, unknown>>,\n): boolean {\n return (\n activityLog.eventType === 'SLA_TRIGGERED' ||\n readStringField(payload, 'action') === 'REJECTED' ||\n readStringField(payload, 'instanceState') === 'REJECTED'\n );\n}\n\nfunction formatActivityDateTime(value: string): string {\n return formatDateTime(value);\n}\n\nfunction readStringField(\n record: Readonly<Record<string, unknown>>,\n key: string,\n): string | null {\n const value = record[key];\n\n return typeof value === 'string' ? value : null;\n}\n\nfunction readStringArrayField(\n record: Readonly<Record<string, unknown>>,\n key: string,\n): readonly string[] {\n const value = record[key];\n\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : [];\n}\n\nfunction readMemberOption(profile: MemberProfileRecord): MemberOption {\n return {\n email: profile.email,\n id: profile.memberId,\n name: `${profile.name} · ${profile.email}`,\n };\n}\n\nfunction readMemberOptionFromValue(value: unknown): MemberOption | null {\n if (!isRecord(value)) {\n return null;\n }\n\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 ? { email: typeof email === 'string' ? email : null, id, name }\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\ninterface DelegationChainStep {\n readonly from: string;\n readonly reason: string;\n readonly ruleId: string | null;\n readonly to: string;\n}\n\nfunction readDelegationChain(value: string): readonly DelegationChainStep[] {\n try {\n const parsed = JSON.parse(value) as unknown;\n\n return Array.isArray(parsed)\n ? parsed\n .map((item): DelegationChainStep | null =>\n isRecord(item) ? readDelegationChainStep(item) : null,\n )\n .filter((item): item is DelegationChainStep => item !== null)\n : [];\n } catch {\n return [];\n }\n}\n\nfunction readDelegationChainStep(\n item: Readonly<Record<string, unknown>>,\n): DelegationChainStep | null {\n const from = readStringField(item, 'from');\n const to = readStringField(item, 'to');\n const reason = readStringField(item, 'reason');\n\n if (!from || !to || !reason) {\n return null;\n }\n\n return {\n from,\n reason,\n ruleId: readStringField(item, 'ruleId'),\n to,\n };\n}\n\nfunction readNumberField(\n record: Readonly<Record<string, unknown>>,\n key: string,\n): number | null {\n const value = record[key];\n\n return typeof value === 'number' ? value : null;\n}\n\nfunction isPresentText(value: string | null): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isPendingTask(task: TaskRecord): boolean {\n return task.status === 'PENDING' || task.status === 'IN_PROGRESS';\n}\n\nfunction WorkflowRuntimeNodeCard({\n data,\n}: NodeProps<RuntimeFlowNode>): ReactElement {\n return (\n <div style={readNodeStyle(data.tone)}>\n <Handle\n isConnectable={false}\n position={Position.Left}\n style={NODE_HANDLE_STYLE}\n type=\"target\"\n />\n <Typography\n component=\"span\"\n ellipsis\n title={data.label}\n variant=\"label-primary\"\n >\n {data.label}\n </Typography>\n <span style={readNodeStatusStyle(data.tone)}>{data.statusLabel}</span>\n <span title={data.secondaryLabel} style={NODE_SECONDARY_STYLE}>\n {data.secondaryLabel || data.kindLabel}\n </span>\n <Handle\n isConnectable={false}\n position={Position.Right}\n style={NODE_HANDLE_STYLE}\n type=\"source\"\n />\n </div>\n );\n}\n\nfunction readRuntimeFlowNodes(\n workflow: WorkflowDefinition,\n tasks: readonly TaskRecord[],\n tokens: readonly WorkflowTokenRecord[],\n instanceState: string,\n): RuntimeFlowNode[] {\n return workflow.nodes.map((node): RuntimeFlowNode => {\n const state = readNodeRuntimeState(node, tasks, tokens, instanceState);\n\n return {\n data: {\n kindLabel: readNodeKindLabel(node.type),\n label: node.data.label,\n secondaryLabel: state.secondaryLabel,\n statusLabel: state.statusLabel,\n tone: state.tone,\n },\n id: node.id,\n position: node.position,\n sourcePosition: Position.Right,\n targetPosition: Position.Left,\n type: 'workflowRuntime',\n };\n });\n}\n\nfunction layoutRuntimeWorkflowDefinition(\n workflow: WorkflowDefinition,\n): WorkflowDefinition {\n const graph = new dagre.graphlib.Graph();\n graph.setDefaultEdgeLabel(() => ({}));\n graph.setGraph({\n nodesep: 56,\n rankdir: 'LR',\n ranksep: 120,\n });\n workflow.nodes.forEach((node): void => {\n graph.setNode(node.id, {\n height: FLOW_NODE_LAYOUT_HEIGHT,\n width: FLOW_NODE_LAYOUT_WIDTH,\n });\n });\n workflow.edges.forEach((edge): void => {\n graph.setEdge(edge.source, edge.target);\n });\n dagre.layout(graph);\n\n return {\n ...workflow,\n nodes: workflow.nodes.map((node): WorkflowNode => {\n const positionedNode = graph.node(node.id) as\n | { readonly x: number; readonly y: number }\n | undefined;\n\n return positionedNode\n ? {\n ...node,\n position: {\n x: positionedNode.x - FLOW_NODE_LAYOUT_WIDTH / 2,\n y: positionedNode.y - FLOW_NODE_LAYOUT_HEIGHT / 2,\n },\n }\n : node;\n }),\n };\n}\n\nfunction readRuntimeFlowEdges(workflow: WorkflowDefinition): RuntimeFlowEdge[] {\n return workflow.edges.map((edge): RuntimeFlowEdge => {\n const label = readEdgeLabel(edge);\n\n return {\n animated: false,\n id: edge.id,\n label,\n labelBgBorderRadius: 6,\n labelBgPadding: [8, 4],\n labelBgStyle: {\n fill: edge.data.isDefault ? '#f8fafc' : '#eff6ff',\n stroke: edge.data.isDefault ? '#64748b' : '#2563eb',\n strokeWidth: 1,\n },\n labelShowBg: Boolean(label),\n labelStyle: {\n fill: edge.data.isDefault ? '#475569' : '#2563eb',\n fontSize: 12,\n fontWeight: 600,\n },\n source: edge.source,\n style: {\n stroke: '#475569',\n strokeWidth: 1.5,\n },\n target: edge.target,\n type: edge.type ?? 'smoothstep',\n };\n });\n}\n\nfunction readNodeRuntimeState(\n node: WorkflowNode,\n tasks: readonly TaskRecord[],\n tokens: readonly WorkflowTokenRecord[],\n instanceState: string,\n): Readonly<{\n secondaryLabel: string;\n statusLabel: string;\n tone: RuntimeTone;\n}> {\n const nodeTasks = tasks.filter((task) => task.nodeId === node.id);\n const pendingTask = nodeTasks.find(\n (task) => task.status === 'PENDING' || task.status === 'IN_PROGRESS',\n );\n const cancelledTask = nodeTasks.find((task) => task.status === 'CANCELLED');\n const completedTask = nodeTasks.find((task) => task.status === 'COMPLETED');\n const nodeTokens = tokens.filter((token) => token.currentNodeId === node.id);\n const activeToken = nodeTokens.find((token) => token.status === 'ACTIVE');\n const waitingToken = nodeTokens.find((token) => token.status === 'WAITING');\n\n if (pendingTask) {\n return {\n secondaryLabel: `處理者 ${readTaskAssigneeLabel(pendingTask)}`,\n statusLabel: '待處理',\n tone: 'current',\n };\n }\n\n if (cancelledTask) {\n return {\n secondaryLabel: `已取消 ${readTaskAssigneeLabel(cancelledTask)}`,\n statusLabel: '已取消',\n tone: 'cancelled',\n };\n }\n\n if (completedTask) {\n return {\n secondaryLabel: `已完成 ${readTaskAssigneeLabel(completedTask)}`,\n statusLabel: '已完成',\n tone: 'completed',\n };\n }\n\n if (activeToken) {\n return {\n secondaryLabel: `token ${activeToken.id}`,\n statusLabel: '執行中',\n tone: 'current',\n };\n }\n\n if (waitingToken) {\n return {\n secondaryLabel: `token ${waitingToken.id}`,\n statusLabel: '等待前置',\n tone: 'waiting',\n };\n }\n\n if (node.type === 'startEvent') {\n return {\n secondaryLabel: '流程已發起',\n statusLabel: '已發起',\n tone: 'completed',\n };\n }\n\n if (node.type === 'endEvent' && instanceState !== 'RUNNING') {\n return {\n secondaryLabel: instanceState,\n statusLabel: instanceState === 'REJECTED' ? '已拒絕' : '已完成',\n tone: instanceState === 'REJECTED' ? 'cancelled' : 'completed',\n };\n }\n\n return {\n secondaryLabel: readNodeKindLabel(node.type),\n statusLabel: '未抵達',\n tone: 'neutral',\n };\n}\n\nfunction readNodeKindLabel(type: WorkflowNode['type']): string {\n if (type === 'startEvent') {\n return '開始';\n }\n\n if (type === 'endEvent') {\n return '完成';\n }\n\n if (type === 'userTask') {\n return '簽核節點';\n }\n\n if (type === 'serviceTask') {\n return '知會節點';\n }\n\n if (type === 'exclusiveGateway') {\n return '條件分流';\n }\n\n return '平行處理';\n}\n\nfunction readNodeStyle(tone: RuntimeTone): CSSProperties {\n if (tone === 'current') {\n return {\n ...NODE_STYLE,\n border: '1px solid var(--mzn-color-primary, #0057ff)',\n boxShadow: '0 0 0 3px rgba(0, 87, 255, 0.14)',\n };\n }\n\n if (tone === 'completed') {\n return {\n ...NODE_STYLE,\n border: '1px solid #16a34a',\n };\n }\n\n if (tone === 'cancelled') {\n return {\n ...NODE_STYLE,\n border: '1px solid #dc2626',\n opacity: 0.72,\n };\n }\n\n if (tone === 'waiting') {\n return {\n ...NODE_STYLE,\n border: '1px dashed #64748b',\n };\n }\n\n return NODE_STYLE;\n}\n\nfunction readNodeStatusStyle(tone: RuntimeTone): CSSProperties {\n const baseStyle = NODE_STATUS_STYLE;\n\n if (tone === 'current') {\n return { ...baseStyle, background: '#eff6ff', color: '#2563eb' };\n }\n\n if (tone === 'completed') {\n return { ...baseStyle, background: '#f0fdf4', color: '#15803d' };\n }\n\n if (tone === 'cancelled') {\n return { ...baseStyle, background: '#fef2f2', color: '#dc2626' };\n }\n\n if (tone === 'waiting') {\n return { ...baseStyle, background: '#f8fafc', color: '#475569' };\n }\n\n return { ...baseStyle, background: '#f1f5f9', color: '#64748b' };\n}\n\nfunction readEdgeLabel(edge: WorkflowDefinition['edges'][number]): string {\n if (edge.data.label) {\n return edge.data.label;\n }\n\n if (edge.data.isDefault) {\n return '其他情況';\n }\n\n return edge.data.condition ?? '';\n}\n\nfunction readEdgeSummaries(workflow: WorkflowDefinition): readonly string[] {\n return workflow.edges\n .map(readEdgeLabel)\n .filter((label) => label.trim().length > 0);\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use client";require('../InstanceDetailView.css');const e=require("./app-navigation-DAC5gFbG.cjs"),t=require("./auth-provider-D2P-qWmY.cjs"),n=require("./format-date-time-BQyH5U8z.cjs"),r=require("./bpm-form-field-Bc6k4ZEO.cjs"),i=require("./FormRendererView-BwVsH2eX.cjs");let a=require("react"),o=require("@mezzanine-ui/react"),s=require("react/jsx-runtime"),c=require("@rytass/bpm-core-client/workflow"),l=require("@mezzanine-ui/icons"),u=require("@mezzanine-ui/react/ContentHeader");u=e.o(u,1);let d=require("@xyflow/react"),f=require("dagre");f=e.o(f,1);let p=require("@mezzanine-ui/core/stepper"),m=require("@rytass/bpm-core-client/form"),h=require("react-pdf");var g={root:`bpm_root_ehm7w`,toolbar:`bpm_toolbar_R-tis`,pageControls:`bpm_pageControls_jM-rC`,zoomControls:`bpm_zoomControls_7RAbJ`,counter:`bpm_counter_ILUsD`,viewport:`bpm_viewport_DQXms`,page:`bpm_page_Cv5Rg`,state:`bpm_state_bpgp3`},ee=760,_=920,te=320,ne=32,re=.75,ie=1.75,ae=.25;function oe({filename:e,fileUrl:t,onDownload:n}){let r=(0,a.useRef)(null),[i,c]=(0,a.useState)(null),[u,d]=(0,a.useState)(1),[f,p]=(0,a.useState)(1),[m,oe]=(0,a.useState)(ee);(0,a.useEffect)(()=>{let e=r.current;if(!e||typeof ResizeObserver>`u`)return;let t=new ResizeObserver(e=>{let t=e[0]?.contentRect.width;t&&oe(t)});return t.observe(e),()=>t.disconnect()},[]),(0,a.useEffect)(()=>{c(null),d(1),p(1)},[t]);let y=(0,a.useMemo)(()=>{let e=Math.max(te,m-ne);return Math.round(Math.min(_,e)*f)},[f,m]),se=(0,a.useCallback)(e=>{c(e.numPages),d(1)},[]),b=u>1,x=i!==null&&u<i,ce=f>re,le=f<ie,S=i===null?`第 ${u} 頁`:`第 ${u} / ${i} 頁`,ue=`${Math.round(f*100)}%`;return(0,s.jsxs)(`section`,{"aria-label":`${e} PDF 預覽`,className:g.root,children:[(0,s.jsxs)(`div`,{className:g.toolbar,children:[(0,s.jsxs)(`div`,{className:g.pageControls,"aria-label":`頁面切換`,children:[(0,s.jsx)(o.Button,{"aria-label":`上一頁`,disabled:!b,icon:l.ChevronLeftIcon,onClick:()=>{d(e=>Math.max(1,e-1))},size:`minor`,variant:`base-secondary`}),(0,s.jsx)(o.Typography,{className:g.counter,component:`span`,variant:`body`,children:S}),(0,s.jsx)(o.Button,{"aria-label":`下一頁`,disabled:!x,icon:l.ChevronRightIcon,onClick:()=>{d(e=>i===null?e:Math.min(i,e+1))},size:`minor`,variant:`base-secondary`})]}),(0,s.jsxs)(`div`,{className:g.zoomControls,"aria-label":`縮放`,children:[(0,s.jsx)(o.Button,{"aria-label":`縮小`,disabled:!ce,icon:l.ZoomOutIcon,onClick:()=>{p(e=>Math.max(re,e-ae))},size:`minor`,variant:`base-secondary`}),(0,s.jsx)(o.Typography,{className:g.counter,component:`span`,variant:`body`,children:ue}),(0,s.jsx)(o.Button,{"aria-label":`放大`,disabled:!le,icon:l.ZoomInIcon,onClick:()=>{p(e=>Math.min(ie,e+ae))},size:`minor`,variant:`base-secondary`})]}),n?(0,s.jsx)(o.Button,{icon:l.DownloadIcon,iconType:`leading`,onClick:n,size:`minor`,variant:`base-primary`,children:`下載`}):null]}),(0,s.jsx)(`div`,{className:g.viewport,ref:r,children:(0,s.jsx)(h.Document,{error:(0,s.jsx)(v,{message:`PDF 無法載入。`}),file:t,loading:(0,s.jsx)(v,{message:`正在載入 PDF...`}),noData:(0,s.jsx)(v,{message:`沒有可預覽的 PDF。`}),onLoadSuccess:se,children:(0,s.jsx)(h.Page,{className:g.page,loading:(0,s.jsx)(v,{message:`正在載入頁面...`}),pageNumber:u,renderAnnotationLayer:!0,renderTextLayer:!0,width:y})})})]})}function v({message:e}){return(0,s.jsx)(`div`,{className:g.state,children:(0,s.jsx)(o.Typography,{color:`text-neutral`,variant:`body`,children:e})})}var y={display:`grid`,gap:16},se={display:`flex`,flexWrap:`wrap`,gap:8},b=184,x=96,ce={display:`grid`,gap:16},le={display:`grid`,gap:12,width:`100%`},S={minWidth:`100%`,width:`100%`},ue={display:`grid`,gap:12,width:`100%`},de={background:`#f8fafc`,border:`1px solid #e2e8f0`,borderRadius:8,height:`min(64vh, 620px)`,minHeight:440,overflow:`hidden`,width:`min(80vw, 1040px)`},C={background:`#ffffff`,border:`1px solid #cbd5e1`,borderRadius:8,boxShadow:`0 8px 18px rgba(15, 23, 42, 0.08)`,display:`grid`,gap:6,minHeight:82,padding:12,width:184},w={borderRadius:999,fontSize:12,fontWeight:600,justifySelf:`start`,lineHeight:`18px`,padding:`0 8px`},fe={color:`#64748b`,fontSize:12,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},T={opacity:0},pe={display:`flex`,flexWrap:`wrap`,gap:8},me={alignItems:`center`,background:`#ffffff`,border:`1px solid #cbd5e1`,borderRadius:8,color:`#334155`,display:`inline-flex`,fontSize:12,fontWeight:600,gap:6,lineHeight:`20px`,padding:`4px 8px`},he={cursor:`help`,textDecoration:`underline dotted`,textUnderlineOffset:3},ge={color:`var(--mzn-color-text-error)`};function _e(e){e&&(e.style.width=`100%`)}var ve={workflowRuntime:Ye};function ye({instanceId:f}){let{member:p}=t.n(),h=p?.memberId??null,[g,ee]=(0,a.useState)([]),[_,te]=(0,a.useState)(null),[ne,re]=(0,a.useState)([]),[ie,ae]=(0,a.useState)([]),[v,b]=(0,a.useState)([]),[x,C]=(0,a.useState)(null),[w,fe]=(0,a.useState)([]),[T,he]=(0,a.useState)([]),[ge,ye]=(0,a.useState)([]),[D,O]=(0,a.useState)(null),[k,De]=(0,a.useState)(!0),[A,j]=(0,a.useState)(!1),[M,N]=(0,a.useState)(!1),[ke,Ae]=(0,a.useState)(``),[je,P]=(0,a.useState)(!1),[Me,F]=(0,a.useState)(``),[I,L]=(0,a.useState)(null),[Ne,R]=(0,a.useState)(!1),[Pe,z]=(0,a.useState)(``),[Fe,B]=(0,a.useState)(!1),[H,U]=(0,a.useState)(null),[Ve,W]=(0,a.useState)(``),[G,K]=(0,a.useState)(null),[Ge,Ke]=(0,a.useState)(!1),[q,qe]=(0,a.useState)([]),[Je,Ye]=(0,a.useState)(!1),[$e,J]=(0,a.useState)({}),[et,tt]=(0,a.useState)({}),[Y,rt]=(0,a.useState)(null),[it,at]=(0,a.useState)(null),ot=Me.trim(),st=ke.trim(),ct=Pe.trim(),lt=Ve.trim();(0,a.useEffect)(()=>{kt()},[h,f]),(0,a.useEffect)(()=>{tt(_?.formData??{})},[_]);let X=(0,a.useMemo)(()=>w.find(e=>ze(e,h)&&(e.status===`PENDING`||e.status===`IN_PROGRESS`))??null,[h,w]),Z=(0,a.useMemo)(()=>X&&_?_.workflowSnapshot.nodes.find(e=>e.id===X.nodeId)??null:null,[X,_]),ut=(0,a.useMemo)(()=>Z&&_?Ie(_.workflowSnapshot,Z):[],[Z,_]),dt=Z?.type===`userTask`&&Z.data.returnBehavior.allowReturn,ft=ut.find(e=>e.id===H)??ut[0]??null,pt=!!(_&&_.initiatorMemberId===h&&(_.state===`RUNNING`||_.state===`RETURNED`)),Q=!!(_&&_.initiatorMemberId===h&&_.state===`RETURNED`),mt=(0,a.useMemo)(()=>new Map(ge.map(e=>[e.memberId,e])),[ge]),ht=(0,a.useMemo)(()=>w.map(e=>({...e,assigneeLabel:Re(e,mt),key:e.id,nodeLabel:V(e.nodeId,_?.workflowSnapshot??null),statusLabel:Le(e.status)})),[_,mt,w]),gt=(0,a.useMemo)(()=>Te(ne),[ne]),_t=(0,a.useMemo)(()=>new Map(v.map(e=>[e.id,e])),[v]),vt=(0,a.useMemo)(()=>Ee(g,w,T,_?.workflowSnapshot??null,_?.state??`RUNNING`,mt,gt,_t,x),[g,_,mt,x,_t,gt,w,T]),yt=(0,a.useMemo)(()=>Oe(vt),[vt]),$=(0,a.useMemo)(()=>_?Ze(_.workflowSnapshot):null,[_]),bt=(0,a.useMemo)(()=>_&&$?Xe($,w,T,_.state):[],[_,$,w,T]),xt=(0,a.useMemo)(()=>$?Qe($):[],[$]),St=(0,a.useMemo)(()=>_?nt(_.workflowSnapshot):[],[_]),Ct=(0,a.useMemo)(()=>[{dataIndex:`nodeLabel`,key:`nodeLabel`,title:`節點`,width:180},{key:`assigneeMemberId`,title:`處理者`,render:e=>(0,s.jsx)(o.Typography,{component:`span`,variant:`body`,children:e.assigneeLabel}),width:180},{dataIndex:`statusLabel`,key:`statusLabel`,title:`狀態`,width:120},{key:`createdAt`,render:e=>(0,s.jsx)(o.Typography,{component:`span`,variant:`body`,children:n.t(e.createdAt)}),title:`建立時間`,width:220}],[]),wt=(0,a.useMemo)(()=>ie.map(e=>({attachment:e,createdAt:e.createdAt,filename:e.filename,id:e.id,key:e.id,mimeType:e.mimeType,sizeLabel:be(Number(e.sizeBytes))})),[ie]),Tt=(0,a.useMemo)(()=>[{dataIndex:`filename`,key:`filename`,title:`檔名`,width:260},{dataIndex:`mimeType`,key:`mimeType`,title:`類型`,width:180},{dataIndex:`sizeLabel`,key:`sizeLabel`,title:`大小`,width:120},{key:`createdAt`,render:e=>(0,s.jsx)(o.Typography,{component:`span`,variant:`body`,children:n.t(e.createdAt)}),title:`上傳時間`,width:220}],[]),Et=(0,a.useMemo)(()=>({render:e=>[...e.mimeType===`application/pdf`?[{icon:l.FileSearchIcon,iconType:`leading`,name:`預覽`,onClick:()=>{Mt(e.attachment)}}]:[],{icon:l.DownloadIcon,iconType:`leading`,name:`下載`,onClick:()=>{jt(e.attachment)}}],variant:`base-secondary`,width:160}),[]),Dt=(0,a.useMemo)(()=>v.map(e=>({algorithm:e.algorithm,hashLabel:xe(e.signedPayloadHash),key:e.id,keyVersion:e.keyVersion,signedAtLabel:n.t(e.signedAt),signerMemberId:e.signerMemberId})),[v]),Ot=(0,a.useMemo)(()=>[{dataIndex:`signerMemberId`,key:`signerMemberId`,title:`簽章者`,width:160},{dataIndex:`algorithm`,key:`algorithm`,title:`演算法`,width:150},{dataIndex:`keyVersion`,key:`keyVersion`,title:`Key 版本`,width:100},{dataIndex:`hashLabel`,key:`hashLabel`,title:`Payload Hash`,width:180},{dataIndex:`signedAtLabel`,key:`signedAtLabel`,title:`簽章時間`,width:220}],[]);async function kt(){De(!0),O(null);try{let e=await(0,c.readApprovalInstance)(f);ee(e.activityLogs),te(e.instance),fe(e.tasks),he(e.workflowTokens);let[t,n,r,i]=await Promise.all([we(e.tasks),Ce(e),(0,c.listAttachments)(e.instance.id),(0,c.readInstanceSignatures)(e.instance.id)]);re(t),ye(n),ae(r),b(i.signatures),C(i.verification)}catch(e){O(E(e))}finally{De(!1)}}async function At(e,t){if(!h)throw Error(`尚未登入,無法上傳附件`);return{id:(await(0,c.uploadAttachment)({file:t,formFieldPath:`form.${e.fieldKey}`})).id}}async function jt(e){if(!h)return;let t=await(0,c.readAttachmentDownloadUrl)({id:e.id});window.open(t,`_blank`,`noopener,noreferrer`)}async function Mt(e){if(!h)return;let t=await(0,c.readAttachmentPreviewUrl)({id:e.id});rt(e),at(t)}async function Nt({action:e,comment:t,returnToNodeId:n=null,transferToMemberId:r=null}){if(!(!h||!X)){j(!0),O(null);try{await(0,c.decideTask)({action:e,comment:t,decidedByMemberId:h,returnToNodeId:n,taskId:X.id,transferToMemberId:r}),R(!1),B(!1),Ye(!1),F(``),z(``),W(``),K(null),U(null),L(null),await kt()}catch(e){O(E(e))}finally{j(!1)}}}function Pt(){F(``),L(null),R(!0)}function Ft(){A||(R(!1),F(``),L(null))}function It(){z(``),U(ut[0]?.id??null),B(!0)}function Lt(){A||(B(!1),z(``),U(null))}function Rt(){W(``),K(null),Ye(!0),Bt(``)}function zt(){A||(Ye(!1),W(``),K(null))}async function Bt(e){Ke(!0);try{qe((await(0,c.searchMembers)(e)).filter(e=>e.memberId!==h).map(He))}catch(e){O(E(e))}finally{Ke(!1)}}async function Vt(){if(!ot){L(`請輸入拒絕原因`);return}await Nt({action:`REJECTED`,comment:ot})}async function Ht(){if(!G){O(`請選擇轉派對象`);return}await Nt({action:`TRANSFERRED`,comment:lt||null,transferToMemberId:G.id})}async function Ut(){await Nt({action:`RETURNED`,comment:ct||null,returnToNodeId:ft?.id??null})}async function Wt(){if(!(!h||!_||!pt)){if(j(!0),O(null),J({}),_.formDefinitionSnapshot.schema&&_.formDefinitionSnapshot.uiSchema){let e=(0,m.validateFormRendererValues)({schema:_.formDefinitionSnapshot.schema,uiSchema:_.formDefinitionSnapshot.uiSchema,values:et});if(!e.valid){J(e.errors),O(`請先補齊必填欄位。`),e.firstInvalidFieldKey&&(0,m.focusFormRendererField)(e.firstInvalidFieldKey),j(!1);return}}try{await(0,c.cancelApprovalInstance)({cancelledByMemberId:h,comment:st||null,instanceId:_.id}),Ae(``),P(!1),await kt()}catch(e){O(E(e))}finally{j(!1)}}}async function Gt(){if(!(!h||!_||!Q)){j(!0),O(null);try{await(0,c.resubmitApprovalInstance)({formData:et,initiatorMemberId:h,instanceId:_.id,title:_.title}),await kt()}catch(e){O(E(e))}finally{j(!1)}}}return(0,s.jsxs)(o.Layout,{children:[(0,s.jsx)(e.t,{activeHref:`/inbox`}),(0,s.jsxs)(o.Layout.Main,{children:[(0,s.jsx)(o.PageHeader,{children:(0,s.jsxs)(u.default,{description:_?`${Be(_.state)} · ${n.t(_.startedAt)}`:`載入案件內容。`,title:_?.title??`簽核案件`,children:[_?(0,s.jsx)(o.Button,{"aria-label":`查看流程圖`,icon:l.ShareIcon,iconType:`icon-only`,onClick:()=>N(!0),title:`查看流程圖`,variant:`base-secondary`,children:`流程圖`}):null,pt?(0,s.jsx)(o.Button,{disabled:A,icon:l.DangerousOutlineIcon,iconType:`leading`,onClick:()=>P(!0),variant:`destructive-secondary`,children:`取消案件`}):null,X?(0,s.jsxs)(s.Fragment,{children:[dt?(0,s.jsx)(o.Button,{disabled:A,icon:l.RefreshCcwIcon,iconType:`leading`,onClick:It,variant:`base-secondary`,children:`退回`}):null,(0,s.jsx)(o.Button,{disabled:A,icon:l.UserIcon,iconType:`leading`,onClick:Rt,variant:`base-secondary`,children:`轉派`}),(0,s.jsx)(o.Button,{disabled:A,icon:l.DangerousOutlineIcon,iconType:`leading`,onClick:Pt,variant:`destructive-secondary`,children:`拒絕`}),(0,s.jsx)(o.Button,{disabled:A,icon:l.CheckedIcon,iconType:`leading`,onClick:()=>void Nt({action:`APPROVED`,comment:null}),variant:`base-primary`,children:`同意`})]}):null]})}),(0,s.jsxs)(o.SectionGroup,{children:[(0,s.jsx)(o.Section,{children:(0,s.jsxs)(`div`,{style:y,children:[D?(0,s.jsx)(o.Typography,{color:`text-error`,variant:`body`,children:D}):null,k?(0,s.jsx)(o.Typography,{color:`text-neutral`,variant:`body`,children:`載入中...`}):null,_?.formDefinitionSnapshot.schema&&_.formDefinitionSnapshot.uiSchema?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.t,{errors:$e,onChange:e=>{tt(e),J({})},onUploadAttachment:Q?At:void 0,readonly:!Q,schema:_.formDefinitionSnapshot.schema,uiSchema:_.formDefinitionSnapshot.uiSchema,value:Q?et:_.formData}),Q?(0,s.jsx)(`div`,{style:se,children:(0,s.jsx)(o.Button,{disabled:A,icon:l.RefreshCcwIcon,iconType:`leading`,onClick:()=>void Gt(),variant:`base-primary`,children:`重新送出`})}):null]}):(0,s.jsx)(o.Typography,{color:`text-neutral`,variant:`body`,children:`此案件沒有可顯示的表單快照。`})]})}),(0,s.jsx)(o.Section,{children:(0,s.jsxs)(`div`,{style:y,children:[(0,s.jsx)(o.Typography,{component:`h2`,variant:`h3`,children:`附件`}),wt.length>0?(0,s.jsx)(o.Table,{actions:Et,columns:Tt,dataSource:wt,fullWidth:!0}):(0,s.jsx)(o.Typography,{color:`text-neutral`,variant:`body`,children:`此案件沒有附件。`})]})}),(0,s.jsxs)(o.Section,{children:[(0,s.jsx)(o.Typography,{component:`h2`,variant:`h3`,children:`任務`}),(0,s.jsx)(o.Table,{columns:Ct,dataSource:ht,fullWidth:!0})]}),(0,s.jsx)(o.Section,{children:(0,s.jsxs)(`div`,{style:y,children:[(0,s.jsx)(o.Typography,{component:`h2`,variant:`h3`,children:`簽章`}),(0,s.jsx)(o.Typography,{color:x?.valid?`text-success`:`text-error`,variant:`body`,children:x?x.valid?`簽章鏈已驗證,共 ${x.checkedCount} 筆。`:`簽章鏈驗證失敗:${x.errors.join(`、`)}`:`尚無簽章紀錄。`}),Dt.length>0?(0,s.jsx)(o.Table,{columns:Ot,dataSource:Dt,fullWidth:!0}):null]})}),(0,s.jsx)(o.Section,{children:(0,s.jsxs)(`div`,{style:y,children:[(0,s.jsx)(o.Typography,{component:`h2`,variant:`h3`,children:`歷程`}),vt.length>0?(0,s.jsx)(o.Stepper,{currentStep:yt,orientation:`vertical`,type:`dot`,children:vt.map(e=>(0,s.jsx)(Se,{descriptionParts:e.descriptionParts,error:e.error,forcePending:e.forcePending,title:e.title},e.id))}):(0,s.jsx)(o.Typography,{color:`text-neutral`,variant:`body`,children:`尚無歷程紀錄。`})]})})]}),_?(0,s.jsx)(o.Modal,{modalType:`standard`,onClose:()=>N(!1),open:M,showModalHeader:!0,size:`wide`,supportingText:`${Be(_.state)} · ${n.t(_.startedAt)}`,title:`流程圖`,children:(0,s.jsxs)(`div`,{style:ce,children:[(0,s.jsx)(`div`,{style:de,children:(0,s.jsxs)(d.ReactFlow,{edges:xt,fitView:!0,fitViewOptions:{padding:.18},maxZoom:1.2,minZoom:.2,nodes:bt,nodesDraggable:!1,nodesFocusable:!1,nodeTypes:ve,panOnDrag:!0,proOptions:{hideAttribution:!0},children:[(0,s.jsx)(d.Background,{}),(0,s.jsx)(d.Controls,{showInteractive:!1})]})}),St.length>0?(0,s.jsx)(`div`,{style:pe,children:St.map(e=>(0,s.jsx)(`span`,{style:me,children:e},e))}):null]})}):null,(0,s.jsx)(o.Modal,{modalType:`standard`,onClose:()=>{rt(null),at(null)},open:!!(Y&&it),showModalHeader:!0,size:`wide`,supportingText:Y?.filename??void 0,title:`PDF 預覽`,children:it?(0,s.jsx)(oe,{filename:Y?.filename??`PDF 預覽`,fileUrl:it,onDownload:Y?()=>void jt(Y):void 0}):null}),(0,s.jsx)(o.Modal,{cancelText:`保留案件`,confirmButtonProps:{variant:`destructive-primary`},confirmText:`確認取消`,loading:A,modalStatusType:`error`,modalType:`standard`,onCancel:()=>P(!1),onClose:()=>P(!1),onConfirm:()=>void Wt(),open:je,showModalFooter:!0,showModalHeader:!0,supportingText:`取消後會關閉目前待簽任務與候選簽核人。`,title:`取消案件`,children:(0,s.jsxs)(`div`,{style:y,children:[(0,s.jsxs)(o.Typography,{variant:`body`,children:[`確定要取消「`,_?.title??``,`」嗎?`]}),(0,s.jsx)(r.t,{label:`取消原因`,name:`cancelComment`,children:(0,s.jsx)(o.Textarea,{onChange:e=>Ae(e.target.value),placeholder:`可填寫取消原因`,resize:`vertical`,rows:3,value:ke})})]})}),(0,s.jsx)(o.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!ot,variant:`destructive-primary`},confirmText:`送出拒絕`,loading:A,modalStatusType:`error`,modalType:`standard`,onCancel:Ft,onClose:Ft,onConfirm:()=>void Vt(),open:Ne,showModalFooter:!0,showModalHeader:!0,size:`regular`,supportingText:`拒絕案件時必須留下原因,供發起人與後續追蹤查看。`,title:`拒絕原因`,children:(0,s.jsxs)(`div`,{style:le,children:[(0,s.jsx)(r.t,{label:`拒絕原因`,name:`rejectReason`,required:!0,children:(0,s.jsx)(o.Textarea,{autoFocus:!0,onChange:e=>{F(e.target.value),L(null)},placeholder:`請說明拒絕原因`,ref:_e,resize:`vertical`,rows:4,style:S,type:I?`error`:`default`,value:Me})}),I?(0,s.jsx)(o.Typography,{color:`text-error`,variant:`body`,children:I}):null]})}),(0,s.jsx)(o.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!G},confirmText:`送出轉派`,loading:A,modalType:`standard`,onCancel:zt,onClose:zt,onConfirm:()=>void Ht(),open:Je,showModalFooter:!0,showModalHeader:!0,size:`regular`,supportingText:`轉派後,原任務會保留轉派紀錄,新的待簽任務會指派給指定成員。`,title:`轉派簽核`,children:(0,s.jsxs)(`div`,{style:ue,children:[(0,s.jsx)(r.t,{label:`轉派對象`,name:`transferToMemberId`,required:!0,children:(0,s.jsx)(o.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的成員`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:`transfer-member-search`,spellCheck:!1},loading:Ge,loadingText:`搜尋成員中...`,mode:`single`,onChange:e=>K(Ue(e)),onSearch:Bt,onSearchTextChange:e=>K(We(e,q)),onVisibilityChange:e=>{e&&Bt(``)},options:[...q],placeholder:`搜尋姓名或信箱`,searchDebounceTime:300,value:G})}),(0,s.jsx)(r.t,{label:`轉派說明`,name:`transferComment`,children:(0,s.jsx)(o.Textarea,{onChange:e=>W(e.target.value),placeholder:`可補充轉派原因`,ref:_e,resize:`vertical`,rows:4,style:S,value:Ve})})]})}),(0,s.jsx)(o.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!ft},confirmText:`送出退回`,loading:A,modalType:`standard`,onCancel:Lt,onClose:Lt,onConfirm:()=>void Ut(),open:Fe,showModalFooter:!0,showModalHeader:!0,size:`regular`,supportingText:`退回後,流程會回到指定節點並等待重新處理。`,title:`退回簽核`,children:(0,s.jsxs)(`div`,{style:ue,children:[(0,s.jsx)(r.t,{label:`退回節點`,name:`returnTargetNodeId`,required:!0,children:(0,s.jsx)(o.Select,{clearable:!1,fullWidth:!0,onChange:e=>U(e?.id??null),options:[...ut],placeholder:`選擇退回節點`,value:ft})}),(0,s.jsx)(r.t,{label:`退回說明`,name:`returnComment`,children:(0,s.jsx)(o.Textarea,{onChange:e=>z(e.target.value),placeholder:`可補充需要修改的內容`,ref:_e,resize:`vertical`,rows:4,style:S,value:Pe})})]})})]})]})}function E(e){return e instanceof Error?e.message:`發生未知錯誤`}function be(e){return!Number.isFinite(e)||e<=0?`-`:e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`}function xe(e){return e.length>16?`${e.slice(0,12)}...`:e}function D(...e){return e.filter(e=>q(e??null)).join(` `)}var Se=(0,a.forwardRef)(function({className:e,descriptionParts:t,error:n,forcePending:r=!1,index:i=0,orientation:c,status:l=`pending`,title:u,type:d=`number`,...f},m){let h=r?`pending`:l;return(0,s.jsxs)(`div`,{...f,className:D(p.stepClasses.host,d===`dot`?p.stepClasses.dot:null,n&&h!==`processing`?p.stepClasses.error:null,c===`horizontal`?p.stepClasses.horizontal:null,d===`number`?p.stepClasses.number:null,h===`pending`?p.stepClasses.pending:null,h===`processing`?p.stepClasses.processing:null,n&&h===`processing`?p.stepClasses.processingError:null,!n&&h===`succeeded`?p.stepClasses.succeeded:null,c===`vertical`?p.stepClasses.vertical:null,e),ref:m,children:[d===`dot`?(0,s.jsx)(`span`,{className:D(p.stepClasses.statusIndicator,p.stepClasses.statusIndicatorDot)}):(0,s.jsx)(`span`,{className:p.stepClasses.statusIndicator,children:i+1}),(0,s.jsxs)(`div`,{className:p.stepClasses.textContainer,children:[(0,s.jsxs)(o.Typography,{className:p.stepClasses.title,variant:`label-primary-highlight`,children:[u,(0,s.jsx)(`span`,{className:p.stepClasses.titleConnectLine})]}),t.length>0?(0,s.jsx)(o.Typography,{className:p.stepClasses.description,variant:`caption`,children:t.map((e,t)=>(0,s.jsxs)(a.Fragment,{children:[t>0?` · `:null,O(e)]},`${e.type}-${t}`))}):null]})]})});function O(e){return e.type===`text`?e.text:e.type===`dangerText`?(0,s.jsx)(`span`,{style:ge,children:e.text}):e.email?(0,s.jsxs)(s.Fragment,{children:[e.prefix,`:`,(0,s.jsx)(o.Tooltip,{title:e.email,children:({onMouseEnter:t,onMouseLeave:n,ref:r})=>(0,s.jsx)(`span`,{"data-testid":e.memberId?`member-tooltip-${e.memberId}`:void 0,onMouseEnter:t,onMouseLeave:n,ref:r,style:he,children:e.label})})]}):`${e.prefix}:${e.label}`}async function Ce({activityLogs:e,tasks:t}){let n=[...new Set([...e.map(e=>e.actorMemberId),...t.map(e=>e.assigneeMemberId),...t.map(e=>e.originalAssigneeMemberId),...t.flatMap(e=>e.candidateMemberIds),...t.flatMap(e=>K(e.delegationChainJson).flatMap(e=>[e.from,e.to]))].filter(q))];try{return await(0,c.resolveMemberProfiles)(n)}catch{return[]}}async function we(e){return(await Promise.all(e.map(e=>(0,c.listTaskDecisions)(e.id)))).flat()}function Te(e){return e.reduce((e,t)=>{let n=e.get(t.taskId),r=!n||new Date(t.decidedAt).getTime()>new Date(n.decidedAt).getTime()?t:n;return new Map(e).set(t.taskId,r)},new Map)}function Ee(e,t,n,r,i,a,o,s,c){let l=e.filter(N).map(e=>{let t=Ne(e),n=B(e.nodeId,r);return{descriptionParts:[k(n?`節點:${n}`:`節點:全流程`),A(`操作者`,e.actorMemberId,a,`系統`),k(`時間:${Ve(e.createdAt)}`),...Fe(e,t,r,o,s,c,a)].filter(M),error:U(e,t),id:e.id,title:R(e.eventType,t)}}),u=t.filter(Je).map(e=>({descriptionParts:[k(`節點:${V(e.nodeId,r)}`),A(`處理者`,e.assigneeMemberId,a,`未指定`),k(`建立時間:${Ve(e.createdAt)}`)].filter(M),error:!1,id:`pending-task-${e.id}`,title:e.status===`IN_PROGRESS`?`簽核處理中`:`等待簽核處理`})),d=new Set([...e.filter(N).map(e=>e.nodeId),...t.map(e=>e.nodeId)].filter(q)),f=r?Ae(r,t,n,i,d).map(e=>({descriptionParts:[k(`${J(e.type)} · 尚未抵達`)].filter(M),error:!1,forcePending:!0,id:`future-node-${e.id}`,title:L(e)})):[];return[...l,...u,...f]}function k(e){return q(e)?{text:e,type:`text`}:null}function De(e){return q(e)?{text:e,type:`dangerText`}:null}function A(e,t,n,r){let i=t?n.get(t):null;return{email:i?.email??null,label:i?.name??r,memberId:t,prefix:e,type:`member`}}function j(e,t){if(!e)return`-`;let n=t.get(e);return n?`${n.name}(${n.email})`:e}function M(e){return!!e}function Oe(e){let t=e.findIndex(e=>e.id.startsWith(`pending-task-`)||e.id.startsWith(`future-node-`));return t===-1?e.length:t}function N(e){return e.eventType===`INSTANCE_STARTED`||e.eventType===`TASK_DECIDED`||e.eventType===`SLA_TRIGGERED`}function ke(e,t,n,r,i){if(e.type===`startEvent`||i.has(e.id))return!1;if(r===`REJECTED`)return!0;let a=$e(e,t,n,r);return a.tone===`neutral`||a.tone===`waiting`}function Ae(e,t,n,r,i){if(r!==`RUNNING`&&r!==`REJECTED`)return[];let a=e.nodes.filter(e=>ke(e,t,n,r,i)),o=je(e,a,t,n,i),s=new Map(e.nodes.map((e,t)=>[e.id,t]));return a.filter(e=>o.has(e.id)).sort((e,t)=>{let n=o.get(e.id)??0,r=o.get(t.id)??0;return n===r?e.position.x===t.position.x?e.position.y===t.position.y?(s.get(e.id)??0)-(s.get(t.id)??0):e.position.y-t.position.y:e.position.x-t.position.x:n-r})}function je(e,t,n,r,i){let a=new Set(t.map(e=>e.id)),o=e.edges.reduce((e,t)=>{let n=[...e.get(t.source)??[],t.target];return new Map(e).set(t.source,n)},new Map);return P(e,n,r,i).reduce((e,t)=>I(e,Me(t,o,a)),new Map)}function P(e,t,n,r){let i=n.filter(e=>e.status===`ACTIVE`||e.status===`WAITING`).map(e=>e.currentNodeId),a=t.filter(Je).map(e=>e.nodeId),o=e.nodes.filter(e=>r.has(e.id)).map(e=>e.id),s=[...new Set([...i,...a,...o])],c=e.nodes.filter(e=>e.type===`startEvent`).map(e=>e.id);return s.length>0?s:c}function Me(e,t,n){return F([{distance:0,nodeId:e}],t,n)}function F(e,t,n,r=new Set,i=new Map){let[a,...o]=e;if(!a)return i;if(r.has(a.nodeId))return F(o,t,n,r,i);let s=new Set(r).add(a.nodeId),c=n.has(a.nodeId)?new Map(i).set(a.nodeId,Math.min(i.get(a.nodeId)??a.distance,a.distance)):i;return F([...o,...(t.get(a.nodeId)??[]).map(e=>({distance:a.distance+1,nodeId:e}))],t,n,s,c)}function I(e,t){return[...t.entries()].reduce((e,[t,n])=>new Map(e).set(t,Math.min(e.get(t)??n,n)),e)}function L(e){return e.type===`userTask`?`未來簽核:${e.data.label}`:e.type===`serviceTask`?`未來知會:${e.data.label}`:e.type===`exclusiveGateway`?`未來分流:${e.data.label}`:e.type===`parallelGateway`?`未來匯合:${e.data.label}`:e.type===`endEvent`?`流程完成:${e.data.label}`:`未來節點:${e.data.label}`}function Ne(e){try{let t=JSON.parse(e.payloadJson);return qe(t)?t:{}}catch{return{}}}function R(e,t){return e===`INSTANCE_STARTED`?`案件已發起`:e===`TOKEN_CREATED`?`流程路徑已建立`:e===`ENGINE_PROCESS_REQUESTED`?`流程引擎已處理`:e===`TOKEN_ADVANCED`?`流程已前進`:e===`TASK_CREATED`?`待簽任務已建立`:e===`TASK_DECIDED`?Pe(W(t,`action`)):e===`SLA_TRIGGERED`?`時限提醒已觸發`:e}function Pe(e){return e===`APPROVED`?`已同意`:e===`REJECTED`?`已拒絕`:e===`RETURNED`?`已退回`:e===`TRANSFERRED`?`已轉派`:`簽核已決議`}function z(e,t,n,r){if(e.eventType===`TASK_CREATED`){let e=W(t,`assigneeMemberId`),n=W(t,`originalAssigneeMemberId`);if(!e){let e=G(t,`candidateMemberIds`);return e.length?`候選簽核人:${e.map(e=>j(e,r)).join(`、`)}`:null}let i=j(e,r),a=j(n,r);return n&&n!==e?`待簽人:${i}(原簽核人:${a})`:`待簽人:${i}`}if(e.eventType===`TASK_DECIDED`){let e=W(t,`action`),n=W(t,`comment`),i=e?`決議:${H(e)}`:null,a=W(t,`transferToMemberId`);return e===`REJECTED`&&n?[i,`拒絕原因:${n}`].filter(q).join(` · `):e===`TRANSFERRED`?[i,`轉派給:${j(a,r)}`].filter(q).join(` · `):i}if(e.eventType===`TOKEN_ADVANCED`){let e=W(t,`action`);if(e)return`流程結果:${H(e)}`;let r=Ke(t,`arrivedCount`),i=Ke(t,`requiredCount`);if(r!==null&&i!==null)return`等待匯合:${r}/${i}`;let a=W(t,`fromNodeId`),o=W(t,`toNodeId`);if(a&&o)return`由 ${V(a,n)} 前進至 ${V(o,n)}`}if(e.eventType===`ENGINE_PROCESS_REQUESTED`){let e=W(t,`state`);return e?`案件狀態:${Be(e)}`:null}return null}function Fe(e,t,n,r,i,a,o){if(e.eventType!==`TASK_DECIDED`)return[k(z(e,t,n,o))].filter(M);let s=e.taskId?r.get(e.taskId):null,c=W(t,`action`)??s?.action??null,l=W(t,`comment`)??s?.comment??null,u=W(t,`transferToMemberId`)??s?.transferToMemberId??null,d=W(t,`signatureId`)??s?.signatureId??null,f=d?i.get(d):null;return[k(c?`決議:${H(c)}`:null),c===`REJECTED`?De(`拒絕原因:${l??`-`}`):null,c===`RETURNED`?k(`退回說明:${l??`-`}`):null,c===`TRANSFERRED`?k(`轉派給:${j(u,o)}`):null,c===`TRANSFERRED`?k(`轉派說明:${l??`-`}`):null,f?k(a?.valid?`簽章:已驗證(${xe(f.signedPayloadHash)})`:`簽章:待檢查(${xe(f.signedPayloadHash)})`):null].filter(M)}function B(e,t){return e?V(e,t):null}function V(e,t){return t?.nodes.find(t=>t.id===e)?.data.label??e}function Ie(e,t){if(t.type!==`userTask`||!t.data.returnBehavior.allowReturn)return[];if(t.data.returnBehavior.allowedTargets===`ANY`)return e.nodes.filter(e=>e.id!==t.id).map(e=>({id:e.id,name:`${e.data.label}(${J(e.type)})`}));let n=t.data.returnBehavior.allowedTargets===`INITIATOR`?e.nodes.find(e=>e.type===`startEvent`)?.id:e.edges.find(e=>e.target===t.id)?.source,r=e.nodes.find(e=>e.id===n);return r?[{id:r.id,name:`${r.data.label}(${J(r.type)})`}]:[]}function H(e){return e===`APPROVED`?`同意`:e===`REJECTED`?`拒絕`:e===`RETURNED`?`退回`:e===`TRANSFERRED`?`轉派`:e}function Le(e){return e===`PENDING`?`待處理`:e===`IN_PROGRESS`?`處理中`:e===`COMPLETED`?`已完成`:e===`CANCELLED`?`已取消`:e===`TRANSFERRED`?`已轉派`:e}function Re(e,t=new Map){let n=K(e.delegationChainJson);if(!e.assigneeMemberId)return e.candidateMemberIds.length?`候選 ${e.candidateMemberIds.map(e=>j(e,t)).join(`、`)}`:`未指定`;let r=j(e.assigneeMemberId,t),i=j(e.originalAssigneeMemberId,t);return n.length===0||e.originalAssigneeMemberId===e.assigneeMemberId?r:`${r}(原:${i})`}function ze(e,t){return t?e.assigneeMemberId===t||e.candidateMemberIds.includes(t):!1}function Be(e){return e===`APPROVED`?`已同意`:e===`CANCELLED`?`已取消`:e===`DRAFT`?`草稿`:e===`EXPIRED`?`已逾期`:e===`REJECTED`?`已拒絕`:e===`RETURNED`?`已退回`:e===`RUNNING`?`進行中`:e}function U(e,t){return e.eventType===`SLA_TRIGGERED`||W(t,`action`)===`REJECTED`||W(t,`instanceState`)===`REJECTED`}function Ve(e){return n.t(e)}function W(e,t){let n=e[t];return typeof n==`string`?n:null}function G(e,t){let n=e[t];return Array.isArray(n)?n.filter(e=>typeof e==`string`):[]}function He(e){return{email:e.email,id:e.memberId,name:`${e.name} · ${e.email}`}}function Ue(e){if(!qe(e))return null;let t=e.email,n=e.id,r=e.name;return typeof n==`string`&&typeof r==`string`?{email:typeof t==`string`?t:null,id:n,name:r}:null}function We(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 K(e){try{let t=JSON.parse(e);return Array.isArray(t)?t.map(e=>qe(e)?Ge(e):null).filter(e=>e!==null):[]}catch{return[]}}function Ge(e){let t=W(e,`from`),n=W(e,`to`),r=W(e,`reason`);return!t||!n||!r?null:{from:t,reason:r,ruleId:W(e,`ruleId`),to:n}}function Ke(e,t){let n=e[t];return typeof n==`number`?n:null}function q(e){return typeof e==`string`&&e.trim().length>0}function qe(e){return typeof e==`object`&&!!e}function Je(e){return e.status===`PENDING`||e.status===`IN_PROGRESS`}function Ye({data:e}){return(0,s.jsxs)(`div`,{style:et(e.tone),children:[(0,s.jsx)(d.Handle,{isConnectable:!1,position:d.Position.Left,style:T,type:`target`}),(0,s.jsx)(o.Typography,{component:`span`,ellipsis:!0,title:e.label,variant:`label-primary`,children:e.label}),(0,s.jsx)(`span`,{style:tt(e.tone),children:e.statusLabel}),(0,s.jsx)(`span`,{title:e.secondaryLabel,style:fe,children:e.secondaryLabel||e.kindLabel}),(0,s.jsx)(d.Handle,{isConnectable:!1,position:d.Position.Right,style:T,type:`source`})]})}function Xe(e,t,n,r){return e.nodes.map(e=>{let i=$e(e,t,n,r);return{data:{kindLabel:J(e.type),label:e.data.label,secondaryLabel:i.secondaryLabel,statusLabel:i.statusLabel,tone:i.tone},id:e.id,position:e.position,sourcePosition:d.Position.Right,targetPosition:d.Position.Left,type:`workflowRuntime`}})}function Ze(e){let t=new f.graphlib.Graph;return t.setDefaultEdgeLabel(()=>({})),t.setGraph({nodesep:56,rankdir:`LR`,ranksep:120}),e.nodes.forEach(e=>{t.setNode(e.id,{height:x,width:b})}),e.edges.forEach(e=>{t.setEdge(e.source,e.target)}),f.layout(t),{...e,nodes:e.nodes.map(e=>{let n=t.node(e.id);return n?{...e,position:{x:n.x-b/2,y:n.y-x/2}}:e})}}function Qe(e){return e.edges.map(e=>{let t=Y(e);return{animated:!1,id:e.id,label:t,labelBgBorderRadius:6,labelBgPadding:[8,4],labelBgStyle:{fill:e.data.isDefault?`#f8fafc`:`#eff6ff`,stroke:e.data.isDefault?`#64748b`:`#2563eb`,strokeWidth:1},labelShowBg:!!t,labelStyle:{fill:e.data.isDefault?`#475569`:`#2563eb`,fontSize:12,fontWeight:600},source:e.source,style:{stroke:`#475569`,strokeWidth:1.5},target:e.target,type:e.type??`smoothstep`}})}function $e(e,t,n,r){let i=t.filter(t=>t.nodeId===e.id),a=i.find(e=>e.status===`PENDING`||e.status===`IN_PROGRESS`),o=i.find(e=>e.status===`CANCELLED`),s=i.find(e=>e.status===`COMPLETED`),c=n.filter(t=>t.currentNodeId===e.id),l=c.find(e=>e.status===`ACTIVE`),u=c.find(e=>e.status===`WAITING`);return a?{secondaryLabel:`處理者 ${Re(a)}`,statusLabel:`待處理`,tone:`current`}:o?{secondaryLabel:`已取消 ${Re(o)}`,statusLabel:`已取消`,tone:`cancelled`}:s?{secondaryLabel:`已完成 ${Re(s)}`,statusLabel:`已完成`,tone:`completed`}:l?{secondaryLabel:`token ${l.id}`,statusLabel:`執行中`,tone:`current`}:u?{secondaryLabel:`token ${u.id}`,statusLabel:`等待前置`,tone:`waiting`}:e.type===`startEvent`?{secondaryLabel:`流程已發起`,statusLabel:`已發起`,tone:`completed`}:e.type===`endEvent`&&r!==`RUNNING`?{secondaryLabel:r,statusLabel:r===`REJECTED`?`已拒絕`:`已完成`,tone:r===`REJECTED`?`cancelled`:`completed`}:{secondaryLabel:J(e.type),statusLabel:`未抵達`,tone:`neutral`}}function J(e){return e===`startEvent`?`開始`:e===`endEvent`?`完成`:e===`userTask`?`簽核節點`:e===`serviceTask`?`知會節點`:e===`exclusiveGateway`?`條件分流`:`平行處理`}function et(e){return e===`current`?{...C,border:`1px solid var(--mzn-color-primary, #0057ff)`,boxShadow:`0 0 0 3px rgba(0, 87, 255, 0.14)`}:e===`completed`?{...C,border:`1px solid #16a34a`}:e===`cancelled`?{...C,border:`1px solid #dc2626`,opacity:.72}:e===`waiting`?{...C,border:`1px dashed #64748b`}:C}function tt(e){let t=w;return e===`current`?{...t,background:`#eff6ff`,color:`#2563eb`}:e===`completed`?{...t,background:`#f0fdf4`,color:`#15803d`}:e===`cancelled`?{...t,background:`#fef2f2`,color:`#dc2626`}:e===`waiting`?{...t,background:`#f8fafc`,color:`#475569`}:{...t,background:`#f1f5f9`,color:`#64748b`}}function Y(e){return e.data.label?e.data.label:e.data.isDefault?`其他情況`:e.data.condition??``}function nt(e){return e.edges.map(Y).filter(e=>e.trim().length>0)}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return ye}});
|
|
2
|
-
//# sourceMappingURL=InstanceDetailView-l_kNDCz2.cjs.map
|