@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-l_kNDCz2.cjs","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,190 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { r as e } from "./router-adapter-BdHZXLS3.js";
|
|
3
|
-
import { n as t } from "./auth-provider-TTO9eNZV.js";
|
|
4
|
-
import { t as n } from "./format-date-time-CB-LxzqT.js";
|
|
5
|
-
import { t as r } from "./app-navigation-CATITRM7.js";
|
|
6
|
-
import { t as i } from "./FormRendererView-DrHsuSVo.js";
|
|
7
|
-
import { Suspense as a, useEffect as o, useMemo as s, useState as c } from "react";
|
|
8
|
-
import { Button as l, Layout as u, PageHeader as d, Section as f, SectionGroup as p, Table as m, Typography as h } from "@mezzanine-ui/react";
|
|
9
|
-
import { jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
10
|
-
import { listLaunchableTemplates as v, readFormDataCaseTitle as y, readLaunchContext as b, submitApprovalInstance as x, uploadAttachment as S } from "@rytass/bpm-core-client/workflow";
|
|
11
|
-
import { CheckedIcon as C } from "@mezzanine-ui/icons";
|
|
12
|
-
import w from "@mezzanine-ui/react/ContentHeader";
|
|
13
|
-
import { focusFormRendererField as T, validateFormRendererValues as E } from "@rytass/bpm-core-client/form";
|
|
14
|
-
//#region src/views/instances/new/InstanceNewView.tsx
|
|
15
|
-
var D = {
|
|
16
|
-
display: "grid",
|
|
17
|
-
gap: 16
|
|
18
|
-
};
|
|
19
|
-
function O(e = {}) {
|
|
20
|
-
return /* @__PURE__ */ g(a, {
|
|
21
|
-
fallback: /* @__PURE__ */ g(A, {}),
|
|
22
|
-
children: /* @__PURE__ */ g(k, { templateId: e.templateId ?? void 0 })
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
function k({ templateId: a }) {
|
|
26
|
-
let O = e(), { member: k } = t(), A = k?.memberId ?? null, M = a ?? O.searchParams?.().get("templateId") ?? null, [N, P] = c(null), [F, I] = c({}), [L, R] = c([]), [z, B] = c(null), [V, H] = c({}), [U, W] = c(!0), [G, K] = c(!1);
|
|
27
|
-
o(() => {
|
|
28
|
-
if (!M) {
|
|
29
|
-
X();
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
Z(M);
|
|
33
|
-
}, [M]);
|
|
34
|
-
let q = s(() => L.map((e) => ({
|
|
35
|
-
...e,
|
|
36
|
-
key: e.id,
|
|
37
|
-
updatedAt: n(e.updatedAt),
|
|
38
|
-
versionLabel: `v${e.version}`
|
|
39
|
-
})), [L]), J = s(() => [
|
|
40
|
-
{
|
|
41
|
-
dataIndex: "name",
|
|
42
|
-
key: "name",
|
|
43
|
-
title: "模板名稱",
|
|
44
|
-
width: 240
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
dataIndex: "versionLabel",
|
|
48
|
-
key: "versionLabel",
|
|
49
|
-
title: "發布版本",
|
|
50
|
-
width: 120
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
dataIndex: "updatedAt",
|
|
54
|
-
key: "updatedAt",
|
|
55
|
-
title: "更新時間",
|
|
56
|
-
width: 220
|
|
57
|
-
}
|
|
58
|
-
], []), Y = s(() => ({
|
|
59
|
-
render: (e) => [{
|
|
60
|
-
name: "發起",
|
|
61
|
-
onClick: () => O.push(`/instances/new?templateId=${e.id}`),
|
|
62
|
-
variant: "base-primary"
|
|
63
|
-
}],
|
|
64
|
-
variant: "base-secondary",
|
|
65
|
-
width: 88
|
|
66
|
-
}), [O]);
|
|
67
|
-
async function X() {
|
|
68
|
-
W(!0), B(null), P(null);
|
|
69
|
-
try {
|
|
70
|
-
R(await v());
|
|
71
|
-
} catch (e) {
|
|
72
|
-
B(j(e));
|
|
73
|
-
} finally {
|
|
74
|
-
W(!1);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
async function Z(e) {
|
|
78
|
-
W(!0), B(null), R([]);
|
|
79
|
-
try {
|
|
80
|
-
P(await b(e));
|
|
81
|
-
} catch (e) {
|
|
82
|
-
B(j(e));
|
|
83
|
-
} finally {
|
|
84
|
-
W(!1);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
async function Q() {
|
|
88
|
-
if (!N || !A) return;
|
|
89
|
-
K(!0), B(null), H({});
|
|
90
|
-
let e = E({
|
|
91
|
-
schema: N.formVersion.schema,
|
|
92
|
-
uiSchema: N.formVersion.uiSchema,
|
|
93
|
-
values: F
|
|
94
|
-
});
|
|
95
|
-
if (!e.valid) {
|
|
96
|
-
H(e.errors), B("請先補齊必填欄位。"), e.firstInvalidFieldKey && T(e.firstInvalidFieldKey), K(!1);
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
try {
|
|
100
|
-
let e = await x({
|
|
101
|
-
formData: F,
|
|
102
|
-
initiatorMemberId: A,
|
|
103
|
-
templateId: N.template.id,
|
|
104
|
-
title: y({
|
|
105
|
-
fallbackTitle: N.template.name,
|
|
106
|
-
formData: F,
|
|
107
|
-
schema: N.formVersion.schema,
|
|
108
|
-
uiSchema: N.formVersion.uiSchema
|
|
109
|
-
})
|
|
110
|
-
});
|
|
111
|
-
O.push(`/instances/${e}`);
|
|
112
|
-
} catch (e) {
|
|
113
|
-
B(j(e));
|
|
114
|
-
} finally {
|
|
115
|
-
K(!1);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
async function $(e, t) {
|
|
119
|
-
if (!A) throw Error("尚未登入,無法上傳附件");
|
|
120
|
-
return { id: (await S({
|
|
121
|
-
file: t,
|
|
122
|
-
formFieldPath: `form.${e.fieldKey}`
|
|
123
|
-
})).id };
|
|
124
|
-
}
|
|
125
|
-
return /* @__PURE__ */ _(u, { children: [/* @__PURE__ */ g(r, { activeHref: "/" }), /* @__PURE__ */ _(u.Main, { children: [/* @__PURE__ */ g(d, { children: /* @__PURE__ */ g(w, {
|
|
126
|
-
description: N ? `${N.template.name} · 表單 v${N.formVersion.version}` : "選擇可發起的已發布模板後填寫表單內容。",
|
|
127
|
-
title: "發起簽核",
|
|
128
|
-
children: N ? /* @__PURE__ */ g(l, {
|
|
129
|
-
disabled: U || G,
|
|
130
|
-
icon: C,
|
|
131
|
-
iconType: "leading",
|
|
132
|
-
onClick: Q,
|
|
133
|
-
variant: "base-primary",
|
|
134
|
-
children: "送出"
|
|
135
|
-
}) : null
|
|
136
|
-
}) }), /* @__PURE__ */ g(p, { children: /* @__PURE__ */ g(f, { children: /* @__PURE__ */ _("div", {
|
|
137
|
-
style: D,
|
|
138
|
-
children: [
|
|
139
|
-
z ? /* @__PURE__ */ g(h, {
|
|
140
|
-
color: "text-error",
|
|
141
|
-
variant: "body",
|
|
142
|
-
children: z
|
|
143
|
-
}) : null,
|
|
144
|
-
U ? /* @__PURE__ */ g(h, {
|
|
145
|
-
color: "text-neutral",
|
|
146
|
-
variant: "body",
|
|
147
|
-
children: "載入中..."
|
|
148
|
-
}) : null,
|
|
149
|
-
N ? /* @__PURE__ */ g(i, {
|
|
150
|
-
errors: V,
|
|
151
|
-
maxWidth: 480,
|
|
152
|
-
onChange: (e) => {
|
|
153
|
-
I(e), H({});
|
|
154
|
-
},
|
|
155
|
-
onUploadAttachment: $,
|
|
156
|
-
schema: N.formVersion.schema,
|
|
157
|
-
singleColumn: !0,
|
|
158
|
-
uiSchema: N.formVersion.uiSchema,
|
|
159
|
-
value: F
|
|
160
|
-
}) : null,
|
|
161
|
-
!M && !U ? q.length > 0 ? /* @__PURE__ */ g(m, {
|
|
162
|
-
actions: Y,
|
|
163
|
-
columns: J,
|
|
164
|
-
dataSource: q,
|
|
165
|
-
fullWidth: !0
|
|
166
|
-
}) : /* @__PURE__ */ g(h, {
|
|
167
|
-
color: "text-neutral",
|
|
168
|
-
variant: "body",
|
|
169
|
-
children: "目前沒有可發起的已發布模板。"
|
|
170
|
-
}) : null
|
|
171
|
-
]
|
|
172
|
-
}) }) })] })] });
|
|
173
|
-
}
|
|
174
|
-
function A() {
|
|
175
|
-
return /* @__PURE__ */ _(u, { children: [/* @__PURE__ */ g(r, { activeHref: "/" }), /* @__PURE__ */ _(u.Main, { children: [/* @__PURE__ */ g(d, { children: /* @__PURE__ */ g(w, {
|
|
176
|
-
description: "選擇可發起的已發布模板後填寫表單內容。",
|
|
177
|
-
title: "發起簽核"
|
|
178
|
-
}) }), /* @__PURE__ */ g(p, { children: /* @__PURE__ */ g(f, { children: /* @__PURE__ */ g(h, {
|
|
179
|
-
color: "text-neutral",
|
|
180
|
-
variant: "body",
|
|
181
|
-
children: "載入中..."
|
|
182
|
-
}) }) })] })] });
|
|
183
|
-
}
|
|
184
|
-
function j(e) {
|
|
185
|
-
return e instanceof Error ? e.message : "發生未知錯誤";
|
|
186
|
-
}
|
|
187
|
-
//#endregion
|
|
188
|
-
export { O as t };
|
|
189
|
-
|
|
190
|
-
//# sourceMappingURL=InstanceNewView-B5hz-FWd.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InstanceNewView-B5hz-FWd.js","names":[],"sources":["../../src/views/instances/new/InstanceNewView.tsx"],"sourcesContent":["'use client';\n\nimport {\n CSSProperties,\n ReactElement,\n Suspense,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n Button,\n Layout,\n PageHeader,\n Section,\n SectionGroup,\n Table,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { CheckedIcon } from '@mezzanine-ui/icons';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { FormFieldDefinition } from '@rytass/bpm-core-shared/form';\nimport {\n focusFormRendererField,\n FormRendererValues,\n validateFormRendererValues,\n} from '@rytass/bpm-core-client/form';\nimport {\n LaunchContext,\n LaunchableTemplateRecord,\n listLaunchableTemplates,\n readFormDataCaseTitle,\n readLaunchContext,\n submitApprovalInstance,\n uploadAttachment,\n} from '@rytass/bpm-core-client/workflow';\nimport { formatDateTime } from '../../../lib/format-date-time';\nimport { useAuth } from '../../../lib/auth-provider';\nimport { useRouterAdapter } from '../../../lib/router-adapter';\nimport { AppNavigation } from '../../../components/app-navigation';\nimport { FormRenderer } from '../../forms/renderer/FormRendererView';\n\nconst FORM_SECTION_STYLE: CSSProperties = {\n display: 'grid',\n gap: 16,\n};\n\ntype LaunchableTemplateRow = Readonly<\n Record<string, unknown> &\n LaunchableTemplateRecord & {\n key: string;\n versionLabel: string;\n }\n>;\n\nexport interface InstanceNewViewProps {\n /**\n * Optional template id pre-selected via host router search params.\n * When omitted, the view reads `?templateId=` from\n * `useRouterAdapter().searchParams()`.\n */\n readonly templateId?: string | null;\n}\n\n/**\n * Framework-agnostic view for the BPM \"發起簽核\" launch page. Mechanical port\n * of `apps/client/src/app/instances/new/page.tsx` — picks a launchable\n * template and submits the launch form.\n */\nexport function InstanceNewView(\n props: InstanceNewViewProps = {},\n): ReactElement {\n return (\n <Suspense fallback={<NewApprovalInstanceLoading />}>\n <NewApprovalInstanceContent templateId={props.templateId ?? undefined} />\n </Suspense>\n );\n}\n\nfunction NewApprovalInstanceContent({\n templateId: templateIdProp,\n}: {\n readonly templateId?: string;\n}): ReactElement {\n const router = useRouterAdapter();\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const templateId =\n templateIdProp ?? router.searchParams?.().get('templateId') ?? null;\n const [context, setContext] = useState<LaunchContext | null>(null);\n const [formValues, setFormValues] = useState<FormRendererValues>({});\n const [templates, setTemplates] = useState<\n readonly LaunchableTemplateRecord[]\n >([]);\n const [error, setError] = useState<string | null>(null);\n const [formErrors, setFormErrors] = useState<\n Readonly<Record<string, string>>\n >({});\n const [loading, setLoading] = useState(true);\n const [submitting, setSubmitting] = useState(false);\n\n useEffect((): void => {\n if (!templateId) {\n void refreshTemplates();\n\n return;\n }\n\n void refreshContext(templateId);\n }, [templateId]);\n\n const rows = useMemo(\n (): LaunchableTemplateRow[] =>\n templates.map((template) => ({\n ...template,\n key: template.id,\n updatedAt: formatDateTime(template.updatedAt),\n versionLabel: `v${template.version}`,\n })),\n [templates],\n );\n const columns = useMemo(\n (): TableColumn<LaunchableTemplateRow>[] => [\n { dataIndex: 'name', key: 'name', title: '模板名稱', width: 240 },\n {\n dataIndex: 'versionLabel',\n key: 'versionLabel',\n title: '發布版本',\n width: 120,\n },\n {\n dataIndex: 'updatedAt',\n key: 'updatedAt',\n title: '更新時間',\n width: 220,\n },\n ],\n [],\n );\n const tableActions = useMemo(\n (): TableActions<LaunchableTemplateRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<LaunchableTemplateRow>['render']> => [\n {\n name: '發起',\n onClick: (): void =>\n router.push(`/instances/new?templateId=${record.id}`),\n variant: 'base-primary',\n },\n ],\n variant: 'base-secondary',\n width: 88,\n }),\n [router],\n );\n\n async function refreshTemplates(): Promise<void> {\n setLoading(true);\n setError(null);\n setContext(null);\n\n try {\n setTemplates(await listLaunchableTemplates());\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }\n\n async function refreshContext(nextTemplateId: string): Promise<void> {\n setLoading(true);\n setError(null);\n setTemplates([]);\n\n try {\n setContext(await readLaunchContext(nextTemplateId));\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }\n\n async function handleSubmit(): Promise<void> {\n if (!context || !currentMemberId) {\n return;\n }\n\n setSubmitting(true);\n setError(null);\n setFormErrors({});\n\n const validation = validateFormRendererValues({\n schema: context.formVersion.schema,\n uiSchema: context.formVersion.uiSchema,\n values: formValues,\n });\n\n if (!validation.valid) {\n setFormErrors(validation.errors);\n setError('請先補齊必填欄位。');\n\n if (validation.firstInvalidFieldKey) {\n focusFormRendererField(validation.firstInvalidFieldKey);\n }\n\n setSubmitting(false);\n\n return;\n }\n\n try {\n const instanceId = await submitApprovalInstance({\n formData: formValues,\n initiatorMemberId: currentMemberId,\n templateId: context.template.id,\n title: readFormDataCaseTitle({\n fallbackTitle: context.template.name,\n formData: formValues,\n schema: context.formVersion.schema,\n uiSchema: context.formVersion.uiSchema,\n }),\n });\n\n router.push(`/instances/${instanceId}`);\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setSubmitting(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 return (\n <Layout>\n <AppNavigation activeHref=\"/\" />\n\n <Layout.Main>\n <PageHeader>\n <ContentHeader\n description={\n context\n ? `${context.template.name} · 表單 v${context.formVersion.version}`\n : '選擇可發起的已發布模板後填寫表單內容。'\n }\n title=\"發起簽核\"\n >\n {context ? (\n <Button\n disabled={loading || submitting}\n icon={CheckedIcon}\n iconType=\"leading\"\n onClick={handleSubmit}\n variant=\"base-primary\"\n >\n 送出\n </Button>\n ) : null}\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section>\n <div style={FORM_SECTION_STYLE}>\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n\n {loading ? (\n <Typography color=\"text-neutral\" variant=\"body\">\n 載入中...\n </Typography>\n ) : null}\n\n {context ? (\n <FormRenderer\n errors={formErrors}\n maxWidth={480}\n onChange={(values): void => {\n setFormValues(values);\n setFormErrors({});\n }}\n onUploadAttachment={handleUploadAttachment}\n schema={context.formVersion.schema}\n singleColumn\n uiSchema={context.formVersion.uiSchema}\n value={formValues}\n />\n ) : null}\n\n {!templateId && !loading ? (\n rows.length > 0 ? (\n <Table\n actions={tableActions}\n columns={columns}\n dataSource={rows}\n fullWidth\n />\n ) : (\n <Typography color=\"text-neutral\" variant=\"body\">\n 目前沒有可發起的已發布模板。\n </Typography>\n )\n ) : null}\n </div>\n </Section>\n </SectionGroup>\n </Layout.Main>\n </Layout>\n );\n}\n\nfunction NewApprovalInstanceLoading(): ReactElement {\n return (\n <Layout>\n <AppNavigation activeHref=\"/\" />\n\n <Layout.Main>\n <PageHeader>\n <ContentHeader\n description=\"選擇可發起的已發布模板後填寫表單內容。\"\n title=\"發起簽核\"\n />\n </PageHeader>\n\n <SectionGroup>\n <Section>\n <Typography color=\"text-neutral\" variant=\"body\">\n 載入中...\n </Typography>\n </Section>\n </SectionGroup>\n </Layout.Main>\n </Layout>\n );\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use client";const e=require("./app-navigation-DAC5gFbG.cjs"),t=require("./router-adapter-BybHrCNP.cjs"),n=require("./auth-provider-D2P-qWmY.cjs"),r=require("./format-date-time-BQyH5U8z.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("@rytass/bpm-core-client/form");var f={display:`grid`,gap:16};function p(e={}){return(0,s.jsx)(a.Suspense,{fallback:(0,s.jsx)(h,{}),children:(0,s.jsx)(m,{templateId:e.templateId??void 0})})}function m({templateId:p}){let m=t.r(),{member:h}=n.n(),_=h?.memberId??null,v=p??m.searchParams?.().get(`templateId`)??null,[y,b]=(0,a.useState)(null),[x,S]=(0,a.useState)({}),[C,w]=(0,a.useState)([]),[T,E]=(0,a.useState)(null),[D,O]=(0,a.useState)({}),[k,A]=(0,a.useState)(!0),[j,M]=(0,a.useState)(!1);(0,a.useEffect)(()=>{if(!v){I();return}L(v)},[v]);let N=(0,a.useMemo)(()=>C.map(e=>({...e,key:e.id,updatedAt:r.t(e.updatedAt),versionLabel:`v${e.version}`})),[C]),P=(0,a.useMemo)(()=>[{dataIndex:`name`,key:`name`,title:`模板名稱`,width:240},{dataIndex:`versionLabel`,key:`versionLabel`,title:`發布版本`,width:120},{dataIndex:`updatedAt`,key:`updatedAt`,title:`更新時間`,width:220}],[]),F=(0,a.useMemo)(()=>({render:e=>[{name:`發起`,onClick:()=>m.push(`/instances/new?templateId=${e.id}`),variant:`base-primary`}],variant:`base-secondary`,width:88}),[m]);async function I(){A(!0),E(null),b(null);try{w(await(0,c.listLaunchableTemplates)())}catch(e){E(g(e))}finally{A(!1)}}async function L(e){A(!0),E(null),w([]);try{b(await(0,c.readLaunchContext)(e))}catch(e){E(g(e))}finally{A(!1)}}async function R(){if(!y||!_)return;M(!0),E(null),O({});let e=(0,d.validateFormRendererValues)({schema:y.formVersion.schema,uiSchema:y.formVersion.uiSchema,values:x});if(!e.valid){O(e.errors),E(`請先補齊必填欄位。`),e.firstInvalidFieldKey&&(0,d.focusFormRendererField)(e.firstInvalidFieldKey),M(!1);return}try{let e=await(0,c.submitApprovalInstance)({formData:x,initiatorMemberId:_,templateId:y.template.id,title:(0,c.readFormDataCaseTitle)({fallbackTitle:y.template.name,formData:x,schema:y.formVersion.schema,uiSchema:y.formVersion.uiSchema})});m.push(`/instances/${e}`)}catch(e){E(g(e))}finally{M(!1)}}async function z(e,t){if(!_)throw Error(`尚未登入,無法上傳附件`);return{id:(await(0,c.uploadAttachment)({file:t,formFieldPath:`form.${e.fieldKey}`})).id}}return(0,s.jsxs)(o.Layout,{children:[(0,s.jsx)(e.t,{activeHref:`/`}),(0,s.jsxs)(o.Layout.Main,{children:[(0,s.jsx)(o.PageHeader,{children:(0,s.jsx)(u.default,{description:y?`${y.template.name} · 表單 v${y.formVersion.version}`:`選擇可發起的已發布模板後填寫表單內容。`,title:`發起簽核`,children:y?(0,s.jsx)(o.Button,{disabled:k||j,icon:l.CheckedIcon,iconType:`leading`,onClick:R,variant:`base-primary`,children:`送出`}):null})}),(0,s.jsx)(o.SectionGroup,{children:(0,s.jsx)(o.Section,{children:(0,s.jsxs)(`div`,{style:f,children:[T?(0,s.jsx)(o.Typography,{color:`text-error`,variant:`body`,children:T}):null,k?(0,s.jsx)(o.Typography,{color:`text-neutral`,variant:`body`,children:`載入中...`}):null,y?(0,s.jsx)(i.t,{errors:D,maxWidth:480,onChange:e=>{S(e),O({})},onUploadAttachment:z,schema:y.formVersion.schema,singleColumn:!0,uiSchema:y.formVersion.uiSchema,value:x}):null,!v&&!k?N.length>0?(0,s.jsx)(o.Table,{actions:F,columns:P,dataSource:N,fullWidth:!0}):(0,s.jsx)(o.Typography,{color:`text-neutral`,variant:`body`,children:`目前沒有可發起的已發布模板。`}):null]})})})]})]})}function h(){return(0,s.jsxs)(o.Layout,{children:[(0,s.jsx)(e.t,{activeHref:`/`}),(0,s.jsxs)(o.Layout.Main,{children:[(0,s.jsx)(o.PageHeader,{children:(0,s.jsx)(u.default,{description:`選擇可發起的已發布模板後填寫表單內容。`,title:`發起簽核`})}),(0,s.jsx)(o.SectionGroup,{children:(0,s.jsx)(o.Section,{children:(0,s.jsx)(o.Typography,{color:`text-neutral`,variant:`body`,children:`載入中...`})})})]})]})}function g(e){return e instanceof Error?e.message:`發生未知錯誤`}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return p}});
|
|
2
|
-
//# sourceMappingURL=InstanceNewView-CdCsxQIu.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InstanceNewView-CdCsxQIu.cjs","names":[],"sources":["../../src/views/instances/new/InstanceNewView.tsx"],"sourcesContent":["'use client';\n\nimport {\n CSSProperties,\n ReactElement,\n Suspense,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n Button,\n Layout,\n PageHeader,\n Section,\n SectionGroup,\n Table,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { CheckedIcon } from '@mezzanine-ui/icons';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { FormFieldDefinition } from '@rytass/bpm-core-shared/form';\nimport {\n focusFormRendererField,\n FormRendererValues,\n validateFormRendererValues,\n} from '@rytass/bpm-core-client/form';\nimport {\n LaunchContext,\n LaunchableTemplateRecord,\n listLaunchableTemplates,\n readFormDataCaseTitle,\n readLaunchContext,\n submitApprovalInstance,\n uploadAttachment,\n} from '@rytass/bpm-core-client/workflow';\nimport { formatDateTime } from '../../../lib/format-date-time';\nimport { useAuth } from '../../../lib/auth-provider';\nimport { useRouterAdapter } from '../../../lib/router-adapter';\nimport { AppNavigation } from '../../../components/app-navigation';\nimport { FormRenderer } from '../../forms/renderer/FormRendererView';\n\nconst FORM_SECTION_STYLE: CSSProperties = {\n display: 'grid',\n gap: 16,\n};\n\ntype LaunchableTemplateRow = Readonly<\n Record<string, unknown> &\n LaunchableTemplateRecord & {\n key: string;\n versionLabel: string;\n }\n>;\n\nexport interface InstanceNewViewProps {\n /**\n * Optional template id pre-selected via host router search params.\n * When omitted, the view reads `?templateId=` from\n * `useRouterAdapter().searchParams()`.\n */\n readonly templateId?: string | null;\n}\n\n/**\n * Framework-agnostic view for the BPM \"發起簽核\" launch page. Mechanical port\n * of `apps/client/src/app/instances/new/page.tsx` — picks a launchable\n * template and submits the launch form.\n */\nexport function InstanceNewView(\n props: InstanceNewViewProps = {},\n): ReactElement {\n return (\n <Suspense fallback={<NewApprovalInstanceLoading />}>\n <NewApprovalInstanceContent templateId={props.templateId ?? undefined} />\n </Suspense>\n );\n}\n\nfunction NewApprovalInstanceContent({\n templateId: templateIdProp,\n}: {\n readonly templateId?: string;\n}): ReactElement {\n const router = useRouterAdapter();\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const templateId =\n templateIdProp ?? router.searchParams?.().get('templateId') ?? null;\n const [context, setContext] = useState<LaunchContext | null>(null);\n const [formValues, setFormValues] = useState<FormRendererValues>({});\n const [templates, setTemplates] = useState<\n readonly LaunchableTemplateRecord[]\n >([]);\n const [error, setError] = useState<string | null>(null);\n const [formErrors, setFormErrors] = useState<\n Readonly<Record<string, string>>\n >({});\n const [loading, setLoading] = useState(true);\n const [submitting, setSubmitting] = useState(false);\n\n useEffect((): void => {\n if (!templateId) {\n void refreshTemplates();\n\n return;\n }\n\n void refreshContext(templateId);\n }, [templateId]);\n\n const rows = useMemo(\n (): LaunchableTemplateRow[] =>\n templates.map((template) => ({\n ...template,\n key: template.id,\n updatedAt: formatDateTime(template.updatedAt),\n versionLabel: `v${template.version}`,\n })),\n [templates],\n );\n const columns = useMemo(\n (): TableColumn<LaunchableTemplateRow>[] => [\n { dataIndex: 'name', key: 'name', title: '模板名稱', width: 240 },\n {\n dataIndex: 'versionLabel',\n key: 'versionLabel',\n title: '發布版本',\n width: 120,\n },\n {\n dataIndex: 'updatedAt',\n key: 'updatedAt',\n title: '更新時間',\n width: 220,\n },\n ],\n [],\n );\n const tableActions = useMemo(\n (): TableActions<LaunchableTemplateRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<LaunchableTemplateRow>['render']> => [\n {\n name: '發起',\n onClick: (): void =>\n router.push(`/instances/new?templateId=${record.id}`),\n variant: 'base-primary',\n },\n ],\n variant: 'base-secondary',\n width: 88,\n }),\n [router],\n );\n\n async function refreshTemplates(): Promise<void> {\n setLoading(true);\n setError(null);\n setContext(null);\n\n try {\n setTemplates(await listLaunchableTemplates());\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }\n\n async function refreshContext(nextTemplateId: string): Promise<void> {\n setLoading(true);\n setError(null);\n setTemplates([]);\n\n try {\n setContext(await readLaunchContext(nextTemplateId));\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }\n\n async function handleSubmit(): Promise<void> {\n if (!context || !currentMemberId) {\n return;\n }\n\n setSubmitting(true);\n setError(null);\n setFormErrors({});\n\n const validation = validateFormRendererValues({\n schema: context.formVersion.schema,\n uiSchema: context.formVersion.uiSchema,\n values: formValues,\n });\n\n if (!validation.valid) {\n setFormErrors(validation.errors);\n setError('請先補齊必填欄位。');\n\n if (validation.firstInvalidFieldKey) {\n focusFormRendererField(validation.firstInvalidFieldKey);\n }\n\n setSubmitting(false);\n\n return;\n }\n\n try {\n const instanceId = await submitApprovalInstance({\n formData: formValues,\n initiatorMemberId: currentMemberId,\n templateId: context.template.id,\n title: readFormDataCaseTitle({\n fallbackTitle: context.template.name,\n formData: formValues,\n schema: context.formVersion.schema,\n uiSchema: context.formVersion.uiSchema,\n }),\n });\n\n router.push(`/instances/${instanceId}`);\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setSubmitting(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 return (\n <Layout>\n <AppNavigation activeHref=\"/\" />\n\n <Layout.Main>\n <PageHeader>\n <ContentHeader\n description={\n context\n ? `${context.template.name} · 表單 v${context.formVersion.version}`\n : '選擇可發起的已發布模板後填寫表單內容。'\n }\n title=\"發起簽核\"\n >\n {context ? (\n <Button\n disabled={loading || submitting}\n icon={CheckedIcon}\n iconType=\"leading\"\n onClick={handleSubmit}\n variant=\"base-primary\"\n >\n 送出\n </Button>\n ) : null}\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section>\n <div style={FORM_SECTION_STYLE}>\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n\n {loading ? (\n <Typography color=\"text-neutral\" variant=\"body\">\n 載入中...\n </Typography>\n ) : null}\n\n {context ? (\n <FormRenderer\n errors={formErrors}\n maxWidth={480}\n onChange={(values): void => {\n setFormValues(values);\n setFormErrors({});\n }}\n onUploadAttachment={handleUploadAttachment}\n schema={context.formVersion.schema}\n singleColumn\n uiSchema={context.formVersion.uiSchema}\n value={formValues}\n />\n ) : null}\n\n {!templateId && !loading ? (\n rows.length > 0 ? (\n <Table\n actions={tableActions}\n columns={columns}\n dataSource={rows}\n fullWidth\n />\n ) : (\n <Typography color=\"text-neutral\" variant=\"body\">\n 目前沒有可發起的已發布模板。\n </Typography>\n )\n ) : null}\n </div>\n </Section>\n </SectionGroup>\n </Layout.Main>\n </Layout>\n );\n}\n\nfunction NewApprovalInstanceLoading(): ReactElement {\n return (\n <Layout>\n <AppNavigation activeHref=\"/\" />\n\n <Layout.Main>\n <PageHeader>\n <ContentHeader\n description=\"選擇可發起的已發布模板後填寫表單內容。\"\n title=\"發起簽核\"\n />\n </PageHeader>\n\n <SectionGroup>\n <Section>\n <Typography color=\"text-neutral\" variant=\"body\">\n 載入中...\n </Typography>\n </Section>\n </SectionGroup>\n </Layout.Main>\n </Layout>\n );\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use client";require('../LoginView.css');const e=require("./router-adapter-BybHrCNP.cjs"),t=require("./auth-provider-D2P-qWmY.cjs");let n=require("react"),r=require("@mezzanine-ui/react"),i=require("@rytass/bpm-core-client"),a=require("react/jsx-runtime"),o=require("@mezzanine-ui/icons");var s={loginPage:`bpm_loginPage_BjzaI`,loginPanel:`bpm_loginPanel_xo0TW`,brand:`bpm_brand_KVmvZ`,brandLogo:`bpm_brandLogo_jxEAG`,form:`bpm_form_rKKP2`,demoUsers:`bpm_demoUsers_g-5Hd`,demoUserList:`bpm_demoUserList_IxtKp`,demoUserButton:`bpm_demoUserButton_YdkSa`},c=`/rytass-logo.png`,l=`lin.ceo@example.internal`,u=`demo`;function d({logoSrc:d=c,defaultIdentifier:p=l,defaultPassword:h=u,defaultNextPath:g,brandTitle:_=`BPM Admin`,brandSubtitle:v=`BPM API 登入`}={}){let y=e.r(),{loading:b,login:x,member:S}=t.n(),[C,w]=(0,n.useState)([]),[T,E]=(0,n.useState)(null),[D,O]=(0,n.useState)(p),[k,A]=(0,n.useState)(h),[j,M]=(0,n.useState)(!1);(0,n.useEffect)(()=>{b||!S||y.replace(f(y,g))},[g,b,S,y]),(0,n.useEffect)(()=>{(async()=>{try{w(await(0,i.listApiTestMembers)())}catch{w([])}})()},[]);let N=(0,n.useCallback)(async e=>{e.preventDefault(),E(null),M(!0);try{await x({identifier:D,password:k}),y.replace(f(y,g))}catch(e){E(m(e))}finally{M(!1)}},[g,D,x,k,y]);function P(e){O(e.target.value)}function F(e){A(e.target.value)}return(0,a.jsx)(`main`,{className:s.loginPage,children:(0,a.jsxs)(`section`,{className:s.loginPanel,children:[(0,a.jsxs)(`div`,{className:s.brand,children:[(0,a.jsx)(`img`,{alt:``,className:s.brandLogo,src:d}),(0,a.jsxs)(`div`,{children:[(0,a.jsx)(r.Typography,{variant:`h3`,children:_}),(0,a.jsx)(r.Typography,{color:`text-neutral`,variant:`body`,children:v})]})]}),(0,a.jsxs)(`form`,{className:s.form,onSubmit:N,children:[(0,a.jsxs)(`label`,{children:[(0,a.jsx)(r.Typography,{color:`text-neutral`,variant:`caption`,children:`帳號`}),(0,a.jsx)(r.Input,{fullWidth:!0,name:`identifier`,onChange:P,placeholder:`member id 或 email`,value:D})]}),(0,a.jsxs)(`label`,{children:[(0,a.jsx)(r.Typography,{color:`text-neutral`,variant:`caption`,children:`密碼`}),(0,a.jsx)(r.Input,{fullWidth:!0,inputType:`password`,name:`password`,onChange:F,value:k,variant:`password`})]}),T?(0,a.jsx)(r.Typography,{color:`text-error`,variant:`body`,children:T}):null,(0,a.jsx)(r.Button,{disabled:j,icon:o.LoginIcon,iconType:`leading`,type:`submit`,variant:`base-primary`,children:`登入`})]}),C.length?(0,a.jsxs)(`div`,{className:s.demoUsers,children:[(0,a.jsx)(r.Typography,{color:`text-neutral`,variant:`caption`,children:`測試帳號`}),(0,a.jsx)(`div`,{className:s.demoUserList,children:C.map(e=>(0,a.jsxs)(`button`,{className:s.demoUserButton,onClick:()=>O(e.email),type:`button`,children:[(0,a.jsx)(`span`,{children:e.name}),(0,a.jsx)(`span`,{children:e.email})]},e.memberId))})]}):null]})})}function f(e,t){let n=(e.searchParams?.()??p()).get(`next`);return!n||!n.startsWith(`/`)||n.startsWith(`//`)?t??`/`:n}function p(){return typeof window>`u`?new URLSearchParams:new URLSearchParams(window.location.search)}function m(e){return e instanceof Error?e.message:`登入失敗`}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return d}});
|
|
2
|
-
//# sourceMappingURL=LoginView-BED07v-7.cjs.map
|