diff --git a/src/app.css b/src/app.css index 80bc59b..3e8f3fa 100644 --- a/src/app.css +++ b/src/app.css @@ -5,27 +5,27 @@ @custom-variant dark (&:where(.dark, .dark *)); @theme { - --color-primary-50: #fff5f2; - --color-primary-100: #fff1ee; - --color-primary-200: #ffe4de; - --color-primary-300: #ffd5cc; - --color-primary-400: #ffbcad; - --color-primary-500: #fe795d; - --color-primary-600: #ef562f; - --color-primary-700: #eb4f27; - --color-primary-800: #cc4522; - --color-primary-900: #a5371b; + --color-primary-50: #f0f9ff; + --color-primary-100: #e0f2fe; + --color-primary-200: #bae6fd; + --color-primary-300: #7dd3fc; + --color-primary-400: #38bdf8; + --color-primary-500: #0ea5e9; + --color-primary-600: #0284c7; + --color-primary-700: #0369a1; + --color-primary-800: #075985; + --color-primary-900: #0c4a6e; - --color-secondary-50: #f0f9ff; - --color-secondary-100: #e0f2fe; - --color-secondary-200: #bae6fd; - --color-secondary-300: #7dd3fc; - --color-secondary-400: #38bdf8; - --color-secondary-500: #0ea5e9; - --color-secondary-600: #0284c7; - --color-secondary-700: #0369a1; - --color-secondary-800: #075985; - --color-secondary-900: #0c4a6e; + --color-secondary-50: #fff5f2; + --color-secondary-100: #fff1ee; + --color-secondary-200: #ffe4de; + --color-secondary-300: #ffd5cc; + --color-secondary-400: #ffbcad; + --color-secondary-500: #fe795d; + --color-secondary-600: #ef562f; + --color-secondary-700: #eb4f27; + --color-secondary-800: #cc4522; + --color-secondary-900: #a5371b; } @source '../node_modules/flowbite-svelte/dist'; diff --git a/src/lib/components/EventForm.svelte b/src/lib/components/EventForm.svelte index d9b4551..86d03b5 100644 --- a/src/lib/components/EventForm.svelte +++ b/src/lib/components/EventForm.svelte @@ -13,7 +13,7 @@ let newDish = $state(''); let votingSystem: string = $state(votingSystems[0].id); - const isFormValid = $derived(eventName.trim() !== '' && dishes.length > 0); + const isFormValid = $derived(eventName.trim() !== '' && dishes.length > 1); const addDish = () => { if (newDish.trim()) { @@ -49,7 +49,7 @@ }; -Create an Event +Host an Event
@@ -67,7 +67,7 @@ onkeydown={handleKeyPressOnDishInput} />
- +
{#if dishes.length > 0} @@ -93,5 +93,5 @@ {/each} - +
diff --git a/src/lib/components/SavedBallotList.svelte b/src/lib/components/SavedBallotList.svelte new file mode 100644 index 0000000..bf4c2dc --- /dev/null +++ b/src/lib/components/SavedBallotList.svelte @@ -0,0 +1,74 @@ + + +{#snippet ballotItem(ballot: BallotItem)} + + {ballot.eventName} + +{/snippet} + +{#if ballots.length === 0} +

No past ballots found.

+{:else} + {#if openBallots.length} + + Open + {#each openBallots as ballot (ballot.id)} + {@render ballotItem(ballot)} + {/each} + + {/if} + {#if closedBallots.length} + + Closed + {#each closedBallots.slice(0, 5) as ballot (ballot.id)} + {@render ballotItem(ballot)} + {/each} + + {/if} +{/if} diff --git a/src/lib/components/SavedEventList.svelte b/src/lib/components/SavedEventList.svelte new file mode 100644 index 0000000..2b6ca3b --- /dev/null +++ b/src/lib/components/SavedEventList.svelte @@ -0,0 +1,79 @@ + + +{#snippet eventItem(event: EventItem)} + + {event.name} + +{/snippet} + +{#if events.length === 0} +

No past events found.

+{:else} + {#if openEvents.length} + + Open + {#each openEvents as event (event.id)} + {@render eventItem(event)} + {/each} + + {/if} + {#if closedEvents.length} + + Closed + {#each closedEvents.slice(0, 5) as event (event.id)} + {@render eventItem(event)} + {/each} + + {/if} +{/if} diff --git a/src/lib/storage/storage.ts b/src/lib/storage/storage.ts index 739b06b..db69148 100644 --- a/src/lib/storage/storage.ts +++ b/src/lib/storage/storage.ts @@ -35,6 +35,14 @@ export class StorageManager { this.data = await this.loadStorage(); }; + hasBallots() { + return !!this.data.ballots; + } + + hasEvents() { + return !!this.data.events; + } + getBallot(ballotID: number) { if (!this.data.ballots) throw new ErrorBallotNotFound(ballotID); if (ballotID in this.data.ballots) return this.data.ballots[ballotID]; @@ -66,6 +74,11 @@ export class StorageManager { this.saveStorage(this.data); } + deleteBallot(ballotID: number) { + if (this.data.ballots) delete this.data.ballots[ballotID]; + this.saveStorage(this.data); + } + saveEvent(eventID: number, name: string, token: string) { if (!this.data.events) { this.data.events = {}; @@ -74,6 +87,11 @@ export class StorageManager { this.saveStorage(this.data); } + deleteEvent(eventID: number) { + if (this.data.events) delete this.data.events[eventID]; + this.saveStorage(this.data); + } + async migrate(data: StorageData): Promise> { let migratedData: StorageData = { ...data }; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 9e07075..2a4ee15 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,6 +1,9 @@
@@ -14,5 +17,11 @@
+ {#if storage.hasEvents() || storage.hasEvents()} + + +
or + {/if} +
diff --git a/src/routes/event/[id=eventID]/components/registration.svelte b/src/routes/event/[id=eventID]/components/registration.svelte index 51c5835..dfa99d8 100644 --- a/src/routes/event/[id=eventID]/components/registration.svelte +++ b/src/routes/event/[id=eventID]/components/registration.svelte @@ -79,6 +79,6 @@ {/if} - diff --git a/src/routes/event/[id=eventID]/components/voting.svelte b/src/routes/event/[id=eventID]/components/voting.svelte index dcc4555..abc25f9 100644 --- a/src/routes/event/[id=eventID]/components/voting.svelte +++ b/src/routes/event/[id=eventID]/components/voting.svelte @@ -56,5 +56,5 @@ - + diff --git a/src/routes/register/+page.svelte b/src/routes/register/+page.svelte index a8de8df..677a8a2 100644 --- a/src/routes/register/+page.svelte +++ b/src/routes/register/+page.svelte @@ -82,7 +82,7 @@
-
diff --git a/src/routes/user/dashboard/+page.svelte b/src/routes/user/dashboard/+page.svelte new file mode 100644 index 0000000..140a685 --- /dev/null +++ b/src/routes/user/dashboard/+page.svelte @@ -0,0 +1,20 @@ + + +
+ Your Dashboard + +
+ Events + +
+
+ Ballots + +
+ + +