I have date range array and a removeRange object which can split or remove portion of on the date range array. If Range is within the date range it will split the record into 2 range otherwise it can trim portion of the date range or remove entirely the date range. I've moment js on the date query to check of date is greater than or less than. SnippetLink
var appt = [{
text: 'appointment 1',
StartTime: new Date('June 27,2017 08:00:00'),
EndTime: new Date('June 27,2017 10:00:00'),
deleted: false
}, {
text: 'appointment 2',
StartTime: new Date('June 28,2017 08:00:00'),
EndTime: new Date('June 28,2017 12:00:00'),
deleted: false
}, {
text: 'appointment 3',
StartTime: new Date('June 28,2017 13:00:00'),
EndTime: new Date('June 28,2017 17:00:00'),
deleted: false
}];
console.log(appt);
//NOTE: this will remove appointment 2 and 3
//var removeRange = {
// StartTime: new Date('June 28,2017 05:00:00'),
//EndTime: new Date('June 28,2017 18:00:00')
//}
//NOTE: This will split the appointment 2
//var removeRange = {
// StartTime: new Date('June 28,2017 09:00:00'),
// EndTime: new Date('June 28,2017 10:00:00')
//}
//NOTE: This will remove portion of appointment 2 and appointment 3
var removeRange = {
StartTime: new Date('June 28,2017 09:00:00'),
EndTime: new Date('June 28,2017 14:00:00')
}
var forAddLater = [];
appt.forEach(function(appointment, index) {
if (moment(removeRange.StartTime).isSame(moment(appointment.StartTime), 'day')) {
//console.log('same day', moment(appointment.StartTime));
if (moment(removeRange.StartTime).isSameOrBefore(moment(appointment.StartTime))) {
console.log('same or before', moment(removeRange.StartTime));
if (moment(removeRange.EndTime).isBefore(moment(appointment.EndTime)) &&
moment(removeRange.EndTime).isAfter(moment(appointment.StartTime))) {
console.log('removeRange.EndTime is before appt end time');
console.log('New StartTime is removeRange.EndTime');
appt[index].StartTime = removeRange.EndTime;
}
if(moment(removeRange.EndTime).isSameOrAfter(moment(appointment.EndTime))){
console.log('For delete the appt');
appt[index].deleted = true;
}
//else {
//if (moment(removeRange.EndTime).isBefore(moment(appointment.EndTime))) {
// appt[index].StartTime = removeRange.EndTime;
//} else {
// console.log('For delete the appt');
// appt[index].deleted = true;
//}
//}
} else {
console.log('inside the range');
console.log(moment(removeRange.EndTime));
console.log(moment(appointment.EndTime));
if (moment(removeRange.EndTime).isBefore(moment(appointment.EndTime))) {
console.log('split the appointment data and add new');
forAddLater.push({
text: appointment.text + '-split',
StartTime: removeRange.EndTime,
EndTime: appointment.EndTime,
deleted: false
});
appt[index].EndTime = removeRange.StartTime;
} else {
console.log(appointment);
console.log('remove the end portion only');
appt[index].EndTime = removeRange.StartTime;
}
}
}
});
appt.push(forAddLater);
appt = appt.filter(function(el) {
return !el.deleted;
});
console.log(appt);
Is there a better enhancement on this or a little bit simpler way to handle this one? Is there a possible scenario where the code may fail?