In my react app, i have a Tables file and another for my popup Modal which is supposed to be activated by an Edit button found in each table row.
Whenever i load my app, the app throws in an error pointing to my Modal file
**TypeError: Cannot read property 'name' of undefined**
23 | <Label for="title">Name</Label>
24 | <Input
25 | id="name"
> 26 | value={props.editEmployeeData.name}
| ^ 27 | onChange={(e) => {
28 | let { editEmployeeData } = props; // destructuring assignment
29 | editEmployeeData.name = e.target.value;
I have tried to find a fix but nothing works.
My Tables component looks like this
const EmployeeTable = () => {
const [state, setState] = React.useState({
employeesDetail: [],
editEmployeeData: {
id: "",
name: "",
phone_no: "",
email: "",
department: "",
job_title: "",
salary: "",
date_employed: "",
},
editEmployeeModal: false,
});
const _refreshBooks = ()=>{
axios
.get("http://localhost:8000/api/accounts/employees_hr/")
.then((response) =>
setState({
employeesDetail: response.data.results,
})
);
}
useEffect(() => {
_refreshBooks();
}, []);
// modal appear/disappear func
const toggleEditEmployeeModal = () => {
setState({
editEmployeeModal: !state.editEmployeeModal,
});
};
// Populate Edit book func - 'Edit button'
const editEmployeeData = (id, name, phone_no, email, department, job_title, salary, date_employed) =>{
setState({
editEmployeeData: {id, name, phone_no, email, department, job_title, salary, date_employed},
editEmployeeModal: !state.editEmployeeModal
})
}
// Edit func - 'Update Book button'
const updateRecord=()=>{
let {
name,
phone_no,
email,
department,
job_title,
salary,
date_employed,
} = state.editEmployeeData;
axios
.put(
"http://localhost:8000/api/accounts/employees_hr/" +
state.editEmployeeData.id,
{
name,
phone_no,
email,
department,
job_title,
salary,
date_employed,
}
)
.then((response) =>
_refreshBooks()
);
// close modal after edit and set the 'editEmployeeData' fields to empty
setState({
editBookModal: false,
editEmployeeData: {
id: "",
name: "",
phone_no: "",
email: "",
department: "",
job_title: "",
salary: "",
date_employed: "",
} //clear
});
}
const classes = useStyles();
const columns = [
// "id",
{ name: "name", label: "Name" },
{ name: "phone_no", label: "Contact" },
{ name: "email", label: "Email" },
{ name: "department", label: "Department" },
{ name: "job_title", label: "Title" },
{ name: "salary", label: "Salary" },
{ name: "date_employed", label: "Date Employed" },
{
name: "Action",
options: {
filter: true,
sort: false,
empty: true,
customBodyRender: (value, tableMeta, updateValue) => {
const i = tableMeta.rowIndex;
const data = state.employeesDetail;
return (
// open modal
<Button
color="success"
size="sm"
onClick={() =>
editEmployeeData(
data[i].id,
data[i].name,
data[i].phone_no,
data[i].email,
data[i].department,
data[i].job_title,
data[i].salary,
data[i].date_employed,
)
}
>
Edit
</Button>
);
},
},
},
];
return (
<div className={classes.root}>
{/* EDIT BOOK MODAL */}
<EditEmployeeModal
editEmployeeModal={state.editEmployeeModal}
editEmployeeData={state.editEmployeeData}
updateRecord={updateRecord}
toggleEditEmployeeModal={toggleEditEmployeeModal}
/>
As for my Modal file, the setup looks like this
const EditEmployeeModal = (props) => {
return (
<div className="App container">
<Modal isOpen={props.editEmployeeModal}>
<ModalHeader toggle={props.toggleEditEmployeeModal}>
Update Employee Record
</ModalHeader>
<ModalBody>
<FormGroup>
<Label for="title">Name</Label>
<Input
id="name"
value={props.editEmployeeData.name}
onChange={(e) => {
let { editEmployeeData } = props; // destructuring assignment
editEmployeeData.name = e.target.value;
props.setState({ editEmployeeData });
}}
/>
</FormGroup>
What i'm i missing or doing wrong based on the above code setup?