diff --git a/web/usuaris/CHANGELOG.md b/web/usuaris/CHANGELOG.md index 7d05ba7a9..a2cfb38f7 100644 --- a/web/usuaris/CHANGELOG.md +++ b/web/usuaris/CHANGELOG.md @@ -2,6 +2,12 @@ All notable changes to this project will be documented in this file. +## [0.15.0] - 2024-05-08 + +### Added + +- Added Status filter + ## [0.14.0] - 2024-05-06 ### Added diff --git a/web/usuaris/package-lock.json b/web/usuaris/package-lock.json index ae5b2fd42..45d475010 100644 --- a/web/usuaris/package-lock.json +++ b/web/usuaris/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@hookform/resolvers": "^3.0.0", "@itacademy/schemas": "^0.3.0", - "@itacademy/ui": "^0.31.6", + "@itacademy/ui": "^0.31.7", "@tanstack/react-query": "^4.29.5", "@tanstack/react-query-devtools": "^4.29.6", "@tanstack/react-table": "^8.13.2", @@ -1193,9 +1193,9 @@ } }, "node_modules/@itacademy/ui": { - "version": "0.31.6", - "resolved": "https://registry.npmjs.org/@itacademy/ui/-/ui-0.31.6.tgz", - "integrity": "sha512-iQ+gCvw55YUrjPxY9nmp1ML1NoIY8vf9fadNVrTfE82hAXzffOdaSYbNYZ0NIvp3LricTOC79SLdYfF1WNTNlw==", + "version": "0.31.7", + "resolved": "https://registry.npmjs.org/@itacademy/ui/-/ui-0.31.7.tgz", + "integrity": "sha512-jk21SUMhjV8JIbCdyjx3UPR4s+uHdqezXOvOUDZ4ynxeegpVN4+mEggCHB+8Wm7vWvfiW1hrAubzcty35UKLwA==", "peerDependencies": { "react": "^18.0.0", "react-dom": "^18.0.0", diff --git a/web/usuaris/package.json b/web/usuaris/package.json index a76e9d4e4..fb53a8d13 100644 --- a/web/usuaris/package.json +++ b/web/usuaris/package.json @@ -1,7 +1,7 @@ { "name": "web_usuaris", "private": true, - "version": "0.14.0", + "version": "0.15.0", "type": "module", "scripts": { "dev": "vite", @@ -14,7 +14,7 @@ "dependencies": { "@hookform/resolvers": "^3.0.0", "@itacademy/schemas": "^0.3.0", - "@itacademy/ui": "^0.31.6", + "@itacademy/ui": "^0.31.7", "@tanstack/react-query": "^4.29.5", "@tanstack/react-query-devtools": "^4.29.6", "@tanstack/react-table": "^8.13.2", diff --git a/web/usuaris/src/__mocks__/handlers.ts b/web/usuaris/src/__mocks__/handlers.ts index 89ae24027..c828d35bb 100644 --- a/web/usuaris/src/__mocks__/handlers.ts +++ b/web/usuaris/src/__mocks__/handlers.ts @@ -1,10 +1,12 @@ import { HttpResponse, http } from 'msw' import { urls } from '../constants' +import { UserStatus } from '../types' export const handlers = [ http.get(urls.getUsers, ({ request }) => { const url = new URL(request.url) const itinerarySlug = url.searchParams.get('itinerarySlug') + const status = url.searchParams.get('status') const startDate = url.searchParams.get('startDate') const endDate = url.searchParams.get('endDate') const name = url.searchParams.get('name') @@ -12,6 +14,7 @@ export const handlers = [ if ( itinerarySlug === 'frontend-react' && + status === UserStatus.ACTIVE && ((startDate && startDate <= '2023/11/06 00:00:00.000' && endDate && @@ -34,6 +37,7 @@ export const handlers = [ { status: 200 } ) } + return HttpResponse.json( [ { diff --git a/web/usuaris/src/__tests__/hooks/useGetUsers.test.tsx b/web/usuaris/src/__tests__/hooks/useGetUsers.test.tsx index 25ac701be..defd76179 100644 --- a/web/usuaris/src/__tests__/hooks/useGetUsers.test.tsx +++ b/web/usuaris/src/__tests__/hooks/useGetUsers.test.tsx @@ -3,6 +3,7 @@ import { useGetUsers } from '../../hooks/useGetUsers' import { renderHook, waitFor } from '../test-utils' import { queryClient } from '../setup' import { type TFilters } from '../../types' +import { UserStatus } from '../../types' describe('useGetUsers', () => { it('fetches users successfully', async () => { @@ -63,7 +64,7 @@ describe('useGetUsers', () => { it('handles filters correctly', async () => { const filters: TFilters = { itinerarySlug: 'example-slug', - status: 'ACTIVE', + status: UserStatus.ACTIVE, startDate: '2023-03-05T00:00:00.000Z', endDate: '2026-03-05T00:00:00.000Z', name: 'John Doe', diff --git a/web/usuaris/src/__tests__/hooks/useUpdateUser.test.tsx b/web/usuaris/src/__tests__/hooks/useUpdateUser.test.tsx index d1bef38c8..2baee6e5f 100644 --- a/web/usuaris/src/__tests__/hooks/useUpdateUser.test.tsx +++ b/web/usuaris/src/__tests__/hooks/useUpdateUser.test.tsx @@ -5,6 +5,7 @@ import { setupServer } from 'msw/node' import { useUpdateUser } from '../../hooks' import { queryClient } from '../setup' import { handlers } from '../../__mocks__/handlers' +import { UserStatus } from '../../types' const server = setupServer(...handlers) beforeEach(() => { @@ -50,7 +51,7 @@ describe('useUpdateUser hook', () => { act(() => { result.current.changeUserStatus.mutate({ id: '1', - status: 'BLOCKED', + status: UserStatus.BLOCKED, }) }) await waitFor(() => { diff --git a/web/usuaris/src/__tests__/molecules/StatusDropdown.test.tsx b/web/usuaris/src/__tests__/molecules/StatusDropdown.test.tsx new file mode 100644 index 000000000..9ff8488d9 --- /dev/null +++ b/web/usuaris/src/__tests__/molecules/StatusDropdown.test.tsx @@ -0,0 +1,40 @@ +import { vi } from 'vitest' +import { fireEvent, render, screen } from '../test-utils' +import { StatusDropdown } from '../../components/molecules' +import { UserStatus } from '../../types' + +const mockHandleClick = vi.fn() + +afterEach(() => { + vi.restoreAllMocks() +}) + +describe('StatusDropdown', () => { + it('renders correctly', () => { + render() + + expect(screen.getByText(/estat/i)).toBeInTheDocument() + + expect(screen.getByTitle(/obre/i)).toBeInTheDocument() + }) + + it('renders all status with icon and returns selected option to parent', async () => { + render() + + const dropdownHeader = screen.getByTestId('dropdown-header') + expect(dropdownHeader).toHaveTextContent(/estat/i) + + fireEvent.click(dropdownHeader) + + const activeStatus = screen.getByTestId('ACTIVE') + expect(activeStatus).toBeInTheDocument() + expect(screen.getByText(/pendent/i)).toBeInTheDocument() + expect(screen.getByText(/bloquejat/i)).toBeInTheDocument() + + fireEvent.click(activeStatus) + + expect(dropdownHeader).toHaveTextContent(/actiu/i) + + expect(mockHandleClick).toHaveBeenCalledWith(UserStatus.ACTIVE) + }) +}) diff --git a/web/usuaris/src/__tests__/organisms/FiltersWidget.test.tsx b/web/usuaris/src/__tests__/organisms/FiltersWidget.test.tsx index 9ca2efe02..3c4a227e6 100644 --- a/web/usuaris/src/__tests__/organisms/FiltersWidget.test.tsx +++ b/web/usuaris/src/__tests__/organisms/FiltersWidget.test.tsx @@ -1,5 +1,6 @@ -import { fireEvent, render, screen, waitFor } from '../test-utils' +import { fireEvent, render, screen, waitFor, within } from '../test-utils' import { FiltersWidget } from '../../components/organisms' +import { UserStatus } from '../../types' const mockSetFilters = vi.fn() @@ -20,18 +21,21 @@ describe('FiltersWidget', () => { expect(screen.getByText(/especialitat/i)).toBeInTheDocument() ) - const dropdownHeader = screen.getByTestId('dropdown-header') + const itineraryDropdown = screen.getByTestId('itinerary-dropdown') - expect(dropdownHeader).toHaveTextContent(/especialitat/i) + const itineraryDropdownHeader = + within(itineraryDropdown).getByTestId('dropdown-header') - fireEvent.click(dropdownHeader) + expect(itineraryDropdownHeader).toHaveTextContent(/especialitat/i) - const reactOption = screen.getByText('Frontend React') + fireEvent.click(itineraryDropdownHeader) + + const reactOption = screen.getByTestId('1') expect(reactOption).toBeInTheDocument() fireEvent.click(reactOption) - expect(dropdownHeader).toHaveTextContent('Frontend React') + expect(itineraryDropdown).toHaveTextContent('Frontend React') expect(screen.queryByText(/especialitat/i)).not.toBeInTheDocument() expect(mockSetFilters).toHaveBeenCalledWith({ @@ -42,7 +46,7 @@ describe('FiltersWidget', () => { it('deletes itinerary deselected and sends other filters to parent', async () => { render( ) @@ -51,30 +55,101 @@ describe('FiltersWidget', () => { expect(screen.getByText(/especialitat/i)).toBeInTheDocument() ) - const dropdownHeader = screen.getByTestId('dropdown-header') + const itineraryDropdown = screen.getByTestId('itinerary-dropdown') + + const itineraryDropdownHeader = + within(itineraryDropdown).getByTestId('dropdown-header') + + expect(itineraryDropdownHeader).toHaveTextContent(/especialitat/i) - fireEvent.click(dropdownHeader) + fireEvent.click(itineraryDropdownHeader) - const reactOption = screen.getByText('Frontend React') + const reactOption = screen.getByTestId('1') expect(reactOption).toBeInTheDocument() fireEvent.click(reactOption) - expect(dropdownHeader).toHaveTextContent('Frontend React') + expect(itineraryDropdownHeader).toHaveTextContent('Frontend React') expect(mockSetFilters).toHaveBeenCalledWith({ itinerarySlug: 'react', - status: 'ACTIVE', + status: UserStatus.ACTIVE, + }) + + const deselectReact = within(itineraryDropdownHeader).getByTestId( + 'deselect-1' + ) + + fireEvent.click(deselectReact) + + expect(mockSetFilters).toHaveBeenCalledWith({ + status: UserStatus.ACTIVE, + }) + }) + + it('shows status selected in dropdown and sends it to parent', async () => { + render() + + const statusDropdown = screen.getByTestId('status-dropdown') + + const statusDropdownHeader = + within(statusDropdown).getByTestId('dropdown-header') + + expect(statusDropdownHeader).toHaveTextContent(/estat/i) + + fireEvent.click(statusDropdownHeader) + + const activeOption = screen.getByTestId('ACTIVE') + expect(activeOption).toBeInTheDocument() + + fireEvent.click(activeOption) + + expect(statusDropdownHeader).toHaveTextContent('Actiu') + expect(screen.queryByText(/estat/i)).not.toBeInTheDocument() + + expect(mockSetFilters).toHaveBeenCalledWith({ + status: UserStatus.ACTIVE, + }) + }) + + it('deletes status deselected and sends other filters to parent', () => { + render( + + ) + + const statusDropdown = screen.getByTestId('status-dropdown') + + const statusDropdownHeader = + within(statusDropdown).getByTestId('dropdown-header') + + expect(statusDropdownHeader).toHaveTextContent(/estat/i) + + fireEvent.click(statusDropdownHeader) + + const activeOption = screen.getByTestId('ACTIVE') + expect(activeOption).toBeInTheDocument() + + fireEvent.click(activeOption) + + expect(statusDropdownHeader).toHaveTextContent('Actiu') + + expect(mockSetFilters).toHaveBeenCalledWith({ + itinerarySlug: 'frontend-react', + status: UserStatus.ACTIVE, }) - fireEvent.click(dropdownHeader) + fireEvent.click(statusDropdownHeader) - const deselectReact = screen.getAllByTestId('deselect-1') + const deselectActive = + within(statusDropdownHeader).getByTestId('deselect-ACTIVE') - fireEvent.click(deselectReact[0]) + fireEvent.click(deselectActive) expect(mockSetFilters).toHaveBeenCalledWith({ - status: 'ACTIVE', + itinerarySlug: 'frontend-react', }) }) @@ -97,7 +172,7 @@ describe('FiltersWidget', () => { it('deletes search value when closing search and updates filters accordingly', () => { render( ) @@ -107,7 +182,7 @@ describe('FiltersWidget', () => { waitFor(() => expect(mockSetFilters).toHaveBeenCalledWith({ - status: 'ACTIVE', + status: UserStatus.ACTIVE, name: 'marc', dni: 'marc', }) @@ -146,7 +221,7 @@ describe('FiltersWidget', () => { it('deletes dates when closing dates inputs and updates filters accordingly', () => { render( ) diff --git a/web/usuaris/src/__tests__/organisms/UsersTable.test.tsx b/web/usuaris/src/__tests__/organisms/UsersTable.test.tsx index 7e1949684..4e7f308ae 100644 --- a/web/usuaris/src/__tests__/organisms/UsersTable.test.tsx +++ b/web/usuaris/src/__tests__/organisms/UsersTable.test.tsx @@ -2,6 +2,7 @@ import { fireEvent, render, screen, waitFor } from '../test-utils' import { UsersTable } from '../../components/organisms' import { errorHandlers } from '../../__mocks__/handlers' import { server } from '../../__mocks__/server' +import { UserStatus } from '../../types' afterEach(() => { server.resetHandlers() @@ -59,6 +60,7 @@ describe('UsersTable', () => { = ({ openText={t('Abrir')} closeText={t('Cerrar')} deselectText={t('Deseleccionar')} + data-testid="itinerary-dropdown" /> ) : null } diff --git a/web/usuaris/src/components/molecules/StatusDropdown.tsx b/web/usuaris/src/components/molecules/StatusDropdown.tsx new file mode 100644 index 000000000..4f17501e5 --- /dev/null +++ b/web/usuaris/src/components/molecules/StatusDropdown.tsx @@ -0,0 +1,80 @@ +import { FC, useEffect, useState } from 'react' +import styled from 'styled-components' +import { + colors, + dimensions, + Dropdown, + font, + type TDropdownOption, +} from '@itacademy/ui' +import { useTranslation } from 'react-i18next' +import { UserStatus } from '../../types' + +const StyledDropdown = styled(Dropdown)` + && button { + width: 210px; + padding: ${dimensions.spacing.xxs}; + font-size: ${font.xs}; + font-weight: 500; + + &:hover { + background-color: ${colors.primary}; + color: ${colors.white}; + } + + > span { + padding-left: ${dimensions.spacing.xxxs}; + font-weight: 400; + } + } +` + +type TStatusItem = { + id: string + name: string + icon?: string +} + +type TStatusDropdown = { + handleStatus: (value: UserStatus | undefined) => void +} + +const statusIcon = { + [UserStatus.ACTIVE]: 'task_alt', + [UserStatus.PENDING]: 'pending', + [UserStatus.BLOCKED]: 'block', +} + +export const StatusDropdown: FC = ({ handleStatus }) => { + const { t } = useTranslation() + + const [statusList, setStatusList] = useState([]) + + useEffect(() => { + const statusDropdownList = Object.values(UserStatus).map((status) => ({ + id: status.toString(), + name: t(`${status}`), + icon: statusIcon[status], + })) + setStatusList(statusDropdownList) + }, [t]) + + const handleSelectedValue = (selectedOption: TDropdownOption | undefined) => { + const selectedStatus: UserStatus | undefined = Object.values( + UserStatus + ).find((status) => status === selectedOption?.id) + handleStatus(selectedStatus) + } + + return statusList && statusList.length > 0 ? ( + + ) : null +} diff --git a/web/usuaris/src/components/molecules/index.ts b/web/usuaris/src/components/molecules/index.ts index 5ce9b1603..c13e681e1 100644 --- a/web/usuaris/src/components/molecules/index.ts +++ b/web/usuaris/src/components/molecules/index.ts @@ -1,3 +1,4 @@ export { DateRange, type TDateRange } from './DateRange' export { ItineraryDropdown } from './ItineraryDropdown' +export { StatusDropdown } from './StatusDropdown' export { Table, type TTable } from './Table' diff --git a/web/usuaris/src/components/organisms/FiltersWidget.tsx b/web/usuaris/src/components/organisms/FiltersWidget.tsx index efd07f85a..2d29a17fc 100644 --- a/web/usuaris/src/components/organisms/FiltersWidget.tsx +++ b/web/usuaris/src/components/organisms/FiltersWidget.tsx @@ -2,9 +2,9 @@ import { FC, useCallback } from 'react' import styled from 'styled-components' import { FlexBox, Search, dimensions } from '@itacademy/ui' import { useTranslation } from 'react-i18next' -import { DateRange } from '../molecules' +import { DateRange, StatusDropdown } from '../molecules' import { ItineraryDropdown } from '../molecules/ItineraryDropdown' -import { type TFilters, TItinerary } from '../../types' +import { type TFilters, TItinerary, UserStatus } from '../../types' const FiltersContainer = styled(FlexBox)` width: 100%; @@ -22,6 +22,10 @@ export const FiltersWidget: FC = ({ filters, setFilters }) => { setFilters({ ...filters, itinerarySlug: itinerary?.slug }) } + const handleStatus = (selectedStatus: UserStatus | undefined) => { + setFilters({ ...filters, status: selectedStatus }) + } + const handleSearch = useCallback( (searchValue: string) => { setFilters({ @@ -33,6 +37,7 @@ export const FiltersWidget: FC = ({ filters, setFilters }) => { // eslint-disable-next-line react-hooks/exhaustive-deps [filters] ) + const handleDates = (startDate: Date | null, endDate: Date | null) => { setFilters({ ...filters, @@ -48,6 +53,7 @@ export const FiltersWidget: FC = ({ filters, setFilters }) => { gap={dimensions.spacing.xs} > + = ({ filtersSelected }) => { const { isLoading, isError, data: users } = useGetUsers(filters) - const [selectedStatus, setSelectedStatus] = useState( + const [selectedStatus, setSelectedStatus] = useState( undefined ) const [selectedUsers, setSelectedUsers] = useState([]) @@ -42,8 +42,9 @@ export const UsersTable: FC = ({ filtersSelected }) => { setFilters(filtersSelected) }, [filtersSelected]) - const handleStatus = (id: string, status: string) => { - const updatedStatus = status === 'ACTIVE' ? 'BLOCKED' : 'ACTIVE' + const handleStatus = (id: string, status: UserStatus) => { + const updatedStatus = + status === UserStatus.ACTIVE ? UserStatus.BLOCKED : UserStatus.ACTIVE const updatedUser = { id, @@ -70,7 +71,7 @@ export const UsersTable: FC = ({ filtersSelected }) => { const changeSelection = ( e: ChangeEvent, id: string, - status: string + status: UserStatus ) => { if (e.target.checked) { setSelectedStatus(status) @@ -95,13 +96,13 @@ export const UsersTable: FC = ({ filtersSelected }) => { const columHelper = createColumnHelper() - const columns: ColumnDef[] = [ + const columns: ColumnDef[] = [ columHelper.accessor('id', { header: '', cell: ({ row }) => { const id: string = row.getValue('id') const name: string = row.getValue('name') - const status: string = row.getValue('status') + const status: UserStatus = row.getValue('status') let isDisabled: boolean | undefined if (selectedStatus && selectedStatus !== status) { @@ -130,7 +131,7 @@ export const UsersTable: FC = ({ filtersSelected }) => { header: `${t('Nombre')}`, cell: ({ row }) => { const name: string = row.getValue('name') - const status: string = row.getValue('status') + const status: UserStatus = row.getValue('status') let isDisabled: boolean | undefined if (selectedStatus && selectedStatus !== status) { @@ -145,7 +146,7 @@ export const UsersTable: FC = ({ filtersSelected }) => { header: 'DNI/NIE', cell: ({ row }) => { const dni: string = row.getValue('dni') - const status: string = row.getValue('status') + const status: UserStatus = row.getValue('status') let isDisabled: boolean | undefined if (selectedStatus && selectedStatus !== status) { @@ -160,7 +161,7 @@ export const UsersTable: FC = ({ filtersSelected }) => { header: `${t('Especialización')}`, cell: ({ row }) => { const itineraryName: string = row.getValue('itineraryName') - const status: string = row.getValue('status') + const status: UserStatus = row.getValue('status') let isDisabled: boolean | undefined if (selectedStatus && selectedStatus !== status) { @@ -181,9 +182,8 @@ export const UsersTable: FC = ({ filtersSelected }) => { ), cell: ({ row }) => { - const status: string = row.getValue('status') + const status: UserStatus = row.getValue('status') let isDisabled: boolean | undefined - let displayedStatus: string = '' if (selectedStatus && selectedStatus !== status) { isDisabled = true @@ -191,16 +191,9 @@ export const UsersTable: FC = ({ filtersSelected }) => { isDisabled = undefined } - if (status === 'PENDING') { - displayedStatus = t('pendiente') - } else if (status === 'BLOCKED') { - displayedStatus = t('bloqueado') - } else { - displayedStatus = t('activo') - } return ( - {displayedStatus} + {t(`${status}`)} ) }, @@ -209,7 +202,7 @@ export const UsersTable: FC = ({ filtersSelected }) => { header: `${t('Fecha alta')}`, cell: ({ row }) => { const createdAt = row.getValue('createdAt') - const status: string = row.getValue('status') + const status: UserStatus = row.getValue('status') const formattedDate = new Date(createdAt as string).toLocaleDateString() let isDisabled: boolean | undefined @@ -232,7 +225,7 @@ export const UsersTable: FC = ({ filtersSelected }) => { ), cell: ({ row }) => { - const status: string = row.getValue('status') + const status: UserStatus = row.getValue('status') const id: string = row.getValue('id') let isDisabled: boolean | undefined let buttonTxt: string = '' @@ -243,9 +236,9 @@ export const UsersTable: FC = ({ filtersSelected }) => { isDisabled = undefined } - if (status === 'PENDING') { + if (status === UserStatus.PENDING) { buttonTxt = t('Aceptar') - } else if (status === 'BLOCKED') { + } else if (status === UserStatus.BLOCKED) { buttonTxt = t('Desbloquear') } else { buttonTxt = t('Bloquear') diff --git a/web/usuaris/src/locales/cat.json b/web/usuaris/src/locales/cat.json index 10b09a8f6..51f6f6234 100644 --- a/web/usuaris/src/locales/cat.json +++ b/web/usuaris/src/locales/cat.json @@ -139,9 +139,9 @@ "Especialización": "Especialització", "Fecha alta": "Data alta", "Acciones": "Accions", - "pendiente": "Pendent", - "activo": "Actiu", - "bloqueado": "Bloquejat", + "PENDING": "Pendent", + "ACTIVE": "Actiu", + "BLOCKED": "Bloquejat", "Aceptar": "Acceptar", "Bloquear": "Bloquejar", "Desbloquear": "Desbloquejar", diff --git a/web/usuaris/src/locales/en.json b/web/usuaris/src/locales/en.json index 6995abff9..2a50f059a 100644 --- a/web/usuaris/src/locales/en.json +++ b/web/usuaris/src/locales/en.json @@ -139,9 +139,9 @@ "Especialización": "Specialization", "Fecha alta": "Registration date", "Acciones": "Actions", - "pendiente": "Pending", - "activo": "Active", - "bloqueado": "Blocked", + "PENDING": "Pending", + "ACTIVE": "Active", + "BLOCKED": "Blocked", "Aceptar": "Accept", "Bloquear": "Block", "Desbloquear": "Unblock", diff --git a/web/usuaris/src/locales/es.json b/web/usuaris/src/locales/es.json index 940f001e1..836ec187d 100644 --- a/web/usuaris/src/locales/es.json +++ b/web/usuaris/src/locales/es.json @@ -139,9 +139,9 @@ "Especialización": "Especialización", "Fecha alta": "Fecha alta", "Acciones": "Acciones", - "pendiente": "Pendiente", - "activo": "Activo", - "bloqueado": "Bloqueado", + "PENDING": "Pendiente", + "ACTIVE": "Activo", + "BLOCKED": "Bloqueado", "Aceptar": "Aceptar", "Bloquear": "Bloquear", "Desbloquear": "Desbloquear", diff --git a/web/usuaris/src/types/index.tsx b/web/usuaris/src/types/index.tsx index 1a0ab9e89..6f792c87b 100644 --- a/web/usuaris/src/types/index.tsx +++ b/web/usuaris/src/types/index.tsx @@ -1,3 +1,4 @@ +export { UserStatus } from './types' export { type TFilters } from './types' export { type TItinerary } from './types' export { type TUpdatedUser } from './types' diff --git a/web/usuaris/src/types/types.tsx b/web/usuaris/src/types/types.tsx index 12b90b1c4..f3b9450cb 100644 --- a/web/usuaris/src/types/types.tsx +++ b/web/usuaris/src/types/types.tsx @@ -1,6 +1,12 @@ +export enum UserStatus { + ACTIVE = 'ACTIVE', + PENDING = 'PENDING', + BLOCKED = 'BLOCKED', +} + export type TFilters = { itinerarySlug?: string - status?: string + status?: UserStatus startDate?: string endDate?: string name?: string @@ -21,7 +27,7 @@ export type TUpdatedUser = { name?: string password?: string role?: string - status?: string + status?: UserStatus deletedAt?: string itineraryId?: string } @@ -30,7 +36,7 @@ export type TUserData = { id: string name: string dni: string - status: string + status: UserStatus createdAt: string itineraryName: string }