@hotmeshio/long-tail 0.30.0 → 0.30.2

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 (202) hide show
  1. package/build/api/scan-codes/verb-fill.js +1 -1
  2. package/build/api/scan-codes/verb-into-subject.js +1 -1
  3. package/build/api/scan-codes/verbs-subject.js +2 -2
  4. package/dashboard/dist/assets/{AdminDashboard-Bjf_7-S6.js → AdminDashboard-NVtdLI4I.js} +2 -2
  5. package/dashboard/dist/assets/{AdminDashboard-Bjf_7-S6.js.map → AdminDashboard-NVtdLI4I.js.map} +1 -1
  6. package/dashboard/dist/assets/{AgentConfigPage-CEGk5Gbv.js → AgentConfigPage-Db1Oi72V.js} +2 -2
  7. package/dashboard/dist/assets/{AgentConfigPage-CEGk5Gbv.js.map → AgentConfigPage-Db1Oi72V.js.map} +1 -1
  8. package/dashboard/dist/assets/{AgentDetailPage-C52Oi1_f.js → AgentDetailPage-BF4mw1bD.js} +3 -3
  9. package/dashboard/dist/assets/{AgentDetailPage-C52Oi1_f.js.map → AgentDetailPage-BF4mw1bD.js.map} +1 -1
  10. package/dashboard/dist/assets/{AgentsPage-CohqxaWS.js → AgentsPage-DmF0m3Ro.js} +2 -2
  11. package/dashboard/dist/assets/{AgentsPage-CohqxaWS.js.map → AgentsPage-DmF0m3Ro.js.map} +1 -1
  12. package/dashboard/dist/assets/{AvailableEscalationsPage-DXpRnOVd.js → AvailableEscalationsPage-jy2WKDjr.js} +2 -2
  13. package/dashboard/dist/assets/{AvailableEscalationsPage-DXpRnOVd.js.map → AvailableEscalationsPage-jy2WKDjr.js.map} +1 -1
  14. package/dashboard/dist/assets/{BotPicker-DPglulL6.js → BotPicker-HJtVHdNe.js} +2 -2
  15. package/dashboard/dist/assets/{BotPicker-DPglulL6.js.map → BotPicker-HJtVHdNe.js.map} +1 -1
  16. package/dashboard/dist/assets/{BulkAssignModal-DWNR3FJJ.js → BulkAssignModal-DsJJZ9X4.js} +2 -2
  17. package/dashboard/dist/assets/{BulkAssignModal-DWNR3FJJ.js.map → BulkAssignModal-DsJJZ9X4.js.map} +1 -1
  18. package/dashboard/dist/assets/{CapabilitiesPage-ChBBD0IX.js → CapabilitiesPage-iCn7PxDP.js} +2 -2
  19. package/dashboard/dist/assets/{CapabilitiesPage-ChBBD0IX.js.map → CapabilitiesPage-iCn7PxDP.js.map} +1 -1
  20. package/dashboard/dist/assets/{CollapsibleSection-QAXKTYc6.js → CollapsibleSection-DFfVr_Ut.js} +2 -2
  21. package/dashboard/dist/assets/{CollapsibleSection-QAXKTYc6.js.map → CollapsibleSection-DFfVr_Ut.js.map} +1 -1
  22. package/dashboard/dist/assets/{ConfirmDeleteModal-J9xc_gVZ.js → ConfirmDeleteModal-D6TwO-yT.js} +2 -2
  23. package/dashboard/dist/assets/{ConfirmDeleteModal-J9xc_gVZ.js.map → ConfirmDeleteModal-D6TwO-yT.js.map} +1 -1
  24. package/dashboard/dist/assets/{ConnectedAppsPage-BKhsc_jJ.js → ConnectedAppsPage-BOD-tgY0.js} +2 -2
  25. package/dashboard/dist/assets/{ConnectedAppsPage-BKhsc_jJ.js.map → ConnectedAppsPage-BOD-tgY0.js.map} +1 -1
  26. package/dashboard/dist/assets/{CountdownTimer-C4hP64lF.js → CountdownTimer-u_o3OygV.js} +2 -2
  27. package/dashboard/dist/assets/{CountdownTimer-C4hP64lF.js.map → CountdownTimer-u_o3OygV.js.map} +1 -1
  28. package/dashboard/dist/assets/{CredentialsPage-DUfgsEbI.js → CredentialsPage-C3dnRsMh.js} +2 -2
  29. package/dashboard/dist/assets/{CredentialsPage-DUfgsEbI.js.map → CredentialsPage-C3dnRsMh.js.map} +1 -1
  30. package/dashboard/dist/assets/{CronLabel-CBc3Tvau.js → CronLabel-BFh5TCsB.js} +2 -2
  31. package/dashboard/dist/assets/{CronLabel-CBc3Tvau.js.map → CronLabel-BFh5TCsB.js.map} +1 -1
  32. package/dashboard/dist/assets/{ElapsedCell-V27Y2Ksb.js → ElapsedCell-D0jYuFKh.js} +2 -2
  33. package/dashboard/dist/assets/{ElapsedCell-V27Y2Ksb.js.map → ElapsedCell-D0jYuFKh.js.map} +1 -1
  34. package/dashboard/dist/assets/{EntityTimelinePanel-BA4MWXkB.js → EntityTimelinePanel-Ch-BsRu8.js} +2 -2
  35. package/dashboard/dist/assets/{EntityTimelinePanel-BA4MWXkB.js.map → EntityTimelinePanel-Ch-BsRu8.js.map} +1 -1
  36. package/dashboard/dist/assets/{EscalationListSchemaPage-B20HUAlO.js → EscalationListSchemaPage-DuSLiInU.js} +2 -2
  37. package/dashboard/dist/assets/{EscalationListSchemaPage-B20HUAlO.js.map → EscalationListSchemaPage-DuSLiInU.js.map} +1 -1
  38. package/dashboard/dist/assets/{EscalationSchemaPage-Cen9HGYG.js → EscalationSchemaPage-D_mYri6e.js} +2 -2
  39. package/dashboard/dist/assets/{EscalationSchemaPage-Cen9HGYG.js.map → EscalationSchemaPage-D_mYri6e.js.map} +1 -1
  40. package/dashboard/dist/assets/{EscalationTimeline-DGNgcMm0.js → EscalationTimeline-DiN8ImWF.js} +2 -2
  41. package/dashboard/dist/assets/{EscalationTimeline-DGNgcMm0.js.map → EscalationTimeline-DiN8ImWF.js.map} +1 -1
  42. package/dashboard/dist/assets/{EscalationTitleSelect-BhsflGiC.js → EscalationTitleSelect-36tkc2TE.js} +2 -2
  43. package/dashboard/dist/assets/{EscalationTitleSelect-BhsflGiC.js.map → EscalationTitleSelect-36tkc2TE.js.map} +1 -1
  44. package/dashboard/dist/assets/{EscalationsOverview-C2nc-Pgv.js → EscalationsOverview-yHY6JKiV.js} +2 -2
  45. package/dashboard/dist/assets/{EscalationsOverview-C2nc-Pgv.js.map → EscalationsOverview-yHY6JKiV.js.map} +1 -1
  46. package/dashboard/dist/assets/{EventTable-BvNxHKy1.js → EventTable-DTtu2iM_.js} +2 -2
  47. package/dashboard/dist/assets/{EventTable-BvNxHKy1.js.map → EventTable-DTtu2iM_.js.map} +1 -1
  48. package/dashboard/dist/assets/{FilterBar-22FDO0R_.js → FilterBar-ByZiD0ty.js} +2 -2
  49. package/dashboard/dist/assets/{FilterBar-22FDO0R_.js.map → FilterBar-ByZiD0ty.js.map} +1 -1
  50. package/dashboard/dist/assets/{GraphInvokePage-BAyfJ-PY.js → GraphInvokePage-Cbn6igr_.js} +2 -2
  51. package/dashboard/dist/assets/{GraphInvokePage-BAyfJ-PY.js.map → GraphInvokePage-Cbn6igr_.js.map} +1 -1
  52. package/dashboard/dist/assets/{HomePage-CtjG2kGn.js → HomePage-CtLKm_S4.js} +2 -2
  53. package/dashboard/dist/assets/{HomePage-CtjG2kGn.js.map → HomePage-CtLKm_S4.js.map} +1 -1
  54. package/dashboard/dist/assets/{LinePage-DPe-vP3-.js → LinePage-Q5Cgjd3N.js} +3 -3
  55. package/dashboard/dist/assets/{LinePage-DPe-vP3-.js.map → LinePage-Q5Cgjd3N.js.map} +1 -1
  56. package/dashboard/dist/assets/{LinesPage-BCSfYkuL.js → LinesPage-BX3d-rj0.js} +2 -2
  57. package/dashboard/dist/assets/{LinesPage-BCSfYkuL.js.map → LinesPage-BX3d-rj0.js.map} +1 -1
  58. package/dashboard/dist/assets/{ListToolbar-6siR0Hao.js → ListToolbar-bj2sgAK4.js} +2 -2
  59. package/dashboard/dist/assets/{ListToolbar-6siR0Hao.js.map → ListToolbar-bj2sgAK4.js.map} +1 -1
  60. package/dashboard/dist/assets/{McpOverview-Cbu2CXlQ.js → McpOverview-BD3UWbcC.js} +2 -2
  61. package/dashboard/dist/assets/{McpOverview-Cbu2CXlQ.js.map → McpOverview-BD3UWbcC.js.map} +1 -1
  62. package/dashboard/dist/assets/{McpQueryDetailPage--1FsnGuM.js → McpQueryDetailPage-ISzY-BfT.js} +2 -2
  63. package/dashboard/dist/assets/{McpQueryDetailPage--1FsnGuM.js.map → McpQueryDetailPage-ISzY-BfT.js.map} +1 -1
  64. package/dashboard/dist/assets/{McpQueryPage-CPUUMIiY.js → McpQueryPage-t555QJ3m.js} +2 -2
  65. package/dashboard/dist/assets/{McpQueryPage-CPUUMIiY.js.map → McpQueryPage-t555QJ3m.js.map} +1 -1
  66. package/dashboard/dist/assets/{McpRunDetailPage-BDCv-c1o.js → McpRunDetailPage-C4jozQFh.js} +2 -2
  67. package/dashboard/dist/assets/{McpRunDetailPage-BDCv-c1o.js.map → McpRunDetailPage-C4jozQFh.js.map} +1 -1
  68. package/dashboard/dist/assets/{McpRunsPage-Df4yOclO.js → McpRunsPage-Z-mtyRBp.js} +2 -2
  69. package/dashboard/dist/assets/{McpRunsPage-Df4yOclO.js.map → McpRunsPage-Z-mtyRBp.js.map} +1 -1
  70. package/dashboard/dist/assets/{OperationsPage-BYUGFgPp.js → OperationsPage-ClYilVyZ.js} +2 -2
  71. package/dashboard/dist/assets/{OperationsPage-BYUGFgPp.js.map → OperationsPage-ClYilVyZ.js.map} +1 -1
  72. package/dashboard/dist/assets/{OperatorDashboard-Dd1EhTZe.js → OperatorDashboard-3Hi2IiHi.js} +2 -2
  73. package/dashboard/dist/assets/{OperatorDashboard-Dd1EhTZe.js.map → OperatorDashboard-3Hi2IiHi.js.map} +1 -1
  74. package/dashboard/dist/assets/{PersonaDetailPage-BCx3Ey2_.js → PersonaDetailPage-xb7O3tn9.js} +2 -2
  75. package/dashboard/dist/assets/{PersonaDetailPage-BCx3Ey2_.js.map → PersonaDetailPage-xb7O3tn9.js.map} +1 -1
  76. package/dashboard/dist/assets/{PersonasPage--Ez0YeHh.js → PersonasPage-uCYVhRBB.js} +2 -2
  77. package/dashboard/dist/assets/{PersonasPage--Ez0YeHh.js.map → PersonasPage-uCYVhRBB.js.map} +1 -1
  78. package/dashboard/dist/assets/{PortalPage-BmBmheBp.js → PortalPage-D1MOMJ9Q.js} +2 -2
  79. package/dashboard/dist/assets/{PortalPage-BmBmheBp.js.map → PortalPage-D1MOMJ9Q.js.map} +1 -1
  80. package/dashboard/dist/assets/{ProcessDetailPage-DBj4VEnP.js → ProcessDetailPage-Tf8FQCUm.js} +2 -2
  81. package/dashboard/dist/assets/{ProcessDetailPage-DBj4VEnP.js.map → ProcessDetailPage-Tf8FQCUm.js.map} +1 -1
  82. package/dashboard/dist/assets/{ProcessesListPage-CD5NRIBK.js → ProcessesListPage-DPLRgznC.js} +2 -2
  83. package/dashboard/dist/assets/{ProcessesListPage-CD5NRIBK.js.map → ProcessesListPage-DPLRgznC.js.map} +1 -1
  84. package/dashboard/dist/assets/{ResolverForm-Baxwv_IG.js → ResolverForm-BXqJEPte.js} +2 -2
  85. package/dashboard/dist/assets/{ResolverForm-Baxwv_IG.js.map → ResolverForm-BXqJEPte.js.map} +1 -1
  86. package/dashboard/dist/assets/{RoleDetailPage-6ukNyycs.js → RoleDetailPage-KJnZGPPY.js} +2 -2
  87. package/dashboard/dist/assets/{RoleDetailPage-6ukNyycs.js.map → RoleDetailPage-KJnZGPPY.js.map} +1 -1
  88. package/dashboard/dist/assets/{RolesPage-DRs2XeSd.js → RolesPage-C5f-3zcs.js} +2 -2
  89. package/dashboard/dist/assets/{RolesPage-DRs2XeSd.js.map → RolesPage-C5f-3zcs.js.map} +1 -1
  90. package/dashboard/dist/assets/{RosterWidget-BPBPSa1k.js → RosterWidget-WCtpUEzc.js} +2 -2
  91. package/dashboard/dist/assets/{RosterWidget-BPBPSa1k.js.map → RosterWidget-WCtpUEzc.js.map} +1 -1
  92. package/dashboard/dist/assets/{RunAsSelector-Br9FiMwP.js → RunAsSelector-CzabsFYU.js} +2 -2
  93. package/dashboard/dist/assets/{RunAsSelector-Br9FiMwP.js.map → RunAsSelector-CzabsFYU.js.map} +1 -1
  94. package/dashboard/dist/assets/{ScanCodesPage-BXENWoZb.js → ScanCodesPage-D51d17HH.js} +2 -2
  95. package/dashboard/dist/assets/{ScanCodesPage-BXENWoZb.js.map → ScanCodesPage-D51d17HH.js.map} +1 -1
  96. package/dashboard/dist/assets/{ScanSchemeDetailPage-CaM4rUBV.js → ScanSchemeDetailPage-CUK6Skxj.js} +2 -2
  97. package/dashboard/dist/assets/{ScanSchemeDetailPage-CaM4rUBV.js.map → ScanSchemeDetailPage-CUK6Skxj.js.map} +1 -1
  98. package/dashboard/dist/assets/ScanStationPage-7vK0ddiV.js +2 -0
  99. package/dashboard/dist/assets/ScanStationPage-7vK0ddiV.js.map +1 -0
  100. package/dashboard/dist/assets/{StickyPagination-DX5CPgrX.js → StickyPagination-C2fzclxr.js} +2 -2
  101. package/dashboard/dist/assets/{StickyPagination-DX5CPgrX.js.map → StickyPagination-C2fzclxr.js.map} +1 -1
  102. package/dashboard/dist/assets/{StreamMessageDetail-3mWw3_M5.js → StreamMessageDetail-wF4NM8gi.js} +2 -2
  103. package/dashboard/dist/assets/{StreamMessageDetail-3mWw3_M5.js.map → StreamMessageDetail-wF4NM8gi.js.map} +1 -1
  104. package/dashboard/dist/assets/{SwimlaneTimeline-C_pIcWBJ.js → SwimlaneTimeline-B4Hg97qO.js} +2 -2
  105. package/dashboard/dist/assets/{SwimlaneTimeline-C_pIcWBJ.js.map → SwimlaneTimeline-B4Hg97qO.js.map} +1 -1
  106. package/dashboard/dist/assets/{TaskDetailPage-DthMVBZO.js → TaskDetailPage-DAxxcFDD.js} +2 -2
  107. package/dashboard/dist/assets/{TaskDetailPage-DthMVBZO.js.map → TaskDetailPage-DAxxcFDD.js.map} +1 -1
  108. package/dashboard/dist/assets/{TasksListPage-MtawUpuU.js → TasksListPage-BmghuHbc.js} +2 -2
  109. package/dashboard/dist/assets/{TasksListPage-MtawUpuU.js.map → TasksListPage-BmghuHbc.js.map} +1 -1
  110. package/dashboard/dist/assets/{TimeAgo-DIziYk-v.js → TimeAgo-CFeB6U2O.js} +2 -2
  111. package/dashboard/dist/assets/{TimeAgo-DIziYk-v.js.map → TimeAgo-CFeB6U2O.js.map} +1 -1
  112. package/dashboard/dist/assets/{TimestampCell-Dn5M-Eey.js → TimestampCell-M_FD9JEc.js} +2 -2
  113. package/dashboard/dist/assets/{TimestampCell-Dn5M-Eey.js.map → TimestampCell-M_FD9JEc.js.map} +1 -1
  114. package/dashboard/dist/assets/{ToolTestPanel-DaBrgPML.js → ToolTestPanel-D7PihZG9.js} +2 -2
  115. package/dashboard/dist/assets/{ToolTestPanel-DaBrgPML.js.map → ToolTestPanel-D7PihZG9.js.map} +1 -1
  116. package/dashboard/dist/assets/{TopicDetailPage-zNE3EigP.js → TopicDetailPage-T0dLt7Ao.js} +2 -2
  117. package/dashboard/dist/assets/{TopicDetailPage-zNE3EigP.js.map → TopicDetailPage-T0dLt7Ao.js.map} +1 -1
  118. package/dashboard/dist/assets/{TopicsPage-Cj0ugdie.js → TopicsPage-DP5ox5oX.js} +2 -2
  119. package/dashboard/dist/assets/{TopicsPage-Cj0ugdie.js.map → TopicsPage-DP5ox5oX.js.map} +1 -1
  120. package/dashboard/dist/assets/{UserName-t3PbLYfd.js → UserName-ET3r3u-A.js} +2 -2
  121. package/dashboard/dist/assets/{UserName-t3PbLYfd.js.map → UserName-ET3r3u-A.js.map} +1 -1
  122. package/dashboard/dist/assets/{WorkflowExecutionPage-CZ2c5QLL.js → WorkflowExecutionPage-DBq2lZ_C.js} +2 -2
  123. package/dashboard/dist/assets/{WorkflowExecutionPage-CZ2c5QLL.js.map → WorkflowExecutionPage-DBq2lZ_C.js.map} +1 -1
  124. package/dashboard/dist/assets/{WorkflowsDashboard-DLb71Sa2.js → WorkflowsDashboard-WO4cH8sU.js} +2 -2
  125. package/dashboard/dist/assets/{WorkflowsDashboard-DLb71Sa2.js.map → WorkflowsDashboard-WO4cH8sU.js.map} +1 -1
  126. package/dashboard/dist/assets/{WorkflowsOverview-Wz6RzxHJ.js → WorkflowsOverview-CJfg0rQH.js} +2 -2
  127. package/dashboard/dist/assets/{WorkflowsOverview-Wz6RzxHJ.js.map → WorkflowsOverview-CJfg0rQH.js.map} +1 -1
  128. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CcRAN_ey.js → YamlWorkflowDetailPage-C8rkvYCp.js} +2 -2
  129. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CcRAN_ey.js.map → YamlWorkflowDetailPage-C8rkvYCp.js.map} +1 -1
  130. package/dashboard/dist/assets/{YamlWorkflowsPage-B4C9fiYU.js → YamlWorkflowsPage-DHQ4ZVzM.js} +2 -2
  131. package/dashboard/dist/assets/{YamlWorkflowsPage-B4C9fiYU.js.map → YamlWorkflowsPage-DHQ4ZVzM.js.map} +1 -1
  132. package/dashboard/dist/assets/{agents-BvRjwrof.js → agents-zulmHig2.js} +2 -2
  133. package/dashboard/dist/assets/{agents-BvRjwrof.js.map → agents-zulmHig2.js.map} +1 -1
  134. package/dashboard/dist/assets/{bots-qx7qPwFo.js → bots-D4mtcPHB.js} +2 -2
  135. package/dashboard/dist/assets/{bots-qx7qPwFo.js.map → bots-D4mtcPHB.js.map} +1 -1
  136. package/dashboard/dist/assets/{capabilities-DJrUEeew.js → capabilities-rFZDH0zF.js} +2 -2
  137. package/dashboard/dist/assets/{capabilities-DJrUEeew.js.map → capabilities-rFZDH0zF.js.map} +1 -1
  138. package/dashboard/dist/assets/{controlplane-D82a5cfq.js → controlplane-INfcW_9F.js} +2 -2
  139. package/dashboard/dist/assets/{controlplane-D82a5cfq.js.map → controlplane-INfcW_9F.js.map} +1 -1
  140. package/dashboard/dist/assets/{escalation-columns-Dmm8LY_f.js → escalation-columns-8ker-czW.js} +2 -2
  141. package/dashboard/dist/assets/{escalation-columns-Dmm8LY_f.js.map → escalation-columns-8ker-czW.js.map} +1 -1
  142. package/dashboard/dist/assets/{escalation-items-C3ko1DCb.js → escalation-items-B6eDMoTN.js} +2 -2
  143. package/dashboard/dist/assets/{escalation-items-C3ko1DCb.js.map → escalation-items-B6eDMoTN.js.map} +1 -1
  144. package/dashboard/dist/assets/{index-BAxEeqfF.js → index-0LXkjZjt.js} +2 -2
  145. package/dashboard/dist/assets/{index-BAxEeqfF.js.map → index-0LXkjZjt.js.map} +1 -1
  146. package/dashboard/dist/assets/{index-f4-pKYcm.js → index-5XUBZtlv.js} +2 -2
  147. package/dashboard/dist/assets/{index-f4-pKYcm.js.map → index-5XUBZtlv.js.map} +1 -1
  148. package/dashboard/dist/assets/{index-CXnmU0TS.js → index-BcVkiaCv.js} +2 -2
  149. package/dashboard/dist/assets/{index-CXnmU0TS.js.map → index-BcVkiaCv.js.map} +1 -1
  150. package/dashboard/dist/assets/{index-C_-FoMo9.js → index-BpJ77OST.js} +2 -2
  151. package/dashboard/dist/assets/{index-C_-FoMo9.js.map → index-BpJ77OST.js.map} +1 -1
  152. package/dashboard/dist/assets/{index-BJrsQM-E.js → index-BpillEP7.js} +2 -2
  153. package/dashboard/dist/assets/{index-BJrsQM-E.js.map → index-BpillEP7.js.map} +1 -1
  154. package/dashboard/dist/assets/{index-D-vNL8Hm.js → index-CV7KmPdF.js} +2 -2
  155. package/dashboard/dist/assets/{index-D-vNL8Hm.js.map → index-CV7KmPdF.js.map} +1 -1
  156. package/dashboard/dist/assets/{index-C59ZyWOo.js → index-Cfg4TFDb.js} +2 -2
  157. package/dashboard/dist/assets/{index-C59ZyWOo.js.map → index-Cfg4TFDb.js.map} +1 -1
  158. package/dashboard/dist/assets/{index-BVxqddYr.js → index-Cg9W61lM.js} +2 -2
  159. package/dashboard/dist/assets/{index-BVxqddYr.js.map → index-Cg9W61lM.js.map} +1 -1
  160. package/dashboard/dist/assets/{index-U5gC9Xgq.js → index-ChF-l2z9.js} +2 -2
  161. package/dashboard/dist/assets/{index-U5gC9Xgq.js.map → index-ChF-l2z9.js.map} +1 -1
  162. package/dashboard/dist/assets/{index-DOkHnsLK.js → index-Cm6_Peh7.js} +2 -2
  163. package/dashboard/dist/assets/{index-DOkHnsLK.js.map → index-Cm6_Peh7.js.map} +1 -1
  164. package/dashboard/dist/assets/{index-BCSeHOZH.js → index-D-EVgGsm.js} +2 -2
  165. package/dashboard/dist/assets/{index-BCSeHOZH.js.map → index-D-EVgGsm.js.map} +1 -1
  166. package/dashboard/dist/assets/{index-CNDnGdvT.js → index-D-Fd0gQ_.js} +2 -2
  167. package/dashboard/dist/assets/{index-CNDnGdvT.js.map → index-D-Fd0gQ_.js.map} +1 -1
  168. package/dashboard/dist/assets/{index-CSr5q355.js → index-xycFf66M.js} +10 -10
  169. package/dashboard/dist/assets/index-xycFf66M.js.map +1 -0
  170. package/dashboard/dist/assets/{knowledge-i7_nXSbf.js → knowledge-_WaBsrbC.js} +2 -2
  171. package/dashboard/dist/assets/{knowledge-i7_nXSbf.js.map → knowledge-_WaBsrbC.js.map} +1 -1
  172. package/dashboard/dist/assets/{machines-DfSNshLg.js → machines-D6ig2Q8z.js} +2 -2
  173. package/dashboard/dist/assets/{machines-DfSNshLg.js.map → machines-D6ig2Q8z.js.map} +1 -1
  174. package/dashboard/dist/assets/{mcp-dCLNwcC8.js → mcp-DtWRQM1G.js} +2 -2
  175. package/dashboard/dist/assets/{mcp-dCLNwcC8.js.map → mcp-DtWRQM1G.js.map} +1 -1
  176. package/dashboard/dist/assets/{mcp-query-wmbaGRYi.js → mcp-query-vQm92kTd.js} +2 -2
  177. package/dashboard/dist/assets/{mcp-query-wmbaGRYi.js.map → mcp-query-vQm92kTd.js.map} +1 -1
  178. package/dashboard/dist/assets/{personas-B_cJA5UG.js → personas-BLxQpGNz.js} +2 -2
  179. package/dashboard/dist/assets/{personas-B_cJA5UG.js.map → personas-BLxQpGNz.js.map} +1 -1
  180. package/dashboard/dist/assets/{pipelines-ClUmuwmY.js → pipelines-ClmRtlkR.js} +2 -2
  181. package/dashboard/dist/assets/{pipelines-ClUmuwmY.js.map → pipelines-ClmRtlkR.js.map} +1 -1
  182. package/dashboard/dist/assets/{tasks-BE97GrLr.js → tasks-CVZT1pf0.js} +2 -2
  183. package/dashboard/dist/assets/{tasks-BE97GrLr.js.map → tasks-CVZT1pf0.js.map} +1 -1
  184. package/dashboard/dist/assets/{topics-Dk0Y3kZP.js → topics-rkG9-6El.js} +2 -2
  185. package/dashboard/dist/assets/{topics-Dk0Y3kZP.js.map → topics-rkG9-6El.js.map} +1 -1
  186. package/dashboard/dist/assets/{useDebouncedValue-BLGuHd_v.js → useDebouncedValue-D2aCC74y.js} +2 -2
  187. package/dashboard/dist/assets/{useDebouncedValue-BLGuHd_v.js.map → useDebouncedValue-D2aCC74y.js.map} +1 -1
  188. package/dashboard/dist/assets/{useNamespace-Cj7t8eQd.js → useNamespace-BGfkF4ej.js} +2 -2
  189. package/dashboard/dist/assets/{useNamespace-Cj7t8eQd.js.map → useNamespace-BGfkF4ej.js.map} +1 -1
  190. package/dashboard/dist/assets/{useYamlActivityEvents-C7eurSkD.js → useYamlActivityEvents-DOU0_nfZ.js} +2 -2
  191. package/dashboard/dist/assets/{useYamlActivityEvents-C7eurSkD.js.map → useYamlActivityEvents-DOU0_nfZ.js.map} +1 -1
  192. package/dashboard/dist/assets/{validate-BypZfZ8R.js → validate-bHZ917pZ.js} +2 -2
  193. package/dashboard/dist/assets/{validate-BypZfZ8R.js.map → validate-bHZ917pZ.js.map} +1 -1
  194. package/dashboard/dist/assets/{yaml-workflows-CnMKmznF.js → yaml-workflows-S7qlgdg6.js} +2 -2
  195. package/dashboard/dist/assets/{yaml-workflows-CnMKmznF.js.map → yaml-workflows-S7qlgdg6.js.map} +1 -1
  196. package/dashboard/dist/index.html +1 -1
  197. package/docs/dashboard.md +1 -1
  198. package/docs/scan-codes.md +24 -9
  199. package/package.json +1 -1
  200. package/dashboard/dist/assets/ScanStationPage-CmJKgWy_.js +0 -2
  201. package/dashboard/dist/assets/ScanStationPage-CmJKgWy_.js.map +0 -1
  202. package/dashboard/dist/assets/index-CSr5q355.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{a as h,j as e}from"./vendor-query-DvWWuNIB.js";import{aS as v,M as w,Z as $,a0 as g}from"./index-CSr5q355.js";import{F as R,a as L}from"./FilterBar-22FDO0R_.js";import{P as k}from"./PageHeader-DiGWAQlR.js";import{R as _}from"./RolePill-D3hkAdKf.js";import{u as P,L as S}from"./vendor-react-_9U4mKFr.js";import"./vendor-icons-en0_uSRD.js";function E({open:s,onClose:a}){const t=v(),[c,x]=h.useState(""),[i,j]=h.useState(s);s!==i&&(j(s),s&&(x(""),t.reset()));const n=()=>{const r=c.trim().toLowerCase();r&&t.mutate(r,{onSuccess:a})};return e.jsx(w,{open:s,onClose:a,title:"Create Role",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Role Name (required)"}),e.jsx("input",{type:"text",value:c,onChange:r=>x(r.target.value),placeholder:"e.g., reviewer",className:"input text-xs w-full",onKeyDown:r=>{r.key==="Enter"&&n()}}),e.jsx("p",{className:"text-2xs text-text-tertiary mt-1",children:"Lowercase letters, numbers, hyphens, and underscores only."})]}),t.error&&e.jsx("p",{className:"text-xs text-status-error",children:t.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:a,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:n,disabled:!c.trim()||t.isPending,className:"btn-primary text-xs",children:t.isPending?"Creating...":"Create"})]})]})})}const C="200px 160px 1fr 130px 88px 204px",m="text-text-secondary transition-colors group-hover/row:text-text-primary",o="text-2xs font-semibold uppercase tracking-widest text-text-quaternary",b=`${o} text-right flex-1 min-w-0`,p="py-2",u="py-2.5";function T(){return e.jsxs("div",{className:"grid gap-4 px-3 border-b border-surface-border bg-surface",style:{gridTemplateColumns:C},children:[e.jsx("span",{className:`${o} ${p} flex items-center pl-[18px]`,children:"Role"}),e.jsx("span",{className:`${o} ${p} flex items-center`,children:"Key"}),e.jsx("span",{className:`${o} ${p} flex items-center`,children:"Description"}),e.jsx("span",{className:`${o} ${p} flex items-center`,children:"Preceded By"}),e.jsx("span",{className:`${o} ${p} flex items-center justify-end`,children:"Members"}),e.jsxs("div",{className:"flex gap-3 items-center bg-surface-sunken px-3",children:[e.jsx("span",{className:b,children:"SLA/M"}),e.jsx("span",{className:b,children:"Target/h"}),e.jsx("span",{className:b,children:"Staff"})]})]})}const y="text-xs tabular-nums text-right flex-1 min-w-0 transition-colors";function A({role:s,onClick:a}){return e.jsxs("div",{role:"button",tabIndex:0,onClick:a,onKeyDown:t=>{(t.key==="Enter"||t.key===" ")&&a()},className:"grid gap-4 px-3 cursor-pointer group/row",style:{gridTemplateColumns:C},children:[e.jsxs("div",{className:`flex items-center gap-2.5 min-w-0 ${u}`,children:[e.jsx("span",{className:`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${s.ops_visible?"bg-status-success":"bg-surface-border"}`,title:s.ops_visible?"Visible in Operations":"Enable in role settings to show in Operations"}),e.jsx("span",{className:`text-sm truncate ${m}`,children:g(s)})]}),e.jsx("span",{className:`flex items-center text-xs font-mono truncate ${u} text-text-tertiary transition-colors group-hover/row:text-text-secondary`,children:s.role}),e.jsx("span",{className:`flex items-center min-w-0 text-xs text-text-tertiary truncate ${u} transition-colors group-hover/row:text-text-secondary`,children:s.description??""}),e.jsx("div",{className:`flex items-center min-w-0 ${u}`,onClick:t=>t.stopPropagation(),children:s.parent_role&&e.jsx(S,{to:`/admin/roles/${encodeURIComponent(s.parent_role)}`,className:"min-w-0 truncate text-text-secondary transition-colors hover:text-accent",children:e.jsx(_,{role:s.parent_role,tone:"inherit"})})}),e.jsx("span",{className:`flex items-center justify-end text-sm tabular-nums ${u} transition-colors ${m}`,children:s.user_count>0?s.user_count:""}),e.jsxs("div",{className:"flex gap-3 items-center bg-surface-sunken px-3",children:[e.jsx("span",{className:`${y} ${m}`,children:s.sla_minutes??""}),e.jsx("span",{className:`${y} ${m}`,children:s.target_per_hour??""}),e.jsx("span",{className:`${y} ${m}`,children:s.worker_count??""})]})]})}function Y(){const s=P(),{data:a,isLoading:t}=$(),[c,x]=h.useState(!1),[i,j]=h.useState(""),n=(a==null?void 0:a.roles)??[],r=h.useMemo(()=>{const l=[...n].sort((d,f)=>g(d).localeCompare(g(f)));if(!i.trim())return l;const N=i.toLowerCase();return l.filter(d=>{var f;return d.role.toLowerCase().includes(N)||g(d).toLowerCase().includes(N)||((f=d.description)==null?void 0:f.toLowerCase().includes(N))})},[n,i]);return e.jsxs("div",{children:[e.jsx(k,{title:"Roles",docsHash:"#docs:dashboard.md:roles",actions:e.jsx("button",{onClick:()=>x(!0),className:"btn-primary text-xs flex items-center gap-1.5",children:"+ Add Role"})}),!t&&n.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs(R,{children:[e.jsx(L,{label:"Search",value:i,onChange:j,placeholder:`${n.length} roles…`}),i&&r.length!==n.length&&e.jsxs("span",{className:"text-2xs text-text-quaternary tabular-nums shrink-0",children:[r.length," of ",n.length]})]}),r.length>0&&e.jsx("div",{className:"sticky top-[60px] z-10 bg-surface",children:e.jsx(T,{})})]}),t?e.jsx("div",{className:"animate-pulse space-y-3 mt-6",children:[1,2,3,4,5].map(l=>e.jsx("div",{className:"h-10 bg-surface-sunken rounded w-full"},l))}):r.length===0?e.jsx("p",{className:"text-sm text-text-tertiary mt-8",children:i?"Clear the search to see all roles.":"Create a role to get started."}):e.jsx(e.Fragment,{children:e.jsx("div",{className:"divide-y divide-surface-border/30",children:r.map(l=>e.jsx(A,{role:l,onClick:()=>s(`/admin/roles/${encodeURIComponent(l.role)}`)},l.role))})}),e.jsx(E,{open:c,onClose:()=>x(!1)})]})}export{Y as RolesPage};
2
- //# sourceMappingURL=RolesPage-DRs2XeSd.js.map
1
+ import{a as h,j as e}from"./vendor-query-DvWWuNIB.js";import{aS as v,M as w,Z as $,a0 as g}from"./index-xycFf66M.js";import{F as R,a as L}from"./FilterBar-ByZiD0ty.js";import{P as k}from"./PageHeader-DiGWAQlR.js";import{R as _}from"./RolePill-D3hkAdKf.js";import{u as P,L as S}from"./vendor-react-_9U4mKFr.js";import"./vendor-icons-en0_uSRD.js";function E({open:s,onClose:a}){const t=v(),[c,x]=h.useState(""),[i,j]=h.useState(s);s!==i&&(j(s),s&&(x(""),t.reset()));const n=()=>{const r=c.trim().toLowerCase();r&&t.mutate(r,{onSuccess:a})};return e.jsx(w,{open:s,onClose:a,title:"Create Role",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Role Name (required)"}),e.jsx("input",{type:"text",value:c,onChange:r=>x(r.target.value),placeholder:"e.g., reviewer",className:"input text-xs w-full",onKeyDown:r=>{r.key==="Enter"&&n()}}),e.jsx("p",{className:"text-2xs text-text-tertiary mt-1",children:"Lowercase letters, numbers, hyphens, and underscores only."})]}),t.error&&e.jsx("p",{className:"text-xs text-status-error",children:t.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:a,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:n,disabled:!c.trim()||t.isPending,className:"btn-primary text-xs",children:t.isPending?"Creating...":"Create"})]})]})})}const C="200px 160px 1fr 130px 88px 204px",m="text-text-secondary transition-colors group-hover/row:text-text-primary",o="text-2xs font-semibold uppercase tracking-widest text-text-quaternary",b=`${o} text-right flex-1 min-w-0`,p="py-2",u="py-2.5";function T(){return e.jsxs("div",{className:"grid gap-4 px-3 border-b border-surface-border bg-surface",style:{gridTemplateColumns:C},children:[e.jsx("span",{className:`${o} ${p} flex items-center pl-[18px]`,children:"Role"}),e.jsx("span",{className:`${o} ${p} flex items-center`,children:"Key"}),e.jsx("span",{className:`${o} ${p} flex items-center`,children:"Description"}),e.jsx("span",{className:`${o} ${p} flex items-center`,children:"Preceded By"}),e.jsx("span",{className:`${o} ${p} flex items-center justify-end`,children:"Members"}),e.jsxs("div",{className:"flex gap-3 items-center bg-surface-sunken px-3",children:[e.jsx("span",{className:b,children:"SLA/M"}),e.jsx("span",{className:b,children:"Target/h"}),e.jsx("span",{className:b,children:"Staff"})]})]})}const y="text-xs tabular-nums text-right flex-1 min-w-0 transition-colors";function A({role:s,onClick:a}){return e.jsxs("div",{role:"button",tabIndex:0,onClick:a,onKeyDown:t=>{(t.key==="Enter"||t.key===" ")&&a()},className:"grid gap-4 px-3 cursor-pointer group/row",style:{gridTemplateColumns:C},children:[e.jsxs("div",{className:`flex items-center gap-2.5 min-w-0 ${u}`,children:[e.jsx("span",{className:`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${s.ops_visible?"bg-status-success":"bg-surface-border"}`,title:s.ops_visible?"Visible in Operations":"Enable in role settings to show in Operations"}),e.jsx("span",{className:`text-sm truncate ${m}`,children:g(s)})]}),e.jsx("span",{className:`flex items-center text-xs font-mono truncate ${u} text-text-tertiary transition-colors group-hover/row:text-text-secondary`,children:s.role}),e.jsx("span",{className:`flex items-center min-w-0 text-xs text-text-tertiary truncate ${u} transition-colors group-hover/row:text-text-secondary`,children:s.description??""}),e.jsx("div",{className:`flex items-center min-w-0 ${u}`,onClick:t=>t.stopPropagation(),children:s.parent_role&&e.jsx(S,{to:`/admin/roles/${encodeURIComponent(s.parent_role)}`,className:"min-w-0 truncate text-text-secondary transition-colors hover:text-accent",children:e.jsx(_,{role:s.parent_role,tone:"inherit"})})}),e.jsx("span",{className:`flex items-center justify-end text-sm tabular-nums ${u} transition-colors ${m}`,children:s.user_count>0?s.user_count:""}),e.jsxs("div",{className:"flex gap-3 items-center bg-surface-sunken px-3",children:[e.jsx("span",{className:`${y} ${m}`,children:s.sla_minutes??""}),e.jsx("span",{className:`${y} ${m}`,children:s.target_per_hour??""}),e.jsx("span",{className:`${y} ${m}`,children:s.worker_count??""})]})]})}function Y(){const s=P(),{data:a,isLoading:t}=$(),[c,x]=h.useState(!1),[i,j]=h.useState(""),n=(a==null?void 0:a.roles)??[],r=h.useMemo(()=>{const l=[...n].sort((d,f)=>g(d).localeCompare(g(f)));if(!i.trim())return l;const N=i.toLowerCase();return l.filter(d=>{var f;return d.role.toLowerCase().includes(N)||g(d).toLowerCase().includes(N)||((f=d.description)==null?void 0:f.toLowerCase().includes(N))})},[n,i]);return e.jsxs("div",{children:[e.jsx(k,{title:"Roles",docsHash:"#docs:dashboard.md:roles",actions:e.jsx("button",{onClick:()=>x(!0),className:"btn-primary text-xs flex items-center gap-1.5",children:"+ Add Role"})}),!t&&n.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs(R,{children:[e.jsx(L,{label:"Search",value:i,onChange:j,placeholder:`${n.length} roles…`}),i&&r.length!==n.length&&e.jsxs("span",{className:"text-2xs text-text-quaternary tabular-nums shrink-0",children:[r.length," of ",n.length]})]}),r.length>0&&e.jsx("div",{className:"sticky top-[60px] z-10 bg-surface",children:e.jsx(T,{})})]}),t?e.jsx("div",{className:"animate-pulse space-y-3 mt-6",children:[1,2,3,4,5].map(l=>e.jsx("div",{className:"h-10 bg-surface-sunken rounded w-full"},l))}):r.length===0?e.jsx("p",{className:"text-sm text-text-tertiary mt-8",children:i?"Clear the search to see all roles.":"Create a role to get started."}):e.jsx(e.Fragment,{children:e.jsx("div",{className:"divide-y divide-surface-border/30",children:r.map(l=>e.jsx(A,{role:l,onClick:()=>s(`/admin/roles/${encodeURIComponent(l.role)}`)},l.role))})}),e.jsx(E,{open:c,onClose:()=>x(!1)})]})}export{Y as RolesPage};
2
+ //# sourceMappingURL=RolesPage-C5f-3zcs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RolesPage-DRs2XeSd.js","sources":["../../src/pages/admin/roles/CreateRoleModal.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-2xs 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-2xs 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 { useNavigate, Link } from 'react-router-dom';\nimport { useRoleDetails, type RoleDetail } from '../../../api/roles';\nimport { FilterBar, FilterInput } from '../../../components/common/data/FilterBar';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { displayRoleTitle } from '../../../lib/role-display';\nimport { CreateRoleModal } from './CreateRoleModal';\n\n// ── Grid columns ──────────────────────────────────────────────────────────────\n// ROLE(dot+display name, 200px) | KEY(160px) | DESCRIPTION(1fr) | PRECEDED BY(130px) | MEMBERS(88px) | CAPACITY(204px)\n// The display name leads (user-set title, else Title Case derived from the\n// key — same formatter the Pace Board uses); the exact key is the secondary\n// field. The capacity block is a single combined cell that internally renders\n// SLA/m · Target/h · Staff flush to row edges.\nconst GRID = '200px 160px 1fr 130px 88px 204px';\n\nconst CELL_TEXT = 'text-text-secondary transition-colors group-hover/row:text-text-primary';\n// Header/cell sizes match the app's list standard (DataTable): text-2xs\n// headers, text-sm body cells.\nconst HDR = 'text-2xs font-semibold uppercase tracking-widest text-text-quaternary';\n\n// ── Table header ──────────────────────────────────────────────────────────────\n\nconst CAPACITY_COL_LABEL = `${HDR} text-right flex-1 min-w-0`;\n\n// py lives on each cell, not the grid — lets the capacity div stretch flush to row edges\nconst CELL_PY = 'py-2';\nconst ROW_PY = 'py-2.5';\n\nfunction TableHead() {\n return (\n <div\n className=\"grid gap-4 px-3 border-b border-surface-border bg-surface\"\n style={{ gridTemplateColumns: GRID }}\n >\n <span className={`${HDR} ${CELL_PY} flex items-center pl-[18px]`}>Role</span>\n <span className={`${HDR} ${CELL_PY} flex items-center`}>Key</span>\n <span className={`${HDR} ${CELL_PY} flex items-center`}>Description</span>\n <span className={`${HDR} ${CELL_PY} flex items-center`}>Preceded By</span>\n <span className={`${HDR} ${CELL_PY} flex items-center justify-end`}>Members</span>\n {/* Capacity block — no py, stretches to full row height by default (grid stretch alignment) */}\n <div className=\"flex gap-3 items-center bg-surface-sunken px-3\">\n <span className={CAPACITY_COL_LABEL}>SLA/M</span>\n <span className={CAPACITY_COL_LABEL}>Target/h</span>\n <span className={CAPACITY_COL_LABEL}>Staff</span>\n </div>\n </div>\n );\n}\n\n// ── Role row ──────────────────────────────────────────────────────────────────\n\nconst CAPACITY_COL_VAL = 'text-xs tabular-nums text-right flex-1 min-w-0 transition-colors';\n\nfunction RoleRow({\n role,\n onClick,\n}: {\n role: RoleDetail;\n onClick: () => void;\n}) {\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onClick(); }}\n className=\"grid gap-4 px-3 cursor-pointer group/row\"\n style={{ gridTemplateColumns: GRID }}\n >\n {/* ROLE — ops status circle inline with the display name (user-set\n title, else Title Case derived from the key) */}\n <div className={`flex items-center gap-2.5 min-w-0 ${ROW_PY}`}>\n <span\n className={`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${role.ops_visible ? 'bg-status-success' : 'bg-surface-border'}`}\n title={role.ops_visible ? 'Visible in Operations' : 'Enable in role settings to show in Operations'}\n />\n <span className={`text-sm truncate ${CELL_TEXT}`}>\n {displayRoleTitle(role)}\n </span>\n </div>\n\n {/* KEY — the exact technical id */}\n <span className={`flex items-center text-xs font-mono truncate ${ROW_PY} text-text-tertiary transition-colors group-hover/row:text-text-secondary`}>\n {role.role}\n </span>\n\n {/* DESCRIPTION — min-w-0 lets the 1fr grid cell shrink so truncate can\n actually render its ellipsis */}\n <span className={`flex items-center min-w-0 text-xs text-text-tertiary truncate ${ROW_PY} transition-colors group-hover/row:text-text-secondary`}>\n {role.description ?? ''}\n </span>\n\n {/* PRECEDED BY — the universal role pill (inbox + key), linked */}\n <div className={`flex items-center min-w-0 ${ROW_PY}`} onClick={(e) => e.stopPropagation()}>\n {role.parent_role && (\n <Link\n to={`/admin/roles/${encodeURIComponent(role.parent_role)}`}\n className=\"min-w-0 truncate text-text-secondary transition-colors hover:text-accent\"\n >\n <RolePill role={role.parent_role} tone=\"inherit\" />\n </Link>\n )}\n </div>\n\n {/* MEMBER COUNT — unset renders empty, not invisible text (screen\n readers and copy/paste see exactly what the eye sees) */}\n <span className={`flex items-center justify-end text-sm tabular-nums ${ROW_PY} transition-colors ${CELL_TEXT}`}>\n {role.user_count > 0 ? role.user_count : ''}\n </span>\n\n {/* SLA/m · Target/h · Staff — no py: stretches flush to full row height */}\n <div className=\"flex gap-3 items-center bg-surface-sunken px-3\">\n <span className={`${CAPACITY_COL_VAL} ${CELL_TEXT}`}>\n {role.sla_minutes ?? ''}\n </span>\n <span className={`${CAPACITY_COL_VAL} ${CELL_TEXT}`}>\n {role.target_per_hour ?? ''}\n </span>\n <span className={`${CAPACITY_COL_VAL} ${CELL_TEXT}`}>\n {role.worker_count ?? ''}\n </span>\n </div>\n </div>\n );\n}\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function RolesPage() {\n const navigate = useNavigate();\n const { data, isLoading } = useRoleDetails();\n const [showCreate, setShowCreate] = useState(false);\n const [search, setSearch] = useState('');\n\n const roles = data?.roles ?? [];\n\n // Rows lead with the display name, so they sort by it — and the search\n // matches it too (a derived \"Cad Designer\" is findable even when no title\n // is set).\n const filtered = useMemo(() => {\n const sorted = [...roles].sort((a, b) => displayRoleTitle(a).localeCompare(displayRoleTitle(b)));\n if (!search.trim()) return sorted;\n const q = search.toLowerCase();\n return sorted.filter(\n (r) =>\n r.role.toLowerCase().includes(q) ||\n displayRoleTitle(r).toLowerCase().includes(q) ||\n r.description?.toLowerCase().includes(q),\n );\n }, [roles, search]);\n\n return (\n <div>\n <PageHeader\n title=\"Roles\"\n docsHash=\"#docs:dashboard.md:roles\"\n actions={\n <button\n onClick={() => setShowCreate(true)}\n className=\"btn-primary text-xs flex items-center gap-1.5\"\n >\n + Add Role\n </button>\n }\n />\n\n {/* The standard full-width sticky filter band; the table header pins\n just beneath it on the shared 60px offset. */}\n {!isLoading && roles.length > 0 && (\n <>\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={search}\n onChange={setSearch}\n placeholder={`${roles.length} roles…`}\n />\n {search && filtered.length !== roles.length && (\n <span className=\"text-2xs text-text-quaternary tabular-nums shrink-0\">\n {filtered.length} of {roles.length}\n </span>\n )}\n </FilterBar>\n {filtered.length > 0 && (\n <div className=\"sticky top-[60px] z-10 bg-surface\">\n <TableHead />\n </div>\n )}\n </>\n )}\n\n {/* Table */}\n {isLoading ? (\n <div className=\"animate-pulse space-y-3 mt-6\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} className=\"h-10 bg-surface-sunken rounded w-full\" />\n ))}\n </div>\n ) : filtered.length === 0 ? (\n <p className=\"text-sm text-text-tertiary mt-8\">\n {search ? 'Clear the search to see all roles.' : 'Create a role to get started.'}\n </p>\n ) : (\n <>\n <div className=\"divide-y divide-surface-border/30\">\n {filtered.map((role) => (\n <RoleRow\n key={role.role}\n role={role}\n onClick={() => navigate(`/admin/roles/${encodeURIComponent(role.role)}`)}\n />\n ))}\n </div>\n </>\n )}\n\n <CreateRoleModal open={showCreate} onClose={() => setShowCreate(false)} />\n </div>\n );\n}\n"],"names":["CreateRoleModal","open","onClose","createRole","useCreateRole","roleName","setRoleName","useState","prevOpen","setPrevOpen","handleCreate","trimmed","jsx","Modal","jsxs","e","GRID","CELL_TEXT","HDR","CAPACITY_COL_LABEL","CELL_PY","ROW_PY","TableHead","CAPACITY_COL_VAL","RoleRow","role","onClick","displayRoleTitle","Link","RolePill","RolesPage","navigate","useNavigate","data","isLoading","useRoleDetails","showCreate","setShowCreate","search","setSearch","roles","filtered","useMemo","sorted","a","b","q","r","_a","PageHeader","Fragment","FilterBar","FilterInput","i"],"mappings":"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"}
1
+ {"version":3,"file":"RolesPage-C5f-3zcs.js","sources":["../../src/pages/admin/roles/CreateRoleModal.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-2xs 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-2xs 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 { useNavigate, Link } from 'react-router-dom';\nimport { useRoleDetails, type RoleDetail } from '../../../api/roles';\nimport { FilterBar, FilterInput } from '../../../components/common/data/FilterBar';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { displayRoleTitle } from '../../../lib/role-display';\nimport { CreateRoleModal } from './CreateRoleModal';\n\n// ── Grid columns ──────────────────────────────────────────────────────────────\n// ROLE(dot+display name, 200px) | KEY(160px) | DESCRIPTION(1fr) | PRECEDED BY(130px) | MEMBERS(88px) | CAPACITY(204px)\n// The display name leads (user-set title, else Title Case derived from the\n// key — same formatter the Pace Board uses); the exact key is the secondary\n// field. The capacity block is a single combined cell that internally renders\n// SLA/m · Target/h · Staff flush to row edges.\nconst GRID = '200px 160px 1fr 130px 88px 204px';\n\nconst CELL_TEXT = 'text-text-secondary transition-colors group-hover/row:text-text-primary';\n// Header/cell sizes match the app's list standard (DataTable): text-2xs\n// headers, text-sm body cells.\nconst HDR = 'text-2xs font-semibold uppercase tracking-widest text-text-quaternary';\n\n// ── Table header ──────────────────────────────────────────────────────────────\n\nconst CAPACITY_COL_LABEL = `${HDR} text-right flex-1 min-w-0`;\n\n// py lives on each cell, not the grid — lets the capacity div stretch flush to row edges\nconst CELL_PY = 'py-2';\nconst ROW_PY = 'py-2.5';\n\nfunction TableHead() {\n return (\n <div\n className=\"grid gap-4 px-3 border-b border-surface-border bg-surface\"\n style={{ gridTemplateColumns: GRID }}\n >\n <span className={`${HDR} ${CELL_PY} flex items-center pl-[18px]`}>Role</span>\n <span className={`${HDR} ${CELL_PY} flex items-center`}>Key</span>\n <span className={`${HDR} ${CELL_PY} flex items-center`}>Description</span>\n <span className={`${HDR} ${CELL_PY} flex items-center`}>Preceded By</span>\n <span className={`${HDR} ${CELL_PY} flex items-center justify-end`}>Members</span>\n {/* Capacity block — no py, stretches to full row height by default (grid stretch alignment) */}\n <div className=\"flex gap-3 items-center bg-surface-sunken px-3\">\n <span className={CAPACITY_COL_LABEL}>SLA/M</span>\n <span className={CAPACITY_COL_LABEL}>Target/h</span>\n <span className={CAPACITY_COL_LABEL}>Staff</span>\n </div>\n </div>\n );\n}\n\n// ── Role row ──────────────────────────────────────────────────────────────────\n\nconst CAPACITY_COL_VAL = 'text-xs tabular-nums text-right flex-1 min-w-0 transition-colors';\n\nfunction RoleRow({\n role,\n onClick,\n}: {\n role: RoleDetail;\n onClick: () => void;\n}) {\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onClick(); }}\n className=\"grid gap-4 px-3 cursor-pointer group/row\"\n style={{ gridTemplateColumns: GRID }}\n >\n {/* ROLE — ops status circle inline with the display name (user-set\n title, else Title Case derived from the key) */}\n <div className={`flex items-center gap-2.5 min-w-0 ${ROW_PY}`}>\n <span\n className={`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${role.ops_visible ? 'bg-status-success' : 'bg-surface-border'}`}\n title={role.ops_visible ? 'Visible in Operations' : 'Enable in role settings to show in Operations'}\n />\n <span className={`text-sm truncate ${CELL_TEXT}`}>\n {displayRoleTitle(role)}\n </span>\n </div>\n\n {/* KEY — the exact technical id */}\n <span className={`flex items-center text-xs font-mono truncate ${ROW_PY} text-text-tertiary transition-colors group-hover/row:text-text-secondary`}>\n {role.role}\n </span>\n\n {/* DESCRIPTION — min-w-0 lets the 1fr grid cell shrink so truncate can\n actually render its ellipsis */}\n <span className={`flex items-center min-w-0 text-xs text-text-tertiary truncate ${ROW_PY} transition-colors group-hover/row:text-text-secondary`}>\n {role.description ?? ''}\n </span>\n\n {/* PRECEDED BY — the universal role pill (inbox + key), linked */}\n <div className={`flex items-center min-w-0 ${ROW_PY}`} onClick={(e) => e.stopPropagation()}>\n {role.parent_role && (\n <Link\n to={`/admin/roles/${encodeURIComponent(role.parent_role)}`}\n className=\"min-w-0 truncate text-text-secondary transition-colors hover:text-accent\"\n >\n <RolePill role={role.parent_role} tone=\"inherit\" />\n </Link>\n )}\n </div>\n\n {/* MEMBER COUNT — unset renders empty, not invisible text (screen\n readers and copy/paste see exactly what the eye sees) */}\n <span className={`flex items-center justify-end text-sm tabular-nums ${ROW_PY} transition-colors ${CELL_TEXT}`}>\n {role.user_count > 0 ? role.user_count : ''}\n </span>\n\n {/* SLA/m · Target/h · Staff — no py: stretches flush to full row height */}\n <div className=\"flex gap-3 items-center bg-surface-sunken px-3\">\n <span className={`${CAPACITY_COL_VAL} ${CELL_TEXT}`}>\n {role.sla_minutes ?? ''}\n </span>\n <span className={`${CAPACITY_COL_VAL} ${CELL_TEXT}`}>\n {role.target_per_hour ?? ''}\n </span>\n <span className={`${CAPACITY_COL_VAL} ${CELL_TEXT}`}>\n {role.worker_count ?? ''}\n </span>\n </div>\n </div>\n );\n}\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function RolesPage() {\n const navigate = useNavigate();\n const { data, isLoading } = useRoleDetails();\n const [showCreate, setShowCreate] = useState(false);\n const [search, setSearch] = useState('');\n\n const roles = data?.roles ?? [];\n\n // Rows lead with the display name, so they sort by it — and the search\n // matches it too (a derived \"Cad Designer\" is findable even when no title\n // is set).\n const filtered = useMemo(() => {\n const sorted = [...roles].sort((a, b) => displayRoleTitle(a).localeCompare(displayRoleTitle(b)));\n if (!search.trim()) return sorted;\n const q = search.toLowerCase();\n return sorted.filter(\n (r) =>\n r.role.toLowerCase().includes(q) ||\n displayRoleTitle(r).toLowerCase().includes(q) ||\n r.description?.toLowerCase().includes(q),\n );\n }, [roles, search]);\n\n return (\n <div>\n <PageHeader\n title=\"Roles\"\n docsHash=\"#docs:dashboard.md:roles\"\n actions={\n <button\n onClick={() => setShowCreate(true)}\n className=\"btn-primary text-xs flex items-center gap-1.5\"\n >\n + Add Role\n </button>\n }\n />\n\n {/* The standard full-width sticky filter band; the table header pins\n just beneath it on the shared 60px offset. */}\n {!isLoading && roles.length > 0 && (\n <>\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={search}\n onChange={setSearch}\n placeholder={`${roles.length} roles…`}\n />\n {search && filtered.length !== roles.length && (\n <span className=\"text-2xs text-text-quaternary tabular-nums shrink-0\">\n {filtered.length} of {roles.length}\n </span>\n )}\n </FilterBar>\n {filtered.length > 0 && (\n <div className=\"sticky top-[60px] z-10 bg-surface\">\n <TableHead />\n </div>\n )}\n </>\n )}\n\n {/* Table */}\n {isLoading ? (\n <div className=\"animate-pulse space-y-3 mt-6\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} className=\"h-10 bg-surface-sunken rounded w-full\" />\n ))}\n </div>\n ) : filtered.length === 0 ? (\n <p className=\"text-sm text-text-tertiary mt-8\">\n {search ? 'Clear the search to see all roles.' : 'Create a role to get started.'}\n </p>\n ) : (\n <>\n <div className=\"divide-y divide-surface-border/30\">\n {filtered.map((role) => (\n <RoleRow\n key={role.role}\n role={role}\n onClick={() => navigate(`/admin/roles/${encodeURIComponent(role.role)}`)}\n />\n ))}\n </div>\n </>\n )}\n\n <CreateRoleModal open={showCreate} onClose={() => setShowCreate(false)} />\n </div>\n );\n}\n"],"names":["CreateRoleModal","open","onClose","createRole","useCreateRole","roleName","setRoleName","useState","prevOpen","setPrevOpen","handleCreate","trimmed","jsx","Modal","jsxs","e","GRID","CELL_TEXT","HDR","CAPACITY_COL_LABEL","CELL_PY","ROW_PY","TableHead","CAPACITY_COL_VAL","RoleRow","role","onClick","displayRoleTitle","Link","RolePill","RolesPage","navigate","useNavigate","data","isLoading","useRoleDetails","showCreate","setShowCreate","search","setSearch","roles","filtered","useMemo","sorted","a","b","q","r","_a","PageHeader","Fragment","FilterBar","FilterInput","i"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as a,a as v,d as ot}from"./vendor-query-DvWWuNIB.js";import{bK as at,aL as it,bp as lt,bI as ct}from"./vendor-icons-en0_uSRD.js";import{L as ut}from"./vendor-react-_9U4mKFr.js";import{bl as dt,bm as ft,bn as pt,bo as xt,ax as mt,bp as U}from"./index-CSr5q355.js";import{g as w,H as bt,a as R,F as gt,j as yt,f as ht}from"./escalation-items-C3ko1DCb.js";const At=/\{\{\s*([^{}]+?)\s*\}\}/g;function ue(t){return typeof t=="string"&&/\{\{[^{}]+\}\}/.test(t)}function F(t,e){if(!e)return;const s=t.indexOf("."),n=e[s===-1?t:t.slice(0,s)];if(s===-1)return n;if(!(n===null||typeof n!="object"))return w(n,t.slice(s+1))}function de(t,e){let s=!1;const n=t.replace(At,(r,o)=>{const i=F(o,e);return typeof i=="string"&&i.trim().length>0?i:typeof i=="number"&&Number.isFinite(i)?String(i):(s=!0,"")});return s?null:n}function W(t){return t!=null&&t!==""&&t!==!1&&t!==0}function Et(t){return t==null?"":typeof t=="object"?JSON.stringify(t):String(t)}function M(t,e){const s=t.indexOf("."),n=s===-1?t:t.slice(0,s);if(!bt.includes(n))return{known:!1,value:void 0};const r=e[n];if(s===-1)return{known:!0,value:r};try{return{known:!0,value:w(r,t.slice(s+1))}}catch{return{known:!0,value:void 0}}}function X(t,e){if(Array.isArray(t))return t.every(l=>X(l,e));if(typeof t!="string"||t.length===0||!e)return!0;const s=t.startsWith("!"),n=s?t.slice(1):t,r=n.indexOf("!="),o=n.indexOf("=");if(r!==-1||o!==-1&&o!==r+1){const l=r!==-1&&(o===-1||r<o),u=l?r:o,m=n.slice(0,u).trim(),b=n.slice(u+(l?2:1)).trim(),{known:h,value:k}=M(m,e);if(!h)return!0;const y=Et(k)===b,f=l?!y:y;return s?!f:f}const{known:i,value:c}=M(n,e);return i?s?!W(c):W(c):!0}function fe(t,e){return(t==null?void 0:t["x-lt-hide-if-empty"])!==!0?!1:e==null||e===""||e===!1||e===0}const Nt="x-lt-hidden";function pe(t){return(t==null?void 0:t[Nt])===!0}function wt({children:t,isRequired:e,htmlFor:s}){return a.jsxs("label",{htmlFor:s,className:"block text-2xs font-semibold uppercase tracking-wider text-text-secondary",children:[t,e&&a.jsx("span",{className:"text-status-error ml-0.5",children:"*"})]})}function kt({id:t,children:e}){return a.jsx("p",{id:t,className:"text-2xs text-text-tertiary mt-0.5 leading-snug",children:e})}function xe({error:t,id:e}){return t?a.jsx("p",{id:e,role:"alert",className:"text-2xs text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]",children:t}):null}function me(t){return t?"input text-sm w-full mt-1 border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]":"input text-sm w-full mt-1"}function be(t){return t?"select text-sm mt-1 min-w-[min(16rem,100%)] max-w-full border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]":"select text-sm mt-1 min-w-[min(16rem,100%)] max-w-full"}function jt({to:t,className:e=""}){return a.jsxs(ut,{to:t,title:"View details",tabIndex:-1,className:`inline-flex items-center justify-center w-6 h-6 shrink-0 rounded border border-surface-border text-accent/70 hover:text-accent hover:border-accent/60 hover:bg-accent/5 transition-colors ${e}`,children:[a.jsx(at,{className:"w-3.5 h-3.5",strokeWidth:2}),a.jsx("span",{className:"sr-only",children:"View details"})]})}function vt({message:t,onConfirm:e,onCancel:s,testId:n}){return a.jsxs("span",{className:"inline-flex flex-wrap items-center gap-2",role:"group","aria-label":"Confirm action","data-testid":n,children:[a.jsx("span",{className:"text-xs text-text-primary whitespace-normal",children:t}),a.jsx("button",{type:"button",onClick:e,className:"px-2 py-0.5 text-2xs font-medium text-text-inverse bg-accent rounded hover:bg-accent/90 transition-colors","data-testid":n?`${n}-yes`:void 0,autoFocus:!0,children:"Confirm"}),a.jsx("button",{type:"button",onClick:s,className:"px-2 py-0.5 text-2xs font-medium text-text-secondary border border-surface-border rounded hover:bg-surface-hover transition-colors","data-testid":n?`${n}-no`:void 0,children:"Cancel"})]})}const _t=(t,e,s)=>{s!=null&&s.badge||e()},Tt=v.createContext(_t);function Ct(){return v.useContext(Tt)}function Rt({label:t,onConfirm:e,onCancel:s,testId:n}){const[r,o]=v.useState(""),i=()=>{r.trim()&&e(r.trim())};return a.jsxs("span",{className:"inline-flex flex-wrap items-center gap-2",role:"group","aria-label":t,"data-testid":n,[ft]:dt,children:[a.jsx("input",{type:"text",inputMode:"numeric",value:r,onChange:c=>o(c.target.value),onKeyDown:c=>{c.key==="Enter"&&i(),c.key==="Escape"&&s()},placeholder:"Code on the label","aria-label":"Code on the label",className:"input text-xs py-0.5 w-40 font-mono","data-testid":n?`${n}-input`:void 0,autoFocus:!0}),a.jsx("button",{type:"button",onClick:i,disabled:!r.trim(),className:"px-2 py-0.5 text-2xs font-medium text-text-inverse bg-accent rounded hover:bg-accent/90 disabled:opacity-40 disabled:cursor-not-allowed transition-colors","data-testid":n?`${n}-yes`:void 0,children:t}),a.jsx("button",{type:"button",onClick:s,className:"px-2 py-0.5 text-2xs font-medium text-text-secondary border border-surface-border rounded hover:bg-surface-hover transition-colors","data-testid":n?`${n}-no`:void 0,children:"Cancel"})]})}const Ft="x-lt-roster",Lt=200,H="items",Ot="any",x={WAITING:"waiting",IN:"in",FLAGGED:"flagged"},It="{{escalation.id}}",Y="—",J="batch_keys",P="batch_pending",St="batch_flags",Gt="accumulate_keys";function g(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function E(t){return typeof t=="string"?t?[t]:[]:Array.isArray(t)?t.filter(e=>typeof e=="string"&&e.length>0):[]}function z(t){const e=t==null?void 0:t[Ft];if(!g(e)||!g(e.expected))return;const s=e.expected;return g(s.query)||typeof s.list=="string"||s.batch===!0?e:void 0}function Dt(t){const e=g(t==null?void 0:t.properties)?t.properties:{},s={};for(const[n,r]of Object.entries(e)){const o=g(r)?z(r):void 0;o&&(s[n]=o)}return s}function $t(t){return"query"in t.expected&&g(t.expected.query)?t.expected.query:null}function Ut(t,e){const s={};for(const[o,i]of Object.entries(t.facets??{})){if(typeof i!="string")continue;const c=R(i,e);if(!c||c===Y)return null;s[o]=c}const n=[...t.role?[t.role]:[],...E(t.roles)];if(!n.length&&!Object.keys(s).length)return null;const r=t.status&&t.status!==Ot?t.status:void 0;return{...n.length?{roles:n}:{},facets:s,...r?{status:r}:{},limit:Lt}}function T(t){if(g(t))return t;if(typeof t!="string"||!t)return null;try{const e=JSON.parse(t);return g(e)?e:null}catch{return null}}function Wt(t){return{escalation:t,metadata:g(t.metadata)?t.metadata:T(t.metadata),envelope:T(t.envelope),payload:T(t.escalation_payload),resolver:T(t.resolver_payload)}}function Mt(t){const e=t.metadata??{},s=e[Gt];if(Array.isArray(s))return new Set(E(s));const n=w(t.envelope,"accumulate_items");if(g(n))return new Set(Object.keys(n));if(Array.isArray(e[P])){const r=new Set(E(e[P]));return new Set(E(e[J]).filter(o=>!r.has(o)))}return new Set}function Ht(t,e){if(!e)return t;const s=new Map;return t.flatMap(n=>{const r=(s.get(n)??0)+1;return s.set(n,r),[n,`${n}${e}${r}`]})}function Pt(t,e){const s=new Set,n=typeof t.countedBy=="string"&&t.countedBy?t.countedBy:void 0;for(const r of t.in??[H])(r===H?[...Mt(e)]:Ht(E(F(r,e)),n)).forEach(i=>s.add(i));return s}function Bt(t,e){const s=w(t.envelope,St),n=g(s)?s[e]:void 0;return g(n)&&typeof n.label=="string"&&n.label?n.label:void 0}function Vt(t,e){if(e)for(const s of t.flagged??[]){const n=E(s.when);if(!(!n.length||typeof s.label!="string")&&X(n,e))return s.label}}function B(t){const e=t.escalation.created_at,s=e instanceof Date?e.getTime():typeof e=="string"?Date.parse(e):NaN;return Number.isNaN(s)?0:s}function Kt(t,e,s){var c;const n=new Set,r=[],o=(l,u={})=>{!l||l===Y||n.has(l)||(n.add(l),r.push({key:l,...u}))},i=t.expected;if("query"in i){const l=t.key??It,u=new Map;for(const m of s){const b=R(l,m),h=u.get(b);(!h||B(m)>B(h))&&u.set(b,m)}for(const m of s){const b=R(l,m);o(b,{row:u.get(b)})}}else if("list"in i)E(F(i.list,e)).forEach(l=>o(l));else{const l=i.labels?F(i.labels,e):void 0;for(const u of E((c=e.metadata)==null?void 0:c[J]))o(u,g(l)&&u in l?{label:l[u]}:{})}return r}function V(t,e,s=[]){const n=Pt(t,e),r="batch"in t.expected,o=Kt(t,e,s).map(l=>{if(n.has(l.key))return{...l,state:x.IN};const u=r?Bt(e,l.key):Vt(t,l.row);return u?{...l,state:x.FLAGGED,flag:u}:{...l,state:x.WAITING}}),i=l=>o.filter(u=>u.state===l).length,c=i(x.WAITING);return{entries:o,counts:{expected:o.length,in:i(x.IN),flagged:i(x.FLAGGED),waiting:c,outstanding:c}}}function qt(t){const{counts:e}=t,s=[`${e.in} of ${e.expected} in`],n=new Map;for(const r of t.entries)r.state===x.FLAGGED&&r.flag&&n.set(r.flag,(n.get(r.flag)??0)+1);for(const[r,o]of n)s.push(`${o} ${r}`);return s.join(" · ")}const K={waiting:"Waiting",in:"In",flagged:"Flagged"};function Qt({state:t}){return t===x.IN?a.jsx(it,{className:"w-4 h-4 text-status-success shrink-0",strokeWidth:2,"aria-hidden":!0}):t===x.FLAGGED?a.jsx(lt,{className:"w-4 h-4 text-status-warning shrink-0",strokeWidth:2,"aria-hidden":!0}):a.jsx(ct,{className:"w-4 h-4 text-text-tertiary shrink-0",strokeWidth:2,"aria-hidden":!0})}function Xt({entry:t,item:e,hostCtx:s,columns:n,offered:r,asking:o,pending:i,error:c,onAction:l,onConfirm:u,onCancel:m}){var y;const b=t.row??s,h=t.state===x.IN,k=t.state===x.FLAGGED?t.flag??K.flagged:K[t.state];return a.jsxs("li",{className:"py-2 flex items-start gap-3 border-b border-surface-border/50 last:border-0","data-testid":`roster-entry-${t.key}`,"data-state":t.state,children:[a.jsx("span",{className:"pt-0.5",children:a.jsx(Qt,{state:t.state})}),a.jsx("div",{className:"min-w-0 flex-1 flex flex-wrap items-baseline gap-x-4 gap-y-0.5",children:n.map(f=>a.jsxs("span",{className:`text-sm min-w-0 ${h?"text-text-secondary":"text-text-primary"}`,children:[a.jsxs("span",{className:"sr-only",children:[f.label,": "]}),a.jsx(gt,{raw:yt(f.value,e,b),format:f.format})]},f.label))}),a.jsx("span",{className:`text-xs font-medium shrink-0 pt-0.5 ${h?"text-status-success":t.state===x.FLAGGED?"text-status-warning":"text-text-tertiary"}`,"data-testid":`roster-state-${t.key}`,children:k}),(r.length>0||o||c)&&a.jsxs("span",{className:"shrink-0 flex flex-col items-end gap-0.5",children:[(y=o==null?void 0:o.action.fill)!=null&&y.enterCode?a.jsx(Rt,{label:o.action.label,onConfirm:f=>u(f),onCancel:m,testId:`roster-code-${t.key}`}):o?a.jsx(vt,{message:R(o.action.confirm??"",b),onConfirm:()=>u(),onCancel:m,testId:`roster-confirm-${t.key}`}):a.jsx("span",{className:"flex gap-1",children:r.map(f=>a.jsx("button",{type:"button",onClick:()=>l(f),disabled:i,className:"px-2 py-0.5 text-2xs font-medium text-accent border border-accent/40 rounded hover:bg-accent/10 disabled:opacity-40 disabled:cursor-not-allowed transition-colors","data-testid":`roster-action-${t.key}`,children:f.action.label},f.index))}),c&&a.jsx("span",{className:"text-2xs text-status-error max-w-[16rem] text-right","data-testid":`roster-error-${t.key}`,children:c})]}),t.row&&a.jsx(jt,{to:`/escalations/detail/${String(t.row.escalation.id)}`})]})}function Yt(t,e){const s=$t(t),n=s?Ut(s,e):null;return n?{roles:n.roles,status:n.status,facets:n.facets,limit:n.limit,include:ht({key:t.key,flagged:t.flagged})?"envelope":void 0}:null}function Jt(t,e){const s=Object.entries(Dt(t)),n=e??{},r=s.map(([,c])=>Yt(c,n)),o=ot({queries:r.map(c=>({...pt(c??{}),enabled:!!c}))}),i={};return s.forEach(([c,l],u)=>{if(!r[u]){i[c]=V(l,n);return}const m=o[u];if(!m.isSuccess){i[c]=null;return}const b=m.data.escalations.map(h=>Wt(h));i[c]=V(l,n,b)}),i}function ge(t){const e=Object.entries(t).filter(([,s])=>s!==null);return e.length?Object.fromEntries(e.map(([s,n])=>[s,n.counts])):null}const zt="x-lt-actions",_={RESOLVE:"resolve",FILL:"fill",FLAG:"flag",UNFLAG:"unflag"},Zt={resolve:[x.WAITING],fill:[x.WAITING,x.FLAGGED],flag:[x.WAITING],unflag:[x.FLAGGED]};function C(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function Z(t){const e=[];return C(t.resolverPayload)&&e.push(_.RESOLVE),C(t.fill)&&e.push(_.FILL),C(t.flag)&&typeof t.flag.label=="string"&&t.flag.label&&e.push(_.FLAG),t.unflag===!0&&e.push(_.UNFLAG),e.length===1?e[0]:null}function te(t){const e=t==null?void 0:t[zt];return Array.isArray(e)?e.filter(s=>C(s)&&typeof s.label=="string"&&!!s.label&&Z(s)!==null):[]}function ee(t,e,s){const n=Z(t);return!n||(n===_.RESOLVE?!e.row:!s)?!1:(t.when===void 0?Zt[n]:Array.isArray(t.when)?t.when:[t.when]).includes(e.state)}const ne=[{label:"Item",value:"{{item.itemKey}}"}],q="continue",se=[U.NEEDS_BADGE,U.ROLE_REFUSED];function N(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function Q(t,e,s){const n=w(t.envelope,e),r=N(n)?n[s]:void 0;return typeof r=="string"?r:void 0}function re(t,e){const s=w(e.envelope,"accumulate_items"),n=w(e.envelope,"batch_items"),r=N(s)&&N(s[t.key])?s[t.key]:null,o=r&&N(r.payload)?r.payload:N(n)&&N(n[t.key])?n[t.key]:void 0,i=typeof(r==null?void 0:r.at)=="string"?r.at:r?void 0:Q(e,"batch_filled_at",t.key),c=typeof(r==null?void 0:r.actor)=="string"?r.actor:r?void 0:Q(e,"batch_filled_by",t.key);return{itemKey:t.key,at:i??"",...o?{payload:o}:{},...c?{actor:c}:{},...t.label!==void 0?{label:t.label}:{}}}function ye({fieldKey:t,schema:e,escalationContext:s}){var G;const n=s??{},r=Jt({properties:{[t]:e??{}}},n)[t],o=z(e),i=!!o&&"batch"in o.expected,c=(e==null?void 0:e["x-lt-columns"])??ne,l=te(e),u=(e==null?void 0:e.title)??"Expected items",m=e==null?void 0:e.description,b=String(((G=n.escalation)==null?void 0:G.id)??""),h=xt(),k=Ct(),[y,f]=v.useState(null),[tt,L]=v.useState(null),[et,O]=v.useState({}),I=async(d,p,A)=>{L(d.key),O(j=>({...j,[d.key]:""}));try{await h.mutateAsync({id:b,field:t,action:p.index,entry:d.key,code:A})}catch(j){const D=j.message;O(rt=>({...rt,[d.key]:D}));const $=j instanceof mt&&N(j.body)?j.body.outcome:void 0;typeof $=="string"&&se.includes($)&&k(q,()=>I(d,p,A),{badge:D})}finally{L(null)}},S=(d,p,A)=>{f(null),k(q,()=>I(d,p,A))},nt=(d,p)=>{var A;p.action.confirm||(A=p.action.fill)!=null&&A.enterCode?f({key:d.key,offer:p}):S(d,p)},st=d=>l.map((p,A)=>({action:p,index:A})).filter(({action:p})=>ee(p,d,i));return a.jsxs("div",{"data-field-key":t,"data-testid":`roster-widget-${t}`,children:[a.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[a.jsx(wt,{children:u}),r&&a.jsx("span",{className:"text-sm font-medium text-text-primary","data-testid":`roster-headline-${t}`,children:qt(r)})]}),m&&a.jsx(kt,{children:m}),r?r.entries.length===0?a.jsx("p",{className:"text-xs text-text-tertiary italic py-2","data-testid":`roster-empty-${t}`,children:"Nothing expected."}):a.jsx("ul",{className:"mt-1","data-testid":`roster-list-${t}`,children:r.entries.map(d=>a.jsx(Xt,{entry:d,item:re(d,n),hostCtx:n,columns:c,offered:b?st(d):[],asking:(y==null?void 0:y.key)===d.key?y.offer:null,pending:tt===d.key,error:et[d.key]||void 0,onAction:p=>nt(d,p),onConfirm:p=>y&&S(d,y.offer,p),onCancel:()=>f(null)},d.key))}):a.jsx("p",{className:"text-xs text-text-tertiary py-2","data-testid":`roster-loading-${t}`,children:"Loading expected items…"})]})}export{Tt as E,wt as F,vt as I,jt as O,ye as R,zt as X,F as a,pe as b,kt as c,Ct as d,X as e,xe as f,me as g,ue as h,de as i,fe as j,Wt as k,ge as r,be as s,Jt as u};
2
- //# sourceMappingURL=RosterWidget-BPBPSa1k.js.map
1
+ import{j as a,a as v,d as ot}from"./vendor-query-DvWWuNIB.js";import{bK as at,aL as it,bp as lt,bI as ct}from"./vendor-icons-en0_uSRD.js";import{L as ut}from"./vendor-react-_9U4mKFr.js";import{bl as dt,bm as ft,bn as pt,bo as xt,ax as mt,bp as U}from"./index-xycFf66M.js";import{g as w,H as bt,a as R,F as gt,j as yt,f as ht}from"./escalation-items-B6eDMoTN.js";const At=/\{\{\s*([^{}]+?)\s*\}\}/g;function ue(t){return typeof t=="string"&&/\{\{[^{}]+\}\}/.test(t)}function F(t,e){if(!e)return;const s=t.indexOf("."),n=e[s===-1?t:t.slice(0,s)];if(s===-1)return n;if(!(n===null||typeof n!="object"))return w(n,t.slice(s+1))}function de(t,e){let s=!1;const n=t.replace(At,(r,o)=>{const i=F(o,e);return typeof i=="string"&&i.trim().length>0?i:typeof i=="number"&&Number.isFinite(i)?String(i):(s=!0,"")});return s?null:n}function W(t){return t!=null&&t!==""&&t!==!1&&t!==0}function Et(t){return t==null?"":typeof t=="object"?JSON.stringify(t):String(t)}function M(t,e){const s=t.indexOf("."),n=s===-1?t:t.slice(0,s);if(!bt.includes(n))return{known:!1,value:void 0};const r=e[n];if(s===-1)return{known:!0,value:r};try{return{known:!0,value:w(r,t.slice(s+1))}}catch{return{known:!0,value:void 0}}}function X(t,e){if(Array.isArray(t))return t.every(l=>X(l,e));if(typeof t!="string"||t.length===0||!e)return!0;const s=t.startsWith("!"),n=s?t.slice(1):t,r=n.indexOf("!="),o=n.indexOf("=");if(r!==-1||o!==-1&&o!==r+1){const l=r!==-1&&(o===-1||r<o),u=l?r:o,m=n.slice(0,u).trim(),b=n.slice(u+(l?2:1)).trim(),{known:h,value:k}=M(m,e);if(!h)return!0;const y=Et(k)===b,f=l?!y:y;return s?!f:f}const{known:i,value:c}=M(n,e);return i?s?!W(c):W(c):!0}function fe(t,e){return(t==null?void 0:t["x-lt-hide-if-empty"])!==!0?!1:e==null||e===""||e===!1||e===0}const Nt="x-lt-hidden";function pe(t){return(t==null?void 0:t[Nt])===!0}function wt({children:t,isRequired:e,htmlFor:s}){return a.jsxs("label",{htmlFor:s,className:"block text-2xs font-semibold uppercase tracking-wider text-text-secondary",children:[t,e&&a.jsx("span",{className:"text-status-error ml-0.5",children:"*"})]})}function kt({id:t,children:e}){return a.jsx("p",{id:t,className:"text-2xs text-text-tertiary mt-0.5 leading-snug",children:e})}function xe({error:t,id:e}){return t?a.jsx("p",{id:e,role:"alert",className:"text-2xs text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]",children:t}):null}function me(t){return t?"input text-sm w-full mt-1 border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]":"input text-sm w-full mt-1"}function be(t){return t?"select text-sm mt-1 min-w-[min(16rem,100%)] max-w-full border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]":"select text-sm mt-1 min-w-[min(16rem,100%)] max-w-full"}function jt({to:t,className:e=""}){return a.jsxs(ut,{to:t,title:"View details",tabIndex:-1,className:`inline-flex items-center justify-center w-6 h-6 shrink-0 rounded border border-surface-border text-accent/70 hover:text-accent hover:border-accent/60 hover:bg-accent/5 transition-colors ${e}`,children:[a.jsx(at,{className:"w-3.5 h-3.5",strokeWidth:2}),a.jsx("span",{className:"sr-only",children:"View details"})]})}function vt({message:t,onConfirm:e,onCancel:s,testId:n}){return a.jsxs("span",{className:"inline-flex flex-wrap items-center gap-2",role:"group","aria-label":"Confirm action","data-testid":n,children:[a.jsx("span",{className:"text-xs text-text-primary whitespace-normal",children:t}),a.jsx("button",{type:"button",onClick:e,className:"px-2 py-0.5 text-2xs font-medium text-text-inverse bg-accent rounded hover:bg-accent/90 transition-colors","data-testid":n?`${n}-yes`:void 0,autoFocus:!0,children:"Confirm"}),a.jsx("button",{type:"button",onClick:s,className:"px-2 py-0.5 text-2xs font-medium text-text-secondary border border-surface-border rounded hover:bg-surface-hover transition-colors","data-testid":n?`${n}-no`:void 0,children:"Cancel"})]})}const _t=(t,e,s)=>{s!=null&&s.badge||e()},Tt=v.createContext(_t);function Ct(){return v.useContext(Tt)}function Rt({label:t,onConfirm:e,onCancel:s,testId:n}){const[r,o]=v.useState(""),i=()=>{r.trim()&&e(r.trim())};return a.jsxs("span",{className:"inline-flex flex-wrap items-center gap-2",role:"group","aria-label":t,"data-testid":n,[ft]:dt,children:[a.jsx("input",{type:"text",inputMode:"numeric",value:r,onChange:c=>o(c.target.value),onKeyDown:c=>{c.key==="Enter"&&i(),c.key==="Escape"&&s()},placeholder:"Code on the label","aria-label":"Code on the label",className:"input text-xs py-0.5 w-40 font-mono","data-testid":n?`${n}-input`:void 0,autoFocus:!0}),a.jsx("button",{type:"button",onClick:i,disabled:!r.trim(),className:"px-2 py-0.5 text-2xs font-medium text-text-inverse bg-accent rounded hover:bg-accent/90 disabled:opacity-40 disabled:cursor-not-allowed transition-colors","data-testid":n?`${n}-yes`:void 0,children:t}),a.jsx("button",{type:"button",onClick:s,className:"px-2 py-0.5 text-2xs font-medium text-text-secondary border border-surface-border rounded hover:bg-surface-hover transition-colors","data-testid":n?`${n}-no`:void 0,children:"Cancel"})]})}const Ft="x-lt-roster",Lt=200,H="items",Ot="any",x={WAITING:"waiting",IN:"in",FLAGGED:"flagged"},It="{{escalation.id}}",Y="—",J="batch_keys",P="batch_pending",St="batch_flags",Gt="accumulate_keys";function g(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function E(t){return typeof t=="string"?t?[t]:[]:Array.isArray(t)?t.filter(e=>typeof e=="string"&&e.length>0):[]}function z(t){const e=t==null?void 0:t[Ft];if(!g(e)||!g(e.expected))return;const s=e.expected;return g(s.query)||typeof s.list=="string"||s.batch===!0?e:void 0}function Dt(t){const e=g(t==null?void 0:t.properties)?t.properties:{},s={};for(const[n,r]of Object.entries(e)){const o=g(r)?z(r):void 0;o&&(s[n]=o)}return s}function $t(t){return"query"in t.expected&&g(t.expected.query)?t.expected.query:null}function Ut(t,e){const s={};for(const[o,i]of Object.entries(t.facets??{})){if(typeof i!="string")continue;const c=R(i,e);if(!c||c===Y)return null;s[o]=c}const n=[...t.role?[t.role]:[],...E(t.roles)];if(!n.length&&!Object.keys(s).length)return null;const r=t.status&&t.status!==Ot?t.status:void 0;return{...n.length?{roles:n}:{},facets:s,...r?{status:r}:{},limit:Lt}}function T(t){if(g(t))return t;if(typeof t!="string"||!t)return null;try{const e=JSON.parse(t);return g(e)?e:null}catch{return null}}function Wt(t){return{escalation:t,metadata:g(t.metadata)?t.metadata:T(t.metadata),envelope:T(t.envelope),payload:T(t.escalation_payload),resolver:T(t.resolver_payload)}}function Mt(t){const e=t.metadata??{},s=e[Gt];if(Array.isArray(s))return new Set(E(s));const n=w(t.envelope,"accumulate_items");if(g(n))return new Set(Object.keys(n));if(Array.isArray(e[P])){const r=new Set(E(e[P]));return new Set(E(e[J]).filter(o=>!r.has(o)))}return new Set}function Ht(t,e){if(!e)return t;const s=new Map;return t.flatMap(n=>{const r=(s.get(n)??0)+1;return s.set(n,r),[n,`${n}${e}${r}`]})}function Pt(t,e){const s=new Set,n=typeof t.countedBy=="string"&&t.countedBy?t.countedBy:void 0;for(const r of t.in??[H])(r===H?[...Mt(e)]:Ht(E(F(r,e)),n)).forEach(i=>s.add(i));return s}function Bt(t,e){const s=w(t.envelope,St),n=g(s)?s[e]:void 0;return g(n)&&typeof n.label=="string"&&n.label?n.label:void 0}function Vt(t,e){if(e)for(const s of t.flagged??[]){const n=E(s.when);if(!(!n.length||typeof s.label!="string")&&X(n,e))return s.label}}function B(t){const e=t.escalation.created_at,s=e instanceof Date?e.getTime():typeof e=="string"?Date.parse(e):NaN;return Number.isNaN(s)?0:s}function Kt(t,e,s){var c;const n=new Set,r=[],o=(l,u={})=>{!l||l===Y||n.has(l)||(n.add(l),r.push({key:l,...u}))},i=t.expected;if("query"in i){const l=t.key??It,u=new Map;for(const m of s){const b=R(l,m),h=u.get(b);(!h||B(m)>B(h))&&u.set(b,m)}for(const m of s){const b=R(l,m);o(b,{row:u.get(b)})}}else if("list"in i)E(F(i.list,e)).forEach(l=>o(l));else{const l=i.labels?F(i.labels,e):void 0;for(const u of E((c=e.metadata)==null?void 0:c[J]))o(u,g(l)&&u in l?{label:l[u]}:{})}return r}function V(t,e,s=[]){const n=Pt(t,e),r="batch"in t.expected,o=Kt(t,e,s).map(l=>{if(n.has(l.key))return{...l,state:x.IN};const u=r?Bt(e,l.key):Vt(t,l.row);return u?{...l,state:x.FLAGGED,flag:u}:{...l,state:x.WAITING}}),i=l=>o.filter(u=>u.state===l).length,c=i(x.WAITING);return{entries:o,counts:{expected:o.length,in:i(x.IN),flagged:i(x.FLAGGED),waiting:c,outstanding:c}}}function qt(t){const{counts:e}=t,s=[`${e.in} of ${e.expected} in`],n=new Map;for(const r of t.entries)r.state===x.FLAGGED&&r.flag&&n.set(r.flag,(n.get(r.flag)??0)+1);for(const[r,o]of n)s.push(`${o} ${r}`);return s.join(" · ")}const K={waiting:"Waiting",in:"In",flagged:"Flagged"};function Qt({state:t}){return t===x.IN?a.jsx(it,{className:"w-4 h-4 text-status-success shrink-0",strokeWidth:2,"aria-hidden":!0}):t===x.FLAGGED?a.jsx(lt,{className:"w-4 h-4 text-status-warning shrink-0",strokeWidth:2,"aria-hidden":!0}):a.jsx(ct,{className:"w-4 h-4 text-text-tertiary shrink-0",strokeWidth:2,"aria-hidden":!0})}function Xt({entry:t,item:e,hostCtx:s,columns:n,offered:r,asking:o,pending:i,error:c,onAction:l,onConfirm:u,onCancel:m}){var y;const b=t.row??s,h=t.state===x.IN,k=t.state===x.FLAGGED?t.flag??K.flagged:K[t.state];return a.jsxs("li",{className:"py-2 flex items-start gap-3 border-b border-surface-border/50 last:border-0","data-testid":`roster-entry-${t.key}`,"data-state":t.state,children:[a.jsx("span",{className:"pt-0.5",children:a.jsx(Qt,{state:t.state})}),a.jsx("div",{className:"min-w-0 flex-1 flex flex-wrap items-baseline gap-x-4 gap-y-0.5",children:n.map(f=>a.jsxs("span",{className:`text-sm min-w-0 ${h?"text-text-secondary":"text-text-primary"}`,children:[a.jsxs("span",{className:"sr-only",children:[f.label,": "]}),a.jsx(gt,{raw:yt(f.value,e,b),format:f.format})]},f.label))}),a.jsx("span",{className:`text-xs font-medium shrink-0 pt-0.5 ${h?"text-status-success":t.state===x.FLAGGED?"text-status-warning":"text-text-tertiary"}`,"data-testid":`roster-state-${t.key}`,children:k}),(r.length>0||o||c)&&a.jsxs("span",{className:"shrink-0 flex flex-col items-end gap-0.5",children:[(y=o==null?void 0:o.action.fill)!=null&&y.enterCode?a.jsx(Rt,{label:o.action.label,onConfirm:f=>u(f),onCancel:m,testId:`roster-code-${t.key}`}):o?a.jsx(vt,{message:R(o.action.confirm??"",b),onConfirm:()=>u(),onCancel:m,testId:`roster-confirm-${t.key}`}):a.jsx("span",{className:"flex gap-1",children:r.map(f=>a.jsx("button",{type:"button",onClick:()=>l(f),disabled:i,className:"px-2 py-0.5 text-2xs font-medium text-accent border border-accent/40 rounded hover:bg-accent/10 disabled:opacity-40 disabled:cursor-not-allowed transition-colors","data-testid":`roster-action-${t.key}`,children:f.action.label},f.index))}),c&&a.jsx("span",{className:"text-2xs text-status-error max-w-[16rem] text-right","data-testid":`roster-error-${t.key}`,children:c})]}),t.row&&a.jsx(jt,{to:`/escalations/detail/${String(t.row.escalation.id)}`})]})}function Yt(t,e){const s=$t(t),n=s?Ut(s,e):null;return n?{roles:n.roles,status:n.status,facets:n.facets,limit:n.limit,include:ht({key:t.key,flagged:t.flagged})?"envelope":void 0}:null}function Jt(t,e){const s=Object.entries(Dt(t)),n=e??{},r=s.map(([,c])=>Yt(c,n)),o=ot({queries:r.map(c=>({...pt(c??{}),enabled:!!c}))}),i={};return s.forEach(([c,l],u)=>{if(!r[u]){i[c]=V(l,n);return}const m=o[u];if(!m.isSuccess){i[c]=null;return}const b=m.data.escalations.map(h=>Wt(h));i[c]=V(l,n,b)}),i}function ge(t){const e=Object.entries(t).filter(([,s])=>s!==null);return e.length?Object.fromEntries(e.map(([s,n])=>[s,n.counts])):null}const zt="x-lt-actions",_={RESOLVE:"resolve",FILL:"fill",FLAG:"flag",UNFLAG:"unflag"},Zt={resolve:[x.WAITING],fill:[x.WAITING,x.FLAGGED],flag:[x.WAITING],unflag:[x.FLAGGED]};function C(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function Z(t){const e=[];return C(t.resolverPayload)&&e.push(_.RESOLVE),C(t.fill)&&e.push(_.FILL),C(t.flag)&&typeof t.flag.label=="string"&&t.flag.label&&e.push(_.FLAG),t.unflag===!0&&e.push(_.UNFLAG),e.length===1?e[0]:null}function te(t){const e=t==null?void 0:t[zt];return Array.isArray(e)?e.filter(s=>C(s)&&typeof s.label=="string"&&!!s.label&&Z(s)!==null):[]}function ee(t,e,s){const n=Z(t);return!n||(n===_.RESOLVE?!e.row:!s)?!1:(t.when===void 0?Zt[n]:Array.isArray(t.when)?t.when:[t.when]).includes(e.state)}const ne=[{label:"Item",value:"{{item.itemKey}}"}],q="continue",se=[U.NEEDS_BADGE,U.ROLE_REFUSED];function N(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function Q(t,e,s){const n=w(t.envelope,e),r=N(n)?n[s]:void 0;return typeof r=="string"?r:void 0}function re(t,e){const s=w(e.envelope,"accumulate_items"),n=w(e.envelope,"batch_items"),r=N(s)&&N(s[t.key])?s[t.key]:null,o=r&&N(r.payload)?r.payload:N(n)&&N(n[t.key])?n[t.key]:void 0,i=typeof(r==null?void 0:r.at)=="string"?r.at:r?void 0:Q(e,"batch_filled_at",t.key),c=typeof(r==null?void 0:r.actor)=="string"?r.actor:r?void 0:Q(e,"batch_filled_by",t.key);return{itemKey:t.key,at:i??"",...o?{payload:o}:{},...c?{actor:c}:{},...t.label!==void 0?{label:t.label}:{}}}function ye({fieldKey:t,schema:e,escalationContext:s}){var G;const n=s??{},r=Jt({properties:{[t]:e??{}}},n)[t],o=z(e),i=!!o&&"batch"in o.expected,c=(e==null?void 0:e["x-lt-columns"])??ne,l=te(e),u=(e==null?void 0:e.title)??"Expected items",m=e==null?void 0:e.description,b=String(((G=n.escalation)==null?void 0:G.id)??""),h=xt(),k=Ct(),[y,f]=v.useState(null),[tt,L]=v.useState(null),[et,O]=v.useState({}),I=async(d,p,A)=>{L(d.key),O(j=>({...j,[d.key]:""}));try{await h.mutateAsync({id:b,field:t,action:p.index,entry:d.key,code:A})}catch(j){const D=j.message;O(rt=>({...rt,[d.key]:D}));const $=j instanceof mt&&N(j.body)?j.body.outcome:void 0;typeof $=="string"&&se.includes($)&&k(q,()=>I(d,p,A),{badge:D})}finally{L(null)}},S=(d,p,A)=>{f(null),k(q,()=>I(d,p,A))},nt=(d,p)=>{var A;p.action.confirm||(A=p.action.fill)!=null&&A.enterCode?f({key:d.key,offer:p}):S(d,p)},st=d=>l.map((p,A)=>({action:p,index:A})).filter(({action:p})=>ee(p,d,i));return a.jsxs("div",{"data-field-key":t,"data-testid":`roster-widget-${t}`,children:[a.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[a.jsx(wt,{children:u}),r&&a.jsx("span",{className:"text-sm font-medium text-text-primary","data-testid":`roster-headline-${t}`,children:qt(r)})]}),m&&a.jsx(kt,{children:m}),r?r.entries.length===0?a.jsx("p",{className:"text-xs text-text-tertiary italic py-2","data-testid":`roster-empty-${t}`,children:"Nothing expected."}):a.jsx("ul",{className:"mt-1","data-testid":`roster-list-${t}`,children:r.entries.map(d=>a.jsx(Xt,{entry:d,item:re(d,n),hostCtx:n,columns:c,offered:b?st(d):[],asking:(y==null?void 0:y.key)===d.key?y.offer:null,pending:tt===d.key,error:et[d.key]||void 0,onAction:p=>nt(d,p),onConfirm:p=>y&&S(d,y.offer,p),onCancel:()=>f(null)},d.key))}):a.jsx("p",{className:"text-xs text-text-tertiary py-2","data-testid":`roster-loading-${t}`,children:"Loading expected items…"})]})}export{Tt as E,wt as F,vt as I,jt as O,ye as R,zt as X,F as a,pe as b,kt as c,Ct as d,X as e,xe as f,me as g,ue as h,de as i,fe as j,Wt as k,ge as r,be as s,Jt as u};
2
+ //# sourceMappingURL=RosterWidget-WCtpUEzc.js.map