Merge pull request #47135 from nextcloud/fix/open-tags-in-folder
fix(systemtags): Sub folders should be opened in filespull/47156/head
commit
4591c188e6
@ -0,0 +1,123 @@
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
import { action } from './openInFilesAction'
|
||||
import { expect } from '@jest/globals'
|
||||
import { File, Folder, Permission, View, DefaultType, FileAction } from '@nextcloud/files'
|
||||
|
||||
const view = {
|
||||
id: 'files',
|
||||
name: 'Files',
|
||||
} as View
|
||||
|
||||
const systemTagsView = {
|
||||
id: 'tags',
|
||||
name: 'tags',
|
||||
} as View
|
||||
|
||||
const validNode = new Folder({
|
||||
id: 1,
|
||||
source: 'https://cloud.domain.com/remote.php/dav/files/admin/foo',
|
||||
owner: 'admin',
|
||||
mime: 'httpd/unix-directory',
|
||||
root: '/files/admin',
|
||||
permissions: Permission.ALL,
|
||||
})
|
||||
|
||||
const validTag = new Folder({
|
||||
id: 1,
|
||||
source: 'https://cloud.domain.com/remote.php/dav/systemtags/2',
|
||||
displayname: 'Foo',
|
||||
owner: 'admin',
|
||||
mime: 'httpd/unix-directory',
|
||||
root: '/systemtags',
|
||||
permissions: Permission.ALL,
|
||||
attributes: {
|
||||
'is-tag': true,
|
||||
},
|
||||
})
|
||||
|
||||
describe('Open in files action conditions tests', () => {
|
||||
test('Default values', () => {
|
||||
expect(action).toBeInstanceOf(FileAction)
|
||||
expect(action.id).toBe('systemtags:open-in-files')
|
||||
expect(action.displayName([], systemTagsView)).toBe('Open in Files')
|
||||
expect(action.iconSvgInline([], systemTagsView)).toBe('')
|
||||
expect(action.default).toBe(DefaultType.HIDDEN)
|
||||
expect(action.order).toBe(-1000)
|
||||
expect(action.inline).toBeUndefined()
|
||||
})
|
||||
})
|
||||
|
||||
describe('Open in files action enabled tests', () => {
|
||||
test('Enabled with on valid view', () => {
|
||||
expect(action.enabled).toBeDefined()
|
||||
expect(action.enabled!([validNode], systemTagsView)).toBe(true)
|
||||
})
|
||||
|
||||
test('Disabled on wrong view', () => {
|
||||
expect(action.enabled).toBeDefined()
|
||||
expect(action.enabled!([validNode], view)).toBe(false)
|
||||
})
|
||||
|
||||
test('Disabled without nodes', () => {
|
||||
expect(action.enabled).toBeDefined()
|
||||
expect(action.enabled!([], view)).toBe(false)
|
||||
})
|
||||
|
||||
test('Disabled with too many nodes', () => {
|
||||
expect(action.enabled).toBeDefined()
|
||||
expect(action.enabled!([validNode, validNode], view)).toBe(false)
|
||||
})
|
||||
|
||||
test('Disabled with when node is a tag', () => {
|
||||
expect(action.enabled).toBeDefined()
|
||||
expect(action.enabled!([validTag], view)).toBe(false)
|
||||
})
|
||||
})
|
||||
|
||||
describe('Open in files action execute tests', () => {
|
||||
test('Open in files', async () => {
|
||||
const goToRouteMock = jest.fn()
|
||||
// @ts-expect-error We only mock what needed, we do not need Files.Router.goTo or Files.Navigation
|
||||
window.OCP = { Files: { Router: { goToRoute: goToRouteMock } } }
|
||||
|
||||
const file = new File({
|
||||
id: 1,
|
||||
source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo/foobar.txt',
|
||||
owner: 'admin',
|
||||
mime: 'text/plain',
|
||||
root: '/files/admin',
|
||||
permissions: Permission.ALL,
|
||||
})
|
||||
|
||||
const exec = await action.exec(file, view, '/')
|
||||
|
||||
// Silent action
|
||||
expect(exec).toBe(null)
|
||||
expect(goToRouteMock).toBeCalledTimes(1)
|
||||
expect(goToRouteMock).toBeCalledWith(null, { fileid: '1', view: 'files' }, { dir: '/Foo', openfile: 'true' })
|
||||
})
|
||||
|
||||
test('Open in files with folder', async () => {
|
||||
const goToRouteMock = jest.fn()
|
||||
// @ts-expect-error We only mock what needed, we do not need Files.Router.goTo or Files.Navigation
|
||||
window.OCP = { Files: { Router: { goToRoute: goToRouteMock } } }
|
||||
|
||||
const file = new Folder({
|
||||
id: 1,
|
||||
source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo/Bar',
|
||||
owner: 'admin',
|
||||
root: '/files/admin',
|
||||
permissions: Permission.ALL,
|
||||
})
|
||||
|
||||
const exec = await action.exec(file, view, '/')
|
||||
|
||||
// Silent action
|
||||
expect(exec).toBe(null)
|
||||
expect(goToRouteMock).toBeCalledTimes(1)
|
||||
expect(goToRouteMock).toBeCalledWith(null, { fileid: '1', view: 'files' }, { dir: '/Foo/Bar', openfile: 'true' })
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,44 @@
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
import { translate as t } from '@nextcloud/l10n'
|
||||
import { type Node, FileType, FileAction, DefaultType } from '@nextcloud/files'
|
||||
|
||||
export const action = new FileAction({
|
||||
id: 'systemtags:open-in-files',
|
||||
displayName: () => t('systemtags', 'Open in Files'),
|
||||
iconSvgInline: () => '',
|
||||
|
||||
enabled(nodes, view) {
|
||||
// Only for the system tags view
|
||||
if (view.id !== 'tags') {
|
||||
return false
|
||||
}
|
||||
// Only for single nodes
|
||||
if (nodes.length !== 1) {
|
||||
return false
|
||||
}
|
||||
// Do not open tags (keep the default action) and only open folders
|
||||
return nodes[0].attributes['is-tag'] !== true
|
||||
&& nodes[0].type === FileType.Folder
|
||||
},
|
||||
|
||||
async exec(node: Node) {
|
||||
let dir = node.dirname
|
||||
if (node.type === FileType.Folder) {
|
||||
dir = node.path
|
||||
}
|
||||
|
||||
window.OCP.Files.Router.goToRoute(
|
||||
null, // use default route
|
||||
{ view: 'files', fileid: String(node.fileid) },
|
||||
{ dir, openfile: 'true' },
|
||||
)
|
||||
return null
|
||||
},
|
||||
|
||||
// Before openFolderAction
|
||||
order: -1000,
|
||||
default: DefaultType.HIDDEN,
|
||||
})
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue