From 5a5de81bec8f18ae0f27d528d862e6cf1438b54a Mon Sep 17 00:00:00 2001
From: Leonardo Bishop <me@leonardobishop.com>
Date: Sun, 24 Aug 2025 17:51:06 +0100
Subject: Add dialog for conference deletion

---
 web/pages/conferences.vue | 33 ++++++++++++++++++++++++++-------
 1 file changed, 26 insertions(+), 7 deletions(-)

(limited to 'web/pages/conferences.vue')

diff --git a/web/pages/conferences.vue b/web/pages/conferences.vue
index 993bc66..511de95 100644
--- a/web/pages/conferences.vue
+++ b/web/pages/conferences.vue
@@ -24,6 +24,12 @@ const config = useRuntimeConfig();
 
 const status = ref('idle' as 'loading' | 'idle')
 
+const refConfirmDeleteDialog = ref<typeof Dialog>();
+
+const deleteConferenceId = ref(null as number | null)
+const deleteConferenceName = ref(null as string | null)
+const deleteAction = ref(false);
+
 const fetchConferences = () => {
   status.value = 'loading'
   $api(config.public.baseURL + '/conference', {
@@ -42,22 +48,22 @@ const fetchConferences = () => {
   })
 }
 
-const deleteConference = (id: number) => {
-  // todo make this better
+const deleteConference = () => {
   $api(config.public.baseURL + '/conference', {
     method: 'DELETE',
     body: {
-      id: id
+      id: deleteConferenceId.value
     },
     onResponse: ({ response }) => {
       if (!response.ok) {
         errorStore.setError(response._data.message || 'An unknown error occurred');
       }
+      fetchConferences()
     },
   })
 }
 
-const selectConference = async (c) => {
+const selectConference = async (c: any) => {
   setting.value = true
   conferenceStore.id = c.id
   try {
@@ -77,18 +83,22 @@ onMounted(fetchConferences)
   <template v-if="!setting">
     <Panel title="Conferences" :icon="MapPin">
       <span class="loading-text" v-if="status === 'loading'"><Spinner color="var(--color-text-muted)" />Fetching conferences...</span>
-      <div class="conference-list" v-if="conferences.length > 0 && status !== 'loading'">
+      <div class="conference-list" v-if="conferences?.length > 0 && status !== 'loading'">
         <template v-for="conference of conferences">
           <span class="title">{{ conference.title }}</span>
           <span>{{ conference.city }}</span>
           <span>{{ conference.venue }}</span>
           <span class="actions">
-            <Button v-if="authStore.admin" kind="secondary" @click="() => { deleteConference(conference.id) }">Delete</Button>
+            <Button v-if="authStore.admin" kind="secondary" @click="() => { 
+              deleteConferenceId = conference.id
+              deleteConferenceName = conference.title
+              refConfirmDeleteDialog!.show()
+            }">Delete</Button>
             <Button @click="() => { selectConference(conference) }">Select</Button>
           </span>
         </template>
       </div>
-      <p v-if="conferences.length == 0 && status !== 'loading'">
+      <p v-if="(conferences == null || conferences?.length == 0) && status !== 'loading'">
         There are no conferences to display.
       </p>
     </Panel>
@@ -102,6 +112,15 @@ onMounted(fetchConferences)
       <span class="loading-text"><Spinner color="var(--color-text-muted)" />Setting conference...</span>
     </div>
   </template>
+
+  <Dialog ref="refConfirmDeleteDialog" title="Delete conference" :confirmation="true" @submit="deleteConference" :fit-contents="true">
+    <span>Are you sure you want to delete "{{ deleteConferenceName }}"?</span>
+    <span>All favourites for all users for this conference will be lost and irrecoverable.</span>
+    <template v-slot:actions>
+      <Button kind="secondary" type="button" @click="refConfirmDeleteDialog!.close()">Cancel</Button>
+      <Button kind="danger" type="submit" :loading="deleteAction">Delete</Button>
+    </template>
+  </Dialog>
 </template>
 
 <style>
-- 
cgit v1.2.3-70-g09d2

