feat: New users page active tab (#32024)
Co-authored-by: Tasso Evangelista <2263066+tassoevan@users.noreply.github.com>pull/32811/head^2
parent
fa82159492
commit
3ffe4a2944
@ -0,0 +1,7 @@ |
||||
--- |
||||
"@rocket.chat/meteor": minor |
||||
"@rocket.chat/i18n": patch |
||||
"@rocket.chat/ui-client": patch |
||||
--- |
||||
|
||||
Implemented a new tab to the users page called 'Active', this tab lists all users who have logged in for the first time and are active. |
||||
@ -0,0 +1,78 @@ |
||||
import type { IRole } from '@rocket.chat/core-typings'; |
||||
import { useBreakpoints } from '@rocket.chat/fuselage-hooks'; |
||||
import type { OptionProp } from '@rocket.chat/ui-client'; |
||||
import { MultiSelectCustom } from '@rocket.chat/ui-client'; |
||||
import React, { useCallback, useMemo, useState } from 'react'; |
||||
import { useTranslation } from 'react-i18next'; |
||||
|
||||
import FilterByText from '../../../../components/FilterByText'; |
||||
import type { UsersFilters } from '../AdminUsersPage'; |
||||
|
||||
type UsersTableFiltersProps = { |
||||
setUsersFilters: React.Dispatch<React.SetStateAction<UsersFilters>>; |
||||
roleData: { roles: IRole[] } | undefined; |
||||
}; |
||||
|
||||
const UsersTableFilters = ({ roleData, setUsersFilters }: UsersTableFiltersProps) => { |
||||
const { t } = useTranslation(); |
||||
|
||||
const [selectedRoles, setSelectedRoles] = useState<OptionProp[]>([]); |
||||
const [text, setText] = useState(''); |
||||
|
||||
const handleSearchTextChange = useCallback( |
||||
({ text }) => { |
||||
setUsersFilters({ text, roles: selectedRoles }); |
||||
setText(text); |
||||
}, |
||||
[selectedRoles, setUsersFilters], |
||||
); |
||||
|
||||
const handleRolesChange = useCallback( |
||||
(roles: OptionProp[]) => { |
||||
setUsersFilters({ text, roles }); |
||||
setSelectedRoles(roles); |
||||
}, |
||||
[setUsersFilters, text], |
||||
); |
||||
|
||||
const userRolesFilterStructure = useMemo( |
||||
() => [ |
||||
{ |
||||
id: 'filter_by_role', |
||||
text: 'Filter_by_role', |
||||
}, |
||||
{ |
||||
id: 'all', |
||||
text: 'All_roles', |
||||
checked: false, |
||||
}, |
||||
...(roleData |
||||
? roleData.roles.map((role) => ({ |
||||
id: role._id, |
||||
text: role.description || role.name || role._id, |
||||
checked: false, |
||||
})) |
||||
: []), |
||||
], |
||||
[roleData], |
||||
); |
||||
|
||||
const breakpoints = useBreakpoints(); |
||||
const fixFiltersSize = breakpoints.includes('lg') ? { maxWidth: 'x224', minWidth: 'x224' } : null; |
||||
|
||||
return ( |
||||
<FilterByText shouldAutoFocus placeholder={t('Search_Users')} onChange={handleSearchTextChange}> |
||||
<MultiSelectCustom |
||||
dropdownOptions={userRolesFilterStructure} |
||||
defaultTitle='All_roles' |
||||
selectedOptionsTitle='Roles' |
||||
setSelectedOptions={handleRolesChange} |
||||
selectedOptions={selectedRoles} |
||||
searchBarText='Search_roles' |
||||
{...fixFiltersSize} |
||||
/> |
||||
</FilterByText> |
||||
); |
||||
}; |
||||
|
||||
export default UsersTableFilters; |
||||
Loading…
Reference in new issue