fix multi-select; only show private boats owner + kiosk

This commit is contained in:
philipp 2023-09-24 22:17:28 +02:00
parent a2c91b784a
commit fea45d5257
4 changed files with 60 additions and 10 deletions

View File

@ -39,9 +39,9 @@ function selectBoatChange() {
)[0]; )[0];
const rowers = Number(originalOption.dataset.amount_seats) - 1; const rowers = Number(originalOption.dataset.amount_seats) - 1;
choiceObjects['newrower'].config.maxItemCount = rowers;
choiceObjects['newrower'].removeActiveItems(rowers); setMaxAmountRowers(rowers);
(rowers === 0 ? choiceObjects['newrower'].disable() : choiceObjects['newrower'].enable());
return opt; return opt;
} }
@ -62,6 +62,27 @@ function selectBoatChange() {
choiceObjects[shipmasterSelect.id] = shipmasterChoice; choiceObjects[shipmasterSelect.id] = shipmasterChoice;
} }
function setMaxAmountRowers(rowers){
let curSelection = choiceObjects['newrower'].getValue(true);
let amount_to_delete = curSelection.length - rowers;
if (amount_to_delete > 0){
let to_delete = curSelection.slice(-amount_to_delete);
for (let del of to_delete) {
choiceObjects['newrower'].removeActiveItemsByValue(del);
}
}
choiceObjects['newrower'].config.maxItemCount = rowers;
const only_steering = <HTMLSelectElement>document.querySelector('#shipmaster_only_steering');
if (rowers === 0) {
choiceObjects['newrower'].disable()
only_steering.disabled = true;
}else{
choiceObjects['newrower'].enable()
only_steering.disabled = false;
}
}
function initBoatActions() { function initBoatActions() {
const boatSelects = document.querySelectorAll('.boats-js[data-onclick="true"]'); const boatSelects = document.querySelectorAll('.boats-js[data-onclick="true"]');
if(boatSelects) { if(boatSelects) {
@ -69,14 +90,20 @@ function initBoatActions() {
select.addEventListener('click', function() { select.addEventListener('click', function() {
if(select.dataset.seats) { if(select.dataset.seats) {
const rowers = Number(select.dataset.seats) - 1; const rowers = Number(select.dataset.seats) - 1;
choiceObjects['newrower'].config.maxItemCount = rowers;
choiceObjects['newrower'].removeActiveItems(rowers); setMaxAmountRowers(rowers);
if (select.dataset.id) { if (select.dataset.id) {
choiceObjects['boat_id'].setChoiceByValue(select.dataset.id); choiceObjects['boat_id'].setChoiceByValue(select.dataset.id);
} }
(rowers === 0 ? choiceObjects['newrower'].disable() : choiceObjects['newrower'].enable()); window.scrollTo(0, 0);
const inputElement = document.getElementById("departure") as HTMLInputElement;
const now = new Date();
const formattedDateTime = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}T${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`;
inputElement.value = formattedDateTime;
} }
}); });
}); });
@ -100,7 +127,7 @@ function initNewChoice(select: HTMLInputElement) {
noChoicesText: 'Keine Ergebnisse gefunden', noChoicesText: 'Keine Ergebnisse gefunden',
itemSelectText: 'Zum Auswählen klicken', itemSelectText: 'Zum Auswählen klicken',
placeholderValue: 'Ruderer auswählen', placeholderValue: 'Ruderer auswählen',
maxItemCount: Number(select.dataset.seats) - 1, maxItemCount: -1, //TODO
maxItemText: (maxItemCount) => { maxItemText: (maxItemCount) => {
return `Nur ${maxItemCount} Ruderer können hinzugefügt werden`; return `Nur ${maxItemCount} Ruderer können hinzugefügt werden`;
}, },

View File

@ -2,6 +2,8 @@ use rocket::serde::{Deserialize, Serialize};
use rocket::FromForm; use rocket::FromForm;
use sqlx::{FromRow, SqlitePool}; use sqlx::{FromRow, SqlitePool};
use super::user::User;
#[derive(FromRow, Debug, Serialize, Deserialize)] #[derive(FromRow, Debug, Serialize, Deserialize)]
pub struct Boat { pub struct Boat {
pub id: i64, pub id: i64,
@ -130,6 +132,27 @@ ORDER BY amount_seats DESC
Self::boats_to_details(db, boats).await Self::boats_to_details(db, boats).await
} }
pub async fn for_user(db: &SqlitePool, user: &User) -> Vec<BoatWithDetails> {
if user.is_admin {
return Self::all(db).await;
}
let boats = sqlx::query_as!(
Boat,
"
SELECT id, name, amount_seats, location_id, owner, year_built, boatbuilder, default_shipmaster_only_steering, skull, external
FROM boat
WHERE owner is null or owner = ?
ORDER BY amount_seats DESC
",
user.id
)
.fetch_all(db)
.await
.unwrap(); //TODO: fixme
Self::boats_to_details(db, boats).await
}
pub async fn all_at_location(db: &SqlitePool, location: String) -> Vec<BoatWithDetails> { pub async fn all_at_location(db: &SqlitePool, location: String) -> Vec<BoatWithDetails> {
let boats = sqlx::query_as!( let boats = sqlx::query_as!(
Boat, Boat,

View File

@ -43,7 +43,7 @@ async fn index(
flash: Option<FlashMessage<'_>>, flash: Option<FlashMessage<'_>>,
adminuser: AdminUser, adminuser: AdminUser,
) -> Template { ) -> Template {
let boats = Boat::all(db).await; let boats = Boat::for_user(db, &adminuser.user).await;
let coxes: Vec<UserWithWaterStatus> = futures::future::join_all( let coxes: Vec<UserWithWaterStatus> = futures::future::join_all(
User::cox(db) User::cox(db)