Compare commits
20 Commits
improve-lo
...
8277ef6af8
| Author | SHA1 | Date | |
|---|---|---|---|
| 8277ef6af8 | |||
| 67d5df9c18 | |||
| 3ffc44a5a2 | |||
| bd2686fa9c | |||
| 495ee666cd | |||
| 5296b6a6c1 | |||
| 49e657ab54 | |||
| 25bbaca0d3 | |||
| 26038eabe4 | |||
| 57acd92e7c | |||
| c136c60e62 | |||
| a5e90ea014 | |||
| f0f3909239 | |||
| 1438bbe3a8 | |||
| a910cd745d | |||
| 6265440288 | |||
| 3baed66ebc | |||
| 499ce06438 | |||
| 67e5277c62 | |||
| ce154bf060 |
@@ -5,7 +5,3 @@
|
|||||||
.h2 {
|
.h2 {
|
||||||
@apply font-bold uppercase tracking-wide text-center rounded-t-md text-primary-950 dark:text-white bg-gray-200 dark:bg-primary-950 bg-opacity-80 text-lg px-3 py-3;
|
@apply font-bold uppercase tracking-wide text-center rounded-t-md text-primary-950 dark:text-white bg-gray-200 dark:bg-primary-950 bg-opacity-80 text-lg px-3 py-3;
|
||||||
}
|
}
|
||||||
|
|
||||||
.h3 {
|
|
||||||
@apply text-center text-xl uppercase tracking-wide font-bold text-primary-900 dark:text-white;
|
|
||||||
}
|
|
||||||
@@ -11,10 +11,6 @@
|
|||||||
@apply text-white hover:text-primary-100 underline;
|
@apply text-white hover:text-primary-100 underline;
|
||||||
}
|
}
|
||||||
|
|
||||||
&-black {
|
|
||||||
@apply text-black hover:text-primary-950 dark:text-white hover:dark:text-primary-300 underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-no-underline {
|
&-no-underline {
|
||||||
@apply no-underline;
|
@apply no-underline;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use std::ops::DerefMut;
|
use std::ops::DerefMut;
|
||||||
|
|
||||||
use super::{role::Role, user::User};
|
use super::user::User;
|
||||||
use chrono::NaiveDateTime;
|
use chrono::NaiveDateTime;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use sqlx::{FromRow, Sqlite, SqlitePool, Transaction};
|
use sqlx::{FromRow, Sqlite, SqlitePool, Transaction};
|
||||||
@@ -21,7 +21,6 @@ pub struct ActivityBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl ActivityBuilder {
|
impl ActivityBuilder {
|
||||||
#[must_use]
|
|
||||||
pub fn new(text: &str) -> Self {
|
pub fn new(text: &str) -> Self {
|
||||||
Self {
|
Self {
|
||||||
text: text.into(),
|
text: text.into(),
|
||||||
@@ -30,7 +29,6 @@ impl ActivityBuilder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[must_use]
|
|
||||||
pub fn relevant_for_user(self, user: &User) -> Self {
|
pub fn relevant_for_user(self, user: &User) -> Self {
|
||||||
Self {
|
Self {
|
||||||
relevant_for: format!("{}user-{};", self.relevant_for, user.id),
|
relevant_for: format!("{}user-{};", self.relevant_for, user.id),
|
||||||
@@ -38,14 +36,6 @@ impl ActivityBuilder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[must_use]
|
|
||||||
pub fn relevant_for_role(self, role: &Role) -> Self {
|
|
||||||
Self {
|
|
||||||
relevant_for: format!("{}role-{};", self.relevant_for, role.id),
|
|
||||||
..self
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn save(self, db: &SqlitePool) {
|
pub async fn save(self, db: &SqlitePool) {
|
||||||
Activity::create(db, &self.text, &self.relevant_for, self.keep_until).await;
|
Activity::create(db, &self.text, &self.relevant_for, self.keep_until).await;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
use std::{cmp::Ordering, fmt::Display, ops::DerefMut};
|
use std::{cmp::Ordering, fmt::Display, ops::DerefMut};
|
||||||
|
|
||||||
use super::{activity::ActivityBuilder, user::AdminUser};
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use sqlx::{FromRow, Sqlite, SqlitePool, Transaction};
|
use sqlx::{FromRow, Sqlite, SqlitePool, Transaction};
|
||||||
|
|
||||||
@@ -135,30 +134,6 @@ WHERE name like ?
|
|||||||
.ok()
|
.ok()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn update(
|
|
||||||
&self,
|
|
||||||
db: &SqlitePool,
|
|
||||||
updated_by: &AdminUser,
|
|
||||||
formatted_name: &str,
|
|
||||||
desc: &str,
|
|
||||||
) -> Result<(), String> {
|
|
||||||
sqlx::query!(
|
|
||||||
"UPDATE role SET formatted_name=?, desc=? WHERE id=?",
|
|
||||||
formatted_name,
|
|
||||||
desc,
|
|
||||||
self.id
|
|
||||||
)
|
|
||||||
.execute(db)
|
|
||||||
.await
|
|
||||||
.map_err(|e| e.to_string())?;
|
|
||||||
|
|
||||||
ActivityBuilder::new(&format!(
|
|
||||||
"{updated_by} hat Rolle {self} von {self:#?} auf FORMATTED_NAME={formatted_name}, DESC={desc} aktualisiert."
|
|
||||||
)).relevant_for_role(self).save(db).await;
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn names_from_role(&self, db: &SqlitePool) -> Vec<String> {
|
pub async fn names_from_role(&self, db: &SqlitePool) -> Vec<String> {
|
||||||
let query = format!(
|
let query = format!(
|
||||||
"SELECT u.name
|
"SELECT u.name
|
||||||
|
|||||||
@@ -414,14 +414,12 @@ impl User {
|
|||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
if !role.hide_in_lists && role.cluster.is_none() {
|
|
||||||
ActivityBuilder::new(&format!(
|
ActivityBuilder::new(&format!(
|
||||||
"{updated_by} hat die Rolle {role} von {self} entfernt."
|
"{updated_by} hat die Rolle {role} von {self} entfernt."
|
||||||
))
|
))
|
||||||
.relevant_for_user(self)
|
.relevant_for_user(self)
|
||||||
.save(db)
|
.save(db)
|
||||||
.await;
|
.await;
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -501,7 +499,7 @@ impl User {
|
|||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
if !role.hide_in_lists && role.cluster.is_none() {
|
if !role.hide_in_lists {
|
||||||
ActivityBuilder::new(&format!(
|
ActivityBuilder::new(&format!(
|
||||||
"{updated_by} hat die Rolle '{role}' dem Benutzer {self} hinzugefügt."
|
"{updated_by} hat die Rolle '{role}' dem Benutzer {self} hinzugefügt."
|
||||||
))
|
))
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
use super::{ManageUserUser, User, regular::ClubMember};
|
use super::{regular::ClubMember, ManageUserUser, User};
|
||||||
use crate::{
|
use crate::{
|
||||||
NonEmptyString,
|
|
||||||
model::{activity::ActivityBuilder, mail::Mail, notification::Notification, role::Role},
|
model::{activity::ActivityBuilder, mail::Mail, notification::Notification, role::Role},
|
||||||
special_user,
|
special_user, NonEmptyString,
|
||||||
};
|
};
|
||||||
use chrono::NaiveDate;
|
use chrono::NaiveDate;
|
||||||
use rocket::{async_trait, fs::TempFile};
|
use rocket::{async_trait, fs::TempFile};
|
||||||
|
|||||||
@@ -583,12 +583,12 @@ ASKÖ Ruderverein Donau Linz", self.name),
|
|||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn delete(&self, db: &SqlitePool, deleted_by: &ManageUserUser) {
|
pub async fn delete(&self, db: &SqlitePool) {
|
||||||
sqlx::query!("UPDATE user SET deleted=1 WHERE id=?", self.id)
|
sqlx::query!("UPDATE user SET deleted=1 WHERE id=?", self.id)
|
||||||
.execute(db)
|
.execute(db)
|
||||||
.await
|
.await
|
||||||
.unwrap(); //Okay, because we can only create a User of a valid id
|
.unwrap(); //Okay, because we can only create a User of a valid id
|
||||||
ActivityBuilder::new(&format!("User {self} wurde von {deleted_by} gelöscht."))
|
ActivityBuilder::new(&format!("User {self} wurde gelöscht."))
|
||||||
.relevant_for_user(self)
|
.relevant_for_user(self)
|
||||||
.save(db)
|
.save(db)
|
||||||
.await;
|
.await;
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
use super::{ManageUserUser, User};
|
use super::{ManageUserUser, User};
|
||||||
use crate::{
|
use crate::{
|
||||||
NonEmptyString,
|
|
||||||
model::{activity::ActivityBuilder, mail::Mail, notification::Notification, role::Role},
|
model::{activity::ActivityBuilder, mail::Mail, notification::Notification, role::Role},
|
||||||
special_user,
|
special_user, NonEmptyString,
|
||||||
};
|
};
|
||||||
use chrono::NaiveDate;
|
use chrono::NaiveDate;
|
||||||
use rocket::{async_trait, fs::TempFile, tokio::io::AsyncReadExt};
|
use rocket::{async_trait, fs::TempFile, tokio::io::AsyncReadExt};
|
||||||
|
|||||||
@@ -2,13 +2,12 @@ use super::foerdernd::FoerderndUser;
|
|||||||
use super::regular::RegularUser;
|
use super::regular::RegularUser;
|
||||||
use super::unterstuetzend::UnterstuetzendUser;
|
use super::unterstuetzend::UnterstuetzendUser;
|
||||||
use super::{ManageUserUser, User};
|
use super::{ManageUserUser, User};
|
||||||
use crate::NonEmptyString;
|
|
||||||
use crate::model::activity::ActivityBuilder;
|
use crate::model::activity::ActivityBuilder;
|
||||||
use crate::model::role::Role;
|
use crate::model::role::Role;
|
||||||
|
use crate::NonEmptyString;
|
||||||
use crate::{
|
use crate::{
|
||||||
SCHECKBUCH,
|
|
||||||
model::{mail::Mail, notification::Notification},
|
model::{mail::Mail, notification::Notification},
|
||||||
special_user,
|
special_user, SCHECKBUCH,
|
||||||
};
|
};
|
||||||
use chrono::NaiveDate;
|
use chrono::NaiveDate;
|
||||||
use rocket::async_trait;
|
use rocket::async_trait;
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ use super::scheckbuch::ScheckbuchUser;
|
|||||||
use super::schnupperinterest::SchnupperInterestUser;
|
use super::schnupperinterest::SchnupperInterestUser;
|
||||||
use super::unterstuetzend::UnterstuetzendUser;
|
use super::unterstuetzend::UnterstuetzendUser;
|
||||||
use super::{ManageUserUser, User};
|
use super::{ManageUserUser, User};
|
||||||
use crate::NonEmptyString;
|
|
||||||
use crate::model::activity::ActivityBuilder;
|
use crate::model::activity::ActivityBuilder;
|
||||||
use crate::model::role::Role;
|
use crate::model::role::Role;
|
||||||
|
use crate::NonEmptyString;
|
||||||
use crate::{
|
use crate::{
|
||||||
model::{mail::Mail, notification::Notification},
|
model::{mail::Mail, notification::Notification},
|
||||||
special_user,
|
special_user,
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
use super::scheckbuch::ScheckbuchUser;
|
use super::scheckbuch::ScheckbuchUser;
|
||||||
use super::schnupperant::SchnupperantUser;
|
use super::schnupperant::SchnupperantUser;
|
||||||
use super::{ManageUserUser, User};
|
use super::{ManageUserUser, User};
|
||||||
use crate::NonEmptyString;
|
|
||||||
use crate::model::activity::ActivityBuilder;
|
use crate::model::activity::ActivityBuilder;
|
||||||
use crate::model::role::Role;
|
use crate::model::role::Role;
|
||||||
|
use crate::NonEmptyString;
|
||||||
use crate::{model::notification::Notification, special_user};
|
use crate::{model::notification::Notification, special_user};
|
||||||
use rocket::async_trait;
|
use rocket::async_trait;
|
||||||
use sqlx::SqlitePool;
|
use sqlx::SqlitePool;
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
use super::{ManageUserUser, User, regular::ClubMember};
|
use super::{regular::ClubMember, ManageUserUser, User};
|
||||||
use crate::{
|
use crate::{
|
||||||
NonEmptyString,
|
|
||||||
model::{activity::ActivityBuilder, mail::Mail, notification::Notification, role::Role},
|
model::{activity::ActivityBuilder, mail::Mail, notification::Notification, role::Role},
|
||||||
special_user,
|
special_user, NonEmptyString,
|
||||||
};
|
};
|
||||||
use chrono::NaiveDate;
|
use chrono::NaiveDate;
|
||||||
use rocket::{async_trait, fs::TempFile};
|
use rocket::{async_trait, fs::TempFile};
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ pub mod boat;
|
|||||||
pub mod event;
|
pub mod event;
|
||||||
pub mod mail;
|
pub mod mail;
|
||||||
pub mod notification;
|
pub mod notification;
|
||||||
pub mod role;
|
|
||||||
pub mod schnupper;
|
pub mod schnupper;
|
||||||
pub mod user;
|
pub mod user;
|
||||||
|
|
||||||
@@ -82,7 +81,6 @@ pub fn routes() -> Vec<Route> {
|
|||||||
ret.append(&mut notification::routes());
|
ret.append(&mut notification::routes());
|
||||||
ret.append(&mut mail::routes());
|
ret.append(&mut mail::routes());
|
||||||
ret.append(&mut event::routes());
|
ret.append(&mut event::routes());
|
||||||
ret.append(&mut role::routes());
|
|
||||||
ret.append(&mut routes![rss, show_rss, show_list, list]);
|
ret.append(&mut routes![rss, show_rss, show_list, list]);
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,64 +0,0 @@
|
|||||||
use crate::model::{
|
|
||||||
role::Role,
|
|
||||||
user::{AdminUser, UserWithDetails, VorstandUser},
|
|
||||||
};
|
|
||||||
use rocket::{
|
|
||||||
form::Form,
|
|
||||||
get, post,
|
|
||||||
request::FlashMessage,
|
|
||||||
response::{Flash, Redirect},
|
|
||||||
routes, FromForm, Route, State,
|
|
||||||
};
|
|
||||||
use rocket_dyn_templates::{tera::Context, Template};
|
|
||||||
use sqlx::SqlitePool;
|
|
||||||
|
|
||||||
#[get("/role")]
|
|
||||||
async fn index(
|
|
||||||
db: &State<SqlitePool>,
|
|
||||||
admin: VorstandUser,
|
|
||||||
flash: Option<FlashMessage<'_>>,
|
|
||||||
) -> Template {
|
|
||||||
let roles = Role::all(db).await;
|
|
||||||
|
|
||||||
let mut context = Context::new();
|
|
||||||
if let Some(msg) = flash {
|
|
||||||
context.insert("flash", &msg.into_inner());
|
|
||||||
}
|
|
||||||
context.insert("roles", &roles);
|
|
||||||
context.insert(
|
|
||||||
"loggedin_user",
|
|
||||||
&UserWithDetails::from_user(admin.user, db).await,
|
|
||||||
);
|
|
||||||
|
|
||||||
Template::render("admin/role", context.into_json())
|
|
||||||
}
|
|
||||||
#[derive(FromForm)]
|
|
||||||
pub struct RoleToUpdate<'r> {
|
|
||||||
pub formatted_name: &'r str,
|
|
||||||
pub desc: &'r str,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[post("/role/<role_id>", data = "<data>")]
|
|
||||||
async fn update(
|
|
||||||
db: &State<SqlitePool>,
|
|
||||||
data: Form<RoleToUpdate<'_>>,
|
|
||||||
role_id: i32,
|
|
||||||
admin: AdminUser,
|
|
||||||
) -> Flash<Redirect> {
|
|
||||||
let role = Role::find_by_id(db, role_id).await;
|
|
||||||
let Some(role) = role else {
|
|
||||||
return Flash::error(Redirect::to("/admin/role"), "Role does not exist!");
|
|
||||||
};
|
|
||||||
|
|
||||||
match role
|
|
||||||
.update(db, &admin, &data.formatted_name, &data.desc)
|
|
||||||
.await
|
|
||||||
{
|
|
||||||
Ok(_) => Flash::success(Redirect::to("/admin/role"), "Rolle bearbeitet"),
|
|
||||||
Err(e) => Flash::error(Redirect::to("/admin/role"), e),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn routes() -> Vec<Route> {
|
|
||||||
routes![index, update]
|
|
||||||
}
|
|
||||||
@@ -132,12 +132,6 @@ async fn view(
|
|||||||
format!("User mit ID {} gibts ned", user),
|
format!("User mit ID {} gibts ned", user),
|
||||||
));
|
));
|
||||||
};
|
};
|
||||||
if user.name == "Externe Steuerperson" {
|
|
||||||
return Err(Flash::error(
|
|
||||||
Redirect::to("/admin/user"),
|
|
||||||
"Diese besondere Person kannst du dir leider nicht anschauen, mein lieber neugieriger Ruderant!"
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let member = Member::from(db, user.clone()).await;
|
let member = Member::from(db, user.clone()).await;
|
||||||
let fee = user.fee(db).await;
|
let fee = user.fee(db).await;
|
||||||
@@ -292,7 +286,7 @@ async fn delete(db: &State<SqlitePool>, admin: ManageUserUser, user: i32) -> Fla
|
|||||||
Log::create(db, format!("{} deleted user: {user:?}", admin.user.name)).await;
|
Log::create(db, format!("{} deleted user: {user:?}", admin.user.name)).await;
|
||||||
match user {
|
match user {
|
||||||
Some(user) => {
|
Some(user) => {
|
||||||
user.delete(db, &admin).await;
|
user.delete(db).await;
|
||||||
Flash::success(
|
Flash::success(
|
||||||
Redirect::to("/admin/user"),
|
Redirect::to("/admin/user"),
|
||||||
format!("Benutzer {} gelöscht", user.name),
|
format!("Benutzer {} gelöscht", user.name),
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
use std::net::IpAddr;
|
use std::net::IpAddr;
|
||||||
|
|
||||||
use rocket::{
|
use rocket::{
|
||||||
|
Request, Route, State,
|
||||||
form::Form,
|
form::Form,
|
||||||
get,
|
get,
|
||||||
http::{Cookie, CookieJar},
|
http::{Cookie, CookieJar},
|
||||||
@@ -9,9 +10,8 @@ use rocket::{
|
|||||||
response::{Flash, Redirect},
|
response::{Flash, Redirect},
|
||||||
routes,
|
routes,
|
||||||
time::{Duration, OffsetDateTime},
|
time::{Duration, OffsetDateTime},
|
||||||
Request, Route, State,
|
|
||||||
};
|
};
|
||||||
use rocket_dyn_templates::{context, Template};
|
use rocket_dyn_templates::{Template, context};
|
||||||
use sqlx::SqlitePool;
|
use sqlx::SqlitePool;
|
||||||
use tera::Context;
|
use tera::Context;
|
||||||
|
|
||||||
@@ -110,13 +110,10 @@ async fn index(
|
|||||||
#[get("/show", rank = 3)]
|
#[get("/show", rank = 3)]
|
||||||
async fn show(db: &State<SqlitePool>, user: DonauLinzUser) -> Template {
|
async fn show(db: &State<SqlitePool>, user: DonauLinzUser) -> Template {
|
||||||
let logs = Logbook::completed(db).await;
|
let logs = Logbook::completed(db).await;
|
||||||
let boats = Boat::all(db).await;
|
|
||||||
let users = User::all(db).await;
|
|
||||||
let logtypes = LogType::all(db).await;
|
|
||||||
|
|
||||||
Template::render(
|
Template::render(
|
||||||
"log.completed",
|
"log.completed",
|
||||||
context!(logs, boats, users, logtypes, loggedin_user: &UserWithDetails::from_user(user.into_inner(), db).await),
|
context!(logs, loggedin_user: &UserWithDetails::from_user(user.into_inner(), db).await),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -585,7 +582,7 @@ mod test {
|
|||||||
use sqlx::SqlitePool;
|
use sqlx::SqlitePool;
|
||||||
|
|
||||||
use crate::model::logbook::Logbook;
|
use crate::model::logbook::Logbook;
|
||||||
use crate::tera::{log::Boat, User};
|
use crate::tera::{User, log::Boat};
|
||||||
use crate::testdb;
|
use crate::testdb;
|
||||||
|
|
||||||
#[sqlx::test]
|
#[sqlx::test]
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
{% import "includes/macros" as macros %}
|
|
||||||
{% import "includes/forms/boat" as boat %}
|
|
||||||
{% extends "base" %}
|
|
||||||
{% block content %}
|
|
||||||
<div class="max-w-screen-lg w-full dark:text-white">
|
|
||||||
<h1 class="h1">Rolle</h1>
|
|
||||||
<div class="grid ">
|
|
||||||
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5"
|
|
||||||
role="alert">
|
|
||||||
<h2 class="h2">Rolle</h2>
|
|
||||||
{% for role in roles %}
|
|
||||||
<div data-filterable="true"
|
|
||||||
data-filter="{{ role.name }}"
|
|
||||||
class="w-full border-t">
|
|
||||||
<form action="/admin/role/{{ role.id }}"
|
|
||||||
data-filterable="true"
|
|
||||||
method="post"
|
|
||||||
class="bg-white dark:bg-primary-900 p-4 w-full">
|
|
||||||
<div class="w-full">
|
|
||||||
<input type="hidden" name="id" value="{{ role.id }}" />
|
|
||||||
<div class="font-bold mb-1 text-black dark:text-white">
|
|
||||||
{{ role.name }}
|
|
||||||
<br />
|
|
||||||
</div>
|
|
||||||
<div class="grid md:grid-cols-3 gap-3">
|
|
||||||
{{ macros::input(label='Formatierter Name', name='formatted_name', type='text', value=role.formatted_name) }}
|
|
||||||
{{ macros::input(label='Beschreibung', name='desc', type='text', value=role.desc) }}
|
|
||||||
<input value="Ändern" type="submit" class="w-28 btn btn-primary" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock content %}
|
|
||||||
@@ -8,38 +8,8 @@
|
|||||||
<summary class="px-3 cursor-pointer text-md font-bold text-primary-950 dark:text-white">
|
<summary class="px-3 cursor-pointer text-md font-bold text-primary-950 dark:text-white">
|
||||||
Neue Person hinzufügen
|
Neue Person hinzufügen
|
||||||
</summary>
|
</summary>
|
||||||
|
<details class="mt-5 bg-gray-200 dark:bg-primary-600 p-3 rounded-md">
|
||||||
<div class="grid sm:grid-cols-3 gap-3 mt-3">
|
<summary class="px-3 cursor-pointer text-md font-bold text-primary-950 dark:text-white">Vereinsmitglied</summary>
|
||||||
<button type="button"
|
|
||||||
onclick="document.getElementById('add-clubuser').showModal()"
|
|
||||||
class="btn btn-primary">Vereinsmitglied</button>
|
|
||||||
<button type="button"
|
|
||||||
onclick="document.getElementById('add-scheckbuch').showModal()"
|
|
||||||
class="btn btn-dark">Scheckbuch</button>
|
|
||||||
<button type="button"
|
|
||||||
onclick="document.getElementById('add-schnupperkurs').showModal()"
|
|
||||||
class="btn btn-dark">Schnupperkurs</button>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<dialog id="add-clubuser"
|
|
||||||
class="max-w-screen-sm w-full dark:bg-primary-900 dark:text-white rounded-md"
|
|
||||||
onclick="document.getElementById('add-clubuser').close()">
|
|
||||||
<div onclick="event.stopPropagation();" class="p-3">
|
|
||||||
<button type="button"
|
|
||||||
onclick="document.getElementById('add-clubuser').close()"
|
|
||||||
title="Schließen"
|
|
||||||
class="sidebar-close border-0 bg-primary-100 focus:bg-primary-50 text-black flex items-center justify-center transform rotate-45 absolute right-0 mr-3">
|
|
||||||
<svg class="inline h-5 w-5"
|
|
||||||
width="16"
|
|
||||||
height="16"
|
|
||||||
fill="currentColor"
|
|
||||||
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"></path>
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
<div class="mt-8">
|
|
||||||
<h2 class="h3 mb-3">Neues Vereinsmitglied</h2>
|
|
||||||
<form action="/admin/user/new/clubmember"
|
<form action="/admin/user/new/clubmember"
|
||||||
method="post"
|
method="post"
|
||||||
enctype="multipart/form-data"
|
enctype="multipart/form-data"
|
||||||
@@ -53,7 +23,7 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
{{ macros::input(label='Name', name='name', type="text", required=true) }}
|
{{ macros::input(label='Name', name='name', type="text", required=true) }}
|
||||||
{{ macros::input(label='Mailadresse', name='mail', type="email", required=true, placeholder='user@mail.at') }}
|
{{ macros::input(label='Mailadresse', name='mail', type="email", required=true) }}
|
||||||
{{ macros::select(label="Finanzielles", data=financial, name='financial_id', display=['name'], default="Keine Ermäßigung") }}
|
{{ macros::select(label="Finanzielles", data=financial, name='financial_id', display=['name'], default="Keine Ermäßigung") }}
|
||||||
{{ macros::input(label='Mitglied seit', name='member_since', type="date", value=now() | date(), required=true) }}
|
{{ macros::input(label='Mitglied seit', name='member_since', type="date", value=now() | date(), required=true) }}
|
||||||
{{ macros::input(label='Geburtsdatum', name='birthdate', type="date", required=true) }}
|
{{ macros::input(label='Geburtsdatum', name='birthdate', type="date", required=true) }}
|
||||||
@@ -64,65 +34,26 @@
|
|||||||
type="submit"
|
type="submit"
|
||||||
class="btn btn-primary" />
|
class="btn btn-primary" />
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</details>
|
||||||
</div>
|
<details class="mt-5 bg-gray-200 dark:bg-primary-600 p-3 rounded-md">
|
||||||
</dialog>
|
<summary class="px-3 cursor-pointer text-md font-bold text-primary-950 dark:text-white">Scheckbuch</summary>
|
||||||
|
|
||||||
<dialog id="add-scheckbuch"
|
|
||||||
class="max-w-screen-sm w-full dark:bg-primary-900 dark:text-white rounded-md"
|
|
||||||
onclick="document.getElementById('add-scheckbuch').close()">
|
|
||||||
<div onclick="event.stopPropagation();" class="p-3">
|
|
||||||
<button type="button"
|
|
||||||
onclick="document.getElementById('add-scheckbuch').close()"
|
|
||||||
title="Schließen"
|
|
||||||
class="sidebar-close border-0 bg-primary-100 focus:bg-primary-50 text-black flex items-center justify-center transform rotate-45 absolute right-0 mr-3">
|
|
||||||
<svg class="inline h-5 w-5"
|
|
||||||
width="16"
|
|
||||||
height="16"
|
|
||||||
fill="currentColor"
|
|
||||||
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"></path>
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
<div class="mt-8">
|
|
||||||
<h2 class="h3 mb-3">Neues Scheckbuch</h2>
|
|
||||||
<form action="/admin/user/new/scheckbuch"
|
<form action="/admin/user/new/scheckbuch"
|
||||||
method="post"
|
method="post"
|
||||||
enctype="multipart/form-data"
|
enctype="multipart/form-data"
|
||||||
class="grid gap-3">
|
class="grid gap-3">
|
||||||
{{ macros::input(label='Name', name='name', type="text", required=true) }}
|
{{ macros::input(label='Name', name='name', type="text", required=true) }}
|
||||||
{{ macros::input(label='Mailadresse', name='mail', type="email", required=true, placeholder='user@mail.at') }}
|
{{ macros::input(label='Mailadresse', name='mail', type="email", required=true) }}
|
||||||
<input value="Neues Scheckbuch anlegen"
|
<input value="Neues Scheckbuch anlegen"
|
||||||
type="submit"
|
type="submit"
|
||||||
class="btn btn-primary" />
|
class="btn btn-primary" />
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</details>
|
||||||
</div>
|
<details class="mt-5 bg-gray-200 dark:bg-primary-600 p-3 rounded-md">
|
||||||
</dialog>
|
<summary class="px-3 cursor-pointer text-md font-bold text-primary-950 dark:text-white">Schnupperkurs</summary>
|
||||||
|
|
||||||
<dialog id="add-schnupperkurs"
|
|
||||||
class="max-w-screen-sm w-full dark:bg-primary-900 dark:text-white rounded-md"
|
|
||||||
onclick="document.getElementById('add-schnupperkurs').close()">
|
|
||||||
<div onclick="event.stopPropagation();" class="p-3">
|
|
||||||
<button type="button"
|
|
||||||
onclick="document.getElementById('add-schnupperkurs').close()"
|
|
||||||
title="Schließen"
|
|
||||||
class="sidebar-close border-0 bg-primary-100 focus:bg-primary-50 text-black flex items-center justify-center transform rotate-45 absolute right-0 mr-3">
|
|
||||||
<svg class="inline h-5 w-5"
|
|
||||||
width="16"
|
|
||||||
height="16"
|
|
||||||
fill="currentColor"
|
|
||||||
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"></path>
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
<div class="mt-8">
|
|
||||||
<form action="/admin/user/new/schnupper"
|
<form action="/admin/user/new/schnupper"
|
||||||
method="post"
|
method="post"
|
||||||
enctype="multipart/form-data"
|
enctype="multipart/form-data"
|
||||||
class="grid gap-3">
|
class="grid gap-3">
|
||||||
<h2 class="h3 mb-3">Neuer Schnupperant</h2>
|
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label for="schnupper_type" class="text-sm text-gray-600 dark:text-gray-100">Typ</label>
|
<label for="schnupper_type" class="text-sm text-gray-600 dark:text-gray-100">Typ</label>
|
||||||
<select name="schnupper_type" id="schnupper_type" class="input rounded-md ">
|
<select name="schnupper_type" id="schnupper_type" class="input rounded-md ">
|
||||||
@@ -131,13 +62,11 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
{{ macros::input(label='Name', name='name', type="text", required=true) }}
|
{{ macros::input(label='Name', name='name', type="text", required=true) }}
|
||||||
{{ macros::input(label='Mailadresse', name='mail', type="email", required=true, placeholder='user@mail.at') }}
|
{{ macros::input(label='Mailadresse', name='mail', type="email", required=true) }}
|
||||||
{{ macros::select(label="Finanzielles", data=financial, name='financial_id', display=['name'], default="Keine Ermäßigung") }}
|
{{ macros::select(label="Finanzielles", data=financial, name='financial_id', display=['name'], default="Keine Ermäßigung") }}
|
||||||
<input value="Hinzufügen" type="submit" class="btn btn-primary" />
|
<input value="Hinzufügen" type="submit" class="btn btn-primary" />
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</details>
|
||||||
</div>
|
|
||||||
</dialog>
|
|
||||||
</details>
|
</details>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<!-- START filterBar -->
|
<!-- START filterBar -->
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
<a href="/admin/user" class="link link-primary link-no-underline">← Userverwaltung</a>
|
<a href="/admin/user" class="link link-primary link-no-underline">← Userverwaltung</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<h1 class="h1">{{ user.name }}</h1>
|
<h1 class="h1">{{ user.name }}</h1>
|
||||||
<div class="grid sm:grid-cols-2 gap-8 my-8">
|
<div class="grid sm:grid-cols-2 gap-3">
|
||||||
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow">
|
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5">
|
||||||
<h2 class="h2">
|
<h2 class="h2">
|
||||||
Grunddaten
|
Grunddaten
|
||||||
<br />
|
<br />
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow">
|
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5">
|
||||||
<h2 class="h2">
|
<h2 class="h2">
|
||||||
Mitgliedschaft
|
Mitgliedschaft
|
||||||
<br />
|
<br />
|
||||||
@@ -132,7 +132,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<dialog id="change-member-type"
|
<dialog id="change-member-type"
|
||||||
class="max-w-screen-sm w-full dark:bg-primary-900 dark:text-white rounded-md"
|
class="max-w-screen-sm w-full dark:bg-primary-600 dark:text-white rounded-md"
|
||||||
onclick="document.getElementById('change-member-type').close()">
|
onclick="document.getElementById('change-member-type').close()">
|
||||||
<div onclick="event.stopPropagation();" class="p-3">
|
<div onclick="event.stopPropagation();" class="p-3">
|
||||||
<button type="button"
|
<button type="button"
|
||||||
@@ -235,7 +235,7 @@
|
|||||||
class="btn btn-primary">Zu Vereinsmitglied umwandeln</button>
|
class="btn btn-primary">Zu Vereinsmitglied umwandeln</button>
|
||||||
</div>
|
</div>
|
||||||
<dialog id="call-for-action"
|
<dialog id="call-for-action"
|
||||||
class="max-w-screen-sm w-full dark:bg-primary-900 dark:text-white rounded-md"
|
class="max-w-screen-sm w-full dark:bg-primary-600 dark:text-white rounded-md"
|
||||||
onclick="document.getElementById('call-for-action').close()">
|
onclick="document.getElementById('call-for-action').close()">
|
||||||
<div onclick="event.stopPropagation();" class="p-3">
|
<div onclick="event.stopPropagation();" class="p-3">
|
||||||
<button type="button"
|
<button type="button"
|
||||||
@@ -285,7 +285,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% if is_clubmember %}
|
{% if is_clubmember %}
|
||||||
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow">
|
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5">
|
||||||
<h2 class="h2">Rollen</h2>
|
<h2 class="h2">Rollen</h2>
|
||||||
<div>
|
<div>
|
||||||
<ul class="divide-y divide-gray-200 dark:divide-primary-60 w-full">
|
<ul class="divide-y divide-gray-200 dark:divide-primary-60 w-full">
|
||||||
@@ -318,7 +318,7 @@
|
|||||||
class="btn btn-primary w-full">Rolle hinzufügen</button>
|
class="btn btn-primary w-full">Rolle hinzufügen</button>
|
||||||
</div>
|
</div>
|
||||||
<dialog id="role-modal"
|
<dialog id="role-modal"
|
||||||
class="max-w-screen-sm w-full dark:bg-primary-900 dark:text-white rounded-md"
|
class="max-w-screen-sm w-full dark:bg-primary-600 dark:text-white rounded-md"
|
||||||
onclick="document.getElementById('role-modal').close()">
|
onclick="document.getElementById('role-modal').close()">
|
||||||
<div onclick="event.stopPropagation();" class="p-3">
|
<div onclick="event.stopPropagation();" class="p-3">
|
||||||
<button type="button"
|
<button type="button"
|
||||||
@@ -363,7 +363,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if supposed_to_pay %}
|
{% if supposed_to_pay %}
|
||||||
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow">
|
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5">
|
||||||
<h2 class="h2">💸-Beitrag</h2>
|
<h2 class="h2">💸-Beitrag</h2>
|
||||||
<div class="mx-3 divide-y divide-gray-200 dark:divide-primary-600">
|
<div class="mx-3 divide-y divide-gray-200 dark:divide-primary-600">
|
||||||
<div class="py-3">
|
<div class="py-3">
|
||||||
@@ -400,7 +400,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow">
|
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5">
|
||||||
<h2 class="h2">Aktivitäten</h2>
|
<h2 class="h2">Aktivitäten</h2>
|
||||||
<div class="mx-3 divide-y divide-gray-200 dark:divide-primary-600">
|
<div class="mx-3 divide-y divide-gray-200 dark:divide-primary-600">
|
||||||
<div class="py-3">
|
<div class="py-3">
|
||||||
@@ -414,13 +414,13 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow">
|
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5">
|
||||||
<h2 class="h2">Ergo-Challenge</h2>
|
<h2 class="h2">Ergo-Challenge</h2>
|
||||||
<div class="mx-3">
|
<div class="mx-3 divide-y divide-gray-200 dark:divide-primary-600">
|
||||||
<div class="grid gap-3 pb-3 mt-3">
|
<div class="py-3">
|
||||||
{{ macros::inputgroup(label='DOB', name='dob', type="text", value=user.dob, readonly=allowed_to_edit == false) }}
|
{{ macros::input(label='DOB', name='dob', type="text", value=user.dob, readonly=allowed_to_edit == false) }}
|
||||||
{{ macros::inputgroup(label='Weight (kg)', name='weight', type="text", value=user.weight, readonly=allowed_to_edit == false) }}
|
{{ macros::input(label='Weight (kg)', name='weight', type="text", value=user.weight, readonly=allowed_to_edit == false) }}
|
||||||
{{ macros::inputgroup(label='Sex', name='sex', type="text", value=user.sex, readonly=allowed_to_edit == false) }}
|
{{ macros::input(label='Sex', name='sex', type="text", value=user.sex, readonly=allowed_to_edit == false) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -183,6 +183,8 @@
|
|||||||
<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-filterable="true"
|
||||||
data-filter="{{ log.boat.name }} {% for rower in log.rowers %}{{ rower.name }}{% endfor %}">
|
data-filter="{{ log.boat.name }} {% for rower in log.rowers %}{{ rower.name }}{% endfor %}">
|
||||||
|
<details>
|
||||||
|
<summary style="list-style: none;">
|
||||||
{% if log.logtype and not hide_type %}
|
{% if log.logtype and not hide_type %}
|
||||||
<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 %}
|
||||||
@@ -197,15 +199,7 @@
|
|||||||
</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 %}>
|
||||||
{% if allowed_to_edit %}
|
<strong class="text-black dark:text-white">{{ log.boat.name }}</strong>
|
||||||
<a href="#"
|
|
||||||
onclick="document.getElementById('change-{{ log.id }}').showModal()"
|
|
||||||
class="link link-black font-bold">{{ log.boat.name }}</a>
|
|
||||||
{% else %}
|
|
||||||
<strong class="text-black dark:text-white">
|
|
||||||
{{ log.boat.name }}
|
|
||||||
</strong>
|
|
||||||
{% endif %}
|
|
||||||
<small class="text-gray-600 dark:text-gray-100">({{ log.shipmaster_user.name -}}
|
<small class="text-gray-600 dark:text-gray-100">({{ log.shipmaster_user.name -}}
|
||||||
{% if log.shipmaster_only_steering %}
|
{% if log.shipmaster_only_steering %}
|
||||||
- handgesteuert
|
- handgesteuert
|
||||||
@@ -258,65 +252,35 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
</summary>
|
||||||
{% if allowed_to_edit %}
|
{% if allowed_to_edit %}
|
||||||
<dialog id="change-{{ log.id }}"
|
<form action="/log/update" method="post">
|
||||||
class="max-w-screen-sm w-full dark:bg-primary-900 dark:text-white rounded-md"
|
|
||||||
onclick="document.getElementById('change-{{ log.id }}').close()">
|
|
||||||
<div onclick="event.stopPropagation();" class="p-3">
|
|
||||||
<button type="button"
|
|
||||||
onclick="document.getElementById('change-{{ log.id }}').close()"
|
|
||||||
title="Schließen"
|
|
||||||
class="sidebar-close border-0 bg-primary-100 focus:bg-primary-50 text-black flex items-center justify-center transform rotate-45 absolute right-0 mr-3">
|
|
||||||
<svg class="inline h-5 w-5"
|
|
||||||
width="16"
|
|
||||||
height="16"
|
|
||||||
fill="currentColor"
|
|
||||||
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"></path>
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
<div class="mt-8">
|
|
||||||
<h2 class="h3">Eintrag '{{ log.boat.name }}' ändern </h2>
|
|
||||||
<p class="text-center mb-3">ID: {{ log.id }}</p>
|
|
||||||
<form action="/log/update" method="post" class="grid gap-3">
|
|
||||||
<input type="hidden" name="id" value="{{ log.id }}" />
|
<input type="hidden" name="id" value="{{ log.id }}" />
|
||||||
|
<input type="hidden" name="boat_id" value="{{ log.boat_id }}" />
|
||||||
|
<input type="hidden" name="shipmaster" value="{{ log.shipmaster }}" />
|
||||||
<input type="hidden"
|
<input type="hidden"
|
||||||
name="steering_person"
|
name="steering_person"
|
||||||
value="{{ log.steering_person }}" />
|
value="{{ log.steering_person }}" />
|
||||||
{{ macros::select(label="Boot", data=boats, name="boat_id", id="boat_id{{ log.id }}", selected_id=log.boat.id ,display=["name", " (","amount_seats", " x)"]) }}
|
Handgesteuert:
|
||||||
{{ macros::select(label="Schiffsführer", data=log.rowers, name="shipmaster", id="shipmaster{{ log.id }}", selected_id=log.shipmaster_user.id) }}
|
<input type="checkbox"
|
||||||
|
name="shipmaster_only_steering"
|
||||||
|
{% if log.shipmaster_only_steering %}checked="checked"{% endif %} />
|
||||||
{{ macros::checkbox(label='Handgesteuert', name='shipmaster_only_steering', id=log.shipmaster_only_steering,checked=log.shipmaster_only_steering) }}
|
<input type="datetime-local" name="departure" value="{{ log.departure }}" />
|
||||||
<div>
|
<input type="datetime-local" name="arrival" value="{{ log.arrival }}" />
|
||||||
<label for="departure" class=" text-sm text-gray-600 dark:text-white ">
|
|
||||||
Abfahrt
|
|
||||||
</label>
|
|
||||||
<input type="datetime-local" class="input rounded-md" name="departure" value="{{ log.departure }}" />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label for="arrival" class=" text-sm text-gray-600 dark:text-white ">
|
|
||||||
Ankunft
|
|
||||||
</label>
|
|
||||||
<input type="datetime-local" class="input rounded-md" name="arrival" value="{{ log.arrival }}" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<input type="hidden" name="destination" value="{{ log.destination }}" />
|
<input type="hidden" name="destination" value="{{ log.destination }}" />
|
||||||
<input type="hidden" name="distance_in_km" value="{{ log.distance_in_km }}" />
|
<input type="hidden" name="distance_in_km" value="{{ log.distance_in_km }}" />
|
||||||
<input type="hidden" name="comments" value="{{ log.comments }}" />
|
<input type="hidden" name="comments" value="{{ log.comments }}" />
|
||||||
<input type="hidden" name="logtype" value="{{ log.logtype }}" />
|
<input type="hidden" name="logtype" value="{{ log.logtype }}" />
|
||||||
<input type="submit" class="btn btn-primary" value="Updaten" />
|
<input type="submit" value="Updaten" />
|
||||||
</form>
|
</form>
|
||||||
<a href="/log/{{ log.id }}/delete"
|
<a href="/log/{{ log.id }}/delete"
|
||||||
class="w-28 btn btn-alert mt-3"
|
class="w-28 btn btn-alert"
|
||||||
onclick="return confirm('Willst du diesen Logbucheintrag wirklich löschen?');">
|
onclick="return confirm('Willst du diesen Logbucheintrag wirklich löschen?');">
|
||||||
{% include "includes/delete-icon" %}
|
{% include "includes/delete-icon" %}
|
||||||
Löschen
|
Löschen
|
||||||
</a>
|
</a>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</dialog>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
</details>
|
||||||
</div>
|
</div>
|
||||||
{% endmacro show_old %}
|
{% endmacro show_old %}
|
||||||
{% macro home(log) %}
|
{% macro home(log) %}
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ function setChoiceByLabel(choicesInstance, label) {
|
|||||||
</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, accept='', placeholder='') %}
|
{% macro input(label, name, type, required=false, class='rounded-md', value='', min='', hide_label=false, id='', autofocus=false, wrapper_class='', pattern='', readonly=false, accept='') %}
|
||||||
<div class="{{ wrapper_class }}">
|
<div class="{{ wrapper_class }}">
|
||||||
<label for="{{ name }}"
|
<label for="{{ name }}"
|
||||||
class="{% if hide_label %} sr-only {% else %} text-sm text-gray-600 dark:text-white {% endif %}">
|
class="{% if hide_label %} sr-only {% else %} text-sm text-gray-600 dark:text-white {% endif %}">
|
||||||
@@ -169,7 +169,7 @@ function setChoiceByLabel(choicesInstance, label) {
|
|||||||
{% if required %}required{% endif %}
|
{% if required %}required{% endif %}
|
||||||
value="{{ value }}"
|
value="{{ value }}"
|
||||||
class="input {{ class }}"
|
class="input {{ class }}"
|
||||||
placeholder="{% if hide_label %}{{ label }}{% endif %}{% if placeholder %}{{ placeholder }}{% endif %}"
|
placeholder="{% if hide_label %}{{ label }}{% endif %}"
|
||||||
{% if min is defined %}min="{{ min }}"{% endif %}
|
{% if min is defined %}min="{{ min }}"{% endif %}
|
||||||
{% if autofocus %}autofocus{% endif %}
|
{% if autofocus %}autofocus{% endif %}
|
||||||
{% if accept %}accept="{{ accept }}"{% endif %}
|
{% if accept %}accept="{{ accept }}"{% endif %}
|
||||||
|
|||||||
@@ -431,9 +431,6 @@
|
|||||||
<li class="py-1">
|
<li class="py-1">
|
||||||
<a href="/admin/rss" class="block w-100 py-2 hover:text-primary-600">Logs</a>
|
<a href="/admin/rss" class="block w-100 py-2 hover:text-primary-600">Logs</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="py-1">
|
|
||||||
<a href="/admin/role" class="block w-100 py-2 hover:text-primary-600">Rollen</a>
|
|
||||||
</li>
|
|
||||||
<li class="py-1">
|
<li class="py-1">
|
||||||
<a href="/admin/list" class="block w-100 py-2 hover:text-primary-600">Fingerabdruck-Liste überprüfen</a>
|
<a href="/admin/list" class="block w-100 py-2 hover:text-primary-600">Fingerabdruck-Liste überprüfen</a>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
Reference in New Issue
Block a user