diff --git a/frontend/src/components/common/CommandPalette.vue b/frontend/src/components/common/CommandPalette.vue index b26b165..11f051e 100644 --- a/frontend/src/components/common/CommandPalette.vue +++ b/frontend/src/components/common/CommandPalette.vue @@ -117,6 +117,8 @@ const sessionStore = useSessionStore(); const emit = defineEmits<{ (e: "open-import"): void; + (e: "open-settings"): void; + (e: "open-new-connection", protocol?: "ssh" | "rdp"): void; }>(); const actions: PaletteAction[] = [ @@ -125,7 +127,7 @@ const actions: PaletteAction[] = [ label: "New SSH Connection", icon: ``, handler: () => { - // TODO: Open new connection dialog for SSH + emit("open-new-connection", "ssh"); close(); }, }, @@ -134,7 +136,7 @@ const actions: PaletteAction[] = [ label: "New RDP Connection", icon: ``, handler: () => { - // TODO: Open new connection dialog for RDP + emit("open-new-connection", "rdp"); close(); }, }, @@ -152,7 +154,7 @@ const actions: PaletteAction[] = [ label: "Settings", icon: ``, handler: () => { - // TODO: Open settings dialog + emit("open-settings"); close(); }, }, diff --git a/frontend/src/components/common/SettingsModal.vue b/frontend/src/components/common/SettingsModal.vue new file mode 100644 index 0000000..84c6eb4 --- /dev/null +++ b/frontend/src/components/common/SettingsModal.vue @@ -0,0 +1,314 @@ + + + diff --git a/frontend/src/layouts/MainLayout.vue b/frontend/src/layouts/MainLayout.vue index 837ad6c..2182720 100644 --- a/frontend/src/layouts/MainLayout.vue +++ b/frontend/src/layouts/MainLayout.vue @@ -5,9 +5,60 @@ class="h-10 flex items-center justify-between px-4 bg-[var(--wraith-bg-secondary)] border-b border-[var(--wraith-border)] shrink-0" style="--wails-draggable: drag" > - - WRAITH - +
+ + WRAITH + + + +
+ +
+ +
+ +
+ +
+ +
+
+
@@ -60,6 +111,7 @@ @@ -137,13 +189,24 @@ - + + + + + + +
@@ -164,6 +227,8 @@ import EditorWindow from "@/components/editor/EditorWindow.vue"; import CommandPalette from "@/components/common/CommandPalette.vue"; import ThemePicker from "@/components/common/ThemePicker.vue"; import ImportDialog from "@/components/common/ImportDialog.vue"; +import SettingsModal from "@/components/common/SettingsModal.vue"; +import ConnectionEditDialog from "@/components/connections/ConnectionEditDialog.vue"; import CopilotPanel from "@/components/copilot/CopilotPanel.vue"; import type { ThemeDefinition } from "@/components/common/ThemePicker.vue"; import type { SidebarTab } from "@/components/sidebar/SidebarToggle.vue"; @@ -184,8 +249,38 @@ const editorFile = ref<{ content: string; path: string; sessionId: string } | nu const commandPalette = ref | null>(null); const themePicker = ref | null>(null); const importDialog = ref | null>(null); +const settingsModal = ref | null>(null); +const connectionEditDialog = ref | null>(null); const statusBar = ref | null>(null); +/** File menu dropdown state. */ +const showFileMenu = ref(false); + +/** Close the file menu after a short delay (allows click events to fire first). */ +function closeFileMenuDeferred(): void { + setTimeout(() => { showFileMenu.value = false; }, 150); +} + +/** Handle file menu item clicks. */ +function handleFileMenuAction(action: string): void { + showFileMenu.value = false; + switch (action) { + case "new-connection": + connectionEditDialog.value?.openNew(); + break; + case "import": + importDialog.value?.open(); + break; + case "settings": + settingsModal.value?.open(); + break; + case "exit": + // TODO: Replace with Wails runtime.Quit() + window.close(); + break; + } +} + /** Handle file open from SFTP sidebar -- loads mock content for now. */ function handleOpenFile(entry: FileEntry): void { if (!sessionStore.activeSession) return;