@rytass/bpm-core-react 0.3.8 → 0.4.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.
Files changed (232) hide show
  1. package/CHANGELOG.md +154 -0
  2. package/README.md +69 -4
  3. package/dist/chunks/approval-instance-list-page-BF2r5D2-.js +278 -0
  4. package/dist/chunks/approval-instance-list-page-BF2r5D2-.js.map +1 -0
  5. package/dist/chunks/approval-instance-list-page-C5ZKPHdA.cjs +2 -0
  6. package/dist/chunks/approval-instance-list-page-C5ZKPHdA.cjs.map +1 -0
  7. package/dist/chunks/auth-provider-4BeCw7cI.cjs +2 -0
  8. package/dist/chunks/auth-provider-4BeCw7cI.cjs.map +1 -0
  9. package/dist/chunks/auth-provider-B5oPmvk2.js +83 -0
  10. package/dist/chunks/auth-provider-B5oPmvk2.js.map +1 -0
  11. package/dist/chunks/{builder-D950gct_.js → builder-BLVnnpnP.js} +474 -478
  12. package/dist/chunks/builder-BLVnnpnP.js.map +1 -0
  13. package/dist/chunks/builder-DVE9zIKH.cjs +3 -0
  14. package/dist/chunks/builder-DVE9zIKH.cjs.map +1 -0
  15. package/dist/chunks/categories-B6QZKZRt.cjs +2 -0
  16. package/dist/chunks/categories-B6QZKZRt.cjs.map +1 -0
  17. package/dist/chunks/categories-DBPoSrsi.js +382 -0
  18. package/dist/chunks/categories-DBPoSrsi.js.map +1 -0
  19. package/dist/chunks/chunk-CMqjfN_6.cjs +1 -0
  20. package/dist/chunks/dashboard-page-CddG1MnK.cjs +2 -0
  21. package/dist/chunks/dashboard-page-CddG1MnK.cjs.map +1 -0
  22. package/dist/chunks/dashboard-page-Ib8srCMy.js +119 -0
  23. package/dist/chunks/dashboard-page-Ib8srCMy.js.map +1 -0
  24. package/dist/chunks/delegations-C2wLWsDQ.cjs +2 -0
  25. package/dist/chunks/delegations-C2wLWsDQ.cjs.map +1 -0
  26. package/dist/chunks/delegations-DDEk-WI6.cjs +2 -0
  27. package/dist/chunks/delegations-DDEk-WI6.cjs.map +1 -0
  28. package/dist/chunks/delegations-ZNtodFaD.js +568 -0
  29. package/dist/chunks/delegations-ZNtodFaD.js.map +1 -0
  30. package/dist/chunks/delegations-iVnRi3QE.js +641 -0
  31. package/dist/chunks/delegations-iVnRi3QE.js.map +1 -0
  32. package/dist/chunks/detail-Dcr5mM8g.cjs +2 -0
  33. package/dist/chunks/detail-Dcr5mM8g.cjs.map +1 -0
  34. package/dist/chunks/detail-u9DdLhDW.js +1518 -0
  35. package/dist/chunks/detail-u9DdLhDW.js.map +1 -0
  36. package/dist/chunks/format-date-time-XxBzF0F5.cjs +2 -0
  37. package/dist/chunks/{format-date-time-26_pFvv4.cjs.map → format-date-time-XxBzF0F5.cjs.map} +1 -1
  38. package/dist/chunks/login-9bCXyjbX.cjs +2 -0
  39. package/dist/chunks/{login-CQ9MfwcC.cjs.map → login-9bCXyjbX.cjs.map} +1 -1
  40. package/dist/chunks/{login-C20yVxbc.js → login-BKxpLibd.js} +3 -2
  41. package/dist/chunks/{login-C20yVxbc.js.map → login-BKxpLibd.js.map} +1 -1
  42. package/dist/chunks/notifications-BKs4--96.cjs +2 -0
  43. package/dist/chunks/notifications-BKs4--96.cjs.map +1 -0
  44. package/dist/chunks/notifications-CSulztkU.js +193 -0
  45. package/dist/chunks/notifications-CSulztkU.js.map +1 -0
  46. package/dist/chunks/orgs-BIiqzHvb.cjs +2 -0
  47. package/dist/chunks/orgs-BIiqzHvb.cjs.map +1 -0
  48. package/dist/chunks/orgs-Cc18umVt.js +1944 -0
  49. package/dist/chunks/orgs-Cc18umVt.js.map +1 -0
  50. package/dist/chunks/router-adapter--gYs13E8.cjs +2 -0
  51. package/dist/chunks/router-adapter--gYs13E8.cjs.map +1 -0
  52. package/dist/chunks/router-adapter-DftlFTOd.js +23 -0
  53. package/dist/chunks/router-adapter-DftlFTOd.js.map +1 -0
  54. package/dist/chunks/templates-D44FSB46.js +380 -0
  55. package/dist/chunks/templates-D44FSB46.js.map +1 -0
  56. package/dist/chunks/templates-w96t83N-.cjs +2 -0
  57. package/dist/chunks/templates-w96t83N-.cjs.map +1 -0
  58. package/dist/chunks/users-CUY139DF.js +214 -0
  59. package/dist/chunks/users-CUY139DF.js.map +1 -0
  60. package/dist/chunks/users-qghSMtLn.cjs +2 -0
  61. package/dist/chunks/users-qghSMtLn.cjs.map +1 -0
  62. package/dist/components/approval-instance-list-page.d.ts +1 -2
  63. package/dist/components/bpm-notification-bell-button.d.ts +22 -0
  64. package/dist/components/dashboard-page.d.ts +1 -4
  65. package/dist/index.cjs +1 -1
  66. package/dist/index.cjs.map +1 -1
  67. package/dist/index.css +1 -0
  68. package/dist/index.d.ts +3 -1
  69. package/dist/index.js +206 -97
  70. package/dist/index.js.map +1 -1
  71. package/dist/lib/notification-drawer-provider.d.ts +3 -2
  72. package/dist/lib/notification-unread-provider.d.ts +6 -5
  73. package/dist/lib/providers.d.ts +3 -2
  74. package/dist/lib/use-bpm-logout.d.ts +12 -0
  75. package/dist/lib/use-bpm-member.d.ts +11 -0
  76. package/dist/next/BPMNextProviders.d.ts +1 -1
  77. package/dist/next/index.cjs +1 -1
  78. package/dist/next/index.cjs.map +1 -1
  79. package/dist/next/index.js +13 -23
  80. package/dist/next/index.js.map +1 -1
  81. package/dist/pages/admin/delegations/index.cjs +1 -1
  82. package/dist/pages/admin/delegations/index.js +1 -1
  83. package/dist/pages/admin/orgs/index.cjs +1 -1
  84. package/dist/pages/admin/orgs/index.js +1 -1
  85. package/dist/pages/admin/users/index.cjs +1 -1
  86. package/dist/pages/admin/users/index.js +1 -1
  87. package/dist/pages/delegations/index.cjs +1 -1
  88. package/dist/pages/delegations/index.js +1 -1
  89. package/dist/pages/forms/builder/index.cjs +1 -1
  90. package/dist/pages/forms/builder/index.js +1 -1
  91. package/dist/pages/instances/detail/index.cjs +1 -1
  92. package/dist/pages/instances/detail/index.js +1 -1
  93. package/dist/pages/login/index.cjs +1 -1
  94. package/dist/pages/login/index.js +1 -1
  95. package/dist/pages/settings/notifications/index.cjs +1 -1
  96. package/dist/pages/settings/notifications/index.js +1 -1
  97. package/dist/pages/templates/categories/index.cjs +1 -1
  98. package/dist/pages/templates/categories/index.js +1 -1
  99. package/dist/pages/templates/index.cjs +1 -1
  100. package/dist/pages/templates/index.js +1 -1
  101. package/dist/views/admin/delegations/AdminDelegationsView.d.ts +1 -4
  102. package/dist/views/admin/delegations/index.cjs +1 -1
  103. package/dist/views/admin/delegations/index.js +1 -1
  104. package/dist/views/admin/index.cjs +1 -1
  105. package/dist/views/admin/index.js +3 -3
  106. package/dist/views/admin/orgs/AdminOrgsView.d.ts +1 -4
  107. package/dist/views/admin/orgs/index.cjs +1 -1
  108. package/dist/views/admin/orgs/index.js +1 -1
  109. package/dist/views/admin/users/AdminUsersView.d.ts +1 -4
  110. package/dist/views/admin/users/index.cjs +1 -1
  111. package/dist/views/admin/users/index.js +1 -1
  112. package/dist/views/cc/CcView.d.ts +1 -3
  113. package/dist/views/cc/index.cjs +1 -1
  114. package/dist/views/cc/index.cjs.map +1 -1
  115. package/dist/views/cc/index.js +2 -3
  116. package/dist/views/cc/index.js.map +1 -1
  117. package/dist/views/dashboard/DashboardView.d.ts +1 -3
  118. package/dist/views/dashboard/index.cjs +1 -1
  119. package/dist/views/dashboard/index.cjs.map +1 -1
  120. package/dist/views/dashboard/index.js +3 -3
  121. package/dist/views/dashboard/index.js.map +1 -1
  122. package/dist/views/delegations/DelegationsView.d.ts +1 -4
  123. package/dist/views/delegations/index.cjs +1 -1
  124. package/dist/views/delegations/index.js +1 -1
  125. package/dist/views/forms/FormsView.d.ts +1 -3
  126. package/dist/views/forms/builder/index.cjs +1 -1
  127. package/dist/views/forms/builder/index.js +1 -1
  128. package/dist/views/forms/index.cjs +1 -1
  129. package/dist/views/forms/index.cjs.map +1 -1
  130. package/dist/views/forms/index.js +95 -99
  131. package/dist/views/forms/index.js.map +1 -1
  132. package/dist/views/inbox/InboxView.d.ts +1 -3
  133. package/dist/views/inbox/index.cjs +1 -1
  134. package/dist/views/inbox/index.cjs.map +1 -1
  135. package/dist/views/inbox/index.js +91 -94
  136. package/dist/views/inbox/index.js.map +1 -1
  137. package/dist/views/instances/detail/index.cjs +1 -1
  138. package/dist/views/instances/detail/index.js +1 -1
  139. package/dist/views/instances/new/index.cjs +1 -1
  140. package/dist/views/instances/new/index.cjs.map +1 -1
  141. package/dist/views/instances/new/index.js +71 -77
  142. package/dist/views/instances/new/index.js.map +1 -1
  143. package/dist/views/login/index.cjs +1 -1
  144. package/dist/views/login/index.js +1 -1
  145. package/dist/views/root/RootView.d.ts +1 -3
  146. package/dist/views/search/SearchView.d.ts +1 -3
  147. package/dist/views/search/index.cjs +1 -1
  148. package/dist/views/search/index.cjs.map +1 -1
  149. package/dist/views/search/index.js +2 -3
  150. package/dist/views/search/index.js.map +1 -1
  151. package/dist/views/sent/SentView.d.ts +1 -3
  152. package/dist/views/sent/index.cjs +1 -1
  153. package/dist/views/sent/index.cjs.map +1 -1
  154. package/dist/views/sent/index.js +2 -3
  155. package/dist/views/sent/index.js.map +1 -1
  156. package/dist/views/settings/index.cjs +1 -1
  157. package/dist/views/settings/index.js +1 -1
  158. package/dist/views/settings/notifications/SettingsNotificationsView.d.ts +1 -4
  159. package/dist/views/settings/notifications/index.cjs +1 -1
  160. package/dist/views/settings/notifications/index.js +1 -1
  161. package/dist/views/templates/TemplatesView.d.ts +1 -4
  162. package/dist/views/templates/categories/TemplateCategoriesView.d.ts +1 -4
  163. package/dist/views/templates/categories/index.cjs +1 -1
  164. package/dist/views/templates/categories/index.js +1 -1
  165. package/dist/views/templates/designer/TemplateDesignerView.d.ts +1 -2
  166. package/dist/views/templates/designer/index.cjs +7 -7
  167. package/dist/views/templates/designer/index.cjs.map +1 -1
  168. package/dist/views/templates/designer/index.js +707 -711
  169. package/dist/views/templates/designer/index.js.map +1 -1
  170. package/dist/views/templates/index.cjs +1 -1
  171. package/dist/views/templates/index.js +2 -2
  172. package/dist/views/templates/versions/TemplateVersionsView.d.ts +1 -2
  173. package/dist/views/templates/versions/index.cjs +1 -1
  174. package/dist/views/templates/versions/index.cjs.map +1 -1
  175. package/dist/views/templates/versions/index.js +45 -49
  176. package/dist/views/templates/versions/index.js.map +1 -1
  177. package/package.json +2 -2
  178. package/dist/app-navigation.css +0 -1
  179. package/dist/chunks/app-navigation-BSkMsEhy.js +0 -268
  180. package/dist/chunks/app-navigation-BSkMsEhy.js.map +0 -1
  181. package/dist/chunks/app-navigation-KnlJCUp1.cjs +0 -2
  182. package/dist/chunks/app-navigation-KnlJCUp1.cjs.map +0 -1
  183. package/dist/chunks/approval-instance-list-page-CVXgE2K3.cjs +0 -2
  184. package/dist/chunks/approval-instance-list-page-CVXgE2K3.cjs.map +0 -1
  185. package/dist/chunks/approval-instance-list-page-CqNdoZqx.js +0 -282
  186. package/dist/chunks/approval-instance-list-page-CqNdoZqx.js.map +0 -1
  187. package/dist/chunks/auth-provider-BV8Iiwfb.cjs +0 -2
  188. package/dist/chunks/auth-provider-BV8Iiwfb.cjs.map +0 -1
  189. package/dist/chunks/auth-provider-Bnox5gsx.js +0 -98
  190. package/dist/chunks/auth-provider-Bnox5gsx.js.map +0 -1
  191. package/dist/chunks/builder-CMlJfQHE.cjs +0 -3
  192. package/dist/chunks/builder-CMlJfQHE.cjs.map +0 -1
  193. package/dist/chunks/builder-D950gct_.js.map +0 -1
  194. package/dist/chunks/categories-5yEM3p3N.cjs +0 -2
  195. package/dist/chunks/categories-5yEM3p3N.cjs.map +0 -1
  196. package/dist/chunks/categories-BIpOG451.js +0 -387
  197. package/dist/chunks/categories-BIpOG451.js.map +0 -1
  198. package/dist/chunks/dashboard-page-Bx1-Ys3e.js +0 -122
  199. package/dist/chunks/dashboard-page-Bx1-Ys3e.js.map +0 -1
  200. package/dist/chunks/dashboard-page-CQNRbMkJ.cjs +0 -2
  201. package/dist/chunks/dashboard-page-CQNRbMkJ.cjs.map +0 -1
  202. package/dist/chunks/delegations-B2j-wNEO.js +0 -646
  203. package/dist/chunks/delegations-B2j-wNEO.js.map +0 -1
  204. package/dist/chunks/delegations-CsB9ozLu.cjs +0 -2
  205. package/dist/chunks/delegations-CsB9ozLu.cjs.map +0 -1
  206. package/dist/chunks/delegations-CvtwTXNP.cjs +0 -2
  207. package/dist/chunks/delegations-CvtwTXNP.cjs.map +0 -1
  208. package/dist/chunks/delegations-dKodb0WW.js +0 -573
  209. package/dist/chunks/delegations-dKodb0WW.js.map +0 -1
  210. package/dist/chunks/detail-BcGAqJ_R.js +0 -1523
  211. package/dist/chunks/detail-BcGAqJ_R.js.map +0 -1
  212. package/dist/chunks/detail-CqjqLd65.cjs +0 -2
  213. package/dist/chunks/detail-CqjqLd65.cjs.map +0 -1
  214. package/dist/chunks/format-date-time-26_pFvv4.cjs +0 -2
  215. package/dist/chunks/login-CQ9MfwcC.cjs +0 -2
  216. package/dist/chunks/notifications-2swRqDPF.js +0 -198
  217. package/dist/chunks/notifications-2swRqDPF.js.map +0 -1
  218. package/dist/chunks/notifications-BaYDebFt.cjs +0 -2
  219. package/dist/chunks/notifications-BaYDebFt.cjs.map +0 -1
  220. package/dist/chunks/orgs-CuHxxd_n.js +0 -1949
  221. package/dist/chunks/orgs-CuHxxd_n.js.map +0 -1
  222. package/dist/chunks/orgs-YMiVLNvL.cjs +0 -2
  223. package/dist/chunks/orgs-YMiVLNvL.cjs.map +0 -1
  224. package/dist/chunks/templates-DTkbSgFY.cjs +0 -2
  225. package/dist/chunks/templates-DTkbSgFY.cjs.map +0 -1
  226. package/dist/chunks/templates-DoDWM68t.js +0 -384
  227. package/dist/chunks/templates-DoDWM68t.js.map +0 -1
  228. package/dist/chunks/users-3ySyUW4u.cjs +0 -2
  229. package/dist/chunks/users-3ySyUW4u.cjs.map +0 -1
  230. package/dist/chunks/users-sMfrSjRQ.js +0 -219
  231. package/dist/chunks/users-sMfrSjRQ.js.map +0 -1
  232. package/dist/components/app-navigation.d.ts +0 -41
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../src/next/BPMNextProviders.tsx"],"sourcesContent":["'use client';\n\n// One-line Next.js App Router shim for BPM. Reads `next/navigation` hooks,\n// builds a `RouterAdapter`, then composes `<RouterAdapterProvider>` and the\n// shared `<BPMProviders>`. Wrapped in `<Suspense>` so static prerender of\n// routes like `/404` does not fail on `useSearchParams()` during `next build`.\n\nimport { Suspense, useMemo, type ReactElement, type ReactNode } from 'react';\nimport { usePathname, useRouter, useSearchParams } from 'next/navigation';\nimport {\n Providers as BPMProviders,\n RouterAdapterProvider,\n type RouterAdapter,\n} from '@rytass/bpm-core-react';\nimport type { CalendarLocale } from '@mezzanine-ui/react/moment';\n\nexport interface BPMNextProvidersProps {\n readonly children: ReactNode;\n /**\n * Override the Mezzanine calendar locale. Forwarded to the inner\n * `<Providers>`. Defaults to `CalendarLocale.ZH_TW`.\n */\n readonly locale?: CalendarLocale;\n /**\n * Routes that must remain accessible without a BPM session — visiting\n * these does not redirect to `loginPath` even when `member` is null.\n * Forwarded to `<AuthProvider>`. Defaults to `['/login']`.\n *\n * Hosts that mount BPM under a non-root prefix (see\n * `<BPMRoutesProvider>`) should typically expand this to include their\n * own auth-bypass paths.\n */\n readonly publicPaths?: readonly string[];\n /**\n * Where to redirect unauthenticated users. Forwarded to\n * `<AuthProvider>`. Defaults to `'/login'`. Hosts owning their own\n * login route (the recommended case) override this to their host\n * route, e.g. `'/auth/sign-in'`.\n */\n readonly loginPath?: string;\n}\n\nfunction BPMNextProvidersBody({\n children,\n locale,\n publicPaths,\n loginPath,\n}: BPMNextProvidersProps): ReactElement {\n const nextRouter = useRouter();\n const pathname = usePathname();\n const searchParams = useSearchParams();\n\n const adapter = useMemo<RouterAdapter>(\n () => ({\n pathname,\n push: (href: string): void => nextRouter.push(href),\n replace: (href: string): void => nextRouter.replace(href),\n back: (): void => nextRouter.back(),\n searchParams: (): URLSearchParams =>\n new URLSearchParams(searchParams?.toString() ?? ''),\n }),\n [nextRouter, pathname, searchParams],\n );\n\n return (\n <RouterAdapterProvider value={adapter}>\n <BPMProviders\n locale={locale}\n publicPaths={publicPaths}\n loginPath={loginPath}\n >\n {children}\n </BPMProviders>\n </RouterAdapterProvider>\n );\n}\n\n/**\n * One-line Next.js App Router shim for the full BPM provider stack.\n * Mounts in the host's root layout (or layout for the BPM sub-tree):\n *\n * ```tsx\n * import { BPMNextProviders } from '@rytass/bpm-core-react/next';\n *\n * export default function RootLayout({ children }) {\n * return (\n * <html><body>\n * <BPMNextProviders loginPath=\"/auth/sign-in\">\n * {children}\n * </BPMNextProviders>\n * </body></html>\n * );\n * }\n * ```\n *\n * Forwards every prop on {@link BPMNextProvidersProps} to the inner\n * `<Providers>` and `<AuthProvider>`. For per-feature path remapping\n * (BPM internal navigation), additionally wrap with\n * `<BPMRoutesProvider>` exported from the same subpath.\n */\nexport function BPMNextProviders(props: BPMNextProvidersProps): ReactElement {\n return (\n <Suspense fallback={null}>\n <BPMNextProvidersBody {...props} />\n </Suspense>\n );\n}\n"],"mappings":"+PA0CA,SAAS,EAAqB,CAC5B,WACA,SACA,cACA,aACsC,CACtC,IAAM,GAAA,EAAA,EAAA,WAAuB,EACvB,GAAA,EAAA,EAAA,aAAuB,EACvB,GAAA,EAAA,EAAA,iBAA+B,EAcrC,OACE,EAAA,EAAA,KAAC,EAAA,sBAAD,CAAuB,OAAA,EAAA,EAAA,cAZhB,CACL,WACA,KAAO,GAAuB,EAAW,KAAK,CAAI,EAClD,QAAU,GAAuB,EAAW,QAAQ,CAAI,EACxD,SAAkB,EAAW,KAAK,EAClC,iBACE,IAAI,gBAAgB,GAAc,SAAS,GAAK,EAAE,CACtD,GACA,CAAC,EAAY,EAAU,CAAY,CAIL,YAC5B,EAAA,EAAA,KAAC,EAAA,UAAD,CACU,SACK,cACF,YAEV,UACW,CAAA,CACO,CAAA,CAE3B,CAyBA,SAAgB,EAAiB,EAA4C,CAC3E,OACE,EAAA,EAAA,KAAC,EAAA,SAAD,CAAU,SAAU,eAClB,EAAA,EAAA,KAAC,EAAD,CAAsB,GAAI,CAAQ,CAAA,CAC1B,CAAA,CAEd"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../src/next/BPMNextProviders.tsx"],"sourcesContent":["'use client';\n\n// One-line Next.js App Router shim for BPM. Reads `next/navigation`\n// router/pathname hooks, builds a `RouterAdapter`, then composes\n// `<RouterAdapterProvider>` and the shared `<BPMProviders>`.\n//\n// IMPORTANT: This component intentionally does NOT call\n// `useSearchParams()`. Doing so triggers Next.js's CSR bailout at static\n// prerender, and any `<Suspense fallback={null}>` we wrap around it then\n// erases `<RouterAdapterProvider>` from the SSR/hydration tree — leaving\n// every BPM view to throw \"must be used inside <RouterAdapterProvider>\"\n// when it mounts. None of the shipped BPM views consume\n// `RouterAdapter.searchParams()` anyway; hosts that need reactive query\n// string state should call Next's `useSearchParams()` directly in their\n// page (with their own Suspense). The lazy default getter below is\n// good enough for read-on-demand callers.\n\nimport { useMemo, type ReactElement, type ReactNode } from 'react';\nimport { usePathname, useRouter } from 'next/navigation';\nimport {\n Providers as BPMProviders,\n RouterAdapterProvider,\n defaultBrowserSearchParams,\n type RouterAdapter,\n} from '@rytass/bpm-core-react';\nimport type { CalendarLocale } from '@mezzanine-ui/react/moment';\n\nexport interface BPMNextProvidersProps {\n readonly children: ReactNode;\n /**\n * Override the Mezzanine calendar locale. Forwarded to the inner\n * `<Providers>`. Defaults to `CalendarLocale.ZH_TW`.\n */\n readonly locale?: CalendarLocale;\n /**\n * Routes that must remain accessible without a BPM session — visiting\n * these does not redirect to `loginPath` even when `member` is null.\n * Forwarded to `<AuthProvider>`. Defaults to `['/login']`.\n *\n * Hosts that mount BPM under a non-root prefix (see\n * `<BPMRoutesProvider>`) should typically expand this to include their\n * own auth-bypass paths.\n */\n readonly publicPaths?: readonly string[];\n /**\n * Where to redirect unauthenticated users. Forwarded to\n * `<AuthProvider>`. Defaults to `'/login'`. Hosts owning their own\n * login route (the recommended case) override this to their host\n * route, e.g. `'/auth/sign-in'`.\n */\n readonly loginPath?: string;\n}\n\n/**\n * One-line Next.js App Router shim for the full BPM provider stack.\n * Mounts in the host's root layout (or layout for the BPM sub-tree):\n *\n * ```tsx\n * import { BPMNextProviders } from '@rytass/bpm-core-react/next';\n *\n * export default function RootLayout({ children }) {\n * return (\n * <html><body>\n * <BPMNextProviders loginPath=\"/auth/sign-in\">\n * {children}\n * </BPMNextProviders>\n * </body></html>\n * );\n * }\n * ```\n *\n * Forwards every prop on {@link BPMNextProvidersProps} to the inner\n * `<Providers>` and `<AuthProvider>`. For per-feature path remapping\n * (BPM internal navigation), additionally wrap with\n * `<BPMRoutesProvider>` exported from the same subpath.\n */\nexport function BPMNextProviders({\n children,\n locale,\n publicPaths,\n loginPath,\n}: BPMNextProvidersProps): ReactElement {\n const nextRouter = useRouter();\n const pathname = usePathname();\n\n const adapter = useMemo<RouterAdapter>(\n () => ({\n pathname,\n push: (href: string): void => nextRouter.push(href),\n replace: (href: string): void => nextRouter.replace(href),\n back: (): void => nextRouter.back(),\n searchParams: (): URLSearchParams => defaultBrowserSearchParams(),\n }),\n [nextRouter, pathname],\n );\n\n return (\n <RouterAdapterProvider value={adapter}>\n <BPMProviders\n locale={locale}\n publicPaths={publicPaths}\n loginPath={loginPath}\n >\n {children}\n </BPMProviders>\n </RouterAdapterProvider>\n );\n}\n"],"mappings":"+PA4EA,SAAgB,EAAiB,CAC/B,WACA,SACA,cACA,aACsC,CACtC,IAAM,GAAA,EAAA,EAAA,WAAuB,EACvB,GAAA,EAAA,EAAA,aAAuB,EAa7B,OACE,EAAA,EAAA,KAAC,EAAA,sBAAD,CAAuB,OAAA,EAAA,EAAA,cAXhB,CACL,WACA,KAAO,GAAuB,EAAW,KAAK,CAAI,EAClD,QAAU,GAAuB,EAAW,QAAQ,CAAI,EACxD,SAAkB,EAAW,KAAK,EAClC,kBAAA,EAAA,EAAA,4BAAgE,CAClE,GACA,CAAC,EAAY,CAAQ,CAIS,YAC5B,EAAA,EAAA,KAAC,EAAA,UAAD,CACU,SACK,cACF,YAEV,UACW,CAAA,CACO,CAAA,CAE3B"}
@@ -1,39 +1,29 @@
1
1
  "use client";
2
2
  import { n as e, r as t, t as n } from "../chunks/routes-config-dxahImVe.js";
3
- import { Suspense as r, useMemo as i } from "react";
4
- import { jsx as a } from "react/jsx-runtime";
5
- import { usePathname as o, useRouter as s, useSearchParams as c } from "next/navigation";
6
- import { Providers as l, RouterAdapterProvider as u } from "@rytass/bpm-core-react";
3
+ import { useMemo as r } from "react";
4
+ import { jsx as i } from "react/jsx-runtime";
5
+ import { usePathname as a, useRouter as o } from "next/navigation";
6
+ import { Providers as s, RouterAdapterProvider as c, defaultBrowserSearchParams as l } from "@rytass/bpm-core-react";
7
7
  //#region src/next/BPMNextProviders.tsx
8
- function d({ children: e, locale: t, publicPaths: n, loginPath: r }) {
9
- let d = s(), f = o(), p = c();
10
- return /* @__PURE__ */ a(u, {
11
- value: i(() => ({
8
+ function u({ children: e, locale: t, publicPaths: n, loginPath: u }) {
9
+ let d = o(), f = a();
10
+ return /* @__PURE__ */ i(c, {
11
+ value: r(() => ({
12
12
  pathname: f,
13
13
  push: (e) => d.push(e),
14
14
  replace: (e) => d.replace(e),
15
15
  back: () => d.back(),
16
- searchParams: () => new URLSearchParams(p?.toString() ?? "")
17
- }), [
18
- d,
19
- f,
20
- p
21
- ]),
22
- children: /* @__PURE__ */ a(l, {
16
+ searchParams: () => l()
17
+ }), [d, f]),
18
+ children: /* @__PURE__ */ i(s, {
23
19
  locale: t,
24
20
  publicPaths: n,
25
- loginPath: r,
21
+ loginPath: u,
26
22
  children: e
27
23
  })
28
24
  });
29
25
  }
30
- function f(e) {
31
- return /* @__PURE__ */ a(r, {
32
- fallback: null,
33
- children: /* @__PURE__ */ a(d, { ...e })
34
- });
35
- }
36
26
  //#endregion
37
- export { f as BPMNextProviders, n as BPMRoutesProvider, e as createDefaultBPMRoutes, t as useBPMRoutes };
27
+ export { u as BPMNextProviders, n as BPMRoutesProvider, e as createDefaultBPMRoutes, t as useBPMRoutes };
38
28
 
39
29
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/next/BPMNextProviders.tsx"],"sourcesContent":["'use client';\n\n// One-line Next.js App Router shim for BPM. Reads `next/navigation` hooks,\n// builds a `RouterAdapter`, then composes `<RouterAdapterProvider>` and the\n// shared `<BPMProviders>`. Wrapped in `<Suspense>` so static prerender of\n// routes like `/404` does not fail on `useSearchParams()` during `next build`.\n\nimport { Suspense, useMemo, type ReactElement, type ReactNode } from 'react';\nimport { usePathname, useRouter, useSearchParams } from 'next/navigation';\nimport {\n Providers as BPMProviders,\n RouterAdapterProvider,\n type RouterAdapter,\n} from '@rytass/bpm-core-react';\nimport type { CalendarLocale } from '@mezzanine-ui/react/moment';\n\nexport interface BPMNextProvidersProps {\n readonly children: ReactNode;\n /**\n * Override the Mezzanine calendar locale. Forwarded to the inner\n * `<Providers>`. Defaults to `CalendarLocale.ZH_TW`.\n */\n readonly locale?: CalendarLocale;\n /**\n * Routes that must remain accessible without a BPM session — visiting\n * these does not redirect to `loginPath` even when `member` is null.\n * Forwarded to `<AuthProvider>`. Defaults to `['/login']`.\n *\n * Hosts that mount BPM under a non-root prefix (see\n * `<BPMRoutesProvider>`) should typically expand this to include their\n * own auth-bypass paths.\n */\n readonly publicPaths?: readonly string[];\n /**\n * Where to redirect unauthenticated users. Forwarded to\n * `<AuthProvider>`. Defaults to `'/login'`. Hosts owning their own\n * login route (the recommended case) override this to their host\n * route, e.g. `'/auth/sign-in'`.\n */\n readonly loginPath?: string;\n}\n\nfunction BPMNextProvidersBody({\n children,\n locale,\n publicPaths,\n loginPath,\n}: BPMNextProvidersProps): ReactElement {\n const nextRouter = useRouter();\n const pathname = usePathname();\n const searchParams = useSearchParams();\n\n const adapter = useMemo<RouterAdapter>(\n () => ({\n pathname,\n push: (href: string): void => nextRouter.push(href),\n replace: (href: string): void => nextRouter.replace(href),\n back: (): void => nextRouter.back(),\n searchParams: (): URLSearchParams =>\n new URLSearchParams(searchParams?.toString() ?? ''),\n }),\n [nextRouter, pathname, searchParams],\n );\n\n return (\n <RouterAdapterProvider value={adapter}>\n <BPMProviders\n locale={locale}\n publicPaths={publicPaths}\n loginPath={loginPath}\n >\n {children}\n </BPMProviders>\n </RouterAdapterProvider>\n );\n}\n\n/**\n * One-line Next.js App Router shim for the full BPM provider stack.\n * Mounts in the host's root layout (or layout for the BPM sub-tree):\n *\n * ```tsx\n * import { BPMNextProviders } from '@rytass/bpm-core-react/next';\n *\n * export default function RootLayout({ children }) {\n * return (\n * <html><body>\n * <BPMNextProviders loginPath=\"/auth/sign-in\">\n * {children}\n * </BPMNextProviders>\n * </body></html>\n * );\n * }\n * ```\n *\n * Forwards every prop on {@link BPMNextProvidersProps} to the inner\n * `<Providers>` and `<AuthProvider>`. For per-feature path remapping\n * (BPM internal navigation), additionally wrap with\n * `<BPMRoutesProvider>` exported from the same subpath.\n */\nexport function BPMNextProviders(props: BPMNextProvidersProps): ReactElement {\n return (\n <Suspense fallback={null}>\n <BPMNextProvidersBody {...props} />\n </Suspense>\n );\n}\n"],"mappings":";;;;;;;AA0CA,SAAS,EAAqB,EAC5B,aACA,WACA,gBACA,gBACsC;CACtC,IAAM,IAAa,EAAU,GACvB,IAAW,EAAY,GACvB,IAAe,EAAgB;CAcrC,OACE,kBAAC,GAAD;EAAuB,OAbT,SACP;GACL;GACA,OAAO,MAAuB,EAAW,KAAK,CAAI;GAClD,UAAU,MAAuB,EAAW,QAAQ,CAAI;GACxD,YAAkB,EAAW,KAAK;GAClC,oBACE,IAAI,gBAAgB,GAAc,SAAS,KAAK,EAAE;EACtD,IACA;GAAC;GAAY;GAAU;EAAY,CAIL;YAC5B,kBAAC,GAAD;GACU;GACK;GACF;GAEV;EACW,CAAA;CACO,CAAA;AAE3B;AAyBA,SAAgB,EAAiB,GAA4C;CAC3E,OACE,kBAAC,GAAD;EAAU,UAAU;YAClB,kBAAC,GAAD,EAAsB,GAAI,EAAQ,CAAA;CAC1B,CAAA;AAEd"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/next/BPMNextProviders.tsx"],"sourcesContent":["'use client';\n\n// One-line Next.js App Router shim for BPM. Reads `next/navigation`\n// router/pathname hooks, builds a `RouterAdapter`, then composes\n// `<RouterAdapterProvider>` and the shared `<BPMProviders>`.\n//\n// IMPORTANT: This component intentionally does NOT call\n// `useSearchParams()`. Doing so triggers Next.js's CSR bailout at static\n// prerender, and any `<Suspense fallback={null}>` we wrap around it then\n// erases `<RouterAdapterProvider>` from the SSR/hydration tree — leaving\n// every BPM view to throw \"must be used inside <RouterAdapterProvider>\"\n// when it mounts. None of the shipped BPM views consume\n// `RouterAdapter.searchParams()` anyway; hosts that need reactive query\n// string state should call Next's `useSearchParams()` directly in their\n// page (with their own Suspense). The lazy default getter below is\n// good enough for read-on-demand callers.\n\nimport { useMemo, type ReactElement, type ReactNode } from 'react';\nimport { usePathname, useRouter } from 'next/navigation';\nimport {\n Providers as BPMProviders,\n RouterAdapterProvider,\n defaultBrowserSearchParams,\n type RouterAdapter,\n} from '@rytass/bpm-core-react';\nimport type { CalendarLocale } from '@mezzanine-ui/react/moment';\n\nexport interface BPMNextProvidersProps {\n readonly children: ReactNode;\n /**\n * Override the Mezzanine calendar locale. Forwarded to the inner\n * `<Providers>`. Defaults to `CalendarLocale.ZH_TW`.\n */\n readonly locale?: CalendarLocale;\n /**\n * Routes that must remain accessible without a BPM session — visiting\n * these does not redirect to `loginPath` even when `member` is null.\n * Forwarded to `<AuthProvider>`. Defaults to `['/login']`.\n *\n * Hosts that mount BPM under a non-root prefix (see\n * `<BPMRoutesProvider>`) should typically expand this to include their\n * own auth-bypass paths.\n */\n readonly publicPaths?: readonly string[];\n /**\n * Where to redirect unauthenticated users. Forwarded to\n * `<AuthProvider>`. Defaults to `'/login'`. Hosts owning their own\n * login route (the recommended case) override this to their host\n * route, e.g. `'/auth/sign-in'`.\n */\n readonly loginPath?: string;\n}\n\n/**\n * One-line Next.js App Router shim for the full BPM provider stack.\n * Mounts in the host's root layout (or layout for the BPM sub-tree):\n *\n * ```tsx\n * import { BPMNextProviders } from '@rytass/bpm-core-react/next';\n *\n * export default function RootLayout({ children }) {\n * return (\n * <html><body>\n * <BPMNextProviders loginPath=\"/auth/sign-in\">\n * {children}\n * </BPMNextProviders>\n * </body></html>\n * );\n * }\n * ```\n *\n * Forwards every prop on {@link BPMNextProvidersProps} to the inner\n * `<Providers>` and `<AuthProvider>`. For per-feature path remapping\n * (BPM internal navigation), additionally wrap with\n * `<BPMRoutesProvider>` exported from the same subpath.\n */\nexport function BPMNextProviders({\n children,\n locale,\n publicPaths,\n loginPath,\n}: BPMNextProvidersProps): ReactElement {\n const nextRouter = useRouter();\n const pathname = usePathname();\n\n const adapter = useMemo<RouterAdapter>(\n () => ({\n pathname,\n push: (href: string): void => nextRouter.push(href),\n replace: (href: string): void => nextRouter.replace(href),\n back: (): void => nextRouter.back(),\n searchParams: (): URLSearchParams => defaultBrowserSearchParams(),\n }),\n [nextRouter, pathname],\n );\n\n return (\n <RouterAdapterProvider value={adapter}>\n <BPMProviders\n locale={locale}\n publicPaths={publicPaths}\n loginPath={loginPath}\n >\n {children}\n </BPMProviders>\n </RouterAdapterProvider>\n );\n}\n"],"mappings":";;;;;;;AA4EA,SAAgB,EAAiB,EAC/B,aACA,WACA,gBACA,gBACsC;CACtC,IAAM,IAAa,EAAU,GACvB,IAAW,EAAY;CAa7B,OACE,kBAAC,GAAD;EAAuB,OAZT,SACP;GACL;GACA,OAAO,MAAuB,EAAW,KAAK,CAAI;GAClD,UAAU,MAAuB,EAAW,QAAQ,CAAI;GACxD,YAAkB,EAAW,KAAK;GAClC,oBAAqC,EAA2B;EAClE,IACA,CAAC,GAAY,CAAQ,CAIS;YAC5B,kBAAC,GAAD;GACU;GACK;GACF;GAEV;EACW,CAAA;CACO,CAAA;AAE3B"}
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/delegations-CvtwTXNP.cjs");let t=require("react/jsx-runtime");var n={title:`代理設定 | BPM Admin`,description:`設定簽核代理規則,讓符合範圍的待簽任務自動改派給代理人。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/delegations-DDEk-WI6.cjs");let t=require("react/jsx-runtime");var n={title:`代理設定 | BPM Admin`,description:`設定簽核代理規則,讓符合範圍的待簽任務自動改派給代理人。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../chunks/delegations-B2j-wNEO.js";
1
+ import { t as e } from "../../../chunks/delegations-iVnRi3QE.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/admin/delegations/index.tsx
4
4
  var n = {
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/orgs-YMiVLNvL.cjs");let t=require("react/jsx-runtime");var n={title:`組織管理 | BPM Admin`,description:`維護組織樹、職位、會員歸屬與簽核主管解析規則。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/orgs-BIiqzHvb.cjs");let t=require("react/jsx-runtime");var n={title:`組織管理 | BPM Admin`,description:`維護組織樹、職位、會員歸屬與簽核主管解析規則。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../chunks/orgs-CuHxxd_n.js";
1
+ import { t as e } from "../../../chunks/orgs-Cc18umVt.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/admin/orgs/index.tsx
4
4
  var n = {
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/users-3ySyUW4u.cjs");let t=require("react/jsx-runtime");var n={title:`會員對照 | BPM Admin`,description:`檢視 BPM 內部會員組織歸屬與主管解析。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/users-qghSMtLn.cjs");let t=require("react/jsx-runtime");var n={title:`會員對照 | BPM Admin`,description:`檢視 BPM 內部會員組織歸屬與主管解析。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../chunks/users-sMfrSjRQ.js";
1
+ import { t as e } from "../../../chunks/users-CUY139DF.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/admin/users/index.tsx
4
4
  var n = {
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../chunks/delegations-CsB9ozLu.cjs");let t=require("react/jsx-runtime");var n={title:`我的代理 | BPM Admin`,description:`設定自己的簽核代理,讓指定期間內的新待簽任務自動交由代理人處理。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../chunks/delegations-C2wLWsDQ.cjs");let t=require("react/jsx-runtime");var n={title:`我的代理 | BPM Admin`,description:`設定自己的簽核代理,讓指定期間內的新待簽任務自動交由代理人處理。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../chunks/delegations-dKodb0WW.js";
1
+ import { t as e } from "../../chunks/delegations-ZNtodFaD.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/delegations/index.tsx
4
4
  var n = {
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/builder-CMlJfQHE.cjs");let t=require("react/jsx-runtime");var n={title:`表單編輯器 | BPM Admin`,description:`編輯 BPM 表單欄位、版本與預覽。`};async function r({params:n}){let{id:r}=await n;return(0,t.jsx)(e.t,{formId:r})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/builder-DVE9zIKH.cjs");let t=require("react/jsx-runtime");var n={title:`表單編輯器 | BPM Admin`,description:`編輯 BPM 表單欄位、版本與預覽。`};async function r({params:n}){let{id:r}=await n;return(0,t.jsx)(e.t,{formId:r})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../chunks/builder-D950gct_.js";
1
+ import { t as e } from "../../../chunks/builder-BLVnnpnP.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/forms/builder/index.tsx
4
4
  var n = {
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/detail-CqjqLd65.cjs");let t=require("react/jsx-runtime");var n={title:`案件詳情 | BPM Admin`};async function r({params:n}){let{id:r}=await n;return(0,t.jsx)(e.t,{instanceId:r})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/detail-Dcr5mM8g.cjs");let t=require("react/jsx-runtime");var n={title:`案件詳情 | BPM Admin`};async function r({params:n}){let{id:r}=await n;return(0,t.jsx)(e.t,{instanceId:r})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../chunks/detail-BcGAqJ_R.js";
1
+ import { t as e } from "../../../chunks/detail-u9DdLhDW.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/instances/detail/index.tsx
4
4
  var n = { title: "案件詳情 | BPM Admin" };
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../chunks/login-CQ9MfwcC.cjs");let t=require("react/jsx-runtime");var n={title:`Login | BPM Admin`,description:`Sign in to the BPM approval workflow administration console.`};async function r({searchParams:n}){let{next:r}=await n;return(0,t.jsx)(e.t,{defaultNextPath:r})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../chunks/login-9bCXyjbX.cjs");let t=require("react/jsx-runtime");var n={title:`Login | BPM Admin`,description:`Sign in to the BPM approval workflow administration console.`};async function r({searchParams:n}){let{next:r}=await n;return(0,t.jsx)(e.t,{defaultNextPath:r})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../chunks/login-C20yVxbc.js";
1
+ import { t as e } from "../../chunks/login-BKxpLibd.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/login/index.tsx
4
4
  var n = {
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/notifications-BaYDebFt.cjs");let t=require("react/jsx-runtime");var n={title:`通知設定 | BPM Admin`,description:`調整站內通知、Email 通知與摘要頻率。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/notifications-BKs4--96.cjs");let t=require("react/jsx-runtime");var n={title:`通知設定 | BPM Admin`,description:`調整站內通知、Email 通知與摘要頻率。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../chunks/notifications-2swRqDPF.js";
1
+ import { t as e } from "../../../chunks/notifications-CSulztkU.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/settings/notifications/index.tsx
4
4
  var n = {
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/categories-5yEM3p3N.cjs");let t=require("react/jsx-runtime");var n={title:`範本分類管理 | BPM Admin`,description:`維護 BPM 流程範本的分類設定。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/categories-B6QZKZRt.cjs");let t=require("react/jsx-runtime");var n={title:`範本分類管理 | BPM Admin`,description:`維護 BPM 流程範本的分類設定。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../chunks/categories-BIpOG451.js";
1
+ import { t as e } from "../../../chunks/categories-DBPoSrsi.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/templates/categories/index.tsx
4
4
  var n = {
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../chunks/templates-DTkbSgFY.cjs");let t=require("react/jsx-runtime");var n={title:`流程範本 | BPM Admin`,description:`管理 BPM 流程範本,建立、編輯與發佈簽核模板。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../chunks/templates-w96t83N-.cjs");let t=require("react/jsx-runtime");var n={title:`流程範本 | BPM Admin`,description:`管理 BPM 流程範本,建立、編輯與發佈簽核模板。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../chunks/templates-DoDWM68t.js";
1
+ import { t as e } from "../../chunks/templates-D44FSB46.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/templates/index.tsx
4
4
  var n = {
@@ -1,5 +1,2 @@
1
1
  import { ReactElement } from 'react';
2
- export interface AdminDelegationsViewProps {
3
- readonly activeHref?: string;
4
- }
5
- export declare function AdminDelegationsView({ activeHref, }?: AdminDelegationsViewProps): ReactElement;
2
+ export declare function AdminDelegationsView(): ReactElement;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/delegations-CvtwTXNP.cjs");exports.AdminDelegationsView=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/delegations-DDEk-WI6.cjs");exports.AdminDelegationsView=e.t;
@@ -1,2 +1,2 @@
1
- import { t as e } from "../../../chunks/delegations-B2j-wNEO.js";
1
+ import { t as e } from "../../../chunks/delegations-iVnRi3QE.js";
2
2
  export { e as AdminDelegationsView };
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/users-3ySyUW4u.cjs"),t=require("../../chunks/orgs-YMiVLNvL.cjs"),n=require("../../chunks/delegations-CvtwTXNP.cjs");exports.AdminDelegationsView=n.t,exports.AdminOrgsView=t.t,exports.AdminUsersView=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/users-qghSMtLn.cjs"),t=require("../../chunks/orgs-BIiqzHvb.cjs"),n=require("../../chunks/delegations-DDEk-WI6.cjs");exports.AdminDelegationsView=n.t,exports.AdminOrgsView=t.t,exports.AdminUsersView=e.t;
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../chunks/users-sMfrSjRQ.js";
2
- import { t } from "../../chunks/orgs-CuHxxd_n.js";
3
- import { t as n } from "../../chunks/delegations-B2j-wNEO.js";
1
+ import { t as e } from "../../chunks/users-CUY139DF.js";
2
+ import { t } from "../../chunks/orgs-Cc18umVt.js";
3
+ import { t as n } from "../../chunks/delegations-iVnRi3QE.js";
4
4
  export { n as AdminDelegationsView, t as AdminOrgsView, e as AdminUsersView };
@@ -1,5 +1,2 @@
1
1
  import { ReactElement } from 'react';
2
- export interface AdminOrgsViewProps {
3
- readonly activeHref?: string;
4
- }
5
- export declare function AdminOrgsView({ activeHref, }?: AdminOrgsViewProps): ReactElement;
2
+ export declare function AdminOrgsView(): ReactElement;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/orgs-YMiVLNvL.cjs");exports.AdminOrgsView=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/orgs-BIiqzHvb.cjs");exports.AdminOrgsView=e.t;
@@ -1,2 +1,2 @@
1
- import { t as e } from "../../../chunks/orgs-CuHxxd_n.js";
1
+ import { t as e } from "../../../chunks/orgs-Cc18umVt.js";
2
2
  export { e as AdminOrgsView };
@@ -1,5 +1,2 @@
1
1
  import { ReactElement } from 'react';
2
- export interface AdminUsersViewProps {
3
- readonly activeHref?: string;
4
- }
5
- export declare function AdminUsersView({ activeHref, }?: AdminUsersViewProps): ReactElement;
2
+ export declare function AdminUsersView(): ReactElement;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/users-3ySyUW4u.cjs");exports.AdminUsersView=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/users-qghSMtLn.cjs");exports.AdminUsersView=e.t;
@@ -1,2 +1,2 @@
1
- import { t as e } from "../../../chunks/users-sMfrSjRQ.js";
1
+ import { t as e } from "../../../chunks/users-CUY139DF.js";
2
2
  export { e as AdminUsersView };
@@ -1,9 +1,7 @@
1
1
  import { ReactElement } from 'react';
2
- export interface CcViewProps {
3
- }
4
2
  /**
5
3
  * Framework-agnostic view for the BPM "cc" inbox — instances the current
6
4
  * member is copied on. Mechanical port of
7
5
  * `apps/client/src/app/cc/page.tsx`.
8
6
  */
9
- export declare function CcView(_props?: CcViewProps): ReactElement;
7
+ export declare function CcView(): ReactElement;
@@ -1,2 +1,2 @@
1
- "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/approval-instance-list-page-CVXgE2K3.cjs");let t=require("react/jsx-runtime");function n(n={}){return(0,t.jsx)(e.t,{activeHref:`/cc`,defaultState:null,description:`查看抄送給你的簽核案件。`,emptyMessage:`目前沒有抄送給你的簽核案件。`,searchPlaceholder:`關鍵字:搜尋案件、發起人、模板或狀態`,title:`抄送給我`,view:`CC`})}exports.CcView=n;
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/approval-instance-list-page-C5ZKPHdA.cjs");let t=require("react/jsx-runtime");function n(){return(0,t.jsx)(e.t,{defaultState:null,description:`查看抄送給你的簽核案件。`,emptyMessage:`目前沒有抄送給你的簽核案件。`,searchPlaceholder:`關鍵字:搜尋案件、發起人、模板或狀態`,title:`抄送給我`,view:`CC`})}exports.CcView=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/views/cc/CcView.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactElement } from 'react';\nimport { ApprovalInstanceListPage } from '../../components/approval-instance-list-page';\n\nexport interface CcViewProps {}\n\n/**\n * Framework-agnostic view for the BPM \"cc\" inbox — instances the current\n * member is copied on. Mechanical port of\n * `apps/client/src/app/cc/page.tsx`.\n */\nexport function CcView(_props: CcViewProps = {}): ReactElement {\n return (\n <ApprovalInstanceListPage\n activeHref=\"/cc\"\n defaultState={null}\n description=\"查看抄送給你的簽核案件。\"\n emptyMessage=\"目前沒有抄送給你的簽核案件。\"\n searchPlaceholder=\"關鍵字:搜尋案件、發起人、模板或狀態\"\n title=\"抄送給我\"\n view=\"CC\"\n />\n );\n}\n"],"mappings":"4LAYA,SAAgB,EAAO,EAAsB,CAAC,EAAiB,CAC7D,OACE,EAAA,EAAA,KAAC,EAAA,EAAD,CACE,WAAW,MACX,aAAc,KACd,YAAY,eACZ,aAAa,iBACb,kBAAkB,qBAClB,MAAM,OACN,KAAK,IACN,CAAA,CAEL"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/views/cc/CcView.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactElement } from 'react';\nimport { ApprovalInstanceListPage } from '../../components/approval-instance-list-page';\n\n\n/**\n * Framework-agnostic view for the BPM \"cc\" inbox — instances the current\n * member is copied on. Mechanical port of\n * `apps/client/src/app/cc/page.tsx`.\n */\nexport function CcView(): ReactElement {\n return (\n <ApprovalInstanceListPage\n defaultState={null}\n description=\"查看抄送給你的簽核案件。\"\n emptyMessage=\"目前沒有抄送給你的簽核案件。\"\n searchPlaceholder=\"關鍵字:搜尋案件、發起人、模板或狀態\"\n title=\"抄送給我\"\n view=\"CC\"\n />\n );\n}\n"],"mappings":"4LAWA,SAAgB,GAAuB,CACrC,OACE,EAAA,EAAA,KAAC,EAAA,EAAD,CACE,aAAc,KACd,YAAY,eACZ,aAAa,iBACb,kBAAkB,qBAClB,MAAM,OACN,KAAK,IACN,CAAA,CAEL"}
@@ -1,10 +1,9 @@
1
1
  "use client";
2
- import { t as e } from "../../chunks/approval-instance-list-page-CqNdoZqx.js";
2
+ import { t as e } from "../../chunks/approval-instance-list-page-BF2r5D2-.js";
3
3
  import { jsx as t } from "react/jsx-runtime";
4
4
  //#region src/views/cc/CcView.tsx
5
- function n(n = {}) {
5
+ function n() {
6
6
  return /* @__PURE__ */ t(e, {
7
- activeHref: "/cc",
8
7
  defaultState: null,
9
8
  description: "查看抄送給你的簽核案件。",
10
9
  emptyMessage: "目前沒有抄送給你的簽核案件。",
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/views/cc/CcView.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactElement } from 'react';\nimport { ApprovalInstanceListPage } from '../../components/approval-instance-list-page';\n\nexport interface CcViewProps {}\n\n/**\n * Framework-agnostic view for the BPM \"cc\" inbox — instances the current\n * member is copied on. Mechanical port of\n * `apps/client/src/app/cc/page.tsx`.\n */\nexport function CcView(_props: CcViewProps = {}): ReactElement {\n return (\n <ApprovalInstanceListPage\n activeHref=\"/cc\"\n defaultState={null}\n description=\"查看抄送給你的簽核案件。\"\n emptyMessage=\"目前沒有抄送給你的簽核案件。\"\n searchPlaceholder=\"關鍵字:搜尋案件、發起人、模板或狀態\"\n title=\"抄送給我\"\n view=\"CC\"\n />\n );\n}\n"],"mappings":";;;;AAYA,SAAgB,EAAO,IAAsB,CAAC,GAAiB;CAC7D,OACE,kBAAC,GAAD;EACE,YAAW;EACX,cAAc;EACd,aAAY;EACZ,cAAa;EACb,mBAAkB;EAClB,OAAM;EACN,MAAK;CACN,CAAA;AAEL"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/views/cc/CcView.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactElement } from 'react';\nimport { ApprovalInstanceListPage } from '../../components/approval-instance-list-page';\n\n\n/**\n * Framework-agnostic view for the BPM \"cc\" inbox — instances the current\n * member is copied on. Mechanical port of\n * `apps/client/src/app/cc/page.tsx`.\n */\nexport function CcView(): ReactElement {\n return (\n <ApprovalInstanceListPage\n defaultState={null}\n description=\"查看抄送給你的簽核案件。\"\n emptyMessage=\"目前沒有抄送給你的簽核案件。\"\n searchPlaceholder=\"關鍵字:搜尋案件、發起人、模板或狀態\"\n title=\"抄送給我\"\n view=\"CC\"\n />\n );\n}\n"],"mappings":";;;;AAWA,SAAgB,IAAuB;CACrC,OACE,kBAAC,GAAD;EACE,cAAc;EACd,aAAY;EACZ,cAAa;EACb,mBAAkB;EAClB,OAAM;EACN,MAAK;CACN,CAAA;AAEL"}
@@ -1,9 +1,7 @@
1
1
  import { ReactElement } from 'react';
2
- export interface DashboardViewProps {
3
- }
4
2
  /**
5
3
  * Framework-agnostic view for the BPM dashboard. Delegates to the shared
6
4
  * `<DashboardPage>` component. Mechanical port of
7
5
  * `apps/client/src/app/dashboard/page.tsx`.
8
6
  */
9
- export declare function DashboardView(_props?: DashboardViewProps): ReactElement;
7
+ export declare function DashboardView(): ReactElement;
@@ -1,2 +1,2 @@
1
- "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/dashboard-page-CQNRbMkJ.cjs");let t=require("react/jsx-runtime");function n(n={}){return(0,t.jsx)(e.t,{activeHref:`/dashboard`})}exports.DashboardView=n;
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/dashboard-page-CddG1MnK.cjs");let t=require("react/jsx-runtime");function n(){return(0,t.jsx)(e.t,{})}exports.DashboardView=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/views/dashboard/DashboardView.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactElement } from 'react';\nimport { DashboardPage } from '../../components/dashboard-page';\n\nexport interface DashboardViewProps {}\n\n/**\n * Framework-agnostic view for the BPM dashboard. Delegates to the shared\n * `<DashboardPage>` component. Mechanical port of\n * `apps/client/src/app/dashboard/page.tsx`.\n */\nexport function DashboardView(_props: DashboardViewProps = {}): ReactElement {\n return <DashboardPage activeHref=\"/dashboard\" />;\n}\n"],"mappings":"+KAYA,SAAgB,EAAc,EAA6B,CAAC,EAAiB,CAC3E,OAAO,EAAA,EAAA,KAAC,EAAA,EAAD,CAAe,WAAW,YAAc,CAAA,CACjD"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/views/dashboard/DashboardView.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactElement } from 'react';\nimport { DashboardPage } from '../../components/dashboard-page';\n\n\n/**\n * Framework-agnostic view for the BPM dashboard. Delegates to the shared\n * `<DashboardPage>` component. Mechanical port of\n * `apps/client/src/app/dashboard/page.tsx`.\n */\nexport function DashboardView(): ReactElement {\n return <DashboardPage />;\n}\n"],"mappings":"+KAWA,SAAgB,GAA8B,CAC5C,OAAO,EAAA,EAAA,KAAC,EAAA,EAAD,CAAgB,CAAA,CACzB"}
@@ -1,9 +1,9 @@
1
1
  "use client";
2
- import { t as e } from "../../chunks/dashboard-page-Bx1-Ys3e.js";
2
+ import { t as e } from "../../chunks/dashboard-page-Ib8srCMy.js";
3
3
  import { jsx as t } from "react/jsx-runtime";
4
4
  //#region src/views/dashboard/DashboardView.tsx
5
- function n(n = {}) {
6
- return /* @__PURE__ */ t(e, { activeHref: "/dashboard" });
5
+ function n() {
6
+ return /* @__PURE__ */ t(e, {});
7
7
  }
8
8
  //#endregion
9
9
  export { n as DashboardView };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/views/dashboard/DashboardView.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactElement } from 'react';\nimport { DashboardPage } from '../../components/dashboard-page';\n\nexport interface DashboardViewProps {}\n\n/**\n * Framework-agnostic view for the BPM dashboard. Delegates to the shared\n * `<DashboardPage>` component. Mechanical port of\n * `apps/client/src/app/dashboard/page.tsx`.\n */\nexport function DashboardView(_props: DashboardViewProps = {}): ReactElement {\n return <DashboardPage activeHref=\"/dashboard\" />;\n}\n"],"mappings":";;;;AAYA,SAAgB,EAAc,IAA6B,CAAC,GAAiB;CAC3E,OAAO,kBAAC,GAAD,EAAe,YAAW,aAAc,CAAA;AACjD"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/views/dashboard/DashboardView.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactElement } from 'react';\nimport { DashboardPage } from '../../components/dashboard-page';\n\n\n/**\n * Framework-agnostic view for the BPM dashboard. Delegates to the shared\n * `<DashboardPage>` component. Mechanical port of\n * `apps/client/src/app/dashboard/page.tsx`.\n */\nexport function DashboardView(): ReactElement {\n return <DashboardPage />;\n}\n"],"mappings":";;;;AAWA,SAAgB,IAA8B;CAC5C,OAAO,kBAAC,GAAD,CAAgB,CAAA;AACzB"}
@@ -1,5 +1,2 @@
1
1
  import { ReactElement } from 'react';
2
- export interface DelegationsViewProps {
3
- readonly activeHref?: string;
4
- }
5
- export declare function DelegationsView({ activeHref, }?: DelegationsViewProps): ReactElement;
2
+ export declare function DelegationsView(): ReactElement;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/delegations-CsB9ozLu.cjs");exports.DelegationsView=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/delegations-C2wLWsDQ.cjs");exports.DelegationsView=e.t;
@@ -1,2 +1,2 @@
1
- import { t as e } from "../../chunks/delegations-dKodb0WW.js";
1
+ import { t as e } from "../../chunks/delegations-ZNtodFaD.js";
2
2
  export { e as DelegationsView };
@@ -1,4 +1,2 @@
1
1
  import { ReactElement } from 'react';
2
- export interface FormsViewProps {
3
- }
4
- export declare function FormsView(_props?: FormsViewProps): ReactElement;
2
+ export declare function FormsView(): ReactElement;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/builder-CMlJfQHE.cjs");exports.FormBuilderView=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/builder-DVE9zIKH.cjs");exports.FormBuilderView=e.t;
@@ -1,2 +1,2 @@
1
- import { t as e } from "../../../chunks/builder-D950gct_.js";
1
+ import { t as e } from "../../../chunks/builder-BLVnnpnP.js";
2
2
  export { e as FormBuilderView };
@@ -1,2 +1,2 @@
1
- "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/app-navigation-KnlJCUp1.cjs"),t=require("../../chunks/auth-provider-BV8Iiwfb.cjs"),n=require("../../chunks/format-date-time-26_pFvv4.cjs"),r=require("../../chunks/routes-config-2aKbWq2H.cjs"),i=require("../../chunks/FormRendererView-BwVsH2eX.cjs"),a=require("../../chunks/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");var f=[10,20,50],p=[{key:`ALL`,label:`全部`},{key:`PUBLISHED`,label:`已發布`},{key:`DRAFT`,label:`草稿`}];function m(i={}){let m=t.a(),y=r.r(),[b,x]=(0,o.useState)([]),[S,C]=(0,o.useState)(null),[w,T]=(0,o.useState)(!0),[E,D]=(0,o.useState)(!1),[O,k]=(0,o.useState)(!1),[A,j]=(0,o.useState)(1),[M,N]=(0,o.useState)(10),[P,F]=(0,o.useState)(`ALL`),[I,L]=(0,o.useState)(0),R=(0,o.useCallback)(async()=>{T(!0),C(null);try{let e=await(0,d.listFormDefinitionsPage)({page:A,pageSize:M,status:P===`ALL`?null:P});x(e.forms),L(e.totalCount)}catch(e){C(h(e))}finally{T(!1)}},[A,M,P]);(0,o.useEffect)(()=>{R()},[R]);let z=(0,o.useMemo)(()=>b.map(e=>({...e,key:e.id,status:e.currentVersionId?`PUBLISHED`:`DRAFT`,updatedAt:n.t(e.updatedAt)})),[b]),B=(0,o.useMemo)(()=>[{dataIndex:`name`,key:`name`,title:`表單名稱`,width:220},{key:`status`,render:e=>(0,c.jsx)(g,{status:e.status}),title:`狀態`,width:120},{key:`currentVersionId`,render:e=>(0,c.jsx)(v,{record:e}),title:`目前版本`,width:220}],[]),V=(0,o.useMemo)(()=>({render:e=>[{name:`編輯`,onClick:()=>m.push(y.formBuilder(e.id))}],variant:`base-secondary`,width:88}),[m]);async function H(e){k(!0),C(null);try{let t=await(0,d.createFormDefinition)(e);D(!1),m.push(y.formBuilder(t))}finally{k(!1)}}return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsxs)(e.t,{activeHref:y.forms(),children:[(0,c.jsx)(s.PageHeader,{children:(0,c.jsx)(u.default,{description:`建立表單定義、管理草稿與已發布版本,提供流程模板綁定使用。`,title:`表單設計`,children:(0,c.jsx)(s.Button,{disabled:O,icon:l.PlusIcon,iconType:`leading`,onClick:()=>D(!0),variant:`base-primary`,children:`建立表單`})})}),(0,c.jsx)(s.SectionGroup,{children:(0,c.jsxs)(s.Section,{tab:(0,c.jsx)(s.Tab,{activeKey:P,onChange:e=>{F(_(e)),j(1)},children:p.map(e=>(0,c.jsx)(s.TabItem,{children:e.label},e.key))}),children:[S?(0,c.jsx)(s.Typography,{color:`text-error`,variant:`body`,children:S}):null,(0,c.jsx)(s.Table,{columns:B,actions:V,dataSource:z,fullWidth:!0,loading:w,pagination:{current:A,onChange:e=>{j(e)},onChangePageSize:e=>{j(1),N(e)},pageSize:M,pageSizeLabel:`每頁筆數`,pageSizeOptions:f,renderResultSummary:(e,t,n)=>`顯示 ${e}-${t} 筆,共 ${n} 筆`,showPageSizeOptions:!0,total:I}})]})})]}),(0,c.jsx)(a.t,{confirmText:`建立`,initialName:``,loading:O,onClose:()=>D(!1),onSubmit:H,open:E,title:`建立表單`})]})}function h(e){return e instanceof Error?e.message:`發生未知錯誤`}function g({status:e}){return e===`PUBLISHED`?(0,c.jsx)(s.Badge,{size:`sub`,text:`已發布`,variant:`dot-success`}):(0,c.jsx)(s.Badge,{size:`sub`,text:`草稿`,variant:`dot-warning`})}function _(e){return e===`PUBLISHED`||e===`DRAFT`?e:`ALL`}function v({record:e}){if(!e.currentVersionId||!e.currentVersionNumber)return(0,c.jsx)(s.Typography,{variant:`body`,children:`尚未發布`});let t=e.currentVersionPublishedAt??e.currentVersionCreatedAt;return(0,c.jsxs)(s.Typography,{variant:`body`,children:[`v`,e.currentVersionNumber,t?` · ${n.t(t)}`:``]})}exports.FormRenderer=i.t,exports.FormRendererView=i.t,exports.FormsView=m;
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/chunk-CMqjfN_6.cjs"),t=require("../../chunks/router-adapter--gYs13E8.cjs"),n=require("../../chunks/format-date-time-XxBzF0F5.cjs"),r=require("../../chunks/routes-config-2aKbWq2H.cjs"),i=require("../../chunks/FormRendererView-BwVsH2eX.cjs"),a=require("../../chunks/form-name-modal-uZCHbtRH.cjs");let o=require("react"),s=require("@mezzanine-ui/react"),c=require("react/jsx-runtime"),l=require("@mezzanine-ui/react/ContentHeader");l=e.t(l,1);let u=require("@mezzanine-ui/icons"),d=require("@rytass/bpm-core-client/form");var f=[10,20,50],p=[{key:`ALL`,label:`全部`},{key:`PUBLISHED`,label:`已發布`},{key:`DRAFT`,label:`草稿`}];function m(){let e=t.r(),i=r.r(),[m,y]=(0,o.useState)([]),[b,x]=(0,o.useState)(null),[S,C]=(0,o.useState)(!0),[w,T]=(0,o.useState)(!1),[E,D]=(0,o.useState)(!1),[O,k]=(0,o.useState)(1),[A,j]=(0,o.useState)(10),[M,N]=(0,o.useState)(`ALL`),[P,F]=(0,o.useState)(0),I=(0,o.useCallback)(async()=>{C(!0),x(null);try{let e=await(0,d.listFormDefinitionsPage)({page:O,pageSize:A,status:M===`ALL`?null:M});y(e.forms),F(e.totalCount)}catch(e){x(h(e))}finally{C(!1)}},[O,A,M]);(0,o.useEffect)(()=>{I()},[I]);let L=(0,o.useMemo)(()=>m.map(e=>({...e,key:e.id,status:e.currentVersionId?`PUBLISHED`:`DRAFT`,updatedAt:n.t(e.updatedAt)})),[m]),R=(0,o.useMemo)(()=>[{dataIndex:`name`,key:`name`,title:`表單名稱`,width:220},{key:`status`,render:e=>(0,c.jsx)(g,{status:e.status}),title:`狀態`,width:120},{key:`currentVersionId`,render:e=>(0,c.jsx)(v,{record:e}),title:`目前版本`,width:220}],[]),z=(0,o.useMemo)(()=>({render:t=>[{name:`編輯`,onClick:()=>e.push(i.formBuilder(t.id))}],variant:`base-secondary`,width:88}),[e]);async function B(t){D(!0),x(null);try{let n=await(0,d.createFormDefinition)(t);T(!1),e.push(i.formBuilder(n))}finally{D(!1)}}return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(s.PageHeader,{children:(0,c.jsx)(l.default,{description:`建立表單定義、管理草稿與已發布版本,提供流程模板綁定使用。`,title:`表單設計`,children:(0,c.jsx)(s.Button,{disabled:E,icon:u.PlusIcon,iconType:`leading`,onClick:()=>T(!0),variant:`base-primary`,children:`建立表單`})})}),(0,c.jsx)(s.SectionGroup,{children:(0,c.jsxs)(s.Section,{tab:(0,c.jsx)(s.Tab,{activeKey:M,onChange:e=>{N(_(e)),k(1)},children:p.map(e=>(0,c.jsx)(s.TabItem,{children:e.label},e.key))}),children:[b?(0,c.jsx)(s.Typography,{color:`text-error`,variant:`body`,children:b}):null,(0,c.jsx)(s.Table,{columns:R,actions:z,dataSource:L,fullWidth:!0,loading:S,pagination:{current:O,onChange:e=>{k(e)},onChangePageSize:e=>{k(1),j(e)},pageSize:A,pageSizeLabel:`每頁筆數`,pageSizeOptions:f,renderResultSummary:(e,t,n)=>`顯示 ${e}-${t} 筆,共 ${n} 筆`,showPageSizeOptions:!0,total:P}})]})})]}),(0,c.jsx)(a.t,{confirmText:`建立`,initialName:``,loading:E,onClose:()=>T(!1),onSubmit:B,open:w,title:`建立表單`})]})}function h(e){return e instanceof Error?e.message:`發生未知錯誤`}function g({status:e}){return e===`PUBLISHED`?(0,c.jsx)(s.Badge,{size:`sub`,text:`已發布`,variant:`dot-success`}):(0,c.jsx)(s.Badge,{size:`sub`,text:`草稿`,variant:`dot-warning`})}function _(e){return e===`PUBLISHED`||e===`DRAFT`?e:`ALL`}function v({record:e}){if(!e.currentVersionId||!e.currentVersionNumber)return(0,c.jsx)(s.Typography,{variant:`body`,children:`尚未發布`});let t=e.currentVersionPublishedAt??e.currentVersionCreatedAt;return(0,c.jsxs)(s.Typography,{variant:`body`,children:[`v`,e.currentVersionNumber,t?` · ${n.t(t)}`:``]})}exports.FormRenderer=i.t,exports.FormRendererView=i.t,exports.FormsView=m;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/views/forms/FormsView.tsx"],"sourcesContent":["'use client';\n\nimport type { Key, ReactElement } from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n PageHeader,\n Section,\n SectionGroup,\n Tab,\n TabItem,\n Table,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { formatDateTime } from '../../lib/format-date-time';\nimport { AppLayout } from '../../components/app-navigation';\nimport {\n createFormDefinition,\n FormDefinitionListStatus,\n FormDefinitionRecord,\n listFormDefinitionsPage,\n} from '@rytass/bpm-core-client/form';\nimport { useRouterAdapter } from '../../lib/router-adapter';\nimport { useBPMRoutes } from '../../lib/routes-config';\nimport { FormNameModal } from './form-name-modal';\n\nconst FORM_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst FORM_STATUS_TABS: readonly {\n readonly key: FormStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'PUBLISHED', label: '已發布' },\n { key: 'DRAFT', label: '草稿' },\n];\n\ntype FormDefinitionRow = Readonly<\n Record<string, unknown> &\n FormDefinitionRecord & {\n key: string;\n status: FormDefinitionListStatus;\n }\n>;\n\ntype FormStatusTabKey = 'ALL' | FormDefinitionListStatus;\n\nexport interface FormsViewProps {}\n\nexport function FormsView(_props: FormsViewProps = {}): ReactElement {\n const router = useRouterAdapter();\n const routes = useBPMRoutes();\n const [forms, setForms] = useState<readonly FormDefinitionRecord[]>([]);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [createModalOpen, setCreateModalOpen] = useState(false);\n const [creating, setCreating] = useState(false);\n const [formPage, setFormPage] = useState(1);\n const [formPageSize, setFormPageSize] = useState(10);\n const [formStatus, setFormStatus] = useState<FormStatusTabKey>('ALL');\n const [formTotalCount, setFormTotalCount] = useState(0);\n\n const refreshForms = useCallback(async (): Promise<void> => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await listFormDefinitionsPage({\n page: formPage,\n pageSize: formPageSize,\n status: formStatus === 'ALL' ? null : formStatus,\n });\n\n setForms(result.forms);\n setFormTotalCount(result.totalCount);\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, [formPage, formPageSize, formStatus]);\n\n useEffect((): void => {\n void refreshForms();\n }, [refreshForms]);\n\n const rows = useMemo(\n (): FormDefinitionRow[] =>\n forms.map((form) => ({\n ...form,\n key: form.id,\n status: form.currentVersionId ? 'PUBLISHED' : 'DRAFT',\n updatedAt: formatDateTime(form.updatedAt),\n })),\n [forms],\n );\n const columns = useMemo(\n (): TableColumn<FormDefinitionRow>[] => [\n { dataIndex: 'name', key: 'name', title: '表單名稱', width: 220 },\n {\n key: 'status',\n render: (record: FormDefinitionRow): ReactElement => (\n <FormStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n {\n key: 'currentVersionId',\n render: (record: FormDefinitionRow): ReactElement => (\n <CurrentVersionLabel record={record} />\n ),\n title: '目前版本',\n width: 220,\n },\n ],\n [],\n );\n const tableActions = useMemo(\n (): TableActions<FormDefinitionRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<FormDefinitionRow>['render']> => [\n {\n name: '編輯',\n onClick: (): void => router.push(routes.formBuilder(record.id)),\n },\n ],\n variant: 'base-secondary',\n width: 88,\n }),\n [router],\n );\n\n async function handleCreateForm(name: string): Promise<void> {\n setCreating(true);\n setError(null);\n\n try {\n const formId = await createFormDefinition(name);\n setCreateModalOpen(false);\n router.push(routes.formBuilder(formId));\n } finally {\n setCreating(false);\n }\n }\n\n return (\n <>\n <AppLayout activeHref={routes.forms()}>\n <PageHeader>\n <ContentHeader\n description=\"建立表單定義、管理草稿與已發布版本,提供流程模板綁定使用。\"\n title=\"表單設計\"\n >\n <Button\n disabled={creating}\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void => setCreateModalOpen(true)}\n variant=\"base-primary\"\n >\n 建立表單\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n tab={\n <Tab\n activeKey={formStatus}\n onChange={(activeKey): void => {\n setFormStatus(readFormStatusTabKey(activeKey));\n setFormPage(1);\n }}\n >\n {FORM_STATUS_TABS.map((statusTab) => (\n <TabItem key={statusTab.key}>{statusTab.label}</TabItem>\n ))}\n </Tab>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <Table\n columns={columns}\n actions={tableActions}\n dataSource={rows}\n fullWidth\n loading={loading}\n pagination={{\n current: formPage,\n onChange: (page): void => {\n setFormPage(page);\n },\n onChangePageSize: (pageSize): void => {\n setFormPage(1);\n setFormPageSize(pageSize);\n },\n pageSize: formPageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: FORM_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: formTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n </AppLayout>\n\n <FormNameModal\n confirmText=\"建立\"\n initialName=\"\"\n loading={creating}\n onClose={(): void => setCreateModalOpen(false)}\n onSubmit={handleCreateForm}\n open={createModalOpen}\n title=\"建立表單\"\n />\n </>\n );\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction FormStatusBadge({\n status,\n}: {\n readonly status: FormDefinitionListStatus;\n}): ReactElement {\n if (status === 'PUBLISHED') {\n return <Badge size=\"sub\" text=\"已發布\" variant=\"dot-success\" />;\n }\n\n return <Badge size=\"sub\" text=\"草稿\" variant=\"dot-warning\" />;\n}\n\nfunction readFormStatusTabKey(activeKey: Key): FormStatusTabKey {\n if (activeKey === 'PUBLISHED' || activeKey === 'DRAFT') {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction CurrentVersionLabel({\n record,\n}: {\n readonly record: FormDefinitionRow;\n}): ReactElement {\n if (!record.currentVersionId || !record.currentVersionNumber) {\n return <Typography variant=\"body\">尚未發布</Typography>;\n }\n\n const versionTime =\n record.currentVersionPublishedAt ?? record.currentVersionCreatedAt;\n\n return (\n <Typography variant=\"body\">\n v{record.currentVersionNumber}\n {versionTime ? ` · ${formatDateTime(versionTime)}` : ''}\n </Typography>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/views/forms/FormsView.tsx"],"sourcesContent":["'use client';\n\nimport type { Key, ReactElement } from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n PageHeader,\n Section,\n SectionGroup,\n Tab,\n TabItem,\n Table,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { formatDateTime } from '../../lib/format-date-time';\nimport {\n createFormDefinition,\n FormDefinitionListStatus,\n FormDefinitionRecord,\n listFormDefinitionsPage,\n} from '@rytass/bpm-core-client/form';\nimport { useRouterAdapter } from '../../lib/router-adapter';\nimport { useBPMRoutes } from '../../lib/routes-config';\nimport { FormNameModal } from './form-name-modal';\n\nconst FORM_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst FORM_STATUS_TABS: readonly {\n readonly key: FormStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'PUBLISHED', label: '已發布' },\n { key: 'DRAFT', label: '草稿' },\n];\n\ntype FormDefinitionRow = Readonly<\n Record<string, unknown> &\n FormDefinitionRecord & {\n key: string;\n status: FormDefinitionListStatus;\n }\n>;\n\ntype FormStatusTabKey = 'ALL' | FormDefinitionListStatus;\n\n\nexport function FormsView(): ReactElement {\n const router = useRouterAdapter();\n const routes = useBPMRoutes();\n const [forms, setForms] = useState<readonly FormDefinitionRecord[]>([]);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [createModalOpen, setCreateModalOpen] = useState(false);\n const [creating, setCreating] = useState(false);\n const [formPage, setFormPage] = useState(1);\n const [formPageSize, setFormPageSize] = useState(10);\n const [formStatus, setFormStatus] = useState<FormStatusTabKey>('ALL');\n const [formTotalCount, setFormTotalCount] = useState(0);\n\n const refreshForms = useCallback(async (): Promise<void> => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await listFormDefinitionsPage({\n page: formPage,\n pageSize: formPageSize,\n status: formStatus === 'ALL' ? null : formStatus,\n });\n\n setForms(result.forms);\n setFormTotalCount(result.totalCount);\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, [formPage, formPageSize, formStatus]);\n\n useEffect((): void => {\n void refreshForms();\n }, [refreshForms]);\n\n const rows = useMemo(\n (): FormDefinitionRow[] =>\n forms.map((form) => ({\n ...form,\n key: form.id,\n status: form.currentVersionId ? 'PUBLISHED' : 'DRAFT',\n updatedAt: formatDateTime(form.updatedAt),\n })),\n [forms],\n );\n const columns = useMemo(\n (): TableColumn<FormDefinitionRow>[] => [\n { dataIndex: 'name', key: 'name', title: '表單名稱', width: 220 },\n {\n key: 'status',\n render: (record: FormDefinitionRow): ReactElement => (\n <FormStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n {\n key: 'currentVersionId',\n render: (record: FormDefinitionRow): ReactElement => (\n <CurrentVersionLabel record={record} />\n ),\n title: '目前版本',\n width: 220,\n },\n ],\n [],\n );\n const tableActions = useMemo(\n (): TableActions<FormDefinitionRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<FormDefinitionRow>['render']> => [\n {\n name: '編輯',\n onClick: (): void => router.push(routes.formBuilder(record.id)),\n },\n ],\n variant: 'base-secondary',\n width: 88,\n }),\n [router],\n );\n\n async function handleCreateForm(name: string): Promise<void> {\n setCreating(true);\n setError(null);\n\n try {\n const formId = await createFormDefinition(name);\n setCreateModalOpen(false);\n router.push(routes.formBuilder(formId));\n } finally {\n setCreating(false);\n }\n }\n\n return (\n <>\n <>\n <PageHeader>\n <ContentHeader\n description=\"建立表單定義、管理草稿與已發布版本,提供流程模板綁定使用。\"\n title=\"表單設計\"\n >\n <Button\n disabled={creating}\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void => setCreateModalOpen(true)}\n variant=\"base-primary\"\n >\n 建立表單\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n tab={\n <Tab\n activeKey={formStatus}\n onChange={(activeKey): void => {\n setFormStatus(readFormStatusTabKey(activeKey));\n setFormPage(1);\n }}\n >\n {FORM_STATUS_TABS.map((statusTab) => (\n <TabItem key={statusTab.key}>{statusTab.label}</TabItem>\n ))}\n </Tab>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <Table\n columns={columns}\n actions={tableActions}\n dataSource={rows}\n fullWidth\n loading={loading}\n pagination={{\n current: formPage,\n onChange: (page): void => {\n setFormPage(page);\n },\n onChangePageSize: (pageSize): void => {\n setFormPage(1);\n setFormPageSize(pageSize);\n },\n pageSize: formPageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: FORM_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: formTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n </>\n\n <FormNameModal\n confirmText=\"建立\"\n initialName=\"\"\n loading={creating}\n onClose={(): void => setCreateModalOpen(false)}\n onSubmit={handleCreateForm}\n open={createModalOpen}\n title=\"建立表單\"\n />\n </>\n );\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction FormStatusBadge({\n status,\n}: {\n readonly status: FormDefinitionListStatus;\n}): ReactElement {\n if (status === 'PUBLISHED') {\n return <Badge size=\"sub\" text=\"已發布\" variant=\"dot-success\" />;\n }\n\n return <Badge size=\"sub\" text=\"草稿\" variant=\"dot-warning\" />;\n}\n\nfunction readFormStatusTabKey(activeKey: Key): FormStatusTabKey {\n if (activeKey === 'PUBLISHED' || activeKey === 'DRAFT') {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction CurrentVersionLabel({\n record,\n}: {\n readonly record: FormDefinitionRow;\n}): ReactElement {\n if (!record.currentVersionId || !record.currentVersionNumber) {\n return <Typography variant=\"body\">尚未發布</Typography>;\n }\n\n const versionTime =\n record.currentVersionPublishedAt ?? record.currentVersionCreatedAt;\n\n return (\n <Typography variant=\"body\">\n v{record.currentVersionNumber}\n {versionTime ? ` · ${formatDateTime(versionTime)}` : ''}\n </Typography>\n );\n}\n"],"mappings":"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"}