Compare commits
3 Commits
6833887254
...
465d6b0f0a
Author | SHA1 | Date | |
---|---|---|---|
465d6b0f0a | |||
4d1ffa206c | |||
44c6cddf52 |
@ -19,6 +19,8 @@ FROM
|
|||||||
assignment
|
assignment
|
||||||
JOIN availability ON
|
JOIN availability ON
|
||||||
assignment.availabilityid = availability.id
|
assignment.availabilityid = availability.id
|
||||||
|
JOIN user_ ON
|
||||||
|
availability.userId = user_.id
|
||||||
JOIN event ON
|
JOIN event ON
|
||||||
assignment.eventid = "event".id
|
assignment.eventid = "event".id
|
||||||
JOIN location ON
|
JOIN location ON
|
||||||
@ -26,9 +28,9 @@ JOIN location ON
|
|||||||
JOIN clothing ON
|
JOIN clothing ON
|
||||||
event.clothing = clothing.id
|
event.clothing = clothing.id
|
||||||
WHERE
|
WHERE
|
||||||
userid = $1
|
(userid = $1 OR user_.areaId = $2)
|
||||||
AND event.starttimestamp::date >= $2
|
AND event.starttimestamp::date >= $3
|
||||||
AND event.starttimestamp::date <= $3
|
AND event.starttimestamp::date <= $4
|
||||||
AND location.areaId != $4
|
AND location.areaId != $5
|
||||||
ORDER BY
|
ORDER BY
|
||||||
event.starttimestamp;
|
event.starttimestamp;
|
||||||
|
@ -49,9 +49,12 @@ LEFT JOIN ASSIGNMENT ON
|
|||||||
event.id = assignment.eventid
|
event.id = assignment.eventid
|
||||||
LEFT JOIN availability ON
|
LEFT JOIN availability ON
|
||||||
assignment.availabilityid = availability.id
|
assignment.availabilityid = availability.id
|
||||||
|
LEFT JOIN user_ ON
|
||||||
|
availability.userId = user_.id
|
||||||
WHERE
|
WHERE
|
||||||
event.starttimestamp::date = $1
|
event.starttimestamp::date = $1
|
||||||
AND (
|
AND (
|
||||||
location.areaId = $2
|
location.areaId = $2
|
||||||
OR availability.userId = $3
|
OR availability.userId = $3
|
||||||
|
OR user_.areaId = $4
|
||||||
)
|
)
|
||||||
|
20
db/sql/user/read_by_availability_id.sql
Normal file
20
db/sql/user/read_by_availability_id.sql
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
SELECT
|
||||||
|
user_.id,
|
||||||
|
name,
|
||||||
|
email,
|
||||||
|
password,
|
||||||
|
salt,
|
||||||
|
role AS "role: Role",
|
||||||
|
function AS "function: UserFunction",
|
||||||
|
areaId,
|
||||||
|
locked,
|
||||||
|
lastLogin,
|
||||||
|
receiveNotifications
|
||||||
|
FROM
|
||||||
|
user_,
|
||||||
|
availability
|
||||||
|
WHERE
|
||||||
|
availability.id = $1
|
||||||
|
AND availability.userId = user_.id
|
||||||
|
ORDER BY
|
||||||
|
id;
|
@ -168,10 +168,12 @@ impl Event {
|
|||||||
date_range: (&NaiveDate, &NaiveDate),
|
date_range: (&NaiveDate, &NaiveDate),
|
||||||
user_id: i32,
|
user_id: i32,
|
||||||
area_to_ignore: i32,
|
area_to_ignore: i32,
|
||||||
|
area_for_which_user_is_manager: Option<i32>,
|
||||||
) -> Result<Vec<Event>> {
|
) -> Result<Vec<Event>> {
|
||||||
let records = query_file!(
|
let records = query_file!(
|
||||||
"sql/event/read_all_by_date_range_and_assigned_user_in_other_area.sql",
|
"sql/event/read_all_by_date_range_and_assigned_user_in_other_area.sql",
|
||||||
user_id,
|
user_id,
|
||||||
|
area_for_which_user_is_manager,
|
||||||
date_range.0,
|
date_range.0,
|
||||||
date_range.1,
|
date_range.1,
|
||||||
area_to_ignore
|
area_to_ignore
|
||||||
|
@ -15,12 +15,14 @@ impl EventForCalendar {
|
|||||||
date: &NaiveDate,
|
date: &NaiveDate,
|
||||||
area: i32,
|
area: i32,
|
||||||
user: i32,
|
user: i32,
|
||||||
|
area_for_which_user_is_manager: Option<i32>,
|
||||||
) -> Result<Vec<EventForCalendar>> {
|
) -> Result<Vec<EventForCalendar>> {
|
||||||
let records = query_file!(
|
let records = query_file!(
|
||||||
"sql/event_for_calendar/read_all_by_date_and_area_and_user.sql",
|
"sql/event_for_calendar/read_all_by_date_and_area_and_user.sql",
|
||||||
date,
|
date,
|
||||||
area,
|
area,
|
||||||
user
|
user,
|
||||||
|
area_for_which_user_is_manager
|
||||||
)
|
)
|
||||||
.fetch_all(pool)
|
.fetch_all(pool)
|
||||||
.await?;
|
.await?;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use chrono::{DateTime, Utc};
|
use chrono::{DateTime, Utc};
|
||||||
use sqlx::PgPool;
|
use sqlx::{PgPool, query_file};
|
||||||
|
|
||||||
use super::{Area, Function, Result, Role, UserChangeset, UserFunction};
|
use super::{Area, Function, Result, Role, UserChangeset, UserFunction};
|
||||||
|
|
||||||
@ -290,6 +290,32 @@ impl User {
|
|||||||
Ok(result)
|
Ok(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn read_by_availability_id(
|
||||||
|
pool: &PgPool,
|
||||||
|
availability_id: i32,
|
||||||
|
) -> Result<Option<User>> {
|
||||||
|
let record = query_file!("sql/user/read_by_availability_id.sql", availability_id)
|
||||||
|
.fetch_optional(pool)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let result = record.map(|r| User {
|
||||||
|
id: r.id,
|
||||||
|
name: r.name.clone(),
|
||||||
|
email: r.email.clone(),
|
||||||
|
password: r.password.clone(),
|
||||||
|
salt: r.salt.clone(),
|
||||||
|
role: r.role,
|
||||||
|
function: r.function.clone(),
|
||||||
|
area_id: r.areaid,
|
||||||
|
area: None,
|
||||||
|
locked: r.locked,
|
||||||
|
last_login: r.lastlogin,
|
||||||
|
receive_notifications: r.receivenotifications,
|
||||||
|
});
|
||||||
|
|
||||||
|
Ok(result)
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn update(pool: &PgPool, id: i32, changeset: UserChangeset) -> Result<()> {
|
pub async fn update(pool: &PgPool, id: i32, changeset: UserChangeset) -> Result<()> {
|
||||||
sqlx::query!(
|
sqlx::query!(
|
||||||
"UPDATE user_ SET name = $1, email = $2, role = $3, function = $4, areaId = $5 WHERE id = $6;",
|
"UPDATE user_ SET name = $1, email = $2, role = $3, function = $4, areaId = $5 WHERE id = $6;",
|
||||||
|
@ -8,7 +8,7 @@ snapshot_kind: text
|
|||||||
|
|
||||||
<form hx-post="/availability/new" hx-target="body"
|
<form hx-post="/availability/new" hx-target="body"
|
||||||
hx-target-422="#error">
|
hx-target-422="#error">
|
||||||
<h1 class="title">Neue Vefügbarkeit für Mittwoch, 01.01.2025</h1>
|
<h1 class="title">Neue Verfügbarkeit für Mittwoch, 01.01.2025</h1>
|
||||||
|
|
||||||
<input type="hidden" name="startdate" value="2025-01-01">
|
<input type="hidden" name="startdate" value="2025-01-01">
|
||||||
<input type="hidden" name="enddate" value="2025-01-01" id="enddate">
|
<input type="hidden" name="enddate" value="2025-01-01" id="enddate">
|
||||||
|
@ -4,6 +4,7 @@ use sqlx::PgPool;
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
endpoints::assignment::PlanEventPersonalTablePartialTemplate,
|
endpoints::assignment::PlanEventPersonalTablePartialTemplate,
|
||||||
|
mail::Mailer,
|
||||||
utils::{
|
utils::{
|
||||||
event_planning_template::{
|
event_planning_template::{
|
||||||
generate_availability_assignment_list, generate_status_whether_staff_is_required,
|
generate_availability_assignment_list, generate_status_whether_staff_is_required,
|
||||||
@ -24,6 +25,7 @@ pub async fn delete(
|
|||||||
user: web::ReqData<User>,
|
user: web::ReqData<User>,
|
||||||
pool: web::Data<PgPool>,
|
pool: web::Data<PgPool>,
|
||||||
query: web::Query<AssignmentDeleteQuery>,
|
query: web::Query<AssignmentDeleteQuery>,
|
||||||
|
mailer: web::Data<Mailer>,
|
||||||
) -> Result<impl Responder, ApplicationError> {
|
) -> Result<impl Responder, ApplicationError> {
|
||||||
let Some(event) = Event::read_by_id_including_location(pool.get_ref(), query.event).await?
|
let Some(event) = Event::read_by_id_including_location(pool.get_ref(), query.event).await?
|
||||||
else {
|
else {
|
||||||
@ -45,6 +47,16 @@ pub async fn delete(
|
|||||||
|
|
||||||
Assignment::delete(pool.get_ref(), event.id, assignment.availability_id).await?;
|
Assignment::delete(pool.get_ref(), event.id, assignment.availability_id).await?;
|
||||||
|
|
||||||
|
let user_of_availability =
|
||||||
|
User::read_by_availability_id(pool.get_ref(), assignment.availability_id)
|
||||||
|
.await?
|
||||||
|
.unwrap();
|
||||||
|
if user_of_availability.receive_notifications {
|
||||||
|
mailer
|
||||||
|
.send_assignment_deleted_mail(&user_of_availability, &assignment.function, &event)
|
||||||
|
.await?;
|
||||||
|
}
|
||||||
|
|
||||||
let availabilities = generate_availability_assignment_list(pool.get_ref(), &event).await?;
|
let availabilities = generate_availability_assignment_list(pool.get_ref(), &event).await?;
|
||||||
let (
|
let (
|
||||||
further_posten_required,
|
further_posten_required,
|
||||||
|
@ -4,6 +4,7 @@ use sqlx::PgPool;
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
endpoints::assignment::PlanEventPersonalTablePartialTemplate,
|
endpoints::assignment::PlanEventPersonalTablePartialTemplate,
|
||||||
|
mail::Mailer,
|
||||||
utils::{
|
utils::{
|
||||||
event_planning_template::{
|
event_planning_template::{
|
||||||
generate_availability_assignment_list, generate_status_whether_staff_is_required,
|
generate_availability_assignment_list, generate_status_whether_staff_is_required,
|
||||||
@ -29,6 +30,7 @@ pub async fn post(
|
|||||||
user: web::ReqData<User>,
|
user: web::ReqData<User>,
|
||||||
pool: web::Data<PgPool>,
|
pool: web::Data<PgPool>,
|
||||||
query: web::Query<AssignmentQuery>,
|
query: web::Query<AssignmentQuery>,
|
||||||
|
mailer: web::Data<Mailer>,
|
||||||
) -> Result<impl Responder, ApplicationError> {
|
) -> Result<impl Responder, ApplicationError> {
|
||||||
if user.role != Role::Admin && user.role != Role::AreaManager {
|
if user.role != Role::Admin && user.role != Role::AreaManager {
|
||||||
return Err(ApplicationError::Unauthorized);
|
return Err(ApplicationError::Unauthorized);
|
||||||
@ -59,6 +61,16 @@ pub async fn post(
|
|||||||
|
|
||||||
Assignment::create(pool.get_ref(), event.id, query.availability, changeset).await?;
|
Assignment::create(pool.get_ref(), event.id, query.availability, changeset).await?;
|
||||||
|
|
||||||
|
let user_of_availability =
|
||||||
|
User::read_by_availability_id(pool.get_ref(), context.availability_id)
|
||||||
|
.await?
|
||||||
|
.unwrap();
|
||||||
|
if user_of_availability.receive_notifications {
|
||||||
|
mailer
|
||||||
|
.send_assignment_created_mail(&user_of_availability, &function, &event)
|
||||||
|
.await?;
|
||||||
|
}
|
||||||
|
|
||||||
let availabilities = generate_availability_assignment_list(pool.get_ref(), &event).await?;
|
let availabilities = generate_availability_assignment_list(pool.get_ref(), &event).await?;
|
||||||
|
|
||||||
let (
|
let (
|
||||||
|
@ -67,20 +67,22 @@ async fn get(
|
|||||||
|
|
||||||
let availabilities_from_user =
|
let availabilities_from_user =
|
||||||
Availability::read_all_by_user_and_date(pool.get_ref(), user.id, &date).await?;
|
Availability::read_all_by_user_and_date(pool.get_ref(), user.id, &date).await?;
|
||||||
//println!("{availabilities_from_user:#?}");
|
|
||||||
|
|
||||||
let user_can_create_availability = availabilities_from_user.is_empty()
|
let user_can_create_availability = availabilities_from_user.is_empty()
|
||||||
|| !find_free_date_time_slots(&availabilities_from_user).is_empty();
|
|| !find_free_date_time_slots(&availabilities_from_user).is_empty();
|
||||||
|
|
||||||
//println!("{} || {} || {} = {user_can_create_availability}", availabilities_from_user.is_empty(),
|
let area_for_which_user_is_manager = if user.role == Role::Admin || user.role == Role::AreaManager {
|
||||||
// !only_one_availability_exists_and_is_whole_day(&availabilities_from_user),
|
Some(user.area_id)
|
||||||
// !find_free_time_slots(&availabilities_from_user).is_empty());
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
|
|
||||||
let events = EventForCalendar::read_all_by_date_and_area_and_user(
|
let events = EventForCalendar::read_all_by_date_and_area_and_user(
|
||||||
pool.get_ref(),
|
pool.get_ref(),
|
||||||
&date,
|
&date,
|
||||||
query.area.unwrap_or(user.area_id),
|
query.area.unwrap_or(user.area_id),
|
||||||
user.id,
|
user.id,
|
||||||
|
area_for_which_user_is_manager
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
|
@ -43,11 +43,18 @@ async fn get(
|
|||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
|
let area_for_which_user_is_manager = if user.role == Role::Admin || user.role == Role::AreaManager {
|
||||||
|
Some(user.area_id)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
|
|
||||||
let mut foreign_events = Event::read_all_by_date_range_and_assigned_user_in_other_area(
|
let mut foreign_events = Event::read_all_by_date_range_and_assigned_user_in_other_area(
|
||||||
pool.get_ref(),
|
pool.get_ref(),
|
||||||
date_range,
|
date_range,
|
||||||
user.id,
|
user.id,
|
||||||
user.area_id,
|
user.area_id,
|
||||||
|
area_for_which_user_is_manager
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use askama::Template;
|
use askama::Template;
|
||||||
use brass_db::models::{Assignment, Event, Function, User};
|
use brass_db::models::{Event, Function, User};
|
||||||
use lettre::{
|
use lettre::{
|
||||||
message::{Mailbox, MultiPart, SinglePart},
|
message::{Mailbox, MultiPart, SinglePart},
|
||||||
Address, AsyncTransport, Message,
|
Address, AsyncTransport, Message,
|
||||||
@ -10,7 +10,7 @@ use crate::{
|
|||||||
mail::Mailer,
|
mail::Mailer,
|
||||||
utils::{
|
utils::{
|
||||||
ApplicationError,
|
ApplicationError,
|
||||||
DateTimeFormat::{DayMonthYear, WeekdayDayMonthYear},
|
DateTimeFormat::{DayMonthYear, HourMinute, WeekdayDayMonthYear},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -18,14 +18,14 @@ impl Mailer {
|
|||||||
pub async fn send_assignment_created_mail(
|
pub async fn send_assignment_created_mail(
|
||||||
&self,
|
&self,
|
||||||
user: &User,
|
user: &User,
|
||||||
assignment: &Assignment,
|
assigned_function: &Function,
|
||||||
event: &Event,
|
event: &Event,
|
||||||
) -> Result<(), ApplicationError> {
|
) -> Result<(), ApplicationError> {
|
||||||
let message = build(
|
let message = build(
|
||||||
&self.hostname,
|
&self.hostname,
|
||||||
&user.name,
|
&user.name,
|
||||||
&user.email,
|
&user.email,
|
||||||
&assignment.function,
|
&assigned_function,
|
||||||
event,
|
event,
|
||||||
)?;
|
)?;
|
||||||
self.transport.send(message).await?;
|
self.transport.send(message).await?;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use askama::Template;
|
use askama::Template;
|
||||||
use brass_db::models::{Assignment, Event, Function, User};
|
use brass_db::models::{Event, Function, User};
|
||||||
use lettre::{
|
use lettre::{
|
||||||
message::{Mailbox, MultiPart, SinglePart},
|
message::{Mailbox, MultiPart, SinglePart},
|
||||||
Address, AsyncTransport, Message,
|
Address, AsyncTransport, Message,
|
||||||
@ -18,14 +18,14 @@ impl Mailer {
|
|||||||
pub async fn send_assignment_deleted_mail(
|
pub async fn send_assignment_deleted_mail(
|
||||||
&self,
|
&self,
|
||||||
user: &User,
|
user: &User,
|
||||||
assignment: &Assignment,
|
assigned_function: &Function,
|
||||||
event: &Event,
|
event: &Event,
|
||||||
) -> Result<(), ApplicationError> {
|
) -> Result<(), ApplicationError> {
|
||||||
let message = build(
|
let message = build(
|
||||||
&self.hostname,
|
&self.hostname,
|
||||||
&user.name,
|
&user.name,
|
||||||
&user.email,
|
&user.email,
|
||||||
&assignment.function,
|
&assigned_function,
|
||||||
event,
|
event,
|
||||||
)?;
|
)?;
|
||||||
self.transport.send(message).await?;
|
self.transport.send(message).await?;
|
||||||
|
@ -24,8 +24,8 @@ du wurdest soeben f=C3=BCr die Veranstaltung Wave Gotik Treffen am Sonntag,=
|
|||||||
Hier die Infos zur Veranstaltung:
|
Hier die Infos zur Veranstaltung:
|
||||||
- Name: Wave Gotik Treffen
|
- Name: Wave Gotik Treffen
|
||||||
- Ort: agra Messe Leipzig
|
- Ort: agra Messe Leipzig
|
||||||
- Beginn: 2025-06-01 18:30:00
|
- Beginn: 18:30 Uhr
|
||||||
- Ende: 2025-06-02 04:00:00
|
- Ende: 04:00 Uhr
|
||||||
- Kleidungsordnung: komplette PSA
|
- Kleidungsordnung: komplette PSA
|
||||||
- Anmerkungen: Anfahrt Bereitstellungsraum =C3=BCber xyz...
|
- Anmerkungen: Anfahrt Bereitstellungsraum =C3=BCber xyz...
|
||||||
|
|
||||||
@ -45,9 +45,9 @@ ag, 01.06.2025 als Posten eingeteilt.</p>
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Name: Wave Gotik Treffen</li>
|
<li>Name: Wave Gotik Treffen</li>
|
||||||
<li>- Ort: agra Messe Leipzig</li>
|
<li>Ort: agra Messe Leipzig</li>
|
||||||
<li>Beginn: 2025-06-01 18:30:00</li>
|
<li>Beginn: 18:30 Uhr</li>
|
||||||
<li>Ende: 2025-06-02 04:00:00</li>
|
<li>Ende: 04:00 Uhr</li>
|
||||||
<li>Kleidungsordnung: komplette PSA</li>
|
<li>Kleidungsordnung: komplette PSA</li>
|
||||||
<li>Anmerkungen: Anfahrt Bereitstellungsraum =C3=BCber xyz...</li>
|
<li>Anmerkungen: Anfahrt Bereitstellungsraum =C3=BCber xyz...</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
{% let is_edit = id.is_some() %}
|
{% let is_edit = id.is_some() %}
|
||||||
<form hx-post="/availability/{% if is_edit %}edit/{{ id.unwrap() }}{% else %}new{% endif %}" hx-target="body"
|
<form hx-post="/availability/{% if is_edit %}edit/{{ id.unwrap() }}{% else %}new{% endif %}" hx-target="body"
|
||||||
hx-target-422="#error">
|
hx-target-422="#error">
|
||||||
<h1 class="title">{% if is_edit %}Bearbeite{% else %}Neue{% endif %} Vefügbarkeit für {{
|
<h1 class="title">{% if is_edit %}Bearbeite{% else %}Neue{% endif %} Verfügbarkeit für {{
|
||||||
date|fmt_date(WeekdayDayMonthYear) }}</h1>
|
date|fmt_date(WeekdayDayMonthYear) }}</h1>
|
||||||
|
|
||||||
<input type="hidden" name="startdate" value="{{ date }}">
|
<input type="hidden" name="startdate" value="{{ date }}">
|
||||||
|
@ -274,12 +274,14 @@
|
|||||||
</div>
|
</div>
|
||||||
{% if selected_area.is_none() || selected_area.unwrap() == user.area_id %}
|
{% if selected_area.is_none() || selected_area.unwrap() == user.area_id %}
|
||||||
<div class="level-right">
|
<div class="level-right">
|
||||||
|
{% if user.role == Role::Admin || user.role == Role::AreaManager %}
|
||||||
<a class="button is-link is-outlined" href="/availability/new-other?date={{ date }}">
|
<a class="button is-link is-outlined" href="/availability/new-other?date={{ date }}">
|
||||||
<svg class="icon">
|
<svg class="icon">
|
||||||
<use href="/static/feather-sprite.svg#plus-circle" />
|
<use href="/static/feather-sprite.svg#plus-circle" />
|
||||||
</svg>
|
</svg>
|
||||||
<span>Neue Verfügbarkeit für anderen Nutzer</span>
|
<span>Neue Verfügbarkeit für anderen Nutzer</span>
|
||||||
</a>
|
</a>
|
||||||
|
{% endif %}
|
||||||
{% let btn_disabled = !user_can_create_availability %}
|
{% let btn_disabled = !user_can_create_availability %}
|
||||||
<a class="button is-link is-light" href="/availability/new?date={{ date }}" {{
|
<a class="button is-link is-light" href="/availability/new?date={{ date }}" {{
|
||||||
btn_disabled|cond_show("disabled") }}>
|
btn_disabled|cond_show("disabled") }}>
|
||||||
|
@ -6,9 +6,9 @@
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Name: {{ event.name }}</li>
|
<li>Name: {{ event.name }}</li>
|
||||||
<li>- Ort: {{ event.location.as_ref().unwrap().name }}</li>
|
<li>Ort: {{ event.location.as_ref().unwrap().name }}</li>
|
||||||
<li>Beginn: {{ event.start }}</li>
|
<li>Beginn: {{ event.start|fmt_datetime(HourMinute) }} Uhr</li>
|
||||||
<li>Ende: {{ event.end }}</li>
|
<li>Ende: {{ event.end|fmt_datetime(HourMinute) }} Uhr</li>
|
||||||
<li>Kleidungsordnung: {{ event.clothing.name }}</li>
|
<li>Kleidungsordnung: {{ event.clothing.name }}</li>
|
||||||
{% if let Some(note) = event.note %}<li>Anmerkungen: {{ note }}</li>{% endif %}
|
{% if let Some(note) = event.note %}<li>Anmerkungen: {{ note }}</li>{% endif %}
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -5,8 +5,8 @@ du wurdest soeben für die Veranstaltung {{ event.name }} am {{ event.start|fmt_
|
|||||||
Hier die Infos zur Veranstaltung:
|
Hier die Infos zur Veranstaltung:
|
||||||
- Name: {{ event.name }}
|
- Name: {{ event.name }}
|
||||||
- Ort: {{ event.location.as_ref().unwrap().name }}
|
- Ort: {{ event.location.as_ref().unwrap().name }}
|
||||||
- Beginn: {{ event.start }}
|
- Beginn: {{ event.start|fmt_datetime(HourMinute) }} Uhr
|
||||||
- Ende: {{ event.end }}
|
- Ende: {{ event.end|fmt_datetime(HourMinute) }} Uhr
|
||||||
- Kleidungsordnung: {{ event.clothing.name }}
|
- Kleidungsordnung: {{ event.clothing.name }}
|
||||||
{% if let Some(note) = event.note %}- Anmerkungen: {{ note }}{% endif %}
|
{% if let Some(note) = event.note %}- Anmerkungen: {{ note }}{% endif %}
|
||||||
|
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
<h5 class="title is-5">Bereich {{ gl.0.name }}</h5>
|
<h5 class="title is-5">Bereich {{ gl.0.name }}</h5>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{% if user.role == Role::Admin %}
|
||||||
<div class="level-item buttons are-small">
|
<div class="level-item buttons are-small">
|
||||||
<a class="button is-primary is-light" hx-boost="true" href="/area/edit/{{ gl.0.id }}">
|
<a class="button is-primary is-light" hx-boost="true" href="/area/edit/{{ gl.0.id }}">
|
||||||
<svg class="icon">
|
<svg class="icon">
|
||||||
@ -53,6 +54,7 @@
|
|||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user