@rytass/bpm-core-react 0.2.0 → 0.3.1
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/README.md +13 -1
- package/dist/chunks/app-navigation-C_mbz7jx.cjs +2 -0
- package/dist/chunks/app-navigation-C_mbz7jx.cjs.map +1 -0
- package/dist/chunks/{app-navigation-CATITRM7.js → app-navigation-uwbNEw9P.js} +66 -67
- package/dist/chunks/app-navigation-uwbNEw9P.js.map +1 -0
- package/dist/chunks/approval-instance-list-page-Mo6wpDPb.cjs +2 -0
- package/dist/chunks/approval-instance-list-page-Mo6wpDPb.cjs.map +1 -0
- package/dist/chunks/approval-instance-list-page-nmzMrj0b.js +281 -0
- package/dist/chunks/approval-instance-list-page-nmzMrj0b.js.map +1 -0
- 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-DPhAH381.cjs +3 -0
- package/dist/chunks/builder-DPhAH381.cjs.map +1 -0
- package/dist/chunks/{FormBuilderView-CvChAvgD.js → builder-DqZskyXC.js} +334 -331
- package/dist/chunks/builder-DqZskyXC.js.map +1 -0
- package/dist/chunks/categories-DEijUOnw.cjs +2 -0
- package/dist/chunks/categories-DEijUOnw.cjs.map +1 -0
- package/dist/chunks/categories-DTEl182t.js +386 -0
- package/dist/chunks/categories-DTEl182t.js.map +1 -0
- package/dist/chunks/dashboard-page-DCmuB0Rw.cjs +2 -0
- package/dist/chunks/dashboard-page-DCmuB0Rw.cjs.map +1 -0
- package/dist/chunks/dashboard-page-Dx5PeEeN.js +117 -0
- package/dist/chunks/dashboard-page-Dx5PeEeN.js.map +1 -0
- package/dist/chunks/delegations-C-ZrwzvU.js +572 -0
- package/dist/chunks/delegations-C-ZrwzvU.js.map +1 -0
- package/dist/chunks/delegations-C5PzZ5Kn.js +645 -0
- package/dist/chunks/delegations-C5PzZ5Kn.js.map +1 -0
- package/dist/chunks/delegations-DOGDvybX.cjs +2 -0
- package/dist/chunks/delegations-DOGDvybX.cjs.map +1 -0
- package/dist/chunks/delegations-DkDBWOQ7.cjs +2 -0
- package/dist/chunks/delegations-DkDBWOQ7.cjs.map +1 -0
- package/dist/chunks/detail-B2gcOPkd.cjs +2 -0
- package/dist/chunks/detail-B2gcOPkd.cjs.map +1 -0
- package/dist/chunks/{InstanceDetailView-C-A-LOCG.js → detail-CfFyU5zC.js} +670 -667
- package/dist/chunks/detail-CfFyU5zC.js.map +1 -0
- package/dist/chunks/{format-date-time-BQyH5U8z.cjs → format-date-time-isOa3e9q.cjs} +2 -2
- package/dist/chunks/{format-date-time-BQyH5U8z.cjs.map → format-date-time-isOa3e9q.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/notifications-CPQ-nVar.cjs +2 -0
- package/dist/chunks/notifications-CPQ-nVar.cjs.map +1 -0
- package/dist/chunks/notifications-DweexUVy.js +197 -0
- package/dist/chunks/notifications-DweexUVy.js.map +1 -0
- package/dist/chunks/orgs-DgZ0DQ3-.cjs +2 -0
- package/dist/chunks/orgs-DgZ0DQ3-.cjs.map +1 -0
- package/dist/chunks/{AdminOrgsView-DZaVAbaQ.js → orgs-xrdhb3hS.js} +669 -666
- package/dist/chunks/orgs-xrdhb3hS.js.map +1 -0
- package/dist/chunks/templates-PK_VYvcy.js +383 -0
- package/dist/chunks/templates-PK_VYvcy.js.map +1 -0
- package/dist/chunks/templates-x1OJZmsG.cjs +2 -0
- package/dist/chunks/templates-x1OJZmsG.cjs.map +1 -0
- package/dist/chunks/users-CY4-NK3j.js +218 -0
- package/dist/chunks/users-CY4-NK3j.js.map +1 -0
- package/dist/chunks/users-DHnu_056.cjs +2 -0
- package/dist/chunks/users-DHnu_056.cjs.map +1 -0
- package/dist/components/app-navigation.d.ts +17 -10
- 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/lib/notification-drawer-provider.d.ts +1 -1
- package/dist/lib/notification-unread-provider.d.ts +1 -1
- package/dist/lib/providers.d.ts +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 +189 -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 +293 -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 +195 -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 +2275 -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 +113 -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 +0 -642
- 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 +0 -215
- 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 +0 -569
- 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 +0 -194
- 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 +0 -382
- 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 +0 -380
- 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-CATITRM7.js.map +0 -1
- package/dist/chunks/app-navigation-DAC5gFbG.cjs +0 -2
- package/dist/chunks/app-navigation-DAC5gFbG.cjs.map +0 -1
- package/dist/chunks/approval-instance-list-page-B6vAGvOb.js +0 -278
- package/dist/chunks/approval-instance-list-page-B6vAGvOb.js.map +0 -1
- package/dist/chunks/approval-instance-list-page-DIAmwhvl.cjs +0 -2
- package/dist/chunks/approval-instance-list-page-DIAmwhvl.cjs.map +0 -1
- 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-BsW8t104.js +0 -115
- package/dist/chunks/dashboard-page-BsW8t104.js.map +0 -1
- package/dist/chunks/dashboard-page-udYhnyMW.cjs +0 -2
- package/dist/chunks/dashboard-page-udYhnyMW.cjs.map +0 -1
- 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
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as e } from "./app-navigation-uwbNEw9P.js";
|
|
3
|
+
import { useCallback as t, useEffect as n, useMemo as r, useState as i } from "react";
|
|
4
|
+
import { BaseCard as a, Filter as o, FilterArea as s, FilterLine as c, FormField as l, Input as u, Modal as d, PageHeader as ee, Section as f, SectionGroup as p, Table as te, Typography as m } from "@mezzanine-ui/react";
|
|
5
|
+
import { listMemberDirectoryPage as h, resolveMembers as ne } from "@rytass/bpm-core-client";
|
|
6
|
+
import { jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
7
|
+
import v from "@mezzanine-ui/react/ContentHeader";
|
|
8
|
+
import { FormFieldLayout as y } from "@mezzanine-ui/core/form";
|
|
9
|
+
import { listMemberships as b, readOrganizationDashboard as x, readResolvedManager as S } from "@rytass/bpm-core-client/organization";
|
|
10
|
+
import '../users.css';var C = {
|
|
11
|
+
memberFilterArea: "bpm_memberFilterArea_9RB2k",
|
|
12
|
+
header: "bpm_header_sIEtg",
|
|
13
|
+
detailFields: "bpm_detailFields_TyKNL",
|
|
14
|
+
detailSection: "bpm_detailSection_-iLjy",
|
|
15
|
+
membershipList: "bpm_membershipList_5n9iq"
|
|
16
|
+
}, w = [
|
|
17
|
+
10,
|
|
18
|
+
20,
|
|
19
|
+
50
|
|
20
|
+
];
|
|
21
|
+
function T({ activeHref: a = "/admin/users" } = {}) {
|
|
22
|
+
let [d, T] = i(null), [D, O] = i([]), [k, j] = i(null), [M, N] = i(null), [P, F] = i(null), [I, L] = i(!0), [R, z] = i(1), [B, V] = i(10), [H, U] = i(0), [W, G] = i([]), [K, q] = i([]), [J, Y] = i([]), [X, Z] = i(""), re = r(() => new Map(K.map((e) => [e.id, e])), [K]), ie = r(() => new Map(J.map((e) => [e.id, e])), [J]), Q = t(async () => {
|
|
23
|
+
L(!0), F(null);
|
|
24
|
+
try {
|
|
25
|
+
let [e, t] = await Promise.all([h({
|
|
26
|
+
page: R,
|
|
27
|
+
pageSize: B,
|
|
28
|
+
searchText: X
|
|
29
|
+
}), x()]);
|
|
30
|
+
G(e.members), U(e.totalCount), q(t.orgUnits), Y(t.positions);
|
|
31
|
+
} catch (e) {
|
|
32
|
+
F(A(e));
|
|
33
|
+
} finally {
|
|
34
|
+
L(!1);
|
|
35
|
+
}
|
|
36
|
+
}, [
|
|
37
|
+
R,
|
|
38
|
+
B,
|
|
39
|
+
X
|
|
40
|
+
]);
|
|
41
|
+
n(() => {
|
|
42
|
+
Q();
|
|
43
|
+
}, [Q]);
|
|
44
|
+
let ae = r(() => W.map((e) => ({
|
|
45
|
+
...e,
|
|
46
|
+
key: e.memberId
|
|
47
|
+
})), [W]), $ = t(async (e) => {
|
|
48
|
+
T(e), j(null), F(null);
|
|
49
|
+
try {
|
|
50
|
+
let [t, n] = await Promise.all([b({ memberId: e.memberId }), S(e.memberId)]);
|
|
51
|
+
O(t), N(n), j((await ne(n.managerMemberId ? [n.managerMemberId] : []))[0] ?? null);
|
|
52
|
+
} catch (e) {
|
|
53
|
+
F(A(e));
|
|
54
|
+
}
|
|
55
|
+
}, []), oe = r(() => [{
|
|
56
|
+
dataIndex: "name",
|
|
57
|
+
key: "name",
|
|
58
|
+
title: "姓名",
|
|
59
|
+
width: 160
|
|
60
|
+
}, {
|
|
61
|
+
dataIndex: "email",
|
|
62
|
+
key: "email",
|
|
63
|
+
title: "信箱",
|
|
64
|
+
width: 260
|
|
65
|
+
}], []), se = r(() => ({
|
|
66
|
+
render: () => [{
|
|
67
|
+
name: "檢視",
|
|
68
|
+
onClick: (e) => {
|
|
69
|
+
$(e);
|
|
70
|
+
}
|
|
71
|
+
}],
|
|
72
|
+
variant: "base-secondary",
|
|
73
|
+
width: 88
|
|
74
|
+
}), [$]);
|
|
75
|
+
function ce() {
|
|
76
|
+
T(null), j(null), O([]), N(null);
|
|
77
|
+
}
|
|
78
|
+
return /* @__PURE__ */ _(e, {
|
|
79
|
+
activeHref: a,
|
|
80
|
+
children: [
|
|
81
|
+
/* @__PURE__ */ g(ee, { children: /* @__PURE__ */ g(v, {
|
|
82
|
+
description: "會員資料由 host member resolver 提供,BPM 僅維護組織歸屬與主管解析。",
|
|
83
|
+
title: "會員對照"
|
|
84
|
+
}) }),
|
|
85
|
+
/* @__PURE__ */ g(p, { children: /* @__PURE__ */ _(f, {
|
|
86
|
+
filterArea: /* @__PURE__ */ g(s, {
|
|
87
|
+
className: C.memberFilterArea,
|
|
88
|
+
children: /* @__PURE__ */ g(c, { children: /* @__PURE__ */ g(o, {
|
|
89
|
+
span: 3,
|
|
90
|
+
children: /* @__PURE__ */ g(l, {
|
|
91
|
+
fullWidth: !0,
|
|
92
|
+
layout: y.VERTICAL,
|
|
93
|
+
name: "memberSearchText",
|
|
94
|
+
children: /* @__PURE__ */ g(u, {
|
|
95
|
+
fullWidth: !0,
|
|
96
|
+
onChange: (e) => {
|
|
97
|
+
Z(e.target.value), z(1);
|
|
98
|
+
},
|
|
99
|
+
placeholder: "搜尋姓名或信箱",
|
|
100
|
+
size: "sub",
|
|
101
|
+
value: X,
|
|
102
|
+
variant: "base"
|
|
103
|
+
})
|
|
104
|
+
})
|
|
105
|
+
}) })
|
|
106
|
+
}),
|
|
107
|
+
children: [P ? /* @__PURE__ */ g(m, {
|
|
108
|
+
color: "text-error",
|
|
109
|
+
variant: "body",
|
|
110
|
+
children: P
|
|
111
|
+
}) : null, /* @__PURE__ */ g(te, {
|
|
112
|
+
actions: se,
|
|
113
|
+
columns: oe,
|
|
114
|
+
dataSource: ae,
|
|
115
|
+
fullWidth: !0,
|
|
116
|
+
loading: I,
|
|
117
|
+
pagination: {
|
|
118
|
+
current: R,
|
|
119
|
+
onChange: (e) => {
|
|
120
|
+
z(e);
|
|
121
|
+
},
|
|
122
|
+
onChangePageSize: (e) => {
|
|
123
|
+
z(1), V(e);
|
|
124
|
+
},
|
|
125
|
+
pageSize: B,
|
|
126
|
+
pageSizeLabel: "每頁筆數",
|
|
127
|
+
pageSizeOptions: w,
|
|
128
|
+
renderResultSummary: (e, t, n) => `顯示 ${e}-${t} 筆,共 ${n} 筆`,
|
|
129
|
+
showPageSizeOptions: !0,
|
|
130
|
+
total: H
|
|
131
|
+
}
|
|
132
|
+
})]
|
|
133
|
+
}) }),
|
|
134
|
+
/* @__PURE__ */ g(E, {
|
|
135
|
+
managerProfile: k,
|
|
136
|
+
member: d,
|
|
137
|
+
memberships: D,
|
|
138
|
+
onClose: ce,
|
|
139
|
+
orgUnitsById: re,
|
|
140
|
+
positionsById: ie,
|
|
141
|
+
resolvedManager: M
|
|
142
|
+
})
|
|
143
|
+
]
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
function E({ managerProfile: e, member: t, memberships: n, onClose: r, orgUnitsById: i, positionsById: o, resolvedManager: s }) {
|
|
147
|
+
return /* @__PURE__ */ g(d, {
|
|
148
|
+
cancelText: "關閉",
|
|
149
|
+
confirmText: "關閉",
|
|
150
|
+
modalType: "standard",
|
|
151
|
+
onCancel: r,
|
|
152
|
+
onClose: r,
|
|
153
|
+
onConfirm: r,
|
|
154
|
+
open: !!t,
|
|
155
|
+
showModalFooter: !0,
|
|
156
|
+
showModalHeader: !0,
|
|
157
|
+
size: "regular",
|
|
158
|
+
title: t?.name ?? "會員明細",
|
|
159
|
+
children: t ? /* @__PURE__ */ _("div", {
|
|
160
|
+
className: C.detailFields,
|
|
161
|
+
children: [
|
|
162
|
+
/* @__PURE__ */ g(a, {
|
|
163
|
+
title: "基本資料",
|
|
164
|
+
children: /* @__PURE__ */ g("div", {
|
|
165
|
+
className: C.detailSection,
|
|
166
|
+
children: /* @__PURE__ */ _(m, {
|
|
167
|
+
variant: "body",
|
|
168
|
+
children: ["信箱:", t.email]
|
|
169
|
+
})
|
|
170
|
+
})
|
|
171
|
+
}),
|
|
172
|
+
/* @__PURE__ */ g(a, {
|
|
173
|
+
title: "BPM 組織歸屬",
|
|
174
|
+
children: /* @__PURE__ */ g("div", {
|
|
175
|
+
className: C.membershipList,
|
|
176
|
+
children: n.length ? n.map((e) => /* @__PURE__ */ _(m, {
|
|
177
|
+
variant: "body",
|
|
178
|
+
children: [
|
|
179
|
+
D(i.get(e.orgUnitId)),
|
|
180
|
+
" / ",
|
|
181
|
+
e.positionId ? O(o.get(e.positionId)) : "未指定職位",
|
|
182
|
+
" / ",
|
|
183
|
+
e.isPrimary ? "主要" : "一般"
|
|
184
|
+
]
|
|
185
|
+
}, e.id)) : /* @__PURE__ */ g(m, {
|
|
186
|
+
color: "text-neutral",
|
|
187
|
+
variant: "body",
|
|
188
|
+
children: "尚未建立 BPM 組織歸屬"
|
|
189
|
+
})
|
|
190
|
+
})
|
|
191
|
+
}),
|
|
192
|
+
/* @__PURE__ */ g(a, {
|
|
193
|
+
title: "主管解析",
|
|
194
|
+
children: /* @__PURE__ */ g(m, {
|
|
195
|
+
variant: "body",
|
|
196
|
+
children: s?.managerMemberId ? k(e) : "尚未解析到主管"
|
|
197
|
+
})
|
|
198
|
+
})
|
|
199
|
+
]
|
|
200
|
+
}) : null
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
function D(e) {
|
|
204
|
+
return e ? `${e.name} · ${e.code}` : "未知組織";
|
|
205
|
+
}
|
|
206
|
+
function O(e) {
|
|
207
|
+
return e ? `${e.name} · ${e.code}` : "未知職位";
|
|
208
|
+
}
|
|
209
|
+
function k(e) {
|
|
210
|
+
return e ? `${e.name} · ${e.email}` : "主管資料尚未載入";
|
|
211
|
+
}
|
|
212
|
+
function A(e) {
|
|
213
|
+
return e instanceof Error ? e.message : "讀取會員資料失敗。";
|
|
214
|
+
}
|
|
215
|
+
//#endregion
|
|
216
|
+
export { T as t };
|
|
217
|
+
|
|
218
|
+
//# sourceMappingURL=users-CY4-NK3j.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users-CY4-NK3j.js","names":[],"sources":["../../src/views/admin/users/users.module.scss","../../src/views/admin/users/AdminUsersView.tsx"],"sourcesContent":[".memberFilterArea {\n :global(.mzn-filter-area__actions) {\n display: none;\n }\n\n :global(.mzn-form-field__label-area) {\n display: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-input),\n :global(.mzn-input-container),\n :global(.mzn-text-field) {\n width: 100%;\n min-width: 0 !important;\n }\n}\n\n.header {\n display: grid;\n gap: 4px;\n padding: 24px 24px 0;\n}\n\n.detailFields {\n display: grid;\n gap: 16px;\n}\n\n.detailSection {\n display: grid;\n gap: 8px;\n}\n\n.membershipList {\n display: grid;\n gap: 8px;\n}\n","'use client';\n\nimport {\n ChangeEvent,\n ReactElement,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n BaseCard,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Table,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport styles from './users.module.scss';\nimport { AppLayout } from '../../../components/app-navigation';\nimport {\n listMemberDirectoryPage,\n MemberProfileRecord,\n resolveMembers,\n} from '@rytass/bpm-core-client';\nimport {\n listMemberships,\n MembershipRecord,\n OrgUnitRecord,\n PositionRecord,\n readOrganizationDashboard,\n readResolvedManager,\n ResolvedManagerRecord,\n} from '@rytass/bpm-core-client/organization';\n\ntype MemberRow = Readonly<\n Record<string, unknown> &\n MemberProfileRecord & {\n key: string;\n }\n>;\n\nconst MEMBER_PAGE_SIZE_OPTIONS = [10, 20, 50];\n\nexport interface AdminUsersViewProps {\n readonly activeHref?: string;\n}\n\nexport function AdminUsersView({\n activeHref = '/admin/users',\n}: AdminUsersViewProps = {}): ReactElement {\n const [detailMember, setDetailMember] = useState<MemberProfileRecord | null>(\n null,\n );\n const [detailMemberships, setDetailMemberships] = useState<\n readonly MembershipRecord[]\n >([]);\n const [detailManagerProfile, setDetailManagerProfile] =\n useState<MemberProfileRecord | null>(null);\n const [detailResolvedManager, setDetailResolvedManager] =\n useState<ResolvedManagerRecord | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [memberPage, setMemberPage] = useState(1);\n const [memberPageSize, setMemberPageSize] = useState(10);\n const [memberTotalCount, setMemberTotalCount] = useState(0);\n const [members, setMembers] = useState<readonly MemberProfileRecord[]>([]);\n const [orgUnits, setOrgUnits] = useState<readonly OrgUnitRecord[]>([]);\n const [positions, setPositions] = useState<readonly PositionRecord[]>([]);\n const [searchText, setSearchText] = useState('');\n\n const orgUnitsById = useMemo(\n (): ReadonlyMap<string, OrgUnitRecord> =>\n new Map(orgUnits.map((orgUnit) => [orgUnit.id, orgUnit])),\n [orgUnits],\n );\n const positionsById = useMemo(\n (): ReadonlyMap<string, PositionRecord> =>\n new Map(positions.map((position) => [position.id, position])),\n [positions],\n );\n\n const refreshMembers = useCallback(async (): Promise<void> => {\n setLoading(true);\n setError(null);\n\n try {\n const [memberPageResult, organization] = await Promise.all([\n listMemberDirectoryPage({\n page: memberPage,\n pageSize: memberPageSize,\n searchText,\n }),\n readOrganizationDashboard(),\n ]);\n\n setMembers(memberPageResult.members);\n setMemberTotalCount(memberPageResult.totalCount);\n setOrgUnits(organization.orgUnits);\n setPositions(organization.positions);\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, [memberPage, memberPageSize, searchText]);\n\n useEffect((): void => {\n void refreshMembers();\n }, [refreshMembers]);\n\n const rows = useMemo(\n (): MemberRow[] =>\n members.map((member) => ({\n ...member,\n key: member.memberId,\n })),\n [members],\n );\n\n const openDetail = useCallback(\n async (member: MemberProfileRecord): Promise<void> => {\n setDetailMember(member);\n setDetailManagerProfile(null);\n setError(null);\n\n try {\n const [memberships, resolvedManager] = await Promise.all([\n listMemberships({ memberId: member.memberId }),\n readResolvedManager(member.memberId),\n ]);\n\n setDetailMemberships(memberships);\n setDetailResolvedManager(resolvedManager);\n setDetailManagerProfile(\n (\n await resolveMembers(\n resolvedManager.managerMemberId\n ? [resolvedManager.managerMemberId]\n : [],\n )\n )[0] ?? null,\n );\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n }\n },\n [],\n );\n\n const columns = useMemo(\n (): TableColumn<MemberRow>[] => [\n { dataIndex: 'name', key: 'name', title: '姓名', width: 160 },\n { dataIndex: 'email', key: 'email', title: '信箱', width: 260 },\n ],\n [],\n );\n const tableActions = useMemo(\n (): TableActions<MemberRow> => ({\n render: (): ReturnType<TableActions<MemberRow>['render']> => [\n {\n name: '檢視',\n onClick: (record): void => {\n void openDetail(record);\n },\n },\n ],\n variant: 'base-secondary',\n width: 88,\n }),\n [openDetail],\n );\n\n function closeDetail(): void {\n setDetailMember(null);\n setDetailManagerProfile(null);\n setDetailMemberships([]);\n setDetailResolvedManager(null);\n }\n\n return (\n <AppLayout activeHref={activeHref}>\n <PageHeader>\n <ContentHeader\n description=\"會員資料由 host member resolver 提供,BPM 僅維護組織歸屬與主管解析。\"\n title=\"會員對照\"\n />\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.memberFilterArea}>\n <FilterLine>\n <Filter span={3}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"memberSearchText\"\n >\n <Input\n fullWidth\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n setSearchText(event.target.value);\n setMemberPage(1);\n }}\n placeholder=\"搜尋姓名或信箱\"\n size=\"sub\"\n value={searchText}\n variant=\"base\"\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <Table\n actions={tableActions}\n columns={columns}\n dataSource={rows}\n fullWidth\n loading={loading}\n pagination={{\n current: memberPage,\n onChange: (page): void => {\n setMemberPage(page);\n },\n onChangePageSize: (pageSize): void => {\n setMemberPage(1);\n setMemberPageSize(pageSize);\n },\n pageSize: memberPageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: MEMBER_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: memberTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n\n <MemberDetailModal\n managerProfile={detailManagerProfile}\n member={detailMember}\n memberships={detailMemberships}\n onClose={closeDetail}\n orgUnitsById={orgUnitsById}\n positionsById={positionsById}\n resolvedManager={detailResolvedManager}\n />\n </AppLayout>\n );\n}\n\nfunction MemberDetailModal({\n managerProfile,\n member,\n memberships,\n onClose,\n orgUnitsById,\n positionsById,\n resolvedManager,\n}: {\n readonly managerProfile: MemberProfileRecord | null;\n readonly member: MemberProfileRecord | null;\n readonly memberships: readonly MembershipRecord[];\n readonly onClose: () => void;\n readonly orgUnitsById: ReadonlyMap<string, OrgUnitRecord>;\n readonly positionsById: ReadonlyMap<string, PositionRecord>;\n readonly resolvedManager: ResolvedManagerRecord | null;\n}): ReactElement {\n return (\n <Modal\n cancelText=\"關閉\"\n confirmText=\"關閉\"\n modalType=\"standard\"\n onCancel={onClose}\n onClose={onClose}\n onConfirm={onClose}\n open={Boolean(member)}\n showModalFooter\n showModalHeader\n size=\"regular\"\n title={member?.name ?? '會員明細'}\n >\n {member ? (\n <div className={styles.detailFields}>\n <BaseCard title=\"基本資料\">\n <div className={styles.detailSection}>\n <Typography variant=\"body\">信箱:{member.email}</Typography>\n </div>\n </BaseCard>\n <BaseCard title=\"BPM 組織歸屬\">\n <div className={styles.membershipList}>\n {memberships.length ? (\n memberships.map((membership) => (\n <Typography key={membership.id} variant=\"body\">\n {readOrgUnitLabel(orgUnitsById.get(membership.orgUnitId))}\n {' / '}\n {membership.positionId\n ? readPositionLabel(\n positionsById.get(membership.positionId),\n )\n : '未指定職位'}\n {' / '}\n {membership.isPrimary ? '主要' : '一般'}\n </Typography>\n ))\n ) : (\n <Typography color=\"text-neutral\" variant=\"body\">\n 尚未建立 BPM 組織歸屬\n </Typography>\n )}\n </div>\n </BaseCard>\n <BaseCard title=\"主管解析\">\n <Typography variant=\"body\">\n {resolvedManager?.managerMemberId\n ? readMemberLabel(managerProfile)\n : '尚未解析到主管'}\n </Typography>\n </BaseCard>\n </div>\n ) : null}\n </Modal>\n );\n}\n\nfunction readOrgUnitLabel(orgUnit: OrgUnitRecord | undefined): string {\n return orgUnit ? `${orgUnit.name} · ${orgUnit.code}` : '未知組織';\n}\n\nfunction readPositionLabel(position: PositionRecord | undefined): string {\n return position ? `${position.name} · ${position.code}` : '未知職位';\n}\n\nfunction readMemberLabel(member: MemberProfileRecord | null): string {\n return member ? `${member.name} · ${member.email}` : '主管資料尚未載入';\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '讀取會員資料失敗。';\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";require('../users.css');const e=require("./app-navigation-C_mbz7jx.cjs");let t=require("react"),n=require("@mezzanine-ui/react"),r=require("@rytass/bpm-core-client"),i=require("react/jsx-runtime"),a=require("@mezzanine-ui/react/ContentHeader");a=e.o(a,1);let o=require("@mezzanine-ui/core/form"),s=require("@rytass/bpm-core-client/organization");var c={memberFilterArea:`bpm_memberFilterArea_9RB2k`,header:`bpm_header_sIEtg`,detailFields:`bpm_detailFields_TyKNL`,detailSection:`bpm_detailSection_-iLjy`,membershipList:`bpm_membershipList_5n9iq`},l=[10,20,50];function u({activeHref:u=`/admin/users`}={}){let[f,p]=(0,t.useState)(null),[m,g]=(0,t.useState)([]),[_,v]=(0,t.useState)(null),[y,b]=(0,t.useState)(null),[x,S]=(0,t.useState)(null),[C,w]=(0,t.useState)(!0),[T,E]=(0,t.useState)(1),[D,O]=(0,t.useState)(10),[k,A]=(0,t.useState)(0),[j,M]=(0,t.useState)([]),[N,P]=(0,t.useState)([]),[F,I]=(0,t.useState)([]),[L,R]=(0,t.useState)(``),z=(0,t.useMemo)(()=>new Map(N.map(e=>[e.id,e])),[N]),B=(0,t.useMemo)(()=>new Map(F.map(e=>[e.id,e])),[F]),V=(0,t.useCallback)(async()=>{w(!0),S(null);try{let[e,t]=await Promise.all([(0,r.listMemberDirectoryPage)({page:T,pageSize:D,searchText:L}),(0,s.readOrganizationDashboard)()]);M(e.members),A(e.totalCount),P(t.orgUnits),I(t.positions)}catch(e){S(h(e))}finally{w(!1)}},[T,D,L]);(0,t.useEffect)(()=>{V()},[V]);let H=(0,t.useMemo)(()=>j.map(e=>({...e,key:e.memberId})),[j]),U=(0,t.useCallback)(async e=>{p(e),v(null),S(null);try{let[t,n]=await Promise.all([(0,s.listMemberships)({memberId:e.memberId}),(0,s.readResolvedManager)(e.memberId)]);g(t),b(n),v((await(0,r.resolveMembers)(n.managerMemberId?[n.managerMemberId]:[]))[0]??null)}catch(e){S(h(e))}},[]),W=(0,t.useMemo)(()=>[{dataIndex:`name`,key:`name`,title:`姓名`,width:160},{dataIndex:`email`,key:`email`,title:`信箱`,width:260}],[]),G=(0,t.useMemo)(()=>({render:()=>[{name:`檢視`,onClick:e=>{U(e)}}],variant:`base-secondary`,width:88}),[U]);function K(){p(null),v(null),g([]),b(null)}return(0,i.jsxs)(e.t,{activeHref:u,children:[(0,i.jsx)(n.PageHeader,{children:(0,i.jsx)(a.default,{description:`會員資料由 host member resolver 提供,BPM 僅維護組織歸屬與主管解析。`,title:`會員對照`})}),(0,i.jsx)(n.SectionGroup,{children:(0,i.jsxs)(n.Section,{filterArea:(0,i.jsx)(n.FilterArea,{className:c.memberFilterArea,children:(0,i.jsx)(n.FilterLine,{children:(0,i.jsx)(n.Filter,{span:3,children:(0,i.jsx)(n.FormField,{fullWidth:!0,layout:o.FormFieldLayout.VERTICAL,name:`memberSearchText`,children:(0,i.jsx)(n.Input,{fullWidth:!0,onChange:e=>{R(e.target.value),E(1)},placeholder:`搜尋姓名或信箱`,size:`sub`,value:L,variant:`base`})})})})}),children:[x?(0,i.jsx)(n.Typography,{color:`text-error`,variant:`body`,children:x}):null,(0,i.jsx)(n.Table,{actions:G,columns:W,dataSource:H,fullWidth:!0,loading:C,pagination:{current:T,onChange:e=>{E(e)},onChangePageSize:e=>{E(1),O(e)},pageSize:D,pageSizeLabel:`每頁筆數`,pageSizeOptions:l,renderResultSummary:(e,t,n)=>`顯示 ${e}-${t} 筆,共 ${n} 筆`,showPageSizeOptions:!0,total:k}})]})}),(0,i.jsx)(d,{managerProfile:_,member:f,memberships:m,onClose:K,orgUnitsById:z,positionsById:B,resolvedManager:y})]})}function d({managerProfile:e,member:t,memberships:r,onClose:a,orgUnitsById:o,positionsById:s,resolvedManager:l}){return(0,i.jsx)(n.Modal,{cancelText:`關閉`,confirmText:`關閉`,modalType:`standard`,onCancel:a,onClose:a,onConfirm:a,open:!!t,showModalFooter:!0,showModalHeader:!0,size:`regular`,title:t?.name??`會員明細`,children:t?(0,i.jsxs)(`div`,{className:c.detailFields,children:[(0,i.jsx)(n.BaseCard,{title:`基本資料`,children:(0,i.jsx)(`div`,{className:c.detailSection,children:(0,i.jsxs)(n.Typography,{variant:`body`,children:[`信箱:`,t.email]})})}),(0,i.jsx)(n.BaseCard,{title:`BPM 組織歸屬`,children:(0,i.jsx)(`div`,{className:c.membershipList,children:r.length?r.map(e=>(0,i.jsxs)(n.Typography,{variant:`body`,children:[f(o.get(e.orgUnitId)),` / `,e.positionId?p(s.get(e.positionId)):`未指定職位`,` / `,e.isPrimary?`主要`:`一般`]},e.id)):(0,i.jsx)(n.Typography,{color:`text-neutral`,variant:`body`,children:`尚未建立 BPM 組織歸屬`})})}),(0,i.jsx)(n.BaseCard,{title:`主管解析`,children:(0,i.jsx)(n.Typography,{variant:`body`,children:l?.managerMemberId?m(e):`尚未解析到主管`})})]}):null})}function f(e){return e?`${e.name} · ${e.code}`:`未知組織`}function p(e){return e?`${e.name} · ${e.code}`:`未知職位`}function m(e){return e?`${e.name} · ${e.email}`:`主管資料尚未載入`}function h(e){return e instanceof Error?e.message:`讀取會員資料失敗。`}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return u}});
|
|
2
|
+
//# sourceMappingURL=users-DHnu_056.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users-DHnu_056.cjs","names":[],"sources":["../../src/views/admin/users/users.module.scss","../../src/views/admin/users/AdminUsersView.tsx"],"sourcesContent":[".memberFilterArea {\n :global(.mzn-filter-area__actions) {\n display: none;\n }\n\n :global(.mzn-form-field__label-area) {\n display: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-input),\n :global(.mzn-input-container),\n :global(.mzn-text-field) {\n width: 100%;\n min-width: 0 !important;\n }\n}\n\n.header {\n display: grid;\n gap: 4px;\n padding: 24px 24px 0;\n}\n\n.detailFields {\n display: grid;\n gap: 16px;\n}\n\n.detailSection {\n display: grid;\n gap: 8px;\n}\n\n.membershipList {\n display: grid;\n gap: 8px;\n}\n","'use client';\n\nimport {\n ChangeEvent,\n ReactElement,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n BaseCard,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Table,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport styles from './users.module.scss';\nimport { AppLayout } from '../../../components/app-navigation';\nimport {\n listMemberDirectoryPage,\n MemberProfileRecord,\n resolveMembers,\n} from '@rytass/bpm-core-client';\nimport {\n listMemberships,\n MembershipRecord,\n OrgUnitRecord,\n PositionRecord,\n readOrganizationDashboard,\n readResolvedManager,\n ResolvedManagerRecord,\n} from '@rytass/bpm-core-client/organization';\n\ntype MemberRow = Readonly<\n Record<string, unknown> &\n MemberProfileRecord & {\n key: string;\n }\n>;\n\nconst MEMBER_PAGE_SIZE_OPTIONS = [10, 20, 50];\n\nexport interface AdminUsersViewProps {\n readonly activeHref?: string;\n}\n\nexport function AdminUsersView({\n activeHref = '/admin/users',\n}: AdminUsersViewProps = {}): ReactElement {\n const [detailMember, setDetailMember] = useState<MemberProfileRecord | null>(\n null,\n );\n const [detailMemberships, setDetailMemberships] = useState<\n readonly MembershipRecord[]\n >([]);\n const [detailManagerProfile, setDetailManagerProfile] =\n useState<MemberProfileRecord | null>(null);\n const [detailResolvedManager, setDetailResolvedManager] =\n useState<ResolvedManagerRecord | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [memberPage, setMemberPage] = useState(1);\n const [memberPageSize, setMemberPageSize] = useState(10);\n const [memberTotalCount, setMemberTotalCount] = useState(0);\n const [members, setMembers] = useState<readonly MemberProfileRecord[]>([]);\n const [orgUnits, setOrgUnits] = useState<readonly OrgUnitRecord[]>([]);\n const [positions, setPositions] = useState<readonly PositionRecord[]>([]);\n const [searchText, setSearchText] = useState('');\n\n const orgUnitsById = useMemo(\n (): ReadonlyMap<string, OrgUnitRecord> =>\n new Map(orgUnits.map((orgUnit) => [orgUnit.id, orgUnit])),\n [orgUnits],\n );\n const positionsById = useMemo(\n (): ReadonlyMap<string, PositionRecord> =>\n new Map(positions.map((position) => [position.id, position])),\n [positions],\n );\n\n const refreshMembers = useCallback(async (): Promise<void> => {\n setLoading(true);\n setError(null);\n\n try {\n const [memberPageResult, organization] = await Promise.all([\n listMemberDirectoryPage({\n page: memberPage,\n pageSize: memberPageSize,\n searchText,\n }),\n readOrganizationDashboard(),\n ]);\n\n setMembers(memberPageResult.members);\n setMemberTotalCount(memberPageResult.totalCount);\n setOrgUnits(organization.orgUnits);\n setPositions(organization.positions);\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, [memberPage, memberPageSize, searchText]);\n\n useEffect((): void => {\n void refreshMembers();\n }, [refreshMembers]);\n\n const rows = useMemo(\n (): MemberRow[] =>\n members.map((member) => ({\n ...member,\n key: member.memberId,\n })),\n [members],\n );\n\n const openDetail = useCallback(\n async (member: MemberProfileRecord): Promise<void> => {\n setDetailMember(member);\n setDetailManagerProfile(null);\n setError(null);\n\n try {\n const [memberships, resolvedManager] = await Promise.all([\n listMemberships({ memberId: member.memberId }),\n readResolvedManager(member.memberId),\n ]);\n\n setDetailMemberships(memberships);\n setDetailResolvedManager(resolvedManager);\n setDetailManagerProfile(\n (\n await resolveMembers(\n resolvedManager.managerMemberId\n ? [resolvedManager.managerMemberId]\n : [],\n )\n )[0] ?? null,\n );\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n }\n },\n [],\n );\n\n const columns = useMemo(\n (): TableColumn<MemberRow>[] => [\n { dataIndex: 'name', key: 'name', title: '姓名', width: 160 },\n { dataIndex: 'email', key: 'email', title: '信箱', width: 260 },\n ],\n [],\n );\n const tableActions = useMemo(\n (): TableActions<MemberRow> => ({\n render: (): ReturnType<TableActions<MemberRow>['render']> => [\n {\n name: '檢視',\n onClick: (record): void => {\n void openDetail(record);\n },\n },\n ],\n variant: 'base-secondary',\n width: 88,\n }),\n [openDetail],\n );\n\n function closeDetail(): void {\n setDetailMember(null);\n setDetailManagerProfile(null);\n setDetailMemberships([]);\n setDetailResolvedManager(null);\n }\n\n return (\n <AppLayout activeHref={activeHref}>\n <PageHeader>\n <ContentHeader\n description=\"會員資料由 host member resolver 提供,BPM 僅維護組織歸屬與主管解析。\"\n title=\"會員對照\"\n />\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.memberFilterArea}>\n <FilterLine>\n <Filter span={3}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"memberSearchText\"\n >\n <Input\n fullWidth\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n setSearchText(event.target.value);\n setMemberPage(1);\n }}\n placeholder=\"搜尋姓名或信箱\"\n size=\"sub\"\n value={searchText}\n variant=\"base\"\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <Table\n actions={tableActions}\n columns={columns}\n dataSource={rows}\n fullWidth\n loading={loading}\n pagination={{\n current: memberPage,\n onChange: (page): void => {\n setMemberPage(page);\n },\n onChangePageSize: (pageSize): void => {\n setMemberPage(1);\n setMemberPageSize(pageSize);\n },\n pageSize: memberPageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: MEMBER_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: memberTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n\n <MemberDetailModal\n managerProfile={detailManagerProfile}\n member={detailMember}\n memberships={detailMemberships}\n onClose={closeDetail}\n orgUnitsById={orgUnitsById}\n positionsById={positionsById}\n resolvedManager={detailResolvedManager}\n />\n </AppLayout>\n );\n}\n\nfunction MemberDetailModal({\n managerProfile,\n member,\n memberships,\n onClose,\n orgUnitsById,\n positionsById,\n resolvedManager,\n}: {\n readonly managerProfile: MemberProfileRecord | null;\n readonly member: MemberProfileRecord | null;\n readonly memberships: readonly MembershipRecord[];\n readonly onClose: () => void;\n readonly orgUnitsById: ReadonlyMap<string, OrgUnitRecord>;\n readonly positionsById: ReadonlyMap<string, PositionRecord>;\n readonly resolvedManager: ResolvedManagerRecord | null;\n}): ReactElement {\n return (\n <Modal\n cancelText=\"關閉\"\n confirmText=\"關閉\"\n modalType=\"standard\"\n onCancel={onClose}\n onClose={onClose}\n onConfirm={onClose}\n open={Boolean(member)}\n showModalFooter\n showModalHeader\n size=\"regular\"\n title={member?.name ?? '會員明細'}\n >\n {member ? (\n <div className={styles.detailFields}>\n <BaseCard title=\"基本資料\">\n <div className={styles.detailSection}>\n <Typography variant=\"body\">信箱:{member.email}</Typography>\n </div>\n </BaseCard>\n <BaseCard title=\"BPM 組織歸屬\">\n <div className={styles.membershipList}>\n {memberships.length ? (\n memberships.map((membership) => (\n <Typography key={membership.id} variant=\"body\">\n {readOrgUnitLabel(orgUnitsById.get(membership.orgUnitId))}\n {' / '}\n {membership.positionId\n ? readPositionLabel(\n positionsById.get(membership.positionId),\n )\n : '未指定職位'}\n {' / '}\n {membership.isPrimary ? '主要' : '一般'}\n </Typography>\n ))\n ) : (\n <Typography color=\"text-neutral\" variant=\"body\">\n 尚未建立 BPM 組織歸屬\n </Typography>\n )}\n </div>\n </BaseCard>\n <BaseCard title=\"主管解析\">\n <Typography variant=\"body\">\n {resolvedManager?.managerMemberId\n ? readMemberLabel(managerProfile)\n : '尚未解析到主管'}\n </Typography>\n </BaseCard>\n </div>\n ) : null}\n </Modal>\n );\n}\n\nfunction readOrgUnitLabel(orgUnit: OrgUnitRecord | undefined): string {\n return orgUnit ? `${orgUnit.name} · ${orgUnit.code}` : '未知組織';\n}\n\nfunction readPositionLabel(position: PositionRecord | undefined): string {\n return position ? `${position.name} · ${position.code}` : '未知職位';\n}\n\nfunction readMemberLabel(member: MemberProfileRecord | null): string {\n return member ? `${member.name} · ${member.email}` : '主管資料尚未載入';\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '讀取會員資料失敗。';\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ReactElement } from 'react';
|
|
1
|
+
import { ReactElement, ReactNode } from 'react';
|
|
2
2
|
import { IconDefinition } from '@mezzanine-ui/icons';
|
|
3
3
|
interface NavigationItem {
|
|
4
4
|
readonly href: string;
|
|
@@ -6,11 +6,11 @@ interface NavigationItem {
|
|
|
6
6
|
readonly label: string;
|
|
7
7
|
readonly requiresAdmin?: boolean;
|
|
8
8
|
}
|
|
9
|
-
interface
|
|
9
|
+
export interface AppNavigationGroup {
|
|
10
10
|
readonly title: string;
|
|
11
11
|
readonly items: readonly NavigationItem[];
|
|
12
12
|
}
|
|
13
|
-
export interface
|
|
13
|
+
export interface AppLayoutProps {
|
|
14
14
|
/** Override the active href detection (defaults to router's pathname). */
|
|
15
15
|
readonly activeHref?: string;
|
|
16
16
|
/** Logo image URL displayed in the sidebar header. */
|
|
@@ -21,14 +21,21 @@ export interface AppNavigationProps {
|
|
|
21
21
|
* Override the entire navigation tree. When omitted, the default 4-group
|
|
22
22
|
* BPM admin nav (`我的工作` / `查詢與代理` / `簽核設計` / `系統管理`) is used.
|
|
23
23
|
*/
|
|
24
|
-
readonly groups?: readonly
|
|
24
|
+
readonly groups?: readonly AppNavigationGroup[];
|
|
25
|
+
/** Page content rendered inside the Mezzanine `<Layout.Main>` slot. */
|
|
26
|
+
readonly children?: ReactNode;
|
|
25
27
|
}
|
|
26
28
|
/**
|
|
27
|
-
* BPM admin
|
|
28
|
-
* default 4-group BPM tree
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
29
|
+
* BPM admin layout shell — composes Mezzanine `<Layout>` + `<Navigation>`
|
|
30
|
+
* with the default 4-group BPM tree, and exposes a `children` prop that
|
|
31
|
+
* fills the `<Layout.Main>` slot.
|
|
32
|
+
*
|
|
33
|
+
* Why a single component instead of a `<Navigation>` wrapper: Mezzanine
|
|
34
|
+
* `<Layout>` discovers its slot children by component-identity match
|
|
35
|
+
* (`child.type === Navigation` / `LayoutMain` / etc.). Any custom wrapper
|
|
36
|
+
* around `<Navigation>` is silently dropped, so the sidebar disappears.
|
|
37
|
+
* Keeping the `<Navigation>` element as a direct child of `<Layout>` here
|
|
38
|
+
* is mandatory for the slot to register.
|
|
32
39
|
*/
|
|
33
|
-
export declare function
|
|
40
|
+
export declare function AppLayout({ activeHref, logoSrc, title, groups, children, }: AppLayoutProps): ReactElement;
|
|
34
41
|
export {};
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/app-navigation-
|
|
1
|
+
"use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/app-navigation-C_mbz7jx.cjs"),t=require("./chunks/auth-provider-BV8Iiwfb.cjs"),n=require("./chunks/format-date-time-isOa3e9q.cjs"),r=require("./chunks/admin-pickers-Btvij1at.cjs"),i=require("./chunks/approval-instance-list-page-Mo6wpDPb.cjs"),a=require("./chunks/bpm-form-field-Bc6k4ZEO.cjs"),o=require("./chunks/dashboard-page-DCmuB0Rw.cjs");let s=require("react"),c=require("react/jsx-runtime"),l=require("@rytass/bpm-core-client/workflow"),u=require("@mezzanine-ui/react/moment"),d=require("@mezzanine-ui/react/Drawer");d=e.o(d,1);let f=require("@mezzanine-ui/react/NotificationCenter");f=e.o(f,1);var p=[`today`,`yesterday`,`past7Days`,`earlier`],m={earlier:`更早`,past7Days:`過去七天`,today:`今天`,yesterday:`昨天`},h=50;function g(){let n=t.a(),{member:r}=t.n(),{close:i,isOpen:a}=e.a(),{refreshUnreadCount:o}=e.r(),u=r?.memberId??null,[g,b]=(0,s.useState)([]),[x,S]=(0,s.useState)(0),[C,w]=(0,s.useState)(1),[T,E]=(0,s.useState)(!1),[D,O]=(0,s.useState)(!1),[k,A]=(0,s.useState)(null),[j,M]=(0,s.useState)(`all`),N=(0,s.useCallback)(async(e,t)=>{if(u){E(!0),A(null);try{let n=await(0,l.listNotifications)({includeRead:!0,page:e,pageSize:h,recipientMemberId:u});b(e=>t?[...e,...n.notifications]:n.notifications),S(n.totalCount),w(e),await o()}catch(e){A(y(e))}finally{E(!1)}}},[u,o]);(0,s.useEffect)(()=>{!a||!u||N(1,!1)},[a,u,N]);let P=(0,s.useCallback)(e=>{let t=e.target.value;(t===`all`||t===`read`||t===`unread`)&&M(t)},[]),F=(0,s.useCallback)(async()=>{if(!(!u||D)){O(!0),A(null);try{await(0,l.markAllNotificationsRead)({recipientMemberId:u}),await N(1,!1)}catch(e){A(y(e))}finally{O(!1)}}},[D,u,N]),I=(0,s.useCallback)(()=>{T||N(C+1,!0)},[T,N,C]),L=(0,s.useCallback)(async e=>{if(u)try{await(0,l.markNotificationRead)({id:e,readerMemberId:u}),await N(1,!1)}catch(e){A(y(e))}},[u,N]),R=(0,s.useCallback)(async e=>{if(!(!e.instanceId||!u))try{e.status!==`READ`&&(await(0,l.markNotificationRead)({id:e.id,readerMemberId:u}),await o()),i(),n.push(`/instances/${e.instanceId}`)}catch(e){A(y(e))}},[i,u,o,n]),z=(0,s.useMemo)(()=>g.filter(e=>j===`all`?!0:j===`read`?e.status===`READ`:e.status!==`READ`),[j,g]),B=(0,s.useMemo)(()=>{let e=new Date,t=p.reduce((e,t)=>(e[t]=[],e),{earlier:[],past7Days:[],today:[],yesterday:[]});return z.forEach(n=>{t[v(n.createdAt,e)].push(n)}),p.map(e=>[e,t[e]]).filter(([,e])=>e.length>0)},[z]),V=g.length<x;return u?(0,c.jsx)(d.default,{bottomGhostActionDisabled:D||T,bottomGhostActionLoading:D,bottomGhostActionText:`全部標為已讀`,bottomOnGhostActionClick:()=>{F()},bottomOnPrimaryActionClick:()=>{I()},bottomPrimaryActionDisabled:!V||T,bottomPrimaryActionLoading:T&&V,bottomPrimaryActionText:V?`載入更多`:`已顯示全部`,contentKey:`${j}:${g.length}`,filterAreaAllRadioLabel:`全部`,filterAreaOnRadioChange:P,filterAreaReadRadioLabel:`已讀`,filterAreaShow:!0,filterAreaUnreadRadioLabel:`未讀`,filterAreaValue:j,headerTitle:`通知中心`,isBottomDisplay:!0,isHeaderDisplay:!0,onClose:i,open:a,size:`medium`,children:(0,c.jsxs)(`div`,{role:`list`,children:[k?(0,c.jsx)(`p`,{role:`alert`,style:{color:`var(--mzn-color-text-error, #d92d20)`,padding:`12px 16px`},children:k}):null,B.length===0?(0,c.jsx)(`p`,{style:{color:`var(--mzn-color-text-secondary, #6b7280)`,padding:`24px 16px`,textAlign:`center`},children:T?`載入中…`:`目前沒有通知`}):null,B.map(([e,t],n)=>(0,c.jsx)(s.Fragment,{children:t.map((r,i)=>(0,c.jsx)(f.default,{appendTips:n===B.length-1&&i===t.length-1&&!V?`已顯示全部通知`:void 0,cancelButtonText:r.status===`READ`?void 0:`標為已讀`,description:r.body,onCancel:r.status===`READ`?void 0:()=>{L(r.id)},onConfirm:r.instanceId?()=>{R(r)}:void 0,confirmButtonText:r.instanceId?`查看案件`:void 0,prependTips:i===0?m[e]:void 0,reference:r.id,severity:_(r.type),showBadge:r.status!==`READ`,timeStamp:r.createdAt,title:r.title,type:`drawer`},r.id))},e))]})}):null}function _(e){return e===`SLA_OVERDUE`?`error`:e===`SLA_WARNING`?`warning`:e===`INSTANCE_COMPLETED`?`success`:`info`}function v(e,t){let n=new Date(e);if(Number.isNaN(n.getTime()))return`earlier`;let r=new Date(t.getFullYear(),t.getMonth(),t.getDate()),i=new Date(n.getFullYear(),n.getMonth(),n.getDate());if(i.getTime()===r.getTime())return`today`;let a=new Date(r);return a.setDate(a.getDate()-1),i.getTime()===a.getTime()?`yesterday`:(t.getTime()-n.getTime())/(1e3*60*60*24)<=7?`past7Days`:`earlier`}function y(e){return e instanceof Error?e.message:`發生未知錯誤`}function b({children:n,locale:r=u.CalendarLocale.ZH_TW,publicPaths:i,loginPath:a}){return(0,c.jsx)(u.CalendarConfigProviderMoment,{locale:r,children:(0,c.jsx)(t.t,{publicPaths:i,loginPath:a,children:(0,c.jsx)(e.n,{children:(0,c.jsxs)(e.i,{children:[n,(0,c.jsx)(g,{})]})})})})}exports.AppLayout=e.t,exports.ApprovalInstanceListPage=i.t,exports.AuthProvider=t.t,exports.BPMFormField=a.t,exports.DashboardPage=o.t,exports.MemberPicker=r.t,exports.NotificationDrawer=g,exports.NotificationDrawerProvider=e.i,exports.NotificationUnreadProvider=e.n,exports.OrgUnitPicker=r.n,exports.PositionPicker=r.r,exports.Providers=b,exports.RouterAdapterProvider=t.r,exports.defaultBrowserSearchParams=t.i,exports.formatDateTime=n.t,exports.readMemberOption=r.i,exports.readOrgUnitOption=r.a,exports.readPositionOption=r.o,exports.useAuth=t.n,exports.useNotificationDrawer=e.a,exports.useNotificationUnread=e.r,exports.useRouterAdapter=t.a;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../src/components/notification-drawer.tsx","../src/lib/providers.tsx"],"sourcesContent":["'use client';\n\nimport {\n Fragment,\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ChangeEvent,\n type ReactElement,\n} from 'react';\nimport Drawer from '@mezzanine-ui/react/Drawer';\nimport NotificationCenter from '@mezzanine-ui/react/NotificationCenter';\nimport type { NotificationSeverity } from '@mezzanine-ui/core/notification-center';\nimport {\n listNotifications,\n markAllNotificationsRead,\n markNotificationRead,\n type NotificationRecord,\n type NotificationType,\n} from '@rytass/bpm-core-client/workflow';\nimport { useAuth } from '../lib/auth-provider';\nimport { useNotificationDrawer } from '../lib/notification-drawer-provider';\nimport { useNotificationUnread } from '../lib/notification-unread-provider';\nimport { useRouterAdapter } from '../lib/router-adapter';\n\ntype FilterValue = 'all' | 'read' | 'unread';\n\ntype TimeGroup = 'today' | 'yesterday' | 'past7Days' | 'earlier';\n\nconst TIME_GROUP_ORDER: readonly TimeGroup[] = [\n 'today',\n 'yesterday',\n 'past7Days',\n 'earlier',\n];\n\nconst TIME_GROUP_LABEL: Readonly<Record<TimeGroup, string>> = {\n earlier: '更早',\n past7Days: '過去七天',\n today: '今天',\n yesterday: '昨天',\n};\n\nconst PAGE_SIZE = 50;\n\n/**\n * Right-side notification drawer mounted at the root by `<Providers>`.\n * Opens / closes via `useNotificationDrawer()`, polls\n * `listNotifications()` for the current member, supports filter\n * (`all` / `read` / `unread`), per-row mark-read, bulk mark-all-read, and\n * load-more pagination. Clicking a row with an `instanceId` navigates to\n * `/instances/<id>` via the host's router adapter.\n */\nexport function NotificationDrawer(): ReactElement | null {\n const router = useRouterAdapter();\n const { member } = useAuth();\n const { close, isOpen } = useNotificationDrawer();\n const { refreshUnreadCount } = useNotificationUnread();\n const currentMemberId = member?.memberId ?? null;\n const [rows, setRows] = useState<readonly NotificationRecord[]>([]);\n const [totalCount, setTotalCount] = useState(0);\n const [page, setPage] = useState(1);\n const [loading, setLoading] = useState(false);\n const [bulkLoading, setBulkLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [filter, setFilter] = useState<FilterValue>('all');\n\n const loadPage = useCallback(\n async (nextPage: number, append: boolean): Promise<void> => {\n if (!currentMemberId) return;\n setLoading(true);\n setError(null);\n try {\n const result = await listNotifications({\n includeRead: true,\n page: nextPage,\n pageSize: PAGE_SIZE,\n recipientMemberId: currentMemberId,\n });\n setRows((current): readonly NotificationRecord[] =>\n append ? [...current, ...result.notifications] : result.notifications,\n );\n setTotalCount(result.totalCount);\n setPage(nextPage);\n await refreshUnreadCount();\n } catch (e: unknown) {\n setError(readErrorMessage(e));\n } finally {\n setLoading(false);\n }\n },\n [currentMemberId, refreshUnreadCount],\n );\n\n useEffect((): void => {\n if (!isOpen || !currentMemberId) return;\n void loadPage(1, false);\n }, [isOpen, currentMemberId, loadPage]);\n\n const handleFilterChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>): void => {\n const next = event.target.value;\n if (next === 'all' || next === 'read' || next === 'unread') setFilter(next);\n },\n [],\n );\n\n const handleMarkAllRead = useCallback(async (): Promise<void> => {\n if (!currentMemberId || bulkLoading) return;\n setBulkLoading(true);\n setError(null);\n try {\n await markAllNotificationsRead({ recipientMemberId: currentMemberId });\n await loadPage(1, false);\n } catch (e: unknown) {\n setError(readErrorMessage(e));\n } finally {\n setBulkLoading(false);\n }\n }, [bulkLoading, currentMemberId, loadPage]);\n\n const handleLoadMore = useCallback((): void => {\n if (loading) return;\n void loadPage(page + 1, true);\n }, [loading, loadPage, page]);\n\n const handleMarkRead = useCallback(\n async (id: string): Promise<void> => {\n if (!currentMemberId) return;\n try {\n await markNotificationRead({ id, readerMemberId: currentMemberId });\n await loadPage(1, false);\n } catch (e: unknown) {\n setError(readErrorMessage(e));\n }\n },\n [currentMemberId, loadPage],\n );\n\n const handleOpenInstance = useCallback(\n async (record: NotificationRecord): Promise<void> => {\n if (!record.instanceId || !currentMemberId) return;\n try {\n if (record.status !== 'READ') {\n await markNotificationRead({\n id: record.id,\n readerMemberId: currentMemberId,\n });\n await refreshUnreadCount();\n }\n close();\n router.push(`/instances/${record.instanceId}`);\n } catch (e: unknown) {\n setError(readErrorMessage(e));\n }\n },\n [close, currentMemberId, refreshUnreadCount, router],\n );\n\n const filteredRows = useMemo(\n (): readonly NotificationRecord[] =>\n rows.filter((row): boolean => {\n if (filter === 'all') return true;\n if (filter === 'read') return row.status === 'READ';\n return row.status !== 'READ';\n }),\n [filter, rows],\n );\n\n const groupedRows = useMemo(\n (): ReadonlyArray<readonly [TimeGroup, readonly NotificationRecord[]]> => {\n const now = new Date();\n const buckets = TIME_GROUP_ORDER.reduce<\n Record<TimeGroup, NotificationRecord[]>\n >(\n (accumulator, group) => {\n accumulator[group] = [];\n return accumulator;\n },\n { earlier: [], past7Days: [], today: [], yesterday: [] },\n );\n filteredRows.forEach((row): void => {\n buckets[resolveTimeGroup(row.createdAt, now)].push(row);\n });\n return TIME_GROUP_ORDER.map(\n (group) => [group, buckets[group]] as const,\n ).filter(([, items]) => items.length > 0);\n },\n [filteredRows],\n );\n\n const hasMore = rows.length < totalCount;\n\n if (!currentMemberId) return null;\n\n return (\n <Drawer\n bottomGhostActionDisabled={bulkLoading || loading}\n bottomGhostActionLoading={bulkLoading}\n bottomGhostActionText=\"全部標為已讀\"\n bottomOnGhostActionClick={(): void => {\n void handleMarkAllRead();\n }}\n bottomOnPrimaryActionClick={(): void => {\n handleLoadMore();\n }}\n bottomPrimaryActionDisabled={!hasMore || loading}\n bottomPrimaryActionLoading={loading && hasMore}\n bottomPrimaryActionText={hasMore ? '載入更多' : '已顯示全部'}\n contentKey={`${filter}:${rows.length}`}\n filterAreaAllRadioLabel=\"全部\"\n filterAreaOnRadioChange={handleFilterChange}\n filterAreaReadRadioLabel=\"已讀\"\n filterAreaShow\n filterAreaUnreadRadioLabel=\"未讀\"\n filterAreaValue={filter}\n headerTitle=\"通知中心\"\n isBottomDisplay\n isHeaderDisplay\n onClose={close}\n open={isOpen}\n size=\"medium\"\n >\n <div role=\"list\">\n {error ? (\n <p\n role=\"alert\"\n style={{\n color: 'var(--mzn-color-text-error, #d92d20)',\n padding: '12px 16px',\n }}\n >\n {error}\n </p>\n ) : null}\n {groupedRows.length === 0 ? (\n <p\n style={{\n color: 'var(--mzn-color-text-secondary, #6b7280)',\n padding: '24px 16px',\n textAlign: 'center',\n }}\n >\n {loading ? '載入中…' : '目前沒有通知'}\n </p>\n ) : null}\n {groupedRows.map(([group, items], groupIndex) => (\n <Fragment key={group}>\n {items.map((record, itemIndex) => (\n <NotificationCenter\n appendTips={\n groupIndex === groupedRows.length - 1 &&\n itemIndex === items.length - 1 &&\n !hasMore\n ? '已顯示全部通知'\n : undefined\n }\n cancelButtonText={\n record.status !== 'READ' ? '標為已讀' : undefined\n }\n description={record.body}\n key={record.id}\n onCancel={\n record.status !== 'READ'\n ? (): void => {\n void handleMarkRead(record.id);\n }\n : undefined\n }\n onConfirm={\n record.instanceId\n ? (): void => {\n void handleOpenInstance(record);\n }\n : undefined\n }\n confirmButtonText={record.instanceId ? '查看案件' : undefined}\n prependTips={itemIndex === 0 ? TIME_GROUP_LABEL[group] : undefined}\n reference={record.id}\n severity={toSeverity(record.type)}\n showBadge={record.status !== 'READ'}\n timeStamp={record.createdAt}\n title={record.title}\n type=\"drawer\"\n />\n ))}\n </Fragment>\n ))}\n </div>\n </Drawer>\n );\n}\n\nfunction toSeverity(type: NotificationType): NotificationSeverity {\n if (type === 'SLA_OVERDUE') return 'error';\n if (type === 'SLA_WARNING') return 'warning';\n if (type === 'INSTANCE_COMPLETED') return 'success';\n return 'info';\n}\n\nfunction resolveTimeGroup(value: string, now: Date): TimeGroup {\n const notificationDate = new Date(value);\n if (Number.isNaN(notificationDate.getTime())) return 'earlier';\n const nowStartOfDay = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const notificationStartOfDay = new Date(\n notificationDate.getFullYear(),\n notificationDate.getMonth(),\n notificationDate.getDate(),\n );\n if (notificationStartOfDay.getTime() === nowStartOfDay.getTime()) return 'today';\n const yesterdayStartOfDay = new Date(nowStartOfDay);\n yesterdayStartOfDay.setDate(yesterdayStartOfDay.getDate() - 1);\n if (notificationStartOfDay.getTime() === yesterdayStartOfDay.getTime())\n return 'yesterday';\n const diffInDays =\n (now.getTime() - notificationDate.getTime()) / (1000 * 60 * 60 * 24);\n if (diffInDays <= 7) return 'past7Days';\n return 'earlier';\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n","'use client';\n\nimport type { ReactElement, ReactNode } from 'react';\nimport {\n CalendarConfigProviderMoment,\n CalendarLocale,\n} from '@mezzanine-ui/react/moment';\nimport { AuthProvider } from './auth-provider';\nimport { NotificationDrawer } from '../components/notification-drawer';\nimport { NotificationDrawerProvider } from './notification-drawer-provider';\nimport { NotificationUnreadProvider } from './notification-unread-provider';\n\ninterface ProvidersProps {\n readonly children: ReactNode;\n /** Override Mezzanine calendar locale. Defaults to `CalendarLocale.ZH_TW`. */\n readonly locale?: CalendarLocale;\n /**\n * Public paths that should not trigger redirect to `/login` when there\n * is no session. Forwarded to `<AuthProvider>`. Defaults to `['/login']`.\n */\n readonly publicPaths?: readonly string[];\n /** Where to send unauthenticated users. Defaults to `'/login'`. */\n readonly loginPath?: string;\n}\n\n/**\n * One-stop BPM admin provider stack. Wires:\n *\n * - Mezzanine UI calendar locale (moment-based, `ZH_TW` by default)\n * - `<AuthProvider>` (BPM session via REST `/auth/*`)\n * - `<NotificationUnreadProvider>` (polls unread count)\n * - `<NotificationDrawerProvider>` (controls drawer open/close state)\n * - `<NotificationDrawer />` mounted at the root so the bell-icon button in\n * `<AppNavigation />` can open it.\n *\n * Consumer hosts wrap this **inside** a `<RouterAdapterProvider>` (provided\n * by the `pages/*` subpath shims when consuming via Next.js, or wired by\n * hand for other frameworks).\n */\nexport function Providers({\n children,\n locale = CalendarLocale.ZH_TW,\n publicPaths,\n loginPath,\n}: ProvidersProps): ReactElement {\n return (\n <CalendarConfigProviderMoment locale={locale}>\n <AuthProvider publicPaths={publicPaths} loginPath={loginPath}>\n <NotificationUnreadProvider>\n <NotificationDrawerProvider>\n {children}\n <NotificationDrawer />\n </NotificationDrawerProvider>\n </NotificationUnreadProvider>\n </AuthProvider>\n </CalendarConfigProviderMoment>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../src/components/notification-drawer.tsx","../src/lib/providers.tsx"],"sourcesContent":["'use client';\n\nimport {\n Fragment,\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ChangeEvent,\n type ReactElement,\n} from 'react';\nimport Drawer from '@mezzanine-ui/react/Drawer';\nimport NotificationCenter from '@mezzanine-ui/react/NotificationCenter';\nimport type { NotificationSeverity } from '@mezzanine-ui/core/notification-center';\nimport {\n listNotifications,\n markAllNotificationsRead,\n markNotificationRead,\n type NotificationRecord,\n type NotificationType,\n} from '@rytass/bpm-core-client/workflow';\nimport { useAuth } from '../lib/auth-provider';\nimport { useNotificationDrawer } from '../lib/notification-drawer-provider';\nimport { useNotificationUnread } from '../lib/notification-unread-provider';\nimport { useRouterAdapter } from '../lib/router-adapter';\n\ntype FilterValue = 'all' | 'read' | 'unread';\n\ntype TimeGroup = 'today' | 'yesterday' | 'past7Days' | 'earlier';\n\nconst TIME_GROUP_ORDER: readonly TimeGroup[] = [\n 'today',\n 'yesterday',\n 'past7Days',\n 'earlier',\n];\n\nconst TIME_GROUP_LABEL: Readonly<Record<TimeGroup, string>> = {\n earlier: '更早',\n past7Days: '過去七天',\n today: '今天',\n yesterday: '昨天',\n};\n\nconst PAGE_SIZE = 50;\n\n/**\n * Right-side notification drawer mounted at the root by `<Providers>`.\n * Opens / closes via `useNotificationDrawer()`, polls\n * `listNotifications()` for the current member, supports filter\n * (`all` / `read` / `unread`), per-row mark-read, bulk mark-all-read, and\n * load-more pagination. Clicking a row with an `instanceId` navigates to\n * `/instances/<id>` via the host's router adapter.\n */\nexport function NotificationDrawer(): ReactElement | null {\n const router = useRouterAdapter();\n const { member } = useAuth();\n const { close, isOpen } = useNotificationDrawer();\n const { refreshUnreadCount } = useNotificationUnread();\n const currentMemberId = member?.memberId ?? null;\n const [rows, setRows] = useState<readonly NotificationRecord[]>([]);\n const [totalCount, setTotalCount] = useState(0);\n const [page, setPage] = useState(1);\n const [loading, setLoading] = useState(false);\n const [bulkLoading, setBulkLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [filter, setFilter] = useState<FilterValue>('all');\n\n const loadPage = useCallback(\n async (nextPage: number, append: boolean): Promise<void> => {\n if (!currentMemberId) return;\n setLoading(true);\n setError(null);\n try {\n const result = await listNotifications({\n includeRead: true,\n page: nextPage,\n pageSize: PAGE_SIZE,\n recipientMemberId: currentMemberId,\n });\n setRows((current): readonly NotificationRecord[] =>\n append ? [...current, ...result.notifications] : result.notifications,\n );\n setTotalCount(result.totalCount);\n setPage(nextPage);\n await refreshUnreadCount();\n } catch (e: unknown) {\n setError(readErrorMessage(e));\n } finally {\n setLoading(false);\n }\n },\n [currentMemberId, refreshUnreadCount],\n );\n\n useEffect((): void => {\n if (!isOpen || !currentMemberId) return;\n void loadPage(1, false);\n }, [isOpen, currentMemberId, loadPage]);\n\n const handleFilterChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>): void => {\n const next = event.target.value;\n if (next === 'all' || next === 'read' || next === 'unread') setFilter(next);\n },\n [],\n );\n\n const handleMarkAllRead = useCallback(async (): Promise<void> => {\n if (!currentMemberId || bulkLoading) return;\n setBulkLoading(true);\n setError(null);\n try {\n await markAllNotificationsRead({ recipientMemberId: currentMemberId });\n await loadPage(1, false);\n } catch (e: unknown) {\n setError(readErrorMessage(e));\n } finally {\n setBulkLoading(false);\n }\n }, [bulkLoading, currentMemberId, loadPage]);\n\n const handleLoadMore = useCallback((): void => {\n if (loading) return;\n void loadPage(page + 1, true);\n }, [loading, loadPage, page]);\n\n const handleMarkRead = useCallback(\n async (id: string): Promise<void> => {\n if (!currentMemberId) return;\n try {\n await markNotificationRead({ id, readerMemberId: currentMemberId });\n await loadPage(1, false);\n } catch (e: unknown) {\n setError(readErrorMessage(e));\n }\n },\n [currentMemberId, loadPage],\n );\n\n const handleOpenInstance = useCallback(\n async (record: NotificationRecord): Promise<void> => {\n if (!record.instanceId || !currentMemberId) return;\n try {\n if (record.status !== 'READ') {\n await markNotificationRead({\n id: record.id,\n readerMemberId: currentMemberId,\n });\n await refreshUnreadCount();\n }\n close();\n router.push(`/instances/${record.instanceId}`);\n } catch (e: unknown) {\n setError(readErrorMessage(e));\n }\n },\n [close, currentMemberId, refreshUnreadCount, router],\n );\n\n const filteredRows = useMemo(\n (): readonly NotificationRecord[] =>\n rows.filter((row): boolean => {\n if (filter === 'all') return true;\n if (filter === 'read') return row.status === 'READ';\n return row.status !== 'READ';\n }),\n [filter, rows],\n );\n\n const groupedRows = useMemo(\n (): ReadonlyArray<readonly [TimeGroup, readonly NotificationRecord[]]> => {\n const now = new Date();\n const buckets = TIME_GROUP_ORDER.reduce<\n Record<TimeGroup, NotificationRecord[]>\n >(\n (accumulator, group) => {\n accumulator[group] = [];\n return accumulator;\n },\n { earlier: [], past7Days: [], today: [], yesterday: [] },\n );\n filteredRows.forEach((row): void => {\n buckets[resolveTimeGroup(row.createdAt, now)].push(row);\n });\n return TIME_GROUP_ORDER.map(\n (group) => [group, buckets[group]] as const,\n ).filter(([, items]) => items.length > 0);\n },\n [filteredRows],\n );\n\n const hasMore = rows.length < totalCount;\n\n if (!currentMemberId) return null;\n\n return (\n <Drawer\n bottomGhostActionDisabled={bulkLoading || loading}\n bottomGhostActionLoading={bulkLoading}\n bottomGhostActionText=\"全部標為已讀\"\n bottomOnGhostActionClick={(): void => {\n void handleMarkAllRead();\n }}\n bottomOnPrimaryActionClick={(): void => {\n handleLoadMore();\n }}\n bottomPrimaryActionDisabled={!hasMore || loading}\n bottomPrimaryActionLoading={loading && hasMore}\n bottomPrimaryActionText={hasMore ? '載入更多' : '已顯示全部'}\n contentKey={`${filter}:${rows.length}`}\n filterAreaAllRadioLabel=\"全部\"\n filterAreaOnRadioChange={handleFilterChange}\n filterAreaReadRadioLabel=\"已讀\"\n filterAreaShow\n filterAreaUnreadRadioLabel=\"未讀\"\n filterAreaValue={filter}\n headerTitle=\"通知中心\"\n isBottomDisplay\n isHeaderDisplay\n onClose={close}\n open={isOpen}\n size=\"medium\"\n >\n <div role=\"list\">\n {error ? (\n <p\n role=\"alert\"\n style={{\n color: 'var(--mzn-color-text-error, #d92d20)',\n padding: '12px 16px',\n }}\n >\n {error}\n </p>\n ) : null}\n {groupedRows.length === 0 ? (\n <p\n style={{\n color: 'var(--mzn-color-text-secondary, #6b7280)',\n padding: '24px 16px',\n textAlign: 'center',\n }}\n >\n {loading ? '載入中…' : '目前沒有通知'}\n </p>\n ) : null}\n {groupedRows.map(([group, items], groupIndex) => (\n <Fragment key={group}>\n {items.map((record, itemIndex) => (\n <NotificationCenter\n appendTips={\n groupIndex === groupedRows.length - 1 &&\n itemIndex === items.length - 1 &&\n !hasMore\n ? '已顯示全部通知'\n : undefined\n }\n cancelButtonText={\n record.status !== 'READ' ? '標為已讀' : undefined\n }\n description={record.body}\n key={record.id}\n onCancel={\n record.status !== 'READ'\n ? (): void => {\n void handleMarkRead(record.id);\n }\n : undefined\n }\n onConfirm={\n record.instanceId\n ? (): void => {\n void handleOpenInstance(record);\n }\n : undefined\n }\n confirmButtonText={record.instanceId ? '查看案件' : undefined}\n prependTips={itemIndex === 0 ? TIME_GROUP_LABEL[group] : undefined}\n reference={record.id}\n severity={toSeverity(record.type)}\n showBadge={record.status !== 'READ'}\n timeStamp={record.createdAt}\n title={record.title}\n type=\"drawer\"\n />\n ))}\n </Fragment>\n ))}\n </div>\n </Drawer>\n );\n}\n\nfunction toSeverity(type: NotificationType): NotificationSeverity {\n if (type === 'SLA_OVERDUE') return 'error';\n if (type === 'SLA_WARNING') return 'warning';\n if (type === 'INSTANCE_COMPLETED') return 'success';\n return 'info';\n}\n\nfunction resolveTimeGroup(value: string, now: Date): TimeGroup {\n const notificationDate = new Date(value);\n if (Number.isNaN(notificationDate.getTime())) return 'earlier';\n const nowStartOfDay = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const notificationStartOfDay = new Date(\n notificationDate.getFullYear(),\n notificationDate.getMonth(),\n notificationDate.getDate(),\n );\n if (notificationStartOfDay.getTime() === nowStartOfDay.getTime()) return 'today';\n const yesterdayStartOfDay = new Date(nowStartOfDay);\n yesterdayStartOfDay.setDate(yesterdayStartOfDay.getDate() - 1);\n if (notificationStartOfDay.getTime() === yesterdayStartOfDay.getTime())\n return 'yesterday';\n const diffInDays =\n (now.getTime() - notificationDate.getTime()) / (1000 * 60 * 60 * 24);\n if (diffInDays <= 7) return 'past7Days';\n return 'earlier';\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n","'use client';\n\nimport type { ReactElement, ReactNode } from 'react';\nimport {\n CalendarConfigProviderMoment,\n CalendarLocale,\n} from '@mezzanine-ui/react/moment';\nimport { AuthProvider } from './auth-provider';\nimport { NotificationDrawer } from '../components/notification-drawer';\nimport { NotificationDrawerProvider } from './notification-drawer-provider';\nimport { NotificationUnreadProvider } from './notification-unread-provider';\n\ninterface ProvidersProps {\n readonly children: ReactNode;\n /** Override Mezzanine calendar locale. Defaults to `CalendarLocale.ZH_TW`. */\n readonly locale?: CalendarLocale;\n /**\n * Public paths that should not trigger redirect to `/login` when there\n * is no session. Forwarded to `<AuthProvider>`. Defaults to `['/login']`.\n */\n readonly publicPaths?: readonly string[];\n /** Where to send unauthenticated users. Defaults to `'/login'`. */\n readonly loginPath?: string;\n}\n\n/**\n * One-stop BPM admin provider stack. Wires:\n *\n * - Mezzanine UI calendar locale (moment-based, `ZH_TW` by default)\n * - `<AuthProvider>` (BPM session via REST `/auth/*`)\n * - `<NotificationUnreadProvider>` (polls unread count)\n * - `<NotificationDrawerProvider>` (controls drawer open/close state)\n * - `<NotificationDrawer />` mounted at the root so the bell-icon button in\n * `<AppLayout />` can open it.\n *\n * Consumer hosts wrap this **inside** a `<RouterAdapterProvider>` (provided\n * by the `pages/*` subpath shims when consuming via Next.js, or wired by\n * hand for other frameworks).\n */\nexport function Providers({\n children,\n locale = CalendarLocale.ZH_TW,\n publicPaths,\n loginPath,\n}: ProvidersProps): ReactElement {\n return (\n <CalendarConfigProviderMoment locale={locale}>\n <AuthProvider publicPaths={publicPaths} loginPath={loginPath}>\n <NotificationUnreadProvider>\n <NotificationDrawerProvider>\n {children}\n <NotificationDrawer />\n </NotificationDrawerProvider>\n </NotificationUnreadProvider>\n </AuthProvider>\n </CalendarConfigProviderMoment>\n );\n}\n"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import { n as r, t as i } from "./chunks/auth-provider-TTO9eNZV.js";
|
|
2
|
+
import { a as e, i as t, n, r, t as i } from "./chunks/auth-provider-Bnox5gsx.js";
|
|
4
3
|
import { t as a } from "./chunks/format-date-time-CB-LxzqT.js";
|
|
5
|
-
import { a as o, i as s, n as c, r as l, t as u } from "./chunks/app-navigation-
|
|
4
|
+
import { a as o, i as s, n as c, r as l, t as u } from "./chunks/app-navigation-uwbNEw9P.js";
|
|
6
5
|
import { a as d, i as f, n as p, o as m, r as h, t as g } from "./chunks/admin-pickers-DLlG_1du.js";
|
|
7
|
-
import { t as _ } from "./chunks/approval-instance-list-page-
|
|
6
|
+
import { t as _ } from "./chunks/approval-instance-list-page-nmzMrj0b.js";
|
|
8
7
|
import { t as v } from "./chunks/bpm-form-field-Cao0rMol.js";
|
|
9
|
-
import { t as y } from "./chunks/dashboard-page-
|
|
8
|
+
import { t as y } from "./chunks/dashboard-page-Dx5PeEeN.js";
|
|
10
9
|
import { Fragment as b, useCallback as x, useEffect as S, useMemo as C, useState as w } from "react";
|
|
11
10
|
import { jsx as T, jsxs as E } from "react/jsx-runtime";
|
|
12
11
|
import { listNotifications as D, markAllNotificationsRead as O, markNotificationRead as k } from "@rytass/bpm-core-client/workflow";
|
|
@@ -26,7 +25,7 @@ var P = [
|
|
|
26
25
|
yesterday: "昨天"
|
|
27
26
|
}, I = 50;
|
|
28
27
|
function L() {
|
|
29
|
-
let
|
|
28
|
+
let t = e(), { member: r } = n(), { close: i, isOpen: a } = o(), { refreshUnreadCount: s } = l(), c = r?.memberId ?? null, [u, d] = w([]), [f, p] = w(0), [m, h] = w(1), [g, _] = w(!1), [v, y] = w(!1), [A, j] = w(null), [L, V] = w("all"), H = x(async (e, t) => {
|
|
30
29
|
if (c) {
|
|
31
30
|
_(!0), j(null);
|
|
32
31
|
try {
|
|
@@ -84,12 +83,12 @@ function L() {
|
|
|
84
83
|
} catch (e) {
|
|
85
84
|
j(B(e));
|
|
86
85
|
}
|
|
87
|
-
}, [c, H]), q = x(async (
|
|
88
|
-
if (!(!
|
|
89
|
-
|
|
90
|
-
id:
|
|
86
|
+
}, [c, H]), q = x(async (e) => {
|
|
87
|
+
if (!(!e.instanceId || !c)) try {
|
|
88
|
+
e.status !== "READ" && (await k({
|
|
89
|
+
id: e.id,
|
|
91
90
|
readerMemberId: c
|
|
92
|
-
}), await s()), i(),
|
|
91
|
+
}), await s()), i(), t.push(`/instances/${e.instanceId}`);
|
|
93
92
|
} catch (e) {
|
|
94
93
|
j(B(e));
|
|
95
94
|
}
|
|
@@ -97,7 +96,7 @@ function L() {
|
|
|
97
96
|
i,
|
|
98
97
|
c,
|
|
99
98
|
s,
|
|
100
|
-
|
|
99
|
+
t
|
|
101
100
|
]), J = C(() => u.filter((e) => L === "all" ? !0 : L === "read" ? e.status === "READ" : e.status !== "READ"), [L, u]), Y = C(() => {
|
|
102
101
|
let e = /* @__PURE__ */ new Date(), t = P.reduce((e, t) => (e[t] = [], e), {
|
|
103
102
|
earlier: [],
|
|
@@ -204,6 +203,6 @@ function V({ children: e, locale: t = j.ZH_TW, publicPaths: n, loginPath: r }) {
|
|
|
204
203
|
});
|
|
205
204
|
}
|
|
206
205
|
//#endregion
|
|
207
|
-
export { u as
|
|
206
|
+
export { u as AppLayout, _ as ApprovalInstanceListPage, i as AuthProvider, v as BPMFormField, y as DashboardPage, g as MemberPicker, L as NotificationDrawer, s as NotificationDrawerProvider, c as NotificationUnreadProvider, p as OrgUnitPicker, h as PositionPicker, V as Providers, r as RouterAdapterProvider, t as defaultBrowserSearchParams, a as formatDateTime, f as readMemberOption, d as readOrgUnitOption, m as readPositionOption, n as useAuth, o as useNotificationDrawer, l as useNotificationUnread, e as useRouterAdapter };
|
|
208
207
|
|
|
209
208
|
//# sourceMappingURL=index.js.map
|