1
0
Fork 0
mirror of https://github.com/seanmorley15/AdventureLog.git synced 2025-07-23 06:49:37 +02:00

activity type overhaul

This commit is contained in:
Sean Morley 2024-07-17 21:51:27 -04:00
parent 2b3c96bb8d
commit f03c338935
2 changed files with 92 additions and 0 deletions

View file

@ -0,0 +1,89 @@
<script lang="ts">
import { onMount } from 'svelte';
export let activities: string[] | undefined | null;
let allActivities: string[] = [];
let inputVal: string = '';
if (activities == null || activities == undefined) {
activities = [];
}
onMount(async () => {
let res = await fetch('/api/activity-types/types/');
let data = await res.json();
if (data) {
allActivities = data;
}
});
function addActivity() {
if (inputVal && activities) {
if (!activities.includes(inputVal) && allActivities.includes(inputVal)) {
activities = [...activities, inputVal];
inputVal = '';
}
}
}
function removeActivity(item: string) {
if (activities) {
activities = activities.filter((activity) => activity !== item);
}
}
$: filteredItems = allActivities.filter(function (activity) {
return (
activity.toLowerCase().includes(inputVal.toLowerCase()) &&
(!activities || !activities.includes(activity))
);
});
</script>
<div class="relative">
<input
type="text"
class="input input-bordered w-full"
placeholder="Add an activity"
bind:value={inputVal}
on:keydown={(e) => {
if (e.key === 'Enter') {
e.preventDefault();
addActivity();
}
}}
/>
{#if inputVal && filteredItems.length > 0}
<ul class="absolute z-10 w-full bg-base-100 shadow-lg max-h-60 overflow-auto">
{#each filteredItems as item}
<!-- svelte-ignore a11y-click-events-have-key-events -->
<!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
<li
class="p-2 hover:bg-base-200 cursor-pointer"
on:click={() => {
inputVal = item;
addActivity();
}}
>
{item}
</li>
{/each}
</ul>
{/if}
</div>
<div class="mt-2">
<ul class="space-y-2">
{#if activities}
{#each activities as activity}
<li class="flex items-center justify-between bg-base-200 p-2 rounded">
{activity}
<button class="btn btn-sm btn-error" on:click={() => removeActivity(activity)}>
Remove
</button>
</li>
{/each}
{/if}
</ul>
</div>

View file

@ -27,6 +27,7 @@
import Earth from '~icons/mdi/earth';
import Wikipedia from '~icons/mdi/wikipedia';
import ImageFetcher from './ImageFetcher.svelte';
import ActivityComplete from './ActivityComplete.svelte';
onMount(async () => {
modal = document.getElementById('my_modal_1') as HTMLDialogElement;
@ -213,9 +214,11 @@
type="text"
id="activity_types"
name="activity_types"
hidden
bind:value={adventureToEdit.activity_types}
class="input input-bordered w-full max-w-xs mt-1"
/>
<ActivityComplete bind:activities={adventureToEdit.activity_types} />
</div>
<div class="mb-2">
<label for="image">Image </label><br />