feat(files): hide "Personal files" and "Shared with others" views if user has no quota

Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
pull/51698/head
skjnldsv 2025-03-25 15:44:17 +07:00 committed by Ferdinand Thiessen
parent efa5632bba
commit baeff57232
3 changed files with 48 additions and 13 deletions

@ -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',

@ -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', () => {

@ -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,