import React, { useEffect } from "react"; import { connect } from "react-redux"; import { Icon } from "@blueprintjs/core"; import { TableWrapper } from "components/designSystems/appsmith/TableStyledWrappers"; import { CompactModeTypes, TABLE_SIZES } from "widgets/TableWidget"; import { Colors } from "constants/Colors"; import { AppState } from "reducers"; import { getAllUsers, getAllRoles, getCurrentOrg, } from "selectors/organizationSelectors"; import PageSectionDivider from "pages/common/PageSectionDivider"; import PageSectionHeader from "pages/common/PageSectionHeader"; import { ReduxActionTypes } from "constants/ReduxActionConstants"; import OrgInviteUsersForm from "pages/organization/OrgInviteUsersForm"; import Button from "components/editorComponents/Button"; import { OrgUser, Org } from "constants/orgConstants"; import { Menu, MenuItem, Popover, Position } from "@blueprintjs/core"; import styled from "styled-components"; import { FormIcons } from "icons/FormIcons"; import { RouteComponentProps } from "react-router"; import Spinner from "components/editorComponents/Spinner"; import FormDialogComponent from "components/editorComponents/form/FormDialogComponent"; import { getCurrentUser } from "selectors/usersSelectors"; import { User } from "constants/userConstants"; import { useTable, useFlexLayout } from "react-table"; type OrgProps = { currentOrg: Org; changeOrgName: (value: string) => void; fetchCurrentOrg: (orgId: string) => void; fetchUser: (orgId: string) => void; fetchAllRoles: (orgId: string) => void; deleteOrgUser: (orgId: string, username: string) => void; changeOrgUserRole: (orgId: string, role: string, username: string) => void; allUsers: OrgUser[]; allRole: object; currentUser: User | undefined; isFetchAllUsers: boolean; isFetchAllRoles: boolean; }; export type PageProps = OrgProps & RouteComponentProps<{ orgId: string; }>; export type MenuItemProps = { rolename: string; }; type DropdownProps = { activeItem: string; userRoles: object; username: string; changeOrgUserRole: (orgId: string, role: string, username: string) => void; orgId: string; }; const StyledDropDown = styled.div` cursor: pointer; `; const StyledTableWrapped = styled(TableWrapper)` min-height: 0px; height: auto; `; const StyledMenu = styled(Menu)` &&&&.bp3-menu { max-width: 250px; cursor: pointer; } `; const RoleNameCell = (props: any) => { const { roleName, roles, username, isCurrentUser, isChangingRole, } = props.cellProps.row.original; if (isCurrentUser) { return
{roleName}
; } return ( } position={Position.BOTTOM_LEFT} > {roleName} {isChangingRole ? : undefined} ); }; const DeleteActionCell = (props: any) => { const { username, isCurrentUser, isDeleting } = props.cellProps.row.original; return ( !isCurrentUser && (isDeleting ? ( ) : ( props.deleteOrgUser(props.orgId, username)} style={{ alignSelf: "center", cursor: "pointer" }} /> )) ); }; const Dropdown = (props: DropdownProps) => { return ( {Object.entries(props.userRoles).map((role, index) => { const MenuContent = (
{role[0]}
{role[1]}
); return ( props.changeOrgUserRole(props.orgId, role[0], props.username) } active={props.activeItem === role[0]} text={MenuContent} /> ); })}
); }; export const OrgSettings = (props: PageProps) => { const { match: { params: { orgId }, }, deleteOrgUser, changeOrgUserRole, fetchCurrentOrg, fetchUser, fetchAllRoles, currentOrg, } = props; const userTableData = props.allUsers.map(user => ({ ...user, roles: props.allRole, isCurrentUser: user.username === props.currentUser?.username, })); const data = React.useMemo(() => userTableData, [userTableData]); const tableHeight = React.useMemo(() => { const tableDataLength = userTableData.length * TABLE_SIZES[CompactModeTypes.DEFAULT].ROW_HEIGHT + TABLE_SIZES[CompactModeTypes.DEFAULT].COLUMN_HEADER_HEIGHT; return tableDataLength < 200 ? tableDataLength : 200; }, [userTableData]); const columns = React.useMemo(() => { return [ { Header: "Email", accessor: "username", }, { Header: "Name", accessor: "name", }, { Header: "Role", accessor: "roleName", Cell: (cellProps: any) => { return RoleNameCell({ cellProps, changeOrgUserRole, orgId }); }, }, { Header: "Delete", accessor: "delete", Cell: (cellProps: any) => { return DeleteActionCell({ cellProps, deleteOrgUser, orgId }); }, }, ]; }, [orgId, deleteOrgUser, changeOrgUserRole]); const currentOrgName = currentOrg?.name ?? ""; const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow, } = useTable( { columns, data, manualPagination: true, }, useFlexLayout, ); useEffect(() => { fetchUser(orgId); fetchAllRoles(orgId); fetchCurrentOrg(orgId); }, [orgId, fetchUser, fetchAllRoles, fetchCurrentOrg]); return (

{currentOrgName}

Users

} canOutsideClickClose={true} Form={OrgInviteUsersForm} orgId={orgId} title={`Invite Users to ${currentOrgName}`} />
{props.isFetchAllUsers && props.isFetchAllRoles ? ( ) : (
{headerGroups.map((headerGroup: any, index: number) => (
{headerGroup.headers.map( (column: any, columnIndex: number) => (
{column.render("Header")}
), )}
))}
{rows.map((row: any, index: number) => { prepareRow(row); return (
{row.cells.map((cell: any, cellIndex: number) => { return (
{cell.render("Cell")}
); })}
); })}
)}
); }; const mapStateToProps = (state: AppState) => ({ allUsers: getAllUsers(state), allRole: getAllRoles(state), isFetchAllUsers: state.ui.orgs.loadingStates.isFetchAllUsers, isFetchAllRoles: state.ui.orgs.loadingStates.isFetchAllRoles, currentOrg: getCurrentOrg(state), currentUser: getCurrentUser(state), }); const mapDispatchToProps = (dispatch: any) => ({ fetchCurrentOrg: (orgId: string) => dispatch({ type: ReduxActionTypes.FETCH_CURRENT_ORG, payload: { orgId, }, }), changeOrgName: (name: string) => dispatch({ type: ReduxActionTypes.UPDATE_ORG_NAME_INIT, payload: { name, }, }), changeOrgUserRole: (orgId: string, role: string, username: string) => dispatch({ type: ReduxActionTypes.CHANGE_ORG_USER_ROLE_INIT, payload: { orgId, role, username, }, }), deleteOrgUser: (orgId: string, username: string) => dispatch({ type: ReduxActionTypes.DELETE_ORG_USER_INIT, payload: { orgId, username, }, }), fetchUser: (orgId: string) => dispatch({ type: ReduxActionTypes.FETCH_ALL_USERS_INIT, payload: { orgId, }, }), fetchAllRoles: (orgId: string) => dispatch({ type: ReduxActionTypes.FETCH_ALL_ROLES_INIT, payload: { orgId, }, }), }); export default connect(mapStateToProps, mapDispatchToProps)(OrgSettings);