aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files
diff options
context:
space:
mode:
authorprovokateurin <kate@provokateurin.de>2025-01-07 17:02:43 +0100
committerprovokateurin <kate@provokateurin.de>2025-01-13 15:19:19 +0100
commit31c21c779723fb6efbe6aa89b2093091c5d3e187 (patch)
tree08907a7eb60d849ec9ae72d0d894d0be8496b4c6 /apps/files
parent26fa4da8c2fe461dd73fd92a5c593eecfc6605e5 (diff)
downloadnextcloud-server-31c21c779723fb6efbe6aa89b2093091c5d3e187.tar.gz
nextcloud-server-31c21c779723fb6efbe6aa89b2093091c5d3e187.zip
feat(files_trashbin): Allow preventing trash to be deleted permanently
Signed-off-by: provokateurin <kate@provokateurin.de>
Diffstat (limited to 'apps/files')
-rw-r--r--apps/files/src/actions/deleteAction.spec.ts25
-rw-r--r--apps/files/src/actions/deleteAction.ts8
-rw-r--r--apps/files/src/services/HotKeysService.spec.ts16
3 files changed, 48 insertions, 1 deletions
diff --git a/apps/files/src/actions/deleteAction.spec.ts b/apps/files/src/actions/deleteAction.spec.ts
index 224b196d364..4ed625b2412 100644
--- a/apps/files/src/actions/deleteAction.spec.ts
+++ b/apps/files/src/actions/deleteAction.spec.ts
@@ -127,6 +127,22 @@ describe('Delete action conditions tests', () => {
})
describe('Delete action enabled tests', () => {
+ let initialState: HTMLInputElement
+
+ afterEach(() => {
+ document.body.removeChild(initialState)
+ })
+
+ beforeEach(() => {
+ initialState = document.createElement('input')
+ initialState.setAttribute('type', 'hidden')
+ initialState.setAttribute('id', 'initial-state-files_trashbin-config')
+ initialState.setAttribute('value', btoa(JSON.stringify({
+ allow_delete: true,
+ })))
+ document.body.appendChild(initialState)
+ })
+
test('Enabled with DELETE permissions', () => {
const file = new File({
id: 1,
@@ -177,6 +193,15 @@ describe('Delete action enabled tests', () => {
expect(action.enabled!([folder2], view)).toBe(false)
expect(action.enabled!([folder1, folder2], view)).toBe(false)
})
+
+ test('Disabled if not allowed', () => {
+ initialState.setAttribute('value', btoa(JSON.stringify({
+ allow_delete: false,
+ })))
+
+ expect(action.enabled).toBeDefined()
+ expect(action.enabled!([], view)).toBe(false)
+ })
})
describe('Delete action execute tests', () => {
diff --git a/apps/files/src/actions/deleteAction.ts b/apps/files/src/actions/deleteAction.ts
index 8d8aa4f9deb..8b3f45196e9 100644
--- a/apps/files/src/actions/deleteAction.ts
+++ b/apps/files/src/actions/deleteAction.ts
@@ -2,6 +2,9 @@
* SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+import type { FilesTrashbinConfigState } from '../../../files_trashbin/src/fileListActions/emptyTrashAction.ts'
+
+import { loadState } from '@nextcloud/initial-state'
import { Permission, Node, View, FileAction } from '@nextcloud/files'
import { showInfo } from '@nextcloud/dialogs'
import { translate as t } from '@nextcloud/l10n'
@@ -34,6 +37,11 @@ export const action = new FileAction({
},
enabled(nodes: Node[]) {
+ const config = loadState<FilesTrashbinConfigState>('files_trashbin', 'config')
+ if (!config.allow_delete) {
+ return false
+ }
+
return nodes.length > 0 && nodes
.map(node => node.permissions)
.every(permission => (permission & Permission.DELETE) !== 0)
diff --git a/apps/files/src/services/HotKeysService.spec.ts b/apps/files/src/services/HotKeysService.spec.ts
index dfe9f66601b..3bfdac0bc32 100644
--- a/apps/files/src/services/HotKeysService.spec.ts
+++ b/apps/files/src/services/HotKeysService.spec.ts
@@ -2,7 +2,7 @@
* SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-import { describe, it, vi, expect, beforeEach, beforeAll } from 'vitest'
+import { describe, it, vi, expect, beforeEach, beforeAll, afterEach } from 'vitest'
import { File, Permission, View } from '@nextcloud/files'
import axios from '@nextcloud/axios'
@@ -33,6 +33,12 @@ describe('HotKeysService testing', () => {
const goToRouteMock = vi.fn()
+ let initialState: HTMLInputElement
+
+ afterEach(() => {
+ document.body.removeChild(initialState)
+ })
+
beforeAll(() => {
registerHotkeys()
})
@@ -57,6 +63,14 @@ describe('HotKeysService testing', () => {
window.OCA = { Files: { Sidebar: { open: () => {}, setActiveTab: () => {} } } }
// @ts-expect-error We only mock what needed, we do not need Files.Router.goTo or Files.Navigation
window.OCP = { Files: { Router: { goToRoute: goToRouteMock, params: {}, query: {} } } }
+
+ initialState = document.createElement('input')
+ initialState.setAttribute('type', 'hidden')
+ initialState.setAttribute('id', 'initial-state-files_trashbin-config')
+ initialState.setAttribute('value', btoa(JSON.stringify({
+ allow_delete: true,
+ })))
+ document.body.appendChild(initialState)
})
it('Pressing d should open the sidebar once', () => {