2022-08-30 18:31:34 -07:00
|
|
|
import React, { useState } from 'react';
|
|
|
|
import { UserOutlined } from '@ant-design/icons';
|
|
|
|
import { Select } from 'antd';
|
|
|
|
import styled from 'styled-components';
|
|
|
|
import { CorpUser, DataHubRole } from '../../../types.generated';
|
|
|
|
import AssignRoleConfirmation from './AssignRoleConfirmation';
|
|
|
|
import { mapRoleIcon } from './UserUtils';
|
|
|
|
|
2022-11-17 10:59:07 -08:00
|
|
|
const NO_ROLE_TEXT = 'No Role';
|
|
|
|
|
2022-08-30 18:31:34 -07:00
|
|
|
type Props = {
|
|
|
|
user: CorpUser;
|
|
|
|
userRoleUrn: string;
|
|
|
|
selectRoleOptions: Array<DataHubRole>;
|
|
|
|
refetch?: () => void;
|
|
|
|
};
|
|
|
|
|
|
|
|
const RoleSelect = styled(Select)`
|
|
|
|
min-width: 105px;
|
|
|
|
`;
|
|
|
|
|
|
|
|
const RoleIcon = styled.span`
|
|
|
|
margin-right: 6px;
|
|
|
|
font-size: 12px;
|
|
|
|
`;
|
|
|
|
|
|
|
|
export default function SelectRole({ user, userRoleUrn, selectRoleOptions, refetch }: Props) {
|
|
|
|
const rolesMap: Map<string, DataHubRole> = new Map();
|
|
|
|
selectRoleOptions.forEach((role) => {
|
|
|
|
rolesMap.set(role.urn, role);
|
|
|
|
});
|
2022-11-17 10:59:07 -08:00
|
|
|
const allSelectRoleOptions = [{ urn: '', name: NO_ROLE_TEXT }, ...selectRoleOptions];
|
2022-08-30 18:31:34 -07:00
|
|
|
const selectOptions = () =>
|
2022-11-17 10:59:07 -08:00
|
|
|
allSelectRoleOptions.map((role) => {
|
2022-08-30 18:31:34 -07:00
|
|
|
return (
|
|
|
|
<Select.Option value={role.urn}>
|
|
|
|
<RoleIcon>{mapRoleIcon(role.name)}</RoleIcon>
|
|
|
|
{role.name}
|
|
|
|
</Select.Option>
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
2022-11-17 10:59:07 -08:00
|
|
|
const initialRole = rolesMap.get(userRoleUrn) as DataHubRole;
|
|
|
|
const [currentRole, setCurrentRole] = useState<DataHubRole | undefined>(initialRole);
|
|
|
|
const [isViewingAssignRole, setIsViewingAssignRole] = useState(false);
|
|
|
|
|
2022-08-30 18:31:34 -07:00
|
|
|
const onSelectRole = (roleUrn: string) => {
|
|
|
|
const roleFromMap: DataHubRole = rolesMap.get(roleUrn) as DataHubRole;
|
2022-11-17 10:59:07 -08:00
|
|
|
setCurrentRole(roleFromMap);
|
2022-08-30 18:31:34 -07:00
|
|
|
setIsViewingAssignRole(true);
|
|
|
|
};
|
|
|
|
|
2022-11-17 10:59:07 -08:00
|
|
|
const onCancel = () => {
|
|
|
|
setCurrentRole(initialRole);
|
|
|
|
setIsViewingAssignRole(false);
|
|
|
|
};
|
|
|
|
|
|
|
|
const onConfirm = () => {
|
|
|
|
setIsViewingAssignRole(false);
|
|
|
|
setTimeout(function () {
|
|
|
|
refetch?.();
|
|
|
|
}, 3000);
|
|
|
|
};
|
2022-08-30 18:31:34 -07:00
|
|
|
|
|
|
|
return (
|
|
|
|
<>
|
|
|
|
<RoleSelect
|
|
|
|
placeholder={
|
|
|
|
<>
|
|
|
|
<UserOutlined style={{ marginRight: 6, fontSize: 12 }} />
|
2022-11-17 10:59:07 -08:00
|
|
|
{NO_ROLE_TEXT}
|
2022-08-30 18:31:34 -07:00
|
|
|
</>
|
|
|
|
}
|
2022-11-17 10:59:07 -08:00
|
|
|
value={currentRole?.urn}
|
2022-08-30 18:31:34 -07:00
|
|
|
onChange={(e) => onSelectRole(e as string)}
|
|
|
|
>
|
|
|
|
{selectOptions()}
|
|
|
|
</RoleSelect>
|
|
|
|
<AssignRoleConfirmation
|
|
|
|
visible={isViewingAssignRole}
|
2022-11-17 10:59:07 -08:00
|
|
|
roleToAssign={currentRole}
|
2022-08-30 18:31:34 -07:00
|
|
|
userUrn={user.urn}
|
|
|
|
username={user.username}
|
2022-11-17 10:59:07 -08:00
|
|
|
onClose={onCancel}
|
|
|
|
onConfirm={onConfirm}
|
2022-08-30 18:31:34 -07:00
|
|
|
/>
|
|
|
|
</>
|
|
|
|
);
|
|
|
|
}
|