1 Commits

Author SHA1 Message Date
Temesgen, Tadios
49a1e93dfe Merge branch 'master' into 'feat/filter-by-time'
# Conflicts:
#   src/lib/database.d.ts
#   src/routes/+page.svelte
#   src/routes/space/[id]/+page.svelte
2025-06-12 14:54:04 +00:00
7 changed files with 108 additions and 108 deletions

View File

@@ -28,6 +28,7 @@
background: linear-gradient(-77deg, #2e4653, #223a37);
box-shadow: 0rem 0rem 0.5rem #182125;
align-items: center;
overflow: hidden;
z-index: 100;
}

44
src/lib/database.d.ts vendored
View File

@@ -140,27 +140,7 @@ export type Database = {
}
Relationships: []
}
users: {
Row: {
created_at: string
id: string
is_admin: boolean
updated_at: string
}
Insert: {
created_at?: string
id: string
is_admin?: boolean
updated_at?: string
}
Update: {
created_at?: string
id?: string
is_admin?: boolean
updated_at?: string
}
Relationships: []
}
study_space_hours: {
Row: {
id: string
@@ -201,6 +181,28 @@ export type Database = {
referencedColumns: ["id"]
},
]
users: {
Row: {
created_at: string
id: string
is_admin: boolean
updated_at: string
}
Insert: {
created_at?: string
id: string
is_admin?: boolean
updated_at?: string
}
Update: {
created_at?: string
id?: string
is_admin?: boolean
updated_at?: string
}
Relationships: []
}
}
Views: {

View File

@@ -33,7 +33,6 @@
margin: 0;
padding: 0;
width: 100%;
overflow-x: hidden;
}
:global(html) {

View File

@@ -110,63 +110,21 @@
</script>
<Navbar>
<div class="navActions">
<div class="tagDisplay">
{#each selectedTags as tagName (tagName)}
<button class="tag" onclick={deleteTag(tagName)} type="button">
{tagName}
<img src={crossUrl} alt="delete" /></button
>
{/each}
<input
type="text"
name="tagInput"
class="tagInput"
bind:value={tagFilter}
bind:this={tagFilterElem}
onfocus={() => {
dropdownVisible = true;
}}
onblur={() => {
dropdownVisible = false;
}}
onkeypress={(event) => {
if (event.key === "Enter") {
event.preventDefault();
const tag = filteredTags[0];
if (tag) addTag(tag)();
}
}}
placeholder="Search by tags..."
/>
{#if dropdownVisible}
<div class="tagDropdown">
{#each filteredTags as avaliableTag (avaliableTag)}
<button
class="avaliableTag"
onclick={addTag(avaliableTag)}
onmousedown={(e) => {
// Keep input focused
e.preventDefault();
e.stopPropagation();
}}
type="button"
>
{avaliableTag}
</button>
{/each}
</div>
{/if}
</div>
{#if session}
<a href="/space/new/edit">
<img src={crossUrl} alt="new" class="new-space" />
</a>
{/if}
</div>
{#if session}
<a href="/space/new/edit">
<img src={crossUrl} alt="new" class="new-space" />
</a>
{/if}
</Navbar>
<main>
{#if adminMode}
<div class="checkReports">
<Button href="/space/reports" type="link" style="red">Check Reports</Button>
</div>
{/if}
<div class="time-filter-container">
<label>
Open from:
@@ -177,11 +135,59 @@
<input type="time" bind:value={closingFilter} />
</label>
</div>
{#if adminMode}
<div class="checkReports">
<Button href="/space/reports" type="link" style="red">Check Reports</Button>
</div>
{/if}
<div class="tag-filter-container">
<form>
<div class="tagDisplay">
{#each selectedTags as tagName (tagName)}
<button class="tag" onclick={deleteTag(tagName)} type="button">
{tagName}
<img src={crossUrl} alt="delete" /></button
>
{/each}
<input
type="text"
name="tagInput"
class="tagInput"
bind:value={tagFilter}
bind:this={tagFilterElem}
onfocus={() => {
dropdownVisible = true;
}}
onblur={() => {
dropdownVisible = false;
}}
onkeypress={(event) => {
if (event.key === "Enter") {
event.preventDefault();
const tag = filteredTags[0];
if (tag) addTag(tag)();
}
}}
placeholder="Search by tags..."
/>
{#if dropdownVisible}
<div class="tagDropdown">
{#each filteredTags as avaliableTag (avaliableTag)}
<button
class="avaliableTag"
onclick={addTag(avaliableTag)}
onmousedown={(e) => {
// Keep input focused
e.preventDefault();
e.stopPropagation();
}}
type="button"
>
{avaliableTag}
</button>
{/each}
</div>
{/if}
</div>
</form>
</div>
{#each filteredStudySpaces as studySpace (studySpace.id)}
{@const imgUrl =
studySpace.study_space_images.length > 0
@@ -232,14 +238,11 @@
transform: rotate(45deg);
}
.navActions {
.tag-filter-container {
grid-column: 1 / -1;
display: flex;
height: 100%;
width: 100%;
align-items: center;
padding-left: 2rem;
gap: 1rem;
z-index: 200;
justify-content: center;
margin-bottom: 0.5rem;
}
.time-filter-container {
@@ -262,6 +265,14 @@
border-radius: 0.5rem;
padding: 0.25rem 0.5rem;
color: #eaffeb;
padding: 0.5rem;
}
form {
display: flex;
flex-direction: column;
gap: 0.5rem;
max-width: 32rem;
}
.tagDisplay {
@@ -323,7 +334,6 @@
top: 100%;
left: 50%;
transform: translateX(-50%);
z-index: 1000;
}
.avaliableTag {

View File

@@ -253,11 +253,6 @@
margin-top: 1rem;
text-align: center;
}
.actions {
display: flex;
flex-direction: column;
padding-top: 1rem;
}
.opening-entry {
display: grid;
@@ -277,5 +272,10 @@
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
color: #eaffeb;
.actions {
display: flex;
flex-direction: column;
padding-top: 1rem;
}
</style>

View File

@@ -1,12 +0,0 @@
CREATE OR REPLACE FUNCTION handle_new_user()
RETURNS trigger
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = ''
AS $$
BEGIN
INSERT INTO public.users (id)
VALUES (NEW.id);
RETURN NEW;
END;
$$;

View File

@@ -17,8 +17,8 @@ LANGUAGE plpgsql
SET search_path = ''
AS $$
BEGIN
INSERT INTO public.users (id)
VALUES (NEW.id);
INSERT INTO public.users (id, contact_email)
VALUES (NEW.id, NEW.email);
RETURN NEW;
END;
$$;