Compare commits
No commits in common. "11188bacbea97abf4cd14724a84c67cbfed42236" and "7ce535f5002fb7bbb2c23f7f5d044a93f74ad3fe" have entirely different histories.
11188bacbe
...
7ce535f500
@ -34,7 +34,7 @@ jobs:
|
|||||||
cargo build
|
cargo build
|
||||||
cd frontend && npm install && npm run build
|
cd frontend && npm install && npm run build
|
||||||
- name: Frontend tests
|
- name: Frontend tests
|
||||||
run: cd frontend && npx playwright install && npx playwright test --workers 1 --reporter line
|
run: cd frontend && npx playwright install && npx playwright test --workers 1
|
||||||
- name: Backend tests
|
- name: Backend tests
|
||||||
run: cargo test --verbose
|
run: cargo test --verbose
|
||||||
#- uses: actions/upload-artifact@v3
|
#- uses: actions/upload-artifact@v3
|
||||||
|
@ -16,9 +16,3 @@
|
|||||||
|
|
||||||
## Backend (Unit + Integration)
|
## Backend (Unit + Integration)
|
||||||
`cargo t`
|
`cargo t`
|
||||||
|
|
||||||
# Lints
|
|
||||||
|
|
||||||
- Rust: `cargo check`
|
|
||||||
- Tera files: `djlint **.html.tera --profile=jinja --reformat`
|
|
||||||
- Typescript: `prettier -w *.ts`
|
|
||||||
|
@ -1,76 +1,77 @@
|
|||||||
import * as d3 from "d3";
|
import * as d3 from 'd3';
|
||||||
|
|
||||||
export interface Data {
|
export interface Data {
|
||||||
date: Date;
|
date: Date;
|
||||||
km: number;
|
km: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sessionStorage.getItem("userStats")) {
|
if(sessionStorage.getItem('userStats')) {
|
||||||
const data = JSON.parse(
|
const data = JSON.parse(sessionStorage.getItem('userStats') || '{}') as Data[];
|
||||||
sessionStorage.getItem("userStats") || "{}",
|
|
||||||
) as Data[];
|
|
||||||
|
|
||||||
if (data.length >= 2) {
|
if(data.length >= 2) {
|
||||||
const margin = { top: 20, right: 20, bottom: 50, left: 50 };
|
const margin = { top: 20, right: 20, bottom: 50, left: 50 };
|
||||||
const width: number = 960 - margin.left - margin.right;
|
const width: number = 960 - margin.left - margin.right;
|
||||||
const height: number = 500 - margin.top - margin.bottom;
|
const height: number = 500 - margin.top - margin.bottom;
|
||||||
|
|
||||||
data.forEach((d: Data) => {
|
data.forEach((d: Data) => {
|
||||||
d.date = <Date>new Date(d.date);
|
d.date = <Date> new Date(d.date)
|
||||||
d.km = +d.km;
|
d.km = +d.km;
|
||||||
});
|
});
|
||||||
|
|
||||||
const x = d3
|
const x = d3.scaleTime()
|
||||||
.scaleTime()
|
|
||||||
.domain(<[Date, Date]>d3.extent(data, (d: Data) => d.date))
|
.domain(<[Date, Date]>d3.extent(data, (d: Data) => d.date))
|
||||||
.range([0, width]);
|
.range([0, width]);
|
||||||
|
|
||||||
const y = d3
|
const y = d3.scaleLinear()
|
||||||
.scaleLinear()
|
|
||||||
.domain([0, Number(d3.max(data, (d: Data) => d.km))])
|
.domain([0, Number(d3.max(data, (d: Data) => d.km))])
|
||||||
.range([height, 0]);
|
.range([height, 0]);
|
||||||
|
|
||||||
const line = d3
|
const line = d3.line<Data>()
|
||||||
.line<Data>()
|
|
||||||
.x((d: Data) => x(d.date))
|
.x((d: Data) => x(d.date))
|
||||||
.y((d: Data) => y(d.km));
|
.y((d: Data) => y(d.km));
|
||||||
|
|
||||||
const svg = d3
|
const svg = d3.select('#container')
|
||||||
.select("#container")
|
.append('svg')
|
||||||
.append("svg")
|
.attr('width', width + margin.left + margin.right)
|
||||||
.attr("width", width + margin.left + margin.right)
|
.attr('height', height + margin.top + margin.bottom)
|
||||||
.attr("height", height + margin.top + margin.bottom)
|
|
||||||
.call(responsivefy)
|
.call(responsivefy)
|
||||||
.append("g")
|
.append('g')
|
||||||
.attr("transform", `translate(${margin.left},${margin.top})`);
|
.attr('transform', `translate(${margin.left},${margin.top})`);
|
||||||
|
|
||||||
svg.append("path").data([data]).attr("class", "line").attr("d", line);
|
svg.append('path')
|
||||||
|
.data([data])
|
||||||
|
.attr('class', 'line')
|
||||||
|
.attr('d', line);
|
||||||
|
|
||||||
svg
|
svg.append('g')
|
||||||
.append("g")
|
.attr('transform', `translate(0,${height})`)
|
||||||
.attr("transform", `translate(0,${height})`)
|
|
||||||
.call(d3.axisBottom(x));
|
.call(d3.axisBottom(x));
|
||||||
|
|
||||||
svg.append("g").call(d3.axisLeft(y));
|
svg.append('g')
|
||||||
|
.call(d3.axisLeft(y));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function responsivefy(svg: any) {
|
function responsivefy(svg: any) {
|
||||||
const container = d3.select(svg.node().parentNode);
|
const container = d3.select(svg.node().parentNode);
|
||||||
const width = parseInt(svg.style("width"), 10);
|
const width = parseInt(svg.style('width'), 10);
|
||||||
const height = parseInt(svg.style("height"), 10);
|
const height = parseInt(svg.style('height'), 10);
|
||||||
const aspect = width / height;
|
const aspect = width / height;
|
||||||
|
|
||||||
svg
|
svg.attr('viewBox', `0 0 ${width} ${height}`)
|
||||||
.attr("viewBox", `0 0 ${width} ${height}`)
|
.attr('preserveAspectRatio', 'xMinYMid')
|
||||||
.attr("preserveAspectRatio", "xMinYMid")
|
|
||||||
.call(resize);
|
.call(resize);
|
||||||
|
|
||||||
d3.select(window).on("resize." + container.attr("id"), resize);
|
d3.select(window).on(
|
||||||
|
'resize.' + container.attr('id'),
|
||||||
|
resize
|
||||||
|
);
|
||||||
|
|
||||||
function resize() {
|
function resize() {
|
||||||
const w = parseInt(container.style("width"));
|
const w = parseInt(container.style('width'));
|
||||||
svg.attr("width", w);
|
svg.attr('width', w);
|
||||||
svg.attr("height", Math.round(w / aspect));
|
svg.attr('height', Math.round(w / aspect));
|
||||||
}
|
}
|
||||||
}
|
}
|
583
frontend/main.ts
@ -1,6 +1,6 @@
|
|||||||
import Choices from "choices.js";
|
import Choices from "choices.js";
|
||||||
import { Sidebar } from "./js/sidebar";
|
import { Sidebar } from './js/sidebar';
|
||||||
import "./scss/app.scss";
|
import './scss/app.scss'
|
||||||
export interface choiceMap {
|
export interface choiceMap {
|
||||||
[details: string]: Choices;
|
[details: string]: Choices;
|
||||||
}
|
}
|
||||||
@ -8,7 +8,7 @@ export interface choiceMap {
|
|||||||
let choiceObjects: choiceMap = {};
|
let choiceObjects: choiceMap = {};
|
||||||
let boat_in_ottensheim = true;
|
let boat_in_ottensheim = true;
|
||||||
|
|
||||||
document.addEventListener("DOMContentLoaded", function () {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
changeTheme();
|
changeTheme();
|
||||||
initcolorTheme();
|
initcolorTheme();
|
||||||
initSearch();
|
initSearch();
|
||||||
@ -18,159 +18,137 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
initChoices();
|
initChoices();
|
||||||
initBoatActions();
|
initBoatActions();
|
||||||
selectBoatChange();
|
selectBoatChange();
|
||||||
addRelationMagic(<HTMLElement>document.querySelector("body"));
|
addRelationMagic(<HTMLElement>document.querySelector('body'));
|
||||||
reloadPage();
|
reloadPage();
|
||||||
setCurrentdate(<HTMLInputElement>document.querySelector("#departure"));
|
setCurrentdate(<HTMLInputElement>document.querySelector('#departure'));
|
||||||
});
|
});
|
||||||
|
|
||||||
function changeTheme() {
|
function changeTheme() {
|
||||||
let toggleBtn = <HTMLElement>document.querySelector("#theme-toggle-js");
|
let toggleBtn = <HTMLElement>document.querySelector('#theme-toggle-js');
|
||||||
|
|
||||||
if (toggleBtn) {
|
if(toggleBtn) {
|
||||||
toggleBtn.addEventListener("click", function () {
|
toggleBtn.addEventListener('click', function() {
|
||||||
if (toggleBtn.dataset.theme === "light") {
|
if(toggleBtn.dataset.theme === 'light') {
|
||||||
setTheme("dark", true);
|
setTheme('dark', true);
|
||||||
} else {
|
} else {
|
||||||
setTheme("light", true);
|
setTheme('light', true);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/***
|
/***
|
||||||
* init javascript
|
* init javascript
|
||||||
* 1) detect native color scheme or use set theme in local storage
|
* 1) detect native color scheme or use set theme in local storage
|
||||||
* 2) detect view (desktop or responsive) if on mobile device with touch screen
|
* 2) detect view (desktop or responsive) if on mobile device with touch screen
|
||||||
* 3) set base font size to 112.5% -> 18px
|
* 3) set base font size to 112.5% -> 18px
|
||||||
*/
|
*/
|
||||||
function initcolorTheme() {
|
function initcolorTheme() {
|
||||||
colorThemeWatcher();
|
colorThemeWatcher();
|
||||||
let theme = localStorage.getItem("theme");
|
let theme = localStorage.getItem('theme');
|
||||||
if (theme == null || theme === "auto") {
|
if (theme == null || theme === 'auto') {
|
||||||
if (
|
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||||
window.matchMedia &&
|
setTheme('dark', false);
|
||||||
window.matchMedia("(prefers-color-scheme: dark)").matches
|
|
||||||
) {
|
|
||||||
setTheme("dark", false);
|
|
||||||
} else {
|
} else {
|
||||||
setTheme("light", false);
|
setTheme('light', false);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
setTheme(theme);
|
setTheme(theme)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/***
|
/***
|
||||||
* Listener operating system native color configuration
|
* Listener operating system native color configuration
|
||||||
*/
|
*/
|
||||||
function colorThemeWatcher() {
|
function colorThemeWatcher() {
|
||||||
try {
|
try {
|
||||||
window
|
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', e => {
|
||||||
.matchMedia("(prefers-color-scheme: dark)")
|
setTheme(e.matches ? 'dark' : 'light');
|
||||||
.addEventListener("change", (e) => {
|
|
||||||
setTheme(e.matches ? "dark" : "light");
|
|
||||||
});
|
});
|
||||||
} catch {
|
} catch {
|
||||||
console.warn("color theme watcher not supported");
|
console.warn('color theme watcher not supported');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define color scheme, colors without losing the base font size configuration
|
* Define color scheme, colors without losing the base font size configuration
|
||||||
* and add data-theme to html tag
|
* and add data-theme to html tag
|
||||||
* @param theme
|
* @param theme
|
||||||
*/
|
*/
|
||||||
function setTheme(theme: string, setLocalStorage = true) {
|
function setTheme(theme: string, setLocalStorage = true) {
|
||||||
let toggleBtn = document.querySelector("#theme-toggle-js");
|
let toggleBtn = document.querySelector('#theme-toggle-js');
|
||||||
|
|
||||||
if (setLocalStorage) {
|
if (setLocalStorage) {
|
||||||
localStorage.setItem("theme", theme);
|
localStorage.setItem('theme', theme);
|
||||||
}
|
}
|
||||||
if (toggleBtn) toggleBtn.setAttribute("data-theme", theme);
|
if (toggleBtn) toggleBtn.setAttribute('data-theme', theme);
|
||||||
|
|
||||||
if (
|
if (document.documentElement.classList.contains('dark') && theme === 'light') {
|
||||||
document.documentElement.classList.contains("dark") &&
|
document.documentElement.classList.remove('dark');
|
||||||
theme === "light"
|
} else if(theme === 'dark'){
|
||||||
) {
|
document.documentElement.classList.add('dark');
|
||||||
document.documentElement.classList.remove("dark");
|
|
||||||
} else if (theme === "dark") {
|
|
||||||
document.documentElement.classList.add("dark");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function setCurrentdate(input: HTMLInputElement) {
|
function setCurrentdate(input: HTMLInputElement) {
|
||||||
if (input) {
|
if(input) {
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
const formattedDateTime = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}T${String(now.getHours()).padStart(2, "0")}:${String(now.getMinutes()).padStart(2, "0")}`;
|
const formattedDateTime = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}T${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`;
|
||||||
|
|
||||||
input.value = formattedDateTime;
|
input.value = formattedDateTime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ChoiceBoatEvent extends Event {
|
interface ChoiceBoatEvent extends Event{
|
||||||
detail: {
|
detail: {
|
||||||
value: string;
|
value: string;
|
||||||
label: string;
|
label: string,
|
||||||
customProperties: {
|
customProperties: {
|
||||||
amount_seats: number;
|
amount_seats: number,
|
||||||
owner: number;
|
owner: number,
|
||||||
default_destination: string;
|
default_destination: string,
|
||||||
boat_in_ottensheim: boolean;
|
boat_in_ottensheim: boolean,
|
||||||
};
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function selectBoatChange() {
|
function selectBoatChange() {
|
||||||
const boatSelect = <HTMLSelectElement>document.querySelector("#boat_id");
|
const boatSelect = <HTMLSelectElement>document.querySelector('#boat_id');
|
||||||
|
|
||||||
if (boatSelect) {
|
if(boatSelect) {
|
||||||
const boatChoice = new Choices(boatSelect, {
|
const boatChoice = new Choices(boatSelect, {
|
||||||
loadingText: "Wird geladen...",
|
loadingText: 'Wird geladen...',
|
||||||
noResultsText: "Keine Ergebnisse gefunden",
|
noResultsText: 'Keine Ergebnisse gefunden',
|
||||||
noChoicesText: "Keine Ergebnisse gefunden",
|
noChoicesText: 'Keine Ergebnisse gefunden',
|
||||||
itemSelectText: "Zum Auswählen klicken",
|
itemSelectText: 'Zum Auswählen klicken',
|
||||||
} as any);
|
} as any);
|
||||||
|
|
||||||
boatSelect.addEventListener(
|
boatSelect.addEventListener('addItem', function(e) {
|
||||||
"addItem",
|
|
||||||
function (e) {
|
|
||||||
const event = e as ChoiceBoatEvent;
|
const event = e as ChoiceBoatEvent;
|
||||||
boat_in_ottensheim = event.detail.customProperties.boat_in_ottensheim;
|
boat_in_ottensheim = event.detail.customProperties.boat_in_ottensheim;
|
||||||
|
|
||||||
const amount_seats = event.detail.customProperties.amount_seats;
|
const amount_seats = event.detail.customProperties.amount_seats;
|
||||||
setMaxAmountRowers("newrower", amount_seats);
|
setMaxAmountRowers("newrower", amount_seats);
|
||||||
|
|
||||||
const destination = <HTMLSelectElement>(
|
const destination = <HTMLSelectElement>document.querySelector('#destination');
|
||||||
document.querySelector("#destination")
|
|
||||||
);
|
|
||||||
destination.value = event.detail.customProperties.default_destination;
|
destination.value = event.detail.customProperties.default_destination;
|
||||||
|
|
||||||
if (event.detail.customProperties.owner) {
|
if (event.detail.customProperties.owner){
|
||||||
choiceObjects["newrower"].setChoiceByValue(
|
choiceObjects["newrower"].setChoiceByValue(event.detail.customProperties.owner+"");
|
||||||
event.detail.customProperties.owner + "",
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const inputElement = document.getElementById(
|
const inputElement = document.getElementById("departure") as HTMLInputElement;
|
||||||
"departure",
|
|
||||||
) as HTMLInputElement;
|
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
const formattedDateTime = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}T${String(now.getHours()).padStart(2, "0")}:${String(now.getMinutes()).padStart(2, "0")}`;
|
const formattedDateTime = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}T${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`;
|
||||||
|
|
||||||
inputElement.value = formattedDateTime;
|
inputElement.value = formattedDateTime;
|
||||||
|
|
||||||
const distinput = <HTMLInputElement>(
|
const distinput = <HTMLInputElement>document.querySelector('#distance_in_km');
|
||||||
document.querySelector("#distance_in_km")
|
|
||||||
);
|
|
||||||
distinput.value = "";
|
distinput.value = "";
|
||||||
|
|
||||||
const destinput = <HTMLInputElement>(
|
const destinput= <HTMLInputElement>document.querySelector('#destination');
|
||||||
document.querySelector("#destination")
|
destinput.dispatchEvent(new Event('input'));
|
||||||
);
|
},false);
|
||||||
destinput.dispatchEvent(new Event("input"));
|
|
||||||
},
|
|
||||||
false,
|
|
||||||
);
|
|
||||||
|
|
||||||
choiceObjects[boatSelect.id] = boatChoice;
|
choiceObjects[boatSelect.id] = boatChoice;
|
||||||
choiceObjects["boat_id"] = boatChoice;
|
choiceObjects["boat_id"] = boatChoice;
|
||||||
@ -178,14 +156,14 @@ function selectBoatChange() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function reloadPage() {
|
function reloadPage() {
|
||||||
if (!window.location.href.includes("ergo")) {
|
if (!window.location.href.includes("ergo")){
|
||||||
let pageTitle = document.title;
|
let pageTitle = document.title;
|
||||||
let attentionMessage = "Riemen- und Dollenbruch";
|
let attentionMessage = 'Riemen- und Dollenbruch';
|
||||||
|
|
||||||
document.addEventListener("visibilitychange", function () {
|
document.addEventListener('visibilitychange', function() {
|
||||||
let isPageActive = !document.hidden;
|
let isPageActive = !document.hidden;
|
||||||
|
|
||||||
if (!isPageActive) {
|
if(!isPageActive){
|
||||||
document.title = attentionMessage;
|
document.title = attentionMessage;
|
||||||
} else {
|
} else {
|
||||||
document.title = pageTitle;
|
document.title = pageTitle;
|
||||||
@ -196,7 +174,7 @@ function reloadPage() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function setMaxAmountRowers(name: string, rowers: number) {
|
function setMaxAmountRowers(name: string, rowers: number) {
|
||||||
if (choiceObjects[name]) {
|
if(choiceObjects[name]) {
|
||||||
choiceObjects[name].removeActiveItems(-1);
|
choiceObjects[name].removeActiveItems(-1);
|
||||||
//let curSelection = choiceObjects[name].getValue(true);
|
//let curSelection = choiceObjects[name].getValue(true);
|
||||||
//let amount_to_delete = (<any>curSelection).length - rowers;
|
//let amount_to_delete = (<any>curSelection).length - rowers;
|
||||||
@ -208,31 +186,19 @@ function setMaxAmountRowers(name: string, rowers: number) {
|
|||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
|
|
||||||
let input = <HTMLElement>document.querySelector("#" + name);
|
let input = <HTMLElement>document.querySelector('#'+name);
|
||||||
if (input) {
|
if(input) {
|
||||||
choiceObjects[name].config.maxItemCount = rowers;
|
choiceObjects[name].config.maxItemCount = rowers;
|
||||||
if (rowers === 0) {
|
if (rowers === 0) {
|
||||||
choiceObjects[name].disable();
|
choiceObjects[name].disable()
|
||||||
input.parentElement?.parentElement?.parentElement?.classList.add(
|
input.parentElement?.parentElement?.parentElement?.classList.add('hidden');
|
||||||
"hidden",
|
input.parentElement?.parentElement?.parentElement?.classList.add('md:block');
|
||||||
);
|
input.parentElement?.parentElement?.parentElement?.classList.add('opacity-50');
|
||||||
input.parentElement?.parentElement?.parentElement?.classList.add(
|
} else{
|
||||||
"md:block",
|
|
||||||
);
|
|
||||||
input.parentElement?.parentElement?.parentElement?.classList.add(
|
|
||||||
"opacity-50",
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
choiceObjects[name].enable();
|
choiceObjects[name].enable();
|
||||||
input.parentElement?.parentElement?.parentElement?.classList.remove(
|
input.parentElement?.parentElement?.parentElement?.classList.remove('hidden');
|
||||||
"hidden",
|
input.parentElement?.parentElement?.parentElement?.classList.remove('md:block');
|
||||||
);
|
input.parentElement?.parentElement?.parentElement?.classList.remove('opacity-50');
|
||||||
input.parentElement?.parentElement?.parentElement?.classList.remove(
|
|
||||||
"md:block",
|
|
||||||
);
|
|
||||||
input.parentElement?.parentElement?.parentElement?.classList.remove(
|
|
||||||
"opacity-50",
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -252,46 +218,40 @@ function setMaxAmountRowers(name: string, rowers: number) {
|
|||||||
// only_steering.parentElement?.parentElement?.parentElement?.classList.add('opacity-50');
|
// only_steering.parentElement?.parentElement?.parentElement?.classList.add('opacity-50');
|
||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
let shipmaster = <HTMLElement>(
|
let shipmaster = <HTMLElement>document.querySelector('#shipmaster-'+name+'js');
|
||||||
document.querySelector("#shipmaster-" + name + "js")
|
let steering_person = <HTMLElement>document.querySelector('#steering_person-'+name+'js');
|
||||||
);
|
if (rowers == 1){
|
||||||
let steering_person = <HTMLElement>(
|
|
||||||
document.querySelector("#steering_person-" + name + "js")
|
|
||||||
);
|
|
||||||
if (rowers == 1) {
|
|
||||||
if (shipmaster.parentNode) {
|
if (shipmaster.parentNode) {
|
||||||
(<HTMLElement>shipmaster.parentNode).classList.add("hidden");
|
(<HTMLElement>shipmaster.parentNode).classList.add('hidden');
|
||||||
}
|
}
|
||||||
shipmaster.removeAttribute("required");
|
shipmaster.removeAttribute('required');
|
||||||
|
|
||||||
if (steering_person.parentNode) {
|
if (steering_person.parentNode){
|
||||||
(<HTMLElement>steering_person.parentNode).classList.add("hidden");
|
(<HTMLElement>steering_person.parentNode).classList.add('hidden');
|
||||||
}
|
}
|
||||||
steering_person.removeAttribute("required");
|
steering_person.removeAttribute('required');
|
||||||
} else {
|
}else{
|
||||||
if (shipmaster.parentNode) {
|
if (shipmaster.parentNode){
|
||||||
(<HTMLElement>shipmaster.parentNode).classList.remove("hidden");
|
(<HTMLElement>shipmaster.parentNode).classList.remove('hidden');
|
||||||
}
|
}
|
||||||
shipmaster.setAttribute("required", "required");
|
shipmaster.setAttribute('required', 'required');
|
||||||
|
|
||||||
if (steering_person.parentNode) {
|
if (steering_person.parentNode){
|
||||||
(<HTMLElement>steering_person.parentNode).classList.remove("hidden");
|
(<HTMLElement>steering_person.parentNode).classList.remove('hidden');
|
||||||
}
|
}
|
||||||
steering_person.setAttribute("required", "required");
|
steering_person.setAttribute('required', 'required');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function initBoatActions() {
|
function initBoatActions() {
|
||||||
const boatSelects = document.querySelectorAll(
|
const boatSelects = document.querySelectorAll('.boats-js[data-onclick="true"]');
|
||||||
'.boats-js[data-onclick="true"]',
|
if(boatSelects) {
|
||||||
);
|
|
||||||
if (boatSelects) {
|
|
||||||
Array.prototype.forEach.call(boatSelects, (select: HTMLInputElement) => {
|
Array.prototype.forEach.call(boatSelects, (select: HTMLInputElement) => {
|
||||||
select.addEventListener("click", function () {
|
select.addEventListener('click', function() {
|
||||||
if (select.dataset.seats) {
|
if(select.dataset.seats) {
|
||||||
if (select.dataset.id) {
|
if (select.dataset.id) {
|
||||||
choiceObjects["boat_id"].setChoiceByValue(select.dataset.id);
|
choiceObjects['boat_id'].setChoiceByValue(select.dataset.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
window.scrollTo(0, 0);
|
window.scrollTo(0, 0);
|
||||||
@ -303,23 +263,23 @@ function initBoatActions() {
|
|||||||
|
|
||||||
function initChoices() {
|
function initChoices() {
|
||||||
const selects = document.querySelectorAll('select[data-init="true"]');
|
const selects = document.querySelectorAll('select[data-init="true"]');
|
||||||
if (selects) {
|
if(selects) {
|
||||||
Array.prototype.forEach.call(selects, (select: HTMLInputElement) => {
|
Array.prototype.forEach.call(selects, (select: HTMLInputElement) => {
|
||||||
initNewChoice(select);
|
initNewChoice(select);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ChoiceEvent extends Event {
|
interface ChoiceEvent extends Event{
|
||||||
detail: {
|
detail: {
|
||||||
value: string;
|
value: string;
|
||||||
label: string;
|
label: string,
|
||||||
customProperties: {
|
customProperties: {
|
||||||
is_cox: boolean;
|
is_cox: boolean,
|
||||||
steers: boolean;
|
steers: boolean,
|
||||||
cox_on_boat: boolean;
|
cox_on_boat: boolean,
|
||||||
is_racing: boolean;
|
is_racing: boolean,
|
||||||
};
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -329,237 +289,198 @@ function initNewChoice(select: HTMLInputElement) {
|
|||||||
seats = +select.dataset.seats;
|
seats = +select.dataset.seats;
|
||||||
}
|
}
|
||||||
|
|
||||||
let shipmaster = <HTMLElement>(
|
let shipmaster = <HTMLElement>document.querySelector('#shipmaster-'+select.id+'js');
|
||||||
document.querySelector("#shipmaster-" + select.id + "js")
|
let steering_person = <HTMLElement>document.querySelector('#steering_person-'+select.id+'js');
|
||||||
);
|
if (seats == 1){
|
||||||
let steering_person = <HTMLElement>(
|
|
||||||
document.querySelector("#steering_person-" + select.id + "js")
|
|
||||||
);
|
|
||||||
if (seats == 1) {
|
|
||||||
if (shipmaster.parentNode) {
|
if (shipmaster.parentNode) {
|
||||||
(<HTMLElement>shipmaster.parentNode).classList.add("hidden");
|
(<HTMLElement>shipmaster.parentNode).classList.add('hidden');
|
||||||
}
|
}
|
||||||
shipmaster.removeAttribute("required");
|
shipmaster.removeAttribute('required');
|
||||||
|
|
||||||
if (steering_person.parentNode) {
|
if (steering_person.parentNode){
|
||||||
(<HTMLElement>steering_person.parentNode).classList.add("hidden");
|
(<HTMLElement>steering_person.parentNode).classList.add('hidden');
|
||||||
}
|
}
|
||||||
steering_person.removeAttribute("required");
|
steering_person.removeAttribute('required');
|
||||||
} else {
|
}else{
|
||||||
if (shipmaster.parentNode) {
|
if (shipmaster.parentNode){
|
||||||
(<HTMLElement>shipmaster.parentNode).classList.remove("hidden");
|
(<HTMLElement>shipmaster.parentNode).classList.remove('hidden');
|
||||||
}
|
}
|
||||||
shipmaster.setAttribute("required", "required");
|
shipmaster.setAttribute('required', 'required');
|
||||||
|
|
||||||
if (steering_person.parentNode) {
|
if (steering_person.parentNode){
|
||||||
(<HTMLElement>steering_person.parentNode).classList.remove("hidden");
|
(<HTMLElement>steering_person.parentNode).classList.remove('hidden');
|
||||||
}
|
}
|
||||||
steering_person.setAttribute("required", "required");
|
steering_person.setAttribute('required', 'required');
|
||||||
}
|
}
|
||||||
const choice = new Choices(select, {
|
const choice = new Choices(select, {
|
||||||
removeItemButton: true,
|
removeItemButton: true,
|
||||||
loadingText: "Wird geladen...",
|
loadingText: 'Wird geladen...',
|
||||||
noResultsText: "Keine Ergebnisse gefunden",
|
noResultsText: 'Keine Ergebnisse gefunden',
|
||||||
noChoicesText: "Keine Ergebnisse gefunden",
|
noChoicesText: 'Keine Ergebnisse gefunden',
|
||||||
itemSelectText: "Zum Auswählen klicken",
|
itemSelectText: 'Zum Auswählen klicken',
|
||||||
placeholderValue: "Ruderer auswählen",
|
placeholderValue: 'Ruderer auswählen',
|
||||||
maxItemCount: seats,
|
maxItemCount: seats,
|
||||||
maxItemText: (maxItemCount) => {
|
maxItemText: (maxItemCount) => {
|
||||||
return `Nur ${maxItemCount} Ruderer können hinzugefügt werden`;
|
return `Nur ${maxItemCount} Ruderer können hinzugefügt werden`;
|
||||||
},
|
},
|
||||||
callbackOnInit: function () {
|
callbackOnInit: function() {
|
||||||
this._currentState.items.forEach(function (obj) {
|
this._currentState.items.forEach(function(obj){
|
||||||
if (boat_in_ottensheim && obj.customProperties) {
|
if (boat_in_ottensheim && obj.customProperties) {
|
||||||
if (obj.customProperties.is_racing) {
|
if (obj.customProperties.is_racing) {
|
||||||
const coxSelect = <HTMLSelectElement>(
|
const coxSelect = <HTMLSelectElement>document.querySelector('#shipmaster-' + select.id + 'js');
|
||||||
document.querySelector("#shipmaster-" + select.id + "js")
|
|
||||||
);
|
|
||||||
var new_option = new Option(obj.label, obj.value);
|
var new_option = new Option(obj.label, obj.value);
|
||||||
if (obj.customProperties.cox_on_boat) {
|
if (obj.customProperties.cox_on_boat){
|
||||||
new_option.selected = true;
|
new_option.selected = true;
|
||||||
}
|
}
|
||||||
coxSelect.add(new_option);
|
coxSelect.add(new_option);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (obj.customProperties && obj.customProperties.is_cox) {
|
if (obj.customProperties && obj.customProperties.is_cox){
|
||||||
const coxSelect = <HTMLSelectElement>(
|
const coxSelect = <HTMLSelectElement>document.querySelector('#shipmaster-' + select.id + 'js');
|
||||||
document.querySelector("#shipmaster-" + select.id + "js")
|
|
||||||
);
|
|
||||||
var new_option = new Option(obj.label, obj.value);
|
var new_option = new Option(obj.label, obj.value);
|
||||||
if (obj.customProperties.cox_on_boat) {
|
if (obj.customProperties.cox_on_boat){
|
||||||
new_option.selected = true;
|
new_option.selected = true;
|
||||||
}
|
}
|
||||||
coxSelect.add(new_option);
|
coxSelect.add(new_option);
|
||||||
}
|
}
|
||||||
const steeringSelect = <HTMLSelectElement>(
|
const steeringSelect = <HTMLSelectElement>document.querySelector('#steering_person-' + select.id + 'js');
|
||||||
document.querySelector("#steering_person-" + select.id + "js")
|
|
||||||
);
|
|
||||||
if (steeringSelect) {
|
if (steeringSelect) {
|
||||||
var new_option = new Option(obj.label, obj.value);
|
var new_option = new Option(obj.label, obj.value);
|
||||||
if (obj.customProperties && obj.customProperties.steers) {
|
if (obj.customProperties && obj.customProperties.steers){
|
||||||
new_option.selected = true;
|
new_option.selected = true;
|
||||||
}
|
}
|
||||||
steeringSelect.add(new_option);
|
steeringSelect.add(new_option);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
choiceObjects[select.id] = choice;
|
choiceObjects[select.id] = choice;
|
||||||
|
|
||||||
select.addEventListener(
|
select.addEventListener('addItem', function(e) {
|
||||||
"addItem",
|
|
||||||
function (e) {
|
|
||||||
const event = e as ChoiceEvent;
|
const event = e as ChoiceEvent;
|
||||||
const user_id = event.detail.value;
|
const user_id = event.detail.value;
|
||||||
const name = event.detail.label;
|
const name = event.detail.label;
|
||||||
|
|
||||||
if (boat_in_ottensheim && event.detail.customProperties.is_racing) {
|
if (boat_in_ottensheim && event.detail.customProperties.is_racing) {
|
||||||
if (event.detail.customProperties.is_racing) {
|
if (event.detail.customProperties.is_racing) {
|
||||||
const coxSelect = <HTMLSelectElement>(
|
const coxSelect = <HTMLSelectElement>document.querySelector('#shipmaster-' + select.id + 'js');
|
||||||
document.querySelector("#shipmaster-" + select.id + "js")
|
if (coxSelect){
|
||||||
);
|
|
||||||
if (coxSelect) {
|
|
||||||
coxSelect.add(new Option(name, user_id));
|
coxSelect.add(new Option(name, user_id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (event.detail.customProperties.is_cox) {
|
if (event.detail.customProperties.is_cox) {
|
||||||
const coxSelect = <HTMLSelectElement>(
|
const coxSelect = <HTMLSelectElement>document.querySelector('#shipmaster-' + select.id + 'js');
|
||||||
document.querySelector("#shipmaster-" + select.id + "js")
|
if (coxSelect){
|
||||||
);
|
|
||||||
if (coxSelect) {
|
|
||||||
coxSelect.add(new Option(name, user_id));
|
coxSelect.add(new Option(name, user_id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const steeringSelect = <HTMLSelectElement>(
|
const steeringSelect = <HTMLSelectElement>document.querySelector('#steering_person-' + select.id + 'js');
|
||||||
document.querySelector("#steering_person-" + select.id + "js")
|
|
||||||
);
|
|
||||||
if (steeringSelect) {
|
if (steeringSelect) {
|
||||||
steeringSelect.add(new Option(name, user_id));
|
steeringSelect.add(new Option(name, user_id));
|
||||||
}
|
}
|
||||||
},
|
},false);
|
||||||
false,
|
|
||||||
);
|
|
||||||
|
|
||||||
select.addEventListener(
|
select.addEventListener('removeItem', function(e) {
|
||||||
"removeItem",
|
|
||||||
function (e) {
|
|
||||||
const event = e as ChoiceEvent;
|
const event = e as ChoiceEvent;
|
||||||
|
|
||||||
const user_id = event.detail.value;
|
const user_id = event.detail.value;
|
||||||
|
|
||||||
const coxSelect = <HTMLSelectElement>(
|
const coxSelect = <HTMLSelectElement>document.querySelector('#shipmaster-' + select.id + 'js');
|
||||||
document.querySelector("#shipmaster-" + select.id + "js")
|
|
||||||
);
|
|
||||||
if (coxSelect) {
|
if (coxSelect) {
|
||||||
for (var i = 0; i < coxSelect.length; i++) {
|
for (var i=0; i<coxSelect.length; i++) {
|
||||||
if (coxSelect.options[i].value == user_id) coxSelect.remove(i);
|
if (coxSelect.options[i].value == user_id)
|
||||||
|
coxSelect.remove(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const steeringSelect = <HTMLSelectElement>(
|
const steeringSelect = <HTMLSelectElement>document.querySelector('#steering_person-' + select.id + 'js');
|
||||||
document.querySelector("#steering_person-" + select.id + "js")
|
|
||||||
);
|
|
||||||
if (steeringSelect) {
|
if (steeringSelect) {
|
||||||
for (var i = 0; i < steeringSelect.length; i++) {
|
for (var i=0; i<steeringSelect.length; i++) {
|
||||||
if (steeringSelect.options[i].value == user_id)
|
if (steeringSelect.options[i].value == user_id)
|
||||||
steeringSelect.remove(i);
|
steeringSelect.remove(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},false);
|
||||||
false,
|
|
||||||
);
|
|
||||||
|
|
||||||
choiceObjects[select.id] = choice;
|
choiceObjects[select.id] = choice;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function initToggle() {
|
function initToggle() {
|
||||||
// get filter btns & set object sessionStorage
|
// get filter btns & set object sessionStorage
|
||||||
const btns = <NodeListOf<HTMLButtonElement>>(
|
const btns = <NodeListOf<HTMLButtonElement>>document.querySelectorAll('.filter-trips-js');
|
||||||
document.querySelectorAll(".filter-trips-js")
|
|
||||||
);
|
|
||||||
let filterObject = new Map();
|
let filterObject = new Map();
|
||||||
|
|
||||||
if (btns) {
|
if(btns) {
|
||||||
Array.prototype.forEach.call(btns, (btn: HTMLButtonElement) => {
|
Array.prototype.forEach.call(btns, (btn: HTMLButtonElement) => {
|
||||||
filterObject.set(btn.dataset.action, btn.ariaPressed);
|
filterObject.set(btn.dataset.action, btn.ariaPressed);
|
||||||
|
|
||||||
btn.addEventListener("click", () => {
|
btn.addEventListener('click', () => {
|
||||||
let filter = sessionStorage.getItem("tripsFilter");
|
let filter = sessionStorage.getItem('tripsFilter');
|
||||||
if (filter) {
|
if(filter) {
|
||||||
let filterMap = new Map(JSON.parse(filter));
|
let filterMap = new Map(JSON.parse(filter));
|
||||||
for (let entry of filterMap.entries()) {
|
for (let entry of filterMap.entries()) {
|
||||||
if (entry[0] === btn.dataset.action && entry[1] !== "true") {
|
if(entry[0] === btn.dataset.action && entry[1] !== 'true') {
|
||||||
filterMap.set(entry[0], "true");
|
filterMap.set(entry[0],'true');
|
||||||
} else {
|
} else {
|
||||||
filterMap.set(entry[0], "false");
|
filterMap.set(entry[0],'false');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sessionStorage.setItem(
|
sessionStorage.setItem('tripsFilter', JSON.stringify( Array.from(filterMap.entries())));
|
||||||
"tripsFilter",
|
|
||||||
JSON.stringify(Array.from(filterMap.entries())),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
resetFilteredElements();
|
resetFilteredElements();
|
||||||
if (btn.getAttribute("aria-pressed") === "false") {
|
if(btn.getAttribute('aria-pressed') === 'false'){
|
||||||
Array.prototype.forEach.call(btns, (b: HTMLButtonElement) => {
|
Array.prototype.forEach.call(btns, (b: HTMLButtonElement) => {
|
||||||
b.setAttribute("aria-pressed", "false");
|
b.setAttribute('aria-pressed', 'false');
|
||||||
});
|
});
|
||||||
triggerFilterAction(btn.dataset.action);
|
triggerFilterAction(btn.dataset.action);
|
||||||
} else {
|
} else {
|
||||||
btn.setAttribute("aria-pressed", "false");
|
btn.setAttribute('aria-pressed', 'false');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
let filter = sessionStorage.getItem("tripsFilter");
|
let filter = sessionStorage.getItem('tripsFilter');
|
||||||
if (filter) {
|
if(filter) {
|
||||||
let filterMap = new Map(JSON.parse(filter));
|
let filterMap = new Map(JSON.parse(filter));
|
||||||
for (let entry of filterMap.entries()) {
|
for (let entry of filterMap.entries()) {
|
||||||
if (entry[1] === "true") {
|
if(entry[1] === 'true') {
|
||||||
triggerFilterAction(entry[0]);
|
triggerFilterAction(entry[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
sessionStorage.setItem(
|
sessionStorage.setItem('tripsFilter', JSON.stringify( Array.from(filterObject.entries())));
|
||||||
"tripsFilter",
|
|
||||||
JSON.stringify(Array.from(filterObject.entries())),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function resetFilteredElements() {
|
function resetFilteredElements() {
|
||||||
const hiddenElements = document.querySelectorAll(".reset-js.hidden");
|
const hiddenElements = document.querySelectorAll('.reset-js.hidden');
|
||||||
if (hiddenElements) {
|
if(hiddenElements) {
|
||||||
Array.prototype.forEach.call(
|
Array.prototype.forEach.call(hiddenElements, (hiddenElement: HTMLButtonElement) => {
|
||||||
hiddenElements,
|
hiddenElement.classList.remove('hidden');
|
||||||
(hiddenElement: HTMLButtonElement) => {
|
});
|
||||||
hiddenElement.classList.remove("hidden");
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function triggerFilterAction(activeFilter: any) {
|
function triggerFilterAction(activeFilter: any) {
|
||||||
const activeBtn = document.querySelector(
|
const activeBtn = document.querySelector('button[data-action="' + activeFilter + '"]');
|
||||||
'button[data-action="' + activeFilter + '"]',
|
if(activeBtn) {
|
||||||
);
|
activeBtn.setAttribute('aria-pressed', 'true');
|
||||||
if (activeBtn) {
|
|
||||||
activeBtn.setAttribute("aria-pressed", "true");
|
|
||||||
|
|
||||||
filterAction(activeFilter);
|
filterAction(activeFilter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function filterAction(activeFilter: string) {
|
function filterAction(activeFilter: string) {
|
||||||
switch (activeFilter) {
|
switch(activeFilter) {
|
||||||
case "filter-days": {
|
case 'filter-days': {
|
||||||
filterDays();
|
filterDays();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "filter-coxs": {
|
case 'filter-coxs': {
|
||||||
filterCoxs();
|
filterCoxs();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -569,24 +490,24 @@ function filterAction(activeFilter: string) {
|
|||||||
function filterDays() {
|
function filterDays() {
|
||||||
const daysNoTrips = document.querySelectorAll('div[data-trips="0"]');
|
const daysNoTrips = document.querySelectorAll('div[data-trips="0"]');
|
||||||
Array.prototype.forEach.call(daysNoTrips, (day: HTMLElement) => {
|
Array.prototype.forEach.call(daysNoTrips, (day: HTMLElement) => {
|
||||||
day.classList.toggle("hidden");
|
day.classList.toggle('hidden');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function filterCoxs() {
|
function filterCoxs() {
|
||||||
const noCoxNeeded = document.querySelectorAll('div[data-coxneeded="false"]');
|
const noCoxNeeded = document.querySelectorAll('div[data-coxneeded="false"]');
|
||||||
Array.prototype.forEach.call(noCoxNeeded, (notNeeded: HTMLElement) => {
|
Array.prototype.forEach.call(noCoxNeeded, (notNeeded: HTMLElement) => {
|
||||||
notNeeded.classList.toggle("hidden");
|
notNeeded.classList.toggle('hidden');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function initSearch() {
|
function initSearch() {
|
||||||
const input = <HTMLInputElement>document.querySelector("#filter-js");
|
const input = <HTMLInputElement>document.querySelector('#filter-js');
|
||||||
|
|
||||||
if (input) {
|
if(input) {
|
||||||
filterElements(input.value);
|
filterElements(input.value);
|
||||||
|
|
||||||
input.addEventListener("input", () => {
|
input.addEventListener('input', () => {
|
||||||
filterElements(input.value);
|
filterElements(input.value);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -594,7 +515,7 @@ function initSearch() {
|
|||||||
|
|
||||||
function filterElements(input: string) {
|
function filterElements(input: string) {
|
||||||
const elements = document.querySelectorAll('div[data-filterable="true"]');
|
const elements = document.querySelectorAll('div[data-filterable="true"]');
|
||||||
let resultWrapper = <HTMLElement>document.querySelector("#filter-result-js"),
|
let resultWrapper = <HTMLElement>document.querySelector('#filter-result-js'),
|
||||||
amountShownElements = 0;
|
amountShownElements = 0;
|
||||||
|
|
||||||
Array.prototype.forEach.call(elements, (element: HTMLElement) => {
|
Array.prototype.forEach.call(elements, (element: HTMLElement) => {
|
||||||
@ -602,151 +523,121 @@ function filterElements(input: string) {
|
|||||||
let filterString = element.dataset.filter?.toLocaleLowerCase();
|
let filterString = element.dataset.filter?.toLocaleLowerCase();
|
||||||
|
|
||||||
// bulk hide all elements
|
// bulk hide all elements
|
||||||
element.style.display = "none";
|
element.style.display = 'none';
|
||||||
|
|
||||||
// show if input matches
|
// show if input matches
|
||||||
if (filterString?.includes(input.toLocaleLowerCase())) {
|
if(filterString?.includes(input.toLocaleLowerCase())) {
|
||||||
element.style.display = "flex";
|
element.style.display = 'flex';
|
||||||
amountShownElements++;
|
amountShownElements ++;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (resultWrapper) {
|
if(resultWrapper) {
|
||||||
resultWrapper.innerHTML =
|
resultWrapper.innerHTML = (amountShownElements === 0 ? 'Kein Ergebnis gefunden' : '<strong>' + amountShownElements + '</strong>' + (amountShownElements > 1 ? ' Ergebnisse' : ' Ergebnis') + ' gefunden');
|
||||||
amountShownElements === 0
|
|
||||||
? "Kein Ergebnis gefunden"
|
|
||||||
: "<strong>" +
|
|
||||||
amountShownElements +
|
|
||||||
"</strong>" +
|
|
||||||
(amountShownElements > 1 ? " Ergebnisse" : " Ergebnis") +
|
|
||||||
" gefunden";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function initSidebar() {
|
function initSidebar() {
|
||||||
const sidebarTrigger = <NodeListOf<HTMLElement>>(
|
const sidebarTrigger = <NodeListOf<HTMLElement>>document.querySelectorAll('[data-trigger]');
|
||||||
document.querySelectorAll("[data-trigger]")
|
|
||||||
);
|
|
||||||
|
|
||||||
if (sidebarTrigger) {
|
if(sidebarTrigger) {
|
||||||
Array.prototype.forEach.call(
|
Array.prototype.forEach.call(sidebarTrigger, (triggerElement: HTMLElement) => {
|
||||||
sidebarTrigger,
|
if(triggerElement.dataset.trigger) {
|
||||||
(triggerElement: HTMLElement) => {
|
|
||||||
if (triggerElement.dataset.trigger) {
|
|
||||||
const sidebar = new Sidebar(triggerElement.dataset.trigger);
|
const sidebar = new Sidebar(triggerElement.dataset.trigger);
|
||||||
|
|
||||||
triggerElement.addEventListener("click", (e) => {
|
triggerElement.addEventListener('click', (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
if (triggerElement.dataset.trigger === "sidebar") {
|
if(triggerElement.dataset.trigger === 'sidebar') {
|
||||||
initTripSidebar(triggerElement);
|
initTripSidebar(triggerElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
sidebar.toggle();
|
sidebar.toggle();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
});
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function initTripSidebar(triggerElement: HTMLElement) {
|
function initTripSidebar(triggerElement: HTMLElement) {
|
||||||
const sidebarElement = <HTMLElement>document.querySelector("#sidebar");
|
const sidebarElement = <HTMLElement>document.querySelector('#sidebar');
|
||||||
if (
|
if(sidebarElement && triggerElement.dataset.body && triggerElement.dataset.header) {
|
||||||
sidebarElement &&
|
|
||||||
triggerElement.dataset.body &&
|
|
||||||
triggerElement.dataset.header
|
|
||||||
) {
|
|
||||||
let body = <HTMLElement>document.querySelector(triggerElement.dataset.body);
|
let body = <HTMLElement>document.querySelector(triggerElement.dataset.body);
|
||||||
let bodyElement = <HTMLElement>body.cloneNode(true);
|
let bodyElement = <HTMLElement>body.cloneNode(true);
|
||||||
let bodyContainerElement = <HTMLElement>(
|
let bodyContainerElement = <HTMLElement>sidebarElement.querySelector('.body-js');
|
||||||
sidebarElement.querySelector(".body-js")
|
|
||||||
);
|
|
||||||
|
|
||||||
/* Quickfix duplicate ids checkboxes */
|
/* Quickfix duplicate ids checkboxes */
|
||||||
const checkboxes = <NodeListOf<HTMLElement>>(
|
const checkboxes = <NodeListOf<HTMLElement>>bodyElement.querySelectorAll('input[type="checkbox"]');
|
||||||
bodyElement.querySelectorAll('input[type="checkbox"]')
|
|
||||||
);
|
|
||||||
|
|
||||||
Array.prototype.forEach.call(checkboxes, (checkbox: HTMLElement) => {
|
Array.prototype.forEach.call(checkboxes, (checkbox: HTMLElement) => {
|
||||||
if (checkbox) {
|
if(checkbox) {
|
||||||
checkbox.parentElement?.setAttribute("for", checkbox.id + "js");
|
checkbox.parentElement?.setAttribute('for', checkbox.id + 'js');
|
||||||
checkbox.id += "js";
|
checkbox.id += 'js';
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const prefixedContent = <NodeListOf<HTMLElement>>(
|
const prefixedContent = <NodeListOf<HTMLElement>>bodyElement.querySelectorAll('.change-id-js');
|
||||||
bodyElement.querySelectorAll(".change-id-js")
|
|
||||||
);
|
|
||||||
Array.prototype.forEach.call(prefixedContent, (content: HTMLElement) => {
|
Array.prototype.forEach.call(prefixedContent, (content: HTMLElement) => {
|
||||||
if (content) {
|
if(content) {
|
||||||
content.id += "js";
|
content.id += 'js';
|
||||||
|
|
||||||
if (content.dataset.relation) {
|
if(content.dataset.relation){
|
||||||
content.dataset.relation += "js";
|
content.dataset.relation += 'js';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (bodyContainerElement) {
|
|
||||||
bodyContainerElement.innerHTML = "";
|
if(bodyContainerElement) {
|
||||||
|
bodyContainerElement.innerHTML = '';
|
||||||
bodyContainerElement.append(bodyElement);
|
bodyContainerElement.append(bodyElement);
|
||||||
|
|
||||||
addRelationMagic(bodyElement);
|
addRelationMagic(bodyElement);
|
||||||
}
|
}
|
||||||
if (triggerElement.dataset.day) {
|
if(triggerElement.dataset.day) {
|
||||||
let hiddenElement = <HTMLInputElement>(
|
let hiddenElement = <HTMLInputElement>bodyElement.querySelector('.day-js');
|
||||||
bodyElement.querySelector(".day-js")
|
if(hiddenElement) {
|
||||||
);
|
|
||||||
if (hiddenElement) {
|
|
||||||
hiddenElement.value = triggerElement.dataset.day;
|
hiddenElement.value = triggerElement.dataset.day;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let headerElement = sidebarElement.querySelector(".header-js");
|
let headerElement = sidebarElement.querySelector('.header-js');
|
||||||
if (headerElement) {
|
if(headerElement) {
|
||||||
headerElement.innerHTML = triggerElement.dataset.header;
|
headerElement.innerHTML = triggerElement.dataset.header;
|
||||||
}
|
}
|
||||||
const selects = bodyElement.querySelectorAll("select[multiple]");
|
const selects = bodyElement.querySelectorAll('select[multiple]');
|
||||||
if (selects) {
|
if(selects) {
|
||||||
Array.prototype.forEach.call(selects, (select: HTMLInputElement) => {
|
Array.prototype.forEach.call(selects, (select: HTMLInputElement) => {
|
||||||
initNewChoice(select);
|
initNewChoice(select);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const defaultDateTimes = <NodeListOf<HTMLInputElement>>(
|
const defaultDateTimes = <NodeListOf<HTMLInputElement>>document.querySelectorAll('.current-date-time');
|
||||||
document.querySelectorAll(".current-date-time")
|
|
||||||
);
|
|
||||||
defaultDateTimes.forEach((defaultDateTime) => {
|
defaultDateTimes.forEach((defaultDateTime) => {
|
||||||
setCurrentdate(defaultDateTime);
|
setCurrentdate(defaultDateTime);
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function addRelationMagic(bodyElement: HTMLElement) {
|
function addRelationMagic(bodyElement: HTMLElement) {
|
||||||
const fields = bodyElement.querySelectorAll(".set-distance-js");
|
const fields = bodyElement.querySelectorAll('.set-distance-js');
|
||||||
|
|
||||||
if (fields) {
|
if(fields) {
|
||||||
Array.prototype.forEach.call(fields, (field: HTMLInputElement) => {
|
Array.prototype.forEach.call(fields, (field: HTMLInputElement) => {
|
||||||
if (field.dataset.relation) {
|
if(field.dataset.relation){
|
||||||
const relatedField = <HTMLInputElement>(
|
const relatedField = <HTMLInputElement>bodyElement.querySelector('#' + field.dataset.relation);
|
||||||
bodyElement.querySelector("#" + field.dataset.relation)
|
if(relatedField) {
|
||||||
);
|
field.addEventListener('input', (e) => {
|
||||||
if (relatedField) {
|
|
||||||
field.addEventListener("input", (e) => {
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const dataList = <HTMLDataListElement>(
|
const dataList = <HTMLDataListElement>document.querySelector('#destinations');
|
||||||
document.querySelector("#destinations")
|
if(dataList) {
|
||||||
);
|
var option = Array.prototype.find.call(dataList.options, function(option) {
|
||||||
if (dataList) {
|
|
||||||
var option = Array.prototype.find.call(
|
|
||||||
dataList.options,
|
|
||||||
function (option) {
|
|
||||||
return option.value === field.value;
|
return option.value === field.value;
|
||||||
},
|
});
|
||||||
);
|
|
||||||
|
|
||||||
// Get distance
|
// Get distance
|
||||||
const distance = option.getAttribute("distance");
|
const distance = option.getAttribute('distance');
|
||||||
if (distance) relatedField.value = distance;
|
if(distance) relatedField.value = distance;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -756,8 +647,8 @@ function addRelationMagic(bodyElement: HTMLElement) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function replaceStrings() {
|
function replaceStrings() {
|
||||||
const weekdays = document.querySelectorAll(".weekday-js");
|
const weekdays = document.querySelectorAll('.weekday-js');
|
||||||
Array.prototype.forEach.call(weekdays, (weekday: HTMLElement) => {
|
Array.prototype.forEach.call(weekdays, (weekday: HTMLElement) => {
|
||||||
weekday.innerHTML = weekday.innerHTML.replace("Freitag", "Markttag");
|
weekday.innerHTML = weekday.innerHTML.replace('Freitag', 'Markttag');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1,144 +1,114 @@
|
|||||||
import { test, expect, Page } from "@playwright/test";
|
import { test, expect, Page } from '@playwright/test';
|
||||||
|
|
||||||
test("cox can create and delete trip", async ({ page }) => {
|
test('cox can create and delete trip', async ({ page }) => {
|
||||||
await page.goto("http://localhost:8000/auth");
|
await page.goto('http://localhost:8000/auth');
|
||||||
await page.getByPlaceholder("Name").click();
|
await page.getByPlaceholder('Name').click();
|
||||||
await page.getByPlaceholder("Name").fill("cox");
|
await page.getByPlaceholder('Name').fill('cox');
|
||||||
await page.getByPlaceholder("Name").press("Tab");
|
await page.getByPlaceholder('Name').press('Tab');
|
||||||
await page.getByPlaceholder("Passwort").fill("cox");
|
await page.getByPlaceholder('Passwort').fill('cox');
|
||||||
await page.getByPlaceholder("Passwort").press("Enter");
|
await page.getByPlaceholder('Passwort').press('Enter');
|
||||||
await page.getByRole("link", { name: "Geplante Ausfahrten" }).click();
|
await page.getByRole('link', { name: 'Geplante Ausfahrten' }).click();
|
||||||
await page.locator(".relative").first().click();
|
await page.locator('.relative').first().click();
|
||||||
await page.locator("#sidebar #planned_starting_time").click();
|
await page.locator('#sidebar #planned_starting_time').click();
|
||||||
await page.locator("#sidebar #planned_starting_time").fill("18:00");
|
await page.locator('#sidebar #planned_starting_time').fill('18:00');
|
||||||
await page.locator("#sidebar #planned_starting_time").press("Tab");
|
await page.locator('#sidebar #planned_starting_time').press('Tab');
|
||||||
await page.locator("#sidebar #planned_starting_time").press("Tab");
|
await page.locator('#sidebar #planned_starting_time').press('Tab');
|
||||||
await page.getByRole("spinbutton").fill("5");
|
await page.getByRole('spinbutton').fill('5');
|
||||||
await page.getByRole("button", { name: "Erstellen", exact: true }).click();
|
await page.getByRole('button', { name: 'Erstellen', exact: true }).click();
|
||||||
await expect(page.locator("body")).toContainText("18:00 Uhr (cox) Details");
|
await expect(page.locator('body')).toContainText('18:00 Uhr (cox) Details');
|
||||||
|
|
||||||
await page.goto("http://localhost:8000/planned");
|
await page.goto('http://localhost:8000/planned');
|
||||||
await page.getByRole("link", { name: "Details" }).click();
|
await page.getByRole('link', { name: 'Details' }).click();
|
||||||
await page.getByRole("link", { name: "Termin löschen" }).click();
|
await page.getByRole('link', { name: 'Termin löschen' }).click();
|
||||||
await expect(page.locator("body")).toContainText("Erfolgreich gelöscht!");
|
await expect(page.locator('body')).toContainText('Erfolgreich gelöscht!');
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO: group -> cox can create trips
|
// TODO: group -> cox can create trips
|
||||||
// TODO: cox can help/register at trips/events
|
// TODO: cox can help/register at trips/events
|
||||||
|
|
||||||
test.describe("cox can edit trips", () => {
|
test.describe('cox can edit trips', () => {
|
||||||
let sharedPage: Page;
|
let sharedPage: Page;
|
||||||
|
|
||||||
test.beforeEach(async ({ browser }) => {
|
test.beforeEach(async ({ browser }) => {
|
||||||
const page = await browser.newPage();
|
const page = await browser.newPage();
|
||||||
|
|
||||||
await page.goto("http://localhost:8000/auth");
|
await page.goto('http://localhost:8000/auth');
|
||||||
await page.getByPlaceholder("Name").click();
|
await page.getByPlaceholder('Name').click();
|
||||||
await page.getByPlaceholder("Name").fill("cox");
|
await page.getByPlaceholder('Name').fill('cox');
|
||||||
await page.getByPlaceholder("Name").press("Tab");
|
await page.getByPlaceholder('Name').press('Tab');
|
||||||
await page.getByPlaceholder("Passwort").fill("cox");
|
await page.getByPlaceholder('Passwort').fill('cox');
|
||||||
await page.getByPlaceholder("Passwort").press("Enter");
|
await page.getByPlaceholder('Passwort').press('Enter');
|
||||||
await page.getByRole("link", { name: "Geplante Ausfahrten" }).click();
|
await page.getByRole('link', { name: 'Geplante Ausfahrten' }).click();
|
||||||
await page.locator(".relative").first().click();
|
await page.locator('.relative').first().click();
|
||||||
await page.locator("#sidebar #planned_starting_time").click();
|
await page.locator('#sidebar #planned_starting_time').click();
|
||||||
await page.locator("#sidebar #planned_starting_time").fill("18:00");
|
await page.locator('#sidebar #planned_starting_time').fill('18:00');
|
||||||
await page.locator("#sidebar #planned_starting_time").press("Tab");
|
await page.locator('#sidebar #planned_starting_time').press('Tab');
|
||||||
await page.locator("#sidebar #planned_starting_time").press("Tab");
|
await page.locator('#sidebar #planned_starting_time').press('Tab');
|
||||||
await page.getByRole("spinbutton").fill("5");
|
await page.getByRole('spinbutton').fill('5');
|
||||||
await page.getByRole("button", { name: "Erstellen", exact: true }).click();
|
await page.getByRole('button', { name: 'Erstellen', exact: true }).click();
|
||||||
|
|
||||||
sharedPage = page;
|
sharedPage = page;
|
||||||
});
|
});
|
||||||
|
|
||||||
test("edit remarks", async () => {
|
test('edit remarks', async () => {
|
||||||
await sharedPage.goto("http://localhost:8000/planned");
|
await sharedPage.goto('http://localhost:8000/planned');
|
||||||
await sharedPage.getByRole("link", { name: "Details" }).click();
|
await sharedPage.getByRole('link', { name: 'Details' }).click();
|
||||||
await sharedPage.locator("#sidebar #notes").click();
|
await sharedPage.locator('#sidebar #notes').click();
|
||||||
await sharedPage.locator("#sidebar #notes").fill("Meine Anmerkung");
|
await sharedPage.locator('#sidebar #notes').fill('Meine Anmerkung');
|
||||||
await sharedPage.getByRole("button", { name: "Speichern" }).click();
|
await sharedPage.getByRole('button', { name: 'Speichern' }).click();
|
||||||
await sharedPage.getByRole("link", { name: "Details" }).click();
|
await sharedPage.getByRole('link', { name: 'Details' }).click();
|
||||||
await expect(sharedPage.locator("#sidebar")).toContainText(
|
await expect(sharedPage.locator('#sidebar')).toContainText('Meine Anmerkung');
|
||||||
"Meine Anmerkung",
|
|
||||||
);
|
|
||||||
|
|
||||||
await sharedPage
|
await sharedPage.getByRole('button', { name: 'Ausfahrt erstellen schließen' }).click();
|
||||||
.getByRole("button", { name: "Ausfahrt erstellen schließen" })
|
|
||||||
.click();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("add and remove guest", async () => {
|
test('add and remove guest', async () => {
|
||||||
await sharedPage.goto("http://localhost:8000/planned");
|
await sharedPage.goto('http://localhost:8000/planned');
|
||||||
await sharedPage.getByRole("link", { name: "Details" }).click();
|
await sharedPage.getByRole('link', { name: 'Details' }).click();
|
||||||
await sharedPage.locator("#sidebar #user_note").click();
|
await sharedPage.locator('#sidebar #user_note').click();
|
||||||
await sharedPage.locator("#sidebar #user_note").fill("Mein Gast");
|
await sharedPage.locator('#sidebar #user_note').fill('Mein Gast');
|
||||||
await sharedPage.getByRole("button", { name: "Gast hinzufügen" }).click();
|
await sharedPage.getByRole('button', { name: 'Gast hinzufügen' }).click();
|
||||||
await expect(sharedPage.locator("body")).toContainText(
|
await expect(sharedPage.locator('body')).toContainText('Erfolgreich angemeldet!');
|
||||||
"Erfolgreich angemeldet!",
|
await sharedPage.getByRole('link', { name: 'Details' }).click();
|
||||||
);
|
await expect(sharedPage.locator('#sidebar')).toContainText('Freie Plätze: 4');
|
||||||
await sharedPage.getByRole("link", { name: "Details" }).click();
|
await expect(sharedPage.locator('#sidebar')).toContainText('Mein Gast (Gast) Abmelden');
|
||||||
await expect(sharedPage.locator("#sidebar")).toContainText(
|
await expect(sharedPage.getByRole('link', { name: 'Termin löschen' })).not.toBeVisible();
|
||||||
"Freie Plätze: 4",
|
|
||||||
);
|
|
||||||
await expect(sharedPage.locator("#sidebar")).toContainText(
|
|
||||||
"Mein Gast (Gast) Abmelden",
|
|
||||||
);
|
|
||||||
await expect(
|
|
||||||
sharedPage.getByRole("link", { name: "Termin löschen" }),
|
|
||||||
).not.toBeVisible();
|
|
||||||
|
|
||||||
await sharedPage.getByRole("link", { name: "Abmelden" }).click();
|
await sharedPage.getByRole('link', { name: 'Abmelden' }).click();
|
||||||
await expect(sharedPage.locator("body")).toContainText(
|
await expect(sharedPage.locator('body')).toContainText('Erfolgreich abgemeldet!');
|
||||||
"Erfolgreich abgemeldet!",
|
await sharedPage.getByRole('link', { name: 'Details' }).click();
|
||||||
);
|
await expect(sharedPage.locator('#sidebar')).toContainText('Freie Plätze: 5');
|
||||||
await sharedPage.getByRole("link", { name: "Details" }).click();
|
await expect(sharedPage.locator('#sidebar')).toContainText('Keine Ruderer angemeldet');
|
||||||
await expect(sharedPage.locator("#sidebar")).toContainText(
|
await expect(sharedPage.getByRole('link', { name: 'Termin löschen' })).toBeVisible();
|
||||||
"Freie Plätze: 5",
|
|
||||||
);
|
|
||||||
await expect(sharedPage.locator("#sidebar")).toContainText(
|
|
||||||
"Keine Ruderer angemeldet",
|
|
||||||
);
|
|
||||||
await expect(
|
|
||||||
sharedPage.getByRole("link", { name: "Termin löschen" }),
|
|
||||||
).toBeVisible();
|
|
||||||
|
|
||||||
await sharedPage
|
await sharedPage.getByRole('button', { name: 'Ausfahrt erstellen schließen' }).click();
|
||||||
.getByRole("button", { name: "Ausfahrt erstellen schließen" })
|
|
||||||
.click();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("change amount rower", async () => {
|
test('change amount rower', async () => {
|
||||||
await sharedPage.goto("http://localhost:8000/planned");
|
await sharedPage.goto('http://localhost:8000/planned');
|
||||||
await sharedPage.getByRole("link", { name: "Details" }).click();
|
await sharedPage.getByRole('link', { name: 'Details' }).click();
|
||||||
await expect(sharedPage.locator("#sidebar")).toContainText(
|
await expect(sharedPage.locator('#sidebar')).toContainText('Freie Plätze: 5');
|
||||||
"Freie Plätze: 5",
|
await sharedPage.getByRole('spinbutton').click();
|
||||||
);
|
await sharedPage.getByRole('spinbutton').fill('3');
|
||||||
await sharedPage.getByRole("spinbutton").click();
|
await sharedPage.getByRole('button', { name: 'Speichern' }).click();
|
||||||
await sharedPage.getByRole("spinbutton").fill("3");
|
await expect(sharedPage.locator('body')).toContainText('Ausfahrt erfolgreich aktualisiert.');
|
||||||
await sharedPage.getByRole("button", { name: "Speichern" }).click();
|
|
||||||
await expect(sharedPage.locator("body")).toContainText(
|
|
||||||
"Ausfahrt erfolgreich aktualisiert.",
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("call off trip", async () => {
|
test('call off trip', async () => {
|
||||||
await sharedPage.goto("http://localhost:8000/planned");
|
await sharedPage.goto('http://localhost:8000/planned');
|
||||||
await sharedPage.getByRole("link", { name: "Details" }).click();
|
await sharedPage.getByRole('link', { name: 'Details' }).click();
|
||||||
await expect(sharedPage.locator("#sidebar")).toContainText(
|
await expect(sharedPage.locator('#sidebar')).toContainText('Freie Plätze: 5');
|
||||||
"Freie Plätze: 5",
|
await sharedPage.getByRole('spinbutton').click();
|
||||||
);
|
await sharedPage.getByRole('spinbutton').fill('0');
|
||||||
await sharedPage.getByRole("spinbutton").click();
|
await sharedPage.getByRole('button', { name: 'Speichern' }).click();
|
||||||
await sharedPage.getByRole("spinbutton").fill("0");
|
await expect(sharedPage.locator('body')).toContainText('Ausfahrt erfolgreich aktualisiert.');
|
||||||
await sharedPage.getByRole("button", { name: "Speichern" }).click();
|
await expect(sharedPage.locator('body')).toContainText('(Absage cox )');
|
||||||
await expect(sharedPage.locator("body")).toContainText(
|
|
||||||
"Ausfahrt erfolgreich aktualisiert.",
|
|
||||||
);
|
|
||||||
await expect(sharedPage.locator("body")).toContainText("(Absage cox)");
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test.afterEach(async () => {
|
test.afterEach(async () => {
|
||||||
await sharedPage.goto("http://localhost:8000/planned");
|
await sharedPage.goto('http://localhost:8000/planned');
|
||||||
await sharedPage.getByRole("link", { name: "Details" }).click();
|
await sharedPage.getByRole('link', { name: 'Details' }).click();
|
||||||
await sharedPage.getByRole("link", { name: "Termin löschen" }).click();
|
await sharedPage.getByRole('link', { name: 'Termin löschen' }).click();
|
||||||
await sharedPage.close();
|
await sharedPage.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1,166 +1,69 @@
|
|||||||
import { test, expect } from "@playwright/test";
|
import { test, expect } from '@playwright/test';
|
||||||
|
|
||||||
test("Cox can start and cancel trip", async ({ page }, testInfo) => {
|
test('Cox can start and cancel trip', async ({ page }, testInfo) => {
|
||||||
await page.goto("http://localhost:8000/auth");
|
await page.goto('http://localhost:8000/auth');
|
||||||
await page.getByPlaceholder("Name").click();
|
await page.getByPlaceholder('Name').click();
|
||||||
await page.getByPlaceholder("Name").fill("cox2");
|
await page.getByPlaceholder('Name').fill('cox2');
|
||||||
await page.getByPlaceholder("Name").press("Tab");
|
await page.getByPlaceholder('Name').press('Tab');
|
||||||
await page.getByPlaceholder("Passwort").fill("cox");
|
await page.getByPlaceholder('Passwort').fill('cox');
|
||||||
await page.getByPlaceholder("Passwort").press("Enter");
|
await page.getByPlaceholder('Passwort').press('Enter');
|
||||||
|
|
||||||
await page.goto("http://localhost:8000/");
|
await page.goto('http://localhost:8000/');
|
||||||
await page.getByRole("link", { name: "Ausfahrt eintragen" }).click();
|
await page.getByRole('link', { name: 'Ausfahrt eintragen' }).click();
|
||||||
if (testInfo.project.name.includes("Mobile")) {
|
if (testInfo.project.name.includes('Mobile')) { // No left boat selector on mobile views
|
||||||
// No left boat selector on mobile views
|
await page.getByText('Kaputtes Boot :-( (7 x)').nth(1).click();
|
||||||
await page.getByText("Kaputtes Boot :-( (7 x)").nth(1).click();
|
await page.getByRole('option', { name: 'Joe' }).click();
|
||||||
await page.getByRole("option", { name: "Joe" }).click();
|
} else{
|
||||||
} else {
|
await page.getByText('Joe', { exact: true }).click();
|
||||||
await page.getByText("Joe", { exact: true }).click();
|
|
||||||
}
|
}
|
||||||
await page.getByPlaceholder("Ruderer auswählen").click();
|
await page.getByPlaceholder('Ruderer auswählen').click();
|
||||||
await page.getByRole("option", { name: "rower2" }).click();
|
await page.getByRole('option', { name: 'rower2' }).click();
|
||||||
await page.getByRole("option", { name: "cox2" }).click();
|
await page.getByRole('option', { name: 'cox2' }).click();
|
||||||
await expect(page.getByRole("listbox")).toContainText(
|
await expect(page.getByRole('listbox')).toContainText('Nur 2 Ruderer können hinzugefügt werden');
|
||||||
"Nur 2 Ruderer können hinzugefügt werden",
|
await expect(page.locator('#shipmaster-newrowerjs')).toContainText('cox');
|
||||||
);
|
await expect(page.locator('#steering_person-newrowerjs')).toContainText('rower2 cox');
|
||||||
await expect(page.locator("#shipmaster-newrowerjs")).toContainText("cox");
|
await page.getByRole('button', { name: 'Ausfahrt eintragen' }).click();
|
||||||
await expect(page.locator("#steering_person-newrowerjs")).toContainText(
|
await expect(page.locator('body')).toContainText('Ausfahrt erfolgreich hinzugefügt');
|
||||||
"rower2 cox",
|
await expect(page.locator('body')).toContainText('Joe');
|
||||||
);
|
|
||||||
await page.getByRole("button", { name: "Ausfahrt eintragen" }).click();
|
|
||||||
await expect(page.locator("body")).toContainText(
|
|
||||||
"Ausfahrt erfolgreich hinzugefügt",
|
|
||||||
);
|
|
||||||
await expect(page.locator("body")).toContainText("Joe");
|
|
||||||
|
|
||||||
await page.getByRole("link", { name: "Joe" }).click();
|
await page.getByRole('link', { name: 'Joe' }).click();
|
||||||
page.once("dialog", (dialog) => {
|
page.once('dialog', dialog => {
|
||||||
dialog.accept().catch(() => {});
|
dialog.accept().catch(() => {});
|
||||||
});
|
});
|
||||||
await page.getByRole("link", { name: "Löschen" }).click();
|
await page.getByRole('link', { name: 'Löschen' }).click();
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Cox can start and finish trip", async ({ page }, testInfo) => {
|
test('Cox can start and finish trip', async ({ page }, testInfo) => {
|
||||||
await page.goto("http://localhost:8000/auth");
|
await page.goto('http://localhost:8000/auth');
|
||||||
await page.getByPlaceholder("Name").click();
|
await page.getByPlaceholder('Name').click();
|
||||||
await page.getByPlaceholder("Name").fill("cox2");
|
await page.getByPlaceholder('Name').fill('cox2');
|
||||||
await page.getByPlaceholder("Name").press("Tab");
|
await page.getByPlaceholder('Name').press('Tab');
|
||||||
await page.getByPlaceholder("Passwort").fill("cox");
|
await page.getByPlaceholder('Passwort').fill('cox');
|
||||||
await page.getByPlaceholder("Passwort").press("Enter");
|
await page.getByPlaceholder('Passwort').press('Enter');
|
||||||
|
|
||||||
await page.goto("http://localhost:8000/");
|
await page.goto('http://localhost:8000/');
|
||||||
await page.getByRole("link", { name: "Ausfahrt eintragen" }).click();
|
await page.getByRole('link', { name: 'Ausfahrt eintragen' }).click();
|
||||||
if (testInfo.project.name.includes("Mobile")) {
|
if (testInfo.project.name.includes('Mobile')) { // No left boat selector on mobile views
|
||||||
// No left boat selector on mobile views
|
await page.getByText('Kaputtes Boot :-( (7 x)').nth(1).click();
|
||||||
await page.getByText("Kaputtes Boot :-( (7 x)").nth(1).click();
|
await page.getByRole('option', { name: 'Joe' }).click();
|
||||||
await page.getByRole("option", { name: "Joe" }).click();
|
} else{
|
||||||
} else {
|
await page.getByText('Joe', { exact: true }).click();
|
||||||
await page.getByText("Joe", { exact: true }).click();
|
|
||||||
}
|
}
|
||||||
await page.getByPlaceholder("Ruderer auswählen").click();
|
await page.getByPlaceholder('Ruderer auswählen').click();
|
||||||
await page.getByRole("option", { name: "rower2" }).click();
|
await page.getByRole('option', { name: 'rower2' }).click();
|
||||||
await page.getByRole("option", { name: "cox2" }).click();
|
await page.getByRole('option', { name: 'cox2' }).click();
|
||||||
await expect(page.getByRole("listbox")).toContainText(
|
await expect(page.getByRole('listbox')).toContainText('Nur 2 Ruderer können hinzugefügt werden');
|
||||||
"Nur 2 Ruderer können hinzugefügt werden",
|
await expect(page.locator('#shipmaster-newrowerjs')).toContainText('cox');
|
||||||
);
|
await expect(page.locator('#steering_person-newrowerjs')).toContainText('rower2 cox');
|
||||||
await expect(page.locator("#shipmaster-newrowerjs")).toContainText("cox");
|
await page.getByRole('button', { name: 'Ausfahrt eintragen' }).click();
|
||||||
await expect(page.locator("#steering_person-newrowerjs")).toContainText(
|
await expect(page.locator('body')).toContainText('Ausfahrt erfolgreich hinzugefügt');
|
||||||
"rower2 cox",
|
|
||||||
);
|
|
||||||
await page.getByRole("button", { name: "Ausfahrt eintragen" }).click();
|
|
||||||
await expect(page.locator("body")).toContainText(
|
|
||||||
"Ausfahrt erfolgreich hinzugefügt",
|
|
||||||
);
|
|
||||||
await expect(page.locator("body")).toContainText("Joe");
|
|
||||||
|
|
||||||
await page.goto("http://localhost:8000/log");
|
|
||||||
await page.waitForTimeout(60000);
|
|
||||||
await page.locator("div:nth-child(2) > .border-0").click();
|
|
||||||
await page.getByRole("combobox", { name: "Destination" }).click();
|
|
||||||
await page.getByRole("combobox", { name: "Destination" }).fill("Ottensheim");
|
|
||||||
await page.getByRole("button", { name: "Ausfahrt beenden" }).click();
|
|
||||||
await expect(page.locator("body")).toContainText(
|
|
||||||
"Ausfahrt korrekt eingetragen",
|
|
||||||
);
|
|
||||||
|
|
||||||
await page.goto('http://localhost:8000/log/show');
|
|
||||||
await expect(page.locator('body')).toContainText('Joe');
|
await expect(page.locator('body')).toContainText('Joe');
|
||||||
await expect(page.locator('body')).toContainText('(cox2)');
|
|
||||||
await expect(page.locator('body')).toContainText('Ottensheim (25 km)');
|
|
||||||
await expect(page.locator('body')).toContainText('Ruderer: cox2, rower2');
|
|
||||||
});
|
|
||||||
|
|
||||||
test("Kiosk can start and cancel trip", async ({ page }, testInfo) => {
|
await page.goto('http://localhost:8000/log');
|
||||||
await page.goto("http://localhost:8000/log/kiosk/ekrv2019/Linz");
|
|
||||||
if (testInfo.project.name.includes("Mobile")) {
|
|
||||||
// No left boat selector on mobile views
|
|
||||||
await page.getByText("Kaputtes Boot :-( (7 x)").nth(1).click();
|
|
||||||
await page.getByRole("option", { name: "Joe" }).click();
|
|
||||||
} else {
|
|
||||||
await page.getByText("Joe", { exact: true }).click();
|
|
||||||
}
|
|
||||||
await page.getByPlaceholder("Ruderer auswählen").click();
|
|
||||||
await page.getByRole("option", { name: "rower2" }).click();
|
|
||||||
await page.getByRole("option", { name: "cox2" }).click();
|
|
||||||
await expect(page.getByRole("listbox")).toContainText(
|
|
||||||
"Nur 2 Ruderer können hinzugefügt werden",
|
|
||||||
);
|
|
||||||
await expect(page.locator("#shipmaster-newrowerjs")).toContainText("cox");
|
|
||||||
await expect(page.locator("#steering_person-newrowerjs")).toContainText(
|
|
||||||
"rower2 cox",
|
|
||||||
);
|
|
||||||
await page.getByRole("button", { name: "Ausfahrt eintragen" }).click();
|
|
||||||
await expect(page.locator("body")).toContainText(
|
|
||||||
"Ausfahrt erfolgreich hinzugefügt",
|
|
||||||
);
|
|
||||||
await expect(page.locator("body")).toContainText("Joe");
|
|
||||||
|
|
||||||
await page.getByRole("link", { name: "Joe" }).click();
|
|
||||||
page.once("dialog", (dialog) => {
|
|
||||||
dialog.accept().catch(() => {});
|
|
||||||
});
|
|
||||||
await page.getByRole("link", { name: "Löschen" }).click();
|
|
||||||
});
|
|
||||||
|
|
||||||
test("Kiosk can start and finish trip", async ({ page }, testInfo) => {
|
|
||||||
await page.goto("http://localhost:8000/log/kiosk/ekrv2019/Linz");
|
|
||||||
|
|
||||||
if (testInfo.project.name.includes("Mobile")) {
|
|
||||||
// No left boat selector on mobile views
|
|
||||||
await page.getByText("Kaputtes Boot :-( (7 x)").nth(1).click();
|
|
||||||
await page.getByRole("option", { name: "Joe" }).click();
|
|
||||||
} else {
|
|
||||||
await page.getByText("Joe", { exact: true }).click();
|
|
||||||
}
|
|
||||||
await page.getByPlaceholder("Ruderer auswählen").click();
|
|
||||||
await page.getByRole("option", { name: "rower2" }).click();
|
|
||||||
await page.getByRole("option", { name: "cox2" }).click();
|
|
||||||
await expect(page.getByRole("listbox")).toContainText(
|
|
||||||
"Nur 2 Ruderer können hinzugefügt werden",
|
|
||||||
);
|
|
||||||
await expect(page.locator("#shipmaster-newrowerjs")).toContainText("cox");
|
|
||||||
await expect(page.locator("#steering_person-newrowerjs")).toContainText(
|
|
||||||
"rower2 cox",
|
|
||||||
);
|
|
||||||
await page.getByRole("button", { name: "Ausfahrt eintragen" }).click();
|
|
||||||
await expect(page.locator("body")).toContainText(
|
|
||||||
"Ausfahrt erfolgreich hinzugefügt",
|
|
||||||
);
|
|
||||||
await expect(page.locator("body")).toContainText("Joe");
|
|
||||||
|
|
||||||
await page.goto("http://localhost:8000/log");
|
|
||||||
await page.waitForTimeout(60000);
|
await page.waitForTimeout(60000);
|
||||||
await page.locator('div:nth-child(2) > .pt-2 > div > div > div:nth-child(2) > .border-0').click(); // 2 trips currently running, try to close second one
|
await page.locator('div:nth-child(2) > .border-0').click();
|
||||||
await page.getByRole("combobox", { name: "Destination" }).click();
|
await page.getByRole('combobox', { name: 'Destination' }).click();
|
||||||
await page.getByRole("combobox", { name: "Destination" }).fill("Ottensheim");
|
await page.getByRole('combobox', { name: 'Destination' }).fill('Ottensheim');
|
||||||
await page.getByRole("button", { name: "Ausfahrt beenden" }).click();
|
await page.getByRole('button', { name: 'Ausfahrt beenden' }).click();
|
||||||
await expect(page.locator("body")).toContainText(
|
await expect(page.locator('body')).toContainText('Ausfahrt korrekt eingetragen');
|
||||||
"Ausfahrt korrekt eingetragen",
|
|
||||||
);
|
|
||||||
|
|
||||||
await page.getByRole('link', { name: 'Logbuch' }).click();
|
|
||||||
await expect(page.locator('body')).toContainText('Joe');
|
|
||||||
await expect(page.locator('body')).toContainText('(cox2)');
|
|
||||||
await expect(page.locator('body')).toContainText('Ottensheim (25 km)');
|
|
||||||
await expect(page.locator('body')).toContainText('Ruderer: cox2, rower2');
|
|
||||||
});
|
});
|
||||||
|
@ -5,7 +5,6 @@ INSERT INTO "role" (name) VALUES ('tech');
|
|||||||
INSERT INTO "role" (name) VALUES ('Donau Linz');
|
INSERT INTO "role" (name) VALUES ('Donau Linz');
|
||||||
INSERT INTO "role" (name) VALUES ('planned_event');
|
INSERT INTO "role" (name) VALUES ('planned_event');
|
||||||
INSERT INTO "role" (name) VALUES ('Rennrudern');
|
INSERT INTO "role" (name) VALUES ('Rennrudern');
|
||||||
INSERT INTO "role" (name) VALUES ('paid');
|
|
||||||
INSERT INTO "user" (name, pw) VALUES('admin', '$argon2id$v=19$m=19456,t=2,p=1$dS/X5/sPEKTj4Rzs/CuvzQ$4P4NCw4Ukhv80/eQYTsarHhnw61JuL1KMx/L9dm82YM');
|
INSERT INTO "user" (name, pw) VALUES('admin', '$argon2id$v=19$m=19456,t=2,p=1$dS/X5/sPEKTj4Rzs/CuvzQ$4P4NCw4Ukhv80/eQYTsarHhnw61JuL1KMx/L9dm82YM');
|
||||||
INSERT INTO "user_role" (user_id, role_id) VALUES(1,1);
|
INSERT INTO "user_role" (user_id, role_id) VALUES(1,1);
|
||||||
INSERT INTO "user_role" (user_id, role_id) VALUES(1,2);
|
INSERT INTO "user_role" (user_id, role_id) VALUES(1,2);
|
||||||
@ -19,7 +18,6 @@ INSERT INTO "user_role" (user_id, role_id) VALUES(3,3);
|
|||||||
INSERT INTO "user" (name, pw) VALUES('cox', '$argon2id$v=19$m=19456,t=2,p=1$dS/X5/sPEKTj4Rzs/CuvzQ$lnWzHx3DdqS9GQyWYel82kIotZuK2wk9EyfhPFtjNzs');
|
INSERT INTO "user" (name, pw) VALUES('cox', '$argon2id$v=19$m=19456,t=2,p=1$dS/X5/sPEKTj4Rzs/CuvzQ$lnWzHx3DdqS9GQyWYel82kIotZuK2wk9EyfhPFtjNzs');
|
||||||
INSERT INTO "user_role" (user_id, role_id) VALUES(4,5);
|
INSERT INTO "user_role" (user_id, role_id) VALUES(4,5);
|
||||||
INSERT INTO "user_role" (user_id, role_id) VALUES(4,2);
|
INSERT INTO "user_role" (user_id, role_id) VALUES(4,2);
|
||||||
INSERT INTO "user_role" (user_id, role_id) VALUES(4,8);
|
|
||||||
INSERT INTO "user" (name) VALUES('new');
|
INSERT INTO "user" (name) VALUES('new');
|
||||||
INSERT INTO "user_role" (user_id, role_id) VALUES(5,5);
|
INSERT INTO "user_role" (user_id, role_id) VALUES(5,5);
|
||||||
INSERT INTO "user" (name, pw) VALUES('cox2', '$argon2id$v=19$m=19456,t=2,p=1$dS/X5/sPEKTj4Rzs/CuvzQ$lnWzHx3DdqS9GQyWYel82kIotZuK2wk9EyfhPFtjNzs');
|
INSERT INTO "user" (name, pw) VALUES('cox2', '$argon2id$v=19$m=19456,t=2,p=1$dS/X5/sPEKTj4Rzs/CuvzQ$lnWzHx3DdqS9GQyWYel82kIotZuK2wk9EyfhPFtjNzs');
|
||||||
|
@ -1,11 +1,21 @@
|
|||||||
{% import "includes/macros" as macros %}
|
{% import "includes/macros" as macros %}
|
||||||
{% import "includes/forms/boat" as boat %}
|
{% import "includes/forms/boat" as boat %}
|
||||||
|
|
||||||
{% extends "base" %}
|
{% extends "base" %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% if flash %}{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}{% endif %}
|
{% if flash %}
|
||||||
|
{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<div class="max-w-screen-lg w-full">
|
<div class="max-w-screen-lg w-full">
|
||||||
<h1 class="h1">Boats</h1>
|
<h1 class="h1">Boats</h1>
|
||||||
{{ boat::new() }}
|
{{ boat::new() }}
|
||||||
{% for boat in boats %}{{ boat::edit(boat=boat, uuid=loop.index) }}{% endfor %}
|
|
||||||
|
{% for boat in boats %}
|
||||||
|
{{ boat::edit(boat=boat, uuid=loop.index) }}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
@ -1,18 +1,27 @@
|
|||||||
{% import "includes/macros" as macros %}
|
{% import "includes/macros" as macros %}
|
||||||
{% import "includes/forms/boat" as boat %}
|
{% import "includes/forms/boat" as boat %}
|
||||||
|
|
||||||
{% extends "base" %}
|
{% extends "base" %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% if flash %}{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}{% endif %}
|
{% if flash %}
|
||||||
|
{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<div class="max-w-screen-lg w-full">
|
<div class="max-w-screen-lg w-full">
|
||||||
<h1 class="h1">Mail</h1>
|
<h1 class="h1">Mail</h1>
|
||||||
<form action="/admin/mail" method="post" enctype="multipart/form-data">
|
<form action="/admin/mail" method="post" enctype="multipart/form-data">
|
||||||
<select name="role_id">
|
<select name="role_id">
|
||||||
{% for role in roles %}<option value="{{ role.id }}">{{ role.name }}</option>{% endfor %}
|
{% for role in roles %}
|
||||||
|
<option value="{{ role.id }}">{{ role.name }}</option>
|
||||||
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
<input type="text" name="subject" />
|
<input type="text" name="subject" />
|
||||||
<textarea name="body" rows="4" cols="50"></textarea>
|
<textarea name="body" rows="4" cols="50"></textarea>
|
||||||
<input type="file" name="files" multiple />
|
<input type="file" name="files" multiple />
|
||||||
<input type="submit" />
|
<input type="submit" />
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
@ -1,36 +1,37 @@
|
|||||||
{% import "includes/macros" as macros %}
|
{% import "includes/macros" as macros %}
|
||||||
|
|
||||||
{% extends "base" %}
|
{% extends "base" %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="max-w-screen-lg w-full bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5">
|
<div class="max-w-screen-lg w-full bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5">
|
||||||
{% if flash %}{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}{% endif %}
|
{% if flash %}
|
||||||
|
{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<h1 class="h1">Gebühren</h1>
|
<h1 class="h1">Gebühren</h1>
|
||||||
|
|
||||||
<!-- START filterBar -->
|
<!-- START filterBar -->
|
||||||
<div class="search-wrapper">
|
<div class="search-wrapper">
|
||||||
<label for="name" class="sr-only">Suche</label>
|
<label for="name" class="sr-only">Suche</label>
|
||||||
<input type="search"
|
<input type="search" name="name" id="filter-js" class="search-bar" placeholder="Suchen nach Name"/>
|
||||||
name="name"
|
|
||||||
id="filter-js"
|
|
||||||
class="search-bar"
|
|
||||||
placeholder="Suchen nach Name" />
|
|
||||||
</div>
|
</div>
|
||||||
<!-- END filterBar -->
|
<!-- END filterBar -->
|
||||||
|
|
||||||
<div class="bg-primary-100 dark:bg-primary-950 p-3 rounded-b-md grid gap-4">
|
<div class="bg-primary-100 dark:bg-primary-950 p-3 rounded-b-md grid gap-4">
|
||||||
<div id="filter-result-js"
|
<div id="filter-result-js" class="text-primary-950 dark:text-white text-right"></div>
|
||||||
class="text-primary-950 dark:text-white text-right"></div>
|
|
||||||
{% for fee in fees | sort(attribute="name") %}
|
{% for fee in fees | sort(attribute="name") %}
|
||||||
<div {% if fee.paid %}style="background-color: green;"{% endif %}
|
<div {% if fee.paid %} style="background-color: green;" {% endif %} data-filterable="true" data-filter="{{ fee.name }} {% if fee.paid %} has-already-paid {% else %} has-not-paid {% endif %}" class="bg-white dark:bg-primary-900 p-3 rounded-md w-full">
|
||||||
data-filterable="true"
|
|
||||||
data-filter="{{ fee.name }} {% if fee.paid %} has-already-paid {% else %} has-not-paid {% endif %}"
|
|
||||||
class="bg-white dark:bg-primary-900 p-3 rounded-md w-full">
|
|
||||||
<div class="grid sm:grid-cols-1 gap-3">
|
<div class="grid sm:grid-cols-1 gap-3">
|
||||||
<div style="width: 100%" class="col-span-2">
|
<div style="width: 100%" class="col-span-2">
|
||||||
<b>{{ fee.name }}</b>
|
<b>{{ fee.name }}</b>
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%">{{ fee.sum_in_cents / 100 }}€:</div>
|
<div style="width: 100%">
|
||||||
|
{{ fee.sum_in_cents / 100 }}€:
|
||||||
|
</div>
|
||||||
<div style="width: 100%">
|
<div style="width: 100%">
|
||||||
{% for p in fee.parts %}
|
{% for p in fee.parts %}
|
||||||
{{ p.0 }} ({{ p.1 / 100 }}€)
|
{{ p.0 }} ({{ p.1 / 100 }}€) {% if not loop.last %} + {% endif %}
|
||||||
{% if not loop.last %}+{% endif %}
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% if "admin" in loggedin_user.roles %}
|
{% if "admin" in loggedin_user.roles %}
|
||||||
@ -40,5 +41,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
@ -1,68 +1,69 @@
|
|||||||
{% import "includes/macros" as macros %}
|
{% import "includes/macros" as macros %}
|
||||||
|
|
||||||
{% extends "base" %}
|
{% extends "base" %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="max-w-screen-lg w-full">
|
<div class="max-w-screen-lg w-full">
|
||||||
{% if flash %}{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}{% endif %}
|
{% if flash %}
|
||||||
|
{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<h1 class="h1">Users</h1>
|
<h1 class="h1">Users</h1>
|
||||||
|
|
||||||
{% if allowed_to_edit %}
|
{% if allowed_to_edit %}
|
||||||
<form action="/admin/user/new"
|
<form action="/admin/user/new" method="post" class="mt-4 bg-primary-900 rounded-md text-white px-3 pb-3 pt-2 sm:flex items-end justify-between">
|
||||||
method="post"
|
|
||||||
class="mt-4 bg-primary-900 rounded-md text-white px-3 pb-3 pt-2 sm:flex items-end justify-between">
|
|
||||||
<div class="w-full">
|
<div class="w-full">
|
||||||
<h2 class="text-md font-bold mb-2 uppercase tracking-wide">Neuen User hinzufügen</h2>
|
<h2 class="text-md font-bold mb-2 uppercase tracking-wide">Neuen User hinzufügen</h2>
|
||||||
<div class="grid md:grid-cols-3">
|
<div class="grid md:grid-cols-3">
|
||||||
<div>
|
<div>
|
||||||
<label for="name" class="sr-only">Name</label>
|
<label for="name" class="sr-only">Name</label>
|
||||||
<input type="text"
|
<input type="text" name="name" class="relative block rounded-md border-0 py-1.5 px-2 text-gray-900 ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-primary-600 sm:text-sm sm:leading-6 mb-2 md:mb-0" placeholder="Name"/>
|
||||||
name="name"
|
|
||||||
class="relative block rounded-md border-0 py-1.5 px-2 text-gray-900 ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-primary-600 sm:text-sm sm:leading-6 mb-2 md:mb-0"
|
|
||||||
placeholder="Name" />
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-right">
|
<div class="text-right">
|
||||||
<input value="Hinzufügen"
|
<input value="Hinzufügen" type="submit" class="w-28 mt-2 sm:mt-0 rounded-md bg-primary-500 px-3 py-2 text-sm font-semibold text-white hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 cursor-pointer"/>
|
||||||
type="submit"
|
|
||||||
class="w-28 mt-2 sm:mt-0 rounded-md bg-primary-500 px-3 py-2 text-sm font-semibold text-white hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 cursor-pointer" />
|
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<!-- START filterBar -->
|
<!-- START filterBar -->
|
||||||
<div class="search-wrapper">
|
<div class="search-wrapper">
|
||||||
<label for="name" class="sr-only">Suche</label>
|
<label for="name" class="sr-only">Suche</label>
|
||||||
<input type="search"
|
<input type="search" name="name" id="filter-js" class="search-bar" placeholder="Suchen nach (Name, [yes|no]-role:<name>)"/>
|
||||||
name="name"
|
|
||||||
id="filter-js"
|
|
||||||
class="search-bar"
|
|
||||||
placeholder="Suchen nach (Name, [yes|no]-role:<name>)" />
|
|
||||||
</div>
|
</div>
|
||||||
<!-- END filterBar -->
|
<!-- END filterBar -->
|
||||||
|
|
||||||
<div class="bg-primary-100 dark:bg-primary-950 p-3 rounded-b-md grid gap-4">
|
<div class="bg-primary-100 dark:bg-primary-950 p-3 rounded-b-md grid gap-4">
|
||||||
<div id="filter-result-js"
|
<div id="filter-result-js" class="text-primary-950 dark:text-white text-right"></div>
|
||||||
class="text-primary-950 dark:text-white text-right"></div>
|
|
||||||
{% for user in users %}
|
{% for user in users %}
|
||||||
<div data-filterable="true"
|
<div data-filterable="true" data-filter="{{ user.name }}
|
||||||
data-filter="{{ user.name }} {% for role in roles %} {% if role.name in user.roles %} yes-role:{{ role.name }} {% else %} no-role:{{ role.name }} {% endif %} role-{{ role }} {% endfor %} ">
|
{% for role in roles %}
|
||||||
<form action="/admin/user"
|
{% if role.name in user.roles %}
|
||||||
method="post"
|
yes-role:{{role.name}}
|
||||||
class="bg-white dark:bg-primary-900 p-3 rounded-md w-full">
|
{% else %}
|
||||||
|
no-role:{{role.name}}
|
||||||
|
{% endif %}
|
||||||
|
role-{{role}}
|
||||||
|
{% endfor%}
|
||||||
|
|
||||||
|
">
|
||||||
|
<form action="/admin/user" method="post" class="bg-white dark:bg-primary-900 p-3 rounded-md w-full">
|
||||||
<div class="w-full grid gap-3">
|
<div class="w-full grid gap-3">
|
||||||
<input type="hidden" name="id" value="{{ user.id }}" />
|
<input type="hidden" name="id" value="{{ user.id }}"/>
|
||||||
<div class="font-bold mb-1 text-black dark:text-white">
|
<div class="font-bold mb-1 text-black dark:text-white">{{ user.name }}
|
||||||
{{ user.name }}
|
|
||||||
{% if user.last_access %}
|
{% if user.last_access %}
|
||||||
(last access:
|
(last access:
|
||||||
{{ user.last_access | date }})
|
{{ user.last_access | date }})
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if user.pw %}
|
{% if user.pw %}
|
||||||
<a class="block mt-1 font-normal text-primary-600 dark:text-primary-200 hover:text-primary-900 dark:hover:text-primary-300 underline"
|
<a class="block mt-1 font-normal text-primary-600 dark:text-primary-200 hover:text-primary-900 dark:hover:text-primary-300 underline" href="/admin/user/{{ user.id }}/reset-pw">Passwort zurücksetzen</a>
|
||||||
href="/admin/user/{{ user.id }}/reset-pw">Passwort zurücksetzen</a>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div class="grid sm:grid-cols-2 lg:grid-cols-4 gap-3">
|
<div class="grid sm:grid-cols-2 lg:grid-cols-4 gap-3">
|
||||||
{% for role in roles %}
|
{% for role in roles %}
|
||||||
{{ macros::checkbox(label=role.name, name="roles[" ~ role.id ~ "]", id=loop.index , checked=role.name in user.roles, disabled=allowed_to_edit == false) }}
|
{{ macros::checkbox(label=role.name, name="roles[" ~ role.id ~ "]", id=loop.index , checked=role.name in user.roles, disabled=allowed_to_edit == false) }}
|
||||||
{% endfor %}
|
{% endfor%}
|
||||||
{{ macros::input(label='DOB', name='dob', id=loop.index, type="text", value=user.dob, readonly=allowed_to_edit == false) }}
|
{{ macros::input(label='DOB', name='dob', id=loop.index, type="text", value=user.dob, readonly=allowed_to_edit == false) }}
|
||||||
{{ macros::input(label='Weight (kg)', name='weight', id=loop.index, type="text", value=user.weight, readonly=allowed_to_edit == false) }}
|
{{ macros::input(label='Weight (kg)', name='weight', id=loop.index, type="text", value=user.weight, readonly=allowed_to_edit == false) }}
|
||||||
{{ macros::input(label='Sex', name='sex', id=loop.index, type="text", value=user.sex, readonly=allowed_to_edit == false) }}
|
{{ macros::input(label='Sex', name='sex', id=loop.index, type="text", value=user.sex, readonly=allowed_to_edit == false) }}
|
||||||
@ -80,18 +81,18 @@
|
|||||||
</div>
|
</div>
|
||||||
{% if allowed_to_edit %}
|
{% if allowed_to_edit %}
|
||||||
<div class="mt-3 text-right">
|
<div class="mt-3 text-right">
|
||||||
<a href="/admin/user/{{ user.id }}/delete"
|
<a href="/admin/user/{{ user.id }}/delete" class="w-28 btn btn-alert" onclick="return confirm('Wirklich löschen?');">
|
||||||
class="w-28 btn btn-alert"
|
|
||||||
onclick="return confirm('Wirklich löschen?');">
|
|
||||||
{% include "includes/delete-icon" %}
|
{% include "includes/delete-icon" %}
|
||||||
Löschen
|
Löschen
|
||||||
</a>
|
</a>
|
||||||
<input value="Ändern" type="submit" class="w-28 btn btn-primary ml-1" />
|
<input value="Ändern" type="submit" class="w-28 btn btn-primary ml-1"/>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
@ -1,13 +1,15 @@
|
|||||||
{% extends "base" %}
|
{% extends "base" %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="w-full max-w-md space-y-8">
|
<div class="w-full max-w-md space-y-8">
|
||||||
<div>
|
<div>
|
||||||
<img class="mx-auto h-16 w-auto"
|
<img class="mx-auto h-16 w-auto" src="https://rudernlinz.at/wp-content/uploads/2021/02/cropped-logo.png" alt="Logo Ruderassistent">
|
||||||
src="https://rudernlinz.at/wp-content/uploads/2021/02/cropped-logo.png"
|
|
||||||
alt="Logo Ruderassistent">
|
|
||||||
<h1 class="mt-6 h1">Ruderassistent</h1>
|
<h1 class="mt-6 h1">Ruderassistent</h1>
|
||||||
</div>
|
</div>
|
||||||
{% if flash %}{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}{% endif %}
|
|
||||||
|
{% if flash %}
|
||||||
|
{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}
|
||||||
|
{% endif %}
|
||||||
<form class="mt-8 space-y-6" method="post" action="/auth">
|
<form class="mt-8 space-y-6" method="post" action="/auth">
|
||||||
<input type="hidden" name="remember" value="true">
|
<input type="hidden" name="remember" value="true">
|
||||||
<div class="-space-y-px rounded-md shadow-sm">
|
<div class="-space-y-px rounded-md shadow-sm">
|
||||||
@ -16,16 +18,19 @@
|
|||||||
{{ macros::input(label='Name', name='name', type='input', required=true, class='rounded-t-md',hide_label=true,value=name, autofocus=true) }}
|
{{ macros::input(label='Name', name='name', type='input', required=true, class='rounded-t-md',hide_label=true,value=name, autofocus=true) }}
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ macros::input(label='Name', name='name', type='input', required=true, class='rounded-t-md',hide_label=true, autofocus=true) }}
|
{{ macros::input(label='Name', name='name', type='input', required=true, class='rounded-t-md',hide_label=true, autofocus=true) }}
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{{ macros::input(label='Passwort', name='password', type='password', class='rounded-b-md',hide_label=true) }}
|
{{ macros::input(label='Passwort', name='password', type='password', class='rounded-b-md',hide_label=true) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<button type="submit"
|
<button type="submit" class="group relative flex w-full justify-center btn btn-primary">
|
||||||
class="group relative flex w-full justify-center btn btn-primary">
|
<span class="absolute inset-y-0 left-0 flex items-center pl-3">
|
||||||
<span class="absolute inset-y-0 left-0 flex items-center pl-3">{% include "includes/lock-icon" %}</span>
|
{% include "includes/lock-icon" %}
|
||||||
|
</span>
|
||||||
Einloggen
|
Einloggen
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
{% extends "base" %}
|
{% extends "base" %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="w-full max-w-md space-y-8">
|
<div class="w-full max-w-md space-y-8">
|
||||||
<h1 class="mt-6 h1">Passwort setzen</h1>
|
<h1 class="mt-6 h1">Passwort setzen</h1>
|
||||||
|
|
||||||
<form class="mt-8 space-y-6" action="/auth/set-pw" method="post">
|
<form class="mt-8 space-y-6" action="/auth/set-pw" method="post">
|
||||||
<input type="hidden" name="remember" value="true">
|
<input type="hidden" name="remember" value="true">
|
||||||
<input type="hidden" name="userid" value="{{ userid }}" />
|
<input type="hidden" name="userid" value="{{ userid }}"/>
|
||||||
<div class="-space-y-px rounded-md shadow-sm">
|
<div class="-space-y-px rounded-md shadow-sm">
|
||||||
<div>
|
<div>
|
||||||
{{ macros::input(label='Passwort', name='password', type='password', required=true, class='rounded-t-md',hide_label=true) }}
|
{{ macros::input(label='Passwort', name='password', type='password', required=true, class='rounded-t-md',hide_label=true) }}
|
||||||
@ -13,13 +15,16 @@
|
|||||||
{{ macros::input(label='Passwort bestätigen', name='password_confirm', type='password', required=true, class='rounded-b-md',hide_label=true) }}
|
{{ macros::input(label='Passwort bestätigen', name='password_confirm', type='password', required=true, class='rounded-b-md',hide_label=true) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<button type="submit"
|
<button type="submit" class="group relative flex w-full justify-center btn btn-primary">
|
||||||
class="group relative flex w-full justify-center btn btn-primary">
|
<span class="absolute inset-y-0 left-0 flex items-center pl-3">
|
||||||
<span class="absolute inset-y-0 left-0 flex items-center pl-3">{% include "includes/lock-icon" %}</span>
|
{% include "includes/lock-icon" %}
|
||||||
|
</span>
|
||||||
Bestätigen
|
Bestätigen
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
@ -1,20 +1,24 @@
|
|||||||
{% import "includes/macros" as macros %}
|
{% import "includes/macros" as macros %}
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
<meta name="viewport"
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
<link rel="manifest" href="public/manifest.json"/>
|
||||||
<link rel="manifest" href="public/manifest.json" />
|
<link rel="stylesheet" href="/public/main.css"/>
|
||||||
<link rel="stylesheet" href="/public/main.css" />
|
|
||||||
<link rel="icon" type="image/x-icon" href="/public/images/favicon.ico">
|
<link rel="icon" type="image/x-icon" href="/public/images/favicon.ico">
|
||||||
<title>Ruderassistent - ASKÖ Ruderverein Donau Linz</title>
|
<title>Ruderassistent - ASKÖ Ruderverein Donau Linz</title>
|
||||||
</head>
|
</head>
|
||||||
<body class="bg-gray-100 dark:bg-black">
|
<body class="bg-gray-100 dark:bg-black">
|
||||||
{% if loggedin_user %}{{ macros::header(loggedin_user=loggedin_user) }}{% endif %}
|
{% if loggedin_user %}
|
||||||
|
{{ macros::header(loggedin_user=loggedin_user) }}
|
||||||
|
{% endif %}
|
||||||
{% if show_kiosk_header %}
|
{% if show_kiosk_header %}
|
||||||
<header class="bg-primary-900 text-white flex justify-between px-4 py-3 w-full z-10 ">
|
<header class="bg-primary-900 text-white flex justify-between px-4 py-3 w-full z-10 ">
|
||||||
<div>
|
<div>
|
||||||
<a href="/log">Hü</a>
|
<a href="/log">
|
||||||
|
Hü
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="/log" class="px-2">Ausfahrt eintragen</a>
|
<a href="/log" class="px-2">Ausfahrt eintragen</a>
|
||||||
@ -25,16 +29,18 @@
|
|||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div class="flex min-h-screen {% if not loggedin_user and not show_kiosk_header %} items-center dark:bg-primary-900 {% else %} items-start {% endif %} justify-center px-4 py-12 sm:px-6 lg:px-8">
|
|
||||||
{% block content %}
|
<div class="flex min-h-screen {%if not loggedin_user and not show_kiosk_header %} items-center dark:bg-primary-900 {% else %} items-start {% endif %} justify-center px-4 py-12 sm:px-6 lg:px-8"> {% block content %}{% endblock content %}
|
||||||
{% endblock content %}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% if loggedin_user %}
|
{% if loggedin_user %}
|
||||||
{% include "includes/footer" %}
|
{% include "includes/footer" %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% include "dynamics/sidebar" %}
|
{% include "dynamics/sidebar" %}
|
||||||
|
|
||||||
<script src="/public/main.js"></script>
|
<script src="/public/main.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,107 +1,87 @@
|
|||||||
{% import "includes/macros" as macros %}
|
{% import "includes/macros" as macros %}
|
||||||
{% import "includes/forms/log" as log %}
|
{% import "includes/forms/log" as log %}
|
||||||
|
|
||||||
{% extends "base" %}
|
{% extends "base" %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="max-w-screen-lg w-full">
|
|
||||||
|
<div class="max-w-screen-lg w-full">
|
||||||
<h1 class="h1">Bootschäden</h1>
|
<h1 class="h1">Bootschäden</h1>
|
||||||
{% if flash %}{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3 mt-3") }}{% endif %}
|
|
||||||
|
{% if flash %}
|
||||||
|
{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3 mt-3") }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<h2 class="text-md font-bold tracking-wide bg-primary-900 mt-3 p-3 text-white flex justify-between items-center rounded-md">
|
<h2 class="text-md font-bold tracking-wide bg-primary-900 mt-3 p-3 text-white flex justify-between items-center rounded-md">
|
||||||
Neuen Schaden
|
Neuen Schaden
|
||||||
<a href="#"
|
|
||||||
class="inline-flex justify-center rounded-md bg-primary-600 mx-1 px-3 py-2 text-sm font-semibold text-white hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 cursor-pointer"
|
<a href="#" class="inline-flex justify-center rounded-md bg-primary-600 mx-1 px-3 py-2 text-sm font-semibold text-white hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 cursor-pointer"
|
||||||
data-sidebar="true"
|
data-sidebar="true" data-trigger="sidebar" data-header="Neuen Schaden anlegen" data-body="#new-damage">
|
||||||
data-trigger="sidebar"
|
|
||||||
data-header="Neuen Schaden anlegen"
|
|
||||||
data-body="#new-damage">
|
|
||||||
{% include "includes/plus-icon" %}
|
{% include "includes/plus-icon" %}
|
||||||
<span class="sr-only">Neuen Schaden eintragen</span>
|
<span class="sr-only">Neuen Schaden eintragen</span>
|
||||||
</a>
|
</a>
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<div class="hidden">
|
<div class="hidden">
|
||||||
<div id="new-damage">
|
<div id="new-damage">
|
||||||
<form action="/boatdamage" method="post" class="grid gap-3">
|
<form action="/boatdamage" method="post" class="grid gap-3">
|
||||||
{{ log::boat_select(only_ones=false, id='boat') }}
|
{{ log::boat_select(only_ones=false, id='boat') }}
|
||||||
{% if not loggedin_user %}{{ macros::select(label='Gemeldet von', data=user, name='user_id') }}{% endif %}
|
{% if not loggedin_user %}
|
||||||
|
{{ macros::select(label='Gemeldet von', data=user, name='user_id') }}
|
||||||
|
{% endif %}
|
||||||
{{ macros::input(label='Beschreibung des Schadens', name='desc', type='text', required=true, wrapper_class='col-span-4') }}
|
{{ macros::input(label='Beschreibung des Schadens', name='desc', type='text', required=true, wrapper_class='col-span-4') }}
|
||||||
<div class="col-span-4">
|
<div class="col-span-4">
|
||||||
{{ macros::checkbox(label='Boot sperren', name='lock_boat', type='text', required=true) }}
|
{{ macros::checkbox(label='Boot sperren', name='lock_boat', type='text', required=true) }}
|
||||||
</div>
|
</div>
|
||||||
<input type="submit"
|
<input type="submit" class="btn btn-primary w-full col-span-4" value="Schaden eintragen" />
|
||||||
class="btn btn-primary w-full col-span-4"
|
|
||||||
value="Schaden eintragen" />
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="search-wrapper">
|
<div class="search-wrapper">
|
||||||
<label for="name" class="sr-only">Suche</label>
|
<label for="name" class="sr-only">Suche</label>
|
||||||
<input type="search"
|
<input type="search" name="name" id="filter-js" class="search-bar" placeholder="Suchen nach Namen...">
|
||||||
name="name"
|
|
||||||
id="filter-js"
|
|
||||||
class="search-bar"
|
|
||||||
placeholder="Suchen nach Namen...">
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="filter-result-js" class="search-result"></div>
|
<div id="filter-result-js" class="search-result"></div>
|
||||||
|
|
||||||
{% for boatdamage in boatdamages | sort(attribute="verified") %}
|
{% for boatdamage in boatdamages | sort(attribute="verified") %}
|
||||||
<div data-filterable="true"
|
<div data-filterable="true" data-filter="{{ boatdamage.boat.name }} {{ boatdamage.user_created.name }}" class="w-full border-t bg-white dark:bg-primary-900 text-black dark:text-white p-3 {% if boatdamage.verified_at %} opacity-50 {% endif %}">
|
||||||
data-filter="{{ boatdamage.boat.name }} {{ boatdamage.user_created.name }}"
|
|
||||||
class="w-full border-t bg-white dark:bg-primary-900 text-black dark:text-white p-3 {% if boatdamage.verified_at %}opacity-50{% endif %}">
|
|
||||||
<div class="w-full">
|
<div class="w-full">
|
||||||
<strong>{{ boatdamage.created_at | date(format='%d.%m.%Y') }} <span class="font-normal text-gray-600 dark:text-gray-100">({{ boatdamage.boat.name }})</span></strong>
|
<strong>{{ boatdamage.created_at | date(format='%d.%m.%Y') }} <span class="font-normal text-gray-600 dark:text-gray-100">({{ boatdamage.boat.name }})</span></strong>{% if boatdamage.boat.damage %}<small class="block text-gray-600 dark:text-gray-100">(Boot gesperrt)</small>{% endif %}
|
||||||
{% if boatdamage.boat.damage %}
|
|
||||||
<small class="block text-gray-600 dark:text-gray-100">(Boot gesperrt)</small>
|
|
||||||
{% endif %}
|
|
||||||
<div>{{ boatdamage.desc }}</div>
|
<div>{{ boatdamage.desc }}</div>
|
||||||
<small class="block text-gray-600 dark:text-gray-100">
|
<small class="block text-gray-600 dark:text-gray-100">
|
||||||
Schaden eingetragen von {{ boatdamage.user_created.name }} am/um {{ boatdamage.created_at | date(format='%d.%m.%Y (%H:%M)') }}
|
Schaden eingetragen von {{ boatdamage.user_created.name }} am/um {{ boatdamage.created_at | date(format='%d.%m.%Y (%H:%M)') }}
|
||||||
</small>
|
</small>
|
||||||
|
|
||||||
{% if boatdamage.fixed_at %}
|
{% if boatdamage.fixed_at %}
|
||||||
<small class="block text-gray-600 dark:text-gray-100">Repariert von {{ boatdamage.user_fixed.name }} am/um {{ boatdamage.fixed_at | date(format='%d.%m.%Y (%H:%M)') }}</small>
|
<small class="block text-gray-600 dark:text-gray-100">Repariert von {{ boatdamage.user_fixed.name }} am/um {{ boatdamage.fixed_at | date(format='%d.%m.%Y (%H:%M)') }}</small>
|
||||||
{% else %}
|
{% else %}
|
||||||
{% if loggedin_user and "cox" in loggedin_user.roles %}
|
{% if loggedin_user and "cox" in loggedin_user.roles %}
|
||||||
<form action="/boatdamage/{{ boatdamage.id }}/fixed"
|
<form action="/boatdamage/{{ boatdamage.id }}/fixed" method="post" class="flex justify-between mt-3">
|
||||||
method="post"
|
<input type="text" name="desc" value="{{ boatdamage.desc }}" class="grow input rounded-s" />
|
||||||
class="flex justify-between mt-3">
|
|
||||||
<input type="text"
|
|
||||||
name="desc"
|
|
||||||
value="{{ boatdamage.desc }}"
|
|
||||||
class="grow input rounded-s" />
|
|
||||||
{% if loggedin_user and "tech" in loggedin_user.roles %}
|
{% if loggedin_user and "tech" in loggedin_user.roles %}
|
||||||
<input type="submit"
|
<input type="submit" class="btn btn-primary" style="border-top-left-radius: 0; border-bottom-left-radius: 0;" value="Repariert und verifiziert" />
|
||||||
class="btn btn-primary"
|
|
||||||
style="border-top-left-radius: 0;
|
|
||||||
border-bottom-left-radius: 0"
|
|
||||||
value="Repariert und verifiziert" />
|
|
||||||
{% else %}
|
{% else %}
|
||||||
<input type="submit"
|
<input type="submit" class="btn btn-primary" style="border-top-left-radius: 0; border-bottom-left-radius: 0;" value="Repariert" />
|
||||||
class="btn btn-primary"
|
|
||||||
style="border-top-left-radius: 0;
|
|
||||||
border-bottom-left-radius: 0"
|
|
||||||
value="Repariert" />
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</form>
|
</form>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if boatdamage.verified_at %}
|
{% if boatdamage.verified_at %}
|
||||||
<small class="block text-gray-600 dark:text-gray-100">Verifziert von {{ boatdamage.user_verified.name }} am/um {{ boatdamage.verified_at | date(format='%d.%m.%Y (%H:%M)') }}</small>
|
<small class="block text-gray-600 dark:text-gray-100">Verifziert von {{ boatdamage.user_verified.name }} am/um {{ boatdamage.verified_at | date(format='%d.%m.%Y (%H:%M)') }}</small>
|
||||||
{% else %}
|
{% else %}
|
||||||
{% if loggedin_user and "tech" in loggedin_user.roles and boatdamage.fixed_at %}
|
{% if loggedin_user and "tech" in loggedin_user.roles and boatdamage.fixed_at %}
|
||||||
<form action="/boatdamage/{{ boatdamage.id }}/verified"
|
<form action="/boatdamage/{{ boatdamage.id }}/verified" method="post" class="flex justify-between mt-3">
|
||||||
method="post"
|
<input type="text" name="desc" value="{{ boatdamage.desc }}" class="grow input rounded-s"/>
|
||||||
class="flex justify-between mt-3">
|
<input type="submit" class="btn btn-dark" style="border-top-left-radius: 0; border-bottom-left-radius: 0;" value="Verifiziert" />
|
||||||
<input type="text"
|
|
||||||
name="desc"
|
|
||||||
value="{{ boatdamage.desc }}"
|
|
||||||
class="grow input rounded-s" />
|
|
||||||
<input type="submit"
|
|
||||||
class="btn btn-dark"
|
|
||||||
style="border-top-left-radius: 0;
|
|
||||||
border-bottom-left-radius: 0"
|
|
||||||
value="Verifiziert" />
|
|
||||||
</form>
|
</form>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
|
||||||
|
{% endblock content%}
|
||||||
|
@ -1,15 +1,16 @@
|
|||||||
<div class="sidebar slide-in from-right bg-white dark:bg-primary-950 dark:text-white"
|
<div class="sidebar slide-in from-right bg-white dark:bg-primary-950 dark:text-white" id="sidebar" aria-modal="false">
|
||||||
id="sidebar"
|
|
||||||
aria-modal="false">
|
|
||||||
<div class="bg-primary-900 text-white px-2 py-3 flex justify-between sidebar-header">
|
<div class="bg-primary-900 text-white px-2 py-3 flex justify-between sidebar-header">
|
||||||
<div>
|
<div>
|
||||||
<span class="ps-1 header-js">Überschrift (wird ersetzt)</span>
|
<span class="ps-1 header-js">
|
||||||
|
Überschrift (wird ersetzt)
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<button type="button"
|
<button type="button" title="Ausfahrt erstellen schließen" class="sidebar-close border-0 bg-primary-100 focus:bg-primary-50 text-black flex items-center justify-center transform rotate-45" data-trigger="sidebar">
|
||||||
title="Ausfahrt erstellen schließen"
|
{% include "includes/plus-icon" %}
|
||||||
class="sidebar-close border-0 bg-primary-100 focus:bg-primary-50 text-black flex items-center justify-center transform rotate-45"
|
</button>
|
||||||
data-trigger="sidebar">{% include "includes/plus-icon" %}</button>
|
</div>
|
||||||
|
<div class="body-js px-2 pt-2">
|
||||||
|
Formular wird ersetzt
|
||||||
</div>
|
</div>
|
||||||
<div class="body-js px-2 pt-2">Formular wird ersetzt</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="sidebar-overlay" data-trigger="sidebar"></div>
|
<div class="sidebar-overlay" data-trigger="sidebar"></div>
|
||||||
|
@ -1,40 +1,36 @@
|
|||||||
{% import "includes/macros" as macros %}
|
{% import "includes/macros" as macros %}
|
||||||
|
|
||||||
{% extends "base" %}
|
{% extends "base" %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="max-w-screen-lg w-full">
|
<div class="max-w-screen-lg w-full">
|
||||||
{% if flash %}{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}{% endif %}
|
{% if flash %}
|
||||||
|
{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<h1 class="h1">Aktuelle Woche</h1>
|
<h1 class="h1">Aktuelle Woche</h1>
|
||||||
<details>
|
<details>
|
||||||
<summary>Dirty Thirty</summary>
|
<summary>Dirty Thirty</summary>
|
||||||
<p>
|
<p>
|
||||||
<div class="border-r border-l">
|
<div class="border-r border-l">
|
||||||
{% for stat in thirty %}
|
{% for stat in thirty %}{% set names = stat.name | split(pat=" ") %}{% set lastname_index = names | length - 1 %}{% set lastname = names[lastname_index] %}{{ lastname }}	{% for name in names %}{% if loop.index != lastname_index +1 %}{{ name }} {% endif %}{% endfor %}	{{ stat.dob }}	{{ stat.weight }}	{{ stat.sex }}		DLI	{{ stat.result }}
|
||||||
{% set names = stat.name | split(pat=" ") %}{% set lastname_index = names | length - 1 %}{% set lastname = names[lastname_index] %}{{ lastname }}	
|
{% endfor %}
|
||||||
{% for name in names %}
|
|
||||||
{% if loop.index != lastname_index +1 %}{{ name }}{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
	{{ stat.dob }}	{{ stat.weight }}	{{ stat.sex }}		DLI	{{ stat.result }}
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
</div>
|
||||||
</p>
|
</p>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>Dirty Dozen</summary>
|
<summary>Dirty Dozen</summary>
|
||||||
<p>
|
<p>
|
||||||
<div class="border-r border-l">
|
<div class="border-r border-l">{% for stat in dozen %}
|
||||||
{% for stat in dozen %}
|
|
||||||
{% set names = stat.name | split(pat=" ") %}
|
{% set names = stat.name | split(pat=" ") %}
|
||||||
{% set lastname_index = names | length - 1 %}
|
{% set lastname_index = names | length - 1 %}
|
||||||
{% set lastname = names[lastname_index] %}
|
{% set lastname = names[lastname_index] %}
|
||||||
{{ lastname }};
|
{{ lastname }};{% for name in names %}{% if loop.index != lastname_index +1 %}{{ name }} {% endif %}{% endfor %};{{ stat.dob }};{{ stat.weight }};{{ stat.sex }};DLI;{{ stat.result }}<br />
|
||||||
{% for name in names %}
|
|
||||||
{% if loop.index != lastname_index +1 %}{{ name }}{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
;{{ stat.dob }};{{ stat.weight }};{{ stat.sex }};DLI;{{ stat.result }}
|
|
||||||
<br />
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</p>
|
</p>
|
||||||
</details>
|
</details>
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
|
||||||
|
{% endblock content%}
|
||||||
|
@ -1,69 +1,51 @@
|
|||||||
{% import "includes/macros" as macros %}
|
{% import "includes/macros" as macros %}
|
||||||
|
|
||||||
{% extends "base" %}
|
{% extends "base" %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="max-w-screen-lg w-full">
|
<div class="max-w-screen-lg w-full">
|
||||||
<h1 class="h1">Ergo Challenges</h1>
|
<h1 class="h1">Ergo Challenges</h1>
|
||||||
{% if flash %}{{ macros::alert(message=flash.1, type=flash.0, class="my-3") }}{% endif %}
|
|
||||||
|
{% if flash %}
|
||||||
|
{{ macros::alert(message=flash.1, type=flash.0, class="my-3") }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<div class="grid gap-3">
|
<div class="grid gap-3">
|
||||||
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5"
|
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5" role="alert">
|
||||||
role="alert">
|
|
||||||
<h2 class="h2">Ergo-Challenge?!</h2>
|
<h2 class="h2">Ergo-Challenge?!</h2>
|
||||||
<div class="text-sm p-3">
|
<div class="text-sm p-3">
|
||||||
<ul class="list-disc ms-2">
|
<ul class="list-disc ms-2">
|
||||||
<li class="py-1">
|
<li class="py-1"><a href="https://rudernlinz.at/termin" target="_blank" class="link-primary">Überblick der Challenges</a></li>
|
||||||
<a href="https://rudernlinz.at/termin"
|
<li class="py-1">Eintragung ist jederzeit möglich, alle Daten die bis Sonntag 23:59 hier hochgeladen wurden, werden gesammelt an die Ister Ergo Challenge geschickt
|
||||||
target="_blank"
|
<li class="py-1">Dienstag + Donnerstag → gemeinsames Training; bitte um <a href="/" class="link-primary">Anmeldung</a>, damit jeder einen Ergo hat</li>
|
||||||
class="link-primary">Überblick der Challenges</a>
|
<li class="py-1">Offizielle Ergebnisse: <a href="https://rudernlinz.at/dt" target="_blank" style="text-decoration: underline;">Dirty Thirty (rudernlinz.at/dt)</a> / <a href="https://rudernlinz.at/dd" target="_blank" style="text-decoration: underline;">Dirty Dozen (rudernlinz.at/dd)</a>, bei Fehlern direkt mit <a href="mailto:office@ergochallenge.at" style="text-decoration: underline;">Christian (Ister)</a> Kontakt aufnehmen</li>
|
||||||
</li>
|
<li class="py-1"><a href="https://cloud.rudernlinz.at/s/m7mPQdwSWscpaXT" target="_blank" class="link-primary">Noch mehr Infos zur Ergo-Challenge findest du hier</a></li>
|
||||||
<li class="py-1">
|
|
||||||
Eintragung ist jederzeit möglich, alle Daten die bis Sonntag 23:59 hier hochgeladen wurden, werden gesammelt an die Ister Ergo Challenge geschickt
|
|
||||||
<li class="py-1">
|
|
||||||
Dienstag + Donnerstag → gemeinsames Training; bitte um <a href="/" class="link-primary">Anmeldung</a>, damit jeder einen Ergo hat
|
|
||||||
</li>
|
|
||||||
<li class="py-1">
|
|
||||||
Offizielle Ergebnisse: <a href="https://rudernlinz.at/dt"
|
|
||||||
target="_blank"
|
|
||||||
style="text-decoration: underline">Dirty Thirty (rudernlinz.at/dt)</a> / <a href="https://rudernlinz.at/dd"
|
|
||||||
target="_blank"
|
|
||||||
style="text-decoration: underline">Dirty Dozen (rudernlinz.at/dd)</a>, bei Fehlern direkt mit <a href="mailto:office@ergochallenge.at"
|
|
||||||
style="text-decoration: underline">Christian (Ister)</a> Kontakt aufnehmen
|
|
||||||
</li>
|
|
||||||
<li class="py-1">
|
|
||||||
<a href="https://cloud.rudernlinz.at/s/m7mPQdwSWscpaXT"
|
|
||||||
target="_blank"
|
|
||||||
class="link-primary">Noch mehr Infos zur Ergo-Challenge findest du hier</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<details class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md p-2">
|
<details class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md p-2">
|
||||||
<summary class="cursor-pointer">Deine Daten</summary>
|
<summary class="cursor-pointer">Deine Daten</summary>
|
||||||
<div class="pt-3">
|
<div class="pt-3">
|
||||||
<p>
|
<p>
|
||||||
Folgende Daten hat der Ruderassistent von dir. Wenn diese nicht mehr aktuell sind, bitte gewünschte Änderungen an Philipp melden (Tel. nr siehe Signal, oder an <a href="mailto:it@rudernlinz.at"
|
Folgende Daten hat der Ruderassistent von dir. Wenn diese nicht mehr aktuell sind, bitte gewünschte Änderungen an Philipp melden (Tel. nr siehe Signal, oder an <a href="mailto:it@rudernlinz.at" class="text-primary-600 dark:text-primary-200 hover:text-primary-950 hover:dark:text-primary-300 underline" target="_blank">it@rudernlinz.at</a>).
|
||||||
class="text-primary-600 dark:text-primary-200 hover:text-primary-950 hover:dark:text-primary-300 underline"
|
<br /><br />
|
||||||
target="_blank">it@rudernlinz.at</a>).
|
|
||||||
<br />
|
|
||||||
<br />
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Geburtsdatum: {{ loggedin_user.dob }}</li>
|
<li>Geburtsdatum: {{ loggedin_user.dob }}</li>
|
||||||
<li>Gewicht: {{ loggedin_user.weight }} kg</li>
|
<li>Gewicht: {{ loggedin_user.weight}} kg</li>
|
||||||
<li>Geschlecht: {{ loggedin_user.sex }}</li>
|
<li>Geschlecht: {{ loggedin_user.sex}}</li>
|
||||||
</ul>
|
</ul>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</details>
|
</details>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow grid gap-3">
|
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow grid gap-3">
|
||||||
<h2 class="h2">
|
<h2 class="h2">Neuer Eintrag</h1>
|
||||||
Neuer Eintrag
|
|
||||||
</h1>
|
|
||||||
<details class="p-2">
|
<details class="p-2">
|
||||||
<summary class="cursor-pointer">Dirty Thirty</summary>
|
<summary class="cursor-pointer">Dirty Thirty</summary>
|
||||||
<div class="mt-3">
|
<div class="mt-3">
|
||||||
<form action="/ergo/thirty"
|
<form action="/ergo/thirty" class="grid gap-3" method="post" enctype="multipart/form-data">
|
||||||
class="grid gap-3"
|
|
||||||
method="post"
|
|
||||||
enctype="multipart/form-data">
|
|
||||||
<div>
|
<div>
|
||||||
<label for="user-thirty" class="text-sm text-gray-600 dark:text-gray-100">Ergo-Fahrer</label>
|
<label for="user-thirty" class="text-sm text-gray-600 dark:text-gray-100">Ergo-Fahrer</label>
|
||||||
<select name="user" id="user-thirty" class="input rounded-md">
|
<select name="user" id="user-thirty" class="input rounded-md">
|
||||||
@ -77,28 +59,24 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{ macros::input(label="Distanz [m]", name="result", required=true, type="number", class="input rounded-md") }}
|
{{ macros::input(label="Distanz [m]", name="result", required=true, type="number", class="input rounded-md") }}
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label for="file-thirty" class="text-sm text-gray-600 dark:text-gray-100">Ergebnis-Foto vom Ergo-Display</label>
|
<label for="file-thirty" class="text-sm text-gray-600 dark:text-gray-100">Ergebnis-Foto vom Ergo-Display</label>
|
||||||
<input type="file"
|
<input type="file" id="file-thirty" name="proof" class="input rounded-md" accept="image/*">
|
||||||
id="file-thirty"
|
|
||||||
name="proof"
|
|
||||||
class="input rounded-md"
|
|
||||||
accept="image/*">
|
|
||||||
</div>
|
</div>
|
||||||
<div class="text-end">
|
<div class="text-end">
|
||||||
<input type="submit" value="Speichern" class="btn btn-primary btn-fw m-auto" />
|
<input type="submit" value="Speichern" class="btn btn-primary btn-fw m-auto"/>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details class="p-2">
|
<details class="p-2">
|
||||||
<summary class="cursor-pointer">Dirty Dozen</summary>
|
<summary class="cursor-pointer">Dirty Dozen</summary>
|
||||||
<div class="mt-3">
|
<div class="mt-3">
|
||||||
<form action="/ergo/dozen"
|
<form action="/ergo/dozen" class="grid gap-3" method="post" enctype="multipart/form-data">
|
||||||
class="grid gap-3"
|
|
||||||
method="post"
|
|
||||||
enctype="multipart/form-data">
|
|
||||||
<div>
|
<div>
|
||||||
<label for="user-dozen" class="text-sm text-gray-600 dark:text-gray-100">Ergo-Fahrer</label>
|
<label for="user-dozen" class="text-sm text-gray-600 dark:text-gray-100">Ergo-Fahrer</label>
|
||||||
<select name="user" id="user-dozen" class="input rounded-md">
|
<select name="user" id="user-dozen" class="input rounded-md">
|
||||||
@ -112,86 +90,75 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{ macros::input(label="Zeit [hh:mm:ss.s] oder Distanz [m]", name="result", required=true, type="text", class="input rounded-md", pattern="(?:\d+:\d{2}:\d{2}\.\d+|\d{1,2}:\d{2}\.\d+|\d+(\.\d+)?)") }}
|
{{ macros::input(label="Zeit [hh:mm:ss.s] oder Distanz [m]", name="result", required=true, type="text", class="input rounded-md", pattern="(?:\d+:\d{2}:\d{2}\.\d+|\d{1,2}:\d{2}\.\d+|\d+(\.\d+)?)") }}
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label for="file-dozen" class="text-sm text-gray-600 dark:text-gray-100">Ergebnis-Foto vom Ergo-Display</label>
|
<label for="file-dozen" class="text-sm text-gray-600 dark:text-gray-100">Ergebnis-Foto vom Ergo-Display</label>
|
||||||
<input type="file"
|
<input type="file" id="file-dozen" name="proof" class="input rounded-md" accept="image/*">
|
||||||
id="file-dozen"
|
|
||||||
name="proof"
|
|
||||||
class="input rounded-md"
|
|
||||||
accept="image/*">
|
|
||||||
</div>
|
</div>
|
||||||
<div class="text-end">
|
<div class="text-end">
|
||||||
<input type="submit" value="Speichern" class="btn btn-primary btn-fw m-auto" />
|
<input type="submit" value="Speichern" class="btn btn-primary btn-fw m-auto"/>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</details>
|
</details>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow grid gap-3">
|
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow grid gap-3">
|
||||||
<h2 class="h2">Aktuelle Woche</h2>
|
<h2 class="h2">Aktuelle Woche</h2>
|
||||||
|
|
||||||
<details class="p-2">
|
<details class="p-2">
|
||||||
<summary class="cursor-pointer">
|
<summary class="cursor-pointer">Dirty Thirty <small class="text-gray-600 dark:text-white">({{thirty | length}})</small></summary>
|
||||||
Dirty Thirty <small class="text-gray-600 dark:text-white">({{ thirty | length }})</small>
|
|
||||||
</summary>
|
|
||||||
<div class="mt-3">
|
<div class="mt-3">
|
||||||
<ol>
|
<ol>
|
||||||
{% for stat in thirty %}
|
{% for stat in thirty %}
|
||||||
<li>
|
<li><strong>{{ stat.name }}:</strong> {{ stat.result }}</li>
|
||||||
<strong>{{ stat.name }}:</strong> {{ stat.result }}
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details class="p-2">
|
<details class="p-2">
|
||||||
<summary class="cursor-pointer">
|
<summary class="cursor-pointer">Dirty Dozen <small class="text-gray-600 dark:text-white">({{dozen | length}})</small></summary>
|
||||||
Dirty Dozen <small class="text-gray-600 dark:text-white">({{ dozen | length }})</small>
|
|
||||||
</summary>
|
|
||||||
<div class="mt-3">
|
<div class="mt-3">
|
||||||
<ol>
|
<ol>
|
||||||
{% for stat in dozen %}
|
{% for stat in dozen %}
|
||||||
<li>
|
<li><strong>{{ stat.name }}:</strong> {{ stat.result }}</li>
|
||||||
<strong>{{ stat.name }}:</strong> {{ stat.result }}
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
</details>
|
</details>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% if "admin" in loggedin_user.roles %}
|
{% if "admin" in loggedin_user.roles %}
|
||||||
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow grid gap-3">
|
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow grid gap-3">
|
||||||
<h2 class="h2">Update</h2>
|
<h2 class="h2">Update</h2>
|
||||||
|
|
||||||
<details class="p-2">
|
<details class="p-2">
|
||||||
<summary class="cursor-pointer">
|
<summary class="cursor-pointer">Dirty Thirty <small class="text-gray-600 dark:text-white">({{thirty | length}})</small></summary>
|
||||||
Dirty Thirty <small class="text-gray-600 dark:text-white">({{ thirty | length }})</small>
|
|
||||||
</summary>
|
|
||||||
<div class="mt-3">
|
<div class="mt-3">
|
||||||
<ol>
|
<ol>
|
||||||
{% for stat in thirty %}
|
{% for stat in thirty %}
|
||||||
<li>
|
<li>
|
||||||
<form action="/ergo/thirty/user/{{ stat.id }}/new" method="get">
|
<form action="/ergo/thirty/user/{{ stat.id }}/new" method="get">
|
||||||
{{ stat.name }}:
|
{{ stat.name }}: <input type="text" value="{{stat.result}}" name="new" style="color: black;"/><input type="submit"/>
|
||||||
<input type="text" value="{{ stat.result }}" name="new" style="color: black" />
|
|
||||||
<input type="submit" />
|
|
||||||
</form>
|
</form>
|
||||||
</li>
|
</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details class="p-2">
|
<details class="p-2">
|
||||||
<summary class="cursor-pointer">
|
<summary class="cursor-pointer">Dirty Dozen <small class="text-gray-600 dark:text-white">({{dozen | length}})</small></summary>
|
||||||
Dirty Dozen <small class="text-gray-600 dark:text-white">({{ dozen | length }})</small>
|
|
||||||
</summary>
|
|
||||||
<div class="mt-3">
|
<div class="mt-3">
|
||||||
<ol>
|
<ol>
|
||||||
{% for stat in dozen %}
|
{% for stat in dozen %}
|
||||||
<li>
|
<li>
|
||||||
<form action="/ergo/dozen/user/{{ stat.id }}/new" method="get">
|
<form action="/ergo/dozen/user/{{ stat.id }}/new" method="get">
|
||||||
{{ stat.name }}:
|
{{ stat.name }}: <input type="text" value="{{stat.result}}" name="new" style="color: black;"/><input type="submit"/>
|
||||||
<input type="text" value="{{ stat.result }}" name="new" style="color: black" />
|
|
||||||
<input type="submit" />
|
|
||||||
</form>
|
</form>
|
||||||
</li>
|
</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
@ -203,4 +170,5 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
|
||||||
|
{% endblock content%}
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
{% import "includes/macros" as macros %}
|
{% import "includes/macros" as macros %}
|
||||||
|
|
||||||
<div class="hidden">
|
<div class="hidden">
|
||||||
<form action="/admin/planned-event"
|
<form action="/admin/planned-event" method="post" class="grid gap-3" id="addEventForm">
|
||||||
method="post"
|
<input class="day-js" type="hidden" name="tripdetails.day" value=""/>
|
||||||
class="grid gap-3"
|
|
||||||
id="addEventForm">
|
|
||||||
<input class="day-js" type="hidden" name="tripdetails.day" value="" />
|
|
||||||
{{ macros::input(label='Titel (z.B. Firmenrudern)', name='name', type='input', required=true) }}
|
{{ macros::input(label='Titel (z.B. Firmenrudern)', name='name', type='input', required=true) }}
|
||||||
{{ macros::input(label='Startzeit', name='tripdetails.planned_starting_time', type='time', required=true) }}
|
{{ macros::input(label='Startzeit', name='tripdetails.planned_starting_time', type='time', required=true) }}
|
||||||
{{ macros::input(label='Anzahl Steuerleute', name='planned_amount_cox', type='number', required=true, min='0') }}
|
{{ macros::input(label='Anzahl Steuerleute', name='planned_amount_cox', type='number', required=true, min='0') }}
|
||||||
@ -13,6 +11,7 @@
|
|||||||
{{ macros::checkbox(label='Immer anzeigen', name='tripdetails.always_show') }}
|
{{ macros::checkbox(label='Immer anzeigen', name='tripdetails.always_show') }}
|
||||||
{{ macros::input(label='Anmerkungen', name='tripdetails.notes', type='input') }}
|
{{ macros::input(label='Anmerkungen', name='tripdetails.notes', type='input') }}
|
||||||
{{ macros::select(label='Typ', data=trip_types, name='tripdetails.trip_type', default='Reguläre Ausfahrt') }}
|
{{ macros::select(label='Typ', data=trip_types, name='tripdetails.trip_type', default='Reguläre Ausfahrt') }}
|
||||||
<input value="Erstellen" class="w-full btn btn-primary" type="submit" />
|
|
||||||
|
<input value="Erstellen" class="w-full btn btn-primary" type="submit"/>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,13 +1,15 @@
|
|||||||
{% import "includes/macros" as macros %}
|
{% import "includes/macros" as macros %}
|
||||||
|
|
||||||
<div class="hidden">
|
<div class="hidden">
|
||||||
<form action="/cox/trip" method="post" class="grid gap-3" id="sidebarForm">
|
<form action="/cox/trip" method="post" class="grid gap-3" id="sidebarForm">
|
||||||
<input class="day-js" type="hidden" name="day" value="" />
|
<input class="day-js" type="hidden" name="day" value=""/>
|
||||||
{{ macros::input(label='Startzeit (zB "10:00")', name='planned_starting_time', type='time', required=true) }}
|
{{ macros::input(label='Startzeit (zB "10:00")', name='planned_starting_time', type='time', required=true) }}
|
||||||
{{ macros::input(label='Anzahl Ruderer (ohne Steuerperson)', name='max_people', type='number', required=true, min='0') }}
|
{{ macros::input(label='Anzahl Ruderer (ohne Steuerperson)', name='max_people', type='number', required=true, min='0') }}
|
||||||
{{ macros::checkbox(label='Gäste erlauben', name='allow_guests') }}
|
{{ macros::checkbox(label='Gäste erlauben', name='allow_guests') }}
|
||||||
{{ macros::checkbox(label='Immer anzeigen', name='always_show') }}
|
{{ macros::checkbox(label='Immer anzeigen', name='always_show') }}
|
||||||
{{ macros::input(label='Anmerkungen', name='notes', type='input') }}
|
{{ macros::input(label='Anmerkungen', name='notes', type='input') }}
|
||||||
{{ macros::select(label='Typ', data=trip_types, name='trip_type', default='Reguläre Ausfahrt') }}
|
{{ macros::select(label='Typ', data=trip_types, name='trip_type', default='Reguläre Ausfahrt') }}
|
||||||
<input value="Erstellen" class="w-full btn btn-primary" type="submit" />
|
|
||||||
|
<input value="Erstellen" class="w-full btn btn-primary" type="submit"/>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,9 +1,4 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg"
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-journal" viewBox="0 0 16 16">
|
||||||
width="16"
|
<path d="M3 0h10a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2v-1h1v1a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v1H1V2a2 2 0 0 1 2-2z"/>
|
||||||
height="16"
|
<path d="M1 5v-.5a.5.5 0 0 1 1 0V5h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H1zm0 3v-.5a.5.5 0 0 1 1 0V8h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H1zm0 3v-.5a.5.5 0 0 1 1 0v.5h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H1z"/>
|
||||||
fill="currentColor"
|
|
||||||
class="bi bi-journal"
|
|
||||||
viewBox="0 0 16 16">
|
|
||||||
<path d="M3 0h10a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2v-1h1v1a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v1H1V2a2 2 0 0 1 2-2z" />
|
|
||||||
<path d="M1 5v-.5a.5.5 0 0 1 1 0V5h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H1zm0 3v-.5a.5.5 0 0 1 1 0V8h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H1zm0 3v-.5a.5.5 0 0 1 1 0v.5h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H1z" />
|
|
||||||
</svg>
|
</svg>
|
Before Width: | Height: | Size: 532 B After Width: | Height: | Size: 500 B |
@ -1,20 +1,10 @@
|
|||||||
{% if "cox" in loggedin_user.roles %}
|
{% if "cox" in loggedin_user.roles %}
|
||||||
<div class="sm:col-span-2 lg:col-span-3 grid md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-3">
|
<div class="sm:col-span-2 lg:col-span-3 grid md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-3">
|
||||||
<button type="button"
|
<button type="button" title="Toggle View" class="group btn btn-primary filter-trips-js" data-action="filter-days" id="filterdays-js" aria-pressed="false">
|
||||||
title="Toggle View"
|
|
||||||
class="group btn btn-primary filter-trips-js"
|
|
||||||
data-action="filter-days"
|
|
||||||
id="filterdays-js"
|
|
||||||
aria-pressed="false">
|
|
||||||
{% include "includes/funnel-icon" %}
|
{% include "includes/funnel-icon" %}
|
||||||
Tage mit Ausfahrten
|
Tage mit Ausfahrten
|
||||||
</button>
|
</button>
|
||||||
<button type="button"
|
<button type="button" title="Toggle View" class="group btn btn-primary filter-trips-js" data-action="filter-coxs" id="filtertrips-js" aria-pressed="false">
|
||||||
title="Toggle View"
|
|
||||||
class="group btn btn-primary filter-trips-js"
|
|
||||||
data-action="filter-coxs"
|
|
||||||
id="filtertrips-js"
|
|
||||||
aria-pressed="false">
|
|
||||||
{% include "includes/funnel-icon" %}
|
{% include "includes/funnel-icon" %}
|
||||||
Steuerleute gesucht
|
Steuerleute gesucht
|
||||||
</button>
|
</button>
|
||||||
|
@ -1,8 +1,3 @@
|
|||||||
<svg width="16"
|
<svg width="16" height="16" fill="currentColor" class="inline-block mr-1 h-3 w-3" viewbox="0 0 16 16" style="margin-top: -0.2rem;">
|
||||||
height="16"
|
<path d="M2 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v13.5a.5.5 0 0 1-.777.416L8 13.101l-5.223 2.815A.5.5 0 0 1 2 15.5V2zm2-1a1 1 0 0 0-1 1v12.566l4.723-2.482a.5.5 0 0 1 .554 0L13 14.566V2a1 1 0 0 0-1-1H4z"/>
|
||||||
fill="currentColor"
|
|
||||||
class="inline-block mr-1 h-3 w-3"
|
|
||||||
viewbox="0 0 16 16"
|
|
||||||
style="margin-top: -0.2rem">
|
|
||||||
<path d="M2 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v13.5a.5.5 0 0 1-.777.416L8 13.101l-5.223 2.815A.5.5 0 0 1 2 15.5V2zm2-1a1 1 0 0 0-1 1v12.566l4.723-2.482a.5.5 0 0 1 .554 0L13 14.566V2a1 1 0 0 0-1-1H4z" />
|
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 367 B After Width: | Height: | Size: 339 B |
@ -1,8 +1,4 @@
|
|||||||
<svg width="16"
|
<svg width="16" height="16" fill="currentColor" class="inline h-4 w-4" viewbox="0 0 16 16">
|
||||||
height="16"
|
<path d="M5.5 5.5A.5.5 0 0 1 6 6v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm2.5 0a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm3 .5a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0V6z"/>
|
||||||
fill="currentColor"
|
<path fill-rule="evenodd" d="M14.5 3a1 1 0 0 1-1 1H13v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V4h-.5a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1H6a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1h3.5a1 1 0 0 1 1 1v1zM4.118 4 4 4.059V13a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4.059L11.882 4H4.118zM2.5 3V2h11v1h-11z"/>
|
||||||
class="inline h-4 w-4"
|
|
||||||
viewbox="0 0 16 16">
|
|
||||||
<path d="M5.5 5.5A.5.5 0 0 1 6 6v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm2.5 0a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm3 .5a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0V6z" />
|
|
||||||
<path fill-rule="evenodd" d="M14.5 3a1 1 0 0 1-1 1H13v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V4h-.5a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1H6a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1h3.5a1 1 0 0 1 1 1v1zM4.118 4 4 4.059V13a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4.059L11.882 4H4.118zM2.5 3V2h11v1h-11z" />
|
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 568 B After Width: | Height: | Size: 540 B |
@ -2,30 +2,19 @@
|
|||||||
<div class="max-w-screen-xl w-full flex justify-between items-center">
|
<div class="max-w-screen-xl w-full flex justify-between items-center">
|
||||||
<div>
|
<div>
|
||||||
<span class="text-[#ff0000]">♥</span>
|
<span class="text-[#ff0000]">♥</span>
|
||||||
Erstellt vom ASKÖ Ruderverein Donau Linz <a onclick="alert('Wir suchen kreative und motivierte Köpfe, die diesen Ruderassistenten mitgestalten möchten. Das Backend ist in Rust (Rocket), das Frontend in TypeScript und Teraform, wobei wir mit dem Gedanken spielen, zu Svelte(Kit) zu wechseln.\n\nWenn du Lust hast, deine Skills in ein Projekt zu stecken, das Wellen schlagen wird, dann komm an Bord! Wir sind offen für frische Ideen, haben jedoch auch selber noch genügend; langweilig wird uns bestimmt nicht.\n\nWirf den Anker bei uns ausi und melde dich bei Marie oder Philipp oder it@rudernlinz.at – für eine Zukunft ohne optische Kenterung in Form von hässlichen Alerts ;)');"
|
Erstellt vom ASKÖ Ruderverein Donau Linz <a onclick="alert('Wir suchen kreative und motivierte Köpfe, die diesen Ruderassistenten mitgestalten möchten. Das Backend ist in Rust (Rocket), das Frontend in TypeScript und Teraform, wobei wir mit dem Gedanken spielen, zu Svelte(Kit) zu wechseln.\n\nWenn du Lust hast, deine Skills in ein Projekt zu stecken, das Wellen schlagen wird, dann komm an Bord! Wir sind offen für frische Ideen, haben jedoch auch selber noch genügend; langweilig wird uns bestimmt nicht.\n\nWirf den Anker bei uns ausi und melde dich bei Marie oder Philipp oder it@rudernlinz.at – für eine Zukunft ohne optische Kenterung in Form von hässlichen Alerts ;)');" style="text-decoration:underline">... und dir?</a>
|
||||||
style="text-decoration:underline">... und dir?</a>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<button id="theme-toggle-js"
|
<button id="theme-toggle-js" type="button" data-theme="light" class="btn btn-primary">
|
||||||
type="button"
|
|
||||||
data-theme="light"
|
|
||||||
class="btn btn-primary">
|
|
||||||
<span class="hidden dark:inline">
|
<span class="hidden dark:inline">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg"
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
||||||
width="16"
|
<path d="M8 11a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0 1a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0zm-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0zm9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707zM4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708z"/>
|
||||||
height="16"
|
|
||||||
fill="currentColor"
|
|
||||||
viewBox="0 0 16 16">
|
|
||||||
<path d="M8 11a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0 1a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0zm-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0zm9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707zM4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708z" />
|
|
||||||
</svg>
|
</svg>
|
||||||
</span>
|
</span>
|
||||||
<span class="inline dark:hidden">
|
<span class="inline dark:hidden">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg"
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
||||||
width="16"
|
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278zM4.858 1.311A7.269 7.269 0 0 0 1.025 7.71c0 4.02 3.279 7.276 7.319 7.276a7.316 7.316 0 0 0 5.205-2.162c-.337.042-.68.063-1.029.063-4.61 0-8.343-3.714-8.343-8.29 0-1.167.242-2.278.681-3.286z"/>
|
||||||
height="16"
|
|
||||||
fill="currentColor"
|
|
||||||
viewBox="0 0 16 16">
|
|
||||||
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278zM4.858 1.311A7.269 7.269 0 0 0 1.025 7.71c0 4.02 3.279 7.276 7.319 7.276a7.316 7.316 0 0 0 5.205-2.162c-.337.042-.68.063-1.029.063-4.61 0-8.343-3.714-8.343-8.29 0-1.167.242-2.278.681-3.286z" />
|
|
||||||
</svg>
|
</svg>
|
||||||
</span>
|
</span>
|
||||||
</button>
|
</button>
|
||||||
|
@ -2,12 +2,9 @@
|
|||||||
<div class="w-full">
|
<div class="w-full">
|
||||||
<h2 class="text-md font-bold tracking-wide bg-primary-900 mt-3 p-3 text-white flex justify-between items-center rounded-md">
|
<h2 class="text-md font-bold tracking-wide bg-primary-900 mt-3 p-3 text-white flex justify-between items-center rounded-md">
|
||||||
Neues Boot
|
Neues Boot
|
||||||
<a href="#"
|
|
||||||
class="inline-flex justify-center rounded-md bg-primary-600 mx-1 px-3 py-2 text-sm font-semibold text-white hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 cursor-pointer"
|
<a href="#" class="inline-flex justify-center rounded-md bg-primary-600 mx-1 px-3 py-2 text-sm font-semibold text-white hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 cursor-pointer"
|
||||||
data-sidebar="true"
|
data-sidebar="true" data-trigger="sidebar" data-header="Neues Boot anlegen" data-body="#new-boat">
|
||||||
data-trigger="sidebar"
|
|
||||||
data-header="Neues Boot anlegen"
|
|
||||||
data-body="#new-boat">
|
|
||||||
{% include "includes/plus-icon" %}
|
{% include "includes/plus-icon" %}
|
||||||
<span class="sr-only">Neues Boot anlegen</span>
|
<span class="sr-only">Neues Boot anlegen</span>
|
||||||
</a>
|
</a>
|
||||||
@ -23,41 +20,30 @@
|
|||||||
{{ macros::select(label="Besitzer", data=users, name='owner', default="Verein") }}
|
{{ macros::select(label="Besitzer", data=users, name='owner', default="Verein") }}
|
||||||
{{ macros::input(label='Default destination', name='default_destination', type='text') }}
|
{{ macros::input(label='Default destination', name='default_destination', type='text') }}
|
||||||
<div>
|
<div>
|
||||||
{{ macros::checkbox(label="handgesteuert", name="default_shipmaster_only_steering") }}
|
{{ macros::checkbox(label="handgesteuert", name="default_shipmaster_only_steering")}}
|
||||||
{{ macros::checkbox(label="Skull", name="skull", checked=true) }}
|
{{ macros::checkbox(label="Skull", name="skull", checked=true)}}
|
||||||
{{ macros::checkbox(label="Externes Boot (anderer Verein)", name="external") }}
|
{{ macros::checkbox(label="Externes Boot (anderer Verein)", name="external")}}
|
||||||
</div>
|
</div>
|
||||||
<input value="Hinzufügen"
|
<input value="Hinzufügen" type="submit" class="w-full mt-2 rounded-md bg-primary-500 px-3 py-2 text-sm font-semibold text-white hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 cursor-pointer"/>
|
||||||
type="submit"
|
|
||||||
class="w-full mt-2 rounded-md bg-primary-500 px-3 py-2 text-sm font-semibold text-white hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 cursor-pointer" />
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="search-wrapper">
|
<div class="search-wrapper">
|
||||||
<label for="name" class="sr-only">Suche</label>
|
<label for="name" class="sr-only">Suche</label>
|
||||||
<input type="search"
|
<input type="search" name="name" id="filter-js" class="search-bar" placeholder="Suchen nach Namen...">
|
||||||
name="name"
|
|
||||||
id="filter-js"
|
|
||||||
class="search-bar"
|
|
||||||
placeholder="Suchen nach Namen...">
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="filter-result-js" class="search-result"></div>
|
<div id="filter-result-js" class="search-result"></div>
|
||||||
{% endmacro new %}
|
{% endmacro new %}
|
||||||
|
|
||||||
|
|
||||||
{% macro edit(boat, uuid) %}
|
{% macro edit(boat, uuid) %}
|
||||||
<div data-filterable="true"
|
<div data-filterable="true" data-filter="{{ boat.name }}" class="w-full border-t">
|
||||||
data-filter="{{ boat.name }}"
|
<form action="/admin/boat/{{ boat.id }}" data-filterable="true" method="post" class="bg-white dark:bg-primary-900 p-4 w-full">
|
||||||
class="w-full border-t">
|
|
||||||
<form action="/admin/boat/{{ boat.id }}"
|
|
||||||
data-filterable="true"
|
|
||||||
method="post"
|
|
||||||
class="bg-white dark:bg-primary-900 p-4 w-full">
|
|
||||||
<div class="w-full">
|
<div class="w-full">
|
||||||
<input type="hidden" name="id" value="{{ boat.id }}" />
|
<input type="hidden" name="id" value="{{ boat.id }}"/>
|
||||||
<div class="font-bold mb-1 text-black dark:text-white">
|
<div class="font-bold mb-1 text-black dark:text-white">{{ boat.name }}<br/></div>
|
||||||
{{ boat.name }}
|
|
||||||
<br />
|
|
||||||
</div>
|
|
||||||
<div class="grid md:grid-cols-3 gap-3">
|
<div class="grid md:grid-cols-3 gap-3">
|
||||||
{{ macros::input(label='Name', name='name', type='text', value=boat.name) }}
|
{{ macros::input(label='Name', name='name', type='text', value=boat.name) }}
|
||||||
{{ macros::input(label='Plätze', name='amount_seats', type='number', min=0, value=boat.amount_seats) }}
|
{{ macros::input(label='Plätze', name='amount_seats', type='number', min=0, value=boat.amount_seats) }}
|
||||||
@ -72,13 +58,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-right mt-3">
|
<div class="text-right mt-3">
|
||||||
<a href="/admin/boat/{{ boat.id }}/delete"
|
<a href="/admin/boat/{{ boat.id }}/delete" class="inline-block btn btn-alert" onclick="return confirm('Wirklich löschen?');">
|
||||||
class="inline-block btn btn-alert"
|
|
||||||
onclick="return confirm('Wirklich löschen?');">
|
|
||||||
{% include "includes/delete-icon" %}
|
{% include "includes/delete-icon" %}
|
||||||
Löschen
|
Löschen
|
||||||
</a>
|
</a>
|
||||||
<input value="Ändern" type="submit" class="w-28 btn btn-primary" />
|
<input value="Ändern" type="submit" class="w-28 btn btn-primary"/>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -9,26 +9,22 @@
|
|||||||
<strong>{{ amount_seats }}x</strong>
|
<strong>{{ amount_seats }}x</strong>
|
||||||
</div>
|
</div>
|
||||||
{% for boat in grouped_boats %}
|
{% for boat in grouped_boats %}
|
||||||
<div id="boat-{{ boat.id }}"
|
<div id="boat-{{ boat.id }}" class="px-3 boats-js text-black dark:text-white {% if boat.damage != 'locked' and not boat.on_water %} cursor-pointer hover:text-primary-900 dark:hover:text-gray-100 {% endif %}" {% if boat.damage != 'locked' and not boat.on_water %} data-seats="{{boat.amount_seats}}" data-default_shipmaster_only_steering="{{boat.default_shipmaster_only_steering}}" data-default-destination="{{boat.default_destination}}" data-onclick="true" {% endif %} data-id="{{ boat.id }}">
|
||||||
class="px-3 boats-js text-black dark:text-white {% if boat.damage != 'locked' and not boat.on_water %} cursor-pointer hover:text-primary-900 dark:hover:text-gray-100 {% endif %}"
|
|
||||||
{% if boat.damage != 'locked' and not boat.on_water %} data-seats="{{ boat.amount_seats }}" data-default_shipmaster_only_steering="{{ boat.default_shipmaster_only_steering }}" data-default-destination="{{ boat.default_destination }}" data-onclick="true" {% endif %}
|
|
||||||
data-id="{{ boat.id }}">
|
|
||||||
<span class="status-damage status-damage-{{ boat.damage }}"></span>
|
<span class="status-damage status-damage-{{ boat.damage }}"></span>
|
||||||
<span {% if boat.damage == 'locked' or boat.on_water %}class="opacity-50"{% endif %}>{{ boat.name }}
|
<span {% if boat.damage == 'locked' or boat.on_water %} class="opacity-50" {% endif %}>{{ boat.name }}
|
||||||
{% if boat.owner %}<span class="opacity-50">(privat)</span>{% endif %}
|
{% if boat.owner %}
|
||||||
|
<span class="opacity-50">(privat)</span>
|
||||||
|
{% endif %}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endmacro show_boats %}
|
{% endmacro show_boats %}
|
||||||
|
|
||||||
{# Shows the form for creating a new logbook entry. #}
|
{# Shows the form for creating a new logbook entry. #}
|
||||||
{% macro new(shipmaster) %}
|
{% macro new(shipmaster) %}
|
||||||
<form action="/log"
|
<form action="/log" method="post" id="form" class="grid grid-cols-4 gap-3" onsubmit="Array.from(this.elements).forEach(e=>!e.value.trim()&&(e.disabled=true));">
|
||||||
method="post"
|
|
||||||
id="form"
|
|
||||||
class="grid grid-cols-4 gap-3"
|
|
||||||
onsubmit="Array.from(this.elements).forEach(e=>!e.value.trim()&&(e.disabled=true));">
|
|
||||||
{{ log::boat_select() }}
|
{{ log::boat_select() }}
|
||||||
<div class="col-span-4 md:col-span-1">
|
<div class="col-span-4 md:col-span-1">
|
||||||
<div class="text-sm text-gray-600 dark:text-gray-100">Bootssteuerung</div>
|
<div class="text-sm text-gray-600 dark:text-gray-100">Bootssteuerung</div>
|
||||||
@ -43,16 +39,10 @@
|
|||||||
{{ macros::input(label='Ankunftszeit', name='arrival', type='datetime-local', wrapper_class='col-span-2') }}
|
{{ macros::input(label='Ankunftszeit', name='arrival', type='datetime-local', wrapper_class='col-span-2') }}
|
||||||
<div class="relative col-span-2">
|
<div class="relative col-span-2">
|
||||||
<label for="destination" class="text-sm text-gray-600 dark:text-gray-100">Ziel</label>
|
<label for="destination" class="text-sm text-gray-600 dark:text-gray-100">Ziel</label>
|
||||||
<input class="input rounded-md set-distance-js"
|
<input class="input rounded-md set-distance-js" type="search" list="destinations" placeholder="Destination" id="destination" name="destination" value="" data-relation="distance_in_km"/>
|
||||||
type="search"
|
|
||||||
list="destinations"
|
|
||||||
placeholder="Destination"
|
|
||||||
id="destination"
|
|
||||||
name="destination"
|
|
||||||
value=""
|
|
||||||
data-relation="distance_in_km" />
|
|
||||||
<datalist id="destinations">
|
<datalist id="destinations">
|
||||||
{% for distance in distances %}<option value="{{ distance.0 }}" distance="{{ distance.1 }}" />{% endfor %}
|
{% for distance in distances %}<option value="{{ distance.0 }}" distance="{{ distance.1 }}" />
|
||||||
|
{% endfor %}
|
||||||
</datalist>
|
</datalist>
|
||||||
</div>
|
</div>
|
||||||
<div class="relative col-span-2">
|
<div class="relative col-span-2">
|
||||||
@ -61,21 +51,20 @@
|
|||||||
</div>
|
</div>
|
||||||
{{ macros::input(label="Kommentar", name="comments", type="text", wrapper_class="col-span-4") }}
|
{{ macros::input(label="Kommentar", name="comments", type="text", wrapper_class="col-span-4") }}
|
||||||
{{ macros::select(label="Typ", data=logtypes, name='logtype', default="Normal", wrapper_class="col-span-4") }}
|
{{ macros::select(label="Typ", data=logtypes, name='logtype', default="Normal", wrapper_class="col-span-4") }}
|
||||||
<input type="submit"
|
<input type="submit" value="Ausfahrt eintragen" class="btn btn-primary w-full col-span-4 m-auto"/>
|
||||||
value="Ausfahrt eintragen"
|
|
||||||
class="btn btn-primary w-full col-span-4 m-auto" />
|
|
||||||
</form>
|
</form>
|
||||||
{% endmacro new %}
|
{% endmacro new %}
|
||||||
|
|
||||||
|
|
||||||
{% macro boat_select(id="boat_id") %}
|
{% macro boat_select(id="boat_id") %}
|
||||||
{{ macros::select(label="Boot", data=boats, name="boat_id", id=id, display=["name", " (","amount_seats", " x)"], extras=["default_shipmaster_only_steering", "amount_seats", "on_water", "default_destination"], wrapper_class="col-span-4", show_seats=true) }}
|
{{ macros::select(label="Boot", data=boats, name="boat_id", id=id, display=["name", " (","amount_seats", " x)"], extras=["default_shipmaster_only_steering", "amount_seats", "on_water", "default_destination"], wrapper_class="col-span-4", show_seats=true) }}
|
||||||
{% endmacro boat_select %}
|
{% endmacro boat_select %}
|
||||||
|
|
||||||
{% macro rower_select(id, selected, amount_seats='', class='', init='false', cox_on_boat='', steering_person_id='') %}
|
{% macro rower_select(id, selected, amount_seats='', class='', init='false', cox_on_boat='', steering_person_id='') %}
|
||||||
{#{% if not amount_seats or amount_seats > 1 %}#}
|
{#{% if not amount_seats or amount_seats > 1 %}#}
|
||||||
<div class="{{ class }}">
|
<div class="{{ class }}">
|
||||||
<label for="{{ id }}" class="text-sm text-gray-600 dark:text-gray-100">
|
<label for="{{id}}" class="text-sm text-gray-600 dark:text-gray-100">Ruderer (inkl. Schiffsführer und Steuerperson)</label>
|
||||||
Ruderer (inkl. Schiffsführer und Steuerperson)
|
<select style="width: 100%;" multiple name="rowers[]" id="{{id}}" class="w-full" data-seats="{{amount_seats}}" data-init={{init}}>
|
||||||
</label>
|
|
||||||
<select style="width: 100%;" multiple name="rowers[]" id="{{ id }}" class="w-full" data-seats="{{ amount_seats }}" data-init={{ init }}>
|
|
||||||
{% for user in users %}
|
{% for user in users %}
|
||||||
{% set_global sel = false %}
|
{% set_global sel = false %}
|
||||||
{% for rower in selected %}
|
{% for rower in selected %}
|
||||||
@ -83,21 +72,21 @@
|
|||||||
{% set_global sel = true %}
|
{% set_global sel = true %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<option value="{{ user.id }}"
|
<option value="{{ user.id }}" {% if sel %} selected {% endif %} {% if user.on_water %} disabled="disabled" {% endif %} data-custom-properties='{"is_cox": {{ "cox" in user.roles }}, "is_racing": {{ "Rennrudern" in user.roles }}, "steers": {{ user.id == steering_person_id }}, "cox_on_boat": {{ user.id == cox_on_boat}}}'>
|
||||||
{% if sel %}selected{% endif %}
|
{{user.name}}
|
||||||
{% if user.on_water %}disabled="disabled"{% endif %}
|
{% if user.on_water %}
|
||||||
data-custom-properties='{"is_cox": {{ "cox" in user.roles }}, "is_racing": {{ "Rennrudern" in user.roles }}, "steers": {{ user.id == steering_person_id }}, "cox_on_boat": {{ user.id == cox_on_boat }}}'>
|
(am Wasser)
|
||||||
{{ user.name }}
|
{% endif %}
|
||||||
{% if user.on_water %}(am Wasser){% endif %}
|
|
||||||
</option>
|
</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
{#{% endif %}#}
|
{#{% endif %}#}
|
||||||
{% endmacro rower_select %}
|
{% endmacro rower_select %}
|
||||||
|
|
||||||
{% macro show(log, state, allowed_to_close=false) %}
|
{% macro show(log, state, allowed_to_close=false) %}
|
||||||
<div class="grid grid-cols-1 gap-3 mb-3 w-full">
|
<div class="grid grid-cols-1 gap-3 mb-3 w-full">
|
||||||
<div class="pt-2 px-3 {% if not loop.first %}border-t{% endif %}">
|
<div class="pt-2 px-3 {% if not loop.first %} border-t {% endif %}">
|
||||||
<div class="w-full">
|
<div class="w-full">
|
||||||
<div class="flex justify-between items-center">
|
<div class="flex justify-between items-center">
|
||||||
<div>
|
<div>
|
||||||
@ -105,56 +94,46 @@
|
|||||||
{{ log.departure | date(format="%H:%M") }}
|
{{ log.departure | date(format="%H:%M") }}
|
||||||
Uhr
|
Uhr
|
||||||
</strong>
|
</strong>
|
||||||
<a href="#"
|
<a href="#" data-sidebar="true" data-trigger="sidebar" data-header="<strong>{{ log.departure | date(format="%H:%M") }} Uhr</strong> ({{ log.boat.name }})" data-body="#log{{ log.id }}" class="text-sm link-primary break-all">
|
||||||
data-sidebar="true"
|
{{ log.boat.name }}
|
||||||
data-trigger="sidebar"
|
</a>
|
||||||
data-header="<strong>{{ log.departure | date(format="%H:%M") }} Uhr</strong> ({{ log.boat.name }})"
|
|
||||||
data-body="#log{{ log.id }}"
|
|
||||||
class="text-sm link-primary break-all">{{ log.boat.name }}</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{% if allowed_to_close and state == "on_water" %}
|
{% if allowed_to_close and state == "on_water" %}
|
||||||
<a href="#"
|
<a href="#" data-sidebar="true" data-trigger="sidebar" data-header="<strong>{{ log.departure | date(format="%H:%M") }} Uhr</strong> ({{ log.boat.name }})" data-body="#close{{ log.id }}" class="border-0 btn btn-dark text-white flex items-center justify-center ml-3">
|
||||||
data-sidebar="true"
|
|
||||||
data-trigger="sidebar"
|
|
||||||
data-header="<strong>{{ log.departure | date(format="%H:%M") }} Uhr</strong> ({{ log.boat.name }})"
|
|
||||||
data-body="#close{{ log.id }}"
|
|
||||||
class="border-0 btn btn-dark text-white flex items-center justify-center ml-3">
|
|
||||||
{% include "includes/pencil" %}
|
{% include "includes/pencil" %}
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="hidden">
|
<div class="hidden">
|
||||||
{% if allowed_to_close and state == "on_water" %}
|
{% if allowed_to_close and state == "on_water" %}
|
||||||
<div id="close{{ log.id }}">{{ log::home(log=log) }}</div>
|
<div id="close{{ log.id }}">
|
||||||
<div>LÖSCHEN</div>
|
{{ log::home(log=log) }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
LÖSCHEN
|
||||||
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div id="log{{ log.id }}">
|
<div id="log{{ log.id }}">
|
||||||
{% if log.destination %}{{ log.destination }}{% endif %}
|
{% if log.destination %}
|
||||||
{% for rower in log.rowers %}
|
{{ log.destination }}
|
||||||
<p>
|
|
||||||
{{ rower.name }}
|
|
||||||
{% if rower.id == log.shipmaster or rower.id == log.steering_person %}
|
|
||||||
<small class="text-gray-600 dark:text-primary-100">(
|
|
||||||
{% if rower.id == log.shipmaster %}Schiffsführer{% endif %}
|
|
||||||
{% if rower.id == log.shipmaster and rower.id == log.steering_person %}/{% endif %}
|
|
||||||
{% if rower.id == log.steering_person %}Steuerperson{% endif %}
|
|
||||||
)</small>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</p>
|
|
||||||
|
{% for rower in log.rowers %}
|
||||||
|
<p>{{ rower.name }} {% if rower.id == log.shipmaster or rower.id == log.steering_person %}<small class="text-gray-600 dark:text-primary-100">({% if rower.id == log.shipmaster %}Schiffsführer{% endif %}{% if rower.id == log.shipmaster and rower.id == log.steering_person %}/{% endif %}{% if rower.id == log.steering_person%}Steuerperson{% endif %})</small>{% endif %}</p>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
{% set amount_rowers = log.rowers | length %}
|
{% set amount_rowers = log.rowers | length %}
|
||||||
{% set amount_guests = log.boat.amount_seats - amount_rowers %}
|
{% set amount_guests = log.boat.amount_seats - amount_rowers -1 %}
|
||||||
{% if amount_guests > 0 %}
|
{% if amount_guests > 0 %}
|
||||||
Gäste <small class="text-gray-600">(ohne Account)</small>:
|
Gäste <small class="text-gray-600">(ohne Account)</small>:
|
||||||
{{ amount_guests }}
|
{{ amount_guests }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if allowed_to_close and state == "on_water" %}
|
{% if allowed_to_close and state == "on_water" %}
|
||||||
<a href="/log/{{ log.id }}/delete"
|
<a href="/log/{{ log.id }}/delete" class="btn btn-alert w-full absolute bottom-0 left-0" style="border-radius: 0;" onclick="return confirm('Willst du diesen Eintrag wirklich löschen? Die Daten gehen verloren');">Löschen</a>
|
||||||
class="btn btn-alert w-full absolute bottom-0 left-0"
|
|
||||||
style="border-radius: 0"
|
|
||||||
onclick="return confirm('Willst du diesen Eintrag wirklich löschen? Die Daten gehen verloren');">Löschen</a>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -162,10 +141,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endmacro show %}
|
{% endmacro show %}
|
||||||
|
|
||||||
{% macro show_old(log, state, allowed_to_close=false, index) %}
|
{% macro show_old(log, state, allowed_to_close=false, index) %}
|
||||||
<div class="border-t bg-white dark:bg-primary-900 py-3 px-4 relative"
|
<div class="border-t bg-white dark:bg-primary-900 py-3 px-4 relative" data-filterable="true" data-filter="{{ log.boat.name }} {% for rower in log.rowers %} {{ rower.name }} {% endfor %}">
|
||||||
data-filterable="true"
|
|
||||||
data-filter="{{ log.boat.name }} {% for rower in log.rowers %}{{ rower.name }}{% endfor %}">
|
|
||||||
{% if log.logtype %}
|
{% if log.logtype %}
|
||||||
<div class="absolute top-0 right-0 bg-primary-100 rounded-bl-md text-primary-950 text-xs w-32 px-2 py-1 text-center font-bold">
|
<div class="absolute top-0 right-0 bg-primary-100 rounded-bl-md text-primary-950 text-xs w-32 px-2 py-1 text-center font-bold">
|
||||||
{% if log.logtype == 1 %}
|
{% if log.logtype == 1 %}
|
||||||
@ -179,18 +157,14 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div {% if log.logtype %}class="mt-4 sm:mt-0"{% endif %}>
|
<div {% if log.logtype %} class="mt-4 sm:mt-0" {% endif %}>
|
||||||
<strong class="text-black dark:text-white">{{ log.boat.name }}</strong> <small class="text-gray-600 dark:text-gray-100">({{ log.shipmaster_user.name -}}
|
<strong class="text-black dark:text-white">{{ log.boat.name }}</strong> <small class="text-gray-600 dark:text-gray-100">({{ log.shipmaster_user.name }}{% if log.shipmaster_only_steering %} - handgesteuert {% endif %})</small>
|
||||||
{% if log.shipmaster_only_steering %}- handgesteuert{% endif -%}
|
|
||||||
)</small>
|
|
||||||
<small class="block text-gray-600 dark:text-gray-100">
|
<small class="block text-gray-600 dark:text-gray-100">
|
||||||
|
|
||||||
{% if state == "completed" and log.departure | date(format='%d.%m.%Y') == log.arrival | date(format='%d.%m.%Y') %}
|
{% if state == "completed" and log.departure | date(format='%d.%m.%Y') == log.arrival | date(format='%d.%m.%Y') %}
|
||||||
{{ log.departure | date(format='%d.%m.%Y') }} ({{ log.departure | date(format='%H:%M') }} - {{ log.arrival | date(format='%H:%M') }})
|
{{ log.departure | date(format='%d.%m.%Y')}} ({{ log.departure | date(format='%H:%M')}} - {{ log.arrival | date(format='%H:%M')}})
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ log.departure | date(format='%d.%m.%Y (%H:%M)') }}
|
{{ log.departure | date(format='%d.%m.%Y (%H:%M)') }} {% if state == "completed" %}- {{ log.arrival | date(format='%d.%m.%Y (%H:%M)') }}{% endif %}
|
||||||
{% if state == "completed" %}
|
|
||||||
- {{ log.arrival | date(format='%d.%m.%Y (%H:%M)') }}
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</small>
|
</small>
|
||||||
{% set amount_rowers = log.rowers | length %}
|
{% set amount_rowers = log.rowers | length %}
|
||||||
@ -203,14 +177,16 @@
|
|||||||
{% if state == "completed" %}
|
{% if state == "completed" %}
|
||||||
<small class="text-gray-600 dark:text-gray-100">({{ log.distance_in_km }} km)</small>
|
<small class="text-gray-600 dark:text-gray-100">({{ log.distance_in_km }} km)</small>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if log.comments %}<span class="text-sm italic">- "{{ log.comments }}"</span>{% endif %}
|
|
||||||
|
{% if log.comments %}
|
||||||
|
<span class="text-sm italic">- "{{ log.comments }}"</span>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% if amount_guests > 0 or log.rowers | length > 0 %}
|
{% if amount_guests > 0 or log.rowers | length > 0 %}
|
||||||
<div class="text-sm text-gray-600 dark:text-gray-100">
|
<div class="text-sm text-gray-600 dark:text-gray-100">
|
||||||
Ruderer:
|
Ruderer:
|
||||||
{% for rower in log.rowers -%}
|
{% for rower in log.rowers %}
|
||||||
{{ rower.name -}}
|
{{ rower.name }}{% if not loop.last or amount_guests > 0 and log.boat.name != 'Externes Boot' %}, {% endif %}
|
||||||
{% if not loop.last or amount_guests > 0 and log.boat.name != 'Externes Boot' %},{% endif %}
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% if amount_guests > 0 and log.boat.name != 'Externes Boot' %}
|
{% if amount_guests > 0 and log.boat.name != 'Externes Boot' %}
|
||||||
Gäste <small class="text-gray-600 dark:text-gray-100">(ohne Account)</small>: {{ amount_guests }}
|
Gäste <small class="text-gray-600 dark:text-gray-100">(ohne Account)</small>: {{ amount_guests }}
|
||||||
@ -221,28 +197,24 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endmacro show_old %}
|
{% endmacro show_old %}
|
||||||
|
|
||||||
{% macro home(log) %}
|
{% macro home(log) %}
|
||||||
<form class="grid grid-cols-1 gap-3"
|
<form class="grid grid-cols-1 gap-3" action="/log/{{log.id}}" method="post">
|
||||||
action="/log/{{ log.id }}"
|
|
||||||
method="post">
|
|
||||||
{{ macros::input(label='Ankunftszeit', name='arrival', type='datetime-local', required=true, class="change-id-js rounded-md current-date-time") }}
|
{{ macros::input(label='Ankunftszeit', name='arrival', type='datetime-local', required=true, class="change-id-js rounded-md current-date-time") }}
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label for="destination" class="text-sm text-gray-600 dark:text-gray-100">Ziel</label>
|
<label for="destination" class="text-sm text-gray-600 dark:text-gray-100">Ziel</label>
|
||||||
<input class="input rounded-md set-distance-js change-id-js"
|
|
||||||
type="search"
|
<input class="input rounded-md set-distance-js change-id-js" type="search" list="destinations" placeholder="Destination" required="required" id="destination{{ log.id }}" name="destination" value="{{log.destination}}" data-relation="distance_in_km{{log.id}}"/>
|
||||||
list="destinations"
|
|
||||||
placeholder="Destination"
|
|
||||||
required="required"
|
|
||||||
id="destination{{ log.id }}"
|
|
||||||
name="destination"
|
|
||||||
value="{{ log.destination }}"
|
|
||||||
data-relation="distance_in_km{{ log.id }}" />
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
{{ macros::input(label="Distanz", name="distance_in_km", id="distance_in_km" ~ log.id , type="number", min=0, value=log.distance_in_km, required=true, class="rounded-md change-id-js") }}
|
{{ macros::input(label="Distanz", name="distance_in_km", id="distance_in_km" ~ log.id , type="number", min=0, value=log.distance_in_km, required=true, class="rounded-md change-id-js") }}
|
||||||
<span class="absolute right-0 bottom-0 py-1.5 px-2 bg-white dark:bg-primary-950 border-0 text-gray-600 dark:text-gray-100 ring-1 ring-inset ring-gray-300 dark:ring-primary-950 rounded-br-md rounded-tr-md">km</span>
|
<span class="absolute right-0 bottom-0 py-1.5 px-2 bg-white dark:bg-primary-950 border-0 text-gray-600 dark:text-gray-100 ring-1 ring-inset ring-gray-300 dark:ring-primary-950 rounded-br-md rounded-tr-md">km</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{ macros::input(label="Kommentar", name="comments", id="comments" ~ log.id, type="text", value=log.comments, class="rounded-md change-id-js") }}
|
{{ macros::input(label="Kommentar", name="comments", id="comments" ~ log.id, type="text", value=log.comments, class="rounded-md change-id-js") }}
|
||||||
|
|
||||||
<details class="bg-gray-200 bg-opacity-80 dark:bg-primary-900 rounded-md p-2">
|
<details class="bg-gray-200 bg-opacity-80 dark:bg-primary-900 rounded-md p-2">
|
||||||
<summary class="cursor-pointer">Details ändern</summary>
|
<summary class="cursor-pointer">Details ändern</summary>
|
||||||
<div class="grid grid-cols-1 gap-3">
|
<div class="grid grid-cols-1 gap-3">
|
||||||
@ -250,12 +222,12 @@
|
|||||||
{{ log::rower_select(id="rowers"~log.id, selected=log.rowers, amount_seats=log.boat.amount_seats, steering_person_id=log.steering_user.id, cox_on_boat=log.shipmaster_user.id) }}
|
{{ log::rower_select(id="rowers"~log.id, selected=log.rowers, amount_seats=log.boat.amount_seats, steering_person_id=log.steering_user.id, cox_on_boat=log.shipmaster_user.id) }}
|
||||||
{{ macros::select(label="Schiffsführer", data=[], name='shipmaster', id="shipmaster-rowers"~log.id, class="change-id-js", selected_id=log.shipmaster_user.id, required=true) }}
|
{{ macros::select(label="Schiffsführer", data=[], name='shipmaster', id="shipmaster-rowers"~log.id, class="change-id-js", selected_id=log.shipmaster_user.id, required=true) }}
|
||||||
{{ macros::select(label="Steuerperson", data=[], name='steering_person', id="steering_person-rowers"~log.id, class="change-id-js", selected_id=log.steering_user.id, required=true) }}
|
{{ macros::select(label="Steuerperson", data=[], name='steering_person', id="steering_person-rowers"~log.id, class="change-id-js", selected_id=log.steering_user.id, required=true) }}
|
||||||
<div>
|
<div>{{ macros::checkbox(label="Handgesteuert", name="shipmaster_only_steering", id="shipmaster_only_steering" ~ log.id , checked=log.shipmaster_only_steering,class="rounded-md change-id-js") }}</div>
|
||||||
{{ macros::checkbox(label="Handgesteuert", name="shipmaster_only_steering", id="shipmaster_only_steering" ~ log.id , checked=log.shipmaster_only_steering,class="rounded-md change-id-js") }}
|
|
||||||
</div>
|
|
||||||
{{ macros::select(label="Typ", data=logtypes, name="logtype", id="logtype" ~ log.id, default="Normal", selected_id=log.logtype, class="rounded-md change-id-js") }}
|
{{ macros::select(label="Typ", data=logtypes, name="logtype", id="logtype" ~ log.id, default="Normal", selected_id=log.logtype, class="rounded-md change-id-js") }}
|
||||||
</div>
|
</div>
|
||||||
</details>
|
</details>
|
||||||
<input class="btn btn-primary" type="submit" value="Ausfahrt beenden" />
|
|
||||||
|
|
||||||
|
<input class="btn btn-primary" type="submit" value="Ausfahrt beenden"/>
|
||||||
</form>
|
</form>
|
||||||
{% endmacro home %}
|
{% endmacro home %}
|
||||||
|
@ -1,8 +1,3 @@
|
|||||||
<svg width="16"
|
<svg width="16" height="16" fill="currentColor" class="inline h-4 w-4 text-primary-300 group-hover:text-primary-400 mr-2" viewbox="0 0 16 16" style="margin-top: -0.2rem">
|
||||||
height="16"
|
<path d="M1.5 1.5A.5.5 0 0 1 2 1h12a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.128.334L10 8.692V13.5a.5.5 0 0 1-.342.474l-3 1A.5.5 0 0 1 6 14.5V8.692L1.628 3.834A.5.5 0 0 1 1.5 3.5v-2z"/>
|
||||||
fill="currentColor"
|
|
||||||
class="inline h-4 w-4 text-primary-300 group-hover:text-primary-400 mr-2"
|
|
||||||
viewbox="0 0 16 16"
|
|
||||||
style="margin-top: -0.2rem">
|
|
||||||
<path d="M1.5 1.5A.5.5 0 0 1 2 1h12a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.128.334L10 8.692V13.5a.5.5 0 0 1-.342.474l-3 1A.5.5 0 0 1 6 14.5V8.692L1.628 3.834A.5.5 0 0 1 1.5 3.5v-2z" />
|
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 383 B After Width: | Height: | Size: 354 B |
@ -1,6 +1,3 @@
|
|||||||
<svg class="h-5 w-5 text-primary-300 group-hover:text-primary-400"
|
<svg class="h-5 w-5 text-primary-300 group-hover:text-primary-400" viewbox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||||
viewbox="0 0 20 20"
|
<path fill-rule="evenodd" d="M10 1a4.5 4.5 0 00-4.5 4.5V9H5a2 2 0 00-2 2v6a2 2 0 002 2h10a2 2 0 002-2v-6a2 2 0 00-2-2h-.5V5.5A4.5 4.5 0 0010 1zm3 8V5.5a3 3 0 10-6 0V9h6z" clip-rule="evenodd"/>
|
||||||
fill="currentColor"
|
|
||||||
aria-hidden="true">
|
|
||||||
<path fill-rule="evenodd" d="M10 1a4.5 4.5 0 00-4.5 4.5V9H5a2 2 0 00-2 2v6a2 2 0 002 2h10a2 2 0 002-2v-6a2 2 0 00-2-2h-.5V5.5A4.5 4.5 0 0010 1zm3 8V5.5a3 3 0 10-6 0V9h6z" clip-rule="evenodd" />
|
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 347 B After Width: | Height: | Size: 328 B |
@ -1,5 +1,7 @@
|
|||||||
{% macro header(loggedin_user) %}
|
{% macro header(loggedin_user) %}
|
||||||
<header class="bg-primary-900 text-white flex justify-center p-3 fixed w-full z-10">
|
<header
|
||||||
|
class="bg-primary-900 text-white flex justify-center p-3 fixed w-full z-10"
|
||||||
|
>
|
||||||
<div class="max-w-screen-xl w-full flex justify-between items-center">
|
<div class="max-w-screen-xl w-full flex justify-between items-center">
|
||||||
<div class="w-1/3 truncate">
|
<div class="w-1/3 truncate">
|
||||||
{% if "Donau Linz" in loggedin_user.roles %}
|
{% if "Donau Linz" in loggedin_user.roles %}
|
||||||
@ -11,76 +13,125 @@
|
|||||||
{{ loggedin_user.name }}
|
{{ loggedin_user.name }}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<a href="https://wiki.rudernlinz.at/ruderassistent#faq"
|
<a
|
||||||
|
href="https://wiki.rudernlinz.at/ruderassistent#faq"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
class="inline-flex justify-center rounded-md bg-primary-600 mx-1 px-3 py-2 text-sm font-semibold text-white hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 cursor-pointer">
|
class="inline-flex justify-center rounded-md bg-primary-600 mx-1 px-3 py-2 text-sm font-semibold text-white hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 cursor-pointer"
|
||||||
|
>
|
||||||
{% include "includes/question-icon" %}
|
{% include "includes/question-icon" %}
|
||||||
<span class="sr-only">FAQs</span>
|
<span class="sr-only">FAQs</span>
|
||||||
</a>
|
</a>
|
||||||
{% if "scheckbuch" in loggedin_user.roles and loggedin_user.weight and loggedin_user.sex and loggedin_user.dob %}
|
{% if "scheckbuch" in loggedin_user.roles and loggedin_user.weight and loggedin_user.sex and loggedin_user.dob %}
|
||||||
<a href="#"
|
<a
|
||||||
|
href="#"
|
||||||
class="inline-flex justify-center rounded-md bg-primary-600 mx-1 px-3 py-2 text-sm font-semibold text-white hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 cursor-pointer"
|
class="inline-flex justify-center rounded-md bg-primary-600 mx-1 px-3 py-2 text-sm font-semibold text-white hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 cursor-pointer"
|
||||||
data-sidebar="true"
|
data-sidebar="true"
|
||||||
data-trigger="sidebar"
|
data-trigger="sidebar"
|
||||||
data-header="Ergo Challenge"
|
data-header="Ergo Challenge"
|
||||||
data-body="#mobile-menu-guest">
|
data-body="#mobile-menu-guest"
|
||||||
|
>
|
||||||
{% include "includes/book" %}
|
{% include "includes/book" %}
|
||||||
<span class="sr-only">Ergo</span>
|
<span class="sr-only">Ergo</span>
|
||||||
</a>
|
</a>
|
||||||
<div class="hidden">
|
<div class="hidden">
|
||||||
<div id="mobile-menu-guest">
|
<div id="mobile-menu-guest">
|
||||||
<a href="/ergo" class="block w-100 py-2 hover:text-primary-600 border-t">Ergo</a>
|
<a
|
||||||
|
href="/ergo"
|
||||||
|
class="block w-100 py-2 hover:text-primary-600 border-t"
|
||||||
|
>
|
||||||
|
Ergo
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if "scheckbuch" not in loggedin_user.roles %}
|
{% if "scheckbuch" not in loggedin_user.roles %}
|
||||||
<a href="#"
|
<a
|
||||||
|
href="#"
|
||||||
class="inline-flex justify-center rounded-md bg-primary-600 mx-1 px-3 py-2 text-sm font-semibold text-white hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 cursor-pointer"
|
class="inline-flex justify-center rounded-md bg-primary-600 mx-1 px-3 py-2 text-sm font-semibold text-white hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 cursor-pointer"
|
||||||
data-sidebar="true"
|
data-sidebar="true"
|
||||||
data-trigger="sidebar"
|
data-trigger="sidebar"
|
||||||
data-header="Menü"
|
data-header="Menü"
|
||||||
data-body="#mobile-menu">
|
data-body="#mobile-menu"
|
||||||
|
>
|
||||||
{% include "includes/book" %}
|
{% include "includes/book" %}
|
||||||
<span class="sr-only">Logbuch</span>
|
<span class="sr-only">Logbuch</span>
|
||||||
</a>
|
</a>
|
||||||
<div class="hidden">
|
<div class="hidden">
|
||||||
<div id="mobile-menu">
|
<div id="mobile-menu">
|
||||||
<a href="/log" class="block w-100 py-2 hover:text-primary-600">Ausfahrt eintragen</a>
|
<a href="/log" class="block w-100 py-2 hover:text-primary-600">
|
||||||
<a href="/log/show"
|
Ausfahrt eintragen
|
||||||
class="block w-100 py-2 hover:text-primary-600 border-t">Logbuch</a>
|
</a>
|
||||||
|
<a
|
||||||
|
href="/log/show"
|
||||||
|
class="block w-100 py-2 hover:text-primary-600 border-t"
|
||||||
|
>
|
||||||
|
Logbuch
|
||||||
|
</a>
|
||||||
{% if loggedin_user.weight and loggedin_user.sex and loggedin_user.dob %}
|
{% if loggedin_user.weight and loggedin_user.sex and loggedin_user.dob %}
|
||||||
<a href="/ergo" class="block w-100 py-2 hover:text-primary-600 border-t">Ergo</a>
|
<a
|
||||||
|
href="/ergo"
|
||||||
|
class="block w-100 py-2 hover:text-primary-600 border-t"
|
||||||
|
>
|
||||||
|
Ergo
|
||||||
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a href="/stat" class="block w-100 py-2 hover:text-primary-600 border-t">Statistik</a>
|
<a
|
||||||
<a href="/stat/boats"
|
href="/stat"
|
||||||
class="block w-100 py-2 hover:text-primary-600 border-t">Bootsauswertung</a>
|
class="block w-100 py-2 hover:text-primary-600 border-t"
|
||||||
|
>
|
||||||
|
Statistik
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="/stat/boats"
|
||||||
|
class="block w-100 py-2 hover:text-primary-600 border-t"
|
||||||
|
>
|
||||||
|
Bootsauswertung
|
||||||
|
</a>
|
||||||
{% if "admin" in loggedin_user.roles %}
|
{% if "admin" in loggedin_user.roles %}
|
||||||
<a href="/admin/boat"
|
<a
|
||||||
class="block w-100 py-2 hover:text-primary-600 border-t">Boote</a>
|
href="/admin/boat"
|
||||||
|
class="block w-100 py-2 hover:text-primary-600 border-t"
|
||||||
|
>
|
||||||
|
Boote
|
||||||
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a href="/boatdamage"
|
<a
|
||||||
class="block w-100 py-2 hover:text-primary-600 border-t">Bootsschaden</a>
|
href="/boatdamage"
|
||||||
|
class="block w-100 py-2 hover:text-primary-600 border-t"
|
||||||
|
>
|
||||||
|
Bootsschaden
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if "admin" in loggedin_user.roles %}
|
{% if "admin" in loggedin_user.roles %}
|
||||||
<a href="/admin/user"
|
<a
|
||||||
class="inline-flex justify-center rounded-md bg-primary-600 mx-1 px-3 py-2 text-sm font-semibold text-white hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 cursor-pointer">
|
href="/admin/user"
|
||||||
<svg class="inline h-4"
|
class="inline-flex justify-center rounded-md bg-primary-600 mx-1 px-3 py-2 text-sm font-semibold text-white hover:bg-primary-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 cursor-pointer"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
class="inline h-4"
|
||||||
width="16"
|
width="16"
|
||||||
height="16"
|
height="16"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
class="bi bi-person-lines-fill"
|
class="bi bi-person-lines-fill"
|
||||||
viewbox="0 0 16 16">
|
viewbox="0 0 16 16"
|
||||||
<path d="M6 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-5 6s-1 0-1-1 1-4 6-4 6 3 6 4-1 1-1 1H1zM11 3.5a.5.5 0 0 1 .5-.5h4a.5.5 0 0 1 0 1h-4a.5.5 0 0 1-.5-.5zm.5 2.5a.5.5 0 0 0 0 1h4a.5.5 0 0 0 0-1h-4zm2 3a.5.5 0 0 0 0 1h2a.5.5 0 0 0 0-1h-2zm0 3a.5.5 0 0 0 0 1h2a.5.5 0 0 0 0-1h-2z" />
|
>
|
||||||
|
<path
|
||||||
|
d="M6 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-5 6s-1 0-1-1 1-4 6-4 6 3 6 4-1 1-1 1H1zM11 3.5a.5.5 0 0 1 .5-.5h4a.5.5 0 0 1 0 1h-4a.5.5 0 0 1-.5-.5zm.5 2.5a.5.5 0 0 0 0 1h4a.5.5 0 0 0 0-1h-4zm2 3a.5.5 0 0 0 0 1h2a.5.5 0 0 0 0-1h-2zm0 3a.5.5 0 0 0 0 1h2a.5.5 0 0 0 0-1h-2z"
|
||||||
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
<span class="sr-only">Userverwaltung</span>
|
<span class="sr-only">Userverwaltung</span>
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a href="/auth/logout"
|
<a
|
||||||
class="inline-flex justify-center rounded-md bg-gray-200 ml-1 px-3 py-2 text-sm font-semibold text-primary-950 hover:bg-gray-300 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 cursor-pointer">
|
href="/auth/logout"
|
||||||
<svg class="inline h-4"
|
class="inline-flex justify-center rounded-md bg-gray-200 ml-1 px-3 py-2 text-sm font-semibold text-primary-950 hover:bg-gray-300 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 cursor-pointer"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
class="inline h-4"
|
||||||
width="24"
|
width="24"
|
||||||
height="24"
|
height="24"
|
||||||
viewbox="0 0 24 24"
|
viewbox="0 0 24 24"
|
||||||
@ -89,7 +140,8 @@
|
|||||||
stroke-width="2"
|
stroke-width="2"
|
||||||
stroke-linecap="round"
|
stroke-linecap="round"
|
||||||
stroke-linejoin="round"
|
stroke-linejoin="round"
|
||||||
class="feather feather-log-out">
|
class="feather feather-log-out"
|
||||||
|
>
|
||||||
<path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"></path>
|
<path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"></path>
|
||||||
<polyline points="16 17 21 12 16 7"></polyline>
|
<polyline points="16 17 21 12 16 7"></polyline>
|
||||||
<line x1="21" y1="12" x2="9" y2="12"></line>
|
<line x1="21" y1="12" x2="9" y2="12"></line>
|
||||||
@ -100,52 +152,34 @@
|
|||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<div class="h-8"></div>
|
<div class="h-8"></div>
|
||||||
{% endmacro header %}
|
{% endmacro header %}
|
||||||
{% macro input(label, name, type, required=false, class='rounded-md', value='', min='', hide_label=false, id='', autofocus=false, wrapper_class='', pattern='', readonly=false) %}
|
|
||||||
<div class="{{ wrapper_class }}">
|
{% macro input(label, name, type, required=false, class='rounded-md', value='', min='', hide_label=false, id='', autofocus=false, wrapper_class='', pattern='', readonly=false) %}
|
||||||
<label for="{{ name }}"
|
<div class="{{wrapper_class}}">
|
||||||
class="{% if hide_label %} sr-only {% else %} text-sm text-gray-600 dark:text-white {% endif %}">
|
<label for="{{ name }}" class="{% if hide_label %} sr-only {% else %} text-sm text-gray-600 dark:text-white {% endif %}">{{ label }}</label>
|
||||||
{{ label }}
|
<input {% if type=='datetime-local' %} onclick='if (!this.value) setCurrentdate(this)' {% endif %}{% if id %} id="{{ id }}" {% else %} id="{{ name }}" {% endif %} name="{{ name }}" type="{{ type }}" {% if required %} required {% endif %} value="{{ value }}" class="input {{ class }}" placeholder="{% if hide_label %}{{ label }}{% endif %}" {% if min is defined %} min="{{ min }}" {% endif %} {% if autofocus %} autofocus {% endif %}{% if pattern %}pattern="{{ pattern }}"{% endif %}{% if readonly %}readonly{% endif %}>
|
||||||
</label>
|
|
||||||
<input {% if type=='datetime-local' %}onclick='if (!this.value) setCurrentdate(this)'{% endif %}
|
|
||||||
{% if id %} id="{{ id }}" {% else %} id="{{ name }}" {% endif %}
|
|
||||||
name="{{ name }}"
|
|
||||||
type="{{ type }}"
|
|
||||||
{% if required %}required{% endif %}
|
|
||||||
value="{{ value }}"
|
|
||||||
class="input {{ class }}"
|
|
||||||
placeholder="{% if hide_label %}{{ label }}{% endif %}"
|
|
||||||
{% if min is defined %}min="{{ min }}"{% endif %}
|
|
||||||
{% if autofocus %}autofocus{% endif %}
|
|
||||||
{% if pattern %}pattern="{{ pattern }}"{% endif %}
|
|
||||||
{% if readonly %}readonly{% endif %}>
|
|
||||||
</div>
|
</div>
|
||||||
{% endmacro input %}
|
{% endmacro input %}
|
||||||
{% macro checkbox(label, name, id='', checked=false, class='', disabled=false) %}
|
|
||||||
<label for="{{ name }}{{ id }}"
|
{% macro checkbox(label, name, id='', checked=false, class='', disabled=false) %}
|
||||||
class="flex items-center cursor-pointer text-black dark:text-white hover:text-gray-900 dark:hover:text-gray-100 {{ class }}">
|
<label for="{{ name }}{{ id }}" class="flex items-center cursor-pointer text-black dark:text-white hover:text-gray-900 dark:hover:text-gray-100 {{ class }}">
|
||||||
<input type="checkbox"
|
<input type="checkbox" id="{{ name }}{{ id }}" name="{{ name }}" {% if checked %} checked {% endif %} {% if disabled %} disabled {% endif %} class="h-4 w-4 accent-primary-600 dark:accent-primary-200 mr-2"/>
|
||||||
id="{{ name }}{{ id }}"
|
|
||||||
name="{{ name }}"
|
|
||||||
{% if checked %}checked{% endif %}
|
|
||||||
{% if disabled %}disabled{% endif %}
|
|
||||||
class="h-4 w-4 accent-primary-600 dark:accent-primary-200 mr-2" />
|
|
||||||
{{ label }}
|
{{ label }}
|
||||||
</label>
|
</label>
|
||||||
{% endmacro checkbox %}
|
{% endmacro checkbox %}
|
||||||
{% macro select(label, data, name='trip_type', default='', id='', selected_id='', display='', extras='', class='', wrapper_class='', required=false, show_seats=false, new_last_entry='') %}
|
|
||||||
<div class="{{ wrapper_class }}">
|
{% macro select(label, data, name='trip_type', default='', id='', selected_id='', display='', extras='', class='', wrapper_class='', required=false, show_seats=false, new_last_entry='') %}
|
||||||
|
<div class="{{wrapper_class}}">
|
||||||
<label for="{{ name }}" class="text-sm text-gray-600 dark:text-gray-100">{{ label }}</label>
|
<label for="{{ name }}" class="text-sm text-gray-600 dark:text-gray-100">{{ label }}</label>
|
||||||
{% if display == '' %}
|
{% if display == '' %}
|
||||||
{% set display = ["name"] %}
|
{% set display = ["name"] %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<select name="{{ name }}"
|
<select name="{{ name }}" {% if id %} id="{{ id }}" {% else %} id="{{ name }}" {% endif %} class="input rounded-md {{ class }}" {% if required %}required="required"{% endif %}>
|
||||||
{% if id %} id="{{ id }}" {% else %} id="{{ name }}" {% endif %}
|
{% if default %}
|
||||||
class="input rounded-md {{ class }}"
|
<option selected value>{{ default }}</option>
|
||||||
{% if required %}required="required"{% endif %}>
|
{% endif %}
|
||||||
{% if default %}<option selected value>{{ default }}</option>{% endif %}
|
|
||||||
{% for d in data %}
|
{% for d in data %}
|
||||||
<option value="{{ d.id }}" {% if d.id == selected_id %}selected{% endif %} {% if extras != '' %} {% for extra in extras %} {% if extra != 'on_water' and d[extra] %} data-{{ extra }}={{ d[extra] }} {% else %} {% if d[extra] %}disabled{% endif %} {% endif %} {% endfor %} {% endif %} {% if show_seats %} data-custom-properties='{"amount_seats": {{ d["amount_seats"] }}, "owner": "{{ d["owner"] }}", "default_destination": "{{ d["default_destination"] }}", "boat_in_ottensheim": {{ d["location_id"] == 2 }}}'{% endif %}>
|
<option value="{{ d.id }}" {% if d.id == selected_id %} selected {% endif %} {% if extras != '' %} {% for extra in extras %} {% if extra != 'on_water' and d[extra] %} data-{{extra}}={{d[extra]}} {% else %} {% if d[extra] %} disabled {% endif %} {% endif %} {% endfor %} {% endif %} {% if show_seats %} data-custom-properties='{"amount_seats": {{ d["amount_seats"] }}, "owner": "{{ d["owner"] }}", "default_destination": "{{ d["default_destination"] }}", "boat_in_ottensheim": {{ d["location_id"] == 2 }}}'{% endif %}>
|
||||||
{% for displa in display -%}
|
{% for displa in display -%}
|
||||||
{%- if d[displa] -%}
|
{%- if d[displa] -%}
|
||||||
{{- d[displa] -}}
|
{{- d[displa] -}}
|
||||||
@ -155,42 +189,49 @@
|
|||||||
{%- endfor %}
|
{%- endfor %}
|
||||||
</option>
|
</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% if new_last_entry %}<option value="-1">{{ new_last_entry }}</option>{% endif %}
|
{% if new_last_entry %}
|
||||||
|
<option value="-1">{{ new_last_entry }}</option>
|
||||||
|
{% endif %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
{% endmacro select %}
|
{% endmacro select %}
|
||||||
{% macro alert(message, type, class='') %}
|
|
||||||
<div class="{{ class }} alert-{{ type }} text-white px-3 py-1 rounded-md text-center">{{ message }}</div>
|
{% macro alert(message, type, class='') %}
|
||||||
{% endmacro alert %}
|
<div class="{{ class }} alert-{{ type }} text-white px-3 py-1 rounded-md text-center">
|
||||||
{% macro box(participants, empty_seats='', header='Freie Plätze:', text='Keine Ruderer angemeldet', bg='primary-600', color='white', trip_details_id='', allow_removing=false) %}
|
{{ message }}
|
||||||
<div class="text-{{ color }} bg-{{ bg }} text-center p-1 mt-1 rounded-t-md">
|
|
||||||
{{ header }}
|
|
||||||
{{ empty_seats }}
|
|
||||||
</div>
|
</div>
|
||||||
|
{% endmacro alert %}
|
||||||
|
|
||||||
|
{% macro box(participants, empty_seats='', header='Freie Plätze:', text='Keine Ruderer angemeldet', bg='primary-600', color='white', trip_details_id='', allow_removing=false) %}
|
||||||
|
<div class="text-{{ color }} bg-{{ bg }} text-center p-1 mt-1 rounded-t-md">{{ header }}
|
||||||
|
{{ empty_seats }}</div>
|
||||||
<div class="p-2 border border-t-0 border-{{ bg }} mb-4 rounded-b-md">
|
<div class="p-2 border border-t-0 border-{{ bg }} mb-4 rounded-b-md">
|
||||||
{% if participants | length > 0 %}
|
{% if participants | length > 0 %}
|
||||||
{% for rower in participants %}
|
{% for rower in participants %}
|
||||||
{{ rower.name }}
|
{{ rower.name }}
|
||||||
{% if rower.is_guest %}<small class="text-gray-600 dark:text-gray-100">(Scheckbuch)</small>{% endif %}
|
{% if rower.is_guest %}
|
||||||
|
<small class="text-gray-600 dark:text-gray-100">(Scheckbuch)</small>
|
||||||
|
{% endif %}
|
||||||
{% if rower.is_real_guest %}
|
{% if rower.is_real_guest %}
|
||||||
<small class="text-gray-600 dark:text-gray-100">(Gast)</small>
|
<small class="text-gray-600 dark:text-gray-100">(Gast)</small>
|
||||||
{% if allow_removing %}
|
{% if allow_removing %}
|
||||||
<a href="/planned/remove/{{ trip_details_id }}/{{ rower.name }}"
|
<a href="/planned/remove/{{ trip_details_id }}/{{ rower.name }}" class="btn btn-attention btn-fw">Abmelden</a>
|
||||||
class="btn btn-attention btn-fw">Abmelden</a>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<span class="hidden">(angemeldet seit
|
<span class="hidden">(angemeldet seit
|
||||||
{{ rower.registered_at }})</span>
|
{{ rower.registered_at }})</span><br/>
|
||||||
<br />
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ text }}
|
{{ text }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endmacro box %}
|
{% endmacro box %}
|
||||||
{% macro faq(question, answer) %}
|
|
||||||
|
{% macro faq(question, answer) %}
|
||||||
<div>
|
<div>
|
||||||
<h2 class="flex mb-4 text-lg font-bold text-primary-900">{{ question }}</h2>
|
<h2 class="flex mb-4 text-lg font-bold text-primary-900">
|
||||||
|
{{ question }}
|
||||||
|
</h2>
|
||||||
<p class="text-primary-950">{{ answer | safe }}</p>
|
<p class="text-primary-950">{{ answer | safe }}</p>
|
||||||
</div>
|
</div>
|
||||||
{% endmacro faq %}
|
{% endmacro faq %}
|
||||||
|
@ -1,9 +1,4 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg"
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-pencil-square" viewBox="0 0 16 16">
|
||||||
width="16"
|
<path d="M15.502 1.94a.5.5 0 0 1 0 .706L14.459 3.69l-2-2L13.502.646a.5.5 0 0 1 .707 0l1.293 1.293zm-1.75 2.456-2-2L4.939 9.21a.5.5 0 0 0-.121.196l-.805 2.414a.25.25 0 0 0 .316.316l2.414-.805a.5.5 0 0 0 .196-.12l6.813-6.814z"/>
|
||||||
height="16"
|
<path fill-rule="evenodd" d="M1 13.5A1.5 1.5 0 0 0 2.5 15h11a1.5 1.5 0 0 0 1.5-1.5v-6a.5.5 0 0 0-1 0v6a.5.5 0 0 1-.5.5h-11a.5.5 0 0 1-.5-.5v-11a.5.5 0 0 1 .5-.5H9a.5.5 0 0 0 0-1H2.5A1.5 1.5 0 0 0 1 2.5v11z"/>
|
||||||
fill="currentColor"
|
|
||||||
class="bi bi-pencil-square"
|
|
||||||
viewBox="0 0 16 16">
|
|
||||||
<path d="M15.502 1.94a.5.5 0 0 1 0 .706L14.459 3.69l-2-2L13.502.646a.5.5 0 0 1 .707 0l1.293 1.293zm-1.75 2.456-2-2L4.939 9.21a.5.5 0 0 0-.121.196l-.805 2.414a.25.25 0 0 0 .316.316l2.414-.805a.5.5 0 0 0 .196-.12l6.813-6.814z" />
|
|
||||||
<path fill-rule="evenodd" d="M1 13.5A1.5 1.5 0 0 0 2.5 15h11a1.5 1.5 0 0 0 1.5-1.5v-6a.5.5 0 0 0-1 0v6a.5.5 0 0 1-.5.5h-11a.5.5 0 0 1-.5-.5v-11a.5.5 0 0 1 .5-.5H9a.5.5 0 0 0 0-1H2.5A1.5 1.5 0 0 0 1 2.5v11z" />
|
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 610 B After Width: | Height: | Size: 579 B |
@ -1,8 +1,3 @@
|
|||||||
<svg class="inline h-5 w-5"
|
<svg class="inline h-5 w-5" width="16" height="16" fill="currentColor" class="bi bi-plus" viewbox="0 0 16 16">
|
||||||
width="16"
|
<path d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z"/>
|
||||||
height="16"
|
|
||||||
fill="currentColor"
|
|
||||||
class="bi bi-plus"
|
|
||||||
viewbox="0 0 16 16">
|
|
||||||
<path d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z" />
|
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 262 B After Width: | Height: | Size: 233 B |
@ -1 +1,4 @@
|
|||||||
<script>var QRCodep;!function(){function a(a){this.mode=j.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=0,c=this.data.length;c>b;b++){var d=[],e=this.data.charCodeAt(b);e>65536?(d[0]=240|(1835008&e)>>>18,d[1]=128|(258048&e)>>>12,d[2]=128|(4032&e)>>>6,d[3]=128|63&e):e>2048?(d[0]=224|(61440&e)>>>12,d[1]=128|(4032&e)>>>6,d[2]=128|63&e):e>128?(d[0]=192|(1984&e)>>>6,d[1]=128|63&e):d[0]=e,this.parsedData.push(d)}this.parsedData=Array.prototype.concat.apply([],this.parsedData),this.parsedData.length!=this.data.length}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function c(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c<a.length&&0==a[c];)c++;this.num=new Array(a.length-c+b);for(var d=0;d<a.length-c;d++)this.num[d]=a[d+c]}function d(a,b){this.totalCount=a,this.dataCount=b}function e(){this.buffer=[],this.length=0}function f(){return"undefined"!=typeof CanvasRenderingContext2D}function g(){var a=!1,b=navigator.userAgent;if(/android/i.test(b)){a=!0;var c=b.toString().match(/android ([0-9]\.[0-9])/i);c&&c[1]&&(a=parseFloat(c[1]))}return a}function h(a,b){for(var c=1,d=i(a),e=0,f=p.length;f>=e;e++){var g=0;switch(b){case k.L:g=p[e][0];break;case k.M:g=p[e][1];break;case k.Q:g=p[e][2];break;case k.H:g=p[e][3]}if(g>=d)break;c++}if(c>p.length)throw new Error("Too long data");return c}function i(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(a){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d<this.moduleCount;d++){this.modules[d]=new Array(this.moduleCount);for(var e=0;e<this.moduleCount;e++)this.modules[d][e]=null}this.setupPositionProbePattern(0,0),this.setupPositionProbePattern(this.moduleCount-7,0),this.setupPositionProbePattern(0,this.moduleCount-7),this.setupPositionAdjustPattern(),this.setupTimingPattern(),this.setupTypeInfo(a,c),this.typeNumber>=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?this.modules[a+c][b+d]=!0:this.modules[a+c][b+d]=!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=m.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f<this.modules.length;f++)for(var g=f*e,h=0;h<this.modules[f].length;h++){var i=h*e,j=this.modules[f][h];j&&(d.beginFill(0,100),d.moveTo(i,g),d.lineTo(i+e,g),d.lineTo(i+e,g+e),d.lineTo(i,g+e),d.endFill())}return d},setupTimingPattern:function(){for(var a=8;a<this.moduleCount-8;a++)null==this.modules[a][6]&&(this.modules[a][6]=a%2==0);for(var b=8;b<this.moduleCount-8;b++)null==this.modules[6][b]&&(this.modules[6][b]=b%2==0)},setupPositionAdjustPattern:function(){for(var a=m.getPatternPosition(this.typeNumber),b=0;b<a.length;b++)for(var c=0;c<a.length;c++){var d=a[b],e=a[c];if(null==this.modules[d][e])for(var f=-2;2>=f;f++)for(var g=-2;2>=g;g++)-2==f||2==f||-2==g||2==g||0==f&&0==g?this.modules[d+f][e+g]=!0:this.modules[d+f][e+g]=!1}},setupTypeNumber:function(a){for(var b=m.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(b>>c&1);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(b>>c&1);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=m.getBCHTypeInfo(c),e=0;15>e;e++){var f=!a&&1==(d>>e&1);6>e?this.modules[e][8]=f:8>e?this.modules[e+1][8]=f:this.modules[this.moduleCount-15+e][8]=f}for(var e=0;15>e;e++){var f=!a&&1==(d>>e&1);8>e?this.modules[8][this.moduleCount-e-1]=f:9>e?this.modules[8][15-e-1+1]=f:this.modules[8][15-e-1]=f}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,f=0,g=this.moduleCount-1;g>0;g-=2)for(6==g&&g--;;){for(var h=0;2>h;h++)if(null==this.modules[d][g-h]){var i=!1;f<a.length&&(i=1==(a [f]>>>e&1));var j=m.getMask(b,d,g-h);j&&(i=!i),this.modules[d][g-h]=i,e--,-1==e&&(f++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,f){for(var g=d.getRSBlocks(a,c),h=new e,i=0;i<f.length;i++){var j=f[i];h.put(j.mode,4),h.put(j.getLength(),m.getLengthInBits(j.mode,a)),j.write(h)}for(var k=0,i=0;i<g.length;i++)k+=g [i].dataCount;if(h.getLengthInBits()>8*k)throw new Error("code length overflow. ("+h.getLengthInBits()+">"+8*k+")");for(h.getLengthInBits()+4<=8*k&&h.put(0,4);h.getLengthInBits()%8!=0;)h.putBit(!1);for(;;){if(h.getLengthInBits()>=8*k)break;if(h.put(b.PAD0,8),h.getLengthInBits()>=8*k)break;h.put(b.PAD1,8)}return b.createBytes(h,g)},b.createBytes=function(a,b){for(var d=0,e=0,f=0,g=new Array(b.length),h=new Array(b.length),i=0;i<b.length;i++){var j=b[i].dataCount,k=b[i].totalCount-j;e=Math.max(e,j),f=Math.max(f,k),g[i]=new Array(j);for(var l=0;l<g[i].length;l++)g[i][l]=255&a.buffer[l+d];d+=j;var n=m.getErrorCorrectPolynomial(k),o=new c(g[i],n.getLength()-1),p=o.mod(n);h[i]=new Array(n.getLength()-1);for(var l=0;l<h[i].length;l++){var q=l+p.getLength()-h[i].length;h[i][l]=q>=0?p.get(q):0}}for(var r=0,l=0;l<b.length;l++)r+=b [l].totalCount;for(var s=new Array(r),t=0,l=0;e>l;l++)for(var i=0;i<b.length;i++)l<g [i].length&&(s[t++]=g[i][l]);for(var l=0;f>l;l++)for(var i=0;i<b.length;i++)l<h[i].length&&(s[t++]=h[i][l]);return s};for(var j={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},k={L:1,M:0,Q:3,H:2},l={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},m={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(a){for(var b=a<<10;m.getBCHDigit(b)-m.getBCHDigit(m.G15 )>=0;)b^=m.G15<<m.getBCHDigit(b)-m.getBCHDigit(m.G15);return(a<<10|b)^m.G15_MASK},getBCHTypeNumber:function(a){for(var b=a<<12;m.getBCHDigit(b)-m.getBCHDigit(m.G18)>=0;)b^=m.G18<<m.getBCHDigit(b)-m.getBCHDigit(m.G18);return a<<12|b},getBCHDigit:function(a){for(var b=0;0!=a;)b++,a>>>=1;return b},getPatternPosition:function(a){return m.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case l.PATTERN000:return(b+c)%2==0;case l.PATTERN001:return b%2==0;case l.PATTERN010:return c%3==0;case l.PATTERN011:return(b+c)%3==0;case l.PATTERN100:return(Math.floor(b/2)+Math.floor(c/3))%2==0;case l.PATTERN101:return b*c%2+b*c%3==0;case l.PATTERN110:return(b*c%2+b*c%3)%2==0;case l.PATTERN111:return(b*c%3+(b+c)%2)%2==0;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new c([1],0),d=0;a>d;d++)b=b.multiply(new c([1,n.gexp(d)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case j.MODE_NUMBER:return 10;case j.MODE_ALPHA_NUM:return 9;case j.MODE_8BIT_BYTE:return 8;case j.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case j.MODE_NUMBER:return 12;case j.MODE_ALPHA_NUM:return 11;case j.MODE_8BIT_BYTE:return 16;case j.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case j.MODE_NUMBER:return 14;case j.MODE_ALPHA_NUM:return 13;case j.MODE_8BIT_BYTE:return 16;case j.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||0==h&&0==i||g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,0!=j&&4!=j||(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},n={glog:function(a){if(1>a)throw new Error("glog("+a+")");return n.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return n.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},o=0;8>o;o++)n.EXP_TABLE[o]=1<<o;for(var o=8;256>o;o++)n.EXP_TABLE[o]=n.EXP_TABLE[o-4]^n.EXP_TABLE[o-5]^n.EXP_TABLE[o-6]^n.EXP_TABLE[o-8];for(var o=0;255>o;o++)n.LOG_TABLE[n.EXP_TABLE[o]]=o;c.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),d=0;d<this.getLength();d++)for(var e=0;e<a.getLength();e++)b[d+e]^=n.gexp(n.glog(this.get(d))+n.glog(a.get(e)));return new c(b,0)},mod:function(a){if(this.getLength()-a.getLength()<0)return this;for(var b=n.glog(this.get(0))-n.glog(a.get(0)),d=new Array(this.getLength()),e=0;e<this.getLength();e++)d[e]=this.get(e);for(var e=0;e<a.getLength();e++)d[e]^=n.gexp(n.glog(a.get(e))+b);return new c(d,0).mod(a)}},d.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],d.getRSBlocks=function(a,b){var c=d.getRsBlockTable(a,b);if(void 0==c)throw new Error("bad rs block @ typeNumber:"+a+"/errorCorrectLevel:"+b);for(var e=c.length/3,f=[],g=0;e>g;g++)for(var h=c[3*g+0],i=c[3*g+1],j=c[3*g+2],k=0;h>k;k++)f.push(new d(i,j));return f},d.getRsBlockTable=function(a,b){switch(b){case k.L:return d.RS_BLOCK_TABLE[4*(a-1)+0];case k.M:return d.RS_BLOCK_TABLE[4*(a-1)+1];case k.Q:return d.RS_BLOCK_TABLE[4*(a-1)+2];case k.H:return d.RS_BLOCK_TABLE[4*(a-1)+3];default:return}},e.prototype={get:function(a){var b=Math.floor(a/8);return 1==(this.buffer[b]>>>7-a%8&1)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(a>>>b-c-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer [b]|=128>>>this.length%8),this.length++}};var p=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],q=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function b(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var c=this._htOption,d=this._el,e=a.getModuleCount();Math.floor(c.width/e),Math.floor(c.height/e);this.clear();var f=b("svg",{viewBox:"0 0 "+String(e)+" "+String(e),width:"100%",height:"100%",fill:c.colorLight});f.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),d.appendChild(f),f.appendChild(b("rect",{fill:c.colorLight,width:"100%",height:"100%"})),f.appendChild(b("rect",{fill:c.colorDark,width:"1",height:"1",id:"template"}));for(var g=0;e>g;g++)for(var h=0;e>h;h++)if(a.isDark(g,h)){var i=b("use",{x:String(h),y:String(g)});i.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),f.appendChild(i)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),r="svg"===document.documentElement.tagName.toLowerCase(),s=r?q:f()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function b(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&c._fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,void(d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==")}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var c=1/window.devicePixelRatio,d=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,b,e,f,g,h,i,j,k){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*c;else"undefined"==typeof j&&(arguments[1]*=c,arguments[2]*=c,arguments[3]*=c,arguments[4]*=c);d.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=g(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.alt="Scan me!",this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&b.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCodep=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:k.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._htOption.useSVG&&(s=q),this._android=g(),this._el=a,this._oQRCode=null,this._htOption.text&&this.makeCode(this._htOption.text)},QRCodep.prototype.makeCode=function(a){this._oQRCode=new b(h(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,-1!=this._htOption.dpi&&-1!=this._htOption.mmPerDot&&(this._htOption.width=this._oQRCode.moduleCount*this._htOption.dpi/25.4*this._htOption.mmPerDot,this._htOption.height=this._oQRCode.moduleCount*this._htOption.dpi/25.4*this._htOption.mmPerDot),this._oDrawing=new s(this._el,this._htOption),this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCodep.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCodep.prototype.clear=function(){this._oDrawing.clear()},QRCodep.CorrectLevel=k}();var sepaQR;!function(){"use strict";var a={UTF_8:1,ISO8859_1:2,ISO8859_2:3,ISO8859_4:4,ISO8859_5:5,ISO8859_7:6,ISO8859_10:7,ISO8859_15:8};sepaQR=function(b){if(this._sOpt={serviceTag:"BCD",version:"001",charset:a.UTF_8,identificationCode:"SCT",benefBIC:"",benefName:"",benefAccNr:"",amountEuro:"",purpose:"",creditorRef:"",remittanceInf:"",information:""},b)for(var c in b)this._sOpt[c]=b[c]},sepaQR.prototype.validServiceTag=function(){return"BCD"===this._sOpt.serviceTag},sepaQR.prototype.validVersion=function(){return"001"===this._sOpt.version||"002"===this._sOpt.version},sepaQR.prototype.validCharset=function(){return this._sOpt.charset>0&&this._sOpt.charset<=8},sepaQR.prototype.validIdentificationCode=function(){return"SCT"===this._sOpt.identificationCode},sepaQR.prototype.validBenefName=function(){var a="string"==typeof this._sOpt.benefName&&this._sOpt.benefName.length>=1&&this._sOpt.benefName.length<=70;if(!a)throw new Error("benefName not valid!");return a},sepaQR.prototype.validBenefAccNr=function(){var a="string"==typeof this._sOpt.benefAccNr&&this._sOpt.benefAccNr.length>=1&&this._sOpt.benefAccNr.length<=34;if(!a)throw new Error("benefAccNr not valid!");return a},sepaQR.prototype.validAmountEuro=function(){if("string"==typeof this._sOpt.amountEuro)return 0===this._sOpt.amountEuro.length;if("number"==typeof this._sOpt.amountEuro){this._sOpt.amountEuro=Math.round(100*this._sOpt.amountEuro)/100;var a=this._sOpt.amountEuro>.01&&this._sOpt.amountEuro<=999999999.99;if(!a)throw new Error("Amount not valid!");return a}},sepaQR.prototype.validBenefBic=function(){var a="002"==this._sOpt.version||"string"==typeof this._sOpt.benefBIC&&this._sOpt.benefBIC.length>=0&&this._sOpt.benefBIC.length<=11;if (!a)throw new Error("BIC is mandatory in Version 001!");if(a="string"==typeof this._sOpt.benefBIC&&this._sOpt.benefBIC.length>=0&&this._sOpt.benefBIC.length<=11,!a)throw new Error("benefBIC not valid!");return a},sepaQR.prototype.validPurpose=function(){var a="string"==typeof this._sOpt.purpose&&this._sOpt.purpose.length>=0&&this._sOpt.purpose.length<=4;if(!a)throw new Error("Purpose not valid!");return a},sepaQR.prototype.validInformation=function(){var a="string"==typeof this._sOpt.information&&this._sOpt.information.length>=0&&this._sOpt.information.length<=70;if(!a)throw new Error("Information not valid!");return a},sepaQR.prototype.validCreditorRefOrRemittance=function(){var a="string"==typeof this._sOpt.creditorRef&&0===this._sOpt.creditorRef.length,b="string"==typeof this._sOpt.remittanceInf&&0===this._sOpt.remittanceInf.length,c=a&&"string"==typeof this._sOpt.remittanceInf&&this._sOpt.remittanceInf.length<=140||b&&"string "==typeof this._sOpt.creditorRef&&this._sOpt.creditorRef.length<=35;if(!c)throw new Error("creditorRef or Remittance not valid!");return c},sepaQR.prototype.validQRTextLength=function(){for(var a=this.prepareQRText(),b=0,c=0,d=a.length;d>c;c++){var e=a.charCodeAt(c);b+=e>65536?4:e>2048?3:e>128?2:1}return 328>=b},sepaQR.prototype.valid=function(){var a=this.validServiceTag()&&this.validVersion()&&this.validCharset()&&this.validIdentificationCode()&&this.validBenefName()&&this.validBenefAccNr()&&this.validAmountEuro()&&this.validBenefBic()&&this.validPurpose()&&this.validInformation()&&this.validPurpose()&&this.validCreditorRefOrRemittance()&&this.validQRTextLength();return a},sepaQR.prototype.prepareQRText=function(){return(this._sOpt.serviceTag+"\n"+this._sOpt.version+"\n"+this._sOpt.charset+"\n"+this._sOpt.identificationCode+"\n"+this._sOpt.benefBIC+"\n"+this._sOpt.benefName+"\n"+this._sOpt.benefAccNr+"\nEUR"+this._sOpt.amountEuro+"\n"+this._sOpt.purpose+"\n"+this._sOpt.creditorRef+"\n"+this._sOpt.remittanceInf+"\n"+this._sOpt.information).trim()},sepaQR.prototype.toQRText=function(){return this.valid()?this.prepareQRText():""},sepaQR.prototype.makeCodeInto=function(a,b){var c={width:256,height:256,mmPerDot:.85,dpi:92,correctLevel:QRCodep.CorrectLevel.M,text:this.toQRText()};if(0!==c.text.length){if(b)for(var d in b)c[d]=b[d];return this.qrcode=new QRCodep(a,c),this.drawExplanatoryLink(document.getElementById(a).getElementsByTagName("canvas")[0],document.createElement("canvas")),this.qrcode}},sepaQR.prototype.drawExplanatoryLink=function(a,b){var c=3,d=12,e=8,f=6,g=a;b.width=g.width,b.height=g.height,b.getContext("2d").drawImage(g,0,0),g.width=b.width+2*(e+c+f),g.height=b.height+2*(e+c+f),CanvasRenderingContext2D.prototype.roundRect=function(a,b,c,d,e,f){return 2*e>c&&(e=c/2),2*e>d&&(e=d/2),this.beginPath(),this.moveTo(a+e,b),this.arcTo(a+c,b,a+c,b+d,e),this.arcTo(a+c,b+d,a,b+d,e),this.lineTo(a+c-f,b+d),this.moveTo(a+c-110,b+d),this.arcTo(a,b+d,a,b,e),this.arcTo(a,b,a+c,b,e),this};var h=g.getContext("2d");h.fillStyle="white",h.rect(0,0,g.width,g.height),h.fill(),h.drawImage(b,e+c+f,e+c+f),h.lineWidth=c,h.roundRect(f+c/2,f+c/2,g.width-c-2*f,g.height-c-2*f,d,3*e).stroke(),h.fillStyle="black",h.font=4.5*c+"px Arial",h.fillText("sepaQR.eu",g.width-110,g.height-f/2)},sepaQR.Charset=a}();</script> <script>var QRCodep;!function(){function a(a){this.mode=j.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=0,c=this.data.length;c>b;b++){var d=[],e=this.data.charCodeAt(b);e>65536?(d[0]=240|(1835008&e)>>>18,d[1]=128|(258048&e)>>>12,d[2]=128|(4032&e)>>>6,d[3]=128|63&e):e>2048?(d[0]=224|(61440&e)>>>12,d[1]=128|(4032&e)>>>6,d[2]=128|63&e):e>128?(d[0]=192|(1984&e)>>>6,d[1]=128|63&e):d[0]=e,this.parsedData.push(d)}this.parsedData=Array.prototype.concat.apply([],this.parsedData),this.parsedData.length!=this.data.length}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function c(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c<a.length&&0==a[c];)c++;this.num=new Array(a.length-c+b);for(var d=0;d<a.length-c;d++)this.num[d]=a[d+c]}function d(a,b){this.totalCount=a,this.dataCount=b}function e(){this.buffer=[],this.length=0}function f(){return"undefined"!=typeof CanvasRenderingContext2D}function g(){var a=!1,b=navigator.userAgent;if(/android/i.test(b)){a=!0;var c=b.toString().match(/android ([0-9]\.[0-9])/i);c&&c[1]&&(a=parseFloat(c[1]))}return a}function h(a,b){for(var c=1,d=i(a),e=0,f=p.length;f>=e;e++){var g=0;switch(b){case k.L:g=p[e][0];break;case k.M:g=p[e][1];break;case k.Q:g=p[e][2];break;case k.H:g=p[e][3]}if(g>=d)break;c++}if(c>p.length)throw new Error("Too long data");return c}function i(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(a){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d<this.moduleCount;d++){this.modules[d]=new Array(this.moduleCount);for(var e=0;e<this.moduleCount;e++)this.modules[d][e]=null}this.setupPositionProbePattern(0,0),this.setupPositionProbePattern(this.moduleCount-7,0),this.setupPositionProbePattern(0,this.moduleCount-7),this.setupPositionAdjustPattern(),this.setupTimingPattern(),this.setupTypeInfo(a,c),this.typeNumber>=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?this.modules[a+c][b+d]=!0:this.modules[a+c][b+d]=!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=m.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f<this.modules.length;f++)for(var g=f*e,h=0;h<this.modules[f].length;h++){var i=h*e,j=this.modules[f][h];j&&(d.beginFill(0,100),d.moveTo(i,g),d.lineTo(i+e,g),d.lineTo(i+e,g+e),d.lineTo(i,g+e),d.endFill())}return d},setupTimingPattern:function(){for(var a=8;a<this.moduleCount-8;a++)null==this.modules[a][6]&&(this.modules[a][6]=a%2==0);for(var b=8;b<this.moduleCount-8;b++)null==this.modules[6][b]&&(this.modules[6][b]=b%2==0)},setupPositionAdjustPattern:function(){for(var a=m.getPatternPosition(this.typeNumber),b=0;b<a.length;b++)for(var c=0;c<a.length;c++){var d=a[b],e=a[c];if(null==this.modules[d][e])for(var f=-2;2>=f;f++)for(var g=-2;2>=g;g++)-2==f||2==f||-2==g||2==g||0==f&&0==g?this.modules[d+f][e+g]=!0:this.modules[d+f][e+g]=!1}},setupTypeNumber:function(a){for(var b=m.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(b>>c&1);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(b>>c&1);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=m.getBCHTypeInfo(c),e=0;15>e;e++){var f=!a&&1==(d>>e&1);6>e?this.modules[e][8]=f:8>e?this.modules[e+1][8]=f:this.modules[this.moduleCount-15+e][8]=f}for(var e=0;15>e;e++){var f=!a&&1==(d>>e&1);8>e?this.modules[8][this.moduleCount-e-1]=f:9>e?this.modules[8][15-e-1+1]=f:this.modules[8][15-e-1]=f}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,f=0,g=this.moduleCount-1;g>0;g-=2)for(6==g&&g--;;){for(var h=0;2>h;h++)if(null==this.modules[d][g-h]){var i=!1;f<a.length&&(i=1==(a[f]>>>e&1));var j=m.getMask(b,d,g-h);j&&(i=!i),this.modules[d][g-h]=i,e--,-1==e&&(f++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,f){for(var g=d.getRSBlocks(a,c),h=new e,i=0;i<f.length;i++){var j=f[i];h.put(j.mode,4),h.put(j.getLength(),m.getLengthInBits(j.mode,a)),j.write(h)}for(var k=0,i=0;i<g.length;i++)k+=g[i].dataCount;if(h.getLengthInBits()>8*k)throw new Error("code length overflow. ("+h.getLengthInBits()+">"+8*k+")");for(h.getLengthInBits()+4<=8*k&&h.put(0,4);h.getLengthInBits()%8!=0;)h.putBit(!1);for(;;){if(h.getLengthInBits()>=8*k)break;if(h.put(b.PAD0,8),h.getLengthInBits()>=8*k)break;h.put(b.PAD1,8)}return b.createBytes(h,g)},b.createBytes=function(a,b){for(var d=0,e=0,f=0,g=new Array(b.length),h=new Array(b.length),i=0;i<b.length;i++){var j=b[i].dataCount,k=b[i].totalCount-j;e=Math.max(e,j),f=Math.max(f,k),g[i]=new Array(j);for(var l=0;l<g[i].length;l++)g[i][l]=255&a.buffer[l+d];d+=j;var n=m.getErrorCorrectPolynomial(k),o=new c(g[i],n.getLength()-1),p=o.mod(n);h[i]=new Array(n.getLength()-1);for(var l=0;l<h[i].length;l++){var q=l+p.getLength()-h[i].length;h[i][l]=q>=0?p.get(q):0}}for(var r=0,l=0;l<b.length;l++)r+=b [l].totalCount;for(var s=new Array(r),t=0,l=0;e>l;l++)for(var i=0;i<b.length;i++)l<g [i].length&&(s[t++]=g[i][l]);for(var l=0;f>l;l++)for(var i=0;i<b.length;i++)l<h[i].length&&(s[t++]=h[i][l]);return s};for(var j={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},k={L:1,M:0,Q:3,H:2},l={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},m={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(a){for(var b=a<<10;m.getBCHDigit(b)-m.getBCHDigit(m.G15 )>=0;)b^=m.G15<<m.getBCHDigit(b)-m.getBCHDigit(m.G15);return(a<<10|b)^m.G15_MASK},getBCHTypeNumber:function(a){for(var b=a<<12;m.getBCHDigit(b)-m.getBCHDigit(m.G18)>=0;)b^=m.G18<<m.getBCHDigit(b)-m.getBCHDigit(m.G18);return a<<12|b},getBCHDigit:function(a){for(var b=0;0!=a;)b++,a>>>=1;return b},getPatternPosition:function(a){return m.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case l.PATTERN000:return(b+c)%2==0;case l.PATTERN001:return b%2==0;case l.PATTERN010:return c%3==0;case l.PATTERN011:return(b+c)%3==0;case l.PATTERN100:return(Math.floor(b/2)+Math.floor(c/3))%2==0;case l.PATTERN101:return b*c%2+b*c%3==0;case l.PATTERN110:return(b*c%2+b*c%3)%2==0;case l.PATTERN111:return(b*c%3+(b+c)%2)%2==0;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new c([1],0),d=0;a>d;d++)b=b.multiply(new c([1,n.gexp(d)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case j.MODE_NUMBER:return 10;case j.MODE_ALPHA_NUM:return 9;case j.MODE_8BIT_BYTE:return 8;case j.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case j.MODE_NUMBER:return 12;case j.MODE_ALPHA_NUM:return 11;case j.MODE_8BIT_BYTE:return 16;case j.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case j.MODE_NUMBER:return 14;case j.MODE_ALPHA_NUM:return 13;case j.MODE_8BIT_BYTE:return 16;case j.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||0==h&&0==i||g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,0!=j&&4!=j||(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},n={glog:function(a){if(1>a)throw new Error("glog("+a+")");return n.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return n.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},o=0;8>o;o++)n.EXP_TABLE[o]=1<<o;for(var o=8;256>o;o++)n.EXP_TABLE[o]=n.EXP_TABLE[o-4]^n.EXP_TABLE[o-5]^n.EXP_TABLE[o-6]^n.EXP_TABLE[o-8];for(var o=0;255>o;o++)n.LOG_TABLE[n.EXP_TABLE[o]]=o;c.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),d=0;d<this.getLength();d++)for(var e=0;e<a.getLength();e++)b[d+e]^=n.gexp(n.glog(this.get(d))+n.glog(a.get(e)));return new c(b,0)},mod:function(a){if(this.getLength()-a.getLength()<0)return this;for(var b=n.glog(this.get(0))-n.glog(a.get(0)),d=new Array(this.getLength()),e=0;e<this.getLength();e++)d[e]=this.get(e);for(var e=0;e<a.getLength();e++)d[e]^=n.gexp(n.glog(a.get(e))+b);return new c(d,0).mod(a)}},d.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],d.getRSBlocks=function(a,b){var c=d.getRsBlockTable(a,b);if(void 0==c)throw new Error("bad rs block @ typeNumber:"+a+"/errorCorrectLevel:"+b);for(var e=c.length/3,f=[],g=0;e>g;g++)for(var h=c[3*g+0],i=c[3*g+1],j=c[3*g+2],k=0;h>k;k++)f.push(new d(i,j));return f},d.getRsBlockTable=function(a,b){switch(b){case k.L:return d.RS_BLOCK_TABLE[4*(a-1)+0];case k.M:return d.RS_BLOCK_TABLE[4*(a-1)+1];case k.Q:return d.RS_BLOCK_TABLE[4*(a-1)+2];case k.H:return d.RS_BLOCK_TABLE[4*(a-1)+3];default:return}},e.prototype={get:function(a){var b=Math.floor(a/8);return 1==(this.buffer[b]>>>7-a%8&1)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(a>>>b-c-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer [b]|=128>>>this.length%8),this.length++}};var p=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],q=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function b(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var c=this._htOption,d=this._el,e=a.getModuleCount();Math.floor(c.width/e),Math.floor(c.height/e);this.clear();var f=b("svg",{viewBox:"0 0 "+String(e)+" "+String(e),width:"100%",height:"100%",fill:c.colorLight});f.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),d.appendChild(f),f.appendChild(b("rect",{fill:c.colorLight,width:"100%",height:"100%"})),f.appendChild(b("rect",{fill:c.colorDark,width:"1",height:"1",id:"template"}));for(var g=0;e>g;g++)for(var h=0;e>h;h++)if(a.isDark(g,h)){var i=b("use",{x:String(h),y:String(g)});i.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),f.appendChild(i)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),r="svg"===document.documentElement.tagName.toLowerCase(),s=r?q:f()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function b(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&c._fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,void(d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==")}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var c=1/window.devicePixelRatio,d=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,b,e,f,g,h,i,j,k){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*c;else"undefined"==typeof j&&(arguments[1]*=c,arguments[2]*=c,arguments[3]*=c,arguments[4]*=c);d.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=g(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.alt="Scan me!",this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&b.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCodep=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:k.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._htOption.useSVG&&(s=q),this._android=g(),this._el=a,this._oQRCode=null,this._htOption.text&&this.makeCode(this._htOption.text)},QRCodep.prototype.makeCode=function(a){this._oQRCode=new b(h(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,-1!=this._htOption.dpi&&-1!=this._htOption.mmPerDot&&(this._htOption.width=this._oQRCode.moduleCount*this._htOption.dpi/25.4*this._htOption.mmPerDot,this._htOption.height=this._oQRCode.moduleCount*this._htOption.dpi/25.4*this._htOption.mmPerDot),this._oDrawing=new s(this._el,this._htOption),this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCodep.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCodep.prototype.clear=function(){this._oDrawing.clear()},QRCodep.CorrectLevel=k}();var sepaQR;!function(){"use strict";var a={UTF_8:1,ISO8859_1:2,ISO8859_2:3,ISO8859_4:4,ISO8859_5:5,ISO8859_7:6,ISO8859_10:7,ISO8859_15:8};sepaQR=function(b){if(this._sOpt={serviceTag:"BCD",version:"001",charset:a.UTF_8,identificationCode:"SCT",benefBIC:"",benefName:"",benefAccNr:"",amountEuro:"",purpose:"",creditorRef:"",remittanceInf:"",information:""},b)for(var c in b)this._sOpt[c]=b[c]},sepaQR.prototype.validServiceTag=function(){return"BCD"===this._sOpt.serviceTag},sepaQR.prototype.validVersion=function(){return"001"===this._sOpt.version||"002"===this._sOpt.version},sepaQR.prototype.validCharset=function(){return this._sOpt.charset>0&&this._sOpt.charset<=8},sepaQR.prototype.validIdentificationCode=function(){return"SCT"===this._sOpt.identificationCode},sepaQR.prototype.validBenefName=function(){var a="string"==typeof this._sOpt.benefName&&this._sOpt.benefName.length>=1&&this._sOpt.benefName.length<=70;if(!a)throw new Error("benefName not valid!");return a},sepaQR.prototype.validBenefAccNr=function(){var a="string"==typeof this._sOpt.benefAccNr&&this._sOpt.benefAccNr.length>=1&&this._sOpt.benefAccNr.length<=34;if(!a)throw new Error("benefAccNr not valid!");return a},sepaQR.prototype.validAmountEuro=function(){if("string"==typeof this._sOpt.amountEuro)return 0===this._sOpt.amountEuro.length;if("number"==typeof this._sOpt.amountEuro){this._sOpt.amountEuro=Math.round(100*this._sOpt.amountEuro)/100;var a=this._sOpt.amountEuro>.01&&this._sOpt.amountEuro<=999999999.99;if(!a)throw new Error("Amount not valid!");return a}},sepaQR.prototype.validBenefBic=function(){var a="002"==this._sOpt.version||"string"==typeof this._sOpt.benefBIC&&this._sOpt.benefBIC.length>=0&&this._sOpt.benefBIC.length<=11;if (!a)throw new Error("BIC is mandatory in Version 001!");if(a="string"==typeof this._sOpt.benefBIC&&this._sOpt.benefBIC.length>=0&&this._sOpt.benefBIC.length<=11,!a)throw new Error("benefBIC not valid!");return a},sepaQR.prototype.validPurpose=function(){var a="string"==typeof this._sOpt.purpose&&this._sOpt.purpose.length>=0&&this._sOpt.purpose.length<=4;if(!a)throw new Error("Purpose not valid!");return a},sepaQR.prototype.validInformation=function(){var a="string"==typeof this._sOpt.information&&this._sOpt.information.length>=0&&this._sOpt.information.length<=70;if(!a)throw new Error("Information not valid!");return a},sepaQR.prototype.validCreditorRefOrRemittance=function(){var a="string"==typeof this._sOpt.creditorRef&&0===this._sOpt.creditorRef.length,b="string"==typeof this._sOpt.remittanceInf&&0===this._sOpt.remittanceInf.length,c=a&&"string"==typeof this._sOpt.remittanceInf&&this._sOpt.remittanceInf.length<=140||b&&"string "==typeof this._sOpt.creditorRef&&this._sOpt.creditorRef.length<=35;if(!c)throw new Error("creditorRef or Remittance not valid!");return c},sepaQR.prototype.validQRTextLength=function(){for(var a=this.prepareQRText(),b=0,c=0,d=a.length;d>c;c++){var e=a.charCodeAt(c);b+=e>65536?4:e>2048?3:e>128?2:1}return 328>=b},sepaQR.prototype.valid=function(){var a=this.validServiceTag()&&this.validVersion()&&this.validCharset()&&this.validIdentificationCode()&&this.validBenefName()&&this.validBenefAccNr()&&this.validAmountEuro()&&this.validBenefBic()&&this.validPurpose()&&this.validInformation()&&this.validPurpose()&&this.validCreditorRefOrRemittance()&&this.validQRTextLength();return a},sepaQR.prototype.prepareQRText=function(){return(this._sOpt.serviceTag+"\n"+this._sOpt.version+"\n"+this._sOpt.charset+"\n"+this._sOpt.identificationCode+"\n"+this._sOpt.benefBIC+"\n"+this._sOpt.benefName+"\n"+this._sOpt.benefAccNr+"\nEUR"+this._sOpt.amountEuro+"\n"+this._sOpt.purpose+"\n"+this._sOpt.creditorRef+"\n"+this._sOpt.remittanceInf+"\n"+this._sOpt.information).trim()},sepaQR.prototype.toQRText=function(){return this.valid()?this.prepareQRText():""},sepaQR.prototype.makeCodeInto=function(a,b){var c={width:256,height:256,mmPerDot:.85,dpi:92,correctLevel:QRCodep.CorrectLevel.M,text:this.toQRText()};if(0!==c.text.length){if(b)for(var d in b)c[d]=b[d];return this.qrcode=new QRCodep(a,c),this.drawExplanatoryLink(document.getElementById(a).getElementsByTagName("canvas")[0],document.createElement("canvas")),this.qrcode}},sepaQR.prototype.drawExplanatoryLink=function(a,b){var c=3,d=12,e=8,f=6,g=a;b.width=g.width,b.height=g.height,b.getContext("2d").drawImage(g,0,0),g.width=b.width+2*(e+c+f),g.height=b.height+2*(e+c+f),CanvasRenderingContext2D.prototype.roundRect=function(a,b,c,d,e,f){return 2*e>c&&(e=c/2),2*e>d&&(e=d/2),this.beginPath(),this.moveTo(a+e,b),this.arcTo(a+c,b,a+c,b+d,e),this.arcTo(a+c,b+d,a,b+d,e),this.lineTo(a+c-f,b+d),this.moveTo(a+c-110,b+d),this.arcTo(a,b+d,a,b,e),this.arcTo(a,b,a+c,b,e),this};var h=g.getContext("2d");h.fillStyle="white",h.rect(0,0,g.width,g.height),h.fill(),h.drawImage(b,e+c+f,e+c+f),h.lineWidth=c,h.roundRect(f+c/2,f+c/2,g.width-c-2*f,g.height-c-2*f,d,3*e).stroke(),h.fillStyle="black",h.font=4.5*c+"px Arial",h.fillText("sepaQR.eu",g.width-110,g.height-f/2)},sepaQR.Charset=a}();</script> <script>var QRCodep;!function(){function a(a){this.mode=j.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=0,c=this.data.length;c>b;b++){var d=[],e=this.data.charCodeAt(b);e>65536?(d[0]=240|(1835008&e)>>>18,d[1]=128|(258048&e)>>>12,d[2]=128|(4032&e)>>>6,d[3]=128|63&e):e>2048?(d[0]=224|(61440&e)>>>12,d[1]=128|(4032&e)>>>6,d[2]=128|63&e):e>128?(d[0]=192|(1984&e)>>>6,d[1]=128|63&e):d[0]=e,this.parsedData.push(d)}this.parsedData=Array.prototype.concat.apply([],this.parsedData),this.parsedData.length!=this.data.length}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function c(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c<a.length&&0==a[c];)c++;this.num=new Array(a.length-c+b);for(var d=0;d<a.length-c;d++)this.num[d]=a[d+c]}function d(a,b){this.totalCount=a,this.dataCount=b}function e(){this.buffer=[],this.length=0}function f(){return"undefined"!=typeof CanvasRenderingContext2D}function g(){var a=!1,b=navigator.userAgent;if(/android/i.test(b)){a=!0;var c=b.toString().match(/android ([0-9]\.[0-9])/i);c&&c[1]&&(a=parseFloat(c[1]))}return a}function h(a,b){for(var c=1,d=i(a),e=0,f=p.length;f>=e;e++){var g=0;switch(b){case k.L:g=p[e][0];break;case k.M:g=p[e][1];break;case k.Q:g=p[e][2];break;case k.H:g=p[e][3]}if(g>=d)break;c++}if(c>p.length)throw new Error("Too long data");return c}function i(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(a){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d<this.moduleCount;d++){this.modules[d]=new Array(this.moduleCount);for(var e=0;e<this.moduleCount;e++)this.modules[d][e]=null}this.setupPositionProbePattern(0,0),this.setupPositionProbePattern(this.moduleCount-7,0),this.setupPositionProbePattern(0,this.moduleCount-7),this.setupPositionAdjustPattern(),this.setupTimingPattern(),this.setupTypeInfo(a,c),this.typeNumber>=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?this.modules[a+c][b+d]=!0:this.modules[a+c][b+d]=!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=m.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f<this.modules.length;f++)for(var g=f*e,h=0;h<this.modules[f].length;h++){var i=h*e,j=this.modules[f][h];j&&(d.beginFill(0,100),d.moveTo(i,g),d.lineTo(i+e,g),d.lineTo(i+e,g+e),d.lineTo(i,g+e),d.endFill())}return d},setupTimingPattern:function(){for(var a=8;a<this.moduleCount-8;a++)null==this.modules[a][6]&&(this.modules[a][6]=a%2==0);for(var b=8;b<this.moduleCount-8;b++)null==this.modules[6][b]&&(this.modules[6][b]=b%2==0)},setupPositionAdjustPattern:function(){for(var a=m.getPatternPosition(this.typeNumber),b=0;b<a.length;b++)for(var c=0;c<a.length;c++){var d=a[b],e=a[c];if(null==this.modules[d][e])for(var f=-2;2>=f;f++)for(var g=-2;2>=g;g++)-2==f||2==f||-2==g||2==g||0==f&&0==g?this.modules[d+f][e+g]=!0:this.modules[d+f][e+g]=!1}},setupTypeNumber:function(a){for(var b=m.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(b>>c&1);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(b>>c&1);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=m.getBCHTypeInfo(c),e=0;15>e;e++){var f=!a&&1==(d>>e&1);6>e?this.modules[e][8]=f:8>e?this.modules[e+1][8]=f:this.modules[this.moduleCount-15+e][8]=f}for(var e=0;15>e;e++){var f=!a&&1==(d>>e&1);8>e?this.modules[8][this.moduleCount-e-1]=f:9>e?this.modules[8][15-e-1+1]=f:this.modules[8][15-e-1]=f}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,f=0,g=this.moduleCount-1;g>0;g-=2)for(6==g&&g--;;){for(var h=0;2>h;h++)if(null==this.modules[d][g-h]){var i=!1;f<a.length&&(i=1==(a[f]>>>e&1));var j=m.getMask(b,d,g-h);j&&(i=!i),this.modules[d][g-h]=i,e--,-1==e&&(f++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,f){for(var g=d.getRSBlocks(a,c),h=new e,i=0;i<f.length;i++){var j=f[i];h.put(j.mode,4),h.put(j.getLength(),m.getLengthInBits(j.mode,a)),j.write(h)}for(var k=0,i=0;i<g.length;i++)k+=g[i].dataCount;if(h.getLengthInBits()>8*k)throw new Error("code length overflow. ("+h.getLengthInBits()+">"+8*k+")");for(h.getLengthInBits()+4<=8*k&&h.put(0,4);h.getLengthInBits()%8!=0;)h.putBit(!1);for(;;){if(h.getLengthInBits()>=8*k)break;if(h.put(b.PAD0,8),h.getLengthInBits()>=8*k)break;h.put(b.PAD1,8)}return b.createBytes(h,g)},b.createBytes=function(a,b){for(var d=0,e=0,f=0,g=new Array(b.length),h=new Array(b.length),i=0;i<b.length;i++){var j=b[i].dataCount,k=b[i].totalCount-j;e=Math.max(e,j),f=Math.max(f,k),g[i]=new Array(j);for(var l=0;l<g[i].length;l++)g[i][l]=255&a.buffer[l+d];d+=j;var n=m.getErrorCorrectPolynomial(k),o=new c(g[i],n.getLength()-1),p=o.mod(n);h[i]=new Array(n.getLength()-1);for(var l=0;l<h[i].length;l++){var q=l+p.getLength()-h[i].length;h[i][l]=q>=0?p.get(q):0}}for(var r=0,l=0;l<b.length;l++)r+=b [l].totalCount;for(var s=new Array(r),t=0,l=0;e>l;l++)for(var i=0;i<b.length;i++)l<g [i].length&&(s[t++]=g[i][l]);for(var l=0;f>l;l++)for(var i=0;i<b.length;i++)l<h[i].length&&(s[t++]=h[i][l]);return s};for(var j={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},k={L:1,M:0,Q:3,H:2},l={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},m={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(a){for(var b=a<<10;m.getBCHDigit(b)-m.getBCHDigit(m.G15 )>=0;)b^=m.G15<<m.getBCHDigit(b)-m.getBCHDigit(m.G15);return(a<<10|b)^m.G15_MASK},getBCHTypeNumber:function(a){for(var b=a<<12;m.getBCHDigit(b)-m.getBCHDigit(m.G18)>=0;)b^=m.G18<<m.getBCHDigit(b)-m.getBCHDigit(m.G18);return a<<12|b},getBCHDigit:function(a){for(var b=0;0!=a;)b++,a>>>=1;return b},getPatternPosition:function(a){return m.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case l.PATTERN000:return(b+c)%2==0;case l.PATTERN001:return b%2==0;case l.PATTERN010:return c%3==0;case l.PATTERN011:return(b+c)%3==0;case l.PATTERN100:return(Math.floor(b/2)+Math.floor(c/3))%2==0;case l.PATTERN101:return b*c%2+b*c%3==0;case l.PATTERN110:return(b*c%2+b*c%3)%2==0;case l.PATTERN111:return(b*c%3+(b+c)%2)%2==0;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new c([1],0),d=0;a>d;d++)b=b.multiply(new c([1,n.gexp(d)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case j.MODE_NUMBER:return 10;case j.MODE_ALPHA_NUM:return 9;case j.MODE_8BIT_BYTE:return 8;case j.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case j.MODE_NUMBER:return 12;case j.MODE_ALPHA_NUM:return 11;case j.MODE_8BIT_BYTE:return 16;case j.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case j.MODE_NUMBER:return 14;case j.MODE_ALPHA_NUM:return 13;case j.MODE_8BIT_BYTE:return 16;case j.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||0==h&&0==i||g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,0!=j&&4!=j||(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},n={glog:function(a){if(1>a)throw new Error("glog("+a+")");return n.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return n.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},o=0;8>o;o++)n.EXP_TABLE[o]=1<<o;for(var o=8;256>o;o++)n.EXP_TABLE[o]=n.EXP_TABLE[o-4]^n.EXP_TABLE[o-5]^n.EXP_TABLE[o-6]^n.EXP_TABLE[o-8];for(var o=0;255>o;o++)n.LOG_TABLE[n.EXP_TABLE[o]]=o;c.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),d=0;d<this.getLength();d++)for(var e=0;e<a.getLength();e++)b[d+e]^=n.gexp(n.glog(this.get(d))+n.glog(a.get(e)));return new c(b,0)},mod:function(a){if(this.getLength()-a.getLength()<0)return this;for(var b=n.glog(this.get(0))-n.glog(a.get(0)),d=new Array(this.getLength()),e=0;e<this.getLength();e++)d[e]=this.get(e);for(var e=0;e<a.getLength();e++)d[e]^=n.gexp(n.glog(a.get(e))+b);return new c(d,0).mod(a)}},d.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],d.getRSBlocks=function(a,b){var c=d.getRsBlockTable(a,b);if(void 0==c)throw new Error("bad rs block @ typeNumber:"+a+"/errorCorrectLevel:"+b);for(var e=c.length/3,f=[],g=0;e>g;g++)for(var h=c[3*g+0],i=c[3*g+1],j=c[3*g+2],k=0;h>k;k++)f.push(new d(i,j));return f},d.getRsBlockTable=function(a,b){switch(b){case k.L:return d.RS_BLOCK_TABLE[4*(a-1)+0];case k.M:return d.RS_BLOCK_TABLE[4*(a-1)+1];case k.Q:return d.RS_BLOCK_TABLE[4*(a-1)+2];case k.H:return d.RS_BLOCK_TABLE[4*(a-1)+3];default:return}},e.prototype={get:function(a){var b=Math.floor(a/8);return 1==(this.buffer[b]>>>7-a%8&1)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(a>>>b-c-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer [b]|=128>>>this.length%8),this.length++}};var p=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],q=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function b(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var c=this._htOption,d=this._el,e=a.getModuleCount();Math.floor(c.width/e),Math.floor(c.height/e);this.clear();var f=b("svg",{viewBox:"0 0 "+String(e)+" "+String(e),width:"100%",height:"100%",fill:c.colorLight});f.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),d.appendChild(f),f.appendChild(b("rect",{fill:c.colorLight,width:"100%",height:"100%"})),f.appendChild(b("rect",{fill:c.colorDark,width:"1",height:"1",id:"template"}));for(var g=0;e>g;g++)for(var h=0;e>h;h++)if(a.isDark(g,h)){var i=b("use",{x:String(h),y:String(g)});i.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),f.appendChild(i)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),r="svg"===document.documentElement.tagName.toLowerCase(),s=r?q:f()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function b(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&c._fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,void(d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==")}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var c=1/window.devicePixelRatio,d=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,b,e,f,g,h,i,j,k){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*c;else"undefined"==typeof j&&(arguments[1]*=c,arguments[2]*=c,arguments[3]*=c,arguments[4]*=c);d.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=g(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.alt="Scan me!",this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&b.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCodep=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:k.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._htOption.useSVG&&(s=q),this._android=g(),this._el=a,this._oQRCode=null,this._htOption.text&&this.makeCode(this._htOption.text)},QRCodep.prototype.makeCode=function(a){this._oQRCode=new b(h(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,-1!=this._htOption.dpi&&-1!=this._htOption.mmPerDot&&(this._htOption.width=this._oQRCode.moduleCount*this._htOption.dpi/25.4*this._htOption.mmPerDot,this._htOption.height=this._oQRCode.moduleCount*this._htOption.dpi/25.4*this._htOption.mmPerDot),this._oDrawing=new s(this._el,this._htOption),this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCodep.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCodep.prototype.clear=function(){this._oDrawing.clear()},QRCodep.CorrectLevel=k}();var sepaQR;!function(){"use strict";var a={UTF_8:1,ISO8859_1:2,ISO8859_2:3,ISO8859_4:4,ISO8859_5:5,ISO8859_7:6,ISO8859_10:7,ISO8859_15:8};sepaQR=function(b){if(this._sOpt={serviceTag:"BCD",version:"001",charset:a.UTF_8,identificationCode:"SCT",benefBIC:"",benefName:"",benefAccNr:"",amountEuro:"",purpose:"",creditorRef:"",remittanceInf:"",information:""},b)for(var c in b)this._sOpt[c]=b[c]},sepaQR.prototype.validServiceTag=function(){return"BCD"===this._sOpt.serviceTag},sepaQR.prototype.validVersion=function(){return"001"===this._sOpt.version||"002"===this._sOpt.version},sepaQR.prototype.validCharset=function(){return this._sOpt.charset>0&&this._sOpt.charset<=8},sepaQR.prototype.validIdentificationCode=function(){return"SCT"===this._sOpt.identificationCode},sepaQR.prototype.validBenefName=function(){var a="string"==typeof this._sOpt.benefName&&this._sOpt.benefName.length>=1&&this._sOpt.benefName.length<=70;if(!a)throw new Error("benefName not valid!");return a},sepaQR.prototype.validBenefAccNr=function(){var a="string"==typeof this._sOpt.benefAccNr&&this._sOpt.benefAccNr.length>=1&&this._sOpt.benefAccNr.length<=34;if(!a)throw new Error("benefAccNr not valid!");return a},sepaQR.prototype.validAmountEuro=function(){if("string"==typeof this._sOpt.amountEuro)return 0===this._sOpt.amountEuro.length;if("number"==typeof this._sOpt.amountEuro){this._sOpt.amountEuro=Math.round(100*this._sOpt.amountEuro)/100;var a=this._sOpt.amountEuro>.01&&this._sOpt.amountEuro<=999999999.99;if(!a)throw new Error("Amount not valid!");return a}},sepaQR.prototype.validBenefBic=function(){var a="002"==this._sOpt.version||"string"==typeof this._sOpt.benefBIC&&this._sOpt.benefBIC.length>=0&&this._sOpt.benefBIC.length<=11;if (!a)throw new Error("BIC is mandatory in Version 001!");if(a="string"==typeof this._sOpt.benefBIC&&this._sOpt.benefBIC.length>=0&&this._sOpt.benefBIC.length<=11,!a)throw new Error("benefBIC not valid!");return a},sepaQR.prototype.validPurpose=function(){var a="string"==typeof this._sOpt.purpose&&this._sOpt.purpose.length>=0&&this._sOpt.purpose.length<=4;if(!a)throw new Error("Purpose not valid!");return a},sepaQR.prototype.validInformation=function(){var a="string"==typeof this._sOpt.information&&this._sOpt.information.length>=0&&this._sOpt.information.length<=70;if(!a)throw new Error("Information not valid!");return a},sepaQR.prototype.validCreditorRefOrRemittance=function(){var a="string"==typeof this._sOpt.creditorRef&&0===this._sOpt.creditorRef.length,b="string"==typeof this._sOpt.remittanceInf&&0===this._sOpt.remittanceInf.length,c=a&&"string"==typeof this._sOpt.remittanceInf&&this._sOpt.remittanceInf.length<=140||b&&"string"==typeof this._sOpt.creditorRef&&this._sOpt.creditorRef.length<=35;if(!c)throw new Error("creditorRef or Remittance not valid!");return c},sepaQR.prototype.validQRTextLength=function(){for(var a=this.prepareQRText(),b=0,c=0,d=a.length;d>c;c++){var e=a.charCodeAt(c);b+=e>65536?4:e>2048?3:e>128?2:1}return 328>=b},sepaQR.prototype.valid=function(){var a=this.validServiceTag()&&this.validVersion()&&this.validCharset()&&this.validIdentificationCode()&&this.validBenefName()&&this.validBenefAccNr()&&this.validAmountEuro()&&this.validBenefBic()&&this.validPurpose()&&this.validInformation()&&this.validPurpose()&&this.validCreditorRefOrRemittance()&&this.validQRTextLength();return a},sepaQR.prototype.prepareQRText=function(){return(this._sOpt.serviceTag+"\n"+this._sOpt.version+"\n"+this._sOpt.charset+"\n"+this._sOpt.identificationCode+"\n"+this._sOpt.benefBIC+"\n"+this._sOpt.benefName+"\n"+this._sOpt.benefAccNr+"\nEUR"+this._sOpt.amountEuro+"\n"+this._sOpt.purpose+"\n"+this._sOpt.creditorRef+"\n"+this._sOpt.remittanceInf+"\n"+this._sOpt.information).trim()},sepaQR.prototype.toQRText=function(){return this.valid()?this.prepareQRText():""},sepaQR.prototype.makeCodeInto=function(a,b){var c={width:256,height:256,mmPerDot:.85,dpi:92,correctLevel:QRCodep.CorrectLevel.M,text:this.toQRText()};if(0!==c.text.length){if(b)for(var d in b)c[d]=b[d];return this.qrcode=new QRCodep(a,c),this.drawExplanatoryLink(document.getElementById(a).getElementsByTagName("canvas")[0],document.createElement("canvas")),this.qrcode}},sepaQR.prototype.drawExplanatoryLink=function(a,b){var c=3,d=12,e=8,f=6,g=a;b.width=g.width,b.height=g.height,b.getContext("2d").drawImage(g,0,0),g.width=b.width+2*(e+c+f),g.height=b.height+2*(e+c+f),CanvasRenderingContext2D.prototype.roundRect=function(a,b,c,d,e,f){return 2*e>c&&(e=c/2),2*e>d&&(e=d/2),this.beginPath(),this.moveTo(a+e,b),this.arcTo(a+c,b,a+c,b+d,e),this.arcTo(a+c,b+d,a,b+d,e),this.lineTo(a+c-f,b+d),this.moveTo(a+c-110,b+d),this.arcTo(a,b+d,a,b,e),this.arcTo(a,b,a+c,b,e),this};var h=g.getContext("2d");h.fillStyle="white",h.rect(0,0,g.width,g.height),h.fill(),h.drawImage(b,e+c+f,e+c+f),h.lineWidth=c,h.roundRect(f+c/2,f+c/2,g.width-c-2*f,g.height-c-2*f,d,3*e).stroke(),h.fillStyle="black",h.font=4.5*c+"px Arial",h.fillText("sepaQR.eu",g.width-110,g.height-f/2)},sepaQR.Charset=a}();</script>
|
<script>var QRCodep;!function(){function a(a){this.mode=j.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=0,c=this.data.length;c>b;b++){var d=[],e=this.data.charCodeAt(b);e>65536?(d[0]=240|(1835008&e)>>>18,d[1]=128|(258048&e)>>>12,d[2]=128|(4032&e)>>>6,d[3]=128|63&e):e>2048?(d[0]=224|(61440&e)>>>12,d[1]=128|(4032&e)>>>6,d[2]=128|63&e):e>128?(d[0]=192|(1984&e)>>>6,d[1]=128|63&e):d[0]=e,this.parsedData.push(d)}this.parsedData=Array.prototype.concat.apply([],this.parsedData),this.parsedData.length!=this.data.length}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function c(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c<a.length&&0==a[c];)c++;this.num=new Array(a.length-c+b);for(var d=0;d<a.length-c;d++)this.num[d]=a[d+c]}function d(a,b){this.totalCount=a,this.dataCount=b}function e(){this.buffer=[],this.length=0}function f(){return"undefined"!=typeof CanvasRenderingContext2D}function g(){var a=!1,b=navigator.userAgent;if(/android/i.test(b)){a=!0;var c=b.toString().match(/android ([0-9]\.[0-9])/i);c&&c[1]&&(a=parseFloat(c[1]))}return a}function h(a,b){for(var c=1,d=i(a),e=0,f=p.length;f>=e;e++){var g=0;switch(b){case k.L:g=p[e][0];break;case k.M:g=p[e][1];break;case k.Q:g=p[e][2];break;case k.H:g=p[e][3]}if(g>=d)break;c++}if(c>p.length)throw new Error("Too long data");return c}function i(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(a){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d<this.moduleCount;d++){this.modules[d]=new Array(this.moduleCount);for(var e=0;e<this.moduleCount;e++)this.modules[d][e]=null}this.setupPositionProbePattern(0,0),this.setupPositionProbePattern(this.moduleCount-7,0),this.setupPositionProbePattern(0,this.moduleCount-7),this.setupPositionAdjustPattern(),this.setupTimingPattern(),this.setupTypeInfo(a,c),this.typeNumber>=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?this.modules[a+c][b+d]=!0:this.modules[a+c][b+d]=!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=m.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f<this.modules.length;f++)for(var g=f*e,h=0;h<this.modules[f].length;h++){var i=h*e,j=this.modules[f][h];j&&(d.beginFill(0,100),d.moveTo(i,g),d.lineTo(i+e,g),d.lineTo(i+e,g+e),d.lineTo(i,g+e),d.endFill())}return d},setupTimingPattern:function(){for(var a=8;a<this.moduleCount-8;a++)null==this.modules[a][6]&&(this.modules[a][6]=a%2==0);for(var b=8;b<this.moduleCount-8;b++)null==this.modules[6][b]&&(this.modules[6][b]=b%2==0)},setupPositionAdjustPattern:function(){for(var a=m.getPatternPosition(this.typeNumber),b=0;b<a.length;b++)for(var c=0;c<a.length;c++){var d=a[b],e=a[c];if(null==this.modules[d][e])for(var f=-2;2>=f;f++)for(var g=-2;2>=g;g++)-2==f||2==f||-2==g||2==g||0==f&&0==g?this.modules[d+f][e+g]=!0:this.modules[d+f][e+g]=!1}},setupTypeNumber:function(a){for(var b=m.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(b>>c&1);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(b>>c&1);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=m.getBCHTypeInfo(c),e=0;15>e;e++){var f=!a&&1==(d>>e&1);6>e?this.modules[e][8]=f:8>e?this.modules[e+1][8]=f:this.modules[this.moduleCount-15+e][8]=f}for(var e=0;15>e;e++){var f=!a&&1==(d>>e&1);8>e?this.modules[8][this.moduleCount-e-1]=f:9>e?this.modules[8][15-e-1+1]=f:this.modules[8][15-e-1]=f}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,f=0,g=this.moduleCount-1;g>0;g-=2)for(6==g&&g--;;){for(var h=0;2>h;h++)if(null==this.modules[d][g-h]){var i=!1;f<a.length&&(i=1==(a[f]>>>e&1));var j=m.getMask(b,d,g-h);j&&(i=!i),this.modules[d][g-h]=i,e--,-1==e&&(f++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,f){for(var g=d.getRSBlocks(a,c),h=new e,i=0;i<f.length;i++){var j=f[i];h.put(j.mode,4),h.put(j.getLength(),m.getLengthInBits(j.mode,a)),j.write(h)}for(var k=0,i=0;i<g.length;i++)k+=g[i].dataCount;if(h.getLengthInBits()>8*k)throw new Error("code length overflow. ("+h.getLengthInBits()+">"+8*k+")");for(h.getLengthInBits()+4<=8*k&&h.put(0,4);h.getLengthInBits()%8!=0;)h.putBit(!1);for(;;){if(h.getLengthInBits()>=8*k)break;if(h.put(b.PAD0,8),h.getLengthInBits()>=8*k)break;h.put(b.PAD1,8)}return b.createBytes(h,g)},b.createBytes=function(a,b){for(var d=0,e=0,f=0,g=new Array(b.length),h=new Array(b.length),i=0;i<b.length;i++){var j=b[i].dataCount,k=b[i].totalCount-j;e=Math.max(e,j),f=Math.max(f,k),g[i]=new Array(j);for(var l=0;l<g[i].length;l++)g[i][l]=255&a.buffer[l+d];d+=j;var n=m.getErrorCorrectPolynomial(k),o=new c(g[i],n.getLength()-1),p=o.mod(n);h[i]=new Array(n.getLength()-1);for(var l=0;l<h[i].length;l++){var q=l+p.getLength()-h[i].length;h[i][l]=q>=0?p.get(q):0}}for(var r=0,l=0;l<b.length;l++)r+=b[l].totalCount;for(var s=new Array(r),t=0,l=0;e>l;l++)for(var i=0;i<b.length;i++)l<g[i].length&&(s[t++]=g[i][l]);for(var l=0;f>l;l++)for(var i=0;i<b.length;i++)l<h[i].length&&(s[t++]=h[i][l]);return s};for(var j={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},k={L:1,M:0,Q:3,H:2},l={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},m={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(a){for(var b=a<<10;m.getBCHDigit(b)-m.getBCHDigit(m.G15)>=0;)b^=m.G15<<m.getBCHDigit(b)-m.getBCHDigit(m.G15);return(a<<10|b)^m.G15_MASK},getBCHTypeNumber:function(a){for(var b=a<<12;m.getBCHDigit(b)-m.getBCHDigit(m.G18)>=0;)b^=m.G18<<m.getBCHDigit(b)-m.getBCHDigit(m.G18);return a<<12|b},getBCHDigit:function(a){for(var b=0;0!=a;)b++,a>>>=1;return b},getPatternPosition:function(a){return m.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case l.PATTERN000:return(b+c)%2==0;case l.PATTERN001:return b%2==0;case l.PATTERN010:return c%3==0;case l.PATTERN011:return(b+c)%3==0;case l.PATTERN100:return(Math.floor(b/2)+Math.floor(c/3))%2==0;case l.PATTERN101:return b*c%2+b*c%3==0;case l.PATTERN110:return(b*c%2+b*c%3)%2==0;case l.PATTERN111:return(b*c%3+(b+c)%2)%2==0;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new c([1],0),d=0;a>d;d++)b=b.multiply(new c([1,n.gexp(d)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case j.MODE_NUMBER:return 10;case j.MODE_ALPHA_NUM:return 9;case j.MODE_8BIT_BYTE:return 8;case j.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case j.MODE_NUMBER:return 12;case j.MODE_ALPHA_NUM:return 11;case j.MODE_8BIT_BYTE:return 16;case j.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case j.MODE_NUMBER:return 14;case j.MODE_ALPHA_NUM:return 13;case j.MODE_8BIT_BYTE:return 16;case j.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||0==h&&0==i||g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,0!=j&&4!=j||(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},n={glog:function(a){if(1>a)throw new Error("glog("+a+")");return n.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return n.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},o=0;8>o;o++)n.EXP_TABLE[o]=1<<o;for(var o=8;256>o;o++)n.EXP_TABLE[o]=n.EXP_TABLE[o-4]^n.EXP_TABLE[o-5]^n.EXP_TABLE[o-6]^n.EXP_TABLE[o-8];for(var o=0;255>o;o++)n.LOG_TABLE[n.EXP_TABLE[o]]=o;c.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),d=0;d<this.getLength();d++)for(var e=0;e<a.getLength();e++)b[d+e]^=n.gexp(n.glog(this.get(d))+n.glog(a.get(e)));return new c(b,0)},mod:function(a){if(this.getLength()-a.getLength()<0)return this;for(var b=n.glog(this.get(0))-n.glog(a.get(0)),d=new Array(this.getLength()),e=0;e<this.getLength();e++)d[e]=this.get(e);for(var e=0;e<a.getLength();e++)d[e]^=n.gexp(n.glog(a.get(e))+b);return new c(d,0).mod(a)}},d.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],d.getRSBlocks=function(a,b){var c=d.getRsBlockTable(a,b);if(void 0==c)throw new Error("bad rs block @ typeNumber:"+a+"/errorCorrectLevel:"+b);for(var e=c.length/3,f=[],g=0;e>g;g++)for(var h=c[3*g+0],i=c[3*g+1],j=c[3*g+2],k=0;h>k;k++)f.push(new d(i,j));return f},d.getRsBlockTable=function(a,b){switch(b){case k.L:return d.RS_BLOCK_TABLE[4*(a-1)+0];case k.M:return d.RS_BLOCK_TABLE[4*(a-1)+1];case k.Q:return d.RS_BLOCK_TABLE[4*(a-1)+2];case k.H:return d.RS_BLOCK_TABLE[4*(a-1)+3];default:return}},e.prototype={get:function(a){var b=Math.floor(a/8);return 1==(this.buffer[b]>>>7-a%8&1)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(a>>>b-c-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var p=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],q=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function b(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var c=this._htOption,d=this._el,e=a.getModuleCount();Math.floor(c.width/e),Math.floor(c.height/e);this.clear();var f=b("svg",{viewBox:"0 0 "+String(e)+" "+String(e),width:"100%",height:"100%",fill:c.colorLight});f.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),d.appendChild(f),f.appendChild(b("rect",{fill:c.colorLight,width:"100%",height:"100%"})),f.appendChild(b("rect",{fill:c.colorDark,width:"1",height:"1",id:"template"}));for(var g=0;e>g;g++)for(var h=0;e>h;h++)if(a.isDark(g,h)){var i=b("use",{x:String(h),y:String(g)});i.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),f.appendChild(i)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),r="svg"===document.documentElement.tagName.toLowerCase(),s=r?q:f()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function b(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&c._fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,void(d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==")}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var c=1/window.devicePixelRatio,d=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,b,e,f,g,h,i,j,k){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*c;else"undefined"==typeof j&&(arguments[1]*=c,arguments[2]*=c,arguments[3]*=c,arguments[4]*=c);d.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=g(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.alt="Scan me!",this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&b.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCodep=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:k.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._htOption.useSVG&&(s=q),this._android=g(),this._el=a,this._oQRCode=null,this._htOption.text&&this.makeCode(this._htOption.text)},QRCodep.prototype.makeCode=function(a){this._oQRCode=new b(h(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,-1!=this._htOption.dpi&&-1!=this._htOption.mmPerDot&&(this._htOption.width=this._oQRCode.moduleCount*this._htOption.dpi/25.4*this._htOption.mmPerDot,this._htOption.height=this._oQRCode.moduleCount*this._htOption.dpi/25.4*this._htOption.mmPerDot),this._oDrawing=new s(this._el,this._htOption),this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCodep.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCodep.prototype.clear=function(){this._oDrawing.clear()},QRCodep.CorrectLevel=k}();var sepaQR;!function(){"use strict";var a={UTF_8:1,ISO8859_1:2,ISO8859_2:3,ISO8859_4:4,ISO8859_5:5,ISO8859_7:6,ISO8859_10:7,ISO8859_15:8};sepaQR=function(b){if(this._sOpt={serviceTag:"BCD",version:"001",charset:a.UTF_8,identificationCode:"SCT",benefBIC:"",benefName:"",benefAccNr:"",amountEuro:"",purpose:"",creditorRef:"",remittanceInf:"",information:""},b)for(var c in b)this._sOpt[c]=b[c]},sepaQR.prototype.validServiceTag=function(){return"BCD"===this._sOpt.serviceTag},sepaQR.prototype.validVersion=function(){return"001"===this._sOpt.version||"002"===this._sOpt.version},sepaQR.prototype.validCharset=function(){return this._sOpt.charset>0&&this._sOpt.charset<=8},sepaQR.prototype.validIdentificationCode=function(){return"SCT"===this._sOpt.identificationCode},sepaQR.prototype.validBenefName=function(){var a="string"==typeof this._sOpt.benefName&&this._sOpt.benefName.length>=1&&this._sOpt.benefName.length<=70;if(!a)throw new Error("benefName not valid!");return a},sepaQR.prototype.validBenefAccNr=function(){var a="string"==typeof this._sOpt.benefAccNr&&this._sOpt.benefAccNr.length>=1&&this._sOpt.benefAccNr.length<=34;if(!a)throw new Error("benefAccNr not valid!");return a},sepaQR.prototype.validAmountEuro=function(){if("string"==typeof this._sOpt.amountEuro)return 0===this._sOpt.amountEuro.length;if("number"==typeof this._sOpt.amountEuro){this._sOpt.amountEuro=Math.round(100*this._sOpt.amountEuro)/100;var a=this._sOpt.amountEuro>.01&&this._sOpt.amountEuro<=999999999.99;if(!a)throw new Error("Amount not valid!");return a}},sepaQR.prototype.validBenefBic=function(){var a="002"==this._sOpt.version||"string"==typeof this._sOpt.benefBIC&&this._sOpt.benefBIC.length>=0&&this._sOpt.benefBIC.length<=11;if(!a)throw new Error("BIC is mandatory in Version 001!");if(a="string"==typeof this._sOpt.benefBIC&&this._sOpt.benefBIC.length>=0&&this._sOpt.benefBIC.length<=11,!a)throw new Error("benefBIC not valid!");return a},sepaQR.prototype.validPurpose=function(){var a="string"==typeof this._sOpt.purpose&&this._sOpt.purpose.length>=0&&this._sOpt.purpose.length<=4;if(!a)throw new Error("Purpose not valid!");return a},sepaQR.prototype.validInformation=function(){var a="string"==typeof this._sOpt.information&&this._sOpt.information.length>=0&&this._sOpt.information.length<=70;if(!a)throw new Error("Information not valid!");return a},sepaQR.prototype.validCreditorRefOrRemittance=function(){var a="string"==typeof this._sOpt.creditorRef&&0===this._sOpt.creditorRef.length,b="string"==typeof this._sOpt.remittanceInf&&0===this._sOpt.remittanceInf.length,c=a&&"string"==typeof this._sOpt.remittanceInf&&this._sOpt.remittanceInf.length<=140||b&&"string"==typeof this._sOpt.creditorRef&&this._sOpt.creditorRef.length<=35;if(!c)throw new Error("creditorRef or Remittance not valid!");return c},sepaQR.prototype.validQRTextLength=function(){for(var a=this.prepareQRText(),b=0,c=0,d=a.length;d>c;c++){var e=a.charCodeAt(c);b+=e>65536?4:e>2048?3:e>128?2:1}return 328>=b},sepaQR.prototype.valid=function(){var a=this.validServiceTag()&&this.validVersion()&&this.validCharset()&&this.validIdentificationCode()&&this.validBenefName()&&this.validBenefAccNr()&&this.validAmountEuro()&&this.validBenefBic()&&this.validPurpose()&&this.validInformation()&&this.validPurpose()&&this.validCreditorRefOrRemittance()&&this.validQRTextLength();return a},sepaQR.prototype.prepareQRText=function(){return(this._sOpt.serviceTag+"\n"+this._sOpt.version+"\n"+this._sOpt.charset+"\n"+this._sOpt.identificationCode+"\n"+this._sOpt.benefBIC+"\n"+this._sOpt.benefName+"\n"+this._sOpt.benefAccNr+"\nEUR"+this._sOpt.amountEuro+"\n"+this._sOpt.purpose+"\n"+this._sOpt.creditorRef+"\n"+this._sOpt.remittanceInf+"\n"+this._sOpt.information).trim()},sepaQR.prototype.toQRText=function(){return this.valid()?this.prepareQRText():""},sepaQR.prototype.makeCodeInto=function(a,b){var c={width:256,height:256,mmPerDot:.85,dpi:92,correctLevel:QRCodep.CorrectLevel.M,text:this.toQRText()};if(0!==c.text.length){if(b)for(var d in b)c[d]=b[d];return this.qrcode=new QRCodep(a,c),this.drawExplanatoryLink(document.getElementById(a).getElementsByTagName("canvas")[0],document.createElement("canvas")),this.qrcode}},sepaQR.prototype.drawExplanatoryLink=function(a,b){var c=3,d=12,e=8,f=6,g=a;b.width=g.width,b.height=g.height,b.getContext("2d").drawImage(g,0,0),g.width=b.width+2*(e+c+f),g.height=b.height+2*(e+c+f),CanvasRenderingContext2D.prototype.roundRect=function(a,b,c,d,e,f){return 2*e>c&&(e=c/2),2*e>d&&(e=d/2),this.beginPath(),this.moveTo(a+e,b),this.arcTo(a+c,b,a+c,b+d,e),this.arcTo(a+c,b+d,a,b+d,e),this.lineTo(a+c-f,b+d),this.moveTo(a+c-110,b+d),this.arcTo(a,b+d,a,b,e),this.arcTo(a,b,a+c,b,e),this};var h=g.getContext("2d");h.fillStyle="white",h.rect(0,0,g.width,g.height),h.fill(),h.drawImage(b,e+c+f,e+c+f),h.lineWidth=c,h.roundRect(f+c/2,f+c/2,g.width-c-2*f,g.height-c-2*f,d,3*e).stroke(),h.fillStyle="black",h.font=4.5*c+"px Arial",h.fillText("sepaQR.eu",g.width-110,g.height-f/2)},sepaQR.Charset=a}();</script>
|
||||||
|
<script>var QRCodep;!function(){function a(a){this.mode=j.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=0,c=this.data.length;c>b;b++){var d=[],e=this.data.charCodeAt(b);e>65536?(d[0]=240|(1835008&e)>>>18,d[1]=128|(258048&e)>>>12,d[2]=128|(4032&e)>>>6,d[3]=128|63&e):e>2048?(d[0]=224|(61440&e)>>>12,d[1]=128|(4032&e)>>>6,d[2]=128|63&e):e>128?(d[0]=192|(1984&e)>>>6,d[1]=128|63&e):d[0]=e,this.parsedData.push(d)}this.parsedData=Array.prototype.concat.apply([],this.parsedData),this.parsedData.length!=this.data.length}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function c(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c<a.length&&0==a[c];)c++;this.num=new Array(a.length-c+b);for(var d=0;d<a.length-c;d++)this.num[d]=a[d+c]}function d(a,b){this.totalCount=a,this.dataCount=b}function e(){this.buffer=[],this.length=0}function f(){return"undefined"!=typeof CanvasRenderingContext2D}function g(){var a=!1,b=navigator.userAgent;if(/android/i.test(b)){a=!0;var c=b.toString().match(/android ([0-9]\.[0-9])/i);c&&c[1]&&(a=parseFloat(c[1]))}return a}function h(a,b){for(var c=1,d=i(a),e=0,f=p.length;f>=e;e++){var g=0;switch(b){case k.L:g=p[e][0];break;case k.M:g=p[e][1];break;case k.Q:g=p[e][2];break;case k.H:g=p[e][3]}if(g>=d)break;c++}if(c>p.length)throw new Error("Too long data");return c}function i(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(a){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d<this.moduleCount;d++){this.modules[d]=new Array(this.moduleCount);for(var e=0;e<this.moduleCount;e++)this.modules[d][e]=null}this.setupPositionProbePattern(0,0),this.setupPositionProbePattern(this.moduleCount-7,0),this.setupPositionProbePattern(0,this.moduleCount-7),this.setupPositionAdjustPattern(),this.setupTimingPattern(),this.setupTypeInfo(a,c),this.typeNumber>=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?this.modules[a+c][b+d]=!0:this.modules[a+c][b+d]=!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=m.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f<this.modules.length;f++)for(var g=f*e,h=0;h<this.modules[f].length;h++){var i=h*e,j=this.modules[f][h];j&&(d.beginFill(0,100),d.moveTo(i,g),d.lineTo(i+e,g),d.lineTo(i+e,g+e),d.lineTo(i,g+e),d.endFill())}return d},setupTimingPattern:function(){for(var a=8;a<this.moduleCount-8;a++)null==this.modules[a][6]&&(this.modules[a][6]=a%2==0);for(var b=8;b<this.moduleCount-8;b++)null==this.modules[6][b]&&(this.modules[6][b]=b%2==0)},setupPositionAdjustPattern:function(){for(var a=m.getPatternPosition(this.typeNumber),b=0;b<a.length;b++)for(var c=0;c<a.length;c++){var d=a[b],e=a[c];if(null==this.modules[d][e])for(var f=-2;2>=f;f++)for(var g=-2;2>=g;g++)-2==f||2==f||-2==g||2==g||0==f&&0==g?this.modules[d+f][e+g]=!0:this.modules[d+f][e+g]=!1}},setupTypeNumber:function(a){for(var b=m.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(b>>c&1);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(b>>c&1);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=m.getBCHTypeInfo(c),e=0;15>e;e++){var f=!a&&1==(d>>e&1);6>e?this.modules[e][8]=f:8>e?this.modules[e+1][8]=f:this.modules[this.moduleCount-15+e][8]=f}for(var e=0;15>e;e++){var f=!a&&1==(d>>e&1);8>e?this.modules[8][this.moduleCount-e-1]=f:9>e?this.modules[8][15-e-1+1]=f:this.modules[8][15-e-1]=f}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,f=0,g=this.moduleCount-1;g>0;g-=2)for(6==g&&g--;;){for(var h=0;2>h;h++)if(null==this.modules[d][g-h]){var i=!1;f<a.length&&(i=1==(a[f]>>>e&1));var j=m.getMask(b,d,g-h);j&&(i=!i),this.modules[d][g-h]=i,e--,-1==e&&(f++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,f){for(var g=d.getRSBlocks(a,c),h=new e,i=0;i<f.length;i++){var j=f[i];h.put(j.mode,4),h.put(j.getLength(),m.getLengthInBits(j.mode,a)),j.write(h)}for(var k=0,i=0;i<g.length;i++)k+=g[i].dataCount;if(h.getLengthInBits()>8*k)throw new Error("code length overflow. ("+h.getLengthInBits()+">"+8*k+")");for(h.getLengthInBits()+4<=8*k&&h.put(0,4);h.getLengthInBits()%8!=0;)h.putBit(!1);for(;;){if(h.getLengthInBits()>=8*k)break;if(h.put(b.PAD0,8),h.getLengthInBits()>=8*k)break;h.put(b.PAD1,8)}return b.createBytes(h,g)},b.createBytes=function(a,b){for(var d=0,e=0,f=0,g=new Array(b.length),h=new Array(b.length),i=0;i<b.length;i++){var j=b[i].dataCount,k=b[i].totalCount-j;e=Math.max(e,j),f=Math.max(f,k),g[i]=new Array(j);for(var l=0;l<g[i].length;l++)g[i][l]=255&a.buffer[l+d];d+=j;var n=m.getErrorCorrectPolynomial(k),o=new c(g[i],n.getLength()-1),p=o.mod(n);h[i]=new Array(n.getLength()-1);for(var l=0;l<h[i].length;l++){var q=l+p.getLength()-h[i].length;h[i][l]=q>=0?p.get(q):0}}for(var r=0,l=0;l<b.length;l++)r+=b[l].totalCount;for(var s=new Array(r),t=0,l=0;e>l;l++)for(var i=0;i<b.length;i++)l<g[i].length&&(s[t++]=g[i][l]);for(var l=0;f>l;l++)for(var i=0;i<b.length;i++)l<h[i].length&&(s[t++]=h[i][l]);return s};for(var j={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},k={L:1,M:0,Q:3,H:2},l={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},m={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(a){for(var b=a<<10;m.getBCHDigit(b)-m.getBCHDigit(m.G15)>=0;)b^=m.G15<<m.getBCHDigit(b)-m.getBCHDigit(m.G15);return(a<<10|b)^m.G15_MASK},getBCHTypeNumber:function(a){for(var b=a<<12;m.getBCHDigit(b)-m.getBCHDigit(m.G18)>=0;)b^=m.G18<<m.getBCHDigit(b)-m.getBCHDigit(m.G18);return a<<12|b},getBCHDigit:function(a){for(var b=0;0!=a;)b++,a>>>=1;return b},getPatternPosition:function(a){return m.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case l.PATTERN000:return(b+c)%2==0;case l.PATTERN001:return b%2==0;case l.PATTERN010:return c%3==0;case l.PATTERN011:return(b+c)%3==0;case l.PATTERN100:return(Math.floor(b/2)+Math.floor(c/3))%2==0;case l.PATTERN101:return b*c%2+b*c%3==0;case l.PATTERN110:return(b*c%2+b*c%3)%2==0;case l.PATTERN111:return(b*c%3+(b+c)%2)%2==0;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new c([1],0),d=0;a>d;d++)b=b.multiply(new c([1,n.gexp(d)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case j.MODE_NUMBER:return 10;case j.MODE_ALPHA_NUM:return 9;case j.MODE_8BIT_BYTE:return 8;case j.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case j.MODE_NUMBER:return 12;case j.MODE_ALPHA_NUM:return 11;case j.MODE_8BIT_BYTE:return 16;case j.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case j.MODE_NUMBER:return 14;case j.MODE_ALPHA_NUM:return 13;case j.MODE_8BIT_BYTE:return 16;case j.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||0==h&&0==i||g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,0!=j&&4!=j||(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},n={glog:function(a){if(1>a)throw new Error("glog("+a+")");return n.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return n.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},o=0;8>o;o++)n.EXP_TABLE[o]=1<<o;for(var o=8;256>o;o++)n.EXP_TABLE[o]=n.EXP_TABLE[o-4]^n.EXP_TABLE[o-5]^n.EXP_TABLE[o-6]^n.EXP_TABLE[o-8];for(var o=0;255>o;o++)n.LOG_TABLE[n.EXP_TABLE[o]]=o;c.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),d=0;d<this.getLength();d++)for(var e=0;e<a.getLength();e++)b[d+e]^=n.gexp(n.glog(this.get(d))+n.glog(a.get(e)));return new c(b,0)},mod:function(a){if(this.getLength()-a.getLength()<0)return this;for(var b=n.glog(this.get(0))-n.glog(a.get(0)),d=new Array(this.getLength()),e=0;e<this.getLength();e++)d[e]=this.get(e);for(var e=0;e<a.getLength();e++)d[e]^=n.gexp(n.glog(a.get(e))+b);return new c(d,0).mod(a)}},d.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],d.getRSBlocks=function(a,b){var c=d.getRsBlockTable(a,b);if(void 0==c)throw new Error("bad rs block @ typeNumber:"+a+"/errorCorrectLevel:"+b);for(var e=c.length/3,f=[],g=0;e>g;g++)for(var h=c[3*g+0],i=c[3*g+1],j=c[3*g+2],k=0;h>k;k++)f.push(new d(i,j));return f},d.getRsBlockTable=function(a,b){switch(b){case k.L:return d.RS_BLOCK_TABLE[4*(a-1)+0];case k.M:return d.RS_BLOCK_TABLE[4*(a-1)+1];case k.Q:return d.RS_BLOCK_TABLE[4*(a-1)+2];case k.H:return d.RS_BLOCK_TABLE[4*(a-1)+3];default:return}},e.prototype={get:function(a){var b=Math.floor(a/8);return 1==(this.buffer[b]>>>7-a%8&1)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(a>>>b-c-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var p=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],q=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function b(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var c=this._htOption,d=this._el,e=a.getModuleCount();Math.floor(c.width/e),Math.floor(c.height/e);this.clear();var f=b("svg",{viewBox:"0 0 "+String(e)+" "+String(e),width:"100%",height:"100%",fill:c.colorLight});f.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),d.appendChild(f),f.appendChild(b("rect",{fill:c.colorLight,width:"100%",height:"100%"})),f.appendChild(b("rect",{fill:c.colorDark,width:"1",height:"1",id:"template"}));for(var g=0;e>g;g++)for(var h=0;e>h;h++)if(a.isDark(g,h)){var i=b("use",{x:String(h),y:String(g)});i.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),f.appendChild(i)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),r="svg"===document.documentElement.tagName.toLowerCase(),s=r?q:f()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function b(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&c._fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,void(d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==")}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var c=1/window.devicePixelRatio,d=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,b,e,f,g,h,i,j,k){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*c;else"undefined"==typeof j&&(arguments[1]*=c,arguments[2]*=c,arguments[3]*=c,arguments[4]*=c);d.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=g(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.alt="Scan me!",this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&b.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCodep=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:k.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._htOption.useSVG&&(s=q),this._android=g(),this._el=a,this._oQRCode=null,this._htOption.text&&this.makeCode(this._htOption.text)},QRCodep.prototype.makeCode=function(a){this._oQRCode=new b(h(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,-1!=this._htOption.dpi&&-1!=this._htOption.mmPerDot&&(this._htOption.width=this._oQRCode.moduleCount*this._htOption.dpi/25.4*this._htOption.mmPerDot,this._htOption.height=this._oQRCode.moduleCount*this._htOption.dpi/25.4*this._htOption.mmPerDot),this._oDrawing=new s(this._el,this._htOption),this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCodep.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCodep.prototype.clear=function(){this._oDrawing.clear()},QRCodep.CorrectLevel=k}();var sepaQR;!function(){"use strict";var a={UTF_8:1,ISO8859_1:2,ISO8859_2:3,ISO8859_4:4,ISO8859_5:5,ISO8859_7:6,ISO8859_10:7,ISO8859_15:8};sepaQR=function(b){if(this._sOpt={serviceTag:"BCD",version:"001",charset:a.UTF_8,identificationCode:"SCT",benefBIC:"",benefName:"",benefAccNr:"",amountEuro:"",purpose:"",creditorRef:"",remittanceInf:"",information:""},b)for(var c in b)this._sOpt[c]=b[c]},sepaQR.prototype.validServiceTag=function(){return"BCD"===this._sOpt.serviceTag},sepaQR.prototype.validVersion=function(){return"001"===this._sOpt.version||"002"===this._sOpt.version},sepaQR.prototype.validCharset=function(){return this._sOpt.charset>0&&this._sOpt.charset<=8},sepaQR.prototype.validIdentificationCode=function(){return"SCT"===this._sOpt.identificationCode},sepaQR.prototype.validBenefName=function(){var a="string"==typeof this._sOpt.benefName&&this._sOpt.benefName.length>=1&&this._sOpt.benefName.length<=70;if(!a)throw new Error("benefName not valid!");return a},sepaQR.prototype.validBenefAccNr=function(){var a="string"==typeof this._sOpt.benefAccNr&&this._sOpt.benefAccNr.length>=1&&this._sOpt.benefAccNr.length<=34;if(!a)throw new Error("benefAccNr not valid!");return a},sepaQR.prototype.validAmountEuro=function(){if("string"==typeof this._sOpt.amountEuro)return 0===this._sOpt.amountEuro.length;if("number"==typeof this._sOpt.amountEuro){this._sOpt.amountEuro=Math.round(100*this._sOpt.amountEuro)/100;var a=this._sOpt.amountEuro>.01&&this._sOpt.amountEuro<=999999999.99;if(!a)throw new Error("Amount not valid!");return a}},sepaQR.prototype.validBenefBic=function(){var a="002"==this._sOpt.version||"string"==typeof this._sOpt.benefBIC&&this._sOpt.benefBIC.length>=0&&this._sOpt.benefBIC.length<=11;if(!a)throw new Error("BIC is mandatory in Version 001!");if(a="string"==typeof this._sOpt.benefBIC&&this._sOpt.benefBIC.length>=0&&this._sOpt.benefBIC.length<=11,!a)throw new Error("benefBIC not valid!");return a},sepaQR.prototype.validPurpose=function(){var a="string"==typeof this._sOpt.purpose&&this._sOpt.purpose.length>=0&&this._sOpt.purpose.length<=4;if(!a)throw new Error("Purpose not valid!");return a},sepaQR.prototype.validInformation=function(){var a="string"==typeof this._sOpt.information&&this._sOpt.information.length>=0&&this._sOpt.information.length<=70;if(!a)throw new Error("Information not valid!");return a},sepaQR.prototype.validCreditorRefOrRemittance=function(){var a="string"==typeof this._sOpt.creditorRef&&0===this._sOpt.creditorRef.length,b="string"==typeof this._sOpt.remittanceInf&&0===this._sOpt.remittanceInf.length,c=a&&"string"==typeof this._sOpt.remittanceInf&&this._sOpt.remittanceInf.length<=140||b&&"string"==typeof this._sOpt.creditorRef&&this._sOpt.creditorRef.length<=35;if(!c)throw new Error("creditorRef or Remittance not valid!");return c},sepaQR.prototype.validQRTextLength=function(){for(var a=this.prepareQRText(),b=0,c=0,d=a.length;d>c;c++){var e=a.charCodeAt(c);b+=e>65536?4:e>2048?3:e>128?2:1}return 328>=b},sepaQR.prototype.valid=function(){var a=this.validServiceTag()&&this.validVersion()&&this.validCharset()&&this.validIdentificationCode()&&this.validBenefName()&&this.validBenefAccNr()&&this.validAmountEuro()&&this.validBenefBic()&&this.validPurpose()&&this.validInformation()&&this.validPurpose()&&this.validCreditorRefOrRemittance()&&this.validQRTextLength();return a},sepaQR.prototype.prepareQRText=function(){return(this._sOpt.serviceTag+"\n"+this._sOpt.version+"\n"+this._sOpt.charset+"\n"+this._sOpt.identificationCode+"\n"+this._sOpt.benefBIC+"\n"+this._sOpt.benefName+"\n"+this._sOpt.benefAccNr+"\nEUR"+this._sOpt.amountEuro+"\n"+this._sOpt.purpose+"\n"+this._sOpt.creditorRef+"\n"+this._sOpt.remittanceInf+"\n"+this._sOpt.information).trim()},sepaQR.prototype.toQRText=function(){return this.valid()?this.prepareQRText():""},sepaQR.prototype.makeCodeInto=function(a,b){var c={width:256,height:256,mmPerDot:.85,dpi:92,correctLevel:QRCodep.CorrectLevel.M,text:this.toQRText()};if(0!==c.text.length){if(b)for(var d in b)c[d]=b[d];return this.qrcode=new QRCodep(a,c),this.drawExplanatoryLink(document.getElementById(a).getElementsByTagName("canvas")[0],document.createElement("canvas")),this.qrcode}},sepaQR.prototype.drawExplanatoryLink=function(a,b){var c=3,d=12,e=8,f=6,g=a;b.width=g.width,b.height=g.height,b.getContext("2d").drawImage(g,0,0),g.width=b.width+2*(e+c+f),g.height=b.height+2*(e+c+f),CanvasRenderingContext2D.prototype.roundRect=function(a,b,c,d,e,f){return 2*e>c&&(e=c/2),2*e>d&&(e=d/2),this.beginPath(),this.moveTo(a+e,b),this.arcTo(a+c,b,a+c,b+d,e),this.arcTo(a+c,b+d,a,b+d,e),this.lineTo(a+c-f,b+d),this.moveTo(a+c-110,b+d),this.arcTo(a,b+d,a,b,e),this.arcTo(a,b,a+c,b,e),this};var h=g.getContext("2d");h.fillStyle="white",h.rect(0,0,g.width,g.height),h.fill(),h.drawImage(b,e+c+f,e+c+f),h.lineWidth=c,h.roundRect(f+c/2,f+c/2,g.width-c-2*f,g.height-c-2*f,d,3*e).stroke(),h.fillStyle="black",h.font=4.5*c+"px Arial",h.fillText("sepaQR.eu",g.width-110,g.height-f/2)},sepaQR.Charset=a}();</script>
|
||||||
|
|
||||||
|
<script>var QRCodep;!function(){function a(a){this.mode=j.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=0,c=this.data.length;c>b;b++){var d=[],e=this.data.charCodeAt(b);e>65536?(d[0]=240|(1835008&e)>>>18,d[1]=128|(258048&e)>>>12,d[2]=128|(4032&e)>>>6,d[3]=128|63&e):e>2048?(d[0]=224|(61440&e)>>>12,d[1]=128|(4032&e)>>>6,d[2]=128|63&e):e>128?(d[0]=192|(1984&e)>>>6,d[1]=128|63&e):d[0]=e,this.parsedData.push(d)}this.parsedData=Array.prototype.concat.apply([],this.parsedData),this.parsedData.length!=this.data.length}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function c(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c<a.length&&0==a[c];)c++;this.num=new Array(a.length-c+b);for(var d=0;d<a.length-c;d++)this.num[d]=a[d+c]}function d(a,b){this.totalCount=a,this.dataCount=b}function e(){this.buffer=[],this.length=0}function f(){return"undefined"!=typeof CanvasRenderingContext2D}function g(){var a=!1,b=navigator.userAgent;if(/android/i.test(b)){a=!0;var c=b.toString().match(/android ([0-9]\.[0-9])/i);c&&c[1]&&(a=parseFloat(c[1]))}return a}function h(a,b){for(var c=1,d=i(a),e=0,f=p.length;f>=e;e++){var g=0;switch(b){case k.L:g=p[e][0];break;case k.M:g=p[e][1];break;case k.Q:g=p[e][2];break;case k.H:g=p[e][3]}if(g>=d)break;c++}if(c>p.length)throw new Error("Too long data");return c}function i(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(a){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d<this.moduleCount;d++){this.modules[d]=new Array(this.moduleCount);for(var e=0;e<this.moduleCount;e++)this.modules[d][e]=null}this.setupPositionProbePattern(0,0),this.setupPositionProbePattern(this.moduleCount-7,0),this.setupPositionProbePattern(0,this.moduleCount-7),this.setupPositionAdjustPattern(),this.setupTimingPattern(),this.setupTypeInfo(a,c),this.typeNumber>=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?this.modules[a+c][b+d]=!0:this.modules[a+c][b+d]=!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=m.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f<this.modules.length;f++)for(var g=f*e,h=0;h<this.modules[f].length;h++){var i=h*e,j=this.modules[f][h];j&&(d.beginFill(0,100),d.moveTo(i,g),d.lineTo(i+e,g),d.lineTo(i+e,g+e),d.lineTo(i,g+e),d.endFill())}return d},setupTimingPattern:function(){for(var a=8;a<this.moduleCount-8;a++)null==this.modules[a][6]&&(this.modules[a][6]=a%2==0);for(var b=8;b<this.moduleCount-8;b++)null==this.modules[6][b]&&(this.modules[6][b]=b%2==0)},setupPositionAdjustPattern:function(){for(var a=m.getPatternPosition(this.typeNumber),b=0;b<a.length;b++)for(var c=0;c<a.length;c++){var d=a[b],e=a[c];if(null==this.modules[d][e])for(var f=-2;2>=f;f++)for(var g=-2;2>=g;g++)-2==f||2==f||-2==g||2==g||0==f&&0==g?this.modules[d+f][e+g]=!0:this.modules[d+f][e+g]=!1}},setupTypeNumber:function(a){for(var b=m.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(b>>c&1);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(b>>c&1);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=m.getBCHTypeInfo(c),e=0;15>e;e++){var f=!a&&1==(d>>e&1);6>e?this.modules[e][8]=f:8>e?this.modules[e+1][8]=f:this.modules[this.moduleCount-15+e][8]=f}for(var e=0;15>e;e++){var f=!a&&1==(d>>e&1);8>e?this.modules[8][this.moduleCount-e-1]=f:9>e?this.modules[8][15-e-1+1]=f:this.modules[8][15-e-1]=f}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,f=0,g=this.moduleCount-1;g>0;g-=2)for(6==g&&g--;;){for(var h=0;2>h;h++)if(null==this.modules[d][g-h]){var i=!1;f<a.length&&(i=1==(a[f]>>>e&1));var j=m.getMask(b,d,g-h);j&&(i=!i),this.modules[d][g-h]=i,e--,-1==e&&(f++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,f){for(var g=d.getRSBlocks(a,c),h=new e,i=0;i<f.length;i++){var j=f[i];h.put(j.mode,4),h.put(j.getLength(),m.getLengthInBits(j.mode,a)),j.write(h)}for(var k=0,i=0;i<g.length;i++)k+=g[i].dataCount;if(h.getLengthInBits()>8*k)throw new Error("code length overflow. ("+h.getLengthInBits()+">"+8*k+")");for(h.getLengthInBits()+4<=8*k&&h.put(0,4);h.getLengthInBits()%8!=0;)h.putBit(!1);for(;;){if(h.getLengthInBits()>=8*k)break;if(h.put(b.PAD0,8),h.getLengthInBits()>=8*k)break;h.put(b.PAD1,8)}return b.createBytes(h,g)},b.createBytes=function(a,b){for(var d=0,e=0,f=0,g=new Array(b.length),h=new Array(b.length),i=0;i<b.length;i++){var j=b[i].dataCount,k=b[i].totalCount-j;e=Math.max(e,j),f=Math.max(f,k),g[i]=new Array(j);for(var l=0;l<g[i].length;l++)g[i][l]=255&a.buffer[l+d];d+=j;var n=m.getErrorCorrectPolynomial(k),o=new c(g[i],n.getLength()-1),p=o.mod(n);h[i]=new Array(n.getLength()-1);for(var l=0;l<h[i].length;l++){var q=l+p.getLength()-h[i].length;h[i][l]=q>=0?p.get(q):0}}for(var r=0,l=0;l<b.length;l++)r+=b[l].totalCount;for(var s=new Array(r),t=0,l=0;e>l;l++)for(var i=0;i<b.length;i++)l<g[i].length&&(s[t++]=g[i][l]);for(var l=0;f>l;l++)for(var i=0;i<b.length;i++)l<h[i].length&&(s[t++]=h[i][l]);return s};for(var j={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},k={L:1,M:0,Q:3,H:2},l={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},m={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(a){for(var b=a<<10;m.getBCHDigit(b)-m.getBCHDigit(m.G15)>=0;)b^=m.G15<<m.getBCHDigit(b)-m.getBCHDigit(m.G15);return(a<<10|b)^m.G15_MASK},getBCHTypeNumber:function(a){for(var b=a<<12;m.getBCHDigit(b)-m.getBCHDigit(m.G18)>=0;)b^=m.G18<<m.getBCHDigit(b)-m.getBCHDigit(m.G18);return a<<12|b},getBCHDigit:function(a){for(var b=0;0!=a;)b++,a>>>=1;return b},getPatternPosition:function(a){return m.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case l.PATTERN000:return(b+c)%2==0;case l.PATTERN001:return b%2==0;case l.PATTERN010:return c%3==0;case l.PATTERN011:return(b+c)%3==0;case l.PATTERN100:return(Math.floor(b/2)+Math.floor(c/3))%2==0;case l.PATTERN101:return b*c%2+b*c%3==0;case l.PATTERN110:return(b*c%2+b*c%3)%2==0;case l.PATTERN111:return(b*c%3+(b+c)%2)%2==0;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new c([1],0),d=0;a>d;d++)b=b.multiply(new c([1,n.gexp(d)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case j.MODE_NUMBER:return 10;case j.MODE_ALPHA_NUM:return 9;case j.MODE_8BIT_BYTE:return 8;case j.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case j.MODE_NUMBER:return 12;case j.MODE_ALPHA_NUM:return 11;case j.MODE_8BIT_BYTE:return 16;case j.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case j.MODE_NUMBER:return 14;case j.MODE_ALPHA_NUM:return 13;case j.MODE_8BIT_BYTE:return 16;case j.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||0==h&&0==i||g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,0!=j&&4!=j||(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},n={glog:function(a){if(1>a)throw new Error("glog("+a+")");return n.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return n.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},o=0;8>o;o++)n.EXP_TABLE[o]=1<<o;for(var o=8;256>o;o++)n.EXP_TABLE[o]=n.EXP_TABLE[o-4]^n.EXP_TABLE[o-5]^n.EXP_TABLE[o-6]^n.EXP_TABLE[o-8];for(var o=0;255>o;o++)n.LOG_TABLE[n.EXP_TABLE[o]]=o;c.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),d=0;d<this.getLength();d++)for(var e=0;e<a.getLength();e++)b[d+e]^=n.gexp(n.glog(this.get(d))+n.glog(a.get(e)));return new c(b,0)},mod:function(a){if(this.getLength()-a.getLength()<0)return this;for(var b=n.glog(this.get(0))-n.glog(a.get(0)),d=new Array(this.getLength()),e=0;e<this.getLength();e++)d[e]=this.get(e);for(var e=0;e<a.getLength();e++)d[e]^=n.gexp(n.glog(a.get(e))+b);return new c(d,0).mod(a)}},d.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],d.getRSBlocks=function(a,b){var c=d.getRsBlockTable(a,b);if(void 0==c)throw new Error("bad rs block @ typeNumber:"+a+"/errorCorrectLevel:"+b);for(var e=c.length/3,f=[],g=0;e>g;g++)for(var h=c[3*g+0],i=c[3*g+1],j=c[3*g+2],k=0;h>k;k++)f.push(new d(i,j));return f},d.getRsBlockTable=function(a,b){switch(b){case k.L:return d.RS_BLOCK_TABLE[4*(a-1)+0];case k.M:return d.RS_BLOCK_TABLE[4*(a-1)+1];case k.Q:return d.RS_BLOCK_TABLE[4*(a-1)+2];case k.H:return d.RS_BLOCK_TABLE[4*(a-1)+3];default:return}},e.prototype={get:function(a){var b=Math.floor(a/8);return 1==(this.buffer[b]>>>7-a%8&1)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(a>>>b-c-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var p=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],q=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function b(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var c=this._htOption,d=this._el,e=a.getModuleCount();Math.floor(c.width/e),Math.floor(c.height/e);this.clear();var f=b("svg",{viewBox:"0 0 "+String(e)+" "+String(e),width:"100%",height:"100%",fill:c.colorLight});f.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),d.appendChild(f),f.appendChild(b("rect",{fill:c.colorLight,width:"100%",height:"100%"})),f.appendChild(b("rect",{fill:c.colorDark,width:"1",height:"1",id:"template"}));for(var g=0;e>g;g++)for(var h=0;e>h;h++)if(a.isDark(g,h)){var i=b("use",{x:String(h),y:String(g)});i.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),f.appendChild(i)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),r="svg"===document.documentElement.tagName.toLowerCase(),s=r?q:f()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function b(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&c._fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,void(d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==")}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var c=1/window.devicePixelRatio,d=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,b,e,f,g,h,i,j,k){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*c;else"undefined"==typeof j&&(arguments[1]*=c,arguments[2]*=c,arguments[3]*=c,arguments[4]*=c);d.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=g(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.alt="Scan me!",this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&b.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCodep=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:k.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._htOption.useSVG&&(s=q),this._android=g(),this._el=a,this._oQRCode=null,this._htOption.text&&this.makeCode(this._htOption.text)},QRCodep.prototype.makeCode=function(a){this._oQRCode=new b(h(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,-1!=this._htOption.dpi&&-1!=this._htOption.mmPerDot&&(this._htOption.width=this._oQRCode.moduleCount*this._htOption.dpi/25.4*this._htOption.mmPerDot,this._htOption.height=this._oQRCode.moduleCount*this._htOption.dpi/25.4*this._htOption.mmPerDot),this._oDrawing=new s(this._el,this._htOption),this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCodep.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCodep.prototype.clear=function(){this._oDrawing.clear()},QRCodep.CorrectLevel=k}();var sepaQR;!function(){"use strict";var a={UTF_8:1,ISO8859_1:2,ISO8859_2:3,ISO8859_4:4,ISO8859_5:5,ISO8859_7:6,ISO8859_10:7,ISO8859_15:8};sepaQR=function(b){if(this._sOpt={serviceTag:"BCD",version:"001",charset:a.UTF_8,identificationCode:"SCT",benefBIC:"",benefName:"",benefAccNr:"",amountEuro:"",purpose:"",creditorRef:"",remittanceInf:"",information:""},b)for(var c in b)this._sOpt[c]=b[c]},sepaQR.prototype.validServiceTag=function(){return"BCD"===this._sOpt.serviceTag},sepaQR.prototype.validVersion=function(){return"001"===this._sOpt.version||"002"===this._sOpt.version},sepaQR.prototype.validCharset=function(){return this._sOpt.charset>0&&this._sOpt.charset<=8},sepaQR.prototype.validIdentificationCode=function(){return"SCT"===this._sOpt.identificationCode},sepaQR.prototype.validBenefName=function(){var a="string"==typeof this._sOpt.benefName&&this._sOpt.benefName.length>=1&&this._sOpt.benefName.length<=70;if(!a)throw new Error("benefName not valid!");return a},sepaQR.prototype.validBenefAccNr=function(){var a="string"==typeof this._sOpt.benefAccNr&&this._sOpt.benefAccNr.length>=1&&this._sOpt.benefAccNr.length<=34;if(!a)throw new Error("benefAccNr not valid!");return a},sepaQR.prototype.validAmountEuro=function(){if("string"==typeof this._sOpt.amountEuro)return 0===this._sOpt.amountEuro.length;if("number"==typeof this._sOpt.amountEuro){this._sOpt.amountEuro=Math.round(100*this._sOpt.amountEuro)/100;var a=this._sOpt.amountEuro>.01&&this._sOpt.amountEuro<=999999999.99;if(!a)throw new Error("Amount not valid!");return a}},sepaQR.prototype.validBenefBic=function(){var a="002"==this._sOpt.version||"string"==typeof this._sOpt.benefBIC&&this._sOpt.benefBIC.length>=0&&this._sOpt.benefBIC.length<=11;if(!a)throw new Error("BIC is mandatory in Version 001!");if(a="string"==typeof this._sOpt.benefBIC&&this._sOpt.benefBIC.length>=0&&this._sOpt.benefBIC.length<=11,!a)throw new Error("benefBIC not valid!");return a},sepaQR.prototype.validPurpose=function(){var a="string"==typeof this._sOpt.purpose&&this._sOpt.purpose.length>=0&&this._sOpt.purpose.length<=4;if(!a)throw new Error("Purpose not valid!");return a},sepaQR.prototype.validInformation=function(){var a="string"==typeof this._sOpt.information&&this._sOpt.information.length>=0&&this._sOpt.information.length<=70;if(!a)throw new Error("Information not valid!");return a},sepaQR.prototype.validCreditorRefOrRemittance=function(){var a="string"==typeof this._sOpt.creditorRef&&0===this._sOpt.creditorRef.length,b="string"==typeof this._sOpt.remittanceInf&&0===this._sOpt.remittanceInf.length,c=a&&"string"==typeof this._sOpt.remittanceInf&&this._sOpt.remittanceInf.length<=140||b&&"string"==typeof this._sOpt.creditorRef&&this._sOpt.creditorRef.length<=35;if(!c)throw new Error("creditorRef or Remittance not valid!");return c},sepaQR.prototype.validQRTextLength=function(){for(var a=this.prepareQRText(),b=0,c=0,d=a.length;d>c;c++){var e=a.charCodeAt(c);b+=e>65536?4:e>2048?3:e>128?2:1}return 328>=b},sepaQR.prototype.valid=function(){var a=this.validServiceTag()&&this.validVersion()&&this.validCharset()&&this.validIdentificationCode()&&this.validBenefName()&&this.validBenefAccNr()&&this.validAmountEuro()&&this.validBenefBic()&&this.validPurpose()&&this.validInformation()&&this.validPurpose()&&this.validCreditorRefOrRemittance()&&this.validQRTextLength();return a},sepaQR.prototype.prepareQRText=function(){return(this._sOpt.serviceTag+"\n"+this._sOpt.version+"\n"+this._sOpt.charset+"\n"+this._sOpt.identificationCode+"\n"+this._sOpt.benefBIC+"\n"+this._sOpt.benefName+"\n"+this._sOpt.benefAccNr+"\nEUR"+this._sOpt.amountEuro+"\n"+this._sOpt.purpose+"\n"+this._sOpt.creditorRef+"\n"+this._sOpt.remittanceInf+"\n"+this._sOpt.information).trim()},sepaQR.prototype.toQRText=function(){return this.valid()?this.prepareQRText():""},sepaQR.prototype.makeCodeInto=function(a,b){var c={width:256,height:256,mmPerDot:.85,dpi:92,correctLevel:QRCodep.CorrectLevel.M,text:this.toQRText()};if(0!==c.text.length){if(b)for(var d in b)c[d]=b[d];return this.qrcode=new QRCodep(a,c),this.drawExplanatoryLink(document.getElementById(a).getElementsByTagName("canvas")[0],document.createElement("canvas")),this.qrcode}},sepaQR.prototype.drawExplanatoryLink=function(a,b){var c=3,d=12,e=8,f=6,g=a;b.width=g.width,b.height=g.height,b.getContext("2d").drawImage(g,0,0),g.width=b.width+2*(e+c+f),g.height=b.height+2*(e+c+f),CanvasRenderingContext2D.prototype.roundRect=function(a,b,c,d,e,f){return 2*e>c&&(e=c/2),2*e>d&&(e=d/2),this.beginPath(),this.moveTo(a+e,b),this.arcTo(a+c,b,a+c,b+d,e),this.arcTo(a+c,b+d,a,b+d,e),this.lineTo(a+c-f,b+d),this.moveTo(a+c-110,b+d),this.arcTo(a,b+d,a,b,e),this.arcTo(a,b,a+c,b,e),this};var h=g.getContext("2d");h.fillStyle="white",h.rect(0,0,g.width,g.height),h.fill(),h.drawImage(b,e+c+f,e+c+f),h.lineWidth=c,h.roundRect(f+c/2,f+c/2,g.width-c-2*f,g.height-c-2*f,d,3*e).stroke(),h.fillStyle="black",h.font=4.5*c+"px Arial",h.fillText("sepaQR.eu",g.width-110,g.height-f/2)},sepaQR.Charset=a}();</script>
|
||||||
|
@ -1,7 +1,3 @@
|
|||||||
<svg class="flex-shrink-0 w-4 h-4 inline-block"
|
<svg class="flex-shrink-0 w-4 h-4 inline-block" fill="currentColor" viewbox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
|
||||||
fill="currentColor"
|
<path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-3a1 1 0 00-.867.5 1 1 0 11-1.731-1A3 3 0 0113 8a3.001 3.001 0 01-2 2.83V11a1 1 0 11-2 0v-1a1 1 0 011-1 1 1 0 100-2zm0 8a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"></path>
|
||||||
viewbox="0 0 20 20"
|
|
||||||
xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-3a1 1 0 00-.867.5 1 1 0 11-1.731-1A3 3 0 0113 8a3.001 3.001 0 01-2 2.83V11a1 1 0 11-2 0v-1a1 1 0 011-1 1 1 0 100-2zm0 8a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd">
|
|
||||||
</path>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 396 B After Width: | Height: | Size: 373 B |
@ -1,125 +1,103 @@
|
|||||||
{% import "includes/macros" as macros %}
|
{% import "includes/macros" as macros %}
|
||||||
|
|
||||||
{% extends "base" %}
|
{% extends "base" %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="max-w-screen-lg w-full">
|
<div class="max-w-screen-lg w-full">
|
||||||
{% if flash %}{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}{% endif %}
|
{% if flash %}
|
||||||
|
{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}
|
||||||
|
{% endif %}
|
||||||
<h1 class="h1">Ruderassistent</h1>
|
<h1 class="h1">Ruderassistent</h1>
|
||||||
|
|
||||||
|
|
||||||
<div class="grid gap-3">
|
<div class="grid gap-3">
|
||||||
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5"
|
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5" role="alert">
|
||||||
role="alert">
|
|
||||||
<h2 class="h2">Allgemein</h2>
|
<h2 class="h2">Allgemein</h2>
|
||||||
<div class="text-sm p-3">
|
<div class="text-sm p-3">
|
||||||
<ul class="list-disc ms-2">
|
<ul class="list-disc ms-2">
|
||||||
<li class="py-1">
|
<li class="py-1"><a href="https://rudernlinz.at/termin" target="_blank" class="link-primary">FAQ (extern)</a></li>
|
||||||
<a href="https://rudernlinz.at/termin"
|
|
||||||
target="_blank"
|
|
||||||
class="link-primary">FAQ (extern)</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% if loggedin_user.weight and loggedin_user.sex and loggedin_user.dob %}
|
{% if loggedin_user.weight and loggedin_user.sex and loggedin_user.dob %}
|
||||||
<div class="grid gap-3">
|
<div class="grid gap-3">
|
||||||
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5"
|
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5" role="alert">
|
||||||
role="alert">
|
|
||||||
<h2 class="h2">Ergo</h2>
|
<h2 class="h2">Ergo</h2>
|
||||||
<div class="text-sm p-3">
|
<div class="text-sm p-3">
|
||||||
<ul class="list-disc ms-2">
|
<ul class="list-disc ms-2">
|
||||||
<li class="py-1">
|
<li class="py-1"><a href="/ergo" class="link-primary">Ergo</a></li>
|
||||||
<a href="/ergo" class="link-primary">Ergo</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if "Donau Linz" in loggedin_user.roles and "Unterstützend" not in loggedin_user.roles and "Förderndes Mitglied" not in loggedin_user.roles %}
|
{% if "Donau Linz" in loggedin_user.roles and "Unterstützend" not in loggedin_user.roles and "Förderndes Mitglied" not in loggedin_user.roles %}
|
||||||
<div class="grid gap-3">
|
<div class="grid gap-3">
|
||||||
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5"
|
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5" role="alert">
|
||||||
role="alert">
|
|
||||||
<h2 class="h2">Aktives Vereinsmitglied</h2>
|
<h2 class="h2">Aktives Vereinsmitglied</h2>
|
||||||
<div class="text-sm p-3">
|
<div class="text-sm p-3">
|
||||||
<ul class="list-disc ms-2">
|
<ul class="list-disc ms-2">
|
||||||
<li class="py-1">
|
<li class="py-1"><a href="/planned" class="link-primary">Geplante Ausfahrten</a></li>
|
||||||
<a href="/planned" class="link-primary">Geplante Ausfahrten</a>
|
<li class="py-1"><a href="/log" class="link-primary">Ausfahrt eintragen</a></li>
|
||||||
</li>
|
<li class="py-1"><a href="/log/show" class="link-primary">Logbuch</a></li>
|
||||||
<li class="py-1">
|
<li class="py-1"><a href="/stat" class="link-primary">Statistik</a></li>
|
||||||
<a href="/log" class="link-primary">Ausfahrt eintragen</a>
|
<li class="py-1"><a href="/stat/boats" class="link-primary">Bootsauswertung</a></li>
|
||||||
</li>
|
<li class="py-1"><a href="/boatdamage" class="link-primary">Bootsschaden</a></li>
|
||||||
<li class="py-1">
|
|
||||||
<a href="/log/show" class="link-primary">Logbuch</a>
|
|
||||||
</li>
|
|
||||||
<li class="py-1">
|
|
||||||
<a href="/stat" class="link-primary">Statistik</a>
|
|
||||||
</li>
|
|
||||||
<li class="py-1">
|
|
||||||
<a href="/stat/boats" class="link-primary">Bootsauswertung</a>
|
|
||||||
</li>
|
|
||||||
<li class="py-1">
|
|
||||||
<a href="/boatdamage" class="link-primary">Bootsschaden</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
{% if "scheckbuch" in loggedin_user.roles %}
|
{% if "scheckbuch" in loggedin_user.roles %}
|
||||||
<div class="grid gap-3">
|
<div class="grid gap-3">
|
||||||
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5"
|
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5" role="alert">
|
||||||
role="alert">
|
|
||||||
<h2 class="h2">Scheckbuch</h2>
|
<h2 class="h2">Scheckbuch</h2>
|
||||||
<div class="text-sm p-3">
|
<div class="text-sm p-3">
|
||||||
<ul class="list-disc ms-2">
|
<ul class="list-disc ms-2">
|
||||||
<li class="py-1">
|
<li class="py-1"><a href="/planned" class="link-primary">Geplante Ausfahrten</a></li>
|
||||||
<a href="/planned" class="link-primary">Geplante Ausfahrten</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if "Vorstand" in loggedin_user.roles %}
|
{% if "Vorstand" in loggedin_user.roles %}
|
||||||
<div class="grid gap-3">
|
<div class="grid gap-3">
|
||||||
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5"
|
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5" role="alert">
|
||||||
role="alert">
|
|
||||||
<h2 class="h2">Vorstand</h2>
|
<h2 class="h2">Vorstand</h2>
|
||||||
<div class="text-sm p-3">
|
<div class="text-sm p-3">
|
||||||
<ul class="list-disc ms-2">
|
<ul class="list-disc ms-2">
|
||||||
<li class="py-1">
|
<li class="py-1"><a href="/admin/user/fees" class="link-primary">Übersicht User Gebühren</a></li>
|
||||||
<a href="/admin/user/fees" class="link-primary">Übersicht User Gebühren</a>
|
<li class="py-1"><a href="/admin/user" class="link-primary">User</a></li>
|
||||||
</li>
|
|
||||||
<li class="py-1">
|
|
||||||
<a href="/admin/user" class="link-primary">User</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if "admin" in loggedin_user.roles %}
|
{% if "admin" in loggedin_user.roles %}
|
||||||
<div class="grid gap-3">
|
<div class="grid gap-3">
|
||||||
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5"
|
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5" role="alert">
|
||||||
role="alert">
|
|
||||||
<h2 class="h2">Admin</h2>
|
<h2 class="h2">Admin</h2>
|
||||||
<div class="text-sm p-3">
|
<div class="text-sm p-3">
|
||||||
<ul class="list-disc ms-2">
|
<ul class="list-disc ms-2">
|
||||||
<li class="py-1">
|
<li class="py-1"><a href="/admin/boat" class="link-primary">Boote</a></li>
|
||||||
<a href="/admin/boat" class="link-primary">Boote</a>
|
<li class="py-1"><a href="/admin/user" class="link-primary">User</a></li>
|
||||||
</li>
|
<li class="py-1"><a href="/admin/mail" class="link-primary">Mail (beautifully layouted)</a></li>
|
||||||
<li class="py-1">
|
<li class="py-1"><a href="/admin/rss" class="link-primary">Logs</a></li>
|
||||||
<a href="/admin/user" class="link-primary">User</a>
|
|
||||||
</li>
|
|
||||||
<li class="py-1">
|
|
||||||
<a href="/admin/mail" class="link-primary">Mail (beautifully layouted)</a>
|
|
||||||
</li>
|
|
||||||
<li class="py-1">
|
|
||||||
<a href="/admin/rss" class="link-primary">Logs</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
|
||||||
|
|
||||||
|
{% endblock content%}
|
||||||
|
@ -1,25 +1,36 @@
|
|||||||
{% import "includes/macros" as macros %}
|
{% import "includes/macros" as macros %}
|
||||||
{% import "includes/forms/log" as log %}
|
{% import "includes/forms/log" as log %}
|
||||||
|
|
||||||
{% extends "base" %}
|
{% extends "base" %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="w-full">
|
|
||||||
|
<div class="w-full">
|
||||||
<h1 class="h1">Logbuch</h1>
|
<h1 class="h1">Logbuch</h1>
|
||||||
|
|
||||||
{% if flash %}
|
{% if flash %}
|
||||||
<div class="pt-3 max-w-lg m-auto">
|
<div class="pt-3 max-w-lg m-auto">
|
||||||
{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}
|
{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<div class="w-full grid md:grid-cols-5 gap-3 mt-5">
|
<div class="w-full grid md:grid-cols-5 gap-3 mt-5">
|
||||||
<div class="bg-white dark:bg-primary-900 rounded-md hidden md:block shadow">
|
<div class="bg-white dark:bg-primary-900 rounded-md hidden md:block shadow">
|
||||||
<h2 class="h2">Boote</h2>
|
<h2 class="h2">Boote</h2>
|
||||||
<div>{{ log::show_boats(only_ones=false) }}</div>
|
|
||||||
|
<div>
|
||||||
|
{{ log::show_boats(only_ones=false) }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="md:col-span-3 bg-white dark:bg-primary-900 rounded-md shadow">
|
<div class="md:col-span-3 bg-white dark:bg-primary-900 rounded-md shadow">
|
||||||
<h2 class="h2">Neue Ausfahrt</h2>
|
<h2 class="h2">Neue Ausfahrt</h2>
|
||||||
<div class="p-3">{{ log::new(only_ones=false, shipmaster=-1) }}</div>
|
<div class="p-3">
|
||||||
|
{{ log::new(only_ones=false, shipmaster=-1) }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="bg-white dark:bg-primary-900 rounded-md shadow">
|
<div class="bg-white dark:bg-primary-900 rounded-md shadow">
|
||||||
<h2 class="h2">Am Wasser</h2>
|
<h2 class="h2">Am Wasser</h2>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
{% if on_water | length > 0 %}
|
{% if on_water | length > 0 %}
|
||||||
{% for log in on_water %}
|
{% for log in on_water %}
|
||||||
@ -31,6 +42,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script src="/public/logbook.js"></script>
|
|
||||||
{% endblock content %}
|
<script src="/public/logbook.js"></script>
|
||||||
|
{% endblock content%}
|
||||||
|
@ -1,20 +1,24 @@
|
|||||||
{% import "includes/macros" as macros %}
|
{% import "includes/macros" as macros %}
|
||||||
{% import "includes/forms/log" as log %}
|
{% import "includes/forms/log" as log %}
|
||||||
|
|
||||||
{% extends "base" %}
|
{% extends "base" %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<div class="max-w-screen-lg w-full">
|
<div class="max-w-screen-lg w-full">
|
||||||
<h1 class="h1">Logbuch</h1>
|
<h1 class="h1">Logbuch</h1>
|
||||||
|
|
||||||
<div class="mt-3">
|
<div class="mt-3">
|
||||||
<div class="search-wrapper">
|
<div class="search-wrapper">
|
||||||
<label for="name" class="sr-only">Suche</label>
|
<label for="name" class="sr-only">Suche</label>
|
||||||
<input type="search"
|
<input type="search" name="name" id="filter-js" class="search-bar" placeholder="Suchen nach Bootsname oder Ruderer...">
|
||||||
name="name"
|
|
||||||
id="filter-js"
|
|
||||||
class="search-bar"
|
|
||||||
placeholder="Suchen nach Bootsname oder Ruderer...">
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="filter-result-js" class="search-result"></div>
|
<div id="filter-result-js" class="search-result"></div>
|
||||||
{% for log in logs %}{{ log::show_old(log=log, state="completed", only_ones=false, index=loop.index) }}{% endfor %}
|
{% for log in logs %}
|
||||||
|
{{ log::show_old(log=log, state="completed", only_ones=false, index=loop.index) }}
|
||||||
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
|
||||||
|
{% endblock content%}
|
||||||
|
@ -1,23 +1,35 @@
|
|||||||
{% import "includes/macros" as macros %}
|
{% import "includes/macros" as macros %}
|
||||||
{% import "includes/forms/log" as log %}
|
{% import "includes/forms/log" as log %}
|
||||||
|
|
||||||
{% extends "base" %}
|
{% extends "base" %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="w-full">
|
<div class="w-full">
|
||||||
<h1 class="h1">Logbuch</h1>
|
<h1 class="h1">Logbuch</h1>
|
||||||
|
|
||||||
{% if flash %}
|
{% if flash %}
|
||||||
<div class="w-full">{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}</div>
|
<div class="w-full">
|
||||||
|
{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}
|
||||||
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<div class="w-full grid md:grid-cols-5 gap-3 mt-5">
|
<div class="w-full grid md:grid-cols-5 gap-3 mt-5">
|
||||||
<div class="bg-white dark:bg-primary-900 rounded-md hidden md:block shadow">
|
<div class="bg-white dark:bg-primary-900 rounded-md hidden md:block shadow">
|
||||||
<h2 class="h2">Boote</h2>
|
<h2 class="h2">Boote</h2>
|
||||||
<div>{{ log::show_boats(only_ones=false) }}</div>
|
|
||||||
|
<div>
|
||||||
|
{{ log::show_boats(only_ones=false) }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="md:col-span-3 bg-white dark:bg-primary-900 rounded-md shadow">
|
<div class="md:col-span-3 bg-white dark:bg-primary-900 rounded-md shadow">
|
||||||
<h2 class="h2">Neue Ausfahrt</h2>
|
<h2 class="h2">Neue Ausfahrt</h2>
|
||||||
<div class="p-3">{{ log::new(shipmaster=loggedin_user.id) }}</div>
|
<div class="p-3">
|
||||||
|
{{ log::new(shipmaster=loggedin_user.id) }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="bg-white dark:bg-primary-900 rounded-md shadow">
|
<div class="bg-white dark:bg-primary-900 rounded-md shadow">
|
||||||
<h2 class="h2">Am Wasser</h2>
|
<h2 class="h2">Am Wasser</h2>
|
||||||
|
|
||||||
{% if on_water | length > 0 %}
|
{% if on_water | length > 0 %}
|
||||||
{% for log in on_water %}
|
{% for log in on_water %}
|
||||||
{% if log.shipmaster == loggedin_user.id %}
|
{% if log.shipmaster == loggedin_user.id %}
|
||||||
@ -32,5 +44,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="/public/logbook.js"></script>
|
<script src="/public/logbook.js"></script>
|
||||||
{% endblock content %}
|
{% endblock content%}
|
||||||
|
@ -1,21 +1,24 @@
|
|||||||
{% import "includes/macros" as macros %}
|
{% import "includes/macros" as macros %}
|
||||||
|
|
||||||
{% extends "base" %}
|
{% extends "base" %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="max-w-screen-xl w-full grid sm:grid-cols-2 lg:grid-cols-3 gap-4">
|
<div class="max-w-screen-xl w-full grid sm:grid-cols-2 lg:grid-cols-3 gap-4">
|
||||||
{% if flash %}{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}{% endif %}
|
{% if flash %}
|
||||||
|
{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% if "paid" not in loggedin_user.roles %}
|
{% if "paid" not in loggedin_user.roles %}
|
||||||
<div class="grid gap-3 sm:col-span-2 lg:col-span-3">
|
<div class="grid gap-3 sm:col-span-2 lg:col-span-3">
|
||||||
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5"
|
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5" role="alert">
|
||||||
role="alert">
|
|
||||||
<h2 class="h2">Vereinsgebühren</h2>
|
<h2 class="h2">Vereinsgebühren</h2>
|
||||||
<div class="text-sm p-3">
|
<div class="text-sm p-3">
|
||||||
{% include "includes/qrcode" %}
|
{% include "includes/qrcode" %}
|
||||||
<div id="qrcode"
|
<div id="qrcode" style="float: left; padding-top: 10 pt; padding-right: 10pt; padding-bottom: 10pt;"></div>
|
||||||
style="float: left;
|
|
||||||
padding-top: 10 pt;
|
|
||||||
padding-right: 10pt;
|
|
||||||
padding-bottom: 10pt"></div>
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
var sepaqr = new sepaQR({
|
var sepaqr = new sepaQR({
|
||||||
benefName: 'ASKÖ Ruderverein Donau Linz',
|
benefName: 'ASKÖ Ruderverein Donau Linz',
|
||||||
benefBIC: 'BKAUATWWXXX',
|
benefBIC: 'BKAUATWWXXX',
|
||||||
@ -25,38 +28,38 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
var code = sepaqr.makeCodeInto("qrcode");
|
var code = sepaqr.makeCodeInto("qrcode");
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
<b>Dein Vereinsbeitrag ({{ fee.name }}): {{ fee.sum_in_cents / 100 }}€
|
|
||||||
{% if fee.parts | length == 1 %}({{ fee.parts[0].0 }}){% endif %}
|
<b>Dein Vereinsbeitrag ({{ fee.name }}): {{ fee.sum_in_cents / 100 }}€ {% if fee.parts | length == 1 %} ({{ fee.parts[0].0 }}) {% endif %}</b><br />
|
||||||
</b>
|
|
||||||
<br />
|
|
||||||
{% if fee.parts | length > 1 %}
|
{% if fee.parts | length > 1 %}
|
||||||
<small>
|
<small>
|
||||||
Setzt sich zusammen aus:
|
Setzt sich zusammen aus:
|
||||||
<ul style="list-style: circle; padding-left: 1em;">
|
<ul style="list-style: circle; padding-left: 1em;">
|
||||||
{% for p in fee.parts %}
|
{% for p in fee.parts %}
|
||||||
<li>
|
<li>{{ p.0 }} ({{ p.1 / 100 }}€) {% if not loop.last %} + {% endif %}</li>
|
||||||
{{ p.0 }} ({{ p.1 / 100 }}€)
|
|
||||||
{% if not loop.last %}+{% endif %}
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
</small>
|
</small>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
Bitte auf folgendes Konto überweisen: IBAN AT13 1200 0804 1300 1200. Alternativ kannst du auch mit deiner Bankapp den QR Code scannen, damit sollten alle Daten vorausgefüllt sein.
|
|
||||||
<br />
|
Bitte auf folgendes Konto überweisen: IBAN AT13 1200 0804 1300 1200. Alternativ kannst du auch mit deiner Bankapp den QR Code scannen, damit sollten alle Daten vorausgefüllt sein.<br />
|
||||||
Falls die Berechnung nicht stimmt (korrekte Preise findest du <a href="https://rudernlinz.at/unser-verein/gebuhren/"
|
|
||||||
target="_blank"
|
Falls die Berechnung nicht stimmt (korrekte Preise findest du <a href="https://rudernlinz.at/unser-verein/gebuhren/" target="_blank" rel="noopener noreferrer">hier</a>) melde dich bitte bei it@rudernlinz.at. @Studenten: Bitte die aktuelle Studienbestätigung an it@rudernlinz.at schicken.<br />
|
||||||
rel="noopener noreferrer">hier</a>) melde dich bitte bei it@rudernlinz.at. @Studenten: Bitte die aktuelle Studienbestätigung an it@rudernlinz.at schicken.
|
|
||||||
<br />
|
|
||||||
<small>Wir aktualisieren den Ruderassistent unregelmäßig mit unserem Bankkonto. Falls du schon bezahlt hast, kannst du diese Nachricht getrost ignorieren :^)</small>
|
<small>Wir aktualisieren den Ruderassistent unregelmäßig mit unserem Bankkonto. Falls du schon bezahlt hast, kannst du diese Nachricht getrost ignorieren :^)</small>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<h1 class="h1 sm:col-span-2 lg:col-span-3">Ausfahrten</h1>
|
<h1 class="h1 sm:col-span-2 lg:col-span-3">Ausfahrten</h1>
|
||||||
|
|
||||||
{% include "includes/buttons" %}
|
{% include "includes/buttons" %}
|
||||||
|
|
||||||
{% for day in days %}
|
{% for day in days %}
|
||||||
{% set amount_trips = day.planned_events | length + day.trips | length %}
|
{% set amount_trips = day.planned_events | length + day.trips | length %}
|
||||||
{% set_global day_cox_needed = false %}
|
{% set_global day_cox_needed = false %}
|
||||||
@ -67,64 +70,54 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div class="bg-white dark:bg-primary-900 rounded-md flex justify-between flex-col shadow reset-js"
|
|
||||||
style="min-height: 10rem"
|
<div class="bg-white dark:bg-primary-900 rounded-md flex justify-between flex-col shadow reset-js" style="min-height: 10rem;" data-trips="{{ amount_trips }}" data-month="{{ day.day| date(format='%m') }}" data-coxneeded="{{ day_cox_needed }}">
|
||||||
data-trips="{{ amount_trips }}"
|
|
||||||
data-month="{{ day.day| date(format='%m') }}"
|
|
||||||
data-coxneeded="{{ day_cox_needed }}">
|
|
||||||
<div>
|
<div>
|
||||||
<h2 class="font-bold uppercase tracking-wide text-center rounded-t-md {% if day.is_pinned %} text-white bg-primary-950 {% else %} text-primary-950 dark:text-white bg-gray-200 dark:bg-primary-950 bg-opacity-80 {% endif %} text-lg px-3 py-3 ">
|
<h2 class="font-bold uppercase tracking-wide text-center rounded-t-md {% if day.is_pinned %} text-white bg-primary-950 {% else %} text-primary-950 dark:text-white bg-gray-200 dark:bg-primary-950 bg-opacity-80 {% endif %} text-lg px-3 py-3 ">{{ day.day| date(format="%d.%m.%Y") }}
|
||||||
{{ day.day| date(format="%d.%m.%Y") }}
|
|
||||||
<small class="inline-block ml-1 text-xs {% if day.is_pinned %} text-gray-200 {% else %} text-gray-500 dark:text-gray-100 {% endif %}">{{ day.day | date(format="%A", locale="de_AT") }}</small>
|
<small class="inline-block ml-1 text-xs {% if day.is_pinned %} text-gray-200 {% else %} text-gray-500 dark:text-gray-100 {% endif %}">{{ day.day | date(format="%A", locale="de_AT") }}</small>
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
{% if day.planned_events | length > 0 or day.trips | length > 0 %}
|
{% if day.planned_events | length > 0 or day.trips | length > 0 %}
|
||||||
<div class="grid grid-cols-1 gap-3 mb-3">
|
<div
|
||||||
|
class="grid grid-cols-1 gap-3 mb-3">
|
||||||
|
|
||||||
{# --- START Events --- #}
|
{# --- START Events --- #}
|
||||||
{% if day.planned_events | length > 0 %}
|
{% if day.planned_events | length > 0 %}
|
||||||
{% for planned_event in day.planned_events | sort(attribute="planned_starting_time") %}
|
{% for planned_event in day.planned_events | sort(attribute="planned_starting_time") %}
|
||||||
{% set amount_cur_cox = planned_event.cox | length %}
|
{% set amount_cur_cox = planned_event.cox | length %}
|
||||||
{% set amount_cox_missing = planned_event.planned_amount_cox - amount_cur_cox %}
|
{% set amount_cox_missing = planned_event.planned_amount_cox - amount_cur_cox %}
|
||||||
<div class="pt-2 px-3 border-t border-gray-200"
|
<div class="pt-2 px-3 border-t border-gray-200" style="order: {{ planned_event.planned_starting_time | replace(from=":", to="") }}">
|
||||||
style="order: {{ planned_event.planned_starting_time | replace(from=":", to="") }}">
|
|
||||||
<div class="flex justify-between items-center">
|
<div class="flex justify-between items-center">
|
||||||
<div class="mr-1">
|
<div class="mr-1">
|
||||||
<strong class="text-primary-900 dark:text-white">
|
<strong class="text-primary-900 dark:text-white">
|
||||||
{{ planned_event.planned_starting_time }}
|
{{ planned_event.planned_starting_time }}
|
||||||
Uhr
|
Uhr
|
||||||
</strong>
|
</strong>
|
||||||
<small class="text-gray-600 dark:text-gray-100">({{ planned_event.name }}
|
<small class="text-gray-600 dark:text-gray-100">({{ planned_event.name }}{% if planned_event.trip_type %} - {{ planned_event.trip_type.icon | safe }} {{ planned_event.trip_type.name }}{% endif %})</small><br/>
|
||||||
{% if planned_event.trip_type %}
|
|
||||||
- {{ planned_event.trip_type.icon | safe }} {{ planned_event.trip_type.name }}
|
<a href="#" data-sidebar="true" data-trigger="sidebar" data-header="<strong>{{ planned_event.planned_starting_time }} Uhr</strong> ({{ planned_event.name }}){% if planned_event.trip_type %}<small class='block'>{{ planned_event.trip_type.desc }}</small>{% endif %}{% if planned_event.notes %}<small class='block'>{{ planned_event.notes }}</small>{% endif %}" data-body="#event{{ planned_event.trip_details_id }}" class="inline-block link-primary mr-3">
|
||||||
{% endif %}
|
|
||||||
)</small>
|
|
||||||
<br />
|
|
||||||
<a href="#" data-sidebar="true" data-trigger="sidebar" data-header="<strong>{{ planned_event.planned_starting_time }} Uhr</strong> ({{ planned_event.name }})
|
|
||||||
{% if planned_event.trip_type %}<small class='block'>{{ planned_event.trip_type.desc }}</small>{% endif %}
|
|
||||||
{% if planned_event.notes %}<small class='block'>{{ planned_event.notes }}</small>{% endif %}
|
|
||||||
" data-body="#event{{ planned_event.trip_details_id }}" class="inline-block link-primary mr-3">
|
|
||||||
Details
|
Details
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-right grid gap-2">
|
<div
|
||||||
|
class="text-right grid gap-2">
|
||||||
{# --- START Row Buttons --- #}
|
{# --- START Row Buttons --- #}
|
||||||
{% set_global cur_user_participates = false %}
|
{% set_global cur_user_participates = false %}
|
||||||
{% for rower in planned_event.rower %}
|
{% for rower in planned_event.rower%}
|
||||||
{% if rower.name == loggedin_user.name %}
|
{% if rower.name == loggedin_user.name %}
|
||||||
{% set_global cur_user_participates = true %}
|
{% set_global cur_user_participates = true %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% if cur_user_participates %}
|
{% if cur_user_participates %}
|
||||||
<a href="/planned/remove/{{ planned_event.trip_details_id }}"
|
<a href="/planned/remove/{{ planned_event.trip_details_id }}" class="btn btn-attention btn-fw">Abmelden</a>
|
||||||
class="btn btn-attention btn-fw">Abmelden</a>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if planned_event.max_people > planned_event.rower | length %}
|
{% if planned_event.max_people > planned_event.rower | length %}
|
||||||
{% if cur_user_participates == false %}
|
{% if cur_user_participates == false %}
|
||||||
<a href="/planned/join/{{ planned_event.trip_details_id }}"
|
<a href="/planned/join/{{ planned_event.trip_details_id }}" class="btn btn-primary btn-fw" {% if planned_event.trip_type %} onclick="return confirm('{{ planned_event.trip_type.question }}');" {% endif %}>Mitrudern</a>
|
||||||
class="btn btn-primary btn-fw"
|
|
||||||
{% if planned_event.trip_type %}onclick="return confirm('{{ planned_event.trip_type.question }}');"{% endif %}>Mitrudern</a>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{# --- END Row Buttons --- #}
|
{# --- END Row Buttons --- #}
|
||||||
|
|
||||||
{# --- START Cox Buttons --- #}
|
{# --- START Cox Buttons --- #}
|
||||||
{% if "cox" in loggedin_user.roles %}
|
{% if "cox" in loggedin_user.roles %}
|
||||||
{% set_global cur_user_participates = false %}
|
{% set_global cur_user_participates = false %}
|
||||||
@ -134,15 +127,12 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% if cur_user_participates %}
|
{% if cur_user_participates %}
|
||||||
<a href="/cox/remove/{{ planned_event.id }}"
|
<a href="/cox/remove/{{ planned_event.id }}" class="block btn btn-attention btn-fw">
|
||||||
class="block btn btn-attention btn-fw">
|
|
||||||
{% include "includes/cox-icon" %}
|
{% include "includes/cox-icon" %}
|
||||||
Abmelden
|
Abmelden
|
||||||
</a>
|
</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
<a href="/cox/join/{{ planned_event.id }}"
|
<a href="/cox/join/{{ planned_event.id }}" class="block btn {% if amount_cox_missing > 0 %} btn-dark {% else %} btn-gray {% endif %} btn-fw" {% if planned_event.trip_type %} onclick="return confirm('{{ planned_event.trip_type.question }}');" {% endif %}>
|
||||||
class="block btn {% if amount_cox_missing > 0 %} btn-dark {% else %} btn-gray {% endif %} btn-fw"
|
|
||||||
{% if planned_event.trip_type %}onclick="return confirm('{{ planned_event.trip_type.question }}');"{% endif %}>
|
|
||||||
{% include "includes/cox-icon" %}
|
{% include "includes/cox-icon" %}
|
||||||
Steuern
|
Steuern
|
||||||
</a>
|
</a>
|
||||||
@ -151,9 +141,11 @@
|
|||||||
{# --- END Cox Buttons --- #}
|
{# --- END Cox Buttons --- #}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{# --- START Sidebar Content --- #}
|
{# --- START Sidebar Content --- #}
|
||||||
<div class="hidden">
|
<div class="hidden">
|
||||||
<div id="event{{ planned_event.trip_details_id }}">
|
<div
|
||||||
|
id="event{{ planned_event.trip_details_id }}">
|
||||||
{# --- START List Coxes --- #}
|
{# --- START List Coxes --- #}
|
||||||
{% if planned_event.planned_amount_cox > 0 %}
|
{% if planned_event.planned_amount_cox > 0 %}
|
||||||
{% if amount_cox_missing > 0 %}
|
{% if amount_cox_missing > 0 %}
|
||||||
@ -163,45 +155,49 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{# --- END List Coxes --- #}
|
{# --- END List Coxes --- #}
|
||||||
|
|
||||||
{# --- START List Rowers --- #}
|
{# --- START List Rowers --- #}
|
||||||
{% if planned_event.max_people > 0 %}
|
{% if planned_event.max_people > 0 %}
|
||||||
{% set amount_cur_rower = planned_event.rower | length %}
|
{% set amount_cur_rower = planned_event.rower | length %}
|
||||||
{{ macros::box(participants=planned_event.rower, empty_seats=planned_event.max_people - amount_cur_rower, bg='primary-100', color='black', trip_details_id=planned_event.trip_details_id, allow_removing="planned_event" in loggedin_user.roles) }}
|
{{ macros::box(participants=planned_event.rower, empty_seats=planned_event.max_people - amount_cur_rower, bg='primary-100', color='black', trip_details_id=planned_event.trip_details_id, allow_removing="planned_event" in loggedin_user.roles) }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{# --- END List Rowers --- #}
|
{# --- END List Rowers --- #}
|
||||||
|
|
||||||
{% if "planned_event" in loggedin_user.roles %}
|
{% if "planned_event" in loggedin_user.roles %}
|
||||||
<form action="/planned/join/{{ planned_event.trip_details_id }}"
|
<form action="/planned/join/{{ planned_event.trip_details_id }}" method="get" />
|
||||||
method="get" />
|
|
||||||
{{ macros::input(label='Gast', class="input rounded-t", name='user_note', type='text', required=true) }}
|
{{ macros::input(label='Gast', class="input rounded-t", name='user_note', type='text', required=true) }}
|
||||||
<input value="Gast hinzufügen"
|
<input value="Gast hinzufügen" class="btn btn-primary w-full rounded-t-none-important" type="submit"/>
|
||||||
class="btn btn-primary w-full rounded-t-none-important"
|
|
||||||
type="submit" />
|
|
||||||
</form>
|
</form>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
{% if planned_event.allow_guests %}
|
{% if planned_event.allow_guests %}
|
||||||
<div class="text-primary-900 bg-primary-50 text-center p-1 mb-4">Gäste willkommen!</div>
|
<div class="text-primary-900 bg-primary-50 text-center p-1 mb-4">Gäste willkommen!</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if "planned_event" in loggedin_user.roles %}
|
{% if "planned_event" in loggedin_user.roles %}
|
||||||
|
|
||||||
{# --- START Edit Form --- #}
|
{# --- START Edit Form --- #}
|
||||||
<div class="bg-gray-100 dark:bg-primary-900 p-3 mt-4 rounded-md">
|
<div class="bg-gray-100 dark:bg-primary-900 p-3 mt-4 rounded-md">
|
||||||
<h3 class="text-primary-950 dark:text-white font-bold uppercase tracking-wide mb-2">Ausfahrt bearbeiten</h3>
|
<h3 class="text-primary-950 dark:text-white font-bold uppercase tracking-wide mb-2">Ausfahrt bearbeiten</h3>
|
||||||
<form action="/admin/planned-event" method="post" class="grid gap-3">
|
<form action="/admin/planned-event" method="post" class="grid gap-3">
|
||||||
<input type="hidden" name="_method" value="put" />
|
<input type="hidden" name="_method" value="put"/>
|
||||||
<input type="hidden" name="id" value="{{ planned_event.id }}" />
|
<input type="hidden" name="id" value="{{ planned_event.id }}"/>
|
||||||
{{ macros::input(label='Titel', name='name', type='input', value=planned_event.name) }}
|
{{ macros::input(label='Titel', name='name', type='input', value=planned_event.name) }}
|
||||||
{{ macros::input(label='Anzahl Ruderer', name='max_people', type='number', required=true, value=planned_event.max_people, min='0') }}
|
{{ macros::input(label='Anzahl Ruderer', name='max_people', type='number', required=true, value=planned_event.max_people, min='0') }}
|
||||||
{{ macros::input(label='Anzahl Steuerleute', name='planned_amount_cox', type='number', value=planned_event.planned_amount_cox, required=true, min='0') }}
|
{{ macros::input(label='Anzahl Steuerleute', name='planned_amount_cox', type='number', value=planned_event.planned_amount_cox, required=true, min='0') }}
|
||||||
{{ macros::checkbox(label='Immer anzeigen', name='always_show', id=planned_event.id,checked=planned_event.always_show) }}
|
{{ macros::checkbox(label='Immer anzeigen', name='always_show', id=planned_event.id,checked=planned_event.always_show) }}
|
||||||
{{ macros::checkbox(label='Gesperrt', name='is_locked', id=planned_event.id,checked=planned_event.is_locked) }}
|
{{ macros::checkbox(label='Gesperrt', name='is_locked', id=planned_event.id,checked=planned_event.is_locked) }}
|
||||||
{{ macros::input(label='Anmerkungen', name='notes', type='input', value=planned_event.notes) }}
|
{{ macros::input(label='Anmerkungen', name='notes', type='input', value=planned_event.notes) }}
|
||||||
<input value="Speichern" class="btn btn-primary" type="submit" />
|
|
||||||
|
<input value="Speichern" class="btn btn-primary" type="submit"/>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
{# --- END Edit Form --- #}
|
{# --- END Edit Form --- #}
|
||||||
|
|
||||||
{# --- START Delete Btn --- #}
|
{# --- START Delete Btn --- #}
|
||||||
<div class="text-right">
|
<div class="text-right">
|
||||||
<a href="/admin/planned-event/{{ planned_event.id }}/delete"
|
<a href="/admin/planned-event/{{ planned_event.id }}/delete" class="inline-block btn btn-alert">
|
||||||
class="inline-block btn btn-alert">
|
|
||||||
{% include "includes/delete-icon" %}
|
{% include "includes/delete-icon" %}
|
||||||
Termin löschen
|
Termin löschen
|
||||||
</a>
|
</a>
|
||||||
@ -215,12 +211,11 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{# --- END Events --- #}
|
{# --- END Events --- #}
|
||||||
|
|
||||||
{# --- START Trips --- #}
|
{# --- START Trips --- #}
|
||||||
{% if day.trips | length > 0 %}
|
{% if day.trips | length > 0 %}
|
||||||
{% for trip in day.trips | sort(attribute="planned_starting_time") %}
|
{% for trip in day.trips | sort(attribute="planned_starting_time") %}
|
||||||
<div class="pt-2 px-3 reset-js border-t border-gray-200"
|
<div class="pt-2 px-3 reset-js border-t border-gray-200" style="order: {{ trip.planned_starting_time | replace(from=":", to="") }}" data-coxneeded="false">
|
||||||
style="order: {{ trip.planned_starting_time | replace(from=":", to="") }}"
|
|
||||||
data-coxneeded="false">
|
|
||||||
<div class="flex justify-between items-center">
|
<div class="flex justify-between items-center">
|
||||||
<div class="mr-1">
|
<div class="mr-1">
|
||||||
{% if trip.max_people == 0 %}
|
{% if trip.max_people == 0 %}
|
||||||
@ -228,29 +223,22 @@
|
|||||||
{{ trip.planned_starting_time }}
|
{{ trip.planned_starting_time }}
|
||||||
Uhr</strong>
|
Uhr</strong>
|
||||||
<small class="text-[#f43f5e]">(Absage
|
<small class="text-[#f43f5e]">(Absage
|
||||||
{{ trip.cox_name -}}
|
{{ trip.cox_name }}
|
||||||
{% if trip.trip_type %}
|
{% if trip.trip_type %}
|
||||||
-
|
-
|
||||||
{{ trip.trip_type.icon | safe }}{{ trip.trip_type.name }}
|
{{ trip.trip_type.icon | safe }}{{ trip.trip_type.name }}
|
||||||
{% endif -%}
|
{% endif %})</small>
|
||||||
)</small>
|
|
||||||
{% else %}
|
{% else %}
|
||||||
<strong class="text-primary-900 dark:text-white">{{ trip.planned_starting_time }}
|
<strong class="text-primary-900 dark:text-white">{{ trip.planned_starting_time }}
|
||||||
Uhr</strong>
|
Uhr</strong>
|
||||||
<small class="text-gray-600 dark:text-gray-100">({{ trip.cox_name -}}
|
<small class="text-gray-600 dark:text-gray-100">({{ trip.cox_name }}{% if trip.trip_type %} - {{ trip.trip_type.icon | safe }} {{ trip.trip_type.name }}{% endif %})</small>
|
||||||
{% if trip.trip_type %}- {{ trip.trip_type.icon | safe }} {{ trip.trip_type.name }}{% endif -%}
|
|
||||||
)</small>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<br />
|
<br/>
|
||||||
<a href="#" data-sidebar="true" data-trigger="sidebar" data-header="<strong>
|
<a href="#" data-sidebar="true" data-trigger="sidebar" data-header="<strong>{% if trip.max_people == 0 %}⚠ {% endif %}{{ trip.planned_starting_time }} Uhr</strong> ({{ trip.cox_name }}){% if trip.trip_type %}<small class='block'>{{ trip.trip_type.desc }}</small>{% endif %}{% if trip.notes %}<small class='block'>{{ trip.notes }}</small>{% endif %}" data-body="#trip{{ trip.trip_details_id }}" class="inline-block link-primary mr-3">
|
||||||
{% if trip.max_people == 0 %}⚠{% endif %}
|
|
||||||
{{ trip.planned_starting_time }} Uhr</strong> ({{ trip.cox_name }})
|
|
||||||
{% if trip.trip_type %}<small class='block'>{{ trip.trip_type.desc }}</small>{% endif %}
|
|
||||||
{% if trip.notes %}<small class='block'>{{ trip.notes }}</small>{% endif %}
|
|
||||||
" data-body="#trip{{ trip.trip_details_id }}" class="inline-block link-primary mr-3">
|
|
||||||
Details
|
Details
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
{% set_global cur_user_participates = false %}
|
{% set_global cur_user_participates = false %}
|
||||||
{% for rower in trip.rower %}
|
{% for rower in trip.rower %}
|
||||||
@ -259,13 +247,10 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% if cur_user_participates %}
|
{% if cur_user_participates %}
|
||||||
<a href="/planned/remove/{{ trip.trip_details_id }}"
|
<a href="/planned/remove/{{ trip.trip_details_id }}" class="btn btn-attention btn-fw">Abmelden</a>
|
||||||
class="btn btn-attention btn-fw">Abmelden</a>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if trip.max_people > trip.rower | length and trip.cox_id != loggedin_user.id and cur_user_participates == false %}
|
{% if trip.max_people > trip.rower | length and trip.cox_id != loggedin_user.id and cur_user_participates == false%}
|
||||||
<a href="/planned/join/{{ trip.trip_details_id }}"
|
<a href="/planned/join/{{ trip.trip_details_id }}" class="btn btn-primary btn-fw" {% if trip.trip_type %} onclick="return confirm('{{ trip.trip_type.question }}');" {% endif %}>Mitrudern</a>
|
||||||
class="btn btn-primary btn-fw"
|
|
||||||
{% if trip.trip_type %}onclick="return confirm('{{ trip.trip_type.question }}');"{% endif %}>Mitrudern</a>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -281,12 +266,11 @@
|
|||||||
{% if trip.cox_id == loggedin_user.id %}
|
{% if trip.cox_id == loggedin_user.id %}
|
||||||
<form action="/planned/join/{{ trip.trip_details_id }}" method="get" />
|
<form action="/planned/join/{{ trip.trip_details_id }}" method="get" />
|
||||||
{{ macros::input(label='Gast', class="input rounded-t", name='user_note', type='text', required=true) }}
|
{{ macros::input(label='Gast', class="input rounded-t", name='user_note', type='text', required=true) }}
|
||||||
<input value="Gast hinzufügen"
|
<input value="Gast hinzufügen" class="btn btn-primary w-full rounded-t-none-important" type="submit"/>
|
||||||
class="btn btn-primary w-full rounded-t-none-important"
|
|
||||||
type="submit" />
|
|
||||||
</form>
|
</form>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{# --- START Edit Form --- #}
|
{# --- START Edit Form --- #}
|
||||||
{% if trip.cox_id == loggedin_user.id %}
|
{% if trip.cox_id == loggedin_user.id %}
|
||||||
<div class="bg-gray-100 dark:bg-primary-900 p-3 mt-4 rounded-md">
|
<div class="bg-gray-100 dark:bg-primary-900 p-3 mt-4 rounded-md">
|
||||||
@ -297,13 +281,13 @@
|
|||||||
{{ macros::checkbox(label='Immer anzeigen', name='always_show', id=trip.id,checked=trip.always_show) }}
|
{{ macros::checkbox(label='Immer anzeigen', name='always_show', id=trip.id,checked=trip.always_show) }}
|
||||||
{{ macros::checkbox(label='Gesperrt', name='is_locked', id=trip.id,checked=trip.is_locked) }}
|
{{ macros::checkbox(label='Gesperrt', name='is_locked', id=trip.id,checked=trip.is_locked) }}
|
||||||
{{ macros::select(label='Typ', name='trip_type', data=trip_types, default='Reguläre Ausfahrt', selected_id=trip.trip_type_id) }}
|
{{ macros::select(label='Typ', name='trip_type', data=trip_types, default='Reguläre Ausfahrt', selected_id=trip.trip_type_id) }}
|
||||||
<input value="Speichern" class="btn btn-primary" type="submit" />
|
|
||||||
|
<input value="Speichern" class="btn btn-primary" type="submit"/>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
{% if trip.rower | length == 0 %}
|
{% if trip.rower | length == 0 %}
|
||||||
<div class="text-right mt-6">
|
<div class="text-right mt-6">
|
||||||
<a href="/cox/remove/trip/{{ trip.id }}"
|
<a href="/cox/remove/trip/{{ trip.id }}" class="inline-block btn btn-alert">
|
||||||
class="inline-block btn btn-alert">
|
|
||||||
{% include "includes/delete-icon" %}
|
{% include "includes/delete-icon" %}
|
||||||
Termin löschen
|
Termin löschen
|
||||||
</a>
|
</a>
|
||||||
@ -321,30 +305,24 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{# --- START Add Buttons --- #}
|
{# --- START Add Buttons --- #}
|
||||||
{% if "planned_event" in loggedin_user.roles or "cox" in loggedin_user.roles %}
|
{% if "planned_event" in loggedin_user.roles or "cox" in loggedin_user.roles %}
|
||||||
<div class="grid {% if "planned_event" in loggedin_user.roles %}grid-cols-2{% endif %} text-center">
|
<div class="grid {% if "planned_event" in loggedin_user.roles %} grid-cols-2 {% endif %} text-center">
|
||||||
{% if "planned_event" in loggedin_user.roles %}
|
{% if "planned_event" in loggedin_user.roles %}
|
||||||
<a href="#"
|
<a href="#" data-sidebar="true" data-trigger="sidebar" data-header="<strong>Event</strong> am {{ day.day| date(format='%d.%m.%Y') }} erstellen" data-day="{{ day.day }}" data-body="#addEventForm" class="relative inline-block w-full bg-primary-900 hover:bg-primary-950 focus:bg-primary-950 dark:bg-primary-950 text-white py-2 rounded-bl-md text-sm font-semibold">
|
||||||
data-sidebar="true"
|
<span class="absolute inset-y-0 left-0 flex items-center pl-3">
|
||||||
data-trigger="sidebar"
|
{% include "includes/plus-icon" %}
|
||||||
data-header="<strong>Event</strong> am {{ day.day| date(format='%d.%m.%Y') }} erstellen"
|
</span>
|
||||||
data-day="{{ day.day }}"
|
|
||||||
data-body="#addEventForm"
|
|
||||||
class="relative inline-block w-full bg-primary-900 hover:bg-primary-950 focus:bg-primary-950 dark:bg-primary-950 text-white py-2 rounded-bl-md text-sm font-semibold">
|
|
||||||
<span class="absolute inset-y-0 left-0 flex items-center pl-3">{% include "includes/plus-icon" %}</span>
|
|
||||||
Event
|
Event
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if "cox" in loggedin_user.roles %}
|
{% if "cox" in loggedin_user.roles %}
|
||||||
<a href="#" data-sidebar="true" data-trigger="sidebar" data-header="<strong>Ausfahrt</strong> am {{ day.day| date(format='%d.%m.%Y') }} erstellen" data-day="{{ day.day }}" data-body="#sidebarForm" class="relative inline-block w-full py-2 text-primary-900 hover:text-primary-950 dark:bg-primary-600 dark:text-white dark:hover:bg-primary-500 dark:hover:text-white focus:text-primary-950 text-sm font-semibold bg-gray-100 hover:bg-gray-200 focus:bg-gray-200
|
<a href="#" data-sidebar="true" data-trigger="sidebar" data-header="<strong>Ausfahrt</strong> am {{ day.day| date(format='%d.%m.%Y') }} erstellen" data-day="{{ day.day }}" data-body="#sidebarForm" class="relative inline-block w-full py-2 text-primary-900 hover:text-primary-950 dark:bg-primary-600 dark:text-white dark:hover:bg-primary-500 dark:hover:text-white focus:text-primary-950 text-sm font-semibold bg-gray-100 hover:bg-gray-200 focus:bg-gray-200 {% if "planned_event" in loggedin_user.roles %} rounded-br-md {% else %} rounded-b-md {% endif %}">
|
||||||
{% if "planned_event" in loggedin_user.roles %}
|
<span class="absolute inset-y-0 left-0 flex items-center pl-3">
|
||||||
rounded-br-md
|
{% include "includes/plus-icon" %}
|
||||||
{% else %}
|
</span>
|
||||||
rounded-b-md
|
|
||||||
{% endif %}
|
|
||||||
">
|
|
||||||
<span class="absolute inset-y-0 left-0 flex items-center pl-3">{% include "includes/plus-icon" %}</span>
|
|
||||||
Ausfahrt
|
Ausfahrt
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@ -352,13 +330,14 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{# --- END Add Buttons --- #}
|
{# --- END Add Buttons --- #}
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% if "cox" in loggedin_user.roles %}
|
{% if "cox" in loggedin_user.roles %}
|
||||||
{% include "forms/trip" %}
|
{% include "forms/trip" %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if "planned_event" in loggedin_user.roles %}
|
{% if "planned_event" in loggedin_user.roles %}
|
||||||
{% include "forms/event" %}
|
{% include "forms/event" %}
|
||||||
{% endif %}
|
{% endif %}{% endblock content %}
|
||||||
{% endblock content %}
|
|
||||||
|
@ -1,40 +1,40 @@
|
|||||||
{% import "includes/macros" as macros %}
|
{% import "includes/macros" as macros %}
|
||||||
|
|
||||||
{% extends "base" %}
|
{% extends "base" %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="max-w-screen-lg w-full">
|
<div class="max-w-screen-lg w-full">
|
||||||
<h1 class="h1">Bootsauswertung</h1>
|
<h1 class="h1">Bootsauswertung</h1>
|
||||||
<div class="search-wrapper">
|
<div class="search-wrapper">
|
||||||
<label for="name" class="sr-only">Suche</label>
|
<label for="name" class="sr-only">Suche</label>
|
||||||
<input type="search"
|
<input type="search" name="name" id="filter-js" class="search-bar" placeholder="Suchen nach Bootsnamen...">
|
||||||
name="name"
|
|
||||||
id="filter-js"
|
|
||||||
class="search-bar"
|
|
||||||
placeholder="Suchen nach Bootsnamen...">
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="filter-result-js" class="search-result"></div>
|
<div id="filter-result-js" class="search-result"></div>
|
||||||
|
|
||||||
<div class="border-r border-l border-gray-200 dark:border-primary-600">
|
<div class="border-r border-l border-gray-200 dark:border-primary-600">
|
||||||
{% set_global km = 0 %}
|
{% set_global km = 0 %}
|
||||||
{% set_global index = 1 %}
|
{% set_global index = 1 %}
|
||||||
{% for s in stat %}
|
{% for s in stat %}
|
||||||
<div class="border-t border-gray-200 dark:border-primary-600 {% if loop.last %}border-b{% endif %} bg-white dark:bg-primary-900 text-black dark:text-white flex justify-between items-center px-3 py-1"
|
<div class="border-t border-gray-200 dark:border-primary-600 {% if loop.last %} border-b {% endif %} bg-white dark:bg-primary-900 text-black dark:text-white flex justify-between items-center px-3 py-1" data-filterable="true" data-filter="{{ s.name }}">
|
||||||
data-filterable="true"
|
|
||||||
data-filter="{{ s.name }}">
|
|
||||||
<span class="text-sm text-gray-600 dark:text-gray-100 w-10">
|
<span class="text-sm text-gray-600 dark:text-gray-100 w-10">
|
||||||
{% if km != s.rowed_km %}
|
{% if km != s.rowed_km %}
|
||||||
{{ loop.index }}
|
{{loop.index}}
|
||||||
{% set_global index = loop.index %}
|
{% set_global index = loop.index %}
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ index }}
|
{{ index }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</span>
|
</span>
|
||||||
<span class="grow">{{ s.name }}</span>
|
<span class="grow">{{s.name}}</span>
|
||||||
<span>{{ s.rowed_km }}
|
<span>{{s.rowed_km}}
|
||||||
km</span>
|
km</span>
|
||||||
|
|
||||||
{% set_global km = s.rowed_km %}
|
{% set_global km = s.rowed_km %}
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
<div id="container" class="w-full"></div>
|
<div id="container" class="w-full"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="/public/logbook.js"></script>
|
<script src="/public/logbook.js"></script>
|
||||||
{% endblock content %}
|
{% endblock content%}
|
||||||
|
@ -1,57 +1,77 @@
|
|||||||
{% import "includes/macros" as macros %}
|
{% import "includes/macros" as macros %}
|
||||||
|
|
||||||
{% extends "base" %}
|
{% extends "base" %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="max-w-screen-lg w-full">
|
|
||||||
|
|
||||||
|
<div class="max-w-screen-lg w-full">
|
||||||
<h1 class="h1">
|
<h1 class="h1">
|
||||||
Statistik
|
Statistik
|
||||||
<select id="yearSelect"
|
<select
|
||||||
|
id="yearSelect"
|
||||||
onchange="changeYear()"
|
onchange="changeYear()"
|
||||||
style="background: transparent;
|
style="
|
||||||
|
background: transparent;
|
||||||
background-image: none;
|
background-image: none;
|
||||||
text-decoration: underline"></select>
|
text-decoration: underline;
|
||||||
|
"
|
||||||
|
></select>
|
||||||
</h1>
|
</h1>
|
||||||
<div class="search-wrapper">
|
<div class="search-wrapper">
|
||||||
<label for="name" class="sr-only">Suche</label>
|
<label for="name" class="sr-only">Suche</label>
|
||||||
<input type="search"
|
<input
|
||||||
|
type="search"
|
||||||
name="name"
|
name="name"
|
||||||
id="filter-js"
|
id="filter-js"
|
||||||
class="search-bar"
|
class="search-bar"
|
||||||
placeholder="Suchen nach Namen..." />
|
placeholder="Suchen nach Namen..."
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="filter-result-js" class="search-result"></div>
|
<div id="filter-result-js" class="search-result"></div>
|
||||||
|
|
||||||
<div class="border-r border-l border-gray-200 dark:border-primary-600">
|
<div class="border-r border-l border-gray-200 dark:border-primary-600">
|
||||||
{% set_global km = 0 %} {% set_global index = 1 %}
|
{% set_global km = 0 %} {% set_global index = 1 %} {% for s in stat %}
|
||||||
{% for s in stat %}
|
<div
|
||||||
<div class="border-t border-gray-200 dark:border-primary-600 {% if loop.last %}border-b{% endif %} bg-white dark:bg-primary-900 text-black dark:text-white flex justify-between items-center px-3 py-1"
|
class="border-t border-gray-200 dark:border-primary-600 {% if loop.last %} border-b {% endif %} bg-white dark:bg-primary-900 text-black dark:text-white flex justify-between items-center px-3 py-1"
|
||||||
data-filterable="true"
|
data-filterable="true"
|
||||||
data-filter="{{ s.name }}">
|
data-filter="{{ s.name }}"
|
||||||
|
>
|
||||||
<span class="text-sm text-gray-600 dark:text-gray-100 w-10">
|
<span class="text-sm text-gray-600 dark:text-gray-100 w-10">
|
||||||
{% if km != s.rowed_km %}
|
{% if km != s.rowed_km %}
|
||||||
{{ loop.index }}
|
{{ loop.index }}
|
||||||
{% set_global index = loop.index %}
|
{% set_global index = loop.index %} {% else %}
|
||||||
{% else %}
|
|
||||||
{{ index }}
|
{{ index }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</span>
|
</span>
|
||||||
<span class="grow">{{ s.name }}</span>
|
<span class="grow">{{ s.name }}</span>
|
||||||
<span>{{ s.rowed_km }} km</span>
|
<span>{{ s.rowed_km }} km</span>
|
||||||
|
|
||||||
{% set_global km = s.rowed_km %}
|
{% set_global km = s.rowed_km %}
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<div class="border-t border-gray-200 dark:border-primary-600 {% if loop.last %}border-b{% endif %} bg-white dark:bg-primary-900 text-black dark:text-white flex justify-between items-center px-3 py-1"
|
<div
|
||||||
|
class="border-t border-gray-200 dark:border-primary-600 {% if loop.last %} border-b {% endif %} bg-white dark:bg-primary-900 text-black dark:text-white flex justify-between items-center px-3 py-1"
|
||||||
data-filterable="true"
|
data-filterable="true"
|
||||||
data-filter="{{ guest_km.name }}">
|
data-filter="{{ guest_km.name }}"
|
||||||
<span class="text-sm text-gray-600 dark:text-gray-100 w-10"></span>
|
>
|
||||||
|
<span class="text-sm text-gray-600 dark:text-gray-100 w-10">
|
||||||
|
</span>
|
||||||
<span class="grow">{{ guest_km.name }}</span>
|
<span class="grow">{{ guest_km.name }}</span>
|
||||||
<span>{{ guest_km.rowed_km }} km</span>
|
<span>{{ guest_km.rowed_km }} km</span>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="container" class="w-full"></div>
|
<div id="container" class="w-full"></div>
|
||||||
</div>
|
</div>
|
||||||
<script>
|
|
||||||
|
<script>
|
||||||
{% if personal %}
|
{% if personal %}
|
||||||
const data = [
|
const data = [
|
||||||
{%- for p in personal %}{ date: '{{p.date}}', km: {{p.km}} },{%- endfor %}
|
{%- for p in personal %}
|
||||||
|
{ date: '{{p.date}}', km: {{p.km}} },
|
||||||
|
{%- endfor %}
|
||||||
]
|
]
|
||||||
sessionStorage.setItem('userStats', JSON.stringify(data));
|
sessionStorage.setItem('userStats', JSON.stringify(data));
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@ -82,6 +102,7 @@ function changeYear() {
|
|||||||
|
|
||||||
// Call this function when the page loads
|
// Call this function when the page loads
|
||||||
populateYears();
|
populateYears();
|
||||||
</script>
|
</script>
|
||||||
<script src="/public/logbook.js"></script>
|
|
||||||
{% endblock content %}
|
<script src="/public/logbook.js"></script>
|
||||||
|
{% endblock content%}
|
||||||
|