-
Add New Event
+
+ Add New Event
+
Event Title *
-
-
-
+
+
+
Short Description
-
-
-
+
+
+
Full Description
-
-
-
+
+
+
Location
-
-
-
+
+
+
-
+
Start Date & Time *
-
-
-
+
+
+
-
End Date & Time *
-
-
-
+
+
+
-
-
-
-
-
- Allow Volunteers
-
-
-
- Allow Attendees to Register
-
-
+
+
+
+ Allow Volunteers
+
+
+
+ Allow Attendees to Register
+
+
-
- Event Images
-
-
+
+ Event Images
+
+
-
-
-
Image Previews:
-
-
+
-
-
-
-
-
+ Cancel
+
+
+ {{ isSaving ? "Creating..." : "Create Event" }}
+
-
-
- Cancel
-
- {{ isSaving ? 'Creating...' : 'Create Event' }}
-
-
-
\ No newline at end of file
+
diff --git a/app/components/event/RSVPModal.vue b/app/components/event/RSVPModal.vue
new file mode 100644
index 0000000..002fe50
--- /dev/null
+++ b/app/components/event/RSVPModal.vue
@@ -0,0 +1,96 @@
+
+
+
+
+
+ {{ isVolunteer ? 'Sign Up as Volunteer' : 'Register to Attend' }}
+
+
+
+ {{ isVolunteer
+ ? 'Fill in your details to volunteer at this event.'
+ : 'Fill in your details to register as an attendee.' }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ error }}
+
+
+
+
+ Cancel
+
+
+ {{ isVolunteer ? 'Sign Up' : 'Register' }}
+
+
+
+
diff --git a/app/components/event/RSVPStats.vue b/app/components/event/RSVPStats.vue
new file mode 100644
index 0000000..0bbbbf8
--- /dev/null
+++ b/app/components/event/RSVPStats.vue
@@ -0,0 +1,148 @@
+
+
+
+
+
+ Registrations
+
+
+
+
+
+
+
+
+
+
+ {{ rsvpData?.volunteerCount ?? 0 }}
+
+
+ Volunteers
+
+
+
+
+
+
+
+
+
+ No volunteers yet
+
+
+
+ {{ volunteer.name }}
+
+
+ {{ volunteer.email }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ rsvpData?.attendeeCount ?? 0 }}
+
+
+ Attendees
+
+
+
+
+
+
+
+
+
+ No attendees yet
+
+
+
+ {{ attendee.name }}
+
+
+ {{ attendee.email }}
+
+
+
+
+
+
+
diff --git a/app/components/event/Tile.vue b/app/components/event/Tile.vue
index 576600e..eb0b8e7 100644
--- a/app/components/event/Tile.vue
+++ b/app/components/event/Tile.vue
@@ -1,36 +1,66 @@
+
-
-
+
+
+
+
📅
+
-
-
- {{ title }}
+
+
+ {{ title }}
-
-
- {{ subtitle }}
+
+ {{ subtitle }}
-
+
-
+
-
\ No newline at end of file
+
diff --git a/app/components/map/Interactive.client.vue b/app/components/map/Interactive.client.vue
index 7b1dbca..f2ae87d 100644
--- a/app/components/map/Interactive.client.vue
+++ b/app/components/map/Interactive.client.vue
@@ -4,19 +4,19 @@
:center="center"
:zoom="zoom"
:attribution-control="false"
- >
-
+ >
+
+ />
diff --git a/app/components/nav/Bottom.vue b/app/components/nav/Bottom.vue
index e4dab35..9cb1226 100644
--- a/app/components/nav/Bottom.vue
+++ b/app/components/nav/Bottom.vue
@@ -1,41 +1,42 @@
+
-
-
-
-
-
+
+
+
+
+
diff --git a/app/components/nav/SecondaryTop.vue b/app/components/nav/SecondaryTop.vue
index f36e207..fd60c29 100644
--- a/app/components/nav/SecondaryTop.vue
+++ b/app/components/nav/SecondaryTop.vue
@@ -3,21 +3,26 @@ const router = useRouter()
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/nav/Top.vue b/app/components/nav/Top.vue
index 5e0bcfc..4cfced2 100644
--- a/app/components/nav/Top.vue
+++ b/app/components/nav/Top.vue
@@ -1,10 +1,10 @@
-
+
-
+ @click="onSettingsClick"
+ >
+
@@ -40,9 +45,13 @@ const toggleDarkMode = () => {
-
+ aria-label="Inbox"
+ @click="onInboxClick"
+ >
+
@@ -51,21 +60,27 @@ const toggleDarkMode = () => {
color="neutral"
variant="ghost"
aria-label="Toggle dark mode"
- @click="toggleDarkMode">
-
+ @click="toggleDarkMode"
+ >
+
-
+ @click="onLogout"
+ >
+
-
\ No newline at end of file
+
diff --git a/app/layouts/default.vue b/app/layouts/default.vue
index 3e9af13..d3f49d0 100644
--- a/app/layouts/default.vue
+++ b/app/layouts/default.vue
@@ -2,9 +2,9 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/app/layouts/secondary.vue b/app/layouts/secondary.vue
index 62c390b..eae5c8c 100644
--- a/app/layouts/secondary.vue
+++ b/app/layouts/secondary.vue
@@ -1,7 +1,7 @@
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/app/lib/relativeFetch.ts b/app/lib/relativeFetch.ts
index b6e556b..6eb5dfb 100644
--- a/app/lib/relativeFetch.ts
+++ b/app/lib/relativeFetch.ts
@@ -4,8 +4,9 @@ import { useFetch } from '#app'
export const relativeFetch = ((url: string, opts?: any) => {
try {
if (url.startsWith('http')) url = new URL(url).pathname
- } catch {
+ }
+ catch {
// ignore invalid URLs
}
return useFetch(url, opts)
-}) as any
\ No newline at end of file
+}) as any
diff --git a/app/middleware/auth.ts b/app/middleware/auth.ts
index 2997b5d..4aff9c2 100644
--- a/app/middleware/auth.ts
+++ b/app/middleware/auth.ts
@@ -4,16 +4,17 @@ export default defineNuxtRouteMiddleware(async (to) => {
try {
const data = await $fetch('/api/auth/get-session', {
- cache: 'no-store', // ← forces fresh request every time
+ cache: 'no-store', // ← forces fresh request every time
headers: {
- 'Cache-Control': 'no-cache'
- }
+ 'Cache-Control': 'no-cache',
+ },
})
-
+
if (!data?.session) {
return navigateTo('/auth/login')
}
- } catch {
+ }
+ catch {
return navigateTo('/auth/login')
}
-})
\ No newline at end of file
+})
diff --git a/app/pages/admin/donations.vue b/app/pages/admin/donations.vue
new file mode 100644
index 0000000..fac075c
--- /dev/null
+++ b/app/pages/admin/donations.vue
@@ -0,0 +1,344 @@
+
+
+
+
+
+
+
+ Donation Funds
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ fund.name }}
+
+
+
+
+
+
+
+
+
+
+ {{ formatShort(fund.startDate) }} - {{ formatShort(fund.endDate) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/pages/admin/index.vue b/app/pages/admin/index.vue
index df65126..5c63229 100644
--- a/app/pages/admin/index.vue
+++ b/app/pages/admin/index.vue
@@ -1,130 +1,143 @@
-
-
-
-
Welcome back, Admin!
+
+
+
+
+ Welcome back, Admin!
+
+
+
+
+
+
-
-
-
-
-
-
-
{{ kpi.label }}
-
{{ kpi.value }}
-
-
-
-
-
-
-
-
-
-
-
-
- {{ feature.label }}
-
-
- {{ feature.description }}
-
-
-
- Manage →
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+ {{ kpi.label }}
+
+
+ {{ kpi.value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ feature.label }}
+
+
+
+ {{ feature.description }}
+
+
+
+ Manage →
+
+
+
+
+
+
diff --git a/app/pages/admin/volunteer-logs/index.vue b/app/pages/admin/volunteer-logs/index.vue
index b1d7fa4..16a1587 100644
--- a/app/pages/admin/volunteer-logs/index.vue
+++ b/app/pages/admin/volunteer-logs/index.vue
@@ -1,218 +1,340 @@
-
-
-
-
-
- Volunteer Log Approvals
-
-
-
-
-
- {{ tab.label }}
-
-
-
-
-
-
+
+
+
+ Volunteer Log Approvals
+
+
+
+
+
+ {{ tab.label }}
+
+
+
+
+
+
+
+
+
+
+ {{ error }}
+
+
+
+
+ No {{ activeTab.toLowerCase() }} logs found.
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+ {{
+ item.event
+ }}
+ {{
+ item.date
+ }}
+
+
+
+
+ {{ item.hours }} hrs
+
+
+
+ ▾
+
+
+
+
+
+
+
+
+
+ Event:
+ {{ item.event }}
+
+
+ Date:
+ {{ item.date }}
+
+
+ Hours:
+ {{ item.hours }}
+
+
+ Status:
+ {{ item.status }}
+
+
+ Comment:
+ {{ item.comment }}
+
+
+
+
+
+
+
+ Approve
+
+
+
+ Reject
+
+
+
+
+
+ {{
+ actionType === "reject"
+ ? "Rejection reason"
+ : "Comment (optional)"
+ }}
+ *
+
+
+
+
+
+
+ Cancel
+
+
+
-
-
-
-
-
-
{{ item.label }}
-
- {{ item.event }}
- {{ item.date }}
-
-
-
-
- {{ item.hours }} hrs
-
-
-
- ▾
-
-
-
-
-
-
-
-
-
Event: {{ item.event }}
-
Date: {{ item.date }}
-
Hours: {{ item.hours }}
-
Status: {{ item.status }}
-
Notes: {{ item.notes }}
-
Rejection Reason: {{ item.rejectReason }}
-
-
-
-
-
-
- Approve
-
-
-
- Reject
-
-
-
-
-
- Rejection reason *
-
-
-
-
-
-
- Cancel
-
-
-
- Confirm Reject
-
-
-
-
-
-
-
+ {{
+ actionType === "reject"
+ ? "Confirm Reject"
+ : "Confirm Approve"
+ }}
+
+
+
+
-
+
+
+
-
\ No newline at end of file
+
+
diff --git a/app/pages/auth/login.vue b/app/pages/auth/login.vue
index 466c52f..03edc3f 100644
--- a/app/pages/auth/login.vue
+++ b/app/pages/auth/login.vue
@@ -1,75 +1,81 @@
-
-
-
- Don't have an account?
- Sign up .
-
-
- Forgot password?
-
-
-
-
-
- By signing in, you agree to our
- Terms of Service .
-
-
-
+
+
+
+ Don't have an account?
+ Sign up .
+
+
+ Forgot password?
+
+
+
+
+
+ By signing in, you agree to our
+ Terms of Service .
+
+
+
diff --git a/app/pages/auth/sign-up.vue b/app/pages/auth/sign-up.vue
index ec42c46..b268867 100644
--- a/app/pages/auth/sign-up.vue
+++ b/app/pages/auth/sign-up.vue
@@ -1,71 +1,86 @@
-
-
+
-
- Already a Volunteer? Log In .
-
-
- Forgot password?
-
-
-
-
-
- By signing in, you agree to our Terms of Service .
-
-
-
+ @submit="onSubmit"
+ >
+
+ Already a Volunteer? Log In .
+
+
+ Forgot password?
+
+
+
+
+
+ By signing in, you agree to our Terms of Service .
+
+
+
diff --git a/app/pages/events/[id].vue b/app/pages/events/[id].vue
index 6d98cae..0eb02c5 100644
--- a/app/pages/events/[id].vue
+++ b/app/pages/events/[id].vue
@@ -1,222 +1,175 @@
-
-
+
-
-
Loading event...
+
+
+ Loading event...
+
-
+
-
-
Event Not Found
-
The event you're looking for doesn't exist.
-
+
+ Event Not Found
+
+
+ The event you're looking for doesn't exist.
+
+
@@ -226,40 +179,49 @@ const backNavigate = computed(() => {
-
-
+
+
-
+
-
-
+
+
Edit Event
-
+
Cancel
{ await saveChanges(); await uploadNewImages(); }"
+ @click="
+ async () => {
+ await saveChanges();
+ }
+ "
>
Save Changes
@@ -269,120 +231,130 @@ const backNavigate = computed(() => {
-
-
-
+
-
{{ event.title }}
-
+
+ {{ event.title }}
+
-
-
+
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Add Event Images
-
-
-
-
-
-
+
+
+ Event Images
+
+
+
+
-
+
-
Date & Time
-
+
+ Date & Time
+
+
{{ formattedDate }}
-
+
- Start
-
+ Start
+
+
- End
-
+ End
+
+
-
-
-
+
-
Location
-
+
+ Location
+
+
{{ event.location.address }}
{
-
-
-
+
+
+
-
+
-
About This Event
-
+
+ About This Event
+
+
{{ event.description }}
-
+
- This event is part of our Mobile Clinic program. Please visit the clinic for health services and support.
-
+ This event is part of our Mobile Clinic program. Please
+ visit the clinic for health services and support.
+
-
-
Event Settings
-
+
+
+ Event Settings
+
+
-
+
-
+
-
Volunteer Sign-ups
-
Allow people to volunteer for this event
+
+ Volunteer Sign-ups
+
+
+ Allow people to volunteer for this
+ event?
+
-
-
+
+
-
+
-
+
-
Attendee Registration
-
Allow people to register as attendees
+
+ Attendee Registration
+
+
+ Allow people to register as attendees?
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+ Mobile Clinic
+
+
+ Will this event have a mobile clinic?
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
Sign Up as Volunteer
-
{
size="xl"
block
icon="i-lucide-ticket"
+ @click="openRsvpModal(false)"
>
Register to Attend
+
+
+
+
-
\ No newline at end of file
+
diff --git a/app/pages/events/index.vue b/app/pages/events/index.vue
index 7f1df5f..759e85b 100644
--- a/app/pages/events/index.vue
+++ b/app/pages/events/index.vue
@@ -1,50 +1,160 @@
-
Events
-
-
-
-
-
-
-
- Upcoming Events
-
-
-
-
-
-
-
-
-
+
+ Events
+
+
+
+
+
+
+
+ {{ eventsOnSelectedDate.length > 0 ? 'Events on this day' : 'Upcoming Events' }}
+
+
+
+ No upcoming events
+
+
+
+
+
-
diff --git a/app/pages/events/manage.vue b/app/pages/events/manage.vue
index 13cfce6..52a3f39 100644
--- a/app/pages/events/manage.vue
+++ b/app/pages/events/manage.vue
@@ -1,5 +1,5 @@
-
-
EVENTS MANAGEMENT
-
PAST EVENTS
-
-
+
+ PAST EVENTS
+
+
+
No past events
-
+
-
📅
-
@@ -110,7 +126,9 @@ function getEventDate(event) {
-
UPCOMING EVENTS
+
+ UPCOMING EVENTS
+
-
+
No upcoming events. Click "Add" to create one!
-
+
-
- 📅
+ 📅
-
-
-
{{ event.title }}
-
{{ event.location }}
-
{{ getEventDate(event) }}
+
+
+ {{ event.title }}
+
+
+ {{ event.location.address }}
+
+
+ {{ getEventDate(event) }}
+
@@ -154,16 +192,20 @@ function getEventDate(event) {
-
-
\ No newline at end of file
+
diff --git a/app/pages/inbox.vue b/app/pages/inbox.vue
index 0e9c8c7..2a04961 100644
--- a/app/pages/inbox.vue
+++ b/app/pages/inbox.vue
@@ -1,68 +1,74 @@
-
-
-
-
-
-
-
-
-
-
-
- {{ item.label }}
-
-
-
- {{ item.time }}
-
-
-
-
- {{ item.content }}
-
-
-
-
-
-
-
-
- {{ item.content }}
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+ {{ item.time }}
+
+
+
+
+ {{ item.content }}
+
+
+
+
+
+
+
+ {{ item.content }}
+
+
+
+
+
+
-
diff --git a/app/pages/index.vue b/app/pages/index.vue
index 747cfb9..a4a121c 100644
--- a/app/pages/index.vue
+++ b/app/pages/index.vue
@@ -1,9 +1,22 @@
-
-
-
+
+
+
-
+
@@ -104,44 +145,93 @@ const services = ref([
-
UPCOMING EVENTS
+
+ UPCOMING EVENTS
+