@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 @@
1
+ {"version":3,"file":"LoginView-BED07v-7.cjs","names":[],"sources":["../../src/views/login/login.module.scss","../../src/views/login/LoginView.tsx"],"sourcesContent":[".loginPage {\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\n.loginPanel {\n border: 1px solid var(--mzn-color-border);\n border-radius: 8px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: 28px;\n max-width: 440px;\n padding: 32px;\n width: 100%;\n}\n\n.brand {\n align-items: center;\n display: flex;\n gap: 14px;\n}\n\n.brandLogo {\n border-radius: 8px;\n height: 40px;\n width: 40px;\n object-fit: contain;\n}\n\n.form {\n display: flex;\n flex-direction: column;\n gap: 18px;\n}\n\n.demoUsers {\n border-top: 1px solid var(--mzn-color-border);\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding-top: 20px;\n}\n\n.demoUserList {\n display: grid;\n gap: 8px;\n}\n\n.demoUserButton {\n background: transparent;\n border: 1px solid var(--mzn-color-border);\n border-radius: 6px;\n color: inherit;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n font: inherit;\n gap: 2px;\n padding: 10px 12px;\n text-align: left;\n}\n\n.demoUserButton:hover {\n border-color: var(--mzn-color-primary);\n}\n\n.demoUserButton span:last-child {\n color: var(--mzn-color-text-secondary);\n font-size: 12px;\n}\n","'use client';\n\nimport {\n useCallback,\n useEffect,\n useState,\n type ChangeEvent,\n type FormEvent,\n type ReactElement,\n} from 'react';\nimport { Button, Input, Typography } from '@mezzanine-ui/react';\nimport { LoginIcon } from '@mezzanine-ui/icons';\nimport {\n listApiTestMembers,\n type ApiPublicMember,\n} from '@rytass/bpm-core-client';\nimport { useAuth } from '../../lib/auth-provider';\nimport { useRouterAdapter } from '../../lib/router-adapter';\nimport styles from './login.module.scss';\n\nexport interface LoginViewProps {\n /**\n * Logo image URL. Renders an inline `<img>` so the view stays framework\n * agnostic (no `next/image` dependency). Defaults to\n * `/rytass-logo.png` — host should serve a static asset at that path or\n * override via this prop.\n */\n readonly logoSrc?: string;\n /**\n * Pre-fill the identifier input. Defaults to the seeded demo account\n * email so the form is usable out of the box.\n */\n readonly defaultIdentifier?: string;\n /**\n * Pre-fill the password input. Defaults to the seeded demo password\n * (`'demo'`). Production hosts should pass an empty string.\n */\n readonly defaultPassword?: string;\n /**\n * Custom redirect target after a successful login. Defaults to reading\n * `?next=` from the host router's search params, falling back to `'/'`.\n */\n readonly defaultNextPath?: string;\n /**\n * Override the BPM admin brand title shown above the form. Defaults to\n * `'BPM Admin'`.\n */\n readonly brandTitle?: string;\n /**\n * Override the brand subtitle shown above the form. Defaults to\n * `'BPM API 登入'`.\n */\n readonly brandSubtitle?: string;\n}\n\nconst DEFAULT_LOGO = '/rytass-logo.png';\nconst DEFAULT_IDENTIFIER = 'lin.ceo@example.internal';\nconst DEFAULT_PASSWORD = 'demo';\n\n/**\n * Login UI for the BPM admin host. Renders the brand mark, identifier /\n * password fields, and a \"test members\" picker fed by\n * `listApiTestMembers()`. Self-contained: composes Mezzanine UI primitives,\n * reads the auth context, and uses the host router adapter to redirect on\n * success.\n *\n * Wrap with `<AuthProvider>` (and indirectly `<RouterAdapterProvider>`)\n * higher in the tree. The `pages/login` subpath ships a thin Next.js\n * wrapper that exports `default` (Server Component) and `metadata`.\n */\nexport function LoginView({\n logoSrc = DEFAULT_LOGO,\n defaultIdentifier = DEFAULT_IDENTIFIER,\n defaultPassword = DEFAULT_PASSWORD,\n defaultNextPath,\n brandTitle = 'BPM Admin',\n brandSubtitle = 'BPM API 登入',\n}: LoginViewProps = {}): ReactElement {\n const router = useRouterAdapter();\n const { loading, login, member } = useAuth();\n const [testMembers, setTestMembers] = useState<readonly ApiPublicMember[]>(\n [],\n );\n const [error, setError] = useState<string | null>(null);\n const [identifier, setIdentifier] = useState(defaultIdentifier);\n const [password, setPassword] = useState(defaultPassword);\n const [submitting, setSubmitting] = useState(false);\n\n useEffect((): void => {\n if (loading || !member) return;\n router.replace(resolveNextPath(router, defaultNextPath));\n }, [defaultNextPath, loading, member, router]);\n\n useEffect((): void => {\n void (async () => {\n try {\n setTestMembers(await listApiTestMembers());\n } catch {\n setTestMembers([]);\n }\n })();\n }, []);\n\n const handleSubmit = useCallback(\n async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault();\n setError(null);\n setSubmitting(true);\n try {\n await login({ identifier, password });\n router.replace(resolveNextPath(router, defaultNextPath));\n } catch (loginError: unknown) {\n setError(readErrorMessage(loginError));\n } finally {\n setSubmitting(false);\n }\n },\n [defaultNextPath, identifier, login, password, router],\n );\n\n function handleIdentifierChange(event: ChangeEvent<HTMLInputElement>): void {\n setIdentifier(event.target.value);\n }\n function handlePasswordChange(event: ChangeEvent<HTMLInputElement>): void {\n setPassword(event.target.value);\n }\n\n return (\n <main className={styles.loginPage}>\n <section className={styles.loginPanel}>\n <div className={styles.brand}>\n <img alt=\"\" className={styles.brandLogo} src={logoSrc} />\n <div>\n <Typography variant=\"h3\">{brandTitle}</Typography>\n <Typography color=\"text-neutral\" variant=\"body\">\n {brandSubtitle}\n </Typography>\n </div>\n </div>\n\n <form className={styles.form} onSubmit={handleSubmit}>\n <label>\n <Typography color=\"text-neutral\" variant=\"caption\">\n 帳號\n </Typography>\n <Input\n fullWidth\n name=\"identifier\"\n onChange={handleIdentifierChange}\n placeholder=\"member id 或 email\"\n value={identifier}\n />\n </label>\n\n <label>\n <Typography color=\"text-neutral\" variant=\"caption\">\n 密碼\n </Typography>\n <Input\n fullWidth\n inputType=\"password\"\n name=\"password\"\n onChange={handlePasswordChange}\n value={password}\n variant=\"password\"\n />\n </label>\n\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n\n <Button\n disabled={submitting}\n icon={LoginIcon}\n iconType=\"leading\"\n type=\"submit\"\n variant=\"base-primary\"\n >\n 登入\n </Button>\n </form>\n\n {testMembers.length ? (\n <div className={styles.demoUsers}>\n <Typography color=\"text-neutral\" variant=\"caption\">\n 測試帳號\n </Typography>\n <div className={styles.demoUserList}>\n {testMembers.map((testMember) => (\n <button\n className={styles.demoUserButton}\n key={testMember.memberId}\n onClick={(): void => setIdentifier(testMember.email)}\n type=\"button\"\n >\n <span>{testMember.name}</span>\n <span>{testMember.email}</span>\n </button>\n ))}\n </div>\n </div>\n ) : null}\n </section>\n </main>\n );\n}\n\nfunction resolveNextPath(\n router: { searchParams?(): URLSearchParams },\n fallback: string | undefined,\n): string {\n const params = router.searchParams?.() ?? readBrowserSearchParams();\n const next = params.get('next');\n if (!next || !next.startsWith('/') || next.startsWith('//')) {\n return fallback ?? '/';\n }\n return next;\n}\n\nfunction readBrowserSearchParams(): URLSearchParams {\n if (typeof window === 'undefined') return new URLSearchParams();\n return new URLSearchParams(window.location.search);\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '登入失敗';\n}\n"],"mappings":"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"}
@@ -0,0 +1,157 @@
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 { useCallback as n, useEffect as r, useState as i } from "react";
5
+ import { Button as a, Input as o, Typography as s } from "@mezzanine-ui/react";
6
+ import { listApiTestMembers as c } from "@rytass/bpm-core-client";
7
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
8
+ import { LoginIcon as d } from "@mezzanine-ui/icons";
9
+ import '../LoginView.css';var f = {
10
+ loginPage: "bpm_loginPage_BjzaI",
11
+ loginPanel: "bpm_loginPanel_xo0TW",
12
+ brand: "bpm_brand_KVmvZ",
13
+ brandLogo: "bpm_brandLogo_jxEAG",
14
+ form: "bpm_form_rKKP2",
15
+ demoUsers: "bpm_demoUsers_g-5Hd",
16
+ demoUserList: "bpm_demoUserList_IxtKp",
17
+ demoUserButton: "bpm_demoUserButton_YdkSa"
18
+ }, p = "/rytass-logo.png", m = "lin.ceo@example.internal", h = "demo";
19
+ function g({ logoSrc: g = p, defaultIdentifier: v = m, defaultPassword: b = h, defaultNextPath: x, brandTitle: S = "BPM Admin", brandSubtitle: C = "BPM API 登入" } = {}) {
20
+ let w = e(), { loading: T, login: E, member: D } = t(), [O, k] = i([]), [A, j] = i(null), [M, N] = i(v), [P, F] = i(b), [I, L] = i(!1);
21
+ r(() => {
22
+ T || !D || w.replace(_(w, x));
23
+ }, [
24
+ x,
25
+ T,
26
+ D,
27
+ w
28
+ ]), r(() => {
29
+ (async () => {
30
+ try {
31
+ k(await c());
32
+ } catch {
33
+ k([]);
34
+ }
35
+ })();
36
+ }, []);
37
+ let R = n(async (e) => {
38
+ e.preventDefault(), j(null), L(!0);
39
+ try {
40
+ await E({
41
+ identifier: M,
42
+ password: P
43
+ }), w.replace(_(w, x));
44
+ } catch (e) {
45
+ j(y(e));
46
+ } finally {
47
+ L(!1);
48
+ }
49
+ }, [
50
+ x,
51
+ M,
52
+ E,
53
+ P,
54
+ w
55
+ ]);
56
+ function z(e) {
57
+ N(e.target.value);
58
+ }
59
+ function B(e) {
60
+ F(e.target.value);
61
+ }
62
+ return /* @__PURE__ */ l("main", {
63
+ className: f.loginPage,
64
+ children: /* @__PURE__ */ u("section", {
65
+ className: f.loginPanel,
66
+ children: [
67
+ /* @__PURE__ */ u("div", {
68
+ className: f.brand,
69
+ children: [/* @__PURE__ */ l("img", {
70
+ alt: "",
71
+ className: f.brandLogo,
72
+ src: g
73
+ }), /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l(s, {
74
+ variant: "h3",
75
+ children: S
76
+ }), /* @__PURE__ */ l(s, {
77
+ color: "text-neutral",
78
+ variant: "body",
79
+ children: C
80
+ })] })]
81
+ }),
82
+ /* @__PURE__ */ u("form", {
83
+ className: f.form,
84
+ onSubmit: R,
85
+ children: [
86
+ /* @__PURE__ */ u("label", { children: [/* @__PURE__ */ l(s, {
87
+ color: "text-neutral",
88
+ variant: "caption",
89
+ children: "帳號"
90
+ }), /* @__PURE__ */ l(o, {
91
+ fullWidth: !0,
92
+ name: "identifier",
93
+ onChange: z,
94
+ placeholder: "member id 或 email",
95
+ value: M
96
+ })] }),
97
+ /* @__PURE__ */ u("label", { children: [/* @__PURE__ */ l(s, {
98
+ color: "text-neutral",
99
+ variant: "caption",
100
+ children: "密碼"
101
+ }), /* @__PURE__ */ l(o, {
102
+ fullWidth: !0,
103
+ inputType: "password",
104
+ name: "password",
105
+ onChange: B,
106
+ value: P,
107
+ variant: "password"
108
+ })] }),
109
+ A ? /* @__PURE__ */ l(s, {
110
+ color: "text-error",
111
+ variant: "body",
112
+ children: A
113
+ }) : null,
114
+ /* @__PURE__ */ l(a, {
115
+ disabled: I,
116
+ icon: d,
117
+ iconType: "leading",
118
+ type: "submit",
119
+ variant: "base-primary",
120
+ children: "登入"
121
+ })
122
+ ]
123
+ }),
124
+ O.length ? /* @__PURE__ */ u("div", {
125
+ className: f.demoUsers,
126
+ children: [/* @__PURE__ */ l(s, {
127
+ color: "text-neutral",
128
+ variant: "caption",
129
+ children: "測試帳號"
130
+ }), /* @__PURE__ */ l("div", {
131
+ className: f.demoUserList,
132
+ children: O.map((e) => /* @__PURE__ */ u("button", {
133
+ className: f.demoUserButton,
134
+ onClick: () => N(e.email),
135
+ type: "button",
136
+ children: [/* @__PURE__ */ l("span", { children: e.name }), /* @__PURE__ */ l("span", { children: e.email })]
137
+ }, e.memberId))
138
+ })]
139
+ }) : null
140
+ ]
141
+ })
142
+ });
143
+ }
144
+ function _(e, t) {
145
+ let n = (e.searchParams?.() ?? v()).get("next");
146
+ return !n || !n.startsWith("/") || n.startsWith("//") ? t ?? "/" : n;
147
+ }
148
+ function v() {
149
+ return typeof window > "u" ? new URLSearchParams() : new URLSearchParams(window.location.search);
150
+ }
151
+ function y(e) {
152
+ return e instanceof Error ? e.message : "登入失敗";
153
+ }
154
+ //#endregion
155
+ export { g as t };
156
+
157
+ //# sourceMappingURL=LoginView-a1iu3cfc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoginView-a1iu3cfc.js","names":[],"sources":["../../src/views/login/login.module.scss","../../src/views/login/LoginView.tsx"],"sourcesContent":[".loginPage {\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\n.loginPanel {\n border: 1px solid var(--mzn-color-border);\n border-radius: 8px;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: 28px;\n max-width: 440px;\n padding: 32px;\n width: 100%;\n}\n\n.brand {\n align-items: center;\n display: flex;\n gap: 14px;\n}\n\n.brandLogo {\n border-radius: 8px;\n height: 40px;\n width: 40px;\n object-fit: contain;\n}\n\n.form {\n display: flex;\n flex-direction: column;\n gap: 18px;\n}\n\n.demoUsers {\n border-top: 1px solid var(--mzn-color-border);\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding-top: 20px;\n}\n\n.demoUserList {\n display: grid;\n gap: 8px;\n}\n\n.demoUserButton {\n background: transparent;\n border: 1px solid var(--mzn-color-border);\n border-radius: 6px;\n color: inherit;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n font: inherit;\n gap: 2px;\n padding: 10px 12px;\n text-align: left;\n}\n\n.demoUserButton:hover {\n border-color: var(--mzn-color-primary);\n}\n\n.demoUserButton span:last-child {\n color: var(--mzn-color-text-secondary);\n font-size: 12px;\n}\n","'use client';\n\nimport {\n useCallback,\n useEffect,\n useState,\n type ChangeEvent,\n type FormEvent,\n type ReactElement,\n} from 'react';\nimport { Button, Input, Typography } from '@mezzanine-ui/react';\nimport { LoginIcon } from '@mezzanine-ui/icons';\nimport {\n listApiTestMembers,\n type ApiPublicMember,\n} from '@rytass/bpm-core-client';\nimport { useAuth } from '../../lib/auth-provider';\nimport { useRouterAdapter } from '../../lib/router-adapter';\nimport styles from './login.module.scss';\n\nexport interface LoginViewProps {\n /**\n * Logo image URL. Renders an inline `<img>` so the view stays framework\n * agnostic (no `next/image` dependency). Defaults to\n * `/rytass-logo.png` — host should serve a static asset at that path or\n * override via this prop.\n */\n readonly logoSrc?: string;\n /**\n * Pre-fill the identifier input. Defaults to the seeded demo account\n * email so the form is usable out of the box.\n */\n readonly defaultIdentifier?: string;\n /**\n * Pre-fill the password input. Defaults to the seeded demo password\n * (`'demo'`). Production hosts should pass an empty string.\n */\n readonly defaultPassword?: string;\n /**\n * Custom redirect target after a successful login. Defaults to reading\n * `?next=` from the host router's search params, falling back to `'/'`.\n */\n readonly defaultNextPath?: string;\n /**\n * Override the BPM admin brand title shown above the form. Defaults to\n * `'BPM Admin'`.\n */\n readonly brandTitle?: string;\n /**\n * Override the brand subtitle shown above the form. Defaults to\n * `'BPM API 登入'`.\n */\n readonly brandSubtitle?: string;\n}\n\nconst DEFAULT_LOGO = '/rytass-logo.png';\nconst DEFAULT_IDENTIFIER = 'lin.ceo@example.internal';\nconst DEFAULT_PASSWORD = 'demo';\n\n/**\n * Login UI for the BPM admin host. Renders the brand mark, identifier /\n * password fields, and a \"test members\" picker fed by\n * `listApiTestMembers()`. Self-contained: composes Mezzanine UI primitives,\n * reads the auth context, and uses the host router adapter to redirect on\n * success.\n *\n * Wrap with `<AuthProvider>` (and indirectly `<RouterAdapterProvider>`)\n * higher in the tree. The `pages/login` subpath ships a thin Next.js\n * wrapper that exports `default` (Server Component) and `metadata`.\n */\nexport function LoginView({\n logoSrc = DEFAULT_LOGO,\n defaultIdentifier = DEFAULT_IDENTIFIER,\n defaultPassword = DEFAULT_PASSWORD,\n defaultNextPath,\n brandTitle = 'BPM Admin',\n brandSubtitle = 'BPM API 登入',\n}: LoginViewProps = {}): ReactElement {\n const router = useRouterAdapter();\n const { loading, login, member } = useAuth();\n const [testMembers, setTestMembers] = useState<readonly ApiPublicMember[]>(\n [],\n );\n const [error, setError] = useState<string | null>(null);\n const [identifier, setIdentifier] = useState(defaultIdentifier);\n const [password, setPassword] = useState(defaultPassword);\n const [submitting, setSubmitting] = useState(false);\n\n useEffect((): void => {\n if (loading || !member) return;\n router.replace(resolveNextPath(router, defaultNextPath));\n }, [defaultNextPath, loading, member, router]);\n\n useEffect((): void => {\n void (async () => {\n try {\n setTestMembers(await listApiTestMembers());\n } catch {\n setTestMembers([]);\n }\n })();\n }, []);\n\n const handleSubmit = useCallback(\n async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault();\n setError(null);\n setSubmitting(true);\n try {\n await login({ identifier, password });\n router.replace(resolveNextPath(router, defaultNextPath));\n } catch (loginError: unknown) {\n setError(readErrorMessage(loginError));\n } finally {\n setSubmitting(false);\n }\n },\n [defaultNextPath, identifier, login, password, router],\n );\n\n function handleIdentifierChange(event: ChangeEvent<HTMLInputElement>): void {\n setIdentifier(event.target.value);\n }\n function handlePasswordChange(event: ChangeEvent<HTMLInputElement>): void {\n setPassword(event.target.value);\n }\n\n return (\n <main className={styles.loginPage}>\n <section className={styles.loginPanel}>\n <div className={styles.brand}>\n <img alt=\"\" className={styles.brandLogo} src={logoSrc} />\n <div>\n <Typography variant=\"h3\">{brandTitle}</Typography>\n <Typography color=\"text-neutral\" variant=\"body\">\n {brandSubtitle}\n </Typography>\n </div>\n </div>\n\n <form className={styles.form} onSubmit={handleSubmit}>\n <label>\n <Typography color=\"text-neutral\" variant=\"caption\">\n 帳號\n </Typography>\n <Input\n fullWidth\n name=\"identifier\"\n onChange={handleIdentifierChange}\n placeholder=\"member id 或 email\"\n value={identifier}\n />\n </label>\n\n <label>\n <Typography color=\"text-neutral\" variant=\"caption\">\n 密碼\n </Typography>\n <Input\n fullWidth\n inputType=\"password\"\n name=\"password\"\n onChange={handlePasswordChange}\n value={password}\n variant=\"password\"\n />\n </label>\n\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n\n <Button\n disabled={submitting}\n icon={LoginIcon}\n iconType=\"leading\"\n type=\"submit\"\n variant=\"base-primary\"\n >\n 登入\n </Button>\n </form>\n\n {testMembers.length ? (\n <div className={styles.demoUsers}>\n <Typography color=\"text-neutral\" variant=\"caption\">\n 測試帳號\n </Typography>\n <div className={styles.demoUserList}>\n {testMembers.map((testMember) => (\n <button\n className={styles.demoUserButton}\n key={testMember.memberId}\n onClick={(): void => setIdentifier(testMember.email)}\n type=\"button\"\n >\n <span>{testMember.name}</span>\n <span>{testMember.email}</span>\n </button>\n ))}\n </div>\n </div>\n ) : null}\n </section>\n </main>\n );\n}\n\nfunction resolveNextPath(\n router: { searchParams?(): URLSearchParams },\n fallback: string | undefined,\n): string {\n const params = router.searchParams?.() ?? readBrowserSearchParams();\n const next = params.get('next');\n if (!next || !next.startsWith('/') || next.startsWith('//')) {\n return fallback ?? '/';\n }\n return next;\n}\n\nfunction readBrowserSearchParams(): URLSearchParams {\n if (typeof window === 'undefined') return new URLSearchParams();\n return new URLSearchParams(window.location.search);\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '登入失敗';\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use client";const e=require("./router-adapter-BybHrCNP.cjs");let t=require("react"),n=require("react/jsx-runtime"),r=require("next/navigation");function i(e={}){return null}function a(){let a=(0,r.useRouter)(),o=(0,r.usePathname)(),s=(0,r.useSearchParams)(),c=(0,t.useMemo)(()=>({pathname:o,push:e=>a.push(e),replace:e=>a.replace(e),back:()=>a.back(),searchParams:()=>new URLSearchParams(s?.toString()??``)}),[a,o,s]);return(0,t.useEffect)(()=>{c.replace(`/dashboard`)},[c]),(0,n.jsx)(e.t,{value:c,children:(0,n.jsx)(i,{})})}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return a}});
2
+ //# sourceMappingURL=RootClientView-rXJt4TDd.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RootClientView-rXJt4TDd.cjs","names":[],"sources":["../../src/views/root/RootView.tsx","../../src/pages/root/RootClientView.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactElement } from 'react';\n\nexport interface RootViewProps {}\n\n/**\n * Framework-agnostic placeholder for the BPM root path. Server-side redirect\n * to `/dashboard` is the consumer's responsibility (Next.js `middleware.ts`\n * or `app/page.tsx`). This view renders nothing so it can be safely mounted\n * during the redirect flash.\n *\n * Mechanical port of `apps/client/src/app/page.tsx`.\n */\nexport function RootView(_props: RootViewProps = {}): ReactElement | null {\n return null;\n}\n","'use client';\n\nimport { useEffect, useMemo, type ReactElement } from 'react';\nimport { usePathname, useRouter, useSearchParams } from 'next/navigation';\nimport {\n RouterAdapterProvider,\n type RouterAdapter,\n} from '../../lib/router-adapter';\nimport { RootView } from '../../views/root/RootView';\n\n/**\n * Next.js App Router client shim for the BPM root path. Performs a\n * `router.replace('/dashboard')` redirect via the adapter on mount so the\n * host root path lands users on the dashboard without a Server Component\n * redirect.\n */\nexport default function RootClientView(): ReactElement | null {\n const nextRouter = useRouter();\n const pathname = usePathname();\n const searchParams = useSearchParams();\n\n const adapter = useMemo<RouterAdapter>(\n () => ({\n pathname,\n push: (href: string): void => nextRouter.push(href),\n replace: (href: string): void => nextRouter.replace(href),\n back: (): void => nextRouter.back(),\n searchParams: (): URLSearchParams =>\n new URLSearchParams(searchParams?.toString() ?? ''),\n }),\n [nextRouter, pathname, searchParams],\n );\n\n useEffect((): void => {\n adapter.replace('/dashboard');\n }, [adapter]);\n\n return (\n <RouterAdapterProvider value={adapter}>\n <RootView />\n </RouterAdapterProvider>\n );\n}\n"],"mappings":"iJAcA,SAAgB,EAAS,EAAwB,CAAC,EAAwB,CACxE,OAAO,IACT,CCAA,SAAwB,GAAsC,CAC5D,IAAM,GAAA,EAAA,EAAA,WAAuB,EACvB,GAAA,EAAA,EAAA,aAAuB,EACvB,GAAA,EAAA,EAAA,iBAA+B,EAE/B,GAAA,EAAA,EAAA,cACG,CACL,WACA,KAAO,GAAuB,EAAW,KAAK,CAAI,EAClD,QAAU,GAAuB,EAAW,QAAQ,CAAI,EACxD,SAAkB,EAAW,KAAK,EAClC,iBACE,IAAI,gBAAgB,GAAc,SAAS,GAAK,EAAE,CACtD,GACA,CAAC,EAAY,EAAU,CAAY,CACrC,EAMA,OAJA,EAAA,EAAA,eAAsB,CACpB,EAAQ,QAAQ,YAAY,CAC9B,EAAG,CAAC,CAAO,CAAC,GAGV,EAAA,EAAA,KAAC,EAAA,EAAD,CAAuB,MAAO,YAC5B,EAAA,EAAA,KAAC,EAAD,CAAW,CAAA,CACU,CAAA,CAE3B"}
@@ -0,0 +1,34 @@
1
+ "use client";
2
+ import { t as e } from "./router-adapter-BdHZXLS3.js";
3
+ import { useEffect as t, useMemo as n } from "react";
4
+ import { jsx as r } from "react/jsx-runtime";
5
+ import { usePathname as i, useRouter as a, useSearchParams as o } from "next/navigation";
6
+ //#region src/views/root/RootView.tsx
7
+ function s(e = {}) {
8
+ return null;
9
+ }
10
+ //#endregion
11
+ //#region src/pages/root/RootClientView.tsx
12
+ function c() {
13
+ let c = a(), l = i(), u = o(), d = n(() => ({
14
+ pathname: l,
15
+ push: (e) => c.push(e),
16
+ replace: (e) => c.replace(e),
17
+ back: () => c.back(),
18
+ searchParams: () => new URLSearchParams(u?.toString() ?? "")
19
+ }), [
20
+ c,
21
+ l,
22
+ u
23
+ ]);
24
+ return t(() => {
25
+ d.replace("/dashboard");
26
+ }, [d]), /* @__PURE__ */ r(e, {
27
+ value: d,
28
+ children: /* @__PURE__ */ r(s, {})
29
+ });
30
+ }
31
+ //#endregion
32
+ export { c as t };
33
+
34
+ //# sourceMappingURL=RootClientView-wAkXUEZw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RootClientView-wAkXUEZw.js","names":[],"sources":["../../src/views/root/RootView.tsx","../../src/pages/root/RootClientView.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactElement } from 'react';\n\nexport interface RootViewProps {}\n\n/**\n * Framework-agnostic placeholder for the BPM root path. Server-side redirect\n * to `/dashboard` is the consumer's responsibility (Next.js `middleware.ts`\n * or `app/page.tsx`). This view renders nothing so it can be safely mounted\n * during the redirect flash.\n *\n * Mechanical port of `apps/client/src/app/page.tsx`.\n */\nexport function RootView(_props: RootViewProps = {}): ReactElement | null {\n return null;\n}\n","'use client';\n\nimport { useEffect, useMemo, type ReactElement } from 'react';\nimport { usePathname, useRouter, useSearchParams } from 'next/navigation';\nimport {\n RouterAdapterProvider,\n type RouterAdapter,\n} from '../../lib/router-adapter';\nimport { RootView } from '../../views/root/RootView';\n\n/**\n * Next.js App Router client shim for the BPM root path. Performs a\n * `router.replace('/dashboard')` redirect via the adapter on mount so the\n * host root path lands users on the dashboard without a Server Component\n * redirect.\n */\nexport default function RootClientView(): ReactElement | null {\n const nextRouter = useRouter();\n const pathname = usePathname();\n const searchParams = useSearchParams();\n\n const adapter = useMemo<RouterAdapter>(\n () => ({\n pathname,\n push: (href: string): void => nextRouter.push(href),\n replace: (href: string): void => nextRouter.replace(href),\n back: (): void => nextRouter.back(),\n searchParams: (): URLSearchParams =>\n new URLSearchParams(searchParams?.toString() ?? ''),\n }),\n [nextRouter, pathname, searchParams],\n );\n\n useEffect((): void => {\n adapter.replace('/dashboard');\n }, [adapter]);\n\n return (\n <RouterAdapterProvider value={adapter}>\n <RootView />\n </RouterAdapterProvider>\n );\n}\n"],"mappings":";;;;;;AAcA,SAAgB,EAAS,IAAwB,CAAC,GAAwB;CACxE,OAAO;AACT;;;ACAA,SAAwB,IAAsC;CAC5D,IAAM,IAAa,EAAU,GACvB,IAAW,EAAY,GACvB,IAAe,EAAgB,GAE/B,IAAU,SACP;EACL;EACA,OAAO,MAAuB,EAAW,KAAK,CAAI;EAClD,UAAU,MAAuB,EAAW,QAAQ,CAAI;EACxD,YAAkB,EAAW,KAAK;EAClC,oBACE,IAAI,gBAAgB,GAAc,SAAS,KAAK,EAAE;CACtD,IACA;EAAC;EAAY;EAAU;CAAY,CACrC;CAMA,OAJA,QAAsB;EACpB,EAAQ,QAAQ,YAAY;CAC9B,GAAG,CAAC,CAAO,CAAC,GAGV,kBAAC,GAAD;EAAuB,OAAO;YAC5B,kBAAC,GAAD,CAAW,CAAA;CACU,CAAA;AAE3B"}
@@ -0,0 +1,2 @@
1
+ "use client";const e=require("./approval-instance-list-page-DIAmwhvl.cjs");let t=require("react/jsx-runtime");function n(n={}){return(0,t.jsx)(e.t,{activeHref:`/search`,defaultState:null,description:`以關鍵字與狀態查詢你有權限查看的簽核案件。`,emptyMessage:`沒有符合條件的簽核案件。`,searchPlaceholder:`關鍵字:搜尋案件、發起人、模板或狀態`,title:`案件搜尋`,view:`ALL`})}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return n}});
2
+ //# sourceMappingURL=SearchView-CgXPssgE.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchView-CgXPssgE.cjs","names":[],"sources":["../../src/views/search/SearchView.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactElement } from 'react';\nimport { ApprovalInstanceListPage } from '../../components/approval-instance-list-page';\n\nexport interface SearchViewProps {}\n\n/**\n * Framework-agnostic view for the BPM case search page — list of all\n * instances the current member has visibility on. Mechanical port of\n * `apps/client/src/app/search/page.tsx`.\n */\nexport function SearchView(_props: SearchViewProps = {}): ReactElement {\n return (\n <ApprovalInstanceListPage\n activeHref=\"/search\"\n defaultState={null}\n description=\"以關鍵字與狀態查詢你有權限查看的簽核案件。\"\n emptyMessage=\"沒有符合條件的簽核案件。\"\n searchPlaceholder=\"關鍵字:搜尋案件、發起人、模板或狀態\"\n title=\"案件搜尋\"\n view=\"ALL\"\n />\n );\n}\n"],"mappings":"8GAYA,SAAgB,EAAW,EAA0B,CAAC,EAAiB,CACrE,OACE,EAAA,EAAA,KAAC,EAAA,EAAD,CACE,WAAW,UACX,aAAc,KACd,YAAY,wBACZ,aAAa,eACb,kBAAkB,qBAClB,MAAM,OACN,KAAK,KACN,CAAA,CAEL"}
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import { t as e } from "./approval-instance-list-page-B6vAGvOb.js";
3
+ import { jsx as t } from "react/jsx-runtime";
4
+ //#region src/views/search/SearchView.tsx
5
+ function n(n = {}) {
6
+ return /* @__PURE__ */ t(e, {
7
+ activeHref: "/search",
8
+ defaultState: null,
9
+ description: "以關鍵字與狀態查詢你有權限查看的簽核案件。",
10
+ emptyMessage: "沒有符合條件的簽核案件。",
11
+ searchPlaceholder: "關鍵字:搜尋案件、發起人、模板或狀態",
12
+ title: "案件搜尋",
13
+ view: "ALL"
14
+ });
15
+ }
16
+ //#endregion
17
+ export { n as t };
18
+
19
+ //# sourceMappingURL=SearchView-WXMbZwRw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchView-WXMbZwRw.js","names":[],"sources":["../../src/views/search/SearchView.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactElement } from 'react';\nimport { ApprovalInstanceListPage } from '../../components/approval-instance-list-page';\n\nexport interface SearchViewProps {}\n\n/**\n * Framework-agnostic view for the BPM case search page — list of all\n * instances the current member has visibility on. Mechanical port of\n * `apps/client/src/app/search/page.tsx`.\n */\nexport function SearchView(_props: SearchViewProps = {}): ReactElement {\n return (\n <ApprovalInstanceListPage\n activeHref=\"/search\"\n defaultState={null}\n description=\"以關鍵字與狀態查詢你有權限查看的簽核案件。\"\n emptyMessage=\"沒有符合條件的簽核案件。\"\n searchPlaceholder=\"關鍵字:搜尋案件、發起人、模板或狀態\"\n title=\"案件搜尋\"\n view=\"ALL\"\n />\n );\n}\n"],"mappings":";;;;AAYA,SAAgB,EAAW,IAA0B,CAAC,GAAiB;CACrE,OACE,kBAAC,GAAD;EACE,YAAW;EACX,cAAc;EACd,aAAY;EACZ,cAAa;EACb,mBAAkB;EAClB,OAAM;EACN,MAAK;CACN,CAAA;AAEL"}
@@ -0,0 +1,2 @@
1
+ "use client";const e=require("./approval-instance-list-page-DIAmwhvl.cjs");let t=require("react/jsx-runtime");function n(n={}){return(0,t.jsx)(e.t,{activeHref:`/sent`,defaultState:null,description:`查看由你發起的簽核案件與目前流程狀態。`,emptyMessage:`目前沒有由你發起的簽核案件。`,searchPlaceholder:`關鍵字:搜尋案件、發起人、模板或狀態`,title:`我發起的`,view:`SENT`})}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return n}});
2
+ //# sourceMappingURL=SentView-BTDoFBrG.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SentView-BTDoFBrG.cjs","names":[],"sources":["../../src/views/sent/SentView.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactElement } from 'react';\nimport { ApprovalInstanceListPage } from '../../components/approval-instance-list-page';\n\nexport interface SentViewProps {}\n\n/**\n * Framework-agnostic view for the BPM \"sent\" inbox — instances the current\n * member has initiated. Mechanical port of\n * `apps/client/src/app/sent/page.tsx`.\n */\nexport function SentView(_props: SentViewProps = {}): ReactElement {\n return (\n <ApprovalInstanceListPage\n activeHref=\"/sent\"\n defaultState={null}\n description=\"查看由你發起的簽核案件與目前流程狀態。\"\n emptyMessage=\"目前沒有由你發起的簽核案件。\"\n searchPlaceholder=\"關鍵字:搜尋案件、發起人、模板或狀態\"\n title=\"我發起的\"\n view=\"SENT\"\n />\n );\n}\n"],"mappings":"8GAYA,SAAgB,EAAS,EAAwB,CAAC,EAAiB,CACjE,OACE,EAAA,EAAA,KAAC,EAAA,EAAD,CACE,WAAW,QACX,aAAc,KACd,YAAY,sBACZ,aAAa,iBACb,kBAAkB,qBAClB,MAAM,OACN,KAAK,MACN,CAAA,CAEL"}
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import { t as e } from "./approval-instance-list-page-B6vAGvOb.js";
3
+ import { jsx as t } from "react/jsx-runtime";
4
+ //#region src/views/sent/SentView.tsx
5
+ function n(n = {}) {
6
+ return /* @__PURE__ */ t(e, {
7
+ activeHref: "/sent",
8
+ defaultState: null,
9
+ description: "查看由你發起的簽核案件與目前流程狀態。",
10
+ emptyMessage: "目前沒有由你發起的簽核案件。",
11
+ searchPlaceholder: "關鍵字:搜尋案件、發起人、模板或狀態",
12
+ title: "我發起的",
13
+ view: "SENT"
14
+ });
15
+ }
16
+ //#endregion
17
+ export { n as t };
18
+
19
+ //# sourceMappingURL=SentView-CdOL92Rq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SentView-CdOL92Rq.js","names":[],"sources":["../../src/views/sent/SentView.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactElement } from 'react';\nimport { ApprovalInstanceListPage } from '../../components/approval-instance-list-page';\n\nexport interface SentViewProps {}\n\n/**\n * Framework-agnostic view for the BPM \"sent\" inbox — instances the current\n * member has initiated. Mechanical port of\n * `apps/client/src/app/sent/page.tsx`.\n */\nexport function SentView(_props: SentViewProps = {}): ReactElement {\n return (\n <ApprovalInstanceListPage\n activeHref=\"/sent\"\n defaultState={null}\n description=\"查看由你發起的簽核案件與目前流程狀態。\"\n emptyMessage=\"目前沒有由你發起的簽核案件。\"\n searchPlaceholder=\"關鍵字:搜尋案件、發起人、模板或狀態\"\n title=\"我發起的\"\n view=\"SENT\"\n />\n );\n}\n"],"mappings":";;;;AAYA,SAAgB,EAAS,IAAwB,CAAC,GAAiB;CACjE,OACE,kBAAC,GAAD;EACE,YAAW;EACX,cAAc;EACd,aAAY;EACZ,cAAa;EACb,mBAAkB;EAClB,OAAM;EACN,MAAK;CACN,CAAA;AAEL"}
@@ -0,0 +1,194 @@
1
+ "use client";
2
+ import { n as e } from "./auth-provider-TTO9eNZV.js";
3
+ import { t } from "./app-navigation-CATITRM7.js";
4
+ import { useEffect as n, useState as r } from "react";
5
+ import { Filter as i, FilterArea as a, FilterLine as o, FormField as s, Layout as c, PageHeader as l, RadioGroup as u, Section as d, SectionGroup as f, Typography as p } from "@mezzanine-ui/react";
6
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
7
+ import { readNotificationPreference as g, updateNotificationPreference as _ } from "@rytass/bpm-core-client/workflow";
8
+ import v from "@mezzanine-ui/react/ContentHeader";
9
+ import { FormFieldLayout as y } from "@mezzanine-ui/core/form";
10
+ import '../SettingsNotificationsView.css';var b = {
11
+ preferenceFilter: "bpm_preferenceFilter_snhMa",
12
+ segmentFilterControl: "bpm_segmentFilterControl_piBnq",
13
+ segmentFilterLabel: "bpm_segmentFilterLabel_U0z8J"
14
+ }, x = [{
15
+ id: "INSTANT",
16
+ name: "即時通知"
17
+ }, {
18
+ id: "DAILY",
19
+ name: "每日摘要"
20
+ }], S = [{
21
+ id: "ON",
22
+ name: "開"
23
+ }, {
24
+ id: "OFF",
25
+ name: "關"
26
+ }], C = {
27
+ emailDigestMode: "INSTANT",
28
+ emailEnabled: !0,
29
+ inAppEnabled: !0,
30
+ memberId: "",
31
+ quietHoursEnd: null,
32
+ quietHoursStart: null,
33
+ updatedAt: ""
34
+ };
35
+ function w({ activeHref: w = "/settings/notifications" } = {}) {
36
+ let { member: A } = e(), j = A?.memberId ?? null, [M, N] = r(C), [P, F] = r(!0), [I, L] = r(!1), [R, z] = r(null);
37
+ n(() => {
38
+ j && (F(!0), z(null), g(j).then((e) => {
39
+ N(e);
40
+ }).catch((e) => {
41
+ z(k(e));
42
+ }).finally(() => {
43
+ F(!1);
44
+ }));
45
+ }, [j]);
46
+ async function B(e) {
47
+ if (!j || I) return;
48
+ let t = M;
49
+ N(e), L(!0);
50
+ try {
51
+ N(await _({
52
+ emailDigestMode: e.emailDigestMode,
53
+ emailEnabled: e.emailEnabled,
54
+ inAppEnabled: e.inAppEnabled,
55
+ memberId: j,
56
+ quietHoursEnd: e.quietHoursEnd,
57
+ quietHoursStart: e.quietHoursStart
58
+ }));
59
+ } catch (e) {
60
+ N(t), z(k(e));
61
+ } finally {
62
+ L(!1);
63
+ }
64
+ }
65
+ let V = P || I;
66
+ return /* @__PURE__ */ h(c, { children: [/* @__PURE__ */ m(t, { activeHref: w }), /* @__PURE__ */ h(c.Main, { children: [/* @__PURE__ */ m(l, { children: /* @__PURE__ */ m(v, {
67
+ description: "調整站內通知、Email 通知與摘要頻率。",
68
+ title: "通知設定"
69
+ }) }), /* @__PURE__ */ m(f, { children: /* @__PURE__ */ m(d, {
70
+ filterArea: /* @__PURE__ */ m(a, {
71
+ className: b.preferenceFilter,
72
+ isDirty: !1,
73
+ children: /* @__PURE__ */ h(o, { children: [
74
+ /* @__PURE__ */ m(i, {
75
+ minWidth: 160,
76
+ span: 1,
77
+ children: /* @__PURE__ */ m(s, {
78
+ layout: y.VERTICAL,
79
+ name: "inAppEnabled",
80
+ style: T,
81
+ children: /* @__PURE__ */ h("div", {
82
+ className: b.segmentFilterControl,
83
+ children: [/* @__PURE__ */ m("span", {
84
+ className: b.segmentFilterLabel,
85
+ children: "站內通知"
86
+ }), /* @__PURE__ */ m(u, {
87
+ disabled: V,
88
+ name: "inAppEnabled",
89
+ onChange: (e) => {
90
+ B({
91
+ ...M,
92
+ inAppEnabled: D(e.target.value)
93
+ });
94
+ },
95
+ options: [...S],
96
+ size: "sub",
97
+ type: "segment",
98
+ value: O(M.inAppEnabled)
99
+ })]
100
+ })
101
+ })
102
+ }),
103
+ /* @__PURE__ */ m(i, {
104
+ minWidth: 180,
105
+ span: 1,
106
+ children: /* @__PURE__ */ m(s, {
107
+ layout: y.VERTICAL,
108
+ name: "emailEnabled",
109
+ style: T,
110
+ children: /* @__PURE__ */ h("div", {
111
+ className: b.segmentFilterControl,
112
+ children: [/* @__PURE__ */ m("span", {
113
+ className: b.segmentFilterLabel,
114
+ children: "Email 通知"
115
+ }), /* @__PURE__ */ m(u, {
116
+ disabled: V,
117
+ name: "emailEnabled",
118
+ onChange: (e) => {
119
+ B({
120
+ ...M,
121
+ emailEnabled: D(e.target.value)
122
+ });
123
+ },
124
+ options: [...S],
125
+ size: "sub",
126
+ type: "segment",
127
+ value: O(M.emailEnabled)
128
+ })]
129
+ })
130
+ })
131
+ }),
132
+ /* @__PURE__ */ m(i, {
133
+ minWidth: 280,
134
+ span: 2,
135
+ children: /* @__PURE__ */ m(s, {
136
+ fullWidth: !0,
137
+ layout: y.VERTICAL,
138
+ name: "emailDigestMode",
139
+ style: T,
140
+ children: /* @__PURE__ */ h("div", {
141
+ className: b.segmentFilterControl,
142
+ children: [/* @__PURE__ */ m("span", {
143
+ className: b.segmentFilterLabel,
144
+ children: "Email 頻率"
145
+ }), /* @__PURE__ */ m(u, {
146
+ disabled: V,
147
+ name: "emailDigestMode",
148
+ onChange: (e) => {
149
+ B({
150
+ ...M,
151
+ emailDigestMode: E(e.target.value)
152
+ });
153
+ },
154
+ options: [...x],
155
+ size: "sub",
156
+ type: "segment",
157
+ value: M.emailDigestMode
158
+ })]
159
+ })
160
+ })
161
+ })
162
+ ] })
163
+ }),
164
+ children: R ? /* @__PURE__ */ m(p, {
165
+ color: "text-error",
166
+ variant: "body",
167
+ children: R
168
+ }) : /* @__PURE__ */ m(p, {
169
+ color: "text-neutral",
170
+ variant: "body",
171
+ children: "偏好設定會立即生效。"
172
+ })
173
+ }) })] })] });
174
+ }
175
+ var T = {
176
+ minWidth: 0,
177
+ whiteSpace: "nowrap"
178
+ };
179
+ function E(e) {
180
+ return e === "DAILY" ? "DAILY" : "INSTANT";
181
+ }
182
+ function D(e) {
183
+ return e !== "OFF";
184
+ }
185
+ function O(e) {
186
+ return e ? "ON" : "OFF";
187
+ }
188
+ function k(e) {
189
+ return e instanceof Error ? e.message : "發生未知錯誤";
190
+ }
191
+ //#endregion
192
+ export { w as t };
193
+
194
+ //# sourceMappingURL=SettingsNotificationsView-B6F6fa7U.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettingsNotificationsView-B6F6fa7U.js","names":[],"sources":["../../src/views/settings/notifications/notification-settings.module.scss","../../src/views/settings/notifications/SettingsNotificationsView.tsx"],"sourcesContent":[".preferenceFilter {\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\n.segmentFilterControl {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n min-width: 0;\n white-space: nowrap;\n\n :global(.mzn-input-check-group--segmented) {\n align-self: flex-start;\n transform: translateY(-7px);\n }\n}\n\n.segmentFilterLabel {\n flex: 0 0 auto;\n color: var(--mzn-color-text-primary, #1f2937);\n font-size: 13px;\n line-height: 16px;\n}\n","'use client';\n\nimport {\n ChangeEvent,\n CSSProperties,\n ReactElement,\n useEffect,\n useState,\n} from 'react';\nimport {\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Layout,\n PageHeader,\n RadioGroup,\n Section,\n SectionGroup,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport { useAuth } from '../../../lib/auth-provider';\nimport { AppNavigation } from '../../../components/app-navigation';\nimport {\n NotificationDigestMode,\n NotificationPreferenceRecord,\n readNotificationPreference,\n updateNotificationPreference,\n} from '@rytass/bpm-core-client/workflow';\nimport styles from './notification-settings.module.scss';\n\ninterface DigestOption {\n readonly id: NotificationDigestMode;\n readonly name: string;\n}\n\ntype EnabledSegmentValue = 'OFF' | 'ON';\n\ninterface EnabledSegmentOption {\n readonly id: EnabledSegmentValue;\n readonly name: string;\n}\n\nconst DIGEST_OPTIONS: readonly DigestOption[] = [\n { id: 'INSTANT', name: '即時通知' },\n { id: 'DAILY', name: '每日摘要' },\n];\n\nconst ENABLED_SEGMENT_OPTIONS: readonly EnabledSegmentOption[] = [\n { id: 'ON', name: '開' },\n { id: 'OFF', name: '關' },\n];\n\nconst DEFAULT_PREFERENCE: NotificationPreferenceRecord = {\n emailDigestMode: 'INSTANT',\n emailEnabled: true,\n inAppEnabled: true,\n memberId: '',\n quietHoursEnd: null,\n quietHoursStart: null,\n updatedAt: '',\n};\n\nexport interface SettingsNotificationsViewProps {\n readonly activeHref?: string;\n}\n\nexport function SettingsNotificationsView({\n activeHref = '/settings/notifications',\n}: SettingsNotificationsViewProps = {}): ReactElement {\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [preference, setPreference] =\n useState<NotificationPreferenceRecord>(DEFAULT_PREFERENCE);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect((): void => {\n if (!currentMemberId) {\n return;\n }\n\n setLoading(true);\n setError(null);\n\n readNotificationPreference(currentMemberId)\n .then((nextPreference): void => {\n setPreference(nextPreference);\n })\n .catch((requestError: unknown): void => {\n setError(readErrorMessage(requestError));\n })\n .finally((): void => {\n setLoading(false);\n });\n }, [currentMemberId]);\n\n async function handlePreferenceChange(\n nextPreference: NotificationPreferenceRecord,\n ): Promise<void> {\n if (!currentMemberId || saving) {\n return;\n }\n\n const previousPreference = preference;\n setPreference(nextPreference);\n setSaving(true);\n\n try {\n setPreference(\n await updateNotificationPreference({\n emailDigestMode: nextPreference.emailDigestMode,\n emailEnabled: nextPreference.emailEnabled,\n inAppEnabled: nextPreference.inAppEnabled,\n memberId: currentMemberId,\n quietHoursEnd: nextPreference.quietHoursEnd,\n quietHoursStart: nextPreference.quietHoursStart,\n }),\n );\n } catch (requestError: unknown) {\n setPreference(previousPreference);\n setError(readErrorMessage(requestError));\n } finally {\n setSaving(false);\n }\n }\n\n const controlsDisabled = loading || saving;\n\n return (\n <Layout>\n <AppNavigation activeHref={activeHref} />\n\n <Layout.Main>\n <PageHeader>\n <ContentHeader\n description=\"調整站內通知、Email 通知與摘要頻率。\"\n title=\"通知設定\"\n />\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.preferenceFilter} isDirty={false}>\n <FilterLine>\n <Filter minWidth={160} span={1}>\n <FormField\n layout={FormFieldLayout.VERTICAL}\n name=\"inAppEnabled\"\n style={FILTER_FIELD_STYLE}\n >\n <div className={styles.segmentFilterControl}>\n <span className={styles.segmentFilterLabel}>\n 站內通知\n </span>\n <RadioGroup\n disabled={controlsDisabled}\n name=\"inAppEnabled\"\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n void handlePreferenceChange({\n ...preference,\n inAppEnabled: readEnabledSegmentValue(\n event.target.value,\n ),\n });\n }}\n options={[...ENABLED_SEGMENT_OPTIONS]}\n size=\"sub\"\n type=\"segment\"\n value={readEnabledSegmentValueId(\n preference.inAppEnabled,\n )}\n />\n </div>\n </FormField>\n </Filter>\n <Filter minWidth={180} span={1}>\n <FormField\n layout={FormFieldLayout.VERTICAL}\n name=\"emailEnabled\"\n style={FILTER_FIELD_STYLE}\n >\n <div className={styles.segmentFilterControl}>\n <span className={styles.segmentFilterLabel}>\n Email 通知\n </span>\n <RadioGroup\n disabled={controlsDisabled}\n name=\"emailEnabled\"\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n void handlePreferenceChange({\n ...preference,\n emailEnabled: readEnabledSegmentValue(\n event.target.value,\n ),\n });\n }}\n options={[...ENABLED_SEGMENT_OPTIONS]}\n size=\"sub\"\n type=\"segment\"\n value={readEnabledSegmentValueId(\n preference.emailEnabled,\n )}\n />\n </div>\n </FormField>\n </Filter>\n <Filter minWidth={280} span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"emailDigestMode\"\n style={FILTER_FIELD_STYLE}\n >\n <div className={styles.segmentFilterControl}>\n <span className={styles.segmentFilterLabel}>\n Email 頻率\n </span>\n <RadioGroup\n disabled={controlsDisabled}\n name=\"emailDigestMode\"\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n void handlePreferenceChange({\n ...preference,\n emailDigestMode: readDigestMode(\n event.target.value,\n ),\n });\n }}\n options={[...DIGEST_OPTIONS]}\n size=\"sub\"\n type=\"segment\"\n value={preference.emailDigestMode}\n />\n </div>\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : (\n <Typography color=\"text-neutral\" variant=\"body\">\n 偏好設定會立即生效。\n </Typography>\n )}\n </Section>\n </SectionGroup>\n </Layout.Main>\n </Layout>\n );\n}\n\nconst FILTER_FIELD_STYLE = {\n minWidth: 0,\n whiteSpace: 'nowrap',\n} satisfies CSSProperties;\n\nfunction readDigestMode(value: unknown): NotificationDigestMode {\n return value === 'DAILY' ? 'DAILY' : 'INSTANT';\n}\n\nfunction readEnabledSegmentValue(value: unknown): boolean {\n return value !== 'OFF';\n}\n\nfunction readEnabledSegmentValueId(enabled: boolean): EnabledSegmentValue {\n return enabled ? 'ON' : 'OFF';\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use client";require('../SettingsNotificationsView.css');const e=require("./app-navigation-DAC5gFbG.cjs"),t=require("./auth-provider-D2P-qWmY.cjs");let n=require("react"),r=require("@mezzanine-ui/react"),i=require("react/jsx-runtime"),a=require("@rytass/bpm-core-client/workflow"),o=require("@mezzanine-ui/react/ContentHeader");o=e.o(o,1);let s=require("@mezzanine-ui/core/form");var c={preferenceFilter:`bpm_preferenceFilter_snhMa`,segmentFilterControl:`bpm_segmentFilterControl_piBnq`,segmentFilterLabel:`bpm_segmentFilterLabel_U0z8J`},l=[{id:`INSTANT`,name:`即時通知`},{id:`DAILY`,name:`每日摘要`}],u=[{id:`ON`,name:`開`},{id:`OFF`,name:`關`}],d={emailDigestMode:`INSTANT`,emailEnabled:!0,inAppEnabled:!0,memberId:``,quietHoursEnd:null,quietHoursStart:null,updatedAt:``};function f({activeHref:f=`/settings/notifications`}={}){let{member:v}=t.n(),y=v?.memberId??null,[b,x]=(0,n.useState)(d),[S,C]=(0,n.useState)(!0),[w,T]=(0,n.useState)(!1),[E,D]=(0,n.useState)(null);(0,n.useEffect)(()=>{y&&(C(!0),D(null),(0,a.readNotificationPreference)(y).then(e=>{x(e)}).catch(e=>{D(_(e))}).finally(()=>{C(!1)}))},[y]);async function O(e){if(!y||w)return;let t=b;x(e),T(!0);try{x(await(0,a.updateNotificationPreference)({emailDigestMode:e.emailDigestMode,emailEnabled:e.emailEnabled,inAppEnabled:e.inAppEnabled,memberId:y,quietHoursEnd:e.quietHoursEnd,quietHoursStart:e.quietHoursStart}))}catch(e){x(t),D(_(e))}finally{T(!1)}}let k=S||w;return(0,i.jsxs)(r.Layout,{children:[(0,i.jsx)(e.t,{activeHref:f}),(0,i.jsxs)(r.Layout.Main,{children:[(0,i.jsx)(r.PageHeader,{children:(0,i.jsx)(o.default,{description:`調整站內通知、Email 通知與摘要頻率。`,title:`通知設定`})}),(0,i.jsx)(r.SectionGroup,{children:(0,i.jsx)(r.Section,{filterArea:(0,i.jsx)(r.FilterArea,{className:c.preferenceFilter,isDirty:!1,children:(0,i.jsxs)(r.FilterLine,{children:[(0,i.jsx)(r.Filter,{minWidth:160,span:1,children:(0,i.jsx)(r.FormField,{layout:s.FormFieldLayout.VERTICAL,name:`inAppEnabled`,style:p,children:(0,i.jsxs)(`div`,{className:c.segmentFilterControl,children:[(0,i.jsx)(`span`,{className:c.segmentFilterLabel,children:`站內通知`}),(0,i.jsx)(r.RadioGroup,{disabled:k,name:`inAppEnabled`,onChange:e=>{O({...b,inAppEnabled:h(e.target.value)})},options:[...u],size:`sub`,type:`segment`,value:g(b.inAppEnabled)})]})})}),(0,i.jsx)(r.Filter,{minWidth:180,span:1,children:(0,i.jsx)(r.FormField,{layout:s.FormFieldLayout.VERTICAL,name:`emailEnabled`,style:p,children:(0,i.jsxs)(`div`,{className:c.segmentFilterControl,children:[(0,i.jsx)(`span`,{className:c.segmentFilterLabel,children:`Email 通知`}),(0,i.jsx)(r.RadioGroup,{disabled:k,name:`emailEnabled`,onChange:e=>{O({...b,emailEnabled:h(e.target.value)})},options:[...u],size:`sub`,type:`segment`,value:g(b.emailEnabled)})]})})}),(0,i.jsx)(r.Filter,{minWidth:280,span:2,children:(0,i.jsx)(r.FormField,{fullWidth:!0,layout:s.FormFieldLayout.VERTICAL,name:`emailDigestMode`,style:p,children:(0,i.jsxs)(`div`,{className:c.segmentFilterControl,children:[(0,i.jsx)(`span`,{className:c.segmentFilterLabel,children:`Email 頻率`}),(0,i.jsx)(r.RadioGroup,{disabled:k,name:`emailDigestMode`,onChange:e=>{O({...b,emailDigestMode:m(e.target.value)})},options:[...l],size:`sub`,type:`segment`,value:b.emailDigestMode})]})})})]})}),children:E?(0,i.jsx)(r.Typography,{color:`text-error`,variant:`body`,children:E}):(0,i.jsx)(r.Typography,{color:`text-neutral`,variant:`body`,children:`偏好設定會立即生效。`})})})]})]})}var p={minWidth:0,whiteSpace:`nowrap`};function m(e){return e===`DAILY`?`DAILY`:`INSTANT`}function h(e){return e!==`OFF`}function g(e){return e?`ON`:`OFF`}function _(e){return e instanceof Error?e.message:`發生未知錯誤`}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return f}});
2
+ //# sourceMappingURL=SettingsNotificationsView-Bnz0CmoJ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettingsNotificationsView-Bnz0CmoJ.cjs","names":[],"sources":["../../src/views/settings/notifications/notification-settings.module.scss","../../src/views/settings/notifications/SettingsNotificationsView.tsx"],"sourcesContent":[".preferenceFilter {\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\n.segmentFilterControl {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n min-width: 0;\n white-space: nowrap;\n\n :global(.mzn-input-check-group--segmented) {\n align-self: flex-start;\n transform: translateY(-7px);\n }\n}\n\n.segmentFilterLabel {\n flex: 0 0 auto;\n color: var(--mzn-color-text-primary, #1f2937);\n font-size: 13px;\n line-height: 16px;\n}\n","'use client';\n\nimport {\n ChangeEvent,\n CSSProperties,\n ReactElement,\n useEffect,\n useState,\n} from 'react';\nimport {\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Layout,\n PageHeader,\n RadioGroup,\n Section,\n SectionGroup,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport { useAuth } from '../../../lib/auth-provider';\nimport { AppNavigation } from '../../../components/app-navigation';\nimport {\n NotificationDigestMode,\n NotificationPreferenceRecord,\n readNotificationPreference,\n updateNotificationPreference,\n} from '@rytass/bpm-core-client/workflow';\nimport styles from './notification-settings.module.scss';\n\ninterface DigestOption {\n readonly id: NotificationDigestMode;\n readonly name: string;\n}\n\ntype EnabledSegmentValue = 'OFF' | 'ON';\n\ninterface EnabledSegmentOption {\n readonly id: EnabledSegmentValue;\n readonly name: string;\n}\n\nconst DIGEST_OPTIONS: readonly DigestOption[] = [\n { id: 'INSTANT', name: '即時通知' },\n { id: 'DAILY', name: '每日摘要' },\n];\n\nconst ENABLED_SEGMENT_OPTIONS: readonly EnabledSegmentOption[] = [\n { id: 'ON', name: '開' },\n { id: 'OFF', name: '關' },\n];\n\nconst DEFAULT_PREFERENCE: NotificationPreferenceRecord = {\n emailDigestMode: 'INSTANT',\n emailEnabled: true,\n inAppEnabled: true,\n memberId: '',\n quietHoursEnd: null,\n quietHoursStart: null,\n updatedAt: '',\n};\n\nexport interface SettingsNotificationsViewProps {\n readonly activeHref?: string;\n}\n\nexport function SettingsNotificationsView({\n activeHref = '/settings/notifications',\n}: SettingsNotificationsViewProps = {}): ReactElement {\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [preference, setPreference] =\n useState<NotificationPreferenceRecord>(DEFAULT_PREFERENCE);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect((): void => {\n if (!currentMemberId) {\n return;\n }\n\n setLoading(true);\n setError(null);\n\n readNotificationPreference(currentMemberId)\n .then((nextPreference): void => {\n setPreference(nextPreference);\n })\n .catch((requestError: unknown): void => {\n setError(readErrorMessage(requestError));\n })\n .finally((): void => {\n setLoading(false);\n });\n }, [currentMemberId]);\n\n async function handlePreferenceChange(\n nextPreference: NotificationPreferenceRecord,\n ): Promise<void> {\n if (!currentMemberId || saving) {\n return;\n }\n\n const previousPreference = preference;\n setPreference(nextPreference);\n setSaving(true);\n\n try {\n setPreference(\n await updateNotificationPreference({\n emailDigestMode: nextPreference.emailDigestMode,\n emailEnabled: nextPreference.emailEnabled,\n inAppEnabled: nextPreference.inAppEnabled,\n memberId: currentMemberId,\n quietHoursEnd: nextPreference.quietHoursEnd,\n quietHoursStart: nextPreference.quietHoursStart,\n }),\n );\n } catch (requestError: unknown) {\n setPreference(previousPreference);\n setError(readErrorMessage(requestError));\n } finally {\n setSaving(false);\n }\n }\n\n const controlsDisabled = loading || saving;\n\n return (\n <Layout>\n <AppNavigation activeHref={activeHref} />\n\n <Layout.Main>\n <PageHeader>\n <ContentHeader\n description=\"調整站內通知、Email 通知與摘要頻率。\"\n title=\"通知設定\"\n />\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.preferenceFilter} isDirty={false}>\n <FilterLine>\n <Filter minWidth={160} span={1}>\n <FormField\n layout={FormFieldLayout.VERTICAL}\n name=\"inAppEnabled\"\n style={FILTER_FIELD_STYLE}\n >\n <div className={styles.segmentFilterControl}>\n <span className={styles.segmentFilterLabel}>\n 站內通知\n </span>\n <RadioGroup\n disabled={controlsDisabled}\n name=\"inAppEnabled\"\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n void handlePreferenceChange({\n ...preference,\n inAppEnabled: readEnabledSegmentValue(\n event.target.value,\n ),\n });\n }}\n options={[...ENABLED_SEGMENT_OPTIONS]}\n size=\"sub\"\n type=\"segment\"\n value={readEnabledSegmentValueId(\n preference.inAppEnabled,\n )}\n />\n </div>\n </FormField>\n </Filter>\n <Filter minWidth={180} span={1}>\n <FormField\n layout={FormFieldLayout.VERTICAL}\n name=\"emailEnabled\"\n style={FILTER_FIELD_STYLE}\n >\n <div className={styles.segmentFilterControl}>\n <span className={styles.segmentFilterLabel}>\n Email 通知\n </span>\n <RadioGroup\n disabled={controlsDisabled}\n name=\"emailEnabled\"\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n void handlePreferenceChange({\n ...preference,\n emailEnabled: readEnabledSegmentValue(\n event.target.value,\n ),\n });\n }}\n options={[...ENABLED_SEGMENT_OPTIONS]}\n size=\"sub\"\n type=\"segment\"\n value={readEnabledSegmentValueId(\n preference.emailEnabled,\n )}\n />\n </div>\n </FormField>\n </Filter>\n <Filter minWidth={280} span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"emailDigestMode\"\n style={FILTER_FIELD_STYLE}\n >\n <div className={styles.segmentFilterControl}>\n <span className={styles.segmentFilterLabel}>\n Email 頻率\n </span>\n <RadioGroup\n disabled={controlsDisabled}\n name=\"emailDigestMode\"\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n void handlePreferenceChange({\n ...preference,\n emailDigestMode: readDigestMode(\n event.target.value,\n ),\n });\n }}\n options={[...DIGEST_OPTIONS]}\n size=\"sub\"\n type=\"segment\"\n value={preference.emailDigestMode}\n />\n </div>\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : (\n <Typography color=\"text-neutral\" variant=\"body\">\n 偏好設定會立即生效。\n </Typography>\n )}\n </Section>\n </SectionGroup>\n </Layout.Main>\n </Layout>\n );\n}\n\nconst FILTER_FIELD_STYLE = {\n minWidth: 0,\n whiteSpace: 'nowrap',\n} satisfies CSSProperties;\n\nfunction readDigestMode(value: unknown): NotificationDigestMode {\n return value === 'DAILY' ? 'DAILY' : 'INSTANT';\n}\n\nfunction readEnabledSegmentValue(value: unknown): boolean {\n return value !== 'OFF';\n}\n\nfunction readEnabledSegmentValueId(enabled: boolean): EnabledSegmentValue {\n return enabled ? 'ON' : 'OFF';\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n"],"mappings":"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"}