@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.
Files changed (437) hide show
  1. package/README.md +13 -1
  2. package/dist/chunks/app-navigation-C_mbz7jx.cjs +2 -0
  3. package/dist/chunks/app-navigation-C_mbz7jx.cjs.map +1 -0
  4. package/dist/chunks/{app-navigation-CATITRM7.js → app-navigation-uwbNEw9P.js} +66 -67
  5. package/dist/chunks/app-navigation-uwbNEw9P.js.map +1 -0
  6. package/dist/chunks/approval-instance-list-page-Mo6wpDPb.cjs +2 -0
  7. package/dist/chunks/approval-instance-list-page-Mo6wpDPb.cjs.map +1 -0
  8. package/dist/chunks/approval-instance-list-page-nmzMrj0b.js +281 -0
  9. package/dist/chunks/approval-instance-list-page-nmzMrj0b.js.map +1 -0
  10. package/dist/chunks/auth-provider-BV8Iiwfb.cjs +2 -0
  11. package/dist/chunks/auth-provider-BV8Iiwfb.cjs.map +1 -0
  12. package/dist/chunks/auth-provider-Bnox5gsx.js +98 -0
  13. package/dist/chunks/auth-provider-Bnox5gsx.js.map +1 -0
  14. package/dist/chunks/builder-DPhAH381.cjs +3 -0
  15. package/dist/chunks/builder-DPhAH381.cjs.map +1 -0
  16. package/dist/chunks/{FormBuilderView-CvChAvgD.js → builder-DqZskyXC.js} +334 -331
  17. package/dist/chunks/builder-DqZskyXC.js.map +1 -0
  18. package/dist/chunks/categories-DEijUOnw.cjs +2 -0
  19. package/dist/chunks/categories-DEijUOnw.cjs.map +1 -0
  20. package/dist/chunks/categories-DTEl182t.js +386 -0
  21. package/dist/chunks/categories-DTEl182t.js.map +1 -0
  22. package/dist/chunks/dashboard-page-DCmuB0Rw.cjs +2 -0
  23. package/dist/chunks/dashboard-page-DCmuB0Rw.cjs.map +1 -0
  24. package/dist/chunks/dashboard-page-Dx5PeEeN.js +117 -0
  25. package/dist/chunks/dashboard-page-Dx5PeEeN.js.map +1 -0
  26. package/dist/chunks/delegations-C-ZrwzvU.js +572 -0
  27. package/dist/chunks/delegations-C-ZrwzvU.js.map +1 -0
  28. package/dist/chunks/delegations-C5PzZ5Kn.js +645 -0
  29. package/dist/chunks/delegations-C5PzZ5Kn.js.map +1 -0
  30. package/dist/chunks/delegations-DOGDvybX.cjs +2 -0
  31. package/dist/chunks/delegations-DOGDvybX.cjs.map +1 -0
  32. package/dist/chunks/delegations-DkDBWOQ7.cjs +2 -0
  33. package/dist/chunks/delegations-DkDBWOQ7.cjs.map +1 -0
  34. package/dist/chunks/detail-B2gcOPkd.cjs +2 -0
  35. package/dist/chunks/detail-B2gcOPkd.cjs.map +1 -0
  36. package/dist/chunks/{InstanceDetailView-C-A-LOCG.js → detail-CfFyU5zC.js} +670 -667
  37. package/dist/chunks/detail-CfFyU5zC.js.map +1 -0
  38. package/dist/chunks/{format-date-time-BQyH5U8z.cjs → format-date-time-isOa3e9q.cjs} +2 -2
  39. package/dist/chunks/{format-date-time-BQyH5U8z.cjs.map → format-date-time-isOa3e9q.cjs.map} +1 -1
  40. package/dist/chunks/{LoginView-a1iu3cfc.js → login-C20yVxbc.js} +9 -9
  41. package/dist/chunks/login-C20yVxbc.js.map +1 -0
  42. package/dist/chunks/login-CQ9MfwcC.cjs +2 -0
  43. package/dist/chunks/login-CQ9MfwcC.cjs.map +1 -0
  44. package/dist/chunks/notifications-CPQ-nVar.cjs +2 -0
  45. package/dist/chunks/notifications-CPQ-nVar.cjs.map +1 -0
  46. package/dist/chunks/notifications-DweexUVy.js +197 -0
  47. package/dist/chunks/notifications-DweexUVy.js.map +1 -0
  48. package/dist/chunks/orgs-DgZ0DQ3-.cjs +2 -0
  49. package/dist/chunks/orgs-DgZ0DQ3-.cjs.map +1 -0
  50. package/dist/chunks/{AdminOrgsView-DZaVAbaQ.js → orgs-xrdhb3hS.js} +669 -666
  51. package/dist/chunks/orgs-xrdhb3hS.js.map +1 -0
  52. package/dist/chunks/templates-PK_VYvcy.js +383 -0
  53. package/dist/chunks/templates-PK_VYvcy.js.map +1 -0
  54. package/dist/chunks/templates-x1OJZmsG.cjs +2 -0
  55. package/dist/chunks/templates-x1OJZmsG.cjs.map +1 -0
  56. package/dist/chunks/users-CY4-NK3j.js +218 -0
  57. package/dist/chunks/users-CY4-NK3j.js.map +1 -0
  58. package/dist/chunks/users-DHnu_056.cjs +2 -0
  59. package/dist/chunks/users-DHnu_056.cjs.map +1 -0
  60. package/dist/components/app-navigation.d.ts +17 -10
  61. package/dist/index.cjs +1 -1
  62. package/dist/index.cjs.map +1 -1
  63. package/dist/index.js +12 -13
  64. package/dist/index.js.map +1 -1
  65. package/dist/lib/notification-drawer-provider.d.ts +1 -1
  66. package/dist/lib/notification-unread-provider.d.ts +1 -1
  67. package/dist/lib/providers.d.ts +1 -1
  68. package/dist/next/BPMNextProviders.d.ts +6 -0
  69. package/dist/next/index.cjs +2 -0
  70. package/dist/next/index.cjs.map +1 -0
  71. package/dist/next/index.d.ts +1 -0
  72. package/dist/next/index.js +33 -0
  73. package/dist/next/index.js.map +1 -0
  74. package/dist/pages/admin/delegations/index.cjs +1 -1
  75. package/dist/pages/admin/delegations/index.cjs.map +1 -1
  76. package/dist/pages/admin/delegations/index.js +1 -1
  77. package/dist/pages/admin/delegations/index.js.map +1 -1
  78. package/dist/pages/admin/orgs/index.cjs +1 -1
  79. package/dist/pages/admin/orgs/index.cjs.map +1 -1
  80. package/dist/pages/admin/orgs/index.js +1 -1
  81. package/dist/pages/admin/orgs/index.js.map +1 -1
  82. package/dist/pages/admin/users/index.cjs +1 -1
  83. package/dist/pages/admin/users/index.cjs.map +1 -1
  84. package/dist/pages/admin/users/index.js +1 -1
  85. package/dist/pages/admin/users/index.js.map +1 -1
  86. package/dist/pages/cc/index.cjs +1 -1
  87. package/dist/pages/cc/index.cjs.map +1 -1
  88. package/dist/pages/cc/index.js +1 -1
  89. package/dist/pages/cc/index.js.map +1 -1
  90. package/dist/pages/dashboard/index.cjs +1 -1
  91. package/dist/pages/dashboard/index.cjs.map +1 -1
  92. package/dist/pages/dashboard/index.js +1 -1
  93. package/dist/pages/dashboard/index.js.map +1 -1
  94. package/dist/pages/delegations/index.cjs +1 -1
  95. package/dist/pages/delegations/index.cjs.map +1 -1
  96. package/dist/pages/delegations/index.js +1 -1
  97. package/dist/pages/delegations/index.js.map +1 -1
  98. package/dist/pages/forms/builder/index.cjs +1 -1
  99. package/dist/pages/forms/builder/index.cjs.map +1 -1
  100. package/dist/pages/forms/builder/index.d.ts +5 -7
  101. package/dist/pages/forms/builder/index.js +1 -1
  102. package/dist/pages/forms/builder/index.js.map +1 -1
  103. package/dist/pages/forms/index.cjs +1 -1
  104. package/dist/pages/forms/index.cjs.map +1 -1
  105. package/dist/pages/forms/index.js +1 -1
  106. package/dist/pages/forms/index.js.map +1 -1
  107. package/dist/pages/inbox/index.cjs +1 -1
  108. package/dist/pages/inbox/index.cjs.map +1 -1
  109. package/dist/pages/inbox/index.js +1 -1
  110. package/dist/pages/inbox/index.js.map +1 -1
  111. package/dist/pages/instances/detail/index.cjs +1 -1
  112. package/dist/pages/instances/detail/index.cjs.map +1 -1
  113. package/dist/pages/instances/detail/index.d.ts +1 -1
  114. package/dist/pages/instances/detail/index.js +1 -1
  115. package/dist/pages/instances/detail/index.js.map +1 -1
  116. package/dist/pages/instances/new/index.cjs +1 -1
  117. package/dist/pages/instances/new/index.cjs.map +1 -1
  118. package/dist/pages/instances/new/index.d.ts +5 -1
  119. package/dist/pages/instances/new/index.js +4 -3
  120. package/dist/pages/instances/new/index.js.map +1 -1
  121. package/dist/pages/login/index.cjs +1 -1
  122. package/dist/pages/login/index.cjs.map +1 -1
  123. package/dist/pages/login/index.d.ts +5 -1
  124. package/dist/pages/login/index.js +4 -3
  125. package/dist/pages/login/index.js.map +1 -1
  126. package/dist/pages/root/index.cjs +1 -1
  127. package/dist/pages/root/index.cjs.map +1 -1
  128. package/dist/pages/root/index.d.ts +7 -5
  129. package/dist/pages/root/index.js +5 -6
  130. package/dist/pages/root/index.js.map +1 -1
  131. package/dist/pages/search/index.cjs +1 -1
  132. package/dist/pages/search/index.cjs.map +1 -1
  133. package/dist/pages/search/index.js +1 -1
  134. package/dist/pages/search/index.js.map +1 -1
  135. package/dist/pages/sent/index.cjs +1 -1
  136. package/dist/pages/sent/index.cjs.map +1 -1
  137. package/dist/pages/sent/index.js +1 -1
  138. package/dist/pages/sent/index.js.map +1 -1
  139. package/dist/pages/settings/notifications/index.cjs +1 -1
  140. package/dist/pages/settings/notifications/index.cjs.map +1 -1
  141. package/dist/pages/settings/notifications/index.js +1 -1
  142. package/dist/pages/settings/notifications/index.js.map +1 -1
  143. package/dist/pages/templates/categories/index.cjs +1 -1
  144. package/dist/pages/templates/categories/index.cjs.map +1 -1
  145. package/dist/pages/templates/categories/index.js +1 -1
  146. package/dist/pages/templates/categories/index.js.map +1 -1
  147. package/dist/pages/templates/designer/index.cjs +1 -1
  148. package/dist/pages/templates/designer/index.cjs.map +1 -1
  149. package/dist/pages/templates/designer/index.d.ts +2 -4
  150. package/dist/pages/templates/designer/index.js +1 -1
  151. package/dist/pages/templates/designer/index.js.map +1 -1
  152. package/dist/pages/templates/index.cjs +1 -1
  153. package/dist/pages/templates/index.cjs.map +1 -1
  154. package/dist/pages/templates/index.js +1 -1
  155. package/dist/pages/templates/index.js.map +1 -1
  156. package/dist/pages/templates/versions/index.cjs +1 -1
  157. package/dist/pages/templates/versions/index.cjs.map +1 -1
  158. package/dist/pages/templates/versions/index.d.ts +2 -4
  159. package/dist/pages/templates/versions/index.js +1 -1
  160. package/dist/pages/templates/versions/index.js.map +1 -1
  161. package/dist/views/admin/delegations/index.cjs +1 -1
  162. package/dist/views/admin/delegations/index.js +1 -1
  163. package/dist/views/admin/index.cjs +1 -0
  164. package/dist/views/admin/index.d.ts +3 -0
  165. package/dist/views/admin/index.js +4 -0
  166. package/dist/views/admin/orgs/index.cjs +1 -1
  167. package/dist/views/admin/orgs/index.js +1 -1
  168. package/dist/views/admin/users/index.cjs +1 -1
  169. package/dist/views/admin/users/index.js +1 -1
  170. package/dist/views/cc/index.cjs +2 -1
  171. package/dist/views/cc/index.cjs.map +1 -0
  172. package/dist/views/cc/index.js +19 -2
  173. package/dist/views/cc/index.js.map +1 -0
  174. package/dist/views/dashboard/index.cjs +2 -1
  175. package/dist/views/dashboard/index.cjs.map +1 -0
  176. package/dist/views/dashboard/index.js +11 -2
  177. package/dist/views/dashboard/index.js.map +1 -0
  178. package/dist/views/delegations/index.cjs +1 -1
  179. package/dist/views/delegations/index.js +1 -1
  180. package/dist/views/forms/builder/index.cjs +1 -1
  181. package/dist/views/forms/builder/index.js +1 -1
  182. package/dist/views/forms/index.cjs +2 -1
  183. package/dist/views/forms/index.cjs.map +1 -0
  184. package/dist/views/forms/index.d.ts +1 -0
  185. package/dist/views/forms/index.js +189 -2
  186. package/dist/views/forms/index.js.map +1 -0
  187. package/dist/views/inbox/index.cjs +2 -1
  188. package/dist/views/inbox/index.cjs.map +1 -0
  189. package/dist/views/inbox/index.js +293 -2
  190. package/dist/views/inbox/index.js.map +1 -0
  191. package/dist/views/instances/detail/index.cjs +1 -1
  192. package/dist/views/instances/detail/index.js +1 -1
  193. package/dist/views/instances/index.cjs +1 -0
  194. package/dist/views/instances/index.d.ts +1 -0
  195. package/dist/views/instances/index.js +2 -0
  196. package/dist/views/instances/new/InstanceNewView.d.ts +3 -3
  197. package/dist/views/instances/new/index.cjs +2 -1
  198. package/dist/views/instances/new/index.cjs.map +1 -0
  199. package/dist/views/instances/new/index.js +195 -2
  200. package/dist/views/instances/new/index.js.map +1 -0
  201. package/dist/views/login/index.cjs +1 -1
  202. package/dist/views/login/index.js +1 -1
  203. package/dist/views/search/index.cjs +2 -1
  204. package/dist/views/search/index.cjs.map +1 -0
  205. package/dist/views/search/index.js +19 -2
  206. package/dist/views/search/index.js.map +1 -0
  207. package/dist/views/sent/index.cjs +2 -1
  208. package/dist/views/sent/index.cjs.map +1 -0
  209. package/dist/views/sent/index.js +19 -2
  210. package/dist/views/sent/index.js.map +1 -0
  211. package/dist/views/settings/index.cjs +1 -0
  212. package/dist/views/settings/index.d.ts +1 -0
  213. package/dist/views/settings/index.js +2 -0
  214. package/dist/views/settings/notifications/index.cjs +1 -1
  215. package/dist/views/settings/notifications/index.js +1 -1
  216. package/dist/views/templates/categories/index.cjs +1 -1
  217. package/dist/views/templates/categories/index.js +1 -1
  218. package/dist/views/templates/designer/index.cjs +51 -1
  219. package/dist/views/templates/designer/index.cjs.map +1 -0
  220. package/dist/views/templates/designer/index.js +2275 -2
  221. package/dist/views/templates/designer/index.js.map +1 -0
  222. package/dist/views/templates/index.cjs +1 -1
  223. package/dist/views/templates/index.d.ts +2 -0
  224. package/dist/views/templates/index.js +4 -2
  225. package/dist/views/templates/versions/index.cjs +2 -1
  226. package/dist/views/templates/versions/index.cjs.map +1 -0
  227. package/dist/views/templates/versions/index.js +113 -2
  228. package/dist/views/templates/versions/index.js.map +1 -0
  229. package/dist/views/workflow/index.cjs +1 -0
  230. package/dist/views/workflow/index.d.ts +4 -0
  231. package/dist/views/workflow/index.js +5 -0
  232. package/package.json +28 -3
  233. package/dist/chunks/AdminDelegationsView-CqNmlVWx.cjs +0 -2
  234. package/dist/chunks/AdminDelegationsView-CqNmlVWx.cjs.map +0 -1
  235. package/dist/chunks/AdminDelegationsView-DydMZ9ED.js +0 -642
  236. package/dist/chunks/AdminDelegationsView-DydMZ9ED.js.map +0 -1
  237. package/dist/chunks/AdminOrgsView-DZaVAbaQ.js.map +0 -1
  238. package/dist/chunks/AdminOrgsView-bSsIyMvk.cjs +0 -2
  239. package/dist/chunks/AdminOrgsView-bSsIyMvk.cjs.map +0 -1
  240. package/dist/chunks/AdminUsersView-C0oO05Br.js +0 -215
  241. package/dist/chunks/AdminUsersView-C0oO05Br.js.map +0 -1
  242. package/dist/chunks/AdminUsersView-DlArLlIr.cjs +0 -2
  243. package/dist/chunks/AdminUsersView-DlArLlIr.cjs.map +0 -1
  244. package/dist/chunks/CcView-BsVsya5F.cjs +0 -2
  245. package/dist/chunks/CcView-BsVsya5F.cjs.map +0 -1
  246. package/dist/chunks/CcView-Bv0GzA5C.js +0 -19
  247. package/dist/chunks/CcView-Bv0GzA5C.js.map +0 -1
  248. package/dist/chunks/DashboardView-Dk1ZQmmk.js +0 -11
  249. package/dist/chunks/DashboardView-Dk1ZQmmk.js.map +0 -1
  250. package/dist/chunks/DashboardView-_0zh-rxT.cjs +0 -2
  251. package/dist/chunks/DashboardView-_0zh-rxT.cjs.map +0 -1
  252. package/dist/chunks/DelegationsView-DQUqOUV5.js +0 -569
  253. package/dist/chunks/DelegationsView-DQUqOUV5.js.map +0 -1
  254. package/dist/chunks/DelegationsView-pKeFV2LN.cjs +0 -2
  255. package/dist/chunks/DelegationsView-pKeFV2LN.cjs.map +0 -1
  256. package/dist/chunks/FormBuilderView-BKtyW55e.cjs +0 -3
  257. package/dist/chunks/FormBuilderView-BKtyW55e.cjs.map +0 -1
  258. package/dist/chunks/FormBuilderView-CvChAvgD.js.map +0 -1
  259. package/dist/chunks/FormsView-DYEuik8W.js +0 -185
  260. package/dist/chunks/FormsView-DYEuik8W.js.map +0 -1
  261. package/dist/chunks/FormsView-RjJEkIfZ.cjs +0 -2
  262. package/dist/chunks/FormsView-RjJEkIfZ.cjs.map +0 -1
  263. package/dist/chunks/InboxView-DDWwmWhA.cjs +0 -2
  264. package/dist/chunks/InboxView-DDWwmWhA.cjs.map +0 -1
  265. package/dist/chunks/InboxView-YSoyrYLk.js +0 -291
  266. package/dist/chunks/InboxView-YSoyrYLk.js.map +0 -1
  267. package/dist/chunks/InstanceDetailView-C-A-LOCG.js.map +0 -1
  268. package/dist/chunks/InstanceDetailView-l_kNDCz2.cjs +0 -2
  269. package/dist/chunks/InstanceDetailView-l_kNDCz2.cjs.map +0 -1
  270. package/dist/chunks/InstanceNewView-B5hz-FWd.js +0 -190
  271. package/dist/chunks/InstanceNewView-B5hz-FWd.js.map +0 -1
  272. package/dist/chunks/InstanceNewView-CdCsxQIu.cjs +0 -2
  273. package/dist/chunks/InstanceNewView-CdCsxQIu.cjs.map +0 -1
  274. package/dist/chunks/LoginView-BED07v-7.cjs +0 -2
  275. package/dist/chunks/LoginView-BED07v-7.cjs.map +0 -1
  276. package/dist/chunks/LoginView-a1iu3cfc.js.map +0 -1
  277. package/dist/chunks/RootClientView-rXJt4TDd.cjs +0 -2
  278. package/dist/chunks/RootClientView-rXJt4TDd.cjs.map +0 -1
  279. package/dist/chunks/RootClientView-wAkXUEZw.js +0 -34
  280. package/dist/chunks/RootClientView-wAkXUEZw.js.map +0 -1
  281. package/dist/chunks/SearchView-CgXPssgE.cjs +0 -2
  282. package/dist/chunks/SearchView-CgXPssgE.cjs.map +0 -1
  283. package/dist/chunks/SearchView-WXMbZwRw.js +0 -19
  284. package/dist/chunks/SearchView-WXMbZwRw.js.map +0 -1
  285. package/dist/chunks/SentView-BTDoFBrG.cjs +0 -2
  286. package/dist/chunks/SentView-BTDoFBrG.cjs.map +0 -1
  287. package/dist/chunks/SentView-CdOL92Rq.js +0 -19
  288. package/dist/chunks/SentView-CdOL92Rq.js.map +0 -1
  289. package/dist/chunks/SettingsNotificationsView-B6F6fa7U.js +0 -194
  290. package/dist/chunks/SettingsNotificationsView-B6F6fa7U.js.map +0 -1
  291. package/dist/chunks/SettingsNotificationsView-Bnz0CmoJ.cjs +0 -2
  292. package/dist/chunks/SettingsNotificationsView-Bnz0CmoJ.cjs.map +0 -1
  293. package/dist/chunks/TemplateCategoriesView-CgZciaSd.js +0 -382
  294. package/dist/chunks/TemplateCategoriesView-CgZciaSd.js.map +0 -1
  295. package/dist/chunks/TemplateCategoriesView-U0stGUBc.cjs +0 -2
  296. package/dist/chunks/TemplateCategoriesView-U0stGUBc.cjs.map +0 -1
  297. package/dist/chunks/TemplateDesignerView-A38DyYD4.cjs +0 -51
  298. package/dist/chunks/TemplateDesignerView-A38DyYD4.cjs.map +0 -1
  299. package/dist/chunks/TemplateDesignerView-Dffx-VZ-.js +0 -2272
  300. package/dist/chunks/TemplateDesignerView-Dffx-VZ-.js.map +0 -1
  301. package/dist/chunks/TemplateVersionsView-6sVQbBem.js +0 -110
  302. package/dist/chunks/TemplateVersionsView-6sVQbBem.js.map +0 -1
  303. package/dist/chunks/TemplateVersionsView-CMqw3ieU.cjs +0 -2
  304. package/dist/chunks/TemplateVersionsView-CMqw3ieU.cjs.map +0 -1
  305. package/dist/chunks/TemplatesView-BLj9f-XI.js +0 -380
  306. package/dist/chunks/TemplatesView-BLj9f-XI.js.map +0 -1
  307. package/dist/chunks/TemplatesView-DIOQTUUl.cjs +0 -2
  308. package/dist/chunks/TemplatesView-DIOQTUUl.cjs.map +0 -1
  309. package/dist/chunks/app-navigation-CATITRM7.js.map +0 -1
  310. package/dist/chunks/app-navigation-DAC5gFbG.cjs +0 -2
  311. package/dist/chunks/app-navigation-DAC5gFbG.cjs.map +0 -1
  312. package/dist/chunks/approval-instance-list-page-B6vAGvOb.js +0 -278
  313. package/dist/chunks/approval-instance-list-page-B6vAGvOb.js.map +0 -1
  314. package/dist/chunks/approval-instance-list-page-DIAmwhvl.cjs +0 -2
  315. package/dist/chunks/approval-instance-list-page-DIAmwhvl.cjs.map +0 -1
  316. package/dist/chunks/auth-provider-D2P-qWmY.cjs +0 -2
  317. package/dist/chunks/auth-provider-D2P-qWmY.cjs.map +0 -1
  318. package/dist/chunks/auth-provider-TTO9eNZV.js +0 -83
  319. package/dist/chunks/auth-provider-TTO9eNZV.js.map +0 -1
  320. package/dist/chunks/dashboard-page-BsW8t104.js +0 -115
  321. package/dist/chunks/dashboard-page-BsW8t104.js.map +0 -1
  322. package/dist/chunks/dashboard-page-udYhnyMW.cjs +0 -2
  323. package/dist/chunks/dashboard-page-udYhnyMW.cjs.map +0 -1
  324. package/dist/chunks/router-adapter-BdHZXLS3.js +0 -23
  325. package/dist/chunks/router-adapter-BdHZXLS3.js.map +0 -1
  326. package/dist/chunks/router-adapter-BybHrCNP.cjs +0 -2
  327. package/dist/chunks/router-adapter-BybHrCNP.cjs.map +0 -1
  328. package/dist/chunks/templates.module-B5bg_goX.js +0 -8
  329. package/dist/chunks/templates.module-B5bg_goX.js.map +0 -1
  330. package/dist/chunks/templates.module-ClRnQQX4.cjs +0 -2
  331. package/dist/chunks/templates.module-ClRnQQX4.cjs.map +0 -1
  332. package/dist/pages/admin/delegations/AdminDelegationsClientView.cjs +0 -2
  333. package/dist/pages/admin/delegations/AdminDelegationsClientView.cjs.map +0 -1
  334. package/dist/pages/admin/delegations/AdminDelegationsClientView.d.ts +0 -3
  335. package/dist/pages/admin/delegations/AdminDelegationsClientView.js +0 -28
  336. package/dist/pages/admin/delegations/AdminDelegationsClientView.js.map +0 -1
  337. package/dist/pages/admin/orgs/AdminOrgsClientView.cjs +0 -2
  338. package/dist/pages/admin/orgs/AdminOrgsClientView.cjs.map +0 -1
  339. package/dist/pages/admin/orgs/AdminOrgsClientView.d.ts +0 -3
  340. package/dist/pages/admin/orgs/AdminOrgsClientView.js +0 -28
  341. package/dist/pages/admin/orgs/AdminOrgsClientView.js.map +0 -1
  342. package/dist/pages/admin/users/AdminUsersClientView.cjs +0 -2
  343. package/dist/pages/admin/users/AdminUsersClientView.cjs.map +0 -1
  344. package/dist/pages/admin/users/AdminUsersClientView.d.ts +0 -3
  345. package/dist/pages/admin/users/AdminUsersClientView.js +0 -28
  346. package/dist/pages/admin/users/AdminUsersClientView.js.map +0 -1
  347. package/dist/pages/cc/CcClientView.cjs +0 -2
  348. package/dist/pages/cc/CcClientView.cjs.map +0 -1
  349. package/dist/pages/cc/CcClientView.d.ts +0 -7
  350. package/dist/pages/cc/CcClientView.js +0 -28
  351. package/dist/pages/cc/CcClientView.js.map +0 -1
  352. package/dist/pages/dashboard/DashboardClientView.cjs +0 -2
  353. package/dist/pages/dashboard/DashboardClientView.cjs.map +0 -1
  354. package/dist/pages/dashboard/DashboardClientView.d.ts +0 -9
  355. package/dist/pages/dashboard/DashboardClientView.js +0 -28
  356. package/dist/pages/dashboard/DashboardClientView.js.map +0 -1
  357. package/dist/pages/delegations/DelegationsClientView.cjs +0 -2
  358. package/dist/pages/delegations/DelegationsClientView.cjs.map +0 -1
  359. package/dist/pages/delegations/DelegationsClientView.d.ts +0 -3
  360. package/dist/pages/delegations/DelegationsClientView.js +0 -28
  361. package/dist/pages/delegations/DelegationsClientView.js.map +0 -1
  362. package/dist/pages/forms/FormsClientView.cjs +0 -2
  363. package/dist/pages/forms/FormsClientView.cjs.map +0 -1
  364. package/dist/pages/forms/FormsClientView.d.ts +0 -10
  365. package/dist/pages/forms/FormsClientView.js +0 -28
  366. package/dist/pages/forms/FormsClientView.js.map +0 -1
  367. package/dist/pages/forms/builder/FormBuilderClientView.cjs +0 -2
  368. package/dist/pages/forms/builder/FormBuilderClientView.cjs.map +0 -1
  369. package/dist/pages/forms/builder/FormBuilderClientView.d.ts +0 -11
  370. package/dist/pages/forms/builder/FormBuilderClientView.js +0 -28
  371. package/dist/pages/forms/builder/FormBuilderClientView.js.map +0 -1
  372. package/dist/pages/inbox/InboxClientView.cjs +0 -2
  373. package/dist/pages/inbox/InboxClientView.cjs.map +0 -1
  374. package/dist/pages/inbox/InboxClientView.d.ts +0 -9
  375. package/dist/pages/inbox/InboxClientView.js +0 -28
  376. package/dist/pages/inbox/InboxClientView.js.map +0 -1
  377. package/dist/pages/instances/detail/InstanceDetailClientView.cjs +0 -2
  378. package/dist/pages/instances/detail/InstanceDetailClientView.cjs.map +0 -1
  379. package/dist/pages/instances/detail/InstanceDetailClientView.d.ts +0 -9
  380. package/dist/pages/instances/detail/InstanceDetailClientView.js +0 -28
  381. package/dist/pages/instances/detail/InstanceDetailClientView.js.map +0 -1
  382. package/dist/pages/instances/new/InstanceNewClientView.cjs +0 -2
  383. package/dist/pages/instances/new/InstanceNewClientView.cjs.map +0 -1
  384. package/dist/pages/instances/new/InstanceNewClientView.d.ts +0 -8
  385. package/dist/pages/instances/new/InstanceNewClientView.js +0 -28
  386. package/dist/pages/instances/new/InstanceNewClientView.js.map +0 -1
  387. package/dist/pages/login/LoginClientView.cjs +0 -2
  388. package/dist/pages/login/LoginClientView.cjs.map +0 -1
  389. package/dist/pages/login/LoginClientView.d.ts +0 -11
  390. package/dist/pages/login/LoginClientView.js +0 -29
  391. package/dist/pages/login/LoginClientView.js.map +0 -1
  392. package/dist/pages/root/RootClientView.cjs +0 -1
  393. package/dist/pages/root/RootClientView.d.ts +0 -8
  394. package/dist/pages/root/RootClientView.js +0 -2
  395. package/dist/pages/search/SearchClientView.cjs +0 -2
  396. package/dist/pages/search/SearchClientView.cjs.map +0 -1
  397. package/dist/pages/search/SearchClientView.d.ts +0 -7
  398. package/dist/pages/search/SearchClientView.js +0 -28
  399. package/dist/pages/search/SearchClientView.js.map +0 -1
  400. package/dist/pages/sent/SentClientView.cjs +0 -2
  401. package/dist/pages/sent/SentClientView.cjs.map +0 -1
  402. package/dist/pages/sent/SentClientView.d.ts +0 -7
  403. package/dist/pages/sent/SentClientView.js +0 -28
  404. package/dist/pages/sent/SentClientView.js.map +0 -1
  405. package/dist/pages/settings/notifications/SettingsNotificationsClientView.cjs +0 -2
  406. package/dist/pages/settings/notifications/SettingsNotificationsClientView.cjs.map +0 -1
  407. package/dist/pages/settings/notifications/SettingsNotificationsClientView.d.ts +0 -3
  408. package/dist/pages/settings/notifications/SettingsNotificationsClientView.js +0 -28
  409. package/dist/pages/settings/notifications/SettingsNotificationsClientView.js.map +0 -1
  410. package/dist/pages/templates/TemplatesClientView.cjs +0 -2
  411. package/dist/pages/templates/TemplatesClientView.cjs.map +0 -1
  412. package/dist/pages/templates/TemplatesClientView.d.ts +0 -3
  413. package/dist/pages/templates/TemplatesClientView.js +0 -28
  414. package/dist/pages/templates/TemplatesClientView.js.map +0 -1
  415. package/dist/pages/templates/categories/TemplateCategoriesClientView.cjs +0 -2
  416. package/dist/pages/templates/categories/TemplateCategoriesClientView.cjs.map +0 -1
  417. package/dist/pages/templates/categories/TemplateCategoriesClientView.d.ts +0 -3
  418. package/dist/pages/templates/categories/TemplateCategoriesClientView.js +0 -28
  419. package/dist/pages/templates/categories/TemplateCategoriesClientView.js.map +0 -1
  420. package/dist/pages/templates/designer/TemplateDesignerClientView.cjs +0 -2
  421. package/dist/pages/templates/designer/TemplateDesignerClientView.cjs.map +0 -1
  422. package/dist/pages/templates/designer/TemplateDesignerClientView.d.ts +0 -3
  423. package/dist/pages/templates/designer/TemplateDesignerClientView.js +0 -28
  424. package/dist/pages/templates/designer/TemplateDesignerClientView.js.map +0 -1
  425. package/dist/pages/templates/versions/TemplateVersionsClientView.cjs +0 -2
  426. package/dist/pages/templates/versions/TemplateVersionsClientView.cjs.map +0 -1
  427. package/dist/pages/templates/versions/TemplateVersionsClientView.d.ts +0 -3
  428. package/dist/pages/templates/versions/TemplateVersionsClientView.js +0 -28
  429. package/dist/pages/templates/versions/TemplateVersionsClientView.js.map +0 -1
  430. /package/dist/{templates.css → categories.css} +0 -0
  431. /package/dist/{AdminDelegationsView.css → delegations.css} +0 -0
  432. /package/dist/{DelegationsView.css → delegations2.css} +0 -0
  433. /package/dist/{InstanceDetailView.css → detail.css} +0 -0
  434. /package/dist/{LoginView.css → login.css} +0 -0
  435. /package/dist/{SettingsNotificationsView.css → notifications.css} +0 -0
  436. /package/dist/{AdminOrgsView.css → orgs.css} +0 -0
  437. /package/dist/{AdminUsersView.css → users.css} +0 -0
@@ -1,278 +0,0 @@
1
- "use client";
2
- import { r as e } from "./router-adapter-BdHZXLS3.js";
3
- import { t } from "./format-date-time-CB-LxzqT.js";
4
- import { t as n } from "./app-navigation-CATITRM7.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 l, FormField as u, Input as d, Layout as f, PageHeader as p, Section as m, SectionGroup as ee, Select as te, Table as ne, Typography as h } from "@mezzanine-ui/react";
7
- import { resolveMembers as g } from "@rytass/bpm-core-client";
8
- import { jsx as _, jsxs as v } from "react/jsx-runtime";
9
- import { listApprovalInstancesPage as y, readApprovalInstanceCaseTitle as b } from "@rytass/bpm-core-client/workflow";
10
- import x from "@mezzanine-ui/react/ContentHeader";
11
- import { FormFieldLayout as S } from "@mezzanine-ui/core/form";
12
- import '../approval-instance-list-page.css';var C = { instanceFilterArea: "bpm_instanceFilterArea_qpvJq" }, w = [
13
- 10,
14
- 20,
15
- 50
16
- ], T = [
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 E({ activeHref: b, defaultState: E, description: O, emptyMessage: k, searchPlaceholder: N, title: P, view: F }) {
59
- let I = e(), [L, R] = o(null), [z, B] = o(/* @__PURE__ */ new Map()), [V, H] = o(1), [U, W] = o(10), [G, K] = o(0), [q, J] = o(!0), [Y, oe] = o([]), [X, se] = o(""), [Z, Q] = o(D(E)), $ = r(async () => {
60
- J(!0), R(null);
61
- try {
62
- let e = await y({
63
- page: V,
64
- pageSize: U,
65
- searchText: X,
66
- state: Z.state,
67
- templateId: null,
68
- view: F
69
- });
70
- oe(e.instances.map(re)), K(e.totalCount);
71
- } catch (e) {
72
- R(M(e));
73
- } finally {
74
- J(!1);
75
- }
76
- }, [
77
- V,
78
- U,
79
- X,
80
- Z,
81
- F
82
- ]);
83
- i(() => {
84
- $();
85
- }, [$]), i(() => {
86
- let e = Array.from(new Set(Y.map((e) => e.initiatorMemberId).filter(Boolean)));
87
- if (e.length === 0) {
88
- B(/* @__PURE__ */ new Map());
89
- return;
90
- }
91
- let t = !1;
92
- return (async () => {
93
- try {
94
- let n = await g(e);
95
- if (t) return;
96
- B(new Map(n.map((e) => [e.memberId, e])));
97
- } catch {
98
- if (t) return;
99
- B(/* @__PURE__ */ new Map());
100
- }
101
- })(), () => {
102
- t = !0;
103
- };
104
- }, [Y]);
105
- let ce = a(() => [
106
- {
107
- dataIndex: "caseTitle",
108
- key: "caseTitle",
109
- title: "案件",
110
- width: 300
111
- },
112
- {
113
- key: "state",
114
- render: (e) => /* @__PURE__ */ _(h, {
115
- color: A(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__ */ _(h, {
126
- component: "span",
127
- variant: "body",
128
- children: j(e.initiatorMemberId, z)
129
- }),
130
- title: "發起人",
131
- width: 180
132
- },
133
- {
134
- key: "startedAt",
135
- render: (e) => /* @__PURE__ */ _(h, {
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__ */ _(h, {
146
- component: "span",
147
- variant: "body",
148
- children: t(e.completedAt)
149
- }),
150
- title: "完成時間",
151
- width: 220
152
- }
153
- ], [z]), le = a(() => ({
154
- render: (e) => [{
155
- name: "查看",
156
- onClick: () => I.push(`/instances/${e.id}`)
157
- }],
158
- variant: "base-secondary",
159
- width: 88
160
- }), [I]);
161
- return /* @__PURE__ */ v(f, { children: [/* @__PURE__ */ _(n, { activeHref: b }), /* @__PURE__ */ v(f.Main, { children: [/* @__PURE__ */ _(p, { children: /* @__PURE__ */ _(x, {
162
- description: O,
163
- title: P
164
- }) }), /* @__PURE__ */ _(ee, { children: /* @__PURE__ */ v(m, {
165
- filterArea: /* @__PURE__ */ _(c, {
166
- className: C.instanceFilterArea,
167
- size: "sub",
168
- children: /* @__PURE__ */ v(l, { children: [/* @__PURE__ */ _(s, {
169
- span: 3,
170
- children: /* @__PURE__ */ _(u, {
171
- fullWidth: !0,
172
- layout: S.VERTICAL,
173
- name: "instanceSearchText",
174
- children: /* @__PURE__ */ _(d, {
175
- fullWidth: !0,
176
- onChange: (e) => {
177
- se(e.target.value), H(1);
178
- },
179
- placeholder: N,
180
- size: "sub",
181
- value: X,
182
- variant: "base"
183
- })
184
- })
185
- }), /* @__PURE__ */ _(s, {
186
- span: 2,
187
- children: /* @__PURE__ */ _(u, {
188
- fullWidth: !0,
189
- layout: S.VERTICAL,
190
- name: "instanceState",
191
- children: /* @__PURE__ */ _(te, {
192
- clearable: !1,
193
- fullWidth: !0,
194
- onChange: (e) => {
195
- Q(ie(e)), H(1);
196
- },
197
- options: [...T],
198
- placeholder: "狀態",
199
- renderValue: (e) => `狀態:${ae(e)}`,
200
- size: "sub",
201
- value: Z
202
- })
203
- })
204
- })] })
205
- }),
206
- children: [
207
- L ? /* @__PURE__ */ _(h, {
208
- color: "text-error",
209
- variant: "body",
210
- children: L
211
- }) : null,
212
- !L && !q && Y.length === 0 ? /* @__PURE__ */ _(h, {
213
- color: "text-neutral",
214
- variant: "body",
215
- children: k
216
- }) : null,
217
- /* @__PURE__ */ _(ne, {
218
- actions: le,
219
- columns: ce,
220
- dataSource: [...Y],
221
- fullWidth: !0,
222
- loading: q,
223
- pagination: {
224
- current: V,
225
- onChange: (e) => {
226
- H(e);
227
- },
228
- onChangePageSize: (e) => {
229
- H(1), W(e);
230
- },
231
- pageSize: U,
232
- pageSizeLabel: "每頁筆數",
233
- pageSizeOptions: w,
234
- renderResultSummary: (e, t, n) => `顯示 ${e}-${t} 筆,共 ${n} 筆`,
235
- showPageSizeOptions: !0,
236
- total: G
237
- }
238
- })
239
- ]
240
- }) })] })] });
241
- }
242
- function re(e) {
243
- return {
244
- ...e,
245
- caseTitle: b(e),
246
- key: e.id,
247
- stateLabel: k(e.state)
248
- };
249
- }
250
- function ie(e) {
251
- return O(e) ? D(e.state) : T[0];
252
- }
253
- function D(e) {
254
- return T.find((t) => t.state === e) ?? T[0];
255
- }
256
- function ae(e) {
257
- return O(e) ? e.name : T[0].name;
258
- }
259
- function O(e) {
260
- return typeof e == "object" && !!e && "id" in e && "name" in e && "state" in e;
261
- }
262
- function k(e) {
263
- return e === "RUNNING" ? "進行中" : e === "APPROVED" ? "已通過" : e === "REJECTED" ? "已拒絕" : e === "RETURNED" ? "已退回" : e === "CANCELLED" ? "已取消" : e === "EXPIRED" ? "已逾期" : "草稿";
264
- }
265
- function A(e) {
266
- return e === "APPROVED" ? "text-success" : e === "REJECTED" || e === "CANCELLED" || e === "EXPIRED" ? "text-error" : "text-neutral";
267
- }
268
- function j(e, t) {
269
- let n = (e ?? "").trim();
270
- return n ? t.get(n)?.name ?? n : "未知發起人";
271
- }
272
- function M(e) {
273
- return e instanceof Error ? e.message : "讀取簽核案件失敗。";
274
- }
275
- //#endregion
276
- export { E as t };
277
-
278
- //# sourceMappingURL=approval-instance-list-page-B6vAGvOb.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"approval-instance-list-page-B6vAGvOb.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 Layout,\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 { AppNavigation } 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 <Layout>\n <AppNavigation activeHref={activeHref} />\n\n <Layout.Main>\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 </Layout.Main>\n </Layout>\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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"}
@@ -1,2 +0,0 @@
1
- "use client";require('../approval-instance-list-page.css');const e=require("./app-navigation-DAC5gFbG.cjs"),t=require("./router-adapter-BybHrCNP.cjs"),n=require("./format-date-time-BQyH5U8z.cjs");let r=require("react"),i=require("@mezzanine-ui/react"),a=require("@rytass/bpm-core-client"),o=require("react/jsx-runtime"),s=require("@rytass/bpm-core-client/workflow"),c=require("@mezzanine-ui/react/ContentHeader");c=e.o(c,1);let l=require("@mezzanine-ui/core/form");var u={instanceFilterArea:`bpm_instanceFilterArea_qpvJq`},d=[10,20,50],f=[{id:`ALL`,name:`全部狀態`,state:null},{id:`RUNNING`,name:`進行中`,state:`RUNNING`},{id:`APPROVED`,name:`已通過`,state:`APPROVED`},{id:`REJECTED`,name:`已拒絕`,state:`REJECTED`},{id:`RETURNED`,name:`已退回`,state:`RETURNED`},{id:`CANCELLED`,name:`已取消`,state:`CANCELLED`},{id:`EXPIRED`,name:`已逾期`,state:`EXPIRED`},{id:`DRAFT`,name:`草稿`,state:`DRAFT`}];function p({activeHref:p,defaultState:v,description:y,emptyMessage:C,searchPlaceholder:w,title:T,view:E}){let D=t.r(),[O,k]=(0,r.useState)(null),[A,j]=(0,r.useState)(new Map),[M,N]=(0,r.useState)(1),[P,F]=(0,r.useState)(10),[I,L]=(0,r.useState)(0),[R,z]=(0,r.useState)(!0),[B,V]=(0,r.useState)([]),[H,U]=(0,r.useState)(``),[W,G]=(0,r.useState)(g(v)),K=(0,r.useCallback)(async()=>{z(!0),k(null);try{let e=await(0,s.listApprovalInstancesPage)({page:M,pageSize:P,searchText:H,state:W.state,templateId:null,view:E});V(e.instances.map(m)),L(e.totalCount)}catch(e){k(S(e))}finally{z(!1)}},[M,P,H,W,E]);(0,r.useEffect)(()=>{K()},[K]),(0,r.useEffect)(()=>{let e=Array.from(new Set(B.map(e=>e.initiatorMemberId).filter(Boolean)));if(e.length===0){j(new Map);return}let t=!1;return(async()=>{try{let n=await(0,a.resolveMembers)(e);if(t)return;j(new Map(n.map(e=>[e.memberId,e])))}catch{if(t)return;j(new Map)}})(),()=>{t=!0}},[B]);let q=(0,r.useMemo)(()=>[{dataIndex:`caseTitle`,key:`caseTitle`,title:`案件`,width:300},{key:`state`,render:e=>(0,o.jsx)(i.Typography,{color:b(e.state),component:`span`,variant:`body`,children:e.stateLabel}),title:`狀態`,width:120},{key:`initiatorMemberId`,render:e=>(0,o.jsx)(i.Typography,{component:`span`,variant:`body`,children:x(e.initiatorMemberId,A)}),title:`發起人`,width:180},{key:`startedAt`,render:e=>(0,o.jsx)(i.Typography,{component:`span`,variant:`body`,children:n.t(e.startedAt)}),title:`發起時間`,width:220},{key:`completedAt`,render:e=>(0,o.jsx)(i.Typography,{component:`span`,variant:`body`,children:n.t(e.completedAt)}),title:`完成時間`,width:220}],[A]),J=(0,r.useMemo)(()=>({render:e=>[{name:`查看`,onClick:()=>D.push(`/instances/${e.id}`)}],variant:`base-secondary`,width:88}),[D]);return(0,o.jsxs)(i.Layout,{children:[(0,o.jsx)(e.t,{activeHref:p}),(0,o.jsxs)(i.Layout.Main,{children:[(0,o.jsx)(i.PageHeader,{children:(0,o.jsx)(c.default,{description:y,title:T})}),(0,o.jsx)(i.SectionGroup,{children:(0,o.jsxs)(i.Section,{filterArea:(0,o.jsx)(i.FilterArea,{className:u.instanceFilterArea,size:`sub`,children:(0,o.jsxs)(i.FilterLine,{children:[(0,o.jsx)(i.Filter,{span:3,children:(0,o.jsx)(i.FormField,{fullWidth:!0,layout:l.FormFieldLayout.VERTICAL,name:`instanceSearchText`,children:(0,o.jsx)(i.Input,{fullWidth:!0,onChange:e=>{U(e.target.value),N(1)},placeholder:w,size:`sub`,value:H,variant:`base`})})}),(0,o.jsx)(i.Filter,{span:2,children:(0,o.jsx)(i.FormField,{fullWidth:!0,layout:l.FormFieldLayout.VERTICAL,name:`instanceState`,children:(0,o.jsx)(i.Select,{clearable:!1,fullWidth:!0,onChange:e=>{G(h(e)),N(1)},options:[...f],placeholder:`狀態`,renderValue:e=>`狀態:${_(e)}`,size:`sub`,value:W})})})]})}),children:[O?(0,o.jsx)(i.Typography,{color:`text-error`,variant:`body`,children:O}):null,!O&&!R&&B.length===0?(0,o.jsx)(i.Typography,{color:`text-neutral`,variant:`body`,children:C}):null,(0,o.jsx)(i.Table,{actions:J,columns:q,dataSource:[...B],fullWidth:!0,loading:R,pagination:{current:M,onChange:e=>{N(e)},onChangePageSize:e=>{N(1),F(e)},pageSize:P,pageSizeLabel:`每頁筆數`,pageSizeOptions:d,renderResultSummary:(e,t,n)=>`顯示 ${e}-${t} 筆,共 ${n} 筆`,showPageSizeOptions:!0,total:I}})]})})]})]})}function m(e){return{...e,caseTitle:(0,s.readApprovalInstanceCaseTitle)(e),key:e.id,stateLabel:y(e.state)}}function h(e){return v(e)?g(e.state):f[0]}function g(e){return f.find(t=>t.state===e)??f[0]}function _(e){return v(e)?e.name:f[0].name}function v(e){return typeof e==`object`&&!!e&&`id`in e&&`name`in e&&`state`in e}function y(e){return e===`RUNNING`?`進行中`:e===`APPROVED`?`已通過`:e===`REJECTED`?`已拒絕`:e===`RETURNED`?`已退回`:e===`CANCELLED`?`已取消`:e===`EXPIRED`?`已逾期`:`草稿`}function b(e){return e===`APPROVED`?`text-success`:e===`REJECTED`||e===`CANCELLED`||e===`EXPIRED`?`text-error`:`text-neutral`}function x(e,t){let n=(e??``).trim();return n?t.get(n)?.name??n:`未知發起人`}function S(e){return e instanceof Error?e.message:`讀取簽核案件失敗。`}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return p}});
2
- //# sourceMappingURL=approval-instance-list-page-DIAmwhvl.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"approval-instance-list-page-DIAmwhvl.cjs","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 Layout,\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 { AppNavigation } 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 <Layout>\n <AppNavigation activeHref={activeHref} />\n\n <Layout.Main>\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 </Layout.Main>\n </Layout>\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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"}
@@ -1,2 +0,0 @@
1
- "use client";require('../auth-provider.css');const e=require("./router-adapter-BybHrCNP.cjs");let t=require("react"),n=require("@mezzanine-ui/react"),r=require("@rytass/bpm-core-client"),i=require("react/jsx-runtime");var a={authLoading:`bpm_authLoading_GiBnf`},o=(0,t.createContext)(null);function s({children:n,publicPaths:a=[`/login`],loginPath:s=`/login`}){let c=e.r(),[f,p]=(0,t.useState)(!0),[m,h]=(0,t.useState)(null),g=(0,t.useCallback)(async()=>{let e=await(0,r.readApiCurrentMember)();return h(e),e},[]),_=(0,t.useCallback)(async e=>{let t=await(0,r.loginApi)(e);return h(t),t},[]),v=(0,t.useCallback)(async()=>{await(0,r.logoutApi)(),h(null),c.replace(s)},[s,c]);(0,t.useEffect)(()=>{let e=!0;return p(!0),(async()=>{try{let t=await(0,r.readApiCurrentMember)();e&&h(t)}catch{e&&h(null)}finally{e&&p(!1)}})(),()=>{e=!1}},[]),(0,t.useEffect)(()=>{f||u(c.pathname,a)||m||c.replace(`${s}?next=${encodeURIComponent(d(c.pathname))}`)},[f,s,m,a,c]);let y=(0,t.useMemo)(()=>({loading:f,login:_,logout:v,member:m,refresh:g}),[f,_,v,m,g]);return f&&!u(c.pathname,a)?(0,i.jsx)(l,{label:`確認登入狀態`}):!f&&!m&&!u(c.pathname,a)?(0,i.jsx)(l,{label:`前往登入頁`}):(0,i.jsx)(o.Provider,{value:y,children:n})}function c(){let e=(0,t.useContext)(o);if(!e)throw Error(`useAuth must be used inside <AuthProvider>`);return e}function l({label:e}){return(0,i.jsx)(`main`,{className:a.authLoading,children:(0,i.jsx)(n.Typography,{color:`text-neutral`,variant:`body`,children:e})})}function u(e,t){return t.some(t=>t===e)}function d(e){return typeof window>`u`?e??`/`:`${window.location.pathname}${window.location.search}`}Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return s}});
2
- //# sourceMappingURL=auth-provider-D2P-qWmY.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-provider-D2P-qWmY.cjs","names":[],"sources":["../../src/lib/auth-provider.module.scss","../../src/lib/auth-provider.tsx"],"sourcesContent":[".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":"sOCiCM,GAAA,EAAA,EAAA,eAAqD,IAAI,EAsB/D,SAAgB,EAAa,CAC3B,WACA,cAAc,CAAC,QAAQ,EACvB,YAAY,UACsB,CAClC,IAAM,EAAS,EAAA,EAAiB,EAC1B,CAAC,EAAS,IAAA,EAAA,EAAA,UAAuB,EAAI,EACrC,CAAC,EAAQ,IAAA,EAAA,EAAA,UAAwC,IAAI,EAErD,GAAA,EAAA,EAAA,aAAsB,SAAuC,CACjE,IAAM,EAAU,MAAA,EAAA,EAAA,sBAA2B,EAE3C,OADA,EAAU,CAAO,EACV,CACT,EAAG,CAAC,CAAC,EAEC,GAAA,EAAA,EAAA,aACJ,KAAO,IAGmB,CACxB,IAAM,EAAO,MAAA,EAAA,EAAA,UAAe,CAAK,EAEjC,OADA,EAAU,CAAI,EACP,CACT,EACA,CAAC,CACH,EAEM,GAAA,EAAA,EAAA,aAAqB,SAA2B,CACpD,MAAA,EAAA,EAAA,WAAgB,EAChB,EAAU,IAAI,EACd,EAAO,QAAQ,CAAS,CAC1B,EAAG,CAAC,EAAW,CAAM,CAAC,GAEtB,EAAA,EAAA,eAA8B,CAC5B,IAAI,EAAS,GAYb,OAXA,EAAW,EAAI,GACT,SAAY,CAChB,GAAI,CACF,IAAM,EAAU,MAAA,EAAA,EAAA,sBAA2B,EACvC,GAAQ,EAAU,CAAO,CAC/B,MAAQ,CACF,GAAQ,EAAU,IAAI,CAC5B,QAAU,CACJ,GAAQ,EAAW,EAAK,CAC9B,CACF,GAAG,MACgB,CACjB,EAAS,EACX,CACF,EAAG,CAAC,CAAC,GAEL,EAAA,EAAA,eAAsB,CAChB,GAAW,EAAa,EAAO,SAAU,CAAW,GAAK,GAC7D,EAAO,QACL,GAAG,EAAU,QAAQ,mBAAmB,EAAgB,EAAO,QAAQ,CAAC,GAC1E,CACF,EAAG,CAAC,EAAS,EAAW,EAAQ,EAAa,CAAM,CAAC,EAEpD,IAAM,GAAA,EAAA,EAAA,cACG,CAAE,UAAS,QAAO,SAAQ,SAAQ,SAAQ,GACjD,CAAC,EAAS,EAAO,EAAQ,EAAQ,CAAO,CAC1C,EAQA,OANI,GAAW,CAAC,EAAa,EAAO,SAAU,CAAW,GAChD,EAAA,EAAA,KAAC,EAAD,CAAkB,MAAM,QAAU,CAAA,EAEvC,CAAC,GAAW,CAAC,GAAU,CAAC,EAAa,EAAO,SAAU,CAAW,GAC5D,EAAA,EAAA,KAAC,EAAD,CAAkB,MAAM,OAAS,CAAA,GAEnC,EAAA,EAAA,KAAC,EAAY,SAAb,CAA6B,QAAQ,UAA+B,CAAA,CAC7E,CAKA,SAAgB,GAA4B,CAC1C,IAAM,GAAA,EAAA,EAAA,YAAiB,CAAW,EAClC,GAAI,CAAC,EAAK,MAAU,MAAM,4CAA4C,EACtE,OAAO,CACT,CAEA,SAAS,EAAiB,CACxB,SAGe,CACf,OACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAO,sBACtB,EAAA,EAAA,KAAC,EAAA,WAAD,CAAY,MAAM,eAAe,QAAQ,gBACtC,CACS,CAAA,CACR,CAAA,CAEV,CAEA,SAAS,EACP,EACA,EACS,CACT,OAAO,EAAY,KAAM,GAAM,IAAM,CAAQ,CAC/C,CAEA,SAAS,EAAgB,EAAiC,CAExD,OADI,OAAO,OAAW,IAAoB,GAAY,IAC/C,GAAG,OAAO,SAAS,WAAW,OAAO,SAAS,QACvD"}
@@ -1,83 +0,0 @@
1
- "use client";
2
- import { r as e } from "./router-adapter-BdHZXLS3.js";
3
- import { createContext as t, useCallback as n, useContext as r, useEffect as i, useMemo as a, useState as o } from "react";
4
- import { Typography as s } from "@mezzanine-ui/react";
5
- import { loginApi as c, logoutApi as l, readApiCurrentMember as u } from "@rytass/bpm-core-client";
6
- import { jsx as d } from "react/jsx-runtime";
7
- import '../auth-provider.css';var f = { authLoading: "bpm_authLoading_GiBnf" }, p = t(null);
8
- function m({ children: t, publicPaths: r = ["/login"], loginPath: s = "/login" }) {
9
- let f = e(), [m, h] = o(!0), [y, b] = o(null), x = n(async () => {
10
- let e = await u();
11
- return b(e), e;
12
- }, []), S = n(async (e) => {
13
- let t = await c(e);
14
- return b(t), t;
15
- }, []), C = n(async () => {
16
- await l(), b(null), f.replace(s);
17
- }, [s, f]);
18
- i(() => {
19
- let e = !0;
20
- return h(!0), (async () => {
21
- try {
22
- let t = await u();
23
- e && b(t);
24
- } catch {
25
- e && b(null);
26
- } finally {
27
- e && h(!1);
28
- }
29
- })(), () => {
30
- e = !1;
31
- };
32
- }, []), i(() => {
33
- m || _(f.pathname, r) || y || f.replace(`${s}?next=${encodeURIComponent(v(f.pathname))}`);
34
- }, [
35
- m,
36
- s,
37
- y,
38
- r,
39
- f
40
- ]);
41
- let w = a(() => ({
42
- loading: m,
43
- login: S,
44
- logout: C,
45
- member: y,
46
- refresh: x
47
- }), [
48
- m,
49
- S,
50
- C,
51
- y,
52
- x
53
- ]);
54
- return m && !_(f.pathname, r) ? /* @__PURE__ */ d(g, { label: "確認登入狀態" }) : !m && !y && !_(f.pathname, r) ? /* @__PURE__ */ d(g, { label: "前往登入頁" }) : /* @__PURE__ */ d(p.Provider, {
55
- value: w,
56
- children: t
57
- });
58
- }
59
- function h() {
60
- let e = r(p);
61
- if (!e) throw Error("useAuth must be used inside <AuthProvider>");
62
- return e;
63
- }
64
- function g({ label: e }) {
65
- return /* @__PURE__ */ d("main", {
66
- className: f.authLoading,
67
- children: /* @__PURE__ */ d(s, {
68
- color: "text-neutral",
69
- variant: "body",
70
- children: e
71
- })
72
- });
73
- }
74
- function _(e, t) {
75
- return t.some((t) => t === e);
76
- }
77
- function v(e) {
78
- return typeof window > "u" ? e ?? "/" : `${window.location.pathname}${window.location.search}`;
79
- }
80
- //#endregion
81
- export { h as n, m as t };
82
-
83
- //# sourceMappingURL=auth-provider-TTO9eNZV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-provider-TTO9eNZV.js","names":[],"sources":["../../src/lib/auth-provider.module.scss","../../src/lib/auth-provider.tsx"],"sourcesContent":[".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":";;;;;;kDCiCM,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"}
@@ -1,115 +0,0 @@
1
- "use client";
2
- import { r as e } from "./router-adapter-BdHZXLS3.js";
3
- import { n as t } from "./auth-provider-TTO9eNZV.js";
4
- import { t as n } from "./app-navigation-CATITRM7.js";
5
- import { useCallback as r, useEffect as i, useMemo as a, useState as o } from "react";
6
- import { BaseCard as s, Button as c, CardGroup as l, Layout as u, PageHeader as d, Section as f, SectionGroup as p, Typography as m } from "@mezzanine-ui/react";
7
- import { jsx as h, jsxs as g } from "react/jsx-runtime";
8
- import { readWorkflowDashboardSummary as _ } from "@rytass/bpm-core-client/workflow";
9
- import { PlusIcon as v } from "@mezzanine-ui/icons";
10
- import y from "@mezzanine-ui/react/ContentHeader";
11
- import '../dashboard-page.css';var b = { metricCard: "bpm_metricCard_vp2qC" }, x = {
12
- activeInstanceCount: 0,
13
- completedInstanceCount: 0,
14
- overdueTaskCount: 0,
15
- pendingTaskCount: 0,
16
- rejectedInstanceCount: 0,
17
- totalInstanceCount: 0,
18
- unreadNotificationCount: 0
19
- };
20
- function S({ activeHref: S }) {
21
- let T = e(), { member: E } = t(), D = E?.memberId ?? null, [O, k] = o(null), [A, j] = o(!0), [M, N] = o(x), P = r(async () => {
22
- if (!D) {
23
- j(!1);
24
- return;
25
- }
26
- j(!0), k(null);
27
- try {
28
- N(await _({
29
- currentMemberId: D,
30
- from: null,
31
- to: null
32
- }));
33
- } catch (e) {
34
- k(w(e));
35
- } finally {
36
- j(!1);
37
- }
38
- }, [D]);
39
- i(() => {
40
- P();
41
- }, [P]);
42
- let F = a(() => [
43
- {
44
- caption: "目前需要你處理的任務",
45
- href: "/inbox",
46
- label: "待處理簽核",
47
- value: C(M.pendingTaskCount, A)
48
- },
49
- {
50
- caption: "尚未讀取的站內通知",
51
- href: "/notifications",
52
- label: "未讀通知",
53
- value: C(M.unreadNotificationCount, A)
54
- },
55
- {
56
- caption: "目前仍在流程中的案件",
57
- href: "/search",
58
- label: "進行中案件",
59
- value: C(M.activeInstanceCount, A)
60
- },
61
- {
62
- caption: "已超過 SLA 的待處理任務",
63
- href: "/inbox",
64
- label: "逾時任務",
65
- value: C(M.overdueTaskCount, A)
66
- },
67
- {
68
- caption: "你有權限查看的全部案件",
69
- href: "/search",
70
- label: "案件總數",
71
- value: C(M.totalInstanceCount, A)
72
- }
73
- ], [A, M]);
74
- return /* @__PURE__ */ g(u, { children: [/* @__PURE__ */ h(n, { activeHref: S }), /* @__PURE__ */ g(u.Main, { children: [/* @__PURE__ */ h(d, { children: /* @__PURE__ */ h(y, {
75
- description: "查看待處理簽核、近期通知與你發起的案件進度。",
76
- title: "工作台",
77
- children: /* @__PURE__ */ h(c, {
78
- icon: v,
79
- iconType: "leading",
80
- onClick: () => T.push("/instances/new"),
81
- variant: "base-primary",
82
- children: "發起簽核"
83
- })
84
- }) }), /* @__PURE__ */ h(p, { children: /* @__PURE__ */ g(f, { children: [O ? /* @__PURE__ */ h(m, {
85
- color: "text-error",
86
- variant: "body",
87
- children: O
88
- }) : null, /* @__PURE__ */ h(l, { children: F.map((e) => /* @__PURE__ */ h(s, {
89
- "aria-label": `前往${e.label}`,
90
- className: b.metricCard,
91
- description: e.value,
92
- onClick: () => T.push(e.href),
93
- onKeyDown: (t) => {
94
- (t.key === "Enter" || t.key === " ") && (t.preventDefault(), T.push(e.href));
95
- },
96
- role: "link",
97
- tabIndex: 0,
98
- title: e.label,
99
- children: /* @__PURE__ */ h(m, {
100
- color: "text-neutral",
101
- variant: "caption",
102
- children: e.caption
103
- })
104
- }, e.label)) })] }) })] })] });
105
- }
106
- function C(e, t) {
107
- return t ? "-" : String(e);
108
- }
109
- function w(e) {
110
- return e instanceof Error ? e.message : "讀取工作台摘要失敗。";
111
- }
112
- //#endregion
113
- export { S as t };
114
-
115
- //# sourceMappingURL=dashboard-page-BsW8t104.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dashboard-page-BsW8t104.js","names":[],"sources":["../../src/components/dashboard-page.module.scss","../../src/components/dashboard-page.tsx"],"sourcesContent":[".metricCard {\n color: inherit;\n cursor: pointer;\n text-decoration: none;\n}\n\n.metricCard:hover {\n text-decoration: none;\n}\n","'use client';\n\nimport type { KeyboardEvent, ReactElement } from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n BaseCard,\n Button,\n CardGroup,\n Layout,\n PageHeader,\n Section,\n SectionGroup,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport {\n readWorkflowDashboardSummary,\n type WorkflowDashboardSummaryRecord,\n} from '@rytass/bpm-core-client/workflow';\nimport { useAuth } from '../lib/auth-provider';\nimport { useRouterAdapter } from '../lib/router-adapter';\nimport { AppNavigation } from './app-navigation';\nimport styles from './dashboard-page.module.scss';\n\nexport interface DashboardPageProps {\n readonly activeHref: string;\n}\n\ninterface Metric {\n readonly caption: string;\n readonly href: string;\n readonly label: string;\n readonly value: string;\n}\n\nconst EMPTY_DASHBOARD_SUMMARY: WorkflowDashboardSummaryRecord = {\n activeInstanceCount: 0,\n completedInstanceCount: 0,\n overdueTaskCount: 0,\n pendingTaskCount: 0,\n rejectedInstanceCount: 0,\n totalInstanceCount: 0,\n unreadNotificationCount: 0,\n};\n\n/**\n * Operator dashboard — shows pending/unread/active counts for the\n * currently-authenticated member. Reads {@link readWorkflowDashboardSummary}\n * and renders five metric tiles that navigate via {@link useRouterAdapter}.\n */\nexport function DashboardPage({ activeHref }: DashboardPageProps): ReactElement {\n const router = useRouterAdapter();\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [summary, setSummary] = useState<WorkflowDashboardSummaryRecord>(\n EMPTY_DASHBOARD_SUMMARY,\n );\n\n const refreshSummary = useCallback(async (): Promise<void> => {\n if (!currentMemberId) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n setSummary(\n await readWorkflowDashboardSummary({\n currentMemberId,\n from: null,\n to: null,\n }),\n );\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, [currentMemberId]);\n\n useEffect((): void => {\n void refreshSummary();\n }, [refreshSummary]);\n\n const metrics = useMemo(\n (): readonly Metric[] => [\n {\n caption: '目前需要你處理的任務',\n href: '/inbox',\n label: '待處理簽核',\n value: readMetricValue(summary.pendingTaskCount, loading),\n },\n {\n caption: '尚未讀取的站內通知',\n href: '/notifications',\n label: '未讀通知',\n value: readMetricValue(summary.unreadNotificationCount, loading),\n },\n {\n caption: '目前仍在流程中的案件',\n href: '/search',\n label: '進行中案件',\n value: readMetricValue(summary.activeInstanceCount, loading),\n },\n {\n caption: '已超過 SLA 的待處理任務',\n href: '/inbox',\n label: '逾時任務',\n value: readMetricValue(summary.overdueTaskCount, loading),\n },\n {\n caption: '你有權限查看的全部案件',\n href: '/search',\n label: '案件總數',\n value: readMetricValue(summary.totalInstanceCount, loading),\n },\n ],\n [loading, summary],\n );\n\n return (\n <Layout>\n <AppNavigation activeHref={activeHref} />\n\n <Layout.Main>\n <PageHeader>\n <ContentHeader\n description=\"查看待處理簽核、近期通知與你發起的案件進度。\"\n title=\"工作台\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void => router.push('/instances/new')}\n variant=\"base-primary\"\n >\n 發起簽核\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section>\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <CardGroup>\n {metrics.map((metric) => (\n <BaseCard\n aria-label={`前往${metric.label}`}\n className={styles.metricCard}\n description={metric.value}\n key={metric.label}\n onClick={(): void => router.push(metric.href)}\n onKeyDown={(event: KeyboardEvent<HTMLElement>): void => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n router.push(metric.href);\n }\n }}\n role=\"link\"\n tabIndex={0}\n title={metric.label}\n >\n <Typography color=\"text-neutral\" variant=\"caption\">\n {metric.caption}\n </Typography>\n </BaseCard>\n ))}\n </CardGroup>\n </Section>\n </SectionGroup>\n </Layout.Main>\n </Layout>\n );\n}\n\nfunction readMetricValue(value: number, loading: boolean): string {\n return loading ? '-' : String(value);\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '讀取工作台摘要失敗。';\n}\n"],"mappings":";;;;;;;;;;gDCoCM,IAA0D;CAC9D,qBAAqB;CACrB,wBAAwB;CACxB,kBAAkB;CAClB,kBAAkB;CAClB,uBAAuB;CACvB,oBAAoB;CACpB,yBAAyB;AAC3B;AAOA,SAAgB,EAAc,EAAE,iBAAgD;CAC9E,IAAM,IAAS,EAAiB,GAC1B,EAAE,cAAW,EAAQ,GACrB,IAAkB,GAAQ,YAAY,MACtC,CAAC,GAAO,KAAY,EAAwB,IAAI,GAChD,CAAC,GAAS,KAAc,EAAS,EAAI,GACrC,CAAC,GAAS,KAAc,EAC5B,CACF,GAEM,IAAiB,EAAY,YAA2B;EAC5D,IAAI,CAAC,GAAiB;GACpB,EAAW,EAAK;GAChB;EACF;EAGA,AADA,EAAW,EAAI,GACf,EAAS,IAAI;EAEb,IAAI;GACF,EACE,MAAM,EAA6B;IACjC;IACA,MAAM;IACN,IAAI;GACN,CAAC,CACH;EACF,SAAS,GAAuB;GAC9B,EAAS,EAAiB,CAAY,CAAC;EACzC,UAAU;GACR,EAAW,EAAK;EAClB;CACF,GAAG,CAAC,CAAe,CAAC;CAEpB,QAAsB;EACpB,EAAoB;CACtB,GAAG,CAAC,CAAc,CAAC;CAEnB,IAAM,IAAU,QACW;EACvB;GACE,SAAS;GACT,MAAM;GACN,OAAO;GACP,OAAO,EAAgB,EAAQ,kBAAkB,CAAO;EAC1D;EACA;GACE,SAAS;GACT,MAAM;GACN,OAAO;GACP,OAAO,EAAgB,EAAQ,yBAAyB,CAAO;EACjE;EACA;GACE,SAAS;GACT,MAAM;GACN,OAAO;GACP,OAAO,EAAgB,EAAQ,qBAAqB,CAAO;EAC7D;EACA;GACE,SAAS;GACT,MAAM;GACN,OAAO;GACP,OAAO,EAAgB,EAAQ,kBAAkB,CAAO;EAC1D;EACA;GACE,SAAS;GACT,MAAM;GACN,OAAO;GACP,OAAO,EAAgB,EAAQ,oBAAoB,CAAO;EAC5D;CACF,GACA,CAAC,GAAS,CAAO,CACnB;CAEA,OACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAA2B,cAAa,CAAA,GAExC,kBAAC,EAAO,MAAR,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EACE,aAAY;EACZ,OAAM;YAEN,kBAAC,GAAD;GACE,MAAM;GACN,UAAS;GACT,eAAqB,EAAO,KAAK,gBAAgB;GACjD,SAAQ;aACT;EAEO,CAAA;CACK,CAAA,EACL,CAAA,GAEZ,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAA,CACG,IACC,kBAAC,GAAD;EAAY,OAAM;EAAa,SAAQ;YACpC;CACS,CAAA,IACV,MACJ,kBAAC,GAAD,EAAA,UACG,EAAQ,KAAK,MACZ,kBAAC,GAAD;EACE,cAAY,KAAK,EAAO;EACxB,WAAW,EAAO;EAClB,aAAa,EAAO;EAEpB,eAAqB,EAAO,KAAK,EAAO,IAAI;EAC5C,YAAY,MAA4C;GACtD,CAAI,EAAM,QAAQ,WAAW,EAAM,QAAQ,SACzC,EAAM,eAAe,GACrB,EAAO,KAAK,EAAO,IAAI;EAE3B;EACA,MAAK;EACL,UAAU;EACV,OAAO,EAAO;YAEd,kBAAC,GAAD;GAAY,OAAM;GAAe,SAAQ;aACtC,EAAO;EACE,CAAA;CACJ,GAfH,EAAO,KAeJ,CACX,EACQ,CAAA,CACJ,EAAA,CAAA,EACG,CAAA,CACH,EAAA,CAAA,CACP,EAAA,CAAA;AAEZ;AAEA,SAAS,EAAgB,GAAe,GAA0B;CAChE,OAAO,IAAU,MAAM,OAAO,CAAK;AACrC;AAEA,SAAS,EAAiB,GAAwB;CAChD,OAAO,aAAiB,QAAQ,EAAM,UAAU;AAClD"}
@@ -1,2 +0,0 @@
1
- "use client";require('../dashboard-page.css');const e=require("./app-navigation-DAC5gFbG.cjs"),t=require("./router-adapter-BybHrCNP.cjs"),n=require("./auth-provider-D2P-qWmY.cjs");let r=require("react"),i=require("@mezzanine-ui/react"),a=require("react/jsx-runtime"),o=require("@rytass/bpm-core-client/workflow"),s=require("@mezzanine-ui/icons"),c=require("@mezzanine-ui/react/ContentHeader");c=e.o(c,1);var l={metricCard:`bpm_metricCard_vp2qC`},u={activeInstanceCount:0,completedInstanceCount:0,overdueTaskCount:0,pendingTaskCount:0,rejectedInstanceCount:0,totalInstanceCount:0,unreadNotificationCount:0};function d({activeHref:d}){let m=t.r(),{member:h}=n.n(),g=h?.memberId??null,[_,v]=(0,r.useState)(null),[y,b]=(0,r.useState)(!0),[x,S]=(0,r.useState)(u),C=(0,r.useCallback)(async()=>{if(!g){b(!1);return}b(!0),v(null);try{S(await(0,o.readWorkflowDashboardSummary)({currentMemberId:g,from:null,to:null}))}catch(e){v(p(e))}finally{b(!1)}},[g]);(0,r.useEffect)(()=>{C()},[C]);let w=(0,r.useMemo)(()=>[{caption:`目前需要你處理的任務`,href:`/inbox`,label:`待處理簽核`,value:f(x.pendingTaskCount,y)},{caption:`尚未讀取的站內通知`,href:`/notifications`,label:`未讀通知`,value:f(x.unreadNotificationCount,y)},{caption:`目前仍在流程中的案件`,href:`/search`,label:`進行中案件`,value:f(x.activeInstanceCount,y)},{caption:`已超過 SLA 的待處理任務`,href:`/inbox`,label:`逾時任務`,value:f(x.overdueTaskCount,y)},{caption:`你有權限查看的全部案件`,href:`/search`,label:`案件總數`,value:f(x.totalInstanceCount,y)}],[y,x]);return(0,a.jsxs)(i.Layout,{children:[(0,a.jsx)(e.t,{activeHref:d}),(0,a.jsxs)(i.Layout.Main,{children:[(0,a.jsx)(i.PageHeader,{children:(0,a.jsx)(c.default,{description:`查看待處理簽核、近期通知與你發起的案件進度。`,title:`工作台`,children:(0,a.jsx)(i.Button,{icon:s.PlusIcon,iconType:`leading`,onClick:()=>m.push(`/instances/new`),variant:`base-primary`,children:`發起簽核`})})}),(0,a.jsx)(i.SectionGroup,{children:(0,a.jsxs)(i.Section,{children:[_?(0,a.jsx)(i.Typography,{color:`text-error`,variant:`body`,children:_}):null,(0,a.jsx)(i.CardGroup,{children:w.map(e=>(0,a.jsx)(i.BaseCard,{"aria-label":`前往${e.label}`,className:l.metricCard,description:e.value,onClick:()=>m.push(e.href),onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),m.push(e.href))},role:`link`,tabIndex:0,title:e.label,children:(0,a.jsx)(i.Typography,{color:`text-neutral`,variant:`caption`,children:e.caption})},e.label))})]})})]})]})}function f(e,t){return t?`-`:String(e)}function p(e){return e instanceof Error?e.message:`讀取工作台摘要失敗。`}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return d}});
2
- //# sourceMappingURL=dashboard-page-udYhnyMW.cjs.map