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
}