add a role column and filter for quick view in Users page
This commit is contained in:
parent
4aa30acd0b
commit
b0e3e47553
|
|
@ -14,9 +14,17 @@ import {
|
||||||
} from '@mui/material';
|
} from '@mui/material';
|
||||||
import { FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
import { useSearchParams } from 'react-router-dom';
|
import { useSearchParams } from 'react-router-dom';
|
||||||
import { InnovEnergyUser } from 'src/interfaces/UserTypes';
|
import { InnovEnergyUser, UserType } from 'src/interfaces/UserTypes';
|
||||||
import User from './User';
|
import User from './User';
|
||||||
|
|
||||||
|
// Translation keys for each UserType, indexed by the enum value
|
||||||
|
// (client=0, partner=1, admin=2).
|
||||||
|
export const USER_ROLE_LABEL_IDS: Record<UserType, string> = {
|
||||||
|
[UserType.client]: 'roleClient',
|
||||||
|
[UserType.partner]: 'rolePartner',
|
||||||
|
[UserType.admin]: 'roleAdmin'
|
||||||
|
};
|
||||||
|
|
||||||
interface FlatUsersViewProps {
|
interface FlatUsersViewProps {
|
||||||
users: InnovEnergyUser[];
|
users: InnovEnergyUser[];
|
||||||
fetchDataAgain: () => void;
|
fetchDataAgain: () => void;
|
||||||
|
|
@ -79,6 +87,7 @@ const FlatUsersView = (props: FlatUsersViewProps) => {
|
||||||
<TableRow>
|
<TableRow>
|
||||||
<TableCell padding="checkbox"></TableCell>
|
<TableCell padding="checkbox"></TableCell>
|
||||||
<TableCell><FormattedMessage id="username" defaultMessage="Username" /></TableCell>
|
<TableCell><FormattedMessage id="username" defaultMessage="Username" /></TableCell>
|
||||||
|
<TableCell><FormattedMessage id="role" defaultMessage="Role" /></TableCell>
|
||||||
<TableCell><FormattedMessage id="email" defaultMessage="Email" /></TableCell>
|
<TableCell><FormattedMessage id="email" defaultMessage="Email" /></TableCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
</TableHead>
|
</TableHead>
|
||||||
|
|
@ -115,6 +124,21 @@ const FlatUsersView = (props: FlatUsersViewProps) => {
|
||||||
{user.name}
|
{user.name}
|
||||||
</Typography>
|
</Typography>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
|
<TableCell>
|
||||||
|
<Typography
|
||||||
|
variant="body1"
|
||||||
|
fontWeight="bold"
|
||||||
|
color="text.primary"
|
||||||
|
gutterBottom
|
||||||
|
noWrap
|
||||||
|
>
|
||||||
|
<FormattedMessage
|
||||||
|
id={
|
||||||
|
USER_ROLE_LABEL_IDS[user.userType] ?? 'roleClient'
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</Typography>
|
||||||
|
</TableCell>
|
||||||
<TableCell>
|
<TableCell>
|
||||||
<Typography
|
<Typography
|
||||||
variant="body1"
|
variant="body1"
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ import {
|
||||||
Grid,
|
Grid,
|
||||||
IconButton,
|
IconButton,
|
||||||
InputAdornment,
|
InputAdornment,
|
||||||
|
MenuItem,
|
||||||
TextField
|
TextField
|
||||||
} from '@mui/material';
|
} from '@mui/material';
|
||||||
import SearchTwoToneIcon from '@mui/icons-material/SearchTwoTone';
|
import SearchTwoToneIcon from '@mui/icons-material/SearchTwoTone';
|
||||||
|
|
@ -20,6 +21,8 @@ import { UserType } from '../../../interfaces/UserTypes';
|
||||||
function UsersSearch() {
|
function UsersSearch() {
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const [searchTerm, setSearchTerm] = useState('');
|
const [searchTerm, setSearchTerm] = useState('');
|
||||||
|
// 'all' = no role filter; otherwise the selected UserType enum value.
|
||||||
|
const [roleFilter, setRoleFilter] = useState<UserType | 'all'>('all');
|
||||||
const { allUsers, fetchAllUsers } = useContext(AccessContext);
|
const { allUsers, fetchAllUsers } = useContext(AccessContext);
|
||||||
const [filteredData, setFilteredData] = useState(allUsers);
|
const [filteredData, setFilteredData] = useState(allUsers);
|
||||||
const [openModal, setOpenModal] = useState(false);
|
const [openModal, setOpenModal] = useState(false);
|
||||||
|
|
@ -37,11 +40,13 @@ function UsersSearch() {
|
||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const filtered = allUsers.filter((item) =>
|
const filtered = allUsers.filter(
|
||||||
item.name.toLowerCase().includes(searchTerm.toLowerCase())
|
(item) =>
|
||||||
|
item.name.toLowerCase().includes(searchTerm.toLowerCase()) &&
|
||||||
|
(roleFilter === 'all' || item.userType === roleFilter)
|
||||||
);
|
);
|
||||||
setFilteredData(filtered);
|
setFilteredData(filtered);
|
||||||
}, [searchTerm, allUsers]);
|
}, [searchTerm, roleFilter, allUsers]);
|
||||||
|
|
||||||
const handleSubmit = () => {
|
const handleSubmit = () => {
|
||||||
setOpenModal(true);
|
setOpenModal(true);
|
||||||
|
|
@ -162,6 +167,36 @@ function UsersSearch() {
|
||||||
/>
|
/>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
<Grid item xs={12} md={isMobile ? 5 : 3}>
|
||||||
|
<FormControl variant="outlined" fullWidth>
|
||||||
|
<TextField
|
||||||
|
select
|
||||||
|
label={intl.formatMessage({ id: 'role' })}
|
||||||
|
value={roleFilter}
|
||||||
|
onChange={(e) =>
|
||||||
|
setRoleFilter(
|
||||||
|
e.target.value === 'all'
|
||||||
|
? 'all'
|
||||||
|
: (Number(e.target.value) as UserType)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
fullWidth
|
||||||
|
>
|
||||||
|
<MenuItem value="all">
|
||||||
|
{intl.formatMessage({ id: 'allRoles' })}
|
||||||
|
</MenuItem>
|
||||||
|
<MenuItem value={UserType.client}>
|
||||||
|
{intl.formatMessage({ id: 'roleClient' })}
|
||||||
|
</MenuItem>
|
||||||
|
<MenuItem value={UserType.partner}>
|
||||||
|
{intl.formatMessage({ id: 'rolePartner' })}
|
||||||
|
</MenuItem>
|
||||||
|
<MenuItem value={UserType.admin}>
|
||||||
|
{intl.formatMessage({ id: 'roleAdmin' })}
|
||||||
|
</MenuItem>
|
||||||
|
</TextField>
|
||||||
|
</FormControl>
|
||||||
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
<FlatUsersView users={filteredData} fetchDataAgain={fetchDataAgain} />
|
<FlatUsersView users={filteredData} fetchDataAgain={fetchDataAgain} />
|
||||||
</>
|
</>
|
||||||
|
|
|
||||||
|
|
@ -532,6 +532,11 @@
|
||||||
"stopTimeMustBeLater": "Die Stoppzeit muss nach der Startzeit liegen",
|
"stopTimeMustBeLater": "Die Stoppzeit muss nach der Startzeit liegen",
|
||||||
"signIn": "Anmelden",
|
"signIn": "Anmelden",
|
||||||
"username": "Benutzername",
|
"username": "Benutzername",
|
||||||
|
"role": "Rolle",
|
||||||
|
"allRoles": "Alle Rollen",
|
||||||
|
"roleClient": "Kunde",
|
||||||
|
"rolePartner": "Partner",
|
||||||
|
"roleAdmin": "Admin",
|
||||||
"password": "Passwort",
|
"password": "Passwort",
|
||||||
"rememberMe": "Angemeldet bleiben",
|
"rememberMe": "Angemeldet bleiben",
|
||||||
"login": "Anmelden",
|
"login": "Anmelden",
|
||||||
|
|
|
||||||
|
|
@ -280,6 +280,11 @@
|
||||||
"stopTimeMustBeLater": "Stop time must be later than start time",
|
"stopTimeMustBeLater": "Stop time must be later than start time",
|
||||||
"signIn": "Sign in",
|
"signIn": "Sign in",
|
||||||
"username": "Username",
|
"username": "Username",
|
||||||
|
"role": "Role",
|
||||||
|
"allRoles": "All roles",
|
||||||
|
"roleClient": "Client",
|
||||||
|
"rolePartner": "Partner",
|
||||||
|
"roleAdmin": "Admin",
|
||||||
"password": "Password",
|
"password": "Password",
|
||||||
"rememberMe": "Remember me",
|
"rememberMe": "Remember me",
|
||||||
"login": "Login",
|
"login": "Login",
|
||||||
|
|
|
||||||
|
|
@ -532,6 +532,11 @@
|
||||||
"stopTimeMustBeLater": "L'heure d'arrêt doit être postérieure à l'heure de début",
|
"stopTimeMustBeLater": "L'heure d'arrêt doit être postérieure à l'heure de début",
|
||||||
"signIn": "Se connecter",
|
"signIn": "Se connecter",
|
||||||
"username": "Nom d'utilisateur",
|
"username": "Nom d'utilisateur",
|
||||||
|
"role": "Rôle",
|
||||||
|
"allRoles": "Tous les rôles",
|
||||||
|
"roleClient": "Client",
|
||||||
|
"rolePartner": "Partenaire",
|
||||||
|
"roleAdmin": "Admin",
|
||||||
"password": "Mot de passe",
|
"password": "Mot de passe",
|
||||||
"rememberMe": "Se souvenir de moi",
|
"rememberMe": "Se souvenir de moi",
|
||||||
"login": "Connexion",
|
"login": "Connexion",
|
||||||
|
|
|
||||||
|
|
@ -532,6 +532,11 @@
|
||||||
"stopTimeMustBeLater": "L'ora di fine deve essere successiva all'ora di inizio",
|
"stopTimeMustBeLater": "L'ora di fine deve essere successiva all'ora di inizio",
|
||||||
"signIn": "Accedi",
|
"signIn": "Accedi",
|
||||||
"username": "Nome utente",
|
"username": "Nome utente",
|
||||||
|
"role": "Ruolo",
|
||||||
|
"allRoles": "Tutti i ruoli",
|
||||||
|
"roleClient": "Cliente",
|
||||||
|
"rolePartner": "Partner",
|
||||||
|
"roleAdmin": "Admin",
|
||||||
"password": "Password",
|
"password": "Password",
|
||||||
"rememberMe": "Ricordami",
|
"rememberMe": "Ricordami",
|
||||||
"login": "Accedi",
|
"login": "Accedi",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue