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,144 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation
3
+ *
4
+ * See the NOTICE file(s) distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ *
7
+ * This program and the accompanying materials are made available under the
8
+ * terms of the Eclipse Public License 2.0 which is available at
9
+ * https://www.eclipse.org/legal/epl-2.0
10
+ *
11
+ * SPDX-License-Identifier: EPL-2.0
12
+ ********************************************************************************/
13
+
14
+ import React, { FunctionComponent, ReactNode } from 'react';
15
+ import { Box, Typography, Chip } from '@mui/material';
16
+ import { Info as InfoIcon } from '@mui/icons-material';
17
+ import { useTheme } from '@mui/material/styles';
18
+
19
+ interface DetailField {
20
+ label: string;
21
+ value: string | undefined;
22
+ }
23
+
24
+ interface ScanDetailCardProps {
25
+ accentColor: string;
26
+ isUnenforced?: boolean;
27
+ chip?: {
28
+ label: string;
29
+ color: string;
30
+ textColor: string;
31
+ };
32
+ description?: string;
33
+ descriptionColor?: string;
34
+ details: DetailField[];
35
+ children?: ReactNode;
36
+ }
37
+
38
+ /**
39
+ * A detail card component for displaying scan detail items like errors,
40
+ * threats, and validation failures. Provides styling with a colored
41
+ * left border, optional chip badge, and metadata fields.
42
+ */
43
+ export const ScanDetailCard: FunctionComponent<ScanDetailCardProps> = ({
44
+ accentColor,
45
+ isUnenforced = false,
46
+ chip,
47
+ description,
48
+ descriptionColor,
49
+ details,
50
+ children,
51
+ }) => {
52
+ const theme = useTheme();
53
+
54
+ return (
55
+ <Box
56
+ sx={{
57
+ position: 'relative',
58
+ p: 1.5,
59
+ bgcolor: theme.palette.scanBackground.light,
60
+ borderRadius: 1,
61
+ paddingLeft: '20px',
62
+ '&::before': {
63
+ content: '""',
64
+ position: 'absolute',
65
+ left: 0,
66
+ top: 0,
67
+ bottom: 0,
68
+ width: '8px',
69
+ background: isUnenforced
70
+ ? `${theme.palette.unenforced.stripe}, ${accentColor}`
71
+ : accentColor,
72
+ zIndex: 0,
73
+ },
74
+ }}
75
+ >
76
+ <Box sx={{ position: 'relative', zIndex: 1 }}>
77
+ {/* Chip and unenforced indicator */}
78
+ {(chip || isUnenforced) && (
79
+ <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-start', gap: 1, mb: 1 }}>
80
+ {isUnenforced && (
81
+ <Box sx={{
82
+ display: 'flex',
83
+ alignItems: 'center',
84
+ gap: 0.5,
85
+ px: 1,
86
+ py: 0.25,
87
+ backgroundColor: theme.palette.info.dark + '20',
88
+ borderRadius: 0.5,
89
+ border: `1px solid ${theme.palette.info.dark}40`,
90
+ }}>
91
+ <InfoIcon sx={{ fontSize: 14, color: theme.palette.info.main }} />
92
+ <Typography variant='caption' sx={{ color: theme.palette.info.main, fontSize: '0.7rem' }}>
93
+ Not enforced
94
+ </Typography>
95
+ </Box>
96
+ )}
97
+ {chip && (
98
+ <Chip
99
+ label={chip.label}
100
+ size='small'
101
+ sx={{
102
+ height: '20px',
103
+ fontSize: '0.75rem',
104
+ background: isUnenforced
105
+ ? `${theme.palette.unenforced.stripe}, ${chip.color}`
106
+ : chip.color,
107
+ color: chip.textColor,
108
+ }}
109
+ />
110
+ )}
111
+ </Box>
112
+ )}
113
+
114
+ {/* Description */}
115
+ {description && (
116
+ <Typography
117
+ variant='body2'
118
+ sx={{ mb: 1, color: descriptionColor || 'text.primary' }}
119
+ >
120
+ {description}
121
+ </Typography>
122
+ )}
123
+
124
+ {/* Detail fields */}
125
+ {details.map((detail, index) => (
126
+ detail.value && (
127
+ <Typography
128
+ key={index}
129
+ variant='caption'
130
+ color='text.secondary'
131
+ display='block'
132
+ sx={{ mb: 0.5 }}
133
+ >
134
+ {detail.label}: {detail.value}
135
+ </Typography>
136
+ )
137
+ ))}
138
+
139
+ {/* Additional content */}
140
+ {children}
141
+ </Box>
142
+ </Box>
143
+ );
144
+ };
@@ -0,0 +1,199 @@
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 { ScanResult } from '../../../context/scan-admin';
15
+
16
+ // ============================================================================
17
+ // Types
18
+ // ============================================================================
19
+
20
+ export interface DetailBadge {
21
+ label: string;
22
+ isEnforced: boolean;
23
+ type: 'threat' | 'validation' | 'error';
24
+ }
25
+
26
+ // ============================================================================
27
+ // Constants
28
+ // ============================================================================
29
+
30
+ export const ICON_SIZE = 48;
31
+
32
+ // ============================================================================
33
+ // Status Utilities
34
+ // ============================================================================
35
+
36
+ export const isRunning = (status: ScanResult['status']): boolean => {
37
+ return status === 'STARTED' || status === 'VALIDATING' || status === 'SCANNING';
38
+ };
39
+
40
+ /**
41
+ * Determines whether the scan card badge/strip should show the striped effect.
42
+ * Only shows striping when the hypothetical status would be DIFFERENT from the current status.
43
+ *
44
+ * - PASSED: Stripe if any threats or validationFailures exist (hypothetical would be QUARANTINED or AUTO REJECTED)
45
+ * - QUARANTINED: Stripe only if validationFailures exist (hypothetical would be AUTO REJECTED)
46
+ * - Unenforced threats don't cause striping since hypothetical would still be QUARANTINED
47
+ * - AUTO REJECTED: Never stripe (hypothetical would still be AUTO REJECTED)
48
+ */
49
+ export const shouldShowStriped = (scan: ScanResult): boolean => {
50
+ switch (scan.status) {
51
+ case 'PASSED':
52
+ // Any issues mean hypothetical status would be different (QUARANTINED or AUTO REJECTED)
53
+ return scan.threats.length > 0 || scan.validationFailures.length > 0;
54
+
55
+ case 'QUARANTINED':
56
+ // Only validation failures would change status to AUTO REJECTED
57
+ // Unenforced threats would still result in QUARANTINED (same status, no stripe)
58
+ return scan.validationFailures.length > 0;
59
+
60
+ case 'AUTO REJECTED':
61
+ // Scan could only be AUTO REJECTED if there's at least one enforced validation failure
62
+ // Unenforced validation failures would still result in AUTO REJECTED (same status, no stripe)
63
+ return false;
64
+
65
+ default:
66
+ return false;
67
+ }
68
+ };
69
+
70
+ export const getHypotheticalStatus = (scan: ScanResult): ScanResult['status'] | null => {
71
+ if (!shouldShowStriped(scan)) return null;
72
+
73
+ const hasUnenforcedValidationFailures = scan.validationFailures.some(v => !v.enforcedFlag);
74
+ const hasUnenforcedThreats = scan.threats.some(t => !t.enforcedFlag);
75
+
76
+ if (hasUnenforcedValidationFailures) {
77
+ return 'AUTO REJECTED';
78
+ }
79
+
80
+ if (hasUnenforcedThreats) {
81
+ return 'QUARANTINED';
82
+ }
83
+
84
+ return null;
85
+ };
86
+
87
+ export const getDetailBadges = (scan: ScanResult): DetailBadge[] => {
88
+ const badges: DetailBadge[] = [];
89
+
90
+ scan.threats.forEach(threat => {
91
+ if (threat.type) {
92
+ badges.push({
93
+ label: threat.type,
94
+ isEnforced: threat.enforcedFlag,
95
+ type: 'threat'
96
+ });
97
+ }
98
+ });
99
+
100
+ scan.validationFailures.forEach(failure => {
101
+ badges.push({
102
+ label: failure.type,
103
+ isEnforced: failure.enforcedFlag,
104
+ type: 'validation'
105
+ });
106
+ });
107
+
108
+ // Add badges for check results with ERROR status
109
+ scan.checkResults?.forEach(checkResult => {
110
+ if (checkResult.result === 'ERROR') {
111
+ badges.push({
112
+ label: checkResult.checkType,
113
+ // Use "enforced" styling (solid) for required checks, striped for optional
114
+ isEnforced: checkResult.required !== false,
115
+ type: 'error'
116
+ });
117
+ }
118
+ });
119
+
120
+ return badges;
121
+ };
122
+
123
+ // ============================================================================
124
+ // Theme Utilities
125
+ // ============================================================================
126
+
127
+ export const getStatusColorSx = (status: ScanResult['status'], theme: any) => {
128
+ switch (status) {
129
+ case 'PASSED':
130
+ return {
131
+ backgroundColor: theme.palette.passed.dark,
132
+ color: theme.palette.passed.light,
133
+ '& .MuiChip-icon': {
134
+ color: theme.palette.passed.light,
135
+ },
136
+ };
137
+ case 'QUARANTINED':
138
+ return {
139
+ backgroundColor: theme.palette.quarantined.dark,
140
+ color: theme.palette.quarantined.light,
141
+ '& .MuiChip-icon': {
142
+ color: theme.palette.quarantined.light,
143
+ },
144
+ };
145
+ case 'AUTO REJECTED':
146
+ return {
147
+ backgroundColor: theme.palette.rejected.dark,
148
+ color: theme.palette.rejected.light,
149
+ '& .MuiChip-icon': {
150
+ color: theme.palette.rejected.light,
151
+ },
152
+ };
153
+ case 'ERROR':
154
+ return {
155
+ backgroundColor: theme.palette.errorStatus.dark,
156
+ color: theme.palette.errorStatus.light,
157
+ '& .MuiChip-icon': {
158
+ color: theme.palette.errorStatus.light,
159
+ },
160
+ };
161
+ default:
162
+ return {};
163
+ }
164
+ };
165
+
166
+ export const getStatusBarColor = (status: ScanResult['status'], theme: any) => {
167
+ switch (status) {
168
+ case 'PASSED':
169
+ return theme.palette.passed.dark;
170
+ case 'QUARANTINED':
171
+ return theme.palette.quarantined.dark;
172
+ case 'AUTO REJECTED':
173
+ return theme.palette.rejected.dark;
174
+ case 'ERROR':
175
+ return theme.palette.errorStatus.dark;
176
+ default:
177
+ return 'transparent';
178
+ }
179
+ };
180
+
181
+ // ============================================================================
182
+ // UI Utilities
183
+ // ============================================================================
184
+
185
+ export const shouldShowExpandButton = (scan: ScanResult): boolean => {
186
+ const hasErrorMessage = scan.status === 'ERROR' && !!scan.errorMessage;
187
+ const hasCheckResults = scan.checkResults && scan.checkResults.length > 0;
188
+ return scan.threats.length > 0 || scan.validationFailures.length > 0 || hasCheckResults || hasErrorMessage;
189
+ };
190
+
191
+ export const hasDownload = (scan: ScanResult): boolean => {
192
+ return scan.status === 'PASSED' || scan.status === 'QUARANTINED';
193
+ };
194
+
195
+ export const getFileName = (url?: string): string => {
196
+ if (!url) return 'extension.vsix';
197
+ const parts = url.split('/');
198
+ return parts[parts.length - 1] || 'extension.vsix';
199
+ };
@@ -0,0 +1,119 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation
3
+ *
4
+ * See the NOTICE file(s) distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ *
7
+ * This program and the accompanying materials are made available under the
8
+ * terms of the Eclipse Public License 2.0 which is available at
9
+ * https://www.eclipse.org/legal/epl-2.0
10
+ *
11
+ * SPDX-License-Identifier: EPL-2.0
12
+ ********************************************************************************/
13
+
14
+ import React, { FunctionComponent } from 'react';
15
+ import { Box, Typography, Pagination, CircularProgress } from '@mui/material';
16
+ import { SearchToolbar, CountsToolbar } from '../toolbars';
17
+ import { FileTable, AutoRefresh } from '../common';
18
+ import { useAllowListTab } from '../../../hooks/scan-admin';
19
+ import { useScanContext } from '../../../context/scan-admin';
20
+ import { useTheme } from '@mui/material/styles';
21
+
22
+ /**
23
+ * Allowed Files tab component that displays files that have been allowed.
24
+ * Uses the useAllowListTab hook to consume context.
25
+ */
26
+ export const AllowListTabContent: FunctionComponent = () => {
27
+ const theme = useTheme();
28
+ const { state, actions } = useScanContext();
29
+ const {
30
+ files,
31
+ isLoading,
32
+ fileCount,
33
+ search,
34
+ selection,
35
+ setFilesChecked,
36
+ fileActions,
37
+ pagination,
38
+ lastRefreshed,
39
+ autoRefresh,
40
+ onAutoRefreshChange,
41
+ } = useAllowListTab();
42
+
43
+ return (
44
+ <>
45
+ <Box sx={{ display: 'flex', flexDirection: 'column' }}>
46
+ <SearchToolbar
47
+ publisherQuery={search.publisherQuery}
48
+ namespaceQuery={search.namespaceQuery}
49
+ nameQuery={search.nameQuery}
50
+ onPublisherChange={search.handlePublisherChange}
51
+ onNamespaceChange={search.handleNamespaceChange}
52
+ onNameChange={search.handleNameChange}
53
+ actionButtons={[
54
+ {
55
+ label: 'BLOCK',
56
+ color: theme.palette.blocked!,
57
+ disabled: !fileActions.canPerformAction,
58
+ onClick: fileActions.openBlockDialog,
59
+ },
60
+ {
61
+ label: 'DELETE',
62
+ color: theme.palette.secondary.main,
63
+ disabled: !fileActions.canPerformAction,
64
+ onClick: fileActions.openDeleteDialog,
65
+ },
66
+ ]}
67
+ selectedCount={selection.selectedCount}
68
+ />
69
+ <CountsToolbar
70
+ counts={[
71
+ { label: 'Allowed Files', value: fileCount, color: theme.palette.allowed },
72
+ ]}
73
+ dateRange={state.fileDateRange}
74
+ onDateRangeChange={actions.setFileDateRange}
75
+ />
76
+ <AutoRefresh
77
+ lastRefreshed={lastRefreshed}
78
+ autoRefresh={autoRefresh}
79
+ onAutoRefreshChange={onAutoRefreshChange}
80
+ />
81
+ </Box>
82
+ {isLoading ? (
83
+ <Box sx={{ display: 'flex', justifyContent: 'center', py: 8 }}>
84
+ <CircularProgress color='secondary' />
85
+ </Box>
86
+ ) : files.length === 0 ? (
87
+ <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', py: 4 }}>
88
+ <Typography variant='h6' color='text.secondary'>
89
+ No allowed files
90
+ </Typography>
91
+ <Typography variant='body2' color='text.secondary' sx={{ mt: 1 }}>
92
+ Files that have been allowed will appear here
93
+ </Typography>
94
+ </Box>
95
+ ) : (
96
+ <FileTable
97
+ files={files}
98
+ type='allowed'
99
+ selectedFiles={selection.checked}
100
+ onSelectionChange={setFilesChecked}
101
+ />
102
+ )}
103
+ {pagination.totalPages > 1 && (
104
+ <Box sx={{ display: 'flex', justifyContent: 'center', mt: 3, mb: 2 }}>
105
+ <Pagination
106
+ count={pagination.totalPages}
107
+ page={pagination.currentPage + 1}
108
+ onChange={(_, page) => pagination.goToPage(page - 1)}
109
+ disabled={isLoading}
110
+ color='secondary'
111
+ size='large'
112
+ showFirstButton
113
+ showLastButton
114
+ />
115
+ </Box>
116
+ )}
117
+ </>
118
+ );
119
+ };
@@ -0,0 +1,106 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation
3
+ *
4
+ * See the NOTICE file(s) distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ *
7
+ * This program and the accompanying materials are made available under the
8
+ * terms of the Eclipse Public License 2.0 which is available at
9
+ * https://www.eclipse.org/legal/epl-2.0
10
+ *
11
+ * SPDX-License-Identifier: EPL-2.0
12
+ ********************************************************************************/
13
+
14
+ import React, { FunctionComponent } from 'react';
15
+ import { Box, Typography, Pagination, CircularProgress } from '@mui/material';
16
+ import { ScanCard } from '../scan-card';
17
+ import { SearchToolbar, CountsToolbar } from '../toolbars';
18
+ import { AutoRefresh } from '../common';
19
+ import { useAutoRejectedTab } from '../../../hooks/scan-admin';
20
+
21
+ /**
22
+ * Auto Rejected tab component that displays extensions that failed validation.
23
+ * Uses the useAutoRejectedTab hook to consume context.
24
+ */
25
+ export const AutoRejectedTabContent: FunctionComponent = () => {
26
+ const {
27
+ scans,
28
+ isLoading,
29
+ lastRefreshed,
30
+ autoRefresh,
31
+ onAutoRefreshChange,
32
+ totalCount,
33
+ search,
34
+ globalFilters,
35
+ validationTypeFilters,
36
+ pagination,
37
+ hasValidationTypes,
38
+ } = useAutoRejectedTab();
39
+
40
+ return (
41
+ <>
42
+ <Box sx={{ display: 'flex', flexDirection: 'column' }}>
43
+ <SearchToolbar
44
+ publisherQuery={search.publisherQuery}
45
+ namespaceQuery={search.namespaceQuery}
46
+ nameQuery={search.nameQuery}
47
+ onPublisherChange={search.handlePublisherChange}
48
+ onNamespaceChange={search.handleNamespaceChange}
49
+ onNameChange={search.handleNameChange}
50
+ />
51
+ <CountsToolbar
52
+ counts={[
53
+ { label: 'Total', value: totalCount, color: 'text.primary' },
54
+ ]}
55
+ filterOptions={validationTypeFilters.availableValidationTypes.map(type => ({
56
+ label: type,
57
+ value: type,
58
+ checked: validationTypeFilters.filters.has(type),
59
+ }))}
60
+ onFilterOptionToggle={validationTypeFilters.toggle}
61
+ dateRange={globalFilters.dateRange}
62
+ onDateRangeChange={globalFilters.setDateRange}
63
+ enforcement={globalFilters.enforcement}
64
+ onEnforcementChange={globalFilters.setEnforcement}
65
+ />
66
+ <AutoRefresh
67
+ lastRefreshed={lastRefreshed}
68
+ autoRefresh={autoRefresh}
69
+ onAutoRefreshChange={onAutoRefreshChange}
70
+ />
71
+ </Box>
72
+ {isLoading ? (
73
+ <Box sx={{ display: 'flex', justifyContent: 'center', py: 8 }}>
74
+ <CircularProgress color='secondary' />
75
+ </Box>
76
+ ) : (!hasValidationTypes || scans.length === 0) ? (
77
+ <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', py: 4 }}>
78
+ <Typography variant='h6' color='text.secondary'>
79
+ No auto rejected extensions
80
+ </Typography>
81
+ <Typography variant='body2' color='text.secondary' sx={{ mt: 1 }}>
82
+ Extensions that fail validation will appear here
83
+ </Typography>
84
+ </Box>
85
+ ) : (
86
+ scans.map((scan) => (
87
+ <ScanCard key={scan.id} scan={scan} />
88
+ ))
89
+ )}
90
+ {pagination.totalPages > 1 && (
91
+ <Box sx={{ display: 'flex', justifyContent: 'center', mt: 3, mb: 2 }}>
92
+ <Pagination
93
+ count={pagination.totalPages}
94
+ page={pagination.currentPage + 1}
95
+ onChange={(_, page) => pagination.goToPage(page - 1)}
96
+ disabled={isLoading}
97
+ color='secondary'
98
+ size='large'
99
+ showFirstButton
100
+ showLastButton
101
+ />
102
+ </Box>
103
+ )}
104
+ </>
105
+ );
106
+ };
@@ -0,0 +1,119 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation
3
+ *
4
+ * See the NOTICE file(s) distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ *
7
+ * This program and the accompanying materials are made available under the
8
+ * terms of the Eclipse Public License 2.0 which is available at
9
+ * https://www.eclipse.org/legal/epl-2.0
10
+ *
11
+ * SPDX-License-Identifier: EPL-2.0
12
+ ********************************************************************************/
13
+
14
+ import React, { FunctionComponent } from 'react';
15
+ import { Box, Typography, Pagination, CircularProgress } from '@mui/material';
16
+ import { SearchToolbar, CountsToolbar } from '../toolbars';
17
+ import { FileTable, AutoRefresh } from '../common';
18
+ import { useBlockListTab } from '../../../hooks/scan-admin';
19
+ import { useScanContext } from '../../../context/scan-admin';
20
+ import { useTheme } from '@mui/material/styles';
21
+
22
+ /**
23
+ * Blocked Files tab component that displays files that have been blocked.
24
+ * Uses the useBlockListTab hook to consume context.
25
+ */
26
+ export const BlockListTabContent: FunctionComponent = () => {
27
+ const theme = useTheme();
28
+ const { state, actions } = useScanContext();
29
+ const {
30
+ files,
31
+ isLoading,
32
+ fileCount,
33
+ search,
34
+ selection,
35
+ setFilesChecked,
36
+ fileActions,
37
+ pagination,
38
+ lastRefreshed,
39
+ autoRefresh,
40
+ onAutoRefreshChange,
41
+ } = useBlockListTab();
42
+
43
+ return (
44
+ <>
45
+ <Box sx={{ display: 'flex', flexDirection: 'column' }}>
46
+ <SearchToolbar
47
+ publisherQuery={search.publisherQuery}
48
+ namespaceQuery={search.namespaceQuery}
49
+ nameQuery={search.nameQuery}
50
+ onPublisherChange={search.handlePublisherChange}
51
+ onNamespaceChange={search.handleNamespaceChange}
52
+ onNameChange={search.handleNameChange}
53
+ actionButtons={[
54
+ {
55
+ label: 'ALLOW',
56
+ color: theme.palette.allowed!,
57
+ disabled: !fileActions.canPerformAction,
58
+ onClick: fileActions.openAllowDialog,
59
+ },
60
+ {
61
+ label: 'DELETE',
62
+ color: theme.palette.secondary.main,
63
+ disabled: !fileActions.canPerformAction,
64
+ onClick: fileActions.openDeleteDialog,
65
+ },
66
+ ]}
67
+ selectedCount={selection.selectedCount}
68
+ />
69
+ <CountsToolbar
70
+ counts={[
71
+ { label: 'Blocked Files', value: fileCount, color: theme.palette.blocked },
72
+ ]}
73
+ dateRange={state.fileDateRange}
74
+ onDateRangeChange={actions.setFileDateRange}
75
+ />
76
+ <AutoRefresh
77
+ lastRefreshed={lastRefreshed}
78
+ autoRefresh={autoRefresh}
79
+ onAutoRefreshChange={onAutoRefreshChange}
80
+ />
81
+ </Box>
82
+ {isLoading ? (
83
+ <Box sx={{ display: 'flex', justifyContent: 'center', py: 8 }}>
84
+ <CircularProgress color='secondary' />
85
+ </Box>
86
+ ) : files.length === 0 ? (
87
+ <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', py: 4 }}>
88
+ <Typography variant='h6' color='text.secondary'>
89
+ No blocked files
90
+ </Typography>
91
+ <Typography variant='body2' color='text.secondary' sx={{ mt: 1 }}>
92
+ Files that have been blocked will appear here
93
+ </Typography>
94
+ </Box>
95
+ ) : (
96
+ <FileTable
97
+ files={files}
98
+ type='blocked'
99
+ selectedFiles={selection.checked}
100
+ onSelectionChange={setFilesChecked}
101
+ />
102
+ )}
103
+ {pagination.totalPages > 1 && (
104
+ <Box sx={{ display: 'flex', justifyContent: 'center', mt: 3, mb: 2 }}>
105
+ <Pagination
106
+ count={pagination.totalPages}
107
+ page={pagination.currentPage + 1}
108
+ onChange={(_, page) => pagination.goToPage(page - 1)}
109
+ disabled={isLoading}
110
+ color='secondary'
111
+ size='large'
112
+ showFirstButton
113
+ showLastButton
114
+ />
115
+ </Box>
116
+ )}
117
+ </>
118
+ );
119
+ };