openvsx-webui-test 0.18.0-security.5 → 0.19.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 (535) hide show
  1. package/lib/components/banner.d.ts.map +1 -1
  2. package/lib/components/banner.js +10 -24
  3. package/lib/components/banner.js.map +1 -1
  4. package/lib/components/button-with-progress.d.ts.map +1 -1
  5. package/lib/components/button-with-progress.js +11 -22
  6. package/lib/components/button-with-progress.js.map +1 -1
  7. package/lib/components/copy-to-clipboard.d.ts.map +1 -1
  8. package/lib/components/copy-to-clipboard.js +3 -2
  9. package/lib/components/copy-to-clipboard.js.map +1 -1
  10. package/lib/components/delayed-load-indicator.d.ts.map +1 -1
  11. package/lib/components/delayed-load-indicator.js +4 -3
  12. package/lib/components/delayed-load-indicator.js.map +1 -1
  13. package/lib/components/error-dialog.d.ts.map +1 -1
  14. package/lib/components/error-dialog.js +8 -23
  15. package/lib/components/error-dialog.js.map +1 -1
  16. package/lib/components/hover-popover.d.ts.map +1 -1
  17. package/lib/components/hover-popover.js +9 -10
  18. package/lib/components/hover-popover.js.map +1 -1
  19. package/lib/components/info-dialog.d.ts.map +1 -1
  20. package/lib/components/info-dialog.js +3 -7
  21. package/lib/components/info-dialog.js.map +1 -1
  22. package/lib/components/sanitized-markdown.d.ts.map +1 -1
  23. package/lib/components/sanitized-markdown.js +3 -2
  24. package/lib/components/sanitized-markdown.js.map +1 -1
  25. package/lib/components/scan-admin/common/auto-refresh.d.ts.map +1 -1
  26. package/lib/components/scan-admin/common/auto-refresh.js +12 -30
  27. package/lib/components/scan-admin/common/auto-refresh.js.map +1 -1
  28. package/lib/components/scan-admin/common/conditional-tooltip.d.ts.map +1 -1
  29. package/lib/components/scan-admin/common/conditional-tooltip.js +6 -17
  30. package/lib/components/scan-admin/common/conditional-tooltip.js.map +1 -1
  31. package/lib/components/scan-admin/common/file-table.d.ts.map +1 -1
  32. package/lib/components/scan-admin/common/file-table.js +84 -144
  33. package/lib/components/scan-admin/common/file-table.js.map +1 -1
  34. package/lib/components/scan-admin/common/tab-panel.d.ts.map +1 -1
  35. package/lib/components/scan-admin/common/tab-panel.js +2 -14
  36. package/lib/components/scan-admin/common/tab-panel.js.map +1 -1
  37. package/lib/components/scan-admin/common/utils.d.ts.map +1 -1
  38. package/lib/components/scan-admin/common/utils.js.map +1 -1
  39. package/lib/components/scan-admin/dialogs/file-dialog.d.ts.map +1 -1
  40. package/lib/components/scan-admin/dialogs/file-dialog.js +31 -73
  41. package/lib/components/scan-admin/dialogs/file-dialog.js.map +1 -1
  42. package/lib/components/scan-admin/dialogs/quarantine-dialog.d.ts.map +1 -1
  43. package/lib/components/scan-admin/dialogs/quarantine-dialog.js +60 -120
  44. package/lib/components/scan-admin/dialogs/quarantine-dialog.js.map +1 -1
  45. package/lib/components/scan-admin/scan-card/scan-card-content.d.ts +3 -3
  46. package/lib/components/scan-admin/scan-card/scan-card-content.d.ts.map +1 -1
  47. package/lib/components/scan-admin/scan-card/scan-card-content.js +139 -204
  48. package/lib/components/scan-admin/scan-card/scan-card-content.js.map +1 -1
  49. package/lib/components/scan-admin/scan-card/scan-card-expand-strip-badges.d.ts +2 -2
  50. package/lib/components/scan-admin/scan-card/scan-card-expand-strip-badges.d.ts.map +1 -1
  51. package/lib/components/scan-admin/scan-card/scan-card-expand-strip-badges.js +28 -34
  52. package/lib/components/scan-admin/scan-card/scan-card-expand-strip-badges.js.map +1 -1
  53. package/lib/components/scan-admin/scan-card/scan-card-expand-strip.d.ts +2 -2
  54. package/lib/components/scan-admin/scan-card/scan-card-expand-strip.d.ts.map +1 -1
  55. package/lib/components/scan-admin/scan-card/scan-card-expand-strip.js +9 -12
  56. package/lib/components/scan-admin/scan-card/scan-card-expand-strip.js.map +1 -1
  57. package/lib/components/scan-admin/scan-card/scan-card-expanded-content.d.ts +0 -1
  58. package/lib/components/scan-admin/scan-card/scan-card-expanded-content.d.ts.map +1 -1
  59. package/lib/components/scan-admin/scan-card/scan-card-expanded-content.js +20 -51
  60. package/lib/components/scan-admin/scan-card/scan-card-expanded-content.js.map +1 -1
  61. package/lib/components/scan-admin/scan-card/scan-card-header.d.ts +2 -2
  62. package/lib/components/scan-admin/scan-card/scan-card-header.d.ts.map +1 -1
  63. package/lib/components/scan-admin/scan-card/scan-card-header.js +58 -61
  64. package/lib/components/scan-admin/scan-card/scan-card-header.js.map +1 -1
  65. package/lib/components/scan-admin/scan-card/scan-card.d.ts.map +1 -1
  66. package/lib/components/scan-admin/scan-card/scan-card.js +20 -25
  67. package/lib/components/scan-admin/scan-card/scan-card.js.map +1 -1
  68. package/lib/components/scan-admin/scan-card/scan-detail-card.d.ts.map +1 -1
  69. package/lib/components/scan-admin/scan-card/scan-detail-card.js +19 -43
  70. package/lib/components/scan-admin/scan-card/scan-detail-card.js.map +1 -1
  71. package/lib/components/scan-admin/scan-card/utils.d.ts +4 -4
  72. package/lib/components/scan-admin/scan-card/utils.d.ts.map +1 -1
  73. package/lib/components/scan-admin/scan-card/utils.js.map +1 -1
  74. package/lib/components/scan-admin/tab-contents/allow-list-tab-content.d.ts.map +1 -1
  75. package/lib/components/scan-admin/tab-contents/allow-list-tab-content.js +17 -39
  76. package/lib/components/scan-admin/tab-contents/allow-list-tab-content.js.map +1 -1
  77. package/lib/components/scan-admin/tab-contents/auto-rejected-tab-content.d.ts.map +1 -1
  78. package/lib/components/scan-admin/tab-contents/auto-rejected-tab-content.js +8 -30
  79. package/lib/components/scan-admin/tab-contents/auto-rejected-tab-content.js.map +1 -1
  80. package/lib/components/scan-admin/tab-contents/block-list-tab-content.d.ts.map +1 -1
  81. package/lib/components/scan-admin/tab-contents/block-list-tab-content.js +17 -39
  82. package/lib/components/scan-admin/tab-contents/block-list-tab-content.js.map +1 -1
  83. package/lib/components/scan-admin/tab-contents/quarantined-tab-content.d.ts.map +1 -1
  84. package/lib/components/scan-admin/tab-contents/quarantined-tab-content.js +26 -48
  85. package/lib/components/scan-admin/tab-contents/quarantined-tab-content.js.map +1 -1
  86. package/lib/components/scan-admin/tab-contents/scans-tab-content.d.ts.map +1 -1
  87. package/lib/components/scan-admin/tab-contents/scans-tab-content.js +15 -37
  88. package/lib/components/scan-admin/tab-contents/scans-tab-content.js.map +1 -1
  89. package/lib/components/scan-admin/toolbars/counts-toolbar.d.ts.map +1 -1
  90. package/lib/components/scan-admin/toolbars/counts-toolbar.js +70 -94
  91. package/lib/components/scan-admin/toolbars/counts-toolbar.js.map +1 -1
  92. package/lib/components/scan-admin/toolbars/search-toolbar.d.ts +5 -4
  93. package/lib/components/scan-admin/toolbars/search-toolbar.d.ts.map +1 -1
  94. package/lib/components/scan-admin/toolbars/search-toolbar.js +72 -98
  95. package/lib/components/scan-admin/toolbars/search-toolbar.js.map +1 -1
  96. package/lib/components/scan-admin/toolbars/tab-toolbar.d.ts +1 -1
  97. package/lib/components/scan-admin/toolbars/tab-toolbar.d.ts.map +1 -1
  98. package/lib/components/scan-admin/toolbars/tab-toolbar.js +3 -16
  99. package/lib/components/scan-admin/toolbars/tab-toolbar.js.map +1 -1
  100. package/lib/components/sidepanel/navigation-item.d.ts.map +1 -1
  101. package/lib/components/sidepanel/navigation-item.js +4 -9
  102. package/lib/components/sidepanel/navigation-item.js.map +1 -1
  103. package/lib/components/sidepanel/sidepanel.d.ts.map +1 -1
  104. package/lib/components/sidepanel/sidepanel.js +3 -13
  105. package/lib/components/sidepanel/sidepanel.js.map +1 -1
  106. package/lib/components/text-divider.d.ts.map +1 -1
  107. package/lib/components/text-divider.js +2 -11
  108. package/lib/components/text-divider.js.map +1 -1
  109. package/lib/components/timestamp.d.ts.map +1 -1
  110. package/lib/components/timestamp.js +2 -11
  111. package/lib/components/timestamp.js.map +1 -1
  112. package/lib/context/scan-admin/scan-actions.d.ts +2 -1
  113. package/lib/context/scan-admin/scan-actions.d.ts.map +1 -1
  114. package/lib/context/scan-admin/scan-actions.js.map +1 -1
  115. package/lib/context/scan-admin/scan-api-actions.d.ts +3 -3
  116. package/lib/context/scan-admin/scan-api-actions.d.ts.map +1 -1
  117. package/lib/context/scan-admin/scan-api-actions.js.map +1 -1
  118. package/lib/context/scan-admin/scan-api-effects.d.ts +7 -7
  119. package/lib/context/scan-admin/scan-api-effects.d.ts.map +1 -1
  120. package/lib/context/scan-admin/scan-api-effects.js.map +1 -1
  121. package/lib/context/scan-admin/scan-context-types.d.ts +9 -9
  122. package/lib/context/scan-admin/scan-context-types.d.ts.map +1 -1
  123. package/lib/context/scan-admin/scan-context.d.ts +2 -2
  124. package/lib/context/scan-admin/scan-context.d.ts.map +1 -1
  125. package/lib/context/scan-admin/scan-context.js +3 -2
  126. package/lib/context/scan-admin/scan-context.js.map +1 -1
  127. package/lib/context/scan-admin/scan-helpers.d.ts.map +1 -1
  128. package/lib/context/scan-admin/scan-helpers.js.map +1 -1
  129. package/lib/context/scan-admin/scan-reducer.d.ts.map +1 -1
  130. package/lib/context/scan-admin/scan-reducer.js.map +1 -1
  131. package/lib/context/scan-admin/scan-types.js +1 -1
  132. package/lib/context/scan-admin/scan-types.js.map +1 -1
  133. package/lib/context.d.ts +0 -1
  134. package/lib/context.d.ts.map +1 -1
  135. package/lib/default/about.d.ts.map +1 -1
  136. package/lib/default/about.js +2 -22
  137. package/lib/default/about.js.map +1 -1
  138. package/lib/default/default-app.js +13 -15
  139. package/lib/default/default-app.js.map +1 -1
  140. package/lib/default/login.d.ts.map +1 -1
  141. package/lib/default/login.js +3 -7
  142. package/lib/default/login.js.map +1 -1
  143. package/lib/default/menu-content.d.ts +5 -8
  144. package/lib/default/menu-content.d.ts.map +1 -1
  145. package/lib/default/menu-content.js +21 -91
  146. package/lib/default/menu-content.js.map +1 -1
  147. package/lib/default/openvsx-registry-logo.d.ts.map +1 -1
  148. package/lib/default/openvsx-registry-logo.js +2 -14
  149. package/lib/default/openvsx-registry-logo.js.map +1 -1
  150. package/lib/default/page-settings.js +18 -27
  151. package/lib/default/page-settings.js.map +1 -1
  152. package/lib/extension-registry-service.d.ts +24 -1
  153. package/lib/extension-registry-service.d.ts.map +1 -1
  154. package/lib/extension-registry-service.js +169 -2
  155. package/lib/extension-registry-service.js.map +1 -1
  156. package/lib/extension-registry-types.d.ts +57 -0
  157. package/lib/extension-registry-types.d.ts.map +1 -1
  158. package/lib/extension-registry-types.js +16 -0
  159. package/lib/extension-registry-types.js.map +1 -1
  160. package/lib/header-menu.d.ts.map +1 -1
  161. package/lib/header-menu.js +8 -11
  162. package/lib/header-menu.js.map +1 -1
  163. package/lib/hooks/scan-admin/use-auto-rejected-tab.d.ts +1 -2
  164. package/lib/hooks/scan-admin/use-auto-rejected-tab.d.ts.map +1 -1
  165. package/lib/hooks/scan-admin/use-dialogs.d.ts +1 -1
  166. package/lib/hooks/scan-admin/use-dialogs.d.ts.map +1 -1
  167. package/lib/hooks/scan-admin/use-file-list-tab.d.ts +0 -1
  168. package/lib/hooks/scan-admin/use-file-list-tab.d.ts.map +1 -1
  169. package/lib/hooks/scan-admin/use-pagination.js.map +1 -1
  170. package/lib/hooks/scan-admin/use-quarantined-tab.d.ts +1 -2
  171. package/lib/hooks/scan-admin/use-quarantined-tab.d.ts.map +1 -1
  172. package/lib/hooks/scan-admin/use-quarantined-tab.js +2 -3
  173. package/lib/hooks/scan-admin/use-quarantined-tab.js.map +1 -1
  174. package/lib/hooks/scan-admin/use-query-params-state.d.ts +15 -0
  175. package/lib/hooks/scan-admin/use-query-params-state.d.ts.map +1 -0
  176. package/lib/hooks/scan-admin/use-query-params-state.js +44 -0
  177. package/lib/hooks/scan-admin/use-query-params-state.js.map +1 -0
  178. package/lib/hooks/scan-admin/use-scan-card-state.d.ts +3 -3
  179. package/lib/hooks/scan-admin/use-scan-card-state.d.ts.map +1 -1
  180. package/lib/hooks/scan-admin/use-scan-card-state.js +1 -1
  181. package/lib/hooks/scan-admin/use-scan-card-state.js.map +1 -1
  182. package/lib/hooks/scan-admin/use-scan-filters.d.ts +3 -4
  183. package/lib/hooks/scan-admin/use-scan-filters.d.ts.map +1 -1
  184. package/lib/hooks/scan-admin/use-scans-tab.d.ts +1 -2
  185. package/lib/hooks/scan-admin/use-scans-tab.d.ts.map +1 -1
  186. package/lib/hooks/scan-admin/use-scans-tab.js.map +1 -1
  187. package/lib/hooks/scan-admin/use-search.d.ts +0 -1
  188. package/lib/hooks/scan-admin/use-search.d.ts.map +1 -1
  189. package/lib/hooks/scan-admin/use-tab-navigation.js.map +1 -1
  190. package/lib/hooks/scan-admin/use-url-sync.js.map +1 -1
  191. package/lib/main.d.ts.map +1 -1
  192. package/lib/main.js +15 -21
  193. package/lib/main.js.map +1 -1
  194. package/lib/not-found.d.ts.map +1 -1
  195. package/lib/not-found.js +2 -5
  196. package/lib/not-found.js.map +1 -1
  197. package/lib/other-pages.d.ts.map +1 -1
  198. package/lib/other-pages.js +7 -24
  199. package/lib/other-pages.js.map +1 -1
  200. package/lib/pages/admin-dashboard/admin-dashboard.d.ts +4 -0
  201. package/lib/pages/admin-dashboard/admin-dashboard.d.ts.map +1 -1
  202. package/lib/pages/admin-dashboard/admin-dashboard.js +43 -39
  203. package/lib/pages/admin-dashboard/admin-dashboard.js.map +1 -1
  204. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.d.ts +40 -0
  205. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.d.ts.map +1 -0
  206. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.js +81 -0
  207. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.js.map +1 -0
  208. package/lib/pages/admin-dashboard/components/index.d.ts +14 -0
  209. package/lib/pages/admin-dashboard/components/index.d.ts.map +1 -0
  210. package/lib/pages/admin-dashboard/components/index.js +14 -0
  211. package/lib/pages/admin-dashboard/components/index.js.map +1 -0
  212. package/lib/pages/admin-dashboard/customers/customer-form-dialog.d.ts +23 -0
  213. package/lib/pages/admin-dashboard/customers/customer-form-dialog.d.ts.map +1 -0
  214. package/lib/pages/admin-dashboard/customers/customer-form-dialog.js +206 -0
  215. package/lib/pages/admin-dashboard/customers/customer-form-dialog.js.map +1 -0
  216. package/lib/pages/admin-dashboard/customers/customers.d.ts +15 -0
  217. package/lib/pages/admin-dashboard/customers/customers.d.ts.map +1 -0
  218. package/lib/pages/admin-dashboard/customers/customers.js +156 -0
  219. package/lib/pages/admin-dashboard/customers/customers.js.map +1 -0
  220. package/lib/pages/admin-dashboard/customers/delete-customer-dialog.d.ts +23 -0
  221. package/lib/pages/admin-dashboard/customers/delete-customer-dialog.d.ts.map +1 -0
  222. package/lib/pages/admin-dashboard/customers/delete-customer-dialog.js +47 -0
  223. package/lib/pages/admin-dashboard/customers/delete-customer-dialog.js.map +1 -0
  224. package/lib/pages/admin-dashboard/extension-admin.d.ts.map +1 -1
  225. package/lib/pages/admin-dashboard/extension-admin.js +20 -18
  226. package/lib/pages/admin-dashboard/extension-admin.js.map +1 -1
  227. package/lib/pages/admin-dashboard/extension-remove-dialog.d.ts.map +1 -1
  228. package/lib/pages/admin-dashboard/extension-remove-dialog.js +13 -31
  229. package/lib/pages/admin-dashboard/extension-remove-dialog.js.map +1 -1
  230. package/lib/pages/admin-dashboard/extension-version-container.d.ts.map +1 -1
  231. package/lib/pages/admin-dashboard/extension-version-container.js +26 -53
  232. package/lib/pages/admin-dashboard/extension-version-container.js.map +1 -1
  233. package/lib/pages/admin-dashboard/logs/logs.d.ts +15 -0
  234. package/lib/pages/admin-dashboard/logs/logs.d.ts.map +1 -0
  235. package/lib/pages/admin-dashboard/logs/logs.js +133 -0
  236. package/lib/pages/admin-dashboard/logs/logs.js.map +1 -0
  237. package/lib/pages/admin-dashboard/namespace-admin.d.ts.map +1 -1
  238. package/lib/pages/admin-dashboard/namespace-admin.js +14 -22
  239. package/lib/pages/admin-dashboard/namespace-admin.js.map +1 -1
  240. package/lib/pages/admin-dashboard/namespace-change-dialog.d.ts.map +1 -1
  241. package/lib/pages/admin-dashboard/namespace-change-dialog.js +14 -24
  242. package/lib/pages/admin-dashboard/namespace-change-dialog.js.map +1 -1
  243. package/lib/pages/admin-dashboard/namespace-input.d.ts +1 -0
  244. package/lib/pages/admin-dashboard/namespace-input.d.ts.map +1 -1
  245. package/lib/pages/admin-dashboard/namespace-input.js +17 -19
  246. package/lib/pages/admin-dashboard/namespace-input.js.map +1 -1
  247. package/lib/pages/admin-dashboard/publisher-admin.d.ts +2 -2
  248. package/lib/pages/admin-dashboard/publisher-admin.d.ts.map +1 -1
  249. package/lib/pages/admin-dashboard/publisher-admin.js +18 -22
  250. package/lib/pages/admin-dashboard/publisher-admin.js.map +1 -1
  251. package/lib/pages/admin-dashboard/publisher-details.d.ts.map +1 -1
  252. package/lib/pages/admin-dashboard/publisher-details.js +5 -28
  253. package/lib/pages/admin-dashboard/publisher-details.js.map +1 -1
  254. package/lib/pages/admin-dashboard/publisher-revoke-dialog.d.ts.map +1 -1
  255. package/lib/pages/admin-dashboard/publisher-revoke-dialog.js +22 -51
  256. package/lib/pages/admin-dashboard/publisher-revoke-dialog.js.map +1 -1
  257. package/lib/pages/admin-dashboard/publisher-revoke-tokens-button.d.ts.map +1 -1
  258. package/lib/pages/admin-dashboard/publisher-revoke-tokens-button.js +12 -12
  259. package/lib/pages/admin-dashboard/publisher-revoke-tokens-button.js.map +1 -1
  260. package/lib/pages/admin-dashboard/scan-admin.d.ts.map +1 -1
  261. package/lib/pages/admin-dashboard/scan-admin.js +5 -32
  262. package/lib/pages/admin-dashboard/scan-admin.js.map +1 -1
  263. package/lib/pages/admin-dashboard/search-list-container.d.ts.map +1 -1
  264. package/lib/pages/admin-dashboard/search-list-container.js +4 -19
  265. package/lib/pages/admin-dashboard/search-list-container.js.map +1 -1
  266. package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.d.ts +23 -0
  267. package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.d.ts.map +1 -0
  268. package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.js +45 -0
  269. package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.js.map +1 -0
  270. package/lib/pages/admin-dashboard/tiers/tier-form-dialog.d.ts +23 -0
  271. package/lib/pages/admin-dashboard/tiers/tier-form-dialog.d.ts.map +1 -0
  272. package/lib/pages/admin-dashboard/tiers/tier-form-dialog.js +174 -0
  273. package/lib/pages/admin-dashboard/tiers/tier-form-dialog.js.map +1 -0
  274. package/lib/pages/admin-dashboard/tiers/tiers.d.ts +15 -0
  275. package/lib/pages/admin-dashboard/tiers/tiers.d.ts.map +1 -0
  276. package/lib/pages/admin-dashboard/tiers/tiers.js +159 -0
  277. package/lib/pages/admin-dashboard/tiers/tiers.js.map +1 -0
  278. package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.d.ts +23 -0
  279. package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.d.ts.map +1 -0
  280. package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.js +87 -0
  281. package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.js.map +1 -0
  282. package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.d.ts +26 -0
  283. package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.d.ts.map +1 -0
  284. package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.js +35 -0
  285. package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.js.map +1 -0
  286. package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.d.ts +14 -0
  287. package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.d.ts.map +1 -0
  288. package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.js +16 -0
  289. package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.js.map +1 -0
  290. package/lib/pages/admin-dashboard/usage-stats/usage-stats.d.ts +15 -0
  291. package/lib/pages/admin-dashboard/usage-stats/usage-stats.d.ts.map +1 -0
  292. package/lib/pages/admin-dashboard/usage-stats/usage-stats.js +102 -0
  293. package/lib/pages/admin-dashboard/usage-stats/usage-stats.js.map +1 -0
  294. package/lib/pages/admin-dashboard/welcome.d.ts.map +1 -1
  295. package/lib/pages/admin-dashboard/welcome.js +3 -27
  296. package/lib/pages/admin-dashboard/welcome.js.map +1 -1
  297. package/lib/pages/extension-detail/extension-detail-changes.d.ts.map +1 -1
  298. package/lib/pages/extension-detail/extension-detail-changes.js +27 -33
  299. package/lib/pages/extension-detail/extension-detail-changes.js.map +1 -1
  300. package/lib/pages/extension-detail/extension-detail-downloads-menu.d.ts.map +1 -1
  301. package/lib/pages/extension-detail/extension-detail-downloads-menu.js +6 -9
  302. package/lib/pages/extension-detail/extension-detail-downloads-menu.js.map +1 -1
  303. package/lib/pages/extension-detail/extension-detail-overview.d.ts.map +1 -1
  304. package/lib/pages/extension-detail/extension-detail-overview.js +66 -133
  305. package/lib/pages/extension-detail/extension-detail-overview.js.map +1 -1
  306. package/lib/pages/extension-detail/extension-detail-reviews.d.ts.map +1 -1
  307. package/lib/pages/extension-detail/extension-detail-reviews.js +53 -75
  308. package/lib/pages/extension-detail/extension-detail-reviews.js.map +1 -1
  309. package/lib/pages/extension-detail/extension-detail.d.ts.map +1 -1
  310. package/lib/pages/extension-detail/extension-detail.js +56 -129
  311. package/lib/pages/extension-detail/extension-detail.js.map +1 -1
  312. package/lib/pages/extension-detail/extension-rating-star-setter.d.ts.map +1 -1
  313. package/lib/pages/extension-detail/extension-rating-star-setter.js +4 -3
  314. package/lib/pages/extension-detail/extension-rating-star-setter.js.map +1 -1
  315. package/lib/pages/extension-detail/extension-rating-stars.d.ts.map +1 -1
  316. package/lib/pages/extension-detail/extension-rating-stars.js +5 -16
  317. package/lib/pages/extension-detail/extension-rating-stars.js.map +1 -1
  318. package/lib/pages/extension-detail/extension-review-dialog.d.ts.map +1 -1
  319. package/lib/pages/extension-detail/extension-review-dialog.js +15 -28
  320. package/lib/pages/extension-detail/extension-review-dialog.js.map +1 -1
  321. package/lib/pages/extension-list/extension-list-container.d.ts.map +1 -1
  322. package/lib/pages/extension-list/extension-list-container.js +3 -4
  323. package/lib/pages/extension-list/extension-list-container.js.map +1 -1
  324. package/lib/pages/extension-list/extension-list-header.d.ts.map +1 -1
  325. package/lib/pages/extension-list/extension-list-header.js +55 -74
  326. package/lib/pages/extension-list/extension-list-header.js.map +1 -1
  327. package/lib/pages/extension-list/extension-list-item.d.ts.map +1 -1
  328. package/lib/pages/extension-list/extension-list-item.js +13 -29
  329. package/lib/pages/extension-list/extension-list-item.js.map +1 -1
  330. package/lib/pages/extension-list/extension-list-searchfield.d.ts.map +1 -1
  331. package/lib/pages/extension-list/extension-list-searchfield.js +17 -20
  332. package/lib/pages/extension-list/extension-list-searchfield.js.map +1 -1
  333. package/lib/pages/extension-list/extension-list.d.ts.map +1 -1
  334. package/lib/pages/extension-list/extension-list.js +15 -19
  335. package/lib/pages/extension-list/extension-list.js.map +1 -1
  336. package/lib/pages/namespace-detail/namespace-detail.d.ts.map +1 -1
  337. package/lib/pages/namespace-detail/namespace-detail.js +50 -87
  338. package/lib/pages/namespace-detail/namespace-detail.js.map +1 -1
  339. package/lib/pages/user/add-namespace-member-dialog.d.ts.map +1 -1
  340. package/lib/pages/user/add-namespace-member-dialog.js +27 -40
  341. package/lib/pages/user/add-namespace-member-dialog.js.map +1 -1
  342. package/lib/pages/user/avatar.d.ts.map +1 -1
  343. package/lib/pages/user/avatar.js +12 -28
  344. package/lib/pages/user/avatar.js.map +1 -1
  345. package/lib/pages/user/create-namespace-dialog.d.ts.map +1 -1
  346. package/lib/pages/user/create-namespace-dialog.js +12 -20
  347. package/lib/pages/user/create-namespace-dialog.js.map +1 -1
  348. package/lib/pages/user/generate-token-dialog.d.ts.map +1 -1
  349. package/lib/pages/user/generate-token-dialog.js +18 -31
  350. package/lib/pages/user/generate-token-dialog.js.map +1 -1
  351. package/lib/pages/user/logout.d.ts +3 -2
  352. package/lib/pages/user/logout.d.ts.map +1 -1
  353. package/lib/pages/user/logout.js +15 -15
  354. package/lib/pages/user/logout.js.map +1 -1
  355. package/lib/pages/user/publish-extension-dialog.d.ts.map +1 -1
  356. package/lib/pages/user/publish-extension-dialog.js +25 -46
  357. package/lib/pages/user/publish-extension-dialog.js.map +1 -1
  358. package/lib/pages/user/user-extension-list.d.ts.map +1 -1
  359. package/lib/pages/user/user-extension-list.js +5 -16
  360. package/lib/pages/user/user-extension-list.js.map +1 -1
  361. package/lib/pages/user/user-namespace-details.d.ts.map +1 -1
  362. package/lib/pages/user/user-namespace-details.js +53 -136
  363. package/lib/pages/user/user-namespace-details.js.map +1 -1
  364. package/lib/pages/user/user-namespace-extension-list-item.d.ts.map +1 -1
  365. package/lib/pages/user/user-namespace-extension-list-item.js +14 -39
  366. package/lib/pages/user/user-namespace-extension-list-item.js.map +1 -1
  367. package/lib/pages/user/user-namespace-extension-list.d.ts.map +1 -1
  368. package/lib/pages/user/user-namespace-extension-list.js +14 -15
  369. package/lib/pages/user/user-namespace-extension-list.js.map +1 -1
  370. package/lib/pages/user/user-namespace-member-component.d.ts.map +1 -1
  371. package/lib/pages/user/user-namespace-member-component.js +24 -34
  372. package/lib/pages/user/user-namespace-member-component.js.map +1 -1
  373. package/lib/pages/user/user-namespace-member-list.d.ts.map +1 -1
  374. package/lib/pages/user/user-namespace-member-list.js +20 -24
  375. package/lib/pages/user/user-namespace-member-list.js.map +1 -1
  376. package/lib/pages/user/user-publisher-agreement.d.ts.map +1 -1
  377. package/lib/pages/user/user-publisher-agreement.js +21 -52
  378. package/lib/pages/user/user-publisher-agreement.js.map +1 -1
  379. package/lib/pages/user/user-setting-tabs.d.ts.map +1 -1
  380. package/lib/pages/user/user-setting-tabs.js +2 -15
  381. package/lib/pages/user/user-setting-tabs.js.map +1 -1
  382. package/lib/pages/user/user-settings-delete-extension.d.ts.map +1 -1
  383. package/lib/pages/user/user-settings-delete-extension.js +14 -15
  384. package/lib/pages/user/user-settings-delete-extension.js.map +1 -1
  385. package/lib/pages/user/user-settings-extensions.d.ts.map +1 -1
  386. package/lib/pages/user/user-settings-extensions.js +22 -30
  387. package/lib/pages/user/user-settings-extensions.js.map +1 -1
  388. package/lib/pages/user/user-settings-namespace-detail.d.ts +2 -2
  389. package/lib/pages/user/user-settings-namespace-detail.d.ts.map +1 -1
  390. package/lib/pages/user/user-settings-namespace-detail.js +27 -45
  391. package/lib/pages/user/user-settings-namespace-detail.js.map +1 -1
  392. package/lib/pages/user/user-settings-namespaces.d.ts.map +1 -1
  393. package/lib/pages/user/user-settings-namespaces.js +33 -46
  394. package/lib/pages/user/user-settings-namespaces.js.map +1 -1
  395. package/lib/pages/user/user-settings-profile.d.ts.map +1 -1
  396. package/lib/pages/user/user-settings-profile.js +10 -29
  397. package/lib/pages/user/user-settings-profile.js.map +1 -1
  398. package/lib/pages/user/user-settings-tokens.d.ts.map +1 -1
  399. package/lib/pages/user/user-settings-tokens.js +24 -62
  400. package/lib/pages/user/user-settings-tokens.js.map +1 -1
  401. package/lib/pages/user/user-settings.d.ts.map +1 -1
  402. package/lib/pages/user/user-settings.js +18 -35
  403. package/lib/pages/user/user-settings.js.map +1 -1
  404. package/lib/server-request.d.ts +1 -1
  405. package/lib/server-request.d.ts.map +1 -1
  406. package/lib/server-request.js +10 -6
  407. package/lib/server-request.js.map +1 -1
  408. package/lib/utils.d.ts.map +1 -1
  409. package/lib/utils.js +48 -20
  410. package/lib/utils.js.map +1 -1
  411. package/package.json +44 -38
  412. package/src/components/banner.tsx +1 -1
  413. package/src/components/button-with-progress.tsx +1 -1
  414. package/src/components/copy-to-clipboard.tsx +2 -1
  415. package/src/components/delayed-load-indicator.tsx +2 -2
  416. package/src/components/error-dialog.tsx +1 -1
  417. package/src/components/hover-popover.tsx +1 -1
  418. package/src/components/info-dialog.tsx +1 -1
  419. package/src/components/sanitized-markdown.tsx +1 -1
  420. package/src/components/scan-admin/common/auto-refresh.tsx +1 -1
  421. package/src/components/scan-admin/common/conditional-tooltip.tsx +3 -3
  422. package/src/components/scan-admin/common/file-table.tsx +1 -1
  423. package/src/components/scan-admin/common/tab-panel.tsx +1 -1
  424. package/src/components/scan-admin/dialogs/file-dialog.tsx +1 -1
  425. package/src/components/scan-admin/dialogs/quarantine-dialog.tsx +1 -1
  426. package/src/components/scan-admin/scan-card/scan-card-content.tsx +380 -408
  427. package/src/components/scan-admin/scan-card/scan-card-expand-strip-badges.tsx +2 -2
  428. package/src/components/scan-admin/scan-card/scan-card-expand-strip.tsx +2 -2
  429. package/src/components/scan-admin/scan-card/scan-card-expanded-content.tsx +2 -2
  430. package/src/components/scan-admin/scan-card/scan-card-header.tsx +37 -8
  431. package/src/components/scan-admin/scan-card/scan-card.tsx +5 -5
  432. package/src/components/scan-admin/scan-card/scan-detail-card.tsx +1 -1
  433. package/src/components/scan-admin/tab-contents/allow-list-tab-content.tsx +1 -1
  434. package/src/components/scan-admin/tab-contents/auto-rejected-tab-content.tsx +1 -1
  435. package/src/components/scan-admin/tab-contents/block-list-tab-content.tsx +1 -1
  436. package/src/components/scan-admin/tab-contents/quarantined-tab-content.tsx +1 -1
  437. package/src/components/scan-admin/tab-contents/scans-tab-content.tsx +1 -1
  438. package/src/components/scan-admin/toolbars/counts-toolbar.tsx +1 -1
  439. package/src/components/scan-admin/toolbars/search-toolbar.tsx +6 -6
  440. package/src/components/scan-admin/toolbars/tab-toolbar.tsx +1 -1
  441. package/src/components/sidepanel/navigation-item.tsx +1 -1
  442. package/src/components/sidepanel/sidepanel.tsx +1 -1
  443. package/src/components/text-divider.tsx +1 -1
  444. package/src/components/timestamp.tsx +1 -1
  445. package/src/context/scan-admin/scan-actions.ts +8 -7
  446. package/src/context/scan-admin/scan-api-actions.ts +5 -4
  447. package/src/context/scan-admin/scan-api-effects.ts +12 -11
  448. package/src/context/scan-admin/scan-context-types.ts +9 -9
  449. package/src/context/scan-admin/scan-context.tsx +2 -2
  450. package/src/default/about.tsx +1 -1
  451. package/src/default/default-app.tsx +1 -1
  452. package/src/default/login.tsx +2 -1
  453. package/src/default/menu-content.tsx +70 -96
  454. package/src/default/openvsx-registry-logo.tsx +1 -1
  455. package/src/default/page-settings.tsx +1 -1
  456. package/src/default/server.ts +1 -1
  457. package/src/extension-registry-service.ts +180 -2
  458. package/src/extension-registry-types.ts +68 -0
  459. package/src/header-menu.tsx +1 -1
  460. package/src/hooks/scan-admin/use-dialogs.ts +1 -1
  461. package/src/hooks/scan-admin/use-quarantined-tab.ts +2 -3
  462. package/src/hooks/scan-admin/use-query-params-state.ts +55 -0
  463. package/src/hooks/scan-admin/use-scan-card-state.ts +3 -2
  464. package/src/hooks/scan-admin/use-url-sync.ts +1 -1
  465. package/src/main.tsx +1 -1
  466. package/src/not-found.tsx +1 -1
  467. package/src/other-pages.tsx +1 -1
  468. package/src/pages/admin-dashboard/admin-dashboard.tsx +52 -3
  469. package/src/pages/admin-dashboard/components/data-grid-filter-operators.tsx +127 -0
  470. package/src/pages/admin-dashboard/components/index.ts +18 -0
  471. package/src/pages/admin-dashboard/customers/customer-form-dialog.tsx +347 -0
  472. package/src/pages/admin-dashboard/customers/customers.tsx +278 -0
  473. package/src/pages/admin-dashboard/customers/delete-customer-dialog.tsx +93 -0
  474. package/src/pages/admin-dashboard/extension-admin.tsx +5 -3
  475. package/src/pages/admin-dashboard/extension-remove-dialog.tsx +1 -1
  476. package/src/pages/admin-dashboard/extension-version-container.tsx +1 -1
  477. package/src/pages/admin-dashboard/logs/logs.tsx +213 -0
  478. package/src/pages/admin-dashboard/namespace-admin.tsx +1 -1
  479. package/src/pages/admin-dashboard/namespace-change-dialog.tsx +1 -1
  480. package/src/pages/admin-dashboard/namespace-input.tsx +4 -2
  481. package/src/pages/admin-dashboard/publisher-admin.tsx +5 -5
  482. package/src/pages/admin-dashboard/publisher-details.tsx +1 -1
  483. package/src/pages/admin-dashboard/publisher-revoke-dialog.tsx +1 -1
  484. package/src/pages/admin-dashboard/publisher-revoke-tokens-button.tsx +1 -1
  485. package/src/pages/admin-dashboard/scan-admin.tsx +3 -2
  486. package/src/pages/admin-dashboard/search-list-container.tsx +1 -1
  487. package/src/pages/admin-dashboard/tiers/delete-tier-dialog.tsx +83 -0
  488. package/src/pages/admin-dashboard/tiers/tier-form-dialog.tsx +373 -0
  489. package/src/pages/admin-dashboard/tiers/tiers.tsx +254 -0
  490. package/src/pages/admin-dashboard/usage-stats/usage-stats-chart.tsx +189 -0
  491. package/src/pages/admin-dashboard/usage-stats/usage-stats-search.tsx +83 -0
  492. package/src/pages/admin-dashboard/usage-stats/usage-stats-utils.ts +16 -0
  493. package/src/pages/admin-dashboard/usage-stats/usage-stats.tsx +127 -0
  494. package/src/pages/admin-dashboard/welcome.tsx +5 -1
  495. package/src/pages/extension-detail/extension-detail-changes.tsx +1 -1
  496. package/src/pages/extension-detail/extension-detail-downloads-menu.tsx +1 -1
  497. package/src/pages/extension-detail/extension-detail-overview.tsx +17 -3
  498. package/src/pages/extension-detail/extension-detail-reviews.tsx +53 -41
  499. package/src/pages/extension-detail/extension-detail.tsx +0 -1
  500. package/src/pages/extension-detail/extension-rating-star-setter.tsx +1 -1
  501. package/src/pages/extension-detail/extension-rating-stars.tsx +2 -2
  502. package/src/pages/extension-detail/extension-review-dialog.tsx +1 -1
  503. package/src/pages/extension-list/extension-list-container.tsx +1 -1
  504. package/src/pages/extension-list/extension-list-header.tsx +1 -1
  505. package/src/pages/extension-list/extension-list-item.tsx +1 -1
  506. package/src/pages/extension-list/extension-list-searchfield.tsx +1 -1
  507. package/src/pages/extension-list/extension-list.tsx +2 -2
  508. package/src/pages/namespace-detail/namespace-detail.tsx +1 -1
  509. package/src/pages/user/add-namespace-member-dialog.tsx +1 -1
  510. package/src/pages/user/avatar.tsx +31 -36
  511. package/src/pages/user/create-namespace-dialog.tsx +1 -1
  512. package/src/pages/user/generate-token-dialog.tsx +1 -1
  513. package/src/pages/user/logout.tsx +6 -4
  514. package/src/pages/user/publish-extension-dialog.tsx +1 -1
  515. package/src/pages/user/user-extension-list.tsx +1 -1
  516. package/src/pages/user/user-namespace-details.tsx +1 -1
  517. package/src/pages/user/user-namespace-extension-list-item.tsx +2 -1
  518. package/src/pages/user/user-namespace-extension-list.tsx +1 -1
  519. package/src/pages/user/user-namespace-member-component.tsx +1 -1
  520. package/src/pages/user/user-namespace-member-list.tsx +1 -1
  521. package/src/pages/user/user-publisher-agreement.tsx +1 -1
  522. package/src/pages/user/user-setting-tabs.tsx +1 -1
  523. package/src/pages/user/user-settings-delete-extension.tsx +1 -1
  524. package/src/pages/user/user-settings-extensions.tsx +2 -2
  525. package/src/pages/user/user-settings-namespace-detail.tsx +1 -1
  526. package/src/pages/user/user-settings-namespaces.tsx +1 -1
  527. package/src/pages/user/user-settings-profile.tsx +1 -1
  528. package/src/pages/user/user-settings-tokens.tsx +3 -4
  529. package/src/pages/user/user-settings.tsx +1 -1
  530. package/src/server-request.ts +8 -4
  531. package/src/utils.ts +39 -16
  532. package/lib/default/server.d.ts +0 -11
  533. package/lib/default/server.d.ts.map +0 -1
  534. package/lib/default/server.js +0 -50
  535. package/lib/default/server.js.map +0 -1
@@ -11,447 +11,419 @@
11
11
  * SPDX-License-Identifier: EPL-2.0
12
12
  ********************************************************************************/
13
13
 
14
- import React from 'react';
14
+ import { FunctionComponent, PropsWithChildren, useState } from 'react';
15
15
  import { Box, Typography, Link, IconButton, Tooltip } from '@mui/material';
16
+ import { styled, useTheme } from '@mui/material/styles';
16
17
  import {
17
18
  Check as CheckIcon,
18
19
  Warning as WarningAmberIcon,
19
20
  } from '@mui/icons-material';
20
21
  import { ScanResult } from '../../../context/scan-admin';
21
22
  import { ConditionalTooltip, formatDateTime, formatDuration } from '../common';
22
- import { useTheme } from '@mui/material/styles';
23
- import {
24
- isRunning,
25
- hasDownload,
26
- getFileName,
27
- } from './utils';
28
-
29
- interface ScanCardContentProps {
30
- scan: ScanResult;
31
- showCheckbox?: boolean;
32
- checked?: boolean;
33
- onCheckboxChange?: (id: string, checked: boolean) => void;
34
- liveDuration: string;
35
- }
23
+ import { isRunning, hasDownload, getFileName } from './utils';
36
24
 
37
25
  /**
38
- * Content section of the ScanCard containing:
39
- * - Publisher, Version, Download (Row 2)
40
- * - Scan Start, Scan End, Duration, Decision Status (Row 3)
41
- * - Checkbox for selection
26
+ * Grid cell positioned by row/column within the parent CSS Grid.
27
+ * Note: MUI's Grid/Grid2 components are flexbox-based, not CSS Grid.
42
28
  */
43
- export const ScanCardContent: React.FC<ScanCardContentProps> = ({
44
- scan,
45
- showCheckbox,
46
- checked,
47
- onCheckboxChange,
48
- liveDuration,
49
- }) => {
50
- const theme = useTheme();
51
- const [isCheckboxHovering, setIsCheckboxHovering] = React.useState(false);
29
+ const GridCell = styled(Box, {
30
+ shouldForwardProp: (prop) => prop !== 'row' && prop !== 'column' && prop !== 'columnSpan',
31
+ })<{ row: number; column: number; columnSpan?: number }>(({ row, column, columnSpan }) => ({
32
+ gridRow: String(row),
33
+ gridColumn: columnSpan ? `${column} / span ${columnSpan}` : String(column),
34
+ minWidth: 0,
35
+ }));
52
36
 
53
- return (
54
- <>
55
- {/* ROW 2 - Publisher, Version, Download, Checkbox */}
56
- {/* Column 1: Empty (below icon) */}
57
- <Box sx={{ gridRow: '2', gridColumn: '1' }} />
37
+ /** Typography with text-overflow ellipsis */
38
+ const EllipsisText = styled(Typography)({
39
+ display: 'block',
40
+ overflow: 'hidden',
41
+ textOverflow: 'ellipsis',
42
+ whiteSpace: 'nowrap',
43
+ });
58
44
 
59
- {/* Column 2: Publisher */}
60
- <Box sx={{ gridRow: '2', gridColumn: '2', minWidth: 0 }}>
61
- <Typography
62
- variant='caption'
63
- color='text.secondary'
64
- display='block'
65
- sx={{
66
- overflow: 'hidden',
67
- textOverflow: 'ellipsis',
68
- whiteSpace: 'nowrap',
69
- }}
70
- >
71
- Publisher
72
- </Typography>
73
- <ConditionalTooltip title={scan.publisher} arrow>
74
- <Box
75
- sx={{
76
- overflow: 'hidden',
77
- textOverflow: 'ellipsis',
78
- whiteSpace: 'nowrap',
79
- }}
80
- >
81
- <Link
82
- href={scan.publisherUrl || undefined}
83
- target='_blank'
84
- rel='noopener noreferrer'
85
- variant='body2'
86
- sx={{
87
- overflow: 'hidden',
88
- textOverflow: 'ellipsis',
89
- whiteSpace: 'nowrap',
90
- display: 'block',
91
- }}
92
- >
93
- {scan.publisher}
94
- </Link>
95
- </Box>
96
- </ConditionalTooltip>
97
- </Box>
45
+ /** Box with text-overflow ellipsis */
46
+ const EllipsisBox = styled(Box)({
47
+ overflow: 'hidden',
48
+ textOverflow: 'ellipsis',
49
+ whiteSpace: 'nowrap',
50
+ });
98
51
 
99
- {/* Column 3: Version */}
100
- <Box sx={{ gridRow: '2', gridColumn: '3', minWidth: 0 }}>
101
- <Typography
102
- variant='caption'
103
- color='text.secondary'
104
- display='block'
105
- sx={{
106
- overflow: 'hidden',
107
- textOverflow: 'ellipsis',
108
- whiteSpace: 'nowrap',
109
- }}
110
- >
111
- Version
112
- </Typography>
113
- <ConditionalTooltip title={scan.version} arrow>
114
- <Typography
115
- variant='body2'
116
- sx={{
117
- display: 'block',
118
- overflow: 'hidden',
119
- textOverflow: 'ellipsis',
120
- whiteSpace: 'nowrap',
121
- }}
122
- >
123
- {scan.version}
124
- </Typography>
125
- </ConditionalTooltip>
126
- </Box>
52
+ /** Link with text-overflow ellipsis */
53
+ const EllipsisLink = styled(Link)({
54
+ display: 'block',
55
+ overflow: 'hidden',
56
+ textOverflow: 'ellipsis',
57
+ whiteSpace: 'nowrap',
58
+ });
127
59
 
128
- {/* Column 4: Download */}
129
- <Box sx={{ gridRow: '2', gridColumn: '4', minWidth: 0 }}>
130
- <Typography
131
- variant='caption'
132
- color='text.secondary'
133
- display='block'
134
- sx={{
135
- overflow: 'hidden',
136
- textOverflow: 'ellipsis',
137
- whiteSpace: 'nowrap',
138
- }}
60
+ /** Shimmer-animated text for in-progress scan states */
61
+ const ShimmerText = styled(EllipsisText)(({ theme }) => ({
62
+ background: theme.palette.gray.gradient,
63
+ backgroundSize: '200% 100%',
64
+ backgroundClip: 'text',
65
+ WebkitBackgroundClip: 'text',
66
+ color: 'transparent',
67
+ animation: 'shimmer 2s infinite',
68
+ '@keyframes shimmer': {
69
+ '0%': { backgroundPosition: '200% 0' },
70
+ '100%': { backgroundPosition: '-200% 0' },
71
+ },
72
+ }));
73
+
74
+ /** Circular checkbox outline with checked/hover state transitions */
75
+ const CheckboxOutline = styled(Box, {
76
+ shouldForwardProp: (prop) => prop !== 'isChecked' && prop !== 'isHovering',
77
+ })<{ isChecked: boolean; isHovering: boolean }>(({ theme, isChecked, isHovering }) => {
78
+ const borderColor = isHovering ? theme.palette.selected.border : theme.palette.scanBackground.light;
79
+ const uncheckedBg = isHovering ? theme.palette.selected.background : 'transparent';
80
+
81
+ return {
82
+ position: 'absolute',
83
+ width: 36,
84
+ height: 36,
85
+ borderRadius: '50%',
86
+ border: isChecked ? 'none' : `2px solid ${borderColor}`,
87
+ backgroundColor: isChecked ? theme.palette.secondary.main : uncheckedBg,
88
+ transition: 'border-color 0.2s, background-color 0.2s',
89
+ };
90
+ });
91
+
92
+ /** Section caption label (e.g. "Publisher", "Version") */
93
+ const CaptionLabel: FunctionComponent<PropsWithChildren> = ({ children }) => (
94
+ <EllipsisText variant='caption' color='text.secondary'>
95
+ {children}
96
+ </EllipsisText>
97
+ );
98
+
99
+ /** N/A placeholder for unavailable data */
100
+ const NotAvailable: FunctionComponent = () => (
101
+ <Typography variant='body2' color='text.disabled'>N/A</Typography>
102
+ );
103
+
104
+ /** Publisher name with external link */
105
+ const PublisherCell: FunctionComponent<{ publisher: string; publisherUrl: string | null }> = ({
106
+ publisher,
107
+ publisherUrl,
108
+ }) => (
109
+ <>
110
+ <CaptionLabel>Publisher</CaptionLabel>
111
+ <ConditionalTooltip title={publisher} arrow>
112
+ <EllipsisBox>
113
+ <EllipsisLink
114
+ href={publisherUrl || undefined}
115
+ target='_blank'
116
+ rel='noopener noreferrer'
117
+ variant='body2'
139
118
  >
140
- Download
141
- </Typography>
142
- {isRunning(scan.status) ? (
143
- <Typography variant='body2' color='text.disabled'>
144
- N/A
145
- </Typography>
146
- ) : hasDownload(scan) && scan.downloadUrl ? (
147
- <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5, minWidth: 0 }}>
148
- {scan.status === 'QUARANTINED' && (
149
- <Tooltip
150
- title='Potentially malicious'
151
- arrow
152
- disableInteractive
153
- PopperProps={{
154
- disablePortal: true,
155
- sx: { pointerEvents: 'none' },
156
- }}
157
- >
158
- <WarningAmberIcon
159
- sx={{
160
- fontSize: 16,
161
- color: theme.palette.quarantined.dark,
162
- flexShrink: 0,
163
- }}
164
- />
165
- </Tooltip>
166
- )}
167
- <ConditionalTooltip title={getFileName(scan.downloadUrl)} arrow>
168
- <Link
169
- href={scan.downloadUrl}
170
- variant='body2'
171
- sx={{
172
- overflow: 'hidden',
173
- textOverflow: 'ellipsis',
174
- whiteSpace: 'nowrap',
175
- minWidth: 0,
176
- display: 'block',
177
- fontSize: '0.875rem',
178
- }}
179
- >
180
- {getFileName(scan.downloadUrl)}
181
- </Link>
182
- </ConditionalTooltip>
183
- </Box>
184
- ) : (
185
- <Typography variant='body2' color='text.disabled'>
186
- N/A
187
- </Typography>
188
- )}
189
- </Box>
119
+ {publisher}
120
+ </EllipsisLink>
121
+ </EllipsisBox>
122
+ </ConditionalTooltip>
123
+ </>
124
+ );
125
+
126
+ /** Extension version display */
127
+ const VersionCell: FunctionComponent<{ version: string }> = ({ version }) => (
128
+ <>
129
+ <CaptionLabel>Version</CaptionLabel>
130
+ <ConditionalTooltip title={version} arrow>
131
+ <EllipsisText variant='body2'>{version}</EllipsisText>
132
+ </ConditionalTooltip>
133
+ </>
134
+ );
190
135
 
191
- {/* Column 5: Checkbox */}
192
- <Box sx={{ gridRow: '2', gridColumn: '5', display: 'flex', alignItems: 'center', justifyContent: 'flex-end', minWidth: 0 }}>
193
- {showCheckbox && (
194
- <IconButton
195
- onClick={() => onCheckboxChange?.(scan.id, !checked)}
196
- onMouseEnter={() => setIsCheckboxHovering(true)}
197
- onMouseLeave={() => setIsCheckboxHovering(false)}
198
- disableRipple
199
- sx={{
200
- padding: 0,
201
- width: 36,
202
- height: 36,
203
- backgroundColor: 'transparent',
204
- }}
205
- >
206
- <Box
207
- className='checkbox-circle'
208
- sx={{
209
- position: 'relative',
210
- width: 36,
211
- height: 36,
212
- display: 'flex',
213
- alignItems: 'center',
214
- justifyContent: 'center',
215
- }}
136
+ /** Target platform display */
137
+ const PlatformCell: FunctionComponent<{ targetPlatform: string }> = ({ targetPlatform }) => (
138
+ <>
139
+ <CaptionLabel>Platform</CaptionLabel>
140
+ <ConditionalTooltip title={targetPlatform} arrow>
141
+ <EllipsisText variant='body2'>{targetPlatform}</EllipsisText>
142
+ </ConditionalTooltip>
143
+ </>
144
+ );
145
+
146
+ /** Download link with optional quarantine warning icon */
147
+ const DownloadCell: FunctionComponent<{ scan: ScanResult }> = ({ scan }) => {
148
+ const theme = useTheme();
149
+
150
+ if (isRunning(scan.status)) {
151
+ return (
152
+ <>
153
+ <CaptionLabel>Download</CaptionLabel>
154
+ <NotAvailable />
155
+ </>
156
+ );
157
+ }
158
+
159
+ if (hasDownload(scan) && scan.downloadUrl) {
160
+ return (
161
+ <>
162
+ <CaptionLabel>Download</CaptionLabel>
163
+ <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5, minWidth: 0 }}>
164
+ {scan.status === 'QUARANTINED' && (
165
+ <Tooltip
166
+ title='Potentially malicious'
167
+ arrow
168
+ disableInteractive
169
+ PopperProps={{ disablePortal: true, sx: { pointerEvents: 'none' } }}
216
170
  >
217
- <Box
218
- className='checkbox-circle-outline'
171
+ <WarningAmberIcon
219
172
  sx={{
220
- position: 'absolute',
221
- width: 36,
222
- height: 36,
223
- borderRadius: '50%',
224
- border: checked ? 'none' : `2px solid ${isCheckboxHovering ? theme.palette.selected.border : theme.palette.scanBackground.light}`,
225
- backgroundColor: checked
226
- ? 'secondary.main'
227
- : isCheckboxHovering
228
- ? theme.palette.selected.background
229
- : 'transparent',
230
- transition: 'border-color 0.2s, background-color 0.2s',
173
+ fontSize: 16,
174
+ color: theme.palette.quarantined.dark,
175
+ flexShrink: 0,
231
176
  }}
232
177
  />
233
- <CheckIcon
234
- className='checkbox-icon'
235
- sx={{
236
- fontSize: 24,
237
- color: checked
238
- ? 'white'
239
- : isCheckboxHovering
240
- ? theme.palette.selected.border
241
- : theme.palette.scanBackground.light,
242
- position: 'relative',
243
- zIndex: 1,
244
- transition: 'color 0.2s',
245
- }}
246
- />
247
- </Box>
248
- </IconButton>
249
- )}
250
- </Box>
178
+ </Tooltip>
179
+ )}
180
+ <ConditionalTooltip title={getFileName(scan.downloadUrl)} arrow>
181
+ <EllipsisLink href={scan.downloadUrl} variant='body2' sx={{ fontSize: '0.875rem', minWidth: 0 }}>
182
+ {getFileName(scan.downloadUrl)}
183
+ </EllipsisLink>
184
+ </ConditionalTooltip>
185
+ </Box>
186
+ </>
187
+ );
188
+ }
251
189
 
252
- {/* ROW 3 - Scan Start, Scan End, Scan Duration, Decision Status */}
253
- {/* Column 1: Empty (below icon) */}
254
- <Box sx={{ gridRow: '3', gridColumn: '1' }} />
190
+ return (
191
+ <>
192
+ <CaptionLabel>Download</CaptionLabel>
193
+ <NotAvailable />
194
+ </>
195
+ );
196
+ };
255
197
 
256
- {/* Column 2: Scan Start */}
257
- <Box sx={{ gridRow: '3', gridColumn: '2', minWidth: 0 }}>
258
- <Typography
259
- variant='caption'
260
- color='text.secondary'
261
- display='block'
262
- sx={{
263
- overflow: 'hidden',
264
- textOverflow: 'ellipsis',
265
- whiteSpace: 'nowrap',
266
- }}
267
- >
268
- Scan Start
269
- </Typography>
270
- <ConditionalTooltip title={formatDateTime(scan.dateScanStarted)} arrow>
271
- <Typography
272
- variant='body2'
273
- sx={{
274
- display: 'block',
275
- fontSize: '0.8rem',
276
- overflow: 'hidden',
277
- textOverflow: 'ellipsis',
278
- whiteSpace: 'nowrap',
279
- }}
280
- >
281
- {formatDateTime(scan.dateScanStarted)}
282
- </Typography>
283
- </ConditionalTooltip>
284
- </Box>
198
+ /** Circular selection checkbox with hover/check animations */
199
+ const SelectionCheckbox: FunctionComponent<{
200
+ checked?: boolean;
201
+ onChange?: (checked: boolean) => void;
202
+ }> = ({ checked = false, onChange }) => {
203
+ const theme = useTheme();
204
+ const [isHovering, setIsHovering] = useState(false);
205
+ const uncheckedIconColor = isHovering ? theme.palette.selected.border : theme.palette.scanBackground.light;
285
206
 
286
- {/* Column 3: Scan End */}
287
- <Box sx={{ gridRow: '3', gridColumn: '3', minWidth: 0 }}>
288
- <Typography
289
- variant='caption'
290
- color='text.secondary'
291
- display='block'
207
+ return (
208
+ <IconButton
209
+ onClick={() => onChange?.(!checked)}
210
+ onMouseEnter={() => setIsHovering(true)}
211
+ onMouseLeave={() => setIsHovering(false)}
212
+ disableRipple
213
+ sx={{ padding: 0, width: 36, height: 36, backgroundColor: 'transparent' }}
214
+ >
215
+ <Box
216
+ className='checkbox-circle'
217
+ sx={{
218
+ position: 'relative',
219
+ width: 36,
220
+ height: 36,
221
+ display: 'flex',
222
+ alignItems: 'center',
223
+ justifyContent: 'center',
224
+ }}
225
+ >
226
+ <CheckboxOutline
227
+ className='checkbox-circle-outline'
228
+ isChecked={checked}
229
+ isHovering={isHovering}
230
+ />
231
+ <CheckIcon
232
+ className='checkbox-icon'
292
233
  sx={{
293
- overflow: 'hidden',
294
- textOverflow: 'ellipsis',
295
- whiteSpace: 'nowrap',
234
+ fontSize: 24,
235
+ color: checked ? 'white' : uncheckedIconColor,
236
+ position: 'relative',
237
+ zIndex: 1,
238
+ transition: 'color 0.2s',
296
239
  }}
297
- >
298
- Scan End
299
- </Typography>
300
- {isRunning(scan.status) ? (
301
- <ConditionalTooltip title={`${scan.status}...`} arrow>
302
- <Typography
303
- variant='body2'
304
- sx={{
305
- display: 'block',
306
- background: theme.palette.gray.gradient,
307
- backgroundSize: '200% 100%',
308
- backgroundClip: 'text',
309
- WebkitBackgroundClip: 'text',
310
- color: 'transparent',
311
- animation: 'shimmer 2s infinite',
312
- '@keyframes shimmer': {
313
- '0%': { backgroundPosition: '200% 0' },
314
- '100%': { backgroundPosition: '-200% 0' },
315
- },
316
- overflow: 'hidden',
317
- textOverflow: 'ellipsis',
318
- whiteSpace: 'nowrap',
319
- }}
320
- >
321
- {scan.status}...
322
- </Typography>
323
- </ConditionalTooltip>
324
- ) : scan.dateScanEnded ? (
325
- <ConditionalTooltip title={formatDateTime(scan.dateScanEnded)} arrow>
326
- <Typography
327
- variant='body2'
328
- sx={{
329
- display: 'block',
330
- fontSize: '0.8rem',
331
- overflow: 'hidden',
332
- textOverflow: 'ellipsis',
333
- whiteSpace: 'nowrap',
334
- }}
335
- >
336
- {formatDateTime(scan.dateScanEnded)}
337
- </Typography>
338
- </ConditionalTooltip>
339
- ) : (
340
- <Typography variant='body2' color='text.disabled'>
341
- N/A
342
- </Typography>
343
- )}
240
+ />
344
241
  </Box>
242
+ </IconButton>
243
+ );
244
+ };
245
+
246
+ /** Scan start timestamp */
247
+ const ScanStartCell: FunctionComponent<{ dateScanStarted: string }> = ({ dateScanStarted }) => (
248
+ <>
249
+ <CaptionLabel>Scan Start</CaptionLabel>
250
+ <ConditionalTooltip title={formatDateTime(dateScanStarted)} arrow>
251
+ <EllipsisText variant='body2' sx={{ fontSize: '0.8rem' }}>
252
+ {formatDateTime(dateScanStarted)}
253
+ </EllipsisText>
254
+ </ConditionalTooltip>
255
+ </>
256
+ );
257
+
258
+ /** Scan end timestamp with shimmer animation for running scans */
259
+ const ScanEndCell: FunctionComponent<{ status: ScanResult['status']; dateScanEnded: string | null }> = ({
260
+ status,
261
+ dateScanEnded,
262
+ }) => {
263
+ const renderValue = () => {
264
+ if (isRunning(status)) {
265
+ return (
266
+ <ConditionalTooltip title={`${status}...`} arrow>
267
+ <ShimmerText variant='body2'>{status}...</ShimmerText>
268
+ </ConditionalTooltip>
269
+ );
270
+ }
271
+ if (dateScanEnded) {
272
+ return (
273
+ <ConditionalTooltip title={formatDateTime(dateScanEnded)} arrow>
274
+ <EllipsisText variant='body2' sx={{ fontSize: '0.8rem' }}>
275
+ {formatDateTime(dateScanEnded)}
276
+ </EllipsisText>
277
+ </ConditionalTooltip>
278
+ );
279
+ }
280
+ return <NotAvailable />;
281
+ };
282
+
283
+ return (
284
+ <>
285
+ <CaptionLabel>Scan End</CaptionLabel>
286
+ {renderValue()}
287
+ </>
288
+ );
289
+ };
290
+
291
+ /** Scan duration with live counter for running scans */
292
+ const ScanDurationCell: FunctionComponent<{
293
+ status: ScanResult['status'];
294
+ dateScanStarted: string;
295
+ dateScanEnded: string | null;
296
+ liveDuration: string;
297
+ }> = ({ status, dateScanStarted, dateScanEnded, liveDuration }) => (
298
+ <>
299
+ <CaptionLabel>Scan Duration</CaptionLabel>
300
+ {isRunning(status) ? (
301
+ <ConditionalTooltip title={liveDuration} arrow>
302
+ <ShimmerText variant='body2'>{liveDuration}</ShimmerText>
303
+ </ConditionalTooltip>
304
+ ) : (
305
+ <ConditionalTooltip title={formatDuration(dateScanStarted, dateScanEnded || undefined)} arrow>
306
+ <EllipsisText variant='body2'>
307
+ {formatDuration(dateScanStarted, dateScanEnded || undefined)}
308
+ </EllipsisText>
309
+ </ConditionalTooltip>
310
+ )}
311
+ </>
312
+ );
313
+
314
+ /** Admin decision status for quarantined extensions */
315
+ const DecisionStatusCell: FunctionComponent<{ adminDecision: ScanResult['adminDecision'] }> = ({ adminDecision }) => {
316
+ const theme = useTheme();
345
317
 
346
- {/* Column 4: Scan Duration */}
347
- <Box sx={{ gridRow: '3', gridColumn: '4', minWidth: 0 }}>
318
+ if (adminDecision) {
319
+ const isAllowed = adminDecision.decision.toLowerCase() === 'allowed';
320
+ return (
321
+ <Tooltip
322
+ title={`Decided by ${adminDecision.decidedBy} on ${formatDateTime(adminDecision.dateDecided)}`}
323
+ arrow
324
+ disableInteractive
325
+ PopperProps={{ disablePortal: true, sx: { pointerEvents: 'none' } }}
326
+ >
348
327
  <Typography
349
- variant='caption'
350
- color='text.secondary'
351
- display='block'
328
+ variant='h6'
352
329
  sx={{
353
- overflow: 'hidden',
354
- textOverflow: 'ellipsis',
330
+ fontWeight: 700,
331
+ color: isAllowed ? theme.palette.allowed : theme.palette.blocked,
355
332
  whiteSpace: 'nowrap',
333
+ cursor: 'help',
356
334
  }}
357
335
  >
358
- Scan Duration
336
+ {isAllowed ? 'ALLOWED' : 'BLOCKED'}
359
337
  </Typography>
360
- {isRunning(scan.status) ? (
361
- <ConditionalTooltip title={liveDuration} arrow>
362
- <Typography
363
- variant='body2'
364
- sx={{
365
- display: 'block',
366
- background: theme.palette.gray.gradient,
367
- backgroundSize: '200% 100%',
368
- backgroundClip: 'text',
369
- WebkitBackgroundClip: 'text',
370
- color: 'transparent',
371
- animation: 'shimmer 2s infinite',
372
- '@keyframes shimmer': {
373
- '0%': { backgroundPosition: '200% 0' },
374
- '100%': { backgroundPosition: '-200% 0' },
375
- },
376
- overflow: 'hidden',
377
- textOverflow: 'ellipsis',
378
- whiteSpace: 'nowrap',
379
- }}
380
- >
381
- {liveDuration}
382
- </Typography>
383
- </ConditionalTooltip>
384
- ) : (
385
- <ConditionalTooltip title={formatDuration(scan.dateScanStarted, scan.dateScanEnded || undefined)} arrow>
386
- <Typography
387
- variant='body2'
388
- sx={{
389
- display: 'block',
390
- overflow: 'hidden',
391
- textOverflow: 'ellipsis',
392
- whiteSpace: 'nowrap',
393
- }}
394
- >
395
- {formatDuration(scan.dateScanStarted, scan.dateScanEnded || undefined)}
396
- </Typography>
397
- </ConditionalTooltip>
398
- )}
399
- </Box>
338
+ </Tooltip>
339
+ );
340
+ }
400
341
 
401
- {/* Column 5: Decision Status */}
402
- {scan.status === 'QUARANTINED' && scan.adminDecision && (
403
- <Box sx={{
404
- gridRow: '3',
405
- gridColumn: '5',
406
- display: 'flex',
407
- justifyContent: 'flex-end',
408
- alignSelf: 'end',
409
- minWidth: 0,
410
- }}>
411
- <Tooltip
412
- title={`Decided by ${scan.adminDecision.decidedBy} on ${formatDateTime(scan.adminDecision.dateDecided)}`}
413
- arrow
414
- disableInteractive
415
- PopperProps={{
416
- disablePortal: true,
417
- sx: { pointerEvents: 'none' },
418
- }}
419
- >
420
- <Typography
421
- variant='h6'
422
- sx={{
423
- fontWeight: 700,
424
- color: scan.adminDecision.decision.toLowerCase() === 'allowed' ? theme.palette.allowed : theme.palette.blocked,
425
- whiteSpace: 'nowrap',
426
- cursor: 'help',
427
- }}
428
- >
429
- {scan.adminDecision.decision.toLowerCase() === 'allowed' ? 'ALLOWED' : 'BLOCKED'}
430
- </Typography>
431
- </Tooltip>
432
- </Box>
433
- )}
434
- {scan.status === 'QUARANTINED' && !scan.adminDecision && (
435
- <Box sx={{
436
- gridRow: '3',
437
- gridColumn: '5',
438
- display: 'flex',
439
- justifyContent: 'flex-end',
440
- alignSelf: 'end',
441
- minWidth: 0,
442
- }}>
443
- <Typography
444
- variant='h6'
445
- sx={{
446
- fontWeight: 700,
447
- color: theme.palette.review,
448
- whiteSpace: 'nowrap',
449
- }}
450
- >
451
- NEEDS REVIEW
452
- </Typography>
453
- </Box>
454
- )}
455
- </>
342
+ return (
343
+ <Typography
344
+ variant='h6'
345
+ sx={{
346
+ fontWeight: 700,
347
+ color: theme.palette.review,
348
+ whiteSpace: 'nowrap',
349
+ }}
350
+ >
351
+ NEEDS REVIEW
352
+ </Typography>
456
353
  );
457
354
  };
355
+
356
+ interface ScanCardContentProps {
357
+ scan: ScanResult;
358
+ showCheckbox?: boolean;
359
+ checked?: boolean;
360
+ onCheckboxChange?: (id: string, checked: boolean) => void;
361
+ liveDuration: string;
362
+ }
363
+
364
+ /**
365
+ * Content section of the ScanCard containing:
366
+ * - Publisher, Version, Platform, Download (Row 2)
367
+ * - Scan Start, Scan End, Duration, Decision Status (Row 3)
368
+ * - Checkbox for selection
369
+ */
370
+ export const ScanCardContent: FunctionComponent<ScanCardContentProps> = ({
371
+ scan,
372
+ showCheckbox,
373
+ checked,
374
+ onCheckboxChange,
375
+ liveDuration,
376
+ }) => (
377
+ <>
378
+ {/* ROW 2 - Publisher, Version, Platform, Download, Checkbox */}
379
+ <GridCell row={2} column={2}>
380
+ <PublisherCell publisher={scan.publisher} publisherUrl={scan.publisherUrl} />
381
+ </GridCell>
382
+ <GridCell row={2} column={3}>
383
+ <VersionCell version={scan.version} />
384
+ </GridCell>
385
+ <GridCell row={2} column={4}>
386
+ <PlatformCell targetPlatform={scan.targetPlatform} />
387
+ </GridCell>
388
+ <GridCell row={2} column={5}>
389
+ <DownloadCell scan={scan} />
390
+ </GridCell>
391
+ <GridCell
392
+ row={2}
393
+ column={6}
394
+ sx={{ display: 'flex', alignItems: 'center', justifyContent: 'flex-end' }}
395
+ >
396
+ {showCheckbox && (
397
+ <SelectionCheckbox
398
+ checked={checked}
399
+ onChange={(newChecked) => onCheckboxChange?.(scan.id, newChecked)}
400
+ />
401
+ )}
402
+ </GridCell>
403
+
404
+ {/* ROW 3 - Scan Start, Scan End, Duration, Decision Status */}
405
+ <GridCell row={3} column={2}>
406
+ <ScanStartCell dateScanStarted={scan.dateScanStarted} />
407
+ </GridCell>
408
+ <GridCell row={3} column={3}>
409
+ <ScanEndCell status={scan.status} dateScanEnded={scan.dateScanEnded} />
410
+ </GridCell>
411
+ <GridCell row={3} column={4}>
412
+ <ScanDurationCell
413
+ status={scan.status}
414
+ dateScanStarted={scan.dateScanStarted}
415
+ dateScanEnded={scan.dateScanEnded}
416
+ liveDuration={liveDuration}
417
+ />
418
+ </GridCell>
419
+ {scan.status === 'QUARANTINED' && (
420
+ <GridCell
421
+ row={3}
422
+ column={5} columnSpan={2}
423
+ sx={{ display: 'flex', justifyContent: 'flex-end', alignSelf: 'end' }}
424
+ >
425
+ <DecisionStatusCell adminDecision={scan.adminDecision} />
426
+ </GridCell>
427
+ )}
428
+ </>
429
+ );