feat: view of new event

This commit is contained in:
Max Hohlfeld 2024-03-18 20:11:07 +01:00
parent 28c562d82f
commit fedfc87259
6 changed files with 180 additions and 1 deletions

View File

@ -0,0 +1,38 @@
use actix_identity::Identity;
use actix_web::{web, HttpResponse, Responder};
use askama::Template;
use askama_actix::TemplateToResponse;
use chrono::NaiveDate;
use sqlx::PgPool;
use crate::{endpoints::NaiveDateQuery, models::{Role, User, Location}};
#[derive(Template)]
#[template(path = "events/new.html")]
pub struct NewEventTemplate {
user: User,
date: NaiveDate,
locations: Vec<Location>
}
#[actix_web::get("/events/new")]
pub async fn get(user: Identity, pool: web::Data<PgPool>, query: web::Query<NaiveDateQuery>) -> impl Responder {
let current_user = User::read_by_id(pool.get_ref(), user.id().unwrap().parse().unwrap())
.await
.unwrap();
if current_user.role != Role::Admin && current_user.role != Role::AreaManager {
return HttpResponse::Unauthorized().finish();
}
let locations;
if current_user.role == Role::Admin {
locations = Location::read_all_including_area(pool.get_ref()).await.unwrap();
} else {
locations = Location::read_by_area(pool.get_ref(), current_user.area_id).await.unwrap();
}
let template = NewEventTemplate { user: current_user, date: query.date, locations };
return template.to_response();
}

View File

@ -0,0 +1,2 @@
pub mod get_new;
pub mod post_new;

View File

@ -0,0 +1,11 @@
use actix_identity::Identity;
use actix_web::{web, HttpResponse, Responder};
use sqlx::PgPool;
#[actix_web::post("/events/new")]
pub async fn post(user: Identity, pool: web::Data<PgPool>) -> impl Responder {
return HttpResponse::BadRequest().finish();
}

View File

@ -1,14 +1,21 @@
use actix_web::web::ServiceConfig;
use chrono::NaiveDate;
use serde::Deserialize;
mod location;
mod user;
mod events;
#[derive(Deserialize)]
pub struct IdPath {
pub id: i32
}
#[derive(Deserialize)]
pub struct NaiveDateQuery {
pub date: NaiveDate
}
pub fn init(cfg: &mut ServiceConfig) {
cfg.service(location::get_overview::get);
cfg.service(location::get_new::get);
@ -21,4 +28,7 @@ pub fn init(cfg: &mut ServiceConfig) {
cfg.service(user::post_edit::post_edit);
cfg.service(user::patch::patch);
cfg.service(user::delete::delete);
cfg.service(events::get_new::get);
// cfg.service(events::post_new::);
}

118
templates/events/new.html Normal file
View File

@ -0,0 +1,118 @@
{% extends "nav.html" %}
{% block content %}
<section class="section">
<div class="container">
<form method="post" action="/events/new">
<h1 class="title">Neues Event anlegen für den {{ date.format("%d.%m.%Y") }}</h1>
<input type="hidden" name="date" value="{{ date }}">
<div class="field is-horizontal">
<div class="field-label">
<label class="label">Veranstaltungsname</label>
</div>
<div class="field-body">
<div class="field">
<div class="control">
<input class="input" name="name" placeholder="Wave Gotik Treffen" />
</div>
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label">
<label class="label">Startzeit - Endzeit</label>
</div>
<div class="field-body">
<div class="field">
<input class="input" type="time" id="from" name="from" value="00:00">
</div>
<div class="field">
<input class="input" type="time" id="till" name="till" value="23:59">
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label">
<label class="label">Veranstaltungsort</label>
</div>
<div class="field-body">
<div class="field is-narrow">
<div class="control">
<div class="select is-fullwidth">
<select name="location">
{% for location in locations %}
<option value="{{ location.id }}">{{ location.name }}{% if user.role == Role::Admin %} - ({{ location.area.as_ref().unwrap().name }}){% endif %}</option>
{% endfor %}
</select>
</div>
</div>
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label">
<label class="label">Wachhabender durch FF gestellt?</label>
</div>
<div class="field-body">
<div class="field is-narrow">
<div class="control">
<label class="checkbox">
<input class="checkbox" type="checkbox" name="voluntaryWachhabender">
</label>
</div>
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label">
<label class="label">Anzahl der Posten</label>
</div>
<div class="field-body">
<div class="field">
<div class="control">
<input class="input" type="number" name="name" min="1" max="100"/>
</div>
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label">
<label class="label">Anzugsordnung</label>
</div>
<div class="field-body">
<div class="field">
<div class="control">
<input class="input" name="clothing" placeholder="Tuchuniform" />
</div>
</div>
</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="/locations">Zurück</a>
</div>
</div>
</div>
</div>
</form>
</div>
</section>
<script>
</script>
{% endblock %}

View File

@ -26,7 +26,7 @@
</h3>
</div>
<div class="level-right">
<a class="button" href="/event/new">Neues Event für diesen Tag</a>
<a class="button" href="/events/new?date={{ date }}">Neues Event für diesen Tag</a>
</div>
</div>