From 2332aa4af7e3513255ee01675080ef493e2e62ec Mon Sep 17 00:00:00 2001 From: Alexander Ackermann Date: Mon, 27 Apr 2026 10:18:41 +0200 Subject: [PATCH 1/5] change: remove or reduce dummy methods --- .../InviteCollaboratorForm.vue | 8 ++--- .../src/helpers/contextualHelpers.ts | 34 +++++++++++-------- .../web-app-files/src/search/sdk/index.ts | 7 ++-- packages/web-app-pdf-viewer/src/index.ts | 7 +--- packages/web-app-webfinger/src/index.ts | 6 +--- .../web-pkg/src/helpers/ui/resourceTiles.ts | 1 - packages/web-pkg/src/router/index.ts | 5 +-- packages/web-runtime/src/extensionPoints.ts | 5 ++- packages/web-runtime/src/extensions.ts | 5 ++- .../src/helpers/additionalTranslations.ts | 5 +-- packages/web-runtime/src/router/index.ts | 7 +--- 11 files changed, 34 insertions(+), 56 deletions(-) diff --git a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/InviteCollaborator/InviteCollaboratorForm.vue b/packages/web-app-files/src/components/SideBar/Shares/Collaborators/InviteCollaborator/InviteCollaboratorForm.vue index 8aa49b74c8..e9f1d7faf3 100644 --- a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/InviteCollaborator/InviteCollaboratorForm.vue +++ b/packages/web-app-files/src/components/SideBar/Shares/Collaborators/InviteCollaborator/InviteCollaboratorForm.vue @@ -176,7 +176,8 @@ import { useSpacesStore, useConfigStore, useSharesStore, - useUserStore + useUserStore, + $gettext } from '@opencloud-eu/web-pkg' import { @@ -202,11 +203,6 @@ import ExpirationDateIndicator from '../../ExpirationDateIndicator.vue' import { ContextualHelper } from '@opencloud-eu/design-system/helpers' import CopyPrivateLink from '../../../../Shares/CopyPrivateLink.vue' -// just a dummy function to trick gettext tools -const $gettext = (str: string) => { - return str -} - type DropDownShouldOpenOptions = { open: boolean; search: string[] } export type ShareRoleType = { id: string; label: string; longLabel: string } diff --git a/packages/web-app-files/src/helpers/contextualHelpers.ts b/packages/web-app-files/src/helpers/contextualHelpers.ts index a6aa49535a..8f8dd2df64 100644 --- a/packages/web-app-files/src/helpers/contextualHelpers.ts +++ b/packages/web-app-files/src/helpers/contextualHelpers.ts @@ -1,18 +1,15 @@ import { omit } from 'lodash-es' import { ContextualHelperData } from '@opencloud-eu/design-system/helpers' import { ConfigStore } from '@opencloud-eu/web-pkg' - -// just a dummy function to trick gettext tools -function $gettext(msg: string) { - return msg -} +import { useGettext } from 'vue3-gettext' interface ContextualHelperOptions { configStore: ConfigStore } -export const shareInviteCollaboratorHelp = (options: ContextualHelperOptions) => - filterContextHelper( +export const shareInviteCollaboratorHelp = (options: ContextualHelperOptions) => { + const { $gettext } = useGettext() + return filterContextHelper( { title: $gettext('Share with people'), text: $gettext( @@ -35,10 +32,10 @@ export const shareInviteCollaboratorHelp = (options: ContextualHelperOptions) => { text: $gettext('People you share resources with can not see who else has access.') }, - { text: $gettext('“via folder”'), headline: true }, + { text: $gettext('"via folder"'), headline: true }, { text: $gettext( - 'The “via folder” is shown next to a share, if access has already been given via a parent folder. Click on the “via folder” to edit the share on its parent folder.' + 'The "via folder" is shown next to a share, if access has already been given via a parent folder. Click on the "via folder" to edit the share on its parent folder.' ) } ], @@ -46,9 +43,11 @@ export const shareInviteCollaboratorHelp = (options: ContextualHelperOptions) => }, options ) +} -export const shareSpaceAddMemberHelp = (options: ContextualHelperOptions) => - filterContextHelper( +export const shareSpaceAddMemberHelp = (options: ContextualHelperOptions) => { + const { $gettext } = useGettext() + return filterContextHelper( { title: $gettext('Add members to this Space'), text: $gettext('Enter a name to add people or groups as members to this Space.'), @@ -70,8 +69,10 @@ export const shareSpaceAddMemberHelp = (options: ContextualHelperOptions) => }, options ) -export const shareViaLinkHelp = (options: ContextualHelperOptions) => - filterContextHelper( +} +export const shareViaLinkHelp = (options: ContextualHelperOptions) => { + const { $gettext } = useGettext() + return filterContextHelper( { title: $gettext('Choose how access is granted'), list: [ @@ -85,8 +86,10 @@ export const shareViaLinkHelp = (options: ContextualHelperOptions) => }, options ) -export const shareViaIndirectLinkHelp = (options: ContextualHelperOptions) => - filterContextHelper( +} +export const shareViaIndirectLinkHelp = (options: ContextualHelperOptions) => { + const { $gettext } = useGettext() + return filterContextHelper( { title: $gettext('What are indirect links?'), text: $gettext('Indirect links are links giving access by a parent folder.'), @@ -105,6 +108,7 @@ export const shareViaIndirectLinkHelp = (options: ContextualHelperOptions) => }, options ) +} const filterContextHelper = ( data: ContextualHelperData, diff --git a/packages/web-app-files/src/search/sdk/index.ts b/packages/web-app-files/src/search/sdk/index.ts index 6468363411..cddaf34e64 100644 --- a/packages/web-app-files/src/search/sdk/index.ts +++ b/packages/web-app-files/src/search/sdk/index.ts @@ -6,13 +6,10 @@ import { SearchFunction, SearchList, SearchPreview, - SearchProvider + SearchProvider, + $gettext } from '@opencloud-eu/web-pkg' -function $gettext(msg: string) { - return msg -} - export default class Provider implements SearchProvider { public readonly id: string public readonly displayName: string diff --git a/packages/web-app-pdf-viewer/src/index.ts b/packages/web-app-pdf-viewer/src/index.ts index 9a5ad6cc66..8190904a0a 100644 --- a/packages/web-app-pdf-viewer/src/index.ts +++ b/packages/web-app-pdf-viewer/src/index.ts @@ -1,12 +1,7 @@ import translations from '../l10n/translations.json' -import { AppWrapperRoute } from '@opencloud-eu/web-pkg' +import { AppWrapperRoute, $gettext } from '@opencloud-eu/web-pkg' import PdfViewer from './App.vue' -// just a dummy function to trick gettext tools -function $gettext(msg: string) { - return msg -} - const routes = [ { path: '/:driveAliasAndItem(.*)?', diff --git a/packages/web-app-webfinger/src/index.ts b/packages/web-app-webfinger/src/index.ts index 27c5feac50..3fbb5c6438 100644 --- a/packages/web-app-webfinger/src/index.ts +++ b/packages/web-app-webfinger/src/index.ts @@ -1,10 +1,6 @@ import translations from '../l10n/translations.json' import Resolve from './views/Resolve.vue' - -// just a dummy function to trick gettext tools -function $gettext(msg: string) { - return msg -} +import { $gettext } from '@opencloud-eu/web-pkg' const appInfo = { name: $gettext('Webfinger'), diff --git a/packages/web-pkg/src/helpers/ui/resourceTiles.ts b/packages/web-pkg/src/helpers/ui/resourceTiles.ts index 6453860ffd..e3c63f6a33 100644 --- a/packages/web-pkg/src/helpers/ui/resourceTiles.ts +++ b/packages/web-pkg/src/helpers/ui/resourceTiles.ts @@ -3,7 +3,6 @@ import { SortField } from '../../composables/sort' import { Language } from 'vue3-gettext' import { SortDir } from '@opencloud-eu/design-system/helpers' -// just a dummy function to trick gettext tools function $gettext(msg: string) { return msg } diff --git a/packages/web-pkg/src/router/index.ts b/packages/web-pkg/src/router/index.ts index 5291b06c9f..6a33680ead 100644 --- a/packages/web-pkg/src/router/index.ts +++ b/packages/web-pkg/src/router/index.ts @@ -34,7 +34,7 @@ import { isLocationTrashActive, createLocationTrash } from './trash' -import { isLocationActiveDirector, createLocation } from './utils' +import { isLocationActiveDirector, createLocation, $gettext } from './utils' import type { ActiveRouteDirectorFunc } from './utils' const ROOT_ROUTE = { @@ -74,7 +74,8 @@ export { locationSharesWithMe, locationSharesWithOthers, buildRoutes, - ActiveRouteDirectorFunc + ActiveRouteDirectorFunc, + $gettext } export type { RouteShareTypes } diff --git a/packages/web-runtime/src/extensionPoints.ts b/packages/web-runtime/src/extensionPoints.ts index b8cbfd7dc3..cc9990a2bb 100644 --- a/packages/web-runtime/src/extensionPoints.ts +++ b/packages/web-runtime/src/extensionPoints.ts @@ -3,12 +3,11 @@ import { AppMenuItemExtension, CustomComponentExtension, Extension, - ExtensionPoint + ExtensionPoint, + $gettext } from '@opencloud-eu/web-pkg' import { computed } from 'vue' -const $gettext = (str: string) => str - export const appMenuExtensionPoint: ExtensionPoint = { id: 'app.runtime.header.app-menu', extensionType: 'appMenuItem', diff --git a/packages/web-runtime/src/extensions.ts b/packages/web-runtime/src/extensions.ts index 5f1c02391f..d63a37b825 100644 --- a/packages/web-runtime/src/extensions.ts +++ b/packages/web-runtime/src/extensions.ts @@ -7,12 +7,11 @@ import { CustomComponentExtension, LoadingIndicator, useCapabilityStore, - useUserStore + useUserStore, + $gettext } from '@opencloud-eu/web-pkg' import { storeToRefs } from 'pinia' -const $gettext = (str: string) => str - export const extensions = () => { const capabilityStore = useCapabilityStore() const userStore = useUserStore() diff --git a/packages/web-runtime/src/helpers/additionalTranslations.ts b/packages/web-runtime/src/helpers/additionalTranslations.ts index db4f2d2e66..740f60f094 100644 --- a/packages/web-runtime/src/helpers/additionalTranslations.ts +++ b/packages/web-runtime/src/helpers/additionalTranslations.ts @@ -1,7 +1,4 @@ -// just a dummy function to trick gettext tools -function $gettext(msg: string): string { - return msg -} +import { $gettext } from '@opencloud-eu/web-pkg' export const additionalTranslations = { admin: $gettext('Admin'), diff --git a/packages/web-runtime/src/router/index.ts b/packages/web-runtime/src/router/index.ts index ba71d8ab90..daba38ed2b 100644 --- a/packages/web-runtime/src/router/index.ts +++ b/packages/web-runtime/src/router/index.ts @@ -24,17 +24,12 @@ import AccountPreferences from '../pages/account/accountPreferences.vue' import AccountInformation from '../pages/account/accountInformation.vue' import AccountLayout from '../pages/account/accountLayout.vue' import AccountGDPR from '../pages/account/accountGDPR.vue' -import { createLocation, isLocationActiveDirector } from '@opencloud-eu/web-pkg' +import { createLocation, isLocationActiveDirector, $gettext } from '@opencloud-eu/web-pkg' import AccountExtensionLayout from '../pages/account/accountExtensionLayout.vue' export * from './helpers' export { createRouter } from 'vue-router' -// just a dummy function to trick gettext tools -function $gettext(msg: string) { - return msg -} - export type RouteAccountTypes = | 'account-information' | 'account-preferences' From 7475065fd032189fe7c3620c4098da664c42ba8f Mon Sep 17 00:00:00 2001 From: Alexander Ackermann Date: Mon, 27 Apr 2026 10:28:20 +0200 Subject: [PATCH 2/5] change: move contextual helper to composable --- .../SideBar/Details/FileDetails.vue | 3 +- .../components/SideBar/Shares/FileLinks.vue | 3 +- .../components/SideBar/Shares/FileShares.vue | 15 +- .../SideBar/Shares/SpaceMembers.vue | 7 +- .../composables/contextualHelpers/index.ts | 1 + .../contextualHelpers/useContextualHelpers.ts | 142 ++++++++++++++++++ .../src/helpers/contextualHelpers.ts | 136 ----------------- 7 files changed, 159 insertions(+), 148 deletions(-) create mode 100644 packages/web-app-files/src/composables/contextualHelpers/index.ts create mode 100644 packages/web-app-files/src/composables/contextualHelpers/useContextualHelpers.ts delete mode 100644 packages/web-app-files/src/helpers/contextualHelpers.ts diff --git a/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue b/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue index 79b5ee360c..f685e37e88 100644 --- a/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue +++ b/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue @@ -146,7 +146,7 @@ import { Resource, SpaceResource } from '@opencloud-eu/web-client' import { useGettext } from 'vue3-gettext' import { getSharedAncestorRoute } from '@opencloud-eu/web-pkg' import { ResourceIcon } from '@opencloud-eu/web-pkg' -import { tagsHelper } from '../../../helpers/contextualHelpers' +import { useContextualHelpers } from '../../../composables/contextualHelpers' import { ContextualHelper } from '@opencloud-eu/design-system/helpers' import TagsSelect from './TagsSelect.vue' import { WebDavDetails, CustomComponentTarget } from '@opencloud-eu/web-pkg' @@ -165,6 +165,7 @@ const { resourceContentsText } = useResourceContents({ showSizeInformation: fals const { loadPreview, previewsLoading } = useLoadPreview() const { openSideBarPanel } = useSideBar() const { getIndicators } = useResourceIndicators() +const { tagsHelper } = useContextualHelpers() const language = useGettext() const { $gettext, current: currentLanguage } = language diff --git a/packages/web-app-files/src/components/SideBar/Shares/FileLinks.vue b/packages/web-app-files/src/components/SideBar/Shares/FileLinks.vue index ad65be3bcc..0813bb9c0e 100644 --- a/packages/web-app-files/src/components/SideBar/Shares/FileLinks.vue +++ b/packages/web-app-files/src/components/SideBar/Shares/FileLinks.vue @@ -102,7 +102,7 @@ import { UpdateLinkOptions, useRouter } from '@opencloud-eu/web-pkg' -import { shareViaLinkHelp, shareViaIndirectLinkHelp } from '../../../helpers/contextualHelpers' +import { useContextualHelpers } from '../../../composables/contextualHelpers' import { isSpaceResource, LinkShare, Resource, SpaceResource } from '@opencloud-eu/web-client' import ListItem from './Links/ListItem.vue' import { isLocationSharesActive, useSharesStore } from '@opencloud-eu/web-pkg' @@ -120,6 +120,7 @@ const { dispatchModal } = useModals() const { removeResources } = useResourcesStore() const { isPasswordEnforcedForLinkType } = useLinkTypes() const { canShare } = useCanShare() +const { shareViaLinkHelp, shareViaIndirectLinkHelp } = useContextualHelpers() const canCreateLinks = computed(() => { if (!ability.can('create-all', 'PublicLink')) { diff --git a/packages/web-app-files/src/components/SideBar/Shares/FileShares.vue b/packages/web-app-files/src/components/SideBar/Shares/FileShares.vue index ae93d4ccaa..1f3f266cfa 100644 --- a/packages/web-app-files/src/components/SideBar/Shares/FileShares.vue +++ b/packages/web-app-files/src/components/SideBar/Shares/FileShares.vue @@ -97,7 +97,7 @@ import { textUtils } from '../../../helpers/textUtils' import { isShareSpaceResource, ShareTypes } from '@opencloud-eu/web-client' import InviteCollaboratorForm from './Collaborators/InviteCollaborator/InviteCollaboratorForm.vue' import CollaboratorListItem from './Collaborators/ListItem.vue' -import { shareInviteCollaboratorHelp } from '../../../helpers/contextualHelpers' +import { useContextualHelpers } from '../../../composables/contextualHelpers' import { computed, defineComponent, inject, ref, Ref, unref } from 'vue' import { isProjectSpaceResource, @@ -126,6 +126,7 @@ export default defineComponent({ const { dispatchModal } = useModals() const { canShare } = useCanShare() const { showMessage, showErrorMessage } = useMessages() + const { shareInviteCollaboratorHelp } = useContextualHelpers() const resourcesStore = useResourcesStore() const { removeResources, getAncestorById } = resourcesStore @@ -190,6 +191,12 @@ export default defineComponent({ return unref(collaboratorShares).sort(collaboratorsComparator) }) + const inviteCollaboratorHelp = computed(() => + shareInviteCollaboratorHelp({ + configStore + }) + ) + return { addShare, deleteShare, @@ -212,16 +219,12 @@ export default defineComponent({ canShare, showMessage, showErrorMessage, + inviteCollaboratorHelp, fileSideBarSharesPanelSharedWithTopExtensionPoint, fileSideBarSharesPanelSharedWithBottomExtensionPoint } }, computed: { - inviteCollaboratorHelp() { - return shareInviteCollaboratorHelp({ - configStore: this.configStore - }) - }, helpersEnabled() { return this.configOptions.contextHelpers diff --git a/packages/web-app-files/src/components/SideBar/Shares/SpaceMembers.vue b/packages/web-app-files/src/components/SideBar/Shares/SpaceMembers.vue index 8ef678511f..95543e495b 100644 --- a/packages/web-app-files/src/components/SideBar/Shares/SpaceMembers.vue +++ b/packages/web-app-files/src/components/SideBar/Shares/SpaceMembers.vue @@ -95,7 +95,7 @@ import { useUserStore } from '@opencloud-eu/web-pkg' import { computed, inject, nextTick, ref, Ref, unref, useTemplateRef, watch } from 'vue' -import { shareSpaceAddMemberHelp } from '../../../helpers/contextualHelpers' +import { useContextualHelpers } from '../../../composables/contextualHelpers' import { ProjectSpaceResource, CollaboratorShare } from '@opencloud-eu/web-client' import { useClientService } from '@opencloud-eu/web-pkg' import Fuse from 'fuse.js' @@ -119,6 +119,7 @@ const { showMessage, showErrorMessage } = useMessages() const router = useRouter() const { $gettext } = useGettext() const configStore = useConfigStore() +const { shareSpaceAddMemberHelp } = useContextualHelpers() const { user } = storeToRefs(userStore) @@ -175,9 +176,7 @@ const helpersEnabled = computed(() => { canShare({ space: unref(resource), resource: unref(resource) }) ) }) -const spaceAddMemberHelp = computed(() => { - return shareSpaceAddMemberHelp({ configStore: configStore }) -}) +const spaceAddMemberHelp = computed(() => shareSpaceAddMemberHelp({ configStore })) const hasCollaborators = computed(() => { return unref(spaceMembers).length > 0 }) diff --git a/packages/web-app-files/src/composables/contextualHelpers/index.ts b/packages/web-app-files/src/composables/contextualHelpers/index.ts new file mode 100644 index 0000000000..004a0aa99c --- /dev/null +++ b/packages/web-app-files/src/composables/contextualHelpers/index.ts @@ -0,0 +1 @@ +export * from './useContextualHelpers' diff --git a/packages/web-app-files/src/composables/contextualHelpers/useContextualHelpers.ts b/packages/web-app-files/src/composables/contextualHelpers/useContextualHelpers.ts new file mode 100644 index 0000000000..dda783894a --- /dev/null +++ b/packages/web-app-files/src/composables/contextualHelpers/useContextualHelpers.ts @@ -0,0 +1,142 @@ +import { omit } from 'lodash-es' +import { ContextualHelperData } from '@opencloud-eu/design-system/helpers' +import { ConfigStore } from '@opencloud-eu/web-pkg' +import { useGettext } from 'vue3-gettext' + +interface ContextualHelperOptions { + configStore: ConfigStore +} + +const filterContextHelper = ( + data: ContextualHelperData, + options?: ContextualHelperOptions +): ContextualHelperData => { + if (options.configStore.options.contextHelpersReadMore === false) { + return omit(data, 'readMoreLink') + } + return data +} + +export function useContextualHelpers() { + const { $gettext } = useGettext() + + const shareInviteCollaboratorHelp = (options: ContextualHelperOptions) => + filterContextHelper( + { + title: $gettext('Share with people'), + text: $gettext( + 'Use the input field to search for users and groups. Select them to share the item.' + ), + list: [ + { text: $gettext('Subfolders'), headline: true }, + { + text: $gettext( + 'If you share a folder, all of its contents and subfolders will be shared as well.' + ) + }, + { text: $gettext('Notification'), headline: true }, + { + text: $gettext( + 'People you share resources with will be notified via email or in-app notification.' + ) + }, + { text: $gettext('Incognito'), headline: true }, + { + text: $gettext('People you share resources with can not see who else has access.') + }, + { text: $gettext('"via folder"'), headline: true }, + { + text: $gettext( + 'The "via folder" is shown next to a share, if access has already been given via a parent folder. Click on the "via folder" to edit the share on its parent folder.' + ) + } + ], + readMoreLink: 'https://docs.opencloud.eu/docs/user/sharing' + }, + options + ) + + const shareSpaceAddMemberHelp = (options: ContextualHelperOptions) => + filterContextHelper( + { + title: $gettext('Add members to this Space'), + text: $gettext('Enter a name to add people or groups as members to this Space.'), + list: [ + { text: $gettext('Member capabilities'), headline: true }, + { + text: $gettext( + 'Members are able to see who has access to this space and access all files in this space. Read or write permissions can be set by assigning a role.' + ) + }, + { text: $gettext('Space manager capabilities'), headline: true }, + { + text: $gettext( + 'Members with the Manager role are able to edit all properties and content of a Space, such as adding or removing members, sharing subfolders with non-members, or creating links to share.' + ) + } + ], + readMoreLink: 'https://docs.opencloud.eu/docs/user/sharing' + }, + options + ) + + const shareViaLinkHelp = (options: ContextualHelperOptions) => + filterContextHelper( + { + title: $gettext('Choose how access is granted'), + list: [ + { + text: $gettext( + 'No login required. Everyone with the link can access. If you share this link with people from the list "Invited people", they need to login so that their individual assigned permissions can take effect. If they are not logged-in, the permissions of the link take effect.' + ) + } + ], + readMoreLink: 'https://docs.opencloud.eu/docs/user/sharing' + }, + options + ) + + const shareViaIndirectLinkHelp = (options: ContextualHelperOptions) => + filterContextHelper( + { + title: $gettext('What are indirect links?'), + text: $gettext('Indirect links are links giving access by a parent folder.'), + list: [ + { + text: $gettext('How to edit indirect links'), + headline: true + }, + { + text: $gettext( + 'Indirect links can only be edited in their parent folder. Click on the folder icon below the link to navigate to the parent folder.' + ) + } + ], + readMoreLink: 'https://docs.opencloud.eu/docs/user/sharing' + }, + options + ) + + const tagsHelper = (options: ContextualHelperOptions) => + filterContextHelper( + { + title: $gettext('Who can view tags?'), + list: [ + { + text: $gettext( + 'Everyone who can view the file can view its tags. Likewise, everyone who can edit the file can edit its tags.' + ) + } + ] + }, + options + ) + + return { + shareInviteCollaboratorHelp, + shareSpaceAddMemberHelp, + shareViaLinkHelp, + shareViaIndirectLinkHelp, + tagsHelper + } +} diff --git a/packages/web-app-files/src/helpers/contextualHelpers.ts b/packages/web-app-files/src/helpers/contextualHelpers.ts deleted file mode 100644 index 8f8dd2df64..0000000000 --- a/packages/web-app-files/src/helpers/contextualHelpers.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { omit } from 'lodash-es' -import { ContextualHelperData } from '@opencloud-eu/design-system/helpers' -import { ConfigStore } from '@opencloud-eu/web-pkg' -import { useGettext } from 'vue3-gettext' - -interface ContextualHelperOptions { - configStore: ConfigStore -} - -export const shareInviteCollaboratorHelp = (options: ContextualHelperOptions) => { - const { $gettext } = useGettext() - return filterContextHelper( - { - title: $gettext('Share with people'), - text: $gettext( - 'Use the input field to search for users and groups. Select them to share the item.' - ), - list: [ - { text: $gettext('Subfolders'), headline: true }, - { - text: $gettext( - 'If you share a folder, all of its contents and subfolders will be shared as well.' - ) - }, - { text: $gettext('Notification'), headline: true }, - { - text: $gettext( - 'People you share resources with will be notified via email or in-app notification.' - ) - }, - { text: $gettext('Incognito'), headline: true }, - { - text: $gettext('People you share resources with can not see who else has access.') - }, - { text: $gettext('"via folder"'), headline: true }, - { - text: $gettext( - 'The "via folder" is shown next to a share, if access has already been given via a parent folder. Click on the "via folder" to edit the share on its parent folder.' - ) - } - ], - readMoreLink: 'https://docs.opencloud.eu/docs/user/sharing' - }, - options - ) -} - -export const shareSpaceAddMemberHelp = (options: ContextualHelperOptions) => { - const { $gettext } = useGettext() - return filterContextHelper( - { - title: $gettext('Add members to this Space'), - text: $gettext('Enter a name to add people or groups as members to this Space.'), - list: [ - { text: $gettext('Member capabilities'), headline: true }, - { - text: $gettext( - 'Members are able to see who has access to this space and access all files in this space. Read or write permissions can be set by assigning a role.' - ) - }, - { text: $gettext('Space manager capabilities'), headline: true }, - { - text: $gettext( - 'Members with the Manager role are able to edit all properties and content of a Space, such as adding or removing members, sharing subfolders with non-members, or creating links to share.' - ) - } - ], - readMoreLink: 'https://docs.opencloud.eu/docs/user/sharing' - }, - options - ) -} -export const shareViaLinkHelp = (options: ContextualHelperOptions) => { - const { $gettext } = useGettext() - return filterContextHelper( - { - title: $gettext('Choose how access is granted'), - list: [ - { - text: $gettext( - 'No login required. Everyone with the link can access. If you share this link with people from the list "Invited people", they need to login so that their individual assigned permissions can take effect. If they are not logged-in, the permissions of the link take effect.' - ) - } - ], - readMoreLink: 'https://docs.opencloud.eu/docs/user/sharing' - }, - options - ) -} -export const shareViaIndirectLinkHelp = (options: ContextualHelperOptions) => { - const { $gettext } = useGettext() - return filterContextHelper( - { - title: $gettext('What are indirect links?'), - text: $gettext('Indirect links are links giving access by a parent folder.'), - list: [ - { - text: $gettext('How to edit indirect links'), - headline: true - }, - { - text: $gettext( - 'Indirect links can only be edited in their parent folder. Click on the folder icon below the link to navigate to the parent folder.' - ) - } - ], - readMoreLink: 'https://docs.opencloud.eu/docs/user/sharing' - }, - options - ) -} - -const filterContextHelper = ( - data: ContextualHelperData, - options?: ContextualHelperOptions -): ContextualHelperData => { - if (options.configStore.options.contextHelpersReadMore === false) { - return omit(data, 'readMoreLink') - } - return data -} - -export const tagsHelper = (options: ContextualHelperOptions) => - filterContextHelper( - { - title: $gettext('Who can view tags?'), - list: [ - { - text: $gettext( - 'Everyone who can view the file can view its tags. Likewise, everyone who can edit the file can edit its tags.' - ) - } - ] - }, - options - ) From 9ec46de768b214f0f5d7e8e8ece6d89659c34a1c Mon Sep 17 00:00:00 2001 From: Alexander Ackermann Date: Mon, 27 Apr 2026 11:20:26 +0200 Subject: [PATCH 3/5] format --- .../web-app-files/src/components/SideBar/Shares/FileShares.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/web-app-files/src/components/SideBar/Shares/FileShares.vue b/packages/web-app-files/src/components/SideBar/Shares/FileShares.vue index 1f3f266cfa..817e1e4d1a 100644 --- a/packages/web-app-files/src/components/SideBar/Shares/FileShares.vue +++ b/packages/web-app-files/src/components/SideBar/Shares/FileShares.vue @@ -225,7 +225,6 @@ export default defineComponent({ } }, computed: { - helpersEnabled() { return this.configOptions.contextHelpers }, From bd47dc9926a86bd9e30dbb9fd2d67e1dba8666b0 Mon Sep 17 00:00:00 2001 From: Alexander Ackermann Date: Tue, 28 Apr 2026 09:46:35 +0200 Subject: [PATCH 4/5] refactor webfinger and pdf viewer app to defineWebApplication --- packages/web-app-pdf-viewer/src/index.ts | 77 ++++++++++--------- packages/web-app-webfinger/src/index.ts | 69 +++++++++-------- .../web-pkg/src/helpers/ui/resourceTiles.ts | 5 +- packages/web-pkg/src/router/common.ts | 3 +- packages/web-pkg/src/router/index.ts | 3 +- packages/web-pkg/src/router/public.ts | 3 +- packages/web-pkg/src/router/shares.ts | 3 +- packages/web-pkg/src/router/spaces.ts | 3 +- packages/web-pkg/src/router/trash.ts | 3 +- packages/web-pkg/src/router/utils.ts | 9 +-- packages/web-pkg/src/utils/dummyGettext.ts | 8 ++ packages/web-pkg/src/utils/index.ts | 1 + 12 files changed, 102 insertions(+), 85 deletions(-) create mode 100644 packages/web-pkg/src/utils/dummyGettext.ts diff --git a/packages/web-app-pdf-viewer/src/index.ts b/packages/web-app-pdf-viewer/src/index.ts index 8190904a0a..8b76d8332d 100644 --- a/packages/web-app-pdf-viewer/src/index.ts +++ b/packages/web-app-pdf-viewer/src/index.ts @@ -1,41 +1,48 @@ +import { useGettext } from 'vue3-gettext' import translations from '../l10n/translations.json' -import { AppWrapperRoute, $gettext } from '@opencloud-eu/web-pkg' +import { AppWrapperRoute, defineWebApplication } from '@opencloud-eu/web-pkg' import PdfViewer from './App.vue' -const routes = [ - { - path: '/:driveAliasAndItem(.*)?', - component: AppWrapperRoute(PdfViewer, { - applicationId: 'pdf-viewer', - urlForResourceOptions: { - disposition: 'inline' +export default defineWebApplication({ + setup() { + const { $gettext } = useGettext() + + const appId = 'pdf-viewer' + + const routes = [ + { + path: '/:driveAliasAndItem(.*)?', + component: AppWrapperRoute(PdfViewer, { + applicationId: appId, + urlForResourceOptions: { + disposition: 'inline' + } + }), + name: 'pdf-viewer', + meta: { + authContext: 'hybrid', + title: $gettext('PDF Viewer'), + patchCleanPath: true + } } - }), - name: 'pdf-viewer', - meta: { - authContext: 'hybrid', - title: $gettext('PDF Viewer'), - patchCleanPath: true - } - } -] + ] -const appInfo = { - name: $gettext('PDF Viewer'), - id: 'pdf-viewer', - icon: 'resource-type-pdf', - iconFillType: 'fill', - iconColor: 'var(--oc-color-icon-pdf)', - extensions: [ - { - extension: 'pdf', - routeName: 'pdf-viewer' + return { + appInfo: { + name: $gettext('PDF Viewer'), + id: appId, + icon: 'resource-type-pdf', + iconFillType: 'fill', + iconColor: 'var(--oc-color-icon-pdf)', + extensions: [ + { + extension: 'pdf', + routeName: 'pdf-viewer' + } + ] + }, + routes, + translations } - ] -} - -export default { - appInfo, - routes, - translations -} + } +}) diff --git a/packages/web-app-webfinger/src/index.ts b/packages/web-app-webfinger/src/index.ts index 3fbb5c6438..abfbc17bf3 100644 --- a/packages/web-app-webfinger/src/index.ts +++ b/packages/web-app-webfinger/src/index.ts @@ -1,38 +1,43 @@ +import { useGettext } from 'vue3-gettext' import translations from '../l10n/translations.json' +import { defineWebApplication } from '@opencloud-eu/web-pkg' import Resolve from './views/Resolve.vue' -import { $gettext } from '@opencloud-eu/web-pkg' -const appInfo = { - name: $gettext('Webfinger'), - id: 'webfinger', - icon: 'fingerprint' -} +export default defineWebApplication({ + setup() { + const { $gettext } = useGettext() -const routes = () => [ - { - name: 'webfinger-root', - path: '/', - redirect: () => { - return { name: 'webfinger-resolve' } - }, - meta: { - authContext: 'anonymous' - } - }, - { - path: '/resolve', - name: 'webfinger-resolve', - component: Resolve, - meta: { - authContext: 'idp', - title: $gettext('Resolve destination'), - entryPoint: true + const routes = [ + { + name: 'webfinger-root', + path: '/', + redirect: () => { + return { name: 'webfinger-resolve' } + }, + meta: { + authContext: 'anonymous' + } + }, + { + path: '/resolve', + name: 'webfinger-resolve', + component: Resolve, + meta: { + authContext: 'idp', + title: $gettext('Resolve destination'), + entryPoint: true + } + } + ] + + return { + appInfo: { + name: $gettext('Webfinger'), + id: 'webfinger', + icon: 'fingerprint' + }, + routes, + translations } } -] - -export default { - appInfo, - routes, - translations -} +}) diff --git a/packages/web-pkg/src/helpers/ui/resourceTiles.ts b/packages/web-pkg/src/helpers/ui/resourceTiles.ts index e3c63f6a33..327494ef56 100644 --- a/packages/web-pkg/src/helpers/ui/resourceTiles.ts +++ b/packages/web-pkg/src/helpers/ui/resourceTiles.ts @@ -2,10 +2,7 @@ import { Resource } from '@opencloud-eu/web-client' import { SortField } from '../../composables/sort' import { Language } from 'vue3-gettext' import { SortDir } from '@opencloud-eu/design-system/helpers' - -function $gettext(msg: string) { - return msg -} +import { $gettext } from '../../utils/dummyGettext' export const sortFields: SortField[] = [ { diff --git a/packages/web-pkg/src/router/common.ts b/packages/web-pkg/src/router/common.ts index 9d302d9f40..ffc1860c38 100644 --- a/packages/web-pkg/src/router/common.ts +++ b/packages/web-pkg/src/router/common.ts @@ -1,6 +1,7 @@ import { RouteComponents } from './router' import { RouteLocationNamedRaw, RouteRecordRaw } from 'vue-router' -import { createLocation, $gettext, isLocationActiveDirector } from './utils' +import { createLocation, isLocationActiveDirector } from './utils' +import { $gettext } from '../utils/dummyGettext' type commonTypes = 'files-common-favorites' | 'files-common-search' diff --git a/packages/web-pkg/src/router/index.ts b/packages/web-pkg/src/router/index.ts index 6a33680ead..8369fdfc7f 100644 --- a/packages/web-pkg/src/router/index.ts +++ b/packages/web-pkg/src/router/index.ts @@ -34,7 +34,8 @@ import { isLocationTrashActive, createLocationTrash } from './trash' -import { isLocationActiveDirector, createLocation, $gettext } from './utils' +import { isLocationActiveDirector, createLocation } from './utils' +import { $gettext } from '../utils/dummyGettext' import type { ActiveRouteDirectorFunc } from './utils' const ROOT_ROUTE = { diff --git a/packages/web-pkg/src/router/public.ts b/packages/web-pkg/src/router/public.ts index 911537f1e1..58166a91a8 100644 --- a/packages/web-pkg/src/router/public.ts +++ b/packages/web-pkg/src/router/public.ts @@ -1,6 +1,7 @@ import { RouteComponents } from './router' import { RouteLocationNamedRaw, RouteRecordRaw } from 'vue-router' -import { createLocation, isLocationActiveDirector, $gettext } from './utils' +import { createLocation, isLocationActiveDirector } from './utils' +import { $gettext } from '../utils/dummyGettext' type shareTypes = 'files-public-link' | 'files-public-upload' diff --git a/packages/web-pkg/src/router/shares.ts b/packages/web-pkg/src/router/shares.ts index d09f37d13f..8c17f7acbd 100644 --- a/packages/web-pkg/src/router/shares.ts +++ b/packages/web-pkg/src/router/shares.ts @@ -1,6 +1,7 @@ import { RouteComponents } from './router' import { RouteLocationNamedRaw, RouteRecordRaw } from 'vue-router' -import { createLocation, isLocationActiveDirector, $gettext } from './utils' +import { createLocation, isLocationActiveDirector } from './utils' +import { $gettext } from '../utils/dummyGettext' export type RouteShareTypes = | 'files-shares' diff --git a/packages/web-pkg/src/router/spaces.ts b/packages/web-pkg/src/router/spaces.ts index d9e62f40b1..13c3b1d004 100644 --- a/packages/web-pkg/src/router/spaces.ts +++ b/packages/web-pkg/src/router/spaces.ts @@ -1,6 +1,7 @@ import { RouteLocationNamedRaw, RouteRecordRaw } from 'vue-router' import { RouteComponents } from './router' -import { createLocation, isLocationActiveDirector, $gettext } from './utils' +import { createLocation, isLocationActiveDirector } from './utils' +import { $gettext } from '../utils/dummyGettext' type spaceTypes = 'files-spaces-projects' | 'files-spaces-generic' diff --git a/packages/web-pkg/src/router/trash.ts b/packages/web-pkg/src/router/trash.ts index fa20ad400d..ebd4f7725f 100644 --- a/packages/web-pkg/src/router/trash.ts +++ b/packages/web-pkg/src/router/trash.ts @@ -1,6 +1,7 @@ import { RouteComponents } from './router' import { RouteLocationNamedRaw, RouteRecordRaw } from 'vue-router' -import { $gettext, createLocation, isLocationActiveDirector } from './utils' +import { createLocation, isLocationActiveDirector } from './utils' +import { $gettext } from '../utils/dummyGettext' type trashTypes = 'files-trash-generic' | 'files-trash-overview' diff --git a/packages/web-pkg/src/router/utils.ts b/packages/web-pkg/src/router/utils.ts index 10c407a5e5..4e2f2a0194 100644 --- a/packages/web-pkg/src/router/utils.ts +++ b/packages/web-pkg/src/router/utils.ts @@ -70,14 +70,7 @@ export const isLocationActiveDirector = ( } } -/** - * just a dummy function to trick gettext tools - * - * @param msg - */ -export function $gettext(msg: string): string { - return msg -} +export { $gettext } from '../utils/dummyGettext' /** * create a location with attached default values diff --git a/packages/web-pkg/src/utils/dummyGettext.ts b/packages/web-pkg/src/utils/dummyGettext.ts new file mode 100644 index 0000000000..a4529d659e --- /dev/null +++ b/packages/web-pkg/src/utils/dummyGettext.ts @@ -0,0 +1,8 @@ +/** + * just a dummy function to trick gettext tools + * + * @param msg + */ +export function $gettext(msg: string): string { + return msg +} diff --git a/packages/web-pkg/src/utils/index.ts b/packages/web-pkg/src/utils/index.ts index f9b37ac189..e723d06395 100644 --- a/packages/web-pkg/src/utils/index.ts +++ b/packages/web-pkg/src/utils/index.ts @@ -3,3 +3,4 @@ export * from './encodePath' export * from './objectKeys' export * from './semver' export * from './types' +export * from './dummyGettext' From 7e5e3c3c0bc4a76722a3ada6935f22df87ce6932 Mon Sep 17 00:00:00 2001 From: Alexander Ackermann Date: Tue, 28 Apr 2026 15:16:00 +0200 Subject: [PATCH 5/5] fix types --- packages/web-app-webfinger/package.json | 3 ++- packages/web-app-webfinger/src/index.ts | 3 ++- pnpm-lock.yaml | 3 +++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/web-app-webfinger/package.json b/packages/web-app-webfinger/package.json index 36afd48976..2752ee2d4a 100644 --- a/packages/web-app-webfinger/package.json +++ b/packages/web-app-webfinger/package.json @@ -10,6 +10,7 @@ "peerDependencies": { "@opencloud-eu/design-system": "workspace:^", "@opencloud-eu/web-client": "workspace:*", - "@opencloud-eu/web-pkg": "workspace:*" + "@opencloud-eu/web-pkg": "workspace:*", + "vue-router": "5.0.4" } } diff --git a/packages/web-app-webfinger/src/index.ts b/packages/web-app-webfinger/src/index.ts index abfbc17bf3..365eb3e2c2 100644 --- a/packages/web-app-webfinger/src/index.ts +++ b/packages/web-app-webfinger/src/index.ts @@ -1,13 +1,14 @@ import { useGettext } from 'vue3-gettext' import translations from '../l10n/translations.json' import { defineWebApplication } from '@opencloud-eu/web-pkg' +import { RouteRecordRaw } from 'vue-router' import Resolve from './views/Resolve.vue' export default defineWebApplication({ setup() { const { $gettext } = useGettext() - const routes = [ + const routes: RouteRecordRaw[] = [ { name: 'webfinger-root', path: '/', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 71470c3565..f8dcae00b6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -777,6 +777,9 @@ importers: '@opencloud-eu/web-pkg': specifier: workspace:* version: link:../web-pkg + vue-router: + specifier: 5.0.4 + version: 5.0.4(@vue/compiler-sfc@3.5.32)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.32(typescript@6.0.3)))(vue@3.5.32(typescript@6.0.3)) devDependencies: '@opencloud-eu/web-test-helpers': specifier: workspace:*