Hello everyone,
I have a custom dialog editor for the scheduler with three custom DropDownLists as you can see in my code here:
import React, {Component} from "react";
import {FormElement, Field} from '@progress/kendo-react-form';
import {Label, Error} from '@progress/kendo-react-labels';
import {TextArea} from '@progress/kendo-react-inputs';
import {DateTimePicker} from '@progress/kendo-react-dateinputs';
import ProjectsEditor from "./ProjectsEditor";
import VehiclesEditor from "./VehiclesEditor";
import {TokenContext} from "./Context";
import TaskTemplatesEditor from "./TaskTemplatesEditor";
class TaskFormEditor extends Component {
// This line of code is making all the difference, I'm associating the
// context of this component with the context I created!!! :D
static contextType = TokenContext;
constructor(props) {
super(props);
this.state = {
projects: [],
vehicles: [],
taskTemplates: [],
filteredVehicles: [],
filteredTaskTemplates: [],
selectedProjectId: null,
selectedVehicleId: null,
vehiclesDisabled: true,
taskTemplatesDisabled: true
};
this.handleProjectsChange = this.handleProjectsChange.bind(this);
this.handleVehiclesChange = this.handleVehiclesChange.bind(this);
}
handleProjectsChange(event) {
this.setState({
filteredVehicles: this.state.vehicles.filter(vehicle => vehicle.projectId === event.value.id),
vehiclesDisabled: false,
selectedProjectId: event.value.id
});
}
handleVehiclesChange(event) {
this.setState({
filteredTaskTemplates: this.state.taskTemplates.filter(taskTemplate => taskTemplate.vehicleId === event.value.id),
taskTemplatesDisabled: false,
selectedVehicleId: event.value.id
});
}
componentDidMount() {
const config = {
headers: {
"Content-type": "application/json",
"Authorization": `Bearer ${this.context}`,
},
};
axios.get("api/getProjectsVehiclesTaskTemplates?", config)
.then(res => {
this.setState({
projects: res.data[0].map(dataItem => (
{
id: dataItem.id,
projectId: dataItem.project_id
}
)),
vehicles: res.data[1].map(dataItem => (
{
id: dataItem.id,
label: dataItem.label,
projectId: dataItem.project_id
}
)),
taskTemplates: res.data[2].map(dataItem => (
{
id: dataItem.id,
title: dataItem.title,
vehicleId: dataItem.vehicle_id
}
))
});
});
}
render() {
return (
<
FormElement
horizontal={true}>
<
div
className
=
"k-form-field"
>
<
Label
>
Project
</
Label
>
<
div
className
=
"k-form-field-wrap"
>
<
Field
name={"ProjectId"}
component={(props) =>
(<
ProjectsEditor
value={this.state.selectedProjectId}
projects={this.state.projects}
handleChange={this.handleProjectsChange}/>)}
/>
{/*{props.errors.Patient && <
Error
>{props.errors.Patient}</
Error
>}*/}
</
div
>
</
div
>
<
div
className
=
"k-form-field"
>
<
Label
>
Vehicle
</
Label
>
<
div
className
=
"k-form-field-wrap"
>
<
Field
name={"VehicleId"}
component={(props) =>
(<
VehiclesEditor
value={this.state.selectedVehicleId}
vehiclesDisabled={this.state.vehiclesDisabled}
vehicles={this.state.filteredVehicles}
handleChange={this.handleVehiclesChange}/>)}
/>
</
div
>
</
div
>
<
div
className
=
"k-form-field"
>
<
Label
>
Task Template
</
Label
>
<
div
className
=
"k-form-field-wrap"
>
<
Field
name={"TaskTemplateId"}
component={(props) =>
(<
TaskTemplatesEditor
taskTemplatesDisabled={this.state.taskTemplatesDisabled}
taskTemplates={this.state.filteredTaskTemplates}/>)}
/>
{/*{props.errors.Treatment && <
Error
>{props.errors.Treatment}</
Error
>}*/}
</
div
>
</
div
>
<
div
className
=
"k-form-field"
>
<
Label
>
Note
</
Label
>
<
div
className
=
"k-form-field-wrap"
>
<
Field
name={"Comment"}
component={TextArea}
rows={1}
/>
</
div
>
</
div
>
<
div
className
=
"k-form-field"
>
<
Label
>
Start
</
Label
>
<
div
className
=
"k-form-field-wrap"
>
<
Field
name={"Start"}
component={this.props.startEditor}
as={DateTimePicker}
rows={1}
format
=
"t"
/>
</
div
>
</
div
>
<
div
className
=
"k-form-field"
>
<
Label
>
End
</
Label
>
<
div
className
=
"k-form-field-wrap"
>
<
Field
name={"End"}
component={this.props.endEditor}
as={DateTimePicker}
rows={1}
format
=
"t"
/>
</
div
>
</
div
>
</
FormElement
>
);
}
}
export default TaskFormEditor;
And my problem is that when I save the form, I can't get none of these values. I want to retrieve the Field with the names: ProjectId, VehicleId and TaskTemplateId.
To give an example of one, the Field with ProjectId is:
import React, {Component} from "react";
import {DropDownList} from "@progress/kendo-react-dropdowns";
class ProjectsEditor extends Component {
constructor(props) {
super(props);
console.log(this.props);
}
render() {
return (
<
DropDownList
onChange={this.props.handleChange}
value={this.props.projects.find((p) => p.id === this.props.value)}
data={this.props.projects}
dataItemKey={"id"}
textField={"projectId"}
/>
);
}
}
export default ProjectsEditor;
I want to get this information in m
handleDataChange({created, updated, deleted}) {
this.setState({
data: this.state.data.filter((item) => deleted.find(current => current.TaskID === item.TaskID) === undefined)
.map((item) => updated.find(current => current.TaskID === item.TaskID) || item)
.concat(created.map((item) => Object.assign({}, item, {TaskID: guid()})))
});
let data = (created.length !== 0) ? created : (updated.length !== 0) ? updated : deleted;
console.log(data);
let crudId = (created.length !== 0) ? 1 : (updated.length !== 0) ? 0 : -1;
const mechanicId = data[0].PersonIDs;
data = data.map(item => ({
id: item.TaskID,
start_date: this.convertToPhpDateTime(item.Start),
end_date: this.convertToPhpDateTime(item.End),
comment: null,
task_template_id: item.taskTemplateId,
user_time_spent: null,
task_state_id: 2,
priority_id: 3,
periodicity_end_date: null,
created_user_id: this.props.userId,
changed_user_id: this.props.userId,
active: true,
deadline_execution: null
}));
const config = {
headers: {
"Content-type": "application/json",
"Authorization": `Bearer ${this.props.token}`
}
};
/*axios.post("api/saveTask", {
data: data[0],
crudId: crudId,
mechanicId: mechanicId
}, config);*/
}
Thank you very much from your help.
Best Regards,
Daniel