feat: edit event
This commit is contained in:
parent
4a7ea8a760
commit
8688215f17
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"db_name": "PostgreSQL",
|
"db_name": "PostgreSQL",
|
||||||
"query": "SELECT * FROM vehicleAssignement WHERE vehicleAssignement.vehicleId = $1;",
|
"query": "\n SELECT\n vehicleAssignement.eventId,\n vehicleAssignement.vehicleId,\n vehicleAssignement.starttime,\n vehicleAssignement.endtime\n FROM vehicleAssignement\n JOIN event ON vehicleAssignement.eventId = event.id\n WHERE vehicleAssignement.vehicleid = $1\n AND event.date = $2;\n ",
|
||||||
"describe": {
|
"describe": {
|
||||||
"columns": [
|
"columns": [
|
||||||
{
|
{
|
||||||
@ -26,7 +26,8 @@
|
|||||||
],
|
],
|
||||||
"parameters": {
|
"parameters": {
|
||||||
"Left": [
|
"Left": [
|
||||||
"Int4"
|
"Int4",
|
||||||
|
"Date"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"nullable": [
|
"nullable": [
|
||||||
@ -36,5 +37,5 @@
|
|||||||
false
|
false
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"hash": "8897efc635987bca2c2d1a85e001c909404ad2356fc63872fdae5a0cf76e7099"
|
"hash": "b1e9b2e1aa8dec495988ff040e87db032124ad921ebf473ca95da85d7537ade4"
|
||||||
}
|
}
|
@ -1,32 +0,0 @@
|
|||||||
{
|
|
||||||
"db_name": "PostgreSQL",
|
|
||||||
"query": "\n SELECT *\n FROM vehicle\n\n ;",
|
|
||||||
"describe": {
|
|
||||||
"columns": [
|
|
||||||
{
|
|
||||||
"ordinal": 0,
|
|
||||||
"name": "id",
|
|
||||||
"type_info": "Int4"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ordinal": 1,
|
|
||||||
"name": "radiocallname",
|
|
||||||
"type_info": "Text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ordinal": 2,
|
|
||||||
"name": "station",
|
|
||||||
"type_info": "Text"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"Left": []
|
|
||||||
},
|
|
||||||
"nullable": [
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"hash": "c79fb8f25bf2e9f4299f690bebf7be5dc4e4ceacfc14b37472c39e65d9501be9"
|
|
||||||
}
|
|
51
web/src/endpoints/events/get_edit.rs
Normal file
51
web/src/endpoints/events/get_edit.rs
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
use actix_web::{web, HttpResponse, Responder};
|
||||||
|
use rinja::Template;
|
||||||
|
use sqlx::PgPool;
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
endpoints::{events::NewEventTemplate, IdPath},
|
||||||
|
models::{Assignment, Event, Function, Location, Role, User},
|
||||||
|
utils::ApplicationError,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[actix_web::get("/events/{id}/edit")]
|
||||||
|
pub async fn get(
|
||||||
|
user: web::ReqData<User>,
|
||||||
|
pool: web::Data<PgPool>,
|
||||||
|
path: web::Path<IdPath>,
|
||||||
|
) -> Result<impl Responder, ApplicationError> {
|
||||||
|
if user.role != Role::Admin && user.role != Role::AreaManager {
|
||||||
|
return Err(ApplicationError::Unauthorized);
|
||||||
|
}
|
||||||
|
|
||||||
|
let Some(event) = Event::read_by_id_including_location(pool.get_ref(), path.id).await? else {
|
||||||
|
return Ok(HttpResponse::NotFound().finish());
|
||||||
|
};
|
||||||
|
|
||||||
|
let locations = if user.role == Role::Admin {
|
||||||
|
Location::read_all_including_area(pool.get_ref()).await?
|
||||||
|
} else {
|
||||||
|
Location::read_by_area(pool.get_ref(), user.area_id).await?
|
||||||
|
};
|
||||||
|
|
||||||
|
let assignments = Assignment::read_all_by_event(pool.get_ref(), event.id).await?;
|
||||||
|
|
||||||
|
let template = NewEventTemplate {
|
||||||
|
user: user.into_inner(),
|
||||||
|
date: event.date,
|
||||||
|
locations,
|
||||||
|
event: Some(event),
|
||||||
|
amount_of_planned_posten: assignments
|
||||||
|
.iter()
|
||||||
|
.filter(|x| x.function == Function::Posten)
|
||||||
|
.count(),
|
||||||
|
is_fuehrungsassistent_planned: assignments
|
||||||
|
.iter()
|
||||||
|
.any(|x| x.function == Function::Fuehrungsassistent),
|
||||||
|
is_wachhabender_planned: assignments
|
||||||
|
.iter()
|
||||||
|
.any(|x| x.function == Function::Wachhabender),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(HttpResponse::Ok().body(template.render()?))
|
||||||
|
}
|
@ -1,22 +1,13 @@
|
|||||||
use actix_web::{web, HttpResponse, Responder};
|
use actix_web::{web, HttpResponse, Responder};
|
||||||
use chrono::NaiveDate;
|
|
||||||
use rinja::Template;
|
use rinja::Template;
|
||||||
use sqlx::PgPool;
|
use sqlx::PgPool;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
endpoints::NaiveDateQuery,
|
endpoints::{events::NewEventTemplate, NaiveDateQuery},
|
||||||
models::{Location, Role, User},
|
models::{Location, Role, User},
|
||||||
utils::ApplicationError,
|
utils::ApplicationError,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Template)]
|
|
||||||
#[template(path = "events/new.html")]
|
|
||||||
pub struct NewEventTemplate {
|
|
||||||
user: User,
|
|
||||||
date: NaiveDate,
|
|
||||||
locations: Vec<Location>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[actix_web::get("/events/new")]
|
#[actix_web::get("/events/new")]
|
||||||
pub async fn get(
|
pub async fn get(
|
||||||
user: web::ReqData<User>,
|
user: web::ReqData<User>,
|
||||||
@ -37,6 +28,10 @@ pub async fn get(
|
|||||||
user: user.into_inner(),
|
user: user.into_inner(),
|
||||||
date: query.date,
|
date: query.date,
|
||||||
locations,
|
locations,
|
||||||
|
event: None,
|
||||||
|
amount_of_planned_posten: 0,
|
||||||
|
is_fuehrungsassistent_planned: false,
|
||||||
|
is_wachhabender_planned: false
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(HttpResponse::Ok().body(template.render()?))
|
Ok(HttpResponse::Ok().body(template.render()?))
|
||||||
|
@ -1,3 +1,21 @@
|
|||||||
|
use chrono::NaiveDate;
|
||||||
|
use rinja::Template;
|
||||||
|
|
||||||
|
use crate::models::{Event, Location, Role, User};
|
||||||
|
|
||||||
|
pub mod get_edit;
|
||||||
pub mod get_new;
|
pub mod get_new;
|
||||||
pub mod post_new;
|
|
||||||
pub mod get_plan;
|
pub mod get_plan;
|
||||||
|
pub mod post_new;
|
||||||
|
|
||||||
|
#[derive(Template)]
|
||||||
|
#[template(path = "events/new_or_edit.html")]
|
||||||
|
pub struct NewEventTemplate {
|
||||||
|
user: User,
|
||||||
|
date: NaiveDate,
|
||||||
|
locations: Vec<Location>,
|
||||||
|
event: Option<Event>,
|
||||||
|
amount_of_planned_posten: usize,
|
||||||
|
is_fuehrungsassistent_planned: bool,
|
||||||
|
is_wachhabender_planned: bool,
|
||||||
|
}
|
||||||
|
@ -3,7 +3,10 @@ use chrono::{NaiveDate, NaiveTime};
|
|||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use sqlx::PgPool;
|
use sqlx::PgPool;
|
||||||
|
|
||||||
use crate::{models::{Event, Role, User}, utils::{self, ApplicationError}};
|
use crate::{
|
||||||
|
models::{Event, Role, User},
|
||||||
|
utils::{self, ApplicationError},
|
||||||
|
};
|
||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
pub struct NewEventForm {
|
pub struct NewEventForm {
|
||||||
@ -16,7 +19,7 @@ pub struct NewEventForm {
|
|||||||
voluntaryfuehrungsassistent: Option<bool>,
|
voluntaryfuehrungsassistent: Option<bool>,
|
||||||
amount: i16,
|
amount: i16,
|
||||||
clothing: String,
|
clothing: String,
|
||||||
note: Option<String>
|
note: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_web::post("/events/new")]
|
#[actix_web::post("/events/new")]
|
||||||
@ -29,6 +32,8 @@ pub async fn post(
|
|||||||
return Err(ApplicationError::Unauthorized);
|
return Err(ApplicationError::Unauthorized);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
println!("{:?}", form.note);
|
||||||
|
|
||||||
Event::create(
|
Event::create(
|
||||||
pool.get_ref(),
|
pool.get_ref(),
|
||||||
&form.date,
|
&form.date,
|
||||||
@ -40,7 +45,9 @@ pub async fn post(
|
|||||||
form.voluntaryfuehrungsassistent.unwrap_or(false),
|
form.voluntaryfuehrungsassistent.unwrap_or(false),
|
||||||
form.amount,
|
form.amount,
|
||||||
&form.clothing,
|
&form.clothing,
|
||||||
form.note.as_ref()
|
form.note
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|n| if n.len() != 0 { Some(n) } else { None }),
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ pub async fn post(
|
|||||||
};
|
};
|
||||||
|
|
||||||
let existing_assignments_for_vehicle =
|
let existing_assignments_for_vehicle =
|
||||||
VehicleAssignement::read_all_by_vehicle(pool.get_ref(), vehicle.id).await?;
|
VehicleAssignement::read_all_by_vehicle_and_date(pool.get_ref(), vehicle.id, event.date).await?;
|
||||||
let has_start_time_during_event =
|
let has_start_time_during_event =
|
||||||
|a: &VehicleAssignement| a.start_time >= event.start_time && a.start_time <= event.end_time;
|
|a: &VehicleAssignement| a.start_time >= event.start_time && a.start_time <= event.end_time;
|
||||||
let has_end_time_during_event =
|
let has_end_time_during_event =
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use chrono::NaiveTime;
|
use chrono::{NaiveDate, NaiveTime};
|
||||||
use sqlx::{query, PgPool};
|
use sqlx::{query, PgPool};
|
||||||
|
|
||||||
use super::Result;
|
use super::Result;
|
||||||
@ -73,13 +73,25 @@ impl VehicleAssignement {
|
|||||||
Ok(vehicle_assignments)
|
Ok(vehicle_assignments)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn read_all_by_vehicle(
|
pub async fn read_all_by_vehicle_and_date(
|
||||||
pool: &PgPool,
|
pool: &PgPool,
|
||||||
vehicle_id: i32,
|
vehicle_id: i32,
|
||||||
|
date: NaiveDate
|
||||||
) -> Result<Vec<VehicleAssignement>> {
|
) -> Result<Vec<VehicleAssignement>> {
|
||||||
let records = query!(
|
let records = query!(
|
||||||
"SELECT * FROM vehicleAssignement WHERE vehicleAssignement.vehicleId = $1;",
|
r#"
|
||||||
vehicle_id
|
SELECT
|
||||||
|
vehicleAssignement.eventId,
|
||||||
|
vehicleAssignement.vehicleId,
|
||||||
|
vehicleAssignement.starttime,
|
||||||
|
vehicleAssignement.endtime
|
||||||
|
FROM vehicleAssignement
|
||||||
|
JOIN event ON vehicleAssignement.eventId = event.id
|
||||||
|
WHERE vehicleAssignement.vehicleid = $1
|
||||||
|
AND event.date = $2;
|
||||||
|
"#,
|
||||||
|
vehicle_id,
|
||||||
|
date,
|
||||||
)
|
)
|
||||||
.fetch_all(pool)
|
.fetch_all(pool)
|
||||||
.await?;
|
.await?;
|
||||||
|
@ -1,146 +0,0 @@
|
|||||||
{% extends "nav.html" %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<section class="section">
|
|
||||||
<div class="container">
|
|
||||||
<form method="post" action="/assignments/new">
|
|
||||||
<input type="hidden" name="event" value="{{ event.id }}" />
|
|
||||||
|
|
||||||
<h1 class="title">Planung für {{ event.name }}</h1>
|
|
||||||
<div class="box">
|
|
||||||
{% if event.canceled %}<b>Veranstaltung abgesagt!</b>{% endif %}
|
|
||||||
<p>Ort: {{ event.location.as_ref().unwrap().name }}</p>
|
|
||||||
<p>Zeitraum: {{ event.start_time }} bis {{ event.end_time }}</p>
|
|
||||||
<p>Anzahl der Posten: {{ event.amount_of_posten }}</p>
|
|
||||||
<p>Wachhabender durch FF gestellt: {{ event.voluntary_wachhabender }}</p>
|
|
||||||
<p>Kleidungsordnung: {{ event.clothing }}</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="box">
|
|
||||||
<table class="table is-fullwidth">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Name</th>
|
|
||||||
<th>Funktion</th>
|
|
||||||
<th>Zeit</th>
|
|
||||||
<th>Kommentar</th>
|
|
||||||
<th></th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for a in all %}
|
|
||||||
{% let u = a.user.as_ref().unwrap() %}
|
|
||||||
<tr>
|
|
||||||
<td>{{ u.name }}</td>
|
|
||||||
<td>
|
|
||||||
{% match user.function %}
|
|
||||||
{% when Function::Posten %}
|
|
||||||
<span class="tag is-info">Posten</span>
|
|
||||||
{% when Function::Wachhabender %}
|
|
||||||
<span class="tag is-info">Wachhabender</span>
|
|
||||||
{% else %}
|
|
||||||
{% endmatch %}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
{% if a.start_time.is_some() && a.end_time.is_some() %}
|
|
||||||
{{ a.start_time.as_ref().unwrap() }} - {{ a.end_time.as_ref().unwrap() }}
|
|
||||||
{% else %}
|
|
||||||
ganztägig
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
{{ a.comment.as_deref().unwrap_or("") }}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% if event.voluntary_wachhabender %}
|
|
||||||
<div class="field">
|
|
||||||
<label class="label">Wachhabender</label>
|
|
||||||
<div class="select">
|
|
||||||
<select name="wachhabender">
|
|
||||||
{% for a in available_wachhabende %}
|
|
||||||
{% let user = a.user.as_ref().unwrap() %}
|
|
||||||
<option value="{{ a.id }}">
|
|
||||||
{{ user.name }} -
|
|
||||||
{% match user.function %}
|
|
||||||
{% when Function::Posten %}
|
|
||||||
Posten
|
|
||||||
{% when Function::Wachhabender %}
|
|
||||||
Wachhabender
|
|
||||||
{% else %}
|
|
||||||
{% endmatch %}
|
|
||||||
-
|
|
||||||
{% if a.start_time.is_some() && a.end_time.is_some() %}
|
|
||||||
{{ a.start_time.as_ref().unwrap() }} - {{ a.end_time.as_ref().unwrap() }}
|
|
||||||
{% else %}
|
|
||||||
ganztägig
|
|
||||||
{% endif %}
|
|
||||||
</option>
|
|
||||||
{% endfor %}
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<div class="field">
|
|
||||||
<label class="label">Posten</label>
|
|
||||||
<p class="help">Mehrfachauswahl mit Strg+Mausklick</p>
|
|
||||||
<div class="select is-multiple">
|
|
||||||
<select name="posten" multiple size="{{ available_posten.len() }}">
|
|
||||||
{% for a in available_posten %}
|
|
||||||
{% let user = a.user.as_ref().unwrap() %}
|
|
||||||
<option value="{{ a.id }}">
|
|
||||||
{{ user.name }} -
|
|
||||||
{% match user.function %}
|
|
||||||
{% when Function::Posten %}
|
|
||||||
Posten
|
|
||||||
{% when Function::Wachhabender %}
|
|
||||||
Wachhabender
|
|
||||||
{% else %}
|
|
||||||
{% endmatch %}
|
|
||||||
-
|
|
||||||
{% if a.start_time.is_some() && a.end_time.is_some() %}
|
|
||||||
{{ a.start_time.as_ref().unwrap() }} - {{ a.end_time.as_ref().unwrap() }}
|
|
||||||
{% else %}
|
|
||||||
ganztägig
|
|
||||||
{% endif %}
|
|
||||||
</option>
|
|
||||||
{% endfor %}
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="field">
|
|
||||||
<label class="label">Fahrzeug</label>
|
|
||||||
<div class="select">
|
|
||||||
<select>
|
|
||||||
<option>Fahrzeug</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="field is-horizontal">
|
|
||||||
<div class="field-label"></div>
|
|
||||||
<div class="field-body">
|
|
||||||
<div class="field is-grouped">
|
|
||||||
<div class="control">
|
|
||||||
<input class="button is-link" type="submit" value="Erstellen">
|
|
||||||
</div>
|
|
||||||
<div class="control">
|
|
||||||
<a class="button is-link is-light" href="/">Zurück</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
</script>
|
|
||||||
{% endblock %}
|
|
@ -60,6 +60,15 @@
|
|||||||
{% include "plan_vehicles.html" %}
|
{% include "plan_vehicles.html" %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="control">
|
||||||
|
<a class="button is-link is-light" hx-boost="true" href="/?date={{ event.date }}">
|
||||||
|
<svg class="icon">
|
||||||
|
<use href="/static/feather-sprite.svg#arrow-left" />
|
||||||
|
</svg>
|
||||||
|
<span>Zurück</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -76,23 +76,64 @@
|
|||||||
{% else %}
|
{% else %}
|
||||||
{% for event in events %}
|
{% for event in events %}
|
||||||
<div class="box">
|
<div class="box">
|
||||||
{% if event.canceled %}<b>Veranstaltung abgesagt!</b>{% endif %}
|
<div class="fixed-grid has-1-cols-mobile">
|
||||||
<div class="level">
|
<div class="grid content">
|
||||||
<h5 class="title is-5 level-left">{{ event.name }}</h5>
|
<div class="cell">
|
||||||
<span class="level-right">
|
<h5 class="title is-5">{{ event.name }}</h5>
|
||||||
|
</div>
|
||||||
|
|
||||||
{% if user.role == Role::AreaManager || user.role == Role::Admin %}
|
{% if user.role == Role::AreaManager || user.role == Role::Admin %}
|
||||||
<a href="/events/{{ event.id }}/plan" hx-boost="true"
|
<div class="cell is-narrow buttons is-justify-content-end mb-0">
|
||||||
class="button is-primary level-item">Planen</a>
|
<a href="/events/{{ event.id }}/plan" hx-boost="true" class="button is-link is-light">
|
||||||
<a href="" class="button is-primary-light level-item">bearbeiten</a>
|
<svg class="icon">
|
||||||
<a href="" class="button is-warning level-item">als abgesagt markieren</a>
|
<use href="/static/feather-sprite.svg#book-open" />
|
||||||
|
</svg>
|
||||||
|
<span>Planen</span>
|
||||||
|
</a>
|
||||||
|
<a href="/events/{{ event.id }}/edit" hx-boost="true" class="button is-primary is-light">
|
||||||
|
<svg class="icon">
|
||||||
|
<use href="/static/feather-sprite.svg#edit" />
|
||||||
|
</svg>
|
||||||
|
<span>Bearbeiten</span>
|
||||||
|
</a>
|
||||||
|
<a href="" class="button is-warning">als abgesagt markieren</a>
|
||||||
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</span>
|
|
||||||
|
{% if event.canceled %}<b>Veranstaltung abgesagt!</b>{% endif %}
|
||||||
|
|
||||||
|
<div class="cell">
|
||||||
|
<p><b>Uhrzeit:</b> {{ event.start_time.format("%R") }} Uhr - {{ event.end_time.format("%R") }} Uhr</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="cell">
|
||||||
|
<p><b>Veranstaltungsort:</b> {{ event.location.as_ref().unwrap().name }}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="cell">
|
||||||
|
<p><b>Wachhabender:</b> {% if event.voluntary_wachhabender %}FF{% else %}BF{% endif %}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="cell">
|
||||||
|
<p><b>Führungsassistent:</b> {% if event.voluntary_fuehrungsassistent %}FF{% else %}BF{% endif %}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="cell is-col-span-2">
|
||||||
|
<p><b>Anzahl der Posten:</b> {{ event.amount_of_posten }}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="cell is-col-span-2">
|
||||||
|
<p><b>Anzugsordnung:</b> {{ event.clothing }}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if let Some(note) = event.note %}
|
||||||
|
<div class="cell is-col-span-2">
|
||||||
|
<p><b>Anmerkungen:</b> {{ note }}</p>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p>Ort: {{ event.location.as_ref().unwrap().name }}</p>
|
|
||||||
<p>Zeitraum: {{ event.start_time }} bis {{ event.end_time }}</p>
|
|
||||||
<p>Anzahl der Posten: {{ event.amount_of_posten }}</p>
|
|
||||||
<p>Wachhabender durch FF gestellt: {{ event.voluntary_wachhabender }}</p>
|
|
||||||
<p>Kleidungsordnung: {{ event.clothing }}</p>
|
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user