openvsx-webui-test 0.18.0-security.4 → 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 (531) 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 +37 -37
  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 +23 -48
  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 +5 -5
  72. package/lib/components/scan-admin/scan-card/utils.d.ts.map +1 -1
  73. package/lib/components/scan-admin/scan-card/utils.js +12 -0
  74. package/lib/components/scan-admin/scan-card/utils.js.map +1 -1
  75. package/lib/components/scan-admin/tab-contents/allow-list-tab-content.d.ts.map +1 -1
  76. package/lib/components/scan-admin/tab-contents/allow-list-tab-content.js +17 -39
  77. package/lib/components/scan-admin/tab-contents/allow-list-tab-content.js.map +1 -1
  78. package/lib/components/scan-admin/tab-contents/auto-rejected-tab-content.d.ts.map +1 -1
  79. package/lib/components/scan-admin/tab-contents/auto-rejected-tab-content.js +8 -30
  80. package/lib/components/scan-admin/tab-contents/auto-rejected-tab-content.js.map +1 -1
  81. package/lib/components/scan-admin/tab-contents/block-list-tab-content.d.ts.map +1 -1
  82. package/lib/components/scan-admin/tab-contents/block-list-tab-content.js +17 -39
  83. package/lib/components/scan-admin/tab-contents/block-list-tab-content.js.map +1 -1
  84. package/lib/components/scan-admin/tab-contents/quarantined-tab-content.d.ts.map +1 -1
  85. package/lib/components/scan-admin/tab-contents/quarantined-tab-content.js +26 -48
  86. package/lib/components/scan-admin/tab-contents/quarantined-tab-content.js.map +1 -1
  87. package/lib/components/scan-admin/tab-contents/scans-tab-content.d.ts.map +1 -1
  88. package/lib/components/scan-admin/tab-contents/scans-tab-content.js +15 -37
  89. package/lib/components/scan-admin/tab-contents/scans-tab-content.js.map +1 -1
  90. package/lib/components/scan-admin/toolbars/counts-toolbar.d.ts.map +1 -1
  91. package/lib/components/scan-admin/toolbars/counts-toolbar.js +70 -94
  92. package/lib/components/scan-admin/toolbars/counts-toolbar.js.map +1 -1
  93. package/lib/components/scan-admin/toolbars/search-toolbar.d.ts +5 -4
  94. package/lib/components/scan-admin/toolbars/search-toolbar.d.ts.map +1 -1
  95. package/lib/components/scan-admin/toolbars/search-toolbar.js +72 -98
  96. package/lib/components/scan-admin/toolbars/search-toolbar.js.map +1 -1
  97. package/lib/components/scan-admin/toolbars/tab-toolbar.d.ts +1 -1
  98. package/lib/components/scan-admin/toolbars/tab-toolbar.d.ts.map +1 -1
  99. package/lib/components/scan-admin/toolbars/tab-toolbar.js +3 -16
  100. package/lib/components/scan-admin/toolbars/tab-toolbar.js.map +1 -1
  101. package/lib/components/sidepanel/navigation-item.d.ts.map +1 -1
  102. package/lib/components/sidepanel/navigation-item.js +4 -9
  103. package/lib/components/sidepanel/navigation-item.js.map +1 -1
  104. package/lib/components/sidepanel/sidepanel.d.ts.map +1 -1
  105. package/lib/components/sidepanel/sidepanel.js +3 -13
  106. package/lib/components/sidepanel/sidepanel.js.map +1 -1
  107. package/lib/components/text-divider.d.ts.map +1 -1
  108. package/lib/components/text-divider.js +2 -11
  109. package/lib/components/text-divider.js.map +1 -1
  110. package/lib/components/timestamp.d.ts.map +1 -1
  111. package/lib/components/timestamp.js +2 -11
  112. package/lib/components/timestamp.js.map +1 -1
  113. package/lib/context/scan-admin/scan-actions.d.ts +2 -1
  114. package/lib/context/scan-admin/scan-actions.d.ts.map +1 -1
  115. package/lib/context/scan-admin/scan-actions.js.map +1 -1
  116. package/lib/context/scan-admin/scan-api-actions.d.ts +3 -3
  117. package/lib/context/scan-admin/scan-api-actions.d.ts.map +1 -1
  118. package/lib/context/scan-admin/scan-api-actions.js.map +1 -1
  119. package/lib/context/scan-admin/scan-api-effects.d.ts +7 -7
  120. package/lib/context/scan-admin/scan-api-effects.d.ts.map +1 -1
  121. package/lib/context/scan-admin/scan-api-effects.js +2 -1
  122. package/lib/context/scan-admin/scan-api-effects.js.map +1 -1
  123. package/lib/context/scan-admin/scan-context-types.d.ts +9 -9
  124. package/lib/context/scan-admin/scan-context-types.d.ts.map +1 -1
  125. package/lib/context/scan-admin/scan-context.d.ts +2 -2
  126. package/lib/context/scan-admin/scan-context.d.ts.map +1 -1
  127. package/lib/context/scan-admin/scan-context.js +3 -2
  128. package/lib/context/scan-admin/scan-context.js.map +1 -1
  129. package/lib/context/scan-admin/scan-helpers.d.ts.map +1 -1
  130. package/lib/context/scan-admin/scan-helpers.js.map +1 -1
  131. package/lib/context/scan-admin/scan-reducer.d.ts.map +1 -1
  132. package/lib/context/scan-admin/scan-reducer.js.map +1 -1
  133. package/lib/context/scan-admin/scan-types.d.ts +2 -0
  134. package/lib/context/scan-admin/scan-types.d.ts.map +1 -1
  135. package/lib/context/scan-admin/scan-types.js +1 -1
  136. package/lib/context/scan-admin/scan-types.js.map +1 -1
  137. package/lib/context.d.ts +0 -1
  138. package/lib/context.d.ts.map +1 -1
  139. package/lib/default/about.d.ts.map +1 -1
  140. package/lib/default/about.js +2 -22
  141. package/lib/default/about.js.map +1 -1
  142. package/lib/default/default-app.js +13 -15
  143. package/lib/default/default-app.js.map +1 -1
  144. package/lib/default/login.d.ts.map +1 -1
  145. package/lib/default/login.js +3 -7
  146. package/lib/default/login.js.map +1 -1
  147. package/lib/default/menu-content.d.ts +7 -7
  148. package/lib/default/menu-content.d.ts.map +1 -1
  149. package/lib/default/menu-content.js +20 -82
  150. package/lib/default/menu-content.js.map +1 -1
  151. package/lib/default/openvsx-registry-logo.d.ts.map +1 -1
  152. package/lib/default/openvsx-registry-logo.js +2 -14
  153. package/lib/default/openvsx-registry-logo.js.map +1 -1
  154. package/lib/default/page-settings.js +18 -27
  155. package/lib/default/page-settings.js.map +1 -1
  156. package/lib/extension-registry-service.d.ts +24 -1
  157. package/lib/extension-registry-service.d.ts.map +1 -1
  158. package/lib/extension-registry-service.js +168 -1
  159. package/lib/extension-registry-service.js.map +1 -1
  160. package/lib/extension-registry-types.d.ts +55 -0
  161. package/lib/extension-registry-types.d.ts.map +1 -1
  162. package/lib/extension-registry-types.js +16 -0
  163. package/lib/extension-registry-types.js.map +1 -1
  164. package/lib/header-menu.d.ts.map +1 -1
  165. package/lib/header-menu.js +8 -11
  166. package/lib/header-menu.js.map +1 -1
  167. package/lib/hooks/scan-admin/use-auto-rejected-tab.d.ts +1 -2
  168. package/lib/hooks/scan-admin/use-auto-rejected-tab.d.ts.map +1 -1
  169. package/lib/hooks/scan-admin/use-dialogs.d.ts +1 -1
  170. package/lib/hooks/scan-admin/use-dialogs.d.ts.map +1 -1
  171. package/lib/hooks/scan-admin/use-file-list-tab.d.ts +0 -1
  172. package/lib/hooks/scan-admin/use-file-list-tab.d.ts.map +1 -1
  173. package/lib/hooks/scan-admin/use-pagination.js.map +1 -1
  174. package/lib/hooks/scan-admin/use-quarantined-tab.d.ts +1 -2
  175. package/lib/hooks/scan-admin/use-quarantined-tab.d.ts.map +1 -1
  176. package/lib/hooks/scan-admin/use-quarantined-tab.js +2 -3
  177. package/lib/hooks/scan-admin/use-quarantined-tab.js.map +1 -1
  178. package/lib/hooks/scan-admin/use-scan-card-state.d.ts +3 -3
  179. package/lib/hooks/scan-admin/use-scan-card-state.d.ts.map +1 -1
  180. package/lib/hooks/scan-admin/use-scan-card-state.js +1 -1
  181. package/lib/hooks/scan-admin/use-scan-card-state.js.map +1 -1
  182. package/lib/hooks/scan-admin/use-scan-filters.d.ts +3 -4
  183. package/lib/hooks/scan-admin/use-scan-filters.d.ts.map +1 -1
  184. package/lib/hooks/scan-admin/use-scans-tab.d.ts +1 -2
  185. package/lib/hooks/scan-admin/use-scans-tab.d.ts.map +1 -1
  186. package/lib/hooks/scan-admin/use-scans-tab.js.map +1 -1
  187. package/lib/hooks/scan-admin/use-search.d.ts +0 -1
  188. package/lib/hooks/scan-admin/use-search.d.ts.map +1 -1
  189. package/lib/hooks/scan-admin/use-tab-navigation.js.map +1 -1
  190. package/lib/hooks/scan-admin/use-url-sync.js.map +1 -1
  191. package/lib/main.d.ts.map +1 -1
  192. package/lib/main.js +15 -21
  193. package/lib/main.js.map +1 -1
  194. package/lib/not-found.d.ts.map +1 -1
  195. package/lib/not-found.js +2 -5
  196. package/lib/not-found.js.map +1 -1
  197. package/lib/other-pages.d.ts.map +1 -1
  198. package/lib/other-pages.js +7 -24
  199. package/lib/other-pages.js.map +1 -1
  200. package/lib/pages/admin-dashboard/admin-dashboard.d.ts +4 -0
  201. package/lib/pages/admin-dashboard/admin-dashboard.d.ts.map +1 -1
  202. package/lib/pages/admin-dashboard/admin-dashboard.js +43 -39
  203. package/lib/pages/admin-dashboard/admin-dashboard.js.map +1 -1
  204. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.d.ts +40 -0
  205. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.d.ts.map +1 -0
  206. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.js +81 -0
  207. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.js.map +1 -0
  208. package/lib/pages/admin-dashboard/components/index.d.ts +14 -0
  209. package/lib/pages/admin-dashboard/components/index.d.ts.map +1 -0
  210. package/lib/pages/admin-dashboard/components/index.js +14 -0
  211. package/lib/pages/admin-dashboard/components/index.js.map +1 -0
  212. package/lib/pages/admin-dashboard/customers/customer-form-dialog.d.ts +23 -0
  213. package/lib/pages/admin-dashboard/customers/customer-form-dialog.d.ts.map +1 -0
  214. package/lib/pages/admin-dashboard/customers/customer-form-dialog.js +206 -0
  215. package/lib/pages/admin-dashboard/customers/customer-form-dialog.js.map +1 -0
  216. package/lib/pages/admin-dashboard/customers/customers.d.ts +15 -0
  217. package/lib/pages/admin-dashboard/customers/customers.d.ts.map +1 -0
  218. package/lib/pages/admin-dashboard/customers/customers.js +156 -0
  219. package/lib/pages/admin-dashboard/customers/customers.js.map +1 -0
  220. package/lib/pages/admin-dashboard/customers/delete-customer-dialog.d.ts +23 -0
  221. package/lib/pages/admin-dashboard/customers/delete-customer-dialog.d.ts.map +1 -0
  222. package/lib/pages/admin-dashboard/customers/delete-customer-dialog.js +47 -0
  223. package/lib/pages/admin-dashboard/customers/delete-customer-dialog.js.map +1 -0
  224. package/lib/pages/admin-dashboard/extension-admin.d.ts.map +1 -1
  225. package/lib/pages/admin-dashboard/extension-admin.js +17 -16
  226. package/lib/pages/admin-dashboard/extension-admin.js.map +1 -1
  227. package/lib/pages/admin-dashboard/extension-remove-dialog.d.ts.map +1 -1
  228. package/lib/pages/admin-dashboard/extension-remove-dialog.js +13 -31
  229. package/lib/pages/admin-dashboard/extension-remove-dialog.js.map +1 -1
  230. package/lib/pages/admin-dashboard/extension-version-container.d.ts.map +1 -1
  231. package/lib/pages/admin-dashboard/extension-version-container.js +26 -53
  232. package/lib/pages/admin-dashboard/extension-version-container.js.map +1 -1
  233. package/lib/pages/admin-dashboard/logs/logs.d.ts +15 -0
  234. package/lib/pages/admin-dashboard/logs/logs.d.ts.map +1 -0
  235. package/lib/pages/admin-dashboard/logs/logs.js +133 -0
  236. package/lib/pages/admin-dashboard/logs/logs.js.map +1 -0
  237. package/lib/pages/admin-dashboard/namespace-admin.d.ts.map +1 -1
  238. package/lib/pages/admin-dashboard/namespace-admin.js +14 -22
  239. package/lib/pages/admin-dashboard/namespace-admin.js.map +1 -1
  240. package/lib/pages/admin-dashboard/namespace-change-dialog.d.ts.map +1 -1
  241. package/lib/pages/admin-dashboard/namespace-change-dialog.js +14 -24
  242. package/lib/pages/admin-dashboard/namespace-change-dialog.js.map +1 -1
  243. package/lib/pages/admin-dashboard/namespace-input.d.ts.map +1 -1
  244. package/lib/pages/admin-dashboard/namespace-input.js +16 -18
  245. package/lib/pages/admin-dashboard/namespace-input.js.map +1 -1
  246. package/lib/pages/admin-dashboard/publisher-admin.d.ts +2 -2
  247. package/lib/pages/admin-dashboard/publisher-admin.d.ts.map +1 -1
  248. package/lib/pages/admin-dashboard/publisher-admin.js +18 -22
  249. package/lib/pages/admin-dashboard/publisher-admin.js.map +1 -1
  250. package/lib/pages/admin-dashboard/publisher-details.d.ts.map +1 -1
  251. package/lib/pages/admin-dashboard/publisher-details.js +5 -28
  252. package/lib/pages/admin-dashboard/publisher-details.js.map +1 -1
  253. package/lib/pages/admin-dashboard/publisher-revoke-dialog.d.ts.map +1 -1
  254. package/lib/pages/admin-dashboard/publisher-revoke-dialog.js +22 -51
  255. package/lib/pages/admin-dashboard/publisher-revoke-dialog.js.map +1 -1
  256. package/lib/pages/admin-dashboard/publisher-revoke-tokens-button.d.ts.map +1 -1
  257. package/lib/pages/admin-dashboard/publisher-revoke-tokens-button.js +12 -12
  258. package/lib/pages/admin-dashboard/publisher-revoke-tokens-button.js.map +1 -1
  259. package/lib/pages/admin-dashboard/scan-admin.d.ts.map +1 -1
  260. package/lib/pages/admin-dashboard/scan-admin.js +5 -32
  261. package/lib/pages/admin-dashboard/scan-admin.js.map +1 -1
  262. package/lib/pages/admin-dashboard/search-list-container.d.ts.map +1 -1
  263. package/lib/pages/admin-dashboard/search-list-container.js +4 -19
  264. package/lib/pages/admin-dashboard/search-list-container.js.map +1 -1
  265. package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.d.ts +23 -0
  266. package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.d.ts.map +1 -0
  267. package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.js +45 -0
  268. package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.js.map +1 -0
  269. package/lib/pages/admin-dashboard/tiers/tier-form-dialog.d.ts +23 -0
  270. package/lib/pages/admin-dashboard/tiers/tier-form-dialog.d.ts.map +1 -0
  271. package/lib/pages/admin-dashboard/tiers/tier-form-dialog.js +174 -0
  272. package/lib/pages/admin-dashboard/tiers/tier-form-dialog.js.map +1 -0
  273. package/lib/pages/admin-dashboard/tiers/tiers.d.ts +15 -0
  274. package/lib/pages/admin-dashboard/tiers/tiers.d.ts.map +1 -0
  275. package/lib/pages/admin-dashboard/tiers/tiers.js +159 -0
  276. package/lib/pages/admin-dashboard/tiers/tiers.js.map +1 -0
  277. package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.d.ts +23 -0
  278. package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.d.ts.map +1 -0
  279. package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.js +87 -0
  280. package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.js.map +1 -0
  281. package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.d.ts +26 -0
  282. package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.d.ts.map +1 -0
  283. package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.js +35 -0
  284. package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.js.map +1 -0
  285. package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.d.ts +14 -0
  286. package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.d.ts.map +1 -0
  287. package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.js +16 -0
  288. package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.js.map +1 -0
  289. package/lib/pages/admin-dashboard/usage-stats/usage-stats.d.ts +15 -0
  290. package/lib/pages/admin-dashboard/usage-stats/usage-stats.d.ts.map +1 -0
  291. package/lib/pages/admin-dashboard/usage-stats/usage-stats.js +102 -0
  292. package/lib/pages/admin-dashboard/usage-stats/usage-stats.js.map +1 -0
  293. package/lib/pages/admin-dashboard/welcome.d.ts.map +1 -1
  294. package/lib/pages/admin-dashboard/welcome.js +3 -27
  295. package/lib/pages/admin-dashboard/welcome.js.map +1 -1
  296. package/lib/pages/extension-detail/extension-detail-changes.d.ts.map +1 -1
  297. package/lib/pages/extension-detail/extension-detail-changes.js +27 -33
  298. package/lib/pages/extension-detail/extension-detail-changes.js.map +1 -1
  299. package/lib/pages/extension-detail/extension-detail-downloads-menu.d.ts.map +1 -1
  300. package/lib/pages/extension-detail/extension-detail-downloads-menu.js +6 -9
  301. package/lib/pages/extension-detail/extension-detail-downloads-menu.js.map +1 -1
  302. package/lib/pages/extension-detail/extension-detail-overview.d.ts.map +1 -1
  303. package/lib/pages/extension-detail/extension-detail-overview.js +66 -133
  304. package/lib/pages/extension-detail/extension-detail-overview.js.map +1 -1
  305. package/lib/pages/extension-detail/extension-detail-reviews.d.ts.map +1 -1
  306. package/lib/pages/extension-detail/extension-detail-reviews.js +53 -75
  307. package/lib/pages/extension-detail/extension-detail-reviews.js.map +1 -1
  308. package/lib/pages/extension-detail/extension-detail.d.ts.map +1 -1
  309. package/lib/pages/extension-detail/extension-detail.js +56 -129
  310. package/lib/pages/extension-detail/extension-detail.js.map +1 -1
  311. package/lib/pages/extension-detail/extension-rating-star-setter.d.ts.map +1 -1
  312. package/lib/pages/extension-detail/extension-rating-star-setter.js +4 -3
  313. package/lib/pages/extension-detail/extension-rating-star-setter.js.map +1 -1
  314. package/lib/pages/extension-detail/extension-rating-stars.d.ts.map +1 -1
  315. package/lib/pages/extension-detail/extension-rating-stars.js +5 -16
  316. package/lib/pages/extension-detail/extension-rating-stars.js.map +1 -1
  317. package/lib/pages/extension-detail/extension-review-dialog.d.ts.map +1 -1
  318. package/lib/pages/extension-detail/extension-review-dialog.js +15 -28
  319. package/lib/pages/extension-detail/extension-review-dialog.js.map +1 -1
  320. package/lib/pages/extension-list/extension-list-container.d.ts.map +1 -1
  321. package/lib/pages/extension-list/extension-list-container.js +3 -4
  322. package/lib/pages/extension-list/extension-list-container.js.map +1 -1
  323. package/lib/pages/extension-list/extension-list-header.d.ts.map +1 -1
  324. package/lib/pages/extension-list/extension-list-header.js +55 -74
  325. package/lib/pages/extension-list/extension-list-header.js.map +1 -1
  326. package/lib/pages/extension-list/extension-list-item.d.ts.map +1 -1
  327. package/lib/pages/extension-list/extension-list-item.js +13 -29
  328. package/lib/pages/extension-list/extension-list-item.js.map +1 -1
  329. package/lib/pages/extension-list/extension-list-searchfield.d.ts.map +1 -1
  330. package/lib/pages/extension-list/extension-list-searchfield.js +17 -20
  331. package/lib/pages/extension-list/extension-list-searchfield.js.map +1 -1
  332. package/lib/pages/extension-list/extension-list.d.ts.map +1 -1
  333. package/lib/pages/extension-list/extension-list.js +15 -19
  334. package/lib/pages/extension-list/extension-list.js.map +1 -1
  335. package/lib/pages/namespace-detail/namespace-detail.d.ts.map +1 -1
  336. package/lib/pages/namespace-detail/namespace-detail.js +50 -87
  337. package/lib/pages/namespace-detail/namespace-detail.js.map +1 -1
  338. package/lib/pages/user/add-namespace-member-dialog.d.ts.map +1 -1
  339. package/lib/pages/user/add-namespace-member-dialog.js +27 -40
  340. package/lib/pages/user/add-namespace-member-dialog.js.map +1 -1
  341. package/lib/pages/user/avatar.d.ts.map +1 -1
  342. package/lib/pages/user/avatar.js +6 -22
  343. package/lib/pages/user/avatar.js.map +1 -1
  344. package/lib/pages/user/create-namespace-dialog.d.ts.map +1 -1
  345. package/lib/pages/user/create-namespace-dialog.js +12 -20
  346. package/lib/pages/user/create-namespace-dialog.js.map +1 -1
  347. package/lib/pages/user/generate-token-dialog.d.ts.map +1 -1
  348. package/lib/pages/user/generate-token-dialog.js +18 -31
  349. package/lib/pages/user/generate-token-dialog.js.map +1 -1
  350. package/lib/pages/user/logout.d.ts.map +1 -1
  351. package/lib/pages/user/logout.js +12 -13
  352. package/lib/pages/user/logout.js.map +1 -1
  353. package/lib/pages/user/publish-extension-dialog.d.ts.map +1 -1
  354. package/lib/pages/user/publish-extension-dialog.js +25 -46
  355. package/lib/pages/user/publish-extension-dialog.js.map +1 -1
  356. package/lib/pages/user/user-extension-list.d.ts.map +1 -1
  357. package/lib/pages/user/user-extension-list.js +5 -16
  358. package/lib/pages/user/user-extension-list.js.map +1 -1
  359. package/lib/pages/user/user-namespace-details.d.ts.map +1 -1
  360. package/lib/pages/user/user-namespace-details.js +53 -136
  361. package/lib/pages/user/user-namespace-details.js.map +1 -1
  362. package/lib/pages/user/user-namespace-extension-list-item.d.ts.map +1 -1
  363. package/lib/pages/user/user-namespace-extension-list-item.js +14 -39
  364. package/lib/pages/user/user-namespace-extension-list-item.js.map +1 -1
  365. package/lib/pages/user/user-namespace-extension-list.d.ts.map +1 -1
  366. package/lib/pages/user/user-namespace-extension-list.js +14 -15
  367. package/lib/pages/user/user-namespace-extension-list.js.map +1 -1
  368. package/lib/pages/user/user-namespace-member-component.d.ts.map +1 -1
  369. package/lib/pages/user/user-namespace-member-component.js +24 -34
  370. package/lib/pages/user/user-namespace-member-component.js.map +1 -1
  371. package/lib/pages/user/user-namespace-member-list.d.ts.map +1 -1
  372. package/lib/pages/user/user-namespace-member-list.js +20 -24
  373. package/lib/pages/user/user-namespace-member-list.js.map +1 -1
  374. package/lib/pages/user/user-publisher-agreement.d.ts.map +1 -1
  375. package/lib/pages/user/user-publisher-agreement.js +21 -52
  376. package/lib/pages/user/user-publisher-agreement.js.map +1 -1
  377. package/lib/pages/user/user-setting-tabs.d.ts.map +1 -1
  378. package/lib/pages/user/user-setting-tabs.js +2 -15
  379. package/lib/pages/user/user-setting-tabs.js.map +1 -1
  380. package/lib/pages/user/user-settings-delete-extension.d.ts.map +1 -1
  381. package/lib/pages/user/user-settings-delete-extension.js +14 -15
  382. package/lib/pages/user/user-settings-delete-extension.js.map +1 -1
  383. package/lib/pages/user/user-settings-extensions.d.ts.map +1 -1
  384. package/lib/pages/user/user-settings-extensions.js +22 -30
  385. package/lib/pages/user/user-settings-extensions.js.map +1 -1
  386. package/lib/pages/user/user-settings-namespace-detail.d.ts +2 -2
  387. package/lib/pages/user/user-settings-namespace-detail.d.ts.map +1 -1
  388. package/lib/pages/user/user-settings-namespace-detail.js +27 -45
  389. package/lib/pages/user/user-settings-namespace-detail.js.map +1 -1
  390. package/lib/pages/user/user-settings-namespaces.d.ts.map +1 -1
  391. package/lib/pages/user/user-settings-namespaces.js +33 -46
  392. package/lib/pages/user/user-settings-namespaces.js.map +1 -1
  393. package/lib/pages/user/user-settings-profile.d.ts.map +1 -1
  394. package/lib/pages/user/user-settings-profile.js +10 -29
  395. package/lib/pages/user/user-settings-profile.js.map +1 -1
  396. package/lib/pages/user/user-settings-tokens.d.ts.map +1 -1
  397. package/lib/pages/user/user-settings-tokens.js +24 -62
  398. package/lib/pages/user/user-settings-tokens.js.map +1 -1
  399. package/lib/pages/user/user-settings.d.ts.map +1 -1
  400. package/lib/pages/user/user-settings.js +18 -35
  401. package/lib/pages/user/user-settings.js.map +1 -1
  402. package/lib/server-request.d.ts +1 -1
  403. package/lib/server-request.d.ts.map +1 -1
  404. package/lib/server-request.js +5 -5
  405. package/lib/server-request.js.map +1 -1
  406. package/lib/utils.js.map +1 -1
  407. package/package.json +42 -37
  408. package/src/components/banner.tsx +1 -1
  409. package/src/components/button-with-progress.tsx +1 -1
  410. package/src/components/copy-to-clipboard.tsx +2 -1
  411. package/src/components/delayed-load-indicator.tsx +2 -2
  412. package/src/components/error-dialog.tsx +1 -1
  413. package/src/components/hover-popover.tsx +1 -1
  414. package/src/components/info-dialog.tsx +1 -1
  415. package/src/components/sanitized-markdown.tsx +1 -1
  416. package/src/components/scan-admin/common/auto-refresh.tsx +1 -1
  417. package/src/components/scan-admin/common/conditional-tooltip.tsx +3 -3
  418. package/src/components/scan-admin/common/file-table.tsx +1 -1
  419. package/src/components/scan-admin/common/tab-panel.tsx +1 -1
  420. package/src/components/scan-admin/dialogs/file-dialog.tsx +1 -1
  421. package/src/components/scan-admin/dialogs/quarantine-dialog.tsx +1 -1
  422. package/src/components/scan-admin/scan-card/scan-card-content.tsx +3 -3
  423. package/src/components/scan-admin/scan-card/scan-card-expand-strip-badges.tsx +11 -5
  424. package/src/components/scan-admin/scan-card/scan-card-expand-strip.tsx +2 -2
  425. package/src/components/scan-admin/scan-card/scan-card-expanded-content.tsx +9 -3
  426. package/src/components/scan-admin/scan-card/scan-card-header.tsx +2 -2
  427. package/src/components/scan-admin/scan-card/scan-card.tsx +3 -3
  428. package/src/components/scan-admin/scan-card/scan-detail-card.tsx +1 -1
  429. package/src/components/scan-admin/scan-card/utils.ts +13 -1
  430. package/src/components/scan-admin/tab-contents/allow-list-tab-content.tsx +1 -1
  431. package/src/components/scan-admin/tab-contents/auto-rejected-tab-content.tsx +1 -1
  432. package/src/components/scan-admin/tab-contents/block-list-tab-content.tsx +1 -1
  433. package/src/components/scan-admin/tab-contents/quarantined-tab-content.tsx +1 -1
  434. package/src/components/scan-admin/tab-contents/scans-tab-content.tsx +1 -1
  435. package/src/components/scan-admin/toolbars/counts-toolbar.tsx +1 -1
  436. package/src/components/scan-admin/toolbars/search-toolbar.tsx +6 -6
  437. package/src/components/scan-admin/toolbars/tab-toolbar.tsx +1 -1
  438. package/src/components/sidepanel/navigation-item.tsx +1 -1
  439. package/src/components/sidepanel/sidepanel.tsx +1 -1
  440. package/src/components/text-divider.tsx +1 -1
  441. package/src/components/timestamp.tsx +1 -1
  442. package/src/context/scan-admin/scan-actions.ts +8 -7
  443. package/src/context/scan-admin/scan-api-actions.ts +5 -4
  444. package/src/context/scan-admin/scan-api-effects.ts +13 -11
  445. package/src/context/scan-admin/scan-context-types.ts +9 -9
  446. package/src/context/scan-admin/scan-context.tsx +2 -2
  447. package/src/context/scan-admin/scan-types.ts +2 -0
  448. package/src/default/about.tsx +1 -1
  449. package/src/default/default-app.tsx +1 -1
  450. package/src/default/login.tsx +2 -1
  451. package/src/default/menu-content.tsx +1 -1
  452. package/src/default/openvsx-registry-logo.tsx +1 -1
  453. package/src/default/page-settings.tsx +1 -1
  454. package/src/default/server.ts +1 -1
  455. package/src/extension-registry-service.ts +179 -1
  456. package/src/extension-registry-types.ts +66 -0
  457. package/src/header-menu.tsx +1 -1
  458. package/src/hooks/scan-admin/use-dialogs.ts +1 -1
  459. package/src/hooks/scan-admin/use-quarantined-tab.ts +2 -3
  460. package/src/hooks/scan-admin/use-scan-card-state.ts +3 -2
  461. package/src/hooks/scan-admin/use-url-sync.ts +1 -1
  462. package/src/main.tsx +1 -1
  463. package/src/not-found.tsx +1 -1
  464. package/src/other-pages.tsx +1 -1
  465. package/src/pages/admin-dashboard/admin-dashboard.tsx +51 -3
  466. package/src/pages/admin-dashboard/components/data-grid-filter-operators.tsx +127 -0
  467. package/src/pages/admin-dashboard/components/index.ts +18 -0
  468. package/src/pages/admin-dashboard/customers/customer-form-dialog.tsx +347 -0
  469. package/src/pages/admin-dashboard/customers/customers.tsx +278 -0
  470. package/src/pages/admin-dashboard/customers/delete-customer-dialog.tsx +93 -0
  471. package/src/pages/admin-dashboard/extension-admin.tsx +1 -1
  472. package/src/pages/admin-dashboard/extension-remove-dialog.tsx +1 -1
  473. package/src/pages/admin-dashboard/extension-version-container.tsx +1 -1
  474. package/src/pages/admin-dashboard/logs/logs.tsx +213 -0
  475. package/src/pages/admin-dashboard/namespace-admin.tsx +1 -1
  476. package/src/pages/admin-dashboard/namespace-change-dialog.tsx +1 -1
  477. package/src/pages/admin-dashboard/namespace-input.tsx +1 -1
  478. package/src/pages/admin-dashboard/publisher-admin.tsx +5 -5
  479. package/src/pages/admin-dashboard/publisher-details.tsx +1 -1
  480. package/src/pages/admin-dashboard/publisher-revoke-dialog.tsx +1 -1
  481. package/src/pages/admin-dashboard/publisher-revoke-tokens-button.tsx +1 -1
  482. package/src/pages/admin-dashboard/scan-admin.tsx +3 -2
  483. package/src/pages/admin-dashboard/search-list-container.tsx +1 -1
  484. package/src/pages/admin-dashboard/tiers/delete-tier-dialog.tsx +83 -0
  485. package/src/pages/admin-dashboard/tiers/tier-form-dialog.tsx +373 -0
  486. package/src/pages/admin-dashboard/tiers/tiers.tsx +254 -0
  487. package/src/pages/admin-dashboard/usage-stats/usage-stats-chart.tsx +189 -0
  488. package/src/pages/admin-dashboard/usage-stats/usage-stats-search.tsx +83 -0
  489. package/src/pages/admin-dashboard/usage-stats/usage-stats-utils.ts +16 -0
  490. package/src/pages/admin-dashboard/usage-stats/usage-stats.tsx +127 -0
  491. package/src/pages/admin-dashboard/welcome.tsx +5 -1
  492. package/src/pages/extension-detail/extension-detail-changes.tsx +1 -1
  493. package/src/pages/extension-detail/extension-detail-downloads-menu.tsx +1 -1
  494. package/src/pages/extension-detail/extension-detail-overview.tsx +17 -3
  495. package/src/pages/extension-detail/extension-detail-reviews.tsx +53 -41
  496. package/src/pages/extension-detail/extension-detail.tsx +0 -1
  497. package/src/pages/extension-detail/extension-rating-star-setter.tsx +1 -1
  498. package/src/pages/extension-detail/extension-rating-stars.tsx +2 -2
  499. package/src/pages/extension-detail/extension-review-dialog.tsx +1 -1
  500. package/src/pages/extension-list/extension-list-container.tsx +1 -1
  501. package/src/pages/extension-list/extension-list-header.tsx +1 -1
  502. package/src/pages/extension-list/extension-list-item.tsx +1 -1
  503. package/src/pages/extension-list/extension-list-searchfield.tsx +1 -1
  504. package/src/pages/extension-list/extension-list.tsx +2 -2
  505. package/src/pages/namespace-detail/namespace-detail.tsx +1 -1
  506. package/src/pages/user/add-namespace-member-dialog.tsx +1 -1
  507. package/src/pages/user/avatar.tsx +1 -1
  508. package/src/pages/user/create-namespace-dialog.tsx +1 -1
  509. package/src/pages/user/generate-token-dialog.tsx +1 -1
  510. package/src/pages/user/logout.tsx +1 -1
  511. package/src/pages/user/publish-extension-dialog.tsx +1 -1
  512. package/src/pages/user/user-extension-list.tsx +1 -1
  513. package/src/pages/user/user-namespace-details.tsx +1 -1
  514. package/src/pages/user/user-namespace-extension-list-item.tsx +2 -1
  515. package/src/pages/user/user-namespace-extension-list.tsx +1 -1
  516. package/src/pages/user/user-namespace-member-component.tsx +1 -1
  517. package/src/pages/user/user-namespace-member-list.tsx +1 -1
  518. package/src/pages/user/user-publisher-agreement.tsx +1 -1
  519. package/src/pages/user/user-setting-tabs.tsx +1 -1
  520. package/src/pages/user/user-settings-delete-extension.tsx +1 -1
  521. package/src/pages/user/user-settings-extensions.tsx +1 -1
  522. package/src/pages/user/user-settings-namespace-detail.tsx +1 -1
  523. package/src/pages/user/user-settings-namespaces.tsx +1 -1
  524. package/src/pages/user/user-settings-profile.tsx +1 -1
  525. package/src/pages/user/user-settings-tokens.tsx +2 -4
  526. package/src/pages/user/user-settings.tsx +1 -1
  527. package/src/server-request.ts +3 -3
  528. package/lib/default/server.d.ts +0 -11
  529. package/lib/default/server.d.ts.map +0 -1
  530. package/lib/default/server.js +0 -50
  531. package/lib/default/server.js.map +0 -1
@@ -8,7 +8,7 @@
8
8
  * SPDX-License-Identifier: EPL-2.0
9
9
  ********************************************************************************/
10
10
 
11
- import React, { FunctionComponent, useState, useContext, useEffect, useRef } from 'react';
11
+ import { FunctionComponent, useState, useContext, useEffect, useRef } from 'react';
12
12
  import {
13
13
  Button, Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions, Typography, Link
14
14
  } from '@mui/material';
@@ -8,7 +8,7 @@
8
8
  * SPDX-License-Identifier: EPL-2.0
9
9
  ********************************************************************************/
10
10
 
11
- import React, { FunctionComponent, useState, useContext, useEffect, useRef } from 'react';
11
+ import { FunctionComponent, useState, useContext, useEffect, useRef } from 'react';
12
12
  import { Box } from '@mui/material';
13
13
  import { ButtonWithProgress } from '../../components/button-with-progress';
14
14
  import { PublisherInfo, isError } from '../../extension-registry-types';
@@ -11,7 +11,8 @@
11
11
  * SPDX-License-Identifier: EPL-2.0
12
12
  ********************************************************************************/
13
13
 
14
- import React, { FunctionComponent, useContext } from 'react';
14
+ import type { SyntheticEvent } from "react";
15
+ import { FunctionComponent, useContext } from 'react';
15
16
  import { Box, Typography } from '@mui/material';
16
17
  import { ScanProvider } from '../../context/scan-admin';
17
18
  import { useTabNavigation, useUrlSync } from '../../hooks/scan-admin';
@@ -38,7 +39,7 @@ const ScanAdminContent: FunctionComponent = () => {
38
39
  // Sync state with URL parameters for bookmarkable URLs and browser navigation
39
40
  useUrlSync();
40
41
 
41
- const handleTabChange = (_event: React.SyntheticEvent, newValue: number) => {
42
+ const handleTabChange = (_event: SyntheticEvent, newValue: number) => {
42
43
  setTab(newValue);
43
44
  };
44
45
 
@@ -8,7 +8,7 @@
8
8
  * SPDX-License-Identifier: EPL-2.0
9
9
  ********************************************************************************/
10
10
 
11
- import React, { FunctionComponent, ReactNode } from 'react';
11
+ import { FunctionComponent, ReactNode } from 'react';
12
12
  import { Grid } from '@mui/material';
13
13
  import { DelayedLoadIndicator } from '../../components/delayed-load-indicator';
14
14
 
@@ -0,0 +1,83 @@
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 { FC, useState } from 'react';
15
+ import {
16
+ Dialog,
17
+ DialogTitle,
18
+ DialogContent,
19
+ DialogActions,
20
+ Button,
21
+ Typography,
22
+ CircularProgress,
23
+ Alert
24
+ } from '@mui/material';
25
+ import type { Tier } from '../../../extension-registry-types';
26
+ import { handleError } from "../../../utils";
27
+
28
+ interface DeleteTierDialogProps {
29
+ open: boolean;
30
+ tier?: Tier;
31
+ onClose: () => void;
32
+ onConfirm: () => Promise<void>;
33
+ }
34
+
35
+ export const DeleteTierDialog: FC<DeleteTierDialogProps> = ({ open, tier, onClose, onConfirm }) => {
36
+ const [loading, setLoading] = useState(false);
37
+ const [error, setError] = useState<string | null>(null);
38
+
39
+ const handleConfirm = async () => {
40
+ try {
41
+ setError(null);
42
+ setLoading(true);
43
+ await onConfirm();
44
+ onClose();
45
+ } catch (err: any) {
46
+ setError(handleError(err));
47
+ } finally {
48
+ setLoading(false);
49
+ }
50
+ };
51
+
52
+ return (
53
+ <Dialog open={open} onClose={onClose} maxWidth='sm' fullWidth>
54
+ <DialogTitle>Delete Tier</DialogTitle>
55
+ <DialogContent sx={{ display: 'flex', flexDirection: 'column', gap: 2, pt: 2 }}>
56
+ {error && <Alert severity='error'>{error}</Alert>}
57
+
58
+ <Typography>
59
+ Are you sure you want to delete the tier <strong>{tier?.name}</strong>?
60
+ </Typography>
61
+
62
+ <Typography variant='body2' color='warning.main'>
63
+ This action cannot be undone. If this tier is assigned to customers, they will be affected.
64
+ </Typography>
65
+ </DialogContent>
66
+
67
+ <DialogActions sx={{ p: 2 }}>
68
+ <Button onClick={onClose} disabled={loading}>
69
+ Cancel
70
+ </Button>
71
+ <Button
72
+ onClick={handleConfirm}
73
+ variant='contained'
74
+ color='error'
75
+ disabled={loading}
76
+ startIcon={loading ? <CircularProgress size={20} /> : undefined}
77
+ >
78
+ Delete
79
+ </Button>
80
+ </DialogActions>
81
+ </Dialog>
82
+ );
83
+ };
@@ -0,0 +1,373 @@
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 { ChangeEvent, FocusEvent } from "react";
15
+ import { FC, useEffect, useState } from 'react';
16
+ import type { SelectChangeEvent } from '@mui/material';
17
+ import {
18
+ Alert,
19
+ Box,
20
+ Button,
21
+ CircularProgress,
22
+ Dialog,
23
+ DialogActions,
24
+ DialogContent,
25
+ DialogTitle,
26
+ FormControl,
27
+ FormHelperText,
28
+ InputLabel,
29
+ MenuItem,
30
+ Select,
31
+ TextField
32
+ } from '@mui/material';
33
+ import { RefillStrategy, type Tier, TierType } from "../../../extension-registry-types";
34
+ import { handleError } from "../../../utils";
35
+
36
+ type DurationUnit = 'seconds' | 'minutes' | 'hours';
37
+
38
+ const DURATION_MULTIPLIERS: Record<DurationUnit, number> = {
39
+ seconds: 1,
40
+ minutes: 60,
41
+ hours: 3600
42
+ };
43
+
44
+ function formatDuration(duration: number): [number, DurationUnit] {
45
+ const hours = Math.floor(duration / 3600);
46
+ if (hours > 0) {
47
+ return [hours, "hours"];
48
+ }
49
+
50
+ const minutes = Math.floor(duration / 60);
51
+ if (minutes > 0) {
52
+ return [minutes, "minutes"];
53
+ }
54
+
55
+ return [duration, "seconds"];
56
+ }
57
+
58
+ interface TierFormDialogProps {
59
+ open: boolean;
60
+ tier?: Tier;
61
+ onClose: () => void;
62
+ onSubmit: (formData: Tier) => Promise<void>;
63
+ }
64
+
65
+ export const TierFormDialog: FC<TierFormDialogProps> = ({ open, tier, onClose, onSubmit }) => {
66
+ const [formData, setFormData] = useState<Tier>({
67
+ name: '',
68
+ description: '',
69
+ capacity: 100,
70
+ duration: 3600,
71
+ refillStrategy: RefillStrategy.INTERVAL
72
+ } as Tier);
73
+ const [durationValue, setDurationValue] = useState(1);
74
+ const [durationUnit, setDurationUnit] = useState<DurationUnit>('hours');
75
+ const [loading, setLoading] = useState(false);
76
+ const [errors, setErrors] = useState<Record<string, string>>({});
77
+ const [touched, setTouched] = useState<Record<string, boolean>>({});
78
+
79
+ const getDurationInSeconds = (): number => {
80
+ return durationValue * DURATION_MULTIPLIERS[durationUnit];
81
+ };
82
+
83
+ useEffect(() => {
84
+ if (tier) {
85
+ setFormData(_ => ({
86
+ name: tier.name,
87
+ description: tier.description || '',
88
+ tierType: tier.tierType,
89
+ capacity: tier.capacity,
90
+ duration: tier.duration,
91
+ refillStrategy: tier.refillStrategy
92
+ } as Tier));
93
+ // Convert duration seconds to value/unit for display
94
+ const [value, unit] = formatDuration(tier.duration);
95
+ setDurationValue(value);
96
+ setDurationUnit(unit);
97
+ } else {
98
+ setFormData(prev => ({
99
+ ...prev,
100
+ name: '',
101
+ description: '',
102
+ tierType: TierType.NON_FREE,
103
+ capacity: 100,
104
+ duration: 3600,
105
+ refillStrategy: RefillStrategy.INTERVAL
106
+ }));
107
+ setDurationValue(1);
108
+ setDurationUnit('hours');
109
+ }
110
+ setErrors({});
111
+ setTouched({});
112
+ }, [open, tier]);
113
+
114
+ const clearFieldError = (fieldName: string) => {
115
+ if (errors[fieldName]) {
116
+ setErrors(prev => {
117
+ const newErrors = { ...prev };
118
+ delete newErrors[fieldName];
119
+ return newErrors;
120
+ });
121
+ }
122
+ };
123
+
124
+ const handleChange = (e: ChangeEvent<HTMLInputElement | { name?: string; value: unknown }> | SelectChangeEvent) => {
125
+ const { name, value } = e.target as any;
126
+ clearFieldError(name);
127
+
128
+ setFormData((prev: Tier) => ({
129
+ ...prev,
130
+ [name]: name === 'capacity' || name === 'duration' ? Number.parseInt(value as string, 10) : value
131
+ } as Tier));
132
+ };
133
+
134
+ const handleBlur = (e: FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {
135
+ const { name } = e.target;
136
+ setTouched(prev => ({ ...prev, [name]: true }));
137
+ validateField(name);
138
+ };
139
+
140
+ const fieldValidators: Record<string, () => string | undefined> = {
141
+ name: () => {
142
+ if (formData.name === undefined) {
143
+ return "Tier name is required";
144
+ } else if (formData.name.trim() !== formData.name) {
145
+ return "Tier name must not contain trailing whitespace";
146
+ } else {
147
+ return undefined;
148
+ }
149
+ },
150
+ tierType: () => formData.tierType ? undefined : 'Tier type is required',
151
+ capacity: () => formData.capacity <= 0 ? 'Capacity must be greater than 0' : undefined,
152
+ duration: () => durationValue <= 0 ? 'Duration must be greater than 0' : undefined,
153
+ refillStrategy: () => formData.refillStrategy ? undefined : 'Refill strategy is required',
154
+ };
155
+
156
+ const validateField = (fieldName: string): string | undefined => {
157
+ const validator = fieldValidators[fieldName];
158
+ const error = validator?.();
159
+
160
+ if (error) {
161
+ setErrors(prev => ({ ...prev, [fieldName]: error }));
162
+ }
163
+ return error;
164
+ };
165
+
166
+ const validateForm = (): boolean => {
167
+ // Mark all fields as touched on submit
168
+ setTouched({
169
+ name: true,
170
+ tierType: true,
171
+ capacity: true,
172
+ duration: true,
173
+ refillStrategy: true,
174
+ });
175
+
176
+ const newErrors: Record<string, string> = {};
177
+ for (const key of Object.keys(formData)) {
178
+ const error = validateField(key);
179
+ if (error !== undefined) {
180
+ newErrors[key] = error;
181
+ }
182
+ }
183
+
184
+ setErrors(newErrors);
185
+ return Object.keys(newErrors).length === 0;
186
+ };
187
+
188
+ const handleSubmit = async () => {
189
+ if (!validateForm()) {
190
+ return;
191
+ }
192
+
193
+ setLoading(true);
194
+
195
+ try {
196
+ const durationInSeconds = getDurationInSeconds();
197
+ await onSubmit({
198
+ ...formData,
199
+ duration: durationInSeconds
200
+ });
201
+ onClose();
202
+ } catch (err: any) {
203
+ setErrors({ submit: handleError(err) });
204
+ } finally {
205
+ setLoading(false);
206
+ }
207
+ };
208
+
209
+ const isEditMode = !!tier;
210
+ const title = isEditMode ? 'Edit Tier' : 'Create New Tier';
211
+
212
+ return (
213
+ <Dialog open={open} onClose={onClose} maxWidth='sm' fullWidth>
214
+ <DialogTitle>{title}</DialogTitle>
215
+ <DialogContent>
216
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2, pt: 2 }}>
217
+ {errors.submit && <Alert severity='error'>{errors.submit}</Alert>}
218
+
219
+ <TextField
220
+ label='Tier Name'
221
+ name='name'
222
+ value={formData.name}
223
+ onChange={handleChange}
224
+ onBlur={handleBlur}
225
+ fullWidth
226
+ placeholder='e.g., Professional, Enterprise'
227
+ required={true}
228
+ disabled={loading}
229
+ error={touched.name && !!errors.name}
230
+ helperText={touched.name && errors.name}
231
+ />
232
+
233
+ <TextField
234
+ label='Description'
235
+ name='description'
236
+ value={formData.description}
237
+ onChange={handleChange}
238
+ fullWidth
239
+ multiline
240
+ rows={3}
241
+ placeholder='Optional description for this tier'
242
+ disabled={loading}
243
+ />
244
+
245
+ <FormControl fullWidth disabled={loading} required={true} error={touched.tierType && !!errors.tierType}>
246
+ <InputLabel>Tier Type</InputLabel>
247
+ <Select
248
+ name='tierType'
249
+ value={formData.tierType || ''}
250
+ onChange={(e: SelectChangeEvent) => {
251
+ const { name, value } = e.target;
252
+ clearFieldError(name);
253
+ setFormData((prev: Tier) => ({
254
+ ...prev,
255
+ [name]: value
256
+ } as Tier));
257
+ }}
258
+ onBlur={() => {
259
+ setTouched(prev => ({ ...prev, tierType: true }));
260
+ validateField('tierType');
261
+ }}
262
+ label='Tier Type'
263
+ >
264
+ {Object.keys(TierType).map(tierType => (
265
+ <MenuItem key={tierType} value={TierType[tierType as keyof typeof TierType]}>
266
+ {tierType}
267
+ </MenuItem>
268
+ ))}
269
+ </Select>
270
+ {touched.tierType && errors.tierType && <FormHelperText>{errors.tierType}</FormHelperText>}
271
+ </FormControl>
272
+
273
+ <TextField
274
+ label='Capacity'
275
+ name='capacity'
276
+ type='number'
277
+ value={formData.capacity}
278
+ onChange={handleChange}
279
+ onBlur={handleBlur}
280
+ fullWidth
281
+ inputProps={{ min: '1' }}
282
+ disabled={loading}
283
+ required={true}
284
+ error={touched.capacity && !!errors.capacity}
285
+ helperText={(touched.capacity && errors.capacity) || 'Maximum number of requests allowed per interval'}
286
+ />
287
+
288
+ <Box sx={{ display: 'flex', gap: 2 }}>
289
+ <TextField
290
+ label='Duration'
291
+ name='duration'
292
+ type='number'
293
+ value={durationValue}
294
+ onChange={(e) => {
295
+ clearFieldError('duration');
296
+ setDurationValue(Math.max(1, Number.parseInt(e.target.value, 10) || 0));
297
+ }}
298
+ onBlur={(e) => {
299
+ setTouched(prev => ({ ...prev, duration: true }));
300
+ validateField('duration');
301
+ }}
302
+ inputProps={{ min: '1' }}
303
+ disabled={loading}
304
+ required={true}
305
+ error={touched.duration && !!errors.duration}
306
+ helperText={touched.duration && errors.duration}
307
+ sx={{ flex: 1 }}
308
+ />
309
+ <FormControl disabled={loading} required={true} sx={{ minWidth: 150 }}>
310
+ <InputLabel>Unit</InputLabel>
311
+ <Select
312
+ value={durationUnit}
313
+ onChange={(e: SelectChangeEvent) => setDurationUnit(e.target.value as DurationUnit)}
314
+ label='Unit'
315
+ >
316
+ <MenuItem value='seconds'>Seconds</MenuItem>
317
+ <MenuItem value='minutes'>Minutes</MenuItem>
318
+ <MenuItem value='hours'>Hours</MenuItem>
319
+ </Select>
320
+ </FormControl>
321
+ </Box>
322
+ <Box sx={{ fontSize: '0.875rem', color: 'text.secondary' }}>
323
+ = {getDurationInSeconds().toLocaleString()} seconds
324
+ </Box>
325
+
326
+ <FormControl fullWidth disabled={loading} required={true} error={touched.refillStrategy && !!errors.refillStrategy}>
327
+ <InputLabel>Refill Strategy</InputLabel>
328
+ <Select
329
+ name='refillStrategy'
330
+ value={formData.refillStrategy || ''}
331
+ onChange={(e: SelectChangeEvent) => {
332
+ const { name, value } = e.target;
333
+ clearFieldError(name);
334
+ setFormData((prev: Tier) => ({
335
+ ...prev,
336
+ [name]: value
337
+ } as Tier));
338
+ }}
339
+ onBlur={() => {
340
+ setTouched(prev => ({ ...prev, refillStrategy: true }));
341
+ validateField('refillStrategy');
342
+ }}
343
+ label='Refill Strategy'
344
+ >
345
+ {Object.keys(RefillStrategy).map(strategy => (
346
+ <MenuItem key={strategy} value={RefillStrategy[strategy as keyof typeof RefillStrategy]}>
347
+ {strategy}
348
+ </MenuItem>
349
+ ))}
350
+ </Select>
351
+ {touched.refillStrategy && errors.refillStrategy && <FormHelperText>{errors.refillStrategy}</FormHelperText>}
352
+ </FormControl>
353
+
354
+
355
+ </Box>
356
+ </DialogContent>
357
+
358
+ <DialogActions sx={{ p: 2 }}>
359
+ <Button onClick={onClose} disabled={loading}>
360
+ Cancel
361
+ </Button>
362
+ <Button
363
+ onClick={handleSubmit}
364
+ variant='contained'
365
+ disabled={loading || Object.keys(errors).length > 0}
366
+ startIcon={loading ? <CircularProgress size={20} /> : undefined}
367
+ >
368
+ {isEditMode ? 'Update' : 'Create'}
369
+ </Button>
370
+ </DialogActions>
371
+ </Dialog>
372
+ );
373
+ };