in use-cases/maintenance-scheduling/src/main/resources/META-INF/resources/app.js [71:169]
function refreshSchedule() {
$.getJSON("/schedule", function (schedule) {
refreshSolvingButtons(schedule.solverStatus != null && schedule.solverStatus !== "NOT_SOLVING");
$("#score").text("Score: " + (schedule.score == null ? "?" : schedule.score));
const unassignedJobs = $("#unassignedJobs");
unassignedJobs.children().remove();
var unassignedJobsCount = 0;
byCrewGroupDataSet.clear();
byJobGroupDataSet.clear();
byCrewItemDataSet.clear();
byJobItemDataSet.clear();
$.each(schedule.crewList, (index, crew) => {
byCrewGroupDataSet.add({id : crew.id, content: crew.name});
});
$.each(schedule.jobList, (index, job) => {
const jobGroupElement = $(`<div/>`)
.append($(`<h5 class="card-title mb-1"/>`).text(job.name))
.append($(`<p class="card-text ml-2 mb-0"/>`).text(`${job.durationInDays} workdays`));
byJobGroupDataSet.add({
id : job.id,
content: jobGroupElement.html()
});
byJobItemDataSet.add({
id: job.id + "_readyToIdealEnd", group: job.id,
start: job.readyDate, end: job.idealEndDate,
type: "background",
style: "background-color: #8AE23433"
});
byJobItemDataSet.add({
id: job.id + "_idealEndToDue", group: job.id,
start: job.idealEndDate, end: job.dueDate,
type: "background",
style: "background-color: #FCAF3E33"
});
if (job.crew == null || job.startDate == null) {
unassignedJobsCount++;
const unassignedJobElement = $(`<div class="card-body p-2"/>`)
.append($(`<h5 class="card-title mb-1"/>`).text(job.name))
.append($(`<p class="card-text ml-2 mb-0"/>`).text(`${job.durationInDays} workdays`))
.append($(`<p class="card-text ml-2 mb-0"/>`).text(`Ready: ${job.readyDate}`))
.append($(`<p class="card-text ml-2 mb-0"/>`).text(`Due: ${job.dueDate}`));
const byJobJobElement = $(`<div/>`)
.append($(`<h5 class="card-title mb-1"/>`).text(`Unassigned`));
$.each(job.tagSet, (index, tag) => {
const color = pickColor(tag);
unassignedJobElement.append($(`<span class="badge mr-1" style="background-color: ${color}"/>`).text(tag));
byJobJobElement.append($(`<span class="badge mr-1" style="background-color: ${color}"/>`).text(tag));
});
unassignedJobs.append($(`<div class="card"/>`).append(unassignedJobElement));
byJobItemDataSet.add({
id : job.id, group: job.id,
content: byJobJobElement.html(),
start: job.readyDate, end: JSJoda.LocalDate.parse(job.readyDate).plusDays(job.durationInDays).toString(),
style: "background-color: #EF292999"
});
} else {
const beforeReady = JSJoda.LocalDate.parse(job.startDate).isBefore(JSJoda.LocalDate.parse(job.readyDate));
const afterDue = JSJoda.LocalDate.parse(job.endDate).isAfter(JSJoda.LocalDate.parse(job.dueDate));
const byCrewJobElement = $(`<div/>`)
.append($(`<h5 class="card-title mb-1"/>`).text(job.name))
.append($(`<p class="card-text ml-2 mb-0"/>`).text(`${job.durationInDays} workdays`));
const byJobJobElement = $(`<div/>`)
.append($(`<h5 class="card-title mb-1"/>`).text(job.crew.name));
if (beforeReady) {
byCrewJobElement.append($(`<p class="badge badge-danger mb-0"/>`).text(`Before ready (too early)`));
byJobJobElement.append($(`<p class="badge badge-danger mb-0"/>`).text(`Before ready (too early)`));
}
if (afterDue) {
byCrewJobElement.append($(`<p class="badge badge-danger mb-0"/>`).text(`After due (too late)`));
byJobJobElement.append($(`<p class="badge badge-danger mb-0"/>`).text(`After due (too late)`));
}
$.each(job.tagSet, (index, tag) => {
const color = pickColor(tag);
byCrewJobElement.append($(`<span class="badge mr-1" style="background-color: ${color}"/>`).text(tag));
byJobJobElement.append($(`<span class="badge mr-1" style="background-color: ${color}"/>`).text(tag));
});
byCrewItemDataSet.add({
id : job.id, group: job.crew.id,
content: byCrewJobElement.html(),
start: job.startDate, end: job.endDate
});
byJobItemDataSet.add({
id : job.id, group: job.id,
content: byJobJobElement.html(),
start: job.startDate, end: job.endDate
});
}
});
if (unassignedJobsCount === 0) {
unassignedJobs.append($(`<p/>`).text(`There are no unassigned jobs.`));
}
byCrewTimeline.setWindow(schedule.workCalendar.fromDate, schedule.workCalendar.toDate);
byJobTimeline.setWindow(schedule.workCalendar.fromDate, schedule.workCalendar.toDate);
});
}