Skip to content

Commit

Permalink
Merge pull request #48934 from nextcloud/backport/48625/stable29
Browse files Browse the repository at this point in the history
  • Loading branch information
skjnldsv authored Oct 29, 2024
2 parents 4b1bfe1 + cdb6b42 commit 271d5de
Show file tree
Hide file tree
Showing 19 changed files with 103 additions and 91 deletions.
6 changes: 3 additions & 3 deletions apps/files/src/components/TemplatePreview.vue
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
<script>
import { encodePath } from '@nextcloud/paths'
import { generateUrl } from '@nextcloud/router'
import { getToken, isPublic } from '../utils/davUtils.js'
import { isPublicShare, getSharingToken } from '@nextcloud/sharing/public'
// preview width generation
const previewWidth = 256
Expand Down Expand Up @@ -123,8 +123,8 @@ export default {
return this.previewUrl
}
// TODO: find a nicer standard way of doing this?
if (isPublic()) {
return generateUrl(`/apps/files_sharing/publicpreview/${getToken()}?fileId=${this.fileid}&file=${encodePath(this.filename)}&x=${previewWidth}&y=${previewWidth}&a=1`)
if (isPublicShare()) {
return generateUrl(`/apps/files_sharing/publicpreview/${getSharingToken()}?fileId=${this.fileid}&file=${encodePath(this.filename)}&x=${previewWidth}&y=${previewWidth}&a=1`)
}
return generateUrl(`/core/preview?fileId=${this.fileid}&x=${previewWidth}&y=${previewWidth}&a=1`)
},
Expand Down
31 changes: 0 additions & 31 deletions apps/files/src/utils/davUtils.js

This file was deleted.

41 changes: 41 additions & 0 deletions apps/files/src/utils/davUtils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/**
* SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

import { t } from '@nextcloud/l10n'
import type { WebDAVClientError } from 'webdav'

/**
* Whether error is a WebDAVClientError
* @param error - Any exception
* @return {boolean} - Whether error is a WebDAVClientError
*/
function isWebDAVClientError(error: unknown): error is WebDAVClientError {
return error instanceof Error && 'status' in error && 'response' in error
}

/**
* Get a localized error message from webdav request
* @param error - An exception from webdav request
* @return {string} Localized error message for end user
*/
export function humanizeWebDAVError(error: unknown) {
if (error instanceof Error) {
if (isWebDAVClientError(error)) {
const status = error.status || error.response?.status || 0
if ([400, 404, 405].includes(status)) {
return t('files', 'Folder not found')
} else if (status === 403) {
return t('files', 'This operation is forbidden')
} else if (status === 500) {
return t('files', 'This directory is unavailable, please check the logs or contact the administrator')
} else if (status === 503) {
return t('files', 'Storage is temporarily not available')
}
}
return t('files', 'Unexpected error: {error}', { error: error.message })
}

return t('files', 'Unknown error')
}
58 changes: 41 additions & 17 deletions apps/files/src/views/FilesList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -89,22 +89,38 @@
:name="t('files', 'Loading current folder')" />

<!-- Empty content placeholder -->
<NcEmptyContent v-else-if="!loading && isEmptyDir"
:name="currentView?.emptyTitle || t('files', 'No files in here')"
:description="currentView?.emptyCaption || t('files', 'Upload some content or sync with your devices!')"
data-cy-files-content-empty>
<template #action>
<NcButton v-if="dir !== '/'"
:aria-label="t('files', 'Go to the previous folder')"
type="primary"
:to="toPreviousDir">
{{ t('files', 'Go back') }}
</NcButton>
</template>
<template #icon>
<NcIconSvgWrapper :svg="currentView.icon" />
</template>
</NcEmptyContent>
<template v-else-if="!loading && isEmptyDir">
<!-- Empty due to error -->
<NcEmptyContent v-if="error" :name="error" data-cy-files-content-error>
<template #action>
<NcButton type="secondary" @click="fetchContent">
<template #icon>
<IconReload :size="20" />
</template>
{{ t('files', 'Retry') }}
</NcButton>
</template>
<template #icon>
<IconAlertCircleOutline />
</template>
</NcEmptyContent>
<!-- Default empty directory view -->
<NcEmptyContent v-else
:name="currentView?.emptyTitle || t('files', 'No files in here')"
:description="currentView?.emptyCaption || t('files', 'Upload some content or sync with your devices!')"
data-cy-files-content-empty>
<template v-if="dir !== '/'" #action>
<NcButton :aria-label="t('files', 'Go to the previous folder')"
type="primary"
:to="toPreviousDir">
{{ t('files', 'Go back') }}
</NcButton>
</template>
<template #icon>
<NcIconSvgWrapper :svg="currentView.icon" />
</template>
</NcEmptyContent>
</template>
<!-- File list -->
<FilesListVirtual v-else
Expand Down Expand Up @@ -135,6 +151,8 @@ import { join, dirname } from 'path'
import { Parser } from 'xml2js'
import { defineComponent } from 'vue'
import IconAlertCircleOutline from 'vue-material-design-icons/AlertCircleOutline.vue'
import IconReload from 'vue-material-design-icons/Reload.vue'
import LinkIcon from 'vue-material-design-icons/Link.vue'
import ListViewIcon from 'vue-material-design-icons/FormatListBulletedSquare.vue'
import NcAppContent from '@nextcloud/vue/dist/Components/NcAppContent.js'
Expand All @@ -160,6 +178,8 @@ import filesListWidthMixin from '../mixins/filesListWidth.ts'
import filesSortingMixin from '../mixins/filesSorting.ts'
import logger from '../logger.js'
import DragAndDropNotice from '../components/DragAndDropNotice.vue'
import { humanizeWebDAVError } from '../utils/davUtils.ts'
import debounce from 'debounce'
const isSharingEnabled = (getCapabilities() as { files_sharing?: boolean })?.files_sharing !== undefined
Expand All @@ -182,6 +202,8 @@ export default defineComponent({
AccountPlusIcon,
UploadPicker,
ViewGridIcon,
IconAlertCircleOutline,
IconReload,
},
mixins: [
Expand Down Expand Up @@ -221,8 +243,8 @@ export default defineComponent({
return {
filterText: '',
loading: true,
error: null as string | null,
promise: null as Promise<ContentsWithRoot> | CancelablePromise<ContentsWithRoot> | null,
unsubscribeStoreCallback: () => {},
}
},
Expand Down Expand Up @@ -475,6 +497,7 @@ export default defineComponent({
methods: {
async fetchContent() {
this.loading = true
this.error = null
const dir = this.dir
const currentView = this.currentView
Expand Down Expand Up @@ -523,6 +546,7 @@ export default defineComponent({
})
} catch (error) {
logger.error('Error while fetching content', { error })
this.error = humanizeWebDAVError(error)
} finally {
this.loading = false
}
Expand Down
Loading

0 comments on commit 271d5de

Please sign in to comment.