From b860e1d977bada7b28d88b54ec3bbc01980e8f48 Mon Sep 17 00:00:00 2001 From: Patrick Toal Date: Wed, 8 May 2024 17:23:23 -0400 Subject: [PATCH] Add some checks --- src/pages/schedule/ManageCalendar.vue | 56 ++++++++++++++++++------ src/pages/schedule/ScheduleIndexPage.vue | 17 +++++-- src/router/routes.ts | 2 + src/stores/schedule.ts | 32 ++++++++++++++ 4 files changed, 90 insertions(+), 17 deletions(-) diff --git a/src/pages/schedule/ManageCalendar.vue b/src/pages/schedule/ManageCalendar.vue index 09a2596..bb2e73b 100644 --- a/src/pages/schedule/ManageCalendar.vue +++ b/src/pages/schedule/ManageCalendar.vue @@ -116,11 +116,30 @@ color="accent" icon="save" label="Save" - @click="save($event, template)" + @click="saveTemplate($event, template)" /> + + + +
Overlapped blocks!
+
+ + + {{ item.start }}-{{ item.end }} + + + +
@@ -132,7 +151,11 @@ import { today, } from '@quasar/quasar-ui-qcalendar'; import { Boat, useBoatStore } from 'src/stores/boat'; -import { buildTimeBlock, useScheduleStore } from 'src/stores/schedule'; +import { + buildTimeBlock, + timeTuplesOverlapped, + useScheduleStore, +} from 'src/stores/schedule'; import { onMounted, ref } from 'vue'; import type { TimeBlockTemplate, TimeTuple } from 'src/stores/schedule.types'; import { date } from 'quasar'; @@ -143,11 +166,8 @@ const boatStore = useBoatStore(); const resources = boatStore.boats; const timeblockTemplates = scheduleStore.timeblockTemplates; const editable = ref(false); - -const save = (evt: Event, template: TimeBlockTemplate) => { - editable.value = false; - console.log(evt, template); -}; +const alert = ref(false); +const overlapped = ref<{ start: string; end: string }[]>(); onMounted(async () => { await boatStore.fetchBoats(); @@ -155,6 +175,21 @@ onMounted(async () => { await scheduleStore.fetchTimeBlockTemplates(); }); +const saveTemplate = (evt: Event, template: TimeBlockTemplate) => { + overlapped.value = timeTuplesOverlapped(template.timeTuples); + console.log(overlapped.value); + alert.value = overlapped.value.length > 0; + editable.value = false; + console.log(evt, template); +}; + +function createTimeblock(boat: Boat, templateId: string, date: string) { + const timeBlock = timeblockTemplates.find((t) => t.$id === templateId); + timeBlock?.timeTuples.map((tb: TimeTuple) => + scheduleStore.createTimeblock(buildTimeBlock(boat, tb, date)) + ); +} + function onDragStart(e: DragEvent, template: TimeBlockTemplate) { if (e.dataTransfer) { console.log('Drag start: ', e); @@ -191,13 +226,6 @@ function onDragLeave(e: DragEvent, type: string) { } } -function createTimeblock(boat: Boat, templateId: string, date: string) { - const timeBlock = timeblockTemplates.find((t) => t.$id === templateId); - timeBlock?.timeTuples.map((tb: TimeTuple) => - scheduleStore.createTimeblock(buildTimeBlock(boat, tb, date)) - ); -} - function onDrop( e: DragEvent, type: string, diff --git a/src/pages/schedule/ScheduleIndexPage.vue b/src/pages/schedule/ScheduleIndexPage.vue index 608a171..ddd900f 100644 --- a/src/pages/schedule/ScheduleIndexPage.vue +++ b/src/pages/schedule/ScheduleIndexPage.vue @@ -3,7 +3,7 @@ diff --git a/src/router/routes.ts b/src/router/routes.ts index b6afe89..18e989d 100644 --- a/src/router/routes.ts +++ b/src/router/routes.ts @@ -44,6 +44,7 @@ const routes: RouteRecordRaw[] = [ path: 'manage', component: () => import('src/pages/schedule/ManageCalendar.vue'), name: 'manage-schedule', + meta: { requiresScheduleAdmin: true }, }, ], }, @@ -101,6 +102,7 @@ const routes: RouteRecordRaw[] = [ { path: '/admin', component: () => import('layouts/AdminLayout.vue'), + meta: { requiresAdmin: true }, children: [ { path: '/user', diff --git a/src/stores/schedule.ts b/src/stores/schedule.ts index 37a5c91..da9e98b 100644 --- a/src/stores/schedule.ts +++ b/src/stores/schedule.ts @@ -17,6 +17,11 @@ import { import { AppwriteIds, databases } from 'src/boot/appwrite'; import { ID, Models } from 'appwrite'; +export type Interval = { + start: string; + end: string; +}; + export function arrayToTimeTuples(arr: string[]) { const timeTuples: TimeTuple[] = []; for (let i = 0; i < arr.length; i += 2) { @@ -25,6 +30,33 @@ export function arrayToTimeTuples(arr: string[]) { return timeTuples; } +export function timeTuplesOverlapped(tuples: TimeTuple[]): Interval[] { + return blocksOverlapped( + tuples.map((tuples) => { + return { + start: '01/01/2001 ' + tuples[0], + end: '01/01/2001 ' + tuples[1], + }; + }) + ).map((t) => { + return { start: t.start.split(' ')[1], end: t.end.split(' ')[1] }; + }); +} + +export function blocksOverlapped(blocks: Timeblock[] | Interval[]): Interval[] { + return Array.from( + new Set( + blocks + .sort((a, b) => Date.parse(a.start) - Date.parse(b.start)) + .reduce((acc: Interval[], block, i, arr) => { + if (i > 0 && block.start < arr[i - 1].end) + acc.push(arr[i - 1], block); + return acc; + }, []) + ) + ); +} + export function buildTimeBlock( resource: Boat, time: TimeTuple,