diff --git a/ht_booking/assets/i18n/en/main.ftl b/ht_booking/assets/i18n/en/main.ftl index 3aaef1a..fa525c0 100644 --- a/ht_booking/assets/i18n/en/main.ftl +++ b/ht_booking/assets/i18n/en/main.ftl @@ -27,6 +27,8 @@ manage-courts = Courts back-to-calendar = Back to calendar add-booking = New Booking edit-booking = Edit Booking +booking-details = Booking details +edit = Edit date = Date hour = Hour booking-color = Colour diff --git a/ht_booking/assets/i18n/sk/main.ftl b/ht_booking/assets/i18n/sk/main.ftl index 148c145..bb663be 100644 --- a/ht_booking/assets/i18n/sk/main.ftl +++ b/ht_booking/assets/i18n/sk/main.ftl @@ -27,6 +27,8 @@ manage-courts = Kurty back-to-calendar = Späť na kalendár add-booking = Nová rezervácia edit-booking = Upraviť rezerváciu +booking-details = Detail rezervácie +edit = Upraviť date = Dátum hour = Hodina booking-color = Farba diff --git a/ht_booking/assets/views/admin/booking_detail.html b/ht_booking/assets/views/admin/booking_detail.html new file mode 100644 index 0000000..900b59e --- /dev/null +++ b/ht_booking/assets/views/admin/booking_detail.html @@ -0,0 +1,58 @@ +{% extends "base.html" %} + +{% block title %}{{ t(key="booking-details", lang=lang) }}{% endblock title %} + +{% block content %} +
+
+

{{ t(key="booking-details", lang=lang) }}

+ « {{ t(key="back-to-calendar", lang=lang) }} +
+ +
+
+
+
+
{{ t(key="court-label", lang=lang) }}
+
{{ court_name }}
+
+
+
{{ t(key="date", lang=lang) }}
+
{{ date_label }}
+
+
+
{{ t(key="hour", lang=lang) }}
+
{{ hour_label }}
+
+
+
{{ t(key="booking-color", lang=lang) }}
+
+ + {{ color }} +
+
+
+
{{ t(key="booking-name", lang=lang) }}
+
{{ name }}
+
+
+
{{ t(key="booking-title", lang=lang) }}
+
{% if title %}{{ title }}{% else %}{% endif %}
+
+
+
{{ t(key="booking-contact", lang=lang) }}
+
{% if contact %}{{ contact }}{% else %}{% endif %}
+
+
+
{{ t(key="booking-note", lang=lang) }}
+
{% if note %}{{ note }}{% else %}{% endif %}
+
+
+ +
+
+
+{% endblock content %} diff --git a/ht_booking/src/controllers/admin.rs b/ht_booking/src/controllers/admin.rs index 464db06..e56f3d6 100644 --- a/ht_booking/src/controllers/admin.rs +++ b/ht_booking/src/controllers/admin.rs @@ -421,6 +421,50 @@ pub async fn booking_create( Ok(Redirect::to(&format!("/admin?court={}&week={}", form.court_id, form.date)).into_response()) } +/// Read-only detail card for an existing booking. Clicking a booking in the +/// calendar lands here first, so a stray click can never change anything; the +/// card's "Edit" button is the only way through to the editable form. +#[debug_handler] +pub async fn booking_view( + _auth: AdminAuth, + ViewEngine(v): ViewEngine, + State(ctx): State, + jar: CookieJar, + Path(id): Path, +) -> Result { + let lang = current_lang(&jar); + let booking = bookings::Entity::find_by_id(id) + .one(&ctx.db) + .await? + .ok_or(Error::NotFound)?; + let court_name = courts::Entity::find_by_id(booking.court_id) + .one(&ctx.db) + .await? + .and_then(|c| c.name) + .unwrap_or_else(|| format!("Court {}", booking.court_id)); + + format::render().view( + &v, + "admin/booking_detail.html", + data!({ + "lang": lang, + "is_admin": true, + "logged_in": true, + "court_id": booking.court_id, + "court_name": court_name, + "date": booking.date.format("%Y-%m-%d").to_string(), + "date_label": booking.date.format("%d %b %Y").to_string(), + "hour_label": format!("{:02}:00 – {:02}:00", booking.hour, booking.hour + 1), + "color": booking.color, + "name": booking.name, + "title": booking.title.unwrap_or_default(), + "contact": booking.contact.unwrap_or_default(), + "note": booking.note.unwrap_or_default(), + "booking_id": id, + }), + ) +} + #[debug_handler] pub async fn booking_edit( _auth: AdminAuth, @@ -515,7 +559,8 @@ pub fn routes() -> Routes { .add("/courts/{id}/delete", post(delete_court)) .add("/booking", get(booking_new)) .add("/booking", post(booking_create)) - .add("/booking/{id}", get(booking_edit)) + .add("/booking/{id}", get(booking_view)) + .add("/booking/{id}/edit", get(booking_edit)) .add("/booking/{id}", post(booking_update)) .add("/booking/{id}/delete", post(booking_delete)) }