@rytass/bpm-core-react 0.15.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/README.md +54 -6
  3. package/dist/chunks/{FormBuilderView-CLg-JYmu.js → FormBuilderView-BYL42M0d.js} +13 -33
  4. package/dist/chunks/FormBuilderView-BYL42M0d.js.map +1 -0
  5. package/dist/chunks/FormBuilderView-aBcA-_tt.cjs +3 -0
  6. package/dist/chunks/FormBuilderView-aBcA-_tt.cjs.map +1 -0
  7. package/dist/chunks/FormRendererView-DRFi_IH7.cjs +4 -0
  8. package/dist/chunks/FormRendererView-DRFi_IH7.cjs.map +1 -0
  9. package/dist/chunks/{FormRendererView-DU9LLrOF.js → FormRendererView-cZGOOjU5.js} +319 -332
  10. package/dist/chunks/FormRendererView-cZGOOjU5.js.map +1 -0
  11. package/dist/chunks/{admin-pickers-DLlG_1du.js → admin-pickers-DxhzECkD.js} +52 -51
  12. package/dist/chunks/admin-pickers-DxhzECkD.js.map +1 -0
  13. package/dist/chunks/admin-pickers-qe3j--gX.cjs +2 -0
  14. package/dist/chunks/admin-pickers-qe3j--gX.cjs.map +1 -0
  15. package/dist/chunks/approval-instance-list-page-CPXMP3PL.js.map +1 -1
  16. package/dist/chunks/approval-instance-list-page-ax0pm8bt.cjs.map +1 -1
  17. package/dist/chunks/auth-provider-4BeCw7cI.cjs.map +1 -1
  18. package/dist/chunks/auth-provider-B5oPmvk2.js.map +1 -1
  19. package/dist/chunks/bpm-form-field-Bc6k4ZEO.cjs.map +1 -1
  20. package/dist/chunks/bpm-form-field-Cao0rMol.js.map +1 -1
  21. package/dist/chunks/{categories-DGlxuC6X.js → categories-1gKxeEqw.js} +4 -10
  22. package/dist/chunks/categories-1gKxeEqw.js.map +1 -0
  23. package/dist/chunks/{categories-Yid05WAX.cjs → categories-DjENouRm.cjs} +2 -2
  24. package/dist/chunks/categories-DjENouRm.cjs.map +1 -0
  25. package/dist/chunks/{compose-BtQPBd1Q.js → compose-Crklayzy.js} +4 -4
  26. package/dist/chunks/compose-Crklayzy.js.map +1 -0
  27. package/dist/chunks/{compose-DZhTQOt4.cjs → compose-DZ7RKvUp.cjs} +2 -2
  28. package/dist/chunks/compose-DZ7RKvUp.cjs.map +1 -0
  29. package/dist/chunks/dashboard-page-BWQBSGDq.cjs +2 -0
  30. package/dist/chunks/dashboard-page-BWQBSGDq.cjs.map +1 -0
  31. package/dist/chunks/{dashboard-page-CeCLV1tp.js → dashboard-page-DdBvV6YI.js} +15 -16
  32. package/dist/chunks/dashboard-page-DdBvV6YI.js.map +1 -0
  33. package/dist/chunks/delegations-Ckf03icM.cjs +2 -0
  34. package/dist/chunks/delegations-Ckf03icM.cjs.map +1 -0
  35. package/dist/chunks/{delegations-DRupxJ4_.js → delegations-MxF3uJGW.js} +205 -215
  36. package/dist/chunks/delegations-MxF3uJGW.js.map +1 -0
  37. package/dist/chunks/delegations-V9HIe3_P.cjs +2 -0
  38. package/dist/chunks/delegations-V9HIe3_P.cjs.map +1 -0
  39. package/dist/chunks/{delegations-B8gLSt0i.js → delegations-xUt1tj8d.js} +168 -173
  40. package/dist/chunks/delegations-xUt1tj8d.js.map +1 -0
  41. package/dist/chunks/{designer-CrbBRPUU.js → designer-D9eFma1W.js} +1180 -1134
  42. package/dist/chunks/designer-D9eFma1W.js.map +1 -0
  43. package/dist/chunks/designer-sJGTGYOf.cjs +65 -0
  44. package/dist/chunks/designer-sJGTGYOf.cjs.map +1 -0
  45. package/dist/chunks/detail-DRCTnuKm.cjs +2 -0
  46. package/dist/chunks/detail-DRCTnuKm.cjs.map +1 -0
  47. package/dist/chunks/{detail-_c21WQla.js → detail-DScLf42P.js} +849 -836
  48. package/dist/chunks/detail-DScLf42P.js.map +1 -0
  49. package/dist/chunks/format-date-time-CB-LxzqT.js.map +1 -1
  50. package/dist/chunks/format-date-time-D-cx5M8z.cjs.map +1 -1
  51. package/dist/chunks/format-member-label-DudVI55w.js +13 -0
  52. package/dist/chunks/format-member-label-DudVI55w.js.map +1 -0
  53. package/dist/chunks/format-member-label-t7ANTF62.cjs +2 -0
  54. package/dist/chunks/format-member-label-t7ANTF62.cjs.map +1 -0
  55. package/dist/chunks/login-AtVxZBsC.cjs.map +1 -1
  56. package/dist/chunks/login-C6qlTC6F.js.map +1 -1
  57. package/dist/chunks/notifications-Bc4mgSds.cjs.map +1 -1
  58. package/dist/chunks/notifications-DJ5wzCye.js.map +1 -1
  59. package/dist/chunks/{orgs-BpqVu5ka.js → orgs-CY0i1fie.js} +787 -766
  60. package/dist/chunks/orgs-CY0i1fie.js.map +1 -0
  61. package/dist/chunks/orgs-Dr0FFoZo.cjs +2 -0
  62. package/dist/chunks/orgs-Dr0FFoZo.cjs.map +1 -0
  63. package/dist/chunks/providers-DHtDZFNA.cjs.map +1 -1
  64. package/dist/chunks/providers-J5eyByQj.js.map +1 -1
  65. package/dist/chunks/router-adapter--gYs13E8.cjs.map +1 -1
  66. package/dist/chunks/router-adapter-DftlFTOd.js.map +1 -1
  67. package/dist/chunks/routes-config-C1j_vFKo.cjs.map +1 -1
  68. package/dist/chunks/routes-config-yZbESPlw.js.map +1 -1
  69. package/dist/chunks/task-node-label-BF6UllxP.cjs.map +1 -1
  70. package/dist/chunks/task-node-label-CWZgOBj0.js.map +1 -1
  71. package/dist/chunks/use-bpm-member-D57LKe_u.js.map +1 -1
  72. package/dist/chunks/use-bpm-member-DpNAQtNC.cjs.map +1 -1
  73. package/dist/chunks/users-BCyePbwB.js +422 -0
  74. package/dist/chunks/users-BCyePbwB.js.map +1 -0
  75. package/dist/chunks/users-DVBJluFR.cjs +2 -0
  76. package/dist/chunks/users-DVBJluFR.cjs.map +1 -0
  77. package/dist/index.cjs +1 -1
  78. package/dist/index.cjs.map +1 -1
  79. package/dist/index.js +2 -2
  80. package/dist/index.js.map +1 -1
  81. package/dist/lib/format-member-label.d.ts +12 -0
  82. package/dist/next/index.cjs.map +1 -1
  83. package/dist/next/index.js.map +1 -1
  84. package/dist/next/workflow-chat-route.cjs.map +1 -1
  85. package/dist/next/workflow-chat-route.js.map +1 -1
  86. package/dist/pages/admin/delegations/index.cjs +1 -1
  87. package/dist/pages/admin/delegations/index.cjs.map +1 -1
  88. package/dist/pages/admin/delegations/index.js +1 -1
  89. package/dist/pages/admin/delegations/index.js.map +1 -1
  90. package/dist/pages/admin/orgs/index.cjs +1 -1
  91. package/dist/pages/admin/orgs/index.cjs.map +1 -1
  92. package/dist/pages/admin/orgs/index.js +1 -1
  93. package/dist/pages/admin/orgs/index.js.map +1 -1
  94. package/dist/pages/admin/users/index.cjs +1 -1
  95. package/dist/pages/admin/users/index.cjs.map +1 -1
  96. package/dist/pages/admin/users/index.js +1 -1
  97. package/dist/pages/admin/users/index.js.map +1 -1
  98. package/dist/pages/admin/webhook-endpoints/index.cjs.map +1 -1
  99. package/dist/pages/admin/webhook-endpoints/index.js.map +1 -1
  100. package/dist/pages/cc/index.cjs.map +1 -1
  101. package/dist/pages/cc/index.js.map +1 -1
  102. package/dist/pages/dashboard/index.cjs.map +1 -1
  103. package/dist/pages/dashboard/index.js.map +1 -1
  104. package/dist/pages/delegations/index.cjs +1 -1
  105. package/dist/pages/delegations/index.cjs.map +1 -1
  106. package/dist/pages/delegations/index.js +1 -1
  107. package/dist/pages/delegations/index.js.map +1 -1
  108. package/dist/pages/inbox/index.cjs.map +1 -1
  109. package/dist/pages/inbox/index.js.map +1 -1
  110. package/dist/pages/instances/detail/index.cjs +1 -1
  111. package/dist/pages/instances/detail/index.cjs.map +1 -1
  112. package/dist/pages/instances/detail/index.js +1 -1
  113. package/dist/pages/instances/detail/index.js.map +1 -1
  114. package/dist/pages/instances/new/index.cjs.map +1 -1
  115. package/dist/pages/instances/new/index.js.map +1 -1
  116. package/dist/pages/login/index.cjs.map +1 -1
  117. package/dist/pages/login/index.js.map +1 -1
  118. package/dist/pages/root/index.cjs.map +1 -1
  119. package/dist/pages/root/index.js.map +1 -1
  120. package/dist/pages/search/index.cjs.map +1 -1
  121. package/dist/pages/search/index.js.map +1 -1
  122. package/dist/pages/sent/index.cjs.map +1 -1
  123. package/dist/pages/sent/index.js.map +1 -1
  124. package/dist/pages/settings/notifications/index.cjs.map +1 -1
  125. package/dist/pages/settings/notifications/index.js.map +1 -1
  126. package/dist/pages/templates/categories/index.cjs +1 -1
  127. package/dist/pages/templates/categories/index.cjs.map +1 -1
  128. package/dist/pages/templates/categories/index.js +1 -1
  129. package/dist/pages/templates/categories/index.js.map +1 -1
  130. package/dist/pages/templates/compose/index.cjs +1 -1
  131. package/dist/pages/templates/compose/index.cjs.map +1 -1
  132. package/dist/pages/templates/compose/index.js +1 -1
  133. package/dist/pages/templates/compose/index.js.map +1 -1
  134. package/dist/pages/templates/designer/index.cjs +1 -1
  135. package/dist/pages/templates/designer/index.cjs.map +1 -1
  136. package/dist/pages/templates/designer/index.js +1 -1
  137. package/dist/pages/templates/designer/index.js.map +1 -1
  138. package/dist/pages/templates/index.cjs.map +1 -1
  139. package/dist/pages/templates/index.js.map +1 -1
  140. package/dist/pages/templates/versions/index.cjs.map +1 -1
  141. package/dist/pages/templates/versions/index.js.map +1 -1
  142. package/dist/views/admin/delegations/index.cjs +1 -1
  143. package/dist/views/admin/delegations/index.js +1 -2
  144. package/dist/views/admin/index.cjs +1 -1
  145. package/dist/views/admin/index.js +3 -3
  146. package/dist/views/admin/orgs/index.cjs +1 -1
  147. package/dist/views/admin/orgs/index.js +1 -2
  148. package/dist/views/admin/users/MemberTaskReassignModal.d.ts +13 -0
  149. package/dist/views/admin/users/index.cjs +1 -1
  150. package/dist/views/admin/users/index.js +1 -2
  151. package/dist/views/admin/webhook-endpoints/index.cjs.map +1 -1
  152. package/dist/views/admin/webhook-endpoints/index.js.map +1 -1
  153. package/dist/views/cc/index.cjs.map +1 -1
  154. package/dist/views/cc/index.js.map +1 -1
  155. package/dist/views/dashboard/index.cjs +1 -1
  156. package/dist/views/dashboard/index.cjs.map +1 -1
  157. package/dist/views/dashboard/index.js +1 -1
  158. package/dist/views/dashboard/index.js.map +1 -1
  159. package/dist/views/delegations/index.cjs +1 -1
  160. package/dist/views/delegations/index.js +1 -2
  161. package/dist/views/forms/builder/index.cjs +1 -1
  162. package/dist/views/forms/builder/index.js +1 -2
  163. package/dist/views/forms/renderer/index.cjs +1 -1
  164. package/dist/views/forms/renderer/index.js +1 -2
  165. package/dist/views/inbox/index.cjs +1 -1
  166. package/dist/views/inbox/index.cjs.map +1 -1
  167. package/dist/views/inbox/index.js +1 -5
  168. package/dist/views/inbox/index.js.map +1 -1
  169. package/dist/views/instances/detail/index.cjs +1 -1
  170. package/dist/views/instances/detail/index.js +1 -2
  171. package/dist/views/instances/index.js +1 -2
  172. package/dist/views/instances/new/index.cjs +1 -1
  173. package/dist/views/instances/new/index.cjs.map +1 -1
  174. package/dist/views/instances/new/index.js +4 -11
  175. package/dist/views/instances/new/index.js.map +1 -1
  176. package/dist/views/login/index.js +1 -2
  177. package/dist/views/search/index.cjs.map +1 -1
  178. package/dist/views/search/index.js.map +1 -1
  179. package/dist/views/sent/index.cjs.map +1 -1
  180. package/dist/views/sent/index.js.map +1 -1
  181. package/dist/views/settings/index.js +1 -2
  182. package/dist/views/settings/notifications/index.js +1 -2
  183. package/dist/views/templates/categories/index.cjs +1 -1
  184. package/dist/views/templates/categories/index.js +1 -2
  185. package/dist/views/templates/compose/index.cjs +1 -1
  186. package/dist/views/templates/compose/index.js +1 -2
  187. package/dist/views/templates/designer/index.cjs +1 -1
  188. package/dist/views/templates/designer/index.js +1 -2
  189. package/dist/views/templates/index.cjs +1 -1
  190. package/dist/views/templates/index.cjs.map +1 -1
  191. package/dist/views/templates/index.js +1 -1
  192. package/dist/views/templates/index.js.map +1 -1
  193. package/dist/views/templates/versions/index.cjs.map +1 -1
  194. package/dist/views/templates/versions/index.js.map +1 -1
  195. package/package.json +5 -5
  196. package/dist/chunks/FormBuilderView-6bCbIkz6.cjs +0 -3
  197. package/dist/chunks/FormBuilderView-6bCbIkz6.cjs.map +0 -1
  198. package/dist/chunks/FormBuilderView-CLg-JYmu.js.map +0 -1
  199. package/dist/chunks/FormRendererView-DU9LLrOF.js.map +0 -1
  200. package/dist/chunks/FormRendererView-gctFIqwC.cjs +0 -4
  201. package/dist/chunks/FormRendererView-gctFIqwC.cjs.map +0 -1
  202. package/dist/chunks/admin-pickers-Btvij1at.cjs +0 -2
  203. package/dist/chunks/admin-pickers-Btvij1at.cjs.map +0 -1
  204. package/dist/chunks/admin-pickers-DLlG_1du.js.map +0 -1
  205. package/dist/chunks/categories-DGlxuC6X.js.map +0 -1
  206. package/dist/chunks/categories-Yid05WAX.cjs.map +0 -1
  207. package/dist/chunks/compose-BtQPBd1Q.js.map +0 -1
  208. package/dist/chunks/compose-DZhTQOt4.cjs.map +0 -1
  209. package/dist/chunks/dashboard-page-CeCLV1tp.js.map +0 -1
  210. package/dist/chunks/dashboard-page-DooFJsxM.cjs +0 -2
  211. package/dist/chunks/dashboard-page-DooFJsxM.cjs.map +0 -1
  212. package/dist/chunks/delegations-8LsxcQM4.cjs +0 -2
  213. package/dist/chunks/delegations-8LsxcQM4.cjs.map +0 -1
  214. package/dist/chunks/delegations-B8gLSt0i.js.map +0 -1
  215. package/dist/chunks/delegations-DRupxJ4_.js.map +0 -1
  216. package/dist/chunks/delegations-DlYwMiAW.cjs +0 -2
  217. package/dist/chunks/delegations-DlYwMiAW.cjs.map +0 -1
  218. package/dist/chunks/designer-CrbBRPUU.js.map +0 -1
  219. package/dist/chunks/designer-D3_lWmfa.cjs +0 -65
  220. package/dist/chunks/designer-D3_lWmfa.cjs.map +0 -1
  221. package/dist/chunks/detail-CVXb5Vy8.cjs +0 -2
  222. package/dist/chunks/detail-CVXb5Vy8.cjs.map +0 -1
  223. package/dist/chunks/detail-_c21WQla.js.map +0 -1
  224. package/dist/chunks/orgs-BpqVu5ka.js.map +0 -1
  225. package/dist/chunks/orgs-D0-5BaHT.cjs +0 -2
  226. package/dist/chunks/orgs-D0-5BaHT.cjs.map +0 -1
  227. package/dist/chunks/users-C9LA-Rd7.cjs +0 -2
  228. package/dist/chunks/users-C9LA-Rd7.cjs.map +0 -1
  229. package/dist/chunks/users-FWrb3ehW.js +0 -214
  230. package/dist/chunks/users-FWrb3ehW.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/pages/instances/new/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { InstanceNewView } from '../../../views/instances/new';\n\n/**\n * Next.js metadata for the BPM \"launch approval\" page. Consumers re-export\n * this alongside the default page component.\n */\nexport const metadata: Metadata = {\n title: '發起簽核 | BPM Admin',\n};\n\n/**\n * Drop-in Next.js App Router page for the BPM launch screen. Usage in\n * `app/instances/new/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/instances/new';\n * ```\n */\nexport default async function InstanceNewPage({\n searchParams,\n}: {\n readonly searchParams: Promise<{ readonly templateId?: string }>;\n}): Promise<ReactElement> {\n const { templateId } = await searchParams;\n return <InstanceNewView templateId={templateId ?? null} />;\n}\n"],"mappings":";;;AAQA,IAAa,IAAqB,EAChC,OAAO,mBACT;AAUA,eAA8B,EAAgB,EAC5C,mBAGwB;CACxB,IAAM,EAAE,kBAAe,MAAM;CAC7B,OAAO,kBAAC,GAAD,EAAiB,YAAY,KAAc,KAAO,CAAA;AAC3D"}
1
+ {"version":3,"file":"index.js","names":["metadata","InstanceNewPage","searchParams","InstanceNewView","templateId"],"sources":["../../../../src/pages/instances/new/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { InstanceNewView } from '../../../views/instances/new';\n\n/**\n * Next.js metadata for the BPM \"launch approval\" page. Consumers re-export\n * this alongside the default page component.\n */\nexport const metadata: Metadata = {\n title: '發起簽核 | BPM Admin',\n};\n\n/**\n * Drop-in Next.js App Router page for the BPM launch screen. Usage in\n * `app/instances/new/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/instances/new';\n * ```\n */\nexport default async function InstanceNewPage({\n searchParams,\n}: {\n readonly searchParams: Promise<{ readonly templateId?: string }>;\n}): Promise<ReactElement> {\n const { templateId } = await searchParams;\n return <InstanceNewView templateId={templateId ?? null} />;\n}\n"],"mappings":";;;AAQA,IAAaA,IAAqB,EAChC,OAAO,mBACT;AAUA,eAA8BC,EAAgB,EAC5C,mBAGwB;CACxB,IAAM,EAAE,kBAAe,MAAMC;CAC7B,OAAO,kBAACC,GAAD,EAAiB,YAAYC,KAAc,KAAO,CAAA;AAC3D"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/pages/login/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { LoginView } from '../../views/login';\n\n/**\n * Next.js metadata for the BPM login page. Consumers re-export this\n * alongside the default page component.\n */\nexport const metadata: Metadata = {\n title: 'Login | BPM Admin',\n description: 'Sign in to the BPM approval workflow administration console.',\n};\n\n/**\n * Drop-in Next.js App Router page for the BPM login screen.\n *\n * Consumer usage in `app/login/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/login';\n * ```\n */\nexport default async function LoginPage({\n searchParams,\n}: {\n readonly searchParams: Promise<{ readonly next?: string }>;\n}): Promise<ReactElement> {\n const { next } = await searchParams;\n return <LoginView defaultNextPath={next} />;\n}\n"],"mappings":"qLAQA,IAAa,EAAqB,CAChC,MAAO,oBACP,YAAa,8DACf,EAWA,eAA8B,EAAU,CACtC,gBAGwB,CACxB,GAAM,CAAE,QAAS,MAAM,EACvB,OAAO,EAAA,EAAA,IAAA,CAAC,EAAA,EAAD,CAAW,gBAAiB,CAAO,CAAA,CAC5C"}
1
+ {"version":3,"file":"index.cjs","names":["LoginView","require_login","react_jsx_runtime","metadata","LoginPage","searchParams","next"],"sources":["../../../src/pages/login/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { LoginView } from '../../views/login';\n\n/**\n * Next.js metadata for the BPM login page. Consumers re-export this\n * alongside the default page component.\n */\nexport const metadata: Metadata = {\n title: 'Login | BPM Admin',\n description: 'Sign in to the BPM approval workflow administration console.',\n};\n\n/**\n * Drop-in Next.js App Router page for the BPM login screen.\n *\n * Consumer usage in `app/login/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/login';\n * ```\n */\nexport default async function LoginPage({\n searchParams,\n}: {\n readonly searchParams: Promise<{ readonly next?: string }>;\n}): Promise<ReactElement> {\n const { next } = await searchParams;\n return <LoginView defaultNextPath={next} />;\n}\n"],"mappings":"qLAQA,IAAaG,EAAqB,CAChC,MAAO,oBACP,YAAa,8DACf,EAWA,eAA8BC,EAAU,CACtC,gBAGwB,CACxB,GAAM,CAAE,QAAS,MAAMC,EACvB,OAAO,EAAAH,EAAA,IAAA,CAACF,EAAAA,EAAD,CAAW,gBAAiBM,CAAO,CAAA,CAC5C"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/pages/login/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { LoginView } from '../../views/login';\n\n/**\n * Next.js metadata for the BPM login page. Consumers re-export this\n * alongside the default page component.\n */\nexport const metadata: Metadata = {\n title: 'Login | BPM Admin',\n description: 'Sign in to the BPM approval workflow administration console.',\n};\n\n/**\n * Drop-in Next.js App Router page for the BPM login screen.\n *\n * Consumer usage in `app/login/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/login';\n * ```\n */\nexport default async function LoginPage({\n searchParams,\n}: {\n readonly searchParams: Promise<{ readonly next?: string }>;\n}): Promise<ReactElement> {\n const { next } = await searchParams;\n return <LoginView defaultNextPath={next} />;\n}\n"],"mappings":";;;AAQA,IAAa,IAAqB;CAChC,OAAO;CACP,aAAa;AACf;AAWA,eAA8B,EAAU,EACtC,mBAGwB;CACxB,IAAM,EAAE,YAAS,MAAM;CACvB,OAAO,kBAAC,GAAD,EAAW,iBAAiB,EAAO,CAAA;AAC5C"}
1
+ {"version":3,"file":"index.js","names":["LoginView","metadata","LoginPage","searchParams","next"],"sources":["../../../src/pages/login/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { LoginView } from '../../views/login';\n\n/**\n * Next.js metadata for the BPM login page. Consumers re-export this\n * alongside the default page component.\n */\nexport const metadata: Metadata = {\n title: 'Login | BPM Admin',\n description: 'Sign in to the BPM approval workflow administration console.',\n};\n\n/**\n * Drop-in Next.js App Router page for the BPM login screen.\n *\n * Consumer usage in `app/login/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/login';\n * ```\n */\nexport default async function LoginPage({\n searchParams,\n}: {\n readonly searchParams: Promise<{ readonly next?: string }>;\n}): Promise<ReactElement> {\n const { next } = await searchParams;\n return <LoginView defaultNextPath={next} />;\n}\n"],"mappings":";;;AAQA,IAAaC,IAAqB;CAChC,OAAO;CACP,aAAa;AACf;AAWA,eAA8BC,EAAU,EACtC,mBAGwB;CACxB,IAAM,EAAE,YAAS,MAAMC;CACvB,OAAO,kBAACH,GAAD,EAAW,iBAAiBI,EAAO,CAAA;AAC5C"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/pages/root/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { redirect } from 'next/navigation';\n\n/**\n * Next.js metadata for the BPM root path.\n */\nexport const metadata: Metadata = {\n title: 'BPM Admin',\n};\n\n/**\n * Drop-in Next.js App Router page for the BPM root path. Server-side\n * redirects to `/dashboard` — never renders any client tree, so it cannot\n * pollute the chunk boundary with `'use client'`.\n *\n * Consumer usage in `app/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/root';\n * ```\n */\nexport default function RootPage(): ReactElement {\n redirect('/dashboard');\n}\n"],"mappings":"gIAOA,IAAa,EAAqB,CAChC,MAAO,WACT,EAaA,SAAwB,GAAyB,EAC/C,EAAA,EAAA,SAAA,CAAS,YAAY,CACvB"}
1
+ {"version":3,"file":"index.cjs","names":["next_navigation","metadata","RootPage"],"sources":["../../../src/pages/root/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { redirect } from 'next/navigation';\n\n/**\n * Next.js metadata for the BPM root path.\n */\nexport const metadata: Metadata = {\n title: 'BPM Admin',\n};\n\n/**\n * Drop-in Next.js App Router page for the BPM root path. Server-side\n * redirects to `/dashboard` — never renders any client tree, so it cannot\n * pollute the chunk boundary with `'use client'`.\n *\n * Consumer usage in `app/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/root';\n * ```\n */\nexport default function RootPage(): ReactElement {\n redirect('/dashboard');\n}\n"],"mappings":"gIAOA,IAAaC,EAAqB,CAChC,MAAO,WACT,EAaA,SAAwBC,GAAyB,EAC/C,EAAAF,EAAA,SAAA,CAAS,YAAY,CACvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/pages/root/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { redirect } from 'next/navigation';\n\n/**\n * Next.js metadata for the BPM root path.\n */\nexport const metadata: Metadata = {\n title: 'BPM Admin',\n};\n\n/**\n * Drop-in Next.js App Router page for the BPM root path. Server-side\n * redirects to `/dashboard` — never renders any client tree, so it cannot\n * pollute the chunk boundary with `'use client'`.\n *\n * Consumer usage in `app/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/root';\n * ```\n */\nexport default function RootPage(): ReactElement {\n redirect('/dashboard');\n}\n"],"mappings":";;AAOA,IAAa,IAAqB,EAChC,OAAO,YACT;AAaA,SAAwB,IAAyB;CAC/C,EAAS,YAAY;AACvB"}
1
+ {"version":3,"file":"index.js","names":["metadata","RootPage"],"sources":["../../../src/pages/root/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { redirect } from 'next/navigation';\n\n/**\n * Next.js metadata for the BPM root path.\n */\nexport const metadata: Metadata = {\n title: 'BPM Admin',\n};\n\n/**\n * Drop-in Next.js App Router page for the BPM root path. Server-side\n * redirects to `/dashboard` — never renders any client tree, so it cannot\n * pollute the chunk boundary with `'use client'`.\n *\n * Consumer usage in `app/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/root';\n * ```\n */\nexport default function RootPage(): ReactElement {\n redirect('/dashboard');\n}\n"],"mappings":";;AAOA,IAAaA,IAAqB,EAChC,OAAO,YACT;AAaA,SAAwBC,IAAyB;CAC/C,EAAS,YAAY;AACvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/pages/search/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { SearchView } from '../../views/search';\n\n/**\n * Next.js metadata for the BPM case search page. Consumers re-export this\n * alongside the default page component.\n */\nexport const metadata: Metadata = {\n title: '案件查詢 | BPM Admin',\n};\n\n/**\n * Drop-in Next.js App Router page for the BPM case search. Usage in\n * `app/search/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/search';\n * ```\n */\nexport default function SearchPage(): ReactElement {\n return <SearchView />;\n}\n"],"mappings":"kLAQA,IAAa,EAAqB,CAChC,MAAO,kBACT,EAUA,SAAwB,GAA2B,CACjD,OAAO,EAAA,EAAA,IAAA,CAAC,EAAA,WAAD,CAAa,CAAA,CACtB"}
1
+ {"version":3,"file":"index.cjs","names":["SearchView","require_views_search_index","react_jsx_runtime","metadata","SearchPage"],"sources":["../../../src/pages/search/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { SearchView } from '../../views/search';\n\n/**\n * Next.js metadata for the BPM case search page. Consumers re-export this\n * alongside the default page component.\n */\nexport const metadata: Metadata = {\n title: '案件查詢 | BPM Admin',\n};\n\n/**\n * Drop-in Next.js App Router page for the BPM case search. Usage in\n * `app/search/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/search';\n * ```\n */\nexport default function SearchPage(): ReactElement {\n return <SearchView />;\n}\n"],"mappings":"kLAQA,IAAaG,EAAqB,CAChC,MAAO,kBACT,EAUA,SAAwBC,GAA2B,CACjD,OAAO,EAAAF,EAAA,IAAA,CAACF,EAAAA,WAAD,CAAa,CAAA,CACtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/pages/search/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { SearchView } from '../../views/search';\n\n/**\n * Next.js metadata for the BPM case search page. Consumers re-export this\n * alongside the default page component.\n */\nexport const metadata: Metadata = {\n title: '案件查詢 | BPM Admin',\n};\n\n/**\n * Drop-in Next.js App Router page for the BPM case search. Usage in\n * `app/search/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/search';\n * ```\n */\nexport default function SearchPage(): ReactElement {\n return <SearchView />;\n}\n"],"mappings":";;;AAQA,IAAa,IAAqB,EAChC,OAAO,mBACT;AAUA,SAAwB,IAA2B;CACjD,OAAO,kBAAC,GAAD,CAAa,CAAA;AACtB"}
1
+ {"version":3,"file":"index.js","names":["metadata","SearchPage","SearchView"],"sources":["../../../src/pages/search/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { SearchView } from '../../views/search';\n\n/**\n * Next.js metadata for the BPM case search page. Consumers re-export this\n * alongside the default page component.\n */\nexport const metadata: Metadata = {\n title: '案件查詢 | BPM Admin',\n};\n\n/**\n * Drop-in Next.js App Router page for the BPM case search. Usage in\n * `app/search/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/search';\n * ```\n */\nexport default function SearchPage(): ReactElement {\n return <SearchView />;\n}\n"],"mappings":";;;AAQA,IAAaA,IAAqB,EAChC,OAAO,mBACT;AAUA,SAAwBC,IAA2B;CACjD,OAAO,kBAACC,GAAD,CAAa,CAAA;AACtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/pages/sent/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { SentView } from '../../views/sent';\n\n/**\n * Next.js metadata for the BPM \"sent\" page. Consumers re-export this\n * alongside the default page component.\n */\nexport const metadata: Metadata = {\n title: '我發起的 | BPM Admin',\n};\n\n/**\n * Drop-in Next.js App Router page for the BPM sent inbox. Usage in\n * `app/sent/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/sent';\n * ```\n */\nexport default function SentPage(): ReactElement {\n return <SentView />;\n}\n"],"mappings":"gLAQA,IAAa,EAAqB,CAChC,MAAO,kBACT,EAUA,SAAwB,GAAyB,CAC/C,OAAO,EAAA,EAAA,IAAA,CAAC,EAAA,SAAD,CAAW,CAAA,CACpB"}
1
+ {"version":3,"file":"index.cjs","names":["SentView","require_views_sent_index","react_jsx_runtime","metadata","SentPage"],"sources":["../../../src/pages/sent/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { SentView } from '../../views/sent';\n\n/**\n * Next.js metadata for the BPM \"sent\" page. Consumers re-export this\n * alongside the default page component.\n */\nexport const metadata: Metadata = {\n title: '我發起的 | BPM Admin',\n};\n\n/**\n * Drop-in Next.js App Router page for the BPM sent inbox. Usage in\n * `app/sent/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/sent';\n * ```\n */\nexport default function SentPage(): ReactElement {\n return <SentView />;\n}\n"],"mappings":"gLAQA,IAAaG,EAAqB,CAChC,MAAO,kBACT,EAUA,SAAwBC,GAAyB,CAC/C,OAAO,EAAAF,EAAA,IAAA,CAACF,EAAAA,SAAD,CAAW,CAAA,CACpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/pages/sent/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { SentView } from '../../views/sent';\n\n/**\n * Next.js metadata for the BPM \"sent\" page. Consumers re-export this\n * alongside the default page component.\n */\nexport const metadata: Metadata = {\n title: '我發起的 | BPM Admin',\n};\n\n/**\n * Drop-in Next.js App Router page for the BPM sent inbox. Usage in\n * `app/sent/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/sent';\n * ```\n */\nexport default function SentPage(): ReactElement {\n return <SentView />;\n}\n"],"mappings":";;;AAQA,IAAa,IAAqB,EAChC,OAAO,mBACT;AAUA,SAAwB,IAAyB;CAC/C,OAAO,kBAAC,GAAD,CAAW,CAAA;AACpB"}
1
+ {"version":3,"file":"index.js","names":["metadata","SentPage","SentView"],"sources":["../../../src/pages/sent/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { SentView } from '../../views/sent';\n\n/**\n * Next.js metadata for the BPM \"sent\" page. Consumers re-export this\n * alongside the default page component.\n */\nexport const metadata: Metadata = {\n title: '我發起的 | BPM Admin',\n};\n\n/**\n * Drop-in Next.js App Router page for the BPM sent inbox. Usage in\n * `app/sent/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/sent';\n * ```\n */\nexport default function SentPage(): ReactElement {\n return <SentView />;\n}\n"],"mappings":";;;AAQA,IAAaA,IAAqB,EAChC,OAAO,mBACT;AAUA,SAAwBC,IAAyB;CAC/C,OAAO,kBAACC,GAAD,CAAW,CAAA;AACpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/pages/settings/notifications/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { SettingsNotificationsView } from '../../../views/settings/notifications';\n\nexport const metadata: Metadata = {\n title: '通知設定 | BPM Admin',\n description: '調整站內通知、Email 通知與摘要頻率。',\n};\n\nexport default function SettingsNotificationsPage(): ReactElement {\n return <SettingsNotificationsView />;\n}\n"],"mappings":"gMAIA,IAAa,EAAqB,CAChC,MAAO,mBACP,YAAa,uBACf,EAEA,SAAwB,GAA0C,CAChE,OAAO,EAAA,EAAA,IAAA,CAAC,EAAA,EAAD,CAA4B,CAAA,CACrC"}
1
+ {"version":3,"file":"index.cjs","names":["SettingsNotificationsView","require_notifications","react_jsx_runtime","metadata","SettingsNotificationsPage"],"sources":["../../../../src/pages/settings/notifications/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { SettingsNotificationsView } from '../../../views/settings/notifications';\n\nexport const metadata: Metadata = {\n title: '通知設定 | BPM Admin',\n description: '調整站內通知、Email 通知與摘要頻率。',\n};\n\nexport default function SettingsNotificationsPage(): ReactElement {\n return <SettingsNotificationsView />;\n}\n"],"mappings":"gMAIA,IAAaG,EAAqB,CAChC,MAAO,mBACP,YAAa,uBACf,EAEA,SAAwBC,GAA0C,CAChE,OAAO,EAAAF,EAAA,IAAA,CAACF,EAAAA,EAAD,CAA4B,CAAA,CACrC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/pages/settings/notifications/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { SettingsNotificationsView } from '../../../views/settings/notifications';\n\nexport const metadata: Metadata = {\n title: '通知設定 | BPM Admin',\n description: '調整站內通知、Email 通知與摘要頻率。',\n};\n\nexport default function SettingsNotificationsPage(): ReactElement {\n return <SettingsNotificationsView />;\n}\n"],"mappings":";;;AAIA,IAAa,IAAqB;CAChC,OAAO;CACP,aAAa;AACf;AAEA,SAAwB,IAA0C;CAChE,OAAO,kBAAC,GAAD,CAA4B,CAAA;AACrC"}
1
+ {"version":3,"file":"index.js","names":["SettingsNotificationsView","metadata","SettingsNotificationsPage"],"sources":["../../../../src/pages/settings/notifications/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { SettingsNotificationsView } from '../../../views/settings/notifications';\n\nexport const metadata: Metadata = {\n title: '通知設定 | BPM Admin',\n description: '調整站內通知、Email 通知與摘要頻率。',\n};\n\nexport default function SettingsNotificationsPage(): ReactElement {\n return <SettingsNotificationsView />;\n}\n"],"mappings":";;;AAIA,IAAaC,IAAqB;CAChC,OAAO;CACP,aAAa;AACf;AAEA,SAAwBC,IAA0C;CAChE,OAAO,kBAACF,GAAD,CAA4B,CAAA;AACrC"}
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/categories-Yid05WAX.cjs");let t=require("react/jsx-runtime");var n={title:`範本分類管理 | BPM Admin`,description:`維護 BPM 流程範本的分類設定。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/categories-DjENouRm.cjs");let t=require("react/jsx-runtime");var n={title:`範本分類管理 | BPM Admin`,description:`維護 BPM 流程範本的分類設定。`};function r(){return(0,t.jsx)(e.t,{})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/pages/templates/categories/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { TemplateCategoriesView } from '../../../views/templates/categories';\n\nexport const metadata: Metadata = {\n title: '範本分類管理 | BPM Admin',\n description: '維護 BPM 流程範本的分類設定。',\n};\n\nexport default function TemplateCategoriesPage(): ReactElement {\n return <TemplateCategoriesView />;\n}\n"],"mappings":"6LAIA,IAAa,EAAqB,CAChC,MAAO,qBACP,YAAa,mBACf,EAEA,SAAwB,GAAuC,CAC7D,OAAO,EAAA,EAAA,IAAA,CAAC,EAAA,EAAD,CAAyB,CAAA,CAClC"}
1
+ {"version":3,"file":"index.cjs","names":["TemplateCategoriesView","require_categories","react_jsx_runtime","metadata","TemplateCategoriesPage"],"sources":["../../../../src/pages/templates/categories/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { TemplateCategoriesView } from '../../../views/templates/categories';\n\nexport const metadata: Metadata = {\n title: '範本分類管理 | BPM Admin',\n description: '維護 BPM 流程範本的分類設定。',\n};\n\nexport default function TemplateCategoriesPage(): ReactElement {\n return <TemplateCategoriesView />;\n}\n"],"mappings":"6LAIA,IAAaG,EAAqB,CAChC,MAAO,qBACP,YAAa,mBACf,EAEA,SAAwBC,GAAuC,CAC7D,OAAO,EAAAF,EAAA,IAAA,CAACF,EAAAA,EAAD,CAAyB,CAAA,CAClC"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../chunks/categories-DGlxuC6X.js";
1
+ import { t as e } from "../../../chunks/categories-1gKxeEqw.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/templates/categories/index.tsx
4
4
  var n = {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/pages/templates/categories/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { TemplateCategoriesView } from '../../../views/templates/categories';\n\nexport const metadata: Metadata = {\n title: '範本分類管理 | BPM Admin',\n description: '維護 BPM 流程範本的分類設定。',\n};\n\nexport default function TemplateCategoriesPage(): ReactElement {\n return <TemplateCategoriesView />;\n}\n"],"mappings":";;;AAIA,IAAa,IAAqB;CAChC,OAAO;CACP,aAAa;AACf;AAEA,SAAwB,IAAuC;CAC7D,OAAO,kBAAC,GAAD,CAAyB,CAAA;AAClC"}
1
+ {"version":3,"file":"index.js","names":["TemplateCategoriesView","metadata","TemplateCategoriesPage"],"sources":["../../../../src/pages/templates/categories/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { TemplateCategoriesView } from '../../../views/templates/categories';\n\nexport const metadata: Metadata = {\n title: '範本分類管理 | BPM Admin',\n description: '維護 BPM 流程範本的分類設定。',\n};\n\nexport default function TemplateCategoriesPage(): ReactElement {\n return <TemplateCategoriesView />;\n}\n"],"mappings":";;;AAIA,IAAaC,IAAqB;CAChC,OAAO;CACP,aAAa;AACf;AAEA,SAAwBC,IAAuC;CAC7D,OAAO,kBAACF,GAAD,CAAyB,CAAA;AAClC"}
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/compose-DZhTQOt4.cjs");let t=require("react/jsx-runtime"),n=require("next/server");var r={title:`建立模板(表單 + 流程) | BPM Admin`,description:`以精靈式流程一次完成 BPM 表單與簽核流程設計並發佈。`};async function i(){return await(0,n.connection)(),(0,t.jsx)(e.t,{aiAssistantAvailable:!!process.env.OPENAI_API_KEY,showAiAssistant:process.env.BPM_AI_ASSISTANT_ENABLED===`true`})}exports.default=i,exports.metadata=r;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/compose-DZ7RKvUp.cjs");let t=require("react/jsx-runtime"),n=require("next/server");var r={title:`建立模板(表單 + 流程) | BPM Admin`,description:`以精靈式流程一次完成 BPM 表單與簽核流程設計並發佈。`};async function i(){return await(0,n.connection)(),(0,t.jsx)(e.t,{aiAssistantAvailable:!!process.env.OPENAI_API_KEY,showAiAssistant:process.env.BPM_AI_ASSISTANT_ENABLED===`true`})}exports.default=i,exports.metadata=r;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/pages/templates/compose/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { connection } from 'next/server';\nimport { TemplateComposeWizardView } from '../../../views/templates/compose';\n\nexport const metadata: Metadata = {\n title: '建立模板(表單 + 流程) | BPM Admin',\n description: '以精靈式流程一次完成 BPM 表單與簽核流程設計並發佈。',\n};\n\n/**\n * Drop-in Next.js App Router page for the unified template wizard.\n *\n * Consumer usage in `app/templates/compose/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/templates/compose';\n * ```\n *\n * The Step 1 (流程設計) embedded designer offers the same opt-in AI assistant\n * as the standalone designer page. `BPM_AI_ASSISTANT_ENABLED` shows the button;\n * `OPENAI_API_KEY` decides whether it's usable (else a disabled placeholder).\n * Both are server-only env on the Next.js host.\n *\n * `await connection()` opts this route out of static prerendering so those env\n * vars are read at request time. They are NOT set during `next build` (only\n * injected into the runtime container), so without this the flags would bake to\n * `false` on a production build — unlike the `[id]` designer page, which is\n * already dynamic by virtue of its route params. Survives the host's one-line\n * re-export, so npm consumers don't need their own route-segment config.\n */\nexport default async function TemplateComposePage(): Promise<ReactElement> {\n await connection();\n\n return (\n <TemplateComposeWizardView\n aiAssistantAvailable={Boolean(process.env.OPENAI_API_KEY)}\n showAiAssistant={process.env.BPM_AI_ASSISTANT_ENABLED === 'true'}\n />\n );\n}\n"],"mappings":"mNAKA,IAAa,EAAqB,CAChC,MAAO,4BACP,YAAa,8BACf,EAuBA,eAA8B,GAA6C,CAGzE,OAFA,MAAA,EAAM,EAAA,WAAA,CAAW,GAGf,EAAA,EAAA,IAAA,CAAC,EAAA,EAAD,CACE,qBAAsB,EAAQ,QAAQ,IAAI,eAC1C,gBAAiB,QAAQ,IAAI,2BAA6B,MAC3D,CAAA,CAEL"}
1
+ {"version":3,"file":"index.cjs","names":["connection","TemplateComposeWizardView","require_compose","react_jsx_runtime","next_server","metadata","TemplateComposePage"],"sources":["../../../../src/pages/templates/compose/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { connection } from 'next/server';\nimport { TemplateComposeWizardView } from '../../../views/templates/compose';\n\nexport const metadata: Metadata = {\n title: '建立模板(表單 + 流程) | BPM Admin',\n description: '以精靈式流程一次完成 BPM 表單與簽核流程設計並發佈。',\n};\n\n/**\n * Drop-in Next.js App Router page for the unified template wizard.\n *\n * Consumer usage in `app/templates/compose/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/templates/compose';\n * ```\n *\n * The Step 1 (流程設計) embedded designer offers the same opt-in AI assistant\n * as the standalone designer page. `BPM_AI_ASSISTANT_ENABLED` shows the button;\n * `OPENAI_API_KEY` decides whether it's usable (else a disabled placeholder).\n * Both are server-only env on the Next.js host.\n *\n * `await connection()` opts this route out of static prerendering so those env\n * vars are read at request time. They are NOT set during `next build` (only\n * injected into the runtime container), so without this the flags would bake to\n * `false` on a production build — unlike the `[id]` designer page, which is\n * already dynamic by virtue of its route params. Survives the host's one-line\n * re-export, so npm consumers don't need their own route-segment config.\n */\nexport default async function TemplateComposePage(): Promise<ReactElement> {\n await connection();\n\n return (\n <TemplateComposeWizardView\n aiAssistantAvailable={Boolean(process.env.OPENAI_API_KEY)}\n showAiAssistant={process.env.BPM_AI_ASSISTANT_ENABLED === 'true'}\n />\n );\n}\n"],"mappings":"mNAKA,IAAaK,EAAqB,CAChC,MAAO,4BACP,YAAa,8BACf,EAuBA,eAA8BC,GAA6C,CAGzE,OAFA,MAAA,EAAMN,EAAAA,WAAAA,CAAW,GAGf,EAAAG,EAAA,IAAA,CAACF,EAAAA,EAAD,CACE,qBAAsB,EAAQ,QAAQ,IAAI,eAC1C,gBAAiB,QAAQ,IAAI,2BAA6B,MAC3D,CAAA,CAEL"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../chunks/compose-BtQPBd1Q.js";
1
+ import { t as e } from "../../../chunks/compose-Crklayzy.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  import { connection as n } from "next/server";
4
4
  //#region src/pages/templates/compose/index.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/pages/templates/compose/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { connection } from 'next/server';\nimport { TemplateComposeWizardView } from '../../../views/templates/compose';\n\nexport const metadata: Metadata = {\n title: '建立模板(表單 + 流程) | BPM Admin',\n description: '以精靈式流程一次完成 BPM 表單與簽核流程設計並發佈。',\n};\n\n/**\n * Drop-in Next.js App Router page for the unified template wizard.\n *\n * Consumer usage in `app/templates/compose/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/templates/compose';\n * ```\n *\n * The Step 1 (流程設計) embedded designer offers the same opt-in AI assistant\n * as the standalone designer page. `BPM_AI_ASSISTANT_ENABLED` shows the button;\n * `OPENAI_API_KEY` decides whether it's usable (else a disabled placeholder).\n * Both are server-only env on the Next.js host.\n *\n * `await connection()` opts this route out of static prerendering so those env\n * vars are read at request time. They are NOT set during `next build` (only\n * injected into the runtime container), so without this the flags would bake to\n * `false` on a production build — unlike the `[id]` designer page, which is\n * already dynamic by virtue of its route params. Survives the host's one-line\n * re-export, so npm consumers don't need their own route-segment config.\n */\nexport default async function TemplateComposePage(): Promise<ReactElement> {\n await connection();\n\n return (\n <TemplateComposeWizardView\n aiAssistantAvailable={Boolean(process.env.OPENAI_API_KEY)}\n showAiAssistant={process.env.BPM_AI_ASSISTANT_ENABLED === 'true'}\n />\n );\n}\n"],"mappings":";;;;AAKA,IAAa,IAAqB;CAChC,OAAO;CACP,aAAa;AACf;AAuBA,eAA8B,IAA6C;CAGzE,OAFA,MAAM,EAAW,GAGf,kBAAC,GAAD;EACE,sBAAsB,EAAQ,QAAQ,IAAI;EAC1C,iBAAiB,QAAQ,IAAI,6BAA6B;CAC3D,CAAA;AAEL"}
1
+ {"version":3,"file":"index.js","names":["TemplateComposeWizardView","metadata","TemplateComposePage","connection"],"sources":["../../../../src/pages/templates/compose/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { connection } from 'next/server';\nimport { TemplateComposeWizardView } from '../../../views/templates/compose';\n\nexport const metadata: Metadata = {\n title: '建立模板(表單 + 流程) | BPM Admin',\n description: '以精靈式流程一次完成 BPM 表單與簽核流程設計並發佈。',\n};\n\n/**\n * Drop-in Next.js App Router page for the unified template wizard.\n *\n * Consumer usage in `app/templates/compose/page.tsx`:\n *\n * ```ts\n * export { default, metadata } from '@rytass/bpm-core-react/pages/templates/compose';\n * ```\n *\n * The Step 1 (流程設計) embedded designer offers the same opt-in AI assistant\n * as the standalone designer page. `BPM_AI_ASSISTANT_ENABLED` shows the button;\n * `OPENAI_API_KEY` decides whether it's usable (else a disabled placeholder).\n * Both are server-only env on the Next.js host.\n *\n * `await connection()` opts this route out of static prerendering so those env\n * vars are read at request time. They are NOT set during `next build` (only\n * injected into the runtime container), so without this the flags would bake to\n * `false` on a production build — unlike the `[id]` designer page, which is\n * already dynamic by virtue of its route params. Survives the host's one-line\n * re-export, so npm consumers don't need their own route-segment config.\n */\nexport default async function TemplateComposePage(): Promise<ReactElement> {\n await connection();\n\n return (\n <TemplateComposeWizardView\n aiAssistantAvailable={Boolean(process.env.OPENAI_API_KEY)}\n showAiAssistant={process.env.BPM_AI_ASSISTANT_ENABLED === 'true'}\n />\n );\n}\n"],"mappings":";;;;AAKA,IAAaC,IAAqB;CAChC,OAAO;CACP,aAAa;AACf;AAuBA,eAA8BC,IAA6C;CAGzE,OAFA,MAAMC,EAAW,GAGf,kBAACH,GAAD;EACE,sBAAsB,EAAQ,QAAQ,IAAI;EAC1C,iBAAiB,QAAQ,IAAI,6BAA6B;CAC3D,CAAA;AAEL"}
@@ -1,2 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/designer-D3_lWmfa.cjs");let t=require("react/jsx-runtime");var n={title:`流程設計器 | BPM Admin`,description:`以視覺化設計器編輯 BPM 簽核流程節點、條件與發佈版本。`};async function r({params:n}){let{id:r}=await n;return(0,t.jsx)(e.t,{aiAssistantAvailable:!!process.env.OPENAI_API_KEY,showAiAssistant:process.env.BPM_AI_ASSISTANT_ENABLED===`true`,showDryRun:process.env.BPM_TEMPLATE_DRY_RUN_ENABLED!==`false`,templateId:r})}exports.default=r,exports.metadata=n;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../../../chunks/designer-sJGTGYOf.cjs");let t=require("react/jsx-runtime");var n={title:`流程設計器 | BPM Admin`,description:`以視覺化設計器編輯 BPM 簽核流程節點、條件與發佈版本。`};async function r({params:n}){let{id:r}=await n;return(0,t.jsx)(e.t,{aiAssistantAvailable:!!process.env.OPENAI_API_KEY,showAiAssistant:process.env.BPM_AI_ASSISTANT_ENABLED===`true`,showDryRun:process.env.BPM_TEMPLATE_DRY_RUN_ENABLED!==`false`,templateId:r})}exports.default=r,exports.metadata=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/pages/templates/designer/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { TemplateDesignerView } from '../../../views/templates/designer';\n\nexport const metadata: Metadata = {\n title: '流程設計器 | BPM Admin',\n description: '以視覺化設計器編輯 BPM 簽核流程節點、條件與發佈版本。',\n};\n\nexport default async function TemplateDesignerPage({\n params,\n}: {\n readonly params: Promise<{ readonly id: string }>;\n}): Promise<ReactElement> {\n const { id } = await params;\n\n // AI assistant is opt-in per deployment. `BPM_AI_ASSISTANT_ENABLED` shows the\n // feature; `OPENAI_API_KEY` decides whether it's usable (else a disabled\n // placeholder). Both are server-only env on the Next.js host.\n //\n // The dry-run button shows by default; set `BPM_TEMPLATE_DRY_RUN_ENABLED` to\n // `'false'` to hide it for a deployment.\n return (\n <TemplateDesignerView\n aiAssistantAvailable={Boolean(process.env.OPENAI_API_KEY)}\n showAiAssistant={process.env.BPM_AI_ASSISTANT_ENABLED === 'true'}\n showDryRun={process.env.BPM_TEMPLATE_DRY_RUN_ENABLED !== 'false'}\n templateId={id}\n />\n );\n}\n"],"mappings":"2LAIA,IAAa,EAAqB,CAChC,MAAO,oBACP,YAAa,+BACf,EAEA,eAA8B,EAAqB,CACjD,UAGwB,CACxB,GAAM,CAAE,MAAO,MAAM,EAQrB,OACE,EAAA,EAAA,IAAA,CAAC,EAAA,EAAD,CACE,qBAAsB,EAAQ,QAAQ,IAAI,eAC1C,gBAAiB,QAAQ,IAAI,2BAA6B,OAC1D,WAAY,QAAQ,IAAI,+BAAiC,QACzD,WAAY,CACb,CAAA,CAEL"}
1
+ {"version":3,"file":"index.cjs","names":["TemplateDesignerView","require_designer","react_jsx_runtime","metadata","TemplateDesignerPage","params","id"],"sources":["../../../../src/pages/templates/designer/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { TemplateDesignerView } from '../../../views/templates/designer';\n\nexport const metadata: Metadata = {\n title: '流程設計器 | BPM Admin',\n description: '以視覺化設計器編輯 BPM 簽核流程節點、條件與發佈版本。',\n};\n\nexport default async function TemplateDesignerPage({\n params,\n}: {\n readonly params: Promise<{ readonly id: string }>;\n}): Promise<ReactElement> {\n const { id } = await params;\n\n // AI assistant is opt-in per deployment. `BPM_AI_ASSISTANT_ENABLED` shows the\n // feature; `OPENAI_API_KEY` decides whether it's usable (else a disabled\n // placeholder). Both are server-only env on the Next.js host.\n //\n // The dry-run button shows by default; set `BPM_TEMPLATE_DRY_RUN_ENABLED` to\n // `'false'` to hide it for a deployment.\n return (\n <TemplateDesignerView\n aiAssistantAvailable={Boolean(process.env.OPENAI_API_KEY)}\n showAiAssistant={process.env.BPM_AI_ASSISTANT_ENABLED === 'true'}\n showDryRun={process.env.BPM_TEMPLATE_DRY_RUN_ENABLED !== 'false'}\n templateId={id}\n />\n );\n}\n"],"mappings":"2LAIA,IAAaG,EAAqB,CAChC,MAAO,oBACP,YAAa,+BACf,EAEA,eAA8BC,EAAqB,CACjD,UAGwB,CACxB,GAAM,CAAE,MAAO,MAAMC,EAQrB,OACE,EAAAH,EAAA,IAAA,CAACF,EAAAA,EAAD,CACE,qBAAsB,EAAQ,QAAQ,IAAI,eAC1C,gBAAiB,QAAQ,IAAI,2BAA6B,OAC1D,WAAY,QAAQ,IAAI,+BAAiC,QACzD,WAAYM,CACb,CAAA,CAEL"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../chunks/designer-CrbBRPUU.js";
1
+ import { t as e } from "../../../chunks/designer-D9eFma1W.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/pages/templates/designer/index.tsx
4
4
  var n = {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/pages/templates/designer/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { TemplateDesignerView } from '../../../views/templates/designer';\n\nexport const metadata: Metadata = {\n title: '流程設計器 | BPM Admin',\n description: '以視覺化設計器編輯 BPM 簽核流程節點、條件與發佈版本。',\n};\n\nexport default async function TemplateDesignerPage({\n params,\n}: {\n readonly params: Promise<{ readonly id: string }>;\n}): Promise<ReactElement> {\n const { id } = await params;\n\n // AI assistant is opt-in per deployment. `BPM_AI_ASSISTANT_ENABLED` shows the\n // feature; `OPENAI_API_KEY` decides whether it's usable (else a disabled\n // placeholder). Both are server-only env on the Next.js host.\n //\n // The dry-run button shows by default; set `BPM_TEMPLATE_DRY_RUN_ENABLED` to\n // `'false'` to hide it for a deployment.\n return (\n <TemplateDesignerView\n aiAssistantAvailable={Boolean(process.env.OPENAI_API_KEY)}\n showAiAssistant={process.env.BPM_AI_ASSISTANT_ENABLED === 'true'}\n showDryRun={process.env.BPM_TEMPLATE_DRY_RUN_ENABLED !== 'false'}\n templateId={id}\n />\n );\n}\n"],"mappings":";;;AAIA,IAAa,IAAqB;CAChC,OAAO;CACP,aAAa;AACf;AAEA,eAA8B,EAAqB,EACjD,aAGwB;CACxB,IAAM,EAAE,UAAO,MAAM;CAQrB,OACE,kBAAC,GAAD;EACE,sBAAsB,EAAQ,QAAQ,IAAI;EAC1C,iBAAiB,QAAQ,IAAI,6BAA6B;EAC1D,YAAY,QAAQ,IAAI,iCAAiC;EACzD,YAAY;CACb,CAAA;AAEL"}
1
+ {"version":3,"file":"index.js","names":["TemplateDesignerView","metadata","TemplateDesignerPage","params","id"],"sources":["../../../../src/pages/templates/designer/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { TemplateDesignerView } from '../../../views/templates/designer';\n\nexport const metadata: Metadata = {\n title: '流程設計器 | BPM Admin',\n description: '以視覺化設計器編輯 BPM 簽核流程節點、條件與發佈版本。',\n};\n\nexport default async function TemplateDesignerPage({\n params,\n}: {\n readonly params: Promise<{ readonly id: string }>;\n}): Promise<ReactElement> {\n const { id } = await params;\n\n // AI assistant is opt-in per deployment. `BPM_AI_ASSISTANT_ENABLED` shows the\n // feature; `OPENAI_API_KEY` decides whether it's usable (else a disabled\n // placeholder). Both are server-only env on the Next.js host.\n //\n // The dry-run button shows by default; set `BPM_TEMPLATE_DRY_RUN_ENABLED` to\n // `'false'` to hide it for a deployment.\n return (\n <TemplateDesignerView\n aiAssistantAvailable={Boolean(process.env.OPENAI_API_KEY)}\n showAiAssistant={process.env.BPM_AI_ASSISTANT_ENABLED === 'true'}\n showDryRun={process.env.BPM_TEMPLATE_DRY_RUN_ENABLED !== 'false'}\n templateId={id}\n />\n );\n}\n"],"mappings":";;;AAIA,IAAaC,IAAqB;CAChC,OAAO;CACP,aAAa;AACf;AAEA,eAA8BC,EAAqB,EACjD,aAGwB;CACxB,IAAM,EAAE,UAAO,MAAMC;CAQrB,OACE,kBAACH,GAAD;EACE,sBAAsB,EAAQ,QAAQ,IAAI;EAC1C,iBAAiB,QAAQ,IAAI,6BAA6B;EAC1D,YAAY,QAAQ,IAAI,iCAAiC;EACzD,YAAYI;CACb,CAAA;AAEL"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/pages/templates/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { TemplatesView } from '../../views/templates';\n\nexport const metadata: Metadata = {\n title: '簽核模板 | BPM Admin',\n description: '設計簽核表單與流程,建立、編輯與發佈簽核模板。',\n};\n\nexport default function TemplatesPage(): ReactElement {\n return <TemplatesView />;\n}\n"],"mappings":"qLAIA,IAAa,EAAqB,CAChC,MAAO,mBACP,YAAa,yBACf,EAEA,SAAwB,GAA8B,CACpD,OAAO,EAAA,EAAA,IAAA,CAAC,EAAA,cAAD,CAAgB,CAAA,CACzB"}
1
+ {"version":3,"file":"index.cjs","names":["TemplatesView","require_views_templates_index","react_jsx_runtime","metadata","TemplatesPage"],"sources":["../../../src/pages/templates/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { TemplatesView } from '../../views/templates';\n\nexport const metadata: Metadata = {\n title: '簽核模板 | BPM Admin',\n description: '設計簽核表單與流程,建立、編輯與發佈簽核模板。',\n};\n\nexport default function TemplatesPage(): ReactElement {\n return <TemplatesView />;\n}\n"],"mappings":"qLAIA,IAAaG,EAAqB,CAChC,MAAO,mBACP,YAAa,yBACf,EAEA,SAAwBC,GAA8B,CACpD,OAAO,EAAAF,EAAA,IAAA,CAACF,EAAAA,cAAD,CAAgB,CAAA,CACzB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/pages/templates/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { TemplatesView } from '../../views/templates';\n\nexport const metadata: Metadata = {\n title: '簽核模板 | BPM Admin',\n description: '設計簽核表單與流程,建立、編輯與發佈簽核模板。',\n};\n\nexport default function TemplatesPage(): ReactElement {\n return <TemplatesView />;\n}\n"],"mappings":";;;AAIA,IAAa,IAAqB;CAChC,OAAO;CACP,aAAa;AACf;AAEA,SAAwB,IAA8B;CACpD,OAAO,kBAAC,GAAD,CAAgB,CAAA;AACzB"}
1
+ {"version":3,"file":"index.js","names":["metadata","TemplatesPage","TemplatesView"],"sources":["../../../src/pages/templates/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { TemplatesView } from '../../views/templates';\n\nexport const metadata: Metadata = {\n title: '簽核模板 | BPM Admin',\n description: '設計簽核表單與流程,建立、編輯與發佈簽核模板。',\n};\n\nexport default function TemplatesPage(): ReactElement {\n return <TemplatesView />;\n}\n"],"mappings":";;;AAIA,IAAaA,IAAqB;CAChC,OAAO;CACP,aAAa;AACf;AAEA,SAAwBC,IAA8B;CACpD,OAAO,kBAACC,GAAD,CAAgB,CAAA;AACzB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/pages/templates/versions/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { TemplateVersionsView } from '../../../views/templates/versions';\n\nexport const metadata: Metadata = {\n title: '範本版本歷史 | BPM Admin',\n description: '檢視 BPM 流程範本的版本發布與 rollback 紀錄。',\n};\n\nexport default async function TemplateVersionsPage({\n params,\n}: {\n readonly params: Promise<{ readonly id: string }>;\n}): Promise<ReactElement> {\n const { id } = await params;\n return <TemplateVersionsView templateId={id} />;\n}\n"],"mappings":"iMAIA,IAAa,EAAqB,CAChC,MAAO,qBACP,YAAa,gCACf,EAEA,eAA8B,EAAqB,CACjD,UAGwB,CACxB,GAAM,CAAE,MAAO,MAAM,EACrB,OAAO,EAAA,EAAA,IAAA,CAAC,EAAA,qBAAD,CAAsB,WAAY,CAAK,CAAA,CAChD"}
1
+ {"version":3,"file":"index.cjs","names":["TemplateVersionsView","require_views_templates_versions_index","react_jsx_runtime","metadata","TemplateVersionsPage","params","id"],"sources":["../../../../src/pages/templates/versions/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { TemplateVersionsView } from '../../../views/templates/versions';\n\nexport const metadata: Metadata = {\n title: '範本版本歷史 | BPM Admin',\n description: '檢視 BPM 流程範本的版本發布與 rollback 紀錄。',\n};\n\nexport default async function TemplateVersionsPage({\n params,\n}: {\n readonly params: Promise<{ readonly id: string }>;\n}): Promise<ReactElement> {\n const { id } = await params;\n return <TemplateVersionsView templateId={id} />;\n}\n"],"mappings":"iMAIA,IAAaG,EAAqB,CAChC,MAAO,qBACP,YAAa,gCACf,EAEA,eAA8BC,EAAqB,CACjD,UAGwB,CACxB,GAAM,CAAE,MAAO,MAAMC,EACrB,OAAO,EAAAH,EAAA,IAAA,CAACF,EAAAA,qBAAD,CAAsB,WAAYM,CAAK,CAAA,CAChD"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/pages/templates/versions/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { TemplateVersionsView } from '../../../views/templates/versions';\n\nexport const metadata: Metadata = {\n title: '範本版本歷史 | BPM Admin',\n description: '檢視 BPM 流程範本的版本發布與 rollback 紀錄。',\n};\n\nexport default async function TemplateVersionsPage({\n params,\n}: {\n readonly params: Promise<{ readonly id: string }>;\n}): Promise<ReactElement> {\n const { id } = await params;\n return <TemplateVersionsView templateId={id} />;\n}\n"],"mappings":";;;AAIA,IAAa,IAAqB;CAChC,OAAO;CACP,aAAa;AACf;AAEA,eAA8B,EAAqB,EACjD,aAGwB;CACxB,IAAM,EAAE,UAAO,MAAM;CACrB,OAAO,kBAAC,GAAD,EAAsB,YAAY,EAAK,CAAA;AAChD"}
1
+ {"version":3,"file":"index.js","names":["metadata","TemplateVersionsPage","params","TemplateVersionsView","id"],"sources":["../../../../src/pages/templates/versions/index.tsx"],"sourcesContent":["import type { Metadata } from 'next';\nimport type { ReactElement } from 'react';\nimport { TemplateVersionsView } from '../../../views/templates/versions';\n\nexport const metadata: Metadata = {\n title: '範本版本歷史 | BPM Admin',\n description: '檢視 BPM 流程範本的版本發布與 rollback 紀錄。',\n};\n\nexport default async function TemplateVersionsPage({\n params,\n}: {\n readonly params: Promise<{ readonly id: string }>;\n}): Promise<ReactElement> {\n const { id } = await params;\n return <TemplateVersionsView templateId={id} />;\n}\n"],"mappings":";;;AAIA,IAAaA,IAAqB;CAChC,OAAO;CACP,aAAa;AACf;AAEA,eAA8BC,EAAqB,EACjD,aAGwB;CACxB,IAAM,EAAE,UAAO,MAAMC;CACrB,OAAO,kBAACC,GAAD,EAAsB,YAAYC,EAAK,CAAA;AAChD"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/delegations-DlYwMiAW.cjs");exports.AdminDelegationsView=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/delegations-V9HIe3_P.cjs");exports.AdminDelegationsView=e.t;
@@ -1,2 +1 @@
1
- import { t as e } from "../../../chunks/delegations-B8gLSt0i.js";
2
- export { e as AdminDelegationsView };
1
+ export { t as AdminDelegationsView } from "../../../chunks/delegations-xUt1tj8d.js";
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/users-C9LA-Rd7.cjs"),t=require("../../chunks/orgs-D0-5BaHT.cjs"),n=require("../../chunks/delegations-DlYwMiAW.cjs"),r=require("./webhook-endpoints/index.cjs");exports.AdminDelegationsView=n.t,exports.AdminOrgsView=t.t,exports.AdminUsersView=e.t,exports.AdminWebhookEndpointsView=r.AdminWebhookEndpointsView;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/users-DVBJluFR.cjs"),t=require("../../chunks/orgs-Dr0FFoZo.cjs"),n=require("../../chunks/delegations-V9HIe3_P.cjs"),r=require("./webhook-endpoints/index.cjs");exports.AdminDelegationsView=n.t,exports.AdminOrgsView=t.t,exports.AdminUsersView=e.t,exports.AdminWebhookEndpointsView=r.AdminWebhookEndpointsView;
@@ -1,5 +1,5 @@
1
- import { t as e } from "../../chunks/users-FWrb3ehW.js";
2
- import { t } from "../../chunks/orgs-BpqVu5ka.js";
3
- import { t as n } from "../../chunks/delegations-B8gLSt0i.js";
1
+ import { t as e } from "../../chunks/users-BCyePbwB.js";
2
+ import { t } from "../../chunks/orgs-CY0i1fie.js";
3
+ import { t as n } from "../../chunks/delegations-xUt1tj8d.js";
4
4
  import { AdminWebhookEndpointsView as r } from "./webhook-endpoints/index.js";
5
5
  export { n as AdminDelegationsView, t as AdminOrgsView, e as AdminUsersView, r as AdminWebhookEndpointsView };
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/orgs-D0-5BaHT.cjs");exports.AdminOrgsView=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/orgs-Dr0FFoZo.cjs");exports.AdminOrgsView=e.t;
@@ -1,2 +1 @@
1
- import { t as e } from "../../../chunks/orgs-BpqVu5ka.js";
2
- export { e as AdminOrgsView };
1
+ export { t as AdminOrgsView } from "../../../chunks/orgs-CY0i1fie.js";
@@ -0,0 +1,13 @@
1
+ import { ReactElement } from 'react';
2
+ import { MemberProfileRecord } from '@rytass/bpm-core-client';
3
+ /**
4
+ * Administrator reassignment of a member's open tasks. Lists what the member
5
+ * holds, takes a target and a reason, previews every task's outcome (dry run),
6
+ * and only then commits. Confirm stays disabled until the preview matches the
7
+ * current target and reason. Replacing a seat is not a decision: no signature
8
+ * is written, and the task keeps its id.
9
+ */
10
+ export declare function MemberTaskReassignModal({ member, onClose, }: {
11
+ readonly member: MemberProfileRecord | null;
12
+ readonly onClose: () => void;
13
+ }): ReactElement;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/users-C9LA-Rd7.cjs");exports.AdminUsersView=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../chunks/users-DVBJluFR.cjs");exports.AdminUsersView=e.t;
@@ -1,2 +1 @@
1
- import { t as e } from "../../../chunks/users-FWrb3ehW.js";
2
- export { e as AdminUsersView };
1
+ export { t as AdminUsersView } from "../../../chunks/users-BCyePbwB.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"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.cjs","names":["useState","useCallback","readWorkflowWebhookEndpointManagement","listWorkflowWebhookManagedEndpoints","useMemo","Typography","Badge","formatDateTime","testWorkflowWebhookEndpoint","setWorkflowWebhookEndpointActive","listWorkflowWebhookEndpointAudits","updateWorkflowWebhookEndpoint","createWorkflowWebhookEndpoint","rotateWorkflowWebhookEndpointSecret","_Fragment","PageHeader","ContentHeader","Button","PlusIcon","SectionGroup","Section","Table","Modal","BPMFormField","Toggle","Input","Textarea","Select","TrashIcon","require_rolldown_runtime","require_format_date_time","require_bpm_form_field","react","_mezzanine_ui_react","react_jsx_runtime","_mezzanine_ui_react_ContentHeader","_mezzanine_ui_icons","_rytass_bpm_core_client_template","STACK_STYLE","ROW_STYLE","HEADER_ROW_STYLE","METHOD_OPTIONS","PARAMETER_TYPE_OPTIONS","AUDIT_ACTION_LABELS","EMPTY_DRAFT","AdminWebhookEndpointsView","management","setManagement","endpoints","setEndpoints","loading","setLoading","error","setError","notice","setNotice","draft","setDraft","saving","setSaving","rotating","setRotating","nextSecret","setNextSecret","removeSecret","setRemoveSecret","audits","setAudits","refresh","nextManagement","requestError","readErrorMessage","run","work","rows","endpoint","columns","actions","readEditDraft","readTestNotice","handleSaveDraft","saved","parameters","parameter","headers","header","timeoutMs","isOriginChanged","handleRotate","enabled","EndpointDraftModal","event","AUDIT_COLUMNS","audit","editing","originChanged","replaceHeaders","update","onChange","patch","updateParameter","current","index","updateHeader","text","field","onCancel","option","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":"yeAgGA,IAAMsC,EAA6B,CACjC,QAAS,OACT,IAAK,6BACP,EAEMC,EAA2B,CAC/B,WAAY,SACZ,QAAS,OACT,IAAK,8BACL,oBAAqB,wDACvB,EAEMC,EAAkC,CACtC,WAAY,SACZ,QAAS,OACT,IAAK,8BACL,oBAAqB,oCACvB,EAEMC,EAA0C,CAC9C,CAAE,GAAI,OAAQ,KAAM,MAAO,EAC3B,CAAE,GAAI,MAAO,KAAM,KAAM,EACzB,CAAE,GAAI,QAAS,KAAM,OAAQ,CAC/B,EAEMC,EAAkD,CACtD,CAAE,GAAI,SAAU,KAAM,IAAK,EAC3B,CAAE,GAAI,SAAU,KAAM,IAAK,EAC3B,CAAE,GAAI,UAAW,KAAM,KAAM,EAC7B,CAAE,GAAI,cAAe,KAAM,MAAO,EAClC,CAAE,GAAI,OAAQ,KAAM,MAAO,CAC7B,EAEMC,EAEF,CACF,QAAS,KACT,SAAU,KACV,QAAS,KACT,eAAgB,OAChB,UAAW,OACX,QAAS,IACX,EAEMC,EAA6B,CACjC,WAAY,GACZ,YAAa,GACb,WAAY,KACZ,QAAS,CAAC,EACV,IAAK,GACL,MAAO,GACP,OAAQ,OACR,KAAM,SACN,YAAa,GACb,WAAY,CAAC,EACb,eAAgB,GAChB,cAAe,GACf,UAAW,GACX,IAAK,GACL,QAAS,GACX,EAQA,SAAgBC,GAA0C,CACxD,GAAM,CAACC,EAAYC,IAAA,EACjB/C,EAAAA,SAAAA,CAAyD,IAAI,EACzD,CAACgD,EAAWC,IAAA,EAAgBjD,EAAAA,SAAAA,CAEhC,CAAC,CAAC,EACE,CAACkD,EAASC,IAAA,EAAcnD,EAAAA,SAAAA,CAAS,EAAI,EACrC,CAACoD,EAAOC,IAAA,EAAYrD,EAAAA,SAAAA,CAAwB,IAAI,EAChD,CAACsD,EAAQC,IAAA,EAAavD,EAAAA,SAAAA,CAAwB,IAAI,EAClD,CAACwD,EAAOC,IAAA,EAAYzD,EAAAA,SAAAA,CAA+B,IAAI,EACvD,CAAC0D,EAAQC,IAAA,EAAa3D,EAAAA,SAAAA,CAAS,EAAK,EACpC,CAAC4D,EAAUC,IAAA,EACf7D,EAAAA,SAAAA,CAAsD,IAAI,EACtD,CAAC8D,EAAYC,IAAA,EAAiB/D,EAAAA,SAAAA,CAAS,EAAE,EACzC,CAACgE,EAAcC,IAAA,EAAmBjE,EAAAA,SAAAA,CAAS,EAAK,EAChD,CAACkE,EAAQC,IAAA,EAAanE,EAAAA,SAAAA,CAGlB,IAAI,EAERoE,GAAA,EAAUnE,EAAAA,YAAAA,CAAY,SAA2B,CACrDkD,EAAW,EAAI,EAEf,GAAI,CACF,IAAMkB,EAAiB,MAAA,EAAMnE,EAAAA,sCAAAA,CAAsC,EAEnE6C,EAAcsB,CAAc,EAC5BpB,EACEoB,EAAe,QACX,MAAA,EAAMlE,EAAAA,oCAAAA,CAAoC,EAC1C,CAAC,CACP,EACAkD,EAAS,IAAI,CACf,OAASiB,EAAuB,CAC9BjB,EAASkB,EAAiBD,CAAY,CAAC,CACzC,QAAU,CACRnB,EAAW,EAAK,CAClB,CACF,EAAG,CAAC,CAAC,GAEL,EAAAnB,EAAA,UAAA,KAAsB,CACpBoC,EAAa,CACf,EAAG,CAACA,CAAO,CAAC,EAEZ,IAAMI,GAAA,EAAMvE,EAAAA,YAAAA,CACV,KAAO,IAAyD,CAC9DoD,EAAS,IAAI,EACbE,EAAU,IAAI,EAEd,GAAI,CAIF,OAHAA,EAAU,MAAMkB,EAAK,CAAC,EACtB,MAAML,EAAQ,EAEP,EACT,OAASE,EAAuB,CAG9B,OAFAjB,EAASkB,EAAiBD,CAAY,CAAC,EAEhC,EACT,CACF,EACA,CAACF,CAAO,CACV,EAEMM,GAAA,EAAOtE,EAAAA,QAAAA,KAET4C,EAAU,IAAK,IAAc,CAAE,WAAU,IAAK2B,EAAS,EAAG,EAAE,EAC9D,CAAC3B,CAAS,CACZ,EAEM4B,GAAA,EAAUxE,EAAAA,QAAAA,KACoB,CAChC,CACE,IAAK,QACL,QAAS,CAAE,eACT,EAAA8B,EAAA,KAAA,CAAC,MAAD,CAAK,MAAOI,EAAZ,SAAA,EACE,EAAAJ,EAAA,IAAA,CAAC7B,EAAAA,WAAD,CAAY,UAAU,OAAO,QAAQ,OAClC,SAAAsE,EAAS,KACA,CAAA,GACZ,EAAAzC,EAAA,KAAA,CAAC7B,EAAAA,WAAD,CAAY,MAAM,eAAe,UAAU,OAAO,QAAQ,UAA1D,SAAA,CACGsE,EAAS,IAAI,IAAEA,EAAS,QAAQ,QAAM,IACtCA,EAAS,WAAW,OAAO,IAClB,CACT,CAAA,CAAA,IAEP,MAAO,KACP,MAAO,GACT,EACA,CACE,IAAK,MACL,QAAS,CAAE,eACT,EAAAzC,EAAA,KAAA,CAAC7B,EAAAA,WAAD,CAAY,UAAU,OAAO,QAAQ,OAArC,SAAA,CACGsE,EAAS,OAAO,IAAEA,EAAS,GAClB,IAEd,MAAO,MACP,MAAO,GACT,EACA,CACE,IAAK,SACL,QAAS,CAAE,cACRA,EAAS,OAENA,EAAS,YACX,EAAAzC,EAAA,IAAA,CAAC5B,EAAAA,MAAD,CAAO,KAAK,MAAM,KAAK,QAAQ,QAAQ,aAAe,CAAA,GAEtD,EAAA4B,EAAA,IAAA,CAAC5B,EAAAA,MAAD,CAAO,KAAK,MAAM,KAAK,MAAM,QAAQ,aAAe,CAAA,GAJpD,EAAA4B,EAAA,IAAA,CAAC5B,EAAAA,MAAD,CAAO,KAAK,MAAM,KAAK,MAAM,QAAQ,cAAgB,CAAA,EAMzD,MAAO,KACP,MAAO,GACT,EACA,CACE,IAAK,cACL,QAAS,CAAE,eACT,EAAA4B,EAAA,KAAA,CAAC,MAAD,CAAK,MAAOI,EAAZ,SAAA,EACE,EAAAJ,EAAA,IAAA,CAAC7B,EAAAA,WAAD,CAAY,UAAU,OAAO,QAAQ,OAClC,SAAAsE,EAAS,iBAAmB,UAAY,KAC/B,CAAA,GACZ,EAAAzC,EAAA,IAAA,CAAC7B,EAAAA,WAAD,CAAY,MAAM,eAAe,UAAU,OAAO,QAAQ,UACvD,SAAAsE,EAAS,YAAY,OAClB,UAAUA,EAAS,YAAY,KAAK,GAAG,IACvC,aACM,CAAA,CACT,IAEP,MAAO,KACP,MAAO,GACT,EACA,CACE,IAAK,YACL,QAAS,CAAE,eACT,EAAAzC,EAAA,IAAA,CAAC7B,EAAAA,WAAD,CAAY,UAAU,OAAO,QAAQ,OAClC,SAAAE,EAAAA,EAAeoE,EAAS,SAAS,CACxB,CAAA,EAEd,MAAO,OACP,MAAO,GACT,CACF,EACA,CAAC,CACH,EAEME,GAAA,EAAUzE,EAAAA,QAAAA,MACoB,CAChC,QAAS,CACP,cACqD,CACrD,CACE,KAAM,KACN,YAAqBqD,EAASqB,EAAcH,EAAU,MAAM,CAAC,CAC/D,EACA,CACE,KAAM,QACN,YAAqBlB,EAASqB,EAAcH,EAAU,SAAS,CAAC,CAClE,EACA,CACE,KAAM,OACN,YAAqB,CACnBH,EAAS,SACPO,EACEJ,EACA,MAAA,EAAMnE,EAAAA,4BAAAA,CAA4BmE,EAAS,EAAE,CAC/C,CACF,CACF,CACF,EACA,CACE,KAAM,OACN,YAAqB,CACnBZ,EAAc,EAAE,EAChBE,EAAgB,EAAK,EACrBJ,EAAYc,CAAQ,CACtB,CACF,EACA,CACE,KAAMA,EAAS,OAAS,KAAO,KAC/B,YAAqB,CACnBH,EAAS,UACP,MAAA,EAAM/D,EAAAA,iCAAAA,CACJkE,EAAS,GACT,CAACA,EAAS,MACZ,EAEO,IAAIA,EAAS,OAAS,KAAO,KAAK,GAAGA,EAAS,MAAM,IAC5D,CACH,CACF,EACA,CACE,KAAM,OACN,YAAqB,EACnB,EAAKjE,EAAAA,kCAAAA,CAAkCiE,EAAS,EAAE,CAAC,CAChD,KAAM,GAAkBR,EAAU,CAAE,WAAU,SAAQ,CAAC,CAAC,CAAC,CACzD,MAAO,GACNd,EAASkB,EAAiBD,CAAY,CAAC,CACzC,CACJ,CACF,CACF,EACA,QAAS,iBACT,MAAO,GACT,GACA,CAACE,CAAG,CACN,EAEA,eAAeQ,GAAiC,CAC9C,GAAI,CAACxB,EACH,OAGFG,EAAU,EAAI,EAEd,IAAMsB,EAAQ,MAAMT,EAAI,SAAY,CAClC,IAAMU,EAAa1B,EAAM,WAAW,IAAK,IAAe,CACtD,YAAa2B,EAAU,YAAY,KAAK,GAAK,KAC7C,IAAKA,EAAU,IAAI,KAAK,EACxB,MAAOA,EAAU,MAAM,KAAK,EAC5B,SAAUA,EAAU,SACpB,KAAMA,EAAU,IAClB,EAAE,EACIC,EAAU5B,EAAM,QACnB,OAAQ,GAAW6B,EAAO,KAAK,KAAK,CAAC,CAAC,CACtC,IAAK,IAAY,CAAE,KAAMA,EAAO,KAAK,KAAK,EAAG,MAAOA,EAAO,KAAM,EAAE,EAChEC,EAAY9B,EAAM,UAAU,KAAK,EAAI,OAAOA,EAAM,SAAS,EAAI,KAiCrE,OA/BIA,EAAM,OAAS,QAAUA,EAAM,YACjC,MAAA,EAAM7C,EAAAA,8BAAAA,CAA8B,CAClC,WAAY6C,EAAM,WAClB,YAAaA,EAAM,YACnB,QACEA,EAAM,gBAAkB+B,EAAgB/B,CAAK,EAAI4B,EAAU,KAC7D,GAAI5B,EAAM,WACV,MAAOA,EAAM,MACb,OAAQA,EAAM,OACd,aACA,YACA,IAAKA,EAAM,GACb,CAAC,EAEM,OAAOA,EAAM,MAAM,MAG5B,MAAA,EAAM5C,EAAAA,8BAAAA,CAA8B,CAClC,WAAY4C,EAAM,WAClB,YAAaA,EAAM,YACnB,UACA,IAAKA,EAAM,IACX,MAAOA,EAAM,MACb,OAAQA,EAAM,OACd,aACA,cAAeA,EAAM,eAAiB,KACtC,YACA,IAAKA,EAAM,IACX,QAAS,OAAOA,EAAM,OAAO,CAC/B,CAAC,EAEM,OAAOA,EAAM,MAAM,IAAIA,EAAM,QAAQ,aAC9C,CAAC,EAEDG,EAAU,EAAK,EAEXsB,GACFxB,EAAS,IAAI,CAEjB,CAEA,eAAe+B,GAA8B,CAC3C,GAAI,CAAC5B,EACH,OAGF,IAAMe,EAAWf,EAYb,MAXeY,EAAI,UACrB,MAAA,EAAM3D,EAAAA,oCAAAA,CACJ8D,EAAS,GACTX,EAAe,KAAOF,CACxB,EAEOE,EACH,OAAOW,EAAS,MAAM,mBACtB,OAAOA,EAAS,MAAM,qBAC3B,IAGCd,EAAY,IAAI,EAChBE,EAAc,EAAE,EAEpB,CAEA,IAAM0B,EAAU,EAAQ3C,GAAY,QAEpC,OACE,EAAAZ,EAAA,KAAA,CAAApB,EAAAA,SAAA,CAAA,SAAA,EACE,EAAAoB,EAAA,IAAA,CAACnB,EAAAA,WAAD,CAAA,UACE,EAAAmB,EAAA,IAAA,CAAClB,EAAAA,QAAD,CACE,YAAY,+CACZ,MAAM,aAEN,UAAA,EAAAkB,EAAA,IAAA,CAACjB,EAAAA,OAAD,CACE,SAAU,CAACwE,EACX,KAAMvE,EAAAA,SACN,SAAS,UACT,YAAqBuC,EAASb,CAAW,EACzC,QAAQ,eACT,SAAA,MAEO,CAAA,CACK,CAAA,CACL,CAAA,GAEZ,EAAAV,EAAA,IAAA,CAACf,EAAAA,aAAD,CAAA,UACE,EAAAe,EAAA,IAAA,CAACd,EAAAA,QAAD,CAAA,UACE,EAAAc,EAAA,KAAA,CAAC,MAAD,CAAK,MAAOI,EAAZ,SAAA,CACGc,GACC,EAAAlB,EAAA,IAAA,CAAC7B,EAAAA,WAAD,CAAY,MAAM,aAAa,QAAQ,OACpC,SAAA+C,CACS,CAAA,EACV,KACHE,GACC,EAAApB,EAAA,IAAA,CAAC7B,EAAAA,WAAD,CAAY,MAAM,eAAe,QAAQ,OACtC,SAAAiD,CACS,CAAA,EACV,KACHR,GAAc,CAAC2C,GACd,EAAAvD,EAAA,IAAA,CAAC7B,EAAAA,WAAD,CAAY,MAAM,eAAe,QAAQ,OAAO,SAAA,gGAIpC,CAAA,EACV,KACHoF,GACC,EAAAvD,EAAA,KAAA,CAAC7B,EAAAA,WAAD,CAAY,MAAM,eAAe,QAAQ,UAAzC,SAAA,CAAmD,WACxCyC,GAAY,mBAAmB,KAAK,GAAG,CACtC,CACV,CAAA,EAAA,MACJ,EAAAZ,EAAA,IAAA,CAACb,EAAAA,MAAD,CACW,UACA,UACT,WAAYqD,EACZ,UAAA,GACS,SACV,CAAA,CACE,CACE,CAAA,CAAA,CAAA,CACG,CAAA,EAEblB,GACC,EAAAtB,EAAA,IAAA,CAACwD,EAAD,CACS,QACP,aAAsBjC,EAAS,IAAI,EACnC,SAAUA,EACV,cAAuB,KAAKuB,EAAgB,EACpC,QACT,CAAA,EACC,MAEJ,EAAA9C,EAAA,IAAA,CAACZ,EAAAA,MAAD,CACE,WAAW,KACX,mBAAoB,CAAE,SAAU,CAAC0C,GAAgB,CAACF,CAAW,EAC7D,YAAaE,EAAe,OAAS,OACrC,UAAU,WACV,aAAsBH,EAAY,IAAI,EACtC,YAAqBA,EAAY,IAAI,EACrC,cAAuB,KAAK2B,EAAa,EACzC,KAAM,EAAQ5B,EACd,gBAAA,GACA,gBAAA,GACA,eAAe,gCACf,MAAO,UAAUA,GAAU,OAAS,KAEpC,UAAA,EAAA1B,EAAA,KAAA,CAAC,MAAD,CAAK,MAAOI,EAAZ,SAAA,EACE,EAAAJ,EAAA,IAAA,CAACX,EAAAA,EAAD,CAAc,MAAM,OAAO,KAAK,sBAC9B,UAAA,EAAAW,EAAA,IAAA,CAACV,EAAAA,OAAD,CACE,QAASwC,EACT,SAAW,GACTC,EAAgB0B,EAAM,OAAO,OAAO,CAEvC,CAAA,CACW,CAAA,EACb3B,EAAe,MACd,EAAA9B,EAAA,IAAA,CAACX,EAAAA,EAAD,CAAc,MAAM,MAAM,KAAK,oBAAoB,SAAA,GACjD,UAAA,EAAAW,EAAA,IAAA,CAACT,EAAAA,MAAD,CACE,SAAW,GACTsC,EAAc4B,EAAM,OAAO,KAAK,EAElC,MAAO7B,EACP,WAAY,CAAE,aAAc,cAAe,EAC3C,QAAQ,UACT,CAAA,CACW,CAAA,CAEb,GACA,CAAA,GAEP,EAAA5B,EAAA,IAAA,CAACZ,EAAAA,MAAD,CACE,YAAY,KACZ,UAAU,WACV,YAAqB6C,EAAU,IAAI,EACnC,cAAuBA,EAAU,IAAI,EACrC,KAAM,EAAQD,EACd,gBAAA,GACA,gBAAA,GACA,KAAK,OACL,eAAe,yBACf,MAAO,QAAQA,GAAQ,SAAS,OAAS,KAEzC,UAAA,EAAAhC,EAAA,IAAA,CAACb,EAAAA,MAAD,CACE,QAASuE,EACT,YAAa1B,GAAQ,SAAW,CAAC,EAAA,CAAG,IAAK,IAAqB,CAC5D,QACA,IAAK2B,EAAM,EACb,EAAE,EACF,UAAA,EACD,CAAA,CACI,CAAA,CACP,CAAA,CAAA,CAEN,CAEA,IAAMD,EAAyC,CAC7C,CACE,IAAK,YACL,QAAS,CAAE,YACT,EAAA1D,EAAA,IAAA,CAAC7B,EAAAA,WAAD,CAAY,UAAU,OAAO,QAAQ,OAClC,SAAAE,EAAAA,EAAesF,EAAM,SAAS,CACrB,CAAA,EAEd,MAAO,KACP,MAAO,GACT,EACA,CACE,IAAK,SACL,QAAS,CAAE,YACT,EAAA3D,EAAA,IAAA,CAAC7B,EAAAA,WAAD,CAAY,UAAU,OAAO,QAAQ,OAClC,SAAAsC,EAAoBkD,EAAM,OACjB,CAAA,EAEd,MAAO,KACP,MAAO,GACT,EACA,CACE,IAAK,gBACL,QAAS,CAAE,YACT,EAAA3D,EAAA,IAAA,CAAC7B,EAAAA,WAAD,CAAY,UAAU,OAAO,QAAQ,OAClC,SAAAwF,EAAM,cAAc,KAAK,GAAG,GAAK,GACxB,CAAA,EAEd,MAAO,KACP,MAAO,GACT,EACA,CACE,IAAK,QACL,QAAS,CAAE,YACT,EAAA3D,EAAA,IAAA,CAAC7B,EAAAA,WAAD,CAAY,UAAU,OAAO,QAAQ,OAClC,SAAAwF,EAAM,eAAiB,IACd,CAAA,EAEd,MAAO,MACP,MAAO,GACT,CACF,EAEA,SAASH,EAAmB,CAC1B,QACA,WACA,WACA,YACA,UAOe,CACf,IAAMI,EAAUtC,EAAM,OAAS,OAGzBuC,EAAgBR,EAAgB/B,CAAK,EACrCwC,EAAiBxC,EAAM,gBAAkBuC,EACzCE,EAAU,GACdC,EAAS,CAAE,GAAG1C,EAAO,GAAG2C,CAAM,CAAC,EAC3BC,GACJ,EACA,IAEAH,EAAO,CACL,WAAYzC,EAAM,WAAW,KAAK,EAAW,IAC3C6C,IAAYC,EAAQ,CAAE,GAAGnB,EAAW,GAAGgB,CAAM,EAAIhB,CACnD,CACF,CAAC,EACGoB,GAAgB,EAAe,IACnCN,EAAO,CACL,QAASzC,EAAM,QAAQ,KAAK,EAAQ,IAClC6C,IAAYC,EAAQ,CAAE,GAAGjB,EAAQ,GAAGc,CAAM,EAAId,CAChD,CACF,CAAC,EACGmB,EACH,GACA,GACCP,EAAO,EAAGQ,GAAQd,EAAM,OAAO,KAAM,CAAC,EAE1C,OACE,EAAAzD,EAAA,IAAA,CAACZ,EAAAA,MAAD,CACE,WAAW,KACX,YAAawE,EAAU,KAAO,KAC9B,QAASpC,EACT,UAAU,WACA,WACV,QAASgD,EACE,YACX,KAAA,GACA,gBAAA,GACA,gBAAA,GACA,KAAK,OACL,eACEZ,EACI,sCACAtC,EAAM,OAAS,UACb,+BACA,oBAER,MACEsC,EACI,QAAQtC,EAAM,QACdA,EAAM,OAAS,UACb,SAASA,EAAM,MACf,gBAGR,UAAA,EAAAtB,EAAA,KAAA,CAAC,MAAD,CAAK,MAAOI,EAAZ,SAAA,EACE,EAAAJ,EAAA,IAAA,CAACX,EAAAA,EAAD,CAAc,MAAM,MAAM,KAAK,cAAc,SAAA,GAC3C,UAAA,EAAAW,EAAA,IAAA,CAACT,EAAAA,MAAD,CACE,GAAK+B,EAAM,OAAS,SAAW,CAAC,EAAI,CAAE,SAAU,EAAc,EAC9D,SAAUgD,EAAK,KAAK,EACpB,YAAY,sBACZ,MAAOhD,EAAM,IACb,WAAY,CAAE,aAAc,KAAM,EAClC,QAAQ,MACT,CAAA,CACW,CAAA,GACd,EAAAtB,EAAA,IAAA,CAACX,EAAAA,EAAD,CAAc,MAAM,KAAK,KAAK,kBAAkB,SAAA,GAC9C,UAAA,EAAAW,EAAA,IAAA,CAACT,EAAAA,MAAD,CACE,GAAKqE,EAAU,CAAE,SAAU,EAAc,EAAI,CAAC,EAC9C,WAAY,CAAE,aAAc,MAAO,UAAW,SAAU,EACxD,SAAUU,EAAK,SAAS,EACxB,MAAOhD,EAAM,QACb,QAAQ,MACT,CAAA,CACW,CAAA,GACd,EAAAtB,EAAA,IAAA,CAACX,EAAAA,EAAD,CAAc,MAAM,KAAK,KAAK,gBAAgB,SAAA,GAC5C,UAAA,EAAAW,EAAA,IAAA,CAACT,EAAAA,MAAD,CACE,SAAU+E,EAAK,OAAO,EACtB,YAAY,cACZ,MAAOhD,EAAM,MACb,WAAY,CAAE,aAAc,KAAM,EAClC,QAAQ,MACT,CAAA,CACW,CAAA,GACd,EAAAtB,EAAA,IAAA,CAACX,EAAAA,EAAD,CAAc,MAAM,KAAK,KAAK,sBAC5B,UAAA,EAAAW,EAAA,IAAA,CAACR,EAAAA,SAAD,CACE,SAAU8E,EAAK,aAAa,EAC5B,KAAM,EACN,MAAOhD,EAAM,WACd,CAAA,CACW,CAAA,GACd,EAAAtB,EAAA,IAAA,CAACX,EAAAA,EAAD,CAAc,MAAM,MAAM,KAAK,cAAc,SAAA,GAC3C,UAAA,EAAAW,EAAA,IAAA,CAACT,EAAAA,MAAD,CACE,SAAU+E,EAAK,KAAK,EACpB,YAAY,WACZ,MAAOhD,EAAM,IACb,WAAY,CAAE,aAAc,KAAM,EAClC,QAAQ,MACT,CAAA,CACW,CAAA,GACd,EAAAtB,EAAA,IAAA,CAACX,EAAAA,EAAD,CAAc,MAAM,SAAS,KAAK,iBAAiB,SAAA,GACjD,UAAA,EAAAW,EAAA,IAAA,CAACP,EAAAA,OAAD,CACE,UAAW,GACX,SAAW,GACTsE,EAAO,CAAE,OAAQU,GAAQ,IAAM,MAAO,CAAC,EAEzC,QAAS,CAAC,GAAGlE,CAAc,EAC3B,MACEA,EAAe,KAAM,GAAWkE,EAAO,KAAOnD,EAAM,MAAM,GAC1D,IAEH,CAAA,CACW,CAAA,GACd,EAAAtB,EAAA,IAAA,CAACX,EAAAA,EAAD,CACE,SAAS,2BACT,MAAM,SACN,KAAK,kBAEL,UAAA,EAAAW,EAAA,IAAA,CAACT,EAAAA,MAAD,CACE,WAAY,CAAE,aAAc,MAAO,UAAW,SAAU,EACxD,SAAU+E,EAAK,WAAW,EAC1B,MAAOhD,EAAM,UACb,QAAQ,MACT,CAAA,CACW,CAAA,GACd,EAAAtB,EAAA,IAAA,CAACX,EAAAA,EAAD,CAAc,MAAM,QAAQ,KAAK,qBAC/B,UAAA,EAAAW,EAAA,IAAA,CAACV,EAAAA,OAAD,CACE,QAASgC,EAAM,WACf,SAAW,GACTyC,EAAO,CAAE,WAAYN,EAAM,OAAO,OAAQ,CAAC,CAE9C,CAAA,CACW,CAAA,EACbG,EAAU,MACT,EAAA5D,EAAA,IAAA,CAACX,EAAAA,EAAD,CACE,SAAS,wCACT,MAAM,OACN,KAAK,wBAEL,UAAA,EAAAW,EAAA,IAAA,CAACT,EAAAA,MAAD,CACE,SAAU+E,EAAK,eAAe,EAC9B,YAAY,aACZ,MAAOhD,EAAM,cACb,WAAY,CAAE,aAAc,cAAe,EAC3C,QAAQ,UACT,CAAA,CACW,CAAA,GAGhB,EAAAtB,EAAA,IAAA,CAAC7B,EAAAA,WAAD,CAAY,QAAQ,0BAA0B,SAAA,SAAmB,CAAA,EAChEyF,GACC,EAAA5D,EAAA,IAAA,CAACX,EAAAA,EAAD,CACE,SACEwE,EACI,8CACA,wCAEN,MAAM,aACN,KAAK,yBAEL,UAAA,EAAA7D,EAAA,IAAA,CAACV,EAAAA,OAAD,CACE,QAASwE,EACT,SAAUD,EACV,SAAW,GACTE,EAAO,CAAE,eAAgBN,EAAM,OAAO,OAAQ,CAAC,CAElD,CAAA,CACW,CAAA,EACZ,KACHK,EACGxC,EAAM,QAAQ,KAAK,EAAQ,KACzB,EAAAtB,EAAA,KAAA,CAAC,MAAD,CAAiB,MAAOM,EAAxB,SAAA,EACE,EAAAN,EAAA,IAAA,CAACT,EAAAA,MAAD,CACE,SAAW,GACT8E,EAAaD,EAAO,CAAE,KAAMX,EAAM,OAAO,KAAM,CAAC,EAElD,YAAY,sBACZ,WAAY,CAAE,aAAc,KAAM,EAClC,MAAON,EAAO,KACd,QAAQ,MACT,CAAA,GACD,EAAAnD,EAAA,IAAA,CAACT,EAAAA,MAAD,CACE,SAAW,GACT8E,EAAaD,EAAO,CAAE,MAAOX,EAAM,OAAO,KAAM,CAAC,EAEnD,YAAY,IACZ,MAAON,EAAO,MACd,WAAY,CAAE,aAAc,cAAe,EAC3C,QAAQ,UACT,CAAA,GACD,EAAAnD,EAAA,IAAA,CAACjB,EAAAA,OAAD,CACE,KAAMW,EAAAA,UACN,SAAS,YACT,YACEqE,EAAO,CACL,QAASzC,EAAM,QAAQ,QACpB,EAAS,IAAY6C,IAAYC,CACpC,CACF,CAAC,EAEH,QAAQ,wBACT,SAAA,WAEO,CAAA,CACL,CAjCK,EAAAA,CAiCL,CACN,EACD,KACHN,GACC,EAAA9D,EAAA,IAAA,CAAC,MAAD,CAAA,UACE,EAAAA,EAAA,IAAA,CAACjB,EAAAA,OAAD,CACE,KAAMC,EAAAA,SACN,SAAS,UACT,YACE+E,EAAO,CAAE,QAAS,CAAC,GAAGzC,EAAM,QAAS,CAAE,KAAM,GAAI,MAAO,EAAG,CAAC,CAAE,CAAC,EAEjE,QAAQ,cACT,SAAA,WAEO,CAAA,CACL,CAAA,EACH,MAEJ,EAAAtB,EAAA,IAAA,CAAC7B,EAAAA,WAAD,CAAY,QAAQ,0BAA0B,SAAA,IAAc,CAAA,EAC3DmD,EAAM,WAAW,KAAK,EAAW,KAChC,EAAAtB,EAAA,KAAA,CAAC,MAAD,CAAiB,MAAOK,EAAxB,SAAA,EACE,EAAAL,EAAA,IAAA,CAACT,EAAAA,MAAD,CACE,GAAKqE,EAAU,CAAE,SAAU,EAAc,EAAI,CAAC,EAC9C,SAAW,GACTM,EAAgBE,EAAO,CAAE,IAAKX,EAAM,OAAO,KAAM,CAAC,EAEpD,YAAY,MACZ,WAAY,CAAE,aAAc,KAAM,EAClC,MAAOR,EAAU,IACjB,QAAQ,MACT,CAAA,GACD,EAAAjD,EAAA,IAAA,CAACT,EAAAA,MAAD,CACE,SAAW,GACT2E,EAAgBE,EAAO,CAAE,MAAOX,EAAM,OAAO,KAAM,CAAC,EAEtD,YAAY,OACZ,WAAY,CAAE,aAAc,KAAM,EAClC,MAAOR,EAAU,MACjB,QAAQ,MACT,CAAA,GACD,EAAAjD,EAAA,IAAA,CAACP,EAAAA,OAAD,CACE,UAAW,GACX,SAAUmE,EACV,SAAW,GACTM,EAAgBE,EAAO,CACrB,KAAMM,EAAkBD,GAAQ,IAAM,IAAI,CAC5C,CAAC,EAEH,QAAS,CAAC,GAAGjE,CAAsB,EACnC,MACEA,EAAuB,KACpB,GAAWiE,EAAO,KAAOxB,EAAU,IACtC,GAAK,IAER,CAAA,GACD,EAAAjD,EAAA,IAAA,CAACV,EAAAA,OAAD,CACE,QAAS2D,EAAU,SACnB,SAAUW,EACV,MAAM,KACN,SAAW,GACTM,EAAgBE,EAAO,CAAE,SAAUX,EAAM,OAAO,OAAQ,CAAC,CAE5D,CAAA,GACD,EAAAzD,EAAA,IAAA,CAACjB,EAAAA,OAAD,CACE,SAAU6E,EACV,KAAMlE,EAAAA,UACN,SAAS,YACT,YACEqE,EAAO,CACL,WAAYzC,EAAM,WAAW,QAC1B,EAAY,IAAY6C,IAAYC,CACvC,CACF,CAAC,EAEH,QAAQ,wBACT,SAAA,MAEO,CAAA,CACL,CA1DK,EAAAA,CA0DL,CACN,EACAR,EAAU,MACT,EAAA5D,EAAA,IAAA,CAAC,MAAD,CAAA,UACE,EAAAA,EAAA,IAAA,CAACjB,EAAAA,OAAD,CACE,KAAMC,EAAAA,SACN,SAAS,UACT,YACE+E,EAAO,CACL,WAAY,CACV,GAAGzC,EAAM,WACT,CACE,YAAa,GACb,IAAK,GACL,MAAO,GACP,SAAU,GACV,KAAM,QACR,CACF,CACF,CAAC,EAEH,QAAQ,cACT,SAAA,MAEO,CAAA,CACL,CAAA,CAEJ,GACA,CAAA,CAEX,CAEA,SAASsB,EACP,EACA,EACe,CACf,MAAO,CACL,WAAYH,EAAS,WACrB,YAAaA,EAAS,aAAe,GACrC,WAAYkC,IAAS,OAASlC,EAAS,GAAK,KAC5C,QAAS,CAAC,EACV,IAAKA,EAAS,IACd,MAAOA,EAAS,MAChB,OAAQA,EAAS,OACjB,OACA,YAAaA,EAAS,IACtB,WAAYA,EAAS,WAAW,IAAK,IAAe,CAClD,YAAaQ,EAAU,aAAe,GACtC,IAAKA,EAAU,IACf,MAAOA,EAAU,MACjB,SAAUA,EAAU,SACpB,KAAMA,EAAU,IAClB,EAAE,EAEF,eAAgB0B,IAAS,UACzB,cAAe,GACf,UAAWlC,EAAS,UAAY,OAAOA,EAAS,SAAS,EAAI,GAC7D,IAAKA,EAAS,IACd,QAAS,OACPkC,IAAS,UAAYlC,EAAS,QAAU,EAAIA,EAAS,OACvD,CACF,CACF,CAEA,SAASI,EACP,EACA,EACQ,CACR,GAAI+B,EAAO,GACT,MAAO,WAAWnC,EAAS,MAAM,WAAWmC,EAAO,QAAU,GAAG,GAGlE,MAAU,MACR,WAAWnC,EAAS,MAAM,GAAGmC,EAAO,OAAS,WAAWA,EAAO,SAAW,GAAG,GAAGA,EAAO,WAAa,OAAO,GAAGA,EAAO,YAAc,IAAIA,EAAO,cAAgB,IAChK,CACF,CAEA,SAASvB,EAAgB,EAA+B,CACtD,GAAI/B,EAAM,OAAS,OACjB,MAAO,GAGT,IAAMuD,EAAU,GAAwB,CACtC,GAAI,CACF,OAAO,IAAI,IAAIC,EAAI,KAAK,CAAC,CAAC,CAAC,MAC7B,MAAQ,CACN,OAAOA,EAAI,KAAK,CAClB,CACF,EAEA,OAAOD,EAAOvD,EAAM,GAAG,IAAMuD,EAAOvD,EAAM,WAAW,CACvD,CAEA,SAASoD,EAAkB,EAA+C,CACxE,OAAOlE,EAAuB,KAAM,GAAWiE,EAAO,KAAOM,CAAE,EAC1DA,EACD,QACN,CAEA,SAAS1C,EAAiB,EAAwB,CAChD,GAAI,EAAEnB,aAAiB,OACrB,MAAO,SAGT,IAAM8D,EAAU9D,EAAM,QAkBtB,OAhBI8D,EAAQ,SAAS,kCAAkC,EAC9C,oBAGLA,EAAQ,SAAS,wCAAwC,EACpD,2BAGLA,EAAQ,SAAS,4CAA4C,EACxD,uBAGLA,EAAQ,SAAS,oCAAoC,EAChD,uCAGFA,CACT"}