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,28 @@
1
+ import { FC } from 'react';
2
+ import { GridFilterOperator, GridFilterInputValueProps } from '@mui/x-data-grid';
3
+ /**
4
+ * Custom multi-select filter input component for DataGrid columns.
5
+ * Renders an Autocomplete with multiple selection support.
6
+ */
7
+ export declare const MultiSelectFilterInput: FC<GridFilterInputValueProps & {
8
+ options: string[];
9
+ }>;
10
+ /**
11
+ * Creates filter operators for single-value columns with multi-select capability.
12
+ * Includes "is any of" and "is none of" operators.
13
+ *
14
+ * @param options - Array of possible values to select from
15
+ * @returns Array of GridFilterOperator for use in column definition
16
+ *
17
+ */
18
+ export declare const createMultiSelectFilterOperators: (options: string[]) => GridFilterOperator[];
19
+ /**
20
+ * Creates filter operators for array-type columns with multi-select capability.
21
+ * Includes "contains any of" and "contains none of" operators.
22
+ *
23
+ * @param options - Array of possible values to select from
24
+ * @returns Array of GridFilterOperator for use in column definition
25
+ *
26
+ */
27
+ export declare const createArrayContainsFilterOperators: (options: string[]) => GridFilterOperator[];
28
+ //# sourceMappingURL=data-grid-filter-operators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-grid-filter-operators.d.ts","sourceRoot":"","sources":["../../../../src/pages/admin-dashboard/components/data-grid-filter-operators.tsx"],"names":[],"mappings":"AAaA,OAAc,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAElC,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAEjF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,EAAE,CAAC,yBAAyB,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAsBxF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,gCAAgC,YAAa,MAAM,EAAE,KAAG,kBAAkB,EA+BtF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,kCAAkC,YAAa,MAAM,EAAE,KAAG,kBAAkB,EA+BxF,CAAC"}
@@ -0,0 +1,93 @@
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
+ import React from 'react';
14
+ import { Autocomplete, TextField } from '@mui/material';
15
+ /**
16
+ * Custom multi-select filter input component for DataGrid columns.
17
+ * Renders an Autocomplete with multiple selection support.
18
+ */
19
+ export const MultiSelectFilterInput = ({ item, applyValue, options }) => {
20
+ const handleChange = (_event, newValue) => {
21
+ applyValue(Object.assign(Object.assign({}, item), { value: newValue }));
22
+ };
23
+ return (React.createElement(Autocomplete, { multiple: true, size: 'small', options: options, value: item.value || [], onChange: handleChange, renderInput: (params) => (React.createElement(TextField, Object.assign({}, params, { variant: 'standard', placeholder: 'Filter...' }))), sx: { minWidth: 150, mt: 'auto' } }));
24
+ };
25
+ /**
26
+ * Creates filter operators for single-value columns with multi-select capability.
27
+ * Includes "is any of" and "is none of" operators.
28
+ *
29
+ * @param options - Array of possible values to select from
30
+ * @returns Array of GridFilterOperator for use in column definition
31
+ *
32
+ */
33
+ export const createMultiSelectFilterOperators = (options) => [
34
+ {
35
+ label: 'is any of',
36
+ value: 'isAnyOf',
37
+ getApplyFilterFn: (filterItem) => {
38
+ if (!filterItem.value || filterItem.value.length === 0) {
39
+ return null;
40
+ }
41
+ const filterValues = filterItem.value;
42
+ return (value) => filterValues.indexOf(value) !== -1;
43
+ },
44
+ InputComponent: (props) => (React.createElement(MultiSelectFilterInput, Object.assign({}, props, { options: options }))),
45
+ },
46
+ {
47
+ label: 'is none of',
48
+ value: 'isNoneOf',
49
+ getApplyFilterFn: (filterItem) => {
50
+ if (!filterItem.value || filterItem.value.length === 0) {
51
+ return null;
52
+ }
53
+ const filterValues = filterItem.value;
54
+ return (value) => filterValues.indexOf(value) === -1;
55
+ },
56
+ InputComponent: (props) => (React.createElement(MultiSelectFilterInput, Object.assign({}, props, { options: options }))),
57
+ },
58
+ ];
59
+ /**
60
+ * Creates filter operators for array-type columns with multi-select capability.
61
+ * Includes "contains any of" and "contains none of" operators.
62
+ *
63
+ * @param options - Array of possible values to select from
64
+ * @returns Array of GridFilterOperator for use in column definition
65
+ *
66
+ */
67
+ export const createArrayContainsFilterOperators = (options) => [
68
+ {
69
+ label: 'contains any of',
70
+ value: 'containsAnyOf',
71
+ getApplyFilterFn: (filterItem) => {
72
+ if (!filterItem.value || filterItem.value.length === 0) {
73
+ return null;
74
+ }
75
+ const filterValues = filterItem.value;
76
+ return (value) => filterValues.some(fv => value.indexOf(fv) !== -1);
77
+ },
78
+ InputComponent: (props) => (React.createElement(MultiSelectFilterInput, Object.assign({}, props, { options: options }))),
79
+ },
80
+ {
81
+ label: 'contains none of',
82
+ value: 'containsNoneOf',
83
+ getApplyFilterFn: (filterItem) => {
84
+ if (!filterItem.value || filterItem.value.length === 0) {
85
+ return null;
86
+ }
87
+ const filterValues = filterItem.value;
88
+ return (value) => !filterValues.some(fv => value.indexOf(fv) !== -1);
89
+ },
90
+ InputComponent: (props) => (React.createElement(MultiSelectFilterInput, Object.assign({}, props, { options: options }))),
91
+ },
92
+ ];
93
+ //# sourceMappingURL=data-grid-filter-operators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-grid-filter-operators.js","sourceRoot":"","sources":["../../../../src/pages/admin-dashboard/components/data-grid-filter-operators.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { MultiSelectFilterInput, createMultiSelectFilterOperators, createArrayContainsFilterOperators } from './data-grid-filter-operators';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/pages/admin-dashboard/components/index.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,sBAAsB,EACtB,gCAAgC,EAChC,kCAAkC,EACnC,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,14 @@
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
+ export { MultiSelectFilterInput, createMultiSelectFilterOperators, createArrayContainsFilterOperators } from './data-grid-filter-operators';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/pages/admin-dashboard/components/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,sBAAsB,EACtB,gCAAgC,EAChC,kCAAkC,EACnC,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,23 @@
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
+ import { FC } from 'react';
14
+ import { type Customer } from "../../../extension-registry-types";
15
+ interface CustomerFormDialogProps {
16
+ open: boolean;
17
+ customer?: Customer;
18
+ onClose: () => void;
19
+ onSubmit: (formData: Customer) => Promise<void>;
20
+ }
21
+ export declare const CustomerFormDialog: FC<CustomerFormDialogProps>;
22
+ export {};
23
+ //# sourceMappingURL=customer-form-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customer-form-dialog.d.ts","sourceRoot":"","sources":["../../../../src/pages/admin-dashboard/customers/customer-form-dialog.tsx"],"names":[],"mappings":"AACA;;;;;;;;;;;+EAW+E;AAE/E,OAAc,EAAE,EAAE,EAA+B,MAAM,OAAO,CAAC;AAoB/D,OAAO,EAAE,KAAK,QAAQ,EAA+B,MAAM,mCAAmC,CAAC;AAI/F,UAAU,uBAAuB;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAYD,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,uBAAuB,CAoS1D,CAAC"}
@@ -0,0 +1,225 @@
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
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ import React, { useState, useEffect, useRef } from 'react';
23
+ import { Dialog, DialogTitle, DialogContent, DialogActions, TextField, Button, FormControl, InputLabel, Select, MenuItem, CircularProgress, Alert, Box, Autocomplete, FormHelperText, styled } from '@mui/material';
24
+ import { EnforcementState } from "../../../extension-registry-types";
25
+ import { MainContext } from "../../../context";
26
+ import { handleError } from "../../../utils";
27
+ const Code = styled('code')(({ theme }) => ({
28
+ fontFamily: 'source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace',
29
+ backgroundColor: theme.palette.action.hover,
30
+ padding: '2px 6px',
31
+ borderRadius: '4px',
32
+ fontSize: '0.9em',
33
+ color: theme.palette.text.primary,
34
+ }));
35
+ export const CustomerFormDialog = ({ open, customer, onClose, onSubmit }) => {
36
+ var _a, _b;
37
+ const abortController = useRef(new AbortController());
38
+ const { service } = React.useContext(MainContext);
39
+ const [formData, setFormData] = useState({
40
+ name: '',
41
+ tier: undefined,
42
+ state: EnforcementState.ENFORCEMENT,
43
+ cidrBlocks: []
44
+ });
45
+ const [tiers, setTiers] = useState([]);
46
+ const [loading, setLoading] = useState(false);
47
+ const [errors, setErrors] = useState({});
48
+ const [touched, setTouched] = useState({});
49
+ const loadTiers = () => __awaiter(void 0, void 0, void 0, function* () {
50
+ try {
51
+ const data = yield service.admin.getTiers(abortController.current);
52
+ setTiers(data.tiers);
53
+ }
54
+ catch (err) {
55
+ console.error('Failed to load tiers:', err);
56
+ }
57
+ });
58
+ useEffect(() => {
59
+ loadTiers();
60
+ return () => abortController.current.abort();
61
+ }, []);
62
+ useEffect(() => {
63
+ if (customer) {
64
+ setFormData({
65
+ name: customer.name,
66
+ tier: customer.tier,
67
+ state: customer.state,
68
+ cidrBlocks: customer.cidrBlocks
69
+ });
70
+ }
71
+ else {
72
+ setFormData({
73
+ name: '',
74
+ tier: tiers.length > 0 ? tiers[0] : undefined,
75
+ state: EnforcementState.ENFORCEMENT,
76
+ cidrBlocks: []
77
+ });
78
+ }
79
+ setErrors({});
80
+ setTouched({});
81
+ }, [open, customer, tiers]);
82
+ const clearFieldError = (fieldName) => {
83
+ if (errors[fieldName]) {
84
+ setErrors(prev => {
85
+ const newErrors = Object.assign({}, prev);
86
+ delete newErrors[fieldName];
87
+ return newErrors;
88
+ });
89
+ }
90
+ };
91
+ const handleChange = (e) => {
92
+ const { name, value } = e.target;
93
+ clearFieldError(name);
94
+ if (name === 'tierName') {
95
+ const tier = tiers.find((tier) => tier.name === value);
96
+ setFormData(prev => (Object.assign(Object.assign({}, prev), { tier: tier })));
97
+ }
98
+ else {
99
+ setFormData(prev => (Object.assign(Object.assign({}, prev), { [name]: value })));
100
+ }
101
+ };
102
+ const handleBlur = (e) => {
103
+ const { name } = e.target;
104
+ setTouched(prev => (Object.assign(Object.assign({}, prev), { [name]: true })));
105
+ // Validate the specific field on blur
106
+ validateField(name);
107
+ };
108
+ const fieldValidators = {
109
+ name: () => {
110
+ if (formData.name === undefined) {
111
+ return "Customer name is required";
112
+ }
113
+ else if (formData.name.trim() !== formData.name) {
114
+ return "Customer name must not contain trailing whitespace";
115
+ }
116
+ else {
117
+ return undefined;
118
+ }
119
+ },
120
+ tierName: () => { var _a; return ((_a = formData.tier) === null || _a === void 0 ? void 0 : _a.name) ? undefined : 'Tier selection is required'; },
121
+ state: () => formData.state ? undefined : 'State is required',
122
+ cidrBlocks: () => {
123
+ if (formData.cidrBlocks && formData.cidrBlocks.length > 0) {
124
+ const invalidEntries = formData.cidrBlocks.filter(cidr => !isValidCIDR(cidr.trim()));
125
+ if (invalidEntries.length > 0) {
126
+ return `Invalid CIDR block(s): ${invalidEntries.join(', ')}`;
127
+ }
128
+ }
129
+ return undefined;
130
+ },
131
+ };
132
+ const validateField = (fieldName) => {
133
+ const validator = fieldValidators[fieldName];
134
+ const error = validator === null || validator === void 0 ? void 0 : validator();
135
+ if (error) {
136
+ setErrors(prev => (Object.assign(Object.assign({}, prev), { [fieldName]: error })));
137
+ }
138
+ return error;
139
+ };
140
+ const isValidCIDR = (cidr) => {
141
+ const ipv4Regex = /^(\d{1,3}\.){3}\d{1,3}(\/\d{1,2})?$/;
142
+ const ipv6Regex = /^([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}(\/\d{1,3})?$/;
143
+ return ipv4Regex.test(cidr) || ipv6Regex.test(cidr);
144
+ };
145
+ const handleCidrBlocksChange = (event, value) => {
146
+ clearFieldError('cidrBlocks');
147
+ // Validate all entries
148
+ const invalidEntries = value.filter(cidr => !isValidCIDR(cidr.trim()));
149
+ if (invalidEntries.length > 0) {
150
+ setTouched(prev => (Object.assign(Object.assign({}, prev), { cidrBlocks: true })));
151
+ setErrors(prev => (Object.assign(Object.assign({}, prev), { cidrBlocks: `Invalid CIDR block(s): ${invalidEntries.join(', ')}. Please enter valid IPv4 or IPv6 CIDR notation.` })));
152
+ }
153
+ // Always update the value so the user can see and correct invalid entries
154
+ setFormData(prev => (Object.assign(Object.assign({}, prev), { cidrBlocks: value.map(cidr => cidr.trim()) })));
155
+ };
156
+ const validateForm = () => {
157
+ // Mark all fields as touched on submit
158
+ setTouched({
159
+ name: true,
160
+ tierName: true,
161
+ state: true,
162
+ cidrBlocks: true,
163
+ });
164
+ const newErrors = {};
165
+ for (const key of Object.keys(formData)) {
166
+ const error = validateField(key);
167
+ if (error !== undefined) {
168
+ newErrors[key] = error;
169
+ }
170
+ }
171
+ setErrors(newErrors);
172
+ return Object.keys(newErrors).length === 0;
173
+ };
174
+ const handleSubmit = () => __awaiter(void 0, void 0, void 0, function* () {
175
+ if (!validateForm()) {
176
+ return;
177
+ }
178
+ setLoading(true);
179
+ try {
180
+ yield onSubmit(formData);
181
+ onClose();
182
+ }
183
+ catch (err) {
184
+ setErrors({ submit: handleError(err) });
185
+ }
186
+ finally {
187
+ setLoading(false);
188
+ }
189
+ });
190
+ const isEditMode = !!customer;
191
+ const title = isEditMode ? 'Edit Customer' : 'Create New Customer';
192
+ return (React.createElement(Dialog, { open: open, onClose: onClose, maxWidth: 'sm', fullWidth: true },
193
+ React.createElement(DialogTitle, null, title),
194
+ React.createElement(DialogContent, null,
195
+ React.createElement(Box, { sx: { display: 'flex', flexDirection: 'column', gap: 2, pt: 2 } },
196
+ errors.submit && (React.createElement(Alert, { severity: 'error' }, errors.submit)),
197
+ React.createElement(TextField, { label: 'Customer Name', name: 'name', value: formData.name, onChange: handleChange, onBlur: handleBlur, fullWidth: true, placeholder: 'e.g., Acme Corp, TechStart Inc', required: true, disabled: loading, error: touched.name && !!errors.name, helperText: touched.name && errors.name }),
198
+ React.createElement(FormControl, { fullWidth: true, disabled: loading, required: true, error: touched.tierName && !!errors.tierName },
199
+ React.createElement(InputLabel, null, "Tier"),
200
+ React.createElement(Select, { name: 'tierName', value: (_b = (_a = formData.tier) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : '', onChange: handleChange, onBlur: (e) => {
201
+ setTouched(prev => (Object.assign(Object.assign({}, prev), { tierName: true })));
202
+ validateField('tierName');
203
+ }, label: 'Tier' }, tiers
204
+ .filter(tier => tier.tierType === 'NON_FREE')
205
+ .map(tier => (React.createElement(MenuItem, { key: tier.name, value: tier.name }, tier.name)))),
206
+ touched.tierName && errors.tierName && React.createElement(FormHelperText, null, errors.tierName)),
207
+ React.createElement(FormControl, { fullWidth: true, disabled: loading, required: true, error: touched.state && !!errors.state },
208
+ React.createElement(InputLabel, null, "State"),
209
+ React.createElement(Select, { name: 'state', value: formData.state, onChange: handleChange, onBlur: (e) => {
210
+ setTouched(prev => (Object.assign(Object.assign({}, prev), { state: true })));
211
+ validateField('state');
212
+ }, label: 'State' }, Object.keys(EnforcementState).map(key => (React.createElement(MenuItem, { key: key, value: EnforcementState[key] }, key)))),
213
+ touched.state && errors.state && React.createElement(FormHelperText, null, errors.state)),
214
+ React.createElement(Autocomplete, { multiple: true, freeSolo: true, limitTags: 5, disabled: loading, options: [], value: formData.cidrBlocks || [], onChange: handleCidrBlocksChange, onBlur: () => {
215
+ setTouched(prev => (Object.assign(Object.assign({}, prev), { cidrBlocks: true })));
216
+ validateField('cidrBlocks');
217
+ }, renderInput: (params) => (React.createElement(TextField, Object.assign({}, params, { label: 'CIDR Blocks', placeholder: 'e.g., 192.168.1.0/24', error: touched.cidrBlocks && !!errors.cidrBlocks, helperText: (touched.cidrBlocks && errors.cidrBlocks) || (React.createElement(React.Fragment, null,
218
+ "Enter CIDR blocks and press ",
219
+ React.createElement(Code, null, "Enter"),
220
+ " to add each one")) }))) }))),
221
+ React.createElement(DialogActions, { sx: { p: 2 } },
222
+ React.createElement(Button, { onClick: onClose, disabled: loading }, "Cancel"),
223
+ React.createElement(Button, { onClick: handleSubmit, variant: 'contained', disabled: loading || Object.keys(errors).length > 0, startIcon: loading ? React.createElement(CircularProgress, { size: 20 }) : undefined }, isEditMode ? 'Update' : 'Create'))));
224
+ };
225
+ //# sourceMappingURL=customer-form-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customer-form-dialog.js","sourceRoot":"","sources":["../../../../src/pages/admin-dashboard/customers/customer-form-dialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
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
+ import { FC } from "react";
14
+ export declare const Customers: FC;
15
+ //# sourceMappingURL=customers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customers.d.ts","sourceRoot":"","sources":["../../../../src/pages/admin-dashboard/customers/customers.tsx"],"names":[],"mappings":"AACA;;;;;;;;;;;+EAW+E;AAE/E,OAAc,EAAE,EAAE,EAAqD,MAAM,OAAO,CAAC;AA0BrF,eAAO,MAAM,SAAS,EAAE,EA8OvB,CAAC"}
@@ -0,0 +1,175 @@
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
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ import React, { useState, useEffect, useRef, useCallback, useMemo } from "react";
23
+ import { Box, Button, Paper, Typography, CircularProgress, Alert, IconButton, Stack, Chip } from "@mui/material";
24
+ import { DataGrid } from "@mui/x-data-grid";
25
+ import EditIcon from "@mui/icons-material/Edit";
26
+ import DeleteIcon from "@mui/icons-material/Delete";
27
+ import AddIcon from "@mui/icons-material/Add";
28
+ import BarChartIcon from "@mui/icons-material/BarChart";
29
+ import { MainContext } from "../../../context";
30
+ import { CustomerFormDialog } from "./customer-form-dialog";
31
+ import { DeleteCustomerDialog } from "./delete-customer-dialog";
32
+ import { handleError } from "../../../utils";
33
+ import { createMultiSelectFilterOperators, createArrayContainsFilterOperators } from "../components";
34
+ import { AdminDashboardRoutes } from "../admin-dashboard";
35
+ import { Link } from "react-router-dom";
36
+ export const Customers = () => {
37
+ const abortController = useRef(new AbortController());
38
+ const { service } = React.useContext(MainContext);
39
+ const [customers, setCustomers] = useState([]);
40
+ const [loading, setLoading] = useState(true);
41
+ const [error, setError] = useState(null);
42
+ const [formDialogOpen, setFormDialogOpen] = useState(false);
43
+ const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
44
+ const [selectedCustomer, setSelectedCustomer] = useState();
45
+ // Load all customers
46
+ const loadCustomers = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
47
+ try {
48
+ setLoading(true);
49
+ setError(null);
50
+ const data = yield service.admin.getCustomers(abortController.current);
51
+ setCustomers(data.customers);
52
+ }
53
+ catch (err) {
54
+ setError(handleError(err));
55
+ }
56
+ finally {
57
+ setLoading(false);
58
+ }
59
+ }), [service]);
60
+ useEffect(() => {
61
+ loadCustomers();
62
+ return () => abortController.current.abort();
63
+ }, []);
64
+ const handleCreateClick = () => {
65
+ setSelectedCustomer(undefined);
66
+ setFormDialogOpen(true);
67
+ };
68
+ const handleEditClick = (customer) => {
69
+ setSelectedCustomer(customer);
70
+ setFormDialogOpen(true);
71
+ };
72
+ const handleDeleteClick = (customer) => {
73
+ setSelectedCustomer(customer);
74
+ setDeleteDialogOpen(true);
75
+ };
76
+ const handleFormSubmit = (customer) => __awaiter(void 0, void 0, void 0, function* () {
77
+ if (selectedCustomer) {
78
+ // update existing customer
79
+ yield service.admin.updateCustomer(abortController.current, selectedCustomer.name, customer);
80
+ }
81
+ else {
82
+ // create new customer
83
+ yield service.admin.createCustomer(abortController.current, customer);
84
+ }
85
+ yield loadCustomers();
86
+ });
87
+ const handleDeleteConfirm = () => __awaiter(void 0, void 0, void 0, function* () {
88
+ if (selectedCustomer) {
89
+ yield service.admin.deleteCustomer(abortController.current, selectedCustomer.name);
90
+ yield loadCustomers();
91
+ }
92
+ });
93
+ const handleFormDialogClose = () => {
94
+ setFormDialogOpen(false);
95
+ setSelectedCustomer(undefined);
96
+ };
97
+ const handleDeleteDialogClose = () => {
98
+ setDeleteDialogOpen(false);
99
+ setSelectedCustomer(undefined);
100
+ };
101
+ // Extract unique values for filter dropdowns
102
+ const tierOptions = useMemo(() => [...new Set(customers.map(c => { var _a; return (_a = c.tier) === null || _a === void 0 ? void 0 : _a.name; }).filter(Boolean))], [customers]);
103
+ const stateOptions = useMemo(() => [...new Set(customers.map(c => c.state).filter(Boolean))], [customers]);
104
+ const cidrBlockOptions = useMemo(() => {
105
+ const allCidrs = customers.reduce((acc, c) => acc.concat(c.cidrBlocks), []);
106
+ return [...new Set(allCidrs)];
107
+ }, [customers]);
108
+ const columns = [
109
+ { field: 'name', headerName: 'Name', flex: 1, minWidth: 150 },
110
+ {
111
+ field: 'tier',
112
+ headerName: 'Tier',
113
+ flex: 1,
114
+ minWidth: 120,
115
+ valueGetter: (value) => (value === null || value === void 0 ? void 0 : value.name) || '',
116
+ filterOperators: createMultiSelectFilterOperators(tierOptions)
117
+ },
118
+ {
119
+ field: 'state',
120
+ headerName: 'State',
121
+ flex: 1,
122
+ minWidth: 100,
123
+ filterOperators: createMultiSelectFilterOperators(stateOptions)
124
+ },
125
+ {
126
+ field: 'cidrBlocks',
127
+ headerName: 'CIDR Blocks',
128
+ flex: 2,
129
+ minWidth: 200,
130
+ sortable: false,
131
+ filterOperators: createArrayContainsFilterOperators(cidrBlockOptions),
132
+ renderCell: (params) => {
133
+ const cidrBlocks = params.row.cidrBlocks;
134
+ const maxVisible = 2;
135
+ const visibleCidrs = cidrBlocks.slice(0, maxVisible);
136
+ const remainingCount = cidrBlocks.length - maxVisible;
137
+ return (React.createElement(Stack, { direction: 'row', spacing: 0.5, alignItems: 'center', height: '100%', sx: { py: 0.5 } },
138
+ visibleCidrs.map((cidr) => (React.createElement(Chip, { key: cidr, label: cidr, size: 'small', variant: 'filled' }))),
139
+ remainingCount > 0 && (React.createElement(Chip, { label: `+${remainingCount}`, size: 'small', variant: 'outlined', title: cidrBlocks.slice(maxVisible).join(', ') }))));
140
+ }
141
+ },
142
+ {
143
+ field: 'actions',
144
+ headerName: 'Actions',
145
+ width: 160,
146
+ sortable: false,
147
+ filterable: false,
148
+ renderCell: (params) => (React.createElement(React.Fragment, null,
149
+ React.createElement(IconButton, { size: 'small', component: Link, to: `${AdminDashboardRoutes.USAGE_STATS}/${params.row.name}`, title: 'View Usage Stats' },
150
+ React.createElement(BarChartIcon, null)),
151
+ React.createElement(IconButton, { size: 'small', onClick: () => handleEditClick(params.row), title: 'Edit' },
152
+ React.createElement(EditIcon, null)),
153
+ React.createElement(IconButton, { size: 'small', onClick: () => handleDeleteClick(params.row), title: 'Delete', color: 'error' },
154
+ React.createElement(DeleteIcon, null))))
155
+ }
156
+ ];
157
+ return (React.createElement(Box, { sx: { p: 3, height: '100%', display: 'flex', flexDirection: 'column' } },
158
+ React.createElement(Box, { sx: { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 3 } },
159
+ React.createElement(Typography, { variant: 'h4', component: 'h1' }, "Customer Management"),
160
+ React.createElement(Button, { variant: 'contained', startIcon: React.createElement(AddIcon, null), onClick: handleCreateClick, disabled: loading }, "Create Customer")),
161
+ error && (React.createElement(Alert, { severity: 'error', sx: { mb: 2 }, onClose: () => setError(null) }, error)),
162
+ loading && (React.createElement(Box, { sx: { display: "flex", justifyContent: "center", p: 4 } },
163
+ React.createElement(CircularProgress, null))),
164
+ !loading && customers.length === 0 && (React.createElement(Paper, { elevation: 0, sx: { p: 3, textAlign: "center" } },
165
+ React.createElement(Typography, { color: 'textSecondary', gutterBottom: true }, "No customers found. Create one to get started."))),
166
+ !loading && customers.length > 0 && (React.createElement(Paper, { elevation: 0, sx: { flex: 1, minHeight: 400, width: '100%', display: 'flex', flexDirection: 'column' } },
167
+ React.createElement(DataGrid, { rows: customers, columns: columns, getRowId: (row) => row.name, pageSizeOptions: [20, 35, 50], initialState: {
168
+ pagination: { paginationModel: { pageSize: 20 } },
169
+ }, disableRowSelectionOnClick: true, sx: {
170
+ flex: 1,
171
+ } }))),
172
+ React.createElement(CustomerFormDialog, { open: formDialogOpen, customer: selectedCustomer, onClose: handleFormDialogClose, onSubmit: handleFormSubmit }),
173
+ React.createElement(DeleteCustomerDialog, { open: deleteDialogOpen, customer: selectedCustomer, onClose: handleDeleteDialogClose, onConfirm: handleDeleteConfirm })));
174
+ };
175
+ //# sourceMappingURL=customers.js.map