From b9e457d71619d8e84a50e78ddff6f2469f04185f Mon Sep 17 00:00:00 2001 From: Jannik Stehle Date: Fri, 28 Aug 2026 11:40:51 +0200 Subject: [PATCH] fix: remove system actions from getAllOpenWithActions They don't belong there, especially since they included delete and restore actions. The fallback to the download action in case no other action was found is already present in getDefaultAction. Also remove the deprecated useOpenWithDefaultApp composable in the course of this and in preparation of the upcoming major release. --- .../SideBar/Actions/FileActions.vue | 17 +++++-- .../components/FilesList/ContextActions.vue | 2 +- .../actions/files/useFileActions.ts | 44 +++++-------------- .../files/useFileActionsOpenWithDefault.ts | 12 ++--- .../web-pkg/src/composables/actions/index.ts | 1 - .../actions/useOpenWithDefaultApp.ts | 29 ------------ .../actions/files/useFileActions.spec.ts | 3 +- 7 files changed, 30 insertions(+), 78 deletions(-) delete mode 100644 packages/web-pkg/src/composables/actions/useOpenWithDefaultApp.ts diff --git a/packages/web-app-files/src/components/SideBar/Actions/FileActions.vue b/packages/web-app-files/src/components/SideBar/Actions/FileActions.vue index 9e80fb0b335..0675f9af22c 100644 --- a/packages/web-app-files/src/components/SideBar/Actions/FileActions.vue +++ b/packages/web-app-files/src/components/SideBar/Actions/FileActions.vue @@ -15,7 +15,10 @@ import { ActionMenuItem, useExtensionRegistry, useFileActions, - useIsAppActive + useIsAppActive, + useFileActionsDelete, + useFileActionsDownloadFile, + useFileActionsRestore } from '@opencloud-eu/web-pkg' import { computed, inject, Ref, unref } from 'vue' import { Resource, SpaceResource } from '@opencloud-eu/web-client' @@ -32,6 +35,11 @@ const { getAllOpenWithActions } = useFileActions() const extensionActions = computed(() => requestExtensions(fileSideBarActionsExtensionPoint).map((e) => e.action) ) + +const { actions: downloadFileActions } = useFileActionsDownloadFile() +const { actions: deleteActions } = useFileActionsDelete() +const { actions: restoreActions } = useFileActionsRestore() + const actions = computed(() => { const options = { space: unref(space), @@ -41,9 +49,12 @@ const actions = computed(() => { } return [ - // FIXME: as soon as all actions are migrated to web-app-files - // and registered as extension point, omit ...getAllOpenWithActions(options), + // FIXME: remove as soon as actions are announced in extension system ...getAllOpenWithActions(options), + ...[...unref(downloadFileActions), ...unref(deleteActions), ...unref(restoreActions)].filter( + (action) => action.isVisible(options) + ), + ...unref(extensionActions).filter((action) => action.isVisible(options)) ] }) diff --git a/packages/web-pkg/src/components/FilesList/ContextActions.vue b/packages/web-pkg/src/components/FilesList/ContextActions.vue index 2a8e6c1856d..6f538a4f83e 100644 --- a/packages/web-pkg/src/components/FilesList/ContextActions.vue +++ b/packages/web-pkg/src/components/FilesList/ContextActions.vue @@ -73,7 +73,7 @@ const menuItemsPrimary = computed(() => { }) const menuItemsPrimaryDrop = computed(() => { - return getAllOpenWithActions({ ...unref(actionOptions), omitSystemActions: true }) + return getAllOpenWithActions(unref(actionOptions)) .filter((item) => item.isVisible(unref(actionOptions))) .sort((x, y) => Number(y.hasPriority) - Number(x.hasPriority)) }) diff --git a/packages/web-pkg/src/composables/actions/files/useFileActions.ts b/packages/web-pkg/src/composables/actions/files/useFileActions.ts index dba3ef09220..79d05ceff6b 100644 --- a/packages/web-pkg/src/composables/actions/files/useFileActions.ts +++ b/packages/web-pkg/src/composables/actions/files/useFileActions.ts @@ -16,12 +16,7 @@ import { useWindowOpen } from '../../actions' -import { - useFileActionsDelete, - useFileActionsDownloadFile, - useFileActionsNavigate, - useFileActionsRestore -} from './index' +import { useFileActionsNavigate } from './index' import { ActionExtension, useAppsStore, @@ -33,9 +28,7 @@ import { storeToRefs } from 'pinia' import { useEmbedMode } from '../../embedMode' import { RouteRecordName } from 'vue-router' -export interface GetFileActionsOptions extends FileActionOptions { - omitSystemActions?: boolean -} +export interface GetFileActionsOptions extends FileActionOptions {} export interface FileActionOptionsWithEvent extends FileActionOptions { event?: MouseEvent @@ -52,17 +45,8 @@ export const useFileActions = () => { const configStore = useConfigStore() const { options } = storeToRefs(configStore) - const { actions: deleteActions } = useFileActionsDelete() - const { actions: downloadFileActions } = useFileActionsDownloadFile() - const { actions: fallbackToDownloadAction } = useFileActionFallbackToDownload() + const { actions: fallbackToDownloadActions } = useFileActionFallbackToDownload() const { actions: navigateActions } = useFileActionsNavigate() - const { actions: restoreActions } = useFileActionsRestore() - - const systemActions = computed[]>(() => [ - ...unref(downloadFileActions), - ...unref(deleteActions), - ...unref(restoreActions) - ]) const extensionsContextActions = computed(() => { return ( @@ -257,33 +241,25 @@ export const useFileActions = () => { const getDefaultAction = (options: GetFileActionsOptions): Action | undefined => { const actions = getAllOpenWithActions(options) - if (actions.length) { - return actions[0].name === unref(downloadFileActions)[0].name - ? unref(fallbackToDownloadAction)[0] - : actions[0] + return actions[0] } - return undefined + + return unref(fallbackToDownloadActions)[0].isVisible(options) + ? unref(fallbackToDownloadActions)[0] + : undefined } const getAllOpenWithActions = ( options: GetFileActionsOptions & { omitEditorActions?: boolean } ) => { - const filterCallback = (action: FileAction) => action.isVisible(options) - - const primaryActions = [ + return [ ...unref(extensionsContextActions), ...(options.omitEditorActions ? [] : unref(editorActions)), ...unref(navigateActions) ] - .filter(filterCallback) + .filter((action: FileAction) => action.isVisible(options)) .sort((a, b) => Number(b.hasPriority) - Number(a.hasPriority)) - - const secondaryActions = options.omitSystemActions - ? [] - : unref(systemActions).filter(filterCallback) - - return [...primaryActions, ...secondaryActions] } return { diff --git a/packages/web-pkg/src/composables/actions/files/useFileActionsOpenWithDefault.ts b/packages/web-pkg/src/composables/actions/files/useFileActionsOpenWithDefault.ts index 4846fa39bc0..99538ce8779 100644 --- a/packages/web-pkg/src/composables/actions/files/useFileActionsOpenWithDefault.ts +++ b/packages/web-pkg/src/composables/actions/files/useFileActionsOpenWithDefault.ts @@ -6,7 +6,7 @@ import { useFileActions } from './useFileActions' export const useFileActionsOpenWithDefault = () => { const { $gettext } = useGettext() - const { getDefaultAction } = useFileActions() + const { getDefaultAction, getAllOpenWithActions } = useFileActions() const actions = computed((): FileAction[] => [ { @@ -14,25 +14,21 @@ export const useFileActionsOpenWithDefault = () => { icon: 'eye', label: () => $gettext('Open'), handler: (options) => { - const defaultAction = getDefaultAction({ ...options, omitSystemActions: true }) + const defaultAction = getDefaultAction(options) if (!defaultAction || !Object.hasOwn(defaultAction, 'handler')) { return } defaultAction.handler(options) }, route: (options) => { - const defaultAction = getDefaultAction({ ...options, omitSystemActions: true }) + const defaultAction = getDefaultAction(options) if (!defaultAction || !Object.hasOwn(defaultAction, 'route')) { return } return defaultAction.route(options) }, isVisible: (options) => { - const defaultAction = getDefaultAction({ ...options, omitSystemActions: true }) - if (!defaultAction) { - return false - } - return defaultAction.isVisible(options) + return getAllOpenWithActions(options).length > 0 }, class: 'oc-files-actions-default-editor-trigger' } diff --git a/packages/web-pkg/src/composables/actions/index.ts b/packages/web-pkg/src/composables/actions/index.ts index eaab8226851..bab7162445c 100644 --- a/packages/web-pkg/src/composables/actions/index.ts +++ b/packages/web-pkg/src/composables/actions/index.ts @@ -5,5 +5,4 @@ export * from './types' export * from './useActionsShowDetails' export * from './useOpenEmptyEditor' -export * from './useOpenWithDefaultApp' export * from './useWindowOpen' diff --git a/packages/web-pkg/src/composables/actions/useOpenWithDefaultApp.ts b/packages/web-pkg/src/composables/actions/useOpenWithDefaultApp.ts deleted file mode 100644 index 938d921d2a6..00000000000 --- a/packages/web-pkg/src/composables/actions/useOpenWithDefaultApp.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { useFileActions } from './files' -import { Resource, SpaceResource } from '@opencloud-eu/web-client' - -/** - * @deprecated use useFileActions().triggerDefaultAction instead. - */ -export function useOpenWithDefaultApp() { - const { triggerDefaultAction } = useFileActions() - - const openWithDefaultApp = ({ - space, - resource - }: { - space: SpaceResource - resource: Resource - }) => { - if (!resource || resource.isFolder) { - return - } - - const fileActionsOptions = { - resources: [resource], - space: space - } - triggerDefaultAction({ ...fileActionsOptions, omitSystemActions: true }) - } - - return { openWithDefaultApp } -} diff --git a/packages/web-pkg/tests/unit/composables/actions/files/useFileActions.spec.ts b/packages/web-pkg/tests/unit/composables/actions/files/useFileActions.spec.ts index 8cda033bbd5..a16ce71aab8 100644 --- a/packages/web-pkg/tests/unit/composables/actions/files/useFileActions.spec.ts +++ b/packages/web-pkg/tests/unit/composables/actions/files/useFileActions.spec.ts @@ -24,8 +24,7 @@ const actionOptions: GetFileActionsOptions = { extension: 'txt' }) ], - space: null, - omitSystemActions: true + space: null } describe('fileActions', () => {