From 9253e8e408a1b71226925b957e73056a00a47f9a Mon Sep 17 00:00:00 2001 From: upsiflu Date: Thu, 19 Dec 2024 20:14:58 +0100 Subject: [PATCH] fix(modals): operate global modals through central ui state (vuex) --- front/src/store/ui.ts | 27 ++++- front/src/ui/App.vue | 16 +-- front/src/ui/components/Sidebar.vue | 17 +-- front/src/ui/components/UserMenu.vue | 53 ++------- front/src/ui/modals/Languages.vue | 51 +++++++++ .../modals/Shortcuts.vue} | 105 ++++++++++-------- 6 files changed, 154 insertions(+), 115 deletions(-) create mode 100644 front/src/ui/modals/Languages.vue rename front/src/{components/ShortcutsModal.vue => ui/modals/Shortcuts.vue} (63%) diff --git a/front/src/store/ui.ts b/front/src/store/ui.ts index f7ad005df..4c526cbad 100644 --- a/front/src/store/ui.ts +++ b/front/src/store/ui.ts @@ -47,6 +47,7 @@ export interface State { width: number } pageTitle: null + modalsOpen: Set notifications: Record websocketEventsHandlers: Record @@ -85,7 +86,8 @@ const store: Module = { 'user_request.created': {}, Listen: {} }, - pageTitle: null + pageTitle: null, + modalsOpen: new Set([]) }, getters: { showInstanceSupportMessage: (state, getters, rootState) => { @@ -149,7 +151,9 @@ const store: Module = { } else { return 'large' } - } + }, + modalShown: (state, key) => + state.modalsOpen.has(key) }, mutations: { addWebsocketEventHandler: (state, { eventName, id, handler }: { eventName: WebSocketEventName, id: string, handler: (event: any) => void}) => { @@ -190,6 +194,25 @@ const store: Module = { removeMessage (state, key) { state.messages.splice(state.messages.findIndex(message => message.key === key), 1) }, + + addModal (state, key) { + state.modalsOpen.add(key) + console.log("Added", key, "->", state.modalsOpen) + }, + removeModal (state, key) { + state.modalsOpen.delete(key) + console.log("Removed", key, "->", state.modalsOpen) + }, + toggleModal (state, key) { + state.modalsOpen.has(key) ? state.modalsOpen.delete(key) : state.modalsOpen.add(key) + console.log("Toggled", key, "->", state.modalsOpen) + }, + setModal (state, [key, isOpen]:[string, boolean]) { + console.log("Set", key, "was:", state.modalsOpen.has(key) ) + isOpen ? state.modalsOpen.add(key) : state.modalsOpen.delete(key) + console.log("Set", key, isOpen, "->", state.modalsOpen) + }, + notifications (state, { type, count }: { type: NotificationsKey, count: number }) { state.notifications[type] = count }, diff --git a/front/src/ui/App.vue b/front/src/ui/App.vue index dc93c7718..d0ae9b588 100644 --- a/front/src/ui/App.vue +++ b/front/src/ui/App.vue @@ -1,27 +1,27 @@ diff --git a/front/src/ui/components/Sidebar.vue b/front/src/ui/components/Sidebar.vue index f77c32730..014c01c71 100644 --- a/front/src/ui/components/Sidebar.vue +++ b/front/src/ui/components/Sidebar.vue @@ -12,26 +12,13 @@ import UserMenu from './UserMenu.vue' import Button from '~/components/ui/Button.vue' import Layout from '~/components/ui/Layout.vue' import Spacer from '~/components/ui/layout/Spacer.vue' -import { useRoute, useRouter } from 'vue-router' +import { useRoute } from 'vue-router' - -/* - -Sidebar on slim screen - -- While screen is slim, sidebar is drawn on top of screen -- While screen is slim, When new route is loaded, top-sidebar is auto-collapsed: `watch(() => route.path, () => (isCollapsed.value = true))` -- While screen is slim, top-sidebar can be expanded and collapsed with additional hamburger button on top-right - -*/ const isCollapsed = ref(false) const route = useRoute() - watch(() => route.path, () => ( isCollapsed.value = true )) -const { openShortcutsModal } = defineProps<{ openShortcutsModal: ()=> void }>() - const searchQuery = ref('') // Hide the fake app when the real one is loaded @@ -86,7 +73,7 @@ const uploads = useUploadsStore() - +