//
// SPDX-License-Identifier: AGPL-3.0
-import * as React from 'react';
-import { WithStyles, withStyles, Typography, Tabs, Tab, Paper, Button, Grid } from '@material-ui/core';
-import { DataExplorer } from "~/views-components/data-explorer/data-explorer";
+import React from 'react';
+import { WithStyles, withStyles, Paper, Typography } from '@material-ui/core';
+import { DataExplorer } from "views-components/data-explorer/data-explorer";
import { connect, DispatchProp } from 'react-redux';
-import { DataColumns } from '~/components/data-table/data-table';
-import { RootState } from '~/store/store';
-import { SortDirection } from '~/components/data-table/data-column';
-import { openContextMenu } from "~/store/context-menu/context-menu-actions";
-import { getResource, ResourcesState } from "~/store/resources/resources";
+import { DataColumns } from 'components/data-table/data-table';
+import { RootState } from 'store/store';
+import { SortDirection } from 'components/data-table/data-column';
+import { openUserContextMenu } from "store/context-menu/context-menu-actions";
+import { getResource, ResourcesState } from "store/resources/resources";
import {
- ResourceFirstName,
- ResourceLastName,
+ UserResourceFullName,
ResourceUuid,
ResourceEmail,
- ResourceIsActive,
ResourceIsAdmin,
- ResourceUsername
-} from "~/views-components/data-explorer/renderers";
-import { navigateTo } from "~/store/navigation/navigation-action";
-import { ContextMenuKind } from "~/views-components/context-menu/context-menu";
-import { DataTableDefaultView } from '~/components/data-table-default-view/data-table-default-view';
-import { createTree } from '~/models/tree';
+ ResourceUsername,
+ UserResourceAccountStatus,
+} from "views-components/data-explorer/renderers";
+import { navigateToUserProfile } from "store/navigation/navigation-action";
+import { createTree } from 'models/tree';
import { compose, Dispatch } from 'redux';
-import { UserResource } from '~/models/user';
-import { ShareMeIcon, AddIcon } from '~/components/icon/icon';
-import { USERS_PANEL_ID, openUserCreateDialog } from '~/store/users/users-actions';
+import { UserResource } from 'models/user';
+import { ShareMeIcon } from 'components/icon/icon';
+import { USERS_PANEL_ID, openUserCreateDialog } from 'store/users/users-actions';
+import { noop } from 'lodash';
-type UserPanelRules = "button";
+type UserPanelRules = "button" | 'root';
const styles = withStyles<UserPanelRules>(theme => ({
button: {
textAlign: 'right',
alignSelf: 'center'
},
+ root: {
+ width: '100%',
+ },
}));
export enum UserPanelColumnNames {
- FIRST_NAME = "First Name",
- LAST_NAME = "Last Name",
+ NAME = "Name",
UUID = "Uuid",
EMAIL = "Email",
- ACTIVE = "Active",
+ STATUS = "Account Status",
ADMIN = "Admin",
REDIRECT_TO_USER = "Redirect to user",
USERNAME = "Username"
export const userPanelColumns: DataColumns<string> = [
{
- name: UserPanelColumnNames.FIRST_NAME,
- selected: true,
- configurable: true,
- sortDirection: SortDirection.NONE,
- filters: createTree(),
- render: uuid => <ResourceFirstName uuid={uuid} />
- },
- {
- name: UserPanelColumnNames.LAST_NAME,
+ name: UserPanelColumnNames.NAME,
selected: true,
configurable: true,
sortDirection: SortDirection.NONE,
filters: createTree(),
- render: uuid => <ResourceLastName uuid={uuid} />
+ render: uuid => <UserResourceFullName uuid={uuid} link={true} />
},
{
name: UserPanelColumnNames.UUID,
render: uuid => <ResourceEmail uuid={uuid} />
},
{
- name: UserPanelColumnNames.ACTIVE,
+ name: UserPanelColumnNames.STATUS,
selected: true,
configurable: true,
- sortDirection: SortDirection.NONE,
filters: createTree(),
- render: uuid => <ResourceIsActive uuid={uuid} />
+ render: uuid => <UserResourceAccountStatus uuid={uuid} />
},
{
name: UserPanelColumnNames.ADMIN,
selected: true,
configurable: false,
- sortDirection: SortDirection.NONE,
filters: createTree(),
render: uuid => <ResourceIsAdmin uuid={uuid} />
},
- {
- name: UserPanelColumnNames.REDIRECT_TO_USER,
- selected: true,
- configurable: false,
- sortDirection: SortDirection.NONE,
- filters: createTree(),
- render: () => <Typography noWrap>(none)</Typography>
- },
{
name: UserPanelColumnNames.USERNAME,
selected: true,
interface UserPanelActionProps {
openUserCreateDialog: () => void;
- handleRowDoubleClick: (uuid: string) => void;
- onContextMenu: (event: React.MouseEvent<HTMLElement>, item: any) => void;
+ handleRowClick: (uuid: string) => void;
+ handleContextMenu: (event, resource: UserResource) => void;
}
const mapStateToProps = (state: RootState) => {
const mapDispatchToProps = (dispatch: Dispatch) => ({
openUserCreateDialog: () => dispatch<any>(openUserCreateDialog()),
- handleRowDoubleClick: (uuid: string) => dispatch<any>(navigateTo(uuid)),
- onContextMenu: (event: React.MouseEvent<HTMLElement>, item: any) => dispatch<any>(openContextMenu(event, item))
+ handleRowClick: (uuid: string) => dispatch<any>(navigateToUserProfile(uuid)),
+ handleContextMenu: (event, resource: UserResource) => dispatch<any>(openUserContextMenu(event, resource)),
});
type UserPanelProps = UserPanelDataProps & UserPanelActionProps & DispatchProp & WithStyles<UserPanelRules>;
styles,
connect(mapStateToProps, mapDispatchToProps))(
class extends React.Component<UserPanelProps> {
- state = {
- value: 0,
- };
-
- componentDidMount() {
- this.setState({ value: 0 });
- }
-
render() {
- const { value } = this.state;
- return <Paper>
- <Tabs value={value} onChange={this.handleChange} fullWidth>
- <Tab label="USERS" />
- <Tab label="ACTIVITY" disabled />
- </Tabs>
- {value === 0 &&
- <span>
- <DataExplorer
- id={USERS_PANEL_ID}
- onRowClick={this.handleRowClick}
- onRowDoubleClick={this.handleRowDoubleClick}
- onContextMenu={this.handleContextMenu}
- contextMenuColumn={true}
- hideColumnSelector
- actions={
- <Grid container justify='flex-end'>
- <Button variant="contained" color="primary" onClick={this.props.openUserCreateDialog}>
- <AddIcon /> NEW USER
- </Button>
- </Grid>
- }
- paperProps={{
- elevation: 0,
- }}
- dataTableDefaultView={
- <DataTableDefaultView
- icon={ShareMeIcon}
- messages={['Your user list is empty.']} />
- } />
- </span>}
+ return <Paper className={this.props.classes.root}>
+ <DataExplorer
+ id={USERS_PANEL_ID}
+ title={
+ <>
+ <Typography>
+ User records are created automatically on first log in.
+ </Typography>
+ <Typography>
+ To add a new user, add them to your configured log in provider.
+ </Typography>
+ </>}
+ onRowClick={noop}
+ onRowDoubleClick={noop}
+ onContextMenu={this.handleContextMenu}
+ contextMenuColumn={true}
+ hideColumnSelector
+ paperProps={{
+ elevation: 0,
+ }}
+ defaultViewIcon={ShareMeIcon}
+ defaultViewMessages={['Your user list is empty.']} />
</Paper>;
}
- handleChange = (event: React.MouseEvent<HTMLElement>, value: number) => {
- this.setState({ value });
- }
-
handleContextMenu = (event: React.MouseEvent<HTMLElement>, resourceUuid: string) => {
+ event.stopPropagation();
const resource = getResource<UserResource>(resourceUuid)(this.props.resources);
if (resource) {
- this.props.onContextMenu(event, {
- name: '',
- uuid: resource.uuid,
- ownerUuid: resource.ownerUuid,
- kind: resource.kind,
- menuKind: ContextMenuKind.USER
- });
+ this.props.handleContextMenu(event, resource);
}
}
-
- handleRowDoubleClick = (uuid: string) => {
- this.props.handleRowDoubleClick(uuid);
- }
-
- handleRowClick = () => {
- return;
- }
}
);