aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files_sharing/src/files_views/shares.ts
diff options
context:
space:
mode:
Diffstat (limited to 'apps/files_sharing/src/files_views/shares.ts')
-rw-r--r--apps/files_sharing/src/files_views/shares.ts156
1 files changed, 156 insertions, 0 deletions
diff --git a/apps/files_sharing/src/files_views/shares.ts b/apps/files_sharing/src/files_views/shares.ts
new file mode 100644
index 00000000000..fd5e908638c
--- /dev/null
+++ b/apps/files_sharing/src/files_views/shares.ts
@@ -0,0 +1,156 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { translate as t } from '@nextcloud/l10n'
+import { View, getNavigation } from '@nextcloud/files'
+import { ShareType } from '@nextcloud/sharing'
+import AccountClockSvg from '@mdi/svg/svg/account-clock.svg?raw'
+import AccountGroupSvg from '@mdi/svg/svg/account-group-outline.svg?raw'
+import AccountPlusSvg from '@mdi/svg/svg/account-plus-outline.svg?raw'
+import AccountSvg from '@mdi/svg/svg/account.svg?raw'
+import DeleteSvg from '@mdi/svg/svg/delete.svg?raw'
+import FileUploadSvg from '@mdi/svg/svg/file-upload-outline.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'
+export const sharedWithOthersViewId = 'sharingout'
+export const sharingByLinksViewId = 'sharinglinks'
+export const deletedSharesViewId = 'deletedshares'
+export const pendingSharesViewId = 'pendingshares'
+export const fileRequestViewId = 'filerequest'
+
+export default () => {
+ const Navigation = getNavigation()
+ Navigation.register(new View({
+ id: sharesViewId,
+ name: t('files_sharing', 'Shares'),
+ caption: t('files_sharing', 'Overview of shared files.'),
+
+ emptyTitle: t('files_sharing', 'No shares'),
+ emptyCaption: t('files_sharing', 'Files and folders you shared or have been shared with you will show up here'),
+
+ icon: AccountPlusSvg,
+ order: 20,
+
+ columns: [],
+
+ getContents: () => getContents(),
+ }))
+
+ Navigation.register(new View({
+ id: sharedWithYouViewId,
+ name: t('files_sharing', 'Shared with you'),
+ caption: t('files_sharing', 'List of files that are shared with you.'),
+
+ emptyTitle: t('files_sharing', 'Nothing shared with you yet'),
+ emptyCaption: t('files_sharing', 'Files and folders others shared with you will show up here'),
+
+ icon: AccountSvg,
+ order: 1,
+ parent: sharesViewId,
+
+ columns: [],
+
+ getContents: () => getContents(true, false, false, false),
+ }))
+
+ // 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'),
+
+ icon: AccountGroupSvg,
+ order: 2,
+ parent: sharesViewId,
+
+ columns: [],
+
+ getContents: () => getContents(false, true, false, false),
+ }))
+ }
+
+ Navigation.register(new View({
+ id: sharingByLinksViewId,
+ name: t('files_sharing', 'Shared by link'),
+ caption: t('files_sharing', 'List of files that are shared by link.'),
+
+ emptyTitle: t('files_sharing', 'No shared links'),
+ emptyCaption: t('files_sharing', 'Files and folders you shared by link will show up here'),
+
+ icon: LinkSvg,
+ order: 3,
+ parent: sharesViewId,
+
+ columns: [],
+
+ getContents: () => getContents(false, true, false, false, [ShareType.Link]),
+ }))
+
+ Navigation.register(new View({
+ id: fileRequestViewId,
+ name: t('files_sharing', 'File requests'),
+ caption: t('files_sharing', 'List of file requests.'),
+
+ emptyTitle: t('files_sharing', 'No file requests'),
+ emptyCaption: t('files_sharing', 'File requests you have created will show up here'),
+
+ icon: FileUploadSvg,
+ order: 4,
+ parent: sharesViewId,
+
+ columns: [],
+
+ getContents: () => getContents(false, true, false, false, [ShareType.Link, ShareType.Email])
+ .then(({ folder, contents }) => {
+ return {
+ folder,
+ contents: contents.filter((node) => isFileRequest(node.attributes?.['share-attributes'] || [])),
+ }
+ }),
+ }))
+
+ Navigation.register(new View({
+ id: deletedSharesViewId,
+ name: t('files_sharing', 'Deleted shares'),
+ caption: t('files_sharing', 'List of shares you left.'),
+
+ emptyTitle: t('files_sharing', 'No deleted shares'),
+ emptyCaption: t('files_sharing', 'Shares you have left will show up here'),
+
+ icon: DeleteSvg,
+ order: 5,
+ parent: sharesViewId,
+
+ columns: [],
+
+ getContents: () => getContents(false, false, false, true),
+ }))
+
+ Navigation.register(new View({
+ id: pendingSharesViewId,
+ name: t('files_sharing', 'Pending shares'),
+ caption: t('files_sharing', 'List of unapproved shares.'),
+
+ emptyTitle: t('files_sharing', 'No pending shares'),
+ emptyCaption: t('files_sharing', 'Shares you have received but not approved will show up here'),
+
+ icon: AccountClockSvg,
+ order: 6,
+ parent: sharesViewId,
+
+ columns: [],
+
+ getContents: () => getContents(false, false, true, false),
+ }))
+}