unleash-server 5.3.4 → 5.4.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/slack-app-definition.js +8 -0
- package/dist/lib/addons/slack-app-definition.js.map +1 -1
- package/dist/lib/addons/slack-app.d.ts +1 -4
- package/dist/lib/addons/slack-app.js +46 -68
- package/dist/lib/addons/slack-app.js.map +1 -1
- package/dist/lib/addons/slack-app.test.js +12 -66
- package/dist/lib/addons/slack-app.test.js.map +1 -1
- package/dist/lib/create-config.js +1 -0
- package/dist/lib/create-config.js.map +1 -1
- package/dist/lib/db/access-store.d.ts +3 -1
- package/dist/lib/db/access-store.js +53 -0
- package/dist/lib/db/access-store.js.map +1 -1
- package/dist/lib/db/client-applications-store.d.ts +3 -1
- package/dist/lib/db/client-applications-store.js +73 -6
- package/dist/lib/db/client-applications-store.js.map +1 -1
- package/dist/lib/db/feature-environment-store.js +3 -0
- package/dist/lib/db/feature-environment-store.js.map +1 -1
- package/dist/lib/db/feature-strategy-store.d.ts +1 -0
- package/dist/lib/db/feature-strategy-store.js +21 -3
- package/dist/lib/db/feature-strategy-store.js.map +1 -1
- package/dist/lib/db/feature-strategy-store.test.js +40 -0
- package/dist/lib/db/feature-strategy-store.test.js.map +1 -1
- package/dist/lib/db/feature-toggle-client-store.js +5 -3
- package/dist/lib/db/feature-toggle-client-store.js.map +1 -1
- package/dist/lib/db/feature-toggle-store.d.ts +6 -1
- package/dist/lib/db/feature-toggle-store.js +37 -9
- package/dist/lib/db/feature-toggle-store.js.map +1 -1
- package/dist/lib/db/index.js +1 -1
- package/dist/lib/db/index.js.map +1 -1
- package/dist/lib/db/role-store.d.ts +3 -0
- package/dist/lib/db/role-store.js +21 -4
- package/dist/lib/db/role-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-access-service/change-request-access-read-model.d.ts +1 -0
- package/dist/lib/features/change-request-access-service/fake-change-request-access-read-model.d.ts +1 -0
- package/dist/lib/features/change-request-access-service/fake-change-request-access-read-model.js +3 -0
- package/dist/lib/features/change-request-access-service/fake-change-request-access-read-model.js.map +1 -1
- package/dist/lib/features/change-request-access-service/sql-change-request-access-read-model.d.ts +1 -0
- package/dist/lib/features/change-request-access-service/sql-change-request-access-read-model.js +10 -1
- package/dist/lib/features/change-request-access-service/sql-change-request-access-read-model.js.map +1 -1
- package/dist/lib/features/export-import-toggles/export-import-permissions.e2e.test.js +4 -0
- package/dist/lib/features/export-import-toggles/export-import-permissions.e2e.test.js.map +1 -1
- package/dist/lib/features/export-import-toggles/export-import-service.d.ts +2 -1
- package/dist/lib/features/export-import-toggles/export-import-service.js +30 -16
- 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 +24 -4
- package/dist/lib/features/export-import-toggles/export-import.e2e.test.js.map +1 -1
- package/dist/lib/features/export-import-toggles/import-context-validation.js +1 -1
- package/dist/lib/features/export-import-toggles/import-context-validation.js.map +1 -1
- package/dist/lib/features/export-import-toggles/import-toggles-store-type.d.ts +1 -0
- package/dist/lib/features/export-import-toggles/import-toggles-store.d.ts +1 -0
- package/dist/lib/features/export-import-toggles/import-toggles-store.js +8 -0
- package/dist/lib/features/export-import-toggles/import-toggles-store.js.map +1 -1
- package/dist/lib/features/export-import-toggles/import-validation-messages.d.ts +1 -1
- package/dist/lib/features/export-import-toggles/import-validation-messages.js +7 -1
- package/dist/lib/features/export-import-toggles/import-validation-messages.js.map +1 -1
- package/dist/lib/features/feature-toggle/createFeatureToggleService.js +9 -12
- package/dist/lib/features/feature-toggle/createFeatureToggleService.js.map +1 -1
- package/dist/lib/features/index.d.ts +1 -0
- package/dist/lib/features/index.js +1 -0
- package/dist/lib/features/index.js.map +1 -1
- package/dist/lib/features/playground/advanced-playground.test.js +57 -6
- package/dist/lib/features/playground/advanced-playground.test.js.map +1 -1
- package/dist/lib/features/playground/generateObjectCombinations.d.ts +2 -2
- package/dist/lib/features/playground/generateObjectCombinations.js +4 -1
- package/dist/lib/features/playground/generateObjectCombinations.js.map +1 -1
- package/dist/lib/features/playground/generateObjectCombinations.test.js +7 -6
- package/dist/lib/features/playground/generateObjectCombinations.test.js.map +1 -1
- package/dist/lib/features/playground/playground.js +1 -1
- package/dist/lib/features/playground/playground.js.map +1 -1
- package/dist/lib/features/segment/createSegmentService.d.ts +5 -0
- package/dist/lib/features/segment/createSegmentService.js +32 -0
- package/dist/lib/features/segment/createSegmentService.js.map +1 -0
- package/dist/lib/metrics.js +12 -0
- package/dist/lib/metrics.js.map +1 -1
- package/dist/lib/metrics.test.js +1 -1
- package/dist/lib/metrics.test.js.map +1 -1
- package/dist/lib/middleware/response-time-metrics.js +1 -1
- package/dist/lib/middleware/response-time-metrics.js.map +1 -1
- package/dist/lib/openapi/index.js +3 -1
- package/dist/lib/openapi/index.js.map +1 -1
- package/dist/lib/openapi/meta-schema-rules.test.js +2 -41
- package/dist/lib/openapi/meta-schema-rules.test.js.map +1 -1
- package/dist/lib/openapi/spec/admin-features-query-schema.d.ts +1 -0
- package/dist/lib/openapi/spec/admin-features-query-schema.js +1 -0
- package/dist/lib/openapi/spec/admin-features-query-schema.js.map +1 -1
- package/dist/lib/openapi/spec/advanced-playground-environment-feature-schema.d.ts +4 -1
- package/dist/lib/openapi/spec/advanced-playground-feature-schema.d.ts +8 -2
- package/dist/lib/openapi/spec/advanced-playground-request-schema.d.ts +1 -1
- package/dist/lib/openapi/spec/advanced-playground-response-schema.d.ts +17 -5
- package/dist/lib/openapi/spec/application-schema.d.ts +33 -1
- package/dist/lib/openapi/spec/application-schema.js +12 -1
- package/dist/lib/openapi/spec/application-schema.js.map +1 -1
- package/dist/lib/openapi/spec/application-usage-schema.d.ts +25 -0
- package/dist/lib/openapi/spec/application-usage-schema.js +27 -0
- package/dist/lib/openapi/spec/application-usage-schema.js.map +1 -0
- package/dist/lib/openapi/spec/applications-schema.d.ts +57 -1
- package/dist/lib/openapi/spec/applications-schema.js +4 -1
- package/dist/lib/openapi/spec/applications-schema.js.map +1 -1
- package/dist/lib/openapi/spec/bulk-metrics-schema.d.ts +18 -4
- package/dist/lib/openapi/spec/bulk-registration-schema.d.ts +6 -1
- package/dist/lib/openapi/spec/client-metrics-env-schema.d.ts +6 -2
- package/dist/lib/openapi/spec/client-metrics-env-schema.js +0 -1
- package/dist/lib/openapi/spec/client-metrics-env-schema.js.map +1 -1
- package/dist/lib/openapi/spec/client-metrics-schema.d.ts +6 -1
- package/dist/lib/openapi/spec/create-application-schema.d.ts +0 -1
- package/dist/lib/openapi/spec/create-application-schema.js +0 -1
- package/dist/lib/openapi/spec/create-application-schema.js.map +1 -1
- package/dist/lib/openapi/spec/create-context-field-schema.d.ts +68 -0
- package/dist/lib/openapi/spec/create-context-field-schema.js +19 -0
- package/dist/lib/openapi/spec/create-context-field-schema.js.map +1 -0
- package/dist/lib/openapi/spec/create-feature-schema.d.ts +1 -0
- package/dist/lib/openapi/spec/create-feature-schema.js +1 -0
- package/dist/lib/openapi/spec/create-feature-schema.js.map +1 -1
- package/dist/lib/openapi/spec/create-feature-strategy-schema.d.ts +0 -1
- package/dist/lib/openapi/spec/create-group-schema.d.ts +0 -1
- package/dist/lib/openapi/spec/create-group-schema.js +0 -1
- package/dist/lib/openapi/spec/create-group-schema.js.map +1 -1
- package/dist/lib/openapi/spec/create-invited-user-schema.d.ts +9 -0
- package/dist/lib/openapi/spec/create-invited-user-schema.js +9 -0
- package/dist/lib/openapi/spec/create-invited-user-schema.js.map +1 -1
- package/dist/lib/openapi/spec/create-strategy-variant-schema.d.ts +0 -1
- package/dist/lib/openapi/spec/create-strategy-variant-schema.js +0 -1
- package/dist/lib/openapi/spec/create-strategy-variant-schema.js.map +1 -1
- package/dist/lib/openapi/spec/create-user-response-schema.d.ts +2 -1
- package/dist/lib/openapi/spec/create-user-response-schema.js +1 -1
- package/dist/lib/openapi/spec/create-user-response-schema.js.map +1 -1
- package/dist/lib/openapi/spec/date-schema.d.ts +6 -1
- package/dist/lib/openapi/spec/date-schema.js +14 -1
- package/dist/lib/openapi/spec/date-schema.js.map +1 -1
- package/dist/lib/openapi/spec/environment-project-schema.d.ts +0 -2
- package/dist/lib/openapi/spec/environments-project-schema.d.ts +0 -2
- package/dist/lib/openapi/spec/event-schema.d.ts +1 -3
- package/dist/lib/openapi/spec/event-schema.js +0 -1
- package/dist/lib/openapi/spec/event-schema.js.map +1 -1
- package/dist/lib/openapi/spec/events-schema.d.ts +1 -3
- package/dist/lib/openapi/spec/export-query-schema.d.ts +0 -1
- package/dist/lib/openapi/spec/export-query-schema.js +0 -1
- package/dist/lib/openapi/spec/export-query-schema.js.map +1 -1
- package/dist/lib/openapi/spec/export-result-schema.d.ts +17 -1
- package/dist/lib/openapi/spec/feature-environment-metrics-schema.d.ts +6 -1
- package/dist/lib/openapi/spec/feature-environment-schema.d.ts +7 -0
- package/dist/lib/openapi/spec/feature-environment-schema.js +7 -0
- package/dist/lib/openapi/spec/feature-environment-schema.js.map +1 -1
- package/dist/lib/openapi/spec/feature-events-schema.d.ts +1 -3
- package/dist/lib/openapi/spec/feature-metrics-schema.d.ts +12 -2
- package/dist/lib/openapi/spec/feature-schema.d.ts +9 -1
- package/dist/lib/openapi/spec/feature-schema.js +2 -1
- package/dist/lib/openapi/spec/feature-schema.js.map +1 -1
- package/dist/lib/openapi/spec/feature-strategy-segment-schema.d.ts +5 -0
- package/dist/lib/openapi/spec/feature-strategy-segment-schema.js +5 -0
- package/dist/lib/openapi/spec/feature-strategy-segment-schema.js.map +1 -1
- package/dist/lib/openapi/spec/feature-usage-schema.d.ts +12 -2
- package/dist/lib/openapi/spec/features-schema.d.ts +16 -1
- package/dist/lib/openapi/spec/group-schema.d.ts +10 -2
- package/dist/lib/openapi/spec/group-schema.js +6 -0
- package/dist/lib/openapi/spec/group-schema.js.map +1 -1
- package/dist/lib/openapi/spec/group-user-model-schema.d.ts +2 -1
- package/dist/lib/openapi/spec/groups-schema.d.ts +14 -4
- package/dist/lib/openapi/spec/health-overview-schema.d.ts +16 -5
- package/dist/lib/openapi/spec/health-report-schema.d.ts +16 -5
- package/dist/lib/openapi/spec/import-toggles-schema.d.ts +34 -2
- package/dist/lib/openapi/spec/index.d.ts +3 -1
- package/dist/lib/openapi/spec/index.js +3 -1
- package/dist/lib/openapi/spec/index.js.map +1 -1
- package/dist/lib/openapi/spec/maintenance-schema.d.ts +2 -0
- package/dist/lib/openapi/spec/maintenance-schema.js +2 -0
- package/dist/lib/openapi/spec/maintenance-schema.js.map +1 -1
- package/dist/lib/openapi/spec/me-schema.d.ts +2 -1
- package/dist/lib/openapi/spec/patch-schema.d.ts +12 -1
- package/dist/lib/openapi/spec/patch-schema.js +12 -1
- package/dist/lib/openapi/spec/patch-schema.js.map +1 -1
- package/dist/lib/openapi/spec/patches-schema.d.ts +12 -1
- package/dist/lib/openapi/spec/playground-feature-schema.d.ts +3 -0
- package/dist/lib/openapi/spec/playground-request-schema.d.ts +1 -1
- package/dist/lib/openapi/spec/playground-response-schema.d.ts +8 -2
- package/dist/lib/openapi/spec/playground-segment-schema.d.ts +1 -0
- package/dist/lib/openapi/spec/playground-segment-schema.js +1 -0
- package/dist/lib/openapi/spec/playground-segment-schema.js.map +1 -1
- package/dist/lib/openapi/spec/playground-strategy-schema.d.ts +2 -0
- package/dist/lib/openapi/spec/playground-strategy-schema.js +1 -0
- package/dist/lib/openapi/spec/playground-strategy-schema.js.map +1 -1
- package/dist/lib/openapi/spec/profile-schema.d.ts +9 -1
- package/dist/lib/openapi/spec/project-environment-schema.d.ts +0 -2
- package/dist/lib/openapi/spec/project-overview-schema.d.ts +20 -6
- package/dist/lib/openapi/spec/project-overview-schema.js +4 -1
- package/dist/lib/openapi/spec/project-overview-schema.js.map +1 -1
- package/dist/lib/openapi/spec/project-schema.d.ts +4 -0
- package/dist/lib/openapi/spec/project-schema.js +4 -0
- package/dist/lib/openapi/spec/project-schema.js.map +1 -1
- package/dist/lib/openapi/spec/projects-schema.d.ts +6 -0
- package/dist/lib/openapi/spec/projects-schema.js +2 -0
- package/dist/lib/openapi/spec/projects-schema.js.map +1 -1
- package/dist/lib/openapi/spec/public-signup-token-schema.d.ts +3 -1
- package/dist/lib/openapi/spec/public-signup-token-schema.js +1 -0
- package/dist/lib/openapi/spec/public-signup-token-schema.js.map +1 -1
- package/dist/lib/openapi/spec/public-signup-tokens-schema.d.ts +5 -2
- package/dist/lib/openapi/spec/push-variants-schema.d.ts +3 -0
- package/dist/lib/openapi/spec/push-variants-schema.js +3 -0
- package/dist/lib/openapi/spec/push-variants-schema.js.map +1 -1
- package/dist/lib/openapi/spec/reset-password-schema.d.ts +4 -0
- package/dist/lib/openapi/spec/reset-password-schema.js +4 -0
- package/dist/lib/openapi/spec/reset-password-schema.js.map +1 -1
- package/dist/lib/openapi/spec/sdk-context-schema.d.ts +1 -1
- package/dist/lib/openapi/spec/sdk-context-schema.js +1 -1
- package/dist/lib/openapi/spec/sdk-context-schema.js.map +1 -1
- package/dist/lib/openapi/spec/search-events-schema.d.ts +2 -2
- package/dist/lib/openapi/spec/search-events-schema.js +1 -6
- package/dist/lib/openapi/spec/search-events-schema.js.map +1 -1
- package/dist/lib/openapi/spec/sort-order-schema.d.ts +4 -1
- package/dist/lib/openapi/spec/sort-order-schema.js +4 -1
- package/dist/lib/openapi/spec/sort-order-schema.js.map +1 -1
- package/dist/lib/openapi/spec/state-schema.d.ts +39 -3
- package/dist/lib/openapi/spec/state-schema.js +14 -2
- package/dist/lib/openapi/spec/state-schema.js.map +1 -1
- package/dist/lib/openapi/spec/toggle-maintenance-schema.d.ts +2 -0
- package/dist/lib/openapi/spec/toggle-maintenance-schema.js +2 -0
- package/dist/lib/openapi/spec/toggle-maintenance-schema.js.map +1 -1
- package/dist/lib/openapi/spec/token-string-list-schema.d.ts +0 -1
- package/dist/lib/openapi/spec/token-string-list-schema.js +0 -1
- package/dist/lib/openapi/spec/token-string-list-schema.js.map +1 -1
- package/dist/lib/openapi/spec/token-user-schema.d.ts +1 -1
- package/dist/lib/openapi/spec/token-user-schema.js +1 -1
- package/dist/lib/openapi/spec/token-user-schema.js.map +1 -1
- package/dist/lib/openapi/spec/{upsert-context-field-schema.d.ts → update-context-field-schema.d.ts} +19 -8
- package/dist/lib/openapi/spec/update-context-field-schema.js +44 -0
- package/dist/lib/openapi/spec/update-context-field-schema.js.map +1 -0
- package/dist/lib/openapi/spec/update-user-schema.d.ts +0 -1
- package/dist/lib/openapi/spec/update-user-schema.js +0 -1
- package/dist/lib/openapi/spec/update-user-schema.js.map +1 -1
- package/dist/lib/openapi/spec/user-schema.d.ts +2 -1
- package/dist/lib/openapi/spec/user-schema.js +2 -1
- package/dist/lib/openapi/spec/user-schema.js.map +1 -1
- package/dist/lib/openapi/spec/users-groups-base-schema.d.ts +33 -4
- package/dist/lib/openapi/spec/users-groups-base-schema.js +24 -0
- package/dist/lib/openapi/spec/users-groups-base-schema.js.map +1 -1
- package/dist/lib/openapi/spec/users-schema.d.ts +3 -2
- package/dist/lib/openapi/spec/users-schema.js +1 -1
- package/dist/lib/openapi/spec/users-schema.js.map +1 -1
- package/dist/lib/openapi/spec/users-search-schema.d.ts +3 -1
- package/dist/lib/openapi/spec/users-search-schema.js +1 -0
- package/dist/lib/openapi/spec/users-search-schema.js.map +1 -1
- package/dist/lib/openapi/spec/variants-schema.d.ts +1 -0
- package/dist/lib/openapi/spec/variants-schema.js +1 -0
- package/dist/lib/openapi/spec/variants-schema.js.map +1 -1
- package/dist/lib/openapi/util/openapi-tags.d.ts +18 -0
- package/dist/lib/openapi/util/openapi-tags.js +12 -0
- package/dist/lib/openapi/util/openapi-tags.js.map +1 -1
- package/dist/lib/routes/admin-api/api-token.d.ts +5 -0
- package/dist/lib/routes/admin-api/api-token.js +28 -0
- package/dist/lib/routes/admin-api/api-token.js.map +1 -1
- package/dist/lib/routes/admin-api/archive.js +4 -0
- package/dist/lib/routes/admin-api/archive.js.map +1 -1
- package/dist/lib/routes/admin-api/client-metrics.js +2 -1
- package/dist/lib/routes/admin-api/client-metrics.js.map +1 -1
- package/dist/lib/routes/admin-api/context.d.ts +4 -3
- package/dist/lib/routes/admin-api/context.js +3 -4
- package/dist/lib/routes/admin-api/context.js.map +1 -1
- package/dist/lib/routes/admin-api/feature-type.js +2 -2
- package/dist/lib/routes/admin-api/feature-type.js.map +1 -1
- package/dist/lib/routes/admin-api/instance-admin.js +2 -0
- package/dist/lib/routes/admin-api/instance-admin.js.map +1 -1
- package/dist/lib/routes/admin-api/maintenance.d.ts +2 -1
- package/dist/lib/routes/admin-api/maintenance.js.map +1 -1
- package/dist/lib/routes/admin-api/project/environments.js +1 -0
- package/dist/lib/routes/admin-api/project/environments.js.map +1 -1
- package/dist/lib/routes/admin-api/project/project-features.js +2 -1
- package/dist/lib/routes/admin-api/project/project-features.js.map +1 -1
- package/dist/lib/routes/admin-api/public-signup.js +2 -1
- package/dist/lib/routes/admin-api/public-signup.js.map +1 -1
- package/dist/lib/routes/admin-api/strategy.d.ts +1 -1
- package/dist/lib/routes/admin-api/strategy.js +2 -2
- package/dist/lib/routes/admin-api/strategy.js.map +1 -1
- package/dist/lib/routes/admin-api/tag-type.js +2 -2
- package/dist/lib/routes/admin-api/tag-type.js.map +1 -1
- package/dist/lib/routes/admin-api/user-admin.js +2 -1
- package/dist/lib/routes/admin-api/user-admin.js.map +1 -1
- package/dist/lib/routes/client-api/register.d.ts +1 -0
- package/dist/lib/routes/client-api/register.js +8 -0
- package/dist/lib/routes/client-api/register.js.map +1 -1
- package/dist/lib/routes/index.js +1 -0
- package/dist/lib/routes/index.js.map +1 -1
- package/dist/lib/routes/public-invite.js +2 -1
- package/dist/lib/routes/public-invite.js.map +1 -1
- package/dist/lib/segments/segment-service-interface.d.ts +2 -0
- package/dist/lib/server-impl.js +3 -1
- package/dist/lib/server-impl.js.map +1 -1
- package/dist/lib/services/access-service.d.ts +6 -3
- package/dist/lib/services/access-service.js +17 -5
- package/dist/lib/services/access-service.js.map +1 -1
- package/dist/lib/services/access-service.test.js +49 -3
- package/dist/lib/services/access-service.test.js.map +1 -1
- package/dist/lib/services/client-metrics/instance-service.js +5 -7
- package/dist/lib/services/client-metrics/instance-service.js.map +1 -1
- package/dist/lib/services/client-metrics/last-seen-service.d.ts +4 -0
- package/dist/lib/services/client-metrics/last-seen-service.js +4 -1
- package/dist/lib/services/client-metrics/last-seen-service.js.map +1 -1
- package/dist/lib/services/client-metrics/models.d.ts +2 -0
- package/dist/lib/services/client-metrics/schema.js +1 -0
- package/dist/lib/services/client-metrics/schema.js.map +1 -1
- package/dist/lib/services/feature-service-potentially-stale.test.js +0 -1
- package/dist/lib/services/feature-service-potentially-stale.test.js.map +1 -1
- package/dist/lib/services/feature-toggle-service.js +20 -30
- package/dist/lib/services/feature-toggle-service.js.map +1 -1
- package/dist/lib/services/index.js +1 -1
- package/dist/lib/services/index.js.map +1 -1
- package/dist/lib/services/instance-stats-service.d.ts +2 -0
- package/dist/lib/services/instance-stats-service.js +6 -1
- package/dist/lib/services/instance-stats-service.js.map +1 -1
- package/dist/lib/services/maintenance-service.js +1 -1
- package/dist/lib/services/maintenance-service.js.map +1 -1
- package/dist/lib/services/maintenance-service.test.js +1 -1
- package/dist/lib/services/maintenance-service.test.js.map +1 -1
- package/dist/lib/services/project-service.d.ts +2 -1
- package/dist/lib/services/project-service.js +3 -0
- package/dist/lib/services/project-service.js.map +1 -1
- package/dist/lib/services/segment-service.d.ts +8 -2
- package/dist/lib/services/segment-service.js +34 -3
- package/dist/lib/services/segment-service.js.map +1 -1
- package/dist/lib/services/user-service.js +3 -3
- package/dist/lib/services/user-service.js.map +1 -1
- package/dist/lib/services/version-service.d.ts +1 -0
- package/dist/lib/services/version-service.js +8 -1
- package/dist/lib/services/version-service.js.map +1 -1
- package/dist/lib/types/events.d.ts +2 -1
- package/dist/lib/types/events.js +4 -2
- package/dist/lib/types/events.js.map +1 -1
- package/dist/lib/types/experimental.d.ts +1 -1
- package/dist/lib/types/experimental.js +6 -5
- package/dist/lib/types/experimental.js.map +1 -1
- package/dist/lib/types/model.d.ts +2 -0
- package/dist/lib/types/model.js.map +1 -1
- package/dist/lib/types/option.d.ts +2 -0
- package/dist/lib/types/project.d.ts +7 -0
- package/dist/lib/types/stores/access-store.d.ts +9 -0
- package/dist/lib/types/stores/client-applications-store.d.ts +5 -0
- package/dist/lib/types/stores/context-field-store.d.ts +3 -3
- package/dist/lib/types/stores/feature-toggle-store.d.ts +2 -1
- package/dist/lib/types/stores/role-store.d.ts +3 -0
- package/dist/migrations/20230802092725-add-last-seen-column-to-feature-environments.d.ts +2 -0
- package/dist/migrations/20230802092725-add-last-seen-column-to-feature-environments.js +84 -0
- package/dist/migrations/20230802092725-add-last-seen-column-to-feature-environments.js.map +1 -0
- package/dist/migrations/20230802141830-add-feature-and-environment-last-seen-at-to-features-view.d.ts +2 -0
- package/dist/migrations/20230802141830-add-feature-and-environment-last-seen-at-to-features-view.js +83 -0
- package/dist/migrations/20230802141830-add-feature-and-environment-last-seen-at-to-features-view.js.map +1 -0
- package/dist/migrations/20230803061359-change-request-optional-feature.d.ts +2 -0
- package/dist/migrations/20230803061359-change-request-optional-feature.js +13 -0
- package/dist/migrations/20230803061359-change-request-optional-feature.js.map +1 -0
- package/dist/migrations/20230808104232-update-root-roles-descriptions.d.ts +2 -0
- package/dist/migrations/20230808104232-update-root-roles-descriptions.js +15 -0
- package/dist/migrations/20230808104232-update-root-roles-descriptions.js.map +1 -0
- package/dist/migrations/20230814095253-change-request-rejections.d.ts +2 -0
- package/dist/migrations/20230814095253-change-request-rejections.js +18 -0
- package/dist/migrations/20230814095253-change-request-rejections.js.map +1 -0
- package/dist/migrations/20230814115436-change-request-timzone-timestamps.d.ts +2 -0
- package/dist/migrations/20230814115436-change-request-timzone-timestamps.js +15 -0
- package/dist/migrations/20230814115436-change-request-timzone-timestamps.js.map +1 -0
- package/dist/migrations/20230815065908-change-request-approve-reject-permission.d.ts +2 -0
- package/dist/migrations/20230815065908-change-request-approve-reject-permission.js +12 -0
- package/dist/migrations/20230815065908-change-request-approve-reject-permission.js.map +1 -0
- package/dist/migrations/20230817095805-client-applications-usage-table.d.ts +2 -0
- package/dist/migrations/20230817095805-client-applications-usage-table.js +17 -0
- package/dist/migrations/20230817095805-client-applications-usage-table.js.map +1 -0
- package/dist/migrations/20230818124614-update-client-applications-usage-table.d.ts +2 -0
- package/dist/migrations/20230818124614-update-client-applications-usage-table.js +25 -0
- package/dist/migrations/20230818124614-update-client-applications-usage-table.js.map +1 -0
- package/dist/server-dev.js +3 -2
- package/dist/server-dev.js.map +1 -1
- package/dist/test/config/test-config.js +1 -0
- package/dist/test/config/test-config.js.map +1 -1
- package/dist/test/e2e/api/admin/api-token.auth.e2e.test.js +12 -84
- package/dist/test/e2e/api/admin/api-token.auth.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/api-token.e2e.test.js +10 -2
- package/dist/test/e2e/api/admin/api-token.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/metrics.e2e.test.js +30 -4
- package/dist/test/e2e/api/admin/metrics.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/project/features.e2e.test.js +14 -15
- package/dist/test/e2e/api/admin/project/features.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/client/metricsV2.e2e.test.js +19 -5
- package/dist/test/e2e/api/client/metricsV2.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/openapi/openapi.e2e.test.js +23 -0
- package/dist/test/e2e/api/openapi/openapi.e2e.test.js.map +1 -1
- package/dist/test/e2e/helpers/test-helper.js +11 -1
- package/dist/test/e2e/helpers/test-helper.js.map +1 -1
- package/dist/test/e2e/services/access-service.e2e.test.js +2 -2
- package/dist/test/e2e/services/access-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/environment-service.test.js +2 -0
- package/dist/test/e2e/services/environment-service.test.js.map +1 -1
- package/dist/test/e2e/services/feature-toggle-service-v2.e2e.test.js +1 -1
- package/dist/test/e2e/services/feature-toggle-service-v2.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/playground-service.test.js +1 -1
- package/dist/test/e2e/services/playground-service.test.js.map +1 -1
- package/dist/test/e2e/services/project-health-service.e2e.test.js +1 -1
- package/dist/test/e2e/services/project-health-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/project-service.e2e.test.js +1 -1
- package/dist/test/e2e/services/project-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/user-service.e2e.test.js +10 -0
- package/dist/test/e2e/services/user-service.e2e.test.js.map +1 -1
- package/dist/test/fixtures/access-service-mock.js +1 -0
- package/dist/test/fixtures/access-service-mock.js.map +1 -1
- package/dist/test/fixtures/fake-access-store.d.ts +3 -1
- package/dist/test/fixtures/fake-access-store.js +6 -0
- package/dist/test/fixtures/fake-access-store.js.map +1 -1
- package/dist/test/fixtures/fake-feature-toggle-store.d.ts +2 -1
- package/dist/test/fixtures/fake-feature-toggle-store.js +19 -6
- package/dist/test/fixtures/fake-feature-toggle-store.js.map +1 -1
- package/dist/test/fixtures/fake-project-store.d.ts +1 -1
- package/dist/test/fixtures/fake-role-store.d.ts +3 -0
- package/dist/test/fixtures/fake-role-store.js +6 -0
- package/dist/test/fixtures/fake-role-store.js.map +1 -1
- package/frontend/build/index.html +2 -2
- package/frontend/build/static/{AdvancedPlayground-48dddbf4.js → AdvancedPlayground-2d715a2c.js} +3 -3
- package/frontend/build/static/{CreateProject-c1b0f704.js → CreateProject-5b1090c2.js} +1 -1
- package/frontend/build/static/{Error-e6f7c2ee.js → Error-e44ea66b.js} +1 -1
- package/frontend/build/static/FeatureArchiveDialog-b47b18e8.js +10 -0
- package/frontend/build/static/{FeatureMetricsChart-81da0ce4.js → FeatureMetricsChart-36caeeb7.js} +2 -2
- package/frontend/build/static/FeatureViewLazyExport-49d56afd.js +7 -0
- package/frontend/build/static/LazyAdminExport-87c9ab51.js +35 -0
- package/frontend/build/static/LazyProjectExport-c4634b2a.js +17 -0
- package/frontend/build/static/{NetworkOverview-cd06e59f.js → NetworkOverview-c762698b.js} +64 -64
- package/frontend/build/static/{NetworkTraffic-ba933617.js → NetworkTraffic-c8d9eb9b.js} +1 -1
- package/frontend/build/static/RoleCell-d1aa8288.js +1 -0
- package/frontend/build/static/{StrategyItemContainer-88c18285.js → StrategyItemContainer-c7c352a4.js} +1 -1
- package/frontend/build/static/changeRequestProcess-f2469ef4.svg +61 -0
- package/frontend/build/static/{chartjs-adapter-date-fns.esm-799be047.js → chartjs-adapter-date-fns.esm-9c67372b.js} +6 -6
- package/frontend/build/static/{flowchart-elk-definition-170a3958-543f0844.js → flowchart-elk-definition-170a3958-5ea9fc56.js} +1 -1
- package/frontend/build/static/{index-88f1c682.js → index-1aaa8c27.js} +1 -1
- package/frontend/build/static/{index-aa638b65.js → index-670c9345.js} +1 -1
- package/frontend/build/static/index-b7003840.js +454 -0
- package/frontend/build/static/{is_dark-735e3a95.js → is_dark-b445e102.js} +1 -1
- package/frontend/build/static/{mindmap-definition-44684416-ac92f950.js → mindmap-definition-44684416-254e936e.js} +1 -1
- package/frontend/build/static/pro-enterprise-feature-badge-8ac467c3.svg +7 -0
- package/frontend/build/static/pro-enterprise-feature-badge-light-81a18f9b.svg +6 -0
- package/frontend/build/static/{timeline-definition-8e5a9bc6-6c09f608.js → timeline-definition-8e5a9bc6-24fd1725.js} +1 -1
- package/frontend/build/static/{unknownify-0b176a78.js → unknownify-ea4585e8.js} +1 -1
- package/frontend/build/static/usage-line-00d00632.svg +3 -0
- package/frontend/build/static/usage-rate-cb18f02b.svg +3 -0
- package/frontend/package.json +13 -13
- package/package.json +12 -13
- package/dist/lib/openapi/spec/upsert-context-field-schema.js +0 -35
- package/dist/lib/openapi/spec/upsert-context-field-schema.js.map +0 -1
- package/frontend/build/static/FeatureArchiveDialog-9ad60db1.js +0 -10
- package/frontend/build/static/FeatureViewLazyExport-58a3e977.js +0 -7
- package/frontend/build/static/LazyAdminExport-c98b11d7.js +0 -37
- package/frontend/build/static/LazyProjectExport-14db2e37.js +0 -16
- package/frontend/build/static/RoleCell-c534790e.js +0 -1
- package/frontend/build/static/changeRequestProcess-a532ab60.svg +0 -1
- package/frontend/build/static/index-1c4c68c3.js +0 -453
- package/frontend/build/static/pro-enterprise-feature-badge-8fab99c5.svg +0 -5
- package/frontend/build/static/pro-enterprise-feature-badge-light-0227af08.svg +0 -1
- /package/frontend/build/static/{index-770afaee.css → style-770afaee.css} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{s as w,i as B,f as L,at as O,X as U,au as x,ag as D,av as F,aw as J,j as t,ax as b,d as K,ay as $,az as z,aA as M,aB as q,h as G,aC as X}from"./index-
|
|
1
|
+
import{s as w,i as B,f as L,at as O,X as U,au as x,ag as D,av as F,aw as J,j as t,ax as b,d as K,ay as $,az as z,aA as M,aB as q,h as G,aC as X}from"./index-b7003840.js";const Y="CREATE_PROJECT_BTN",H=w(B)(({theme:e})=>({marginLeft:e.spacing(3)})),ee=()=>{const{setToastData:e,setToastApiError:i}=L(),{refetchUser:d}=O(),{uiConfig:l}=U(),a=x(),{trackEvent:u}=D(),{projectId:o,projectName:j,projectMode:p,projectDesc:m,featureLimit:C,setProjectId:P,setProjectName:h,setProjectDesc:T,getProjectPayload:s,clearErrors:r,validateProjectId:c,validateName:f,setProjectStickiness:g,setFeatureLimit:E,setProjectMode:A,projectStickiness:n,errors:y}=F(),{createProject:_,loading:N}=J();return t(b,{loading:N,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 '${l.unleashUrl}/api/admin/projects' \\
|
|
2
2
|
--header 'Authorization: INSERT_API_KEY' \\
|
|
3
3
|
--header 'Content-Type: application/json' \\
|
|
4
4
|
--data-raw '${JSON.stringify(s(),void 0,2)}'`,children:K($,{errors:y,handleSubmit:async S=>{S.preventDefault(),r();const v=f(),k=await c();if(v&&k){const I=s();try{await _(I),d(),a(`/projects/${o}`),e({title:"Project created",text:"Now you can add toggles to this project",confetti:!0,type:"success"}),n!==q&&u("project_stickiness_set")}catch(R){i(G(R))}}},projectId:o,setProjectId:P,projectName:j,projectMode:p,projectStickiness:n,featureLimit:C,setProjectStickiness:g,setFeatureLimit:E,setProjectMode:A,setProjectName:h,projectDesc:m,setProjectDesc:T,mode:"Create",clearErrors:r,validateProjectId:c,children:[t(z,{name:"project",permission:M,"data-testid":Y}),t(H,{onClick:()=>{a(X)},children:"Cancel"})]})})};export{ee as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as r,j as o}from"./index-
|
|
1
|
+
import{c as r,j as o}from"./index-b7003840.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};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{c as oe,j as s,b as ie,aD as z,aV as Z,d as C,b6 as Y,C as P,E as ce,T as $,c4 as we,s as j,fK as Ee,bc as Ae,fL as ee,au as G,X as K,fM as xe,fN as ke,fO as Re,fP as Fe,fQ as De,bs as J,fR as Pe,i as $e,fS as Oe,cg as Be,fT as Q,r as w,aw as le,f as U,fU as ue,ag as de,fV as ge,ax as he,aW as fe,bm as qe,fW as _e,h as q,dk as Le,aX as Ve,aU as pe,aE as X,aZ as me,fX as je,fY as Ie,fZ as Ue,f_ as ze,f$ as Ye,g0 as Me,a_ as ye,b7 as We,g1 as He,y as N,aI as ne,B as Je,ae as Ge,bO as te,g2 as Ke,eo as Ne,g3 as Qe,g4 as Xe,g5 as Ze,b9 as et,ba as tt,bb as at,A as be,l as Se,bR as nt,m as st,o as rt,L as ot,g6 as it,n as ct,u as lt,bM as ut,aP as dt,aN as gt,aO as ht,aJ as ft}from"./index-b7003840.js";const pt=oe(s("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"),Mt=oe(s("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"),Wt=({enabled:e,className:a})=>{const t=ie(),o=e?"Environment enabled":"Environment disabled",n={backgroundColor:e?t.palette.primary.light:t.palette.neutral.border,borderRadius:"50%",width:"28px",height:"28px",minWidth:"28px",display:"flex",alignItems:"center",justifyContent:"center",marginRight:t.spacing(1)},r={fill:t.palette.common.white,width:"16px",height:"16px"};return s("div",{style:n,className:a,children:s(pt,{style:r,titleAccess:o})})},mt=({isOpen:e,onConfirm:a,onClose:t,showBanner:o,environment:n,messageComponent:r})=>{const i=z("projectId"),{data:l}=Z(i),{changeRequestInReviewOrApproved:p,alert:f}=we(l),c=p(n||"");return C(Y,{open:e,primaryButtonText:c?"Add to existing change request":"Add suggestion to draft",secondaryButtonText:"Cancel",onClick:a,onClose:t,title:"Request changes",fullWidth:!0,children:[s(P,{condition:c,show:f}),s(P,{condition:!!o,show:C(ce,{severity:"info",sx:{mb:2},children:["Change requests feature is enabled for ",n,". 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."]})}),s($,{variant:"body2",color:"text.secondary",children:"Your suggestion:"}),r]})},yt=(e,a)=>{const t={};return a.parameters.forEach(o=>{t[o.name]=bt(e,o)}),{name:a.name,constraints:[],parameters:t}},bt=(e,a)=>a.name==="rollout"||a.name==="percentage"||a.type==="percentage"?"50":a.name==="stickiness"?"":a.name==="groupId"?e:a.type==="boolean"?"false":"",St=j("form")(({theme:e})=>({display:"grid",gap:e.spacing(2)})),se=j("hr")(({theme:e})=>({width:"100%",height:"1px",margin:e.spacing(2,0),border:"none",background:e.palette.background.elevation2})),vt=j("div")(({theme:e})=>({display:"flex",justifyContent:"end",gap:e.spacing(2),paddingBottom:e.spacing(10)})),Tt=({projectId:e,environmentId:a,permission:t,onSubmit:o,onCancel:n,loading:r,strategy:i,setStrategy:l,segments:p,setSegments:f,errors:c})=>{var x;const m=Ee(i.constraints),h=Ae(t,e,a),{strategyDefinition:u}=ee(i==null?void 0:i.name),d=G(),{uiConfig:g,error:T,loading:A}=K();if(T)throw T;if(A||!u)return null;const O=b=>u.parameters.find(S=>S.name===b),E=(b,S)=>{const k=O(b);if(b!=="groupId"){const D=Oe(k,S);return D?(c.setFormError(b,D),!1):(c.removeFormError(b),!0)}return!0},y=()=>u.parameters.map(b=>b.name).map(b=>{var S;return E(b,(S=i.parameters)==null?void 0:S[b])}).every(Boolean),_=()=>{d(`/projects/${e}/settings/default-strategy`)};return C(St,{onSubmit:async b=>{if(b.preventDefault(),y())o();else return},children:[s(xe,{title:i.title||"",setTitle:b=>{l(S=>({...S,title:b}))}}),s(P,{condition:!!g.flags.SE,show:s(ke,{segments:p,setSegments:f,projectId:e})}),s(Re,{projectId:e,environmentId:a,strategy:i,setStrategy:l}),s(se,{}),s(Fe,{strategy:i,strategyDefinition:u,setStrategy:l,validateParameter:E,errors:c,hasAccess:h}),s(P,{condition:!!((x=g==null?void 0:g.flags)!=null&&x.strategyVariant)&&i.parameters!=null&&"stickiness"in i.parameters,show:s(De,{strategy:i,setStrategy:l,environment:a,projectId:e})}),s(se,{}),C(vt,{children:[s(J,{permission:t,projectId:e,environmentId:a,variant:"contained",color:"primary",type:"submit",disabled:r||!m||c.hasFormErrors(),"data-testid":Pe,children:"Save strategy"}),s($e,{type:"button",color:"primary",onClick:n||_,disabled:r,children:"Cancel"})]})]})},ve=(e,a)=>{var i;const{project:t,refetch:o}=Be(e),n={name:"flexibleRollout",constraints:[],parameters:{rollout:"100",stickiness:t.defaultStickiness||"default",groupId:""}},r=(i=t.environments.find(l=>l.environment===a))==null?void 0:i.defaultStrategy;return{defaultStrategyFallback:n,strategy:r,refetch:o}},Ht=()=>{const e=z("projectId"),a=Q("environmentId"),{defaultStrategyFallback:t,strategy:o,refetch:n}=ve(e,a),[r,i]=w.useState(o||t),[l,p]=w.useState([]),{updateDefaultStrategy:f,loading:c}=le(),{strategyDefinition:m}=ee(r==null?void 0:r.name),{setToastData:h,setToastApiError:u}=U(),d=ue(),{uiConfig:g}=K(),{unleashUrl:T}=g,A=G(),{trackEvent:O}=de(),{segments:E,refetchSegments:y}=ge();w.useEffect(()=>{if(E&&(o!=null&&o.segments)){const S=[];for(const k of o==null?void 0:o.segments)S.push(...E.filter(D=>D.id===k));p(S)}},[JSON.stringify(E),JSON.stringify(o==null?void 0:o.segments)]);const _=g!=null&&g.flags.SE?l:[],F=Ct(r,_),x=async S=>{await f(e,a,S),O("default_strategy",{props:{action:"edit",hasTitle:!!S.title}}),await y(),h({title:"Default Strategy updated",type:"success",confetti:!0})},b=async()=>{const S=`/projects/${e}/settings/default-strategy`;try{await x(F),await n(),A(S)}catch(k){u(q(k))}};return!m||!r?null:s(he,{modal:!0,title:fe((r==null?void 0:r.name)??""),description:Et,documentationLink:At,documentationLinkLabel:xt,formatApiCode:()=>wt(e,a,F,m,T),children:s(Tt,{projectId:e,strategy:r,setStrategy:i,segments:l,setSegments:p,environmentId:a,onSubmit:b,loading:c,permission:qe,errors:d,isChangeRequest:!1})})},Ct=(e,a)=>({name:e.name,title:e.title,constraints:e.constraints??[],parameters:e.parameters??{},variants:e.variants??[],segments:a.map(t=>t.id),disabled:e.disabled??!1}),wt=(e,a,t,o,n)=>{if(!n)return"";const r={...t,parameters:_e(t.parameters??{},o)},i=`${n}/api/admin/projects/${e}/environments/${a}/default-strategy}`,l=JSON.stringify(r,void 0,2);return`curl --location --request PUT '${i}' \\
|
|
2
|
+
--header 'Authorization: INSERT_API_KEY' \\
|
|
3
|
+
--header 'Content-Type: application/json' \\
|
|
4
|
+
--data-raw '${l}'`},Et=`
|
|
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
|
+
`,At="https://docs.getunleash.io/reference/activation-strategies",xt="Default strategy documentation",Jt=()=>{const e=z("projectId"),a=z("featureId"),t=Q("environmentId"),o=Q("strategyName"),{strategy:n,defaultStrategyFallback:r}=ve(e,t),i=JSON.parse(Le().get("defaultStrategy")||"false"),{segments:l}=ge(),p=(l||[]).filter(R=>{var V;return(V=n==null?void 0:n.segments)==null?void 0:V.includes(R.id)}),[f,c]=w.useState({}),[m,h]=w.useState(i?p:[]),{strategyDefinition:u}=ee(o),d=ue(),{addStrategyToFeature:g,loading:T}=Ve(),{addChange:A}=pe(),{setToastData:O,setToastApiError:E}=U(),{uiConfig:y}=K(),{unleashUrl:_}=y,F=G(),{feature:x,refetchFeature:b}=X(e,a),S=w.useRef(x),{isChangeRequestConfigured:k}=me(e),{refetch:D}=Z(e),{trackEvent:M}=de(),{data:I,staleDataNotification:v,forceRefreshCache:B}=je({unleashGetter:X,params:[e,a],dataKey:"feature",refetchFunctionKey:"refetchFeature",options:{}},x,{afterSubmitAction:b},He);w.useEffect(()=>{S.current.name===""&&x.name&&(B(x),S.current=x)},[x.name]),w.useEffect(()=>{var R;if(i){const V=n||r;((R=V.parameters)==null?void 0:R.groupId)===""&&a?c({...V,parameters:{...V.parameters,groupId:a}}):c(V)}else u&&c(yt(a,u))},[a,JSON.stringify(u),i]);const W=async R=>{await g(e,a,t,R),O({title:"Strategy created",type:"success",confetti:!0})},H=async R=>{await A(e,t,{action:"addStrategy",feature:a,payload:R}),O({title:"Strategy added to draft",type:"success",confetti:!0}),D()},L=Ie(f,m),Ce=async()=>{M("strategyTitle",{props:{hasTitle:!!f.title,on:"create"}});try{k(t)?await H(L):await W(L),b(),F(We(e,a))}catch(R){E(q(R))}};return!I||!I.project?null:C(he,{modal:!0,title:fe(o),description:Ue,documentationLink:ze,documentationLinkLabel:Ye,formatApiCode:()=>Rt(e,a,t,L,_),children:[s(Me,{projectId:e,feature:I,strategy:f,setStrategy:c,segments:m,setSegments:h,environmentId:t,onSubmit:Ce,loading:T,permission:ye,errors:d,isChangeRequest:k(t)}),v]})},kt=(e,a,t,o,n=!1)=>{const r=new URLSearchParams({environmentId:t,strategyName:o,defaultStrategy:String(n)});return`/projects/${e}/features/${a}/strategies/create?${r}`},Rt=(e,a,t,o,n)=>{if(!n)return"";const r=`${n}/api/admin/projects/${e}/features/${a}/environments/${t}/strategies`,i=JSON.stringify(o,void 0,2);return`curl --location --request POST '${r}' \\
|
|
8
|
+
--header 'Authorization: INSERT_API_KEY' \\
|
|
9
|
+
--header 'Content-Type: application/json' \\
|
|
10
|
+
--data-raw '${i}'`},re=j("p")(({theme:e})=>({marginBottom:e.spacing(.5),fontSize:e.fontSizes.bodySize})),Gt=({open:e,environmentName:a,featureId:t,projectId:o,onClose:n})=>{const r=G(),i=kt(o,t,a,"default");return C(Y,{open:e,maxWidth:"sm",onClose:()=>n(),title:"You need to add a strategy to your toggle",primaryButtonText:"Take me directly to add strategy",permissionButton:s(J,{type:"button",permission:ye,projectId:o,environmentId:a,onClick:()=>{n(),r(i)},children:"Take me directly to add strategy"}),secondaryButtonText:"Cancel",children:[s(re,{children:"Before you can enable the toggle in the environment, you need to add an activation strategy."}),s(re,{children:"You can add the activation strategy by selecting the toggle, open the environment accordion and add the activation strategy."})]})},Ft="You can not enable the environment before it has strategies",Dt=e=>{const{setToastData:a,setToastApiError:t}=U(),{addChange:o}=pe(),{refetch:n}=Z(e),[r,i]=w.useState({isOpen:!1}),l=w.useCallback((c,m,h,u)=>{i({featureName:c,environment:m,enabled:h,shouldActivateDisabledStrategies:u,isOpen:!0})},[]),p=w.useCallback(()=>{i(c=>({...c,isOpen:!1}))},[]),f=w.useCallback(async()=>{try{await o(e,r.environment,{feature:r.featureName,action:"updateEnabled",payload:{enabled:!!r.enabled,shouldActivateDisabledStrategies:!!r.shouldActivateDisabledStrategies}}),n(),i(c=>({...c,isOpen:!1})),a({type:"success",title:"Changes added to the draft!"})}catch(c){t(q(c)),i(m=>({...m,isOpen:!1}))}},[o]);return{onChangeRequestToggle:l,onChangeRequestToggleClose:p,onChangeRequestToggleConfirm:f,changeRequestDialogDetails:r}},Pt=({isOpen:e,onAddDefaultStrategy:a,onActivateDisabledStrategies:t,onClose:o,environment:n,disabledStrategiesCount:r=0})=>{const i=z("projectId");return C(Y,{open:e,secondaryButtonText:"Cancel",permissionButton:C(N,{children:[s(J,{type:"button",permission:ne,projectId:i,environmentId:n,onClick:a,children:"Add default strategy"}),s(J,{type:"button",variant:"text",permission:ne,projectId:i,environmentId:n,onClick:t,children:"Enable all strategies"})]}),onClose:o,title:"Enable feature toggle",fullWidth:!0,children:[C($,{variant:"body1",color:"text.primary",sx:{mb:l=>l.spacing(2)},children:["The feature toggle has ",r," disabled",r===1?" strategy":" strategies","."]}),s($,{variant:"body1",color:"text.primary",children:"You can choose to enable all the disabled strategies or you can add the default strategy to enable this feature toggle."})]})},$t=({enabled:e,featureName:a,environment:t})=>C($,{"data-testid":"update-enabled-message",children:[s("strong",{children:e?"Enable":"Disable"})," feature toggle"," ",s("strong",{children:a})," in ",s("strong",{children:t})]}),Ot=j(Je)(()=>({mx:"auto",...Ge})),Kt=({projectId:e,featureId:a,environmentName:t,value:o,onToggle:n,onError:r})=>{var I;const{toggleFeatureEnvironmentOn:i,toggleFeatureEnvironmentOff:l}=te(),{setToastData:p,setToastApiError:f}=U(),{isChangeRequestConfigured:c}=me(e),{onChangeRequestToggle:m,onChangeRequestToggleClose:h,onChangeRequestToggleConfirm:u,changeRequestDialogDetails:d}=Dt(e),[g,T,A]=Ke(o),[O,E]=w.useState(!1),{feature:y}=X(e,a),_=((I=y==null?void 0:y.environments.find(v=>v.name===t))==null?void 0:I.strategies.filter(v=>v.disabled).length)??0,F=async(v=!1)=>{try{T(!g),await i(e,y.name,t,v),p({type:"success",title:`Available in ${t}`,text:`${y.name} is now available in ${t} based on its defined strategies.`}),n==null||n(e,y.name,t,!g)}catch(B){B instanceof Error&&B.message===Ft?r==null||r():f(q(B)),A()}},x=async()=>{try{T(!g),await l(e,y.name,t),p({type:"success",title:`Unavailable in ${t}`,text:`${y.name} is unavailable in ${t} and its strategies will no longer have any effect.`}),n==null||n(e,y.name,t,!g)}catch(v){f(q(v)),A()}},b=async v=>{if(c(t)){v.preventDefault(),D()?E(!0):m(y.name,t,!g,!1);return}if(g){await x();return}D()?E(!0):await F()},S=async()=>{c(t)?m(y.name,t,!g,!0):await F(!0),E(!1)},k=async()=>{c(t)?m(y.name,t,!g,!1):await F(),E(!1)},D=()=>{var B,W,H;const v=(B=y==null?void 0:y.environments)==null?void 0:B.find(L=>L.name===t);return(v==null?void 0:v.strategies)&&((W=v==null?void 0:v.strategies)==null?void 0:W.length)>0&&((H=v==null?void 0:v.strategies)==null?void 0:H.every(L=>L.disabled))},M=`${y.name}-${t}`;return C(N,{children:[s(Ot,{"data-testid":`TOGGLE-${M}`,children:s(Ne,{tooltip:g?`Disable feature in ${t}`:`Enable feature in ${t}`,checked:g,environmentId:t,projectId:e,permission:Qe,inputProps:{"aria-label":t},onClick:b})},M),s(Pt,{isOpen:O,onClose:()=>E(!1),environment:t,disabledStrategiesCount:_,onActivateDisabledStrategies:S,onAddDefaultStrategy:k}),s(mt,{isOpen:d.isOpen,onClose:h,environment:d==null?void 0:d.environment,onConfirm:u,messageComponent:s($t,{enabled:d==null?void 0:d.enabled,featureName:d==null?void 0:d.featureName,environment:d.environment})})]})},Bt=j(Xe)(({theme:e})=>({color:e.palette.warning.main,fontSize:e.fontSizes.bodySize})),Nt=()=>s(Ze,{arrow:!0,title:C(N,{children:["This environment has no variants enabled. If you check this feature's variants in this environment, you will get the"," ",s("a",{href:"https://docs.getunleash.io/reference/feature-toggle-variants#the-disabled-variant",target:"_blank",rel:"noreferrer",children:"disabled variant"}),"."]}),children:s(Bt,{})});var ae={},qt=tt;Object.defineProperty(ae,"__esModule",{value:!0});var Te=ae.default=void 0,_t=qt(et()),Lt=at,Vt=(0,_t.default)((0,Lt.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");Te=ae.default=Vt;const jt=it(),Qt=({options:e,selectedOptions:a,indeterminateOptions:t,tagType:o,existingTags:n,disabled:r=!1,onChange:i})=>{const l=s(ct,{fontSize:"small"});return s(be,{multiple:!0,id:"checkboxes-tag",sx:{marginTop:h=>h.spacing(2),width:500},disableCloseOnSelect:!0,placeholder:"Select Values",options:e,value:a,renderTags:(h,u)=>h.map((d,g)=>n.some(A=>A.value===d.title&&A.type===o.name)&&t===void 0?null:s(ot,{...u({index:g}),label:d.title})),isOptionEqualToValue:(h,u)=>u.inputValue&&u.inputValue!==""?h.title===u.inputValue:h.title===u.title,getOptionLabel:h=>h.inputValue?h.inputValue:h.title,renderOption:(h,u,{selected:d})=>{const g=(t==null?void 0:t.some(T=>T.title===u.title))??!1;return C("li",{...h,children:[s(P,{condition:!!u.inputValue,show:s(nt,{sx:{mr:T=>T.spacing(.5)}}),elseShow:s(st,{icon:l,checkedIcon:s(rt,{fontSize:"small"}),indeterminateIcon:s(Te,{fontSize:"small"}),sx:{mr:T=>T.spacing(.5)},checked:d&&!g,indeterminate:g})}),u.title]})},filterOptions:(h,u)=>{const d=jt(h,u),{inputValue:g}=u,T=h.some(A=>g===A.title);return g!==""&&!T&&d.push({inputValue:g,title:`Create new value "${g}"`}),d},ListboxProps:{style:{maxHeight:200,overflow:"auto"}},onChange:i,renderInput:h=>s(Se,{...h,label:"Select values",placeholder:"Select values"}),disabled:r})},It=j("li")({flexDirection:"column"}),Xt=({options:e,value:a,disabled:t=!1,onChange:o})=>{const n=ie();return s(be,{disablePortal:!0,disabled:t,id:"tag-type-select",sx:{marginTop:r=>r.spacing(2),width:500},options:e,disableClearable:!0,value:a,getOptionLabel:r=>r.name,renderOption:(r,i)=>C(It,{...r,style:{alignItems:"flex-start",gap:n.spacing(.5)},children:[s($,{variant:"body1",children:i.name}),s($,{variant:"caption",children:i.description})]}),renderInput:r=>s(Se,{...r,label:"Tag type",value:a}),onChange:o,ListboxProps:{style:{maxHeight:200,overflow:"auto"}}})},Zt=()=>{const{makeRequest:e,createRequest:a,errors:t,loading:o}=lt({propagateErrors:!0});return{createTag:async i=>{const p=a("api/admin/tags",{method:"POST",body:JSON.stringify(i)});try{return await e(p.caller,p.id)}catch(f){throw f}},bulkUpdateTags:async(i,l)=>{const p=`api/admin/projects/${l}/tags`,f=a(p,{method:"PUT",body:JSON.stringify(i)});try{return await e(f.caller,f.id)}catch(c){throw c}},errors:t,loading:o}},ea=(e,a={})=>{const t=async()=>{const f=gt(`api/admin/tags/${e}`);return(await fetch(f,{method:"GET"}).then(ht("Tags"))).json()},o=`api/admin/tags/${e}`,{data:n,error:r}=ut(!!e,{tags:[]},o,t,a),[i,l]=w.useState(!r&&!n),p=()=>{dt(o)};return w.useEffect(()=>{l(!r&&!n)},[n,r]),{tags:(n==null?void 0:n.tags)||[],error:r,loading:i,refetch:p}},ta=({isStale:e,isOpen:a,projectId:t,featureId:o,onClose:n})=>{const{setToastData:r,setToastApiError:i}=U(),{patchFeatureToggle:l}=te(),p=s($,{children:"Setting a toggle to stale marks it for cleanup"}),f=s($,{children:"Setting a toggle to active marks it as in active use"}),c=e?"active":"stale",m=async h=>{h.stopPropagation();try{await l(t,o,[{op:"replace",path:"/stale",value:!e}]),n()}catch(u){i(q(u))}r(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 s(Y,{open:a,secondaryButtonText:"Cancel",primaryButtonText:`Flip to ${c}`,title:`Set feature state to ${c}`,onClick:m,onClose:n,children:s(P,{condition:e,show:f,elseShow:p})})},Ut=({ids:e,projectId:a})=>{const t=o=>`/projects/${a}/features/${o}`;return e?C(ce,{severity:"warning",sx:{m:o=>o.spacing(2,0)},children:[s($,{fontWeight:"bold",variant:"body2",display:"inline",children:`${e.length} feature toggles `}),s("span",{children:"have usage from applications. If you archive these feature toggles they will not be available to Client SDKs:"}),s("ul",{children:e==null?void 0:e.map(o=>s("li",{children:s(ft,{to:t(o),children:o})},o))})]}):null},aa=({isOpen:e,onClose:a,onConfirm:t,projectId:o,featureIds:n,featuresWithUsage:r})=>{const{archiveFeatureToggle:i}=te(),{archiveFeatures:l}=le(),{setToastData:p,setToastApiError:f}=U(),{uiConfig:c}=K(),m=(n==null?void 0:n.length)>1;return s(Y,{onClick:m?async()=>{try{await l(o,n),p({text:"Selected feature toggles have been archived",type:"success",title:"Feature toggles archived"}),t(),a()}catch(d){f(q(d)),a()}}:async()=>{try{await i(o,n[0]),p({text:"Your feature toggle has been archived",type:"success",title:"Feature archived"}),t(),a()}catch(d){f(q(d)),a()}},open:e,onClose:a,primaryButtonText:m?"Archive toggles":"Archive toggle",secondaryButtonText:"Cancel",title:m?"Archive feature toggles":"Archive feature toggle",children:s(P,{condition:m,show:C(N,{children:[C("p",{children:["Are you sure you want to archive"," ",s("strong",{children:n==null?void 0:n.length})," feature toggles?"]}),s(P,{condition:!!(c.flags.lastSeenByEnvironment&&r&&(r==null?void 0:r.length)>0),show:s(Ut,{ids:r,projectId:o})}),s(P,{condition:(n==null?void 0:n.length)<=5,show:s("ul",{children:n==null?void 0:n.map(d=>s("li",{children:d},d))})})]}),elseShow:s("p",{children:"Are you sure you want to archive these feature toggles?"})})})};export{mt as C,Wt as E,Kt as F,Xt as T,$t as U,Nt as V,Mt as W,Gt as a,ea as b,Qt as c,Jt as d,aa as e,kt as f,ta as g,Dt as h,Ht as i,Zt as u};
|
package/frontend/build/static/{FeatureMetricsChart-81da0ce4.js → FeatureMetricsChart-36caeeb7.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`)},title:t=>`Time: ${c(t[0].parsed.x,a.locale)}`}},legend:{position:"top",align:"end",labels:{boxWidth:10,boxHeight:10,usePointStyle:!0}},title:{text:T(n),position:"top",align:"start",display:!0,font:{size:16,weight:"400"},color:e.palette.text.primary}},scales:{y:{type:"linear",title:{display:!0,text:"Number of requests",color:e.palette.text.secondary},suggestedMin:0,ticks:{precision:0,color:e.palette.text.secondary},grid:{color:e.palette.divider,borderColor:e.palette.divider}},x:{type:"time",time:{unit:"hour"},grid:{display:!1},ticks:{callback:(t,r,o)=>c(o[r].value,a.locale),color:e.palette.text.secondary}}}}),T=e=>e===1?"Requests in the last hour":`Requests in the last ${e} hours`;b.font={...b.font,family:"Sen",size:13,weight:"400"};const _=({metrics:e,hoursBack:s,statsSectionId:n})=>{const a=
|
|
1
|
+
import{gc as c,b as g,bF as m,r as d,j as u}from"./index-b7003840.js";import{d as b,L as x,C as f,a as C,b as v,P as S,c as h,T as q,p as k,e as M,f as L}from"./chartjs-adapter-date-fns.esm-9c67372b.js";import"./index-1aaa8c27.js";import"./index-670c9345.js";const $=(e,s,n)=>{const a={label:"Total requests",borderColor:e.palette.primary.main,backgroundColor:e.palette.primary.main,data:p(s,n,o=>o.yes+o.no),elements:{point:{radius:6,pointStyle:"circle"},line:{borderDash:[8,4]}}},t={label:"Exposed",borderColor:e.palette.success.main,backgroundColor:e.palette.success.main,data:p(s,n,o=>o.yes),elements:{point:{radius:6,pointStyle:"triangle"}}},r={label:"Not exposed",borderColor:e.palette.error.main,backgroundColor:e.palette.error.main,data:p(s,n,o=>o.no),elements:{point:{radius:6,pointStyle:"triangle",pointRotation:180}}};return{datasets:[t,r,a]}},p=(e,s,n)=>e.map(a=>({x:a.timestamp,y:n(a),variants:a.variants})),E=(e,s)=>{if(s===0)return"";const[n,a]=e,t=Math.floor(Number(a)/s*100);return`${a} (${t}%) - ${n}`},P=(e,s,n,a)=>({locale:a.locale,responsive:!0,maintainAspectRatio:!1,interaction:{mode:"index",intersect:!1},color:e.palette.text.secondary,plugins:{tooltip:{backgroundColor:e.palette.background.paper,bodyColor:e.palette.text.primary,titleColor:e.palette.text.secondary,borderColor:e.palette.primary.main,borderWidth:1,padding:10,boxPadding:5,usePointStyle:!0,itemSort:(t,r)=>{const o=["Total requests","Exposed","Not exposed"],l=o.indexOf(t.dataset.label),i=o.indexOf(r.dataset.label);return l-i},callbacks:{label:t=>`${t.formattedValue} - ${t.dataset.label}`,afterLabel:t=>{const r=t.dataset.data[t.dataIndex];if(t.dataset.label!=="Exposed"||r.variants===void 0)return"";const{disabled:o,...l}=r.variants;return Object.entries(l).map(i=>E(i,r.y)).join(`
|
|
2
|
+
`)},title:t=>`Time: ${c(t[0].parsed.x,a.locale)}`}},legend:{position:"top",align:"end",labels:{boxWidth:10,boxHeight:10,usePointStyle:!0}},title:{text:T(n),position:"top",align:"start",display:!0,font:{size:16,weight:"400"},color:e.palette.text.primary}},scales:{y:{type:"linear",title:{display:!0,text:"Number of requests",color:e.palette.text.secondary},suggestedMin:0,ticks:{precision:0,color:e.palette.text.secondary},grid:{color:e.palette.divider,borderColor:e.palette.divider}},x:{type:"time",time:{unit:"hour"},grid:{display:!1},ticks:{callback:(t,r,o)=>c(o[r].value,a.locale),color:e.palette.text.secondary}}}}),T=e=>e===1?"Requests in the last hour":`Requests in the last ${e} hours`;b.font={...b.font,family:"Sen",size:13,weight:"400"};const _=({metrics:e,hoursBack:s,statsSectionId:n})=>{const a=g(),{locationSettings:t}=m(),r=d.useMemo(()=>[...e].sort((i,y)=>i.timestamp.localeCompare(y.timestamp)),[e]),o=d.useMemo(()=>P(a,r,s,t),[a,r,s,t]),l=d.useMemo(()=>$(a,r,t),[a,r,t]);return u("div",{style:{height:400},children:u(x,{options:o,data:l,"aria-label":"A feature metrics line chart, with three lines: all requests, positive requests, and negative requests.","aria-describedby":n})})};f.register(C,v,S,h,q,k,M,L);export{_ as FeatureMetricsChart,_ as default};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{c as Vt,j as t,s as d,aD as I,aE as V,aF as pn,d as r,aG as gn,C as A,aH as X,aI as he,aJ as G,aK as Se,aL as hn,aM as st,r as h,aN as we,aO as Me,aP as rt,aQ as fn,aR as mn,aS as yn,aT as Sn,f as U,aU as xe,aV as ce,h as j,T as N,aW as Ee,aX as Ae,aY as bn,aZ as ae,a_ as fe,a$ as J,t as it,b0 as Cn,b1 as vn,b2 as Re,M as me,b3 as Pe,b4 as jt,b5 as be,b6 as re,au as le,E as de,b7 as zt,b8 as Tn,b9 as wn,ba as xn,bb as En,bc as tt,bd as An,be as Rn,y as B,B as Y,bf as In,bg as Fn,bh as Dn,bi as kn,bj as $n,bk as Pn,bl as Bn,bm as Mn,bn as On,G as _n,b as Wt,aa as Oe,x as Ce,bo as ct,i as ye,N as lt,bp as Nt,ag as _e,V as Ln,bq as dt,br as ge,bs as ie,bt as Vn,$ as jn,bu as zn,bv as ne,bw as Wn,bx as Nn,R as qn,by as Hn,bz as Un,bA as Gn,bB as Yn,bC as qt,bD as Kn,bE as Jn,bF as Ht,X as Le,bG as Qn,bH as Ut,bI as Xn,bJ as Zn,bK as ea,bL as ut,bM as ta,bN as na,bO as Ve,bP as aa,L as Gt,D as ve,bQ as oa,bR as sa,bS as ra,bT as Yt,bU as Kt,bV as se,bW as nt,bX as ia,bY as Jt,bZ as ca,b_ as la,g as da,b$ as ua,c0 as We,c1 as ht,as as pa,ax as ga,c2 as pe,c3 as ft,c4 as ha,c5 as fa,m as ma,aq as pt,ar as ya,al as mt,c6 as Sa,c7 as ba,c8 as Ca,c9 as va,ca as yt,a9 as Qt,cb as Ta,a1 as Ne,ac as wa,a3 as xa,a4 as Ea,a5 as Aa,a6 as Ra,a7 as Ia,a8 as Fa,cc as Da,cd as ka,ce as St,cf as $a,cg as Xt,ch as Pa,q as Ba,ci as bt,cj as Ma,ck as Oa,cl as _a,cm as La,cn as Va,co as ja,ai as za,cp as Wa,cq as Na,cr as qa,cs as Ha,ct as Ua,cu as Ga}from"./index-b7003840.js";import{C as Zt,f as en,E as Ya,F as Ka,V as Ja,a as Qa,u as Xa,b as Za,T as eo,c as to,d as no,W as ao,e as oo,g as so}from"./FeatureArchiveDialog-b47b18e8.js";import{S as ro}from"./StrategyItemContainer-c7c352a4.js";const io=Vt(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"),co=Vt(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"),lo=d("div")(({theme:e})=>({borderRadius:e.spacing(1.5),backgroundColor:e.palette.background.paper,padding:e.spacing(4)})),uo=()=>{const e=I("projectId"),n=I("featureId"),{feature:a}=V(e,n);return a.name?t(lo,{children:t(pn,{title:"Event log",feature:n,displayInline:!0})}):null},po=d("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"}})),go=d("div")({padding:"1.5rem 1.5rem 0 1.5rem"}),ho=d("div")({display:"flex",alignItems:"center"}),fo=d("h2")(({theme:e})=>({fontSize:e.fontSizes.bodySize,fontWeight:"normal",margin:0})),mo=d("div")(({theme:e})=>({margin:e.spacing(2,0),display:"flex",flexDirection:"column"})),Ct=d("span")(({theme:e})=>({margin:e.spacing(1,0),fontSize:e.fontSizes.bodySize})),vt=d("div")(({theme:e})=>({display:"flex",alignItems:"center",color:e.palette.primary.contrastText})),yo=()=>{const e=I("projectId"),n=I("featureId"),{feature:a}=V(e,n),{project:o,description:s,type:i}=a,c=hn(i);return t(po,{children:r(go,{children:[r(ho,{"data-loading":!0,children:[t(c,{sx:l=>({marginRight:l.spacing(2),height:"40px",width:"40px",fill:l.palette.primary.contrastText})})," ",r(fo,{children:[gn(i||"")," toggle"]})]}),r(mo,{children:[r(Ct,{"data-loading":!0,children:["Project: ",o]}),t(A,{condition:!!s,show:r(Ct,{"data-loading":!0,children:[t("div",{children:"Description:"}),r(vt,{children:[t("p",{children:s}),t(X,{projectId:e,permission:he,component:G,to:`/projects/${e}/features/${n}/settings`,tooltipProps:{title:"Edit description"},children:t(Se,{sx:l=>({color:l.palette.primary.contrastText})})})]})]}),elseShow:t("span",{"data-loading":!0,children:r(vt,{children:["No description."," ",t(X,{projectId:e,permission:he,component:G,to:`/projects/${e}/features/${n}/settings`,tooltipProps:{title:"Edit description"},children:t(Se,{sx:l=>({color:l.palette.primary.contrastText})})})]})})})]})]})})},Tt={lastHourUsage:[],seenApplications:[]},So=(e,n,a={})=>{const o=async()=>{const g=we(`api/admin/client-metrics/features/${n}`),f=await fetch(g,{method:"GET"}).then(Me("feature metrics"));return f.ok?f.json():Tt},s=`${e}_${n}_metrics`,{data:i,error:c}=st(s,o,{...a}),[l,u]=h.useState(!c&&!i),p=()=>{rt(s)};return h.useEffect(()=>{u(!c&&!i)},[i,c]),{metrics:i||Tt,error:c,loading:l,refetch:p,FEATURE_METRICS_CACHE_KEY:s}},bo=e=>({yes:0,no:0,environment:e,timestamp:""}),Co=(e,n)=>e.map(a=>n.lastHourUsage.find(s=>s.environment===a.name)||bo(a.name)),vo=e=>(n,a,o)=>(o.revalidateOnFocus=!1,o.revalidateIfStale=!1,o.revalidateOnReconnect=!1,e(n,a,o)),To=fn(st,vo),tn=(e,n)=>{const{refetchFeature:a}=V(e,n),o=mn(e,n),{data:s,error:i,mutate:c}=To(["useFeatureImmutable",o],()=>yn(o)),l=h.useCallback(async()=>{await c(),await a()},[c,a]);return{feature:(s==null?void 0:s.body)||Sn,refetchFeature:l,loading:!i&&!s,status:s==null?void 0:s.status,error:i}},nn=(e,n,a)=>{const{setToastData:o,setToastApiError:s}=U(),{addChange:i}=xe(),{refetch:c}=ce(e),[l,u]=h.useState({isOpen:!1}),p=h.useCallback((S,E,y)=>{u({featureName:n,environment:S,fromEnvironment:y,strategy:E,isOpen:!0})},[]),g=h.useCallback((S,E,y)=>{u({featureName:n,environment:S,fromEnvironment:y,strategies:E,isOpen:!0})},[]),f=h.useCallback(()=>{u({isOpen:!1})},[]),m=h.useCallback(async()=>{try{await i(e,l.environment,{feature:l.featureName,action:a,payload:l.strategy}),c(),u({isOpen:!1}),o({type:"success",title:"Changes added to the draft!"})}catch(S){s(j(S)),u({isOpen:!1})}},[i]),b=h.useCallback(async()=>{try{await Promise.all(l.strategies.map(S=>i(e,l.environment,{feature:l.featureName,action:a,payload:S}))),c(),u({isOpen:!1}),o({type:"success",title:"Changes added to the draft!"})}catch(S){s(j(S)),u({isOpen:!1})}},[i]);return{onChangeRequestAddStrategy:p,onChangeRequestAddStrategies:g,onChangeRequestAddStrategyClose:f,onChangeRequestAddStrategyConfirm:m,onChangeRequestAddStrategiesConfirm:b,changeRequestDialogDetails:l}},wo=({payload:e,fromEnvironment:n,environment:a})=>r(N,{children:[r("strong",{children:["Copy ",Ee((e==null?void 0:e.name)||"")," strategy"," "]})," ","from ",n," to ",a]}),xo=({environmentId:e,environments:n,strategy:a})=>{const o=I("projectId"),s=I("featureId"),[i,c]=h.useState(null),l=!!i,{addStrategyToFeature:u}=Ae(),{setToastData:p,setToastApiError:g}=U(),{refetchFeature:f}=V(o,s),{refetchFeature:m}=tn(o,s),b=()=>{c(null)},S=bn(o),{isChangeRequestConfigured:E}=ae(o),{changeRequestDialogDetails:y,onChangeRequestAddStrategyClose:C,onChangeRequestAddStrategy:$,onChangeRequestAddStrategyConfirm:_}=nn(o,s,"addStrategy"),M=async T=>{const{id:F,...k}={...a,targetEnvironment:T};if(E(T)){await $(T,{id:F,...k},e);return}try{await u(o,s,T,a),f(),m(),p({title:"Strategy created",text:`Successfully copied a strategy to ${T}`,type:"success"})}catch(W){g(j(W))}b()},O=n.some(T=>S(fe,T));return r("div",{children:[t(Zt,{isOpen:y.isOpen,onClose:C,environment:y==null?void 0:y.environment,onConfirm:_,messageComponent:t(wo,{fromEnvironment:y.fromEnvironment,payload:y.strategy})}),t(J,{title:`Copy to another environment${O?"":" (Access denied)"}`,children:t("div",{children:t(it,{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:T=>{c(T.currentTarget)},"data-testid":Cn,disabled:!O,children:t(vn,{})})})}),t(Re,{id:"basic-menu",anchorEl:i,open:l,onClose:b,MenuListProps:{"aria-labelledby":`copy-strategy-icon-menu-${a.id}`},children:n.map(T=>{const F=S(fe,T);return t(J,{title:F?"":"You don't have access to add a strategy to this environment",children:t("div",{children:r(me,{onClick:()=>M(T),disabled:!F,children:[t(A,{condition:!F,show:t(Pe,{children:t(jt,{fontSize:"small"})})}),r(be,{children:["Copy to ",T]})]})})},T)})})]})},an=()=>t(de,{severity:"error",children:"Removing the strategy will change which users receive access to the feature."}),Eo=({onRemove:e,onClose:n,isOpen:a})=>t(re,{title:"Are you sure you want to delete this strategy?",open:a,primaryButtonText:"Remove strategy",secondaryButtonText:"Cancel",onClick:e,onClose:n,children:t(an,{})}),Ao=d("div")(({theme:e})=>({marginTop:e.spacing(3),marginBottom:e.spacing(1)})),Ro=({onRemove:e,onClose:n,isOpen:a})=>r(re,{title:"Suggest changes",open:a,primaryButtonText:"Add suggestion to draft",secondaryButtonText:"Cancel",onClick:e,onClose:n,children:[t(an,{}),t(Ao,{children:t(N,{variant:"body2",color:"text.secondary",children:"Your suggestion:"})}),t(N,{fontWeight:"bold",children:"Remove strategy"})]}),Io=({projectId:e,featureId:n,environmentId:a,strategyId:o})=>{const{deleteStrategyFromFeature:s}=Ae(),{setToastData:i,setToastApiError:c}=U(),l=le(),{refetchFeature:u}=V(e,n);return async g=>{try{g.preventDefault(),await s(e,n,a,o),i({title:"Strategy deleted",type:"success"}),u(),l(zt(e,n))}catch(f){c(j(f))}}},Fo=({projectId:e,featureId:n,environmentId:a,strategyId:o})=>{const{addChange:s}=xe(),{refetch:i}=ce(e),{setToastData:c,setToastApiError:l}=U();return async p=>{try{p.preventDefault(),await s(e,a,{action:"deleteStrategy",feature:n,payload:{id:o}}),c({title:"Changes added to the draft!",type:"success"}),await i()}catch(g){l(j(g))}}},Do=({projectId:e,featureId:n,environmentId:a,strategyId:o,text:s,isOpen:i,onClose:c})=>{const{isChangeRequestConfigured:l}=ae(e),u=Io({featureId:n,projectId:e,strategyId:o,environmentId:a}),p=Fo({featureId:n,projectId:e,strategyId:o,environmentId:a});return l(a)?t(Ro,{isOpen:i,onClose:()=>c(),onRemove:async g=>{await p(g),c()}}):t(Eo,{isOpen:i,onClose:()=>c(),onRemove:u})},ko=({projectId:e,environmentId:n,featureId:a,strategy:o})=>{const{refetchFeature:s}=V(e,a),{setStrategyDisabledState:i}=Ae(),{setToastData:c,setToastApiError:l}=U(),u=p=>async()=>{try{await i(e,a,n,o.id,!p),c({title:`Strategy ${p?"enabled":"disabled"}`,type:"success"}),s()}catch(g){l(j(g))}};return{onDisable:u(!1),onEnable:u(!0)}},$o=({projectId:e,environmentId:n,featureId:a,strategy:o})=>{const{addChange:s}=xe(),{refetch:i}=ce(e),{setToastData:c,setToastApiError:l}=U(),u=p=>async()=>{try{await s(e,n,{action:"updateStrategy",feature:a,payload:{...o,disabled:!p}}),c({title:"Changes added to the draft!",type:"success"}),await i()}catch(g){l(j(g))}};return{onSuggestDisable:u(!1),onSuggestEnable:u(!0)}},Po=({isOpen:e,onClose:n,...a})=>{var b;const{projectId:o,environmentId:s}=a,{isChangeRequestConfigured:i}=ae(o),c=i(s),{onSuggestEnable:l,onSuggestDisable:u}=$o({...a}),{onEnable:p,onDisable:g}=ko({...a}),f=!!((b=a.strategy)!=null&&b.disabled);return t(re,{title:c?`Add ${f?"enable":"disable"} strategy to change request?`:`Are you sure you want to ${f?"enable":"disable"} this strategy?`,open:e,primaryButtonText:c?"Add to draft":`${f?"Enable":"Disable"} strategy`,secondaryButtonText:"Cancel",onClick:S=>{S.preventDefault(),c?f?l():u():f?p():g(),n()},onClose:()=>n(),children:t(A,{condition:c,show:t(Tn,{environment:s}),elseShow:r(de,{severity:"error",children:[f?"Enabling":"Disabling"," the strategy will change which users receive access to the feature."]})})})};var gt={},Bo=xn;Object.defineProperty(gt,"__esModule",{value:!0});var on=gt.default=void 0,Mo=Bo(wn()),Oo=En,_o=(0,Mo.default)((0,Oo.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");on=gt.default=_o;const Lo=({projectId:e,strategy:n,featureId:a,environmentId:o})=>{const[s,i]=h.useState(null),[c,l]=h.useState(!1),[u,p]=h.useState(!1),g=!!s,f=E=>{i(E.currentTarget)},m=E=>{i(null),E.stopPropagation()},b=tt(An,e,o),S=tt(Rn,e,o);return r(B,{children:[t(Y,{sx:{display:"flex",alignItems:"center",textAlign:"center"},children:t(J,{title:"More actions",children:t(it,{onClick:f,size:"small","aria-controls":g?"actions-menu":void 0,"aria-haspopup":"true","aria-expanded":g?"true":void 0,"data-testid":In,children:t(Fn,{sx:{width:32,height:32}})})})}),r(Re,{anchorEl:s,id:"actions-menu",open:g,onClose:m,onClick:m,transformOrigin:{horizontal:"right",vertical:"top"},anchorOrigin:{horizontal:"right",vertical:"bottom"},"data-testid":Dn,children:[t(J,{title:n.disabled?"Enable strategy":"Disable strategy",arrow:!0,placement:"left",children:r(me,{disabled:!b,onClick:()=>l(!0),children:[t(Pe,{children:n.disabled?t(kn,{}):t($n,{})}),t(be,{children:n.disabled?"Enable":"Disable"})]})}),t(J,{title:"Remove strategy",arrow:!0,placement:"left",children:r(me,{disabled:!S,onClick:()=>p(!0),"data-testid":Pn,children:[t(Pe,{children:t(on,{})}),t(be,{children:"Remove"})]})})]}),t(Po,{isOpen:c,onClose:()=>l(!1),projectId:e,featureId:a,environmentId:o,strategy:n}),t(Do,{isOpen:u,onClose:()=>p(!1),projectId:e,featureId:a,environmentId:o,strategyId:n.id})]})},Vo=({environmentId:e,strategy:n,onDragStart:a,onDragEnd:o,otherEnvironments:s,orderNumber:i,headerChildren:c})=>{const l=I("projectId"),u=I("featureId"),p=Bn(l,u,e,n.id);return t(ro,{strategy:n,onDragStart:a,onDragEnd:o,orderNumber:i,actions:r(B,{children:[c,t(A,{condition:!!(s&&(s==null?void 0:s.length)>0),show:()=>t(xo,{environmentId:e,environments:s,strategy:n})}),t(X,{permission:Mn,environmentId:e,projectId:l,component:G,to:p,tooltipProps:{title:"Edit strategy"},"data-testid":`STRATEGY_EDIT-${n.name}`,children:t(Se,{})}),t(Lo,{projectId:l,featureId:u,environmentId:e,strategy:n})]}),children:t(On,{strategy:n})})},jo=(e,n,a,o)=>{const{data:s}=ce(e),i=s==null?void 0:s.find(u=>u.environment===a),c=i==null?void 0:i.features.find(u=>u.name===n);return c==null?void 0:c.changes.find(u=>u.action==="updateStrategy"||u.action==="deleteStrategy"?u.payload.id===o:!1)},zo=({strategy:e,index:n,environmentName:a,otherEnvironments:o,isDragging:s,onDragStartRef:i,onDragOver:c,onDragEnd:l})=>{const u=I("projectId"),p=I("featureId"),g=h.useRef(null),f=jo(u,p,a,e.id);return r(Y,{ref:g,onDragOver:c(g,n),sx:{opacity:s?"0.5":"1"},children:[t(A,{condition:n>0,show:t(_n,{text:"OR"})}),t(Vo,{strategy:e,environmentId:a,otherEnvironments:o,onDragStart:i(g,n),onDragEnd:l,orderNumber:n+1,headerChildren:t(Wo,{change:f})})]},e.id)},Wo=({change:e})=>{const n=Wt();return Oe(n.breakpoints.down("sm"))?null:r(Y,{sx:{mr:1.5},children:[t(A,{condition:(e==null?void 0:e.action)==="updateStrategy",show:t(Ce,{color:"warning",children:"Modified in draft"})}),t(A,{condition:(e==null?void 0:e.action)==="deleteStrategy",show:t(Ce,{color:"error",children:"Deleted in draft"})})]})},No=({environmentId:e,environments:n,onClick:a})=>{const o=I("projectId"),[s,i]=h.useState(null),c=!!s,{hasAccess:l}=h.useContext(ct),u=n.some(p=>l(fe,o,p));return r("div",{children:[t(J,{title:u?"":"(Access denied)",children:t("div",{children:t(ye,{id:`copy-all-strategies-${e}`,"aria-controls":c?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":c?"true":void 0,onClick:p=>{i(p.currentTarget)},disabled:!u,variant:"outlined",children:"Copy from another environment"})})}),t(Re,{id:"basic-menu",anchorEl:s,open:c,onClose:()=>{i(null)},MenuListProps:{"aria-labelledby":`copy-all-strategies-${e}`},children:n.map(p=>{const g=l(fe,o,p);return t(J,{title:g?"":"You don't have access to add a strategy to this environment",children:t("div",{children:r(me,{onClick:()=>a(p),disabled:!g,children:[t(A,{condition:!g,show:t(Pe,{children:t(jt,{fontSize:"small"})})}),r(be,{children:["Copy from ",p]})]})})},p)})})]})},qo=d("div")(({theme:e})=>({"&>*:nth-child(n)":{margin:e.spacing(1,0)}})),Ho=({payload:e,fromEnvironment:n,environment:a})=>r(qo,{children:[t(N,{children:t("strong",{children:"Copy: "})}),e==null?void 0:e.map(o=>r(N,{children:[r("strong",{children:[Ee((o==null?void 0:o.name)||"")," strategy"," "]})," "]})),r(N,{children:["from ",n," to ",a]})]}),Uo=d("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}})),Go=d("div")(({theme:e})=>({fontSize:e.fontSizes.smallBody})),Yo=d(lt)(({theme:e})=>({fontWeight:e.fontWeight.bold})),Ko=d(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}})),qe=({projectId:e,featureId:n,environmentId:a,strategy:o,defaultStrategy:s})=>{const i=Nt(o.name),c=Ee(o.name),{trackEvent:l}=_e(),u=en(e,n,a,o.name,s);return r(Ko,{to:u,onClick:()=>{l("strategy-add",{props:{buttonTitle:o.displayName||c}})},children:[t(Uo,{children:t(i,{})}),r("div",{children:[t(Yo,{text:o.displayName||c,maxWidth:"200",maxLength:25}),t(Go,{children:o.description})]})]})},He=d(N)(({theme:e})=>({fontSize:e.fontSizes.smallBody,padding:e.spacing(1,2)})),Jo=({projectId:e,featureId:n,environmentId:a})=>{const{strategies:o}=Ln(),s=o.filter(l=>!l.deprecated&&!l.editable),i=o.filter(l=>!l.deprecated&&l.editable),c={name:"flexibleRollout",displayName:"Default strategy",description:"This is the default strategy defined for this environment in the project"};return r(dt,{dense:!0,children:[r(B,{children:[r(He,{color:"textSecondary",children:[a," environment default strategy"]}),t(ge,{children:t(qe,{projectId:e,featureId:n,environmentId:a,strategy:c,defaultStrategy:!0})},c.name)]}),t(He,{color:"textSecondary",children:"Predefined strategy types"}),s.map(l=>t(ge,{children:t(qe,{projectId:e,featureId:n,environmentId:a,strategy:l})},l.name)),t(A,{condition:i.length>0,show:r(B,{children:[t(He,{color:"textSecondary",children:"Custom strategies"}),i.map(l=>t(ge,{children:t(qe,{projectId:e,featureId:n,environmentId:a,strategy:l})},l.name))]})})]})},Qo=d("div")({flexShrink:0}),Xo=d(ie)(({theme:e})=>({minWidth:0,width:e.spacing(4.5),alignItems:"center",justifyContent:"center",align:"center",flexDirection:"column",marginLeft:e.spacing(1)})),at=({label:e,projectId:n,featureId:a,environmentId:o,variant:s,size:i,matchWidth:c})=>{const[l,u]=h.useState(),p=le(),{trackEvent:g}=_e(),f=!!l,m=f?"FeatureStrategyMenuPopover":void 0,b=()=>{u(void 0)},S=C=>{g("strategy-add",{props:{buttonTitle:e}}),p(y)},E=C=>{u(C.currentTarget)},y=en(n,a,o,"flexibleRollout",!0);return r(Qo,{onClick:C=>C.stopPropagation(),children:[t(ie,{permission:fe,projectId:n,environmentId:o,onClick:S,"aria-labelledby":m,variant:s,size:i,sx:{minWidth:c?"282px":"auto"},children:e}),t(Xo,{permission:fe,projectId:n,environmentId:o,onClick:E,"aria-labelledby":m,variant:"outlined",size:i,hideLockIcon:!0,tooltipProps:{title:"More strategies"},children:t(Vn,{sx:C=>({margin:C.spacing(.25,0)})})}),t(jn,{id:m,open:f,anchorEl:l,onClose:b,onClick:b,PaperProps:{sx:C=>({paddingBottom:C.spacing(1)})},children:t(Jo,{projectId:n,featureId:a,environmentId:o})})]})},Zo=d("div")(({theme:e})=>({display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",paddingTop:e.spacing(2)})),es=d("div")(({theme:e})=>({fontSize:e.fontSizes.bodySize,textAlign:"center",color:e.palette.text.primary,marginBottom:e.spacing(1)})),ts=d("p")(({theme:e})=>({color:e.palette.text.secondary,fontSize:e.fontSizes.smallBody,textAlign:"center",marginBottom:e.spacing(3),a:{color:e.palette.links}})),ns=({projectId:e,featureId:n,environmentId:a})=>{const{addStrategyToFeature:o}=Ae(),{setToastData:s,setToastApiError:i}=U(),{refetchFeature:c}=V(e,n),{refetchFeature:l}=tn(e,n),{feature:u}=V(e,n),p=u==null?void 0:u.environments.filter($=>$.name!==a&&$.strategies&&$.strategies.length>0),{isChangeRequestConfigured:g}=ae(e),{changeRequestDialogDetails:f,onChangeRequestAddStrategies:m,onChangeRequestAddStrategiesConfirm:b,onChangeRequestAddStrategyClose:S}=nn(e,n,"addStrategy"),E=($=!1)=>{c(),l(),s({title:$?"Strategies created":"Strategy created",text:$?"Successfully copied from another environment":"Successfully created strategy",type:"success"})},y=async $=>{var M;const _=((M=p==null?void 0:p.find(O=>O.name===$))==null?void 0:M.strategies)||[];if(g(a)){await m(a,_,$);return}try{await Promise.all(_.map(O=>{const{id:T,...F}={...O,environment:a};return o(e,n,a,F)})),E(!0)}catch(O){i(j(O))}},C=p&&p.length>0;return r(B,{children:[t(Zt,{isOpen:f.isOpen,onClose:S,environment:f==null?void 0:f.environment,onConfirm:b,messageComponent:t(Ho,{fromEnvironment:f.fromEnvironment,payload:f.strategies})}),r(Zo,{children:[t(es,{children:"You have not defined any strategies yet."}),r(ts,{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."]}),r(Y,{sx:{w:"100%",display:"flex",flexWrap:"wrap",gap:2,alignItems:"center",justifyContent:"center"},children:[t(at,{label:"Add your first strategy",projectId:e,featureId:n,environmentId:a,matchWidth:C}),t(A,{condition:C,show:t(No,{environmentId:a,environments:p.map($=>$.name),onClick:y})})]})]})]})},as=d("div")(({theme:e})=>({width:"100%",position:"relative",paddingBottom:e.spacing(2)})),os=d("div")(({theme:e})=>({[e.breakpoints.down(400)]:{padding:e.spacing(1)}})),ss=({featureEnvironment:e,isDisabled:n,otherEnvironments:a})=>{const o=I("projectId"),s=I("featureId"),{setStrategiesSortOrder:i}=Ae(),{addChange:c}=xe(),{isChangeRequestConfigured:l}=ae(o),{refetch:u}=ce(o),{setToastData:p,setToastApiError:g}=U(),{refetchFeature:f}=V(o,s),[m,b]=h.useState((e==null?void 0:e.strategies)||[]),[S,E]=h.useState(null);if(h.useEffect(()=>{b((e==null?void 0:e.strategies)||[])},[e==null?void 0:e.strategies]),!e)return null;const y=async T=>{try{await i(o,s,e.name,T),f(),p({title:"Order of strategies updated",type:"success"})}catch(F){g(j(F))}},C=async T=>{await c(o,e.name,{action:"reorderStrategy",feature:s,payload:T}),p({title:"Strategy execution order added to draft",type:"success",confetti:!0}),u()},$=async T=>{try{l(e.name)?await C(T):await y(T)}catch(F){g(j(F))}},_=(T,F)=>k=>{var W;E({id:m[F].id,index:F,height:((W=T.current)==null?void 0:W.offsetHeight)||0}),T!=null&&T.current&&(k.dataTransfer.effectAllowed="move",k.dataTransfer.setData("text/html",T.current.outerHTML),k.dataTransfer.setDragImage(T.current,20,20))},M=T=>(F,k)=>W=>{if(S===null||F.current===null||S.index===k||T===S.id)return;const{top:oe,bottom:Z}=F.current.getBoundingClientRect(),ee=W.clientY-oe<S.height,te=Z-W.clientY<S.height,Q=S.index>k;if(ee&&Q||te&&!Q){const w=[...m],v=w.splice(S.index,1)[0];w.splice(k,0,v),b(w),E({...S,index:k})}},O=()=>{E(null),$(m.map((T,F)=>({id:T.id,sortOrder:F})))};return t(as,{children:r(os,{children:[t(A,{condition:m.length>0&&n,show:()=>t(de,{severity:"warning",sx:{mb:2},children:"This environment is disabled, which means that none of your strategies are executing."})}),t(A,{condition:m.length>0,show:t(B,{children:m.map((T,F)=>t(zo,{strategy:T,index:F,environmentName:e.name,otherEnvironments:a,isDragging:(S==null?void 0:S.id)===T.id,onDragStartRef:_,onDragOver:M(T.id),onDragEnd:O},T.id))}),elseShow:t(ns,{projectId:o,featureId:s,environmentId:e.name})})]})})},sn=(e,n)=>e===0?0:Math.round(n/e*100);var je={},ze={};Object.defineProperty(ze,"__esModule",{value:!0});ze.defaultOptions=void 0;ze.defaultOptions={lowercase:!1,precision:1,space:!1,units:["","K","M","B","T","P","E"]};var K={};Object.defineProperty(K,"__esModule",{value:!0});K.getLocales=K.getFractionDigits=K.roundTo=K.parseValue=void 0;function rs(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}K.parseValue=rs;function is(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))}K.roundTo=is;function cs(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}K.getFractionDigits=cs;function ls(){var e;return typeof navigator>"u"?[]:Array.from((e=navigator.languages)!==null&&e!==void 0?e:[])}K.getLocales=ls;Object.defineProperty(je,"__esModule",{value:!0});je.millify=void 0;const wt=ze,De=K,xt=1e3;function*Et(e){let n=xt;for(;;){const a=e/n;if(a<1)return;yield a,n*=xt}}function rn(e,n){var a,o;const s=n?{...wt.defaultOptions,...n}:wt.defaultOptions;if(!Array.isArray(s.units)||!s.units.length)throw new Error("Option `units` must be a non-empty array");let i;try{i=De.parseValue(e)}catch(S){return S instanceof Error&&console.warn(`WARN: ${S.message} (millify)`),String(e)}const c=i<0?"-":"";i=Math.abs(i);let l=0;for(const S of Et(i))i=S,l+=1;if(l>=s.units.length)return e.toString();let p=De.roundTo(i,s.precision);for(const S of Et(p))p=S,l+=1;const g=(a=s.units[l])!==null&&a!==void 0?a:"",f=s.lowercase?g.toLowerCase():g,m=s.space?" ":"",b=p.toLocaleString((o=s.locales)!==null&&o!==void 0?o:De.getLocales(),{minimumFractionDigits:De.getFractionDigits(p)});return`${c}${b}${m}${f}`}je.millify=rn;var ds=je.default=rn;const Be=({value:e,threshold:n=1e6,precision:a=2})=>{let o,s=!1;e<n?o=e.toLocaleString():(o=ds(e,{precision:a}),s=!0);const i=t("span",{"data-testid":zn,children:o});return t(A,{condition:s,show:t(J,{title:e.toLocaleString(),arrow:!0,children:i}),elseShow:i})},Ue=d("article")(({theme:e})=>({padding:e.spacing(2),background:"transparent",borderRadius:e.spacing(2),textAlign:"center",[e.breakpoints.up("md")]:{padding:e.spacing(4)}})),Ge=d("h3")(({theme:e})=>({margin:0,fontSize:e.fontSizes.bodySize,fontWeight:e.fontWeight.thin})),Ye=d("p")(({theme:e})=>({fontSize:"2.25rem",fontWeight:e.fontWeight.bold,color:e.palette.primary.main})),Ke=d("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})),cn=({totalYes:e,totalNo:n,hoursBack:a,statsSectionId:o,tableSectionId:s})=>{const i=a===1?"in the last hour":`in the last ${a} hours`;return r(ne,{container:!0,spacing:2,id:o,"aria-describedby":s,"aria-label":"Feature metrics summary",component:"section",children:[t(ne,{item:!0,xs:12,sm:4,children:r(Ue,{children:[t(Ge,{children:"Exposure"}),t(Ye,{children:t(Be,{value:e})}),r(Ke,{children:["Total exposure of the feature in the environment"," ",i,"."]})]})}),t(ne,{item:!0,xs:12,sm:4,children:r(Ue,{children:[t(Ge,{children:"Exposure %"}),r(Ye,{children:[sn(e+n,e),"%"]}),r(Ke,{children:["% total exposure of the feature in the environment"," ",i,"."]})]})}),t(ne,{item:!0,xs:12,sm:4,children:r(Ue,{children:[t(Ge,{children:"Requests"}),t(Ye,{children:t(Be,{value:e+n})}),r(Ke,{children:["Total requests for the feature in the environment"," ",i,"."]})]})})]})},us=d("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}})),ps=d("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})),gs=({children:e})=>t(us,{children:t(ps,{children:e})}),hs=({environmentMetric:e})=>e?r(B,{children:[t(gs,{children:"Feature toggle exposure"}),t("div",{children:t(cn,{totalYes:e.yes,totalNo:e.no,hoursBack:1})})]}):null,At=d("div")({marginLeft:"auto",display:"flex",alignItems:"center"}),Rt=d("div")(({theme:e})=>({marginRight:e.spacing(1),display:"flex",flexDirection:"column"})),It=d("p")(({theme:e})=>({color:e.palette.primary.main,textAlign:"right",fontSize:e.fontSizes.bodySize})),Ft=d("p")(({theme:e})=>({maxWidth:"270px",marginTop:e.spacing(.5),fontSize:e.fontSizes.smallBody,textAlign:"right",[e.breakpoints.down(700)]:{display:"none"}})),fs=d(Wn)(({theme:e})=>({fill:e.palette.background.elevation2,height:"75px",width:"75px",[e.breakpoints.down(500)]:{display:"none"}})),ms=d("div")(({theme:e})=>({margin:e.spacing(0,2),[e.breakpoints.down(500)]:{display:"none"}})),ys=({environmentMetric:e,disabled:n=!1})=>{const a=Nn();if(!e)return null;const o=e.yes+e.no,s=sn(o,e==null?void 0:e.yes);return!e||e.yes===0&&e.no===0?r(At,{children:[r(Rt,{children:[r(It,{style:{color:n?a.palette.text.secondary:void 0},"data-loading":!0,children:[s,"%"]}),r(Ft,{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(fs,{style:{transform:"scale(1.1)"},"data-loading":!0})]}):r(At,{children:[r(Rt,{children:[r(It,{children:[s,"%"]}),r(Ft,{children:["The feature has been requested"," ",r("b",{children:[t(Be,{value:o})," times"]})," ","and exposed"," ",r("b",{children:[t(Be,{value:e.yes})," ","times"]})," ","in the last hour"]})]}),t(ms,{"data-loading":!0,children:t(qn,{percentage:s,size:"3rem"})})]})},Je=({strategy:e})=>{const n=Nt(e.name);return t(J,{title:Ee(e.name)+(e.title?` - ${e.title}`:""),arrow:!0,children:t(Ss,{children:t(n,{})})})},Ss=d("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)}})),Dt=d("ul")(()=>({all:"unset",display:"flex",alignItems:"center",alignContent:"center"})),Qe=d("li")(()=>({all:"unset",minWidth:30,textAlign:"center"})),bs=d("div")(({theme:e})=>({display:"flex",flexDirection:"row",alignItems:"center",gap:e.spacing(1)})),ke=5,Cs=({strategies:e})=>e!=null&&e.length?e.length>ke+1?r(Dt,{"aria-label":"Feature strategies",children:[e.slice(0,ke).map(n=>t(Qe,{children:t(Je,{strategy:n})},n.id)),r(Hn,{tooltip:e.slice(ke).map(n=>t(Qe,{children:r(bs,{children:[t(Je,{strategy:n})," ",Ee(n.name)+(n.title?` - ${n.title}`:"")]})},n.id)),children:["(+",e.length-ke,")"]})]}):t(Dt,{"aria-label":"Feature strategies",children:e.map(n=>t(Qe,{children:t(Je,{strategy:n})},n.id))}):null,vs=d("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})),Ts=d(Un)({boxShadow:"none",background:"none"}),ws=d(Gn)(({theme:e})=>({boxShadow:"none",padding:e.spacing(2,4),[e.breakpoints.down(400)]:{padding:e.spacing(1,2)}})),xs=d(Yn,{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)}})),Es=d(ss)(({theme:e})=>({width:"100%",position:"relative",paddingBottom:e.spacing(2)})),As=d("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})),Rs=d("div")(({theme:e})=>({display:"flex",alignItems:"center",[e.breakpoints.down(560)]:{flexDirection:"column",textAlign:"center"}})),Is=d(Ya)(({theme:e})=>({[e.breakpoints.down(560)]:{marginBottom:"0.5rem"}})),Fs=d(lt)(({theme:e})=>({fontSize:e.fontSizes.bodySize,fontWeight:e.typography.fontWeightMedium,[e.breakpoints.down(560)]:{textAlign:"center"}})),Ds=d("div")(({theme:e})=>({display:"flex",alignItems:"center",marginTop:e.spacing(2),gap:e.spacing(2),flexWrap:"wrap",[e.breakpoints.down(560)]:{flexDirection:"column"}})),ks=({env:e})=>{var p;const n=I("projectId"),a=I("featureId"),{metrics:o}=So(n,a),{feature:s}=V(n,a),{value:i}=qt(),l=Co(s==null?void 0:s.environments,o).find(g=>g.environment===e.name),u=s==null?void 0:s.environments.find(g=>g.name===e.name);return t(A,{condition:!new Set(i.hiddenEnvironments).has(e.name),show:t(vs,{enabled:e.enabled,children:r(Ts,{TransitionProps:{mountOnEnter:!0},"data-testid":`${Kn}_${e.name}`,className:`environment-accordion ${e.enabled?"":"accordion-disabled"}`,children:[r(ws,{expandIcon:t(Jn,{titleAccess:"Toggle"}),children:[r(As,{"data-loading":!0,enabled:e.enabled,children:[r(Rs,{children:[t(Is,{enabled:e.enabled}),t("div",{children:t(Fs,{text:e.name,maxWidth:"100",maxLength:15})}),t(A,{condition:!e.enabled,show:t(Ce,{color:"neutral",sx:{ml:1},children:"Disabled"})})]}),r(Ds,{children:[t(at,{label:"Add strategy",projectId:n,featureId:a,environmentId:e.name,variant:"outlined",size:"small"}),t(Cs,{strategies:u==null?void 0:u.strategies})]})]}),t(ys,{environmentMetric:l,disabled:!e.enabled})]}),r(xs,{enabled:e.enabled,children:[t(Es,{featureEnvironment:u,isDisabled:!e.enabled,otherEnvironments:s==null?void 0:s.environments.map(({name:g})=>g).filter(g=>g!==e.name)}),t(A,{condition:(((p=u==null?void 0:u.strategies)==null?void 0:p.length)||0)>0,show:r(B,{children:[t(Y,{sx:{display:"flex",justifyContent:"center",py:1},children:t(at,{label:"Add strategy",projectId:n,featureId:a,environmentId:e.name})}),t(hs,{environmentMetric:l})]})})]})]})})})},$s=()=>{const e=I("projectId"),n=I("featureId"),{feature:a}=V(e,n);if(!a)return null;const{environments:o}=a;return t(B,{children:o==null?void 0:o.map(s=>t(ks,{env:s},s.name))})},Ps=d("div")(({theme:e})=>({display:"flex",flexDirection:"column",padding:e.spacing(3),fontSize:e.fontSizes.smallBody})),Bs=d("span")(({theme:e})=>({color:e.palette.text.secondary,marginRight:e.spacing(1)})),Ms=d("div")({display:"flex",flexDirection:"row",justifyContent:"space-between"}),Os=d("div")(({theme:e})=>({justifyContent:"center",paddingTop:e.spacing(.75)})),_s=({feature:e,header:n})=>{const{locationSettings:a}=Ht(),{uiConfig:o}=Le(),s=!!o.flags.lastSeenByEnvironment;return r(Ps,{children:[n,r(Ms,{children:[r(Os,{children:[t(Bs,{children:"Created at:"}),t("span",{children:Qn(Ut(e.createdAt),a.locale)})]}),s&&t(Xn,{featureLastSeen:e.lastSeenAt,environments:e.environments,sx:{pt:0}})]})]})},Ls=d(it,{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}})),Vs=({environment:e,hiddenEnvironments:n,setHiddenEnvironments:a})=>t(Ls,{onClick:()=>{a(e.name)},visibilityOff:n.has(e.name),children:t(A,{condition:n.has(e.name),show:t(Zn,{}),elseShow:t(ea,{})})}),js=d("div")(({theme:e})=>({marginLeft:e.spacing(-1.5),"&:not(:last-of-type)":{marginBottom:e.spacing(2)},display:"flex",alignItems:"center"})),zs=d("label")(()=>({display:"inline-flex",alignItems:"center",cursor:"pointer"})),Ws=({environment:e,callback:n,showInfoBox:a,children:o,hiddenEnvironments:s,setHiddenEnvironments:i})=>{const{name:c,enabled:l}=e,u=I("projectId"),p=I("featureId"),{feature:g,refetchFeature:f}=V(u,p),m=r(B,{children:[" ",r("span",{"data-loading":!0,children:[l?"enabled":"disabled"," in"]})," ",t(lt,{text:c,maxWidth:"120",maxLength:15})]}),b=()=>{f(),n&&n()};return r(js,{children:[r(zs,{children:[t(Ka,{featureId:g.name,projectId:u,environmentName:e.name,onToggle:b,onError:a,value:l}),o??m]}),t(Vs,{environment:e,hiddenEnvironments:s,setHiddenEnvironments:i})]})},Ns=d("div")(({theme:e})=>({padding:e.spacing(3)})),qs=d("div")(()=>({display:"flex",flexDirection:"column"})),Hs=d("p")(({theme:e})=>({fontSize:e.fontSizes.bodySize})),Us=d("p")(({theme:e})=>({fontSize:e.fontSizes.smallBody,color:e.palette.text.secondary,display:"flex",alignItems:"center"})),kt=d("span")(({theme:e})=>({padding:e.spacing(0,.5),"::after":{content:'"-"'}})),Gs=d(ut)(()=>({"&:hover, &:focus":{textDecoration:"underline"}})),Ys=({feature:e,header:n,hiddenEnvironments:a,setHiddenEnvironments:o})=>{const[s,i]=h.useState(!1),[c,l]=h.useState(""),u=e.environments.some(p=>{var g;return p.enabled&&((g=p.variants)==null?void 0:g.length)});return r(Ns,{"data-testid":"feature-toggle-status",children:[n,e.environments.map(p=>{const g=p.strategies.length===1?"1 strategy":`${p.strategies.length} strategies`,f=p.variants??[],m=f.length>0&&r(B,{children:[t(kt,{}),t(J,{title:"View variants",arrow:!0,describeChild:!0,children:t(Gs,{component:G,to:`/projects/${e.project}/features/${e.name}/variants`,underline:"hover",children:f.length===1?"1 variant":`${f.length} variants`})})]}),b=p.enabled&&f.length===0&&u;return t(Ws,{environment:p,hiddenEnvironments:a,setHiddenEnvironments:o,showInfoBox:()=>{l(p.name),i(!0)},children:r(qs,{children:[t(Hs,{children:p.name}),r(Us,{children:[g,m,t(A,{condition:b,show:r(B,{children:[t(kt,{}),t(Ja,{})]})})]})]})},p.name)}),t(Qa,{open:s,onClose:()=>i(!1),projectId:e.project,featureId:e.name,environmentName:c})]})},ln=(e,n={})=>{const a=async()=>{const p=we(`api/admin/features/${e}/tags`);return(await fetch(p,{method:"GET"}).then(Me("Tags"))).json()},o=`api/admin/features/${e}/tags`,{data:s,error:i}=ta(!!e,{tags:[]},o,a,n),[c,l]=h.useState(!i&&!s),u=()=>{rt(o)};return h.useEffect(()=>{l(!i&&!s)},[s,i]),{tags:(s==null?void 0:s.tags)||[],error:i,loading:c,refetch:u}},Ks=d("section")(({theme:e})=>({"& > *":{margin:e.spacing(1,0)}})),Xe=e=>e.map(n=>({title:n.value})),$t=(e,n)=>e.map(a=>({value:a.title,type:n})),dn=({open:e,setOpen:n})=>{const{tagTypes:a}=na(),o=I("featureId"),{createTag:s}=Xa(),{updateFeatureTags:i,loading:c}=Ve(),{tags:l,refetch:u,loading:p}=ln(o),{setToastData:g}=U(),f=a&&a.length>0?a[0]:{name:"simple",description:"Simple tag to get you started",icon:""},[m,b]=h.useState(f),S=c||p,[E,y]=h.useState(0),{trackEvent:C}=_e(),[$,_]=h.useState(Xe(l.filter(v=>v.type===m.name))),{tags:M,refetch:O}=Za(m.name),T=h.useMemo(()=>Xe(M),[M]);h.useEffect(()=>{l&&m&&_(Xe(l.filter(v=>v.type===m.name)))},[JSON.stringify(l),m]);const F=()=>{n(!1),_([])};function k(v,x){const D=v.filter(z=>z.type===m.name).filter(z=>!x.find(L=>z.value===L.value&&z.type===L.type)),P=x.filter(z=>z.type===m.name).filter(z=>!v.find(L=>z.value===L.value&&z.type===L.type));return y(D.length+P.length),{added:D,removed:P}}const W=v=>v.filter(x=>!x.title.startsWith("Create")),oe=async(v,x)=>{try{await i(o,{addedTags:v,removedTags:x}),await u()}catch(D){const P=j(D);g({type:"error",title:"Failed to add tag",text:P,confetti:!1})}},Z=(v,x)=>{let D="We successfully";return v>0&&(D=D.concat(` added ${v} new tag${v>1?"s":""}`)),v>0&&x>0&&(D=D.concat(" and ")),x>0&&(D=D.concat(` removed ${x} tag${x>1?"s":""}`)),D},ee=async v=>{v.preventDefault();const x=$t(W($),m.name),{added:D,removed:P}=k(x,l);E>0&&(await oe(D,P),E>1&&C("suggest_tags",{props:{eventType:"multiple_tags_added"}}),E>0&&g({type:"success",title:`Updated tag${D.length>1?"s":""} to toggle`,text:Z(D.length,P.length),confetti:!0})),y(0),_([]),n(!1)},te=(v,x)=>{x!=null&&typeof x!="string"&&(v.preventDefault(),b(x),_([]),y(0))},Q=(v,x,D)=>{const P=aa(x);D==="selectOption"&&x.forEach((L,H)=>{if(typeof L!="string"&&L.inputValue&&L.inputValue!==""){const Ie={value:L.inputValue,type:m.name};s(Ie).then(()=>{C("suggest_tags",{props:{eventType:"tag_created"}}),O()}),L.title=L.inputValue,L.inputValue="",P[H]=L}});const z=$t(W(P),m.name);k(z,l),_(P)},w="add-tag-form";return t(re,{open:e,secondaryButtonText:"Cancel",primaryButtonText:"Save tags",title:"Update tags to feature toggle",onClick:ee,disabledPrimaryButton:S||E===0,onClose:F,formId:w,children:r(B,{children:[t(N,{paragraph:!0,sx:{marginBottom:v=>v.spacing(2.5)},children:"Tags allow you to group features together"}),t("form",{id:w,onSubmit:ee,children:r(Ks,{children:[t(eo,{options:a,value:m,onChange:te}),t(to,{options:T,existingTags:l,tagType:m,selectedOptions:$,onChange:Q})]})})]})})},Js=d("div")(({theme:e})=>({display:"flex",flexDirection:"column",padding:e.spacing(3)})),Qs=d("div")(({theme:e})=>({display:"flex",gap:e.spacing(1),flexWrap:"wrap"})),Xs=d(Gt)(({theme:e})=>({fontSize:e.fontSizes.smallBody})),Zs=d(ve)(({theme:e})=>({margin:e.spacing(3),borderStyle:"dashed"})),er=d(ye)(({theme:e})=>({maxWidth:e.spacing(20),alignSelf:"center"})),tr=({feature:e,header:n})=>{const{tags:a,refetch:o}=ln(e.name),{deleteTagFromFeature:s}=Ve(),[i,c]=h.useState(!1),[l,u]=h.useState(!1),[p,g]=h.useState(),{setToastData:f,setToastApiError:m}=U(),{hasAccess:b}=h.useContext(ct),S=b(he,e.project),E=async()=>{if(p)try{await s(e.name,p.type,p.value),o(),f({type:"success",title:"Tag deleted",text:"Successfully deleted tag"})}catch(y){m(j(y))}};return r(Js,{children:[n,t(Qs,{children:a.map(y=>{const C=`${y.type}:${y.value}`;return t(Xs,{label:C,deleteIcon:t(oa,{titleAccess:"Remove"}),onDelete:S?()=>{u(!0),g(y)}:void 0},C)})}),t(A,{condition:S,show:r(B,{children:[t(A,{condition:a.length>0,show:t(Zs,{})}),t(er,{"data-loading":!0,variant:"outlined",startIcon:t(sa,{}),onClick:()=>c(!0),children:"Add new tag"})]})}),t(dn,{open:i,setOpen:c}),r(re,{open:l,primaryButtonText:"Delete tag",secondaryButtonText:"Cancel",onClose:()=>{u(!1),g(void 0)},onClick:()=>{u(!1),E(),g(void 0)},title:"Delete tag?",children:["You are about to delete tag:"," ",r("strong",{children:[p==null?void 0:p.type,":",p==null?void 0:p.value]})]})]})},nr=d("div")(({theme:e})=>({position:"sticky",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"}})),Ze=d("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}})),ar=({hiddenEnvironments:e,setHiddenEnvironments:n})=>{const a=I("projectId"),o=I("featureId"),{feature:s}=V(a,o);return r(nr,{children:[t(Ys,{header:r(Ze,{"data-loading":!0,children:["Enabled in environments (",s.environments.filter(({enabled:i})=>i).length,")",t(ra,{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(ve,{}),t(_s,{header:t(Ze,{"data-loading":!0,children:"Feature toggle details"}),feature:s}),t(ve,{}),t(tr,{header:t(Ze,{"data-loading":!0,children:"Tags for this feature toggle"}),feature:s})]})},or=()=>{const{trackEvent:e}=_e(),{value:n,setValue:a}=qt(),[o,s]=h.useState(new Set(n.hiddenEnvironments));return{hiddenEnvironments:o,setHiddenEnvironments:c=>{a(l=>{const u=new Set(l.hiddenEnvironments);return u.has(c)?(u.delete(c),e("hidden_environment",{props:{eventType:"environment unhidden"}})):(u.add(c),e("hidden_environment",{props:{eventType:"environment hidden"}})),s(u),{...n,hiddenEnvironments:u}})}}},sr=d("div")(({theme:e})=>({display:"flex",width:"100%",[e.breakpoints.down(1e3)]:{flexDirection:"column"}})),rr=d("div")(({theme:e})=>({display:"flex",flexDirection:"column",width:"calc(100% - (350px + 1rem))",[e.breakpoints.down(1e3)]:{width:"100%"}})),ir=()=>{const e=le(),n=I("projectId"),a=I("featureId"),o=zt(n,a),{hiddenEnvironments:s,setHiddenEnvironments:i}=or(),c=()=>e(o);return Yt(a),r(sr,{children:[r("div",{children:[t(yo,{}),t(ar,{hiddenEnvironments:s,setHiddenEnvironments:i})]}),t(rr,{children:t($s,{})}),r(Kt,{children:[t(se,{path:"strategies/create",element:t(nt,{label:"Create feature strategy",onClose:c,open:!0,children:t(no,{})})}),t(se,{path:"strategies/edit",element:t(nt,{label:"Edit feature strategy",onClose:c,open:!0,children:t(ia,{})})})]})]})},cr=d("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})),lr=d(Jt,{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:n})=>({color:n?e.palette.neutral.border:e.palette.primary.main})),dr=d("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})),ur=d("form")(()=>({display:"flex",flexDirection:"column",height:"100%"})),pr=d(de)(({theme:e})=>({marginBottom:e.spacing(2)})),gr=d(de)(({theme:e})=>({marginTop:e.spacing(4)})),hr=d("div")({display:"flex",flexDirection:"column"}),fr=d("div")(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1.5),marginBottom:e.spacing(.5)})),Pt=d("p")(({theme:e})=>({fontSize:e.fontSizes.smallBody,color:e.palette.text.secondary,marginBottom:e.spacing(1.5)})),mr=d(ve)(({theme:e})=>({margin:e.spacing(4,0)})),yr=d(ca)(({theme:e})=>({minWidth:e.spacing(20),width:"100%"})),Sr=d("div")(({theme:e})=>({marginTop:"auto",paddingTop:e.spacing(4),display:"flex",justifyContent:"flex-end"})),br=d(ye)(({theme:e})=>({marginLeft:e.spacing(3)})),Cr=h.memo(la),vr=({environment:e,open:n,setOpen:a,getApiPayload:o,getCrPayload:s,onConfirm:i})=>{const c=I("projectId"),l=I("featureId"),{uiConfig:u}=Le(),{context:p}=da(),{defaultStickiness:g,loading:f}=ua(c),{isChangeRequestConfigured:m}=ae(c),{data:b}=ce(c),{changeRequestInReviewOrApproved:S,alert:E}=ha(b),y=(e==null?void 0:e.variants)||[],[C,$]=h.useState([]),[_,M]=h.useState();h.useEffect(()=>{f||$(y.length?y.map(R=>({...R,isValid:!0,new:!1,id:We()})):[{name:"",weightType:ht.VARIABLE,weight:0,overrides:[],stickiness:(C==null?void 0:C.length)>0?C[0].stickiness:g,new:!0,isValid:!1,id:We()}])},[n,f]);const O=(R,q)=>{$(ue=>ft(ue.map(Fe=>Fe.id===q?R:Fe),1e3))},T=()=>{const R=We();$(q=>[...q,{name:"",weightType:ht.VARIABLE,weight:0,overrides:[],stickiness:(q==null?void 0:q.length)>0?q[0].stickiness:g,new:!0,isValid:!1,id:R}]),M(R)};h.useEffect(()=>{if(_){const R=document.getElementById(`variant-name-input-${_}`);R==null||R.scrollIntoView({behavior:"smooth",block:"center"}),R==null||R.focus({preventScroll:!0}),M(void 0)}},[_]);const F=C.map(({new:R,isValid:q,id:ue,...Fe})=>Fe),k=o(y,F),W=s(F),oe=async R=>{R.preventDefault(),i(F)},Z=()=>w?`curl --location --request POST '${u.unleashUrl}/api/admin/projects/${c}/environments/${e==null?void 0:e.name}/change-requests' \\
|
|
2
|
+
--header 'Authorization: INSERT_API_KEY' \\
|
|
3
|
+
--header 'Content-Type: application/json' \\
|
|
4
|
+
--data-raw '${JSON.stringify(W,void 0,2)}'`:`curl --location --request PATCH '${u.unleashUrl}/api/admin/projects/${c}/features/${l}/environments/${e==null?void 0:e.name}/variants' \\
|
|
5
|
+
--header 'Authorization: INSERT_API_KEY' \\
|
|
6
|
+
--header 'Content-Type: application/json' \\
|
|
7
|
+
--data-raw '${JSON.stringify(k.patch,void 0,2)}'`,ee=C.every(({isValid:R})=>R),te=S((e==null?void 0:e.name)||""),Q=te?"Add to existing change request":"Add change to draft",w=m((e==null?void 0:e.name)||""),v=h.useMemo(()=>{var R;return f?"":((R=F[0])==null?void 0:R.stickiness)||g},[f,g,JSON.stringify(F[0]??{})]),x=h.useMemo(()=>["default",...p.filter(R=>R.stickiness).map(R=>R.name)],[p]),D=x.map(R=>({key:R,label:R}));x.includes(v)||D.push({key:v,label:v});const P=async R=>{$(q=>q.map(ue=>({...ue,stickiness:R})))},z=R=>{P(R)},[L,H]=h.useState();h.useEffect(()=>{H(void 0),k.error&&H(k.error)},[k.error]);const Ie=()=>{P(g),a(!1)};return f||v===""?t(pa,{}):t(nt,{open:n,onClose:Ie,label:"",children:r(ga,{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:Z,loading:!n,children:[r(cr,{children:[r("div",{children:[t(lr,{deprecated:!(e!=null&&e.enabled)}),t(dr,{deprecated:!(e!=null&&e.enabled),children:e==null?void 0:e.name})]}),t(ie,{"data-testid":"MODAL_ADD_VARIANT_BUTTON",onClick:T,variant:"outlined",permission:pe,projectId:c,environmentId:e==null?void 0:e.name,children:"Add variant"})]}),r(ur,{onSubmit:oe,children:[t(A,{condition:te,show:E,elseShow:t(A,{condition:!!w,show:r(pr,{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(hr,{children:C.map(R=>t(Cr,{variant:R,variants:C,updateVariant:q=>O(q,R.id),removeVariant:()=>$(q=>ft(q.filter(ue=>ue.id!==R.id),1e3)),error:k.error},R.id))}),t(ie,{onClick:T,variant:"outlined",permission:pe,projectId:c,environmentId:e==null?void 0:e.name,children:"Add variant"}),t(mr,{}),t(A,{condition:C.length>0,show:r(B,{children:[t(fr,{children:t("p",{children:"Stickiness"})}),r(Pt,{children:["By overriding the stickiness you can control which parameter is used to ensure consistent traffic allocation across variants."," ",t(ut,{href:"https://docs.getunleash.io/reference/feature-toggle-variants",target:"_blank",rel:"noreferrer",children:"Read more"})]}),t("div",{children:t(yr,{value:v,label:"",editable:!0,onChange:R=>z(R.target.value)})})]}),elseShow:t(Pt,{children:"This environment has no variants. Get started by adding a variant."})}),r(gr,{severity:"error",hidden:!L,children:[t("strong",{children:"Error: "}),L]}),r(Sr,{children:[t(ye,{"data-testid":"DIALOGUE_CONFIRM_ID",type:"submit",variant:"contained",color:"primary",disabled:!ee,children:w?Q:"Save variants"}),t(br,{onClick:Ie,children:"Cancel"})]})]})]})})},Tr=d("div")(({theme:e})=>({padding:e.spacing(3),borderRadius:e.shape.borderRadiusLarge,border:`1px solid ${e.palette.divider}`,"&:not(:last-child)":{marginBottom:e.spacing(3)}})),wr=d("div")({display:"flex",alignItems:"center",justifyContent:"space-between","& > div":{display:"flex",alignItems:"center"}}),xr=d(Jt,{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:n})=>({color:n?e.palette.neutral.border:e.palette.primary.main})),Er=d("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})),Ar=d("p")(({theme:e})=>({fontSize:e.fontSizes.smallBody,color:e.palette.text.secondary,marginBottom:e.spacing(1.5)})),Rr=d("div")(({theme:e})=>({margin:e.spacing(3,0)})),Ir=d("div")(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1.5),marginBottom:e.spacing(.5)})),Fr=({environment:e,searchValue:n,children:a})=>{var i;const o=e.variants??[],s=((i=o[0])==null?void 0:i.stickiness)||"default";return r(Tr,{children:[r(wr,{children:[r("div",{children:[t(xr,{deprecated:!e.enabled}),t(Er,{deprecated:!e.enabled,children:e.name})]}),a]}),t(A,{condition:o.length>0,show:r(B,{children:[t(Rr,{children:t(fa,{variants:o,searchValue:n})}),t(A,{condition:o.length>1,show:r(B,{children:[r(Ir,{children:[t("p",{children:"Stickiness:"}),t(Ce,{children:s})]}),r(Ar,{children:["By overriding the stickiness you can control which parameter is used to ensure consistent traffic allocation across variants."," ",t(ut,{href:"https://docs.getunleash.io/reference/feature-toggle-variants",target:"_blank",rel:"noreferrer",children:"Read more"})]})]})})]})})]})},Dr=d(be)(({theme:e})=>({"& span":{fontSize:e.fontSizes.smallBody}})),kr=({environment:e,permission:n,projectId:a,environmentId:o,onCopyVariantsFrom:s,otherEnvsWithVariants:i})=>{const[c,l]=h.useState(null),u=!!c,p=e.variants??[];return t(A,{condition:i.length>0&&p.length===0,show:r(B,{children:[t(ie,{onClick:g=>{l(g.currentTarget)},id:`copy-from-menu-${e.name}`,"aria-controls":u?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":u?"true":void 0,variant:"outlined",permission:n,projectId:a,environmentId:o,children:"Copy variants from"}),t(Re,{anchorEl:c,open:u,onClose:()=>l(null),MenuListProps:{"aria-labelledby":`copy-from-menu-${e.name}`},children:i.map(g=>t(me,{onClick:()=>s(g,e),children:t(Dr,{children:`Copy from ${g.name}`})},g.name))})]})})},$r=({permission:e,projectId:n,environment:a,checked:o,onClick:s,...i})=>{const c=tt(e,n,a);return r(me,{disabled:!c,onClick:s,...i,children:[t(ma,{checked:o}),a]})},Pr=d(Re)(({theme:e})=>({"& > div > ul":{display:"flex",flexDirection:"column",justifyContent:"center","& > li":{padding:e.spacing(0,1)}}})),Br=d("div")(({theme:e})=>({margin:e.spacing(1,2)})),Mr=d(ye)(({theme:e})=>({marginTop:e.spacing(2)})),Or=({current:e,environments:n,permission:a,projectId:o,onSubmit:s})=>{var E;const[i,c]=h.useState(null),l=!!i,[u,p]=h.useState([]),g=y=>{p(C=>[...C,y])},f=y=>{p(C=>C.filter(({name:$})=>$!==y.name))},m=y=>{u.includes(y)?f(y):g(y)},b=()=>{p([]),c(null)},S=((E=n.find(y=>y.name===e))==null?void 0:E.variants)??[];return t(A,{condition:S.length>0&&n.length>1,show:r(B,{children:[t(ye,{onClick:y=>{c(y.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:"Push to environment"}),r(Pr,{anchorEl:i,open:l,onClose:()=>c(null),MenuListProps:{"aria-labelledby":`push-to-menu-${e}`},children:[n.filter(y=>y.name!==e).map(y=>t($r,{projectId:o,permission:a,environment:y.name,checked:u.includes(y),onClick:()=>m(y)},y.name)),r(Br,{children:[t(ve,{}),r(Mr,{variant:"outlined",onClick:()=>{s(u),b()},disabled:u.length===0,children:["Push to selected (",u.length,")"]})]})]})]})})},_r=d(de)(({theme:e})=>({marginBottom:e.spacing(2),"& code":{fontWeight:e.fontWeight.bold}})),Lr=({mode:e})=>r(_r,{severity:"info",children:["Variant allows you to return a variant object if the"," ",e==="feature"?"feature toggle is considered enabled ":"this strategy is active ","for the current request. When using variants you should use the"," ",t("code",{children:"getVariant()"})," method in the Client SDK."]}),Vr=d("div")(({theme:e})=>({display:"flex",gap:e.spacing(1.5)})),jr=()=>{var Q;const{uiConfig:e}=Le(),{setToastData:n,setToastApiError:a}=U(),o=Wt(),s=Oe(o.breakpoints.down("md")),i=I("projectId"),c=I("featureId"),{feature:l,refetchFeature:u,loading:p}=V(i,c),{patchFeatureEnvironmentVariants:g,overrideVariantsInEnvironments:f}=Ve(),{refetch:m}=ce(i),{addChange:b}=xe(),{isChangeRequestConfigured:S}=ae(i),[E,y]=h.useState(""),[C,$]=h.useState(),[_,M]=h.useState(!1),O=h.useMemo(()=>{var w;return((w=l==null?void 0:l.environments)==null?void 0:w.map(v=>({...v,crEnabled:S(v.name)})))||[]},[l.environments]),T=(w,v)=>Ca(w,v),F=(w,v)=>{try{const x=ba(v,1e3);return{patch:T(w,x)}}catch(x){return{patch:[],error:j(x)}}},k=w=>({feature:c,action:"patchVariant",payload:{variants:w}}),W=async(w,v)=>{if(w.crEnabled)await b(i,w.name,k(v)),m();else{const x=w.variants??[],{patch:D,error:P}=F(x,v);if(D.length===0)return;if(P){n({type:"error",title:P});return}await g(i,c,w.name,D)}u()},oe=async(w,v)=>{try{const x=v.filter(({crEnabled:H})=>H),D=v.filter(({crEnabled:H})=>!H);x.length&&await Promise.all(x.map(H=>b(i,H.name,k(w)))),D.length&&await f(i,c,w,D.map(({name:H})=>H)),m(),u();const P=D.length?`Variants pushed to ${D.length===1?D[0].name:`${D.length} environments`}`:"",z=x.length?`Variants push added to ${x.length===1?`${x[0].name} draft`:`${x.length} drafts`}`:"",L=`${P}${P&&z?". ":""}${z}`;n({title:L,type:"success"})}catch(x){a(j(x))}},Z=w=>{$(w),M(!0)},ee=async w=>{if(C)try{await W(C,w),M(!1),n({title:C.crEnabled?"Variant changes added to draft":"Variants updated successfully",type:"success"})}catch(v){a(j(v))}},te=async(w,v)=>{try{const x=w.variants??[];await W(v,x),n({title:v.crEnabled?"Variants copy added to draft":"Variants copied successfully",type:"success"})}catch(x){a(j(x))}};return r(pt,{isLoading:p,header:t(ya,{title:"Variants",actions:t(A,{condition:!s,show:t(B,{children:t(mt,{initialValue:E,onChange:y})})}),children:t(A,{condition:s,show:t(mt,{initialValue:E,onChange:y})})}),children:[t(Lr,{mode:"feature"}),t(A,{condition:!!((Q=e==null?void 0:e.flags)!=null&&Q.strategyVariant),show:t(Sa,{})}),O.map(w=>{var x;const v=O.filter(({name:D,variants:P})=>D!==w.name&&(P==null?void 0:P.length));return t(Fr,{environment:w,searchValue:E,children:r(Vr,{children:[t(Or,{current:w.name,environments:O,permission:pe,projectId:i,onSubmit:D=>oe(w.variants??[],D)}),t(kr,{environment:w,permission:pe,projectId:i,environmentId:w.name,onCopyVariantsFrom:te,otherEnvsWithVariants:v}),t(A,{condition:!!((x=w.variants)!=null&&x.length),show:t(X,{"data-testid":"EDIT_VARIANTS_BUTTON",onClick:()=>Z(w),permission:pe,projectId:i,environmentId:w.name,tooltipProps:{title:"Edit variants"},children:t(Se,{})}),elseShow:t(ie,{"data-testid":"ADD_VARIANT_BUTTON",onClick:()=>Z(w),variant:"outlined",permission:pe,projectId:i,environmentId:w.name,children:"Add variant"})})]})},w.name)}),t(vr,{environment:C,open:_,setOpen:M,getApiPayload:F,getCrPayload:k,onConfirm:ee})]})},zr=we("api/admin/client-metrics/features"),un=(e,n)=>{const a=we(`api/admin/client-metrics/features/${e}/raw?hoursBack=${n}`),{data:o,error:s}=st(a,()=>Wr(a)),i=h.useCallback(()=>{rt(zr).catch(console.warn)},[]);return{featureMetrics:o==null?void 0:o.data,loading:!s&&!o,refetchFeatureMetrics:i,error:s}},Wr=e=>fetch(e).then(Me("Features")).then(n=>n.json()).then(),Nr=d("h2")(({theme:e})=>({margin:0,marginBottom:e.spacing(1),fontSize:e.fontSizes.smallBody,fontWeight:e.fontWeight.thin,color:e.palette.text.secondary})),Te=48,qr=({hoursBack:e,setHoursBack:n})=>{const a=o=>{n(Hr(o))};return r("div",{children:[t(Nr,{children:"Period"}),t(va,{name:"feature-metrics-period",id:"feature-metrics-period",options:Ur,value:String(e),onChange:a,fullWidth:!0})]})},Hr=e=>{switch(e){case"1":return 1;case"24":return 24;default:return Te}},Ur=[{key:"1",label:"Last hour"},{key:"24",label:"Last 24 hours"},{key:`${Te}`,label:`Last ${Te} hours`}],Gr=({value:e})=>{const{locationSettings:n}=Ht(),a=e?e instanceof Date?yt(e,n.locale):yt(Ut(e),n.locale):void 0;return t(Qt,{lineClamp:1,children:a})},Yr=({metrics:e,tableSectionId:n})=>{const a=Oe(Ta.breakpoints.down("md")),o=h.useMemo(()=>({sortBy:[{id:"timestamp"}]}),[]),{getTableProps:s,getTableBodyProps:i,headerGroups:c,rows:l,prepareRow:u,setHiddenColumns:p}=Ne.useTable({initialState:o,columns:Bt,data:e,autoResetHiddenColumns:!1,disableSortRemove:!0,defaultColumn:{Cell:Qt}},Ne.useGlobalFilter,Ne.useSortBy);return wa([{condition:a,columns:["appName","environment"]}],p,Bt),e.length===0?null:r(xa,{...s(),rowHeight:"standard",id:n,children:[t(Ea,{headerGroups:c}),t(Aa,{...i(),children:l.map(g=>(u(g),t(Ra,{hover:!0,...g.getRowProps(),children:g.cells.map(f=>t(Ia,{...f.getCellProps(),children:f.render("Cell")}))})))})]})},Bt=[{id:"Icon",width:"1%",disableSortBy:!0,Cell:()=>t(Fa,{icon:t(co,{color:"disabled"})})},{Header:"Time",accessor:"timestamp",Cell:e=>t(Gr,{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"}],Kr=({metrics:e,...n})=>{const a=h.useMemo(()=>e.reduce((s,i)=>s+i.yes,0),[e]),o=h.useMemo(()=>e.reduce((s,i)=>s+i.no,0),[e]);return t(cn,{...n,totalYes:a,totalNo:o})},Jr=({metrics:e,hoursBack:n})=>{const a=St(),o=St();return e.length===0?r(Y,{mt:6,children:[t(N,{variant:"body1",paragraph:!0,children:"We have yet to receive any metrics for this feature toggle in the selected time period."}),t(N,{variant:"body1",paragraph:!0,children:"Please note that, since the SDKs send metrics on an interval, it might take some time before metrics appear."})]}):r(h.Suspense,{fallback:null,children:[t(Y,{borderTop:1,pt:2,mt:3,borderColor:"divider",children:t(Qr,{metrics:e,hoursBack:n,statsSectionId:a})}),t(Y,{mt:4,children:t(Kr,{metrics:e,hoursBack:n,statsSectionId:a,tableSectionId:o})}),t(Y,{mt:4,children:t(Yr,{metrics:e,tableSectionId:o})})]})},Qr=Da.lazy(()=>ka(()=>import("./FeatureMetricsChart-36caeeb7.js"),[])),ot=e=>{const{search:n}=window.location,a=le(),o=h.useMemo(()=>new URLSearchParams(n),[n]),s=h.useCallback(i=>{const c=new URLSearchParams(n);c.set(e,i),a({search:c.toString()},{replace:!0})},[e,n,a]);return[o.get(e)||void 0,s]},Xr=e=>{const[n,a]=ot(e),o=h.useCallback(s=>a(String(s)),[a]);return[Number.isFinite(Number(n))?Number(n):void 0,o]},Zr=d("h2")(({theme:e})=>({margin:0,marginBottom:e.spacing(1.5),fontSize:e.fontSizes.smallBody,fontWeight:e.fontWeight.thin,color:e.palette.text.secondary})),ei=d("ul")(({theme:e})=>({display:"flex",flexWrap:"wrap",gap:e.spacing(1),listStyleType:"none",padding:0,minHeight:"100%"})),ti=d("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}})),Mt=({title:e,values:n,value:a,setValue:o})=>{const s=c=>()=>{n.has(c)&&o(c)},i=h.useMemo(()=>Array.from(n).sort((c,l)=>c.localeCompare(l)),[n]);return r("div",{children:[t(Zr,{children:e}),t(ei,{children:i.map(c=>t(ti,{children:t(Gt,{label:c,onClick:s(c),"aria-pressed":c===a,sx:$a})},c))})]})},ni=()=>{const e=I("projectId"),n=I("featureId"),a=ai(e,n),o=oi(n);Yt("Metrics");const[s=Te,i]=Xr("hoursBack"),{featureMetrics:c}=un(n,s),[l,u]=h.useState(c);h.useEffect(()=>{c&&u(c)},[c]);const p=Array.from(a)[0],g=Array.from(o)[0],[f=p,m]=ot("environment"),[b=g,S]=ot("application"),E=h.useMemo(()=>l==null?void 0:l.filter(y=>y.environment===f).filter(y=>y.appName===b),[l,f,b]);return E?r(pt,{children:[r(ne,{container:!0,component:"header",spacing:2,children:[t(ne,{item:!0,xs:12,md:5,children:t(A,{condition:a.size>0,show:t(Mt,{title:"Environments",values:a,value:f,setValue:m})})}),t(ne,{item:!0,xs:12,md:5,children:t(A,{condition:o.size>0,show:t(Mt,{title:"Applications",values:o,value:b,setValue:S})})}),t(ne,{item:!0,xs:12,md:2,children:t(qr,{hoursBack:s,setHoursBack:i})})]}),t(Jr,{metrics:E,hoursBack:s})]}):null},ai=(e,n)=>{const{feature:a}=V(e,n),o=a.environments.map(s=>s.name);return new Set(o)},oi=e=>{const{featureMetrics:n=[]}=un(e,Te),a=n.map(o=>o.appName);return new Set(a)},si=(e,n)=>{const a=new Set(e),o=new Set(n);return a.size!==o.size?!1:[...a].every(s=>o.has(s))},Ot=d("div")(({theme:e})=>({display:"grid",gap:e.spacing(2)})),_t=d(de)(({theme:e})=>({marginBottom:e.spacing(1)})),ri=d(dt)({padding:0}),ii=({projectId:e,open:n,onClose:a,onClick:o,feature:s,changeRequests:i})=>{const c=I("projectId"),{project:l}=Xt(e),{isChangeRequestConfiguredInAnyEnv:u}=ae(e),p=u(),g=h.useMemo(()=>si(s.environments.map(m=>m.name),l.environments.map(m=>m.environment)),[s,l]),f=i?i.length>0:!1;return t(A,{condition:g&&!f&&!p,show:t(re,{open:n,onClose:a,onClick:o,title:"Confirm change project",primaryButtonText:"Change project",secondaryButtonText:"Cancel",children:r(Ot,{children:[t(_t,{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(re,{open:n,onClick:a,title:"Confirm change project",primaryButtonText:"Close",children:r(Ot,{children:[t(_t,{severity:"warning",children:"Cannot proceed with the move"}),t(A,{condition:!g,show:t("p",{children:"In order to move a feature toggle between two projects, both projects must have the exact same environments enabled."})}),t(A,{condition:f,show:r(B,{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(ri,{children:i==null?void 0:i.map(m=>t(ge,{children:r(G,{to:`/projects/${c}/change-requests/${m.id}`,children:["View change request"," ",m.id]})},m.id))})]})}),t(A,{condition:p,show:r("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."]})})]})})})},ci=e=>fetch(e).then(Me("ChangeRequest")).then(n=>n.json()),li=(e,n)=>{const{data:a,error:o,mutate:s}=Pa([],we(`api/admin/projects/${e}/change-requests/pending/${n}`),ci);return{changeRequests:a,loading:!o&&!a,refetch:s,error:o}},di=()=>{const{hasAccess:e}=h.useContext(ct),n=I("projectId"),a=I("featureId"),{feature:o,refetchFeature:s}=V(n,a),[i,c]=h.useState(!1),{changeFeatureProject:l}=Ve(),{setToastData:u,setToastApiError:p}=U(),[g,f]=h.useState(n),{projects:m}=Ba(),b=le(),{changeRequests:S}=li(n,a),E=async()=>{try{g&&(await l(n,a,g),s(),u({title:"Project changed",type:"success"}),c(!1),b(`/projects/${g}/features/${a}/settings`,{replace:!0}))}catch(C){p(j(C))}},y=h.useMemo(()=>m.map(C=>C.id).filter(C=>e(bt,C)),[m,e]);return y.length===0?null:r(B,{children:[t(Ma,{value:g,onChange:f,label:"Project",filter:C=>y.includes(C),enabled:!0}),t(ie,{permission:bt,onClick:()=>c(!0),disabled:g===n,projectId:n,children:"Save"}),t(ii,{changeRequests:S,projectId:g,open:i,feature:o,onClose:()=>c(!1),onClick:E})]})},ui=d("div")({display:"flex",alignItems:"center"}),pi=d(N)(({theme:e})=>({fontSize:e.fontSizes.mainHeader})),gi=({projectId:e,featureId:n})=>{var i;const{feature:a}=V(e,n),o=le();return r(B,{children:[r(ui,{children:[t(pi,{children:"Feature information"}),t(X,{permission:he,projectId:e,"data-loading":!0,onClick:()=>{o(`/projects/${e}/features/${n}/edit`)},tooltipProps:{title:"Edit"},children:t(Se,{})})]}),r(N,{children:["Name: ",t("strong",{children:a.name})]}),r(N,{children:["Description:"," ",t("strong",{children:(i=a.description)!=null&&i.length?a.description:"no description"})]}),r(N,{children:["Type: ",t("strong",{children:a.type})]}),r(N,{children:["Impression Data:"," ",t("strong",{children:a.impressionData?"enabled":"disabled"})]})]})},$e="metadata",et="project",hi=d("div")(({theme:e})=>({width:"20%",borderRight:`1px solid ${e.palette.divider}`,padding:e.spacing(2,0),[e.breakpoints.down("md")]:{width:"35%"}})),fi=d("div")(({theme:e})=>({padding:e.spacing(4),display:"flex",flexDirection:"column",width:400,"& > *":{margin:e.spacing(1,0)}})),mi=()=>{const e=I("projectId"),n=I("featureId"),[a,o]=h.useState($e),{uiConfig:s}=Le();return t(pt,{header:"Settings",sx:{padding:0},children:r(Y,{sx:{display:"flex"},children:[t(hi,{children:r(dt,{children:[t(ge,{sx:{padding:"0.75rem 2rem"},button:!0,onClick:()=>o($e),selected:a===$e,children:"Metadata"},0),t(ge,{sx:{padding:"0.75rem 2rem"},button:!0,onClick:()=>o(et),selected:a===et,hidden:!s.flags.P,children:"Project"},1)]})}),r(fi,{children:[t(A,{condition:a===$e,show:t(gi,{projectId:e,featureId:n})}),t(A,{condition:a===et&&s.flags.P,show:t(di,{})})]})]})})},yi=({stale:e,showActive:n=!0})=>!e&&!n?null:t("div",{"data-loading":!0,style:{marginLeft:"8px"},children:t(Ce,{color:e?"error":"success",title:e?"Feature toggle is deprecated.":"Feature toggle is active.",children:e?"Stale":"Active"})}),Lt=d("strong")({wordBreak:"break-all"}),Si=()=>{const e=I("projectId"),n=I("featureId"),{archivedFeatures:a}=Oa(),o=_a(e,{name:n});return a?a.some(i=>i.name===n)?r("p",{children:["The feature ",t(Lt,{children:n})," has been archived. You can find it on the"," ",t(G,{to:`/projects/${e}/archive`,children:"project archive page"}),"."]}):r("p",{children:["The feature ",t(Lt,{children:n})," does not exist. Would you like to"," ",t(G,{to:o,children:"create it"}),"?"]}):null},bi=d("div")(({theme:e})=>({backgroundColor:e.palette.background.paper,borderRadius:e.shape.borderRadiusLarge,marginBottom:e.spacing(2)})),Ci=d("div")(({theme:e})=>({padding:e.spacing(2,4,2,2),display:"flex",justifyContent:"space-between",alignItems:"center",[e.breakpoints.down(500)]:{flexDirection:"column"}})),vi=d("div")({display:"flex",alignItems:"center"}),Ti=d("h1")(({theme:e})=>({fontSize:e.fontSizes.mainHeader,fontWeight:"normal",display:"flex",alignItems:"center",wordBreak:"break-all"})),wi=d("div")({flexShrink:0,display:"flex"}),xi=d("div")(({theme:e})=>({width:"100%",backgroundColor:e.palette.divider,height:"1px"})),Ei=d("div")(({theme:e})=>({padding:e.spacing(0,4)})),Ai=d(La)(({theme:e})=>({textTransform:"none",width:"auto",fontSize:e.fontSizes.bodySize,padding:"0 !important",[e.breakpoints.up("md")]:{minWidth:160}})),Di=()=>{const e=I("projectId"),n=I("featureId"),{refetch:a}=Xt(e),{favorite:o,unfavorite:s}=Va(),{refetchFeature:i}=V(e,n),[c,l]=h.useState(!1),[u,p]=h.useState(!1),[g,f]=h.useState(!1),m=Oe("(max-width:500px)"),{feature:b,loading:S,error:E,status:y}=V(e,n),C=le(),{pathname:$}=ja(),_=za(S),M=`/projects/${e}/features/${n}`,O=[{title:"Overview",path:`${M}`,name:"overview"},{title:"Metrics",path:`${M}/metrics`,name:"Metrics"},{title:"Variants",path:`${M}/variants`,name:"Variants"},{title:"Settings",path:`${M}/settings`,name:"Settings"},{title:"Event log",path:`${M}/logs`,name:"Event log"}],T=O.find(k=>k.path===$)??O[0],F=async()=>{b!=null&&b.favorite?await s(e,b.name):await o(e,b.name),i()};return y===404?t(Si,{}):E!==void 0?t("div",{ref:_}):r("div",{ref:_,children:[r(bi,{children:[r(Ci,{children:[r(vi,{children:[t(Wa,{onClick:F,isFavorite:b==null?void 0:b.favorite}),r(Ti,{"data-loading":!0,children:[b.name," "]}),t(A,{condition:!m,show:t(yi,{stale:b==null?void 0:b.stale})})]}),r(wi,{children:[t(X,{permission:Na,projectId:e,"data-loading":!0,component:G,to:`/projects/${e}/features/${n}/strategies/copy`,tooltipProps:{title:"Copy feature toggle"},children:t(qa,{})}),t(X,{permission:Ha,projectId:e,tooltipProps:{title:"Archive feature toggle"},"data-loading":!0,onClick:()=>p(!0),children:t(io,{})}),t(X,{onClick:()=>f(!0),permission:he,projectId:e,tooltipProps:{title:"Toggle stale state"},"data-loading":!0,children:t(ao,{})}),t(X,{onClick:()=>l(!0),permission:he,projectId:e,tooltipProps:{title:"Add tag"},"data-loading":!0,children:t(Ua,{})})]})]}),t(xi,{}),t(Ei,{children:t(Ga,{value:T.path,indicatorColor:"primary",textColor:"primary",children:O.map(k=>t(Ai,{label:k.title,value:k.path,onClick:()=>C(k.path),"data-testid":`TAB-${k.title}`},k.title))})})]}),r(Kt,{children:[t(se,{path:"metrics",element:t(ni,{})}),t(se,{path:"logs",element:t(uo,{})}),t(se,{path:"variants",element:t(jr,{})}),t(se,{path:"settings",element:t(mi,{})}),t(se,{path:"*",element:t(ir,{})})]}),t(oo,{isOpen:u,onConfirm:()=>{a(),C(`/projects/${e}`)},onClose:()=>p(!1),projectId:e,featureIds:[n]}),t(so,{isStale:b.stale,isOpen:g,onClose:()=>{f(!1),i()},featureId:n,projectId:e}),t(dn,{open:c,setOpen:l})]})};export{Di as default};
|