diff --git a/frontend/tests/log.spec.ts b/frontend/tests/log.spec.ts index 64d2c09..b12f0cb 100644 --- a/frontend/tests/log.spec.ts +++ b/frontend/tests/log.spec.ts @@ -12,10 +12,10 @@ test("Cox can start and cancel trip", async ({ page }, testInfo) => { await page.getByRole("link", { name: "Ausfahrt eintragen" }).click(); if (testInfo.project.name.includes("Mobile")) { // No left boat selector on mobile views - await page.getByText("Kaputtes Boot :-( (7 x)").nth(1).click(); + await page.getByText("Kaputtes Boot :-( (7x)").nth(1).click(); await page.getByRole("option", { name: "Joe" }).click(); } else { - await page.getByText('2x').click(); + await page.getByText('2x', { exact: true }).click(); await page.getByText("Joe", { exact: true }).click(); } await page.getByPlaceholder("Ruderer auswählen").click(); @@ -53,10 +53,10 @@ test("Cox can start and finish trip", async ({ page }, testInfo) => { await page.getByRole("link", { name: "Ausfahrt eintragen" }).click(); if (testInfo.project.name.includes("Mobile")) { // No left boat selector on mobile views - await page.getByText("Kaputtes Boot :-( (7 x)").nth(1).click(); + await page.getByText("Kaputtes Boot :-( (7x)").nth(1).click(); await page.getByRole("option", { name: "Joe" }).click(); } else { - await page.getByText('2x').click(); + await page.getByText('2x', { exact: true }).click(); await page.getByText("Joe", { exact: true }).click(); } await page.getByPlaceholder("Ruderer auswählen").click(); @@ -105,10 +105,10 @@ test("Kiosk can start and cancel trip", async ({ page }, testInfo) => { await page.goto("/log/kiosk/ekrv2019/Linz"); if (testInfo.project.name.includes("Mobile")) { // No left boat selector on mobile views - await page.getByText("Kaputtes Boot :-( (7 x)").nth(1).click(); + await page.getByText("Kaputtes Boot :-( (7x)").nth(1).click(); await page.getByRole("option", { name: "Joe" }).click(); } else { - await page.getByText('2x').click(); + await page.getByText('2x', { exact: true }).click(); await page.getByText("Joe", { exact: true }).click(); } await page.getByPlaceholder("Ruderer auswählen").click(); @@ -139,10 +139,10 @@ test("Kiosk can start and finish trip", async ({ page }, testInfo) => { if (testInfo.project.name.includes("Mobile")) { // No left boat selector on mobile views - await page.getByText("Kaputtes Boot :-( (7 x)").nth(1).click(); + await page.getByText("Kaputtes Boot :-( (7x)").nth(1).click(); await page.getByRole("option", { name: "Joe" }).click(); } else { - await page.getByText('2x').click(); + await page.getByText('2x', { exact: true }).click(); await page.getByText("Joe", { exact: true }).click(); } await page.getByPlaceholder("Ruderer auswählen").click(); diff --git a/src/model/boat.rs b/src/model/boat.rs index 5860d32..115acec 100644 --- a/src/model/boat.rs +++ b/src/model/boat.rs @@ -21,9 +21,9 @@ pub struct Boat { pub boatbuilder: Option, pub default_destination: Option, #[serde(default = "bool::default")] - convert_handoperated_possible: bool, + pub convert_handoperated_possible: bool, #[serde(default = "bool::default")] - default_shipmaster_only_steering: bool, + pub default_shipmaster_only_steering: bool, #[serde(default = "bool::default")] skull: bool, #[serde(default = "bool::default")] @@ -46,6 +46,7 @@ pub struct BoatWithDetails { damage: BoatDamage, on_water: bool, reserved_today: bool, + cat: String, } #[derive(FromForm)] @@ -179,11 +180,18 @@ AND date('now') BETWEEN start_date AND end_date;", if boat.is_locked(db).await { damage = BoatDamage::Locked; } + let cat = if boat.default_shipmaster_only_steering { + format!("{}+", boat.amount_seats - 1) + } else { + format!("{}x", boat.amount_seats) + }; + res.push(BoatWithDetails { damage, on_water: boat.on_water(db).await, reserved_today: boat.reserved_today(db).await, boat, + cat, }); } res diff --git a/src/model/logbook.rs b/src/model/logbook.rs index 5d83f12..156ad8e 100644 --- a/src/model/logbook.rs +++ b/src/model/logbook.rs @@ -126,6 +126,7 @@ pub enum LogbookCreateError { NotYourEntry, ArrivalSetButNotRemainingTwo, OnlyAllowedToEndTripsEndingToday, + CantChangeHandoperatableStatusForThisBoat, } impl From for LogbookCreateError { @@ -302,6 +303,12 @@ ORDER BY departure DESC return Err(LogbookCreateError::BoatNotFound); }; + if log.shipmaster_only_steering != boat.default_shipmaster_only_steering { + if !boat.convert_handoperated_possible { + return Err(LogbookCreateError::CantChangeHandoperatableStatusForThisBoat); + } + } + if boat.amount_seats == 1 && log.rowers.is_empty() { log.rowers = vec![created_by_user.id]; } diff --git a/src/tera/log.rs b/src/tera/log.rs index 241f36c..2c618b0 100644 --- a/src/tera/log.rs +++ b/src/tera/log.rs @@ -214,6 +214,7 @@ async fn create_logbook( Err(LogbookCreateError::NotYourEntry) => Flash::error(Redirect::to("/log"), "Nicht deine Ausfahrt!"), Err(LogbookCreateError::ArrivalSetButNotRemainingTwo) => Flash::error(Redirect::to("/log"), "Ankunftszeit gesetzt aber nicht Distanz + Strecke"), Err(LogbookCreateError::OnlyAllowedToEndTripsEndingToday) => Flash::error(Redirect::to("/log"), "Nur Ausfahrten, die in der letzten Woche enden dürfen eingetragen werden. Für einen Nachtrag schreibe alle Daten Philipp (Tel. nr. siehe Signal oder it@rudernlinz.at)."), + Err(LogbookCreateError::CantChangeHandoperatableStatusForThisBoat) => Flash::error(Redirect::to("/log"), "Handsteuer-Status dieses Boots kann nicht verändert werden."), } } diff --git a/staging-diff.sql b/staging-diff.sql index 3cbc8dc..6fb21fc 100644 --- a/staging-diff.sql +++ b/staging-diff.sql @@ -1,6 +1,3 @@ -ALTER TABLE boat ADD COLUMN convert_handoperated_possible BOOLEAN DEFAULT false NOT NULL; - - -- test user INSERT INTO user(name) VALUES('Marie'); INSERT INTO "user_role" (user_id, role_id) VALUES((SELECT id from user where name = 'Marie'),(SELECT id FROM role where name = 'Donau Linz')); diff --git a/templates/includes/forms/log.html.tera b/templates/includes/forms/log.html.tera index 99d308e..c70fb8c 100644 --- a/templates/includes/forms/log.html.tera +++ b/templates/includes/forms/log.html.tera @@ -3,16 +3,14 @@ Inputs: boats #} {% macro show_boats() %} - {% for amount_seats, grouped_boats in boats | group_by(attribute="amount_seats") %} + {% for amount_seats, grouped_boats in boats | group_by(attribute="cat") %}
{% if grouped_boats[0].external %} Vereinsfremde Boote - {% elif grouped_boats[0].default_shipmaster_only_steering %} - {{ grouped_boats[0].amount_seats - 1 }}+ {% else %} - {{ amount_seats }}x + {{ grouped_boats[0].cat }} {% endif %} ({{ grouped_boats | length }}) @@ -78,7 +76,7 @@ {% endmacro new %} {% macro boat_select(id="boat_id") %} - {{ macros::select(label="Boot", data=boats, name="boat_id", id=id, display=["name", " (","amount_seats", " x)"], extras=["default_shipmaster_only_steering", "amount_seats", "on_water", "default_destination"], wrapper_class="col-span-4", show_seats=true) }} + {{ macros::select(label="Boot", data=boats, name="boat_id", id=id, display=["name", " (","cat",")"], extras=["default_shipmaster_only_steering", "amount_seats", "on_water", "default_destination"], wrapper_class="col-span-4", show_seats=true) }} {% endmacro boat_select %} {% macro rower_select(id, selected, amount_seats='', class='', init='false', cox_on_boat='', steering_person_id='') %} {#{% if not amount_seats or amount_seats > 1 %}#}