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,74 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation
3
+ *
4
+ * See the NOTICE file(s) distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ *
7
+ * This program and the accompanying materials are made available under the
8
+ * terms of the Eclipse Public License 2.0 which is available at
9
+ * https://www.eclipse.org/legal/epl-2.0
10
+ *
11
+ * SPDX-License-Identifier: EPL-2.0
12
+ ********************************************************************************/
13
+
14
+ import React, { FunctionComponent, useRef, useState, useEffect } from 'react';
15
+ import { Tooltip, TooltipProps } from '@mui/material';
16
+
17
+ interface ConditionalTooltipProps extends Omit<TooltipProps, 'title'> {
18
+ title: string;
19
+ }
20
+
21
+ /**
22
+ * A Tooltip component that only shows when the child content is truncated with ellipsis.
23
+ * Uses ref to check if the content overflows its container.
24
+ */
25
+ export const ConditionalTooltip: FunctionComponent<ConditionalTooltipProps> = ({
26
+ title,
27
+ children,
28
+ ...tooltipProps
29
+ }) => {
30
+ const textRef = useRef<HTMLElement>(null);
31
+ const [isTruncated, setIsTruncated] = useState(false);
32
+
33
+ useEffect(() => {
34
+ const checkTruncation = () => {
35
+ if (textRef.current) {
36
+ setIsTruncated(textRef.current.scrollWidth > textRef.current.clientWidth);
37
+ }
38
+ };
39
+
40
+ checkTruncation();
41
+
42
+ // Recheck on window resize
43
+ window.addEventListener('resize', checkTruncation);
44
+ return () => window.removeEventListener('resize', checkTruncation);
45
+ }, [title, children]);
46
+
47
+ return (
48
+ <Tooltip
49
+ title={isTruncated ? title : ''}
50
+ disableHoverListener={!isTruncated}
51
+ disableInteractive
52
+ PopperProps={{
53
+ disablePortal: true,
54
+ modifiers: [
55
+ {
56
+ name: 'preventOverflow',
57
+ enabled: true,
58
+ options: {
59
+ boundary: 'clippingParents',
60
+ },
61
+ },
62
+ ],
63
+ sx: {
64
+ pointerEvents: 'none',
65
+ },
66
+ }}
67
+ {...tooltipProps}
68
+ >
69
+ {React.cloneElement(children as React.ReactElement, {
70
+ ref: textRef,
71
+ })}
72
+ </Tooltip>
73
+ );
74
+ };
@@ -0,0 +1,508 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation
3
+ *
4
+ * See the NOTICE file(s) distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ *
7
+ * This program and the accompanying materials are made available under the
8
+ * terms of the Eclipse Public License 2.0 which is available at
9
+ * https://www.eclipse.org/legal/epl-2.0
10
+ *
11
+ * SPDX-License-Identifier: EPL-2.0
12
+ ********************************************************************************/
13
+
14
+ import React, { FunctionComponent, useState } from 'react';
15
+ import {
16
+ Table,
17
+ TableBody,
18
+ TableCell,
19
+ TableContainer,
20
+ TableHead,
21
+ TableRow,
22
+ Checkbox,
23
+ Typography,
24
+ Chip,
25
+ } from '@mui/material';
26
+ import { FileDecision } from '../../../context/scan-admin';
27
+ import { ConditionalTooltip, formatDateTime } from './index';
28
+ import { useTheme } from '@mui/material/styles';
29
+
30
+ interface FileTableProps {
31
+ files: FileDecision[];
32
+ type: 'allowed' | 'blocked';
33
+ selectedFiles?: Set<string>;
34
+ onSelectionChange?: (fileIds: Set<string>) => void;
35
+ }
36
+
37
+ export const FileTable: FunctionComponent<FileTableProps> = (props) => {
38
+ const { files, type, selectedFiles = new Set(), onSelectionChange } = props;
39
+ const [internalSelection, setInternalSelection] = useState<Set<string>>(selectedFiles);
40
+ const theme = useTheme();
41
+ const [columnWidths, setColumnWidths] = useState({
42
+ file: 250,
43
+ type: 100,
44
+ date: 200,
45
+ actionBy: 130,
46
+ extension: 250,
47
+ publisher: 150,
48
+ version: 100,
49
+ });
50
+
51
+ const selection = onSelectionChange ? selectedFiles : internalSelection;
52
+ const setSelection = onSelectionChange || setInternalSelection;
53
+
54
+ const handleSelectAll = (event: React.ChangeEvent<HTMLInputElement>) => {
55
+ if (event.target.checked) {
56
+ const allIds = new Set(files.map(f => f.id));
57
+ setSelection(allIds);
58
+ } else {
59
+ setSelection(new Set());
60
+ }
61
+ };
62
+
63
+ const handleSelectOne = (fileId: string) => {
64
+ const newSelection = new Set(selection);
65
+ if (newSelection.has(fileId)) {
66
+ newSelection.delete(fileId);
67
+ } else {
68
+ newSelection.add(fileId);
69
+ }
70
+ setSelection(newSelection);
71
+ };
72
+
73
+ const isSelected = (fileId: string) => selection.has(fileId);
74
+ const allSelected = files.length > 0 && selection.size === files.length;
75
+ const someSelected = selection.size > 0 && selection.size < files.length;
76
+
77
+ const handleDoubleClick = (column: keyof typeof columnWidths, event: React.MouseEvent) => {
78
+ event.preventDefault();
79
+
80
+ const minWidth = 80;
81
+ const columns: (keyof typeof columnWidths)[] = ['file', 'type', 'date', 'actionBy', 'extension', 'publisher', 'version'];
82
+ const currentIndex = columns.indexOf(column);
83
+
84
+ const canvas = document.createElement('canvas');
85
+ const context = canvas.getContext('2d');
86
+ if (!context) return;
87
+
88
+ context.font = '14px Roboto, sans-serif';
89
+
90
+ let idealWidth = minWidth;
91
+ const padding = 32;
92
+
93
+ const headerTexts: Record<keyof typeof columnWidths, string> = {
94
+ file: 'File',
95
+ type: 'Type',
96
+ date: type === 'allowed' ? 'Date Allowed' : 'Date Blocked',
97
+ actionBy: type === 'allowed' ? 'Allowed By' : 'Blocked By',
98
+ extension: 'Extension',
99
+ publisher: 'Publisher',
100
+ version: 'Version',
101
+ };
102
+ idealWidth = Math.max(idealWidth, context.measureText(headerTexts[column]).width + padding);
103
+
104
+ files.forEach(file => {
105
+ let text = '';
106
+ switch (column) {
107
+ case 'file': {
108
+ const fileNameWidth = context.measureText(file.fileName).width;
109
+ const fileHashWidth = context.measureText(file.fileHash).width;
110
+ idealWidth = Math.max(idealWidth, fileNameWidth + padding, fileHashWidth + padding);
111
+ return;
112
+ }
113
+ case 'type':
114
+ text = file.fileType;
115
+ break;
116
+ case 'date': {
117
+ text = formatDateTime(file.dateDecided);
118
+ break;
119
+ }
120
+ case 'actionBy':
121
+ text = file.decidedBy;
122
+ break;
123
+ case 'extension': {
124
+ const displayNameWidth = context.measureText(file.displayName).width;
125
+ const namespaceWidth = context.measureText(`${file.namespace}.${file.extensionName}`).width;
126
+ idealWidth = Math.max(idealWidth, displayNameWidth + padding, namespaceWidth + padding);
127
+ return;
128
+ }
129
+ case 'publisher':
130
+ text = file.publisher;
131
+ break;
132
+ case 'version':
133
+ text = file.version;
134
+ break;
135
+ }
136
+
137
+ if (text) {
138
+ const width = context.measureText(text).width + padding;
139
+ idealWidth = Math.max(idealWidth, width);
140
+ }
141
+ });
142
+
143
+ idealWidth = Math.min(idealWidth, 600);
144
+
145
+ const currentWidth = columnWidths[column];
146
+ const growthNeeded = idealWidth - currentWidth;
147
+
148
+ if (growthNeeded <= 0) {
149
+ setColumnWidths(prev => ({
150
+ ...prev,
151
+ [column]: idealWidth,
152
+ }));
153
+ return;
154
+ }
155
+
156
+ let availableSpace = 0;
157
+ for (let i = currentIndex + 1; i < columns.length; i++) {
158
+ const col = columns[i];
159
+ availableSpace += columnWidths[col] - minWidth;
160
+ }
161
+
162
+ if (availableSpace <= 0) {
163
+ return;
164
+ }
165
+
166
+ const actualGrowth = Math.min(growthNeeded, availableSpace);
167
+ const newWidth = currentWidth + actualGrowth;
168
+
169
+ const newWidths = { ...columnWidths };
170
+ newWidths[column] = newWidth;
171
+
172
+ let remainingShrink = actualGrowth;
173
+ for (let i = currentIndex + 1; i < columns.length && remainingShrink > 0; i++) {
174
+ const col = columns[i];
175
+ const availableShrink = columnWidths[col] - minWidth;
176
+ const shrinkAmount = Math.min(remainingShrink, availableShrink);
177
+ newWidths[col] = columnWidths[col] - shrinkAmount;
178
+ remainingShrink -= shrinkAmount;
179
+ }
180
+
181
+ setColumnWidths(newWidths);
182
+ };
183
+
184
+ const handleMouseDown = (column: keyof typeof columnWidths, event: React.MouseEvent) => {
185
+ event.preventDefault();
186
+ const startX = event.clientX;
187
+ const startWidths = { ...columnWidths };
188
+ const minWidth = 80;
189
+
190
+ const columns: (keyof typeof columnWidths)[] = ['file', 'type', 'date', 'actionBy', 'extension', 'publisher', 'version'];
191
+ const currentIndex = columns.indexOf(column);
192
+
193
+ if (currentIndex === columns.length - 1) return;
194
+
195
+ const handleMouseMove = (e: MouseEvent) => {
196
+ const diff = e.clientX - startX;
197
+ const newWidths = { ...startWidths };
198
+
199
+ if (diff > 0) {
200
+ let remainingDiff = diff;
201
+ const currentGrowth = Math.min(remainingDiff, Number.MAX_SAFE_INTEGER);
202
+ newWidths[column] = startWidths[column] + currentGrowth;
203
+
204
+ for (let i = currentIndex + 1; i < columns.length && remainingDiff > 0; i++) {
205
+ const col = columns[i];
206
+ const availableShrink = startWidths[col] - minWidth;
207
+ const shrinkAmount = Math.min(remainingDiff, availableShrink);
208
+ newWidths[col] = startWidths[col] - shrinkAmount;
209
+ remainingDiff -= shrinkAmount;
210
+ }
211
+
212
+ newWidths[column] = startWidths[column] + (diff - remainingDiff);
213
+
214
+ } else if (diff < 0) {
215
+ let remainingDiff = Math.abs(diff);
216
+
217
+ const currentShrink = Math.min(remainingDiff, startWidths[column] - minWidth);
218
+ newWidths[column] = startWidths[column] - currentShrink;
219
+ remainingDiff -= currentShrink;
220
+
221
+ if (remainingDiff > 0) {
222
+ for (let i = currentIndex - 1; i >= 0 && remainingDiff > 0; i--) {
223
+ const col = columns[i];
224
+ const availableShrink = startWidths[col] - minWidth;
225
+ const shrinkAmount = Math.min(remainingDiff, availableShrink);
226
+ newWidths[col] = startWidths[col] - shrinkAmount;
227
+ remainingDiff -= shrinkAmount;
228
+ }
229
+ }
230
+
231
+ const totalShrunk = Math.abs(diff) - remainingDiff;
232
+ newWidths[columns[currentIndex + 1]] = startWidths[columns[currentIndex + 1]] + totalShrunk;
233
+ }
234
+
235
+ setColumnWidths(newWidths);
236
+ };
237
+
238
+ const handleMouseUp = () => {
239
+ document.removeEventListener('mousemove', handleMouseMove);
240
+ document.removeEventListener('mouseup', handleMouseUp);
241
+ };
242
+
243
+ document.addEventListener('mousemove', handleMouseMove);
244
+ document.addEventListener('mouseup', handleMouseUp);
245
+ };
246
+
247
+ const cellStyle = {
248
+ overflow: 'hidden',
249
+ textOverflow: 'ellipsis',
250
+ whiteSpace: 'nowrap' as const,
251
+ };
252
+
253
+ const truncateStyle = {
254
+ display: 'block',
255
+ ...cellStyle,
256
+ };
257
+
258
+ return (
259
+ <TableContainer
260
+ sx={{
261
+ width: '100%',
262
+ backgroundColor: theme.palette.scanBackground.default,
263
+ borderRadius: 2,
264
+ boxShadow: 2,
265
+ overflowX: 'hidden',
266
+ }}
267
+ >
268
+ <Table size='small' sx={{ tableLayout: 'fixed', width: '100%' }}>
269
+ <TableHead>
270
+ <TableRow sx={{ height: '52px' }}>
271
+ <TableCell padding='checkbox' sx={{ width: 50 }}>
272
+ <Checkbox
273
+ indeterminate={someSelected}
274
+ checked={allSelected}
275
+ onChange={handleSelectAll}
276
+ sx={{
277
+ color: theme.palette.checkboxUnchecked,
278
+ '&.Mui-checked': {
279
+ color: 'secondary.main',
280
+ },
281
+ '&.MuiCheckbox-indeterminate': {
282
+ color: 'secondary.main',
283
+ },
284
+ }}
285
+ />
286
+ </TableCell>
287
+ <TableCell sx={{ width: columnWidths.file, position: 'relative', ...cellStyle }}>
288
+ File
289
+ <div
290
+ onMouseDown={(e) => handleMouseDown('file', e)}
291
+ onDoubleClick={(e) => handleDoubleClick('file', e)}
292
+ style={{
293
+ position: 'absolute',
294
+ right: 0,
295
+ top: 0,
296
+ bottom: 0,
297
+ width: '5px',
298
+ cursor: 'col-resize',
299
+ userSelect: 'none',
300
+ }}
301
+ />
302
+ </TableCell>
303
+ <TableCell sx={{ width: columnWidths.type, position: 'relative', ...cellStyle }}>
304
+ Type
305
+ <div
306
+ onMouseDown={(e) => handleMouseDown('type', e)}
307
+ onDoubleClick={(e) => handleDoubleClick('type', e)}
308
+ style={{
309
+ position: 'absolute',
310
+ right: 0,
311
+ top: 0,
312
+ bottom: 0,
313
+ width: '5px',
314
+ cursor: 'col-resize',
315
+ userSelect: 'none',
316
+ }}
317
+ />
318
+ </TableCell>
319
+ <TableCell sx={{ width: columnWidths.date, position: 'relative', ...cellStyle }}>
320
+ {type === 'allowed' ? 'Date Allowed' : 'Date Blocked'}
321
+ <div
322
+ onMouseDown={(e) => handleMouseDown('date', e)}
323
+ onDoubleClick={(e) => handleDoubleClick('date', e)}
324
+ style={{
325
+ position: 'absolute',
326
+ right: 0,
327
+ top: 0,
328
+ bottom: 0,
329
+ width: '5px',
330
+ cursor: 'col-resize',
331
+ userSelect: 'none',
332
+ }}
333
+ />
334
+ </TableCell>
335
+ <TableCell sx={{ width: columnWidths.actionBy, position: 'relative', ...cellStyle }}>
336
+ {type === 'allowed' ? 'Allowed By' : 'Blocked By'}
337
+ <div
338
+ onMouseDown={(e) => handleMouseDown('actionBy', e)}
339
+ onDoubleClick={(e) => handleDoubleClick('actionBy', e)}
340
+ style={{
341
+ position: 'absolute',
342
+ right: 0,
343
+ top: 0,
344
+ bottom: 0,
345
+ width: '5px',
346
+ cursor: 'col-resize',
347
+ userSelect: 'none',
348
+ }}
349
+ />
350
+ </TableCell>
351
+ <TableCell sx={{ width: columnWidths.extension, position: 'relative', ...cellStyle }}>
352
+ Extension
353
+ <div
354
+ onMouseDown={(e) => handleMouseDown('extension', e)}
355
+ onDoubleClick={(e) => handleDoubleClick('extension', e)}
356
+ style={{
357
+ position: 'absolute',
358
+ right: 0,
359
+ top: 0,
360
+ bottom: 0,
361
+ width: '5px',
362
+ cursor: 'col-resize',
363
+ userSelect: 'none',
364
+ }}
365
+ />
366
+ </TableCell>
367
+ <TableCell sx={{ width: columnWidths.publisher, position: 'relative', ...cellStyle }}>
368
+ Publisher
369
+ <div
370
+ onMouseDown={(e) => handleMouseDown('publisher', e)}
371
+ onDoubleClick={(e) => handleDoubleClick('publisher', e)}
372
+ style={{
373
+ position: 'absolute',
374
+ right: 0,
375
+ top: 0,
376
+ bottom: 0,
377
+ width: '5px',
378
+ cursor: 'col-resize',
379
+ userSelect: 'none',
380
+ }}
381
+ />
382
+ </TableCell>
383
+ <TableCell sx={{ width: columnWidths.version, position: 'relative', ...cellStyle }}>
384
+ Version
385
+ <div
386
+ onMouseDown={(e) => handleMouseDown('version', e)}
387
+ onDoubleClick={(e) => handleDoubleClick('version', e)}
388
+ style={{
389
+ position: 'absolute',
390
+ right: 0,
391
+ top: 0,
392
+ bottom: 0,
393
+ width: '5px',
394
+ cursor: 'col-resize',
395
+ userSelect: 'none',
396
+ }}
397
+ />
398
+ </TableCell>
399
+ </TableRow>
400
+ </TableHead>
401
+ <TableBody>
402
+ {files.length === 0 ? (
403
+ <TableRow>
404
+ <TableCell colSpan={8} align='center'>
405
+ <Typography variant='body2' color='text.secondary' sx={{ py: 4 }}>
406
+ No {type} files
407
+ </Typography>
408
+ </TableCell>
409
+ </TableRow>
410
+ ) : (
411
+ files.map((file) => {
412
+ const selected = isSelected(file.id);
413
+ const dateField = file.dateDecided;
414
+ const actionByField = file.decidedBy;
415
+
416
+ return (
417
+ <TableRow
418
+ key={file.id}
419
+ hover
420
+ onClick={() => handleSelectOne(file.id)}
421
+ selected={selected}
422
+ sx={{
423
+ cursor: 'pointer',
424
+ '&.Mui-selected': {
425
+ backgroundColor: theme.palette.selected.background,
426
+ },
427
+ '&.Mui-selected:hover': {
428
+ backgroundColor: theme.palette.selected.backgroundHover,
429
+ },
430
+ }}
431
+ >
432
+ <TableCell padding='checkbox'>
433
+ <Checkbox
434
+ checked={selected}
435
+ sx={{
436
+ color: theme.palette.checkboxUnchecked,
437
+ '&.Mui-checked': {
438
+ color: 'secondary.main',
439
+ },
440
+ }}
441
+ />
442
+ </TableCell>
443
+ <TableCell sx={{ width: columnWidths.file, ...cellStyle }}>
444
+ <ConditionalTooltip title={file.fileName} arrow>
445
+ <Typography variant='body2' sx={{ fontFamily: 'monospace', ...truncateStyle }}>
446
+ {file.fileName}
447
+ </Typography>
448
+ </ConditionalTooltip>
449
+ <ConditionalTooltip title={file.fileHash} arrow>
450
+ <Typography
451
+ variant='caption'
452
+ sx={{
453
+ fontFamily: 'monospace',
454
+ fontSize: '0.7rem',
455
+ color: 'text.secondary',
456
+ ...truncateStyle,
457
+ }}
458
+ >
459
+ {file.fileHash}
460
+ </Typography>
461
+ </ConditionalTooltip>
462
+ </TableCell>
463
+ <TableCell sx={{ width: columnWidths.type, ...cellStyle }}>
464
+ <Chip label={file.fileType} size='small' variant='outlined' />
465
+ </TableCell>
466
+ <TableCell sx={{ width: columnWidths.date, ...cellStyle }}>
467
+ <ConditionalTooltip title={formatDateTime(dateField)} arrow>
468
+ <Typography variant='body2' sx={{ fontSize: '0.8rem', ...truncateStyle }}>
469
+ {formatDateTime(dateField)}
470
+ </Typography>
471
+ </ConditionalTooltip>
472
+ </TableCell>
473
+ <TableCell sx={{ width: columnWidths.actionBy, ...cellStyle }}>
474
+ <ConditionalTooltip title={actionByField} arrow>
475
+ <Typography variant='body2' sx={truncateStyle}>
476
+ {actionByField}
477
+ </Typography>
478
+ </ConditionalTooltip>
479
+ </TableCell>
480
+ <TableCell sx={{ width: columnWidths.extension, ...cellStyle }}>
481
+ <ConditionalTooltip title={file.displayName} arrow>
482
+ <Typography variant='body2' sx={truncateStyle}>{file.displayName}</Typography>
483
+ </ConditionalTooltip>
484
+ <ConditionalTooltip title={`${file.namespace}.${file.extensionName}`} arrow>
485
+ <Typography variant='caption' sx={{ color: 'text.secondary', ...truncateStyle }}>
486
+ {file.namespace}.{file.extensionName}
487
+ </Typography>
488
+ </ConditionalTooltip>
489
+ </TableCell>
490
+ <TableCell sx={{ width: columnWidths.publisher, ...cellStyle }}>
491
+ <ConditionalTooltip title={file.publisher} arrow>
492
+ <Typography variant='body2' sx={truncateStyle}>{file.publisher}</Typography>
493
+ </ConditionalTooltip>
494
+ </TableCell>
495
+ <TableCell sx={{ width: columnWidths.version, ...cellStyle }}>
496
+ <ConditionalTooltip title={file.version} arrow>
497
+ <Typography variant='body2' sx={truncateStyle}>{file.version}</Typography>
498
+ </ConditionalTooltip>
499
+ </TableCell>
500
+ </TableRow>
501
+ );
502
+ })
503
+ )}
504
+ </TableBody>
505
+ </Table>
506
+ </TableContainer>
507
+ );
508
+ };
@@ -0,0 +1,18 @@
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
+ export { ConditionalTooltip } from './conditional-tooltip';
15
+ export { FileTable } from './file-table';
16
+ export { AutoRefresh } from './auto-refresh';
17
+ export { TabPanel } from './tab-panel';
18
+ export { formatDuration, formatDateTime } from './utils';
@@ -0,0 +1,42 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation
3
+ *
4
+ * See the NOTICE file(s) distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ *
7
+ * This program and the accompanying materials are made available under the
8
+ * terms of the Eclipse Public License 2.0 which is available at
9
+ * https://www.eclipse.org/legal/epl-2.0
10
+ *
11
+ * SPDX-License-Identifier: EPL-2.0
12
+ ********************************************************************************/
13
+
14
+ import React, { FunctionComponent, ReactNode } from 'react';
15
+ import { Box } from '@mui/material';
16
+
17
+ interface TabPanelProps {
18
+ children?: ReactNode;
19
+ value: number;
20
+ index: number;
21
+ }
22
+
23
+ /**
24
+ * TabPanel component for conditionally displaying tab content.
25
+ * Shows children when the selected tab value matches this panel's index.
26
+ */
27
+ export const TabPanel: FunctionComponent<TabPanelProps> = ({
28
+ children,
29
+ value,
30
+ index,
31
+ }) => {
32
+ return (
33
+ <Box
34
+ role='tabpanel'
35
+ hidden={value !== index}
36
+ id={`scan-tabpanel-${index}`}
37
+ aria-labelledby={`scan-tab-${index}`}
38
+ >
39
+ {value === index && children}
40
+ </Box>
41
+ );
42
+ };