Compare commits
11 Commits
9306b42098
...
4a3fd0df2a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4a3fd0df2a | ||
|
|
8abcd3a979 | ||
|
|
ade34ac7ca | ||
|
|
3edae91e12 | ||
|
|
fcd11be506 | ||
|
670ecf3526
|
|||
|
e3e5e9eb69
|
|||
|
|
d086700d6d | ||
|
|
03bca19527 | ||
|
|
0239f86985 | ||
|
|
e518f63714 |
@@ -85,9 +85,17 @@ export function haversineDistance(
|
||||
return radius * 2 * Math.asin(Math.sqrt(e1));
|
||||
}
|
||||
|
||||
export function collectTimings(study_space_hours: Table<"study_space_hours">[]) {
|
||||
export function collectTimings(
|
||||
study_space_hours: Omit<
|
||||
Table<"study_space_hours">,
|
||||
"id" | "created_at" | "updated_at" | "study_space_id"
|
||||
>[]
|
||||
) {
|
||||
// Collect all timing entries
|
||||
const timingsPerDay: Record<number, Table<"study_space_hours">[]> = {
|
||||
const timingsPerDay: Record<
|
||||
number,
|
||||
Omit<Table<"study_space_hours">, "id" | "created_at" | "updated_at" | "study_space_id">[]
|
||||
> = {
|
||||
0: [],
|
||||
1: [],
|
||||
2: [],
|
||||
|
||||
@@ -190,6 +190,8 @@
|
||||
function minsToReadableHours(mins: number) {
|
||||
return `${Math.floor(mins / 60)} hrs, ${mins % 60} mins`;
|
||||
}
|
||||
|
||||
$inspect(sortedStudySpaces);
|
||||
</script>
|
||||
|
||||
<Navbar>
|
||||
@@ -221,16 +223,14 @@
|
||||
|
||||
<main>
|
||||
{#each sortedStudySpaces as studySpace (studySpace.id)}
|
||||
{@const imgUrl =
|
||||
studySpace.study_space_images.length > 0
|
||||
<SpaceCard
|
||||
alt="Photo of {studySpace.description}"
|
||||
href="/space/{studySpace.id}"
|
||||
imgSrc={studySpace.study_space_images.length > 0
|
||||
? supabase.storage
|
||||
.from("files_bucket")
|
||||
.getPublicUrl(studySpace.study_space_images[0].image_path).data.publicUrl
|
||||
: defaultImg}
|
||||
<SpaceCard
|
||||
alt="Photo of {studySpace.description}"
|
||||
href="/space/{studySpace.id}"
|
||||
imgSrc={imgUrl}
|
||||
space={studySpace}
|
||||
isFavourite={favouriteIds.includes(studySpace.id)}
|
||||
onToggleFavourite={session ? () => handleToggleFavourite(studySpace.id) : undefined}
|
||||
@@ -256,6 +256,9 @@
|
||||
<Button href="/auth" type="link">Login / Signup</Button>
|
||||
{/if}
|
||||
</footer>
|
||||
{#if adminMode}
|
||||
<div class="adminMode">You are in admin mode</div>
|
||||
{/if}
|
||||
|
||||
<style>
|
||||
main {
|
||||
@@ -326,4 +329,24 @@
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
.adminMode {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
position: sticky;
|
||||
left: 0;
|
||||
gap: 0.5rem;
|
||||
padding: 0.75rem;
|
||||
font-size: 1rem;
|
||||
background-color: #182125;
|
||||
bottom: 0;
|
||||
border-radius: 0.5rem;
|
||||
box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.1);
|
||||
color: #eaffeb;
|
||||
border: 2px solid #eaffeb;
|
||||
z-index: 1000;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -87,6 +87,12 @@
|
||||
isFavourite = true;
|
||||
}
|
||||
}
|
||||
|
||||
async function deleteSpace() {
|
||||
if (!confirm("Are you sure you want to delete this study space?")) return;
|
||||
await supabase.from("study_spaces").delete().eq("id", space.id);
|
||||
window.location.href = "/";
|
||||
}
|
||||
</script>
|
||||
|
||||
<Navbar>
|
||||
@@ -192,7 +198,10 @@
|
||||
|
||||
<div class="actions">
|
||||
{#if adminMode}
|
||||
<div class="buttonContainer">
|
||||
<Button href="/space/{space.id}/edit" type="link">Edit</Button>
|
||||
<Button type="button" style="red" onclick={deleteSpace}>Delete</Button>
|
||||
</div>
|
||||
{:else}
|
||||
<Button onclick={() => (isReportVisible = true)} style="red">Report</Button>
|
||||
{/if}
|
||||
@@ -355,4 +364,9 @@
|
||||
width: 3.75rem;
|
||||
height: 3.75rem;
|
||||
}
|
||||
.buttonContainer {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 0.5rem;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -14,7 +14,8 @@
|
||||
volumeTags,
|
||||
gmapsLoader,
|
||||
daysOfWeek,
|
||||
timeToMins
|
||||
timeToMins,
|
||||
collectTimings
|
||||
} from "$lib";
|
||||
import { onMount } from "svelte";
|
||||
import type { Json } from "$lib/database.js";
|
||||
@@ -61,6 +62,20 @@
|
||||
function checkTimings() {
|
||||
let cannotExist = [] as number[];
|
||||
|
||||
let hasAllDays = Object.values(collectTimings(studySpaceData.opening_times)).every(
|
||||
(item) => !(Array.isArray(item) && item.length === 0)
|
||||
);
|
||||
|
||||
if (
|
||||
(allDays.closes_at === "" || allDays.opens_at === "") &&
|
||||
allDays.open_today_status === null &&
|
||||
studySpaceData.opening_times.length > 0 &&
|
||||
!hasAllDays
|
||||
) {
|
||||
alert(`No opening time provided for all other days.`);
|
||||
return false;
|
||||
}
|
||||
|
||||
const opensAtMinsAll = timeToMins(allDays.opens_at);
|
||||
const closesAtMinsAll = timeToMins(allDays.closes_at);
|
||||
if (opensAtMinsAll >= closesAtMinsAll) {
|
||||
@@ -200,6 +215,7 @@
|
||||
// Nothing is provided
|
||||
if (
|
||||
(allDays.closes_at != "" && allDays.opens_at != "") ||
|
||||
studySpaceData.opening_times.length === 7 ||
|
||||
allDays.open_today_status != null
|
||||
) {
|
||||
const { error: hoursErr } = await supabase
|
||||
|
||||
Reference in New Issue
Block a user