From 1105252cf859bcbc715742cab4752f1c57ccbb8b Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Tue, 8 Mar 2022 18:58:09 +0100 Subject: [PATCH 01/34] Supply trash bin path to sdk trash methods, add new routes for trash bin --- .eslintrc.js | 7 +- package.json | 4 + .../src/components/SideBar/FileInfo.vue | 7 +- .../src/components/SideBar/SideBar.vue | 9 +- .../web-app-files/src/helpers/resources.js | 8 + packages/web-app-files/src/index.js | 6 +- .../src/mixins/actions/delete.js | 11 +- .../src/mixins/actions/emptyTrashBin.js | 11 +- .../web-app-files/src/mixins/actions/fetch.js | 7 +- .../src/mixins/actions/navigate.js | 9 +- .../src/mixins/actions/rename.js | 7 +- .../src/mixins/actions/restore.js | 17 +- .../src/mixins/actions/showActions.js | 7 +- .../src/mixins/actions/showDetails.js | 7 +- .../src/mixins/actions/showShares.js | 7 +- .../src/mixins/deleteResources.js | 10 +- .../web-app-files/src/mixins/fileActions.js | 12 +- packages/web-app-files/src/router/common.ts | 22 +-- .../web-app-files/src/router/deprecated.ts | 5 +- packages/web-app-files/src/router/index.ts | 43 +++-- packages/web-app-files/src/router/router.ts | 1 + packages/web-app-files/src/router/trash.ts | 45 +++++ .../src/views/spaces/Trashbin.vue | 159 ++++++++++++++++++ .../unit/components/SideBar/FileInfo.spec.js | 2 +- packages/web-runtime/src/router/index.js | 2 +- yarn.lock | 32 +++- 26 files changed, 366 insertions(+), 91 deletions(-) create mode 100644 packages/web-app-files/src/router/trash.ts create mode 100644 packages/web-app-files/src/views/spaces/Trashbin.vue diff --git a/.eslintrc.js b/.eslintrc.js index 6c897d35111..66b5254b3c5 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -10,7 +10,7 @@ module.exports = { 'plugin:prettier/recommended', 'plugin:jest/recommended' ], - parser: "@babel/eslint-parser", + parser: '@babel/eslint-parser', parserOptions: { requireConfigFile: false, sourceType: 'module' @@ -23,13 +23,14 @@ module.exports = { 'require-await': 'warn', 'no-new': 'off', 'jest/no-standalone-expect': 'off', - 'node/no-callback-literal': 'off' + 'node/no-callback-literal': 'off', + 'unused-imports/no-unused-imports': 'error' }, globals: { require: false, requirejs: false }, - plugins: ['jest'], + plugins: ['jest', 'unused-imports'], overrides: [ { files: ['**/*.vue'], diff --git a/package.json b/package.json index a630e0bb74c..befb56ac987 100644 --- a/package.json +++ b/package.json @@ -83,6 +83,7 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-promise": "^5.2.0", + "eslint-plugin-unused-imports": "^2.0.0", "eslint-plugin-vue": "^7.13.0", "eslint-plugin-vuejs-accessibility": "^0.7.1", "focus-trap": "^6.4.0", @@ -144,5 +145,8 @@ "vue-concurrency": { "built": true } + }, + "resolutions": { + "owncloud-sdk": "portal:/home/jan/working/owncloud-sdk" } } diff --git a/packages/web-app-files/src/components/SideBar/FileInfo.vue b/packages/web-app-files/src/components/SideBar/FileInfo.vue index ae85da3a161..078782f6ac1 100644 --- a/packages/web-app-files/src/components/SideBar/FileInfo.vue +++ b/packages/web-app-files/src/components/SideBar/FileInfo.vue @@ -38,7 +38,7 @@ import Mixins from '../../mixins' import MixinResources from '../../mixins/resources' import MixinFavorite from '../../mixins/actions/favorite' -import { isLocationCommonActive } from '../../router' +import { isLocationTrashActive } from '../../router' export default { name: 'FileInfo', @@ -61,7 +61,10 @@ export default { return obj } - if (isLocationCommonActive(this.$router, 'files-common-trash')) { + if ( + isLocationTrashActive(this.$router, 'files-trash-personal') || + isLocationTrashActive(this.$router, 'files-trash-project') + ) { return interpolate({ sourceTime: this.file.ddate, infoString: this.$pgettext('inline info about deletion date', 'deleted %{timeRelative}'), diff --git a/packages/web-app-files/src/components/SideBar/SideBar.vue b/packages/web-app-files/src/components/SideBar/SideBar.vue index 3d1ced36e80..85747bfc826 100644 --- a/packages/web-app-files/src/components/SideBar/SideBar.vue +++ b/packages/web-app-files/src/components/SideBar/SideBar.vue @@ -92,11 +92,7 @@ import { VisibilityObserver } from 'web-pkg/src/observer' import { DavProperties } from 'web-pkg/src/constants' import { buildResource } from '../../helpers/resources' -import { - isLocationCommonActive, - isLocationPublicActive, - isLocationSharesActive -} from '../../router' +import { isLocationPublicActive, isLocationSharesActive, isLocationTrashActive } from '../../router' import { computed } from '@vue/composition-api' import FileInfo from './FileInfo.vue' @@ -310,7 +306,8 @@ export default { } if ( - isLocationCommonActive(this.$router, 'files-common-trash') || + isLocationTrashActive(this.$router, 'files-trash-personal') || + isLocationTrashActive(this.$router, 'files-trash-project') || this.highlightedFileIsSpace ) { this.selectedFile = this.highlightedFile diff --git a/packages/web-app-files/src/helpers/resources.js b/packages/web-app-files/src/helpers/resources.js index ad22a4cab26..ea2c2ab7284 100644 --- a/packages/web-app-files/src/helpers/resources.js +++ b/packages/web-app-files/src/helpers/resources.js @@ -240,10 +240,18 @@ export function buildWebDavFilesPath(userId, path) { return '/' + `files/${userId}/${path}`.split('/').filter(Boolean).join('/') } +export function buildWebDavFilesTrashPath(userId, path = '') { + return '/' + `trash-bin/${userId}/${path}`.split('/').filter(Boolean).join('/') +} + export function buildWebDavSpacesPath(storageId, path) { return '/' + `spaces/${storageId}/${path}`.split('/').filter(Boolean).join('/') } +export function buildWebDavSpacesTrashPath(spaceId, path) { + return '/' + `trash-bin/${spaceId}/${path}`.split('/').filter(Boolean).join('/') +} + export function attachIndicators(resource, sharesTree) { return (resource.indicators = getIndicators(resource, sharesTree)) } diff --git a/packages/web-app-files/src/index.js b/packages/web-app-files/src/index.js index 97a0abee8b4..ce73bbe658a 100644 --- a/packages/web-app-files/src/index.js +++ b/packages/web-app-files/src/index.js @@ -10,6 +10,7 @@ import SharedWithMe from './views/shares/SharedWithMe.vue' import SharedWithOthers from './views/shares/SharedWithOthers.vue' import SharedViaLink from './views/shares/SharedViaLink.vue' import SpaceProject from './views/spaces/Project.vue' +import SpaceTrashbin from './views/spaces/Trashbin.vue' import SpaceProjects from './views/spaces/Projects.vue' import Trashbin from './views/Trashbin.vue' import translations from '../l10n/translations.json' @@ -78,7 +79,7 @@ const navItems = [ name: $gettext('Deleted files'), icon: 'delete-bin-5', route: { - path: `/${appInfo.id}/trash` + path: `/${appInfo.id}/trash/personal` }, enabled(capabilities) { return capabilities.dav && capabilities.dav.trashbin === '1.0' @@ -104,7 +105,8 @@ export default { SharedWithOthers, Spaces: { Project: SpaceProject, - Projects: SpaceProjects + Projects: SpaceProjects, + Trashbin: SpaceTrashbin }, Trashbin }), diff --git a/packages/web-app-files/src/mixins/actions/delete.js b/packages/web-app-files/src/mixins/actions/delete.js index cbc82bcc5d9..1958dd80cbc 100644 --- a/packages/web-app-files/src/mixins/actions/delete.js +++ b/packages/web-app-files/src/mixins/actions/delete.js @@ -1,10 +1,6 @@ import MixinDeleteResources from '../../mixins/deleteResources' import { mapState } from 'vuex' -import { - isLocationCommonActive, - isLocationPublicActive, - isLocationSpacesActive -} from '../../router' +import { isLocationPublicActive, isLocationSpacesActive, isLocationTrashActive } from '../../router' export default { mixins: [MixinDeleteResources], @@ -44,7 +40,10 @@ export default { label: () => this.$gettext('Delete'), handler: this.$_delete_trigger, isEnabled: ({ resources }) => { - if (!isLocationCommonActive(this.$router, 'files-common-trash')) { + if ( + !isLocationTrashActive(this.$router, 'files-trash-personal') && + !isLocationTrashActive(this.$router, 'files-trash-project') + ) { return false } return resources.length > 0 diff --git a/packages/web-app-files/src/mixins/actions/emptyTrashBin.js b/packages/web-app-files/src/mixins/actions/emptyTrashBin.js index 04fd25e4a55..f5979a1c66f 100644 --- a/packages/web-app-files/src/mixins/actions/emptyTrashBin.js +++ b/packages/web-app-files/src/mixins/actions/emptyTrashBin.js @@ -1,5 +1,6 @@ import { mapActions, mapGetters } from 'vuex' -import { isLocationCommonActive } from '../../router' +import { isLocationTrashActive } from '../../router' +import { buildWebDavFilesTrashPath } from '../../helpers/resources' export default { computed: { @@ -12,7 +13,10 @@ export default { label: () => this.$gettext('Empty trash bin'), handler: this.$_emptyTrashBin_trigger, isEnabled: ({ resources }) => { - if (!isLocationCommonActive(this.$router, 'files-common-trash')) { + if ( + !isLocationTrashActive(this.$router, 'files-trash-personal') && + !isLocationTrashActive(this.$router, 'files-trash-project') + ) { return false } // empty trash bin is not available for individual resources, but only for the trash bin as a whole @@ -29,9 +33,10 @@ export default { methods: { ...mapActions(['showMessage']), ...mapActions('Files', ['clearTrashBin']), + ...mapGetters(['user']), $_emptyTrashBin_trigger() { this.$client.fileTrash - .clearTrashBin() + .clearTrashBin(buildWebDavFilesTrashPath(this.user.id)) .then(() => { this.showMessage({ title: this.$gettext('All deleted files were removed') diff --git a/packages/web-app-files/src/mixins/actions/fetch.js b/packages/web-app-files/src/mixins/actions/fetch.js index 1edc66fd910..42d8f81eeea 100644 --- a/packages/web-app-files/src/mixins/actions/fetch.js +++ b/packages/web-app-files/src/mixins/actions/fetch.js @@ -1,4 +1,4 @@ -import { isLocationCommonActive, isLocationPublicActive } from '../../router' +import { isLocationPublicActive, isLocationTrashActive } from '../../router' export default { computed: { @@ -18,7 +18,10 @@ export default { return this.$gettext('Open in browser') }, isEnabled: ({ resources }) => { - if (isLocationCommonActive(this.$router, 'files-common-trash')) { + if ( + isLocationTrashActive(this.$router, 'files-trash-personal') || + isLocationTrashActive(this.$router, 'files-trash-project') + ) { return false } if (resources.length !== 1) { diff --git a/packages/web-app-files/src/mixins/actions/navigate.js b/packages/web-app-files/src/mixins/actions/navigate.js index c8290860051..42f2bb7ec60 100644 --- a/packages/web-app-files/src/mixins/actions/navigate.js +++ b/packages/web-app-files/src/mixins/actions/navigate.js @@ -3,10 +3,10 @@ import { isSameResource } from '../../helpers/resource' import { createLocationPublic, createLocationSpaces, - isLocationCommonActive, isLocationPublicActive, isLocationSharesActive, - isLocationSpacesActive + isLocationSpacesActive, + isLocationTrashActive } from '../../router' import { ShareStatus } from '../../helpers/share' import merge from 'lodash-es/merge' @@ -22,7 +22,10 @@ export default { label: () => this.$pgettext('Action in the files list row to open a folder', 'Open folder'), isEnabled: ({ resources }) => { - if (isLocationCommonActive(this.$router, 'files-common-trash')) { + if ( + isLocationTrashActive(this.$router, 'files-trash-personal') || + isLocationTrashActive(this.$router, 'files-trash-project') + ) { return false } if (resources.length !== 1) { diff --git a/packages/web-app-files/src/mixins/actions/rename.js b/packages/web-app-files/src/mixins/actions/rename.js index 0ca0089ebda..b22c0427d46 100644 --- a/packages/web-app-files/src/mixins/actions/rename.js +++ b/packages/web-app-files/src/mixins/actions/rename.js @@ -3,7 +3,7 @@ import { mapActions, mapGetters } from 'vuex' import { isSameResource } from '../../helpers/resource' import { getParentPaths } from '../../helpers/path' import { buildResource } from '../../helpers/resources' -import { isLocationCommonActive } from '../../router' +import { isLocationTrashActive } from '../../router' export default { computed: { @@ -19,7 +19,10 @@ export default { }, handler: this.$_rename_trigger, isEnabled: ({ resources }) => { - if (isLocationCommonActive(this.$router, 'files-common-trash')) { + if ( + isLocationTrashActive(this.$router, 'files-trash-personal') || + isLocationTrashActive(this.$router, 'files-trash-project') + ) { return false } if (resources.length !== 1) { diff --git a/packages/web-app-files/src/mixins/actions/restore.js b/packages/web-app-files/src/mixins/actions/restore.js index ae36048976a..c43d246edda 100644 --- a/packages/web-app-files/src/mixins/actions/restore.js +++ b/packages/web-app-files/src/mixins/actions/restore.js @@ -1,6 +1,7 @@ -import { mapActions } from 'vuex' +import { mapActions, mapGetters } from 'vuex' import PQueue from 'p-queue' -import { isLocationCommonActive } from '../../router' +import { isLocationTrashActive } from '../../router' +import { buildWebDavFilesTrashPath, buildWebDavFilesPath } from '../../helpers/resources' export default { computed: { @@ -12,7 +13,10 @@ export default { label: () => this.$gettext('Restore'), handler: this.$_restore_trigger, isEnabled: ({ resources }) => { - if (!isLocationCommonActive(this.$router, 'files-common-trash')) { + if ( + !isLocationTrashActive(this.$router, 'files-trash-personal') && + !isLocationTrashActive(this.$router, 'files-trash-project') + ) { return false } return resources.length > 0 @@ -25,6 +29,7 @@ export default { }, methods: { ...mapActions('Files', ['removeFilesFromTrashbin']), + ...mapGetters(['user']), async $_restore_trigger({ resources }) { const restoredResources = [] @@ -35,7 +40,11 @@ export default { restorePromises.push( restoreQueue.add(async () => { try { - await this.$client.fileTrash.restore(resource.id, resource.path) + await this.$client.fileTrash.restore( + buildWebDavFilesTrashPath(this.user.id), + resource.id, + buildWebDavFilesPath(this.user.id, resource.path) + ) restoredResources.push(resource) } catch (e) { console.error(e) diff --git a/packages/web-app-files/src/mixins/actions/showActions.js b/packages/web-app-files/src/mixins/actions/showActions.js index dd3cc9c80be..520e289c99d 100644 --- a/packages/web-app-files/src/mixins/actions/showActions.js +++ b/packages/web-app-files/src/mixins/actions/showActions.js @@ -1,5 +1,5 @@ import { mapActions } from 'vuex' -import { isLocationCommonActive } from '../../router' +import { isLocationTrashActive } from '../../router' import isFilesAppActive from './helpers/isFilesAppActive' export default { @@ -36,7 +36,10 @@ export default { // we don't have details in the trashbin, yet. // return hardcoded `actions-item` in all cases once we have them. await this.openSidebarWithPanel( - isLocationCommonActive(this.$router, 'files-common-trash') ? null : 'actions-item' + isLocationTrashActive(this.$router, 'files-trash-personal') || + isLocationTrashActive(this.$router, 'files-trash-project') + ? null + : 'actions-item' ) } } diff --git a/packages/web-app-files/src/mixins/actions/showDetails.js b/packages/web-app-files/src/mixins/actions/showDetails.js index 9e7a2982efb..bb42d83fc7d 100644 --- a/packages/web-app-files/src/mixins/actions/showDetails.js +++ b/packages/web-app-files/src/mixins/actions/showDetails.js @@ -1,5 +1,5 @@ import { mapActions } from 'vuex' -import { isLocationCommonActive } from '../../router' +import { isLocationTrashActive } from '../../router' import isFilesAppActive from './helpers/isFilesAppActive' export default { @@ -21,7 +21,10 @@ export default { return false } - if (isLocationCommonActive(this.$router, 'files-common-trash')) { + if ( + isLocationTrashActive(this.$router, 'files-trash-personal') || + isLocationTrashActive(this.$router, 'files-trash-project') + ) { return false } return resources.length > 0 diff --git a/packages/web-app-files/src/mixins/actions/showShares.js b/packages/web-app-files/src/mixins/actions/showShares.js index 31be88138c5..067cb5e1c57 100644 --- a/packages/web-app-files/src/mixins/actions/showShares.js +++ b/packages/web-app-files/src/mixins/actions/showShares.js @@ -1,5 +1,5 @@ import quickActions, { canShare, openNewCollaboratorsPanel } from '../../quickActions' -import { isLocationCommonActive, isLocationSharesActive } from '../../router' +import { isLocationSharesActive, isLocationTrashActive } from '../../router' import { ShareStatus } from '../../helpers/share' import isFilesAppActive from './helpers/isFilesAppActive' @@ -20,7 +20,10 @@ export default { return false } - if (isLocationCommonActive(this.$router, 'files-common-trash')) { + if ( + isLocationTrashActive(this.$router, 'files-trash-personal') || + isLocationTrashActive(this.$router, 'files-trash-project') + ) { return false } if (resources.length !== 1) { diff --git a/packages/web-app-files/src/mixins/deleteResources.js b/packages/web-app-files/src/mixins/deleteResources.js index 55f9e75eeae..f20f985c97c 100644 --- a/packages/web-app-files/src/mixins/deleteResources.js +++ b/packages/web-app-files/src/mixins/deleteResources.js @@ -1,8 +1,9 @@ import { mapGetters, mapActions, mapMutations } from 'vuex' import { cloneStateObject } from '../helpers/store' import { isSameResource } from '../helpers/resource' +import { buildWebDavFilesTrashPath } from '../helpers/resources' import PQueue from 'p-queue' -import { isLocationCommonActive } from '../router' +import { isLocationTrashActive } from '../router' export default { data: () => ({ @@ -16,7 +17,10 @@ export default { ...mapGetters(['user']), $_deleteResources_isInTrashbin() { - return isLocationCommonActive(this.$router, 'files-common-trash') + return ( + isLocationTrashActive(this.$router, 'files-trash-personal') || + isLocationTrashActive(this.$router, 'files-trash-project') + ) }, $_deleteResources_resources() { @@ -96,7 +100,7 @@ export default { $_deleteResources_trashbin_deleteOp(resource) { return this.$client.fileTrash - .clearTrashBin(resource.id) + .clearTrashBin(buildWebDavFilesTrashPath(this.user.id), resource.id) .then(() => { this.removeFilesFromTrashbin([resource]) const translated = this.$gettext('"%{file}" was deleted successfully') diff --git a/packages/web-app-files/src/mixins/fileActions.js b/packages/web-app-files/src/mixins/fileActions.js index 8b0067ad742..abe823b93e5 100644 --- a/packages/web-app-files/src/mixins/fileActions.js +++ b/packages/web-app-files/src/mixins/fileActions.js @@ -1,7 +1,7 @@ import get from 'lodash-es/get' import { mapGetters, mapActions, mapState } from 'vuex' -import { isAuthenticatedRoute, isLocationCommonActive } from '../router' +import { isAuthenticatedRoute, isLocationTrashActive } from '../router' import { routeToContextQuery } from 'web-pkg/src/composables/appDefaults' import AcceptShare from './actions/acceptShare' import Copy from './actions/copy' @@ -62,7 +62,10 @@ export default { }, $_fileActions_editorActions() { - if (isLocationCommonActive(this.$router, 'files-common-trash')) { + if ( + isLocationTrashActive(this.$router, 'files-trash-personal') || + isLocationTrashActive(this.$router, 'files-trash-project') + ) { return [] } return this.apps.fileEditors @@ -204,7 +207,10 @@ export default { // to open a resource with a specific mimeType // FIXME: filesApp should not know anything about any other app, dont cross the line!!! BAD $_fileActions_loadExternalAppActions(resources) { - if (isLocationCommonActive(this.$router, 'files-common-trash')) { + if ( + isLocationTrashActive(this.$router, 'files-trash-personal') || + isLocationTrashActive(this.$router, 'files-trash-project') + ) { return [] } diff --git a/packages/web-app-files/src/router/common.ts b/packages/web-app-files/src/router/common.ts index 457e94c390b..0d7276bc2a2 100644 --- a/packages/web-app-files/src/router/common.ts +++ b/packages/web-app-files/src/router/common.ts @@ -2,19 +2,17 @@ import { RouteComponents } from './router' import { Location, RouteConfig } from 'vue-router' import { createLocation, $gettext, isLocationActiveDirector } from './utils' -type commonTypes = 'files-common-favorites' | 'files-common-search' | 'files-common-trash' +type commonTypes = 'files-common-favorites' | 'files-common-search' export const createLocationCommon = (name: commonTypes, location = {}): Location => createLocation(name, location) export const locationFavorites = createLocationCommon('files-common-favorites') -export const locationTrash = createLocationCommon('files-common-trash') export const locationSearch = createLocationCommon('files-common-search') export const isLocationCommonActive = isLocationActiveDirector( locationFavorites, - locationSearch, - locationTrash + locationSearch ) export const buildRoutes = (components: RouteComponents): RouteConfig[] => [ @@ -35,22 +33,6 @@ export const buildRoutes = (components: RouteComponents): RouteConfig[] => [ } ] }, - { - path: '/trash', - component: components.App, - children: [ - { - name: locationTrash.name, - path: '', - component: components.Trashbin, - meta: { - hideFilelistActions: true, - hasBulkActions: true, - title: $gettext('Deleted files') - } - } - ] - }, { path: '/favorites', component: components.App, diff --git a/packages/web-app-files/src/router/deprecated.ts b/packages/web-app-files/src/router/deprecated.ts index 5be36a7f7c4..037db30e4e7 100644 --- a/packages/web-app-files/src/router/deprecated.ts +++ b/packages/web-app-files/src/router/deprecated.ts @@ -5,6 +5,7 @@ import { createLocationCommon } from './common' import { createLocationOperations } from './operations' import { createLocationPublic } from './public' import { isLocationActive as isLocationActiveNoCompat } from './utils' +import { createLocationTrash } from './trash' /** * all route configs created by buildRoutes are deprecated, @@ -66,7 +67,7 @@ export const buildRoutes = (): RouteConfig[] => }, { path: '/trash-bin', - redirect: (to) => createLocationCommon('files-common-trash', to) + redirect: (to) => createLocationTrash('files-trash-personal', to) }, { path: '/public/list/:item*', @@ -106,7 +107,7 @@ export const isLocationActive = ( 'files-favorites': createLocationCommon('files-common-favorites').name, 'files-shared-with-others': createLocationShares('files-shares-with-others').name, 'files-shared-with-me': createLocationShares('files-shares-with-me').name, - 'files-trashbin ': createLocationCommon('files-common-trash').name, + 'files-trashbin ': createLocationTrash('files-trash-personal').name, 'files-public-list': createLocationPublic('files-public-files').name }[c.name] diff --git a/packages/web-app-files/src/router/index.ts b/packages/web-app-files/src/router/index.ts index 3bb8ae72819..28310a1364b 100644 --- a/packages/web-app-files/src/router/index.ts +++ b/packages/web-app-files/src/router/index.ts @@ -1,13 +1,11 @@ +import { RouteConfig } from 'vue-router' + import { - buildRoutes as buildSpacesRoutes, - isLocationSpacesActive, - createLocationSpaces -} from './spaces' -import { - buildRoutes as buildSharesRoutes, - isLocationSharesActive, - createLocationShares -} from './shares' + buildRoutes as buildCommonRoutes, + isLocationCommonActive, + createLocationCommon +} from './common' +import { buildRoutes as buildDeprecatedRoutes, isLocationActive } from './deprecated' import { buildRoutes as buildOperationsRoutes, createLocationOperations, @@ -18,15 +16,23 @@ import { createLocationPublic, isLocationPublicActive } from './public' +import { RouteComponents } from './router' import { - buildRoutes as buildCommonRoutes, - isLocationCommonActive, - createLocationCommon -} from './common' + buildRoutes as buildSharesRoutes, + isLocationSharesActive, + createLocationShares +} from './shares' +import { + buildRoutes as buildSpacesRoutes, + isLocationSpacesActive, + createLocationSpaces +} from './spaces' +import { + buildRoutes as buildTrashRoutes, + isLocationTrashActive, + createLocationTrash +} from './trash' import { isAuthenticatedRoute, ActiveRouteDirectorFunc } from './utils' -import { buildRoutes as buildDeprecatedRoutes, isLocationActive } from './deprecated' -import { RouteComponents } from './router' -import { RouteConfig } from 'vue-router' const ROOT_ROUTE = { path: '/', @@ -35,11 +41,12 @@ const ROOT_ROUTE = { const buildRoutes = (components: RouteComponents): RouteConfig[] => [ ROOT_ROUTE, + ...buildCommonRoutes(components), ...buildSharesRoutes(components), ...buildPublicRoutes(components), ...buildSpacesRoutes(components), ...buildOperationsRoutes(components), - ...buildCommonRoutes(components), + ...buildTrashRoutes(components), ...buildDeprecatedRoutes() ] @@ -56,6 +63,8 @@ export { isLocationPublicActive, isLocationActive, isAuthenticatedRoute, + isLocationTrashActive, + createLocationTrash, buildRoutes, ActiveRouteDirectorFunc } diff --git a/packages/web-app-files/src/router/router.ts b/packages/web-app-files/src/router/router.ts index dc6fe1c365a..06b93cde9b9 100644 --- a/packages/web-app-files/src/router/router.ts +++ b/packages/web-app-files/src/router/router.ts @@ -22,6 +22,7 @@ export interface RouteComponents { Spaces: { Projects: ComponentOptions Project: ComponentOptions + Trashbin: ComponentOptions } Trashbin: ComponentOptions } diff --git a/packages/web-app-files/src/router/trash.ts b/packages/web-app-files/src/router/trash.ts new file mode 100644 index 00000000000..fd95f2bb4bd --- /dev/null +++ b/packages/web-app-files/src/router/trash.ts @@ -0,0 +1,45 @@ +import { RouteComponents } from './router' +import { Location, RouteConfig } from 'vue-router' +import { createLocation, $gettext, isLocationActiveDirector } from './utils' + +type trashTypes = 'files-trash-personal' | 'files-trash-project' + +export const createLocationTrash = (name: trashTypes, location = {}): Location => + createLocation(name, location) + +export const locationTrashPersonal = createLocationTrash('files-trash-personal') +export const locationTrashProject = createLocationTrash('files-trash-project') + +export const isLocationTrashActive = isLocationActiveDirector( + locationTrashPersonal, + locationTrashProject +) + +export const buildRoutes = (components: RouteComponents): RouteConfig[] => [ + { + path: '/trash', + component: components.App, + children: [ + { + name: locationTrashPersonal.name, + path: 'personal', + component: components.Trashbin, + meta: { + hideFilelistActions: true, + hasBulkActions: true, + title: $gettext('Deleted files') + } + }, + { + name: locationTrashProject.name, + path: 'project/:spaceId', + component: components.Spaces.Trashbin, + meta: { + hideFilelistActions: true, + hasBulkActions: true, + title: $gettext('Deleted files') + } + } + ] + } +] diff --git a/packages/web-app-files/src/views/spaces/Trashbin.vue b/packages/web-app-files/src/views/spaces/Trashbin.vue new file mode 100644 index 00000000000..7c7d020acb7 --- /dev/null +++ b/packages/web-app-files/src/views/spaces/Trashbin.vue @@ -0,0 +1,159 @@ + + + diff --git a/packages/web-app-files/tests/unit/components/SideBar/FileInfo.spec.js b/packages/web-app-files/tests/unit/components/SideBar/FileInfo.spec.js index 231f6b1610a..85c2a0b6e65 100644 --- a/packages/web-app-files/tests/unit/components/SideBar/FileInfo.spec.js +++ b/packages/web-app-files/tests/unit/components/SideBar/FileInfo.spec.js @@ -72,7 +72,7 @@ describe('FileInfo', () => { resetDateMocks() const tooltipStub = jest.fn() - const wrapper = createWrapper(simpleDeletedFile, tooltipStub, 'files-common-trash') + const wrapper = createWrapper(simpleDeletedFile, tooltipStub, 'files-trash-personal') expect(tooltipStub).toHaveBeenCalledTimes(1) expect(formDateFromRFC).toHaveBeenCalledTimes(1) diff --git a/packages/web-runtime/src/router/index.js b/packages/web-runtime/src/router/index.js index dca91e3e3d8..658b1cf189a 100644 --- a/packages/web-runtime/src/router/index.js +++ b/packages/web-runtime/src/router/index.js @@ -2,7 +2,7 @@ import get from 'lodash-es/get.js' import Vue from 'vue' import qs from 'qs' // eslint-disable-next-line no-unused-vars -import Router, { Route } from 'vue-router' +import Router from 'vue-router' import LoginPage from '../pages/login.vue' import OidcCallbackPage from '../pages/oidcCallback.vue' import AccessDeniedPage from '../pages/accessDenied.vue' diff --git a/yarn.lock b/yarn.lock index 519240e6ef7..292c0063299 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5741,6 +5741,21 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-unused-imports@npm:^2.0.0": + version: 2.0.0 + resolution: "eslint-plugin-unused-imports@npm:2.0.0" + dependencies: + eslint-rule-composer: ^0.3.0 + peerDependencies: + "@typescript-eslint/eslint-plugin": ^5.0.0 + eslint: ^8.0.0 + peerDependenciesMeta: + "@typescript-eslint/eslint-plugin": + optional: true + checksum: 8aa1e03e75da2a62a354065e0cb8fe370118c6f8d9720a32fe8c1da937de6adb81a4fed7d0d391d115ac9453b49029fb19f970d180a2cf3dba451fd4c20f0dc4 + languageName: node + linkType: hard + "eslint-plugin-vue@npm:^7.13.0": version: 7.13.0 resolution: "eslint-plugin-vue@npm:7.13.0" @@ -5768,6 +5783,13 @@ __metadata: languageName: node linkType: hard +"eslint-rule-composer@npm:^0.3.0": + version: 0.3.0 + resolution: "eslint-rule-composer@npm:0.3.0" + checksum: c2f57cded8d1c8f82483e0ce28861214347e24fd79fd4144667974cd334d718f4ba05080aaef2399e3bbe36f7d6632865110227e6b176ed6daa2d676df9281b1 + languageName: node + linkType: hard + "eslint-scope@npm:^5.1.1": version: 5.1.1 resolution: "eslint-scope@npm:5.1.1" @@ -9548,9 +9570,9 @@ __metadata: languageName: node linkType: hard -"owncloud-sdk@npm:~2.1.0-alpha.3": - version: 2.1.0-alpha.3 - resolution: "owncloud-sdk@npm:2.1.0-alpha.3" +"owncloud-sdk@portal:/home/jan/working/owncloud-sdk::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.0.0-use.local + resolution: "owncloud-sdk@portal:/home/jan/working/owncloud-sdk::locator=root-workspace-0b6124%40workspace%3A." peerDependencies: axios: ^0.26.0 cross-fetch: ^3.0.6 @@ -9560,9 +9582,8 @@ __metadata: uuid: ^8.2.0 webdav: 4.8.0 xml-js: ^1.6.11 - checksum: 566bbccd59e4cfbd6471942621e2f006c3337a3637b971492d7324913a37f4d3299deb9029546331cb0ec7e065efd6c4f9ba96a8f850c230d64e83dd9fc8c5db languageName: node - linkType: hard + linkType: soft "p-cancelable@npm:^2.0": version: 2.1.1 @@ -11626,6 +11647,7 @@ __metadata: eslint-plugin-node: ^11.1.0 eslint-plugin-prettier: ^4.0.0 eslint-plugin-promise: ^5.2.0 + eslint-plugin-unused-imports: ^2.0.0 eslint-plugin-vue: ^7.13.0 eslint-plugin-vuejs-accessibility: ^0.7.1 focus-trap: ^6.4.0 From d36aac1860f5109e7dca29dd4e6beb2f43d7fb32 Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Thu, 10 Mar 2022 10:51:55 +0100 Subject: [PATCH 02/34] Fix isLocationActive --- package.json | 3 --- packages/web-app-files/src/router/utils.ts | 8 ++++++++ yarn.lock | 9 +++++---- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index befb56ac987..9eb5a44c677 100644 --- a/package.json +++ b/package.json @@ -145,8 +145,5 @@ "vue-concurrency": { "built": true } - }, - "resolutions": { - "owncloud-sdk": "portal:/home/jan/working/owncloud-sdk" } } diff --git a/packages/web-app-files/src/router/utils.ts b/packages/web-app-files/src/router/utils.ts index b1ea21daa84..f0a0a246091 100644 --- a/packages/web-app-files/src/router/utils.ts +++ b/packages/web-app-files/src/router/utils.ts @@ -25,6 +25,14 @@ export const isLocationActive = ( ...comparative // ...(comparative.name && { name: resolveRouteName(comparative.name) }) }) + /** + * Href might be '/' if router is not able to resolve the proper path. + * This happens if the we don't pass a param which is defined in the route configuration, for example: + * path: user/:id + **/ + if (comparativeHref === '/') { + return false + } return currentHref.startsWith(comparativeHref) }) .some(Boolean) diff --git a/yarn.lock b/yarn.lock index 292c0063299..6478886a4f9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9570,9 +9570,9 @@ __metadata: languageName: node linkType: hard -"owncloud-sdk@portal:/home/jan/working/owncloud-sdk::locator=root-workspace-0b6124%40workspace%3A.": - version: 0.0.0-use.local - resolution: "owncloud-sdk@portal:/home/jan/working/owncloud-sdk::locator=root-workspace-0b6124%40workspace%3A." +"owncloud-sdk@npm:~2.1.0-alpha.3": + version: 2.1.0-alpha.3 + resolution: "owncloud-sdk@npm:2.1.0-alpha.3" peerDependencies: axios: ^0.26.0 cross-fetch: ^3.0.6 @@ -9582,8 +9582,9 @@ __metadata: uuid: ^8.2.0 webdav: 4.8.0 xml-js: ^1.6.11 + checksum: 566bbccd59e4cfbd6471942621e2f006c3337a3637b971492d7324913a37f4d3299deb9029546331cb0ec7e065efd6c4f9ba96a8f850c230d64e83dd9fc8c5db languageName: node - linkType: soft + linkType: hard "p-cancelable@npm:^2.0": version: 2.1.1 From 03780f25bb17768db3d372be10ab232182e1d66a Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Thu, 10 Mar 2022 11:17:33 +0100 Subject: [PATCH 03/34] Add Deleted Files action for spaces --- .../src/mixins/spaces/actions/deletedFiles.js | 35 +++++++++++++++++++ packages/web-app-files/src/router/utils.ts | 2 ++ .../src/views/spaces/Project.vue | 3 ++ 3 files changed, 40 insertions(+) create mode 100644 packages/web-app-files/src/mixins/spaces/actions/deletedFiles.js diff --git a/packages/web-app-files/src/mixins/spaces/actions/deletedFiles.js b/packages/web-app-files/src/mixins/spaces/actions/deletedFiles.js new file mode 100644 index 00000000000..255fb545e14 --- /dev/null +++ b/packages/web-app-files/src/mixins/spaces/actions/deletedFiles.js @@ -0,0 +1,35 @@ +import { createLocationTrash } from '../../../router' + +export default { + computed: { + $_deletedFiles_items() { + return [ + { + name: 'deletedFiles', + icon: 'delete-bin-5', + label: () => { + return this.$gettext('Deleted Files') + }, + handler: this.$_deletedFiles_trigger, + isEnabled: ({ resources }) => { + return resources.length === 1 + + }, + componentType: 'oc-button', + class: 'oc-files-actions-delete-trigger' + } + ] + } + }, + methods: { + $_deletedFiles_trigger({ resources }) { + this.$router.push( + createLocationTrash('files-trash-project', { + params: { + spaceId: resources[0].id + } + }) + ) + } + } +} diff --git a/packages/web-app-files/src/router/utils.ts b/packages/web-app-files/src/router/utils.ts index f0a0a246091..48cbb58d2d6 100644 --- a/packages/web-app-files/src/router/utils.ts +++ b/packages/web-app-files/src/router/utils.ts @@ -29,6 +29,8 @@ export const isLocationActive = ( * Href might be '/' if router is not able to resolve the proper path. * This happens if the we don't pass a param which is defined in the route configuration, for example: * path: user/:id + * + * This implies that the comparative route is not active **/ if (comparativeHref === '/') { return false diff --git a/packages/web-app-files/src/views/spaces/Project.vue b/packages/web-app-files/src/views/spaces/Project.vue index 46c5a0dd22f..ec398e04234 100644 --- a/packages/web-app-files/src/views/spaces/Project.vue +++ b/packages/web-app-files/src/views/spaces/Project.vue @@ -163,6 +163,7 @@ import { VisibilityObserver } from 'web-pkg/src/observer' import Mixins from '../../mixins' import Rename from '../../mixins/spaces/actions/rename' import Delete from '../../mixins/spaces/actions/delete' +import DeletedFiles from '../../mixins/spaces/actions/deletedFiles' import Disable from '../../mixins/spaces/actions/disable' import Restore from '../../mixins/spaces/actions/restore' import EditDescription from '../../mixins/spaces/actions/editDescription' @@ -195,6 +196,7 @@ export default { Mixins, Rename, Delete, + DeletedFiles, EditDescription, Disable, ShowDetails, @@ -397,6 +399,7 @@ export default { ...this.$_editReadmeContent_items, ...this.$_uploadImage_items, ...this.$_editQuota_items, + ...this.$_deletedFiles_items, ...this.$_restore_items, ...this.$_delete_items, ...this.$_disable_items, From f461aef00ef010bcb78c213ee1c300dade13e6c1 Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Thu, 10 Mar 2022 11:51:21 +0100 Subject: [PATCH 04/34] Add breadcrumbs for project trashbin --- packages/web-app-files/src/views/spaces/Trashbin.vue | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/web-app-files/src/views/spaces/Trashbin.vue b/packages/web-app-files/src/views/spaces/Trashbin.vue index 7c7d020acb7..54e79f5cdc0 100644 --- a/packages/web-app-files/src/views/spaces/Trashbin.vue +++ b/packages/web-app-files/src/views/spaces/Trashbin.vue @@ -67,6 +67,7 @@ import ListInfo from '../../components/FilesList/ListInfo.vue' import Pagination from '../../components/FilesList/Pagination.vue' import ContextActions from '../../components/FilesList/ContextActions.vue' import { DavProperties } from 'web-pkg/src/constants' +import { bus } from 'web-pkg/src/instance' export default { components: { ResourceTable, ListLoader, NoContentMessage, ListInfo, Pagination, ContextActions }, @@ -146,6 +147,14 @@ export default { created() { this.loadResourcesTask.perform(this) + + const loadResourcesEventToken = bus.subscribe('app.files.list.load', (path) => { + this.loadResourcesTask.perform(this) + }) + + this.$on('beforeDestroy', () => { + bus.unsubscribe('app.files.list.load', loadResourcesEventToken) + }) }, methods: { From 64b571efaed5e1d0767fb07bf131c5a408195568 Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Thu, 10 Mar 2022 14:08:31 +0100 Subject: [PATCH 05/34] Fix stuff after rebase --- .../src/components/AppBar/AppBar.vue | 32 +++++++++++++++++-- .../SideBar/Actions/SpaceActions.vue | 3 ++ .../src/components/SideBar/FileInfo.vue | 2 +- .../src/components/SideBar/SideBar.vue | 2 +- packages/web-app-files/src/fileSideBars.js | 24 ++++++++++---- .../src/mixins/actions/delete.js | 2 +- .../src/mixins/actions/emptyTrashBin.js | 2 +- .../web-app-files/src/mixins/actions/fetch.js | 2 +- .../src/mixins/actions/navigate.js | 2 +- .../src/mixins/actions/rename.js | 2 +- .../src/mixins/actions/restore.js | 2 +- .../src/mixins/actions/showActions.js | 2 +- .../src/mixins/actions/showDetails.js | 2 +- .../src/mixins/actions/showShares.js | 2 +- .../src/mixins/deleteResources.js | 2 +- .../web-app-files/src/mixins/fileActions.js | 4 +-- .../src/mixins/spaces/actions/deletedFiles.js | 3 +- packages/web-app-files/src/router/trash.ts | 6 ++-- .../src/services/folder/loaderProject.ts | 2 -- .../src/services/folder/loaderTrashbin.ts | 19 ++++++++--- .../src/views/spaces/Projects.vue | 14 +++++++- .../src/views/spaces/Trashbin.vue | 29 +++-------------- 22 files changed, 100 insertions(+), 60 deletions(-) diff --git a/packages/web-app-files/src/components/AppBar/AppBar.vue b/packages/web-app-files/src/components/AppBar/AppBar.vue index 2a8a576f688..a4c8c60fc72 100644 --- a/packages/web-app-files/src/components/AppBar/AppBar.vue +++ b/packages/web-app-files/src/components/AppBar/AppBar.vue @@ -63,7 +63,8 @@ import { DavProperties } from 'web-pkg/src/constants' import { isLocationPublicActive, isLocationSharesActive, - isLocationSpacesActive + isLocationSpacesActive, + isLocationTrashActive } from '../../router' import { useActiveLocation } from '../../composables' @@ -92,7 +93,11 @@ export default { isPersonalLocation: useActiveLocation(isLocationSpacesActive, 'files-spaces-personal-home'), isPublicLocation: useActiveLocation(isLocationPublicActive, 'files-public-files'), isSpacesProjectsLocation: useActiveLocation(isLocationSpacesActive, 'files-spaces-projects'), - isSpacesProjectLocation: useActiveLocation(isLocationSpacesActive, 'files-spaces-project') + isSpacesProjectLocation: useActiveLocation(isLocationSpacesActive, 'files-spaces-project'), + isTrashSpacesProjectActive: useActiveLocation( + isLocationTrashActive, + 'files-trash-spaces-project' + ) } }, data: () => ({ @@ -113,6 +118,9 @@ export default { ...mapState('Files', ['areHiddenFilesShown']), showContextActions() { + if (this.isTrashSpacesProjectActive) { + return false + } if (this.isSpacesProjectLocation) { return this.currentFolder && this.breadcrumbs.length > 2 } @@ -166,12 +174,30 @@ export default { this.isPublicLocation || this.isPersonalLocation || this.isSpacesProjectsLocation || - this.isSpacesProjectLocation + this.isSpacesProjectLocation || + this.isTrashSpacesProjectActive ) ) { return [] } + if (this.isTrashSpacesProjectActive) { + return [ + { + text: this.$gettext('Spaces'), + to: '/files/spaces/projects' + }, + { + text: this.$route.params.spaceId, + to: `/files/spaces/projects/${this.$route.params.spaceId}` + }, + { + text: this.$gettext('Deleted Files'), + onClick: () => bus.publish('app.files.list.load') + } + ] + } + const { params: routeParams, path: routePath } = this.$route const requestedItemPath = routeParams.item || '' const basePaths = diff --git a/packages/web-app-files/src/components/SideBar/Actions/SpaceActions.vue b/packages/web-app-files/src/components/SideBar/Actions/SpaceActions.vue index 8af2921ff43..ce0b718d9e8 100644 --- a/packages/web-app-files/src/components/SideBar/Actions/SpaceActions.vue +++ b/packages/web-app-files/src/components/SideBar/Actions/SpaceActions.vue @@ -32,6 +32,7 @@ import { mapGetters } from 'vuex' import ActionMenuItem from '../../ActionMenuItem.vue' import Rename from '../../../mixins/spaces/actions/rename' import Delete from '../../../mixins/spaces/actions/delete' +import DeletedFiles from '../../../mixins/spaces/actions/deletedFiles' import Disable from '../../../mixins/spaces/actions/disable' import Restore from '../../../mixins/spaces/actions/restore' import EditDescription from '../../../mixins/spaces/actions/editDescription' @@ -51,6 +52,7 @@ export default { mixins: [ Rename, Delete, + DeletedFiles, EditDescription, EditReadmeContent, Disable, @@ -70,6 +72,7 @@ export default { ...this.$_uploadImage_items, ...this.$_editReadmeContent_items, ...this.$_editQuota_items, + ...this.$_deletedFiles_items, ...this.$_restore_items, ...this.$_delete_items, ...this.$_disable_items diff --git a/packages/web-app-files/src/components/SideBar/FileInfo.vue b/packages/web-app-files/src/components/SideBar/FileInfo.vue index 078782f6ac1..717eb4e6403 100644 --- a/packages/web-app-files/src/components/SideBar/FileInfo.vue +++ b/packages/web-app-files/src/components/SideBar/FileInfo.vue @@ -63,7 +63,7 @@ export default { if ( isLocationTrashActive(this.$router, 'files-trash-personal') || - isLocationTrashActive(this.$router, 'files-trash-project') + isLocationTrashActive(this.$router, 'files-trash-spaces-project') ) { return interpolate({ sourceTime: this.file.ddate, diff --git a/packages/web-app-files/src/components/SideBar/SideBar.vue b/packages/web-app-files/src/components/SideBar/SideBar.vue index 85747bfc826..8be8ff881b6 100644 --- a/packages/web-app-files/src/components/SideBar/SideBar.vue +++ b/packages/web-app-files/src/components/SideBar/SideBar.vue @@ -307,7 +307,7 @@ export default { if ( isLocationTrashActive(this.$router, 'files-trash-personal') || - isLocationTrashActive(this.$router, 'files-trash-project') || + isLocationTrashActive(this.$router, 'files-trash-spaces-project') || this.highlightedFileIsSpace ) { this.selectedFile = this.highlightedFile diff --git a/packages/web-app-files/src/fileSideBars.js b/packages/web-app-files/src/fileSideBars.js index 4ffff12a55f..3afc4b5ac7e 100644 --- a/packages/web-app-files/src/fileSideBars.js +++ b/packages/web-app-files/src/fileSideBars.js @@ -8,7 +8,7 @@ import NoSelection from './components/SideBar/NoSelection.vue' import SpaceActions from './components/SideBar/Actions/SpaceActions.vue' import SpaceDetails from './components/SideBar/Details/SpaceDetails.vue' import SpaceShares from './components/SideBar/Shares/SpaceShares.vue' -import { isLocationCommonActive, isLocationPublicActive, isLocationSpacesActive } from './router' +import { isLocationSpacesActive, isLocationTrashActive, isLocationPublicActive } from './router' import { spaceRoleEditor, spaceRoleManager } from './helpers/share' export default [ @@ -27,10 +27,15 @@ export default [ app: 'details-item', icon: 'questionnaire-line', component: FileDetails, - default: !isLocationCommonActive(router, 'files-common-trash'), + default: + !isLocationTrashActive(router, 'files-trash-personal') && + !isLocationTrashActive(router, 'files-trash-spaces-project'), get enabled() { return ( - !isLocationCommonActive(router, 'files-common-trash') && !multipleSelection && !rootFolder + !isLocationTrashActive(router, 'files-trash-personal') && + !isLocationTrashActive(router, 'files-trash-spaces-project') && + !multipleSelection && + !rootFolder ) } }), @@ -48,7 +53,9 @@ export default [ component: FileActions, icon: 'slideshow-3', iconFillType: 'line', - default: isLocationCommonActive(router, 'files-common-trash'), + default: + isLocationTrashActive(router, 'files-trash-personal') || + isLocationTrashActive(router, 'files-trash-spaces-project'), get enabled() { return !multipleSelection && !rootFolder } @@ -60,7 +67,8 @@ export default [ get enabled() { if (multipleSelection || rootFolder) return false if ( - isLocationCommonActive(router, 'files-common-trash') || + isLocationTrashActive(router, 'files-trash-personal') || + isLocationTrashActive(router, 'files-trash-spaces-project') || isLocationPublicActive(router, 'files-public-files') ) { return false @@ -79,7 +87,8 @@ export default [ get enabled() { if (multipleSelection || rootFolder) return false if ( - isLocationCommonActive(router, 'files-common-trash') || + isLocationTrashActive(router, 'files-trash-personal') || + isLocationTrashActive(router, 'files-trash-spaces-project') || isLocationPublicActive(router, 'files-public-files') ) { return false @@ -98,7 +107,8 @@ export default [ get enabled() { if (multipleSelection || rootFolder) return false if ( - isLocationCommonActive(router, 'files-common-trash') || + isLocationTrashActive(router, 'files-trash-personal') || + isLocationTrashActive(router, 'files-trash-spaces-project') || isLocationPublicActive(router, 'files-public-files') ) { return false diff --git a/packages/web-app-files/src/mixins/actions/delete.js b/packages/web-app-files/src/mixins/actions/delete.js index 1958dd80cbc..4925aabd032 100644 --- a/packages/web-app-files/src/mixins/actions/delete.js +++ b/packages/web-app-files/src/mixins/actions/delete.js @@ -42,7 +42,7 @@ export default { isEnabled: ({ resources }) => { if ( !isLocationTrashActive(this.$router, 'files-trash-personal') && - !isLocationTrashActive(this.$router, 'files-trash-project') + !isLocationTrashActive(this.$router, 'files-trash-spaces-project') ) { return false } diff --git a/packages/web-app-files/src/mixins/actions/emptyTrashBin.js b/packages/web-app-files/src/mixins/actions/emptyTrashBin.js index f5979a1c66f..ec66659c529 100644 --- a/packages/web-app-files/src/mixins/actions/emptyTrashBin.js +++ b/packages/web-app-files/src/mixins/actions/emptyTrashBin.js @@ -15,7 +15,7 @@ export default { isEnabled: ({ resources }) => { if ( !isLocationTrashActive(this.$router, 'files-trash-personal') && - !isLocationTrashActive(this.$router, 'files-trash-project') + !isLocationTrashActive(this.$router, 'files-trash-spaces-project') ) { return false } diff --git a/packages/web-app-files/src/mixins/actions/fetch.js b/packages/web-app-files/src/mixins/actions/fetch.js index 42d8f81eeea..45dfa3b0b21 100644 --- a/packages/web-app-files/src/mixins/actions/fetch.js +++ b/packages/web-app-files/src/mixins/actions/fetch.js @@ -20,7 +20,7 @@ export default { isEnabled: ({ resources }) => { if ( isLocationTrashActive(this.$router, 'files-trash-personal') || - isLocationTrashActive(this.$router, 'files-trash-project') + isLocationTrashActive(this.$router, 'files-trash-spaces-project') ) { return false } diff --git a/packages/web-app-files/src/mixins/actions/navigate.js b/packages/web-app-files/src/mixins/actions/navigate.js index 42f2bb7ec60..e1634bd34e4 100644 --- a/packages/web-app-files/src/mixins/actions/navigate.js +++ b/packages/web-app-files/src/mixins/actions/navigate.js @@ -24,7 +24,7 @@ export default { isEnabled: ({ resources }) => { if ( isLocationTrashActive(this.$router, 'files-trash-personal') || - isLocationTrashActive(this.$router, 'files-trash-project') + isLocationTrashActive(this.$router, 'files-trash-spaces-project') ) { return false } diff --git a/packages/web-app-files/src/mixins/actions/rename.js b/packages/web-app-files/src/mixins/actions/rename.js index b22c0427d46..59b20d4b2a3 100644 --- a/packages/web-app-files/src/mixins/actions/rename.js +++ b/packages/web-app-files/src/mixins/actions/rename.js @@ -21,7 +21,7 @@ export default { isEnabled: ({ resources }) => { if ( isLocationTrashActive(this.$router, 'files-trash-personal') || - isLocationTrashActive(this.$router, 'files-trash-project') + isLocationTrashActive(this.$router, 'files-trash-spaces-project') ) { return false } diff --git a/packages/web-app-files/src/mixins/actions/restore.js b/packages/web-app-files/src/mixins/actions/restore.js index c43d246edda..4eec6b1f7d9 100644 --- a/packages/web-app-files/src/mixins/actions/restore.js +++ b/packages/web-app-files/src/mixins/actions/restore.js @@ -15,7 +15,7 @@ export default { isEnabled: ({ resources }) => { if ( !isLocationTrashActive(this.$router, 'files-trash-personal') && - !isLocationTrashActive(this.$router, 'files-trash-project') + !isLocationTrashActive(this.$router, 'files-trash-spaces-project') ) { return false } diff --git a/packages/web-app-files/src/mixins/actions/showActions.js b/packages/web-app-files/src/mixins/actions/showActions.js index 520e289c99d..a92253f3148 100644 --- a/packages/web-app-files/src/mixins/actions/showActions.js +++ b/packages/web-app-files/src/mixins/actions/showActions.js @@ -37,7 +37,7 @@ export default { // return hardcoded `actions-item` in all cases once we have them. await this.openSidebarWithPanel( isLocationTrashActive(this.$router, 'files-trash-personal') || - isLocationTrashActive(this.$router, 'files-trash-project') + isLocationTrashActive(this.$router, 'files-trash-spaces-project') ? null : 'actions-item' ) diff --git a/packages/web-app-files/src/mixins/actions/showDetails.js b/packages/web-app-files/src/mixins/actions/showDetails.js index bb42d83fc7d..99a4c8edacb 100644 --- a/packages/web-app-files/src/mixins/actions/showDetails.js +++ b/packages/web-app-files/src/mixins/actions/showDetails.js @@ -23,7 +23,7 @@ export default { if ( isLocationTrashActive(this.$router, 'files-trash-personal') || - isLocationTrashActive(this.$router, 'files-trash-project') + isLocationTrashActive(this.$router, 'files-trash-spaces-project') ) { return false } diff --git a/packages/web-app-files/src/mixins/actions/showShares.js b/packages/web-app-files/src/mixins/actions/showShares.js index 067cb5e1c57..19b58b51982 100644 --- a/packages/web-app-files/src/mixins/actions/showShares.js +++ b/packages/web-app-files/src/mixins/actions/showShares.js @@ -22,7 +22,7 @@ export default { if ( isLocationTrashActive(this.$router, 'files-trash-personal') || - isLocationTrashActive(this.$router, 'files-trash-project') + isLocationTrashActive(this.$router, 'files-trash-spaces-project') ) { return false } diff --git a/packages/web-app-files/src/mixins/deleteResources.js b/packages/web-app-files/src/mixins/deleteResources.js index f20f985c97c..0d6580bf86f 100644 --- a/packages/web-app-files/src/mixins/deleteResources.js +++ b/packages/web-app-files/src/mixins/deleteResources.js @@ -19,7 +19,7 @@ export default { $_deleteResources_isInTrashbin() { return ( isLocationTrashActive(this.$router, 'files-trash-personal') || - isLocationTrashActive(this.$router, 'files-trash-project') + isLocationTrashActive(this.$router, 'files-trash-spaces-project') ) }, diff --git a/packages/web-app-files/src/mixins/fileActions.js b/packages/web-app-files/src/mixins/fileActions.js index abe823b93e5..549d9e758d4 100644 --- a/packages/web-app-files/src/mixins/fileActions.js +++ b/packages/web-app-files/src/mixins/fileActions.js @@ -64,7 +64,7 @@ export default { $_fileActions_editorActions() { if ( isLocationTrashActive(this.$router, 'files-trash-personal') || - isLocationTrashActive(this.$router, 'files-trash-project') + isLocationTrashActive(this.$router, 'files-trash-spaces-project') ) { return [] } @@ -209,7 +209,7 @@ export default { $_fileActions_loadExternalAppActions(resources) { if ( isLocationTrashActive(this.$router, 'files-trash-personal') || - isLocationTrashActive(this.$router, 'files-trash-project') + isLocationTrashActive(this.$router, 'files-trash-spaces-project') ) { return [] } diff --git a/packages/web-app-files/src/mixins/spaces/actions/deletedFiles.js b/packages/web-app-files/src/mixins/spaces/actions/deletedFiles.js index 255fb545e14..c9e334f2623 100644 --- a/packages/web-app-files/src/mixins/spaces/actions/deletedFiles.js +++ b/packages/web-app-files/src/mixins/spaces/actions/deletedFiles.js @@ -13,7 +13,6 @@ export default { handler: this.$_deletedFiles_trigger, isEnabled: ({ resources }) => { return resources.length === 1 - }, componentType: 'oc-button', class: 'oc-files-actions-delete-trigger' @@ -24,7 +23,7 @@ export default { methods: { $_deletedFiles_trigger({ resources }) { this.$router.push( - createLocationTrash('files-trash-project', { + createLocationTrash('files-trash-spaces-project', { params: { spaceId: resources[0].id } diff --git a/packages/web-app-files/src/router/trash.ts b/packages/web-app-files/src/router/trash.ts index fd95f2bb4bd..c89947d33c1 100644 --- a/packages/web-app-files/src/router/trash.ts +++ b/packages/web-app-files/src/router/trash.ts @@ -2,13 +2,13 @@ import { RouteComponents } from './router' import { Location, RouteConfig } from 'vue-router' import { createLocation, $gettext, isLocationActiveDirector } from './utils' -type trashTypes = 'files-trash-personal' | 'files-trash-project' +type trashTypes = 'files-trash-personal' | 'files-trash-spaces-project' export const createLocationTrash = (name: trashTypes, location = {}): Location => createLocation(name, location) export const locationTrashPersonal = createLocationTrash('files-trash-personal') -export const locationTrashProject = createLocationTrash('files-trash-project') +export const locationTrashProject = createLocationTrash('files-trash-spaces-project') export const isLocationTrashActive = isLocationActiveDirector( locationTrashPersonal, @@ -32,7 +32,7 @@ export const buildRoutes = (components: RouteComponents): RouteConfig[] => [ }, { name: locationTrashProject.name, - path: 'project/:spaceId', + path: 'spaces/projects/:spaceId', component: components.Spaces.Trashbin, meta: { hideFilelistActions: true, diff --git a/packages/web-app-files/src/services/folder/loaderProject.ts b/packages/web-app-files/src/services/folder/loaderProject.ts index 430e1416c38..2a9f03d68b3 100644 --- a/packages/web-app-files/src/services/folder/loaderProject.ts +++ b/packages/web-app-files/src/services/folder/loaderProject.ts @@ -3,9 +3,7 @@ import Router from 'vue-router' import { useTask } from 'vue-concurrency' import { isLocationSpacesActive } from '../../router' import { clientService } from 'web-pkg/src/services' -import { useStore, useRouter } from 'web-pkg/src/composables' import { buildResource, buildSpace, buildWebDavSpacesPath } from '../../helpers/resources' -import { unref } from '@vue/composition-api' export class FolderLoaderProject implements FolderLoader { public isEnabled(router: Router): boolean { diff --git a/packages/web-app-files/src/services/folder/loaderTrashbin.ts b/packages/web-app-files/src/services/folder/loaderTrashbin.ts index 0a2804729e9..e50d3b2799e 100644 --- a/packages/web-app-files/src/services/folder/loaderTrashbin.ts +++ b/packages/web-app-files/src/services/folder/loaderTrashbin.ts @@ -2,12 +2,19 @@ import { FolderLoader, FolderLoaderTask, TaskContext } from '../folder' import Router from 'vue-router' import { useTask } from 'vue-concurrency' import { DavProperties } from 'web-pkg/src/constants' -import { isLocationCommonActive } from '../../router' -import { buildDeletedResource, buildResource } from '../../helpers/resources' +import { isLocationTrashActive } from '../../router' +import { + buildDeletedResource, + buildResource, + buildWebDavFilesTrashPath +} from '../../helpers/resources' export class FolderLoaderTrashbin implements FolderLoader { public isEnabled(router: Router): boolean { - return isLocationCommonActive(router, 'files-common-trash') + return ( + isLocationTrashActive(router, 'files-trash-personal') || + isLocationTrashActive(router, 'files-trash-spaces-project') + ) } public getTask(context: TaskContext): FolderLoaderTask { @@ -19,7 +26,11 @@ export class FolderLoaderTrashbin implements FolderLoader { return useTask(function* (signal1, signal2, ref) { store.commit('Files/CLEAR_CURRENT_FILES_LIST') - const resources = yield client.fileTrash.list('', '1', DavProperties.Trashbin) + const resources = yield client.fileTrash.list( + buildWebDavFilesTrashPath(store.getters.user.id), + '1', + DavProperties.Trashbin + ) store.commit('Files/LOAD_FILES', { currentFolder: buildResource(resources[0]), diff --git a/packages/web-app-files/src/views/spaces/Projects.vue b/packages/web-app-files/src/views/spaces/Projects.vue index ee3483fcb1b..f5d6723a6ec 100644 --- a/packages/web-app-files/src/views/spaces/Projects.vue +++ b/packages/web-app-files/src/views/spaces/Projects.vue @@ -171,6 +171,7 @@ import { createLocationSpaces } from '../../router' import { mapMutations, mapActions, mapGetters } from 'vuex' import Rename from '../../mixins/spaces/actions/rename' import Delete from '../../mixins/spaces/actions/delete' +import DeletedFiles from '../../mixins/spaces/actions/deletedFiles' import Disable from '../../mixins/spaces/actions/disable' import Restore from '../../mixins/spaces/actions/restore' import EditDescription from '../../mixins/spaces/actions/editDescription' @@ -189,7 +190,17 @@ export default { QuotaModal, ListLoader }, - mixins: [Rename, Delete, EditDescription, EditQuota, Disable, ShowDetails, Restore, UploadImage], + mixins: [ + Rename, + Delete, + EditDescription, + EditQuota, + DeletedFiles, + Disable, + ShowDetails, + Restore, + UploadImage + ], setup() { const store = useStore() const spaces = computed(() => store.getters['Files/activeFiles'] || []) @@ -294,6 +305,7 @@ export default { ...this.$_editDescription_items, ...this.$_uploadImage_items, ...this.$_editQuota_items, + ...this.$_deletedFiles_items, ...this.$_restore_items, ...this.$_delete_items, ...this.$_disable_items, diff --git a/packages/web-app-files/src/views/spaces/Trashbin.vue b/packages/web-app-files/src/views/spaces/Trashbin.vue index 54e79f5cdc0..50e39d02c03 100644 --- a/packages/web-app-files/src/views/spaces/Trashbin.vue +++ b/packages/web-app-files/src/views/spaces/Trashbin.vue @@ -9,7 +9,7 @@ icon="delete-bin-5" > { + const loadResourcesEventToken = bus.subscribe('app.files.list.load', () => { this.loadResourcesTask.perform(this) }) From 6c6b560e174525f7012e76b85937365ed90d5f1a Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Thu, 10 Mar 2022 14:24:31 +0100 Subject: [PATCH 06/34] Update snapshots --- packages/web-app-files/src/mixins/actions/restore.js | 1 + .../views/spaces/__snapshots__/Project.spec.js.snap | 12 ++++++++++++ .../views/spaces/__snapshots__/Projects.spec.js.snap | 3 +++ 3 files changed, 16 insertions(+) diff --git a/packages/web-app-files/src/mixins/actions/restore.js b/packages/web-app-files/src/mixins/actions/restore.js index 4eec6b1f7d9..2cd0eaa339b 100644 --- a/packages/web-app-files/src/mixins/actions/restore.js +++ b/packages/web-app-files/src/mixins/actions/restore.js @@ -53,6 +53,7 @@ export default { }) ) }) + await Promise.all(restorePromises) // success handler (for partial and full success) diff --git a/packages/web-app-files/tests/unit/views/spaces/__snapshots__/Project.spec.js.snap b/packages/web-app-files/tests/unit/views/spaces/__snapshots__/Project.spec.js.snap index a5a841257f6..ea60d6aac2b 100644 --- a/packages/web-app-files/tests/unit/views/spaces/__snapshots__/Project.spec.js.snap +++ b/packages/web-app-files/tests/unit/views/spaces/__snapshots__/Project.spec.js.snap @@ -16,6 +16,12 @@ exports[`Spaces project view space image should show if given 1`] = `
    +
  • + + + Deleted Files + +
  • @@ -59,6 +65,12 @@ exports[`Spaces project view space readme should show if given 1`] = `
      +
    • + + + Deleted Files + +
    • diff --git a/packages/web-app-files/tests/unit/views/spaces/__snapshots__/Projects.spec.js.snap b/packages/web-app-files/tests/unit/views/spaces/__snapshots__/Projects.spec.js.snap index dbf9b56915d..35e5c69a178 100644 --- a/packages/web-app-files/tests/unit/views/spaces/__snapshots__/Projects.spec.js.snap +++ b/packages/web-app-files/tests/unit/views/spaces/__snapshots__/Projects.spec.js.snap @@ -31,6 +31,9 @@ exports[`Spaces component should list spaces 1`] = `
        +
      • From 5f05b1950e0b73fd085fe4bf75528ecd7ea0bed9 Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Thu, 10 Mar 2022 14:50:35 +0100 Subject: [PATCH 07/34] Fix mapGetters user on wrong place --- packages/web-app-files/src/mixins/actions/emptyTrashBin.js | 2 +- packages/web-app-files/src/mixins/actions/restore.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/web-app-files/src/mixins/actions/emptyTrashBin.js b/packages/web-app-files/src/mixins/actions/emptyTrashBin.js index ec66659c529..e20db5d1ea0 100644 --- a/packages/web-app-files/src/mixins/actions/emptyTrashBin.js +++ b/packages/web-app-files/src/mixins/actions/emptyTrashBin.js @@ -5,6 +5,7 @@ import { buildWebDavFilesTrashPath } from '../../helpers/resources' export default { computed: { ...mapGetters('Files', ['activeFiles']), + ...mapGetters(['user']), $_emptyTrashBin_items() { return [ { @@ -33,7 +34,6 @@ export default { methods: { ...mapActions(['showMessage']), ...mapActions('Files', ['clearTrashBin']), - ...mapGetters(['user']), $_emptyTrashBin_trigger() { this.$client.fileTrash .clearTrashBin(buildWebDavFilesTrashPath(this.user.id)) diff --git a/packages/web-app-files/src/mixins/actions/restore.js b/packages/web-app-files/src/mixins/actions/restore.js index 2cd0eaa339b..20e9d3c6fdd 100644 --- a/packages/web-app-files/src/mixins/actions/restore.js +++ b/packages/web-app-files/src/mixins/actions/restore.js @@ -5,6 +5,8 @@ import { buildWebDavFilesTrashPath, buildWebDavFilesPath } from '../../helpers/r export default { computed: { + ...mapGetters(['user']), + $_restore_items() { return [ { @@ -29,7 +31,6 @@ export default { }, methods: { ...mapActions('Files', ['removeFilesFromTrashbin']), - ...mapGetters(['user']), async $_restore_trigger({ resources }) { const restoredResources = [] From 59f8d06276b93494068bfe658896d0341e279b0c Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Thu, 10 Mar 2022 15:27:01 +0100 Subject: [PATCH 08/34] Fix tests && set /trash redirect --- packages/web-app-files/src/components/AppBar/AppBar.vue | 2 ++ packages/web-app-files/src/index.js | 2 +- packages/web-app-files/src/router/trash.ts | 1 + packages/web-app-files/tests/integration/specs/appBar.spec.js | 3 ++- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/web-app-files/src/components/AppBar/AppBar.vue b/packages/web-app-files/src/components/AppBar/AppBar.vue index a4c8c60fc72..69b1adfafc9 100644 --- a/packages/web-app-files/src/components/AppBar/AppBar.vue +++ b/packages/web-app-files/src/components/AppBar/AppBar.vue @@ -181,6 +181,7 @@ export default { return [] } + console.log(this.isTrashSpacesProjectActive) if (this.isTrashSpacesProjectActive) { return [ { @@ -197,6 +198,7 @@ export default { } ] } + console.log(2) const { params: routeParams, path: routePath } = this.$route const requestedItemPath = routeParams.item || '' diff --git a/packages/web-app-files/src/index.js b/packages/web-app-files/src/index.js index ce73bbe658a..0f1ec9bcee9 100644 --- a/packages/web-app-files/src/index.js +++ b/packages/web-app-files/src/index.js @@ -79,7 +79,7 @@ const navItems = [ name: $gettext('Deleted files'), icon: 'delete-bin-5', route: { - path: `/${appInfo.id}/trash/personal` + path: `/${appInfo.id}/trash` }, enabled(capabilities) { return capabilities.dav && capabilities.dav.trashbin === '1.0' diff --git a/packages/web-app-files/src/router/trash.ts b/packages/web-app-files/src/router/trash.ts index c89947d33c1..cd4914dbc21 100644 --- a/packages/web-app-files/src/router/trash.ts +++ b/packages/web-app-files/src/router/trash.ts @@ -18,6 +18,7 @@ export const isLocationTrashActive = isLocationActiveDirector( export const buildRoutes = (components: RouteComponents): RouteConfig[] => [ { path: '/trash', + redirect: (to) => createLocationTrash('files-trash-personal', to), component: components.App, children: [ { diff --git a/packages/web-app-files/tests/integration/specs/appBar.spec.js b/packages/web-app-files/tests/integration/specs/appBar.spec.js index 5896cfb4ba5..9759b715801 100644 --- a/packages/web-app-files/tests/integration/specs/appBar.spec.js +++ b/packages/web-app-files/tests/integration/specs/appBar.spec.js @@ -39,7 +39,8 @@ describe('AppBar contains set of actions and informations', () => { { setup: () => { return { - isSharesLocation: false + isSharesLocation: false, + isTrashSpacesProjectActive: false } }, store, From c28e60db2fd4c87575d6aff2aaa8b3bd5d14118f Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Fri, 11 Mar 2022 11:22:31 +0100 Subject: [PATCH 09/34] Add empty trash confirm dialog --- .../src/mixins/actions/emptyTrashBin.js | 21 ++++++++++++++++++- packages/web-runtime/package.json | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/packages/web-app-files/src/mixins/actions/emptyTrashBin.js b/packages/web-app-files/src/mixins/actions/emptyTrashBin.js index e20db5d1ea0..e65da7442df 100644 --- a/packages/web-app-files/src/mixins/actions/emptyTrashBin.js +++ b/packages/web-app-files/src/mixins/actions/emptyTrashBin.js @@ -32,12 +32,31 @@ export default { } }, methods: { - ...mapActions(['showMessage']), + ...mapActions(['showMessage', 'createModal', 'hideModal', 'toggleModalConfirmButton']), ...mapActions('Files', ['clearTrashBin']), + $_emptyTrashBin_trigger() { + const modal = { + variation: 'danger', + title: this.$gettext('Empty trash'), + cancelText: this.$gettext('Cancel'), + confirmText: this.$gettext('Delete'), + icon: 'alarm-warning', + message: this.$gettext( + 'Are you sure you want to permanently delete your items in the trash? You can’t undo this action.' + ), + hasInput: false, + onCancel: this.hideModal, + onConfirm: () => this.$_emptyTrashBin_emptyTrashBin() + } + + this.createModal(modal) + }, + $_emptyTrashBin_emptyTrashBin() { this.$client.fileTrash .clearTrashBin(buildWebDavFilesTrashPath(this.user.id)) .then(() => { + this.hideModal() this.showMessage({ title: this.$gettext('All deleted files were removed') }) diff --git a/packages/web-runtime/package.json b/packages/web-runtime/package.json index d63851f0ab8..3849372815f 100644 --- a/packages/web-runtime/package.json +++ b/packages/web-runtime/package.json @@ -19,7 +19,7 @@ "marked": "^4.0.12", "oidc-client": "1.11.5", "owncloud-design-system": "^13.0.0-rc.3", - "owncloud-sdk": "~2.1.0-alpha.3", + "owncloud-sdk": "~3.0.0-alpha.1", "p-queue": "^6.1.1", "popper-max-size-modifier": "^0.2.0", "portal-vue": "^2.1.7", From 86d5d3e8d7fbbb6be694c51facd7539fc669b371 Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Fri, 11 Mar 2022 16:22:41 +0100 Subject: [PATCH 10/34] Adjust trashbin actions to work with spaces --- .../src/components/AppBar/AppBar.vue | 2 -- .../web-app-files/src/helpers/resources.js | 4 ++-- .../src/mixins/actions/emptyTrashBin.js | 9 ++++++-- .../src/mixins/actions/restore.js | 21 ++++++++++++------- .../src/mixins/deleteResources.js | 8 +++++-- .../src/services/folder/loaderTrashbin.ts | 12 +++++------ 6 files changed, 35 insertions(+), 21 deletions(-) diff --git a/packages/web-app-files/src/components/AppBar/AppBar.vue b/packages/web-app-files/src/components/AppBar/AppBar.vue index 69b1adfafc9..a4c8c60fc72 100644 --- a/packages/web-app-files/src/components/AppBar/AppBar.vue +++ b/packages/web-app-files/src/components/AppBar/AppBar.vue @@ -181,7 +181,6 @@ export default { return [] } - console.log(this.isTrashSpacesProjectActive) if (this.isTrashSpacesProjectActive) { return [ { @@ -198,7 +197,6 @@ export default { } ] } - console.log(2) const { params: routeParams, path: routePath } = this.$route const requestedItemPath = routeParams.item || '' diff --git a/packages/web-app-files/src/helpers/resources.js b/packages/web-app-files/src/helpers/resources.js index ea2c2ab7284..f7275588beb 100644 --- a/packages/web-app-files/src/helpers/resources.js +++ b/packages/web-app-files/src/helpers/resources.js @@ -248,8 +248,8 @@ export function buildWebDavSpacesPath(storageId, path) { return '/' + `spaces/${storageId}/${path}`.split('/').filter(Boolean).join('/') } -export function buildWebDavSpacesTrashPath(spaceId, path) { - return '/' + `trash-bin/${spaceId}/${path}`.split('/').filter(Boolean).join('/') +export function buildWebDavSpacesTrashPath(spaceId, path = '') { + return '/' + `/spaces/trash-bin/${spaceId}/${path}`.split('/').filter(Boolean).join('/') } export function attachIndicators(resource, sharesTree) { diff --git a/packages/web-app-files/src/mixins/actions/emptyTrashBin.js b/packages/web-app-files/src/mixins/actions/emptyTrashBin.js index e65da7442df..4bc53bea176 100644 --- a/packages/web-app-files/src/mixins/actions/emptyTrashBin.js +++ b/packages/web-app-files/src/mixins/actions/emptyTrashBin.js @@ -1,6 +1,6 @@ import { mapActions, mapGetters } from 'vuex' import { isLocationTrashActive } from '../../router' -import { buildWebDavFilesTrashPath } from '../../helpers/resources' +import { buildWebDavFilesTrashPath, buildWebDavSpacesTrashPath } from '../../helpers/resources' export default { computed: { @@ -53,8 +53,13 @@ export default { this.createModal(modal) }, $_emptyTrashBin_emptyTrashBin() { + const path = isLocationTrashActive(this.$router, 'files-trash-spaces-project') + ? buildWebDavSpacesTrashPath(this.$route.params.spaceId) + : buildWebDavFilesTrashPath(this.user.id) + + console.log(path) this.$client.fileTrash - .clearTrashBin(buildWebDavFilesTrashPath(this.user.id)) + .clearTrashBin(path) .then(() => { this.hideModal() this.showMessage({ diff --git a/packages/web-app-files/src/mixins/actions/restore.js b/packages/web-app-files/src/mixins/actions/restore.js index 20e9d3c6fdd..9877a8b2719 100644 --- a/packages/web-app-files/src/mixins/actions/restore.js +++ b/packages/web-app-files/src/mixins/actions/restore.js @@ -1,7 +1,12 @@ import { mapActions, mapGetters } from 'vuex' import PQueue from 'p-queue' import { isLocationTrashActive } from '../../router' -import { buildWebDavFilesTrashPath, buildWebDavFilesPath } from '../../helpers/resources' +import { + buildWebDavFilesTrashPath, + buildWebDavFilesPath, + buildWebDavSpacesTrashPath, + buildWebDavSpacesPath +} from '../../helpers/resources' export default { computed: { @@ -38,14 +43,17 @@ export default { const restorePromises = [] const restoreQueue = new PQueue({ concurrency: 4 }) resources.forEach((resource) => { + const path = isLocationTrashActive(this.$router, 'files-trash-spaces-project') + ? buildWebDavSpacesTrashPath(this.$route.params.spaceId) + : buildWebDavFilesTrashPath(this.user.id) + const restorePath = isLocationTrashActive(this.$router, 'files-trash-spaces-project') + ? buildWebDavSpacesPath(this.$route.params.spaceId, resource.path) + : buildWebDavFilesPath(this.user.id, resource.path) + restorePromises.push( restoreQueue.add(async () => { try { - await this.$client.fileTrash.restore( - buildWebDavFilesTrashPath(this.user.id), - resource.id, - buildWebDavFilesPath(this.user.id, resource.path) - ) + await this.$client.fileTrash.restore(path, resource.id, restorePath) restoredResources.push(resource) } catch (e) { console.error(e) @@ -54,7 +62,6 @@ export default { }) ) }) - await Promise.all(restorePromises) // success handler (for partial and full success) diff --git a/packages/web-app-files/src/mixins/deleteResources.js b/packages/web-app-files/src/mixins/deleteResources.js index 0d6580bf86f..a254657c996 100644 --- a/packages/web-app-files/src/mixins/deleteResources.js +++ b/packages/web-app-files/src/mixins/deleteResources.js @@ -1,7 +1,7 @@ import { mapGetters, mapActions, mapMutations } from 'vuex' import { cloneStateObject } from '../helpers/store' import { isSameResource } from '../helpers/resource' -import { buildWebDavFilesTrashPath } from '../helpers/resources' +import { buildWebDavFilesTrashPath, buildWebDavSpacesTrashPath } from '../helpers/resources' import PQueue from 'p-queue' import { isLocationTrashActive } from '../router' @@ -99,8 +99,12 @@ export default { ...mapMutations(['SET_QUOTA']), $_deleteResources_trashbin_deleteOp(resource) { + const path = isLocationTrashActive(this.$router, 'files-trash-spaces-project') + ? buildWebDavSpacesTrashPath(this.$route.params.spaceId) + : buildWebDavFilesTrashPath(this.user.id) + return this.$client.fileTrash - .clearTrashBin(buildWebDavFilesTrashPath(this.user.id), resource.id) + .clearTrashBin(path, resource.id) .then(() => { this.removeFilesFromTrashbin([resource]) const translated = this.$gettext('"%{file}" was deleted successfully') diff --git a/packages/web-app-files/src/services/folder/loaderTrashbin.ts b/packages/web-app-files/src/services/folder/loaderTrashbin.ts index e50d3b2799e..ccb56650e13 100644 --- a/packages/web-app-files/src/services/folder/loaderTrashbin.ts +++ b/packages/web-app-files/src/services/folder/loaderTrashbin.ts @@ -6,7 +6,8 @@ import { isLocationTrashActive } from '../../router' import { buildDeletedResource, buildResource, - buildWebDavFilesTrashPath + buildWebDavFilesTrashPath, + buildWebDavSpacesTrashPath } from '../../helpers/resources' export class FolderLoaderTrashbin implements FolderLoader { @@ -26,11 +27,10 @@ export class FolderLoaderTrashbin implements FolderLoader { return useTask(function* (signal1, signal2, ref) { store.commit('Files/CLEAR_CURRENT_FILES_LIST') - const resources = yield client.fileTrash.list( - buildWebDavFilesTrashPath(store.getters.user.id), - '1', - DavProperties.Trashbin - ) + const path = isLocationTrashActive(context.router, 'files-trash-spaces-project') + ? buildWebDavSpacesTrashPath(context.route.params.spaceId) + : buildWebDavFilesTrashPath(context.store.getters.user.id) + const resources = yield client.fileTrash.list(path, '1', DavProperties.Trashbin) store.commit('Files/LOAD_FILES', { currentFolder: buildResource(resources[0]), From 724f7a69b031429fb20973ccbf871897297c546f Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Fri, 11 Mar 2022 16:24:15 +0100 Subject: [PATCH 11/34] Adjust empty message --- packages/web-app-files/src/views/spaces/Trashbin.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web-app-files/src/views/spaces/Trashbin.vue b/packages/web-app-files/src/views/spaces/Trashbin.vue index 50e39d02c03..705d6101dd4 100644 --- a/packages/web-app-files/src/views/spaces/Trashbin.vue +++ b/packages/web-app-files/src/views/spaces/Trashbin.vue @@ -9,7 +9,7 @@ icon="delete-bin-5" > Date: Fri, 11 Mar 2022 16:33:33 +0100 Subject: [PATCH 12/34] Fix typo --- .../web-app-files/src/mixins/spaces/actions/deletedFiles.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web-app-files/src/mixins/spaces/actions/deletedFiles.js b/packages/web-app-files/src/mixins/spaces/actions/deletedFiles.js index c9e334f2623..8bcdd93567c 100644 --- a/packages/web-app-files/src/mixins/spaces/actions/deletedFiles.js +++ b/packages/web-app-files/src/mixins/spaces/actions/deletedFiles.js @@ -8,7 +8,7 @@ export default { name: 'deletedFiles', icon: 'delete-bin-5', label: () => { - return this.$gettext('Deleted Files') + return this.$gettext('Deleted files') }, handler: this.$_deletedFiles_trigger, isEnabled: ({ resources }) => { From 09dffcf018c75ddcebd9b60f66c19018dacc1ce7 Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Mon, 14 Mar 2022 09:26:49 +0100 Subject: [PATCH 13/34] Add tests for spaces deletedFiles action --- .../unit/mixins/spaces/deletedFiles.spec.js | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 packages/web-app-files/tests/unit/mixins/spaces/deletedFiles.spec.js diff --git a/packages/web-app-files/tests/unit/mixins/spaces/deletedFiles.spec.js b/packages/web-app-files/tests/unit/mixins/spaces/deletedFiles.spec.js new file mode 100644 index 00000000000..45108a376b3 --- /dev/null +++ b/packages/web-app-files/tests/unit/mixins/spaces/deletedFiles.spec.js @@ -0,0 +1,90 @@ +import Vuex from 'vuex' +import { createStore } from 'vuex-extensions' +import { mount, createLocalVue } from '@vue/test-utils' +import DeletedFiles from '@files/src/mixins/spaces/actions/deletedFiles.js' +import { createLocationSpaces, createLocationTrash } from '../../../../src/router' +import { buildSpace } from '../../../../src/helpers/resources' + +const localVue = createLocalVue() +localVue.use(Vuex) + +const Component = { + render() {}, + mixins: [DeletedFiles] +} + +describe('delete', () => { + afterEach(() => jest.clearAllMocks()) + + describe('isEnabled property', () => { + it('should be false when not resource given', () => { + const wrapper = getWrapper() + expect(wrapper.vm.$_deletedFiles_items[0].isEnabled({ resources: [] })).toBe(false) + }) + it('should be true when resource is given', () => { + const spaceMock = { + id: '1' + } + const wrapper = getWrapper() + expect( + wrapper.vm.$_deletedFiles_items[0].isEnabled({ resources: [buildSpace(spaceMock)] }) + ).toBe(true) + }) + }) + + describe('method "$_deletedFiles_trigger"', () => { + it('should trigger route change', async () => { + const spaceMock = { + id: '1' + } + + const wrapper = getWrapper() + await wrapper.vm.$_deletedFiles_trigger({ resources: [buildSpace(spaceMock)] }) + + expect(wrapper.vm.$router.push).toHaveBeenCalledWith( + createLocationTrash('files-trash-spaces-project', { + params: { + spaceId: spaceMock.id + } + }) + ) + }) + }) +}) + +function getWrapper() { + return mount(Component, { + localVue, + mocks: { + $router: { + currentRoute: createLocationSpaces('files-spaces-projects'), + resolve: (r) => { + return { href: r.name } + }, + push: jest.fn() + }, + $gettext: jest.fn() + }, + store: createStore(Vuex.Store, { + actions: { + createModal: jest.fn(), + hideModal: jest.fn(), + showMessage: jest.fn() + }, + getters: { + configuration: () => ({ + server: 'https://example.com' + }), + getToken: () => 'token' + }, + modules: { + Files: { + namespaced: true, + mutations: { + REMOVE_FILE: jest.fn() + } + } + } + }) + }) +} From f7a10f3c6c0937fb638061e03530d55cea788edd Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Mon, 14 Mar 2022 09:51:07 +0100 Subject: [PATCH 14/34] Update yarn.lock --- yarn.lock | 253 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 157 insertions(+), 96 deletions(-) diff --git a/yarn.lock b/yarn.lock index 6478886a4f9..979f23cd2ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2400,13 +2400,13 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:*, @types/jest@npm:^27.4.1": - version: 27.4.1 - resolution: "@types/jest@npm:27.4.1" +"@types/jest@npm:*, @types/jest@npm:^27.4.0": + version: 27.4.0 + resolution: "@types/jest@npm:27.4.0" dependencies: - jest-matcher-utils: ^27.0.0 + jest-diff: ^27.0.0 pretty-format: ^27.0.0 - checksum: 5184f3eef4832d01ee8f59bed15eec45ccc8e29c724a5e6ce37bf74396b37bdf04f557000f45ba4fc38ae6075cf9cfcce3d7a75abc981023c61ceb27230a93e4 + checksum: d2350267f954f9a2e4a15e5f02fbf19a77abfb9fd9e57a954de1fb0e9a0d3d5f8d3646ac7d9c42aeb4b4d828d2e70624ec149c85bb50a48634a54eed8429e1f8 languageName: node linkType: hard @@ -2607,13 +2607,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^5.14.0": - version: 5.14.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.14.0" +"@typescript-eslint/eslint-plugin@npm:^5.11.0": + version: 5.11.0 + resolution: "@typescript-eslint/eslint-plugin@npm:5.11.0" dependencies: - "@typescript-eslint/scope-manager": 5.14.0 - "@typescript-eslint/type-utils": 5.14.0 - "@typescript-eslint/utils": 5.14.0 + "@typescript-eslint/scope-manager": 5.11.0 + "@typescript-eslint/type-utils": 5.11.0 + "@typescript-eslint/utils": 5.11.0 debug: ^4.3.2 functional-red-black-tree: ^1.0.1 ignore: ^5.1.8 @@ -2626,42 +2626,52 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 7176b30ebc2144292b38404b28aadc7a32d24d454deb8000e0e2ae71a199b9cff7c67ed6ff723b93278091f19948fdd4ef44029aade3ee6ec6f340acc9104ec6 + checksum: fa546ba4397f3e693870c39d1e8df6feccb728a7092be6312b78806a64c4ff4648cff0462503d3e510e8b173b9704c19e78d2a7af790ab1c0309782e33a89c32 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^5.14.0": - version: 5.14.0 - resolution: "@typescript-eslint/parser@npm:5.14.0" +"@typescript-eslint/parser@npm:^5.11.0": + version: 5.11.0 + resolution: "@typescript-eslint/parser@npm:5.11.0" dependencies: - "@typescript-eslint/scope-manager": 5.14.0 - "@typescript-eslint/types": 5.14.0 - "@typescript-eslint/typescript-estree": 5.14.0 + "@typescript-eslint/scope-manager": 5.11.0 + "@typescript-eslint/types": 5.11.0 + "@typescript-eslint/typescript-estree": 5.11.0 debug: ^4.3.2 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 2ee433b070d4b46fe2c2e11596fa92f39e60459a75d0e3fafe4f7d2e2f9772847208ce208190a3af0ec6490cb46a517523ac92a82a17fe289cc03ed7e512638a + checksum: 521b6e701d877dc0514c6a3992f4900aa6fea28ba7c0bc03c634dad2b50aa195401e45683dfebd9e8492a857cd84bba3b585d8fe8d0cd1d7e2720372c34c50a3 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.14.0": - version: 5.14.0 - resolution: "@typescript-eslint/scope-manager@npm:5.14.0" +"@typescript-eslint/scope-manager@npm:5.11.0": + version: 5.11.0 + resolution: "@typescript-eslint/scope-manager@npm:5.11.0" dependencies: - "@typescript-eslint/types": 5.14.0 - "@typescript-eslint/visitor-keys": 5.14.0 - checksum: 20f163877218fc1c880e014ef2f858f7f8280a5d9dfc09dce092df9b72f6c5ebf490ede8b8dcf51e55f4d62a248eb5ccd468d37756731f27c8695c2f199f2638 + "@typescript-eslint/types": 5.11.0 + "@typescript-eslint/visitor-keys": 5.11.0 + checksum: bf7feaed495ed4cafa1b89a2b73781b30061d019e1c1b3765dc8006e7f36b537f6f451e37c77400067771318b4f0c5915804084dc6299ea7c6ecde2daf0aca1c languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.14.0": - version: 5.14.0 - resolution: "@typescript-eslint/type-utils@npm:5.14.0" +"@typescript-eslint/scope-manager@npm:5.12.1": + version: 5.12.1 + resolution: "@typescript-eslint/scope-manager@npm:5.12.1" dependencies: - "@typescript-eslint/utils": 5.14.0 + "@typescript-eslint/types": 5.12.1 + "@typescript-eslint/visitor-keys": 5.12.1 + checksum: b6e7f45b4fe39397430149ad005f7d28aa75a063dacfc947514abd52ba5235fecf937784416dfb7e8c168025b1bc74611332ceb214045cc362922e4b311bcb11 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:5.11.0": + version: 5.11.0 + resolution: "@typescript-eslint/type-utils@npm:5.11.0" + dependencies: + "@typescript-eslint/utils": 5.11.0 debug: ^4.3.2 tsutils: ^3.21.0 peerDependencies: @@ -2669,23 +2679,30 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: b5b71f397a87769558473b9283e65f92a1153d4de93cb9e5bf559ca6f7d8a898b4b565141bd2455c9fb6c2266aa5e39465a0337a7484a09a7fdf4bfbf191c7cf + checksum: fd570806d82874289ded6bfd90ff5414d4365b95b4a2e911f7ff2fee6e2c7675d0f2f71580c24cb8be733c3dfe2cd33eedff99ae2aa50f61b1b5af76499074eb languageName: node linkType: hard -"@typescript-eslint/types@npm:5.14.0": - version: 5.14.0 - resolution: "@typescript-eslint/types@npm:5.14.0" - checksum: 1113c0c785a449970c52459dd1c779a80ae7b34b0bae923eace43a5d27279ee47092703d2a6a120c4ee7a78f0157ce8d6e53f951696d7b6197e121aac08ccc07 +"@typescript-eslint/types@npm:5.11.0": + version: 5.11.0 + resolution: "@typescript-eslint/types@npm:5.11.0" + checksum: b1531481da75a6c89510ad03f3db68e4797b25438bb902ee322bd1c154b83396016271cc00356dcdbc300a8ee421493aae803b8c716f36d7b4808fe045ae3a2a languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.14.0": - version: 5.14.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.14.0" +"@typescript-eslint/types@npm:5.12.1": + version: 5.12.1 + resolution: "@typescript-eslint/types@npm:5.12.1" + checksum: 753cb4b0f266500298f07c0386d72e7d9570f26e2deb7017fd677d21bb8bca7f2ca01d3f4b43d86fbb7337a76f0c9da86657de96f107dba92632d726b4e7797e + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:5.11.0": + version: 5.11.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.11.0" dependencies: - "@typescript-eslint/types": 5.14.0 - "@typescript-eslint/visitor-keys": 5.14.0 + "@typescript-eslint/types": 5.11.0 + "@typescript-eslint/visitor-keys": 5.11.0 debug: ^4.3.2 globby: ^11.0.4 is-glob: ^4.0.3 @@ -2694,33 +2711,77 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 41816c4cb37538a8206c1c590e9d0d0c30eca8a972001a102bf43002b8b6e53ec1ce451a156ce037ea978d34b297c5f677de7fe7baecd355687629e177dc6809 + checksum: 7bda55501c586efd7f8065b4158016486d8af92b8419931fbea7cec9bfe074075de8cdebec8baa1ac8a5c3f973599b9dd44a51fced1792176e49cd60cc8e5442 languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.14.0, @typescript-eslint/utils@npm:^5.10.0": - version: 5.14.0 - resolution: "@typescript-eslint/utils@npm:5.14.0" +"@typescript-eslint/typescript-estree@npm:5.12.1": + version: 5.12.1 + resolution: "@typescript-eslint/typescript-estree@npm:5.12.1" + dependencies: + "@typescript-eslint/types": 5.12.1 + "@typescript-eslint/visitor-keys": 5.12.1 + debug: ^4.3.2 + globby: ^11.0.4 + is-glob: ^4.0.3 + semver: ^7.3.5 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 5677f5550fdc24879b51b3bc4c7551a5b241f70cf8f4cfe0fa2dc270dcd858c6d5085bf784c0bd471bb71da5abbbcf1ec44dc84a688ce61107d5ddba21d235ae + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:5.11.0": + version: 5.11.0 + resolution: "@typescript-eslint/utils@npm:5.11.0" dependencies: "@types/json-schema": ^7.0.9 - "@typescript-eslint/scope-manager": 5.14.0 - "@typescript-eslint/types": 5.14.0 - "@typescript-eslint/typescript-estree": 5.14.0 + "@typescript-eslint/scope-manager": 5.11.0 + "@typescript-eslint/types": 5.11.0 + "@typescript-eslint/typescript-estree": 5.11.0 eslint-scope: ^5.1.1 eslint-utils: ^3.0.0 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: c44b415e61e83f89ae7314f30e9783d813b19cd65b40993cb6dc28696f42ba3e4fa2bb31006ec67fe5414e37a02386616c87aa35e5ff8659e65a06fb3e83c95d + checksum: 5ab1a15db1e0a2fbb857a8a16325459ad3d5239066f2641aa93ad9f7d08252d3a4ca6ae356c51cba1c6c81a65d84883436566b01932fa55b64a69796b950900d languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.14.0": - version: 5.14.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.14.0" +"@typescript-eslint/utils@npm:^5.10.0": + version: 5.12.1 + resolution: "@typescript-eslint/utils@npm:5.12.1" + dependencies: + "@types/json-schema": ^7.0.9 + "@typescript-eslint/scope-manager": 5.12.1 + "@typescript-eslint/types": 5.12.1 + "@typescript-eslint/typescript-estree": 5.12.1 + eslint-scope: ^5.1.1 + eslint-utils: ^3.0.0 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 0eb277ad4e60fa46b586d5df8e05be6e0d3963a59cf409a348e2c512d5e88d657a56026754ee10c31ee1333794e145f7ffe33e08d28aa1bed4b4ab4b02a95712 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:5.11.0": + version: 5.11.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.11.0" + dependencies: + "@typescript-eslint/types": 5.11.0 + eslint-visitor-keys: ^3.0.0 + checksum: 8f0b6fe1e86bc93825a137be3220f57e3a4bee410cca5d35963a0cd416750b31291a73c4294676d94ed0f5066b4cfb3a8f512d409881daa550d1645f4381eb21 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:5.12.1": + version: 5.12.1 + resolution: "@typescript-eslint/visitor-keys@npm:5.12.1" dependencies: - "@typescript-eslint/types": 5.14.0 + "@typescript-eslint/types": 5.12.1 eslint-visitor-keys: ^3.0.0 - checksum: 3fc6038b330602b0dd2ff4070b11057a19239caa6f5bd956ee75d66f37f1b936704a98c4b1eae5da19a34d72b836a93e675080608138e50eabf72c2c901f648e + checksum: ada52c77dc42d055a6cefb294b9a893d680d125eb0fc5cc0daf2f85007c603ef688f4f5a865893758e00e89739850409bb748e26bb8c834372409d24ea820677 languageName: node linkType: hard @@ -5126,10 +5187,10 @@ __metadata: languageName: node linkType: hard -"diff-sequences@npm:^27.5.1": - version: 27.5.1 - resolution: "diff-sequences@npm:27.5.1" - checksum: a00db5554c9da7da225db2d2638d85f8e41124eccbd56cbaefb3b276dcbb1c1c2ad851c32defe2055a54a4806f030656cbf6638105fd6ce97bb87b90b32a33ca +"diff-sequences@npm:^27.4.0": + version: 27.4.0 + resolution: "diff-sequences@npm:27.4.0" + checksum: 66d04033e8632eeacdd029b4ecaf87d233d475e4b0cd1cee035eda99e70e1a7f803507d72f2677990ef526f28a2f6e5709af8d94dcdc0682b8884a3a646190a1 languageName: node linkType: hard @@ -7667,15 +7728,15 @@ __metadata: languageName: node linkType: hard -"jest-diff@npm:^27.0.2, jest-diff@npm:^27.2.5, jest-diff@npm:^27.4.6, jest-diff@npm:^27.5.1": - version: 27.5.1 - resolution: "jest-diff@npm:27.5.1" +"jest-diff@npm:^27.0.0, jest-diff@npm:^27.0.2, jest-diff@npm:^27.2.5, jest-diff@npm:^27.4.6": + version: 27.4.6 + resolution: "jest-diff@npm:27.4.6" dependencies: chalk: ^4.0.0 - diff-sequences: ^27.5.1 - jest-get-type: ^27.5.1 - pretty-format: ^27.5.1 - checksum: 8be27c1e1ee57b2bb2bef9c0b233c19621b4c43d53a3c26e2c00a4e805eb4ea11fe1694a06a9fb0e80ffdcfdc0d2b1cb0b85920b3f5c892327ecd1e7bd96b865 + diff-sequences: ^27.4.0 + jest-get-type: ^27.4.0 + pretty-format: ^27.4.6 + checksum: cf6b7e80e3c64a7c71ab209c0325bbda175991aed985ecee7652df9d6540e4959089038e208c04ab05391c9ddf07adc72f0c8c26cc4cee6fa17f76f500e2bf43 languageName: node linkType: hard @@ -7740,10 +7801,10 @@ __metadata: languageName: node linkType: hard -"jest-get-type@npm:^27.0.1, jest-get-type@npm:^27.0.6, jest-get-type@npm:^27.4.0, jest-get-type@npm:^27.5.1": - version: 27.5.1 - resolution: "jest-get-type@npm:27.5.1" - checksum: 63064ab70195c21007d897c1157bf88ff94a790824a10f8c890392e7d17eda9c3900513cb291ca1c8d5722cad79169764e9a1279f7c8a9c4cd6e9109ff04bbc0 +"jest-get-type@npm:^27.0.1, jest-get-type@npm:^27.0.6, jest-get-type@npm:^27.4.0": + version: 27.4.0 + resolution: "jest-get-type@npm:27.4.0" + checksum: bb9b70e420009fdaed3026d5bccd01569f92c7500f9f544d862796d4f4efa93ced5484864b2f272c7748bfb5bfd3268d48868b169c51ab45fe5b45b9519b6e46 languageName: node linkType: hard @@ -7830,15 +7891,15 @@ __metadata: languageName: node linkType: hard -"jest-matcher-utils@npm:^27.0.0, jest-matcher-utils@npm:^27.2.5, jest-matcher-utils@npm:^27.4.6": - version: 27.5.1 - resolution: "jest-matcher-utils@npm:27.5.1" +"jest-matcher-utils@npm:^27.2.5, jest-matcher-utils@npm:^27.4.6": + version: 27.4.6 + resolution: "jest-matcher-utils@npm:27.4.6" dependencies: chalk: ^4.0.0 - jest-diff: ^27.5.1 - jest-get-type: ^27.5.1 - pretty-format: ^27.5.1 - checksum: bb2135fc48889ff3fe73888f6cc7168ddab9de28b51b3148f820c89fdfd2effdcad005f18be67d0b9be80eda208ad47290f62f03d0a33f848db2dd0273c8217a + jest-diff: ^27.4.6 + jest-get-type: ^27.4.0 + pretty-format: ^27.4.6 + checksum: 445a8cc9eaa7cb08653a10cfc4f109eca76a97d1b1d3a01067bd77efa9cb3a554b74c7402a4c9d5083b21e11218e1515ef538faa47fa47c282072b4825f6b307 languageName: node linkType: hard @@ -9547,9 +9608,9 @@ __metadata: languageName: node linkType: hard -"owncloud-design-system@npm:^13.0.0-rc.3": - version: 13.0.0-rc.3 - resolution: "owncloud-design-system@npm:13.0.0-rc.3" +"owncloud-design-system@npm:^13.0.0-rc.2": + version: 13.0.0-rc.2 + resolution: "owncloud-design-system@npm:13.0.0-rc.2" peerDependencies: "@popperjs/core": ^2.4.0 "@vue/composition-api": ^1.4.3 @@ -9566,13 +9627,13 @@ __metadata: vue-inline-svg: ^2.0.0 vue-select: ^3.12.0 webfontloader: ^1.6.28 - checksum: aadf94f8e038bbb535996175be622d4492a88efecffdc7fbf9a5f46516661734d33aac090bd787ef9251016b6fa0e3028b1b794a626c876a848abaffb8d8a6af + checksum: 0e6dd8fdb9f5fef2fed6de9286d52b7dda964e183546d90bd21f94fbd3f551623cb7ed284aad169bce04b47430c43ccafc791d9fabbcec37d64291766e699f9a languageName: node linkType: hard -"owncloud-sdk@npm:~2.1.0-alpha.3": - version: 2.1.0-alpha.3 - resolution: "owncloud-sdk@npm:2.1.0-alpha.3" +"owncloud-sdk@npm:~3.0.0-alpha.1": + version: 3.0.0-alpha.1 + resolution: "owncloud-sdk@npm:3.0.0-alpha.1" peerDependencies: axios: ^0.26.0 cross-fetch: ^3.0.6 @@ -9582,7 +9643,7 @@ __metadata: uuid: ^8.2.0 webdav: 4.8.0 xml-js: ^1.6.11 - checksum: 566bbccd59e4cfbd6471942621e2f006c3337a3637b971492d7324913a37f4d3299deb9029546331cb0ec7e065efd6c4f9ba96a8f850c230d64e83dd9fc8c5db + checksum: 0e91758c3e7ba1fa72faf10a1e6a2a094776255dade51bbed42d44a9326918314f433405ebf147ad679b97c90abcdfd44e3170d2dd781ced26fa4937cc9f7a60 languageName: node linkType: hard @@ -10652,14 +10713,14 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^27.0.0, pretty-format@npm:^27.0.2, pretty-format@npm:^27.2.5, pretty-format@npm:^27.4.6, pretty-format@npm:^27.5.1": - version: 27.5.1 - resolution: "pretty-format@npm:27.5.1" +"pretty-format@npm:^27.0.0, pretty-format@npm:^27.0.2, pretty-format@npm:^27.2.5, pretty-format@npm:^27.4.6": + version: 27.4.6 + resolution: "pretty-format@npm:27.4.6" dependencies: ansi-regex: ^5.0.1 ansi-styles: ^5.0.0 react-is: ^17.0.1 - checksum: cf610cffcb793885d16f184a62162f2dd0df31642d9a18edf4ca298e909a8fe80bdbf556d5c9573992c102ce8bf948691da91bf9739bee0ffb6e79c8a8a6e088 + checksum: 5eda32e4e47ddd1a9e8fe9ebef519b217ba403eb8bcb804ba551dfb37f87e674472013fcf78480ab535844fdddcc706fac94511eba349bfb94a138a02d1a7a59 languageName: node linkType: hard @@ -11624,13 +11685,13 @@ __metadata: "@testing-library/jest-dom": ^5.16.1 "@testing-library/user-event": ^13.5.0 "@testing-library/vue": ^5.8.2 - "@types/jest": ^27.4.1 + "@types/jest": ^27.4.0 "@types/jest-axe": ^3.5.3 "@types/lodash-es": ^4.17.5 "@types/node": ^16.10.3 "@types/node-fetch": ^2.6.0 - "@typescript-eslint/eslint-plugin": ^5.14.0 - "@typescript-eslint/parser": ^5.14.0 + "@typescript-eslint/eslint-plugin": ^5.11.0 + "@typescript-eslint/parser": ^5.11.0 "@vue/test-utils": ^1.3.0 autoprefixer: ^10.4.2 babel-core: ^7.0.0-bridge.0 @@ -13389,12 +13450,12 @@ __metadata: languageName: node linkType: hard -"vue-select@npm:^3.18.3": - version: 3.18.3 - resolution: "vue-select@npm:3.18.3" +"vue-select@npm:^3.13.2": + version: 3.13.2 + resolution: "vue-select@npm:3.13.2" peerDependencies: vue: 2.x - checksum: 3dd04bd24023c1717e5fdd19467a49e4feb8cfcf724ec61948367ee5637b4e2068122e7fd19f1586c5dd4908d351d4d7bb45e485097d1d525e742bb085eb8749 + checksum: c62d17458c0c0deb9ff5084cee691391b70ed9f0dd3dd16126e2a8bd5fdcb63260bb900ac02bd601dfc3b6353cf6c2f80a2f32cbfbc04f87e32f4dc2c32bc952 languageName: node linkType: hard @@ -13539,8 +13600,8 @@ __metadata: luxon: ^2.3.0 marked: ^4.0.12 oidc-client: 1.11.5 - owncloud-design-system: ^13.0.0-rc.3 - owncloud-sdk: ~2.1.0-alpha.3 + owncloud-design-system: ^13.0.0-rc.2 + owncloud-sdk: ~3.0.0-alpha.1 p-queue: ^6.1.1 popper-max-size-modifier: ^0.2.0 portal-vue: ^2.1.7 @@ -13566,7 +13627,7 @@ __metadata: vue-resize: ^1.0.1 vue-router: ^3.5.3 vue-scrollto: ^2.15.0 - vue-select: ^3.18.3 + vue-select: ^3.13.2 vuex: ^3.6.2 vuex-extensions: ^1.1.5 vuex-persist: 3.1.3 From 230e1cd42314657fa456fed7109bf22afa719626 Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Mon, 14 Mar 2022 10:05:41 +0100 Subject: [PATCH 15/34] Adjustments after rebase --- .../src/services/folder/loaderTrashbin.ts | 9 ++-- .../src/views/spaces/Trashbin.vue | 48 +++---------------- .../spaces/__snapshots__/Project.spec.js.snap | 4 +- .../__snapshots__/Projects.spec.js.snap | 2 +- 4 files changed, 14 insertions(+), 49 deletions(-) diff --git a/packages/web-app-files/src/services/folder/loaderTrashbin.ts b/packages/web-app-files/src/services/folder/loaderTrashbin.ts index ccb56650e13..0d0d9e824e8 100644 --- a/packages/web-app-files/src/services/folder/loaderTrashbin.ts +++ b/packages/web-app-files/src/services/folder/loaderTrashbin.ts @@ -21,15 +21,16 @@ export class FolderLoaderTrashbin implements FolderLoader { public getTask(context: TaskContext): FolderLoaderTask { const { store, - clientService: { owncloudSdk: client } + clientService: { owncloudSdk: client }, + router } = context return useTask(function* (signal1, signal2, ref) { store.commit('Files/CLEAR_CURRENT_FILES_LIST') - const path = isLocationTrashActive(context.router, 'files-trash-spaces-project') - ? buildWebDavSpacesTrashPath(context.route.params.spaceId) - : buildWebDavFilesTrashPath(context.store.getters.user.id) + const path = isLocationTrashActive(router, 'files-trash-spaces-project') + ? buildWebDavSpacesTrashPath(router.currentRoute.params.spaceId) + : buildWebDavFilesTrashPath(store.getters.user.id) const resources = yield client.fileTrash.list(path, '1', DavProperties.Trashbin) store.commit('Files/LOAD_FILES', { diff --git a/packages/web-app-files/src/views/spaces/Trashbin.vue b/packages/web-app-files/src/views/spaces/Trashbin.vue index 705d6101dd4..d7aa06acea5 100644 --- a/packages/web-app-files/src/views/spaces/Trashbin.vue +++ b/packages/web-app-files/src/views/spaces/Trashbin.vue @@ -9,7 +9,7 @@ icon="delete-bin-5" > import { mapGetters, mapMutations, mapState } from 'vuex' -import { computed, unref } from '@vue/composition-api' -import ResourceTable, { determineSortFields } from '../../components/FilesList/ResourceTable.vue' +import ResourceTable from '../../components/FilesList/ResourceTable.vue' import MixinFilesListFilter from '../../mixins/filesListFilter' import MixinResources from '../../mixins/resources' import MixinMountSideBar from '../../mixins/sidebar/mountSideBar' -import { useFileListHeaderPosition, usePagination, useSort } from '../../composables' -import { useRouteQuery, useStore } from 'web-pkg/src/composables' import ListLoader from '../../components/FilesList/ListLoader.vue' import NoContentMessage from '../../components/FilesList/NoContentMessage.vue' import ListInfo from '../../components/FilesList/ListInfo.vue' import Pagination from '../../components/FilesList/Pagination.vue' import ContextActions from '../../components/FilesList/ContextActions.vue' -import { folderService } from '../../services/folder' +import { useResourcesViewDefaults } from '../../composables' import { bus } from 'web-pkg/src/instance' export default { @@ -69,41 +66,8 @@ export default { mixins: [MixinResources, MixinMountSideBar, MixinFilesListFilter], setup() { - const store = useStore() - const { refresh: refreshFileListHeaderPosition, y: fileListHeaderY } = - useFileListHeaderPosition() - - const storeItems = computed(() => store.getters['Files/activeFiles'] || []) - const fields = computed(() => { - return determineSortFields(unref(storeItems)[0]) - }) - - const { sortBy, sortDir, items, handleSort } = useSort({ - items: storeItems, - fields - }) - - const paginationPageQuery = useRouteQuery('page', '1') - const paginationPage = computed(() => parseInt(String(paginationPageQuery.value))) - const { items: paginatedResources, total: paginationPages } = usePagination({ - page: paginationPage, - items, - sortBy, - sortDir - }) - - const loadResourcesTask = folderService.getTask() - return { - fileListHeaderY, - refreshFileListHeaderPosition, - loadResourcesTask, - paginatedResources, - paginationPages, - paginationPage, - handleSort, - sortBy, - sortDir + ...useResourcesViewDefaults() } }, @@ -129,8 +93,8 @@ export default { created() { this.loadResourcesTask.perform(this) - const loadResourcesEventToken = bus.subscribe('app.files.list.load', () => { - this.loadResourcesTask.perform(this) + const loadResourcesEventToken = bus.subscribe('app.files.list.load', (path) => { + this.loadResourcesTask.perform(this, this.$route.params.item === path, path) }) this.$on('beforeDestroy', () => { diff --git a/packages/web-app-files/tests/unit/views/spaces/__snapshots__/Project.spec.js.snap b/packages/web-app-files/tests/unit/views/spaces/__snapshots__/Project.spec.js.snap index ea60d6aac2b..841f0824df1 100644 --- a/packages/web-app-files/tests/unit/views/spaces/__snapshots__/Project.spec.js.snap +++ b/packages/web-app-files/tests/unit/views/spaces/__snapshots__/Project.spec.js.snap @@ -19,7 +19,7 @@ exports[`Spaces project view space image should show if given 1`] = `
      • - Deleted Files + Deleted files
      • @@ -68,7 +68,7 @@ exports[`Spaces project view space readme should show if given 1`] = `
      • - Deleted Files + Deleted files
      • diff --git a/packages/web-app-files/tests/unit/views/spaces/__snapshots__/Projects.spec.js.snap b/packages/web-app-files/tests/unit/views/spaces/__snapshots__/Projects.spec.js.snap index 35e5c69a178..41eb8264c80 100644 --- a/packages/web-app-files/tests/unit/views/spaces/__snapshots__/Projects.spec.js.snap +++ b/packages/web-app-files/tests/unit/views/spaces/__snapshots__/Projects.spec.js.snap @@ -32,7 +32,7 @@ exports[`Spaces component should list spaces 1`] = `