From 99b5a5fffe0c51e0ebc5643881a9d995b8d411c9 Mon Sep 17 00:00:00 2001 From: Jannik Stehle Date: Thu, 29 Jan 2026 09:23:15 +0100 Subject: [PATCH 1/2] refactor: transform useSidebar composable to a pinia store Replaces the `useSideBar` composable with a pinia store. This results in some changes across the code base: * we don't need to pass the sidebar states around since the global store is accessible from everywhere * we don't need to rely on events to toggle the sidebar, hence those have been deprecated in favor of store actions --- .../src/components/AppTemplate.vue | 45 +++----- .../src/components/Groups/GroupsList.vue | 9 +- .../src/components/Spaces/SpacesList.vue | 7 +- .../src/components/Users/UsersList.vue | 11 +- .../actions/groups/useGroupActionsEdit.ts | 7 +- .../actions/users/useUserActionsEdit.ts | 7 +- .../src/views/General.vue | 6 - .../src/views/Groups.vue | 6 +- .../src/views/Spaces.vue | 5 +- .../src/views/Users.vue | 8 +- .../src/components/Search/List.vue | 16 +-- .../components/Shares/SharedWithMeSection.vue | 5 - .../SideBar/Details/FileDetails.vue | 14 +-- .../components/SideBar/Details/TagsSelect.vue | 13 +-- .../src/components/Spaces/SpaceHeader.vue | 11 +- .../useResourcesViewDefaults.ts | 5 - .../web-app-files/src/views/Favorites.vue | 9 +- .../src/views/shares/SharedViaLink.vue | 9 +- .../src/views/shares/SharedWithMe.vue | 13 +-- .../src/views/shares/SharedWithOthers.vue | 9 +- .../src/views/spaces/GenericSpace.vue | 11 +- .../src/views/spaces/GenericTrash.vue | 6 +- .../src/views/spaces/Projects.vue | 16 +-- .../src/views/trash/Overview.vue | 15 +-- .../mocks/useResourcesViewDefaultsMock.ts | 2 - .../src/components/MailAttachmentList.vue | 2 +- .../src/components/MailBodyEditor.vue | 2 +- .../web-pkg/src/components/AppBar/AppBar.vue | 8 +- .../components/AppTemplates/AppWrapper.vue | 6 +- .../components/FilesList/ResourceTable.vue | 15 +-- .../components/FilesList/ResourceTiles.vue | 3 +- .../src/components/SideBar/FileSideBar.vue | 37 ++----- .../src/components/SideBar/SideBar.vue | 28 ++--- .../SideBar/Spaces/Details/SpaceDetails.vue | 14 +-- .../web-pkg/src/components/ViewOptions.vue | 3 +- .../files/useFileActionsShowActions.ts | 6 +- .../files/useFileActionsShowDetails.ts | 8 +- .../actions/files/useFileActionsShowShares.ts | 8 +- .../spaces/useSpaceActionsShowMembers.ts | 7 +- .../actions/useActionsShowDetails.ts | 6 +- packages/web-pkg/src/composables/index.ts | 1 - .../src/composables/piniaStores/index.ts | 7 +- .../useSideBar.ts => piniaStores/sideBar.ts} | 103 +++++++++--------- .../src/composables/scrollTo/useScrollTo.ts | 6 +- .../src/composables/sideBar/eventTopics.ts | 7 -- .../web-pkg/src/composables/sideBar/index.ts | 2 - .../web-pkg/src/helpers/statusIndicators.ts | 3 +- .../FilesList/ResourceTable.spec.ts | 3 +- .../composables/sideBar/useSideBar.spec.ts | 3 +- .../src/components/Topbar/SideBarToggle.vue | 42 +++---- .../web-runtime/src/container/bootstrap.ts | 7 +- .../web-runtime/src/layouts/Application.vue | 4 +- 52 files changed, 230 insertions(+), 376 deletions(-) rename packages/web-pkg/src/composables/{sideBar/useSideBar.ts => piniaStores/sideBar.ts} (51%) delete mode 100644 packages/web-pkg/src/composables/sideBar/eventTopics.ts delete mode 100644 packages/web-pkg/src/composables/sideBar/index.ts diff --git a/packages/web-app-admin-settings/src/components/AppTemplate.vue b/packages/web-app-admin-settings/src/components/AppTemplate.vue index d328b804f9..74c4a5ecb3 100644 --- a/packages/web-app-admin-settings/src/components/AppTemplate.vue +++ b/packages/web-app-admin-settings/src/components/AppTemplate.vue @@ -48,13 +48,9 @@ diff --git a/packages/web-app-files/src/views/shares/SharedViaLink.vue b/packages/web-app-files/src/views/shares/SharedViaLink.vue index 40718eab47..24333bb8a3 100644 --- a/packages/web-app-files/src/views/shares/SharedViaLink.vue +++ b/packages/web-app-files/src/views/shares/SharedViaLink.vue @@ -1,7 +1,7 @@ - + diff --git a/packages/web-app-files/src/views/shares/SharedWithMe.vue b/packages/web-app-files/src/views/shares/SharedWithMe.vue index 29f6b2f827..3251f8d3df 100644 --- a/packages/web-app-files/src/views/shares/SharedWithMe.vue +++ b/packages/web-app-files/src/views/shares/SharedWithMe.vue @@ -1,7 +1,7 @@ - + @@ -150,8 +145,6 @@ export default defineComponent({ loadResourcesTask, selectedResources, selectedResourcesIds, - sideBarActivePanel, - isSideBarOpen, paginatedResources, scrollToResourceFromRoute } = resourcesViewDefaults @@ -287,8 +280,6 @@ export default defineComponent({ selectedResources, selectedResourcesIds, fileListHeaderY, - isSideBarOpen, - sideBarActivePanel, selectedShareSpace, areHiddenFilesShown, diff --git a/packages/web-app-files/src/views/shares/SharedWithOthers.vue b/packages/web-app-files/src/views/shares/SharedWithOthers.vue index 953540e13b..03376a05ad 100644 --- a/packages/web-app-files/src/views/shares/SharedWithOthers.vue +++ b/packages/web-app-files/src/views/shares/SharedWithOthers.vue @@ -1,7 +1,7 @@ - + diff --git a/packages/web-app-files/src/views/spaces/GenericSpace.vue b/packages/web-app-files/src/views/spaces/GenericSpace.vue index 4583971591..087c52facb 100644 --- a/packages/web-app-files/src/views/spaces/GenericSpace.vue +++ b/packages/web-app-files/src/views/spaces/GenericSpace.vue @@ -8,7 +8,6 @@ :has-bulk-actions="displayFullAppBar" :show-actions-on-selection="displayFullAppBar" :has-view-options="displayFullAppBar" - :is-side-bar-open="isSideBarOpen" :space="space" :view-modes="viewModes" @item-dropped="fileDropped" @@ -32,12 +31,7 @@ :class="{ 'h-[55vh]': isSpaceFrontpage }" /> - + diff --git a/packages/web-app-files/src/views/spaces/GenericTrash.vue b/packages/web-app-files/src/views/spaces/GenericTrash.vue index e5c2e59237..962f8fff33 100644 --- a/packages/web-app-files/src/views/spaces/GenericTrash.vue +++ b/packages/web-app-files/src/views/spaces/GenericTrash.vue @@ -4,7 +4,6 @@ @@ -40,7 +39,6 @@ :is="folderView.component" v-else v-model:selected-ids="selectedResourcesIds" - :is-side-bar-open="isSideBarOpen" :fields-displayed="['name', 'ddate']" :are-paths-displayed="true" :resources="paginatedResources" @@ -69,7 +67,7 @@ - + @@ -117,12 +115,10 @@ const { paginationPages, paginationPage, selectedResourcesIds, - isSideBarOpen, fileListHeaderY, sortBy, sortDir, handleSort, - sideBarActivePanel, selectedResources, isResourceInSelection, viewMode, diff --git a/packages/web-app-files/src/views/spaces/Projects.vue b/packages/web-app-files/src/views/spaces/Projects.vue index a868d6ae89..3a10cdb554 100644 --- a/packages/web-app-files/src/views/spaces/Projects.vue +++ b/packages/web-app-files/src/views/spaces/Projects.vue @@ -9,7 +9,6 @@ :has-file-extensions="false" :has-pagination="false" :batch-actions-loading="batchActionsLoading" - :is-side-bar-open="isSideBarOpen" :view-modes="viewModes" :view-mode-default="FolderViewModeConstants.defaultModeName" > @@ -53,7 +52,6 @@ :sort-by="sortBy" :sort-dir="sortDir" :header-position="fileListHeaderY" - :is-side-bar-open="isSideBarOpen" :view-size="viewSize" :view-mode="viewMode" v-bind="folderView.componentAttrs?.()" @@ -130,11 +128,7 @@ - + @@ -160,7 +154,8 @@ import { useRoute, Pagination, FileSideBar, - NoContentMessage + NoContentMessage, + useSideBar } from '@opencloud-eu/web-pkg' import SpaceContextActions from '../../components/Spaces/SpaceContextActions.vue' import { @@ -170,7 +165,6 @@ import { } from '@opencloud-eu/web-client' import FilesViewWrapper from '../../components/FilesViewWrapper.vue' import { eventBus } from '@opencloud-eu/web-pkg' -import { SideBarEventTopics, useSideBar } from '@opencloud-eu/web-pkg' import { sortFields as availableSortFields, translateSortFields } from '@opencloud-eu/web-pkg' import { defaultFuseOptions, formatFileSize, ResourceIcon } from '@opencloud-eu/web-pkg' import { useGettext } from 'vue3-gettext' @@ -195,7 +189,7 @@ const { $gettext, $ngettext } = language const filterTerm = ref('') const resourcesStore = useResourcesStore() const { imagesLoading } = storeToRefs(spacesStore) -const { isSideBarOpen, sideBarActivePanel } = useSideBar() +const { openSideBarPanel } = useSideBar() const { setSelection, initResourceList, clearResourceList, setAncestorMetaData } = resourcesStore const { areDisabledSpacesShown } = storeToRefs(resourcesStore) @@ -439,6 +433,6 @@ const showSpaceMemberLabel = computed(() => { const openSidebarSharePanel = (space: SpaceResource) => { setSelection([space.id]) - eventBus.publish(SideBarEventTopics.openWithPanel, 'space-share') + openSideBarPanel('space-share') } diff --git a/packages/web-app-files/src/views/trash/Overview.vue b/packages/web-app-files/src/views/trash/Overview.vue index 3212aa4185..6903446d86 100644 --- a/packages/web-app-files/src/views/trash/Overview.vue +++ b/packages/web-app-files/src/views/trash/Overview.vue @@ -35,7 +35,6 @@ :sort-by="sortBy" :sort-dir="sortDir" :sort-fields="sortFields.filter((field) => field.name === 'name')" - :is-side-bar-open="isSideBarOpen" :header-position="fileListHeaderY" :are-thumbnails-displayed="false" :are-paths-displayed="false" @@ -70,7 +69,7 @@ - + @@ -122,16 +121,8 @@ const resourcesViewDefaults = useResourcesViewDefaults( folderViewExtensionPoint: folderViewsTrashOverviewExtensionPoint }) -const { - isSideBarOpen, - fileListHeaderY, - sideBarActivePanel, - viewMode, - viewModes, - viewSize, - sortFields, - folderView -} = resourcesViewDefaults +const { fileListHeaderY, viewMode, viewModes, viewSize, sortFields, folderView } = + resourcesViewDefaults const { loadPreview } = useLoadPreview(viewMode) diff --git a/packages/web-app-files/tests/mocks/useResourcesViewDefaultsMock.ts b/packages/web-app-files/tests/mocks/useResourcesViewDefaultsMock.ts index d90aa409aa..caf53d76a8 100644 --- a/packages/web-app-files/tests/mocks/useResourcesViewDefaultsMock.ts +++ b/packages/web-app-files/tests/mocks/useResourcesViewDefaultsMock.ts @@ -37,8 +37,6 @@ export const useResourcesViewDefaultsMock = ( selectedResourcesIds: ref([]), selectedResourceSpace: ref(mock()), isResourceInSelection: vi.fn(() => false), - isSideBarOpen: ref(false), - sideBarActivePanel: ref(''), scrollToResource: vi.fn(), scrollToResourceFromRoute: vi.fn(), viewMode: ref('resource-table'), diff --git a/packages/web-app-mail/src/components/MailAttachmentList.vue b/packages/web-app-mail/src/components/MailAttachmentList.vue index a6e92b2c2a..ab3b6f1e81 100644 --- a/packages/web-app-mail/src/components/MailAttachmentList.vue +++ b/packages/web-app-mail/src/components/MailAttachmentList.vue @@ -1,5 +1,5 @@ @@ -88,6 +88,7 @@ import { UnsavedChangesModal } from '../Modals' import { formatFileSize, getSharedDriveItem } from '../../helpers' import toNumber from 'lodash-es/toNumber' import { useIsMobile } from '@opencloud-eu/design-system/composables' +import { storeToRefs } from 'pinia' const { applicationId, @@ -121,7 +122,8 @@ const resourcesStore = useResourcesStore() const sharesStore = useSharesStore() const eventBus = useEventBus() const { isMobile } = useIsMobile() -const { isSideBarOpen, sideBarActivePanel } = useSideBar() +const sidebarStore = useSideBar() +const { isSideBarOpen } = storeToRefs(sidebarStore) const { actions: openWithAppActions } = useFileActionsOpenWithApp({ appId: applicationId diff --git a/packages/web-pkg/src/components/FilesList/ResourceTable.vue b/packages/web-pkg/src/components/FilesList/ResourceTable.vue index fa5e9bf2b1..c7abaf357f 100644 --- a/packages/web-pkg/src/components/FilesList/ResourceTable.vue +++ b/packages/web-pkg/src/components/FilesList/ResourceTable.vue @@ -142,7 +142,7 @@ v-if="item.tags.length > 2" size="small" class="resource-table-tag-more align-text-bottom cursor-pointer" - @click="openTagsSidebar()" + @click="sidebarStore.openSideBar()" > + {{ item.tags.length - 2 }} @@ -285,14 +285,13 @@ import { useResourcesStore, useResourceViewHelpers, useRouter, - useSpaceActionsRename + useSpaceActionsRename, + useSideBar } from '../../composables' import ResourceListItem from './ResourceListItem.vue' import ResourceGhostElement from './ResourceGhostElement.vue' import ResourceSize from './ResourceSize.vue' -import { eventBus } from '../../services' import { formatDateFromJSDate, formatRelativeDateFromJSDate } from '../../helpers' -import { SideBarEventTopics } from '../../composables/sideBar' import ContextMenuQuickAction from '../ContextActions/ContextMenuQuickAction.vue' import { useInterceptModifierClick } from '../../composables/keyboardActions' import { determineResourceTableSortFields } from '../../helpers/ui/resourceTable' @@ -318,7 +317,6 @@ const { areResourcesClickable = true, headerPosition = 0, isSelectable = true, - isSideBarOpen = false, dragDrop = false, viewMode = FolderViewModeConstants.defaultModeName, hover = true, @@ -338,7 +336,6 @@ const { areResourcesClickable?: boolean headerPosition?: number isSelectable?: boolean - isSideBarOpen?: boolean dragDrop?: boolean viewMode?: | typeof FolderViewModeConstants.name.condensedTable @@ -418,6 +415,9 @@ const { emit }) +const sidebarStore = useSideBar() +const { isSideBarOpen } = storeToRefs(sidebarStore) + const authStore = useAuthStore() const { userContextReady } = storeToRefs(authStore) @@ -674,9 +674,6 @@ const openRenameDialog = (item: Resource) => { resources: [item] }) } -const openTagsSidebar = () => { - eventBus.publish(SideBarEventTopics.open) -} const formatDate = (date: string) => { return formatDateFromJSDate(new Date(date), currentLanguage) diff --git a/packages/web-pkg/src/components/FilesList/ResourceTiles.vue b/packages/web-pkg/src/components/FilesList/ResourceTiles.vue index 4d5ba7a3a4..b5a048d1a0 100644 --- a/packages/web-pkg/src/components/FilesList/ResourceTiles.vue +++ b/packages/web-pkg/src/components/FilesList/ResourceTiles.vue @@ -211,7 +211,8 @@ const viewSizeMax = useViewSizeMax() const viewSizeCurrent = computed(() => { return Math.min(unref(viewSizeMax), viewSize) }) -const { isSideBarOpen } = useSideBar() +const sidebarStore = useSideBar() +const { isSideBarOpen } = storeToRefs(sidebarStore) const { disabledResources, isResourceSelected, diff --git a/packages/web-pkg/src/components/SideBar/FileSideBar.vue b/packages/web-pkg/src/components/SideBar/FileSideBar.vue index 0b6e66dac2..ecc2dd2942 100644 --- a/packages/web-pkg/src/components/SideBar/FileSideBar.vue +++ b/packages/web-pkg/src/components/SideBar/FileSideBar.vue @@ -3,15 +3,11 @@ v-if="isOpen" ref="sidebar" class="files-side-bar z-30" - :is-open="isOpen" - :active-panel="activePanel" :available-panels="availablePanels" :panel-context="panelContext" :loading="isLoading" v-bind="$attrs" data-custom-key-bindings-disabled="true" - @select-panel="setActiveSideBarPanel" - @close="closeSideBar" >