Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

4002 - Tablepaginated filter by user role/admin users role - Integration #4038

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/client/components/TablePaginated/Filters/Filters.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,17 @@ import React from 'react'
import { TablePaginatedFilterType } from 'meta/tablePaginated'

import Icon from 'client/components/Icon'
import MultiSelect from 'client/components/TablePaginated/Filters/MultiSelect/MultiSelect'
import Text from 'client/components/TablePaginated/Filters/Text/Text'
import { TablePaginatedFilter } from 'client/components/TablePaginated/types'

const componentsByFilterType: Record<
TablePaginatedFilterType,
React.FC<TablePaginatedFilter<TablePaginatedFilterType> & { path: string }>
> = {
[TablePaginatedFilterType.TEXT]: Text,
[TablePaginatedFilterType.MULTI_SELECT]: MultiSelect,
[TablePaginatedFilterType.SWITCH]: () => null,
[TablePaginatedFilterType.TEXT]: Text,
}

type Props = {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import React from 'react'

import { TablePaginatedFilterType } from 'meta/tablePaginated'

import { useAppDispatch } from 'client/store'
import { TablePaginatedActions } from 'client/store/ui/tablePaginated'
import { useTablePaginatedFilterValue } from 'client/store/ui/tablePaginated/hooks'
import Select from 'client/components/Inputs/Select'
import { TablePaginatedFilter } from 'client/components/TablePaginated/types'

type Props = TablePaginatedFilter<TablePaginatedFilterType.MULTI_SELECT> & {
path: string
}

const MultiSelect = (props: Props) => {
const { fieldName, label, path, options } = props

const dispatch = useAppDispatch()

const filterValue = useTablePaginatedFilterValue<string>(path, fieldName)

const handleChange = (value: Array<string>) => {
dispatch(
TablePaginatedActions.setFilterValue({
fieldName,
path,
value,
})
)
}

return <Select isMulti onChange={handleChange} options={options} placeholder={label} value={filterValue} />
}

export default MultiSelect
15 changes: 14 additions & 1 deletion src/client/components/TablePaginated/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,18 +31,31 @@ export type TablePaginatedCounter = {
export type TablePaginatedEmptyListComponent = React.FC

type TablePaginatedFilterTypeMap = {
[TablePaginatedFilterType.MULTI_SELECT]: Array<string>
[TablePaginatedFilterType.SWITCH]: boolean
[TablePaginatedFilterType.TEXT]: string
}

export type TablePaginatedFilter<FilterType extends TablePaginatedFilterType> = {
type BaseTablePaginatedFilter<FilterType extends TablePaginatedFilterType> = {
defaultValue?: TablePaginatedFilterTypeMap[FilterType]
fieldName: string
hidden?: boolean
label: string
type: FilterType
}

type MultiSelectItem = {
label: string
value: string
}

type MultiSelectFilter = BaseTablePaginatedFilter<TablePaginatedFilterType.MULTI_SELECT> & {
options: Array<MultiSelectItem>
}

export type TablePaginatedFilter<FilterType extends TablePaginatedFilterType> =
FilterType extends TablePaginatedFilterType.MULTI_SELECT ? MultiSelectFilter : BaseTablePaginatedFilter<FilterType>

export type TablePaginatedSkeleton = {
baseColor: string
highlightColor: string
Expand Down
3 changes: 1 addition & 2 deletions src/client/pages/Admin/UserManagement/UserManagement.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import React from 'react'

import { ApiEndPoint } from 'meta/api/endpoint'
import { RoleName } from 'meta/user'

import TablePaginated from 'client/components/TablePaginated'
import UsersCount from 'client/pages/Admin/UserManagement/UsersCount'
Expand All @@ -13,7 +12,7 @@ const UserManagement: React.FC = () => {
const columns = useColumns()
const filters = useFilters()

const gridTemplateColumns = `repeat(${Object.values(RoleName).length + 1}, 1fr)`
const gridTemplateColumns = `repeat(${columns.length}, 1fr)`

return (
<TablePaginated
Expand Down
8 changes: 5 additions & 3 deletions src/client/pages/Admin/UserManagement/hooks/useColumns.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@ import { Column } from 'client/components/TablePaginated'
import NameField from 'client/pages/Admin/UserManagement/NameField'
import RoleField from 'client/pages/Admin/UserManagement/RoleField'

export const useColumns = (): Array<Column<User>> => {
type Returned = Array<Column<User>>

export const useColumns = (): Returned => {
const { t } = useTranslation()

return useMemo<Array<Column<User>>>(() => {
const roleColumns: Array<Column<User>> = Object.values(RoleName).map((roleName) => ({
return useMemo<Returned>(() => {
const roleColumns: Returned = Object.values(RoleName).map((roleName) => ({
component: ({ datum }) => <RoleField roleName={roleName} user={datum} />,
header: t(Users.getI18nRoleLabelKey(roleName)),
key: roleName,
Expand Down
19 changes: 16 additions & 3 deletions src/client/pages/Admin/UserManagement/hooks/useFilters.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,24 @@ import { useMemo } from 'react'
import { useTranslation } from 'react-i18next'

import { TablePaginatedFilterType } from 'meta/tablePaginated'
import { RoleName, Users } from 'meta/user'

import { TablePaginatedFilter } from 'client/components/TablePaginated/types'

type Returned = Array<
TablePaginatedFilter<TablePaginatedFilterType.TEXT> | TablePaginatedFilter<TablePaginatedFilterType.SWITCH>
>
type Returned = Array<TablePaginatedFilter<TablePaginatedFilterType>>

export const useFilters = (): Returned => {
const { t } = useTranslation()

return useMemo<Returned>(() => {
const roleOptions: Array<{
label: string
value: RoleName
}> = Object.values(RoleName).map((roleName) => ({
label: t(Users.getI18nRoleLabelKey(roleName)),
value: roleName,
}))

return [
{
fieldName: 'fullName',
Expand All @@ -26,6 +33,12 @@ export const useFilters = (): Returned => {
label: '',
type: TablePaginatedFilterType.SWITCH,
},
{
fieldName: 'roles',
label: t('common.role'),
options: roleOptions,
type: TablePaginatedFilterType.MULTI_SELECT,
},
]
}, [t])
}
3 changes: 2 additions & 1 deletion src/meta/tablePaginated/tablePaginated.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@ export type TablePaginatedCount = {
}

export enum TablePaginatedFilterType {
TEXT = 'text',
MULTI_SELECT = 'multi_select',
SWITCH = 'switch',
TEXT = 'text',
}

export type TablePaginatedFilterValues = boolean | string | Array<string>
Expand Down
Loading