serialized events

This commit is contained in:
Jörg Henke
2023-05-10 10:14:05 +02:00
parent 4d7a26fa2b
commit 6452c003c5
7 changed files with 139 additions and 31 deletions

View File

@ -42,7 +42,7 @@ dependencies {
implementation 'org.webjars:jquery-ui:1.13.2'
implementation 'org.webjars:fullcalendar:5.11.3'
implementation 'com.google.code.gson:gson:2.9.0';
implementation 'com.google.code.gson:gson:2.10.1';
implementation 'org.webjars.bowergithub.datatables:datatables:1.10.21'

View File

@ -1,7 +1,14 @@
package de.jottyfan.timetrack.modules.calendar;
import java.time.LocalDate;
import java.time.LocalDateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
/**
*
* @author jotty
@ -9,23 +16,19 @@ import org.springframework.stereotype.Service;
*/
@Service
public class CalendarService {
@Autowired
private DummyRepository dummyRepository;
// TODO: implement a davical database reader as a repository
// TODO: implement a caldav client as repository
// TODO: implement a radicale file reader as repository
// TODO: create resource management database table for the calendar
// TODO: create resource management database table for the calendar credentials
public String getJsonEvents() {
StringBuilder buf = new StringBuilder("[");
// TODO: use List<EventBean> instead
buf.append(
"{ id: 'example3', title: 'all day event', start: '2023-05-08', allDay: true, backgroundColor: 'darkcyan'},");
buf.append(" { id: 'i1', title: 'overlapping', start: '2023-05-08T10:00', end: '2023-05-09T10:00'},");
buf.append(" { id: 'i2', title: 'developing', start: '2023-05-09T08:00', end: '2023-05-09T10:15'}");
buf.append("]");
return buf.toString();
Gson gson = new GsonBuilder().registerTypeAdapter(LocalDate.class, new LocalDateAdapter())
.registerTypeAdapter(LocalDateTime.class, new LocalDateTimeAdapter()).create();
return gson.toJson(dummyRepository.getExamples());
}
}

View File

@ -0,0 +1,42 @@
package de.jottyfan.timetrack.modules.calendar;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Repository;
/**
*
* @author jotty
*
*/
@Repository
public class DummyRepository {
/**
* get example dates
*
* @return the example dates
*/
public List<EventBean> getExamples() {
List<EventBean> list = new ArrayList<>();
EventBean event1 = EventBean.ofAllDayEvent("e1", "all day event", LocalDate.of(2023, 5, 8));
event1.setBackgroundColor("darkcyan");
list.add(event1);
EventBean event2 = EventBean.ofEvent("e2", "overlapping", LocalDate.of(2023, 5, 8).atTime(10, 0),
LocalDate.of(2023, 5, 9).atTime(10, 0));
list.add(event2);
EventBean event3 = EventBean.ofEvent("e3", "developing", LocalDate.of(2023, 5, 10).atTime(8, 0),
LocalDate.of(2023, 5, 10).atTime(10, 0));
list.add(event3);
return list;
}
}

View File

@ -1,6 +1,7 @@
package de.jottyfan.timetrack.modules.calendar;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@ -42,24 +43,42 @@ public class EventBean implements Serializable {
classNames = new ArrayList<>();
}
@Override
public String toString() {
StringBuilder buf = new StringBuilder("{");
buf.append("id:'").append(id).append("',");
buf.append("groupId:'").append(groupId).append("',");
buf.append("allDay:'").append(allDay).append("',");
// TODO: extend; also, only on demand (not null), or better use Gson for the json conversion
// .append(", start=").append(start).append(", end=").append(end).append(", startStr=").append(startStr)
// .append(", endStr=").append(endStr).append(", title=").append(title).append(", url=").append(url)
// .append(", classNames=").append(classNames).append(", editable=").append(editable).append(", startEditable=")
// .append(startEditable).append(", durationEditable=").append(durationEditable).append(", resourceEditable=")
// .append(resourceEditable).append(", display=").append(display).append(", overlap=").append(overlap)
// .append(", constraint=").append(constraint).append(", backgroundColor=").append(backgroundColor)
// .append(", boderColor=").append(boderColor).append(", textColor=").append(textColor).append(", extendedProps=")
// .append(extendedProps).append(", source=").append(source).append("]");
return buf.toString();
/**
* create new all day event
*
* @param id the ID of the event
* @param title the title of the event
* @param start the day of the event
* @return the event
*/
public static final EventBean ofAllDayEvent(String id, String title, LocalDate start) {
EventBean bean = new EventBean();
bean.setId(id);
bean.setTitle(title);
bean.setStart(start == null ? null : start.atStartOfDay());
bean.setAllDay(true);
return bean;
}
/**
* create new event
*
* @param id the ID of the event
* @param title the title of the event
* @param start the datetime of the start
* @param end the datetime of the end
* @return the event
*/
public static final EventBean ofEvent(String id, String title, LocalDateTime start, LocalDateTime end) {
EventBean bean = new EventBean();
bean.setId(id);
bean.setTitle(title);
bean.setStart(start);
bean.setEnd(end);
bean.setAllDay(false);
return bean;
}
/**
* @return the id
*/

View File

@ -0,0 +1,22 @@
package de.jottyfan.timetrack.modules.calendar;
import java.lang.reflect.Type;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
/**
*
* @author jotty
*
*/
public class LocalDateAdapter implements JsonSerializer<LocalDate> {
public JsonElement serialize(LocalDate date, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(date.format(DateTimeFormatter.ISO_LOCAL_DATE));
}
}

View File

@ -0,0 +1,22 @@
package de.jottyfan.timetrack.modules.calendar;
import java.lang.reflect.Type;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
/**
*
* @author jotty
*
*/
public class LocalDateTimeAdapter implements JsonSerializer<LocalDateTime> {
public JsonElement serialize(LocalDateTime date, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(date.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
}
}

View File

@ -10,7 +10,7 @@ server.port = 8083
server.servlet.context-path=/timetrack
# keycloak
keycloak.auth-server-url = http://localhost:8080/
keycloak.auth-server-url = https://www.jottyfan.de/auth
keycloak.realm = jottyfan
keycloak.resource = timetrack
keycloak.public-client = true