Skip to content

Commit 0cc0413

Browse files
authored
Merge pull request #5 from Lemoncode/feature/Create_project_list
Feature/create project list
2 parents d940610 + 71b94d7 commit 0cc0413

14 files changed

Lines changed: 391 additions & 20 deletions

src/pods/employee-list/employee-list.component.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export const EmployeeListComponent: React.FunctionComponent<Props> = ({
2424
'name',
2525
]);
2626

27-
const renderContent = ({ itemName }) => {
27+
const contentRender = ({ itemName }) => {
2828
return (
2929
<>
3030
¿Seguro que quiere borrar a <strong>{itemName}</strong>?
@@ -46,7 +46,7 @@ export const EmployeeListComponent: React.FunctionComponent<Props> = ({
4646
searchPlaceholder: 'Buscar empleado',
4747
createButton: 'Nuevo empleado',
4848
deleteTitle: 'Eliminar Empleado',
49-
deleteContent: props => renderContent(props),
49+
deleteContent: props => contentRender(props),
5050
closeButton: 'Cancelar',
5151
acceptButton: 'Aceptar',
5252
}}

src/pods/project-list/api/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './project-list.api';
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export interface Project {
2+
id: string;
3+
active: boolean;
4+
code: string;
5+
name: string;
6+
lastDateIncurred: string;
7+
creationDate: string;
8+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { Project } from './project-list.api-model';
2+
import { mockProjectList } from './project-list.mock-data';
3+
4+
let projectList = [...mockProjectList];
5+
6+
export const getProjectList = async (): Promise<Project[]> => {
7+
return projectList;
8+
};
9+
10+
export const deleteProject = async (id: string): Promise<boolean> => {
11+
projectList = projectList.filter(p => p.id !== id);
12+
return true;
13+
};
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import { Project } from './project-list.api-model';
2+
3+
export const mockProjectList: Project[] = [
4+
{
5+
id: '1',
6+
active: true,
7+
code: '23212',
8+
name: 'Bankia',
9+
lastDateIncurred: '02/02/2020',
10+
creationDate: '01/08/2018',
11+
},
12+
{
13+
id: '2',
14+
active: true,
15+
code: '4323',
16+
name: 'Mapfre',
17+
lastDateIncurred: '05/02/2020',
18+
creationDate: '01/04/2018',
19+
},
20+
{
21+
id: '3',
22+
active: true,
23+
code: '002',
24+
name: 'Vacaciones',
25+
lastDateIncurred: '05/02/2020',
26+
creationDate: '01/04/2018',
27+
},
28+
{
29+
id: '4',
30+
active: true,
31+
code: '003',
32+
name: 'Baja Médica',
33+
lastDateIncurred: '05/03/2018',
34+
creationDate: '01/05/2019',
35+
},
36+
{
37+
id: '5',
38+
active: false,
39+
code: '2586',
40+
name: 'Proyecto interno',
41+
lastDateIncurred: '05/08/2020',
42+
creationDate: '01/10/2018',
43+
},
44+
{
45+
id: '6',
46+
active: false,
47+
code: '3025',
48+
name: 'BBVA',
49+
lastDateIncurred: '06/05/2020',
50+
creationDate: '01/03/2019',
51+
},
52+
{
53+
id: '7',
54+
active: false,
55+
code: '8563',
56+
name: 'Baja Médica',
57+
lastDateIncurred: '02/08/2018',
58+
creationDate: '01/11/2020',
59+
},
60+
{
61+
id: '8',
62+
active: true,
63+
code: '4125',
64+
name: 'Microsoft España',
65+
lastDateIncurred: '11/10/2018',
66+
creationDate: '01/07/2020',
67+
},
68+
];
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './project-row.component';
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 { Project } from '../project-list.vm';
12+
13+
type Props = RowRendererProps<Project>;
14+
15+
export const ProjectRowComponent: 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.code}</CellComponent>
26+
<CellComponent>{row.name}</CellComponent>
27+
<CellComponent>{row.lastDateIncurred}</CellComponent>
28+
<CellComponent>
29+
{row.creationDate}
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+
};

src/pods/project-list/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export * from './project-list.component';
1+
export * from './project-list.container';
Lines changed: 60 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,66 @@
11
import React from 'react';
2-
import { useHistory } from 'react-router-dom';
3-
import { routes } from 'core/router';
2+
import {
3+
TableContainer,
4+
RowRendererProps,
5+
useSearchBar,
6+
} from 'common/components';
7+
import { Project } from './project-list.vm';
8+
import { ProjectRowComponent } from './components';
49

5-
export const ProjectListComponent: React.FunctionComponent = () => {
6-
const history = useHistory();
7-
const goToProject = (
8-
event: React.MouseEvent<HTMLParagraphElement, MouseEvent>
9-
) => {
10-
event.preventDefault();
11-
history.push({
12-
pathname: routes.editProject('1'),
13-
});
10+
interface Props {
11+
projectList: Project[];
12+
onCreate: () => void;
13+
onEdit: (id: string) => void;
14+
onDelete: (id: string) => void;
15+
}
16+
17+
export const ProjectListComponent: React.FunctionComponent<Props> = ({
18+
projectList,
19+
onCreate,
20+
onEdit,
21+
onDelete,
22+
}) => {
23+
const { filteredList, onSearch, search } = useSearchBar(projectList, [
24+
'projectName',
25+
]);
26+
27+
const contentRender = ({ itemName }) => {
28+
return (
29+
<>
30+
¿Seguro que quiere borrar a <strong>{itemName}</strong>?
31+
</>
32+
);
1433
};
34+
1535
return (
16-
<>
17-
<h1>Hello Project list component</h1>
18-
<p onClick={goToProject}>Go to edit project component</p>
19-
</>
36+
<TableContainer
37+
columns={[
38+
'Activo',
39+
'Código',
40+
'Proyecto',
41+
'Fecha Ultimo incurrido',
42+
'Fecha creación',
43+
]}
44+
rows={filteredList}
45+
rowRenderer={(rowProps: RowRendererProps<Project>) => (
46+
<ProjectRowComponent {...rowProps} />
47+
)}
48+
onCreate={onCreate}
49+
onEdit={onEdit}
50+
onDelete={onDelete}
51+
labels={{
52+
searchPlaceholder: 'Buscar proyecto',
53+
createButton: 'Nuevo proyecto',
54+
deleteTitle: 'Eliminar Proyecto',
55+
deleteContent: props => contentRender(props),
56+
closeButton: 'Cancelar',
57+
acceptButton: 'Aceptar',
58+
}}
59+
enableSearch={true}
60+
search={search}
61+
onSearch={onSearch}
62+
enablePagination={true}
63+
pageSize={5}
64+
/>
2065
);
2166
};
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 { ProjectListComponent } from './project-list.component';
3+
import { getProjectList, deleteProject } from './api';
4+
import { Project } from './project-list.vm';
5+
import { useSnackbarContext } from 'common/components';
6+
import { trackPromise } from 'react-promise-tracker';
7+
import { mapProjectListFromApiToVm } from './project-list.mappers';
8+
import { routes } from 'core/router';
9+
import { useHistory } from 'react-router-dom';
10+
const editProjectId = '0';
11+
12+
export const ProjectListContainer: React.FunctionComponent = () => {
13+
const [projects, setProjects] = React.useState<Project[]>([]);
14+
const { showMessage } = useSnackbarContext();
15+
const history = useHistory();
16+
17+
const onLoadProjectList = async () => {
18+
try {
19+
const apiProjectList = await trackPromise(getProjectList());
20+
const viewModelProjectList = mapProjectListFromApiToVm(apiProjectList);
21+
setProjects(viewModelProjectList);
22+
} catch (error) {
23+
error &&
24+
showMessage('Ha ocurrido un error al cargar los proyectos', 'error');
25+
}
26+
};
27+
28+
const handleCreate = () => {
29+
history.push(routes.editProject(editProjectId));
30+
};
31+
32+
const handleEdit = (id: string) => {
33+
history.push(routes.editProject(id));
34+
};
35+
36+
const handleDelete = async (id: string) => {
37+
const errorMessage = 'Error al eliminar un proyecto';
38+
try {
39+
const isDeleted = await trackPromise(deleteProject(id));
40+
isDeleted ? onLoadProjectList() : showMessage(errorMessage, 'error');
41+
} catch (error) {
42+
error && showMessage(errorMessage, 'error');
43+
}
44+
};
45+
46+
React.useEffect(() => {
47+
onLoadProjectList();
48+
}, []);
49+
50+
return (
51+
<ProjectListComponent
52+
projectList={projects}
53+
onCreate={handleCreate}
54+
onEdit={handleEdit}
55+
onDelete={handleDelete}
56+
/>
57+
);
58+
};

0 commit comments

Comments
 (0)