initial
This commit is contained in:
		
							
								
								
									
										23
									
								
								src/main/java/de/jottyfan/bico/Main.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/main/java/de/jottyfan/bico/Main.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| package de.jottyfan.bico; | ||||
|  | ||||
| import org.springframework.boot.SpringApplication; | ||||
| import org.springframework.boot.autoconfigure.SpringBootApplication; | ||||
| import org.springframework.boot.builder.SpringApplicationBuilder; | ||||
| import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @author jotty | ||||
|  * | ||||
|  */ | ||||
| @SpringBootApplication | ||||
| public class Main extends SpringBootServletInitializer { | ||||
| 	@Override | ||||
| 	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { | ||||
| 		return application.sources(Main.class); | ||||
| 	} | ||||
|  | ||||
| 	public static void main(String[] args) { | ||||
| 		SpringApplication.run(Main.class, args); | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,40 @@ | ||||
| package de.jottyfan.bico.config; | ||||
|  | ||||
| import javax.sql.DataSource; | ||||
|  | ||||
| import org.jooq.SQLDialect; | ||||
| import org.jooq.impl.DataSourceConnectionProvider; | ||||
| import org.jooq.impl.DefaultConfiguration; | ||||
| import org.jooq.impl.DefaultDSLContext; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @author jotty | ||||
|  * | ||||
|  */ | ||||
| @Configuration | ||||
| public class DatabaseConfiguration { | ||||
| 	@Autowired | ||||
| 	private DataSource dataSource; | ||||
|  | ||||
| 	@Bean | ||||
| 	public DataSourceConnectionProvider connectionProvider() { | ||||
| 		return new DataSourceConnectionProvider(new TransactionAwareDataSourceProxy(dataSource)); | ||||
| 	} | ||||
|  | ||||
| 	@Bean | ||||
| 	public DefaultDSLContext dsl() { | ||||
| 		return new DefaultDSLContext(configuration()); | ||||
| 	} | ||||
|  | ||||
| 	public DefaultConfiguration configuration() { | ||||
| 		DefaultConfiguration jooqConfiguration = new DefaultConfiguration(); | ||||
| 		jooqConfiguration.set(connectionProvider()); | ||||
| 		jooqConfiguration.set(SQLDialect.POSTGRES); | ||||
| 		return jooqConfiguration; | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										10
									
								
								src/main/java/de/jottyfan/bico/modules/CommonController.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/main/java/de/jottyfan/bico/modules/CommonController.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| package de.jottyfan.bico.modules; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @author jotty | ||||
|  * | ||||
|  */ | ||||
| public abstract class CommonController { | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,19 @@ | ||||
| package de.jottyfan.bico.modules.index; | ||||
|  | ||||
| import org.springframework.stereotype.Controller; | ||||
| import org.springframework.web.bind.annotation.GetMapping; | ||||
|  | ||||
| import de.jottyfan.bico.modules.CommonController; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @author jotty | ||||
|  * | ||||
|  */ | ||||
| @Controller | ||||
| public class IndexController extends CommonController { | ||||
| 	@GetMapping("/") | ||||
| 	public String getIndex() { | ||||
| 		return "redirect:/sheet"; | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,25 @@ | ||||
| package de.jottyfan.bico.modules.index.model; | ||||
|  | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.boot.info.BuildProperties; | ||||
| import org.springframework.stereotype.Component; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @author jotty | ||||
|  * | ||||
|  */ | ||||
| @Component | ||||
| public class ManifestBean { | ||||
|  | ||||
| 	@Autowired(required = false) | ||||
| 	private BuildProperties buildProperties; | ||||
|  | ||||
| 	/** | ||||
| 	 * @return the version of this project | ||||
| 	 */ | ||||
| 	public String getVersion() { | ||||
| 		return buildProperties != null ? buildProperties.getVersion() | ||||
| 				: this.getClass().getPackage().getImplementationVersion(); | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,26 @@ | ||||
| package de.jottyfan.bico.modules.sheet; | ||||
|  | ||||
| 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 de.jottyfan.bico.modules.CommonController; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @author jotty | ||||
|  * | ||||
|  */ | ||||
| @Controller | ||||
| public class SheetController extends CommonController { | ||||
|  | ||||
| 	@Autowired | ||||
| 	private SheetService service; | ||||
|  | ||||
| 	@GetMapping("/sheet") | ||||
| 	public String getSheet(Model model) { | ||||
| 		model.addAttribute("list", service.getList()); | ||||
| 		return "/sheet"; | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,54 @@ | ||||
| package de.jottyfan.bico.modules.sheet; | ||||
|  | ||||
| import static de.jottyfan.bico.db.Tables.V_CALENDAR; | ||||
|  | ||||
| import java.time.LocalDate; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
|  | ||||
| import org.apache.logging.log4j.LogManager; | ||||
| import org.apache.logging.log4j.Logger; | ||||
| import org.jooq.DSLContext; | ||||
| import org.jooq.SelectSeekStep1; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.stereotype.Repository; | ||||
|  | ||||
| import de.jottyfan.bico.db.tables.records.VCalendarRecord; | ||||
| import de.jottyfan.bico.modules.sheet.model.SheetBean; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @author jotty | ||||
|  * | ||||
|  */ | ||||
| @Repository | ||||
| public class SheetRepository { | ||||
|  | ||||
| 	private static final Logger LOGGER = LogManager.getLogger(SheetRepository.class); | ||||
|  | ||||
| 	@Autowired | ||||
| 	private DSLContext jooq; | ||||
|  | ||||
| 	public List<SheetBean> getList() { | ||||
| 		SelectSeekStep1<VCalendarRecord, LocalDate> sql = jooq.selectFrom(V_CALENDAR).orderBy(V_CALENDAR.SLOT_DAY); | ||||
| 		LOGGER.trace(sql.toString()); | ||||
| 		List<SheetBean> list = new ArrayList<>(); | ||||
| 		for (VCalendarRecord r : sql.fetch()) { | ||||
| 			SheetBean bean = new SheetBean(); | ||||
| 			bean.setAbbreviation(r.getAbbreviation()); | ||||
| 			bean.setBibleverse(r.getBibleverse()); | ||||
| 			bean.setBookPages(r.getBookPages()); | ||||
| 			bean.setFullname(r.getFullname()); | ||||
| 			bean.setLessonNotes(r.getLessonNotes()); | ||||
| 			bean.setSlotDay(r.getSlotDay()); | ||||
| 			bean.setSlotNotes(r.getSlotNotes()); | ||||
| 			bean.setSourceName(r.getSourceName()); | ||||
| 			bean.setSubjectNotes(r.getSubjectNotes()); | ||||
| 			bean.setSubtheme(r.getSubtheme()); | ||||
| 			bean.setTheme(r.getTheme()); | ||||
| 			bean.setWorksheets(r.getWorksheets()); | ||||
| 			list.add(bean); | ||||
| 		} | ||||
| 		return list; | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,25 @@ | ||||
| package de.jottyfan.bico.modules.sheet; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.stereotype.Service; | ||||
|  | ||||
| import de.jottyfan.bico.modules.sheet.model.SheetBean; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @author jotty | ||||
|  * | ||||
|  */ | ||||
| @Service | ||||
| public class SheetService { | ||||
|  | ||||
| 	@Autowired | ||||
| 	private SheetRepository repository; | ||||
|  | ||||
| 	public List<SheetBean> getList() { | ||||
| 		return repository.getList(); | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,194 @@ | ||||
| package de.jottyfan.bico.modules.sheet.model; | ||||
|  | ||||
| import java.io.Serializable; | ||||
| import java.time.LocalDate; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @author jotty | ||||
|  * | ||||
|  */ | ||||
| public class SheetBean implements Serializable { | ||||
| 	private static final long serialVersionUID = 1L; | ||||
|  | ||||
| 	private LocalDate slotDay; | ||||
| 	private String fullname; | ||||
| 	private String abbreviation; | ||||
| 	private String sourceName; | ||||
| 	private String theme; | ||||
| 	private String subtheme; | ||||
| 	private String bookPages; | ||||
| 	private String worksheets; | ||||
| 	private String bibleverse; | ||||
| 	private String subjectNotes; | ||||
| 	private String lessonNotes; | ||||
| 	private String slotNotes; | ||||
|  | ||||
| 	/** | ||||
| 	 * @return the slotDay | ||||
| 	 */ | ||||
| 	public LocalDate getSlotDay() { | ||||
| 		return slotDay; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @param slotDay the slotDay to set | ||||
| 	 */ | ||||
| 	public void setSlotDay(LocalDate slotDay) { | ||||
| 		this.slotDay = slotDay; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @return the fullname | ||||
| 	 */ | ||||
| 	public String getFullname() { | ||||
| 		return fullname; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @param fullname the fullname to set | ||||
| 	 */ | ||||
| 	public void setFullname(String fullname) { | ||||
| 		this.fullname = fullname; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @return the abbreviation | ||||
| 	 */ | ||||
| 	public String getAbbreviation() { | ||||
| 		return abbreviation; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @param abbreviation the abbreviation to set | ||||
| 	 */ | ||||
| 	public void setAbbreviation(String abbreviation) { | ||||
| 		this.abbreviation = abbreviation; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @return the sourceName | ||||
| 	 */ | ||||
| 	public String getSourceName() { | ||||
| 		return sourceName; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @param sourceName the sourceName to set | ||||
| 	 */ | ||||
| 	public void setSourceName(String sourceName) { | ||||
| 		this.sourceName = sourceName; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @return the theme | ||||
| 	 */ | ||||
| 	public String getTheme() { | ||||
| 		return theme; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @param theme the theme to set | ||||
| 	 */ | ||||
| 	public void setTheme(String theme) { | ||||
| 		this.theme = theme; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @return the subtheme | ||||
| 	 */ | ||||
| 	public String getSubtheme() { | ||||
| 		return subtheme; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @param subtheme the subtheme to set | ||||
| 	 */ | ||||
| 	public void setSubtheme(String subtheme) { | ||||
| 		this.subtheme = subtheme; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @return the bookPages | ||||
| 	 */ | ||||
| 	public String getBookPages() { | ||||
| 		return bookPages; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @param bookPages the bookPages to set | ||||
| 	 */ | ||||
| 	public void setBookPages(String bookPages) { | ||||
| 		this.bookPages = bookPages; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @return the worksheets | ||||
| 	 */ | ||||
| 	public String getWorksheets() { | ||||
| 		return worksheets; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @param worksheets the worksheets to set | ||||
| 	 */ | ||||
| 	public void setWorksheets(String worksheets) { | ||||
| 		this.worksheets = worksheets; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @return the bibleverse | ||||
| 	 */ | ||||
| 	public String getBibleverse() { | ||||
| 		return bibleverse; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @param bibleverse the bibleverse to set | ||||
| 	 */ | ||||
| 	public void setBibleverse(String bibleverse) { | ||||
| 		this.bibleverse = bibleverse; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @return the subjectNotes | ||||
| 	 */ | ||||
| 	public String getSubjectNotes() { | ||||
| 		return subjectNotes; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @param subjectNotes the subjectNotes to set | ||||
| 	 */ | ||||
| 	public void setSubjectNotes(String subjectNotes) { | ||||
| 		this.subjectNotes = subjectNotes; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @return the lessonNotes | ||||
| 	 */ | ||||
| 	public String getLessonNotes() { | ||||
| 		return lessonNotes; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @param lessonNotes the lessonNotes to set | ||||
| 	 */ | ||||
| 	public void setLessonNotes(String lessonNotes) { | ||||
| 		this.lessonNotes = lessonNotes; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @return the slotNotes | ||||
| 	 */ | ||||
| 	public String getSlotNotes() { | ||||
| 		return slotNotes; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @param slotNotes the slotNotes to set | ||||
| 	 */ | ||||
| 	public void setSlotNotes(String slotNotes) { | ||||
| 		this.slotNotes = slotNotes; | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										25
									
								
								src/main/resources/application.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/main/resources/application.properties
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| # database credentials from defined config file | ||||
| spring.config.import = /etc/BiCO.properties | ||||
|  | ||||
| # define overwriteable arguments | ||||
| spring.datasource.driver-class-name = ${db.class:org.postgresql.Driver} | ||||
| spring.datasource.url = ${db.url} | ||||
| spring.datasource.username = ${db.username} | ||||
| spring.datasource.password = ${db.password} | ||||
|  | ||||
| server.servlet.context-path = ${my.context-path:/BiCO} | ||||
|  | ||||
| # security | ||||
| spring.security.oauth2.client.registration.keycloak.client-id = ${keycloak.client-id} | ||||
| spring.security.oauth2.client.registration.keycloak.scope = openid | ||||
| spring.security.oauth2.client.registration.keycloak.authorization-grant-type = authorization_code | ||||
| spring.security.oauth2.client.registration.keycloak.redirect-uri = ${keycloak.redirect-uri} | ||||
| spring.security.oauth2.client.provider.keycloak.issuer-uri = ${keycloak.issuer-uri} | ||||
| spring.security.oauth2.client.provider.keycloak.authorization-uri = ${keycloak.openid-url}/auth | ||||
| spring.security.oauth2.client.provider.keycloak.token-uri = ${keycloak.openid-url}/token | ||||
| spring.security.oauth2.client.provider.keycloak.user-info-uri = ${keycloak.openid-url}/userinfo | ||||
| spring.security.oauth2.client.provider.keycloak.jwk-set-uri = ${keycloak.openid-url}/certs | ||||
| spring.security.oauth2.client.provider.keycloak.user-name-attribute = preferred_username | ||||
|  | ||||
| # for development only | ||||
| server.port = 8081 | ||||
							
								
								
									
										16
									
								
								src/main/resources/static/css/style.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/main/resources/static/css/style.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| html { | ||||
| 	width: 100%; | ||||
| 	height: 100%; | ||||
| } | ||||
|  | ||||
| body { | ||||
| 	background-color: #abc; | ||||
| } | ||||
|  | ||||
| [data-bs-theme=dark] body { | ||||
| 	background-color: rgb(36, 31, 49); | ||||
| } | ||||
|  | ||||
| .borderdist { | ||||
| 	margin: 8px; | ||||
| } | ||||
							
								
								
									
										23
									
								
								src/main/resources/static/js/dataTables.de.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/main/resources/static/js/dataTables.de.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| var locale_de = { | ||||
| 	"sEmptyTable": "Keine Daten in der Tabelle vorhanden", | ||||
| 	"sInfo": "_START_ bis _END_ von _TOTAL_ Einträgen", | ||||
| 	"sInfoEmpty": "0 bis 0 von 0 Einträgen", | ||||
| 	"sInfoFiltered": "(gefiltert von _MAX_ Einträgen)", | ||||
| 	"sInfoPostFix": "", | ||||
| 	"sInfoThousands": ".", | ||||
| 	"sLengthMenu": "_MENU_ Einträge anzeigen", | ||||
| 	"sLoadingRecords": "Wird geladen...", | ||||
| 	"sProcessing": "Bitte warten...", | ||||
| 	"sSearch": "Suchen", | ||||
| 	"sZeroRecords": "Keine Einträge vorhanden.", | ||||
| 	"oPaginate": { | ||||
| 		"sFirst": "Erste", | ||||
| 		"sPrevious": "Zurück", | ||||
| 		"sNext": "Nächste", | ||||
| 		"sLast": "Letzte" | ||||
| 	}, | ||||
| 	"oAria": { | ||||
| 		"sSortAscending": ": aktivieren, um Spalte aufsteigend zu sortieren", | ||||
| 		"sSortDescending": ": aktivieren, um Spalte absteigend zu sortieren" | ||||
| 	} | ||||
| }; | ||||
							
								
								
									
										5
									
								
								src/main/resources/static/js/stylehelp.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/main/resources/static/js/stylehelp.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| toggleDarkMode = function() { | ||||
| 	var oldValue = $("html").attr("data-bs-theme"); | ||||
| 	var newValue = oldValue == "dark" ? "light" : "dark"; | ||||
| 	$("html").attr("data-bs-theme", newValue); | ||||
| } | ||||
							
								
								
									
										46
									
								
								src/main/resources/templates/sheet.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/main/resources/templates/sheet.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| <!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"> | ||||
| <head> | ||||
| <title>Camp Organizer 2</title> | ||||
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | ||||
| </head> | ||||
| <body> | ||||
| 	<th:block layout:fragment="content"> | ||||
| 		<div class="borderdist"> | ||||
| 			<table id="table" class="table table-striped"> | ||||
| 				<thead> | ||||
| 					<tr> | ||||
| 						<th>Tag</th> | ||||
| 						<th>Kürzel</th> | ||||
| 						<th>Quelle</th> | ||||
| 						<th>Thema</th> | ||||
| 						<th>Unterthema</th> | ||||
| 						<th>Tag-Anmerkungen</th> | ||||
| 					</tr> | ||||
| 				</thead> | ||||
| 				<tbody> | ||||
| 					<tr th:each="s : ${list}"> | ||||
| 						<td th:text="${#temporals.format(s.slotDay, 'yyyy-MM-dd')}"></td> | ||||
| 						<td th:text="${s.abbreviation}"></td> | ||||
| 						<td th:text="${s.sourceName}"></td> | ||||
| 						<td th:text="${s.theme}"></td> | ||||
| 						<td th:text="${s.subtheme}"></td> | ||||
| 						<td th:text="${s.slotNotes}"></td> | ||||
| 					</tr> | ||||
| 				</tbody> | ||||
| 			</table> | ||||
| 			<script type="text/javascript"> | ||||
| 				$(document).ready(function() { | ||||
| 					$("#table").DataTable({ | ||||
| 						"columnDefs" : [ { | ||||
| 							"targets" : 0, | ||||
| 							"type" : "date-eu" | ||||
| 						} ], | ||||
| 						"language" : locale_de | ||||
| 					}); | ||||
| 				}); | ||||
| 			</script> | ||||
| 		</div> | ||||
| 	</th:block> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										41
									
								
								src/main/resources/templates/template.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/main/resources/templates/template.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| <!DOCTYPE html> | ||||
| <html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/extras/spring-security" data-bs-theme="dark"> | ||||
| <head> | ||||
| <title>Camp Organizer 2</title> | ||||
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | ||||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
| <link th:rel="stylesheet" type="text/css" media="all" th:href="@{/webjars/bootstrap/5.3.1/css/bootstrap.min.css}" /> | ||||
| <link th:rel="stylesheet" type="text/css" media="all" th:href="@{/webjars/bootstrap-icons/1.10.5/font/bootstrap-icons.css}" /> | ||||
| <link th:rel="stylesheet" type="text/css" media="all" th:href="@{/webjars/datatables/1.13.5/css/jquery.dataTables.min.css}" /> | ||||
| <link th:rel="stylesheet" type="text/css" media="all" th:href="@{/css/style.css}" /> | ||||
| <script th:src="@{/webjars/bootstrap/5.3.1/js/bootstrap.bundle.min.js}"></script> | ||||
| <script th:src="@{/webjars/jquery/3.7.1/jquery.min.js}"></script> | ||||
| <script th:src="@{/webjars/datatables/1.13.5/js/jquery.dataTables.min.js}"></script> | ||||
| <script th:src="@{/js/dataTables.de.js}"></script> | ||||
| <script th:src="@{/js/stylehelp.js}"></script> | ||||
| </head> | ||||
| <body> | ||||
| 	<nav class="navbar sticky-top navbar-expand-lg headerlayout"> | ||||
| 		<button class="navbar-toggler" style="margin-right: 40px" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" | ||||
| 			aria-expanded="false"> | ||||
| 			<span class="navbar-toggler-icon"></span> | ||||
| 		</button> | ||||
| 		<div class="collapse navbar-collapse" id="navbarSupportedContent" style="margin-right: 20px"> | ||||
| 			<ul class="navbar-nav mb-2 mb-lg-0"> | ||||
| 				<li class="nav-item"><a class="btn btn-outline-secondary" th:href="@{/}">Startseite</a></li> | ||||
| 				<li class="nav-item"><a class="btn btn-outline-secondary" th:href="@{/sheet}">Übersicht</a></li> | ||||
| 			</ul> | ||||
| 			<ul layout:fragment="header"></ul> | ||||
| 			<ul class="nav navbar-nav ms-auto"> | ||||
| 				<li class="nav-item"> | ||||
| 				  <a href="https://gitlab.com/jottyfan/bico/-/issues" class="btn btn-outline-secondary" target="_blank" th:text="${'v' + @manifestBean.getVersion()}"></a> | ||||
| 				</li> | ||||
| 				<li class="nav-item"> | ||||
| 					<a href="#" class="btn btn-outline-secondary" onclick="toggleDarkMode()"><i class="bi bi-moon"></i></a> | ||||
| 				</li> | ||||
| 			</ul> | ||||
| 		</div> | ||||
| 	</nav> | ||||
| 	<div layout:fragment="content">content</div> | ||||
| </body> | ||||
| </html> | ||||
		Reference in New Issue
	
	Block a user