first steps of items

This commit is contained in:
Jottyfan
2023-11-18 00:31:43 +01:00
parent 80696b0c0b
commit 0c18b2df56
14 changed files with 383 additions and 4 deletions

View File

@ -0,0 +1,27 @@
package de.jottyfan.bico.modules.item;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import de.jottyfan.bico.modules.CommonController;
/**
*
* @author jotty
*
*/
@Controller
public class ItemController extends CommonController {
@Autowired
private ItemService service;
@GetMapping("/item/{slot}")
public String getItem(@PathVariable Integer slot, Model model) {
model.addAttribute("bean", service.getItem(slot));
return "/item";
}
}

View File

@ -0,0 +1,93 @@
package de.jottyfan.bico.modules.item;
import static de.jottyfan.bico.db.Tables.T_LESSON;
import static de.jottyfan.bico.db.Tables.T_LESSON_SUBJECT;
import static de.jottyfan.bico.db.Tables.T_PERSON;
import static de.jottyfan.bico.db.Tables.T_SLOT;
import static de.jottyfan.bico.db.Tables.T_SOURCE;
import static de.jottyfan.bico.db.Tables.T_SUBJECT;
import java.time.LocalDate;
import java.util.Iterator;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.jooq.DSLContext;
import org.jooq.Record17;
import org.jooq.SelectConditionStep;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import de.jottyfan.bico.modules.item.model.ItemBean;
import de.jottyfan.bico.modules.item.model.LessonBean;
import de.jottyfan.bico.modules.item.model.PersonBean;
import de.jottyfan.bico.modules.item.model.SourceBean;
import de.jottyfan.bico.modules.item.model.SubjectBean;
/**
*
* @author jotty
*
*/
@Repository
public class ItemRepository {
private static final Logger LOGGER = LogManager.getLogger(ItemRepository.class);
@Autowired
private DSLContext jooq;
/**
* get the item of slot
*
* @param slot the ID of the slot
* @return the bean
*/
public ItemBean getItem(Integer slot) {
SelectConditionStep<Record17<Integer, LocalDate, String, String, Integer, String, String, String, Integer, String, Integer, String, String, String, String, String, String>> sql = jooq
// @formatter:off
.select(T_SLOT.PK_SLOT,
T_SLOT.SLOT_DAY,
T_SLOT.NOTE,
T_LESSON.NOTES,
T_PERSON.PK_PERSON,
T_PERSON.FORENAME,
T_PERSON.SURNAME,
T_PERSON.ABBREVIATION,
T_SOURCE.PK_SOURCE,
T_SOURCE.NAME,
T_SUBJECT.PK_SUBJECT,
T_SUBJECT.THEME,
T_SUBJECT.SUBTHEME,
T_SUBJECT.WORKSHEETS,
T_SUBJECT.BIBLEVERSE,
T_SUBJECT.BOOK_PAGES,
T_SOURCE.NAME)
.from(T_SLOT)
.leftJoin(T_LESSON).on(T_LESSON.FK_SLOT.eq(T_SLOT.PK_SLOT))
.leftJoin(T_PERSON).on(T_PERSON.PK_PERSON.eq(T_LESSON.FK_PERSON))
.leftJoin(T_LESSON_SUBJECT).on(T_LESSON_SUBJECT.FK_LESSON.eq(T_LESSON.PK_LESSON))
.leftJoin(T_SUBJECT).on(T_SUBJECT.PK_SUBJECT.eq(T_LESSON_SUBJECT.FK_SUBJECT))
.leftJoin(T_SOURCE).on(T_SOURCE.PK_SOURCE.eq(T_SUBJECT.FK_SOURCE))
.where(T_SLOT.PK_SLOT.eq(slot));
// @formatter:on
LOGGER.trace(sql);
Iterator<Record17<Integer, LocalDate, String, String, Integer, String, String, String, Integer, String, Integer, String, String, String, String, String, String>> i = sql
.fetch().iterator();
ItemBean bean = new ItemBean();
while (i.hasNext()) {
Record17<Integer, LocalDate, String, String, Integer, String, String, String, Integer, String, Integer, String, String, String, String, String, String> r = i
.next();
bean.setPkSlot(r.get(T_SLOT.PK_SLOT));
bean.setSlotDay(r.get(T_SLOT.SLOT_DAY));
bean.setSlotNote(r.get(T_SLOT.NOTE));
bean.getLessons()
.add(LessonBean.of(
r.get(T_LESSON.NOTES), new PersonBean(r.get(T_PERSON.PK_PERSON), r.get(T_PERSON.FORENAME),
r.get(T_PERSON.SURNAME), r.get(T_PERSON.ABBREVIATION)),
new SubjectBean(new SourceBean(r.get(T_SOURCE.PK_SOURCE), r.get(T_SOURCE.NAME)), r.get(T_SUBJECT.PK_SUBJECT), r.get(T_SUBJECT.THEME),
r.get(T_SUBJECT.SUBTHEME), r.get(T_SUBJECT.WORKSHEETS), r.get(T_SUBJECT.BIBLEVERSE),
r.get(T_SUBJECT.BOOK_PAGES))));
}
return bean;
}
}

View File

@ -0,0 +1,22 @@
package de.jottyfan.bico.modules.item;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import de.jottyfan.bico.modules.item.model.ItemBean;
/**
*
* @author jotty
*
*/
@Service
public class ItemService {
@Autowired
private ItemRepository repository;
public ItemBean getItem(Integer slot) {
return repository.getItem(slot);
}
}

View File

@ -0,0 +1,73 @@
package de.jottyfan.bico.modules.item.model;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author jotty
*
*/
public class ItemBean implements Serializable {
private static final long serialVersionUID = 1L;
private Integer pkSlot;
private LocalDate slotDay;
private String slotNote;
private List<LessonBean> lessons;
public ItemBean() {
lessons = new ArrayList<>();
}
/**
* @return the pkSlot
*/
public Integer getPkSlot() {
return pkSlot;
}
/**
* @param pkSlot the pkSlot to set
*/
public void setPkSlot(Integer pkSlot) {
this.pkSlot = pkSlot;
}
/**
* @return the slotDay
*/
public LocalDate getSlotDay() {
return slotDay;
}
/**
* @param slotDay the slotDay to set
*/
public void setSlotDay(LocalDate slotDay) {
this.slotDay = slotDay;
}
/**
* @return the slotNote
*/
public String getSlotNote() {
return slotNote;
}
/**
* @param slotNote the slotNote to set
*/
public void setSlotNote(String slotNote) {
this.slotNote = slotNote;
}
/**
* @return the lessons
*/
public List<LessonBean> getLessons() {
return lessons;
}
}

View File

@ -0,0 +1,59 @@
package de.jottyfan.bico.modules.item.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author jotty
*
*/
public class LessonBean implements Serializable {
private static final long serialVersionUID = 1L;
private String lessonNote;
private List<PersonBean> persons;
private List<SubjectBean> subjects;
public LessonBean() {
persons = new ArrayList<>();
subjects = new ArrayList<>();
}
public static final LessonBean of(String lessonNote, PersonBean persons, SubjectBean subject) {
LessonBean bean = new LessonBean();
bean.getPersons().add(persons);
bean.getSubjects().add(subject);
return bean;
}
/**
* @return the lessonNote
*/
public String getLessonNote() {
return lessonNote;
}
/**
* @param lessonNote the lessonNote to set
*/
public void setLessonNote(String lessonNote) {
this.lessonNote = lessonNote;
}
/**
* @return the persons
*/
public List<PersonBean> getPersons() {
return persons;
}
/**
* @return the subjects
*/
public List<SubjectBean> getSubjects() {
return subjects;
}
}

View File

@ -0,0 +1,9 @@
package de.jottyfan.bico.modules.item.model;
/**
*
* @author jotty
*
*/
public record PersonBean(Integer pkPerson, String forename, String surname, String abbreviation) {
}

View File

@ -0,0 +1,10 @@
package de.jottyfan.bico.modules.item.model;
/**
*
* @author jotty
*
*/
public record SourceBean(Integer pkSource, String name) {
}

View File

@ -0,0 +1,11 @@
package de.jottyfan.bico.modules.item.model;
/**
*
* @author jotty
*
*/
public record SubjectBean(SourceBean source, Integer pkSubject, String theme, String subtheme, String worksheets,
String bibleverse, String bookPages) {
}

View File

@ -35,6 +35,8 @@ public class SheetRepository {
List<SheetBean> list = new ArrayList<>();
for (VCalendarRecord r : sql.fetch()) {
SheetBean bean = new SheetBean();
bean.setPkSlot(r.getPkSlot());
bean.setPkSubject(r.getPkSubject());
bean.setAbbreviation(r.getAbbreviation());
bean.setBibleverse(r.getBibleverse());
bean.setBookPages(r.getBookPages());

View File

@ -23,6 +23,8 @@ public class SheetBean implements Serializable {
private String subjectNotes;
private String lessonNotes;
private String slotNotes;
private Integer pkSlot;
private Integer pkSubject;
/**
* @return the slotDay
@ -191,4 +193,32 @@ public class SheetBean implements Serializable {
public void setSlotNotes(String slotNotes) {
this.slotNotes = slotNotes;
}
/**
* @return the pkSlot
*/
public Integer getPkSlot() {
return pkSlot;
}
/**
* @param pkSlot the pkSlot to set
*/
public void setPkSlot(Integer pkSlot) {
this.pkSlot = pkSlot;
}
/**
* @return the pkSubject
*/
public Integer getPkSubject() {
return pkSubject;
}
/**
* @param pkSubject the pkSubject to set
*/
public void setPkSubject(Integer pkSubject) {
this.pkSubject = pkSubject;
}
}

View File

@ -16,6 +16,6 @@ toggleDarkMode = function() {
* only because th:data-bs-theme="${theme}" does not work
*/
$(document).ready(function(){
var theme = /*[[${theme}]]*/ 'dark';
var theme = /*[[${theme}]]*/ 'light';
$("html").attr("data-bs-theme", theme);
});

View File

@ -0,0 +1,41 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" layout:decorate="~{template}" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<body>
<th:block layout:fragment="content">
<div class="borderdist">
<div class="container" th:if="${bean}">
<div class="row g-2">
<div class="col-sm-2">Tag</div>
<div class="col-sm-10" th:text="${#temporals.format(bean.slotDay, 'yyyy-MM-dd')}"></div>
<div class="col-sm-2">Lehreinheiten</div>
<div class="col-sm-10">
<div class="row g-2" th:each="l : ${bean.lessons}">
<div class="col-sm-2">Dozent</div>
<div class="col-sm-10">
<div th:each="p : ${l.persons}" th:text="${p.forename} + ' ' + ${p.surname}"></div>
</div>
<div class="col-sm-2">Themen</div>
<div class="col-sm-10">
<div class="row g-2" th:each="x : ${l.subjects}">
<div class="col-sm-2">Thema</div>
<div class="col-sm-10" th:text="${x.theme}"></div>
<div class="col-sm-2">Unterthema</div>
<div class="col-sm-10" th:text="${x.subtheme}"></div>
<div class="col-sm-2">Buchseiten</div>
<div class="col-sm-10" th:text="${x.bookPages}"></div>
<div class="col-sm-2">Arbeitsblätter</div>
<div class="col-sm-10" th:text="${x.worksheets}"></div>
<div class="col-sm-2">Bibelvers</div>
<div class="col-sm-10" th:text="${x.bibleverse}"></div>
<div class="col-sm-2">Quelle</div>
<div class="col-sm-10" th:text="${x.source?.name}"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</th:block>
</body>
</html>

View File

@ -12,6 +12,7 @@
<th>Thema</th>
<th>Unterthema</th>
<th>Tag-Anmerkungen</th>
<th></th>
</tr>
</thead>
<tbody>
@ -22,6 +23,7 @@
<td th:text="${s.theme}"></td>
<td th:text="${s.subtheme}"></td>
<td th:text="${s.slotNotes}"></td>
<td><a th:href="@{/item/{slot}(slot=${s.pkSlot})}" class="btn btn-outline-secondary"><i class="bi bi-pencil"></i></a></td>
</tr>
</tbody>
</table>