unleash-server 5.7.2 → 5.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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-iXZHz_Rq.js +13 -0
- package/frontend/build/static/CreateProject-BbtWHPl8.js +4 -0
- package/frontend/build/static/FeatureArchiveDialog-D_tZ06Sa.js +7 -0
- package/frontend/build/static/{FeatureMetricsChart-d6700d04.js → FeatureMetricsChart-SiwdLhRh.js} +2 -2
- package/frontend/build/static/FeatureViewLazyExport-baWLSkEu.js +25 -0
- package/frontend/build/static/LazyAdminExport-ckQgco28.js +44 -0
- package/frontend/build/static/LazyProjectExport-R4jiFkLZ.js +25 -0
- package/frontend/build/static/{NetworkOverview-f1b8bc51.js → NetworkOverview-StnrlVkY.js} +53 -47
- package/frontend/build/static/NetworkTraffic-V87e4GGP.js +1 -0
- package/frontend/build/static/{ReactJSONEditor-cee5845e.js → ReactJSONEditor-Ybg5ijJk.js} +66 -66
- package/frontend/build/static/RoleCell-3lnoYolp.js +1 -0
- package/frontend/build/static/StrategyItemContainer-wRkYMo4g.js +1 -0
- package/frontend/build/static/chartjs-adapter-date-fns.esm-kkU_hxq-.js +23 -0
- package/frontend/build/static/{flowchart-elk-definition-170a3958-176ecefe.js → flowchart-elk-definition-170a3958-vkzW0gdf.js} +3 -3
- package/frontend/build/static/index-ORDXjnpF.js +501 -0
- package/frontend/build/static/{is_dark-bdf64838.js → is_dark-zSU9-MOM.js} +1 -1
- package/frontend/build/static/{mindmap-definition-44684416-6e91e0f5.js → mindmap-definition-44684416-2v9fPc7w.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-RDFfY8I3.js} +1 -1
- package/frontend/build/static/{unknownify-708e56b5.js → unknownify-vwm75Pg9.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-T6gzMZPt.js} +1 -1
- package/frontend/build/static/useProjectForm-o3r31UMh.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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{gu as o}from"./index-ae1bed58.js";const t=o(),s=t;export{s as B};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{s as I,i as R,f as B,ax as D,ay as O,az as U,ak as w,aA as x,j as t,aB as J,d as L,aC as b,aD as F,h as K,aE as $}from"./index-ae1bed58.js";import{u as z,P as M,D as q}from"./useProjectForm-ff29595e.js";const G="CREATE_PROJECT_BTN",Y=I(R)(({theme:e})=>({marginLeft:e.spacing(3)})),Z=()=>{const{setToastData:e,setToastApiError:l}=B(),{refetchUser:p}=D(),{uiConfig:u}=O(),a=U(),{trackEvent:o}=w(),{projectId:s,projectName:j,projectDesc:m,projectMode:r,setProjectMode:C,setProjectId:P,setProjectName:h,setProjectDesc:E,getCreateProjectPayload:c,clearErrors:n,validateProjectId:i,validateName:T,setProjectStickiness:f,projectStickiness:d,errors:g}=z(),{createProject:A,loading:y}=x();return t(J,{loading:y,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:()=>`curl --location --request POST '${u.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)}'`,children:L(M,{errors:g,handleSubmit:async _=>{_.preventDefault(),n();const N=T(),S=await i();if(N&&S){const k=c();try{await A(k),p(),a(`/projects/${s}`),e({title:"Project created",text:"Now you can add toggles to this project",confetti:!0,type:"success"}),d!==q&&o("project_stickiness_set"),o("project-mode",{props:{mode:r,action:"added"}})}catch(v){l(K(v))}}},projectId:s,setProjectId:P,projectName:j,projectStickiness:d,projectMode:r,setProjectMode:C,setProjectStickiness:f,setProjectName:h,projectDesc:m,setProjectDesc:E,mode:"Create",clearErrors:n,validateProjectId:i,children:[t(b,{name:"project",permission:F,"data-testid":G}),t(Y,{onClick:()=>{a($)},children:"Cancel"})]})})};export{Z as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as r,j as o}from"./index-ae1bed58.js";const a=r(o("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"}),"Error");export{a as E};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{c as X,j as t,b as Z,aF as z,aX as M,d as v,b7 as L,C as k,K as O,T as x,cq as le,s as P,gc as ce,bd as ue,bx as ee,az as te,ay as U,gd as de,ge as he,gf as ge,gg as pe,gh as me,bJ as j,gi as fe,i as ve,gj as be,cB as ye,bu as Se,r as b,aA as W,f as B,by as Te,ak as Ce,bw as Ee,aB as Ae,aY as we,bn as ke,gk as xe,h as q,B as Re,ai as De,H as F,eN as Pe,gl as qe,aW as ne,aG as Fe,aK as J,c7 as G,gm as $e,gn as Oe,go as Be,gp as Ve,ba as Le,bb as _e,bc as Ne,A as ae,l as se,ca as je,m as He,o as ze,R as Me,gq as Ue,n as We,u as Ge,b_ as Ye,aR as Je,aP as Ke,aQ as Ie,aL as H,bW as re,a$ as oe}from"./index-ae1bed58.js";const Qe=X(t("path",{d:"M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96z"}),"Cloud"),xt=X(t("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"),Rt=({enabled:e,className:a})=>{const s=Z(),n=e?"Environment enabled":"Environment disabled",r={backgroundColor:e?s.palette.primary.light:s.palette.neutral.border,borderRadius:"50%",width:"28px",height:"28px",minWidth:"28px",display:"flex",alignItems:"center",justifyContent:"center",marginRight:s.spacing(1)},o={fill:s.palette.common.white,width:"16px",height:"16px"};return t("div",{style:r,className:a,children:t(Qe,{style:o,titleAccess:n})})},Xe=({isOpen:e,onConfirm:a,onClose:s,showBanner:n,environment:r,messageComponent:o})=>{const i=z("projectId"),{data:d}=M(i),{changeRequestInReviewOrApproved:h,alert:m}=le(d),g=h(r||"");return v(L,{open:e,primaryButtonText:g?"Add to existing change request":"Add suggestion to draft",secondaryButtonText:"Cancel",onClick:a,onClose:s,title:"Request changes",fullWidth:!0,children:[t(k,{condition:g,show:m}),t(k,{condition:!!n,show:v(O,{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(x,{variant:"body2",color:"text.secondary",children:"Your suggestion:"}),o]})},Ze=P("form")(({theme:e})=>({display:"grid",gap:e.spacing(2)})),K=P("hr")(({theme:e})=>({width:"100%",height:"1px",margin:e.spacing(2,0),border:"none",background:e.palette.background.elevation2})),et=P("div")(({theme:e})=>({display:"flex",justifyContent:"end",gap:e.spacing(2),paddingBottom:e.spacing(10)})),tt=({projectId:e,environmentId:a,permission:s,onSubmit:n,onCancel:r,loading:o,strategy:i,setStrategy:d,segments:h,setSegments:m,errors:g})=>{const p=ce(i.constraints),l=ue(s,e,a),{strategyDefinition:c}=ee(i==null?void 0:i.name),y=te(),{uiConfig:w,error:E,loading:T}=U();if(E)throw E;if(T||!c)return null;const u=C=>c.parameters.find(A=>A.name===C),R=(C,A)=>{const S=u(C);if(C!=="groupId"){const f=be(S,A);return f?(g.setFormError(C,f),!1):(g.removeFormError(C),!0)}return!0},V=()=>c.parameters.map(C=>C.name).map(C=>{var A;return R(C,(A=i.parameters)==null?void 0:A[C])}).every(Boolean),$=()=>{y(`/projects/${e}/settings/default-strategy`)};return v(Ze,{onSubmit:async C=>{if(C.preventDefault(),V())n();else return},children:[t(de,{title:i.title||"",setTitle:C=>{d(A=>({...A,title:C}))}}),t(he,{segments:h,setSegments:m,projectId:e}),t(ge,{projectId:e,environmentId:a,strategy:i,setStrategy:d}),t(K,{}),t(pe,{strategy:i,strategyDefinition:c,setStrategy:d,validateParameter:R,errors:g,hasAccess:l}),t(k,{condition:i.parameters!=null&&"stickiness"in i.parameters,show:t(me,{strategy:i,setStrategy:d,environment:a,projectId:e})}),t(K,{}),v(et,{children:[t(j,{permission:s,projectId:e,environmentId:a,variant:"contained",color:"primary",type:"submit",disabled:o||!p||g.hasFormErrors(),"data-testid":fe,children:"Save strategy"}),t(ve,{type:"button",color:"primary",onClick:r||$,disabled:o,children:"Cancel"})]})]})},nt=(e,a)=>{var i;const{project:s,refetch:n}=ye(e),r={name:"flexibleRollout",constraints:[],parameters:{rollout:"100",stickiness:s.defaultStickiness||"default",groupId:""}},o=(i=s.environments.find(d=>d.environment===a))==null?void 0:i.defaultStrategy;return{defaultStrategyFallback:r,strategy:o,refetch:n}},Dt=()=>{const e=z("projectId"),a=Se("environmentId"),{defaultStrategyFallback:s,strategy:n,refetch:r}=nt(e,a),[o,i]=b.useState(n||s),[d,h]=b.useState([]),{updateDefaultStrategy:m,loading:g}=W(),{strategyDefinition:p}=ee(o==null?void 0:o.name),{setToastData:l,setToastApiError:c}=B(),y=Te(),{uiConfig:w}=U(),{unleashUrl:E}=w,T=te(),{trackEvent:u}=Ce(),{segments:R,refetchSegments:V}=Ee();b.useEffect(()=>{if(R&&(n!=null&&n.segments)){const A=[];for(const S of n==null?void 0:n.segments)A.push(...R.filter(f=>f.id===S));h(A)}},[JSON.stringify(R),JSON.stringify(n==null?void 0:n.segments)]);const $=at(o,d),_=async A=>{await m(e,a,A),u("default_strategy",{props:{action:"edit",hasTitle:!!A.title}}),await V(),l({title:"Default Strategy updated",type:"success",confetti:!0})},C=async()=>{const A=`/projects/${e}/settings/default-strategy`;try{await _($),await r(),T(A)}catch(S){c(q(S))}};return!p||!o?null:t(Ae,{modal:!0,title:we((o==null?void 0:o.name)??""),description:rt,documentationLink:ot,documentationLinkLabel:it,formatApiCode:()=>st(e,a,$,p,E),children:t(tt,{projectId:e,strategy:o,setStrategy:i,segments:d,setSegments:h,environmentId:a,onSubmit:C,loading:g,permission:ke,errors:y,isChangeRequest:!1})})},at=(e,a)=>({name:e.name,title:e.title,constraints:e.constraints??[],parameters:e.parameters??{},variants:e.variants??[],segments:a.map(s=>s.id),disabled:e.disabled??!1}),st=(e,a,s,n,r)=>{if(!r)return"";const o={...s,parameters:xe(s.parameters??{},n)},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}'`},rt=`
|
|
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
|
-
`,ot="https://docs.getunleash.io/reference/activation-strategies",it="Default strategy documentation",lt=e=>{const[a,s]=b.useState(e),n=b.useCallback(()=>s(e),[e]);return b.useEffect(()=>{s(e)},[e]),[a,s,n]},ct=P(Re)(()=>({mx:"auto",...De})),Pt=({projectId:e,featureId:a,environmentName:s,value:n,onToggle:r})=>{const[o,i,d]=lt(n),h=()=>{i(!o),requestAnimationFrame(()=>{r(!o,d)})},m=`${a}-${s}`;return t(F,{children:t(ct,{"data-testid":`TOGGLE-${m}`,children:t(Pe,{tooltip:o?`Disable feature in ${s}`:`Enable feature in ${s}`,checked:n,environmentId:s,projectId:e,permission:qe,inputProps:{"aria-label":s},onClick:h,"data-testid":"permission-switch",disableRipple:!0,disabled:n!==o})},m)})},ut=e=>{const{setToastData:a,setToastApiError:s}=B(),{addChange:n}=ne(),{refetch:r}=M(e),[o,i]=b.useState({isOpen:!1}),d=b.useCallback((g,p,l,c)=>{i({featureName:g,environment:p,enabled:l,shouldActivateDisabledStrategies:c,isOpen:!0})},[]),h=b.useCallback(()=>{i(g=>({...g,isOpen:!1}))},[]),m=b.useCallback(async()=>{try{await n(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){s(q(g)),i(p=>({...p,isOpen:!1}))}},[n]);return{onChangeRequestToggle:d,onChangeRequestToggleClose:h,onChangeRequestToggleConfirm:m,changeRequestDialogDetails:o}},dt=({enabled:e,featureName:a,environment:s})=>v(x,{"data-testid":"update-enabled-message",children:[t("strong",{children:e?"Enable":"Disable"})," feature toggle"," ",t("strong",{children:a})," in ",t("strong",{children:s})]}),ht=P("ul")(({theme:e})=>({margin:e.spacing(1),paddingLeft:e.spacing(2)})),gt=({isOpen:e,onAddDefaultStrategy:a,onActivateDisabledStrategies:s,onClose:n,environment:r,featureId:o})=>{var g,p,l;const i=z("projectId"),{feature:d}=Fe(i,o),h=(l=(p=(g=d.environments)==null?void 0:g.find(({name:c})=>c===r))==null?void 0:p.strategies)==null?void 0:l.filter(({disabled:c})=>c).length,m=h?h===1?"1 disabled strategy":`${h} disabled strategies`:"disabled strategies";return v(L,{open:e,secondaryButtonText:"Cancel",permissionButton:v(F,{children:[t(j,{type:"button",variant:"outlined",permission:J,projectId:i,environmentId:r,onClick:a,children:"Add default strategy"}),t(j,{type:"button",variant:"outlined",permission:J,projectId:i,environmentId:r,onClick:s,children:"Enable all strategies"})]}),onClose:n,title:`Enable feature toggle in ${r}`,fullWidth:!0,children:[t(x,{sx:{mb:c=>c.spacing(3)},children:"A feature toggle cannot be enabled without an enabled strategy."}),t(x,{children:"To enable this feature toggle you can choose to:"}),v(ht,{children:[t("li",{children:t(x,{children:t("strong",{children:"Add the default strategy"})})}),t("li",{children:v(x,{children:[t("strong",{children:"Enable all the disabled strategies"})," ","(this feature toggle has ",m,")"]})})]})]})},pt=e=>{const a=s=>{s<e.length&&e[s](()=>a(s+1))};a(0)},qt=e=>{const{toggleFeatureEnvironmentOn:a,toggleFeatureEnvironmentOff:s}=G(),{setToastData:n,setToastApiError:r}=B(),[o,i]=b.useState({open:!1,label:"",loading:!1,onClose:()=>{},onClick:()=>{}}),[d,h]=b.useState({isOpen:!1,environment:"",featureId:"",onClose:()=>{},onActivateDisabledStrategies:()=>{},onAddDefaultStrategy:()=>{}}),{onChangeRequestToggle:m,onChangeRequestToggleClose:g,onChangeRequestToggleConfirm:p,changeRequestDialogDetails:l}=ut(e),[c,y]=b.useState(),w=b.useCallback(async(T,u)=>{let R=!1;return pt([S=>{if(u.isChangeRequestEnabled||!Oe(u.environmentType||""))return S();i({open:!0,label:`${T?"Enable":"Disable"} Environment`,loading:!1,onClose:()=>{var f;i(D=>({...D,open:!1})),(f=u.onRollback)==null||f.call(u)},onClick:()=>{i(f=>({...f,open:!1,loading:!0})),S()}})},S=>{if(T===!1||!u.hasStrategies||u.hasEnabledStrategies)return S();h({isOpen:!0,environment:u.environmentName,featureId:u.featureId,onClose:()=>{var f;h(D=>({...D,isOpen:!1})),(f=u.onRollback)==null||f.call(u)},onActivateDisabledStrategies:()=>{h(f=>({...f,isOpen:!1})),R=!0,S()},onAddDefaultStrategy:()=>{h(f=>({...f,isOpen:!1})),S()}})},S=>{if(!u.isChangeRequestEnabled)return S();y(()=>{var f;y(void 0),(f=u.onRollback)==null||f.call(u)}),m(u.featureId,u.environmentName,T,R)},async S=>{var f,D;if(T!==!1)return S();try{await s(u.projectId,u.featureId,u.environmentName),n({type:"success",title:`Disabled in ${u.environmentName}`,text:`${u.featureId} is unavailable in ${u.environmentName} and its strategies will no longer have any effect.`}),(f=u.onSuccess)==null||f.call(u)}catch(N){r(q(N)),(D=u.onRollback)==null||D.call(u)}},async S=>{var f,D;if(T!==!0)return S();try{await a(u.projectId,u.featureId,u.environmentName,R),n({type:"success",title:`Enabled in ${u.environmentName}`,text:`${u.featureId} is now available in ${u.environmentName} based on its defined strategies.`}),(f=u.onSuccess)==null||f.call(u)}catch(N){r(q(N)),(D=u.onRollback)==null||D.call(u)}}])},[i]),E=v(F,{children:[t($e,{...o}),t(gt,{...d}),t(Xe,{isOpen:l.isOpen,onClose:()=>{c==null||c(),g()},environment:l==null?void 0:l.environment,onConfirm:()=>{c==null||c(),p()},messageComponent:t(dt,{enabled:l==null?void 0:l.enabled,featureName:l==null?void 0:l.featureName,environment:l.environment})})]});return{onToggle:w,modals:E}},mt=P(Be)(({theme:e})=>({color:e.palette.warning.main,fontSize:e.fontSizes.bodySize})),Ft=()=>t(Ve,{arrow:!0,title:v(F,{children:["This environment has no variants enabled. If you check this feature's variants in this environment, you will get the"," ",t("a",{href:"https://docs.getunleash.io/reference/feature-toggle-variants#the-disabled-variant",target:"_blank",rel:"noreferrer",children:"disabled variant"}),"."]}),children:t(mt,{})});var Y={},ft=_e;Object.defineProperty(Y,"__esModule",{value:!0});var ie=Y.default=void 0,vt=ft(Le()),bt=Ne,yt=(0,vt.default)((0,bt.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=Y.default=yt;const St=Ue(),$t=({options:e,selectedOptions:a,indeterminateOptions:s,tagType:n,existingTags:r,disabled:o=!1,onChange:i})=>{const d=t(We,{fontSize:"small"});return t(ae,{multiple:!0,id:"checkboxes-tag",sx:{marginTop:l=>l.spacing(2),width:500},disableCloseOnSelect:!0,placeholder:"Select Values",options:e,value:a,renderTags:(l,c)=>l.map((y,w)=>r.some(T=>T.value===y.title&&T.type===n.name)&&s===void 0?null:t(Me,{...c({index:w}),label:y.title})),isOptionEqualToValue:(l,c)=>c.inputValue&&c.inputValue!==""?l.title===c.inputValue:l.title===c.title,getOptionLabel:l=>l.inputValue?l.inputValue:l.title,renderOption:(l,c,{selected:y})=>{const w=(s==null?void 0:s.some(E=>E.title===c.title))??!1;return v("li",{...l,children:[t(k,{condition:!!c.inputValue,show:t(je,{sx:{mr:E=>E.spacing(.5)}}),elseShow:t(He,{icon:d,checkedIcon:t(ze,{fontSize:"small"}),indeterminateIcon:t(ie,{fontSize:"small"}),sx:{mr:E=>E.spacing(.5)},checked:y&&!w,indeterminate:w})}),c.title]})},filterOptions:(l,c)=>{const y=St(l,c),{inputValue:w}=c,E=l.some(T=>w===T.title);return w!==""&&!E&&y.push({inputValue:w,title:`Create new value "${w}"`}),y},ListboxProps:{style:{maxHeight:200,overflow:"auto"}},onChange:i,renderInput:l=>t(se,{...l,label:"Select values",placeholder:"Select values"}),disabled:o})},Tt=P("li")({flexDirection:"column"}),Ot=({options:e,value:a,disabled:s=!1,onChange:n})=>{const r=Z();return t(ae,{disablePortal:!0,disabled:s,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)=>v(Tt,{...o,style:{alignItems:"flex-start",gap:r.spacing(.5)},children:[t(x,{variant:"body1",children:i.name}),t(x,{variant:"caption",children:i.description})]}),renderInput:o=>t(se,{...o,label:"Tag type",value:a}),onChange:n,ListboxProps:{style:{maxHeight:200,overflow:"auto"}}})},Bt=()=>{const{makeRequest:e,createRequest:a,errors:s,loading:n}=Ge({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`,m=a(h,{method:"PUT",body:JSON.stringify(i)});return e(m.caller,m.id)},errors:s,loading:n}},Vt=(e,a={})=>{const s=async()=>{const m=Ke(`api/admin/tags/${e}`);return(await fetch(m,{method:"GET"}).then(Ie("Tags"))).json()},n=`api/admin/tags/${e}`,{data:r,error:o}=Ye(!!e,{tags:[]},n,s,a),[i,d]=b.useState(!o&&!r),h=()=>{Je(n)};return b.useEffect(()=>{d(!o&&!r)},[r,o]),{tags:(r==null?void 0:r.tags)||[],error:o,loading:i,refetch:h}},Lt=({isStale:e,isOpen:a,projectId:s,featureId:n,onClose:r})=>{const{setToastData:o,setToastApiError:i}=B(),{patchFeatureToggle:d}=G(),h=t(x,{children:"Setting a toggle to stale marks it for cleanup"}),m=t(x,{children:"Setting a toggle to active marks it as in active use"}),g=e?"active":"stale",p=async l=>{l.stopPropagation();try{await d(s,n,[{op:"replace",path:"/stale",value:!e}]),r()}catch(c){i(q(c))}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(L,{open:a,secondaryButtonText:"Cancel",primaryButtonText:`Flip to ${g}`,title:`Set feature state to ${g}`,onClick:p,onClose:r,children:t(k,{condition:e,show:m,elseShow:h})})},I=()=>t(O,{severity:"warning",sx:{m:e=>e.spacing(2,0)},children:"Archiving features with dependencies will also remove those dependencies."}),Ct=({ids:e,projectId:a})=>{const s=n=>`/projects/${a}/features/${n}`;return e?v(O,{severity:"warning",sx:{m:n=>n.spacing(2,0)},children:[t(x,{fontWeight:"bold",variant:"body2",display:"inline",children:`${e.length} feature toggles `}),t("span",{children:"have usage from applications. If you archive these feature toggles they will not be available to Client SDKs:"}),t("ul",{children:e==null?void 0:e.map(n=>t("li",{children:t(H,{to:s(n),children:n})},n))})]}):null},Q=({ids:e,projectId:a})=>{const s=n=>`/projects/${a}/features/${n}`;return e&&e.length>1?v(O,{severity:"error",sx:{m:n=>n.spacing(2,0)},children:[t(x,{fontWeight:"bold",variant:"body2",display:"inline",children:`${e.length} feature toggles `}),t("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("ul",{children:e==null?void 0:e.map(n=>t("li",{children:t(H,{to:s(n),children:n})},n))})]}):e&&e.length===1?v(O,{severity:"error",sx:{m:n=>n.spacing(2,0)},children:[t(H,{to:s(e[0]),children:e[0]})," has child features that depend on it and are not part of the archive operation."]}):null},Et=(e,a)=>{const n=re(e)(),{isChangeRequestConfigured:r}=oe(e);return n&&r(n)&&a?"Add to change request":n&&r(n)?"Add change to draft":a?"Archive toggles":"Archive toggle"},At=({projectId:e,featureIds:a,onSuccess:s,onError:n})=>{const{setToastData:r,setToastApiError:o}=B(),{archiveFeatureToggle:i}=G(),{archiveFeatures:d}=W(),{isChangeRequestConfigured:h}=oe(e),{addChange:m}=ne(),{refetch:g}=M(e),p=re(e),l=(a==null?void 0:a.length)>1,c=p(),y=async()=>{if(!c){console.error("No change request environment");return}await m(e,c,a.map(T=>({action:"archiveFeature",feature:T,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"})},w=async()=>{await i(e,a[0]),r({text:"Your feature toggle has been archived",type:"success",title:"Feature archived"})},E=async()=>{await d(e,a),r({text:"Selected feature toggles have been archived",type:"success",title:"Features archived"})};return async()=>{try{c&&h(c)?await y():l?await E():await w(),s()}catch(T){o(q(T)),n()}}},wt=(e,a,s)=>{const[n,r]=b.useState(!0),[o,i]=b.useState([]),[d,h]=b.useState(!1),{verifyArchiveFeatures:m}=W();return b.useEffect(()=>{s&&m(a,e).then(g=>g.json()).then(({hasDeletedDependencies:g,parentsWithChildFeatures:p})=>{p.length===0?(r(!1),i(p)):(r(!0),i(p)),h(g)})},[JSON.stringify(e),s,a,i,r,h]),{disableArchive:n,offendingParents:o,hasDeletedDependencies:d}},_t=({isOpen:e,onClose:a,onConfirm:s,projectId:n,featureIds:r,featuresWithUsage:o})=>{U();const i=(r==null?void 0:r.length)>1,d=Et(n,i),h=i?"Archive feature toggles":"Archive feature toggle",m=At({projectId:n,featureIds:r,onSuccess(){s(),a()},onError(){a()}}),{disableArchive:g,offendingParents:p,hasDeletedDependencies:l}=wt(r,n,e),c=p.length===0&&l;return t(L,{onClick:m,open:e,onClose:a,primaryButtonText:d,secondaryButtonText:"Cancel",title:h,disabledPrimaryButton:g,children:t(k,{condition:i,show:v(F,{children:[v("p",{children:["Are you sure you want to archive"," ",t("strong",{children:r==null?void 0:r.length})," feature toggles?"]}),t(k,{condition:!!(o&&(o==null?void 0:o.length)>0),show:t(Ct,{ids:o,projectId:n})}),t(k,{condition:p.length>0,show:t(Q,{ids:p,projectId:n})}),t(k,{condition:c,show:t(I,{})}),t(k,{condition:(r==null?void 0:r.length)<=5,show:t("ul",{children:r==null?void 0:r.map(y=>t("li",{children:y},y))})})]}),elseShow:v(F,{children:[v("p",{children:["Are you sure you want to archive"," ",i?"these feature toggles":"this feature toggle","?"]}),t(k,{condition:p.length>0,show:t(Q,{ids:p,projectId:n})}),t(k,{condition:c,show:t(I,{})})]})})})};export{Xe as C,Rt as E,Pt as F,Ot as T,Ft as V,xt as W,qt as a,Bt as b,Vt as c,$t as d,_t as e,Lt as f,Dt as g,nt as u};
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import{c as ut,j as t,s as p,aF as A,aG as L,aH as Pn,d as c,aI as Bn,C as v,aJ as ae,aK as Ce,aL as G,aM as ve,aN as On,aO as He,r as f,aP as ge,aQ as Ee,aR as pt,aS as Mn,aT as _n,aU as Ln,aV as jn,f as U,aW as le,aX as oe,h as N,T as W,aY as De,aZ as Ae,a_ as en,a$ as Q,b0 as pe,v as ee,y as $e,b1 as zn,b2 as Vn,b3 as Ie,M as ie,b4 as we,b5 as tn,b6 as he,b7 as se,az as de,K as fe,b8 as ht,b9 as Nn,ba as qn,bb as Hn,bc as Wn,bd as it,be as Un,bf as Yn,H as M,B as J,bg as Gn,bh as Kn,bi as Jn,bj as Qn,bk as Zn,bl as Xn,bm as ea,bn as ta,bo as na,bp as aa,bq as sa,ax as oa,br as ra,b as gt,ad as Pe,bs as ft,G as Te,L as ia,bt as mt,i as Re,bu as Et,bv as ca,bw as la,bx as da,by as ua,ay as Be,ak as me,bz as pa,bA as ha,aB as nn,bB as ga,bC as fa,bD as ma,bE as ya,bF as Sa,V as yt,bG as an,Z as ba,bH as St,bI as be,bJ as ce,bK as sn,a2 as on,bL as Ca,bM as re,bN as va,bO as wa,Y as Ta,bP as xa,bQ as Ea,bR as Da,bS as rn,bT as Aa,bU as Ra,u as ka,bV as cn,bW as bt,bX as Fa,bY as $a,bZ as Dt,b_ as ln,b$ as dn,c0 as Ia,c1 as un,c2 as Pa,c3 as Ba,c4 as Oa,c5 as Ct,c6 as Ma,c7 as We,c8 as _a,R as pn,D as ke,c9 as La,ca as ja,cb as za,cc as Va,cd as hn,ce as gn,cf as ue,cg as ct,ch as Na,ci as fn,cj as qa,ck as Ha,g as Wa,cl as Ua,cm as Ge,cn as At,aw as Ya,co as Se,cp as Rt,cq as Ga,cr as Ka,m as Ja,au as vt,av as Qa,ap as kt,cs as Za,ct as Xa,cu as es,cv as Ft,ac as mn,cw as ts,a4 as Ke,ag as ns,a6 as as,a7 as ss,a8 as os,a9 as rs,aa as is,ab as cs,cx as ls,cy as ds,cz as $t,cA as us,cB as yn,t as ps,cC as It,cD as hs,cE as gs,cF as fs,cG as ms,cH as ys,cI as Ss,am as bs,cJ as Cs,cK as vs,cL as ws,cM as Ts,cN as xs,cO as Es,cP as Ds,cQ as As}from"./index-ae1bed58.js";import{C as Sn,u as Rs,E as ks,a as Fs,F as $s,V as Is,b as Ps,c as Bs,T as Os,d as Ms,W as _s,e as Ls,f as js}from"./FeatureArchiveDialog-ec518ad8.js";import{S as zs}from"./StrategyItemContainer-ad74b119.js";import{B as Vs}from"./Box-bd72643d.js";const Ns=ut(t("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"),qs=ut(t("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"),Hs=ut(t("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"),Ws=p("div")(({theme:e})=>({borderRadius:e.spacing(1.5),backgroundColor:e.palette.background.paper,padding:e.spacing(4)})),Us=()=>{const e=A("projectId"),n=A("featureId"),{feature:a}=L(e,n);return a.name?t(Ws,{children:t(Pn,{title:"Event log",feature:n,displayInline:!0})}):null},Ys=p("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"}})),Gs=p("div")({padding:"1.5rem 1.5rem 0 1.5rem"}),Ks=p("div")({display:"flex",alignItems:"center"}),Js=p("h2")(({theme:e})=>({fontSize:e.fontSizes.bodySize,fontWeight:"normal",margin:0})),Qs=p("div")(({theme:e})=>({margin:e.spacing(2,0),display:"flex",flexDirection:"column"})),Pt=p("span")(({theme:e})=>({margin:e.spacing(1,0),fontSize:e.fontSizes.bodySize})),Bt=p("div")(({theme:e})=>({display:"flex",alignItems:"center",color:e.palette.primary.contrastText})),Zs=()=>{const e=A("projectId"),n=A("featureId"),{feature:a}=L(e,n),{project:o,description:s,type:r}=a,i=On(r);return t(Ys,{children:c(Gs,{children:[c(Ks,{"data-loading":!0,children:[t(i,{sx:l=>({marginRight:l.spacing(2),height:"40px",width:"40px",fill:l.palette.primary.contrastText})})," ",c(Js,{children:[Bn(r||"")," toggle"]})]}),c(Qs,{children:[c(Pt,{"data-loading":!0,children:["Project: ",o]}),t(v,{condition:!!s,show:c(Pt,{"data-loading":!0,children:[t("div",{children:"Description:"}),c(Bt,{children:[t("p",{children:s}),t(ae,{projectId:e,permission:Ce,component:G,to:`/projects/${e}/features/${n}/settings`,tooltipProps:{title:"Edit description"},children:t(ve,{sx:l=>({color:l.palette.primary.contrastText})})})]})]}),elseShow:t("span",{"data-loading":!0,children:c(Bt,{children:["No description."," ",t(ae,{projectId:e,permission:Ce,component:G,to:`/projects/${e}/features/${n}/settings`,tooltipProps:{title:"Edit description"},children:t(ve,{sx:l=>({color:l.palette.primary.contrastText})})})]})})})]})]})})},Ot={lastHourUsage:[],seenApplications:[]},Xs=(e,n,a={})=>{const o=async()=>{const h=ge(`api/admin/client-metrics/features/${n}`),g=await fetch(h,{method:"GET"}).then(Ee("feature metrics"));return g.ok?g.json():Ot},s=`${e}_${n}_metrics`,{data:r,error:i}=He(s,o,{...a}),[l,d]=f.useState(!i&&!r),u=()=>{pt(s)};return f.useEffect(()=>{d(!i&&!r)},[r,i]),{metrics:r||Ot,error:i,loading:l,refetch:u,FEATURE_METRICS_CACHE_KEY:s}},eo=e=>({yes:0,no:0,environment:e,timestamp:""}),to=(e,n)=>e.map(a=>n.lastHourUsage.find(s=>s.environment===a.name)||eo(a.name)),no=e=>(n,a,o)=>(o.revalidateOnFocus=!1,o.revalidateIfStale=!1,o.revalidateOnReconnect=!1,e(n,a,o)),ao=Mn(He,no),bn=(e,n)=>{const{refetchFeature:a}=L(e,n),o=_n(e,n),{data:s,error:r,mutate:i}=ao(["useFeatureImmutable",o],()=>Ln(o)),l=f.useCallback(async()=>{await i(),await a()},[i,a]);return{feature:(s==null?void 0:s.body)||jn,refetchFeature:l,loading:!r&&!s,status:s==null?void 0:s.status,error:r}},Cn=(e,n,a)=>{const{setToastData:o,setToastApiError:s}=U(),{addChange:r}=le(),{refetch:i}=oe(e),[l,d]=f.useState({isOpen:!1}),u=f.useCallback((S,E,m)=>{d({featureName:n,environment:S,fromEnvironment:m,strategy:E,isOpen:!0})},[]),h=f.useCallback((S,E,m)=>{d({featureName:n,environment:S,fromEnvironment:m,strategies:E,isOpen:!0})},[]),g=f.useCallback(()=>{d({isOpen:!1})},[]),b=f.useCallback(async()=>{try{await r(e,l.environment,{feature:l.featureName,action:a,payload:l.strategy}),i(),d({isOpen:!1}),o({type:"success",title:"Changes added to the draft!"})}catch(S){s(N(S)),d({isOpen:!1})}},[r]),C=f.useCallback(async()=>{try{await Promise.all(l.strategies.map(S=>r(e,l.environment,{feature:l.featureName,action:a,payload:S}))),i(),d({isOpen:!1}),o({type:"success",title:"Changes added to the draft!"})}catch(S){s(N(S)),d({isOpen:!1})}},[r]);return{onChangeRequestAddStrategy:u,onChangeRequestAddStrategies:h,onChangeRequestAddStrategyClose:g,onChangeRequestAddStrategyConfirm:b,onChangeRequestAddStrategiesConfirm:C,changeRequestDialogDetails:l}},so=({payload:e,fromEnvironment:n,environment:a})=>c(W,{children:[c("strong",{children:["Copy ",De((e==null?void 0:e.name)||"")," strategy"," "]})," ","from ",n," to ",a]}),oo=({environmentId:e,environments:n,strategy:a})=>{const o=A("projectId"),s=A("featureId"),[r,i]=f.useState(null),l=!!r,{addStrategyToFeature:d}=Ae(),{setToastData:u,setToastApiError:h}=U(),{refetchFeature:g}=L(o,s),{refetchFeature:b}=bn(o,s),C=()=>{i(null)},S=en(o),{isChangeRequestConfigured:E}=Q(o),{changeRequestDialogDetails:m,onChangeRequestAddStrategyClose:y,onChangeRequestAddStrategy:$,onChangeRequestAddStrategyConfirm:_}=Cn(o,s,"addStrategy"),q=async w=>{const{id:R,...I}={...a,targetEnvironment:w};if(E(w)){await $(w,{id:R,...I},e);return}try{await d(o,s,w,a),g(),b(),u({title:"Strategy created",text:`Successfully copied a strategy to ${w}`,type:"success"})}catch(V){h(N(V))}C()},z=n.some(w=>S(pe,w));return c("div",{children:[t(Sn,{isOpen:m.isOpen,onClose:y,environment:m==null?void 0:m.environment,onConfirm:_,messageComponent:t(so,{fromEnvironment:m.fromEnvironment,payload:m.strategy})}),t(ee,{title:`Copy to another environment${z?"":" (Access denied)"}`,children:t("div",{children:t($e,{size:"large",id:`copy-strategy-icon-menu-${a.id}`,"aria-controls":l?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":l?"true":void 0,onClick:w=>{i(w.currentTarget)},"data-testid":zn,disabled:!z,children:t(Vn,{})})})}),t(Ie,{id:"basic-menu",anchorEl:r,open:l,onClose:C,MenuListProps:{"aria-labelledby":`copy-strategy-icon-menu-${a.id}`},children:n.map(w=>{const R=S(pe,w);return t(ee,{title:R?"":"You don't have access to add a strategy to this environment",children:t("div",{children:c(ie,{onClick:()=>q(w),disabled:!R,children:[t(v,{condition:!R,show:t(we,{children:t(tn,{fontSize:"small"})})}),c(he,{children:["Copy to ",w]})]})})},w)})})]})},vn=()=>t(fe,{severity:"error",children:"Removing the strategy will change which users receive access to the feature."}),ro=({onRemove:e,onClose:n,isOpen:a})=>t(se,{title:"Are you sure you want to delete this strategy?",open:a,primaryButtonText:"Remove strategy",secondaryButtonText:"Cancel",onClick:e,onClose:n,children:t(vn,{})}),io=p("div")(({theme:e})=>({marginTop:e.spacing(3),marginBottom:e.spacing(1)})),co=({onRemove:e,onClose:n,isOpen:a})=>c(se,{title:"Suggest changes",open:a,primaryButtonText:"Add suggestion to draft",secondaryButtonText:"Cancel",onClick:e,onClose:n,children:[t(vn,{}),t(io,{children:t(W,{variant:"body2",color:"text.secondary",children:"Your suggestion:"})}),t(W,{fontWeight:"bold",children:"Remove strategy"})]}),lo=({projectId:e,featureId:n,environmentId:a,strategyId:o})=>{const{deleteStrategyFromFeature:s}=Ae(),{setToastData:r,setToastApiError:i}=U(),l=de(),{refetchFeature:d}=L(e,n);return async h=>{try{h.preventDefault(),await s(e,n,a,o),r({title:"Strategy deleted",type:"success"}),d(),l(ht(e,n))}catch(g){i(N(g))}}},uo=({projectId:e,featureId:n,environmentId:a,strategyId:o})=>{const{addChange:s}=le(),{refetch:r}=oe(e),{setToastData:i,setToastApiError:l}=U();return async u=>{try{u.preventDefault(),await s(e,a,{action:"deleteStrategy",feature:n,payload:{id:o}}),i({title:"Changes added to the draft!",type:"success"}),await r()}catch(h){l(N(h))}}},po=({projectId:e,featureId:n,environmentId:a,strategyId:o,text:s,isOpen:r,onClose:i})=>{const{isChangeRequestConfigured:l}=Q(e),d=lo({featureId:n,projectId:e,strategyId:o,environmentId:a}),u=uo({featureId:n,projectId:e,strategyId:o,environmentId:a});return l(a)?t(co,{isOpen:r,onClose:()=>i(),onRemove:async h=>{await u(h),i()}}):t(ro,{isOpen:r,onClose:()=>i(),onRemove:d})},ho=({projectId:e,environmentId:n,featureId:a,strategy:o})=>{const{refetchFeature:s}=L(e,a),{setStrategyDisabledState:r}=Ae(),{setToastData:i,setToastApiError:l}=U(),d=u=>async()=>{try{await r(e,a,n,o.id,!u),i({title:`Strategy ${u?"enabled":"disabled"}`,type:"success"}),s()}catch(h){l(N(h))}};return{onDisable:d(!1),onEnable:d(!0)}},go=({projectId:e,environmentId:n,featureId:a,strategy:o})=>{const{addChange:s}=le(),{refetch:r}=oe(e),{setToastData:i,setToastApiError:l}=U(),d=u=>async()=>{try{await s(e,n,{action:"updateStrategy",feature:a,payload:{...o,disabled:!u}}),i({title:"Changes added to the draft!",type:"success"}),await r()}catch(h){l(N(h))}};return{onSuggestDisable:d(!1),onSuggestEnable:d(!0)}},fo=({isOpen:e,onClose:n,...a})=>{var C;const{projectId:o,environmentId:s}=a,{isChangeRequestConfigured:r}=Q(o),i=r(s),{onSuggestEnable:l,onSuggestDisable:d}=go({...a}),{onEnable:u,onDisable:h}=ho({...a}),g=!!((C=a.strategy)!=null&&C.disabled);return t(se,{title:i?`Add ${g?"enable":"disable"} strategy to change request?`:`Are you sure you want to ${g?"enable":"disable"} this strategy?`,open:e,primaryButtonText:i?"Add to draft":`${g?"Enable":"Disable"} strategy`,secondaryButtonText:"Cancel",onClick:S=>{S.preventDefault(),i?g?l():d():g?u():h(),n()},onClose:()=>n(),children:t(v,{condition:i,show:t(Nn,{environment:s}),elseShow:c(fe,{severity:"error",children:[g?"Enabling":"Disabling"," the strategy will change which users receive access to the feature."]})})})};var wt={},mo=Hn;Object.defineProperty(wt,"__esModule",{value:!0});var wn=wt.default=void 0,yo=mo(qn()),So=Wn,bo=(0,yo.default)((0,So.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");wn=wt.default=bo;const Co=({projectId:e,strategy:n,featureId:a,environmentId:o})=>{const[s,r]=f.useState(null),[i,l]=f.useState(!1),[d,u]=f.useState(!1),h=!!s,g=E=>{r(E.currentTarget)},b=E=>{r(null),E.stopPropagation()},C=it(Un,e,o),S=it(Yn,e,o);return c(M,{children:[t(J,{sx:{display:"flex",alignItems:"center",textAlign:"center"},children:t(ee,{title:"More actions",children:t($e,{onClick:g,size:"small","aria-controls":h?"actions-menu":void 0,"aria-haspopup":"true","aria-expanded":h?"true":void 0,"data-testid":Gn,children:t(Kn,{sx:{width:32,height:32}})})})}),c(Ie,{anchorEl:s,id:"actions-menu",open:h,onClose:b,onClick:b,transformOrigin:{horizontal:"right",vertical:"top"},anchorOrigin:{horizontal:"right",vertical:"bottom"},"data-testid":Jn,children:[t(ee,{title:n.disabled?"Enable strategy":"Disable strategy",arrow:!0,placement:"left",children:c(ie,{disabled:!C,onClick:()=>l(!0),children:[t(we,{children:n.disabled?t(Qn,{}):t(Zn,{})}),t(he,{children:n.disabled?"Enable":"Disable"})]})}),t(ee,{title:"Remove strategy",arrow:!0,placement:"left",children:c(ie,{disabled:!S,onClick:()=>u(!0),"data-testid":Xn,children:[t(we,{children:t(wn,{})}),t(he,{children:"Remove"})]})})]}),t(fo,{isOpen:i,onClose:()=>l(!1),projectId:e,featureId:a,environmentId:o,strategy:n}),t(po,{isOpen:d,onClose:()=>u(!1),projectId:e,featureId:a,environmentId:o,strategyId:n.id})]})},vo=({environmentId:e,strategy:n,onDragStart:a,onDragEnd:o,otherEnvironments:s,orderNumber:r,headerChildren:i})=>{const l=A("projectId"),d=A("featureId"),u=ea(l,d,e,n.id);return c(zs,{strategy:n,onDragStart:a,onDragEnd:o,orderNumber:r,actions:c(M,{children:[i,t(v,{condition:!!(s&&(s==null?void 0:s.length)>0),show:()=>t(oo,{environmentId:e,environments:s,strategy:n})}),t(ae,{permission:ta,environmentId:e,projectId:l,component:G,to:u,tooltipProps:{title:"Edit strategy"},"data-testid":`STRATEGY_EDIT-${n.name}`,children:t(ve,{})}),t(Co,{projectId:l,featureId:d,environmentId:e,strategy:n})]}),children:[t(na,{strategy:n}),n.variants?t(aa,{variants:n.variants}):null]})},wo=e=>fetch(e).then(Ee("ChangeRequest")).then(n=>n.json()),Tt=(e,n)=>{const{data:a,error:o,mutate:s}=sa([],ge(`api/admin/projects/${e}/change-requests/pending/${n}`),wo);return{changeRequests:a,loading:!o&&!a,refetch:s,error:o}},To=(e,n,a,o)=>{const{user:s}=oa(),{changeRequests:r}=Tt(e,n),i=[],l=r==null?void 0:r.filter(d=>d.environment===a);return l==null||l.forEach(d=>{const u=d==null?void 0:d.features.find(g=>g.name===n),h=u==null?void 0:u.changes.find(g=>g.action==="updateStrategy"||g.action==="deleteStrategy"?g.payload.id===o:!1);if(h){const g=d.state==="Scheduled",b=!g&&d.createdBy.id===(s==null?void 0:s.id);g&&i.push({changeRequestId:d.id,change:h,isScheduledChange:g}),b&&i.push({changeRequestId:d.id,change:h,isScheduledChange:g})}}),i},ze=p("div")({display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center"}),Ve=p("div")(({theme:e})=>({justifyContent:"center",paddingTop:e.spacing(.75),...ra})),Ne=p("span")(({theme:e})=>({color:e.palette.text.secondary,marginRight:e.spacing(1)})),xt=p(G)(({theme:e})=>({maxWidth:"100%",textDecoration:"none","&:hover, &:focus":{textDecoration:"underline"}})),Tn=({scheduledChangeRequestIds:e})=>{const n=gt(),a=Pe(n.breakpoints.down("sm")),o=A("projectId");return a?null:t(J,{sx:{mr:1.5},children:t(ft,{tooltip:t(M,{children:e==null?void 0:e.map((s,r)=>c(xt,{to:`/projects/${o}/change-requests/${s}`,children:["Change request #",s]},`${o}-${r}`))}),children:t(Te,{color:"warning",children:"Changes Scheduled"})})})},xo=({strategy:e,index:n,environmentName:a,otherEnvironments:o,isDragging:s,onDragStartRef:r,onDragOver:i,onDragEnd:l})=>{const d=A("projectId"),u=A("featureId"),h=f.useRef(null),g=To(d,u,a,e.id);return c(J,{ref:h,onDragOver:i(h,n),sx:{opacity:s?"0.5":"1"},children:[t(v,{condition:n>0,show:t(ia,{text:"OR"})}),t(vo,{strategy:e,environmentId:a,otherEnvironments:o,onDragStart:r(h,n),onDragEnd:l,orderNumber:n+1,headerChildren:Do(g)})]},e.id)},Eo=({change:e})=>{const n=gt();return Pe(n.breakpoints.down("sm"))?null:c(J,{sx:{mr:1.5},children:[t(v,{condition:(e==null?void 0:e.action)==="updateStrategy",show:t(Te,{color:"warning",children:"Modified in draft"})}),t(v,{condition:(e==null?void 0:e.action)==="deleteStrategy",show:t(Te,{color:"error",children:"Deleted in draft"})})]})},Do=e=>{const n=[];if(e.length===0)return[];const a=e.find(({isScheduledChange:s})=>!s);a&&n.push(t(Eo,{change:a.change}));const o=e.filter(({isScheduledChange:s})=>s);return o.length>0&&n.push(t(Tn,{scheduledChangeRequestIds:o.map(s=>s.changeRequestId)})),n},Ao=({environmentId:e,environments:n,onClick:a})=>{const o=A("projectId"),[s,r]=f.useState(null),i=!!s,{hasAccess:l}=f.useContext(mt),d=n.some(u=>l(pe,o,u));return c("div",{children:[t(ee,{title:d?"":"(Access denied)",children:t("div",{children:t(Re,{id:`copy-all-strategies-${e}`,"aria-controls":i?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":i?"true":void 0,onClick:u=>{r(u.currentTarget)},disabled:!d,variant:"outlined",children:"Copy from another environment"})})}),t(Ie,{id:"basic-menu",anchorEl:s,open:i,onClose:()=>{r(null)},MenuListProps:{"aria-labelledby":`copy-all-strategies-${e}`},children:n.map(u=>{const h=l(pe,o,u);return t(ee,{title:h?"":"You don't have access to add a strategy to this environment",children:t("div",{children:c(ie,{onClick:()=>a(u),disabled:!h,children:[t(v,{condition:!h,show:t(we,{children:t(tn,{fontSize:"small"})})}),c(he,{children:["Copy from ",u]})]})})},u)})})]})},Ro=p("div")(({theme:e})=>({"&>*:nth-child(n)":{margin:e.spacing(1,0)}})),ko=({payload:e,fromEnvironment:n,environment:a})=>c(Ro,{children:[t(W,{children:t("strong",{children:"Copy: "})}),e==null?void 0:e.map(o=>c(W,{children:[c("strong",{children:[De((o==null?void 0:o.name)||"")," strategy"," "]})," "]})),c(W,{children:["from ",n," to ",a]})]}),Fo=(e,n)=>{const a={};return n.parameters.forEach(o=>{a[o.name]=$o(e,o)}),{name:n.name,constraints:[],parameters:a}},$o=(e,n)=>n.name==="rollout"||n.name==="percentage"||n.type==="percentage"?"50":n.name==="stickiness"?"":n.name==="groupId"?e:n.type==="boolean"?"false":"",Io=()=>{const e=A("projectId"),n=A("featureId"),a=Et("environmentId"),o=Et("strategyName"),{strategy:s,defaultStrategyFallback:r}=Rs(e,a),i=JSON.parse(ca().get("defaultStrategy")||"false"),{segments:l}=la(),d=(l||[]).filter(B=>{var X;return(X=s==null?void 0:s.segments)==null?void 0:X.includes(B.id)}),[u,h]=f.useState({}),[g,b]=f.useState(i?d:[]),{strategyDefinition:C}=da(o),S=ua(),{addStrategyToFeature:E,loading:m}=Ae(),{addChange:y}=le(),{setToastData:$,setToastApiError:_}=U(),{uiConfig:q}=Be(),{unleashUrl:z}=q,w=de(),{feature:R,refetchFeature:I}=L(e,n),V=f.useRef(R),{isChangeRequestConfigured:K}=Q(e),{refetch:te}=oe(e),{trackEvent:Z}=me(),{data:T,staleDataNotification:P,forceRefreshCache:D}=pa({unleashGetter:L,params:[e,n],dataKey:"feature",refetchFunctionKey:"refetchFeature",options:{}},R,{afterSubmitAction:I},Sa);f.useEffect(()=>{V.current.name===""&&R.name&&(D(R),V.current=R)},[R.name]),f.useEffect(()=>{var B;if(i){const X=s||r;((B=X.parameters)==null?void 0:B.groupId)===""&&n?h({...X,parameters:{...X.parameters,groupId:n}}):h(X)}else C&&h(Fo(n,C))},[n,JSON.stringify(C),i]);const x=async B=>{await E(e,n,a,B),$({title:"Strategy created",type:"success",confetti:!0})},F=async B=>{await y(e,a,{action:"addStrategy",feature:n,payload:B}),$({title:"Strategy added to draft",type:"success",confetti:!0}),te()},O=ha(u,g),H=async()=>{Z("strategyTitle",{props:{hasTitle:!!u.title,on:"create"}});try{K(a)?await F(O):await x(O),I(),w(ht(e,n))}catch(B){_(N(B))}};return!T||!T.project?null:c(nn,{modal:!0,title:De(o),description:ga,documentationLink:fa,documentationLinkLabel:ma,formatApiCode:()=>Po(e,n,a,O,z),children:[t(ya,{projectId:e,feature:T,strategy:u,setStrategy:h,segments:g,setSegments:b,environmentId:a,onSubmit:H,loading:m,permission:pe,errors:S,isChangeRequest:K(a)}),P]})},xn=(e,n,a,o,s=!1)=>{const r=new URLSearchParams({environmentId:a,strategyName:o,defaultStrategy:String(s)});return`/projects/${e}/features/${n}/strategies/create?${r}`},Po=(e,n,a,o,s)=>{if(!s)return"";const r=`${s}/api/admin/projects/${e}/features/${n}/environments/${a}/strategies`,i=JSON.stringify(o,void 0,2);return`curl --location --request POST '${r}' \\
|
|
2
|
-
--header 'Authorization: INSERT_API_KEY' \\
|
|
3
|
-
--header 'Content-Type: application/json' \\
|
|
4
|
-
--data-raw '${i}'`},Bo=p("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}})),Oo=p("div")(({theme:e})=>({fontSize:e.fontSizes.smallBody})),Mo=p(yt)(({theme:e})=>({fontWeight:e.fontWeight.bold})),_o=p(G)(({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}})),Je=({projectId:e,featureId:n,environmentId:a,strategy:o,defaultStrategy:s})=>{const r=an(o.name),i=De(o.name),{trackEvent:l}=me(),d=xn(e,n,a,o.name,s);return c(_o,{to:d,onClick:()=>{l("strategy-add",{props:{buttonTitle:o.displayName||i}})},children:[t(Bo,{children:t(r,{})}),c("div",{children:[t(Mo,{text:o.displayName||i,maxWidth:"200",maxLength:25}),t(Oo,{children:o.description})]})]})},Qe=p(W)(({theme:e})=>({fontSize:e.fontSizes.smallBody,padding:e.spacing(1,2)})),Lo=({projectId:e,featureId:n,environmentId:a})=>{const{strategies:o}=ba(),s=o.filter(l=>!l.deprecated&&!l.editable),r=o.filter(l=>!l.deprecated&&l.editable),i={name:"flexibleRollout",displayName:"Default strategy",description:"This is the default strategy defined for this environment in the project"};return c(St,{dense:!0,children:[c(M,{children:[c(Qe,{color:"textSecondary",children:[a," environment default strategy"]}),t(be,{children:t(Je,{projectId:e,featureId:n,environmentId:a,strategy:i,defaultStrategy:!0})},i.name)]}),t(Qe,{color:"textSecondary",children:"Predefined strategy types"}),s.map(l=>t(be,{children:t(Je,{projectId:e,featureId:n,environmentId:a,strategy:l})},l.name)),t(v,{condition:r.length>0,show:c(M,{children:[t(Qe,{color:"textSecondary",children:"Custom strategies"}),r.map(l=>t(be,{children:t(Je,{projectId:e,featureId:n,environmentId:a,strategy:l})},l.name))]})})]})},jo=p("div")({flexShrink:0}),zo=p(ce)(({theme:e})=>({minWidth:0,width:e.spacing(4.5),alignItems:"center",justifyContent:"center",align:"center",flexDirection:"column",marginLeft:e.spacing(1)})),lt=({label:e,projectId:n,featureId:a,environmentId:o,variant:s,size:r,matchWidth:i})=>{const[l,d]=f.useState(),u=de(),{trackEvent:h}=me(),g=!!l,b=g?"FeatureStrategyMenuPopover":void 0,C=()=>{d(void 0)},S=y=>{h("strategy-add",{props:{buttonTitle:e}}),u(m)},E=y=>{d(y.currentTarget)},m=xn(n,a,o,"flexibleRollout",!0);return c(jo,{onClick:y=>y.stopPropagation(),children:[t(ce,{permission:pe,projectId:n,environmentId:o,onClick:S,"aria-labelledby":b,variant:s,size:r,sx:{minWidth:i?"282px":"auto"},children:e}),t(zo,{permission:pe,projectId:n,environmentId:o,onClick:E,"aria-labelledby":b,variant:"outlined",size:r,hideLockIcon:!0,tooltipProps:{title:"More strategies"},children:t(sn,{sx:y=>({margin:y.spacing(.25,0)})})}),t(on,{id:b,open:g,anchorEl:l,onClose:C,onClick:C,PaperProps:{sx:y=>({paddingBottom:y.spacing(1)})},children:t(Lo,{projectId:n,featureId:a,environmentId:o})})]})},Vo=p("div")(({theme:e})=>({display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",paddingTop:e.spacing(2)})),No=p("div")(({theme:e})=>({fontSize:e.fontSizes.bodySize,textAlign:"center",color:e.palette.text.primary,marginBottom:e.spacing(1)})),qo=p("p")(({theme:e})=>({color:e.palette.text.secondary,fontSize:e.fontSizes.smallBody,textAlign:"center",marginBottom:e.spacing(3),a:{color:e.palette.links}})),Ho=({projectId:e,featureId:n,environmentId:a})=>{const{addStrategyToFeature:o}=Ae(),{setToastData:s,setToastApiError:r}=U(),{refetchFeature:i}=L(e,n),{refetchFeature:l}=bn(e,n),{feature:d}=L(e,n),u=d==null?void 0:d.environments.filter($=>$.name!==a&&$.strategies&&$.strategies.length>0),{isChangeRequestConfigured:h}=Q(e),{changeRequestDialogDetails:g,onChangeRequestAddStrategies:b,onChangeRequestAddStrategiesConfirm:C,onChangeRequestAddStrategyClose:S}=Cn(e,n,"addStrategy"),E=($=!1)=>{i(),l(),s({title:$?"Strategies created":"Strategy created",text:$?"Successfully copied from another environment":"Successfully created strategy",type:"success"})},m=async $=>{var q;const _=((q=u==null?void 0:u.find(z=>z.name===$))==null?void 0:q.strategies)||[];if(h(a)){await b(a,_,$);return}try{await Promise.all(_.map(z=>{const{id:w,...R}={...z,environment:a};return o(e,n,a,R)})),E(!0)}catch(z){r(N(z))}},y=u&&u.length>0;return c(M,{children:[t(Sn,{isOpen:g.isOpen,onClose:S,environment:g==null?void 0:g.environment,onConfirm:C,messageComponent:t(ko,{fromEnvironment:g.fromEnvironment,payload:g.strategies})}),c(Vo,{children:[t(No,{children:"You have not defined any strategies yet."}),c(qo,{children:["Strategies added in this environment will only be executed if the SDK is using an"," ",t(G,{to:"/admin/api",children:"API key configured"})," for this environment."]}),c(J,{sx:{w:"100%",display:"flex",flexWrap:"wrap",gap:2,alignItems:"center",justifyContent:"center"},children:[t(lt,{label:"Add your first strategy",projectId:e,featureId:n,environmentId:a,matchWidth:y}),t(v,{condition:y,show:t(Ao,{environmentId:a,environments:u.map($=>$.name),onClick:m})})]})]})]})},Wo=p("div")(({theme:e})=>({width:"100%",position:"relative",paddingBottom:e.spacing(2)})),Uo=p("div")(({theme:e})=>({[e.breakpoints.down(400)]:{padding:e.spacing(1)}})),Yo=({featureEnvironment:e,isDisabled:n,otherEnvironments:a})=>{const o=A("projectId"),s=A("featureId"),{setStrategiesSortOrder:r}=Ae(),{addChange:i}=le(),{isChangeRequestConfigured:l}=Q(o),{refetch:d}=oe(o),{setToastData:u,setToastApiError:h}=U(),{refetchFeature:g}=L(o,s),[b,C]=f.useState((e==null?void 0:e.strategies)||[]),[S,E]=f.useState(null);if(f.useEffect(()=>{C((e==null?void 0:e.strategies)||[])},[e==null?void 0:e.strategies]),!e)return null;const m=async w=>{try{await r(o,s,e.name,w),g(),u({title:"Order of strategies updated",type:"success"})}catch(R){h(N(R))}},y=async w=>{await i(o,e.name,{action:"reorderStrategy",feature:s,payload:w}),u({title:"Strategy execution order added to draft",type:"success",confetti:!0}),d()},$=async w=>{try{l(e.name)?await y(w):await m(w)}catch(R){h(N(R))}},_=(w,R)=>I=>{var V;E({id:b[R].id,index:R,height:((V=w.current)==null?void 0:V.offsetHeight)||0}),w!=null&&w.current&&(I.dataTransfer.effectAllowed="move",I.dataTransfer.setData("text/html",w.current.outerHTML),I.dataTransfer.setDragImage(w.current,20,20))},q=w=>(R,I)=>V=>{if(S===null||R.current===null||S.index===I||w===S.id)return;const{top:K,bottom:te}=R.current.getBoundingClientRect(),Z=V.clientY-K<S.height,T=te-V.clientY<S.height,P=S.index>I;if(Z&&P||T&&!P){const D=[...b],x=D.splice(S.index,1)[0];D.splice(I,0,x),C(D),E({...S,index:I})}},z=()=>{E(null),$(b.map((w,R)=>({id:w.id,sortOrder:R})))};return t(Wo,{children:c(Uo,{children:[t(v,{condition:b.length>0&&n,show:()=>t(fe,{severity:"warning",sx:{mb:2},children:"This environment is disabled, which means that none of your strategies are executing."})}),t(v,{condition:b.length>0,show:t(M,{children:b.map((w,R)=>t(xo,{strategy:w,index:R,environmentName:e.name,otherEnvironments:a,isDragging:(S==null?void 0:S.id)===w.id,onDragStartRef:_,onDragOver:q(w.id),onDragEnd:z},w.id))}),elseShow:t(Ho,{projectId:o,featureId:s,environmentId:e.name})})]})})},En=(e,n)=>e===0?0:Math.round(n/e*100);var Ue={},Ye={};Object.defineProperty(Ye,"__esModule",{value:!0});Ye.defaultOptions=void 0;Ye.defaultOptions={lowercase:!1,precision:1,space:!1,units:["","K","M","B","T","P","E"]};var ne={};Object.defineProperty(ne,"__esModule",{value:!0});ne.getLocales=ne.getFractionDigits=ne.roundTo=ne.parseValue=void 0;function Go(e){const n=parseFloat(e==null?void 0:e.toString());if(isNaN(n))throw new Error("Input value is not a number");if(n>Number.MAX_SAFE_INTEGER||n<Number.MIN_SAFE_INTEGER)throw new RangeError("Input value is outside of safe integer range");return n}ne.parseValue=Go;function Ko(e,n){if(!Number.isFinite(e))throw new Error("Input value is not a finite number");if(!Number.isInteger(n)||n<0)throw new Error("Precision is not a positive integer");return Number.isInteger(e)?e:parseFloat(e.toFixed(n))}ne.roundTo=Ko;function Jo(e){var n;if(Number.isInteger(e))return 0;const a=e.toString().split(".")[1];return(n=a==null?void 0:a.length)!==null&&n!==void 0?n:0}ne.getFractionDigits=Jo;function Qo(){var e;return typeof navigator>"u"?[]:Array.from((e=navigator.languages)!==null&&e!==void 0?e:[])}ne.getLocales=Qo;Object.defineProperty(Ue,"__esModule",{value:!0});Ue.millify=void 0;const Mt=Ye,_e=ne,_t=1e3;function*Lt(e){let n=_t;for(;;){const a=e/n;if(a<1)return;yield a,n*=_t}}function Dn(e,n){var a,o;const s=n?{...Mt.defaultOptions,...n}:Mt.defaultOptions;if(!Array.isArray(s.units)||!s.units.length)throw new Error("Option `units` must be a non-empty array");let r;try{r=_e.parseValue(e)}catch(S){return S instanceof Error&&console.warn(`WARN: ${S.message} (millify)`),String(e)}const i=r<0?"-":"";r=Math.abs(r);let l=0;for(const S of Lt(r))r=S,l+=1;if(l>=s.units.length)return e.toString();let u=_e.roundTo(r,s.precision);for(const S of Lt(u))u=S,l+=1;const h=(a=s.units[l])!==null&&a!==void 0?a:"",g=s.lowercase?h.toLowerCase():h,b=s.space?" ":"",C=u.toLocaleString((o=s.locales)!==null&&o!==void 0?o:_e.getLocales(),{minimumFractionDigits:_e.getFractionDigits(u)});return`${i}${C}${b}${g}`}Ue.millify=Dn;var Zo=Ue.default=Dn;const qe=({value:e,threshold:n=1e6,precision:a=2})=>{let o,s=!1;e<n?o=e.toLocaleString():(o=Zo(e,{precision:a}),s=!0);const r=t("span",{"data-testid":Ca,children:o});return t(v,{condition:s,show:t(ee,{title:e.toLocaleString(),arrow:!0,children:r}),elseShow:r})},Ze=p("article")(({theme:e})=>({padding:e.spacing(2),background:"transparent",borderRadius:e.spacing(2),textAlign:"center",[e.breakpoints.up("md")]:{padding:e.spacing(4)}})),Xe=p("h3")(({theme:e})=>({margin:0,fontSize:e.fontSizes.bodySize,fontWeight:e.fontWeight.thin})),et=p("p")(({theme:e})=>({fontSize:"2.25rem",fontWeight:e.fontWeight.bold,color:e.palette.primary.main})),tt=p("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})),An=({totalYes:e,totalNo:n,hoursBack:a,statsSectionId:o,tableSectionId:s})=>{const r=a===1?"in the last hour":`in the last ${a} hours`;return c(re,{container:!0,spacing:2,id:o,"aria-describedby":s,"aria-label":"Feature metrics summary",component:"section",children:[t(re,{item:!0,xs:12,sm:4,children:c(Ze,{children:[t(Xe,{children:"Exposure"}),t(et,{children:t(qe,{value:e})}),c(tt,{children:["Total exposure of the feature in the environment"," ",r,"."]})]})}),t(re,{item:!0,xs:12,sm:4,children:c(Ze,{children:[t(Xe,{children:"Exposure %"}),c(et,{children:[En(e+n,e),"%"]}),c(tt,{children:["% total exposure of the feature in the environment"," ",r,"."]})]})}),t(re,{item:!0,xs:12,sm:4,children:c(Ze,{children:[t(Xe,{children:"Requests"}),t(et,{children:t(qe,{value:e+n})}),c(tt,{children:["Total requests for the feature in the environment"," ",r,"."]})]})})]})},Xo=p("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}})),er=p("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})),tr=({children:e})=>t(Xo,{children:t(er,{children:e})}),nr=({environmentMetric:e})=>e?c(M,{children:[t(tr,{children:"Feature toggle exposure"}),t("div",{children:t(An,{totalYes:e.yes,totalNo:e.no,hoursBack:1})})]}):null,jt=p("div")({marginLeft:"auto",display:"flex",alignItems:"center"}),zt=p("div")(({theme:e})=>({marginRight:e.spacing(1),display:"flex",flexDirection:"column"})),Vt=p("p")(({theme:e})=>({color:e.palette.primary.main,textAlign:"right",fontSize:e.fontSizes.bodySize})),Nt=p("p")(({theme:e})=>({maxWidth:"270px",marginTop:e.spacing(.5),fontSize:e.fontSizes.smallBody,textAlign:"right",[e.breakpoints.down(700)]:{display:"none"}})),ar=p(va)(({theme:e})=>({fill:e.palette.background.elevation2,height:"75px",width:"75px",[e.breakpoints.down(500)]:{display:"none"}})),sr=p("div")(({theme:e})=>({margin:e.spacing(0,2),[e.breakpoints.down(500)]:{display:"none"}})),or=({environmentMetric:e,disabled:n=!1})=>{const a=wa();if(!e)return null;const o=e.yes+e.no,s=En(o,e==null?void 0:e.yes);return!e||e.yes===0&&e.no===0?c(jt,{children:[c(zt,{children:[c(Vt,{style:{color:n?a.palette.text.secondary:void 0},"data-loading":!0,children:[s,"%"]}),c(Nt,{style:{color:n?a.palette.text.secondary:a.palette.text.primary},"data-loading":!0,children:["The feature has been requested ",t("b",{children:"0 times"})," and exposed",t("b",{children:" 0 times"})," in the last hour"]})]}),t(ar,{style:{transform:"scale(1.1)"},"data-loading":!0})]}):c(jt,{children:[c(zt,{children:[c(Vt,{children:[s,"%"]}),c(Nt,{children:["The feature has been requested"," ",c("b",{children:[t(qe,{value:o})," times"]})," ","and exposed"," ",c("b",{children:[t(qe,{value:e.yes})," ","times"]})," ","in the last hour"]})]}),t(sr,{"data-loading":!0,children:t(Ta,{percentage:s,size:"3rem"})})]})},nt=({strategy:e})=>{const n=an(e.name);return t(ee,{title:De(e.name)+(e.title?` - ${e.title}`:""),arrow:!0,children:t(rr,{children:t(n,{})})})},rr=p("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)}})),qt=p("ul")(()=>({all:"unset",display:"flex",alignItems:"center",alignContent:"center"})),at=p("li")(()=>({all:"unset",minWidth:30,textAlign:"center"})),ir=p("div")(({theme:e})=>({display:"flex",flexDirection:"row",alignItems:"center",gap:e.spacing(1)})),Le=5,cr=({strategies:e})=>e!=null&&e.length?e.length>Le+1?c(qt,{"aria-label":"Feature strategies",children:[e.slice(0,Le).map(n=>t(at,{children:t(nt,{strategy:n})},n.id)),c(ft,{tooltip:e.slice(Le).map(n=>t(at,{children:c(ir,{children:[t(nt,{strategy:n})," ",De(n.name)+(n.title?` - ${n.title}`:"")]})},n.id)),children:["(+",e.length-Le,")"]})]}):t(qt,{"aria-label":"Feature strategies",children:e.map(n=>t(at,{children:t(nt,{strategy:n})},n.id))}):null,lr=p("div",{shouldForwardProp:e=>e!=="enabled"})(({theme:e,enabled:n})=>({borderRadius:e.shape.borderRadiusLarge,marginBottom:e.spacing(2),backgroundColor:n?e.palette.background.paper:e.palette.envAccordion.disabled})),dr=p(xa)({boxShadow:"none",background:"none"}),ur=p(Ea)(({theme:e})=>({boxShadow:"none",padding:e.spacing(2,4),[e.breakpoints.down(400)]:{padding:e.spacing(1,2)}})),pr=p(Da,{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)}})),hr=p(Yo)(({theme:e})=>({width:"100%",position:"relative",paddingBottom:e.spacing(2)})),gr=p("div",{shouldForwardProp:e=>e!=="enabled"})(({theme:e,enabled:n})=>({display:"flex",justifyContent:"center",flexDirection:"column",color:n?e.palette.text.primary:e.palette.text.secondary})),fr=p("div")(({theme:e})=>({display:"flex",alignItems:"center",[e.breakpoints.down(560)]:{flexDirection:"column",textAlign:"center"}})),mr=p(ks)(({theme:e})=>({[e.breakpoints.down(560)]:{marginBottom:"0.5rem"}})),yr=p(yt)(({theme:e})=>({fontSize:e.fontSizes.bodySize,fontWeight:e.typography.fontWeightMedium,[e.breakpoints.down(560)]:{textAlign:"center"}})),Sr=p("div")(({theme:e})=>({display:"flex",alignItems:"center",marginTop:e.spacing(2),gap:e.spacing(2),flexWrap:"wrap",[e.breakpoints.down(560)]:{flexDirection:"column"}})),br=({env:e})=>{var u;const n=A("projectId"),a=A("featureId"),{metrics:o}=Xs(n,a),{feature:s}=L(n,a),{value:r}=rn(),l=to(s==null?void 0:s.environments,o).find(h=>h.environment===e.name),d=s==null?void 0:s.environments.find(h=>h.name===e.name);return t(v,{condition:!new Set(r.hiddenEnvironments).has(e.name),show:t(lr,{enabled:e.enabled,children:c(dr,{TransitionProps:{mountOnEnter:!0},"data-testid":`${Aa}_${e.name}`,className:`environment-accordion ${e.enabled?"":"accordion-disabled"}`,children:[c(ur,{expandIcon:t(Ra,{titleAccess:"Toggle"}),children:[c(gr,{"data-loading":!0,enabled:e.enabled,children:[c(fr,{children:[t(mr,{enabled:e.enabled}),t("div",{children:t(yr,{text:e.name,maxWidth:"100",maxLength:15})}),t(v,{condition:!e.enabled,show:t(Te,{color:"neutral",sx:{ml:1},children:"Disabled"})})]}),c(Sr,{children:[t(lt,{label:"Add strategy",projectId:n,featureId:a,environmentId:e.name,variant:"outlined",size:"small"}),t(cr,{strategies:d==null?void 0:d.strategies})]})]}),t(or,{environmentMetric:l,disabled:!e.enabled})]}),c(pr,{enabled:e.enabled,children:[t(hr,{featureEnvironment:d,isDisabled:!e.enabled,otherEnvironments:s==null?void 0:s.environments.map(({name:h})=>h).filter(h=>h!==e.name)}),t(v,{condition:(((u=d==null?void 0:d.strategies)==null?void 0:u.length)||0)>0,show:c(M,{children:[t(J,{sx:{display:"flex",justifyContent:"center",py:1},children:t(lt,{label:"Add strategy",projectId:n,featureId:a,environmentId:e.name})}),t(nr,{environmentMetric:l})]})})]})]})})})},Cr=()=>{const e=A("projectId"),n=A("featureId"),{feature:a}=L(e,n);if(!a)return null;const{environments:o}=a;return t(M,{children:o==null?void 0:o.map(s=>t(br,{env:s},s.name))})},Rn=e=>{const{makeRequest:n,createRequest:a,errors:o,loading:s}=ka({propagateErrors:!0}),r=async(u,h)=>{const g=a(`/api/admin/projects/${e}/features/${u}/dependencies`,{method:"POST",body:JSON.stringify(h)});await n(g.caller,g.id)},i=async(u,h)=>{const g=a(`/api/admin/projects/${e}/features/${u}/dependencies/${h}`,{method:"DELETE"});await n(g.caller,g.id)},l=async u=>{const h=a(`/api/admin/projects/${e}/features/${u}/dependencies`,{method:"DELETE"});await n(h.caller,h.id)},d=[a,n,N,e];return{addDependency:f.useCallback(r,d),removeDependency:f.useCallback(i,d),removeDependencies:f.useCallback(l,d),errors:o,loading:s}},vr=(e,n,a={})=>{const o=ge(`/api/admin/projects/${e}/features/${n}/parents`),{data:s,error:r,mutate:i}=He(o,wr,a);return{parentOptions:s,error:r,loading:!r&&!s}},wr=async e=>await(await fetch(e).then(Ee("Parent Options"))).json(),Tr=()=>c(fe,{severity:"warning",children:["Remember to update your Unleash client! Feature dependencies require new SDK versions. Read more about ",t(xr,{}),"."]}),xr=()=>t("a",{href:"https://docs.getunleash.io/reference/dependent-features#client-sdk-support",target:"_blank",rel:"noreferrer",children:"Client SDK support for feature dependencies"}),Er=p(cn)(({theme:e})=>({marginTop:e.spacing(2),marginBottom:e.spacing(1.5)})),xe={key:"none (remove dependency)",label:"none (remove dependency)"},Dr=({project:e,featureId:n,parent:a,onSelect:o})=>{const{parentOptions:s,loading:r}=vr(e,n),i=s?[xe,...s.map(l=>({key:l,label:l}))]:[xe];return t(Er,{fullWidth:!0,options:i,value:a,onChange:o})},Ar=(e,n,a,o)=>{const{trackEvent:s}=me(),{addChange:r}=le(),{refetch:i}=oe(e),{setToastData:l,setToastApiError:d}=U(),{refetchFeature:u}=L(e,n),h=bt(e)(),{isChangeRequestConfiguredInAnyEnv:g}=Q(e),{addDependency:b,removeDependencies:C}=Rn(e),S=async m=>{if(!h){console.error("No change request environment");return}m==="addDependency"&&(await r(e,h,[{action:m,feature:n,payload:{feature:a}}]),s("dependent_features",{props:{eventType:"dependency added"}})),m==="deleteDependency"&&await r(e,h,[{action:m,feature:n,payload:void 0}]),i(),l({text:m==="addDependency"?`${n} will depend on ${a}`:`${n} dependency will be removed`,type:"success",title:"Change added to a draft"})};return async()=>{try{if(g()){const m=a===xe.key?"deleteDependency":"addDependency";await S(m),s("dependent_features",{props:{eventType:m==="addDependency"?"add dependency added to change request":"delete dependency added to change request"}})}else a===xe.key?(await C(n),s("dependent_features",{props:{eventType:"dependency removed"}}),l({title:"Dependency removed",type:"success"})):(await b(n,{feature:a}),s("dependent_features",{props:{eventType:"dependency added"}}),l({title:"Dependency added",type:"success"}))}catch(m){d(N(m))}await u(),o()}},Rr=({project:e,featureId:n,showDependencyDialogue:a,onClose:o})=>{const[s,r]=f.useState(xe.key),i=Ar(e,n,s,o),{isChangeRequestConfiguredInAnyEnv:l}=Q(e);return t(se,{open:a,title:"Add parent feature dependency",onClose:o,onClick:i,primaryButtonText:l()?"Add change to draft":s===xe.key?"Remove":"Add",secondaryButtonText:"Cancel",children:c(J,{children:[t(Tr,{}),t(J,{sx:{mt:2,mb:4},children:"Your feature will be evaluated only when the selected parent feature is enabled in the same environment."}),t(W,{children:"What feature do you want to depend on?"}),t(v,{condition:a,show:t(Dr,{project:e,featureId:n,parent:s,onSelect:r})})]})})},kr=p(on)(({theme:e})=>({borderRadius:e.shape.borderRadiusLarge,padding:e.spacing(1,1.5)})),Fr=({feature:e,onEdit:n,onDelete:a})=>{const o=`dependency-${e}-actions`,s=`${o}-menu`,[r,i]=f.useState(null),l=!!r,d=h=>{i(h.currentTarget)},u=()=>{i(null)};return c("span",{children:[t(ee,{title:"Dependency actions",arrow:!0,describeChild:!0,children:t($e,{id:o,"aria-controls":l?s:void 0,"aria-haspopup":"true","aria-expanded":l?"true":void 0,onClick:d,type:"button",children:t(sn,{})})}),t(kr,{id:s,anchorEl:r,open:l,onClose:u,transformOrigin:{horizontal:"right",vertical:"top"},anchorOrigin:{horizontal:"right",vertical:"bottom"},disableScrollLock:!0,children:c(Fa,{"aria-labelledby":o,children:[t(v,{condition:!0,show:c(ie,{onClick:()=>{n(),u()},children:[t(we,{children:t(ve,{})}),t(he,{children:t(W,{variant:"body2",children:"Edit"})})]})}),t(v,{condition:!0,show:c(ie,{onClick:()=>{a(),u()},children:[t(we,{children:t($a,{})}),t(he,{children:t(W,{variant:"body2",children:"Delete"})})]})})]})})]})},kn=({childFeatures:e,project:n})=>t(ft,{tooltip:t(M,{children:e.map(a=>t(xt,{to:`/projects/${n}/features/${a}`,children:t("div",{children:a})},`${n}-${a}`))}),children:e.length===1?"1 feature":`${e.length} features`}),$r=(e,n)=>{const{trackEvent:a}=me(),{addChange:o}=le(),{refetch:s}=oe(e),{setToastData:r,setToastApiError:i}=U(),{refetchFeature:l}=L(e,n),d=bt(e)(),{isChangeRequestConfiguredInAnyEnv:u}=Q(e),{removeDependencies:h}=Rn(e),g=async()=>{if(!d){console.error("No change request environment");return}await o(e,d,[{action:"deleteDependency",feature:n,payload:void 0}])};return async()=>{try{u()?(await g(),a("dependent_features",{props:{eventType:"delete dependency added to change request"}}),r({text:`${n} dependency will be removed`,type:"success",title:"Change added to a draft"}),await s()):(await h(n),a("dependent_features",{props:{eventType:"dependency removed"}}),r({title:"Dependency removed",type:"success"}),await l())}catch(C){i(N(C))}}},Ir=({feature:e})=>{var u,h;const[n,a]=f.useState(!1),o=!!e.project&&e.dependencies.length===0&&e.children.length===0,s=!!e.project&&e.dependencies.length>0,r=!!e.project&&e.children.length>0,i=bt(e.project)(),l=en(e.project),d=$r(e.project,e.name);return c(M,{children:[t(v,{condition:o,show:t(ze,{children:c(Ve,{children:[t(Ne,{children:"Dependency:"}),t(ce,{permission:Dt,projectId:e.project,variant:"text",onClick:()=>{a(!0)},children:"Add parent feature"})]})})}),t(v,{condition:s,show:c(ze,{children:[c(Ve,{children:[t(Ne,{children:"Dependency:"}),t(xt,{to:`/projects/${e.project}/features/${(u=e.dependencies[0])==null?void 0:u.feature}`,children:(h=e.dependencies[0])==null?void 0:h.feature})]}),t(v,{condition:l(Dt,i),show:t(Fr,{feature:e.name,onEdit:()=>a(!0),onDelete:d})})]})}),t(v,{condition:r,show:t(ze,{children:c(Ve,{children:[t(Ne,{children:"Children:"}),t(kn,{childFeatures:e.children,project:e.project})]})})}),t(v,{condition:!!e.project,show:t(Rr,{project:e.project,featureId:e.name,onClose:()=>a(!1),showDependencyDialogue:n})})]})},Pr=(e,n={})=>{const a=ge(`/api/admin/projects/${e}/dependencies`),{data:o,error:s}=ln(e,!1,a,Br,n);return{dependenciesExist:o,error:s,loading:!s&&!o}},Br=async e=>await(await fetch(e).then(Ee("Dependencies exist check"))).json(),Or=e=>{const{dependenciesExist:n}=Pr(e),{isOss:a}=Be();return!!(!a()||n)},Mr=p("div")(({theme:e})=>({display:"flex",flexDirection:"column",justifyItems:"center",padding:e.spacing(3),fontSize:e.fontSizes.smallBody})),_r=({feature:e,header:n})=>{var r;const{locationSettings:a}=dn();Be();const o=Or(e.project),s=(r=e.environments)==null?void 0:r.map(i=>({name:i.name,lastSeenAt:i.lastSeenAt,enabled:i.enabled}));return c(Mr,{children:[n,c(ze,{children:[c(Ve,{children:[t(Ne,{children:"Created at:"}),t("span",{children:Ia(un(e.createdAt),a.locale)})]}),t(Pa,{featureLastSeen:e.lastSeenAt,environments:s,sx:{p:0}})]}),t(v,{condition:o,show:t(Ir,{feature:e})})]})},Lr=p($e,{shouldForwardProp:e=>e!=="visibilityOff"})(({theme:e,visibilityOff:n})=>({marginLeft:"auto",marginRight:e.spacing(-1),color:n?e.palette.action.active:e.palette.action.focus,"&:hover":{color:e.palette.action.active}})),jr=({environment:e,hiddenEnvironments:n,setHiddenEnvironments:a})=>t(Lr,{onClick:()=>{a(e.name)},visibilityOff:n.has(e.name),children:t(v,{condition:n.has(e.name),show:t(Ba,{}),elseShow:t(Oa,{})})}),zr=p("div")(({theme:e})=>({marginLeft:e.spacing(-1.5),"&:not(:last-of-type)":{marginBottom:e.spacing(2)},display:"flex",alignItems:"center"})),Vr=p("label")(()=>({display:"inline-flex",alignItems:"center",cursor:"pointer"})),Nr=({environment:e,callback:n,children:a,hiddenEnvironments:o,setHiddenEnvironments:s})=>{const r=A("projectId"),i=A("featureId"),{feature:l,refetchFeature:d}=L(r,i),{isChangeRequestConfigured:u}=Q(r),h=c(M,{children:[" ",c("span",{"data-loading":!0,children:[e.enabled?"enabled":"disabled"," in"]})," ",t(yt,{text:e.name,maxWidth:"120",maxLength:15})]}),{onToggle:g,modals:b}=Fs(r),C=(S,E)=>g(S,{projectId:r,featureId:i,environmentName:e.name,environmentType:e.type,hasStrategies:e.strategies.length>0,hasEnabledStrategies:e.strategies.some(m=>!m.disabled),isChangeRequestEnabled:u(e.name),onRollback:E,onSuccess:()=>{n&&n(),d()}});return c(zr,{children:[c(Vr,{children:[t($s,{featureId:l.name,projectId:r,environmentName:e.name,onToggle:C,value:e.enabled}),a??h]}),t(jr,{environment:e,hiddenEnvironments:o,setHiddenEnvironments:s}),b]})},qr=p("div")(({theme:e})=>({padding:e.spacing(3)})),Hr=p("div")(()=>({display:"flex",flexDirection:"column"})),Wr=p("p")(({theme:e})=>({fontSize:e.fontSizes.bodySize})),Ur=p("p")(({theme:e})=>({fontSize:e.fontSizes.smallBody,color:e.palette.text.secondary,display:"flex",alignItems:"center"})),Ht=p("span")(({theme:e})=>({padding:e.spacing(0,.5),"::after":{content:'"-"'}})),Yr=p(Ct)(()=>({"&:hover, &:focus":{textDecoration:"underline"}})),Gr=({feature:e,header:n,hiddenEnvironments:a,setHiddenEnvironments:o})=>{const s=e.environments.some(r=>{var i;return r.enabled&&((i=r.variants)==null?void 0:i.length)});return c(qr,{"data-testid":"feature-toggle-status",children:[n,e.environments.map(r=>{const i=r.strategies.length===1?"1 strategy":`${r.strategies.length} strategies`,l=r.variants??[],d=l.length>0&&c(M,{children:[t(Ht,{}),t(ee,{title:"View variants",arrow:!0,describeChild:!0,children:t(Yr,{component:G,to:`/projects/${e.project}/features/${e.name}/variants`,underline:"hover",children:l.length===1?"1 variant":`${l.length} variants`})})]}),u=r.enabled&&l.length===0&&s;return t(Nr,{environment:r,hiddenEnvironments:a,setHiddenEnvironments:o,children:c(Hr,{children:[t(Wr,{children:r.name}),c(Ur,{children:[i,d,t(v,{condition:u,show:c(M,{children:[t(Ht,{}),t(Is,{})]})})]})]})},r.name)})]})},Fn=(e,n={})=>{const a=async()=>{const u=ge(`api/admin/features/${e}/tags`);return(await fetch(u,{method:"GET"}).then(Ee("Tags"))).json()},o=`api/admin/features/${e}/tags`,{data:s,error:r}=ln(!!e,{tags:[]},o,a,n),[i,l]=f.useState(!r&&!s),d=()=>{pt(o)};return f.useEffect(()=>{l(!r&&!s)},[s,r]),{tags:(s==null?void 0:s.tags)||[],error:r,loading:i,refetch:d}},Kr=p("section")(({theme:e})=>({"& > *":{margin:e.spacing(1,0)}})),st=e=>e.map(n=>({title:n.value})),Wt=(e,n)=>e.map(a=>({value:a.title,type:n})),$n=({open:e,setOpen:n})=>{const{tagTypes:a}=Ma(),o=A("featureId"),{createTag:s}=Ps(),{updateFeatureTags:r,loading:i}=We(),{tags:l,refetch:d,loading:u}=Fn(o),{setToastData:h}=U(),g=a&&a.length>0?a[0]:{name:"simple",description:"Simple tag to get you started",icon:""},[b,C]=f.useState(g),S=i||u,[E,m]=f.useState(0),{trackEvent:y}=me(),[$,_]=f.useState(st(l.filter(x=>x.type===b.name))),{tags:q,refetch:z}=Bs(b.name),w=f.useMemo(()=>st(q),[q]);f.useEffect(()=>{l&&b&&_(st(l.filter(x=>x.type===b.name)))},[JSON.stringify(l),b]);const R=()=>{n(!1),_([])};function I(x,F){const O=x.filter(j=>j.type===b.name).filter(j=>!F.find(B=>j.value===B.value&&j.type===B.type)),H=F.filter(j=>j.type===b.name).filter(j=>!x.find(B=>j.value===B.value&&j.type===B.type));return m(O.length+H.length),{added:O,removed:H}}const V=x=>x.filter(F=>!F.title.startsWith("Create")),K=async(x,F)=>{try{await r(o,{addedTags:x,removedTags:F}),await d()}catch(O){const H=N(O);h({type:"error",title:"Failed to add tag",text:H,confetti:!1})}},te=(x,F)=>{let O="We successfully";return x>0&&(O=O.concat(` added ${x} new tag${x>1?"s":""}`)),x>0&&F>0&&(O=O.concat(" and ")),F>0&&(O=O.concat(` removed ${F} tag${F>1?"s":""}`)),O},Z=async x=>{x.preventDefault();const F=Wt(V($),b.name),{added:O,removed:H}=I(F,l);E>0&&(await K(O,H),E>1&&y("suggest_tags",{props:{eventType:"multiple_tags_added"}}),E>0&&h({type:"success",title:`Updated tag${O.length>1?"s":""} to toggle`,text:te(O.length,H.length),confetti:!0})),m(0),_([]),n(!1)},T=(x,F)=>{F!=null&&typeof F!="string"&&(x.preventDefault(),C(F),_([]),m(0))},P=(x,F,O)=>{const H=_a(F);O==="selectOption"&&F.forEach((B,X)=>{if(typeof B!="string"&&B.inputValue&&B.inputValue!==""){const Oe={value:B.inputValue,type:b.name};s(Oe).then(()=>{y("suggest_tags",{props:{eventType:"tag_created"}}),z()}),B.title=B.inputValue,B.inputValue="",H[X]=B}});const j=Wt(V(H),b.name);I(j,l),_(H)},D="add-tag-form";return t(se,{open:e,secondaryButtonText:"Cancel",primaryButtonText:"Save tags",title:"Update feature toggle tags",onClick:Z,disabledPrimaryButton:S||E===0,onClose:R,formId:D,children:c(M,{children:[t(W,{paragraph:!0,sx:{marginBottom:x=>x.spacing(2.5)},children:"Tags allow you to group features together"}),t("form",{id:D,onSubmit:Z,children:c(Kr,{children:[t(Os,{options:a,value:b,onChange:T}),t(Ms,{options:w,existingTags:l,tagType:b,selectedOptions:$,onChange:P})]})})]})})},Jr=p("div")(({theme:e})=>({display:"flex",flexDirection:"column",padding:e.spacing(3)})),Qr=p("div")(({theme:e})=>({display:"flex",gap:e.spacing(1),flexWrap:"wrap"})),Zr=p(pn)(({theme:e})=>({fontSize:e.fontSizes.smallBody})),Xr=p(ke)(({theme:e})=>({margin:e.spacing(3),borderStyle:"dashed"})),ei=p(Re)(({theme:e})=>({maxWidth:e.spacing(20),alignSelf:"center"})),ti=({feature:e,header:n})=>{const{tags:a,refetch:o}=Fn(e.name),{deleteTagFromFeature:s}=We(),[r,i]=f.useState(!1),[l,d]=f.useState(!1),[u,h]=f.useState(),{setToastData:g,setToastApiError:b}=U(),{hasAccess:C}=f.useContext(mt),S=C(Ce,e.project),E=async()=>{if(u)try{await s(e.name,u.type,u.value),o(),g({type:"success",title:"Tag deleted",text:"Successfully deleted tag"})}catch(m){b(N(m))}};return c(Jr,{children:[n,t(Qr,{children:a.map(m=>{const y=`${m.type}:${m.value}`;return t(Zr,{label:y,deleteIcon:t(La,{titleAccess:"Remove"}),onDelete:S?()=>{d(!0),h(m)}:void 0},y)})}),t(v,{condition:S,show:c(M,{children:[t(v,{condition:a.length>0,show:t(Xr,{})}),t(ei,{"data-loading":!0,variant:"outlined",startIcon:t(ja,{}),onClick:()=>i(!0),children:"Add new tag"})]})}),t($n,{open:r,setOpen:i}),c(se,{open:l,primaryButtonText:"Delete tag",secondaryButtonText:"Cancel",onClose:()=>{d(!1),h(void 0)},onClick:()=>{d(!1),E(),h(void 0)},title:"Delete tag?",children:["You are about to delete tag:"," ",c("strong",{children:[u==null?void 0:u.type,":",u==null?void 0:u.value]})]})]})},ni=p(za)(({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=p("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}})),ai=({hiddenEnvironments:e,setHiddenEnvironments:n})=>{const a=A("projectId"),o=A("featureId"),{feature:s}=L(a,o);return c(ni,{children:[t(Gr,{header:c(ot,{"data-loading":!0,children:["Enabled in environments (",s.environments.filter(({enabled:r})=>r).length,")",t(Va,{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:s,hiddenEnvironments:e,setHiddenEnvironments:n}),t(ke,{}),t(_r,{header:t(ot,{"data-loading":!0,children:"Feature toggle details"}),feature:s}),t(ke,{}),t(ti,{header:t(ot,{"data-loading":!0,children:"Tags for this feature toggle"}),feature:s})]})},si=()=>{const{trackEvent:e}=me(),{value:n,setValue:a}=rn(),[o,s]=f.useState(new Set(n.hiddenEnvironments));return{hiddenEnvironments:o,setHiddenEnvironments:i=>{a(l=>{const d=new Set(l.hiddenEnvironments);return d.has(i)?(d.delete(i),e("hidden_environment",{props:{eventType:"environment unhidden"}})):(d.add(i),e("hidden_environment",{props:{eventType:"environment hidden"}})),s(d),{...n,hiddenEnvironments:d}})}}},oi=p("div")(({theme:e})=>({display:"flex",width:"100%",[e.breakpoints.down(1e3)]:{flexDirection:"column"}})),ri=p("div")(({theme:e})=>({display:"flex",flexDirection:"column",width:"calc(100% - (350px + 1rem))",[e.breakpoints.down(1e3)]:{width:"100%"}})),ii=()=>{const e=de(),n=A("projectId"),a=A("featureId"),o=ht(n,a),{hiddenEnvironments:s,setHiddenEnvironments:r}=si(),i=()=>e(o);return hn(a),c(oi,{children:[c("div",{children:[t(Zs,{}),t(ai,{hiddenEnvironments:s,setHiddenEnvironments:r})]}),t(ri,{children:t(Cr,{})}),c(gn,{children:[t(ue,{path:"strategies/create",element:t(ct,{label:"Create feature strategy",onClose:i,open:!0,children:t(Io,{})})}),t(ue,{path:"strategies/edit",element:t(ct,{label:"Edit feature strategy",onClose:i,open:!0,children:t(Na,{})})})]})]})},ci=p("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})),li=p(fn,{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:n})=>({color:n?e.palette.neutral.border:e.palette.primary.main})),di=p("span",{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:n})=>({color:n?e.palette.text.secondary:e.palette.text.primary,marginLeft:e.spacing(1.25),fontSize:e.fontSizes.mainHeader,fontWeight:e.fontWeight.bold})),ui=p("form")(()=>({display:"flex",flexDirection:"column",height:"100%"})),pi=p(fe)(({theme:e})=>({marginBottom:e.spacing(2)})),hi=p(fe)(({theme:e})=>({marginTop:e.spacing(4)})),gi=p("div")({display:"flex",flexDirection:"column"}),fi=p("div")(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1.5),marginBottom:e.spacing(.5)})),Ut=p("p")(({theme:e})=>({fontSize:e.fontSizes.smallBody,color:e.palette.text.secondary,marginBottom:e.spacing(1.5)})),mi=p(ke)(({theme:e})=>({margin:e.spacing(4,0)})),yi=p(qa)(({theme:e})=>({minWidth:e.spacing(20),width:"100%"})),Si=p("div")(({theme:e})=>({marginTop:"auto",paddingTop:e.spacing(4),display:"flex",justifyContent:"flex-end"})),bi=p(Re)(({theme:e})=>({marginLeft:e.spacing(3)})),Ci=f.memo(Ha),vi=({environment:e,open:n,setOpen:a,getApiPayload:o,getCrPayload:s,onConfirm:r})=>{const i=A("projectId"),l=A("featureId"),{uiConfig:d}=Be(),{context:u}=Wa(),{defaultStickiness:h,loading:g}=Ua(i),{isChangeRequestConfigured:b}=Q(i),{data:C}=oe(i),{changeRequestInReviewOrApproved:S,alert:E}=Ga(C),m=(e==null?void 0:e.variants)||[],[y,$]=f.useState([]),[_,q]=f.useState();f.useEffect(()=>{g||$(m.length?m.map(k=>({...k,isValid:!0,new:!1,id:Ge()})):[{name:"",weightType:At.VARIABLE,weight:0,overrides:[],stickiness:(y==null?void 0:y.length)>0?y[0].stickiness:h,new:!0,isValid:!1,id:Ge()}])},[n,g]);const z=(k,Y)=>{$(ye=>Rt(ye.map(Me=>Me.id===Y?k:Me),1e3))},w=()=>{const k=Ge();$(Y=>[...Y,{name:"",weightType:At.VARIABLE,weight:0,overrides:[],stickiness:(Y==null?void 0:Y.length)>0?Y[0].stickiness:h,new:!0,isValid:!1,id:k}]),q(k)};f.useEffect(()=>{if(_){const k=document.getElementById(`variant-name-input-${_}`);k==null||k.scrollIntoView({behavior:"smooth",block:"center"}),k==null||k.focus({preventScroll:!0}),q(void 0)}},[_]);const R=y.map(({new:k,isValid:Y,id:ye,...Me})=>Me),I=o(m,R),V=s(R),K=async k=>{k.preventDefault(),r(R)},te=()=>D?`curl --location --request POST '${d.unleashUrl}/api/admin/projects/${i}/environments/${e==null?void 0:e.name}/change-requests' \\
|
|
5
|
-
--header 'Authorization: INSERT_API_KEY' \\
|
|
6
|
-
--header 'Content-Type: application/json' \\
|
|
7
|
-
--data-raw '${JSON.stringify(V,void 0,2)}'`:`curl --location --request PATCH '${d.unleashUrl}/api/admin/projects/${i}/features/${l}/environments/${e==null?void 0:e.name}/variants' \\
|
|
8
|
-
--header 'Authorization: INSERT_API_KEY' \\
|
|
9
|
-
--header 'Content-Type: application/json' \\
|
|
10
|
-
--data-raw '${JSON.stringify(I.patch,void 0,2)}'`,Z=y.every(({isValid:k})=>k),T=S((e==null?void 0:e.name)||""),P=T?"Add to existing change request":"Add change to draft",D=b((e==null?void 0:e.name)||""),x=f.useMemo(()=>{var k;return g?"":((k=R[0])==null?void 0:k.stickiness)||h},[g,h,JSON.stringify(R[0]??{})]),F=f.useMemo(()=>["default",...u.filter(k=>k.stickiness).map(k=>k.name)],[u]),O=F.map(k=>({key:k,label:k}));F.includes(x)||O.push({key:x,label:x});const H=async k=>{$(Y=>Y.map(ye=>({...ye,stickiness:k})))},j=k=>{H(k)},[B,X]=f.useState();f.useEffect(()=>{X(void 0),I.error&&X(I.error)},[I.error]);const Oe=()=>{H(h),a(!1)};return g||x===""?t(Ya,{}):t(ct,{open:n,onClose:Oe,label:"",children:c(nn,{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:te,loading:!n,children:[c(ci,{children:[c("div",{children:[t(li,{deprecated:!(e!=null&&e.enabled)}),t(di,{deprecated:!(e!=null&&e.enabled),children:e==null?void 0:e.name})]}),t(ce,{"data-testid":"MODAL_ADD_VARIANT_BUTTON",onClick:w,variant:"outlined",permission:Se,projectId:i,environmentId:e==null?void 0:e.name,children:"Add variant"})]}),c(ui,{onSubmit:K,children:[t(v,{condition:T,show:E,elseShow:t(v,{condition:!!D,show:c(pi,{severity:"info",children:[t("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(gi,{children:y.map(k=>t(Ci,{variant:k,variants:y,updateVariant:Y=>z(Y,k.id),removeVariant:()=>$(Y=>Rt(Y.filter(ye=>ye.id!==k.id),1e3)),error:I.error},k.id))}),t(ce,{onClick:w,variant:"outlined",permission:Se,projectId:i,environmentId:e==null?void 0:e.name,children:"Add variant"}),t(mi,{}),t(v,{condition:y.length>0,show:c(M,{children:[t(fi,{children:t("p",{children:"Stickiness"})}),c(Ut,{children:["By overriding the stickiness you can control which parameter is used to ensure consistent traffic allocation across variants."," ",t(Ct,{href:"https://docs.getunleash.io/reference/feature-toggle-variants",target:"_blank",rel:"noreferrer",children:"Read more"})]}),t("div",{children:t(yi,{value:x,label:"",editable:!0,onChange:k=>j(k.target.value)})})]}),elseShow:t(Ut,{children:"This environment has no variants. Get started by adding a variant."})}),c(hi,{severity:"error",hidden:!B,children:[t("strong",{children:"Error: "}),B]}),c(Si,{children:[t(Re,{"data-testid":"DIALOGUE_CONFIRM_ID",type:"submit",variant:"contained",color:"primary",disabled:!Z,children:D?P:"Save variants"}),t(bi,{onClick:Oe,children:"Cancel"})]})]})]})})},wi=(e,n,a)=>{const{changeRequests:o}=Tt(e,n),s=(o==null?void 0:o.filter(i=>i.environment===a&&i.state==="Scheduled"))||[],r=[];return s.length===0||s.forEach(i=>{const l=i==null?void 0:i.features.find(u=>u.name===n);(l==null?void 0:l.changes.find(u=>u.action==="patchVariant"))&&r.push(i.id)}),r},Ti=p("div")(({theme:e})=>({padding:e.spacing(3),borderRadius:e.shape.borderRadiusLarge,border:`1px solid ${e.palette.divider}`,"&:not(:last-child)":{marginBottom:e.spacing(3)}})),xi=p("div")({display:"flex",alignItems:"center",justifyContent:"space-between","& > div":{display:"flex",alignItems:"center"}}),Ei=p(fn,{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:n})=>({color:n?e.palette.neutral.border:e.palette.primary.main})),Di=p("span",{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:n})=>({color:n?e.palette.text.secondary:e.palette.text.primary,marginLeft:e.spacing(1.25),fontWeight:e.fontWeight.bold})),Ai=p("p")(({theme:e})=>({fontSize:e.fontSizes.smallBody,color:e.palette.text.secondary,marginBottom:e.spacing(1.5)})),Ri=p("div")(({theme:e})=>({margin:e.spacing(3,0)})),ki=p("div")(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1.5),marginBottom:e.spacing(.5)})),Fi=({environment:e,searchValue:n,children:a})=>{var d;const o=A("projectId"),s=A("featureId"),r=wi(o,s,e.name),i=e.variants??[],l=((d=i[0])==null?void 0:d.stickiness)||"default";return c(Ti,{children:[c(xi,{children:[c("div",{children:[t(Ei,{deprecated:!e.enabled}),t(Di,{deprecated:!e.enabled,children:e.name}),t(v,{condition:r.length>0,show:t(Vs,{sx:{ml:2},children:t(Tn,{scheduledChangeRequestIds:r})})})]}),a]}),t(v,{condition:i.length>0,show:c(M,{children:[t(Ri,{children:t(Ka,{variants:i,searchValue:n})}),t(v,{condition:i.length>1,show:c(M,{children:[c(ki,{children:[t("p",{children:"Stickiness:"}),t(Te,{children:l})]}),c(Ai,{children:["By overriding the stickiness you can control which parameter is used to ensure consistent traffic allocation across variants."," ",t(Ct,{href:"https://docs.getunleash.io/reference/feature-toggle-variants",target:"_blank",rel:"noreferrer",children:"Read more"})]})]})})]})})]})},$i=p(he)(({theme:e})=>({"& span":{fontSize:e.fontSizes.smallBody}})),Ii=({environment:e,permission:n,projectId:a,environmentId:o,onCopyVariantsFrom:s,otherEnvsWithVariants:r})=>{const[i,l]=f.useState(null),d=!!i,u=e.variants??[];return t(v,{condition:r.length>0&&u.length===0,show:c(M,{children:[t(ce,{onClick:h=>{l(h.currentTarget)},id:`copy-from-menu-${e.name}`,"aria-controls":d?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":d?"true":void 0,variant:"outlined",permission:n,projectId:a,environmentId:o,children:"Copy variants from"}),t(Ie,{anchorEl:i,open:d,onClose:()=>l(null),MenuListProps:{"aria-labelledby":`copy-from-menu-${e.name}`},children:r.map(h=>t(ie,{onClick:()=>s(h,e),children:t($i,{children:`Copy from ${h.name}`})},h.name))})]})})},Pi=({permission:e,projectId:n,environment:a,checked:o,onClick:s,...r})=>{const i=it(e,n,a);return c(ie,{disabled:!i,onClick:s,...r,children:[t(Ja,{checked:o}),a]})},Bi=p(Ie)(({theme:e})=>({"& > div > ul":{display:"flex",flexDirection:"column",justifyContent:"center","& > li":{padding:e.spacing(0,1)}}})),Oi=p("div")(({theme:e})=>({margin:e.spacing(1,2)})),Mi=p(Re)(({theme:e})=>({marginTop:e.spacing(2)})),_i=({current:e,environments:n,permission:a,projectId:o,onSubmit:s})=>{var E;const[r,i]=f.useState(null),l=!!r,[d,u]=f.useState([]),h=m=>{u(y=>[...y,m])},g=m=>{u(y=>y.filter(({name:$})=>$!==m.name))},b=m=>{d.includes(m)?g(m):h(m)},C=()=>{u([]),i(null)},S=((E=n.find(m=>m.name===e))==null?void 0:E.variants)??[];return t(v,{condition:S.length>0&&n.length>1,show:c(M,{children:[t(Re,{onClick:m=>{i(m.currentTarget)},id:`push-to-menu-${e}`,"aria-controls":l?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":l?"true":void 0,variant:"outlined",children:"Copy to environment"}),c(Bi,{anchorEl:r,open:l,onClose:()=>i(null),MenuListProps:{"aria-labelledby":`push-to-menu-${e}`},children:[n.filter(m=>m.name!==e).map(m=>t(Pi,{projectId:o,permission:a,environment:m.name,checked:d.includes(m),onClick:()=>b(m)},m.name)),c(Oi,{children:[t(ke,{}),c(Mi,{variant:"outlined",onClick:()=>{s(d),C()},disabled:d.length===0,children:["Push to selected (",d.length,")"]})]})]})]})})},Li=p("div")(({theme:e})=>({display:"flex",gap:e.spacing(1.5)})),ji=()=>{const{setToastData:e,setToastApiError:n}=U(),a=gt(),o=Pe(a.breakpoints.down("md")),s=A("projectId"),r=A("featureId"),{feature:i,refetchFeature:l,loading:d}=L(s,r),{patchFeatureEnvironmentVariants:u,overrideVariantsInEnvironments:h}=We(),{refetch:g}=oe(s),{addChange:b}=le(),{isChangeRequestConfigured:C}=Q(s),[S,E]=f.useState(""),[m,y]=f.useState(),[$,_]=f.useState(!1),q=f.useMemo(()=>{var T;return((T=i==null?void 0:i.environments)==null?void 0:T.map(P=>({...P,crEnabled:C(P.name)})))||[]},[i.environments]),z=(T,P)=>es(T,P),w=(T,P)=>{try{const D=Xa(P,1e3);return{patch:z(T,D)}}catch(D){return{patch:[],error:N(D)}}},R=T=>({feature:r,action:"patchVariant",payload:{variants:T}}),I=async(T,P)=>{if(T.crEnabled)await b(s,T.name,R(P)),g();else{const D=T.variants??[],{patch:x,error:F}=w(D,P);if(x.length===0)return;if(F){e({type:"error",title:F});return}await u(s,r,T.name,x)}l()},V=async(T,P)=>{try{const D=P.filter(({crEnabled:j})=>j),x=P.filter(({crEnabled:j})=>!j);D.length&&await Promise.all(D.map(j=>b(s,j.name,R(T)))),x.length&&await h(s,r,T,x.map(({name:j})=>j)),g(),l();const F=x.length?`Variants pushed to ${x.length===1?x[0].name:`${x.length} environments`}`:"",O=D.length?`Variants push added to ${D.length===1?`${D[0].name} draft`:`${D.length} drafts`}`:"",H=`${F}${F&&O?". ":""}${O}`;e({title:H,type:"success"})}catch(D){n(N(D))}},K=T=>{y(T),_(!0)},te=async T=>{if(m)try{await I(m,T),_(!1),e({title:m.crEnabled?"Variant changes added to draft":"Variants updated successfully",type:"success"})}catch(P){n(N(P))}},Z=async(T,P)=>{try{const D=T.variants??[];await I(P,D),e({title:P.crEnabled?"Variants copy added to draft":"Variants copied successfully",type:"success"})}catch(D){n(N(D))}};return c(vt,{isLoading:d,header:t(Qa,{title:"Variants",actions:t(v,{condition:!o,show:t(M,{children:t(kt,{initialValue:S,onChange:E})})}),children:t(v,{condition:o,show:t(kt,{initialValue:S,onChange:E})})}),children:[t(Za,{}),q.map(T=>{var D;const P=q.filter(({name:x,variants:F})=>x!==T.name&&(F==null?void 0:F.length));return t(Fi,{environment:T,searchValue:S,children:c(Li,{children:[t(_i,{current:T.name,environments:q,permission:Se,projectId:s,onSubmit:x=>V(T.variants??[],x)}),t(Ii,{environment:T,permission:Se,projectId:s,environmentId:T.name,onCopyVariantsFrom:Z,otherEnvsWithVariants:P}),t(v,{condition:!!((D=T.variants)!=null&&D.length),show:t(ae,{"data-testid":"EDIT_VARIANTS_BUTTON",onClick:()=>K(T),permission:Se,projectId:s,environmentId:T.name,tooltipProps:{title:"Edit variants"},children:t(ve,{})}),elseShow:t(ce,{"data-testid":"ADD_VARIANT_BUTTON",onClick:()=>K(T),variant:"outlined",permission:Se,projectId:s,environmentId:T.name,children:"Add variant"})})]})},T.name)}),t(vi,{environment:m,open:$,setOpen:_,getApiPayload:w,getCrPayload:R,onConfirm:te})]})},zi=ge("api/admin/client-metrics/features"),In=(e,n)=>{const a=ge(`api/admin/client-metrics/features/${e}/raw?hoursBack=${n}`),{data:o,error:s}=He(a,()=>Vi(a)),r=f.useCallback(()=>{pt(zi).catch(console.warn)},[]);return{featureMetrics:o==null?void 0:o.data,loading:!s&&!o,refetchFeatureMetrics:r,error:s}},Vi=e=>fetch(e).then(Ee("Features")).then(n=>n.json()).then(),Ni=p("h2")(({theme:e})=>({margin:0,marginBottom:e.spacing(1),fontSize:e.fontSizes.smallBody,fontWeight:e.fontWeight.thin,color:e.palette.text.secondary})),Fe=48,qi=({hoursBack:e,setHoursBack:n})=>{const a=o=>{n(Hi(o))};return c("div",{children:[t(Ni,{children:"Period"}),t(cn,{name:"feature-metrics-period",id:"feature-metrics-period",options:Wi,value:String(e),onChange:a,fullWidth:!0})]})},Hi=e=>{switch(e){case"1":return 1;case"24":return 24;default:return Fe}},Wi=[{key:"1",label:"Last hour"},{key:"24",label:"Last 24 hours"},{key:`${Fe}`,label:`Last ${Fe} hours`}],Ui=({value:e})=>{const{locationSettings:n}=dn(),a=e?e instanceof Date?Ft(e,n.locale):Ft(un(e),n.locale):void 0;return t(mn,{lineClamp:1,children:a})},Yi=({metrics:e,tableSectionId:n})=>{const a=Pe(ts.breakpoints.down("md")),o=f.useMemo(()=>({sortBy:[{id:"timestamp"}]}),[]),{getTableProps:s,getTableBodyProps:r,headerGroups:i,rows:l,prepareRow:d,setHiddenColumns:u}=Ke.useTable({initialState:o,columns:Yt,data:e,autoResetHiddenColumns:!1,disableSortRemove:!0,defaultColumn:{Cell:mn}},Ke.useGlobalFilter,Ke.useSortBy);return ns([{condition:a,columns:["appName","environment"]}],u,Yt),e.length===0?null:c(as,{...s(),rowHeight:"standard",id:n,children:[t(ss,{headerGroups:i}),t(os,{...r(),children:l.map(h=>(d(h),t(rs,{hover:!0,...h.getRowProps(),children:h.cells.map(g=>t(is,{...g.getCellProps(),children:g.render("Cell")}))})))})]})},Yt=[{id:"Icon",width:"1%",disableSortBy:!0,Cell:()=>t(cs,{icon:t(qs,{color:"disabled"})})},{Header:"Time",accessor:"timestamp",Cell:e=>t(Ui,{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"}],Gi=({metrics:e,...n})=>{const a=f.useMemo(()=>e.reduce((s,r)=>s+r.yes,0),[e]),o=f.useMemo(()=>e.reduce((s,r)=>s+r.no,0),[e]);return t(An,{...n,totalYes:a,totalNo:o})},Ki=({metrics:e,hoursBack:n})=>{const a=$t(),o=$t();return e.length===0?c(J,{mt:6,children:[t(W,{variant:"body1",paragraph:!0,children:"We have yet to receive any metrics for this feature toggle in the selected time period."}),t(W,{variant:"body1",paragraph:!0,children:"Please note that, since the SDKs send metrics on an interval, it might take some time before metrics appear."})]}):c(f.Suspense,{fallback:null,children:[t(J,{borderTop:1,pt:2,mt:3,borderColor:"divider",children:t(Ji,{metrics:e,hoursBack:n,statsSectionId:a})}),t(J,{mt:4,children:t(Gi,{metrics:e,hoursBack:n,statsSectionId:a,tableSectionId:o})}),t(J,{mt:4,children:t(Yi,{metrics:e,tableSectionId:o})})]})},Ji=ls.lazy(()=>ds(()=>import("./FeatureMetricsChart-d6700d04.js"),[])),dt=e=>{const{search:n}=window.location,a=de(),o=f.useMemo(()=>new URLSearchParams(n),[n]),s=f.useCallback(r=>{const i=new URLSearchParams(n);i.set(e,r),a({search:i.toString()},{replace:!0})},[e,n,a]);return[o.get(e)||void 0,s]},Qi=e=>{const[n,a]=dt(e),o=f.useCallback(s=>a(String(s)),[a]);return[Number.isFinite(Number(n))?Number(n):void 0,o]},Zi=p("h2")(({theme:e})=>({margin:0,marginBottom:e.spacing(1.5),fontSize:e.fontSizes.smallBody,fontWeight:e.fontWeight.thin,color:e.palette.text.secondary})),Xi=p("ul")(({theme:e})=>({display:"flex",flexWrap:"wrap",gap:e.spacing(1),listStyleType:"none",padding:0,minHeight:"100%"})),ec=p("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}})),Gt=({title:e,values:n,value:a,setValue:o})=>{const s=i=>()=>{n.has(i)&&o(i)},r=f.useMemo(()=>Array.from(n).sort((i,l)=>i.localeCompare(l)),[n]);return c("div",{children:[t(Zi,{children:e}),t(Xi,{children:r.map(i=>t(ec,{children:t(pn,{label:i,onClick:s(i),"aria-pressed":i===a,sx:us})},i))})]})},tc=()=>{const e=A("projectId"),n=A("featureId"),a=nc(e,n),o=ac(n);hn("Metrics");const[s=Fe,r]=Qi("hoursBack"),{featureMetrics:i}=In(n,s),[l,d]=f.useState(i);f.useEffect(()=>{i&&d(i)},[i]);const u=Array.from(a)[0],h=Array.from(o)[0],[g=u,b]=dt("environment"),[C=h,S]=dt("application"),E=f.useMemo(()=>l==null?void 0:l.filter(m=>m.environment===g).filter(m=>m.appName===C),[l,g,C]);return E?c(vt,{children:[c(re,{container:!0,component:"header",spacing:2,children:[t(re,{item:!0,xs:12,md:5,children:t(v,{condition:a.size>0,show:t(Gt,{title:"Environments",values:a,value:g,setValue:b})})}),t(re,{item:!0,xs:12,md:5,children:t(v,{condition:o.size>0,show:t(Gt,{title:"Applications",values:o,value:C,setValue:S})})}),t(re,{item:!0,xs:12,md:2,children:t(qi,{hoursBack:s,setHoursBack:r})})]}),t(Ki,{metrics:E,hoursBack:s})]}):null},nc=(e,n)=>{const{feature:a}=L(e,n),o=a.environments.map(s=>s.name);return new Set(o)},ac=e=>{const{featureMetrics:n=[]}=In(e,Fe),a=n.map(o=>o.appName);return new Set(a)},sc=(e,n)=>{const a=new Set(e),o=new Set(n);return a.size!==o.size?!1:[...a].every(s=>o.has(s))},Kt=p("div")(({theme:e})=>({display:"grid",gap:e.spacing(2)})),Jt=p(fe)(({theme:e})=>({marginBottom:e.spacing(1)})),oc=p(St)({padding:0}),rc=({projectId:e,open:n,onClose:a,onClick:o,feature:s,changeRequests:r})=>{const i=A("projectId"),{project:l}=yn(e),{isChangeRequestConfiguredInAnyEnv:d}=Q(e),u=d(),h=f.useMemo(()=>sc(s.environments.map(C=>C.name),l.environments.map(C=>C.environment)),[s,l]),g=r?r.length>0:!1,b=s.dependencies.length>0||s.children.length>0;return t(v,{condition:h&&!b&&!g&&!u,show:t(se,{open:n,onClose:a,onClick:o,title:"Confirm change project",primaryButtonText:"Change project",secondaryButtonText:"Cancel",children:c(Kt,{children:[t(Jt,{severity:"success",children:"This feature toggle is compatible with the new project."}),t("p",{children:"Are you sure you want to change the project for this toggle?"})]})}),elseShow:t(se,{open:n,onClick:a,title:"Confirm change project",primaryButtonText:"Close",children:c(Kt,{children:[t(Jt,{severity:"warning",children:"Cannot proceed with the move"}),t(v,{condition:b,show:c("p",{children:[t("span",{children:"The feature toggle must not have any dependencies."})," ",t("br",{}),t("span",{children:"Please remove feature dependencies first."})]})}),t(v,{condition:!h,show:t("p",{children:"In order to move a feature toggle between two projects, both projects must have the exact same environments enabled."})}),t(v,{condition:g,show:c(M,{children:[t("p",{children:"The feature toggle must not have any pending change requests. This feature toggle is currently referenced in the following change requests:"}),t(oc,{children:r==null?void 0:r.map(C=>t(be,{children:c(G,{to:`/projects/${i}/change-requests/${C.id}`,children:["View change request"," ",C.id]})},C.id))})]})}),t(v,{condition:u,show:c("p",{children:["You're not allowed to move the feature to project"," ",t(G,{to:`/projects/${e}/settings/change-requests`,children:e}),". This project has change requests enabled."]})})]})})})},ic=()=>{const{hasAccess:e}=f.useContext(mt),n=A("projectId"),a=A("featureId"),{feature:o,refetchFeature:s}=L(n,a),[r,i]=f.useState(!1),{changeFeatureProject:l}=We(),{setToastData:d,setToastApiError:u}=U(),[h,g]=f.useState(n),{projects:b}=ps(),C=de(),{changeRequests:S}=Tt(n,a),E=async()=>{try{h&&(await l(n,a,h),s(),d({title:"Project changed",type:"success"}),i(!1),C(`/projects/${h}/features/${a}/settings`,{replace:!0}))}catch(y){u(N(y))}},m=f.useMemo(()=>b.map(y=>y.id).filter(y=>e(It,y)),[b,e]);return m.length===0?null:c(M,{children:[t(hs,{value:h,onChange:g,label:"Project",filter:y=>m.includes(y),enabled:!0}),t(ce,{permission:It,onClick:()=>i(!0),disabled:h===n,projectId:n,children:"Save"}),t(rc,{changeRequests:S,projectId:h,open:r,feature:o,onClose:()=>i(!1),onClick:E})]})},cc=p("div")({display:"flex",alignItems:"center"}),lc=p(W)(({theme:e})=>({fontSize:e.fontSizes.mainHeader})),dc=({projectId:e,featureId:n})=>{var r;const{feature:a}=L(e,n),o=de();return c(M,{children:[c(cc,{children:[t(lc,{children:"Feature information"}),t(ae,{permission:Ce,projectId:e,"data-loading":!0,onClick:()=>{o(`/projects/${e}/features/${n}/edit`)},tooltipProps:{title:"Edit"},children:t(ve,{})})]}),c(W,{children:["Name: ",t("strong",{children:a.name})]}),c(W,{children:["Description:"," ",t("strong",{children:(r=a.description)!=null&&r.length?a.description:"no description"})]}),c(W,{children:["Type: ",t("strong",{children:a.type})]}),c(W,{children:["Impression Data:"," ",t("strong",{children:a.impressionData?"enabled":"disabled"})]})]})},je="metadata",rt="project",uc=p("div")(({theme:e})=>({width:"20%",borderRight:`1px solid ${e.palette.divider}`,padding:e.spacing(2,0),[e.breakpoints.down("md")]:{width:"35%"}})),pc=p("div")(({theme:e})=>({padding:e.spacing(4),display:"flex",flexDirection:"column",width:400,"& > *":{margin:e.spacing(1,0)}})),hc=()=>{const e=A("projectId"),n=A("featureId"),[a,o]=f.useState(je),{uiConfig:s}=Be();return t(vt,{header:"Settings",sx:{padding:0},children:c(J,{sx:{display:"flex"},children:[t(uc,{children:c(St,{children:[t(be,{sx:{padding:"0.75rem 2rem"},button:!0,onClick:()=>o(je),selected:a===je,children:"Metadata"},0),t(be,{sx:{padding:"0.75rem 2rem"},button:!0,onClick:()=>o(rt),selected:a===rt,hidden:!s.flags.P,children:"Project"},1)]})}),c(pc,{children:[t(v,{condition:a===je,show:t(dc,{projectId:e,featureId:n})}),t(v,{condition:a===rt&&s.flags.P,show:t(ic,{})})]})]})})},gc=({stale:e,showActive:n=!0})=>!e&&!n?null:t("div",{"data-loading":!0,style:{marginLeft:"8px"},children:t(Te,{color:e?"error":"success",title:e?"Feature toggle is deprecated.":"Feature toggle is active.",children:e?"Stale":"Active"})}),Qt=p("strong")({wordBreak:"break-all"}),fc=()=>{const e=A("projectId"),n=A("featureId"),{archivedFeatures:a}=gs(),o=fs(e,{name:n});return a?a.some(r=>r.name===n)?c("p",{children:["The feature ",t(Qt,{children:n})," has been archived. You can find it on the"," ",t(G,{to:`/projects/${e}/archive`,children:"project archive page"}),"."]}):c("p",{children:["The feature ",t(Qt,{children:n})," does not exist. Would you like to"," ",t(G,{to:o,children:"create it"}),"?"]}):null},mc=p(G)(({theme:e})=>({textDecoration:"none",color:e.palette.primary.main,fontWeight:e.fontWeight.bold})),yc=({isOpen:e,onClose:n,features:a,project:o})=>c(se,{title:"You can't archive a feature that other features depend on",open:e,primaryButtonText:"OK",onClick:n,children:[t("p",{children:"The following features depend on your feature:"}),t("ul",{children:a.map(s=>t("li",{children:t(mc,{to:`/projects/${o}/features/${s}`,target:"_blank",rel:"noopener noreferrer",children:s})},s))})]}),Sc=e=>f.createElement("svg",{fill:"none",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",...e},f.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"}),f.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"})),bc=e=>f.createElement("svg",{fill:"none",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",...e},f.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"})),Cc=p("div")(({theme:e})=>({backgroundColor:e.palette.background.paper,borderRadius:e.shape.borderRadiusLarge,marginBottom:e.spacing(2)})),vc=p("div")(({theme:e})=>({padding:e.spacing(2,4,2,2),display:"flex",justifyContent:"space-between",alignItems:"center",[e.breakpoints.down(500)]:{flexDirection:"column"}})),Zt=p("div")({display:"flex",alignItems:"center"}),Xt=p("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"}));p(Sc)(({theme:e})=>({width:e.fontSizes.smallBody,height:e.fontSizes.smallBody}));p(bc)(({theme:e})=>({width:e.fontSizes.smallBody,height:e.fontSizes.smallBody}));const wc=p("h1")(({theme:e})=>({fontSize:e.fontSizes.mainHeader,fontWeight:"normal",display:"flex",alignItems:"center",wordBreak:"break-all"})),Tc=p("div")({flexShrink:0,display:"flex"}),xc=p("div")(({theme:e})=>({width:"100%",backgroundColor:e.palette.divider,height:"1px"})),Ec=p("div")(({theme:e})=>({padding:e.spacing(0,4)})),Dc=p(ms)(({theme:e})=>({textTransform:"none",width:"auto",fontSize:e.fontSizes.bodySize,padding:"0 !important",[e.breakpoints.up("md")]:{minWidth:160}})),Ac=p(G)(({theme:e})=>({maxWidth:"100%",textDecoration:"none","&:hover, &:focus":{textDecoration:"underline"}})),Ic=()=>{var T,P;const e=A("projectId"),n=A("featureId"),{refetch:a}=yn(e),{favorite:o,unfavorite:s}=ys(),{refetchFeature:r}=L(e,n),{setToastData:i,setToastApiError:l}=U(),[d,u]=f.useState(!1),[h,g]=f.useState(!1),[b,C]=f.useState(!1),[S,E]=f.useState(!1),m=Pe("(max-width:500px)"),{feature:y,loading:$,error:_,status:q}=L(e,n),z=de(),{pathname:w}=Ss(),R=bs($),I=`/projects/${e}/features/${n}`,V=[{title:"Overview",path:`${I}`,name:"overview"},{title:"Metrics",path:`${I}/metrics`,name:"Metrics"},{title:"Variants",path:`${I}/variants`,name:"Variants"},{title:"Settings",path:`${I}/settings`,name:"Settings"},{title:"Event log",path:`${I}/logs`,name:"Event log"}],K=V.find(D=>D.path===w)??V[0],te=async()=>{try{y!=null&&y.favorite?await s(e,y.name):await o(e,y.name),r()}catch{l("Something went wrong, could not update favorite")}};if(q===404)return t(fc,{});if(_!==void 0)return t("div",{ref:R});const Z=()=>{try{As(y.name),E(!0),setTimeout(()=>{E(!1)},3e3)}catch{i({type:"error",title:"Could not copy feature name"})}};return c("div",{ref:R,children:[c(Cc,{children:[c(vc,{children:[c(Zt,{children:[t(Cs,{onClick:te,isFavorite:y==null?void 0:y.favorite}),c("div",{children:[c(Zt,{children:[c(wc,{"data-loading":!0,children:[y.name," "]}),t(ee,{title:S?"Copied!":"Copy name",arrow:!0,children:t($e,{onClick:Z,style:{marginLeft:8},children:S?t(vs,{style:{fontSize:16}}):t(ws,{style:{fontSize:16}})})}),t(v,{condition:!m,show:t(gc,{stale:y==null?void 0:y.stale})})]}),t(v,{condition:y.dependencies.length>0,show:c(Xt,{children:[t("b",{children:"Has parent: "}),t(Ac,{to:`/projects/${y.project}/features/${(T=y==null?void 0:y.dependencies[0])==null?void 0:T.feature}`,children:(P=y==null?void 0:y.dependencies[0])==null?void 0:P.feature})]})}),t(v,{condition:y.children.length>0,show:c(Xt,{children:[t("b",{children:"Has children:"}),t(kn,{childFeatures:y.children,project:y.project})]})})]})]}),c(Tc,{children:[t(ae,{permission:Ts,projectId:e,"data-loading":!0,component:G,to:`/projects/${e}/features/${n}/copy`,tooltipProps:{title:"Clone"},children:t(Hs,{})}),t(ae,{permission:xs,projectId:e,tooltipProps:{title:"Archive feature toggle"},"data-loading":!0,onClick:()=>g(!0),children:t(Ns,{})}),t(ae,{onClick:()=>C(!0),permission:Ce,projectId:e,tooltipProps:{title:"Toggle stale state"},"data-loading":!0,children:t(_s,{})}),t(ae,{onClick:()=>u(!0),permission:Ce,projectId:e,tooltipProps:{title:"Add tag"},"data-loading":!0,children:t(Es,{})})]})]}),t(xc,{}),t(Ec,{children:t(Ds,{value:K.path,indicatorColor:"primary",textColor:"primary",children:V.map(D=>t(Dc,{label:D.title,value:D.path,onClick:()=>z(D.path),"data-testid":`TAB-${D.title}`},D.title))})})]}),c(gn,{children:[t(ue,{path:"metrics",element:t(tc,{})}),t(ue,{path:"logs",element:t(Us,{})}),t(ue,{path:"variants",element:t(ji,{})}),t(ue,{path:"settings",element:t(hc,{})}),t(ue,{path:"*",element:t(ii,{})})]}),t(v,{condition:y.children.length>0,show:t(yc,{features:y.children,project:e,isOpen:h,onClose:()=>g(!1)}),elseShow:t(Ls,{isOpen:h,onConfirm:()=>{a(),z(`/projects/${e}`)},onClose:()=>g(!1),projectId:e,featureIds:[n]})}),t(js,{isStale:y.stale,isOpen:b,onClose:()=>{C(!1),r()},featureId:n,projectId:e}),t($n,{open:d,setOpen:u})]})};export{Ic as default};
|