Skip to content

Commit d86937c

Browse files
author
Antonio Contreras LEMONCODE
committed
Refactor components
1 parent 814e3fd commit d86937c

9 files changed

Lines changed: 120 additions & 40 deletions

src/pods/employee/api/employee.api-model.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
export interface Employee {
2+
id: string;
3+
name: string;
4+
email: string;
5+
isActive: boolean;
6+
temporalKey: string;
7+
projects: ProjectSummary[];
8+
}
9+
110
export interface ProjectSummary {
211
id: string;
312
isAssigned: boolean;
Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
import { ProjectSummary } from './employee.api-model';
2-
import { mockProjectSummaryList } from './employee.mock-data';
1+
import { Employee } from './employee.api-model';
2+
import { mockEmployee } from './employee.mock-data';
33

4-
const projectList = [...mockProjectSummaryList];
5-
6-
export const getProjectSummary = async (): Promise<ProjectSummary[]> => {
7-
return projectList;
4+
export const getEmployeeById = async (id: string): Promise<Employee> => {
5+
return mockEmployee;
86
};

src/pods/employee/api/employee.mock-data.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { ProjectSummary } from './employee.api-model';
1+
import { Employee, ProjectSummary } from './employee.api-model';
22

3-
export const mockProjectSummaryList: ProjectSummary[] = [
3+
const mockProjectSummaryList: ProjectSummary[] = [
44
{
55
id: '1',
66
isAssigned: true,
@@ -22,3 +22,12 @@ export const mockProjectSummaryList: ProjectSummary[] = [
2222
employeeName: 'Baja',
2323
},
2424
];
25+
26+
export const mockEmployee: Employee = {
27+
id: '1',
28+
name: 'Prueba Nombre',
29+
email: 'prueba@email.com',
30+
isActive: true,
31+
temporalKey: 'clave',
32+
projects: mockProjectSummaryList,
33+
};

src/pods/employee/components/data.component.tsx

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,60 +4,71 @@ import { TextFieldComponent, CheckboxComponent } from 'common/components';
44
import { CommandFooterComponent } from '../../../common-app/command-footer';
55
import * as classes from './data.styles';
66
import { cx } from 'emotion';
7+
import { Employee } from '../employee.vm';
78

89
interface Props {
10+
employee: Employee;
911
className?: string;
12+
onSave: (employee: Employee) => void;
1013
isEditMode: boolean;
1114
onCancel: () => void;
1215
}
1316

1417
export const DataComponent: React.FunctionComponent<Props> = ({
18+
employee,
1519
className,
20+
onSave,
1621
isEditMode,
1722
onCancel,
1823
}) => {
19-
console.log(isEditMode);
24+
console.log(employee);
2025
return (
2126
<Formik
22-
initialValues={{}}
27+
initialValues={employee}
2328
enableReinitialize={true}
24-
onSubmit={console.log}
25-
validate={Promise.resolve}
29+
onSubmit={onSave}
2630
>
27-
{({ values }) => (
31+
{() => (
2832
<Form className={cx(classes.form({ isEditMode }), className)}>
2933
<TextFieldComponent
3034
label="Id"
3135
name="id"
3236
className={classes.id}
33-
disabled
37+
InputProps={{
38+
readOnly: true,
39+
}}
40+
value={employee.id}
3441
/>
3542
{!isEditMode && (
3643
<TextFieldComponent
3744
label="Clave Temporal"
3845
name="temporalKey"
3946
className={classes.temporalKey}
4047
disabled
48+
value={employee.temporalKey}
4149
/>
4250
)}
4351
<TextFieldComponent
4452
label="Nombre"
4553
name="name"
4654
className={classes.name}
4755
disabled
56+
value={employee.name}
4857
/>
4958
<TextFieldComponent
5059
label="Email"
5160
name="email"
5261
className={classes.email}
5362
disabled
63+
value={employee.email}
5464
/>
5565
<CheckboxComponent
56-
name="active"
66+
name="isActive"
5767
label="Activo"
5868
color="primary"
5969
className={classes.isActive}
6070
disabled
71+
value={employee.isActive}
6172
/>
6273
<CommandFooterComponent
6374
onCancel={onCancel}

src/pods/employee/components/report.component.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import React from 'react';
2-
import Button from '@material-ui/core/Button';
32
import { Formik, Form } from 'formik';
43
import { SelectComponent } from 'common/components';
54
import * as classes from './report.styles';
@@ -9,18 +8,19 @@ import { cx } from 'emotion';
98
interface Props {
109
className?: string;
1110
onCancel: () => void;
11+
onGenerateExcel: () => void;
1212
}
1313

1414
export const ReportComponent: React.FunctionComponent<Props> = ({
1515
className,
1616
onCancel,
17+
onGenerateExcel,
1718
}) => {
1819
return (
1920
<Formik
2021
initialValues={{}}
2122
enableReinitialize={true}
22-
onSubmit={console.log}
23-
validate={Promise.resolve}
23+
onSubmit={onGenerateExcel}
2424
>
2525
{({ values }) => (
2626
<Form className={cx(classes.form, className)}>

src/pods/employee/employee.component.tsx

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,44 +5,54 @@ import {
55
TabPanelComponent,
66
} from 'common/components';
77
import { DataComponent, ProjectComponent, ReportComponent } from './components';
8-
import { ProjectSummary } from './employee.vm';
8+
import { Employee } from './employee.vm';
99
import * as classes from './employee.styles';
1010

1111
interface Props {
12-
projectSummaryList: ProjectSummary[];
12+
employee: Employee;
1313
isEditMode: boolean;
14+
onSave: (employee: Employee) => void;
1415
onCancel: () => void;
16+
onGenerateExcel: () => void;
1517
}
1618

1719
export const EmployeeComponent: React.FunctionComponent<Props> = ({
18-
projectSummaryList,
20+
employee,
1921
isEditMode,
22+
onSave,
2023
onCancel,
24+
onGenerateExcel,
2125
}) => {
2226
const [tab, setTab] = React.useState(0);
2327
return (
2428
<>
2529
<TabListComponent value={tab} onChange={setTab}>
2630
<TabComponent label="Datos" />
27-
<TabComponent label="Proyectos" />
28-
<TabComponent label="Informes" />
31+
<TabComponent label="Proyectos" disabled={!isEditMode} />
32+
<TabComponent label="Informes" disabled={!isEditMode} />
2933
</TabListComponent>
3034
<TabPanelComponent value={tab} index={0}>
3135
<DataComponent
36+
employee={employee}
3237
className={classes.root}
38+
onSave={onSave}
3339
isEditMode={isEditMode}
3440
onCancel={onCancel}
3541
/>
3642
</TabPanelComponent>
3743
<TabPanelComponent value={tab} index={1}>
3844
<ProjectComponent
39-
projectSummaryList={projectSummaryList}
45+
projectSummaryList={employee.projects}
4046
className={classes.root}
4147
onCancel={onCancel}
4248
/>
4349
</TabPanelComponent>
4450
<TabPanelComponent value={tab} index={2}>
45-
<ReportComponent className={classes.root} onCancel={onCancel} />
51+
<ReportComponent
52+
className={classes.root}
53+
onGenerateExcel={onGenerateExcel}
54+
onCancel={onCancel}
55+
/>
4656
</TabPanelComponent>
4757
</>
4858
);
Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,60 @@
11
import React from 'react';
22
import { EmployeeComponent } from './employee.component';
3-
import { ProjectSummary } from './employee.vm';
3+
import { Employee, createEmptyEmployee } from './employee.vm';
44
import { useSnackbarContext } from 'common/components';
55
import { trackPromise } from 'react-promise-tracker';
6-
import { getProjectSummary } from './api';
7-
import { mapProjectSummaryListFromApiToVm } from './employee.mappers';
6+
import { getEmployeeById } from './api';
7+
import { mapEmployeeFromApiToVm } from './employee.mappers';
88
import { useParams } from 'react-router-dom';
99
import { isEditModeHelper } from 'common/helpers';
1010

1111
export const EmployeeContainer: React.FunctionComponent = () => {
1212
const { id } = useParams();
13-
const [projectSummaryList, setProjectSummaryList] = React.useState<
14-
ProjectSummary[]
15-
>([]);
13+
const [employee, setEmployee] = React.useState<Employee>(
14+
createEmptyEmployee()
15+
);
16+
const [isEditMode, setIsEditMode] = React.useState<boolean>(false);
1617
const { showMessage } = useSnackbarContext();
1718

1819
const onLoadProjectSummary = async () => {
1920
try {
20-
const apiEmployeeSummary = await trackPromise(getProjectSummary());
21-
const viewModelEmployeeSummary = mapProjectSummaryListFromApiToVm(
22-
apiEmployeeSummary
23-
);
24-
setProjectSummaryList(viewModelEmployeeSummary);
21+
const apiEmployee = await trackPromise(getEmployeeById(id));
22+
const viewModelEmployee = mapEmployeeFromApiToVm(apiEmployee);
23+
setEmployee(viewModelEmployee);
2524
} catch (error) {
2625
error &&
2726
showMessage('Ha ocurrido un error al cargar los proyectos', 'error');
2827
}
2928
};
3029

30+
const handleSave = (employee: Employee) => {
31+
console.log('Guardado');
32+
};
33+
3134
const handleCancel = () => {
3235
history.back();
3336
};
3437

38+
const handleGenerateExcel = () => {
39+
// Pending to create real implementation
40+
console.log('Excel creado');
41+
};
42+
3543
React.useEffect(() => {
36-
onLoadProjectSummary();
44+
const isEditMode = isEditModeHelper(id);
45+
setIsEditMode(isEditMode);
46+
if (isEditMode) {
47+
onLoadProjectSummary();
48+
}
3749
}, []);
3850

3951
return (
4052
<EmployeeComponent
41-
projectSummaryList={projectSummaryList}
42-
isEditMode={isEditModeHelper(id)}
53+
employee={employee}
54+
isEditMode={isEditMode}
55+
onSave={handleSave}
4356
onCancel={handleCancel}
57+
onGenerateExcel={handleGenerateExcel}
4458
/>
4559
);
4660
};

src/pods/employee/employee.mappers.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,18 @@ const mapProjectSummaryFromApiToVm = (
88
...projectSummary,
99
});
1010

11-
export const mapProjectSummaryListFromApiToVm = (
11+
const mapProjectSummaryListFromApiToVm = (
1212
projectSummary: apiModel.ProjectSummary[]
1313
): viewModel.ProjectSummary[] =>
1414
mapToCollection(projectSummary, ps => mapProjectSummaryFromApiToVm(ps));
15+
16+
export const mapEmployeeFromApiToVm = (
17+
employee: apiModel.Employee
18+
): viewModel.Employee => {
19+
return Boolean(employee)
20+
? {
21+
...employee,
22+
projects: mapProjectSummaryListFromApiToVm(employee.projects),
23+
}
24+
: viewModel.createEmptyEmployee();
25+
};

src/pods/employee/employee.vm.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,23 @@
1+
export interface Employee {
2+
id: string;
3+
name: string;
4+
email: string;
5+
isActive: boolean;
6+
temporalKey: string;
7+
projects: ProjectSummary[];
8+
}
9+
110
export interface ProjectSummary {
211
id: string;
312
isAssigned: boolean;
413
employeeName: string;
514
}
15+
16+
export const createEmptyEmployee = (): Employee => ({
17+
id: '',
18+
name: '',
19+
email: '',
20+
isActive: false,
21+
temporalKey: '',
22+
projects: [],
23+
});

0 commit comments

Comments
 (0)