grafana/public/app/features/users/UsersListPage.tsx

123 lines
3.3 KiB
TypeScript
Raw Normal View History

import React, { useEffect, useState } from 'react';
import { connect, ConnectedProps } from 'react-redux';
import { renderMarkdown } from '@grafana/data';
import { Page } from 'app/core/components/Page/Page';
import { contextSrv } from 'app/core/core';
import { OrgUser, OrgRole, StoreState } from 'app/types';
import { OrgUsersTable } from '../admin/Users/OrgUsersTable';
import InviteesTable from '../invites/InviteesTable';
import { fetchInvitees } from '../invites/state/actions';
import { selectInvitesMatchingQuery } from '../invites/state/selectors';
import { UsersActionBar } from './UsersActionBar';
import { loadUsers, removeUser, updateUser, changePage, changeSort } from './state/actions';
import { getUsers, getUsersSearchQuery } from './state/selectors';
2018-10-03 02:43:10 -05:00
function mapStateToProps(state: StoreState) {
const searchQuery = getUsersSearchQuery(state.users);
return {
users: getUsers(state.users),
searchQuery: getUsersSearchQuery(state.users),
page: state.users.page,
totalPages: state.users.totalPages,
perPage: state.users.perPage,
invitees: selectInvitesMatchingQuery(state.invites, searchQuery),
externalUserMngInfo: state.users.externalUserMngInfo,
isLoading: state.users.isLoading,
rolesLoading: state.users.rolesLoading,
};
2018-10-03 02:43:10 -05:00
}
const mapDispatchToProps = {
loadUsers,
fetchInvitees,
changePage,
changeSort,
updateUser,
removeUser,
};
const connector = connect(mapStateToProps, mapDispatchToProps);
export type Props = ConnectedProps<typeof connector>;
2018-10-03 02:43:10 -05:00
export interface State {
showInvites: boolean;
}
export const UsersListPageUnconnected = ({
users,
page,
totalPages,
invitees,
externalUserMngInfo,
isLoading,
rolesLoading,
loadUsers,
fetchInvitees,
changePage,
updateUser,
removeUser,
changeSort,
}: Props) => {
const [showInvites, setShowInvites] = useState(false);
const externalUserMngInfoHtml = externalUserMngInfo ? renderMarkdown(externalUserMngInfo) : '';
2018-10-03 02:43:10 -05:00
useEffect(() => {
loadUsers();
fetchInvitees();
}, [fetchInvitees, loadUsers]);
2018-10-03 02:43:10 -05:00
const onRoleChange = (role: OrgRole, user: OrgUser) => {
updateUser({ ...user, role: role });
2018-10-03 02:43:10 -05:00
};
const onRemoveUser = (user: OrgUser) => removeUser(user.userId);
const onShowInvites = () => {
setShowInvites(!showInvites);
};
const renderTable = () => {
if (showInvites) {
2018-12-14 06:49:14 -06:00
return <InviteesTable invitees={invitees} />;
2018-10-11 04:49:34 -05:00
} else {
return (
<OrgUsersTable
users={users}
orgId={contextSrv.user.orgId}
rolesLoading={rolesLoading}
onRoleChange={onRoleChange}
onRemoveUser={onRemoveUser}
fetchData={changeSort}
changePage={changePage}
page={page}
totalPages={totalPages}
/>
2018-10-11 04:49:34 -05:00
);
}
};
return (
<Page.Contents isLoading={!isLoading}>
<UsersActionBar onShowInvites={onShowInvites} showInvites={showInvites} />
{externalUserMngInfoHtml && (
<div className="grafana-info-box" dangerouslySetInnerHTML={{ __html: externalUserMngInfoHtml }} />
)}
{isLoading && renderTable()}
</Page.Contents>
);
};
2018-10-03 02:43:10 -05:00
export const UsersListPageContent = connector(UsersListPageUnconnected);
export default function UsersListPage() {
return (
<Page navId="users">
<UsersListPageContent />
</Page>
);
}