diff --git a/frontend/src/component/insights/sections/LifecycleInsights.tsx b/frontend/src/component/insights/sections/LifecycleInsights.tsx index b5fe71a773..f306c805df 100644 --- a/frontend/src/component/insights/sections/LifecycleInsights.tsx +++ b/frontend/src/component/insights/sections/LifecycleInsights.tsx @@ -2,9 +2,6 @@ import { usePersistentTableState } from 'hooks/usePersistentTableState'; import type { FC } from 'react'; import { FilterItemParam } from 'utils/serializeQueryParams'; import { InsightsSection } from 'component/insights/sections/InsightsSection'; -import { InsightsFilters } from 'component/insights/InsightsFilters'; -import { allOption } from 'component/common/ProjectSelect/ProjectSelect'; -import { useInsights } from 'hooks/api/getters/useInsights/useInsights'; import { LifecycleChart } from '../components/LifecycleChart/LifecycleChart.tsx'; import { styled, useTheme } from '@mui/material'; import { @@ -14,31 +11,11 @@ import { import { FeatureLifecycleStageIcon } from 'component/common/FeatureLifecycle/FeatureLifecycleStageIcon.tsx'; import { normalizeDays } from './normalize-days.ts'; import useLoading from 'hooks/useLoading.ts'; - -type LifecycleTrend = { - totalFlags: number; - averageTimeInStageDays: number; - categories: { - experimental: { - flagsOlderThanWeek: number; - newFlagsThisWeek: number; - }; - release: { - flagsOlderThanWeek: number; - newFlagsThisWeek: number; - }; - permanent: { - flagsOlderThanWeek: number; - newFlagsThisWeek: number; - }; - }; -}; - -type LifecycleInsights = { - develop: LifecycleTrend; - production: LifecycleTrend; - cleanup: LifecycleTrend; -}; +import { + type LifecycleTrend, + useLifecycleInsights, +} from 'hooks/api/getters/useLifecycleInsights/useLifecycleInsights.ts'; +import { InsightsFilters } from '../InsightsFilters.tsx'; const useChartColors = () => { const theme = useTheme(); @@ -141,13 +118,13 @@ export const LifecycleInsights: FC = () => { ); const loadingLabel = 'lifecycle-trend-charts'; - // todo (lifecycleMetrics): use data from the actual endpoint when we have something useful to return - const projects = state[`${statePrefix}project`]?.values ?? [allOption.id]; - const { insights, loading } = useInsights(); + const projects = state[`${statePrefix}project`]?.values ?? []; + const { + data: { lifecycleTrends }, + loading, + } = useLifecycleInsights(projects); const loadingRef = useLoading(loading, `[data-loading="${loadingLabel}"]`); - const { lifecycleTrends } = insights; - return ( { } > - {Object.entries(mockData).map(([stage, data]) => { + {Object.entries(lifecycleTrends).map(([stage, data]) => { return ( @@ -193,7 +170,7 @@ export const LifecycleInsights: FC = () => {
{normalizeDays( - data.averageTimeInStageDays, + data.medianDaysInCurrentStage, )}
@@ -204,7 +181,7 @@ export const LifecycleInsights: FC = () => {
{normalizeDays( - data.averageTimeInStageDays, + data.medianDaysHistorically, )}
@@ -308,60 +285,3 @@ const Chart: React.FC<{ stage: string; data: LifecycleTrend }> = ({ /> ); }; - -const mockData: LifecycleInsights = { - develop: { - totalFlags: 35, - averageTimeInStageDays: 28, - categories: { - experimental: { - flagsOlderThanWeek: 11, - newFlagsThisWeek: 4, - }, - release: { - flagsOlderThanWeek: 12, - newFlagsThisWeek: 1, - }, - permanent: { - flagsOlderThanWeek: 7, - newFlagsThisWeek: 0, - }, - }, - }, - production: { - totalFlags: 10, - averageTimeInStageDays: 14, - categories: { - experimental: { - flagsOlderThanWeek: 2, - newFlagsThisWeek: 3, - }, - release: { - flagsOlderThanWeek: 1, - newFlagsThisWeek: 1, - }, - permanent: { - flagsOlderThanWeek: 3, - newFlagsThisWeek: 0, - }, - }, - }, - cleanup: { - totalFlags: 5, - averageTimeInStageDays: 16, - categories: { - experimental: { - flagsOlderThanWeek: 0, - newFlagsThisWeek: 3, - }, - release: { - flagsOlderThanWeek: 0, - newFlagsThisWeek: 1, - }, - permanent: { - flagsOlderThanWeek: 1, - newFlagsThisWeek: 0, - }, - }, - }, -}; diff --git a/frontend/src/hooks/api/getters/useInsights/useInsights.ts b/frontend/src/hooks/api/getters/useInsights/useInsights.ts index 3d91e24c31..74f1c8cf7a 100644 --- a/frontend/src/hooks/api/getters/useInsights/useInsights.ts +++ b/frontend/src/hooks/api/getters/useInsights/useInsights.ts @@ -27,7 +27,6 @@ export const useInsights = ( return { insights: data || - /* @ts-expect-error FIXME (lifecycleMetrics): lifecycle trends */ ({ userTrends: [], flagTrends: [], diff --git a/frontend/src/hooks/api/getters/useLifecycleInsights/useLifecycleInsights.ts b/frontend/src/hooks/api/getters/useLifecycleInsights/useLifecycleInsights.ts new file mode 100644 index 0000000000..d97982cf30 --- /dev/null +++ b/frontend/src/hooks/api/getters/useLifecycleInsights/useLifecycleInsights.ts @@ -0,0 +1,77 @@ +import useSWR, { mutate, type SWRConfiguration } from 'swr'; +import { useCallback } from 'react'; +import { formatApiPath } from 'utils/formatPath'; +import handleErrorResponses from '../httpErrorResponseHandler.js'; +import type { + LifecycleTrendsSchema, + LifecycleTrendsSchemaLifecycleTrendsCleanup, + LifecycleTrendsSchemaLifecycleTrendsDevelop, + LifecycleTrendsSchemaLifecycleTrendsProduction, +} from 'openapi'; + +const emptyTrendData = { + categories: { + experimental: { + flagsOlderThanWeek: 0, + newFlagsThisWeek: 0, + }, + permanent: { + flagsOlderThanWeek: 0, + newFlagsThisWeek: 0, + }, + release: { + flagsOlderThanWeek: 0, + newFlagsThisWeek: 0, + }, + }, + medianDaysHistorically: 0, + medianDaysInCurrentStage: 0, + totalFlags: 0, +}; + +const emptyLifecycleTrends: LifecycleTrendsSchema = { + lifecycleTrends: { + cleanup: emptyTrendData, + develop: emptyTrendData, + production: emptyTrendData, + }, +}; + +export type LifecycleTrend = + | LifecycleTrendsSchemaLifecycleTrendsCleanup + | LifecycleTrendsSchemaLifecycleTrendsDevelop + | LifecycleTrendsSchemaLifecycleTrendsProduction; + +export const useLifecycleInsights = ( + projects?: string[], + options?: SWRConfiguration, +) => { + const path = formatApiPath( + `api/admin/insights/lifecycle?projects=${projects?.join(',')}`, + ); + + const { data, error } = useSWR( + path, + fetchLifecycleInsights, + options, + ); + + const refetchInsights = useCallback(() => { + mutate(path).catch(console.warn); + }, [path]); + + return { + data: data || emptyLifecycleTrends, + refetchInsights, + loading: !error && !data, + error, + }; +}; + +const fetchLifecycleInsights = ( + path: string, +): Promise => { + return fetch(path) + .then(handleErrorResponses('Lifecycle Insights data')) + .then((res) => res.json()); +}; diff --git a/frontend/src/openapi/models/apiTokenSchema.ts b/frontend/src/openapi/models/apiTokenSchema.ts index 5bc04f185a..1608c833d1 100644 --- a/frontend/src/openapi/models/apiTokenSchema.ts +++ b/frontend/src/openapi/models/apiTokenSchema.ts @@ -16,7 +16,7 @@ export interface ApiTokenSchema { alias?: string | null; /** When the token was created. */ createdAt: string; - /** The environment the token has access to. `*` if it has access to all environments. */ + /** The environment the token has access to. */ environment?: string; /** * The token's expiration date. NULL if the token doesn't have an expiration set. diff --git a/frontend/src/openapi/models/getLifecycleTrendsParams.ts b/frontend/src/openapi/models/getLifecycleTrendsParams.ts new file mode 100644 index 0000000000..a9152df36d --- /dev/null +++ b/frontend/src/openapi/models/getLifecycleTrendsParams.ts @@ -0,0 +1,12 @@ +/** + * Generated by Orval + * Do not edit manually. + * See `gen:api` script in package.json + */ + +export type GetLifecycleTrendsParams = { + /** + * Comma-separated list of project IDs to filter lifecycle trends + */ + projects?: string; +}; diff --git a/frontend/src/openapi/models/index.ts b/frontend/src/openapi/models/index.ts index c4bf4101cb..b07a6705e0 100644 --- a/frontend/src/openapi/models/index.ts +++ b/frontend/src/openapi/models/index.ts @@ -751,6 +751,7 @@ export * from './getIntegrationEvents401.js'; export * from './getIntegrationEvents403.js'; export * from './getIntegrationEvents404.js'; export * from './getIntegrationEventsParams.js'; +export * from './getLifecycleTrendsParams.js'; export * from './getLoginHistory401.js'; export * from './getLoginHistory404.js'; export * from './getMaintenance401.js'; @@ -888,22 +889,6 @@ export * from './instanceAdminStatsSchemaProductionChanges.js'; export * from './instanceInsightsSchema.js'; export * from './instanceInsightsSchemaEnvironmentTypeTrendsItem.js'; export * from './instanceInsightsSchemaFlagTrendsItem.js'; -export * from './instanceInsightsSchemaLifecycleTrends.js'; -export * from './instanceInsightsSchemaLifecycleTrendsCleanup.js'; -export * from './instanceInsightsSchemaLifecycleTrendsCleanupCategories.js'; -export * from './instanceInsightsSchemaLifecycleTrendsCleanupCategoriesExperimental.js'; -export * from './instanceInsightsSchemaLifecycleTrendsCleanupCategoriesPermanent.js'; -export * from './instanceInsightsSchemaLifecycleTrendsCleanupCategoriesRelease.js'; -export * from './instanceInsightsSchemaLifecycleTrendsDevelop.js'; -export * from './instanceInsightsSchemaLifecycleTrendsDevelopCategories.js'; -export * from './instanceInsightsSchemaLifecycleTrendsDevelopCategoriesExperimental.js'; -export * from './instanceInsightsSchemaLifecycleTrendsDevelopCategoriesPermanent.js'; -export * from './instanceInsightsSchemaLifecycleTrendsDevelopCategoriesRelease.js'; -export * from './instanceInsightsSchemaLifecycleTrendsProduction.js'; -export * from './instanceInsightsSchemaLifecycleTrendsProductionCategories.js'; -export * from './instanceInsightsSchemaLifecycleTrendsProductionCategoriesExperimental.js'; -export * from './instanceInsightsSchemaLifecycleTrendsProductionCategoriesPermanent.js'; -export * from './instanceInsightsSchemaLifecycleTrendsProductionCategoriesRelease.js'; export * from './instanceInsightsSchemaMetricsSummaryTrendsItem.js'; export * from './instanceInsightsSchemaProjectFlagTrendsItem.js'; export * from './instanceInsightsSchemaUserTrendsItem.js'; @@ -921,6 +906,23 @@ export * from './licenseUpdateSchema.js'; export * from './licensedUserSchema.js'; export * from './licensedUsersSchema.js'; export * from './licensedUsersSchemaLicensedUsers.js'; +export * from './lifecycleTrendsSchema.js'; +export * from './lifecycleTrendsSchemaLifecycleTrends.js'; +export * from './lifecycleTrendsSchemaLifecycleTrendsCleanup.js'; +export * from './lifecycleTrendsSchemaLifecycleTrendsCleanupCategories.js'; +export * from './lifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesExperimental.js'; +export * from './lifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesPermanent.js'; +export * from './lifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesRelease.js'; +export * from './lifecycleTrendsSchemaLifecycleTrendsDevelop.js'; +export * from './lifecycleTrendsSchemaLifecycleTrendsDevelopCategories.js'; +export * from './lifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesExperimental.js'; +export * from './lifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesPermanent.js'; +export * from './lifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesRelease.js'; +export * from './lifecycleTrendsSchemaLifecycleTrendsProduction.js'; +export * from './lifecycleTrendsSchemaLifecycleTrendsProductionCategories.js'; +export * from './lifecycleTrendsSchemaLifecycleTrendsProductionCategoriesExperimental.js'; +export * from './lifecycleTrendsSchemaLifecycleTrendsProductionCategoriesPermanent.js'; +export * from './lifecycleTrendsSchemaLifecycleTrendsProductionCategoriesRelease.js'; export * from './listParentOptions401.js'; export * from './listParentOptions403.js'; export * from './listParentOptions404.js'; diff --git a/frontend/src/openapi/models/instanceInsightsSchema.ts b/frontend/src/openapi/models/instanceInsightsSchema.ts index 5149a1a09b..640816e7d2 100644 --- a/frontend/src/openapi/models/instanceInsightsSchema.ts +++ b/frontend/src/openapi/models/instanceInsightsSchema.ts @@ -5,7 +5,6 @@ */ import type { InstanceInsightsSchemaEnvironmentTypeTrendsItem } from './instanceInsightsSchemaEnvironmentTypeTrendsItem.js'; import type { InstanceInsightsSchemaFlagTrendsItem } from './instanceInsightsSchemaFlagTrendsItem.js'; -import type { InstanceInsightsSchemaLifecycleTrends } from './instanceInsightsSchemaLifecycleTrends.js'; import type { InstanceInsightsSchemaMetricsSummaryTrendsItem } from './instanceInsightsSchemaMetricsSummaryTrendsItem.js'; import type { InstanceInsightsSchemaProjectFlagTrendsItem } from './instanceInsightsSchemaProjectFlagTrendsItem.js'; import type { InstanceInsightsSchemaUserTrendsItem } from './instanceInsightsSchemaUserTrendsItem.js'; @@ -18,8 +17,6 @@ export interface InstanceInsightsSchema { environmentTypeTrends: InstanceInsightsSchemaEnvironmentTypeTrendsItem[]; /** How number of flags changed over time */ flagTrends: InstanceInsightsSchemaFlagTrendsItem[]; - /** Aggregated view of feature flag lifecycle across environments */ - lifecycleTrends: InstanceInsightsSchemaLifecycleTrends; /** How metrics data per project changed over time */ metricsSummaryTrends: InstanceInsightsSchemaMetricsSummaryTrendsItem[]; /** How number of flags per project changed over time */ diff --git a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrends.ts b/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrends.ts deleted file mode 100644 index b537ab76bb..0000000000 --- a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrends.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Generated by Orval - * Do not edit manually. - * See `gen:api` script in package.json - */ -import type { InstanceInsightsSchemaLifecycleTrendsCleanup } from './instanceInsightsSchemaLifecycleTrendsCleanup.js'; -import type { InstanceInsightsSchemaLifecycleTrendsDevelop } from './instanceInsightsSchemaLifecycleTrendsDevelop.js'; -import type { InstanceInsightsSchemaLifecycleTrendsProduction } from './instanceInsightsSchemaLifecycleTrendsProduction.js'; - -/** - * Aggregated view of feature flag lifecycle across environments - */ -export type InstanceInsightsSchemaLifecycleTrends = { - cleanup: InstanceInsightsSchemaLifecycleTrendsCleanup; - develop: InstanceInsightsSchemaLifecycleTrendsDevelop; - production: InstanceInsightsSchemaLifecycleTrendsProduction; -}; diff --git a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsCleanup.ts b/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsCleanup.ts deleted file mode 100644 index d73ad9434b..0000000000 --- a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsCleanup.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Generated by Orval - * Do not edit manually. - * See `gen:api` script in package.json - */ -import type { InstanceInsightsSchemaLifecycleTrendsCleanupCategories } from './instanceInsightsSchemaLifecycleTrendsCleanupCategories.js'; - -export type InstanceInsightsSchemaLifecycleTrendsCleanup = { - averageTimeInStageDays: number; - categories: InstanceInsightsSchemaLifecycleTrendsCleanupCategories; - totalFlags: number; -}; diff --git a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsCleanupCategories.ts b/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsCleanupCategories.ts deleted file mode 100644 index da496b2d1f..0000000000 --- a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsCleanupCategories.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Generated by Orval - * Do not edit manually. - * See `gen:api` script in package.json - */ -import type { InstanceInsightsSchemaLifecycleTrendsCleanupCategoriesExperimental } from './instanceInsightsSchemaLifecycleTrendsCleanupCategoriesExperimental.js'; -import type { InstanceInsightsSchemaLifecycleTrendsCleanupCategoriesPermanent } from './instanceInsightsSchemaLifecycleTrendsCleanupCategoriesPermanent.js'; -import type { InstanceInsightsSchemaLifecycleTrendsCleanupCategoriesRelease } from './instanceInsightsSchemaLifecycleTrendsCleanupCategoriesRelease.js'; - -export type InstanceInsightsSchemaLifecycleTrendsCleanupCategories = { - experimental: InstanceInsightsSchemaLifecycleTrendsCleanupCategoriesExperimental; - permanent: InstanceInsightsSchemaLifecycleTrendsCleanupCategoriesPermanent; - release: InstanceInsightsSchemaLifecycleTrendsCleanupCategoriesRelease; -}; diff --git a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsDevelop.ts b/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsDevelop.ts deleted file mode 100644 index b25da5debd..0000000000 --- a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsDevelop.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Generated by Orval - * Do not edit manually. - * See `gen:api` script in package.json - */ -import type { InstanceInsightsSchemaLifecycleTrendsDevelopCategories } from './instanceInsightsSchemaLifecycleTrendsDevelopCategories.js'; - -export type InstanceInsightsSchemaLifecycleTrendsDevelop = { - averageTimeInStageDays: number; - categories: InstanceInsightsSchemaLifecycleTrendsDevelopCategories; - totalFlags: number; -}; diff --git a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsDevelopCategories.ts b/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsDevelopCategories.ts deleted file mode 100644 index 3f58930aea..0000000000 --- a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsDevelopCategories.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Generated by Orval - * Do not edit manually. - * See `gen:api` script in package.json - */ -import type { InstanceInsightsSchemaLifecycleTrendsDevelopCategoriesExperimental } from './instanceInsightsSchemaLifecycleTrendsDevelopCategoriesExperimental.js'; -import type { InstanceInsightsSchemaLifecycleTrendsDevelopCategoriesPermanent } from './instanceInsightsSchemaLifecycleTrendsDevelopCategoriesPermanent.js'; -import type { InstanceInsightsSchemaLifecycleTrendsDevelopCategoriesRelease } from './instanceInsightsSchemaLifecycleTrendsDevelopCategoriesRelease.js'; - -export type InstanceInsightsSchemaLifecycleTrendsDevelopCategories = { - experimental: InstanceInsightsSchemaLifecycleTrendsDevelopCategoriesExperimental; - permanent: InstanceInsightsSchemaLifecycleTrendsDevelopCategoriesPermanent; - release: InstanceInsightsSchemaLifecycleTrendsDevelopCategoriesRelease; -}; diff --git a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsProduction.ts b/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsProduction.ts deleted file mode 100644 index 3d269cb121..0000000000 --- a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsProduction.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Generated by Orval - * Do not edit manually. - * See `gen:api` script in package.json - */ -import type { InstanceInsightsSchemaLifecycleTrendsProductionCategories } from './instanceInsightsSchemaLifecycleTrendsProductionCategories.js'; - -export type InstanceInsightsSchemaLifecycleTrendsProduction = { - averageTimeInStageDays: number; - categories: InstanceInsightsSchemaLifecycleTrendsProductionCategories; - totalFlags: number; -}; diff --git a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsProductionCategories.ts b/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsProductionCategories.ts deleted file mode 100644 index 0568d5030c..0000000000 --- a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsProductionCategories.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Generated by Orval - * Do not edit manually. - * See `gen:api` script in package.json - */ -import type { InstanceInsightsSchemaLifecycleTrendsProductionCategoriesExperimental } from './instanceInsightsSchemaLifecycleTrendsProductionCategoriesExperimental.js'; -import type { InstanceInsightsSchemaLifecycleTrendsProductionCategoriesPermanent } from './instanceInsightsSchemaLifecycleTrendsProductionCategoriesPermanent.js'; -import type { InstanceInsightsSchemaLifecycleTrendsProductionCategoriesRelease } from './instanceInsightsSchemaLifecycleTrendsProductionCategoriesRelease.js'; - -export type InstanceInsightsSchemaLifecycleTrendsProductionCategories = { - experimental: InstanceInsightsSchemaLifecycleTrendsProductionCategoriesExperimental; - permanent: InstanceInsightsSchemaLifecycleTrendsProductionCategoriesPermanent; - release: InstanceInsightsSchemaLifecycleTrendsProductionCategoriesRelease; -}; diff --git a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsProductionCategoriesRelease.ts b/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsProductionCategoriesRelease.ts deleted file mode 100644 index 2772134e1c..0000000000 --- a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsProductionCategoriesRelease.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Generated by Orval - * Do not edit manually. - * See `gen:api` script in package.json - */ - -export type InstanceInsightsSchemaLifecycleTrendsProductionCategoriesRelease = { - flagsOlderThanWeek: number; - newFlagsThisWeek: number; -}; diff --git a/frontend/src/openapi/models/lifecycleTrendsSchema.ts b/frontend/src/openapi/models/lifecycleTrendsSchema.ts new file mode 100644 index 0000000000..d5ddfb923d --- /dev/null +++ b/frontend/src/openapi/models/lifecycleTrendsSchema.ts @@ -0,0 +1,14 @@ +/** + * Generated by Orval + * Do not edit manually. + * See `gen:api` script in package.json + */ +import type { LifecycleTrendsSchemaLifecycleTrends } from './lifecycleTrendsSchemaLifecycleTrends.js'; + +/** + * Aggregated view of feature flag lifecycle trends across environments + */ +export interface LifecycleTrendsSchema { + /** Aggregated view of feature flag lifecycle across environments */ + lifecycleTrends: LifecycleTrendsSchemaLifecycleTrends; +} diff --git a/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrends.ts b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrends.ts new file mode 100644 index 0000000000..d7a7b92b8a --- /dev/null +++ b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrends.ts @@ -0,0 +1,17 @@ +/** + * Generated by Orval + * Do not edit manually. + * See `gen:api` script in package.json + */ +import type { LifecycleTrendsSchemaLifecycleTrendsCleanup } from './lifecycleTrendsSchemaLifecycleTrendsCleanup.js'; +import type { LifecycleTrendsSchemaLifecycleTrendsDevelop } from './lifecycleTrendsSchemaLifecycleTrendsDevelop.js'; +import type { LifecycleTrendsSchemaLifecycleTrendsProduction } from './lifecycleTrendsSchemaLifecycleTrendsProduction.js'; + +/** + * Aggregated view of feature flag lifecycle across environments + */ +export type LifecycleTrendsSchemaLifecycleTrends = { + cleanup: LifecycleTrendsSchemaLifecycleTrendsCleanup; + develop: LifecycleTrendsSchemaLifecycleTrendsDevelop; + production: LifecycleTrendsSchemaLifecycleTrendsProduction; +}; diff --git a/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsCleanup.ts b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsCleanup.ts new file mode 100644 index 0000000000..7fcea8223a --- /dev/null +++ b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsCleanup.ts @@ -0,0 +1,13 @@ +/** + * Generated by Orval + * Do not edit manually. + * See `gen:api` script in package.json + */ +import type { LifecycleTrendsSchemaLifecycleTrendsCleanupCategories } from './lifecycleTrendsSchemaLifecycleTrendsCleanupCategories.js'; + +export type LifecycleTrendsSchemaLifecycleTrendsCleanup = { + categories: LifecycleTrendsSchemaLifecycleTrendsCleanupCategories; + medianDaysHistorically: number; + medianDaysInCurrentStage: number; + totalFlags: number; +}; diff --git a/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsCleanupCategories.ts b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsCleanupCategories.ts new file mode 100644 index 0000000000..421995a439 --- /dev/null +++ b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsCleanupCategories.ts @@ -0,0 +1,14 @@ +/** + * Generated by Orval + * Do not edit manually. + * See `gen:api` script in package.json + */ +import type { LifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesExperimental } from './lifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesExperimental.js'; +import type { LifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesPermanent } from './lifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesPermanent.js'; +import type { LifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesRelease } from './lifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesRelease.js'; + +export type LifecycleTrendsSchemaLifecycleTrendsCleanupCategories = { + experimental: LifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesExperimental; + permanent: LifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesPermanent; + release: LifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesRelease; +}; diff --git a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsDevelopCategoriesExperimental.ts b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesExperimental.ts similarity index 68% rename from frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsDevelopCategoriesExperimental.ts rename to frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesExperimental.ts index 3a99be69ff..a4a7eb8a30 100644 --- a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsDevelopCategoriesExperimental.ts +++ b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesExperimental.ts @@ -4,7 +4,7 @@ * See `gen:api` script in package.json */ -export type InstanceInsightsSchemaLifecycleTrendsDevelopCategoriesExperimental = +export type LifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesExperimental = { flagsOlderThanWeek: number; newFlagsThisWeek: number; diff --git a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsCleanupCategoriesPermanent.ts b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesPermanent.ts similarity index 66% rename from frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsCleanupCategoriesPermanent.ts rename to frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesPermanent.ts index 45c17efd10..5e48c399ca 100644 --- a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsCleanupCategoriesPermanent.ts +++ b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesPermanent.ts @@ -4,7 +4,7 @@ * See `gen:api` script in package.json */ -export type InstanceInsightsSchemaLifecycleTrendsCleanupCategoriesPermanent = { +export type LifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesPermanent = { flagsOlderThanWeek: number; newFlagsThisWeek: number; }; diff --git a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsCleanupCategoriesRelease.ts b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesRelease.ts similarity index 67% rename from frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsCleanupCategoriesRelease.ts rename to frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesRelease.ts index 215eb85cf6..e4a0224ecf 100644 --- a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsCleanupCategoriesRelease.ts +++ b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesRelease.ts @@ -4,7 +4,7 @@ * See `gen:api` script in package.json */ -export type InstanceInsightsSchemaLifecycleTrendsCleanupCategoriesRelease = { +export type LifecycleTrendsSchemaLifecycleTrendsCleanupCategoriesRelease = { flagsOlderThanWeek: number; newFlagsThisWeek: number; }; diff --git a/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsDevelop.ts b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsDevelop.ts new file mode 100644 index 0000000000..b2f4d866a3 --- /dev/null +++ b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsDevelop.ts @@ -0,0 +1,13 @@ +/** + * Generated by Orval + * Do not edit manually. + * See `gen:api` script in package.json + */ +import type { LifecycleTrendsSchemaLifecycleTrendsDevelopCategories } from './lifecycleTrendsSchemaLifecycleTrendsDevelopCategories.js'; + +export type LifecycleTrendsSchemaLifecycleTrendsDevelop = { + categories: LifecycleTrendsSchemaLifecycleTrendsDevelopCategories; + medianDaysHistorically: number; + medianDaysInCurrentStage: number; + totalFlags: number; +}; diff --git a/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsDevelopCategories.ts b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsDevelopCategories.ts new file mode 100644 index 0000000000..218a6d9b01 --- /dev/null +++ b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsDevelopCategories.ts @@ -0,0 +1,14 @@ +/** + * Generated by Orval + * Do not edit manually. + * See `gen:api` script in package.json + */ +import type { LifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesExperimental } from './lifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesExperimental.js'; +import type { LifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesPermanent } from './lifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesPermanent.js'; +import type { LifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesRelease } from './lifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesRelease.js'; + +export type LifecycleTrendsSchemaLifecycleTrendsDevelopCategories = { + experimental: LifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesExperimental; + permanent: LifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesPermanent; + release: LifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesRelease; +}; diff --git a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsProductionCategoriesPermanent.ts b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesExperimental.ts similarity index 68% rename from frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsProductionCategoriesPermanent.ts rename to frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesExperimental.ts index 46a4a6f825..e914b48f10 100644 --- a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsProductionCategoriesPermanent.ts +++ b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesExperimental.ts @@ -4,7 +4,7 @@ * See `gen:api` script in package.json */ -export type InstanceInsightsSchemaLifecycleTrendsProductionCategoriesPermanent = +export type LifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesExperimental = { flagsOlderThanWeek: number; newFlagsThisWeek: number; diff --git a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsDevelopCategoriesPermanent.ts b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesPermanent.ts similarity index 66% rename from frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsDevelopCategoriesPermanent.ts rename to frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesPermanent.ts index 2888df2598..db46cb6b44 100644 --- a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsDevelopCategoriesPermanent.ts +++ b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesPermanent.ts @@ -4,7 +4,7 @@ * See `gen:api` script in package.json */ -export type InstanceInsightsSchemaLifecycleTrendsDevelopCategoriesPermanent = { +export type LifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesPermanent = { flagsOlderThanWeek: number; newFlagsThisWeek: number; }; diff --git a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsDevelopCategoriesRelease.ts b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesRelease.ts similarity index 67% rename from frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsDevelopCategoriesRelease.ts rename to frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesRelease.ts index 0413ae30be..e216caa086 100644 --- a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsDevelopCategoriesRelease.ts +++ b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesRelease.ts @@ -4,7 +4,7 @@ * See `gen:api` script in package.json */ -export type InstanceInsightsSchemaLifecycleTrendsDevelopCategoriesRelease = { +export type LifecycleTrendsSchemaLifecycleTrendsDevelopCategoriesRelease = { flagsOlderThanWeek: number; newFlagsThisWeek: number; }; diff --git a/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsProduction.ts b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsProduction.ts new file mode 100644 index 0000000000..0931566d3c --- /dev/null +++ b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsProduction.ts @@ -0,0 +1,13 @@ +/** + * Generated by Orval + * Do not edit manually. + * See `gen:api` script in package.json + */ +import type { LifecycleTrendsSchemaLifecycleTrendsProductionCategories } from './lifecycleTrendsSchemaLifecycleTrendsProductionCategories.js'; + +export type LifecycleTrendsSchemaLifecycleTrendsProduction = { + categories: LifecycleTrendsSchemaLifecycleTrendsProductionCategories; + medianDaysHistorically: number; + medianDaysInCurrentStage: number; + totalFlags: number; +}; diff --git a/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsProductionCategories.ts b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsProductionCategories.ts new file mode 100644 index 0000000000..7d5d5e5a54 --- /dev/null +++ b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsProductionCategories.ts @@ -0,0 +1,14 @@ +/** + * Generated by Orval + * Do not edit manually. + * See `gen:api` script in package.json + */ +import type { LifecycleTrendsSchemaLifecycleTrendsProductionCategoriesExperimental } from './lifecycleTrendsSchemaLifecycleTrendsProductionCategoriesExperimental.js'; +import type { LifecycleTrendsSchemaLifecycleTrendsProductionCategoriesPermanent } from './lifecycleTrendsSchemaLifecycleTrendsProductionCategoriesPermanent.js'; +import type { LifecycleTrendsSchemaLifecycleTrendsProductionCategoriesRelease } from './lifecycleTrendsSchemaLifecycleTrendsProductionCategoriesRelease.js'; + +export type LifecycleTrendsSchemaLifecycleTrendsProductionCategories = { + experimental: LifecycleTrendsSchemaLifecycleTrendsProductionCategoriesExperimental; + permanent: LifecycleTrendsSchemaLifecycleTrendsProductionCategoriesPermanent; + release: LifecycleTrendsSchemaLifecycleTrendsProductionCategoriesRelease; +}; diff --git a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsProductionCategoriesExperimental.ts b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsProductionCategoriesExperimental.ts similarity index 68% rename from frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsProductionCategoriesExperimental.ts rename to frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsProductionCategoriesExperimental.ts index bc24c91469..f2f8200e99 100644 --- a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsProductionCategoriesExperimental.ts +++ b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsProductionCategoriesExperimental.ts @@ -4,7 +4,7 @@ * See `gen:api` script in package.json */ -export type InstanceInsightsSchemaLifecycleTrendsProductionCategoriesExperimental = +export type LifecycleTrendsSchemaLifecycleTrendsProductionCategoriesExperimental = { flagsOlderThanWeek: number; newFlagsThisWeek: number; diff --git a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsCleanupCategoriesExperimental.ts b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsProductionCategoriesPermanent.ts similarity index 68% rename from frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsCleanupCategoriesExperimental.ts rename to frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsProductionCategoriesPermanent.ts index 04eebe0f2c..b0259a24e6 100644 --- a/frontend/src/openapi/models/instanceInsightsSchemaLifecycleTrendsCleanupCategoriesExperimental.ts +++ b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsProductionCategoriesPermanent.ts @@ -4,7 +4,7 @@ * See `gen:api` script in package.json */ -export type InstanceInsightsSchemaLifecycleTrendsCleanupCategoriesExperimental = +export type LifecycleTrendsSchemaLifecycleTrendsProductionCategoriesPermanent = { flagsOlderThanWeek: number; newFlagsThisWeek: number; diff --git a/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsProductionCategoriesRelease.ts b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsProductionCategoriesRelease.ts new file mode 100644 index 0000000000..a78ade87ca --- /dev/null +++ b/frontend/src/openapi/models/lifecycleTrendsSchemaLifecycleTrendsProductionCategoriesRelease.ts @@ -0,0 +1,10 @@ +/** + * Generated by Orval + * Do not edit manually. + * See `gen:api` script in package.json + */ + +export type LifecycleTrendsSchemaLifecycleTrendsProductionCategoriesRelease = { + flagsOlderThanWeek: number; + newFlagsThisWeek: number; +};