mirror of https://github.com/grafana/grafana
Feat: Feature toggle admin page frontend interface (#72164)
* feature toggles admin page proto * feature toggle admin page proto * keep phase 1 code only * latest update with api * fix * fix * add correct premissions in admin.go * move behind toggle * Use InteractiveTable * guard behind feature toggle * use RTK * route in api.go * fixespull/72845/head
parent
2d98e95cc9
commit
0d48ac2419
@ -0,0 +1,34 @@ |
|||||||
|
import { createApi, BaseQueryFn } from '@reduxjs/toolkit/query/react'; |
||||||
|
import { lastValueFrom } from 'rxjs'; |
||||||
|
|
||||||
|
import { getBackendSrv } from '@grafana/runtime'; |
||||||
|
|
||||||
|
const backendSrvBaseQuery = |
||||||
|
({ baseUrl }: { baseUrl: string }): BaseQueryFn<{ url: string }> => |
||||||
|
async ({ url }) => { |
||||||
|
try { |
||||||
|
const { data } = await lastValueFrom(getBackendSrv().fetch({ url: baseUrl + url })); |
||||||
|
return { data }; |
||||||
|
} catch (error) { |
||||||
|
return { error }; |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
export const togglesApi = createApi({ |
||||||
|
reducerPath: 'togglesApi', |
||||||
|
baseQuery: backendSrvBaseQuery({ baseUrl: '/api' }), |
||||||
|
endpoints: (builder) => ({ |
||||||
|
getFeatureToggles: builder.query<FeatureToggle[], void>({ |
||||||
|
query: () => ({ url: '/featuremgmt' }), |
||||||
|
}), |
||||||
|
}), |
||||||
|
}); |
||||||
|
|
||||||
|
type FeatureToggle = { |
||||||
|
name: string; |
||||||
|
enabled: boolean; |
||||||
|
description: string; |
||||||
|
}; |
||||||
|
|
||||||
|
export const { useGetFeatureTogglesQuery } = togglesApi; |
||||||
|
export type { FeatureToggle }; |
||||||
@ -0,0 +1,26 @@ |
|||||||
|
import React from 'react'; |
||||||
|
|
||||||
|
import { Page } from 'app/core/components/Page/Page'; |
||||||
|
|
||||||
|
import { useGetFeatureTogglesQuery } from './AdminFeatureTogglesAPI'; |
||||||
|
import { AdminFeatureTogglesTable } from './AdminFeatureTogglesTable'; |
||||||
|
|
||||||
|
export default function AdminFeatureTogglesPage() { |
||||||
|
const { data: featureToggles, isLoading, isError } = useGetFeatureTogglesQuery(); |
||||||
|
|
||||||
|
const getErrorMessage = () => { |
||||||
|
return 'Error fetching feature toggles'; |
||||||
|
}; |
||||||
|
|
||||||
|
return ( |
||||||
|
<Page navId="feature-toggles"> |
||||||
|
<Page.Contents> |
||||||
|
<> |
||||||
|
{isError && getErrorMessage()} |
||||||
|
{isLoading && 'Fetching feature toggles'} |
||||||
|
{featureToggles && <AdminFeatureTogglesTable featureToggles={featureToggles} />} |
||||||
|
</> |
||||||
|
</Page.Contents> |
||||||
|
</Page> |
||||||
|
); |
||||||
|
} |
||||||
@ -0,0 +1,35 @@ |
|||||||
|
import React from 'react'; |
||||||
|
|
||||||
|
import { Switch, InteractiveTable, type CellProps } from '@grafana/ui'; |
||||||
|
|
||||||
|
import { type FeatureToggle } from './AdminFeatureTogglesAPI'; |
||||||
|
|
||||||
|
interface Props { |
||||||
|
featureToggles: FeatureToggle[]; |
||||||
|
} |
||||||
|
|
||||||
|
export function AdminFeatureTogglesTable({ featureToggles }: Props) { |
||||||
|
const columns = [ |
||||||
|
{ |
||||||
|
id: 'name', |
||||||
|
header: 'Name', |
||||||
|
cell: ({ cell: { value } }: CellProps<FeatureToggle, string>) => <div>{value}</div>, |
||||||
|
}, |
||||||
|
{ |
||||||
|
id: 'description', |
||||||
|
header: 'Description', |
||||||
|
cell: ({ cell: { value } }: CellProps<FeatureToggle, string>) => <div>{value}</div>, |
||||||
|
}, |
||||||
|
{ |
||||||
|
id: 'enabled', |
||||||
|
header: 'State', |
||||||
|
cell: ({ cell: { value } }: CellProps<FeatureToggle, boolean>) => ( |
||||||
|
<div> |
||||||
|
<Switch value={value} disabled={true} /> |
||||||
|
</div> |
||||||
|
), |
||||||
|
}, |
||||||
|
]; |
||||||
|
|
||||||
|
return <InteractiveTable columns={columns} data={featureToggles} getRowId={(featureToggle) => featureToggle.name} />; |
||||||
|
} |
||||||
Loading…
Reference in new issue