From c7898b2618402a4e26f7b054d93f1c2786f6cdcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Jim=C3=A9nez?= <107618143+Xerxi88@users.noreply.github.com> Date: Mon, 13 May 2024 10:04:45 +0200 Subject: [PATCH] 1187-add-rol-column-and-filter (#1211) * add-column-role * version changed * delete rol useState * change version package.json * change version package.json * change tests * changed tests * types changes * type changes * enmus and changed version * change version ui * version ui changed * version ui changed * version ui changed * version ui changed * version ui changed * Update package.json * Update package-lock.json * Update FiltersWidget.tsx * Update handlers.ts * Update en.json * Update es.json * Update UsersTable.tsx * Update types.tsx * Update RolFilter.tsx * Delete web/package-lock.json * Update RolFilter.tsx * Update RolFilter.test.tsx * Update RolFilter.test.tsx * Update RolFilter.tsx * Update package-lock.json * Update package.json * changes rol * conflict resolved * Update package-lock.json * ColumnDef arguments changed * enums changed * Update SideMenu.tsx * update * update --------- Co-authored-by: Kevin Mamaqi --- package-lock.json | 6 -- web/usuaris/CHANGELOG.md | 11 ++++ web/usuaris/package-lock.json | 6 +- web/usuaris/package.json | 4 +- web/usuaris/src/__mocks__/handlers.ts | 8 ++- .../src/__tests__/hooks/useGetUsers.test.tsx | 7 ++- .../__tests__/molecules/RoleFilter.test.tsx | 51 ++++++++++++++++ .../__tests__/organisms/UsersTable.test.tsx | 7 ++- .../src/components/molecules/RoleFilter.tsx | 60 +++++++++++++++++++ web/usuaris/src/components/molecules/index.ts | 2 + .../components/organisms/FiltersWidget.tsx | 7 +++ .../src/components/organisms/SideMenu.tsx | 3 +- .../organisms/UsersTable/UsersTable.styles.ts | 7 ++- .../organisms/UsersTable/UsersTable.tsx | 22 ++++++- web/usuaris/src/constants/index.ts | 1 + web/usuaris/src/constants/roles.ts | 13 ++++ web/usuaris/src/helpers/fetchers.ts | 1 + web/usuaris/src/locales/cat.json | 33 ++-------- web/usuaris/src/locales/en.json | 31 ++-------- web/usuaris/src/locales/es.json | 31 ++-------- web/usuaris/src/types/types.tsx | 17 +++++- 21 files changed, 224 insertions(+), 104 deletions(-) delete mode 100644 package-lock.json create mode 100644 web/usuaris/src/__tests__/molecules/RoleFilter.test.tsx create mode 100644 web/usuaris/src/components/molecules/RoleFilter.tsx create mode 100644 web/usuaris/src/constants/roles.ts diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index d5557062c..000000000 --- a/package-lock.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "ita-wiki", - "lockfileVersion": 3, - "requires": true, - "packages": {} -} diff --git a/web/usuaris/CHANGELOG.md b/web/usuaris/CHANGELOG.md index a2cfb38f7..b4ecdef4c 100644 --- a/web/usuaris/CHANGELOG.md +++ b/web/usuaris/CHANGELOG.md @@ -2,6 +2,15 @@ All notable changes to this project will be documented in this file. + +## [0.16.0] - 2024-05-09 + +### Added + +- Added Role column to UsersTable +- Added Roles filter feature + + ## [0.15.0] - 2024-05-08 ### Added @@ -14,6 +23,7 @@ All notable changes to this project will be documented in this file. - Refetch users after user status changes to update interface + ## [0.13.0] - 2024-04-29 ### Added @@ -22,6 +32,7 @@ All notable changes to this project will be documented in this file. - Added dates to filters to fetch users in FiltersWidget - Changed qs to handle null, undefined and empty string + ## [0.12.0] - 2024-04-29 ### Added diff --git a/web/usuaris/package-lock.json b/web/usuaris/package-lock.json index 45d475010..b671a3b78 100644 --- a/web/usuaris/package-lock.json +++ b/web/usuaris/package-lock.json @@ -1,12 +1,12 @@ { "name": "web_usuaris", - "version": "0.13.0", + "version": "0.16.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "web_usuaris", - "version": "0.13.0", + "version": "0.16.0", "dependencies": { "@hookform/resolvers": "^3.0.0", "@itacademy/schemas": "^0.3.0", @@ -53,7 +53,7 @@ "msw": "2.1.5", "prettier": "2.8.4", "typescript": "^5.0.4", - "vite": "^5.0.13", + "vite": "5.0.13", "vitest": "1.2.1" } }, diff --git a/web/usuaris/package.json b/web/usuaris/package.json index fb53a8d13..daf62e6a9 100644 --- a/web/usuaris/package.json +++ b/web/usuaris/package.json @@ -1,7 +1,7 @@ { "name": "web_usuaris", "private": true, - "version": "0.15.0", + "version": "0.16.0", "type": "module", "scripts": { "dev": "vite", @@ -57,7 +57,7 @@ "msw": "2.1.5", "prettier": "2.8.4", "typescript": "^5.0.4", - "vite": "^5.0.13", + "vite": "5.0.13", "vitest": "1.2.1" } } diff --git a/web/usuaris/src/__mocks__/handlers.ts b/web/usuaris/src/__mocks__/handlers.ts index c828d35bb..42ee9d7b0 100644 --- a/web/usuaris/src/__mocks__/handlers.ts +++ b/web/usuaris/src/__mocks__/handlers.ts @@ -1,6 +1,7 @@ import { HttpResponse, http } from 'msw' import { urls } from '../constants' import { UserStatus } from '../types' +import { UserRole } from '../types/types' export const handlers = [ http.get(urls.getUsers, ({ request }) => { @@ -45,6 +46,7 @@ export const handlers = [ name: 'Ona Sitgar', dni: '12345678A', status: 'PENDING', + role: UserRole.ADMIN, createdAt: '2023/11/05 00:00:00.000', itineraryName: 'Backend Node', }, @@ -53,6 +55,7 @@ export const handlers = [ name: 'Marc Bofill', dni: '87654321B', status: 'ACTIVE', + role: UserRole.REGISTERED, createdAt: '2023/11/06 00:00:00.000', itineraryName: 'Frontend React', }, @@ -61,6 +64,7 @@ export const handlers = [ name: 'Montserrat Capdevila', dni: '45678912C', status: 'BLOCKED', + role: UserRole.REGISTERED, createdAt: '2023/11/07 00:00:00.000', itineraryName: 'Fullstack Php', }, @@ -69,6 +73,7 @@ export const handlers = [ name: 'Anna Brull', dni: '45678912D', status: 'BLOCKED', + role: UserRole.ADMIN, createdAt: '2023/11/08 00:00:00.000', itineraryName: 'Frontend React', }, @@ -77,6 +82,7 @@ export const handlers = [ name: 'Marc Serra', dni: '12378912D', status: 'BLOCKED', + role: UserRole.ADMIN, createdAt: '2023/11/09 00:00:00.000', itineraryName: 'Frontend Angular', }, @@ -106,7 +112,7 @@ export const handlers = [ { dni: '12345678A', email: 'test@example.cat', - role: 'ADMIN', + role: UserRole.ADMIN, }, ], { status: 200 } diff --git a/web/usuaris/src/__tests__/hooks/useGetUsers.test.tsx b/web/usuaris/src/__tests__/hooks/useGetUsers.test.tsx index defd76179..11ccf670e 100644 --- a/web/usuaris/src/__tests__/hooks/useGetUsers.test.tsx +++ b/web/usuaris/src/__tests__/hooks/useGetUsers.test.tsx @@ -4,6 +4,7 @@ import { renderHook, waitFor } from '../test-utils' import { queryClient } from '../setup' import { type TFilters } from '../../types' import { UserStatus } from '../../types' +import { UserRole } from '../../types/types' describe('useGetUsers', () => { it('fetches users successfully', async () => { @@ -23,6 +24,7 @@ describe('useGetUsers', () => { name: 'Ona Sitgar', dni: '12345678A', status: 'PENDING', + role: UserRole.ADMIN, createdAt: '2023/11/05 00:00:00.000', itineraryName: 'Backend Node', }, @@ -31,6 +33,7 @@ describe('useGetUsers', () => { name: 'Marc Bofill', dni: '87654321B', status: 'ACTIVE', + role: UserRole.REGISTERED, createdAt: '2023/11/06 00:00:00.000', itineraryName: 'Frontend React', }, @@ -39,6 +42,7 @@ describe('useGetUsers', () => { name: 'Montserrat Capdevila', dni: '45678912C', status: 'BLOCKED', + role: UserRole.REGISTERED, createdAt: '2023/11/07 00:00:00.000', itineraryName: 'Fullstack Php', }, @@ -47,6 +51,7 @@ describe('useGetUsers', () => { name: 'Anna Brull', dni: '45678912D', status: 'BLOCKED', + role: UserRole.ADMIN, createdAt: '2023/11/08 00:00:00.000', itineraryName: 'Frontend React', }, @@ -55,6 +60,7 @@ describe('useGetUsers', () => { name: 'Marc Serra', dni: '12378912D', status: 'BLOCKED', + role: UserRole.ADMIN, createdAt: '2023/11/09 00:00:00.000', itineraryName: 'Frontend Angular', }, @@ -69,7 +75,6 @@ describe('useGetUsers', () => { endDate: '2026-03-05T00:00:00.000Z', name: 'John Doe', dni: '99999999R', - role: 'ADMIN', } const wrapper = ({ children }: { children: React.ReactNode }) => ( {children} diff --git a/web/usuaris/src/__tests__/molecules/RoleFilter.test.tsx b/web/usuaris/src/__tests__/molecules/RoleFilter.test.tsx new file mode 100644 index 000000000..82067f1af --- /dev/null +++ b/web/usuaris/src/__tests__/molecules/RoleFilter.test.tsx @@ -0,0 +1,51 @@ +import { vi } from 'vitest' +import { fireEvent, render, screen, waitFor } from '../test-utils' +import { RoleFilter } from '../../components/molecules/RoleFilter' +import { UserRole } from '../../types/types' +import { roles } from '../../constants' + +const mockHandleClick = vi.fn() + +afterEach(() => { + vi.restoreAllMocks() +}) + +describe('RolesFilter', () => { + it('renders correctly', () => { + render() + + waitFor(() => expect(screen.getByText(/rol/i)).toBeInTheDocument()) + }) + + it('renders RoleList options when dropdown is clicked', async () => { + render() + + const dropdown = screen.getByTestId('dropdown-header') + + fireEvent.click(dropdown) + + const promises = roles.map((role) => + waitFor(() => screen.getByTestId(role.id)) + ) + + await Promise.all(promises) + }) + + it('calls handleRole with the correct role when an option is clicked', () => { + render() + + const dropdown = screen.getByTestId('dropdown-header') + + fireEvent.click(dropdown) + + const roleOption = screen.getByText(/ADMIN/i) + + fireEvent.click(roleOption) + + expect(mockHandleClick).toHaveBeenCalledWith({ + id: UserRole.ADMIN, + name: 'Administrador', + slug: UserRole.ADMIN, + }) + }) +}) diff --git a/web/usuaris/src/__tests__/organisms/UsersTable.test.tsx b/web/usuaris/src/__tests__/organisms/UsersTable.test.tsx index 4e7f308ae..942d2e86d 100644 --- a/web/usuaris/src/__tests__/organisms/UsersTable.test.tsx +++ b/web/usuaris/src/__tests__/organisms/UsersTable.test.tsx @@ -3,6 +3,7 @@ import { UsersTable } from '../../components/organisms' import { errorHandlers } from '../../__mocks__/handlers' import { server } from '../../__mocks__/server' import { UserStatus } from '../../types' +import { UserRole } from '../../types/types' afterEach(() => { server.resetHandlers() @@ -37,13 +38,16 @@ describe('UsersTable', () => { expect(screen.getByText(/Pendent/i)).toBeInTheDocument() expect(screen.getByText(/Backend Node/i)).toBeInTheDocument() expect(screen.getByText(/Acceptar/i)).toBeInTheDocument() - expect(screen.getByText(/Actiu/i)).toBeInTheDocument() expect(screen.getByText('Bloquejar')).toBeInTheDocument() + expect(screen.getByText(/Actiu/i)).toBeInTheDocument() expect(screen.getByText(/Fullstack Php/i)).toBeInTheDocument() const frontReact = screen.getAllByText(/Frontend React/i) frontReact.forEach((item) => expect(item).toBeInTheDocument()) + const adminRol = screen.getAllByText(/Administrador/i) + adminRol.forEach((item) => expect(item).toBeInTheDocument()) + const blockedStatus = screen.getAllByText('Bloquejat') blockedStatus.forEach((status) => expect(status).toBeInTheDocument()) @@ -65,6 +69,7 @@ describe('UsersTable', () => { endDate: '2023/11/06 00:00:00.000', name: 'marc', dni: 'marc', + role: UserRole.ADMIN, }} /> ) diff --git a/web/usuaris/src/components/molecules/RoleFilter.tsx b/web/usuaris/src/components/molecules/RoleFilter.tsx new file mode 100644 index 000000000..57771dc34 --- /dev/null +++ b/web/usuaris/src/components/molecules/RoleFilter.tsx @@ -0,0 +1,60 @@ +import { FC } from 'react' +import styled from 'styled-components' +import { + colors, + dimensions, + Dropdown, + font, + type TDropdownOption, +} from '@itacademy/ui' +import { useTranslation } from 'react-i18next' +import { TRole } from '../../types/types' +import { roles } from '../../constants' + +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 TRoleFilter = { + handleRole: (value: TRole | undefined) => void +} + +export const RoleFilter: FC = ({ handleRole }) => { + const { t } = useTranslation() + + const handleSelectedValue = (selectedOption: TDropdownOption | undefined) => { + if (selectedOption) { + const selectedRole = roles.find( + (role: TRole) => role.id === selectedOption.id + ) + if (selectedRole) { + handleRole(selectedRole) + } + } else { + handleRole(undefined) + } + } + + return roles && roles.length > 0 ? ( + + ) : null +} diff --git a/web/usuaris/src/components/molecules/index.ts b/web/usuaris/src/components/molecules/index.ts index c13e681e1..2d7926fcb 100644 --- a/web/usuaris/src/components/molecules/index.ts +++ b/web/usuaris/src/components/molecules/index.ts @@ -1,4 +1,6 @@ export { DateRange, type TDateRange } from './DateRange' export { ItineraryDropdown } from './ItineraryDropdown' export { StatusDropdown } from './StatusDropdown' +export { RoleFilter } from './RoleFilter' + 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 2d29a17fc..674531c33 100644 --- a/web/usuaris/src/components/organisms/FiltersWidget.tsx +++ b/web/usuaris/src/components/organisms/FiltersWidget.tsx @@ -5,6 +5,8 @@ import { useTranslation } from 'react-i18next' import { DateRange, StatusDropdown } from '../molecules' import { ItineraryDropdown } from '../molecules/ItineraryDropdown' import { type TFilters, TItinerary, UserStatus } from '../../types' +import { RoleFilter } from '../molecules/RoleFilter' +import { TRole } from '../../types/types' const FiltersContainer = styled(FlexBox)` width: 100%; @@ -21,6 +23,9 @@ export const FiltersWidget: FC = ({ filters, setFilters }) => { const handleItinerary = (itinerary: TItinerary | undefined) => { setFilters({ ...filters, itinerarySlug: itinerary?.slug }) } + const handleRole = (role: TRole | undefined) => { + setFilters({ ...filters, role: role?.slug }) + } const handleStatus = (selectedStatus: UserStatus | undefined) => { setFilters({ ...filters, status: selectedStatus }) @@ -54,6 +59,8 @@ export const FiltersWidget: FC = ({ filters, setFilters }) => { > + + ` @@ -39,9 +40,9 @@ export const StatusStyled = styled.div` border-radius: ${dimensions.borderRadius.xs}; background-color: ${({ status }) => { switch (status) { - case 'PENDING': + case UserStatus.PENDING: return '#FCD9D9' - case 'BLOCKED': + case UserStatus.BLOCKED: return '#FCDEC0' default: return '#C6F1DA' diff --git a/web/usuaris/src/components/organisms/UsersTable/UsersTable.tsx b/web/usuaris/src/components/organisms/UsersTable/UsersTable.tsx index 6a27b9967..5c54cbd98 100644 --- a/web/usuaris/src/components/organisms/UsersTable/UsersTable.tsx +++ b/web/usuaris/src/components/organisms/UsersTable/UsersTable.tsx @@ -19,6 +19,7 @@ import { StatusStyled, TableContainer, } from './UsersTable.styles' +import { UserRole } from '../../../types/types' type TUsersTable = { filtersSelected: TFilters | Record @@ -34,6 +35,7 @@ export const UsersTable: FC = ({ filtersSelected }) => { const [selectedStatus, setSelectedStatus] = useState( undefined ) + const [selectedUsers, setSelectedUsers] = useState([]) const { changeUserStatus } = useUpdateUser() @@ -96,7 +98,7 @@ export const UsersTable: FC = ({ filtersSelected }) => { const columHelper = createColumnHelper() - const columns: ColumnDef[] = [ + const columns: ColumnDef[] = [ columHelper.accessor('id', { header: '', cell: ({ row }) => { @@ -217,6 +219,24 @@ export const UsersTable: FC = ({ filtersSelected }) => { ) }, }), + + columHelper.accessor('role', { + header: `${t('Rol')}`, + cell: ({ row }) => { + const role: UserRole = row.getValue('role') + const status: UserStatus = row.getValue('status') + let isDisabled: boolean | undefined + + if (selectedStatus && selectedStatus !== status) { + isDisabled = true + } else { + isDisabled = undefined + } + + return {t(role)} + }, + }), + columHelper.display({ id: 'actions', header: () => ( diff --git a/web/usuaris/src/constants/index.ts b/web/usuaris/src/constants/index.ts index ac1dd127d..42848d028 100644 --- a/web/usuaris/src/constants/index.ts +++ b/web/usuaris/src/constants/index.ts @@ -1,2 +1,3 @@ export { urls } from './urls' export { paths } from './paths' +export { roles } from './roles' diff --git a/web/usuaris/src/constants/roles.ts b/web/usuaris/src/constants/roles.ts new file mode 100644 index 000000000..4366a761a --- /dev/null +++ b/web/usuaris/src/constants/roles.ts @@ -0,0 +1,13 @@ +import i18n from '../i18n' +import { TRole, UserRole } from '../types/types' + +type TRoleKey = keyof typeof UserRole + +const getRoles = (roles: TRoleKey[]): TRole[] => + roles.map((role: TRoleKey) => ({ + id: role, + name: i18n.t(role), + slug: role, + })) + +export const roles = getRoles(Object.keys(UserRole) as TRoleKey[]) diff --git a/web/usuaris/src/helpers/fetchers.ts b/web/usuaris/src/helpers/fetchers.ts index 307ad9c66..d722f8232 100644 --- a/web/usuaris/src/helpers/fetchers.ts +++ b/web/usuaris/src/helpers/fetchers.ts @@ -13,6 +13,7 @@ export const getItineraries = async () => throw new Error(`Error fetching itineraries: ${err.message}`) }) + export const getUsers = async (filters: string) => { const response = await fetch(`${urls.getUsers}?${filters}`) if (!response.ok) { diff --git a/web/usuaris/src/locales/cat.json b/web/usuaris/src/locales/cat.json index 51f6f6234..7e3db5ab1 100644 --- a/web/usuaris/src/locales/cat.json +++ b/web/usuaris/src/locales/cat.json @@ -4,28 +4,23 @@ "RegistrarmeBtn": "Registrar-me", "EntrarBtn": "Entrar", "Funcionalitats": "Funcionalitats bàsiques que t'ofereix aquesta plataforma:", - "Guarda els teus recursos": "Guarda els teus recursos preferits", "Tingues els teus recursos": "Tingues els teus recursos ben organitzats", - "Col·labora": "Col·labora amb els teus companys i companyes", "Recursos compartits": "Recursos compartits", - "Vota els recursos": "Vota els recursos", "La comunitat decideix": "La comunitat decideix quins són més rellevants", - "Configuración": "Configuració", "Añadir recurso": "Afegeix un recurs", "Menú": "Menú", "Ajustes": "Ajustaments", "Cerrar": "Tanca", "camp obligatori": "Aquest camp és obligatori", - "Administrador de Usuarios": "Administrador d'Usuaris", - "Registre": "Registre", "DNI": "DNI o NIE", "Especialidad": "Especialitat", + "Rol": "Rol", "Password": "Contrasenya", "repetirpassword": "Repetir contrasenya", "password error": "La contrasenya ha de contenir només lletres i números, mínim 8 caràcters, un número, una majúscula i una minúscula", @@ -36,16 +31,13 @@ "tienes una cuenta?": "Tens un compte?, entra", "recordar/cambiar": "Recordar/canviar la contrasenya", "no tienes una cuenta?": "No tens un compte?, crea'n un", - "Acceso restringido": "Accés restringit", "Regístrate para subir o votar contenido": "Registra't per pujar o votar contingut", "Registrarme": "Registrar-me", "Entrar": "Entrar", - "Editar recurso": "Edita el recurs", "Eliminar de favoritos": "Elimina de preferits", "Añadir a favoritos": "Afegeix a preferits", - "Recursos favoritos": "Recursos preferits", "Recursos que te gustan": "Recursos que t'agraden", "Regístrate": "Registra't", @@ -57,16 +49,13 @@ "Mis recursos": "Els meus recursos", "Tus recursos": "Els teus recursos", "No has subido ningún recurso": "No has publicat cap recurs", - "Temas": "Temes", "Usuarios": "Usuaris", - "No hay temas disponibles.": "No hi ha temes disponibles.", "Accede desde una categoría para ver o gestionar sus temas.": "Accedeix des d'una categoria per veure o gestionar els temes.", "Temas de (category)": "Temes de {{name}}", "No tienes permiso de acceso": "No tens els permisos necessaris per accedir a aquest contingut.", "Ha habido un error...": "Hi ha hagut un error...", - "Lista de usuarios": "Llista d'usuaris", "Buscar por DNI:": "Cerca per DNI:", "Introduce el DNI": "Introdueix el DNI", @@ -76,7 +65,6 @@ "Cambiar estado": "Canviar estat", "Desactivar": "Desactivar", "Activar": "Activar", - "+ Crear nuevo tema": "+ Crea un nou tema", "Nombre del tema": "Nom del tema", "Nombre del nuevo tema": "Nom del tema nou", @@ -87,7 +75,6 @@ "Cancelar": "Cancel·la", "Borrar tema": "Esborra el tema", "No es posible borrar el tema.": "No és possible esborrar el tema.", - "Filtros": "Filtres", "Recursos de (category)": "Recursos de {{name}}", "Buscar recurso": "Buscar recurs", @@ -96,28 +83,23 @@ "Fecha": "Data", "Crear nuevo recurso": "Crear nou recurs", "searchErrorMessage": "Escriu al menys 2 caràcters", - "Crear": "Crear", "Título": "Títol", "Descripción": "Descripció", "Opciones": "Opcions", "Tema": "Tema", "Curso": "Curs", - "Todos": "Tots", "Por ver": "Pendents", "Vistos": "Vistos", "Tipo": "Format", - "¡Vaya! :/": "Vaja! :/", "Todavía no hay recursos de este tipo.": "Encara no hi ha recursos d'aquest tipus.", - "Error 401 - No autorizado": "Operació no autoritzada. És necessari iniciar sessió d'usuari.", "Error 403 - Acceso denegado": "Accés denegat. No tens els permisos necessaris per realitzar l'operació.", "Error 404 - No se puede guardar": "Error en desar a la base de dades. Si us plau, torna a intentar-ho i si l'error persisteix, contacta amb l'administrador.", "Error 405 - Id de usuario inválido": "Identificador d'usuari no vàlid.", "Error 500 - Error bbdd": "Error en la base de dades. Per favor, intenta-ho més tard.", - "Volver": "Torna", "Cerrar sesión": "Tanca sessió", "Sin imagen de usuario": "Sense imatge d'usuari", @@ -125,17 +107,14 @@ "Votos recibidos": "Vots rebuts", "Favoritos guardados": "Recursos preferits", "n/d": "n/d", - "Mostrando": "Mostrant", "resultados para": "resultat per", "Nuevo Recurso": "Nou recurs", - "Fecha de inicio": "Data d'inici", "Fecha final": "Data final", "De...": "De...", "Hasta...": "Fins...", "calendarLanguage": "ca", - "Especialización": "Especialització", "Fecha alta": "Data alta", "Acciones": "Accions", @@ -144,20 +123,18 @@ "BLOCKED": "Bloquejat", "Aceptar": "Acceptar", "Bloquear": "Bloquejar", + "ADMIN": "Administrador", + "REGISTERED": "Registrat", + "MENTOR": "Mentor", "Desbloquear": "Desbloquejar", "No hay usuarios para mostrar": "No hi ha usuaris per mostrar", - "Mentores": "Mentors", "Connector": "Connector", - "Identificador o contraseña incorrectos": "Identificador o contrasenya incorrectes", - "Credenciales incorrectas.": "Credencials incorrectes.", "Sólo accesible a usuarios administradores activos.": "Només accessible a usuaris administradors actius.", - "Abrir": "Obre", "Deseleccionar": "Deselecciona", - "Búsqueda de usuarios": "Cerca d'usuaris", "Buscar": "Cercar" -} +} \ No newline at end of file diff --git a/web/usuaris/src/locales/en.json b/web/usuaris/src/locales/en.json index 2a50f059a..2b2e4d5af 100644 --- a/web/usuaris/src/locales/en.json +++ b/web/usuaris/src/locales/en.json @@ -4,28 +4,23 @@ "RegistrarmeBtn": "Sign Up", "EntrarBtn": "Log In", "Funcionalitats": "This is what you can do on this platform:", - "Guarda els teus recursos": "Save your favorite resources", "Tingues els teus recursos": "Have your resources well organized", - "Col·labora": "Collaborate with your course mates", "Recursos compartits": "Shared resources", - "Vota els recursos": "Vote resources", "La comunitat decideix": "The community decides which ones are the most relevant", - "Configuración": "Settings", "Añadir recurso": "Add resource", "Menú": "Menu", "Ajustes": "Settings", "Cerrar": "Close", "camp obligatori": "This field is required", - "Administrador de Usuarios": "Users Manager", - "Registre": "Register", "DNI": "DNI or NIE", "Especialidad": "Specialization", + "Rol": "Role", "Password": "Password", "repetirpassword": "Confirm password", "password error": "Password must contain only letters and numbers, at least 8 characters, a number, an uppercase letter and a lowercase letter", @@ -36,16 +31,13 @@ "tienes una cuenta?": "Do you have an account?, log in", "recordar/cambiar": "Remember/change password", "no tienes una cuenta?": "Don't have an account?, create one", - "Acceso restringido": "Restricted access", "Regístrate para subir o votar contenido": "Sign up to upload or vote on content", "Registrarme": "Sign up", "Entrar": "Login", - "Editar recurso": "Edit resource", "Eliminar de favoritos": "Remove from favorites", "Añadir a favoritos": "Add to favorites", - "Recursos favoritos": "Favorite resources", "Recursos que te gustan": "Resources you like", "Regístrate": "Sign up", @@ -57,16 +49,13 @@ "Mis recursos": "My resources", "Tus recursos": "Your resources", "No has subido ningún recurso": "You do not have resources", - "Temas": "Topics", "Usuarios": "Users", - "No hay temas disponibles.": "No topics available.", "Accede desde una categoría para ver o gestionar sus temas.": "Access from a category to view or manage its topics.", "Temas de (category)": "{{name}} topics", "No tienes permiso de acceso": "You do not have the necessary permissions to access this content.", "Ha habido un error...": "An error has occurred.", - "Lista de usuarios": "Users list", "Buscar por DNI:": "Search by DNI:", "Introduce el DNI": "Enter DNI", @@ -76,7 +65,6 @@ "Cambiar estado": "Change status", "Desactivar": "Deactivate", "Activar": "Activate", - "+ Crear nuevo tema": "+ Create new topic", "Nombre del tema": "Topic name", "Nombre del nuevo tema": "New topic name", @@ -87,7 +75,6 @@ "Cancelar": "Cancel", "Borrar tema": "Delete topic", "No es posible borrar el tema.": "The topic cannot be deleted.", - "Filtros": "Filters", "Recursos de (category)": "Resources of {{name}}", "Buscar recurso": "Find resource", @@ -96,28 +83,23 @@ "Fecha": "Date", "Crear nuevo recurso": "Create new resource", "searchErrorMessage": "Enter at least 2 characters", - "Crear": "Create", "Título": "Title", "Descripción": "Description", "Opciones": "Options", "Tema": "Topic", "Curso": "Course", - "Todos": "All", "Por ver": "To be seen", "Vistos": "Seen", "Tipo": "Type", - "¡Vaya! :/": "Oops! :/", "Todavía no hay recursos de este tipo.": "There are no available resources of this kind yet.", - "Error 401 - No autorizado": "Unauthorized operation. User login required.", "Error 403 - Acceso denegado": "Access denied. You do not have the necessary permissions to perform the operation.", "Error 404 - No se puede guardar": "Error saving to database. Please try again and if the error persists, contact the administrator.", "Error 405 - Id de usuario inválido": "Invalid user ID.", "Error 500 - Error bbdd": "Database error. Please try again later.", - "Volver": "Back", "Cerrar sesión": "Logout", "Sin imagen de usuario": "No user image", @@ -125,17 +107,14 @@ "Votos recibidos": "Votes received", "Favoritos guardados": "Saved favorites", "n/d": "n/a", - "Mostrando": "Showing", "resultados para": "results for", "Nuevo Recurso": "New resource", - "Fecha de inicio": "Initial date", "Fecha final": "Final date", "De...": "From...", "Hasta...": "To...", "calendarLanguage": "en-IN", - "Especialización": "Specialization", "Fecha alta": "Registration date", "Acciones": "Actions", @@ -145,19 +124,17 @@ "Aceptar": "Accept", "Bloquear": "Block", "Desbloquear": "Unblock", + "ADMIN": "Admin", + "REGISTERED": "Registered", + "MENTOR": "Mentor", "No hay usuarios para mostrar": "There are no users to display", - "Mentores": "Mentors", "Connector": "Connector", - "Identificador o contraseña incorrectos": "Invalid Id or password", - "Credenciales incorrectas.": "Wrong credentials.", "Sólo accesible a usuarios administradores activos.": "Only accesible to active administrator users.", - "Abrir": "Open", "Deseleccionar": "Deselect", - "Búsqueda de usuarios": "Usears search", "Buscar": "Search" } diff --git a/web/usuaris/src/locales/es.json b/web/usuaris/src/locales/es.json index 836ec187d..9e673f5a6 100644 --- a/web/usuaris/src/locales/es.json +++ b/web/usuaris/src/locales/es.json @@ -4,28 +4,23 @@ "RegistrarmeBtn": "Registrarme", "EntrarBtn": "Entrar", "Funcionalitats": "Funcionalidades básicas que te ofrece esta plataforma:", - "Guarda els teus recursos": "Guarda tus recursos favoritos", "Tingues els teus recursos": "Ten tus recursos bien organizados", - "Col·labora": "Colabora con tus compañer@s", "Recursos compartits": "Recursos compartidos", - "Vota els recursos": "Vota los recursos", "La comunitat decideix": "La comunidad decide cuáles son más relevantes", - "Configuración": "Configuración", "Añadir recurso": "Añadir recurso", "Menú": "Menú", "Ajustes": "Ajustes", "Cerrar": "Cerrar", "camp obligatori": "Este campo es obligatorio", - "Administrador de Usuarios": "Administrador de Usuarios", - "Registre": "Registro", "DNI": "DNI o NIE", "Especialidad": "Especialidad", + "Rol": "Rol", "Password": "Contraseña", "repetirpassword": "Repetir contraseña", "password error": "La contraseña debe contener solo letras y números, mínimo 8 caracteres, un número, una mayúscula y una minúscula", @@ -36,16 +31,13 @@ "tienes una cuenta?": "¿Tienes una cuenta?, entrar", "recordar/cambiar": "Recordar/cambiar contraseña", "no tienes una cuenta?": "¿No tienes una cuenta?, crear una", - "Acceso restringido": "Acceso restringido", "Regístrate para subir o votar contenido": "Regístrate para subir o votar contenido", "Registrarme": "Registrarme", "Entrar": "Entrar", - "Editar recurso": "Editar recurso", "Eliminar de favoritos": "Eliminar de favoritos", "Añadir a favoritos": "Añadir a favoritos", - "Recursos favoritos": "Recursos favoritos", "Recursos que te gustan": "Recursos que te gustan", "Regístrate": "Regístrate", @@ -57,16 +49,13 @@ "Mis recursos": "Mis recursos", "Tus recursos": "Tus recursos", "No has subido ningún recurso": "No has subido ningún recurso", - "Temas": "Temas", "Usuarios": "Usuarios", - "No hay temas disponibles.": "No hay temas disponibles.", "Accede desde una categoría para ver o gestionar sus temas.": "Accede desde una categoría para ver o gestionar sus temas.", "Temas de (category)": "Temas de {{name}}", "No tienes permiso de acceso": "No tienes los permisos necesarios para acceder a este contenido.", "Ha habido un error...": "Ha habido un error...", - "Lista de usuarios": "Lista de usuarios", "Buscar por DNI:": "Buscar por DNI:", "Introduce el DNI": "Introduce el DNI", @@ -76,7 +65,6 @@ "Cambiar estado": "Cambiar estado", "Desactivar": "Desactivar", "Activar": "Activar", - "+ Crear nuevo tema": "+ Crear nuevo tema", "Nombre del tema": "Nombre del tema", "Nombre del nuevo tema": "Nombre del nuevo tema", @@ -87,7 +75,6 @@ "Cancelar": "Cancelar", "Borrar tema": "Borrar tema", "No es posible borrar el tema.": "No es posible borrar el tema.", - "Filtros": "Filtros", "Recursos de (category)": "Recursos de {{name}}", "Buscar recurso": "Buscar recurso", @@ -96,28 +83,23 @@ "Fecha": "Fecha", "Crear nuevo recurso": "Crear nuevo recurso", "searchErrorMessage": "Escribe al menos 2 carácteres", - "Crear": "Crear", "Título": "Título", "Descripción": "Descripción", "Opciones": "Opciones", "Tema": "Tema", "Curso": "Curso", - "Todos": "Todos", "Por ver": "Por ver", "Vistos": "Vistos", "Tipo": "Tipo", - "¡Vaya! :/": "¡Vaya! :/", "Todavía no hay recursos de este tipo.": "Todavía no hay recursos de este tipo.", - "Error 401 - No autorizado": "Operación no autorizada. Es necesario iniciar sesión de usuario.", "Error 403 - Acceso denegado": "Acceso denegado. No tienes los permisos necesarios para realizar la operación.", "Error 404 - No se puede guardar": "Error al guardar en la base de datos. Por favor, inténtalo de nuevo y si el error persiste, contacta con el administrador.", "Error 405 - Id de usuario inválido": "Identificador de usuario no válido.", "Error 500 - Error bbdd": "Error en la base de datos. Por favor, inténtalo más tarde.", - "Volver": "Volver", "Cerrar sesión": "Cerrar sesión", "Sin imagen de usuario": "Sin imagen de usuario", @@ -125,17 +107,14 @@ "Votos recibidos": "Votos recibidos", "Favoritos guardados": "Favoritos guardados", "n/d": "n/d", - "Mostrando": "Mostrando", "resultados para": "resultados para", "Nuevo Recurso": "Nuevo recurso", - "Fecha de inicio": "Fecha de inicio", "Fecha final": "Fecha final", "De...": "De...", "Hasta...": "Hasta...", "calendarLanguage": "es", - "Especialización": "Especialización", "Fecha alta": "Fecha alta", "Acciones": "Acciones", @@ -145,19 +124,17 @@ "Aceptar": "Aceptar", "Bloquear": "Bloquear", "Desbloquear": "Desbloquear", + "ADMIN": "Administrador", + "REGISTERED": "Registrado", + "MENTOR": "Mentor", "No hay usuarios para mostrar": "No hay usuarios para mostrar", - "Mentores": "Mentores", "Connector": "Conector", - "Identificador o contraseña incorrectos": "Identificador o contraseña incorrectos", - "Credenciales incorrectas.": "Credenciales incorrectas.", "Sólo accesible a usuarios administradores activos.": "Sólo accesible a usuarios administradores activos.", - "Abrir": "Obre", "Deseleccionar": "Deselecciona", - "Búsqueda de usuarios": "Búsqueda de usuarios", "Buscar": "Buscar" } diff --git a/web/usuaris/src/types/types.tsx b/web/usuaris/src/types/types.tsx index f3b9450cb..7fdbae23a 100644 --- a/web/usuaris/src/types/types.tsx +++ b/web/usuaris/src/types/types.tsx @@ -20,14 +20,20 @@ export type TItinerary = { slug: string } +export type TRole = { + id: string + name: string + slug: string +} + export type TUpdatedUser = { id: string dni?: string email?: string name?: string password?: string - role?: string status?: UserStatus + role?: UserRole deletedAt?: string itineraryId?: string } @@ -36,7 +42,14 @@ export type TUserData = { id: string name: string dni: string - status: UserStatus + status: string createdAt: string itineraryName: string + role: string +} + +export enum UserRole { + ADMIN = 'ADMIN', + REGISTERED = 'REGISTERED', + MENTOR = 'MENTOR', }