@rytass/bpm-core-react 0.2.0 → 0.3.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 (418) hide show
  1. package/dist/chunks/app-navigation-BRRFCkxZ.cjs +2 -0
  2. package/dist/chunks/{app-navigation-DAC5gFbG.cjs.map → app-navigation-BRRFCkxZ.cjs.map} +1 -1
  3. package/dist/chunks/{app-navigation-CATITRM7.js → app-navigation-rxhpHCch.js} +2 -3
  4. package/dist/chunks/{app-navigation-CATITRM7.js.map → app-navigation-rxhpHCch.js.map} +1 -1
  5. package/dist/chunks/approval-instance-list-page-2vUWc5-c.cjs +2 -0
  6. package/dist/chunks/{approval-instance-list-page-DIAmwhvl.cjs.map → approval-instance-list-page-2vUWc5-c.cjs.map} +1 -1
  7. package/dist/chunks/{approval-instance-list-page-B6vAGvOb.js → approval-instance-list-page-BgE4vQw8.js} +3 -3
  8. package/dist/chunks/{approval-instance-list-page-B6vAGvOb.js.map → approval-instance-list-page-BgE4vQw8.js.map} +1 -1
  9. package/dist/chunks/auth-provider-BV8Iiwfb.cjs +2 -0
  10. package/dist/chunks/auth-provider-BV8Iiwfb.cjs.map +1 -0
  11. package/dist/chunks/auth-provider-Bnox5gsx.js +98 -0
  12. package/dist/chunks/auth-provider-Bnox5gsx.js.map +1 -0
  13. package/dist/chunks/builder-B8X-m6C5.cjs +3 -0
  14. package/dist/chunks/builder-B8X-m6C5.cjs.map +1 -0
  15. package/dist/chunks/{FormBuilderView-CvChAvgD.js → builder-Du_0apkh.js} +3 -3
  16. package/dist/chunks/builder-Du_0apkh.js.map +1 -0
  17. package/dist/chunks/{TemplateCategoriesView-CgZciaSd.js → categories-DG4k7S8V.js} +86 -85
  18. package/dist/chunks/categories-DG4k7S8V.js.map +1 -0
  19. package/dist/chunks/categories-DshBQG33.cjs +2 -0
  20. package/dist/chunks/categories-DshBQG33.cjs.map +1 -0
  21. package/dist/chunks/{dashboard-page-BsW8t104.js → dashboard-page-CTBwpu_D.js} +3 -4
  22. package/dist/chunks/{dashboard-page-BsW8t104.js.map → dashboard-page-CTBwpu_D.js.map} +1 -1
  23. package/dist/chunks/dashboard-page-DcDiWQp2.cjs +2 -0
  24. package/dist/chunks/{dashboard-page-udYhnyMW.cjs.map → dashboard-page-DcDiWQp2.cjs.map} +1 -1
  25. package/dist/chunks/{AdminDelegationsView-DydMZ9ED.js → delegations-BAZQbElH.js} +4 -4
  26. package/dist/chunks/delegations-BAZQbElH.js.map +1 -0
  27. package/dist/chunks/{DelegationsView-DQUqOUV5.js → delegations-DzrckrPp.js} +4 -4
  28. package/dist/chunks/delegations-DzrckrPp.js.map +1 -0
  29. package/dist/chunks/delegations-Z8hTajLj.cjs +2 -0
  30. package/dist/chunks/delegations-Z8hTajLj.cjs.map +1 -0
  31. package/dist/chunks/delegations-hb9JoVZe.cjs +2 -0
  32. package/dist/chunks/delegations-hb9JoVZe.cjs.map +1 -0
  33. package/dist/chunks/{InstanceDetailView-C-A-LOCG.js → detail-DilI0PPe.js} +10 -10
  34. package/dist/chunks/detail-DilI0PPe.js.map +1 -0
  35. package/dist/chunks/detail-DuRg3Y7b.cjs +2 -0
  36. package/dist/chunks/detail-DuRg3Y7b.cjs.map +1 -0
  37. package/dist/chunks/{format-date-time-BQyH5U8z.cjs → format-date-time-hKLVMxq4.cjs} +2 -2
  38. package/dist/chunks/{format-date-time-BQyH5U8z.cjs.map → format-date-time-hKLVMxq4.cjs.map} +1 -1
  39. package/dist/chunks/{LoginView-a1iu3cfc.js → login-C20yVxbc.js} +9 -9
  40. package/dist/chunks/login-C20yVxbc.js.map +1 -0
  41. package/dist/chunks/login-CQ9MfwcC.cjs +2 -0
  42. package/dist/chunks/login-CQ9MfwcC.cjs.map +1 -0
  43. package/dist/chunks/{SettingsNotificationsView-B6F6fa7U.js → notifications-B2Lk3grg.js} +4 -4
  44. package/dist/chunks/notifications-B2Lk3grg.js.map +1 -0
  45. package/dist/chunks/notifications-C8ADhnxF.cjs +2 -0
  46. package/dist/chunks/notifications-C8ADhnxF.cjs.map +1 -0
  47. package/dist/chunks/orgs-CGv3VNDR.cjs +2 -0
  48. package/dist/chunks/orgs-CGv3VNDR.cjs.map +1 -0
  49. package/dist/chunks/{AdminOrgsView-DZaVAbaQ.js → orgs-c29y74w2.js} +52 -52
  50. package/dist/chunks/orgs-c29y74w2.js.map +1 -0
  51. package/dist/chunks/templates-Cd0WFheA.cjs +2 -0
  52. package/dist/chunks/templates-Cd0WFheA.cjs.map +1 -0
  53. package/dist/chunks/{TemplatesView-BLj9f-XI.js → templates-Dn9QHFSy.js} +4 -4
  54. package/dist/chunks/templates-Dn9QHFSy.js.map +1 -0
  55. package/dist/chunks/users-B-trMu0E.cjs +2 -0
  56. package/dist/chunks/users-B-trMu0E.cjs.map +1 -0
  57. package/dist/chunks/{AdminUsersView-C0oO05Br.js → users-itVXXRj7.js} +3 -3
  58. package/dist/chunks/users-itVXXRj7.js.map +1 -0
  59. package/dist/index.cjs +1 -1
  60. package/dist/index.cjs.map +1 -1
  61. package/dist/index.js +12 -13
  62. package/dist/index.js.map +1 -1
  63. package/dist/next/BPMNextProviders.d.ts +6 -0
  64. package/dist/next/index.cjs +2 -0
  65. package/dist/next/index.cjs.map +1 -0
  66. package/dist/next/index.d.ts +1 -0
  67. package/dist/next/index.js +33 -0
  68. package/dist/next/index.js.map +1 -0
  69. package/dist/pages/admin/delegations/index.cjs +1 -1
  70. package/dist/pages/admin/delegations/index.cjs.map +1 -1
  71. package/dist/pages/admin/delegations/index.js +1 -1
  72. package/dist/pages/admin/delegations/index.js.map +1 -1
  73. package/dist/pages/admin/orgs/index.cjs +1 -1
  74. package/dist/pages/admin/orgs/index.cjs.map +1 -1
  75. package/dist/pages/admin/orgs/index.js +1 -1
  76. package/dist/pages/admin/orgs/index.js.map +1 -1
  77. package/dist/pages/admin/users/index.cjs +1 -1
  78. package/dist/pages/admin/users/index.cjs.map +1 -1
  79. package/dist/pages/admin/users/index.js +1 -1
  80. package/dist/pages/admin/users/index.js.map +1 -1
  81. package/dist/pages/cc/index.cjs +1 -1
  82. package/dist/pages/cc/index.cjs.map +1 -1
  83. package/dist/pages/cc/index.js +1 -1
  84. package/dist/pages/cc/index.js.map +1 -1
  85. package/dist/pages/dashboard/index.cjs +1 -1
  86. package/dist/pages/dashboard/index.cjs.map +1 -1
  87. package/dist/pages/dashboard/index.js +1 -1
  88. package/dist/pages/dashboard/index.js.map +1 -1
  89. package/dist/pages/delegations/index.cjs +1 -1
  90. package/dist/pages/delegations/index.cjs.map +1 -1
  91. package/dist/pages/delegations/index.js +1 -1
  92. package/dist/pages/delegations/index.js.map +1 -1
  93. package/dist/pages/forms/builder/index.cjs +1 -1
  94. package/dist/pages/forms/builder/index.cjs.map +1 -1
  95. package/dist/pages/forms/builder/index.d.ts +5 -7
  96. package/dist/pages/forms/builder/index.js +1 -1
  97. package/dist/pages/forms/builder/index.js.map +1 -1
  98. package/dist/pages/forms/index.cjs +1 -1
  99. package/dist/pages/forms/index.cjs.map +1 -1
  100. package/dist/pages/forms/index.js +1 -1
  101. package/dist/pages/forms/index.js.map +1 -1
  102. package/dist/pages/inbox/index.cjs +1 -1
  103. package/dist/pages/inbox/index.cjs.map +1 -1
  104. package/dist/pages/inbox/index.js +1 -1
  105. package/dist/pages/inbox/index.js.map +1 -1
  106. package/dist/pages/instances/detail/index.cjs +1 -1
  107. package/dist/pages/instances/detail/index.cjs.map +1 -1
  108. package/dist/pages/instances/detail/index.d.ts +1 -1
  109. package/dist/pages/instances/detail/index.js +1 -1
  110. package/dist/pages/instances/detail/index.js.map +1 -1
  111. package/dist/pages/instances/new/index.cjs +1 -1
  112. package/dist/pages/instances/new/index.cjs.map +1 -1
  113. package/dist/pages/instances/new/index.d.ts +5 -1
  114. package/dist/pages/instances/new/index.js +4 -3
  115. package/dist/pages/instances/new/index.js.map +1 -1
  116. package/dist/pages/login/index.cjs +1 -1
  117. package/dist/pages/login/index.cjs.map +1 -1
  118. package/dist/pages/login/index.d.ts +5 -1
  119. package/dist/pages/login/index.js +4 -3
  120. package/dist/pages/login/index.js.map +1 -1
  121. package/dist/pages/root/index.cjs +1 -1
  122. package/dist/pages/root/index.cjs.map +1 -1
  123. package/dist/pages/root/index.d.ts +7 -5
  124. package/dist/pages/root/index.js +5 -6
  125. package/dist/pages/root/index.js.map +1 -1
  126. package/dist/pages/search/index.cjs +1 -1
  127. package/dist/pages/search/index.cjs.map +1 -1
  128. package/dist/pages/search/index.js +1 -1
  129. package/dist/pages/search/index.js.map +1 -1
  130. package/dist/pages/sent/index.cjs +1 -1
  131. package/dist/pages/sent/index.cjs.map +1 -1
  132. package/dist/pages/sent/index.js +1 -1
  133. package/dist/pages/sent/index.js.map +1 -1
  134. package/dist/pages/settings/notifications/index.cjs +1 -1
  135. package/dist/pages/settings/notifications/index.cjs.map +1 -1
  136. package/dist/pages/settings/notifications/index.js +1 -1
  137. package/dist/pages/settings/notifications/index.js.map +1 -1
  138. package/dist/pages/templates/categories/index.cjs +1 -1
  139. package/dist/pages/templates/categories/index.cjs.map +1 -1
  140. package/dist/pages/templates/categories/index.js +1 -1
  141. package/dist/pages/templates/categories/index.js.map +1 -1
  142. package/dist/pages/templates/designer/index.cjs +1 -1
  143. package/dist/pages/templates/designer/index.cjs.map +1 -1
  144. package/dist/pages/templates/designer/index.d.ts +2 -4
  145. package/dist/pages/templates/designer/index.js +1 -1
  146. package/dist/pages/templates/designer/index.js.map +1 -1
  147. package/dist/pages/templates/index.cjs +1 -1
  148. package/dist/pages/templates/index.cjs.map +1 -1
  149. package/dist/pages/templates/index.js +1 -1
  150. package/dist/pages/templates/index.js.map +1 -1
  151. package/dist/pages/templates/versions/index.cjs +1 -1
  152. package/dist/pages/templates/versions/index.cjs.map +1 -1
  153. package/dist/pages/templates/versions/index.d.ts +2 -4
  154. package/dist/pages/templates/versions/index.js +1 -1
  155. package/dist/pages/templates/versions/index.js.map +1 -1
  156. package/dist/views/admin/delegations/index.cjs +1 -1
  157. package/dist/views/admin/delegations/index.js +1 -1
  158. package/dist/views/admin/index.cjs +1 -0
  159. package/dist/views/admin/index.d.ts +3 -0
  160. package/dist/views/admin/index.js +4 -0
  161. package/dist/views/admin/orgs/index.cjs +1 -1
  162. package/dist/views/admin/orgs/index.js +1 -1
  163. package/dist/views/admin/users/index.cjs +1 -1
  164. package/dist/views/admin/users/index.js +1 -1
  165. package/dist/views/cc/index.cjs +2 -1
  166. package/dist/views/cc/index.cjs.map +1 -0
  167. package/dist/views/cc/index.js +19 -2
  168. package/dist/views/cc/index.js.map +1 -0
  169. package/dist/views/dashboard/index.cjs +2 -1
  170. package/dist/views/dashboard/index.cjs.map +1 -0
  171. package/dist/views/dashboard/index.js +11 -2
  172. package/dist/views/dashboard/index.js.map +1 -0
  173. package/dist/views/delegations/index.cjs +1 -1
  174. package/dist/views/delegations/index.js +1 -1
  175. package/dist/views/forms/builder/index.cjs +1 -1
  176. package/dist/views/forms/builder/index.js +1 -1
  177. package/dist/views/forms/index.cjs +2 -1
  178. package/dist/views/forms/index.cjs.map +1 -0
  179. package/dist/views/forms/index.d.ts +1 -0
  180. package/dist/views/forms/index.js +186 -2
  181. package/dist/views/forms/index.js.map +1 -0
  182. package/dist/views/inbox/index.cjs +2 -1
  183. package/dist/views/inbox/index.cjs.map +1 -0
  184. package/dist/views/inbox/index.js +290 -2
  185. package/dist/views/inbox/index.js.map +1 -0
  186. package/dist/views/instances/detail/index.cjs +1 -1
  187. package/dist/views/instances/detail/index.js +1 -1
  188. package/dist/views/instances/index.cjs +1 -0
  189. package/dist/views/instances/index.d.ts +1 -0
  190. package/dist/views/instances/index.js +2 -0
  191. package/dist/views/instances/new/InstanceNewView.d.ts +3 -3
  192. package/dist/views/instances/new/index.cjs +2 -1
  193. package/dist/views/instances/new/index.cjs.map +1 -0
  194. package/dist/views/instances/new/index.js +189 -2
  195. package/dist/views/instances/new/index.js.map +1 -0
  196. package/dist/views/login/index.cjs +1 -1
  197. package/dist/views/login/index.js +1 -1
  198. package/dist/views/search/index.cjs +2 -1
  199. package/dist/views/search/index.cjs.map +1 -0
  200. package/dist/views/search/index.js +19 -2
  201. package/dist/views/search/index.js.map +1 -0
  202. package/dist/views/sent/index.cjs +2 -1
  203. package/dist/views/sent/index.cjs.map +1 -0
  204. package/dist/views/sent/index.js +19 -2
  205. package/dist/views/sent/index.js.map +1 -0
  206. package/dist/views/settings/index.cjs +1 -0
  207. package/dist/views/settings/index.d.ts +1 -0
  208. package/dist/views/settings/index.js +2 -0
  209. package/dist/views/settings/notifications/index.cjs +1 -1
  210. package/dist/views/settings/notifications/index.js +1 -1
  211. package/dist/views/templates/categories/index.cjs +1 -1
  212. package/dist/views/templates/categories/index.js +1 -1
  213. package/dist/views/templates/designer/index.cjs +51 -1
  214. package/dist/views/templates/designer/index.cjs.map +1 -0
  215. package/dist/views/templates/designer/index.js +2272 -2
  216. package/dist/views/templates/designer/index.js.map +1 -0
  217. package/dist/views/templates/index.cjs +1 -1
  218. package/dist/views/templates/index.d.ts +2 -0
  219. package/dist/views/templates/index.js +4 -2
  220. package/dist/views/templates/versions/index.cjs +2 -1
  221. package/dist/views/templates/versions/index.cjs.map +1 -0
  222. package/dist/views/templates/versions/index.js +110 -2
  223. package/dist/views/templates/versions/index.js.map +1 -0
  224. package/dist/views/workflow/index.cjs +1 -0
  225. package/dist/views/workflow/index.d.ts +4 -0
  226. package/dist/views/workflow/index.js +5 -0
  227. package/package.json +28 -3
  228. package/dist/chunks/AdminDelegationsView-CqNmlVWx.cjs +0 -2
  229. package/dist/chunks/AdminDelegationsView-CqNmlVWx.cjs.map +0 -1
  230. package/dist/chunks/AdminDelegationsView-DydMZ9ED.js.map +0 -1
  231. package/dist/chunks/AdminOrgsView-DZaVAbaQ.js.map +0 -1
  232. package/dist/chunks/AdminOrgsView-bSsIyMvk.cjs +0 -2
  233. package/dist/chunks/AdminOrgsView-bSsIyMvk.cjs.map +0 -1
  234. package/dist/chunks/AdminUsersView-C0oO05Br.js.map +0 -1
  235. package/dist/chunks/AdminUsersView-DlArLlIr.cjs +0 -2
  236. package/dist/chunks/AdminUsersView-DlArLlIr.cjs.map +0 -1
  237. package/dist/chunks/CcView-BsVsya5F.cjs +0 -2
  238. package/dist/chunks/CcView-BsVsya5F.cjs.map +0 -1
  239. package/dist/chunks/CcView-Bv0GzA5C.js +0 -19
  240. package/dist/chunks/CcView-Bv0GzA5C.js.map +0 -1
  241. package/dist/chunks/DashboardView-Dk1ZQmmk.js +0 -11
  242. package/dist/chunks/DashboardView-Dk1ZQmmk.js.map +0 -1
  243. package/dist/chunks/DashboardView-_0zh-rxT.cjs +0 -2
  244. package/dist/chunks/DashboardView-_0zh-rxT.cjs.map +0 -1
  245. package/dist/chunks/DelegationsView-DQUqOUV5.js.map +0 -1
  246. package/dist/chunks/DelegationsView-pKeFV2LN.cjs +0 -2
  247. package/dist/chunks/DelegationsView-pKeFV2LN.cjs.map +0 -1
  248. package/dist/chunks/FormBuilderView-BKtyW55e.cjs +0 -3
  249. package/dist/chunks/FormBuilderView-BKtyW55e.cjs.map +0 -1
  250. package/dist/chunks/FormBuilderView-CvChAvgD.js.map +0 -1
  251. package/dist/chunks/FormsView-DYEuik8W.js +0 -185
  252. package/dist/chunks/FormsView-DYEuik8W.js.map +0 -1
  253. package/dist/chunks/FormsView-RjJEkIfZ.cjs +0 -2
  254. package/dist/chunks/FormsView-RjJEkIfZ.cjs.map +0 -1
  255. package/dist/chunks/InboxView-DDWwmWhA.cjs +0 -2
  256. package/dist/chunks/InboxView-DDWwmWhA.cjs.map +0 -1
  257. package/dist/chunks/InboxView-YSoyrYLk.js +0 -291
  258. package/dist/chunks/InboxView-YSoyrYLk.js.map +0 -1
  259. package/dist/chunks/InstanceDetailView-C-A-LOCG.js.map +0 -1
  260. package/dist/chunks/InstanceDetailView-l_kNDCz2.cjs +0 -2
  261. package/dist/chunks/InstanceDetailView-l_kNDCz2.cjs.map +0 -1
  262. package/dist/chunks/InstanceNewView-B5hz-FWd.js +0 -190
  263. package/dist/chunks/InstanceNewView-B5hz-FWd.js.map +0 -1
  264. package/dist/chunks/InstanceNewView-CdCsxQIu.cjs +0 -2
  265. package/dist/chunks/InstanceNewView-CdCsxQIu.cjs.map +0 -1
  266. package/dist/chunks/LoginView-BED07v-7.cjs +0 -2
  267. package/dist/chunks/LoginView-BED07v-7.cjs.map +0 -1
  268. package/dist/chunks/LoginView-a1iu3cfc.js.map +0 -1
  269. package/dist/chunks/RootClientView-rXJt4TDd.cjs +0 -2
  270. package/dist/chunks/RootClientView-rXJt4TDd.cjs.map +0 -1
  271. package/dist/chunks/RootClientView-wAkXUEZw.js +0 -34
  272. package/dist/chunks/RootClientView-wAkXUEZw.js.map +0 -1
  273. package/dist/chunks/SearchView-CgXPssgE.cjs +0 -2
  274. package/dist/chunks/SearchView-CgXPssgE.cjs.map +0 -1
  275. package/dist/chunks/SearchView-WXMbZwRw.js +0 -19
  276. package/dist/chunks/SearchView-WXMbZwRw.js.map +0 -1
  277. package/dist/chunks/SentView-BTDoFBrG.cjs +0 -2
  278. package/dist/chunks/SentView-BTDoFBrG.cjs.map +0 -1
  279. package/dist/chunks/SentView-CdOL92Rq.js +0 -19
  280. package/dist/chunks/SentView-CdOL92Rq.js.map +0 -1
  281. package/dist/chunks/SettingsNotificationsView-B6F6fa7U.js.map +0 -1
  282. package/dist/chunks/SettingsNotificationsView-Bnz0CmoJ.cjs +0 -2
  283. package/dist/chunks/SettingsNotificationsView-Bnz0CmoJ.cjs.map +0 -1
  284. package/dist/chunks/TemplateCategoriesView-CgZciaSd.js.map +0 -1
  285. package/dist/chunks/TemplateCategoriesView-U0stGUBc.cjs +0 -2
  286. package/dist/chunks/TemplateCategoriesView-U0stGUBc.cjs.map +0 -1
  287. package/dist/chunks/TemplateDesignerView-A38DyYD4.cjs +0 -51
  288. package/dist/chunks/TemplateDesignerView-A38DyYD4.cjs.map +0 -1
  289. package/dist/chunks/TemplateDesignerView-Dffx-VZ-.js +0 -2272
  290. package/dist/chunks/TemplateDesignerView-Dffx-VZ-.js.map +0 -1
  291. package/dist/chunks/TemplateVersionsView-6sVQbBem.js +0 -110
  292. package/dist/chunks/TemplateVersionsView-6sVQbBem.js.map +0 -1
  293. package/dist/chunks/TemplateVersionsView-CMqw3ieU.cjs +0 -2
  294. package/dist/chunks/TemplateVersionsView-CMqw3ieU.cjs.map +0 -1
  295. package/dist/chunks/TemplatesView-BLj9f-XI.js.map +0 -1
  296. package/dist/chunks/TemplatesView-DIOQTUUl.cjs +0 -2
  297. package/dist/chunks/TemplatesView-DIOQTUUl.cjs.map +0 -1
  298. package/dist/chunks/app-navigation-DAC5gFbG.cjs +0 -2
  299. package/dist/chunks/approval-instance-list-page-DIAmwhvl.cjs +0 -2
  300. package/dist/chunks/auth-provider-D2P-qWmY.cjs +0 -2
  301. package/dist/chunks/auth-provider-D2P-qWmY.cjs.map +0 -1
  302. package/dist/chunks/auth-provider-TTO9eNZV.js +0 -83
  303. package/dist/chunks/auth-provider-TTO9eNZV.js.map +0 -1
  304. package/dist/chunks/dashboard-page-udYhnyMW.cjs +0 -2
  305. package/dist/chunks/router-adapter-BdHZXLS3.js +0 -23
  306. package/dist/chunks/router-adapter-BdHZXLS3.js.map +0 -1
  307. package/dist/chunks/router-adapter-BybHrCNP.cjs +0 -2
  308. package/dist/chunks/router-adapter-BybHrCNP.cjs.map +0 -1
  309. package/dist/chunks/templates.module-B5bg_goX.js +0 -8
  310. package/dist/chunks/templates.module-B5bg_goX.js.map +0 -1
  311. package/dist/chunks/templates.module-ClRnQQX4.cjs +0 -2
  312. package/dist/chunks/templates.module-ClRnQQX4.cjs.map +0 -1
  313. package/dist/pages/admin/delegations/AdminDelegationsClientView.cjs +0 -2
  314. package/dist/pages/admin/delegations/AdminDelegationsClientView.cjs.map +0 -1
  315. package/dist/pages/admin/delegations/AdminDelegationsClientView.d.ts +0 -3
  316. package/dist/pages/admin/delegations/AdminDelegationsClientView.js +0 -28
  317. package/dist/pages/admin/delegations/AdminDelegationsClientView.js.map +0 -1
  318. package/dist/pages/admin/orgs/AdminOrgsClientView.cjs +0 -2
  319. package/dist/pages/admin/orgs/AdminOrgsClientView.cjs.map +0 -1
  320. package/dist/pages/admin/orgs/AdminOrgsClientView.d.ts +0 -3
  321. package/dist/pages/admin/orgs/AdminOrgsClientView.js +0 -28
  322. package/dist/pages/admin/orgs/AdminOrgsClientView.js.map +0 -1
  323. package/dist/pages/admin/users/AdminUsersClientView.cjs +0 -2
  324. package/dist/pages/admin/users/AdminUsersClientView.cjs.map +0 -1
  325. package/dist/pages/admin/users/AdminUsersClientView.d.ts +0 -3
  326. package/dist/pages/admin/users/AdminUsersClientView.js +0 -28
  327. package/dist/pages/admin/users/AdminUsersClientView.js.map +0 -1
  328. package/dist/pages/cc/CcClientView.cjs +0 -2
  329. package/dist/pages/cc/CcClientView.cjs.map +0 -1
  330. package/dist/pages/cc/CcClientView.d.ts +0 -7
  331. package/dist/pages/cc/CcClientView.js +0 -28
  332. package/dist/pages/cc/CcClientView.js.map +0 -1
  333. package/dist/pages/dashboard/DashboardClientView.cjs +0 -2
  334. package/dist/pages/dashboard/DashboardClientView.cjs.map +0 -1
  335. package/dist/pages/dashboard/DashboardClientView.d.ts +0 -9
  336. package/dist/pages/dashboard/DashboardClientView.js +0 -28
  337. package/dist/pages/dashboard/DashboardClientView.js.map +0 -1
  338. package/dist/pages/delegations/DelegationsClientView.cjs +0 -2
  339. package/dist/pages/delegations/DelegationsClientView.cjs.map +0 -1
  340. package/dist/pages/delegations/DelegationsClientView.d.ts +0 -3
  341. package/dist/pages/delegations/DelegationsClientView.js +0 -28
  342. package/dist/pages/delegations/DelegationsClientView.js.map +0 -1
  343. package/dist/pages/forms/FormsClientView.cjs +0 -2
  344. package/dist/pages/forms/FormsClientView.cjs.map +0 -1
  345. package/dist/pages/forms/FormsClientView.d.ts +0 -10
  346. package/dist/pages/forms/FormsClientView.js +0 -28
  347. package/dist/pages/forms/FormsClientView.js.map +0 -1
  348. package/dist/pages/forms/builder/FormBuilderClientView.cjs +0 -2
  349. package/dist/pages/forms/builder/FormBuilderClientView.cjs.map +0 -1
  350. package/dist/pages/forms/builder/FormBuilderClientView.d.ts +0 -11
  351. package/dist/pages/forms/builder/FormBuilderClientView.js +0 -28
  352. package/dist/pages/forms/builder/FormBuilderClientView.js.map +0 -1
  353. package/dist/pages/inbox/InboxClientView.cjs +0 -2
  354. package/dist/pages/inbox/InboxClientView.cjs.map +0 -1
  355. package/dist/pages/inbox/InboxClientView.d.ts +0 -9
  356. package/dist/pages/inbox/InboxClientView.js +0 -28
  357. package/dist/pages/inbox/InboxClientView.js.map +0 -1
  358. package/dist/pages/instances/detail/InstanceDetailClientView.cjs +0 -2
  359. package/dist/pages/instances/detail/InstanceDetailClientView.cjs.map +0 -1
  360. package/dist/pages/instances/detail/InstanceDetailClientView.d.ts +0 -9
  361. package/dist/pages/instances/detail/InstanceDetailClientView.js +0 -28
  362. package/dist/pages/instances/detail/InstanceDetailClientView.js.map +0 -1
  363. package/dist/pages/instances/new/InstanceNewClientView.cjs +0 -2
  364. package/dist/pages/instances/new/InstanceNewClientView.cjs.map +0 -1
  365. package/dist/pages/instances/new/InstanceNewClientView.d.ts +0 -8
  366. package/dist/pages/instances/new/InstanceNewClientView.js +0 -28
  367. package/dist/pages/instances/new/InstanceNewClientView.js.map +0 -1
  368. package/dist/pages/login/LoginClientView.cjs +0 -2
  369. package/dist/pages/login/LoginClientView.cjs.map +0 -1
  370. package/dist/pages/login/LoginClientView.d.ts +0 -11
  371. package/dist/pages/login/LoginClientView.js +0 -29
  372. package/dist/pages/login/LoginClientView.js.map +0 -1
  373. package/dist/pages/root/RootClientView.cjs +0 -1
  374. package/dist/pages/root/RootClientView.d.ts +0 -8
  375. package/dist/pages/root/RootClientView.js +0 -2
  376. package/dist/pages/search/SearchClientView.cjs +0 -2
  377. package/dist/pages/search/SearchClientView.cjs.map +0 -1
  378. package/dist/pages/search/SearchClientView.d.ts +0 -7
  379. package/dist/pages/search/SearchClientView.js +0 -28
  380. package/dist/pages/search/SearchClientView.js.map +0 -1
  381. package/dist/pages/sent/SentClientView.cjs +0 -2
  382. package/dist/pages/sent/SentClientView.cjs.map +0 -1
  383. package/dist/pages/sent/SentClientView.d.ts +0 -7
  384. package/dist/pages/sent/SentClientView.js +0 -28
  385. package/dist/pages/sent/SentClientView.js.map +0 -1
  386. package/dist/pages/settings/notifications/SettingsNotificationsClientView.cjs +0 -2
  387. package/dist/pages/settings/notifications/SettingsNotificationsClientView.cjs.map +0 -1
  388. package/dist/pages/settings/notifications/SettingsNotificationsClientView.d.ts +0 -3
  389. package/dist/pages/settings/notifications/SettingsNotificationsClientView.js +0 -28
  390. package/dist/pages/settings/notifications/SettingsNotificationsClientView.js.map +0 -1
  391. package/dist/pages/templates/TemplatesClientView.cjs +0 -2
  392. package/dist/pages/templates/TemplatesClientView.cjs.map +0 -1
  393. package/dist/pages/templates/TemplatesClientView.d.ts +0 -3
  394. package/dist/pages/templates/TemplatesClientView.js +0 -28
  395. package/dist/pages/templates/TemplatesClientView.js.map +0 -1
  396. package/dist/pages/templates/categories/TemplateCategoriesClientView.cjs +0 -2
  397. package/dist/pages/templates/categories/TemplateCategoriesClientView.cjs.map +0 -1
  398. package/dist/pages/templates/categories/TemplateCategoriesClientView.d.ts +0 -3
  399. package/dist/pages/templates/categories/TemplateCategoriesClientView.js +0 -28
  400. package/dist/pages/templates/categories/TemplateCategoriesClientView.js.map +0 -1
  401. package/dist/pages/templates/designer/TemplateDesignerClientView.cjs +0 -2
  402. package/dist/pages/templates/designer/TemplateDesignerClientView.cjs.map +0 -1
  403. package/dist/pages/templates/designer/TemplateDesignerClientView.d.ts +0 -3
  404. package/dist/pages/templates/designer/TemplateDesignerClientView.js +0 -28
  405. package/dist/pages/templates/designer/TemplateDesignerClientView.js.map +0 -1
  406. package/dist/pages/templates/versions/TemplateVersionsClientView.cjs +0 -2
  407. package/dist/pages/templates/versions/TemplateVersionsClientView.cjs.map +0 -1
  408. package/dist/pages/templates/versions/TemplateVersionsClientView.d.ts +0 -3
  409. package/dist/pages/templates/versions/TemplateVersionsClientView.js +0 -28
  410. package/dist/pages/templates/versions/TemplateVersionsClientView.js.map +0 -1
  411. /package/dist/{templates.css → categories.css} +0 -0
  412. /package/dist/{AdminDelegationsView.css → delegations.css} +0 -0
  413. /package/dist/{DelegationsView.css → delegations2.css} +0 -0
  414. /package/dist/{InstanceDetailView.css → detail.css} +0 -0
  415. /package/dist/{LoginView.css → login.css} +0 -0
  416. /package/dist/{SettingsNotificationsView.css → notifications.css} +0 -0
  417. /package/dist/{AdminOrgsView.css → orgs.css} +0 -0
  418. /package/dist/{AdminUsersView.css → users.css} +0 -0
@@ -1 +0,0 @@
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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"}
@@ -1 +0,0 @@
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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"}
@@ -1,2 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,34 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,2 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,19 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,2 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,19 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
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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"}
@@ -1,2 +0,0 @@
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
@@ -1 +0,0 @@
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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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TemplateCategoriesView-CgZciaSd.js","names":[],"sources":["../../src/views/templates/categories/TemplateCategoriesView.tsx"],"sourcesContent":["'use client';\n\nimport type { ChangeEvent, Key, ReactElement } from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\n Layout,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Tab,\n TabItem,\n Table,\n Textarea,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { BPMFormField } from '../../../components/bpm-form-field';\nimport { formatDateTime } from '../../../lib/format-date-time';\nimport { AppNavigation } from '../../../components/app-navigation';\nimport {\n ApprovalTemplateCategoryRecord,\n ApprovalTemplateCategoryStatus,\n createApprovalTemplateCategory,\n deleteApprovalTemplateCategory,\n listApprovalTemplateCategoriesPage,\n updateApprovalTemplateCategory,\n} from '@rytass/bpm-core-client/template';\nimport styles from '../templates.module.scss';\n\nconst CATEGORY_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst CATEGORY_STATUS_TABS: readonly {\n readonly key: CategoryStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'ACTIVE', label: '啟用' },\n { key: 'INACTIVE', label: '停用' },\n];\ntype CategoryStatusTabKey = 'ACTIVE' | 'ALL' | 'INACTIVE';\n\ntype CategoryRow = Readonly<\n Record<string, unknown> &\n ApprovalTemplateCategoryRecord & {\n key: string;\n updatedAtLabel: string;\n }\n>;\n\ntype CategoryModalState = Readonly<{\n record: ApprovalTemplateCategoryRecord | null;\n type: 'CREATE' | 'EDIT';\n}>;\n\ntype DeleteConfirmationState = Readonly<{\n id: string;\n name: string;\n}>;\n\nexport interface TemplateCategoriesViewProps {\n readonly activeHref?: string;\n}\n\nexport function TemplateCategoriesView({\n activeHref = '/templates/categories',\n}: TemplateCategoriesViewProps = {}): ReactElement {\n const [categories, setCategories] = useState<\n readonly ApprovalTemplateCategoryRecord[]\n >([]);\n const [categoryPage, setCategoryPage] = useState(1);\n const [categoryPageSize, setCategoryPageSize] = useState(10);\n const [categoryStatus, setCategoryStatus] =\n useState<CategoryStatusTabKey>('ALL');\n const [categoryTotalCount, setCategoryTotalCount] = useState(0);\n const [deleteConfirmation, setDeleteConfirmation] =\n useState<DeleteConfirmationState | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [modalState, setModalState] = useState<CategoryModalState | null>(null);\n const [saving, setSaving] = useState(false);\n const [searchText, setSearchText] = useState('');\n\n const refreshCategories = useCallback(async (): Promise<void> => {\n setLoading(true);\n setError(null);\n\n try {\n const categoryPageResult = await listApprovalTemplateCategoriesPage({\n page: categoryPage,\n pageSize: categoryPageSize,\n searchText,\n status: readCategoryStatus(categoryStatus),\n });\n\n setCategories(categoryPageResult.categories);\n setCategoryTotalCount(categoryPageResult.totalCount);\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, [categoryPage, categoryPageSize, categoryStatus, searchText]);\n\n useEffect((): void => {\n void refreshCategories();\n }, [refreshCategories]);\n\n const rows = useMemo(\n (): CategoryRow[] =>\n categories.map((category) => ({\n ...category,\n key: category.id,\n updatedAtLabel: formatDateTime(category.updatedAt),\n })),\n [categories],\n );\n\n const columns = useMemo(\n (): TableColumn<CategoryRow>[] => [\n { dataIndex: 'name', key: 'name', title: '分類名稱', width: 180 },\n {\n key: 'status',\n render: (record: CategoryRow): ReactElement => (\n <CategoryStatusBadge isActive={record.isActive} />\n ),\n title: '狀態',\n width: 120,\n },\n {\n dataIndex: 'sortOrder',\n key: 'sortOrder',\n title: '排序',\n width: 100,\n },\n {\n key: 'description',\n render: (record: CategoryRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {record.description || '無'}\n </Typography>\n ),\n title: '說明',\n width: 260,\n },\n {\n dataIndex: 'updatedAtLabel',\n key: 'updatedAtLabel',\n title: '更新時間',\n width: 220,\n },\n ],\n [],\n );\n\n async function handleSaveCategory(input: CategoryFormInput): Promise<void> {\n setSaving(true);\n setError(null);\n\n try {\n if (modalState?.type === 'EDIT' && modalState.record) {\n await updateApprovalTemplateCategory({\n ...input,\n id: modalState.record.id,\n });\n } else {\n await createApprovalTemplateCategory(input);\n }\n\n setModalState(null);\n await refreshCategories();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n throw requestError;\n } finally {\n setSaving(false);\n }\n }\n\n async function handleToggleCategory(\n record: ApprovalTemplateCategoryRecord,\n ): Promise<void> {\n setSaving(true);\n setError(null);\n\n try {\n await updateApprovalTemplateCategory({\n description: record.description,\n id: record.id,\n isActive: !record.isActive,\n name: record.name,\n sortOrder: record.sortOrder,\n });\n await refreshCategories();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setSaving(false);\n }\n }\n\n async function handleConfirmDelete(): Promise<void> {\n if (!deleteConfirmation) {\n return;\n }\n\n setSaving(true);\n setError(null);\n\n try {\n await deleteApprovalTemplateCategory(deleteConfirmation.id);\n setDeleteConfirmation(null);\n await refreshCategories();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setSaving(false);\n }\n }\n\n const tableActions = useMemo(\n (): TableActions<CategoryRow> => ({\n render: (record): ReturnType<TableActions<CategoryRow>['render']> => [\n {\n name: '編輯',\n onClick: (): void => setModalState({ record, type: 'EDIT' }),\n },\n {\n name: record.isActive ? '停用' : '啟用',\n onClick: (): void => void handleToggleCategory(record),\n variant: record.isActive ? 'destructive-secondary' : 'base-secondary',\n },\n {\n name: '刪除',\n onClick: (): void =>\n setDeleteConfirmation({ id: record.id, name: record.name }),\n variant: 'destructive-secondary',\n },\n ],\n variant: 'base-secondary',\n width: 192,\n }),\n [refreshCategories],\n );\n\n return (\n <>\n <Layout>\n <AppNavigation activeHref={activeHref} />\n\n <Layout.Main>\n <PageHeader>\n <ContentHeader\n description=\"維護簽核模板分類,供模板建立、篩選與列表標示使用。\"\n title=\"簽核模板分類\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void =>\n setModalState({ record: null, type: 'CREATE' })\n }\n variant=\"base-primary\"\n >\n 建立分類\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.templateFilterArea} size=\"sub\">\n <FilterLine>\n <Filter span={3}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"categorySearchText\"\n >\n <Input\n fullWidth\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n setSearchText(event.target.value);\n setCategoryPage(1);\n }}\n placeholder=\"關鍵字:搜尋分類名稱或說明\"\n size=\"sub\"\n value={searchText}\n variant=\"base\"\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={categoryStatus}\n onChange={(activeKey): void => {\n setCategoryStatus(readCategoryStatusTabKey(activeKey));\n setCategoryPage(1);\n }}\n >\n {CATEGORY_STATUS_TABS.map((statusTab) => (\n <TabItem key={statusTab.key}>{statusTab.label}</TabItem>\n ))}\n </Tab>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <Table\n actions={tableActions}\n columns={columns}\n dataSource={rows}\n fullWidth\n loading={loading || saving}\n pagination={{\n current: categoryPage,\n onChange: (page): void => {\n setCategoryPage(page);\n },\n onChangePageSize: (pageSize): void => {\n setCategoryPage(1);\n setCategoryPageSize(pageSize);\n },\n pageSize: categoryPageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: CATEGORY_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: categoryTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n </Layout.Main>\n </Layout>\n\n <CategoryModal\n loading={saving}\n modal={modalState}\n onClose={(): void => setModalState(null)}\n onSubmit={handleSaveCategory}\n />\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{ variant: 'destructive-primary' }}\n confirmText=\"刪除\"\n loading={saving}\n modalStatusType=\"error\"\n modalType=\"standard\"\n onCancel={(): void => setDeleteConfirmation(null)}\n onClose={(): void => setDeleteConfirmation(null)}\n onConfirm={(): void => void handleConfirmDelete()}\n open={Boolean(deleteConfirmation)}\n showModalFooter\n showModalHeader\n size=\"regular\"\n supportingText=\"若分類已被模板使用,系統會改為停用分類並保留既有模板關聯。\"\n title=\"刪除分類\"\n >\n <Typography color=\"text-neutral\" variant=\"body\">\n 確定要刪除「{deleteConfirmation?.name ?? ''}」嗎?\n </Typography>\n </Modal>\n </>\n );\n}\n\ninterface CategoryFormInput {\n readonly description: string | null;\n readonly isActive: boolean;\n readonly name: string;\n readonly sortOrder: number;\n}\n\nfunction CategoryModal({\n loading,\n modal,\n onClose,\n onSubmit,\n}: {\n readonly loading: boolean;\n readonly modal: CategoryModalState | null;\n readonly onClose: () => void;\n readonly onSubmit: (input: CategoryFormInput) => Promise<void>;\n}): ReactElement {\n const [description, setDescription] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [name, setName] = useState('');\n const [sortOrder, setSortOrder] = useState('0');\n\n useEffect((): void => {\n if (!modal) {\n return;\n }\n\n setDescription(modal.record?.description ?? '');\n setError(null);\n setName(modal.record?.name ?? '');\n setSortOrder(String(modal.record?.sortOrder ?? 0));\n }, [modal]);\n\n async function handleConfirm(): Promise<void> {\n const trimmedName = name.trim();\n const parsedSortOrder = Number(sortOrder);\n\n if (!trimmedName) {\n setError('請輸入分類名稱');\n return;\n }\n\n if (!Number.isInteger(parsedSortOrder)) {\n setError('排序必須是整數');\n return;\n }\n\n try {\n await onSubmit({\n description: description.trim() || null,\n isActive: modal?.record?.isActive ?? true,\n name: trimmedName,\n sortOrder: parsedSortOrder,\n });\n } catch (submitError: unknown) {\n setError(readErrorMessage(submitError));\n }\n }\n\n return (\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{ disabled: !name.trim() }}\n confirmText={modal?.type === 'EDIT' ? '儲存' : '建立'}\n loading={loading}\n modalType=\"standard\"\n onCancel={onClose}\n onClose={onClose}\n onConfirm={(): void => void handleConfirm()}\n open={Boolean(modal)}\n showModalFooter\n showModalHeader\n size=\"regular\"\n title={modal?.type === 'EDIT' ? '編輯分類' : '建立分類'}\n >\n <div className={styles.templateModalFields}>\n <BPMFormField label=\"分類名稱\" name=\"categoryName\" required>\n <Input\n autoFocus\n fullWidth\n onChange={(event: ChangeEvent<HTMLInputElement>): void => {\n setName(event.target.value);\n setError(null);\n }}\n placeholder=\"例如:行政管理\"\n value={name}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"排序\" name=\"categorySortOrder\">\n <Input\n fullWidth\n onChange={(event: ChangeEvent<HTMLInputElement>): void => {\n setSortOrder(event.target.value);\n setError(null);\n }}\n placeholder=\"0\"\n value={sortOrder}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"說明\" name=\"categoryDescription\">\n <Textarea\n onChange={(event: ChangeEvent<HTMLTextAreaElement>): void => {\n setDescription(event.target.value);\n setError(null);\n }}\n placeholder=\"補充分類用途\"\n value={description}\n />\n </BPMFormField>\n </div>\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n </Modal>\n );\n}\n\nfunction CategoryStatusBadge({\n isActive,\n}: {\n readonly isActive: boolean;\n}): ReactElement {\n return isActive ? (\n <Badge size=\"sub\" text=\"啟用\" variant=\"dot-success\" />\n ) : (\n <Badge size=\"sub\" text=\"停用\" variant=\"dot-inactive\" />\n );\n}\n\nfunction readCategoryStatusTabKey(activeKey: Key): CategoryStatusTabKey {\n if (activeKey === 'ACTIVE' || activeKey === 'INACTIVE') {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction readCategoryStatus(\n status: CategoryStatusTabKey,\n): ApprovalTemplateCategoryStatus {\n return status;\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use client";const e=require("./app-navigation-DAC5gFbG.cjs"),t=require("./format-date-time-BQyH5U8z.cjs"),n=require("./bpm-form-field-Bc6k4ZEO.cjs"),r=require("./templates.module-ClRnQQX4.cjs");let i=require("react"),a=require("@mezzanine-ui/react"),o=require("react/jsx-runtime"),s=require("@mezzanine-ui/icons"),c=require("@mezzanine-ui/react/ContentHeader");c=e.o(c,1);let l=require("@mezzanine-ui/core/form"),u=require("@rytass/bpm-core-client/template");var d=[10,20,50],f=[{key:`ALL`,label:`全部`},{key:`ACTIVE`,label:`啟用`},{key:`INACTIVE`,label:`停用`}];function p({activeHref:n=`/templates/categories`}={}){let[p,y]=(0,i.useState)([]),[b,x]=(0,i.useState)(1),[S,C]=(0,i.useState)(10),[w,T]=(0,i.useState)(`ALL`),[E,D]=(0,i.useState)(0),[O,k]=(0,i.useState)(null),[A,j]=(0,i.useState)(null),[M,N]=(0,i.useState)(!0),[P,F]=(0,i.useState)(null),[I,L]=(0,i.useState)(!1),[R,z]=(0,i.useState)(``),B=(0,i.useCallback)(async()=>{N(!0),j(null);try{let e=await(0,u.listApprovalTemplateCategoriesPage)({page:b,pageSize:S,searchText:R,status:_(w)});y(e.categories),D(e.totalCount)}catch(e){j(v(e))}finally{N(!1)}},[b,S,w,R]);(0,i.useEffect)(()=>{B()},[B]);let V=(0,i.useMemo)(()=>p.map(e=>({...e,key:e.id,updatedAtLabel:t.t(e.updatedAt)})),[p]),H=(0,i.useMemo)(()=>[{dataIndex:`name`,key:`name`,title:`分類名稱`,width:180},{key:`status`,render:e=>(0,o.jsx)(h,{isActive:e.isActive}),title:`狀態`,width:120},{dataIndex:`sortOrder`,key:`sortOrder`,title:`排序`,width:100},{key:`description`,render:e=>(0,o.jsx)(a.Typography,{component:`span`,variant:`body`,children:e.description||`無`}),title:`說明`,width:260},{dataIndex:`updatedAtLabel`,key:`updatedAtLabel`,title:`更新時間`,width:220}],[]);async function U(e){L(!0),j(null);try{P?.type===`EDIT`&&P.record?await(0,u.updateApprovalTemplateCategory)({...e,id:P.record.id}):await(0,u.createApprovalTemplateCategory)(e),F(null),await B()}catch(e){throw j(v(e)),e}finally{L(!1)}}async function W(e){L(!0),j(null);try{await(0,u.updateApprovalTemplateCategory)({description:e.description,id:e.id,isActive:!e.isActive,name:e.name,sortOrder:e.sortOrder}),await B()}catch(e){j(v(e))}finally{L(!1)}}async function G(){if(O){L(!0),j(null);try{await(0,u.deleteApprovalTemplateCategory)(O.id),k(null),await B()}catch(e){j(v(e))}finally{L(!1)}}}let K=(0,i.useMemo)(()=>({render:e=>[{name:`編輯`,onClick:()=>F({record:e,type:`EDIT`})},{name:e.isActive?`停用`:`啟用`,onClick:()=>void W(e),variant:e.isActive?`destructive-secondary`:`base-secondary`},{name:`刪除`,onClick:()=>k({id:e.id,name:e.name}),variant:`destructive-secondary`}],variant:`base-secondary`,width:192}),[B]);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(a.Layout,{children:[(0,o.jsx)(e.t,{activeHref:n}),(0,o.jsxs)(a.Layout.Main,{children:[(0,o.jsx)(a.PageHeader,{children:(0,o.jsx)(c.default,{description:`維護簽核模板分類,供模板建立、篩選與列表標示使用。`,title:`簽核模板分類`,children:(0,o.jsx)(a.Button,{icon:s.PlusIcon,iconType:`leading`,onClick:()=>F({record:null,type:`CREATE`}),variant:`base-primary`,children:`建立分類`})})}),(0,o.jsx)(a.SectionGroup,{children:(0,o.jsxs)(a.Section,{filterArea:(0,o.jsx)(a.FilterArea,{className:r.t.templateFilterArea,size:`sub`,children:(0,o.jsx)(a.FilterLine,{children:(0,o.jsx)(a.Filter,{span:3,children:(0,o.jsx)(a.FormField,{fullWidth:!0,layout:l.FormFieldLayout.VERTICAL,name:`categorySearchText`,children:(0,o.jsx)(a.Input,{fullWidth:!0,onChange:e=>{z(e.target.value),x(1)},placeholder:`關鍵字:搜尋分類名稱或說明`,size:`sub`,value:R,variant:`base`})})})})}),tab:(0,o.jsx)(a.Tab,{activeKey:w,onChange:e=>{T(g(e)),x(1)},children:f.map(e=>(0,o.jsx)(a.TabItem,{children:e.label},e.key))}),children:[A?(0,o.jsx)(a.Typography,{color:`text-error`,variant:`body`,children:A}):null,(0,o.jsx)(a.Table,{actions:K,columns:H,dataSource:V,fullWidth:!0,loading:M||I,pagination:{current:b,onChange:e=>{x(e)},onChangePageSize:e=>{x(1),C(e)},pageSize:S,pageSizeLabel:`每頁筆數`,pageSizeOptions:d,renderResultSummary:(e,t,n)=>`顯示 ${e}-${t} 筆,共 ${n} 筆`,showPageSizeOptions:!0,total:E}})]})})]})]}),(0,o.jsx)(m,{loading:I,modal:P,onClose:()=>F(null),onSubmit:U}),(0,o.jsx)(a.Modal,{cancelText:`取消`,confirmButtonProps:{variant:`destructive-primary`},confirmText:`刪除`,loading:I,modalStatusType:`error`,modalType:`standard`,onCancel:()=>k(null),onClose:()=>k(null),onConfirm:()=>void G(),open:!!O,showModalFooter:!0,showModalHeader:!0,size:`regular`,supportingText:`若分類已被模板使用,系統會改為停用分類並保留既有模板關聯。`,title:`刪除分類`,children:(0,o.jsxs)(a.Typography,{color:`text-neutral`,variant:`body`,children:[`確定要刪除「`,O?.name??``,`」嗎?`]})})]})}function m({loading:e,modal:t,onClose:s,onSubmit:c}){let[l,u]=(0,i.useState)(``),[d,f]=(0,i.useState)(null),[p,m]=(0,i.useState)(``),[h,g]=(0,i.useState)(`0`);(0,i.useEffect)(()=>{t&&(u(t.record?.description??``),f(null),m(t.record?.name??``),g(String(t.record?.sortOrder??0)))},[t]);async function _(){let e=p.trim(),n=Number(h);if(!e){f(`請輸入分類名稱`);return}if(!Number.isInteger(n)){f(`排序必須是整數`);return}try{await c({description:l.trim()||null,isActive:t?.record?.isActive??!0,name:e,sortOrder:n})}catch(e){f(v(e))}}return(0,o.jsxs)(a.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!p.trim()},confirmText:t?.type===`EDIT`?`儲存`:`建立`,loading:e,modalType:`standard`,onCancel:s,onClose:s,onConfirm:()=>void _(),open:!!t,showModalFooter:!0,showModalHeader:!0,size:`regular`,title:t?.type===`EDIT`?`編輯分類`:`建立分類`,children:[(0,o.jsxs)(`div`,{className:r.t.templateModalFields,children:[(0,o.jsx)(n.t,{label:`分類名稱`,name:`categoryName`,required:!0,children:(0,o.jsx)(a.Input,{autoFocus:!0,fullWidth:!0,onChange:e=>{m(e.target.value),f(null)},placeholder:`例如:行政管理`,value:p,variant:`base`})}),(0,o.jsx)(n.t,{label:`排序`,name:`categorySortOrder`,children:(0,o.jsx)(a.Input,{fullWidth:!0,onChange:e=>{g(e.target.value),f(null)},placeholder:`0`,value:h,variant:`base`})}),(0,o.jsx)(n.t,{label:`說明`,name:`categoryDescription`,children:(0,o.jsx)(a.Textarea,{onChange:e=>{u(e.target.value),f(null)},placeholder:`補充分類用途`,value:l})})]}),d?(0,o.jsx)(a.Typography,{color:`text-error`,variant:`body`,children:d}):null]})}function h({isActive:e}){return e?(0,o.jsx)(a.Badge,{size:`sub`,text:`啟用`,variant:`dot-success`}):(0,o.jsx)(a.Badge,{size:`sub`,text:`停用`,variant:`dot-inactive`})}function g(e){return e===`ACTIVE`||e===`INACTIVE`?e:`ALL`}function _(e){return e}function v(e){return e instanceof Error?e.message:`發生未知錯誤`}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return p}});
2
- //# sourceMappingURL=TemplateCategoriesView-U0stGUBc.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TemplateCategoriesView-U0stGUBc.cjs","names":[],"sources":["../../src/views/templates/categories/TemplateCategoriesView.tsx"],"sourcesContent":["'use client';\n\nimport type { ChangeEvent, Key, ReactElement } from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\n Layout,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Tab,\n TabItem,\n Table,\n Textarea,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { BPMFormField } from '../../../components/bpm-form-field';\nimport { formatDateTime } from '../../../lib/format-date-time';\nimport { AppNavigation } from '../../../components/app-navigation';\nimport {\n ApprovalTemplateCategoryRecord,\n ApprovalTemplateCategoryStatus,\n createApprovalTemplateCategory,\n deleteApprovalTemplateCategory,\n listApprovalTemplateCategoriesPage,\n updateApprovalTemplateCategory,\n} from '@rytass/bpm-core-client/template';\nimport styles from '../templates.module.scss';\n\nconst CATEGORY_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst CATEGORY_STATUS_TABS: readonly {\n readonly key: CategoryStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'ACTIVE', label: '啟用' },\n { key: 'INACTIVE', label: '停用' },\n];\ntype CategoryStatusTabKey = 'ACTIVE' | 'ALL' | 'INACTIVE';\n\ntype CategoryRow = Readonly<\n Record<string, unknown> &\n ApprovalTemplateCategoryRecord & {\n key: string;\n updatedAtLabel: string;\n }\n>;\n\ntype CategoryModalState = Readonly<{\n record: ApprovalTemplateCategoryRecord | null;\n type: 'CREATE' | 'EDIT';\n}>;\n\ntype DeleteConfirmationState = Readonly<{\n id: string;\n name: string;\n}>;\n\nexport interface TemplateCategoriesViewProps {\n readonly activeHref?: string;\n}\n\nexport function TemplateCategoriesView({\n activeHref = '/templates/categories',\n}: TemplateCategoriesViewProps = {}): ReactElement {\n const [categories, setCategories] = useState<\n readonly ApprovalTemplateCategoryRecord[]\n >([]);\n const [categoryPage, setCategoryPage] = useState(1);\n const [categoryPageSize, setCategoryPageSize] = useState(10);\n const [categoryStatus, setCategoryStatus] =\n useState<CategoryStatusTabKey>('ALL');\n const [categoryTotalCount, setCategoryTotalCount] = useState(0);\n const [deleteConfirmation, setDeleteConfirmation] =\n useState<DeleteConfirmationState | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [modalState, setModalState] = useState<CategoryModalState | null>(null);\n const [saving, setSaving] = useState(false);\n const [searchText, setSearchText] = useState('');\n\n const refreshCategories = useCallback(async (): Promise<void> => {\n setLoading(true);\n setError(null);\n\n try {\n const categoryPageResult = await listApprovalTemplateCategoriesPage({\n page: categoryPage,\n pageSize: categoryPageSize,\n searchText,\n status: readCategoryStatus(categoryStatus),\n });\n\n setCategories(categoryPageResult.categories);\n setCategoryTotalCount(categoryPageResult.totalCount);\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, [categoryPage, categoryPageSize, categoryStatus, searchText]);\n\n useEffect((): void => {\n void refreshCategories();\n }, [refreshCategories]);\n\n const rows = useMemo(\n (): CategoryRow[] =>\n categories.map((category) => ({\n ...category,\n key: category.id,\n updatedAtLabel: formatDateTime(category.updatedAt),\n })),\n [categories],\n );\n\n const columns = useMemo(\n (): TableColumn<CategoryRow>[] => [\n { dataIndex: 'name', key: 'name', title: '分類名稱', width: 180 },\n {\n key: 'status',\n render: (record: CategoryRow): ReactElement => (\n <CategoryStatusBadge isActive={record.isActive} />\n ),\n title: '狀態',\n width: 120,\n },\n {\n dataIndex: 'sortOrder',\n key: 'sortOrder',\n title: '排序',\n width: 100,\n },\n {\n key: 'description',\n render: (record: CategoryRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {record.description || '無'}\n </Typography>\n ),\n title: '說明',\n width: 260,\n },\n {\n dataIndex: 'updatedAtLabel',\n key: 'updatedAtLabel',\n title: '更新時間',\n width: 220,\n },\n ],\n [],\n );\n\n async function handleSaveCategory(input: CategoryFormInput): Promise<void> {\n setSaving(true);\n setError(null);\n\n try {\n if (modalState?.type === 'EDIT' && modalState.record) {\n await updateApprovalTemplateCategory({\n ...input,\n id: modalState.record.id,\n });\n } else {\n await createApprovalTemplateCategory(input);\n }\n\n setModalState(null);\n await refreshCategories();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n throw requestError;\n } finally {\n setSaving(false);\n }\n }\n\n async function handleToggleCategory(\n record: ApprovalTemplateCategoryRecord,\n ): Promise<void> {\n setSaving(true);\n setError(null);\n\n try {\n await updateApprovalTemplateCategory({\n description: record.description,\n id: record.id,\n isActive: !record.isActive,\n name: record.name,\n sortOrder: record.sortOrder,\n });\n await refreshCategories();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setSaving(false);\n }\n }\n\n async function handleConfirmDelete(): Promise<void> {\n if (!deleteConfirmation) {\n return;\n }\n\n setSaving(true);\n setError(null);\n\n try {\n await deleteApprovalTemplateCategory(deleteConfirmation.id);\n setDeleteConfirmation(null);\n await refreshCategories();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setSaving(false);\n }\n }\n\n const tableActions = useMemo(\n (): TableActions<CategoryRow> => ({\n render: (record): ReturnType<TableActions<CategoryRow>['render']> => [\n {\n name: '編輯',\n onClick: (): void => setModalState({ record, type: 'EDIT' }),\n },\n {\n name: record.isActive ? '停用' : '啟用',\n onClick: (): void => void handleToggleCategory(record),\n variant: record.isActive ? 'destructive-secondary' : 'base-secondary',\n },\n {\n name: '刪除',\n onClick: (): void =>\n setDeleteConfirmation({ id: record.id, name: record.name }),\n variant: 'destructive-secondary',\n },\n ],\n variant: 'base-secondary',\n width: 192,\n }),\n [refreshCategories],\n );\n\n return (\n <>\n <Layout>\n <AppNavigation activeHref={activeHref} />\n\n <Layout.Main>\n <PageHeader>\n <ContentHeader\n description=\"維護簽核模板分類,供模板建立、篩選與列表標示使用。\"\n title=\"簽核模板分類\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void =>\n setModalState({ record: null, type: 'CREATE' })\n }\n variant=\"base-primary\"\n >\n 建立分類\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.templateFilterArea} size=\"sub\">\n <FilterLine>\n <Filter span={3}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"categorySearchText\"\n >\n <Input\n fullWidth\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n setSearchText(event.target.value);\n setCategoryPage(1);\n }}\n placeholder=\"關鍵字:搜尋分類名稱或說明\"\n size=\"sub\"\n value={searchText}\n variant=\"base\"\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={categoryStatus}\n onChange={(activeKey): void => {\n setCategoryStatus(readCategoryStatusTabKey(activeKey));\n setCategoryPage(1);\n }}\n >\n {CATEGORY_STATUS_TABS.map((statusTab) => (\n <TabItem key={statusTab.key}>{statusTab.label}</TabItem>\n ))}\n </Tab>\n }\n >\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n <Table\n actions={tableActions}\n columns={columns}\n dataSource={rows}\n fullWidth\n loading={loading || saving}\n pagination={{\n current: categoryPage,\n onChange: (page): void => {\n setCategoryPage(page);\n },\n onChangePageSize: (pageSize): void => {\n setCategoryPage(1);\n setCategoryPageSize(pageSize);\n },\n pageSize: categoryPageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: CATEGORY_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: categoryTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n </Layout.Main>\n </Layout>\n\n <CategoryModal\n loading={saving}\n modal={modalState}\n onClose={(): void => setModalState(null)}\n onSubmit={handleSaveCategory}\n />\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{ variant: 'destructive-primary' }}\n confirmText=\"刪除\"\n loading={saving}\n modalStatusType=\"error\"\n modalType=\"standard\"\n onCancel={(): void => setDeleteConfirmation(null)}\n onClose={(): void => setDeleteConfirmation(null)}\n onConfirm={(): void => void handleConfirmDelete()}\n open={Boolean(deleteConfirmation)}\n showModalFooter\n showModalHeader\n size=\"regular\"\n supportingText=\"若分類已被模板使用,系統會改為停用分類並保留既有模板關聯。\"\n title=\"刪除分類\"\n >\n <Typography color=\"text-neutral\" variant=\"body\">\n 確定要刪除「{deleteConfirmation?.name ?? ''}」嗎?\n </Typography>\n </Modal>\n </>\n );\n}\n\ninterface CategoryFormInput {\n readonly description: string | null;\n readonly isActive: boolean;\n readonly name: string;\n readonly sortOrder: number;\n}\n\nfunction CategoryModal({\n loading,\n modal,\n onClose,\n onSubmit,\n}: {\n readonly loading: boolean;\n readonly modal: CategoryModalState | null;\n readonly onClose: () => void;\n readonly onSubmit: (input: CategoryFormInput) => Promise<void>;\n}): ReactElement {\n const [description, setDescription] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [name, setName] = useState('');\n const [sortOrder, setSortOrder] = useState('0');\n\n useEffect((): void => {\n if (!modal) {\n return;\n }\n\n setDescription(modal.record?.description ?? '');\n setError(null);\n setName(modal.record?.name ?? '');\n setSortOrder(String(modal.record?.sortOrder ?? 0));\n }, [modal]);\n\n async function handleConfirm(): Promise<void> {\n const trimmedName = name.trim();\n const parsedSortOrder = Number(sortOrder);\n\n if (!trimmedName) {\n setError('請輸入分類名稱');\n return;\n }\n\n if (!Number.isInteger(parsedSortOrder)) {\n setError('排序必須是整數');\n return;\n }\n\n try {\n await onSubmit({\n description: description.trim() || null,\n isActive: modal?.record?.isActive ?? true,\n name: trimmedName,\n sortOrder: parsedSortOrder,\n });\n } catch (submitError: unknown) {\n setError(readErrorMessage(submitError));\n }\n }\n\n return (\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{ disabled: !name.trim() }}\n confirmText={modal?.type === 'EDIT' ? '儲存' : '建立'}\n loading={loading}\n modalType=\"standard\"\n onCancel={onClose}\n onClose={onClose}\n onConfirm={(): void => void handleConfirm()}\n open={Boolean(modal)}\n showModalFooter\n showModalHeader\n size=\"regular\"\n title={modal?.type === 'EDIT' ? '編輯分類' : '建立分類'}\n >\n <div className={styles.templateModalFields}>\n <BPMFormField label=\"分類名稱\" name=\"categoryName\" required>\n <Input\n autoFocus\n fullWidth\n onChange={(event: ChangeEvent<HTMLInputElement>): void => {\n setName(event.target.value);\n setError(null);\n }}\n placeholder=\"例如:行政管理\"\n value={name}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"排序\" name=\"categorySortOrder\">\n <Input\n fullWidth\n onChange={(event: ChangeEvent<HTMLInputElement>): void => {\n setSortOrder(event.target.value);\n setError(null);\n }}\n placeholder=\"0\"\n value={sortOrder}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"說明\" name=\"categoryDescription\">\n <Textarea\n onChange={(event: ChangeEvent<HTMLTextAreaElement>): void => {\n setDescription(event.target.value);\n setError(null);\n }}\n placeholder=\"補充分類用途\"\n value={description}\n />\n </BPMFormField>\n </div>\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n </Modal>\n );\n}\n\nfunction CategoryStatusBadge({\n isActive,\n}: {\n readonly isActive: boolean;\n}): ReactElement {\n return isActive ? (\n <Badge size=\"sub\" text=\"啟用\" variant=\"dot-success\" />\n ) : (\n <Badge size=\"sub\" text=\"停用\" variant=\"dot-inactive\" />\n );\n}\n\nfunction readCategoryStatusTabKey(activeKey: Key): CategoryStatusTabKey {\n if (activeKey === 'ACTIVE' || activeKey === 'INACTIVE') {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction readCategoryStatus(\n status: CategoryStatusTabKey,\n): ApprovalTemplateCategoryStatus {\n return status;\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n"],"mappings":"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"}
@@ -1,51 +0,0 @@
1
- "use client";const e=require("./app-navigation-DAC5gFbG.cjs"),t=require("./router-adapter-BybHrCNP.cjs"),n=require("./admin-pickers-Btvij1at.cjs"),r=require("./bpm-form-field-Bc6k4ZEO.cjs");let i=require("react"),a=require("@mezzanine-ui/react"),o=require("react/jsx-runtime"),s=require("@mezzanine-ui/icons"),c=require("@mezzanine-ui/react/ContentHeader");c=e.o(c,1);let l=require("@rytass/bpm-core-client/template"),u=require("@xyflow/react"),d=require("dagre");d=e.o(d,1);let f=require("@rytass/bpm-core-client/organization");var ee={display:`grid`,gap:16},te={alignItems:`start`,display:`grid`,gap:16,gridTemplateColumns:`minmax(0, 1fr) 420px`},ne={border:`1px solid var(--mzn-color-border-neutral)`,borderRadius:6,height:620,minWidth:0,overflow:`hidden`},re={alignItems:`center`,boxSizing:`border-box`,color:`var(--mzn-color-text-error)`,display:`flex`,height:26,justifyContent:`center`,lineHeight:0,padding:0,width:26},ie={alignItems:`center`,display:`flex`,height:`100%`,justifyContent:`center`,width:`100%`},p=`workflow-designer-side-panel`,ae=96,oe=`
2
- .${p} .mzn-form-field--stretch .mzn-form-field__label-area,
3
- .${p} .mzn-form-field--horizontal .mzn-form-field__label-area {
4
- flex: 0 0 ${ae}px;
5
- width: ${ae}px;
6
- }
7
-
8
- .${p} .mzn-form-field--stretch .mzn-form-field__data-entry,
9
- .${p} .mzn-form-field--horizontal .mzn-form-field__data-entry {
10
- min-width: 0;
11
- }
12
- `,se=`#2563eb`,m=`#64748b`,ce=`var(--mzn-color-text-error, #dc2626)`,le=`drop-shadow(0 0 3px rgba(0, 87, 255, 0.85)) drop-shadow(0 0 9px rgba(0, 87, 255, 0.36))`,ue=`
13
- .workflow-selection-delete-control.react-flow__controls-button {
14
- align-items: center !important;
15
- display: flex !important;
16
- height: 26px !important;
17
- justify-content: center !important;
18
- padding: 0 !important;
19
- width: 26px !important;
20
- }
21
-
22
- .workflow-selection-delete-control .mzn-icon {
23
- align-items: center;
24
- display: flex;
25
- justify-content: center;
26
- }
27
-
28
- .workflow-selection-delete-control .mzn-icon svg {
29
- height: 16px !important;
30
- max-height: none !important;
31
- max-width: none !important;
32
- width: 16px !important;
33
- }
34
-
35
- .workflow-edge--selected .react-flow__edge-path,
36
- .react-flow__edge-path.workflow-edge--selected {
37
- filter: ${le};
38
- opacity: 1 !important;
39
- stroke: ${m} !important;
40
- stroke-opacity: 1 !important;
41
- stroke-width: 1.5px !important;
42
- }
43
-
44
- .workflow-edge--selected {
45
- --xy-edge-stroke: ${m};
46
- --xy-edge-stroke-selected: ${m};
47
- --xy-edge-stroke-width: 1.5px;
48
- }
49
-
50
- `,de={display:`grid`,gap:12},h={display:`grid`,gap:12},fe={border:`1px solid var(--mzn-color-border-neutral)`,borderRadius:6,display:`grid`,gap:8,maxHeight:360,overflow:`auto`,padding:12},pe={borderBottom:`1px solid var(--mzn-color-border-neutral)`,display:`grid`,gap:4,padding:`0 0 8px`},me={display:`flex`,flexWrap:`wrap`,gap:8},he={display:`grid`,gap:8},g={alignContent:`center`,background:`var(--mzn-color-bg-surface)`,border:`1px solid var(--mzn-color-border-neutral)`,borderRadius:6,boxShadow:`0 8px 20px rgba(15, 23, 42, 0.08)`,boxSizing:`border-box`,display:`grid`,gap:4,height:`100%`,minWidth:132,overflow:`visible`,padding:`10px 12px`,textAlign:`center`,width:`100%`},ge=`0 8px 20px rgba(15, 23, 42, 0.08), 0 0 0 1px var(--mzn-color-primary, #0057ff), 0 0 10px rgba(0, 87, 255, 0.3)`,_=64,v=160,_e=20,ve=64,y=180,ye={...g,display:`grid`,gap:8,padding:`10px 12px`},b={...ye,background:`#eff6ff`,border:`1px solid #2563eb`},be={...ye,background:`#f0fdfa`,border:`1px solid #0f766e`},xe={...g,background:`#ffffff`},Se={...g,background:`#ecfdf3`,border:`1px solid #2f855a`},Ce={...g,background:`#fff4ed`,border:`1px solid #c2410c`},x={display:`block`,maxWidth:`100%`,minWidth:0},S={display:`grid`,gap:2,minWidth:0},C=`input`,w=`output`,we={endEvent:`結束`,exclusiveGateway:`條件分流`,parallelGateway:`並行處理`,serviceTask:`系統`,startEvent:`開始`,userTask:`簽核`},Te=[{icon:s.UserIcon,label:`簽核節點`,type:`userTask`},{icon:s.MailIcon,label:`知會節點`,type:`serviceTask`}],Ee=[{icon:s.FilterIcon,label:`條件分流`,type:`exclusiveGateway`}],De=[{id:`AND`,name:`全部前置完成`},{id:`OR`,name:`任一前置完成`}],Oe=[{id:`RESTART`,name:`重新送出後從開始重跑`},{id:`FROM_RETURN_POINT`,name:`重新送出後回到退回節點`}],ke=[{id:`DIRECT`,name:`指定會員`},{id:`ORG_MANAGER`,name:`發起人主管`},{id:`ORG_UNIT_MANAGER`,name:`指定組織主管`},{id:`ORG_UNIT_MEMBER`,name:`組織任一人`},{id:`ORG_UNIT_POSITION`,name:`組織特定職位`},{id:`POSITION`,name:`指定職位`}],T=[{id:`1`,name:`直屬主管`,value:1},{id:`2`,name:`第二層主管`,value:2},{id:`3`,name:`第三層主管`,value:3}],Ae=[{id:`NONE`,name:`停止流程並提示`},{id:`DIRECT`,name:`固定改派`}],E=[{id:`EQUALS`,name:`等於`},{id:`NOT_EQUALS`,name:`不等於`},{id:`GREATER_THAN`,name:`大於`},{id:`GREATER_THAN_OR_EQUALS`,name:`大於等於`},{id:`LESS_THAN`,name:`小於`},{id:`LESS_THAN_OR_EQUALS`,name:`小於等於`},{id:`IS_FILLED`,name:`已填寫`},{id:`IS_EMPTY`,name:`未填寫`}],je=[`EQUALS`,`GREATER_THAN`,`GREATER_THAN_OR_EQUALS`,`LESS_THAN`,`LESS_THAN_OR_EQUALS`,`NOT_EQUALS`],Me=[{id:`NONE`,name:`未設定`},{id:`ALL`,name:`所有人`},{id:`ORG_UNIT`,name:`指定組織`},{id:`ORG_UNIT_POSITION`,name:`指定組織職位`}],Ne={id:`CUSTOM`,name:`既有自訂規則`},Pe=`member-001`,Fe={endEvent:O,exclusiveGateway:O,parallelGateway:O,serviceTask:O,startEvent:O,userTask:O};function D({templateId:d,activeHref:ae=`/templates`}){let se=t.r(),[m,le]=(0,i.useState)(null),[g,ge]=(0,i.useState)(null),[_,v]=(0,i.useState)(et()),[_e,ve]=(0,i.useState)(``),[y,ye]=(0,i.useState)(null),[b,be]=(0,i.useState)(null),[xe,Se]=(0,i.useState)(null),[Ce,x]=(0,i.useState)(null),[S,C]=(0,i.useState)(`start`),[w,E]=(0,i.useState)([]),[je,D]=(0,i.useState)(null),[O,k]=(0,i.useState)(null),[Le,Re]=(0,i.useState)(!0),[ze,A]=(0,i.useState)(!1),[Ve,He]=(0,i.useState)(!1),[j,qe]=(0,i.useState)([]),Je=(0,i.useMemo)(()=>JSON.stringify({formDefinitionVersionId:y,initiatorPolicyCel:b,workflowDefinition:_}),[y,b,_]),M=!!_e&&Je!==_e,[Qe,$e]=(0,i.useState)(!1),[F,I]=(0,i.useState)([]),[L,R]=(0,i.useState)([]),[z,yt]=(0,i.useState)([]),[Ct,Tt]=(0,i.useState)([]),[V,H]=(0,i.useState)(!1),[Ft,It]=(0,i.useState)(!1),[Lt,Rt]=(0,i.useState)(`{}`),[U,Ht]=(0,i.useState)(null),[Ut,Wt]=(0,i.useState)(null),[Gt,Kt]=(0,i.useState)(void 0),W=(0,i.useRef)(null);(0,i.useEffect)(()=>{xn()},[d]),(0,i.useEffect)(()=>{function e(e){M&&(e.preventDefault(),e.returnValue=``)}return window.addEventListener(`beforeunload`,e),()=>{window.removeEventListener(`beforeunload`,e)}},[M]),(0,i.useEffect)(()=>{Cn(_)},[_,F]),(0,i.useEffect)(()=>{v(e=>Ke(e))},[_.edges,_.nodes]);function en(){M&&!window.confirm(`目前有尚未儲存的流程草稿,確定要離開嗎?`)||se.push(`/templates`)}let G=(0,i.useMemo)(()=>_.nodes.find(e=>e.id===S)??null,[S,_.nodes]),sn=G?vt(G):!1,cn=w.length>0||sn,un=(0,i.useCallback)(()=>{let e=G&&vt(G)?G.id:null;v(t=>({...t,edges:t.edges.filter(t=>!w.includes(t.id)&&t.source!==e&&t.target!==e),nodes:e?t.nodes.filter(t=>t.id!==e):t.nodes})),E([]),D(null),e&&C(`start`)},[w,G]);(0,i.useEffect)(()=>{if(!cn)return;function e(e){e.key!==`Delete`&&e.key!==`Backspace`||bt(e.target)||(e.preventDefault(),un())}return window.addEventListener(`keydown`,e),()=>{window.removeEventListener(`keydown`,e)}},[cn,un]);let dn=(0,i.useMemo)(()=>_.edges.find(e=>e.id===je)??null,[je,_.edges]),fn=(0,i.useMemo)(()=>w.length===1?_.edges.find(e=>e.id===w[0])??null:null,[w,_.edges]),mn=(0,i.useMemo)(()=>w.map(e=>_.edges.find(t=>t.id===e)??null).filter(e=>!!e),[w,_.edges]),q=(0,i.useMemo)(()=>Ce??ft(b,xe),[b,Ce,xe]),gn=(0,i.useMemo)(()=>_.nodes.map(e=>Be(e,F,L,z,e.id===S,q)),[q,F,L,z,S,_.nodes]),_n=(0,i.useMemo)(()=>_.edges.map(e=>Ue(e,_.nodes,w.includes(e.id))),[w,_.edges,_.nodes]),Y=(0,i.useMemo)(()=>P(j,y)??P(xt(m?.formVersions??[]),y),[y,j,m?.formVersions]),vn=(0,i.useMemo)(()=>Ot(j,Y),[j,Y]),yn=(0,i.useMemo)(()=>Jt(_),[_]),X=(0,i.useMemo)(()=>Yt(_),[_]),bn=(0,i.useMemo)(()=>pt(q),[q]);async function xn(){Re(!0),k(null);try{let[e,t]=await Promise.all([(0,l.readTemplateDesigner)(d),(0,f.readOrganizationDashboard)()]),n=e.versions.find(e=>e.status===`DRAFT`)??null,r=n??e.versions[0]??null;le(e),ge(n),R(t.orgUnits),yt(t.positions),Tt(t.memberships),qe(xt(e.formVersions));let i=r?.workflowDefinition??et(),a=r?.formDefinitionVersionId??e.formVersions[0]?.id??null,o=r?.initiatorPolicyCel??null;v(i),ye(a),be(o),ve(JSON.stringify({formDefinitionVersionId:a,initiatorPolicyCel:o,workflowDefinition:i})),Se(r&&!e.template.currentVersionId&&!r.initiatorPolicyCel&&tt(r.workflowDefinition)?`NONE`:null),x(null),C(r?.workflowDefinition.nodes[0]?.id??`start`),E([]),D(null)}catch(e){k(J(e))}finally{Re(!1)}}async function Sn(e){He(!0),k(null);try{qe(Ot(xt(await(0,l.searchPublishedFormVersionOptions)(e)),Y))}catch(e){k(J(e))}finally{He(!1)}}async function Z(e){$e(!0),k(null);try{let t=await(0,l.searchMemberOptions)(e);I(e=>Bt(e,kt(t)))}catch(e){k(J(e))}finally{$e(!1)}}async function Cn(e){let t=Vt(e).filter(e=>!F.some(t=>t.memberId===e));if(t.length!==0)try{let e=await(0,l.resolveMemberOptions)(t);I(t=>Bt(t,kt(e)))}catch{I(e=>Bt(e,t.map(At)))}}async function wn(){A(!0),k(null);try{let e=Jt(_),t=pt(q);if(e||t){let n=e??t??`流程設定未完成`;throw k(n),Error(n)}let n=await(0,l.updateApprovalTemplateDraft)({formDefinitionVersionId:y,initiatorPolicyCel:b,versionId:(g??await(0,l.forkApprovalTemplate)(d)).id,workflowDefinition:_});return ge(n),await xn(),n}catch(e){throw k(J(e)),e}finally{A(!1)}}async function Tn(){A(!0),k(null);try{await(0,l.publishApprovalTemplateVersion)((await wn()).id),await xn()}catch(e){k(J(e))}finally{A(!1)}}function En(){Rt(JSON.stringify(St(Y),null,2)),Ht(null),Wt(null),H(!0)}function Dn(){Ft||H(!1)}async function On(){It(!0),Wt(null),Ht(null);try{Ht(await(0,l.dryRunApprovalWorkflow)({formData:wt(Lt),initiatorMemberId:Pe,initiatorMetadataSnapshot:Pt(Pe,Ct),workflowDefinition:_}))}catch(e){Wt(J(e))}finally{It(!1)}}function kn(e){let t=(0,u.applyNodeChanges)(e,gn);v(e=>({...e,nodes:e.nodes.map(e=>{let n=t.find(t=>t.id===e.id);return n?{...e,position:n.position}:e})}))}function An(e){if(!gt(e,_.nodes))return;let t=_.nodes.some(t=>t.id===e.source&&t.type===`exclusiveGateway`),n=N(e.source,e.target,{});v(e=>({...e,edges:[...e.edges,n]})),C(null),E([n.id]),D(t?n.id:null)}function jn(e,t){e.stopPropagation(),E(n=>e.shiftKey||e.metaKey||e.ctrlKey?_t(n,t.id):[t.id]),C(null)}function Mn(){D(null)}function Nn(e){let t=Ze({definition:_,node:Ye(e,Xe(_.nodes,e)),selectedEdgeId:w.length===1?w[0]:null,selectedNodeId:S}),n=nt(t.definition),r=qt(n,W.current);v(n),C(t.selectedNodeId),E(t.selectedEdgeIds),D(t.editingEdgeId),r&&Kt(r)}function Pn(e){G&&$(G.id,t=>We(t,e))}function Q(e){!G||G.type!==`userTask`||$(G.id,t=>t.type===`userTask`?{...t,data:{...t.data,approverResolver:e,decisionPolicy:{type:`SINGLE`}}}:t)}function Fn(e){!G||G.type!==`userTask`||$(G.id,t=>t.type===`userTask`?{...t,data:{...t.data,returnBehavior:{...t.data.returnBehavior,resubmitStrategy:e}}}:t)}function In(e){!G||G.type!==`serviceTask`||$(G.id,t=>t.type===`serviceTask`?{...t,data:{...t.data,action:e}}:t)}function Ln(e){x(e.mode===`ALL`||e.mode===`CUSTOM`?null:e),Se(e.mode===`ALL`||e.mode===`CUSTOM`?null:e.mode),be(mt(e,L))}function Rn(e){!G||G.type===`startEvent`||$(G.id,t=>Ge(t,e))}function $(e,t){v(n=>({...n,nodes:n.nodes.map(n=>n.id===e?t(n):n)}))}function zn(e,t){v(n=>({...n,edges:n.edges.map(n=>n.id===e?t(n):n)}))}function Bn(e,t){v(n=>{let r=n.edges.find(t=>t.id===e);return r?{...n,edges:n.edges.map(e=>t&&e.source===r.source&&e.id!==r.id&&K(e,n.nodes)?{...e,data:{...e.data,isDefault:!1}}:e.id===r.id?{...e,data:{...e.data,isDefault:t}}:e)}:n})}function Vn({edgeId:e,fieldKey:t,operator:n,value:r}){let i=Y?.schema??null;zn(e,e=>{let a=Zt(i,t??e.data.conditionFieldKey??null),o=nn(a,n??e.data.conditionOperator??null),s=rn(a,o,r??e.data.conditionValue??null),c=on(a,o,s);return{...e,data:{...e.data,condition:ln(a,o,s),conditionFieldKey:a?.fieldKey,conditionOperator:o,conditionValue:s,isDefault:!1,label:c}}})}function Hn(){let e=nt(_),t=qt(e,W.current);v(e),t&&Kt(t)}return(0,o.jsxs)(a.Layout,{children:[(0,o.jsx)(e.t,{activeHref:ae}),(0,o.jsxs)(a.Layout.Main,{children:[(0,o.jsx)(`style`,{children:oe}),(0,o.jsx)(a.PageHeader,{children:(0,o.jsxs)(c.default,{description:`${g?`草稿 v${g.version}`:`尚未建立草稿`} ·${m?.template.currentVersionId?` 已發布版本`:` 尚未發布`}`,onBackClick:en,title:m?.template.name??`流程設計器`,children:[(0,o.jsx)(a.Button,{"aria-label":`儲存草稿`,disabled:ze||!!yn||!!bn,icon:s.SaveIcon,iconType:`icon-only`,onClick:()=>void wn(),variant:`base-secondary`,children:`儲存草稿`}),(0,o.jsx)(a.Button,{disabled:Le||!!yn||!!bn,icon:s.EyeIcon,iconType:`leading`,onClick:En,variant:`base-secondary`,children:`試跑流程`}),(0,o.jsx)(a.Button,{disabled:ze||!g||!!yn||!!bn,icon:s.CheckedIcon,iconType:`leading`,onClick:()=>void Tn(),variant:`base-primary`,children:`發布版本`})]})}),(0,o.jsx)(a.SectionGroup,{children:(0,o.jsx)(a.Section,{children:(0,o.jsxs)(`div`,{style:ee,children:[O?(0,o.jsx)(a.Typography,{color:`text-error`,variant:`body`,children:O}):null,yn?(0,o.jsx)(a.Typography,{color:`text-error`,variant:`body`,children:yn}):null,bn?(0,o.jsx)(a.Typography,{color:`text-error`,variant:`body`,children:bn}):null,(0,o.jsx)(`div`,{style:h,children:(0,o.jsx)(r.t,{hintText:X?`已設定條件分流條件。請先移除所有條件,才能更換綁定表單版本。`:void 0,label:`綁定表單版本`,name:`formDefinitionVersionId`,required:!0,children:(0,o.jsx)(a.AutoComplete,{asyncData:!0,disabled:Le||X,disabledOptionsFilter:!0,emptyText:`沒有符合的已發布表單版本`,isForceClearable:!!y&&!X,loading:Ve,loadingText:`搜尋表單版本中...`,mode:`single`,onChange:e=>{X||ye(e?.id??null)},onClear:()=>{X||ye(null)},onSearch:Sn,onVisibilityChange:e=>{e&&!X&&Sn(``)},options:[...vn],placeholder:`選擇已發布表單版本`,searchDebounceTime:300,value:Y})})}),(0,o.jsxs)(`div`,{style:te,children:[(0,o.jsx)(`div`,{ref:W,style:ne,children:(0,o.jsxs)(u.ReactFlow,{connectionMode:u.ConnectionMode.Strict,edges:_n,fitView:!0,isValidConnection:e=>gt(e,_.nodes),nodeTypes:Fe,nodes:gn,deleteKeyCode:null,multiSelectionKeyCode:[`Shift`,`Meta`,`Control`],onConnect:An,onEdgeClick:jn,onNodeClick:(e,t)=>{C(t.id),E([])},onNodesChange:kn,onPaneClick:()=>{C(null),E([])},onViewportChange:Kt,viewport:Gt,children:[(0,o.jsx)(u.Background,{}),(0,o.jsx)(`style`,{children:ue}),(0,o.jsx)(u.Controls,{children:cn?(0,o.jsx)(u.ControlButton,{"aria-label":`刪除選取項目`,className:`workflow-selection-delete-control`,onClick:un,style:re,title:`刪除選取項目`,children:(0,o.jsx)(`span`,{style:ie,children:(0,o.jsx)(a.Icon,{color:`error`,icon:s.TrashIcon,size:16})})}):null}),(0,o.jsx)(Ie,{onApplyAutoLayout:Hn}),(0,o.jsx)(u.MiniMap,{})]})}),(0,o.jsxs)(`div`,{className:p,style:de,children:[(0,o.jsx)(a.Typography,{component:`h2`,variant:`h3`,children:`流程工具`}),(0,o.jsxs)(`div`,{style:he,children:[(0,o.jsx)(a.Typography,{color:`text-neutral`,variant:`caption`,children:`動作節點`}),(0,o.jsx)(`div`,{style:me,children:Te.map(e=>(0,o.jsx)(a.Button,{icon:e.icon,iconType:`leading`,onClick:()=>Nn(e.type),size:`sub`,variant:`base-secondary`,children:e.label},e.type))})]}),(0,o.jsxs)(`div`,{style:he,children:[(0,o.jsx)(a.Typography,{color:`text-neutral`,variant:`caption`,children:`流程控制`}),(0,o.jsx)(`div`,{style:me,children:Ee.map(e=>(0,o.jsx)(a.Button,{icon:e.icon,iconType:`leading`,onClick:()=>Nn(e.type),size:`sub`,variant:`base-secondary`,children:e.label},e.type))})]}),mn.length>1?Yn(mn):null,mn.length===1&&fn?Xn(fn):null,mn.length===0&&G?Wn(G):null]})]})]})})}),Zn(dn),Un()]})]});function Un(){return(0,o.jsx)(a.Modal,{cancelText:`關閉`,confirmText:`執行試跑`,loading:Ft,modalType:`standard`,onCancel:Dn,onClose:Dn,onConfirm:()=>void On(),open:V,showModalFooter:!0,showModalHeader:!0,size:`wide`,supportingText:`使用 ${Pe} 與範例表單資料模擬目前畫布流程,不會建立案件。`,title:`試跑流程`,children:(0,o.jsxs)(`div`,{style:h,children:[(0,o.jsx)(r.t,{label:`表單資料 JSON`,name:`dryRunFormDataJson`,required:!0,children:(0,o.jsx)(a.Textarea,{onChange:e=>Rt(e.target.value),resize:`vertical`,rows:8,value:Lt})}),Ut?(0,o.jsx)(a.Typography,{color:`text-error`,variant:`body`,children:Ut}):null,U?(0,o.jsxs)(`div`,{style:fe,children:[(0,o.jsx)(a.Typography,{color:U.valid?`text-success`:`text-error`,variant:`label-primary-highlight`,children:U.valid?`試跑通過`:`試跑失敗`}),U.errors.map(e=>(0,o.jsx)(a.Typography,{color:`text-error`,variant:`body`,children:e},e)),U.steps.map(e=>(0,o.jsxs)(`div`,{style:pe,children:[(0,o.jsxs)(a.Typography,{variant:`label-primary-highlight`,children:[e.nodeLabel,` · `,Et(e.status)]}),(0,o.jsxs)(a.Typography,{color:`text-neutral`,variant:`caption`,children:[Dt(e.nodeType),e.assigneeMemberId?` · 處理者:${e.assigneeMemberId}`:``,e.edgeLabel?` · 來源線段:${e.edgeLabel}`:``]}),e.edgeReason?(0,o.jsx)(a.Typography,{color:`text-neutral`,variant:`caption`,children:e.edgeReason}):null,e.entryCondition?(0,o.jsxs)(a.Typography,{color:`text-neutral`,variant:`caption`,children:[`進入條件:`,e.entryConditionMatched?`符合`:`不符合`,` ·`,` `,e.entryCondition]}):null,(0,o.jsx)(a.Typography,{color:`text-neutral`,variant:`body`,children:e.message})]},e.id))]}):null]})})}function Wn(e){return(0,o.jsxs)(`div`,{style:h,children:[(0,o.jsx)(a.Typography,{component:`h2`,variant:`h3`,children:`節點屬性`}),(0,o.jsxs)(a.Typography,{color:`text-neutral`,variant:`body`,children:[we[e.type],` · `,e.id]}),(0,o.jsx)(r.t,{label:`顯示名稱`,name:`nodeLabel`,required:!0,children:(0,o.jsx)(a.Input,{onChange:e=>Pn(e.target.value),value:e.data.label,variant:`base`})}),e.type===`startEvent`?Gn():null,e.type===`startEvent`?null:Kn(e),e.type===`userTask`?qn(e):null,e.type===`serviceTask`?Jn(e):null]})}function Gn(){let e=q.mode===`CUSTOM`?[...Me,Ne]:[...Me],t=q.mode===`ORG_UNIT`||q.mode===`ORG_UNIT_POSITION`?Mt(L,q.orgUnitId??``):null,i=q.mode===`ORG_UNIT_POSITION`?Nt(z,q.positionId??``):null,s=q.mode===`ORG_UNIT_POSITION`?zt({includeDescendants:!!q.includeDescendants,memberships:Ct,orgUnitId:q.orgUnitId??``,orgUnits:L,positions:z}):[];return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.t,{hintText:q.mode===`CUSTOM`?`這是舊版表達式規則;切換成標準選項後會改由 UI 管理。`:void 0,label:`發起權限`,name:`initiatorPolicyMode`,required:!0,children:(0,o.jsx)(a.Select,{clearable:!1,onChange:e=>{if(e?.id===`CUSTOM`){Se(null),x(null);return}let t=dt(e?.id??null),n=ht(t);Se(t===`ALL`?null:t),x(t===`ALL`?null:n),be(mt(n,L))},options:e,placeholder:`選擇誰可以發起`,value:P(e,q.mode)})}),q.mode===`ORG_UNIT`||q.mode===`ORG_UNIT_POSITION`?(0,o.jsx)(r.t,{label:`組織`,name:`initiatorOrgUnitId`,required:!0,children:(0,o.jsx)(n.n,{name:`initiatorOrgUnitId`,onChange:e=>Ln({...q,orgUnitId:e?.id??``,positionId:``,value:e?.id??``}),orgUnits:L,placeholder:`選擇組織`,value:t})}):null,q.mode===`ORG_UNIT`||q.mode===`ORG_UNIT_POSITION`?(0,o.jsx)(r.t,{label:`包含下層`,name:`initiatorIncludeDescendants`,children:(0,o.jsx)(a.Toggle,{checked:!!q.includeDescendants,onChange:e=>Ln({...q,includeDescendants:e.target.checked,...q.mode===`ORG_UNIT_POSITION`?{positionId:``}:{}})})}):null,q.mode===`ORG_UNIT_POSITION`?(0,o.jsx)(r.t,{label:`職位`,name:`initiatorPositionId`,required:!0,children:(0,o.jsx)(n.r,{disabled:!q.orgUnitId?.trim(),name:`initiatorPositionId`,onChange:e=>Ln({...q,positionId:e?.id??``}),placeholder:q.orgUnitId?.trim()?`選擇職位`:`請先選擇組織`,positions:s,value:i})}):null]})}function Kn(e){let t=_.edges.filter(t=>t.target===e.id).length,n=t<2,i=n?`AND`:e.data.triggerMode??`AND`;return(0,o.jsx)(r.t,{hintText:n?`需要至少兩條前置連線,才可切換為任一前置完成。`:t>1?`${t} 條前置連線會依此規則觸發。`:`只有一條前置連線時,兩種設定效果相同。`,label:`前置條件`,name:`triggerMode`,required:!0,children:(0,o.jsx)(a.Select,{clearable:!1,onChange:e=>n?void 0:Rn(rt(e?.id??null)),options:[...De],readOnly:n,value:P(De,i)})})}function qn(e){let t=e.data.approverResolver,i=at(t.type),s=t.type===`DIRECT`?jt(t.memberIds,F):null,c=t.type===`ORG_UNIT_MANAGER`||t.type===`ORG_UNIT_MEMBER`||t.type===`ORG_UNIT_POSITION`?Mt(L,t.orgUnitId):null,l=t.type===`POSITION`||t.type===`ORG_UNIT_POSITION`?Nt(z,t.positionId):null,u=t.type===`ORG_UNIT_POSITION`?zt({includeDescendants:!!t.includeDescendants,memberships:Ct,orgUnitId:t.orgUnitId,orgUnits:L,positions:z}):[],d=t.type===`ORG_MANAGER`?lt(t.levelsUp):T[0],f=t.type===`ORG_MANAGER`||t.type===`ORG_UNIT_MANAGER`?t.fallback??{type:`NONE`}:{type:`NONE`},ee=f.type===`DIRECT`?B(F,f.memberId):null,te=e.data.returnBehavior.resubmitStrategy??`RESTART`;return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.t,{label:`簽核來源`,name:`approverResolverType`,required:!0,children:(0,o.jsx)(a.Select,{clearable:!1,onChange:e=>Q(ot(e?.id??null)),options:[...ke],value:P(ke,i)})}),t.type===`DIRECT`?(0,o.jsx)(r.t,{label:`簽核者`,name:`memberId`,required:!0,children:(0,o.jsx)(a.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的成員`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:`workflow-approver-search`,spellCheck:!1},loading:Qe,loadingText:`搜尋成員中...`,mode:`single`,onChange:e=>Q({memberIds:e?.id?[e.id]:[],type:`DIRECT`}),onSearch:Z,onVisibilityChange:e=>{e&&Z(``)},options:[...F],placeholder:`搜尋姓名或信箱`,searchDebounceTime:300,value:s})}):null,t.type===`ORG_MANAGER`?(0,o.jsx)(r.t,{hintText:`依發起人的有效會員歸屬與主管解析規則決定簽核人。`,label:`主管層級`,name:`managerLevelsUp`,required:!0,children:(0,o.jsx)(a.Select,{clearable:!1,onChange:e=>Q({baseFromInitiator:!0,levelsUp:ut(e?.id??null).value,type:`ORG_MANAGER`}),options:[...T],value:d})}):null,t.type===`ORG_UNIT_MANAGER`||t.type===`ORG_UNIT_MEMBER`||t.type===`ORG_UNIT_POSITION`?(0,o.jsx)(r.t,{hintText:t.type===`ORG_UNIT_MANAGER`?`依指定組織或其上層的主管解析規則決定簽核人。`:`依指定組織目前有效會員歸屬建立候選簽核人。`,label:`組織`,name:`orgUnitId`,required:!0,children:(0,o.jsx)(n.n,{name:`orgUnitId`,onChange:e=>Q(t.type===`ORG_UNIT_MEMBER`?{includeDescendants:t.includeDescendants,orgUnitId:e?.id??``,type:`ORG_UNIT_MEMBER`}:t.type===`ORG_UNIT_POSITION`?{includeDescendants:t.includeDescendants,orgUnitId:e?.id??``,positionId:``,type:`ORG_UNIT_POSITION`}:{fallback:t.fallback,orgUnitId:e?.id??``,type:`ORG_UNIT_MANAGER`}),orgUnits:L,placeholder:`選擇組織`,value:c})}):null,t.type===`ORG_MANAGER`||t.type===`ORG_UNIT_MANAGER`?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.t,{hintText:`預設會停止流程並提示;若設定固定人,找不到主管時會改派給該會員。`,label:`無主管時`,name:`approverFallbackMode`,required:!0,children:(0,o.jsx)(a.Select,{clearable:!1,onChange:e=>Q(ct(t,st(e?.id??null)===`DIRECT`?{memberId:``,type:`DIRECT`}:{type:`NONE`})),options:[...Ae],value:P(Ae,f.type)})}),f.type===`DIRECT`?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.t,{label:`改派人員`,name:`approverFallbackMemberId`,required:!0,children:(0,o.jsx)(a.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的成員`,inputProps:{autoCapitalize:`none`,autoCorrect:`off`,name:`workflow-approver-fallback-search`,spellCheck:!1},loading:Qe,loadingText:`搜尋成員中...`,mode:`single`,onChange:e=>Q(ct(t,{allowInitiatorSelfApproval:f.allowInitiatorSelfApproval,memberId:e?.id??``,type:`DIRECT`})),onSearch:Z,onVisibilityChange:e=>{e&&Z(``)},options:[...F],placeholder:`搜尋姓名或信箱`,searchDebounceTime:300,value:ee})}),(0,o.jsx)(r.t,{hintText:`預設禁止申請人簽自己的案件;只有此流程允許自簽時才開啟。`,label:`允許自簽`,name:`allowInitiatorSelfApproval`,children:(0,o.jsx)(a.Toggle,{checked:!!f.allowInitiatorSelfApproval,onChange:e=>Q(ct(t,{allowInitiatorSelfApproval:e.target.checked,memberId:f.memberId,type:`DIRECT`}))})})]}):null]}):null,t.type===`ORG_UNIT_MEMBER`||t.type===`ORG_UNIT_POSITION`?(0,o.jsx)(r.t,{label:`包含下層`,name:`includeDescendants`,children:(0,o.jsx)(a.Toggle,{checked:!!t.includeDescendants,onChange:e=>Q({...t,includeDescendants:e.target.checked,...t.type===`ORG_UNIT_POSITION`?{positionId:``}:{}})})}):null,t.type===`POSITION`?(0,o.jsx)(r.t,{hintText:`指派給目前有效歸屬中擁有此職位的會員;主要歸屬優先。`,label:`職位`,name:`positionId`,required:!0,children:(0,o.jsx)(n.r,{name:`positionId`,onChange:e=>Q({positionId:e?.id??``,type:`POSITION`}),placeholder:`選擇職位`,positions:z,value:l})}):null,t.type===`ORG_UNIT_POSITION`?(0,o.jsx)(r.t,{hintText:`只納入指定組織範圍內擁有此職位的有效會員。`,label:`職位`,name:`orgUnitPositionId`,required:!0,children:(0,o.jsx)(n.r,{disabled:!t.orgUnitId.trim(),name:`orgUnitPositionId`,onChange:e=>Q({includeDescendants:t.includeDescendants,orgUnitId:t.orgUnitId,positionId:e?.id??``,type:`ORG_UNIT_POSITION`}),placeholder:t.orgUnitId.trim()?`選擇職位`:`請先選擇組織`,positions:u,value:l})}):null,e.data.returnBehavior.allowReturn?(0,o.jsx)(r.t,{hintText:`退回發起人後,重新送出時要從流程開始重跑,或直接回到退回的簽核節點。`,label:`重送策略`,name:`returnResubmitStrategy`,required:!0,children:(0,o.jsx)(a.Select,{clearable:!1,onChange:e=>Fn(it(e?.id??null)),options:[...Oe],value:P(Oe,te)})}):null]})}function Jn(e){let t=hn(e.data.action).map(e=>B(F,e));return(0,o.jsx)(r.t,{label:`知會對象`,name:`notifyMemberIds`,required:!0,children:(0,o.jsx)(a.AutoComplete,{asyncData:!0,disabledOptionsFilter:!0,emptyText:`沒有符合的成員`,loading:Qe,loadingText:`搜尋成員中...`,mode:`multiple`,onChange:e=>In({channels:[`IN_APP`],recipients:{memberIds:e.map(e=>e.id),type:`DIRECT`},type:`NOTIFY`}),onSearch:Z,onVisibilityChange:e=>{e&&Z(``)},options:[...F],overflowStrategy:`wrap`,placeholder:`搜尋姓名或信箱`,searchDebounceTime:300,value:[...t]})})}function Yn(e){return(0,o.jsxs)(`div`,{style:h,children:[(0,o.jsx)(a.Typography,{component:`h2`,variant:`h3`,children:`已選取線段`}),(0,o.jsxs)(a.Typography,{color:`text-neutral`,variant:`body`,children:[`已選取 `,e.length,` 條線段,可使用 Delete 或控制面板刪除。`]})]})}function Xn(e){let t=K(e,_.nodes);return(0,o.jsxs)(`div`,{style:h,children:[(0,o.jsx)(a.Typography,{component:`h2`,variant:`h3`,children:t?`條件設定`:`線段屬性`}),(0,o.jsxs)(a.Typography,{color:`text-neutral`,variant:`body`,children:[e.source,` → `,e.target]}),t?Qn(e):(0,o.jsx)(a.Typography,{color:`text-neutral`,variant:`body`,children:`這條線會直接把流程送到下一個節點。`})]})}function Zn(e){return!e||!K(e,_.nodes)?null:(0,o.jsx)(a.Modal,{cancelText:`取消`,confirmButtonProps:{disabled:!e.data.isDefault&&!e.data.condition},confirmText:`完成`,modalType:`standard`,onCancel:Mn,onClose:Mn,onConfirm:Mn,open:!!je,showModalFooter:!0,showModalHeader:!0,size:`regular`,supportingText:`條件分流的輸出連線需要指定條件,條件會直接顯示在線上。`,title:`條件設定`,children:Qn(e)})}function Qn(e){let t=pn(e,_.nodes),n=Xt(Y?.schema??null),i=Zt(Y?.schema??null,e.data.conditionFieldKey??null),s=Qt(i),c=tn(i),l=P(s,e.data.conditionOperator??null);return(0,o.jsxs)(`div`,{style:h,children:[(0,o.jsxs)(a.Typography,{color:`text-neutral`,variant:`body`,children:[`畫布上的這條線目前會顯示「`,(0,o.jsx)(`span`,{style:{color:!e.data.isDefault&&!e.data.condition?ce:void 0},children:t??`請設定條件`}),`」。`]}),(0,o.jsx)(a.Toggle,{checked:!!e.data.isDefault,label:`其他情況走這條`,onChange:t=>Bn(e.id,t.target.checked)}),e.data.isDefault?(0,o.jsx)(a.Typography,{color:`text-neutral`,variant:`body`,children:`其他條件都不符合時,流程會走這條線。`}):(0,o.jsxs)(o.Fragment,{children:[Y?null:(0,o.jsx)(a.Typography,{color:`text-neutral`,variant:`body`,children:`請先綁定表單版本,才能選擇條件欄位。`}),(0,o.jsx)(r.t,{label:`條件欄位`,name:`edgeConditionField`,required:!0,children:(0,o.jsx)(a.Select,{clearable:!1,onChange:t=>Vn({edgeId:e.id,fieldKey:t?.id??null,operator:null,value:null}),options:[...n],placeholder:`選擇條件欄位`,value:P(n,e.data.conditionFieldKey??null)})}),(0,o.jsx)(r.t,{label:`條件判斷`,name:`edgeConditionOperator`,required:!0,children:(0,o.jsx)(a.Select,{clearable:!1,onChange:t=>Vn({edgeId:e.id,operator:$t(t?.id??null),value:null}),options:[...s],placeholder:`選擇判斷方式`,value:l})}),l&&an(l.id)?(0,o.jsx)(r.t,{label:`條件值`,name:`edgeConditionValue`,required:!0,children:c.length>0?(0,o.jsx)(a.Select,{clearable:!1,onChange:t=>Vn({edgeId:e.id,value:t?.id??null}),options:[...c],placeholder:`選擇條件值`,value:P(c,e.data.conditionValue??null)}):(0,o.jsx)(a.Input,{onChange:t=>Vn({edgeId:e.id,value:t.target.value}),placeholder:`輸入要比對的值`,value:e.data.conditionValue??``,variant:`base`})}):null]})]})}}function Ie({onApplyAutoLayout:e}){function t(){e()}return(0,o.jsx)(u.Panel,{position:`top-right`,children:(0,o.jsx)(a.Button,{icon:s.DotGridIcon,iconType:`leading`,onClick:t,size:`sub`,variant:`base-secondary`,children:`自動排版`})})}function O({data:e,selected:t,type:n}){let r=e.approverLines??[e.approverSummary??e.label],i=k(e);return(0,o.jsxs)(`div`,{style:Le(n,t),children:[ze(e),(0,o.jsx)(`div`,{style:S,children:r.map((e,t)=>(0,o.jsx)(a.Typography,{component:`span`,ellipsis:!0,style:x,title:e,variant:`label-primary`,children:e},`${e}_${t}`))}),(0,o.jsx)(a.Typography,{color:`text-neutral`,component:`span`,ellipsis:!0,style:x,title:i,variant:`caption`,children:i})]})}function k(e){return e.nodeKind===`startEvent`?e.initiatorPolicySummary??`所有人`:e.approverSummary||e.approverLines?e.label:e.nodeKind===`exclusiveGateway`?`條件在線上`:e.nodeKind===`parallelGateway`?`多條路徑同時進行`:we[e.nodeKind]}function Le(e,t){let n=Re(e);return t?{...n,border:`1px solid var(--mzn-color-primary, #0057ff)`,boxShadow:ge}:n}function Re(e){return e===`exclusiveGateway`?b:e===`parallelGateway`?be:e===`startEvent`?Se:e===`endEvent`?Ce:e===`userTask`?xe:g}function ze(e){return!e.hasInput&&e.hasOutput?(0,o.jsx)(u.Handle,{id:w,position:u.Position.Right,type:`source`}):e.hasInput&&!e.hasOutput?(0,o.jsx)(u.Handle,{id:C,position:u.Position.Left,type:`target`}):!e.hasInput&&!e.hasOutput?null:[(0,o.jsx)(u.Handle,{id:C,position:u.Position.Left,type:`target`},`target`),(0,o.jsx)(u.Handle,{id:w,position:u.Position.Right,type:`source`},`source`)]}function Be(e,t,n,r,i,a){let o=A(e);return{data:{approverLines:Wt(e,t),approverSummary:Ht(e,t,n,r),hasInput:R(e),hasOutput:z(e),initiatorPolicySummary:e.type===`startEvent`?L(a,n,r):null,label:e.data.label,nodeKind:e.type},height:o.height,handles:Ve(e),id:e.id,initialHeight:o.height,initialWidth:o.width,position:e.position,selected:i,sourcePosition:u.Position.Right,targetPosition:u.Position.Left,type:e.type,width:o.width}}function A(e){return e.type===`exclusiveGateway`||e.type===`parallelGateway`?{height:ve,width:y}:e.type===`serviceTask`?{height:_+(Math.max(1,hn(e.data.action).length)-1)*_e,width:v}:{height:_,width:v}}function Ve(e){let t=A(e);return[...R(e)?[He(t)]:[],...z(e)?[j(t)]:[]]}function He({height:e}){let t=e/2-9/2;return{height:9,id:C,position:u.Position.Left,type:`target`,width:9,x:-9/2,y:t}}function j({height:e,width:t}){let n=e/2-9/2;return{height:9,id:w,position:u.Position.Right,type:`source`,width:9,x:t-9/2,y:n}}function Ue(e,t,n){let r=pn(e,t),i=K(e,t),a=i&&!e.data.isDefault&&!e.data.condition,o=a?ce:i?se:`#475569`,s=a?`#fef2f2`:i?`#eff6ff`:`#ffffff`,c=a?ce:i?se:m;return{className:n?`workflow-edge--selected`:void 0,data:e.data,id:e.id,label:r,labelBgBorderRadius:6,labelBgPadding:[8,4],labelBgStyle:{fill:s,stroke:c,strokeWidth:1},labelShowBg:!!r,labelStyle:{fill:o,fontSize:12,fontWeight:600},selected:n,source:e.source,sourceHandle:e.sourceHandle,style:{filter:n?le:void 0,opacity:1,stroke:m,strokeOpacity:1,strokeWidth:1.5},target:e.target,targetHandle:e.targetHandle,type:e.type??`smoothstep`}}function We(e,t){return e.type===`startEvent`||e.type===`endEvent`||e.type===`userTask`||e.type===`serviceTask`||e.type,{...e,data:{...e.data,label:t}}}function Ge(e,t){return e.type===`startEvent`?e:(e.type===`endEvent`||e.type===`userTask`||e.type===`serviceTask`||e.type,{...e,data:{...e.data,triggerMode:t}})}function Ke(e){return Je(qe(e))}function qe(e){let t=new Set(e.nodes.filter(e=>yt(e)).map(e=>e.id)),n=e.edges.filter(e=>!t.has(e.source));return n.length===e.edges.length?e:{...e,edges:n}}function Je(e){let t=e.edges.reduce((e,t)=>({...e,[t.target]:(e[t.target]??0)+1}),{}),n=e.nodes.map(e=>e.type===`startEvent`?e:(t[e.id]??0)<2&&e.data.triggerMode!==`AND`?Ge(e,`AND`):e);return n.some((t,n)=>t!==e.nodes[n])?{...e,nodes:n}:e}function Ye(e,t){let n={id:`${e}_${t}`,position:{x:260+t*48,y:120+t*42}};return e===`userTask`?{...n,data:{allowAddSigner:!1,allowReject:!0,allowTransfer:!0,approverResolver:{memberIds:[`member-001`],type:`DIRECT`},decisionPolicy:{type:`SINGLE`},label:`簽核節點 ${t}`,returnBehavior:{allowReturn:!0,allowedTargets:`INITIATOR`,resubmitStrategy:`RESTART`},triggerMode:`AND`},type:e}:e===`serviceTask`?{...n,data:{action:{channels:[`IN_APP`],recipients:{memberIds:[`member-001`],type:`DIRECT`},type:`NOTIFY`},label:`知會節點 ${t}`,triggerMode:`AND`},type:e}:{...n,data:{direction:`split`,label:`條件分流 ${t}`,triggerMode:`AND`},type:e}}function Xe(e,t){let n=new Set(e.filter(e=>e.type===t).map(e=>Number(e.id.replace(`${t}_`,``))).filter(e=>Number.isInteger(e)&&e>0));return Array.from({length:e.length+1},(e,t)=>t+1).find(e=>!n.has(e))??e.length+1}function Ze({definition:e,node:t,selectedEdgeId:n,selectedNodeId:r}){let i=n?e.edges.find(e=>e.id===n)??null:null,a=r?e.nodes.find(e=>e.id===r)??null:null;return i?M(e,t,i):a?Qe(e,t,a):{definition:{...e,nodes:[...e.nodes,t]},editingEdgeId:null,selectedEdgeIds:[],selectedNodeId:t.id}}function M(e,t,n){if(!R(t))return{definition:e,editingEdgeId:null,selectedEdgeIds:[n.id],selectedNodeId:null};if(!z(t)){let r=N(n.source,t.id,{});return{definition:{...e,edges:[...e.edges,r],nodes:[...e.nodes,t]},editingEdgeId:null,selectedEdgeIds:[],selectedNodeId:t.id}}let r=N(n.source,t.id,n.data),i=N(t.id,n.target,$e(t,n)),a=K(i,[...e.nodes,t]);return{definition:{...e,edges:e.edges.flatMap(e=>e.id===n.id?[r,i]:[e]),nodes:[...e.nodes,t]},editingEdgeId:a?i.id:null,selectedEdgeIds:a?[i.id]:[],selectedNodeId:a?null:t.id}}function Qe(e,t,n){if(!z(n))return{definition:{...e,nodes:[...e.nodes,t]},editingEdgeId:null,selectedEdgeIds:[],selectedNodeId:t.id};let r=e.edges.find(e=>e.source===n.id)??null;if(r&&z(t))return M(e,t,r);let i=e.nodes.find(e=>e.type===`endEvent`);if(i&&n.id!==i.id&&z(t)){let r=N(n.id,t.id,{}),a=N(t.id,i.id,$e(t,r)),o=K(a,[...e.nodes,t]);return{definition:{...e,edges:[...e.edges,r,a],nodes:[...e.nodes,t]},editingEdgeId:o?a.id:null,selectedEdgeIds:o?[a.id]:[],selectedNodeId:o?null:t.id}}let a=N(n.id,t.id,{});return{definition:{...e,edges:[...e.edges,a],nodes:[...e.nodes,t]},editingEdgeId:null,selectedEdgeIds:[],selectedNodeId:t.id}}function N(e,t,n){return{data:n,id:`edge_${e}_${t}_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,source:e,sourceHandle:w,target:t,targetHandle:C,type:`smoothstep`}}function $e(e,t){return e.type===`exclusiveGateway`?{isDefault:!0,label:`其他情況`}:{}}function et(){return{edges:[],meta:{schemaVersion:1},nodes:[{data:{label:`開始`},id:`start`,position:{x:80,y:160},type:`startEvent`},{data:{endState:`APPROVED`,label:`完成`,triggerMode:`AND`},id:`end`,position:{x:560,y:160},type:`endEvent`}]}}function tt(e){return e.edges.length===0&&e.nodes.length===2&&e.nodes.some(e=>e.type===`startEvent`)&&e.nodes.some(e=>e.type===`endEvent`)}function nt(e){let t=new d.graphlib.Graph;return t.setDefaultEdgeLabel(()=>({})),t.setGraph({rankdir:`LR`,ranksep:120}),e.nodes.forEach(e=>{t.setNode(e.id,A(e))}),e.edges.forEach(e=>{t.setEdge(e.source,e.target)}),d.layout(t),{...e,nodes:e.nodes.map(e=>{let n=t.node(e.id);return n?{...e,position:{x:n.x-A(e).width/2,y:n.y-A(e).height/2}}:e})}}function P(e,t){return t?e.find(e=>e.id===t)??null:null}function rt(e){return e===`OR`?`OR`:`AND`}function it(e){return e===`FROM_RETURN_POINT`?`FROM_RETURN_POINT`:`RESTART`}function at(e){return e===`ORG_MANAGER`||e===`ORG_UNIT_MANAGER`||e===`ORG_UNIT_MEMBER`||e===`ORG_UNIT_POSITION`||e===`POSITION`?e:`DIRECT`}function ot(e){let t=at(e??`DIRECT`);return t===`ORG_MANAGER`?{baseFromInitiator:!0,levelsUp:1,type:`ORG_MANAGER`}:t===`ORG_UNIT_MANAGER`?{orgUnitId:``,type:`ORG_UNIT_MANAGER`}:t===`ORG_UNIT_MEMBER`?{includeDescendants:!1,orgUnitId:``,type:`ORG_UNIT_MEMBER`}:t===`ORG_UNIT_POSITION`?{includeDescendants:!1,orgUnitId:``,positionId:``,type:`ORG_UNIT_POSITION`}:t===`POSITION`?{positionId:``,type:`POSITION`}:{memberIds:[],type:`DIRECT`}}function st(e){return e===`DIRECT`?`DIRECT`:`NONE`}function ct(e,t){return e.type===`ORG_MANAGER`||e.type===`ORG_UNIT_MANAGER`?{...e,fallback:t}:e}function lt(e){return T.find(t=>t.value===e)??T[0]}function ut(e){return T.find(t=>t.id===e)??T[0]}function dt(e){return e===`ORG_UNIT`||e===`ORG_UNIT_POSITION`||e===`NONE`?e:`ALL`}function F(e){let t=e?.trim();if(!t)return{mode:`ALL`,value:``};let n=I(t,/"([^"]+)" in subject\.orgUnitIds/gu),r=I(t,/"([^"]+)" in subject\.positionIds/gu);return n.length>0&&r.length>0?{includeDescendants:n.length>1,mode:`ORG_UNIT_POSITION`,orgUnitId:n[0],positionId:r[0],value:n[0]??``}:n.length>0?{includeDescendants:n.length>1,mode:`ORG_UNIT`,orgUnitId:n[0],value:n[0]??``}:{mode:`CUSTOM`,value:t}}function ft(e,t){let n=F(e);return!t||t===`ALL`||t===`NONE`?t===`ALL`||t===`NONE`?{mode:t,value:``}:n:n.mode===t?n:ht(t)}function pt(e){return e.mode===`NONE`?`發起權限需要選擇誰可以發起。`:(e.mode===`ORG_UNIT`||e.mode===`ORG_UNIT_POSITION`)&&!e.orgUnitId?.trim()?`指定組織發起時,需要選擇組織。`:e.mode===`ORG_UNIT_POSITION`&&!e.positionId?.trim()?`指定組織職位發起時,需要選擇職位。`:null}function I(e,t){return[...e.matchAll(t)].map(e=>e[1]).filter(e=>!!e)}function mt(e,t){if(e.mode===`ALL`||e.mode===`NONE`)return null;let n=e.orgUnitId?.trim()??``;if(!n)return null;let r=U(t,n,!!e.includeDescendants).map(e=>`${JSON.stringify(e)} in subject.orgUnitIds`).join(` || `);if(e.mode===`ORG_UNIT`)return r?`(${r})`:null;let i=e.positionId?.trim()??``;return i&&r?`(${r}) && ${JSON.stringify(i)} in subject.positionIds`:null}function L(e,t,n){return e.mode===`NONE`?`未設定`:e.mode===`ORG_UNIT`?e.orgUnitId?`組織:${V(t,e.orgUnitId)}`:`指定組織`:e.mode===`ORG_UNIT_POSITION`?e.orgUnitId&&e.positionId?`組織職位:${V(t,e.orgUnitId)} / ${H(n,e.positionId)}`:`指定組織職位`:e.mode===`CUSTOM`?`既有自訂規則`:`所有人`}function ht(e){return{includeDescendants:!0,mode:e,orgUnitId:``,positionId:``,value:``}}function gt(e,t){let n=e.source?t.find(t=>t.id===e.source)??null:null,r=e.target?t.find(t=>t.id===e.target)??null:null;return!!n&&!!r&&e.source!==e.target&&e.sourceHandle===w&&e.targetHandle===C&&!!(n&&z(n))&&!!(r&&R(r))}function _t(e,t){return e.includes(t)?e.filter(e=>e!==t):[...e,t]}function vt(e){return e.type!==`startEvent`&&e.type!==`endEvent`}function R(e){return e.type!==`startEvent`}function z(e){return e.type!==`endEvent`&&!yt(e)}function yt(e){return e.type===`serviceTask`&&e.data.action.type===`NOTIFY`}function bt(e){return e instanceof HTMLElement?e.isContentEditable||e.tagName===`INPUT`||e.tagName===`TEXTAREA`||e.tagName===`SELECT`||!!e.closest(`[contenteditable="true"]`):!1}function xt(e){return e.map(e=>({id:e.id,name:`${e.formName} | v${e.version}`,schema:e.schema}))}function St(e){return(e?.schema.fields??[]).reduce((e,t)=>({...e,[t.fieldKey]:Ct(t)}),{})}function Ct(e){return e.type===`number`?1e3:e.type===`boolean`?!0:e.type===`select`?e.options[0]?.value??``:e.type===`checkbox`?e.options[0]?[e.options[0].value]:[]:e.type===`date`?`2026-05-08`:e.type===`datetime`?`2026-05-08T09:00:00+08:00`:e.placeholder??e.label}function wt(e){let t=JSON.parse(e);if(!Tt(t))throw Error(`表單資料 JSON 必須是物件。`);return t}function Tt(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Et(e){return e===`COMPLETED`?`完成`:e===`PASSED`?`通過`:e===`SKIPPED`?`略過`:e===`STOPPED`?`已停止`:e===`WAITING`?`將等待簽核`:e}function Dt(e){return e in we?we[e]:e}function Ot(e,t){return t&&!e.some(e=>e.id===t.id)?[t,...e]:e}function kt(e){return e.map(e=>({displayName:e.name,email:e.email,id:e.memberId,memberId:e.memberId,name:Kt(e.name,e.email)}))}function At(e){return{displayName:`未知會員`,email:``,id:e,memberId:e,name:`未知會員`}}function B(e,t){return e.find(e=>e.memberId===t)??At(t)}function jt(e,t){let n=e[0];return n?B(t,n):null}function Mt(e,t){let r=e.find(e=>e.id===t);return r?n.a(r):null}function Nt(e,t){let r=e.find(e=>e.id===t);return r?n.o(r):null}function V(e,t){return Mt(e,t)?.name??`未指定組織`}function H(e,t){return Nt(e,t)?.name??`未指定職位`}function Pt(e,t){let n=Ft(),r=t.filter(t=>t.memberId===e&&It(t,n)),i=r.reduce((e,t)=>e&&Lt(e,t)<=0?e:t,null);return{customFields:{},managerMemberId:`member-002`,memberId:e,orgCode:`HQ`,orgUnitIds:Rt(r.map(e=>e.orgUnitId)),positionId:i?.positionId??null,positionIds:Rt(r.map(e=>e.positionId)),primaryOrgUnitId:i?.orgUnitId??null,roles:[`manager`]}}function Ft(){return new Date().toISOString().slice(0,10)}function It(e,t){return e.effectiveFrom<=t&&(!e.effectiveTo||e.effectiveTo>=t)}function Lt(e,t){return e.isPrimary===t.isPrimary?t.effectiveFrom.localeCompare(e.effectiveFrom):e.isPrimary?-1:1}function Rt(e){return e.reduce((e,t)=>t&&!e.includes(t)?[...e,t]:e,[])}function zt({includeDescendants:e,memberships:t,orgUnitId:n,orgUnits:r,positions:i}){let a=new Set(U(r,n,e)),o=new Set(t.filter(e=>a.has(e.orgUnitId)).map(e=>e.positionId).filter(e=>!!e));return i.filter(e=>o.has(e.id))}function U(e,t,n){let r=e.find(e=>e.id===t);return r?n?e.filter(e=>e.id===r.id||e.path.startsWith(`${r.path}.`)).map(e=>e.id):[r.id]:t.trim()?[t]:[]}function Bt(e,t){let n=new Set(e.map(e=>e.memberId)),r=t.filter(e=>!n.has(e.memberId));return[...e,...r]}function Vt(e){return[...new Set(e.nodes.flatMap(e=>e.type===`userTask`?e.data.approverResolver.type===`DIRECT`?e.data.approverResolver.memberIds:[]:e.type===`serviceTask`?hn(e.data.action):[]))]}function Ht(e,t,n,r){return e.type===`userTask`?Ut(e.data.approverResolver,t,n,r):null}function Ut(e,t,n,r){return e.type===`DIRECT`?Gt(e.memberIds,t,`未指定簽核者`):e.type===`ORG_MANAGER`?lt(e.levelsUp).name:e.type===`ORG_UNIT_MANAGER`?`組織主管:${V(n,e.orgUnitId)}`:e.type===`ORG_UNIT_MEMBER`?`組織任一人:${V(n,e.orgUnitId)}`:e.type===`ORG_UNIT_POSITION`?`組織職位:${V(n,e.orgUnitId)} / ${H(r,e.positionId)}`:e.type===`POSITION`?`職位:${H(r,e.positionId)}`:e.type===`DYNAMIC_FORM`?`表單欄位:${e.formPath||`未設定`}`:`自訂表達式`}function Wt(e,t){if(e.type!==`serviceTask`)return null;let n=hn(e.data.action);return n.length===0?[`未指定知會對象`]:n.map(e=>B(t,e).name)}function Gt(e,t,n){let r=e.map(e=>B(t,e).name);return r.length===0?n:r.length<=2?r.join(`、`):`${r.slice(0,2).join(`、`)} 等 ${r.length} 人`}function Kt(e,t){return`${e} (${t})`}function qt(e,t){let n=t?.getBoundingClientRect();if(!n||e.nodes.length===0)return null;let r=e.nodes.reduce((e,t)=>{let n=A(t);return{maxX:Math.max(e.maxX,t.position.x+n.width),maxY:Math.max(e.maxY,t.position.y+n.height),minX:Math.min(e.minX,t.position.x),minY:Math.min(e.minY,t.position.y)}},{maxX:-1/0,maxY:-1/0,minX:1/0,minY:1/0});return(0,u.getViewportForBounds)({height:r.maxY-r.minY,width:r.maxX-r.minX,x:r.minX,y:r.minY},n.width,n.height,.1,1,.2)}function Jt(e){let t=e.nodes.find(e=>e.type===`userTask`&&!!W(e.data.approverResolver)),n=e.nodes.find(e=>e.type===`serviceTask`&&e.data.action.type===`NOTIFY`&&hn(e.data.action).length===0),r=e.edges.find(t=>K(t,e.nodes)&&!t.data.isDefault&&!t.data.condition);return t&&t.type===`userTask`?W(t.data.approverResolver):n?`知會節點需要至少一位知會對象。`:r?`條件分流的每條輸出連線都需要先設定條件。`:null}function W(e){return e.type===`DIRECT`&&e.memberIds.length===0?`簽核節點需要指定簽核會員。`:e.type===`ORG_MANAGER`&&e.levelsUp<1?`簽核節點需要指定有效的主管層級。`:e.type===`ORG_UNIT_MANAGER`&&!e.orgUnitId.trim()||e.type===`ORG_UNIT_MEMBER`&&!e.orgUnitId.trim()?`簽核節點需要指定組織。`:e.type===`ORG_UNIT_POSITION`&&(!e.orgUnitId.trim()||!e.positionId.trim())?`簽核節點需要指定組織與職位。`:(e.type===`ORG_MANAGER`||e.type===`ORG_UNIT_MANAGER`)&&e.fallback?.type===`DIRECT`&&!e.fallback.memberId.trim()?`簽核節點需要指定改派固定人。`:e.type===`POSITION`&&!e.positionId.trim()?`簽核節點需要指定職位。`:null}function Yt(e){return e.edges.some(t=>K(t,e.nodes)&&!!(t.data.condition||t.data.conditionFieldKey||t.data.conditionOperator||t.data.conditionValue))}function Xt(e){return e?.fields.map(e=>({fieldType:e.type,id:e.fieldKey,name:`${e.label} (${e.fieldKey})`}))??[]}function Zt(e,t){return t?e?.fields.find(e=>e.fieldKey===t)??null:null}function Qt(e){if(!e)return[];let t=en(e);return E.filter(e=>t.includes(e.id))}function $t(e){return E.some(t=>t.id===e)?e:null}function en(e){return e.type===`file_upload`?[`IS_FILLED`,`IS_EMPTY`]:e.type===`boolean`?[`EQUALS`,`NOT_EQUALS`,`IS_FILLED`,`IS_EMPTY`]:e.type===`date`||e.type===`datetime`||e.type===`money`||e.type===`number`?[`EQUALS`,`NOT_EQUALS`,`GREATER_THAN`,`GREATER_THAN_OR_EQUALS`,`LESS_THAN`,`LESS_THAN_OR_EQUALS`,`IS_FILLED`,`IS_EMPTY`]:[`EQUALS`,`NOT_EQUALS`,`IS_FILLED`,`IS_EMPTY`]}function tn(e){return e?e.type===`boolean`?[{id:`true`,name:`是`},{id:`false`,name:`否`}]:e.type===`checkbox`||e.type===`radio`||e.type===`select`?e.options.map(e=>({id:e.value,name:e.label})):[]:[]}function nn(e,t){if(!e)return;let n=en(e);return t&&n.includes(t)?t:n[0]}function rn(e,t,n){if(!e||!t||!an(t))return;let r=tn(e);return r.length===0||r.some(e=>e.id===n)?n??void 0:r[0]?.id}function an(e){return je.includes(e)}function on(e,t,n){if(!e||!t)return;let r=G(t);if(!an(t))return`${e.label} ${r}`;if(n)return`${e.label} ${r} ${sn(e,n)}`}function G(e){return E.find(t=>t.id===e)?.name??e}function sn(e,t){return e.type===`boolean`?t===`true`?`是`:`否`:e.type===`checkbox`||e.type===`radio`||e.type===`select`?cn(e.options,t)?.label??t:t}function cn(e,t){return e.find(e=>e.value===t)??null}function ln(e,t,n){if(!e||!t)return;let r=un(e.fieldKey);if(t===`IS_FILLED`)return`${r} != null && ${r} != ""`;if(t===`IS_EMPTY`)return`${r} == null || ${r} == ""`;if(n)return`${r} ${dn(t)} ${fn(e,n)}`}function un(e){return/^[A-Za-z_][A-Za-z0-9_]*$/u.test(e)?`form.${e}`:`form[${JSON.stringify(e)}]`}function dn(e){return e===`EQUALS`?`==`:e===`NOT_EQUALS`?`!=`:e===`GREATER_THAN`?`>`:e===`GREATER_THAN_OR_EQUALS`?`>=`:e===`LESS_THAN`?`<`:`<=`}function fn(e,t){return e.type===`boolean`?t===`true`?`true`:`false`:(e.type===`money`||e.type===`number`)&&Number.isFinite(Number(t))?t:JSON.stringify(t)}function pn(e,t){if(e.data.label)return e.data.label;if(K(e,t))return mn(e);if(q(e,t))return`同時進行`}function mn(e){return e.data.isDefault?`其他情況`:`請設定條件`}function K(e,t){return t.some(t=>t.id===e.source&&t.type===`exclusiveGateway`)}function q(e,t){return t.some(t=>t.id===e.source&&t.type===`parallelGateway`)}function hn(e){return e.type===`NOTIFY`&&e.recipients.type===`DIRECT`?e.recipients.memberIds:[]}function J(e){return e instanceof Error?e.message:`發生未知錯誤`}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return D}});
51
- //# sourceMappingURL=TemplateDesignerView-A38DyYD4.cjs.map