diff --git a/build.gradle b/build.gradle index c6cd884..c7399a4 100644 --- a/build.gradle +++ b/build.gradle @@ -40,6 +40,8 @@ dependencies { implementation 'org.webjars:popper.js:2.9.3' implementation 'org.webjars:datatables:1.11.3' implementation 'org.webjars:jquery-ui:1.13.0' + + implementation 'com.google.code.gson:gson:2.9.0'; implementation 'org.webjars.bowergithub.datatables:datatables:1.10.21' diff --git a/src/main/java/de/jottyfan/timetrack/spring/done/DoneBean.java b/src/main/java/de/jottyfan/timetrack/spring/done/DoneBean.java index 6c7b564..51d40cd 100644 --- a/src/main/java/de/jottyfan/timetrack/spring/done/DoneBean.java +++ b/src/main/java/de/jottyfan/timetrack/spring/done/DoneBean.java @@ -57,6 +57,31 @@ public class DoneBean implements Serializable, Comparable { this.fkJob = activity.getPk(); this.fkBilling = billing.getPk(); } + + private final String nullable(Object o, String format) { + if (o == null) { + return "null"; + } else if (o instanceof Integer) { + return String.valueOf(o); + } else if (o instanceof LocalDateTime) { + LocalDateTime ldt = (LocalDateTime) o; + return new StringBuilder("\"").append(ldt.format(DateTimeFormatter.ofPattern(format))).append("\"").toString(); + } else if (o instanceof VBillingRecord) { + VBillingRecord b = (VBillingRecord) o; + return new StringBuilder("\"").append(b.getCsskey()).append("\"").toString(); + } else { + return new StringBuilder("\"").append(o).append("\"").toString(); + } + } + + public final String toJson() { + StringBuilder buf = new StringBuilder("{"); + buf.append("\"from\": ").append(nullable(timeFrom, "HH:mm")); + buf.append(", \"until\": ").append(nullable(timeUntil, "HH:mm")); + buf.append(", \"billing\": ").append(nullable(billing, null)); + buf.append("}"); + return buf.toString(); + } @Override public final String toString() { diff --git a/src/main/java/de/jottyfan/timetrack/spring/done/DoneController.java b/src/main/java/de/jottyfan/timetrack/spring/done/DoneController.java index 1e3c8cf..61879ac 100644 --- a/src/main/java/de/jottyfan/timetrack/spring/done/DoneController.java +++ b/src/main/java/de/jottyfan/timetrack/spring/done/DoneController.java @@ -45,9 +45,11 @@ public class DoneController { Duration maxWorkTime = Duration.ofHours(8); // TODO: to the configuration file LocalDate day = doneModel.getDay(); List list = doneService.getList(day, username); + SummaryBean bean = new SummaryBean(list, day, maxWorkTime); model.addAttribute("doneList", list); model.addAttribute("doneModel", doneModel); - model.addAttribute("sum", new SummaryBean(list, day, maxWorkTime)); + model.addAttribute("sum", bean); + model.addAttribute("schedule", bean.toJson()); // TODO: add the other days of that week model.addAttribute("projectList", doneService.getProjects(false)); model.addAttribute("moduleList", doneService.getModules(false)); model.addAttribute("jobList", doneService.getJobs(false)); diff --git a/src/main/java/de/jottyfan/timetrack/spring/done/SummaryBean.java b/src/main/java/de/jottyfan/timetrack/spring/done/SummaryBean.java index 2e3069f..f7e8fda 100644 --- a/src/main/java/de/jottyfan/timetrack/spring/done/SummaryBean.java +++ b/src/main/java/de/jottyfan/timetrack/spring/done/SummaryBean.java @@ -4,6 +4,7 @@ import java.io.Serializable; import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; /** @@ -23,6 +24,24 @@ public class SummaryBean implements Serializable { this.day = day; this.maxDayWorktime = maxDayWorktime; } + + public String toJson() { + StringBuilder buf = new StringBuilder("{"); + buf.append("\"maxDayWorktime\": \"").append(String.format("%02d:%02d", maxDayWorktime.toHoursPart(), maxDayWorktime.toMinutesPart())); + buf.append("\", \"daySlot\": ").append(day == null ? "null" : day.getDayOfWeek().getValue()); + buf.append(", \"schedule\": ["); + boolean first = true; + for (DoneBean bean : list) { + if (!first) { + buf.append(", "); + } else { + first = false; + } + buf.append(bean.toJson()); + } + buf.append("]}"); + return buf.toString(); + } @Override public String toString() { diff --git a/src/main/resources/static/js/schedule.js b/src/main/resources/static/js/schedule.js index 8010164..4aad292 100644 --- a/src/main/resources/static/js/schedule.js +++ b/src/main/resources/static/js/schedule.js @@ -41,7 +41,6 @@ class Schedule { var hours = parseInt(timeArray[0]); var minutes = parseInt(timeArray[1]); var pixels = parseInt((hours + (minutes / 60)) * hourHeight); - console.log("convert " + time + " to " + pixels); return pixels; } @@ -57,7 +56,6 @@ class Schedule { var w = dayWidth; var h = parseInt(this.time2pixel(until, hourHeight) - y); ctx.beginPath(); - console.log("draw " + x + "," + y + " -> +" + w + "," + h); ctx.fillRect(x, y, w, h); ctx.strokeRect(x, y, w, h); } diff --git a/src/main/resources/templates/done/list.html b/src/main/resources/templates/done/list.html index f129e9a..02a16c2 100644 --- a/src/main/resources/templates/done/list.html +++ b/src/main/resources/templates/done/list.html @@ -189,12 +189,25 @@ let height = parseInt($("#schedule").css("min-height")); var schedule = new Schedule("#schedule", width, height); var ctx = $("#scheduleCanvas")[0].getContext("2d"); - /* TODO: replace by weekly times */ - schedule.drawSlot(ctx, 2, "07:15", "10:30", "black", "green"); - schedule.drawSlot(ctx, 2, "10:30", "10:45", "black", "gray"); - schedule.drawSlot(ctx, 2, "10:45", "12:00", "black", "red"); - schedule.drawSlot(ctx, 2, "13:00", "17:15", "black", "blue"); - + var currentDayRecords = JSON.parse('[(${schedule})]'); + var scheduleRecords = currentDayRecords.schedule; + var daySlot = currentDayRecords.daySlot; + for (var i = 0; i < scheduleRecords.length; i++) { + var r = scheduleRecords[i]; + var cssClass = r.billing; + var color = "#aaaaaa"; + if (cssClass == "WP5") { + color = "#aa0000"; + } else if (cssClass == "WP4") { + color = "#0000aa"; + } else if (cssClass == "WP2") { + color = "#aaaa00"; + } else if (cssClass == "TA3") { + color = "#00aa00"; + } + /* daySlot 7 = sunday, but this should be slot 0 */ + schedule.drawSlot(ctx, daySlot > 6 ? 0 : daySlot, r.from, r.until, "black", color); + } var localeUrl = '[[@{/js/dataTables/de.json}]]'; $("#project_table").DataTable({ "language" : {