@rytass/bpm-core-react 0.17.9 → 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 (275) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +8 -0
  3. package/dist/chunks/FormBuilderView-CHaAQL5v.cjs +3 -0
  4. package/dist/chunks/FormBuilderView-CHaAQL5v.cjs.map +1 -0
  5. package/dist/chunks/{FormBuilderView-ClLnQ1e_.js → FormBuilderView-vQfVc08Z.js} +493 -437
  6. package/dist/chunks/FormBuilderView-vQfVc08Z.js.map +1 -0
  7. package/dist/chunks/{FormRendererView-BsTwZkqU.js → FormRendererView-CTLlG13b.js} +300 -189
  8. package/dist/chunks/FormRendererView-CTLlG13b.js.map +1 -0
  9. package/dist/chunks/FormRendererView-ChmM_4Yc.cjs +4 -0
  10. package/dist/chunks/FormRendererView-ChmM_4Yc.cjs.map +1 -0
  11. package/dist/chunks/admin-pickers-BjbkBpSJ.cjs +2 -0
  12. package/dist/chunks/admin-pickers-BjbkBpSJ.cjs.map +1 -0
  13. package/dist/chunks/{admin-pickers-Djq3h-UR.js → admin-pickers-DfGxsjpp.js} +42 -42
  14. package/dist/chunks/admin-pickers-DfGxsjpp.js.map +1 -0
  15. package/dist/chunks/{approval-instance-list-page-CPXMP3PL.js → approval-instance-list-page-BnI4t5mD.js} +7 -8
  16. package/dist/chunks/{approval-instance-list-page-CPXMP3PL.js.map → approval-instance-list-page-BnI4t5mD.js.map} +1 -1
  17. package/dist/chunks/{approval-instance-list-page-ax0pm8bt.cjs → approval-instance-list-page-fqvmkBlg.cjs} +2 -2
  18. package/dist/chunks/{approval-instance-list-page-ax0pm8bt.cjs.map → approval-instance-list-page-fqvmkBlg.cjs.map} +1 -1
  19. package/dist/chunks/approver-filled-form-B4zPg9kz.cjs +2 -0
  20. package/dist/chunks/approver-filled-form-B4zPg9kz.cjs.map +1 -0
  21. package/dist/chunks/approver-filled-form-Bgazhbvd.js +112 -0
  22. package/dist/chunks/approver-filled-form-Bgazhbvd.js.map +1 -0
  23. package/dist/chunks/auth-provider-4BeCw7cI.cjs.map +1 -1
  24. package/dist/chunks/{auth-provider-B5oPmvk2.js → auth-provider-C2b-5mGt.js} +2 -3
  25. package/dist/chunks/{auth-provider-B5oPmvk2.js.map → auth-provider-C2b-5mGt.js.map} +1 -1
  26. package/dist/chunks/{bpm-form-field-Cao0rMol.js → bpm-form-field-9B-Det0u.js} +2 -3
  27. package/dist/chunks/{bpm-form-field-Cao0rMol.js.map → bpm-form-field-9B-Det0u.js.map} +1 -1
  28. package/dist/chunks/bpm-form-field-Bc6k4ZEO.cjs.map +1 -1
  29. package/dist/chunks/{categories-riC33J_j.js → categories-BAdxjNSA.js} +14 -15
  30. package/dist/chunks/{categories-riC33J_j.js.map → categories-BAdxjNSA.js.map} +1 -1
  31. package/dist/chunks/{categories-AxxhqjLZ.cjs → categories-DQUtVEiV.cjs} +2 -2
  32. package/dist/chunks/{categories-AxxhqjLZ.cjs.map → categories-DQUtVEiV.cjs.map} +1 -1
  33. package/dist/chunks/{compose-jnvnnVfN.js → compose-D9ipJpF_.js} +131 -148
  34. package/dist/chunks/compose-D9ipJpF_.js.map +1 -0
  35. package/dist/chunks/compose-DtfX8DQ9.cjs +2 -0
  36. package/dist/chunks/compose-DtfX8DQ9.cjs.map +1 -0
  37. package/dist/chunks/{dashboard-page-DdBvV6YI.js → dashboard-page-BoqNhjT_.js} +5 -6
  38. package/dist/chunks/{dashboard-page-DdBvV6YI.js.map → dashboard-page-BoqNhjT_.js.map} +1 -1
  39. package/dist/chunks/{dashboard-page-BWQBSGDq.cjs → dashboard-page-D7YJ3udk.cjs} +2 -2
  40. package/dist/chunks/{dashboard-page-BWQBSGDq.cjs.map → dashboard-page-D7YJ3udk.cjs.map} +1 -1
  41. package/dist/chunks/{delegations-MxF3uJGW.js → delegations-BfhCDz5e.js} +15 -16
  42. package/dist/chunks/{delegations-MxF3uJGW.js.map → delegations-BfhCDz5e.js.map} +1 -1
  43. package/dist/chunks/{delegations-Ckf03icM.cjs → delegations-BmFGcuhA.cjs} +2 -2
  44. package/dist/chunks/{delegations-Ckf03icM.cjs.map → delegations-BmFGcuhA.cjs.map} +1 -1
  45. package/dist/chunks/{delegations-V9HIe3_P.cjs → delegations-CcS0SHbf.cjs} +2 -2
  46. package/dist/chunks/{delegations-V9HIe3_P.cjs.map → delegations-CcS0SHbf.cjs.map} +1 -1
  47. package/dist/chunks/{delegations-xUt1tj8d.js → delegations-DBh5TT6G.js} +16 -17
  48. package/dist/chunks/{delegations-xUt1tj8d.js.map → delegations-DBh5TT6G.js.map} +1 -1
  49. package/dist/chunks/designer-Df79YzUn.cjs +65 -0
  50. package/dist/chunks/designer-Df79YzUn.cjs.map +1 -0
  51. package/dist/chunks/{designer-B8Gvew_k.js → designer-ubnZbP-A.js} +1779 -1360
  52. package/dist/chunks/designer-ubnZbP-A.js.map +1 -0
  53. package/dist/chunks/detail-BBC9kqXd.cjs +5 -0
  54. package/dist/chunks/detail-BBC9kqXd.cjs.map +1 -0
  55. package/dist/chunks/detail-C6XKZjlF.js +2665 -0
  56. package/dist/chunks/detail-C6XKZjlF.js.map +1 -0
  57. package/dist/chunks/{format-date-time-CB-LxzqT.js → format-date-time-B0LdmWg4.js} +2 -3
  58. package/dist/chunks/{format-date-time-CB-LxzqT.js.map → format-date-time-B0LdmWg4.js.map} +1 -1
  59. package/dist/chunks/format-date-time-D-cx5M8z.cjs.map +1 -1
  60. package/dist/chunks/{format-member-label-DudVI55w.js → format-member-label-C73FuP-d.js} +2 -3
  61. package/dist/chunks/{format-member-label-DudVI55w.js.map → format-member-label-C73FuP-d.js.map} +1 -1
  62. package/dist/chunks/format-member-label-t7ANTF62.cjs.map +1 -1
  63. package/dist/chunks/language-provider-Bdnx3Gxl.cjs.map +1 -1
  64. package/dist/chunks/{language-provider-B3cEbLe4.js → language-provider-phkWOapf.js} +2 -3
  65. package/dist/chunks/{language-provider-B3cEbLe4.js.map → language-provider-phkWOapf.js.map} +1 -1
  66. package/dist/chunks/{login-C6qlTC6F.js → login-D6cc3bo7.js} +4 -5
  67. package/dist/chunks/{login-C6qlTC6F.js.map → login-D6cc3bo7.js.map} +1 -1
  68. package/dist/chunks/{login-AtVxZBsC.cjs → login-uvVcltrS.cjs} +2 -2
  69. package/dist/chunks/{login-AtVxZBsC.cjs.map → login-uvVcltrS.cjs.map} +1 -1
  70. package/dist/chunks/notifications-Bc4mgSds.cjs.map +1 -1
  71. package/dist/chunks/{notifications-DJ5wzCye.js → notifications-Cvme5Qbl.js} +2 -3
  72. package/dist/chunks/{notifications-DJ5wzCye.js.map → notifications-Cvme5Qbl.js.map} +1 -1
  73. package/dist/chunks/orgs-B_2J2tLX.cjs +2 -0
  74. package/dist/chunks/{orgs-BeeDDWL1.cjs.map → orgs-B_2J2tLX.cjs.map} +1 -1
  75. package/dist/chunks/{orgs-8hje_l2n.js → orgs-DqxMds26.js} +48 -49
  76. package/dist/chunks/{orgs-8hje_l2n.js.map → orgs-DqxMds26.js.map} +1 -1
  77. package/dist/chunks/{providers-B_d5tbCL.js → providers-BbCs23sk.js} +21 -25
  78. package/dist/chunks/{providers-B_d5tbCL.js.map → providers-BbCs23sk.js.map} +1 -1
  79. package/dist/chunks/{providers-chuJvMgv.cjs → providers-D_KAgOOu.cjs} +2 -2
  80. package/dist/chunks/{providers-chuJvMgv.cjs.map → providers-D_KAgOOu.cjs.map} +1 -1
  81. package/dist/chunks/router-adapter--gYs13E8.cjs.map +1 -1
  82. package/dist/chunks/{router-adapter-DftlFTOd.js → router-adapter-CkxCyzf5.js} +2 -3
  83. package/dist/chunks/{router-adapter-DftlFTOd.js.map → router-adapter-CkxCyzf5.js.map} +1 -1
  84. package/dist/chunks/{routes-config-yZbESPlw.js → routes-config-BcNaWJWJ.js} +2 -3
  85. package/dist/chunks/{routes-config-yZbESPlw.js.map → routes-config-BcNaWJWJ.js.map} +1 -1
  86. package/dist/chunks/routes-config-C1j_vFKo.cjs.map +1 -1
  87. package/dist/chunks/task-decision-3d17ZvZE.js +29 -0
  88. package/dist/chunks/task-decision-3d17ZvZE.js.map +1 -0
  89. package/dist/chunks/task-decision-CqZ4WQOC.cjs +2 -0
  90. package/dist/chunks/task-decision-CqZ4WQOC.cjs.map +1 -0
  91. package/dist/chunks/{use-bpm-member-D57LKe_u.js → use-bpm-member-BPzcNU1g.js} +3 -4
  92. package/dist/chunks/{use-bpm-member-D57LKe_u.js.map → use-bpm-member-BPzcNU1g.js.map} +1 -1
  93. package/dist/chunks/use-bpm-member-DpNAQtNC.cjs.map +1 -1
  94. package/dist/chunks/{users-Pl6hY5Y5.js → users-BBtiZ9QQ.js} +22 -25
  95. package/dist/chunks/{users-Pl6hY5Y5.js.map → users-BBtiZ9QQ.js.map} +1 -1
  96. package/dist/chunks/{users-O2L_M3BK.cjs → users-EqSzDhuj.cjs} +2 -2
  97. package/dist/chunks/{users-O2L_M3BK.cjs.map → users-EqSzDhuj.cjs.map} +1 -1
  98. package/dist/components/admin-picker-options.d.cts +11 -0
  99. package/dist/components/admin-picker-options.d.ts +11 -0
  100. package/dist/components/admin-pickers.d.cts +2 -11
  101. package/dist/components/admin-pickers.d.ts +2 -11
  102. package/dist/index.cjs +1 -1
  103. package/dist/index.cjs.map +1 -1
  104. package/dist/index.js +17 -19
  105. package/dist/index.js.map +1 -1
  106. package/dist/lib/task-decision.d.cts +16 -0
  107. package/dist/lib/task-decision.d.ts +16 -0
  108. package/dist/lib/use-org-unit-names.d.cts +10 -0
  109. package/dist/lib/use-org-unit-names.d.ts +10 -0
  110. package/dist/next/index.cjs +1 -1
  111. package/dist/next/index.cjs.map +1 -1
  112. package/dist/next/index.js +7 -8
  113. package/dist/next/index.js.map +1 -1
  114. package/dist/next/workflow-chat-route.cjs +19 -1
  115. package/dist/next/workflow-chat-route.cjs.map +1 -1
  116. package/dist/next/workflow-chat-route.js +2 -3
  117. package/dist/next/workflow-chat-route.js.map +1 -1
  118. package/dist/pages/admin/delegations/index.cjs +1 -1
  119. package/dist/pages/admin/delegations/index.cjs.map +1 -1
  120. package/dist/pages/admin/delegations/index.js +2 -3
  121. package/dist/pages/admin/orgs/index.cjs +1 -1
  122. package/dist/pages/admin/orgs/index.cjs.map +1 -1
  123. package/dist/pages/admin/orgs/index.js +2 -3
  124. package/dist/pages/admin/users/index.cjs +1 -1
  125. package/dist/pages/admin/users/index.cjs.map +1 -1
  126. package/dist/pages/admin/users/index.js +2 -3
  127. package/dist/pages/admin/webhook-endpoints/index.cjs.map +1 -1
  128. package/dist/pages/admin/webhook-endpoints/index.js +1 -2
  129. package/dist/pages/cc/index.cjs.map +1 -1
  130. package/dist/pages/cc/index.js +1 -2
  131. package/dist/pages/dashboard/index.cjs.map +1 -1
  132. package/dist/pages/dashboard/index.js +1 -2
  133. package/dist/pages/delegations/index.cjs +1 -1
  134. package/dist/pages/delegations/index.cjs.map +1 -1
  135. package/dist/pages/delegations/index.js +2 -3
  136. package/dist/pages/inbox/index.cjs.map +1 -1
  137. package/dist/pages/inbox/index.js +1 -2
  138. package/dist/pages/instances/detail/index.cjs +1 -1
  139. package/dist/pages/instances/detail/index.cjs.map +1 -1
  140. package/dist/pages/instances/detail/index.js +2 -3
  141. package/dist/pages/instances/new/index.cjs.map +1 -1
  142. package/dist/pages/instances/new/index.js +1 -2
  143. package/dist/pages/login/index.cjs +1 -1
  144. package/dist/pages/login/index.cjs.map +1 -1
  145. package/dist/pages/login/index.js +2 -3
  146. package/dist/pages/root/index.cjs.map +1 -1
  147. package/dist/pages/root/index.js +1 -2
  148. package/dist/pages/search/index.cjs.map +1 -1
  149. package/dist/pages/search/index.js +1 -2
  150. package/dist/pages/sent/index.cjs.map +1 -1
  151. package/dist/pages/sent/index.js +1 -2
  152. package/dist/pages/settings/notifications/index.cjs.map +1 -1
  153. package/dist/pages/settings/notifications/index.js +2 -3
  154. package/dist/pages/templates/categories/index.cjs +1 -1
  155. package/dist/pages/templates/categories/index.cjs.map +1 -1
  156. package/dist/pages/templates/categories/index.js +2 -3
  157. package/dist/pages/templates/compose/index.cjs +1 -1
  158. package/dist/pages/templates/compose/index.cjs.map +1 -1
  159. package/dist/pages/templates/compose/index.js +2 -3
  160. package/dist/pages/templates/designer/index.cjs +1 -1
  161. package/dist/pages/templates/designer/index.cjs.map +1 -1
  162. package/dist/pages/templates/designer/index.js +2 -3
  163. package/dist/pages/templates/index.cjs.map +1 -1
  164. package/dist/pages/templates/index.js +1 -2
  165. package/dist/pages/templates/versions/index.cjs.map +1 -1
  166. package/dist/pages/templates/versions/index.js +1 -2
  167. package/dist/views/admin/delegations/index.cjs +1 -1
  168. package/dist/views/admin/delegations/index.js +1 -1
  169. package/dist/views/admin/index.cjs +1 -1
  170. package/dist/views/admin/index.js +3 -3
  171. package/dist/views/admin/orgs/index.cjs +1 -1
  172. package/dist/views/admin/orgs/index.js +1 -1
  173. package/dist/views/admin/users/index.cjs +1 -1
  174. package/dist/views/admin/users/index.js +1 -1
  175. package/dist/views/admin/webhook-endpoints/index.cjs +1 -1
  176. package/dist/views/admin/webhook-endpoints/index.cjs.map +1 -1
  177. package/dist/views/admin/webhook-endpoints/index.js +52 -53
  178. package/dist/views/admin/webhook-endpoints/index.js.map +1 -1
  179. package/dist/views/cc/index.cjs +1 -1
  180. package/dist/views/cc/index.cjs.map +1 -1
  181. package/dist/views/cc/index.js +2 -3
  182. package/dist/views/dashboard/index.cjs +1 -1
  183. package/dist/views/dashboard/index.cjs.map +1 -1
  184. package/dist/views/dashboard/index.js +2 -3
  185. package/dist/views/delegations/index.cjs +1 -1
  186. package/dist/views/delegations/index.js +1 -1
  187. package/dist/views/forms/builder/index.cjs +1 -1
  188. package/dist/views/forms/builder/index.js +1 -1
  189. package/dist/views/forms/renderer/index.cjs +1 -1
  190. package/dist/views/forms/renderer/index.js +1 -1
  191. package/dist/views/forms/renderer/org-unit-field-options.d.cts +44 -0
  192. package/dist/views/forms/renderer/org-unit-field-options.d.ts +44 -0
  193. package/dist/views/forms/renderer/org-unit-field.d.cts +23 -0
  194. package/dist/views/forms/renderer/org-unit-field.d.ts +23 -0
  195. package/dist/views/inbox/index.cjs +1 -1
  196. package/dist/views/inbox/index.cjs.map +1 -1
  197. package/dist/views/inbox/index.js +133 -137
  198. package/dist/views/inbox/index.js.map +1 -1
  199. package/dist/views/instances/approver-filled-form.d.cts +9 -2
  200. package/dist/views/instances/approver-filled-form.d.ts +9 -2
  201. package/dist/views/instances/detail/index.cjs +1 -1
  202. package/dist/views/instances/detail/index.js +1 -1
  203. package/dist/views/instances/detail/sections/InstanceHistorySection.d.cts +8 -1
  204. package/dist/views/instances/detail/sections/InstanceHistorySection.d.ts +8 -1
  205. package/dist/views/instances/detail/sections/container-helpers.d.cts +0 -1
  206. package/dist/views/instances/detail/sections/container-helpers.d.ts +0 -1
  207. package/dist/views/instances/detail/sections/shared.d.cts +2 -2
  208. package/dist/views/instances/detail/sections/shared.d.ts +2 -2
  209. package/dist/views/instances/new/index.cjs +1 -1
  210. package/dist/views/instances/new/index.cjs.map +1 -1
  211. package/dist/views/instances/new/index.js +24 -21
  212. package/dist/views/instances/new/index.js.map +1 -1
  213. package/dist/views/login/index.cjs +1 -1
  214. package/dist/views/login/index.js +1 -1
  215. package/dist/views/search/index.cjs +1 -1
  216. package/dist/views/search/index.cjs.map +1 -1
  217. package/dist/views/search/index.js +2 -3
  218. package/dist/views/sent/index.cjs +1 -1
  219. package/dist/views/sent/index.cjs.map +1 -1
  220. package/dist/views/sent/index.js +2 -3
  221. package/dist/views/settings/index.js +1 -1
  222. package/dist/views/settings/notifications/index.js +1 -1
  223. package/dist/views/templates/categories/index.cjs +1 -1
  224. package/dist/views/templates/categories/index.js +1 -1
  225. package/dist/views/templates/compose/index.cjs +1 -1
  226. package/dist/views/templates/compose/index.js +1 -1
  227. package/dist/views/templates/designer/approver-resolver-model.d.cts +211 -0
  228. package/dist/views/templates/designer/approver-resolver-model.d.ts +211 -0
  229. package/dist/views/templates/designer/dry-run-assignee-label.d.cts +2 -0
  230. package/dist/views/templates/designer/dry-run-assignee-label.d.ts +2 -0
  231. package/dist/views/templates/designer/dry-run-sample-data.d.cts +6 -0
  232. package/dist/views/templates/designer/dry-run-sample-data.d.ts +6 -0
  233. package/dist/views/templates/designer/dynamic-form-resolver-options.d.cts +25 -0
  234. package/dist/views/templates/designer/dynamic-form-resolver-options.d.ts +25 -0
  235. package/dist/views/templates/designer/index.cjs +1 -1
  236. package/dist/views/templates/designer/index.js +1 -1
  237. package/dist/views/templates/designer/node-actor-resolver-options.d.cts +38 -0
  238. package/dist/views/templates/designer/node-actor-resolver-options.d.ts +38 -0
  239. package/dist/views/templates/index.cjs +1 -1
  240. package/dist/views/templates/index.cjs.map +1 -1
  241. package/dist/views/templates/index.js +50 -51
  242. package/dist/views/templates/index.js.map +1 -1
  243. package/dist/views/templates/versions/index.cjs +1 -1
  244. package/dist/views/templates/versions/index.cjs.map +1 -1
  245. package/dist/views/templates/versions/index.js +7 -8
  246. package/dist/views/templates/versions/index.js.map +1 -1
  247. package/package.json +3 -3
  248. package/dist/chunks/FormBuilderView-CUOyS07f.cjs +0 -3
  249. package/dist/chunks/FormBuilderView-CUOyS07f.cjs.map +0 -1
  250. package/dist/chunks/FormBuilderView-ClLnQ1e_.js.map +0 -1
  251. package/dist/chunks/FormRendererView-BsTwZkqU.js.map +0 -1
  252. package/dist/chunks/FormRendererView-GpsE03np.cjs +0 -4
  253. package/dist/chunks/FormRendererView-GpsE03np.cjs.map +0 -1
  254. package/dist/chunks/admin-pickers-BRHk3qKq.cjs +0 -2
  255. package/dist/chunks/admin-pickers-BRHk3qKq.cjs.map +0 -1
  256. package/dist/chunks/admin-pickers-Djq3h-UR.js.map +0 -1
  257. package/dist/chunks/approver-filled-form-D1DmqDVP.cjs +0 -2
  258. package/dist/chunks/approver-filled-form-D1DmqDVP.cjs.map +0 -1
  259. package/dist/chunks/approver-filled-form-DuQGPtNB.js +0 -95
  260. package/dist/chunks/approver-filled-form-DuQGPtNB.js.map +0 -1
  261. package/dist/chunks/compose-Cock_B2Q.cjs +0 -2
  262. package/dist/chunks/compose-Cock_B2Q.cjs.map +0 -1
  263. package/dist/chunks/compose-jnvnnVfN.js.map +0 -1
  264. package/dist/chunks/designer-B8Gvew_k.js.map +0 -1
  265. package/dist/chunks/designer-CAEFV1ve.cjs +0 -65
  266. package/dist/chunks/designer-CAEFV1ve.cjs.map +0 -1
  267. package/dist/chunks/detail-CExpbazF.js +0 -2629
  268. package/dist/chunks/detail-CExpbazF.js.map +0 -1
  269. package/dist/chunks/detail-DIY-L4i-.cjs +0 -2
  270. package/dist/chunks/detail-DIY-L4i-.cjs.map +0 -1
  271. package/dist/chunks/orgs-BeeDDWL1.cjs +0 -2
  272. package/dist/chunks/task-node-label-BF6UllxP.cjs +0 -2
  273. package/dist/chunks/task-node-label-BF6UllxP.cjs.map +0 -1
  274. package/dist/chunks/task-node-label-CWZgOBj0.js +0 -9
  275. package/dist/chunks/task-node-label-CWZgOBj0.js.map +0 -1
@@ -11,6 +11,8 @@ export type DryRunAssigneeDirectory = Readonly<{
11
11
  formFields: readonly FormFieldRecord[];
12
12
  /** Display name of a real member id, or `null` when it is not known. */
13
13
  memberName: (memberId: string) => string | null;
14
+ /** Nodes of the workflow, to name the stages a `nodeActor:` placeholder lists. */
15
+ nodes: readonly NamedRecord[];
14
16
  orgUnits: readonly NamedRecord[];
15
17
  positions: readonly NamedRecord[];
16
18
  }>;
@@ -7,3 +7,9 @@ export declare function readDryRunSampleFormData(schema: FormDefinitionSchema |
7
7
  * excludes the initiator look skipped or stopped when it would not be.
8
8
  */
9
9
  export declare function readDryRunFormMemberPlaceholder(fieldKey: string): string;
10
+ /**
11
+ * Sample value of an org_unit field: a placeholder, since the dry run has no
12
+ * way to know which organization a submitter would pick. The engine reports
13
+ * 依表單欄位的組織主管 by field key, not by this value.
14
+ */
15
+ export declare function readDryRunFormOrgUnitPlaceholder(fieldKey: string): string;
@@ -7,3 +7,9 @@ export declare function readDryRunSampleFormData(schema: FormDefinitionSchema |
7
7
  * excludes the initiator look skipped or stopped when it would not be.
8
8
  */
9
9
  export declare function readDryRunFormMemberPlaceholder(fieldKey: string): string;
10
+ /**
11
+ * Sample value of an org_unit field: a placeholder, since the dry run has no
12
+ * way to know which organization a submitter would pick. The engine reports
13
+ * 依表單欄位的組織主管 by field key, not by this value.
14
+ */
15
+ export declare function readDryRunFormOrgUnitPlaceholder(fieldKey: string): string;
@@ -18,6 +18,8 @@ export type DynamicFormFieldChoice = Readonly<{
18
18
  selected: MemberFieldOption | null;
19
19
  }>;
20
20
  export declare const NO_MEMBER_FIELD_HINT = "\u8868\u55AE\u4E2D\u6C92\u6709\u300C\u4EBA\u54E1\u9078\u64C7\u300D\u6B04\u4F4D\uFF0C\u8ACB\u5148\u5230\u8868\u55AE\u8A2D\u8A08\u52A0\u5165";
21
+ export declare const NO_SINGLE_MEMBER_FIELD_HINT = "\u8868\u55AE\u4E2D\u6C92\u6709\u55AE\u9078\u7684\u300C\u4EBA\u54E1\u9078\u64C7\u300D\u6B04\u4F4D\uFF0C\u8ACB\u5148\u5230\u8868\u55AE\u8A2D\u8A08\u52A0\u5165";
22
+ export declare const NO_ORG_UNIT_FIELD_HINT = "\u8868\u55AE\u4E2D\u6C92\u6709\u300C\u7D44\u7E54\u9078\u64C7\u300D\u6B04\u4F4D\uFF0C\u8ACB\u5148\u5230\u8868\u55AE\u8A2D\u8A08\u52A0\u5165";
21
23
  /** Only member fields can feed a 依表單欄位指定 approver resolver. */
22
24
  export declare function readMemberFieldOptions(schema: FormDefinitionSchema | null): readonly MemberFieldOption[];
23
25
  /**
@@ -28,8 +30,31 @@ export declare function readMemberFieldOptions(schema: FormDefinitionSchema | nu
28
30
  * back — the resolver stays invalid until a real field is chosen.
29
31
  */
30
32
  export declare function readDynamicFormFieldChoice(schema: FormDefinitionSchema | null, formPath: string): DynamicFormFieldChoice;
33
+ /**
34
+ * Member fields a manager can be looked up from: one person per submission,
35
+ * so a multi-select member field is not offered (SPEC 5.2). Same warnings as
36
+ * {@link readMemberFieldOptions}.
37
+ */
38
+ export declare function readSingleMemberFieldOptions(schema: FormDefinitionSchema | null): readonly MemberFieldOption[];
39
+ /** The field picker for 簽核人 = 直屬/第二層/第三層主管 of a form person. */
40
+ export declare function readFormMemberManagerFieldChoice(schema: FormDefinitionSchema | null, formPath: string): DynamicFormFieldChoice;
41
+ /**
42
+ * Every 組織選擇 field of the form, optional or hidden ones included; the
43
+ * ones that cannot be published carry the reason as `warning`, the way member
44
+ * fields do.
45
+ */
46
+ export declare function readOrgUnitFieldOptions(schema: FormDefinitionSchema | null): readonly MemberFieldOption[];
47
+ /** The field picker for 組織 = 表單欄位 of 指定組織主管. */
48
+ export declare function readFormOrgUnitFieldChoice(schema: FormDefinitionSchema | null, formPath: string): DynamicFormFieldChoice;
31
49
  /**
32
50
  * 依表單欄位:<label>; the field key when the form does not have it (any
33
51
  * more), and a marker when the key names something that is not a member field.
34
52
  */
35
53
  export declare function readDynamicFormSummary(schema: FormDefinitionSchema | null, formPath: string): string;
54
+ /**
55
+ * 依表單欄位:<label>的<level>; marks a field that cannot feed a manager lookup
56
+ * (not a member field, or one that takes several people).
57
+ */
58
+ export declare function readFormMemberManagerSummary(schema: FormDefinitionSchema | null, formPath: string, levelName: string): string;
59
+ /** 依表單欄位:<label>所選組織的主管, with a marker for a non-org field. */
60
+ export declare function readFormOrgUnitManagerSummary(schema: FormDefinitionSchema | null, formPath: string): string;
@@ -18,6 +18,8 @@ export type DynamicFormFieldChoice = Readonly<{
18
18
  selected: MemberFieldOption | null;
19
19
  }>;
20
20
  export declare const NO_MEMBER_FIELD_HINT = "\u8868\u55AE\u4E2D\u6C92\u6709\u300C\u4EBA\u54E1\u9078\u64C7\u300D\u6B04\u4F4D\uFF0C\u8ACB\u5148\u5230\u8868\u55AE\u8A2D\u8A08\u52A0\u5165";
21
+ export declare const NO_SINGLE_MEMBER_FIELD_HINT = "\u8868\u55AE\u4E2D\u6C92\u6709\u55AE\u9078\u7684\u300C\u4EBA\u54E1\u9078\u64C7\u300D\u6B04\u4F4D\uFF0C\u8ACB\u5148\u5230\u8868\u55AE\u8A2D\u8A08\u52A0\u5165";
22
+ export declare const NO_ORG_UNIT_FIELD_HINT = "\u8868\u55AE\u4E2D\u6C92\u6709\u300C\u7D44\u7E54\u9078\u64C7\u300D\u6B04\u4F4D\uFF0C\u8ACB\u5148\u5230\u8868\u55AE\u8A2D\u8A08\u52A0\u5165";
21
23
  /** Only member fields can feed a 依表單欄位指定 approver resolver. */
22
24
  export declare function readMemberFieldOptions(schema: FormDefinitionSchema | null): readonly MemberFieldOption[];
23
25
  /**
@@ -28,8 +30,31 @@ export declare function readMemberFieldOptions(schema: FormDefinitionSchema | nu
28
30
  * back — the resolver stays invalid until a real field is chosen.
29
31
  */
30
32
  export declare function readDynamicFormFieldChoice(schema: FormDefinitionSchema | null, formPath: string): DynamicFormFieldChoice;
33
+ /**
34
+ * Member fields a manager can be looked up from: one person per submission,
35
+ * so a multi-select member field is not offered (SPEC 5.2). Same warnings as
36
+ * {@link readMemberFieldOptions}.
37
+ */
38
+ export declare function readSingleMemberFieldOptions(schema: FormDefinitionSchema | null): readonly MemberFieldOption[];
39
+ /** The field picker for 簽核人 = 直屬/第二層/第三層主管 of a form person. */
40
+ export declare function readFormMemberManagerFieldChoice(schema: FormDefinitionSchema | null, formPath: string): DynamicFormFieldChoice;
41
+ /**
42
+ * Every 組織選擇 field of the form, optional or hidden ones included; the
43
+ * ones that cannot be published carry the reason as `warning`, the way member
44
+ * fields do.
45
+ */
46
+ export declare function readOrgUnitFieldOptions(schema: FormDefinitionSchema | null): readonly MemberFieldOption[];
47
+ /** The field picker for 組織 = 表單欄位 of 指定組織主管. */
48
+ export declare function readFormOrgUnitFieldChoice(schema: FormDefinitionSchema | null, formPath: string): DynamicFormFieldChoice;
31
49
  /**
32
50
  * 依表單欄位:<label>; the field key when the form does not have it (any
33
51
  * more), and a marker when the key names something that is not a member field.
34
52
  */
35
53
  export declare function readDynamicFormSummary(schema: FormDefinitionSchema | null, formPath: string): string;
54
+ /**
55
+ * 依表單欄位:<label>的<level>; marks a field that cannot feed a manager lookup
56
+ * (not a member field, or one that takes several people).
57
+ */
58
+ export declare function readFormMemberManagerSummary(schema: FormDefinitionSchema | null, formPath: string, levelName: string): string;
59
+ /** 依表單欄位:<label>所選組織的主管, with a marker for a non-org field. */
60
+ export declare function readFormOrgUnitManagerSummary(schema: FormDefinitionSchema | null, formPath: string): string;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/designer-CAEFV1ve.cjs");exports.TemplateDesignerView=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/designer-Df79YzUn.cjs");exports.TemplateDesignerView=e.t;
@@ -1 +1 @@
1
- export { t as TemplateDesignerView } from "../../../chunks/designer-B8Gvew_k.js";
1
+ export { t as TemplateDesignerView } from "../../../chunks/designer-ubnZbP-A.js";
@@ -0,0 +1,38 @@
1
+ import { WorkflowDefinition } from '@rytass/bpm-core-shared/workflow';
2
+ export type NodeActorOption = Readonly<{
3
+ id: string;
4
+ name: string;
5
+ }>;
6
+ export type NodeActorStageChoice = Readonly<{
7
+ /** What the 關卡 picker offers, with any stale stored choice appended. */
8
+ options: readonly NodeActorOption[];
9
+ /**
10
+ * Live problems of the whole selection (coverage, parallel branches, a stage
11
+ * that can be skipped, ...), or the hint that nothing can be picked.
12
+ */
13
+ problems: readonly string[];
14
+ selected: readonly NodeActorOption[];
15
+ }>;
16
+ export declare const NO_UPSTREAM_USER_TASK_HINT = "\u9019\u500B\u7BC0\u9EDE\u524D\u9762\u6C92\u6709\u53EF\u4EE5\u9078\u7684\u7C3D\u6838\u95DC\u5361\uFF0C\u8ACB\u5148\u5728\u5B83\u524D\u9762\u52A0\u5165\u7C3D\u6838\u7BC0\u9EDE\uFF08\u6C92\u6709\u9032\u5165\u689D\u4EF6\u3001\u6C92\u8A2D\u8DF3\u904E\u6B64\u95DC\uFF0C\u4E5F\u6C92\u8A2D\u903E\u6642\u81EA\u52D5\u6838\u51C6\uFF09";
17
+ /** The 關卡 picker's hint while the selection has no problem to report. */
18
+ export declare const NODE_ACTOR_STAGE_HINT = "\u7C3D\u6838\u4EBA\u53D6\u81EA\u4F60\u9078\u7684\u524D\u9762\u95DC\u5361\u5BE6\u969B\u7C3D\u6838\u7684\u4EBA\uFF1B\u53EF\u8907\u9078\uFF0C\u6574\u7D44\u8981\u6DB5\u84CB\u6BCF\u689D\u8DEF\u5F91\u3002\u8907\u9078\u591A\u500B\u95DC\u5361\u6642\uFF0C\u53D6\u6700\u8FD1\u5BE6\u969B\u8D70\u5230\u7684\u90A3\u4E00\u95DC\u7684\u7C3D\u6838\u4EBA\uFF0C\u4E0D\u662F\u5168\u90E8\u95DC\u5361\u7684\u7C3D\u6838\u4EBA\u3002";
19
+ /**
20
+ * The 關卡 picker of 依前面關卡的簽核者: the user tasks upstream of `nodeId`
21
+ * that always end with a real signer (`readNodeActorSourceSkipReasons` is
22
+ * empty: no entry condition, no 跳過此關, no 逾時自動核准). Whether the whole group
23
+ * covers every path, or straddles a parallel split, is a property of the
24
+ * selection, not of one stage, so it is reported as `problems` and never used
25
+ * to filter the list (SPEC 5.2: the 154 CF_HR_0002 cases rest on two mutually
26
+ * exclusive stages that would each fail the coverage test alone).
27
+ *
28
+ * A stored stage that no longer qualifies stays in the list, marked, so the
29
+ * stored choice stays visible until the author fixes it.
30
+ */
31
+ export declare function readNodeActorStageChoice(definition: WorkflowDefinition, nodeId: string, selectedIds: readonly string[]): NodeActorStageChoice;
32
+ /**
33
+ * The graph problems of every 依前面關卡的簽核者 node, naming the node: the
34
+ * checks the backend publish lint runs (`readNodeActorSourceIssues`), for the
35
+ * designer to show before publish. An empty stage list is left to
36
+ * `readApproverResolverIssue`, which owns that message.
37
+ */
38
+ export declare function readNodeActorGraphIssues(definition: WorkflowDefinition): readonly string[];
@@ -0,0 +1,38 @@
1
+ import { WorkflowDefinition } from '@rytass/bpm-core-shared/workflow';
2
+ export type NodeActorOption = Readonly<{
3
+ id: string;
4
+ name: string;
5
+ }>;
6
+ export type NodeActorStageChoice = Readonly<{
7
+ /** What the 關卡 picker offers, with any stale stored choice appended. */
8
+ options: readonly NodeActorOption[];
9
+ /**
10
+ * Live problems of the whole selection (coverage, parallel branches, a stage
11
+ * that can be skipped, ...), or the hint that nothing can be picked.
12
+ */
13
+ problems: readonly string[];
14
+ selected: readonly NodeActorOption[];
15
+ }>;
16
+ export declare const NO_UPSTREAM_USER_TASK_HINT = "\u9019\u500B\u7BC0\u9EDE\u524D\u9762\u6C92\u6709\u53EF\u4EE5\u9078\u7684\u7C3D\u6838\u95DC\u5361\uFF0C\u8ACB\u5148\u5728\u5B83\u524D\u9762\u52A0\u5165\u7C3D\u6838\u7BC0\u9EDE\uFF08\u6C92\u6709\u9032\u5165\u689D\u4EF6\u3001\u6C92\u8A2D\u8DF3\u904E\u6B64\u95DC\uFF0C\u4E5F\u6C92\u8A2D\u903E\u6642\u81EA\u52D5\u6838\u51C6\uFF09";
17
+ /** The 關卡 picker's hint while the selection has no problem to report. */
18
+ export declare const NODE_ACTOR_STAGE_HINT = "\u7C3D\u6838\u4EBA\u53D6\u81EA\u4F60\u9078\u7684\u524D\u9762\u95DC\u5361\u5BE6\u969B\u7C3D\u6838\u7684\u4EBA\uFF1B\u53EF\u8907\u9078\uFF0C\u6574\u7D44\u8981\u6DB5\u84CB\u6BCF\u689D\u8DEF\u5F91\u3002\u8907\u9078\u591A\u500B\u95DC\u5361\u6642\uFF0C\u53D6\u6700\u8FD1\u5BE6\u969B\u8D70\u5230\u7684\u90A3\u4E00\u95DC\u7684\u7C3D\u6838\u4EBA\uFF0C\u4E0D\u662F\u5168\u90E8\u95DC\u5361\u7684\u7C3D\u6838\u4EBA\u3002";
19
+ /**
20
+ * The 關卡 picker of 依前面關卡的簽核者: the user tasks upstream of `nodeId`
21
+ * that always end with a real signer (`readNodeActorSourceSkipReasons` is
22
+ * empty: no entry condition, no 跳過此關, no 逾時自動核准). Whether the whole group
23
+ * covers every path, or straddles a parallel split, is a property of the
24
+ * selection, not of one stage, so it is reported as `problems` and never used
25
+ * to filter the list (SPEC 5.2: the 154 CF_HR_0002 cases rest on two mutually
26
+ * exclusive stages that would each fail the coverage test alone).
27
+ *
28
+ * A stored stage that no longer qualifies stays in the list, marked, so the
29
+ * stored choice stays visible until the author fixes it.
30
+ */
31
+ export declare function readNodeActorStageChoice(definition: WorkflowDefinition, nodeId: string, selectedIds: readonly string[]): NodeActorStageChoice;
32
+ /**
33
+ * The graph problems of every 依前面關卡的簽核者 node, naming the node: the
34
+ * checks the backend publish lint runs (`readNodeActorSourceIssues`), for the
35
+ * designer to show before publish. An empty stage list is left to
36
+ * `readApproverResolverIssue`, which owns that message.
37
+ */
38
+ export declare function readNodeActorGraphIssues(definition: WorkflowDefinition): readonly string[];
@@ -1,2 +1,2 @@
1
- "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/rolldown-runtime-BocRIvOZ.cjs"),t=require("../../chunks/router-adapter--gYs13E8.cjs"),n=require("../../chunks/format-date-time-D-cx5M8z.cjs"),r=require("../../chunks/routes-config-C1j_vFKo.cjs"),i=require("../../chunks/categories-AxxhqjLZ.cjs"),a=require("./versions/index.cjs");let o=require("react"),s=require("@mezzanine-ui/react"),c=require("react/jsx-runtime"),l=require("@rytass/bpm-core-client/workflow"),u=require("@mezzanine-ui/core/form"),d=require("@mezzanine-ui/react/ContentHeader");d=e.t(d,1);let f=require("@mezzanine-ui/icons"),p=require("@rytass/bpm-core-client/template");var m=[10,20,50],h=[{key:`ALL`,label:`全部`},{key:`PUBLISHED`,label:`已發布`},{key:`DRAFT`,label:`草稿`}],g=100;function _(){let e=t.r(),a=r.r(),[_,O]=(0,o.useState)([]),[k,A]=(0,o.useState)(C),[j,M]=(0,o.useState)([]),[N,P]=(0,o.useState)(new Set),[F,I]=(0,o.useState)(null),[L,R]=(0,o.useState)(!0),[z,B]=(0,o.useState)(1),[V,H]=(0,o.useState)(10),[U,W]=(0,o.useState)(``),[G,K]=(0,o.useState)(`ALL`),[q,J]=(0,o.useState)(0),[Y,X]=(0,o.useState)(null),Z=(0,o.useRef)(0),Q=(0,o.useCallback)(async()=>{let e=Z.current+1;Z.current=e,R(!0),I(null),P(new Set),(0,l.listLaunchableTemplates)().then(t=>{e===Z.current&&P(new Set(t.map(e=>e.id)))}).catch(()=>{e===Z.current&&P(new Set)});try{let[t,n]=await Promise.all([(0,p.listApprovalTemplatesPage)({categoryId:k.categoryId,page:z,pageSize:V,searchText:U,status:G===`ALL`?null:G}),(0,p.listApprovalTemplateCategoriesPage)({page:1,pageSize:g,searchText:``,status:`ACTIVE`})]);if(e!==Z.current)return;M([...n.categories.map(w)]),O(t.templates),J(t.totalCount)}catch(t){e===Z.current&&I(v(t))}finally{e===Z.current&&R(!1)}},[k,z,V,U,G]);(0,o.useEffect)(()=>{Q()},[Q]);let $=(0,o.useCallback)(async e=>{X(e.id),I(null);try{await(e.isActive?(0,p.deactivateApprovalTemplate)(e.id):(0,p.activateApprovalTemplate)(e.id)),await Q()}catch(e){I(v(e))}finally{X(null)}},[Q]),ee=(0,o.useMemo)(()=>_.map(e=>({...e,categoryLabel:D(e),key:e.id,status:e.currentVersionId?`PUBLISHED`:`DRAFT`,updatedAt:n.t(e.updatedAt)})),[_]),te=(0,o.useMemo)(()=>[{dataIndex:`name`,key:`name`,title:`模板名稱`,width:220},{key:`status`,render:e=>(0,c.jsx)(b,{status:e.status}),title:`狀態`,width:120},{key:`isActive`,render:e=>(0,c.jsx)(x,{isActive:e.isActive}),title:`服務狀態`,width:120},{key:`category`,render:e=>(0,c.jsx)(S,{record:e}),title:`分類`,width:160},{dataIndex:`updatedAt`,key:`updatedAt`,title:`更新時間`,width:220}],[]),ne=(0,o.useMemo)(()=>({render:t=>[{disabled:e=>!N.has(e.id),name:`發起`,onClick:()=>e.push(a.caseNew(t.id)),variant:`base-primary`},{name:`設計`,onClick:()=>e.push(a.templateDesigner(t.id))},{name:`版本`,onClick:()=>e.push(a.templateVersions(t.id))},{disabled:e=>Y===e.id,name:t.isActive?`停用`:`啟用`,onClick:e=>{$(e)},variant:t.isActive?`destructive-secondary`:`base-secondary`}],variant:`base-secondary`,width:264}),[Y,N,e,$]);return(0,c.jsx)(c.Fragment,{children:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(s.PageHeader,{children:(0,c.jsx)(d.default,{description:`建立流程模板、維護草稿與發布版本。`,title:`簽核模板`,children:(0,c.jsx)(s.Button,{icon:f.PlusIcon,iconType:`leading`,onClick:()=>e.push(a.templateCompose()),variant:`base-primary`,children:`建立模板`})})}),(0,c.jsx)(s.SectionGroup,{children:(0,c.jsxs)(s.Section,{filterArea:(0,c.jsx)(s.FilterArea,{className:i.n.templateFilterArea,size:`sub`,children:(0,c.jsxs)(s.FilterLine,{children:[(0,c.jsx)(s.Filter,{span:3,children:(0,c.jsx)(s.FormField,{fullWidth:!0,layout:u.FormFieldLayout.VERTICAL,name:`templateSearchText`,children:(0,c.jsx)(s.Input,{fullWidth:!0,onChange:e=>{W(e.target.value),B(1)},placeholder:`關鍵字:搜尋模板名稱、分類或描述`,size:`sub`,value:U,variant:`base`})})}),(0,c.jsx)(s.Filter,{span:2,children:(0,c.jsx)(s.FormField,{fullWidth:!0,layout:u.FormFieldLayout.VERTICAL,name:`templateCategoryFilter`,children:(0,c.jsx)(s.Select,{clearable:!1,fullWidth:!0,onChange:e=>{A(T(e,j)),B(1)},options:[C,...j],placeholder:`分類`,renderValue:e=>`分類:${E(e)}`,size:`sub`,value:k})})})]})}),tab:(0,c.jsx)(s.Tab,{activeKey:G,onChange:e=>{K(y(e)),B(1)},children:h.map(e=>(0,c.jsx)(s.TabItem,{children:e.label},e.key))}),children:[F?(0,c.jsx)(s.Typography,{color:`text-error`,variant:`body`,children:F}):null,(0,c.jsx)(s.Table,{actions:ne,columns:te,dataSource:ee,fullWidth:!0,loading:L,pagination:{current:z,onChange:e=>{B(e)},onChangePageSize:e=>{B(1),H(e)},pageSize:V,pageSizeLabel:`每頁筆數`,pageSizeOptions:m,renderResultSummary:(e,t,n)=>`顯示 ${e}-${t} 筆,共 ${n} 筆`,showPageSizeOptions:!0,total:q}})]})})]})})}function v(e){return e instanceof Error?e.message:`發生未知錯誤`}function y(e){return e===`PUBLISHED`||e===`DRAFT`?e:`ALL`}function b({status:e}){return e===`PUBLISHED`?(0,c.jsx)(s.Badge,{size:`sub`,text:`已發布`,variant:`dot-success`}):(0,c.jsx)(s.Badge,{size:`sub`,text:`草稿`,variant:`dot-inactive`})}function x({isActive:e}){return e?(0,c.jsx)(s.Badge,{size:`sub`,text:`啟用中`,variant:`dot-success`}):(0,c.jsx)(s.Badge,{size:`sub`,text:`已停用`,variant:`dot-inactive`})}function S({record:e}){return e.categoryDetail?.isActive===!1?(0,c.jsx)(s.Badge,{size:`sub`,text:`${e.categoryLabel}(停用)`,variant:`dot-inactive`}):(0,c.jsx)(s.Typography,{component:`span`,variant:`body`,children:e.categoryLabel})}var C={categoryId:null,id:`ALL_CATEGORIES`,name:`全部分類`};function w(e){return{categoryId:e.id,id:e.id,name:e.name}}function T(e,t){if(!O(e))return C;let n=typeof e.id==`string`?e.id:null;return n===C.id?C:t.find(e=>e.id===n)??C}function E(e){return Array.isArray(e)||!O(e)?C.name:typeof e.name==`string`?e.name:C.name}function D(e){return e.categoryDetail?.name??e.category??`未分類`}function O(e){return typeof e==`object`&&!!e}exports.TemplateCategoriesView=i.t,exports.TemplateVersionsView=a.TemplateVersionsView,exports.TemplatesView=_;
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/rolldown-runtime-BocRIvOZ.cjs"),t=require("../../chunks/categories-DQUtVEiV.cjs"),n=require("../../chunks/format-date-time-D-cx5M8z.cjs"),r=require("../../chunks/router-adapter--gYs13E8.cjs"),i=require("../../chunks/routes-config-C1j_vFKo.cjs"),a=require("./versions/index.cjs");let o=require("react"),s=require("@mezzanine-ui/react"),c=require("react/jsx-runtime"),l=require("@rytass/bpm-core-client/workflow"),u=require("@mezzanine-ui/core/form"),d=require("@mezzanine-ui/react/ContentHeader");d=e.t(d,1);let f=require("@mezzanine-ui/icons"),p=require("@rytass/bpm-core-client/template");var m=[10,20,50],h=[{key:`ALL`,label:`全部`},{key:`PUBLISHED`,label:`已發布`},{key:`DRAFT`,label:`草稿`}],g=100;function _(){let e=r.r(),a=i.r(),[_,O]=(0,o.useState)([]),[k,A]=(0,o.useState)(C),[j,M]=(0,o.useState)([]),[N,P]=(0,o.useState)(new Set),[F,I]=(0,o.useState)(null),[L,R]=(0,o.useState)(!0),[z,B]=(0,o.useState)(1),[V,H]=(0,o.useState)(10),[U,W]=(0,o.useState)(``),[G,K]=(0,o.useState)(`ALL`),[q,J]=(0,o.useState)(0),[Y,X]=(0,o.useState)(null),Z=(0,o.useRef)(0),Q=(0,o.useCallback)(async()=>{let e=Z.current+1;Z.current=e,R(!0),I(null),P(new Set),(0,l.listLaunchableTemplates)().then(t=>{e===Z.current&&P(new Set(t.map(e=>e.id)))}).catch(()=>{e===Z.current&&P(new Set)});try{let[t,n]=await Promise.all([(0,p.listApprovalTemplatesPage)({categoryId:k.categoryId,page:z,pageSize:V,searchText:U,status:G===`ALL`?null:G}),(0,p.listApprovalTemplateCategoriesPage)({page:1,pageSize:g,searchText:``,status:`ACTIVE`})]);if(e!==Z.current)return;M([...n.categories.map(w)]),O(t.templates),J(t.totalCount)}catch(t){e===Z.current&&I(v(t))}finally{e===Z.current&&R(!1)}},[k,z,V,U,G]);(0,o.useEffect)(()=>{Q()},[Q]);let $=(0,o.useCallback)(async e=>{X(e.id),I(null);try{await(e.isActive?(0,p.deactivateApprovalTemplate)(e.id):(0,p.activateApprovalTemplate)(e.id)),await Q()}catch(e){I(v(e))}finally{X(null)}},[Q]),ee=(0,o.useMemo)(()=>_.map(e=>({...e,categoryLabel:D(e),key:e.id,status:e.currentVersionId?`PUBLISHED`:`DRAFT`,updatedAt:n.t(e.updatedAt)})),[_]),te=(0,o.useMemo)(()=>[{dataIndex:`name`,key:`name`,title:`模板名稱`,width:220},{key:`status`,render:e=>(0,c.jsx)(b,{status:e.status}),title:`狀態`,width:120},{key:`isActive`,render:e=>(0,c.jsx)(x,{isActive:e.isActive}),title:`服務狀態`,width:120},{key:`category`,render:e=>(0,c.jsx)(S,{record:e}),title:`分類`,width:160},{dataIndex:`updatedAt`,key:`updatedAt`,title:`更新時間`,width:220}],[]),ne=(0,o.useMemo)(()=>({render:t=>[{disabled:e=>!N.has(e.id),name:`發起`,onClick:()=>e.push(a.caseNew(t.id)),variant:`base-primary`},{name:`設計`,onClick:()=>e.push(a.templateDesigner(t.id))},{name:`版本`,onClick:()=>e.push(a.templateVersions(t.id))},{disabled:e=>Y===e.id,name:t.isActive?`停用`:`啟用`,onClick:e=>{$(e)},variant:t.isActive?`destructive-secondary`:`base-secondary`}],variant:`base-secondary`,width:264}),[Y,N,e,$]);return(0,c.jsx)(c.Fragment,{children:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(s.PageHeader,{children:(0,c.jsx)(d.default,{description:`建立流程模板、維護草稿與發布版本。`,title:`簽核模板`,children:(0,c.jsx)(s.Button,{icon:f.PlusIcon,iconType:`leading`,onClick:()=>e.push(a.templateCompose()),variant:`base-primary`,children:`建立模板`})})}),(0,c.jsx)(s.SectionGroup,{children:(0,c.jsxs)(s.Section,{filterArea:(0,c.jsx)(s.FilterArea,{className:t.n.templateFilterArea,size:`sub`,children:(0,c.jsxs)(s.FilterLine,{children:[(0,c.jsx)(s.Filter,{span:3,children:(0,c.jsx)(s.FormField,{fullWidth:!0,layout:u.FormFieldLayout.VERTICAL,name:`templateSearchText`,children:(0,c.jsx)(s.Input,{fullWidth:!0,onChange:e=>{W(e.target.value),B(1)},placeholder:`關鍵字:搜尋模板名稱、分類或描述`,size:`sub`,value:U,variant:`base`})})}),(0,c.jsx)(s.Filter,{span:2,children:(0,c.jsx)(s.FormField,{fullWidth:!0,layout:u.FormFieldLayout.VERTICAL,name:`templateCategoryFilter`,children:(0,c.jsx)(s.Select,{clearable:!1,fullWidth:!0,onChange:e=>{A(T(e,j)),B(1)},options:[C,...j],placeholder:`分類`,renderValue:e=>`分類:${E(e)}`,size:`sub`,value:k})})})]})}),tab:(0,c.jsx)(s.Tab,{activeKey:G,onChange:e=>{K(y(e)),B(1)},children:h.map(e=>(0,c.jsx)(s.TabItem,{children:e.label},e.key))}),children:[F?(0,c.jsx)(s.Typography,{color:`text-error`,variant:`body`,children:F}):null,(0,c.jsx)(s.Table,{actions:ne,columns:te,dataSource:ee,fullWidth:!0,loading:L,pagination:{current:z,onChange:e=>{B(e)},onChangePageSize:e=>{B(1),H(e)},pageSize:V,pageSizeLabel:`每頁筆數`,pageSizeOptions:m,renderResultSummary:(e,t,n)=>`顯示 ${e}-${t} 筆,共 ${n} 筆`,showPageSizeOptions:!0,total:q}})]})})]})})}function v(e){return e instanceof Error?e.message:`發生未知錯誤`}function y(e){return e===`PUBLISHED`||e===`DRAFT`?e:`ALL`}function b({status:e}){return e===`PUBLISHED`?(0,c.jsx)(s.Badge,{size:`sub`,text:`已發布`,variant:`dot-success`}):(0,c.jsx)(s.Badge,{size:`sub`,text:`草稿`,variant:`dot-inactive`})}function x({isActive:e}){return e?(0,c.jsx)(s.Badge,{size:`sub`,text:`啟用中`,variant:`dot-success`}):(0,c.jsx)(s.Badge,{size:`sub`,text:`已停用`,variant:`dot-inactive`})}function S({record:e}){return e.categoryDetail?.isActive===!1?(0,c.jsx)(s.Badge,{size:`sub`,text:`${e.categoryLabel}(停用)`,variant:`dot-inactive`}):(0,c.jsx)(s.Typography,{component:`span`,variant:`body`,children:e.categoryLabel})}var C={categoryId:null,id:`ALL_CATEGORIES`,name:`全部分類`};function w(e){return{categoryId:e.id,id:e.id,name:e.name}}function T(e,t){if(!O(e))return C;let n=typeof e.id==`string`?e.id:null;return n===C.id?C:t.find(e=>e.id===n)??C}function E(e){return Array.isArray(e)||!O(e)?C.name:typeof e.name==`string`?e.name:C.name}function D(e){return e.categoryDetail?.name??e.category??`未分類`}function O(e){return typeof e==`object`&&!!e}exports.TemplateCategoriesView=t.t,exports.TemplateVersionsView=a.TemplateVersionsView,exports.TemplatesView=_;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["useRouterAdapter","useBPMRoutes","useState","useRef","useCallback","listLaunchableTemplates","listApprovalTemplatesPage","listApprovalTemplateCategoriesPage","deactivateApprovalTemplate","activateApprovalTemplate","useMemo","formatDateTime","_Fragment","PageHeader","ContentHeader","Button","PlusIcon","SectionGroup","Section","FilterArea","styles","FilterLine","Filter","FormField","FormFieldLayout","Input","Select","Tab","TabItem","Typography","Table","Badge","require_rolldown_runtime","require_router_adapter","require_format_date_time","require_routes_config","require_categories","require_views_templates_versions_index","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","TEMPLATE_PAGE_SIZE_OPTIONS","TEMPLATE_STATUS_TABS","TEMPLATE_CATEGORY_PAGE_SIZE","TemplatesView","router","routes","templates","setTemplates","categoryFilter","setCategoryFilter","UNCATEGORIZED_TEMPLATE_FILTER_OPTION","categoryOptions","setCategoryOptions","launchableTemplateIds","setLaunchableTemplateIds","error","setError","loading","setLoading","templatePage","setTemplatePage","templatePageSize","setTemplatePageSize","templateSearchText","setTemplateSearchText","templateStatus","setTemplateStatus","templateTotalCount","setTemplateTotalCount","activationPendingTemplateId","setActivationPendingTemplateId","refreshRequestIdRef","refreshTemplates","requestId","nextLaunchableTemplates","template","templatePageResult","activeCategoryPageResult","readCategoryOption","requestError","readErrorMessage","toggleTemplateActivation","rows","readTemplateCategoryLabel","columns","TemplateStatusBadge","record","TemplateActivationBadge","TemplateCategoryLabel","tableActions","event","readCategoryFilterOption","option","readTemplateCategoryFilterLabel","value","readTemplateStatusTabKey","activeKey","statusTab","page","pageSize","from","to","total","status","isActive","category","isRecord","id","options"],"sources":["../../../src/views/templates/TemplatesView.tsx"],"sourcesContent":["'use client';\n\nimport type { ChangeEvent, Key, ReactElement } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Badge,\n Button,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\n PageHeader,\n Section,\n SectionGroup,\n Select,\n Tab,\n TabItem,\n Table,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport styles from './templates.module.scss';\nimport { formatDateTime } from '../../lib/format-date-time';\nimport { useRouterAdapter } from '../../lib/router-adapter';\nimport { useBPMRoutes } from '../../lib/routes-config';\nimport {\n ApprovalTemplateListStatus,\n ApprovalTemplateRecord,\n ApprovalTemplateCategoryRecord,\n activateApprovalTemplate,\n deactivateApprovalTemplate,\n listApprovalTemplateCategoriesPage,\n listApprovalTemplatesPage,\n} from '@rytass/bpm-core-client/template';\nimport { listLaunchableTemplates } from '@rytass/bpm-core-client/workflow';\n\nconst TEMPLATE_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst TEMPLATE_STATUS_TABS: readonly {\n readonly key: TemplateStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'PUBLISHED', label: '已發布' },\n { key: 'DRAFT', label: '草稿' },\n];\n\nconst TEMPLATE_CATEGORY_PAGE_SIZE = 100;\n\nexport interface TemplateCategoryOption {\n readonly categoryId: string | null;\n readonly id: string;\n readonly name: string;\n}\n\ntype TemplateStatusTabKey = 'ALL' | ApprovalTemplateListStatus;\n\ntype TemplateRow = Readonly<\n Record<string, unknown> &\n ApprovalTemplateRecord & {\n categoryLabel: string;\n key: string;\n status: ApprovalTemplateListStatus;\n }\n>;\n\nexport function TemplatesView(): ReactElement {\n const router = useRouterAdapter();\n const routes = useBPMRoutes();\n const [templates, setTemplates] = useState<readonly ApprovalTemplateRecord[]>(\n [],\n );\n const [categoryFilter, setCategoryFilter] = useState<TemplateCategoryOption>(\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION,\n );\n const [categoryOptions, setCategoryOptions] = useState<\n readonly TemplateCategoryOption[]\n >([]);\n const [launchableTemplateIds, setLaunchableTemplateIds] = useState<\n ReadonlySet<string>\n >(new Set());\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [templatePage, setTemplatePage] = useState(1);\n const [templatePageSize, setTemplatePageSize] = useState(10);\n const [templateSearchText, setTemplateSearchText] = useState('');\n const [templateStatus, setTemplateStatus] =\n useState<TemplateStatusTabKey>('ALL');\n const [templateTotalCount, setTemplateTotalCount] = useState(0);\n const [activationPendingTemplateId, setActivationPendingTemplateId] =\n useState<string | null>(null);\n const refreshRequestIdRef = useRef(0);\n\n const refreshTemplates = useCallback(async (): Promise<void> => {\n const requestId = refreshRequestIdRef.current + 1;\n refreshRequestIdRef.current = requestId;\n setLoading(true);\n setError(null);\n setLaunchableTemplateIds(new Set());\n\n void listLaunchableTemplates()\n .then((nextLaunchableTemplates): void => {\n if (requestId !== refreshRequestIdRef.current) {\n return;\n }\n\n setLaunchableTemplateIds(\n new Set(nextLaunchableTemplates.map((template) => template.id)),\n );\n })\n .catch((): void => {\n if (requestId === refreshRequestIdRef.current) {\n setLaunchableTemplateIds(new Set());\n }\n });\n\n try {\n const [templatePageResult, activeCategoryPageResult] = await Promise.all([\n listApprovalTemplatesPage({\n categoryId: categoryFilter.categoryId,\n page: templatePage,\n pageSize: templatePageSize,\n searchText: templateSearchText,\n status: templateStatus === 'ALL' ? null : templateStatus,\n }),\n listApprovalTemplateCategoriesPage({\n page: 1,\n pageSize: TEMPLATE_CATEGORY_PAGE_SIZE,\n searchText: '',\n status: 'ACTIVE',\n }),\n ]);\n\n if (requestId !== refreshRequestIdRef.current) {\n return;\n }\n\n setCategoryOptions([\n ...activeCategoryPageResult.categories.map(readCategoryOption),\n ]);\n setTemplates(templatePageResult.templates);\n setTemplateTotalCount(templatePageResult.totalCount);\n } catch (requestError: unknown) {\n if (requestId === refreshRequestIdRef.current) {\n setError(readErrorMessage(requestError));\n }\n } finally {\n if (requestId === refreshRequestIdRef.current) {\n setLoading(false);\n }\n }\n }, [\n categoryFilter,\n templatePage,\n templatePageSize,\n templateSearchText,\n templateStatus,\n ]);\n\n useEffect((): void => {\n void refreshTemplates();\n }, [refreshTemplates]);\n\n const toggleTemplateActivation = useCallback(\n async (template: ApprovalTemplateRecord): Promise<void> => {\n setActivationPendingTemplateId(template.id);\n setError(null);\n\n try {\n await (template.isActive\n ? deactivateApprovalTemplate(template.id)\n : activateApprovalTemplate(template.id));\n await refreshTemplates();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setActivationPendingTemplateId(null);\n }\n },\n [refreshTemplates],\n );\n\n const rows = useMemo(\n (): TemplateRow[] =>\n templates.map((template) => ({\n ...template,\n categoryLabel: readTemplateCategoryLabel(template),\n key: template.id,\n status: template.currentVersionId ? 'PUBLISHED' : 'DRAFT',\n updatedAt: formatDateTime(template.updatedAt),\n })),\n [templates],\n );\n const columns = useMemo(\n (): TableColumn<TemplateRow>[] => [\n { dataIndex: 'name', key: 'name', title: '模板名稱', width: 220 },\n {\n key: 'status',\n render: (record: TemplateRow): ReactElement => (\n <TemplateStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n {\n key: 'isActive',\n render: (record: TemplateRow): ReactElement => (\n <TemplateActivationBadge isActive={record.isActive} />\n ),\n title: '服務狀態',\n width: 120,\n },\n {\n key: 'category',\n render: (record: TemplateRow): ReactElement => (\n <TemplateCategoryLabel record={record} />\n ),\n title: '分類',\n width: 160,\n },\n {\n dataIndex: 'updatedAt',\n key: 'updatedAt',\n title: '更新時間',\n width: 220,\n },\n ],\n [],\n );\n const tableActions = useMemo(\n (): TableActions<TemplateRow> => ({\n render: (record): ReturnType<TableActions<TemplateRow>['render']> => [\n {\n disabled: (template): boolean =>\n !launchableTemplateIds.has(template.id),\n name: '發起',\n onClick: (): void => router.push(routes.caseNew(record.id)),\n variant: 'base-primary',\n },\n {\n name: '設計',\n onClick: (): void => router.push(routes.templateDesigner(record.id)),\n },\n {\n name: '版本',\n onClick: (): void => router.push(routes.templateVersions(record.id)),\n },\n {\n disabled: (template): boolean =>\n activationPendingTemplateId === template.id,\n name: record.isActive ? '停用' : '啟用',\n onClick: (template): void => {\n void toggleTemplateActivation(template);\n },\n variant: record.isActive ? 'destructive-secondary' : 'base-secondary',\n },\n ],\n variant: 'base-secondary',\n width: 264,\n }),\n [\n activationPendingTemplateId,\n launchableTemplateIds,\n router,\n toggleTemplateActivation,\n ],\n );\n\n return (\n <>\n <>\n <PageHeader>\n <ContentHeader\n description=\"建立流程模板、維護草稿與發布版本。\"\n title=\"簽核模板\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void => router.push(routes.templateCompose())}\n variant=\"base-primary\"\n >\n 建立模板\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.templateFilterArea} size=\"sub\">\n <FilterLine>\n <Filter span={3}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"templateSearchText\"\n >\n <Input\n fullWidth\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n setTemplateSearchText(event.target.value);\n setTemplatePage(1);\n }}\n placeholder=\"關鍵字:搜尋模板名稱、分類或描述\"\n size=\"sub\"\n value={templateSearchText}\n variant=\"base\"\n />\n </FormField>\n </Filter>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"templateCategoryFilter\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => {\n setCategoryFilter(\n readCategoryFilterOption(option, categoryOptions),\n );\n setTemplatePage(1);\n }}\n options={[\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION,\n ...categoryOptions,\n ]}\n placeholder=\"分類\"\n renderValue={(value): string =>\n `分類:${readTemplateCategoryFilterLabel(value)}`\n }\n size=\"sub\"\n value={categoryFilter}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={templateStatus}\n onChange={(activeKey): void => {\n setTemplateStatus(readTemplateStatusTabKey(activeKey));\n setTemplatePage(1);\n }}\n >\n {TEMPLATE_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: templatePage,\n onChange: (page): void => {\n setTemplatePage(page);\n },\n onChangePageSize: (pageSize): void => {\n setTemplatePage(1);\n setTemplatePageSize(pageSize);\n },\n pageSize: templatePageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: TEMPLATE_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: templateTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n </>\n </>\n );\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction readTemplateStatusTabKey(activeKey: Key): TemplateStatusTabKey {\n if (activeKey === 'PUBLISHED' || activeKey === 'DRAFT') {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction TemplateStatusBadge({\n status,\n}: {\n readonly status: ApprovalTemplateListStatus;\n}): ReactElement {\n if (status === 'PUBLISHED') {\n return <Badge size=\"sub\" text=\"已發布\" variant=\"dot-success\" />;\n }\n\n return <Badge size=\"sub\" text=\"草稿\" variant=\"dot-inactive\" />;\n}\n\nfunction TemplateActivationBadge({\n isActive,\n}: {\n readonly isActive: boolean;\n}): ReactElement {\n if (isActive) {\n return <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />;\n }\n\n return <Badge size=\"sub\" text=\"已停用\" variant=\"dot-inactive\" />;\n}\n\nfunction TemplateCategoryLabel({\n record,\n}: {\n readonly record: TemplateRow;\n}): ReactElement {\n if (record.categoryDetail?.isActive === false) {\n return (\n <Badge\n size=\"sub\"\n text={`${record.categoryLabel}(停用)`}\n variant=\"dot-inactive\"\n />\n );\n }\n\n return (\n <Typography component=\"span\" variant=\"body\">\n {record.categoryLabel}\n </Typography>\n );\n}\n\nconst UNCATEGORIZED_TEMPLATE_FILTER_OPTION: TemplateCategoryOption = {\n categoryId: null,\n id: 'ALL_CATEGORIES',\n name: '全部分類',\n};\n\nfunction readCategoryOption(\n category: ApprovalTemplateCategoryRecord,\n): TemplateCategoryOption {\n return {\n categoryId: category.id,\n id: category.id,\n name: category.name,\n };\n}\n\nfunction readCategoryFilterOption(\n value: unknown,\n options: readonly TemplateCategoryOption[],\n): TemplateCategoryOption {\n if (!isRecord(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION;\n }\n\n const id = typeof value.id === 'string' ? value.id : null;\n\n if (id === UNCATEGORIZED_TEMPLATE_FILTER_OPTION.id) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION;\n }\n\n return (\n options.find((option) => option.id === id) ??\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION\n );\n}\n\nfunction readTemplateCategoryFilterLabel(value: unknown): string {\n if (Array.isArray(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n }\n\n if (!isRecord(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n }\n\n return typeof value.name === 'string'\n ? value.name\n : UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n}\n\nfunction readTemplateCategoryLabel(template: ApprovalTemplateRecord): string {\n return template.categoryDetail?.name ?? template.category ?? '未分類';\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":"index.cjs","names":["useRouterAdapter","useBPMRoutes","useState","useRef","useCallback","listLaunchableTemplates","listApprovalTemplatesPage","listApprovalTemplateCategoriesPage","deactivateApprovalTemplate","activateApprovalTemplate","useMemo","formatDateTime","_Fragment","PageHeader","ContentHeader","Button","PlusIcon","SectionGroup","Section","FilterArea","styles","FilterLine","Filter","FormField","FormFieldLayout","Input","Select","Tab","TabItem","Typography","Table","Badge","require_rolldown_runtime","require_categories","require_format_date_time","require_router_adapter","require_routes_config","require_views_templates_versions_index","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","TEMPLATE_PAGE_SIZE_OPTIONS","TEMPLATE_STATUS_TABS","TEMPLATE_CATEGORY_PAGE_SIZE","TemplatesView","router","routes","templates","setTemplates","categoryFilter","setCategoryFilter","UNCATEGORIZED_TEMPLATE_FILTER_OPTION","categoryOptions","setCategoryOptions","launchableTemplateIds","setLaunchableTemplateIds","error","setError","loading","setLoading","templatePage","setTemplatePage","templatePageSize","setTemplatePageSize","templateSearchText","setTemplateSearchText","templateStatus","setTemplateStatus","templateTotalCount","setTemplateTotalCount","activationPendingTemplateId","setActivationPendingTemplateId","refreshRequestIdRef","refreshTemplates","requestId","nextLaunchableTemplates","template","templatePageResult","activeCategoryPageResult","readCategoryOption","requestError","readErrorMessage","toggleTemplateActivation","rows","readTemplateCategoryLabel","columns","TemplateStatusBadge","record","TemplateActivationBadge","TemplateCategoryLabel","tableActions","event","readCategoryFilterOption","option","readTemplateCategoryFilterLabel","value","readTemplateStatusTabKey","activeKey","statusTab","page","pageSize","from","to","total","status","isActive","category","isRecord","id","options"],"sources":["../../../src/views/templates/TemplatesView.tsx"],"sourcesContent":["'use client';\n\nimport type { ChangeEvent, Key, ReactElement } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Badge,\n Button,\n Filter,\n FilterArea,\n FilterLine,\n FormField,\n Input,\n PageHeader,\n Section,\n SectionGroup,\n Select,\n Tab,\n TabItem,\n Table,\n Typography,\n} from '@mezzanine-ui/react';\nimport ContentHeader from '@mezzanine-ui/react/ContentHeader';\nimport { PlusIcon } from '@mezzanine-ui/icons';\nimport { FormFieldLayout } from '@mezzanine-ui/core/form';\nimport type { TableActions, TableColumn } from '@mezzanine-ui/core/table';\nimport styles from './templates.module.scss';\nimport { formatDateTime } from '../../lib/format-date-time';\nimport { useRouterAdapter } from '../../lib/router-adapter';\nimport { useBPMRoutes } from '../../lib/routes-config';\nimport {\n ApprovalTemplateListStatus,\n ApprovalTemplateRecord,\n ApprovalTemplateCategoryRecord,\n activateApprovalTemplate,\n deactivateApprovalTemplate,\n listApprovalTemplateCategoriesPage,\n listApprovalTemplatesPage,\n} from '@rytass/bpm-core-client/template';\nimport { listLaunchableTemplates } from '@rytass/bpm-core-client/workflow';\n\nconst TEMPLATE_PAGE_SIZE_OPTIONS = [10, 20, 50];\nconst TEMPLATE_STATUS_TABS: readonly {\n readonly key: TemplateStatusTabKey;\n readonly label: string;\n}[] = [\n { key: 'ALL', label: '全部' },\n { key: 'PUBLISHED', label: '已發布' },\n { key: 'DRAFT', label: '草稿' },\n];\n\nconst TEMPLATE_CATEGORY_PAGE_SIZE = 100;\n\nexport interface TemplateCategoryOption {\n readonly categoryId: string | null;\n readonly id: string;\n readonly name: string;\n}\n\ntype TemplateStatusTabKey = 'ALL' | ApprovalTemplateListStatus;\n\ntype TemplateRow = Readonly<\n Record<string, unknown> &\n ApprovalTemplateRecord & {\n categoryLabel: string;\n key: string;\n status: ApprovalTemplateListStatus;\n }\n>;\n\nexport function TemplatesView(): ReactElement {\n const router = useRouterAdapter();\n const routes = useBPMRoutes();\n const [templates, setTemplates] = useState<readonly ApprovalTemplateRecord[]>(\n [],\n );\n const [categoryFilter, setCategoryFilter] = useState<TemplateCategoryOption>(\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION,\n );\n const [categoryOptions, setCategoryOptions] = useState<\n readonly TemplateCategoryOption[]\n >([]);\n const [launchableTemplateIds, setLaunchableTemplateIds] = useState<\n ReadonlySet<string>\n >(new Set());\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [templatePage, setTemplatePage] = useState(1);\n const [templatePageSize, setTemplatePageSize] = useState(10);\n const [templateSearchText, setTemplateSearchText] = useState('');\n const [templateStatus, setTemplateStatus] =\n useState<TemplateStatusTabKey>('ALL');\n const [templateTotalCount, setTemplateTotalCount] = useState(0);\n const [activationPendingTemplateId, setActivationPendingTemplateId] =\n useState<string | null>(null);\n const refreshRequestIdRef = useRef(0);\n\n const refreshTemplates = useCallback(async (): Promise<void> => {\n const requestId = refreshRequestIdRef.current + 1;\n refreshRequestIdRef.current = requestId;\n setLoading(true);\n setError(null);\n setLaunchableTemplateIds(new Set());\n\n void listLaunchableTemplates()\n .then((nextLaunchableTemplates): void => {\n if (requestId !== refreshRequestIdRef.current) {\n return;\n }\n\n setLaunchableTemplateIds(\n new Set(nextLaunchableTemplates.map((template) => template.id)),\n );\n })\n .catch((): void => {\n if (requestId === refreshRequestIdRef.current) {\n setLaunchableTemplateIds(new Set());\n }\n });\n\n try {\n const [templatePageResult, activeCategoryPageResult] = await Promise.all([\n listApprovalTemplatesPage({\n categoryId: categoryFilter.categoryId,\n page: templatePage,\n pageSize: templatePageSize,\n searchText: templateSearchText,\n status: templateStatus === 'ALL' ? null : templateStatus,\n }),\n listApprovalTemplateCategoriesPage({\n page: 1,\n pageSize: TEMPLATE_CATEGORY_PAGE_SIZE,\n searchText: '',\n status: 'ACTIVE',\n }),\n ]);\n\n if (requestId !== refreshRequestIdRef.current) {\n return;\n }\n\n setCategoryOptions([\n ...activeCategoryPageResult.categories.map(readCategoryOption),\n ]);\n setTemplates(templatePageResult.templates);\n setTemplateTotalCount(templatePageResult.totalCount);\n } catch (requestError: unknown) {\n if (requestId === refreshRequestIdRef.current) {\n setError(readErrorMessage(requestError));\n }\n } finally {\n if (requestId === refreshRequestIdRef.current) {\n setLoading(false);\n }\n }\n }, [\n categoryFilter,\n templatePage,\n templatePageSize,\n templateSearchText,\n templateStatus,\n ]);\n\n useEffect((): void => {\n void refreshTemplates();\n }, [refreshTemplates]);\n\n const toggleTemplateActivation = useCallback(\n async (template: ApprovalTemplateRecord): Promise<void> => {\n setActivationPendingTemplateId(template.id);\n setError(null);\n\n try {\n await (template.isActive\n ? deactivateApprovalTemplate(template.id)\n : activateApprovalTemplate(template.id));\n await refreshTemplates();\n } catch (requestError: unknown) {\n setError(readErrorMessage(requestError));\n } finally {\n setActivationPendingTemplateId(null);\n }\n },\n [refreshTemplates],\n );\n\n const rows = useMemo(\n (): TemplateRow[] =>\n templates.map((template) => ({\n ...template,\n categoryLabel: readTemplateCategoryLabel(template),\n key: template.id,\n status: template.currentVersionId ? 'PUBLISHED' : 'DRAFT',\n updatedAt: formatDateTime(template.updatedAt),\n })),\n [templates],\n );\n const columns = useMemo(\n (): TableColumn<TemplateRow>[] => [\n { dataIndex: 'name', key: 'name', title: '模板名稱', width: 220 },\n {\n key: 'status',\n render: (record: TemplateRow): ReactElement => (\n <TemplateStatusBadge status={record.status} />\n ),\n title: '狀態',\n width: 120,\n },\n {\n key: 'isActive',\n render: (record: TemplateRow): ReactElement => (\n <TemplateActivationBadge isActive={record.isActive} />\n ),\n title: '服務狀態',\n width: 120,\n },\n {\n key: 'category',\n render: (record: TemplateRow): ReactElement => (\n <TemplateCategoryLabel record={record} />\n ),\n title: '分類',\n width: 160,\n },\n {\n dataIndex: 'updatedAt',\n key: 'updatedAt',\n title: '更新時間',\n width: 220,\n },\n ],\n [],\n );\n const tableActions = useMemo(\n (): TableActions<TemplateRow> => ({\n render: (record): ReturnType<TableActions<TemplateRow>['render']> => [\n {\n disabled: (template): boolean =>\n !launchableTemplateIds.has(template.id),\n name: '發起',\n onClick: (): void => router.push(routes.caseNew(record.id)),\n variant: 'base-primary',\n },\n {\n name: '設計',\n onClick: (): void => router.push(routes.templateDesigner(record.id)),\n },\n {\n name: '版本',\n onClick: (): void => router.push(routes.templateVersions(record.id)),\n },\n {\n disabled: (template): boolean =>\n activationPendingTemplateId === template.id,\n name: record.isActive ? '停用' : '啟用',\n onClick: (template): void => {\n void toggleTemplateActivation(template);\n },\n variant: record.isActive ? 'destructive-secondary' : 'base-secondary',\n },\n ],\n variant: 'base-secondary',\n width: 264,\n }),\n [\n activationPendingTemplateId,\n launchableTemplateIds,\n router,\n toggleTemplateActivation,\n ],\n );\n\n return (\n <>\n <>\n <PageHeader>\n <ContentHeader\n description=\"建立流程模板、維護草稿與發布版本。\"\n title=\"簽核模板\"\n >\n <Button\n icon={PlusIcon}\n iconType=\"leading\"\n onClick={(): void => router.push(routes.templateCompose())}\n variant=\"base-primary\"\n >\n 建立模板\n </Button>\n </ContentHeader>\n </PageHeader>\n\n <SectionGroup>\n <Section\n filterArea={\n <FilterArea className={styles.templateFilterArea} size=\"sub\">\n <FilterLine>\n <Filter span={3}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"templateSearchText\"\n >\n <Input\n fullWidth\n onChange={(\n event: ChangeEvent<HTMLInputElement>,\n ): void => {\n setTemplateSearchText(event.target.value);\n setTemplatePage(1);\n }}\n placeholder=\"關鍵字:搜尋模板名稱、分類或描述\"\n size=\"sub\"\n value={templateSearchText}\n variant=\"base\"\n />\n </FormField>\n </Filter>\n <Filter span={2}>\n <FormField\n fullWidth\n layout={FormFieldLayout.VERTICAL}\n name=\"templateCategoryFilter\"\n >\n <Select\n clearable={false}\n fullWidth\n onChange={(option): void => {\n setCategoryFilter(\n readCategoryFilterOption(option, categoryOptions),\n );\n setTemplatePage(1);\n }}\n options={[\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION,\n ...categoryOptions,\n ]}\n placeholder=\"分類\"\n renderValue={(value): string =>\n `分類:${readTemplateCategoryFilterLabel(value)}`\n }\n size=\"sub\"\n value={categoryFilter}\n />\n </FormField>\n </Filter>\n </FilterLine>\n </FilterArea>\n }\n tab={\n <Tab\n activeKey={templateStatus}\n onChange={(activeKey): void => {\n setTemplateStatus(readTemplateStatusTabKey(activeKey));\n setTemplatePage(1);\n }}\n >\n {TEMPLATE_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: templatePage,\n onChange: (page): void => {\n setTemplatePage(page);\n },\n onChangePageSize: (pageSize): void => {\n setTemplatePage(1);\n setTemplatePageSize(pageSize);\n },\n pageSize: templatePageSize,\n pageSizeLabel: '每頁筆數',\n pageSizeOptions: TEMPLATE_PAGE_SIZE_OPTIONS,\n renderResultSummary: (from, to, total): string =>\n `顯示 ${from}-${to} 筆,共 ${total} 筆`,\n showPageSizeOptions: true,\n total: templateTotalCount,\n }}\n />\n </Section>\n </SectionGroup>\n </>\n </>\n );\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : '發生未知錯誤';\n}\n\nfunction readTemplateStatusTabKey(activeKey: Key): TemplateStatusTabKey {\n if (activeKey === 'PUBLISHED' || activeKey === 'DRAFT') {\n return activeKey;\n }\n\n return 'ALL';\n}\n\nfunction TemplateStatusBadge({\n status,\n}: {\n readonly status: ApprovalTemplateListStatus;\n}): ReactElement {\n if (status === 'PUBLISHED') {\n return <Badge size=\"sub\" text=\"已發布\" variant=\"dot-success\" />;\n }\n\n return <Badge size=\"sub\" text=\"草稿\" variant=\"dot-inactive\" />;\n}\n\nfunction TemplateActivationBadge({\n isActive,\n}: {\n readonly isActive: boolean;\n}): ReactElement {\n if (isActive) {\n return <Badge size=\"sub\" text=\"啟用中\" variant=\"dot-success\" />;\n }\n\n return <Badge size=\"sub\" text=\"已停用\" variant=\"dot-inactive\" />;\n}\n\nfunction TemplateCategoryLabel({\n record,\n}: {\n readonly record: TemplateRow;\n}): ReactElement {\n if (record.categoryDetail?.isActive === false) {\n return (\n <Badge\n size=\"sub\"\n text={`${record.categoryLabel}(停用)`}\n variant=\"dot-inactive\"\n />\n );\n }\n\n return (\n <Typography component=\"span\" variant=\"body\">\n {record.categoryLabel}\n </Typography>\n );\n}\n\nconst UNCATEGORIZED_TEMPLATE_FILTER_OPTION: TemplateCategoryOption = {\n categoryId: null,\n id: 'ALL_CATEGORIES',\n name: '全部分類',\n};\n\nfunction readCategoryOption(\n category: ApprovalTemplateCategoryRecord,\n): TemplateCategoryOption {\n return {\n categoryId: category.id,\n id: category.id,\n name: category.name,\n };\n}\n\nfunction readCategoryFilterOption(\n value: unknown,\n options: readonly TemplateCategoryOption[],\n): TemplateCategoryOption {\n if (!isRecord(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION;\n }\n\n const id = typeof value.id === 'string' ? value.id : null;\n\n if (id === UNCATEGORIZED_TEMPLATE_FILTER_OPTION.id) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION;\n }\n\n return (\n options.find((option) => option.id === id) ??\n UNCATEGORIZED_TEMPLATE_FILTER_OPTION\n );\n}\n\nfunction readTemplateCategoryFilterLabel(value: unknown): string {\n if (Array.isArray(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n }\n\n if (!isRecord(value)) {\n return UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n }\n\n return typeof value.name === 'string'\n ? value.name\n : UNCATEGORIZED_TEMPLATE_FILTER_OPTION.name;\n}\n\nfunction readTemplateCategoryLabel(template: ApprovalTemplateRecord): string {\n return template.categoryDetail?.name ?? template.category ?? '未分類';\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,19 +1,19 @@
1
1
  "use client";
2
- import { r as e } from "../../chunks/router-adapter-DftlFTOd.js";
3
- import { t } from "../../chunks/format-date-time-CB-LxzqT.js";
4
- import { r as n } from "../../chunks/routes-config-yZbESPlw.js";
5
- import { n as ee, t as r } from "../../chunks/categories-riC33J_j.js";
6
- import { TemplateVersionsView as i } from "./versions/index.js";
7
- import { useCallback as a, useEffect as o, useMemo as s, useRef as c, useState as l } from "react";
8
- import { Badge as u, Button as te, Filter as d, FilterArea as ne, FilterLine as re, FormField as f, Input as p, PageHeader as m, Section as h, SectionGroup as ie, Select as ae, Tab as oe, TabItem as se, Table as ce, Typography as g } from "@mezzanine-ui/react";
2
+ import { n as e, t } from "../../chunks/categories-BAdxjNSA.js";
3
+ import { t as n } from "../../chunks/format-date-time-B0LdmWg4.js";
4
+ import { r as ee } from "../../chunks/router-adapter-CkxCyzf5.js";
5
+ import { r as te } from "../../chunks/routes-config-BcNaWJWJ.js";
6
+ import { TemplateVersionsView as r } from "./versions/index.js";
7
+ import { useCallback as i, useEffect as ne, useMemo as a, useRef as o, useState as s } from "react";
8
+ import { Badge as c, Button as re, Filter as l, FilterArea as ie, FilterLine as u, FormField as d, Input as f, PageHeader as p, Section as m, SectionGroup as h, Select as ae, Tab as oe, TabItem as se, Table as ce, Typography as g } from "@mezzanine-ui/react";
9
9
  import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
10
- import { listLaunchableTemplates as b } from "@rytass/bpm-core-client/workflow";
11
- import { FormFieldLayout as x } from "@mezzanine-ui/core/form";
12
- import le from "@mezzanine-ui/react/ContentHeader";
13
- import { PlusIcon as ue } from "@mezzanine-ui/icons";
14
- import { activateApprovalTemplate as de, deactivateApprovalTemplate as fe, listApprovalTemplateCategoriesPage as pe, listApprovalTemplatesPage as me } from "@rytass/bpm-core-client/template";
15
- //#region src/views/templates/TemplatesView.tsx
16
- var he = [
10
+ import { listLaunchableTemplates as le } from "@rytass/bpm-core-client/workflow";
11
+ import { FormFieldLayout as b } from "@mezzanine-ui/core/form";
12
+ import ue from "@mezzanine-ui/react/ContentHeader";
13
+ import { PlusIcon as de } from "@mezzanine-ui/icons";
14
+ import { activateApprovalTemplate as fe, deactivateApprovalTemplate as pe, listApprovalTemplateCategoriesPage as me, listApprovalTemplatesPage as he } from "@rytass/bpm-core-client/template";
15
+ // src/views/templates/TemplatesView.tsx
16
+ var x = [
17
17
  10,
18
18
  20,
19
19
  50
@@ -32,21 +32,21 @@ var he = [
32
32
  }
33
33
  ], C = 100;
34
34
  function w() {
35
- let r = e(), i = n(), [u, w] = l([]), [F, I] = l(A), [L, R] = l([]), [z, B] = l(/* @__PURE__ */ new Set()), [V, H] = l(null), [ge, U] = l(!0), [W, G] = l(1), [K, _e] = l(10), [q, ve] = l(""), [J, ye] = l("ALL"), [be, xe] = l(0), [Y, X] = l(null), Z = c(0), Q = a(async () => {
35
+ let t = ee(), r = te(), [c, w] = s([]), [F, I] = s(A), [L, R] = s([]), [z, B] = s(/* @__PURE__ */ new Set()), [V, H] = s(null), [ge, U] = s(!0), [W, G] = s(1), [K, _e] = s(10), [q, ve] = s(""), [J, ye] = s("ALL"), [be, xe] = s(0), [Y, X] = s(null), Z = o(0), Q = i(async () => {
36
36
  let e = Z.current + 1;
37
- Z.current = e, U(!0), H(null), B(/* @__PURE__ */ new Set()), b().then((t) => {
37
+ Z.current = e, U(!0), H(null), B(/* @__PURE__ */ new Set()), le().then((t) => {
38
38
  e === Z.current && B(new Set(t.map((e) => e.id)));
39
39
  }).catch(() => {
40
40
  e === Z.current && B(/* @__PURE__ */ new Set());
41
41
  });
42
42
  try {
43
- let [t, n] = await Promise.all([me({
43
+ let [t, n] = await Promise.all([he({
44
44
  categoryId: F.categoryId,
45
45
  page: W,
46
46
  pageSize: K,
47
47
  searchText: q,
48
48
  status: J === "ALL" ? null : J
49
- }), pe({
49
+ }), me({
50
50
  page: 1,
51
51
  pageSize: C,
52
52
  searchText: "",
@@ -66,25 +66,25 @@ function w() {
66
66
  q,
67
67
  J
68
68
  ]);
69
- o(() => {
69
+ ne(() => {
70
70
  Q();
71
71
  }, [Q]);
72
- let $ = a(async (e) => {
72
+ let $ = i(async (e) => {
73
73
  X(e.id), H(null);
74
74
  try {
75
- await (e.isActive ? fe(e.id) : de(e.id)), await Q();
75
+ await (e.isActive ? pe(e.id) : fe(e.id)), await Q();
76
76
  } catch (e) {
77
77
  H(T(e));
78
78
  } finally {
79
79
  X(null);
80
80
  }
81
- }, [Q]), Se = s(() => u.map((e) => ({
81
+ }, [Q]), Se = a(() => c.map((e) => ({
82
82
  ...e,
83
83
  categoryLabel: P(e),
84
84
  key: e.id,
85
85
  status: e.currentVersionId ? "PUBLISHED" : "DRAFT",
86
- updatedAt: t(e.updatedAt)
87
- })), [u]), Ce = s(() => [
86
+ updatedAt: n(e.updatedAt)
87
+ })), [c]), Ce = a(() => [
88
88
  {
89
89
  dataIndex: "name",
90
90
  key: "name",
@@ -115,21 +115,21 @@ function w() {
115
115
  title: "更新時間",
116
116
  width: 220
117
117
  }
118
- ], []), we = s(() => ({
118
+ ], []), we = a(() => ({
119
119
  render: (e) => [
120
120
  {
121
121
  disabled: (e) => !z.has(e.id),
122
122
  name: "發起",
123
- onClick: () => r.push(i.caseNew(e.id)),
123
+ onClick: () => t.push(r.caseNew(e.id)),
124
124
  variant: "base-primary"
125
125
  },
126
126
  {
127
127
  name: "設計",
128
- onClick: () => r.push(i.templateDesigner(e.id))
128
+ onClick: () => t.push(r.templateDesigner(e.id))
129
129
  },
130
130
  {
131
131
  name: "版本",
132
- onClick: () => r.push(i.templateVersions(e.id))
132
+ onClick: () => t.push(r.templateVersions(e.id))
133
133
  },
134
134
  {
135
135
  disabled: (e) => Y === e.id,
@@ -145,30 +145,30 @@ function w() {
145
145
  }), [
146
146
  Y,
147
147
  z,
148
- r,
148
+ t,
149
149
  $
150
150
  ]);
151
- return /* @__PURE__ */ v(_, { children: /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ v(m, { children: /* @__PURE__ */ v(le, {
151
+ return /* @__PURE__ */ v(_, { children: /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ v(p, { children: /* @__PURE__ */ v(ue, {
152
152
  description: "建立流程模板、維護草稿與發布版本。",
153
153
  title: "簽核模板",
154
- children: /* @__PURE__ */ v(te, {
155
- icon: ue,
154
+ children: /* @__PURE__ */ v(re, {
155
+ icon: de,
156
156
  iconType: "leading",
157
- onClick: () => r.push(i.templateCompose()),
157
+ onClick: () => t.push(r.templateCompose()),
158
158
  variant: "base-primary",
159
159
  children: "建立模板"
160
160
  })
161
- }) }), /* @__PURE__ */ v(ie, { children: /* @__PURE__ */ y(h, {
162
- filterArea: /* @__PURE__ */ v(ne, {
163
- className: ee.templateFilterArea,
161
+ }) }), /* @__PURE__ */ v(h, { children: /* @__PURE__ */ y(m, {
162
+ filterArea: /* @__PURE__ */ v(ie, {
163
+ className: e.templateFilterArea,
164
164
  size: "sub",
165
- children: /* @__PURE__ */ y(re, { children: [/* @__PURE__ */ v(d, {
165
+ children: /* @__PURE__ */ y(u, { children: [/* @__PURE__ */ v(l, {
166
166
  span: 3,
167
- children: /* @__PURE__ */ v(f, {
167
+ children: /* @__PURE__ */ v(d, {
168
168
  fullWidth: !0,
169
- layout: x.VERTICAL,
169
+ layout: b.VERTICAL,
170
170
  name: "templateSearchText",
171
- children: /* @__PURE__ */ v(p, {
171
+ children: /* @__PURE__ */ v(f, {
172
172
  fullWidth: !0,
173
173
  onChange: (e) => {
174
174
  ve(e.target.value), G(1);
@@ -179,11 +179,11 @@ function w() {
179
179
  variant: "base"
180
180
  })
181
181
  })
182
- }), /* @__PURE__ */ v(d, {
182
+ }), /* @__PURE__ */ v(l, {
183
183
  span: 2,
184
- children: /* @__PURE__ */ v(f, {
184
+ children: /* @__PURE__ */ v(d, {
185
185
  fullWidth: !0,
186
- layout: x.VERTICAL,
186
+ layout: b.VERTICAL,
187
187
  name: "templateCategoryFilter",
188
188
  children: /* @__PURE__ */ v(ae, {
189
189
  clearable: !1,
@@ -227,7 +227,7 @@ function w() {
227
227
  },
228
228
  pageSize: K,
229
229
  pageSizeLabel: "每頁筆數",
230
- pageSizeOptions: he,
230
+ pageSizeOptions: x,
231
231
  renderResultSummary: (e, t, n) => `顯示 ${e}-${t} 筆,共 ${n} 筆`,
232
232
  showPageSizeOptions: !0,
233
233
  total: be
@@ -242,29 +242,29 @@ function E(e) {
242
242
  return e === "PUBLISHED" || e === "DRAFT" ? e : "ALL";
243
243
  }
244
244
  function D({ status: e }) {
245
- return e === "PUBLISHED" ? /* @__PURE__ */ v(u, {
245
+ return e === "PUBLISHED" ? /* @__PURE__ */ v(c, {
246
246
  size: "sub",
247
247
  text: "已發布",
248
248
  variant: "dot-success"
249
- }) : /* @__PURE__ */ v(u, {
249
+ }) : /* @__PURE__ */ v(c, {
250
250
  size: "sub",
251
251
  text: "草稿",
252
252
  variant: "dot-inactive"
253
253
  });
254
254
  }
255
255
  function O({ isActive: e }) {
256
- return e ? /* @__PURE__ */ v(u, {
256
+ return e ? /* @__PURE__ */ v(c, {
257
257
  size: "sub",
258
258
  text: "啟用中",
259
259
  variant: "dot-success"
260
- }) : /* @__PURE__ */ v(u, {
260
+ }) : /* @__PURE__ */ v(c, {
261
261
  size: "sub",
262
262
  text: "已停用",
263
263
  variant: "dot-inactive"
264
264
  });
265
265
  }
266
266
  function k({ record: e }) {
267
- return e.categoryDetail?.isActive === !1 ? /* @__PURE__ */ v(u, {
267
+ return e.categoryDetail?.isActive === !1 ? /* @__PURE__ */ v(c, {
268
268
  size: "sub",
269
269
  text: `${e.categoryLabel}(停用)`,
270
270
  variant: "dot-inactive"
@@ -300,7 +300,6 @@ function P(e) {
300
300
  function F(e) {
301
301
  return typeof e == "object" && !!e;
302
302
  }
303
- //#endregion
304
- export { r as TemplateCategoriesView, i as TemplateVersionsView, w as TemplatesView };
303
+ export { t as TemplateCategoriesView, r as TemplateVersionsView, w as TemplatesView };
305
304
 
306
305
  //# sourceMappingURL=index.js.map