unleash-server 5.8.2 → 5.9.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 (1000) hide show
  1. package/dist/lib/addons/addon.d.ts.map +1 -1
  2. package/dist/lib/addons/addon.js +1 -0
  3. package/dist/lib/addons/addon.js.map +1 -1
  4. package/dist/lib/addons/datadog.d.ts.map +1 -1
  5. package/dist/lib/addons/datadog.js.map +1 -1
  6. package/dist/lib/addons/feature-event-formatter-md.d.ts.map +1 -1
  7. package/dist/lib/addons/feature-event-formatter-md.js +5 -1
  8. package/dist/lib/addons/feature-event-formatter-md.js.map +1 -1
  9. package/dist/lib/addons/feature-event-formatter-md.test.js +18 -0
  10. package/dist/lib/addons/feature-event-formatter-md.test.js.map +1 -1
  11. package/dist/lib/addons/slack-app-definition.d.ts.map +1 -1
  12. package/dist/lib/addons/slack-app-definition.js +1 -0
  13. package/dist/lib/addons/slack-app-definition.js.map +1 -1
  14. package/dist/lib/addons/slack-app.test.js +9 -2
  15. package/dist/lib/addons/slack-app.test.js.map +1 -1
  16. package/dist/lib/addons/webhook-definition.d.ts.map +1 -1
  17. package/dist/lib/addons/webhook-definition.js +1 -0
  18. package/dist/lib/addons/webhook-definition.js.map +1 -1
  19. package/dist/lib/addons/webhook.js.map +1 -1
  20. package/dist/lib/app.d.ts +1 -1
  21. package/dist/lib/app.d.ts.map +1 -1
  22. package/dist/lib/app.js.map +1 -1
  23. package/dist/lib/create-config.d.ts.map +1 -1
  24. package/dist/lib/create-config.js +3 -1
  25. package/dist/lib/create-config.js.map +1 -1
  26. package/dist/lib/db/access-store.d.ts +1 -1
  27. package/dist/lib/db/access-store.d.ts.map +1 -1
  28. package/dist/lib/db/access-store.js +3 -4
  29. package/dist/lib/db/access-store.js.map +1 -1
  30. package/dist/lib/db/access-store.test.js +1 -1
  31. package/dist/lib/db/access-store.test.js.map +1 -1
  32. package/dist/lib/db/client-applications-store.d.ts.map +1 -1
  33. package/dist/lib/db/client-applications-store.js.map +1 -1
  34. package/dist/lib/db/client-instance-store.d.ts +1 -0
  35. package/dist/lib/db/client-instance-store.d.ts.map +1 -1
  36. package/dist/lib/db/client-instance-store.js +9 -0
  37. package/dist/lib/db/client-instance-store.js.map +1 -1
  38. package/dist/lib/db/event-store.d.ts +2 -95
  39. package/dist/lib/db/event-store.d.ts.map +1 -1
  40. package/dist/lib/db/event-store.js +21 -293
  41. package/dist/lib/db/event-store.js.map +1 -1
  42. package/dist/lib/db/feature-environment-store.d.ts.map +1 -1
  43. package/dist/lib/db/feature-environment-store.js +7 -3
  44. package/dist/lib/db/feature-environment-store.js.map +1 -1
  45. package/dist/lib/db/feature-strategy-store.test.js +2 -6
  46. package/dist/lib/db/feature-strategy-store.test.js.map +1 -1
  47. package/dist/lib/db/index.js +5 -5
  48. package/dist/lib/db/index.js.map +1 -1
  49. package/dist/lib/db/project-stats-store.d.ts +3 -3
  50. package/dist/lib/db/project-stats-store.d.ts.map +1 -1
  51. package/dist/lib/db/project-store.d.ts.map +1 -1
  52. package/dist/lib/db/project-store.js +10 -1
  53. package/dist/lib/db/project-store.js.map +1 -1
  54. package/dist/lib/db/role-store.d.ts +4 -4
  55. package/dist/lib/db/role-store.d.ts.map +1 -1
  56. package/dist/lib/db/segment-store.d.ts.map +1 -1
  57. package/dist/lib/db/segment-store.js +1 -2
  58. package/dist/lib/db/segment-store.js.map +1 -1
  59. package/dist/lib/db/segment-store.test.js +5 -3
  60. package/dist/lib/db/segment-store.test.js.map +1 -1
  61. package/dist/lib/db/transaction.d.ts +1 -1
  62. package/dist/lib/db/transaction.d.ts.map +1 -1
  63. package/dist/lib/domain/project-health/project-health.d.ts +2 -2
  64. package/dist/lib/domain/project-health/project-health.d.ts.map +1 -1
  65. package/dist/lib/error/archivedfeature-error.d.ts +7 -0
  66. package/dist/lib/error/archivedfeature-error.d.ts.map +1 -0
  67. package/dist/lib/error/archivedfeature-error.js +12 -0
  68. package/dist/lib/error/archivedfeature-error.js.map +1 -0
  69. package/dist/lib/error/permission-error.js +1 -2
  70. package/dist/lib/error/permission-error.js.map +1 -1
  71. package/dist/lib/features/access/createAccessService.d.ts +1 -1
  72. package/dist/lib/features/access/createAccessService.d.ts.map +1 -1
  73. package/dist/lib/features/access/createAccessService.js +2 -5
  74. package/dist/lib/features/access/createAccessService.js.map +1 -1
  75. package/dist/lib/features/change-request-access-service/createChangeRequestAccessReadModel.d.ts +1 -1
  76. package/dist/lib/features/change-request-access-service/createChangeRequestAccessReadModel.d.ts.map +1 -1
  77. package/dist/lib/features/change-request-segment-usage-service/createChangeRequestSegmentUsageReadModel.d.ts +1 -1
  78. package/dist/lib/features/change-request-segment-usage-service/createChangeRequestSegmentUsageReadModel.d.ts.map +1 -1
  79. package/dist/lib/features/client-feature-toggles/client-feature-toggle-service.d.ts.map +1 -1
  80. package/dist/lib/features/client-feature-toggles/client-feature-toggle-service.js.map +1 -1
  81. package/dist/lib/features/client-feature-toggles/client-feature-toggle.controller.d.ts.map +1 -1
  82. package/dist/lib/features/client-feature-toggles/client-feature-toggle.controller.js.map +1 -1
  83. package/dist/lib/features/client-feature-toggles/tests/client-feature-toggle.e2e.test.js.map +1 -1
  84. package/dist/lib/features/client-feature-toggles/tests/client-feature-toggles.e2e.test.js.map +1 -1
  85. package/dist/lib/features/dependent-features/createDependentFeaturesService.d.ts.map +1 -1
  86. package/dist/lib/features/dependent-features/createDependentFeaturesService.js +3 -21
  87. package/dist/lib/features/dependent-features/createDependentFeaturesService.js.map +1 -1
  88. package/dist/lib/features/dependent-features/dependent-features-read-model-type.d.ts.map +1 -1
  89. package/dist/lib/features/dependent-features/dependent-features-read-model.d.ts.map +1 -1
  90. package/dist/lib/features/dependent-features/dependent-features-read-model.js.map +1 -1
  91. package/dist/lib/features/dependent-features/fake-dependent-features-read-model.d.ts.map +1 -1
  92. package/dist/lib/features/dependent-features/fake-dependent-features-read-model.js.map +1 -1
  93. package/dist/lib/features/events/createEventsService.d.ts +6 -0
  94. package/dist/lib/features/events/createEventsService.d.ts.map +1 -0
  95. package/dist/lib/features/events/createEventsService.js +24 -0
  96. package/dist/lib/features/events/createEventsService.js.map +1 -0
  97. package/dist/lib/features/events/event-created-by-migration.test.d.ts +2 -0
  98. package/dist/lib/features/events/event-created-by-migration.test.d.ts.map +1 -0
  99. package/dist/lib/features/events/event-created-by-migration.test.js +130 -0
  100. package/dist/lib/features/events/event-created-by-migration.test.js.map +1 -0
  101. package/dist/lib/features/events/event-service.d.ts +35 -0
  102. package/dist/lib/features/events/event-service.d.ts.map +1 -0
  103. package/dist/lib/features/events/event-service.js +103 -0
  104. package/dist/lib/features/events/event-service.js.map +1 -0
  105. package/dist/lib/features/events/event-service.test.d.ts +2 -0
  106. package/dist/lib/features/events/event-service.test.d.ts.map +1 -0
  107. package/dist/lib/features/events/event-service.test.js +22 -0
  108. package/dist/lib/features/events/event-service.test.js.map +1 -0
  109. package/dist/lib/features/events/event-store.d.ts +100 -0
  110. package/dist/lib/features/events/event-store.d.ts.map +1 -0
  111. package/dist/lib/features/events/event-store.js +340 -0
  112. package/dist/lib/features/events/event-store.js.map +1 -0
  113. package/dist/lib/features/events/event-store.test.d.ts.map +1 -0
  114. package/dist/lib/{db → features/events}/event-store.test.js +9 -5
  115. package/dist/lib/features/events/event-store.test.js.map +1 -0
  116. package/dist/lib/features/export-import-toggles/createExportImportService.d.ts +1 -1
  117. package/dist/lib/features/export-import-toggles/createExportImportService.d.ts.map +1 -1
  118. package/dist/lib/features/export-import-toggles/createExportImportService.js +4 -6
  119. package/dist/lib/features/export-import-toggles/createExportImportService.js.map +1 -1
  120. package/dist/lib/features/export-import-toggles/export-import-permissions.e2e.test.js.map +1 -1
  121. package/dist/lib/features/export-import-toggles/export-import-service.d.ts.map +1 -1
  122. package/dist/lib/features/export-import-toggles/export-import-service.js +5 -1
  123. package/dist/lib/features/export-import-toggles/export-import-service.js.map +1 -1
  124. package/dist/lib/features/export-import-toggles/export-import.e2e.test.js +60 -0
  125. package/dist/lib/features/export-import-toggles/export-import.e2e.test.js.map +1 -1
  126. package/dist/lib/features/export-import-toggles/import-permissions-service.d.ts.map +1 -1
  127. package/dist/lib/features/export-import-toggles/import-permissions-service.js.map +1 -1
  128. package/dist/lib/features/feature-search/fake-feature-search-store.d.ts +1 -1
  129. package/dist/lib/features/feature-search/fake-feature-search-store.d.ts.map +1 -1
  130. package/dist/lib/features/feature-search/feature-search-controller.d.ts.map +1 -1
  131. package/dist/lib/features/feature-search/feature-search-controller.js +35 -38
  132. package/dist/lib/features/feature-search/feature-search-controller.js.map +1 -1
  133. package/dist/lib/features/feature-search/feature-search-store.d.ts.map +1 -1
  134. package/dist/lib/features/feature-search/feature-search-store.js.map +1 -1
  135. package/dist/lib/features/feature-search/feature.search.e2e.test.js +0 -1
  136. package/dist/lib/features/feature-search/feature.search.e2e.test.js.map +1 -1
  137. package/dist/lib/features/feature-toggle/archive-feature-toggle-controller.d.ts.map +1 -1
  138. package/dist/lib/features/feature-toggle/archive-feature-toggle-controller.js +1 -1
  139. package/dist/lib/features/feature-toggle/archive-feature-toggle-controller.js.map +1 -1
  140. package/dist/lib/features/feature-toggle/converters/feature-toggle-row-converter.d.ts +1 -1
  141. package/dist/lib/features/feature-toggle/createFeatureToggleService.d.ts.map +1 -1
  142. package/dist/lib/features/feature-toggle/createFeatureToggleService.js +6 -6
  143. package/dist/lib/features/feature-toggle/createFeatureToggleService.js.map +1 -1
  144. package/dist/lib/features/feature-toggle/fakes/fake-feature-toggle-store.d.ts +3 -2
  145. package/dist/lib/features/feature-toggle/fakes/fake-feature-toggle-store.d.ts.map +1 -1
  146. package/dist/lib/features/feature-toggle/fakes/fake-feature-toggle-store.js +3 -0
  147. package/dist/lib/features/feature-toggle/fakes/fake-feature-toggle-store.js.map +1 -1
  148. package/dist/lib/features/feature-toggle/feature-toggle-service.d.ts +7 -4
  149. package/dist/lib/features/feature-toggle/feature-toggle-service.d.ts.map +1 -1
  150. package/dist/lib/features/feature-toggle/feature-toggle-service.js +51 -7
  151. package/dist/lib/features/feature-toggle/feature-toggle-service.js.map +1 -1
  152. package/dist/lib/features/feature-toggle/feature-toggle-store.d.ts +2 -1
  153. package/dist/lib/features/feature-toggle/feature-toggle-store.d.ts.map +1 -1
  154. package/dist/lib/features/feature-toggle/feature-toggle-store.js +27 -0
  155. package/dist/lib/features/feature-toggle/feature-toggle-store.js.map +1 -1
  156. package/dist/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.js +3 -0
  157. package/dist/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.js.map +1 -1
  158. package/dist/lib/features/feature-toggle/tests/feature-toggle-store.e2e.test.js.map +1 -1
  159. package/dist/lib/features/feature-toggle/tests/feature-toggle-strategies-store.e2e.test.js +3 -3
  160. package/dist/lib/features/feature-toggle/tests/feature-toggle-strategies-store.e2e.test.js.map +1 -1
  161. package/dist/lib/features/feature-toggle/tests/feature-toggles.e2e.test.js +36 -0
  162. package/dist/lib/features/feature-toggle/tests/feature-toggles.e2e.test.js.map +1 -1
  163. package/dist/lib/features/feature-toggle/types/feature-toggle-store-type.d.ts +2 -1
  164. package/dist/lib/features/feature-toggle/types/feature-toggle-store-type.d.ts.map +1 -1
  165. package/dist/lib/features/feature-toggle/types/feature-toggle-strategies-store-type.d.ts.map +1 -1
  166. package/dist/lib/features/group/createGroupService.d.ts.map +1 -1
  167. package/dist/lib/features/group/createGroupService.js +3 -6
  168. package/dist/lib/features/group/createGroupService.js.map +1 -1
  169. package/dist/lib/features/index.d.ts +2 -0
  170. package/dist/lib/features/index.d.ts.map +1 -1
  171. package/dist/lib/features/index.js +2 -0
  172. package/dist/lib/features/index.js.map +1 -1
  173. package/dist/lib/features/instance-stats/createInstanceStatsService.d.ts +6 -0
  174. package/dist/lib/features/instance-stats/createInstanceStatsService.d.ts.map +1 -0
  175. package/dist/lib/features/instance-stats/createInstanceStatsService.js +129 -0
  176. package/dist/lib/features/instance-stats/createInstanceStatsService.js.map +1 -0
  177. package/dist/lib/features/instance-stats/getActiveUsers.d.ts +1 -1
  178. package/dist/lib/features/instance-stats/getActiveUsers.d.ts.map +1 -1
  179. package/dist/lib/features/instance-stats/getProductionChanges.d.ts +1 -1
  180. package/dist/lib/features/instance-stats/getProductionChanges.d.ts.map +1 -1
  181. package/dist/lib/features/instance-stats/getProductionChanges.js.map +1 -1
  182. package/dist/lib/features/instance-stats/instance-stats-service.d.ts +6 -1
  183. package/dist/lib/features/instance-stats/instance-stats-service.d.ts.map +1 -1
  184. package/dist/lib/features/instance-stats/instance-stats-service.js +5 -2
  185. package/dist/lib/features/instance-stats/instance-stats-service.js.map +1 -1
  186. package/dist/lib/features/maintenance/maintenance-controller.d.ts +1 -1
  187. package/dist/lib/features/maintenance/maintenance-controller.d.ts.map +1 -1
  188. package/dist/lib/features/maintenance/maintenance-service.js +1 -1
  189. package/dist/lib/features/maintenance/maintenance-service.js.map +1 -1
  190. package/dist/lib/features/metrics/client-metrics/client-metrics-service.e2e.test.d.ts.map +1 -0
  191. package/dist/{test/e2e/services → lib/features/metrics/client-metrics}/client-metrics-service.e2e.test.js +6 -6
  192. package/dist/lib/features/metrics/client-metrics/client-metrics-service.e2e.test.js.map +1 -0
  193. package/dist/lib/{types/stores/client-metrics-store-v2.d.ts → features/metrics/client-metrics/client-metrics-store-v2-type.d.ts} +13 -2
  194. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2-type.d.ts.map +1 -0
  195. package/dist/lib/{types/stores/client-metrics-store-v2.js → features/metrics/client-metrics/client-metrics-store-v2-type.js} +1 -1
  196. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2-type.js.map +1 -0
  197. package/dist/lib/{db → features/metrics/client-metrics}/client-metrics-store-v2.d.ts +15 -4
  198. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2.d.ts.map +1 -0
  199. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2.e2e.test.d.ts.map +1 -0
  200. package/dist/{test/e2e/stores → lib/features/metrics/client-metrics}/client-metrics-store-v2.e2e.test.js +2 -2
  201. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2.e2e.test.js.map +1 -0
  202. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2.js +300 -0
  203. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2.js.map +1 -0
  204. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2.test.d.ts +2 -0
  205. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2.test.d.ts.map +1 -0
  206. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2.test.js +202 -0
  207. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2.test.js.map +1 -0
  208. package/dist/lib/{routes/admin-api → features/metrics/client-metrics}/client-metrics.d.ts +7 -5
  209. package/dist/lib/features/metrics/client-metrics/client-metrics.d.ts.map +1 -0
  210. package/dist/lib/features/metrics/client-metrics/client-metrics.e2e.test.d.ts.map +1 -0
  211. package/dist/{test/e2e/api/admin → lib/features/metrics/client-metrics}/client-metrics.e2e.test.js +8 -4
  212. package/dist/lib/features/metrics/client-metrics/client-metrics.e2e.test.js.map +1 -0
  213. package/dist/lib/{routes/admin-api → features/metrics/client-metrics}/client-metrics.js +13 -9
  214. package/dist/lib/{routes/admin-api → features/metrics/client-metrics}/client-metrics.js.map +1 -1
  215. package/dist/lib/{util → features/metrics/client-metrics}/collapseHourlyMetrics.d.ts +1 -1
  216. package/dist/lib/features/metrics/client-metrics/collapseHourlyMetrics.d.ts.map +1 -0
  217. package/dist/lib/features/metrics/client-metrics/collapseHourlyMetrics.js.map +1 -0
  218. package/dist/lib/features/metrics/client-metrics/collapseHourlyMetrics.test.d.ts.map +1 -0
  219. package/dist/lib/features/metrics/client-metrics/collapseHourlyMetrics.test.js.map +1 -0
  220. package/dist/{test/fixtures → lib/features/metrics/client-metrics}/fake-client-metrics-store-v2.d.ts +12 -1
  221. package/dist/lib/features/metrics/client-metrics/fake-client-metrics-store-v2.d.ts.map +1 -0
  222. package/dist/{test/fixtures → lib/features/metrics/client-metrics}/fake-client-metrics-store-v2.js +15 -0
  223. package/dist/lib/features/metrics/client-metrics/fake-client-metrics-store-v2.js.map +1 -0
  224. package/dist/lib/{services → features/metrics}/client-metrics/metrics-service-v2.d.ts +11 -8
  225. package/dist/lib/features/metrics/client-metrics/metrics-service-v2.d.ts.map +1 -0
  226. package/dist/lib/{services → features/metrics}/client-metrics/metrics-service-v2.js +54 -9
  227. package/dist/lib/features/metrics/client-metrics/metrics-service-v2.js.map +1 -0
  228. package/dist/lib/features/metrics/client-metrics/metrics-service-v2.test.d.ts.map +1 -0
  229. package/dist/lib/features/metrics/client-metrics/metrics-service-v2.test.js +271 -0
  230. package/dist/lib/features/metrics/client-metrics/metrics-service-v2.test.js.map +1 -0
  231. package/dist/lib/{services/client-metrics → features/metrics/instance}/instance-service.d.ts +9 -8
  232. package/dist/lib/features/metrics/instance/instance-service.d.ts.map +1 -0
  233. package/dist/lib/{services/client-metrics → features/metrics/instance}/instance-service.js +18 -5
  234. package/dist/lib/features/metrics/instance/instance-service.js.map +1 -0
  235. package/dist/lib/features/metrics/instance/instance-service.test.d.ts.map +1 -0
  236. package/dist/lib/{services/client-metrics → features/metrics/instance}/instance-service.test.js +18 -15
  237. package/dist/lib/features/metrics/instance/instance-service.test.js.map +1 -0
  238. package/dist/lib/{routes/client-api → features/metrics/instance}/metrics.d.ts +9 -7
  239. package/dist/lib/features/metrics/instance/metrics.d.ts.map +1 -0
  240. package/dist/lib/{routes/client-api → features/metrics/instance}/metrics.js +51 -4
  241. package/dist/lib/features/metrics/instance/metrics.js.map +1 -0
  242. package/dist/lib/features/metrics/instance/metrics.test.d.ts.map +1 -0
  243. package/dist/lib/{routes/client-api → features/metrics/instance}/metrics.test.js +124 -7
  244. package/dist/lib/features/metrics/instance/metrics.test.js.map +1 -0
  245. package/dist/lib/{services/client-metrics → features/metrics/instance}/models.d.ts +1 -1
  246. package/dist/lib/features/metrics/instance/models.d.ts.map +1 -0
  247. package/dist/lib/features/metrics/instance/models.js.map +1 -0
  248. package/dist/lib/{routes/client-api → features/metrics/instance}/register.d.ts +8 -8
  249. package/dist/lib/features/metrics/instance/register.d.ts.map +1 -0
  250. package/dist/lib/{routes/client-api → features/metrics/instance}/register.js +8 -7
  251. package/dist/lib/features/metrics/instance/register.js.map +1 -0
  252. package/dist/lib/features/metrics/instance/register.test.d.ts.map +1 -0
  253. package/dist/lib/{routes/client-api → features/metrics/instance}/register.test.js +20 -5
  254. package/dist/lib/features/metrics/instance/register.test.js.map +1 -0
  255. package/dist/lib/features/metrics/last-seen/createLastSeenService.d.ts.map +1 -0
  256. package/dist/lib/{services/client-metrics → features/metrics}/last-seen/createLastSeenService.js +2 -2
  257. package/dist/lib/features/metrics/last-seen/createLastSeenService.js.map +1 -0
  258. package/dist/lib/features/metrics/last-seen/fake-last-seen-read-model.d.ts.map +1 -0
  259. package/dist/lib/features/metrics/last-seen/fake-last-seen-read-model.js.map +1 -0
  260. package/dist/lib/features/metrics/last-seen/fake-last-seen-store.d.ts.map +1 -0
  261. package/dist/lib/features/metrics/last-seen/fake-last-seen-store.js.map +1 -0
  262. package/dist/lib/features/metrics/last-seen/last-seen-read-model.d.ts.map +1 -0
  263. package/dist/lib/features/metrics/last-seen/last-seen-read-model.js.map +1 -0
  264. package/dist/lib/{services/client-metrics → features/metrics}/last-seen/last-seen-service.d.ts +2 -2
  265. package/dist/lib/features/metrics/last-seen/last-seen-service.d.ts.map +1 -0
  266. package/dist/lib/features/metrics/last-seen/last-seen-service.js.map +1 -0
  267. package/dist/lib/features/metrics/last-seen/last-seen-store.d.ts.map +1 -0
  268. package/dist/lib/{services/client-metrics → features/metrics}/last-seen/last-seen-store.js +1 -1
  269. package/dist/lib/features/metrics/last-seen/last-seen-store.js.map +1 -0
  270. package/dist/lib/features/metrics/last-seen/tests/last-seen-service.e2e.test.d.ts.map +1 -0
  271. package/dist/lib/features/metrics/last-seen/tests/last-seen-service.e2e.test.js.map +1 -0
  272. package/dist/lib/features/metrics/last-seen/tests/last-seen-service.test.d.ts.map +1 -0
  273. package/dist/lib/features/metrics/last-seen/tests/last-seen-service.test.js.map +1 -0
  274. package/dist/lib/features/metrics/last-seen/types/last-seen-read-model-type.d.ts.map +1 -0
  275. package/dist/lib/features/metrics/last-seen/types/last-seen-read-model-type.js.map +1 -0
  276. package/dist/lib/features/metrics/last-seen/types/last-seen-store-type.d.ts.map +1 -0
  277. package/dist/lib/features/metrics/last-seen/types/last-seen-store-type.js.map +1 -0
  278. package/dist/lib/{services/client-metrics → features/metrics/shared}/schema.d.ts +1 -1
  279. package/dist/lib/features/metrics/shared/schema.d.ts.map +1 -0
  280. package/dist/lib/features/metrics/shared/schema.js.map +1 -0
  281. package/dist/lib/features/metrics/shared/schema.test.d.ts.map +1 -0
  282. package/dist/lib/features/metrics/shared/schema.test.js.map +1 -0
  283. package/dist/lib/features/playground/advanced-playground.test.js +12 -13
  284. package/dist/lib/features/playground/advanced-playground.test.js.map +1 -1
  285. package/dist/lib/features/playground/feature-evaluator/client.d.ts +2 -2
  286. package/dist/lib/features/playground/feature-evaluator/client.d.ts.map +1 -1
  287. package/dist/lib/features/playground/feature-evaluator/client.js +17 -7
  288. package/dist/lib/features/playground/feature-evaluator/client.js.map +1 -1
  289. package/dist/lib/features/playground/feature-evaluator/feature-evaluator.d.ts.map +1 -1
  290. package/dist/lib/features/playground/feature-evaluator/feature-evaluator.js +3 -2
  291. package/dist/lib/features/playground/feature-evaluator/feature-evaluator.js.map +1 -1
  292. package/dist/lib/features/playground/feature-evaluator/repository/index.d.ts.map +1 -1
  293. package/dist/lib/features/playground/feature-evaluator/repository/storage-provider.js.map +1 -1
  294. package/dist/lib/features/playground/feature-evaluator/strategy/strategy.d.ts +2 -2
  295. package/dist/lib/features/playground/feature-evaluator/strategy/strategy.d.ts.map +1 -1
  296. package/dist/lib/features/playground/feature-evaluator/variant.d.ts +5 -0
  297. package/dist/lib/features/playground/feature-evaluator/variant.d.ts.map +1 -1
  298. package/dist/lib/features/playground/feature-evaluator/variant.js.map +1 -1
  299. package/dist/lib/features/playground/offline-unleash-client.d.ts +3 -3
  300. package/dist/lib/features/playground/offline-unleash-client.d.ts.map +1 -1
  301. package/dist/lib/features/playground/offline-unleash-client.js +5 -2
  302. package/dist/lib/features/playground/offline-unleash-client.js.map +1 -1
  303. package/dist/lib/features/playground/offline-unleash-client.test.js +1 -1
  304. package/dist/lib/features/playground/offline-unleash-client.test.js.map +1 -1
  305. package/dist/lib/features/playground/playground-service.d.ts +6 -6
  306. package/dist/lib/features/playground/playground-service.d.ts.map +1 -1
  307. package/dist/lib/features/playground/playground-service.js +7 -3
  308. package/dist/lib/features/playground/playground-service.js.map +1 -1
  309. package/dist/lib/features/playground/playground-view-model.d.ts +1 -1
  310. package/dist/lib/features/playground/playground-view-model.d.ts.map +1 -1
  311. package/dist/lib/features/playground/playground.d.ts.map +1 -1
  312. package/dist/lib/features/playground/playground.js +2 -1
  313. package/dist/lib/features/playground/playground.js.map +1 -1
  314. package/dist/lib/features/private-project/createPrivateProjectChecker.d.ts +1 -1
  315. package/dist/lib/features/private-project/createPrivateProjectChecker.d.ts.map +1 -1
  316. package/dist/lib/features/private-project/privateProjectStore.js +1 -1
  317. package/dist/lib/features/private-project/privateProjectStore.js.map +1 -1
  318. package/dist/lib/features/project/createProjectService.d.ts +1 -1
  319. package/dist/lib/features/project/createProjectService.d.ts.map +1 -1
  320. package/dist/lib/features/project/createProjectService.js +2 -2
  321. package/dist/lib/features/project/createProjectService.js.map +1 -1
  322. package/dist/lib/features/project-environments/createEnvironmentService.d.ts.map +1 -1
  323. package/dist/lib/features/project-environments/createEnvironmentService.js +2 -8
  324. package/dist/lib/features/project-environments/createEnvironmentService.js.map +1 -1
  325. package/dist/lib/features/project-environments/environment-service.d.ts +1 -1
  326. package/dist/lib/features/project-environments/environment-service.d.ts.map +1 -1
  327. package/dist/lib/features/project-environments/environment-service.test.js.map +1 -1
  328. package/dist/lib/features/project-environments/environment-store.d.ts.map +1 -1
  329. package/dist/lib/features/project-environments/environment-store.js +12 -0
  330. package/dist/lib/features/project-environments/environment-store.js.map +1 -1
  331. package/dist/lib/features/project-environments/environments.d.ts.map +1 -1
  332. package/dist/lib/features/scheduler/schedule-services.d.ts.map +1 -1
  333. package/dist/lib/features/scheduler/schedule-services.js +3 -1
  334. package/dist/lib/features/scheduler/schedule-services.js.map +1 -1
  335. package/dist/lib/features/scheduler/scheduler-service.d.ts +2 -1
  336. package/dist/lib/features/scheduler/scheduler-service.d.ts.map +1 -1
  337. package/dist/lib/features/scheduler/scheduler-service.js +42 -13
  338. package/dist/lib/features/scheduler/scheduler-service.js.map +1 -1
  339. package/dist/lib/features/scheduler/scheduler-service.test.js +35 -2
  340. package/dist/lib/features/scheduler/scheduler-service.test.js.map +1 -1
  341. package/dist/lib/features/segment/createSegmentService.d.ts +1 -1
  342. package/dist/lib/features/segment/createSegmentService.d.ts.map +1 -1
  343. package/dist/lib/features/segment/createSegmentService.js +2 -7
  344. package/dist/lib/features/segment/createSegmentService.js.map +1 -1
  345. package/dist/lib/features/segment/segment-controller.d.ts.map +1 -1
  346. package/dist/lib/features/segment/segment-controller.js +14 -25
  347. package/dist/lib/features/segment/segment-controller.js.map +1 -1
  348. package/dist/lib/features/tag-type/createTagTypeService.d.ts.map +1 -1
  349. package/dist/lib/features/tag-type/createTagTypeService.js +3 -17
  350. package/dist/lib/features/tag-type/createTagTypeService.js.map +1 -1
  351. package/dist/lib/features/tag-type/tag-type-service.d.ts +1 -1
  352. package/dist/lib/features/tag-type/tag-type-service.d.ts.map +1 -1
  353. package/dist/lib/features/tag-type/tag-types.e2e.test.js.map +1 -1
  354. package/dist/lib/metric-events.d.ts +3 -1
  355. package/dist/lib/metric-events.d.ts.map +1 -1
  356. package/dist/lib/metric-events.js +5 -1
  357. package/dist/lib/metric-events.js.map +1 -1
  358. package/dist/lib/metrics.d.ts +2 -3
  359. package/dist/lib/metrics.d.ts.map +1 -1
  360. package/dist/lib/metrics.js +150 -89
  361. package/dist/lib/metrics.js.map +1 -1
  362. package/dist/lib/metrics.test.js.map +1 -1
  363. package/dist/lib/middleware/api-token-middleware.d.ts +1 -1
  364. package/dist/lib/middleware/api-token-middleware.d.ts.map +1 -1
  365. package/dist/lib/middleware/demo-authentication.d.ts +1 -1
  366. package/dist/lib/middleware/demo-authentication.d.ts.map +1 -1
  367. package/dist/lib/middleware/demo-authentication.js +6 -2
  368. package/dist/lib/middleware/demo-authentication.js.map +1 -1
  369. package/dist/lib/middleware/pat-middleware.d.ts +4 -1
  370. package/dist/lib/middleware/pat-middleware.d.ts.map +1 -1
  371. package/dist/lib/middleware/pat-middleware.js +0 -1
  372. package/dist/lib/middleware/pat-middleware.js.map +1 -1
  373. package/dist/lib/middleware/pat-middleware.test.js +5 -0
  374. package/dist/lib/middleware/pat-middleware.test.js.map +1 -1
  375. package/dist/lib/middleware/response-time-metrics.d.ts +1 -1
  376. package/dist/lib/middleware/response-time-metrics.d.ts.map +1 -1
  377. package/dist/lib/middleware/response-time-metrics.js.map +1 -1
  378. package/dist/lib/middleware/session-db.js.map +1 -1
  379. package/dist/lib/openapi/spec/advanced-playground-environment-feature-schema.d.ts +4 -0
  380. package/dist/lib/openapi/spec/advanced-playground-environment-feature-schema.d.ts.map +1 -1
  381. package/dist/lib/openapi/spec/advanced-playground-environment-feature-schema.js +4 -0
  382. package/dist/lib/openapi/spec/advanced-playground-environment-feature-schema.js.map +1 -1
  383. package/dist/lib/openapi/spec/advanced-playground-feature-schema.d.ts +4 -0
  384. package/dist/lib/openapi/spec/advanced-playground-feature-schema.d.ts.map +1 -1
  385. package/dist/lib/openapi/spec/advanced-playground-response-schema.d.ts +8 -0
  386. package/dist/lib/openapi/spec/advanced-playground-response-schema.d.ts.map +1 -1
  387. package/dist/lib/openapi/spec/create-api-token-schema.d.ts +1 -1
  388. package/dist/lib/openapi/spec/event-schema.d.ts +1 -1
  389. package/dist/lib/openapi/spec/events-schema.d.ts +1 -1
  390. package/dist/lib/openapi/spec/feature-events-schema.d.ts +1 -1
  391. package/dist/lib/openapi/spec/feature-type-count-schema.d.ts.map +1 -1
  392. package/dist/lib/openapi/spec/feature-type-count-schema.js.map +1 -1
  393. package/dist/lib/openapi/spec/feature-type-count-schema.test.js.map +1 -1
  394. package/dist/lib/openapi/spec/instance-admin-stats-schema.d.ts +18 -0
  395. package/dist/lib/openapi/spec/instance-admin-stats-schema.d.ts.map +1 -1
  396. package/dist/lib/openapi/spec/instance-admin-stats-schema.js +18 -0
  397. package/dist/lib/openapi/spec/instance-admin-stats-schema.js.map +1 -1
  398. package/dist/lib/openapi/spec/playground-feature-schema.d.ts +11 -0
  399. package/dist/lib/openapi/spec/playground-feature-schema.d.ts.map +1 -1
  400. package/dist/lib/openapi/spec/playground-feature-schema.js +11 -0
  401. package/dist/lib/openapi/spec/playground-feature-schema.js.map +1 -1
  402. package/dist/lib/openapi/spec/playground-response-schema.d.ts +11 -0
  403. package/dist/lib/openapi/spec/playground-response-schema.d.ts.map +1 -1
  404. package/dist/lib/openapi/spec/project-overview-schema.test.js.map +1 -1
  405. package/dist/lib/openapi/spec/project-schema.d.ts +15 -0
  406. package/dist/lib/openapi/spec/project-schema.d.ts.map +1 -1
  407. package/dist/lib/openapi/spec/project-schema.js +15 -0
  408. package/dist/lib/openapi/spec/project-schema.js.map +1 -1
  409. package/dist/lib/openapi/spec/projects-schema.d.ts +15 -0
  410. package/dist/lib/openapi/spec/projects-schema.d.ts.map +1 -1
  411. package/dist/lib/openapi/spec/proxy-feature-schema.d.ts +12 -1
  412. package/dist/lib/openapi/spec/proxy-feature-schema.d.ts.map +1 -1
  413. package/dist/lib/openapi/spec/proxy-feature-schema.js +12 -1
  414. package/dist/lib/openapi/spec/proxy-feature-schema.js.map +1 -1
  415. package/dist/lib/openapi/spec/proxy-features-schema.d.ts +12 -1
  416. package/dist/lib/openapi/spec/proxy-features-schema.d.ts.map +1 -1
  417. package/dist/lib/openapi/spec/search-events-schema.d.ts +1 -1
  418. package/dist/lib/openapi/spec/state-schema.d.ts +15 -0
  419. package/dist/lib/openapi/spec/state-schema.d.ts.map +1 -1
  420. package/dist/lib/openapi/spec/ui-config-schema.d.ts +12 -1
  421. package/dist/lib/openapi/spec/ui-config-schema.d.ts.map +1 -1
  422. package/dist/lib/openapi/spec/variant-flag-schema.d.ts +12 -1
  423. package/dist/lib/openapi/spec/variant-flag-schema.d.ts.map +1 -1
  424. package/dist/lib/openapi/spec/variant-flag-schema.js +12 -1
  425. package/dist/lib/openapi/spec/variant-flag-schema.js.map +1 -1
  426. package/dist/lib/proxy/proxy-repository.d.ts.map +1 -1
  427. package/dist/lib/proxy/proxy-repository.js.map +1 -1
  428. package/dist/lib/routes/admin-api/addon.d.ts +1 -1
  429. package/dist/lib/routes/admin-api/addon.d.ts.map +1 -1
  430. package/dist/lib/routes/admin-api/api-token.d.ts +1 -0
  431. package/dist/lib/routes/admin-api/api-token.d.ts.map +1 -1
  432. package/dist/lib/routes/admin-api/api-token.js +5 -0
  433. package/dist/lib/routes/admin-api/api-token.js.map +1 -1
  434. package/dist/lib/routes/admin-api/api-token.test.d.ts +2 -0
  435. package/dist/lib/routes/admin-api/api-token.test.d.ts.map +1 -0
  436. package/dist/lib/routes/admin-api/api-token.test.js +105 -0
  437. package/dist/lib/routes/admin-api/api-token.test.js.map +1 -0
  438. package/dist/lib/routes/admin-api/config.d.ts +3 -1
  439. package/dist/lib/routes/admin-api/config.d.ts.map +1 -1
  440. package/dist/lib/routes/admin-api/config.js +15 -3
  441. package/dist/lib/routes/admin-api/config.js.map +1 -1
  442. package/dist/lib/routes/admin-api/config.test.js +44 -0
  443. package/dist/lib/routes/admin-api/config.test.js.map +1 -1
  444. package/dist/lib/routes/admin-api/context.d.ts +2 -2
  445. package/dist/lib/routes/admin-api/context.d.ts.map +1 -1
  446. package/dist/lib/routes/admin-api/context.js +1 -1
  447. package/dist/lib/routes/admin-api/context.js.map +1 -1
  448. package/dist/lib/routes/admin-api/context.test.js.map +1 -1
  449. package/dist/lib/routes/admin-api/index.js +1 -1
  450. package/dist/lib/routes/admin-api/index.js.map +1 -1
  451. package/dist/lib/routes/admin-api/instance-admin.d.ts.map +1 -1
  452. package/dist/lib/routes/admin-api/instance-admin.js +4 -0
  453. package/dist/lib/routes/admin-api/instance-admin.js.map +1 -1
  454. package/dist/lib/routes/admin-api/metrics.d.ts.map +1 -1
  455. package/dist/lib/routes/admin-api/metrics.js +2 -1
  456. package/dist/lib/routes/admin-api/metrics.js.map +1 -1
  457. package/dist/lib/routes/admin-api/metrics.test.js.map +1 -1
  458. package/dist/lib/routes/admin-api/project/project-api.d.ts +1 -1
  459. package/dist/lib/routes/admin-api/project/project-api.d.ts.map +1 -1
  460. package/dist/lib/routes/admin-api/project/project-api.js.map +1 -1
  461. package/dist/lib/routes/admin-api/project/variants.d.ts +2 -2
  462. package/dist/lib/routes/admin-api/project/variants.d.ts.map +1 -1
  463. package/dist/lib/routes/admin-api/public-signup.test.js +14 -3
  464. package/dist/lib/routes/admin-api/public-signup.test.js.map +1 -1
  465. package/dist/lib/routes/admin-api/state.d.ts.map +1 -1
  466. package/dist/lib/routes/admin-api/state.js +1 -0
  467. package/dist/lib/routes/admin-api/state.js.map +1 -1
  468. package/dist/lib/routes/admin-api/tag.test.js.map +1 -1
  469. package/dist/lib/routes/admin-api/telemetry.d.ts +2 -2
  470. package/dist/lib/routes/admin-api/telemetry.d.ts.map +1 -1
  471. package/dist/lib/routes/client-api/index.js +2 -2
  472. package/dist/lib/routes/client-api/index.js.map +1 -1
  473. package/dist/lib/routes/controller.d.ts.map +1 -1
  474. package/dist/lib/routes/controller.js.map +1 -1
  475. package/dist/lib/routes/edge-api/index.js +2 -2
  476. package/dist/lib/routes/edge-api/index.js.map +1 -1
  477. package/dist/lib/routes/health-check.test.js.map +1 -1
  478. package/dist/lib/routes/public-invite.test.js +7 -2
  479. package/dist/lib/routes/public-invite.test.js.map +1 -1
  480. package/dist/lib/segments/segment-service-interface.d.ts +3 -3
  481. package/dist/lib/segments/segment-service-interface.d.ts.map +1 -1
  482. package/dist/lib/server-impl.d.ts.map +1 -1
  483. package/dist/lib/server-impl.js +4 -3
  484. package/dist/lib/server-impl.js.map +1 -1
  485. package/dist/lib/services/access-service.d.ts +10 -3
  486. package/dist/lib/services/access-service.d.ts.map +1 -1
  487. package/dist/lib/services/access-service.js.map +1 -1
  488. package/dist/lib/services/access-service.test.js +2 -5
  489. package/dist/lib/services/access-service.test.js.map +1 -1
  490. package/dist/lib/services/account-service.d.ts +1 -1
  491. package/dist/lib/services/account-service.d.ts.map +1 -1
  492. package/dist/lib/services/account-service.js.map +1 -1
  493. package/dist/lib/services/addon-service.d.ts +1 -1
  494. package/dist/lib/services/addon-service.d.ts.map +1 -1
  495. package/dist/lib/services/addon-service.test.js +6 -2
  496. package/dist/lib/services/addon-service.test.js.map +1 -1
  497. package/dist/lib/services/api-token-service.d.ts +9 -2
  498. package/dist/lib/services/api-token-service.d.ts.map +1 -1
  499. package/dist/lib/services/api-token-service.js +22 -3
  500. package/dist/lib/services/api-token-service.js.map +1 -1
  501. package/dist/lib/services/api-token-service.test.js +20 -5
  502. package/dist/lib/services/api-token-service.test.js.map +1 -1
  503. package/dist/lib/services/context-service.d.ts +1 -1
  504. package/dist/lib/services/context-service.d.ts.map +1 -1
  505. package/dist/lib/services/context-service.js.map +1 -1
  506. package/dist/lib/services/email-service.d.ts +1 -1
  507. package/dist/lib/services/email-service.d.ts.map +1 -1
  508. package/dist/lib/services/email-service.js +5 -1
  509. package/dist/lib/services/email-service.js.map +1 -1
  510. package/dist/lib/services/event-service.d.ts +3 -18
  511. package/dist/lib/services/event-service.d.ts.map +1 -1
  512. package/dist/lib/services/event-service.js +21 -58
  513. package/dist/lib/services/event-service.js.map +1 -1
  514. package/dist/lib/services/favorites-service.d.ts +1 -1
  515. package/dist/lib/services/favorites-service.d.ts.map +1 -1
  516. package/dist/lib/services/feature-service-potentially-stale.test.js +1 -1
  517. package/dist/lib/services/feature-service-potentially-stale.test.js.map +1 -1
  518. package/dist/lib/services/feature-tag-service.d.ts +1 -1
  519. package/dist/lib/services/feature-tag-service.d.ts.map +1 -1
  520. package/dist/lib/services/feature-type-service.d.ts +1 -1
  521. package/dist/lib/services/feature-type-service.d.ts.map +1 -1
  522. package/dist/lib/services/feature-type-service.js.map +1 -1
  523. package/dist/lib/services/group-service.d.ts +1 -1
  524. package/dist/lib/services/group-service.d.ts.map +1 -1
  525. package/dist/lib/services/index.d.ts +4 -4
  526. package/dist/lib/services/index.d.ts.map +1 -1
  527. package/dist/lib/services/index.js +9 -6
  528. package/dist/lib/services/index.js.map +1 -1
  529. package/dist/lib/services/pat-service.d.ts +1 -1
  530. package/dist/lib/services/pat-service.d.ts.map +1 -1
  531. package/dist/lib/services/project-service.d.ts +3 -3
  532. package/dist/lib/services/project-service.d.ts.map +1 -1
  533. package/dist/lib/services/proxy-service.d.ts.map +1 -1
  534. package/dist/lib/services/proxy-service.js.map +1 -1
  535. package/dist/lib/services/public-signup-token-service.d.ts +2 -2
  536. package/dist/lib/services/public-signup-token-service.d.ts.map +1 -1
  537. package/dist/lib/services/reset-token-service.js.map +1 -1
  538. package/dist/lib/services/segment-service.d.ts +2 -2
  539. package/dist/lib/services/segment-service.d.ts.map +1 -1
  540. package/dist/lib/services/segment-service.js +1 -2
  541. package/dist/lib/services/segment-service.js.map +1 -1
  542. package/dist/lib/services/setting-service.d.ts +1 -1
  543. package/dist/lib/services/setting-service.d.ts.map +1 -1
  544. package/dist/lib/services/state-service.d.ts +1 -1
  545. package/dist/lib/services/state-service.d.ts.map +1 -1
  546. package/dist/lib/services/state-service.js +1 -0
  547. package/dist/lib/services/state-service.js.map +1 -1
  548. package/dist/lib/services/state-service.test.js +14 -4
  549. package/dist/lib/services/state-service.test.js.map +1 -1
  550. package/dist/lib/services/state-util.d.ts.map +1 -1
  551. package/dist/lib/services/state-util.js.map +1 -1
  552. package/dist/lib/services/strategy-service.d.ts +1 -1
  553. package/dist/lib/services/strategy-service.d.ts.map +1 -1
  554. package/dist/lib/services/tag-service.d.ts +1 -1
  555. package/dist/lib/services/tag-service.d.ts.map +1 -1
  556. package/dist/lib/services/user-service.d.ts +1 -1
  557. package/dist/lib/services/user-service.d.ts.map +1 -1
  558. package/dist/lib/services/user-service.js +6 -3
  559. package/dist/lib/services/user-service.js.map +1 -1
  560. package/dist/lib/services/user-service.test.js +1 -1
  561. package/dist/lib/services/user-service.test.js.map +1 -1
  562. package/dist/lib/services/version-service.d.ts.map +1 -1
  563. package/dist/lib/services/version-service.js.map +1 -1
  564. package/dist/lib/types/api-user.d.ts +1 -0
  565. package/dist/lib/types/api-user.d.ts.map +1 -1
  566. package/dist/lib/types/api-user.js.map +1 -1
  567. package/dist/lib/types/core.d.ts +2 -1
  568. package/dist/lib/types/core.d.ts.map +1 -1
  569. package/dist/lib/types/core.js +10 -3
  570. package/dist/lib/types/core.js.map +1 -1
  571. package/dist/lib/types/core.test.d.ts +2 -0
  572. package/dist/lib/types/core.test.d.ts.map +1 -0
  573. package/dist/lib/types/core.test.js +62 -0
  574. package/dist/lib/types/core.test.js.map +1 -0
  575. package/dist/lib/types/events.d.ts +19 -2
  576. package/dist/lib/types/events.d.ts.map +1 -1
  577. package/dist/lib/types/events.js +10 -4
  578. package/dist/lib/types/events.js.map +1 -1
  579. package/dist/lib/types/experimental.d.ts +1 -1
  580. package/dist/lib/types/experimental.d.ts.map +1 -1
  581. package/dist/lib/types/experimental.js +29 -6
  582. package/dist/lib/types/experimental.js.map +1 -1
  583. package/dist/lib/types/model.d.ts +4 -1
  584. package/dist/lib/types/model.d.ts.map +1 -1
  585. package/dist/lib/types/models/api-token.js +1 -1
  586. package/dist/lib/types/models/api-token.js.map +1 -1
  587. package/dist/lib/types/no-auth-user.d.ts +0 -1
  588. package/dist/lib/types/no-auth-user.d.ts.map +1 -1
  589. package/dist/lib/types/no-auth-user.js +1 -3
  590. package/dist/lib/types/no-auth-user.js.map +1 -1
  591. package/dist/lib/types/option.d.ts +2 -1
  592. package/dist/lib/types/option.d.ts.map +1 -1
  593. package/dist/lib/types/permissions.d.ts +8 -0
  594. package/dist/lib/types/permissions.d.ts.map +1 -1
  595. package/dist/lib/types/permissions.js +9 -1
  596. package/dist/lib/types/permissions.js.map +1 -1
  597. package/dist/lib/types/services.d.ts +9 -9
  598. package/dist/lib/types/services.d.ts.map +1 -1
  599. package/dist/lib/types/stores/access-store.d.ts +1 -1
  600. package/dist/lib/types/stores/access-store.d.ts.map +1 -1
  601. package/dist/lib/types/stores/client-instance-store.d.ts +1 -0
  602. package/dist/lib/types/stores/client-instance-store.d.ts.map +1 -1
  603. package/dist/lib/types/stores/event-store.d.ts +2 -1
  604. package/dist/lib/types/stores/event-store.d.ts.map +1 -1
  605. package/dist/lib/types/stores/project-stats-store-type.d.ts +2 -2
  606. package/dist/lib/types/stores/project-stats-store-type.d.ts.map +1 -1
  607. package/dist/lib/types/stores/role-store.d.ts +1 -1
  608. package/dist/lib/types/stores/role-store.d.ts.map +1 -1
  609. package/dist/lib/types/stores/strategy-store.d.ts +1 -1
  610. package/dist/lib/types/stores/strategy-store.d.ts.map +1 -1
  611. package/dist/lib/types/stores.d.ts +2 -2
  612. package/dist/lib/types/stores.d.ts.map +1 -1
  613. package/dist/lib/util/anonymise.d.ts +1 -0
  614. package/dist/lib/util/anonymise.d.ts.map +1 -1
  615. package/dist/lib/util/anonymise.js +13 -1
  616. package/dist/lib/util/anonymise.js.map +1 -1
  617. package/dist/lib/util/constants.d.ts +1 -0
  618. package/dist/lib/util/constants.d.ts.map +1 -1
  619. package/dist/lib/util/constants.js +2 -1
  620. package/dist/lib/util/constants.js.map +1 -1
  621. package/dist/lib/util/extract-user.d.ts +6 -6
  622. package/dist/lib/util/extract-user.d.ts.map +1 -1
  623. package/dist/lib/util/extract-user.js +3 -1
  624. package/dist/lib/util/extract-user.js.map +1 -1
  625. package/dist/lib/util/flag-resolver.js +1 -1
  626. package/dist/lib/util/flag-resolver.js.map +1 -1
  627. package/dist/lib/util/flag-resolver.test.js +34 -0
  628. package/dist/lib/util/flag-resolver.test.js.map +1 -1
  629. package/dist/lib/util/index.d.ts +1 -1
  630. package/dist/lib/util/index.d.ts.map +1 -1
  631. package/dist/lib/util/index.js +1 -1
  632. package/dist/lib/util/index.js.map +1 -1
  633. package/dist/lib/util/metrics/createCounter.d.ts +15 -0
  634. package/dist/lib/util/metrics/createCounter.d.ts.map +1 -0
  635. package/dist/lib/util/metrics/createCounter.js +48 -0
  636. package/dist/lib/util/metrics/createCounter.js.map +1 -0
  637. package/dist/lib/util/metrics/createGauge.d.ts +15 -0
  638. package/dist/lib/util/metrics/createGauge.d.ts.map +1 -0
  639. package/dist/lib/util/metrics/createGauge.js +45 -0
  640. package/dist/lib/util/metrics/createGauge.js.map +1 -0
  641. package/dist/lib/util/metrics/createSummary.d.ts +14 -0
  642. package/dist/lib/util/metrics/createSummary.d.ts.map +1 -0
  643. package/dist/lib/util/metrics/createSummary.js +39 -0
  644. package/dist/lib/util/metrics/createSummary.js.map +1 -0
  645. package/dist/lib/util/metrics/index.d.ts +4 -0
  646. package/dist/lib/util/metrics/index.d.ts.map +1 -0
  647. package/dist/lib/util/metrics/index.js +20 -0
  648. package/dist/lib/util/metrics/index.js.map +1 -0
  649. package/dist/lib/util/omit-keys.d.ts.map +1 -1
  650. package/dist/lib/util/omit-keys.js.map +1 -1
  651. package/dist/lib/util/time-utils.d.ts +1 -0
  652. package/dist/lib/util/time-utils.d.ts.map +1 -1
  653. package/dist/lib/util/time-utils.js +11 -1
  654. package/dist/lib/util/time-utils.js.map +1 -1
  655. package/dist/lib/util/time-utils.test.js +7 -0
  656. package/dist/lib/util/time-utils.test.js.map +1 -1
  657. package/dist/lib/util/timer.test.js.map +1 -1
  658. package/dist/mailtemplates/scheduled-change-conflict/scheduled-change-conflict.html.mustache +91 -206
  659. package/dist/mailtemplates/scheduled-change-conflict/scheduled-change-conflict.plain.mustache +4 -0
  660. package/dist/mailtemplates/scheduled-execution-failed/scheduled-execution-failed.html.mustache +83 -202
  661. package/dist/mailtemplates/scheduled-execution-failed/scheduled-execution-failed.plain.mustache +0 -1
  662. package/dist/migrations/20240108151652-add-daily-metrics.d.ts +3 -0
  663. package/dist/migrations/20240108151652-add-daily-metrics.d.ts.map +1 -0
  664. package/dist/migrations/20240108151652-add-daily-metrics.js +40 -0
  665. package/dist/migrations/20240108151652-add-daily-metrics.js.map +1 -0
  666. package/dist/migrations/20240109093021-incoming-webhooks-description.d.ts +3 -0
  667. package/dist/migrations/20240109093021-incoming-webhooks-description.d.ts.map +1 -0
  668. package/dist/migrations/20240109093021-incoming-webhooks-description.js +10 -0
  669. package/dist/migrations/20240109093021-incoming-webhooks-description.js.map +1 -0
  670. package/dist/migrations/20240109095348-add-reason-column-to-schedule.d.ts +3 -0
  671. package/dist/migrations/20240109095348-add-reason-column-to-schedule.d.ts.map +1 -0
  672. package/dist/migrations/20240109095348-add-reason-column-to-schedule.js +9 -0
  673. package/dist/migrations/20240109095348-add-reason-column-to-schedule.js.map +1 -0
  674. package/dist/migrations/20240111075911-update-system-user-email.d.ts +3 -0
  675. package/dist/migrations/20240111075911-update-system-user-email.d.ts.map +1 -0
  676. package/dist/migrations/20240111075911-update-system-user-email.js +8 -0
  677. package/dist/migrations/20240111075911-update-system-user-email.js.map +1 -0
  678. package/dist/migrations/20240111125100-automated-actions.d.ts +3 -0
  679. package/dist/migrations/20240111125100-automated-actions.d.ts.map +1 -0
  680. package/dist/migrations/20240111125100-automated-actions.js +39 -0
  681. package/dist/migrations/20240111125100-automated-actions.js.map +1 -0
  682. package/dist/migrations/20240116104456-drop-unused-column-permissionid.d.ts +3 -0
  683. package/dist/migrations/20240116104456-drop-unused-column-permissionid.d.ts.map +1 -0
  684. package/dist/migrations/20240116104456-drop-unused-column-permissionid.js +14 -0
  685. package/dist/migrations/20240116104456-drop-unused-column-permissionid.js.map +1 -0
  686. package/dist/migrations/20240116154700-unleash-admin-token-user.d.ts +3 -0
  687. package/dist/migrations/20240116154700-unleash-admin-token-user.d.ts.map +1 -0
  688. package/dist/migrations/20240116154700-unleash-admin-token-user.js +15 -0
  689. package/dist/migrations/20240116154700-unleash-admin-token-user.js.map +1 -0
  690. package/dist/migrations/20240117093601-add-more-granular-project-permissions.d.ts +3 -0
  691. package/dist/migrations/20240117093601-add-more-granular-project-permissions.d.ts.map +1 -0
  692. package/dist/migrations/20240117093601-add-more-granular-project-permissions.js +27 -0
  693. package/dist/migrations/20240117093601-add-more-granular-project-permissions.js.map +1 -0
  694. package/dist/migrations/20240118093611-missing-primary-keys.d.ts +3 -0
  695. package/dist/migrations/20240118093611-missing-primary-keys.d.ts.map +1 -0
  696. package/dist/migrations/20240118093611-missing-primary-keys.js +17 -0
  697. package/dist/migrations/20240118093611-missing-primary-keys.js.map +1 -0
  698. package/dist/migrations/20240119171200-action-states.d.ts +3 -0
  699. package/dist/migrations/20240119171200-action-states.d.ts.map +1 -0
  700. package/dist/migrations/20240119171200-action-states.js +23 -0
  701. package/dist/migrations/20240119171200-action-states.js.map +1 -0
  702. package/dist/migrations/20240124123000-add-enabled-to-action-sets.d.ts +3 -0
  703. package/dist/migrations/20240124123000-add-enabled-to-action-sets.d.ts.map +1 -0
  704. package/dist/migrations/20240124123000-add-enabled-to-action-sets.js +12 -0
  705. package/dist/migrations/20240124123000-add-enabled-to-action-sets.js.map +1 -0
  706. package/dist/migrations/20240125084701-add-user-trends.d.ts +3 -0
  707. package/dist/migrations/20240125084701-add-user-trends.d.ts.map +1 -0
  708. package/dist/migrations/20240125084701-add-user-trends.js +14 -0
  709. package/dist/migrations/20240125084701-add-user-trends.js.map +1 -0
  710. package/dist/migrations/20240125085703-users-table-increae-image-url-size.d.ts +3 -0
  711. package/dist/migrations/20240125085703-users-table-increae-image-url-size.d.ts.map +1 -0
  712. package/dist/migrations/20240125085703-users-table-increae-image-url-size.js +14 -0
  713. package/dist/migrations/20240125085703-users-table-increae-image-url-size.js.map +1 -0
  714. package/dist/migrations/20240125090553-events-fix-incorrectly-assigned-sysuser-id.d.ts +3 -0
  715. package/dist/migrations/20240125090553-events-fix-incorrectly-assigned-sysuser-id.d.ts.map +1 -0
  716. package/dist/migrations/20240125090553-events-fix-incorrectly-assigned-sysuser-id.js +18 -0
  717. package/dist/migrations/20240125090553-events-fix-incorrectly-assigned-sysuser-id.js.map +1 -0
  718. package/dist/migrations/20240125100000-events-system-user-old2new.d.ts +3 -0
  719. package/dist/migrations/20240125100000-events-system-user-old2new.d.ts.map +1 -0
  720. package/dist/migrations/20240125100000-events-system-user-old2new.js +10 -0
  721. package/dist/migrations/20240125100000-events-system-user-old2new.js.map +1 -0
  722. package/dist/migrations/20240126095544-add-flag-trends.d.ts +3 -0
  723. package/dist/migrations/20240126095544-add-flag-trends.d.ts.map +1 -0
  724. package/dist/migrations/20240126095544-add-flag-trends.js +17 -0
  725. package/dist/migrations/20240126095544-add-flag-trends.js.map +1 -0
  726. package/dist/migrations/20240130104757-flag-trends-health-time-to-production.d.ts +3 -0
  727. package/dist/migrations/20240130104757-flag-trends-health-time-to-production.d.ts.map +1 -0
  728. package/dist/migrations/20240130104757-flag-trends-health-time-to-production.js +14 -0
  729. package/dist/migrations/20240130104757-flag-trends-health-time-to-production.js.map +1 -0
  730. package/dist/migrator.js +1 -1
  731. package/dist/migrator.js.map +1 -1
  732. package/dist/server-dev.js +2 -3
  733. package/dist/server-dev.js.map +1 -1
  734. package/dist/test/arbitraries.test.d.ts +2 -2
  735. package/dist/test/arbitraries.test.d.ts.map +1 -1
  736. package/dist/test/config/test-config.d.ts.map +1 -1
  737. package/dist/test/config/test-config.js +1 -0
  738. package/dist/test/config/test-config.js.map +1 -1
  739. package/dist/test/e2e/api/admin/addon.e2e.test.js +1 -1
  740. package/dist/test/e2e/api/admin/addon.e2e.test.js.map +1 -1
  741. package/dist/test/e2e/api/admin/api-token.auth.e2e.test.js +102 -0
  742. package/dist/test/e2e/api/admin/api-token.auth.e2e.test.js.map +1 -1
  743. package/dist/test/e2e/api/admin/api-token.e2e.test.js +6 -0
  744. package/dist/test/e2e/api/admin/api-token.e2e.test.js.map +1 -1
  745. package/dist/test/e2e/api/admin/constraints.e2e.test.js.map +1 -1
  746. package/dist/test/e2e/api/admin/context.e2e.test.js.map +1 -1
  747. package/dist/test/e2e/api/admin/event.e2e.test.js +5 -1
  748. package/dist/test/e2e/api/admin/event.e2e.test.js.map +1 -1
  749. package/dist/test/e2e/api/admin/favorites.e2e.test.js.map +1 -1
  750. package/dist/test/e2e/api/admin/feature-type.test.js.map +1 -1
  751. package/dist/test/e2e/api/admin/feature.auth.e2e.test.js.map +1 -1
  752. package/dist/test/e2e/api/admin/feature.custom-auth.e2e.test.js.map +1 -1
  753. package/dist/test/e2e/api/admin/feedback.e2e.test.js.map +1 -1
  754. package/dist/test/e2e/api/admin/instance-admin.e2e.test.js +10 -4
  755. package/dist/test/e2e/api/admin/instance-admin.e2e.test.js.map +1 -1
  756. package/dist/test/e2e/api/admin/project/api-token.e2e.test.js.map +1 -1
  757. package/dist/test/e2e/api/admin/project/project.health.e2e.test.js.map +1 -1
  758. package/dist/test/e2e/api/admin/public-signup-token.e2e.test.js +3 -7
  759. package/dist/test/e2e/api/admin/public-signup-token.e2e.test.js.map +1 -1
  760. package/dist/test/e2e/api/admin/segment.e2e.test.js +2 -5
  761. package/dist/test/e2e/api/admin/segment.e2e.test.js.map +1 -1
  762. package/dist/test/e2e/api/admin/splash.e2e.test.js.map +1 -1
  763. package/dist/test/e2e/api/admin/strategy.e2e.test.js.map +1 -1
  764. package/dist/test/e2e/api/admin/tags.e2e.test.js +1 -1
  765. package/dist/test/e2e/api/admin/tags.e2e.test.js.map +1 -1
  766. package/dist/test/e2e/api/admin/user/pat.e2e.test.js +1 -1
  767. package/dist/test/e2e/api/admin/user/pat.e2e.test.js.map +1 -1
  768. package/dist/test/e2e/api/admin/user/user.test.js.map +1 -1
  769. package/dist/test/e2e/api/admin/user-admin.e2e.test.js +1 -1
  770. package/dist/test/e2e/api/admin/user-admin.e2e.test.js.map +1 -1
  771. package/dist/test/e2e/api/auth/reset-password-controller.e2e.test.js +1 -1
  772. package/dist/test/e2e/api/auth/reset-password-controller.e2e.test.js.map +1 -1
  773. package/dist/test/e2e/api/auth/simple-password-provider.e2e.test.js.map +1 -1
  774. package/dist/test/e2e/api/client/metrics.e2e.test.js.map +1 -1
  775. package/dist/test/e2e/api/client/metricsV2.e2e.test.js +7 -6
  776. package/dist/test/e2e/api/client/metricsV2.e2e.test.js.map +1 -1
  777. package/dist/test/e2e/api/client/register.e2e.test.js +1 -0
  778. package/dist/test/e2e/api/client/register.e2e.test.js.map +1 -1
  779. package/dist/test/e2e/api/client/segment.e2e.test.js +1 -3
  780. package/dist/test/e2e/api/client/segment.e2e.test.js.map +1 -1
  781. package/dist/test/e2e/api/openapi/openapi.e2e.test.js.map +1 -1
  782. package/dist/test/e2e/api/proxy/proxy.e2e.test.js +84 -14
  783. package/dist/test/e2e/api/proxy/proxy.e2e.test.js.map +1 -1
  784. package/dist/test/e2e/custom-auth.test.js.map +1 -1
  785. package/dist/test/e2e/features-created-by-user-id-data-migration.e2e.test.d.ts +2 -0
  786. package/dist/test/e2e/features-created-by-user-id-data-migration.e2e.test.d.ts.map +1 -0
  787. package/dist/test/e2e/features-created-by-user-id-data-migration.e2e.test.js +223 -0
  788. package/dist/test/e2e/features-created-by-user-id-data-migration.e2e.test.js.map +1 -0
  789. package/dist/test/e2e/health.e2e.test.js.map +1 -1
  790. package/dist/test/e2e/helpers/app.utils.d.ts +1 -1
  791. package/dist/test/e2e/helpers/app.utils.d.ts.map +1 -1
  792. package/dist/test/e2e/helpers/database-init.d.ts +1 -1
  793. package/dist/test/e2e/helpers/database-init.d.ts.map +1 -1
  794. package/dist/test/e2e/helpers/database-init.js +2 -0
  795. package/dist/test/e2e/helpers/database-init.js.map +1 -1
  796. package/dist/test/e2e/helpers/test-helper.d.ts +4 -2
  797. package/dist/test/e2e/helpers/test-helper.d.ts.map +1 -1
  798. package/dist/test/e2e/helpers/test-helper.js.map +1 -1
  799. package/dist/test/e2e/migrator.e2e.test.js +27 -1
  800. package/dist/test/e2e/migrator.e2e.test.js.map +1 -1
  801. package/dist/test/e2e/routes/routes.test.js.map +1 -1
  802. package/dist/test/e2e/services/access-service.e2e.test.js +26 -8
  803. package/dist/test/e2e/services/access-service.e2e.test.js.map +1 -1
  804. package/dist/test/e2e/services/addon-service.e2e.test.js.map +1 -1
  805. package/dist/test/e2e/services/api-token-service.e2e.test.js.map +1 -1
  806. package/dist/test/e2e/services/group-service.e2e.test.js.map +1 -1
  807. package/dist/test/e2e/services/playground-service.test.d.ts +2 -2
  808. package/dist/test/e2e/services/playground-service.test.d.ts.map +1 -1
  809. package/dist/test/e2e/services/playground-service.test.js +7 -6
  810. package/dist/test/e2e/services/playground-service.test.js.map +1 -1
  811. package/dist/test/e2e/services/project-health-service.e2e.test.js +0 -5
  812. package/dist/test/e2e/services/project-health-service.e2e.test.js.map +1 -1
  813. package/dist/test/e2e/services/reset-token-service.e2e.test.js +6 -6
  814. package/dist/test/e2e/services/reset-token-service.e2e.test.js.map +1 -1
  815. package/dist/test/e2e/services/session-service.e2e.test.js.map +1 -1
  816. package/dist/test/e2e/services/setting-service.test.js.map +1 -1
  817. package/dist/test/e2e/services/state-service.e2e.test.js +9 -7
  818. package/dist/test/e2e/services/state-service.e2e.test.js.map +1 -1
  819. package/dist/test/e2e/services/user-service.e2e.test.js +48 -1
  820. package/dist/test/e2e/services/user-service.e2e.test.js.map +1 -1
  821. package/dist/test/e2e/stores/client-application-store.e2e.test.js +6 -2
  822. package/dist/test/e2e/stores/client-application-store.e2e.test.js.map +1 -1
  823. package/dist/test/e2e/stores/event-store.e2e.test.js.map +1 -1
  824. package/dist/test/e2e/stores/feature-environment-store.e2e.test.js +76 -0
  825. package/dist/test/e2e/stores/feature-environment-store.e2e.test.js.map +1 -1
  826. package/dist/test/e2e/stores/feature-tag-store.e2e.test.js.map +1 -1
  827. package/dist/test/e2e/stores/feature-toggle-client-store.e2e.test.js +1 -1
  828. package/dist/test/e2e/stores/feature-toggle-client-store.e2e.test.js.map +1 -1
  829. package/dist/test/e2e/stores/feature-type-store.e2e.test.js.map +1 -1
  830. package/dist/test/e2e/stores/project-store.e2e.test.js.map +1 -1
  831. package/dist/test/e2e/stores/setting-store.e2e.test.js.map +1 -1
  832. package/dist/test/e2e/stores/user-feedback-store.e2e.test.js.map +1 -1
  833. package/dist/test/e2e/stores/user-splash-store.e2e.test.js.map +1 -1
  834. package/dist/test/e2e/stores/user-store.e2e.test.js +4 -3
  835. package/dist/test/e2e/stores/user-store.e2e.test.js.map +1 -1
  836. package/dist/test/e2e/system-user-migration.test.js +1 -1
  837. package/dist/test/fixtures/fake-access-store.d.ts +1 -1
  838. package/dist/test/fixtures/fake-access-store.d.ts.map +1 -1
  839. package/dist/test/fixtures/fake-access-store.js.map +1 -1
  840. package/dist/test/fixtures/fake-client-instance-store.d.ts +1 -0
  841. package/dist/test/fixtures/fake-client-instance-store.d.ts.map +1 -1
  842. package/dist/test/fixtures/fake-client-instance-store.js +3 -0
  843. package/dist/test/fixtures/fake-client-instance-store.js.map +1 -1
  844. package/dist/test/fixtures/fake-event-store.d.ts +2 -1
  845. package/dist/test/fixtures/fake-event-store.d.ts.map +1 -1
  846. package/dist/test/fixtures/fake-event-store.js +3 -0
  847. package/dist/test/fixtures/fake-event-store.js.map +1 -1
  848. package/dist/test/fixtures/fake-favorite-features-store.d.ts.map +1 -1
  849. package/dist/test/fixtures/fake-favorite-features-store.js.map +1 -1
  850. package/dist/test/fixtures/fake-favorite-projects-store.d.ts.map +1 -1
  851. package/dist/test/fixtures/fake-favorite-projects-store.js.map +1 -1
  852. package/dist/test/fixtures/fake-project-stats-store.d.ts +2 -2
  853. package/dist/test/fixtures/fake-project-stats-store.d.ts.map +1 -1
  854. package/dist/test/fixtures/fake-project-store.d.ts +1 -1
  855. package/dist/test/fixtures/fake-project-store.d.ts.map +1 -1
  856. package/dist/test/fixtures/fake-project-store.js +8 -1
  857. package/dist/test/fixtures/fake-project-store.js.map +1 -1
  858. package/dist/test/fixtures/fake-role-store.d.ts +4 -4
  859. package/dist/test/fixtures/fake-role-store.d.ts.map +1 -1
  860. package/dist/test/fixtures/fake-strategies-store.js +1 -1
  861. package/dist/test/fixtures/fake-strategies-store.js.map +1 -1
  862. package/dist/test/fixtures/store.js +2 -2
  863. package/dist/test/fixtures/store.js.map +1 -1
  864. package/frontend/build/index.html +2 -2
  865. package/frontend/build/static/AdvancedPlayground-DoQ1u8B6.js +4 -0
  866. package/frontend/build/static/{CreateProject-aN-UGdcb.js → CreateProject-iLBz5afO.js} +2 -2
  867. package/frontend/build/static/{FeatureArchiveDialog-eHyhx7Yo.js → FeatureArchiveDialog-NSAcrt7Z.js} +2 -2
  868. package/frontend/build/static/FeatureMetricsChart-UhDepK_o.js +2 -0
  869. package/frontend/build/static/FeatureViewLazyExport-SpKYIb_J.js +25 -0
  870. package/frontend/build/static/LazyAdminExport-w5iLam_A.js +44 -0
  871. package/frontend/build/static/LazyProjectExport-iqGbEmyw.js +27 -0
  872. package/frontend/build/static/LineChartComponent-rG1KLVNr.js +1 -0
  873. package/frontend/build/static/NetworkOverview-7SCGp57r.js +1304 -0
  874. package/frontend/build/static/NetworkTraffic-awTd8Zg5.js +1 -0
  875. package/frontend/build/static/ReactJSONEditor-N-DWXE0h.js +106 -0
  876. package/frontend/build/static/RoleCell-mJ7DV61l.js +1 -0
  877. package/frontend/build/static/{StrategyItemContainer-JoMPKX3L.js → StrategyItemContainer-wxQbaPXr.js} +1 -1
  878. package/frontend/build/static/changeRequestProcessWithSchedule-ZryCFkCp.svg +1 -0
  879. package/frontend/build/static/{flowchart-elk-definition-170a3958-NkZoK_zv.js → flowchart-elk-definition-170a3958-fa48ti80.js} +2 -2
  880. package/frontend/build/static/index-TzAeUmk4.js +10 -0
  881. package/frontend/build/static/index-p2PlVFLf.js +524 -0
  882. package/frontend/build/static/index-pAMHRYpv.js +1 -0
  883. package/frontend/build/static/is_dark-aAyqOy_I.js +1 -0
  884. package/frontend/build/static/{mindmap-definition-44684416-obuYUG0L.js → mindmap-definition-44684416-AfCKDD9v.js} +2 -2
  885. package/frontend/build/static/{style-gSb9cHBe.css → style-4Ai58kIl.css} +1 -1
  886. package/frontend/build/static/{timeline-definition-8e5a9bc6-33WsNwwr.js → timeline-definition-8e5a9bc6-NKNlIEgm.js} +2 -2
  887. package/frontend/build/static/uniqueId-ebLYlRiD.js +1 -0
  888. package/frontend/build/static/{unknownify-YD2Teyht.js → unknownify-g-QgUElr.js} +1 -1
  889. package/frontend/build/static/{useApiTokens-XTOY616x.js → useApiTokens-hvnEZWgJ.js} +1 -1
  890. package/frontend/build/static/{useProjectForm--jxh4Dtm.js → useProjectForm-zqz6LJw4.js} +1 -1
  891. package/frontend/build/static/vanilla-picker-P0dws0ou.js +8 -0
  892. package/frontend/package.json +32 -23
  893. package/package.json +10 -10
  894. package/dist/lib/db/client-metrics-store-v2.d.ts.map +0 -1
  895. package/dist/lib/db/client-metrics-store-v2.js +0 -173
  896. package/dist/lib/db/client-metrics-store-v2.js.map +0 -1
  897. package/dist/lib/db/event-store.test.d.ts.map +0 -1
  898. package/dist/lib/db/event-store.test.js.map +0 -1
  899. package/dist/lib/routes/admin-api/client-metrics.d.ts.map +0 -1
  900. package/dist/lib/routes/client-api/metrics.d.ts.map +0 -1
  901. package/dist/lib/routes/client-api/metrics.js.map +0 -1
  902. package/dist/lib/routes/client-api/metrics.test.d.ts.map +0 -1
  903. package/dist/lib/routes/client-api/metrics.test.js.map +0 -1
  904. package/dist/lib/routes/client-api/register.d.ts.map +0 -1
  905. package/dist/lib/routes/client-api/register.js.map +0 -1
  906. package/dist/lib/routes/client-api/register.test.d.ts.map +0 -1
  907. package/dist/lib/routes/client-api/register.test.js.map +0 -1
  908. package/dist/lib/services/client-metrics/instance-service.d.ts.map +0 -1
  909. package/dist/lib/services/client-metrics/instance-service.js.map +0 -1
  910. package/dist/lib/services/client-metrics/instance-service.test.d.ts.map +0 -1
  911. package/dist/lib/services/client-metrics/instance-service.test.js.map +0 -1
  912. package/dist/lib/services/client-metrics/last-seen/createLastSeenService.d.ts.map +0 -1
  913. package/dist/lib/services/client-metrics/last-seen/createLastSeenService.js.map +0 -1
  914. package/dist/lib/services/client-metrics/last-seen/fake-last-seen-read-model.d.ts.map +0 -1
  915. package/dist/lib/services/client-metrics/last-seen/fake-last-seen-read-model.js.map +0 -1
  916. package/dist/lib/services/client-metrics/last-seen/fake-last-seen-store.d.ts.map +0 -1
  917. package/dist/lib/services/client-metrics/last-seen/fake-last-seen-store.js.map +0 -1
  918. package/dist/lib/services/client-metrics/last-seen/last-seen-read-model.d.ts.map +0 -1
  919. package/dist/lib/services/client-metrics/last-seen/last-seen-read-model.js.map +0 -1
  920. package/dist/lib/services/client-metrics/last-seen/last-seen-service.d.ts.map +0 -1
  921. package/dist/lib/services/client-metrics/last-seen/last-seen-service.js.map +0 -1
  922. package/dist/lib/services/client-metrics/last-seen/last-seen-store.d.ts.map +0 -1
  923. package/dist/lib/services/client-metrics/last-seen/last-seen-store.js.map +0 -1
  924. package/dist/lib/services/client-metrics/last-seen/tests/last-seen-service.e2e.test.d.ts.map +0 -1
  925. package/dist/lib/services/client-metrics/last-seen/tests/last-seen-service.e2e.test.js.map +0 -1
  926. package/dist/lib/services/client-metrics/last-seen/tests/last-seen-service.test.d.ts.map +0 -1
  927. package/dist/lib/services/client-metrics/last-seen/tests/last-seen-service.test.js.map +0 -1
  928. package/dist/lib/services/client-metrics/last-seen/types/last-seen-read-model-type.d.ts.map +0 -1
  929. package/dist/lib/services/client-metrics/last-seen/types/last-seen-read-model-type.js.map +0 -1
  930. package/dist/lib/services/client-metrics/last-seen/types/last-seen-store-type.d.ts.map +0 -1
  931. package/dist/lib/services/client-metrics/last-seen/types/last-seen-store-type.js.map +0 -1
  932. package/dist/lib/services/client-metrics/metrics-service-v2.d.ts.map +0 -1
  933. package/dist/lib/services/client-metrics/metrics-service-v2.js.map +0 -1
  934. package/dist/lib/services/client-metrics/metrics-service-v2.test.d.ts.map +0 -1
  935. package/dist/lib/services/client-metrics/metrics-service-v2.test.js +0 -99
  936. package/dist/lib/services/client-metrics/metrics-service-v2.test.js.map +0 -1
  937. package/dist/lib/services/client-metrics/models.d.ts.map +0 -1
  938. package/dist/lib/services/client-metrics/models.js.map +0 -1
  939. package/dist/lib/services/client-metrics/schema.d.ts.map +0 -1
  940. package/dist/lib/services/client-metrics/schema.js.map +0 -1
  941. package/dist/lib/services/client-metrics/schema.test.d.ts.map +0 -1
  942. package/dist/lib/services/client-metrics/schema.test.js.map +0 -1
  943. package/dist/lib/types/stores/client-metrics-store-v2.d.ts.map +0 -1
  944. package/dist/lib/types/stores/client-metrics-store-v2.js.map +0 -1
  945. package/dist/lib/util/collapseHourlyMetrics.d.ts.map +0 -1
  946. package/dist/lib/util/collapseHourlyMetrics.js.map +0 -1
  947. package/dist/lib/util/collapseHourlyMetrics.test.d.ts.map +0 -1
  948. package/dist/lib/util/collapseHourlyMetrics.test.js.map +0 -1
  949. package/dist/test/e2e/api/admin/client-metrics.e2e.test.d.ts.map +0 -1
  950. package/dist/test/e2e/api/admin/client-metrics.e2e.test.js.map +0 -1
  951. package/dist/test/e2e/services/client-metrics-service.e2e.test.d.ts.map +0 -1
  952. package/dist/test/e2e/services/client-metrics-service.e2e.test.js.map +0 -1
  953. package/dist/test/e2e/stores/client-metrics-store-v2.e2e.test.d.ts.map +0 -1
  954. package/dist/test/e2e/stores/client-metrics-store-v2.e2e.test.js.map +0 -1
  955. package/dist/test/fixtures/fake-client-metrics-store-v2.d.ts.map +0 -1
  956. package/dist/test/fixtures/fake-client-metrics-store-v2.js.map +0 -1
  957. package/frontend/build/static/AdvancedPlayground-FxfPUa2V.js +0 -13
  958. package/frontend/build/static/FeatureMetricsChart-ExGq1eXl.js +0 -2
  959. package/frontend/build/static/FeatureViewLazyExport-S8mj8m0z.js +0 -25
  960. package/frontend/build/static/LazyAdminExport-fpVZFnP9.js +0 -44
  961. package/frontend/build/static/LazyProjectExport-_QSE5C5m.js +0 -25
  962. package/frontend/build/static/NetworkOverview-ylTzmeDg.js +0 -1304
  963. package/frontend/build/static/NetworkTraffic-qj5h7JRk.js +0 -1
  964. package/frontend/build/static/ReactJSONEditor-E59dRBYR.js +0 -129
  965. package/frontend/build/static/RoleCell-TGTVkKHO.js +0 -1
  966. package/frontend/build/static/chartjs-adapter-date-fns.esm-JSlDxtwH.js +0 -23
  967. package/frontend/build/static/index-JVRlSBvr.js +0 -501
  968. package/frontend/build/static/is_dark-gjUQW15t.js +0 -1
  969. /package/dist/lib/{db → features/events}/event-store.test.d.ts +0 -0
  970. /package/dist/{test/e2e/services → lib/features/metrics/client-metrics}/client-metrics-service.e2e.test.d.ts +0 -0
  971. /package/dist/{test/e2e/stores → lib/features/metrics/client-metrics}/client-metrics-store-v2.e2e.test.d.ts +0 -0
  972. /package/dist/{test/e2e/api/admin → lib/features/metrics/client-metrics}/client-metrics.e2e.test.d.ts +0 -0
  973. /package/dist/lib/{util → features/metrics/client-metrics}/collapseHourlyMetrics.js +0 -0
  974. /package/dist/lib/{util → features/metrics/client-metrics}/collapseHourlyMetrics.test.d.ts +0 -0
  975. /package/dist/lib/{util → features/metrics/client-metrics}/collapseHourlyMetrics.test.js +0 -0
  976. /package/dist/lib/{services → features/metrics}/client-metrics/metrics-service-v2.test.d.ts +0 -0
  977. /package/dist/lib/{services/client-metrics → features/metrics/instance}/instance-service.test.d.ts +0 -0
  978. /package/dist/lib/{routes/client-api → features/metrics/instance}/metrics.test.d.ts +0 -0
  979. /package/dist/lib/{services/client-metrics → features/metrics/instance}/models.js +0 -0
  980. /package/dist/lib/{routes/client-api → features/metrics/instance}/register.test.d.ts +0 -0
  981. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/createLastSeenService.d.ts +0 -0
  982. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/fake-last-seen-read-model.d.ts +0 -0
  983. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/fake-last-seen-read-model.js +0 -0
  984. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/fake-last-seen-store.d.ts +0 -0
  985. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/fake-last-seen-store.js +0 -0
  986. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/last-seen-read-model.d.ts +0 -0
  987. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/last-seen-read-model.js +0 -0
  988. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/last-seen-service.js +0 -0
  989. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/last-seen-store.d.ts +0 -0
  990. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/tests/last-seen-service.e2e.test.d.ts +0 -0
  991. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/tests/last-seen-service.e2e.test.js +0 -0
  992. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/tests/last-seen-service.test.d.ts +0 -0
  993. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/tests/last-seen-service.test.js +0 -0
  994. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/types/last-seen-read-model-type.d.ts +0 -0
  995. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/types/last-seen-read-model-type.js +0 -0
  996. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/types/last-seen-store-type.d.ts +0 -0
  997. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/types/last-seen-store-type.js +0 -0
  998. /package/dist/lib/{services/client-metrics → features/metrics/shared}/schema.js +0 -0
  999. /package/dist/lib/{services/client-metrics → features/metrics/shared}/schema.test.d.ts +0 -0
  1000. /package/dist/lib/{services/client-metrics → features/metrics/shared}/schema.test.js +0 -0
@@ -0,0 +1,44 @@
1
+ import{c as ft,j as e,c$ as zs,d0 as ge,d1 as xs,d2 as gs,d3 as $e,at as Q,au as X,ao as le,d4 as Vs,d5 as Ys,d6 as Kn,d7 as Zn,d8 as yt,d9 as Qn,q as Xn,da as eo,b as J,ax as N,ay as ve,r as h,ch as Js,aA as Ce,aB as Ks,db as Kt,f as z,aD as Ee,s as m,A as Zs,k as Z,C as S,dc as Qs,bZ as Zt,aO as ie,dd as to,de as Xs,aP as je,df as Ne,bL as f,dg as ce,dh as me,F as bt,u as fe,di as Me,J as K,I as so,S as no,M as He,h as _,aN as Le,b7 as se,T as B,aK as re,B as q,cZ as St,cQ as vt,dj as rt,dk as oo,D as Qt,dl as en,d as tn,dm as ao,dn as Ue,G as ze,dp as io,ba as ro,bb as lo,a3 as U,a4 as pe,ab as te,a5 as co,a6 as uo,a7 as Xt,a8 as it,a9 as ho,ap as de,dq as xe,x as Ge,aQ as sn,dr as nn,ds as M,b_ as on,dt as po,du as an,dv as rn,dw as ae,b$ as ln,dx as mo,cE as js,dy as cn,a1 as dn,dz as Oe,t as Be,bJ as xo,bW as go,b3 as Ot,aL as Ve,b5 as Ut,bX as Ae,dA as jo,dB as fo,dC as yo,dD as $t,l as es,m as bo,n as So,ac as he,cB as De,ae as Se,af as Ye,ag as ye,bu as vo,cl as Ct,dE as un,ak as hn,dF as ts,c9 as wt,dG as Co,aq as qe,v as _e,dH as wo,Q as To,dI as ko,dJ as Ro,cb as at,dK as Eo,dL as Ao,aE as ss,dM as ns,y as pn,ai as Do,a as os,dN as Je,dO as Io,an as Ke,aI as ue,dP as Po,dQ as Bo,dR as Lo,dS as Oo,cj as lt,ck as G,cv as fs,dT as mn,br as as,aj as is,dU as Uo,cD as xn,cS as rs,dV as $o,am as gn,dW as No,dX as ys,dY as Ie,R as Fo,dZ as pt,bO as Go,bP as qo,bT as _o,bQ as Wo,d_ as Ho,d$ as Mo,e0 as zo,e1 as Vo,e2 as Yo,e3 as Jo,cn as Ko,e4 as Zo,e5 as Qo,e6 as Xo,e7 as jn,aa as ea,e8 as ta,e9 as Nt,ea as sa,eb as na,ec as fn,ed as jt,ee as yn,ef as oa,eg as aa,c4 as ls,eh as ia,ei as bs,ej as ra,ek as la,el as ca,em as Tt,en as Ft,eo as da,ep as ua,eq as ha,bU as bn,bI as pa,er as ma,es as cs,et as Sn,eu as xa,ev as ga,ew as ja,ex as Ss,al as fa,b4 as ya,ey as ba,ez as vn,eA as Cn,eB as Sa,eC as va,eD as wn,eE as Ca,c3 as wa,eF as Ta,eG as Tn,eH as ka,eI as Ra,eJ as Ea}from"./index-p2PlVFLf.js";import{u as Aa,C as Da,A as Ia,a as Pa,R as Ba,S as La,T as Oa,b as Ua,c as $a,d as Na,e as Fa,E as Ga,f as qa,m as _a,g as ct,h as kt,i as Wa,j as kn}from"./RoleCell-mJ7DV61l.js";import{u as ds}from"./useApiTokens-hvnEZWgJ.js";const Ha=ft(e.jsx("path",{d:"M11.8 10.9c-2.27-.59-3-1.2-3-2.15 0-1.09 1.01-1.85 2.7-1.85 1.42 0 2.13.54 2.39 1.4.12.4.45.7.87.7h.3c.66 0 1.13-.65.9-1.27-.42-1.18-1.4-2.16-2.96-2.54V4.5c0-.83-.67-1.5-1.5-1.5S10 3.67 10 4.5v.66c-1.94.42-3.5 1.68-3.5 3.61 0 2.31 1.91 3.46 4.7 4.13 2.5.6 3 1.48 3 2.41 0 .69-.49 1.79-2.7 1.79-1.65 0-2.5-.59-2.83-1.43-.15-.39-.49-.67-.9-.67h-.28c-.67 0-1.14.68-.89 1.3.57 1.39 1.9 2.21 3.4 2.53v.67c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-.65c1.95-.37 3.5-1.5 3.5-3.55 0-2.84-2.43-3.81-4.7-4.4z"}),"AttachMoneyRounded"),Ma=ft(e.jsx("path",{d:"M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5s-3 1.34-3 3 1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V18c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-1.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05.02.01.03.03.04.04 1.14.83 1.93 1.94 1.93 3.41V18c0 .35-.07.69-.18 1H22c.55 0 1-.45 1-1v-1.5c0-2.33-4.67-3.5-7-3.5z"}),"GroupRounded"),za=ft(e.jsx("path",{d:"M13 3c-4.97 0-9 4.03-9 9H1l4 4 4-4H6c0-3.86 3.14-7 7-7s7 3.14 7 7-3.14 7-7 7c-1.9 0-3.62-.76-4.88-1.99L6.7 18.42C8.32 20.01 10.55 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm2 8v-1c0-1.1-.9-2-2-2s-2 .9-2 2v1c-.55 0-1 .45-1 1v3c0 .55.45 1 1 1h4c.55 0 1-.45 1-1v-3c0-.55-.45-1-1-1zm-1 0h-2v-1c0-.55.45-1 1-1s1 .45 1 1v1z"}),"LockReset"),Va=ft(e.jsx("path",{d:"M20 6h-8l-2-2H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm-6 10H6v-2h8v2zm4-4H6v-2h12v2z"}),"Topic"),Ya=()=>{const{tokens:t,loading:s,refetch:n}=ds(),{deleteToken:o}=zs(),{getTableProps:a,getTableBodyProps:i,headerGroups:r,rows:l,prepareRow:c,state:{globalFilter:d},setGlobalFilter:u,setHiddenColumns:p,columns:x}=Aa(t,g=>{const j=g.row.original.type==="client"?xs:g.row.original.type==="frontend"?gs:$e,y=g.row.original.type==="client"?Kn:g.row.original.type==="frontend"?Zn:$e;return e.jsxs(yt,{children:[e.jsx(Pa,{token:g.row.original,permission:j}),e.jsx(Ba,{token:g.row.original,permission:y,onRemove:async()=>{await o(g.row.original.secret),n()}})]})});return e.jsx(ge,{permissions:[xs,gs,$e],children:e.jsx(Q,{header:e.jsx(X,{title:`API access (${l.length})`,actions:e.jsxs(e.Fragment,{children:[e.jsx(le,{initialValue:d,onChange:u}),e.jsx(X.Divider,{}),e.jsx(Da,{permission:[Vs,Ys,$e],path:"/admin/api/create-token"})]})}),children:e.jsx(Ia,{loading:s,headerGroups:r,setHiddenColumns:p,prepareRow:c,getTableBodyProps:i,getTableProps:a,rows:l,columns:x,globalFilter:d})})})},Ja=({type:t,projects:s,setProjects:n,errors:o,clearErrors:a})=>{const i=Qn("projectId"),{projects:r}=Xn(),l=r.map(c=>({value:c.id,label:c.name}));return i?null:e.jsxs(e.Fragment,{children:[e.jsx(La,{children:"Which project do you want to give access to?"}),e.jsx(eo,{disabled:t===Oa.ADMIN,options:l,defaultValue:s,onChange:n,error:o==null?void 0:o.projects,onFocus:()=>a("projects")})]})},vs="Create API token",Ka=({modal:t=!1})=>{const{setToastApiError:s}=J(),{uiConfig:n}=N(),o=ve(),[a,i]=h.useState(!1),[r,l]=h.useState(""),{getApiTokenPayload:c,username:d,type:u,projects:p,environment:x,setUsername:g,setTokenType:j,setProjects:y,setEnvironment:w,isValid:C,errors:k,clearErrors:A,apiTokenTypes:T}=Ua(),{createToken:L,loading:P}=zs(),{refetch:I}=ds();Js(vs);const v="api/admin/api-tokens",F=async W=>{if(W.preventDefault(),!!C())try{const E=c();await L(E).then($=>$.json()).then($=>{Kt(),l($.secret),i(!0),I()})}catch(E){s(z(E))}},R=()=>{i(!1),o(Ee)},b=()=>`curl --location --request POST '${n.unleashUrl}/${v}' \\
2
+ --header 'Authorization: INSERT_API_KEY' \\
3
+ --header 'Content-Type: application/json' \\
4
+ --data-raw '${JSON.stringify(c(),void 0,2)}'`,D=()=>{o(Ee)};return e.jsxs(Ce,{loading:P,title:vs,modal:t,description:"Unleash SDKs use API tokens to authenticate to the Unleash API. Client SDKs need a token with 'client privileges', which allows them to fetch feature toggle configurations and post usage metrics.",documentationLink:"https://docs.getunleash.io/reference/api-tokens-and-client-keys",documentationLinkLabel:"API tokens documentation",formatApiCode:b,children:[e.jsxs($a,{handleSubmit:F,handleCancel:D,mode:"Create",actions:e.jsx(Ks,{name:"token",permission:[$e,Ys,Vs]}),children:[e.jsx(Na,{username:d,setUsername:g,errors:k,clearErrors:A}),e.jsx(Fa,{type:u,setType:j,apiTokenTypes:T}),e.jsx(Ja,{type:u,projects:p,setProjects:y,errors:k,clearErrors:A}),e.jsx(Ga,{type:u,environment:x,setEnvironment:w})]}),e.jsx(qa,{open:a,setOpen:i,closeConfirm:R,token:r,type:u})]})},Za=m("div")(({theme:t})=>({display:"flex",flexDirection:"column","& > span:last-of-type":{fontSize:t.fontSizes.smallerBody,color:t.palette.text.secondary}})),Rt=({roles:t,value:s,setValue:n,required:o,hideDescription:a,...i})=>{const r=(l,c)=>e.jsx("li",{...l,children:e.jsxs(Za,{children:[e.jsx("span",{children:c.name}),e.jsx("span",{children:c.description})]})});return e.jsxs(e.Fragment,{children:[e.jsx(Zs,{openOnFocus:!0,size:"small",value:s,onChange:(l,c)=>n(c||null),options:t,renderOption:r,getOptionLabel:l=>l.name,renderInput:l=>e.jsx(Z,{...l,label:"Role",required:o}),...i}),e.jsx(S,{condition:!!s&&!a,show:()=>e.jsx(Qs,{sx:{marginTop:1},roleId:s.id})})]})},dt=()=>{const{isEnterprise:t}=N(),{data:s,error:n,mutate:o}=Zt(t(),{roles:[],projectRoles:[]},ie("api/admin/roles"),Qa);return h.useMemo(()=>({roles:(s==null?void 0:s.roles.filter(({type:a})=>to.includes(a)).sort(Cs))??[],projectRoles:(s==null?void 0:s.roles.filter(({type:a})=>Xs.includes(a)).sort(Cs))??[],loading:!n&&!s,refetch:()=>o(),error:n}),[s,n,o])},Qa=t=>fetch(t).then(je("Roles")).then(s=>s.json()),Cs=(t,s)=>Ne.includes(t.type)&&!Ne.includes(s.type)?-1:!Ne.includes(t.type)&&Ne.includes(s.type)?1:t.name.localeCompare(s.name),Rn=({data:t={enabled:!1,autoCreate:!1},setValue:s,onUpdateRole:n})=>{const{roles:o}=dt(),a=()=>{s("autoCreate",!t.autoCreate)},i=l=>{s(l.target.name,l.target.value)},r=({defaultRootRole:l,defaultRootRoleId:c})=>c?o.find(({id:d})=>d===c)||null:o.find(({name:d})=>d===l)||null;return e.jsxs(h.Fragment,{children:[e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Auto-create users"}),e.jsx("p",{children:"Enable automatic creation of new users when signing in."})]}),e.jsx(f,{item:!0,md:6,style:{padding:"20px"},children:e.jsx(ce,{control:e.jsx(me,{onChange:a,name:"enabled",checked:t.autoCreate,disabled:!t.enabled}),label:"Auto-create users"})})]}),e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Default Root Role"}),e.jsx("p",{children:"Choose which root role the user should get when no explicit role mapping exists."})]}),e.jsx(f,{item:!0,md:6,children:e.jsx(bt,{style:{width:"400px"},children:e.jsx(Rt,{roles:o,value:r(t),setValue:n,disabled:!t.autoCreate||!t.enabled,required:!0,hideDescription:!0})})})]}),e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Email domains"}),e.jsx("p",{children:"Comma separated list of email domains that should be allowed to sign in."})]}),e.jsx(f,{item:!0,md:6,children:e.jsx(Z,{onChange:i,label:"Email domains",name:"emailDomains",disabled:!t.autoCreate||!t.enabled,required:!!t.autoCreate,value:t.emailDomains||"",placeholder:"@company.com, @anotherCompany.com",style:{width:"400px"},rows:2,variant:"outlined",size:"small"})})]})]})},Xa=async(t,s)=>{if(t){if(s){const n=await s.json();throw t({message:n.message}),new Error(n.message)}throw new Error}},Et=t=>{const{makeRequest:s,createRequest:n,errors:o,loading:a}=fe({propagateErrors:!0,handleBadRequest:Xa});return{updateSettings:async r=>{const l=`api/admin/auth/${t}/settings`,c=n(l,{method:"POST",body:JSON.stringify(r)});await s(c.caller,c.id)},errors:o,loading:a}},us=t=>{const n=Object.entries(t).filter(([,o])=>o!=="");return Object.fromEntries(n)},En=({ssoType:t,data:s={enabled:!1,enableGroupSyncing:!1,groupJsonPath:"",addGroupsScope:!1},setValue:n})=>{const o=()=>{n("enableGroupSyncing",!s.enableGroupSyncing)},a=r=>{n(r.target.name,r.target.value)},i=()=>{n("addGroupsScope",!s.addGroupsScope)};return e.jsxs(e.Fragment,{children:[e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Enable Group Syncing"}),e.jsxs("p",{children:["Enables automatically syncing of users from the"," ",t,"provider when a user logs in."]})]}),e.jsx(f,{item:!0,md:6,style:{padding:"20px"},children:e.jsx(ce,{control:e.jsx(me,{onChange:o,value:s.enableGroupSyncing,name:"enableGroupSyncing",checked:s.enableGroupSyncing,disabled:!s.enabled}),label:s.enableGroupSyncing?"Enabled":"Disabled"})})]}),e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Group Field JSON Path"}),e.jsxs("p",{children:["Specifies the path in the ",t," token response from which to read the groups the user belongs to."]})]}),e.jsx(f,{item:!0,md:6,children:e.jsx(Z,{onChange:a,label:"Group JSON Path",name:"groupJsonPath",value:s.groupJsonPath,disabled:!s.enableGroupSyncing,style:{width:"400px"},variant:"outlined",size:"small",required:!0})})]}),e.jsx(S,{condition:t==="OIDC",show:e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Request 'groups' Scope"}),e.jsx("p",{children:"When enabled Unleash will also request the 'groups' scope as part of the login request."})]}),e.jsx(f,{item:!0,md:6,style:{padding:"20px"},children:e.jsx(ce,{control:e.jsx(me,{onChange:i,value:s.addGroupsScope,disabled:!s.enableGroupSyncing,name:"addGroupsScope",checked:s.addGroupsScope}),label:s.addGroupsScope?"Enabled":"Disabled"})})]})})]})},ei={enabled:!1,enableSingleSignOut:!1,addGroupsScope:!1,enableGroupSyncing:!1,autoCreate:!1,unleashHostname:location.hostname,groupJsonPath:"",clientId:"",discoverUrl:"",secret:"",acrValues:"",idTokenSigningAlgorithm:"RS256"},ti=()=>{const{setToastData:t,setToastApiError:s}=J(),{uiConfig:n}=N(),[o,a]=h.useState(ei),{config:i}=Me("oidc"),{updateSettings:r,errors:l,loading:c}=Et("oidc");h.useEffect(()=>{i.discoverUrl&&a(i)},[i]);const d=y=>{x(y.target.name,y.target.value)},u=()=>{a({...o,enabled:!o.enabled})},p=()=>{a({...o,enableSingleSignOut:!o.enableSingleSignOut})},x=(y,w)=>{a({...o,[y]:w})},g=y=>{a({...o,defaultRootRole:void 0,defaultRootRoleId:y==null?void 0:y.id})},j=async y=>{y.preventDefault();try{await r(us(o)),t({title:"Settings stored",type:"success"})}catch(w){s(z(w))}};return e.jsxs(e.Fragment,{children:[e.jsx(f,{container:!0,sx:{mb:3},children:e.jsx(f,{item:!0,md:12,children:e.jsxs(K,{severity:"info",children:["Please read the"," ",e.jsx("a",{href:"https://www.unleash-hosted.com/docs/enterprise-authentication",target:"_blank",rel:"noreferrer",children:"documentation"})," ","to learn how to integrate with specific Open Id Connect providers (Okta, Keycloak, Google, etc). ",e.jsx("br",{}),"Callback URL:"," ",e.jsxs("code",{children:[n.unleashUrl,"/auth/oidc/callback"]})]})})}),e.jsxs("form",{onSubmit:j,children:[e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Enable"}),e.jsx("p",{children:"Enable Open Id Connect Authentication."})]}),e.jsx(f,{item:!0,md:6,style:{padding:"20px"},children:e.jsx(ce,{control:e.jsx(me,{onChange:u,value:o.enabled,name:"enabled",checked:o.enabled}),label:o.enabled?"Enabled":"Disabled"})})]}),e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Discover URL"}),e.jsx("p",{children:"(Required) Issuer discover metadata URL"})]}),e.jsx(f,{item:!0,md:6,children:e.jsx(Z,{onChange:d,label:"Discover URL",name:"discoverUrl",value:o.discoverUrl,disabled:!o.enabled,style:{width:"400px"},variant:"outlined",size:"small"})})]}),e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Client ID"}),e.jsx("p",{children:"(Required) Client ID of your OpenID application"})]}),e.jsx(f,{item:!0,md:6,children:e.jsx(Z,{onChange:d,label:"Client ID",name:"clientId",value:o.clientId,disabled:!o.enabled,style:{width:"400px"},variant:"outlined",size:"small",required:!0})})]}),e.jsxs(f,{container:!0,spacing:3,mb:4,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Client secret"}),e.jsxs("p",{children:["(Required) Client secret of your OpenID application."," "]})]}),e.jsx(f,{item:!0,md:6,children:e.jsx(Z,{onChange:d,label:"Client Secret",name:"secret",value:o.secret,disabled:!o.enabled,style:{width:"400px"},variant:"outlined",size:"small",required:!0})})]}),e.jsx("h3",{children:"Optional Configuration"}),e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Enable Single Sign-Out"}),e.jsx("p",{children:"If you enable Single Sign-Out Unleash will redirect the user to the IDP as part of the Sign-out process."})]}),e.jsx(f,{item:!0,md:6,style:{padding:"20px"},children:e.jsx(ce,{control:e.jsx(me,{onChange:p,value:o.enableSingleSignOut,disabled:!o.enabled,name:"enableSingleSignOut",checked:o.enableSingleSignOut}),label:o.enableSingleSignOut?"Enabled":"Disabled"})})]}),e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"ACR Values"}),e.jsx("p",{children:'Requested Authentication Context Class Reference values. If multiple values are specified they should be "space" separated. Will be sent as "acr_values" as part of the authentication request. Unleash will validate the acr value in the id token claims against the list of acr values.'})]}),e.jsx(f,{item:!0,md:6,children:e.jsx(Z,{onChange:d,label:"ACR Values",name:"acrValues",value:o.acrValues,disabled:!o.enabled,style:{width:"400px"},variant:"outlined",size:"small"})})]}),e.jsx(En,{ssoType:"OIDC",data:o,setValue:x}),e.jsx(Rn,{data:o,setValue:x,onUpdateRole:g}),e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"ID Signing algorithm"}),e.jsxs("p",{children:["Which signing algorithm to use. ",e.jsx("br",{}),' Leave this alone unless you see errors that look like "unexpected JWT alg received, expected RS256, got: RS512" in your logs.']})]}),e.jsx(f,{item:!0,md:6,children:e.jsxs(bt,{style:{minWidth:"200px"},children:[e.jsx(so,{id:"defaultRootRole-label",children:"Signing algorithm"}),e.jsxs(no,{label:"Signing algorithm",labelId:"idTokenSigningAlgorithm-label",id:"idTokenSigningAlgorithm",name:"idTokenSigningAlgorithm",value:o.idTokenSigningAlgorithm||"RS256",onChange:y=>x("idTokenSigningAlgorithm",y.target.value),children:[e.jsx(He,{value:"RS256",children:"RS256"}),e.jsx(He,{value:"RS384",children:"RS384"}),e.jsx(He,{value:"RS512",children:"RS512"})]})]})})]}),e.jsx(f,{container:!0,spacing:3,children:e.jsxs(f,{item:!0,md:12,children:[e.jsx(_,{variant:"contained",color:"primary",type:"submit",disabled:c,children:"Save"})," ",e.jsx("p",{children:e.jsx("small",{style:{color:"red"},children:l==null?void 0:l.message})})]})})]})]})},si={enabled:!1,autoCreate:!1,enableGroupSyncing:!1,addGroupsScope:!1,unleashHostname:location.hostname,entityId:"",signOnUrl:"",certificate:"",signOutUrl:"",spCertificate:"",groupJsonPath:""},ni=()=>{const{setToastData:t,setToastApiError:s}=J(),{uiConfig:n}=N(),[o,a]=h.useState(si),{config:i}=Me("saml"),{updateSettings:r,errors:l,loading:c}=Et("saml");h.useEffect(()=>{i.entityId&&a(i)},[i]);const d=j=>{p(j.target.name,j.target.value)},u=()=>{a({...o,enabled:!o.enabled})},p=(j,y)=>{a({...o,[j]:y})},x=j=>{a({...o,defaultRootRole:void 0,defaultRootRoleId:j==null?void 0:j.id})},g=async j=>{j.preventDefault();try{await r(us(o)),t({title:"Settings stored",type:"success"})}catch(y){s(z(y))}};return e.jsxs(e.Fragment,{children:[e.jsx(f,{container:!0,sx:{mb:3},children:e.jsx(f,{item:!0,md:12,children:e.jsxs(K,{severity:"info",children:["Please read the"," ",e.jsx("a",{href:"https://www.unleash-hosted.com/docs/enterprise-authentication",target:"_blank",rel:"noreferrer",children:"documentation"})," ","to learn how to integrate with specific SAML 2.0 providers (Okta, Keycloak, etc). ",e.jsx("br",{}),"Callback URL:"," ",e.jsxs("code",{children:[n.unleashUrl,"/auth/saml/callback"]})]})})}),e.jsxs("form",{onSubmit:g,children:[e.jsxs(f,{container:!0,spacing:3,children:[e.jsxs(f,{item:!0,md:5,mb:2,children:[e.jsx("strong",{children:"Enable"}),e.jsx("p",{children:"Enable SAML 2.0 Authentication."})]}),e.jsx(f,{item:!0,md:6,children:e.jsx(ce,{control:e.jsx(me,{onChange:u,value:o.enabled,name:"enabled",checked:o.enabled}),label:o.enabled?"Enabled":"Disabled"})})]}),e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Entity ID"}),e.jsx("p",{children:"(Required) The Entity Identity provider issuer."})]}),e.jsx(f,{item:!0,md:6,children:e.jsx(Z,{onChange:d,label:"Entity ID",name:"entityId",value:o.entityId,disabled:!o.enabled,style:{width:"400px"},variant:"outlined",size:"small",required:!0})})]}),e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Single Sign-On URL"}),e.jsx("p",{children:"(Required) The url to redirect the user to for signing in."})]}),e.jsx(f,{item:!0,md:6,children:e.jsx(Z,{onChange:d,label:"Single Sign-On URL",name:"signOnUrl",value:o.signOnUrl,disabled:!o.enabled,style:{width:"400px"},variant:"outlined",size:"small",required:!0})})]}),e.jsxs(f,{container:!0,spacing:3,mb:4,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"X.509 Certificate"}),e.jsx("p",{children:"(Required) The certificate used to sign the SAML 2.0 request."})]}),e.jsx(f,{item:!0,md:7,children:e.jsx(Z,{onChange:d,label:"X.509 Certificate",name:"certificate",value:o.certificate,disabled:!o.enabled,style:{width:"100%"},InputProps:{style:{fontSize:"0.6em",fontFamily:"monospace"}},multiline:!0,rows:14,maxRows:14,variant:"outlined",size:"small",required:!0})})]}),e.jsx("h3",{children:"Optional Configuration"}),e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Single Sign-out URL"}),e.jsx("p",{children:"(Optional) The url to redirect the user to for signing out of the IDP."})]}),e.jsx(f,{item:!0,md:6,children:e.jsx(Z,{onChange:d,label:"Single Sign-out URL",name:"signOutUrl",value:o.signOutUrl,disabled:!o.enabled,style:{width:"400px"},variant:"outlined",size:"small"})})]}),e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Service Provider X.509 Certificate"}),e.jsx("p",{children:"(Optional) The private certificate used by the Service Provider used to sign the SAML 2.0 request towards the IDP. E.g. used to sign single logout requests (SLO)."})]}),e.jsx(f,{item:!0,md:7,children:e.jsx(Z,{onChange:d,label:"X.509 Certificate",name:"spCertificate",value:o.spCertificate,disabled:!o.enabled,style:{width:"100%"},InputProps:{style:{fontSize:"0.6em",fontFamily:"monospace"}},multiline:!0,rows:14,maxRows:14,variant:"outlined",size:"small"})})]}),e.jsx(En,{ssoType:"SAML",data:o,setValue:p}),e.jsx(Rn,{data:o,setValue:p,onUpdateRole:x}),e.jsx(f,{container:!0,spacing:3,children:e.jsxs(f,{item:!0,md:5,children:[e.jsx(_,{variant:"contained",color:"primary",type:"submit",disabled:c,children:"Save"})," ",e.jsx("p",{children:e.jsx("small",{style:{color:"red"},children:l==null?void 0:l.message})})]})})]})]})},oi=()=>{const{data:t,error:s,mutate:n}=Le(ie("api/admin/user-admin/admin-count"),ai);return{data:t,loading:!s&&!t,refetch:()=>n(),error:s}},ai=t=>fetch(t).then(je("Admin count")).then(s=>s.json()),ii=({open:t,setOpen:s,onClick:n,adminCount:o,tokens:a})=>e.jsxs(se,{open:t,onClose:()=>{s(!1)},onClick:n,title:"Disable password based login?",primaryButtonText:"Disable password based login",secondaryButtonText:"Cancel",children:[e.jsxs(K,{severity:"warning",children:[e.jsx("strong",{children:"Warning!"})," Disabling password based login may lock you out of the system permanently if you do not have any alternative admin credentials (such as an admin SSO account or admin API token) secured beforehand.",e.jsx("br",{}),e.jsx("br",{}),e.jsx("strong",{children:"Password based administrators: "})," ",o==null?void 0:o.password,e.jsx("br",{}),e.jsx("strong",{children:"Other administrators: "})," ",o==null?void 0:o.noPassword,e.jsx("br",{}),e.jsx("strong",{children:"Admin service accounts: "})," ",o==null?void 0:o.service,e.jsx("br",{}),e.jsx("strong",{children:"Admin API tokens: "})," ",a.filter(({type:i})=>i==="admin").length]}),e.jsx(B,{sx:{mt:3},children:"You are about to disable password based login. Are you sure you want to proceed?"})]}),ri=()=>{const{setToastData:t,setToastApiError:s}=J(),{config:n,refetch:o}=Me("simple"),[a,i]=h.useState(!1),{updateSettings:r,errors:l,loading:c}=Et("simple"),[d,u]=h.useState(!1),{data:p}=oi(),{tokens:x}=ds();h.useEffect(()=>{i(!!n.disabled)},[n.disabled]);const g=()=>{i(!a)},j=async w=>{w.preventDefault(),!n.disabled&&a?u(!0):y()},y=async()=>{try{await r({disabled:a}),o(),t({title:"Successfully saved",text:"Password authentication settings stored.",autoHideDuration:4e3,type:"success",show:!0})}catch(w){s(z(w)),i(n.disabled)}};return e.jsx(e.Fragment,{children:e.jsxs("form",{onSubmit:j,children:[e.jsxs(K,{severity:"info",sx:{mb:3},children:["Overview of administrators on your Unleash instance:",e.jsx("br",{}),e.jsx("br",{}),e.jsx("strong",{children:"Password based administrators: "})," ",e.jsx(re,{to:"/admin/users",children:p==null?void 0:p.password}),e.jsx("br",{}),e.jsx("strong",{children:"Other administrators: "})," ",e.jsx(re,{to:"/admin/users",children:p==null?void 0:p.noPassword}),e.jsx("br",{}),e.jsx("strong",{children:"Admin service accounts: "})," ",e.jsx(re,{to:"/admin/service-accounts",children:p==null?void 0:p.service}),e.jsx("br",{}),e.jsx("strong",{children:"Admin API tokens: "})," ",e.jsx(re,{to:"/admin/api",children:x.filter(({type:w})=>w==="admin").length})]}),e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Password based login"}),e.jsx("p",{children:"Allow users to login with username & password"})]}),e.jsx(f,{item:!0,md:6,style:{padding:"20px"},children:e.jsx(ce,{control:e.jsx(me,{onChange:g,value:!a,name:"disabled",checked:!a}),label:a?"Disabled":"Enabled"})})]}),e.jsx(f,{container:!0,spacing:3,children:e.jsxs(f,{item:!0,md:12,children:[e.jsx(_,{variant:"contained",color:"primary",type:"submit",disabled:c,children:"Save"})," ",e.jsx("p",{children:e.jsx("small",{style:{color:"red"},children:l==null?void 0:l.message})})]})}),e.jsx(ii,{open:d,setOpen:u,onClick:()=>{u(!1),y()},adminCount:p,tokens:x})]})})},li={enabled:!1,autoCreate:!1,unleashHostname:location.hostname,clientId:"",clientSecret:"",emailDomains:""},ci=()=>{const{setToastData:t,setToastApiError:s}=J(),{uiConfig:n}=N(),[o,a]=h.useState(li),{config:i}=Me("google"),{updateSettings:r,errors:l,loading:c}=Et("google");h.useEffect(()=>{i.clientId&&a(i)},[i]);const d=g=>{a({...o,[g.target.name]:g.target.value})},u=()=>{a({...o,enabled:!o.enabled})},p=()=>{a({...o,autoCreate:!o.autoCreate})},x=async g=>{g.preventDefault();try{await r(us(o)),t({title:"Settings stored",type:"success"})}catch(j){s(z(j))}};return e.jsxs(e.Fragment,{children:[e.jsxs(q,{children:[e.jsxs(K,{severity:"error",sx:{mb:2},children:["This integration is deprecated and will be removed in next major version. Please use ",e.jsx("strong",{children:"OpenID Connect"})," to enable Google SSO."]}),e.jsxs(K,{severity:"info",sx:{mb:3},children:["Read the"," ",e.jsx("a",{href:"https://www.unleash-hosted.com/docs/enterprise-authentication/google",target:"_blank",rel:"noreferrer",children:"documentation"})," ","to learn how to integrate with Google OAuth 2.0. ",e.jsx("br",{}),"Callback URL:"," ",e.jsxs("code",{children:[n.unleashUrl,"/auth/google/callback"]})]})]}),e.jsxs("form",{onSubmit:x,children:[e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,xs:5,children:[e.jsx("strong",{children:"Enable"}),e.jsx("p",{children:"Enable Google users to login. Value is ignored if Client ID and Client Secret are not defined."})]}),e.jsx(f,{item:!0,xs:6,style:{padding:"20px"},children:e.jsx(ce,{control:e.jsx(me,{onChange:u,value:o.enabled,name:"enabled",checked:o.enabled}),label:o.enabled?"Enabled":"Disabled"})})]}),e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,xs:5,children:[e.jsx("strong",{children:"Client ID"}),e.jsx("p",{children:"(Required) The Client ID provided by Google when registering the application."})]}),e.jsx(f,{item:!0,xs:6,children:e.jsx(Z,{onChange:d,label:"Client ID",name:"clientId",placeholder:"",value:o.clientId,style:{width:"400px"},variant:"outlined",size:"small",required:!0})})]}),e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Client Secret"}),e.jsx("p",{children:"(Required) Client Secret provided by Google when registering the application."})]}),e.jsx(f,{item:!0,md:6,children:e.jsx(Z,{onChange:d,label:"Client Secret",name:"clientSecret",value:o.clientSecret,placeholder:"",style:{width:"400px"},variant:"outlined",size:"small",required:!0})})]}),e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Unleash hostname"}),e.jsxs("p",{children:["(Required) The hostname you are running Unleash on that Google should send the user back to. The final callback URL will be"," ",e.jsx("small",{children:e.jsx("code",{children:"https://[unleash.hostname.com]/auth/google/callback"})})]})]}),e.jsx(f,{item:!0,md:6,children:e.jsx(Z,{onChange:d,label:"Unleash Hostname",name:"unleashHostname",placeholder:"",value:o.unleashHostname||"",style:{width:"400px"},variant:"outlined",size:"small"})})]}),e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Auto-create users"}),e.jsx("p",{children:"Enable automatic creation of new users when signing in with Google."})]}),e.jsx(f,{item:!0,md:6,style:{padding:"20px"},children:e.jsx(me,{onChange:p,name:"enabled",checked:o.autoCreate})})]}),e.jsxs(f,{container:!0,spacing:3,mb:2,children:[e.jsxs(f,{item:!0,md:5,children:[e.jsx("strong",{children:"Email domains"}),e.jsx("p",{children:"(Optional) Comma separated list of email domains that should be allowed to sign in."})]}),e.jsx(f,{item:!0,md:6,children:e.jsx(Z,{onChange:d,label:"Email domains",name:"emailDomains",value:o.emailDomains,placeholder:"@company.com, @anotherCompany.com",style:{width:"400px"},rows:2,multiline:!0,variant:"outlined",size:"small"})})]}),e.jsx(f,{container:!0,spacing:3,children:e.jsxs(f,{item:!0,md:5,children:[e.jsx(_,{variant:"contained",color:"primary",type:"submit",disabled:c,children:"Save"})," ",e.jsx("p",{children:e.jsx("small",{style:{color:"error.dark"},children:l==null?void 0:l.message})})]})})]})]})},di=()=>{const{authenticationType:t}=N().uiConfig,{uiConfig:s}=N(),n=[{label:"OpenID Connect",component:e.jsx(ti,{})},{label:"SAML 2.0",component:e.jsx(ni,{})},{label:"Password",component:e.jsx(ri,{})},{label:"Google",component:e.jsx(ci,{})}].filter(i=>{var r;return((r=s.flags)==null?void 0:r.googleAuthEnabled)||i.label!=="Google"}),[o,a]=h.useState(0);return e.jsx("div",{children:e.jsx(ge,{permissions:$e,children:e.jsxs(Q,{withTabs:!0,header:e.jsx(S,{condition:t==="enterprise",show:e.jsx(St,{value:o,onChange:(i,r)=>{a(r)},indicatorColor:"primary",textColor:"primary",children:n.map((i,r)=>e.jsx(vt,{label:i.label,id:`tab-${r}`,"aria-controls":`tabpanel-${r}`,sx:{minWidth:{lg:160}}},`${i.label}_${r}`))})}),children:[e.jsx(S,{condition:t==="open-source",show:e.jsx(rt,{feature:"sso"})}),e.jsx(S,{condition:t==="demo",show:e.jsx(K,{severity:"warning",children:"You are running Unleash in demo mode. You have to use the Enterprise edition in order configure Single Sign-on."})}),e.jsx(S,{condition:t==="custom",show:e.jsx(K,{severity:"warning",children:"You have decided to use custom authentication type. You have to use the Enterprise edition in order configure Single Sign-on from the user interface."})}),e.jsx(S,{condition:t==="hosted",show:e.jsx(K,{severity:"info",children:"Your Unleash instance is managed by the Unleash team."})}),e.jsx(S,{condition:t==="enterprise",show:e.jsx("div",{children:n.map((i,r)=>e.jsx(oo,{value:o,index:r,children:i.component},r))})})]})})})},ui=ie("api/admin/invoices"),hi=m(_)(({theme:t})=>({width:"100%",marginBottom:t.spacing(1.5)})),pi=({update:t})=>e.jsx(hi,{href:`${ui}/${t?"portal":"checkout"}`,variant:t?"outlined":"contained",children:t?"Update billing information":"Add billing information"}),mi=m("aside")(({theme:t})=>({padding:t.spacing(4),height:"100%",borderRadius:t.shape.borderRadiusLarge,backgroundColor:t.palette.background.elevation2})),xi=m(B)(({theme:t})=>({marginBottom:t.spacing(4)})),gi=m(K)(({theme:t})=>({marginBottom:t.spacing(4)})),ws=m(B)(({theme:t})=>({fontSize:t.fontSizes.smallBody,color:t.palette.text.secondary})),ji=m(Qt)(({theme:t})=>({margin:`${t.spacing(2.5)} 0`,borderColor:t.palette.divider})),fi=({instanceStatus:t})=>{const s=t.state!==en.ACTIVE;return e.jsx(f,{item:!0,xs:12,md:5,children:e.jsxs(mi,{children:[e.jsx(xi,{variant:"body1",children:"Billing information"}),e.jsx(S,{condition:s,show:e.jsxs(gi,{severity:"warning",children:["In order to ",e.jsx("strong",{children:"Upgrade trial"})," you need to provide us your billing information."]})}),e.jsx(pi,{update:!s}),e.jsx(ws,{children:s?"Once we have received your billing information we will upgrade your trial within 1 business day":"Update your credit card and business information and change which email address we send invoices to"}),e.jsx(ji,{}),e.jsxs(ws,{children:[e.jsx("a",{href:"mailto:elise@getunleash.ai?subject=PRO plan clarifications",children:"Get in touch with us"})," ","for any clarification"]})]})})},we=()=>{const{data:t,error:s,mutate:n}=Le(ie("api/admin/user-admin"),yi);return h.useMemo(()=>({users:(t==null?void 0:t.users)??[],roles:(t==null?void 0:t.rootRoles)??[],loading:!s&&!t,refetch:()=>n(),error:s}),[t,s,n])},yi=t=>fetch(t).then(je("Users")).then(s=>s.json()),bi=m(f)(({theme:t})=>({flexWrap:"nowrap",gap:t.spacing(1)})),mt=({sx:t,children:s})=>e.jsx(bi,{container:!0,item:!0,justifyContent:"space-between",alignItems:"center",sx:t,children:s}),Pe=({children:t,vertical:s=!1})=>e.jsx(f,{container:s,item:!0,display:"flex",alignItems:s?"start":"center",direction:s?"column":void 0,children:t}),Si=m("span")(({theme:t})=>({fontSize:t.fontSizes.smallBody,marginLeft:t.spacing(1)})),Ts=({children:t})=>e.jsxs(Si,{children:["(",t,")"]}),vi=m("aside")(({theme:t})=>({padding:t.spacing(2.5),height:"100%",borderRadius:t.shape.borderRadiusLarge,boxShadow:t.boxShadows.elevated,[t.breakpoints.up("md")]:{padding:t.spacing(6.5)}})),ks=m(B)(({theme:t})=>({fontSize:t.fontSizes.smallBody,color:t.palette.text.secondary})),Ci=m("span")(({theme:t})=>({fontSize:"3.25rem",lineHeight:1,color:t.palette.primary.main,fontWeight:800})),wi=m("span")(({theme:t})=>({marginLeft:t.spacing(1.5),fontWeight:t.fontWeight.bold})),Ti=m("span")(({theme:t})=>({color:t.palette.primary.main,fontSize:t.fontSizes.mainHeader,fontWeight:t.fontWeight.bold})),ki=m(K)(({theme:t})=>({fontSize:t.fontSizes.smallerBody,marginBottom:t.spacing(3),marginTop:t.spacing(-1.5),[t.breakpoints.up("md")]:{marginTop:t.spacing(-4.5)}})),Ri=m(tn)(({theme:t})=>({fontSize:"1rem",marginRight:t.spacing(1)})),Ei=m(Qt)(({theme:t})=>({margin:`${t.spacing(3)} 0`})),Ai=({instanceStatus:t})=>{var g;const{users:s}=we(),n=ao(t),{uiConfig:o}=N(),a=s.filter(j=>j.email),i={[Ue.PRO]:80,[Ue.COMPANY]:0,[Ue.TEAM]:0,[Ue.ENTERPRISE]:0,[Ue.UNKNOWN]:0,user:15},r=i[t.plan],l=t.seats??5,c=Math.min(a.length,l),d=a.length-c,u=i.user*d,p=r+u,x=t.state!==en.ACTIVE;return e.jsx(f,{item:!0,xs:12,md:7,children:e.jsxs(vi,{children:[e.jsx(S,{condition:x,show:e.jsxs(ki,{severity:"info",children:["After you have sent your billing information, your instance will be upgraded - you don't have to do anything."," ",e.jsx("a",{href:"mailto:elise@getunleash.ai?subject=PRO plan clarifications",children:"Get in touch with us"})," ","for any clarification"]})}),e.jsx(ze,{color:"success",children:"Current plan"}),e.jsx(f,{container:!0,children:e.jsxs(mt,{sx:j=>({marginBottom:j.spacing(3)}),children:[e.jsxs(Pe,{children:[e.jsx(Ci,{children:t.plan}),e.jsx(S,{condition:io(t),show:e.jsx(wi,{sx:j=>({color:n?j.palette.error.dark:j.palette.warning.dark}),children:n?"Trial expired":t.trialExtended?"Extended Trial":"Trial"})})]}),e.jsx(Pe,{children:e.jsx(S,{condition:r>0,show:e.jsxs(Ti,{children:["$",r.toFixed(2)]})})})]})}),e.jsx(S,{condition:!!((g=o==null?void 0:o.flags)!=null&&g.proPlanAutoCharge&&t.plan===Ue.PRO),show:e.jsxs(e.Fragment,{children:[e.jsxs(f,{container:!0,children:[e.jsxs(mt,{sx:j=>({marginBottom:j.spacing(1.5)}),children:[e.jsxs(Pe,{vertical:!0,children:[e.jsxs(B,{children:[e.jsx("strong",{children:"Included members"}),e.jsx(Ts,{children:e.jsxs(re,{to:"/admin/users",children:[c," of 5 assigned"]})})]}),e.jsx(ks,{children:"You have 5 team members included in your PRO plan"})]}),e.jsxs(Pe,{children:[e.jsx(Ri,{}),e.jsx(B,{variant:"body2",children:"included"})]})]}),e.jsxs(mt,{children:[e.jsxs(Pe,{vertical:!0,children:[e.jsxs(B,{children:[e.jsx("strong",{children:"Paid members"}),e.jsx(Ts,{children:e.jsxs(re,{to:"/admin/users",children:[d," assigned"]})})]}),e.jsx(ks,{children:"$15/month per paid member"})]}),e.jsx(Pe,{children:e.jsxs(B,{sx:j=>({fontSize:j.fontSizes.mainHeader}),children:["$",u.toFixed(2)]})})]})]}),e.jsx(Ei,{}),e.jsx(f,{container:!0,children:e.jsxs(mt,{children:[e.jsx(Pe,{children:e.jsx(B,{sx:j=>({fontWeight:j.fontWeight.bold,fontSize:j.fontSizes.mainHeader}),children:"Total per month"})}),e.jsx(Pe,{children:e.jsxs(B,{sx:j=>({fontWeight:j.fontWeight.bold,fontSize:"2rem"}),children:["$",p.toFixed(2)]})})]})})]})})]})})},Di=({instanceStatus:t})=>e.jsxs(f,{container:!0,spacing:4,children:[e.jsx(fi,{instanceStatus:t}),e.jsx(Ai,{instanceStatus:t})]});var hs={},Ii=lo;Object.defineProperty(hs,"__esModule",{value:!0});var An=hs.default=void 0,Pi=Ii(ro()),Bi=e,Li=(0,Pi.default)((0,Bi.jsx)("path",{d:"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"}),"FileDownload");An=hs.default=Li;const Oi=m(B)(({theme:t})=>({marginTop:t.spacing(6),marginBottom:t.spacing(2.5),fontSize:t.fontSizes.mainHeader})),Ui=[{Header:"Amount",accessor:"amountFormatted"},{Header:"Status",accessor:"status",disableGlobalFilter:!0},{Header:"Created date",accessor:"created",Cell:xe,disableGlobalFilter:!0},{Header:"Due date",accessor:"dueDate",Cell:xe,disableGlobalFilter:!0},{Header:"Download",accessor:"invoicePDF",align:"center",Cell:({value:t})=>e.jsx(q,{sx:{display:"flex",justifyContent:"center"},"data-loading":!0,children:e.jsx(Ge,{href:t,children:e.jsx(An,{})})}),width:100,disableGlobalFilter:!0,disableSortBy:!0}],$i=({data:t,isLoading:s=!1})=>{const n=h.useMemo(()=>({sortBy:[{id:"created",desc:!0}]}),[]),{getTableProps:o,getTableBodyProps:a,headerGroups:i,rows:r,prepareRow:l}=U.useTable({columns:Ui,data:t,initialState:n,sortTypes:pe,autoResetGlobalFilter:!1,disableSortRemove:!0,defaultColumn:{Cell:te}},U.useGlobalFilter,U.useSortBy);return e.jsxs(Q,{isLoading:s,disablePadding:!0,children:[e.jsx(Oi,{children:"Payment history"}),e.jsxs(co,{...o(),children:[e.jsx(uo,{headerGroups:i}),e.jsx(Xt,{...a(),children:r.map(c=>(l(c),e.jsx(it,{hover:!0,...c.getRowProps(),children:c.cells.map(d=>e.jsx(ho,{...d.getCellProps(),children:d.render("Cell")}))})))})]}),e.jsx(S,{condition:r.length===0,show:e.jsx(de,{children:"No invoices to show."})})]})},Jt="api/admin/invoices",Ni=ie(Jt),Dn=(t={})=>{const s=()=>fetch(Ni,{method:"GET"}).then(je("Invoices")).then(l=>l.json()),{data:n,error:o}=Le(Jt,s,t),[a,i]=h.useState(!o&&!n),r=()=>{sn(Jt)};return h.useEffect(()=>{i(!o&&!n)},[n,o]),{invoices:(n==null?void 0:n.invoices)||[],error:o,loading:a,refetchInvoices:r}},Fi=()=>{const{instanceStatus:t,isBilling:s,refetchInstanceStatus:n,refresh:o,loading:a}=nn(),{invoices:i}=Dn();return h.useEffect(()=>{(async()=>{await o(),n()})()},[n,o]),e.jsx("div",{children:e.jsx(Q,{header:"Billing",isLoading:a,children:e.jsx(S,{condition:s,show:e.jsx(ge,{permissions:M,children:e.jsxs(e.Fragment,{children:[e.jsx(Di,{instanceStatus:t}),e.jsx($i,{data:i})]})}),elseShow:e.jsx(K,{severity:"error",children:"Billing is not enabled for this instance."})})})})},Gi=ie("api/admin/invoices/portal"),qi=()=>{const{refetchInvoices:t,invoices:s}=Dn(),[n,o]=h.useState(!1),{locationSettings:a}=on();return h.useEffect(()=>{t(),o(!0)},[]),e.jsx(S,{condition:s.length>0,show:e.jsx(Q,{header:e.jsx(X,{title:"Invoices",actions:e.jsx(_,{href:Gi,rel:"noreferrer",target:"_blank",endIcon:e.jsx(po,{}),children:"Billing portal"})}),children:e.jsx("div",{children:e.jsxs(an,{children:[e.jsx(rn,{children:e.jsxs(it,{children:[e.jsx(ae,{children:"Amount"}),e.jsx(ae,{children:"Status"}),e.jsx(ae,{children:"Due date"}),e.jsx(ae,{children:"PDF"}),e.jsx(ae,{children:"Link"})]})}),e.jsx(Xt,{children:s.map(i=>e.jsxs(it,{style:{backgroundColor:i.status==="past-due"?"error.dark":"inherit"},children:[e.jsx(ae,{style:{textAlign:"left"},children:i.amountFormatted}),e.jsx(ae,{style:{textAlign:"left"},children:i.status}),e.jsx(ae,{style:{textAlign:"left"},children:i.dueDate&&ln(i.dueDate,a.locale)}),e.jsx(ae,{style:{textAlign:"left"},children:e.jsx("a",{href:i.invoicePDF,children:"PDF"})}),e.jsx(ae,{style:{textAlign:"left"},children:e.jsx("a",{href:i.invoiceURL,target:"_blank",rel:"noreferrer",children:"Payment link"})})]},i.invoiceURL))})]})})}),elseShow:e.jsx(Q,{children:n&&"No invoices to show."})})},_i=()=>e.jsx("div",{children:e.jsx(ge,{permissions:M,children:e.jsx(qi,{})})}),Wi=()=>{const{uiConfig:t,loading:s}=N();return s?null:t.flags.UNLEASH_CLOUD?e.jsx(mo,{to:"/admin/billing",replace:!0}):e.jsx(_i,{})},Hi=()=>e.jsxs(K,{severity:"info",children:[e.jsxs("p",{children:["Use this page to configure allowed CORS origins for the Frontend API (",e.jsx("code",{children:"/api/frontend"}),")."]}),e.jsxs("p",{children:["This configuration will not affect the Admin API (",e.jsx("code",{children:"/api/admin"}),") nor the Client API (",e.jsx("code",{children:"/api/client"}),")."]}),e.jsxs("p",{children:["An asterisk (",e.jsx("code",{children:"*"}),") may be used to allow API calls from any origin."]}),e.jsx("br",{}),e.jsx("p",{children:"Be aware that changes here will take up to two minutes to be updated. In addition, there is a maxAge on the Access-Control-Allow-Origin header that will instruct browsers to cache this header for some time. The cache period is set to the maxium that the browser allows (2h for Chrome, 24h for Firefox)."})]}),Mi=()=>{const{makeRequest:t,createRequest:s,errors:n,loading:o}=fe({propagateErrors:!0});return{setFrontendSettings:async i=>{const l=s("api/admin/ui-config",{method:"POST",body:JSON.stringify({frontendSettings:{frontendApiOrigins:i}})},"setFrontendSettings");await t(l.caller,l.id)},loading:o,errors:n}},zi=({frontendApiOrigins:t})=>{const{setFrontendSettings:s}=Mi(),{setToastData:n,setToastApiError:o}=J(),[a,i]=h.useState(Rs(t)),r=js(),l=js(),c=async d=>{try{const u=Vi(a);d.preventDefault(),await s(u),i(Rs(u)),n({title:"Settings saved",type:"success"})}catch(u){o(z(u))}};return e.jsx("form",{onSubmit:c,children:e.jsxs(q,{sx:{display:"grid",gap:1},children:[e.jsxs("label",{htmlFor:r,children:["Which origins should be allowed to call the Frontend API? Add only one origin per line. The CORS specification does not support wildcard for subdomains, it needs to be a fully qualified domain, including the protocol.",e.jsx("br",{}),e.jsx("br",{}),'If you specify "*" it will be the chosen origin.',e.jsx("br",{}),e.jsx("br",{}),"Example:"]}),e.jsxs("code",{style:{fontSize:"0.7em"},children:["https://www.example.com",e.jsx("br",{}),"https://www.example2.com"]}),e.jsx(Z,{id:r,"aria-describedby":l,placeholder:Yi,value:a,onChange:d=>i(d.target.value),multiline:!0,rows:12,variant:"outlined",fullWidth:!0,InputProps:{style:{fontFamily:"monospace",fontSize:"0.8em"}}}),e.jsx(cn,{permission:M})]})})},Vi=t=>t.split(/[,\n\s]+/).map(s=>s.replace(/\/$/,"")).filter(Boolean),Rs=t=>(t==null?void 0:t.join(`
5
+ `))??"",Yi=["https://example.com","https://example.org"].join(`
6
+ `),Ji=()=>e.jsx("div",{children:e.jsx(ge,{permissions:M,children:e.jsx(Ki,{})})}),Ki=()=>{const{uiConfig:t,loading:s}=N();return s?null:e.jsx(Q,{header:e.jsx(X,{title:"CORS origins"}),children:e.jsxs(q,{sx:{display:"grid",gap:4},children:[e.jsx(Hi,{}),e.jsx(zi,{frontendApiOrigins:t.frontendApiOrigins})]})})},Fe=()=>{const{data:t,error:s,mutate:n}=Le(ie("api/admin/groups"),Zi);return h.useMemo(()=>({groups:(t==null?void 0:t.groups.map(o=>({...o,users:_a(o.users??[])})))??[],loading:!s&&!t,refetchGroups:()=>n(),error:s}),[t,s,n])},Zi=t=>fetch(t).then(je("Groups")).then(s=>s.json()),Qi=m(dn)(({theme:t})=>({pointerEvents:"none",".MuiPaper-root":{padding:t.spacing(2)}})),Xi=m("div")(({theme:t})=>({color:t.palette.text.secondary,fontSize:t.fontSizes.smallBody,marginTop:t.spacing(1)})),er=({user:t,open:s,anchorEl:n,onPopoverClose:o})=>e.jsxs(Qi,{open:s,anchorEl:n,onClose:o,anchorOrigin:{vertical:"bottom",horizontal:"left"},transformOrigin:{vertical:"top",horizontal:"left"},children:[e.jsx(Xi,{children:(t==null?void 0:t.name)||(t==null?void 0:t.username)}),e.jsx("div",{children:t==null?void 0:t.email})]}),tr=m("div")(({theme:t})=>({display:"inline-flex",alignItems:"center",flexWrap:"wrap",marginLeft:t.spacing(1)})),Es=m(Oe)(({theme:t})=>({outline:`${t.spacing(.25)} solid ${t.palette.background.paper}`,marginLeft:t.spacing(-1),"&:hover":{outlineColor:t.palette.primary.main}})),sr=({users:t})=>{const s=h.useMemo(()=>t.sort((d,u)=>(u==null?void 0:u.joinedAt.getTime())-(d==null?void 0:d.joinedAt.getTime())).slice(0,9),[t]),[n,o]=h.useState(null),[a,i]=h.useState(),r=d=>{o(d.currentTarget)},l=()=>{o(null)},c=!!n;return e.jsxs(tr,{children:[s.map(d=>e.jsx(Es,{user:d,onMouseEnter:u=>{r(u),i(d)},onMouseLeave:l},d.id)),e.jsx(S,{condition:t.length>9,show:e.jsxs(Es,{children:["+",t.length-s.length]})}),e.jsx(er,{open:c,user:a,anchorEl:n,onPopoverClose:l})]})},nr=m("div")(({theme:t})=>({display:"flex",justifyContent:"center",transform:"translate3d(8px, -6px, 0)"})),or=m(dn)(({theme:t})=>({borderRadius:t.shape.borderRadiusLarge,padding:t.spacing(1,1.5)})),ar=({groupId:t,onEditUsers:s,onRemove:n})=>{const[o,a]=h.useState(null),i=!!o,r=u=>{a(u.currentTarget)},l=()=>{a(null)},c=`feature-${t}-actions`,d=`${c}-menu`;return e.jsxs(nr,{onClick:u=>{u.preventDefault(),u.stopPropagation()},children:[e.jsx(Be,{title:"Group actions",arrow:!0,describeChild:!0,children:e.jsx(Ge,{id:c,"aria-controls":i?d:void 0,"aria-haspopup":"true","aria-expanded":i?"true":void 0,onClick:r,type:"button",children:e.jsx(xo,{})})}),e.jsx(or,{id:d,anchorEl:o,open:i,onClose:l,transformOrigin:{horizontal:"right",vertical:"top"},anchorOrigin:{horizontal:"right",vertical:"bottom"},disableScrollLock:!0,children:e.jsxs(go,{"aria-labelledby":c,children:[e.jsxs(He,{onClick:l,component:re,to:`/admin/groups/${t}/edit`,children:[e.jsx(Ot,{children:e.jsx(Ve,{})}),e.jsx(Ut,{children:e.jsx(B,{variant:"body2",children:"Edit group"})})]}),e.jsxs(He,{onClick:()=>{s(),l()},children:[e.jsx(Ot,{children:e.jsx(Ma,{})}),e.jsx(Ut,{children:e.jsx(B,{variant:"body2",children:"Edit group users"})})]}),e.jsxs(He,{onClick:()=>{n(),l()},children:[e.jsx(Ot,{children:e.jsx(Ae,{})}),e.jsx(Ut,{children:e.jsx(B,{variant:"body2",children:"Delete group"})})]})]})})]})},ir=m(re)(({theme:t})=>({textDecoration:"none",color:t.palette.text.primary})),rr=m("aside")(({theme:t})=>({padding:t.spacing(2.5),height:"100%",border:`1px solid ${t.palette.divider}`,borderRadius:t.shape.borderRadiusLarge,boxShadow:t.boxShadows.card,display:"flex",flexDirection:"column",[t.breakpoints.up("md")]:{padding:t.spacing(4)},"&:hover":{transition:"background-color 0.2s ease-in-out",backgroundColor:t.palette.neutral.light}})),In=m("div")(()=>({display:"flex",alignItems:"center",justifyContent:"space-between"})),lr=m(In)(()=>({alignItems:"flex-start"})),cr=m(In)(()=>({marginTop:"auto"})),dr=m("h2")(({theme:t})=>({fontSize:t.fontSizes.mainHeader,fontWeight:t.fontWeight.medium})),ur=m("div")(({theme:t})=>({display:"flex",alignItems:"center",color:t.palette.text.secondary,fontSize:t.fontSizes.smallBody})),hr=m("p")(({theme:t})=>({color:t.palette.text.secondary,fontSize:t.fontSizes.smallBody,marginTop:t.spacing(1),marginBottom:t.spacing(4)})),pr=m("span")(({theme:t})=>({color:t.palette.text.secondary,marginLeft:t.spacing(1)})),mr=m("div")(({theme:t})=>({maxWidth:"50%",display:"flex",justifyContent:"flex-end",gap:t.spacing(.5),flexWrap:"wrap"})),xr=m("span")(({theme:t})=>({display:"flex",color:t.palette.text.secondary,alignItems:"center",gap:t.spacing(1),fontSize:t.fontSizes.smallBody})),gr=({group:t,onEditUsers:s,onRemoveGroup:n})=>{var a;const o=ve();return e.jsx(e.Fragment,{children:e.jsx(ir,{to:`/admin/groups/${t.id}`,children:e.jsxs(rr,{children:[e.jsxs(lr,{children:[e.jsx(dr,{children:t.name}),e.jsx(ur,{children:e.jsx(ar,{groupId:t.id,onEditUsers:()=>s(t),onRemove:()=>n(t)})})]}),e.jsx(S,{condition:!!t.rootRole,show:e.jsxs(xr,{children:[e.jsx("p",{children:"Root role:"}),e.jsx(jo,{roleId:t.rootRole})]})}),e.jsx(hr,{children:t.description}),e.jsxs(cr,{children:[e.jsx(S,{condition:((a=t.users)==null?void 0:a.length)>0,show:e.jsx(sr,{users:t.users}),elseShow:e.jsx(pr,{children:"This group has no users."})}),e.jsx(mr,{children:e.jsx(S,{condition:t.projects.length>0,show:t.projects.map(i=>e.jsx(Be,{title:"View project",arrow:!0,placement:"bottom-end",describeChild:!0,children:e.jsx(ze,{onClick:r=>{r.preventDefault(),o(`/projects/${i}/settings/access`)},color:"secondary",icon:e.jsx(fo,{}),children:i})},i)),elseShow:e.jsx(Be,{title:"This group is not used in any project",arrow:!0,describeChild:!0,children:e.jsx(S,{condition:!t.rootRole,show:e.jsx(ze,{children:"Not used"})})})})})]})]})},t.id)})},jr=()=>{const t=m("div")(({theme:n})=>({display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",margin:n.spacing(6),marginLeft:"auto",marginRight:"auto"})),s=m(B)(({theme:n})=>({fontSize:n.fontSizes.bodySize,marginBottom:n.spacing(2.5)}));return e.jsxs(t,{children:[e.jsx(s,{children:"No groups available. Get started by adding a new group."}),e.jsx(_,{to:"/admin/groups/create-group",component:re,variant:"outlined",color:"primary",children:"Create your first group"})]})},ut=()=>{const{makeRequest:t,createRequest:s,errors:n,loading:o}=fe({propagateErrors:!0});return{createGroup:async l=>{const d=s("api/admin/groups",{method:"POST",body:JSON.stringify(l)});return(await t(d.caller,d.id)).json()},updateGroup:async(l,c)=>{const d=`api/admin/groups/${l}`,u=s(d,{method:"PUT",body:JSON.stringify(c)});await t(u.caller,u.id)},removeGroup:async l=>{const c=`api/admin/groups/${l}`,d=s(c,{method:"DELETE"});await t(d.caller,d.id)},errors:n,loading:o}},fr=m("div")(({theme:t})=>({display:"flex",flexDirection:"column","& > span:first-of-type":{color:t.palette.text.secondary}})),yr=m("div")(({theme:t})=>({paddingLeft:t.spacing(1)})),br=m("div")(({theme:t})=>({display:"flex",marginBottom:t.spacing(3),"& > div:first-of-type":{width:"100%",maxWidth:t.spacing(50),marginRight:t.spacing(1)}})),Sr=(t,s,n)=>e.jsxs("li",{...t,children:[e.jsx(es,{icon:e.jsx(bo,{fontSize:"small"}),checkedIcon:e.jsx(So,{fontSize:"small"}),style:{marginRight:8},checked:n}),e.jsxs(fr,{children:[e.jsx("span",{children:s.name||s.username}),e.jsx("span",{children:s.name&&s.username?s.username:s.email})]})]}),vr=t=>e.jsx(yr,{children:t.length>1?`${t.length} users selected`:t[0].name||t[0].username||t[0].email}),Pn=({users:t,setUsers:s})=>{const{users:n}=we(),{serviceAccounts:o}=ct(),a=[...n.map(i=>({...i,type:"USERS"})).sort((i,r)=>{const l=i.name||i.username||"",c=r.name||r.username||"";return l.localeCompare(c)}),...o.map(i=>({...i,type:"SERVICE ACCOUNTS"})).sort((i,r)=>{const l=i.name||i.username||"",c=r.name||r.username||"";return l.localeCompare(c)})];return e.jsx(br,{children:e.jsx(Zs,{"data-testid":yo,size:"small",multiple:!0,limitTags:1,openOnFocus:!0,disableCloseOnSelect:!0,value:t,onChange:(i,r,l)=>{i.type==="keydown"&&i.key==="Backspace"&&l==="removeOption"||s(r)},groupBy:i=>i.type,options:a,renderOption:(i,r,{selected:l})=>Sr(i,r,l),filterOptions:(i,{inputValue:r})=>i.filter(({name:l,username:c,email:d})=>$t(r,d)||$t(r,l)||$t(r,c)),isOptionEqualToValue:(i,r)=>i.id===r.id,getOptionLabel:i=>i.email||i.name||i.username||"",renderInput:i=>e.jsx(Z,{...i,label:"Select users"}),renderTags:i=>vr(i)})})},Cr=["imageUrl","name"],Bn=({users:t,setUsers:s})=>{const n=he(De.breakpoints.down("md")),o=h.useMemo(()=>[{Header:"Avatar",accessor:"imageUrl",Cell:({row:{original:d}})=>e.jsx(te,{children:e.jsx(Oe,{user:d})}),maxWidth:85,disableSortBy:!0},{id:"name",Header:"Name",accessor:d=>d.name||"",Cell:({value:d,row:{original:u}})=>e.jsx(Se,{value:d,subtitle:u.email||u.username}),minWidth:100,searchable:!0},{Header:"Action",id:"Action",align:"center",Cell:({row:{original:d}})=>e.jsx(yt,{children:e.jsx(Be,{title:"Remove user from group",arrow:!0,describeChild:!0,children:e.jsx(Ge,{onClick:()=>s(u=>u.filter(p=>p.id!==d.id)),children:e.jsx(Ae,{})})})}),maxWidth:100,disableSortBy:!0},{accessor:d=>d.username||"",Header:"Username",searchable:!0},{accessor:d=>d.email||"",Header:"Email",searchable:!0}],[s]),[a]=h.useState(()=>({hiddenColumns:["Username","Email"]})),{headerGroups:i,rows:r,prepareRow:l,setHiddenColumns:c}=U.useTable({columns:o,data:t,initialState:a,sortTypes:pe,autoResetHiddenColumns:!1,autoResetSortBy:!1,disableSortRemove:!0,disableMultiSort:!0},U.useSortBy,U.useFlexLayout);return Ye([{condition:n,columns:Cr}],c,o),e.jsx(S,{condition:r.length>0,show:e.jsx(ye,{rows:r,headerGroups:i,prepareRow:l})})},ps=(t="",s="",n=[],o=[],a=null)=>{const r=vo().get("name"),[l,c]=h.useState(r||t),[d,u]=h.useState(s),[p,x]=h.useState(n),[g,j]=h.useState(o),[y,w]=h.useState(a),[C,k]=h.useState({});return{name:l,setName:c,description:d,setDescription:u,mappingsSSO:p,setMappingsSSO:x,users:g,setUsers:j,getGroupPayload:()=>({name:l,description:d,mappingsSSO:p,users:g.map(({id:L})=>({user:{id:L}})),rootRole:y||void 0}),clearErrors:()=>{k({})},errors:C,setErrors:k,rootRole:y,setRootRole:w}},wr=m("form")(()=>({display:"flex",flexDirection:"column",height:"100%"})),Tr=m("p")(({theme:t})=>({color:t.palette.text.secondary,marginBottom:t.spacing(1)})),kr=m("div")(()=>({marginTop:"auto",display:"flex",justifyContent:"flex-end"})),Rr=m(_)(({theme:t})=>({marginLeft:t.spacing(3)})),Er=m(q)(({theme:t})=>({marginTop:t.spacing(2)})),Ln=({open:t,setOpen:s,group:n})=>{const{refetchGroup:o}=kt(n.id),{refetchGroups:a}=Fe(),{updateGroup:i,loading:r}=ut(),{setToastData:l,setToastApiError:c}=J(),{uiConfig:d}=N(),{users:u,setUsers:p,getGroupPayload:x}=ps(n.name,n.description,n.mappingsSSO,n.users,n.rootRole);h.useEffect(()=>{p(n.users)},[n.users,t,p]);const g=async y=>{y.preventDefault();try{await i(n.id,x()),o(),a(),s(!1),l({title:"Group users saved successfully",type:"success"})}catch(w){c(z(w))}},j=()=>`curl --location --request PUT '${d.unleashUrl}/api/admin/groups/${n.id}' \\
7
+ --header 'Authorization: INSERT_API_KEY' \\
8
+ --header 'Content-Type: application/json' \\
9
+ --data-raw '${JSON.stringify(x(),void 0,2)}'`;return e.jsx(Ct,{open:t,onClose:()=>{s(!1)},label:"Edit users",children:e.jsx(Ce,{loading:r,modal:!0,title:"Edit users",description:"Groups is the best and easiest way to organize users and then use them in projects to assign a specific role in one go to all the users in a group.",documentationLink:"https://docs.getunleash.io/reference/rbac#user-groups",documentationLinkLabel:"Groups documentation",formatApiCode:j,children:e.jsxs(wr,{onSubmit:g,children:[e.jsxs("div",{children:[e.jsx(Tr,{children:"Edit users in this group"}),e.jsx(Pn,{users:u,setUsers:p}),e.jsx(Bn,{users:u,setUsers:p})]}),e.jsx(kr,{children:e.jsxs(Er,{children:[e.jsx(_,{type:"submit",variant:"contained",color:"primary","data-testid":un,children:"Save"}),e.jsx(Rr,{onClick:()=>{s(!1)},children:"Cancel"})]})})]})})})},On=({open:t,setOpen:s,group:n})=>{const{refetchGroups:o}=Fe(),{removeGroup:a}=ut(),{setToastData:i,setToastApiError:r}=J(),l=ve(),c=async()=>{try{await a(n.id),o(),s(!1),l("/admin/groups"),i({title:"Group removed successfully",type:"success"})}catch(d){r(z(d))}};return e.jsx(se,{open:t,primaryButtonText:"Delete group",secondaryButtonText:"Cancel",onClick:c,onClose:()=>{s(!1)},title:"Delete group?",children:e.jsxs(B,{children:["Do you really want to delete ",e.jsx("strong",{children:n.name}),"? Users who are granted access to projects only via this group will lose access to those projects."]})})},Ar=(t,s)=>{var a,i,r,l,c,d,u;const n=s.toLowerCase(),o={names:(a=t.users)==null?void 0:a.map(p=>{var x;return((x=p.name)==null?void 0:x.toLowerCase())||""}),usernames:(i=t.users)==null?void 0:i.map(p=>{var x;return((x=p.username)==null?void 0:x.toLowerCase())||""}),emails:(r=t.users)==null?void 0:r.map(p=>{var x;return((x=p.email)==null?void 0:x.toLowerCase())||""})};return t.name.toLowerCase().includes(n)||((l=t.description)==null?void 0:l.toLowerCase().includes(n))||((c=o.names)==null?void 0:c.some(p=>p.includes(n)))||((d=o.usernames)==null?void 0:d.some(p=>p.includes(n)))||((u=o.emails)==null?void 0:u.some(p=>p.includes(n)))},Dr=()=>{const t=ve(),[s,n]=h.useState(!1),[o,a]=h.useState(!1),[i,r]=h.useState(void 0),{groups:l=[],loading:c}=Fe(),[d,u]=hn(),[p,x]=h.useState(d.get("search")||""),g=he(De.breakpoints.down("md"));h.useEffect(()=>{const C={};p&&(C.search=p),u(C,{replace:!0})},[p,u]);const j=h.useMemo(()=>{const C=l.sort((k,A)=>k.name.localeCompare(A.name));return p?C.filter(k=>Ar(k,p)):C},[l,p]),y=C=>{r(C),n(!0)},w=C=>{r(C),a(!0)};return e.jsxs(Q,{isLoading:c,header:e.jsx(X,{title:`Groups (${j.length})`,actions:e.jsxs(e.Fragment,{children:[e.jsx(S,{condition:!g,show:e.jsxs(e.Fragment,{children:[e.jsx(le,{initialValue:p,onChange:x}),e.jsx(X.Divider,{})]})}),e.jsx(ts,{onClick:()=>t("/admin/groups/create-group"),maxWidth:"700px",Icon:wt,permission:M,"data-testid":Co,children:"New group"})]}),children:e.jsx(S,{condition:g,show:e.jsx(le,{initialValue:p,onChange:x})})}),children:[e.jsx(qe,{value:p,children:e.jsx(f,{container:!0,spacing:2,children:j.map(C=>e.jsx(f,{item:!0,xs:12,md:6,children:e.jsx(gr,{group:C,onEditUsers:y,onRemoveGroup:w})},C.id))})}),e.jsx(S,{condition:!c&&j.length===0,show:e.jsx(S,{condition:(p==null?void 0:p.length)>0,show:e.jsxs(de,{children:["No groups found matching “",p,"”"]}),elseShow:e.jsx(jr,{})})}),e.jsx(S,{condition:!!i,show:e.jsx(Ln,{open:s,setOpen:n,group:i})}),e.jsx(S,{condition:!!i,show:e.jsx(On,{open:o,setOpen:a,group:i})})]})},Ir=m("div")(({theme:t})=>({display:"flex",marginBottom:t.spacing(1),"& > div:first-of-type":{width:"100%",marginRight:t.spacing(1),"& > div:first-of-type":{width:"100%"}}})),Pr=({label:t,value:s,onChange:n,...o})=>{const[a,i]=h.useState(""),r=()=>{n(c=>[...c,a]),i("")},l=c=>{n(d=>d.filter(u=>u!==c))};return e.jsxs("div",{...o,children:[e.jsxs(Ir,{children:[e.jsx(_e,{label:t,value:a,onChange:c=>i(c.target.value),onKeyPress:c=>{c.key==="Enter"&&r()}}),e.jsx(_,{startIcon:e.jsx(wt,{}),onClick:r,variant:"outlined",color:"primary",disabled:!a.trim()||s.includes(a),children:"Add"})]}),e.jsx(wo,{flexDirection:"row",flexWrap:"wrap",gap:1,children:s==null?void 0:s.map((c,d)=>e.jsx(To,{label:c,onDelete:()=>l(c)},d))})]})},Br=m("form")(()=>({display:"flex",flexDirection:"column",height:"100%"})),Xe=m("p")(({theme:t})=>({color:t.palette.text.secondary,marginBottom:t.spacing(1)})),As=m(_e)(({theme:t})=>({width:"100%",maxWidth:t.spacing(60),marginBottom:t.spacing(2)})),Lr=m(Pr)(({theme:t})=>({width:"100%",maxWidth:t.spacing(60),marginBottom:t.spacing(2)})),Or=m("div")(({theme:t})=>({marginBottom:t.spacing(6)})),Ur=m("div")(()=>({marginTop:"auto",display:"flex",justifyContent:"flex-end"})),$r=m(_)(({theme:t})=>({marginLeft:t.spacing(3)})),Nr=m("div")(({theme:t})=>({width:"100%",maxWidth:t.spacing(60),padding:t.spacing(3),backgroundColor:t.palette.neutral.light,color:t.palette.text.primary,fontSize:t.fontSizes.smallBody,borderRadius:t.shape.borderRadiusMedium,marginBottom:t.spacing(2),a:{color:t.palette.links}})),Fr=m("div")(({theme:t})=>({"& > div:first-of-type":{width:"100%",maxWidth:t.spacing(50),marginBottom:t.spacing(2)}})),Un=({name:t,description:s,mappingsSSO:n,users:o,rootRole:a,setName:i,setDescription:r,setMappingsSSO:l,setUsers:c,handleSubmit:d,handleCancel:u,setRootRole:p,errors:x,mode:g,children:j})=>{const{config:y}=Me("oidc"),{config:w}=Me("saml"),{roles:C}=we(),k=(y==null?void 0:y.enabled)&&y.enableGroupSyncing||(w==null?void 0:w.enabled)&&w.enableGroupSyncing,A=T=>C.find(L=>L.id===T)||null;return e.jsxs(Br,{onSubmit:d,children:[e.jsxs("div",{children:[e.jsx(Xe,{children:"What would you like to call your group?"}),e.jsx(As,{autoFocus:!0,label:"Name",id:"group-name",error:!!x.name,errorText:x.name,value:t,onChange:T=>i(T.target.value),"data-testid":ko,required:!0}),e.jsx(Xe,{children:"How would you describe your group?"}),e.jsx(As,{multiline:!0,rows:4,label:"Description",placeholder:"A short description of the group",value:s,onChange:T=>r(T.target.value),"data-testid":Ro}),e.jsx(S,{condition:k,show:e.jsxs(e.Fragment,{children:[e.jsx(Xe,{children:"Is this group associated with SSO groups?"}),e.jsx(Lr,{label:"SSO group ID / name",value:n,onChange:l})]}),elseShow:()=>e.jsxs(Nr,{children:[e.jsxs(q,{sx:{display:"flex"},children:["You can enable SSO groups synchronization if needed",e.jsx(at,{tooltip:"SSO groups synchronization allows SSO groups to be mapped to Unleash groups, so that user group membership is properly synchronized."})]}),e.jsx(re,{"data-loading":!0,to:"/admin/auth",children:e.jsx("span",{"data-loading":!0,children:"View SSO configuration"})})]})}),e.jsx(Xe,{children:e.jsxs(q,{sx:{display:"flex"},children:["Do you want to associate a root role with this group?",e.jsx(at,{tooltip:"When you associate a root role with this group, users in this group will automatically inherit the role globally."})]})}),e.jsx(Fr,{children:e.jsx(Rt,{"data-testid":"GROUP_ROOT_ROLE",roles:C,value:A(a),setValue:T=>p((T==null?void 0:T.id)||null)})}),e.jsx(S,{condition:g==="Create",show:e.jsxs(e.Fragment,{children:[e.jsx(Xe,{children:"Add users to this group"}),e.jsx(Pn,{users:o,setUsers:c}),e.jsx(Or,{children:e.jsx(Bn,{users:o,setUsers:c})})]})})]}),e.jsxs(Ur,{children:[j,e.jsx($r,{onClick:u,children:"Cancel"})]})]})},Gr=()=>{const{setToastData:t,setToastApiError:s}=J(),{uiConfig:n}=N(),o=ve(),{name:a,setName:i,description:r,setDescription:l,mappingsSSO:c,setMappingsSSO:d,users:u,setUsers:p,rootRole:x,setRootRole:g,getGroupPayload:j,clearErrors:y,errors:w,setErrors:C}=ps(),{groups:k}=Fe(),{createGroup:A,loading:T}=ut(),L=async D=>{if(D.preventDefault(),y(),!R)return;const W=j();try{const E=await A(W);o(`/admin/groups/${E.id}`),t({title:"Group created successfully",text:"Now you can start using your group.",confetti:!0,type:"success"})}catch(E){s(z(E))}},P=()=>`curl --location --request POST '${n.unleashUrl}/api/admin/groups' \\
10
+ --header 'Authorization: INSERT_API_KEY' \\
11
+ --header 'Content-Type: application/json' \\
12
+ --data-raw '${JSON.stringify(j(),void 0,2)}'`,I=()=>{o(Ee)},v=D=>D.length,F=D=>!(k!=null&&k.filter(W=>W.name===D).length),R=v(a)&&F(a),b=D=>{y(),F(D)||C({name:"A group with that name already exists."}),i(D)};return e.jsx(Ce,{loading:T,title:"Create group",description:"Groups is the best and easiest way to organize users and then use them in projects to assign a specific role in one go to all the users in a group.",documentationLink:"https://docs.getunleash.io/reference/rbac#user-groups",documentationLinkLabel:"Groups documentation",formatApiCode:P,children:e.jsx(Un,{name:a,description:r,mappingsSSO:c,rootRole:x,users:u,setName:b,setDescription:l,setMappingsSSO:d,setRootRole:g,setUsers:p,errors:w,handleSubmit:L,handleCancel:I,mode:Eo,children:e.jsx(_,{type:"submit",variant:"contained",color:"primary",disabled:!R,"data-testid":Ao,children:"Create group"})})})},qr=()=>{const t=Number(ss("groupId")),{group:s,refetchGroup:n}=kt(t);return s?e.jsx(_r,{group:s,groupId:t,refetchGroup:n}):null},_r=({group:t,groupId:s,refetchGroup:n})=>{const{refetchGroups:o}=Fe(),{setToastData:a,setToastApiError:i}=J(),{uiConfig:r}=N(),l=ve(),{name:c,setName:d,description:u,setDescription:p,mappingsSSO:x,setMappingsSSO:g,users:j,setUsers:y,rootRole:w,setRootRole:C,getGroupPayload:k,clearErrors:A,errors:T,setErrors:L}=ps(t==null?void 0:t.name,t==null?void 0:t.description,t==null?void 0:t.mappingsSSO,t==null?void 0:t.users,t==null?void 0:t.rootRole),{groups:P}=Fe(),{updateGroup:I,loading:v}=ut(),F=async V=>{V.preventDefault(),A();const ne=k();try{await I(s,ne),n(),o(),l(Ee),a({title:"Group updated successfully",type:"success"})}catch(oe){i(z(oe))}},R=()=>`curl --location --request PUT '${r.unleashUrl}/api/admin/groups/${s}' \\
13
+ --header 'Authorization: INSERT_API_KEY' \\
14
+ --header 'Content-Type: application/json' \\
15
+ --data-raw '${JSON.stringify(k(),void 0,2)}'`,b=()=>{l(Ee)},D=V=>V.length,W=V=>!(P!=null&&P.filter(ne=>ne.name===V&&ne.id!==s).length),E=D(c)&&W(c),$=V=>{A(),W(V)||L({name:"A group with that name already exists."}),d(V)};return e.jsx(Ce,{loading:v,title:"Edit group",description:"Groups is the best and easiest way to organize users and then use them in projects to assign a specific role in one go to all the users in a group.",documentationLink:"https://docs.getunleash.io/reference/rbac#user-groups",documentationLinkLabel:"Groups documentation",formatApiCode:R,children:e.jsx(Un,{name:c,description:u,mappingsSSO:x,users:j,rootRole:w,setName:$,setDescription:p,setMappingsSSO:g,setUsers:y,setRootRole:C,errors:T,handleSubmit:F,handleCancel:b,mode:ns,children:e.jsx(_,{type:"submit",variant:"contained",color:"primary",disabled:!E,"data-testid":un,children:"Save"})})})},Wr=m(pn)(({theme:t})=>({borderRadius:t.shape.borderRadiusLarge,padding:t.spacing(2.5,4),boxShadow:"none",marginBottom:t.spacing(2),fontSize:t.fontSizes.smallBody})),Hr=m("div")(({theme:t})=>({display:"flex",alignItems:"center",justifyContent:"space-between"})),Mr=m("h1")(({theme:t})=>({fontSize:t.fontSizes.mainHeader})),zr=m("div")(({theme:t})=>({display:"flex"})),Vr=m("span")(({theme:t})=>({color:t.palette.text.secondary,fontSize:t.fontSizes.smallBody,marginLeft:t.spacing(1)})),Yr=({title:t,description:s,actions:n})=>(Js(t),e.jsxs(Wr,{children:[e.jsxs(Hr,{children:[e.jsx(Mr,{children:t}),e.jsx(zr,{children:n})]}),e.jsx(S,{condition:!!(s!=null&&s.length),show:e.jsxs(e.Fragment,{children:["Description:",e.jsx(Vr,{children:s})]})})]})),Jr=({open:t,setOpen:s,user:n,group:o})=>{const{refetchGroup:a}=kt(o.id),{updateGroup:i}=ut(),{setToastData:r,setToastApiError:l}=J(),c=async()=>{try{const u={...o,users:o.users.filter(({id:p})=>p!==(n==null?void 0:n.id)).map(({id:p})=>({user:{id:p}}))};await i(o.id,u),a(),s(!1),r({title:"User removed from group successfully",type:"success"})}catch(u){l(z(u))}},d=(n==null?void 0:n.name)||(n==null?void 0:n.username)||(n==null?void 0:n.email);return e.jsx(se,{open:t&&!!n,primaryButtonText:"Remove user",secondaryButtonText:"Cancel",onClick:c,onClose:()=>{s(!1)},title:"Remove user from group?",children:e.jsxs(B,{children:["Do you really want to remove ",e.jsx("strong",{children:d})," from"," ",e.jsx("strong",{children:o.name}),"? ",e.jsx("strong",{children:d})," will lose all access rights granted by this group."]})})},Kr=Array(15).fill({name:"Name of the user",username:"Username of the user"}),Zr={id:"joinedAt",desc:!0},{value:Ds,setValue:Qr}=Do("Group:v1",Zr),Xr=()=>{const t=Number(ss("groupId")),s=os(),n=he(s.breakpoints.down("md")),{group:o,loading:a}=kt(t),[i,r]=h.useState(!1),[l,c]=h.useState(!1),[d,u]=h.useState(!1),[p,x]=h.useState(),g=h.useMemo(()=>[{Header:"Avatar",accessor:"imageUrl",Cell:({row:{original:b}})=>e.jsx(te,{children:e.jsx(Oe,{user:b})}),maxWidth:85,disableSortBy:!0},{id:"name",Header:"Name",accessor:b=>b.name||"",Cell:({value:b,row:{original:D}})=>e.jsx(Se,{value:b,subtitle:D.email||D.username}),minWidth:100,searchable:!0},{Header:"Joined",accessor:"joinedAt",Cell:xe,maxWidth:150},{id:"createdBy",Header:"Added by",accessor:"createdBy",Cell:Se,minWidth:90,searchable:!0},{Header:"Last login",accessor:b=>b.seenAt||"",Cell:({row:{original:b}})=>e.jsx(Je,{value:b.seenAt,emptyText:"Never",title:D=>`Last login: ${D}`}),maxWidth:150},{Header:"Actions",id:"Actions",align:"center",Cell:({row:{original:b}})=>e.jsx(yt,{children:e.jsx(Be,{title:"Remove user from group",arrow:!0,describeChild:!0,children:e.jsx("span",{children:e.jsx(Ge,{"data-testid":`${Io}-${b.id}`,onClick:()=>{x(b),u(!0)},children:e.jsx(Ae,{})})})})}),maxWidth:100,disableSortBy:!0},{accessor:b=>b.username||"",Header:"Username",searchable:!0},{accessor:b=>b.email||"",Header:"Email",searchable:!0}],[x,u]),[j,y]=hn(),[w]=h.useState(()=>({sortBy:[{id:j.get("sort")||Ds.id,desc:j.has("order")?j.get("order")==="desc":Ds.desc}],hiddenColumns:["Username","Email"],globalFilter:j.get("search")||""})),[C,k]=h.useState(w.globalFilter),{data:A,getSearchText:T,getSearchContext:L}=Ke(g,C,(o==null?void 0:o.users)??[]),P=h.useMemo(()=>(A==null?void 0:A.length)===0&&a?Kr:A,[A,a]),{headerGroups:I,rows:v,prepareRow:F,state:{sortBy:R}}=U.useTable({columns:g,data:P,initialState:w,sortTypes:pe,autoResetSortBy:!1,disableSortRemove:!0,disableMultiSort:!0},U.useSortBy,U.useFlexLayout);return h.useEffect(()=>{const b={};b.sort=R[0].id,R[0].desc&&(b.order="desc"),C&&(b.search=C),y(b,{replace:!0}),Qr({id:R[0].id,desc:R[0].desc||!1})},[R,C,y]),e.jsx(S,{condition:!!o,show:e.jsxs(e.Fragment,{children:[e.jsx(Yr,{title:o==null?void 0:o.name,description:o==null?void 0:o.description,actions:e.jsxs(e.Fragment,{children:[e.jsx(ue,{"data-testid":Po,to:`/admin/groups/${t}/edit`,component:re,"data-loading":!0,permission:M,tooltipProps:{title:"Edit group"},children:e.jsx(Ve,{})}),e.jsx(ue,{"data-testid":Bo,"data-loading":!0,onClick:()=>r(!0),permission:M,tooltipProps:{title:"Delete group"},children:e.jsx(Ae,{})})]})}),e.jsxs(Q,{isLoading:a,header:e.jsx(X,{secondary:!0,title:`Users (${v.length<P.length?`${v.length} of ${P.length}`:P.length})`,actions:e.jsxs(e.Fragment,{children:[e.jsx(S,{condition:!n,show:e.jsxs(e.Fragment,{children:[e.jsx(le,{initialValue:C,onChange:k,hasFilters:!0,getSearchContext:L}),e.jsx(X.Divider,{})]})}),e.jsx(ts,{"data-testid":Lo,onClick:()=>{c(!0)},maxWidth:"700px",Icon:wt,permission:M,children:"Edit users"})]}),children:e.jsx(S,{condition:n,show:e.jsx(le,{initialValue:C,onChange:k,hasFilters:!0,getSearchContext:L})})}),children:[e.jsx(qe,{value:T(C),children:e.jsx(ye,{rows:v,headerGroups:I,prepareRow:F})}),e.jsx(S,{condition:v.length===0,show:e.jsx(S,{condition:(C==null?void 0:C.length)>0,show:e.jsxs(de,{children:["No users found matching “",C,"” in this group."]}),elseShow:e.jsx(de,{children:"This group is empty. Get started by adding a user to the group."})})}),e.jsx(On,{open:i,setOpen:r,group:o}),e.jsx(Ln,{open:l,setOpen:c,group:o}),e.jsx(Jr,{open:d,setOpen:u,user:p,group:o})]})]})})},el=()=>{const{uiConfig:t,isEnterprise:s}=N();return s()||t.flags[Oo]===!0?e.jsx("div",{children:e.jsx(ge,{permissions:$e,children:e.jsxs(lt,{children:[e.jsx(G,{index:!0,element:e.jsx(Dr,{})}),e.jsx(G,{path:"create-group",element:e.jsx(Gr,{})}),e.jsx(G,{path:":groupId/edit",element:e.jsx(qr,{})}),e.jsx(G,{path:":groupId",element:e.jsx(Xr,{})})]})})}):e.jsx(rt,{feature:"groups",page:!0})},tl=()=>{const{data:t,error:s,mutate:n}=Le(ie("api/admin/instance-admin/statistics"),sl);return h.useMemo(()=>({stats:t,loading:!s&&!t,refetchGroup:()=>n(),error:s}),[t,s,n])},sl=t=>fetch(t).then(je("Instance Stats")).then(s=>s.json()),nl=()=>{const{stats:t}=tl();let s,n;t!=null&&t.versionEnterprise?(s="Unleash Enterprise version",n=t.versionEnterprise):(s="Unleash OSS version",n=t==null?void 0:t.versionOSS);const o=[{title:"Instance Id",value:t==null?void 0:t.instanceId,offset:!1},{title:s,value:n},{title:"Users",value:t==null?void 0:t.users},{title:"Feature toggles",value:t==null?void 0:t.featureToggles},{title:"Projects",value:t==null?void 0:t.projects},{title:"Environments",value:t==null?void 0:t.environments},{title:"Roles",value:t==null?void 0:t.roles},{title:"Groups",value:t==null?void 0:t.groups},{title:"Context fields",value:t==null?void 0:t.contextFields},{title:"Strategies",value:t==null?void 0:t.strategies},{title:"Feature exports",value:t==null?void 0:t.featureExports},{title:"Feature imports",value:t==null?void 0:t.featureImports}];return t!=null&&t.versionEnterprise&&o.push({title:"SAML enabled",value:t!=null&&t.SAMLenabled?"Yes":"No"},{title:"OIDC enabled",value:t!=null&&t.OIDCenabled?"Yes":"No"}),e.jsx(Q,{header:e.jsx(X,{title:"Instance Statistics"}),children:e.jsxs(fs,{sx:{display:"grid",gap:4},children:[e.jsxs(an,{"aria-label":"Instance statistics",children:[e.jsx(rn,{children:e.jsxs(it,{children:[e.jsx(ae,{children:"Field"}),e.jsx(ae,{align:"right",children:"Value"})]})}),e.jsx(Xt,{children:o.map(a=>e.jsxs(it,{children:[e.jsx(ae,{component:"th",scope:"row",children:e.jsx(fs,{component:"span",sx:i=>({marginLeft:a.offset?i.spacing(2):0}),children:a.title})}),e.jsx(ae,{align:"right",children:a.value})]},a.title))})]}),e.jsx("span",{style:{textAlign:"center"},children:e.jsx(_,{startIcon:e.jsx(mn,{}),"aria-label":"Download instance statistics",color:"primary",variant:"contained",target:"_blank",rel:"noreferrer",href:ie("/api/admin/instance-admin/statistics/csv"),children:"Download"})})]})})},ol=()=>e.jsx("div",{children:e.jsx(nl,{})}),al=m("div")(({theme:t})=>({display:"flex",flexDirection:"column",padding:t.spacing(3),border:`1px solid ${t.palette.divider}`,borderRadius:t.shape.borderRadiusLarge})),il=m(q)(()=>({display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center"})),rl=m(q)(({theme:t})=>({color:t.palette.text.secondary,fontSize:t.fontSizes.smallBody,marginTop:t.spacing(2)})),ll=m("p")(({theme:t})=>({display:"table-cell",fontWeight:t.fontWeight.bold,paddingTop:t.spacing(2)})),cl=m("p")(({theme:t})=>({display:"table-cell",paddingTop:t.spacing(2),paddingLeft:t.spacing(4)})),dl=m("div")(({theme:t})=>({display:"table-cell",width:"75%",paddingTop:t.spacing(2),paddingBottom:t.spacing(2)})),ul=m("div")(({theme:t})=>({display:"table-cell"})),hl=m("span")(({theme:t})=>({display:"block",textAlign:"right",color:t.palette.neutral.dark})),pl=m("div")(({theme:t})=>({maxWidth:t.spacing(50),color:t.palette.text.secondary,fontSize:t.fontSizes.smallBody})),ml=m("div")(()=>({display:"table-row"})),Is=m("div")(()=>({display:"table"})),xl=m("div")(()=>({display:"table-cell"})),gl=({changeInfoText:t,variablesText:s,dependsOnText:n})=>e.jsxs(pl,{children:[e.jsx(Ps,{children:t}),e.jsx(jl,{children:e.jsx("div",{children:s})}),e.jsx(S,{condition:!!n,show:e.jsx(Ps,{children:n})})]}),jl=m("code")(({theme:t})=>({display:"block",color:t.palette.text.primary,backgroundColor:t.palette.background.application,fontSize:t.fontSizes.smallerBody,marginTop:t.spacing(1),padding:t.spacing(1),border:`1px solid ${t.palette.divider}`,borderRadius:t.shape.borderRadius,borderWidth:1,wordWrap:"break-word",whiteSpace:"pre-wrap",fontFamily:"monospace",lineHeight:1.5})),Ps=m("p")(({theme:t})=>({color:t.palette.text.primary,fontSize:t.fontSizes.smallBody,marginTop:t.spacing(1)})),Bs=({title:t,infoText:s,concreteDetails:n,enabled:o,changeInfoText:a,variablesText:i,dependsOnText:r})=>e.jsxs(al,{children:[e.jsxs(il,{children:[e.jsx("b",{children:t}),e.jsx(ul,{children:e.jsx(S,{condition:o,show:e.jsx(ze,{color:"success",icon:e.jsx(tn,{}),children:"Data is collected"}),elseShow:e.jsx(ze,{color:"neutral",icon:e.jsx(Wa,{}),children:"No data is collected"})})})]}),e.jsxs(rl,{children:[e.jsxs(Is,{children:[e.jsx(dl,{children:s}),e.jsx(xl,{children:e.jsx(hl,{children:e.jsx(as,{tooltip:e.jsx(gl,{changeInfoText:a,variablesText:i,dependsOnText:r}),children:o?"How to disable collecting data?":"How to enable collecting data?"})})})]}),e.jsx(Is,{children:Object.entries(n).map(([l,c])=>e.jsxs(ml,{children:[e.jsx(ll,{children:l}),e.jsx(cl,{children:c})]},l))})]})]}),fl=()=>{const{data:t,error:s,mutate:n}=Le(ie("api/admin/telemetry/settings"),yl);return h.useMemo(()=>({settings:t,loading:!s&&!t,refetchGroup:()=>n(),error:s}),[t,s,n])},yl=t=>fetch(t).then(je("Telemetry Settings")).then(s=>s.json()),bl=m(q)(({theme:t})=>({display:"grid",gap:t.spacing(4)})),Gt={title:"Version data collection",infoText:"We collect the version of Unleash that you're using. We use this information to inform your Unleash instance of latest updates and critical security patches.",concreteDetails:{"Instance ID":"A unique ID generated for your instance",Version:"The version of Unleash that you're using"}},qt={title:"Feature data collection",infoText:"We collect data about your instance to improve the Unleash product user experience. We may also use the data in case you need help from our support team. Data collection is for internal use only and is not shared with third parties outside Unleash. As we want you to be in control of your data, we will leave it up to you to allow us to collect your data.",concreteDetails:{"Feature toggles":"The number of feature toggles in your instance",Users:"The number of users registered in your instance",Projects:"The number of projects in your instance","Context Fields":"The number of custom context fields in use",Groups:"The number of groups present in your instance",Roles:"The number of custom roles defined in your instance","Custom Root Roles":"The number of custom root roles defined in your instance","Custom Root Roles In Use":"The number of custom root roles that are in use by entities (users, groups, service accounts)",Environments:"The number of environments in your instance",Segments:"The number of segments defined in your instance",Strategies:"The number of strategies defined in your instance","Feature Exports":"The number of feature exports performed","Feature Imports":"The number of feature imports performed","Custom Strategies":"The number of custom strategies defined in your instance","Custom Strategies In Use":"The number of custom strategies that are in use by feature toggles"}},Ls={enabled:{environmentVariables:"CHECK_VERSION=false",changeInfoText:"Version info collection can be disabled by setting the environment variable `CHECK_VERSION` to `false` and restarting Unleash."},disabled:{environmentVariables:"CHECK_VERSION=true",changeInfoText:"Version info collection can be enabled by setting the environment variable to true and restarting Unleash."}},Os={enabled:{environmentVariables:"SEND_TELEMETRY=false",changeInfoText:"Feature usage collection can be disabled by setting the environment variable to false and restarting Unleash."},disabled:{environmentVariables:"SEND_TELEMETRY=true",changeInfoText:"To enable feature usage collection set the environment variable to true and restart Unleash."}},Sl=()=>{const{settings:t}=fl(),{loading:s}=N();if(s)return null;const n=t!=null&&t.versionInfoCollectionEnabled?Ls.enabled:Ls.disabled,o=t!=null&&t.featureInfoCollectionEnabled?Os.enabled:Os.disabled;let a;return t!=null&&t.versionInfoCollectionEnabled||(a=t!=null&&t.featureInfoCollectionEnabled?"Note: Feature usage collection is enabled, but for it to be active you must also enable version info collection":"When you enable feature usage collection you must also enable version info collection"),e.jsx(Q,{header:e.jsx(X,{title:"Instance Privacy"}),children:e.jsxs(bl,{children:[e.jsx(Bs,{title:Gt.title,infoText:Gt.infoText,concreteDetails:Gt.concreteDetails,enabled:t==null?void 0:t.versionInfoCollectionEnabled,changeInfoText:n.changeInfoText,variablesText:n.environmentVariables}),e.jsx(Bs,{title:qt.title,infoText:qt.infoText,concreteDetails:qt.concreteDetails,enabled:(t==null?void 0:t.featureInfoCollectionEnabled)&&(t==null?void 0:t.versionInfoCollectionEnabled),changeInfoText:o.changeInfoText,variablesText:o.environmentVariables,dependsOnText:a})]})})},vl=()=>e.jsx(K,{severity:"warning",children:e.jsxs("p",{children:[e.jsx("b",{children:"Heads up!"})," If you enable maintenance mode, edit access in the entire system will be disabled for all the users (admins, editors, custom roles, etc). During this time nobody will be able to do changes or to make new configurations."]})}),Cl=()=>{const{data:t,error:s,mutate:n}=Le(ie("api/admin/maintenance"),wl);return h.useMemo(()=>({enabled:!!(t!=null&&t.enabled),loading:!s&&!t,refetchMaintenance:n,error:s}),[t,s,n])},wl=t=>fetch(t).then(je("Maintenance")).then(s=>s.json()),Tl=()=>{const{makeRequest:t,createRequest:s,errors:n,loading:o}=fe({propagateErrors:!0});return{toggleMaintenance:async i=>{const l=s("api/admin/maintenance",{method:"POST",body:JSON.stringify(i)});await t(l.caller,l.id)},errors:n,loading:o}},kl=m("div")(({theme:t})=>({display:"flex",flexDirection:"column",padding:t.spacing(3),border:`1px solid ${t.palette.divider}`,borderRadius:t.shape.borderRadiusLarge})),Rl=m(q)({display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center"}),El=m(q)(({theme:t})=>({color:t.palette.text.secondary,fontSize:t.fontSizes.smallBody,marginTop:t.spacing(2)})),Al=m(B)(({theme:t})=>({fontSize:t.fontSizes.smallBody})),Dl=()=>{const{enabled:t,refetchMaintenance:s}=Cl(),{refetch:n}=N(),{toggleMaintenance:o}=Tl(),{trackEvent:a}=is(),{setToastData:i}=J(),r=async()=>{i({type:"success",title:`Maintenance mode has been successfully ${t?"disabled":"enabled"}`}),a("maintenance",{props:{eventType:`maintenance ${t?"de":""}activated`}}),await o({enabled:!t}),s(),n()};return e.jsxs(kl,{children:[e.jsxs(Rl,{children:[e.jsx("b",{children:"Maintenance Mode"}),e.jsx(ce,{sx:{margin:0},control:e.jsx(me,{onChange:r,value:t,name:"enabled",checked:t}),label:e.jsx(Al,{children:t?"Enabled":"Disabled"})})]}),e.jsx(El,{children:"Maintenance Mode is useful when you want to freeze your system so nobody can do any changes during this time. When enabled it will show a banner at the top of the applications and only an admin can enable it or disable it."})]})},Il=()=>e.jsx("div",{children:e.jsx(ge,{permissions:M,children:e.jsx(Bl,{})})}),Pl=m(q)(({theme:t})=>({display:"grid",gap:t.spacing(4)})),Bl=()=>{const{loading:t}=N();return t?null:e.jsx(Q,{header:e.jsx(X,{title:"Maintenance"}),children:e.jsxs(Pl,{children:[e.jsx(vl,{}),e.jsx(Dl,{})]})})},Ll=m(Uo)(({theme:t})=>({display:"flex",justifyContent:"center",alignItems:"center",width:"100%",height:"100%",textDecoration:"none",color:"inherit",padding:t.spacing(0,5),"&.active":{fontWeight:"bold"}})),$n=({to:t,children:s})=>e.jsx(Ll,{to:t,children:s}),Ol=h.lazy(()=>xn(()=>import("./NetworkOverview-7SCGp57r.js").then(t=>t.N),__vite__mapDeps([]))),Ul=h.lazy(()=>xn(()=>import("./NetworkTraffic-awTd8Zg5.js"),__vite__mapDeps([]))),$l=[{label:"Overview",path:"/admin/network"},{label:"Traffic",path:"/admin/network/traffic"}],Nl=()=>{const{pathname:t}=rs();return e.jsx("div",{children:e.jsx(Q,{withTabs:!0,header:e.jsx(St,{value:t,indicatorColor:"primary",textColor:"primary",variant:"scrollable",allowScrollButtonsMobile:!0,children:$l.map(({label:s,path:n})=>e.jsx(vt,{value:n,label:e.jsx($n,{to:n,children:e.jsx("span",{children:s})}),sx:{padding:0}},s))}),children:e.jsxs(lt,{children:[e.jsx(G,{path:"traffic",element:e.jsx(Ul,{})}),e.jsx(G,{path:"*",element:e.jsx(Ol,{})})]})})})},Fl=m(q)(()=>({display:"flex",justifyContent:"center"})),Gl=({role:t,onEdit:s,onDelete:n})=>{const o=Ne.includes(t.type);return e.jsxs(Fl,{children:[e.jsx(ue,{"data-loading":!0,onClick:s,permission:M,disabled:o,tooltipProps:{title:o?"You cannot edit a predefined role":"Edit role"},children:e.jsx(Ve,{})}),e.jsx(ue,{"data-loading":!0,onClick:n,permission:M,disabled:o,tooltipProps:{title:o?"You cannot remove a predefined role":"Remove role"},children:e.jsx(Ae,{})})]})},ql=m(ze)(({theme:t})=>({marginLeft:t.spacing(1)})),_l=({role:t})=>e.jsx(Se,{value:t.name,subtitle:t.description,afterTitle:e.jsx(S,{condition:Ne.includes(t.type),show:e.jsx(ql,{color:"success",children:"Predefined"})})}),Wl=({users:t})=>{const[s]=h.useState(()=>({sortBy:[{id:"last-login",desc:!0}]})),n=h.useMemo(()=>[{id:"name",Header:"Name",accessor:r=>r.name||"",minWidth:200,Cell:({row:{original:r}})=>e.jsx(Se,{value:r.name,subtitle:r.email||r.username})},{Header:"Created",accessor:"createdAt",Cell:xe,width:120,maxWidth:120},{id:"last-login",Header:"Last login",accessor:r=>r.seenAt||"",Cell:({row:{original:r}})=>e.jsx(Je,{value:r.seenAt,emptyText:"Never",title:l=>`Last login: ${l}`}),maxWidth:150}],[]),{headerGroups:o,rows:a,prepareRow:i}=U.useTable({columns:n,data:t,initialState:s,sortTypes:pe,autoResetHiddenColumns:!1,autoResetSortBy:!1,disableSortRemove:!0,disableMultiSort:!0},U.useSortBy,U.useFlexLayout);return e.jsx(ye,{rows:a,headerGroups:o,prepareRow:i})},Hl=m(B)(({theme:t})=>({fontSize:t.fontSizes.smallerBody})),Nn=({serviceAccount:t,value:s,onCreateToken:n})=>{var a,i,r;const{searchQuery:o}=$o();return!t.tokens||t.tokens.length===0?n?e.jsx(gn,{title:"Create token",onClick:n}):e.jsx(te,{children:"0 tokens"}):e.jsx(te,{children:e.jsx(as,{tooltip:e.jsx(e.Fragment,{children:(a=t.tokens)==null?void 0:a.map(({id:l,description:c})=>e.jsx(Hl,{children:e.jsx(No,{search:o,children:c})},l))}),highlighted:o.length>0&&s.toLowerCase().includes(o.toLowerCase()),children:((i=t.tokens)==null?void 0:i.length)===1?"1 token":`${(r=t.tokens)==null?void 0:r.length} tokens`})})},Ml=({serviceAccounts:t})=>{const[s]=h.useState(()=>({sortBy:[{id:"seenAt",desc:!0}]})),n=h.useMemo(()=>[{id:"name",Header:"Name",accessor:r=>r.name||"",minWidth:200,Cell:({row:{original:r}})=>e.jsx(Se,{value:r.name,subtitle:r.username})},{id:"tokens",Header:"Tokens",accessor:r=>{var l;return((l=r.tokens)==null?void 0:l.map(({description:c})=>c).join(`
16
+ `))||""},Cell:({row:{original:r},value:l})=>e.jsx(Nn,{serviceAccount:r,value:l}),maxWidth:100},{Header:"Created",accessor:"createdAt",Cell:xe,width:120,maxWidth:120},{id:"seenAt",Header:"Last seen",accessor:r=>{var l;return(l=r.tokens.sort((c,d)=>{const u=new Date(c.seenAt||0),p=new Date(d.seenAt||0);return(p==null?void 0:p.getTime())-(u==null?void 0:u.getTime())})[0])==null?void 0:l.seenAt},Cell:Je,maxWidth:150}],[]),{headerGroups:o,rows:a,prepareRow:i}=U.useTable({columns:n,data:t,initialState:s,sortTypes:pe,autoResetHiddenColumns:!1,autoResetSortBy:!1,disableSortRemove:!0,disableMultiSort:!0},U.useSortBy,U.useFlexLayout);return e.jsx(ye,{rows:a,headerGroups:o,prepareRow:i})},zl=({groups:t})=>{const[s]=h.useState(()=>({sortBy:[{id:"createdAt",desc:!0}]})),n=h.useMemo(()=>[{id:"name",Header:"Name",accessor:r=>r.name||"",minWidth:200,Cell:({row:{original:r}})=>e.jsx(Se,{value:r.name,subtitle:r.description})},{Header:"Created",accessor:"createdAt",Cell:xe,width:120,maxWidth:120},{id:"users",Header:"Users",accessor:r=>r.users.length===1?"1 user":`${r.users.length} users`,Cell:te,maxWidth:150}],[]),{headerGroups:o,rows:a,prepareRow:i}=U.useTable({columns:n,data:t,initialState:s,sortTypes:pe,autoResetHiddenColumns:!1,autoResetSortBy:!1,disableSortRemove:!0,disableMultiSort:!0},U.useSortBy,U.useFlexLayout);return e.jsx(ye,{rows:a,headerGroups:o,prepareRow:i})},_t=m("div")(({theme:t})=>({marginTop:t.spacing(1.5)})),Wt=m("p")(({theme:t})=>({marginTop:t.spacing(3)})),Vl=({role:t,open:s,setOpen:n,onConfirm:o})=>{const{users:a}=we(),{serviceAccounts:i}=ct(),{groups:r}=Fe(),l=a.filter(({rootRole:p})=>p===(t==null?void 0:t.id)),c=i.filter(({rootRole:p})=>p===(t==null?void 0:t.id)),d=r==null?void 0:r.filter(({rootRole:p})=>p===(t==null?void 0:t.id)),u=!!(l.length||c.length||d!=null&&d.length);return e.jsx(se,{title:"Delete root role?",open:s,primaryButtonText:"Delete role",secondaryButtonText:"Cancel",disabledPrimaryButton:u,onClick:()=>o(t),onClose:()=>{n(!1)},children:e.jsx(S,{condition:u,show:e.jsxs(e.Fragment,{children:[e.jsx(K,{severity:"error",children:"You are not allowed to delete a role that is currently in use. Please change the role of the following entities first:"}),e.jsx(S,{condition:!!l.length,show:e.jsxs(e.Fragment,{children:[e.jsxs(Wt,{children:["Users (",l.length,"):"]}),e.jsx(_t,{children:e.jsx(Wl,{users:l})})]})}),e.jsx(S,{condition:!!c.length,show:e.jsxs(e.Fragment,{children:[e.jsxs(Wt,{children:["Service accounts (",c.length,"):"]}),e.jsx(_t,{children:e.jsx(Ml,{serviceAccounts:c})})]})}),e.jsx(S,{condition:!!(d!=null&&d.length),show:e.jsxs(e.Fragment,{children:[e.jsxs(Wt,{children:["Groups (",d==null?void 0:d.length,"):"]}),e.jsx(_t,{children:e.jsx(zl,{groups:d})})]})})]}),elseShow:e.jsxs("p",{children:["You are about to delete role:"," ",e.jsx("strong",{children:t==null?void 0:t.name})]})})})},Yl=t=>{const{isEnterprise:s}=N(),{data:n,error:o,mutate:a}=Zt(s()&&t,{projects:[]},ie(`api/admin/projects/roles/${t}/access`),Jl);return h.useMemo(()=>({projects:(n==null?void 0:n.projects)??[],loading:!o&&!n,refetch:()=>a(),error:o}),[n,o,a])},Jl=t=>fetch(t).then(je("Project role usage")).then(s=>s.json()),Kl=({projects:t})=>{const[s]=h.useState(()=>({sortBy:[{id:"name"}]})),n=h.useMemo(()=>[{id:"name",Header:"Project name",accessor:r=>r.project||"",minWidth:200,Cell:({row:{original:r}})=>e.jsx(gn,{title:r.project,to:`/projects/${r.project}`})},{id:"users",Header:"Assigned users",accessor:r=>r.userCount===1?"1 user":`${r.userCount} users`,Cell:te,maxWidth:150},{id:"serviceAccounts",Header:"Service accounts",accessor:r=>r.serviceAccountCount===1?"1 account":`${r.serviceAccountCount} accounts`,Cell:te,maxWidth:150},{id:"groups",Header:"Assigned groups",accessor:r=>r.groupCount===1?"1 group":`${r.groupCount} groups`,Cell:te,maxWidth:150}],[]),{headerGroups:o,rows:a,prepareRow:i}=U.useTable({columns:n,data:t,initialState:s,sortTypes:pe,autoResetHiddenColumns:!1,autoResetSortBy:!1,disableSortRemove:!0,disableMultiSort:!0},U.useSortBy,U.useFlexLayout);return e.jsx(ye,{rows:a,headerGroups:o,prepareRow:i})},Zl=m("div")(({theme:t})=>({marginTop:t.spacing(1.5)})),Ql=m("p")(({theme:t})=>({marginTop:t.spacing(3)})),Xl=({role:t,open:s,setOpen:n,onConfirm:o})=>{const{projects:a}=Yl(t==null?void 0:t.id),i=!!(a!=null&&a.length);return e.jsx(se,{title:"Delete project role?",open:s,primaryButtonText:"Delete role",secondaryButtonText:"Cancel",disabledPrimaryButton:i,onClick:()=>o(t),onClose:()=>{n(!1)},maxWidth:"md",children:e.jsx(S,{condition:i,show:e.jsxs(e.Fragment,{children:[e.jsx(K,{severity:"error",children:"You are not allowed to delete a role that is currently in use. Please change the role of the following entities first:"}),e.jsx(S,{condition:!!(a!=null&&a.length),show:e.jsxs(e.Fragment,{children:[e.jsxs(Ql,{children:["Role assigned in ",a==null?void 0:a.length," ","projects:"]}),e.jsx(Zl,{children:e.jsx(Kl,{projects:a})})]})})]}),elseShow:e.jsxs("p",{children:["You are about to delete role:"," ",e.jsx("strong",{children:t==null?void 0:t.name})]})})})},ec="custom",tc=({role:t,open:s,setOpen:n,onConfirm:o})=>(t==null?void 0:t.type)===ec?e.jsx(Xl,{role:t,open:s,setOpen:n,onConfirm:o}):e.jsx(Vl,{role:t,open:s,setOpen:n,onConfirm:o}),Fn=()=>{const{loading:t,makeRequest:s,createRequest:n,errors:o}=fe({propagateErrors:!0});return{addRole:async c=>{const u=n("api/admin/roles",{method:"POST",body:JSON.stringify(c)},"addRole");return(await s(u.caller,u.id)).json()},updateRole:async(c,d)=>{const p=n(`api/admin/roles/${c}`,{method:"PUT",body:JSON.stringify(d)},"updateRole");await s(p.caller,p.id)},removeRole:async c=>{const u=n(`api/admin/roles/${c}`,{method:"DELETE"},"removeRole");await s(u.caller,u.id)},validateRole:async c=>{const u=n("api/admin/roles/validate",{method:"POST",body:JSON.stringify(c)},"validateRole");await s(u.caller,u.id)},errors:o,loading:t}},Us={name:void 0,description:void 0,permissions:void 0},sc=(t="",s="",n=[])=>{const{roles:o,projectRoles:a}=dt(),[i,r]=h.useState(t),[l,c]=h.useState(s),[d,u]=h.useState({}),[p,x]=h.useState(Us),[g,j]=h.useState(!1);h.useEffect(()=>{r(t)},[t]),h.useEffect(()=>{c(s)},[s]),h.useEffect(()=>{const b=ys(n);u(b)},[n.length]);const y=(b=Ie)=>({name:i,description:l,type:b===Ie?"root-custom":"custom",permissions:Object.values(d).map(({name:D,environment:W})=>({name:D,environment:W}))}),w=b=>![...o,...a].some(D=>D.name!==t&&D.name.toLowerCase()===b.toLowerCase()),C=b=>b.length,k=b=>Object.keys(b).length>0,A=b=>{x(D=>({...D,[b]:void 0}))},T=(b,D)=>{x(W=>({...W,[b]:D}))},L=b=>C(b)?w(b)?(A("name"),!0):(T("name","Name must be unique."),!1):(T("name","Name is required."),!1),P=b=>C(b)?(A("description"),!0):(T("description","Description is required."),!1),I=b=>k(b)?(A("permissions"),!0):(T("permissions","You must select at least one permission."),!1),v=()=>{const b=L(i),D=P(l),W=I(d);return j(!0),b&&D&&W},F=g&&Object.values(p).some(Boolean);return{name:i,setName:r,validateName:L,description:l,setDescription:c,validateDescription:P,checkedPermissions:d,setCheckedPermissions:u,validatePermissions:I,getRolePayload:y,errors:p,showErrors:F,validate:v,reload:()=>{r(t),c(s),u(ys(n)),j(!1),x(Us)}}},nc=m(q)(({theme:t})=>({display:"flex",alignItems:"center",[t.breakpoints.down(500)]:{flexDirection:"column",alignItems:"flex-start"}})),oc=m(Fo)(({theme:t})=>({fontWeight:t.typography.fontWeightBold,marginRight:t.spacing(1)})),ac=({title:t,permissions:s,checkedPermissions:n,Icon:o,isInitiallyExpanded:a=!1,context:i,onPermissionChange:r,onCheckAll:l})=>{const[c,d]=h.useState(a),u=h.useMemo(()=>(s==null?void 0:s.reduce((g,j)=>(g[pt(j)]=!0,g),{}))||{},[s]),p=h.useMemo(()=>Object.keys(n).filter(g=>u[g]).length||0,[n,u]),x=h.useMemo(()=>p===(s==null?void 0:s.length),[p,s]);return e.jsx(q,{sx:{my:2,pb:1},children:e.jsxs(Go,{expanded:c,onChange:()=>d(!c),sx:{boxShadow:"none",px:3,py:1,border:g=>`1px solid ${g.palette.divider}`,borderRadius:g=>`${g.shape.borderRadiusLarge}px`},children:[e.jsx(qo,{expandIcon:e.jsx(Ge,{children:e.jsx(_o,{titleAccess:"Toggle"})}),sx:{boxShadow:"none",padding:"0"},children:e.jsxs(nc,{children:[o,e.jsx(oc,{text:t,maxWidth:"120",maxLength:25})," ",e.jsxs(B,{variant:"body2",color:"text.secondary",children:["(",p," / ",s==null?void 0:s.length," ","permissions)"]})]})}),e.jsxs(Wo,{sx:{px:0,py:1,flexWrap:"wrap"},children:[e.jsx(Qt,{sx:{mb:1}}),e.jsxs(_,{variant:"text",size:"small",onClick:l,sx:{fontWeight:g=>g.typography.fontWeightRegular},children:[x?"Unselect ":"Select ","all ",i," permissions"]}),e.jsx(q,{display:"grid",gridTemplateColumns:{sm:"1fr 1fr",xs:"1fr"},children:s==null?void 0:s.map(g=>e.jsx(ce,{"data-testid":pt(g),control:e.jsx(es,{checked:!!n[pt(g)],onChange:()=>r(g),color:"primary"}),label:g.displayName},pt(g)))})]})]})})},ic=({type:t,checkedPermissions:s,setCheckedPermissions:n,validatePermissions:o})=>{const{permissions:a}=Ho({revalidateIfStale:!1,revalidateOnReconnect:!1,revalidateOnFocus:!1}),i=Xs.includes(t),r=h.useMemo(()=>i?Mo(zo(a.project,a.environments)):Vo(a.root),[a,i]),l=d=>{const u=Qo(s,d);o(u),n(u)},c=d=>{const u=Xo(s,d);o(u),n(u)};return h.useMemo(()=>e.jsx(e.Fragment,{children:r.map(({label:d,type:u,permissions:p})=>e.jsx(ac,{title:`${d} permissions`,context:d.toLowerCase(),Icon:u===Yo?e.jsx(Va,{color:"disabled",sx:{mr:1}}):u===Jo?e.jsx(Ko,{color:"disabled",sx:{mr:1}}):e.jsx(Zo,{color:"disabled",sx:{mr:1}}),permissions:p,checkedPermissions:s,onPermissionChange:x=>l(x),onCheckAll:()=>c(p)},d))}),[r,s])},Ht=m("p")(({theme:t})=>({display:"flex",color:t.palette.text.primary,marginBottom:t.spacing(1),"&:not(:first-of-type)":{marginTop:t.spacing(4)}})),rc=m(_e)(({theme:t})=>({width:"100%",maxWidth:t.spacing(50)})),lc=m(_e)({width:"100%"}),cc=({type:t=Ie,name:s,setName:n,description:o,setDescription:a,checkedPermissions:i,setCheckedPermissions:r,errors:l,showErrors:c,validateName:d,validateDescription:u,validatePermissions:p})=>{const x=g=>{setTimeout(()=>g(),300)};return e.jsxs("div",{children:[e.jsx(Ht,{children:"What is your new role name?"}),e.jsx(rc,{autoFocus:!0,label:"Role name *",error:!!l.name,errorText:l.name,value:s,onChange:g=>{d(g.target.value),n(g.target.value)},onBlur:g=>x(()=>d(g.target.value)),autoComplete:"off"}),e.jsx(Ht,{children:"What is your new role description?"}),e.jsx(lc,{label:"Role description *",error:!!l.description,errorText:l.description,value:o,onChange:g=>{u(g.target.value),a(g.target.value)},onBlur:g=>x(()=>u(g.target.value)),autoComplete:"off"}),e.jsx(Ht,{children:"What is your role allowed to do?"}),e.jsx(K,{severity:"info",children:"You must select at least one permission."}),e.jsx(ic,{type:t,checkedPermissions:i,setCheckedPermissions:r,validatePermissions:p}),e.jsx(S,{condition:c,show:()=>e.jsx(K,{severity:"error",icon:!1,children:e.jsx("ul",{children:Object.values(l).filter(Boolean).map(g=>e.jsx("li",{children:g},g))})})})]})},dc=m("form")(()=>({display:"flex",flexDirection:"column",height:"100%"})),uc=m("div")(({theme:t})=>({marginTop:"auto",display:"flex",justifyContent:"flex-end",paddingTop:t.spacing(4)})),hc=m(_)(({theme:t})=>({marginLeft:t.spacing(3)})),pc=({type:t=Ie,roleId:s,open:n,setOpen:o})=>{const{role:a,refetch:i}=jn(s==null?void 0:s.toString()),{name:r,setName:l,validateName:c,description:d,setDescription:u,validateDescription:p,checkedPermissions:x,setCheckedPermissions:g,validatePermissions:j,getRolePayload:y,errors:w,showErrors:C,validate:k,reload:A}=sc(a==null?void 0:a.name,a==null?void 0:a.description,a==null?void 0:a.permissions),{refetch:T}=dt(),{addRole:L,updateRole:P,loading:I}=Fn(),{setToastData:v,setToastApiError:F}=J(),{uiConfig:R}=N(),b=a!==void 0,D=y(t),W=()=>`curl --location --request ${b?"PUT":"POST"} '${R.unleashUrl}/api/admin/roles${b?`/${a.id}`:""}' \\
17
+ --header 'Authorization: INSERT_API_KEY' \\
18
+ --header 'Content-Type: application/json' \\
19
+ --data-raw '${JSON.stringify(D,void 0,2)}'`,E=()=>{T(),i()},$=async ne=>{if(ne.preventDefault(),!!k())try{b?await P(a.id,D):await L(D),v({title:`Role ${b?"updated":"added"} successfully`,type:"success"}),E(),o(!1)}catch(oe){F(z(oe))}};h.useEffect(()=>{A()},[n]);const V=t[0].toUpperCase()+t.slice(1);return e.jsx(Ct,{open:n,onClose:()=>{o(!1)},label:b?`Edit ${t} role`:`New ${t} role`,children:e.jsx(Ce,{loading:I,modal:!0,title:b?`Edit ${t} role`:`New ${t} role`,description:`${V} roles allow you to control access to ${t} resources. Besides the built-in ${t} roles, you can create and manage custom ${t} roles to fit your needs.`,documentationLink:`https://docs.getunleash.io/reference/rbac${t===Ie?"#custom-root-roles":"#custom-project-roles"}`,documentationLinkLabel:"Roles documentation",formatApiCode:W,children:e.jsxs(dc,{onSubmit:$,children:[e.jsx(cc,{type:t,name:r,setName:l,validateName:c,description:d,setDescription:u,validateDescription:p,checkedPermissions:x,setCheckedPermissions:g,validatePermissions:j,errors:w,showErrors:C}),e.jsxs(uc,{children:[e.jsxs(_,{type:"submit",variant:"contained",color:"primary",children:[b?"Save":"Add"," role"]}),e.jsx(hc,{onClick:()=>{o(!1)},children:"Cancel"})]})]})})})},mc=({row:t})=>{var o,a;const{original:s}=t,{role:n}=jn(s.id.toString());return!n||Ne.includes(n.type)?null:e.jsx(te,{children:e.jsx(as,{tooltip:e.jsx(Qs,{roleId:s.id,tooltip:!0}),children:((o=n.permissions)==null?void 0:o.length)===1?"1 permission":`${(a=n.permissions)==null?void 0:a.length} permissions`})})},$s=({type:t=Ie,searchValue:s="",modalOpen:n,setModalOpen:o,selectedRole:a,setSelectedRole:i})=>{const{setToastData:r,setToastApiError:l}=J(),c=os(),{roles:d,projectRoles:u,refetch:p,loading:x}=dt(),{removeRole:g}=Fn(),[j,y]=h.useState(!1),w=async R=>{try{await g(R.id),r({title:`${R.name} has been deleted`,type:"success"}),p(),y(!1)}catch(b){l(z(b))}},C=he(c.breakpoints.down("md")),k=h.useMemo(()=>[{id:"Icon",Cell:()=>e.jsx(ea,{icon:e.jsx(ta,{color:"disabled"})}),disableGlobalFilter:!0,maxWidth:50},{Header:"Role",accessor:"name",Cell:({row:{original:R}})=>e.jsx(_l,{role:R}),searchable:!0,minWidth:100},{id:"permissions",Header:"Permissions",Cell:mc,maxWidth:140},{Header:"Actions",id:"Actions",align:"center",Cell:({row:{original:R}})=>e.jsx(Gl,{role:R,onEdit:()=>{i(R),o(!0)},onDelete:()=>{i(R),y(!0)}}),width:150,disableSortBy:!0},{accessor:"description",Header:"Description",searchable:!0}],[]),[A]=h.useState({sortBy:[{id:"name"}],hiddenColumns:["description"]}),{data:T,getSearchText:L}=Ke(k,s,t===Ie?d:u),{headerGroups:P,rows:I,prepareRow:v,setHiddenColumns:F}=U.useTable({columns:k,data:T,initialState:A,sortTypes:pe,autoResetHiddenColumns:!1,autoResetSortBy:!1,disableSortRemove:!0,disableMultiSort:!0,defaultColumn:{Cell:te}},U.useSortBy,U.useFlexLayout);return Ye([{condition:C,columns:["Icon"]}],F,k),e.jsxs(Q,{isLoading:x,children:[e.jsx(qe,{value:L(s),children:e.jsx(ye,{rows:I,headerGroups:P,prepareRow:v})}),e.jsx(S,{condition:I.length===0,show:e.jsx(S,{condition:(s==null?void 0:s.length)>0,show:e.jsxs(de,{children:["No ",t," roles found matching “",s,"”"]}),elseShow:e.jsxs(de,{children:["No ",t," roles available. Get started by adding one."]})})}),e.jsx(pc,{type:t,roleId:a==null?void 0:a.id,open:n,setOpen:o}),e.jsx(tc,{role:a,open:j,setOpen:y,onConfirm:w})]})},xc=m("div")(()=>({display:"flex",justifyContent:"space-between",alignItems:"center"})),gc=m("div")({flex:1}),jc=m("div")({display:"flex",alignItems:"center"}),fc=()=>{const{uiConfig:t}=N(),{pathname:s}=rs(),{roles:n,projectRoles:o,loading:a}=dt(),[i,r]=h.useState(""),[l,c]=h.useState(!1),[d,u]=h.useState(),p=t.flags.customRootRolesKillSwitch?[{label:"Project roles",path:"/admin/roles",total:o.length}]:[{label:"Root roles",path:"/admin/roles",total:n.length},{label:"Project roles",path:"/admin/roles/project-roles",total:o.length}],x=he(De.breakpoints.down("md")),g=t.flags.customRootRolesKillSwitch||s.includes("project-roles")?Nt:Ie;return e.jsx(Q,{withTabs:!0,bodyClass:"page-body",isLoading:a,header:e.jsxs(e.Fragment,{children:[e.jsxs(xc,{children:[e.jsx(gc,{children:e.jsx(St,{value:s,indicatorColor:"primary",textColor:"primary",variant:"scrollable",allowScrollButtonsMobile:!0,children:p.map(({label:j,path:y,total:w})=>e.jsx(vt,{value:y,label:e.jsxs(sa,{to:y,children:[j," (",w,")"]}),sx:{padding:0}},j))})}),e.jsxs(jc,{children:[e.jsx(S,{condition:!x,show:e.jsxs(e.Fragment,{children:[e.jsx(le,{initialValue:i,onChange:r}),e.jsx(X.Divider,{})]})}),e.jsxs(ts,{onClick:()=>{u(void 0),c(!0)},maxWidth:`${De.breakpoints.values.sm}px`,Icon:wt,permission:M,children:["New ",g," role"]})]})]}),e.jsx(S,{condition:x,show:e.jsx(le,{initialValue:i,onChange:r})})]}),children:e.jsxs(lt,{children:[e.jsx(G,{path:"project-roles",element:e.jsx($s,{type:Nt,searchValue:i,modalOpen:l,setModalOpen:c,selectedRole:d,setSelectedRole:u})}),e.jsx(G,{path:"*",element:e.jsx($s,{type:t.flags.customRootRolesKillSwitch?Nt:Ie,searchValue:i,modalOpen:l,setModalOpen:c,selectedRole:d,setSelectedRole:u})})]})})},yc=()=>{const{isEnterprise:t}=N();return t()?e.jsx("div",{children:e.jsx(ge,{permissions:[na,M],children:e.jsx(fc,{})})}):e.jsx(rt,{feature:"project-roles",page:!0})},Gn=()=>{const{loading:t,makeRequest:s,createRequest:n,errors:o}=fe({propagateErrors:!0});return{addServiceAccount:async l=>{const d=n("api/admin/service-account",{method:"POST",body:JSON.stringify(l)},"addServiceAccount");return(await s(d.caller,d.id)).json()},updateServiceAccount:async(l,c)=>{const u=n(`api/admin/service-account/${l}`,{method:"PUT",body:JSON.stringify(c)},"updateServiceAccount");await s(u.caller,u.id)},removeServiceAccount:async l=>{const d=n(`api/admin/service-account/${l}`,{method:"DELETE"},"removeServiceAccount");await s(d.caller,d.id)},errors:o,loading:t}},qn=()=>{const{makeRequest:t,createRequest:s,errors:n,loading:o}=fe({propagateErrors:!0});return{createServiceAccountToken:async(r,l)=>{const c=s(`api/admin/service-account/${r}/token`,{method:"POST",body:JSON.stringify(l)});return(await t(c.caller,c.id)).json()},deleteServiceAccountToken:async(r,l)=>{const c=s(`api/admin/service-account/${r}/token/${l}`,{method:"DELETE"});await t(c.caller,c.id)},errors:n,loading:o}},bc=t=>{const{isEnterprise:s}=N(),{data:n,error:o,mutate:a}=Zt(s(),{pats:[]},ie(`api/admin/service-account/${t}/token`),Sc);return{tokens:n?n.pats:void 0,loading:!o&&!n,refetchTokens:()=>a(),error:o}},Sc=t=>fetch(t).then(je("Service Account Tokens")).then(s=>s.json()),xt=fn["30DAYS"],vc=({open:t,setOpen:s,tokens:n,onCreateClick:o})=>{const[a,i]=h.useState(""),[r,l]=h.useState(xt),[c,d]=h.useState(jt(xt)),[u,p]=h.useState({});h.useEffect(()=>{i(""),l(xt),d(jt(xt)),p({})},[t]);const x=j=>!(n!=null&&n.some(y=>y.description===j)),g=a.length&&x(a)&&c>new Date;return e.jsx(se,{open:t,primaryButtonText:"Create token",secondaryButtonText:"Cancel",onClick:()=>o({description:a,expiresAt:c}),disabledPrimaryButton:!g,onClose:()=>{s(!1)},title:"New token",children:e.jsx(yn,{description:a,setDescription:i,isDescriptionUnique:x,expiration:r,setExpiration:l,expiresAt:c,setExpiresAt:d,errors:u,setErrors:p})})},Cc=m(K)(({theme:t})=>({marginBottom:t.spacing(3)})),_n=({open:t,setOpen:s,token:n})=>e.jsxs(se,{open:t,secondaryButtonText:"Close",onClose:(o,a)=>{a||s(!1)},title:"Service account token created",children:[e.jsx(Cc,{severity:"info",children:"Make sure to copy your service account API token now. You won't be able to see it again!"}),e.jsx(B,{variant:"body1",children:"Your token:"}),e.jsx(oa,{token:(n==null?void 0:n.secret)||""})]}),wc=m("div")(({theme:t})=>({display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:t.spacing(2),gap:t.spacing(2),"& > div":{[t.breakpoints.down("md")]:{marginTop:0}}})),Tc=m("div")(({theme:t})=>({display:"flex",flexDirection:"column",alignItems:"center",padding:t.spacing(3)})),kc=m(B)(({theme:t})=>({fontSize:t.fontSizes.bodySize,marginBottom:t.spacing(.5)})),Rc=m(B)(({theme:t})=>({fontSize:t.fontSizes.smallBody,color:t.palette.text.secondary,marginBottom:t.spacing(1.5)})),Ec={id:"createdAt",desc:!0},Wn=({serviceAccount:t,readOnly:s})=>{const n=os(),{setToastData:o,setToastApiError:a}=J(),i=he(n.breakpoints.down("md")),r=he(n.breakpoints.down("sm")),{tokens:l=[],refetchTokens:c}=bc(t.id),{refetch:d}=ct(),{createServiceAccountToken:u,deleteServiceAccountToken:p}=qn(),[x]=h.useState(()=>({sortBy:s?[{id:"seenAt"}]:[Ec]})),[g,j]=h.useState(""),[y,w]=h.useState(!1),[C,k]=h.useState(!1),[A,T]=h.useState(!1),[L,P]=h.useState(),[I,v]=h.useState(),F=async H=>{try{const be=await u(t.id,H);d(),c(),w(!1),P(be),k(!0),o({title:"Token created successfully",type:"success"})}catch(be){a(z(be))}},R=async()=>{if(I)try{await p(t.id,I==null?void 0:I.id),d(),c(),T(!1),o({title:"Token deleted successfully",type:"success"})}catch(H){a(z(H))}},b=h.useMemo(()=>[{Header:"Description",accessor:"description",Cell:Se,minWidth:100,searchable:!0},{Header:"Expires",accessor:"expiresAt",Cell:({value:H})=>new Date(H).getFullYear()>new Date().getFullYear()+100?e.jsx(te,{children:"Never"}):e.jsx(xe,{value:H}),maxWidth:150},{Header:"Created",accessor:"createdAt",Cell:xe,maxWidth:150},{Header:"Last seen",accessor:"seenAt",Cell:Je,maxWidth:150},{Header:"Actions",id:"Actions",align:"center",Cell:({row:{original:H}})=>e.jsx(yt,{children:e.jsx(Be,{title:"Delete token",arrow:!0,describeChild:!0,children:e.jsx("span",{children:e.jsx(Ge,{onClick:()=>{v(H),T(!0)},children:e.jsx(Ae,{})})})})}),maxWidth:100,disableSortBy:!0}],[v,T]),{data:D,getSearchText:W,getSearchContext:E}=Ke(b,g,l),{headerGroups:$,rows:V,prepareRow:ne,setHiddenColumns:oe}=U.useTable({columns:b,data:D,initialState:x,sortTypes:pe,autoResetHiddenColumns:!1,autoResetSortBy:!1,disableSortRemove:!0,disableMultiSort:!0},U.useSortBy,U.useFlexLayout);return Ye([{condition:r,columns:["expiresAt"]},{condition:i,columns:["createdAt"]},{condition:!!s,columns:["Actions","expiresAt","createdAt"]}],oe,b),e.jsxs(e.Fragment,{children:[e.jsx(S,{condition:!s,show:e.jsxs(wc,{children:[e.jsx(le,{initialValue:g,onChange:j,getSearchContext:E}),e.jsx(_,{variant:"contained",color:"primary",disabled:l.length>=aa,onClick:()=>w(!0),children:"New token"})]})}),e.jsx(qe,{value:W(g),children:e.jsx(ye,{rows:V,headerGroups:$,prepareRow:ne})}),e.jsx(S,{condition:V.length===0,show:e.jsx(S,{condition:(g==null?void 0:g.length)>0,show:e.jsxs(de,{children:["No tokens found matching “",g,"”"]}),elseShow:e.jsxs(Tc,{children:[e.jsx(kc,{children:"You have no tokens for this service account yet."}),e.jsx(Rc,{children:"Create a service account token for access to the Unleash API."}),e.jsx(_,{variant:"outlined",onClick:()=>w(!0),children:"Create new service account token"})]})})}),e.jsx(vc,{open:y,setOpen:w,tokens:l,onCreateClick:F}),e.jsx(_n,{open:C,setOpen:k,token:L}),e.jsx(se,{open:A,primaryButtonText:"Delete token",secondaryButtonText:"Cancel",onClick:R,onClose:()=>{T(!1)},title:"Delete token?",children:e.jsxs(B,{children:['Any applications or scripts using this token "',e.jsx("strong",{children:I==null?void 0:I.description}),'" will no longer be able to access the Unleash API. You cannot undo this action.']})})]})},Ac=m("form")(()=>({display:"flex",flexDirection:"column",height:"100%"})),et=m("p")(({theme:t})=>({display:"flex",color:t.palette.text.primary,marginBottom:t.spacing(1),"&:not(:first-of-type)":{marginTop:t.spacing(4)}})),Ns=m("p")(({theme:t})=>({color:t.palette.text.secondary,marginBottom:t.spacing(1)})),Fs=m(_e)(({theme:t})=>({width:"100%",maxWidth:t.spacing(50)})),Dc=m(Rt)(({theme:t})=>({width:"100%",maxWidth:t.spacing(50)})),Ic=m("div")(({theme:t})=>({padding:t.spacing(3),backgroundColor:t.palette.background.elevation2,borderRadius:t.shape.borderRadiusMedium,marginTop:t.spacing(4),marginBottom:t.spacing(2)})),Pc=m("div")(({theme:t})=>({padding:t.spacing(0,4),"& > p:not(:first-of-type)":{marginTop:t.spacing(2)}})),Bc=m("div")(({theme:t})=>({marginTop:"auto",display:"flex",justifyContent:"flex-end",paddingTop:t.spacing(4)})),Lc=m(_)(({theme:t})=>({marginLeft:t.spacing(3)})),gt=fn["30DAYS"],Oc=({serviceAccount:t,open:s,setOpen:n,newToken:o})=>{const{users:a}=we(),{serviceAccounts:i,roles:r,refetch:l}=ct(),{addServiceAccount:c,updateServiceAccount:d,loading:u}=Gn(),{createServiceAccountToken:p}=qn(),{setToastData:x,setToastApiError:g}=J(),{uiConfig:j}=N(),[y,w]=h.useState(""),[C,k]=h.useState(""),[A,T]=h.useState(null),[L,P]=h.useState("later"),[I,v]=h.useState({}),F=Y=>{v(O=>({...O,[Y]:void 0}))},R=(Y,O)=>{v(ee=>({...ee,[Y]:O}))},[b,D]=h.useState(""),[W,E]=h.useState(gt),[$,V]=h.useState(jt(gt)),[ne,oe]=h.useState({}),H=t!==void 0;h.useEffect(()=>{w((t==null?void 0:t.name)||""),k((t==null?void 0:t.username)||""),T(r.find(({id:Y})=>Y===(t==null?void 0:t.rootRole))||null),P("later"),v({}),D(""),E(gt),V(jt(gt)),oe({})},[s,t]);const be=()=>({name:y,username:C,rootRole:(A==null?void 0:A.id)||0}),At=async Y=>{Y.preventDefault();try{if(H)await d(t.id,be());else{const{id:O}=await c(be());if(L==="now"){const ee=await p(O,{description:b,expiresAt:$});o(ee)}}x({title:`Service account ${H?"updated":"added"} successfully`,type:"success"}),l(),n(!1)}catch(O){g(z(O))}},Dt=()=>`curl --location --request ${H?"PUT":"POST"} '${j.unleashUrl}/api/admin/service-account${H?`/${t.id}`:""}' \\
20
+ --header 'Authorization: INSERT_API_KEY' \\
21
+ --header 'Content-Type: application/json' \\
22
+ --data-raw '${JSON.stringify(be(),void 0,2)}'`,Te=Y=>Y.length,Ze=Y=>!(a!=null&&a.some(O=>O.username===Y))&&!(i!=null&&i.some(O=>O.username===Y)),It=A!==null,Pt=L==="later"||Te(b)&&$>new Date,Bt=Te(y)&&Te(C)&&(H||Ze(C))&&It&&Pt,Qe=()=>{if(Te(y)&&!Te(C)){const Y=`service-${y.toLowerCase().replace(/ /g,"-").replace(/[^\w_-]/g,"")}`;Ze(Y)&&k(Y)}},Lt=Y=>{F("username"),Ze(Y)||R("username","A service account or user with that username already exists."),k(Y)};return e.jsx(Ct,{open:s,onClose:()=>{n(!1)},label:H?"Edit service account":"New service account",children:e.jsx(Ce,{loading:u,modal:!0,title:H?"Edit service account":"New service account",description:"A service account is a special type of account that can only be used to authenticate with the Unleash API. Service accounts can be used to automate tasks.",documentationLink:"https://docs.getunleash.io",documentationLinkLabel:"Service accounts documentation",formatApiCode:Dt,children:e.jsxs(Ac,{onSubmit:At,children:[e.jsxs("div",{children:[e.jsx(et,{children:"What is your new service account name?"}),e.jsx(Fs,{autoFocus:!0,label:"Service account name",value:y,onChange:Y=>w(Y.target.value),onBlur:Qe,autoComplete:"off",required:!0}),e.jsx(et,{children:"What is your new service account username?"}),e.jsx(Fs,{label:"Service account username",error:!!I.username,errorText:I.username,value:C,onChange:Y=>Lt(Y.target.value),autoComplete:"off",required:!0,disabled:H}),e.jsx(et,{children:"What is your service account allowed to do?"}),e.jsx(Dc,{roles:r,value:A,setValue:T,required:!0}),e.jsx(S,{condition:!H,show:e.jsxs(Ic,{children:[e.jsx(et,{children:"Token"}),e.jsxs(Ns,{children:["In order to connect your newly created service account, you will also need a token."," ",e.jsx(ls,{href:"https://docs.getunleash.io/reference/api-tokens-and-client-keys",target:"_blank",rel:"noreferrer",children:"Read more about API tokens"}),"."]}),e.jsx(bt,{children:e.jsxs(ia,{value:L,onChange:Y=>P(Y.target.value),name:"token-generation",children:[e.jsx(ce,{value:"later",control:e.jsx(bs,{}),label:"I want to generate a token later"}),e.jsx(ce,{value:"now",control:e.jsx(bs,{}),label:"Generate a token now"})]})}),e.jsxs(Pc,{children:[e.jsx(Ns,{children:"A new personal access token (PAT) will be generated for the service account, so you can get started right away."}),e.jsx(S,{condition:L==="now",show:e.jsx(yn,{description:b,setDescription:D,expiration:W,setExpiration:E,expiresAt:$,setExpiresAt:V,errors:ne,setErrors:oe})})]})]}),elseShow:e.jsxs(e.Fragment,{children:[e.jsx(et,{children:"Service account tokens"}),e.jsx(Wn,{serviceAccount:t})]})})]}),e.jsxs(Bc,{children:[e.jsxs(_,{type:"submit",variant:"contained",color:"primary",disabled:!Bt,children:[H?"Save":"Add"," service account"]}),e.jsx(Lc,{onClick:()=>{n(!1)},children:"Cancel"})]})]})})})},Uc=m("div")(({theme:t})=>({marginTop:t.spacing(1.5)})),Gs=m("p")(({theme:t})=>({marginTop:t.spacing(3)})),$c=({serviceAccount:t,open:s,setOpen:n,onConfirm:o})=>{const a=e.jsxs(e.Fragment,{children:["You are about to delete service account:"," ",e.jsx("strong",{children:t==null?void 0:t.name})]});return e.jsx(se,{title:"Delete service account?",open:s,primaryButtonText:"Delete service account",secondaryButtonText:"Cancel",onClick:()=>o(t),onClose:()=>{n(!1)},children:e.jsx(S,{condition:!!(t!=null&&t.tokens.length),show:e.jsxs(e.Fragment,{children:[e.jsx(K,{severity:"error",children:"Deleting this service account may break any existing implementations currently using it."}),e.jsx(Gs,{children:a}),e.jsx(Gs,{children:"Service account tokens:"}),e.jsx(Uc,{children:e.jsx(Wn,{serviceAccount:t,readOnly:!0})})]}),elseShow:e.jsx("p",{children:a})})})},Nc=m(q)(()=>({display:"flex",justifyContent:"center"})),Fc=({onEdit:t,onDelete:s})=>e.jsxs(Nc,{children:[e.jsx(ue,{"data-loading":!0,onClick:t,permission:M,tooltipProps:{title:"Edit service account"},children:e.jsx(Ve,{})}),e.jsx(ue,{"data-loading":!0,onClick:s,permission:M,tooltipProps:{title:"Remove service account"},children:e.jsx(Ae,{})})]}),Gc=()=>{const{setToastData:t,setToastApiError:s}=J(),{serviceAccounts:n,roles:o,refetch:a,loading:i}=ct(),{removeServiceAccount:r}=Gn(),[l,c]=h.useState(""),[d,u]=h.useState(!1),[p,x]=h.useState(!1),[g,j]=h.useState(),[y,w]=h.useState(!1),[C,k]=h.useState(),A=async E=>{try{await r(E.id),t({title:`${E.name} has been deleted`,type:"success"}),a(),w(!1)}catch($){s(z($))}},T=he(De.breakpoints.down("sm")),L=he(De.breakpoints.down("md")),P=h.useMemo(()=>[{Header:"Avatar",accessor:"imageUrl",Cell:({row:{original:E}})=>e.jsx(te,{children:e.jsx(Oe,{user:E})}),disableSortBy:!0,maxWidth:80},{id:"name",Header:"Name",accessor:E=>E.name||"",minWidth:200,Cell:({row:{original:E}})=>e.jsx(Se,{value:E.name,subtitle:E.username}),searchable:!0},{id:"role",Header:"Role",accessor:E=>{var $;return(($=o.find(V=>V.id===E.rootRole))==null?void 0:$.name)||""},Cell:({row:{original:E},value:$})=>e.jsx(kn,{value:$,role:E.rootRole}),maxWidth:120},{id:"tokens",Header:"Tokens",accessor:E=>{var $;return(($=E.tokens)==null?void 0:$.map(({description:V})=>V).join(`
23
+ `))||""},Cell:({row:{original:E},value:$})=>e.jsx(Nn,{serviceAccount:E,value:$,onCreateToken:()=>{k(E),u(!0)}}),searchable:!0},{Header:"Created",accessor:"createdAt",Cell:xe,width:120,maxWidth:120},{id:"seenAt",Header:"Last seen",accessor:E=>{var $;return($=E.tokens.sort((V,ne)=>{const oe=new Date(V.seenAt||0),H=new Date(ne.seenAt||0);return(H==null?void 0:H.getTime())-(oe==null?void 0:oe.getTime())})[0])==null?void 0:$.seenAt},Cell:Je,maxWidth:150},{Header:"Actions",id:"Actions",align:"center",Cell:({row:{original:E}})=>e.jsx(Fc,{onEdit:()=>{k(E),u(!0)},onDelete:()=>{k(E),w(!0)}}),width:150,disableSortBy:!0},{accessor:"username",Header:"Username",searchable:!0}],[o]),[I]=h.useState({sortBy:[{id:"createdAt",desc:!0}],hiddenColumns:["username"]}),{data:v,getSearchText:F}=Ke(P,l,n),{headerGroups:R,rows:b,prepareRow:D,setHiddenColumns:W}=U.useTable({columns:P,data:v,initialState:I,sortTypes:pe,autoResetHiddenColumns:!1,autoResetSortBy:!1,disableSortRemove:!0,disableMultiSort:!0,defaultColumn:{Cell:te}},U.useSortBy,U.useFlexLayout);return Ye([{condition:T,columns:["role","seenAt"]},{condition:L,columns:["imageUrl","tokens","createdAt"]}],W,P),e.jsxs(Q,{isLoading:i,header:e.jsx(X,{title:`Service Accounts (${b.length})`,actions:e.jsxs(e.Fragment,{children:[e.jsx(S,{condition:!L,show:e.jsxs(e.Fragment,{children:[e.jsx(le,{initialValue:l,onChange:c}),e.jsx(X.Divider,{})]})}),e.jsx(_,{variant:"contained",color:"primary",onClick:()=>{k(void 0),u(!0)},children:"New service account"})]}),children:e.jsx(S,{condition:L,show:e.jsx(le,{initialValue:l,onChange:c})})}),children:[e.jsx(qe,{value:F(l),children:e.jsx(ye,{rows:b,headerGroups:R,prepareRow:D})}),e.jsx(S,{condition:b.length===0,show:e.jsx(S,{condition:(l==null?void 0:l.length)>0,show:e.jsxs(de,{children:["No service accounts found matching “",l,"”"]}),elseShow:e.jsx(de,{children:"No service accounts available. Get started by adding one."})})}),e.jsx(Oc,{serviceAccount:C,open:d,setOpen:u,newToken:E=>{j(E),x(!0)}}),e.jsx(_n,{open:p,setOpen:x,token:g}),e.jsx($c,{serviceAccount:C,open:y,setOpen:w,onConfirm:A})]})},qc=()=>{const{isEnterprise:t}=N();return e.jsx("div",{children:e.jsx(S,{condition:t(),show:e.jsx(ge,{permissions:M,children:e.jsx(Gc,{})}),elseShow:e.jsx(rt,{feature:"service-accounts",page:!0})})})},_c=m("form")(()=>({display:"flex",flexDirection:"column",height:"100%"})),Wc=m("div")(({theme:t})=>({maxWidth:t.spacing(50)})),Hc=m("p")(({theme:t})=>({marginBottom:t.spacing(1)})),qs=m(_e)(({theme:t})=>({width:"100%",marginBottom:t.spacing(2)})),_s=m(B)(({theme:t})=>({margin:t.spacing(1,0)})),Mc=m("div")(()=>({display:"flex",alignItems:"center"})),zc=m("div")(()=>({marginTop:"auto",display:"flex",justifyContent:"flex-end"})),Vc=m(_)(({theme:t})=>({marginLeft:t.spacing(3)})),Hn=({children:t,email:s,name:n,rootRole:o,sendEmail:a,setEmail:i,setName:r,setSendEmail:l,setRootRole:c,handleSubmit:d,handleCancel:u,errors:p,clearErrors:x,mode:g})=>{const{uiConfig:j}=N(),{roles:y}=we();return e.jsxs(_c,{onSubmit:d,children:[e.jsxs(Wc,{children:[e.jsx(Hc,{children:"Who is the new Unleash user?"}),e.jsx(qs,{label:"Full name",value:n,onChange:w=>r(w.target.value),error:!!p.name,errorText:p.name,onFocus:()=>x(),autoFocus:!0}),e.jsx(qs,{label:"Email",type:"email",value:s,onChange:w=>i(w.target.value),error:!!p.email,errorText:p.email,onFocus:()=>x()}),e.jsx(_s,{variant:"subtitle1","data-loading":!0,children:"What is your team member allowed to do?"}),e.jsx(Rt,{roles:y,value:o,setValue:c,required:!0}),e.jsx(S,{condition:g!==ns&&!!(j!=null&&j.emailEnabled),show:e.jsxs(bt,{children:[e.jsx(_s,{variant:"subtitle1","data-loading":!0,children:"Should we send an email to your new team member"}),e.jsxs(Mc,{children:[e.jsx(me,{name:"sendEmail",onChange:()=>l(!a),checked:a}),e.jsx(B,{children:a?"Yes":"No"})]})]})})]}),e.jsxs(zc,{children:[t,e.jsx(Vc,{onClick:u,children:"Cancel"})]})]})},Yc=async(t,s,n)=>{const o=await s.json(),a=o.isJoi?o.details[0].message:o[0].msg;throw t(i=>({...i,[n]:a})),new Error},Jc=(t,s,n)=>{throw t(o=>({...o,[n]:"Could not find the requested resource."})),new ra(s.status)},Kc=async(t,s,n)=>{const o=await s.json(),a=o.isJoi?o.details[0].message:o[0].msg;throw t(i=>({...i,[n]:a})),new la(s.status)},Zc=async(t,s,n)=>{const o=await s.json(),a=o.isJoi?o.details[0].message:o[0].msg;throw t(i=>({...i,[n]:a})),new ca(s.status)},Ws="removeUser",ht=()=>{const{loading:t,makeRequest:s,createRequest:n,errors:o}=fe({handleBadRequest:Yc,handleNotFound:Jc,handleUnauthorized:Kc,handleForbidden:Zc});return{addUser:async u=>{const x=n("api/admin/user-admin",{method:"POST",body:JSON.stringify(u)},"addUser");return s(x.caller,x.id)},updateUser:async u=>{const x=n(`api/admin/user-admin/${u.id}`,{method:"PUT",body:JSON.stringify(u)},"updateUser");return s(x.caller,x.id)},removeUser:async u=>{const x=n(`api/admin/user-admin/${u}`,{method:"DELETE"},"removeUser");return s(x.caller,x.id)},changePassword:async(u,p)=>{const g=n(`api/admin/user-admin/${u}/change-password`,{method:"POST",body:JSON.stringify({password:p})},"changePassword");return s(g.caller,g.id)},validatePassword:async u=>{const x=n("api/admin/user-admin/validate-password",{method:"POST",body:JSON.stringify({password:u})},"validatePassword");return s(x.caller,x.id)},resetPassword:async u=>{const x=n("api/admin/user-admin/reset-password",{method:"POST",body:JSON.stringify({id:u})},"resetPassword");return s(x.caller,x.id)},userApiErrors:o,userLoading:t}},Mn=(t="",s="",n=null)=>{const{uiConfig:o}=N(),{users:a,roles:i}=we(),[r,l]=h.useState(t),[c,d]=h.useState(s),[u,p]=h.useState(!1),[x,g]=h.useState(i.find(({id:T})=>T===n)||null),[j,y]=h.useState({});return h.useEffect(()=>{l(t)},[t]),h.useEffect(()=>{d(s)},[s]),h.useEffect(()=>{p((o==null?void 0:o.emailEnabled)||!1)},[o==null?void 0:o.emailEnabled]),h.useEffect(()=>{g(i.find(({id:T})=>T===n)||null)},[n]),{name:r,setName:l,email:c,setEmail:d,sendEmail:u,setSendEmail:p,rootRole:x,setRootRole:g,getAddUserPayload:()=>({name:r,email:c,sendEmail:u,rootRole:(x==null?void 0:x.id)||0}),validateName:()=>r.length===0?(y(T=>({...T,name:"Name can not be empty."})),!1):c.length===0?(y(T=>({...T,email:"Email can not be empty."})),!1):!0,validateEmail:()=>a.some(T=>T.email===c)?(y(T=>({...T,email:"Email already exists"})),!1):!0,clearErrors:()=>{y({})},errors:j}},Qc=t=>h.createElement("svg",{width:197,height:177,viewBox:"0 0 197 177",fill:"none",xmlns:"http://www.w3.org/2000/svg",...t},h.createElement("g",{clipPath:"url(#clip0)"},h.createElement("path",{d:"M195.272 67.6884C195.201 67.6884 195.132 67.6668 195.074 67.6264L99.4918 1.00044C99.2009 0.798626 98.8553 0.690774 98.5013 0.691378C98.1474 0.691982 97.8021 0.801012 97.5119 1.00382L2.61779 67.6257C2.54273 67.6784 2.44984 67.6991 2.35954 67.6832C2.26924 67.6674 2.18893 67.6163 2.13629 67.5411C2.08364 67.466 2.06297 67.373 2.07881 67.2826C2.09466 67.1923 2.14573 67.1119 2.22079 67.0592L97.115 0.437299C97.5213 0.153417 98.0047 0.000817369 98.5002 2.3283e-06C98.9957 -0.000812712 99.4796 0.150195 99.8868 0.432738L195.469 67.0585C195.53 67.1006 195.575 67.1609 195.599 67.2306C195.623 67.3004 195.624 67.3758 195.602 67.4461C195.58 67.5164 195.536 67.5778 195.476 67.6214C195.417 67.6649 195.345 67.6884 195.272 67.6884L195.272 67.6884Z",fill:"#3F3D56"}),h.createElement("path",{d:"M8.04028 70.0501L98.5953 2.87773L189.837 74.8297L103.261 126.199L56.2576 115.476L8.04028 70.0501Z",fill:"#E6E6E6"}),h.createElement("path",{d:"M60.2251 157.928H15.4887C15.214 157.928 14.942 157.875 14.6881 157.77C14.4342 157.665 14.2035 157.511 14.0091 157.316C13.8147 157.122 13.6606 156.891 13.5554 156.637C13.4502 156.383 13.396 156.111 13.396 155.836C13.396 155.561 13.4502 155.289 13.5554 155.035C13.6606 154.781 13.8147 154.55 14.0091 154.356C14.2035 154.162 14.4342 154.008 14.6881 153.903C14.942 153.798 15.214 153.744 15.4887 153.744H60.2251C60.4998 153.744 60.7719 153.798 61.0258 153.903C61.2797 154.008 61.5104 154.162 61.7048 154.356C61.8991 154.55 62.0533 154.781 62.1585 155.035C62.2637 155.289 62.3179 155.561 62.3179 155.836C62.3179 156.111 62.2637 156.383 62.1585 156.637C62.0533 156.891 61.8991 157.122 61.7048 157.316C61.5104 157.511 61.2797 157.665 61.0258 157.77C60.7719 157.875 60.4998 157.928 60.2251 157.928Z",fill:"#607D8B"}),h.createElement("path",{d:"M31.5392 148.934H15.4887C15.214 148.934 14.942 148.88 14.6881 148.776C14.4342 148.671 14.2035 148.516 14.0091 148.322C13.8147 148.128 13.6606 147.897 13.5554 147.643C13.4502 147.389 13.396 147.117 13.396 146.842C13.396 146.567 13.4502 146.295 13.5554 146.041C13.6606 145.787 13.8147 145.556 14.0091 145.362C14.2035 145.168 14.4342 145.014 14.6881 144.909C14.942 144.804 15.214 144.75 15.4887 144.75H31.5392C31.8139 144.75 32.0859 144.804 32.3398 144.909C32.5937 145.014 32.8244 145.168 33.0188 145.362C33.2132 145.556 33.3674 145.787 33.4726 146.041C33.5778 146.295 33.6319 146.567 33.6319 146.842C33.6319 147.117 33.5778 147.389 33.4726 147.643C33.3674 147.897 33.2132 148.128 33.0188 148.322C32.8244 148.516 32.5937 148.671 32.3398 148.776C32.0859 148.88 31.8139 148.934 31.5392 148.934Z",fill:"#607D8B"}),h.createElement("path",{d:"M99.8687 107.464C99.5287 107.465 99.1918 107.399 98.8771 107.27L43.0291 84.0761V11.4759C43.0298 10.8339 43.2849 10.2184 43.7385 9.76446C44.192 9.31051 44.8069 9.05515 45.4484 9.0544H152.589C153.23 9.05515 153.845 9.31051 154.299 9.76446C154.752 10.2184 155.007 10.8339 155.008 11.4759V84.1267L154.903 84.1717L100.89 107.258C100.567 107.394 100.22 107.464 99.8687 107.464Z",fill:"white"}),h.createElement("path",{d:"M99.8687 107.637C99.5061 107.637 99.1469 107.567 98.8112 107.43L42.8562 84.1916V11.4759C42.857 10.788 43.1303 10.1286 43.6163 9.64218C44.1022 9.1558 44.7611 8.88221 45.4483 8.88143H152.589C153.276 8.88221 153.935 9.1558 154.421 9.64218C154.907 10.1286 155.18 10.788 155.181 11.4759V84.2409L100.958 107.417C100.613 107.563 100.243 107.637 99.8687 107.637ZM43.5474 83.7295L99.0748 106.79C99.5928 107.001 100.173 106.997 100.688 106.781L154.49 83.7842V11.4759C154.489 10.9714 154.288 10.4879 153.932 10.1312C153.576 9.77452 153.093 9.57387 152.589 9.57328H45.4483C44.9444 9.57387 44.4612 9.77452 44.1049 10.1312C43.7485 10.4879 43.548 10.9714 43.5474 11.4759L43.5474 83.7295Z",fill:"#3F3D56"}),h.createElement("path",{d:"M194.581 66.9965H194.512L154.835 83.9537L100.55 107.155C100.337 107.244 100.11 107.291 99.8797 107.292C99.6496 107.293 99.4215 107.249 99.2084 107.162L43.2018 83.9052L2.55059 67.0242L2.48849 66.9965H2.4193C1.77788 66.9972 1.16293 67.2526 0.70938 67.7066C0.255828 68.1605 0.000711706 68.776 0 69.418V174.579C0.000712619 175.221 0.255828 175.836 0.70938 176.29C1.16293 176.744 1.77788 176.999 2.4193 177H194.581C195.222 176.999 195.837 176.744 196.291 176.29C196.744 175.836 196.999 175.221 197 174.579V69.418C196.999 68.776 196.744 68.1605 196.291 67.7066C195.837 67.2526 195.222 66.9972 194.581 66.9965ZM196.309 174.579C196.309 175.037 196.126 175.477 195.802 175.801C195.478 176.126 195.039 176.308 194.581 176.308H2.4193C1.96104 176.308 1.52161 176.126 1.19757 175.801C0.873536 175.477 0.691411 175.037 0.691228 174.579V69.418C0.691855 68.9707 0.865197 68.541 1.17501 68.2187C1.48483 67.8963 1.90713 67.7063 2.35365 67.6884L43.2018 84.6524L98.9425 107.802C99.5459 108.047 100.222 108.044 100.823 107.791L154.835 84.7043L194.65 67.6884C195.096 67.7076 195.517 67.8982 195.826 68.2203C196.135 68.5425 196.308 68.9714 196.309 69.418V174.579Z",fill:"#3F3D56"}),h.createElement("path",{d:"M99.3104 86.8775C97.2487 86.8813 95.2416 86.214 93.5919 84.9762L93.4896 84.8994L71.9541 68.3963C70.9567 67.6314 70.1197 66.6774 69.4907 65.5888C68.8617 64.5001 68.4531 63.2981 68.2882 62.0514C68.1233 60.8047 68.2054 59.5377 68.5297 58.3228C68.8541 57.1078 69.4143 55.9687 70.1785 54.9704C70.9426 53.9722 71.8958 53.1344 72.9835 52.5048C74.0711 51.8753 75.2721 51.4663 76.5177 51.3013C77.7632 51.1362 79.0291 51.2184 80.243 51.543C81.4569 51.8676 82.595 52.4284 83.5923 53.1932L97.5414 63.8988L130.505 20.8706C131.27 19.8726 132.223 19.0351 133.311 18.4059C134.399 17.7767 135.6 17.3682 136.846 17.2036C138.091 17.039 139.357 17.1216 140.571 17.4467C141.785 17.7718 142.923 18.333 143.92 19.0982L143.715 19.3767L143.925 19.1023C145.936 20.6494 147.252 22.9319 147.584 25.449C147.916 27.9661 147.237 30.5122 145.696 32.5287L106.922 83.1402C106.026 84.3065 104.872 85.2503 103.552 85.8984C102.232 86.5466 100.781 86.8816 99.3104 86.8775Z",fill:"#607D8B"})),h.createElement("defs",null,h.createElement("clipPath",{id:"clip0"},h.createElement("rect",{width:197,height:177,fill:"white"})))),Xc=({open:t,closeConfirm:s,inviteLink:n})=>e.jsxs(se,{open:t,title:"Team member added",primaryButtonText:"Close",onClick:s,children:[e.jsx(B,{children:"A new team member has been added. We’ve sent an email on your behalf to inform them of their new account and role. No further steps are required."}),e.jsx(q,{sx:{width:"100%",textAlign:"center",px:"auto",py:4},children:e.jsx(Qc,{})}),e.jsx(B,{style:{fontWeight:"bold"},variant:"subtitle1",children:"In a rush?"}),e.jsx(B,{children:"You may also copy the invite link and send it to the user."}),e.jsx(Tt,{inviteLink:n})]}),ed=({open:t,closeConfirm:s,inviteLink:n})=>e.jsxs(se,{open:t,onClick:s,primaryButtonText:"Close",title:"Team member added",children:[e.jsx(B,{variant:"body1",sx:{mb:2},children:"A new team member has been added."}),e.jsx(B,{variant:"body1",children:"Please provide them with the following link. This will allow them to set up their password and get started with their Unleash account."}),e.jsx(Tt,{inviteLink:n}),e.jsx(K,{severity:"info",sx:{mt:2},children:e.jsxs(B,{variant:"body2",children:["Want to avoid this step in the future?"," ",e.jsx("a",{href:"https://docs.getunleash.io/docs/deploy/email",target:"_blank",rel:"noopener noreferrer",children:"If you configure an email server for Unleash"})," ","we'll automatically send informational getting started emails to new users once you add them."]})})]}),zn=({open:t,closeConfirm:s,emailSent:n,inviteLink:o})=>n?e.jsx(Xc,{open:t,closeConfirm:s,inviteLink:o}):e.jsx(ed,{open:t,closeConfirm:s,inviteLink:o}),ms=t=>{var l;const{instanceStatus:s}=nn(),{uiConfig:n}=N(),o=!!((l=n==null?void 0:n.flags)!=null&&l.proPlanAutoCharge&&(s==null?void 0:s.plan)===Ue.PRO),a=(s==null?void 0:s.seats)??5,i=h.useMemo(()=>td(t,o,a),[t,o,a]),r=i.filter(c=>c.paid).length;return{seats:a,extraSeats:r,planUsers:i,isBillingUsers:o}},td=(t,s,n=0)=>(!s||!n||t.sort((o,a)=>o.createdAt.localeCompare(a.createdAt)).forEach((o,a)=>{o.paid=!1,a>=n&&(o.paid=!0)}),t),sd=()=>{const{users:t}=we(),{isBillingUsers:s,seats:n,planUsers:o}=ms(t);return!s||o.length<n?null:e.jsx(K,{severity:"info",sx:{marginBottom:a=>a.spacing(3)},children:e.jsxs("p",{children:[e.jsx("strong",{children:"Heads up!"})," You are exceeding your allocated free members included in your plan (",o.length," of ",n,"). Creating this user will add ",e.jsx("strong",{children:"$15/month"})," to your invoice, starting with your next payment."]})})},nd=()=>{const{setToastApiError:t}=J(),{uiConfig:s}=N(),n=ve(),{name:o,setName:a,email:i,setEmail:r,sendEmail:l,setSendEmail:c,rootRole:d,setRootRole:u,getAddUserPayload:p,validateName:x,validateEmail:g,errors:j,clearErrors:y}=Mn(),[w,C]=h.useState(!1),[k,A]=h.useState(""),{addUser:T,userLoading:L}=ht(),P=async R=>{R.preventDefault(),y();const b=x(),D=g();if(b&&D){const W=p();try{await T(W).then(E=>E.json()).then(E=>{Kt(),A(E.inviteLink),C(!0)})}catch(E){t(z(E))}}},I=()=>{C(!1),n("/admin/users")},v=()=>`curl --location --request POST '${s.unleashUrl}/api/admin/user-admin' \\
24
+ --header 'Authorization: INSERT_API_KEY' \\
25
+ --header 'Content-Type: application/json' \\
26
+ --data-raw '${JSON.stringify(p(),void 0,2)}'`,F=()=>{n(Ee)};return e.jsxs(Ce,{loading:L,title:"Create Unleash user",description:"In order for a user to get access to Unleash, they need to be assigned a root role, such as Viewer, Editor, or Admin.",documentationLink:"https://docs.getunleash.io/reference/rbac#predefined-roles",documentationLinkLabel:"User management documentation",formatApiCode:v,children:[e.jsx(sd,{}),e.jsx(Hn,{errors:j,handleSubmit:P,handleCancel:F,name:o,setName:a,email:i,setEmail:r,sendEmail:l,setSendEmail:c,rootRole:d,setRootRole:u,clearErrors:y,children:e.jsx(Ks,{name:"user",permission:M})}),e.jsx(zn,{open:w,closeConfirm:I,emailSent:l,inviteLink:k})]})},Hs=[{key:Ft(new Date,{hours:48}).toISOString(),label:"48 hours"},{key:Ft(new Date,{weeks:1}).toISOString(),label:"1 week"},{key:Ft(new Date,{months:1}).toISOString(),label:"1 month"}],od=(t,s)=>{const{uiConfig:n}=N();return t?()=>`curl --location --request PUT '${n.unleashUrl}/api/admin/invite-link/tokens/default' \\
27
+ --header 'Authorization: INSERT_API_KEY' \\
28
+ --header 'Content-Type: application/json' \\
29
+ --data-raw '${JSON.stringify({expiresAt:s},void 0,2)}'`:()=>`curl --location --request POST '${n.unleashUrl}/api/admin/invite-link/tokens' \\
30
+ --header 'Authorization: INSERT_API_KEY' \\
31
+ --header 'Content-Type: application/json' \\
32
+ --data-raw '${JSON.stringify({name:"default",expiresAt:s},void 0,2)}'`},ad=()=>{var I;const t=ve(),{data:s,loading:n}=da(),[o,a]=h.useState(""),{mutate:i}=ua(),{trackEvent:r}=is(),[l,c]=h.useState(Hs[0].key),[d,u]=h.useState(!1),p=(I=s==null?void 0:s.tokens)==null?void 0:I.find(v=>v.name==="default"),x=!!p,g=od(x,l),[j,y]=h.useState(!1),{setToastApiError:w}=J(),{createToken:C,updateToken:k}=ha(),A=async v=>{v.preventDefault(),y(!0),r("invite",{props:{eventType:x?"link update submitted":"link created"}});try{if(x)await k(p.secret,{expiresAt:l}),a(p.url);else{const R=await(await C({name:"default",expiresAt:l})).json();a(R.url)}}catch(F){w(z(F))}finally{y(!1),i(ma)}},T=async()=>{y(!0);try{await k(p.secret,{enabled:!1}),t(Ee)}catch(v){w(z(v))}finally{y(!1)}},L=async()=>{u(!0)},P=()=>{a(""),t("/admin/users")};return e.jsxs(Ce,{loading:n||j,title:x?"Update invite link":"Create invite link",description:"When you send an invite link to someone, they will be able to create an account and get access to Unleash. This new user will only have read access, until you change their assigned role.",documentationLink:"https://docs.getunleash.io/reference/public-signup",documentationLinkLabel:"Invite link documentation",formatApiCode:g,children:[e.jsxs(q,{component:"form",onSubmit:A,sx:{display:"flex",flexDirection:"column",flexGrow:1},"data-testid":"create-invite-link-form",children:[e.jsxs(q,{sx:{maxWidth:"400px"},children:[e.jsxs(q,{sx:{mb:2},children:[e.jsx(B,{sx:{mb:1},children:"Expiration period for the invite link"}),e.jsx(bn,{label:"Link will expire in",name:"type",options:Hs,value:l,onChange:c,fullWidth:!0})]}),e.jsx(B,{sx:{mb:1},children:"People using this link will be invited as:"}),e.jsxs(q,{sx:{p:2,borderRadius:v=>`${v.shape.borderRadiusMedium}px`,backgroundColor:v=>v.palette.background.elevation2},children:[e.jsx(B,{variant:"body2",fontWeight:"bold",children:"Viewer"}),e.jsx(B,{variant:"body2",color:"text.secondary",children:"Users with this role can only read root resources in Unleash. The viewer can be added to specific projects as project member. Viewers may not view API tokens."})]})]}),e.jsxs(q,{sx:{display:"flex",justifyContent:"flex-end",mt:"auto"},children:[e.jsx(pa,{type:"submit",permission:M,disabled:j,children:x?"Update invite link":"Create invite link"}),e.jsx(S,{condition:x,show:e.jsx(_,{sx:{ml:2},onClick:L,color:"error",children:"Delete link"})}),e.jsx(_,{sx:{ml:2},onClick:()=>{t(Ee)},children:"Cancel"})]})]}),e.jsx(se,{open:!!o,onClick:P,primaryButtonText:"Close",title:"Invite link created",children:e.jsxs(q,{children:[e.jsx(B,{variant:"body1",sx:{mb:2},children:"Using this link, new team members can now sign-up to Unleash."}),e.jsx(B,{variant:"body1",children:"Please provide them with the following link to get started. This will allow them to set up their password and get started with their Unleash account."}),e.jsx(Tt,{inviteLink:o})]})}),e.jsx(se,{open:d,onClose:()=>u(!1),onClick:T,title:"Are you sure you want to delete your invite link?"})]})},Vn={overlay:{position:"absolute",top:0,left:0,right:0,bottom:0,backgroundColor:"rgba(0, 0, 0, 0.25)",zIndex:5},content:{width:"500px",maxWidth:"90%",margin:"0",top:"50%",left:"50%",right:"auto",bottom:"auto",transform:"translate(-50%, -50%)"}},id=m(Oe)(({theme:t})=>({width:t.spacing(5),height:t.spacing(5),margin:0})),rd=({showDialog:t,closeDialog:s,user:n})=>{const[o,a]=h.useState({}),[i,r]=h.useState(),[l,c]=h.useState(!1),{classes:d}=cs(),{changePassword:u}=ht(),p=j=>{r(void 0),a({...o,[j.target.name]:ja(j.target.value)})},x=async j=>{if(j.preventDefault(),o.password===o.confirm){if(!l){r(Ss);return}try{await u(n.id,o.password),a({}),s()}catch(y){console.warn(y),r(Ss)}}},g=j=>{j.preventDefault(),a({}),r(void 0),s()};return e.jsx(se,{open:t,onClick:x,style:Vn,onClose:g,primaryButtonText:"Save",title:"Update password",secondaryButtonText:"Cancel",maxWidth:"xs",children:e.jsxs("form",{onSubmit:x,className:Sn(d.contentSpacingY,d.flexColumn),children:[e.jsx(B,{variant:"subtitle1",children:"Changing password for user"}),e.jsxs("div",{className:d.flexRow,children:[e.jsx(id,{user:n,variant:"rounded"}),e.jsx(B,{variant:"subtitle1",style:{marginLeft:"1rem"},children:n.username||n.email})]}),e.jsx(xa,{password:o.password,callback:c}),e.jsx(Z,{label:"New password",name:"password",type:"password",value:o.password,error:!!i,helperText:i,onChange:p,variant:"outlined",size:"small"}),e.jsx(Z,{label:"Confirm password",name:"confirm",type:"password",value:o.confirm,onChange:p,variant:"outlined",size:"small"}),e.jsx(ga,{started:!!(o.password&&o.confirm),matchingPasswords:o.password===o.confirm})]})})},ld=m(Oe)(({theme:t})=>({width:t.spacing(5),height:t.spacing(5),margin:0})),cd=({showDialog:t,closeDialog:s,user:n})=>{const{classes:o}=cs(),{resetPassword:a}=ht(),{setToastApiError:i}=J(),[r,l]=h.useState(""),c=async p=>{if(p.preventDefault(),!n.email){i("You can't reset the password of a user who doesn't have an email address.");return}try{const x=await a(n.email).then(g=>g.ok?g.json():void 0);x?l(x.resetPasswordUrl):i("Could not reset password. This may be to prevent too many resets. Try again in a minute.")}catch(x){i(z(x))}},d=p=>{p.preventDefault(),s()},u=()=>{l(""),s()};return e.jsxs(se,{open:t,onClick:c,style:Vn,onClose:d,primaryButtonText:"Generate Link",title:"Reset password",secondaryButtonText:"Cancel",maxWidth:"xs",children:[e.jsxs("form",{onSubmit:c,className:Sn(o.contentSpacingY,o.flexColumn),children:[e.jsx(B,{variant:"subtitle1",children:"Resetting password for user"}),e.jsxs("div",{className:o.flexRow,children:[e.jsx(ld,{user:n,variant:"rounded"}),e.jsx(B,{variant:"subtitle1",style:{marginLeft:"1rem"},children:n.username||n.email})]})]}),e.jsx(se,{open:!!r,onClick:u,primaryButtonText:"Close",title:"Reset password link created",children:e.jsxs(q,{children:[e.jsx(B,{variant:"body1",children:"The user can use this link to reset their password. You should not share this link with anyone but the user in question."}),e.jsx(Tt,{inviteLink:r})]})})]})},dd=m(Oe)(({theme:t})=>({width:t.spacing(5),height:t.spacing(5),margin:0})),ud=({showDialog:t,closeDialog:s,user:n,userLoading:o,removeUser:a,userApiErrors:i})=>{const r=fa(o),{classes:l}=cs();return e.jsx(se,{open:t,title:"Really delete user?",onClose:s,onClick:a,primaryButtonText:"Delete user",secondaryButtonText:"Cancel",children:e.jsxs("div",{ref:r,children:[e.jsx(S,{condition:!!i[Ws],show:e.jsx(K,{"data-loading":!0,severity:"error",style:{margin:"1rem 0"},children:i[Ws]})}),e.jsxs("div",{"data-loading":!0,className:l.flexRow,children:[e.jsx(dd,{user:n,variant:"rounded"}),e.jsx(B,{variant:"subtitle1",style:{marginLeft:"1rem"},children:n.username||n.email})]}),e.jsxs(B,{"data-loading":!0,variant:"body1",style:{marginTop:"1rem"},children:["Are you sure you want to delete"," ",n?`${n.name||"user"} (${n.email||n.username})`:"","?"]})]})})},hd=()=>{const{loading:t,makeRequest:s,createRequest:n,errors:o}=fe({propagateErrors:!0});return{downloadCSV:async()=>{const r=n("api/admin/access/overview",{method:"GET",responseType:"blob",headers:{Accept:"text/csv"}},"downloadCSV"),l=await(await s(r.caller,r.id)).blob(),c=window.URL.createObjectURL(l);window.location.assign(c)},errors:o,loading:t}},pd=m(Ha)(({theme:t})=>({color:t.palette.primary.light,fontSize:"1.5rem",backgroundColor:"#F1F0FC",borderRadius:t.shape.borderRadiusLarge})),md=({value:t})=>e.jsx(te,{children:e.jsx(S,{condition:t,show:e.jsx(Be,{title:"Paid user",arrow:!0,children:e.jsx(pd,{})}),elseShow:"Included"})}),xd=m(q)(()=>({display:"flex",justifyContent:"center"})),gd=({onEdit:t,onChangePassword:s,onResetPassword:n,onDelete:o})=>e.jsxs(xd,{children:[e.jsx(ue,{"data-loading":!0,onClick:t,permission:M,tooltipProps:{title:"Edit user"},children:e.jsx(Ve,{})}),e.jsx(ue,{"data-loading":!0,onClick:s,permission:M,tooltipProps:{title:"Change password"},children:e.jsx(ya,{})}),e.jsx(ue,{"data-loading":!0,onClick:n,permission:M,tooltipProps:{title:"Reset password"},children:e.jsx(za,{})}),e.jsx(ue,{"data-loading":!0,onClick:o,permission:M,tooltipProps:{title:"Remove user"},children:e.jsx(Ae,{})})]}),Ms=20,jd=()=>{const{users:t}=we(),{isBillingUsers:s,planUsers:n}=ms(t);return!s||(n==null?void 0:n.length)<Ms?null:e.jsx(K,{severity:"info",sx:{marginBottom:o=>o.spacing(3)},children:e.jsxs("p",{children:[e.jsx("strong",{children:"Heads up!"})," You have reached your maximum number of registered users for you PRO account (up to max ",Ms," ","users). If you need more users please"," ",e.jsx(ls,{component:re,to:"https://www.getunleash.io/signup-enterprise",children:"get in touch with us"}),"."]})})},fd=()=>{const t=ve(),{users:s,roles:n,refetch:o,loading:a}=we(),{setToastData:i,setToastApiError:r}=J(),{removeUser:l,userLoading:c,userApiErrors:d}=ht(),{downloadCSV:u}=hd(),[p,x]=h.useState({open:!1}),[g,j]=h.useState({open:!1});N();const[y,w]=h.useState(!1),[C,k]=h.useState(!1),[A,T]=h.useState(!1),[L,P]=h.useState(""),[I,v]=h.useState(),{planUsers:F,isBillingUsers:R}=ms(s),[b,D]=h.useState(""),W=he(De.breakpoints.down("sm")),E=he(De.breakpoints.down("md")),$=()=>{w(!1),v(void 0)},V=O=>ee=>{ee.preventDefault(),w(!0),v(O)},ne=O=>ee=>{ee.preventDefault(),x({open:!0,user:O})},oe=O=>ee=>{ee.preventDefault(),j({open:!0,user:O})},H=()=>{x({open:!1})},be=()=>{j({open:!1})},At=async O=>{try{await l(O.id),i({title:`${O.name} has been deleted`,type:"success"}),o(),$()}catch(ee){r(z(ee))}},Dt=()=>{k(!1),T(!1),P("")},Te=h.useMemo(()=>[{Header:"Avatar",accessor:"imageUrl",Cell:({row:{original:O}})=>e.jsx(te,{children:e.jsx(Oe,{user:O})}),disableSortBy:!0,maxWidth:80},{id:"name",Header:"Name",accessor:O=>O.name||"",minWidth:200,Cell:({row:{original:O}})=>e.jsx(Se,{value:O.name,subtitle:O.email||O.username}),searchable:!0},{id:"role",Header:"Role",accessor:O=>{var ee;return((ee=n.find(Jn=>Jn.id===O.rootRole))==null?void 0:ee.name)||""},Cell:({row:{original:O},value:ee})=>e.jsx(kn,{value:ee,role:O.rootRole}),maxWidth:120},{Header:"Created",accessor:"createdAt",Cell:xe,width:120,maxWidth:120},{id:"last-login",Header:"Last login",accessor:O=>O.seenAt||"",Cell:({row:{original:O}})=>e.jsx(Je,{value:O.seenAt,emptyText:"Never",title:ee=>`Last login: ${ee}`}),maxWidth:150},{id:"type",Header:"Type",accessor:"paid",maxWidth:100,Cell:({row:{original:O}})=>e.jsx(md,{value:R&&O.paid}),sortType:"boolean"},{Header:"Actions",id:"Actions",align:"center",Cell:({row:{original:O}})=>e.jsx(gd,{onEdit:()=>{t(`/admin/users/${O.id}/edit`)},onChangePassword:ne(O),onResetPassword:oe(O),onDelete:V(O)}),width:200,disableSortBy:!0},{accessor:"username",Header:"Username",searchable:!0},{accessor:"email",Header:"Email",searchable:!0}],[n,t,R]),Ze=h.useMemo(()=>({sortBy:[{id:"createdAt",desc:!0}],hiddenColumns:R?["username","email"]:["type","username","email"]}),[R]),{data:It,getSearchText:Pt}=Ke(Te,b,R?F:s),{headerGroups:Bt,rows:Qe,prepareRow:Lt,setHiddenColumns:Y}=U.useTable({columns:Te,data:It,initialState:Ze,sortTypes:pe,autoResetHiddenColumns:!1,autoResetSortBy:!1,disableSortRemove:!0,disableMultiSort:!0,defaultColumn:{Cell:te}},U.useSortBy,U.useFlexLayout);return Ye([{condition:!R||E,columns:["type"]},{condition:W,columns:["imageUrl","role"]},{condition:E,columns:["createdAt","last-login"]}],Y,Te),e.jsxs(Q,{isLoading:a,header:e.jsx(X,{title:`Users (${Qe.length})`,actions:e.jsxs(e.Fragment,{children:[e.jsx(le,{initialValue:b,onChange:D}),e.jsx(X.Divider,{}),e.jsx(Be,{title:"Exports user access information",arrow:!0,describeChild:!0,children:e.jsx(Ge,{onClick:u,children:e.jsx(mn,{})})}),e.jsx(_,{variant:"contained",color:"primary",onClick:()=>t("/admin/create-user"),children:"Add new user"})]})}),children:[e.jsx(jd,{}),e.jsx(qe,{value:Pt(b),children:e.jsx(ye,{rows:Qe,headerGroups:Bt,prepareRow:Lt})}),e.jsx(S,{condition:Qe.length===0,show:e.jsx(S,{condition:(b==null?void 0:b.length)>0,show:e.jsxs(de,{children:["No users found matching “",b,"”"]}),elseShow:e.jsx(de,{children:"No users available. Get started by adding one."})})}),e.jsx(zn,{open:C,closeConfirm:Dt,emailSent:A,inviteLink:L}),e.jsx(S,{condition:!!p.user,show:()=>e.jsx(rd,{showDialog:p.open,closeDialog:H,user:p.user})}),e.jsx(S,{condition:!!g.user,show:()=>e.jsx(cd,{showDialog:g.open,closeDialog:be,user:g.user})}),e.jsx(S,{condition:!!I,show:e.jsx(ud,{showDialog:y,closeDialog:$,user:I,removeUser:()=>At(I),userLoading:c,userApiErrors:d})})]})},yd=()=>{const{trackEvent:t}=is(),s=n=>{t("invite",{props:{eventType:n?"link bar action: edit":"link bar action: create"}})};return e.jsx(q,{sx:n=>({backgroundColor:n.palette.background.paper,py:2,px:4,mb:2,borderRadius:`${n.shape.borderRadiusLarge}px`,display:"flex",flexDirection:{xs:"column",md:"row"},border:"2px solid",borderColor:n.palette.background.alternative}),children:e.jsx(ba,{onActionClick:s})})},bd=(t,s={})=>{const n=()=>{const c=ie(`api/admin/user-admin/${t}`);return fetch(c,{method:"GET"}).then(je("Users")).then(d=>d.json())},{data:o,error:a}=Le(`api/admin/user-admin/${t}`,n,s),[i,r]=h.useState(!a&&!o),l=()=>{sn(`api/admin/user-admin/${t}`)};return h.useEffect(()=>{r(!a&&!o)},[o,a]),{user:o||{},error:a,loading:i,refetch:l}},Sd=()=>{h.useEffect(()=>{Kt()},[]);const{uiConfig:t}=N(),{setToastData:s,setToastApiError:n}=J(),o=ss("id"),{user:a,refetch:i}=bd(o),{updateUser:r,userLoading:l}=ht(),c=ve(),{name:d,setName:u,email:p,setEmail:x,sendEmail:g,setSendEmail:j,rootRole:y,setRootRole:w,getAddUserPayload:C,validateName:k,errors:A,clearErrors:T}=Mn(a==null?void 0:a.name,a==null?void 0:a.email,a==null?void 0:a.rootRole),L=()=>`curl --location --request PUT '${t.unleashUrl}/api/admin/user-admin/${o}' \\
33
+ --header 'Authorization: INSERT_API_KEY' \\
34
+ --header 'Content-Type: application/json' \\
35
+ --data-raw '${JSON.stringify(C(),void 0,2)}'`,P=async v=>{v.preventDefault();const F=C();if(k())try{await r({...F,id:o}),i(),c("/admin/users"),s({title:"User information updated",type:"success"})}catch(b){n(z(b))}},I=()=>{c(Ee)};return e.jsx(Ce,{loading:l,title:"Edit user",description:"In order for a user to get access to Unleash, they need to be assigned a root role, such as Viewer, Editor, or Admin.",documentationLink:"https://docs.getunleash.io/reference/rbac#predefined-roles",documentationLinkLabel:"User management documentation",formatApiCode:L,children:e.jsx(Hn,{errors:A,handleSubmit:P,handleCancel:I,name:d,setName:u,email:p,setEmail:x,sendEmail:g,setSendEmail:j,rootRole:y,setRootRole:w,clearErrors:T,mode:ns,children:e.jsx(cn,{permission:M})})})},vd=()=>e.jsx("div",{children:e.jsx(ge,{permissions:M,children:e.jsxs(lt,{children:[e.jsx(G,{index:!0,element:e.jsxs(e.Fragment,{children:[e.jsx(yd,{}),e.jsx(fd,{})]})}),e.jsx(G,{path:":id/edit",element:e.jsx(Sd,{})}),e.jsx(G,{path:"*",element:e.jsx(vn,{})})]})})}),Cd=()=>{const s=Cn().reduce((n,o)=>{const a=o.group||"other",i=n.findIndex(r=>r.name===a);return i===-1?(n.push({name:a,description:Sa[a]||"Other",items:[o]}),n):(n[i].items.push(o),n)},[]);return e.jsx(Q,{header:e.jsx(X,{title:"Manage Unleash"}),children:s.map(n=>e.jsxs(q,{sx:o=>({marginBottom:o.spacing(2)}),children:[e.jsx(B,{variant:"h2",children:n.description}),e.jsx("ul",{children:n.items.map(o=>e.jsx("li",{children:e.jsx(ls,{component:re,to:o.path,children:o.title})},o.path))})]},n.name))})},wd=m(pn)(({theme:t})=>({marginBottom:"1rem",borderRadius:`${t.shape.borderRadiusLarge}px`,boxShadow:"none",padding:t.spacing(0,2)})),Td=m("div")(({theme:t})=>({marginLeft:t.spacing(1),display:"flex",alignItems:"center"})),kd=()=>{var l;const{isPro:t,isOss:s}=N(),{pathname:n}=rs(),o=n.split("/")[2],a=Cn(),i=(l=a.find(c=>n.includes(c.path)))==null?void 0:l.group,r=a.filter(c=>!i||c.group===i||s()&&c.group!=="log");return i?e.jsx(wd,{children:e.jsx(St,{value:o,variant:"scrollable",scrollButtons:"auto",allowScrollButtonsMobile:!0,children:r.map(c=>{var d,u,p,x;return e.jsx(vt,{sx:{padding:0},value:(u=(d=c.route)==null?void 0:d.split("/"))==null?void 0:u[2],label:e.jsxs($n,{to:c.path,children:[c.title,e.jsx(S,{condition:!!((p=c.menu.mode)!=null&&p.includes("enterprise")&&!((x=c.menu.mode)!=null&&x.includes("pro"))&&t()),show:e.jsx(Td,{children:e.jsx(va,{size:16})})})]})},c.route)})})}):null},tt="api/admin/banners",Yn=()=>{const{loading:t,makeRequest:s,createRequest:n,errors:o}=fe({propagateErrors:!0}),a=async u=>{const x=n(tt,{method:"POST",body:JSON.stringify(u)},"addBanner");return(await s(x.caller,x.id)).json()},i=async(u,p)=>{const g=n(`${tt}/${u}`,{method:"PUT",body:JSON.stringify(p)},"updateBanner");await s(g.caller,g.id)},r=async u=>{const x=n(`${tt}/${u}/on`,{method:"POST"},"enableBanner");await s(x.caller,x.id)},l=async u=>{const x=n(`${tt}/${u}/off`,{method:"POST"},"disableBanner");await s(x.caller,x.id)};return{addBanner:a,updateBanner:i,removeBanner:async u=>{const x=n(`${tt}/${u}`,{method:"DELETE"},"removeBanner");await s(x.caller,x.id)},toggleBanner:async(u,p)=>{p?await r(u):await l(u)},errors:o,loading:t}},Rd=m(q)(()=>({display:"flex",justifyContent:"center"})),Ed=({onEdit:t,onDelete:s})=>e.jsxs(Rd,{children:[e.jsx(ue,{"data-loading":!0,onClick:t,permission:M,tooltipProps:{title:"Edit banner"},children:e.jsx(Ve,{})}),e.jsx(ue,{"data-loading":!0,onClick:s,permission:M,tooltipProps:{title:"Remove banner"},children:e.jsx(Ae,{})})]}),Ad=({banner:t,open:s,setOpen:n,onConfirm:o})=>e.jsx(se,{title:"Delete banner?",open:s,primaryButtonText:"Delete banner",secondaryButtonText:"Cancel",onClick:()=>o(t),onClose:()=>{n(!1)},children:e.jsxs("p",{children:["You are about to delete banner: ",e.jsx("strong",{children:t==null?void 0:t.message})]})}),Dd=m("div")(({theme:t})=>({display:"flex",flexDirection:"column",gap:t.spacing(4)})),Id=m("div")(({theme:t})=>({display:"flex",flexDirection:"column",alignItems:"center",padding:t.spacing(1.5),gap:t.spacing(1.5),border:`1px solid ${t.palette.divider}`,borderRadius:t.shape.borderRadiusMedium})),Pd=m("p")(({theme:t})=>({fontSize:t.fontSizes.smallBody,color:t.palette.text.secondary})),Bd=m("div")(({theme:t})=>({background:t.palette.background.elevation1,padding:t.spacing(2,3),borderRadius:t.shape.borderRadiusLarge})),Mt=m("div")(({theme:t})=>({display:"flex",flexDirection:"column",gap:t.spacing(1.5)})),zt=m("p")(({theme:t})=>({fontWeight:t.fontWeight.bold})),ke=m("div")(({theme:t})=>({display:"flex",flexDirection:"column",gap:t.spacing(1)})),Re=m("p")(({theme:t})=>({display:"flex",color:t.palette.text.primary})),We=m(_e)({width:"100%"}),Vt=m("div")(({theme:t})=>({display:"flex",flexDirection:"column",padding:t.spacing(.5),gap:t.spacing(.5)})),Yt=m(bn)(({theme:t})=>({width:"100%",maxWidth:t.spacing(50)})),Ld=m(_)(({theme:t})=>({marginRight:"auto"})),Od=[{key:"info",label:"Information"},{key:"warning",label:"Warning"},{key:"error",label:"Error"},{key:"success",label:"Success"}],Ud=({enabled:t,message:s,variant:n,sticky:o,icon:a,link:i,linkText:r,dialogTitle:l,dialog:c,setEnabled:d,setMessage:u,setVariant:p,setSticky:x,setIcon:g,setLink:j,setLinkText:y,setDialogTitle:w,setDialog:C})=>{const[k,A]=h.useState(!1),[T,L]=h.useState(a===""?"Default":a==="none"?"None":"Custom"),[P,I]=h.useState(i===""?"None":i==="dialog"?"Dialog":"Link");return e.jsxs(Dd,{children:[e.jsxs(Id,{children:[e.jsx(Pd,{children:"Banner preview:"}),e.jsx(wn,{banner:{message:s||"*No message set. Please enter a message below.*",variant:n,sticky:!1,icon:a,link:i,linkText:r,dialogTitle:l,dialog:c},inline:!0})]}),e.jsx(Bd,{children:e.jsx(Ca,{checked:t,setChecked:d,children:"Banner status"})}),e.jsxs(Mt,{children:[e.jsx(zt,{children:"Configuration"}),e.jsxs(ke,{children:[e.jsx(Re,{children:"What type of banner is it?"}),e.jsx(Yt,{size:"small",value:n,onChange:v=>p(v),options:Od})]}),e.jsxs(ke,{children:[e.jsx(Re,{children:"What icon should be displayed on the banner?"}),e.jsx(Yt,{size:"small",value:T,onChange:v=>{L(v),g(v==="None"?"none":"")},options:["Default","Custom","None"].map(v=>({key:v,label:v}))})]}),e.jsx(S,{condition:T==="Custom",show:e.jsxs(ke,{children:[e.jsxs(Re,{children:["Which custom icon?",e.jsx(at,{htmlTooltip:!0,tooltip:e.jsxs(Vt,{children:[e.jsxs("p",{children:["Choose an icon from"," ",e.jsx("a",{href:"https://fonts.google.com/icons",target:"_blank",rel:"noreferrer",children:"Material Symbols"}),"."]}),e.jsx("p",{children:'For example, if you want to display the "Rocket Launch" icon, you can enter "rocket_launch" in the field below.'})]})})]}),e.jsx(We,{label:"Banner icon",value:a,onChange:v=>g(v.target.value),autoComplete:"off"})]})}),e.jsxs(ke,{children:[e.jsxs(Re,{children:["What is your banner message?",e.jsx(at,{htmlTooltip:!0,tooltip:e.jsx(Vt,{children:e.jsxs("p",{children:[e.jsx("a",{href:"https://www.markdownguide.org/basic-syntax/",target:"_blank",rel:"noreferrer",children:"Markdown"})," ","is supported."]})})})]}),e.jsx(We,{autoFocus:!0,label:"Banner message",multiline:!0,minRows:2,maxRows:6,value:s,onChange:v=>u(v.target.value),autoComplete:"off",required:!0})]})]}),e.jsxs(Mt,{children:[e.jsx(zt,{children:"Banner action"}),e.jsxs(ke,{children:[e.jsx(Re,{children:"What action should be available in the banner?"}),e.jsx(Yt,{size:"small",value:P,onChange:v=>{I(v),j(v==="Dialog"?"dialog":""),y(""),w(""),C("")},options:["None","Link","Dialog"].map(v=>({key:v,label:v}))})]}),e.jsx(S,{condition:P==="Link",show:e.jsxs(ke,{children:[e.jsx(Re,{children:"What URL should be opened?"}),e.jsx(We,{label:"URL",value:i,onChange:v=>j(v.target.value),onBlur:()=>{r||y(i)},autoComplete:"off"})]})}),e.jsx(S,{condition:P!=="None",show:e.jsxs(ke,{children:[e.jsx(Re,{children:"What is the action text?"}),e.jsx(We,{label:"Action text",value:r,onChange:v=>y(v.target.value),autoComplete:"off"})]})}),e.jsx(S,{condition:P==="Dialog",show:e.jsxs(e.Fragment,{children:[e.jsxs(ke,{children:[e.jsx(Re,{children:"What is the dialog title?"}),e.jsx(We,{label:"Dialog title",value:l,onChange:v=>w(v.target.value),autoComplete:"off"})]}),e.jsxs(ke,{children:[e.jsxs(Re,{children:["What is the dialog content?",e.jsx(at,{htmlTooltip:!0,tooltip:e.jsx(Vt,{children:e.jsxs("p",{children:[e.jsx("a",{href:"https://www.markdownguide.org/basic-syntax/",target:"_blank",rel:"noreferrer",children:"Markdown"})," ","is supported."]})})})]}),e.jsx(We,{label:"Dialog content",multiline:!0,minRows:4,value:c,onChange:v=>C(v.target.value),autoComplete:"off"})]}),e.jsx(Ld,{variant:"outlined",color:"primary",startIcon:e.jsx(wa,{}),onClick:()=>A(!0),children:"Preview dialog"}),e.jsx(Ta,{open:k,setOpen:A,title:l||r,children:c})]})})]}),e.jsxs(Mt,{children:[e.jsx(zt,{children:"Sticky banner"}),e.jsx(ce,{control:e.jsx(es,{checked:o,onChange:v=>x(v.target.checked)}),label:"Make the banner sticky on the screen when scrolling"})]})]})},$d=m("form")(()=>({display:"flex",flexDirection:"column",height:"100%"})),Nd=m("div")(({theme:t})=>({marginTop:"auto",display:"flex",justifyContent:"flex-end",paddingTop:t.spacing(4)})),Fd=m(_)(({theme:t})=>({marginLeft:t.spacing(3)})),Gd=({banner:t,open:s,setOpen:n})=>{const{refetch:o}=Tn(),{addBanner:a,updateBanner:i,loading:r}=Yn(),{setToastData:l,setToastApiError:c}=J(),{uiConfig:d}=N(),[u,p]=h.useState(!0),[x,g]=h.useState(""),[j,y]=h.useState("info"),[w,C]=h.useState(!1),[k,A]=h.useState(""),[T,L]=h.useState(""),[P,I]=h.useState(""),[v,F]=h.useState(""),[R,b]=h.useState("");h.useEffect(()=>{p((t==null?void 0:t.enabled)??!0),g((t==null?void 0:t.message)||""),y((t==null?void 0:t.variant)||"info"),C((t==null?void 0:t.sticky)||!1),A((t==null?void 0:t.icon)||""),L((t==null?void 0:t.link)||""),I((t==null?void 0:t.linkText)||""),F((t==null?void 0:t.dialogTitle)||""),b((t==null?void 0:t.dialog)||"")},[s,t]);const D=t!==void 0,W=D?"Edit banner":"New banner",E=x.length,$={enabled:u,variant:j,icon:k,message:x,link:T,linkText:P,dialogTitle:v,dialog:R,sticky:w},V=()=>`curl --location --request ${D?"PUT":"POST"} '${d.unleashUrl}/api/admin/banners${D?`/${t.id}`:""}' \\
36
+ --header 'Authorization: INSERT_API_KEY' \\
37
+ --header 'Content-Type: application/json' \\
38
+ --data-raw '${JSON.stringify($,void 0,2)}'`,ne=async oe=>{if(oe.preventDefault(),!!E)try{D?await i(t.id,$):await a($),l({title:`Banner ${D?"updated":"added"} successfully`,type:"success"}),o(),n(!1)}catch(H){c(z(H))}};return e.jsx(Ct,{open:s,onClose:()=>{n(!1)},label:W,children:e.jsx(Ce,{loading:r,modal:!0,title:W,description:"Banners allow you to display messages to other users inside your Unleash instance.",documentationLink:"https://docs.getunleash.io/reference/banners",documentationLinkLabel:"Banners documentation",formatApiCode:V,children:e.jsxs($d,{onSubmit:ne,children:[e.jsx(Ud,{enabled:u,message:x,variant:j,sticky:w,icon:k,link:T,linkText:P,dialogTitle:v,dialog:R,setEnabled:p,setMessage:g,setVariant:y,setSticky:C,setIcon:A,setLink:L,setLinkText:I,setDialogTitle:F,setDialog:b}),e.jsxs(Nd,{children:[e.jsxs(_,{type:"submit",variant:"contained",color:"primary",disabled:!E,children:[D?"Save":"Add"," banner"]}),e.jsx(Fd,{onClick:()=>{n(!1)},children:"Cancel"})]})]})})})},qd=()=>{const{setToastData:t,setToastApiError:s}=J(),{banners:n,refetch:o,loading:a}=Tn(),{toggleBanner:i,removeBanner:r}=Yn(),[l,c]=h.useState(""),[d,u]=h.useState(!1),[p,x]=h.useState(!1),[g,j]=h.useState(),y=async(R,b)=>{try{await i(R.id,b),t({title:`"${R.message}" has been ${b?"enabled":"disabled"}`,type:"success"}),o()}catch(D){s(z(D))}},w=async R=>{try{await r(R.id),t({title:`"${R.message}" has been deleted`,type:"success"}),o(),x(!1)}catch(b){s(z(b))}},C=he(De.breakpoints.down("md")),k=h.useMemo(()=>[{Header:"Banner",accessor:"message",Cell:({row:{original:R}})=>e.jsx(wn,{banner:{...R,sticky:!1},inline:!0,maxHeight:42}),disableSortBy:!0,minWidth:200,searchable:!0},{Header:"Created",accessor:"createdAt",Cell:xe,width:120,maxWidth:120},{Header:"Enabled",accessor:"enabled",Cell:({row:{original:R}})=>e.jsx(ka,{checked:R.enabled,setChecked:b=>y(R,b)}),sortType:"boolean",width:90,maxWidth:90},{Header:"Actions",id:"Actions",align:"center",Cell:({row:{original:R}})=>e.jsx(Ed,{onEdit:()=>{j(R),u(!0)},onDelete:()=>{j(R),x(!0)}}),width:100,disableSortBy:!0}],[]),[A]=h.useState({sortBy:[{id:"createdAt",desc:!0}]}),{data:T,getSearchText:L}=Ke(k,l,n),{headerGroups:P,rows:I,prepareRow:v,setHiddenColumns:F}=U.useTable({columns:k,data:T,initialState:A,sortTypes:pe,autoResetHiddenColumns:!1,autoResetSortBy:!1,disableSortRemove:!0,disableMultiSort:!0,defaultColumn:{Cell:te}},U.useSortBy,U.useFlexLayout);return Ye([{condition:C,columns:["createdAt"]}],F,k),e.jsxs(Q,{isLoading:a,header:e.jsx(X,{title:`Banners (${I.length})`,actions:e.jsxs(e.Fragment,{children:[e.jsx(S,{condition:!C,show:e.jsxs(e.Fragment,{children:[e.jsx(le,{initialValue:l,onChange:c}),e.jsx(X.Divider,{})]})}),e.jsx(_,{variant:"contained",color:"primary",onClick:()=>{j(void 0),u(!0)},children:"New banner"})]}),children:e.jsx(S,{condition:C,show:e.jsx(le,{initialValue:l,onChange:c})})}),children:[e.jsx(qe,{value:L(l),children:e.jsx(ye,{rows:I,headerGroups:P,prepareRow:v})}),e.jsx(S,{condition:I.length===0,show:e.jsx(S,{condition:(l==null?void 0:l.length)>0,show:e.jsxs(de,{children:["No banners found matching “",l,"”"]}),elseShow:e.jsx(de,{children:"No banners available. Get started by adding one."})})}),e.jsx(Gd,{banner:g,open:d,setOpen:u}),e.jsx(Ad,{banner:g,open:p,setOpen:x,onConfirm:w})]})},_d=()=>{const{isEnterprise:t}=N();return t()?e.jsx("div",{children:e.jsx(ge,{permissions:M,children:e.jsx(qd,{})})}):e.jsx(rt,{feature:"banners",page:!0})},Wd=async(t,s)=>{if(t){if(s){const n=await s.json();throw t({message:n.message}),new Error(n.message)}throw new Error("Did not receive a response from the server.")}},Hd=()=>{const{makeRequest:t,createRequest:s,errors:n,loading:o}=fe({propagateErrors:!0,handleBadRequest:Wd});return{updateLicenseKey:async i=>{const l=s("api/admin/license",{method:"POST",body:JSON.stringify({token:i})});await t(l.caller,l.id)},errors:n,loading:o}},Md=m(q)(({theme:t})=>({display:"grid",gap:t.spacing(4)})),st=m("div")(()=>({display:"table-row"})),nt=m("p")(({theme:t})=>({display:"table-cell",fontWeight:t.fontWeight.bold,paddingTop:t.spacing(2)})),ot=m("p")(({theme:t})=>({display:"table-cell",paddingTop:t.spacing(2),paddingLeft:t.spacing(4)})),zd=()=>{const{setToastData:t,setToastApiError:s}=J(),{license:n,error:o,refetchLicense:a}=Ra(),{reCheckLicense:i}=Ea(),{loading:r}=N(),{locationSettings:l}=on(),[c,d]=h.useState(""),{updateLicenseKey:u}=Hd(),p=g=>{d(g.target.value.trim())};if(r||!n)return null;const x=async g=>{g.preventDefault();try{await u(c),t({title:"License key updated",type:"success"}),a(),i()}catch(j){s(z(j))}};return e.jsx(Q,{header:e.jsx(X,{title:"Unleash Enterprise License"}),children:e.jsxs(Md,{children:[e.jsx(S,{condition:!!n.token,show:e.jsxs("div",{children:[e.jsxs(st,{children:[e.jsx(nt,{children:"Customer"}),e.jsx(ot,{children:n.customer})]}),e.jsxs(st,{children:[e.jsx(nt,{children:"Instance Name"}),e.jsx(ot,{children:n.instanceName})]}),e.jsxs(st,{children:[e.jsx(nt,{children:"Plan"}),e.jsx(ot,{children:n.plan})]}),e.jsxs(st,{children:[e.jsx(nt,{children:"Seats"}),e.jsx(ot,{children:n.seats})]}),e.jsxs(st,{children:[e.jsx(nt,{children:"Expire at"}),e.jsx(ot,{children:ln(n.expireAt,l.locale)})]})]}),elseShow:e.jsx("p",{children:"You do not have a registered Unleash Enterprise License."})}),e.jsxs("form",{onSubmit:x,children:[e.jsx(Z,{onChange:p,label:"New license key",name:"licenseKey",value:c,style:{width:"100%"},variant:"outlined",size:"small",multiline:!0,rows:6,required:!0}),e.jsx(f,{container:!0,spacing:3,marginTop:2,children:e.jsxs(f,{item:!0,md:5,children:[e.jsx(_,{variant:"contained",color:"primary",type:"submit",disabled:r,children:"Update license key"})," ",e.jsx("p",{children:e.jsx("small",{style:{color:"red"},children:o==null?void 0:o.message})})]})})]})]})})},Kd=()=>e.jsxs(e.Fragment,{children:[e.jsx(kd,{}),e.jsxs(lt,{children:[e.jsx(G,{index:!0,element:e.jsx(Cd,{})}),e.jsx(G,{path:"users/*",element:e.jsx(vd,{})}),e.jsx(G,{path:"api",element:e.jsx(Ya,{})}),e.jsx(G,{path:"api/create-token",element:e.jsx(Ka,{})}),e.jsx(G,{path:"service-accounts",element:e.jsx(qc,{})}),e.jsx(G,{path:"create-user",element:e.jsx(nd,{})}),e.jsx(G,{path:"invite-link",element:e.jsx(ad,{})}),e.jsx(G,{path:"groups/*",element:e.jsx(el,{})}),e.jsx(G,{path:"roles/*",element:e.jsx(yc,{})}),e.jsx(G,{path:"instance",element:e.jsx(ol,{})}),e.jsx(G,{path:"network/*",element:e.jsx(Nl,{})}),e.jsx(G,{path:"maintenance",element:e.jsx(Il,{})}),e.jsx(G,{path:"banners",element:e.jsx(_d,{})}),e.jsx(G,{path:"license",element:e.jsx(zd,{})}),e.jsx(G,{path:"cors",element:e.jsx(Ji,{})}),e.jsx(G,{path:"auth",element:e.jsx(di,{})}),e.jsx(G,{path:"admin-invoices",element:e.jsx(Wi,{})}),e.jsx(G,{path:"billing",element:e.jsx(Fi,{})}),e.jsx(G,{path:"instance-privacy",element:e.jsx(Sl,{})}),e.jsx(G,{path:"*",element:e.jsx(vn,{})})]})]});export{Kd as default};
39
+ function __vite__mapDeps(indexes) {
40
+ if (!__vite__mapDeps.viteFileDeps) {
41
+ __vite__mapDeps.viteFileDeps = []
42
+ }
43
+ return indexes.map((i) => __vite__mapDeps.viteFileDeps[i])
44
+ }