mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Chore: convert settings page to function component (#43731)
This commit is contained in:
parent
a30ca86084
commit
8cf63a9d44
@ -1,4 +1,4 @@
|
|||||||
import React, { FC, useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import Page from 'app/core/components/Page/Page';
|
import Page from 'app/core/components/Page/Page';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import { StoreState, OrgUser, AccessControlAction } from 'app/types';
|
import { StoreState, OrgUser, AccessControlAction } from 'app/types';
|
||||||
@ -37,7 +37,7 @@ const removeOrgUser = async (orgUser: OrgUser, orgId: UrlQueryValue) => {
|
|||||||
|
|
||||||
interface Props extends GrafanaRouteComponentProps<{ id: string }> {}
|
interface Props extends GrafanaRouteComponentProps<{ id: string }> {}
|
||||||
|
|
||||||
export const AdminEditOrgPage: FC<Props> = ({ match }) => {
|
export default function AdminEditOrgPage({ match }: Props) {
|
||||||
const navIndex = useSelector((state: StoreState) => state.navIndex);
|
const navIndex = useSelector((state: StoreState) => state.navIndex);
|
||||||
const navModel = getNavModel(navIndex, 'global-orgs');
|
const navModel = getNavModel(navIndex, 'global-orgs');
|
||||||
const orgId = parseInt(match.params.id, 10);
|
const orgId = parseInt(match.params.id, 10);
|
||||||
@ -123,6 +123,4 @@ export const AdminEditOrgPage: FC<Props> = ({ match }) => {
|
|||||||
</Page.Contents>
|
</Page.Contents>
|
||||||
</Page>
|
</Page>
|
||||||
);
|
);
|
||||||
};
|
}
|
||||||
|
|
||||||
export default AdminEditOrgPage;
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import React, { FC, useEffect } from 'react';
|
import React, { useEffect } from 'react';
|
||||||
import { getNavModel } from 'app/core/selectors/navModel';
|
import { getNavModel } from 'app/core/selectors/navModel';
|
||||||
import Page from 'app/core/components/Page/Page';
|
import Page from 'app/core/components/Page/Page';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
@ -22,7 +22,7 @@ const getErrorMessage = (error: any) => {
|
|||||||
return error?.data?.message || 'An unexpected error happened.';
|
return error?.data?.message || 'An unexpected error happened.';
|
||||||
};
|
};
|
||||||
|
|
||||||
export const AdminListOrgsPages: FC = () => {
|
export default function AdminListOrgsPages() {
|
||||||
const navIndex = useSelector((state: StoreState) => state.navIndex);
|
const navIndex = useSelector((state: StoreState) => state.navIndex);
|
||||||
const navModel = getNavModel(navIndex, 'global-orgs');
|
const navModel = getNavModel(navIndex, 'global-orgs');
|
||||||
const [state, fetchOrgs] = useAsyncFn(async () => await getOrgs(), []);
|
const [state, fetchOrgs] = useAsyncFn(async () => await getOrgs(), []);
|
||||||
@ -56,6 +56,4 @@ export const AdminListOrgsPages: FC = () => {
|
|||||||
</Page.Contents>
|
</Page.Contents>
|
||||||
</Page>
|
</Page>
|
||||||
);
|
);
|
||||||
};
|
}
|
||||||
|
|
||||||
export default AdminListOrgsPages;
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import React, { FC, useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
import { AccessControlAction, Organization } from 'app/types';
|
import { AccessControlAction, Organization } from 'app/types';
|
||||||
import { Button, ConfirmModal } from '@grafana/ui';
|
import { Button, ConfirmModal } from '@grafana/ui';
|
||||||
import { contextSrv } from 'app/core/core';
|
import { contextSrv } from 'app/core/core';
|
||||||
@ -8,7 +8,7 @@ interface Props {
|
|||||||
onDelete: (orgId: number) => void;
|
onDelete: (orgId: number) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const AdminOrgsTable: FC<Props> = ({ orgs, onDelete }) => {
|
export function AdminOrgsTable({ orgs, onDelete }: Props) {
|
||||||
const canDeleteOrgs = contextSrv.hasPermission(AccessControlAction.OrgsDelete);
|
const canDeleteOrgs = contextSrv.hasPermission(AccessControlAction.OrgsDelete);
|
||||||
|
|
||||||
const [deleteOrg, setDeleteOrg] = useState<Organization>();
|
const [deleteOrg, setDeleteOrg] = useState<Organization>();
|
||||||
@ -64,4 +64,4 @@ export const AdminOrgsTable: FC<Props> = ({ orgs, onDelete }) => {
|
|||||||
)}
|
)}
|
||||||
</table>
|
</table>
|
||||||
);
|
);
|
||||||
};
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
|
import { useAsync } from 'react-use';
|
||||||
import { getBackendSrv } from '@grafana/runtime';
|
import { getBackendSrv } from '@grafana/runtime';
|
||||||
import { NavModel } from '@grafana/data';
|
import { NavModel } from '@grafana/data';
|
||||||
|
|
||||||
@ -13,37 +14,21 @@ interface Props {
|
|||||||
navModel: NavModel;
|
navModel: NavModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface State {
|
function AdminSettings({ navModel }: Props) {
|
||||||
settings: Settings;
|
const { loading, value: settings } = useAsync(
|
||||||
isLoading: boolean;
|
() => getBackendSrv().get('/api/admin/settings') as Promise<Settings>,
|
||||||
}
|
[]
|
||||||
|
);
|
||||||
export class AdminSettings extends React.PureComponent<Props, State> {
|
|
||||||
state: State = {
|
|
||||||
settings: {},
|
|
||||||
isLoading: true,
|
|
||||||
};
|
|
||||||
|
|
||||||
async componentDidMount() {
|
|
||||||
const settings: Settings = await getBackendSrv().get('/api/admin/settings');
|
|
||||||
this.setState({
|
|
||||||
settings,
|
|
||||||
isLoading: false,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const { settings, isLoading } = this.state;
|
|
||||||
const { navModel } = this.props;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Page navModel={navModel}>
|
<Page navModel={navModel}>
|
||||||
<Page.Contents isLoading={isLoading}>
|
<Page.Contents isLoading={loading}>
|
||||||
<div className="grafana-info-box span8" style={{ margin: '20px 0 25px 0' }}>
|
<div className="grafana-info-box span8" style={{ margin: '20px 0 25px 0' }}>
|
||||||
These system settings are defined in grafana.ini or custom.ini (or overridden in ENV variables). To change
|
These system settings are defined in grafana.ini or custom.ini (or overridden in ENV variables). To change
|
||||||
these you currently need to restart Grafana.
|
these you currently need to restart Grafana.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{settings && (
|
||||||
<table className="filter-table">
|
<table className="filter-table">
|
||||||
<tbody>
|
<tbody>
|
||||||
{Object.entries(settings).map(([sectionName, sectionSettings], i) => (
|
{Object.entries(settings).map(([sectionName, sectionSettings], i) => (
|
||||||
@ -62,11 +47,11 @@ export class AdminSettings extends React.PureComponent<Props, State> {
|
|||||||
))}
|
))}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
)}
|
||||||
</Page.Contents>
|
</Page.Contents>
|
||||||
</Page>
|
</Page>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
const mapStateToProps = (state: StoreState) => ({
|
const mapStateToProps = (state: StoreState) => ({
|
||||||
navModel: getNavModel(state.navIndex, 'server-settings'),
|
navModel: getNavModel(state.navIndex, 'server-settings'),
|
||||||
|
@ -32,9 +32,10 @@ interface Props {
|
|||||||
header: string;
|
header: string;
|
||||||
subheader?: string;
|
subheader?: string;
|
||||||
editionNotice?: string;
|
editionNotice?: string;
|
||||||
|
children?: React.ReactNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const LicenseChrome: React.FC<Props> = ({ header, editionNotice, subheader, children }) => {
|
export function LicenseChrome({ header, editionNotice, subheader, children }: Props) {
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const styles = getStyles(theme);
|
const styles = getStyles(theme);
|
||||||
|
|
||||||
@ -68,7 +69,7 @@ export const LicenseChrome: React.FC<Props> = ({ header, editionNotice, subheade
|
|||||||
{editionNotice && <div className={styles.footer}>{editionNotice}</div>}
|
{editionNotice && <div className={styles.footer}>{editionNotice}</div>}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
}
|
||||||
|
|
||||||
interface CircleProps {
|
interface CircleProps {
|
||||||
size: string;
|
size: string;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import React, { FC } from 'react';
|
import React from 'react';
|
||||||
import { OrgRole } from '@grafana/data';
|
import { OrgRole } from '@grafana/data';
|
||||||
import { Select } from '@grafana/ui';
|
import { Select } from '@grafana/ui';
|
||||||
|
|
||||||
@ -13,14 +13,7 @@ interface Props {
|
|||||||
|
|
||||||
const options = Object.keys(OrgRole).map((key) => ({ label: key, value: key }));
|
const options = Object.keys(OrgRole).map((key) => ({ label: key, value: key }));
|
||||||
|
|
||||||
export const OrgRolePicker: FC<Props> = ({
|
export function OrgRolePicker({ value, onChange, 'aria-label': ariaLabel, inputId, autoFocus, ...restProps }: Props) {
|
||||||
value,
|
|
||||||
onChange,
|
|
||||||
'aria-label': ariaLabel,
|
|
||||||
inputId,
|
|
||||||
autoFocus,
|
|
||||||
...restProps
|
|
||||||
}) => {
|
|
||||||
return (
|
return (
|
||||||
<Select
|
<Select
|
||||||
menuShouldPortal
|
menuShouldPortal
|
||||||
@ -34,4 +27,4 @@ export const OrgRolePicker: FC<Props> = ({
|
|||||||
{...restProps}
|
{...restProps}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
}
|
||||||
|
@ -13,7 +13,7 @@ interface Props {
|
|||||||
navModel: NavModel;
|
navModel: NavModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const UpgradePage: React.FC<Props> = ({ navModel }) => {
|
export function UpgradePage({ navModel }: Props) {
|
||||||
return (
|
return (
|
||||||
<Page navModel={navModel}>
|
<Page navModel={navModel}>
|
||||||
<Page.Contents>
|
<Page.Contents>
|
||||||
@ -25,7 +25,7 @@ export const UpgradePage: React.FC<Props> = ({ navModel }) => {
|
|||||||
</Page.Contents>
|
</Page.Contents>
|
||||||
</Page>
|
</Page>
|
||||||
);
|
);
|
||||||
};
|
}
|
||||||
|
|
||||||
const titleStyles = { fontWeight: 500, fontSize: '26px', lineHeight: '123%' };
|
const titleStyles = { fontWeight: 500, fontSize: '26px', lineHeight: '123%' };
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user