From 8600000e242bd70e2c76cc9c40a0857f80710270 Mon Sep 17 00:00:00 2001 From: Patrick Toal Date: Fri, 1 Dec 2023 00:08:29 -0500 Subject: [PATCH] Many tweaks to booking form. --- .../ResourceScheduleViewerComponent.vue | 218 +++++++++++----- src/components/{ => boat}/BoatComponent.vue | 0 src/components/boat/BoatPickerComponent.vue | 40 +++ .../{ => boat}/BoatPreviewComponent.vue | 0 src/pages/BoatPage.vue | 2 +- src/pages/schedule/BoatReservationPage.vue | 245 ++++++------------ src/stores/schedule.ts | 49 +++- 7 files changed, 312 insertions(+), 242 deletions(-) rename src/components/{ => boat}/BoatComponent.vue (100%) create mode 100644 src/components/boat/BoatPickerComponent.vue rename src/components/{ => boat}/BoatPreviewComponent.vue (100%) diff --git a/src/components/ResourceScheduleViewerComponent.vue b/src/components/ResourceScheduleViewerComponent.vue index 54492bd..442aaf5 100644 --- a/src/components/ResourceScheduleViewerComponent.vue +++ b/src/components/ResourceScheduleViewerComponent.vue @@ -1,69 +1,110 @@ diff --git a/src/stores/schedule.ts b/src/stores/schedule.ts index 15cedba..1adf65d 100644 --- a/src/stores/schedule.ts +++ b/src/stores/schedule.ts @@ -5,6 +5,7 @@ import { date } from 'quasar'; import { DateOptions } from 'quasar'; export interface Reservation { + id: number; user: string; start: Date; end: Date; @@ -16,6 +17,7 @@ export interface Reservation { function getSampleData(): Reservation[] { const sampleData = [ { + id: 1, user: 'John Smith', start: '12:00', end: '14:00', @@ -23,6 +25,7 @@ function getSampleData(): Reservation[] { status: 'confirmed', }, { + id: 2, user: 'Bob Barker', start: '18:00', end: '20:00', @@ -30,6 +33,7 @@ function getSampleData(): Reservation[] { status: 'confirmed', }, { + id: 3, user: 'Peter Parker', start: '8:00', end: '10:00', @@ -37,6 +41,7 @@ function getSampleData(): Reservation[] { status: 'tentative', }, { + id: 4, user: 'Vince McMahon', start: '13:00', end: '17:00', @@ -44,13 +49,20 @@ function getSampleData(): Reservation[] { status: 'pending', }, { + id: 5, user: 'Heather Graham', start: '06:00', end: '09:00', boat: 3, status: 'confirmed', }, - { user: 'Lawrence Fishburne', start: '18:00', end: '20:00', boat: 3 }, + { + id: 6, + user: 'Lawrence Fishburne', + start: '18:00', + end: '20:00', + boat: 3, + }, ]; const boatStore = useBoatStore(); const now = new Date(); @@ -64,6 +76,7 @@ function getSampleData(): Reservation[] { return sampleData.map((entry): Reservation => { const boat = boatStore.boats.find((b) => b.id == entry.boat); return { + id: entry.id, user: entry.user, start: date.adjustDate(now, makeOpts(splitTime(entry.start))), end: date.adjustDate(now, makeOpts(splitTime(entry.end))), @@ -80,7 +93,6 @@ export const useScheduleStore = defineStore('schedule', () => { boat: number | string, curDate: Date ): Reservation[] => { - console.log(reservations.value); return reservations.value.filter((x) => { return ( (x.start.getDate() == curDate.getDate() || @@ -91,5 +103,36 @@ export const useScheduleStore = defineStore('schedule', () => { ); }); }; - return { reservations, getBoatReservations }; + + const isOverlapped = (res: Reservation) => { + const lapped = reservations.value.filter( + (entry: Reservation) => + entry.resource == res.resource && + ((entry.start <= res.start && entry.end > res.start) || + (entry.end >= res.end && entry.start <= res.end)) + ); + return lapped.length > 0; + }; + + const getNewId = () => { + // Trivial placeholder + return Math.max(...reservations.value.map((item) => item.id)) + 1; + }; + + const addOrCreateReservation = (reservation: Reservation) => { + const index = reservations.value.findIndex( + (res) => res.id == reservation.id + ); + index != -1 + ? (reservations.value[index] = reservation) + : reservations.value.push(reservation); + }; + + return { + reservations, + getBoatReservations, + getNewId, + addOrCreateReservation, + isOverlapped, + }; });