Skip to content

Commit

Permalink
feat(sidebar): Show node owner in metadata subline
Browse files Browse the repository at this point in the history
Resolves: #46178

Signed-off-by: fenn-cs <[email protected]>
  • Loading branch information
nfebe committed Jul 27, 2024
1 parent 1198f64 commit 1a55a34
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 18 deletions.
13 changes: 12 additions & 1 deletion apps/files/src/services/WebdavClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,17 @@
* SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { davGetClient } from '@nextcloud/files'
import { davGetClient, davGetDefaultPropfind, davResultToNode, davRootPath } from '@nextcloud/files'
import type { FileStat, ResponseDataDetailed } from 'webdav'
import type { Node } from '@nextcloud/files'

export const client = davGetClient()

export const fetchNode = async (node: Node): Promise<Node> => {
const propfindPayload = davGetDefaultPropfind()
const result = await client.stat(`${davRootPath}${node.path}`, {
details: true,
data: propfindPayload,
}) as ResponseDataDetailed<FileStat>
return davResultToNode(result.data)
}
81 changes: 64 additions & 17 deletions apps/files/src/views/Sidebar.vue
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,20 @@
@closing="handleClosing"
@closed="handleClosed">
<template v-if="fileInfo" #subname>
<NcIconSvgWrapper v-if="fileInfo.isFavourited"
:path="mdiStar"
:name="t('files', 'Favorite')"
inline />
{{ size }}
<NcDateTime :timestamp="fileInfo.mtime" />
<div class="sidebar__subname">
<NcIconSvgWrapper v-if="fileInfo.isFavourited"
:path="mdiStar"
:name="t('files', 'Favorite')"
inline />
<span>{{ size }}</span>
<span class="sidebar__subname-separator">.</span>
<NcDateTime :timestamp="fileInfo.mtime" />
<span class="sidebar__subname-separator">.</span>
<span>{{ t('files', 'Owned by') }}</span>
<NcUserBubble :user="ownerId"
:display-name="nodeOwnerLabel" />
</div>
</template>

<!-- TODO: create a standard to allow multiple elements here? -->
<template v-if="fileInfo" #description>
<div class="sidebar__description">
Expand Down Expand Up @@ -95,6 +101,7 @@ import { encodePath } from '@nextcloud/paths'
import { generateRemoteUrl, generateUrl } from '@nextcloud/router'
import { ShareType } from '@nextcloud/sharing'
import { mdiStar, mdiStarOutline } from '@mdi/js'
import { fetchNode } from '../services/WebdavClient.ts'
import axios from '@nextcloud/axios'
import $ from 'jquery'
Expand All @@ -103,6 +110,7 @@ import NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'
import NcDateTime from '@nextcloud/vue/dist/Components/NcDateTime.js'
import NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent.js'
import NcIconSvgWrapper from '@nextcloud/vue/dist/Components/NcIconSvgWrapper.js'
import NcUserBubble from '@nextcloud/vue/dist/Components/NcUserBubble.js'
import FileInfo from '../services/FileInfo.js'
import LegacyView from '../components/LegacyView.vue'
Expand All @@ -122,15 +130,12 @@ export default {
NcIconSvgWrapper,
SidebarTab,
SystemTags,
NcUserBubble,
},
setup() {
const currentUser = getCurrentUser()
// Non reactive properties
return {
currentUser,
mdiStar,
mdiStarOutline,
}
Expand All @@ -139,12 +144,14 @@ export default {
data() {
return {
// reactive state
currentUser: getCurrentUser(),
Sidebar: OCA.Files.Sidebar.state,
showTags: false,
showTagsDefault: true,
error: null,
loading: true,
fileInfo: null,
node: null,
isFullScreen: false,
hasLowHeight: false,
}
Expand Down Expand Up @@ -287,6 +294,25 @@ export default {
isSystemTagsEnabled() {
return getCapabilities()?.systemtags?.enabled === true
},
ownerId() {
return this.node?.attributes?.['owner-id'] ?? this.currentUser.uid
},
currentUserIsOwner() {
return this.ownerId === this.currentUser.uid
},
nodeOwnerLabel() {
if (this.currentUserIsOwner) {
return t('files', 'you')
}
const ownerDisplayName = this.node?.attributes?.['owner-display-name']
return ownerDisplayName
},
sharedMultipleTimes() {
if (Array.isArray(node.attributes?.['share-types']) && node.attributes?.['share-types'].length > 1) {
return t('files', 'Shared multiple times with different people')
}
return null
},
},
created() {
subscribe('files:node:deleted', this.onNodeDeleted)
Expand All @@ -298,7 +324,6 @@ export default {
unsubscribe('file:node:deleted', this.onNodeDeleted)
window.removeEventListener('resize', this.handleWindowResize)
},
methods: {
/**
* Can this tab be displayed ?
Expand Down Expand Up @@ -460,6 +485,7 @@ export default {
this.fileInfo = await FileInfo(this.davPath)
// adding this as fallback because other apps expect it
this.fileInfo.dir = this.file.split('/').slice(0, -1).join('/')
this.node = await fetchNode({ path: (this.fileInfo.path + '/' + this.fileInfo.name).replace('//', '/') })
// DEPRECATED legacy views
// TODO: remove
Expand Down Expand Up @@ -549,6 +575,12 @@ export default {
handleWindowResize() {
this.hasLowHeight = document.documentElement.clientHeight < 1024
},
sharedMultipleTimes() {

Check failure on line 578 in apps/files/src/views/Sidebar.vue

View workflow job for this annotation

GitHub Actions / NPM lint

Duplicate key 'sharedMultipleTimes'. May cause name collision in script or template tag
// Mixed share types
if (Array.isArray(this.node.attributes?.['share-types']) && this.node.attributes?.['share-types'].length > 1) {
return t('files', 'Shared multiple times with different people')
}
},
},
}
</script>
Expand Down Expand Up @@ -589,10 +621,25 @@ export default {
}
}
.sidebar__description {
display: flex;
flex-direction: column;
width: 100%;
gap: 8px 0;
.sidebar__subname {
display: flex;
align-items: center;
gap: 0 8px;
&-separator {
display: inline-block;
font-weight: bold !important;
}
.user-bubble__wrapper {
display: inline-flex;
}
}
.sidebar__description {
display: flex;
flex-direction: column;
width: 100%;
gap: 8px 0;
}
</style>

0 comments on commit 1a55a34

Please sign in to comment.