diff options
Diffstat (limited to 'apps/files/src/mixins')
-rw-r--r-- | apps/files/src/mixins/actionsMixin.ts | 65 | ||||
-rw-r--r-- | apps/files/src/mixins/filesListWidth.ts | 33 | ||||
-rw-r--r-- | apps/files/src/mixins/filesSorting.ts | 14 |
3 files changed, 74 insertions, 38 deletions
diff --git a/apps/files/src/mixins/actionsMixin.ts b/apps/files/src/mixins/actionsMixin.ts new file mode 100644 index 00000000000..f81b0754431 --- /dev/null +++ b/apps/files/src/mixins/actionsMixin.ts @@ -0,0 +1,65 @@ +/** + * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import type { FileAction } from '@nextcloud/files' +import { defineComponent } from 'vue' + +export default defineComponent({ + + data() { + return { + openedSubmenu: null as FileAction|null, + } + }, + + computed: { + enabledSubmenuActions(): Record<string, FileAction[]> { + return (this.enabledFileActions as FileAction[]) + .reduce((record, action) => { + if (action.parent !== undefined) { + if (!record[action.parent]) { + record[action.parent] = [] + } + + record[action.parent].push(action) + } + return record + }, {} as Record<string, FileAction[]>) + }, + }, + + methods: { + /** + * Check if a menu is valid, meaning it is + * defined and has at least one action + * + * @param action The action to check + */ + isValidMenu(action: FileAction): boolean { + return this.enabledSubmenuActions[action.id]?.length > 0 + }, + + async onBackToMenuClick(action: FileAction|null) { + if (!action) { + return + } + + this.openedSubmenu = null + // Wait for first render + await this.$nextTick() + + // Focus the previous menu action button + this.$nextTick(() => { + // Focus the action button, test both batch and single action references + // as this mixin is used in both single and batch actions. + const menuAction = this.$refs[`action-batch-${action.id}`]?.[0] + || this.$refs[`action-${action.id}`]?.[0] + if (menuAction) { + menuAction.$el.querySelector('button')?.focus() + } + }) + }, + }, +}) diff --git a/apps/files/src/mixins/filesListWidth.ts b/apps/files/src/mixins/filesListWidth.ts deleted file mode 100644 index 7d7ec598673..00000000000 --- a/apps/files/src/mixins/filesListWidth.ts +++ /dev/null @@ -1,33 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -import { defineComponent } from 'vue' - -export default defineComponent({ - data() { - return { - filesListWidth: 0, - } - }, - - mounted() { - const fileListEl = document.querySelector('#app-content-vue') - this.filesListWidth = fileListEl?.clientWidth ?? 0 - - // @ts-expect-error The resize observer is just now attached to the object - this.$resizeObserver = new ResizeObserver((entries) => { - if (entries.length > 0 && entries[0].target === fileListEl) { - this.filesListWidth = entries[0].contentRect.width - } - }) - // @ts-expect-error The resize observer was attached right before to the this object - this.$resizeObserver.observe(fileListEl as Element) - }, - - beforeDestroy() { - // @ts-expect-error mounted must have been called before the destroy, so the resize - this.$resizeObserver.disconnect() - }, -}) diff --git a/apps/files/src/mixins/filesSorting.ts b/apps/files/src/mixins/filesSorting.ts index 53c747fa29b..12515db103f 100644 --- a/apps/files/src/mixins/filesSorting.ts +++ b/apps/files/src/mixins/filesSorting.ts @@ -6,16 +6,20 @@ import Vue from 'vue' import { mapState } from 'pinia' import { useViewConfigStore } from '../store/viewConfig' -import { Navigation, View } from '@nextcloud/files' +import { useNavigation } from '../composables/useNavigation' export default Vue.extend({ + setup() { + const { currentView } = useNavigation() + + return { + currentView, + } + }, + computed: { ...mapState(useViewConfigStore, ['getConfig', 'setSortingBy', 'toggleSortingDirection']), - currentView(): View { - return (this.$navigation as Navigation).active as View - }, - /** * Get the sorting mode for the current view */ |