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 @@ + + + + + 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;