feat: added migration for a study_space_hours table and allowed for the user to make time inputs when submitting a new space

Co-Authored-By: Tadios Temesgen <tt2022@ic.ac.uk>
This commit is contained in:
Caspar Jojo Asaam
2025-06-12 10:10:41 +01:00
parent 7c0f9b3f52
commit 7117f85ef7
5 changed files with 160 additions and 2 deletions

View File

@@ -20,10 +20,35 @@
const { supabase } = $derived(data);
const { space, images } = $derived(data);
const studySpaceData = $derived({
// Days of week for opening times
const daysOfWeek = [
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
];
const studySpaceData = $state({
opening_times: daysOfWeek.map((_, index) => ({
day_of_week: index,
opens_at: "",
closes_at: "",
is_24_7: false
})),
...space
});
$effect(() => {
if (!space) return;
const { opening_times, ...rest } = space;
Object.assign(studySpaceData, rest);
if (opening_times) {
studySpaceData.opening_times = opening_times;
}
});
let scrollPosition = $state(0);
const existingImages = $derived(
Promise.all(
@@ -46,11 +71,13 @@
if (!spaceImgs || spaceImgs.length < 1) return alert("Please select an image file.");
if (!studySpaceData.building_location) return alert("Please select a building location.");
const { opening_times, ...spacePayload } = studySpaceData;
const { data: studySpaceInsert, error: studySpaceError } = await supabase
.from("study_spaces")
.upsert(
{
...studySpaceData,
...spacePayload,
building_location: studySpaceData.building_location as Json
},
{
@@ -102,6 +129,23 @@
.select();
if (imageInsertError) return alert(`Error creating image: ${imageInsertError.message}`);
const { error: deleteErr } = await supabase
.from("study_space_hours")
.delete()
.eq("study_space_id", studySpaceInsert.id);
if (deleteErr) return alert(`Error clearing old hours: ${deleteErr.message}`);
const { error: hoursErr } = await supabase.from("study_space_hours").insert(
opening_times.map((h) => ({
study_space_id: studySpaceInsert.id,
day_of_week: h.day_of_week,
opens_at: h.opens_at,
closes_at: h.closes_at,
is_24_7: h.is_24_7
}))
);
if (hoursErr) return alert(`Error saving opening times: ${hoursErr.message}`);
alert("Thank you for your contribution!");
// Redirect to the new study space page
await goto(`/space/${studySpaceInsert.id}`, {
@@ -254,6 +298,36 @@
</div>
</div>
<label for="opening-times-label">Opening Times:</label>
<div class="opening-times">
{#each daysOfWeek as day, index (index)}
<div class="opening-time-item">
<label for={"opens-" + index}>{day}</label>
<input
id={"opens-" + index}
type="time"
bind:value={studySpaceData.opening_times[index].opens_at}
required
/>
<span>to</span>
<input
id={"closes-" + index}
type="time"
bind:value={studySpaceData.opening_times[index].closes_at}
required
/>
<label for={"is247-" + index}>
<input
id={"is247-" + index}
type="checkbox"
bind:checked={studySpaceData.opening_times[index].is_24_7}
/>
24/7
</label>
</div>
{/each}
</div>
<label for="tags">Additional tags:</label>
<div class="tagDisplay">
{#each studySpaceData.tags as tagName (tagName)}