fix: workspace with alternative file names

Signed-off-by: Max <max@nextcloud.com>
This commit is contained in:
Max 2022-02-22 04:15:39 +01:00
Родитель 7782f4ddfb
Коммит d3315bf32a
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 0F5BFA367A00BACE
14 изменённых файлов: 109 добавлений и 32 удалений

Просмотреть файл

@ -32,10 +32,9 @@ describe('Workspace', function() {
beforeEach(function() {
cy.login(randUser, 'password')
cy.visit('/apps/files')
// isolate tests - each happens in it's own folder
cy.createFolder(Cypress.currentTest.title)
cy.openFile(Cypress.currentTest.title)
cy.visit(`apps/files?dir=/${encodeURIComponent(Cypress.currentTest.title)}`)
})
it('adds a Readme.md', function() {
@ -105,6 +104,31 @@ describe('Workspace', function() {
})
})
it('takes README.md into account', function() {
cy.uploadFile('test.md', 'text/markdown', `${Cypress.currentTest.title}/README.md`)
cy.reload()
cy.get('#fileList').should('contain', 'README.md')
cy.get('#rich-workspace .ProseMirror')
.should('contain', 'Hello world')
})
it('takes localized file name into account', function() {
cy.nextcloudUpdateUser(randUser, 'password', 'language', 'de_DE')
cy.uploadFile('test.md', 'text/markdown', `${Cypress.currentTest.title}/Anleitung.md`)
cy.reload()
cy.get('#fileList').should('contain', 'Anleitung.md')
cy.get('#rich-workspace .ProseMirror')
.should('contain', 'Hello world')
})
it('ignores localized file name in other language', function() {
cy.nextcloudUpdateUser(randUser, 'password', 'language', 'fr')
cy.uploadFile('test.md', 'text/markdown', `${Cypress.currentTest.title}/Anleitung.md`)
cy.reload()
cy.get('#fileList').should('contain', 'Anleitung.md')
cy.get('.empty-workspace').should('contain', 'Ajoutez des notes, listes ou liens')
})
})
const menuButton = (name) => {

Просмотреть файл

@ -62,6 +62,22 @@ Cypress.Commands.add('nextcloudCreateUser', (user, password) => {
})
})
Cypress.Commands.add('nextcloudUpdateUser', (user, password, key, value) => {
cy.request({
method: 'PUT',
url: `${Cypress.env('baseUrl')}/ocs/v2.php/cloud/users/${user}`,
form: true,
body: { key, value },
auth: { user, pass: password },
headers: {
'OCS-ApiRequest': 'true',
'Content-Type': 'application/x-www-form-urlencoded',
}
}).then(response => {
cy.log(`Updated user ${user} ${key} to ${value}`, response.status)
})
})
Cypress.Commands.add('nextcloudDeleteUser', (user) => {
cy.clearCookies()
cy.request({
@ -100,11 +116,9 @@ Cypress.Commands.add('uploadFile', (fileName, mimeType, target) => {
})
Cypress.Commands.add('createFolder', dirName => {
cy.get('#controls .actions > .button.new').click()
cy.get('#controls .actions .newFileMenu a[data-action="folder"]').click()
cy.get('#controls .actions .newFileMenu a[data-action="folder"] input[type="text"]').type(dirName)
cy.get('#controls .actions .newFileMenu a[data-action="folder"] input.icon-confirm').click()
cy.log('Created folder', dirName)
cy.window().then( win => {
win.OC.Files.getClient().createDirectory(dirName)
})
})
Cypress.Commands.add('openFile', fileName => {

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -41,6 +41,7 @@ use Sabre\DAV\ServerPlugin;
class WorkspacePlugin extends ServerPlugin {
public const WORKSPACE_PROPERTY = '{http://nextcloud.org/ns}rich-workspace';
public const WORKSPACE_FILE_PROPERTY = '{http://nextcloud.org/ns}rich-workspace-file';
/** @var Server */
private $server;
@ -112,6 +113,22 @@ class WorkspacePlugin extends ServerPlugin {
}
return '';
});
$propFind->handle(self::WORKSPACE_FILE_PROPERTY, function () use ($node) {
/** @var Folder[] $nodes */
$nodes = $this->rootFolder->getUserFolder($this->userId)->getById($node->getId());
if (count($nodes) > 0) {
/** @var File $file */
try {
$file = $this->workspaceService->getFile($nodes[0]);
if ($file instanceof File) {
return $file->getFileInfo()->getName();
}
} catch (StorageNotAvailableException $e) {
// If a storage is not available we can for the propfind response assume that there is no rich workspace present
}
}
return '';
});
}
}
}

Просмотреть файл

@ -151,20 +151,42 @@ const FilesWorkspacePlugin = {
priority: 10,
})
fileList.filesClient.addFileInfoParser((_response, data) => {
const dir = (data.mimetype === 'httpd/unix-directory')
? data.path + (data.path.endsWith('/') ? '' : '/') + data.name
: data.path
if (dir !== fileList.getCurrentDirectory()) {
return
}
const PROPERTY_WORKSPACE_FILE = `{${OC.Files.Client.NS_NEXTCLOUD}}rich-workspace-file`
const oldGetWebdavProperties = fileList._getWebdavProperties
fileList._getWebdavProperties = function() {
return [
...oldGetWebdavProperties.apply(this, arguments),
PROPERTY_WORKSPACE_FILE,
]
}
let filename = null
fileList.filesClient.addFileInfoParser((response, data) => {
if (data.mimetype === 'httpd/unix-directory') {
this.vm.folder = { ...data }
const props = response.propStat[0].properties
filename = props[PROPERTY_WORKSPACE_FILE]
const dir = (data.mimetype === 'httpd/unix-directory')
? data.path + (data.path.endsWith('/') ? '' : '/') + data.name
: data.path
if (dir === fileList.getCurrentDirectory()) {
this.vm.folder = {
...data,
}
}
}
if (data.mimetype === 'text/markdown' && data.name === 'Readme.md') {
this.vm.file = { ...data }
if (data.mimetype === 'text/markdown') {
const name = filename || 'Readme.md'
if (data.name === name) {
this.vm.file = {
...data,
id: parseInt(data.id),
}
}
}
})
},
render(fileList) {