feat: added tags on upload and view tweaked navbar #36

Merged
al4423 merged 4 commits from feat/upload-tags into master 2025-06-06 03:16:07 +00:00
8 changed files with 213 additions and 15 deletions
Showing only changes of commit 1f5054efbb - Show all commits

View File

@@ -66,7 +66,13 @@
} }
// Tag // Tag
let filteredTags = $state(availableStudySpaceTags); let tagFilter = $state("");
let tagFilterElem = $state<HTMLInputElement>();
let filteredTags = $derived(
availableStudySpaceTags
.filter((tag) => tag.toLowerCase().includes(tagFilter.toLowerCase()))
.filter((tag) => !studySpaceData.tags.includes(tag))
);
let dropdownVisible = $state(false); let dropdownVisible = $state(false);
function deleteTag(tagName: string) { function deleteTag(tagName: string) {
@@ -75,22 +81,12 @@
}; };
} }
function filterTags() {
const input = document.querySelector(".tagInput") as HTMLInputElement;
const filter = input.value.toLowerCase();
filteredTags = availableStudySpaceTags
.filter((tag) => tag.toLowerCase().includes(filter))
.filter((tag) => !studySpaceData.tags.includes(tag));
}
function addTag(tagName: string) { function addTag(tagName: string) {
return () => { return () => {
if (!studySpaceData.tags.includes(tagName)) { if (!studySpaceData.tags.includes(tagName)) {
studySpaceData.tags.push(tagName); studySpaceData.tags.push(tagName);
} }
const input = document.querySelector(".tagInput") as HTMLInputElement; tagFilter = "";
input.value = "";
filterTags();
}; };
} }
</script> </script>
@@ -131,23 +127,37 @@
type="text" type="text"
name="tagInput" name="tagInput"
class="tagInput" class="tagInput"
oninput={filterTags} bind:value={tagFilter}
bind:this={tagFilterElem}
onfocus={() => { onfocus={() => {
dropdownVisible = true; dropdownVisible = true;
}} }}
onblur={() => { onblur={() => {
setTimeout(() => {
dropdownVisible = false; dropdownVisible = false;
}, 100); // Delay to allow click on tag }}
onkeypress={(event) => {
if (event.key === "Enter") {
const tag = filteredTags[0];
if (tag) addTag(tag)();
}
}} }}
placeholder="Add tags..." placeholder="Add tags..."
/> />
{#if dropdownVisible} {#if dropdownVisible}
<div class="tagDropdown"> <div class="tagDropdown">
{#each filteredTags as avaliableTag (avaliableTag)} {#each filteredTags as avaliableTag (avaliableTag)}
<button class="avaliableTag" onclick={addTag(avaliableTag)} type="button"> <button
{avaliableTag}</button class="avaliableTag"
onclick={addTag(avaliableTag)}
onmousedown={(e) => {
// Keep input focused
e.preventDefault();
e.stopPropagation();
}}
type="button"
> >
{avaliableTag}
</button>
{/each} {/each}
</div> </div>
{/if} {/if}
@@ -258,8 +268,8 @@
flex-wrap: wrap; flex-wrap: wrap;
position: absolute; position: absolute;
background-color: #2e4653; background-color: #2e4653;
box-shadow: 1px 1px 0.5rem rgba(0, 0, 0, 0.5);
border-radius: 0.5rem; border-radius: 0.5rem;
padding: 0.5rem;
overflow-y: auto; overflow-y: auto;
max-height: 10rem; max-height: 10rem;
top: 100%; top: 100%;
@@ -275,6 +285,13 @@
color: #eaffeb; color: #eaffeb;
font-size: 0.9rem; font-size: 0.9rem;
margin: 0%; margin: 0%;
padding: 0%; padding: 0 0.8rem 0.4rem;
}
.avaliableTag:first-child {
padding-top: 0.6rem;
background-color: hsl(201, 26%, 60%);
}
.avaliableTag:last-child {
padding-bottom: 0.6rem;
} }
</style> </style>