Skip to content

Commit c73b63c

Browse files
committed
fix(files_sharing): Hide incompatible actions in pending and deleted share views
Pending and deleted share entries are not mounted into the user's filesystem, so generic file operations like delete, download, or rename cannot succeed and produce a misleading "file is not available" error. Affected actions now opt out of these views, leaving only accept and reject (pending) and restore (deleted) as available row operations.
1 parent 020c4e9 commit c73b63c

11 files changed

Lines changed: 48 additions & 6 deletions

File tree

apps/files/src/actions/convertAction.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,14 @@ export function registerConvertActions() {
3131
id: `convert-${from}-${to}`,
3232
displayName: () => t('files', 'Save as {displayName}', { displayName }),
3333
iconSvgInline: () => generateIconSvg(to),
34-
enabled: ({ nodes, folder }) => {
34+
enabled: ({ nodes, folder, view }) => {
3535
if (isPublicShare() && !(folder.permissions & Permission.CREATE)) {
3636
// cannot create the converted file in a public share if we don't have create permissions
3737
return false
3838
}
39+
if (view.id === 'pendingshares' || view.id === 'deletedshares') {
40+
return false
41+
}
3942
// Check that all nodes have the same mime type
4043
return nodes.every((node) => from === node.mime)
4144
},

apps/files/src/actions/deleteAction.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ export const action: IFileAction = {
3939
},
4040

4141
enabled({ nodes, view }) {
42+
if (view.id === 'pendingshares' || view.id === 'deletedshares') {
43+
return false
44+
}
45+
4246
if (view.id === TRASHBIN_VIEW_ID) {
4347
const config = loadState('files_trashbin', 'config', { allow_delete: true })
4448
if (config.allow_delete === false) {

apps/files/src/actions/downloadAction.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ export const action: IFileAction = {
2929
return false
3030
}
3131

32+
if (view.id === 'pendingshares' || view.id === 'deletedshares') {
33+
return false
34+
}
35+
3236
// We can only download dav files and folders.
3337
if (nodes.some((node) => !node.isDavResource)) {
3438
return false

apps/files/src/actions/favoriteAction.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,16 @@ export const action: IFileAction = {
3535
: StarSvg
3636
},
3737

38-
enabled({ nodes }) {
38+
enabled({ nodes, view }) {
3939
// Not enabled for public shares
4040
if (isPublicShare()) {
4141
return false
4242
}
4343

44+
if (view.id === 'pendingshares' || view.id === 'deletedshares') {
45+
return false
46+
}
47+
4448
// We can only favorite nodes if they are located in files
4549
return nodes.every((node) => node.root?.startsWith?.('/files'))
4650
// and we have permissions

apps/files/src/actions/moveOrCopyAction.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ export const action: IFileAction = {
4949
if (view.id === 'public-file-share') {
5050
return false
5151
}
52+
if (view.id === 'pendingshares' || view.id === 'deletedshares') {
53+
return false
54+
}
5255
// We only support moving/copying files within the user folder
5356
if (!nodes.every((node) => node.root?.startsWith('/files/'))) {
5457
return false

apps/files/src/actions/openFolderAction.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,16 @@ export const action: IFileAction = {
2222
},
2323
iconSvgInline: () => FolderSvg,
2424

25-
enabled({ nodes }) {
25+
enabled({ nodes, view }) {
2626
// Only works on single node
2727
if (nodes.length !== 1 || !nodes[0]) {
2828
return false
2929
}
3030

31+
if (view.id === 'pendingshares' || view.id === 'deletedshares') {
32+
return false
33+
}
34+
3135
const node = nodes[0]
3236
if (!node.isDavResource) {
3337
return false

apps/files/src/actions/openLocallyAction.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export const action: IFileAction = {
2323
iconSvgInline: () => LaptopSvg,
2424

2525
// Only works on single files
26-
enabled({ nodes }) {
26+
enabled({ nodes, view }) {
2727
// Only works on single node
2828
if (nodes.length !== 1 || !nodes[0]) {
2929
return false
@@ -34,6 +34,10 @@ export const action: IFileAction = {
3434
return false
3535
}
3636

37+
if (view.id === 'pendingshares' || view.id === 'deletedshares') {
38+
return false
39+
}
40+
3741
return isSyncable(nodes[0]!)
3842
},
3943

apps/files/src/actions/renameAction.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ export const action: IFileAction = {
3030
return false
3131
}
3232

33+
if (view.id === 'pendingshares' || view.id === 'deletedshares') {
34+
return false
35+
}
36+
3337
const node = nodes[0]
3438
const filesStore = useFilesStore(getPinia())
3539
const parentNode = node.dirname === '/'

apps/files/src/actions/sidebarAction.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export const action: IFileAction = {
1919
iconSvgInline: () => InformationSvg,
2020

2121
// Sidebar currently supports user folder only, /files/USER
22-
enabled: ({ nodes }) => {
22+
enabled: ({ nodes, view }) => {
2323
const node = nodes[0]
2424
if (nodes.length !== 1 || !node) {
2525
return false
@@ -34,6 +34,10 @@ export const action: IFileAction = {
3434
return false
3535
}
3636

37+
if (view.id === 'pendingshares' || view.id === 'deletedshares') {
38+
return false
39+
}
40+
3741
return node.root.startsWith('/files/') && node.permissions !== Permission.NONE
3842
},
3943

apps/files/src/actions/viewInFolderAction.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ export const action: IFileAction = {
2828
return false
2929
}
3030

31+
if (view.id === 'pendingshares' || view.id === 'deletedshares') {
32+
return false
33+
}
34+
3135
// Only works on single node
3236
if (nodes.length !== 1 || !nodes[0]) {
3337
return false

0 commit comments

Comments
 (0)