Skip to content

Commit d940610

Browse files
authored
Merge pull request #4 from Lemoncode/feature/Create_employee_list
Feature/create employee list
2 parents 6dc9d60 + 2b254e5 commit d940610

15 files changed

Lines changed: 366 additions & 38 deletions

config/test/jest.js

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,6 @@ module.exports = {
22
rootDir: '../../',
33
preset: 'ts-jest',
44
restoreMocks: true,
5-
moduleNameMapper: {
6-
'^common-app(.*)$': '<rootDir>/src/common-app/$1',
7-
'^common(.*)$': '<rootDir>/src/common/$1',
8-
'^core(.*)$': '<rootDir>/src/core/$1',
9-
'^layouts(.*)$': '<rootDir>/src/layouts/$1',
10-
'^pods(.*)$': '<rootDir>/src/pods/$1',
11-
'^scenes(.*)$': '<rootDir>/src/scenes/$1',
12-
},
5+
moduleDirectories: ['<rootDir>/src', 'node_modules'],
136
setupFilesAfterEnv: ['<rootDir>/config/test/setup.ts'],
147
};

src/common/components/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ export * from './form';
44
export * from './snackbar';
55
export * from './spinner';
66
export * from './table';
7+
export * from './search-bar';
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export interface Employee {
2+
id: string;
3+
active: boolean;
4+
name: string;
5+
email: string;
6+
lastDateIncurred: string;
7+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { Employee } from './employee-list.api-model';
2+
import { mockEmployeeList } from './employee-list.mock-data';
3+
4+
let employeeList = [...mockEmployeeList];
5+
6+
export const getEmployeeList = async (): Promise<Employee[]> => {
7+
return employeeList;
8+
};
9+
10+
export const deleteEmployee = async (id: string): Promise<boolean> => {
11+
employeeList = employeeList.filter(e => e.id !== id);
12+
return true;
13+
};
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { Employee } from './employee-list.api-model';
2+
3+
export const mockEmployeeList: Employee[] = [
4+
{
5+
id: '1',
6+
active: true,
7+
name: 'Daniel Perez',
8+
email: 'daniel.perez@empresa.com',
9+
lastDateIncurred: '02/02/2020',
10+
},
11+
{
12+
id: '2',
13+
active: true,
14+
name: 'Jose Gomez',
15+
email: 'jose.gomez@empresa.com',
16+
lastDateIncurred: '05/02/2020',
17+
},
18+
{
19+
id: '3',
20+
active: false,
21+
name: 'Manuel Ruiz',
22+
email: 'manuel.ruiz@empresa.com',
23+
lastDateIncurred: '06/02/2020',
24+
},
25+
{
26+
id: '4',
27+
active: true,
28+
name: 'Ramón Gomez',
29+
email: 'ramon.gomez@empresa.com',
30+
lastDateIncurred: '02/05/2020',
31+
},
32+
{
33+
id: '5',
34+
active: false,
35+
name: 'María Lopez',
36+
email: 'maria.lopez@empresa.com',
37+
lastDateIncurred: '05/08/2020',
38+
},
39+
{
40+
id: '6',
41+
active: true,
42+
name: 'Manuel Ortiz',
43+
email: 'manuel.ortiz@empresa.com',
44+
lastDateIncurred: '06/06/2020',
45+
},
46+
{
47+
id: '7',
48+
active: false,
49+
name: 'David Martos',
50+
email: 'david.martos@empresa.com',
51+
lastDateIncurred: '14/08/2020',
52+
},
53+
{
54+
id: '8',
55+
active: true,
56+
name: 'Luz Roca',
57+
email: 'luz.roca@empresa.com',
58+
lastDateIncurred: '20/06/2020',
59+
},
60+
];
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './employee-list.api';
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import React from 'react';
2+
import {
3+
RowRendererProps,
4+
RowComponent,
5+
CellComponent,
6+
} from 'common/components';
7+
import Checkbox from '@material-ui/core/Checkbox';
8+
import IconButton from '@material-ui/core/IconButton';
9+
import EditIcon from '@material-ui/icons/Edit';
10+
import DeleteIcon from '@material-ui/icons/Delete';
11+
import { Employee } from '../employee-list.vm';
12+
13+
type Props = RowRendererProps<Employee>;
14+
15+
export const EmployeeRowComponent: React.FunctionComponent<Props> = ({
16+
row,
17+
onEdit,
18+
onDelete,
19+
}) => {
20+
return (
21+
<RowComponent>
22+
<CellComponent>
23+
<Checkbox checked={row.active} disabled />
24+
</CellComponent>
25+
<CellComponent>{row.id}</CellComponent>
26+
<CellComponent>{row.name}</CellComponent>
27+
<CellComponent>{row.email}</CellComponent>
28+
<CellComponent>
29+
{row.lastDateIncurred}
30+
<IconButton onClick={() => onEdit(row.id)}>
31+
<EditIcon />
32+
</IconButton>
33+
<IconButton onClick={() => onDelete(row)}>
34+
<DeleteIcon />
35+
</IconButton>
36+
</CellComponent>
37+
</RowComponent>
38+
);
39+
};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './employee-row.component';
Lines changed: 51 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,60 @@
11
import React from 'react';
2-
import { useHistory } from 'react-router-dom';
3-
import { routes } from 'core/router';
42
import {
53
TableContainer,
6-
RowComponent,
74
RowRendererProps,
8-
} from 'common/components/table';
9-
import { Typography } from '@material-ui/core';
5+
useSearchBar,
6+
} from 'common/components';
7+
import { Employee } from './employee-list.vm';
8+
import { EmployeeRowComponent } from './components';
109

11-
export const EmployeeListComponent: React.FunctionComponent = () => {
12-
const history = useHistory();
13-
const goToEmployee = (
14-
event: React.MouseEvent<HTMLParagraphElement, MouseEvent>
15-
) => {
16-
event.preventDefault();
17-
history.push({
18-
pathname: routes.editEmployee('1'),
19-
});
10+
interface Props {
11+
employeeList: Employee[];
12+
onCreate: () => void;
13+
onEdit: (id: string) => void;
14+
onDelete: (id: string) => void;
15+
}
16+
17+
export const EmployeeListComponent: React.FunctionComponent<Props> = ({
18+
employeeList,
19+
onCreate,
20+
onEdit,
21+
onDelete,
22+
}) => {
23+
const { filteredList, onSearch, search } = useSearchBar(employeeList, [
24+
'name',
25+
]);
26+
27+
const renderContent = ({ itemName }) => {
28+
return (
29+
<>
30+
¿Seguro que quiere borrar a <strong>{itemName}</strong>?
31+
</>
32+
);
2033
};
34+
2135
return (
22-
<>
23-
<h1>Hello Employee list component</h1>
24-
<p onClick={goToEmployee}>Go to edit employee page</p>
25-
<TableContainer
26-
columns={['Column 1']}
27-
rows={[{ id: '1', name: 'test 1' }]}
28-
rowRenderer={(props: RowRendererProps<any>) => (
29-
<RowComponent>
30-
<Typography>{props.row.name}</Typography>
31-
</RowComponent>
32-
)}
33-
/>
34-
</>
36+
<TableContainer
37+
columns={['Activo', 'Id', 'Nombre', 'Email', 'Fecha último incurrido']}
38+
rows={filteredList}
39+
rowRenderer={(rowProps: RowRendererProps<Employee>) => (
40+
<EmployeeRowComponent {...rowProps} />
41+
)}
42+
onCreate={onCreate}
43+
onEdit={onEdit}
44+
onDelete={onDelete}
45+
labels={{
46+
searchPlaceholder: 'Buscar empleado',
47+
createButton: 'Nuevo empleado',
48+
deleteTitle: 'Eliminar Empleado',
49+
deleteContent: props => renderContent(props),
50+
closeButton: 'Cancelar',
51+
acceptButton: 'Aceptar',
52+
}}
53+
enableSearch={true}
54+
search={search}
55+
onSearch={onSearch}
56+
enablePagination={true}
57+
pageSize={5}
58+
/>
3559
);
3660
};
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import React from 'react';
2+
import { EmployeeListComponent } from './employee-list.component';
3+
import { getEmployeeList, deleteEmployee } from './api';
4+
import { Employee } from './employee-list.vm';
5+
import { useSnackbarContext } from 'common/components';
6+
import { trackPromise } from 'react-promise-tracker';
7+
import { mapEmployeeListFromApiToVm } from './employee-list.mappers';
8+
import { useHistory } from 'react-router-dom';
9+
import { routes } from 'core/router';
10+
const editEmployeeId = '0';
11+
12+
export const EmployeeListContainer: React.FunctionComponent = () => {
13+
const [employees, setEmployees] = React.useState<Employee[]>([]);
14+
const { showMessage } = useSnackbarContext();
15+
const history = useHistory();
16+
17+
const onLoadEmployeeList = async () => {
18+
try {
19+
const apiEmployeeList = await trackPromise(getEmployeeList());
20+
const viewModelEmloyeeList = mapEmployeeListFromApiToVm(apiEmployeeList);
21+
setEmployees(viewModelEmloyeeList);
22+
} catch (error) {
23+
error &&
24+
showMessage('Ha ocurrido un error al cargar los empleados', 'error');
25+
}
26+
};
27+
28+
const handleCreate = () => {
29+
history.push(routes.editEmployee(editEmployeeId));
30+
};
31+
32+
const handleEdit = (id: string) => {
33+
history.push(routes.editEmployee(id));
34+
};
35+
36+
const handleDelete = async (id: string) => {
37+
const errorMessage = 'Error al eliminar un empleado';
38+
try {
39+
const isDeleted = await trackPromise(deleteEmployee(id));
40+
isDeleted ? onLoadEmployeeList() : showMessage(errorMessage, 'error');
41+
} catch (error) {
42+
error && showMessage(errorMessage, 'error');
43+
}
44+
};
45+
46+
React.useEffect(() => {
47+
onLoadEmployeeList();
48+
}, []);
49+
50+
return (
51+
<EmployeeListComponent
52+
employeeList={employees}
53+
onCreate={handleCreate}
54+
onEdit={handleEdit}
55+
onDelete={handleDelete}
56+
/>
57+
);
58+
};

0 commit comments

Comments
 (0)