@hotmeshio/long-tail 0.1.13 → 0.1.14

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 (260) hide show
  1. package/build/api/files.d.ts +13 -0
  2. package/build/api/files.js +44 -0
  3. package/build/api/mcp-runs.d.ts +2 -0
  4. package/build/api/mcp-runs.js +2 -0
  5. package/build/api/workflow-sets.d.ts +11 -0
  6. package/build/api/workflow-sets.js +62 -0
  7. package/build/api/yaml-workflows.d.ts +9 -0
  8. package/build/api/yaml-workflows.js +40 -11
  9. package/build/lib/storage/local.d.ts +15 -0
  10. package/build/lib/storage/local.js +63 -0
  11. package/build/lib/storage/mime.d.ts +4 -0
  12. package/build/lib/storage/mime.js +31 -0
  13. package/build/lib/storage/s3.d.ts +16 -0
  14. package/build/lib/storage/s3.js +70 -0
  15. package/build/lib/storage/types.d.ts +18 -0
  16. package/build/modules/utils.d.ts +73 -0
  17. package/build/modules/utils.js +84 -0
  18. package/build/routes/file-browser.d.ts +2 -0
  19. package/build/routes/file-browser.js +112 -0
  20. package/build/routes/files.js +25 -17
  21. package/build/routes/index.js +2 -0
  22. package/build/routes/mcp-runs.js +2 -0
  23. package/build/routes/workflow-sets.js +9 -0
  24. package/build/routes/yaml-workflows/deployment.js +8 -0
  25. package/build/services/insight/index.d.ts +13 -0
  26. package/build/services/insight/index.js +4 -7
  27. package/build/services/insight/prompts.d.ts +1 -1
  28. package/build/services/insight/prompts.js +1 -1
  29. package/build/services/mcp-runs/queries.d.ts +2 -0
  30. package/build/services/mcp-runs/queries.js +11 -1
  31. package/build/services/mcp-runs/sql.d.ts +1 -1
  32. package/build/services/mcp-runs/sql.js +2 -2
  33. package/build/services/workflow-sets/db.d.ts +1 -0
  34. package/build/services/workflow-sets/db.js +6 -0
  35. package/build/services/workflow-sets/index.d.ts +1 -1
  36. package/build/services/workflow-sets/index.js +2 -1
  37. package/build/services/workflow-sets/sql.d.ts +1 -0
  38. package/build/services/workflow-sets/sql.js +6 -1
  39. package/build/services/yaml-workflow/db.d.ts +12 -0
  40. package/build/services/yaml-workflow/db.js +18 -0
  41. package/build/services/yaml-workflow/generator.js +4 -4
  42. package/build/services/yaml-workflow/pipeline/build/index.d.ts +2 -1
  43. package/build/services/yaml-workflow/pipeline/build/index.js +3 -2
  44. package/build/services/yaml-workflow/pipeline/build/utils.d.ts +0 -2
  45. package/build/services/yaml-workflow/pipeline/build/utils.js +0 -8
  46. package/build/services/yaml-workflow/sql.d.ts +2 -1
  47. package/build/services/yaml-workflow/sql.js +10 -3
  48. package/build/system/activities/schema-exchange.d.ts +50 -0
  49. package/build/system/activities/schema-exchange.js +210 -0
  50. package/build/system/activities/sql.d.ts +1 -1
  51. package/build/system/activities/sql.js +12 -1
  52. package/build/system/index.js +1 -0
  53. package/build/system/mcp-servers/knowledge.js +35 -6
  54. package/build/system/mcp-servers/schema-exchange.d.ts +4 -0
  55. package/build/system/mcp-servers/schema-exchange.js +93 -0
  56. package/build/system/seed/server-definitions.d.ts +112 -1
  57. package/build/system/seed/server-definitions.js +37 -0
  58. package/build/system/seed/tool-manifests-data.d.ts +87 -0
  59. package/build/system/seed/tool-manifests-data.js +37 -1
  60. package/build/system/seed/tool-manifests-knowledge.d.ts +9 -1
  61. package/build/system/seed/tool-manifests-knowledge.js +6 -5
  62. package/build/system/workflows/mcp-workflow-builder/prompts.d.ts +1 -1
  63. package/build/system/workflows/mcp-workflow-builder/prompts.js +21 -20
  64. package/build/system/workflows/mcp-workflow-planner/activities/persist.d.ts +1 -1
  65. package/build/system/workflows/mcp-workflow-planner/activities/persist.js +3 -3
  66. package/build/system/workflows/mcp-workflow-planner/index.js +39 -5
  67. package/build/system/workflows/mcp-workflow-planner/prompts.d.ts +1 -1
  68. package/build/system/workflows/mcp-workflow-planner/prompts.js +3 -3
  69. package/build/tsconfig.tsbuildinfo +1 -1
  70. package/dashboard/dist/assets/{AdminDashboard-DUrSBQOl.js → AdminDashboard-Cngijp4Q.js} +2 -2
  71. package/dashboard/dist/assets/{AdminDashboard-DUrSBQOl.js.map → AdminDashboard-Cngijp4Q.js.map} +1 -1
  72. package/dashboard/dist/assets/{AvailableEscalationsPage-Dbd1qUK_.js → AvailableEscalationsPage-CpBfGV1h.js} +2 -2
  73. package/dashboard/dist/assets/{AvailableEscalationsPage-Dbd1qUK_.js.map → AvailableEscalationsPage-CpBfGV1h.js.map} +1 -1
  74. package/dashboard/dist/assets/{BotPicker-Cg5iNEkm.js → BotPicker-B8Uvw9Si.js} +2 -2
  75. package/dashboard/dist/assets/{BotPicker-Cg5iNEkm.js.map → BotPicker-B8Uvw9Si.js.map} +1 -1
  76. package/dashboard/dist/assets/{CollapsibleSection-Kd9UIyeU.js → CollapsibleSection-DiFPuWOY.js} +2 -2
  77. package/dashboard/dist/assets/{CollapsibleSection-Kd9UIyeU.js.map → CollapsibleSection-DiFPuWOY.js.map} +1 -1
  78. package/dashboard/dist/assets/{ConfirmDeleteModal-DZMgmlof.js → ConfirmDeleteModal-CpXG9uyu.js} +2 -2
  79. package/dashboard/dist/assets/{ConfirmDeleteModal-DZMgmlof.js.map → ConfirmDeleteModal-CpXG9uyu.js.map} +1 -1
  80. package/dashboard/dist/assets/{CopyableId-cPFTRm8q.js → CopyableId-DKsTR9lK.js} +2 -2
  81. package/dashboard/dist/assets/{CopyableId-cPFTRm8q.js.map → CopyableId-DKsTR9lK.js.map} +1 -1
  82. package/dashboard/dist/assets/CredentialsPage-DlS7Kf40.js +2 -0
  83. package/dashboard/dist/assets/{CredentialsPage-DJablIbs.js.map → CredentialsPage-DlS7Kf40.js.map} +1 -1
  84. package/dashboard/dist/assets/{CustomDurationPicker-NgIP6YDW.js → CustomDurationPicker-B-9eW3pm.js} +2 -2
  85. package/dashboard/dist/assets/{CustomDurationPicker-NgIP6YDW.js.map → CustomDurationPicker-B-9eW3pm.js.map} +1 -1
  86. package/dashboard/dist/assets/{DataTable-CTRhTAfT.js → DataTable-DkOokbtL.js} +2 -2
  87. package/dashboard/dist/assets/{DataTable-CTRhTAfT.js.map → DataTable-DkOokbtL.js.map} +1 -1
  88. package/dashboard/dist/assets/{ElapsedCell-HcSJ_MMs.js → ElapsedCell-DVtHqM-5.js} +2 -2
  89. package/dashboard/dist/assets/{ElapsedCell-HcSJ_MMs.js.map → ElapsedCell-DVtHqM-5.js.map} +1 -1
  90. package/dashboard/dist/assets/{EmptyState-joNbd4gg.js → EmptyState-C7KIMIbE.js} +2 -2
  91. package/dashboard/dist/assets/{EmptyState-joNbd4gg.js.map → EmptyState-C7KIMIbE.js.map} +1 -1
  92. package/dashboard/dist/assets/{EscalationsOverview-DpXDnQux.js → EscalationsOverview-BMKBlkPx.js} +2 -2
  93. package/dashboard/dist/assets/{EscalationsOverview-DpXDnQux.js.map → EscalationsOverview-BMKBlkPx.js.map} +1 -1
  94. package/dashboard/dist/assets/{EventTable-CYem3v8n.js → EventTable-BYZ5OVdQ.js} +2 -2
  95. package/dashboard/dist/assets/{EventTable-CYem3v8n.js.map → EventTable-BYZ5OVdQ.js.map} +1 -1
  96. package/dashboard/dist/assets/{FilterBar-BiO8SOzc.js → FilterBar-C5r3n6YO.js} +2 -2
  97. package/dashboard/dist/assets/{FilterBar-BiO8SOzc.js.map → FilterBar-C5r3n6YO.js.map} +1 -1
  98. package/dashboard/dist/assets/{ListToolbar-6yRDh2e9.js → ListToolbar-BGUajIsW.js} +2 -2
  99. package/dashboard/dist/assets/{ListToolbar-6yRDh2e9.js.map → ListToolbar-BGUajIsW.js.map} +1 -1
  100. package/dashboard/dist/assets/{McpOverview-CUgSxkQe.js → McpOverview-B_kJYHea.js} +2 -2
  101. package/dashboard/dist/assets/{McpOverview-CUgSxkQe.js.map → McpOverview-B_kJYHea.js.map} +1 -1
  102. package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js +5 -0
  103. package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js.map +1 -0
  104. package/dashboard/dist/assets/McpQueryPage-BgAq_bQg.js +2 -0
  105. package/dashboard/dist/assets/{McpQueryPage-lV6kfDG5.js.map → McpQueryPage-BgAq_bQg.js.map} +1 -1
  106. package/dashboard/dist/assets/McpRunDetailPage-B8c0OszR.js +2 -0
  107. package/dashboard/dist/assets/McpRunDetailPage-B8c0OszR.js.map +1 -0
  108. package/dashboard/dist/assets/McpRunsPage-BY8C6k78.js +2 -0
  109. package/dashboard/dist/assets/McpRunsPage-BY8C6k78.js.map +1 -0
  110. package/dashboard/dist/assets/{Modal-BuTvD0pz.js → Modal-E1yRnCeW.js} +2 -2
  111. package/dashboard/dist/assets/{Modal-BuTvD0pz.js.map → Modal-E1yRnCeW.js.map} +1 -1
  112. package/dashboard/dist/assets/OperatorDashboard-C8MSTzey.js +2 -0
  113. package/dashboard/dist/assets/{OperatorDashboard-C9SSV96T.js.map → OperatorDashboard-C8MSTzey.js.map} +1 -1
  114. package/dashboard/dist/assets/{PageHeader-BcTVF9ul.js → PageHeader-Cm5HBQF_.js} +2 -2
  115. package/dashboard/dist/assets/{PageHeader-BcTVF9ul.js.map → PageHeader-Cm5HBQF_.js.map} +1 -1
  116. package/dashboard/dist/assets/{PageHeaderWithStats-BI7JG5x6.js → PageHeaderWithStats-CNmWJFSN.js} +2 -2
  117. package/dashboard/dist/assets/{PageHeaderWithStats-BI7JG5x6.js.map → PageHeaderWithStats-CNmWJFSN.js.map} +1 -1
  118. package/dashboard/dist/assets/{PriorityBadge-DqVaOU65.js → PriorityBadge-HSI4RVhs.js} +2 -2
  119. package/dashboard/dist/assets/{PriorityBadge-DqVaOU65.js.map → PriorityBadge-HSI4RVhs.js.map} +1 -1
  120. package/dashboard/dist/assets/{ProcessDetailPage-hFMhf9qa.js → ProcessDetailPage-Dln8622H.js} +2 -2
  121. package/dashboard/dist/assets/{ProcessDetailPage-hFMhf9qa.js.map → ProcessDetailPage-Dln8622H.js.map} +1 -1
  122. package/dashboard/dist/assets/{ProcessesListPage-ByVoBCQ3.js → ProcessesListPage-bIsd9N_h.js} +2 -2
  123. package/dashboard/dist/assets/{ProcessesListPage-ByVoBCQ3.js.map → ProcessesListPage-bIsd9N_h.js.map} +1 -1
  124. package/dashboard/dist/assets/{RolePill-D9ZIkYiu.js → RolePill-BVUp2bF0.js} +2 -2
  125. package/dashboard/dist/assets/{RolePill-D9ZIkYiu.js.map → RolePill-BVUp2bF0.js.map} +1 -1
  126. package/dashboard/dist/assets/RolesPage-kH-Njt25.js +2 -0
  127. package/dashboard/dist/assets/{RolesPage-SMedMuqa.js.map → RolesPage-kH-Njt25.js.map} +1 -1
  128. package/dashboard/dist/assets/{RowActions-yDhwwDbU.js → RowActions-DbUJPfaW.js} +2 -2
  129. package/dashboard/dist/assets/{RowActions-yDhwwDbU.js.map → RowActions-DbUJPfaW.js.map} +1 -1
  130. package/dashboard/dist/assets/{StatCard-BrBnQFxh.js → StatCard-Bs3JbyAz.js} +2 -2
  131. package/dashboard/dist/assets/{StatCard-BrBnQFxh.js.map → StatCard-Bs3JbyAz.js.map} +1 -1
  132. package/dashboard/dist/assets/{StatusBadge-xgb-lZku.js → StatusBadge-CakDdsCw.js} +2 -2
  133. package/dashboard/dist/assets/{StatusBadge-xgb-lZku.js.map → StatusBadge-CakDdsCw.js.map} +1 -1
  134. package/dashboard/dist/assets/{StepIndicator-B9ps2SvM.js → StepIndicator-Cd_SG_yA.js} +2 -2
  135. package/dashboard/dist/assets/{StepIndicator-B9ps2SvM.js.map → StepIndicator-Cd_SG_yA.js.map} +1 -1
  136. package/dashboard/dist/assets/{StickyPagination-DTIjBKN3.js → StickyPagination-Bz0C18nC.js} +2 -2
  137. package/dashboard/dist/assets/{StickyPagination-DTIjBKN3.js.map → StickyPagination-Bz0C18nC.js.map} +1 -1
  138. package/dashboard/dist/assets/{SwimlaneTimeline-RK4Yu66z.js → SwimlaneTimeline-Cfe-xQRX.js} +2 -2
  139. package/dashboard/dist/assets/{SwimlaneTimeline-RK4Yu66z.js.map → SwimlaneTimeline-Cfe-xQRX.js.map} +1 -1
  140. package/dashboard/dist/assets/{TagInput-CdNUuqk4.js → TagInput-ClFhXG-U.js} +2 -2
  141. package/dashboard/dist/assets/{TagInput-CdNUuqk4.js.map → TagInput-ClFhXG-U.js.map} +1 -1
  142. package/dashboard/dist/assets/{TaskDetailPage-C-nzaNea.js → TaskDetailPage-SuMBdARt.js} +2 -2
  143. package/dashboard/dist/assets/{TaskDetailPage-C-nzaNea.js.map → TaskDetailPage-SuMBdARt.js.map} +1 -1
  144. package/dashboard/dist/assets/{TaskQueuePill-Lvr2-NzS.js → TaskQueuePill-lJR1JW_W.js} +2 -2
  145. package/dashboard/dist/assets/{TaskQueuePill-Lvr2-NzS.js.map → TaskQueuePill-lJR1JW_W.js.map} +1 -1
  146. package/dashboard/dist/assets/{TasksListPage-DSUmD84y.js → TasksListPage-Dkq1Vtbt.js} +2 -2
  147. package/dashboard/dist/assets/{TasksListPage-DSUmD84y.js.map → TasksListPage-Dkq1Vtbt.js.map} +1 -1
  148. package/dashboard/dist/assets/{TimeAgo-BZdLdrIh.js → TimeAgo-DgfDZ1pl.js} +2 -2
  149. package/dashboard/dist/assets/{TimeAgo-BZdLdrIh.js.map → TimeAgo-DgfDZ1pl.js.map} +1 -1
  150. package/dashboard/dist/assets/{TimestampCell-QX_0i5FK.js → TimestampCell-MpHZ1hMD.js} +2 -2
  151. package/dashboard/dist/assets/{TimestampCell-QX_0i5FK.js.map → TimestampCell-MpHZ1hMD.js.map} +1 -1
  152. package/dashboard/dist/assets/{UserName-DyZMXcBm.js → UserName-DqsosA4B.js} +2 -2
  153. package/dashboard/dist/assets/{UserName-DyZMXcBm.js.map → UserName-DqsosA4B.js.map} +1 -1
  154. package/dashboard/dist/assets/{WorkflowExecutionPage-DjVxfZaF.js → WorkflowExecutionPage-CVlg38C3.js} +2 -2
  155. package/dashboard/dist/assets/{WorkflowExecutionPage-DjVxfZaF.js.map → WorkflowExecutionPage-CVlg38C3.js.map} +1 -1
  156. package/dashboard/dist/assets/WorkflowPill-CRpZhjGR.js +2 -0
  157. package/dashboard/dist/assets/WorkflowPill-CRpZhjGR.js.map +1 -0
  158. package/dashboard/dist/assets/{WorkflowsDashboard-DZjuiFZ0.js → WorkflowsDashboard-Ugzbs8mV.js} +2 -2
  159. package/dashboard/dist/assets/{WorkflowsDashboard-DZjuiFZ0.js.map → WorkflowsDashboard-Ugzbs8mV.js.map} +1 -1
  160. package/dashboard/dist/assets/{WorkflowsOverview-CLnLRpOu.js → WorkflowsOverview-CIp_lTNl.js} +2 -2
  161. package/dashboard/dist/assets/{WorkflowsOverview-CLnLRpOu.js.map → WorkflowsOverview-CIp_lTNl.js.map} +1 -1
  162. package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js +2 -0
  163. package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js.map +1 -0
  164. package/dashboard/dist/assets/{bots-DIM6lBoY.js → bots-DPfUpVqI.js} +2 -2
  165. package/dashboard/dist/assets/{bots-DIM6lBoY.js.map → bots-DPfUpVqI.js.map} +1 -1
  166. package/dashboard/dist/assets/{escalation-JOTuOqjq.js → escalation-RrCDbMC3.js} +2 -2
  167. package/dashboard/dist/assets/{escalation-JOTuOqjq.js.map → escalation-RrCDbMC3.js.map} +1 -1
  168. package/dashboard/dist/assets/escalation-columns-CDGa9wsD.js +2 -0
  169. package/dashboard/dist/assets/{escalation-columns-Cyg58nkg.js.map → escalation-columns-CDGa9wsD.js.map} +1 -1
  170. package/dashboard/dist/assets/{helpers-B1BDxBZd.js → helpers-ZSKqdkdS.js} +2 -2
  171. package/dashboard/dist/assets/{helpers-B1BDxBZd.js.map → helpers-ZSKqdkdS.js.map} +1 -1
  172. package/dashboard/dist/assets/helpers-rMEcLwKs.js +2 -0
  173. package/dashboard/dist/assets/helpers-rMEcLwKs.js.map +1 -0
  174. package/dashboard/dist/assets/{index-DDYFpi4l.js → index-ABcJHHlN.js} +2 -2
  175. package/dashboard/dist/assets/{index-DDYFpi4l.js.map → index-ABcJHHlN.js.map} +1 -1
  176. package/dashboard/dist/assets/{index-D1wVX50Z.js → index-B91h_jZ0.js} +2 -2
  177. package/dashboard/dist/assets/{index-D1wVX50Z.js.map → index-B91h_jZ0.js.map} +1 -1
  178. package/dashboard/dist/assets/{index-BcR6PfpY.js → index-BbI2dzhJ.js} +2 -2
  179. package/dashboard/dist/assets/{index-BcR6PfpY.js.map → index-BbI2dzhJ.js.map} +1 -1
  180. package/dashboard/dist/assets/{index-BizfauqT.js → index-BmVCyB6C.js} +4 -4
  181. package/dashboard/dist/assets/{index-BizfauqT.js.map → index-BmVCyB6C.js.map} +1 -1
  182. package/dashboard/dist/assets/index-C1E5GTs9.js +2 -0
  183. package/dashboard/dist/assets/index-C1E5GTs9.js.map +1 -0
  184. package/dashboard/dist/assets/{index-Cf60K3x9.js → index-C90ZPzXk.js} +2 -2
  185. package/dashboard/dist/assets/{index-Cf60K3x9.js.map → index-C90ZPzXk.js.map} +1 -1
  186. package/dashboard/dist/assets/{index-BYZX9tOb.js → index-Cmgrk7PQ.js} +58 -58
  187. package/dashboard/dist/assets/index-Cmgrk7PQ.js.map +1 -0
  188. package/dashboard/dist/assets/{index-Ds0JoXS2.js → index-DNytWfSZ.js} +2 -2
  189. package/dashboard/dist/assets/{index-Ds0JoXS2.js.map → index-DNytWfSZ.js.map} +1 -1
  190. package/dashboard/dist/assets/index-DX6zxr6t.js +2 -0
  191. package/dashboard/dist/assets/{index-Cg5nfiYX.js.map → index-DX6zxr6t.js.map} +1 -1
  192. package/dashboard/dist/assets/index-DeX-ezqf.css +1 -0
  193. package/dashboard/dist/assets/index-K40Qw1tk.js +2 -0
  194. package/dashboard/dist/assets/{index-Di12t56M.js.map → index-K40Qw1tk.js.map} +1 -1
  195. package/dashboard/dist/assets/{index-BUK3qR-1.js → index-lCyNr5Xk.js} +2 -2
  196. package/dashboard/dist/assets/{index-BUK3qR-1.js.map → index-lCyNr5Xk.js.map} +1 -1
  197. package/dashboard/dist/assets/{mcp-B_xbczAt.js → mcp-CNE44TSp.js} +2 -2
  198. package/dashboard/dist/assets/{mcp-B_xbczAt.js.map → mcp-CNE44TSp.js.map} +1 -1
  199. package/dashboard/dist/assets/mcp-query-RQX0uN-5.js +2 -0
  200. package/dashboard/dist/assets/mcp-query-RQX0uN-5.js.map +1 -0
  201. package/dashboard/dist/assets/mcp-runs-0w40bdz-.js +2 -0
  202. package/dashboard/dist/assets/mcp-runs-0w40bdz-.js.map +1 -0
  203. package/dashboard/dist/assets/{namespaces-C3WtdO_9.js → namespaces-BbmdXuPp.js} +2 -2
  204. package/dashboard/dist/assets/{namespaces-C3WtdO_9.js.map → namespaces-BbmdXuPp.js.map} +1 -1
  205. package/dashboard/dist/assets/{roles-BDAsPpZG.js → roles-DoHYlhWH.js} +2 -2
  206. package/dashboard/dist/assets/{roles-BDAsPpZG.js.map → roles-DoHYlhWH.js.map} +1 -1
  207. package/dashboard/dist/assets/{settings-Ife_UwAp.js → settings-BAiJiCHS.js} +2 -2
  208. package/dashboard/dist/assets/{settings-Ife_UwAp.js.map → settings-BAiJiCHS.js.map} +1 -1
  209. package/dashboard/dist/assets/{tasks-BquNDHDI.js → tasks-CvroqHtm.js} +2 -2
  210. package/dashboard/dist/assets/{tasks-BquNDHDI.js.map → tasks-CvroqHtm.js.map} +1 -1
  211. package/dashboard/dist/assets/{useEventHooks-anv_B2Yy.js → useEventHooks-BHMbzR_y.js} +2 -2
  212. package/dashboard/dist/assets/{useEventHooks-anv_B2Yy.js.map → useEventHooks-BHMbzR_y.js.map} +1 -1
  213. package/dashboard/dist/assets/useFilterParams-CGRYFw_A.js +2 -0
  214. package/dashboard/dist/assets/useFilterParams-CGRYFw_A.js.map +1 -0
  215. package/dashboard/dist/assets/useYamlActivityEvents-D56KV14X.js +2 -0
  216. package/dashboard/dist/assets/useYamlActivityEvents-D56KV14X.js.map +1 -0
  217. package/dashboard/dist/assets/{users-CFcxB4v6.js → users-CxIMy_xw.js} +2 -2
  218. package/dashboard/dist/assets/{users-CFcxB4v6.js.map → users-CxIMy_xw.js.map} +1 -1
  219. package/dashboard/dist/assets/{vendor-icons-T4r2DSPD.js → vendor-icons-AFGxSeQS.js} +132 -82
  220. package/dashboard/dist/assets/vendor-icons-AFGxSeQS.js.map +1 -0
  221. package/dashboard/dist/assets/{workflows-CeRci9z3.js → workflows-yR9yais7.js} +2 -2
  222. package/dashboard/dist/assets/{workflows-CeRci9z3.js.map → workflows-yR9yais7.js.map} +1 -1
  223. package/dashboard/dist/assets/yaml-workflows-QVF2MZ0l.js +2 -0
  224. package/dashboard/dist/assets/yaml-workflows-QVF2MZ0l.js.map +1 -0
  225. package/dashboard/dist/index.html +3 -3
  226. package/docs/schema-exchange.md +173 -0
  227. package/docs/self-test.md +106 -0
  228. package/package.json +3 -1
  229. package/dashboard/dist/assets/CredentialsPage-DJablIbs.js +0 -2
  230. package/dashboard/dist/assets/McpQueryDetailPage-BWbinTM_.js +0 -5
  231. package/dashboard/dist/assets/McpQueryDetailPage-BWbinTM_.js.map +0 -1
  232. package/dashboard/dist/assets/McpQueryPage-lV6kfDG5.js +0 -2
  233. package/dashboard/dist/assets/McpRunDetailPage-D6gaxH3_.js +0 -2
  234. package/dashboard/dist/assets/McpRunDetailPage-D6gaxH3_.js.map +0 -1
  235. package/dashboard/dist/assets/McpRunsPage-DKvTklh9.js +0 -2
  236. package/dashboard/dist/assets/McpRunsPage-DKvTklh9.js.map +0 -1
  237. package/dashboard/dist/assets/OperatorDashboard-C9SSV96T.js +0 -2
  238. package/dashboard/dist/assets/RolesPage-SMedMuqa.js +0 -2
  239. package/dashboard/dist/assets/WorkflowPill-CZqGslD6.js +0 -2
  240. package/dashboard/dist/assets/WorkflowPill-CZqGslD6.js.map +0 -1
  241. package/dashboard/dist/assets/YamlWorkflowsPage-VjdhnLmO.js +0 -2
  242. package/dashboard/dist/assets/YamlWorkflowsPage-VjdhnLmO.js.map +0 -1
  243. package/dashboard/dist/assets/escalation-columns-Cyg58nkg.js +0 -2
  244. package/dashboard/dist/assets/helpers-BCix9c_m.js +0 -2
  245. package/dashboard/dist/assets/helpers-BCix9c_m.js.map +0 -1
  246. package/dashboard/dist/assets/index-BYZX9tOb.js.map +0 -1
  247. package/dashboard/dist/assets/index-Cg5nfiYX.js +0 -2
  248. package/dashboard/dist/assets/index-DcIKW-cZ.css +0 -1
  249. package/dashboard/dist/assets/index-Di12t56M.js +0 -2
  250. package/dashboard/dist/assets/mcp-query-B8-P_QoG.js +0 -2
  251. package/dashboard/dist/assets/mcp-query-B8-P_QoG.js.map +0 -1
  252. package/dashboard/dist/assets/mcp-runs-CWeZinoF.js +0 -2
  253. package/dashboard/dist/assets/mcp-runs-CWeZinoF.js.map +0 -1
  254. package/dashboard/dist/assets/useFilterParams-BUyLHcx_.js +0 -2
  255. package/dashboard/dist/assets/useFilterParams-BUyLHcx_.js.map +0 -1
  256. package/dashboard/dist/assets/useYamlActivityEvents-DN-PTgVx.js +0 -2
  257. package/dashboard/dist/assets/useYamlActivityEvents-DN-PTgVx.js.map +0 -1
  258. package/dashboard/dist/assets/vendor-icons-T4r2DSPD.js.map +0 -1
  259. package/dashboard/dist/assets/yaml-workflows-DLwd2BOX.js +0 -2
  260. package/dashboard/dist/assets/yaml-workflows-DLwd2BOX.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{j as s}from"./index-BYZX9tOb.js";import{u as N}from"./tasks-BquNDHDI.js";import{u as h}from"./workflows-CeRci9z3.js";import{u as P}from"./useEventHooks-anv_B2Yy.js";import{u as x}from"./useFilterParams-BUyLHcx_.js";import{a as n}from"./vendor-query-DLp59M9_.js";import{D as v}from"./DataTable-CTRhTAfT.js";import{T as p}from"./TimestampCell-QX_0i5FK.js";import{S as w}from"./StickyPagination-DTIjBKN3.js";import{F as k,a as y,b as m}from"./FilterBar-BiO8SOzc.js";import{P as D}from"./PageHeader-BcTVF9ul.js";import{L as E}from"./ListToolbar-6yRDh2e9.js";import{W as L}from"./WorkflowPill-CZqGslD6.js";import{c as _}from"./vendor-react-Co3Y8ikm.js";import"./vendor-icons-T4r2DSPD.js";import"./EmptyState-joNbd4gg.js";function j(e,a=300){const[i,t]=n.useState(e);return n.useEffect(()=>{const l=setTimeout(()=>t(e),a);return()=>clearTimeout(l)},[e,a]),i}const V=[{value:"active",label:"Active"},{value:"completed",label:"Completed"},{value:"escalated",label:"Escalated"}],S=[{key:"origin_id",label:"Origin",render:e=>s.jsxDEV("span",{className:"font-mono text-xs",title:e.origin_id,children:e.origin_id.length>40?`${e.origin_id.slice(0,40)}…`:e.origin_id},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:26,columnNumber:7},void 0)},{key:"workflow_types",label:"Workflows",render:e=>s.jsxDEV("div",{className:"flex flex-wrap gap-1",children:e.workflow_types.map(a=>s.jsxDEV(L,{type:a},a,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:37,columnNumber:11},void 0))},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:35,columnNumber:7},void 0)},{key:"task_count",label:"Tasks",render:e=>s.jsxDEV("span",{children:e.task_count},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:45,columnNumber:22},void 0),className:"w-20 text-right"},{key:"completed",label:"Completed",render:e=>e.completed>0?s.jsxDEV("span",{className:"text-status-success",children:e.completed},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:53,columnNumber:11},void 0):s.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:54,columnNumber:11},void 0),className:"w-24 text-right"},{key:"escalated",label:"Escalated",render:e=>e.escalated>0?s.jsxDEV("span",{className:"text-status-error",children:e.escalated},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:62,columnNumber:11},void 0):s.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:63,columnNumber:11},void 0),className:"w-24 text-right"},{key:"started_at",label:"Started",render:e=>s.jsxDEV(p,{date:e.started_at},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:69,columnNumber:22},void 0),className:"w-44"},{key:"last_activity",label:"Last Activity",render:e=>s.jsxDEV(p,{date:e.last_activity},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:75,columnNumber:22},void 0),className:"w-44"}];function J(){P();const e=_(),{filters:a,setFilter:i,pagination:t}=x({filters:{workflow_type:"",status:"",search:""}}),l=j(a.search,300),{data:d}=h(),u=[...new Set((d??[]).map(r=>r.workflow_type))].sort(),{data:o,isLoading:f,refetch:g,isFetching:b}=N({workflow_type:a.workflow_type||void 0,status:a.status||void 0,search:l||void 0,limit:t.pageSize,offset:t.offset}),c=(o==null?void 0:o.total)??0;return s.jsxDEV("div",{children:[s.jsxDEV(D,{title:"All Processes"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:104,columnNumber:7},this),s.jsxDEV(k,{actions:s.jsxDEV(E,{onRefresh:()=>g(),isFetching:b,apiPath:`/tasks/processes?limit=${t.pageSize}&offset=${t.offset}${a.workflow_type?`&workflow_type=${a.workflow_type}`:""}${a.status?`&status=${a.status}`:""}${l?`&search=${l}`:""}`},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:107,columnNumber:9},this),children:[s.jsxDEV(y,{label:"Search",value:a.search,onChange:r=>i("search",r),placeholder:"origin, workflow, or trace ID"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:113,columnNumber:9},this),s.jsxDEV(m,{label:"Status",value:a.status,onChange:r=>i("status",r),options:V},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:119,columnNumber:9},this),s.jsxDEV(m,{label:"Workflow Type",value:a.workflow_type,onChange:r=>i("workflow_type",r),options:u.map(r=>({value:r,label:r}))},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:125,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:106,columnNumber:7},this),s.jsxDEV(v,{columns:S,data:(o==null?void 0:o.processes)??[],keyFn:r=>r.origin_id,onRowClick:r=>e(`/processes/detail/${encodeURIComponent(r.origin_id)}`),isLoading:f,emptyMessage:"No business processes found"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:133,columnNumber:7},this),s.jsxDEV(w,{page:t.page,totalPages:t.totalPages(c),onPageChange:t.setPage,total:c,pageSize:t.pageSize,onPageSizeChange:t.setPageSize},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:142,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:103,columnNumber:5},this)}export{J as ProcessesListPage};
2
- //# sourceMappingURL=ProcessesListPage-ByVoBCQ3.js.map
1
+ import{j as s}from"./index-Cmgrk7PQ.js";import{u as N}from"./tasks-CvroqHtm.js";import{u as h}from"./workflows-yR9yais7.js";import{u as P}from"./useEventHooks-BHMbzR_y.js";import{u as x}from"./useFilterParams-CGRYFw_A.js";import{a as n}from"./vendor-query-DLp59M9_.js";import{D as v}from"./DataTable-DkOokbtL.js";import{T as p}from"./TimestampCell-MpHZ1hMD.js";import{S as w}from"./StickyPagination-Bz0C18nC.js";import{F as k,a as y,b as m}from"./FilterBar-C5r3n6YO.js";import{P as D}from"./PageHeader-Cm5HBQF_.js";import{L as E}from"./ListToolbar-BGUajIsW.js";import{W as L}from"./WorkflowPill-CRpZhjGR.js";import{c as _}from"./vendor-react-Co3Y8ikm.js";import"./vendor-icons-AFGxSeQS.js";import"./EmptyState-C7KIMIbE.js";function j(e,a=300){const[i,t]=n.useState(e);return n.useEffect(()=>{const l=setTimeout(()=>t(e),a);return()=>clearTimeout(l)},[e,a]),i}const V=[{value:"active",label:"Active"},{value:"completed",label:"Completed"},{value:"escalated",label:"Escalated"}],S=[{key:"origin_id",label:"Origin",render:e=>s.jsxDEV("span",{className:"font-mono text-xs",title:e.origin_id,children:e.origin_id.length>40?`${e.origin_id.slice(0,40)}…`:e.origin_id},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:26,columnNumber:7},void 0)},{key:"workflow_types",label:"Workflows",render:e=>s.jsxDEV("div",{className:"flex flex-wrap gap-1",children:e.workflow_types.map(a=>s.jsxDEV(L,{type:a},a,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:37,columnNumber:11},void 0))},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:35,columnNumber:7},void 0)},{key:"task_count",label:"Tasks",render:e=>s.jsxDEV("span",{children:e.task_count},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:45,columnNumber:22},void 0),className:"w-20 text-right"},{key:"completed",label:"Completed",render:e=>e.completed>0?s.jsxDEV("span",{className:"text-status-success",children:e.completed},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:53,columnNumber:11},void 0):s.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:54,columnNumber:11},void 0),className:"w-24 text-right"},{key:"escalated",label:"Escalated",render:e=>e.escalated>0?s.jsxDEV("span",{className:"text-status-error",children:e.escalated},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:62,columnNumber:11},void 0):s.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:63,columnNumber:11},void 0),className:"w-24 text-right"},{key:"started_at",label:"Started",render:e=>s.jsxDEV(p,{date:e.started_at},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:69,columnNumber:22},void 0),className:"w-44"},{key:"last_activity",label:"Last Activity",render:e=>s.jsxDEV(p,{date:e.last_activity},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:75,columnNumber:22},void 0),className:"w-44"}];function J(){P();const e=_(),{filters:a,setFilter:i,pagination:t}=x({filters:{workflow_type:"",status:"",search:""}}),l=j(a.search,300),{data:d}=h(),u=[...new Set((d??[]).map(r=>r.workflow_type))].sort(),{data:o,isLoading:f,refetch:g,isFetching:b}=N({workflow_type:a.workflow_type||void 0,status:a.status||void 0,search:l||void 0,limit:t.pageSize,offset:t.offset}),c=(o==null?void 0:o.total)??0;return s.jsxDEV("div",{children:[s.jsxDEV(D,{title:"All Processes"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:104,columnNumber:7},this),s.jsxDEV(k,{actions:s.jsxDEV(E,{onRefresh:()=>g(),isFetching:b,apiPath:`/tasks/processes?limit=${t.pageSize}&offset=${t.offset}${a.workflow_type?`&workflow_type=${a.workflow_type}`:""}${a.status?`&status=${a.status}`:""}${l?`&search=${l}`:""}`},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:107,columnNumber:9},this),children:[s.jsxDEV(y,{label:"Search",value:a.search,onChange:r=>i("search",r),placeholder:"origin, workflow, or trace ID"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:113,columnNumber:9},this),s.jsxDEV(m,{label:"Status",value:a.status,onChange:r=>i("status",r),options:V},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:119,columnNumber:9},this),s.jsxDEV(m,{label:"Workflow Type",value:a.workflow_type,onChange:r=>i("workflow_type",r),options:u.map(r=>({value:r,label:r}))},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:125,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:106,columnNumber:7},this),s.jsxDEV(v,{columns:S,data:(o==null?void 0:o.processes)??[],keyFn:r=>r.origin_id,onRowClick:r=>e(`/processes/detail/${encodeURIComponent(r.origin_id)}`),isLoading:f,emptyMessage:"No business processes found"},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:133,columnNumber:7},this),s.jsxDEV(w,{page:t.page,totalPages:t.totalPages(c),onPageChange:t.setPage,total:c,pageSize:t.pageSize,onPageSizeChange:t.setPageSize},void 0,!1,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:142,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/processes/ProcessesListPage.tsx",lineNumber:103,columnNumber:5},this)}export{J as ProcessesListPage};
2
+ //# sourceMappingURL=ProcessesListPage-bIsd9N_h.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProcessesListPage-ByVoBCQ3.js","sources":["../../src/hooks/useDebouncedValue.ts","../../src/pages/processes/ProcessesListPage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\n\n/**\n * Returns a debounced copy of `value` that only updates\n * after `delay` ms of inactivity.\n */\nexport function useDebouncedValue<T>(value: T, delay = 300): T {\n const [debounced, setDebounced] = useState(value);\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n return debounced;\n}\n","import { useNavigate } from 'react-router-dom';\nimport { useProcesses, type ProcessSummary } from '../../api/tasks';\nimport { useWorkflowConfigs } from '../../api/workflows';\nimport { useProcessListEvents } from '../../hooks/useEventHooks';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useDebouncedValue } from '../../hooks/useDebouncedValue';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect, FilterInput } from '../../components/common/data/FilterBar';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\n\nconst STATUS_OPTIONS = [\n { value: 'active', label: 'Active' },\n { value: 'completed', label: 'Completed' },\n { value: 'escalated', label: 'Escalated' },\n];\n\nconst columns: Column<ProcessSummary>[] = [\n {\n key: 'origin_id',\n label: 'Origin',\n render: (row) => (\n <span className=\"font-mono text-xs\" title={row.origin_id}>\n {row.origin_id.length > 40 ? `${row.origin_id.slice(0, 40)}…` : row.origin_id}\n </span>\n ),\n },\n {\n key: 'workflow_types',\n label: 'Workflows',\n render: (row) => (\n <div className=\"flex flex-wrap gap-1\">\n {row.workflow_types.map((wt) => (\n <WorkflowPill key={wt} type={wt} />\n ))}\n </div>\n ),\n },\n {\n key: 'task_count',\n label: 'Tasks',\n render: (row) => <span>{row.task_count}</span>,\n className: 'w-20 text-right',\n },\n {\n key: 'completed',\n label: 'Completed',\n render: (row) =>\n row.completed > 0\n ? <span className=\"text-status-success\">{row.completed}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-24 text-right',\n },\n {\n key: 'escalated',\n label: 'Escalated',\n render: (row) =>\n row.escalated > 0\n ? <span className=\"text-status-error\">{row.escalated}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-24 text-right',\n },\n {\n key: 'started_at',\n label: 'Started',\n render: (row) => <TimestampCell date={row.started_at} />,\n className: 'w-44',\n },\n {\n key: 'last_activity',\n label: 'Last Activity',\n render: (row) => <TimestampCell date={row.last_activity} />,\n className: 'w-44',\n },\n];\n\nexport function ProcessesListPage() {\n useProcessListEvents();\n const navigate = useNavigate();\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { workflow_type: '', status: '', search: '' },\n });\n\n const debouncedSearch = useDebouncedValue(filters.search, 300);\n\n const { data: configs } = useWorkflowConfigs();\n const workflowTypes = [...new Set((configs ?? []).map((c) => c.workflow_type))].sort();\n\n const { data, isLoading, refetch, isFetching } = useProcesses({\n workflow_type: filters.workflow_type || undefined,\n status: filters.status || undefined,\n search: debouncedSearch || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n\n return (\n <div>\n <PageHeader title=\"All Processes\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/tasks/processes?limit=${pagination.pageSize}&offset=${pagination.offset}${filters.workflow_type ? `&workflow_type=${filters.workflow_type}` : ''}${filters.status ? `&status=${filters.status}` : ''}${debouncedSearch ? `&search=${debouncedSearch}` : ''}`}\n />\n }>\n <FilterInput\n label=\"Search\"\n value={filters.search}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"origin, workflow, or trace ID\"\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n <FilterSelect\n label=\"Workflow Type\"\n value={filters.workflow_type}\n onChange={(v) => setFilter('workflow_type', v)}\n options={workflowTypes.map((t) => ({ value: t, label: t }))}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={data?.processes ?? []}\n keyFn={(row) => row.origin_id}\n onRowClick={(row) => navigate(`/processes/detail/${encodeURIComponent(row.origin_id)}`)}\n isLoading={isLoading}\n emptyMessage=\"No business processes found\"\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["useDebouncedValue","value","delay","debounced","setDebounced","useState","useEffect","timer","STATUS_OPTIONS","columns","row","jsxDEV","this","wt","WorkflowPill","TimestampCell","ProcessesListPage","useProcessListEvents","navigate","useNavigate","filters","setFilter","pagination","useFilterParams","debouncedSearch","configs","useWorkflowConfigs","workflowTypes","c","data","isLoading","refetch","isFetching","useProcesses","total","PageHeader","FilterBar","ListToolbar","FilterInput","v","FilterSelect","t","DataTable","StickyPagination"],"mappings":"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"}
1
+ {"version":3,"file":"ProcessesListPage-bIsd9N_h.js","sources":["../../src/hooks/useDebouncedValue.ts","../../src/pages/processes/ProcessesListPage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\n\n/**\n * Returns a debounced copy of `value` that only updates\n * after `delay` ms of inactivity.\n */\nexport function useDebouncedValue<T>(value: T, delay = 300): T {\n const [debounced, setDebounced] = useState(value);\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n return debounced;\n}\n","import { useNavigate } from 'react-router-dom';\nimport { useProcesses, type ProcessSummary } from '../../api/tasks';\nimport { useWorkflowConfigs } from '../../api/workflows';\nimport { useProcessListEvents } from '../../hooks/useEventHooks';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useDebouncedValue } from '../../hooks/useDebouncedValue';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect, FilterInput } from '../../components/common/data/FilterBar';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\n\nconst STATUS_OPTIONS = [\n { value: 'active', label: 'Active' },\n { value: 'completed', label: 'Completed' },\n { value: 'escalated', label: 'Escalated' },\n];\n\nconst columns: Column<ProcessSummary>[] = [\n {\n key: 'origin_id',\n label: 'Origin',\n render: (row) => (\n <span className=\"font-mono text-xs\" title={row.origin_id}>\n {row.origin_id.length > 40 ? `${row.origin_id.slice(0, 40)}…` : row.origin_id}\n </span>\n ),\n },\n {\n key: 'workflow_types',\n label: 'Workflows',\n render: (row) => (\n <div className=\"flex flex-wrap gap-1\">\n {row.workflow_types.map((wt) => (\n <WorkflowPill key={wt} type={wt} />\n ))}\n </div>\n ),\n },\n {\n key: 'task_count',\n label: 'Tasks',\n render: (row) => <span>{row.task_count}</span>,\n className: 'w-20 text-right',\n },\n {\n key: 'completed',\n label: 'Completed',\n render: (row) =>\n row.completed > 0\n ? <span className=\"text-status-success\">{row.completed}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-24 text-right',\n },\n {\n key: 'escalated',\n label: 'Escalated',\n render: (row) =>\n row.escalated > 0\n ? <span className=\"text-status-error\">{row.escalated}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-24 text-right',\n },\n {\n key: 'started_at',\n label: 'Started',\n render: (row) => <TimestampCell date={row.started_at} />,\n className: 'w-44',\n },\n {\n key: 'last_activity',\n label: 'Last Activity',\n render: (row) => <TimestampCell date={row.last_activity} />,\n className: 'w-44',\n },\n];\n\nexport function ProcessesListPage() {\n useProcessListEvents();\n const navigate = useNavigate();\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { workflow_type: '', status: '', search: '' },\n });\n\n const debouncedSearch = useDebouncedValue(filters.search, 300);\n\n const { data: configs } = useWorkflowConfigs();\n const workflowTypes = [...new Set((configs ?? []).map((c) => c.workflow_type))].sort();\n\n const { data, isLoading, refetch, isFetching } = useProcesses({\n workflow_type: filters.workflow_type || undefined,\n status: filters.status || undefined,\n search: debouncedSearch || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n\n return (\n <div>\n <PageHeader title=\"All Processes\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/tasks/processes?limit=${pagination.pageSize}&offset=${pagination.offset}${filters.workflow_type ? `&workflow_type=${filters.workflow_type}` : ''}${filters.status ? `&status=${filters.status}` : ''}${debouncedSearch ? `&search=${debouncedSearch}` : ''}`}\n />\n }>\n <FilterInput\n label=\"Search\"\n value={filters.search}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"origin, workflow, or trace ID\"\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n <FilterSelect\n label=\"Workflow Type\"\n value={filters.workflow_type}\n onChange={(v) => setFilter('workflow_type', v)}\n options={workflowTypes.map((t) => ({ value: t, label: t }))}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={data?.processes ?? []}\n keyFn={(row) => row.origin_id}\n onRowClick={(row) => navigate(`/processes/detail/${encodeURIComponent(row.origin_id)}`)}\n isLoading={isLoading}\n emptyMessage=\"No business processes found\"\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["useDebouncedValue","value","delay","debounced","setDebounced","useState","useEffect","timer","STATUS_OPTIONS","columns","row","jsxDEV","this","wt","WorkflowPill","TimestampCell","ProcessesListPage","useProcessListEvents","navigate","useNavigate","filters","setFilter","pagination","useFilterParams","debouncedSearch","configs","useWorkflowConfigs","workflowTypes","c","data","isLoading","refetch","isFetching","useProcesses","total","PageHeader","FilterBar","ListToolbar","FilterInput","v","FilterSelect","t","DataTable","StickyPagination"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as s}from"./index-BYZX9tOb.js";import{U as a}from"./vendor-icons-T4r2DSPD.js";function i({role:t,size:e="sm"}){const o=e==="md"?"px-2.5 py-0.5 text-[11px] gap-1.5":"px-2 py-0.5 text-[10px] gap-1",n=e==="md"?"w-3 h-3":"w-2.5 h-2.5";return s.jsxDEV("span",{className:`inline-flex items-center ${o} bg-accent/[0.06] text-text-secondary rounded-lg`,children:[s.jsxDEV(a,{className:`${n} shrink-0 text-accent/75`},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/RolePill.tsx",lineNumber:16,columnNumber:7},this),t]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/RolePill.tsx",lineNumber:15,columnNumber:5},this)}export{i as R};
2
- //# sourceMappingURL=RolePill-D9ZIkYiu.js.map
1
+ import{j as s}from"./index-Cmgrk7PQ.js";import{U as a}from"./vendor-icons-AFGxSeQS.js";function i({role:t,size:e="sm"}){const o=e==="md"?"px-2.5 py-0.5 text-[11px] gap-1.5":"px-2 py-0.5 text-[10px] gap-1",n=e==="md"?"w-3 h-3":"w-2.5 h-2.5";return s.jsxDEV("span",{className:`inline-flex items-center ${o} bg-accent/[0.06] text-text-secondary rounded-lg`,children:[s.jsxDEV(a,{className:`${n} shrink-0 text-accent/75`},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/RolePill.tsx",lineNumber:16,columnNumber:7},this),t]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/RolePill.tsx",lineNumber:15,columnNumber:5},this)}export{i as R};
2
+ //# sourceMappingURL=RolePill-BVUp2bF0.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RolePill-D9ZIkYiu.js","sources":["../../src/components/common/display/RolePill.tsx"],"sourcesContent":["import { User } from 'lucide-react';\n\ninterface RolePillProps {\n role: string;\n size?: 'sm' | 'md';\n}\n\nexport function RolePill({ role, size = 'sm' }: RolePillProps) {\n const sizeClass = size === 'md'\n ? 'px-2.5 py-0.5 text-[11px] gap-1.5'\n : 'px-2 py-0.5 text-[10px] gap-1';\n const iconClass = size === 'md' ? 'w-3 h-3' : 'w-2.5 h-2.5';\n\n return (\n <span className={`inline-flex items-center ${sizeClass} bg-accent/[0.06] text-text-secondary rounded-lg`}>\n <User className={`${iconClass} shrink-0 text-accent/75`} />\n {role}\n </span>\n );\n}\n"],"names":["RolePill","role","size","sizeClass","iconClass","jsxDEV","User"],"mappings":"uFAOO,SAASA,EAAS,CAAE,KAAAC,EAAM,KAAAC,EAAO,MAAuB,CAC7D,MAAMC,EAAYD,IAAS,KACvB,oCACA,gCACEE,EAAYF,IAAS,KAAO,UAAY,cAE9C,OACEG,EAAAA,OAAC,OAAA,CAAK,UAAW,4BAA4BF,CAAS,mDACpD,SAAA,CAAAE,SAACC,EAAA,CAAK,UAAW,GAAGF,CAAS,0BAAA,EAA7B,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAyD,EACxDH,CAAA,CAAA,EAFH,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAEJ"}
1
+ {"version":3,"file":"RolePill-BVUp2bF0.js","sources":["../../src/components/common/display/RolePill.tsx"],"sourcesContent":["import { User } from 'lucide-react';\n\ninterface RolePillProps {\n role: string;\n size?: 'sm' | 'md';\n}\n\nexport function RolePill({ role, size = 'sm' }: RolePillProps) {\n const sizeClass = size === 'md'\n ? 'px-2.5 py-0.5 text-[11px] gap-1.5'\n : 'px-2 py-0.5 text-[10px] gap-1';\n const iconClass = size === 'md' ? 'w-3 h-3' : 'w-2.5 h-2.5';\n\n return (\n <span className={`inline-flex items-center ${sizeClass} bg-accent/[0.06] text-text-secondary rounded-lg`}>\n <User className={`${iconClass} shrink-0 text-accent/75`} />\n {role}\n </span>\n );\n}\n"],"names":["RolePill","role","size","sizeClass","iconClass","jsxDEV","User"],"mappings":"uFAOO,SAASA,EAAS,CAAE,KAAAC,EAAM,KAAAC,EAAO,MAAuB,CAC7D,MAAMC,EAAYD,IAAS,KACvB,oCACA,gCACEE,EAAYF,IAAS,KAAO,UAAY,cAE9C,OACEG,EAAAA,OAAC,OAAA,CAAK,UAAW,4BAA4BF,CAAS,mDACpD,SAAA,CAAAE,SAACC,EAAA,CAAK,UAAW,GAAGF,CAAS,0BAAA,EAA7B,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAyD,EACxDH,CAAA,CAAA,EAFH,OAAA,GAAA,CAAA,SAAA,4DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./index-Cmgrk7PQ.js";import{a as n}from"./vendor-query-DLp59M9_.js";import{b,c as h,d as f,e as g,f as E,g as v}from"./roles-DoHYlhWH.js";import{D}from"./DataTable-DkOokbtL.js";import{C as j}from"./ConfirmDeleteModal-CpXG9uyu.js";import{P as V}from"./PageHeader-Cm5HBQF_.js";import{M as C}from"./Modal-E1yRnCeW.js";import{R}from"./RolePill-BVUp2bF0.js";import{R as P,a as y}from"./RowActions-DbUJPfaW.js";import{k}from"./vendor-icons-AFGxSeQS.js";import"./vendor-react-Co3Y8ikm.js";import"./EmptyState-C7KIMIbE.js";function w({open:s,onClose:r}){const l=b(),[i,c]=n.useState(""),[t,m]=n.useState(s);s!==t&&(m(s),s&&(c(""),l.reset()));const d=()=>{const o=i.trim().toLowerCase();o&&l.mutate(o,{onSuccess:r})};return e.jsxDEV(C,{open:s,onClose:r,title:"Create Role",children:e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Role Name (required)"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:34,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:i,onChange:o=>c(o.target.value),placeholder:"e.g., reviewer",className:"input text-xs w-full",onKeyDown:o=>{o.key==="Enter"&&d()}},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:37,columnNumber:11},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary mt-1",children:"Lowercase letters, numbers, hyphens, and underscores only."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:47,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:33,columnNumber:9},this),l.error&&e.jsxDEV("p",{className:"text-xs text-status-error",children:l.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:53,columnNumber:11},this),e.jsxDEV("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsxDEV("button",{onClick:r,className:"btn-secondary text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:57,columnNumber:11},this),e.jsxDEV("button",{onClick:d,disabled:!i.trim()||l.isPending,className:"btn-primary text-xs",children:l.isPending?"Creating...":"Create"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:60,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:56,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:32,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/CreateRoleModal.tsx",lineNumber:31,columnNumber:5},this)}function _({selectedRole:s,allRoles:r}){const{data:l}=h(),i=f(),c=g(),[t,m]=n.useState(""),d=(l==null?void 0:l.chains)??[],o=n.useMemo(()=>s?d.filter(a=>a.source_role===s).map(a=>a.target_role):[],[d,s]),u=n.useMemo(()=>s?r.filter(a=>a!==s&&a!=="superadmin"&&!o.includes(a)):[],[r,s,o]),p=()=>{!s||!t.trim()||i.mutate({source_role:s,target_role:t.trim()},{onSuccess:()=>m("")})},N=a=>{s&&c.mutate({source_role:s,target_role:a})},x=s==="superadmin";return e.jsxDEV("div",{className:"border-l border-surface-border pl-6 min-h-[300px]",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Escalation Routing"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:49,columnNumber:7},this),s?x?e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-sm font-mono text-text-primary mb-2",children:s},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:59,columnNumber:11},this),e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:"Superadmins can escalate to any role implicitly."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:60,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:58,columnNumber:9},this):e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-sm font-mono text-text-primary",children:s},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:67,columnNumber:13},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:"Can escalate to:"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:68,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:66,columnNumber:11},this),o.length===0?e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:"No escalation targets configured."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:72,columnNumber:13},this):e.jsxDEV("div",{className:"flex flex-wrap gap-2",children:o.map(a=>e.jsxDEV("span",{className:"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary font-mono",children:[a,e.jsxDEV("button",{onClick:()=>N(a),className:"text-text-tertiary hover:text-status-error transition-colors",title:`Remove ${a}`,children:"×"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:83,columnNumber:19},this)]},a,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:78,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:76,columnNumber:13},this),u.length>0&&e.jsxDEV("div",{className:"pt-3 border-t border-surface-border",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Add Target"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:97,columnNumber:15},this),e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("select",{value:t,onChange:a=>m(a.target.value),className:"select text-xs font-mono flex-1",children:[e.jsxDEV("option",{value:"",children:"Select a role..."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:106,columnNumber:19},this),u.map(a=>e.jsxDEV("option",{value:a,children:a},a,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:108,columnNumber:21},this))]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:101,columnNumber:17},this),e.jsxDEV("button",{onClick:p,disabled:!t||i.isPending,className:"btn-primary text-xs",children:i.isPending?"Adding...":"Add"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:111,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:100,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:96,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:65,columnNumber:9},this):e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:"Select a role to manage its escalation targets."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:54,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/EscalationPanel.tsx",lineNumber:48,columnNumber:5},this)}function M(s){return[{key:"role",label:"Role",render:r=>e.jsxDEV(R,{role:r.role},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleColumns.tsx",lineNumber:14,columnNumber:24},this)},{key:"user_count",label:"Users",render:r=>r.user_count>0?e.jsxDEV("span",{className:"text-text-primary",children:r.user_count},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleColumns.tsx",lineNumber:21,columnNumber:13},this):e.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleColumns.tsx",lineNumber:22,columnNumber:13},this),className:"w-24 text-right"},{key:"chain_count",label:"Escalations",render:r=>r.chain_count>0?e.jsxDEV("span",{className:"text-text-primary",children:r.chain_count},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleColumns.tsx",lineNumber:30,columnNumber:13},this):e.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleColumns.tsx",lineNumber:31,columnNumber:13},this),className:"w-28 text-right"},{key:"workflow_count",label:"Workflows",render:r=>r.workflow_count>0?e.jsxDEV("span",{className:"text-text-primary",children:r.workflow_count},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleColumns.tsx",lineNumber:39,columnNumber:13},this):e.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleColumns.tsx",lineNumber:40,columnNumber:13},this),className:"w-28 text-right"},{key:"actions",label:"",render:r=>r.user_count>0||r.chain_count>0||r.workflow_count>0?null:e.jsxDEV(P,{children:e.jsxDEV(y,{icon:k,title:"Delete role",onClick:()=>s(r),colorClass:"text-text-tertiary hover:text-status-error"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleColumns.tsx",lineNumber:51,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RoleColumns.tsx",lineNumber:50,columnNumber:11},this),className:"w-16 text-right"}]}function $(){const{data:s,isLoading:r}=E(),l=v(),[i,c]=n.useState(!1),[t,m]=n.useState(null),[d,o]=n.useState(null),u=(s==null?void 0:s.roles)??[],p=n.useMemo(()=>u.map(a=>a.role),[u]),N=M(a=>m(a)),x=()=>{t&&l.mutate(t.role,{onSuccess:()=>m(null)})};return e.jsxDEV("div",{children:[e.jsxDEV(V,{title:"Roles",actions:e.jsxDEV("button",{onClick:()=>c(!0),className:"btn-primary text-xs",children:"Add Role"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:35,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:32,columnNumber:7},this),e.jsxDEV("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6",children:[e.jsxDEV("div",{children:e.jsxDEV(D,{columns:N,data:u,keyFn:a=>a.role,isLoading:r,emptyMessage:"No roles found",onRowClick:a=>o(a.role),activeRowKey:d},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:43,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:42,columnNumber:9},this),e.jsxDEV(_,{selectedRole:d,allRoles:p},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:54,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:41,columnNumber:7},this),e.jsxDEV(w,{open:i,onClose:()=>c(!1)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:57,columnNumber:7},this),e.jsxDEV(j,{open:!!t,onClose:()=>m(null),onConfirm:x,title:"Delete Role",description:e.jsxDEV(e.Fragment,{children:["Delete role"," ",e.jsxDEV("span",{className:"font-medium font-mono text-text-primary",children:t==null?void 0:t.role},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:67,columnNumber:13},this),"? This action cannot be undone."]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:65,columnNumber:11},this),isPending:l.isPending,error:l.error},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:59,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/roles/RolesPage.tsx",lineNumber:31,columnNumber:5},this)}export{$ as RolesPage};
2
+ //# sourceMappingURL=RolesPage-kH-Njt25.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RolesPage-SMedMuqa.js","sources":["../../src/pages/admin/roles/CreateRoleModal.tsx","../../src/pages/admin/roles/EscalationPanel.tsx","../../src/pages/admin/roles/RoleColumns.tsx","../../src/pages/admin/roles/RolesPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useCreateRole } from '../../../api/roles';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateRoleModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createRole = useCreateRole();\n const [roleName, setRoleName] = useState('');\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) {\n setRoleName('');\n createRole.reset();\n }\n }\n\n const handleCreate = () => {\n const trimmed = roleName.trim().toLowerCase();\n if (!trimmed) return;\n createRole.mutate(trimmed, { onSuccess: onClose });\n };\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Role\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Role Name (required)\n </label>\n <input\n type=\"text\"\n value={roleName}\n onChange={(e) => setRoleName(e.target.value)}\n placeholder=\"e.g., reviewer\"\n className=\"input text-xs w-full\"\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleCreate();\n }}\n />\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n Lowercase letters, numbers, hyphens, and underscores only.\n </p>\n </div>\n\n {createRole.error && (\n <p className=\"text-xs text-status-error\">{(createRole.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!roleName.trim() || createRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {createRole.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useMemo } from 'react';\nimport {\n useEscalationChains,\n useAddEscalationChain,\n useRemoveEscalationChain,\n} from '../../../api/roles';\n\nexport function EscalationPanel({\n selectedRole,\n allRoles,\n}: {\n selectedRole: string | null;\n allRoles: string[];\n}) {\n const { data: chainsData } = useEscalationChains();\n const addChain = useAddEscalationChain();\n const removeChain = useRemoveEscalationChain();\n const [newTarget, setNewTarget] = useState('');\n\n const chains = chainsData?.chains ?? [];\n\n const targets = useMemo(() => {\n if (!selectedRole) return [];\n return chains.filter((c) => c.source_role === selectedRole).map((c) => c.target_role);\n }, [chains, selectedRole]);\n\n const available = useMemo(() => {\n if (!selectedRole) return [];\n return allRoles.filter((r) => r !== selectedRole && r !== 'superadmin' && !targets.includes(r));\n }, [allRoles, selectedRole, targets]);\n\n const handleAdd = () => {\n if (!selectedRole || !newTarget.trim()) return;\n addChain.mutate(\n { source_role: selectedRole, target_role: newTarget.trim() },\n { onSuccess: () => setNewTarget('') },\n );\n };\n\n const handleRemove = (target: string) => {\n if (!selectedRole) return;\n removeChain.mutate({ source_role: selectedRole, target_role: target });\n };\n\n const isSuperAdmin = selectedRole === 'superadmin';\n\n return (\n <div className=\"border-l border-surface-border pl-6 min-h-[300px]\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4\">\n Escalation Routing\n </p>\n\n {!selectedRole ? (\n <p className=\"text-xs text-text-tertiary\">\n Select a role to manage its escalation targets.\n </p>\n ) : isSuperAdmin ? (\n <div>\n <p className=\"text-sm font-mono text-text-primary mb-2\">{selectedRole}</p>\n <p className=\"text-xs text-text-tertiary\">\n Superadmins can escalate to any role implicitly.\n </p>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-sm font-mono text-text-primary\">{selectedRole}</p>\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">Can escalate to:</p>\n </div>\n\n {targets.length === 0 ? (\n <p className=\"text-xs text-text-tertiary\">\n No escalation targets configured.\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-2\">\n {targets.map((target) => (\n <span\n key={target}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary font-mono\"\n >\n {target}\n <button\n onClick={() => handleRemove(target)}\n className=\"text-text-tertiary hover:text-status-error transition-colors\"\n title={`Remove ${target}`}\n >\n &times;\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"pt-3 border-t border-surface-border\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n Add Target\n </p>\n <div className=\"flex items-center gap-2\">\n <select\n value={newTarget}\n onChange={(e) => setNewTarget(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <button\n onClick={handleAdd}\n disabled={!newTarget || addChain.isPending}\n className=\"btn-primary text-xs\"\n >\n {addChain.isPending ? 'Adding...' : 'Add'}\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { Trash2 } from 'lucide-react';\nimport { type RoleDetail } from '../../../api/roles';\nimport { type Column } from '../../../components/common/data/DataTable';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\n\nexport function getRoleColumns(\n onDelete: (row: RoleDetail) => void,\n): Column<RoleDetail>[] {\n return [\n {\n key: 'role',\n label: 'Role',\n render: (row) => <RolePill role={row.role} />,\n },\n {\n key: 'user_count',\n label: 'Users',\n render: (row) =>\n row.user_count > 0\n ? <span className=\"text-text-primary\">{row.user_count}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-24 text-right',\n },\n {\n key: 'chain_count',\n label: 'Escalations',\n render: (row) =>\n row.chain_count > 0\n ? <span className=\"text-text-primary\">{row.chain_count}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-28 text-right',\n },\n {\n key: 'workflow_count',\n label: 'Workflows',\n render: (row) =>\n row.workflow_count > 0\n ? <span className=\"text-text-primary\">{row.workflow_count}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-28 text-right',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => {\n const inUse = row.user_count > 0 || row.chain_count > 0 || row.workflow_count > 0;\n if (inUse) return null;\n return (\n <RowActionGroup>\n <RowAction\n icon={Trash2}\n title=\"Delete role\"\n onClick={() => onDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n );\n },\n className: 'w-16 text-right',\n },\n ];\n}\n","import { useState, useMemo } from 'react';\nimport { useRoleDetails, useDeleteRole, type RoleDetail } from '../../../api/roles';\nimport { DataTable } from '../../../components/common/data/DataTable';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { CreateRoleModal } from './CreateRoleModal';\nimport { EscalationPanel } from './EscalationPanel';\nimport { getRoleColumns } from './RoleColumns';\n\nexport function RolesPage() {\n const { data, isLoading } = useRoleDetails();\n const deleteRole = useDeleteRole();\n\n const [showCreate, setShowCreate] = useState(false);\n const [confirmDelete, setConfirmDelete] = useState<RoleDetail | null>(null);\n const [selectedRole, setSelectedRole] = useState<string | null>(null);\n\n const roles = data?.roles ?? [];\n const allRoleNames = useMemo(() => roles.map((r) => r.role), [roles]);\n\n const columns = getRoleColumns((row) => setConfirmDelete(row));\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteRole.mutate(confirmDelete.role, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n return (\n <div>\n <PageHeader\n title=\"Roles\"\n actions={\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Role\n </button>\n }\n />\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6\">\n <div>\n <DataTable\n columns={columns}\n data={roles}\n keyFn={(row) => row.role}\n isLoading={isLoading}\n emptyMessage=\"No roles found\"\n onRowClick={(row) => setSelectedRole(row.role)}\n activeRowKey={selectedRole}\n />\n </div>\n\n <EscalationPanel selectedRole={selectedRole} allRoles={allRoleNames} />\n </div>\n\n <CreateRoleModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete Role\"\n description={\n <>\n Delete role{' '}\n <span className=\"font-medium font-mono text-text-primary\">\n {confirmDelete?.role}\n </span>\n ? This action cannot be undone.\n </>\n }\n isPending={deleteRole.isPending}\n error={deleteRole.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["CreateRoleModal","open","onClose","createRole","useCreateRole","roleName","setRoleName","useState","prevOpen","setPrevOpen","handleCreate","trimmed","jsxDEV","Modal","e","EscalationPanel","selectedRole","allRoles","chainsData","useEscalationChains","addChain","useAddEscalationChain","removeChain","useRemoveEscalationChain","newTarget","setNewTarget","chains","targets","useMemo","c","available","r","handleAdd","handleRemove","target","isSuperAdmin","getRoleColumns","onDelete","row","RolePill","RowActionGroup","RowAction","Trash2","RolesPage","data","isLoading","useRoleDetails","deleteRole","useDeleteRole","showCreate","setShowCreate","confirmDelete","setConfirmDelete","setSelectedRole","roles","allRoleNames","columns","handleDelete","PageHeader","DataTable","ConfirmDeleteModal","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"RolesPage-kH-Njt25.js","sources":["../../src/pages/admin/roles/CreateRoleModal.tsx","../../src/pages/admin/roles/EscalationPanel.tsx","../../src/pages/admin/roles/RoleColumns.tsx","../../src/pages/admin/roles/RolesPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useCreateRole } from '../../../api/roles';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateRoleModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createRole = useCreateRole();\n const [roleName, setRoleName] = useState('');\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) {\n setRoleName('');\n createRole.reset();\n }\n }\n\n const handleCreate = () => {\n const trimmed = roleName.trim().toLowerCase();\n if (!trimmed) return;\n createRole.mutate(trimmed, { onSuccess: onClose });\n };\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Role\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Role Name (required)\n </label>\n <input\n type=\"text\"\n value={roleName}\n onChange={(e) => setRoleName(e.target.value)}\n placeholder=\"e.g., reviewer\"\n className=\"input text-xs w-full\"\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleCreate();\n }}\n />\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n Lowercase letters, numbers, hyphens, and underscores only.\n </p>\n </div>\n\n {createRole.error && (\n <p className=\"text-xs text-status-error\">{(createRole.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!roleName.trim() || createRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {createRole.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useMemo } from 'react';\nimport {\n useEscalationChains,\n useAddEscalationChain,\n useRemoveEscalationChain,\n} from '../../../api/roles';\n\nexport function EscalationPanel({\n selectedRole,\n allRoles,\n}: {\n selectedRole: string | null;\n allRoles: string[];\n}) {\n const { data: chainsData } = useEscalationChains();\n const addChain = useAddEscalationChain();\n const removeChain = useRemoveEscalationChain();\n const [newTarget, setNewTarget] = useState('');\n\n const chains = chainsData?.chains ?? [];\n\n const targets = useMemo(() => {\n if (!selectedRole) return [];\n return chains.filter((c) => c.source_role === selectedRole).map((c) => c.target_role);\n }, [chains, selectedRole]);\n\n const available = useMemo(() => {\n if (!selectedRole) return [];\n return allRoles.filter((r) => r !== selectedRole && r !== 'superadmin' && !targets.includes(r));\n }, [allRoles, selectedRole, targets]);\n\n const handleAdd = () => {\n if (!selectedRole || !newTarget.trim()) return;\n addChain.mutate(\n { source_role: selectedRole, target_role: newTarget.trim() },\n { onSuccess: () => setNewTarget('') },\n );\n };\n\n const handleRemove = (target: string) => {\n if (!selectedRole) return;\n removeChain.mutate({ source_role: selectedRole, target_role: target });\n };\n\n const isSuperAdmin = selectedRole === 'superadmin';\n\n return (\n <div className=\"border-l border-surface-border pl-6 min-h-[300px]\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4\">\n Escalation Routing\n </p>\n\n {!selectedRole ? (\n <p className=\"text-xs text-text-tertiary\">\n Select a role to manage its escalation targets.\n </p>\n ) : isSuperAdmin ? (\n <div>\n <p className=\"text-sm font-mono text-text-primary mb-2\">{selectedRole}</p>\n <p className=\"text-xs text-text-tertiary\">\n Superadmins can escalate to any role implicitly.\n </p>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-sm font-mono text-text-primary\">{selectedRole}</p>\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">Can escalate to:</p>\n </div>\n\n {targets.length === 0 ? (\n <p className=\"text-xs text-text-tertiary\">\n No escalation targets configured.\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-2\">\n {targets.map((target) => (\n <span\n key={target}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary font-mono\"\n >\n {target}\n <button\n onClick={() => handleRemove(target)}\n className=\"text-text-tertiary hover:text-status-error transition-colors\"\n title={`Remove ${target}`}\n >\n &times;\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"pt-3 border-t border-surface-border\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n Add Target\n </p>\n <div className=\"flex items-center gap-2\">\n <select\n value={newTarget}\n onChange={(e) => setNewTarget(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <button\n onClick={handleAdd}\n disabled={!newTarget || addChain.isPending}\n className=\"btn-primary text-xs\"\n >\n {addChain.isPending ? 'Adding...' : 'Add'}\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { Trash2 } from 'lucide-react';\nimport { type RoleDetail } from '../../../api/roles';\nimport { type Column } from '../../../components/common/data/DataTable';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\n\nexport function getRoleColumns(\n onDelete: (row: RoleDetail) => void,\n): Column<RoleDetail>[] {\n return [\n {\n key: 'role',\n label: 'Role',\n render: (row) => <RolePill role={row.role} />,\n },\n {\n key: 'user_count',\n label: 'Users',\n render: (row) =>\n row.user_count > 0\n ? <span className=\"text-text-primary\">{row.user_count}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-24 text-right',\n },\n {\n key: 'chain_count',\n label: 'Escalations',\n render: (row) =>\n row.chain_count > 0\n ? <span className=\"text-text-primary\">{row.chain_count}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-28 text-right',\n },\n {\n key: 'workflow_count',\n label: 'Workflows',\n render: (row) =>\n row.workflow_count > 0\n ? <span className=\"text-text-primary\">{row.workflow_count}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-28 text-right',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => {\n const inUse = row.user_count > 0 || row.chain_count > 0 || row.workflow_count > 0;\n if (inUse) return null;\n return (\n <RowActionGroup>\n <RowAction\n icon={Trash2}\n title=\"Delete role\"\n onClick={() => onDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n );\n },\n className: 'w-16 text-right',\n },\n ];\n}\n","import { useState, useMemo } from 'react';\nimport { useRoleDetails, useDeleteRole, type RoleDetail } from '../../../api/roles';\nimport { DataTable } from '../../../components/common/data/DataTable';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { CreateRoleModal } from './CreateRoleModal';\nimport { EscalationPanel } from './EscalationPanel';\nimport { getRoleColumns } from './RoleColumns';\n\nexport function RolesPage() {\n const { data, isLoading } = useRoleDetails();\n const deleteRole = useDeleteRole();\n\n const [showCreate, setShowCreate] = useState(false);\n const [confirmDelete, setConfirmDelete] = useState<RoleDetail | null>(null);\n const [selectedRole, setSelectedRole] = useState<string | null>(null);\n\n const roles = data?.roles ?? [];\n const allRoleNames = useMemo(() => roles.map((r) => r.role), [roles]);\n\n const columns = getRoleColumns((row) => setConfirmDelete(row));\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteRole.mutate(confirmDelete.role, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n return (\n <div>\n <PageHeader\n title=\"Roles\"\n actions={\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Role\n </button>\n }\n />\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6\">\n <div>\n <DataTable\n columns={columns}\n data={roles}\n keyFn={(row) => row.role}\n isLoading={isLoading}\n emptyMessage=\"No roles found\"\n onRowClick={(row) => setSelectedRole(row.role)}\n activeRowKey={selectedRole}\n />\n </div>\n\n <EscalationPanel selectedRole={selectedRole} allRoles={allRoleNames} />\n </div>\n\n <CreateRoleModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete Role\"\n description={\n <>\n Delete role{' '}\n <span className=\"font-medium font-mono text-text-primary\">\n {confirmDelete?.role}\n </span>\n ? This action cannot be undone.\n </>\n }\n isPending={deleteRole.isPending}\n error={deleteRole.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["CreateRoleModal","open","onClose","createRole","useCreateRole","roleName","setRoleName","useState","prevOpen","setPrevOpen","handleCreate","trimmed","jsxDEV","Modal","e","EscalationPanel","selectedRole","allRoles","chainsData","useEscalationChains","addChain","useAddEscalationChain","removeChain","useRemoveEscalationChain","newTarget","setNewTarget","chains","targets","useMemo","c","available","r","handleAdd","handleRemove","target","isSuperAdmin","getRoleColumns","onDelete","row","RolePill","RowActionGroup","RowAction","Trash2","RolesPage","data","isLoading","useRoleDetails","deleteRole","useDeleteRole","showCreate","setShowCreate","confirmDelete","setConfirmDelete","setSelectedRole","roles","allRoleNames","columns","handleDelete","PageHeader","DataTable","ConfirmDeleteModal","Fragment"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as t}from"./index-BYZX9tOb.js";function r({icon:o,title:s,onClick:a,colorClass:n="text-text-tertiary hover:text-accent",alwaysVisible:i}){return t.jsxDEV("button",{onClick:e=>{e.stopPropagation(),a(e)},className:`transition-opacity ${i?"opacity-100":"opacity-0 group-hover/row:opacity-100"} ${n}`,title:s,children:t.jsxDEV(o,{className:"w-[18px] h-[18px]",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/RowActions.tsx",lineNumber:32,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/RowActions.tsx",lineNumber:22,columnNumber:5},this)}function m({children:o}){return t.jsxDEV("span",{className:"flex items-center justify-end gap-2.5",children:o},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/RowActions.tsx",lineNumber:42,columnNumber:5},this)}export{m as R,r as a};
2
- //# sourceMappingURL=RowActions-yDhwwDbU.js.map
1
+ import{j as t}from"./index-Cmgrk7PQ.js";function r({icon:o,title:s,onClick:a,colorClass:n="text-text-tertiary hover:text-accent",alwaysVisible:i}){return t.jsxDEV("button",{onClick:e=>{e.stopPropagation(),a(e)},className:`transition-opacity ${i?"opacity-100":"opacity-0 group-hover/row:opacity-100"} ${n}`,title:s,children:t.jsxDEV(o,{className:"w-[18px] h-[18px]",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/RowActions.tsx",lineNumber:32,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/RowActions.tsx",lineNumber:22,columnNumber:5},this)}function m({children:o}){return t.jsxDEV("span",{className:"flex items-center justify-end gap-2.5",children:o},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/RowActions.tsx",lineNumber:42,columnNumber:5},this)}export{m as R,r as a};
2
+ //# sourceMappingURL=RowActions-DbUJPfaW.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RowActions-yDhwwDbU.js","sources":["../../src/components/common/layout/RowActions.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\n/**\n * Ephemeral icon button that appears on row hover.\n * Uses `group-hover/row:opacity-100` to show on hover — rows must have `group/row`.\n */\nexport function RowAction({\n icon: Icon,\n title,\n onClick,\n colorClass = 'text-text-tertiary hover:text-accent',\n alwaysVisible,\n}: {\n icon: LucideIcon;\n title: string;\n onClick: (e: React.MouseEvent) => void;\n colorClass?: string;\n alwaysVisible?: boolean;\n}) {\n return (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onClick(e);\n }}\n className={`transition-opacity ${\n alwaysVisible ? 'opacity-100' : 'opacity-0 group-hover/row:opacity-100'\n } ${colorClass}`}\n title={title}\n >\n <Icon className=\"w-[18px] h-[18px]\" strokeWidth={1.5} />\n </button>\n );\n}\n\n/**\n * Container for one or more RowAction icons in the last table column.\n */\nexport function RowActionGroup({ children }: { children: ReactNode }) {\n return (\n <span className=\"flex items-center justify-end gap-2.5\">\n {children}\n </span>\n );\n}\n"],"names":["RowAction","Icon","title","onClick","colorClass","alwaysVisible","jsxDEV","RowActionGroup","children"],"mappings":"wCAOO,SAASA,EAAU,CACxB,KAAMC,EACN,MAAAC,EACA,QAAAC,EACA,WAAAC,EAAa,uCACb,cAAAC,CACF,EAMG,CACD,OACEC,EAAAA,OAAC,SAAA,CACC,QAAU,GAAM,CACd,EAAE,gBAAA,EACFH,EAAQ,CAAC,CACX,EACA,UAAW,sBACTE,EAAgB,cAAgB,uCAClC,IAAID,CAAU,GACd,MAAAF,EAEA,SAAAI,EAAAA,OAACL,EAAA,CAAK,UAAU,oBAAoB,YAAa,GAAA,EAAjD,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAsD,CAAA,EAVxD,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAaJ,CAKO,SAASM,EAAe,CAAE,SAAAC,GAAqC,CACpE,OACEF,EAAAA,OAAC,OAAA,CAAK,UAAU,wCACb,SAAAE,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAEJ"}
1
+ {"version":3,"file":"RowActions-DbUJPfaW.js","sources":["../../src/components/common/layout/RowActions.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\n/**\n * Ephemeral icon button that appears on row hover.\n * Uses `group-hover/row:opacity-100` to show on hover — rows must have `group/row`.\n */\nexport function RowAction({\n icon: Icon,\n title,\n onClick,\n colorClass = 'text-text-tertiary hover:text-accent',\n alwaysVisible,\n}: {\n icon: LucideIcon;\n title: string;\n onClick: (e: React.MouseEvent) => void;\n colorClass?: string;\n alwaysVisible?: boolean;\n}) {\n return (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onClick(e);\n }}\n className={`transition-opacity ${\n alwaysVisible ? 'opacity-100' : 'opacity-0 group-hover/row:opacity-100'\n } ${colorClass}`}\n title={title}\n >\n <Icon className=\"w-[18px] h-[18px]\" strokeWidth={1.5} />\n </button>\n );\n}\n\n/**\n * Container for one or more RowAction icons in the last table column.\n */\nexport function RowActionGroup({ children }: { children: ReactNode }) {\n return (\n <span className=\"flex items-center justify-end gap-2.5\">\n {children}\n </span>\n );\n}\n"],"names":["RowAction","Icon","title","onClick","colorClass","alwaysVisible","jsxDEV","RowActionGroup","children"],"mappings":"wCAOO,SAASA,EAAU,CACxB,KAAMC,EACN,MAAAC,EACA,QAAAC,EACA,WAAAC,EAAa,uCACb,cAAAC,CACF,EAMG,CACD,OACEC,EAAAA,OAAC,SAAA,CACC,QAAU,GAAM,CACd,EAAE,gBAAA,EACFH,EAAQ,CAAC,CACX,EACA,UAAW,sBACTE,EAAgB,cAAgB,uCAClC,IAAID,CAAU,GACd,MAAAF,EAEA,SAAAI,EAAAA,OAACL,EAAA,CAAK,UAAU,oBAAoB,YAAa,GAAA,EAAjD,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAsD,CAAA,EAVxD,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAaJ,CAKO,SAASM,EAAe,CAAE,SAAAC,GAAqC,CACpE,OACEF,EAAAA,OAAC,OAAA,CAAK,UAAU,wCACb,SAAAE,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./index-BYZX9tOb.js";function i({label:m,value:n,sub:a,dotClass:t,colorClass:d="text-text-primary",onClick:r}){const s=e.jsxDEV(e.Fragment,{children:[e.jsxDEV("div",{className:"flex items-center gap-2 mb-1",children:[t&&e.jsxDEV("span",{className:`w-2 h-2 rounded-full ${t}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:21,columnNumber:22},this),e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:m},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:22,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:20,columnNumber:7},this),e.jsxDEV("p",{className:`text-2xl font-light tabular-nums ${d}`,children:n},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:26,columnNumber:7},this),a&&e.jsxDEV("p",{className:"text-xs text-text-tertiary mt-1",children:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:27,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:19,columnNumber:5},this),o="bg-surface-raised border border-surface-border rounded-md p-4 text-left";return r?e.jsxDEV("button",{onClick:r,className:`${o} hover:border-accent/40 transition-colors`,children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:35,columnNumber:7},this):e.jsxDEV("div",{className:o,children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:41,columnNumber:10},this)}export{i as S};
2
- //# sourceMappingURL=StatCard-BrBnQFxh.js.map
1
+ import{j as e}from"./index-Cmgrk7PQ.js";function i({label:m,value:n,sub:a,dotClass:t,colorClass:d="text-text-primary",onClick:r}){const s=e.jsxDEV(e.Fragment,{children:[e.jsxDEV("div",{className:"flex items-center gap-2 mb-1",children:[t&&e.jsxDEV("span",{className:`w-2 h-2 rounded-full ${t}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:21,columnNumber:22},this),e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:m},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:22,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:20,columnNumber:7},this),e.jsxDEV("p",{className:`text-2xl font-light tabular-nums ${d}`,children:n},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:26,columnNumber:7},this),a&&e.jsxDEV("p",{className:"text-xs text-text-tertiary mt-1",children:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:27,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:19,columnNumber:5},this),o="bg-surface-raised border border-surface-border rounded-md p-4 text-left";return r?e.jsxDEV("button",{onClick:r,className:`${o} hover:border-accent/40 transition-colors`,children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:35,columnNumber:7},this):e.jsxDEV("div",{className:o,children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:41,columnNumber:10},this)}export{i as S};
2
+ //# sourceMappingURL=StatCard-Bs3JbyAz.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StatCard-BrBnQFxh.js","sources":["../../src/components/common/data/StatCard.tsx"],"sourcesContent":["interface StatCardProps {\n label: string;\n value: string | number;\n sub?: string;\n dotClass?: string;\n colorClass?: string;\n onClick?: () => void;\n}\n\nexport function StatCard({\n label,\n value,\n sub,\n dotClass,\n colorClass = 'text-text-primary',\n onClick,\n}: StatCardProps) {\n const content = (\n <>\n <div className=\"flex items-center gap-2 mb-1\">\n {dotClass && <span className={`w-2 h-2 rounded-full ${dotClass}`} />}\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n {label}\n </p>\n </div>\n <p className={`text-2xl font-light tabular-nums ${colorClass}`}>{value}</p>\n {sub && <p className=\"text-xs text-text-tertiary mt-1\">{sub}</p>}\n </>\n );\n\n const base = 'bg-surface-raised border border-surface-border rounded-md p-4 text-left';\n\n if (onClick) {\n return (\n <button onClick={onClick} className={`${base} hover:border-accent/40 transition-colors`}>\n {content}\n </button>\n );\n }\n\n return <div className={base}>{content}</div>;\n}\n"],"names":["StatCard","label","value","sub","dotClass","colorClass","onClick","content","jsxDEV","Fragment","base"],"mappings":"wCASO,SAASA,EAAS,CACvB,MAAAC,EACA,MAAAC,EACA,IAAAC,EACA,SAAAC,EACA,WAAAC,EAAa,oBACb,QAAAC,CACF,EAAkB,CAChB,MAAMC,EACJC,EAAAA,OAAAC,EAAAA,SAAA,CACE,SAAA,CAAAD,EAAAA,OAAC,MAAA,CAAI,UAAU,+BACZ,SAAA,CAAAJ,GAAYI,EAAAA,OAAC,OAAA,CAAK,UAAW,wBAAwBJ,CAAQ,EAAA,EAAjD,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAqD,EAClEI,SAAC,IAAA,CAAE,UAAU,yEACV,SAAAP,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAAA,CAAA,EAJF,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAKA,WACC,IAAA,CAAE,UAAW,oCAAoCI,CAAU,GAAK,SAAAH,GAAjE,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAuE,EACtEC,GAAOK,EAAAA,OAAC,IAAA,CAAE,UAAU,kCAAmC,SAAAL,CAAA,EAAhD,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAoD,CAAA,CAAA,EAR9D,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IASA,EAGIO,EAAO,0EAEb,OAAIJ,WAEC,SAAA,CAAO,QAAAA,EAAkB,UAAW,GAAGI,CAAI,4CACzC,SAAAH,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,EAIGC,EAAAA,OAAC,MAAA,CAAI,UAAWE,EAAO,SAAAH,CAAA,EAAvB,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA+B,CACxC"}
1
+ {"version":3,"file":"StatCard-Bs3JbyAz.js","sources":["../../src/components/common/data/StatCard.tsx"],"sourcesContent":["interface StatCardProps {\n label: string;\n value: string | number;\n sub?: string;\n dotClass?: string;\n colorClass?: string;\n onClick?: () => void;\n}\n\nexport function StatCard({\n label,\n value,\n sub,\n dotClass,\n colorClass = 'text-text-primary',\n onClick,\n}: StatCardProps) {\n const content = (\n <>\n <div className=\"flex items-center gap-2 mb-1\">\n {dotClass && <span className={`w-2 h-2 rounded-full ${dotClass}`} />}\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n {label}\n </p>\n </div>\n <p className={`text-2xl font-light tabular-nums ${colorClass}`}>{value}</p>\n {sub && <p className=\"text-xs text-text-tertiary mt-1\">{sub}</p>}\n </>\n );\n\n const base = 'bg-surface-raised border border-surface-border rounded-md p-4 text-left';\n\n if (onClick) {\n return (\n <button onClick={onClick} className={`${base} hover:border-accent/40 transition-colors`}>\n {content}\n </button>\n );\n }\n\n return <div className={base}>{content}</div>;\n}\n"],"names":["StatCard","label","value","sub","dotClass","colorClass","onClick","content","jsxDEV","Fragment","base"],"mappings":"wCASO,SAASA,EAAS,CACvB,MAAAC,EACA,MAAAC,EACA,IAAAC,EACA,SAAAC,EACA,WAAAC,EAAa,oBACb,QAAAC,CACF,EAAkB,CAChB,MAAMC,EACJC,EAAAA,OAAAC,EAAAA,SAAA,CACE,SAAA,CAAAD,EAAAA,OAAC,MAAA,CAAI,UAAU,+BACZ,SAAA,CAAAJ,GAAYI,EAAAA,OAAC,OAAA,CAAK,UAAW,wBAAwBJ,CAAQ,EAAA,EAAjD,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAqD,EAClEI,SAAC,IAAA,CAAE,UAAU,yEACV,SAAAP,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAAA,CAAA,EAJF,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAKA,WACC,IAAA,CAAE,UAAW,oCAAoCI,CAAU,GAAK,SAAAH,GAAjE,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAuE,EACtEC,GAAOK,EAAAA,OAAC,IAAA,CAAE,UAAU,kCAAmC,SAAAL,CAAA,EAAhD,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAoD,CAAA,CAAA,EAR9D,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IASA,EAGIO,EAAO,0EAEb,OAAIJ,WAEC,SAAA,CAAO,QAAAA,EAAkB,UAAW,GAAGI,CAAI,4CACzC,SAAAH,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,EAIGC,EAAAA,OAAC,MAAA,CAAI,UAAWE,EAAO,SAAAH,CAAA,EAAvB,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA+B,CACxC"}
@@ -1,2 +1,2 @@
1
- import{j as s}from"./index-BYZX9tOb.js";const n={pending:"bg-status-pending",in_progress:"bg-status-active animate-pulse",completed:"bg-status-success",resolved:"bg-status-success",needs_intervention:"bg-status-error",failed:"bg-status-error",cancelled:"bg-accent-muted",draft:"bg-status-draft",deployed:"bg-status-active",active:"bg-status-success",archived:"bg-text-tertiary"},d={pending:"Pending",in_progress:"In Progress",completed:"Completed",resolved:"Resolved",needs_intervention:"Needs Intervention",failed:"Failed",cancelled:"Cancelled",draft:"Draft",deployed:"Deployed",active:"Active",archived:"Archived"};function r({status:e}){const t=n[e]??"bg-status-pending",a=d[e]??e;return s.jsxDEV("span",{className:"inline-flex items-center gap-2",children:[s.jsxDEV("span",{className:`w-2 h-2 rounded-full ${t}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/StatusBadge.tsx",lineNumber:39,columnNumber:7},this),s.jsxDEV("span",{className:"text-xs text-text-secondary",children:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/StatusBadge.tsx",lineNumber:40,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/StatusBadge.tsx",lineNumber:38,columnNumber:5},this)}export{r as S};
2
- //# sourceMappingURL=StatusBadge-xgb-lZku.js.map
1
+ import{j as s}from"./index-Cmgrk7PQ.js";const n={pending:"bg-status-pending",in_progress:"bg-status-active animate-pulse",completed:"bg-status-success",resolved:"bg-status-success",needs_intervention:"bg-status-error",failed:"bg-status-error",cancelled:"bg-accent-muted",draft:"bg-status-draft",deployed:"bg-status-active",active:"bg-status-success",archived:"bg-text-tertiary"},d={pending:"Pending",in_progress:"In Progress",completed:"Completed",resolved:"Resolved",needs_intervention:"Needs Intervention",failed:"Failed",cancelled:"Cancelled",draft:"Draft",deployed:"Deployed",active:"Active",archived:"Archived"};function r({status:e}){const t=n[e]??"bg-status-pending",a=d[e]??e;return s.jsxDEV("span",{className:"inline-flex items-center gap-2",children:[s.jsxDEV("span",{className:`w-2 h-2 rounded-full ${t}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/StatusBadge.tsx",lineNumber:39,columnNumber:7},this),s.jsxDEV("span",{className:"text-xs text-text-secondary",children:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/StatusBadge.tsx",lineNumber:40,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/StatusBadge.tsx",lineNumber:38,columnNumber:5},this)}export{r as S};
2
+ //# sourceMappingURL=StatusBadge-CakDdsCw.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StatusBadge-xgb-lZku.js","sources":["../../src/components/common/display/StatusBadge.tsx"],"sourcesContent":["import type { LTTaskStatus, LTEscalationStatus } from '../../../api/types';\n\ntype Status = LTTaskStatus | LTEscalationStatus | string;\n\nconst statusStyles: Record<string, string> = {\n pending: 'bg-status-pending',\n in_progress: 'bg-status-active animate-pulse',\n completed: 'bg-status-success',\n resolved: 'bg-status-success',\n needs_intervention: 'bg-status-error',\n failed: 'bg-status-error',\n cancelled: 'bg-accent-muted',\n draft: 'bg-status-draft',\n deployed: 'bg-status-active',\n active: 'bg-status-success',\n archived: 'bg-text-tertiary',\n};\n\nconst statusLabels: Record<string, string> = {\n pending: 'Pending',\n in_progress: 'In Progress',\n completed: 'Completed',\n resolved: 'Resolved',\n needs_intervention: 'Needs Intervention',\n failed: 'Failed',\n cancelled: 'Cancelled',\n draft: 'Draft',\n deployed: 'Deployed',\n active: 'Active',\n archived: 'Archived',\n};\n\nexport function StatusBadge({ status }: { status: Status }) {\n const dotClass = statusStyles[status] ?? 'bg-status-pending';\n const label = statusLabels[status] ?? status;\n\n return (\n <span className=\"inline-flex items-center gap-2\">\n <span className={`w-2 h-2 rounded-full ${dotClass}`} />\n <span className=\"text-xs text-text-secondary\">{label}</span>\n </span>\n );\n}\n"],"names":["statusStyles","statusLabels","StatusBadge","status","dotClass","label","jsxDEV"],"mappings":"wCAIA,MAAMA,EAAuC,CAC3C,QAAS,oBACT,YAAa,iCACb,UAAW,oBACX,SAAU,oBACV,mBAAoB,kBACpB,OAAQ,kBACR,UAAW,kBACX,MAAO,kBACP,SAAU,mBACV,OAAQ,oBACR,SAAU,kBACZ,EAEMC,EAAuC,CAC3C,QAAS,UACT,YAAa,cACb,UAAW,YACX,SAAU,WACV,mBAAoB,qBACpB,OAAQ,SACR,UAAW,YACX,MAAO,QACP,SAAU,WACV,OAAQ,SACR,SAAU,UACZ,EAEO,SAASC,EAAY,CAAE,OAAAC,GAA8B,CAC1D,MAAMC,EAAWJ,EAAaG,CAAM,GAAK,oBACnCE,EAAQJ,EAAaE,CAAM,GAAKA,EAEtC,OACEG,EAAAA,OAAC,OAAA,CAAK,UAAU,iCACd,SAAA,CAAAA,SAAC,OAAA,CAAK,UAAW,wBAAwBF,CAAQ,EAAA,EAAjD,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAqD,EACrDE,SAAC,OAAA,CAAK,UAAU,8BAA+B,SAAAD,CAAA,EAA/C,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAqD,CAAA,CAAA,EAFvD,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAEJ"}
1
+ {"version":3,"file":"StatusBadge-CakDdsCw.js","sources":["../../src/components/common/display/StatusBadge.tsx"],"sourcesContent":["import type { LTTaskStatus, LTEscalationStatus } from '../../../api/types';\n\ntype Status = LTTaskStatus | LTEscalationStatus | string;\n\nconst statusStyles: Record<string, string> = {\n pending: 'bg-status-pending',\n in_progress: 'bg-status-active animate-pulse',\n completed: 'bg-status-success',\n resolved: 'bg-status-success',\n needs_intervention: 'bg-status-error',\n failed: 'bg-status-error',\n cancelled: 'bg-accent-muted',\n draft: 'bg-status-draft',\n deployed: 'bg-status-active',\n active: 'bg-status-success',\n archived: 'bg-text-tertiary',\n};\n\nconst statusLabels: Record<string, string> = {\n pending: 'Pending',\n in_progress: 'In Progress',\n completed: 'Completed',\n resolved: 'Resolved',\n needs_intervention: 'Needs Intervention',\n failed: 'Failed',\n cancelled: 'Cancelled',\n draft: 'Draft',\n deployed: 'Deployed',\n active: 'Active',\n archived: 'Archived',\n};\n\nexport function StatusBadge({ status }: { status: Status }) {\n const dotClass = statusStyles[status] ?? 'bg-status-pending';\n const label = statusLabels[status] ?? status;\n\n return (\n <span className=\"inline-flex items-center gap-2\">\n <span className={`w-2 h-2 rounded-full ${dotClass}`} />\n <span className=\"text-xs text-text-secondary\">{label}</span>\n </span>\n );\n}\n"],"names":["statusStyles","statusLabels","StatusBadge","status","dotClass","label","jsxDEV"],"mappings":"wCAIA,MAAMA,EAAuC,CAC3C,QAAS,oBACT,YAAa,iCACb,UAAW,oBACX,SAAU,oBACV,mBAAoB,kBACpB,OAAQ,kBACR,UAAW,kBACX,MAAO,kBACP,SAAU,mBACV,OAAQ,oBACR,SAAU,kBACZ,EAEMC,EAAuC,CAC3C,QAAS,UACT,YAAa,cACb,UAAW,YACX,SAAU,WACV,mBAAoB,qBACpB,OAAQ,SACR,UAAW,YACX,MAAO,QACP,SAAU,WACV,OAAQ,SACR,SAAU,UACZ,EAEO,SAASC,EAAY,CAAE,OAAAC,GAA8B,CAC1D,MAAMC,EAAWJ,EAAaG,CAAM,GAAK,oBACnCE,EAAQJ,EAAaE,CAAM,GAAKA,EAEtC,OACEG,EAAAA,OAAC,OAAA,CAAK,UAAU,iCACd,SAAA,CAAAA,SAAC,OAAA,CAAK,UAAW,wBAAwBF,CAAQ,EAAA,EAAjD,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAqD,EACrDE,SAAC,OAAA,CAAK,UAAU,8BAA+B,SAAAD,CAAA,EAA/C,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAqD,CAAA,CAAA,EAFvD,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./index-BYZX9tOb.js";function l({steps:m,currentStep:s,onStepClick:a}){return e.jsxDEV("div",{className:"flex items-center justify-center gap-1 pb-4 border-b border-surface-border mb-4",children:m.map((n,t)=>{const c=t<s,o=t===s,r=!!a;return e.jsxDEV("div",{className:"flex items-center gap-1",children:[t>0&&e.jsxDEV("div",{className:`w-4 h-px ${c?"bg-accent":"bg-surface-border"}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:17,columnNumber:15},this),e.jsxDEV("button",{type:"button",onClick:r?()=>a(t):void 0,className:`flex items-center gap-1 ${r?"cursor-pointer":"cursor-default"}`,children:[e.jsxDEV("span",{className:`w-5 h-5 rounded-full text-[10px] font-semibold flex items-center justify-center shrink-0 transition-colors ${o?"bg-accent text-text-inverse":c?"bg-accent-muted text-accent":"bg-surface-sunken text-text-tertiary"} ${r&&!o?"hover:bg-accent-muted hover:text-accent":""}`,children:t+1},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:24,columnNumber:15},this),e.jsxDEV("span",{className:`text-[10px] font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${o?"text-text-primary":"text-text-tertiary"} ${r&&!o?"hover:text-text-primary":""}`,children:n},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:35,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:19,columnNumber:13},this)]},n,!0,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:15,columnNumber:11},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:9,columnNumber:5},this)}export{l as S};
2
- //# sourceMappingURL=StepIndicator-B9ps2SvM.js.map
1
+ import{j as e}from"./index-Cmgrk7PQ.js";function l({steps:m,currentStep:s,onStepClick:a}){return e.jsxDEV("div",{className:"flex items-center justify-center gap-1 pb-4 border-b border-surface-border mb-4",children:m.map((n,t)=>{const c=t<s,o=t===s,r=!!a;return e.jsxDEV("div",{className:"flex items-center gap-1",children:[t>0&&e.jsxDEV("div",{className:`w-4 h-px ${c?"bg-accent":"bg-surface-border"}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:17,columnNumber:15},this),e.jsxDEV("button",{type:"button",onClick:r?()=>a(t):void 0,className:`flex items-center gap-1 ${r?"cursor-pointer":"cursor-default"}`,children:[e.jsxDEV("span",{className:`w-5 h-5 rounded-full text-[10px] font-semibold flex items-center justify-center shrink-0 transition-colors ${o?"bg-accent text-text-inverse":c?"bg-accent-muted text-accent":"bg-surface-sunken text-text-tertiary"} ${r&&!o?"hover:bg-accent-muted hover:text-accent":""}`,children:t+1},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:24,columnNumber:15},this),e.jsxDEV("span",{className:`text-[10px] font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${o?"text-text-primary":"text-text-tertiary"} ${r&&!o?"hover:text-text-primary":""}`,children:n},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:35,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:19,columnNumber:13},this)]},n,!0,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:15,columnNumber:11},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:9,columnNumber:5},this)}export{l as S};
2
+ //# sourceMappingURL=StepIndicator-Cd_SG_yA.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StepIndicator-B9ps2SvM.js","sources":["../../src/components/common/layout/StepIndicator.tsx"],"sourcesContent":["interface StepIndicatorProps {\n steps: string[];\n currentStep: number;\n onStepClick?: (step: number) => void;\n}\n\nexport function StepIndicator({ steps, currentStep, onStepClick }: StepIndicatorProps) {\n return (\n <div className=\"flex items-center justify-center gap-1 pb-4 border-b border-surface-border mb-4\">\n {steps.map((label, i) => {\n const done = i < currentStep;\n const active = i === currentStep;\n const clickable = !!onStepClick;\n return (\n <div key={label} className=\"flex items-center gap-1\">\n {i > 0 && (\n <div className={`w-4 h-px ${done ? 'bg-accent' : 'bg-surface-border'}`} />\n )}\n <button\n type=\"button\"\n onClick={clickable ? () => onStepClick(i) : undefined}\n className={`flex items-center gap-1 ${clickable ? 'cursor-pointer' : 'cursor-default'}`}\n >\n <span\n className={`w-5 h-5 rounded-full text-[10px] font-semibold flex items-center justify-center shrink-0 transition-colors ${\n active\n ? 'bg-accent text-text-inverse'\n : done\n ? 'bg-accent-muted text-accent'\n : 'bg-surface-sunken text-text-tertiary'\n } ${clickable && !active ? 'hover:bg-accent-muted hover:text-accent' : ''}`}\n >\n {i + 1}\n </span>\n <span\n className={`text-[10px] font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${\n active ? 'text-text-primary' : 'text-text-tertiary'\n } ${clickable && !active ? 'hover:text-text-primary' : ''}`}\n >\n {label}\n </span>\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":["StepIndicator","steps","currentStep","onStepClick","jsxDEV","label","i","done","active","clickable"],"mappings":"wCAMO,SAASA,EAAc,CAAE,MAAAC,EAAO,YAAAC,EAAa,YAAAC,GAAmC,CACrF,OACEC,SAAC,OAAI,UAAU,kFACZ,WAAM,IAAI,CAACC,EAAOC,IAAM,CACvB,MAAMC,EAAOD,EAAIJ,EACXM,EAASF,IAAMJ,EACfO,EAAY,CAAC,CAACN,EACpB,OACEC,EAAAA,OAAC,MAAA,CAAgB,UAAU,0BACxB,SAAA,CAAAE,EAAI,YACF,MAAA,CAAI,UAAW,YAAYC,EAAO,YAAc,mBAAmB,EAAA,EAApE,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAwE,EAE1EH,EAAAA,OAAC,SAAA,CACC,KAAK,SACL,QAASK,EAAY,IAAMN,EAAYG,CAAC,EAAI,OAC5C,UAAW,2BAA2BG,EAAY,iBAAmB,gBAAgB,GAErF,SAAA,CAAAL,EAAAA,OAAC,OAAA,CACC,UAAW,8GACTI,EACI,8BACAD,EACE,8BACA,sCACR,IAAIE,GAAa,CAACD,EAAS,0CAA4C,EAAE,GAExE,SAAAF,EAAI,CAAA,EATP,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,EAWAF,EAAAA,OAAC,OAAA,CACC,UAAW,0FACTI,EAAS,oBAAsB,oBACjC,IAAIC,GAAa,CAACD,EAAS,0BAA4B,EAAE,GAExD,SAAAH,CAAA,EALH,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAtBF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAuBA,CAAA,EA3BQA,EAAV,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IA4BA,CAEJ,CAAC,CAAA,EApCH,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,EAAA,aAAA,CAAA,EAAA,IAqCA,CAEJ"}
1
+ {"version":3,"file":"StepIndicator-Cd_SG_yA.js","sources":["../../src/components/common/layout/StepIndicator.tsx"],"sourcesContent":["interface StepIndicatorProps {\n steps: string[];\n currentStep: number;\n onStepClick?: (step: number) => void;\n}\n\nexport function StepIndicator({ steps, currentStep, onStepClick }: StepIndicatorProps) {\n return (\n <div className=\"flex items-center justify-center gap-1 pb-4 border-b border-surface-border mb-4\">\n {steps.map((label, i) => {\n const done = i < currentStep;\n const active = i === currentStep;\n const clickable = !!onStepClick;\n return (\n <div key={label} className=\"flex items-center gap-1\">\n {i > 0 && (\n <div className={`w-4 h-px ${done ? 'bg-accent' : 'bg-surface-border'}`} />\n )}\n <button\n type=\"button\"\n onClick={clickable ? () => onStepClick(i) : undefined}\n className={`flex items-center gap-1 ${clickable ? 'cursor-pointer' : 'cursor-default'}`}\n >\n <span\n className={`w-5 h-5 rounded-full text-[10px] font-semibold flex items-center justify-center shrink-0 transition-colors ${\n active\n ? 'bg-accent text-text-inverse'\n : done\n ? 'bg-accent-muted text-accent'\n : 'bg-surface-sunken text-text-tertiary'\n } ${clickable && !active ? 'hover:bg-accent-muted hover:text-accent' : ''}`}\n >\n {i + 1}\n </span>\n <span\n className={`text-[10px] font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${\n active ? 'text-text-primary' : 'text-text-tertiary'\n } ${clickable && !active ? 'hover:text-text-primary' : ''}`}\n >\n {label}\n </span>\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":["StepIndicator","steps","currentStep","onStepClick","jsxDEV","label","i","done","active","clickable"],"mappings":"wCAMO,SAASA,EAAc,CAAE,MAAAC,EAAO,YAAAC,EAAa,YAAAC,GAAmC,CACrF,OACEC,SAAC,OAAI,UAAU,kFACZ,WAAM,IAAI,CAACC,EAAOC,IAAM,CACvB,MAAMC,EAAOD,EAAIJ,EACXM,EAASF,IAAMJ,EACfO,EAAY,CAAC,CAACN,EACpB,OACEC,EAAAA,OAAC,MAAA,CAAgB,UAAU,0BACxB,SAAA,CAAAE,EAAI,YACF,MAAA,CAAI,UAAW,YAAYC,EAAO,YAAc,mBAAmB,EAAA,EAApE,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAwE,EAE1EH,EAAAA,OAAC,SAAA,CACC,KAAK,SACL,QAASK,EAAY,IAAMN,EAAYG,CAAC,EAAI,OAC5C,UAAW,2BAA2BG,EAAY,iBAAmB,gBAAgB,GAErF,SAAA,CAAAL,EAAAA,OAAC,OAAA,CACC,UAAW,8GACTI,EACI,8BACAD,EACE,8BACA,sCACR,IAAIE,GAAa,CAACD,EAAS,0CAA4C,EAAE,GAExE,SAAAF,EAAI,CAAA,EATP,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,EAWAF,EAAAA,OAAC,OAAA,CACC,UAAW,0FACTI,EAAS,oBAAsB,oBACjC,IAAIC,GAAa,CAACD,EAAS,0BAA4B,EAAE,GAExD,SAAAH,CAAA,EALH,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAtBF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAuBA,CAAA,EA3BQA,EAAV,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IA4BA,CAEJ,CAAC,CAAA,EApCH,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,EAAA,aAAA,CAAA,EAAA,IAqCA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./index-BYZX9tOb.js";const l=[10,25,50,100];function d({page:t,totalPages:s,onPageChange:i,total:n,pageSize:o,onPageSizeChange:m}){if(n===0)return null;const r=(t-1)*o+1,c=Math.min(t*o,n);return e.jsxDEV("div",{className:"flex items-center justify-between pt-4",children:[e.jsxDEV("div",{className:"flex items-center gap-4",children:[e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:[r,"–",c," of ",n]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:28,columnNumber:9},this),m&&e.jsxDEV("select",{value:o,onChange:a=>m(parseInt(a.target.value)),className:"select text-xs py-1",children:l.map(a=>e.jsxDEV("option",{value:a,children:[a," / page"]},a,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:38,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:32,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:27,columnNumber:7},this),s>1&&e.jsxDEV("div",{className:"flex items-center gap-1",children:[e.jsxDEV("button",{onClick:()=>i(t-1),disabled:t<=1,className:"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed",children:"Previous"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:47,columnNumber:11},this),e.jsxDEV("span",{className:"px-3 text-xs text-text-secondary",children:[t," / ",s]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:54,columnNumber:11},this),e.jsxDEV("button",{onClick:()=>i(t+1),disabled:t>=s,className:"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed",children:"Next"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:57,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:46,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:26,columnNumber:5},this)}function b(t){return t.total===0?null:e.jsxDEV("div",{className:"sticky bg-surface/95 backdrop-blur-sm border-t border-surface-border -mx-10 px-10 pt-2 pb-4",style:{bottom:"calc(var(--feed-height, 0px) - 8px)"},children:e.jsxDEV(d,{...t},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StickyPagination.tsx",lineNumber:17,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StickyPagination.tsx",lineNumber:16,columnNumber:5},this)}export{b as S};
2
- //# sourceMappingURL=StickyPagination-DTIjBKN3.js.map
1
+ import{j as e}from"./index-Cmgrk7PQ.js";const l=[10,25,50,100];function d({page:t,totalPages:s,onPageChange:i,total:n,pageSize:o,onPageSizeChange:m}){if(n===0)return null;const r=(t-1)*o+1,c=Math.min(t*o,n);return e.jsxDEV("div",{className:"flex items-center justify-between pt-4",children:[e.jsxDEV("div",{className:"flex items-center gap-4",children:[e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:[r,"–",c," of ",n]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:28,columnNumber:9},this),m&&e.jsxDEV("select",{value:o,onChange:a=>m(parseInt(a.target.value)),className:"select text-xs py-1",children:l.map(a=>e.jsxDEV("option",{value:a,children:[a," / page"]},a,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:38,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:32,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:27,columnNumber:7},this),s>1&&e.jsxDEV("div",{className:"flex items-center gap-1",children:[e.jsxDEV("button",{onClick:()=>i(t-1),disabled:t<=1,className:"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed",children:"Previous"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:47,columnNumber:11},this),e.jsxDEV("span",{className:"px-3 text-xs text-text-secondary",children:[t," / ",s]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:54,columnNumber:11},this),e.jsxDEV("button",{onClick:()=>i(t+1),disabled:t>=s,className:"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed",children:"Next"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:57,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:46,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:26,columnNumber:5},this)}function b(t){return t.total===0?null:e.jsxDEV("div",{className:"sticky bg-surface/95 backdrop-blur-sm border-t border-surface-border -mx-10 px-10 pt-2 pb-4",style:{bottom:"calc(var(--feed-height, 0px) - 8px)"},children:e.jsxDEV(d,{...t},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StickyPagination.tsx",lineNumber:17,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StickyPagination.tsx",lineNumber:16,columnNumber:5},this)}export{b as S};
2
+ //# sourceMappingURL=StickyPagination-Bz0C18nC.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StickyPagination-DTIjBKN3.js","sources":["../../src/components/common/data/Pagination.tsx","../../src/components/common/data/StickyPagination.tsx"],"sourcesContent":["const PAGE_SIZE_OPTIONS = [10, 25, 50, 100];\n\ninterface PaginationProps {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n total: number;\n pageSize: number;\n onPageSizeChange?: (size: number) => void;\n}\n\nexport function Pagination({\n page,\n totalPages,\n onPageChange,\n total,\n pageSize,\n onPageSizeChange,\n}: PaginationProps) {\n if (total === 0) return null;\n\n const start = (page - 1) * pageSize + 1;\n const end = Math.min(page * pageSize, total);\n\n return (\n <div className=\"flex items-center justify-between pt-4\">\n <div className=\"flex items-center gap-4\">\n <p className=\"text-xs text-text-tertiary\">\n {start}&ndash;{end} of {total}\n </p>\n {onPageSizeChange && (\n <select\n value={pageSize}\n onChange={(e) => onPageSizeChange(parseInt(e.target.value))}\n className=\"select text-xs py-1\"\n >\n {PAGE_SIZE_OPTIONS.map((size) => (\n <option key={size} value={size}>\n {size} / page\n </option>\n ))}\n </select>\n )}\n </div>\n {totalPages > 1 && (\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => onPageChange(page - 1)}\n disabled={page <= 1}\n className=\"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n Previous\n </button>\n <span className=\"px-3 text-xs text-text-secondary\">\n {page} / {totalPages}\n </span>\n <button\n onClick={() => onPageChange(page + 1)}\n disabled={page >= totalPages}\n className=\"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n Next\n </button>\n </div>\n )}\n </div>\n );\n}\n","import { Pagination } from './Pagination';\n\ninterface StickyPaginationProps {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n total: number;\n pageSize: number;\n onPageSizeChange?: (size: number) => void;\n}\n\nexport function StickyPagination(props: StickyPaginationProps) {\n if (props.total === 0) return null;\n\n return (\n <div className=\"sticky bg-surface/95 backdrop-blur-sm border-t border-surface-border -mx-10 px-10 pt-2 pb-4\" style={{ bottom: 'calc(var(--feed-height, 0px) - 8px)' }}>\n <Pagination {...props} />\n </div>\n );\n}\n"],"names":["PAGE_SIZE_OPTIONS","Pagination","page","totalPages","onPageChange","total","pageSize","onPageSizeChange","start","end","jsxDEV","e","size","StickyPagination","props"],"mappings":"wCAAA,MAAMA,EAAoB,CAAC,GAAI,GAAI,GAAI,GAAG,EAWnC,SAASC,EAAW,CACzB,KAAAC,EACA,WAAAC,EACA,aAAAC,EACA,MAAAC,EACA,SAAAC,EACA,iBAAAC,CACF,EAAoB,CAClB,GAAIF,IAAU,EAAG,OAAO,KAExB,MAAMG,GAASN,EAAO,GAAKI,EAAW,EAChCG,EAAM,KAAK,IAAIP,EAAOI,EAAUD,CAAK,EAE3C,OACEK,EAAAA,OAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAA,EAAAA,OAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,OAAC,IAAA,CAAE,UAAU,6BACV,SAAA,CAAAF,EAAM,IAAQC,EAAI,OAAKJ,CAAA,CAAA,EAD1B,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,EACCE,GACCG,EAAAA,OAAC,SAAA,CACC,MAAOJ,EACP,SAAWK,GAAMJ,EAAiB,SAASI,EAAE,OAAO,KAAK,CAAC,EAC1D,UAAU,sBAET,WAAkB,IAAKC,GACtBF,SAAC,SAAA,CAAkB,MAAOE,EACvB,SAAA,CAAAA,EAAK,SAAA,CAAA,EADKA,EAAb,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CACD,CAAA,EATH,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAUA,CAAA,EAfJ,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAiBA,EACCT,EAAa,GACZO,SAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,OAAC,SAAA,CACC,QAAS,IAAMN,EAAaF,EAAO,CAAC,EACpC,SAAUA,GAAQ,EAClB,UAAU,oEACX,SAAA,UAAA,EAJD,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,EAOAQ,EAAAA,OAAC,OAAA,CAAK,UAAU,mCACb,SAAA,CAAAR,EAAK,MAAIC,CAAA,CAAA,EADZ,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,EACAO,EAAAA,OAAC,SAAA,CACC,QAAS,IAAMN,EAAaF,EAAO,CAAC,EACpC,SAAUA,GAAQC,EAClB,UAAU,oEACX,SAAA,MAAA,EAJD,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAjBF,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAkBA,CAAA,CAAA,EAtCJ,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAwCA,CAEJ,CCxDO,SAASU,EAAiBC,EAA8B,CAC7D,OAAIA,EAAM,QAAU,EAAU,KAG5BJ,EAAAA,OAAC,MAAA,CAAI,UAAU,8FAA8F,MAAO,CAAE,OAAQ,qCAAA,EAC5H,SAAAA,EAAAA,OAACT,EAAA,CAAY,GAAGa,CAAA,EAAhB,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAuB,CAAA,EADzB,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAEJ"}
1
+ {"version":3,"file":"StickyPagination-Bz0C18nC.js","sources":["../../src/components/common/data/Pagination.tsx","../../src/components/common/data/StickyPagination.tsx"],"sourcesContent":["const PAGE_SIZE_OPTIONS = [10, 25, 50, 100];\n\ninterface PaginationProps {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n total: number;\n pageSize: number;\n onPageSizeChange?: (size: number) => void;\n}\n\nexport function Pagination({\n page,\n totalPages,\n onPageChange,\n total,\n pageSize,\n onPageSizeChange,\n}: PaginationProps) {\n if (total === 0) return null;\n\n const start = (page - 1) * pageSize + 1;\n const end = Math.min(page * pageSize, total);\n\n return (\n <div className=\"flex items-center justify-between pt-4\">\n <div className=\"flex items-center gap-4\">\n <p className=\"text-xs text-text-tertiary\">\n {start}&ndash;{end} of {total}\n </p>\n {onPageSizeChange && (\n <select\n value={pageSize}\n onChange={(e) => onPageSizeChange(parseInt(e.target.value))}\n className=\"select text-xs py-1\"\n >\n {PAGE_SIZE_OPTIONS.map((size) => (\n <option key={size} value={size}>\n {size} / page\n </option>\n ))}\n </select>\n )}\n </div>\n {totalPages > 1 && (\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => onPageChange(page - 1)}\n disabled={page <= 1}\n className=\"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n Previous\n </button>\n <span className=\"px-3 text-xs text-text-secondary\">\n {page} / {totalPages}\n </span>\n <button\n onClick={() => onPageChange(page + 1)}\n disabled={page >= totalPages}\n className=\"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n Next\n </button>\n </div>\n )}\n </div>\n );\n}\n","import { Pagination } from './Pagination';\n\ninterface StickyPaginationProps {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n total: number;\n pageSize: number;\n onPageSizeChange?: (size: number) => void;\n}\n\nexport function StickyPagination(props: StickyPaginationProps) {\n if (props.total === 0) return null;\n\n return (\n <div className=\"sticky bg-surface/95 backdrop-blur-sm border-t border-surface-border -mx-10 px-10 pt-2 pb-4\" style={{ bottom: 'calc(var(--feed-height, 0px) - 8px)' }}>\n <Pagination {...props} />\n </div>\n );\n}\n"],"names":["PAGE_SIZE_OPTIONS","Pagination","page","totalPages","onPageChange","total","pageSize","onPageSizeChange","start","end","jsxDEV","e","size","StickyPagination","props"],"mappings":"wCAAA,MAAMA,EAAoB,CAAC,GAAI,GAAI,GAAI,GAAG,EAWnC,SAASC,EAAW,CACzB,KAAAC,EACA,WAAAC,EACA,aAAAC,EACA,MAAAC,EACA,SAAAC,EACA,iBAAAC,CACF,EAAoB,CAClB,GAAIF,IAAU,EAAG,OAAO,KAExB,MAAMG,GAASN,EAAO,GAAKI,EAAW,EAChCG,EAAM,KAAK,IAAIP,EAAOI,EAAUD,CAAK,EAE3C,OACEK,EAAAA,OAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAA,EAAAA,OAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,OAAC,IAAA,CAAE,UAAU,6BACV,SAAA,CAAAF,EAAM,IAAQC,EAAI,OAAKJ,CAAA,CAAA,EAD1B,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,EACCE,GACCG,EAAAA,OAAC,SAAA,CACC,MAAOJ,EACP,SAAWK,GAAMJ,EAAiB,SAASI,EAAE,OAAO,KAAK,CAAC,EAC1D,UAAU,sBAET,WAAkB,IAAKC,GACtBF,SAAC,SAAA,CAAkB,MAAOE,EACvB,SAAA,CAAAA,EAAK,SAAA,CAAA,EADKA,EAAb,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CACD,CAAA,EATH,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAUA,CAAA,EAfJ,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAiBA,EACCT,EAAa,GACZO,SAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,OAAC,SAAA,CACC,QAAS,IAAMN,EAAaF,EAAO,CAAC,EACpC,SAAUA,GAAQ,EAClB,UAAU,oEACX,SAAA,UAAA,EAJD,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,EAOAQ,EAAAA,OAAC,OAAA,CAAK,UAAU,mCACb,SAAA,CAAAR,EAAK,MAAIC,CAAA,CAAA,EADZ,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,EACAO,EAAAA,OAAC,SAAA,CACC,QAAS,IAAMN,EAAaF,EAAO,CAAC,EACpC,SAAUA,GAAQC,EAClB,UAAU,oEACX,SAAA,MAAA,EAJD,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAjBF,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAkBA,CAAA,CAAA,EAtCJ,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAwCA,CAEJ,CCxDO,SAASU,EAAiBC,EAA8B,CAC7D,OAAIA,EAAM,QAAU,EAAU,KAG5BJ,EAAAA,OAAC,MAAA,CAAI,UAAU,8FAA8F,MAAO,CAAE,OAAQ,qCAAA,EAC5H,SAAAA,EAAAA,OAACT,EAAA,CAAY,GAAGa,CAAA,EAAhB,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAuB,CAAA,EADzB,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAEJ"}