@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,13 +1,13 @@
1
1
  "use client";
2
- import { t as e } from "../../../chunks/format-date-time-CB-LxzqT.js";
3
- import { t } from "../../../chunks/bpm-form-field-Cao0rMol.js";
2
+ import { t as e } from "../../../chunks/bpm-form-field-9B-Det0u.js";
3
+ import { t } from "../../../chunks/format-date-time-B0LdmWg4.js";
4
4
  import { useCallback as n, useEffect as r, useMemo as i, useState as a } from "react";
5
5
  import { Badge as o, Button as s, Input as c, Modal as l, PageHeader as u, Section as d, SectionGroup as f, Select as p, Table as m, Textarea as h, Toggle as g, Typography as _ } from "@mezzanine-ui/react";
6
6
  import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
7
7
  import x from "@mezzanine-ui/react/ContentHeader";
8
8
  import { PlusIcon as S, TrashIcon as C } from "@mezzanine-ui/icons";
9
9
  import { createWorkflowWebhookEndpoint as w, listWorkflowWebhookEndpointAudits as T, listWorkflowWebhookManagedEndpoints as ee, readWorkflowWebhookEndpointManagement as E, rotateWorkflowWebhookEndpointSecret as te, setWorkflowWebhookEndpointActive as ne, testWorkflowWebhookEndpoint as re, updateWorkflowWebhookEndpoint as ie } from "@rytass/bpm-core-client/template";
10
- //#region src/views/admin/webhook-endpoints/AdminWebhookEndpointsView.tsx
10
+ // src/views/admin/webhook-endpoints/AdminWebhookEndpointsView.tsx
11
11
  var D = {
12
12
  display: "grid",
13
13
  gap: "var(--mzn-spacing-gap-base)"
@@ -183,10 +183,10 @@ function N() {
183
183
  },
184
184
  {
185
185
  key: "updatedAt",
186
- render: ({ endpoint: t }) => /* @__PURE__ */ y(_, {
186
+ render: ({ endpoint: e }) => /* @__PURE__ */ y(_, {
187
187
  component: "span",
188
188
  variant: "body",
189
- children: e(t.updatedAt)
189
+ children: t(e.updatedAt)
190
190
  }),
191
191
  title: "更新時間",
192
192
  width: 180
@@ -345,14 +345,14 @@ function N() {
345
345
  title: `輪替簽章金鑰:${U?.label ?? ""}`,
346
346
  children: /* @__PURE__ */ b("div", {
347
347
  style: D,
348
- children: [/* @__PURE__ */ y(t, {
348
+ children: [/* @__PURE__ */ y(e, {
349
349
  label: "移除金鑰",
350
350
  name: "removeSigningSecret",
351
351
  children: /* @__PURE__ */ y(g, {
352
352
  checked: q,
353
353
  onChange: (e) => J(e.target.checked)
354
354
  })
355
- }), q ? null : /* @__PURE__ */ y(t, {
355
+ }), q ? null : /* @__PURE__ */ y(e, {
356
356
  label: "新金鑰",
357
357
  name: "nextSigningSecret",
358
358
  required: !0,
@@ -390,10 +390,10 @@ function N() {
390
390
  var oe = [
391
391
  {
392
392
  key: "createdAt",
393
- render: ({ audit: t }) => /* @__PURE__ */ y(_, {
393
+ render: ({ audit: e }) => /* @__PURE__ */ y(_, {
394
394
  component: "span",
395
395
  variant: "body",
396
- children: e(t.createdAt)
396
+ children: t(e.createdAt)
397
397
  }),
398
398
  title: "時間",
399
399
  width: 180
@@ -429,17 +429,17 @@ var oe = [
429
429
  width: 160
430
430
  }
431
431
  ];
432
- function se({ draft: e, onCancel: n, onChange: r, onConfirm: i, saving: a }) {
433
- let o = e.mode === "edit", u = I(e), d = e.replaceHeaders || u, f = (t) => r({
434
- ...e,
435
- ...t
436
- }), m = (t, n) => f({ parameters: e.parameters.map((e, r) => r === t ? {
437
- ...e,
432
+ function se({ draft: t, onCancel: n, onChange: r, onConfirm: i, saving: a }) {
433
+ let o = t.mode === "edit", u = I(t), d = t.replaceHeaders || u, f = (e) => r({
434
+ ...t,
435
+ ...e
436
+ }), m = (e, n) => f({ parameters: t.parameters.map((t, r) => r === e ? {
437
+ ...t,
438
438
  ...n
439
- } : e) }), v = (t, n) => f({ headers: e.headers.map((e, r) => r === t ? {
440
- ...e,
439
+ } : t) }), v = (e, n) => f({ headers: t.headers.map((t, r) => r === e ? {
440
+ ...t,
441
441
  ...n
442
- } : e) }), x = (e) => (t) => f({ [e]: t.target.value });
442
+ } : t) }), x = (e) => (t) => f({ [e]: t.target.value });
443
443
  return /* @__PURE__ */ y(l, {
444
444
  cancelText: "取消",
445
445
  confirmText: o ? "儲存" : "建立",
@@ -452,25 +452,25 @@ function se({ draft: e, onCancel: n, onChange: r, onConfirm: i, saving: a }) {
452
452
  showModalFooter: !0,
453
453
  showModalHeader: !0,
454
454
  size: "wide",
455
- supportingText: o ? "參數的鍵、型別與必填是這個版本的契約,無法修改;需要變更請建立新版本。" : e.mode === "version" ? "新版本可調整參數;既有模板仍使用舊版本,直到設計者改選。" : "URL 需符合伺服器設定的白名單。",
456
- title: o ? `編輯端點:${e.label}` : e.mode === "version" ? `建立新版本:${e.key}` : "新增 Webhook 端點",
455
+ supportingText: o ? "參數的鍵、型別與必填是這個版本的契約,無法修改;需要變更請建立新版本。" : t.mode === "version" ? "新版本可調整參數;既有模板仍使用舊版本,直到設計者改選。" : "URL 需符合伺服器設定的白名單。",
456
+ title: o ? `編輯端點:${t.label}` : t.mode === "version" ? `建立新版本:${t.key}` : "新增 Webhook 端點",
457
457
  children: /* @__PURE__ */ b("div", {
458
458
  style: D,
459
459
  children: [
460
- /* @__PURE__ */ y(t, {
460
+ /* @__PURE__ */ y(e, {
461
461
  label: "Key",
462
462
  name: "endpointKey",
463
463
  required: !0,
464
464
  children: /* @__PURE__ */ y(c, {
465
- ...e.mode === "create" ? {} : { readonly: !0 },
465
+ ...t.mode === "create" ? {} : { readonly: !0 },
466
466
  onChange: x("key"),
467
467
  placeholder: "例如 crm.lead-created",
468
- value: e.key,
468
+ value: t.key,
469
469
  inputProps: { autoComplete: "off" },
470
470
  variant: "base"
471
471
  })
472
472
  }),
473
- /* @__PURE__ */ y(t, {
473
+ /* @__PURE__ */ y(e, {
474
474
  label: "版本",
475
475
  name: "endpointVersion",
476
476
  required: !0,
@@ -481,44 +481,44 @@ function se({ draft: e, onCancel: n, onChange: r, onConfirm: i, saving: a }) {
481
481
  inputMode: "numeric"
482
482
  },
483
483
  onChange: x("version"),
484
- value: e.version,
484
+ value: t.version,
485
485
  variant: "base"
486
486
  })
487
487
  }),
488
- /* @__PURE__ */ y(t, {
488
+ /* @__PURE__ */ y(e, {
489
489
  label: "名稱",
490
490
  name: "endpointLabel",
491
491
  required: !0,
492
492
  children: /* @__PURE__ */ y(c, {
493
493
  onChange: x("label"),
494
494
  placeholder: "例如 CRM 建立名單",
495
- value: e.label,
495
+ value: t.label,
496
496
  inputProps: { autoComplete: "off" },
497
497
  variant: "base"
498
498
  })
499
499
  }),
500
- /* @__PURE__ */ y(t, {
500
+ /* @__PURE__ */ y(e, {
501
501
  label: "說明",
502
502
  name: "endpointDescription",
503
503
  children: /* @__PURE__ */ y(h, {
504
504
  onChange: x("description"),
505
505
  rows: 2,
506
- value: e.description
506
+ value: t.description
507
507
  })
508
508
  }),
509
- /* @__PURE__ */ y(t, {
509
+ /* @__PURE__ */ y(e, {
510
510
  label: "URL",
511
511
  name: "endpointUrl",
512
512
  required: !0,
513
513
  children: /* @__PURE__ */ y(c, {
514
514
  onChange: x("url"),
515
515
  placeholder: "https://",
516
- value: e.url,
516
+ value: t.url,
517
517
  inputProps: { autoComplete: "off" },
518
518
  variant: "base"
519
519
  })
520
520
  }),
521
- /* @__PURE__ */ y(t, {
521
+ /* @__PURE__ */ y(e, {
522
522
  label: "Method",
523
523
  name: "endpointMethod",
524
524
  required: !0,
@@ -526,10 +526,10 @@ function se({ draft: e, onCancel: n, onChange: r, onConfirm: i, saving: a }) {
526
526
  clearable: !1,
527
527
  onChange: (e) => f({ method: e?.id ?? "POST" }),
528
528
  options: [...A],
529
- value: A.find((t) => t.id === e.method) ?? null
529
+ value: A.find((e) => e.id === t.method) ?? null
530
530
  })
531
531
  }),
532
- /* @__PURE__ */ y(t, {
532
+ /* @__PURE__ */ y(e, {
533
533
  hintText: "留空使用預設 10 秒,上限 30000 毫秒。",
534
534
  label: "逾時(毫秒)",
535
535
  name: "endpointTimeout",
@@ -539,26 +539,26 @@ function se({ draft: e, onCancel: n, onChange: r, onConfirm: i, saving: a }) {
539
539
  inputMode: "numeric"
540
540
  },
541
541
  onChange: x("timeoutMs"),
542
- value: e.timeoutMs,
542
+ value: t.timeoutMs,
543
543
  variant: "base"
544
544
  })
545
545
  }),
546
- /* @__PURE__ */ y(t, {
546
+ /* @__PURE__ */ y(e, {
547
547
  label: "不建議使用",
548
548
  name: "endpointDeprecated",
549
549
  children: /* @__PURE__ */ y(g, {
550
- checked: e.deprecated,
550
+ checked: t.deprecated,
551
551
  onChange: (e) => f({ deprecated: e.target.checked })
552
552
  })
553
553
  }),
554
- o ? null : /* @__PURE__ */ y(t, {
554
+ o ? null : /* @__PURE__ */ y(e, {
555
555
  hintText: "選填;設定後 BPM 以 HMAC-SHA256 簽章,儲存後不會再顯示。",
556
556
  label: "簽章金鑰",
557
557
  name: "endpointSigningSecret",
558
558
  children: /* @__PURE__ */ y(c, {
559
559
  onChange: x("signingSecret"),
560
560
  placeholder: "選填,儲存後不再顯示",
561
- value: e.signingSecret,
561
+ value: t.signingSecret,
562
562
  inputProps: { autoComplete: "new-password" },
563
563
  variant: "password"
564
564
  })
@@ -567,7 +567,7 @@ function se({ draft: e, onCancel: n, onChange: r, onConfirm: i, saving: a }) {
567
567
  variant: "label-primary-highlight",
568
568
  children: "Headers"
569
569
  }),
570
- o ? /* @__PURE__ */ y(t, {
570
+ o ? /* @__PURE__ */ y(e, {
571
571
  hintText: u ? "URL 已改到其他主機,必須重新輸入 header(留空代表不帶任何 header)。" : "現有 header 的值不會顯示;開啟後以下列內容取代全部 header。",
572
572
  label: "取代 headers",
573
573
  name: "endpointReplaceHeaders",
@@ -577,27 +577,27 @@ function se({ draft: e, onCancel: n, onChange: r, onConfirm: i, saving: a }) {
577
577
  onChange: (e) => f({ replaceHeaders: e.target.checked })
578
578
  })
579
579
  }) : null,
580
- d ? e.headers.map((t, n) => /* @__PURE__ */ b("div", {
580
+ d ? t.headers.map((e, n) => /* @__PURE__ */ b("div", {
581
581
  style: k,
582
582
  children: [
583
583
  /* @__PURE__ */ y(c, {
584
584
  onChange: (e) => v(n, { name: e.target.value }),
585
585
  placeholder: "名稱,例如 Authorization",
586
586
  inputProps: { autoComplete: "off" },
587
- value: t.name,
587
+ value: e.name,
588
588
  variant: "base"
589
589
  }),
590
590
  /* @__PURE__ */ y(c, {
591
591
  onChange: (e) => v(n, { value: e.target.value }),
592
592
  placeholder: "值",
593
- value: t.value,
593
+ value: e.value,
594
594
  inputProps: { autoComplete: "new-password" },
595
595
  variant: "password"
596
596
  }),
597
597
  /* @__PURE__ */ y(s, {
598
598
  icon: C,
599
599
  iconType: "icon-only",
600
- onClick: () => f({ headers: e.headers.filter((e, t) => t !== n) }),
600
+ onClick: () => f({ headers: t.headers.filter((e, t) => t !== n) }),
601
601
  variant: "destructive-text-link",
602
602
  children: "移除 header"
603
603
  })
@@ -606,7 +606,7 @@ function se({ draft: e, onCancel: n, onChange: r, onConfirm: i, saving: a }) {
606
606
  d ? /* @__PURE__ */ y("div", { children: /* @__PURE__ */ y(s, {
607
607
  icon: S,
608
608
  iconType: "leading",
609
- onClick: () => f({ headers: [...e.headers, {
609
+ onClick: () => f({ headers: [...t.headers, {
610
610
  name: "",
611
611
  value: ""
612
612
  }] }),
@@ -617,7 +617,7 @@ function se({ draft: e, onCancel: n, onChange: r, onConfirm: i, saving: a }) {
617
617
  variant: "label-primary-highlight",
618
618
  children: "參數"
619
619
  }),
620
- e.parameters.map((t, n) => /* @__PURE__ */ b("div", {
620
+ t.parameters.map((e, n) => /* @__PURE__ */ b("div", {
621
621
  style: O,
622
622
  children: [
623
623
  /* @__PURE__ */ y(c, {
@@ -625,14 +625,14 @@ function se({ draft: e, onCancel: n, onChange: r, onConfirm: i, saving: a }) {
625
625
  onChange: (e) => m(n, { key: e.target.value }),
626
626
  placeholder: "參數鍵",
627
627
  inputProps: { autoComplete: "off" },
628
- value: t.key,
628
+ value: e.key,
629
629
  variant: "base"
630
630
  }),
631
631
  /* @__PURE__ */ y(c, {
632
632
  onChange: (e) => m(n, { label: e.target.value }),
633
633
  placeholder: "顯示名稱",
634
634
  inputProps: { autoComplete: "off" },
635
- value: t.label,
635
+ value: e.label,
636
636
  variant: "base"
637
637
  }),
638
638
  /* @__PURE__ */ y(p, {
@@ -640,10 +640,10 @@ function se({ draft: e, onCancel: n, onChange: r, onConfirm: i, saving: a }) {
640
640
  disabled: o,
641
641
  onChange: (e) => m(n, { type: L(e?.id ?? null) }),
642
642
  options: [...j],
643
- value: j.find((e) => e.id === t.type) ?? null
643
+ value: j.find((t) => t.id === e.type) ?? null
644
644
  }),
645
645
  /* @__PURE__ */ y(g, {
646
- checked: t.required,
646
+ checked: e.required,
647
647
  disabled: o,
648
648
  label: "必填",
649
649
  onChange: (e) => m(n, { required: e.target.checked })
@@ -652,7 +652,7 @@ function se({ draft: e, onCancel: n, onChange: r, onConfirm: i, saving: a }) {
652
652
  disabled: o,
653
653
  icon: C,
654
654
  iconType: "icon-only",
655
- onClick: () => f({ parameters: e.parameters.filter((e, t) => t !== n) }),
655
+ onClick: () => f({ parameters: t.parameters.filter((e, t) => t !== n) }),
656
656
  variant: "destructive-text-link",
657
657
  children: "移除參數"
658
658
  })
@@ -661,7 +661,7 @@ function se({ draft: e, onCancel: n, onChange: r, onConfirm: i, saving: a }) {
661
661
  o ? null : /* @__PURE__ */ y("div", { children: /* @__PURE__ */ y(s, {
662
662
  icon: S,
663
663
  iconType: "leading",
664
- onClick: () => f({ parameters: [...e.parameters, {
664
+ onClick: () => f({ parameters: [...t.parameters, {
665
665
  description: "",
666
666
  key: "",
667
667
  label: "",
@@ -723,7 +723,6 @@ function R(e) {
723
723
  let t = e.message;
724
724
  return t.includes("WORKFLOW_WEBHOOK_URL_NOT_ALLOWED") ? "URL 不在伺服器允許的白名單內。" : t.includes("WORKFLOW_WEBHOOK_ENDPOINT_KEY_CONFLICT") ? "這個 Key 已由程式註冊的端點使用,請換一個。" : t.includes("WORKFLOW_WEBHOOK_ENDPOINT_CONTRACT_CHANGED") ? "參數契約不能修改,請改用「建立新版本」。" : t.includes("WORKFLOW_WEBHOOK_TEST_RATE_LIMITED") ? "測試送出太頻繁,請稍後再試(每 10 秒一次、10 分鐘最多 5 次)。" : t;
725
725
  }
726
- //#endregion
727
726
  export { N as AdminWebhookEndpointsView };
728
727
 
729
728
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_Fragment","formatDateTime","Fragment$1","ContentHeader","STACK_STYLE","ROW_STYLE","HEADER_ROW_STYLE","METHOD_OPTIONS","PARAMETER_TYPE_OPTIONS","AUDIT_ACTION_LABELS","EMPTY_DRAFT","AdminWebhookEndpointsView","management","setManagement","useState","endpoints","setEndpoints","loading","setLoading","error","setError","notice","setNotice","draft","setDraft","saving","setSaving","rotating","setRotating","nextSecret","setNextSecret","removeSecret","setRemoveSecret","audits","setAudits","refresh","useCallback","nextManagement","readWorkflowWebhookEndpointManagement","listWorkflowWebhookManagedEndpoints","requestError","readErrorMessage","run","work","rows","useMemo","endpoint","columns","Typography","Badge","actions","readEditDraft","readTestNotice","testWorkflowWebhookEndpoint","setWorkflowWebhookEndpointActive","handleSaveDraft","saved","parameters","parameter","headers","header","timeoutMs","updateWorkflowWebhookEndpoint","isOriginChanged","createWorkflowWebhookEndpoint","handleRotate","rotateWorkflowWebhookEndpointSecret","enabled","PageHeader","Button","PlusIcon","SectionGroup","Section","Table","EndpointDraftModal","Modal","BPMFormField","Toggle","event","Input","AUDIT_COLUMNS","audit","editing","originChanged","replaceHeaders","update","onChange","patch","updateParameter","current","index","updateHeader","text","field","onCancel","Textarea","Select","option","TrashIcon","readParameterType","mode","result","origin","url","id","message"],"sources":["../../../../src/views/admin/webhook-endpoints/AdminWebhookEndpointsView.tsx"],"sourcesContent":["'use client';\n\nimport {\n ChangeEvent,\n CSSProperties,\n ReactElement,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n Badge,\n Button,\n Input,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Select,\n Table,\n Textarea,\n Toggle,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon, TrashIcon } from '@mezzanine-ui/icons';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { NotifyWebhookParameterType } from '@rytass/bpm-core-shared/workflow';\nimport {\n WorkflowWebhookEndpointAuditRecord,\n WorkflowWebhookEndpointManagementRecord,\n WorkflowWebhookEndpointTestResultRecord,\n WorkflowWebhookManagedEndpointRecord,\n createWorkflowWebhookEndpoint,\n listWorkflowWebhookEndpointAudits,\n listWorkflowWebhookManagedEndpoints,\n readWorkflowWebhookEndpointManagement,\n rotateWorkflowWebhookEndpointSecret,\n setWorkflowWebhookEndpointActive,\n testWorkflowWebhookEndpoint,\n updateWorkflowWebhookEndpoint,\n} from '@rytass/bpm-core-client/template';\nimport { BPMFormField } from '../../../components/bpm-form-field';\nimport { formatDateTime } from '../../../lib/format-date-time';\n\ntype SelectOption = Readonly<{ id: string; name: string }>;\n\ntype EndpointRow = Readonly<\n Record<string, unknown> & {\n endpoint: WorkflowWebhookManagedEndpointRecord;\n key: string;\n }\n>;\n\ntype AuditRow = Readonly<\n Record<string, unknown> & {\n audit: WorkflowWebhookEndpointAuditRecord;\n key: string;\n }\n>;\n\ntype ParameterDraft = Readonly<{\n description: string;\n key: string;\n label: string;\n required: boolean;\n type: NotifyWebhookParameterType;\n}>;\n\ntype HeaderDraft = Readonly<{ name: string; value: string }>;\n\n/**\n * `mode` decides what can change: a new endpoint (or a new version of one)\n * sets everything; editing keeps the parameter contract and only replaces\n * headers when asked to.\n */\ntype EndpointDraft = Readonly<{\n deprecated: boolean;\n description: string;\n endpointId: string | null;\n headers: readonly HeaderDraft[];\n key: string;\n label: string;\n method: string;\n mode: 'create' | 'edit' | 'version';\n /** The stored URL when editing, to spot a move to another host. */\n originalUrl: string;\n parameters: readonly ParameterDraft[];\n replaceHeaders: boolean;\n signingSecret: string;\n timeoutMs: string;\n url: string;\n version: string;\n}>;\n\nconst STACK_STYLE: CSSProperties = {\n display: 'grid',\n gap: 'var(--mzn-spacing-gap-base)',\n};\n\nconst ROW_STYLE: CSSProperties = {\n alignItems: 'center',\n display: 'grid',\n gap: 'var(--mzn-spacing-gap-base)',\n gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) auto auto',\n};\n\nconst HEADER_ROW_STYLE: CSSProperties = {\n alignItems: 'center',\n display: 'grid',\n gap: 'var(--mzn-spacing-gap-base)',\n gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 2fr) auto',\n};\n\nconst METHOD_OPTIONS: readonly SelectOption[] = [\n { id: 'POST', name: 'POST' },\n { id: 'PUT', name: 'PUT' },\n { id: 'PATCH', name: 'PATCH' },\n];\n\nconst PARAMETER_TYPE_OPTIONS: readonly SelectOption[] = [\n { id: 'string', name: '文字' },\n { id: 'number', name: '數字' },\n { id: 'boolean', name: '是/否' },\n { id: 'stringArray', name: '文字清單' },\n { id: 'json', name: 'JSON' },\n];\n\nconst AUDIT_ACTION_LABELS: Readonly<\n Record<WorkflowWebhookEndpointAuditRecord['action'], string>\n> = {\n CREATED: '建立',\n DISABLED: '停用',\n ENABLED: '啟用',\n SECRET_ROTATED: '輪替金鑰',\n TEST_SENT: '測試送出',\n UPDATED: '更新',\n};\n\nconst EMPTY_DRAFT: EndpointDraft = {\n deprecated: false,\n description: '',\n endpointId: null,\n headers: [],\n key: '',\n label: '',\n method: 'POST',\n mode: 'create',\n originalUrl: '',\n parameters: [],\n replaceHeaders: true,\n signingSecret: '',\n timeoutMs: '',\n url: '',\n version: '1',\n};\n\n/**\n * Back-office management of database webhook endpoints (ADR 18 §3.13):\n * create, edit, disable, rotate the signing secret, test-send and read the\n * change history. Header values and secrets are entered here and never shown\n * again. Administrator-only on the server.\n */\nexport function AdminWebhookEndpointsView(): ReactElement {\n const [management, setManagement] =\n useState<WorkflowWebhookEndpointManagementRecord | null>(null);\n const [endpoints, setEndpoints] = useState<\n readonly WorkflowWebhookManagedEndpointRecord[]\n >([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const [draft, setDraft] = useState<EndpointDraft | null>(null);\n const [saving, setSaving] = useState(false);\n const [rotating, setRotating] =\n useState<WorkflowWebhookManagedEndpointRecord | null>(null);\n const [nextSecret, setNextSecret] = useState('');\n const [removeSecret, setRemoveSecret] = useState(false);\n const [audits, setAudits] = useState<{\n readonly endpoint: WorkflowWebhookManagedEndpointRecord;\n readonly records: readonly WorkflowWebhookEndpointAuditRecord[];\n } | null>(null);\n\n const refresh = useCallback(async (): Promise<void> => {\n setLoading(true);\n\n try {\n const nextManagement = await readWorkflowWebhookEndpointManagement();\n\n setManagement(nextManagement);\n setEndpoints(\n nextManagement.enabled\n ? await listWorkflowWebhookManagedEndpoints()\n : [],\n );\n setError(null);\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect((): void => {\n void refresh();\n }, [refresh]);\n\n const run = useCallback(\n async (work: () => Promise<string | null>): Promise<boolean> => {\n setError(null);\n setNotice(null);\n\n try {\n setNotice(await work());\n await refresh();\n\n return true;\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n\n return false;\n }\n },\n [refresh],\n );\n\n const rows = useMemo(\n (): EndpointRow[] =>\n endpoints.map((endpoint) => ({ endpoint, key: endpoint.id })),\n [endpoints],\n );\n\n const columns = useMemo(\n (): TableColumn<EndpointRow>[] => [\n {\n key: 'label',\n render: ({ endpoint }: EndpointRow): ReactElement => (\n <div style={STACK_STYLE}>\n <Typography component=\"span\" variant=\"body\">\n {endpoint.label}\n </Typography>\n <Typography color=\"text-neutral\" component=\"span\" variant=\"caption\">\n {endpoint.key}@{endpoint.version} · 參數{' '}\n {endpoint.parameters.length} 個\n </Typography>\n </div>\n ),\n title: '端點',\n width: 240,\n },\n {\n key: 'url',\n render: ({ endpoint }: EndpointRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {endpoint.method} {endpoint.url}\n </Typography>\n ),\n title: 'URL',\n width: 320,\n },\n {\n key: 'status',\n render: ({ endpoint }: EndpointRow): ReactElement =>\n !endpoint.active ? (\n <Badge size=\"sub\" text=\"已停用\" variant=\"dot-inactive\" />\n ) : endpoint.deprecated ? (\n <Badge size=\"sub\" text=\"不建議使用\" variant=\"dot-warning\" />\n ) : (\n <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />\n ),\n title: '狀態',\n width: 120,\n },\n {\n key: 'credentials',\n render: ({ endpoint }: EndpointRow): ReactElement => (\n <div style={STACK_STYLE}>\n <Typography component=\"span\" variant=\"body\">\n {endpoint.hasSigningSecret ? '已設定簽章金鑰' : '未簽章'}\n </Typography>\n <Typography color=\"text-neutral\" component=\"span\" variant=\"caption\">\n {endpoint.headerNames.length\n ? `Header:${endpoint.headerNames.join('、')}`\n : '沒有自訂 header'}\n </Typography>\n </div>\n ),\n title: '憑證',\n width: 200,\n },\n {\n key: 'updatedAt',\n render: ({ endpoint }: EndpointRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(endpoint.updatedAt)}\n </Typography>\n ),\n title: '更新時間',\n width: 180,\n },\n ],\n [],\n );\n\n const actions = useMemo(\n (): TableActions<EndpointRow> => ({\n render: ({\n endpoint,\n }): ReturnType<TableActions<EndpointRow>['render']> => [\n {\n name: '編輯',\n onClick: (): void => setDraft(readEditDraft(endpoint, 'edit')),\n },\n {\n name: '建立新版本',\n onClick: (): void => setDraft(readEditDraft(endpoint, 'version')),\n },\n {\n name: '測試送出',\n onClick: (): void => {\n void run(async () =>\n readTestNotice(\n endpoint,\n await testWorkflowWebhookEndpoint(endpoint.id),\n ),\n );\n },\n },\n {\n name: '輪替金鑰',\n onClick: (): void => {\n setNextSecret('');\n setRemoveSecret(false);\n setRotating(endpoint);\n },\n },\n {\n name: endpoint.active ? '停用' : '啟用',\n onClick: (): void => {\n void run(async () => {\n await setWorkflowWebhookEndpointActive(\n endpoint.id,\n !endpoint.active,\n );\n\n return `已${endpoint.active ? '停用' : '啟用'}「${endpoint.label}」。`;\n });\n },\n },\n {\n name: '異動紀錄',\n onClick: (): void => {\n void listWorkflowWebhookEndpointAudits(endpoint.id)\n .then((records): void => setAudits({ endpoint, records }))\n .catch((requestError: unknown): void =>\n setError(readErrorMessage(requestError)),\n );\n },\n },\n ],\n variant: 'base-secondary',\n width: 180,\n }),\n [run],\n );\n\n async function handleSaveDraft(): Promise<void> {\n if (!draft) {\n return;\n }\n\n setSaving(true);\n\n const saved = await run(async () => {\n const parameters = draft.parameters.map((parameter) => ({\n description: parameter.description.trim() || null,\n key: parameter.key.trim(),\n label: parameter.label.trim(),\n required: parameter.required,\n type: parameter.type,\n }));\n const headers = draft.headers\n .filter((header) => header.name.trim())\n .map((header) => ({ name: header.name.trim(), value: header.value }));\n const timeoutMs = draft.timeoutMs.trim() ? Number(draft.timeoutMs) : null;\n\n if (draft.mode === 'edit' && draft.endpointId) {\n await updateWorkflowWebhookEndpoint({\n deprecated: draft.deprecated,\n description: draft.description,\n headers:\n draft.replaceHeaders || isOriginChanged(draft) ? headers : null,\n id: draft.endpointId,\n label: draft.label,\n method: draft.method,\n parameters,\n timeoutMs,\n url: draft.url,\n });\n\n return `已更新「${draft.label}」。`;\n }\n\n await createWorkflowWebhookEndpoint({\n deprecated: draft.deprecated,\n description: draft.description,\n headers,\n key: draft.key,\n label: draft.label,\n method: draft.method,\n parameters,\n signingSecret: draft.signingSecret || null,\n timeoutMs,\n url: draft.url,\n version: Number(draft.version),\n });\n\n return `已建立「${draft.label}」v${draft.version},設計器現在可以選用。`;\n });\n\n setSaving(false);\n\n if (saved) {\n setDraft(null);\n }\n }\n\n async function handleRotate(): Promise<void> {\n if (!rotating) {\n return;\n }\n\n const endpoint = rotating;\n const done = await run(async () => {\n await rotateWorkflowWebhookEndpointSecret(\n endpoint.id,\n removeSecret ? null : nextSecret,\n );\n\n return removeSecret\n ? `已移除「${endpoint.label}」的簽章金鑰,之後的請求不再簽章。`\n : `已輪替「${endpoint.label}」的簽章金鑰,接收端需改用新金鑰驗簽。`;\n });\n\n if (done) {\n setRotating(null);\n setNextSecret('');\n }\n }\n\n const enabled = Boolean(management?.enabled);\n\n return (\n <>\n <PageHeader>\n <ContentHeader\n description=\"維護知會節點可呼叫的外部系統端點。Header 值與簽章金鑰加密保存,儲存後不會再顯示。\"\n title=\"Webhook 端點\"\n >\n <Button\n disabled={!enabled}\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void => setDraft(EMPTY_DRAFT)}\n variant=\"base-primary\"\n >\n 新增端點\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section>\n <div style={STACK_STYLE}>\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n {notice ? (\n <Typography color=\"text-success\" variant=\"body\">\n {notice}\n </Typography>\n ) : null}\n {management && !enabled ? (\n <Typography color=\"text-warning\" variant=\"body\">\n 此伺服器未啟用後台維護的 Webhook 端點:需要設定\n workflowWebhookTargetSources 含 DATABASE、URL\n 白名單與加密金鑰。程式註冊的端點不受影響。\n </Typography>\n ) : null}\n {enabled ? (\n <Typography color=\"text-neutral\" variant=\"caption\">\n 允許的 URL:{management?.allowedUrlPatterns.join('、')}\n </Typography>\n ) : null}\n <Table\n actions={actions}\n columns={columns}\n dataSource={rows}\n fullWidth\n loading={loading}\n />\n </div>\n </Section>\n </SectionGroup>\n\n {draft ? (\n <EndpointDraftModal\n draft={draft}\n onCancel={(): void => setDraft(null)}\n onChange={setDraft}\n onConfirm={(): void => void handleSaveDraft()}\n saving={saving}\n />\n ) : null}\n\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{ disabled: !removeSecret && !nextSecret }}\n confirmText={removeSecret ? '移除金鑰' : '輪替金鑰'}\n modalType=\"standard\"\n onCancel={(): void => setRotating(null)}\n onClose={(): void => setRotating(null)}\n onConfirm={(): void => void handleRotate()}\n open={Boolean(rotating)}\n showModalFooter\n showModalHeader\n supportingText=\"新金鑰會加密保存,不會再顯示;請同時更新接收端的驗簽金鑰。\"\n title={`輪替簽章金鑰:${rotating?.label ?? ''}`}\n >\n <div style={STACK_STYLE}>\n <BPMFormField label=\"移除金鑰\" name=\"removeSigningSecret\">\n <Toggle\n checked={removeSecret}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n setRemoveSecret(event.target.checked)\n }\n />\n </BPMFormField>\n {removeSecret ? null : (\n <BPMFormField label=\"新金鑰\" name=\"nextSigningSecret\" required>\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n setNextSecret(event.target.value)\n }\n value={nextSecret}\n inputProps={{ autoComplete: 'new-password' }}\n variant=\"password\"\n />\n </BPMFormField>\n )}\n </div>\n </Modal>\n\n <Modal\n confirmText=\"關閉\"\n modalType=\"standard\"\n onClose={(): void => setAudits(null)}\n onConfirm={(): void => setAudits(null)}\n open={Boolean(audits)}\n showModalFooter\n showModalHeader\n size=\"wide\"\n supportingText=\"只記錄誰在何時變更了哪些欄位,不記錄任何值。\"\n title={`異動紀錄:${audits?.endpoint.label ?? ''}`}\n >\n <Table\n columns={AUDIT_COLUMNS}\n dataSource={(audits?.records ?? []).map((audit): AuditRow => ({\n audit,\n key: audit.id,\n }))}\n fullWidth\n />\n </Modal>\n </>\n );\n}\n\nconst AUDIT_COLUMNS: TableColumn<AuditRow>[] = [\n {\n key: 'createdAt',\n render: ({ audit }: AuditRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(audit.createdAt)}\n </Typography>\n ),\n title: '時間',\n width: 180,\n },\n {\n key: 'action',\n render: ({ audit }: AuditRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {AUDIT_ACTION_LABELS[audit.action]}\n </Typography>\n ),\n title: '動作',\n width: 120,\n },\n {\n key: 'changedFields',\n render: ({ audit }: AuditRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {audit.changedFields.join('、') || '—'}\n </Typography>\n ),\n title: '欄位',\n width: 280,\n },\n {\n key: 'actor',\n render: ({ audit }: AuditRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {audit.actorMemberId ?? '系統'}\n </Typography>\n ),\n title: '操作者',\n width: 160,\n },\n];\n\nfunction EndpointDraftModal({\n draft,\n onCancel,\n onChange,\n onConfirm,\n saving,\n}: {\n readonly draft: EndpointDraft;\n readonly onCancel: () => void;\n readonly onChange: (draft: EndpointDraft) => void;\n readonly onConfirm: () => void;\n readonly saving: boolean;\n}): ReactElement {\n const editing = draft.mode === 'edit';\n // Stored header values must not follow the URL to another host, so a new\n // host always means entering the headers again.\n const originChanged = isOriginChanged(draft);\n const replaceHeaders = draft.replaceHeaders || originChanged;\n const update = (patch: Partial<EndpointDraft>): void =>\n onChange({ ...draft, ...patch });\n const updateParameter = (\n index: number,\n patch: Partial<ParameterDraft>,\n ): void =>\n update({\n parameters: draft.parameters.map((parameter, current) =>\n current === index ? { ...parameter, ...patch } : parameter,\n ),\n });\n const updateHeader = (index: number, patch: Partial<HeaderDraft>): void =>\n update({\n headers: draft.headers.map((header, current) =>\n current === index ? { ...header, ...patch } : header,\n ),\n });\n const text =\n (field: keyof EndpointDraft) =>\n (event: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>): void =>\n update({ [field]: event.target.value });\n\n return (\n <Modal\n cancelText=\"取消\"\n confirmText={editing ? '儲存' : '建立'}\n loading={saving}\n modalType=\"standard\"\n onCancel={onCancel}\n onClose={onCancel}\n onConfirm={onConfirm}\n open\n showModalFooter\n showModalHeader\n size=\"wide\"\n supportingText={\n editing\n ? '參數的鍵、型別與必填是這個版本的契約,無法修改;需要變更請建立新版本。'\n : draft.mode === 'version'\n ? '新版本可調整參數;既有模板仍使用舊版本,直到設計者改選。'\n : 'URL 需符合伺服器設定的白名單。'\n }\n title={\n editing\n ? `編輯端點:${draft.label}`\n : draft.mode === 'version'\n ? `建立新版本:${draft.key}`\n : '新增 Webhook 端點'\n }\n >\n <div style={STACK_STYLE}>\n <BPMFormField label=\"Key\" name=\"endpointKey\" required>\n <Input\n {...(draft.mode === 'create' ? {} : { readonly: true as const })}\n onChange={text('key')}\n placeholder=\"例如 crm.lead-created\"\n value={draft.key}\n inputProps={{ autoComplete: 'off' }}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"版本\" name=\"endpointVersion\" required>\n <Input\n {...(editing ? { readonly: true as const } : {})}\n inputProps={{ autoComplete: 'off', inputMode: 'numeric' }}\n onChange={text('version')}\n value={draft.version}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"名稱\" name=\"endpointLabel\" required>\n <Input\n onChange={text('label')}\n placeholder=\"例如 CRM 建立名單\"\n value={draft.label}\n inputProps={{ autoComplete: 'off' }}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"說明\" name=\"endpointDescription\">\n <Textarea\n onChange={text('description')}\n rows={2}\n value={draft.description}\n />\n </BPMFormField>\n <BPMFormField label=\"URL\" name=\"endpointUrl\" required>\n <Input\n onChange={text('url')}\n placeholder=\"https://\"\n value={draft.url}\n inputProps={{ autoComplete: 'off' }}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"Method\" name=\"endpointMethod\" required>\n <Select\n clearable={false}\n onChange={(option): void =>\n update({ method: option?.id ?? 'POST' })\n }\n options={[...METHOD_OPTIONS]}\n value={\n METHOD_OPTIONS.find((option) => option.id === draft.method) ??\n null\n }\n />\n </BPMFormField>\n <BPMFormField\n hintText=\"留空使用預設 10 秒,上限 30000 毫秒。\"\n label=\"逾時(毫秒)\"\n name=\"endpointTimeout\"\n >\n <Input\n inputProps={{ autoComplete: 'off', inputMode: 'numeric' }}\n onChange={text('timeoutMs')}\n value={draft.timeoutMs}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"不建議使用\" name=\"endpointDeprecated\">\n <Toggle\n checked={draft.deprecated}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n update({ deprecated: event.target.checked })\n }\n />\n </BPMFormField>\n {editing ? null : (\n <BPMFormField\n hintText=\"選填;設定後 BPM 以 HMAC-SHA256 簽章,儲存後不會再顯示。\"\n label=\"簽章金鑰\"\n name=\"endpointSigningSecret\"\n >\n <Input\n onChange={text('signingSecret')}\n placeholder=\"選填,儲存後不再顯示\"\n value={draft.signingSecret}\n inputProps={{ autoComplete: 'new-password' }}\n variant=\"password\"\n />\n </BPMFormField>\n )}\n\n <Typography variant=\"label-primary-highlight\">Headers</Typography>\n {editing ? (\n <BPMFormField\n hintText={\n originChanged\n ? 'URL 已改到其他主機,必須重新輸入 header(留空代表不帶任何 header)。'\n : '現有 header 的值不會顯示;開啟後以下列內容取代全部 header。'\n }\n label=\"取代 headers\"\n name=\"endpointReplaceHeaders\"\n >\n <Toggle\n checked={replaceHeaders}\n disabled={originChanged}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n update({ replaceHeaders: event.target.checked })\n }\n />\n </BPMFormField>\n ) : null}\n {replaceHeaders\n ? draft.headers.map((header, index): ReactElement => (\n <div key={index} style={HEADER_ROW_STYLE}>\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateHeader(index, { name: event.target.value })\n }\n placeholder=\"名稱,例如 Authorization\"\n inputProps={{ autoComplete: 'off' }}\n value={header.name}\n variant=\"base\"\n />\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateHeader(index, { value: event.target.value })\n }\n placeholder=\"值\"\n value={header.value}\n inputProps={{ autoComplete: 'new-password' }}\n variant=\"password\"\n />\n <Button\n icon={TrashIcon}\n iconType=\"icon-only\"\n onClick={(): void =>\n update({\n headers: draft.headers.filter(\n (_header, current) => current !== index,\n ),\n })\n }\n variant=\"destructive-text-link\"\n >\n 移除 header\n </Button>\n </div>\n ))\n : null}\n {replaceHeaders ? (\n <div>\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void =>\n update({ headers: [...draft.headers, { name: '', value: '' }] })\n }\n variant=\"base-dashed\"\n >\n 新增 header\n </Button>\n </div>\n ) : null}\n\n <Typography variant=\"label-primary-highlight\">參數</Typography>\n {draft.parameters.map((parameter, index): ReactElement => (\n <div key={index} style={ROW_STYLE}>\n <Input\n {...(editing ? { readonly: true as const } : {})}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateParameter(index, { key: event.target.value })\n }\n placeholder=\"參數鍵\"\n inputProps={{ autoComplete: 'off' }}\n value={parameter.key}\n variant=\"base\"\n />\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateParameter(index, { label: event.target.value })\n }\n placeholder=\"顯示名稱\"\n inputProps={{ autoComplete: 'off' }}\n value={parameter.label}\n variant=\"base\"\n />\n <Select\n clearable={false}\n disabled={editing}\n onChange={(option): void =>\n updateParameter(index, {\n type: readParameterType(option?.id ?? null),\n })\n }\n options={[...PARAMETER_TYPE_OPTIONS]}\n value={\n PARAMETER_TYPE_OPTIONS.find(\n (option) => option.id === parameter.type,\n ) ?? null\n }\n />\n <Toggle\n checked={parameter.required}\n disabled={editing}\n label=\"必填\"\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateParameter(index, { required: event.target.checked })\n }\n />\n <Button\n disabled={editing}\n icon={TrashIcon}\n iconType=\"icon-only\"\n onClick={(): void =>\n update({\n parameters: draft.parameters.filter(\n (_parameter, current) => current !== index,\n ),\n })\n }\n variant=\"destructive-text-link\"\n >\n 移除參數\n </Button>\n </div>\n ))}\n {editing ? null : (\n <div>\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void =>\n update({\n parameters: [\n ...draft.parameters,\n {\n description: '',\n key: '',\n label: '',\n required: false,\n type: 'string',\n },\n ],\n })\n }\n variant=\"base-dashed\"\n >\n 新增參數\n </Button>\n </div>\n )}\n </div>\n </Modal>\n );\n}\n\nfunction readEditDraft(\n endpoint: WorkflowWebhookManagedEndpointRecord,\n mode: 'edit' | 'version',\n): EndpointDraft {\n return {\n deprecated: endpoint.deprecated,\n description: endpoint.description ?? '',\n endpointId: mode === 'edit' ? endpoint.id : null,\n headers: [],\n key: endpoint.key,\n label: endpoint.label,\n method: endpoint.method,\n mode,\n originalUrl: endpoint.url,\n parameters: endpoint.parameters.map((parameter) => ({\n description: parameter.description ?? '',\n key: parameter.key,\n label: parameter.label,\n required: parameter.required,\n type: parameter.type,\n })),\n // A new version starts without credentials: they are not readable.\n replaceHeaders: mode === 'version',\n signingSecret: '',\n timeoutMs: endpoint.timeoutMs ? String(endpoint.timeoutMs) : '',\n url: endpoint.url,\n version: String(\n mode === 'version' ? endpoint.version + 1 : endpoint.version,\n ),\n };\n}\n\nfunction readTestNotice(\n endpoint: WorkflowWebhookManagedEndpointRecord,\n result: WorkflowWebhookEndpointTestResultRecord,\n): string {\n if (result.ok) {\n return `測試送出成功:「${endpoint.label}」回應 HTTP ${result.status ?? ''}。`;\n }\n\n throw new Error(\n `測試送出失敗:「${endpoint.label}」${result.status ? `回應 HTTP ${result.status}` : ''}(${result.errorCode ?? '未知錯誤'})${result.errorDetail ? `:${result.errorDetail}` : ''}`,\n );\n}\n\nfunction isOriginChanged(draft: EndpointDraft): boolean {\n if (draft.mode !== 'edit') {\n return false;\n }\n\n const origin = (url: string): string => {\n try {\n return new URL(url.trim()).origin;\n } catch {\n return url.trim();\n }\n };\n\n return origin(draft.url) !== origin(draft.originalUrl);\n}\n\nfunction readParameterType(id: string | null): NotifyWebhookParameterType {\n return PARAMETER_TYPE_OPTIONS.some((option) => option.id === id)\n ? (id as NotifyWebhookParameterType)\n : 'string';\n}\n\nfunction readErrorMessage(error: unknown): string {\n if (!(error instanceof Error)) {\n return '發生未知錯誤';\n }\n\n const message = error.message;\n\n if (message.includes('WORKFLOW_WEBHOOK_URL_NOT_ALLOWED')) {\n return 'URL 不在伺服器允許的白名單內。';\n }\n\n if (message.includes('WORKFLOW_WEBHOOK_ENDPOINT_KEY_CONFLICT')) {\n return '這個 Key 已由程式註冊的端點使用,請換一個。';\n }\n\n if (message.includes('WORKFLOW_WEBHOOK_ENDPOINT_CONTRACT_CHANGED')) {\n return '參數契約不能修改,請改用「建立新版本」。';\n }\n\n if (message.includes('WORKFLOW_WEBHOOK_TEST_RATE_LIMITED')) {\n return '測試送出太頻繁,請稍後再試(每 10 秒一次、10 分鐘最多 5 次)。';\n }\n\n return message;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["_Fragment","BPMFormField","Fragment$1","ContentHeader","STACK_STYLE","ROW_STYLE","HEADER_ROW_STYLE","METHOD_OPTIONS","PARAMETER_TYPE_OPTIONS","AUDIT_ACTION_LABELS","EMPTY_DRAFT","AdminWebhookEndpointsView","management","setManagement","useState","endpoints","setEndpoints","loading","setLoading","error","setError","notice","setNotice","draft","setDraft","saving","setSaving","rotating","setRotating","nextSecret","setNextSecret","removeSecret","setRemoveSecret","audits","setAudits","refresh","useCallback","nextManagement","readWorkflowWebhookEndpointManagement","listWorkflowWebhookManagedEndpoints","requestError","readErrorMessage","run","work","rows","useMemo","endpoint","columns","Typography","Badge","formatDateTime","actions","readEditDraft","readTestNotice","testWorkflowWebhookEndpoint","setWorkflowWebhookEndpointActive","handleSaveDraft","saved","parameters","parameter","headers","header","timeoutMs","updateWorkflowWebhookEndpoint","isOriginChanged","createWorkflowWebhookEndpoint","handleRotate","rotateWorkflowWebhookEndpointSecret","enabled","PageHeader","Button","PlusIcon","SectionGroup","Section","Table","EndpointDraftModal","Modal","Toggle","event","Input","AUDIT_COLUMNS","audit","editing","originChanged","replaceHeaders","update","onChange","patch","updateParameter","current","index","updateHeader","text","field","onCancel","Textarea","Select","option","TrashIcon","readParameterType","mode","result","origin","url","id","message"],"sources":["../../../../src/views/admin/webhook-endpoints/AdminWebhookEndpointsView.tsx"],"sourcesContent":["'use client';\n\nimport {\n ChangeEvent,\n CSSProperties,\n ReactElement,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n Badge,\n Button,\n Input,\n Modal,\n PageHeader,\n Section,\n SectionGroup,\n Select,\n Table,\n Textarea,\n Toggle,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon, TrashIcon } from '@mezzanine-ui/icons';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport { NotifyWebhookParameterType } from '@rytass/bpm-core-shared/workflow';\nimport {\n WorkflowWebhookEndpointAuditRecord,\n WorkflowWebhookEndpointManagementRecord,\n WorkflowWebhookEndpointTestResultRecord,\n WorkflowWebhookManagedEndpointRecord,\n createWorkflowWebhookEndpoint,\n listWorkflowWebhookEndpointAudits,\n listWorkflowWebhookManagedEndpoints,\n readWorkflowWebhookEndpointManagement,\n rotateWorkflowWebhookEndpointSecret,\n setWorkflowWebhookEndpointActive,\n testWorkflowWebhookEndpoint,\n updateWorkflowWebhookEndpoint,\n} from '@rytass/bpm-core-client/template';\nimport { BPMFormField } from '../../../components/bpm-form-field';\nimport { formatDateTime } from '../../../lib/format-date-time';\n\ntype SelectOption = Readonly<{ id: string; name: string }>;\n\ntype EndpointRow = Readonly<\n Record<string, unknown> & {\n endpoint: WorkflowWebhookManagedEndpointRecord;\n key: string;\n }\n>;\n\ntype AuditRow = Readonly<\n Record<string, unknown> & {\n audit: WorkflowWebhookEndpointAuditRecord;\n key: string;\n }\n>;\n\ntype ParameterDraft = Readonly<{\n description: string;\n key: string;\n label: string;\n required: boolean;\n type: NotifyWebhookParameterType;\n}>;\n\ntype HeaderDraft = Readonly<{ name: string; value: string }>;\n\n/**\n * `mode` decides what can change: a new endpoint (or a new version of one)\n * sets everything; editing keeps the parameter contract and only replaces\n * headers when asked to.\n */\ntype EndpointDraft = Readonly<{\n deprecated: boolean;\n description: string;\n endpointId: string | null;\n headers: readonly HeaderDraft[];\n key: string;\n label: string;\n method: string;\n mode: 'create' | 'edit' | 'version';\n /** The stored URL when editing, to spot a move to another host. */\n originalUrl: string;\n parameters: readonly ParameterDraft[];\n replaceHeaders: boolean;\n signingSecret: string;\n timeoutMs: string;\n url: string;\n version: string;\n}>;\n\nconst STACK_STYLE: CSSProperties = {\n display: 'grid',\n gap: 'var(--mzn-spacing-gap-base)',\n};\n\nconst ROW_STYLE: CSSProperties = {\n alignItems: 'center',\n display: 'grid',\n gap: 'var(--mzn-spacing-gap-base)',\n gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) auto auto',\n};\n\nconst HEADER_ROW_STYLE: CSSProperties = {\n alignItems: 'center',\n display: 'grid',\n gap: 'var(--mzn-spacing-gap-base)',\n gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 2fr) auto',\n};\n\nconst METHOD_OPTIONS: readonly SelectOption[] = [\n { id: 'POST', name: 'POST' },\n { id: 'PUT', name: 'PUT' },\n { id: 'PATCH', name: 'PATCH' },\n];\n\nconst PARAMETER_TYPE_OPTIONS: readonly SelectOption[] = [\n { id: 'string', name: '文字' },\n { id: 'number', name: '數字' },\n { id: 'boolean', name: '是/否' },\n { id: 'stringArray', name: '文字清單' },\n { id: 'json', name: 'JSON' },\n];\n\nconst AUDIT_ACTION_LABELS: Readonly<\n Record<WorkflowWebhookEndpointAuditRecord['action'], string>\n> = {\n CREATED: '建立',\n DISABLED: '停用',\n ENABLED: '啟用',\n SECRET_ROTATED: '輪替金鑰',\n TEST_SENT: '測試送出',\n UPDATED: '更新',\n};\n\nconst EMPTY_DRAFT: EndpointDraft = {\n deprecated: false,\n description: '',\n endpointId: null,\n headers: [],\n key: '',\n label: '',\n method: 'POST',\n mode: 'create',\n originalUrl: '',\n parameters: [],\n replaceHeaders: true,\n signingSecret: '',\n timeoutMs: '',\n url: '',\n version: '1',\n};\n\n/**\n * Back-office management of database webhook endpoints (ADR 18 §3.13):\n * create, edit, disable, rotate the signing secret, test-send and read the\n * change history. Header values and secrets are entered here and never shown\n * again. Administrator-only on the server.\n */\nexport function AdminWebhookEndpointsView(): ReactElement {\n const [management, setManagement] =\n useState<WorkflowWebhookEndpointManagementRecord | null>(null);\n const [endpoints, setEndpoints] = useState<\n readonly WorkflowWebhookManagedEndpointRecord[]\n >([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const [draft, setDraft] = useState<EndpointDraft | null>(null);\n const [saving, setSaving] = useState(false);\n const [rotating, setRotating] =\n useState<WorkflowWebhookManagedEndpointRecord | null>(null);\n const [nextSecret, setNextSecret] = useState('');\n const [removeSecret, setRemoveSecret] = useState(false);\n const [audits, setAudits] = useState<{\n readonly endpoint: WorkflowWebhookManagedEndpointRecord;\n readonly records: readonly WorkflowWebhookEndpointAuditRecord[];\n } | null>(null);\n\n const refresh = useCallback(async (): Promise<void> => {\n setLoading(true);\n\n try {\n const nextManagement = await readWorkflowWebhookEndpointManagement();\n\n setManagement(nextManagement);\n setEndpoints(\n nextManagement.enabled\n ? await listWorkflowWebhookManagedEndpoints()\n : [],\n );\n setError(null);\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect((): void => {\n void refresh();\n }, [refresh]);\n\n const run = useCallback(\n async (work: () => Promise<string | null>): Promise<boolean> => {\n setError(null);\n setNotice(null);\n\n try {\n setNotice(await work());\n await refresh();\n\n return true;\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n\n return false;\n }\n },\n [refresh],\n );\n\n const rows = useMemo(\n (): EndpointRow[] =>\n endpoints.map((endpoint) => ({ endpoint, key: endpoint.id })),\n [endpoints],\n );\n\n const columns = useMemo(\n (): TableColumn<EndpointRow>[] => [\n {\n key: 'label',\n render: ({ endpoint }: EndpointRow): ReactElement => (\n <div style={STACK_STYLE}>\n <Typography component=\"span\" variant=\"body\">\n {endpoint.label}\n </Typography>\n <Typography color=\"text-neutral\" component=\"span\" variant=\"caption\">\n {endpoint.key}@{endpoint.version} · 參數{' '}\n {endpoint.parameters.length} 個\n </Typography>\n </div>\n ),\n title: '端點',\n width: 240,\n },\n {\n key: 'url',\n render: ({ endpoint }: EndpointRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {endpoint.method} {endpoint.url}\n </Typography>\n ),\n title: 'URL',\n width: 320,\n },\n {\n key: 'status',\n render: ({ endpoint }: EndpointRow): ReactElement =>\n !endpoint.active ? (\n <Badge size=\"sub\" text=\"已停用\" variant=\"dot-inactive\" />\n ) : endpoint.deprecated ? (\n <Badge size=\"sub\" text=\"不建議使用\" variant=\"dot-warning\" />\n ) : (\n <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />\n ),\n title: '狀態',\n width: 120,\n },\n {\n key: 'credentials',\n render: ({ endpoint }: EndpointRow): ReactElement => (\n <div style={STACK_STYLE}>\n <Typography component=\"span\" variant=\"body\">\n {endpoint.hasSigningSecret ? '已設定簽章金鑰' : '未簽章'}\n </Typography>\n <Typography color=\"text-neutral\" component=\"span\" variant=\"caption\">\n {endpoint.headerNames.length\n ? `Header:${endpoint.headerNames.join('、')}`\n : '沒有自訂 header'}\n </Typography>\n </div>\n ),\n title: '憑證',\n width: 200,\n },\n {\n key: 'updatedAt',\n render: ({ endpoint }: EndpointRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(endpoint.updatedAt)}\n </Typography>\n ),\n title: '更新時間',\n width: 180,\n },\n ],\n [],\n );\n\n const actions = useMemo(\n (): TableActions<EndpointRow> => ({\n render: ({\n endpoint,\n }): ReturnType<TableActions<EndpointRow>['render']> => [\n {\n name: '編輯',\n onClick: (): void => setDraft(readEditDraft(endpoint, 'edit')),\n },\n {\n name: '建立新版本',\n onClick: (): void => setDraft(readEditDraft(endpoint, 'version')),\n },\n {\n name: '測試送出',\n onClick: (): void => {\n void run(async () =>\n readTestNotice(\n endpoint,\n await testWorkflowWebhookEndpoint(endpoint.id),\n ),\n );\n },\n },\n {\n name: '輪替金鑰',\n onClick: (): void => {\n setNextSecret('');\n setRemoveSecret(false);\n setRotating(endpoint);\n },\n },\n {\n name: endpoint.active ? '停用' : '啟用',\n onClick: (): void => {\n void run(async () => {\n await setWorkflowWebhookEndpointActive(\n endpoint.id,\n !endpoint.active,\n );\n\n return `已${endpoint.active ? '停用' : '啟用'}「${endpoint.label}」。`;\n });\n },\n },\n {\n name: '異動紀錄',\n onClick: (): void => {\n void listWorkflowWebhookEndpointAudits(endpoint.id)\n .then((records): void => setAudits({ endpoint, records }))\n .catch((requestError: unknown): void =>\n setError(readErrorMessage(requestError)),\n );\n },\n },\n ],\n variant: 'base-secondary',\n width: 180,\n }),\n [run],\n );\n\n async function handleSaveDraft(): Promise<void> {\n if (!draft) {\n return;\n }\n\n setSaving(true);\n\n const saved = await run(async () => {\n const parameters = draft.parameters.map((parameter) => ({\n description: parameter.description.trim() || null,\n key: parameter.key.trim(),\n label: parameter.label.trim(),\n required: parameter.required,\n type: parameter.type,\n }));\n const headers = draft.headers\n .filter((header) => header.name.trim())\n .map((header) => ({ name: header.name.trim(), value: header.value }));\n const timeoutMs = draft.timeoutMs.trim() ? Number(draft.timeoutMs) : null;\n\n if (draft.mode === 'edit' && draft.endpointId) {\n await updateWorkflowWebhookEndpoint({\n deprecated: draft.deprecated,\n description: draft.description,\n headers:\n draft.replaceHeaders || isOriginChanged(draft) ? headers : null,\n id: draft.endpointId,\n label: draft.label,\n method: draft.method,\n parameters,\n timeoutMs,\n url: draft.url,\n });\n\n return `已更新「${draft.label}」。`;\n }\n\n await createWorkflowWebhookEndpoint({\n deprecated: draft.deprecated,\n description: draft.description,\n headers,\n key: draft.key,\n label: draft.label,\n method: draft.method,\n parameters,\n signingSecret: draft.signingSecret || null,\n timeoutMs,\n url: draft.url,\n version: Number(draft.version),\n });\n\n return `已建立「${draft.label}」v${draft.version},設計器現在可以選用。`;\n });\n\n setSaving(false);\n\n if (saved) {\n setDraft(null);\n }\n }\n\n async function handleRotate(): Promise<void> {\n if (!rotating) {\n return;\n }\n\n const endpoint = rotating;\n const done = await run(async () => {\n await rotateWorkflowWebhookEndpointSecret(\n endpoint.id,\n removeSecret ? null : nextSecret,\n );\n\n return removeSecret\n ? `已移除「${endpoint.label}」的簽章金鑰,之後的請求不再簽章。`\n : `已輪替「${endpoint.label}」的簽章金鑰,接收端需改用新金鑰驗簽。`;\n });\n\n if (done) {\n setRotating(null);\n setNextSecret('');\n }\n }\n\n const enabled = Boolean(management?.enabled);\n\n return (\n <>\n <PageHeader>\n <ContentHeader\n description=\"維護知會節點可呼叫的外部系統端點。Header 值與簽章金鑰加密保存,儲存後不會再顯示。\"\n title=\"Webhook 端點\"\n >\n <Button\n disabled={!enabled}\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void => setDraft(EMPTY_DRAFT)}\n variant=\"base-primary\"\n >\n 新增端點\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section>\n <div style={STACK_STYLE}>\n {error ? (\n <Typography color=\"text-error\" variant=\"body\">\n {error}\n </Typography>\n ) : null}\n {notice ? (\n <Typography color=\"text-success\" variant=\"body\">\n {notice}\n </Typography>\n ) : null}\n {management && !enabled ? (\n <Typography color=\"text-warning\" variant=\"body\">\n 此伺服器未啟用後台維護的 Webhook 端點:需要設定\n workflowWebhookTargetSources 含 DATABASE、URL\n 白名單與加密金鑰。程式註冊的端點不受影響。\n </Typography>\n ) : null}\n {enabled ? (\n <Typography color=\"text-neutral\" variant=\"caption\">\n 允許的 URL:{management?.allowedUrlPatterns.join('、')}\n </Typography>\n ) : null}\n <Table\n actions={actions}\n columns={columns}\n dataSource={rows}\n fullWidth\n loading={loading}\n />\n </div>\n </Section>\n </SectionGroup>\n\n {draft ? (\n <EndpointDraftModal\n draft={draft}\n onCancel={(): void => setDraft(null)}\n onChange={setDraft}\n onConfirm={(): void => void handleSaveDraft()}\n saving={saving}\n />\n ) : null}\n\n <Modal\n cancelText=\"取消\"\n confirmButtonProps={{ disabled: !removeSecret && !nextSecret }}\n confirmText={removeSecret ? '移除金鑰' : '輪替金鑰'}\n modalType=\"standard\"\n onCancel={(): void => setRotating(null)}\n onClose={(): void => setRotating(null)}\n onConfirm={(): void => void handleRotate()}\n open={Boolean(rotating)}\n showModalFooter\n showModalHeader\n supportingText=\"新金鑰會加密保存,不會再顯示;請同時更新接收端的驗簽金鑰。\"\n title={`輪替簽章金鑰:${rotating?.label ?? ''}`}\n >\n <div style={STACK_STYLE}>\n <BPMFormField label=\"移除金鑰\" name=\"removeSigningSecret\">\n <Toggle\n checked={removeSecret}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n setRemoveSecret(event.target.checked)\n }\n />\n </BPMFormField>\n {removeSecret ? null : (\n <BPMFormField label=\"新金鑰\" name=\"nextSigningSecret\" required>\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n setNextSecret(event.target.value)\n }\n value={nextSecret}\n inputProps={{ autoComplete: 'new-password' }}\n variant=\"password\"\n />\n </BPMFormField>\n )}\n </div>\n </Modal>\n\n <Modal\n confirmText=\"關閉\"\n modalType=\"standard\"\n onClose={(): void => setAudits(null)}\n onConfirm={(): void => setAudits(null)}\n open={Boolean(audits)}\n showModalFooter\n showModalHeader\n size=\"wide\"\n supportingText=\"只記錄誰在何時變更了哪些欄位,不記錄任何值。\"\n title={`異動紀錄:${audits?.endpoint.label ?? ''}`}\n >\n <Table\n columns={AUDIT_COLUMNS}\n dataSource={(audits?.records ?? []).map((audit): AuditRow => ({\n audit,\n key: audit.id,\n }))}\n fullWidth\n />\n </Modal>\n </>\n );\n}\n\nconst AUDIT_COLUMNS: TableColumn<AuditRow>[] = [\n {\n key: 'createdAt',\n render: ({ audit }: AuditRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {formatDateTime(audit.createdAt)}\n </Typography>\n ),\n title: '時間',\n width: 180,\n },\n {\n key: 'action',\n render: ({ audit }: AuditRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {AUDIT_ACTION_LABELS[audit.action]}\n </Typography>\n ),\n title: '動作',\n width: 120,\n },\n {\n key: 'changedFields',\n render: ({ audit }: AuditRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {audit.changedFields.join('、') || '—'}\n </Typography>\n ),\n title: '欄位',\n width: 280,\n },\n {\n key: 'actor',\n render: ({ audit }: AuditRow): ReactElement => (\n <Typography component=\"span\" variant=\"body\">\n {audit.actorMemberId ?? '系統'}\n </Typography>\n ),\n title: '操作者',\n width: 160,\n },\n];\n\nfunction EndpointDraftModal({\n draft,\n onCancel,\n onChange,\n onConfirm,\n saving,\n}: {\n readonly draft: EndpointDraft;\n readonly onCancel: () => void;\n readonly onChange: (draft: EndpointDraft) => void;\n readonly onConfirm: () => void;\n readonly saving: boolean;\n}): ReactElement {\n const editing = draft.mode === 'edit';\n // Stored header values must not follow the URL to another host, so a new\n // host always means entering the headers again.\n const originChanged = isOriginChanged(draft);\n const replaceHeaders = draft.replaceHeaders || originChanged;\n const update = (patch: Partial<EndpointDraft>): void =>\n onChange({ ...draft, ...patch });\n const updateParameter = (\n index: number,\n patch: Partial<ParameterDraft>,\n ): void =>\n update({\n parameters: draft.parameters.map((parameter, current) =>\n current === index ? { ...parameter, ...patch } : parameter,\n ),\n });\n const updateHeader = (index: number, patch: Partial<HeaderDraft>): void =>\n update({\n headers: draft.headers.map((header, current) =>\n current === index ? { ...header, ...patch } : header,\n ),\n });\n const text =\n (field: keyof EndpointDraft) =>\n (event: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>): void =>\n update({ [field]: event.target.value });\n\n return (\n <Modal\n cancelText=\"取消\"\n confirmText={editing ? '儲存' : '建立'}\n loading={saving}\n modalType=\"standard\"\n onCancel={onCancel}\n onClose={onCancel}\n onConfirm={onConfirm}\n open\n showModalFooter\n showModalHeader\n size=\"wide\"\n supportingText={\n editing\n ? '參數的鍵、型別與必填是這個版本的契約,無法修改;需要變更請建立新版本。'\n : draft.mode === 'version'\n ? '新版本可調整參數;既有模板仍使用舊版本,直到設計者改選。'\n : 'URL 需符合伺服器設定的白名單。'\n }\n title={\n editing\n ? `編輯端點:${draft.label}`\n : draft.mode === 'version'\n ? `建立新版本:${draft.key}`\n : '新增 Webhook 端點'\n }\n >\n <div style={STACK_STYLE}>\n <BPMFormField label=\"Key\" name=\"endpointKey\" required>\n <Input\n {...(draft.mode === 'create' ? {} : { readonly: true as const })}\n onChange={text('key')}\n placeholder=\"例如 crm.lead-created\"\n value={draft.key}\n inputProps={{ autoComplete: 'off' }}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"版本\" name=\"endpointVersion\" required>\n <Input\n {...(editing ? { readonly: true as const } : {})}\n inputProps={{ autoComplete: 'off', inputMode: 'numeric' }}\n onChange={text('version')}\n value={draft.version}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"名稱\" name=\"endpointLabel\" required>\n <Input\n onChange={text('label')}\n placeholder=\"例如 CRM 建立名單\"\n value={draft.label}\n inputProps={{ autoComplete: 'off' }}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"說明\" name=\"endpointDescription\">\n <Textarea\n onChange={text('description')}\n rows={2}\n value={draft.description}\n />\n </BPMFormField>\n <BPMFormField label=\"URL\" name=\"endpointUrl\" required>\n <Input\n onChange={text('url')}\n placeholder=\"https://\"\n value={draft.url}\n inputProps={{ autoComplete: 'off' }}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"Method\" name=\"endpointMethod\" required>\n <Select\n clearable={false}\n onChange={(option): void =>\n update({ method: option?.id ?? 'POST' })\n }\n options={[...METHOD_OPTIONS]}\n value={\n METHOD_OPTIONS.find((option) => option.id === draft.method) ??\n null\n }\n />\n </BPMFormField>\n <BPMFormField\n hintText=\"留空使用預設 10 秒,上限 30000 毫秒。\"\n label=\"逾時(毫秒)\"\n name=\"endpointTimeout\"\n >\n <Input\n inputProps={{ autoComplete: 'off', inputMode: 'numeric' }}\n onChange={text('timeoutMs')}\n value={draft.timeoutMs}\n variant=\"base\"\n />\n </BPMFormField>\n <BPMFormField label=\"不建議使用\" name=\"endpointDeprecated\">\n <Toggle\n checked={draft.deprecated}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n update({ deprecated: event.target.checked })\n }\n />\n </BPMFormField>\n {editing ? null : (\n <BPMFormField\n hintText=\"選填;設定後 BPM 以 HMAC-SHA256 簽章,儲存後不會再顯示。\"\n label=\"簽章金鑰\"\n name=\"endpointSigningSecret\"\n >\n <Input\n onChange={text('signingSecret')}\n placeholder=\"選填,儲存後不再顯示\"\n value={draft.signingSecret}\n inputProps={{ autoComplete: 'new-password' }}\n variant=\"password\"\n />\n </BPMFormField>\n )}\n\n <Typography variant=\"label-primary-highlight\">Headers</Typography>\n {editing ? (\n <BPMFormField\n hintText={\n originChanged\n ? 'URL 已改到其他主機,必須重新輸入 header(留空代表不帶任何 header)。'\n : '現有 header 的值不會顯示;開啟後以下列內容取代全部 header。'\n }\n label=\"取代 headers\"\n name=\"endpointReplaceHeaders\"\n >\n <Toggle\n checked={replaceHeaders}\n disabled={originChanged}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n update({ replaceHeaders: event.target.checked })\n }\n />\n </BPMFormField>\n ) : null}\n {replaceHeaders\n ? draft.headers.map((header, index): ReactElement => (\n <div key={index} style={HEADER_ROW_STYLE}>\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateHeader(index, { name: event.target.value })\n }\n placeholder=\"名稱,例如 Authorization\"\n inputProps={{ autoComplete: 'off' }}\n value={header.name}\n variant=\"base\"\n />\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateHeader(index, { value: event.target.value })\n }\n placeholder=\"值\"\n value={header.value}\n inputProps={{ autoComplete: 'new-password' }}\n variant=\"password\"\n />\n <Button\n icon={TrashIcon}\n iconType=\"icon-only\"\n onClick={(): void =>\n update({\n headers: draft.headers.filter(\n (_header, current) => current !== index,\n ),\n })\n }\n variant=\"destructive-text-link\"\n >\n 移除 header\n </Button>\n </div>\n ))\n : null}\n {replaceHeaders ? (\n <div>\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void =>\n update({ headers: [...draft.headers, { name: '', value: '' }] })\n }\n variant=\"base-dashed\"\n >\n 新增 header\n </Button>\n </div>\n ) : null}\n\n <Typography variant=\"label-primary-highlight\">參數</Typography>\n {draft.parameters.map((parameter, index): ReactElement => (\n <div key={index} style={ROW_STYLE}>\n <Input\n {...(editing ? { readonly: true as const } : {})}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateParameter(index, { key: event.target.value })\n }\n placeholder=\"參數鍵\"\n inputProps={{ autoComplete: 'off' }}\n value={parameter.key}\n variant=\"base\"\n />\n <Input\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateParameter(index, { label: event.target.value })\n }\n placeholder=\"顯示名稱\"\n inputProps={{ autoComplete: 'off' }}\n value={parameter.label}\n variant=\"base\"\n />\n <Select\n clearable={false}\n disabled={editing}\n onChange={(option): void =>\n updateParameter(index, {\n type: readParameterType(option?.id ?? null),\n })\n }\n options={[...PARAMETER_TYPE_OPTIONS]}\n value={\n PARAMETER_TYPE_OPTIONS.find(\n (option) => option.id === parameter.type,\n ) ?? null\n }\n />\n <Toggle\n checked={parameter.required}\n disabled={editing}\n label=\"必填\"\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n updateParameter(index, { required: event.target.checked })\n }\n />\n <Button\n disabled={editing}\n icon={TrashIcon}\n iconType=\"icon-only\"\n onClick={(): void =>\n update({\n parameters: draft.parameters.filter(\n (_parameter, current) => current !== index,\n ),\n })\n }\n variant=\"destructive-text-link\"\n >\n 移除參數\n </Button>\n </div>\n ))}\n {editing ? null : (\n <div>\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void =>\n update({\n parameters: [\n ...draft.parameters,\n {\n description: '',\n key: '',\n label: '',\n required: false,\n type: 'string',\n },\n ],\n })\n }\n variant=\"base-dashed\"\n >\n 新增參數\n </Button>\n </div>\n )}\n </div>\n </Modal>\n );\n}\n\nfunction readEditDraft(\n endpoint: WorkflowWebhookManagedEndpointRecord,\n mode: 'edit' | 'version',\n): EndpointDraft {\n return {\n deprecated: endpoint.deprecated,\n description: endpoint.description ?? '',\n endpointId: mode === 'edit' ? endpoint.id : null,\n headers: [],\n key: endpoint.key,\n label: endpoint.label,\n method: endpoint.method,\n mode,\n originalUrl: endpoint.url,\n parameters: endpoint.parameters.map((parameter) => ({\n description: parameter.description ?? '',\n key: parameter.key,\n label: parameter.label,\n required: parameter.required,\n type: parameter.type,\n })),\n // A new version starts without credentials: they are not readable.\n replaceHeaders: mode === 'version',\n signingSecret: '',\n timeoutMs: endpoint.timeoutMs ? String(endpoint.timeoutMs) : '',\n url: endpoint.url,\n version: String(\n mode === 'version' ? endpoint.version + 1 : endpoint.version,\n ),\n };\n}\n\nfunction readTestNotice(\n endpoint: WorkflowWebhookManagedEndpointRecord,\n result: WorkflowWebhookEndpointTestResultRecord,\n): string {\n if (result.ok) {\n return `測試送出成功:「${endpoint.label}」回應 HTTP ${result.status ?? ''}。`;\n }\n\n throw new Error(\n `測試送出失敗:「${endpoint.label}」${result.status ? `回應 HTTP ${result.status}` : ''}(${result.errorCode ?? '未知錯誤'})${result.errorDetail ? `:${result.errorDetail}` : ''}`,\n );\n}\n\nfunction isOriginChanged(draft: EndpointDraft): boolean {\n if (draft.mode !== 'edit') {\n return false;\n }\n\n const origin = (url: string): string => {\n try {\n return new URL(url.trim()).origin;\n } catch {\n return url.trim();\n }\n };\n\n return origin(draft.url) !== origin(draft.originalUrl);\n}\n\nfunction readParameterType(id: string | null): NotifyWebhookParameterType {\n return PARAMETER_TYPE_OPTIONS.some((option) => option.id === id)\n ? (id as NotifyWebhookParameterType)\n : 'string';\n}\n\nfunction readErrorMessage(error: unknown): string {\n if (!(error instanceof Error)) {\n return '發生未知錯誤';\n }\n\n const message = error.message;\n\n if (message.includes('WORKFLOW_WEBHOOK_URL_NOT_ALLOWED')) {\n return 'URL 不在伺服器允許的白名單內。';\n }\n\n if (message.includes('WORKFLOW_WEBHOOK_ENDPOINT_KEY_CONFLICT')) {\n return '這個 Key 已由程式註冊的端點使用,請換一個。';\n }\n\n if (message.includes('WORKFLOW_WEBHOOK_ENDPOINT_CONTRACT_CHANGED')) {\n return '參數契約不能修改,請改用「建立新版本」。';\n }\n\n if (message.includes('WORKFLOW_WEBHOOK_TEST_RATE_LIMITED')) {\n return '測試送出太頻繁,請稍後再試(每 10 秒一次、10 分鐘最多 5 次)。';\n }\n\n return message;\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/approval-instance-list-page-ax0pm8bt.cjs");let t=require("react/jsx-runtime");function n(){return(0,t.jsx)(e.t,{defaultState:null,description:`查看抄送給你的簽核案件。`,emptyMessage:`目前沒有抄送給你的簽核案件。`,searchPlaceholder:`關鍵字:搜尋案件、發起人、模板或狀態`,title:`抄送給我`,view:`CC`})}exports.CcView=n;
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/approval-instance-list-page-fqvmkBlg.cjs");let t=require("react/jsx-runtime");function n(){return(0,t.jsx)(e.t,{defaultState:null,description:`查看抄送給你的簽核案件。`,emptyMessage:`目前沒有抄送給你的簽核案件。`,searchPlaceholder:`關鍵字:搜尋案件、發起人、模板或狀態`,title:`抄送給我`,view:`CC`})}exports.CcView=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["ApprovalInstanceListPage","require_approval_instance_list_page","react_jsx_runtime","CcView"],"sources":["../../../src/views/cc/CcView.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactElement } from 'react';\nimport { ApprovalInstanceListPage } from '../../components/approval-instance-list-page';\n\n\n/**\n * Framework-agnostic view for the BPM \"cc\" inbox — instances the current\n * member is copied on. Mechanical port of\n * `apps/client/src/app/cc/page.tsx`.\n */\nexport function CcView(): ReactElement {\n return (\n <ApprovalInstanceListPage\n defaultState={null}\n description=\"查看抄送給你的簽核案件。\"\n emptyMessage=\"目前沒有抄送給你的簽核案件。\"\n searchPlaceholder=\"關鍵字:搜尋案件、發起人、模板或狀態\"\n title=\"抄送給我\"\n view=\"CC\"\n />\n );\n}\n"],"mappings":"4LAWA,SAAgBG,GAAuB,CACrC,OACE,EAAAD,EAAA,IAAA,CAACF,EAAAA,EAAD,CACE,aAAc,KACd,YAAY,eACZ,aAAa,iBACb,kBAAkB,qBAClB,MAAM,OACN,KAAK,IACN,CAAA,CAEL"}
1
+ {"version":3,"file":"index.cjs","names":["ApprovalInstanceListPage","require_approval_instance_list_page","react_jsx_runtime","CcView"],"sources":["../../../src/views/cc/CcView.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactElement } from 'react';\nimport { ApprovalInstanceListPage } from '../../components/approval-instance-list-page';\n\n\n/**\n * Framework-agnostic view for the BPM \"cc\" inbox — instances the current\n * member is copied on. Mechanical port of\n * `apps/client/src/app/cc/page.tsx`.\n */\nexport function CcView(): ReactElement {\n return (\n <ApprovalInstanceListPage\n defaultState={null}\n description=\"查看抄送給你的簽核案件。\"\n emptyMessage=\"目前沒有抄送給你的簽核案件。\"\n searchPlaceholder=\"關鍵字:搜尋案件、發起人、模板或狀態\"\n title=\"抄送給我\"\n view=\"CC\"\n />\n );\n}\n"],"mappings":"A,4LAWA,SAAgBG,GAAuB,CACrC,OACE,EAAAD,EAAA,IAAA,CAACF,EAAAA,EAAD,CACE,aAAc,KACd,YAAY,eACZ,aAAa,iBACb,kBAAkB,qBAClB,MAAM,OACN,KAAK,IACN,CAAA,CAEL,C"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
- import { t as e } from "../../chunks/approval-instance-list-page-CPXMP3PL.js";
2
+ import { t as e } from "../../chunks/approval-instance-list-page-BnI4t5mD.js";
3
3
  import { jsx as t } from "react/jsx-runtime";
4
- //#region src/views/cc/CcView.tsx
4
+ // src/views/cc/CcView.tsx
5
5
  function n() {
6
6
  return /* @__PURE__ */ t(e, {
7
7
  defaultState: null,
@@ -12,7 +12,6 @@ function n() {
12
12
  view: "CC"
13
13
  });
14
14
  }
15
- //#endregion
16
15
  export { n as CcView };
17
16
 
18
17
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/dashboard-page-BWQBSGDq.cjs");let t=require("react/jsx-runtime");function n(){return(0,t.jsx)(e.t,{})}exports.DashboardView=n;
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/dashboard-page-D7YJ3udk.cjs");let t=require("react/jsx-runtime");function n(){return(0,t.jsx)(e.t,{})}exports.DashboardView=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["DashboardPage","require_dashboard_page","react_jsx_runtime","DashboardView"],"sources":["../../../src/views/dashboard/DashboardView.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactElement } from 'react';\nimport { DashboardPage } from '../../components/dashboard-page';\n\n\n/**\n * Framework-agnostic view for the BPM dashboard. Delegates to the shared\n * `<DashboardPage>` component. Mechanical port of\n * `apps/client/src/app/dashboard/page.tsx`.\n */\nexport function DashboardView(): ReactElement {\n return <DashboardPage />;\n}\n"],"mappings":"+KAWA,SAAgBG,GAA8B,CAC5C,OAAO,EAAAD,EAAA,IAAA,CAACF,EAAAA,EAAD,CAAgB,CAAA,CACzB"}
1
+ {"version":3,"file":"index.cjs","names":["DashboardPage","require_dashboard_page","react_jsx_runtime","DashboardView"],"sources":["../../../src/views/dashboard/DashboardView.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactElement } from 'react';\nimport { DashboardPage } from '../../components/dashboard-page';\n\n\n/**\n * Framework-agnostic view for the BPM dashboard. Delegates to the shared\n * `<DashboardPage>` component. Mechanical port of\n * `apps/client/src/app/dashboard/page.tsx`.\n */\nexport function DashboardView(): ReactElement {\n return <DashboardPage />;\n}\n"],"mappings":"A,+KAWA,SAAgBG,GAA8B,CAC5C,OAAO,EAAAD,EAAA,IAAA,CAACF,EAAAA,EAAD,CAAgB,CAAA,CACzB,C"}