@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,281 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { a as e } from "./auth-provider-Bnox5gsx.js";
|
|
3
|
+
import { t } from "./format-date-time-CB-LxzqT.js";
|
|
4
|
+
import { t as n } from "./app-navigation-uwbNEw9P.js";
|
|
5
|
+
import { useCallback as r, useEffect as i, useMemo as a, useState as o } from "react";
|
|
6
|
+
import { Filter as s, FilterArea as c, FilterLine as ee, FormField as l, Input as u, PageHeader as d, Section as f, SectionGroup as p, Select as te, Table as ne, Typography as m } from "@mezzanine-ui/react";
|
|
7
|
+
import { resolveMembers as h } from "@rytass/bpm-core-client";
|
|
8
|
+
import { jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
9
|
+
import { listApprovalInstancesPage as v, readApprovalInstanceCaseTitle as y } from "@rytass/bpm-core-client/workflow";
|
|
10
|
+
import b from "@mezzanine-ui/react/ContentHeader";
|
|
11
|
+
import { FormFieldLayout as x } from "@mezzanine-ui/core/form";
|
|
12
|
+
import '../approval-instance-list-page.css';var S = { instanceFilterArea: "bpm_instanceFilterArea_qpvJq" }, C = [
|
|
13
|
+
10,
|
|
14
|
+
20,
|
|
15
|
+
50
|
|
16
|
+
], w = [
|
|
17
|
+
{
|
|
18
|
+
id: "ALL",
|
|
19
|
+
name: "全部狀態",
|
|
20
|
+
state: null
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: "RUNNING",
|
|
24
|
+
name: "進行中",
|
|
25
|
+
state: "RUNNING"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: "APPROVED",
|
|
29
|
+
name: "已通過",
|
|
30
|
+
state: "APPROVED"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
id: "REJECTED",
|
|
34
|
+
name: "已拒絕",
|
|
35
|
+
state: "REJECTED"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: "RETURNED",
|
|
39
|
+
name: "已退回",
|
|
40
|
+
state: "RETURNED"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: "CANCELLED",
|
|
44
|
+
name: "已取消",
|
|
45
|
+
state: "CANCELLED"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: "EXPIRED",
|
|
49
|
+
name: "已逾期",
|
|
50
|
+
state: "EXPIRED"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: "DRAFT",
|
|
54
|
+
name: "草稿",
|
|
55
|
+
state: "DRAFT"
|
|
56
|
+
}
|
|
57
|
+
];
|
|
58
|
+
function T({ activeHref: y, defaultState: T, description: k, emptyMessage: A, searchPlaceholder: P, title: F, view: I }) {
|
|
59
|
+
let L = e(), [R, z] = o(null), [B, V] = o(/* @__PURE__ */ new Map()), [H, U] = o(1), [W, G] = o(10), [K, q] = o(0), [J, Y] = o(!0), [X, ie] = o([]), [Z, ae] = o(""), [Q, oe] = o(O(T)), $ = r(async () => {
|
|
60
|
+
Y(!0), z(null);
|
|
61
|
+
try {
|
|
62
|
+
let e = await v({
|
|
63
|
+
page: H,
|
|
64
|
+
pageSize: W,
|
|
65
|
+
searchText: Z,
|
|
66
|
+
state: Q.state,
|
|
67
|
+
templateId: null,
|
|
68
|
+
view: I
|
|
69
|
+
});
|
|
70
|
+
ie(e.instances.map(E)), q(e.totalCount);
|
|
71
|
+
} catch (e) {
|
|
72
|
+
z(N(e));
|
|
73
|
+
} finally {
|
|
74
|
+
Y(!1);
|
|
75
|
+
}
|
|
76
|
+
}, [
|
|
77
|
+
H,
|
|
78
|
+
W,
|
|
79
|
+
Z,
|
|
80
|
+
Q,
|
|
81
|
+
I
|
|
82
|
+
]);
|
|
83
|
+
i(() => {
|
|
84
|
+
$();
|
|
85
|
+
}, [$]), i(() => {
|
|
86
|
+
let e = Array.from(new Set(X.map((e) => e.initiatorMemberId).filter(Boolean)));
|
|
87
|
+
if (e.length === 0) {
|
|
88
|
+
V(/* @__PURE__ */ new Map());
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
let t = !1;
|
|
92
|
+
return (async () => {
|
|
93
|
+
try {
|
|
94
|
+
let n = await h(e);
|
|
95
|
+
if (t) return;
|
|
96
|
+
V(new Map(n.map((e) => [e.memberId, e])));
|
|
97
|
+
} catch {
|
|
98
|
+
if (t) return;
|
|
99
|
+
V(/* @__PURE__ */ new Map());
|
|
100
|
+
}
|
|
101
|
+
})(), () => {
|
|
102
|
+
t = !0;
|
|
103
|
+
};
|
|
104
|
+
}, [X]);
|
|
105
|
+
let se = a(() => [
|
|
106
|
+
{
|
|
107
|
+
dataIndex: "caseTitle",
|
|
108
|
+
key: "caseTitle",
|
|
109
|
+
title: "案件",
|
|
110
|
+
width: 300
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
key: "state",
|
|
114
|
+
render: (e) => /* @__PURE__ */ g(m, {
|
|
115
|
+
color: j(e.state),
|
|
116
|
+
component: "span",
|
|
117
|
+
variant: "body",
|
|
118
|
+
children: e.stateLabel
|
|
119
|
+
}),
|
|
120
|
+
title: "狀態",
|
|
121
|
+
width: 120
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
key: "initiatorMemberId",
|
|
125
|
+
render: (e) => /* @__PURE__ */ g(m, {
|
|
126
|
+
component: "span",
|
|
127
|
+
variant: "body",
|
|
128
|
+
children: M(e.initiatorMemberId, B)
|
|
129
|
+
}),
|
|
130
|
+
title: "發起人",
|
|
131
|
+
width: 180
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
key: "startedAt",
|
|
135
|
+
render: (e) => /* @__PURE__ */ g(m, {
|
|
136
|
+
component: "span",
|
|
137
|
+
variant: "body",
|
|
138
|
+
children: t(e.startedAt)
|
|
139
|
+
}),
|
|
140
|
+
title: "發起時間",
|
|
141
|
+
width: 220
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
key: "completedAt",
|
|
145
|
+
render: (e) => /* @__PURE__ */ g(m, {
|
|
146
|
+
component: "span",
|
|
147
|
+
variant: "body",
|
|
148
|
+
children: t(e.completedAt)
|
|
149
|
+
}),
|
|
150
|
+
title: "完成時間",
|
|
151
|
+
width: 220
|
|
152
|
+
}
|
|
153
|
+
], [B]), ce = a(() => ({
|
|
154
|
+
render: (e) => [{
|
|
155
|
+
name: "查看",
|
|
156
|
+
onClick: () => L.push(`/instances/${e.id}`)
|
|
157
|
+
}],
|
|
158
|
+
variant: "base-secondary",
|
|
159
|
+
width: 88
|
|
160
|
+
}), [L]);
|
|
161
|
+
return /* @__PURE__ */ _(n, {
|
|
162
|
+
activeHref: y,
|
|
163
|
+
children: [/* @__PURE__ */ g(d, { children: /* @__PURE__ */ g(b, {
|
|
164
|
+
description: k,
|
|
165
|
+
title: F
|
|
166
|
+
}) }), /* @__PURE__ */ g(p, { children: /* @__PURE__ */ _(f, {
|
|
167
|
+
filterArea: /* @__PURE__ */ g(c, {
|
|
168
|
+
className: S.instanceFilterArea,
|
|
169
|
+
size: "sub",
|
|
170
|
+
children: /* @__PURE__ */ _(ee, { children: [/* @__PURE__ */ g(s, {
|
|
171
|
+
span: 3,
|
|
172
|
+
children: /* @__PURE__ */ g(l, {
|
|
173
|
+
fullWidth: !0,
|
|
174
|
+
layout: x.VERTICAL,
|
|
175
|
+
name: "instanceSearchText",
|
|
176
|
+
children: /* @__PURE__ */ g(u, {
|
|
177
|
+
fullWidth: !0,
|
|
178
|
+
onChange: (e) => {
|
|
179
|
+
ae(e.target.value), U(1);
|
|
180
|
+
},
|
|
181
|
+
placeholder: P,
|
|
182
|
+
size: "sub",
|
|
183
|
+
value: Z,
|
|
184
|
+
variant: "base"
|
|
185
|
+
})
|
|
186
|
+
})
|
|
187
|
+
}), /* @__PURE__ */ g(s, {
|
|
188
|
+
span: 2,
|
|
189
|
+
children: /* @__PURE__ */ g(l, {
|
|
190
|
+
fullWidth: !0,
|
|
191
|
+
layout: x.VERTICAL,
|
|
192
|
+
name: "instanceState",
|
|
193
|
+
children: /* @__PURE__ */ g(te, {
|
|
194
|
+
clearable: !1,
|
|
195
|
+
fullWidth: !0,
|
|
196
|
+
onChange: (e) => {
|
|
197
|
+
oe(D(e)), U(1);
|
|
198
|
+
},
|
|
199
|
+
options: [...w],
|
|
200
|
+
placeholder: "狀態",
|
|
201
|
+
renderValue: (e) => `狀態:${re(e)}`,
|
|
202
|
+
size: "sub",
|
|
203
|
+
value: Q
|
|
204
|
+
})
|
|
205
|
+
})
|
|
206
|
+
})] })
|
|
207
|
+
}),
|
|
208
|
+
children: [
|
|
209
|
+
R ? /* @__PURE__ */ g(m, {
|
|
210
|
+
color: "text-error",
|
|
211
|
+
variant: "body",
|
|
212
|
+
children: R
|
|
213
|
+
}) : null,
|
|
214
|
+
!R && !J && X.length === 0 ? /* @__PURE__ */ g(m, {
|
|
215
|
+
color: "text-neutral",
|
|
216
|
+
variant: "body",
|
|
217
|
+
children: A
|
|
218
|
+
}) : null,
|
|
219
|
+
/* @__PURE__ */ g(ne, {
|
|
220
|
+
actions: ce,
|
|
221
|
+
columns: se,
|
|
222
|
+
dataSource: [...X],
|
|
223
|
+
fullWidth: !0,
|
|
224
|
+
loading: J,
|
|
225
|
+
pagination: {
|
|
226
|
+
current: H,
|
|
227
|
+
onChange: (e) => {
|
|
228
|
+
U(e);
|
|
229
|
+
},
|
|
230
|
+
onChangePageSize: (e) => {
|
|
231
|
+
U(1), G(e);
|
|
232
|
+
},
|
|
233
|
+
pageSize: W,
|
|
234
|
+
pageSizeLabel: "每頁筆數",
|
|
235
|
+
pageSizeOptions: C,
|
|
236
|
+
renderResultSummary: (e, t, n) => `顯示 ${e}-${t} 筆,共 ${n} 筆`,
|
|
237
|
+
showPageSizeOptions: !0,
|
|
238
|
+
total: K
|
|
239
|
+
}
|
|
240
|
+
})
|
|
241
|
+
]
|
|
242
|
+
}) })]
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
function E(e) {
|
|
246
|
+
return {
|
|
247
|
+
...e,
|
|
248
|
+
caseTitle: y(e),
|
|
249
|
+
key: e.id,
|
|
250
|
+
stateLabel: A(e.state)
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
function D(e) {
|
|
254
|
+
return k(e) ? O(e.state) : w[0];
|
|
255
|
+
}
|
|
256
|
+
function O(e) {
|
|
257
|
+
return w.find((t) => t.state === e) ?? w[0];
|
|
258
|
+
}
|
|
259
|
+
function re(e) {
|
|
260
|
+
return k(e) ? e.name : w[0].name;
|
|
261
|
+
}
|
|
262
|
+
function k(e) {
|
|
263
|
+
return typeof e == "object" && !!e && "id" in e && "name" in e && "state" in e;
|
|
264
|
+
}
|
|
265
|
+
function A(e) {
|
|
266
|
+
return e === "RUNNING" ? "進行中" : e === "APPROVED" ? "已通過" : e === "REJECTED" ? "已拒絕" : e === "RETURNED" ? "已退回" : e === "CANCELLED" ? "已取消" : e === "EXPIRED" ? "已逾期" : "草稿";
|
|
267
|
+
}
|
|
268
|
+
function j(e) {
|
|
269
|
+
return e === "APPROVED" ? "text-success" : e === "REJECTED" || e === "CANCELLED" || e === "EXPIRED" ? "text-error" : "text-neutral";
|
|
270
|
+
}
|
|
271
|
+
function M(e, t) {
|
|
272
|
+
let n = (e ?? "").trim();
|
|
273
|
+
return n ? t.get(n)?.name ?? n : "未知發起人";
|
|
274
|
+
}
|
|
275
|
+
function N(e) {
|
|
276
|
+
return e instanceof Error ? e.message : "讀取簽核案件失敗。";
|
|
277
|
+
}
|
|
278
|
+
//#endregion
|
|
279
|
+
export { T as t };
|
|
280
|
+
|
|
281
|
+
//# sourceMappingURL=approval-instance-list-page-nmzMrj0b.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-instance-list-page-nmzMrj0b.js","names":[],"sources":["../../src/components/approval-instance-list-page.module.scss","../../src/components/approval-instance-list-page.tsx"],"sourcesContent":[".instanceFilterArea {\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","'use client';\n\nimport type { ChangeEvent, ReactElement } from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\n PageHeader,\n Section,\n SectionGroup,\n Select,\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 { resolveMembers, type MemberProfileRecord } from '@rytass/bpm-core-client';\nimport {\n listApprovalInstancesPage,\n readApprovalInstanceCaseTitle,\n type ApprovalInstanceRecord,\n type ApprovalInstanceState,\n type ApprovalInstanceView,\n} from '@rytass/bpm-core-client/workflow';\nimport { useRouterAdapter } from '../lib/router-adapter';\nimport { formatDateTime } from '../lib/format-date-time';\nimport { AppLayout } from './app-navigation';\nimport styles from './approval-instance-list-page.module.scss';\n\nexport interface ApprovalInstanceListPageProps {\n readonly activeHref: string;\n readonly defaultState: ApprovalInstanceState | null;\n readonly description: string;\n readonly emptyMessage: string;\n readonly searchPlaceholder: string;\n readonly title: string;\n readonly view: ApprovalInstanceView;\n}\n\ntype StateFilterOption = Readonly<{\n id: 'ALL' | ApprovalInstanceState;\n name: string;\n state: ApprovalInstanceState | null;\n}>;\n\ntype ApprovalInstanceRow = Readonly<\n Record<string, unknown> &\n ApprovalInstanceRecord & {\n caseTitle: string;\n key: string;\n stateLabel: string;\n }\n>;\n\nconst INSTANCE_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst STATE_FILTER_OPTIONS: readonly StateFilterOption[] = [\n { id: 'ALL', name: '全部狀態', state: null },\n { id: 'RUNNING', name: '進行中', state: 'RUNNING' },\n { id: 'APPROVED', name: '已通過', state: 'APPROVED' },\n { id: 'REJECTED', name: '已拒絕', state: 'REJECTED' },\n { id: 'RETURNED', name: '已退回', state: 'RETURNED' },\n { id: 'CANCELLED', name: '已取消', state: 'CANCELLED' },\n { id: 'EXPIRED', name: '已逾期', state: 'EXPIRED' },\n { id: 'DRAFT', name: '草稿', state: 'DRAFT' },\n];\n\n/**\n * Shared list page for any approval-instance \"view\" (inbox / sent / cc /\n * delegated). Caller picks the view + default state filter; the page renders\n * the standard BPM filter bar + paginated table and navigates to\n * `/instances/:id` on row action.\n */\nexport function ApprovalInstanceListPage({\n activeHref,\n defaultState,\n description,\n emptyMessage,\n searchPlaceholder,\n title,\n view,\n}: ApprovalInstanceListPageProps): ReactElement {\n const router = useRouterAdapter();\n const [error, setError] = useState<string | null>(null);\n const [initiatorProfilesById, setInitiatorProfilesById] = useState<\n ReadonlyMap<string, MemberProfileRecord>\n >(new Map());\n const [instancePage, setInstancePage] = useState(1);\n const [instancePageSize, setInstancePageSize] = useState(10);\n const [instanceTotalCount, setInstanceTotalCount] = useState(0);\n const [loading, setLoading] = useState(true);\n const [rows, setRows] = useState<readonly ApprovalInstanceRow[]>([]);\n const [searchText, setSearchText] = useState('');\n const [stateFilter, setStateFilter] = useState<StateFilterOption>(\n readStateFilterOption(defaultState),\n );\n\n const refreshInstances = useCallback(async (): Promise<void> => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await listApprovalInstancesPage({\n page: instancePage,\n pageSize: instancePageSize,\n searchText,\n state: stateFilter.state,\n templateId: null,\n view,\n });\n\n setRows(result.instances.map(readApprovalInstanceRow));\n setInstanceTotalCount(result.totalCount);\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, [instancePage, instancePageSize, searchText, stateFilter, view]);\n\n useEffect((): void => {\n void refreshInstances();\n }, [refreshInstances]);\n\n useEffect((): (() => void) | void => {\n const initiatorMemberIds = Array.from(\n new Set(rows.map((row) => row.initiatorMemberId).filter(Boolean)),\n );\n\n if (initiatorMemberIds.length === 0) {\n setInitiatorProfilesById(new Map());\n\n return;\n }\n\n let cancelled = false;\n\n void (async (): Promise<void> => {\n try {\n const profiles = await resolveMembers(initiatorMemberIds);\n\n if (cancelled) {\n return;\n }\n\n setInitiatorProfilesById(\n new Map(profiles.map((profile) => [profile.memberId, profile])),\n );\n } catch {\n if (cancelled) {\n return;\n }\n\n setInitiatorProfilesById(new Map());\n }\n })();\n\n return (): void => {\n cancelled = true;\n };\n }, [rows]);\n\n const columns = useMemo(\n (): TableColumn<ApprovalInstanceRow>[] => [\n { dataIndex: 'caseTitle', key: 'caseTitle', title: '案件', width: 300 },\n {\n key: 'state',\n render: (record: ApprovalInstanceRow): ReactElement => (\n <Typography\n color={readInstanceStateColor(record.state)}\n component=\"span\"\n variant=\"body\"\n >\n {record.stateLabel}\n </Typography>\n ),\n title: '狀態',\n width: 120,\n },\n {\n key: 'initiatorMemberId',\n render: (record: ApprovalInstanceRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {readInitiatorLabel(\n record.initiatorMemberId,\n initiatorProfilesById,\n )}\n </Typography>\n ),\n title: '發起人',\n width: 180,\n },\n {\n key: 'startedAt',\n render: (record: ApprovalInstanceRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(record.startedAt)}\n </Typography>\n ),\n title: '發起時間',\n width: 220,\n },\n {\n key: 'completedAt',\n render: (record: ApprovalInstanceRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(record.completedAt)}\n </Typography>\n ),\n title: '完成時間',\n width: 220,\n },\n ],\n [initiatorProfilesById],\n );\n const tableActions = useMemo(\n (): TableActions<ApprovalInstanceRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<ApprovalInstanceRow>['render']> => [\n {\n name: '查看',\n onClick: (): void => router.push(`/instances/${record.id}`),\n },\n ],\n variant: 'base-secondary',\n width: 88,\n }),\n [router],\n );\n\n return (\n <AppLayout activeHref={activeHref}>\n <PageHeader>\n <ContentHeader description={description} title={title} />\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.instanceFilterArea} size=\"sub\">\n <FilterLine>\n <Filter span={3}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"instanceSearchText\"\n >\n <Input\n fullWidth\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n setSearchText(event.target.value);\n setInstancePage(1);\n }}\n placeholder={searchPlaceholder}\n size=\"sub\"\n value={searchText}\n variant=\"base\"\n />\n </FormField>\n </Filter>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"instanceState\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => {\n setStateFilter(readSelectedStateFilterOption(option));\n setInstancePage(1);\n }}\n options={[...STATE_FILTER_OPTIONS]}\n placeholder=\"狀態\"\n renderValue={(value): string =>\n `狀態:${readStateFilterLabel(value)}`\n }\n size=\"sub\"\n value={stateFilter}\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 {!error && !loading && rows.length === 0 ? (\n <Typography color=\"text-neutral\" variant=\"body\">\n {emptyMessage}\n </Typography>\n ) : null}\n <Table\n actions={tableActions}\n columns={columns}\n dataSource={[...rows]}\n fullWidth\n loading={loading}\n pagination={{\n current: instancePage,\n onChange: (page): void => {\n setInstancePage(page);\n },\n onChangePageSize: (pageSize): void => {\n setInstancePage(1);\n setInstancePageSize(pageSize);\n },\n pageSize: instancePageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: INSTANCE_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: instanceTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n </AppLayout>\n );\n}\n\nfunction readApprovalInstanceRow(\n instance: ApprovalInstanceRecord,\n): ApprovalInstanceRow {\n return {\n ...instance,\n caseTitle: readApprovalInstanceCaseTitle(instance),\n key: instance.id,\n stateLabel: readInstanceStateLabel(instance.state),\n };\n}\n\nfunction readSelectedStateFilterOption(option: unknown): StateFilterOption {\n if (!isStateFilterOption(option)) {\n return STATE_FILTER_OPTIONS[0];\n }\n return readStateFilterOption(option.state);\n}\n\nfunction readStateFilterOption(\n state: ApprovalInstanceState | null,\n): StateFilterOption {\n return (\n STATE_FILTER_OPTIONS.find((option) => option.state === state) ??\n STATE_FILTER_OPTIONS[0]\n );\n}\n\nfunction readStateFilterLabel(value: unknown): string {\n return isStateFilterOption(value) ? value.name : STATE_FILTER_OPTIONS[0].name;\n}\n\nfunction isStateFilterOption(value: unknown): value is StateFilterOption {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'id' in value &&\n 'name' in value &&\n 'state' in value\n );\n}\n\nfunction readInstanceStateLabel(state: ApprovalInstanceState): string {\n if (state === 'RUNNING') return '進行中';\n if (state === 'APPROVED') return '已通過';\n if (state === 'REJECTED') return '已拒絕';\n if (state === 'RETURNED') return '已退回';\n if (state === 'CANCELLED') return '已取消';\n if (state === 'EXPIRED') return '已逾期';\n return '草稿';\n}\n\nfunction readInstanceStateColor(\n state: ApprovalInstanceState,\n): 'text-error' | 'text-neutral' | 'text-success' {\n if (state === 'APPROVED') return 'text-success';\n if (state === 'REJECTED' || state === 'CANCELLED' || state === 'EXPIRED') {\n return 'text-error';\n }\n return 'text-neutral';\n}\n\nfunction readInitiatorLabel(\n initiatorMemberId: string | null | undefined,\n initiatorProfilesById: ReadonlyMap<string, MemberProfileRecord>,\n): string {\n const trimmedMemberId = (initiatorMemberId ?? '').trim();\n if (!trimmedMemberId) return '未知發起人';\n return initiatorProfilesById.get(trimmedMemberId)?.name ?? trimmedMemberId;\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('../auth-provider.css');let e=require("react"),t=require("@mezzanine-ui/react"),n=require("@rytass/bpm-core-client"),r=require("react/jsx-runtime");var i=(0,e.createContext)(null);function a({value:e,children:t}){return(0,r.jsx)(i.Provider,{value:e,children:t})}function o(){let t=(0,e.useContext)(i);if(!t)throw Error("useRouterAdapter must be used inside <RouterAdapterProvider>. In Next.js, wrap your app with <NextRouterAdapterProvider> from `@rytass/bpm-core-react/pages/router-adapter`.");return t}function s(){return typeof window>`u`?new URLSearchParams:new URLSearchParams(window.location.search)}var c={authLoading:`bpm_authLoading_GiBnf`},l=(0,e.createContext)(null);function u({children:t,publicPaths:i=[`/login`],loginPath:a=`/login`}){let s=o(),[c,u]=(0,e.useState)(!0),[d,h]=(0,e.useState)(null),g=(0,e.useCallback)(async()=>{let e=await(0,n.readApiCurrentMember)();return h(e),e},[]),_=(0,e.useCallback)(async e=>{let t=await(0,n.loginApi)(e);return h(t),t},[]),v=(0,e.useCallback)(async()=>{await(0,n.logoutApi)(),h(null),s.replace(a)},[a,s]);(0,e.useEffect)(()=>{let e=!0;return u(!0),(async()=>{try{let t=await(0,n.readApiCurrentMember)();e&&h(t)}catch{e&&h(null)}finally{e&&u(!1)}})(),()=>{e=!1}},[]),(0,e.useEffect)(()=>{c||p(s.pathname,i)||d||s.replace(`${a}?next=${encodeURIComponent(m(s.pathname))}`)},[c,a,d,i,s]);let y=(0,e.useMemo)(()=>({loading:c,login:_,logout:v,member:d,refresh:g}),[c,_,v,d,g]);return c&&!p(s.pathname,i)?(0,r.jsx)(f,{label:`確認登入狀態`}):!c&&!d&&!p(s.pathname,i)?(0,r.jsx)(f,{label:`前往登入頁`}):(0,r.jsx)(l.Provider,{value:y,children:t})}function d(){let t=(0,e.useContext)(l);if(!t)throw Error(`useAuth must be used inside <AuthProvider>`);return t}function f({label:e}){return(0,r.jsx)(`main`,{className:c.authLoading,children:(0,r.jsx)(t.Typography,{color:`text-neutral`,variant:`body`,children:e})})}function p(e,t){return t.some(t=>t===e)}function m(e){return typeof window>`u`?e??`/`:`${window.location.pathname}${window.location.search}`}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return u}});
|
|
2
|
+
//# sourceMappingURL=auth-provider-BV8Iiwfb.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-provider-BV8Iiwfb.cjs","names":[],"sources":["../../src/lib/router-adapter.tsx","../../src/lib/auth-provider.module.scss","../../src/lib/auth-provider.tsx"],"sourcesContent":["'use client';\n\nimport { createContext, useContext, type ReactNode } from 'react';\n\n/**\n * Framework-agnostic router contract every BPM view consumes.\n *\n * Next.js App Router consumers wire it from `useRouter()` / `usePathname()`,\n * but the contract is intentionally generic so SPA / Remix / Tanstack Router\n * hosts can plug in the same `<RouterAdapterProvider>` with their own\n * navigation primitives.\n */\nexport interface RouterAdapter {\n /** Current pathname (e.g. \"/inbox\"). `null` during SSR before hydration. */\n readonly pathname: string | null;\n /** Navigate to `href` (push onto history). */\n push(href: string): void;\n /** Navigate to `href` and replace the current history entry. */\n replace(href: string): void;\n /** Optional: go back. Falls back to `history.back()` when omitted. */\n back?(): void;\n /**\n * Optional search params accessor. Returned `URLSearchParams` should be\n * read-only — mutating it does not navigate. Default implementation reads\n * `window.location.search` on the client.\n */\n searchParams?(): URLSearchParams;\n}\n\nconst RouterAdapterContext = createContext<RouterAdapter | null>(null);\n\nexport interface RouterAdapterProviderProps {\n readonly value: RouterAdapter;\n readonly children: ReactNode;\n}\n\n/**\n * Wraps the BPM React tree so `useRouterAdapter()` resolves to the host's\n * navigation primitives. Consumers typically put this once at the very root\n * of their layout (or inside a `'use client'` shim that reads\n * `useRouter()` + `usePathname()` from `next/navigation`).\n */\nexport function RouterAdapterProvider({\n value,\n children,\n}: RouterAdapterProviderProps): React.ReactElement {\n return (\n <RouterAdapterContext.Provider value={value}>\n {children}\n </RouterAdapterContext.Provider>\n );\n}\n\n/**\n * Reads the host-provided {@link RouterAdapter}. Throws when used outside a\n * `<RouterAdapterProvider>` to surface wiring mistakes early.\n */\nexport function useRouterAdapter(): RouterAdapter {\n const value = useContext(RouterAdapterContext);\n if (!value) {\n throw new Error(\n 'useRouterAdapter must be used inside <RouterAdapterProvider>. ' +\n 'In Next.js, wrap your app with <NextRouterAdapterProvider> from ' +\n '`@rytass/bpm-core-react/pages/router-adapter`.',\n );\n }\n return value;\n}\n\n/**\n * Pure default search-params reader for the browser. Server-side returns an\n * empty `URLSearchParams`. Used internally when a {@link RouterAdapter}\n * does not override `searchParams()`.\n */\nexport function defaultBrowserSearchParams(): URLSearchParams {\n if (typeof window === 'undefined') return new URLSearchParams();\n return new URLSearchParams(window.location.search);\n}\n",".authLoading {\n align-items: center;\n background: var(--mzn-color-bg-body);\n display: flex;\n min-height: 100vh;\n justify-content: center;\n padding: 32px;\n}\n","'use client';\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { Typography } from '@mezzanine-ui/react';\nimport {\n loginApi,\n logoutApi,\n readApiCurrentMember,\n type ApiMember,\n} from '@rytass/bpm-core-client';\nimport { useRouterAdapter } from './router-adapter';\nimport styles from './auth-provider.module.scss';\n\ninterface AuthContextValue {\n readonly loading: boolean;\n readonly member: ApiMember | null;\n readonly login: (input: {\n readonly identifier: string;\n readonly password: string;\n }) => Promise<ApiMember>;\n readonly logout: () => Promise<void>;\n readonly refresh: () => Promise<ApiMember | null>;\n}\n\nconst AuthContext = createContext<AuthContextValue | null>(null);\n\nexport interface AuthProviderProps {\n readonly children: ReactNode;\n /**\n * Paths that should not redirect to `/login` when there is no session.\n * Defaults to `['/login']`. Override when your host runs the login UI\n * under a different path.\n */\n readonly publicPaths?: readonly string[];\n /**\n * Where to send unauthenticated users. Defaults to `'/login'`.\n */\n readonly loginPath?: string;\n}\n\n/**\n * BPM auth context provider. Reads / writes the host BPM API session via\n * `@rytass/bpm-core-client` (`loginApi` / `logoutApi` / `readApiCurrentMember`)\n * and uses the host-supplied {@link useRouterAdapter} to redirect\n * unauthenticated users.\n */\nexport function AuthProvider({\n children,\n publicPaths = ['/login'],\n loginPath = '/login',\n}: AuthProviderProps): ReactElement {\n const router = useRouterAdapter();\n const [loading, setLoading] = useState(true);\n const [member, setMember] = useState<ApiMember | null>(null);\n\n const refresh = useCallback(async (): Promise<ApiMember | null> => {\n const current = await readApiCurrentMember();\n setMember(current);\n return current;\n }, []);\n\n const login = useCallback(\n async (input: {\n readonly identifier: string;\n readonly password: string;\n }): Promise<ApiMember> => {\n const next = await loginApi(input);\n setMember(next);\n return next;\n },\n [],\n );\n\n const logout = useCallback(async (): Promise<void> => {\n await logoutApi();\n setMember(null);\n router.replace(loginPath);\n }, [loginPath, router]);\n\n useEffect((): (() => void) => {\n let active = true;\n setLoading(true);\n void (async () => {\n try {\n const current = await readApiCurrentMember();\n if (active) setMember(current);\n } catch {\n if (active) setMember(null);\n } finally {\n if (active) setLoading(false);\n }\n })();\n return (): void => {\n active = false;\n };\n }, []);\n\n useEffect((): void => {\n if (loading || isPublicPath(router.pathname, publicPaths) || member) return;\n router.replace(\n `${loginPath}?next=${encodeURIComponent(readCurrentPath(router.pathname))}`,\n );\n }, [loading, loginPath, member, publicPaths, router]);\n\n const value = useMemo<AuthContextValue>(\n () => ({ loading, login, logout, member, refresh }),\n [loading, login, logout, member, refresh],\n );\n\n if (loading && !isPublicPath(router.pathname, publicPaths)) {\n return <AuthLoadingState label=\"確認登入狀態\" />;\n }\n if (!loading && !member && !isPublicPath(router.pathname, publicPaths)) {\n return <AuthLoadingState label=\"前往登入頁\" />;\n }\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n\n/**\n * Access the BPM auth context. Throws when used outside `<AuthProvider>`.\n */\nexport function useAuth(): AuthContextValue {\n const ctx = useContext(AuthContext);\n if (!ctx) throw new Error('useAuth must be used inside <AuthProvider>');\n return ctx;\n}\n\nfunction AuthLoadingState({\n label,\n}: {\n readonly label: string;\n}): ReactElement {\n return (\n <main className={styles.authLoading}>\n <Typography color=\"text-neutral\" variant=\"body\">\n {label}\n </Typography>\n </main>\n );\n}\n\nfunction isPublicPath(\n pathname: string | null,\n publicPaths: readonly string[],\n): boolean {\n return publicPaths.some((p) => p === pathname);\n}\n\nfunction readCurrentPath(pathname: string | null): string {\n if (typeof window === 'undefined') return pathname ?? '/';\n return `${window.location.pathname}${window.location.search}`;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { createContext as e, useCallback as t, useContext as n, useEffect as r, useMemo as i, useState as a } from "react";
|
|
3
|
+
import { Typography as o } from "@mezzanine-ui/react";
|
|
4
|
+
import { loginApi as s, logoutApi as c, readApiCurrentMember as l } from "@rytass/bpm-core-client";
|
|
5
|
+
import { jsx as u } from "react/jsx-runtime";
|
|
6
|
+
import '../auth-provider.css';//#region src/lib/router-adapter.tsx
|
|
7
|
+
var d = e(null);
|
|
8
|
+
function f({ value: e, children: t }) {
|
|
9
|
+
return /* @__PURE__ */ u(d.Provider, {
|
|
10
|
+
value: e,
|
|
11
|
+
children: t
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
function p() {
|
|
15
|
+
let e = n(d);
|
|
16
|
+
if (!e) throw Error("useRouterAdapter must be used inside <RouterAdapterProvider>. In Next.js, wrap your app with <NextRouterAdapterProvider> from `@rytass/bpm-core-react/pages/router-adapter`.");
|
|
17
|
+
return e;
|
|
18
|
+
}
|
|
19
|
+
function m() {
|
|
20
|
+
return typeof window > "u" ? new URLSearchParams() : new URLSearchParams(window.location.search);
|
|
21
|
+
}
|
|
22
|
+
var h = { authLoading: "bpm_authLoading_GiBnf" }, g = e(null);
|
|
23
|
+
function _({ children: e, publicPaths: n = ["/login"], loginPath: o = "/login" }) {
|
|
24
|
+
let d = p(), [f, m] = a(!0), [h, _] = a(null), v = t(async () => {
|
|
25
|
+
let e = await l();
|
|
26
|
+
return _(e), e;
|
|
27
|
+
}, []), S = t(async (e) => {
|
|
28
|
+
let t = await s(e);
|
|
29
|
+
return _(t), t;
|
|
30
|
+
}, []), C = t(async () => {
|
|
31
|
+
await c(), _(null), d.replace(o);
|
|
32
|
+
}, [o, d]);
|
|
33
|
+
r(() => {
|
|
34
|
+
let e = !0;
|
|
35
|
+
return m(!0), (async () => {
|
|
36
|
+
try {
|
|
37
|
+
let t = await l();
|
|
38
|
+
e && _(t);
|
|
39
|
+
} catch {
|
|
40
|
+
e && _(null);
|
|
41
|
+
} finally {
|
|
42
|
+
e && m(!1);
|
|
43
|
+
}
|
|
44
|
+
})(), () => {
|
|
45
|
+
e = !1;
|
|
46
|
+
};
|
|
47
|
+
}, []), r(() => {
|
|
48
|
+
f || b(d.pathname, n) || h || d.replace(`${o}?next=${encodeURIComponent(x(d.pathname))}`);
|
|
49
|
+
}, [
|
|
50
|
+
f,
|
|
51
|
+
o,
|
|
52
|
+
h,
|
|
53
|
+
n,
|
|
54
|
+
d
|
|
55
|
+
]);
|
|
56
|
+
let w = i(() => ({
|
|
57
|
+
loading: f,
|
|
58
|
+
login: S,
|
|
59
|
+
logout: C,
|
|
60
|
+
member: h,
|
|
61
|
+
refresh: v
|
|
62
|
+
}), [
|
|
63
|
+
f,
|
|
64
|
+
S,
|
|
65
|
+
C,
|
|
66
|
+
h,
|
|
67
|
+
v
|
|
68
|
+
]);
|
|
69
|
+
return f && !b(d.pathname, n) ? /* @__PURE__ */ u(y, { label: "確認登入狀態" }) : !f && !h && !b(d.pathname, n) ? /* @__PURE__ */ u(y, { label: "前往登入頁" }) : /* @__PURE__ */ u(g.Provider, {
|
|
70
|
+
value: w,
|
|
71
|
+
children: e
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function v() {
|
|
75
|
+
let e = n(g);
|
|
76
|
+
if (!e) throw Error("useAuth must be used inside <AuthProvider>");
|
|
77
|
+
return e;
|
|
78
|
+
}
|
|
79
|
+
function y({ label: e }) {
|
|
80
|
+
return /* @__PURE__ */ u("main", {
|
|
81
|
+
className: h.authLoading,
|
|
82
|
+
children: /* @__PURE__ */ u(o, {
|
|
83
|
+
color: "text-neutral",
|
|
84
|
+
variant: "body",
|
|
85
|
+
children: e
|
|
86
|
+
})
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
function b(e, t) {
|
|
90
|
+
return t.some((t) => t === e);
|
|
91
|
+
}
|
|
92
|
+
function x(e) {
|
|
93
|
+
return typeof window > "u" ? e ?? "/" : `${window.location.pathname}${window.location.search}`;
|
|
94
|
+
}
|
|
95
|
+
//#endregion
|
|
96
|
+
export { p as a, m as i, v as n, f as r, _ as t };
|
|
97
|
+
|
|
98
|
+
//# sourceMappingURL=auth-provider-Bnox5gsx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-provider-Bnox5gsx.js","names":[],"sources":["../../src/lib/router-adapter.tsx","../../src/lib/auth-provider.module.scss","../../src/lib/auth-provider.tsx"],"sourcesContent":["'use client';\n\nimport { createContext, useContext, type ReactNode } from 'react';\n\n/**\n * Framework-agnostic router contract every BPM view consumes.\n *\n * Next.js App Router consumers wire it from `useRouter()` / `usePathname()`,\n * but the contract is intentionally generic so SPA / Remix / Tanstack Router\n * hosts can plug in the same `<RouterAdapterProvider>` with their own\n * navigation primitives.\n */\nexport interface RouterAdapter {\n /** Current pathname (e.g. \"/inbox\"). `null` during SSR before hydration. */\n readonly pathname: string | null;\n /** Navigate to `href` (push onto history). */\n push(href: string): void;\n /** Navigate to `href` and replace the current history entry. */\n replace(href: string): void;\n /** Optional: go back. Falls back to `history.back()` when omitted. */\n back?(): void;\n /**\n * Optional search params accessor. Returned `URLSearchParams` should be\n * read-only — mutating it does not navigate. Default implementation reads\n * `window.location.search` on the client.\n */\n searchParams?(): URLSearchParams;\n}\n\nconst RouterAdapterContext = createContext<RouterAdapter | null>(null);\n\nexport interface RouterAdapterProviderProps {\n readonly value: RouterAdapter;\n readonly children: ReactNode;\n}\n\n/**\n * Wraps the BPM React tree so `useRouterAdapter()` resolves to the host's\n * navigation primitives. Consumers typically put this once at the very root\n * of their layout (or inside a `'use client'` shim that reads\n * `useRouter()` + `usePathname()` from `next/navigation`).\n */\nexport function RouterAdapterProvider({\n value,\n children,\n}: RouterAdapterProviderProps): React.ReactElement {\n return (\n <RouterAdapterContext.Provider value={value}>\n {children}\n </RouterAdapterContext.Provider>\n );\n}\n\n/**\n * Reads the host-provided {@link RouterAdapter}. Throws when used outside a\n * `<RouterAdapterProvider>` to surface wiring mistakes early.\n */\nexport function useRouterAdapter(): RouterAdapter {\n const value = useContext(RouterAdapterContext);\n if (!value) {\n throw new Error(\n 'useRouterAdapter must be used inside <RouterAdapterProvider>. ' +\n 'In Next.js, wrap your app with <NextRouterAdapterProvider> from ' +\n '`@rytass/bpm-core-react/pages/router-adapter`.',\n );\n }\n return value;\n}\n\n/**\n * Pure default search-params reader for the browser. Server-side returns an\n * empty `URLSearchParams`. Used internally when a {@link RouterAdapter}\n * does not override `searchParams()`.\n */\nexport function defaultBrowserSearchParams(): URLSearchParams {\n if (typeof window === 'undefined') return new URLSearchParams();\n return new URLSearchParams(window.location.search);\n}\n",".authLoading {\n align-items: center;\n background: var(--mzn-color-bg-body);\n display: flex;\n min-height: 100vh;\n justify-content: center;\n padding: 32px;\n}\n","'use client';\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { Typography } from '@mezzanine-ui/react';\nimport {\n loginApi,\n logoutApi,\n readApiCurrentMember,\n type ApiMember,\n} from '@rytass/bpm-core-client';\nimport { useRouterAdapter } from './router-adapter';\nimport styles from './auth-provider.module.scss';\n\ninterface AuthContextValue {\n readonly loading: boolean;\n readonly member: ApiMember | null;\n readonly login: (input: {\n readonly identifier: string;\n readonly password: string;\n }) => Promise<ApiMember>;\n readonly logout: () => Promise<void>;\n readonly refresh: () => Promise<ApiMember | null>;\n}\n\nconst AuthContext = createContext<AuthContextValue | null>(null);\n\nexport interface AuthProviderProps {\n readonly children: ReactNode;\n /**\n * Paths that should not redirect to `/login` when there is no session.\n * Defaults to `['/login']`. Override when your host runs the login UI\n * under a different path.\n */\n readonly publicPaths?: readonly string[];\n /**\n * Where to send unauthenticated users. Defaults to `'/login'`.\n */\n readonly loginPath?: string;\n}\n\n/**\n * BPM auth context provider. Reads / writes the host BPM API session via\n * `@rytass/bpm-core-client` (`loginApi` / `logoutApi` / `readApiCurrentMember`)\n * and uses the host-supplied {@link useRouterAdapter} to redirect\n * unauthenticated users.\n */\nexport function AuthProvider({\n children,\n publicPaths = ['/login'],\n loginPath = '/login',\n}: AuthProviderProps): ReactElement {\n const router = useRouterAdapter();\n const [loading, setLoading] = useState(true);\n const [member, setMember] = useState<ApiMember | null>(null);\n\n const refresh = useCallback(async (): Promise<ApiMember | null> => {\n const current = await readApiCurrentMember();\n setMember(current);\n return current;\n }, []);\n\n const login = useCallback(\n async (input: {\n readonly identifier: string;\n readonly password: string;\n }): Promise<ApiMember> => {\n const next = await loginApi(input);\n setMember(next);\n return next;\n },\n [],\n );\n\n const logout = useCallback(async (): Promise<void> => {\n await logoutApi();\n setMember(null);\n router.replace(loginPath);\n }, [loginPath, router]);\n\n useEffect((): (() => void) => {\n let active = true;\n setLoading(true);\n void (async () => {\n try {\n const current = await readApiCurrentMember();\n if (active) setMember(current);\n } catch {\n if (active) setMember(null);\n } finally {\n if (active) setLoading(false);\n }\n })();\n return (): void => {\n active = false;\n };\n }, []);\n\n useEffect((): void => {\n if (loading || isPublicPath(router.pathname, publicPaths) || member) return;\n router.replace(\n `${loginPath}?next=${encodeURIComponent(readCurrentPath(router.pathname))}`,\n );\n }, [loading, loginPath, member, publicPaths, router]);\n\n const value = useMemo<AuthContextValue>(\n () => ({ loading, login, logout, member, refresh }),\n [loading, login, logout, member, refresh],\n );\n\n if (loading && !isPublicPath(router.pathname, publicPaths)) {\n return <AuthLoadingState label=\"確認登入狀態\" />;\n }\n if (!loading && !member && !isPublicPath(router.pathname, publicPaths)) {\n return <AuthLoadingState label=\"前往登入頁\" />;\n }\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n\n/**\n * Access the BPM auth context. Throws when used outside `<AuthProvider>`.\n */\nexport function useAuth(): AuthContextValue {\n const ctx = useContext(AuthContext);\n if (!ctx) throw new Error('useAuth must be used inside <AuthProvider>');\n return ctx;\n}\n\nfunction AuthLoadingState({\n label,\n}: {\n readonly label: string;\n}): ReactElement {\n return (\n <main className={styles.authLoading}>\n <Typography color=\"text-neutral\" variant=\"body\">\n {label}\n </Typography>\n </main>\n );\n}\n\nfunction isPublicPath(\n pathname: string | null,\n publicPaths: readonly string[],\n): boolean {\n return publicPaths.some((p) => p === pathname);\n}\n\nfunction readCurrentPath(pathname: string | null): string {\n if (typeof window === 'undefined') return pathname ?? '/';\n return `${window.location.pathname}${window.location.search}`;\n}\n"],"mappings":";;;;;;AA6BA,IAAM,IAAuB,EAAoC,IAAI;AAarE,SAAgB,EAAsB,EACpC,UACA,eACiD;CACjD,OACE,kBAAC,EAAqB,UAAtB;EAAsC;EACnC;CAC4B,CAAA;AAEnC;AAMA,SAAgB,IAAkC;CAChD,IAAM,IAAQ,EAAW,CAAoB;CAC7C,IAAI,CAAC,GACH,MAAU,MACR,8KAGF;CAEF,OAAO;AACT;AAOA,SAAgB,IAA8C;CAE5D,OADI,OAAO,SAAW,MAAoB,IAAI,gBAAgB,IACvD,IAAI,gBAAgB,OAAO,SAAS,MAAM;AACnD;kDE5CM,IAAc,EAAuC,IAAI;AAsB/D,SAAgB,EAAa,EAC3B,aACA,iBAAc,CAAC,QAAQ,GACvB,eAAY,YACsB;CAClC,IAAM,IAAS,EAAiB,GAC1B,CAAC,GAAS,KAAc,EAAS,EAAI,GACrC,CAAC,GAAQ,KAAa,EAA2B,IAAI,GAErD,IAAU,EAAY,YAAuC;EACjE,IAAM,IAAU,MAAM,EAAqB;EAE3C,OADA,EAAU,CAAO,GACV;CACT,GAAG,CAAC,CAAC,GAEC,IAAQ,EACZ,OAAO,MAGmB;EACxB,IAAM,IAAO,MAAM,EAAS,CAAK;EAEjC,OADA,EAAU,CAAI,GACP;CACT,GACA,CAAC,CACH,GAEM,IAAS,EAAY,YAA2B;EAGpD,AAFA,MAAM,EAAU,GAChB,EAAU,IAAI,GACd,EAAO,QAAQ,CAAS;CAC1B,GAAG,CAAC,GAAW,CAAM,CAAC;CAoBtB,AAlBA,QAA8B;EAC5B,IAAI,IAAS;EAYb,OAXA,EAAW,EAAI,IACT,YAAY;GAChB,IAAI;IACF,IAAM,IAAU,MAAM,EAAqB;IAC3C,AAAI,KAAQ,EAAU,CAAO;GAC/B,QAAQ;IACN,AAAI,KAAQ,EAAU,IAAI;GAC5B,UAAU;IACR,AAAI,KAAQ,EAAW,EAAK;GAC9B;EACF,GAAG,SACgB;GACjB,IAAS;EACX;CACF,GAAG,CAAC,CAAC,GAEL,QAAsB;EAChB,KAAW,EAAa,EAAO,UAAU,CAAW,KAAK,KAC7D,EAAO,QACL,GAAG,EAAU,QAAQ,mBAAmB,EAAgB,EAAO,QAAQ,CAAC,GAC1E;CACF,GAAG;EAAC;EAAS;EAAW;EAAQ;EAAa;CAAM,CAAC;CAEpD,IAAM,IAAQ,SACL;EAAE;EAAS;EAAO;EAAQ;EAAQ;CAAQ,IACjD;EAAC;EAAS;EAAO;EAAQ;EAAQ;CAAO,CAC1C;CAQA,OANI,KAAW,CAAC,EAAa,EAAO,UAAU,CAAW,IAChD,kBAAC,GAAD,EAAkB,OAAM,SAAU,CAAA,IAEvC,CAAC,KAAW,CAAC,KAAU,CAAC,EAAa,EAAO,UAAU,CAAW,IAC5D,kBAAC,GAAD,EAAkB,OAAM,QAAS,CAAA,IAEnC,kBAAC,EAAY,UAAb;EAA6B;EAAQ;CAA+B,CAAA;AAC7E;AAKA,SAAgB,IAA4B;CAC1C,IAAM,IAAM,EAAW,CAAW;CAClC,IAAI,CAAC,GAAK,MAAU,MAAM,4CAA4C;CACtE,OAAO;AACT;AAEA,SAAS,EAAiB,EACxB,YAGe;CACf,OACE,kBAAC,QAAD;EAAM,WAAW,EAAO;YACtB,kBAAC,GAAD;GAAY,OAAM;GAAe,SAAQ;aACtC;EACS,CAAA;CACR,CAAA;AAEV;AAEA,SAAS,EACP,GACA,GACS;CACT,OAAO,EAAY,MAAM,MAAM,MAAM,CAAQ;AAC/C;AAEA,SAAS,EAAgB,GAAiC;CAExD,OADI,OAAO,SAAW,MAAoB,KAAY,MAC/C,GAAG,OAAO,SAAS,WAAW,OAAO,SAAS;AACvD"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";const e=require("./app-navigation-C_mbz7jx.cjs"),t=require("./auth-provider-BV8Iiwfb.cjs"),n=require("./format-date-time-isOa3e9q.cjs"),r=require("./bpm-form-field-Bc6k4ZEO.cjs"),i=require("./FormRendererView-BwVsH2eX.cjs"),a=require("./form-name-modal-uZCHbtRH.cjs");let o=require("react"),s=require("@mezzanine-ui/react"),c=require("react/jsx-runtime"),l=require("@mezzanine-ui/icons"),u=require("@mezzanine-ui/react/ContentHeader");u=e.o(u,1);let d=require("@rytass/bpm-core-client/form"),f=require("@hello-pangea/dnd"),p=require("next/dynamic");p=e.o(p,1);let m=require("@codemirror/lang-json"),h=require("@codemirror/view");var g={alignItems:`center`,border:`1px solid var(--mzn-color-border-neutral)`,borderRadius:4,color:`var(--mzn-color-text-neutral)`,display:`flex`,minHeight:160,padding:12,width:`100%`},_=[(0,m.json)(),h.EditorView.lineWrapping,h.EditorView.theme({"&":{border:`1px solid var(--mzn-color-border-neutral)`,borderRadius:`4px`,fontSize:`13px`,width:`100%`},"&.cm-focused":{outline:`1px solid var(--mzn-color-border-primary)`},".cm-content":{fontFamily:`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace`,minHeight:`100%`},".cm-editor":{width:`100%`},".cm-gutters":{borderRight:`1px solid var(--mzn-color-border-neutral)`},".cm-scroller":{fontFamily:`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace`}})],v=(0,p.default)(()=>import(`@uiw/react-codemirror`),{loading:()=>(0,c.jsx)(`div`,{style:g,children:`載入 JSON 編輯器`}),ssr:!1});function ee({disabled:e,height:t,name:n,onChange:r,placeholder:i,value:a}){return(0,c.jsx)(v,{"aria-label":n,basicSetup:{autocompletion:!0,bracketMatching:!0,closeBrackets:!0,defaultKeymap:!0,foldGutter:!0,highlightActiveLine:!0,highlightSelectionMatches:!0,lineNumbers:!0,syntaxHighlighting:!0},editable:!e,extensions:[..._],height:t,indentWithTab:!1,onChange:r,placeholder:i,readOnly:e,theme:`light`,value:a,width:`100%`})}var te=[{description:`單行文字、姓名、編號`,icon:l.AlignLeftIcon,label:`文字`,type:`text`},{description:`多行補充內容`,icon:l.FileIcon,label:`長文字`,type:`textarea`},{description:`金額、數量、分數`,icon:l.CurrencyDollarIcon,label:`數字`,type:`number`},{description:`金額與費用`,icon:l.CurrencyDollarIcon,label:`金額`,type:`money`},{description:`日期或到期日`,icon:l.CalendarIcon,label:`日期`,type:`date`},{description:`日期與時間`,icon:l.CalendarIcon,label:`日期時間`,type:`datetime`},{description:`是 / 否狀態`,icon:l.CheckedIcon,label:`開關`,type:`boolean`},{description:`固定選項擇一`,icon:l.ListIcon,label:`下拉選單`,type:`select`},{description:`固定選項單選`,icon:l.DotGridIcon,label:`單選`,type:`radio`},{description:`固定選項複選`,icon:l.CheckedOutlineIcon,label:`複選`,type:`checkbox`},{description:`附件或佐證資料`,icon:l.FileAttachmentIcon,label:`附件`,type:`file_upload`}],ne={alignItems:`start`,display:`flex`,flexWrap:`wrap`,gap:16},re={flex:`0.55 1 300px`,minWidth:0},ie={flex:`1.45 1 720px`,minWidth:620},y={display:`grid`,gap:12},ae={display:`flex`,flexWrap:`wrap`,gap:6},oe={flex:`0 0 auto`,whiteSpace:`nowrap`},se={display:`grid`,gap:8},ce={alignItems:`center`,cursor:`grab`,display:`flex`,gap:12,touchAction:`none`},le={display:`grid`,flex:`1 1 auto`,gap:2,minWidth:0},ue={alignItems:`center`,display:`flex`,flex:`0 0 auto`,gap:4},de={alignItems:`center`,display:`flex`,gap:6},fe={userSelect:`none`},pe={filter:`drop-shadow(0 8px 18px rgba(0, 0, 0, 0.12))`},me={alignItems:`center`,border:`1px dashed var(--mzn-color-border-neutral)`,borderRadius:6,display:`grid`,gap:12,minHeight:240,padding:32,textAlign:`center`},he={display:`flex`,gap:8,justifyContent:`center`},ge={display:`grid`,gap:14},_e={display:`grid`,columnGap:16,gridTemplateColumns:`repeat(auto-fit, minmax(280px, 1fr))`,rowGap:8},ve={gridColumn:`1 / -1`},ye={alignItems:`center`,display:`flex`,gap:8,gridColumn:`1 / -1`,justifyContent:`flex-end`},be={gridColumn:`1 / -1`},xe={alignItems:`start`,display:`block`,width:`100%`},Se={...xe,gridColumn:`1 / -1`},Ce={minWidth:0,width:`100%`},we={minWidth:`100%`,width:`100%`},Te={display:`grid`,gap:14},Ee={alignItems:`start`,display:`block`,width:`100%`},De={minWidth:0,width:`100%`},Oe={gridColumn:`2 / -1`},ke={display:`grid`,gap:10,width:`100%`},Ae={display:`grid`,gap:8,gridTemplateColumns:`repeat(auto-fit, minmax(160px, 1fr))`},je={display:`inline-flex`},Me={display:`grid`,gap:16},Ne={display:`grid`,gap:8},Pe={display:`flex`,justifyContent:`flex-end`},Fe={color:`var(--mzn-color-text-error)`,fontSize:`0.72em`,lineHeight:0,marginLeft:2,verticalAlign:`super`};function Ie(e){e&&(e.style.width=`100%`)}var b={fields:[],schemaVersion:1},x={layout:[],schemaVersion:1},Le=[{id:`unset`,name:`不預設`},{id:`true`,name:`是`},{id:`false`,name:`否`}],Re=[{id:`true`,name:`是`},{id:`false`,name:`否`}],ze=[{label:`顯示`,name:`fieldVisibleWhen`,supportingText:`符合條件時才顯示這個欄位。`,target:`visibleWhen`},{label:`必填`,name:`fieldRequiredWhen`,supportingText:`符合條件時才要求填寫這個欄位。`,target:`requiredWhen`},{label:`唯讀`,name:`fieldReadonlyWhen`,supportingText:`符合條件時不允許修改這個欄位。`,target:`readonlyWhen`}];function S({formId:p}){let m=t.a(),h=p,[g,_]=(0,o.useState)(null),[v,S]=(0,o.useState)(null),[T,D]=(0,o.useState)(b),[k,A]=(0,o.useState)(x),[Qe,j]=(0,o.useState)(w(b)),[$e,M]=(0,o.useState)(w(x)),[et,tt]=(0,o.useState)({}),[nt,N]=(0,o.useState)(null),[P,rt]=(0,o.useState)(`design`),[F,I]=(0,o.useState)(null),[it,L]=(0,o.useState)(null),[at,R]=(0,o.useState)(!1),[ot,st]=(0,o.useState)(E(b,x)),[ct,lt]=(0,o.useState)(!0),[ut,dt]=(0,o.useState)(!1),[z,B]=(0,o.useState)(!1);(0,o.useEffect)(()=>{W()},[h]),(0,o.useEffect)(()=>{T.fields.some(e=>e.fieldKey===F)||I(T.fields[0]?.fieldKey??null)},[T.fields,F]),(0,o.useEffect)(()=>{tt(e=>(0,d.buildFormRendererValues)(T.fields,e))},[T.fields]),(0,o.useEffect)(()=>{P!==`advanced`&&(j(w(T)),M(w(k)))},[P,T,k]);let V=(0,o.useMemo)(()=>T.fields.find(e=>e.fieldKey===F)??T.fields[0]??null,[T.fields,F]),ft=(0,o.useMemo)(()=>(g?.versions??[]).map(e=>({key:e.id,publishedAt:n.t(e.publishedAt),status:e.status,updatedAt:n.t(e.updatedAt),version:`v${e.version}`})),[g]),pt=(0,o.useMemo)(()=>[{dataIndex:`version`,key:`version`,title:`版本`,width:120},{key:`status`,render:e=>(0,c.jsx)(Ze,{status:e.status}),title:`狀態`,width:140},{dataIndex:`updatedAt`,key:`updatedAt`,title:`最後更新`,width:180},{dataIndex:`publishedAt`,key:`publishedAt`,title:`發布時間`,width:180}],[]),mt=(0,o.useMemo)(()=>E(T,k),[T,k]),H=mt.schemaJson!==ot.schemaJson||mt.uiSchemaJson!==ot.uiSchemaJson;(0,o.useEffect)(()=>{function e(e){H&&(e.preventDefault(),e.returnValue=``)}return window.addEventListener(`beforeunload`,e),()=>{window.removeEventListener(`beforeunload`,e)}},[H]);function ht(){H&&!window.confirm(`目前有尚未儲存的表單草稿,確定要離開嗎?`)||m.push(`/forms`)}let gt=(0,o.useMemo)(()=>Je(g?.versions??[],g?.definition.currentVersionId),[g?.definition.currentVersionId,g?.versions]),_t=v??gt??g?.versions[0]??null,U=!H&&_t?.status===`PUBLISHED`,vt=Ye({hasUnsavedChanges:H,latestPublishedVersion:gt,openedContentPublished:U,openedVersion:_t}),yt=z||!H&&U&&!v,bt=H?`保存並發布`:v?`發布草稿`:U?`已發布`:`發布版本`;async function W(){lt(!0),L(null);try{let e=await(0,d.readFormBuilder)(h),t=e.versions.find(e=>e.status===`DRAFT`)??null;_(e),S(t);let n=t?.schema??e.versions[0]?.schema??b,r=t?.uiSchema??e.versions[0]?.uiSchema??x;D(n),A(r),st(E(n,r)),j(w(n)),M(w(r)),I(t?.schema.fields[0]?.fieldKey??e.versions[0]?.schema.fields[0]?.fieldKey??null),N(null)}catch(e){L(O(e))}finally{lt(!1)}}async function xt(){let e=await(0,d.updateFormDefinitionDraft)((v??await(0,d.forkFormDefinition)(h)).id,T,k);return S(e),e}async function St(){B(!0),L(null);try{await xt(),await W()}catch(e){L(O(e))}finally{B(!1)}}async function Ct(){B(!0),L(null);try{await(0,d.publishFormDefinitionVersion)((await xt()).id),await W()}catch(e){L(O(e))}finally{B(!1)}}async function wt(e){if(!g)throw Error(`尚未載入表單資料`);dt(!0);try{let t=await(0,d.updateFormDefinition)(g.definition.id,e);_({...g,definition:t}),R(!1)}finally{dt(!1)}}function G(e){let t=(0,d.createFieldDefinition)(e,T.fields.length+1);D({...T,fields:[...T.fields,t]}),A({...k,layout:[...k.layout,{fieldKey:t.fieldKey,width:e===`textarea`||e===`file_upload`?`FULL`:`HALF`}]}),I(t.fieldKey),rt(`design`),N(null)}function Tt(e){let t=e;t===`advanced`&&P!==`advanced`&&(j(w(T)),M(w(k))),rt(t)}function Et(e){let t=T.fields.filter(t=>t.fieldKey!==e);D({...T,fields:t}),A({...k,layout:k.layout.filter(t=>t.fieldKey!==e)}),I(F===e?t[0]?.fieldKey??null:F),N(null)}function Dt(e){let t=e.destination;t&&e.source.index!==t.index&&(D(n=>({...n,fields:Xe(n.fields,e.source.index,t.index)})),A(n=>({...n,layout:Xe(n.layout,e.source.index,t.index)})),N(null))}function K(e){q(t=>({...t,...e}))}function q(e){if(!V)return;let t=V.fieldKey,n=e(V),r=n.fieldKey;D({...T,fields:T.fields.map(e=>e.fieldKey===t?n:e)}),A({...k,layout:k.layout.map(e=>e.fieldKey===t?{...e,fieldKey:r}:e)}),I(r),N(null)}function J(e){q(t=>Ue(t)?{...t,...e}:t)}function Y(e){q(t=>(0,d.isNumberFieldDefinition)(t)?{...t,...e}:t)}function Ot(e){q(t=>(0,d.isDateFieldDefinition)(t)?{...t,...e}:t)}function X(e){q(t=>(0,d.isSelectFieldDefinition)(t)?{...t,...e}:t)}function kt(e){q(t=>t.type===`boolean`?{...t,...e}:t)}function At(e){q(t=>t.type===`file_upload`?{...t,...e}:t)}function jt(e){tt(e)}function Mt(e,t){D(n=>({...n,fields:n.fields.map(n=>n.fieldKey===e?{...n,required:t}:n)})),N(null)}function Nt(e){j(e);try{D(JSON.parse(e)),N(null)}catch{N(`Form Schema JSON 格式不正確`)}}function Pt(e){M(e);try{A(JSON.parse(e)),N(null)}catch{N(`UI Schema JSON 格式不正確`)}}return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsxs)(e.t,{activeHref:`/forms`,children:[(0,c.jsx)(s.PageHeader,{children:(0,c.jsxs)(u.default,{description:vt,onBackClick:ht,title:g?.definition.name??`表單設計器`,children:[(0,c.jsx)(s.Button,{"aria-label":`修改表單名稱`,disabled:ut||!g,icon:l.EditIcon,iconType:`icon-only`,onClick:()=>R(!0),variant:`base-ghost`,children:`修改表單名稱`}),(0,c.jsx)(s.Button,{"aria-label":`儲存草稿`,disabled:z||!H,icon:l.SaveIcon,iconType:`icon-only`,onClick:()=>void St(),variant:`base-secondary`,children:`儲存草稿`}),(0,c.jsx)(s.Button,{disabled:yt,icon:l.CheckedIcon,iconType:`leading`,onClick:()=>void Ct(),variant:`base-primary`,children:bt})]})}),(0,c.jsx)(s.SectionGroup,{children:(0,c.jsx)(s.Section,{children:(0,c.jsxs)(`div`,{style:Me,children:[it?(0,c.jsx)(s.Typography,{color:`text-error`,variant:`body`,children:it}):null,(0,c.jsxs)(s.Tab,{activeKey:P,onChange:Tt,size:`sub`,children:[(0,c.jsx)(s.TabItem,{children:`設計`},`design`),(0,c.jsx)(s.TabItem,{children:`預覽`},`preview`),(0,c.jsx)(s.TabItem,{children:`版本`},`versions`),(0,c.jsx)(s.TabItem,{children:`進階`},`advanced`)]}),P===`design`?Ft():null,P===`preview`?en():null,P===`versions`?tn():null,P===`advanced`?nn():null]})})})]}),(0,c.jsx)(a.t,{confirmText:`儲存`,initialName:g?.definition.name??``,loading:ut,onClose:()=>R(!1),onSubmit:wt,open:at,title:`修改表單名稱`})]});function Ft(){return(0,c.jsxs)(`div`,{style:y,children:[(0,c.jsxs)(`div`,{style:se,children:[(0,c.jsx)(s.Typography,{component:`h2`,variant:`label-primary`,children:`新增欄位`}),(0,c.jsx)(`div`,{style:ae,children:te.map(e=>(0,c.jsx)(s.Button,{disabled:z,icon:e.icon,iconType:`leading`,onClick:()=>G(e.type),size:`sub`,style:oe,type:`button`,variant:`base-secondary`,children:e.label},e.type))})]}),(0,c.jsxs)(`div`,{style:ne,children:[(0,c.jsxs)(`div`,{style:{...y,...re},children:[(0,c.jsx)(s.Typography,{component:`h2`,variant:`label-primary`,children:`表單畫布`}),T.fields.length>0?(0,c.jsx)(f.DragDropContext,{onDragEnd:Dt,children:(0,c.jsx)(f.Droppable,{droppableId:`form-builder-fields`,children:e=>(0,c.jsxs)(`div`,{...e.droppableProps,ref:e.innerRef,style:y,children:[T.fields.map((e,t)=>(0,c.jsx)(f.Draggable,{draggableId:e.fieldKey,index:t,isDragDisabled:z,children:(t,n)=>Qt(e,t,n.isDragging)},e.fieldKey)),e.placeholder]})})}):(0,c.jsxs)(`div`,{style:me,children:[(0,c.jsxs)(`div`,{style:y,children:[(0,c.jsx)(s.Typography,{component:`h3`,variant:`h3`,children:`尚未建立欄位`}),(0,c.jsx)(s.Typography,{color:`text-neutral`,variant:`body`,children:`從上方新增第一個欄位,或直接建立常用文字欄位開始設計。`})]}),(0,c.jsxs)(`div`,{style:he,children:[(0,c.jsx)(s.Button,{disabled:z,onClick:()=>G(`text`),variant:`base-primary`,children:`新增文字欄位`}),(0,c.jsx)(s.Button,{disabled:z,onClick:()=>G(`textarea`),variant:`base-secondary`,children:`新增長文字`})]})]})]}),(0,c.jsxs)(`div`,{style:{...y,...ie},children:[(0,c.jsx)(s.Typography,{component:`h2`,variant:`label-primary`,children:`欄位設定`}),V?It(V):(0,c.jsx)(s.Typography,{color:`text-neutral`,variant:`body`,children:`請先新增或選取欄位。`})]})]})]})}function It(e){return(0,c.jsxs)(`div`,{style:ge,children:[Lt(e),Rt(e)]})}function Lt(e){return(0,c.jsxs)(`div`,{style:_e,children:[(0,c.jsx)(`div`,{style:ye,children:(0,c.jsx)(s.Badge,{size:`main`,text:Be(e.type),variant:`text-info`})}),$(`標題`,`fieldLabel`,(0,c.jsx)(s.Input,{onChange:e=>K({label:e.target.value}),placeholder:`例如:申請金額`,value:e.label,variant:`base`}),z),$(`欄位 Key`,`fieldKey`,(0,c.jsx)(s.Input,{onChange:e=>K({fieldKey:e.target.value}),placeholder:`例如:amount`,value:e.fieldKey,variant:`base`}),z),$(`提示文字`,`fieldPlaceholder`,(0,c.jsx)(s.Input,{onChange:e=>K({placeholder:e.target.value||void 0}),placeholder:`例如:請輸入申請金額`,value:e.placeholder??``,variant:`base`}),z),zt(e)]})}function Rt(e){return(0,c.jsx)(s.Accordion,{defaultExpanded:Ve(e),size:`sub`,title:`進階設定`,children:(0,c.jsxs)(`div`,{style:_e,children:[(0,c.jsx)(s.Typography,{component:`h3`,style:ve,variant:`label-primary`,children:`條件規則`}),(0,c.jsx)(s.Typography,{color:`text-neutral`,style:be,variant:`body`,children:`只有需要根據其他欄位改變顯示、必填或唯讀狀態時才需要設定。`}),Kt(e)]})})}function zt(e){return Ue(e)?Bt(e):(0,d.isNumberFieldDefinition)(e)?Vt(e):(0,d.isDateFieldDefinition)(e)?Ht(e):(0,d.isSelectFieldDefinition)(e)?Ut(e):e.type===`boolean`?Wt(e):Gt(e)}function Bt(e){return(0,c.jsxs)(c.Fragment,{children:[$(`預設值`,`fieldDefaultValue`,e.type===`textarea`?Yt({disabled:z,name:`fieldDefaultValue`,onChange:e=>J({defaultValue:e||void 0}),placeholder:`輸入此欄位的預設文字`,rows:3,value:C(e.defaultValue)}):(0,c.jsx)(s.Input,{onChange:e=>J({defaultValue:e.target.value||void 0}),placeholder:`輸入此欄位的預設文字`,value:C(e.defaultValue),variant:`base`}),z),$(`最小長度`,`fieldMinLength`,Q(e.minLength,e=>J({minLength:e}),`例如:2`,{min:0}),z),$(`最大長度`,`fieldMaxLength`,Q(e.maxLength,e=>J({maxLength:e}),`例如:100`,{min:1}),z)]})}function Vt(e){return(0,c.jsxs)(c.Fragment,{children:[$(`預設值`,`fieldDefaultValue`,Q(typeof e.defaultValue==`number`?e.defaultValue:void 0,e=>Y({defaultValue:e}),e.type===`money`?`例如:1000`:`輸入預設數值`,{max:e.maximum,min:e.minimum}),z),$(`最小值`,`fieldMinimum`,Q(e.minimum,e=>Y({minimum:e}),`例如:0`),z),$(`最大值`,`fieldMaximum`,Q(e.maximum,e=>Y({maximum:e}),`例如:999999`),z)]})}function Ht(e){return $(`預設值`,`fieldDefaultValue`,Xt(e,C(e.defaultValue),e=>Ot({defaultValue:e})),z)}function Ut(e){let t=Array.isArray(e.defaultValue)?e.defaultValue:[],n=e.options.filter(e=>t.includes(e.value)).map(d.readFieldOptionAsSelectOption);return(0,c.jsxs)(c.Fragment,{children:[$(`預設值`,`fieldDefaultValue`,e.type===`checkbox`?(0,c.jsx)(s.Select,{clearable:!0,mode:`multiple`,onChange:e=>X({defaultValue:e.length?e.map(e=>e.id):void 0}),options:e.options.map(d.readFieldOptionAsSelectOption),placeholder:`選擇一或多個預設選項`,value:n}):(0,c.jsx)(s.Select,{clearable:!0,onChange:e=>X({defaultValue:e?.id||void 0}),options:e.options.map(d.readFieldOptionAsSelectOption),placeholder:`選擇預設選項`,value:typeof e.defaultValue==`string`?(0,d.readSelectOption)(e.options.map(d.readFieldOptionAsSelectOption),e.defaultValue):null}),z),$(`選項`,`fieldOptions`,Zt(e),z,!0)]})}function Wt(e){let t=typeof e.defaultValue==`boolean`?String(e.defaultValue):`unset`;return $(`預設值`,`fieldDefaultValue`,(0,c.jsx)(s.Select,{clearable:!1,onChange:e=>kt({defaultValue:e?.id===`true`?!0:e?.id===`false`?!1:void 0}),options:[...Le],placeholder:`選擇預設狀態`,value:(0,d.readSelectOption)(Le,t)}),z)}function Gt(e){return(0,c.jsxs)(c.Fragment,{children:[$(`檔案數`,`fieldMaxFiles`,Q(e.maxFiles,e=>At({maxFiles:e}),`例如:1`,{min:1}),z),$(`MIME`,`fieldAcceptedMimeTypes`,Yt({disabled:z,name:`fieldAcceptedMimeTypes`,onChange:e=>At({acceptedMimeTypes:We(e)}),placeholder:`每行一個 MIME type,例如:application/pdf`,rows:3,value:Ge(e.acceptedMimeTypes)}),!1)]})}function Kt(e){let t=T.fields.filter(t=>t.fieldKey!==e.fieldKey);return t.length?(0,c.jsx)(c.Fragment,{children:ze.map(n=>qt(e,n,t))}):(0,c.jsx)(s.Typography,{color:`text-neutral`,style:be,variant:`body`,children:`目前沒有其他欄位可作為條件來源。新增更多欄位後即可設定條件規則。`})}function qt(e,t,n){let r=e[t.target],i=r?(0,d.parseConditionRule)(r):null,a=n.find(e=>e.fieldKey===i?.fieldKey),o=a??n[0],l=n.map(He),u=(0,d.readConditionOperatorOptions)(o),f=i&&u.some(e=>e.id===i.operator)?i.operator:(0,d.readDefaultConditionOperator)(o),p=i?.value??(0,d.readDefaultConditionValue)(o),m=!!r,h=m&&(!i||!a);return $(t.label,t.name,(0,c.jsxs)(`div`,{style:ke,children:[(0,c.jsx)(s.Toggle,{checked:m,disabled:z,label:m?`已啟用`:`不啟用`,onChange:e=>Z(t.target,e.target.checked?(0,d.buildConditionExpression)(o,(0,d.readDefaultConditionOperator)(o),(0,d.readDefaultConditionValue)(o)):void 0),size:`sub`,supportingText:t.supportingText}),m?h?(0,c.jsx)(s.Typography,{color:`text-warning`,variant:`body`,children:`這個規則不是目前 UI 支援的格式。重新選擇條件後會取代既有規則。`}):(0,c.jsxs)(`div`,{style:Ae,children:[(0,c.jsx)(s.Select,{clearable:!1,onChange:e=>{let r=n.find(t=>t.fieldKey===e?.id)??o;Z(t.target,(0,d.buildConditionExpression)(r,(0,d.readDefaultConditionOperator)(r),(0,d.readDefaultConditionValue)(r)))},options:l,placeholder:`選擇欄位`,value:(0,d.readSelectOption)(l,o.fieldKey)}),(0,c.jsx)(s.Select,{clearable:!1,onChange:e=>Z(t.target,(0,d.buildConditionExpression)(o,(0,d.readConditionOperatorOption)(e?.id)??f,p)),options:[...u],placeholder:`判斷方式`,value:(0,d.readSelectOption)(u,f)}),Jt(o,p,e=>Z(t.target,(0,d.buildConditionExpression)(o,f,e)))]}):null]}),z,!0)}function Z(e,t){K({[e]:t})}function Jt(e,t,n){if(e.type===`boolean`)return(0,c.jsx)(s.Select,{clearable:!1,onChange:e=>n(e?.id??`true`),options:[...Re],placeholder:`比較值`,value:(0,d.readSelectOption)(Re,t===`false`?`false`:`true`)});if((0,d.isSelectFieldDefinition)(e)){let r=e.options.map(d.readFieldOptionAsSelectOption);return(0,c.jsx)(s.Select,{clearable:!1,onChange:e=>n(e?.id??r[0]?.id??``),options:r,placeholder:`比較值`,value:(0,d.readSelectOption)(r,t)})}return(0,d.isNumberFieldDefinition)(e)?Q((0,d.parseOptionalNumberInput)(t),e=>n(String(e??0)),`比較值`):(0,d.isDateFieldDefinition)(e)?Xt(e,t,e=>n(e??``)):(0,c.jsx)(s.Input,{onChange:e=>n(e.target.value),placeholder:`比較值`,value:t,variant:`base`})}function Yt({disabled:e,name:t,onChange:n,placeholder:r,rows:i,value:a}){return(0,c.jsx)(s.Textarea,{"aria-label":t,disabled:e,onChange:e=>n(e.target.value),placeholder:r,ref:Ie,resize:`vertical`,rows:i,style:we,value:a})}function Q(e,t,n,r={}){return(0,c.jsx)(s.Input,{max:r.max,min:r.min,onChange:e=>t((0,d.clampOptionalNumber)((0,d.parseOptionalNumberInput)(e.target.value),r)),placeholder:n,showSpinner:!0,step:r.step??1,value:typeof e==`number`?String(e):``,variant:`measure`})}function Xt(e,t,n){return e.type===`datetime`?(0,c.jsx)(s.DateTimePicker,{formatDate:`YYYY-MM-DD`,formatTime:`HH:mm`,hideSecond:!0,onChange:e=>n((0,d.formatDateTimePickerValue)(e)),placeholderLeft:`選擇日期`,placeholderRight:`選擇時間`,value:(0,d.readDatePickerValue)(t)}):(0,c.jsx)(s.DatePicker,{format:`YYYY-MM-DD`,onChange:e=>n((0,d.formatDatePickerValue)(e)),placeholder:`選擇日期`,value:(0,d.readDatePickerValue)(t)})}function Zt(e){return(0,c.jsxs)(`div`,{style:Ne,children:[(0,c.jsx)(s.Table,{actions:{render:t=>[{disabled:()=>z||e.options.length<=1,icon:l.TrashIcon,iconType:`icon-only`,name:`移除選項`,onClick:()=>X({options:e.options.filter((e,n)=>n!==t.index)}),variant:`destructive-ghost`}],width:56},columns:[{key:`label`,render:t=>(0,c.jsx)(s.Input,{onChange:n=>X({options:Ke(e.options,t.index,{label:n.target.value})}),placeholder:`例如:主管`,size:`sub`,value:t.label,variant:`base`}),title:`Label`},{key:`value`,render:t=>(0,c.jsx)(s.Input,{onChange:n=>X({options:Ke(e.options,t.index,{value:n.target.value})}),placeholder:`例如:manager`,size:`sub`,value:t.value,variant:`base`}),title:`Value`}],dataSource:e.options.map((t,n)=>({index:n,key:`${e.fieldKey}-${n}`,label:t.label,value:t.value})),showHeader:!0,size:`sub`}),(0,c.jsx)(`div`,{style:Pe,children:(0,c.jsx)(s.Button,{disabled:z,icon:l.PlusIcon,iconType:`leading`,onClick:()=>X({options:[...e.options,qe(e.options)]}),variant:`base-secondary`,children:`新增選項`})})]})}function Qt(e,t,n){return(0,c.jsx)(`div`,{...t.draggableProps,"data-form-builder-field-key":e.fieldKey,ref:t.innerRef,style:{...fe,...n?pe:null,...t.draggableProps.style},children:(0,c.jsx)(s.BaseCard,{children:$t(e,t,n)})})}function $(e,t,n,i,a=!1){return(0,c.jsx)(`div`,{style:a?Se:xe,children:(0,c.jsx)(`div`,{style:Ce,children:(0,c.jsx)(r.t,{disabled:i,label:e,name:t,children:n})})})}function $t(e,t,n){return(0,c.jsxs)(`div`,{...t.dragHandleProps??{},"aria-label":`拖曳排序欄位`,style:ce,title:`拖曳排序`,children:[(0,c.jsx)(`span`,{"aria-label":`拖曳排序`,role:`img`,style:je,title:`拖曳排序`,children:(0,c.jsx)(s.Icon,{icon:l.DotDragVerticalIcon,size:20})}),(0,c.jsxs)(`div`,{style:le,children:[(0,c.jsxs)(s.Typography,{component:`span`,ellipsis:!0,variant:`label-primary`,children:[e.label,e.required?(0,c.jsx)(`sup`,{"aria-label":`必填`,style:Fe,children:`*`}):null]}),(0,c.jsxs)(s.Typography,{color:`text-neutral`,component:`span`,ellipsis:!0,variant:`caption`,children:[Be(e.type),` ·`,e.required?` 必填`:` 選填`,` ·`,e.fieldKey]})]}),(0,c.jsxs)(`div`,{style:ue,children:[(0,c.jsx)(`div`,{style:de,children:(0,c.jsx)(s.Toggle,{checked:!!e.required,disabled:z||n,label:`必填`,onChange:t=>Mt(e.fieldKey,t.target.checked)})}),(0,c.jsx)(s.Button,{disabled:n,icon:l.EditIcon,iconType:`icon-only`,onClick:()=>I(e.fieldKey),variant:e.fieldKey===V?.fieldKey?`base-primary`:`base-ghost`,children:`編輯欄位`}),(0,c.jsx)(s.Button,{disabled:z||n,icon:l.TrashIcon,iconType:`icon-only`,onClick:()=>Et(e.fieldKey),variant:`destructive-ghost`,children:`移除欄位`})]})]})}function en(){return(0,c.jsxs)(`div`,{style:y,children:[(0,c.jsx)(s.Typography,{component:`h2`,variant:`h3`,children:`填寫預覽`}),(0,c.jsx)(i.t,{onChange:jt,schema:T,uiSchema:k,value:et})]})}function tn(){return(0,c.jsxs)(`div`,{style:y,children:[(0,c.jsx)(s.Typography,{component:`h2`,variant:`h3`,children:`版本紀錄`}),(0,c.jsx)(s.Table,{columns:pt,dataSource:ft,loading:ct})]})}function nn(){return(0,c.jsxs)(`div`,{style:y,children:[(0,c.jsx)(s.Typography,{component:`h2`,variant:`h3`,children:`Schema`}),(0,c.jsxs)(`div`,{style:Te,children:[rn(`Form Schema`,`schemaJson`,(0,c.jsx)(ee,{disabled:z,height:`360px`,name:`schemaJson`,onChange:Nt,placeholder:`輸入 Form Schema JSON`,value:Qe})),rn(`UI Schema`,`uiSchemaJson`,(0,c.jsx)(ee,{disabled:z,height:`240px`,name:`uiSchemaJson`,onChange:Pt,placeholder:`輸入 UI Schema JSON`,value:$e})),nt?(0,c.jsx)(s.Typography,{color:`text-error`,style:Oe,variant:`body`,children:nt}):null]})]})}function rn(e,t,n){return(0,c.jsx)(`div`,{style:Ee,children:(0,c.jsx)(`div`,{style:De,children:(0,c.jsx)(r.t,{disabled:z,label:e,name:t,children:n})})})}}function Be(e){return te.find(t=>t.type===e)?.label??e}function Ve(e){return!!(e.visibleWhen||e.requiredWhen||e.readonlyWhen)}function He(e){return{id:e.fieldKey,name:e.label}}function Ue(e){return e.type===`text`||e.type===`textarea`}function C(e){return typeof e==`string`?e:``}function We(e){let t=e.split(/[\n,]/u).map(e=>e.trim()).filter(Boolean);return t.length?t:void 0}function Ge(e){return e?.join(`
|
|
2
|
+
`)??``}function w(e){return JSON.stringify(e,null,2)}function Ke(e,t,n){return e.map((e,r)=>r===t?{...e,...n}:e)}function qe(e){let t=e.length+1;return{label:`選項 ${t}`,value:T(e,t)}}function T(e,t){let n=`option_${t}`;return e.some(e=>e.value===n)?T(e,t+1):n}function E(e,t){return{schemaJson:w(e),uiSchemaJson:w(t)}}function Je(e,t){return(t?e.find(e=>e.id===t):null)??e.find(e=>e.status===`PUBLISHED`)??null}function Ye({hasUnsavedChanges:e,latestPublishedVersion:t,openedContentPublished:r,openedVersion:i}){return`${e?`有未儲存修改`:`沒有未儲存修改`} · ${D({hasUnsavedChanges:e,openedContentPublished:r,openedVersion:i})} · ${t?`目前發布 v${t.version}:${n.t(t.publishedAt)}`:`目前沒有已發布版本`}`}function D({hasUnsavedChanges:e,openedContentPublished:t,openedVersion:n}){return e?n?`修改尚未發布,來源 v${n.version}`:`修改尚未發布`:t&&n?`當前內容已發布 v${n.version}`:n?`當前內容尚未發布 v${n.version}`:`當前內容尚未發布`}function Xe(e,t,n){let r=e[t];if(!r||t===n)return[...e];let i=e.filter((e,n)=>n!==t);return[...i.slice(0,n),r,...i.slice(n)]}function Ze({status:e}){return e===`PUBLISHED`?(0,c.jsx)(s.Badge,{size:`sub`,text:`已發布`,variant:`dot-success`}):e===`ARCHIVED`?(0,c.jsx)(s.Badge,{size:`sub`,text:`已封存`,variant:`dot-inactive`}):(0,c.jsx)(s.Badge,{size:`sub`,text:`草稿`,variant:`dot-warning`})}function O(e){return e instanceof Error?e.message:`發生未知錯誤`}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return S}});
|
|
3
|
+
//# sourceMappingURL=builder-DPhAH381.cjs.map
|