import { defineStore } from 'pinia'; import { ref } from 'vue'; import { Boat, useBoatStore } from './boat'; import { date } from 'quasar'; import { DateOptions } from 'quasar'; export interface Reservation { id: number; user: string; start: Date; end: Date; resource: Boat; reservationDate: Date; status?: string; } function getSampleData(): Reservation[] { const sampleData = [ { id: 1, user: 'John Smith', start: '12:00', end: '14:00', boat: 1, status: 'confirmed', }, { id: 2, user: 'Bob Barker', start: '18:00', end: '20:00', boat: 1, status: 'confirmed', }, { id: 3, user: 'Peter Parker', start: '8:00', end: '10:00', boat: 2, status: 'tentative', }, { id: 4, user: 'Vince McMahon', start: '13:00', end: '17:00', boat: 2, status: 'pending', }, { id: 5, user: 'Heather Graham', start: '06:00', end: '09:00', boat: 3, status: 'confirmed', }, { id: 6, user: 'Lawrence Fishburne', start: '18:00', end: '20:00', boat: 3, }, ]; const boatStore = useBoatStore(); const now = new Date(); const splitTime = (x: string): string[] => { return x.split(':'); }; const makeOpts = (x: string[]): DateOptions => { return { hour: parseInt(x[0]), minute: parseInt(x[1]) }; }; 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))), resource: boat, reservationDate: now, status: entry.status, }; }); } export const useScheduleStore = defineStore('schedule', () => { const reservations = ref(getSampleData()); const getBoatReservations = ( boat: number | string, curDate: Date ): Reservation[] => { return reservations.value.filter((x) => { return ( (x.start.getDate() == curDate.getDate() || x.end.getDate() == curDate.getDate()) && x.resource != undefined && (typeof boat == 'number' ? x.resource.id == boat : x.resource.name == boat) ); }); }; const isOverlapped = (res: Reservation) => { const lapped = reservations.value.filter( (entry: Reservation) => entry.id != res.id && 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, }; });