diff --git a/apps/files_versions/src/components/Version.vue b/apps/files_versions/src/components/Version.vue
index ca4cb3eac77..7235566f48e 100644
--- a/apps/files_versions/src/components/Version.vue
+++ b/apps/files_versions/src/components/Version.vue
@@ -31,16 +31,19 @@
{{ versionLabel }}
-
+
@@ -53,7 +56,7 @@
-
+
•
{{ humanReadableSize }}
@@ -114,8 +117,18 @@
import type { PropType } from 'vue'
import type { Version } from '../utils/versions'
+import { getCurrentUser } from '@nextcloud/auth'
+import { Permission, formatFileSize } from '@nextcloud/files'
+import { loadState } from '@nextcloud/initial-state'
+import { t } from '@nextcloud/l10n'
+import { joinPaths } from '@nextcloud/paths'
+import { getRootUrl, generateUrl } from '@nextcloud/router'
import { defineComponent } from 'vue'
+import axios from '@nextcloud/axios'
+import moment from '@nextcloud/moment'
+import logger from '../utils/logger'
+
import BackupRestore from 'vue-material-design-icons/BackupRestore.vue'
import Delete from 'vue-material-design-icons/Delete.vue'
import Download from 'vue-material-design-icons/Download.vue'
@@ -130,14 +143,6 @@ import NcDateTime from '@nextcloud/vue/components/NcDateTime'
import NcListItem from '@nextcloud/vue/components/NcListItem'
import Tooltip from '@nextcloud/vue/directives/Tooltip'
-import { Permission, formatFileSize } from '@nextcloud/files'
-import { loadState } from '@nextcloud/initial-state'
-import { t } from '@nextcloud/l10n'
-import { joinPaths } from '@nextcloud/paths'
-import { getRootUrl, generateOcsUrl } from '@nextcloud/router'
-import axios from '@nextcloud/axios'
-import moment from '@nextcloud/moment'
-
const hasPermission = (permissions: number, permission: number): boolean => (permissions & permission) !== 0
export default defineComponent({
@@ -295,21 +300,26 @@ export default defineComponent({
},
async fetchDisplayName() {
- // check to make sure that we have a valid author - in case database did not migrate, null author, etc.
- if (this.version.author) {
+ this.versionAuthor = null
+ if (!this.version.author) {
+ return
+ }
+
+ if (this.version.author === getCurrentUser()?.uid) {
+ this.versionAuthor = t('files_versions', 'You')
+ } else {
try {
- const { data } = await axios.get(generateOcsUrl(`/cloud/users/${this.version.author}`))
- this.versionAuthor = data.ocs.data.displayname
- } catch (e) {
- // Promise got rejected - default to null author to not try to load author profile
- this.versionAuthor = null
+ const { data } = await axios.post(generateUrl('/displaynames'), { users: [this.version.author] })
+ this.versionAuthor = data.users[this.version.author]
+ } catch (error) {
+ logger.warn('Could not load user display name', { error })
}
}
},
click() {
if (!this.canView) {
- window.location = this.downloadURL
+ window.location.href = this.downloadURL
return
}
this.$emit('click', { version: this.version })
diff --git a/apps/files_versions/src/views/VersionTab.vue b/apps/files_versions/src/views/VersionTab.vue
index 8bdb51f088d..c088c9a1b9d 100644
--- a/apps/files_versions/src/views/VersionTab.vue
+++ b/apps/files_versions/src/views/VersionTab.vue
@@ -4,28 +4,27 @@
-->
-
-
-
-
+
{
cy.get('[data-files-versions-version]').eq(2).contains('Initial version')
})
})
+
+ it('See yourself as version author', () => {
+ cy.visit('/apps/files')
+ openVersionsPanel(randomFileName)
+
+ cy.findByRole('tabpanel', { name: 'Versions' })
+ .findByRole('list', { name: 'File versions' })
+ .findAllByRole('listitem')
+ .should('have.length', 3)
+ .first()
+ .find('[data-cy-files-version-author-name]')
+ .should('exist')
+ .and('contain.text', 'You')
+ })
})
diff --git a/cypress/e2e/files_versions/version_sharing.cy.ts b/cypress/e2e/files_versions/version_sharing.cy.ts
new file mode 100644
index 00000000000..e978cb42fd9
--- /dev/null
+++ b/cypress/e2e/files_versions/version_sharing.cy.ts
@@ -0,0 +1,46 @@
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import type { User } from '@nextcloud/cypress'
+import { openVersionsPanel, setupTestSharedFileFromUser, uploadThreeVersions } from './filesVersionsUtils.ts'
+import { navigateToFolder, triggerActionForFile } from '../files/FilesUtils.ts'
+
+describe('Versions on shares', () => {
+ const randomSharedFolderName = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10)
+ const randomFileName = Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, 10) + '.txt'
+ const randomFilePath = `${randomSharedFolderName}/${randomFileName}`
+ let alice: User
+ let bob: User
+
+ before(() => {
+ cy.createRandomUser()
+ .then((user) => {
+ alice = user
+ })
+ .then(() => {
+ cy.mkdir(alice, `/${randomSharedFolderName}`)
+ return setupTestSharedFileFromUser(alice, randomSharedFolderName, {})
+ })
+ .then((user) => { bob = user })
+ .then(() => uploadThreeVersions(alice, randomFilePath))
+ })
+
+ it('See sharees display name as author', () => {
+ cy.login(bob)
+ cy.visit('/apps/files')
+
+ navigateToFolder(randomSharedFolderName)
+
+ triggerActionForFile(randomFileName, 'details')
+ cy.findByRole('tab', { name: 'Versions' }).click()
+
+ cy.findByRole('tabpanel', { name: 'Versions' })
+ .findByRole('list', { name: 'File versions' })
+ .findAllByRole('listitem')
+ .first()
+ .find('[data-cy-files-version-author-name]')
+ .should('be.visible')
+ .and('contain.text', alice.userId)
+ })
+})