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