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,491 @@
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 { useEffect } from 'react';
15
+ import { ScanState, ScanAction, ScanResult } from './scan-types';
16
+ import { getDateRangeParams, getFileDateRange } from './scan-helpers';
17
+
18
+ // ============================================================================
19
+ // Filter Options Effect
20
+ // ============================================================================
21
+
22
+ /**
23
+ * Hook to fetch filter options (validation types, threat scanners) on mount and refresh
24
+ */
25
+ export const useFilterOptionsEffect = (
26
+ service: any,
27
+ state: ScanState,
28
+ dispatch: React.Dispatch<ScanAction>,
29
+ handleErrorRef: React.MutableRefObject<(error: any) => void>
30
+ ) => {
31
+ useEffect(() => {
32
+ const abortController = new AbortController();
33
+
34
+ const fetchFilterOptions = async () => {
35
+ try {
36
+ const options = await service.admin.getScanFilterOptions(abortController);
37
+ if (!abortController.signal.aborted) {
38
+ dispatch({ type: 'SET_AVAILABLE_VALIDATION_TYPES', payload: options.validationTypes || [] });
39
+ dispatch({ type: 'SET_AVAILABLE_THREAT_SCANNERS', payload: options.threatScannerNames || [] });
40
+ dispatch({ type: 'SET_FILTER_OPTIONS_LOADED', payload: true });
41
+ }
42
+ } catch (err: any) {
43
+ if (!abortController.signal.aborted) {
44
+ // Even on error, mark as loaded so we don't block forever
45
+ dispatch({ type: 'SET_FILTER_OPTIONS_LOADED', payload: true });
46
+ handleErrorRef.current(err);
47
+ }
48
+ }
49
+ };
50
+
51
+ fetchFilterOptions();
52
+ return () => abortController.abort();
53
+ }, [service, state.refreshTrigger, dispatch, handleErrorRef]);
54
+ };
55
+
56
+ // ============================================================================
57
+ // Scans Effect
58
+ // ============================================================================
59
+
60
+ /**
61
+ * Hook to fetch scans from API (tabs 0, 1, 2: Scans, Quarantined, Auto Rejected)
62
+ */
63
+ export const useScansEffect = (
64
+ service: any,
65
+ state: ScanState,
66
+ dispatch: React.Dispatch<ScanAction>,
67
+ handleErrorRef: React.MutableRefObject<(error: any) => void>
68
+ ) => {
69
+ useEffect(() => {
70
+ // Only fetch scans for tabs 0, 1, 2
71
+ if (state.selectedTab > 2) {
72
+ return;
73
+ }
74
+
75
+ // Wait for filter options to be loaded to avoid duplicate requests
76
+ if (!state.filterOptionsLoaded) {
77
+ return;
78
+ }
79
+
80
+ // For Quarantined tab, don't fetch if there are no threat scanners available
81
+ // (we only show scans with threats, so no threat scanners = no data to show)
82
+ if (state.selectedTab === 1 && state.availableThreatScanners.length === 0) {
83
+ dispatch({ type: 'SET_SCANS', payload: { scans: [], totalScans: 0 } });
84
+ dispatch({ type: 'SET_LOADING_SCANS', payload: false });
85
+ return;
86
+ }
87
+
88
+ // For Auto Rejected tab, don't fetch if there are no validation types available
89
+ // (we only show scans with validation failures, so no validation types = no data to show)
90
+ if (state.selectedTab === 2 && state.availableValidationTypes.length === 0) {
91
+ dispatch({ type: 'SET_SCANS', payload: { scans: [], totalScans: 0 } });
92
+ dispatch({ type: 'SET_LOADING_SCANS', payload: false });
93
+ return;
94
+ }
95
+
96
+ const abortController = new AbortController();
97
+
98
+ const fetchScans = async () => {
99
+ // Only show loading state if we don't have existing data to display
100
+ // This allows seamless background refreshes
101
+ if (state.scans.length === 0) {
102
+ dispatch({ type: 'SET_LOADING_SCANS', payload: true });
103
+ }
104
+ try {
105
+ // Determine status filter based on selected tab and status filters
106
+ let statusParam: string[] | string | undefined;
107
+ let validationTypeParam: string[] | undefined;
108
+ let threatScannerParam: string[] | undefined;
109
+ let adminDecisionParam: string[] | undefined;
110
+
111
+ if (state.selectedTab === 0) {
112
+ // Scans tab - use statusFilters, expanding 'running' to explicit statuses
113
+ statusParam = Array.from(state.statusFilters).reduce((result, status) => {
114
+ if (status === 'running') {
115
+ return [...result, 'STARTED', 'VALIDATING', 'SCANNING'];
116
+ }
117
+ return [...result, status];
118
+ }, [] as string[]);
119
+ } else if (state.selectedTab === 1) {
120
+ // Quarantined tab - show scans with threats
121
+ // Filter by threat scanner (user selection or all available)
122
+ if (state.threatScannerFilters.size > 0) {
123
+ threatScannerParam = Array.from(state.threatScannerFilters);
124
+ } else {
125
+ threatScannerParam = state.availableThreatScanners;
126
+ }
127
+ // Filter by admin decision status (allowed/blocked/needs-review)
128
+ if (state.quarantineFilters.size > 0) {
129
+ adminDecisionParam = Array.from(state.quarantineFilters);
130
+ }
131
+ } else if (state.selectedTab === 2) {
132
+ // Auto Rejected tab - show scans with validation failures
133
+ // Filter by validation type (user selection or all available)
134
+ if (state.validationTypeFilters.size > 0) {
135
+ validationTypeParam = Array.from(state.validationTypeFilters);
136
+ } else {
137
+ validationTypeParam = state.availableValidationTypes;
138
+ }
139
+ }
140
+
141
+ const dateParams = getDateRangeParams(state.dateRange);
142
+
143
+ const response = await service.admin.getAllScans(abortController, {
144
+ size: state.pageSize,
145
+ offset: state.currentPage * state.pageSize,
146
+ publisher: state.publisherQuery || undefined,
147
+ namespace: state.namespaceQuery || undefined,
148
+ name: state.nameQuery || undefined,
149
+ status: statusParam,
150
+ validationType: validationTypeParam,
151
+ threatScannerName: threatScannerParam,
152
+ adminDecision: adminDecisionParam,
153
+ dateStartedFrom: dateParams.dateStartedFrom,
154
+ dateStartedTo: dateParams.dateStartedTo,
155
+ enforcement: state.enforcement
156
+ });
157
+
158
+ if (!abortController.signal.aborted) {
159
+ dispatch({ type: 'SET_LOADING_SCANS', payload: false });
160
+ // Convert API response to ScanResult format
161
+ const convertedScans: ScanResult[] = response.scans.map((scan: any) => ({
162
+ id: scan.id,
163
+ displayName: scan.displayName || scan.extensionName,
164
+ namespace: scan.namespace,
165
+ extensionName: scan.extensionName,
166
+ publisher: scan.publisher || '',
167
+ publisherUrl: scan.publisherUrl || null,
168
+ version: scan.version,
169
+ targetPlatform: scan.targetPlatform || 'universal',
170
+ universalTargetPlatform: scan.universalTargetPlatform ?? true,
171
+ status: scan.status as any,
172
+ dateScanStarted: scan.dateScanStarted,
173
+ dateScanEnded: scan.dateScanEnded || null,
174
+ dateQuarantined: scan.dateQuarantined || null,
175
+ dateRejected: scan.dateRejected || null,
176
+ adminDecision: scan.adminDecision ? {
177
+ decision: scan.adminDecision.decision,
178
+ decidedBy: scan.adminDecision.decidedBy,
179
+ dateDecided: scan.adminDecision.dateDecided,
180
+ } : null,
181
+ threats: (scan.threats || []).map((threat: any) => ({
182
+ id: threat.id,
183
+ fileName: threat.fileName,
184
+ fileHash: threat.fileHash,
185
+ fileExtension: threat.fileExtension,
186
+ type: threat.type,
187
+ ruleName: threat.ruleName,
188
+ severity: threat.severity,
189
+ enforcedFlag: threat.enforcedFlag ?? true,
190
+ reason: threat.reason,
191
+ dateDetected: threat.dateDetected,
192
+ })),
193
+ validationFailures: (scan.validationFailures || []).map((failure: any) => ({
194
+ id: failure.id,
195
+ type: failure.type,
196
+ ruleName: failure.ruleName,
197
+ reason: failure.reason,
198
+ dateDetected: failure.dateDetected,
199
+ enforcedFlag: failure.enforcedFlag ?? true,
200
+ })),
201
+ checkResults: (scan.checkResults || []).map((result: any) => ({
202
+ checkType: result.checkType,
203
+ category: result.category,
204
+ result: result.result,
205
+ startedAt: result.startedAt,
206
+ completedAt: result.completedAt || null,
207
+ durationMs: result.durationMs ?? null,
208
+ filesScanned: result.filesScanned || null,
209
+ findingsCount: result.findingsCount || null,
210
+ summary: result.summary || null,
211
+ errorMessage: result.errorMessage || null,
212
+ required: result.required ?? null,
213
+ })),
214
+ extensionIcon: scan.extensionIcon,
215
+ downloadUrl: scan.downloadUrl || null,
216
+ errorMessage: scan.errorMessage || null,
217
+ }));
218
+
219
+ dispatch({ type: 'SET_SCANS', payload: { scans: convertedScans, totalScans: response.totalSize } });
220
+ dispatch({ type: 'SET_LAST_REFRESHED', payload: new Date() });
221
+ }
222
+ } catch (err: any) {
223
+ if (!abortController.signal.aborted) {
224
+ dispatch({ type: 'SET_LOADING_SCANS', payload: false });
225
+ handleErrorRef.current(err);
226
+ }
227
+ }
228
+ };
229
+
230
+ fetchScans();
231
+ return () => abortController.abort();
232
+ }, [
233
+ service,
234
+ state.filterOptionsLoaded,
235
+ state.currentPage,
236
+ state.pageSize,
237
+ state.publisherQuery,
238
+ state.namespaceQuery,
239
+ state.nameQuery,
240
+ state.selectedTab,
241
+ state.statusFilters,
242
+ state.quarantineFilters,
243
+ state.validationTypeFilters,
244
+ state.threatScannerFilters,
245
+ state.availableThreatScanners,
246
+ state.availableValidationTypes,
247
+ state.dateRange,
248
+ state.enforcement,
249
+ state.refreshTrigger,
250
+ dispatch,
251
+ handleErrorRef,
252
+ ]);
253
+ };
254
+
255
+ // ============================================================================
256
+ // Scan Counts Effect
257
+ // ============================================================================
258
+
259
+ /**
260
+ * Hook to fetch scan counts from API
261
+ * Uses the same tab-aware filtering logic as the scans list
262
+ */
263
+ export const useScanCountsEffect = (
264
+ service: any,
265
+ state: ScanState,
266
+ dispatch: React.Dispatch<ScanAction>,
267
+ handleErrorRef: React.MutableRefObject<(error: any) => void>
268
+ ) => {
269
+ useEffect(() => {
270
+ const abortController = new AbortController();
271
+
272
+ const fetchCounts = async () => {
273
+ try {
274
+ const dateParams = getDateRangeParams(state.dateRange);
275
+
276
+ // Determine filters based on selected tab (same logic as scans fetch)
277
+ let validationTypeParam: string[] | undefined;
278
+ let threatScannerParam: string[] | undefined;
279
+
280
+ if (state.selectedTab === 0) {
281
+ // Scans tab - no threatScanner or validationType filters
282
+ // (same as scans endpoint which only uses statusFilters on this tab)
283
+ } else if (state.selectedTab === 1) {
284
+ // Quarantined tab - filter by threat scanner (user selection or all available)
285
+ if (state.threatScannerFilters.size > 0) {
286
+ threatScannerParam = Array.from(state.threatScannerFilters);
287
+ } else {
288
+ threatScannerParam = state.availableThreatScanners;
289
+ }
290
+ } else if (state.selectedTab === 2) {
291
+ // Auto Rejected tab - filter by validation type (user selection or all available)
292
+ if (state.validationTypeFilters.size > 0) {
293
+ validationTypeParam = Array.from(state.validationTypeFilters);
294
+ } else {
295
+ validationTypeParam = state.availableValidationTypes;
296
+ }
297
+ }
298
+
299
+ const counts = await service.admin.getScanCounts(abortController, {
300
+ ...dateParams,
301
+ enforcement: state.enforcement,
302
+ threatScannerName: threatScannerParam,
303
+ validationType: validationTypeParam,
304
+ });
305
+
306
+ if (!abortController.signal.aborted) {
307
+ dispatch({ type: 'SET_SCAN_COUNTS', payload: counts });
308
+ }
309
+ } catch (err: any) {
310
+ if (!abortController.signal.aborted) {
311
+ handleErrorRef.current(err);
312
+ }
313
+ }
314
+ };
315
+
316
+ fetchCounts();
317
+ return () => abortController.abort();
318
+ }, [
319
+ service,
320
+ state.dateRange,
321
+ state.enforcement,
322
+ state.threatScannerFilters,
323
+ state.validationTypeFilters,
324
+ state.selectedTab,
325
+ state.availableThreatScanners,
326
+ state.availableValidationTypes,
327
+ state.refreshTrigger,
328
+ dispatch,
329
+ handleErrorRef,
330
+ ]);
331
+ };
332
+
333
+ // ============================================================================
334
+ // Files Effect
335
+ // ============================================================================
336
+
337
+ /**
338
+ * Hook to fetch files from API (tabs 3, 4: Allowed Files, Blocked Files)
339
+ */
340
+ export const useFilesEffect = (
341
+ service: any,
342
+ state: ScanState,
343
+ dispatch: React.Dispatch<ScanAction>,
344
+ handleErrorRef: React.MutableRefObject<(error: any) => void>
345
+ ) => {
346
+ useEffect(() => {
347
+ // Only fetch files for tabs 3 and 4
348
+ if (state.selectedTab < 3) {
349
+ return;
350
+ }
351
+
352
+ const abortController = new AbortController();
353
+
354
+ const fetchFiles = async () => {
355
+ // Only show loading state if we don't have existing data to display
356
+ // (Avoids flashing loading indicator when auto-refreshing)
357
+ if (state.files.length === 0) {
358
+ dispatch({ type: 'SET_LOADING_FILES', payload: true });
359
+ }
360
+ try {
361
+ // Determine decision filter based on selected tab
362
+ const decisionParam = state.selectedTab === 3 ? 'allowed' : 'blocked';
363
+
364
+ // Get date range parameters
365
+ const dateParams = getFileDateRange(state.fileDateRange);
366
+
367
+ const response = await service.admin.getFiles(abortController, {
368
+ size: state.pageSize,
369
+ offset: state.currentPage * state.pageSize,
370
+ publisher: state.publisherQuery || undefined,
371
+ namespace: state.namespaceQuery || undefined,
372
+ name: state.nameQuery || undefined,
373
+ decision: decisionParam,
374
+ dateDecidedFrom: dateParams.dateDecidedFrom,
375
+ dateDecidedTo: dateParams.dateDecidedTo,
376
+ });
377
+
378
+ if (!abortController.signal.aborted) {
379
+ dispatch({ type: 'SET_LOADING_FILES', payload: false });
380
+ dispatch({ type: 'SET_FILES', payload: { files: response.files, totalFiles: response.totalSize } });
381
+ dispatch({ type: 'SET_LAST_REFRESHED', payload: new Date() });
382
+ }
383
+ } catch (err: any) {
384
+ if (!abortController.signal.aborted) {
385
+ dispatch({ type: 'SET_LOADING_FILES', payload: false });
386
+ handleErrorRef.current(err);
387
+ }
388
+ }
389
+ };
390
+
391
+ fetchFiles();
392
+ return () => abortController.abort();
393
+ }, [
394
+ service,
395
+ state.currentPage,
396
+ state.pageSize,
397
+ state.publisherQuery,
398
+ state.namespaceQuery,
399
+ state.nameQuery,
400
+ state.selectedTab,
401
+ state.fileDateRange,
402
+ state.refreshTrigger,
403
+ state.files.length,
404
+ dispatch,
405
+ handleErrorRef,
406
+ ]);
407
+ };
408
+
409
+ // ============================================================================
410
+ // File Counts Effect
411
+ // ============================================================================
412
+
413
+ /**
414
+ * Hook to fetch file counts from API
415
+ */
416
+ export const useFileCountsEffect = (
417
+ service: any,
418
+ state: ScanState,
419
+ dispatch: React.Dispatch<ScanAction>,
420
+ handleErrorRef: React.MutableRefObject<(error: any) => void>
421
+ ) => {
422
+ useEffect(() => {
423
+ // Only fetch file counts when on file tabs
424
+ if (state.selectedTab < 3) {
425
+ return;
426
+ }
427
+
428
+ const abortController = new AbortController();
429
+
430
+ const fetchFileCounts = async () => {
431
+ try {
432
+ // Get date range parameters
433
+ const dateParams = getFileDateRange(state.fileDateRange);
434
+
435
+ const counts = await service.admin.getFileCounts(abortController, {
436
+ dateDecidedFrom: dateParams.dateDecidedFrom,
437
+ dateDecidedTo: dateParams.dateDecidedTo,
438
+ });
439
+
440
+ if (!abortController.signal.aborted) {
441
+ dispatch({ type: 'SET_FILE_COUNTS', payload: counts });
442
+ }
443
+ } catch (err: any) {
444
+ if (!abortController.signal.aborted) {
445
+ handleErrorRef.current(err);
446
+ }
447
+ }
448
+ };
449
+
450
+ fetchFileCounts();
451
+ return () => abortController.abort();
452
+ }, [
453
+ service,
454
+ state.selectedTab,
455
+ state.fileDateRange,
456
+ state.refreshTrigger,
457
+ dispatch,
458
+ handleErrorRef,
459
+ ]);
460
+ };
461
+
462
+ // ============================================================================
463
+ // Auto Refresh Effect
464
+ // ============================================================================
465
+
466
+ /**
467
+ * Hook for periodic refresh - refreshes data every 30 seconds when enabled and page is visible
468
+ */
469
+ export const useAutoRefreshEffect = (
470
+ state: ScanState,
471
+ dispatch: React.Dispatch<ScanAction>
472
+ ) => {
473
+ useEffect(() => {
474
+ if (!state.autoRefresh) {
475
+ return; // Don't set up interval if auto-refresh is disabled
476
+ }
477
+
478
+ const REFRESH_INTERVAL = 30000; // 30 seconds
479
+
480
+ const intervalId = setInterval(() => {
481
+ // Only refresh when page is visible
482
+ if (!document.hidden) {
483
+ dispatch({ type: 'TRIGGER_REFRESH' });
484
+ }
485
+ }, REFRESH_INTERVAL);
486
+
487
+ return () => {
488
+ clearInterval(intervalId);
489
+ };
490
+ }, [state.autoRefresh, dispatch]);
491
+ };
@@ -0,0 +1,102 @@
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 from 'react';
15
+ import {
16
+ ScanState,
17
+ ScanAction,
18
+ DateRangeType,
19
+ EnforcementType,
20
+ FileActionType,
21
+ FileDecision,
22
+ ScanResult,
23
+ } from './scan-types';
24
+
25
+ // ============================================================================
26
+ // Context Types
27
+ // ============================================================================
28
+
29
+ export interface ScanContextValue {
30
+ state: ScanState;
31
+ dispatch: React.Dispatch<ScanAction>;
32
+ actions: ScanActions;
33
+ derived: DerivedData;
34
+ }
35
+
36
+ export interface ScanActions {
37
+ // Tab
38
+ setTab: (tab: number) => void;
39
+
40
+ // Search
41
+ setPublisherQuery: (query: string) => void;
42
+ setNamespaceQuery: (query: string) => void;
43
+ setNameQuery: (query: string) => void;
44
+ handlePublisherChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
45
+ handleNamespaceChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
46
+ handleNameChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
47
+
48
+ // Pagination
49
+ setPage: (page: number) => void;
50
+
51
+ // Filters
52
+ setDateRange: (range: DateRangeType) => void;
53
+ setEnforcement: (enforcement: EnforcementType) => void;
54
+ setAutoRefresh: (enabled: boolean) => void;
55
+ setFileDateRange: (range: DateRangeType) => void;
56
+ toggleStatusFilter: (status: string) => void;
57
+ toggleQuarantineFilter: (filter: string) => void;
58
+ toggleThreatScannerFilter: (scanner: string) => void;
59
+ toggleValidationTypeFilter: (type: string) => void;
60
+
61
+ // Menu anchors
62
+ openFilterMenu: (event: React.MouseEvent<HTMLElement>) => void;
63
+ closeFilterMenu: () => void;
64
+ openQuarantineFilterMenu: (event: React.MouseEvent<HTMLElement>) => void;
65
+ closeQuarantineFilterMenu: () => void;
66
+ openAutoRejectedFilterMenu: (event: React.MouseEvent<HTMLElement>) => void;
67
+ closeAutoRejectedFilterMenu: () => void;
68
+
69
+ // Selection
70
+ toggleQuarantinedCheck: (id: string, checked: boolean) => void;
71
+ selectAllQuarantined: (scans: ScanResult[]) => void;
72
+ deselectAllQuarantined: () => void;
73
+ setFilesChecked: (fileIds: Set<string>) => void;
74
+
75
+ // Dialogs
76
+ openAllowDialog: () => void;
77
+ openBlockDialog: () => void;
78
+ closeConfirmDialog: () => void;
79
+ executeConfirmAction: () => void;
80
+ openFileDialog: (action: FileActionType) => void;
81
+ closeFileDialog: () => void;
82
+ executeFileAction: () => void;
83
+ }
84
+
85
+ export interface DerivedData {
86
+ /** Selected quarantined extensions (for bulk allow/block actions) */
87
+ selectedExtensions: ScanResult[];
88
+ /** Selected files from Allowed/Blocked Files tabs */
89
+ selectedFiles: FileDecision[];
90
+ /** Total pages for current data set (scans or files depending on tab) */
91
+ totalPages: number;
92
+ }
93
+
94
+ // ============================================================================
95
+ // Provider Props
96
+ // ============================================================================
97
+
98
+ export interface ScanProviderProps {
99
+ children: React.ReactNode;
100
+ service: any;
101
+ handleError: (error: any) => void;
102
+ }