@rytass/bpm-core-react 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (443) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +56 -0
  3. package/dist/AdminDelegationsView.css +1 -0
  4. package/dist/AdminOrgsView.css +1 -0
  5. package/dist/AdminUsersView.css +1 -0
  6. package/dist/DelegationsView.css +1 -0
  7. package/dist/InstanceDetailView.css +1 -0
  8. package/dist/LoginView.css +1 -0
  9. package/dist/SettingsNotificationsView.css +1 -0
  10. package/dist/admin-pickers.css +1 -0
  11. package/dist/app-navigation.css +1 -0
  12. package/dist/approval-instance-list-page.css +1 -0
  13. package/dist/auth-provider.css +1 -0
  14. package/dist/chunks/AdminDelegationsView-CqNmlVWx.cjs +2 -0
  15. package/dist/chunks/AdminDelegationsView-CqNmlVWx.cjs.map +1 -0
  16. package/dist/chunks/AdminDelegationsView-DydMZ9ED.js +642 -0
  17. package/dist/chunks/AdminDelegationsView-DydMZ9ED.js.map +1 -0
  18. package/dist/chunks/AdminOrgsView-DZaVAbaQ.js +1945 -0
  19. package/dist/chunks/AdminOrgsView-DZaVAbaQ.js.map +1 -0
  20. package/dist/chunks/AdminOrgsView-bSsIyMvk.cjs +2 -0
  21. package/dist/chunks/AdminOrgsView-bSsIyMvk.cjs.map +1 -0
  22. package/dist/chunks/AdminUsersView-C0oO05Br.js +215 -0
  23. package/dist/chunks/AdminUsersView-C0oO05Br.js.map +1 -0
  24. package/dist/chunks/AdminUsersView-DlArLlIr.cjs +2 -0
  25. package/dist/chunks/AdminUsersView-DlArLlIr.cjs.map +1 -0
  26. package/dist/chunks/CcView-BsVsya5F.cjs +2 -0
  27. package/dist/chunks/CcView-BsVsya5F.cjs.map +1 -0
  28. package/dist/chunks/CcView-Bv0GzA5C.js +19 -0
  29. package/dist/chunks/CcView-Bv0GzA5C.js.map +1 -0
  30. package/dist/chunks/DashboardView-Dk1ZQmmk.js +11 -0
  31. package/dist/chunks/DashboardView-Dk1ZQmmk.js.map +1 -0
  32. package/dist/chunks/DashboardView-_0zh-rxT.cjs +2 -0
  33. package/dist/chunks/DashboardView-_0zh-rxT.cjs.map +1 -0
  34. package/dist/chunks/DelegationsView-DQUqOUV5.js +569 -0
  35. package/dist/chunks/DelegationsView-DQUqOUV5.js.map +1 -0
  36. package/dist/chunks/DelegationsView-pKeFV2LN.cjs +2 -0
  37. package/dist/chunks/DelegationsView-pKeFV2LN.cjs.map +1 -0
  38. package/dist/chunks/FormBuilderView-BKtyW55e.cjs +3 -0
  39. package/dist/chunks/FormBuilderView-BKtyW55e.cjs.map +1 -0
  40. package/dist/chunks/FormBuilderView-CvChAvgD.js +1300 -0
  41. package/dist/chunks/FormBuilderView-CvChAvgD.js.map +1 -0
  42. package/dist/chunks/FormRendererView-BwVsH2eX.cjs +2 -0
  43. package/dist/chunks/FormRendererView-BwVsH2eX.cjs.map +1 -0
  44. package/dist/chunks/FormRendererView-DrHsuSVo.js +220 -0
  45. package/dist/chunks/FormRendererView-DrHsuSVo.js.map +1 -0
  46. package/dist/chunks/FormsView-DYEuik8W.js +185 -0
  47. package/dist/chunks/FormsView-DYEuik8W.js.map +1 -0
  48. package/dist/chunks/FormsView-RjJEkIfZ.cjs +2 -0
  49. package/dist/chunks/FormsView-RjJEkIfZ.cjs.map +1 -0
  50. package/dist/chunks/InboxView-DDWwmWhA.cjs +2 -0
  51. package/dist/chunks/InboxView-DDWwmWhA.cjs.map +1 -0
  52. package/dist/chunks/InboxView-YSoyrYLk.js +291 -0
  53. package/dist/chunks/InboxView-YSoyrYLk.js.map +1 -0
  54. package/dist/chunks/InstanceDetailView-C-A-LOCG.js +1519 -0
  55. package/dist/chunks/InstanceDetailView-C-A-LOCG.js.map +1 -0
  56. package/dist/chunks/InstanceDetailView-l_kNDCz2.cjs +2 -0
  57. package/dist/chunks/InstanceDetailView-l_kNDCz2.cjs.map +1 -0
  58. package/dist/chunks/InstanceNewView-B5hz-FWd.js +190 -0
  59. package/dist/chunks/InstanceNewView-B5hz-FWd.js.map +1 -0
  60. package/dist/chunks/InstanceNewView-CdCsxQIu.cjs +2 -0
  61. package/dist/chunks/InstanceNewView-CdCsxQIu.cjs.map +1 -0
  62. package/dist/chunks/LoginView-BED07v-7.cjs +2 -0
  63. package/dist/chunks/LoginView-BED07v-7.cjs.map +1 -0
  64. package/dist/chunks/LoginView-a1iu3cfc.js +157 -0
  65. package/dist/chunks/LoginView-a1iu3cfc.js.map +1 -0
  66. package/dist/chunks/RootClientView-rXJt4TDd.cjs +2 -0
  67. package/dist/chunks/RootClientView-rXJt4TDd.cjs.map +1 -0
  68. package/dist/chunks/RootClientView-wAkXUEZw.js +34 -0
  69. package/dist/chunks/RootClientView-wAkXUEZw.js.map +1 -0
  70. package/dist/chunks/SearchView-CgXPssgE.cjs +2 -0
  71. package/dist/chunks/SearchView-CgXPssgE.cjs.map +1 -0
  72. package/dist/chunks/SearchView-WXMbZwRw.js +19 -0
  73. package/dist/chunks/SearchView-WXMbZwRw.js.map +1 -0
  74. package/dist/chunks/SentView-BTDoFBrG.cjs +2 -0
  75. package/dist/chunks/SentView-BTDoFBrG.cjs.map +1 -0
  76. package/dist/chunks/SentView-CdOL92Rq.js +19 -0
  77. package/dist/chunks/SentView-CdOL92Rq.js.map +1 -0
  78. package/dist/chunks/SettingsNotificationsView-B6F6fa7U.js +194 -0
  79. package/dist/chunks/SettingsNotificationsView-B6F6fa7U.js.map +1 -0
  80. package/dist/chunks/SettingsNotificationsView-Bnz0CmoJ.cjs +2 -0
  81. package/dist/chunks/SettingsNotificationsView-Bnz0CmoJ.cjs.map +1 -0
  82. package/dist/chunks/TemplateCategoriesView-CgZciaSd.js +382 -0
  83. package/dist/chunks/TemplateCategoriesView-CgZciaSd.js.map +1 -0
  84. package/dist/chunks/TemplateCategoriesView-U0stGUBc.cjs +2 -0
  85. package/dist/chunks/TemplateCategoriesView-U0stGUBc.cjs.map +1 -0
  86. package/dist/chunks/TemplateDesignerView-A38DyYD4.cjs +51 -0
  87. package/dist/chunks/TemplateDesignerView-A38DyYD4.cjs.map +1 -0
  88. package/dist/chunks/TemplateDesignerView-Dffx-VZ-.js +2272 -0
  89. package/dist/chunks/TemplateDesignerView-Dffx-VZ-.js.map +1 -0
  90. package/dist/chunks/TemplateVersionsView-6sVQbBem.js +110 -0
  91. package/dist/chunks/TemplateVersionsView-6sVQbBem.js.map +1 -0
  92. package/dist/chunks/TemplateVersionsView-CMqw3ieU.cjs +2 -0
  93. package/dist/chunks/TemplateVersionsView-CMqw3ieU.cjs.map +1 -0
  94. package/dist/chunks/TemplatesView-BLj9f-XI.js +380 -0
  95. package/dist/chunks/TemplatesView-BLj9f-XI.js.map +1 -0
  96. package/dist/chunks/TemplatesView-DIOQTUUl.cjs +2 -0
  97. package/dist/chunks/TemplatesView-DIOQTUUl.cjs.map +1 -0
  98. package/dist/chunks/admin-pickers-Btvij1at.cjs +2 -0
  99. package/dist/chunks/admin-pickers-Btvij1at.cjs.map +1 -0
  100. package/dist/chunks/admin-pickers-DLlG_1du.js +140 -0
  101. package/dist/chunks/admin-pickers-DLlG_1du.js.map +1 -0
  102. package/dist/chunks/app-navigation-CATITRM7.js +263 -0
  103. package/dist/chunks/app-navigation-CATITRM7.js.map +1 -0
  104. package/dist/chunks/app-navigation-DAC5gFbG.cjs +2 -0
  105. package/dist/chunks/app-navigation-DAC5gFbG.cjs.map +1 -0
  106. package/dist/chunks/approval-instance-list-page-B6vAGvOb.js +278 -0
  107. package/dist/chunks/approval-instance-list-page-B6vAGvOb.js.map +1 -0
  108. package/dist/chunks/approval-instance-list-page-DIAmwhvl.cjs +2 -0
  109. package/dist/chunks/approval-instance-list-page-DIAmwhvl.cjs.map +1 -0
  110. package/dist/chunks/auth-provider-D2P-qWmY.cjs +2 -0
  111. package/dist/chunks/auth-provider-D2P-qWmY.cjs.map +1 -0
  112. package/dist/chunks/auth-provider-TTO9eNZV.js +83 -0
  113. package/dist/chunks/auth-provider-TTO9eNZV.js.map +1 -0
  114. package/dist/chunks/bpm-form-field-Bc6k4ZEO.cjs +2 -0
  115. package/dist/chunks/bpm-form-field-Bc6k4ZEO.cjs.map +1 -0
  116. package/dist/chunks/bpm-form-field-Cao0rMol.js +17 -0
  117. package/dist/chunks/bpm-form-field-Cao0rMol.js.map +1 -0
  118. package/dist/chunks/dashboard-page-BsW8t104.js +115 -0
  119. package/dist/chunks/dashboard-page-BsW8t104.js.map +1 -0
  120. package/dist/chunks/dashboard-page-udYhnyMW.cjs +2 -0
  121. package/dist/chunks/dashboard-page-udYhnyMW.cjs.map +1 -0
  122. package/dist/chunks/form-name-modal-C3OEvkCV.js +64 -0
  123. package/dist/chunks/form-name-modal-C3OEvkCV.js.map +1 -0
  124. package/dist/chunks/form-name-modal-uZCHbtRH.cjs +2 -0
  125. package/dist/chunks/form-name-modal-uZCHbtRH.cjs.map +1 -0
  126. package/dist/chunks/format-date-time-BQyH5U8z.cjs +2 -0
  127. package/dist/chunks/format-date-time-BQyH5U8z.cjs.map +1 -0
  128. package/dist/chunks/format-date-time-CB-LxzqT.js +9 -0
  129. package/dist/chunks/format-date-time-CB-LxzqT.js.map +1 -0
  130. package/dist/chunks/router-adapter-BdHZXLS3.js +23 -0
  131. package/dist/chunks/router-adapter-BdHZXLS3.js.map +1 -0
  132. package/dist/chunks/router-adapter-BybHrCNP.cjs +2 -0
  133. package/dist/chunks/router-adapter-BybHrCNP.cjs.map +1 -0
  134. package/dist/chunks/templates.module-B5bg_goX.js +8 -0
  135. package/dist/chunks/templates.module-B5bg_goX.js.map +1 -0
  136. package/dist/chunks/templates.module-ClRnQQX4.cjs +2 -0
  137. package/dist/chunks/templates.module-ClRnQQX4.cjs.map +1 -0
  138. package/dist/components/admin-pickers.d.ts +65 -0
  139. package/dist/components/app-navigation.d.ts +34 -0
  140. package/dist/components/approval-instance-list-page.d.ts +18 -0
  141. package/dist/components/bpm-form-field.d.ts +10 -0
  142. package/dist/components/dashboard-page.d.ts +10 -0
  143. package/dist/components/notification-drawer.d.ts +10 -0
  144. package/dist/components/org-unit-tree-draft-editor.d.ts +24 -0
  145. package/dist/components/pdf-preview.d.ts +12 -0
  146. package/dist/dashboard-page.css +1 -0
  147. package/dist/index.cjs +2 -0
  148. package/dist/index.cjs.map +1 -0
  149. package/dist/index.d.ts +12 -0
  150. package/dist/index.js +209 -0
  151. package/dist/index.js.map +1 -0
  152. package/dist/lib/auth-provider.d.ts +37 -0
  153. package/dist/lib/format-date-time.d.ts +5 -0
  154. package/dist/lib/notification-drawer-provider.d.ts +26 -0
  155. package/dist/lib/notification-unread-provider.d.ts +24 -0
  156. package/dist/lib/org-tree-draft.d.ts +27 -0
  157. package/dist/lib/providers.d.ts +30 -0
  158. package/dist/lib/router-adapter.d.ts +47 -0
  159. package/dist/pages/admin/delegations/AdminDelegationsClientView.cjs +2 -0
  160. package/dist/pages/admin/delegations/AdminDelegationsClientView.cjs.map +1 -0
  161. package/dist/pages/admin/delegations/AdminDelegationsClientView.d.ts +3 -0
  162. package/dist/pages/admin/delegations/AdminDelegationsClientView.js +28 -0
  163. package/dist/pages/admin/delegations/AdminDelegationsClientView.js.map +1 -0
  164. package/dist/pages/admin/delegations/index.cjs +2 -0
  165. package/dist/pages/admin/delegations/index.cjs.map +1 -0
  166. package/dist/pages/admin/delegations/index.d.ts +4 -0
  167. package/dist/pages/admin/delegations/index.js +14 -0
  168. package/dist/pages/admin/delegations/index.js.map +1 -0
  169. package/dist/pages/admin/orgs/AdminOrgsClientView.cjs +2 -0
  170. package/dist/pages/admin/orgs/AdminOrgsClientView.cjs.map +1 -0
  171. package/dist/pages/admin/orgs/AdminOrgsClientView.d.ts +3 -0
  172. package/dist/pages/admin/orgs/AdminOrgsClientView.js +28 -0
  173. package/dist/pages/admin/orgs/AdminOrgsClientView.js.map +1 -0
  174. package/dist/pages/admin/orgs/index.cjs +2 -0
  175. package/dist/pages/admin/orgs/index.cjs.map +1 -0
  176. package/dist/pages/admin/orgs/index.d.ts +4 -0
  177. package/dist/pages/admin/orgs/index.js +14 -0
  178. package/dist/pages/admin/orgs/index.js.map +1 -0
  179. package/dist/pages/admin/users/AdminUsersClientView.cjs +2 -0
  180. package/dist/pages/admin/users/AdminUsersClientView.cjs.map +1 -0
  181. package/dist/pages/admin/users/AdminUsersClientView.d.ts +3 -0
  182. package/dist/pages/admin/users/AdminUsersClientView.js +28 -0
  183. package/dist/pages/admin/users/AdminUsersClientView.js.map +1 -0
  184. package/dist/pages/admin/users/index.cjs +2 -0
  185. package/dist/pages/admin/users/index.cjs.map +1 -0
  186. package/dist/pages/admin/users/index.d.ts +4 -0
  187. package/dist/pages/admin/users/index.js +14 -0
  188. package/dist/pages/admin/users/index.js.map +1 -0
  189. package/dist/pages/cc/CcClientView.cjs +2 -0
  190. package/dist/pages/cc/CcClientView.cjs.map +1 -0
  191. package/dist/pages/cc/CcClientView.d.ts +7 -0
  192. package/dist/pages/cc/CcClientView.js +28 -0
  193. package/dist/pages/cc/CcClientView.js.map +1 -0
  194. package/dist/pages/cc/index.cjs +2 -0
  195. package/dist/pages/cc/index.cjs.map +1 -0
  196. package/dist/pages/cc/index.d.ts +16 -0
  197. package/dist/pages/cc/index.js +11 -0
  198. package/dist/pages/cc/index.js.map +1 -0
  199. package/dist/pages/dashboard/DashboardClientView.cjs +2 -0
  200. package/dist/pages/dashboard/DashboardClientView.cjs.map +1 -0
  201. package/dist/pages/dashboard/DashboardClientView.d.ts +9 -0
  202. package/dist/pages/dashboard/DashboardClientView.js +28 -0
  203. package/dist/pages/dashboard/DashboardClientView.js.map +1 -0
  204. package/dist/pages/dashboard/index.cjs +2 -0
  205. package/dist/pages/dashboard/index.cjs.map +1 -0
  206. package/dist/pages/dashboard/index.d.ts +16 -0
  207. package/dist/pages/dashboard/index.js +11 -0
  208. package/dist/pages/dashboard/index.js.map +1 -0
  209. package/dist/pages/delegations/DelegationsClientView.cjs +2 -0
  210. package/dist/pages/delegations/DelegationsClientView.cjs.map +1 -0
  211. package/dist/pages/delegations/DelegationsClientView.d.ts +3 -0
  212. package/dist/pages/delegations/DelegationsClientView.js +28 -0
  213. package/dist/pages/delegations/DelegationsClientView.js.map +1 -0
  214. package/dist/pages/delegations/index.cjs +2 -0
  215. package/dist/pages/delegations/index.cjs.map +1 -0
  216. package/dist/pages/delegations/index.d.ts +4 -0
  217. package/dist/pages/delegations/index.js +14 -0
  218. package/dist/pages/delegations/index.js.map +1 -0
  219. package/dist/pages/forms/FormsClientView.cjs +2 -0
  220. package/dist/pages/forms/FormsClientView.cjs.map +1 -0
  221. package/dist/pages/forms/FormsClientView.d.ts +10 -0
  222. package/dist/pages/forms/FormsClientView.js +28 -0
  223. package/dist/pages/forms/FormsClientView.js.map +1 -0
  224. package/dist/pages/forms/builder/FormBuilderClientView.cjs +2 -0
  225. package/dist/pages/forms/builder/FormBuilderClientView.cjs.map +1 -0
  226. package/dist/pages/forms/builder/FormBuilderClientView.d.ts +11 -0
  227. package/dist/pages/forms/builder/FormBuilderClientView.js +28 -0
  228. package/dist/pages/forms/builder/FormBuilderClientView.js.map +1 -0
  229. package/dist/pages/forms/builder/index.cjs +2 -0
  230. package/dist/pages/forms/builder/index.cjs.map +1 -0
  231. package/dist/pages/forms/builder/index.d.ts +23 -0
  232. package/dist/pages/forms/builder/index.js +15 -0
  233. package/dist/pages/forms/builder/index.js.map +1 -0
  234. package/dist/pages/forms/index.cjs +2 -0
  235. package/dist/pages/forms/index.cjs.map +1 -0
  236. package/dist/pages/forms/index.d.ts +17 -0
  237. package/dist/pages/forms/index.js +14 -0
  238. package/dist/pages/forms/index.js.map +1 -0
  239. package/dist/pages/inbox/InboxClientView.cjs +2 -0
  240. package/dist/pages/inbox/InboxClientView.cjs.map +1 -0
  241. package/dist/pages/inbox/InboxClientView.d.ts +9 -0
  242. package/dist/pages/inbox/InboxClientView.js +28 -0
  243. package/dist/pages/inbox/InboxClientView.js.map +1 -0
  244. package/dist/pages/inbox/index.cjs +2 -0
  245. package/dist/pages/inbox/index.cjs.map +1 -0
  246. package/dist/pages/inbox/index.d.ts +16 -0
  247. package/dist/pages/inbox/index.js +11 -0
  248. package/dist/pages/inbox/index.js.map +1 -0
  249. package/dist/pages/instances/detail/InstanceDetailClientView.cjs +2 -0
  250. package/dist/pages/instances/detail/InstanceDetailClientView.cjs.map +1 -0
  251. package/dist/pages/instances/detail/InstanceDetailClientView.d.ts +9 -0
  252. package/dist/pages/instances/detail/InstanceDetailClientView.js +28 -0
  253. package/dist/pages/instances/detail/InstanceDetailClientView.js.map +1 -0
  254. package/dist/pages/instances/detail/index.cjs +2 -0
  255. package/dist/pages/instances/detail/index.cjs.map +1 -0
  256. package/dist/pages/instances/detail/index.d.ts +23 -0
  257. package/dist/pages/instances/detail/index.js +12 -0
  258. package/dist/pages/instances/detail/index.js.map +1 -0
  259. package/dist/pages/instances/new/InstanceNewClientView.cjs +2 -0
  260. package/dist/pages/instances/new/InstanceNewClientView.cjs.map +1 -0
  261. package/dist/pages/instances/new/InstanceNewClientView.d.ts +8 -0
  262. package/dist/pages/instances/new/InstanceNewClientView.js +28 -0
  263. package/dist/pages/instances/new/InstanceNewClientView.js.map +1 -0
  264. package/dist/pages/instances/new/index.cjs +2 -0
  265. package/dist/pages/instances/new/index.cjs.map +1 -0
  266. package/dist/pages/instances/new/index.d.ts +16 -0
  267. package/dist/pages/instances/new/index.js +11 -0
  268. package/dist/pages/instances/new/index.js.map +1 -0
  269. package/dist/pages/login/LoginClientView.cjs +2 -0
  270. package/dist/pages/login/LoginClientView.cjs.map +1 -0
  271. package/dist/pages/login/LoginClientView.d.ts +11 -0
  272. package/dist/pages/login/LoginClientView.js +29 -0
  273. package/dist/pages/login/LoginClientView.js.map +1 -0
  274. package/dist/pages/login/index.cjs +2 -0
  275. package/dist/pages/login/index.cjs.map +1 -0
  276. package/dist/pages/login/index.d.ts +17 -0
  277. package/dist/pages/login/index.js +14 -0
  278. package/dist/pages/login/index.js.map +1 -0
  279. package/dist/pages/root/RootClientView.cjs +1 -0
  280. package/dist/pages/root/RootClientView.d.ts +8 -0
  281. package/dist/pages/root/RootClientView.js +2 -0
  282. package/dist/pages/root/index.cjs +2 -0
  283. package/dist/pages/root/index.cjs.map +1 -0
  284. package/dist/pages/root/index.d.ts +16 -0
  285. package/dist/pages/root/index.js +11 -0
  286. package/dist/pages/root/index.js.map +1 -0
  287. package/dist/pages/search/SearchClientView.cjs +2 -0
  288. package/dist/pages/search/SearchClientView.cjs.map +1 -0
  289. package/dist/pages/search/SearchClientView.d.ts +7 -0
  290. package/dist/pages/search/SearchClientView.js +28 -0
  291. package/dist/pages/search/SearchClientView.js.map +1 -0
  292. package/dist/pages/search/index.cjs +2 -0
  293. package/dist/pages/search/index.cjs.map +1 -0
  294. package/dist/pages/search/index.d.ts +16 -0
  295. package/dist/pages/search/index.js +11 -0
  296. package/dist/pages/search/index.js.map +1 -0
  297. package/dist/pages/sent/SentClientView.cjs +2 -0
  298. package/dist/pages/sent/SentClientView.cjs.map +1 -0
  299. package/dist/pages/sent/SentClientView.d.ts +7 -0
  300. package/dist/pages/sent/SentClientView.js +28 -0
  301. package/dist/pages/sent/SentClientView.js.map +1 -0
  302. package/dist/pages/sent/index.cjs +2 -0
  303. package/dist/pages/sent/index.cjs.map +1 -0
  304. package/dist/pages/sent/index.d.ts +16 -0
  305. package/dist/pages/sent/index.js +11 -0
  306. package/dist/pages/sent/index.js.map +1 -0
  307. package/dist/pages/settings/notifications/SettingsNotificationsClientView.cjs +2 -0
  308. package/dist/pages/settings/notifications/SettingsNotificationsClientView.cjs.map +1 -0
  309. package/dist/pages/settings/notifications/SettingsNotificationsClientView.d.ts +3 -0
  310. package/dist/pages/settings/notifications/SettingsNotificationsClientView.js +28 -0
  311. package/dist/pages/settings/notifications/SettingsNotificationsClientView.js.map +1 -0
  312. package/dist/pages/settings/notifications/index.cjs +2 -0
  313. package/dist/pages/settings/notifications/index.cjs.map +1 -0
  314. package/dist/pages/settings/notifications/index.d.ts +4 -0
  315. package/dist/pages/settings/notifications/index.js +14 -0
  316. package/dist/pages/settings/notifications/index.js.map +1 -0
  317. package/dist/pages/templates/TemplatesClientView.cjs +2 -0
  318. package/dist/pages/templates/TemplatesClientView.cjs.map +1 -0
  319. package/dist/pages/templates/TemplatesClientView.d.ts +3 -0
  320. package/dist/pages/templates/TemplatesClientView.js +28 -0
  321. package/dist/pages/templates/TemplatesClientView.js.map +1 -0
  322. package/dist/pages/templates/categories/TemplateCategoriesClientView.cjs +2 -0
  323. package/dist/pages/templates/categories/TemplateCategoriesClientView.cjs.map +1 -0
  324. package/dist/pages/templates/categories/TemplateCategoriesClientView.d.ts +3 -0
  325. package/dist/pages/templates/categories/TemplateCategoriesClientView.js +28 -0
  326. package/dist/pages/templates/categories/TemplateCategoriesClientView.js.map +1 -0
  327. package/dist/pages/templates/categories/index.cjs +2 -0
  328. package/dist/pages/templates/categories/index.cjs.map +1 -0
  329. package/dist/pages/templates/categories/index.d.ts +4 -0
  330. package/dist/pages/templates/categories/index.js +14 -0
  331. package/dist/pages/templates/categories/index.js.map +1 -0
  332. package/dist/pages/templates/designer/TemplateDesignerClientView.cjs +2 -0
  333. package/dist/pages/templates/designer/TemplateDesignerClientView.cjs.map +1 -0
  334. package/dist/pages/templates/designer/TemplateDesignerClientView.d.ts +3 -0
  335. package/dist/pages/templates/designer/TemplateDesignerClientView.js +28 -0
  336. package/dist/pages/templates/designer/TemplateDesignerClientView.js.map +1 -0
  337. package/dist/pages/templates/designer/index.cjs +2 -0
  338. package/dist/pages/templates/designer/index.cjs.map +1 -0
  339. package/dist/pages/templates/designer/index.d.ts +10 -0
  340. package/dist/pages/templates/designer/index.js +15 -0
  341. package/dist/pages/templates/designer/index.js.map +1 -0
  342. package/dist/pages/templates/index.cjs +2 -0
  343. package/dist/pages/templates/index.cjs.map +1 -0
  344. package/dist/pages/templates/index.d.ts +4 -0
  345. package/dist/pages/templates/index.js +14 -0
  346. package/dist/pages/templates/index.js.map +1 -0
  347. package/dist/pages/templates/versions/TemplateVersionsClientView.cjs +2 -0
  348. package/dist/pages/templates/versions/TemplateVersionsClientView.cjs.map +1 -0
  349. package/dist/pages/templates/versions/TemplateVersionsClientView.d.ts +3 -0
  350. package/dist/pages/templates/versions/TemplateVersionsClientView.js +28 -0
  351. package/dist/pages/templates/versions/TemplateVersionsClientView.js.map +1 -0
  352. package/dist/pages/templates/versions/index.cjs +2 -0
  353. package/dist/pages/templates/versions/index.cjs.map +1 -0
  354. package/dist/pages/templates/versions/index.d.ts +10 -0
  355. package/dist/pages/templates/versions/index.js +15 -0
  356. package/dist/pages/templates/versions/index.js.map +1 -0
  357. package/dist/templates.css +1 -0
  358. package/dist/views/admin/delegations/AdminDelegationsView.d.ts +5 -0
  359. package/dist/views/admin/delegations/index.cjs +1 -0
  360. package/dist/views/admin/delegations/index.d.ts +1 -0
  361. package/dist/views/admin/delegations/index.js +2 -0
  362. package/dist/views/admin/orgs/AdminOrgsView.d.ts +5 -0
  363. package/dist/views/admin/orgs/index.cjs +1 -0
  364. package/dist/views/admin/orgs/index.d.ts +1 -0
  365. package/dist/views/admin/orgs/index.js +2 -0
  366. package/dist/views/admin/users/AdminUsersView.d.ts +5 -0
  367. package/dist/views/admin/users/index.cjs +1 -0
  368. package/dist/views/admin/users/index.d.ts +1 -0
  369. package/dist/views/admin/users/index.js +2 -0
  370. package/dist/views/cc/CcView.d.ts +9 -0
  371. package/dist/views/cc/index.cjs +1 -0
  372. package/dist/views/cc/index.d.ts +1 -0
  373. package/dist/views/cc/index.js +2 -0
  374. package/dist/views/dashboard/DashboardView.d.ts +9 -0
  375. package/dist/views/dashboard/index.cjs +1 -0
  376. package/dist/views/dashboard/index.d.ts +1 -0
  377. package/dist/views/dashboard/index.js +2 -0
  378. package/dist/views/delegations/DelegationsView.d.ts +5 -0
  379. package/dist/views/delegations/index.cjs +1 -0
  380. package/dist/views/delegations/index.d.ts +1 -0
  381. package/dist/views/delegations/index.js +2 -0
  382. package/dist/views/forms/FormsView.d.ts +4 -0
  383. package/dist/views/forms/builder/FormBuilderView.d.ts +9 -0
  384. package/dist/views/forms/builder/index.cjs +1 -0
  385. package/dist/views/forms/builder/index.d.ts +1 -0
  386. package/dist/views/forms/builder/index.js +2 -0
  387. package/dist/views/forms/builder/json-code-editor.d.ts +11 -0
  388. package/dist/views/forms/form-name-modal.d.ts +12 -0
  389. package/dist/views/forms/index.cjs +1 -0
  390. package/dist/views/forms/index.d.ts +1 -0
  391. package/dist/views/forms/index.js +2 -0
  392. package/dist/views/forms/renderer/FormRendererView.d.ts +19 -0
  393. package/dist/views/forms/renderer/index.cjs +1 -0
  394. package/dist/views/forms/renderer/index.d.ts +1 -0
  395. package/dist/views/forms/renderer/index.js +2 -0
  396. package/dist/views/inbox/InboxView.d.ts +9 -0
  397. package/dist/views/inbox/index.cjs +1 -0
  398. package/dist/views/inbox/index.d.ts +1 -0
  399. package/dist/views/inbox/index.js +2 -0
  400. package/dist/views/instances/detail/InstanceDetailView.d.ts +12 -0
  401. package/dist/views/instances/detail/index.cjs +1 -0
  402. package/dist/views/instances/detail/index.d.ts +1 -0
  403. package/dist/views/instances/detail/index.js +2 -0
  404. package/dist/views/instances/new/InstanceNewView.d.ts +15 -0
  405. package/dist/views/instances/new/index.cjs +1 -0
  406. package/dist/views/instances/new/index.d.ts +1 -0
  407. package/dist/views/instances/new/index.js +2 -0
  408. package/dist/views/login/LoginView.d.ts +47 -0
  409. package/dist/views/login/index.cjs +1 -0
  410. package/dist/views/login/index.d.ts +1 -0
  411. package/dist/views/login/index.js +2 -0
  412. package/dist/views/root/RootView.d.ts +12 -0
  413. package/dist/views/root/index.d.ts +1 -0
  414. package/dist/views/search/SearchView.d.ts +9 -0
  415. package/dist/views/search/index.cjs +1 -0
  416. package/dist/views/search/index.d.ts +1 -0
  417. package/dist/views/search/index.js +2 -0
  418. package/dist/views/sent/SentView.d.ts +9 -0
  419. package/dist/views/sent/index.cjs +1 -0
  420. package/dist/views/sent/index.d.ts +1 -0
  421. package/dist/views/sent/index.js +2 -0
  422. package/dist/views/settings/notifications/SettingsNotificationsView.d.ts +5 -0
  423. package/dist/views/settings/notifications/index.cjs +1 -0
  424. package/dist/views/settings/notifications/index.d.ts +1 -0
  425. package/dist/views/settings/notifications/index.js +2 -0
  426. package/dist/views/templates/TemplatesView.d.ts +5 -0
  427. package/dist/views/templates/categories/TemplateCategoriesView.d.ts +5 -0
  428. package/dist/views/templates/categories/index.cjs +1 -0
  429. package/dist/views/templates/categories/index.d.ts +1 -0
  430. package/dist/views/templates/categories/index.js +2 -0
  431. package/dist/views/templates/designer/TemplateDesignerView.d.ts +6 -0
  432. package/dist/views/templates/designer/index.cjs +1 -0
  433. package/dist/views/templates/designer/index.d.ts +1 -0
  434. package/dist/views/templates/designer/index.js +2 -0
  435. package/dist/views/templates/index.cjs +1 -0
  436. package/dist/views/templates/index.d.ts +1 -0
  437. package/dist/views/templates/index.js +2 -0
  438. package/dist/views/templates/template-name-modal.d.ts +22 -0
  439. package/dist/views/templates/versions/TemplateVersionsView.d.ts +6 -0
  440. package/dist/views/templates/versions/index.cjs +1 -0
  441. package/dist/views/templates/versions/index.d.ts +1 -0
  442. package/dist/views/templates/versions/index.js +2 -0
  443. package/package.json +272 -0
@@ -0,0 +1,140 @@
1
+ "use client";
2
+ import { useMemo as e, useState as t } from "react";
3
+ import { AutoComplete as n, Select as r } from "@mezzanine-ui/react";
4
+ import { searchMembers as i } from "@rytass/bpm-core-client";
5
+ import { jsx as a } from "react/jsx-runtime";
6
+ import '../admin-pickers.css';var o = { pickerHost: "bpm_pickerHost_Sw6gz" };
7
+ //#endregion
8
+ //#region src/components/admin-pickers.tsx
9
+ function s({ disabled: e = !1, name: r, onChange: s, placeholder: c = "搜尋姓名或信箱", size: l, value: d }) {
10
+ let [f, m] = t(!1), [h, v] = t(d ? [d] : []);
11
+ async function y(e) {
12
+ m(!0);
13
+ try {
14
+ v((await i(e)).map(u));
15
+ } finally {
16
+ m(!1);
17
+ }
18
+ }
19
+ return /* @__PURE__ */ a("div", {
20
+ className: o.pickerHost,
21
+ children: /* @__PURE__ */ a(n, {
22
+ asyncData: !0,
23
+ disabled: e,
24
+ disabledOptionsFilter: !0,
25
+ emptyText: "沒有符合的會員",
26
+ inputProps: {
27
+ autoCapitalize: "none",
28
+ autoCorrect: "off",
29
+ name: r,
30
+ spellCheck: !1
31
+ },
32
+ loading: f,
33
+ loadingText: "搜尋會員中...",
34
+ mode: "single",
35
+ onChange: (e) => s(p(e)),
36
+ onSearch: y,
37
+ onSearchTextChange: (e) => s(g(e, h)),
38
+ onVisibilityChange: (e) => {
39
+ e && y("");
40
+ },
41
+ options: [..._(d ? [d] : [], h)],
42
+ placeholder: c,
43
+ searchDebounceTime: 300,
44
+ size: l,
45
+ value: d
46
+ })
47
+ });
48
+ }
49
+ function c({ disabled: t = !1, onChange: n, orgUnits: i, placeholder: s = "選擇組織", size: c, value: l }) {
50
+ let u = e(() => i.map(d), [i]);
51
+ return /* @__PURE__ */ a("div", {
52
+ className: o.pickerHost,
53
+ children: /* @__PURE__ */ a(r, {
54
+ clearable: !0,
55
+ disabled: t,
56
+ fullWidth: !0,
57
+ onChange: (e) => n(m(e)),
58
+ options: [...u],
59
+ placeholder: s,
60
+ size: c,
61
+ value: l
62
+ })
63
+ });
64
+ }
65
+ function l({ disabled: t = !1, onChange: n, placeholder: i = "選擇職位", positions: s, size: c, value: l }) {
66
+ let u = e(() => s.map(f), [s]);
67
+ return /* @__PURE__ */ a("div", {
68
+ className: o.pickerHost,
69
+ children: /* @__PURE__ */ a(r, {
70
+ clearable: !0,
71
+ disabled: t,
72
+ fullWidth: !0,
73
+ onChange: (e) => n(h(e)),
74
+ options: [...u],
75
+ placeholder: i,
76
+ size: c,
77
+ value: l
78
+ })
79
+ });
80
+ }
81
+ function u(e) {
82
+ return {
83
+ email: e.email,
84
+ id: e.memberId,
85
+ name: `${e.name} · ${e.email}`
86
+ };
87
+ }
88
+ function d(e) {
89
+ return {
90
+ id: e.id,
91
+ name: `${e.name} · ${e.code}`
92
+ };
93
+ }
94
+ function f(e) {
95
+ return {
96
+ id: e.id,
97
+ name: `${e.name} · ${e.code}`
98
+ };
99
+ }
100
+ function p(e) {
101
+ if (!v(e)) return null;
102
+ let t = e.email, n = e.id, r = e.name;
103
+ return typeof t == "string" && typeof n == "string" && typeof r == "string" ? {
104
+ email: t,
105
+ id: n,
106
+ name: r
107
+ } : null;
108
+ }
109
+ function m(e) {
110
+ if (!v(e)) return null;
111
+ let t = e.id, n = e.name;
112
+ return typeof t == "string" && typeof n == "string" ? {
113
+ id: t,
114
+ name: n
115
+ } : null;
116
+ }
117
+ function h(e) {
118
+ if (!v(e)) return null;
119
+ let t = e.id, n = e.name;
120
+ return typeof t == "string" && typeof n == "string" ? {
121
+ id: t,
122
+ name: n
123
+ } : null;
124
+ }
125
+ function g(e, t) {
126
+ let n = e.trim().toLocaleLowerCase();
127
+ if (!n) return null;
128
+ let r = t.filter((e) => e.id.toLocaleLowerCase() === n || e.email.toLocaleLowerCase() === n || e.name.toLocaleLowerCase() === n);
129
+ return r.length === 1 ? r[0] : null;
130
+ }
131
+ function _(e, t) {
132
+ return [...new Map([...e, ...t].map((e) => [e.id, e])).values()];
133
+ }
134
+ function v(e) {
135
+ return typeof e == "object" && !!e;
136
+ }
137
+ //#endregion
138
+ export { d as a, u as i, c as n, f as o, l as r, s as t };
139
+
140
+ //# sourceMappingURL=admin-pickers-DLlG_1du.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-pickers-DLlG_1du.js","names":[],"sources":["../../src/components/admin-pickers.module.scss","../../src/components/admin-pickers.tsx"],"sourcesContent":[".pickerHost {\n width: 100%;\n min-width: 0;\n\n :global(.mzn-auto-complete),\n :global(.mzn-input),\n :global(.mzn-input-container),\n :global(.mzn-select),\n :global(.mzn-select-trigger),\n :global(.mzn-text-field) {\n width: 100%;\n min-width: 0 !important;\n }\n}\n","'use client';\n\nimport { useMemo, useState, type ReactElement } from 'react';\nimport { AutoComplete, Select } from '@mezzanine-ui/react';\nimport { searchMembers } from '@rytass/bpm-core-client';\nimport type {\n OrgUnitRecord,\n PositionRecord,\n} from '@rytass/bpm-core-client/organization';\nimport styles from './admin-pickers.module.scss';\n\nexport type MemberOption = Readonly<{\n email: string;\n id: string;\n name: string;\n}>;\n\nexport type OrgUnitOption = Readonly<{\n id: string;\n name: string;\n}>;\n\nexport type PositionOption = Readonly<{\n id: string;\n name: string;\n}>;\n\ninterface MemberPickerProps {\n readonly disabled?: boolean;\n readonly name: string;\n readonly onChange: (option: MemberOption | null) => void;\n readonly placeholder?: string;\n readonly size?: 'main' | 'sub';\n readonly value: MemberOption | null;\n}\n\ninterface OrgUnitPickerProps {\n readonly disabled?: boolean;\n readonly name: string;\n readonly onChange: (option: OrgUnitOption | null) => void;\n readonly orgUnits: readonly OrgUnitRecord[];\n readonly placeholder?: string;\n readonly size?: 'main' | 'sub';\n readonly value: OrgUnitOption | null;\n}\n\ninterface PositionPickerProps {\n readonly disabled?: boolean;\n readonly name: string;\n readonly onChange: (option: PositionOption | null) => void;\n readonly placeholder?: string;\n readonly positions: readonly PositionRecord[];\n readonly size?: 'main' | 'sub';\n readonly value: PositionOption | null;\n}\n\n/**\n * AutoComplete-backed picker that searches the BPM member directory via\n * `searchMembers()`. Emits a {@link MemberOption} `{ id, name, email }`\n * on selection (or `null` when cleared).\n */\nexport function MemberPicker({\n disabled = false,\n name,\n onChange,\n placeholder = '搜尋姓名或信箱',\n size,\n value,\n}: MemberPickerProps): ReactElement {\n const [loading, setLoading] = useState(false);\n const [options, setOptions] = useState<readonly MemberOption[]>(\n value ? [value] : [],\n );\n\n async function handleSearch(searchText: string): Promise<void> {\n setLoading(true);\n try {\n setOptions((await searchMembers(searchText)).map(readMemberOption));\n } finally {\n setLoading(false);\n }\n }\n\n return (\n <div className={styles.pickerHost}>\n <AutoComplete\n asyncData\n disabled={disabled}\n disabledOptionsFilter\n emptyText=\"沒有符合的會員\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name,\n spellCheck: false,\n }}\n loading={loading}\n loadingText=\"搜尋會員中...\"\n mode=\"single\"\n onChange={(option): void => onChange(readMemberOptionFromValue(option))}\n onSearch={handleSearch}\n onSearchTextChange={(searchText): void =>\n onChange(readUniqueOption(searchText, options))\n }\n onVisibilityChange={(open): void => {\n if (open) {\n void handleSearch('');\n }\n }}\n options={[...mergeMemberOptions(value ? [value] : [], options)]}\n placeholder={placeholder}\n searchDebounceTime={300}\n size={size}\n value={value}\n />\n </div>\n );\n}\n\n/**\n * Static `<Select>` over a pre-fetched list of org units. Caller is\n * responsible for fetching the org units (typically via\n * `readOrganizationDashboard` from `@rytass/bpm-core-client/organization`).\n */\nexport function OrgUnitPicker({\n disabled = false,\n onChange,\n orgUnits,\n placeholder = '選擇組織',\n size,\n value,\n}: OrgUnitPickerProps): ReactElement {\n const options = useMemo(\n (): readonly OrgUnitOption[] => orgUnits.map(readOrgUnitOption),\n [orgUnits],\n );\n return (\n <div className={styles.pickerHost}>\n <Select\n clearable\n disabled={disabled}\n fullWidth\n onChange={(option): void => onChange(readOrgUnitOptionFromValue(option))}\n options={[...options]}\n placeholder={placeholder}\n size={size}\n value={value}\n />\n </div>\n );\n}\n\n/**\n * Static `<Select>` over a pre-fetched list of positions.\n */\nexport function PositionPicker({\n disabled = false,\n onChange,\n placeholder = '選擇職位',\n positions,\n size,\n value,\n}: PositionPickerProps): ReactElement {\n const options = useMemo(\n (): readonly PositionOption[] => positions.map(readPositionOption),\n [positions],\n );\n return (\n <div className={styles.pickerHost}>\n <Select\n clearable\n disabled={disabled}\n fullWidth\n onChange={(option): void => onChange(readPositionOptionFromValue(option))}\n options={[...options]}\n placeholder={placeholder}\n size={size}\n value={value}\n />\n </div>\n );\n}\n\nexport function readMemberOption(member: {\n readonly email: string;\n readonly memberId: string;\n readonly name: string;\n}): MemberOption {\n return {\n email: member.email,\n id: member.memberId,\n name: `${member.name} · ${member.email}`,\n };\n}\n\nexport function readOrgUnitOption(orgUnit: OrgUnitRecord): OrgUnitOption {\n return { id: orgUnit.id, name: `${orgUnit.name} · ${orgUnit.code}` };\n}\n\nexport function readPositionOption(position: PositionRecord): PositionOption {\n return { id: position.id, name: `${position.name} · ${position.code}` };\n}\n\nfunction readMemberOptionFromValue(value: unknown): MemberOption | null {\n if (!isRecord(value)) return null;\n const email = value.email;\n const id = value.id;\n const name = value.name;\n return typeof email === 'string' &&\n typeof id === 'string' &&\n typeof name === 'string'\n ? { email, id, name }\n : null;\n}\n\nfunction readOrgUnitOptionFromValue(value: unknown): OrgUnitOption | null {\n if (!isRecord(value)) return null;\n const id = value.id;\n const name = value.name;\n return typeof id === 'string' && typeof name === 'string'\n ? { id, name }\n : null;\n}\n\nfunction readPositionOptionFromValue(value: unknown): PositionOption | null {\n if (!isRecord(value)) return null;\n const id = value.id;\n const name = value.name;\n return typeof id === 'string' && typeof name === 'string'\n ? { id, name }\n : null;\n}\n\nfunction readUniqueOption(\n searchText: string,\n options: readonly MemberOption[],\n): MemberOption | null {\n const normalized = searchText.trim().toLocaleLowerCase();\n if (!normalized) return null;\n const matched = options.filter(\n (option) =>\n option.id.toLocaleLowerCase() === normalized ||\n option.email.toLocaleLowerCase() === normalized ||\n option.name.toLocaleLowerCase() === normalized,\n );\n return matched.length === 1 ? matched[0] : null;\n}\n\nfunction mergeMemberOptions(\n selected: readonly MemberOption[],\n options: readonly MemberOption[],\n): readonly MemberOption[] {\n const byId = new Map(\n [...selected, ...options].map(\n (option): readonly [string, MemberOption] => [option.id, option],\n ),\n );\n return [...byId.values()];\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":"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"}
@@ -0,0 +1,263 @@
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 { createContext as n, useCallback as r, useContext as i, useEffect as a, useMemo as o, useState as s } from "react";
5
+ import { Navigation as c, NavigationFooter as l, NavigationHeader as u, NavigationIconButton as d, NavigationOption as f, NavigationOptionCategory as p, NavigationUserMenu as m } from "@mezzanine-ui/react";
6
+ import { logoutApi as h } from "@rytass/bpm-core-client";
7
+ import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
8
+ import { readUnreadNotificationCount as y } from "@rytass/bpm-core-client/workflow";
9
+ import { FileIcon as b, FolderIcon as x, HomeIcon as S, ListIcon as C, LogoutIcon as w, MailIcon as T, MailUnreadIcon as E, NotificationUnreadIcon as D, SearchIcon as O, ShareIcon as k, SwitchHorizontalIcon as A, SystemIcon as j, UserIcon as M } from "@mezzanine-ui/icons";
10
+ import '../app-navigation.css';//#region src/lib/notification-drawer-provider.tsx
11
+ var N = n(null);
12
+ function P({ children: e }) {
13
+ let [t, n] = s(!1), i = r(() => {
14
+ n(!0);
15
+ }, []), a = r(() => {
16
+ n(!1);
17
+ }, []), c = r(() => {
18
+ n((e) => !e);
19
+ }, []), l = o(() => ({
20
+ close: a,
21
+ isOpen: t,
22
+ open: i,
23
+ toggle: c
24
+ }), [
25
+ a,
26
+ t,
27
+ i,
28
+ c
29
+ ]);
30
+ return /* @__PURE__ */ _(N.Provider, {
31
+ value: l,
32
+ children: e
33
+ });
34
+ }
35
+ function F() {
36
+ return i(N) || {
37
+ close: () => void 0,
38
+ isOpen: !1,
39
+ open: () => void 0,
40
+ toggle: () => void 0
41
+ };
42
+ }
43
+ //#endregion
44
+ //#region src/lib/notification-unread-provider.tsx
45
+ var I = n(null);
46
+ function L({ children: e }) {
47
+ let { member: n } = t(), i = n?.memberId ?? null, [c, l] = s(0), u = r(async () => {
48
+ if (!i) return l(0), 0;
49
+ let e = await y(i);
50
+ return l(e), e;
51
+ }, [i]);
52
+ a(() => {
53
+ let e = !0;
54
+ return (async () => {
55
+ try {
56
+ let t = await u();
57
+ e && l(t);
58
+ } catch {
59
+ e && l(0);
60
+ }
61
+ })(), () => {
62
+ e = !1;
63
+ };
64
+ }, [u]);
65
+ let d = o(() => ({
66
+ refreshUnreadCount: u,
67
+ unreadCount: c
68
+ }), [u, c]);
69
+ return /* @__PURE__ */ _(I.Provider, {
70
+ value: d,
71
+ children: e
72
+ });
73
+ }
74
+ function R() {
75
+ return i(I) || {
76
+ refreshUnreadCount: async () => 0,
77
+ unreadCount: 0
78
+ };
79
+ }
80
+ var z = {
81
+ logo: "bpm_logo_QvBLU",
82
+ notificationBell: "bpm_notificationBell_W-wl7",
83
+ notificationBadge: "bpm_notificationBadge_Gy3Eq"
84
+ }, B = [
85
+ {
86
+ title: "我的工作",
87
+ items: [
88
+ {
89
+ href: "/dashboard",
90
+ icon: S,
91
+ label: "工作台"
92
+ },
93
+ {
94
+ href: "/inbox",
95
+ icon: E,
96
+ label: "我的待簽"
97
+ },
98
+ {
99
+ href: "/sent",
100
+ icon: T,
101
+ label: "我發起的"
102
+ },
103
+ {
104
+ href: "/cc",
105
+ icon: k,
106
+ label: "抄送給我"
107
+ }
108
+ ]
109
+ },
110
+ {
111
+ title: "查詢與代理",
112
+ items: [{
113
+ href: "/search",
114
+ icon: O,
115
+ label: "搜尋"
116
+ }, {
117
+ href: "/delegations",
118
+ icon: A,
119
+ label: "個人代理"
120
+ }]
121
+ },
122
+ {
123
+ title: "簽核設計",
124
+ items: [
125
+ {
126
+ href: "/templates",
127
+ icon: x,
128
+ label: "簽核模板",
129
+ requiresAdmin: !0
130
+ },
131
+ {
132
+ href: "/templates/categories",
133
+ icon: C,
134
+ label: "模板分類",
135
+ requiresAdmin: !0
136
+ },
137
+ {
138
+ href: "/forms",
139
+ icon: b,
140
+ label: "表單設計",
141
+ requiresAdmin: !0
142
+ }
143
+ ]
144
+ },
145
+ {
146
+ title: "系統管理",
147
+ items: [
148
+ {
149
+ href: "/admin/orgs",
150
+ icon: j,
151
+ label: "組織管理",
152
+ requiresAdmin: !0
153
+ },
154
+ {
155
+ href: "/admin/users",
156
+ icon: M,
157
+ label: "會員對照",
158
+ requiresAdmin: !0
159
+ },
160
+ {
161
+ href: "/admin/delegations",
162
+ icon: k,
163
+ label: "代理設定",
164
+ requiresAdmin: !0
165
+ }
166
+ ]
167
+ }
168
+ ];
169
+ function V({ activeHref: n, logoSrc: r = "/rytass-logo.png", title: i = "BPM Admin", groups: a = B } = {}) {
170
+ let o = e(), { member: s } = t(), { unreadCount: g } = R(), y = n ?? o.pathname ?? "", b = H(s), x = a.map((e) => ({
171
+ title: e.title,
172
+ items: e.items.filter((e) => !e.requiresAdmin || b)
173
+ })).filter((e) => e.items.length > 0), S = async () => {
174
+ await h(), o.replace("/login");
175
+ };
176
+ return /* @__PURE__ */ _(c, {
177
+ exactActivatedMatch: !0,
178
+ children: [
179
+ /* @__PURE__ */ _(u, {
180
+ title: i,
181
+ children: /* @__PURE__ */ _("img", {
182
+ alt: "",
183
+ className: z.logo,
184
+ height: 24,
185
+ src: r,
186
+ width: 24
187
+ })
188
+ }, "header"),
189
+ ...x.map((e) => /* @__PURE__ */ _(p, {
190
+ title: e.title,
191
+ children: e.items.map((e) => /* @__PURE__ */ _(f, {
192
+ active: e.href === y,
193
+ href: e.href,
194
+ icon: e.icon,
195
+ title: e.label
196
+ }, e.href))
197
+ }, e.title)),
198
+ /* @__PURE__ */ v(l, { children: [
199
+ /* @__PURE__ */ _(m, {
200
+ options: [{
201
+ id: "notification-settings",
202
+ name: "通知設定"
203
+ }, {
204
+ id: "logout",
205
+ name: "登出"
206
+ }],
207
+ onSelect: (e) => {
208
+ if (e.id === "notification-settings") {
209
+ o.push("/settings/notifications");
210
+ return;
211
+ }
212
+ e.id === "logout" && S();
213
+ },
214
+ children: /* @__PURE__ */ _(W, {})
215
+ }),
216
+ /* @__PURE__ */ _(U, { unreadCount: g }),
217
+ /* @__PURE__ */ _(d, {
218
+ "aria-label": "登出",
219
+ icon: w,
220
+ onClick: () => {
221
+ S();
222
+ },
223
+ title: "登出",
224
+ type: "button"
225
+ })
226
+ ] }, "footer")
227
+ ]
228
+ });
229
+ }
230
+ function H(e) {
231
+ return e ? (e.roles ?? []).includes("BPM_ADMIN") || (e.permissions ?? []).some((e) => [
232
+ "bpm:*",
233
+ "bpm:admin",
234
+ "bpm.admin",
235
+ "bpm:admin:*"
236
+ ].includes(e)) : !1;
237
+ }
238
+ function U({ unreadCount: e }) {
239
+ let { open: t } = F();
240
+ return /* @__PURE__ */ v("span", {
241
+ className: z.notificationBell,
242
+ children: [/* @__PURE__ */ _(d, {
243
+ "aria-label": e > 0 ? `通知中心,${e} 則未讀` : "通知中心",
244
+ icon: D,
245
+ onClick: () => {
246
+ t();
247
+ },
248
+ title: "通知中心",
249
+ type: "button"
250
+ }), e > 0 ? /* @__PURE__ */ _("span", {
251
+ className: z.notificationBadge,
252
+ children: e > 99 ? "99+" : e
253
+ }) : null]
254
+ });
255
+ }
256
+ function W() {
257
+ let { member: e } = t();
258
+ return e ? /* @__PURE__ */ _(g, { children: e.name }) : null;
259
+ }
260
+ //#endregion
261
+ export { F as a, P as i, L as n, R as r, V as t };
262
+
263
+ //# sourceMappingURL=app-navigation-CATITRM7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-navigation-CATITRM7.js","names":[],"sources":["../../src/lib/notification-drawer-provider.tsx","../../src/lib/notification-unread-provider.tsx","../../src/components/app-navigation.module.scss","../../src/components/app-navigation.tsx"],"sourcesContent":["'use client';\n\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n type ReactElement,\n type ReactNode,\n} from 'react';\n\ninterface NotificationDrawerContextValue {\n readonly close: () => void;\n readonly isOpen: boolean;\n readonly open: () => void;\n readonly toggle: () => void;\n}\n\nconst NotificationDrawerContext =\n createContext<NotificationDrawerContextValue | null>(null);\n\ninterface NotificationDrawerProviderProps {\n readonly children: ReactNode;\n}\n\n/**\n * Controls the open/closed state of the BPM notification drawer. Wraps\n * children with a context that `<NotificationDrawer />` reads to mount /\n * hide itself, and that `<AppNavigation />` reads to open the drawer when\n * the bell icon is clicked.\n *\n * When used outside this provider, the returned hook is a safe no-op so\n * components don't crash in test or storybook environments.\n */\nexport function NotificationDrawerProvider({\n children,\n}: NotificationDrawerProviderProps): ReactElement {\n const [isOpen, setIsOpen] = useState(false);\n\n const open = useCallback((): void => {\n setIsOpen(true);\n }, []);\n const close = useCallback((): void => {\n setIsOpen(false);\n }, []);\n const toggle = useCallback((): void => {\n setIsOpen((current) => !current);\n }, []);\n\n const value = useMemo<NotificationDrawerContextValue>(\n () => ({ close, isOpen, open, toggle }),\n [close, isOpen, open, toggle],\n );\n\n return (\n <NotificationDrawerContext.Provider value={value}>\n {children}\n </NotificationDrawerContext.Provider>\n );\n}\n\n/**\n * Read the BPM notification drawer's open state and control helpers.\n * Returns a no-op stub when used outside `<NotificationDrawerProvider>`.\n */\nexport function useNotificationDrawer(): NotificationDrawerContextValue {\n const context = useContext(NotificationDrawerContext);\n if (!context) {\n return {\n close: (): void => undefined,\n isOpen: false,\n open: (): void => undefined,\n toggle: (): void => undefined,\n };\n }\n return context;\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 { readUnreadNotificationCount } from '@rytass/bpm-core-client/workflow';\nimport { useAuth } from './auth-provider';\n\ninterface NotificationUnreadContextValue {\n readonly refreshUnreadCount: () => Promise<number>;\n readonly unreadCount: number;\n}\n\nconst NotificationUnreadContext =\n createContext<NotificationUnreadContextValue | null>(null);\n\ninterface NotificationUnreadProviderProps {\n readonly children: ReactNode;\n}\n\n/**\n * Polls BPM for the current member's unread notification count via\n * `readUnreadNotificationCount` and exposes it through context for\n * `<AppNavigation />` (bell badge) and `<NotificationDrawer />` (header\n * count). Refresh is triggered on mount and whenever the auth member id\n * changes; consumers can call `refreshUnreadCount()` after acknowledging\n * a notification.\n */\nexport function NotificationUnreadProvider({\n children,\n}: NotificationUnreadProviderProps): ReactElement {\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [unreadCount, setUnreadCount] = useState(0);\n\n const refreshUnreadCount = useCallback(async (): Promise<number> => {\n if (!currentMemberId) {\n setUnreadCount(0);\n return 0;\n }\n const next = await readUnreadNotificationCount(currentMemberId);\n setUnreadCount(next);\n return next;\n }, [currentMemberId]);\n\n useEffect((): (() => void) => {\n let active = true;\n void (async () => {\n try {\n const next = await refreshUnreadCount();\n if (active) setUnreadCount(next);\n } catch {\n if (active) setUnreadCount(0);\n }\n })();\n return (): void => {\n active = false;\n };\n }, [refreshUnreadCount]);\n\n const value = useMemo<NotificationUnreadContextValue>(\n () => ({ refreshUnreadCount, unreadCount }),\n [refreshUnreadCount, unreadCount],\n );\n\n return (\n <NotificationUnreadContext.Provider value={value}>\n {children}\n </NotificationUnreadContext.Provider>\n );\n}\n\n/**\n * Read the current unread-notification count and a manual refresh helper.\n * Returns a zero/no-op stub when used outside\n * `<NotificationUnreadProvider>`.\n */\nexport function useNotificationUnread(): NotificationUnreadContextValue {\n const context = useContext(NotificationUnreadContext);\n if (!context) {\n return {\n refreshUnreadCount: async (): Promise<number> => 0,\n unreadCount: 0,\n };\n }\n return context;\n}\n",".logo {\n display: block;\n height: 24px;\n margin: auto;\n object-fit: contain;\n width: 24px;\n}\n\n.notificationBell {\n display: inline-flex;\n position: relative;\n}\n\n.notificationBadge {\n align-items: center;\n background: #d92d20;\n border: 1px solid #fff;\n border-radius: 999px;\n color: #fff;\n display: inline-flex;\n font-size: 10px;\n font-weight: 600;\n height: 16px;\n justify-content: center;\n line-height: 1;\n min-width: 16px;\n padding: 0 4px;\n pointer-events: none;\n position: absolute;\n right: -4px;\n top: -4px;\n}\n","'use client';\n\nimport type { ReactElement } from 'react';\nimport {\n Navigation,\n NavigationFooter,\n NavigationHeader,\n NavigationIconButton,\n NavigationOption,\n NavigationOptionCategory,\n NavigationUserMenu,\n} from '@mezzanine-ui/react';\nimport {\n FileIcon,\n FolderIcon,\n HomeIcon,\n ListIcon,\n LogoutIcon,\n MailIcon,\n MailUnreadIcon,\n NotificationUnreadIcon,\n SearchIcon,\n ShareIcon,\n SystemIcon,\n SwitchHorizontalIcon,\n UserIcon,\n type IconDefinition,\n} from '@mezzanine-ui/icons';\nimport { logoutApi } from '@rytass/bpm-core-client';\nimport { useAuth } from '../lib/auth-provider';\nimport { useRouterAdapter } from '../lib/router-adapter';\nimport { useNotificationDrawer } from '../lib/notification-drawer-provider';\nimport { useNotificationUnread } from '../lib/notification-unread-provider';\nimport styles from './app-navigation.module.scss';\n\ninterface NavigationItem {\n readonly href: string;\n readonly icon: IconDefinition;\n readonly label: string;\n readonly requiresAdmin?: boolean;\n}\n\ninterface NavigationGroup {\n readonly title: string;\n readonly items: readonly NavigationItem[];\n}\n\nconst DEFAULT_NAVIGATION_GROUPS: readonly NavigationGroup[] = [\n {\n title: '我的工作',\n items: [\n { href: '/dashboard', icon: HomeIcon, label: '工作台' },\n { href: '/inbox', icon: MailUnreadIcon, label: '我的待簽' },\n { href: '/sent', icon: MailIcon, label: '我發起的' },\n { href: '/cc', icon: ShareIcon, label: '抄送給我' },\n ],\n },\n {\n title: '查詢與代理',\n items: [\n { href: '/search', icon: SearchIcon, label: '搜尋' },\n { href: '/delegations', icon: SwitchHorizontalIcon, label: '個人代理' },\n ],\n },\n {\n title: '簽核設計',\n items: [\n { href: '/templates', icon: FolderIcon, label: '簽核模板', requiresAdmin: true },\n { href: '/templates/categories', icon: ListIcon, label: '模板分類', requiresAdmin: true },\n { href: '/forms', icon: FileIcon, label: '表單設計', requiresAdmin: true },\n ],\n },\n {\n title: '系統管理',\n items: [\n { href: '/admin/orgs', icon: SystemIcon, label: '組織管理', requiresAdmin: true },\n { href: '/admin/users', icon: UserIcon, label: '會員對照', requiresAdmin: true },\n { href: '/admin/delegations', icon: ShareIcon, label: '代理設定', requiresAdmin: true },\n ],\n },\n];\n\nexport interface AppNavigationProps {\n /** Override the active href detection (defaults to router's pathname). */\n readonly activeHref?: string;\n /** Logo image URL displayed in the sidebar header. */\n readonly logoSrc?: string;\n /** Sidebar title (defaults to \"BPM Admin\"). */\n readonly title?: string;\n /**\n * Override the entire navigation tree. When omitted, the default 4-group\n * BPM admin nav (`我的工作` / `查詢與代理` / `簽核設計` / `系統管理`) is used.\n */\n readonly groups?: readonly NavigationGroup[];\n}\n\n/**\n * BPM admin sidebar — composes Mezzanine UI `<Navigation>` with the\n * default 4-group BPM tree. Reads `useAuth` to gate admin-only routes,\n * `useNotificationUnread` to render the bell badge count, and the host's\n * `RouterAdapter` to derive the active route. Calls `logoutApi()` and\n * navigates back to `/login` on logout.\n */\nexport function AppNavigation({\n activeHref,\n logoSrc = '/rytass-logo.png',\n title = 'BPM Admin',\n groups = DEFAULT_NAVIGATION_GROUPS,\n}: AppNavigationProps = {}): ReactElement {\n const router = useRouterAdapter();\n const { member } = useAuth();\n const { unreadCount } = useNotificationUnread();\n const resolvedActive = activeHref ?? router.pathname ?? '';\n const isAdmin = isAdminMember(member);\n const visibleGroups = groups\n .map((group) => ({\n title: group.title,\n items: group.items.filter((item) => !item.requiresAdmin || isAdmin),\n }))\n .filter((group) => group.items.length > 0);\n\n const handleLogout = async (): Promise<void> => {\n await logoutApi();\n router.replace('/login');\n };\n\n const children = [\n <NavigationHeader key=\"header\" title={title}>\n <img alt=\"\" className={styles.logo} height={24} src={logoSrc} width={24} />\n </NavigationHeader>,\n ...visibleGroups.map((group) => (\n <NavigationOptionCategory key={group.title} title={group.title}>\n {group.items.map((item) => (\n <NavigationOption\n active={item.href === resolvedActive}\n href={item.href}\n icon={item.icon}\n key={item.href}\n title={item.label}\n />\n ))}\n </NavigationOptionCategory>\n )),\n <NavigationFooter key=\"footer\">\n <NavigationUserMenu\n options={[\n { id: 'notification-settings', name: '通知設定' },\n { id: 'logout', name: '登出' },\n ]}\n onSelect={(option): void => {\n if (option.id === 'notification-settings') {\n router.push('/settings/notifications');\n return;\n }\n if (option.id === 'logout') {\n void handleLogout();\n }\n }}\n >\n <NavigationMemberName />\n </NavigationUserMenu>\n <NotificationBell unreadCount={unreadCount} />\n <NavigationIconButton\n aria-label=\"登出\"\n icon={LogoutIcon}\n onClick={(): void => {\n void handleLogout();\n }}\n title=\"登出\"\n type=\"button\"\n />\n </NavigationFooter>,\n ];\n\n return <Navigation exactActivatedMatch>{children}</Navigation>;\n}\n\nfunction isAdminMember(member: ReturnType<typeof useAuth>['member']): boolean {\n if (!member) return false;\n return (\n (member.roles ?? []).includes('BPM_ADMIN') ||\n (member.permissions ?? []).some((p) =>\n ['bpm:*', 'bpm:admin', 'bpm.admin', 'bpm:admin:*'].includes(p),\n )\n );\n}\n\nfunction NotificationBell({\n unreadCount,\n}: {\n readonly unreadCount: number;\n}): ReactElement {\n const { open } = useNotificationDrawer();\n return (\n <span className={styles.notificationBell}>\n <NavigationIconButton\n aria-label={unreadCount > 0 ? `通知中心,${unreadCount} 則未讀` : '通知中心'}\n icon={NotificationUnreadIcon}\n onClick={(): void => {\n open();\n }}\n title=\"通知中心\"\n type=\"button\"\n />\n {unreadCount > 0 ? (\n <span className={styles.notificationBadge}>\n {unreadCount > 99 ? '99+' : unreadCount}\n </span>\n ) : null}\n </span>\n );\n}\n\nfunction NavigationMemberName(): ReactElement | null {\n const { member } = useAuth();\n if (!member) return null;\n return <>{member.name}</>;\n}\n"],"mappings":";;;;;;;;;;AAmBA,IAAM,IACJ,EAAqD,IAAI;AAe3D,SAAgB,EAA2B,EACzC,eACgD;CAChD,IAAM,CAAC,GAAQ,KAAa,EAAS,EAAK,GAEpC,IAAO,QAAwB;EACnC,EAAU,EAAI;CAChB,GAAG,CAAC,CAAC,GACC,IAAQ,QAAwB;EACpC,EAAU,EAAK;CACjB,GAAG,CAAC,CAAC,GACC,IAAS,QAAwB;EACrC,GAAW,MAAY,CAAC,CAAO;CACjC,GAAG,CAAC,CAAC,GAEC,IAAQ,SACL;EAAE;EAAO;EAAQ;EAAM;CAAO,IACrC;EAAC;EAAO;EAAQ;EAAM;CAAM,CAC9B;CAEA,OACE,kBAAC,EAA0B,UAA3B;EAA2C;EACxC;CACiC,CAAA;AAExC;AAMA,SAAgB,IAAwD;CAUtE,OATgB,EAAW,CACtB,KACI;EACL,aAAmB,KAAA;EACnB,QAAQ;EACR,YAAkB,KAAA;EAClB,cAAoB,KAAA;CACtB;AAGJ;;;ACzDA,IAAM,IACJ,EAAqD,IAAI;AAc3D,SAAgB,EAA2B,EACzC,eACgD;CAChD,IAAM,EAAE,cAAW,EAAQ,GACrB,IAAkB,GAAQ,YAAY,MACtC,CAAC,GAAa,KAAkB,EAAS,CAAC,GAE1C,IAAqB,EAAY,YAA6B;EAClE,IAAI,CAAC,GAEH,OADA,EAAe,CAAC,GACT;EAET,IAAM,IAAO,MAAM,EAA4B,CAAe;EAE9D,OADA,EAAe,CAAI,GACZ;CACT,GAAG,CAAC,CAAe,CAAC;CAEpB,QAA8B;EAC5B,IAAI,IAAS;EASb,QARM,YAAY;GAChB,IAAI;IACF,IAAM,IAAO,MAAM,EAAmB;IACtC,AAAI,KAAQ,EAAe,CAAI;GACjC,QAAQ;IACN,AAAI,KAAQ,EAAe,CAAC;GAC9B;EACF,GAAG,SACgB;GACjB,IAAS;EACX;CACF,GAAG,CAAC,CAAkB,CAAC;CAEvB,IAAM,IAAQ,SACL;EAAE;EAAoB;CAAY,IACzC,CAAC,GAAoB,CAAW,CAClC;CAEA,OACE,kBAAC,EAA0B,UAA3B;EAA2C;EACxC;CACiC,CAAA;AAExC;AAOA,SAAgB,IAAwD;CAQtE,OAPgB,EAAW,CACtB,KACI;EACL,oBAAoB,YAA6B;EACjD,aAAa;CACf;AAGJ;;;;;GE9CM,IAAwD;CAC5D;EACE,OAAO;EACP,OAAO;GACL;IAAE,MAAM;IAAc,MAAM;IAAU,OAAO;GAAM;GACnD;IAAE,MAAM;IAAU,MAAM;IAAgB,OAAO;GAAO;GACtD;IAAE,MAAM;IAAS,MAAM;IAAU,OAAO;GAAO;GAC/C;IAAE,MAAM;IAAO,MAAM;IAAW,OAAO;GAAO;EAChD;CACF;CACA;EACE,OAAO;EACP,OAAO,CACL;GAAE,MAAM;GAAW,MAAM;GAAY,OAAO;EAAK,GACjD;GAAE,MAAM;GAAgB,MAAM;GAAsB,OAAO;EAAO,CACpE;CACF;CACA;EACE,OAAO;EACP,OAAO;GACL;IAAE,MAAM;IAAc,MAAM;IAAY,OAAO;IAAQ,eAAe;GAAK;GAC3E;IAAE,MAAM;IAAyB,MAAM;IAAU,OAAO;IAAQ,eAAe;GAAK;GACpF;IAAE,MAAM;IAAU,MAAM;IAAU,OAAO;IAAQ,eAAe;GAAK;EACvE;CACF;CACA;EACE,OAAO;EACP,OAAO;GACL;IAAE,MAAM;IAAe,MAAM;IAAY,OAAO;IAAQ,eAAe;GAAK;GAC5E;IAAE,MAAM;IAAgB,MAAM;IAAU,OAAO;IAAQ,eAAe;GAAK;GAC3E;IAAE,MAAM;IAAsB,MAAM;IAAW,OAAO;IAAQ,eAAe;GAAK;EACpF;CACF;AACF;AAuBA,SAAgB,EAAc,EAC5B,eACA,aAAU,oBACV,WAAQ,aACR,YAAS,MACa,CAAC,GAAiB;CACxC,IAAM,IAAS,EAAiB,GAC1B,EAAE,cAAW,EAAQ,GACrB,EAAE,mBAAgB,EAAsB,GACxC,IAAiB,KAAc,EAAO,YAAY,IAClD,IAAU,EAAc,CAAM,GAC9B,IAAgB,EACnB,KAAK,OAAW;EACf,OAAO,EAAM;EACb,OAAO,EAAM,MAAM,QAAQ,MAAS,CAAC,EAAK,iBAAiB,CAAO;CACpE,EAAE,EACD,QAAQ,MAAU,EAAM,MAAM,SAAS,CAAC,GAErC,IAAe,YAA2B;EAE9C,AADA,MAAM,EAAU,GAChB,EAAO,QAAQ,QAAQ;CACzB;CAkDA,OAAO,kBAAC,GAAD;EAAY,qBAAA;EAAqB,UAAA;GA/CtC,kBAAC,GAAD;IAAsC;cACpC,kBAAC,OAAD;KAAK,KAAI;KAAG,WAAW,EAAO;KAAM,QAAQ;KAAI,KAAK;KAAS,OAAO;IAAK,CAAA;GAC1D,GAFI,QAEJ;GAClB,GAAG,EAAc,KAAK,MACpB,kBAAC,GAAD;IAA4C,OAAO,EAAM;cACtD,EAAM,MAAM,KAAK,MAChB,kBAAC,GAAD;KACE,QAAQ,EAAK,SAAS;KACtB,MAAM,EAAK;KACX,MAAM,EAAK;KAEX,OAAO,EAAK;IACb,GAFM,EAAK,IAEX,CACF;GACuB,GAVK,EAAM,KAUX,CAC3B;GACD,kBAAC,GAAD,EAAA,UAAA;IACE,kBAAC,GAAD;KACE,SAAS,CACP;MAAE,IAAI;MAAyB,MAAM;KAAO,GAC5C;MAAE,IAAI;MAAU,MAAM;KAAK,CAC7B;KACA,WAAW,MAAiB;MAC1B,IAAI,EAAO,OAAO,yBAAyB;OACzC,EAAO,KAAK,yBAAyB;OACrC;MACF;MACA,AAAI,EAAO,OAAO,YAChB,EAAkB;KAEtB;eAEA,kBAAC,GAAD,CAAuB,CAAA;IACL,CAAA;IACpB,kBAAC,GAAD,EAA+B,eAAc,CAAA;IAC7C,kBAAC,GAAD;KACE,cAAW;KACX,MAAM;KACN,eAAqB;MACnB,EAAkB;KACpB;KACA,OAAM;KACN,MAAK;IACN,CAAA;GACe,EAAA,GA5BI,QA4BJ;EAGoB;CAAqB,CAAA;AAC/D;AAEA,SAAS,EAAc,GAAuD;CAE5E,OADK,KAEF,EAAO,SAAS,CAAC,GAAG,SAAS,WAAW,MACxC,EAAO,eAAe,CAAC,GAAG,MAAM,MAC/B;EAAC;EAAS;EAAa;EAAa;CAAa,EAAE,SAAS,CAAC,CAC/D,IALkB;AAOtB;AAEA,SAAS,EAAiB,EACxB,kBAGe;CACf,IAAM,EAAE,YAAS,EAAsB;CACvC,OACE,kBAAC,QAAD;EAAM,WAAW,EAAO;YAAxB,CACE,kBAAC,GAAD;GACE,cAAY,IAAc,IAAI,QAAQ,EAAY,QAAQ;GAC1D,MAAM;GACN,eAAqB;IACnB,EAAK;GACP;GACA,OAAM;GACN,MAAK;EACN,CAAA,GACA,IAAc,IACb,kBAAC,QAAD;GAAM,WAAW,EAAO;aACrB,IAAc,KAAK,QAAQ;EACxB,CAAA,IACJ,IACA;;AAEV;AAEA,SAAS,IAA4C;CACnD,IAAM,EAAE,cAAW,EAAQ;CAE3B,OADK,IACE,kBAAA,GAAA,EAAA,UAAG,EAAO,KAAO,CAAA,IADJ;AAEtB"}
@@ -0,0 +1,2 @@
1
+ "use client";require('../app-navigation.css');var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));const c=require("./router-adapter-BybHrCNP.cjs"),l=require("./auth-provider-D2P-qWmY.cjs");let u=require("react"),d=require("@mezzanine-ui/react"),f=require("@rytass/bpm-core-client"),p=require("react/jsx-runtime"),m=require("@rytass/bpm-core-client/workflow"),h=require("@mezzanine-ui/icons");var g=(0,u.createContext)(null);function _({children:e}){let[t,n]=(0,u.useState)(!1),r=(0,u.useCallback)(()=>{n(!0)},[]),i=(0,u.useCallback)(()=>{n(!1)},[]),a=(0,u.useCallback)(()=>{n(e=>!e)},[]),o=(0,u.useMemo)(()=>({close:i,isOpen:t,open:r,toggle:a}),[i,t,r,a]);return(0,p.jsx)(g.Provider,{value:o,children:e})}function v(){return(0,u.useContext)(g)||{close:()=>void 0,isOpen:!1,open:()=>void 0,toggle:()=>void 0}}var y=(0,u.createContext)(null);function b({children:e}){let{member:t}=l.n(),n=t?.memberId??null,[r,i]=(0,u.useState)(0),a=(0,u.useCallback)(async()=>{if(!n)return i(0),0;let e=await(0,m.readUnreadNotificationCount)(n);return i(e),e},[n]);(0,u.useEffect)(()=>{let e=!0;return(async()=>{try{let t=await a();e&&i(t)}catch{e&&i(0)}})(),()=>{e=!1}},[a]);let o=(0,u.useMemo)(()=>({refreshUnreadCount:a,unreadCount:r}),[a,r]);return(0,p.jsx)(y.Provider,{value:o,children:e})}function x(){return(0,u.useContext)(y)||{refreshUnreadCount:async()=>0,unreadCount:0}}var S={logo:`bpm_logo_QvBLU`,notificationBell:`bpm_notificationBell_W-wl7`,notificationBadge:`bpm_notificationBadge_Gy3Eq`},C=[{title:`我的工作`,items:[{href:`/dashboard`,icon:h.HomeIcon,label:`工作台`},{href:`/inbox`,icon:h.MailUnreadIcon,label:`我的待簽`},{href:`/sent`,icon:h.MailIcon,label:`我發起的`},{href:`/cc`,icon:h.ShareIcon,label:`抄送給我`}]},{title:`查詢與代理`,items:[{href:`/search`,icon:h.SearchIcon,label:`搜尋`},{href:`/delegations`,icon:h.SwitchHorizontalIcon,label:`個人代理`}]},{title:`簽核設計`,items:[{href:`/templates`,icon:h.FolderIcon,label:`簽核模板`,requiresAdmin:!0},{href:`/templates/categories`,icon:h.ListIcon,label:`模板分類`,requiresAdmin:!0},{href:`/forms`,icon:h.FileIcon,label:`表單設計`,requiresAdmin:!0}]},{title:`系統管理`,items:[{href:`/admin/orgs`,icon:h.SystemIcon,label:`組織管理`,requiresAdmin:!0},{href:`/admin/users`,icon:h.UserIcon,label:`會員對照`,requiresAdmin:!0},{href:`/admin/delegations`,icon:h.ShareIcon,label:`代理設定`,requiresAdmin:!0}]}];function w({activeHref:e,logoSrc:t=`/rytass-logo.png`,title:n=`BPM Admin`,groups:r=C}={}){let i=c.r(),{member:a}=l.n(),{unreadCount:o}=x(),s=e??i.pathname??``,u=T(a),m=r.map(e=>({title:e.title,items:e.items.filter(e=>!e.requiresAdmin||u)})).filter(e=>e.items.length>0),g=async()=>{await(0,f.logoutApi)(),i.replace(`/login`)};return(0,p.jsx)(d.Navigation,{exactActivatedMatch:!0,children:[(0,p.jsx)(d.NavigationHeader,{title:n,children:(0,p.jsx)(`img`,{alt:``,className:S.logo,height:24,src:t,width:24})},`header`),...m.map(e=>(0,p.jsx)(d.NavigationOptionCategory,{title:e.title,children:e.items.map(e=>(0,p.jsx)(d.NavigationOption,{active:e.href===s,href:e.href,icon:e.icon,title:e.label},e.href))},e.title)),(0,p.jsxs)(d.NavigationFooter,{children:[(0,p.jsx)(d.NavigationUserMenu,{options:[{id:`notification-settings`,name:`通知設定`},{id:`logout`,name:`登出`}],onSelect:e=>{if(e.id===`notification-settings`){i.push(`/settings/notifications`);return}e.id===`logout`&&g()},children:(0,p.jsx)(D,{})}),(0,p.jsx)(E,{unreadCount:o}),(0,p.jsx)(d.NavigationIconButton,{"aria-label":`登出`,icon:h.LogoutIcon,onClick:()=>{g()},title:`登出`,type:`button`})]},`footer`)]})}function T(e){return e?(e.roles??[]).includes(`BPM_ADMIN`)||(e.permissions??[]).some(e=>[`bpm:*`,`bpm:admin`,`bpm.admin`,`bpm:admin:*`].includes(e)):!1}function E({unreadCount:e}){let{open:t}=v();return(0,p.jsxs)(`span`,{className:S.notificationBell,children:[(0,p.jsx)(d.NavigationIconButton,{"aria-label":e>0?`通知中心,${e} 則未讀`:`通知中心`,icon:h.NotificationUnreadIcon,onClick:()=>{t()},title:`通知中心`,type:`button`}),e>0?(0,p.jsx)(`span`,{className:S.notificationBadge,children:e>99?`99+`:e}):null]})}function D(){let{member:e}=l.n();return e?(0,p.jsx)(p.Fragment,{children:e.name}):null}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return w}});
2
+ //# sourceMappingURL=app-navigation-DAC5gFbG.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-navigation-DAC5gFbG.cjs","names":[],"sources":["../../src/lib/notification-drawer-provider.tsx","../../src/lib/notification-unread-provider.tsx","../../src/components/app-navigation.module.scss","../../src/components/app-navigation.tsx"],"sourcesContent":["'use client';\n\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n type ReactElement,\n type ReactNode,\n} from 'react';\n\ninterface NotificationDrawerContextValue {\n readonly close: () => void;\n readonly isOpen: boolean;\n readonly open: () => void;\n readonly toggle: () => void;\n}\n\nconst NotificationDrawerContext =\n createContext<NotificationDrawerContextValue | null>(null);\n\ninterface NotificationDrawerProviderProps {\n readonly children: ReactNode;\n}\n\n/**\n * Controls the open/closed state of the BPM notification drawer. Wraps\n * children with a context that `<NotificationDrawer />` reads to mount /\n * hide itself, and that `<AppNavigation />` reads to open the drawer when\n * the bell icon is clicked.\n *\n * When used outside this provider, the returned hook is a safe no-op so\n * components don't crash in test or storybook environments.\n */\nexport function NotificationDrawerProvider({\n children,\n}: NotificationDrawerProviderProps): ReactElement {\n const [isOpen, setIsOpen] = useState(false);\n\n const open = useCallback((): void => {\n setIsOpen(true);\n }, []);\n const close = useCallback((): void => {\n setIsOpen(false);\n }, []);\n const toggle = useCallback((): void => {\n setIsOpen((current) => !current);\n }, []);\n\n const value = useMemo<NotificationDrawerContextValue>(\n () => ({ close, isOpen, open, toggle }),\n [close, isOpen, open, toggle],\n );\n\n return (\n <NotificationDrawerContext.Provider value={value}>\n {children}\n </NotificationDrawerContext.Provider>\n );\n}\n\n/**\n * Read the BPM notification drawer's open state and control helpers.\n * Returns a no-op stub when used outside `<NotificationDrawerProvider>`.\n */\nexport function useNotificationDrawer(): NotificationDrawerContextValue {\n const context = useContext(NotificationDrawerContext);\n if (!context) {\n return {\n close: (): void => undefined,\n isOpen: false,\n open: (): void => undefined,\n toggle: (): void => undefined,\n };\n }\n return context;\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 { readUnreadNotificationCount } from '@rytass/bpm-core-client/workflow';\nimport { useAuth } from './auth-provider';\n\ninterface NotificationUnreadContextValue {\n readonly refreshUnreadCount: () => Promise<number>;\n readonly unreadCount: number;\n}\n\nconst NotificationUnreadContext =\n createContext<NotificationUnreadContextValue | null>(null);\n\ninterface NotificationUnreadProviderProps {\n readonly children: ReactNode;\n}\n\n/**\n * Polls BPM for the current member's unread notification count via\n * `readUnreadNotificationCount` and exposes it through context for\n * `<AppNavigation />` (bell badge) and `<NotificationDrawer />` (header\n * count). Refresh is triggered on mount and whenever the auth member id\n * changes; consumers can call `refreshUnreadCount()` after acknowledging\n * a notification.\n */\nexport function NotificationUnreadProvider({\n children,\n}: NotificationUnreadProviderProps): ReactElement {\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [unreadCount, setUnreadCount] = useState(0);\n\n const refreshUnreadCount = useCallback(async (): Promise<number> => {\n if (!currentMemberId) {\n setUnreadCount(0);\n return 0;\n }\n const next = await readUnreadNotificationCount(currentMemberId);\n setUnreadCount(next);\n return next;\n }, [currentMemberId]);\n\n useEffect((): (() => void) => {\n let active = true;\n void (async () => {\n try {\n const next = await refreshUnreadCount();\n if (active) setUnreadCount(next);\n } catch {\n if (active) setUnreadCount(0);\n }\n })();\n return (): void => {\n active = false;\n };\n }, [refreshUnreadCount]);\n\n const value = useMemo<NotificationUnreadContextValue>(\n () => ({ refreshUnreadCount, unreadCount }),\n [refreshUnreadCount, unreadCount],\n );\n\n return (\n <NotificationUnreadContext.Provider value={value}>\n {children}\n </NotificationUnreadContext.Provider>\n );\n}\n\n/**\n * Read the current unread-notification count and a manual refresh helper.\n * Returns a zero/no-op stub when used outside\n * `<NotificationUnreadProvider>`.\n */\nexport function useNotificationUnread(): NotificationUnreadContextValue {\n const context = useContext(NotificationUnreadContext);\n if (!context) {\n return {\n refreshUnreadCount: async (): Promise<number> => 0,\n unreadCount: 0,\n };\n }\n return context;\n}\n",".logo {\n display: block;\n height: 24px;\n margin: auto;\n object-fit: contain;\n width: 24px;\n}\n\n.notificationBell {\n display: inline-flex;\n position: relative;\n}\n\n.notificationBadge {\n align-items: center;\n background: #d92d20;\n border: 1px solid #fff;\n border-radius: 999px;\n color: #fff;\n display: inline-flex;\n font-size: 10px;\n font-weight: 600;\n height: 16px;\n justify-content: center;\n line-height: 1;\n min-width: 16px;\n padding: 0 4px;\n pointer-events: none;\n position: absolute;\n right: -4px;\n top: -4px;\n}\n","'use client';\n\nimport type { ReactElement } from 'react';\nimport {\n Navigation,\n NavigationFooter,\n NavigationHeader,\n NavigationIconButton,\n NavigationOption,\n NavigationOptionCategory,\n NavigationUserMenu,\n} from '@mezzanine-ui/react';\nimport {\n FileIcon,\n FolderIcon,\n HomeIcon,\n ListIcon,\n LogoutIcon,\n MailIcon,\n MailUnreadIcon,\n NotificationUnreadIcon,\n SearchIcon,\n ShareIcon,\n SystemIcon,\n SwitchHorizontalIcon,\n UserIcon,\n type IconDefinition,\n} from '@mezzanine-ui/icons';\nimport { logoutApi } from '@rytass/bpm-core-client';\nimport { useAuth } from '../lib/auth-provider';\nimport { useRouterAdapter } from '../lib/router-adapter';\nimport { useNotificationDrawer } from '../lib/notification-drawer-provider';\nimport { useNotificationUnread } from '../lib/notification-unread-provider';\nimport styles from './app-navigation.module.scss';\n\ninterface NavigationItem {\n readonly href: string;\n readonly icon: IconDefinition;\n readonly label: string;\n readonly requiresAdmin?: boolean;\n}\n\ninterface NavigationGroup {\n readonly title: string;\n readonly items: readonly NavigationItem[];\n}\n\nconst DEFAULT_NAVIGATION_GROUPS: readonly NavigationGroup[] = [\n {\n title: '我的工作',\n items: [\n { href: '/dashboard', icon: HomeIcon, label: '工作台' },\n { href: '/inbox', icon: MailUnreadIcon, label: '我的待簽' },\n { href: '/sent', icon: MailIcon, label: '我發起的' },\n { href: '/cc', icon: ShareIcon, label: '抄送給我' },\n ],\n },\n {\n title: '查詢與代理',\n items: [\n { href: '/search', icon: SearchIcon, label: '搜尋' },\n { href: '/delegations', icon: SwitchHorizontalIcon, label: '個人代理' },\n ],\n },\n {\n title: '簽核設計',\n items: [\n { href: '/templates', icon: FolderIcon, label: '簽核模板', requiresAdmin: true },\n { href: '/templates/categories', icon: ListIcon, label: '模板分類', requiresAdmin: true },\n { href: '/forms', icon: FileIcon, label: '表單設計', requiresAdmin: true },\n ],\n },\n {\n title: '系統管理',\n items: [\n { href: '/admin/orgs', icon: SystemIcon, label: '組織管理', requiresAdmin: true },\n { href: '/admin/users', icon: UserIcon, label: '會員對照', requiresAdmin: true },\n { href: '/admin/delegations', icon: ShareIcon, label: '代理設定', requiresAdmin: true },\n ],\n },\n];\n\nexport interface AppNavigationProps {\n /** Override the active href detection (defaults to router's pathname). */\n readonly activeHref?: string;\n /** Logo image URL displayed in the sidebar header. */\n readonly logoSrc?: string;\n /** Sidebar title (defaults to \"BPM Admin\"). */\n readonly title?: string;\n /**\n * Override the entire navigation tree. When omitted, the default 4-group\n * BPM admin nav (`我的工作` / `查詢與代理` / `簽核設計` / `系統管理`) is used.\n */\n readonly groups?: readonly NavigationGroup[];\n}\n\n/**\n * BPM admin sidebar — composes Mezzanine UI `<Navigation>` with the\n * default 4-group BPM tree. Reads `useAuth` to gate admin-only routes,\n * `useNotificationUnread` to render the bell badge count, and the host's\n * `RouterAdapter` to derive the active route. Calls `logoutApi()` and\n * navigates back to `/login` on logout.\n */\nexport function AppNavigation({\n activeHref,\n logoSrc = '/rytass-logo.png',\n title = 'BPM Admin',\n groups = DEFAULT_NAVIGATION_GROUPS,\n}: AppNavigationProps = {}): ReactElement {\n const router = useRouterAdapter();\n const { member } = useAuth();\n const { unreadCount } = useNotificationUnread();\n const resolvedActive = activeHref ?? router.pathname ?? '';\n const isAdmin = isAdminMember(member);\n const visibleGroups = groups\n .map((group) => ({\n title: group.title,\n items: group.items.filter((item) => !item.requiresAdmin || isAdmin),\n }))\n .filter((group) => group.items.length > 0);\n\n const handleLogout = async (): Promise<void> => {\n await logoutApi();\n router.replace('/login');\n };\n\n const children = [\n <NavigationHeader key=\"header\" title={title}>\n <img alt=\"\" className={styles.logo} height={24} src={logoSrc} width={24} />\n </NavigationHeader>,\n ...visibleGroups.map((group) => (\n <NavigationOptionCategory key={group.title} title={group.title}>\n {group.items.map((item) => (\n <NavigationOption\n active={item.href === resolvedActive}\n href={item.href}\n icon={item.icon}\n key={item.href}\n title={item.label}\n />\n ))}\n </NavigationOptionCategory>\n )),\n <NavigationFooter key=\"footer\">\n <NavigationUserMenu\n options={[\n { id: 'notification-settings', name: '通知設定' },\n { id: 'logout', name: '登出' },\n ]}\n onSelect={(option): void => {\n if (option.id === 'notification-settings') {\n router.push('/settings/notifications');\n return;\n }\n if (option.id === 'logout') {\n void handleLogout();\n }\n }}\n >\n <NavigationMemberName />\n </NavigationUserMenu>\n <NotificationBell unreadCount={unreadCount} />\n <NavigationIconButton\n aria-label=\"登出\"\n icon={LogoutIcon}\n onClick={(): void => {\n void handleLogout();\n }}\n title=\"登出\"\n type=\"button\"\n />\n </NavigationFooter>,\n ];\n\n return <Navigation exactActivatedMatch>{children}</Navigation>;\n}\n\nfunction isAdminMember(member: ReturnType<typeof useAuth>['member']): boolean {\n if (!member) return false;\n return (\n (member.roles ?? []).includes('BPM_ADMIN') ||\n (member.permissions ?? []).some((p) =>\n ['bpm:*', 'bpm:admin', 'bpm.admin', 'bpm:admin:*'].includes(p),\n )\n );\n}\n\nfunction NotificationBell({\n unreadCount,\n}: {\n readonly unreadCount: number;\n}): ReactElement {\n const { open } = useNotificationDrawer();\n return (\n <span className={styles.notificationBell}>\n <NavigationIconButton\n aria-label={unreadCount > 0 ? `通知中心,${unreadCount} 則未讀` : '通知中心'}\n icon={NotificationUnreadIcon}\n onClick={(): void => {\n open();\n }}\n title=\"通知中心\"\n type=\"button\"\n />\n {unreadCount > 0 ? (\n <span className={styles.notificationBadge}>\n {unreadCount > 99 ? '99+' : unreadCount}\n </span>\n ) : null}\n </span>\n );\n}\n\nfunction NavigationMemberName(): ReactElement | null {\n const { member } = useAuth();\n if (!member) return null;\n return <>{member.name}</>;\n}\n"],"mappings":"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"}