aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorskjnldsv <skjnldsv@protonmail.com>2025-03-25 15:44:17 +0100
committerskjnldsv <skjnldsv@protonmail.com>2025-03-25 15:46:05 +0100
commit540576b16959f5d86b7fb921c39077757d16d55c (patch)
treeb4b33c7bfcf3b3201d982c65c860f2ca2384722b
parentd1383602c767bd925c00b7642d062c06aa4012a3 (diff)
downloadnextcloud-server-fix/quota-view-files.tar.gz
nextcloud-server-fix/quota-view-files.zip
feat(files): hide "Personal files" and "Shared with others" views if user has no quotafix/quota-view-files
Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
-rw-r--r--apps/files/src/views/personal-files.ts7
-rw-r--r--apps/files_sharing/src/files_views/shares.spec.ts25
-rw-r--r--apps/files_sharing/src/files_views/shares.ts29
3 files changed, 48 insertions, 13 deletions
diff --git a/apps/files/src/views/personal-files.ts b/apps/files/src/views/personal-files.ts
index 027a6cc7c56..66d4e77b376 100644
--- a/apps/files/src/views/personal-files.ts
+++ b/apps/files/src/views/personal-files.ts
@@ -7,8 +7,15 @@ import { View, getNavigation } from '@nextcloud/files'
import { getContents } from '../services/PersonalFiles'
import AccountIcon from '@mdi/svg/svg/account.svg?raw'
+import { loadState } from '@nextcloud/initial-state'
export default () => {
+ // Don't show this view if the user has no storage quota
+ const storageStats = loadState('files', 'storageStats', { quota: -1 })
+ if (storageStats.quota === 0) {
+ return
+ }
+
const Navigation = getNavigation()
Navigation.register(new View({
id: 'personal',
diff --git a/apps/files_sharing/src/files_views/shares.spec.ts b/apps/files_sharing/src/files_views/shares.spec.ts
index 79ef2a09843..7e5b59e0ad9 100644
--- a/apps/files_sharing/src/files_views/shares.spec.ts
+++ b/apps/files_sharing/src/files_views/shares.spec.ts
@@ -5,8 +5,10 @@
/* eslint-disable n/no-extraneous-import */
/* eslint-disable @typescript-eslint/no-explicit-any */
import type { OCSResponse } from '@nextcloud/typings/ocs'
-import { Folder, Navigation, View, getNavigation } from '@nextcloud/files'
+
import { beforeEach, describe, expect, test, vi } from 'vitest'
+import { Folder, Navigation, View, getNavigation } from '@nextcloud/files'
+import * as ncInitialState from '@nextcloud/initial-state'
import axios from '@nextcloud/axios'
import '../main'
@@ -72,6 +74,27 @@ describe('Sharing views definition', () => {
expect(view?.getContents).toBeDefined()
})
})
+
+ test('Shared with others view is not registered if user has no storage quota', () => {
+ vi.spyOn(Navigation, 'register')
+ const spy = vi.spyOn(ncInitialState, 'loadState').mockImplementationOnce(() => ({ quota: 0 }))
+
+ expect(Navigation.views.length).toBe(0)
+ registerSharingViews()
+ expect(Navigation.register).toHaveBeenCalledTimes(6)
+ expect(Navigation.views.length).toBe(6)
+
+ const shareOverviewView = Navigation.views.find(view => view.id === 'shareoverview') as View
+ const sharesChildViews = Navigation.views.filter(view => view.parent === 'shareoverview') as View[]
+ expect(shareOverviewView).toBeDefined()
+ expect(sharesChildViews.length).toBe(5)
+
+ expect(spy).toHaveBeenCalled()
+ expect(spy).toHaveBeenCalledWith('files', 'storageStats', { quota: -1 })
+
+ const sharedWithOthersView = Navigation.views.find(view => view.id === 'sharingout')
+ expect(sharedWithOthersView).toBeUndefined()
+ })
})
describe('Sharing views contents', () => {
diff --git a/apps/files_sharing/src/files_views/shares.ts b/apps/files_sharing/src/files_views/shares.ts
index 7aec0dbeafb..297fd4796fd 100644
--- a/apps/files_sharing/src/files_views/shares.ts
+++ b/apps/files_sharing/src/files_views/shares.ts
@@ -14,6 +14,7 @@ import FileUploadSvg from '@mdi/svg/svg/file-upload.svg?raw'
import LinkSvg from '@mdi/svg/svg/link.svg?raw'
import { getContents, isFileRequest } from '../services/SharingService'
+import { loadState } from '@nextcloud/initial-state'
export const sharesViewId = 'shareoverview'
export const sharedWithYouViewId = 'sharingin'
@@ -58,22 +59,26 @@ export default () => {
getContents: () => getContents(true, false, false, false),
}))
- Navigation.register(new View({
- id: sharedWithOthersViewId,
- name: t('files_sharing', 'Shared with others'),
- caption: t('files_sharing', 'List of files that you shared with others.'),
+ // Don't show this view if the user has no storage quota
+ const storageStats = loadState('files', 'storageStats', { quota: -1 })
+ if (storageStats.quota !== 0) {
+ Navigation.register(new View({
+ id: sharedWithOthersViewId,
+ name: t('files_sharing', 'Shared with others'),
+ caption: t('files_sharing', 'List of files that you shared with others.'),
- emptyTitle: t('files_sharing', 'Nothing shared yet'),
- emptyCaption: t('files_sharing', 'Files and folders you shared will show up here'),
+ emptyTitle: t('files_sharing', 'Nothing shared yet'),
+ emptyCaption: t('files_sharing', 'Files and folders you shared will show up here'),
- icon: AccountGroupSvg,
- order: 2,
- parent: sharesViewId,
+ icon: AccountGroupSvg,
+ order: 2,
+ parent: sharesViewId,
- columns: [],
+ columns: [],
- getContents: () => getContents(false, true, false, false),
- }))
+ getContents: () => getContents(false, true, false, false),
+ }))
+ }
Navigation.register(new View({
id: sharingByLinksViewId,