diff options
author | skjnldsv <skjnldsv@protonmail.com> | 2024-02-22 09:43:44 +0100 |
---|---|---|
committer | Ferdinand Thiessen <opensource@fthiessen.de> | 2024-02-23 02:52:32 +0100 |
commit | 0a9b498b5af6c8e554e03a01ec6b5c996ee09086 (patch) | |
tree | f86119da722d34812d71387ebe432e502aed1380 /apps/files_versions/src/components/Version.vue | |
parent | 57f27a14b4ef5a9650b69d5e3be1af6ff16cc4fe (diff) | |
download | nextcloud-server-0a9b498b5af6c8e554e03a01ec6b5c996ee09086.tar.gz nextcloud-server-0a9b498b5af6c8e554e03a01ec6b5c996ee09086.zip |
chore(files_versions): improve and fix technical debt on `Version.vue`
Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
Diffstat (limited to 'apps/files_versions/src/components/Version.vue')
-rw-r--r-- | apps/files_versions/src/components/Version.vue | 95 |
1 files changed, 48 insertions, 47 deletions
diff --git a/apps/files_versions/src/components/Version.vue b/apps/files_versions/src/components/Version.vue index 4a24891d49a..690ef7d5f78 100644 --- a/apps/files_versions/src/components/Version.vue +++ b/apps/files_versions/src/components/Version.vue @@ -21,6 +21,7 @@ :force-display-actions="true" data-files-versions-version @click="click"> + <!-- Icon --> <template #icon> <div v-if="!(loadPreview || previewLoaded)" class="version__image" /> <img v-else-if="(isCurrent || version.hasPreview) && !previewErrored" @@ -37,6 +38,8 @@ <ImageOffOutline :size="20" /> </div> </template> + + <!-- Version file size as subline --> <template #subname> <div class="version__info"> <span :title="formattedDate">{{ version.mtime | humanDateFromNow }}</span> @@ -45,6 +48,8 @@ <span class="version__info__size">{{ version.size | humanReadableSize }}</span> </div> </template> + + <!-- Actions --> <template #actions> <NcActionButton v-if="enableLabeling && hasUpdatePermissions" :close-after-click="true" @@ -91,28 +96,34 @@ </NcListItem> </template> -<script> +<script lang="ts"> +import type { Version } from '../utils/versions' + 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' import FileCompare from 'vue-material-design-icons/FileCompare.vue' -import Pencil from 'vue-material-design-icons/Pencil.vue' -import Delete from 'vue-material-design-icons/Delete.vue' import ImageOffOutline from 'vue-material-design-icons/ImageOffOutline.vue' +import Pencil from 'vue-material-design-icons/Pencil.vue' + import NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js' import NcActionLink from '@nextcloud/vue/dist/Components/NcActionLink.js' import NcListItem from '@nextcloud/vue/dist/Components/NcListItem.js' import Tooltip from '@nextcloud/vue/dist/Directives/Tooltip.js' -import moment from '@nextcloud/moment' -import { translate as t } from '@nextcloud/l10n' -import { joinPaths } from '@nextcloud/paths' + +import { defineComponent, type PropType } from 'vue' import { getRootUrl } from '@nextcloud/router' +import { joinPaths } from '@nextcloud/paths' import { loadState } from '@nextcloud/initial-state' -import { Permission } from '@nextcloud/files' +import { Permission, formatFileSize } from '@nextcloud/files' +import { translate as t } from '@nextcloud/l10n' +import moment from '@nextcloud/moment' -import { hasPermissions } from '../../../files_sharing/src/lib/SharePermissionsToolBox.js' +const hasPermission = (permissions: number, permission: number): boolean => (permissions & permission) !== 0 -export default { +export default defineComponent({ name: 'Version', + components: { NcActionLink, NcActionButton, @@ -124,29 +135,24 @@ export default { Delete, ImageOffOutline, }, + directives: { tooltip: Tooltip, }, + filters: { - /** - * @param {number} bytes - * @return {string} - */ - humanReadableSize(bytes) { - return OC.Util.humanFileSize(bytes) + humanReadableSize(bytes: number): string { + return formatFileSize(bytes) }, - /** - * @param {number} timestamp - * @return {string} - */ - humanDateFromNow(timestamp) { + + humanDateFromNow(timestamp: number): string { return moment(timestamp).fromNow() }, }, + props: { - /** @type {Vue.PropOptions<import('../utils/versions.ts').Version>} */ version: { - type: Object, + type: Object as PropType<Version>, required: true, }, fileInfo: { @@ -174,6 +180,9 @@ export default { default: false, }, }, + + emits: ['click', 'compare', 'restore', 'delete', 'label-update-request'], + data() { return { previewLoaded: false, @@ -181,11 +190,9 @@ export default { capabilities: loadState('core', 'capabilities', { files: { version_labeling: false, version_deletion: false } }), } }, + computed: { - /** - * @return {string} - */ - versionLabel() { + versionLabel(): string { const label = this.version.label ?? '' if (this.isCurrent) { @@ -203,10 +210,7 @@ export default { return label }, - /** - * @return {string} - */ - downloadURL() { + downloadURL(): string { if (this.isCurrent) { return getRootUrl() + joinPaths('/remote.php/webdav', this.fileInfo.path, this.fileInfo.name) } else { @@ -214,41 +218,37 @@ export default { } }, - /** @return {string} */ - formattedDate() { + formattedDate(): string { return moment(this.version.mtime).format('LLL') }, - /** @return {boolean} */ - enableLabeling() { + enableLabeling(): boolean { return this.capabilities.files.version_labeling === true }, - /** @return {boolean} */ - enableDeletion() { + enableDeletion(): boolean { return this.capabilities.files.version_deletion === true }, - /** @return {boolean} */ - hasDeletePermissions() { - return hasPermissions(this.fileInfo.permissions, Permission.DELETE) + hasDeletePermissions(): boolean { + return hasPermission(this.fileInfo.permissions, Permission.DELETE) }, - /** @return {boolean} */ - hasUpdatePermissions() { - return hasPermissions(this.fileInfo.permissions, Permission.UPDATE) + hasUpdatePermissions(): boolean { + return hasPermission(this.fileInfo.permissions, Permission.UPDATE) }, - /** @return {boolean} */ - isDownloadable() { + isDownloadable(): boolean { if ((this.fileInfo.permissions & Permission.READ) === 0) { return false } // If the mount type is a share, ensure it got download permissions. if (this.fileInfo.mountType === 'shared') { - const downloadAttribute = this.fileInfo.shareAttributes.find((attribute) => attribute.scope === 'permissions' && attribute.key === 'download') - if (downloadAttribute !== undefined && downloadAttribute.enabled === false) { + const downloadAttribute = this.fileInfo.shareAttributes + .find((attribute) => attribute.scope === 'permissions' && attribute.key === 'download') || {} + // If the download attribute is set to false, the file is not downloadable + if (downloadAttribute?.enabled === false) { return false } } @@ -256,6 +256,7 @@ export default { return true }, }, + methods: { labelUpdate() { this.$emit('label-update-request') @@ -286,7 +287,7 @@ export default { t, }, -} +}) </script> <style scoped lang="scss"> |