From ebafe4ef8108587538df58a389e2b142058f7717 Mon Sep 17 00:00:00 2001 From: Pavel Zavora Date: Tue, 31 May 2022 07:09:28 +0200 Subject: [PATCH] feat(ui): change RolesPage to functional component --- .../admin/containers/influxdb/RolesPage.tsx | 177 ++++++++++-------- 1 file changed, 102 insertions(+), 75 deletions(-) diff --git a/ui/src/admin/containers/influxdb/RolesPage.tsx b/ui/src/admin/containers/influxdb/RolesPage.tsx index 005acc8cb..9d466c89c 100644 --- a/ui/src/admin/containers/influxdb/RolesPage.tsx +++ b/ui/src/admin/containers/influxdb/RolesPage.tsx @@ -1,5 +1,4 @@ -import React from 'react' -import {Component} from 'react' +import React, {useMemo} from 'react' import {connect, ResolveThunks} from 'react-redux' import {withSource} from 'src/CheckSources' import {Source} from 'src/types' @@ -8,7 +7,7 @@ import {notify as notifyAction} from 'src/shared/actions/notifications' import { addRole as addRoleActionCreator, editRole as editRoleActionCreator, - deleteRole, + deleteRole as deleteRoleAction, createRoleAsync, deleteRoleAsync, updateRoleUsersAsync, @@ -16,11 +15,15 @@ import { filterRoles as filterRolesAction, } from 'src/admin/actions/influxdb' import {notifyRoleNameInvalid} from 'src/shared/copy/notifications' -import RolesTable from 'src/admin/components/RolesTable' import AdminInfluxDBTabbedPage, { hasRoleManagement, isConnectedToLDAP, } from './AdminInfluxDBTabbedPage' +import FilterBar from 'src/admin/components/FilterBar' +import FancyScrollbar from 'src/shared/components/FancyScrollbar' +import EmptyRow from 'src/admin/components/EmptyRow' +import RoleRow from 'src/admin/components/RoleRow' +import {useCallback} from 'react' const isValidRole = (role: UserRole): boolean => { const minLen = 3 @@ -35,7 +38,7 @@ const mapStateToProps = ({adminInfluxDB: {users, roles, permissions}}) => ({ const mapDispatchToProps = { addRole: addRoleActionCreator, - removeRole: deleteRole, + removeRole: deleteRoleAction, editRole: editRoleActionCreator, createRole: createRoleAsync, deleteRole: deleteRoleAsync, @@ -58,84 +61,108 @@ type ReduxDispatchProps = ResolveThunks type Props = OwnProps & ConnectedProps & ReduxDispatchProps -class RolesPage extends Component { - private get allowed(): string[] { - const {permissions} = this.props +const RolesPage = ({ + source, + permissions, + users, + roles, + addRole, + filterRoles, + editRole, + removeRole, + deleteRole, + updateRoleUsers, + updateRolePermissions, + createRole, + notify, +}: Props) => { + const allPermissions = useMemo(() => { const globalPermissions = permissions.find(p => p.scope === 'all') return globalPermissions ? globalPermissions.allowed : [] - } + }, [permissions]) + const handleSaveRole = useCallback( + async role => { + if (!isValidRole(role)) { + notify(notifyRoleNameInvalid()) + return + } + if (role.isNew) { + createRole(source.links.roles, role) + } + }, + [source, createRole] + ) + const isEditing = useMemo(() => roles.some(r => r.isEditing), [roles]) - private handleEditRole = (role, updates) => { - this.props.editRole(role, updates) - } - private handleSaveRole = async role => { - const {notify} = this.props - if (!isValidRole(role)) { - notify(notifyRoleNameInvalid()) - return - } - if (role.isNew) { - this.props.createRole(this.props.source.links.roles, role) - } - } - - private handleCancelEditRole = role => { - this.props.removeRole(role) - } - - private handleDeleteRole = role => { - this.props.deleteRole(role) - } - - private handleUpdateRoleUsers = (role, users) => { - this.props.updateRoleUsers(role, users) - } - - private handleUpdateRolePermissions = (role, permissions) => { - this.props.updateRolePermissions(role, permissions) - } - - public render() { - const source = this.props.source - if (!hasRoleManagement(source)) { - return ( - -
- Roles management is not available for the currently selected - InfluxDB Connection. -
-
- ) - } - if (isConnectedToLDAP(source)) { - return ( - -
- Users are managed via LDAP, roles management is not available. -
-
- ) - } - const {users, roles, addRole, filterRoles} = this.props + if (!hasRoleManagement(source)) { return ( - r.isEditing)} - onClickCreate={addRole} - onEdit={this.handleEditRole} - onSave={this.handleSaveRole} - onCancel={this.handleCancelEditRole} - onDelete={this.handleDeleteRole} - onFilter={filterRoles} - onUpdateRoleUsers={this.handleUpdateRoleUsers} - onUpdateRolePermissions={this.handleUpdateRolePermissions} - /> +
+ Roles management is not available for the currently selected InfluxDB + Connection. +
) } + if (isConnectedToLDAP(source)) { + return ( + +
+ Users are managed via LDAP, roles management is not available. +
+
+ ) + } + return ( + +
+ +
+ + + + + + + + + + + {roles.length ? ( + roles + .filter(r => !r.hidden) + .map(role => ( + + )) + ) : ( + + )} + +
NamePermissionsUsers +
+
+
+
+
+ ) } export default withSource(