unleash-server 5.7.2 → 5.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/addons/datadog-definition.js +1 -1
- package/dist/lib/addons/datadog-definition.js.map +1 -1
- package/dist/lib/addons/datadog.test.js +7 -0
- package/dist/lib/addons/datadog.test.js.map +1 -1
- package/dist/lib/addons/feature-event-formatter-md.test.js +16 -0
- package/dist/lib/addons/feature-event-formatter-md.test.js.map +1 -1
- package/dist/lib/addons/slack-app.test.js +2 -0
- package/dist/lib/addons/slack-app.test.js.map +1 -1
- package/dist/lib/addons/slack.test.js +9 -0
- package/dist/lib/addons/slack.test.js.map +1 -1
- package/dist/lib/addons/teams.test.js +6 -0
- package/dist/lib/addons/teams.test.js.map +1 -1
- package/dist/lib/addons/webhook.test.js +5 -0
- package/dist/lib/addons/webhook.test.js.map +1 -1
- package/dist/lib/app.js +4 -3
- package/dist/lib/app.js.map +1 -1
- package/dist/lib/app.test.js +38 -0
- package/dist/lib/app.test.js.map +1 -1
- package/dist/lib/create-config.d.ts.map +1 -1
- package/dist/lib/create-config.js +3 -0
- package/dist/lib/create-config.js.map +1 -1
- package/dist/lib/db/access-store.d.ts.map +1 -1
- package/dist/lib/db/access-store.js +26 -2
- package/dist/lib/db/access-store.js.map +1 -1
- package/dist/lib/db/access-store.test.js +13 -0
- package/dist/lib/db/access-store.test.js.map +1 -1
- package/dist/lib/db/account-store.d.ts.map +1 -1
- package/dist/lib/db/account-store.js +1 -0
- package/dist/lib/db/account-store.js.map +1 -1
- package/dist/lib/db/event-store.d.ts +1 -0
- package/dist/lib/db/event-store.d.ts.map +1 -1
- package/dist/lib/db/event-store.js +3 -0
- package/dist/lib/db/event-store.js.map +1 -1
- package/dist/lib/db/feature-strategy-store.test.js +3 -0
- package/dist/lib/db/feature-strategy-store.test.js.map +1 -1
- package/dist/lib/db/feature-tag-store.d.ts +6 -5
- package/dist/lib/db/feature-tag-store.d.ts.map +1 -1
- package/dist/lib/db/feature-tag-store.js +15 -5
- package/dist/lib/db/feature-tag-store.js.map +1 -1
- package/dist/lib/db/index.d.ts.map +1 -1
- package/dist/lib/db/index.js +3 -1
- package/dist/lib/db/index.js.map +1 -1
- package/dist/lib/db/user-store.d.ts.map +1 -1
- package/dist/lib/db/user-store.js +1 -0
- package/dist/lib/db/user-store.js.map +1 -1
- package/dist/lib/features/access/createAccessService.js +2 -2
- package/dist/lib/features/access/createAccessService.js.map +1 -1
- package/dist/lib/features/change-request-segment-usage-service/change-request-segment-usage-read-model.test.js +1 -0
- package/dist/lib/features/change-request-segment-usage-service/change-request-segment-usage-read-model.test.js.map +1 -1
- package/dist/lib/features/dependent-features/dependent-features-service.d.ts +4 -4
- package/dist/lib/features/dependent-features/dependent-features-service.d.ts.map +1 -1
- package/dist/lib/features/dependent-features/dependent-features-service.js +11 -8
- package/dist/lib/features/dependent-features/dependent-features-service.js.map +1 -1
- package/dist/lib/features/export-import-toggles/export-import-controller.d.ts.map +1 -1
- package/dist/lib/features/export-import-toggles/export-import-controller.js +1 -1
- package/dist/lib/features/export-import-toggles/export-import-controller.js.map +1 -1
- package/dist/lib/features/export-import-toggles/export-import-service.d.ts +2 -2
- package/dist/lib/features/export-import-toggles/export-import-service.d.ts.map +1 -1
- package/dist/lib/features/export-import-toggles/export-import-service.js +27 -17
- package/dist/lib/features/export-import-toggles/export-import-service.js.map +1 -1
- package/dist/lib/features/export-import-toggles/export-import.e2e.test.js +35 -5
- package/dist/lib/features/export-import-toggles/export-import.e2e.test.js.map +1 -1
- package/dist/lib/features/feature-search/createFeatureSearchService.d.ts.map +1 -1
- package/dist/lib/features/feature-search/createFeatureSearchService.js +6 -6
- package/dist/lib/features/feature-search/createFeatureSearchService.js.map +1 -1
- package/dist/lib/features/feature-search/fake-feature-search-store.d.ts +10 -0
- package/dist/lib/features/feature-search/fake-feature-search-store.d.ts.map +1 -0
- package/dist/lib/features/feature-search/fake-feature-search-store.js +9 -0
- package/dist/lib/features/feature-search/fake-feature-search-store.js.map +1 -0
- package/dist/lib/features/feature-search/feature-search-controller.d.ts.map +1 -1
- package/dist/lib/features/feature-search/feature-search-controller.js +4 -3
- package/dist/lib/features/feature-search/feature-search-controller.js.map +1 -1
- package/dist/lib/features/feature-search/feature-search-service.d.ts +2 -2
- package/dist/lib/features/feature-search/feature-search-service.d.ts.map +1 -1
- package/dist/lib/features/feature-search/feature-search-service.js +9 -4
- package/dist/lib/features/feature-search/feature-search-service.js.map +1 -1
- package/dist/lib/features/feature-search/feature-search-store-type.d.ts +9 -0
- package/dist/lib/features/feature-search/feature-search-store-type.d.ts.map +1 -0
- package/dist/lib/features/feature-search/feature-search-store-type.js +3 -0
- package/dist/lib/features/feature-search/feature-search-store-type.js.map +1 -0
- package/dist/lib/features/feature-search/feature-search-store.d.ts +24 -0
- package/dist/lib/features/feature-search/feature-search-store.d.ts.map +1 -0
- package/dist/lib/features/feature-search/feature-search-store.js +323 -0
- package/dist/lib/features/feature-search/feature-search-store.js.map +1 -0
- package/dist/lib/features/feature-search/feature.search.e2e.test.js +101 -6
- package/dist/lib/features/feature-search/feature.search.e2e.test.js.map +1 -1
- package/dist/lib/features/feature-toggle/archive-feature-toggle-controller.d.ts.map +1 -1
- package/dist/lib/features/feature-toggle/archive-feature-toggle-controller.js +2 -2
- package/dist/lib/features/feature-toggle/archive-feature-toggle-controller.js.map +1 -1
- package/dist/lib/features/feature-toggle/createFeatureToggleService.js +2 -2
- package/dist/lib/features/feature-toggle/createFeatureToggleService.js.map +1 -1
- package/dist/lib/features/feature-toggle/fakes/fake-feature-strategies-store.d.ts +1 -5
- package/dist/lib/features/feature-toggle/fakes/fake-feature-strategies-store.d.ts.map +1 -1
- package/dist/lib/features/feature-toggle/fakes/fake-feature-strategies-store.js +0 -3
- package/dist/lib/features/feature-toggle/fakes/fake-feature-strategies-store.js.map +1 -1
- package/dist/lib/features/feature-toggle/fakes/fake-feature-toggle-store.d.ts +5 -2
- package/dist/lib/features/feature-toggle/fakes/fake-feature-toggle-store.d.ts.map +1 -1
- package/dist/lib/features/feature-toggle/fakes/fake-feature-toggle-store.js +3 -0
- package/dist/lib/features/feature-toggle/fakes/fake-feature-toggle-store.js.map +1 -1
- package/dist/lib/features/feature-toggle/feature-toggle-controller.d.ts.map +1 -1
- package/dist/lib/features/feature-toggle/feature-toggle-controller.js +7 -7
- package/dist/lib/features/feature-toggle/feature-toggle-controller.js.map +1 -1
- package/dist/lib/features/feature-toggle/feature-toggle-service.d.ts +25 -23
- package/dist/lib/features/feature-toggle/feature-toggle-service.d.ts.map +1 -1
- package/dist/lib/features/feature-toggle/feature-toggle-service.js +79 -51
- package/dist/lib/features/feature-toggle/feature-toggle-service.js.map +1 -1
- package/dist/lib/features/feature-toggle/feature-toggle-store.d.ts +10 -3
- package/dist/lib/features/feature-toggle/feature-toggle-store.d.ts.map +1 -1
- package/dist/lib/features/feature-toggle/feature-toggle-store.js +44 -13
- package/dist/lib/features/feature-toggle/feature-toggle-store.js.map +1 -1
- package/dist/lib/features/feature-toggle/feature-toggle-strategies-store.d.ts +0 -5
- package/dist/lib/features/feature-toggle/feature-toggle-strategies-store.d.ts.map +1 -1
- package/dist/lib/features/feature-toggle/feature-toggle-strategies-store.js +2 -201
- package/dist/lib/features/feature-toggle/feature-toggle-strategies-store.js.map +1 -1
- package/dist/lib/features/feature-toggle/legacy/feature-toggle-legacy-controller.d.ts.map +1 -1
- package/dist/lib/features/feature-toggle/legacy/feature-toggle-legacy-controller.js +20 -16
- package/dist/lib/features/feature-toggle/legacy/feature-toggle-legacy-controller.js.map +1 -1
- package/dist/lib/features/feature-toggle/tests/archive-feature-toggles.e2e.test.js +4 -0
- package/dist/lib/features/feature-toggle/tests/archive-feature-toggles.e2e.test.js.map +1 -1
- package/dist/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.js +24 -23
- package/dist/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.js.map +1 -1
- package/dist/lib/features/feature-toggle/tests/feature-toggle-store.e2e.test.js +17 -3
- package/dist/lib/features/feature-toggle/tests/feature-toggle-store.e2e.test.js.map +1 -1
- package/dist/lib/features/feature-toggle/tests/feature-toggle-strategies-store.e2e.test.js +17 -3
- package/dist/lib/features/feature-toggle/tests/feature-toggle-strategies-store.e2e.test.js.map +1 -1
- package/dist/lib/features/feature-toggle/tests/feature-toggles.auth.e2e.test.js +9 -3
- package/dist/lib/features/feature-toggle/tests/feature-toggles.auth.e2e.test.js.map +1 -1
- package/dist/lib/features/feature-toggle/tests/feature-toggles.e2e.test.js +21 -7
- package/dist/lib/features/feature-toggle/tests/feature-toggles.e2e.test.js.map +1 -1
- package/dist/lib/features/feature-toggle/types/feature-toggle-store-type.d.ts +5 -2
- package/dist/lib/features/feature-toggle/types/feature-toggle-store-type.d.ts.map +1 -1
- package/dist/lib/features/feature-toggle/types/feature-toggle-strategies-store-type.d.ts +2 -5
- package/dist/lib/features/feature-toggle/types/feature-toggle-strategies-store-type.d.ts.map +1 -1
- package/dist/lib/features/index.d.ts +1 -0
- package/dist/lib/features/index.d.ts.map +1 -1
- package/dist/lib/features/index.js +1 -0
- package/dist/lib/features/index.js.map +1 -1
- package/dist/lib/features/maintenance/maintenance-controller.d.ts.map +1 -1
- package/dist/lib/features/maintenance/maintenance-controller.js +1 -1
- package/dist/lib/features/maintenance/maintenance-controller.js.map +1 -1
- package/dist/lib/features/maintenance/maintenance-service.d.ts +1 -1
- package/dist/lib/features/maintenance/maintenance-service.d.ts.map +1 -1
- package/dist/lib/features/maintenance/maintenance-service.js +2 -2
- package/dist/lib/features/maintenance/maintenance-service.js.map +1 -1
- package/dist/lib/features/maintenance/maintenance-service.test.js +1 -1
- package/dist/lib/features/maintenance/maintenance-service.test.js.map +1 -1
- package/dist/lib/features/playground/advanced-playground.test.js +0 -1
- package/dist/lib/features/playground/advanced-playground.test.js.map +1 -1
- package/dist/lib/features/playground/playground-service.d.ts.map +1 -1
- package/dist/lib/features/playground/playground-service.js +9 -11
- package/dist/lib/features/playground/playground-service.js.map +1 -1
- package/dist/lib/features/private-project/fakePrivateProjectChecker.d.ts.map +1 -1
- package/dist/lib/features/private-project/fakePrivateProjectChecker.js +2 -1
- package/dist/lib/features/private-project/fakePrivateProjectChecker.js.map +1 -1
- package/dist/lib/features/project/createProjectService.js +2 -2
- package/dist/lib/features/project/createProjectService.js.map +1 -1
- package/dist/lib/features/project-environments/createEnvironmentService.d.ts +6 -0
- package/dist/lib/features/project-environments/createEnvironmentService.d.ts.map +1 -0
- package/dist/lib/features/project-environments/createEnvironmentService.js +60 -0
- package/dist/lib/features/project-environments/createEnvironmentService.js.map +1 -0
- package/dist/lib/{services → features/project-environments}/environment-service.d.ts +6 -6
- package/dist/lib/features/project-environments/environment-service.d.ts.map +1 -0
- package/dist/lib/{services → features/project-environments}/environment-service.js +13 -10
- package/dist/lib/features/project-environments/environment-service.js.map +1 -0
- package/dist/lib/features/project-environments/environment-service.test.d.ts.map +1 -0
- package/dist/{test/e2e/services → lib/features/project-environments}/environment-service.test.js +24 -18
- package/dist/lib/features/project-environments/environment-service.test.js.map +1 -0
- package/dist/lib/{types/stores/environment-store.d.ts → features/project-environments/environment-store-type.d.ts} +3 -3
- package/dist/lib/features/project-environments/environment-store-type.d.ts.map +1 -0
- package/dist/lib/{types/stores/environment-store.js → features/project-environments/environment-store-type.js} +1 -1
- package/dist/lib/features/project-environments/environment-store-type.js.map +1 -0
- package/dist/lib/{db → features/project-environments}/environment-store.d.ts +4 -4
- package/dist/lib/features/project-environments/environment-store.d.ts.map +1 -0
- package/dist/lib/{db → features/project-environments}/environment-store.js +4 -4
- package/dist/lib/features/project-environments/environment-store.js.map +1 -0
- package/dist/lib/{routes/admin-api/project → features/project-environments}/environments.d.ts +5 -5
- package/dist/lib/features/project-environments/environments.d.ts.map +1 -0
- package/dist/lib/features/project-environments/environments.e2e.test.d.ts.map +1 -0
- package/dist/{test/e2e/api/admin/project → lib/features/project-environments}/environments.e2e.test.js +4 -4
- package/dist/lib/features/project-environments/environments.e2e.test.js.map +1 -0
- package/dist/lib/{routes/admin-api/project → features/project-environments}/environments.js +9 -9
- package/dist/lib/features/project-environments/environments.js.map +1 -0
- package/dist/{test/fixtures → lib/features/project-environments}/fake-environment-store.d.ts +2 -2
- package/dist/lib/features/project-environments/fake-environment-store.d.ts.map +1 -0
- package/dist/{test/fixtures → lib/features/project-environments}/fake-environment-store.js +1 -1
- package/dist/lib/features/project-environments/fake-environment-store.js.map +1 -0
- package/dist/lib/features/scheduler/scheduler-service.test.js +1 -1
- package/dist/lib/features/scheduler/scheduler-service.test.js.map +1 -1
- package/dist/lib/features/segment/segment-controller.d.ts +1 -1
- package/dist/lib/features/segment/segment-controller.d.ts.map +1 -1
- package/dist/lib/features/segment/segment-controller.js +1 -1
- package/dist/lib/features/segment/segment-controller.js.map +1 -1
- package/dist/lib/features/tag-type/tag-type-service.d.ts +3 -3
- package/dist/lib/features/tag-type/tag-type-service.d.ts.map +1 -1
- package/dist/lib/features/tag-type/tag-type-service.js +10 -6
- package/dist/lib/features/tag-type/tag-type-service.js.map +1 -1
- package/dist/lib/features/tag-type/tag-type.d.ts.map +1 -1
- package/dist/lib/features/tag-type/tag-type.js +3 -3
- package/dist/lib/features/tag-type/tag-type.js.map +1 -1
- package/dist/lib/metrics.d.ts +2 -0
- package/dist/lib/metrics.d.ts.map +1 -1
- package/dist/lib/metrics.js +42 -16
- package/dist/lib/metrics.js.map +1 -1
- package/dist/lib/metrics.test.js +25 -1
- package/dist/lib/metrics.test.js.map +1 -1
- package/dist/lib/middleware/api-token-middleware.d.ts.map +1 -1
- package/dist/lib/middleware/api-token-middleware.js +6 -1
- package/dist/lib/middleware/api-token-middleware.js.map +1 -1
- package/dist/lib/middleware/api-token-middleware.test.js +25 -0
- package/dist/lib/middleware/api-token-middleware.test.js.map +1 -1
- package/dist/lib/middleware/cors-origin-middleware.d.ts.map +1 -1
- package/dist/lib/middleware/cors-origin-middleware.js +5 -1
- package/dist/lib/middleware/cors-origin-middleware.js.map +1 -1
- package/dist/lib/middleware/cors-origin-middleware.test.js +7 -6
- package/dist/lib/middleware/cors-origin-middleware.test.js.map +1 -1
- package/dist/lib/middleware/secure-headers.d.ts.map +1 -1
- package/dist/lib/middleware/secure-headers.js +49 -1
- package/dist/lib/middleware/secure-headers.js.map +1 -1
- package/dist/lib/openapi/index.d.ts.map +1 -1
- package/dist/lib/openapi/index.js +6 -3
- package/dist/lib/openapi/index.js.map +1 -1
- package/dist/lib/openapi/spec/create-user-response-schema.d.ts +1 -0
- package/dist/lib/openapi/spec/create-user-response-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/deprecated-project-overview-schema.d.ts +2563 -0
- package/dist/lib/openapi/spec/deprecated-project-overview-schema.d.ts.map +1 -0
- package/dist/lib/openapi/spec/deprecated-project-overview-schema.js +143 -0
- package/dist/lib/openapi/spec/deprecated-project-overview-schema.js.map +1 -0
- package/dist/lib/openapi/spec/deprecated-project-overview-schema.test.d.ts +2 -0
- package/dist/lib/openapi/spec/deprecated-project-overview-schema.test.d.ts.map +1 -0
- package/dist/lib/openapi/spec/deprecated-project-overview-schema.test.js +17 -0
- package/dist/lib/openapi/spec/deprecated-project-overview-schema.test.js.map +1 -0
- package/dist/lib/openapi/spec/event-schema.d.ts +7 -1
- package/dist/lib/openapi/spec/event-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/event-schema.js +6 -0
- package/dist/lib/openapi/spec/event-schema.js.map +1 -1
- package/dist/lib/openapi/spec/events-schema.d.ts +7 -1
- package/dist/lib/openapi/spec/events-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/export-query-schema.d.ts +22 -3
- package/dist/lib/openapi/spec/export-query-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/export-query-schema.js +14 -3
- package/dist/lib/openapi/spec/export-query-schema.js.map +1 -1
- package/dist/lib/openapi/spec/export-result-schema.d.ts +6 -0
- package/dist/lib/openapi/spec/export-result-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/feature-events-schema.d.ts +7 -1
- package/dist/lib/openapi/spec/feature-events-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/feature-search-query-parameters.d.ts +15 -6
- package/dist/lib/openapi/spec/feature-search-query-parameters.d.ts.map +1 -1
- package/dist/lib/openapi/spec/feature-search-query-parameters.js +16 -6
- package/dist/lib/openapi/spec/feature-search-query-parameters.js.map +1 -1
- package/dist/lib/openapi/spec/feature-search-response-schema.d.ts +1016 -0
- package/dist/lib/openapi/spec/feature-search-response-schema.d.ts.map +1 -0
- package/dist/lib/openapi/spec/feature-search-response-schema.js +177 -0
- package/dist/lib/openapi/spec/feature-search-response-schema.js.map +1 -0
- package/dist/lib/openapi/spec/feature-tag-schema.d.ts +6 -0
- package/dist/lib/openapi/spec/feature-tag-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/feature-tag-schema.js +6 -0
- package/dist/lib/openapi/spec/feature-tag-schema.js.map +1 -1
- package/dist/lib/openapi/spec/feature-type-count-schema.d.ts +25 -0
- package/dist/lib/openapi/spec/feature-type-count-schema.d.ts.map +1 -0
- package/dist/lib/openapi/spec/feature-type-count-schema.js +26 -0
- package/dist/lib/openapi/spec/feature-type-count-schema.js.map +1 -0
- package/dist/lib/openapi/spec/feature-type-count-schema.test.d.ts +2 -0
- package/dist/lib/openapi/spec/feature-type-count-schema.test.d.ts.map +1 -0
- package/dist/lib/openapi/spec/feature-type-count-schema.test.js +12 -0
- package/dist/lib/openapi/spec/feature-type-count-schema.test.js.map +1 -0
- package/dist/lib/openapi/spec/group-schema.d.ts +2 -0
- package/dist/lib/openapi/spec/group-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/group-user-model-schema.d.ts +1 -0
- package/dist/lib/openapi/spec/group-user-model-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/groups-schema.d.ts +4 -0
- package/dist/lib/openapi/spec/groups-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/import-toggles-schema.d.ts +12 -0
- package/dist/lib/openapi/spec/import-toggles-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/index.d.ts +3 -0
- package/dist/lib/openapi/spec/index.d.ts.map +1 -1
- package/dist/lib/openapi/spec/index.js +3 -0
- package/dist/lib/openapi/spec/index.js.map +1 -1
- package/dist/lib/openapi/spec/me-schema.d.ts +1 -0
- package/dist/lib/openapi/spec/me-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/project-overview-schema.d.ts +26 -4
- package/dist/lib/openapi/spec/project-overview-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/project-overview-schema.js +6 -4
- package/dist/lib/openapi/spec/project-overview-schema.js.map +1 -1
- package/dist/lib/openapi/spec/project-overview-schema.test.js +7 -1
- package/dist/lib/openapi/spec/project-overview-schema.test.js.map +1 -1
- package/dist/lib/openapi/spec/public-signup-token-schema.d.ts +1 -0
- package/dist/lib/openapi/spec/public-signup-token-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/public-signup-tokens-schema.d.ts +2 -0
- package/dist/lib/openapi/spec/public-signup-tokens-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/search-events-schema.d.ts +1 -1
- package/dist/lib/openapi/spec/search-features-schema.d.ts +12 -4
- package/dist/lib/openapi/spec/search-features-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/search-features-schema.js +4 -4
- package/dist/lib/openapi/spec/search-features-schema.js.map +1 -1
- package/dist/lib/openapi/spec/{admin-strategies-schema.d.ts → segment-strategies-schema.d.ts} +37 -1
- package/dist/lib/openapi/spec/segment-strategies-schema.d.ts.map +1 -0
- package/dist/lib/openapi/spec/{admin-strategies-schema.js → segment-strategies-schema.js} +42 -1
- package/dist/lib/openapi/spec/segment-strategies-schema.js.map +1 -0
- package/dist/lib/openapi/spec/segment-strategies-schema.test.d.ts +2 -0
- package/dist/lib/openapi/spec/segment-strategies-schema.test.d.ts.map +1 -0
- package/dist/lib/openapi/spec/{admin-strategies-schema.test.js → segment-strategies-schema.test.js} +1 -1
- package/dist/lib/openapi/spec/segment-strategies-schema.test.js.map +1 -0
- package/dist/lib/openapi/spec/state-schema.d.ts +6 -0
- package/dist/lib/openapi/spec/state-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/ui-config-schema.d.ts +5 -0
- package/dist/lib/openapi/spec/ui-config-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/ui-config-schema.js +5 -0
- package/dist/lib/openapi/spec/ui-config-schema.js.map +1 -1
- package/dist/lib/openapi/spec/user-schema.d.ts +1 -0
- package/dist/lib/openapi/spec/user-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/user-schema.js +1 -0
- package/dist/lib/openapi/spec/user-schema.js.map +1 -1
- package/dist/lib/openapi/spec/users-groups-base-schema.d.ts +4 -0
- package/dist/lib/openapi/spec/users-groups-base-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/users-schema.d.ts +1 -0
- package/dist/lib/openapi/spec/users-schema.d.ts.map +1 -1
- package/dist/lib/openapi/spec/users-search-schema.d.ts +1 -0
- package/dist/lib/openapi/spec/users-search-schema.d.ts.map +1 -1
- package/dist/lib/openapi/util/create-request-schema.d.ts.map +1 -1
- package/dist/lib/openapi/util/create-request-schema.js +3 -1
- package/dist/lib/openapi/util/create-request-schema.js.map +1 -1
- package/dist/lib/openapi/util/create-response-schema.d.ts.map +1 -1
- package/dist/lib/openapi/util/create-response-schema.js +6 -2
- package/dist/lib/openapi/util/create-response-schema.js.map +1 -1
- package/dist/lib/routes/admin-api/addon.d.ts.map +1 -1
- package/dist/lib/routes/admin-api/addon.js +3 -3
- package/dist/lib/routes/admin-api/addon.js.map +1 -1
- package/dist/lib/routes/admin-api/api-token.d.ts.map +1 -1
- package/dist/lib/routes/admin-api/api-token.js +2 -2
- package/dist/lib/routes/admin-api/api-token.js.map +1 -1
- package/dist/lib/routes/admin-api/config.d.ts.map +1 -1
- package/dist/lib/routes/admin-api/config.js +2 -1
- package/dist/lib/routes/admin-api/config.js.map +1 -1
- package/dist/lib/routes/admin-api/context.d.ts.map +1 -1
- package/dist/lib/routes/admin-api/context.js +3 -3
- package/dist/lib/routes/admin-api/context.js.map +1 -1
- package/dist/lib/routes/admin-api/events.test.js +13 -5
- package/dist/lib/routes/admin-api/events.test.js.map +1 -1
- package/dist/lib/routes/admin-api/index.js +2 -2
- package/dist/lib/routes/admin-api/index.js.map +1 -1
- package/dist/lib/routes/admin-api/project/api-token.d.ts.map +1 -1
- package/dist/lib/routes/admin-api/project/api-token.js +1 -1
- package/dist/lib/routes/admin-api/project/api-token.js.map +1 -1
- package/dist/lib/routes/admin-api/project/{index.d.ts → project-api.d.ts} +4 -2
- package/dist/lib/routes/admin-api/project/project-api.d.ts.map +1 -0
- package/dist/lib/routes/admin-api/project/{index.js → project-api.js} +29 -3
- package/dist/lib/routes/admin-api/project/project-api.js.map +1 -0
- package/dist/lib/routes/admin-api/project/project-archive.d.ts.map +1 -1
- package/dist/lib/routes/admin-api/project/project-archive.js +2 -2
- package/dist/lib/routes/admin-api/project/project-archive.js.map +1 -1
- package/dist/lib/routes/admin-api/project/variants.d.ts.map +1 -1
- package/dist/lib/routes/admin-api/project/variants.js +1 -1
- package/dist/lib/routes/admin-api/project/variants.js.map +1 -1
- package/dist/lib/routes/admin-api/public-signup.d.ts.map +1 -1
- package/dist/lib/routes/admin-api/public-signup.js +2 -2
- package/dist/lib/routes/admin-api/public-signup.js.map +1 -1
- package/dist/lib/routes/admin-api/state.d.ts.map +1 -1
- package/dist/lib/routes/admin-api/state.js +1 -0
- package/dist/lib/routes/admin-api/state.js.map +1 -1
- package/dist/lib/routes/admin-api/strategy.d.ts.map +1 -1
- package/dist/lib/routes/admin-api/strategy.js +5 -5
- package/dist/lib/routes/admin-api/strategy.js.map +1 -1
- package/dist/lib/routes/admin-api/tag.d.ts.map +1 -1
- package/dist/lib/routes/admin-api/tag.js +2 -2
- package/dist/lib/routes/admin-api/tag.js.map +1 -1
- package/dist/lib/routes/client-api/metrics.test.js +2 -0
- package/dist/lib/routes/client-api/metrics.test.js.map +1 -1
- package/dist/lib/routes/edge-api/index.d.ts +1 -0
- package/dist/lib/routes/edge-api/index.d.ts.map +1 -1
- package/dist/lib/routes/edge-api/index.js +25 -13
- package/dist/lib/routes/edge-api/index.js.map +1 -1
- package/dist/lib/routes/proxy-api/index.js +1 -1
- package/dist/lib/routes/proxy-api/index.js.map +1 -1
- package/dist/lib/schema/feature-schema.d.ts.map +1 -1
- package/dist/lib/schema/feature-schema.js +2 -0
- package/dist/lib/schema/feature-schema.js.map +1 -1
- package/dist/lib/server-impl.d.ts.map +1 -1
- package/dist/lib/server-impl.js +1 -0
- package/dist/lib/server-impl.js.map +1 -1
- package/dist/lib/services/access-service.d.ts +3 -1
- package/dist/lib/services/access-service.d.ts.map +1 -1
- package/dist/lib/services/access-service.js +8 -2
- package/dist/lib/services/access-service.js.map +1 -1
- package/dist/lib/services/access-service.test.js +12 -2
- package/dist/lib/services/access-service.test.js.map +1 -1
- package/dist/lib/services/addon-service.d.ts +3 -3
- package/dist/lib/services/addon-service.d.ts.map +1 -1
- package/dist/lib/services/addon-service.js +8 -4
- package/dist/lib/services/addon-service.js.map +1 -1
- package/dist/lib/services/addon-service.test.js +64 -43
- package/dist/lib/services/addon-service.test.js.map +1 -1
- package/dist/lib/services/api-token-service.d.ts +4 -4
- package/dist/lib/services/api-token-service.d.ts.map +1 -1
- package/dist/lib/services/api-token-service.js +12 -9
- package/dist/lib/services/api-token-service.js.map +1 -1
- package/dist/lib/services/api-token-service.test.js +5 -6
- package/dist/lib/services/api-token-service.test.js.map +1 -1
- package/dist/lib/services/client-metrics/instance-service.d.ts +2 -1
- package/dist/lib/services/client-metrics/instance-service.d.ts.map +1 -1
- package/dist/lib/services/client-metrics/instance-service.js +15 -17
- package/dist/lib/services/client-metrics/instance-service.js.map +1 -1
- package/dist/lib/services/client-metrics/last-seen/last-seen-store.d.ts +0 -5
- package/dist/lib/services/client-metrics/last-seen/last-seen-store.d.ts.map +1 -1
- package/dist/lib/services/client-metrics/last-seen/last-seen-store.js.map +1 -1
- package/dist/lib/services/client-metrics/last-seen/tests/last-seen-service.e2e.test.js +2 -2
- package/dist/lib/services/client-metrics/last-seen/tests/last-seen-service.e2e.test.js.map +1 -1
- package/dist/lib/services/context-service.d.ts +3 -3
- package/dist/lib/services/context-service.d.ts.map +1 -1
- package/dist/lib/services/context-service.js +14 -13
- package/dist/lib/services/context-service.js.map +1 -1
- package/dist/lib/services/email-service.d.ts +10 -3
- package/dist/lib/services/email-service.d.ts.map +1 -1
- package/dist/lib/services/email-service.js +98 -2
- package/dist/lib/services/email-service.js.map +1 -1
- package/dist/lib/services/email-service.test.js +41 -29
- package/dist/lib/services/email-service.test.js.map +1 -1
- package/dist/lib/services/favorites-service.d.ts.map +1 -1
- package/dist/lib/services/favorites-service.js +4 -0
- package/dist/lib/services/favorites-service.js.map +1 -1
- package/dist/lib/services/feature-tag-service.d.ts +4 -4
- package/dist/lib/services/feature-tag-service.d.ts.map +1 -1
- package/dist/lib/services/feature-tag-service.js +13 -7
- package/dist/lib/services/feature-tag-service.js.map +1 -1
- package/dist/lib/services/feature-type-service.d.ts.map +1 -1
- package/dist/lib/services/feature-type-service.js +1 -0
- package/dist/lib/services/feature-type-service.js.map +1 -1
- package/dist/lib/services/group-service.d.ts +4 -4
- package/dist/lib/services/group-service.d.ts.map +1 -1
- package/dist/lib/services/group-service.js +23 -18
- package/dist/lib/services/group-service.js.map +1 -1
- package/dist/lib/services/index.d.ts +1 -1
- package/dist/lib/services/index.d.ts.map +1 -1
- package/dist/lib/services/index.js +7 -3
- package/dist/lib/services/index.js.map +1 -1
- package/dist/lib/services/pat-service.d.ts.map +1 -1
- package/dist/lib/services/pat-service.js +2 -0
- package/dist/lib/services/pat-service.js.map +1 -1
- package/dist/lib/services/project-health-service.js +1 -1
- package/dist/lib/services/project-health-service.js.map +1 -1
- package/dist/lib/services/project-service.d.ts +13 -12
- package/dist/lib/services/project-service.d.ts.map +1 -1
- package/dist/lib/services/project-service.js +81 -23
- package/dist/lib/services/project-service.js.map +1 -1
- package/dist/lib/services/proxy-service.d.ts +1 -1
- package/dist/lib/services/proxy-service.d.ts.map +1 -1
- package/dist/lib/services/proxy-service.js +2 -2
- package/dist/lib/services/proxy-service.js.map +1 -1
- package/dist/lib/services/public-signup-token-service.d.ts +2 -2
- package/dist/lib/services/public-signup-token-service.d.ts.map +1 -1
- package/dist/lib/services/public-signup-token-service.js +7 -3
- package/dist/lib/services/public-signup-token-service.js.map +1 -1
- package/dist/lib/services/segment-service.d.ts +1 -1
- package/dist/lib/services/segment-service.d.ts.map +1 -1
- package/dist/lib/services/segment-service.js +15 -14
- package/dist/lib/services/segment-service.js.map +1 -1
- package/dist/lib/services/setting-service.d.ts +2 -2
- package/dist/lib/services/setting-service.d.ts.map +1 -1
- package/dist/lib/services/setting-service.js +5 -2
- package/dist/lib/services/setting-service.js.map +1 -1
- package/dist/lib/services/state-service.d.ts +16 -11
- package/dist/lib/services/state-service.d.ts.map +1 -1
- package/dist/lib/services/state-service.js +46 -18
- package/dist/lib/services/state-service.js.map +1 -1
- package/dist/lib/services/state-service.test.js +75 -21
- package/dist/lib/services/state-service.test.js.map +1 -1
- package/dist/lib/services/strategy-service.d.ts +5 -5
- package/dist/lib/services/strategy-service.d.ts.map +1 -1
- package/dist/lib/services/strategy-service.js +11 -6
- package/dist/lib/services/strategy-service.js.map +1 -1
- package/dist/lib/services/tag-service.d.ts +2 -2
- package/dist/lib/services/tag-service.d.ts.map +1 -1
- package/dist/lib/services/tag-service.js +4 -2
- package/dist/lib/services/tag-service.js.map +1 -1
- package/dist/lib/services/user-service.d.ts.map +1 -1
- package/dist/lib/services/user-service.js +3 -0
- package/dist/lib/services/user-service.js.map +1 -1
- package/dist/lib/services/user-service.test.js +12 -12
- package/dist/lib/services/user-service.test.js.map +1 -1
- package/dist/lib/services/version-service.test.js +8 -2
- package/dist/lib/services/version-service.test.js.map +1 -1
- package/dist/lib/types/core.d.ts +3 -1
- package/dist/lib/types/core.d.ts.map +1 -1
- package/dist/lib/types/core.js +11 -0
- package/dist/lib/types/core.js.map +1 -1
- package/dist/lib/types/events.d.ts +51 -2
- package/dist/lib/types/events.d.ts.map +1 -1
- package/dist/lib/types/events.js +59 -42
- package/dist/lib/types/events.js.map +1 -1
- package/dist/lib/types/experimental.d.ts +1 -1
- package/dist/lib/types/experimental.d.ts.map +1 -1
- package/dist/lib/types/experimental.js +9 -1
- package/dist/lib/types/experimental.js.map +1 -1
- package/dist/lib/types/model.d.ts +30 -2
- package/dist/lib/types/model.d.ts.map +1 -1
- package/dist/lib/types/model.js.map +1 -1
- package/dist/lib/types/option.d.ts +2 -0
- package/dist/lib/types/option.d.ts.map +1 -1
- package/dist/lib/types/services.d.ts +2 -1
- package/dist/lib/types/services.d.ts.map +1 -1
- package/dist/lib/types/stores/client-applications-store.d.ts +1 -0
- package/dist/lib/types/stores/client-applications-store.d.ts.map +1 -1
- package/dist/lib/types/stores/feature-tag-store.d.ts +7 -3
- package/dist/lib/types/stores/feature-tag-store.d.ts.map +1 -1
- package/dist/lib/types/stores.d.ts +4 -2
- package/dist/lib/types/stores.d.ts.map +1 -1
- package/dist/lib/util/extract-user.d.ts +5 -0
- package/dist/lib/util/extract-user.d.ts.map +1 -1
- package/dist/lib/util/extract-user.js +8 -1
- package/dist/lib/util/extract-user.js.map +1 -1
- package/dist/mailtemplates/scheduled-change-conflict/scheduled-change-conflict.html.mustache +527 -0
- package/dist/mailtemplates/scheduled-change-conflict/scheduled-change-conflict.plain.mustache +9 -0
- package/dist/mailtemplates/scheduled-execution-failed/scheduled-execution-failed.html.mustache +522 -0
- package/dist/mailtemplates/scheduled-execution-failed/scheduled-execution-failed.plain.mustache +6 -0
- package/dist/migrations/20231211121444-features-created-by.d.ts +3 -0
- package/dist/migrations/20231211121444-features-created-by.d.ts.map +1 -0
- package/dist/migrations/20231211121444-features-created-by.js +12 -0
- package/dist/migrations/20231211121444-features-created-by.js.map +1 -0
- package/dist/migrations/20231211122322-feature-types-created-by.d.ts +3 -0
- package/dist/migrations/20231211122322-feature-types-created-by.d.ts.map +1 -0
- package/dist/migrations/20231211122322-feature-types-created-by.js +12 -0
- package/dist/migrations/20231211122322-feature-types-created-by.js.map +1 -0
- package/dist/migrations/20231211122351-feature-tag-created-by.d.ts +3 -0
- package/dist/migrations/20231211122351-feature-tag-created-by.d.ts.map +1 -0
- package/dist/migrations/20231211122351-feature-tag-created-by.js +12 -0
- package/dist/migrations/20231211122351-feature-tag-created-by.js.map +1 -0
- package/dist/migrations/20231211122426-feature-strategies-created-by.d.ts +3 -0
- package/dist/migrations/20231211122426-feature-strategies-created-by.d.ts.map +1 -0
- package/dist/migrations/20231211122426-feature-strategies-created-by.js +12 -0
- package/dist/migrations/20231211122426-feature-strategies-created-by.js.map +1 -0
- package/dist/migrations/20231211132341-add-created-by-to-role-permission.d.ts +3 -0
- package/dist/migrations/20231211132341-add-created-by-to-role-permission.d.ts.map +1 -0
- package/dist/migrations/20231211132341-add-created-by-to-role-permission.js +8 -0
- package/dist/migrations/20231211132341-add-created-by-to-role-permission.js.map +1 -0
- package/dist/migrations/20231211133008-add-created-by-to-role-user.d.ts +3 -0
- package/dist/migrations/20231211133008-add-created-by-to-role-user.d.ts.map +1 -0
- package/dist/migrations/20231211133008-add-created-by-to-role-user.js +8 -0
- package/dist/migrations/20231211133008-add-created-by-to-role-user.js.map +1 -0
- package/dist/migrations/20231211133920-add-created-by-to-roles.d.ts +3 -0
- package/dist/migrations/20231211133920-add-created-by-to-roles.d.ts.map +1 -0
- package/dist/migrations/20231211133920-add-created-by-to-roles.js +8 -0
- package/dist/migrations/20231211133920-add-created-by-to-roles.js.map +1 -0
- package/dist/migrations/20231211134130-add-created-by-to-users.d.ts +3 -0
- package/dist/migrations/20231211134130-add-created-by-to-users.d.ts.map +1 -0
- package/dist/migrations/20231211134130-add-created-by-to-users.js +8 -0
- package/dist/migrations/20231211134130-add-created-by-to-users.js.map +1 -0
- package/dist/migrations/20231211134633-add-created-by-to-apitokens.d.ts +3 -0
- package/dist/migrations/20231211134633-add-created-by-to-apitokens.d.ts.map +1 -0
- package/dist/migrations/20231211134633-add-created-by-to-apitokens.js +8 -0
- package/dist/migrations/20231211134633-add-created-by-to-apitokens.js.map +1 -0
- package/dist/migrations/20231212094044-event-created-by-user-id.d.ts +3 -0
- package/dist/migrations/20231212094044-event-created-by-user-id.d.ts.map +1 -0
- package/dist/migrations/20231212094044-event-created-by-user-id.js +14 -0
- package/dist/migrations/20231212094044-event-created-by-user-id.js.map +1 -0
- package/dist/migrations/20231213111906-add-reason-to-change-request-schedule.d.ts +3 -0
- package/dist/migrations/20231213111906-add-reason-to-change-request-schedule.d.ts.map +1 -0
- package/dist/migrations/20231213111906-add-reason-to-change-request-schedule.js +8 -0
- package/dist/migrations/20231213111906-add-reason-to-change-request-schedule.js.map +1 -0
- package/dist/migrations/20231215105713-incoming-webhooks.d.ts +3 -0
- package/dist/migrations/20231215105713-incoming-webhooks.d.ts.map +1 -0
- package/dist/migrations/20231215105713-incoming-webhooks.js +34 -0
- package/dist/migrations/20231215105713-incoming-webhooks.js.map +1 -0
- package/dist/migrations/20231218165612-inc-webhook-tokens-rename-secret-to-token.d.ts +3 -0
- package/dist/migrations/20231218165612-inc-webhook-tokens-rename-secret-to-token.d.ts.map +1 -0
- package/dist/migrations/20231218165612-inc-webhook-tokens-rename-secret-to-token.js +12 -0
- package/dist/migrations/20231218165612-inc-webhook-tokens-rename-secret-to-token.js.map +1 -0
- package/dist/migrations/20231219100343-rename-new-columns-to-created-by-user-id.d.ts +3 -0
- package/dist/migrations/20231219100343-rename-new-columns-to-created-by-user-id.d.ts.map +1 -0
- package/dist/migrations/20231219100343-rename-new-columns-to-created-by-user-id.js +28 -0
- package/dist/migrations/20231219100343-rename-new-columns-to-created-by-user-id.js.map +1 -0
- package/dist/migrations/20231221143955-feedback-table.d.ts +3 -0
- package/dist/migrations/20231221143955-feedback-table.d.ts.map +1 -0
- package/dist/migrations/20231221143955-feedback-table.js +21 -0
- package/dist/migrations/20231221143955-feedback-table.js.map +1 -0
- package/dist/migrations/20231222071533-unleash-system-user.d.ts +3 -0
- package/dist/migrations/20231222071533-unleash-system-user.d.ts.map +1 -0
- package/dist/migrations/20231222071533-unleash-system-user.js +17 -0
- package/dist/migrations/20231222071533-unleash-system-user.js.map +1 -0
- package/dist/migrations/20240102142100-incoming-webhooks-created-by.d.ts +3 -0
- package/dist/migrations/20240102142100-incoming-webhooks-created-by.d.ts.map +1 -0
- package/dist/migrations/20240102142100-incoming-webhooks-created-by.js +11 -0
- package/dist/migrations/20240102142100-incoming-webhooks-created-by.js.map +1 -0
- package/dist/migrations/20240102205517-observable-events.d.ts +3 -0
- package/dist/migrations/20240102205517-observable-events.d.ts.map +1 -0
- package/dist/migrations/20240102205517-observable-events.js +27 -0
- package/dist/migrations/20240102205517-observable-events.js.map +1 -0
- package/dist/server-dev.js +20 -13
- package/dist/server-dev.js.map +1 -1
- package/dist/test/e2e/api/admin/api-token.auth.e2e.test.js +1 -0
- package/dist/test/e2e/api/admin/api-token.auth.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/config.e2e.test.js +1 -1
- package/dist/test/e2e/api/admin/config.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/context.e2e.test.js +1 -1
- package/dist/test/e2e/api/admin/context.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/environment.test.js +1 -1
- package/dist/test/e2e/api/admin/environment.test.js.map +1 -1
- package/dist/test/e2e/api/admin/event.e2e.test.js +5 -0
- package/dist/test/e2e/api/admin/event.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/instance-admin.e2e.test.js +12 -3
- package/dist/test/e2e/api/admin/instance-admin.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/metrics.e2e.test.js +1 -1
- package/dist/test/e2e/api/admin/metrics.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/project/projects.e2e.test.js +17 -0
- package/dist/test/e2e/api/admin/project/projects.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/project/variants.e2e.test.js +22 -1
- package/dist/test/e2e/api/admin/project/variants.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/state.e2e.test.js +25 -13
- package/dist/test/e2e/api/admin/state.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/auth/reset-password-controller.e2e.test.js +1 -1
- package/dist/test/e2e/api/auth/reset-password-controller.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/auth/simple-password-provider.e2e.test.js +1 -1
- package/dist/test/e2e/api/auth/simple-password-provider.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/client/feature.e2e.test.js +12 -11
- package/dist/test/e2e/api/client/feature.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/client/feature.env.disabled.e2e.test.js +3 -2
- package/dist/test/e2e/api/client/feature.env.disabled.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/client/feature.optimal304.e2e.test.js +10 -10
- package/dist/test/e2e/api/client/feature.optimal304.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/client/feature.token.access.e2e.test.js +7 -5
- package/dist/test/e2e/api/client/feature.token.access.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/client/metricsV2.e2e.test.js +3 -2
- package/dist/test/e2e/api/client/metricsV2.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/openapi/openapi.e2e.test.js +2 -1
- package/dist/test/e2e/api/openapi/openapi.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/proxy/proxy.e2e.test.d.ts.map +1 -1
- package/dist/test/e2e/api/proxy/proxy.e2e.test.js +4 -3
- package/dist/test/e2e/api/proxy/proxy.e2e.test.js.map +1 -1
- package/dist/test/e2e/dedupe-permissions.e2e.test.js +4 -3
- package/dist/test/e2e/dedupe-permissions.e2e.test.js.map +1 -1
- package/dist/test/e2e/favor-permission-name-over-id.e2e.test.js +4 -3
- package/dist/test/e2e/favor-permission-name-over-id.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/access-service.e2e.test.js +9 -4
- package/dist/test/e2e/services/access-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/addon-service.e2e.test.js +4 -3
- package/dist/test/e2e/services/addon-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/api-token-service.e2e.test.js +1 -1
- package/dist/test/e2e/services/api-token-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/group-service.e2e.test.js +3 -3
- package/dist/test/e2e/services/group-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/playground-service.test.d.ts.map +1 -1
- package/dist/test/e2e/services/playground-service.test.js +1 -0
- package/dist/test/e2e/services/playground-service.test.js.map +1 -1
- package/dist/test/e2e/services/project-health-service.e2e.test.js +9 -0
- package/dist/test/e2e/services/project-health-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/project-service.e2e.test.js +62 -44
- package/dist/test/e2e/services/project-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/reset-token-service.e2e.test.js +1 -1
- package/dist/test/e2e/services/reset-token-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/setting-service.test.js +9 -8
- package/dist/test/e2e/services/setting-service.test.js.map +1 -1
- package/dist/test/e2e/services/state-service.e2e.test.js +5 -0
- package/dist/test/e2e/services/state-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/user-service.e2e.test.js +2 -2
- package/dist/test/e2e/services/user-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/stores/event-store.e2e.test.js +11 -0
- package/dist/test/e2e/stores/event-store.e2e.test.js.map +1 -1
- package/dist/test/e2e/stores/feature-environment-store.e2e.test.js +8 -2
- package/dist/test/e2e/stores/feature-environment-store.e2e.test.js.map +1 -1
- package/dist/test/e2e/stores/feature-tag-store.e2e.test.js +24 -9
- package/dist/test/e2e/stores/feature-tag-store.e2e.test.js.map +1 -1
- package/dist/test/e2e/system-user-migration.test.d.ts +2 -0
- package/dist/test/e2e/system-user-migration.test.d.ts.map +1 -0
- package/dist/test/e2e/system-user-migration.test.js +65 -0
- package/dist/test/e2e/system-user-migration.test.js.map +1 -0
- package/dist/test/fixtures/fake-feature-tag-store.d.ts +1 -1
- package/dist/test/fixtures/fake-feature-tag-store.d.ts.map +1 -1
- package/dist/test/fixtures/fake-feature-tag-store.js +3 -2
- package/dist/test/fixtures/fake-feature-tag-store.js.map +1 -1
- package/dist/test/fixtures/store.d.ts.map +1 -1
- package/dist/test/fixtures/store.js +3 -1
- package/dist/test/fixtures/store.js.map +1 -1
- package/frontend/build/index.html +2 -3
- package/frontend/build/static/AdvancedPlayground-FxfPUa2V.js +13 -0
- package/frontend/build/static/CreateProject-aN-UGdcb.js +4 -0
- package/frontend/build/static/FeatureArchiveDialog-eHyhx7Yo.js +7 -0
- package/frontend/build/static/{FeatureMetricsChart-d6700d04.js → FeatureMetricsChart-ExGq1eXl.js} +2 -2
- package/frontend/build/static/FeatureViewLazyExport-S8mj8m0z.js +25 -0
- package/frontend/build/static/LazyAdminExport-fpVZFnP9.js +44 -0
- package/frontend/build/static/LazyProjectExport-_QSE5C5m.js +25 -0
- package/frontend/build/static/{NetworkOverview-f1b8bc51.js → NetworkOverview-ylTzmeDg.js} +53 -47
- package/frontend/build/static/NetworkTraffic-qj5h7JRk.js +1 -0
- package/frontend/build/static/{ReactJSONEditor-cee5845e.js → ReactJSONEditor-E59dRBYR.js} +66 -66
- package/frontend/build/static/RoleCell-TGTVkKHO.js +1 -0
- package/frontend/build/static/StrategyItemContainer-JoMPKX3L.js +1 -0
- package/frontend/build/static/chartjs-adapter-date-fns.esm-JSlDxtwH.js +23 -0
- package/frontend/build/static/{flowchart-elk-definition-170a3958-176ecefe.js → flowchart-elk-definition-170a3958-NkZoK_zv.js} +3 -3
- package/frontend/build/static/index-JVRlSBvr.js +501 -0
- package/frontend/build/static/{is_dark-bdf64838.js → is_dark-gjUQW15t.js} +1 -1
- package/frontend/build/static/{mindmap-definition-44684416-6e91e0f5.js → mindmap-definition-44684416-obuYUG0L.js} +2 -2
- package/frontend/build/static/not_operator_selected-Iyxw0Fyz.svg +5 -0
- package/frontend/build/static/not_operator_unselected-vtd9BSk1.svg +3 -0
- package/frontend/build/static/{timeline-definition-8e5a9bc6-d88c2258.js → timeline-definition-8e5a9bc6-33WsNwwr.js} +1 -1
- package/frontend/build/static/{unknownify-708e56b5.js → unknownify-YD2Teyht.js} +1 -1
- package/frontend/build/static/unleashHoliday-kBBu-_tQ.svg +33 -0
- package/frontend/build/static/unleashHolidayDark-fbGH80iu.svg +33 -0
- package/frontend/build/static/{useApiTokens-4c5c213b.js → useApiTokens-XTOY616x.js} +1 -1
- package/frontend/build/static/useProjectForm--jxh4Dtm.js +1 -0
- package/frontend/package.json +21 -15
- package/package.json +5 -5
- package/dist/lib/db/environment-store.d.ts.map +0 -1
- package/dist/lib/db/environment-store.js.map +0 -1
- package/dist/lib/openapi/spec/admin-strategies-schema.d.ts.map +0 -1
- package/dist/lib/openapi/spec/admin-strategies-schema.js.map +0 -1
- package/dist/lib/openapi/spec/admin-strategies-schema.test.d.ts +0 -2
- package/dist/lib/openapi/spec/admin-strategies-schema.test.d.ts.map +0 -1
- package/dist/lib/openapi/spec/admin-strategies-schema.test.js.map +0 -1
- package/dist/lib/routes/admin-api/project/environments.d.ts.map +0 -1
- package/dist/lib/routes/admin-api/project/environments.js.map +0 -1
- package/dist/lib/routes/admin-api/project/index.d.ts.map +0 -1
- package/dist/lib/routes/admin-api/project/index.js.map +0 -1
- package/dist/lib/services/environment-service.d.ts.map +0 -1
- package/dist/lib/services/environment-service.js.map +0 -1
- package/dist/lib/types/stores/environment-store.d.ts.map +0 -1
- package/dist/lib/types/stores/environment-store.js.map +0 -1
- package/dist/test/e2e/api/admin/project/environments.e2e.test.d.ts.map +0 -1
- package/dist/test/e2e/api/admin/project/environments.e2e.test.js.map +0 -1
- package/dist/test/e2e/services/environment-service.test.d.ts.map +0 -1
- package/dist/test/e2e/services/environment-service.test.js.map +0 -1
- package/dist/test/fixtures/fake-environment-store.d.ts.map +0 -1
- package/dist/test/fixtures/fake-environment-store.js.map +0 -1
- package/frontend/build/static/24_Negator off-764e9292.svg +0 -3
- package/frontend/build/static/24_Negator-3c95065e.svg +0 -3
- package/frontend/build/static/AdvancedPlayground-b2553abd.js +0 -13
- package/frontend/build/static/Box-bd72643d.js +0 -1
- package/frontend/build/static/CreateProject-b18786eb.js +0 -4
- package/frontend/build/static/Error-ef493ef3.js +0 -1
- package/frontend/build/static/FeatureArchiveDialog-ec518ad8.js +0 -7
- package/frontend/build/static/FeatureViewLazyExport-91172621.js +0 -10
- package/frontend/build/static/LazyAdminExport-4686a742.js +0 -38
- package/frontend/build/static/LazyProjectExport-e3e11f4e.js +0 -26
- package/frontend/build/static/NetworkTraffic-c8b752fe.js +0 -1
- package/frontend/build/static/RoleCell-91725c88.js +0 -1
- package/frontend/build/static/StrategyItemContainer-ad74b119.js +0 -1
- package/frontend/build/static/chartjs-adapter-date-fns.esm-054094c3.js +0 -24
- package/frontend/build/static/index-ae1bed58.js +0 -460
- package/frontend/build/static/useProjectForm-ff29595e.js +0 -1
- /package/dist/{test/e2e/services → lib/features/project-environments}/environment-service.test.d.ts +0 -0
- /package/dist/{test/e2e/api/admin/project → lib/features/project-environments}/environments.e2e.test.d.ts +0 -0
- /package/frontend/build/static/{24_Text format off-9a1401ab.svg → 24_Text format off-H08NRmYe.svg} +0 -0
- /package/frontend/build/static/{24_Text format-c0530280.svg → 24_Text format-rAPEECSE.svg} +0 -0
- /package/frontend/build/static/{Logo-android-218bddbb.svg → Logo-android-udpLXX1T.svg} +0 -0
- /package/frontend/build/static/{Logo-flutter-cc3c706f.svg → Logo-flutter-eDaat-tQ.svg} +0 -0
- /package/frontend/build/static/{Logo-go-02475b3d.svg → Logo-go-7IBXKeYU.svg} +0 -0
- /package/frontend/build/static/{Logo-java-6e556b26.svg → Logo-java-52SStktf.svg} +0 -0
- /package/frontend/build/static/{Logo-javascript-caebc06e.svg → Logo-javascript-FL9SH-qr.svg} +0 -0
- /package/frontend/build/static/{Logo-net-0a33abee.svg → Logo-net-bG0mn56S.svg} +0 -0
- /package/frontend/build/static/{Logo-node-318ed025.svg → Logo-node-h37os8v5.svg} +0 -0
- /package/frontend/build/static/{Logo-php-201f18c3.svg → Logo-php-Z_EVXL0a.svg} +0 -0
- /package/frontend/build/static/{Logo-python-4305760e.svg → Logo-python-_44ZKCSX.svg} +0 -0
- /package/frontend/build/static/{Logo-react-18e98687.svg → Logo-react-9krlaJef.svg} +0 -0
- /package/frontend/build/static/{Logo-ruby-58f46832.svg → Logo-ruby-ZZBHss3J.svg} +0 -0
- /package/frontend/build/static/{Logo-rust-c83a80f9.svg → Logo-rust-2dVdHYIX.svg} +0 -0
- /package/frontend/build/static/{Logo-svelte-97dcb624.svg → Logo-svelte-fn23y4Xh.svg} +0 -0
- /package/frontend/build/static/{Logo-swift-315f842b.svg → Logo-swift-dl73ozXW.svg} +0 -0
- /package/frontend/build/static/{Logo-vue-0de73099.svg → Logo-vue-XNczCeoD.svg} +0 -0
- /package/frontend/build/static/{arrowLeft-7271148c.svg → arrowLeft-iw13ytfI.svg} +0 -0
- /package/frontend/build/static/{arrowRight-0d07b41b.svg → arrowRight-jyAAywbz.svg} +0 -0
- /package/frontend/build/static/{changeRequestProcess-f2469ef4.svg → changeRequestProcess-m2Uj_v6I.svg} +0 -0
- /package/frontend/build/static/{cr-db7653ac.png → cr-24xlfR5T.png} +0 -0
- /package/frontend/build/static/{datadog-543762b6.svg → datadog--09MbZDg.svg} +0 -0
- /package/frontend/build/static/{demo-qr-c2ce85bd.png → demo-qr-kJaJsgg_.png} +0 -0
- /package/frontend/build/static/{demo-userid-69a28f5e.png → demo-userid-OFH-UWxt.png} +0 -0
- /package/frontend/build/static/{edge-daisy-chaining-012bfdef.svg → edge-daisy-chaining-gE7UbpD0.svg} +0 -0
- /package/frontend/build/static/{edge-mode-5d25949b.svg → edge-mode-sUiAy22Z.svg} +0 -0
- /package/frontend/build/static/{edge-offline-f6a0f761.svg → edge-offline-uschgqgm.svg} +0 -0
- /package/frontend/build/static/{email-1b13db1f.svg → email-9TVW6bxs.svg} +0 -0
- /package/frontend/build/static/{google-4c4465a1.svg → google-Rg4hsLIv.svg} +0 -0
- /package/frontend/build/static/{isenabled-false-85a17190.svg → isenabled-false-cfG0cxg8.svg} +0 -0
- /package/frontend/build/static/{isenabled-true-def895c4.svg → isenabled-true-QEbId32j.svg} +0 -0
- /package/frontend/build/static/{jira-1abe7cbf.svg → jira-JdG6Pbgg.svg} +0 -0
- /package/frontend/build/static/{jira-comment-d9eb9af9.svg → jira-comment-4uboD2FW.svg} +0 -0
- /package/frontend/build/static/{link-child-7239dd72.svg → link-child-b2rNaTp8.svg} +0 -0
- /package/frontend/build/static/{link-parent-29e03412.svg → link-parent-2mtl7FAF.svg} +0 -0
- /package/frontend/build/static/{logo-b574b8c7.svg → logo-aXkSdUlT.svg} +0 -0
- /package/frontend/build/static/{logoBg-3fc9c711.svg → logoBg-w1GxfZYY.svg} +0 -0
- /package/frontend/build/static/{logoDarkWithText-7b7859f1.svg → logoDarkWithText-9CJmQsUT.svg} +0 -0
- /package/frontend/build/static/{logoWhiteBg-dacde9ce.svg → logoWhiteBg-sKFgoO5r.svg} +0 -0
- /package/frontend/build/static/{logoWhiteTransparentHorizontal-32f9c398.svg → logoWhiteTransparentHorizontal-OccVQlof.svg} +0 -0
- /package/frontend/build/static/{logoWithWhiteText-954086cd.svg → logoWithWhiteText-8-1bzjd2.svg} +0 -0
- /package/frontend/build/static/{merge-afa8c386.svg → merge-uyE9K2XR.svg} +0 -0
- /package/frontend/build/static/{mobileGuidanceBg-0cc2cfdc.svg → mobileGuidanceBg-_XUYJ4bI.svg} +0 -0
- /package/frontend/build/static/{pro-enterprise-feature-badge-8ac467c3.svg → pro-enterprise-feature-badge-D2dwX2o5.svg} +0 -0
- /package/frontend/build/static/{pro-enterprise-feature-badge-light-81a18f9b.svg → pro-enterprise-feature-badge-light-JPGefdhP.svg} +0 -0
- /package/frontend/build/static/{projectIcon-0c6827a4.svg → projectIcon-patkU339.svg} +0 -0
- /package/frontend/build/static/{rollout-c922b6e9.svg → rollout-wL0vStZV.svg} +0 -0
- /package/frontend/build/static/{slack-36ce798a.svg → slack-LdHzcD3n.svg} +0 -0
- /package/frontend/build/static/{stars-5e0648cd.svg → stars-uZav8YWv.svg} +0 -0
- /package/frontend/build/static/{style-f10c9ed6.css → style-gSb9cHBe.css} +0 -0
- /package/frontend/build/static/{teams-4e30b51f.svg → teams-70Mfxcwa.svg} +0 -0
- /package/frontend/build/static/{texture-c29e66c0.png → texture-NpzjhzHk.png} +0 -0
- /package/frontend/build/static/{unleash-integration-949d8966.svg → unleash-integration-rcapuVXn.svg} +0 -0
- /package/frontend/build/static/{unleashLogoIconDarkAlpha-de056a82.gif → unleashLogoIconDarkAlpha-W77gtdw3.gif} +0 -0
- /package/frontend/build/static/{usage-line-00d00632.svg → usage-line-R4nA8fmB.svg} +0 -0
- /package/frontend/build/static/{usage-rate-cb18f02b.svg → usage-rate-510IagyJ.svg} +0 -0
- /package/frontend/build/static/{webhooks-b1b44207.svg → webhooks-p7bNIH7i.svg} +0 -0
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{s as w,h as B,e as D,aw as O,ax as U,ay as J,aj as L,az as F,j as e,aA as b,aB as K,aC as $,g as z,aD as M}from"./index-JVRlSBvr.js";import{u as q,P as G,D as Y}from"./useProjectForm--jxh4Dtm.js";const H="CREATE_PROJECT_BTN",Q=w(B)(({theme:t})=>({marginLeft:t.spacing(3)})),X=()=>{const{setToastData:t,setToastApiError:j}=D(),{refetchUser:l}=O(),{uiConfig:p}=U(),o=J(),{trackEvent:a}=L(),{projectId:s,projectName:u,projectDesc:m,projectMode:r,setProjectMode:P,setProjectId:C,setProjectName:E,setProjectDesc:T,getCreateProjectPayload:c,clearErrors:n,validateProjectId:i,validateName:g,setProjectStickiness:h,projectStickiness:d,errors:f}=q(),{createProject:y,loading:A}=F(),_=async k=>{k.preventDefault(),n();const v=g(),x=await i();if(v&&x){const I=c();try{await y(I),l(),o(`/projects/${s}`),t({title:"Project created",text:"Now you can add toggles to this project",confetti:!0,type:"success"}),d!==Y&&a("project_stickiness_set"),a("project-mode",{props:{mode:r,action:"added"}})}catch(R){j(z(R))}}},N=()=>`curl --location --request POST '${p.unleashUrl}/api/admin/projects' \\
|
|
2
|
+
--header 'Authorization: INSERT_API_KEY' \\
|
|
3
|
+
--header 'Content-Type: application/json' \\
|
|
4
|
+
--data-raw '${JSON.stringify(c(),void 0,2)}'`,S=()=>{o(M)};return e.jsx(b,{loading:A,title:"Create project",description:"Projects allows you to group feature toggles together in the management UI.",documentationLink:"https://docs.getunleash.io/reference/projects",documentationLinkLabel:"Projects documentation",formatApiCode:N,children:e.jsxs(G,{errors:f,handleSubmit:_,projectId:s,setProjectId:C,projectName:u,projectStickiness:d,projectMode:r,setProjectMode:P,setProjectStickiness:h,setProjectName:E,projectDesc:m,setProjectDesc:T,mode:"Create",clearErrors:n,validateProjectId:i,children:[e.jsx(K,{name:"project",permission:$,"data-testid":H}),e.jsx(Q,{onClick:S,children:"Cancel"})]})})};export{X as default};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{c as le,j as t,aE as H,aW as z,b7 as _,C as A,J as D,T as E,ct as ce,s as q,gy as ue,bc as de,bv as X,ay as Z,ax as I,gz as he,gA as ge,gB as pe,gC as me,cd as fe,bH as N,gD as xe,h as ve,gE as be,cF as ye,bs as je,r as x,az as M,e as O,bw as Se,aj as Te,bu as Ce,aA as Ae,aX as Ee,bm as we,ce as ke,g as P,B as Re,ah as De,eS as qe,gF as Fe,aV as ee,aF as Pe,aJ as W,c6 as U,gG as $e,gH as Oe,gI as Be,fA as Ve,ba as _e,bb as Le,A as te,k as se,c9 as Ne,l as He,n as ze,Q as Me,gJ as Ue,m as Ge,b as We,u as Je,bZ as Ye,aQ as Ke,aO as ne,aP as ae,b6 as Qe,aK as V,bV as re,a_ as oe}from"./index-JVRlSBvr.js";const kt=le(t.jsx("path",{d:"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zm4.2 14.2L11 13V7h1.5v5.2l4.5 2.7-.8 1.3z"}),"WatchLater"),Xe=({isOpen:e,onConfirm:a,onClose:n,showBanner:s,environment:r,messageComponent:o})=>{const i=H("projectId"),{data:d}=z(i),{changeRequestInReviewOrApproved:h,alert:p}=ce(d),g=h(r||""),m=g?"Add to existing change request":"Add suggestion to draft";return t.jsxs(_,{open:e,primaryButtonText:m,secondaryButtonText:"Cancel",onClick:a,onClose:n,title:"Request changes",fullWidth:!0,children:[t.jsx(A,{condition:g,show:p}),t.jsx(A,{condition:!!s,show:t.jsxs(D,{severity:"info",sx:{mb:2},children:["Change requests feature is enabled for ",r,". Your changes need to be approved before they will be live. All the changes you do now will be added into a draft that you can submit for review."]})}),t.jsx(E,{variant:"body2",color:"text.secondary",children:"Your suggestion:"}),o]})},Ze=q("form")(({theme:e})=>({display:"grid",gap:e.spacing(2)})),J=q("hr")(({theme:e})=>({width:"100%",height:"1px",margin:e.spacing(2,0),border:"none",background:e.palette.background.elevation2})),Ie=q("div")(({theme:e})=>({display:"flex",justifyContent:"end",gap:e.spacing(2),paddingBottom:e.spacing(10)})),et=({projectId:e,environmentId:a,permission:n,onSubmit:s,onCancel:r,loading:o,strategy:i,setStrategy:d,segments:h,setSegments:p,errors:g})=>{const m=ue(i.constraints),l=de(n,e,a),{strategyDefinition:u}=X(i==null?void 0:i.name),v=Z(),{uiConfig:b,error:S,loading:C}=I();if(S)throw S;if(C||!u)return null;const w=y=>u.parameters.find(T=>T.name===y),c=(y,T)=>{const F=w(y);if(y!=="groupId"){const j=be(F,T);return j?(g.setFormError(y,j),!1):(g.removeFormError(y),!0)}return!0},R=()=>u.parameters.map(y=>y.name).map(y=>{var T;return c(y,(T=i.parameters)==null?void 0:T[y])}).every(Boolean),$=()=>{v(`/projects/${e}/settings/default-strategy`)},B=async y=>{if(y.preventDefault(),R())s();else return};return t.jsxs(Ze,{onSubmit:B,children:[t.jsx(he,{title:i.title||"",setTitle:y=>{d(T=>({...T,title:y}))}}),t.jsx(ge,{segments:h,setSegments:p,projectId:e}),t.jsx(pe,{projectId:e,environmentId:a,strategy:i,setStrategy:d}),t.jsx(J,{}),t.jsx(me,{strategy:i,strategyDefinition:u,setStrategy:d,validateParameter:c,errors:g,hasAccess:l}),t.jsx(A,{condition:i.parameters!=null&&"stickiness"in i.parameters,show:t.jsx(fe,{strategy:i,setStrategy:d,environment:a,projectId:e})}),t.jsx(J,{}),t.jsxs(Ie,{children:[t.jsx(N,{permission:n,projectId:e,environmentId:a,variant:"contained",color:"primary",type:"submit",disabled:o||!m||g.hasFormErrors(),"data-testid":xe,children:"Save strategy"}),t.jsx(ve,{type:"button",color:"primary",onClick:r||$,disabled:o,children:"Cancel"})]})]})},tt=(e,a)=>{var i;const{project:n,refetch:s}=ye(e),r={name:"flexibleRollout",constraints:[],parameters:{rollout:"100",stickiness:n.defaultStickiness||"default",groupId:""}},o=(i=n.environments.find(d=>d.environment===a))==null?void 0:i.defaultStrategy;return{defaultStrategyFallback:r,strategy:o,refetch:s}},Rt=()=>{const e=H("projectId"),a=je("environmentId"),{defaultStrategyFallback:n,strategy:s,refetch:r}=tt(e,a),[o,i]=x.useState(s||n),[d,h]=x.useState([]),{updateDefaultStrategy:p,loading:g}=M(),{strategyDefinition:m}=X(o==null?void 0:o.name),{setToastData:l,setToastApiError:u}=O(),v=Se(),{uiConfig:b}=I(),{unleashUrl:S}=b,C=Z(),{trackEvent:w}=Te(),{segments:c,refetchSegments:R}=Ce();x.useEffect(()=>{if(c&&(s!=null&&s.segments)){const T=[];for(const F of s==null?void 0:s.segments)T.push(...c.filter(j=>j.id===F));h(T)}},[JSON.stringify(c),JSON.stringify(s==null?void 0:s.segments)]);const $=st(o,d),B=async T=>{await p(e,a,T),w("default_strategy",{props:{action:"edit",hasTitle:!!T.title}}),await R(),l({title:"Default Strategy updated",type:"success",confetti:!0})},y=async()=>{const T=`/projects/${e}/settings/default-strategy`;try{await B($),await r(),C(T)}catch(F){u(P(F))}};return!m||!o?null:t.jsx(Ae,{modal:!0,title:Ee((o==null?void 0:o.name)??""),description:at,documentationLink:rt,documentationLinkLabel:ot,formatApiCode:()=>nt(e,a,$,m,S),children:t.jsx(et,{projectId:e,strategy:o,setStrategy:i,segments:d,setSegments:h,environmentId:a,onSubmit:y,loading:g,permission:we,errors:v,isChangeRequest:!1})})},st=(e,a)=>({name:e.name,title:e.title,constraints:e.constraints??[],parameters:e.parameters??{},variants:e.variants??[],segments:a.map(n=>n.id),disabled:e.disabled??!1}),nt=(e,a,n,s,r)=>{if(!r)return"";const o={...n,parameters:ke(n.parameters??{},s)},i=`${r}/api/admin/projects/${e}/environments/${a}/default-strategy}`,d=JSON.stringify(o,void 0,2);return`curl --location --request PUT '${i}' \\
|
|
2
|
+
--header 'Authorization: INSERT_API_KEY' \\
|
|
3
|
+
--header 'Content-Type: application/json' \\
|
|
4
|
+
--data-raw '${d}'`},at=`
|
|
5
|
+
An activation strategy will only run when a feature toggle is enabled and provides a way to control who will get access to the feature.
|
|
6
|
+
If any of a feature toggle's activation strategies returns true, the user will get access.
|
|
7
|
+
`,rt="https://docs.getunleash.io/reference/activation-strategies",ot="Default strategy documentation",it=e=>{const[a,n]=x.useState(e),s=x.useCallback(()=>n(e),[e]);return x.useEffect(()=>{n(e)},[e]),[a,n,s]},lt=q(Re)(()=>({mx:"auto",...De})),Dt=({projectId:e,featureId:a,environmentName:n,value:s,onToggle:r})=>{const[o,i,d]=it(s),h=()=>{i(!o),requestAnimationFrame(()=>{r(!o,d)})},p=`${a}-${n}`;return t.jsx(t.Fragment,{children:t.jsx(lt,{"data-testid":`TOGGLE-${p}`,children:t.jsx(qe,{tooltip:o?`Disable feature in ${n}`:`Enable feature in ${n}`,checked:s,environmentId:n,projectId:e,permission:Fe,inputProps:{"aria-label":n},onClick:h,"data-testid":"permission-switch",disableRipple:!0,disabled:s!==o})},p)})},ct=e=>{const{setToastData:a,setToastApiError:n}=O(),{addChange:s}=ee(),{refetch:r}=z(e),[o,i]=x.useState({isOpen:!1}),d=x.useCallback((g,m,l,u)=>{i({featureName:g,environment:m,enabled:l,shouldActivateDisabledStrategies:u,isOpen:!0})},[]),h=x.useCallback(()=>{i(g=>({...g,isOpen:!1}))},[]),p=x.useCallback(async()=>{try{await s(e,o.environment,{feature:o.featureName,action:"updateEnabled",payload:{enabled:!!o.enabled,shouldActivateDisabledStrategies:!!o.shouldActivateDisabledStrategies}}),r(),i(g=>({...g,isOpen:!1})),a({type:"success",title:"Changes added to the draft!"})}catch(g){n(P(g)),i(m=>({...m,isOpen:!1}))}},[s]);return{onChangeRequestToggle:d,onChangeRequestToggleClose:h,onChangeRequestToggleConfirm:p,changeRequestDialogDetails:o}},ut=({enabled:e,featureName:a,environment:n})=>t.jsxs(E,{"data-testid":"update-enabled-message",children:[t.jsx("strong",{children:e?"Enable":"Disable"})," feature toggle"," ",t.jsx("strong",{children:a})," in ",t.jsx("strong",{children:n})]}),dt=q("ul")(({theme:e})=>({margin:e.spacing(1),paddingLeft:e.spacing(2)})),ht=({isOpen:e,onAddDefaultStrategy:a,onActivateDisabledStrategies:n,onClose:s,environment:r,featureId:o})=>{var g,m,l;const i=H("projectId"),{feature:d}=Pe(i,o),h=(l=(m=(g=d.environments)==null?void 0:g.find(({name:u})=>u===r))==null?void 0:m.strategies)==null?void 0:l.filter(({disabled:u})=>u).length,p=h?h===1?"1 disabled strategy":`${h} disabled strategies`:"disabled strategies";return t.jsxs(_,{open:e,secondaryButtonText:"Cancel",permissionButton:t.jsxs(t.Fragment,{children:[t.jsx(N,{type:"button",variant:"outlined",permission:W,projectId:i,environmentId:r,onClick:a,children:"Add default strategy"}),t.jsx(N,{type:"button",variant:"outlined",permission:W,projectId:i,environmentId:r,onClick:n,children:"Enable all strategies"})]}),onClose:s,title:`Enable feature toggle in ${r}`,fullWidth:!0,children:[t.jsx(E,{sx:{mb:u=>u.spacing(3)},children:"A feature toggle cannot be enabled without an enabled strategy."}),t.jsx(E,{children:"To enable this feature toggle you can choose to:"}),t.jsxs(dt,{children:[t.jsx("li",{children:t.jsx(E,{children:t.jsx("strong",{children:"Add the default strategy"})})}),t.jsx("li",{children:t.jsxs(E,{children:[t.jsx("strong",{children:"Enable all the disabled strategies"})," ","(this feature toggle has ",p,")"]})})]})]})},gt=e=>{const a=n=>{n<e.length&&e[n](()=>a(n+1))};a(0)},qt=e=>{const{toggleFeatureEnvironmentOn:a,toggleFeatureEnvironmentOff:n}=U(),{setToastData:s,setToastApiError:r}=O(),[o,i]=x.useState({open:!1,label:"",loading:!1,onClose:()=>{},onClick:()=>{}}),[d,h]=x.useState({isOpen:!1,environment:"",featureId:"",onClose:()=>{},onActivateDisabledStrategies:()=>{},onAddDefaultStrategy:()=>{}}),{onChangeRequestToggle:p,onChangeRequestToggleClose:g,onChangeRequestToggleConfirm:m,changeRequestDialogDetails:l}=ct(e),[u,v]=x.useState(),b=x.useCallback(async(w,c)=>{let R=!1;return gt([j=>{if(c.isChangeRequestEnabled||!Oe(c.environmentType||""))return j();i({open:!0,label:`${w?"Enable":"Disable"} Environment`,loading:!1,onClose:()=>{var f;i(k=>({...k,open:!1})),(f=c.onRollback)==null||f.call(c)},onClick:()=>{i(f=>({...f,open:!1,loading:!0})),j()}})},j=>{if(w===!1||!c.hasStrategies||c.hasEnabledStrategies)return j();h({isOpen:!0,environment:c.environmentName,featureId:c.featureId,onClose:()=>{var f;h(k=>({...k,isOpen:!1})),(f=c.onRollback)==null||f.call(c)},onActivateDisabledStrategies:()=>{h(f=>({...f,isOpen:!1})),R=!0,j()},onAddDefaultStrategy:()=>{h(f=>({...f,isOpen:!1})),j()}})},j=>{if(!c.isChangeRequestEnabled)return j();v(()=>{var f;v(void 0),(f=c.onRollback)==null||f.call(c)}),p(c.featureId,c.environmentName,w,R)},async j=>{var f,k;if(w!==!1)return j();try{await n(c.projectId,c.featureId,c.environmentName),s({type:"success",title:`Disabled in ${c.environmentName}`,text:`${c.featureId} is unavailable in ${c.environmentName} and its strategies will no longer have any effect.`}),(f=c.onSuccess)==null||f.call(c)}catch(L){r(P(L)),(k=c.onRollback)==null||k.call(c)}},async j=>{var f,k;if(w!==!0)return j();try{await a(c.projectId,c.featureId,c.environmentName,R),s({type:"success",title:`Enabled in ${c.environmentName}`,text:`${c.featureId} is now available in ${c.environmentName} based on its defined strategies.`}),(f=c.onSuccess)==null||f.call(c)}catch(L){r(P(L)),(k=c.onRollback)==null||k.call(c)}}])},[i]),S=d.featureId.length!==0,C=t.jsxs(t.Fragment,{children:[t.jsx($e,{...o}),t.jsx(A,{condition:S,show:t.jsx(ht,{...d})}),t.jsx(Xe,{isOpen:l.isOpen,onClose:()=>{u==null||u(),g()},environment:l==null?void 0:l.environment,onConfirm:()=>{u==null||u(),m()},messageComponent:t.jsx(ut,{enabled:l==null?void 0:l.enabled,featureName:l==null?void 0:l.featureName,environment:l.environment})})]});return{onToggle:b,modals:C}},pt=q(Be)(({theme:e})=>({color:e.palette.warning.main,fontSize:e.fontSizes.bodySize})),Ft=()=>t.jsx(Ve,{arrow:!0,title:t.jsxs(t.Fragment,{children:["This environment has no variants enabled. If you check this feature's variants in this environment, you will get the"," ",t.jsx("a",{href:"https://docs.getunleash.io/reference/feature-toggle-variants#the-disabled-variant",target:"_blank",rel:"noreferrer",children:"disabled variant"}),"."]}),children:t.jsx(pt,{})});var G={},mt=Le;Object.defineProperty(G,"__esModule",{value:!0});var ie=G.default=void 0,ft=mt(_e()),xt=t,vt=(0,ft.default)((0,xt.jsx)("path",{d:"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10H7v-2h10v2z"}),"IndeterminateCheckBox");ie=G.default=vt;const bt=Ue(),Pt=({options:e,selectedOptions:a,indeterminateOptions:n,tagType:s,existingTags:r,disabled:o=!1,onChange:i})=>{const d=t.jsx(Ge,{fontSize:"small"}),h=l=>l.inputValue?l.inputValue:l.title,p=(l,u,{selected:v})=>{const b=(n==null?void 0:n.some(S=>S.title===u.title))??!1;return t.jsxs("li",{...l,children:[t.jsx(A,{condition:!!u.inputValue,show:t.jsx(Ne,{sx:{mr:S=>S.spacing(.5)}}),elseShow:t.jsx(He,{icon:d,checkedIcon:t.jsx(ze,{fontSize:"small"}),indeterminateIcon:t.jsx(ie,{fontSize:"small"}),sx:{mr:S=>S.spacing(.5)},checked:v&&!b,indeterminate:b})}),u.title]})},g=(l,u)=>l.map((v,b)=>r.some(C=>C.value===v.title&&C.type===s.name)&&n===void 0?null:t.jsx(Me,{...u({index:b}),label:v.title})),m=(l,u)=>{const v=bt(l,u),{inputValue:b}=u,S=l.some(C=>b===C.title);return b!==""&&!S&&v.push({inputValue:b,title:`Create new value "${b}"`}),v};return t.jsx(te,{multiple:!0,id:"checkboxes-tag",sx:{marginTop:l=>l.spacing(2),width:500},disableCloseOnSelect:!0,placeholder:"Select Values",options:e,value:a,renderTags:g,isOptionEqualToValue:(l,u)=>u.inputValue&&u.inputValue!==""?l.title===u.inputValue:l.title===u.title,getOptionLabel:h,renderOption:p,filterOptions:m,ListboxProps:{style:{maxHeight:200,overflow:"auto"}},onChange:i,renderInput:l=>t.jsx(se,{...l,label:"Select values",placeholder:"Select values"}),disabled:o})},yt=q("li")({flexDirection:"column"}),$t=({options:e,value:a,disabled:n=!1,onChange:s})=>{const r=We();return t.jsx(te,{disablePortal:!0,disabled:n,id:"tag-type-select",sx:{marginTop:o=>o.spacing(2),width:500},options:e,disableClearable:!0,value:a,getOptionLabel:o=>o.name,renderOption:(o,i)=>t.jsxs(yt,{...o,style:{alignItems:"flex-start",gap:r.spacing(.5)},children:[t.jsx(E,{variant:"body1",children:i.name}),t.jsx(E,{variant:"caption",children:i.description})]}),renderInput:o=>t.jsx(se,{...o,label:"Tag type",value:a}),onChange:s,ListboxProps:{style:{maxHeight:200,overflow:"auto"}}})},Ot=()=>{const{makeRequest:e,createRequest:a,errors:n,loading:s}=Je({propagateErrors:!0});return{createTag:async i=>{const h=a("api/admin/tags",{method:"POST",body:JSON.stringify(i)});return e(h.caller,h.id)},bulkUpdateTags:async(i,d)=>{const h=`api/admin/projects/${d}/tags`,p=a(h,{method:"PUT",body:JSON.stringify(i)});return e(p.caller,p.id)},errors:n,loading:s}},Bt=(e,a={})=>{const n=async()=>{const p=ne(`api/admin/tags/${e}`);return(await fetch(p,{method:"GET"}).then(ae("Tags"))).json()},s=`api/admin/tags/${e}`,{data:r,error:o}=Ye(!!e,{tags:[]},s,n,a),[i,d]=x.useState(!o&&!r),h=()=>{Ke(s)};return x.useEffect(()=>{d(!o&&!r)},[r,o]),{tags:(r==null?void 0:r.tags)||[],error:o,loading:i,refetch:h}},Vt=({isStale:e,isOpen:a,projectId:n,featureId:s,onClose:r})=>{const{setToastData:o,setToastApiError:i}=O(),{patchFeatureToggle:d}=U(),h=t.jsx(E,{children:"Setting a toggle to stale marks it for cleanup"}),p=t.jsx(E,{children:"Setting a toggle to active marks it as in active use"}),g=e?"active":"stale",m=async l=>{l.stopPropagation();try{await d(n,s,[{op:"replace",path:"/stale",value:!e}]),r()}catch(u){i(P(u))}o(e?{type:"success",title:"And we're back!",text:"The toggle is no longer marked as stale."}:{type:"success",title:"A job well done.",text:"The toggle has been marked as stale."})};return t.jsx(_,{open:a,secondaryButtonText:"Cancel",primaryButtonText:`Flip to ${g}`,title:`Set feature state to ${g}`,onClick:m,onClose:r,children:t.jsx(A,{condition:e,show:p,elseShow:h})})},jt=e=>fetch(e).then(ae("ChangeRequest")).then(a=>a.json()),St=(e,a)=>{const n=a.map(i=>`feature=${i}`).join("&"),{data:s,error:r,mutate:o}=Qe([],ne(`api/admin/projects/${e}/change-requests/scheduled?${n}`),jt);return{changeRequests:s,loading:!r&&!s,refetch:o,error:r}},Y=()=>t.jsx(D,{severity:"warning",sx:{m:e=>e.spacing(2,0)},children:"Archiving features with dependencies will also remove those dependencies."}),Tt=({ids:e,projectId:a})=>{const n=s=>`/projects/${a}/features/${s}`;return e?t.jsxs(D,{severity:"warning",sx:{m:s=>s.spacing(2,0)},children:[t.jsx(E,{fontWeight:"bold",variant:"body2",display:"inline",children:`${e.length} feature toggles `}),t.jsx("span",{children:"have usage from applications. If you archive these feature toggles they will not be available to Client SDKs:"}),t.jsx("ul",{children:e==null?void 0:e.map(s=>t.jsx("li",{children:t.jsx(V,{to:n(s),children:s})},s))})]}):null},K=({ids:e,projectId:a})=>{const n=s=>`/projects/${a}/features/${s}`;return e&&e.length>1?t.jsxs(D,{severity:"error",sx:{m:s=>s.spacing(2,0)},children:[t.jsx(E,{fontWeight:"bold",variant:"body2",display:"inline",children:`${e.length} feature toggles `}),t.jsx("span",{children:"have child features that depend on them and are not part of the archive operation. These parent features can not be archived:"}),t.jsx("ul",{children:e==null?void 0:e.map(s=>t.jsx("li",{children:t.jsx(V,{to:n(s),children:s})},s))})]}):e&&e.length===1?t.jsxs(D,{severity:"error",sx:{m:s=>s.spacing(2,0)},children:[t.jsx(V,{to:n(e[0]),children:e[0]})," has child features that depend on it and are not part of the archive operation."]}):null},Q=({changeRequests:e,projectId:a})=>e&&e.length>0?t.jsxs(D,{severity:"warning",sx:{m:n=>n.spacing(2,0)},children:[t.jsxs("p",{children:["This archive operation would conflict with"," ",e.length," scheduled change request(s). The change request(s) that would be affected by this are:"]}),t.jsx("ul",{children:e.map(({id:n,title:s})=>{const r=s?`#${n} (${s})`:`Change request #${n}`;return t.jsx("li",{children:t.jsx(V,{to:`/projects/${a}/change-requests/${n}`,target:"_blank",rel:"noopener noreferrer",title:`Change request ${n}`,children:r})},n)})})]}):e===void 0?t.jsx(D,{severity:"warning",children:t.jsx("p",{children:"This archive operation might conflict with one or more scheduled change requests. If you complete it, those change requests can no longer be applied."})}):null,Ct=(e,a)=>{const s=re(e)(),{isChangeRequestConfigured:r}=oe(e);return s&&r(s)&&a?"Add to change request":s&&r(s)?"Add change to draft":a?"Archive toggles":"Archive toggle"},At=({projectId:e,featureIds:a,onSuccess:n,onError:s})=>{const{setToastData:r,setToastApiError:o}=O(),{archiveFeatureToggle:i}=U(),{archiveFeatures:d}=M(),{isChangeRequestConfigured:h}=oe(e),{addChange:p}=ee(),{refetch:g}=z(e),m=re(e),l=(a==null?void 0:a.length)>1,u=m(),v=async()=>{if(!u){console.error("No change request environment");return}await p(e,u,a.map(C=>({action:"archiveFeature",feature:C,payload:void 0}))),g(),r({text:l?"Your archive feature toggles changes have been added to change request":"Your archive feature toggle change has been added to change request",type:"success",title:l?"Changes added to a draft":"Change added to a draft"})},b=async()=>{await i(e,a[0]),r({text:"Your feature toggle has been archived",type:"success",title:"Feature archived"})},S=async()=>{await d(e,a),r({text:"Selected feature toggles have been archived",type:"success",title:"Features archived"})};return async()=>{try{u&&h(u)?await v():l?await S():await b(),n()}catch(C){o(P(C)),s()}}},Et=(e,a,n)=>{const[s,r]=x.useState(!0),[o,i]=x.useState([]),[d,h]=x.useState(!1),{verifyArchiveFeatures:p}=M();return x.useEffect(()=>{n&&p(a,e).then(g=>g.json()).then(({hasDeletedDependencies:g,parentsWithChildFeatures:m})=>{m.length===0?(r(!1),i(m)):(r(!0),i(m)),h(g)})},[JSON.stringify(e),n,a,i,r,h]),{disableArchive:s,offendingParents:o,hasDeletedDependencies:d}},_t=({isOpen:e,onClose:a,onConfirm:n,projectId:s,featureIds:r,featuresWithUsage:o})=>{const i=(r==null?void 0:r.length)>1,d=Ct(s,i),h=i?"Archive feature toggles":"Archive feature toggle",p=At({projectId:s,featureIds:r,onSuccess(){n(),a()},onError(){a()}}),{changeRequests:g}=St(s,r),{disableArchive:m,offendingParents:l,hasDeletedDependencies:u}=Et(r,s,e),v=l.length===0&&u;return t.jsx(_,{onClick:p,open:e,onClose:a,primaryButtonText:d,secondaryButtonText:"Cancel",title:h,disabledPrimaryButton:m,children:t.jsx(A,{condition:i,show:t.jsxs(t.Fragment,{children:[t.jsxs("p",{children:["Are you sure you want to archive"," ",t.jsx("strong",{children:r==null?void 0:r.length})," feature toggles?"]}),t.jsx(A,{condition:!!(o&&(o==null?void 0:o.length)>0),show:t.jsx(Tt,{ids:o,projectId:s})}),t.jsx(A,{condition:l.length>0,show:t.jsx(K,{ids:l,projectId:s})}),t.jsx(A,{condition:v,show:t.jsx(Y,{})}),t.jsx(Q,{changeRequests:g,projectId:s}),t.jsx(A,{condition:(r==null?void 0:r.length)<=5,show:t.jsx("ul",{children:r==null?void 0:r.map(b=>t.jsx("li",{children:b},b))})})]}),elseShow:t.jsxs(t.Fragment,{children:[t.jsxs("p",{children:["Are you sure you want to archive"," ",i?"these feature toggles":"this feature toggle","?"]}),t.jsx(A,{condition:l.length>0,show:t.jsx(K,{ids:l,projectId:s})}),t.jsx(A,{condition:v,show:t.jsx(Y,{})}),t.jsx(Q,{changeRequests:g,projectId:s})]})})})};export{Xe as C,Rt as E,Dt as F,$t as T,Ft as V,kt as W,qt as a,Ot as b,Bt as c,Pt as d,_t as e,Vt as f,tt as u};
|
package/frontend/build/static/{FeatureMetricsChart-d6700d04.js → FeatureMetricsChart-ExGq1eXl.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`)},title:t=>`Time: ${c(t[0].parsed.x,a.locale)}`}},legend:{position:"top",align:"end",labels:{boxWidth:10,boxHeight:10,usePointStyle:!0}},title:{text:
|
|
1
|
+
import{gN as c,b as x,b_ as g,r as d,j as u}from"./index-JVRlSBvr.js";import{d as b,L as m,C as f,a as C,b as v,P as S,c as h,T as q,p as k,e as M,f as E}from"./chartjs-adapter-date-fns.esm-JSlDxtwH.js";const L=(e,s,n)=>{const a={label:"Total requests",borderColor:e.palette.primary.main,backgroundColor:e.palette.primary.main,data:p(s,n,o=>o.yes+o.no),elements:{point:{radius:6,pointStyle:"circle"},line:{borderDash:[8,4]}}},t={label:"Exposed",borderColor:e.palette.success.main,backgroundColor:e.palette.success.main,data:p(s,n,o=>o.yes),elements:{point:{radius:6,pointStyle:"triangle"}}},r={label:"Not exposed",borderColor:e.palette.error.main,backgroundColor:e.palette.error.main,data:p(s,n,o=>o.no),elements:{point:{radius:6,pointStyle:"triangle",pointRotation:180}}};return{datasets:[t,r,a]}},p=(e,s,n)=>e.map(a=>({x:a.timestamp,y:n(a),variants:a.variants})),$=(e,s)=>{if(s===0)return"";const[n,a]=e,t=Math.floor(Number(a)/s*100);return`${a} (${t}%) - ${n}`},j=(e,s,n,a)=>({locale:a.locale,responsive:!0,maintainAspectRatio:!1,interaction:{mode:"index",intersect:!1},color:e.palette.text.secondary,plugins:{tooltip:{backgroundColor:e.palette.background.paper,bodyColor:e.palette.text.primary,titleColor:e.palette.text.secondary,borderColor:e.palette.primary.main,borderWidth:1,padding:10,boxPadding:5,usePointStyle:!0,itemSort:(t,r)=>{const o=["Total requests","Exposed","Not exposed"],l=o.indexOf(t.dataset.label),i=o.indexOf(r.dataset.label);return l-i},callbacks:{label:t=>`${t.formattedValue} - ${t.dataset.label}`,afterLabel:t=>{const r=t.dataset.data[t.dataIndex];if(t.dataset.label!=="Exposed"||r.variants===void 0)return"";const{disabled:o,...l}=r.variants;return Object.entries(l).map(i=>$(i,r.y)).join(`
|
|
2
|
+
`)},title:t=>`Time: ${c(t[0].parsed.x,a.locale)}`}},legend:{position:"top",align:"end",labels:{boxWidth:10,boxHeight:10,usePointStyle:!0}},title:{text:P(n),position:"top",align:"start",display:!0,font:{size:16,weight:"400"},color:e.palette.text.primary}},scales:{y:{type:"linear",title:{display:!0,text:"Number of requests",color:e.palette.text.secondary},suggestedMin:0,ticks:{precision:0,color:e.palette.text.secondary},grid:{color:e.palette.divider,borderColor:e.palette.divider}},x:{type:"time",time:{unit:"hour"},grid:{display:!1},ticks:{callback:(t,r,o)=>c(o[r].value,a.locale),color:e.palette.text.secondary}}}}),P=e=>e===1?"Requests in the last hour":`Requests in the last ${e} hours`;b.font={...b.font,family:"Sen",size:13,weight:"400"};const R=({metrics:e,hoursBack:s,statsSectionId:n})=>{const a=x(),{locationSettings:t}=g(),r=d.useMemo(()=>[...e].sort((i,y)=>i.timestamp.localeCompare(y.timestamp)),[e]),o=d.useMemo(()=>j(a,r,s,t),[a,r,s,t]),l=d.useMemo(()=>L(a,r,t),[a,r,t]);return u.jsx("div",{style:{height:400},children:u.jsx(m,{options:o,data:l,"aria-label":"A feature metrics line chart, with three lines: all requests, positive requests, and negative requests.","aria-describedby":n})})};f.register(C,v,S,h,q,k,M,E);export{R as FeatureMetricsChart,R as default};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import{c as pt,j as t,s as u,aE as A,aF as M,aG as Ys,aH as Gs,C as b,aI as re,aJ as Ce,aK as J,aL as ve,aM as Ks,aN as Ne,r as g,aO as ce,aP as he,aQ as gt,aR as Js,aS as Qs,aT as Zs,aU as Xs,e as W,aV as ne,aW as te,g as N,T as H,aX as De,aY as fe,aZ as as,a_ as Q,a$ as ue,t as ee,x as ke,b0 as en,b1 as tn,b2 as Ie,M as pe,b3 as we,b4 as rs,b5 as me,b6 as ht,b7 as oe,ay as ae,b8 as He,J as ie,b9 as sn,ba as nn,bb as an,bc as ct,bd as rn,be as on,B as K,bf as cn,bg as ln,bh as dn,bi as un,bj as pn,bk as gn,bl as hn,bm as os,bn as fn,bo as xn,aw as mn,bp as yn,b as ft,ac as Pe,bq as xt,G as Te,K as jn,br as mt,h as Fe,bs as Ee,bt as is,bu as yt,bv as jt,bw as St,ax as ye,aj as le,bx as bt,by as cs,aA as We,bz as ls,bA as ds,bB as us,bC as Sn,bD as Ct,R as vt,bE as ps,Y as bn,bF as wt,bG as be,bH as ge,bI as gs,a1 as hs,bJ as Cn,bK as de,bL as vn,bM as wn,X as Tn,bN as En,bO as An,bP as Dn,bQ as Fn,bR as fs,bS as Rn,bT as $n,u as kn,bU as xs,bV as Tt,bW as In,bX as Pn,bY as Rt,bZ as ms,b_ as ys,b$ as Bn,c0 as js,c1 as On,c2 as Ln,c3 as _n,c4 as Et,c5 as Mn,c6 as Ue,c7 as qn,Q as Ss,D as Re,c8 as zn,c9 as Vn,ca as Nn,cb as Hn,cc as bs,cd as Cs,ce as Wn,cf as vs,cg as Un,ch as ws,ci as xe,cj as lt,ck as Yn,cl as Ts,cm as Gn,cn as Kn,f as Jn,co as Qn,cp as Ke,cq as $t,av as Zn,cr as Se,cs as kt,ct as Xn,cu as ea,cv as ta,l as sa,at as At,au as na,ao as It,cw as aa,cx as ra,cy as oa,cz as Pt,ab as Es,cA as ia,a3 as Je,af as ca,a5 as la,a6 as da,a7 as ua,a8 as pa,a9 as ga,aa as ha,cB as fa,cC as xa,cD as Bt,cE as ma,cF as As,q as ya,cG as Ot,cH as ja,cI as Sa,cJ as ba,cK as Ca,cL as va,cM as wa,al as Ta,cN as Ea,cO as Aa,cP as Da,cQ as Fa,cR as Ra,cS as $a,cT as ka,cU as Ia}from"./index-JVRlSBvr.js";import{C as Ds,u as Fs,a as Pa,F as Ba,V as Oa,b as La,c as _a,T as Ma,d as qa,W as za,e as Va,f as Na}from"./FeatureArchiveDialog-eHyhx7Yo.js";import{S as Ha}from"./StrategyItemContainer-JoMPKX3L.js";const Wa=pt(t.jsx("path",{d:"m20.54 5.23-1.39-1.68C18.88 3.21 18.47 3 18 3H6c-.47 0-.88.21-1.16.55L3.46 5.23C3.17 5.57 3 6.02 3 6.5V19c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V6.5c0-.48-.17-.93-.46-1.27zM12 17.5 6.5 12H10v-2h4v2h3.5L12 17.5zM5.12 5l.81-1h12l.94 1H5.12z"}),"Archive"),Ua=pt(t.jsx("path",{d:"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"}),"Assessment"),Ya=pt(t.jsx("path",{d:"M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9h-4v4h-2v-4H9V9h4V5h2v4h4v2z"}),"LibraryAdd"),Ga=u("div")(({theme:e})=>({borderRadius:e.spacing(1.5),backgroundColor:e.palette.background.paper,padding:e.spacing(4)})),Ka=()=>{const e=A("projectId"),s=A("featureId"),{feature:n}=M(e,s);return n.name?t.jsx(Ga,{children:t.jsx(Ys,{title:"Event log",feature:s,displayInline:!0})}):null},Ja=u("div")(({theme:e})=>({borderRadius:e.shape.borderRadiusLarge,color:e.palette.primary.contrastText,backgroundColor:e.palette.background.alternative,display:"flex",flexDirection:"column",maxWidth:"350px",minWidth:"350px",marginRight:e.spacing(2),[e.breakpoints.down(1e3)]:{width:"100%",maxWidth:"none",minWidth:"auto"}})),Qa=u("div")({padding:"1.5rem 1.5rem 0 1.5rem"}),Za=u("div")({display:"flex",alignItems:"center"}),Xa=u("h2")(({theme:e})=>({fontSize:e.fontSizes.bodySize,fontWeight:"normal",margin:0})),er=u("div")(({theme:e})=>({margin:e.spacing(2,0),display:"flex",flexDirection:"column"})),Lt=u("span")(({theme:e})=>({margin:e.spacing(1,0),fontSize:e.fontSizes.bodySize})),_t=u("div")(({theme:e})=>({display:"flex",alignItems:"center",color:e.palette.primary.contrastText})),tr=()=>{const e=A("projectId"),s=A("featureId"),{feature:n}=M(e,s),{project:r,description:a,type:o}=n,i=Ks(o);return t.jsx(Ja,{children:t.jsxs(Qa,{children:[t.jsxs(Za,{"data-loading":!0,children:[t.jsx(i,{sx:c=>({marginRight:c.spacing(2),height:"40px",width:"40px",fill:c.palette.primary.contrastText})})," ",t.jsxs(Xa,{children:[Gs(o||"")," toggle"]})]}),t.jsxs(er,{children:[t.jsxs(Lt,{"data-loading":!0,children:["Project: ",r]}),t.jsx(b,{condition:!!a,show:t.jsxs(Lt,{"data-loading":!0,children:[t.jsx("div",{children:"Description:"}),t.jsxs(_t,{children:[t.jsx("p",{children:a}),t.jsx(re,{projectId:e,permission:Ce,component:J,to:`/projects/${e}/features/${s}/settings`,tooltipProps:{title:"Edit description"},children:t.jsx(ve,{sx:c=>({color:c.palette.primary.contrastText})})})]})]}),elseShow:t.jsx("span",{"data-loading":!0,children:t.jsxs(_t,{children:["No description."," ",t.jsx(re,{projectId:e,permission:Ce,component:J,to:`/projects/${e}/features/${s}/settings`,tooltipProps:{title:"Edit description"},children:t.jsx(ve,{sx:c=>({color:c.palette.primary.contrastText})})})]})})})]})]})})},Mt={lastHourUsage:[],seenApplications:[]},sr=(e,s,n={})=>{const r=async()=>{const p=ce(`api/admin/client-metrics/features/${s}`),h=await fetch(p,{method:"GET"}).then(he("feature metrics"));return h.ok?h.json():Mt},a=`${e}_${s}_metrics`,{data:o,error:i}=Ne(a,r,{...n}),[c,l]=g.useState(!i&&!o),d=()=>{gt(a)};return g.useEffect(()=>{l(!i&&!o)},[o,i]),{metrics:o||Mt,error:i,loading:c,refetch:d,FEATURE_METRICS_CACHE_KEY:a}},nr=e=>({yes:0,no:0,environment:e,timestamp:""}),ar=(e,s)=>e.map(n=>s.lastHourUsage.find(a=>a.environment===n.name)||nr(n.name)),rr=e=>(s,n,r)=>(r.revalidateOnFocus=!1,r.revalidateIfStale=!1,r.revalidateOnReconnect=!1,e(s,n,r)),or=Js(Ne,rr),Rs=(e,s)=>{const{refetchFeature:n}=M(e,s),r=Qs(e,s),{data:a,error:o,mutate:i}=or(["useFeatureImmutable",r],()=>Zs(r)),c=g.useCallback(async()=>{await i(),await n()},[i,n]);return{feature:(a==null?void 0:a.body)||Xs,refetchFeature:c,loading:!o&&!a,status:a==null?void 0:a.status,error:o}},$s=(e,s,n)=>{const{setToastData:r,setToastApiError:a}=W(),{addChange:o}=ne(),{refetch:i}=te(e),[c,l]=g.useState({isOpen:!1}),d=g.useCallback((y,T,f)=>{l({featureName:s,environment:y,fromEnvironment:f,strategy:T,isOpen:!0})},[]),p=g.useCallback((y,T,f)=>{l({featureName:s,environment:y,fromEnvironment:f,strategies:T,isOpen:!0})},[]),h=g.useCallback(()=>{l({isOpen:!1})},[]),m=g.useCallback(async()=>{try{await o(e,c.environment,{feature:c.featureName,action:n,payload:c.strategy}),i(),l({isOpen:!1}),r({type:"success",title:"Changes added to the draft!"})}catch(y){a(N(y)),l({isOpen:!1})}},[o]),j=g.useCallback(async()=>{try{await Promise.all(c.strategies.map(y=>o(e,c.environment,{feature:c.featureName,action:n,payload:y}))),i(),l({isOpen:!1}),r({type:"success",title:"Changes added to the draft!"})}catch(y){a(N(y)),l({isOpen:!1})}},[o]);return{onChangeRequestAddStrategy:d,onChangeRequestAddStrategies:p,onChangeRequestAddStrategyClose:h,onChangeRequestAddStrategyConfirm:m,onChangeRequestAddStrategiesConfirm:j,changeRequestDialogDetails:c}},ir=({payload:e,fromEnvironment:s,environment:n})=>t.jsxs(H,{children:[t.jsxs("strong",{children:["Copy ",De((e==null?void 0:e.name)||"")," strategy"," "]})," ","from ",s," to ",n]}),cr=({environmentId:e,environments:s,strategy:n})=>{const r=A("projectId"),a=A("featureId"),[o,i]=g.useState(null),c=!!o,{addStrategyToFeature:l}=fe(),{setToastData:d,setToastApiError:p}=W(),{refetchFeature:h}=M(r,a),{refetchFeature:m}=Rs(r,a),j=()=>{i(null)},y=as(r),{isChangeRequestConfigured:T}=Q(r),{changeRequestDialogDetails:f,onChangeRequestAddStrategyClose:x,onChangeRequestAddStrategy:R,onChangeRequestAddStrategyConfirm:_}=$s(r,a,"addStrategy"),q=async C=>{const{id:v,...$}={...n,targetEnvironment:C};if(T(C)){await R(C,{id:v,...$},e);return}try{await l(r,a,C,n),h(),m(),d({title:"Strategy created",text:`Successfully copied a strategy to ${C}`,type:"success"})}catch(P){p(N(P))}j()},z=s.some(C=>y(ue,C));return t.jsxs("div",{children:[t.jsx(Ds,{isOpen:f.isOpen,onClose:x,environment:f==null?void 0:f.environment,onConfirm:_,messageComponent:t.jsx(ir,{fromEnvironment:f.fromEnvironment,payload:f.strategy})}),t.jsx(ee,{title:`Copy to another environment${z?"":" (Access denied)"}`,children:t.jsx("div",{children:t.jsx(ke,{size:"large",id:`copy-strategy-icon-menu-${n.id}`,"aria-controls":c?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":c?"true":void 0,onClick:C=>{i(C.currentTarget)},"data-testid":en,disabled:!z,children:t.jsx(tn,{})})})}),t.jsx(Ie,{id:"basic-menu",anchorEl:o,open:c,onClose:j,MenuListProps:{"aria-labelledby":`copy-strategy-icon-menu-${n.id}`},children:s.map(C=>{const v=y(ue,C);return t.jsx(ee,{title:v?"":"You don't have access to add a strategy to this environment",children:t.jsx("div",{children:t.jsxs(pe,{onClick:()=>q(C),disabled:!v,children:[t.jsx(b,{condition:!v,show:t.jsx(we,{children:t.jsx(rs,{fontSize:"small"})})}),t.jsxs(me,{children:["Copy to ",C]})]})})},C)})})]})},lr=e=>fetch(e).then(he("ChangeRequest")).then(s=>s.json()),ks=(e,s)=>{const{data:n,error:r,mutate:a}=ht([],ce(`api/admin/projects/${e}/change-requests/scheduled?strategyId=${s}`),lr);return{changeRequests:n,loading:!r&&!n,refetch:a,error:r}},dr=()=>t.jsx(ie,{severity:"error",children:"Removing the strategy will change which users receive access to the feature."}),ur=u("div")(({theme:e})=>({"> * + *":{marginTop:e.spacing(1)}})),pr=({changeRequests:e,projectId:s})=>e&&e.length>0?t.jsxs(ie,{severity:"warning",children:[t.jsx("p",{children:"This strategy is in use by at least one scheduled change request. If you remove it, those change requests can no longer be applied."}),t.jsx("p",{children:"The following scheduled change requests use this strategy:"}),t.jsx("ul",{children:e.map(({id:n,title:r})=>{const a=r?`#${n} (${r})`:`#${n}`;return t.jsx("li",{children:t.jsx(J,{to:`/projects/${s}/change-requests/${n}`,target:"_blank",rel:"noopener noreferrer",title:`Change request ${n}`,children:a})},n)})})]}):e===void 0?t.jsx(ie,{severity:"warning",children:t.jsx("p",{children:"This strategy may be in use by one or more scheduled change requests. If you remove it, those change requests can no longer be applied."})}):null,Is=({scheduledChangeRequestsForStrategy:e})=>t.jsxs(ur,{children:[t.jsx(dr,{}),t.jsx(pr,{projectId:e.projectId,changeRequests:e.changeRequests})]}),gr=({onRemove:e,onClose:s,isOpen:n,scheduledChangeRequestsForStrategy:r})=>t.jsx(oe,{title:"Are you sure you want to delete this strategy?",open:n,primaryButtonText:"Remove strategy",secondaryButtonText:"Cancel",onClick:e,onClose:s,children:t.jsx(Is,{scheduledChangeRequestsForStrategy:r})}),hr=u("div")(({theme:e})=>({marginTop:e.spacing(3),marginBottom:e.spacing(1)})),fr=({onRemove:e,onClose:s,isOpen:n,scheduledChangeRequestsForStrategy:r})=>t.jsxs(oe,{title:"Suggest changes",open:n,primaryButtonText:"Add suggestion to draft",secondaryButtonText:"Cancel",onClick:e,onClose:s,children:[t.jsx(Is,{scheduledChangeRequestsForStrategy:r}),t.jsx(hr,{children:t.jsx(H,{variant:"body2",color:"text.secondary",children:"Your suggestion:"})}),t.jsx(H,{fontWeight:"bold",children:"Remove strategy"})]}),xr=({projectId:e,featureId:s,environmentId:n,strategyId:r})=>{const{deleteStrategyFromFeature:a}=fe(),{setToastData:o,setToastApiError:i}=W(),c=ae(),{refetchFeature:l}=M(e,s);return async p=>{try{p.preventDefault(),await a(e,s,n,r),o({title:"Strategy deleted",type:"success"}),l(),c(He(e,s))}catch(h){i(N(h))}}},mr=({projectId:e,featureId:s,environmentId:n,strategyId:r})=>{const{addChange:a}=ne(),{refetch:o}=te(e),{setToastData:i,setToastApiError:c}=W();return async d=>{try{d.preventDefault(),await a(e,n,{action:"deleteStrategy",feature:s,payload:{id:r}}),i({title:"Changes added to the draft!",type:"success"}),await o()}catch(p){c(N(p))}}},yr=({projectId:e,featureId:s,environmentId:n,strategyId:r,isOpen:a,onClose:o})=>{const{isChangeRequestConfigured:i}=Q(e),{changeRequests:c}=ks(e,r),l={changeRequests:c,projectId:e},d=xr({featureId:s,projectId:e,strategyId:r,environmentId:n}),p=mr({featureId:s,projectId:e,strategyId:r,environmentId:n});return i(n)?t.jsx(fr,{isOpen:a,onClose:()=>o(),onRemove:async h=>{await p(h),o()},scheduledChangeRequestsForStrategy:l}):t.jsx(gr,{isOpen:a,onClose:()=>o(),onRemove:d,scheduledChangeRequestsForStrategy:l})},jr=({projectId:e,environmentId:s,featureId:n,strategy:r})=>{const{refetchFeature:a}=M(e,n),{setStrategyDisabledState:o}=fe(),{setToastData:i,setToastApiError:c}=W(),l=d=>async()=>{try{await o(e,n,s,r.id,!d),i({title:`Strategy ${d?"enabled":"disabled"}`,type:"success"}),a()}catch(p){c(N(p))}};return{onDisable:l(!1),onEnable:l(!0)}},Sr=({projectId:e,environmentId:s,featureId:n,strategy:r})=>{const{addChange:a}=ne(),{refetch:o}=te(e),{setToastData:i,setToastApiError:c}=W(),l=d=>async()=>{try{await a(e,s,{action:"updateStrategy",feature:n,payload:{...r,disabled:!d}}),i({title:"Changes added to the draft!",type:"success"}),await o()}catch(p){c(N(p))}};return{onSuggestDisable:l(!1),onSuggestEnable:l(!0)}},br=({isOpen:e,onClose:s,...n})=>{var j;const{projectId:r,environmentId:a}=n,{isChangeRequestConfigured:o}=Q(r),i=o(a),{onSuggestEnable:c,onSuggestDisable:l}=Sr({...n}),{onEnable:d,onDisable:p}=jr({...n}),h=!!((j=n.strategy)!=null&&j.disabled),m=y=>{y.preventDefault(),i?h?c():l():h?d():p(),s()};return t.jsx(oe,{title:i?`Add ${h?"enable":"disable"} strategy to change request?`:`Are you sure you want to ${h?"enable":"disable"} this strategy?`,open:e,primaryButtonText:i?"Add to draft":`${h?"Enable":"Disable"} strategy`,secondaryButtonText:"Cancel",onClick:m,onClose:()=>s(),children:t.jsx(b,{condition:i,show:t.jsx(sn,{environment:a}),elseShow:t.jsxs(ie,{severity:"error",children:[h?"Enabling":"Disabling"," the strategy will change which users receive access to the feature."]})})})};var Dt={},Cr=an;Object.defineProperty(Dt,"__esModule",{value:!0});var Ps=Dt.default=void 0,vr=Cr(nn()),wr=t,Tr=(0,vr.default)((0,wr.jsx)("path",{d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"}),"Delete");Ps=Dt.default=Tr;const Er=({projectId:e,strategy:s,featureId:n,environmentId:r})=>{const[a,o]=g.useState(null),[i,c]=g.useState(!1),[l,d]=g.useState(!1),p=!!a,h=T=>{o(T.currentTarget)},m=T=>{o(null),T.stopPropagation()},j=ct(rn,e,r),y=ct(on,e,r);return t.jsxs(t.Fragment,{children:[t.jsx(K,{sx:{display:"flex",alignItems:"center",textAlign:"center"},children:t.jsx(ee,{title:"More actions",children:t.jsx(ke,{onClick:h,size:"small","aria-controls":p?"actions-menu":void 0,"aria-haspopup":"true","aria-expanded":p?"true":void 0,"data-testid":cn,children:t.jsx(ln,{sx:{width:32,height:32}})})})}),t.jsxs(Ie,{anchorEl:a,id:"actions-menu",open:p,onClose:m,onClick:m,transformOrigin:{horizontal:"right",vertical:"top"},anchorOrigin:{horizontal:"right",vertical:"bottom"},"data-testid":dn,children:[t.jsx(ee,{title:s.disabled?"Enable strategy":"Disable strategy",arrow:!0,placement:"left",children:t.jsxs(pe,{disabled:!j,onClick:()=>c(!0),children:[t.jsx(we,{children:s.disabled?t.jsx(un,{}):t.jsx(pn,{})}),t.jsx(me,{children:s.disabled?"Enable":"Disable"})]})}),t.jsx(ee,{title:"Remove strategy",arrow:!0,placement:"left",children:t.jsxs(pe,{disabled:!y,onClick:()=>d(!0),"data-testid":gn,children:[t.jsx(we,{children:t.jsx(Ps,{})}),t.jsx(me,{children:"Remove"})]})})]}),t.jsx(br,{isOpen:i,onClose:()=>c(!1),projectId:e,featureId:n,environmentId:r,strategy:s}),t.jsx(yr,{isOpen:l,onClose:()=>d(!1),projectId:e,featureId:n,environmentId:r,strategyId:s.id})]})},Ar=({environmentId:e,strategy:s,onDragStart:n,onDragEnd:r,otherEnvironments:a,orderNumber:o,headerChildren:i})=>{const c=A("projectId"),l=A("featureId"),d=hn(c,l,e,s.id);return t.jsxs(Ha,{strategy:s,onDragStart:n,onDragEnd:r,orderNumber:o,actions:t.jsxs(t.Fragment,{children:[i,t.jsx(b,{condition:!!(a&&(a==null?void 0:a.length)>0),show:()=>t.jsx(cr,{environmentId:e,environments:a,strategy:s})}),t.jsx(re,{permission:os,environmentId:e,projectId:c,component:J,to:d,tooltipProps:{title:"Edit strategy"},"data-testid":`STRATEGY_EDIT-${s.name}`,children:t.jsx(ve,{})}),t.jsx(Er,{projectId:c,featureId:l,environmentId:e,strategy:s})]}),children:[t.jsx(fn,{strategy:s}),s.variants?t.jsx(xn,{variants:s.variants}):null]})},Dr=e=>fetch(e).then(he("ChangeRequest")).then(s=>s.json()),Bs=(e,s)=>{const{data:n,error:r,mutate:a}=ht([],ce(`api/admin/projects/${e}/change-requests/pending/${s}`),Dr);return{changeRequests:n,loading:!r&&!n,refetch:a,error:r}},Fr=(e,s,n,r)=>{const{user:a}=mn(),{changeRequests:o}=Bs(e,s),i=[],c=o==null?void 0:o.filter(l=>l.environment===n);return c==null||c.forEach(l=>{const d=l==null?void 0:l.features.find(h=>h.name===s),p=d==null?void 0:d.changes.find(h=>h.action==="updateStrategy"||h.action==="deleteStrategy"?h.payload.id===r:!1);if(p){const h=l.state==="Scheduled",m=!h&&l.createdBy.id===(a==null?void 0:a.id);h&&i.push({changeRequestId:l.id,change:p,isScheduledChange:h}),m&&i.push({changeRequestId:l.id,change:p,isScheduledChange:h})}}),i},Me=u("div")({display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center"}),qe=u("div")(({theme:e})=>({justifyContent:"center",paddingTop:e.spacing(.75),...yn})),ze=u("span")(({theme:e})=>({color:e.palette.text.secondary,marginRight:e.spacing(1)})),Ft=u(J)(({theme:e})=>({maxWidth:"100%",textDecoration:"none","&:hover, &:focus":{textDecoration:"underline"}})),Os=({scheduledChangeRequestIds:e})=>{const s=ft(),n=Pe(s.breakpoints.down("sm")),r=A("projectId");return n?null:t.jsx(K,{sx:{mr:1.5},children:t.jsx(xt,{tooltip:t.jsx(t.Fragment,{children:e==null?void 0:e.map((a,o)=>t.jsxs(Ft,{to:`/projects/${r}/change-requests/${a}`,children:["Change request #",a]},`${r}-${o}`))}),children:t.jsx(Te,{color:"warning",children:"Changes Scheduled"})})})},Rr=({strategy:e,index:s,environmentName:n,otherEnvironments:r,isDragging:a,onDragStartRef:o,onDragOver:i,onDragEnd:c})=>{const l=A("projectId"),d=A("featureId"),p=g.useRef(null),h=Fr(l,d,n,e.id),{changeRequests:m}=ks(l,e.id);return t.jsxs(K,{ref:p,onDragOver:i(p,s),sx:{opacity:a?"0.5":"1"},children:[t.jsx(b,{condition:s>0,show:t.jsx(jn,{text:"OR"})}),t.jsx(Ar,{strategy:e,environmentId:n,otherEnvironments:r,onDragStart:o(p,s),onDragEnd:c,orderNumber:s+1,headerChildren:kr(h,m)})]},e.id)},$r=({change:e})=>{const s=ft();return Pe(s.breakpoints.down("sm"))?null:t.jsxs(K,{sx:{mr:1.5},children:[t.jsx(b,{condition:(e==null?void 0:e.action)==="updateStrategy",show:t.jsx(Te,{color:"warning",children:"Modified in draft"})}),t.jsx(b,{condition:(e==null?void 0:e.action)==="deleteStrategy",show:t.jsx(Te,{color:"error",children:"Deleted in draft"})})]})},kr=(e,s)=>{const n=[];if((e==null?void 0:e.length)===0&&(s==null?void 0:s.length)===0)return[];const r=e==null?void 0:e.find(({isScheduledChange:a})=>!a);return r&&n.push(t.jsx($r,{change:r.change},`draft-change#${r.change.id}`)),s&&s.length>0&&n.push(t.jsx(Os,{scheduledChangeRequestIds:s.map(a=>a.id)},"scheduled-changes")),n},Ir=({environmentId:e,environments:s,onClick:n})=>{const r=A("projectId"),[a,o]=g.useState(null),i=!!a,{hasAccess:c}=g.useContext(mt),l=s.some(d=>c(ue,r,d));return t.jsxs("div",{children:[t.jsx(ee,{title:l?"":"(Access denied)",children:t.jsx("div",{children:t.jsx(Fe,{id:`copy-all-strategies-${e}`,"aria-controls":i?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":i?"true":void 0,onClick:d=>{o(d.currentTarget)},disabled:!l,variant:"outlined",children:"Copy from another environment"})})}),t.jsx(Ie,{id:"basic-menu",anchorEl:a,open:i,onClose:()=>{o(null)},MenuListProps:{"aria-labelledby":`copy-all-strategies-${e}`},children:s.map(d=>{const p=c(ue,r,d);return t.jsx(ee,{title:p?"":"You don't have access to add a strategy to this environment",children:t.jsx("div",{children:t.jsxs(pe,{onClick:()=>n(d),disabled:!p,children:[t.jsx(b,{condition:!p,show:t.jsx(we,{children:t.jsx(rs,{fontSize:"small"})})}),t.jsxs(me,{children:["Copy from ",d]})]})})},d)})})]})},Pr=u("div")(({theme:e})=>({"&>*:nth-child(n)":{margin:e.spacing(1,0)}})),Br=({payload:e,fromEnvironment:s,environment:n})=>t.jsxs(Pr,{children:[t.jsx(H,{children:t.jsx("strong",{children:"Copy: "})}),e==null?void 0:e.map(r=>t.jsxs(H,{children:[t.jsxs("strong",{children:[De((r==null?void 0:r.name)||"")," strategy"," "]})," "]})),t.jsxs(H,{children:["from ",s," to ",n]})]}),Ls=(e,s)=>{const n={};return s.parameters.forEach(r=>{n[r.name]=Or(e,r)}),{name:s.name,constraints:[],parameters:n}},Or=(e,s)=>s.name==="rollout"||s.name==="percentage"||s.type==="percentage"?"50":s.name==="stickiness"?"":s.name==="groupId"?e:s.type==="boolean"?"false":"",Lr=()=>{const e=A("projectId"),s=A("featureId"),n=Ee("environmentId"),r=Ee("strategyName"),{strategy:a,defaultStrategyFallback:o}=Fs(e,n),i=JSON.parse(is().get("defaultStrategy")||"false"),{segments:c}=yt(),l=(c||[]).filter(L=>{var X;return(X=a==null?void 0:a.segments)==null?void 0:X.includes(L.id)}),[d,p]=g.useState({}),[h,m]=g.useState(i?l:[]),{strategyDefinition:j}=jt(r),y=St(),{addStrategyToFeature:T,loading:f}=fe(),{addChange:x}=ne(),{setToastData:R,setToastApiError:_}=W(),{uiConfig:q}=ye(),{unleashUrl:z}=q,C=ae(),{feature:v,refetchFeature:$}=M(e,s),P=g.useRef(v),{isChangeRequestConfigured:V}=Q(e),{refetch:Y}=te(e),{trackEvent:U}=le(),{data:S,staleDataNotification:k,forceRefreshCache:w}=bt({unleashGetter:M,params:[e,s],dataKey:"feature",refetchFunctionKey:"refetchFeature",options:{}},v,{afterSubmitAction:$},Ct);g.useEffect(()=>{P.current.name===""&&v.name&&(w(v),P.current=v)},[v.name]),g.useEffect(()=>{var L;if(i){const X=a||o;((L=X.parameters)==null?void 0:L.groupId)===""&&s?p({...X,parameters:{...X.parameters,groupId:s}}):p(X)}else j&&p(Ls(s,j))},[s,JSON.stringify(j),i]);const E=async L=>{await T(e,s,n,L),R({title:"Strategy created",type:"success",confetti:!0})},F=async L=>{await x(e,n,{action:"addStrategy",feature:s,payload:L}),R({title:"Strategy added to draft",type:"success",confetti:!0}),Y()},B=cs(d,h),O=async()=>{U("strategyTitle",{props:{hasTitle:!!d.title,on:"create"}});try{V(n)?await F(B):await E(B),$(),C(He(e,s))}catch(L){_(N(L))}};return!S||!S.project?null:t.jsxs(We,{modal:!0,title:De(r),description:ls,documentationLink:ds,documentationLinkLabel:us,formatApiCode:()=>_r(e,s,n,B,z),children:[t.jsx(Sn,{projectId:e,feature:S,strategy:d,setStrategy:p,segments:h,setSegments:m,environmentId:n,onSubmit:O,loading:f,permission:ue,errors:y,isChangeRequest:V(n)}),k]})},_s=(e,s,n,r,a=!1)=>{const o=new URLSearchParams({environmentId:n,strategyName:r,defaultStrategy:String(a)});return`/projects/${e}/features/${s}/strategies/create?${o}`},_r=(e,s,n,r,a)=>{if(!a)return"";const o=`${a}/api/admin/projects/${e}/features/${s}/environments/${n}/strategies`,i=JSON.stringify(r,void 0,2);return`curl --location --request POST '${o}' \\
|
|
2
|
+
--header 'Authorization: INSERT_API_KEY' \\
|
|
3
|
+
--header 'Content-Type: application/json' \\
|
|
4
|
+
--data-raw '${i}'`},Mr=u("div")(({theme:e})=>({width:e.spacing(4),height:"auto","& > svg":{fill:e.palette.primary.main},"& > div":{height:e.spacing(2),marginLeft:"-.75rem",color:e.palette.primary.main}})),qr=u("div")(({theme:e})=>({fontSize:e.fontSizes.smallBody})),zr=u(vt)(({theme:e})=>({fontWeight:e.fontWeight.bold})),Vr=u(J)(({theme:e})=>({display:"grid",gridTemplateColumns:"3rem 1fr",width:"20rem",padding:e.spacing(2),color:"inherit",textDecoration:"inherit",lineHeight:1.25,borderWidth:"1px",borderStyle:"solid",borderColor:e.palette.divider,borderRadius:e.spacing(1),"&:hover, &:focus":{borderColor:e.palette.primary.main}})),Qe=({projectId:e,featureId:s,environmentId:n,strategy:r,defaultStrategy:a})=>{const o=ps(r.name),i=De(r.name),{trackEvent:c}=le(),l=_s(e,s,n,r.name,a),d=()=>{c("strategy-add",{props:{buttonTitle:r.displayName||i}})};return t.jsxs(Vr,{to:l,onClick:d,children:[t.jsx(Mr,{children:t.jsx(o,{})}),t.jsxs("div",{children:[t.jsx(zr,{text:r.displayName||i,maxWidth:"200",maxLength:25}),t.jsx(qr,{children:r.description})]})]})},Ze=u(H)(({theme:e})=>({fontSize:e.fontSizes.smallBody,padding:e.spacing(1,2)})),Nr=({projectId:e,featureId:s,environmentId:n})=>{const{strategies:r}=bn(),a=r.filter(c=>!c.deprecated&&!c.editable),o=r.filter(c=>!c.deprecated&&c.editable),i={name:"flexibleRollout",displayName:"Default strategy",description:"This is the default strategy defined for this environment in the project"};return t.jsxs(wt,{dense:!0,children:[t.jsxs(t.Fragment,{children:[t.jsxs(Ze,{color:"textSecondary",children:[n," environment default strategy"]}),t.jsx(be,{children:t.jsx(Qe,{projectId:e,featureId:s,environmentId:n,strategy:i,defaultStrategy:!0})},i.name)]}),t.jsx(Ze,{color:"textSecondary",children:"Predefined strategy types"}),a.map(c=>t.jsx(be,{children:t.jsx(Qe,{projectId:e,featureId:s,environmentId:n,strategy:c})},c.name)),t.jsx(b,{condition:o.length>0,show:t.jsxs(t.Fragment,{children:[t.jsx(Ze,{color:"textSecondary",children:"Custom strategies"}),o.map(c=>t.jsx(be,{children:t.jsx(Qe,{projectId:e,featureId:s,environmentId:n,strategy:c})},c.name))]})})]})},Hr=u("div")({flexShrink:0}),Wr=u(ge)(({theme:e})=>({minWidth:0,width:e.spacing(4.5),alignItems:"center",justifyContent:"center",align:"center",flexDirection:"column",marginLeft:e.spacing(1)})),dt=({label:e,projectId:s,featureId:n,environmentId:r,variant:a,size:o,matchWidth:i})=>{const[c,l]=g.useState(),d=ae(),{trackEvent:p}=le(),h=!!c,m=h?"FeatureStrategyMenuPopover":void 0,j=()=>{l(void 0)},y=x=>{p("strategy-add",{props:{buttonTitle:e}}),d(f)},T=x=>{l(x.currentTarget)},f=_s(s,n,r,"flexibleRollout",!0);return t.jsxs(Hr,{onClick:x=>x.stopPropagation(),children:[t.jsx(ge,{permission:ue,projectId:s,environmentId:r,onClick:y,"aria-labelledby":m,variant:a,size:o,sx:{minWidth:i?"282px":"auto"},children:e}),t.jsx(Wr,{permission:ue,projectId:s,environmentId:r,onClick:T,"aria-labelledby":m,variant:"outlined",size:o,hideLockIcon:!0,tooltipProps:{title:"More strategies"},children:t.jsx(gs,{sx:x=>({margin:x.spacing(.25,0)})})}),t.jsx(hs,{id:m,open:h,anchorEl:c,onClose:j,onClick:j,PaperProps:{sx:x=>({paddingBottom:x.spacing(1)})},children:t.jsx(Nr,{projectId:s,featureId:n,environmentId:r})})]})},Ur=u("div")(({theme:e})=>({display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",paddingTop:e.spacing(2)})),Yr=u("div")(({theme:e})=>({fontSize:e.fontSizes.bodySize,textAlign:"center",color:e.palette.text.primary,marginBottom:e.spacing(1)})),Gr=u("p")(({theme:e})=>({color:e.palette.text.secondary,fontSize:e.fontSizes.smallBody,textAlign:"center",marginBottom:e.spacing(3),a:{color:e.palette.links}})),Kr=({projectId:e,featureId:s,environmentId:n})=>{const{addStrategyToFeature:r}=fe(),{setToastData:a,setToastApiError:o}=W(),{refetchFeature:i}=M(e,s),{refetchFeature:c}=Rs(e,s),{feature:l}=M(e,s),d=l==null?void 0:l.environments.filter(R=>R.name!==n&&R.strategies&&R.strategies.length>0),{isChangeRequestConfigured:p}=Q(e),{changeRequestDialogDetails:h,onChangeRequestAddStrategies:m,onChangeRequestAddStrategiesConfirm:j,onChangeRequestAddStrategyClose:y}=$s(e,s,"addStrategy"),T=(R=!1)=>{i(),c(),a({title:R?"Strategies created":"Strategy created",text:R?"Successfully copied from another environment":"Successfully created strategy",type:"success"})},f=async R=>{var q;const _=((q=d==null?void 0:d.find(z=>z.name===R))==null?void 0:q.strategies)||[];if(p(n)){await m(n,_,R);return}try{await Promise.all(_.map(z=>{const{id:C,...v}={...z,environment:n};return r(e,s,n,v)})),T(!0)}catch(z){o(N(z))}},x=d&&d.length>0;return t.jsxs(t.Fragment,{children:[t.jsx(Ds,{isOpen:h.isOpen,onClose:y,environment:h==null?void 0:h.environment,onConfirm:j,messageComponent:t.jsx(Br,{fromEnvironment:h.fromEnvironment,payload:h.strategies})}),t.jsxs(Ur,{children:[t.jsx(Yr,{children:"You have not defined any strategies yet."}),t.jsxs(Gr,{children:["Strategies added in this environment will only be executed if the SDK is using an"," ",t.jsx(J,{to:"/admin/api",children:"API key configured"})," for this environment."]}),t.jsxs(K,{sx:{w:"100%",display:"flex",flexWrap:"wrap",gap:2,alignItems:"center",justifyContent:"center"},children:[t.jsx(dt,{label:"Add your first strategy",projectId:e,featureId:s,environmentId:n,matchWidth:x}),t.jsx(b,{condition:x,show:t.jsx(Ir,{environmentId:n,environments:d.map(R=>R.name),onClick:f})})]})]})]})},Jr=u("div")(({theme:e})=>({width:"100%",position:"relative",paddingBottom:e.spacing(2)})),Qr=u("div")(({theme:e})=>({[e.breakpoints.down(400)]:{padding:e.spacing(1)}})),Zr=({featureEnvironment:e,isDisabled:s,otherEnvironments:n})=>{const r=A("projectId"),a=A("featureId"),{setStrategiesSortOrder:o}=fe(),{addChange:i}=ne(),{isChangeRequestConfigured:c}=Q(r),{refetch:l}=te(r),{setToastData:d,setToastApiError:p}=W(),{refetchFeature:h}=M(r,a),[m,j]=g.useState((e==null?void 0:e.strategies)||[]),[y,T]=g.useState(null);if(g.useEffect(()=>{j((e==null?void 0:e.strategies)||[])},[e==null?void 0:e.strategies]),!e)return null;const f=async C=>{try{await o(r,a,e.name,C),h(),d({title:"Order of strategies updated",type:"success"})}catch(v){p(N(v))}},x=async C=>{await i(r,e.name,{action:"reorderStrategy",feature:a,payload:C}),d({title:"Strategy execution order added to draft",type:"success",confetti:!0}),l()},R=async C=>{try{c(e.name)?await x(C):await f(C)}catch(v){p(N(v))}},_=(C,v)=>$=>{var P;T({id:m[v].id,index:v,height:((P=C.current)==null?void 0:P.offsetHeight)||0}),C!=null&&C.current&&($.dataTransfer.effectAllowed="move",$.dataTransfer.setData("text/html",C.current.outerHTML),$.dataTransfer.setDragImage(C.current,20,20))},q=C=>(v,$)=>P=>{if(y===null||v.current===null||y.index===$||C===y.id)return;const{top:V,bottom:Y}=v.current.getBoundingClientRect(),U=P.clientY-V<y.height,S=Y-P.clientY<y.height,k=y.index>$;if(U&&k||S&&!k){const w=[...m],E=w.splice(y.index,1)[0];w.splice($,0,E),j(w),T({...y,index:$})}},z=()=>{T(null),R(m.map((C,v)=>({id:C.id,sortOrder:v})))};return t.jsx(Jr,{children:t.jsxs(Qr,{children:[t.jsx(b,{condition:m.length>0&&s,show:()=>t.jsx(ie,{severity:"warning",sx:{mb:2},children:"This environment is disabled, which means that none of your strategies are executing."})}),t.jsx(b,{condition:m.length>0,show:t.jsx(t.Fragment,{children:m.map((C,v)=>t.jsx(Rr,{strategy:C,index:v,environmentName:e.name,otherEnvironments:n,isDragging:(y==null?void 0:y.id)===C.id,onDragStartRef:_,onDragOver:q(C.id),onDragEnd:z},C.id))}),elseShow:t.jsx(Kr,{projectId:r,featureId:a,environmentId:e.name})})]})})},Ms=(e,s)=>e===0?0:Math.round(s/e*100);var Ye={},Ge={};Object.defineProperty(Ge,"__esModule",{value:!0});Ge.defaultOptions=void 0;Ge.defaultOptions={lowercase:!1,precision:1,space:!1,units:["","K","M","B","T","P","E"]};var se={};Object.defineProperty(se,"__esModule",{value:!0});se.getLocales=se.getFractionDigits=se.roundTo=se.parseValue=void 0;function Xr(e){const s=parseFloat(e==null?void 0:e.toString());if(isNaN(s))throw new Error("Input value is not a number");if(s>Number.MAX_SAFE_INTEGER||s<Number.MIN_SAFE_INTEGER)throw new RangeError("Input value is outside of safe integer range");return s}se.parseValue=Xr;function eo(e,s){if(!Number.isFinite(e))throw new Error("Input value is not a finite number");if(!Number.isInteger(s)||s<0)throw new Error("Precision is not a positive integer");return Number.isInteger(e)?e:parseFloat(e.toFixed(s))}se.roundTo=eo;function to(e){var s;if(Number.isInteger(e))return 0;const n=e.toString().split(".")[1];return(s=n==null?void 0:n.length)!==null&&s!==void 0?s:0}se.getFractionDigits=to;function so(){var e;return typeof navigator>"u"?[]:Array.from((e=navigator.languages)!==null&&e!==void 0?e:[])}se.getLocales=so;Object.defineProperty(Ye,"__esModule",{value:!0});Ye.millify=void 0;const qt=Ge,Oe=se,zt=1e3;function*Vt(e){let s=zt;for(;;){const n=e/s;if(n<1)return;yield n,s*=zt}}function qs(e,s){var n,r;const a=s?{...qt.defaultOptions,...s}:qt.defaultOptions;if(!Array.isArray(a.units)||!a.units.length)throw new Error("Option `units` must be a non-empty array");let o;try{o=Oe.parseValue(e)}catch(y){return y instanceof Error&&console.warn(`WARN: ${y.message} (millify)`),String(e)}const i=o<0?"-":"";o=Math.abs(o);let c=0;for(const y of Vt(o))o=y,c+=1;if(c>=a.units.length)return e.toString();let d=Oe.roundTo(o,a.precision);for(const y of Vt(d))d=y,c+=1;const p=(n=a.units[c])!==null&&n!==void 0?n:"",h=a.lowercase?p.toLowerCase():p,m=a.space?" ":"",j=d.toLocaleString((r=a.locales)!==null&&r!==void 0?r:Oe.getLocales(),{minimumFractionDigits:Oe.getFractionDigits(d)});return`${i}${j}${m}${h}`}Ye.millify=qs;var no=Ye.default=qs;const Ve=({value:e,threshold:s=1e6,precision:n=2})=>{let r,a=!1;e<s?r=e.toLocaleString():(r=no(e,{precision:n}),a=!0);const o=t.jsx("span",{"data-testid":Cn,children:r});return t.jsx(b,{condition:a,show:t.jsx(ee,{title:e.toLocaleString(),arrow:!0,children:o}),elseShow:o})},Xe=u("article")(({theme:e})=>({padding:e.spacing(2),background:"transparent",borderRadius:e.spacing(2),textAlign:"center",[e.breakpoints.up("md")]:{padding:e.spacing(4)}})),et=u("h3")(({theme:e})=>({margin:0,fontSize:e.fontSizes.bodySize,fontWeight:e.fontWeight.thin})),tt=u("p")(({theme:e})=>({fontSize:"2.25rem",fontWeight:e.fontWeight.bold,color:e.palette.primary.main})),st=u("p")(({theme:e})=>({margin:e.spacing(1,0,0,0),padding:e.spacing(2,0,0,0),borderTopWidth:"1px",borderTopStyle:"solid",borderTopColor:e.palette.divider,fontSize:e.fontSizes.smallerBody,color:e.palette.text.secondary})),zs=({totalYes:e,totalNo:s,hoursBack:n,statsSectionId:r,tableSectionId:a})=>{const o=n===1?"in the last hour":`in the last ${n} hours`;return t.jsxs(de,{container:!0,spacing:2,id:r,"aria-describedby":a,"aria-label":"Feature metrics summary",component:"section",children:[t.jsx(de,{item:!0,xs:12,sm:4,children:t.jsxs(Xe,{children:[t.jsx(et,{children:"Exposure"}),t.jsx(tt,{children:t.jsx(Ve,{value:e})}),t.jsxs(st,{children:["Total exposure of the feature in the environment"," ",o,"."]})]})}),t.jsx(de,{item:!0,xs:12,sm:4,children:t.jsxs(Xe,{children:[t.jsx(et,{children:"Exposure %"}),t.jsxs(tt,{children:[Ms(e+s,e),"%"]}),t.jsxs(st,{children:["% total exposure of the feature in the environment"," ",o,"."]})]})}),t.jsx(de,{item:!0,xs:12,sm:4,children:t.jsxs(Xe,{children:[t.jsx(et,{children:"Requests"}),t.jsx(tt,{children:t.jsx(Ve,{value:e+s})}),t.jsxs(st,{children:["Total requests for the feature in the environment"," ",o,"."]})]})})]})},ao=u("div")(({theme:e})=>({display:"flex",alignItems:"center",justifyContent:"center",margin:"1rem 0",position:"relative","&:before":{content:'""',position:"absolute",top:"50%",transform:"translateY(-50%)",height:2,width:"100%",backgroundColor:e.palette.divider}})),ro=u("span")(({theme:e})=>({fontSize:e.fontSizes.bodySize,textAlign:"center",padding:"0 1rem",background:e.palette.envAccordion.expanded,position:"relative",maxWidth:"80%",color:e.palette.text.primary})),oo=({children:e})=>t.jsx(ao,{children:t.jsx(ro,{children:e})}),io=({environmentMetric:e})=>e?t.jsxs(t.Fragment,{children:[t.jsx(oo,{children:"Feature toggle exposure"}),t.jsx("div",{children:t.jsx(zs,{totalYes:e.yes,totalNo:e.no,hoursBack:1})})]}):null,Nt=u("div")({marginLeft:"auto",display:"flex",alignItems:"center"}),Ht=u("div")(({theme:e})=>({marginRight:e.spacing(1),display:"flex",flexDirection:"column"})),Wt=u("p")(({theme:e})=>({color:e.palette.primary.main,textAlign:"right",fontSize:e.fontSizes.bodySize})),Ut=u("p")(({theme:e})=>({maxWidth:"270px",marginTop:e.spacing(.5),fontSize:e.fontSizes.smallBody,textAlign:"right",[e.breakpoints.down(700)]:{display:"none"}})),co=u(vn)(({theme:e})=>({fill:e.palette.background.elevation2,height:"75px",width:"75px",[e.breakpoints.down(500)]:{display:"none"}})),lo=u("div")(({theme:e})=>({margin:e.spacing(0,2),[e.breakpoints.down(500)]:{display:"none"}})),uo=({environmentMetric:e,disabled:s=!1})=>{const n=wn();if(!e)return null;const r=e.yes+e.no,a=Ms(r,e==null?void 0:e.yes);return!e||e.yes===0&&e.no===0?t.jsxs(Nt,{children:[t.jsxs(Ht,{children:[t.jsxs(Wt,{style:{color:s?n.palette.text.secondary:void 0},"data-loading":!0,children:[a,"%"]}),t.jsxs(Ut,{style:{color:s?n.palette.text.secondary:n.palette.text.primary},"data-loading":!0,children:["The feature has been requested ",t.jsx("b",{children:"0 times"})," and exposed",t.jsx("b",{children:" 0 times"})," in the last hour"]})]}),t.jsx(co,{style:{transform:"scale(1.1)"},"data-loading":!0})]}):t.jsxs(Nt,{children:[t.jsxs(Ht,{children:[t.jsxs(Wt,{children:[a,"%"]}),t.jsxs(Ut,{children:["The feature has been requested"," ",t.jsxs("b",{children:[t.jsx(Ve,{value:r})," times"]})," ","and exposed"," ",t.jsxs("b",{children:[t.jsx(Ve,{value:e.yes})," ","times"]})," ","in the last hour"]})]}),t.jsx(lo,{"data-loading":!0,children:t.jsx(Tn,{percentage:a,size:"3rem"})})]})},nt=({strategy:e})=>{const s=ps(e.name);return t.jsx(ee,{title:De(e.name)+(e.title?` - ${e.title}`:""),arrow:!0,children:t.jsx(po,{children:t.jsx(s,{})})})},po=u("div")(({theme:e})=>({display:"flex",alignItems:"center",justifyContent:"center",color:e.palette.action.disabled,"& svg":{width:e.spacing(2.5),height:e.spacing(2.5)}})),Yt=u("ul")(()=>({all:"unset",display:"flex",alignItems:"center",alignContent:"center"})),at=u("li")(()=>({all:"unset",minWidth:30,textAlign:"center"})),go=u("div")(({theme:e})=>({display:"flex",flexDirection:"row",alignItems:"center",gap:e.spacing(1)})),Le=5,ho=({strategies:e})=>e!=null&&e.length?e.length>Le+1?t.jsxs(Yt,{"aria-label":"Feature strategies",children:[e.slice(0,Le).map(s=>t.jsx(at,{children:t.jsx(nt,{strategy:s})},s.id)),t.jsxs(xt,{tooltip:e.slice(Le).map(s=>t.jsx(at,{children:t.jsxs(go,{children:[t.jsx(nt,{strategy:s})," ",De(s.name)+(s.title?` - ${s.title}`:"")]})},s.id)),children:["(+",e.length-Le,")"]})]}):t.jsx(Yt,{"aria-label":"Feature strategies",children:e.map(s=>t.jsx(at,{children:t.jsx(nt,{strategy:s})},s.id))}):null,fo=u("div",{shouldForwardProp:e=>e!=="enabled"})(({theme:e,enabled:s})=>({borderRadius:e.shape.borderRadiusLarge,marginBottom:e.spacing(2),backgroundColor:s?e.palette.background.paper:e.palette.envAccordion.disabled})),xo=u(En)({boxShadow:"none",background:"none"}),mo=u(An)(({theme:e})=>({boxShadow:"none",padding:e.spacing(2,4),[e.breakpoints.down(400)]:{padding:e.spacing(1,2)}})),yo=u(Dn,{shouldForwardProp:e=>e!=="enabled"})(({theme:e})=>({padding:e.spacing(3),background:e.palette.envAccordion.expanded,borderBottomLeftRadius:e.shape.borderRadiusLarge,borderBottomRightRadius:e.shape.borderRadiusLarge,boxShadow:"inset 0px 2px 4px rgba(32, 32, 33, 0.05)",[e.breakpoints.down("md")]:{padding:e.spacing(2,1)}})),jo=u(Zr)(({theme:e})=>({width:"100%",position:"relative",paddingBottom:e.spacing(2)})),So=u("div",{shouldForwardProp:e=>e!=="enabled"})(({theme:e,enabled:s})=>({display:"flex",justifyContent:"center",flexDirection:"column",color:s?e.palette.text.primary:e.palette.text.secondary})),bo=u("div")(({theme:e})=>({display:"flex",alignItems:"center",[e.breakpoints.down(560)]:{flexDirection:"column",textAlign:"center"}})),Co=u(Fn)(({theme:e})=>({[e.breakpoints.down(560)]:{marginBottom:"0.5rem"}})),vo=u(vt)(({theme:e})=>({fontSize:e.fontSizes.bodySize,fontWeight:e.typography.fontWeightMedium,[e.breakpoints.down(560)]:{textAlign:"center"}})),wo=u("div")(({theme:e})=>({display:"flex",alignItems:"center",marginTop:e.spacing(2),gap:e.spacing(2),flexWrap:"wrap",[e.breakpoints.down(560)]:{flexDirection:"column"}})),To=({env:e})=>{var d;const s=A("projectId"),n=A("featureId"),{metrics:r}=sr(s,n),{feature:a}=M(s,n),{value:o}=fs(),c=ar(a==null?void 0:a.environments,r).find(p=>p.environment===e.name),l=a==null?void 0:a.environments.find(p=>p.name===e.name);return t.jsx(b,{condition:!new Set(o.hiddenEnvironments).has(e.name),show:t.jsx(fo,{enabled:e.enabled,children:t.jsxs(xo,{TransitionProps:{mountOnEnter:!0},"data-testid":`${Rn}_${e.name}`,className:`environment-accordion ${e.enabled?"":"accordion-disabled"}`,children:[t.jsxs(mo,{expandIcon:t.jsx($n,{titleAccess:"Toggle"}),children:[t.jsxs(So,{"data-loading":!0,enabled:e.enabled,children:[t.jsxs(bo,{children:[t.jsx(Co,{enabled:e.enabled}),t.jsx("div",{children:t.jsx(vo,{text:e.name,maxWidth:"100",maxLength:15})}),t.jsx(b,{condition:!e.enabled,show:t.jsx(Te,{color:"neutral",sx:{ml:1},children:"Disabled"})})]}),t.jsxs(wo,{children:[t.jsx(dt,{label:"Add strategy",projectId:s,featureId:n,environmentId:e.name,variant:"outlined",size:"small"}),t.jsx(ho,{strategies:l==null?void 0:l.strategies})]})]}),t.jsx(uo,{environmentMetric:c,disabled:!e.enabled})]}),t.jsxs(yo,{enabled:e.enabled,children:[t.jsx(jo,{featureEnvironment:l,isDisabled:!e.enabled,otherEnvironments:a==null?void 0:a.environments.map(({name:p})=>p).filter(p=>p!==e.name)}),t.jsx(b,{condition:(((d=l==null?void 0:l.strategies)==null?void 0:d.length)||0)>0,show:t.jsxs(t.Fragment,{children:[t.jsx(K,{sx:{display:"flex",justifyContent:"center",py:1},children:t.jsx(dt,{label:"Add strategy",projectId:s,featureId:n,environmentId:e.name})}),t.jsx(io,{environmentMetric:c})]})})]})]})})})},Eo=()=>{const e=A("projectId"),s=A("featureId"),{feature:n}=M(e,s);if(!n)return null;const{environments:r}=n;return t.jsx(t.Fragment,{children:r==null?void 0:r.map(a=>t.jsx(To,{env:a},a.name))})},Vs=e=>{const{makeRequest:s,createRequest:n,errors:r,loading:a}=kn({propagateErrors:!0}),o=async(d,p)=>{const h=n(`/api/admin/projects/${e}/features/${d}/dependencies`,{method:"POST",body:JSON.stringify(p)});await s(h.caller,h.id)},i=async(d,p)=>{const h=n(`/api/admin/projects/${e}/features/${d}/dependencies/${p}`,{method:"DELETE"});await s(h.caller,h.id)},c=async d=>{const p=n(`/api/admin/projects/${e}/features/${d}/dependencies`,{method:"DELETE"});await s(p.caller,p.id)},l=[n,s,N,e];return{addDependency:g.useCallback(o,l),removeDependency:g.useCallback(i,l),removeDependencies:g.useCallback(c,l),errors:r,loading:a}},Ao=(e,s,n={})=>{const r=ce(`/api/admin/projects/${e}/features/${s}/parents`),{data:a,error:o,mutate:i}=Ne(r,Do,n);return{parentOptions:a,error:o,loading:!o&&!a}},Do=async e=>await(await fetch(e).then(he("Parent Options"))).json(),Fo=()=>t.jsxs(ie,{severity:"warning",children:["Remember to update your Unleash client! Feature dependencies require new SDK versions. Read more about ",t.jsx(Ro,{}),"."]}),Ro=()=>t.jsx("a",{href:"https://docs.getunleash.io/reference/dependent-features#client-sdk-support",target:"_blank",rel:"noreferrer",children:"Client SDK support for feature dependencies"}),$o=u(xs)(({theme:e})=>({marginTop:e.spacing(2),marginBottom:e.spacing(1.5)})),Ae={key:"none (remove dependency)",label:"none (remove dependency)"},ko=({project:e,featureId:s,parent:n,onSelect:r})=>{const{parentOptions:a,loading:o}=Ao(e,s),i=a?[Ae,...a.map(c=>({key:c,label:c}))]:[Ae];return t.jsx($o,{fullWidth:!0,options:i,value:n,onChange:r})},Io=(e,s,n,r)=>{const{trackEvent:a}=le(),{addChange:o}=ne(),{refetch:i}=te(e),{setToastData:c,setToastApiError:l}=W(),{refetchFeature:d}=M(e,s),p=Tt(e)(),{isChangeRequestConfiguredInAnyEnv:h}=Q(e),{addDependency:m,removeDependencies:j}=Vs(e),y=async f=>{if(!p){console.error("No change request environment");return}f==="addDependency"&&(await o(e,p,[{action:f,feature:s,payload:{feature:n}}]),a("dependent_features",{props:{eventType:"dependency added"}})),f==="deleteDependency"&&await o(e,p,[{action:f,feature:s,payload:void 0}]),i(),c({text:f==="addDependency"?`${s} will depend on ${n}`:`${s} dependency will be removed`,type:"success",title:"Change added to a draft"})};return async()=>{try{if(h()){const f=n===Ae.key?"deleteDependency":"addDependency";await y(f),a("dependent_features",{props:{eventType:f==="addDependency"?"add dependency added to change request":"delete dependency added to change request"}})}else n===Ae.key?(await j(s),a("dependent_features",{props:{eventType:"dependency removed"}}),c({title:"Dependency removed",type:"success"})):(await m(s,{feature:n}),a("dependent_features",{props:{eventType:"dependency added"}}),c({title:"Dependency added",type:"success"}))}catch(f){l(N(f))}await d(),r()}},Po=({project:e,featureId:s,showDependencyDialogue:n,onClose:r})=>{const[a,o]=g.useState(Ae.key),i=Io(e,s,a,r),{isChangeRequestConfiguredInAnyEnv:c}=Q(e);return t.jsx(oe,{open:n,title:"Add parent feature dependency",onClose:r,onClick:i,primaryButtonText:c()?"Add change to draft":a===Ae.key?"Remove":"Add",secondaryButtonText:"Cancel",children:t.jsxs(K,{children:[t.jsx(Fo,{}),t.jsx(K,{sx:{mt:2,mb:4},children:"Your feature will be evaluated only when the selected parent feature is enabled in the same environment."}),t.jsx(H,{children:"What feature do you want to depend on?"}),t.jsx(b,{condition:n,show:t.jsx(ko,{project:e,featureId:s,parent:a,onSelect:o})})]})})},Bo=u(hs)(({theme:e})=>({borderRadius:e.shape.borderRadiusLarge,padding:e.spacing(1,1.5)})),Oo=({feature:e,onEdit:s,onDelete:n})=>{const r=`dependency-${e}-actions`,a=`${r}-menu`,[o,i]=g.useState(null),c=!!o,l=p=>{i(p.currentTarget)},d=()=>{i(null)};return t.jsxs("span",{children:[t.jsx(ee,{title:"Dependency actions",arrow:!0,describeChild:!0,children:t.jsx(ke,{id:r,"aria-controls":c?a:void 0,"aria-haspopup":"true","aria-expanded":c?"true":void 0,onClick:l,type:"button",children:t.jsx(gs,{})})}),t.jsx(Bo,{id:a,anchorEl:o,open:c,onClose:d,transformOrigin:{horizontal:"right",vertical:"top"},anchorOrigin:{horizontal:"right",vertical:"bottom"},disableScrollLock:!0,children:t.jsxs(In,{"aria-labelledby":r,children:[t.jsx(b,{condition:!0,show:t.jsxs(pe,{onClick:()=>{s(),d()},children:[t.jsx(we,{children:t.jsx(ve,{})}),t.jsx(me,{children:t.jsx(H,{variant:"body2",children:"Edit"})})]})}),t.jsx(b,{condition:!0,show:t.jsxs(pe,{onClick:()=>{n(),d()},children:[t.jsx(we,{children:t.jsx(Pn,{})}),t.jsx(me,{children:t.jsx(H,{variant:"body2",children:"Delete"})})]})})]})})]})},Ns=({childFeatures:e,project:s})=>t.jsx(xt,{tooltip:t.jsx(t.Fragment,{children:e.map(n=>t.jsx(Ft,{to:`/projects/${s}/features/${n}`,children:t.jsx("div",{children:n})},`${s}-${n}`))}),children:e.length===1?"1 feature":`${e.length} features`}),Lo=(e,s)=>{const{trackEvent:n}=le(),{addChange:r}=ne(),{refetch:a}=te(e),{setToastData:o,setToastApiError:i}=W(),{refetchFeature:c}=M(e,s),l=Tt(e)(),{isChangeRequestConfiguredInAnyEnv:d}=Q(e),{removeDependencies:p}=Vs(e),h=async()=>{if(!l){console.error("No change request environment");return}await r(e,l,[{action:"deleteDependency",feature:s,payload:void 0}])};return async()=>{try{d()?(await h(),n("dependent_features",{props:{eventType:"delete dependency added to change request"}}),o({text:`${s} dependency will be removed`,type:"success",title:"Change added to a draft"}),await a()):(await p(s),n("dependent_features",{props:{eventType:"dependency removed"}}),o({title:"Dependency removed",type:"success"}),await c())}catch(j){i(N(j))}}},_o=({feature:e})=>{var d,p;const[s,n]=g.useState(!1),r=!!e.project&&e.dependencies.length===0&&e.children.length===0,a=!!e.project&&e.dependencies.length>0,o=!!e.project&&e.children.length>0,i=Tt(e.project)(),c=as(e.project),l=Lo(e.project,e.name);return t.jsxs(t.Fragment,{children:[t.jsx(b,{condition:r,show:t.jsx(Me,{children:t.jsxs(qe,{children:[t.jsx(ze,{children:"Dependency:"}),t.jsx(ge,{permission:Rt,projectId:e.project,variant:"text",onClick:()=>{n(!0)},children:"Add parent feature"})]})})}),t.jsx(b,{condition:a,show:t.jsxs(Me,{children:[t.jsxs(qe,{children:[t.jsx(ze,{children:"Dependency:"}),t.jsx(Ft,{to:`/projects/${e.project}/features/${(d=e.dependencies[0])==null?void 0:d.feature}`,children:(p=e.dependencies[0])==null?void 0:p.feature})]}),t.jsx(b,{condition:c(Rt,i),show:t.jsx(Oo,{feature:e.name,onEdit:()=>n(!0),onDelete:l})})]})}),t.jsx(b,{condition:o,show:t.jsx(Me,{children:t.jsxs(qe,{children:[t.jsx(ze,{children:"Children:"}),t.jsx(Ns,{childFeatures:e.children,project:e.project})]})})}),t.jsx(b,{condition:!!e.project,show:t.jsx(Po,{project:e.project,featureId:e.name,onClose:()=>n(!1),showDependencyDialogue:s})})]})},Mo=(e,s={})=>{const n=ce(`/api/admin/projects/${e}/dependencies`),{data:r,error:a}=ms(e,!1,n,qo,s);return{dependenciesExist:r,error:a,loading:!a&&!r}},qo=async e=>await(await fetch(e).then(he("Dependencies exist check"))).json(),zo=e=>{const{dependenciesExist:s}=Mo(e),{isOss:n}=ye();return!!(!n()||s)},Vo=u("div")(({theme:e})=>({display:"flex",flexDirection:"column",justifyItems:"center",padding:e.spacing(3),fontSize:e.fontSizes.smallBody})),No=({feature:e,header:s})=>{var o;const{locationSettings:n}=ys();ye();const r=zo(e.project),a=(o=e.environments)==null?void 0:o.map(i=>({name:i.name,lastSeenAt:i.lastSeenAt,enabled:i.enabled}));return t.jsxs(Vo,{children:[s,t.jsxs(Me,{children:[t.jsxs(qe,{children:[t.jsx(ze,{children:"Created at:"}),t.jsx("span",{children:Bn(js(e.createdAt),n.locale)})]}),t.jsx(On,{featureLastSeen:e.lastSeenAt,environments:a,sx:{p:0}})]}),t.jsx(b,{condition:r,show:t.jsx(_o,{feature:e})})]})},Ho=u(ke,{shouldForwardProp:e=>e!=="visibilityOff"})(({theme:e,visibilityOff:s})=>({marginLeft:"auto",marginRight:e.spacing(-1),color:s?e.palette.action.active:e.palette.action.focus,"&:hover":{color:e.palette.action.active}})),Wo=({environment:e,hiddenEnvironments:s,setHiddenEnvironments:n})=>{const r=()=>{n(e.name)};return t.jsx(Ho,{onClick:r,visibilityOff:s.has(e.name),children:t.jsx(b,{condition:s.has(e.name),show:t.jsx(Ln,{}),elseShow:t.jsx(_n,{})})})},Uo=u("div")(({theme:e})=>({marginLeft:e.spacing(-1.5),"&:not(:last-of-type)":{marginBottom:e.spacing(2)},display:"flex",alignItems:"center"})),Yo=u("label")(()=>({display:"inline-flex",alignItems:"center",cursor:"pointer"})),Go=({environment:e,callback:s,children:n,hiddenEnvironments:r,setHiddenEnvironments:a})=>{const o=A("projectId"),i=A("featureId"),{feature:c,refetchFeature:l}=M(o,i),{isChangeRequestConfigured:d}=Q(o),p=t.jsxs(t.Fragment,{children:[" ",t.jsxs("span",{"data-loading":!0,children:[e.enabled?"enabled":"disabled"," in"]})," ",t.jsx(vt,{text:e.name,maxWidth:"120",maxLength:15})]}),{onToggle:h,modals:m}=Pa(o),j=(y,T)=>h(y,{projectId:o,featureId:i,environmentName:e.name,environmentType:e.type,hasStrategies:e.strategies.length>0,hasEnabledStrategies:e.strategies.some(f=>!f.disabled),isChangeRequestEnabled:d(e.name),onRollback:T,onSuccess:()=>{s&&s(),l()}});return t.jsxs(Uo,{children:[t.jsxs(Yo,{children:[t.jsx(Ba,{featureId:c.name,projectId:o,environmentName:e.name,onToggle:j,value:e.enabled}),n??p]}),t.jsx(Wo,{environment:e,hiddenEnvironments:r,setHiddenEnvironments:a}),m]})},Ko=u("div")(({theme:e})=>({padding:e.spacing(3)})),Jo=u("div")(()=>({display:"flex",flexDirection:"column"})),Qo=u("p")(({theme:e})=>({fontSize:e.fontSizes.bodySize})),Zo=u("p")(({theme:e})=>({fontSize:e.fontSizes.smallBody,color:e.palette.text.secondary,display:"flex",alignItems:"center"})),Gt=u("span")(({theme:e})=>({padding:e.spacing(0,.5),"::after":{content:'"-"'}})),Xo=u(Et)(()=>({"&:hover, &:focus":{textDecoration:"underline"}})),ei=({feature:e,header:s,hiddenEnvironments:n,setHiddenEnvironments:r})=>{const a=e.environments.some(o=>{var i;return o.enabled&&((i=o.variants)==null?void 0:i.length)});return t.jsxs(Ko,{"data-testid":"feature-toggle-status",children:[s,e.environments.map(o=>{const i=o.strategies.length===1?"1 strategy":`${o.strategies.length} strategies`,c=o.variants??[],l=c.length>0&&t.jsxs(t.Fragment,{children:[t.jsx(Gt,{}),t.jsx(ee,{title:"View variants",arrow:!0,describeChild:!0,children:t.jsx(Xo,{component:J,to:`/projects/${e.project}/features/${e.name}/variants`,underline:"hover",children:c.length===1?"1 variant":`${c.length} variants`})})]}),d=o.enabled&&c.length===0&&a;return t.jsx(Go,{environment:o,hiddenEnvironments:n,setHiddenEnvironments:r,children:t.jsxs(Jo,{children:[t.jsx(Qo,{children:o.name}),t.jsxs(Zo,{children:[i,l,t.jsx(b,{condition:d,show:t.jsxs(t.Fragment,{children:[t.jsx(Gt,{}),t.jsx(Oa,{})]})})]})]})},o.name)})]})},Hs=(e,s={})=>{const n=async()=>{const d=ce(`api/admin/features/${e}/tags`);return(await fetch(d,{method:"GET"}).then(he("Tags"))).json()},r=`api/admin/features/${e}/tags`,{data:a,error:o}=ms(!!e,{tags:[]},r,n,s),[i,c]=g.useState(!o&&!a),l=()=>{gt(r)};return g.useEffect(()=>{c(!o&&!a)},[a,o]),{tags:(a==null?void 0:a.tags)||[],error:o,loading:i,refetch:l}},ti=u("section")(({theme:e})=>({"& > *":{margin:e.spacing(1,0)}})),rt=e=>e.map(s=>({title:s.value})),Kt=(e,s)=>e.map(n=>({value:n.title,type:s})),Ws=({open:e,setOpen:s})=>{const{tagTypes:n}=Mn(),r=A("featureId"),{createTag:a}=La(),{updateFeatureTags:o,loading:i}=Ue(),{tags:c,refetch:l,loading:d}=Hs(r),{setToastData:p}=W(),h=n&&n.length>0?n[0]:{name:"simple",description:"Simple tag to get you started",icon:""},[m,j]=g.useState(h),y=i||d,[T,f]=g.useState(0),{trackEvent:x}=le(),[R,_]=g.useState(rt(c.filter(E=>E.type===m.name))),{tags:q,refetch:z}=_a(m.name),C=g.useMemo(()=>rt(q),[q]);g.useEffect(()=>{c&&m&&_(rt(c.filter(E=>E.type===m.name)))},[JSON.stringify(c),m]);const v=()=>{s(!1),_([])};function $(E,F){const B=E.filter(I=>I.type===m.name).filter(I=>!F.find(L=>I.value===L.value&&I.type===L.type)),O=F.filter(I=>I.type===m.name).filter(I=>!E.find(L=>I.value===L.value&&I.type===L.type));return f(B.length+O.length),{added:B,removed:O}}const P=E=>E.filter(F=>!F.title.startsWith("Create")),V=async(E,F)=>{try{await o(r,{addedTags:E,removedTags:F}),await l()}catch(B){const O=N(B);p({type:"error",title:"Failed to add tag",text:O,confetti:!1})}},Y=(E,F)=>{let B="We successfully";return E>0&&(B=B.concat(` added ${E} new tag${E>1?"s":""}`)),E>0&&F>0&&(B=B.concat(" and ")),F>0&&(B=B.concat(` removed ${F} tag${F>1?"s":""}`)),B},U=async E=>{E.preventDefault();const F=Kt(P(R),m.name),{added:B,removed:O}=$(F,c);T>0&&(await V(B,O),T>1&&x("suggest_tags",{props:{eventType:"multiple_tags_added"}}),T>0&&p({type:"success",title:`Updated tag${B.length>1?"s":""} to toggle`,text:Y(B.length,O.length),confetti:!0})),f(0),_([]),s(!1)},S=(E,F)=>{F!=null&&typeof F!="string"&&(E.preventDefault(),j(F),_([]),f(0))},k=(E,F,B)=>{const O=qn(F);B==="selectOption"&&F.forEach((L,X)=>{if(typeof L!="string"&&L.inputValue&&L.inputValue!==""){const G={value:L.inputValue,type:m.name};a(G).then(()=>{x("suggest_tags",{props:{eventType:"tag_created"}}),z()}),L.title=L.inputValue,L.inputValue="",O[X]=L}});const I=Kt(P(O),m.name);$(I,c),_(O)},w="add-tag-form";return t.jsx(oe,{open:e,secondaryButtonText:"Cancel",primaryButtonText:"Save tags",title:"Update feature toggle tags",onClick:U,disabledPrimaryButton:y||T===0,onClose:v,formId:w,children:t.jsxs(t.Fragment,{children:[t.jsx(H,{paragraph:!0,sx:{marginBottom:E=>E.spacing(2.5)},children:"Tags allow you to group features together"}),t.jsx("form",{id:w,onSubmit:U,children:t.jsxs(ti,{children:[t.jsx(Ma,{options:n,value:m,onChange:S}),t.jsx(qa,{options:C,existingTags:c,tagType:m,selectedOptions:R,onChange:k})]})})]})})},si=u("div")(({theme:e})=>({display:"flex",flexDirection:"column",padding:e.spacing(3)})),ni=u("div")(({theme:e})=>({display:"flex",gap:e.spacing(1),flexWrap:"wrap"})),ai=u(Ss)(({theme:e})=>({fontSize:e.fontSizes.smallBody})),ri=u(Re)(({theme:e})=>({margin:e.spacing(3),borderStyle:"dashed"})),oi=u(Fe)(({theme:e})=>({maxWidth:e.spacing(20),alignSelf:"center"})),ii=({feature:e,header:s})=>{const{tags:n,refetch:r}=Hs(e.name),{deleteTagFromFeature:a}=Ue(),[o,i]=g.useState(!1),[c,l]=g.useState(!1),[d,p]=g.useState(),{setToastData:h,setToastApiError:m}=W(),{hasAccess:j}=g.useContext(mt),y=j(Ce,e.project),T=async()=>{if(d)try{await a(e.name,d.type,d.value),r(),h({type:"success",title:"Tag deleted",text:"Successfully deleted tag"})}catch(f){m(N(f))}};return t.jsxs(si,{children:[s,t.jsx(ni,{children:n.map(f=>{const x=`${f.type}:${f.value}`;return t.jsx(ai,{label:x,deleteIcon:t.jsx(zn,{titleAccess:"Remove"}),onDelete:y?()=>{l(!0),p(f)}:void 0},x)})}),t.jsx(b,{condition:y,show:t.jsxs(t.Fragment,{children:[t.jsx(b,{condition:n.length>0,show:t.jsx(ri,{})}),t.jsx(oi,{"data-loading":!0,variant:"outlined",startIcon:t.jsx(Vn,{}),onClick:()=>i(!0),children:"Add new tag"})]})}),t.jsx(Ws,{open:o,setOpen:i}),t.jsxs(oe,{open:c,primaryButtonText:"Delete tag",secondaryButtonText:"Cancel",onClose:()=>{l(!1),p(void 0)},onClick:()=>{l(!1),T(),p(void 0)},title:"Delete tag?",children:["You are about to delete tag:"," ",t.jsxs("strong",{children:[d==null?void 0:d.type,":",d==null?void 0:d.value]})]})]})},ci=u(K)(({theme:e})=>({top:e.spacing(2),borderRadius:e.shape.borderRadiusLarge,backgroundColor:e.palette.background.paper,display:"flex",flexDirection:"column",maxWidth:"350px",minWidth:"350px",marginRight:"1rem",marginTop:"1rem",[e.breakpoints.down(1e3)]:{marginBottom:"1rem",width:"100%",maxWidth:"none",minWidth:"auto"}})),ot=u("h3")(({theme:e})=>({display:"flex",gap:e.spacing(1),alignItems:"center",fontSize:e.fontSizes.bodySize,margin:0,marginBottom:e.spacing(3),"& > :last-child":{position:"relative",top:1}})),li=({hiddenEnvironments:e,setHiddenEnvironments:s})=>{var i;const n=A("projectId"),r=A("featureId"),{feature:a}=M(n,r),o=((i=a.environments)==null?void 0:i.length)<=3;return t.jsxs(ci,{as:o?Nn:K,children:[t.jsx(ei,{header:t.jsxs(ot,{"data-loading":!0,children:["Enabled in environments (",a.environments.filter(({enabled:c})=>c).length,")",t.jsx(Hn,{tooltip:"When a feature is switched off in an environment, it will always return false. When switched on, it will return true or false depending on its strategies.",placement:"top"})]}),feature:a,hiddenEnvironments:e,setHiddenEnvironments:s}),t.jsx(Re,{}),t.jsx(No,{header:t.jsx(ot,{"data-loading":!0,children:"Feature toggle details"}),feature:a}),t.jsx(Re,{}),t.jsx(ii,{header:t.jsx(ot,{"data-loading":!0,children:"Tags for this feature toggle"}),feature:a})]})},di=()=>{const{trackEvent:e}=le(),{value:s,setValue:n}=fs(),[r,a]=g.useState(new Set(s.hiddenEnvironments));return{hiddenEnvironments:r,setHiddenEnvironments:i=>{n(c=>{const l=new Set(c.hiddenEnvironments);return l.has(i)?(l.delete(i),e("hidden_environment",{props:{eventType:"environment unhidden"}})):(l.add(i),e("hidden_environment",{props:{eventType:"environment hidden"}})),a(l),{...s,hiddenEnvironments:l}})}}},ui=()=>{const[e,s]=g.useState(0),n=A("projectId"),r=A("featureId"),a=Ee("environmentId"),o=Ee("strategyName"),{strategy:i,defaultStrategyFallback:c}=Fs(n,a),l=JSON.parse(is().get("defaultStrategy")||"false"),{segments:d}=yt(),p=(d||[]).filter(G=>{var D;return(D=i==null?void 0:i.segments)==null?void 0:D.includes(G.id)}),[h,m]=g.useState({}),[j,y]=g.useState(l?p:[]),{strategyDefinition:T}=jt(o),f=St(),{addStrategyToFeature:x,loading:R}=fe(),{addChange:_}=ne(),{setToastData:q,setToastApiError:z}=W(),{uiConfig:C}=ye(),{unleashUrl:v}=C,$=ae(),{feature:P,refetchFeature:V}=M(n,r),Y=g.useRef(P),{isChangeRequestConfigured:U}=Q(n),{refetch:S}=te(n),{trackEvent:k}=le(),{data:w,staleDataNotification:E,forceRefreshCache:F}=bt({unleashGetter:M,params:[n,r],dataKey:"feature",refetchFunctionKey:"refetchFeature",options:{}},P,{afterSubmitAction:V},Ct);g.useEffect(()=>{Y.current.name===""&&P.name&&(F(P),Y.current=P)},[P.name]),g.useEffect(()=>{var G;if(l){const D=i||c;((G=D.parameters)==null?void 0:G.groupId)===""&&r?m({...D,parameters:{...D.parameters,groupId:r}}):m(D)}else T&&m(Ls(r,T))},[r,JSON.stringify(T),l]);const B=async G=>{await x(n,r,a,G),q({title:"Strategy created",type:"success",confetti:!0})},O=async G=>{await _(n,a,{action:"addStrategy",feature:r,payload:G}),q({title:"Strategy added to draft",type:"success",confetti:!0}),S()},I=cs(h,j),L=async()=>{k("strategyTitle",{props:{hasTitle:!!h.title,on:"create"}});try{U(a)?await O(I):await B(I),V(),$(He(n,r))}catch(G){z(N(G))}};return!w||!w.project?null:t.jsxs(We,{modal:!0,description:ls,documentationLink:ds,documentationLinkLabel:us,disablePadding:!0,formatApiCode:()=>pi(n,r,a,I,v),children:[t.jsx(bs,{projectId:n,feature:w,strategy:h,setStrategy:m,segments:j,setSegments:y,environmentId:a,onSubmit:L,loading:R,permission:ue,errors:f,isChangeRequest:U(a),tab:e,setTab:s,StrategyVariants:t.jsx(Cs,{strategy:h,setStrategy:m,environment:a,projectId:n,editable:!0})}),E]})},pi=(e,s,n,r,a)=>{if(!a)return"";const o=`${a}/api/admin/projects/${e}/features/${s}/environments/${n}/strategies`,i=JSON.stringify(r,void 0,2);return`curl --location --request POST '${o}' \\
|
|
5
|
+
--header 'Authorization: INSERT_API_KEY' \\
|
|
6
|
+
--header 'Content-Type: application/json' \\
|
|
7
|
+
--data-raw '${i}'`},gi=()=>{const[e,s]=g.useState(""),{trackEvent:n}=le();return{setPreviousTitle:s,trackTitle:(a="")=>{a===e&&n("strategyTitle",{props:{action:"none",on:"edit"}}),e===""&&a!==""&&n("strategyTitle",{props:{action:"added",on:"edit"}}),e!==""&&a===""&&n("strategyTitle",{props:{action:"removed",on:"edit"}}),e!==""&&a!==""&&a!==e&&n("strategyTitle",{props:{action:"edited",on:"edit"}})}}},hi=()=>{const e=A("projectId"),s=A("featureId"),n=Ee("environmentId"),r=Ee("strategyId"),[a,o]=g.useState(0),[i,c]=g.useState({}),[l,d]=g.useState([]),{updateStrategyOnFeature:p,loading:h}=fe(),{strategyDefinition:m}=jt(i.name),{setToastData:j,setToastApiError:y}=W(),T=St(),{uiConfig:f}=ye(),{unleashUrl:x}=f,R=ae(),{addChange:_}=ne(),{isChangeRequestConfigured:q}=Q(e),{refetch:z}=te(e),{setPreviousTitle:C}=gi(),{feature:v,refetchFeature:$}=M(e,s),P=g.useRef(v),{data:V,staleDataNotification:Y,forceRefreshCache:U}=bt({unleashGetter:M,params:[e,s],dataKey:"feature",refetchFunctionKey:"refetchFeature",options:{}},v,{afterSubmitAction:$},Ct);g.useEffect(()=>{P.current.name===""&&v.name&&(U(v),P.current=v)},[v]);const{segments:S,refetchSegments:k}=yt(r);g.useEffect(()=>{const O=V==null?void 0:V.environments.flatMap(I=>I.strategies).find(I=>I.id===r);c(I=>({...I,...O})),C((O==null?void 0:O.title)||"")},[r,V]),g.useEffect(()=>{S&&d(S)},[JSON.stringify(S)]);const w=fi(i,l),E=async O=>{await p(e,s,n,r,O),await k(),j({title:"Strategy updated",type:"success",confetti:!0})},F=async O=>{await _(e,n,{action:"updateStrategy",feature:s,payload:{...O,id:r}}),j({title:"Change added to draft",type:"success",confetti:!0}),z()},B=async()=>{try{q(n)?await F(w):await E(w),$(),R(xi(e,s))}catch(O){y(N(O))}};return!i.id||!m||!V?null:t.jsxs(We,{modal:!0,disablePadding:!0,description:yi,documentationLink:ji,documentationLinkLabel:Si,formatApiCode:()=>mi(e,s,n,r,w,m,x),children:[t.jsx(bs,{projectId:e,feature:V,strategy:i,setStrategy:c,segments:l,setSegments:d,environmentId:n,onSubmit:B,loading:h,permission:os,errors:T,isChangeRequest:q(n),tab:a,setTab:o,StrategyVariants:t.jsx(Cs,{strategy:i,setStrategy:c,environment:n,projectId:e})}),Y]})},fi=(e,s)=>({name:e.name,title:e.title,constraints:e.constraints??[],parameters:e.parameters??{},variants:e.variants??[],segments:s.map(n=>n.id),disabled:e.disabled??!1}),xi=(e,s)=>`/projects/${e}/features/${s}`,mi=(e,s,n,r,a,o,i)=>{if(!i)return"";const c={...a,parameters:Wn(a.parameters??{},o)},l=`${i}/api/admin/projects/${e}/features/${s}/environments/${n}/strategies/${r}`,d=JSON.stringify(c,void 0,2);return`curl --location --request PUT '${l}' \\
|
|
8
|
+
--header 'Authorization: INSERT_API_KEY' \\
|
|
9
|
+
--header 'Content-Type: application/json' \\
|
|
10
|
+
--data-raw '${d}'`},yi=`
|
|
11
|
+
An activation strategy will only run when a feature toggle is enabled and provides a way to control who will get access to the feature.
|
|
12
|
+
If any of a feature toggle's activation strategies returns true, the user will get access.
|
|
13
|
+
`,ji="https://docs.getunleash.io/reference/activation-strategies",Si="Strategies documentation",bi=u("div")(({theme:e})=>({display:"flex",width:"100%",[e.breakpoints.down(1e3)]:{flexDirection:"column"}})),Ci=u("div")(({theme:e})=>({display:"flex",flexDirection:"column",width:"calc(100% - (350px + 1rem))",[e.breakpoints.down(1e3)]:{width:"100%"}})),vi=()=>{const e=ae(),s=A("projectId"),n=A("featureId"),r=He(s,n),{hiddenEnvironments:a,setHiddenEnvironments:o}=di(),i=()=>e(r);vs(n);const c=Un("newStrategyConfiguration");return t.jsxs(bi,{children:[t.jsxs("div",{children:[t.jsx(tr,{}),t.jsx(li,{hiddenEnvironments:a,setHiddenEnvironments:o})]}),t.jsx(Ci,{children:t.jsx(Eo,{})}),t.jsxs(ws,{children:[t.jsx(xe,{path:"strategies/create",element:t.jsx(lt,{label:"Create feature strategy",onClose:i,open:!0,children:t.jsx(b,{condition:c,show:t.jsx(ui,{}),elseShow:t.jsx(Lr,{})})})}),t.jsx(xe,{path:"strategies/edit",element:t.jsx(lt,{label:"Edit feature strategy",onClose:i,open:!0,children:t.jsx(b,{condition:c,show:t.jsx(hi,{}),elseShow:t.jsx(Yn,{})})})})]})]})},wi=u("div")(({theme:e})=>({display:"flex",alignItems:"center",justifyContent:"space-between","& > div":{display:"flex",alignItems:"center"},marginTop:e.spacing(-3.5),marginBottom:e.spacing(2),backgroundColor:e.palette.background.default,paddingTop:e.spacing(2),paddingBottom:e.spacing(2),position:"sticky",top:0,zIndex:2})),Ti=u(Ts,{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:s})=>({color:s?e.palette.neutral.border:e.palette.primary.main})),Ei=u("span",{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:s})=>({color:s?e.palette.text.secondary:e.palette.text.primary,marginLeft:e.spacing(1.25),fontSize:e.fontSizes.mainHeader,fontWeight:e.fontWeight.bold})),Ai=u("form")(()=>({display:"flex",flexDirection:"column",height:"100%"})),Di=u(ie)(({theme:e})=>({marginBottom:e.spacing(2)})),Fi=u(ie)(({theme:e})=>({marginTop:e.spacing(4)})),Ri=u("div")({display:"flex",flexDirection:"column"}),$i=u("div")(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1.5),marginBottom:e.spacing(.5)})),Jt=u("p")(({theme:e})=>({fontSize:e.fontSizes.smallBody,color:e.palette.text.secondary,marginBottom:e.spacing(1.5)})),ki=u(Re)(({theme:e})=>({margin:e.spacing(4,0)})),Ii=u(Gn)(({theme:e})=>({minWidth:e.spacing(20),width:"100%"})),Pi=u("div")(({theme:e})=>({marginTop:"auto",paddingTop:e.spacing(4),display:"flex",justifyContent:"flex-end"})),Bi=u(Fe)(({theme:e})=>({marginLeft:e.spacing(3)})),Oi=g.memo(Kn),Li=({environment:e,open:s,setOpen:n,getApiPayload:r,getCrPayload:a,onConfirm:o})=>{const i=A("projectId"),c=A("featureId"),{uiConfig:l}=ye(),{context:d}=Jn(),{defaultStickiness:p,loading:h}=Qn(i),{isChangeRequestConfigured:m}=Q(i),{data:j}=te(i),{changeRequestInReviewOrApproved:y,alert:T}=Xn(j),f=(e==null?void 0:e.variants)||[],[x,R]=g.useState([]),[_,q]=g.useState();g.useEffect(()=>{h||R(f.length?f.map(D=>({...D,isValid:!0,new:!1,id:Ke()})):[{name:"",weightType:$t.VARIABLE,weight:0,overrides:[],stickiness:(x==null?void 0:x.length)>0?x[0].stickiness:p,new:!0,isValid:!1,id:Ke()}])},[s,h]);const z=(D,Z)=>{R(je=>kt(je.map(Be=>Be.id===Z?D:Be),1e3))},C=()=>{const D=Ke();R(Z=>[...Z,{name:"",weightType:$t.VARIABLE,weight:0,overrides:[],stickiness:(Z==null?void 0:Z.length)>0?Z[0].stickiness:p,new:!0,isValid:!1,id:D}]),q(D)};g.useEffect(()=>{if(_){const D=document.getElementById(`variant-name-input-${_}`);D==null||D.scrollIntoView({behavior:"smooth",block:"center"}),D==null||D.focus({preventScroll:!0}),q(void 0)}},[_]);const v=x.map(({new:D,isValid:Z,id:je,...Be})=>Be),$=r(f,v),P=a(v),V=async D=>{D.preventDefault(),o(v)},Y=()=>w?`curl --location --request POST '${l.unleashUrl}/api/admin/projects/${i}/environments/${e==null?void 0:e.name}/change-requests' \\
|
|
14
|
+
--header 'Authorization: INSERT_API_KEY' \\
|
|
15
|
+
--header 'Content-Type: application/json' \\
|
|
16
|
+
--data-raw '${JSON.stringify(P,void 0,2)}'`:`curl --location --request PATCH '${l.unleashUrl}/api/admin/projects/${i}/features/${c}/environments/${e==null?void 0:e.name}/variants' \\
|
|
17
|
+
--header 'Authorization: INSERT_API_KEY' \\
|
|
18
|
+
--header 'Content-Type: application/json' \\
|
|
19
|
+
--data-raw '${JSON.stringify($.patch,void 0,2)}'`,U=x.every(({isValid:D})=>D),S=y((e==null?void 0:e.name)||""),k=S?"Add to existing change request":"Add change to draft",w=m((e==null?void 0:e.name)||""),E=g.useMemo(()=>{var D;return h?"":((D=v[0])==null?void 0:D.stickiness)||p},[h,p,JSON.stringify(v[0]??{})]),F=g.useMemo(()=>["default",...d.filter(D=>D.stickiness).map(D=>D.name)],[d]),B=F.map(D=>({key:D,label:D}));F.includes(E)||B.push({key:E,label:E});const O=async D=>{R(Z=>Z.map(je=>({...je,stickiness:D})))},I=D=>{O(D)},[L,X]=g.useState();g.useEffect(()=>{X(void 0),$.error&&X($.error)},[$.error]);const G=()=>{O(p),n(!1)};return h||E===""?t.jsx(Zn,{}):t.jsx(lt,{open:s,onClose:G,label:"",children:t.jsxs(We,{modal:!0,title:"",description:"Variants allow you to return a variant object if the feature toggle is considered enabled for the current request.",documentationLink:"https://docs.getunleash.io/reference/feature-toggle-variants",documentationLinkLabel:"Feature toggle variants documentation",formatApiCode:Y,loading:!s,children:[t.jsxs(wi,{children:[t.jsxs("div",{children:[t.jsx(Ti,{deprecated:!(e!=null&&e.enabled)}),t.jsx(Ei,{deprecated:!(e!=null&&e.enabled),children:e==null?void 0:e.name})]}),t.jsx(ge,{"data-testid":"MODAL_ADD_VARIANT_BUTTON",onClick:C,variant:"outlined",permission:Se,projectId:i,environmentId:e==null?void 0:e.name,children:"Add variant"})]}),t.jsxs(Ai,{onSubmit:V,children:[t.jsx(b,{condition:S,show:T,elseShow:t.jsx(b,{condition:!!w,show:t.jsxs(Di,{severity:"info",children:[t.jsx("strong",{children:"Change requests"})," are enabled",e?` for ${e.name}`:"",". Your changes need to be approved before they will be live. All the changes you do now will be added into a draft that you can submit for review."]})})}),t.jsx(Ri,{children:x.map(D=>t.jsx(Oi,{variant:D,variants:x,updateVariant:Z=>z(Z,D.id),removeVariant:()=>R(Z=>kt(Z.filter(je=>je.id!==D.id),1e3)),error:$.error},D.id))}),t.jsx(ge,{onClick:C,variant:"outlined",permission:Se,projectId:i,environmentId:e==null?void 0:e.name,children:"Add variant"}),t.jsx(ki,{}),t.jsx(b,{condition:x.length>0,show:t.jsxs(t.Fragment,{children:[t.jsx($i,{children:t.jsx("p",{children:"Stickiness"})}),t.jsxs(Jt,{children:["By overriding the stickiness you can control which parameter is used to ensure consistent traffic allocation across variants."," ",t.jsx(Et,{href:"https://docs.getunleash.io/reference/feature-toggle-variants",target:"_blank",rel:"noreferrer",children:"Read more"})]}),t.jsx("div",{children:t.jsx(Ii,{value:E,label:"",editable:!0,onChange:D=>I(D.target.value)})})]}),elseShow:t.jsx(Jt,{children:"This environment has no variants. Get started by adding a variant."})}),t.jsxs(Fi,{severity:"error",hidden:!L,children:[t.jsx("strong",{children:"Error: "}),L]}),t.jsxs(Pi,{children:[t.jsx(Fe,{"data-testid":"DIALOGUE_CONFIRM_ID",type:"submit",variant:"contained",color:"primary",disabled:!U,children:w?k:"Save variants"}),t.jsx(Bi,{onClick:G,children:"Cancel"})]})]})]})})},_i=e=>fetch(e).then(he("ChangeRequest")).then(s=>s.json()),Mi=(e,s)=>{const{data:n,error:r,mutate:a}=ht([],ce(`api/admin/projects/${e}/change-requests/scheduled?variantForFlag=${s}`),_i);return{changeRequests:n,loading:!r&&!n,refetch:a,error:r}},qi=(e,s,n)=>{const{changeRequests:r}=Mi(e,s),a=r==null?void 0:r.filter(o=>o.environment===n);return a?a.map(o=>o.id):[]},zi=u("div")(({theme:e})=>({padding:e.spacing(3),borderRadius:e.shape.borderRadiusLarge,border:`1px solid ${e.palette.divider}`,"&:not(:last-child)":{marginBottom:e.spacing(3)}})),Vi=u("div")({display:"flex",alignItems:"center",justifyContent:"space-between","& > div":{display:"flex",alignItems:"center"}}),Ni=u(Ts,{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:s})=>({color:s?e.palette.neutral.border:e.palette.primary.main})),Hi=u("span",{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:s})=>({color:s?e.palette.text.secondary:e.palette.text.primary,marginLeft:e.spacing(1.25),fontWeight:e.fontWeight.bold})),Wi=u("p")(({theme:e})=>({fontSize:e.fontSizes.smallBody,color:e.palette.text.secondary,marginBottom:e.spacing(1.5)})),Ui=u("div")(({theme:e})=>({margin:e.spacing(3,0)})),Yi=u("div")(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1.5),marginBottom:e.spacing(.5)})),Gi=({environment:e,searchValue:s,children:n})=>{var l;const r=A("projectId"),a=A("featureId"),o=qi(r,a,e.name),i=e.variants??[],c=((l=i[0])==null?void 0:l.stickiness)||"default";return t.jsxs(zi,{children:[t.jsxs(Vi,{children:[t.jsxs("div",{children:[t.jsx(Ni,{deprecated:!e.enabled}),t.jsx(Hi,{deprecated:!e.enabled,children:e.name}),t.jsx(b,{condition:o.length>0,show:t.jsx(ea,{sx:{ml:2},children:t.jsx(Os,{scheduledChangeRequestIds:o})})})]}),n]}),t.jsx(b,{condition:i.length>0,show:t.jsxs(t.Fragment,{children:[t.jsx(Ui,{children:t.jsx(ta,{variants:i,searchValue:s})}),t.jsx(b,{condition:i.length>1,show:t.jsxs(t.Fragment,{children:[t.jsxs(Yi,{children:[t.jsx("p",{children:"Stickiness:"}),t.jsx(Te,{children:c})]}),t.jsxs(Wi,{children:["By overriding the stickiness you can control which parameter is used to ensure consistent traffic allocation across variants."," ",t.jsx(Et,{href:"https://docs.getunleash.io/reference/feature-toggle-variants",target:"_blank",rel:"noreferrer",children:"Read more"})]})]})})]})})]})},Ki=u(me)(({theme:e})=>({"& span":{fontSize:e.fontSizes.smallBody}})),Ji=({environment:e,permission:s,projectId:n,environmentId:r,onCopyVariantsFrom:a,otherEnvsWithVariants:o})=>{const[i,c]=g.useState(null),l=!!i,d=e.variants??[];return t.jsx(b,{condition:o.length>0&&d.length===0,show:t.jsxs(t.Fragment,{children:[t.jsx(ge,{onClick:p=>{c(p.currentTarget)},id:`copy-from-menu-${e.name}`,"aria-controls":l?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":l?"true":void 0,variant:"outlined",permission:s,projectId:n,environmentId:r,children:"Copy variants from"}),t.jsx(Ie,{anchorEl:i,open:l,onClose:()=>c(null),MenuListProps:{"aria-labelledby":`copy-from-menu-${e.name}`},children:o.map(p=>t.jsx(pe,{onClick:()=>a(p,e),children:t.jsx(Ki,{children:`Copy from ${p.name}`})},p.name))})]})})},Qi=({permission:e,projectId:s,environment:n,checked:r,onClick:a,...o})=>{const i=ct(e,s,n);return t.jsxs(pe,{disabled:!i,onClick:a,...o,children:[t.jsx(sa,{checked:r}),n]})},Zi=u(Ie)(({theme:e})=>({"& > div > ul":{display:"flex",flexDirection:"column",justifyContent:"center","& > li":{padding:e.spacing(0,1)}}})),Xi=u("div")(({theme:e})=>({margin:e.spacing(1,2)})),ec=u(Fe)(({theme:e})=>({marginTop:e.spacing(2)})),tc=({current:e,environments:s,permission:n,projectId:r,onSubmit:a})=>{var T;const[o,i]=g.useState(null),c=!!o,[l,d]=g.useState([]),p=f=>{d(x=>[...x,f])},h=f=>{d(x=>x.filter(({name:R})=>R!==f.name))},m=f=>{l.includes(f)?h(f):p(f)},j=()=>{d([]),i(null)},y=((T=s.find(f=>f.name===e))==null?void 0:T.variants)??[];return t.jsx(b,{condition:y.length>0&&s.length>1,show:t.jsxs(t.Fragment,{children:[t.jsx(Fe,{onClick:f=>{i(f.currentTarget)},id:`push-to-menu-${e}`,"aria-controls":c?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":c?"true":void 0,variant:"outlined",children:"Copy to environment"}),t.jsxs(Zi,{anchorEl:o,open:c,onClose:()=>i(null),MenuListProps:{"aria-labelledby":`push-to-menu-${e}`},children:[s.filter(f=>f.name!==e).map(f=>t.jsx(Qi,{projectId:r,permission:n,environment:f.name,checked:l.includes(f),onClick:()=>m(f)},f.name)),t.jsxs(Xi,{children:[t.jsx(Re,{}),t.jsxs(ec,{variant:"outlined",onClick:()=>{a(l),j()},disabled:l.length===0,children:["Push to selected (",l.length,")"]})]})]})]})})},sc=u("div")(({theme:e})=>({display:"flex",gap:e.spacing(1.5)})),nc=()=>{const{setToastData:e,setToastApiError:s}=W(),n=ft(),r=Pe(n.breakpoints.down("md")),a=A("projectId"),o=A("featureId"),{feature:i,refetchFeature:c,loading:l}=M(a,o),{patchFeatureEnvironmentVariants:d,overrideVariantsInEnvironments:p}=Ue(),{refetch:h}=te(a),{addChange:m}=ne(),{isChangeRequestConfigured:j}=Q(a),[y,T]=g.useState(""),[f,x]=g.useState(),[R,_]=g.useState(!1),q=g.useMemo(()=>{var S;return((S=i==null?void 0:i.environments)==null?void 0:S.map(k=>({...k,crEnabled:j(k.name)})))||[]},[i.environments]),z=(S,k)=>oa(S,k),C=(S,k)=>{try{const w=ra(k,1e3);return{patch:z(S,w)}}catch(w){return{patch:[],error:N(w)}}},v=S=>({feature:o,action:"patchVariant",payload:{variants:S}}),$=async(S,k)=>{if(S.crEnabled)await m(a,S.name,v(k)),h();else{const w=S.variants??[],{patch:E,error:F}=C(w,k);if(E.length===0)return;if(F){e({type:"error",title:F});return}await d(a,o,S.name,E)}c()},P=async(S,k)=>{try{const w=k.filter(({crEnabled:I})=>I),E=k.filter(({crEnabled:I})=>!I);w.length&&await Promise.all(w.map(I=>m(a,I.name,v(S)))),E.length&&await p(a,o,S,E.map(({name:I})=>I)),h(),c();const F=E.length?`Variants pushed to ${E.length===1?E[0].name:`${E.length} environments`}`:"",B=w.length?`Variants push added to ${w.length===1?`${w[0].name} draft`:`${w.length} drafts`}`:"",O=`${F}${F&&B?". ":""}${B}`;e({title:O,type:"success"})}catch(w){s(N(w))}},V=S=>{x(S),_(!0)},Y=async S=>{if(f)try{await $(f,S),_(!1),e({title:f.crEnabled?"Variant changes added to draft":"Variants updated successfully",type:"success"})}catch(k){s(N(k))}},U=async(S,k)=>{try{const w=S.variants??[];await $(k,w),e({title:k.crEnabled?"Variants copy added to draft":"Variants copied successfully",type:"success"})}catch(w){s(N(w))}};return t.jsxs(At,{isLoading:l,header:t.jsx(na,{title:"Variants",actions:t.jsx(b,{condition:!r,show:t.jsx(t.Fragment,{children:t.jsx(It,{initialValue:y,onChange:T})})}),children:t.jsx(b,{condition:r,show:t.jsx(It,{initialValue:y,onChange:T})})}),children:[t.jsx(aa,{}),q.map(S=>{var w;const k=q.filter(({name:E,variants:F})=>E!==S.name&&(F==null?void 0:F.length));return t.jsx(Gi,{environment:S,searchValue:y,children:t.jsxs(sc,{children:[t.jsx(tc,{current:S.name,environments:q,permission:Se,projectId:a,onSubmit:E=>P(S.variants??[],E)}),t.jsx(Ji,{environment:S,permission:Se,projectId:a,environmentId:S.name,onCopyVariantsFrom:U,otherEnvsWithVariants:k}),t.jsx(b,{condition:!!((w=S.variants)!=null&&w.length),show:t.jsx(re,{"data-testid":"EDIT_VARIANTS_BUTTON",onClick:()=>V(S),permission:Se,projectId:a,environmentId:S.name,tooltipProps:{title:"Edit variants"},children:t.jsx(ve,{})}),elseShow:t.jsx(ge,{"data-testid":"ADD_VARIANT_BUTTON",onClick:()=>V(S),variant:"outlined",permission:Se,projectId:a,environmentId:S.name,children:"Add variant"})})]})},S.name)}),t.jsx(Li,{environment:f,open:R,setOpen:_,getApiPayload:C,getCrPayload:v,onConfirm:Y})]})},ac=ce("api/admin/client-metrics/features"),Us=(e,s)=>{const n=ce(`api/admin/client-metrics/features/${e}/raw?hoursBack=${s}`),{data:r,error:a}=Ne(n,()=>rc(n)),o=g.useCallback(()=>{gt(ac).catch(console.warn)},[]);return{featureMetrics:r==null?void 0:r.data,loading:!a&&!r,refetchFeatureMetrics:o,error:a}},rc=e=>fetch(e).then(he("Features")).then(s=>s.json()).then(),oc=u("h2")(({theme:e})=>({margin:0,marginBottom:e.spacing(1),fontSize:e.fontSizes.smallBody,fontWeight:e.fontWeight.thin,color:e.palette.text.secondary})),$e=48,ic=({hoursBack:e,setHoursBack:s})=>{const n=r=>{s(cc(r))};return t.jsxs("div",{children:[t.jsx(oc,{children:"Period"}),t.jsx(xs,{name:"feature-metrics-period",id:"feature-metrics-period",options:lc,value:String(e),onChange:n,fullWidth:!0})]})},cc=e=>{switch(e){case"1":return 1;case"24":return 24;default:return $e}},lc=[{key:"1",label:"Last hour"},{key:"24",label:"Last 24 hours"},{key:`${$e}`,label:`Last ${$e} hours`}],dc=({value:e})=>{const{locationSettings:s}=ys(),n=e?e instanceof Date?Pt(e,s.locale):Pt(js(e),s.locale):void 0;return t.jsx(Es,{lineClamp:1,children:n})},uc=({metrics:e,tableSectionId:s})=>{const n=Pe(ia.breakpoints.down("md")),r=g.useMemo(()=>({sortBy:[{id:"timestamp"}]}),[]),{getTableProps:a,getTableBodyProps:o,headerGroups:i,rows:c,prepareRow:l,setHiddenColumns:d}=Je.useTable({initialState:r,columns:Qt,data:e,autoResetHiddenColumns:!1,disableSortRemove:!0,defaultColumn:{Cell:Es}},Je.useGlobalFilter,Je.useSortBy);return ca([{condition:n,columns:["appName","environment"]}],d,Qt),e.length===0?null:t.jsxs(la,{...a(),rowHeight:"standard",id:s,children:[t.jsx(da,{headerGroups:i}),t.jsx(ua,{...o(),children:c.map(p=>(l(p),t.jsx(pa,{hover:!0,...p.getRowProps(),children:p.cells.map(h=>t.jsx(ga,{...h.getCellProps(),children:h.render("Cell")}))})))})]})},Qt=[{id:"Icon",width:"1%",disableSortBy:!0,Cell:()=>t.jsx(ha,{icon:t.jsx(Ua,{color:"disabled"})})},{Header:"Time",accessor:"timestamp",Cell:e=>t.jsx(dc,{value:e.row.original.timestamp})},{Header:"Application",accessor:"appName"},{Header:"Environment",accessor:"environment"},{id:"requested",Header:"Requested",accessor:e=>e.yes+e.no},{Header:"Exposed",accessor:"yes"}],pc=({metrics:e,...s})=>{const n=g.useMemo(()=>e.reduce((a,o)=>a+o.yes,0),[e]),r=g.useMemo(()=>e.reduce((a,o)=>a+o.no,0),[e]);return t.jsx(zs,{...s,totalYes:n,totalNo:r})},gc=({metrics:e,hoursBack:s})=>{const n=Bt(),r=Bt();return e.length===0?t.jsxs(K,{mt:6,children:[t.jsx(H,{variant:"body1",paragraph:!0,children:"We have yet to receive any metrics for this feature toggle in the selected time period."}),t.jsx(H,{variant:"body1",paragraph:!0,children:"Please note that, since the SDKs send metrics on an interval, it might take some time before metrics appear."})]}):t.jsxs(g.Suspense,{fallback:null,children:[t.jsx(K,{borderTop:1,pt:2,mt:3,borderColor:"divider",children:t.jsx(hc,{metrics:e,hoursBack:s,statsSectionId:n})}),t.jsx(K,{mt:4,children:t.jsx(pc,{metrics:e,hoursBack:s,statsSectionId:n,tableSectionId:r})}),t.jsx(K,{mt:4,children:t.jsx(uc,{metrics:e,tableSectionId:r})})]})},hc=fa.lazy(()=>xa(()=>import("./FeatureMetricsChart-ExGq1eXl.js"),__vite__mapDeps([]))),ut=e=>{const{search:s}=window.location,n=ae(),r=g.useMemo(()=>new URLSearchParams(s),[s]),a=g.useCallback(o=>{const i=new URLSearchParams(s);i.set(e,o),n({search:i.toString()},{replace:!0})},[e,s,n]);return[r.get(e)||void 0,a]},fc=e=>{const[s,n]=ut(e),r=g.useCallback(a=>n(String(a)),[n]);return[Number.isFinite(Number(s))?Number(s):void 0,r]},xc=u("h2")(({theme:e})=>({margin:0,marginBottom:e.spacing(1.5),fontSize:e.fontSizes.smallBody,fontWeight:e.fontWeight.thin,color:e.palette.text.secondary})),mc=u("ul")(({theme:e})=>({display:"flex",flexWrap:"wrap",gap:e.spacing(1),listStyleType:"none",padding:0,minHeight:"100%"})),yc=u("li")(({theme:e})=>({"& > [aria-pressed=true]":{backgroundColor:e.palette.background.alternative,color:e.palette.primary.contrastText},"& > [aria-pressed=true]:hover":{backgroundColor:e.palette.primary.light}})),Zt=({title:e,values:s,value:n,setValue:r})=>{const a=i=>()=>{s.has(i)&&r(i)},o=g.useMemo(()=>Array.from(s).sort((i,c)=>i.localeCompare(c)),[s]);return t.jsxs("div",{children:[t.jsx(xc,{children:e}),t.jsx(mc,{children:o.map(i=>t.jsx(yc,{children:t.jsx(Ss,{label:i,onClick:a(i),"aria-pressed":i===n,sx:ma})},i))})]})},jc=()=>{const e=A("projectId"),s=A("featureId"),n=Sc(e,s),r=bc(s);vs("Metrics");const[a=$e,o]=fc("hoursBack"),{featureMetrics:i}=Us(s,a),[c,l]=g.useState(i);g.useEffect(()=>{i&&l(i)},[i]);const d=Array.from(n)[0],p=Array.from(r)[0],[h=d,m]=ut("environment"),[j=p,y]=ut("application"),T=g.useMemo(()=>c==null?void 0:c.filter(f=>f.environment===h).filter(f=>f.appName===j),[c,h,j]);return T?t.jsxs(At,{children:[t.jsxs(de,{container:!0,component:"header",spacing:2,children:[t.jsx(de,{item:!0,xs:12,md:5,children:t.jsx(b,{condition:n.size>0,show:t.jsx(Zt,{title:"Environments",values:n,value:h,setValue:m})})}),t.jsx(de,{item:!0,xs:12,md:5,children:t.jsx(b,{condition:r.size>0,show:t.jsx(Zt,{title:"Applications",values:r,value:j,setValue:y})})}),t.jsx(de,{item:!0,xs:12,md:2,children:t.jsx(ic,{hoursBack:a,setHoursBack:o})})]}),t.jsx(gc,{metrics:T,hoursBack:a})]}):null},Sc=(e,s)=>{const{feature:n}=M(e,s),r=n.environments.map(a=>a.name);return new Set(r)},bc=e=>{const{featureMetrics:s=[]}=Us(e,$e),n=s.map(r=>r.appName);return new Set(n)},Cc=(e,s)=>{const n=new Set(e),r=new Set(s);return n.size!==r.size?!1:[...n].every(a=>r.has(a))},Xt=u("div")(({theme:e})=>({display:"grid",gap:e.spacing(2)})),es=u(ie)(({theme:e})=>({marginBottom:e.spacing(1)})),vc=u(wt)({padding:0}),wc=({projectId:e,open:s,onClose:n,onClick:r,feature:a,changeRequests:o})=>{const i=A("projectId"),{project:c}=As(e),{isChangeRequestConfiguredInAnyEnv:l}=Q(e),d=l(),p=g.useMemo(()=>Cc(a.environments.map(j=>j.name),c.environments.map(j=>j.environment)),[a,c]),h=o?o.length>0:!1,m=a.dependencies.length>0||a.children.length>0;return t.jsx(b,{condition:p&&!m&&!h&&!d,show:t.jsx(oe,{open:s,onClose:n,onClick:r,title:"Confirm change project",primaryButtonText:"Change project",secondaryButtonText:"Cancel",children:t.jsxs(Xt,{children:[t.jsx(es,{severity:"success",children:"This feature toggle is compatible with the new project."}),t.jsx("p",{children:"Are you sure you want to change the project for this toggle?"})]})}),elseShow:t.jsx(oe,{open:s,onClick:n,title:"Confirm change project",primaryButtonText:"Close",children:t.jsxs(Xt,{children:[t.jsx(es,{severity:"warning",children:"Cannot proceed with the move"}),t.jsx(b,{condition:m,show:t.jsxs("p",{children:[t.jsx("span",{children:"The feature toggle must not have any dependencies."})," ",t.jsx("br",{}),t.jsx("span",{children:"Please remove feature dependencies first."})]})}),t.jsx(b,{condition:!p,show:t.jsx("p",{children:"In order to move a feature toggle between two projects, both projects must have the exact same environments enabled."})}),t.jsx(b,{condition:h,show:t.jsxs(t.Fragment,{children:[t.jsx("p",{children:"The feature toggle must not have any pending change requests. This feature toggle is currently referenced in the following change requests:"}),t.jsx(vc,{children:o==null?void 0:o.map(j=>t.jsx(be,{children:t.jsxs(J,{to:`/projects/${i}/change-requests/${j.id}`,children:["View change request"," ",j.id]})},j.id))})]})}),t.jsx(b,{condition:d,show:t.jsxs("p",{children:["You're not allowed to move the feature to project"," ",t.jsx(J,{to:`/projects/${e}/settings/change-requests`,children:e}),". This project has change requests enabled."]})})]})})})},Tc=()=>{const{hasAccess:e}=g.useContext(mt),s=A("projectId"),n=A("featureId"),{feature:r,refetchFeature:a}=M(s,n),[o,i]=g.useState(!1),{changeFeatureProject:c}=Ue(),{setToastData:l,setToastApiError:d}=W(),[p,h]=g.useState(s),{projects:m}=ya(),j=ae(),{changeRequests:y}=Bs(s,n),T=async()=>{try{p&&(await c(s,n,p),a(),l({title:"Project changed",type:"success"}),i(!1),j(`/projects/${p}/features/${n}/settings`,{replace:!0}))}catch(x){d(N(x))}},f=g.useMemo(()=>m.map(x=>x.id).filter(x=>e(Ot,x)),[m,e]);return f.length===0?null:t.jsxs(t.Fragment,{children:[t.jsx(ja,{value:p,onChange:h,label:"Project",filter:x=>f.includes(x),enabled:!0}),t.jsx(ge,{permission:Ot,onClick:()=>i(!0),disabled:p===s,projectId:s,children:"Save"}),t.jsx(wc,{changeRequests:y,projectId:p,open:o,feature:r,onClose:()=>i(!1),onClick:T})]})},Ec=u("div")({display:"flex",alignItems:"center"}),Ac=u(H)(({theme:e})=>({fontSize:e.fontSizes.mainHeader})),Dc=({projectId:e,featureId:s})=>{var o;const{feature:n}=M(e,s),r=ae(),a=()=>{r(`/projects/${e}/features/${s}/edit`)};return t.jsxs(t.Fragment,{children:[t.jsxs(Ec,{children:[t.jsx(Ac,{children:"Feature information"}),t.jsx(re,{permission:Ce,projectId:e,"data-loading":!0,onClick:a,tooltipProps:{title:"Edit"},children:t.jsx(ve,{})})]}),t.jsxs(H,{children:["Name: ",t.jsx("strong",{children:n.name})]}),t.jsxs(H,{children:["Description:"," ",t.jsx("strong",{children:(o=n.description)!=null&&o.length?n.description:"no description"})]}),t.jsxs(H,{children:["Type: ",t.jsx("strong",{children:n.type})]}),t.jsxs(H,{children:["Impression Data:"," ",t.jsx("strong",{children:n.impressionData?"enabled":"disabled"})]})]})},_e="metadata",it="project",Fc=u("div")(({theme:e})=>({width:"20%",borderRight:`1px solid ${e.palette.divider}`,padding:e.spacing(2,0),[e.breakpoints.down("md")]:{width:"35%"}})),Rc=u("div")(({theme:e})=>({padding:e.spacing(4),display:"flex",flexDirection:"column",width:400,"& > *":{margin:e.spacing(1,0)}})),$c=()=>{const e=A("projectId"),s=A("featureId"),[n,r]=g.useState(_e),{uiConfig:a}=ye();return t.jsx(At,{header:"Settings",sx:{padding:0},children:t.jsxs(K,{sx:{display:"flex"},children:[t.jsx(Fc,{children:t.jsxs(wt,{children:[t.jsx(be,{sx:{padding:"0.75rem 2rem"},button:!0,onClick:()=>r(_e),selected:n===_e,children:"Metadata"},0),t.jsx(be,{sx:{padding:"0.75rem 2rem"},button:!0,onClick:()=>r(it),selected:n===it,hidden:!a.flags.P,children:"Project"},1)]})}),t.jsxs(Rc,{children:[t.jsx(b,{condition:n===_e,show:t.jsx(Dc,{projectId:e,featureId:s})}),t.jsx(b,{condition:n===it&&a.flags.P,show:t.jsx(Tc,{})})]})]})})},kc=({stale:e,showActive:s=!0})=>{if(!e&&!s)return null;const n=e?"Feature toggle is deprecated.":"Feature toggle is active.",r=e?"Stale":"Active";return t.jsx("div",{"data-loading":!0,style:{marginLeft:"8px"},children:t.jsx(Te,{color:e?"error":"success",title:n,children:r})})},ts=u("strong")({wordBreak:"break-all"}),Ic=()=>{const e=A("projectId"),s=A("featureId"),{archivedFeatures:n}=Sa(),r=ba(e,{name:s});return n?n.some(o=>o.name===s)?t.jsxs("p",{children:["The feature ",t.jsx(ts,{children:s})," has been archived. You can find it on the"," ",t.jsx(J,{to:`/projects/${e}/archive`,children:"project archive page"}),"."]}):t.jsxs("p",{children:["The feature ",t.jsx(ts,{children:s})," does not exist. Would you like to"," ",t.jsx(J,{to:r,children:"create it"}),"?"]}):null},Pc=u(J)(({theme:e})=>({textDecoration:"none",color:e.palette.primary.main,fontWeight:e.fontWeight.bold})),Bc=({isOpen:e,onClose:s,features:n,project:r})=>t.jsxs(oe,{title:"You can't archive a feature that other features depend on",open:e,primaryButtonText:"OK",onClick:s,children:[t.jsx("p",{children:"The following features depend on your feature:"}),t.jsx("ul",{children:n.map(a=>t.jsx("li",{children:t.jsx(Pc,{to:`/projects/${r}/features/${a}`,target:"_blank",rel:"noopener noreferrer",children:a})},a))})]}),Oc=e=>g.createElement("svg",{fill:"none",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",...e},g.createElement("path",{d:"M1 12a5 5 0 0 1 5-5h4a5 5 0 0 1 4.584 7H14a1.993 1.993 0 0 1-1.375-.547A3 3 0 0 0 10 9H6a3 3 0 1 0 0 6h2.803a6.03 6.03 0 0 0 1.822 1.961A5.033 5.033 0 0 1 10 17H6a5 5 0 0 1-5-5Z",fill:"#202021"}),g.createElement("path",{d:"M9 12c0-.711.148-1.387.416-2H10c.532 0 1.016.208 1.375.547A3 3 0 0 0 14 15h4a3 3 0 1 0 0-6h-2.803a6.03 6.03 0 0 0-1.822-1.961C13.58 7.013 13.788 7 14 7h4a5 5 0 0 1 0 10h-4a5 5 0 0 1-5-5Z",fill:"#202021"})),Lc=e=>g.createElement("svg",{fill:"none",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",...e},g.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M1 8a5 5 0 0 1 5-5h4a5 5 0 0 1 4.584 7H14a1.993 1.993 0 0 1-1.375-.547A3 3 0 0 0 10 5H6a3 3 0 0 0 0 6h2.803a6.03 6.03 0 0 0 1.822 1.961A5.033 5.033 0 0 1 10 13H8v3a1 1 0 0 0 1 1h1.17A3.001 3.001 0 0 1 13 15h7a3 3 0 1 1 0 6h-7a3.001 3.001 0 0 1-2.83-2H9a3 3 0 0 1-3-3v-3a5 5 0 0 1-5-5Zm8 0c0-.711.148-1.388.416-2H10c.532 0 1.016.208 1.375.547A3 3 0 0 0 14 11h4a3 3 0 1 0 0-6h-2.803a6.03 6.03 0 0 0-1.822-1.961C13.58 3.013 13.788 3 14 3h4a5 5 0 0 1 0 10h-4a5 5 0 0 1-5-5Z",fill:"#202021"})),_c=u("div")(({theme:e})=>({backgroundColor:e.palette.background.paper,borderRadius:e.shape.borderRadiusLarge,marginBottom:e.spacing(2)})),Mc=u("div")(({theme:e})=>({padding:e.spacing(2,4,2,2),display:"flex",justifyContent:"space-between",alignItems:"center",[e.breakpoints.down(500)]:{flexDirection:"column"}})),ss=u("div")({display:"flex",alignItems:"center"}),ns=u("div")(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1),marginTop:e.spacing(1),fontSize:e.fontSizes.smallBody,padding:e.spacing(.75,1.5),backgroundColor:e.palette.background.elevation2,borderRadius:`${e.shape.borderRadiusMedium}px`,width:"max-content"}));u(Oc)(({theme:e})=>({width:e.fontSizes.smallBody,height:e.fontSizes.smallBody}));u(Lc)(({theme:e})=>({width:e.fontSizes.smallBody,height:e.fontSizes.smallBody}));const qc=u("h1")(({theme:e})=>({fontSize:e.fontSizes.mainHeader,fontWeight:"normal",display:"flex",alignItems:"center",wordBreak:"break-all"})),zc=u("div")({flexShrink:0,display:"flex"}),Vc=u("div")(({theme:e})=>({width:"100%",backgroundColor:e.palette.divider,height:"1px"})),Nc=u("div")(({theme:e})=>({padding:e.spacing(0,4)})),Hc=u(Ca)(({theme:e})=>({textTransform:"none",width:"auto",fontSize:e.fontSizes.bodySize,padding:"0 !important",[e.breakpoints.up("md")]:{minWidth:160}})),Wc=u(J)(({theme:e})=>({maxWidth:"100%",textDecoration:"none","&:hover, &:focus":{textDecoration:"underline"}})),Kc=()=>{var S,k;const e=A("projectId"),s=A("featureId"),{refetch:n}=As(e),{favorite:r,unfavorite:a}=va(),{refetchFeature:o}=M(e,s),{setToastData:i,setToastApiError:c}=W(),[l,d]=g.useState(!1),[p,h]=g.useState(!1),[m,j]=g.useState(!1),[y,T]=g.useState(!1),f=Pe("(max-width:500px)"),{feature:x,loading:R,error:_,status:q}=M(e,s),z=ae(),{pathname:C}=wa(),v=Ta(R),$=`/projects/${e}/features/${s}`,P=[{title:"Overview",path:`${$}`,name:"overview"},{title:"Metrics",path:`${$}/metrics`,name:"Metrics"},{title:"Variants",path:`${$}/variants`,name:"Variants"},{title:"Settings",path:`${$}/settings`,name:"Settings"},{title:"Event log",path:`${$}/logs`,name:"Event log"}],V=P.find(w=>w.path===C)??P[0],Y=async()=>{try{x!=null&&x.favorite?await a(e,x.name):await r(e,x.name),o()}catch{c("Something went wrong, could not update favorite")}};if(q===404)return t.jsx(Ic,{});if(_!==void 0)return t.jsx("div",{ref:v});const U=()=>{try{Ia(x.name),T(!0),setTimeout(()=>{T(!1)},3e3)}catch{i({type:"error",title:"Could not copy feature name"})}};return t.jsxs("div",{ref:v,children:[t.jsxs(_c,{children:[t.jsxs(Mc,{children:[t.jsxs(ss,{children:[t.jsx(Ea,{onClick:Y,isFavorite:x==null?void 0:x.favorite}),t.jsxs("div",{children:[t.jsxs(ss,{children:[t.jsxs(qc,{"data-loading":!0,children:[x.name," "]}),t.jsx(ee,{title:y?"Copied!":"Copy name",arrow:!0,children:t.jsx(ke,{onClick:U,style:{marginLeft:8},children:y?t.jsx(Aa,{style:{fontSize:16}}):t.jsx(Da,{style:{fontSize:16}})})}),t.jsx(b,{condition:!f,show:t.jsx(kc,{stale:x==null?void 0:x.stale})})]}),t.jsx(b,{condition:x.dependencies.length>0,show:t.jsxs(ns,{children:[t.jsx("b",{children:"Has parent: "}),t.jsx(Wc,{to:`/projects/${x.project}/features/${(S=x==null?void 0:x.dependencies[0])==null?void 0:S.feature}`,children:(k=x==null?void 0:x.dependencies[0])==null?void 0:k.feature})]})}),t.jsx(b,{condition:x.children.length>0,show:t.jsxs(ns,{children:[t.jsx("b",{children:"Has children:"}),t.jsx(Ns,{childFeatures:x.children,project:x.project})]})})]})]}),t.jsxs(zc,{children:[t.jsx(re,{permission:Fa,projectId:e,"data-loading":!0,component:J,to:`/projects/${e}/features/${s}/copy`,tooltipProps:{title:"Clone"},children:t.jsx(Ya,{})}),t.jsx(re,{permission:Ra,projectId:e,tooltipProps:{title:"Archive feature toggle"},"data-loading":!0,onClick:()=>h(!0),children:t.jsx(Wa,{})}),t.jsx(re,{onClick:()=>j(!0),permission:Ce,projectId:e,tooltipProps:{title:"Toggle stale state"},"data-loading":!0,children:t.jsx(za,{})}),t.jsx(re,{onClick:()=>d(!0),permission:Ce,projectId:e,tooltipProps:{title:"Add tag"},"data-loading":!0,children:t.jsx($a,{})})]})]}),t.jsx(Vc,{}),t.jsx(Nc,{children:t.jsx(ka,{value:V.path,indicatorColor:"primary",textColor:"primary",children:P.map(w=>t.jsx(Hc,{label:w.title,value:w.path,onClick:()=>z(w.path),"data-testid":`TAB-${w.title}`},w.title))})})]}),t.jsxs(ws,{children:[t.jsx(xe,{path:"metrics",element:t.jsx(jc,{})}),t.jsx(xe,{path:"logs",element:t.jsx(Ka,{})}),t.jsx(xe,{path:"variants",element:t.jsx(nc,{})}),t.jsx(xe,{path:"settings",element:t.jsx($c,{})}),t.jsx(xe,{path:"*",element:t.jsx(vi,{})})]}),t.jsx(b,{condition:x.children.length>0,show:t.jsx(Bc,{features:x.children,project:e,isOpen:p,onClose:()=>h(!1)}),elseShow:t.jsx(Va,{isOpen:p,onConfirm:()=>{n(),z(`/projects/${e}`)},onClose:()=>h(!1),projectId:e,featureIds:[s]})}),t.jsx(Na,{isStale:x.stale,isOpen:m,onClose:()=>{j(!1),o()},featureId:s,projectId:e}),t.jsx(Ws,{open:l,setOpen:d})]})};export{Kc as default};
|
|
20
|
+
function __vite__mapDeps(indexes) {
|
|
21
|
+
if (!__vite__mapDeps.viteFileDeps) {
|
|
22
|
+
__vite__mapDeps.viteFileDeps = []
|
|
23
|
+
}
|
|
24
|
+
return indexes.map((i) => __vite__mapDeps.viteFileDeps[i])
|
|
25
|
+
}
|