openvsx-webui-test 0.17.2 → 0.18.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (403) hide show
  1. package/lib/components/button-with-progress.d.ts +1 -0
  2. package/lib/components/button-with-progress.d.ts.map +1 -1
  3. package/lib/components/button-with-progress.js +1 -1
  4. package/lib/components/button-with-progress.js.map +1 -1
  5. package/lib/components/sanitized-markdown.d.ts.map +1 -1
  6. package/lib/components/sanitized-markdown.js +79 -1
  7. package/lib/components/sanitized-markdown.js.map +1 -1
  8. package/lib/components/scan-admin/common/auto-refresh.d.ts +21 -0
  9. package/lib/components/scan-admin/common/auto-refresh.d.ts.map +1 -0
  10. package/lib/components/scan-admin/common/auto-refresh.js +45 -0
  11. package/lib/components/scan-admin/common/auto-refresh.js.map +1 -0
  12. package/lib/components/scan-admin/common/conditional-tooltip.d.ts +24 -0
  13. package/lib/components/scan-admin/common/conditional-tooltip.d.ts.map +1 -0
  14. package/lib/components/scan-admin/common/conditional-tooltip.js +63 -0
  15. package/lib/components/scan-admin/common/conditional-tooltip.js.map +1 -0
  16. package/lib/components/scan-admin/common/file-table.d.ts +23 -0
  17. package/lib/components/scan-admin/common/file-table.d.ts.map +1 -0
  18. package/lib/components/scan-admin/common/file-table.js +350 -0
  19. package/lib/components/scan-admin/common/file-table.js.map +1 -0
  20. package/lib/components/scan-admin/common/index.d.ts +18 -0
  21. package/lib/components/scan-admin/common/index.d.ts.map +1 -0
  22. package/lib/components/scan-admin/common/index.js +18 -0
  23. package/lib/components/scan-admin/common/index.js.map +1 -0
  24. package/lib/components/scan-admin/common/tab-panel.d.ts +25 -0
  25. package/lib/components/scan-admin/common/tab-panel.d.ts.map +1 -0
  26. package/lib/components/scan-admin/common/tab-panel.js +22 -0
  27. package/lib/components/scan-admin/common/tab-panel.js.map +1 -0
  28. package/lib/components/scan-admin/common/utils.d.ts +15 -0
  29. package/lib/components/scan-admin/common/utils.d.ts.map +1 -0
  30. package/lib/components/scan-admin/common/utils.js +46 -0
  31. package/lib/components/scan-admin/common/utils.js.map +1 -0
  32. package/lib/components/scan-admin/dialogs/file-dialog.d.ts +19 -0
  33. package/lib/components/scan-admin/dialogs/file-dialog.d.ts.map +1 -0
  34. package/lib/components/scan-admin/dialogs/file-dialog.js +85 -0
  35. package/lib/components/scan-admin/dialogs/file-dialog.js.map +1 -0
  36. package/lib/components/scan-admin/dialogs/index.d.ts +15 -0
  37. package/lib/components/scan-admin/dialogs/index.d.ts.map +1 -0
  38. package/lib/components/scan-admin/dialogs/index.js +15 -0
  39. package/lib/components/scan-admin/dialogs/index.js.map +1 -0
  40. package/lib/components/scan-admin/dialogs/quarantine-dialog.d.ts +23 -0
  41. package/lib/components/scan-admin/dialogs/quarantine-dialog.d.ts.map +1 -0
  42. package/lib/components/scan-admin/dialogs/quarantine-dialog.js +192 -0
  43. package/lib/components/scan-admin/dialogs/quarantine-dialog.js.map +1 -0
  44. package/lib/components/scan-admin/index.d.ts +20 -0
  45. package/lib/components/scan-admin/index.d.ts.map +1 -0
  46. package/lib/components/scan-admin/index.js +25 -0
  47. package/lib/components/scan-admin/index.js.map +1 -0
  48. package/lib/components/scan-admin/scan-card/index.d.ts +20 -0
  49. package/lib/components/scan-admin/scan-card/index.d.ts.map +1 -0
  50. package/lib/components/scan-admin/scan-card/index.js +20 -0
  51. package/lib/components/scan-admin/scan-card/index.js.map +1 -0
  52. package/lib/components/scan-admin/scan-card/scan-card-content.d.ts +30 -0
  53. package/lib/components/scan-admin/scan-card/scan-card-content.d.ts.map +1 -0
  54. package/lib/components/scan-admin/scan-card/scan-card-content.js +232 -0
  55. package/lib/components/scan-admin/scan-card/scan-card-content.js.map +1 -0
  56. package/lib/components/scan-admin/scan-card/scan-card-expand-strip-badges.d.ts +26 -0
  57. package/lib/components/scan-admin/scan-card/scan-card-expand-strip-badges.d.ts.map +1 -0
  58. package/lib/components/scan-admin/scan-card/scan-card-expand-strip-badges.js +121 -0
  59. package/lib/components/scan-admin/scan-card/scan-card-expand-strip-badges.js.map +1 -0
  60. package/lib/components/scan-admin/scan-card/scan-card-expand-strip.d.ts +27 -0
  61. package/lib/components/scan-admin/scan-card/scan-card-expand-strip.d.ts.map +1 -0
  62. package/lib/components/scan-admin/scan-card/scan-card-expand-strip.js +66 -0
  63. package/lib/components/scan-admin/scan-card/scan-card-expand-strip.js.map +1 -0
  64. package/lib/components/scan-admin/scan-card/scan-card-expanded-content.d.ts +26 -0
  65. package/lib/components/scan-admin/scan-card/scan-card-expanded-content.d.ts.map +1 -0
  66. package/lib/components/scan-admin/scan-card/scan-card-expanded-content.js +151 -0
  67. package/lib/components/scan-admin/scan-card/scan-card-expanded-content.js.map +1 -0
  68. package/lib/components/scan-admin/scan-card/scan-card-header.d.ts +26 -0
  69. package/lib/components/scan-admin/scan-card/scan-card-header.d.ts.map +1 -0
  70. package/lib/components/scan-admin/scan-card/scan-card-header.js +101 -0
  71. package/lib/components/scan-admin/scan-card/scan-card-header.js.map +1 -0
  72. package/lib/components/scan-admin/scan-card/scan-card.d.ts +34 -0
  73. package/lib/components/scan-admin/scan-card/scan-card.d.ts.map +1 -0
  74. package/lib/components/scan-admin/scan-card/scan-card.js +90 -0
  75. package/lib/components/scan-admin/scan-card/scan-card.js.map +1 -0
  76. package/lib/components/scan-admin/scan-card/scan-detail-card.d.ts +38 -0
  77. package/lib/components/scan-admin/scan-card/scan-detail-card.d.ts.map +1 -0
  78. package/lib/components/scan-admin/scan-card/scan-detail-card.js +72 -0
  79. package/lib/components/scan-admin/scan-card/scan-detail-card.js.map +1 -0
  80. package/lib/components/scan-admin/scan-card/utils.d.ts +48 -0
  81. package/lib/components/scan-admin/scan-card/utils.d.ts.map +1 -0
  82. package/lib/components/scan-admin/scan-card/utils.js +166 -0
  83. package/lib/components/scan-admin/scan-card/utils.js.map +1 -0
  84. package/lib/components/scan-admin/tab-contents/allow-list-tab-content.d.ts +19 -0
  85. package/lib/components/scan-admin/tab-contents/allow-list-tab-content.d.ts.map +1 -0
  86. package/lib/components/scan-admin/tab-contents/allow-list-tab-content.js +55 -0
  87. package/lib/components/scan-admin/tab-contents/allow-list-tab-content.js.map +1 -0
  88. package/lib/components/scan-admin/tab-contents/auto-rejected-tab-content.d.ts +19 -0
  89. package/lib/components/scan-admin/tab-contents/auto-rejected-tab-content.d.ts.map +1 -0
  90. package/lib/components/scan-admin/tab-contents/auto-rejected-tab-content.js +43 -0
  91. package/lib/components/scan-admin/tab-contents/auto-rejected-tab-content.js.map +1 -0
  92. package/lib/components/scan-admin/tab-contents/block-list-tab-content.d.ts +19 -0
  93. package/lib/components/scan-admin/tab-contents/block-list-tab-content.d.ts.map +1 -0
  94. package/lib/components/scan-admin/tab-contents/block-list-tab-content.js +55 -0
  95. package/lib/components/scan-admin/tab-contents/block-list-tab-content.js.map +1 -0
  96. package/lib/components/scan-admin/tab-contents/index.d.ts +18 -0
  97. package/lib/components/scan-admin/tab-contents/index.d.ts.map +1 -0
  98. package/lib/components/scan-admin/tab-contents/index.js +18 -0
  99. package/lib/components/scan-admin/tab-contents/index.js.map +1 -0
  100. package/lib/components/scan-admin/tab-contents/quarantined-tab-content.d.ts +19 -0
  101. package/lib/components/scan-admin/tab-contents/quarantined-tab-content.d.ts.map +1 -0
  102. package/lib/components/scan-admin/tab-contents/quarantined-tab-content.js +78 -0
  103. package/lib/components/scan-admin/tab-contents/quarantined-tab-content.js.map +1 -0
  104. package/lib/components/scan-admin/tab-contents/scans-tab-content.d.ts +19 -0
  105. package/lib/components/scan-admin/tab-contents/scans-tab-content.d.ts.map +1 -0
  106. package/lib/components/scan-admin/tab-contents/scans-tab-content.js +52 -0
  107. package/lib/components/scan-admin/tab-contents/scans-tab-content.js.map +1 -0
  108. package/lib/components/scan-admin/toolbars/counts-toolbar.d.ts +35 -0
  109. package/lib/components/scan-admin/toolbars/counts-toolbar.d.ts.map +1 -0
  110. package/lib/components/scan-admin/toolbars/counts-toolbar.js +132 -0
  111. package/lib/components/scan-admin/toolbars/counts-toolbar.js.map +1 -0
  112. package/lib/components/scan-admin/toolbars/index.d.ts +16 -0
  113. package/lib/components/scan-admin/toolbars/index.d.ts.map +1 -0
  114. package/lib/components/scan-admin/toolbars/index.js +16 -0
  115. package/lib/components/scan-admin/toolbars/index.js.map +1 -0
  116. package/lib/components/scan-admin/toolbars/search-toolbar.d.ts +43 -0
  117. package/lib/components/scan-admin/toolbars/search-toolbar.d.ts.map +1 -0
  118. package/lib/components/scan-admin/toolbars/search-toolbar.js +106 -0
  119. package/lib/components/scan-admin/toolbars/search-toolbar.js.map +1 -0
  120. package/lib/components/scan-admin/toolbars/tab-toolbar.d.ts +25 -0
  121. package/lib/components/scan-admin/toolbars/tab-toolbar.d.ts.map +1 -0
  122. package/lib/components/scan-admin/toolbars/tab-toolbar.js +33 -0
  123. package/lib/components/scan-admin/toolbars/tab-toolbar.js.map +1 -0
  124. package/lib/context/scan-admin/index.d.ts +21 -0
  125. package/lib/context/scan-admin/index.d.ts.map +1 -0
  126. package/lib/context/scan-admin/index.js +27 -0
  127. package/lib/context/scan-admin/index.js.map +1 -0
  128. package/lib/context/scan-admin/scan-actions.d.ts +19 -0
  129. package/lib/context/scan-admin/scan-actions.d.ts.map +1 -0
  130. package/lib/context/scan-admin/scan-actions.js +64 -0
  131. package/lib/context/scan-admin/scan-actions.js.map +1 -0
  132. package/lib/context/scan-admin/scan-api-actions.d.ts +26 -0
  133. package/lib/context/scan-admin/scan-api-actions.d.ts.map +1 -0
  134. package/lib/context/scan-admin/scan-api-actions.js +118 -0
  135. package/lib/context/scan-admin/scan-api-actions.js.map +1 -0
  136. package/lib/context/scan-admin/scan-api-effects.d.ts +40 -0
  137. package/lib/context/scan-admin/scan-api-effects.d.ts.map +1 -0
  138. package/lib/context/scan-admin/scan-api-effects.js +446 -0
  139. package/lib/context/scan-admin/scan-api-effects.js.map +1 -0
  140. package/lib/context/scan-admin/scan-context-types.d.ts +69 -0
  141. package/lib/context/scan-admin/scan-context-types.d.ts.map +1 -0
  142. package/lib/context/scan-admin/scan-context-types.js +14 -0
  143. package/lib/context/scan-admin/scan-context-types.js.map +1 -0
  144. package/lib/context/scan-admin/scan-context.d.ts +17 -0
  145. package/lib/context/scan-admin/scan-context.d.ts.map +1 -0
  146. package/lib/context/scan-admin/scan-context.js +90 -0
  147. package/lib/context/scan-admin/scan-context.js.map +1 -0
  148. package/lib/context/scan-admin/scan-helpers.d.ts +28 -0
  149. package/lib/context/scan-admin/scan-helpers.d.ts.map +1 -0
  150. package/lib/context/scan-admin/scan-helpers.js +56 -0
  151. package/lib/context/scan-admin/scan-helpers.js.map +1 -0
  152. package/lib/context/scan-admin/scan-reducer.d.ts +18 -0
  153. package/lib/context/scan-admin/scan-reducer.d.ts.map +1 -0
  154. package/lib/context/scan-admin/scan-reducer.js +194 -0
  155. package/lib/context/scan-admin/scan-reducer.js.map +1 -0
  156. package/lib/context/scan-admin/scan-types.d.ts +292 -0
  157. package/lib/context/scan-admin/scan-types.d.ts.map +1 -0
  158. package/lib/context/scan-admin/scan-types.js +67 -0
  159. package/lib/context/scan-admin/scan-types.js.map +1 -0
  160. package/lib/default/page-settings.d.ts.map +1 -1
  161. package/lib/default/page-settings.js +3 -0
  162. package/lib/default/page-settings.js.map +1 -1
  163. package/lib/default/theme.d.ts +50 -12
  164. package/lib/default/theme.d.ts.map +1 -1
  165. package/lib/default/theme.js +42 -0
  166. package/lib/default/theme.js.map +1 -1
  167. package/lib/extension-registry-service.d.ts +106 -1
  168. package/lib/extension-registry-service.d.ts.map +1 -1
  169. package/lib/extension-registry-service.js +348 -1
  170. package/lib/extension-registry-service.js.map +1 -1
  171. package/lib/extension-registry-types.d.ts +181 -0
  172. package/lib/extension-registry-types.d.ts.map +1 -1
  173. package/lib/extension-registry-types.js +16 -0
  174. package/lib/extension-registry-types.js.map +1 -1
  175. package/lib/hooks/scan-admin/index.d.ts +34 -0
  176. package/lib/hooks/scan-admin/index.d.ts.map +1 -0
  177. package/lib/hooks/scan-admin/index.js +28 -0
  178. package/lib/hooks/scan-admin/index.js.map +1 -0
  179. package/lib/hooks/scan-admin/use-auto-rejected-tab.d.ts +76 -0
  180. package/lib/hooks/scan-admin/use-auto-rejected-tab.d.ts.map +1 -0
  181. package/lib/hooks/scan-admin/use-auto-rejected-tab.js +79 -0
  182. package/lib/hooks/scan-admin/use-auto-rejected-tab.js.map +1 -0
  183. package/lib/hooks/scan-admin/use-dialogs.d.ts +43 -0
  184. package/lib/hooks/scan-admin/use-dialogs.d.ts.map +1 -0
  185. package/lib/hooks/scan-admin/use-dialogs.js +55 -0
  186. package/lib/hooks/scan-admin/use-dialogs.js.map +1 -0
  187. package/lib/hooks/scan-admin/use-file-list-tab.d.ts +208 -0
  188. package/lib/hooks/scan-admin/use-file-list-tab.d.ts.map +1 -0
  189. package/lib/hooks/scan-admin/use-file-list-tab.js +125 -0
  190. package/lib/hooks/scan-admin/use-file-list-tab.js.map +1 -0
  191. package/lib/hooks/scan-admin/use-pagination.d.ts +36 -0
  192. package/lib/hooks/scan-admin/use-pagination.d.ts.map +1 -0
  193. package/lib/hooks/scan-admin/use-pagination.js +79 -0
  194. package/lib/hooks/scan-admin/use-pagination.js.map +1 -0
  195. package/lib/hooks/scan-admin/use-quarantined-tab.d.ts +92 -0
  196. package/lib/hooks/scan-admin/use-quarantined-tab.d.ts.map +1 -0
  197. package/lib/hooks/scan-admin/use-quarantined-tab.js +125 -0
  198. package/lib/hooks/scan-admin/use-quarantined-tab.js.map +1 -0
  199. package/lib/hooks/scan-admin/use-scan-card-state.d.ts +29 -0
  200. package/lib/hooks/scan-admin/use-scan-card-state.d.ts.map +1 -0
  201. package/lib/hooks/scan-admin/use-scan-card-state.js +50 -0
  202. package/lib/hooks/scan-admin/use-scan-card-state.js.map +1 -0
  203. package/lib/hooks/scan-admin/use-scan-filters.d.ts +53 -0
  204. package/lib/hooks/scan-admin/use-scan-filters.d.ts.map +1 -0
  205. package/lib/hooks/scan-admin/use-scan-filters.js +75 -0
  206. package/lib/hooks/scan-admin/use-scan-filters.js.map +1 -0
  207. package/lib/hooks/scan-admin/use-scans-tab.d.ts +85 -0
  208. package/lib/hooks/scan-admin/use-scans-tab.d.ts.map +1 -0
  209. package/lib/hooks/scan-admin/use-scans-tab.js +87 -0
  210. package/lib/hooks/scan-admin/use-scans-tab.js.map +1 -0
  211. package/lib/hooks/scan-admin/use-search.d.ts +32 -0
  212. package/lib/hooks/scan-admin/use-search.d.ts.map +1 -0
  213. package/lib/hooks/scan-admin/use-search.js +48 -0
  214. package/lib/hooks/scan-admin/use-search.js.map +1 -0
  215. package/lib/hooks/scan-admin/use-tab-navigation.d.ts +96 -0
  216. package/lib/hooks/scan-admin/use-tab-navigation.d.ts.map +1 -0
  217. package/lib/hooks/scan-admin/use-tab-navigation.js +70 -0
  218. package/lib/hooks/scan-admin/use-tab-navigation.js.map +1 -0
  219. package/lib/hooks/scan-admin/use-url-sync.d.ts +22 -0
  220. package/lib/hooks/scan-admin/use-url-sync.d.ts.map +1 -0
  221. package/lib/hooks/scan-admin/use-url-sync.js +252 -0
  222. package/lib/hooks/scan-admin/use-url-sync.js.map +1 -0
  223. package/lib/page-settings.d.ts +4 -0
  224. package/lib/page-settings.d.ts.map +1 -1
  225. package/lib/pages/admin-dashboard/admin-dashboard.d.ts +4 -0
  226. package/lib/pages/admin-dashboard/admin-dashboard.d.ts.map +1 -1
  227. package/lib/pages/admin-dashboard/admin-dashboard.js +55 -5
  228. package/lib/pages/admin-dashboard/admin-dashboard.js.map +1 -1
  229. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.d.ts +28 -0
  230. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.d.ts.map +1 -0
  231. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.js +93 -0
  232. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.js.map +1 -0
  233. package/lib/pages/admin-dashboard/components/index.d.ts +2 -0
  234. package/lib/pages/admin-dashboard/components/index.d.ts.map +1 -0
  235. package/lib/pages/admin-dashboard/components/index.js +14 -0
  236. package/lib/pages/admin-dashboard/components/index.js.map +1 -0
  237. package/lib/pages/admin-dashboard/customers/customer-form-dialog.d.ts +23 -0
  238. package/lib/pages/admin-dashboard/customers/customer-form-dialog.d.ts.map +1 -0
  239. package/lib/pages/admin-dashboard/customers/customer-form-dialog.js +225 -0
  240. package/lib/pages/admin-dashboard/customers/customer-form-dialog.js.map +1 -0
  241. package/lib/pages/admin-dashboard/customers/customers.d.ts +15 -0
  242. package/lib/pages/admin-dashboard/customers/customers.d.ts.map +1 -0
  243. package/lib/pages/admin-dashboard/customers/customers.js +175 -0
  244. package/lib/pages/admin-dashboard/customers/customers.js.map +1 -0
  245. package/lib/pages/admin-dashboard/customers/delete-customer-dialog.d.ts +23 -0
  246. package/lib/pages/admin-dashboard/customers/delete-customer-dialog.d.ts.map +1 -0
  247. package/lib/pages/admin-dashboard/customers/delete-customer-dialog.js +64 -0
  248. package/lib/pages/admin-dashboard/customers/delete-customer-dialog.js.map +1 -0
  249. package/lib/pages/admin-dashboard/publisher-admin.js +5 -5
  250. package/lib/pages/admin-dashboard/publisher-admin.js.map +1 -1
  251. package/lib/pages/admin-dashboard/publisher-revoke-dialog.d.ts.map +1 -1
  252. package/lib/pages/admin-dashboard/publisher-revoke-dialog.js +1 -1
  253. package/lib/pages/admin-dashboard/publisher-revoke-dialog.js.map +1 -1
  254. package/lib/pages/admin-dashboard/scan-admin.d.ts +20 -0
  255. package/lib/pages/admin-dashboard/scan-admin.d.ts.map +1 -0
  256. package/lib/pages/admin-dashboard/scan-admin.js +66 -0
  257. package/lib/pages/admin-dashboard/scan-admin.js.map +1 -0
  258. package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.d.ts +23 -0
  259. package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.d.ts.map +1 -0
  260. package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.js +55 -0
  261. package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.js.map +1 -0
  262. package/lib/pages/admin-dashboard/tiers/tier-form-dialog.d.ts +23 -0
  263. package/lib/pages/admin-dashboard/tiers/tier-form-dialog.d.ts.map +1 -0
  264. package/lib/pages/admin-dashboard/tiers/tier-form-dialog.js +215 -0
  265. package/lib/pages/admin-dashboard/tiers/tier-form-dialog.js.map +1 -0
  266. package/lib/pages/admin-dashboard/tiers/tiers.d.ts +15 -0
  267. package/lib/pages/admin-dashboard/tiers/tiers.d.ts.map +1 -0
  268. package/lib/pages/admin-dashboard/tiers/tiers.js +174 -0
  269. package/lib/pages/admin-dashboard/tiers/tiers.js.map +1 -0
  270. package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.d.ts +23 -0
  271. package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.d.ts.map +1 -0
  272. package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.js +106 -0
  273. package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.js.map +1 -0
  274. package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.d.ts +26 -0
  275. package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.d.ts.map +1 -0
  276. package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.js +50 -0
  277. package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.js.map +1 -0
  278. package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.d.ts +14 -0
  279. package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.d.ts.map +1 -0
  280. package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.js +16 -0
  281. package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.js.map +1 -0
  282. package/lib/pages/admin-dashboard/usage-stats/usage-stats.d.ts +15 -0
  283. package/lib/pages/admin-dashboard/usage-stats/usage-stats.d.ts.map +1 -0
  284. package/lib/pages/admin-dashboard/usage-stats/usage-stats.js +103 -0
  285. package/lib/pages/admin-dashboard/usage-stats/usage-stats.js.map +1 -0
  286. package/lib/pages/admin-dashboard/welcome.d.ts.map +1 -1
  287. package/lib/pages/admin-dashboard/welcome.js +5 -1
  288. package/lib/pages/admin-dashboard/welcome.js.map +1 -1
  289. package/lib/pages/extension-detail/extension-detail-overview.d.ts.map +1 -1
  290. package/lib/pages/extension-detail/extension-detail-overview.js +9 -1
  291. package/lib/pages/extension-detail/extension-detail-overview.js.map +1 -1
  292. package/lib/pages/extension-detail/extension-detail-reviews.d.ts.map +1 -1
  293. package/lib/pages/extension-detail/extension-detail-reviews.js +67 -18
  294. package/lib/pages/extension-detail/extension-detail-reviews.js.map +1 -1
  295. package/lib/pages/extension-detail/extension-detail.js +2 -2
  296. package/lib/pages/extension-detail/extension-detail.js.map +1 -1
  297. package/lib/pages/extension-detail/extension-rating-stars.d.ts +2 -2
  298. package/lib/pages/extension-detail/extension-rating-stars.d.ts.map +1 -1
  299. package/lib/pages/extension-detail/extension-rating-stars.js +1 -1
  300. package/lib/pages/extension-detail/extension-rating-stars.js.map +1 -1
  301. package/lib/pages/extension-list/extension-list-item.js +2 -2
  302. package/lib/pages/extension-list/extension-list-item.js.map +1 -1
  303. package/lib/pages/user/user-namespace-extension-list-item.d.ts.map +1 -1
  304. package/lib/pages/user/user-namespace-extension-list-item.js +23 -9
  305. package/lib/pages/user/user-namespace-extension-list-item.js.map +1 -1
  306. package/lib/pages/user/user-publisher-agreement.d.ts.map +1 -1
  307. package/lib/pages/user/user-publisher-agreement.js +34 -13
  308. package/lib/pages/user/user-publisher-agreement.js.map +1 -1
  309. package/lib/pages/user/user-settings-profile.d.ts.map +1 -1
  310. package/lib/pages/user/user-settings-profile.js +10 -5
  311. package/lib/pages/user/user-settings-profile.js.map +1 -1
  312. package/lib/pages/user/user-settings-tokens.d.ts.map +1 -1
  313. package/lib/pages/user/user-settings-tokens.js +13 -5
  314. package/lib/pages/user/user-settings-tokens.js.map +1 -1
  315. package/lib/server-request.d.ts +1 -1
  316. package/lib/server-request.d.ts.map +1 -1
  317. package/lib/server-request.js +3 -3
  318. package/lib/server-request.js.map +1 -1
  319. package/package.json +17 -9
  320. package/src/components/button-with-progress.tsx +2 -1
  321. package/src/components/sanitized-markdown.tsx +81 -1
  322. package/src/components/scan-admin/common/auto-refresh.tsx +79 -0
  323. package/src/components/scan-admin/common/conditional-tooltip.tsx +74 -0
  324. package/src/components/scan-admin/common/file-table.tsx +508 -0
  325. package/src/components/scan-admin/common/index.ts +18 -0
  326. package/src/components/scan-admin/common/tab-panel.tsx +42 -0
  327. package/src/components/scan-admin/common/utils.ts +48 -0
  328. package/src/components/scan-admin/dialogs/file-dialog.tsx +137 -0
  329. package/src/components/scan-admin/dialogs/index.ts +15 -0
  330. package/src/components/scan-admin/dialogs/quarantine-dialog.tsx +270 -0
  331. package/src/components/scan-admin/index.ts +52 -0
  332. package/src/components/scan-admin/scan-card/index.ts +20 -0
  333. package/src/components/scan-admin/scan-card/scan-card-content.tsx +457 -0
  334. package/src/components/scan-admin/scan-card/scan-card-expand-strip-badges.tsx +186 -0
  335. package/src/components/scan-admin/scan-card/scan-card-expand-strip.tsx +104 -0
  336. package/src/components/scan-admin/scan-card/scan-card-expanded-content.tsx +262 -0
  337. package/src/components/scan-admin/scan-card/scan-card-header.tsx +176 -0
  338. package/src/components/scan-admin/scan-card/scan-card.tsx +152 -0
  339. package/src/components/scan-admin/scan-card/scan-detail-card.tsx +144 -0
  340. package/src/components/scan-admin/scan-card/utils.ts +199 -0
  341. package/src/components/scan-admin/tab-contents/allow-list-tab-content.tsx +119 -0
  342. package/src/components/scan-admin/tab-contents/auto-rejected-tab-content.tsx +106 -0
  343. package/src/components/scan-admin/tab-contents/block-list-tab-content.tsx +119 -0
  344. package/src/components/scan-admin/tab-contents/index.ts +18 -0
  345. package/src/components/scan-admin/tab-contents/quarantined-tab-content.tsx +158 -0
  346. package/src/components/scan-admin/tab-contents/scans-tab-content.tsx +113 -0
  347. package/src/components/scan-admin/toolbars/counts-toolbar.tsx +262 -0
  348. package/src/components/scan-admin/toolbars/index.ts +16 -0
  349. package/src/components/scan-admin/toolbars/search-toolbar.tsx +255 -0
  350. package/src/components/scan-admin/toolbars/tab-toolbar.tsx +56 -0
  351. package/src/context/scan-admin/index.ts +43 -0
  352. package/src/context/scan-admin/scan-actions.ts +87 -0
  353. package/src/context/scan-admin/scan-api-actions.ts +137 -0
  354. package/src/context/scan-admin/scan-api-effects.ts +491 -0
  355. package/src/context/scan-admin/scan-context-types.ts +102 -0
  356. package/src/context/scan-admin/scan-context.tsx +123 -0
  357. package/src/context/scan-admin/scan-helpers.ts +63 -0
  358. package/src/context/scan-admin/scan-reducer.ts +321 -0
  359. package/src/context/scan-admin/scan-types.ts +337 -0
  360. package/src/default/page-settings.tsx +3 -0
  361. package/src/default/theme.tsx +102 -13
  362. package/src/extension-registry-service.ts +372 -1
  363. package/src/extension-registry-types.ts +207 -0
  364. package/src/hooks/scan-admin/index.ts +48 -0
  365. package/src/hooks/scan-admin/use-auto-rejected-tab.ts +85 -0
  366. package/src/hooks/scan-admin/use-dialogs.ts +83 -0
  367. package/src/hooks/scan-admin/use-file-list-tab.ts +149 -0
  368. package/src/hooks/scan-admin/use-pagination.ts +90 -0
  369. package/src/hooks/scan-admin/use-quarantined-tab.ts +138 -0
  370. package/src/hooks/scan-admin/use-scan-card-state.ts +73 -0
  371. package/src/hooks/scan-admin/use-scan-filters.ts +83 -0
  372. package/src/hooks/scan-admin/use-scans-tab.ts +92 -0
  373. package/src/hooks/scan-admin/use-search.ts +54 -0
  374. package/src/hooks/scan-admin/use-tab-navigation.ts +82 -0
  375. package/src/hooks/scan-admin/use-url-sync.ts +293 -0
  376. package/src/page-settings.ts +4 -0
  377. package/src/pages/admin-dashboard/admin-dashboard.tsx +71 -4
  378. package/src/pages/admin-dashboard/components/data-grid-filter-operators.tsx +126 -0
  379. package/src/pages/admin-dashboard/components/index.ts +18 -0
  380. package/src/pages/admin-dashboard/customers/customer-form-dialog.tsx +348 -0
  381. package/src/pages/admin-dashboard/customers/customers.tsx +279 -0
  382. package/src/pages/admin-dashboard/customers/delete-customer-dialog.tsx +94 -0
  383. package/src/pages/admin-dashboard/publisher-admin.tsx +5 -5
  384. package/src/pages/admin-dashboard/publisher-revoke-dialog.tsx +2 -1
  385. package/src/pages/admin-dashboard/scan-admin.tsx +109 -0
  386. package/src/pages/admin-dashboard/tiers/delete-tier-dialog.tsx +83 -0
  387. package/src/pages/admin-dashboard/tiers/tier-form-dialog.tsx +372 -0
  388. package/src/pages/admin-dashboard/tiers/tiers.tsx +254 -0
  389. package/src/pages/admin-dashboard/usage-stats/usage-stats-chart.tsx +189 -0
  390. package/src/pages/admin-dashboard/usage-stats/usage-stats-search.tsx +83 -0
  391. package/src/pages/admin-dashboard/usage-stats/usage-stats-utils.ts +16 -0
  392. package/src/pages/admin-dashboard/usage-stats/usage-stats.tsx +127 -0
  393. package/src/pages/admin-dashboard/welcome.tsx +4 -0
  394. package/src/pages/extension-detail/extension-detail-overview.tsx +16 -2
  395. package/src/pages/extension-detail/extension-detail-reviews.tsx +116 -30
  396. package/src/pages/extension-detail/extension-detail.tsx +2 -2
  397. package/src/pages/extension-detail/extension-rating-stars.tsx +2 -2
  398. package/src/pages/extension-list/extension-list-item.tsx +2 -2
  399. package/src/pages/user/user-namespace-extension-list-item.tsx +38 -13
  400. package/src/pages/user/user-publisher-agreement.tsx +30 -11
  401. package/src/pages/user/user-settings-profile.tsx +10 -6
  402. package/src/pages/user/user-settings-tokens.tsx +15 -6
  403. package/src/server-request.ts +3 -3
@@ -0,0 +1,255 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation
3
+ *
4
+ * See the NOTICE file(s) distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ *
7
+ * This program and the accompanying materials are made available under the
8
+ * terms of the Eclipse Public License 2.0 which is available at
9
+ * https://www.eclipse.org/legal/epl-2.0
10
+ *
11
+ * SPDX-License-Identifier: EPL-2.0
12
+ ********************************************************************************/
13
+
14
+ import React, { FunctionComponent } from 'react';
15
+ import { Box, Typography, TextField, InputAdornment, Button, Checkbox, FormControlLabel } from '@mui/material';
16
+ import { CheckCircle as CheckCircleIcon, RadioButtonUnchecked as RadioButtonUncheckedIcon, PersonOutlined as PersonIcon, AccountTreeOutlined as AccountTreeIcon, ExtensionOutlined as ExtensionIcon } from '@mui/icons-material';
17
+ import { useTheme } from '@mui/material/styles';
18
+
19
+ interface FilterItem {
20
+ label: string;
21
+ value: string;
22
+ checked: boolean;
23
+ onChange: (value: string) => void;
24
+ disabled?: boolean;
25
+ }
26
+
27
+ interface ActionButton {
28
+ label: string;
29
+ color: string;
30
+ disabled: boolean;
31
+ onClick: () => void;
32
+ }
33
+
34
+ interface SearchToolbarProps {
35
+ publisherQuery: string;
36
+ namespaceQuery: string;
37
+ nameQuery: string;
38
+ onPublisherChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
39
+ onNamespaceChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
40
+ onNameChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
41
+
42
+ // Optional inline filters
43
+ filters?: FilterItem[];
44
+
45
+ // Optional select all checkbox
46
+ showSelectAll?: boolean;
47
+ allSelected?: boolean;
48
+ onSelectAllChange?: (checked: boolean) => void;
49
+
50
+ // Optional action buttons
51
+ actionButtons?: ActionButton[];
52
+
53
+ // Optional selected count display
54
+ selectedCount?: number;
55
+ }
56
+
57
+ export const SearchToolbar: FunctionComponent<SearchToolbarProps> = ({
58
+ publisherQuery,
59
+ namespaceQuery,
60
+ nameQuery,
61
+ onPublisherChange,
62
+ onNamespaceChange,
63
+ onNameChange,
64
+ filters = [],
65
+ showSelectAll = false,
66
+ allSelected = false,
67
+ onSelectAllChange,
68
+ actionButtons = [],
69
+ selectedCount = 0,
70
+ }) => {
71
+ const theme = useTheme();
72
+
73
+ return (
74
+ <Box sx={{ display: 'flex', gap: 2, alignItems: 'center', pb: 1.5, minHeight: '56px', overflow: 'hidden' }}>
75
+ <TextField
76
+ placeholder='Publisher'
77
+ value={publisherQuery}
78
+ onChange={onPublisherChange}
79
+ size='small'
80
+ InputProps={{
81
+ startAdornment: (
82
+ <InputAdornment position='start'>
83
+ <PersonIcon sx={{ fontSize: 20 }} />
84
+ </InputAdornment>
85
+ ),
86
+ }}
87
+ sx={{
88
+ flex: 1,
89
+ minWidth: 100,
90
+ maxWidth: '16.67%',
91
+ '& .MuiOutlinedInput-root': {
92
+ backgroundColor: theme.palette.scanBackground.dark,
93
+ '&.Mui-focused fieldset': {
94
+ borderColor: theme.palette.secondary.main,
95
+ },
96
+ },
97
+ }}
98
+ />
99
+ <TextField
100
+ placeholder='Namespace'
101
+ value={namespaceQuery}
102
+ onChange={onNamespaceChange}
103
+ size='small'
104
+ InputProps={{
105
+ startAdornment: (
106
+ <InputAdornment position='start'>
107
+ <AccountTreeIcon sx={{ fontSize: 20 }} />
108
+ </InputAdornment>
109
+ ),
110
+ }}
111
+ sx={{
112
+ flex: 1,
113
+ minWidth: 100,
114
+ maxWidth: '16.67%',
115
+ '& .MuiOutlinedInput-root': {
116
+ backgroundColor: theme.palette.scanBackground.dark,
117
+ '&.Mui-focused fieldset': {
118
+ borderColor: theme.palette.secondary.main,
119
+ },
120
+ },
121
+ }}
122
+ />
123
+ <TextField
124
+ placeholder='Name or Display Name'
125
+ value={nameQuery}
126
+ onChange={onNameChange}
127
+ size='small'
128
+ InputProps={{
129
+ startAdornment: (
130
+ <InputAdornment position='start'>
131
+ <ExtensionIcon sx={{ fontSize: 20 }} />
132
+ </InputAdornment>
133
+ ),
134
+ }}
135
+ sx={{
136
+ flex: 1,
137
+ minWidth: 100,
138
+ maxWidth: '16.67%',
139
+ '& .MuiOutlinedInput-root': {
140
+ backgroundColor: theme.palette.scanBackground.dark,
141
+ '&.Mui-focused fieldset': {
142
+ borderColor: theme.palette.secondary.main,
143
+ },
144
+ },
145
+ }}
146
+ />
147
+
148
+ {/* Inline Filter Checkboxes */}
149
+ {filters.length > 0 && (
150
+ <Box sx={{ display: 'flex', gap: 2, alignItems: 'center', flexWrap: 'nowrap', justifyContent: 'flex-end', flex: 1 }}>
151
+ {filters.map((filter) => (
152
+ <FormControlLabel
153
+ key={filter.value}
154
+ control={
155
+ <Checkbox
156
+ checked={filter.checked}
157
+ onChange={() => filter.onChange(filter.value)}
158
+ disabled={filter.disabled}
159
+ size='small'
160
+ sx={{
161
+ color: theme.palette.checkboxUnchecked,
162
+ '&.Mui-checked': {
163
+ color: theme.palette.secondary.main,
164
+ },
165
+ }}
166
+ />
167
+ }
168
+ label={
169
+ <Typography variant='body2' sx={{ fontSize: '0.875rem' }}>
170
+ {filter.label}
171
+ </Typography>
172
+ }
173
+ sx={{ mr: 0 }}
174
+ disabled={filter.disabled}
175
+ />
176
+ ))}
177
+ </Box>
178
+ )}
179
+
180
+ {/* Select All and Action Buttons */}
181
+ <Box sx={{ display: 'flex', gap: 1.5, alignItems: 'center', ml: 'auto' }}>
182
+ {showSelectAll && onSelectAllChange && (
183
+ <Button
184
+ variant='outlined'
185
+ size='small'
186
+ onClick={() => onSelectAllChange(!allSelected)}
187
+ startIcon={allSelected ? <CheckCircleIcon /> : <RadioButtonUncheckedIcon />}
188
+ sx={{
189
+ textTransform: 'none',
190
+ whiteSpace: 'nowrap',
191
+ color: allSelected ? 'secondary.main' : 'text.secondary',
192
+ borderColor: allSelected ? 'secondary.main' : 'divider',
193
+ }}
194
+ >
195
+ Select All
196
+ </Button>
197
+ )}
198
+ </Box>
199
+
200
+ {/* Action Buttons */}
201
+ {actionButtons.length > 0 && (
202
+ <Box sx={{ position: 'relative' }}>
203
+ <Box sx={{ display: 'flex', gap: 1 }}>
204
+ {actionButtons.map((button, index) => (
205
+ <Button
206
+ key={index}
207
+ variant='outlined'
208
+ disabled={button.disabled}
209
+ onClick={button.onClick}
210
+ size='small'
211
+ sx={{
212
+ textTransform: 'none',
213
+ minWidth: 'auto',
214
+ px: 2,
215
+ fontWeight: 500,
216
+ borderColor: button.color,
217
+ color: button.color,
218
+ backgroundColor: 'transparent',
219
+ '&:hover': {
220
+ borderColor: button.color,
221
+ backgroundColor: button.color,
222
+ color: theme.palette.primary.contrastText,
223
+ },
224
+ '&:disabled': {
225
+ backgroundColor: 'transparent',
226
+ color: theme.palette.text.disabled,
227
+ borderColor: theme.palette.divider,
228
+ },
229
+ }}
230
+ >
231
+ {button.label}
232
+ </Button>
233
+ ))}
234
+ </Box>
235
+ {selectedCount > 0 && (
236
+ <Typography
237
+ variant='body2'
238
+ sx={{
239
+ position: 'absolute',
240
+ right: 0,
241
+ top: '100%',
242
+ color: 'text.secondary',
243
+ fontSize: '0.75rem',
244
+ mt: 0.5,
245
+ whiteSpace: 'nowrap',
246
+ }}
247
+ >
248
+ {selectedCount} selected
249
+ </Typography>
250
+ )}
251
+ </Box>
252
+ )}
253
+ </Box>
254
+ );
255
+ };
@@ -0,0 +1,56 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation
3
+ *
4
+ * See the NOTICE file(s) distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ *
7
+ * This program and the accompanying materials are made available under the
8
+ * terms of the Eclipse Public License 2.0 which is available at
9
+ * https://www.eclipse.org/legal/epl-2.0
10
+ *
11
+ * SPDX-License-Identifier: EPL-2.0
12
+ ********************************************************************************/
13
+
14
+ import React, { FunctionComponent } from 'react';
15
+ import { Paper, Tabs, Tab } from '@mui/material';
16
+
17
+ interface TabToolbarProps {
18
+ selectedTab: number;
19
+ onTabChange: (event: React.SyntheticEvent, newValue: number) => void;
20
+ tabs: string[];
21
+ }
22
+
23
+ /**
24
+ * TabToolbar component for the scan admin tab navigation.
25
+ * Renders the Paper/Tabs bar for switching between scan tabs.
26
+ */
27
+ export const TabToolbar: FunctionComponent<TabToolbarProps> = ({
28
+ selectedTab,
29
+ onTabChange,
30
+ tabs,
31
+ }) => {
32
+ return (
33
+ <Paper sx={{ mb: 1.5 }}>
34
+ <Tabs
35
+ value={selectedTab}
36
+ onChange={onTabChange}
37
+ aria-label='scans tabs'
38
+ sx={{
39
+ borderBottom: 1,
40
+ borderColor: 'divider',
41
+ minHeight: '48px',
42
+ '& .MuiTabs-indicator': {
43
+ backgroundColor: 'secondary.main',
44
+ },
45
+ '& .MuiTab-root': {
46
+ minHeight: '48px',
47
+ },
48
+ }}
49
+ >
50
+ {tabs.map((label, index) => (
51
+ <Tab key={index} label={label} />
52
+ ))}
53
+ </Tabs>
54
+ </Paper>
55
+ );
56
+ };
@@ -0,0 +1,43 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation
3
+ *
4
+ * See the NOTICE file(s) distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ *
7
+ * This program and the accompanying materials are made available under the
8
+ * terms of the Eclipse Public License 2.0 which is available at
9
+ * https://www.eclipse.org/legal/epl-2.0
10
+ *
11
+ * SPDX-License-Identifier: EPL-2.0
12
+ ********************************************************************************/
13
+
14
+ // Context and Provider
15
+ export { ScanProvider, useScanContext } from './scan-context';
16
+
17
+ // Context Types
18
+ export type { ScanContextValue, ScanActions, DerivedData, ScanProviderProps } from './scan-context-types';
19
+
20
+ // Domain Types
21
+ export * from './scan-types';
22
+
23
+ // Reducer
24
+ export { scanReducer } from './scan-reducer';
25
+
26
+ // Helpers
27
+ export { getDateRangeParams, getFileDateRange } from './scan-helpers';
28
+
29
+ // API Effects (for testing or advanced use cases)
30
+ export {
31
+ useFilterOptionsEffect,
32
+ useScansEffect,
33
+ useScanCountsEffect,
34
+ useFilesEffect,
35
+ useFileCountsEffect,
36
+ useAutoRefreshEffect,
37
+ } from './scan-api-effects';
38
+
39
+ // API Actions (for testing or advanced use cases)
40
+ export { useConfirmAction, useFileAction } from './scan-api-actions';
41
+
42
+ // Actions Factory (for testing or advanced use cases)
43
+ export { useScanActions } from './scan-actions';
@@ -0,0 +1,87 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation
3
+ *
4
+ * See the NOTICE file(s) distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ *
7
+ * This program and the accompanying materials are made available under the
8
+ * terms of the Eclipse Public License 2.0 which is available at
9
+ * https://www.eclipse.org/legal/epl-2.0
10
+ *
11
+ * SPDX-License-Identifier: EPL-2.0
12
+ ********************************************************************************/
13
+
14
+ import { useMemo } from 'react';
15
+ import { ScanAction, DateRangeType, EnforcementType, FileActionType, ScanResult } from './scan-types';
16
+ import { ScanActions } from './scan-context-types';
17
+
18
+ // ============================================================================
19
+ // Actions Factory Hook
20
+ // ============================================================================
21
+
22
+ /**
23
+ * Hook that creates memoized action creators for the scan context
24
+ */
25
+ export const useScanActions = (
26
+ dispatch: React.Dispatch<ScanAction>,
27
+ executeConfirmAction: () => void,
28
+ executeFileAction: () => void
29
+ ): ScanActions => {
30
+ return useMemo(() => ({
31
+ // Tab
32
+ setTab: (tab: number) => dispatch({ type: 'SET_TAB', payload: tab }),
33
+
34
+ // Search
35
+ setPublisherQuery: (query: string) => dispatch({ type: 'SET_PUBLISHER_QUERY', payload: query }),
36
+ setNamespaceQuery: (query: string) => dispatch({ type: 'SET_NAMESPACE_QUERY', payload: query }),
37
+ setNameQuery: (query: string) => dispatch({ type: 'SET_NAME_QUERY', payload: query }),
38
+ handlePublisherChange: (event: React.ChangeEvent<HTMLInputElement>) =>
39
+ dispatch({ type: 'SET_PUBLISHER_QUERY', payload: event.target.value }),
40
+ handleNamespaceChange: (event: React.ChangeEvent<HTMLInputElement>) =>
41
+ dispatch({ type: 'SET_NAMESPACE_QUERY', payload: event.target.value }),
42
+ handleNameChange: (event: React.ChangeEvent<HTMLInputElement>) =>
43
+ dispatch({ type: 'SET_NAME_QUERY', payload: event.target.value }),
44
+
45
+ // Pagination
46
+ setPage: (page: number) => dispatch({ type: 'SET_PAGE', payload: page }),
47
+
48
+ // Filters
49
+ setDateRange: (range: DateRangeType) => dispatch({ type: 'SET_DATE_RANGE', payload: range }),
50
+ setEnforcement: (enforcement: EnforcementType) => dispatch({ type: 'SET_ENFORCEMENT', payload: enforcement }),
51
+ setAutoRefresh: (enabled: boolean) => dispatch({ type: 'SET_AUTO_REFRESH', payload: enabled }),
52
+ setFileDateRange: (range: DateRangeType) => dispatch({ type: 'SET_FILE_DATE_RANGE', payload: range }),
53
+ toggleStatusFilter: (status: string) => dispatch({ type: 'TOGGLE_STATUS_FILTER', payload: status }),
54
+ toggleQuarantineFilter: (filter: string) => dispatch({ type: 'TOGGLE_QUARANTINE_FILTER', payload: filter }),
55
+ toggleThreatScannerFilter: (scanner: string) => dispatch({ type: 'TOGGLE_THREAT_SCANNER_FILTER', payload: scanner }),
56
+ toggleValidationTypeFilter: (type: string) => dispatch({ type: 'TOGGLE_VALIDATION_TYPE_FILTER', payload: type }),
57
+
58
+ // Menu anchors
59
+ openFilterMenu: (event: React.MouseEvent<HTMLElement>) =>
60
+ dispatch({ type: 'SET_FILTER_MENU_ANCHOR', payload: event.currentTarget }),
61
+ closeFilterMenu: () => dispatch({ type: 'SET_FILTER_MENU_ANCHOR', payload: null }),
62
+ openQuarantineFilterMenu: (event: React.MouseEvent<HTMLElement>) =>
63
+ dispatch({ type: 'SET_QUARANTINE_FILTER_MENU_ANCHOR', payload: event.currentTarget }),
64
+ closeQuarantineFilterMenu: () => dispatch({ type: 'SET_QUARANTINE_FILTER_MENU_ANCHOR', payload: null }),
65
+ openAutoRejectedFilterMenu: (event: React.MouseEvent<HTMLElement>) =>
66
+ dispatch({ type: 'SET_AUTO_REJECTED_FILTER_MENU_ANCHOR', payload: event.currentTarget }),
67
+ closeAutoRejectedFilterMenu: () => dispatch({ type: 'SET_AUTO_REJECTED_FILTER_MENU_ANCHOR', payload: null }),
68
+
69
+ // Selection
70
+ toggleQuarantinedCheck: (id: string, checked: boolean) =>
71
+ dispatch({ type: 'TOGGLE_QUARANTINED_CHECKED', payload: { id, checked } }),
72
+ selectAllQuarantined: (scans: ScanResult[]) =>
73
+ dispatch({ type: 'SELECT_ALL_QUARANTINED', payload: scans }),
74
+ deselectAllQuarantined: () => dispatch({ type: 'DESELECT_ALL_QUARANTINED' }),
75
+ setFilesChecked: (fileIds: Set<string>) =>
76
+ dispatch({ type: 'SET_FILES_CHECKED', payload: fileIds }),
77
+
78
+ // Dialogs
79
+ openAllowDialog: () => dispatch({ type: 'OPEN_CONFIRM_DIALOG', payload: 'allow' }),
80
+ openBlockDialog: () => dispatch({ type: 'OPEN_CONFIRM_DIALOG', payload: 'block' }),
81
+ closeConfirmDialog: () => dispatch({ type: 'CLOSE_CONFIRM_DIALOG' }),
82
+ executeConfirmAction,
83
+ openFileDialog: (action: FileActionType) => dispatch({ type: 'OPEN_FILE_DIALOG', payload: action }),
84
+ closeFileDialog: () => dispatch({ type: 'CLOSE_FILE_DIALOG' }),
85
+ executeFileAction,
86
+ }), [dispatch, executeConfirmAction, executeFileAction]);
87
+ };
@@ -0,0 +1,137 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation
3
+ *
4
+ * See the NOTICE file(s) distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ *
7
+ * This program and the accompanying materials are made available under the
8
+ * terms of the Eclipse Public License 2.0 which is available at
9
+ * https://www.eclipse.org/legal/epl-2.0
10
+ *
11
+ * SPDX-License-Identifier: EPL-2.0
12
+ ********************************************************************************/
13
+
14
+ import { useCallback } from 'react';
15
+ import { ScanState, ScanAction } from './scan-types';
16
+
17
+ // ============================================================================
18
+ // Confirm Action Hook
19
+ // ============================================================================
20
+
21
+ /**
22
+ * Hook that returns the async confirm action handler for allow/block operations
23
+ * on selected quarantined scans. Makes a single API call to persist the decision.
24
+ * The backend handles adding enforced threat files to the allow/block list.
25
+ */
26
+ export const useConfirmAction = (
27
+ service: any,
28
+ state: ScanState,
29
+ dispatch: React.Dispatch<ScanAction>,
30
+ handleErrorRef: React.MutableRefObject<(error: any) => void>
31
+ ) => {
32
+ return useCallback(async () => {
33
+ const abortController = new AbortController();
34
+
35
+ try {
36
+ // Get selected scan IDs
37
+ const selectedScanIds: string[] = [];
38
+ for (const id in state.quarantinedChecked) {
39
+ if (state.quarantinedChecked[id]) {
40
+ selectedScanIds.push(id);
41
+ }
42
+ }
43
+
44
+ if (selectedScanIds.length === 0) {
45
+ dispatch({ type: 'CLOSE_CONFIRM_DIALOG' });
46
+ return;
47
+ }
48
+
49
+ const decision = state.confirmAction === 'allow' ? 'allowed' : 'blocked';
50
+
51
+ // Backend handles adding enforced threat files to allow/block list automatically
52
+ const scanResponse = await service.admin.makeScanDecision(abortController, {
53
+ scanIds: selectedScanIds,
54
+ decision,
55
+ });
56
+
57
+ if (scanResponse.error) {
58
+ handleErrorRef.current(new Error(scanResponse.error));
59
+ return;
60
+ }
61
+
62
+ // Update local state and trigger refresh
63
+ dispatch({ type: 'EXECUTE_CONFIRM_ACTION' });
64
+ dispatch({ type: 'TRIGGER_REFRESH' });
65
+
66
+ } catch (err: any) {
67
+ if (!abortController.signal.aborted) {
68
+ handleErrorRef.current(err);
69
+ }
70
+ }
71
+ }, [service, state.quarantinedChecked, state.confirmAction, dispatch, handleErrorRef]);
72
+ };
73
+
74
+ // ============================================================================
75
+ // File Action Hook
76
+ // ============================================================================
77
+
78
+ /**
79
+ * Hook that returns the async file action handler for allow/block/delete operations
80
+ * on selected files in Allowed/Blocked Files tabs.
81
+ */
82
+ export const useFileAction = (
83
+ service: any,
84
+ state: ScanState,
85
+ dispatch: React.Dispatch<ScanAction>,
86
+ handleErrorRef: React.MutableRefObject<(error: any) => void>
87
+ ) => {
88
+ return useCallback(async () => {
89
+ const abortController = new AbortController();
90
+
91
+ try {
92
+ if (state.filesChecked.size === 0) {
93
+ dispatch({ type: 'CLOSE_FILE_DIALOG' });
94
+ return;
95
+ }
96
+
97
+ const selectedFileIds = Array.from(state.filesChecked).map(id => parseInt(id, 10));
98
+
99
+ if (state.fileActionType === 'delete') {
100
+ const response = await service.admin.deleteFileDecisions(abortController, {
101
+ fileIds: selectedFileIds,
102
+ });
103
+
104
+ if (response.error) {
105
+ handleErrorRef.current(new Error(response.error));
106
+ return;
107
+ }
108
+ } else {
109
+ const decision = state.fileActionType === 'allow' ? 'allowed' : 'blocked';
110
+
111
+ const selectedFiles = state.files.filter(file => state.filesChecked.has(file.id));
112
+ const fileHashes = selectedFiles.map(file => file.fileHash);
113
+
114
+ const response = await service.admin.makeFileDecision(abortController, {
115
+ fileHashes,
116
+ decision,
117
+ });
118
+
119
+ if (response.error) {
120
+ handleErrorRef.current(new Error(response.error));
121
+ return;
122
+ }
123
+ }
124
+
125
+ // Update local state and trigger refresh
126
+ dispatch({ type: 'SET_FILES_CHECKED', payload: new Set() });
127
+ dispatch({ type: 'CLOSE_FILE_DIALOG' });
128
+ dispatch({ type: 'RESET_PAGE' }); // Go back to first page after action
129
+ dispatch({ type: 'TRIGGER_REFRESH' });
130
+
131
+ } catch (err: any) {
132
+ if (!abortController.signal.aborted) {
133
+ handleErrorRef.current(err);
134
+ }
135
+ }
136
+ }, [service, state.filesChecked, state.fileActionType, state.files, dispatch, handleErrorRef]);
137
+ };