diff --git a/frontend/src/components/channel/EditChannelDialog.vue b/frontend/src/components/channel/EditChannelDialog.vue
new file mode 100644
index 0000000..52d5e8b
--- /dev/null
+++ b/frontend/src/components/channel/EditChannelDialog.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
+ Edit Channel
+
+
+ {{ error }}
+
+
+
+
+
+
+
+
+ Cancel
+
+ Save
+
+
+
+
+
+
+
diff --git a/frontend/src/pages/server/index.vue b/frontend/src/pages/server/index.vue
index 9c096c6..66a9ecd 100644
--- a/frontend/src/pages/server/index.vue
+++ b/frontend/src/pages/server/index.vue
@@ -3,12 +3,14 @@ import {storeToRefs} from 'pinia'
import {useChannelStore} from '@/stores/channel'
import {useCategoryStore} from '@/stores/category'
import {computed, onMounted, onUnmounted, ref, watch} from 'vue'
-import {useRoute} from 'vue-router'
+import {useRoute, useRouter} from 'vue-router'
import CreateChannelDialog from '@/components/channel/CreateChannelDialog.vue'
+import EditChannelDialog from '@/components/channel/EditChannelDialog.vue'
import CreateCategoryDialog from '@/components/category/CreateCategoryDialog.vue'
import {type MenuItem, useContextMenu} from '@/composables/useContextMenu'
import {useUserStore} from "@/stores/user.ts";
import {type OrderedResourceType, useServerStore} from "@/stores/server.ts";
+import type {Channel} from '@/stores/channel'
import ChannelPermissionsDialog from '@/components/permissions/ChannelPermissionsDialog.vue'
import {useAuthStore} from '@/stores/auth'
import ServerSettingsDialog from '@/components/server/ServerSettingsDialog.vue'
@@ -20,6 +22,7 @@ const props = defineProps<{
}>()
const route = useRoute()
+const router = useRouter()
const channelStore = useChannelStore()
const categoryStore = useCategoryStore()
const userStore = useUserStore()
@@ -29,6 +32,8 @@ const {openContextMenu} = useContextMenu()
const authStore = useAuthStore()
const showPermissionsDialog = ref(false)
const selectedChannel = ref(null)
+const channelToEdit = ref(null)
+const showEditChannelDialog = ref(false)
const showServerSettings = ref(false)
const serverName = computed(() => serverStore.servers.find(server => server.id === props.serverId)?.name || 'Serveur')
@@ -195,12 +200,26 @@ function onCategoryContextMenu(event: MouseEvent, category: any) {
}
// Right click menu (channel)
-async function openEditDialog(channel: any) {
- console.log("edit dialog clicked")
+function openEditDialog(channel: Channel) {
+ channelToEdit.value = channel
+ showEditChannelDialog.value = true
}
async function deleteChannel(channelId: string) {
- console.log("delete channel clicked")
+ const channel = channelStore.channels.find(item => item.id === channelId)
+ const channelName = channel?.name || 'ce canal'
+ if (!window.confirm(`Supprimer « ${channelName} » ? Cette action est irréversible.`)) return
+
+ try {
+ await channelStore.deleteChannel(channelId)
+ if (route.params.channelId === channelId) {
+ await router.push(`/server/${props.serverId}`)
+ }
+ await refreshServerTree()
+ } catch (error) {
+ console.error('Failed to delete channel:', error)
+ alert(error instanceof Error ? error.message : 'Failed to delete channel')
+ }
}
function onChannelContextMenu(event: MouseEvent, channel: any) {
@@ -342,6 +361,12 @@ function onChannelContextMenu(event: MouseEvent, channel: any) {
@created="refreshServerTree"
/>
+
+
null);
+ throw new Error(error?.message || 'Failed to update channel');
+ }
+
+ const updatedChannel: Channel = await response.json();
+ const index = this.channels.findIndex(channel => channel.id === channelId);
+ if (index >= 0) {
+ updatedChannel.unread_count ??= this.channels[index].unread_count ?? 0;
+ this.channels[index] = updatedChannel;
+ }
+ return updatedChannel;
+ } catch (err) {
+ this.error = err instanceof Error ? err.message : 'Unknown error';
+ throw err;
+ } finally {
+ this.loading = false;
+ }
+ },
+ async deleteChannel(channelId: string) {
+ this.loading = true;
+ this.error = null;
+ try {
+ const response = await useApi().delete(`/channels/${channelId}`);
+ if (!response.ok) {
+ const error = await response.json().catch(() => null);
+ throw new Error(error?.message || 'Failed to delete channel');
+ }
+ this.channels = this.channels.filter(channel => channel.id !== channelId);
+ } catch (err) {
+ this.error = err instanceof Error ? err.message : 'Unknown error';
+ throw err;
+ } finally {
+ this.loading = false;
+ }
+ },
reset() {
this.channels = [];
this.loading = false;