openvsx-webui-test 0.17.1 → 0.18.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) 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 +85 -1
  168. package/lib/extension-registry-service.d.ts.map +1 -1
  169. package/lib/extension-registry-service.js +197 -0
  170. package/lib/extension-registry-service.js.map +1 -1
  171. package/lib/extension-registry-types.d.ts +140 -0
  172. package/lib/extension-registry-types.d.ts.map +1 -1
  173. package/lib/extension-registry-types.js.map +1 -1
  174. package/lib/hooks/scan-admin/index.d.ts +34 -0
  175. package/lib/hooks/scan-admin/index.d.ts.map +1 -0
  176. package/lib/hooks/scan-admin/index.js +28 -0
  177. package/lib/hooks/scan-admin/index.js.map +1 -0
  178. package/lib/hooks/scan-admin/use-auto-rejected-tab.d.ts +76 -0
  179. package/lib/hooks/scan-admin/use-auto-rejected-tab.d.ts.map +1 -0
  180. package/lib/hooks/scan-admin/use-auto-rejected-tab.js +79 -0
  181. package/lib/hooks/scan-admin/use-auto-rejected-tab.js.map +1 -0
  182. package/lib/hooks/scan-admin/use-dialogs.d.ts +43 -0
  183. package/lib/hooks/scan-admin/use-dialogs.d.ts.map +1 -0
  184. package/lib/hooks/scan-admin/use-dialogs.js +55 -0
  185. package/lib/hooks/scan-admin/use-dialogs.js.map +1 -0
  186. package/lib/hooks/scan-admin/use-file-list-tab.d.ts +208 -0
  187. package/lib/hooks/scan-admin/use-file-list-tab.d.ts.map +1 -0
  188. package/lib/hooks/scan-admin/use-file-list-tab.js +125 -0
  189. package/lib/hooks/scan-admin/use-file-list-tab.js.map +1 -0
  190. package/lib/hooks/scan-admin/use-pagination.d.ts +36 -0
  191. package/lib/hooks/scan-admin/use-pagination.d.ts.map +1 -0
  192. package/lib/hooks/scan-admin/use-pagination.js +79 -0
  193. package/lib/hooks/scan-admin/use-pagination.js.map +1 -0
  194. package/lib/hooks/scan-admin/use-quarantined-tab.d.ts +92 -0
  195. package/lib/hooks/scan-admin/use-quarantined-tab.d.ts.map +1 -0
  196. package/lib/hooks/scan-admin/use-quarantined-tab.js +125 -0
  197. package/lib/hooks/scan-admin/use-quarantined-tab.js.map +1 -0
  198. package/lib/hooks/scan-admin/use-scan-card-state.d.ts +29 -0
  199. package/lib/hooks/scan-admin/use-scan-card-state.d.ts.map +1 -0
  200. package/lib/hooks/scan-admin/use-scan-card-state.js +50 -0
  201. package/lib/hooks/scan-admin/use-scan-card-state.js.map +1 -0
  202. package/lib/hooks/scan-admin/use-scan-filters.d.ts +53 -0
  203. package/lib/hooks/scan-admin/use-scan-filters.d.ts.map +1 -0
  204. package/lib/hooks/scan-admin/use-scan-filters.js +75 -0
  205. package/lib/hooks/scan-admin/use-scan-filters.js.map +1 -0
  206. package/lib/hooks/scan-admin/use-scans-tab.d.ts +85 -0
  207. package/lib/hooks/scan-admin/use-scans-tab.d.ts.map +1 -0
  208. package/lib/hooks/scan-admin/use-scans-tab.js +87 -0
  209. package/lib/hooks/scan-admin/use-scans-tab.js.map +1 -0
  210. package/lib/hooks/scan-admin/use-search.d.ts +32 -0
  211. package/lib/hooks/scan-admin/use-search.d.ts.map +1 -0
  212. package/lib/hooks/scan-admin/use-search.js +48 -0
  213. package/lib/hooks/scan-admin/use-search.js.map +1 -0
  214. package/lib/hooks/scan-admin/use-tab-navigation.d.ts +96 -0
  215. package/lib/hooks/scan-admin/use-tab-navigation.d.ts.map +1 -0
  216. package/lib/hooks/scan-admin/use-tab-navigation.js +70 -0
  217. package/lib/hooks/scan-admin/use-tab-navigation.js.map +1 -0
  218. package/lib/hooks/scan-admin/use-url-sync.d.ts +22 -0
  219. package/lib/hooks/scan-admin/use-url-sync.d.ts.map +1 -0
  220. package/lib/hooks/scan-admin/use-url-sync.js +252 -0
  221. package/lib/hooks/scan-admin/use-url-sync.js.map +1 -0
  222. package/lib/page-settings.d.ts +4 -0
  223. package/lib/page-settings.d.ts.map +1 -1
  224. package/lib/pages/admin-dashboard/admin-dashboard.d.ts +1 -0
  225. package/lib/pages/admin-dashboard/admin-dashboard.d.ts.map +1 -1
  226. package/lib/pages/admin-dashboard/admin-dashboard.js +23 -3
  227. package/lib/pages/admin-dashboard/admin-dashboard.js.map +1 -1
  228. package/lib/pages/admin-dashboard/publisher-admin.js +1 -1
  229. package/lib/pages/admin-dashboard/publisher-admin.js.map +1 -1
  230. package/lib/pages/admin-dashboard/publisher-revoke-dialog.d.ts.map +1 -1
  231. package/lib/pages/admin-dashboard/publisher-revoke-dialog.js +1 -1
  232. package/lib/pages/admin-dashboard/publisher-revoke-dialog.js.map +1 -1
  233. package/lib/pages/admin-dashboard/scan-admin.d.ts +20 -0
  234. package/lib/pages/admin-dashboard/scan-admin.d.ts.map +1 -0
  235. package/lib/pages/admin-dashboard/scan-admin.js +66 -0
  236. package/lib/pages/admin-dashboard/scan-admin.js.map +1 -0
  237. package/lib/pages/admin-dashboard/welcome.d.ts.map +1 -1
  238. package/lib/pages/admin-dashboard/welcome.js +2 -1
  239. package/lib/pages/admin-dashboard/welcome.js.map +1 -1
  240. package/lib/pages/extension-detail/extension-detail-overview.d.ts.map +1 -1
  241. package/lib/pages/extension-detail/extension-detail-overview.js +9 -1
  242. package/lib/pages/extension-detail/extension-detail-overview.js.map +1 -1
  243. package/lib/pages/extension-detail/extension-detail-reviews.d.ts.map +1 -1
  244. package/lib/pages/extension-detail/extension-detail-reviews.js +67 -18
  245. package/lib/pages/extension-detail/extension-detail-reviews.js.map +1 -1
  246. package/lib/pages/extension-detail/extension-detail.js +2 -2
  247. package/lib/pages/extension-detail/extension-detail.js.map +1 -1
  248. package/lib/pages/extension-detail/extension-rating-stars.d.ts +2 -2
  249. package/lib/pages/extension-detail/extension-rating-stars.d.ts.map +1 -1
  250. package/lib/pages/extension-detail/extension-rating-stars.js +1 -1
  251. package/lib/pages/extension-detail/extension-rating-stars.js.map +1 -1
  252. package/lib/pages/extension-list/extension-list-item.js +2 -2
  253. package/lib/pages/extension-list/extension-list-item.js.map +1 -1
  254. package/lib/pages/user/user-namespace-extension-list-item.d.ts.map +1 -1
  255. package/lib/pages/user/user-namespace-extension-list-item.js +23 -9
  256. package/lib/pages/user/user-namespace-extension-list-item.js.map +1 -1
  257. package/lib/pages/user/user-publisher-agreement.d.ts.map +1 -1
  258. package/lib/pages/user/user-publisher-agreement.js +34 -13
  259. package/lib/pages/user/user-publisher-agreement.js.map +1 -1
  260. package/lib/pages/user/user-settings-profile.d.ts.map +1 -1
  261. package/lib/pages/user/user-settings-profile.js +10 -5
  262. package/lib/pages/user/user-settings-profile.js.map +1 -1
  263. package/lib/pages/user/user-settings-tokens.d.ts.map +1 -1
  264. package/lib/pages/user/user-settings-tokens.js +13 -5
  265. package/lib/pages/user/user-settings-tokens.js.map +1 -1
  266. package/package.json +10 -9
  267. package/src/components/button-with-progress.tsx +2 -1
  268. package/src/components/sanitized-markdown.tsx +81 -1
  269. package/src/components/scan-admin/common/auto-refresh.tsx +79 -0
  270. package/src/components/scan-admin/common/conditional-tooltip.tsx +74 -0
  271. package/src/components/scan-admin/common/file-table.tsx +508 -0
  272. package/src/components/scan-admin/common/index.ts +18 -0
  273. package/src/components/scan-admin/common/tab-panel.tsx +42 -0
  274. package/src/components/scan-admin/common/utils.ts +48 -0
  275. package/src/components/scan-admin/dialogs/file-dialog.tsx +137 -0
  276. package/src/components/scan-admin/dialogs/index.ts +15 -0
  277. package/src/components/scan-admin/dialogs/quarantine-dialog.tsx +270 -0
  278. package/src/components/scan-admin/index.ts +52 -0
  279. package/src/components/scan-admin/scan-card/index.ts +20 -0
  280. package/src/components/scan-admin/scan-card/scan-card-content.tsx +457 -0
  281. package/src/components/scan-admin/scan-card/scan-card-expand-strip-badges.tsx +186 -0
  282. package/src/components/scan-admin/scan-card/scan-card-expand-strip.tsx +104 -0
  283. package/src/components/scan-admin/scan-card/scan-card-expanded-content.tsx +262 -0
  284. package/src/components/scan-admin/scan-card/scan-card-header.tsx +176 -0
  285. package/src/components/scan-admin/scan-card/scan-card.tsx +152 -0
  286. package/src/components/scan-admin/scan-card/scan-detail-card.tsx +144 -0
  287. package/src/components/scan-admin/scan-card/utils.ts +199 -0
  288. package/src/components/scan-admin/tab-contents/allow-list-tab-content.tsx +119 -0
  289. package/src/components/scan-admin/tab-contents/auto-rejected-tab-content.tsx +106 -0
  290. package/src/components/scan-admin/tab-contents/block-list-tab-content.tsx +119 -0
  291. package/src/components/scan-admin/tab-contents/index.ts +18 -0
  292. package/src/components/scan-admin/tab-contents/quarantined-tab-content.tsx +158 -0
  293. package/src/components/scan-admin/tab-contents/scans-tab-content.tsx +113 -0
  294. package/src/components/scan-admin/toolbars/counts-toolbar.tsx +262 -0
  295. package/src/components/scan-admin/toolbars/index.ts +16 -0
  296. package/src/components/scan-admin/toolbars/search-toolbar.tsx +255 -0
  297. package/src/components/scan-admin/toolbars/tab-toolbar.tsx +56 -0
  298. package/src/context/scan-admin/index.ts +43 -0
  299. package/src/context/scan-admin/scan-actions.ts +87 -0
  300. package/src/context/scan-admin/scan-api-actions.ts +137 -0
  301. package/src/context/scan-admin/scan-api-effects.ts +491 -0
  302. package/src/context/scan-admin/scan-context-types.ts +102 -0
  303. package/src/context/scan-admin/scan-context.tsx +123 -0
  304. package/src/context/scan-admin/scan-helpers.ts +63 -0
  305. package/src/context/scan-admin/scan-reducer.ts +321 -0
  306. package/src/context/scan-admin/scan-types.ts +337 -0
  307. package/src/default/page-settings.tsx +3 -0
  308. package/src/default/theme.tsx +102 -13
  309. package/src/extension-registry-service.ts +216 -1
  310. package/src/extension-registry-types.ts +157 -0
  311. package/src/hooks/scan-admin/index.ts +48 -0
  312. package/src/hooks/scan-admin/use-auto-rejected-tab.ts +85 -0
  313. package/src/hooks/scan-admin/use-dialogs.ts +83 -0
  314. package/src/hooks/scan-admin/use-file-list-tab.ts +149 -0
  315. package/src/hooks/scan-admin/use-pagination.ts +90 -0
  316. package/src/hooks/scan-admin/use-quarantined-tab.ts +138 -0
  317. package/src/hooks/scan-admin/use-scan-card-state.ts +73 -0
  318. package/src/hooks/scan-admin/use-scan-filters.ts +83 -0
  319. package/src/hooks/scan-admin/use-scans-tab.ts +92 -0
  320. package/src/hooks/scan-admin/use-search.ts +54 -0
  321. package/src/hooks/scan-admin/use-tab-navigation.ts +82 -0
  322. package/src/hooks/scan-admin/use-url-sync.ts +293 -0
  323. package/src/page-settings.ts +4 -0
  324. package/src/pages/admin-dashboard/admin-dashboard.tsx +26 -2
  325. package/src/pages/admin-dashboard/publisher-admin.tsx +1 -1
  326. package/src/pages/admin-dashboard/publisher-revoke-dialog.tsx +2 -1
  327. package/src/pages/admin-dashboard/scan-admin.tsx +109 -0
  328. package/src/pages/admin-dashboard/welcome.tsx +1 -0
  329. package/src/pages/extension-detail/extension-detail-overview.tsx +16 -2
  330. package/src/pages/extension-detail/extension-detail-reviews.tsx +116 -30
  331. package/src/pages/extension-detail/extension-detail.tsx +2 -2
  332. package/src/pages/extension-detail/extension-rating-stars.tsx +2 -2
  333. package/src/pages/extension-list/extension-list-item.tsx +2 -2
  334. package/src/pages/user/user-namespace-extension-list-item.tsx +38 -13
  335. package/src/pages/user/user-publisher-agreement.tsx +30 -11
  336. package/src/pages/user/user-settings-profile.tsx +10 -6
  337. package/src/pages/user/user-settings-tokens.tsx +15 -6
@@ -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
+ }