@rytass/bpm-core-react 0.18.0 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/chunks/FormBuilderView-CHaAQL5v.cjs +3 -0
  3. package/dist/chunks/FormBuilderView-CHaAQL5v.cjs.map +1 -0
  4. package/dist/chunks/{FormBuilderView-BVKY1j_0.js → FormBuilderView-vQfVc08Z.js} +485 -481
  5. package/dist/chunks/FormBuilderView-vQfVc08Z.js.map +1 -0
  6. package/dist/chunks/{FormRendererView-BsTwZkqU.js → FormRendererView-CTLlG13b.js} +300 -189
  7. package/dist/chunks/FormRendererView-CTLlG13b.js.map +1 -0
  8. package/dist/chunks/FormRendererView-ChmM_4Yc.cjs +4 -0
  9. package/dist/chunks/FormRendererView-ChmM_4Yc.cjs.map +1 -0
  10. package/dist/chunks/admin-pickers-BjbkBpSJ.cjs +2 -0
  11. package/dist/chunks/admin-pickers-BjbkBpSJ.cjs.map +1 -0
  12. package/dist/chunks/{admin-pickers-Djq3h-UR.js → admin-pickers-DfGxsjpp.js} +42 -42
  13. package/dist/chunks/admin-pickers-DfGxsjpp.js.map +1 -0
  14. package/dist/chunks/{approval-instance-list-page-CPXMP3PL.js → approval-instance-list-page-BnI4t5mD.js} +7 -8
  15. package/dist/chunks/{approval-instance-list-page-CPXMP3PL.js.map → approval-instance-list-page-BnI4t5mD.js.map} +1 -1
  16. package/dist/chunks/{approval-instance-list-page-ax0pm8bt.cjs → approval-instance-list-page-fqvmkBlg.cjs} +2 -2
  17. package/dist/chunks/{approval-instance-list-page-ax0pm8bt.cjs.map → approval-instance-list-page-fqvmkBlg.cjs.map} +1 -1
  18. package/dist/chunks/{approver-filled-form-Dm3Iw7iw.cjs → approver-filled-form-B4zPg9kz.cjs} +2 -2
  19. package/dist/chunks/approver-filled-form-B4zPg9kz.cjs.map +1 -0
  20. package/dist/chunks/{approver-filled-form-ZEwpmsHJ.js → approver-filled-form-Bgazhbvd.js} +40 -36
  21. package/dist/chunks/approver-filled-form-Bgazhbvd.js.map +1 -0
  22. package/dist/chunks/auth-provider-4BeCw7cI.cjs.map +1 -1
  23. package/dist/chunks/{auth-provider-B5oPmvk2.js → auth-provider-C2b-5mGt.js} +2 -3
  24. package/dist/chunks/{auth-provider-B5oPmvk2.js.map → auth-provider-C2b-5mGt.js.map} +1 -1
  25. package/dist/chunks/{bpm-form-field-Cao0rMol.js → bpm-form-field-9B-Det0u.js} +2 -3
  26. package/dist/chunks/{bpm-form-field-Cao0rMol.js.map → bpm-form-field-9B-Det0u.js.map} +1 -1
  27. package/dist/chunks/bpm-form-field-Bc6k4ZEO.cjs.map +1 -1
  28. package/dist/chunks/{categories-riC33J_j.js → categories-BAdxjNSA.js} +14 -15
  29. package/dist/chunks/{categories-riC33J_j.js.map → categories-BAdxjNSA.js.map} +1 -1
  30. package/dist/chunks/{categories-AxxhqjLZ.cjs → categories-DQUtVEiV.cjs} +2 -2
  31. package/dist/chunks/{categories-AxxhqjLZ.cjs.map → categories-DQUtVEiV.cjs.map} +1 -1
  32. package/dist/chunks/{compose-B1GlrZW9.js → compose-D9ipJpF_.js} +131 -148
  33. package/dist/chunks/compose-D9ipJpF_.js.map +1 -0
  34. package/dist/chunks/compose-DtfX8DQ9.cjs +2 -0
  35. package/dist/chunks/compose-DtfX8DQ9.cjs.map +1 -0
  36. package/dist/chunks/{dashboard-page-DdBvV6YI.js → dashboard-page-BoqNhjT_.js} +5 -6
  37. package/dist/chunks/{dashboard-page-DdBvV6YI.js.map → dashboard-page-BoqNhjT_.js.map} +1 -1
  38. package/dist/chunks/{dashboard-page-BWQBSGDq.cjs → dashboard-page-D7YJ3udk.cjs} +2 -2
  39. package/dist/chunks/{dashboard-page-BWQBSGDq.cjs.map → dashboard-page-D7YJ3udk.cjs.map} +1 -1
  40. package/dist/chunks/{delegations-MxF3uJGW.js → delegations-BfhCDz5e.js} +15 -16
  41. package/dist/chunks/{delegations-MxF3uJGW.js.map → delegations-BfhCDz5e.js.map} +1 -1
  42. package/dist/chunks/{delegations-Ckf03icM.cjs → delegations-BmFGcuhA.cjs} +2 -2
  43. package/dist/chunks/{delegations-Ckf03icM.cjs.map → delegations-BmFGcuhA.cjs.map} +1 -1
  44. package/dist/chunks/{delegations-V9HIe3_P.cjs → delegations-CcS0SHbf.cjs} +2 -2
  45. package/dist/chunks/{delegations-V9HIe3_P.cjs.map → delegations-CcS0SHbf.cjs.map} +1 -1
  46. package/dist/chunks/{delegations-xUt1tj8d.js → delegations-DBh5TT6G.js} +16 -17
  47. package/dist/chunks/{delegations-xUt1tj8d.js.map → delegations-DBh5TT6G.js.map} +1 -1
  48. package/dist/chunks/designer-Df79YzUn.cjs +65 -0
  49. package/dist/chunks/designer-Df79YzUn.cjs.map +1 -0
  50. package/dist/chunks/{designer-BCLrjb4H.js → designer-ubnZbP-A.js} +1791 -1407
  51. package/dist/chunks/designer-ubnZbP-A.js.map +1 -0
  52. package/dist/chunks/detail-BBC9kqXd.cjs +5 -0
  53. package/dist/chunks/detail-BBC9kqXd.cjs.map +1 -0
  54. package/dist/chunks/{detail-4F39ggBn.js → detail-C6XKZjlF.js} +1033 -1005
  55. package/dist/chunks/detail-C6XKZjlF.js.map +1 -0
  56. package/dist/chunks/{format-date-time-CB-LxzqT.js → format-date-time-B0LdmWg4.js} +2 -3
  57. package/dist/chunks/{format-date-time-CB-LxzqT.js.map → format-date-time-B0LdmWg4.js.map} +1 -1
  58. package/dist/chunks/format-date-time-D-cx5M8z.cjs.map +1 -1
  59. package/dist/chunks/{format-member-label-DudVI55w.js → format-member-label-C73FuP-d.js} +2 -3
  60. package/dist/chunks/{format-member-label-DudVI55w.js.map → format-member-label-C73FuP-d.js.map} +1 -1
  61. package/dist/chunks/format-member-label-t7ANTF62.cjs.map +1 -1
  62. package/dist/chunks/language-provider-Bdnx3Gxl.cjs.map +1 -1
  63. package/dist/chunks/{language-provider-B3cEbLe4.js → language-provider-phkWOapf.js} +2 -3
  64. package/dist/chunks/{language-provider-B3cEbLe4.js.map → language-provider-phkWOapf.js.map} +1 -1
  65. package/dist/chunks/{login-C6qlTC6F.js → login-D6cc3bo7.js} +4 -5
  66. package/dist/chunks/{login-C6qlTC6F.js.map → login-D6cc3bo7.js.map} +1 -1
  67. package/dist/chunks/{login-AtVxZBsC.cjs → login-uvVcltrS.cjs} +2 -2
  68. package/dist/chunks/{login-AtVxZBsC.cjs.map → login-uvVcltrS.cjs.map} +1 -1
  69. package/dist/chunks/notifications-Bc4mgSds.cjs.map +1 -1
  70. package/dist/chunks/{notifications-DJ5wzCye.js → notifications-Cvme5Qbl.js} +2 -3
  71. package/dist/chunks/{notifications-DJ5wzCye.js.map → notifications-Cvme5Qbl.js.map} +1 -1
  72. package/dist/chunks/orgs-B_2J2tLX.cjs +2 -0
  73. package/dist/chunks/{orgs-BeeDDWL1.cjs.map → orgs-B_2J2tLX.cjs.map} +1 -1
  74. package/dist/chunks/{orgs-8hje_l2n.js → orgs-DqxMds26.js} +48 -49
  75. package/dist/chunks/{orgs-8hje_l2n.js.map → orgs-DqxMds26.js.map} +1 -1
  76. package/dist/chunks/{providers-B_d5tbCL.js → providers-BbCs23sk.js} +21 -25
  77. package/dist/chunks/{providers-B_d5tbCL.js.map → providers-BbCs23sk.js.map} +1 -1
  78. package/dist/chunks/{providers-chuJvMgv.cjs → providers-D_KAgOOu.cjs} +2 -2
  79. package/dist/chunks/{providers-chuJvMgv.cjs.map → providers-D_KAgOOu.cjs.map} +1 -1
  80. package/dist/chunks/router-adapter--gYs13E8.cjs.map +1 -1
  81. package/dist/chunks/{router-adapter-DftlFTOd.js → router-adapter-CkxCyzf5.js} +2 -3
  82. package/dist/chunks/{router-adapter-DftlFTOd.js.map → router-adapter-CkxCyzf5.js.map} +1 -1
  83. package/dist/chunks/{routes-config-yZbESPlw.js → routes-config-BcNaWJWJ.js} +2 -3
  84. package/dist/chunks/{routes-config-yZbESPlw.js.map → routes-config-BcNaWJWJ.js.map} +1 -1
  85. package/dist/chunks/routes-config-C1j_vFKo.cjs.map +1 -1
  86. package/dist/chunks/task-decision-3d17ZvZE.js +29 -0
  87. package/dist/chunks/task-decision-3d17ZvZE.js.map +1 -0
  88. package/dist/chunks/task-decision-CqZ4WQOC.cjs +2 -0
  89. package/dist/chunks/task-decision-CqZ4WQOC.cjs.map +1 -0
  90. package/dist/chunks/{use-bpm-member-D57LKe_u.js → use-bpm-member-BPzcNU1g.js} +3 -4
  91. package/dist/chunks/{use-bpm-member-D57LKe_u.js.map → use-bpm-member-BPzcNU1g.js.map} +1 -1
  92. package/dist/chunks/use-bpm-member-DpNAQtNC.cjs.map +1 -1
  93. package/dist/chunks/{users-Pl6hY5Y5.js → users-BBtiZ9QQ.js} +22 -25
  94. package/dist/chunks/{users-Pl6hY5Y5.js.map → users-BBtiZ9QQ.js.map} +1 -1
  95. package/dist/chunks/{users-O2L_M3BK.cjs → users-EqSzDhuj.cjs} +2 -2
  96. package/dist/chunks/{users-O2L_M3BK.cjs.map → users-EqSzDhuj.cjs.map} +1 -1
  97. package/dist/components/admin-picker-options.d.cts +11 -0
  98. package/dist/components/admin-picker-options.d.ts +11 -0
  99. package/dist/components/admin-pickers.d.cts +2 -11
  100. package/dist/components/admin-pickers.d.ts +2 -11
  101. package/dist/index.cjs +1 -1
  102. package/dist/index.cjs.map +1 -1
  103. package/dist/index.js +17 -19
  104. package/dist/index.js.map +1 -1
  105. package/dist/lib/task-decision.d.cts +16 -0
  106. package/dist/lib/task-decision.d.ts +16 -0
  107. package/dist/lib/use-org-unit-names.d.cts +10 -0
  108. package/dist/lib/use-org-unit-names.d.ts +10 -0
  109. package/dist/next/index.cjs +1 -1
  110. package/dist/next/index.cjs.map +1 -1
  111. package/dist/next/index.js +7 -8
  112. package/dist/next/index.js.map +1 -1
  113. package/dist/next/workflow-chat-route.cjs +19 -1
  114. package/dist/next/workflow-chat-route.cjs.map +1 -1
  115. package/dist/next/workflow-chat-route.js +2 -3
  116. package/dist/next/workflow-chat-route.js.map +1 -1
  117. package/dist/pages/admin/delegations/index.cjs +1 -1
  118. package/dist/pages/admin/delegations/index.cjs.map +1 -1
  119. package/dist/pages/admin/delegations/index.js +2 -3
  120. package/dist/pages/admin/orgs/index.cjs +1 -1
  121. package/dist/pages/admin/orgs/index.cjs.map +1 -1
  122. package/dist/pages/admin/orgs/index.js +2 -3
  123. package/dist/pages/admin/users/index.cjs +1 -1
  124. package/dist/pages/admin/users/index.cjs.map +1 -1
  125. package/dist/pages/admin/users/index.js +2 -3
  126. package/dist/pages/admin/webhook-endpoints/index.cjs.map +1 -1
  127. package/dist/pages/admin/webhook-endpoints/index.js +1 -2
  128. package/dist/pages/cc/index.cjs.map +1 -1
  129. package/dist/pages/cc/index.js +1 -2
  130. package/dist/pages/dashboard/index.cjs.map +1 -1
  131. package/dist/pages/dashboard/index.js +1 -2
  132. package/dist/pages/delegations/index.cjs +1 -1
  133. package/dist/pages/delegations/index.cjs.map +1 -1
  134. package/dist/pages/delegations/index.js +2 -3
  135. package/dist/pages/inbox/index.cjs.map +1 -1
  136. package/dist/pages/inbox/index.js +1 -2
  137. package/dist/pages/instances/detail/index.cjs +1 -1
  138. package/dist/pages/instances/detail/index.cjs.map +1 -1
  139. package/dist/pages/instances/detail/index.js +2 -3
  140. package/dist/pages/instances/new/index.cjs.map +1 -1
  141. package/dist/pages/instances/new/index.js +1 -2
  142. package/dist/pages/login/index.cjs +1 -1
  143. package/dist/pages/login/index.cjs.map +1 -1
  144. package/dist/pages/login/index.js +2 -3
  145. package/dist/pages/root/index.cjs.map +1 -1
  146. package/dist/pages/root/index.js +1 -2
  147. package/dist/pages/search/index.cjs.map +1 -1
  148. package/dist/pages/search/index.js +1 -2
  149. package/dist/pages/sent/index.cjs.map +1 -1
  150. package/dist/pages/sent/index.js +1 -2
  151. package/dist/pages/settings/notifications/index.cjs.map +1 -1
  152. package/dist/pages/settings/notifications/index.js +2 -3
  153. package/dist/pages/templates/categories/index.cjs +1 -1
  154. package/dist/pages/templates/categories/index.cjs.map +1 -1
  155. package/dist/pages/templates/categories/index.js +2 -3
  156. package/dist/pages/templates/compose/index.cjs +1 -1
  157. package/dist/pages/templates/compose/index.cjs.map +1 -1
  158. package/dist/pages/templates/compose/index.js +2 -3
  159. package/dist/pages/templates/designer/index.cjs +1 -1
  160. package/dist/pages/templates/designer/index.cjs.map +1 -1
  161. package/dist/pages/templates/designer/index.js +2 -3
  162. package/dist/pages/templates/index.cjs.map +1 -1
  163. package/dist/pages/templates/index.js +1 -2
  164. package/dist/pages/templates/versions/index.cjs.map +1 -1
  165. package/dist/pages/templates/versions/index.js +1 -2
  166. package/dist/views/admin/delegations/index.cjs +1 -1
  167. package/dist/views/admin/delegations/index.js +1 -1
  168. package/dist/views/admin/index.cjs +1 -1
  169. package/dist/views/admin/index.js +3 -3
  170. package/dist/views/admin/orgs/index.cjs +1 -1
  171. package/dist/views/admin/orgs/index.js +1 -1
  172. package/dist/views/admin/users/index.cjs +1 -1
  173. package/dist/views/admin/users/index.js +1 -1
  174. package/dist/views/admin/webhook-endpoints/index.cjs +1 -1
  175. package/dist/views/admin/webhook-endpoints/index.cjs.map +1 -1
  176. package/dist/views/admin/webhook-endpoints/index.js +52 -53
  177. package/dist/views/admin/webhook-endpoints/index.js.map +1 -1
  178. package/dist/views/cc/index.cjs +1 -1
  179. package/dist/views/cc/index.cjs.map +1 -1
  180. package/dist/views/cc/index.js +2 -3
  181. package/dist/views/dashboard/index.cjs +1 -1
  182. package/dist/views/dashboard/index.cjs.map +1 -1
  183. package/dist/views/dashboard/index.js +2 -3
  184. package/dist/views/delegations/index.cjs +1 -1
  185. package/dist/views/delegations/index.js +1 -1
  186. package/dist/views/forms/builder/index.cjs +1 -1
  187. package/dist/views/forms/builder/index.js +1 -1
  188. package/dist/views/forms/renderer/index.cjs +1 -1
  189. package/dist/views/forms/renderer/index.js +1 -1
  190. package/dist/views/forms/renderer/org-unit-field-options.d.cts +44 -0
  191. package/dist/views/forms/renderer/org-unit-field-options.d.ts +44 -0
  192. package/dist/views/forms/renderer/org-unit-field.d.cts +23 -0
  193. package/dist/views/forms/renderer/org-unit-field.d.ts +23 -0
  194. package/dist/views/inbox/index.cjs +1 -1
  195. package/dist/views/inbox/index.cjs.map +1 -1
  196. package/dist/views/inbox/index.js +133 -137
  197. package/dist/views/inbox/index.js.map +1 -1
  198. package/dist/views/instances/approver-filled-form.d.cts +9 -2
  199. package/dist/views/instances/approver-filled-form.d.ts +9 -2
  200. package/dist/views/instances/detail/index.cjs +1 -1
  201. package/dist/views/instances/detail/index.js +1 -1
  202. package/dist/views/instances/detail/sections/InstanceHistorySection.d.cts +8 -1
  203. package/dist/views/instances/detail/sections/InstanceHistorySection.d.ts +8 -1
  204. package/dist/views/instances/detail/sections/container-helpers.d.cts +0 -1
  205. package/dist/views/instances/detail/sections/container-helpers.d.ts +0 -1
  206. package/dist/views/instances/detail/sections/shared.d.cts +2 -2
  207. package/dist/views/instances/detail/sections/shared.d.ts +2 -2
  208. package/dist/views/instances/new/index.cjs +1 -1
  209. package/dist/views/instances/new/index.cjs.map +1 -1
  210. package/dist/views/instances/new/index.js +14 -15
  211. package/dist/views/instances/new/index.js.map +1 -1
  212. package/dist/views/login/index.cjs +1 -1
  213. package/dist/views/login/index.js +1 -1
  214. package/dist/views/search/index.cjs +1 -1
  215. package/dist/views/search/index.cjs.map +1 -1
  216. package/dist/views/search/index.js +2 -3
  217. package/dist/views/sent/index.cjs +1 -1
  218. package/dist/views/sent/index.cjs.map +1 -1
  219. package/dist/views/sent/index.js +2 -3
  220. package/dist/views/settings/index.js +1 -1
  221. package/dist/views/settings/notifications/index.js +1 -1
  222. package/dist/views/templates/categories/index.cjs +1 -1
  223. package/dist/views/templates/categories/index.js +1 -1
  224. package/dist/views/templates/compose/index.cjs +1 -1
  225. package/dist/views/templates/compose/index.js +1 -1
  226. package/dist/views/templates/designer/approver-resolver-model.d.cts +211 -0
  227. package/dist/views/templates/designer/approver-resolver-model.d.ts +211 -0
  228. package/dist/views/templates/designer/dry-run-assignee-label.d.cts +2 -0
  229. package/dist/views/templates/designer/dry-run-assignee-label.d.ts +2 -0
  230. package/dist/views/templates/designer/dry-run-sample-data.d.cts +6 -0
  231. package/dist/views/templates/designer/dry-run-sample-data.d.ts +6 -0
  232. package/dist/views/templates/designer/dynamic-form-resolver-options.d.cts +25 -0
  233. package/dist/views/templates/designer/dynamic-form-resolver-options.d.ts +25 -0
  234. package/dist/views/templates/designer/index.cjs +1 -1
  235. package/dist/views/templates/designer/index.js +1 -1
  236. package/dist/views/templates/designer/node-actor-resolver-options.d.cts +38 -0
  237. package/dist/views/templates/designer/node-actor-resolver-options.d.ts +38 -0
  238. package/dist/views/templates/index.cjs +1 -1
  239. package/dist/views/templates/index.cjs.map +1 -1
  240. package/dist/views/templates/index.js +50 -51
  241. package/dist/views/templates/index.js.map +1 -1
  242. package/dist/views/templates/versions/index.cjs +1 -1
  243. package/dist/views/templates/versions/index.cjs.map +1 -1
  244. package/dist/views/templates/versions/index.js +7 -8
  245. package/dist/views/templates/versions/index.js.map +1 -1
  246. package/package.json +3 -3
  247. package/dist/chunks/FormBuilderView-BVKY1j_0.js.map +0 -1
  248. package/dist/chunks/FormBuilderView-SrGltzFT.cjs +0 -3
  249. package/dist/chunks/FormBuilderView-SrGltzFT.cjs.map +0 -1
  250. package/dist/chunks/FormRendererView-BsTwZkqU.js.map +0 -1
  251. package/dist/chunks/FormRendererView-GpsE03np.cjs +0 -4
  252. package/dist/chunks/FormRendererView-GpsE03np.cjs.map +0 -1
  253. package/dist/chunks/admin-pickers-BRHk3qKq.cjs +0 -2
  254. package/dist/chunks/admin-pickers-BRHk3qKq.cjs.map +0 -1
  255. package/dist/chunks/admin-pickers-Djq3h-UR.js.map +0 -1
  256. package/dist/chunks/approver-filled-form-Dm3Iw7iw.cjs.map +0 -1
  257. package/dist/chunks/approver-filled-form-ZEwpmsHJ.js.map +0 -1
  258. package/dist/chunks/compose-B1GlrZW9.js.map +0 -1
  259. package/dist/chunks/compose-DZk-SfHT.cjs +0 -2
  260. package/dist/chunks/compose-DZk-SfHT.cjs.map +0 -1
  261. package/dist/chunks/designer-BCLrjb4H.js.map +0 -1
  262. package/dist/chunks/designer-BYYxEN9L.cjs +0 -65
  263. package/dist/chunks/designer-BYYxEN9L.cjs.map +0 -1
  264. package/dist/chunks/detail-4F39ggBn.js.map +0 -1
  265. package/dist/chunks/detail-BkMtA_0K.cjs +0 -2
  266. package/dist/chunks/detail-BkMtA_0K.cjs.map +0 -1
  267. package/dist/chunks/orgs-BeeDDWL1.cjs +0 -2
  268. package/dist/chunks/task-node-label-BF6UllxP.cjs +0 -2
  269. package/dist/chunks/task-node-label-BF6UllxP.cjs.map +0 -1
  270. package/dist/chunks/task-node-label-CWZgOBj0.js +0 -9
  271. package/dist/chunks/task-node-label-CWZgOBj0.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"delegations-V9HIe3_P.cjs","names":["FormFieldLayout","useAuth","useState","useCallback","listDelegationRulesPage","searchMembers","useMemo","Typography","formatDateTime","revokeDelegationRule","listApprovalTemplates","createDelegationRule","_Fragment","PageHeader","ContentHeader","Button","PlusIcon","SectionGroup","Section","FilterArea","styles","FilterLine","Filter","FormField","Select","Tab","TabItem","Table","Modal","BPMFormField","AutoComplete","Input","DateTimePicker","formatMemberLabel","Tooltip","Badge","require_rolldown_runtime","require_auth_provider","require_format_date_time","require_bpm_form_field","require_format_member_label","react","_mezzanine_ui_react","react_jsx_runtime","_rytass_bpm_core_client_workflow","_mezzanine_ui_core_form","_mezzanine_ui_react_ContentHeader","_mezzanine_ui_icons","_rytass_bpm_core_client_template","delegations_module_default","DELEGATION_MODAL_FIELD_LAYOUT","DELEGATION_PAGE_SIZE_OPTIONS","DELEGATION_STATUS_TABS","SCOPE_OPTIONS","SCOPE_FILTER_OPTIONS","AdminDelegationsView","currentMemberId","member","agentMember","setAgentMember","endAt","setEndAt","error","setError","loading","setLoading","memberLoading","setMemberLoading","memberOptions","setMemberOptions","principalFilterMember","setPrincipalFilterMember","agentFilterMember","setAgentFilterMember","modalOpen","setModalOpen","principalMember","setPrincipalMember","priority","setPriority","rulePage","setRulePage","rulePageSize","setRulePageSize","ruleStatus","setRuleStatus","ruleTotalCount","setRuleTotalCount","rules","setRules","saving","setSaving","scopeTemplates","setScopeTemplates","scopeFilterType","setScopeFilterType","scopeType","setScopeType","startAt","setStartAt","templateLoading","setTemplateLoading","templateOptions","setTemplateOptions","refreshRules","rulePageResult","members","readMemberOption","requestError","readErrorMessage","membersById","option","rows","rule","readScopeLabel","selectedScopeType","columns","MemberNameWithEmailTooltip","record","DelegationStatusBadge","handleRevoke","tableActions","handleSearchMembers","searchText","handleSearchTemplates","nextOptions","readTemplateOption","mergeTemplateOptions","selectedOptions","filterTemplateOptions","openCreateModal","closeCreateModal","handleCreate","isInvalidDelegationDateRange","template","MemberAutoCompleteField","readScopeFilterOption","readDelegationStatusTabKey","activeKey","statusTab","page","pageSize","from","to","total","readScopeOptionFromValue","selectedTemplates","readTemplateOptionsFromValue","nextTemplates","currentOptions","open","event","formatDelegationDateTimePickerValue","nextValue","readDelegationDateTimePickerValue","autoComplete","onChange","readMemberOptionFromValue","readUniqueMemberOption","options","onSearch","hideLabel","label","isRecord","value","id","name","email","displayName","tooltipProps","normalizedSearchText","matches","item","availableOptions","currentOption","isSelectableDelegationScopeType","status","date","parseDelegationDateTimeValue","formatDateParts","padDatePart","startDate","endDate","parsedDate","datePart","timePart","year","month","day","hour","minute"],"sources":["../../src/views/admin/delegations/delegations.module.scss","../../src/views/admin/delegations/AdminDelegationsView.tsx"],"sourcesContent":[".delegationModalFields {\n display: grid;\n gap: 12px;\n width: 100%;\n\n :global(.mzn-form-field--horizontal) {\n align-items: flex-start;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label-area) {\n flex: 0 0 112px;\n width: 112px;\n min-width: 112px;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label) {\n flex-wrap: nowrap;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__data-entry) {\n flex: 1 1 auto;\n align-items: stretch;\n min-width: 0;\n max-width: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-auto-complete) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-input),\n :global(.mzn-input-container),\n :global(.mzn-select),\n :global(.mzn-select-trigger),\n :global(.mzn-text-field) {\n width: 100%;\n min-width: 0 !important;\n }\n\n :global(.mzn-select-trigger__input) {\n width: 100%;\n min-width: 0 !important;\n text-overflow: ellipsis;\n }\n}\n\n.delegationFilterArea {\n width: calc(100vw - 272px);\n\n :global(.mzn-filter-area__actions) {\n display: none;\n }\n\n :global(.mzn-filter-area__row) {\n align-items: flex-start;\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 :global(.mzn-auto-complete) {\n width: 100%;\n }\n}\n\n.memberNameWithTooltip {\n cursor: help;\n text-decoration: underline dotted;\n text-underline-offset: 3px;\n}\n","'use client';\n\nimport {\n ChangeEvent,\n Key,\n ReactElement,\n RefCallback,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n AutoComplete,\n Badge,\n Button,\n DateTimePicker,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Select,\n Tab,\n TabItem,\n Table,\n Tooltip,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport { BPMFormField } from '../../../components/bpm-form-field';\nimport styles from './delegations.module.scss';\nimport { formatDateTime } from '../../../lib/format-date-time';\nimport { useAuth } from '../../../lib/auth-provider';\nimport {\n DelegationRuleRecord,\n DelegationRuleStatus,\n DelegationScopeType,\n MemberProfileRecord,\n createDelegationRule,\n listDelegationRulesPage,\n revokeDelegationRule,\n searchMembers,\n} from '@rytass/bpm-core-client/workflow';\nimport {\n ApprovalTemplateRecord,\n listApprovalTemplates,\n} from '@rytass/bpm-core-client/template';\nimport { formatMemberLabel } from '../../../lib/format-member-label';\n\ntype MemberOption = Readonly<{\n displayName: string;\n email: string | null;\n id: string;\n name: string;\n}>;\n\ntype TemplateOption = Readonly<{\n id: string;\n name: string;\n}>;\n\ntype ScopeOption = Readonly<{\n id: DelegationScopeType;\n name: string;\n}>;\n\ntype ScopeFilterOption = Readonly<{\n id: 'ALL_SCOPES' | DelegationScopeType;\n name: string;\n scopeType: DelegationScopeType | null;\n}>;\n\ntype DelegationRuleRow = Readonly<\n Record<string, unknown> &\n DelegationRuleRecord & {\n agentEmail: string | null;\n agentName: string;\n key: string;\n principalEmail: string | null;\n principalName: string;\n scopeLabel: string;\n }\n>;\n\nconst DELEGATION_MODAL_FIELD_LAYOUT = FormFieldLayout.HORIZONTAL;\nconst DELEGATION_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst DELEGATION_STATUS_TABS: readonly {\n readonly key: DelegationStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'ACTIVE', label: '啟用中' },\n { key: 'REVOKED', label: '已撤銷' },\n { key: 'EXPIRED', label: '已過期' },\n];\n\ntype DelegationStatusTabKey = 'ALL' | DelegationRuleStatus;\n\nconst SCOPE_OPTIONS: readonly ScopeOption[] = [\n { id: 'ALL', name: '全部簽核' },\n { id: 'TEMPLATE_LIST', name: '指定模板' },\n];\n\nconst SCOPE_FILTER_OPTIONS: readonly ScopeFilterOption[] = [\n { id: 'ALL_SCOPES', name: '全部範圍', scopeType: null },\n { id: 'ALL', name: '全部簽核', scopeType: 'ALL' },\n { id: 'TEMPLATE_LIST', name: '指定模板', scopeType: 'TEMPLATE_LIST' },\n];\n\n\nexport function AdminDelegationsView(): ReactElement {\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [agentMember, setAgentMember] = useState<MemberOption | null>(null);\n const [endAt, setEndAt] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [memberLoading, setMemberLoading] = useState(false);\n const [memberOptions, setMemberOptions] = useState<readonly MemberOption[]>(\n [],\n );\n const [principalFilterMember, setPrincipalFilterMember] =\n useState<MemberOption | null>(null);\n const [agentFilterMember, setAgentFilterMember] =\n useState<MemberOption | null>(null);\n const [modalOpen, setModalOpen] = useState(false);\n const [principalMember, setPrincipalMember] = useState<MemberOption | null>(\n null,\n );\n const [priority, setPriority] = useState('100');\n const [rulePage, setRulePage] = useState(1);\n const [rulePageSize, setRulePageSize] = useState(10);\n const [ruleStatus, setRuleStatus] = useState<DelegationStatusTabKey>('ALL');\n const [ruleTotalCount, setRuleTotalCount] = useState(0);\n const [rules, setRules] = useState<readonly DelegationRuleRecord[]>([]);\n const [saving, setSaving] = useState(false);\n const [scopeTemplates, setScopeTemplates] = useState<\n readonly TemplateOption[]\n >([]);\n const [scopeFilterType, setScopeFilterType] = useState<ScopeFilterOption>(\n SCOPE_FILTER_OPTIONS[0],\n );\n const [scopeType, setScopeType] = useState<ScopeOption>(SCOPE_OPTIONS[0]);\n const [startAt, setStartAt] = useState('');\n const [templateLoading, setTemplateLoading] = useState(false);\n const [templateOptions, setTemplateOptions] = useState<\n readonly TemplateOption[]\n >([]);\n\n const refreshRules = useCallback(async (): Promise<void> => {\n setLoading(true);\n setError(null);\n\n try {\n const [rulePageResult, members] = await Promise.all([\n listDelegationRulesPage({\n agentMemberId: agentFilterMember?.id ?? null,\n includeInactive: true,\n page: rulePage,\n pageSize: rulePageSize,\n principalMemberId: principalFilterMember?.id ?? null,\n scopeType: scopeFilterType.scopeType,\n status: ruleStatus === 'ALL' ? null : ruleStatus,\n }),\n searchMembers(''),\n ]);\n\n setRules(rulePageResult.rules);\n setRuleTotalCount(rulePageResult.totalCount);\n setMemberOptions(members.map(readMemberOption));\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, [\n agentFilterMember,\n principalFilterMember,\n rulePage,\n rulePageSize,\n ruleStatus,\n scopeFilterType,\n ]);\n\n useEffect((): void => {\n void refreshRules();\n }, [refreshRules]);\n\n const membersById = useMemo(\n (): ReadonlyMap<string, MemberOption> =>\n new Map(memberOptions.map((option) => [option.id, option])),\n [memberOptions],\n );\n const rows = useMemo(\n (): DelegationRuleRow[] =>\n rules.map((rule) => ({\n ...rule,\n agentEmail: membersById.get(rule.agentMemberId)?.email ?? null,\n agentName:\n membersById.get(rule.agentMemberId)?.displayName ??\n rule.agentMemberId,\n key: rule.id,\n principalEmail: membersById.get(rule.principalMemberId)?.email ?? null,\n principalName:\n membersById.get(rule.principalMemberId)?.displayName ??\n rule.principalMemberId,\n scopeLabel: readScopeLabel(rule),\n })),\n [membersById, rules],\n );\n const selectedScopeType =\n SCOPE_OPTIONS.find((option) => option.id === scopeType.id) ??\n SCOPE_OPTIONS[0];\n const columns = useMemo(\n (): TableColumn<DelegationRuleRow>[] => [\n {\n key: 'principal',\n render: (record: DelegationRuleRow): ReactElement => (\n <MemberNameWithEmailTooltip\n email={record.principalEmail}\n name={record.principalName}\n />\n ),\n title: '原簽核人',\n width: 220,\n },\n {\n key: 'agent',\n render: (record: DelegationRuleRow): ReactElement => (\n <MemberNameWithEmailTooltip\n email={record.agentEmail}\n name={record.agentName}\n />\n ),\n title: '代理人',\n width: 220,\n },\n { dataIndex: 'scopeLabel', key: 'scope', title: '代理範圍', width: 220 },\n {\n key: 'status',\n render: (record: DelegationRuleRow): ReactElement => (\n <DelegationStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n { dataIndex: 'priority', key: 'priority', title: '優先序', width: 100 },\n {\n key: 'startAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(record.startAt)}\n </Typography>\n ),\n title: '開始時間',\n width: 220,\n },\n {\n key: 'endAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {record.endAt ? formatDateTime(record.endAt) : '-'}\n </Typography>\n ),\n title: '結束時間',\n width: 220,\n },\n ],\n [],\n );\n const handleRevoke = useCallback(\n async (id: string): Promise<void> => {\n if (!currentMemberId) {\n return;\n }\n\n setError(null);\n\n try {\n await revokeDelegationRule({\n id,\n revokedByMemberId: currentMemberId,\n });\n await refreshRules();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n }\n },\n [currentMemberId, refreshRules],\n );\n const tableActions = useMemo(\n (): TableActions<DelegationRuleRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<DelegationRuleRow>['render']> =>\n record.status === 'ACTIVE'\n ? [\n {\n name: '撤銷',\n onClick: (): void => void handleRevoke(record.id),\n },\n ]\n : [],\n variant: 'destructive-secondary',\n width: 88,\n }),\n [handleRevoke],\n );\n\n async function handleSearchMembers(searchText: string): Promise<void> {\n setMemberLoading(true);\n\n try {\n setMemberOptions((await searchMembers(searchText)).map(readMemberOption));\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setMemberLoading(false);\n }\n }\n\n async function handleSearchTemplates(\n searchText: string,\n selectedOptions: readonly TemplateOption[] = scopeTemplates,\n ): Promise<void> {\n setTemplateLoading(true);\n\n try {\n const nextOptions = (await listApprovalTemplates()).map(\n readTemplateOption,\n );\n\n setTemplateOptions(\n mergeTemplateOptions(\n selectedOptions,\n filterTemplateOptions(nextOptions, searchText),\n ),\n );\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setTemplateLoading(false);\n }\n }\n\n function openCreateModal(): void {\n setAgentMember(null);\n setEndAt('');\n setPrincipalMember(null);\n setPriority('100');\n setScopeTemplates([]);\n setScopeType(SCOPE_OPTIONS[0]);\n setStartAt('');\n setTemplateOptions([]);\n void handleSearchTemplates('', []);\n setModalOpen(true);\n }\n\n function closeCreateModal(): void {\n if (saving) {\n return;\n }\n\n setModalOpen(false);\n }\n\n async function handleCreate(): Promise<void> {\n if (!currentMemberId) {\n return;\n }\n\n if (!principalMember || !agentMember) {\n setError('請選擇原簽核人與代理人');\n return;\n }\n\n if (selectedScopeType.id === 'TEMPLATE_LIST' && scopeTemplates.length < 1) {\n setError('請選擇至少一個簽核模板');\n return;\n }\n\n if (isInvalidDelegationDateRange(startAt, endAt)) {\n setError('結束時間必須晚於起始時間');\n return;\n }\n\n setSaving(true);\n setError(null);\n\n try {\n await createDelegationRule({\n agentMemberId: agentMember.id,\n createdByMemberId: currentMemberId,\n endAt: endAt || null,\n principalMemberId: principalMember.id,\n priority: Number(priority) || 100,\n requiresConfirmation: false,\n scopeConditionCel: null,\n scopeTemplateIds:\n selectedScopeType.id === 'TEMPLATE_LIST'\n ? scopeTemplates.map((template) => template.id)\n : [],\n scopeType: selectedScopeType.id,\n startAt: startAt || null,\n });\n setModalOpen(false);\n if (rulePage === 1) {\n await refreshRules();\n } else {\n setRulePage(1);\n }\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <>\n <PageHeader>\n <ContentHeader\n description=\"設定簽核代理規則,讓符合範圍的待簽任務自動改派給代理人。\"\n title=\"代理設定\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={openCreateModal}\n variant=\"base-primary\"\n >\n 建立代理\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.delegationFilterArea}>\n <FilterLine>\n <Filter span={2}>\n <MemberAutoCompleteField\n hideLabel\n label=\"原簽核人\"\n loading={memberLoading}\n name=\"principalFilterMemberId\"\n onChange={(option): void => {\n setPrincipalFilterMember(option);\n setRulePage(1);\n }}\n onSearch={handleSearchMembers}\n options={memberOptions}\n required={false}\n layout={FormFieldLayout.VERTICAL}\n size=\"sub\"\n value={principalFilterMember}\n />\n </Filter>\n <Filter span={2}>\n <MemberAutoCompleteField\n hideLabel\n label=\"代理人\"\n loading={memberLoading}\n name=\"agentFilterMemberId\"\n onChange={(option): void => {\n setAgentFilterMember(option);\n setRulePage(1);\n }}\n onSearch={handleSearchMembers}\n options={memberOptions}\n required={false}\n layout={FormFieldLayout.VERTICAL}\n size=\"sub\"\n value={agentFilterMember}\n />\n </Filter>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"scopeFilterType\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => {\n setScopeFilterType(readScopeFilterOption(option));\n setRulePage(1);\n }}\n options={[...SCOPE_FILTER_OPTIONS]}\n placeholder=\"代理範圍\"\n size=\"sub\"\n value={scopeFilterType}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={ruleStatus}\n onChange={(activeKey): void => {\n setRuleStatus(readDelegationStatusTabKey(activeKey));\n setRulePage(1);\n }}\n >\n {DELEGATION_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}\n pagination={{\n current: rulePage,\n onChange: (page): void => {\n setRulePage(page);\n },\n onChangePageSize: (pageSize): void => {\n setRulePage(1);\n setRulePageSize(pageSize);\n },\n pageSize: rulePageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: DELEGATION_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: ruleTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{\n disabled: !principalMember || !agentMember,\n }}\n confirmText=\"建立代理\"\n loading={saving}\n modalType=\"standard\"\n onCancel={closeCreateModal}\n onClose={closeCreateModal}\n onConfirm={(): void => void handleCreate()}\n open={modalOpen}\n showModalFooter\n showModalHeader\n size=\"regular\"\n supportingText=\"代理生效後,後續建立的待簽任務會依範圍自動指派。\"\n title=\"建立代理\"\n >\n <div className={styles.delegationModalFields}>\n <MemberAutoCompleteField\n label=\"原簽核人\"\n loading={memberLoading}\n name=\"principalMemberId\"\n onChange={setPrincipalMember}\n onSearch={handleSearchMembers}\n options={memberOptions}\n value={principalMember}\n />\n <MemberAutoCompleteField\n label=\"代理人\"\n loading={memberLoading}\n name=\"agentMemberId\"\n onChange={setAgentMember}\n onSearch={handleSearchMembers}\n options={memberOptions}\n value={agentMember}\n />\n <BPMFormField label=\"代理範圍\" name=\"scopeType\" required>\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void =>\n setScopeType(readScopeOptionFromValue(option))\n }\n options={[...SCOPE_OPTIONS]}\n value={selectedScopeType}\n />\n </BPMFormField>\n {selectedScopeType.id === 'TEMPLATE_LIST' ? (\n <BPMFormField label=\"簽核模板\" name=\"scopeTemplateIds\" required>\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的模板\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name: 'scopeTemplateIds',\n spellCheck: false,\n }}\n loading={templateLoading}\n loadingText=\"搜尋模板中...\"\n mode=\"multiple\"\n onChange={(nextTemplates): void => {\n const selectedTemplates =\n readTemplateOptionsFromValue(nextTemplates);\n\n setScopeTemplates(selectedTemplates);\n setTemplateOptions((currentOptions) =>\n mergeTemplateOptions(selectedTemplates, currentOptions),\n );\n }}\n onSearch={handleSearchTemplates}\n onVisibilityChange={(open): void => {\n if (open) {\n void handleSearchTemplates('');\n }\n }}\n options={[...templateOptions]}\n overflowStrategy=\"wrap\"\n placeholder=\"搜尋並選取簽核模板\"\n searchDebounceTime={300}\n value={[...scopeTemplates]}\n />\n </BPMFormField>\n ) : null}\n <BPMFormField\n hintText=\"數字越大越優先。同一位被代理人同時命中多條規則時,採用優先序最高的那條;優先序相同時採用較早建立的。\"\n label=\"優先序\"\n name=\"priority\"\n >\n <Input\n fullWidth\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n setPriority(event.target.value)\n }\n value={priority}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"起始時間\" name=\"startAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setStartAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"留空立即生效\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(startAt)}\n />\n </BPMFormField>\n <BPMFormField label=\"結束時間\" name=\"endAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setEndAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"可留空\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(endAt)}\n />\n </BPMFormField>\n </div>\n </Modal>\n </>\n );\n}\n\nfunction MemberAutoCompleteField({\n hideLabel = false,\n label,\n layout = DELEGATION_MODAL_FIELD_LAYOUT,\n loading,\n name,\n onChange,\n onSearch,\n options,\n required = true,\n size,\n value,\n}: {\n readonly hideLabel?: boolean;\n readonly label: string;\n readonly layout?: FormFieldLayout;\n readonly loading: boolean;\n readonly name: string;\n readonly onChange: (option: MemberOption | null) => void;\n readonly onSearch: (searchText: string) => Promise<void>;\n readonly options: readonly MemberOption[];\n readonly required?: boolean;\n readonly size?: 'main' | 'sub';\n readonly value: MemberOption | null;\n}): ReactElement {\n const autoComplete = (\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的成員\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name,\n spellCheck: false,\n }}\n loading={loading}\n loadingText=\"搜尋成員中...\"\n mode=\"single\"\n onChange={(option): void => onChange(readMemberOptionFromValue(option))}\n onSearch={onSearch}\n onSearchTextChange={(searchText): void =>\n onChange(readUniqueMemberOption(searchText, options))\n }\n onVisibilityChange={(open): void => {\n if (open) {\n void onSearch('');\n }\n }}\n options={[...options]}\n placeholder={hideLabel ? label : '搜尋姓名或信箱'}\n searchDebounceTime={300}\n size={size}\n value={value}\n />\n );\n\n if (hideLabel) {\n return (\n <FormField fullWidth layout={layout} name={name}>\n {autoComplete}\n </FormField>\n );\n }\n\n return (\n <BPMFormField label={label} layout={layout} name={name} required={required}>\n {autoComplete}\n </BPMFormField>\n );\n}\n\nfunction readMemberOption(member: MemberProfileRecord): MemberOption {\n return {\n displayName: member.name,\n email: member.email,\n id: member.memberId,\n name: formatMemberLabel(member.name, member.email, 'dot'),\n };\n}\n\nfunction readMemberOptionFromValue(value: unknown): MemberOption | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const id = value.id;\n const name = value.name;\n const email = value.email;\n const displayName = value.displayName;\n\n return typeof id === 'string' && typeof name === 'string'\n ? {\n displayName: typeof displayName === 'string' ? displayName : name,\n email: typeof email === 'string' ? email : null,\n id,\n name,\n }\n : null;\n}\n\nfunction MemberNameWithEmailTooltip({\n email,\n name,\n}: {\n readonly email: string | null;\n readonly name: string;\n}): ReactElement {\n if (!email) {\n return <span>{name}</span>;\n }\n\n return (\n <Tooltip title={email}>\n {({ ref, ...tooltipProps }): ReactElement => (\n // Spread the whole payload, as `TooltipProps` asks: picking only the\n // mouse handlers drops `aria-describedby`, so assistive tech never\n // learns the open tooltip describes this name.\n <span\n {...tooltipProps}\n className={styles.memberNameWithTooltip}\n ref={ref as RefCallback<HTMLSpanElement>}\n >\n {name}\n </span>\n )}\n </Tooltip>\n );\n}\n\nfunction readUniqueMemberOption(\n searchText: string,\n options: readonly MemberOption[],\n): MemberOption | null {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return null;\n }\n\n const matches = options.filter((option) =>\n [option.id, option.name, option.email ?? ''].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n\n return matches.length === 1 ? (matches[0] ?? null) : null;\n}\n\nfunction readTemplateOption(template: ApprovalTemplateRecord): TemplateOption {\n return {\n id: template.id,\n name: template.name,\n };\n}\n\nfunction readTemplateOptionsFromValue(\n value: readonly unknown[],\n): readonly TemplateOption[] {\n return value.flatMap((item): readonly TemplateOption[] => {\n if (!isRecord(item)) {\n return [];\n }\n\n const id = item.id;\n const name = item.name;\n\n return typeof id === 'string' && typeof name === 'string'\n ? [{ id, name }]\n : [];\n });\n}\n\nfunction filterTemplateOptions(\n options: readonly TemplateOption[],\n searchText: string,\n): readonly TemplateOption[] {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return options;\n }\n\n return options.filter((option) =>\n [option.id, option.name].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n}\n\nfunction mergeTemplateOptions(\n selectedOptions: readonly TemplateOption[],\n availableOptions: readonly TemplateOption[],\n): readonly TemplateOption[] {\n return [...selectedOptions, ...availableOptions].reduce<TemplateOption[]>(\n (options, option) =>\n options.some((currentOption) => currentOption.id === option.id)\n ? options\n : [...options, option],\n [],\n );\n}\n\nfunction readScopeOptionFromValue(value: unknown): ScopeOption {\n if (!isRecord(value) || !isSelectableDelegationScopeType(value.id)) {\n return SCOPE_OPTIONS[0];\n }\n\n return (\n SCOPE_OPTIONS.find((option) => option.id === value.id) ?? SCOPE_OPTIONS[0]\n );\n}\n\nfunction readScopeFilterOption(value: unknown): ScopeFilterOption {\n if (!isRecord(value)) {\n return SCOPE_FILTER_OPTIONS[0];\n }\n\n const id = value.id;\n\n return (\n SCOPE_FILTER_OPTIONS.find((option) => option.id === id) ??\n SCOPE_FILTER_OPTIONS[0]\n );\n}\n\nfunction isSelectableDelegationScopeType(\n value: unknown,\n): value is ScopeOption['id'] {\n return value === 'ALL' || value === 'TEMPLATE_LIST';\n}\n\nfunction readScopeLabel(rule: DelegationRuleRecord): string {\n if (rule.scopeType === 'ALL') {\n return '全部簽核';\n }\n\n if (rule.scopeType === 'TEMPLATE_LIST') {\n return `指定模板:${rule.scopeTemplateIds.length}`;\n }\n\n return rule.scopeConditionCel ? `條件:${rule.scopeConditionCel}` : '條件式';\n}\n\nfunction DelegationStatusBadge({\n status,\n}: {\n readonly status: DelegationRuleRecord['status'];\n}): ReactElement {\n if (status === 'ACTIVE') {\n return <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />;\n }\n\n if (status === 'REVOKED') {\n return <Badge size=\"sub\" text=\"已撤銷\" variant=\"dot-inactive\" />;\n }\n\n if (status === 'EXPIRED') {\n return <Badge size=\"sub\" text=\"已過期\" variant=\"dot-warning\" />;\n }\n\n return <Badge size=\"sub\" text={status} variant=\"dot-info\" />;\n}\n\nfunction readDelegationStatusTabKey(activeKey: Key): DelegationStatusTabKey {\n if (\n activeKey === 'ACTIVE' ||\n activeKey === 'REVOKED' ||\n activeKey === 'EXPIRED'\n ) {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction readDelegationDateTimePickerValue(value: string): string | undefined {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date\n ? `${formatDateParts(date)}T${padDatePart(date.getHours())}:${padDatePart(\n date.getMinutes(),\n )}`\n : undefined;\n}\n\nfunction formatDelegationDateTimePickerValue(\n value: string | undefined,\n): string {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date ? date.toISOString() : '';\n}\n\nfunction isInvalidDelegationDateRange(startAt: string, endAt: string): boolean {\n if (!startAt || !endAt) {\n return false;\n }\n\n const startDate = parseDelegationDateTimeValue(startAt);\n const endDate = parseDelegationDateTimeValue(endAt);\n\n return !!startDate && !!endDate && endDate.getTime() <= startDate.getTime();\n}\n\nfunction parseDelegationDateTimeValue(value: string): Date | null {\n if (value.endsWith('Z') || /[+-]\\d{2}:\\d{2}$/.test(value)) {\n const parsedDate = new Date(value);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n }\n\n const [datePart = '', timePart = '00:00'] = value.split('T');\n const [year = 0, month = 1, day = 1] = datePart.split('-').map(Number);\n const [hour = 0, minute = 0] = timePart.split(':').map(Number);\n const parsedDate = new Date(year, month - 1, day, hour, minute);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n}\n\nfunction formatDateParts(date: Date): string {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(\n date.getDate(),\n )}`;\n}\n\nfunction padDatePart(value: number): string {\n return String(value).padStart(2, '0');\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"delegations-CcS0SHbf.cjs","names":["FormFieldLayout","useAuth","useState","useCallback","listDelegationRulesPage","searchMembers","useMemo","Typography","formatDateTime","revokeDelegationRule","listApprovalTemplates","createDelegationRule","_Fragment","PageHeader","ContentHeader","Button","PlusIcon","SectionGroup","Section","FilterArea","styles","FilterLine","Filter","FormField","Select","Tab","TabItem","Table","Modal","BPMFormField","AutoComplete","Input","DateTimePicker","formatMemberLabel","Tooltip","Badge","require_rolldown_runtime","require_bpm_form_field","require_format_date_time","require_auth_provider","require_format_member_label","react","_mezzanine_ui_react","react_jsx_runtime","_rytass_bpm_core_client_workflow","_mezzanine_ui_core_form","_mezzanine_ui_react_ContentHeader","_mezzanine_ui_icons","_rytass_bpm_core_client_template","delegations_module_default","DELEGATION_MODAL_FIELD_LAYOUT","DELEGATION_PAGE_SIZE_OPTIONS","DELEGATION_STATUS_TABS","SCOPE_OPTIONS","SCOPE_FILTER_OPTIONS","AdminDelegationsView","currentMemberId","member","agentMember","setAgentMember","endAt","setEndAt","error","setError","loading","setLoading","memberLoading","setMemberLoading","memberOptions","setMemberOptions","principalFilterMember","setPrincipalFilterMember","agentFilterMember","setAgentFilterMember","modalOpen","setModalOpen","principalMember","setPrincipalMember","priority","setPriority","rulePage","setRulePage","rulePageSize","setRulePageSize","ruleStatus","setRuleStatus","ruleTotalCount","setRuleTotalCount","rules","setRules","saving","setSaving","scopeTemplates","setScopeTemplates","scopeFilterType","setScopeFilterType","scopeType","setScopeType","startAt","setStartAt","templateLoading","setTemplateLoading","templateOptions","setTemplateOptions","refreshRules","rulePageResult","members","readMemberOption","requestError","readErrorMessage","membersById","option","rows","rule","readScopeLabel","selectedScopeType","columns","MemberNameWithEmailTooltip","record","DelegationStatusBadge","handleRevoke","tableActions","handleSearchMembers","searchText","handleSearchTemplates","nextOptions","readTemplateOption","mergeTemplateOptions","selectedOptions","filterTemplateOptions","openCreateModal","closeCreateModal","handleCreate","isInvalidDelegationDateRange","template","MemberAutoCompleteField","readScopeFilterOption","readDelegationStatusTabKey","activeKey","statusTab","page","pageSize","from","to","total","readScopeOptionFromValue","selectedTemplates","readTemplateOptionsFromValue","nextTemplates","currentOptions","open","event","formatDelegationDateTimePickerValue","nextValue","readDelegationDateTimePickerValue","autoComplete","onChange","readMemberOptionFromValue","readUniqueMemberOption","options","onSearch","hideLabel","label","isRecord","value","id","name","email","displayName","tooltipProps","normalizedSearchText","matches","item","availableOptions","currentOption","isSelectableDelegationScopeType","status","date","parseDelegationDateTimeValue","formatDateParts","padDatePart","startDate","endDate","parsedDate","datePart","timePart","year","month","day","hour","minute"],"sources":["../../src/views/admin/delegations/delegations.module.scss","../../src/views/admin/delegations/AdminDelegationsView.tsx"],"sourcesContent":[".delegationModalFields {\n display: grid;\n gap: 12px;\n width: 100%;\n\n :global(.mzn-form-field--horizontal) {\n align-items: flex-start;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label-area) {\n flex: 0 0 112px;\n width: 112px;\n min-width: 112px;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__label) {\n flex-wrap: nowrap;\n white-space: nowrap;\n }\n\n :global(.mzn-form-field--horizontal .mzn-form-field__data-entry) {\n flex: 1 1 auto;\n align-items: stretch;\n min-width: 0;\n max-width: none;\n }\n\n :global(.mzn-form-field__control-field-slot--main) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-auto-complete) {\n width: 100%;\n min-width: 0;\n }\n\n :global(.mzn-input),\n :global(.mzn-input-container),\n :global(.mzn-select),\n :global(.mzn-select-trigger),\n :global(.mzn-text-field) {\n width: 100%;\n min-width: 0 !important;\n }\n\n :global(.mzn-select-trigger__input) {\n width: 100%;\n min-width: 0 !important;\n text-overflow: ellipsis;\n }\n}\n\n.delegationFilterArea {\n width: calc(100vw - 272px);\n\n :global(.mzn-filter-area__actions) {\n display: none;\n }\n\n :global(.mzn-filter-area__row) {\n align-items: flex-start;\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 :global(.mzn-auto-complete) {\n width: 100%;\n }\n}\n\n.memberNameWithTooltip {\n cursor: help;\n text-decoration: underline dotted;\n text-underline-offset: 3px;\n}\n","'use client';\n\nimport {\n ChangeEvent,\n Key,\n ReactElement,\n RefCallback,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n AutoComplete,\n Badge,\n Button,\n DateTimePicker,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Select,\n Tab,\n TabItem,\n Table,\n Tooltip,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport { BPMFormField } from '../../../components/bpm-form-field';\nimport styles from './delegations.module.scss';\nimport { formatDateTime } from '../../../lib/format-date-time';\nimport { useAuth } from '../../../lib/auth-provider';\nimport {\n DelegationRuleRecord,\n DelegationRuleStatus,\n DelegationScopeType,\n MemberProfileRecord,\n createDelegationRule,\n listDelegationRulesPage,\n revokeDelegationRule,\n searchMembers,\n} from '@rytass/bpm-core-client/workflow';\nimport {\n ApprovalTemplateRecord,\n listApprovalTemplates,\n} from '@rytass/bpm-core-client/template';\nimport { formatMemberLabel } from '../../../lib/format-member-label';\n\ntype MemberOption = Readonly<{\n displayName: string;\n email: string | null;\n id: string;\n name: string;\n}>;\n\ntype TemplateOption = Readonly<{\n id: string;\n name: string;\n}>;\n\ntype ScopeOption = Readonly<{\n id: DelegationScopeType;\n name: string;\n}>;\n\ntype ScopeFilterOption = Readonly<{\n id: 'ALL_SCOPES' | DelegationScopeType;\n name: string;\n scopeType: DelegationScopeType | null;\n}>;\n\ntype DelegationRuleRow = Readonly<\n Record<string, unknown> &\n DelegationRuleRecord & {\n agentEmail: string | null;\n agentName: string;\n key: string;\n principalEmail: string | null;\n principalName: string;\n scopeLabel: string;\n }\n>;\n\nconst DELEGATION_MODAL_FIELD_LAYOUT = FormFieldLayout.HORIZONTAL;\nconst DELEGATION_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst DELEGATION_STATUS_TABS: readonly {\n readonly key: DelegationStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'ACTIVE', label: '啟用中' },\n { key: 'REVOKED', label: '已撤銷' },\n { key: 'EXPIRED', label: '已過期' },\n];\n\ntype DelegationStatusTabKey = 'ALL' | DelegationRuleStatus;\n\nconst SCOPE_OPTIONS: readonly ScopeOption[] = [\n { id: 'ALL', name: '全部簽核' },\n { id: 'TEMPLATE_LIST', name: '指定模板' },\n];\n\nconst SCOPE_FILTER_OPTIONS: readonly ScopeFilterOption[] = [\n { id: 'ALL_SCOPES', name: '全部範圍', scopeType: null },\n { id: 'ALL', name: '全部簽核', scopeType: 'ALL' },\n { id: 'TEMPLATE_LIST', name: '指定模板', scopeType: 'TEMPLATE_LIST' },\n];\n\n\nexport function AdminDelegationsView(): ReactElement {\n const { member } = useAuth();\n const currentMemberId = member?.memberId ?? null;\n const [agentMember, setAgentMember] = useState<MemberOption | null>(null);\n const [endAt, setEndAt] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [memberLoading, setMemberLoading] = useState(false);\n const [memberOptions, setMemberOptions] = useState<readonly MemberOption[]>(\n [],\n );\n const [principalFilterMember, setPrincipalFilterMember] =\n useState<MemberOption | null>(null);\n const [agentFilterMember, setAgentFilterMember] =\n useState<MemberOption | null>(null);\n const [modalOpen, setModalOpen] = useState(false);\n const [principalMember, setPrincipalMember] = useState<MemberOption | null>(\n null,\n );\n const [priority, setPriority] = useState('100');\n const [rulePage, setRulePage] = useState(1);\n const [rulePageSize, setRulePageSize] = useState(10);\n const [ruleStatus, setRuleStatus] = useState<DelegationStatusTabKey>('ALL');\n const [ruleTotalCount, setRuleTotalCount] = useState(0);\n const [rules, setRules] = useState<readonly DelegationRuleRecord[]>([]);\n const [saving, setSaving] = useState(false);\n const [scopeTemplates, setScopeTemplates] = useState<\n readonly TemplateOption[]\n >([]);\n const [scopeFilterType, setScopeFilterType] = useState<ScopeFilterOption>(\n SCOPE_FILTER_OPTIONS[0],\n );\n const [scopeType, setScopeType] = useState<ScopeOption>(SCOPE_OPTIONS[0]);\n const [startAt, setStartAt] = useState('');\n const [templateLoading, setTemplateLoading] = useState(false);\n const [templateOptions, setTemplateOptions] = useState<\n readonly TemplateOption[]\n >([]);\n\n const refreshRules = useCallback(async (): Promise<void> => {\n setLoading(true);\n setError(null);\n\n try {\n const [rulePageResult, members] = await Promise.all([\n listDelegationRulesPage({\n agentMemberId: agentFilterMember?.id ?? null,\n includeInactive: true,\n page: rulePage,\n pageSize: rulePageSize,\n principalMemberId: principalFilterMember?.id ?? null,\n scopeType: scopeFilterType.scopeType,\n status: ruleStatus === 'ALL' ? null : ruleStatus,\n }),\n searchMembers(''),\n ]);\n\n setRules(rulePageResult.rules);\n setRuleTotalCount(rulePageResult.totalCount);\n setMemberOptions(members.map(readMemberOption));\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, [\n agentFilterMember,\n principalFilterMember,\n rulePage,\n rulePageSize,\n ruleStatus,\n scopeFilterType,\n ]);\n\n useEffect((): void => {\n void refreshRules();\n }, [refreshRules]);\n\n const membersById = useMemo(\n (): ReadonlyMap<string, MemberOption> =>\n new Map(memberOptions.map((option) => [option.id, option])),\n [memberOptions],\n );\n const rows = useMemo(\n (): DelegationRuleRow[] =>\n rules.map((rule) => ({\n ...rule,\n agentEmail: membersById.get(rule.agentMemberId)?.email ?? null,\n agentName:\n membersById.get(rule.agentMemberId)?.displayName ??\n rule.agentMemberId,\n key: rule.id,\n principalEmail: membersById.get(rule.principalMemberId)?.email ?? null,\n principalName:\n membersById.get(rule.principalMemberId)?.displayName ??\n rule.principalMemberId,\n scopeLabel: readScopeLabel(rule),\n })),\n [membersById, rules],\n );\n const selectedScopeType =\n SCOPE_OPTIONS.find((option) => option.id === scopeType.id) ??\n SCOPE_OPTIONS[0];\n const columns = useMemo(\n (): TableColumn<DelegationRuleRow>[] => [\n {\n key: 'principal',\n render: (record: DelegationRuleRow): ReactElement => (\n <MemberNameWithEmailTooltip\n email={record.principalEmail}\n name={record.principalName}\n />\n ),\n title: '原簽核人',\n width: 220,\n },\n {\n key: 'agent',\n render: (record: DelegationRuleRow): ReactElement => (\n <MemberNameWithEmailTooltip\n email={record.agentEmail}\n name={record.agentName}\n />\n ),\n title: '代理人',\n width: 220,\n },\n { dataIndex: 'scopeLabel', key: 'scope', title: '代理範圍', width: 220 },\n {\n key: 'status',\n render: (record: DelegationRuleRow): ReactElement => (\n <DelegationStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n { dataIndex: 'priority', key: 'priority', title: '優先序', width: 100 },\n {\n key: 'startAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(record.startAt)}\n </Typography>\n ),\n title: '開始時間',\n width: 220,\n },\n {\n key: 'endAt',\n render: (record: DelegationRuleRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {record.endAt ? formatDateTime(record.endAt) : '-'}\n </Typography>\n ),\n title: '結束時間',\n width: 220,\n },\n ],\n [],\n );\n const handleRevoke = useCallback(\n async (id: string): Promise<void> => {\n if (!currentMemberId) {\n return;\n }\n\n setError(null);\n\n try {\n await revokeDelegationRule({\n id,\n revokedByMemberId: currentMemberId,\n });\n await refreshRules();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n }\n },\n [currentMemberId, refreshRules],\n );\n const tableActions = useMemo(\n (): TableActions<DelegationRuleRow> => ({\n render: (\n record,\n ): ReturnType<TableActions<DelegationRuleRow>['render']> =>\n record.status === 'ACTIVE'\n ? [\n {\n name: '撤銷',\n onClick: (): void => void handleRevoke(record.id),\n },\n ]\n : [],\n variant: 'destructive-secondary',\n width: 88,\n }),\n [handleRevoke],\n );\n\n async function handleSearchMembers(searchText: string): Promise<void> {\n setMemberLoading(true);\n\n try {\n setMemberOptions((await searchMembers(searchText)).map(readMemberOption));\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setMemberLoading(false);\n }\n }\n\n async function handleSearchTemplates(\n searchText: string,\n selectedOptions: readonly TemplateOption[] = scopeTemplates,\n ): Promise<void> {\n setTemplateLoading(true);\n\n try {\n const nextOptions = (await listApprovalTemplates()).map(\n readTemplateOption,\n );\n\n setTemplateOptions(\n mergeTemplateOptions(\n selectedOptions,\n filterTemplateOptions(nextOptions, searchText),\n ),\n );\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setTemplateLoading(false);\n }\n }\n\n function openCreateModal(): void {\n setAgentMember(null);\n setEndAt('');\n setPrincipalMember(null);\n setPriority('100');\n setScopeTemplates([]);\n setScopeType(SCOPE_OPTIONS[0]);\n setStartAt('');\n setTemplateOptions([]);\n void handleSearchTemplates('', []);\n setModalOpen(true);\n }\n\n function closeCreateModal(): void {\n if (saving) {\n return;\n }\n\n setModalOpen(false);\n }\n\n async function handleCreate(): Promise<void> {\n if (!currentMemberId) {\n return;\n }\n\n if (!principalMember || !agentMember) {\n setError('請選擇原簽核人與代理人');\n return;\n }\n\n if (selectedScopeType.id === 'TEMPLATE_LIST' && scopeTemplates.length < 1) {\n setError('請選擇至少一個簽核模板');\n return;\n }\n\n if (isInvalidDelegationDateRange(startAt, endAt)) {\n setError('結束時間必須晚於起始時間');\n return;\n }\n\n setSaving(true);\n setError(null);\n\n try {\n await createDelegationRule({\n agentMemberId: agentMember.id,\n createdByMemberId: currentMemberId,\n endAt: endAt || null,\n principalMemberId: principalMember.id,\n priority: Number(priority) || 100,\n requiresConfirmation: false,\n scopeConditionCel: null,\n scopeTemplateIds:\n selectedScopeType.id === 'TEMPLATE_LIST'\n ? scopeTemplates.map((template) => template.id)\n : [],\n scopeType: selectedScopeType.id,\n startAt: startAt || null,\n });\n setModalOpen(false);\n if (rulePage === 1) {\n await refreshRules();\n } else {\n setRulePage(1);\n }\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <>\n <PageHeader>\n <ContentHeader\n description=\"設定簽核代理規則,讓符合範圍的待簽任務自動改派給代理人。\"\n title=\"代理設定\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={openCreateModal}\n variant=\"base-primary\"\n >\n 建立代理\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.delegationFilterArea}>\n <FilterLine>\n <Filter span={2}>\n <MemberAutoCompleteField\n hideLabel\n label=\"原簽核人\"\n loading={memberLoading}\n name=\"principalFilterMemberId\"\n onChange={(option): void => {\n setPrincipalFilterMember(option);\n setRulePage(1);\n }}\n onSearch={handleSearchMembers}\n options={memberOptions}\n required={false}\n layout={FormFieldLayout.VERTICAL}\n size=\"sub\"\n value={principalFilterMember}\n />\n </Filter>\n <Filter span={2}>\n <MemberAutoCompleteField\n hideLabel\n label=\"代理人\"\n loading={memberLoading}\n name=\"agentFilterMemberId\"\n onChange={(option): void => {\n setAgentFilterMember(option);\n setRulePage(1);\n }}\n onSearch={handleSearchMembers}\n options={memberOptions}\n required={false}\n layout={FormFieldLayout.VERTICAL}\n size=\"sub\"\n value={agentFilterMember}\n />\n </Filter>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"scopeFilterType\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => {\n setScopeFilterType(readScopeFilterOption(option));\n setRulePage(1);\n }}\n options={[...SCOPE_FILTER_OPTIONS]}\n placeholder=\"代理範圍\"\n size=\"sub\"\n value={scopeFilterType}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={ruleStatus}\n onChange={(activeKey): void => {\n setRuleStatus(readDelegationStatusTabKey(activeKey));\n setRulePage(1);\n }}\n >\n {DELEGATION_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}\n pagination={{\n current: rulePage,\n onChange: (page): void => {\n setRulePage(page);\n },\n onChangePageSize: (pageSize): void => {\n setRulePage(1);\n setRulePageSize(pageSize);\n },\n pageSize: rulePageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: DELEGATION_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: ruleTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{\n disabled: !principalMember || !agentMember,\n }}\n confirmText=\"建立代理\"\n loading={saving}\n modalType=\"standard\"\n onCancel={closeCreateModal}\n onClose={closeCreateModal}\n onConfirm={(): void => void handleCreate()}\n open={modalOpen}\n showModalFooter\n showModalHeader\n size=\"regular\"\n supportingText=\"代理生效後,後續建立的待簽任務會依範圍自動指派。\"\n title=\"建立代理\"\n >\n <div className={styles.delegationModalFields}>\n <MemberAutoCompleteField\n label=\"原簽核人\"\n loading={memberLoading}\n name=\"principalMemberId\"\n onChange={setPrincipalMember}\n onSearch={handleSearchMembers}\n options={memberOptions}\n value={principalMember}\n />\n <MemberAutoCompleteField\n label=\"代理人\"\n loading={memberLoading}\n name=\"agentMemberId\"\n onChange={setAgentMember}\n onSearch={handleSearchMembers}\n options={memberOptions}\n value={agentMember}\n />\n <BPMFormField label=\"代理範圍\" name=\"scopeType\" required>\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void =>\n setScopeType(readScopeOptionFromValue(option))\n }\n options={[...SCOPE_OPTIONS]}\n value={selectedScopeType}\n />\n </BPMFormField>\n {selectedScopeType.id === 'TEMPLATE_LIST' ? (\n <BPMFormField label=\"簽核模板\" name=\"scopeTemplateIds\" required>\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的模板\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name: 'scopeTemplateIds',\n spellCheck: false,\n }}\n loading={templateLoading}\n loadingText=\"搜尋模板中...\"\n mode=\"multiple\"\n onChange={(nextTemplates): void => {\n const selectedTemplates =\n readTemplateOptionsFromValue(nextTemplates);\n\n setScopeTemplates(selectedTemplates);\n setTemplateOptions((currentOptions) =>\n mergeTemplateOptions(selectedTemplates, currentOptions),\n );\n }}\n onSearch={handleSearchTemplates}\n onVisibilityChange={(open): void => {\n if (open) {\n void handleSearchTemplates('');\n }\n }}\n options={[...templateOptions]}\n overflowStrategy=\"wrap\"\n placeholder=\"搜尋並選取簽核模板\"\n searchDebounceTime={300}\n value={[...scopeTemplates]}\n />\n </BPMFormField>\n ) : null}\n <BPMFormField\n hintText=\"數字越大越優先。同一位被代理人同時命中多條規則時,採用優先序最高的那條;優先序相同時採用較早建立的。\"\n label=\"優先序\"\n name=\"priority\"\n >\n <Input\n fullWidth\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n setPriority(event.target.value)\n }\n value={priority}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"起始時間\" name=\"startAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setStartAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"留空立即生效\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(startAt)}\n />\n </BPMFormField>\n <BPMFormField label=\"結束時間\" name=\"endAt\">\n <DateTimePicker\n formatDate=\"YYYY-MM-DD\"\n formatTime=\"HH:mm\"\n fullWidth\n hideSecond\n onChange={(nextValue): void =>\n setEndAt(formatDelegationDateTimePickerValue(nextValue))\n }\n placeholderLeft=\"可留空\"\n placeholderRight=\"選擇時間\"\n value={readDelegationDateTimePickerValue(endAt)}\n />\n </BPMFormField>\n </div>\n </Modal>\n </>\n );\n}\n\nfunction MemberAutoCompleteField({\n hideLabel = false,\n label,\n layout = DELEGATION_MODAL_FIELD_LAYOUT,\n loading,\n name,\n onChange,\n onSearch,\n options,\n required = true,\n size,\n value,\n}: {\n readonly hideLabel?: boolean;\n readonly label: string;\n readonly layout?: FormFieldLayout;\n readonly loading: boolean;\n readonly name: string;\n readonly onChange: (option: MemberOption | null) => void;\n readonly onSearch: (searchText: string) => Promise<void>;\n readonly options: readonly MemberOption[];\n readonly required?: boolean;\n readonly size?: 'main' | 'sub';\n readonly value: MemberOption | null;\n}): ReactElement {\n const autoComplete = (\n <AutoComplete\n asyncData\n disabledOptionsFilter\n emptyText=\"沒有符合的成員\"\n inputProps={{\n autoCapitalize: 'none',\n autoCorrect: 'off',\n name,\n spellCheck: false,\n }}\n loading={loading}\n loadingText=\"搜尋成員中...\"\n mode=\"single\"\n onChange={(option): void => onChange(readMemberOptionFromValue(option))}\n onSearch={onSearch}\n onSearchTextChange={(searchText): void =>\n onChange(readUniqueMemberOption(searchText, options))\n }\n onVisibilityChange={(open): void => {\n if (open) {\n void onSearch('');\n }\n }}\n options={[...options]}\n placeholder={hideLabel ? label : '搜尋姓名或信箱'}\n searchDebounceTime={300}\n size={size}\n value={value}\n />\n );\n\n if (hideLabel) {\n return (\n <FormField fullWidth layout={layout} name={name}>\n {autoComplete}\n </FormField>\n );\n }\n\n return (\n <BPMFormField label={label} layout={layout} name={name} required={required}>\n {autoComplete}\n </BPMFormField>\n );\n}\n\nfunction readMemberOption(member: MemberProfileRecord): MemberOption {\n return {\n displayName: member.name,\n email: member.email,\n id: member.memberId,\n name: formatMemberLabel(member.name, member.email, 'dot'),\n };\n}\n\nfunction readMemberOptionFromValue(value: unknown): MemberOption | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const id = value.id;\n const name = value.name;\n const email = value.email;\n const displayName = value.displayName;\n\n return typeof id === 'string' && typeof name === 'string'\n ? {\n displayName: typeof displayName === 'string' ? displayName : name,\n email: typeof email === 'string' ? email : null,\n id,\n name,\n }\n : null;\n}\n\nfunction MemberNameWithEmailTooltip({\n email,\n name,\n}: {\n readonly email: string | null;\n readonly name: string;\n}): ReactElement {\n if (!email) {\n return <span>{name}</span>;\n }\n\n return (\n <Tooltip title={email}>\n {({ ref, ...tooltipProps }): ReactElement => (\n // Spread the whole payload, as `TooltipProps` asks: picking only the\n // mouse handlers drops `aria-describedby`, so assistive tech never\n // learns the open tooltip describes this name.\n <span\n {...tooltipProps}\n className={styles.memberNameWithTooltip}\n ref={ref as RefCallback<HTMLSpanElement>}\n >\n {name}\n </span>\n )}\n </Tooltip>\n );\n}\n\nfunction readUniqueMemberOption(\n searchText: string,\n options: readonly MemberOption[],\n): MemberOption | null {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return null;\n }\n\n const matches = options.filter((option) =>\n [option.id, option.name, option.email ?? ''].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n\n return matches.length === 1 ? (matches[0] ?? null) : null;\n}\n\nfunction readTemplateOption(template: ApprovalTemplateRecord): TemplateOption {\n return {\n id: template.id,\n name: template.name,\n };\n}\n\nfunction readTemplateOptionsFromValue(\n value: readonly unknown[],\n): readonly TemplateOption[] {\n return value.flatMap((item): readonly TemplateOption[] => {\n if (!isRecord(item)) {\n return [];\n }\n\n const id = item.id;\n const name = item.name;\n\n return typeof id === 'string' && typeof name === 'string'\n ? [{ id, name }]\n : [];\n });\n}\n\nfunction filterTemplateOptions(\n options: readonly TemplateOption[],\n searchText: string,\n): readonly TemplateOption[] {\n const normalizedSearchText = searchText.trim().toLocaleLowerCase();\n\n if (!normalizedSearchText) {\n return options;\n }\n\n return options.filter((option) =>\n [option.id, option.name].some((value) =>\n value.toLocaleLowerCase().includes(normalizedSearchText),\n ),\n );\n}\n\nfunction mergeTemplateOptions(\n selectedOptions: readonly TemplateOption[],\n availableOptions: readonly TemplateOption[],\n): readonly TemplateOption[] {\n return [...selectedOptions, ...availableOptions].reduce<TemplateOption[]>(\n (options, option) =>\n options.some((currentOption) => currentOption.id === option.id)\n ? options\n : [...options, option],\n [],\n );\n}\n\nfunction readScopeOptionFromValue(value: unknown): ScopeOption {\n if (!isRecord(value) || !isSelectableDelegationScopeType(value.id)) {\n return SCOPE_OPTIONS[0];\n }\n\n return (\n SCOPE_OPTIONS.find((option) => option.id === value.id) ?? SCOPE_OPTIONS[0]\n );\n}\n\nfunction readScopeFilterOption(value: unknown): ScopeFilterOption {\n if (!isRecord(value)) {\n return SCOPE_FILTER_OPTIONS[0];\n }\n\n const id = value.id;\n\n return (\n SCOPE_FILTER_OPTIONS.find((option) => option.id === id) ??\n SCOPE_FILTER_OPTIONS[0]\n );\n}\n\nfunction isSelectableDelegationScopeType(\n value: unknown,\n): value is ScopeOption['id'] {\n return value === 'ALL' || value === 'TEMPLATE_LIST';\n}\n\nfunction readScopeLabel(rule: DelegationRuleRecord): string {\n if (rule.scopeType === 'ALL') {\n return '全部簽核';\n }\n\n if (rule.scopeType === 'TEMPLATE_LIST') {\n return `指定模板:${rule.scopeTemplateIds.length}`;\n }\n\n return rule.scopeConditionCel ? `條件:${rule.scopeConditionCel}` : '條件式';\n}\n\nfunction DelegationStatusBadge({\n status,\n}: {\n readonly status: DelegationRuleRecord['status'];\n}): ReactElement {\n if (status === 'ACTIVE') {\n return <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />;\n }\n\n if (status === 'REVOKED') {\n return <Badge size=\"sub\" text=\"已撤銷\" variant=\"dot-inactive\" />;\n }\n\n if (status === 'EXPIRED') {\n return <Badge size=\"sub\" text=\"已過期\" variant=\"dot-warning\" />;\n }\n\n return <Badge size=\"sub\" text={status} variant=\"dot-info\" />;\n}\n\nfunction readDelegationStatusTabKey(activeKey: Key): DelegationStatusTabKey {\n if (\n activeKey === 'ACTIVE' ||\n activeKey === 'REVOKED' ||\n activeKey === 'EXPIRED'\n ) {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction readDelegationDateTimePickerValue(value: string): string | undefined {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date\n ? `${formatDateParts(date)}T${padDatePart(date.getHours())}:${padDatePart(\n date.getMinutes(),\n )}`\n : undefined;\n}\n\nfunction formatDelegationDateTimePickerValue(\n value: string | undefined,\n): string {\n const date = value ? parseDelegationDateTimeValue(value) : null;\n\n return date ? date.toISOString() : '';\n}\n\nfunction isInvalidDelegationDateRange(startAt: string, endAt: string): boolean {\n if (!startAt || !endAt) {\n return false;\n }\n\n const startDate = parseDelegationDateTimeValue(startAt);\n const endDate = parseDelegationDateTimeValue(endAt);\n\n return !!startDate && !!endDate && endDate.getTime() <= startDate.getTime();\n}\n\nfunction parseDelegationDateTimeValue(value: string): Date | null {\n if (value.endsWith('Z') || /[+-]\\d{2}:\\d{2}$/.test(value)) {\n const parsedDate = new Date(value);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n }\n\n const [datePart = '', timePart = '00:00'] = value.split('T');\n const [year = 0, month = 1, day = 1] = datePart.split('-').map(Number);\n const [hour = 0, minute = 0] = timePart.split(':').map(Number);\n const parsedDate = new Date(year, month - 1, day, hour, minute);\n\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate;\n}\n\nfunction formatDateParts(date: Date): string {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(\n date.getDate(),\n )}`;\n}\n\nfunction padDatePart(value: number): string {\n return String(value).padStart(2, '0');\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null;\n}\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  "use client";
2
- import { n as e } from "./auth-provider-B5oPmvk2.js";
3
- import { t } from "./format-date-time-CB-LxzqT.js";
4
- import { t as n } from "./bpm-form-field-Cao0rMol.js";
5
- import { t as r } from "./format-member-label-DudVI55w.js";
2
+ import { t as e } from "./bpm-form-field-9B-Det0u.js";
3
+ import { t } from "./format-date-time-B0LdmWg4.js";
4
+ import { n } from "./auth-provider-C2b-5mGt.js";
5
+ import { t as r } from "./format-member-label-C73FuP-d.js";
6
6
  import { useCallback as i, useEffect as a, useMemo as o, useState as s } from "react";
7
7
  import { AutoComplete as c, Badge as l, Button as ee, DateTimePicker as u, Filter as d, FilterArea as f, FilterLine as te, FormField as p, Input as ne, Modal as re, PageHeader as ie, Section as ae, SectionGroup as oe, Select as se, Tab as ce, TabItem as le, Table as ue, Tooltip as m, Typography as h } from "@mezzanine-ui/react";
8
8
  import { Fragment as de, jsx as g, jsxs as _ } from "react/jsx-runtime";
@@ -60,7 +60,7 @@ import '../delegations.css';var y = {
60
60
  }
61
61
  ];
62
62
  function C() {
63
- let { member: r } = e(), l = r?.memberId ?? null, [m, b] = s(null), [C, T] = s(""), [E, D] = s(null), [A, j] = s(!0), [M, P] = s(!1), [F, Ne] = s([]), [I, Pe] = s(null), [L, Fe] = s(null), [Ie, R] = s(!1), [z, Le] = s(null), [Re, ze] = s("100"), [B, V] = s(1), [H, Be] = s(10), [U, Ve] = s("ALL"), [He, Ue] = s(0), [We, Ge] = s([]), [Ke, qe] = s(!1), [W, Je] = s([]), [G, Ye] = s(S[0]), [Xe, Ze] = s(x[0]), [K, q] = s(""), [Qe, $e] = s(!1), [et, J] = s([]), Y = i(async () => {
63
+ let { member: r } = n(), l = r?.memberId ?? null, [m, b] = s(null), [C, T] = s(""), [E, D] = s(null), [A, j] = s(!0), [M, P] = s(!1), [F, Ne] = s([]), [I, Pe] = s(null), [L, Fe] = s(null), [Ie, R] = s(!1), [z, Le] = s(null), [Re, ze] = s("100"), [B, V] = s(1), [H, Be] = s(10), [U, Ve] = s("ALL"), [He, Ue] = s(0), [We, Ge] = s([]), [Ke, qe] = s(!1), [W, Je] = s([]), [G, Ye] = s(S[0]), [Xe, Ze] = s(x[0]), [K, q] = s(""), [Qe, $e] = s(!1), [et, J] = s([]), Y = i(async () => {
64
64
  j(!0), D(null);
65
65
  try {
66
66
  let [e, t] = await Promise.all([pe({
@@ -372,7 +372,7 @@ function C() {
372
372
  options: F,
373
373
  value: m
374
374
  }),
375
- /* @__PURE__ */ g(n, {
375
+ /* @__PURE__ */ g(e, {
376
376
  label: "代理範圍",
377
377
  name: "scopeType",
378
378
  required: !0,
@@ -384,7 +384,7 @@ function C() {
384
384
  value: Z
385
385
  })
386
386
  }),
387
- Z.id === "TEMPLATE_LIST" ? /* @__PURE__ */ g(n, {
387
+ Z.id === "TEMPLATE_LIST" ? /* @__PURE__ */ g(e, {
388
388
  label: "簽核模板",
389
389
  name: "scopeTemplateIds",
390
390
  required: !0,
@@ -416,7 +416,7 @@ function C() {
416
416
  value: [...W]
417
417
  })
418
418
  }) : null,
419
- /* @__PURE__ */ g(n, {
419
+ /* @__PURE__ */ g(e, {
420
420
  hintText: "數字越大越優先。同一位被代理人同時命中多條規則時,採用優先序最高的那條;優先序相同時採用較早建立的。",
421
421
  label: "優先序",
422
422
  name: "priority",
@@ -427,7 +427,7 @@ function C() {
427
427
  variant: "base"
428
428
  })
429
429
  }),
430
- /* @__PURE__ */ g(n, {
430
+ /* @__PURE__ */ g(e, {
431
431
  label: "起始時間",
432
432
  name: "startAt",
433
433
  children: /* @__PURE__ */ g(u, {
@@ -441,7 +441,7 @@ function C() {
441
441
  value: O(K)
442
442
  })
443
443
  }),
444
- /* @__PURE__ */ g(n, {
444
+ /* @__PURE__ */ g(e, {
445
445
  label: "結束時間",
446
446
  name: "endAt",
447
447
  children: /* @__PURE__ */ g(u, {
@@ -460,7 +460,7 @@ function C() {
460
460
  })
461
461
  ] });
462
462
  }
463
- function w({ hideLabel: e = !1, label: t, layout: r = b, loading: i, name: a, onChange: o, onSearch: s, options: l, required: ee = !0, size: u, value: d }) {
463
+ function w({ hideLabel: t = !1, label: n, layout: r = b, loading: i, name: a, onChange: o, onSearch: s, options: l, required: ee = !0, size: u, value: d }) {
464
464
  let f = /* @__PURE__ */ g(c, {
465
465
  asyncData: !0,
466
466
  disabledOptionsFilter: !0,
@@ -481,18 +481,18 @@ function w({ hideLabel: e = !1, label: t, layout: r = b, loading: i, name: a, on
481
481
  e && s("");
482
482
  },
483
483
  options: [...l],
484
- placeholder: e ? t : "搜尋姓名或信箱",
484
+ placeholder: t ? n : "搜尋姓名或信箱",
485
485
  searchDebounceTime: 300,
486
486
  size: u,
487
487
  value: d
488
488
  });
489
- return e ? /* @__PURE__ */ g(p, {
489
+ return t ? /* @__PURE__ */ g(p, {
490
490
  fullWidth: !0,
491
491
  layout: r,
492
492
  name: a,
493
493
  children: f
494
- }) : /* @__PURE__ */ g(n, {
495
- label: t,
494
+ }) : /* @__PURE__ */ g(e, {
495
+ label: n,
496
496
  layout: r,
497
497
  name: a,
498
498
  required: ee,
@@ -630,7 +630,6 @@ function N(e) {
630
630
  function P(e) {
631
631
  return typeof e == "object" && !!e;
632
632
  }
633
- //#endregion
634
633
  export { C as t };
635
634
 
636
- //# sourceMappingURL=delegations-xUt1tj8d.js.map
635
+ //# sourceMappingURL=delegations-DBh5TT6G.js.map