Skip to content

Commit 09f73b8

Browse files
authored
Merge pull request #46 from Lemoncode/feature/#36_Front-End_Build-layout_editar-usuario
Add edit-user layout
2 parents b75329f + f69ef0e commit 09f73b8

23 files changed

+296
-76
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { Lookup } from '#common/models';
2+
3+
export interface UnidadRolList {
4+
roles: Lookup[];
5+
unidades: Lookup[];
6+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import axios from 'axios';
2+
import { UnidadRolList } from './unidad-rol.api-model';
3+
4+
export const getUnidadRolList = async (): Promise<UnidadRolList> => {
5+
const response = await axios.get<UnidadRolList>('/api/lookup/unidad-rol');
6+
return response.data;
7+
};
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export * from './unidad-rol-vm';
2+
export * from './unidad-rol.mapper';
3+
export * from './unidad-rol.repository';
4+
export * from './use-unidad_rol-list.hook';
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { Lookup } from '#common/models';
2+
3+
export interface UnidadRolList {
4+
roles: Lookup[];
5+
unidades: Lookup[];
6+
}
7+
8+
export const createEmptyUnidadRolList = (): UnidadRolList => ({
9+
roles: [],
10+
unidades: [],
11+
});
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { mapToCollection } from '#common/mappers/collection.mapper.ts';
2+
import { Lookup } from '#common/models/lookup.model.ts';
3+
import * as apiModel from './api/unidad-rol.api-model';
4+
5+
import * as viewModel from './unidad-rol-vm';
6+
7+
export const mapUnidadFromApiToVm = (unidad: Lookup): Lookup => ({
8+
id: unidad.id,
9+
nombre: unidad.nombre,
10+
code: unidad.code,
11+
});
12+
13+
export const mapRolFromApiToVm = (rol: Lookup): Lookup => ({
14+
id: rol.id,
15+
nombre: rol.nombre,
16+
});
17+
18+
export const mapUnidadRolListFromApiToVm = (unidadRolList: apiModel.UnidadRolList): viewModel.UnidadRolList => ({
19+
unidades: mapToCollection(unidadRolList.unidades, mapUnidadFromApiToVm),
20+
roles: mapToCollection(unidadRolList.roles, mapRolFromApiToVm),
21+
});
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { mapUnidadRolListFromApiToVm } from './unidad-rol.mapper';
2+
import * as vm from './unidad-rol-vm';
3+
import * as api from './api/unidad-rol.api';
4+
5+
export const getUnidadRolListRepository = async (): Promise<vm.UnidadRolList> => {
6+
const unidadRolListApi = await api.getUnidadRolList();
7+
8+
const unidadRolListVm: vm.UnidadRolList = mapUnidadRolListFromApiToVm(unidadRolListApi);
9+
10+
return unidadRolListVm;
11+
};
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { useQuery } from '@tanstack/react-query';
2+
import { commonQueryKeys } from '#core/react-query';
3+
import { getUnidadRolListRepository } from './unidad-rol.repository';
4+
import { createEmptyUnidadRolList, UnidadRolList } from './unidad-rol-vm';
5+
6+
interface UseUnidadRolQueryResult {
7+
unidadRolList: UnidadRolList;
8+
isLoading: boolean;
9+
}
10+
11+
export const useUnidadRolList = (): UseUnidadRolQueryResult => {
12+
const { data: unidadRolList = createEmptyUnidadRolList(), isLoading } = useQuery({
13+
queryKey: commonQueryKeys.unidadRolList(),
14+
queryFn: () => getUnidadRolListRepository(),
15+
});
16+
17+
return {
18+
unidadRolList,
19+
isLoading,
20+
};
21+
};

src/modules/users/create/api/create.api-model.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,3 @@
1-
import { Lookup } from '#common/models';
2-
3-
export interface UnidadRolList {
4-
roles: Lookup[];
5-
unidades: Lookup[];
6-
}
7-
81
export interface Usuario {
92
nombre: string;
103
apellido: string;

src/modules/users/create/api/create.api.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
import axios from 'axios';
2-
import { UnidadRolList, Usuario } from './create.api-model';
3-
4-
export const getUnidadRolList = async (): Promise<UnidadRolList> => {
5-
const response = await axios.get<UnidadRolList>('/api/lookup/unidad-rol');
6-
return response.data;
7-
};
2+
import { Usuario } from './create.api-model';
83

94
export const saveUser = async (user: Usuario): Promise<boolean> => {
105
const response = await axios.post<boolean>('/api/user', user);

src/modules/users/create/components/user-details.component.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import React from 'react';
22
import { IconButton, Typography } from '@mui/material';
33
import { Visibility, VisibilityOff, ContentCopy } from '@mui/icons-material';
44
import { SelectForm, TextFieldForm } from '#common/components';
5+
import { UnidadRolList } from '#core/api/lookups/unidad-rol';
56
import { useWithTheme } from '#core/theme';
67
import { usePassword } from '../use-password.hook';
7-
import { UnidadRolList } from '../create.vm';
88
import { handleCopyPassword } from '../create.business';
99
import * as innerClasses from '../create.styles';
1010

src/modules/users/create/create.component.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ import React from 'react';
22
import { Form, Formik } from 'formik';
33
import { Button, Typography } from '@mui/material';
44
import { NavigationButton } from '#common/components';
5+
import { UnidadRolList } from '#core/api/lookups/unidad-rol';
56
import { useWithTheme } from '#core/theme';
67
import { AditionalPermissions, UserDetails } from './components';
78
import { formValidation } from './validations';
8-
import { createEmptyUsuario, UnidadRolList, Usuario } from './create.vm';
9+
import { createEmptyUsuario, Usuario } from './create.vm';
910
import * as innerClasses from './create.styles';
1011

1112
interface Props {

src/modules/users/create/create.mapper.ts

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,6 @@
1-
import { mapToCollection } from '#common/mappers/collection.mapper.ts';
2-
import { Lookup } from '#common/models/lookup.model.ts';
31
import * as apiModel from './api';
42
import * as viewModel from './create.vm';
53

6-
export const mapUnidadFromApiToVm = (unidad: Lookup): Lookup => ({
7-
id: unidad.id,
8-
nombre: unidad.nombre,
9-
code: unidad.code,
10-
});
11-
12-
export const mapRolFromApiToVm = (rol: Lookup): Lookup => ({
13-
id: rol.id,
14-
nombre: rol.nombre,
15-
});
16-
17-
export const mapUnidadRolListFromApiToVm = (unidadRolList: apiModel.UnidadRolList): viewModel.UnidadRolList => ({
18-
unidades: mapToCollection(unidadRolList.unidades, mapUnidadFromApiToVm),
19-
roles: mapToCollection(unidadRolList.roles, mapRolFromApiToVm),
20-
});
21-
224
export const mapUserFromVmToApi = (user: viewModel.Usuario): apiModel.Usuario => ({
235
nombre: user.nombre,
246
apellido: user.apellido,

src/modules/users/create/create.pod.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import React from 'react';
22
import { Spinner } from '#common/components';
3+
import { useUnidadRolList } from '#core/api/lookups/unidad-rol';
34
import { CreateUser } from './create.component';
4-
import { useSaveUserMutation, useUnidadRolList } from './create.query.hook';
5+
import { useSaveUserMutation } from './create.query.hook';
56
import { Usuario } from './create.vm';
67

78
export const CreateUserPod: React.FC = () => {

src/modules/users/create/create.query.hook.ts

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,10 @@
1-
import { useMutation, useQuery } from '@tanstack/react-query';
1+
import { useMutation } from '@tanstack/react-query';
22
import { useNavigate } from '@tanstack/react-router';
3-
import { commonQueryKeys, queryClient } from '#core/react-query';
4-
import { getUnidadRolListRepository, saveUserRepository } from './create.repository';
5-
import { createEmptyUnidadRolList, UnidadRolList, Usuario } from './create.vm';
3+
import { queryClient } from '#core/react-query';
4+
import { saveUserRepository } from './create.repository';
5+
import { Usuario } from './create.vm';
66
import { usersQueryKeys } from '../users-keys';
77

8-
interface UseUnidadRolQueryResult {
9-
unidadRolList: UnidadRolList;
10-
isLoading: boolean;
11-
}
12-
13-
export const useUnidadRolList = (): UseUnidadRolQueryResult => {
14-
const { data: unidadRolList = createEmptyUnidadRolList(), isLoading } = useQuery({
15-
queryKey: commonQueryKeys.unidadRolList(),
16-
queryFn: () => getUnidadRolListRepository(),
17-
});
18-
19-
return {
20-
unidadRolList,
21-
isLoading,
22-
};
23-
};
24-
258
interface UseSaveUserMutationResult {
269
saveUser: (user: Usuario) => void;
2710
isPending: boolean;

src/modules/users/create/create.repository.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,7 @@
11
import * as api from './api';
2-
import { mapUnidadRolListFromApiToVm, mapUserFromVmToApi } from './create.mapper';
2+
import { mapUserFromVmToApi } from './create.mapper';
33
import * as vm from './create.vm';
44

5-
export const getUnidadRolListRepository = async (): Promise<vm.UnidadRolList> => {
6-
const unidadRolListApi = await api.getUnidadRolList();
7-
8-
const unidadRolListVm: vm.UnidadRolList = mapUnidadRolListFromApiToVm(unidadRolListApi);
9-
10-
return unidadRolListVm;
11-
};
12-
135
export const saveUserRepository = async (user: vm.Usuario): Promise<boolean> => {
146
const isSaved = await api.saveUser(mapUserFromVmToApi(user));
157

src/modules/users/create/create.vm.ts

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { Lookup } from '#common/models';
21
import { generateRandomPassword } from './create.business';
32

43
export interface Usuario {
@@ -28,13 +27,3 @@ export const createEmptyUsuario = (): Usuario => ({
2827
esProponente: false,
2928
esAutorizante: false,
3029
});
31-
32-
export interface UnidadRolList {
33-
roles: Lookup[];
34-
unidades: Lookup[];
35-
}
36-
37-
export const createEmptyUnidadRolList = (): UnidadRolList => ({
38-
roles: [],
39-
unidades: [],
40-
});
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import React from 'react';
2+
import { Typography } from '@mui/material';
3+
import { CheckboxForm } from '#common/components';
4+
import { useWithTheme } from '#core/theme';
5+
import * as innerClasses from '../edit.styles';
6+
7+
export const AditionalPermissions: React.FC = () => {
8+
const classes = useWithTheme(innerClasses);
9+
10+
return (
11+
<div className={classes.sectionContainer}>
12+
<Typography variant="h6" fontWeight={600}>
13+
Permisos adicionales
14+
</Typography>
15+
<div className={classes.checkboxContainer}>
16+
<CheckboxForm name="esResponsable" label="Responsable" fullWidth={false} />
17+
<CheckboxForm name="esProponente" label="Proponente" fullWidth={false} />
18+
<CheckboxForm name="esAutorizante" label="Autorizante" fullWidth={false} />
19+
</div>
20+
</div>
21+
);
22+
};
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './user-details.component';
2+
export * from './aditional-permissions.component';
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import React from 'react';
2+
import { Typography } from '@mui/material';
3+
import { SelectForm, TextFieldForm } from '#common/components';
4+
import { useWithTheme } from '#core/theme';
5+
import { UnidadRolList } from '#core/api/lookups/unidad-rol';
6+
import * as innerClasses from '../edit.styles';
7+
8+
interface Props {
9+
unidadRolList: UnidadRolList;
10+
contraseña?: string;
11+
}
12+
13+
export const UserDetails: React.FC<Props> = props => {
14+
const { unidadRolList } = props;
15+
const classes = useWithTheme(innerClasses);
16+
17+
return (
18+
<div className={classes.sectionContainer}>
19+
<Typography variant="h6" fontWeight={600}>
20+
Datos
21+
</Typography>
22+
<div className={classes.row}>
23+
<TextFieldForm name="nombre" label="Nombre" />
24+
<TextFieldForm name="apellido" label="Apellidos" className={classes.apellidos} />
25+
<TextFieldForm name="email" label="Email" />
26+
</div>
27+
<div className={classes.row}>
28+
<TextFieldForm name="telefono" label="Teléfono fijo" />
29+
<TextFieldForm name="movil" label="Teléfono móvil" />
30+
<TextFieldForm name="institucional" label="Teléfono Institucional" />
31+
<SelectForm label="Unidad" name="unidad" options={unidadRolList.unidades} />
32+
<SelectForm label="Rol" name="rol" options={unidadRolList.roles} />
33+
</div>
34+
</div>
35+
);
36+
};
Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
11
import React from 'react';
2+
import { Spinner } from '#common/components/';
3+
import { useUnidadRolList } from '#core/api/lookups/unidad-rol';
4+
import { EditUser } from './edit.component';
25

36
interface Props {
47
id: string;
58
}
69

710
export const EditUserSheet: React.FC<Props> = props => {
811
const { id } = props;
9-
return <h3>User id: {id}</h3>;
12+
const { unidadRolList, isLoading } = useUnidadRolList();
13+
const handleSubmit = () => true;
14+
15+
return (
16+
<>
17+
<h3>User id: {id}</h3>
18+
<Spinner isSpinnerShowing={isLoading} />
19+
<EditUser unidadRolList={unidadRolList} onSubmit={handleSubmit} />
20+
</>
21+
);
1022
};
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import React from 'react';
2+
3+
import { Form, Formik } from 'formik';
4+
import { useWithTheme } from '#core/theme';
5+
import { UnidadRolList } from '#core/api/lookups/unidad-rol';
6+
import { Usuario, createEmptyUsuario } from './edit.vm';
7+
import { Button } from '@mui/material';
8+
import { AditionalPermissions, UserDetails } from './components';
9+
import { NavigationButton } from '#common/components';
10+
import * as innerClasses from './edit.styles';
11+
12+
interface Props {
13+
unidadRolList: UnidadRolList;
14+
onSubmit: (values: Usuario) => void;
15+
}
16+
17+
export const EditUser: React.FC<Props> = (props: Props) => {
18+
const { unidadRolList, onSubmit } = props;
19+
const classes = useWithTheme(innerClasses);
20+
return (
21+
<>
22+
<div className={classes.root}>
23+
<Formik
24+
initialValues={createEmptyUsuario()}
25+
enableReinitialize={true}
26+
/* TODO: implement Formik form Validation in the next steps */
27+
onSubmit={onSubmit}
28+
>
29+
{({ values }) => (
30+
<Form className={classes.form}>
31+
<UserDetails unidadRolList={unidadRolList} contraseña={values.contraseña} />
32+
<AditionalPermissions />
33+
<div className={classes.buttonContainer}>
34+
<Button type="submit" variant="contained">
35+
Guardar
36+
</Button>
37+
<NavigationButton path="/users" text="Cancelar" variant="text" />
38+
</div>
39+
</Form>
40+
)}
41+
</Formik>
42+
</div>
43+
</>
44+
);
45+
};

0 commit comments

Comments
 (0)