openvsx-webui-test 0.18.0-security.5 → 0.19.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (525) 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 +2 -2
  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 +153 -195
  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 +44 -59
  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 +7 -7
  144. package/lib/default/menu-content.d.ts.map +1 -1
  145. package/lib/default/menu-content.js +20 -82
  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 +168 -1
  155. package/lib/extension-registry-service.js.map +1 -1
  156. package/lib/extension-registry-types.d.ts +55 -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-scan-card-state.d.ts +3 -3
  175. package/lib/hooks/scan-admin/use-scan-card-state.d.ts.map +1 -1
  176. package/lib/hooks/scan-admin/use-scan-card-state.js +1 -1
  177. package/lib/hooks/scan-admin/use-scan-card-state.js.map +1 -1
  178. package/lib/hooks/scan-admin/use-scan-filters.d.ts +3 -4
  179. package/lib/hooks/scan-admin/use-scan-filters.d.ts.map +1 -1
  180. package/lib/hooks/scan-admin/use-scans-tab.d.ts +1 -2
  181. package/lib/hooks/scan-admin/use-scans-tab.d.ts.map +1 -1
  182. package/lib/hooks/scan-admin/use-scans-tab.js.map +1 -1
  183. package/lib/hooks/scan-admin/use-search.d.ts +0 -1
  184. package/lib/hooks/scan-admin/use-search.d.ts.map +1 -1
  185. package/lib/hooks/scan-admin/use-tab-navigation.js.map +1 -1
  186. package/lib/hooks/scan-admin/use-url-sync.js.map +1 -1
  187. package/lib/main.d.ts.map +1 -1
  188. package/lib/main.js +15 -21
  189. package/lib/main.js.map +1 -1
  190. package/lib/not-found.d.ts.map +1 -1
  191. package/lib/not-found.js +2 -5
  192. package/lib/not-found.js.map +1 -1
  193. package/lib/other-pages.d.ts.map +1 -1
  194. package/lib/other-pages.js +7 -24
  195. package/lib/other-pages.js.map +1 -1
  196. package/lib/pages/admin-dashboard/admin-dashboard.d.ts +4 -0
  197. package/lib/pages/admin-dashboard/admin-dashboard.d.ts.map +1 -1
  198. package/lib/pages/admin-dashboard/admin-dashboard.js +43 -39
  199. package/lib/pages/admin-dashboard/admin-dashboard.js.map +1 -1
  200. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.d.ts +40 -0
  201. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.d.ts.map +1 -0
  202. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.js +81 -0
  203. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.js.map +1 -0
  204. package/lib/pages/admin-dashboard/components/index.d.ts +14 -0
  205. package/lib/pages/admin-dashboard/components/index.d.ts.map +1 -0
  206. package/lib/pages/admin-dashboard/components/index.js +14 -0
  207. package/lib/pages/admin-dashboard/components/index.js.map +1 -0
  208. package/lib/pages/admin-dashboard/customers/customer-form-dialog.d.ts +23 -0
  209. package/lib/pages/admin-dashboard/customers/customer-form-dialog.d.ts.map +1 -0
  210. package/lib/pages/admin-dashboard/customers/customer-form-dialog.js +206 -0
  211. package/lib/pages/admin-dashboard/customers/customer-form-dialog.js.map +1 -0
  212. package/lib/pages/admin-dashboard/customers/customers.d.ts +15 -0
  213. package/lib/pages/admin-dashboard/customers/customers.d.ts.map +1 -0
  214. package/lib/pages/admin-dashboard/customers/customers.js +156 -0
  215. package/lib/pages/admin-dashboard/customers/customers.js.map +1 -0
  216. package/lib/pages/admin-dashboard/customers/delete-customer-dialog.d.ts +23 -0
  217. package/lib/pages/admin-dashboard/customers/delete-customer-dialog.d.ts.map +1 -0
  218. package/lib/pages/admin-dashboard/customers/delete-customer-dialog.js +47 -0
  219. package/lib/pages/admin-dashboard/customers/delete-customer-dialog.js.map +1 -0
  220. package/lib/pages/admin-dashboard/extension-admin.d.ts.map +1 -1
  221. package/lib/pages/admin-dashboard/extension-admin.js +17 -16
  222. package/lib/pages/admin-dashboard/extension-admin.js.map +1 -1
  223. package/lib/pages/admin-dashboard/extension-remove-dialog.d.ts.map +1 -1
  224. package/lib/pages/admin-dashboard/extension-remove-dialog.js +13 -31
  225. package/lib/pages/admin-dashboard/extension-remove-dialog.js.map +1 -1
  226. package/lib/pages/admin-dashboard/extension-version-container.d.ts.map +1 -1
  227. package/lib/pages/admin-dashboard/extension-version-container.js +26 -53
  228. package/lib/pages/admin-dashboard/extension-version-container.js.map +1 -1
  229. package/lib/pages/admin-dashboard/logs/logs.d.ts +15 -0
  230. package/lib/pages/admin-dashboard/logs/logs.d.ts.map +1 -0
  231. package/lib/pages/admin-dashboard/logs/logs.js +133 -0
  232. package/lib/pages/admin-dashboard/logs/logs.js.map +1 -0
  233. package/lib/pages/admin-dashboard/namespace-admin.d.ts.map +1 -1
  234. package/lib/pages/admin-dashboard/namespace-admin.js +14 -22
  235. package/lib/pages/admin-dashboard/namespace-admin.js.map +1 -1
  236. package/lib/pages/admin-dashboard/namespace-change-dialog.d.ts.map +1 -1
  237. package/lib/pages/admin-dashboard/namespace-change-dialog.js +14 -24
  238. package/lib/pages/admin-dashboard/namespace-change-dialog.js.map +1 -1
  239. package/lib/pages/admin-dashboard/namespace-input.d.ts.map +1 -1
  240. package/lib/pages/admin-dashboard/namespace-input.js +16 -18
  241. package/lib/pages/admin-dashboard/namespace-input.js.map +1 -1
  242. package/lib/pages/admin-dashboard/publisher-admin.d.ts +2 -2
  243. package/lib/pages/admin-dashboard/publisher-admin.d.ts.map +1 -1
  244. package/lib/pages/admin-dashboard/publisher-admin.js +18 -22
  245. package/lib/pages/admin-dashboard/publisher-admin.js.map +1 -1
  246. package/lib/pages/admin-dashboard/publisher-details.d.ts.map +1 -1
  247. package/lib/pages/admin-dashboard/publisher-details.js +5 -28
  248. package/lib/pages/admin-dashboard/publisher-details.js.map +1 -1
  249. package/lib/pages/admin-dashboard/publisher-revoke-dialog.d.ts.map +1 -1
  250. package/lib/pages/admin-dashboard/publisher-revoke-dialog.js +22 -51
  251. package/lib/pages/admin-dashboard/publisher-revoke-dialog.js.map +1 -1
  252. package/lib/pages/admin-dashboard/publisher-revoke-tokens-button.d.ts.map +1 -1
  253. package/lib/pages/admin-dashboard/publisher-revoke-tokens-button.js +12 -12
  254. package/lib/pages/admin-dashboard/publisher-revoke-tokens-button.js.map +1 -1
  255. package/lib/pages/admin-dashboard/scan-admin.d.ts.map +1 -1
  256. package/lib/pages/admin-dashboard/scan-admin.js +5 -32
  257. package/lib/pages/admin-dashboard/scan-admin.js.map +1 -1
  258. package/lib/pages/admin-dashboard/search-list-container.d.ts.map +1 -1
  259. package/lib/pages/admin-dashboard/search-list-container.js +4 -19
  260. package/lib/pages/admin-dashboard/search-list-container.js.map +1 -1
  261. package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.d.ts +23 -0
  262. package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.d.ts.map +1 -0
  263. package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.js +45 -0
  264. package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.js.map +1 -0
  265. package/lib/pages/admin-dashboard/tiers/tier-form-dialog.d.ts +23 -0
  266. package/lib/pages/admin-dashboard/tiers/tier-form-dialog.d.ts.map +1 -0
  267. package/lib/pages/admin-dashboard/tiers/tier-form-dialog.js +174 -0
  268. package/lib/pages/admin-dashboard/tiers/tier-form-dialog.js.map +1 -0
  269. package/lib/pages/admin-dashboard/tiers/tiers.d.ts +15 -0
  270. package/lib/pages/admin-dashboard/tiers/tiers.d.ts.map +1 -0
  271. package/lib/pages/admin-dashboard/tiers/tiers.js +159 -0
  272. package/lib/pages/admin-dashboard/tiers/tiers.js.map +1 -0
  273. package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.d.ts +23 -0
  274. package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.d.ts.map +1 -0
  275. package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.js +87 -0
  276. package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.js.map +1 -0
  277. package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.d.ts +26 -0
  278. package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.d.ts.map +1 -0
  279. package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.js +35 -0
  280. package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.js.map +1 -0
  281. package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.d.ts +14 -0
  282. package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.d.ts.map +1 -0
  283. package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.js +16 -0
  284. package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.js.map +1 -0
  285. package/lib/pages/admin-dashboard/usage-stats/usage-stats.d.ts +15 -0
  286. package/lib/pages/admin-dashboard/usage-stats/usage-stats.d.ts.map +1 -0
  287. package/lib/pages/admin-dashboard/usage-stats/usage-stats.js +102 -0
  288. package/lib/pages/admin-dashboard/usage-stats/usage-stats.js.map +1 -0
  289. package/lib/pages/admin-dashboard/welcome.d.ts.map +1 -1
  290. package/lib/pages/admin-dashboard/welcome.js +3 -27
  291. package/lib/pages/admin-dashboard/welcome.js.map +1 -1
  292. package/lib/pages/extension-detail/extension-detail-changes.d.ts.map +1 -1
  293. package/lib/pages/extension-detail/extension-detail-changes.js +27 -33
  294. package/lib/pages/extension-detail/extension-detail-changes.js.map +1 -1
  295. package/lib/pages/extension-detail/extension-detail-downloads-menu.d.ts.map +1 -1
  296. package/lib/pages/extension-detail/extension-detail-downloads-menu.js +6 -9
  297. package/lib/pages/extension-detail/extension-detail-downloads-menu.js.map +1 -1
  298. package/lib/pages/extension-detail/extension-detail-overview.d.ts.map +1 -1
  299. package/lib/pages/extension-detail/extension-detail-overview.js +66 -133
  300. package/lib/pages/extension-detail/extension-detail-overview.js.map +1 -1
  301. package/lib/pages/extension-detail/extension-detail-reviews.d.ts.map +1 -1
  302. package/lib/pages/extension-detail/extension-detail-reviews.js +53 -75
  303. package/lib/pages/extension-detail/extension-detail-reviews.js.map +1 -1
  304. package/lib/pages/extension-detail/extension-detail.d.ts.map +1 -1
  305. package/lib/pages/extension-detail/extension-detail.js +56 -129
  306. package/lib/pages/extension-detail/extension-detail.js.map +1 -1
  307. package/lib/pages/extension-detail/extension-rating-star-setter.d.ts.map +1 -1
  308. package/lib/pages/extension-detail/extension-rating-star-setter.js +4 -3
  309. package/lib/pages/extension-detail/extension-rating-star-setter.js.map +1 -1
  310. package/lib/pages/extension-detail/extension-rating-stars.d.ts.map +1 -1
  311. package/lib/pages/extension-detail/extension-rating-stars.js +5 -16
  312. package/lib/pages/extension-detail/extension-rating-stars.js.map +1 -1
  313. package/lib/pages/extension-detail/extension-review-dialog.d.ts.map +1 -1
  314. package/lib/pages/extension-detail/extension-review-dialog.js +15 -28
  315. package/lib/pages/extension-detail/extension-review-dialog.js.map +1 -1
  316. package/lib/pages/extension-list/extension-list-container.d.ts.map +1 -1
  317. package/lib/pages/extension-list/extension-list-container.js +3 -4
  318. package/lib/pages/extension-list/extension-list-container.js.map +1 -1
  319. package/lib/pages/extension-list/extension-list-header.d.ts.map +1 -1
  320. package/lib/pages/extension-list/extension-list-header.js +55 -74
  321. package/lib/pages/extension-list/extension-list-header.js.map +1 -1
  322. package/lib/pages/extension-list/extension-list-item.d.ts.map +1 -1
  323. package/lib/pages/extension-list/extension-list-item.js +13 -29
  324. package/lib/pages/extension-list/extension-list-item.js.map +1 -1
  325. package/lib/pages/extension-list/extension-list-searchfield.d.ts.map +1 -1
  326. package/lib/pages/extension-list/extension-list-searchfield.js +17 -20
  327. package/lib/pages/extension-list/extension-list-searchfield.js.map +1 -1
  328. package/lib/pages/extension-list/extension-list.d.ts.map +1 -1
  329. package/lib/pages/extension-list/extension-list.js +15 -19
  330. package/lib/pages/extension-list/extension-list.js.map +1 -1
  331. package/lib/pages/namespace-detail/namespace-detail.d.ts.map +1 -1
  332. package/lib/pages/namespace-detail/namespace-detail.js +50 -87
  333. package/lib/pages/namespace-detail/namespace-detail.js.map +1 -1
  334. package/lib/pages/user/add-namespace-member-dialog.d.ts.map +1 -1
  335. package/lib/pages/user/add-namespace-member-dialog.js +27 -40
  336. package/lib/pages/user/add-namespace-member-dialog.js.map +1 -1
  337. package/lib/pages/user/avatar.d.ts.map +1 -1
  338. package/lib/pages/user/avatar.js +6 -22
  339. package/lib/pages/user/avatar.js.map +1 -1
  340. package/lib/pages/user/create-namespace-dialog.d.ts.map +1 -1
  341. package/lib/pages/user/create-namespace-dialog.js +12 -20
  342. package/lib/pages/user/create-namespace-dialog.js.map +1 -1
  343. package/lib/pages/user/generate-token-dialog.d.ts.map +1 -1
  344. package/lib/pages/user/generate-token-dialog.js +18 -31
  345. package/lib/pages/user/generate-token-dialog.js.map +1 -1
  346. package/lib/pages/user/logout.d.ts.map +1 -1
  347. package/lib/pages/user/logout.js +12 -13
  348. package/lib/pages/user/logout.js.map +1 -1
  349. package/lib/pages/user/publish-extension-dialog.d.ts.map +1 -1
  350. package/lib/pages/user/publish-extension-dialog.js +25 -46
  351. package/lib/pages/user/publish-extension-dialog.js.map +1 -1
  352. package/lib/pages/user/user-extension-list.d.ts.map +1 -1
  353. package/lib/pages/user/user-extension-list.js +5 -16
  354. package/lib/pages/user/user-extension-list.js.map +1 -1
  355. package/lib/pages/user/user-namespace-details.d.ts.map +1 -1
  356. package/lib/pages/user/user-namespace-details.js +53 -136
  357. package/lib/pages/user/user-namespace-details.js.map +1 -1
  358. package/lib/pages/user/user-namespace-extension-list-item.d.ts.map +1 -1
  359. package/lib/pages/user/user-namespace-extension-list-item.js +14 -39
  360. package/lib/pages/user/user-namespace-extension-list-item.js.map +1 -1
  361. package/lib/pages/user/user-namespace-extension-list.d.ts.map +1 -1
  362. package/lib/pages/user/user-namespace-extension-list.js +14 -15
  363. package/lib/pages/user/user-namespace-extension-list.js.map +1 -1
  364. package/lib/pages/user/user-namespace-member-component.d.ts.map +1 -1
  365. package/lib/pages/user/user-namespace-member-component.js +24 -34
  366. package/lib/pages/user/user-namespace-member-component.js.map +1 -1
  367. package/lib/pages/user/user-namespace-member-list.d.ts.map +1 -1
  368. package/lib/pages/user/user-namespace-member-list.js +20 -24
  369. package/lib/pages/user/user-namespace-member-list.js.map +1 -1
  370. package/lib/pages/user/user-publisher-agreement.d.ts.map +1 -1
  371. package/lib/pages/user/user-publisher-agreement.js +21 -52
  372. package/lib/pages/user/user-publisher-agreement.js.map +1 -1
  373. package/lib/pages/user/user-setting-tabs.d.ts.map +1 -1
  374. package/lib/pages/user/user-setting-tabs.js +2 -15
  375. package/lib/pages/user/user-setting-tabs.js.map +1 -1
  376. package/lib/pages/user/user-settings-delete-extension.d.ts.map +1 -1
  377. package/lib/pages/user/user-settings-delete-extension.js +14 -15
  378. package/lib/pages/user/user-settings-delete-extension.js.map +1 -1
  379. package/lib/pages/user/user-settings-extensions.d.ts.map +1 -1
  380. package/lib/pages/user/user-settings-extensions.js +22 -30
  381. package/lib/pages/user/user-settings-extensions.js.map +1 -1
  382. package/lib/pages/user/user-settings-namespace-detail.d.ts +2 -2
  383. package/lib/pages/user/user-settings-namespace-detail.d.ts.map +1 -1
  384. package/lib/pages/user/user-settings-namespace-detail.js +27 -45
  385. package/lib/pages/user/user-settings-namespace-detail.js.map +1 -1
  386. package/lib/pages/user/user-settings-namespaces.d.ts.map +1 -1
  387. package/lib/pages/user/user-settings-namespaces.js +33 -46
  388. package/lib/pages/user/user-settings-namespaces.js.map +1 -1
  389. package/lib/pages/user/user-settings-profile.d.ts.map +1 -1
  390. package/lib/pages/user/user-settings-profile.js +10 -29
  391. package/lib/pages/user/user-settings-profile.js.map +1 -1
  392. package/lib/pages/user/user-settings-tokens.d.ts.map +1 -1
  393. package/lib/pages/user/user-settings-tokens.js +24 -62
  394. package/lib/pages/user/user-settings-tokens.js.map +1 -1
  395. package/lib/pages/user/user-settings.d.ts.map +1 -1
  396. package/lib/pages/user/user-settings.js +18 -35
  397. package/lib/pages/user/user-settings.js.map +1 -1
  398. package/lib/server-request.d.ts +1 -1
  399. package/lib/server-request.d.ts.map +1 -1
  400. package/lib/server-request.js +5 -5
  401. package/lib/server-request.js.map +1 -1
  402. package/lib/utils.js.map +1 -1
  403. package/package.json +42 -37
  404. package/src/components/banner.tsx +1 -1
  405. package/src/components/button-with-progress.tsx +1 -1
  406. package/src/components/copy-to-clipboard.tsx +2 -1
  407. package/src/components/delayed-load-indicator.tsx +2 -2
  408. package/src/components/error-dialog.tsx +1 -1
  409. package/src/components/hover-popover.tsx +1 -1
  410. package/src/components/info-dialog.tsx +1 -1
  411. package/src/components/sanitized-markdown.tsx +1 -1
  412. package/src/components/scan-admin/common/auto-refresh.tsx +1 -1
  413. package/src/components/scan-admin/common/conditional-tooltip.tsx +3 -3
  414. package/src/components/scan-admin/common/file-table.tsx +1 -1
  415. package/src/components/scan-admin/common/tab-panel.tsx +1 -1
  416. package/src/components/scan-admin/dialogs/file-dialog.tsx +1 -1
  417. package/src/components/scan-admin/dialogs/quarantine-dialog.tsx +1 -1
  418. package/src/components/scan-admin/scan-card/scan-card-content.tsx +3 -3
  419. package/src/components/scan-admin/scan-card/scan-card-expand-strip-badges.tsx +2 -2
  420. package/src/components/scan-admin/scan-card/scan-card-expand-strip.tsx +2 -2
  421. package/src/components/scan-admin/scan-card/scan-card-expanded-content.tsx +2 -2
  422. package/src/components/scan-admin/scan-card/scan-card-header.tsx +2 -2
  423. package/src/components/scan-admin/scan-card/scan-card.tsx +3 -3
  424. package/src/components/scan-admin/scan-card/scan-detail-card.tsx +1 -1
  425. package/src/components/scan-admin/tab-contents/allow-list-tab-content.tsx +1 -1
  426. package/src/components/scan-admin/tab-contents/auto-rejected-tab-content.tsx +1 -1
  427. package/src/components/scan-admin/tab-contents/block-list-tab-content.tsx +1 -1
  428. package/src/components/scan-admin/tab-contents/quarantined-tab-content.tsx +1 -1
  429. package/src/components/scan-admin/tab-contents/scans-tab-content.tsx +1 -1
  430. package/src/components/scan-admin/toolbars/counts-toolbar.tsx +1 -1
  431. package/src/components/scan-admin/toolbars/search-toolbar.tsx +6 -6
  432. package/src/components/scan-admin/toolbars/tab-toolbar.tsx +1 -1
  433. package/src/components/sidepanel/navigation-item.tsx +1 -1
  434. package/src/components/sidepanel/sidepanel.tsx +1 -1
  435. package/src/components/text-divider.tsx +1 -1
  436. package/src/components/timestamp.tsx +1 -1
  437. package/src/context/scan-admin/scan-actions.ts +8 -7
  438. package/src/context/scan-admin/scan-api-actions.ts +5 -4
  439. package/src/context/scan-admin/scan-api-effects.ts +12 -11
  440. package/src/context/scan-admin/scan-context-types.ts +9 -9
  441. package/src/context/scan-admin/scan-context.tsx +2 -2
  442. package/src/default/about.tsx +1 -1
  443. package/src/default/default-app.tsx +1 -1
  444. package/src/default/login.tsx +2 -1
  445. package/src/default/menu-content.tsx +1 -1
  446. package/src/default/openvsx-registry-logo.tsx +1 -1
  447. package/src/default/page-settings.tsx +1 -1
  448. package/src/default/server.ts +1 -1
  449. package/src/extension-registry-service.ts +179 -1
  450. package/src/extension-registry-types.ts +66 -0
  451. package/src/header-menu.tsx +1 -1
  452. package/src/hooks/scan-admin/use-dialogs.ts +1 -1
  453. package/src/hooks/scan-admin/use-quarantined-tab.ts +2 -3
  454. package/src/hooks/scan-admin/use-scan-card-state.ts +3 -2
  455. package/src/hooks/scan-admin/use-url-sync.ts +1 -1
  456. package/src/main.tsx +1 -1
  457. package/src/not-found.tsx +1 -1
  458. package/src/other-pages.tsx +1 -1
  459. package/src/pages/admin-dashboard/admin-dashboard.tsx +51 -3
  460. package/src/pages/admin-dashboard/components/data-grid-filter-operators.tsx +127 -0
  461. package/src/pages/admin-dashboard/components/index.ts +18 -0
  462. package/src/pages/admin-dashboard/customers/customer-form-dialog.tsx +347 -0
  463. package/src/pages/admin-dashboard/customers/customers.tsx +278 -0
  464. package/src/pages/admin-dashboard/customers/delete-customer-dialog.tsx +93 -0
  465. package/src/pages/admin-dashboard/extension-admin.tsx +1 -1
  466. package/src/pages/admin-dashboard/extension-remove-dialog.tsx +1 -1
  467. package/src/pages/admin-dashboard/extension-version-container.tsx +1 -1
  468. package/src/pages/admin-dashboard/logs/logs.tsx +213 -0
  469. package/src/pages/admin-dashboard/namespace-admin.tsx +1 -1
  470. package/src/pages/admin-dashboard/namespace-change-dialog.tsx +1 -1
  471. package/src/pages/admin-dashboard/namespace-input.tsx +1 -1
  472. package/src/pages/admin-dashboard/publisher-admin.tsx +5 -5
  473. package/src/pages/admin-dashboard/publisher-details.tsx +1 -1
  474. package/src/pages/admin-dashboard/publisher-revoke-dialog.tsx +1 -1
  475. package/src/pages/admin-dashboard/publisher-revoke-tokens-button.tsx +1 -1
  476. package/src/pages/admin-dashboard/scan-admin.tsx +3 -2
  477. package/src/pages/admin-dashboard/search-list-container.tsx +1 -1
  478. package/src/pages/admin-dashboard/tiers/delete-tier-dialog.tsx +83 -0
  479. package/src/pages/admin-dashboard/tiers/tier-form-dialog.tsx +373 -0
  480. package/src/pages/admin-dashboard/tiers/tiers.tsx +254 -0
  481. package/src/pages/admin-dashboard/usage-stats/usage-stats-chart.tsx +189 -0
  482. package/src/pages/admin-dashboard/usage-stats/usage-stats-search.tsx +83 -0
  483. package/src/pages/admin-dashboard/usage-stats/usage-stats-utils.ts +16 -0
  484. package/src/pages/admin-dashboard/usage-stats/usage-stats.tsx +127 -0
  485. package/src/pages/admin-dashboard/welcome.tsx +5 -1
  486. package/src/pages/extension-detail/extension-detail-changes.tsx +1 -1
  487. package/src/pages/extension-detail/extension-detail-downloads-menu.tsx +1 -1
  488. package/src/pages/extension-detail/extension-detail-overview.tsx +17 -3
  489. package/src/pages/extension-detail/extension-detail-reviews.tsx +53 -41
  490. package/src/pages/extension-detail/extension-detail.tsx +0 -1
  491. package/src/pages/extension-detail/extension-rating-star-setter.tsx +1 -1
  492. package/src/pages/extension-detail/extension-rating-stars.tsx +2 -2
  493. package/src/pages/extension-detail/extension-review-dialog.tsx +1 -1
  494. package/src/pages/extension-list/extension-list-container.tsx +1 -1
  495. package/src/pages/extension-list/extension-list-header.tsx +1 -1
  496. package/src/pages/extension-list/extension-list-item.tsx +1 -1
  497. package/src/pages/extension-list/extension-list-searchfield.tsx +1 -1
  498. package/src/pages/extension-list/extension-list.tsx +2 -2
  499. package/src/pages/namespace-detail/namespace-detail.tsx +1 -1
  500. package/src/pages/user/add-namespace-member-dialog.tsx +1 -1
  501. package/src/pages/user/avatar.tsx +1 -1
  502. package/src/pages/user/create-namespace-dialog.tsx +1 -1
  503. package/src/pages/user/generate-token-dialog.tsx +1 -1
  504. package/src/pages/user/logout.tsx +1 -1
  505. package/src/pages/user/publish-extension-dialog.tsx +1 -1
  506. package/src/pages/user/user-extension-list.tsx +1 -1
  507. package/src/pages/user/user-namespace-details.tsx +1 -1
  508. package/src/pages/user/user-namespace-extension-list-item.tsx +2 -1
  509. package/src/pages/user/user-namespace-extension-list.tsx +1 -1
  510. package/src/pages/user/user-namespace-member-component.tsx +1 -1
  511. package/src/pages/user/user-namespace-member-list.tsx +1 -1
  512. package/src/pages/user/user-publisher-agreement.tsx +1 -1
  513. package/src/pages/user/user-setting-tabs.tsx +1 -1
  514. package/src/pages/user/user-settings-delete-extension.tsx +1 -1
  515. package/src/pages/user/user-settings-extensions.tsx +1 -1
  516. package/src/pages/user/user-settings-namespace-detail.tsx +1 -1
  517. package/src/pages/user/user-settings-namespaces.tsx +1 -1
  518. package/src/pages/user/user-settings-profile.tsx +1 -1
  519. package/src/pages/user/user-settings-tokens.tsx +2 -4
  520. package/src/pages/user/user-settings.tsx +1 -1
  521. package/src/server-request.ts +3 -3
  522. package/lib/default/server.d.ts +0 -11
  523. package/lib/default/server.d.ts.map +0 -1
  524. package/lib/default/server.js +0 -50
  525. package/lib/default/server.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import React, { FunctionComponent, useContext, useEffect, useState } from 'react';
1
+ import { FunctionComponent, useContext, useEffect, useState } from 'react';
2
2
  import { Routes, Route } from 'react-router-dom';
3
3
  import { AppBar, Box, Toolbar } from '@mui/material';
4
4
  import { styled, Theme } from '@mui/material/styles';
@@ -8,7 +8,7 @@
8
8
  * SPDX-License-Identifier: EPL-2.0
9
9
  ********************************************************************************/
10
10
 
11
- import React, { FunctionComponent, ReactNode, useContext, useState } from 'react';
11
+ import { FunctionComponent, ReactNode, useContext, useState } from 'react';
12
12
  import { Box, Container, CssBaseline, Typography, IconButton } from '@mui/material';
13
13
  import { createRoute } from '../../utils';
14
14
  import { Sidepanel } from '../../components/sidepanel/sidepanel';
@@ -23,8 +23,18 @@ import HighlightOffIcon from '@mui/icons-material/HighlightOff';
23
23
  import { Welcome } from './welcome';
24
24
  import { PublisherAdmin } from './publisher-admin';
25
25
  import PersonIcon from '@mui/icons-material/Person';
26
+ import PeopleIcon from '@mui/icons-material/People';
26
27
  import { ScanAdmin } from './scan-admin';
27
28
  import SecurityIcon from '@mui/icons-material/Security';
29
+ import StarIcon from '@mui/icons-material/Star';
30
+ import BarChartIcon from '@mui/icons-material/BarChart';
31
+ import HistoryIcon from '@mui/icons-material/History';
32
+ import { Tiers } from './tiers/tiers';
33
+ import { Customers } from './customers/customers';
34
+ import { UsageStatsView } from './usage-stats/usage-stats';
35
+ import { Logs } from './logs/logs';
36
+ import { LoginComponent } from "../../default/login";
37
+ import AccountBoxIcon from "@mui/icons-material/AccountBox";
28
38
 
29
39
  export namespace AdminDashboardRoutes {
30
40
  export const ROOT = 'admin-dashboard';
@@ -33,6 +43,10 @@ export namespace AdminDashboardRoutes {
33
43
  export const EXTENSION_ADMIN = createRoute([ROOT, 'extensions']);
34
44
  export const PUBLISHER_ADMIN = createRoute([ROOT, 'publisher']);
35
45
  export const SCANS_ADMIN = createRoute([ROOT, 'scans']);
46
+ export const TIERS = createRoute([ROOT, 'tiers']);
47
+ export const CUSTOMERS = createRoute([ROOT, 'customers']);
48
+ export const USAGE_STATS = createRoute([ROOT, 'usage']);
49
+ export const LOGS = createRoute([ROOT, 'logs']);
36
50
  }
37
51
 
38
52
  const Message: FunctionComponent<{message: string}> = ({ message }) => {
@@ -63,6 +77,10 @@ export const AdminDashboard: FunctionComponent<AdminDashboardProps> = props => {
63
77
  <NavigationItem onOpenRoute={handleOpenRoute} active={currentPage === AdminDashboardRoutes.EXTENSION_ADMIN} label='Extensions' icon={<ExtensionSharpIcon />} route={AdminDashboardRoutes.EXTENSION_ADMIN} />
64
78
  <NavigationItem onOpenRoute={handleOpenRoute} active={currentPage === AdminDashboardRoutes.PUBLISHER_ADMIN} label='Publishers' icon={<PersonIcon />} route={AdminDashboardRoutes.PUBLISHER_ADMIN} />
65
79
  <NavigationItem onOpenRoute={handleOpenRoute} active={currentPage === AdminDashboardRoutes.SCANS_ADMIN} label='Scans' icon={<SecurityIcon />} route={AdminDashboardRoutes.SCANS_ADMIN} />
80
+ <NavigationItem onOpenRoute={handleOpenRoute} active={currentPage === AdminDashboardRoutes.TIERS} label='Tiers' icon={<StarIcon />} route={AdminDashboardRoutes.TIERS} />
81
+ <NavigationItem onOpenRoute={handleOpenRoute} active={currentPage === AdminDashboardRoutes.CUSTOMERS} label='Customers' icon={<PeopleIcon />} route={AdminDashboardRoutes.CUSTOMERS} />
82
+ <NavigationItem onOpenRoute={handleOpenRoute} active={currentPage?.startsWith(AdminDashboardRoutes.USAGE_STATS)} label='Usage Stats' icon={<BarChartIcon />} route={AdminDashboardRoutes.USAGE_STATS} />
83
+ <NavigationItem onOpenRoute={handleOpenRoute} active={currentPage === AdminDashboardRoutes.LOGS} label='Logs' icon={<HistoryIcon />} route={AdminDashboardRoutes.LOGS} />
66
84
  </Sidepanel>
67
85
  <Box
68
86
  overflow='auto'
@@ -93,6 +111,11 @@ export const AdminDashboard: FunctionComponent<AdminDashboardProps> = props => {
93
111
  <Route path='/extensions' element={<ExtensionAdmin/>} />
94
112
  <Route path='/publisher' element={<PublisherAdmin/>} />
95
113
  <Route path='/scans' element={<ScanAdmin/>} />
114
+ <Route path='/tiers' element={<Tiers/>} />
115
+ <Route path='/customers' element={<Customers/>} />
116
+ <Route path='/usage' element={<UsageStatsView/>} />
117
+ <Route path='/usage/:customer' element={<UsageStatsView/>} />
118
+ <Route path='/logs' element={<Logs/>} />
96
119
  <Route path='*' element={<Welcome/>} />
97
120
  </Routes>
98
121
  </Container>
@@ -101,12 +124,37 @@ export const AdminDashboard: FunctionComponent<AdminDashboardProps> = props => {
101
124
  } else if (user) {
102
125
  content = <Message message='You are not authorized as administrator.'/>;
103
126
  } else if (!props.userLoading && loginProviders) {
104
- content = <Message message='You are not logged in.'/>;
127
+
128
+ content = <Box display='flex' alignItems='center'>
129
+ <Message message='You are not logged in.'/>
130
+ <Box height='fit-content' alignItems='center' display='flex'>
131
+ <LoginComponent
132
+ loginProviders={loginProviders}
133
+ renderButton={(href, onClick) => {
134
+ if (href) {
135
+ return (<IconButton
136
+ href={href}
137
+ title='Log In'
138
+ aria-label='Log In' >
139
+ <AccountBoxIcon />
140
+ </IconButton>);
141
+ } else {
142
+ return (<IconButton
143
+ onClick={onClick}
144
+ title='Log In'
145
+ aria-label='Log In' >
146
+ <AccountBoxIcon />
147
+ </IconButton>);
148
+ }
149
+ }}
150
+ />
151
+ </Box>
152
+ </Box>;
105
153
  }
106
154
 
107
155
  return <>
108
156
  <CssBaseline />
109
- <Box display='flex' height='100vh'>{content}</Box>
157
+ <Box display='flex' height='100vh' justifyContent='center'>{content}</Box>
110
158
  </>;
111
159
  };
112
160
 
@@ -0,0 +1,127 @@
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 type { SyntheticEvent } from "react";
15
+ import { FC } from 'react';
16
+ import { Autocomplete, TextField } from '@mui/material';
17
+ import { GridFilterOperator, GridFilterInputValueProps } from '@mui/x-data-grid';
18
+
19
+ /**
20
+ * Custom multi-select filter input component for DataGrid columns.
21
+ * Renders an Autocomplete with multiple selection support.
22
+ */
23
+ export const MultiSelectFilterInput: FC<GridFilterInputValueProps & { options: string[] }> = ({
24
+ item,
25
+ applyValue,
26
+ options
27
+ }) => {
28
+ const handleChange = (_event: SyntheticEvent, newValue: string[]) => {
29
+ applyValue({ ...item, value: newValue });
30
+ };
31
+
32
+ return (
33
+ <Autocomplete
34
+ multiple
35
+ size='small'
36
+ options={options}
37
+ value={(item.value as string[]) || []}
38
+ onChange={handleChange}
39
+ renderInput={(params) => (
40
+ <TextField {...params} variant='standard' placeholder='Filter...' />
41
+ )}
42
+ sx={{ minWidth: 150, mt: 'auto' }}
43
+ />
44
+ );
45
+ };
46
+
47
+ /**
48
+ * Creates filter operators for single-value columns with multi-select capability.
49
+ * Includes "is any of" and "is none of" operators.
50
+ *
51
+ * @param options - Array of possible values to select from
52
+ * @returns Array of GridFilterOperator for use in column definition
53
+ *
54
+ */
55
+ export const createMultiSelectFilterOperators = (options: string[]): GridFilterOperator[] => [
56
+ {
57
+ label: 'is any of',
58
+ value: 'isAnyOf',
59
+ getApplyFilterFn: (filterItem) => {
60
+ if (!filterItem.value || (filterItem.value as string[]).length === 0) {
61
+ return null;
62
+ }
63
+ const filterValues = filterItem.value as string[];
64
+
65
+ return (value) => filterValues.indexOf(value as string) !== -1;
66
+ },
67
+ InputComponent: (props: GridFilterInputValueProps) => (
68
+ <MultiSelectFilterInput {...props} options={options} />
69
+ ),
70
+ },
71
+ {
72
+ label: 'is none of',
73
+ value: 'isNoneOf',
74
+ getApplyFilterFn: (filterItem) => {
75
+ if (!filterItem.value || (filterItem.value as string[]).length === 0) {
76
+ return null;
77
+ }
78
+ const filterValues = filterItem.value as string[];
79
+
80
+ return (value) => filterValues.indexOf(value as string) === -1;
81
+ },
82
+ InputComponent: (props: GridFilterInputValueProps) => (
83
+ <MultiSelectFilterInput {...props} options={options} />
84
+ ),
85
+ },
86
+ ];
87
+
88
+ /**
89
+ * Creates filter operators for array-type columns with multi-select capability.
90
+ * Includes "contains any of" and "contains none of" operators.
91
+ *
92
+ * @param options - Array of possible values to select from
93
+ * @returns Array of GridFilterOperator for use in column definition
94
+ *
95
+ */
96
+ export const createArrayContainsFilterOperators = (options: string[]): GridFilterOperator[] => [
97
+ {
98
+ label: 'contains any of',
99
+ value: 'containsAnyOf',
100
+ getApplyFilterFn: (filterItem) => {
101
+ if (!filterItem.value || (filterItem.value as string[]).length === 0) {
102
+ return null;
103
+ }
104
+ const filterValues = filterItem.value as string[];
105
+
106
+ return (value) => filterValues.some(fv => (value as string[]).indexOf(fv) !== -1);
107
+ },
108
+ InputComponent: (props: GridFilterInputValueProps) => (
109
+ <MultiSelectFilterInput {...props} options={options} />
110
+ ),
111
+ },
112
+ {
113
+ label: 'contains none of',
114
+ value: 'containsNoneOf',
115
+ getApplyFilterFn: (filterItem) => {
116
+ if (!filterItem.value || (filterItem.value as string[]).length === 0) {
117
+ return null;
118
+ }
119
+ const filterValues = filterItem.value as string[];
120
+
121
+ return (value) => !filterValues.some(fv => (value as string[]).indexOf(fv) !== -1);
122
+ },
123
+ InputComponent: (props: GridFilterInputValueProps) => (
124
+ <MultiSelectFilterInput {...props} options={options} />
125
+ ),
126
+ },
127
+ ];
@@ -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 {
15
+ MultiSelectFilterInput,
16
+ createMultiSelectFilterOperators,
17
+ createArrayContainsFilterOperators
18
+ } from './data-grid-filter-operators';
@@ -0,0 +1,347 @@
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, { FC, useState, useEffect, useRef } from 'react';
15
+ import {
16
+ Dialog,
17
+ DialogTitle,
18
+ DialogContent,
19
+ DialogActions,
20
+ TextField,
21
+ Button,
22
+ FormControl,
23
+ InputLabel,
24
+ Select,
25
+ MenuItem,
26
+ CircularProgress,
27
+ Alert,
28
+ Box,
29
+ Autocomplete,
30
+ FormHelperText,
31
+ styled
32
+ } from '@mui/material';
33
+ import type { SelectChangeEvent } from '@mui/material';
34
+ import { type Customer, EnforcementState, type Tier } from "../../../extension-registry-types";
35
+ import { MainContext } from "../../../context";
36
+ import { handleError } from "../../../utils";
37
+
38
+ interface CustomerFormDialogProps {
39
+ open: boolean;
40
+ customer?: Customer;
41
+ onClose: () => void;
42
+ onSubmit: (formData: Customer) => Promise<void>;
43
+ }
44
+
45
+
46
+ const Code = styled('code')(({ theme }) => ({
47
+ fontFamily: 'source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace',
48
+ backgroundColor: theme.palette.action.hover, // Subtle gray background
49
+ padding: '2px 6px',
50
+ borderRadius: '4px',
51
+ fontSize: '0.9em',
52
+ color: theme.palette.text.primary,
53
+ }));
54
+
55
+ export const CustomerFormDialog: FC<CustomerFormDialogProps> = ({ open, customer, onClose, onSubmit }) => {
56
+ const abortController = useRef<AbortController>(new AbortController());
57
+ const { service } = React.useContext(MainContext);
58
+ const [formData, setFormData] = useState<Customer>({
59
+ name: '',
60
+ tier: undefined,
61
+ state: EnforcementState.ENFORCEMENT,
62
+ cidrBlocks: []
63
+ });
64
+ const [tiers, setTiers] = useState<Tier[]>([]);
65
+ const [loading, setLoading] = useState(false);
66
+ const [errors, setErrors] = useState<Record<string, string>>({});
67
+ const [touched, setTouched] = useState<Record<string, boolean>>({});
68
+
69
+ const loadTiers = async () => {
70
+ try {
71
+ const data = await service.admin.getTiers(abortController.current);
72
+ setTiers(data.tiers);
73
+ } catch (err: any) {
74
+ console.error('Failed to load tiers:', err);
75
+ }
76
+ };
77
+
78
+ useEffect(() => {
79
+ loadTiers();
80
+ return () => abortController.current.abort();
81
+ }, []);
82
+
83
+ useEffect(() => {
84
+ if (customer) {
85
+ setFormData({
86
+ name: customer.name,
87
+ tier: customer.tier,
88
+ state: customer.state,
89
+ cidrBlocks: customer.cidrBlocks
90
+ });
91
+ } else {
92
+ setFormData({
93
+ name: '',
94
+ tier: tiers.length > 0 ? tiers[0] : undefined,
95
+ state: EnforcementState.ENFORCEMENT,
96
+ cidrBlocks: []
97
+ });
98
+ }
99
+ setErrors({});
100
+ setTouched({});
101
+ }, [open, customer, tiers]);
102
+
103
+ const clearFieldError = (fieldName: string) => {
104
+ if (errors[fieldName]) {
105
+ setErrors(prev => {
106
+ const newErrors = { ...prev };
107
+ delete newErrors[fieldName];
108
+ return newErrors;
109
+ });
110
+ }
111
+ };
112
+
113
+ const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement> | SelectChangeEvent) => {
114
+ const { name, value } = e.target;
115
+ clearFieldError(name);
116
+
117
+ if (name === 'tierName') {
118
+ const tier = tiers.find((tier) => tier.name === value);
119
+ setFormData(prev => ({
120
+ ...prev,
121
+ tier: tier,
122
+ }));
123
+ } else {
124
+ setFormData(prev => ({ ...prev, [name]: value }));
125
+ }
126
+ };
127
+
128
+ const handleBlur = (e: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {
129
+ const { name } = e.target;
130
+ setTouched(prev => ({ ...prev, [name]: true }));
131
+
132
+ // Validate the specific field on blur
133
+ validateField(name);
134
+ };
135
+
136
+ const fieldValidators: Record<string, () => string | undefined> = {
137
+ name: () => {
138
+ if (formData.name === undefined) {
139
+ return "Customer name is required";
140
+ } else if (formData.name.trim() !== formData.name) {
141
+ return "Customer name must not contain trailing whitespace";
142
+ } else {
143
+ return undefined;
144
+ }
145
+ },
146
+ tierName: () => formData.tier?.name ? undefined : 'Tier selection is required',
147
+ state: () => formData.state ? undefined : 'State is required',
148
+ cidrBlocks: () => {
149
+ if (formData.cidrBlocks && formData.cidrBlocks.length > 0) {
150
+ const invalidEntries = formData.cidrBlocks.filter(cidr => !isValidCIDR(cidr.trim()));
151
+ if (invalidEntries.length > 0) {
152
+ return `Invalid CIDR block(s): ${invalidEntries.join(', ')}`;
153
+ }
154
+ }
155
+ return undefined;
156
+ },
157
+ };
158
+
159
+ const validateField = (fieldName: string): string | undefined => {
160
+ const validator = fieldValidators[fieldName];
161
+ const error = validator?.();
162
+
163
+ if (error) {
164
+ setErrors(prev => ({ ...prev, [fieldName]: error }));
165
+ }
166
+ return error;
167
+ };
168
+
169
+ const isValidCIDR = (cidr: string): boolean => {
170
+ const ipv4Regex = /^(\d{1,3}\.){3}\d{1,3}(\/\d{1,2})?$/;
171
+ const ipv6Regex = /^([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}(\/\d{1,3})?$/;
172
+ return ipv4Regex.test(cidr) || ipv6Regex.test(cidr);
173
+ };
174
+
175
+ const handleCidrBlocksChange = (event: any, value: string[]) => {
176
+ clearFieldError('cidrBlocks');
177
+
178
+ // Validate all entries
179
+ const invalidEntries = value.filter(cidr => !isValidCIDR(cidr.trim()));
180
+
181
+ if (invalidEntries.length > 0) {
182
+ setTouched(prev => ({ ...prev, cidrBlocks: true }));
183
+ setErrors(prev => ({
184
+ ...prev,
185
+ cidrBlocks: `Invalid CIDR block(s): ${invalidEntries.join(', ')}. Please enter valid IPv4 or IPv6 CIDR notation.`
186
+ }));
187
+ }
188
+
189
+ // Always update the value so the user can see and correct invalid entries
190
+ setFormData(prev => ({
191
+ ...prev,
192
+ cidrBlocks: value.map(cidr => cidr.trim()),
193
+ }));
194
+ };
195
+
196
+ const validateForm = (): boolean => {
197
+ // Mark all fields as touched on submit
198
+ setTouched({
199
+ name: true,
200
+ tierName: true,
201
+ state: true,
202
+ cidrBlocks: true,
203
+ });
204
+
205
+ const newErrors: Record<string, string> = {};
206
+ for (const key of Object.keys(formData)) {
207
+ const error = validateField(key);
208
+ if (error !== undefined) {
209
+ newErrors[key] = error;
210
+ }
211
+ }
212
+
213
+ setErrors(newErrors);
214
+ return Object.keys(newErrors).length === 0;
215
+ };
216
+
217
+ const handleSubmit = async () => {
218
+ if (!validateForm()) {
219
+ return;
220
+ }
221
+
222
+ setLoading(true);
223
+
224
+ try {
225
+ await onSubmit(formData);
226
+ onClose();
227
+ } catch (err: any) {
228
+ setErrors({ submit: handleError(err) });
229
+ } finally {
230
+ setLoading(false);
231
+ }
232
+ };
233
+
234
+ const isEditMode = !!customer;
235
+ const title = isEditMode ? 'Edit Customer' : 'Create New Customer';
236
+
237
+ return (
238
+ <Dialog open={open} onClose={onClose} maxWidth='sm' fullWidth>
239
+ <DialogTitle>{title}</DialogTitle>
240
+ <DialogContent>
241
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2, pt: 2 }}>
242
+ {errors.submit && (
243
+ <Alert severity='error'>{errors.submit}</Alert>
244
+ )}
245
+
246
+ <TextField
247
+ label='Customer Name'
248
+ name='name'
249
+ value={formData.name}
250
+ onChange={handleChange}
251
+ onBlur={handleBlur}
252
+ fullWidth
253
+ placeholder='e.g., Acme Corp, TechStart Inc'
254
+ required={true}
255
+ disabled={loading}
256
+ error={touched.name && !!errors.name}
257
+ helperText={touched.name && errors.name}
258
+ />
259
+
260
+ <FormControl fullWidth disabled={loading} required={true} error={touched.tierName && !!errors.tierName}>
261
+ <InputLabel>Tier</InputLabel>
262
+ <Select
263
+ name='tierName'
264
+ value={formData.tier?.name ?? ''}
265
+ onChange={handleChange}
266
+ onBlur={(e) => {
267
+ setTouched(prev => ({ ...prev, tierName: true }));
268
+ validateField('tierName');
269
+ }}
270
+ label='Tier'
271
+ >
272
+ {tiers
273
+ .filter(tier => tier.tierType === 'NON_FREE')
274
+ .map(tier => (
275
+ <MenuItem key={tier.name} value={tier.name}>
276
+ {tier.name}
277
+ </MenuItem>
278
+ ))}
279
+ </Select>
280
+ {touched.tierName && errors.tierName && <FormHelperText>{errors.tierName}</FormHelperText>}
281
+ </FormControl>
282
+
283
+ <FormControl fullWidth disabled={loading} required={true} error={touched.state && !!errors.state}>
284
+ <InputLabel>State</InputLabel>
285
+ <Select
286
+ name='state'
287
+ value={formData.state}
288
+ onChange={handleChange}
289
+ onBlur={(e) => {
290
+ setTouched(prev => ({ ...prev, state: true }));
291
+ validateField('state');
292
+ }}
293
+ label='State'
294
+ >
295
+ {Object.keys(EnforcementState).map(key => (
296
+ <MenuItem key={key} value={EnforcementState[key as keyof typeof EnforcementState]}>
297
+ {key}
298
+ </MenuItem>
299
+ ))}
300
+ </Select>
301
+ {touched.state && errors.state && <FormHelperText>{errors.state}</FormHelperText>}
302
+ </FormControl>
303
+
304
+ <Autocomplete
305
+ multiple
306
+ freeSolo
307
+ limitTags={5}
308
+ disabled={loading}
309
+ options={[]}
310
+ value={formData.cidrBlocks || []}
311
+ onChange={handleCidrBlocksChange}
312
+ onBlur={() => {
313
+ setTouched(prev => ({ ...prev, cidrBlocks: true }));
314
+ validateField('cidrBlocks');
315
+ }}
316
+ renderInput={(params) => (
317
+ <TextField
318
+ {...params}
319
+ label='CIDR Blocks'
320
+ placeholder='e.g., 192.168.1.0/24'
321
+ error={touched.cidrBlocks && !!errors.cidrBlocks}
322
+ helperText={(touched.cidrBlocks && errors.cidrBlocks) || (
323
+ <>Enter CIDR blocks and press <Code>Enter</Code> to add each one</>
324
+ )}
325
+ />
326
+ )}
327
+ />
328
+
329
+ </Box>
330
+ </DialogContent>
331
+
332
+ <DialogActions sx={{ p: 2 }}>
333
+ <Button onClick={onClose} disabled={loading}>
334
+ Cancel
335
+ </Button>
336
+ <Button
337
+ onClick={handleSubmit}
338
+ variant='contained'
339
+ disabled={loading || Object.keys(errors).length > 0}
340
+ startIcon={loading ? <CircularProgress size={20} /> : undefined}
341
+ >
342
+ {isEditMode ? 'Update' : 'Create'}
343
+ </Button>
344
+ </DialogActions>
345
+ </Dialog>
346
+ );
347
+ };