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,123 @@
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, { createContext, useContext, useReducer, useMemo, useRef } from 'react';
15
+ import { initialScanState, ScanResult, FileDecision } from './scan-types';
16
+ import { scanReducer } from './scan-reducer';
17
+ import { ScanContextValue, ScanProviderProps, DerivedData } from './scan-context-types';
18
+ import {
19
+ useFilterOptionsEffect,
20
+ useScansEffect,
21
+ useScanCountsEffect,
22
+ useFilesEffect,
23
+ useFileCountsEffect,
24
+ useAutoRefreshEffect,
25
+ } from './scan-api-effects';
26
+ import { useConfirmAction, useFileAction } from './scan-api-actions';
27
+ import { useScanActions } from './scan-actions';
28
+
29
+ // ============================================================================
30
+ // Context Creation
31
+ // ============================================================================
32
+
33
+ const ScanContext = createContext<ScanContextValue | null>(null);
34
+
35
+ // ============================================================================
36
+ // Provider Component
37
+ // ============================================================================
38
+
39
+ export const ScanProvider: React.FC<ScanProviderProps> = ({ children, service, handleError }) => {
40
+ const [state, dispatch] = useReducer(scanReducer, initialScanState);
41
+
42
+ // Use a ref for handleError to avoid re-running effects when parent re-renders
43
+ // This prevents infinite loops when errors trigger parent state changes
44
+ const handleErrorRef = useRef(handleError);
45
+ handleErrorRef.current = handleError;
46
+
47
+ // ========================================================================
48
+ // API Effects
49
+ // ========================================================================
50
+
51
+ useFilterOptionsEffect(service, state, dispatch, handleErrorRef);
52
+ useScansEffect(service, state, dispatch, handleErrorRef);
53
+ useScanCountsEffect(service, state, dispatch, handleErrorRef);
54
+ useFilesEffect(service, state, dispatch, handleErrorRef);
55
+ useFileCountsEffect(service, state, dispatch, handleErrorRef);
56
+ useAutoRefreshEffect(state, dispatch);
57
+
58
+ // ========================================================================
59
+ // Async API Actions
60
+ // ========================================================================
61
+
62
+ const executeConfirmAction = useConfirmAction(service, state, dispatch, handleErrorRef);
63
+ const executeFileAction = useFileAction(service, state, dispatch, handleErrorRef);
64
+
65
+ // ========================================================================
66
+ // Actions
67
+ // ========================================================================
68
+
69
+ const actions = useScanActions(dispatch, executeConfirmAction, executeFileAction);
70
+
71
+ // ========================================================================
72
+ // Derived Data (memoized)
73
+ // ========================================================================
74
+
75
+ const selectedExtensions = useMemo((): ScanResult[] => {
76
+ return state.scans.filter(scan => state.quarantinedChecked[scan.id]);
77
+ }, [state.scans, state.quarantinedChecked]);
78
+
79
+ const selectedFiles = useMemo((): FileDecision[] => {
80
+ return state.files.filter(file => state.filesChecked.has(file.id));
81
+ }, [state.files, state.filesChecked]);
82
+
83
+ const totalPages = useMemo(() => {
84
+ // For tabs 0-2 (scans), use totalScans; for tabs 3-4 (files), use totalFiles
85
+ const total = state.selectedTab >= 3 ? state.totalFiles : state.totalScans;
86
+ return Math.ceil(total / state.pageSize);
87
+ }, [state.selectedTab, state.totalScans, state.totalFiles, state.pageSize]);
88
+
89
+ const derived: DerivedData = useMemo(() => ({
90
+ selectedExtensions,
91
+ selectedFiles,
92
+ totalPages,
93
+ }), [selectedExtensions, selectedFiles, totalPages]);
94
+
95
+ // ========================================================================
96
+ // Context Value
97
+ // ========================================================================
98
+
99
+ const contextValue = useMemo(() => ({
100
+ state,
101
+ dispatch,
102
+ actions,
103
+ derived,
104
+ }), [state, actions, derived]);
105
+
106
+ return (
107
+ <ScanContext.Provider value={contextValue}>
108
+ {children}
109
+ </ScanContext.Provider>
110
+ );
111
+ };
112
+
113
+ // ============================================================================
114
+ // Custom Hook
115
+ // ============================================================================
116
+
117
+ export const useScanContext = (): ScanContextValue => {
118
+ const context = useContext(ScanContext);
119
+ if (!context) {
120
+ throw new Error('useScanContext must be used within a ScanProvider');
121
+ }
122
+ return context;
123
+ };
@@ -0,0 +1,63 @@
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 { DateRangeType } from './scan-types';
15
+
16
+ /**
17
+ * Calculates date range boundaries based on the date range type
18
+ * @returns { from, to } ISO date strings, or { from: undefined, to: undefined } for 'all'
19
+ */
20
+ const calculateDateRange = (dateRange: DateRangeType): { from: string | undefined; to: string | undefined } => {
21
+ if (dateRange === 'all') {
22
+ return { from: undefined, to: undefined };
23
+ }
24
+
25
+ const now = new Date();
26
+ const to = now.toISOString();
27
+ let from: string;
28
+
29
+ switch (dateRange) {
30
+ case 'today':
31
+ from = new Date(now.getFullYear(), now.getMonth(), now.getDate()).toISOString();
32
+ break;
33
+ case 'last7days':
34
+ from = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000).toISOString();
35
+ break;
36
+ case 'last30days':
37
+ from = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000).toISOString();
38
+ break;
39
+ case 'last90days':
40
+ from = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000).toISOString();
41
+ break;
42
+ default:
43
+ from = new Date(0).toISOString();
44
+ }
45
+
46
+ return { from, to };
47
+ };
48
+
49
+ /**
50
+ * Converts a date range string to API date parameters for scans
51
+ */
52
+ export const getDateRangeParams = (dateRange: DateRangeType) => {
53
+ const { from, to } = calculateDateRange(dateRange);
54
+ return { dateStartedFrom: from, dateStartedTo: to };
55
+ };
56
+
57
+ /**
58
+ * Converts a date range string to API date parameters for file decisions
59
+ */
60
+ export const getFileDateRange = (dateRange: DateRangeType) => {
61
+ const { from, to } = calculateDateRange(dateRange);
62
+ return { dateDecidedFrom: from, dateDecidedTo: to };
63
+ };
@@ -0,0 +1,321 @@
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 { ScanState, ScanAction } from './scan-types';
15
+
16
+ /**
17
+ * Helper function to toggle a value in a Set
18
+ */
19
+ const toggleSetValue = <T>(set: Set<T>, value: T): Set<T> => {
20
+ const newSet = new Set(set);
21
+ if (newSet.has(value)) {
22
+ newSet.delete(value);
23
+ } else {
24
+ newSet.add(value);
25
+ }
26
+ return newSet;
27
+ };
28
+
29
+ /**
30
+ * Reducer for scan state management
31
+ */
32
+ export const scanReducer = (state: ScanState, action: ScanAction): ScanState => {
33
+ switch (action.type) {
34
+ // ============================================================
35
+ // Tab actions
36
+ // ============================================================
37
+ case 'SET_TAB': {
38
+ const tab = action.payload;
39
+ // Tab-specific default enforcement:
40
+ // - Tabs 1 (Quarantined) and 2 (Auto Rejected): default to 'enforced'
41
+ // - Other tabs: default to 'all'
42
+ const defaultEnforcement = (tab === 1 || tab === 2) ? 'enforced' : 'all';
43
+ return {
44
+ ...state,
45
+ selectedTab: tab,
46
+ // Clear search when switching tabs
47
+ publisherQuery: '',
48
+ namespaceQuery: '',
49
+ nameQuery: '',
50
+ // Reset page
51
+ currentPage: 0,
52
+ // Reset to tab-specific default filters
53
+ dateRange: 'all',
54
+ enforcement: defaultEnforcement,
55
+ quarantineFilters: new Set(),
56
+ statusFilters: new Set(),
57
+ // Clear scans and show loading state to prevent stale data flash
58
+ scans: [],
59
+ isLoadingScans: true,
60
+ // Clear files and show loading state to prevent stale data flash
61
+ files: [],
62
+ isLoadingFiles: tab >= 3, // Set loading state for file tabs (3, 4)
63
+ // Clear counts to prevent stale counts from showing
64
+ scanCounts: null,
65
+ fileCounts: null,
66
+ // Clear selection state to prevent stale counts
67
+ quarantinedChecked: {},
68
+ filesChecked: new Set(),
69
+ };
70
+ }
71
+
72
+ // ============================================================
73
+ // Search actions
74
+ // ============================================================
75
+ case 'SET_PUBLISHER_QUERY':
76
+ return { ...state, publisherQuery: action.payload, currentPage: 0, quarantinedChecked: {}, filesChecked: new Set<string>() };
77
+
78
+ case 'SET_NAMESPACE_QUERY':
79
+ return { ...state, namespaceQuery: action.payload, currentPage: 0, quarantinedChecked: {}, filesChecked: new Set<string>() };
80
+
81
+ case 'SET_NAME_QUERY':
82
+ return { ...state, nameQuery: action.payload, currentPage: 0, quarantinedChecked: {}, filesChecked: new Set<string>() };
83
+
84
+ case 'CLEAR_SEARCH':
85
+ return {
86
+ ...state,
87
+ publisherQuery: '',
88
+ namespaceQuery: '',
89
+ nameQuery: '',
90
+ filesChecked: new Set<string>(),
91
+ };
92
+
93
+ // ============================================================
94
+ // Pagination actions
95
+ // ============================================================
96
+ case 'SET_PAGE':
97
+ return { ...state, currentPage: action.payload, quarantinedChecked: {}, filesChecked: new Set<string>() };
98
+
99
+ case 'RESET_PAGE':
100
+ return { ...state, currentPage: 0 };
101
+
102
+ // ============================================================
103
+ // Global filter actions
104
+ // ============================================================
105
+ case 'SET_DATE_RANGE':
106
+ return { ...state, dateRange: action.payload, currentPage: 0, quarantinedChecked: {}, filesChecked: new Set() };
107
+
108
+ case 'SET_ENFORCEMENT':
109
+ return {
110
+ ...state,
111
+ enforcement: action.payload,
112
+ currentPage: 0,
113
+ quarantinedChecked: {},
114
+ };
115
+
116
+ case 'SET_FILE_DATE_RANGE':
117
+ return { ...state, fileDateRange: action.payload, currentPage: 0, filesChecked: new Set<string>() };
118
+
119
+ // ============================================================
120
+ // Tab-specific filter actions
121
+ // ============================================================
122
+ case 'TOGGLE_STATUS_FILTER':
123
+ return {
124
+ ...state,
125
+ statusFilters: toggleSetValue(state.statusFilters, action.payload),
126
+ currentPage: 0,
127
+ };
128
+
129
+ case 'SET_STATUS_FILTERS':
130
+ return { ...state, statusFilters: action.payload, currentPage: 0 };
131
+
132
+ case 'TOGGLE_QUARANTINE_FILTER':
133
+ return {
134
+ ...state,
135
+ quarantineFilters: toggleSetValue(state.quarantineFilters, action.payload),
136
+ currentPage: 0,
137
+ quarantinedChecked: {},
138
+ };
139
+
140
+ case 'SET_QUARANTINE_FILTERS':
141
+ return { ...state, quarantineFilters: action.payload, currentPage: 0, quarantinedChecked: {} };
142
+
143
+ case 'TOGGLE_THREAT_SCANNER_FILTER':
144
+ return {
145
+ ...state,
146
+ threatScannerFilters: toggleSetValue(state.threatScannerFilters, action.payload),
147
+ currentPage: 0,
148
+ quarantinedChecked: {},
149
+ };
150
+
151
+ case 'SET_THREAT_SCANNER_FILTERS':
152
+ return { ...state, threatScannerFilters: action.payload, currentPage: 0, quarantinedChecked: {} };
153
+
154
+ case 'TOGGLE_VALIDATION_TYPE_FILTER':
155
+ return {
156
+ ...state,
157
+ validationTypeFilters: toggleSetValue(state.validationTypeFilters, action.payload),
158
+ currentPage: 0,
159
+ };
160
+
161
+ case 'SET_VALIDATION_TYPE_FILTERS':
162
+ return { ...state, validationTypeFilters: action.payload, currentPage: 0 };
163
+
164
+ // ============================================================
165
+ // Filter options actions (from API)
166
+ // ============================================================
167
+ case 'SET_FILTER_OPTIONS_LOADED':
168
+ return { ...state, filterOptionsLoaded: action.payload };
169
+
170
+ case 'SET_AVAILABLE_VALIDATION_TYPES':
171
+ return { ...state, availableValidationTypes: action.payload };
172
+
173
+ case 'SET_AVAILABLE_THREAT_SCANNERS':
174
+ return { ...state, availableThreatScanners: action.payload };
175
+
176
+ // ============================================================
177
+ // Menu anchor actions
178
+ // ============================================================
179
+ case 'SET_FILTER_MENU_ANCHOR':
180
+ return { ...state, filterMenuAnchor: action.payload };
181
+
182
+ case 'SET_QUARANTINE_FILTER_MENU_ANCHOR':
183
+ return { ...state, quarantineFilterMenuAnchor: action.payload };
184
+
185
+ case 'SET_AUTO_REJECTED_FILTER_MENU_ANCHOR':
186
+ return { ...state, autoRejectedFilterMenuAnchor: action.payload };
187
+
188
+ // ============================================================
189
+ // Selection actions
190
+ // ============================================================
191
+ case 'SET_QUARANTINED_CHECKED':
192
+ return { ...state, quarantinedChecked: action.payload };
193
+
194
+ case 'TOGGLE_QUARANTINED_CHECKED':
195
+ return {
196
+ ...state,
197
+ quarantinedChecked: {
198
+ ...state.quarantinedChecked,
199
+ [action.payload.id]: action.payload.checked,
200
+ },
201
+ };
202
+
203
+ case 'SELECT_ALL_QUARANTINED': {
204
+ const newChecked: Record<string, boolean> = {};
205
+ action.payload.forEach(scan => {
206
+ newChecked[scan.id] = true;
207
+ });
208
+ return { ...state, quarantinedChecked: newChecked };
209
+ }
210
+
211
+ case 'DESELECT_ALL_QUARANTINED':
212
+ return { ...state, quarantinedChecked: {} };
213
+
214
+ case 'SET_SCAN_DECISIONS':
215
+ return { ...state, scanDecisions: action.payload };
216
+
217
+ case 'SET_FILES_CHECKED':
218
+ return { ...state, filesChecked: action.payload };
219
+
220
+ // ============================================================
221
+ // Dialog actions
222
+ // ============================================================
223
+ case 'OPEN_CONFIRM_DIALOG':
224
+ return {
225
+ ...state,
226
+ confirmDialogOpen: true,
227
+ confirmAction: action.payload,
228
+ };
229
+
230
+ case 'CLOSE_CONFIRM_DIALOG':
231
+ return {
232
+ ...state,
233
+ confirmDialogOpen: false,
234
+ confirmAction: null,
235
+ };
236
+
237
+ case 'OPEN_FILE_DIALOG':
238
+ return {
239
+ ...state,
240
+ fileDialogOpen: true,
241
+ fileActionType: action.payload,
242
+ };
243
+
244
+ case 'CLOSE_FILE_DIALOG':
245
+ return {
246
+ ...state,
247
+ fileDialogOpen: false,
248
+ fileActionType: null,
249
+ };
250
+
251
+ // ============================================================
252
+ // Data actions (from API)
253
+ // ============================================================
254
+ case 'SET_SCANS':
255
+ return {
256
+ ...state,
257
+ scans: action.payload.scans,
258
+ totalScans: action.payload.totalScans,
259
+ };
260
+
261
+ case 'SET_LOADING_SCANS':
262
+ return { ...state, isLoadingScans: action.payload };
263
+
264
+ case 'SET_SCAN_COUNTS':
265
+ return { ...state, scanCounts: action.payload };
266
+
267
+ case 'TRIGGER_REFRESH':
268
+ return { ...state, refreshTrigger: state.refreshTrigger + 1 };
269
+
270
+ case 'SET_LAST_REFRESHED':
271
+ return { ...state, lastRefreshed: action.payload };
272
+
273
+ case 'SET_AUTO_REFRESH':
274
+ return { ...state, autoRefresh: action.payload };
275
+
276
+ // ============================================================
277
+ // File data actions (from /files API)
278
+ // ============================================================
279
+ case 'SET_FILES':
280
+ return {
281
+ ...state,
282
+ files: action.payload.files,
283
+ totalFiles: action.payload.totalFiles,
284
+ };
285
+
286
+ case 'SET_LOADING_FILES':
287
+ return { ...state, isLoadingFiles: action.payload };
288
+
289
+ case 'SET_FILE_COUNTS':
290
+ return { ...state, fileCounts: action.payload };
291
+
292
+ // ============================================================
293
+ // Confirm action execution
294
+ // ============================================================
295
+ case 'EXECUTE_CONFIRM_ACTION': {
296
+ if (state.confirmAction === 'allow' || state.confirmAction === 'block') {
297
+ const newDecisions = { ...state.scanDecisions };
298
+ for (const id in state.quarantinedChecked) {
299
+ if (state.quarantinedChecked[id]) {
300
+ newDecisions[id] = state.confirmAction === 'allow' ? 'allowed' : 'blocked';
301
+ }
302
+ }
303
+ return {
304
+ ...state,
305
+ scanDecisions: newDecisions,
306
+ quarantinedChecked: {},
307
+ confirmDialogOpen: false,
308
+ confirmAction: null,
309
+ };
310
+ }
311
+ return {
312
+ ...state,
313
+ confirmDialogOpen: false,
314
+ confirmAction: null,
315
+ };
316
+ }
317
+
318
+ default:
319
+ return state;
320
+ }
321
+ };