Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 18 additions & 35 deletions cypress/e2e/new.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
* SPDX-FileCopyrightText: 2023 Julius Härtl <[email protected]>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
// FIXME: Re-renable once 28 has file creation again working
describe.skip('Create new office files', function() {

describe('New file menu', function() {

let randUser
before(function() {
Expand All @@ -18,51 +18,34 @@ describe.skip('Create new office files', function() {
})

it('Shows create file entries', function() {
cy.get('.files-controls .button.new')
cy.get('form[data-cy-upload-picker=""]')
.should('be.visible')
.click()

cy.get('.newFileMenu', { timeout: 10000 })
.should('be.visible')
.contains('.menuitem', 'New document')
cy.get('button[role="menuitem"]')
.contains('New document')
.should('be.visible')
.find('.icon')
.should('have.css', 'background-image')

cy.get('.files-controls .button.new')
cy.get('form[data-cy-upload-picker=""]')
.click()

cy.get('.newFileMenu', { timeout: 10000 })
cy.get('li[data-cy-upload-picker-menu-entry="upload-file"]')
.should('not.be.visible')
})

const newFileTypeLabels = [
'document', 'spreadsheet', 'presentation', 'diagram',
]
newFileTypeLabels.forEach((filetype) => {
it('Create empty ' + filetype + ' file', function() {
cy.get('.files-controls .button.new')
.should('be.visible')
.click()

cy.get('.newFileMenu', { timeout: 10000 })
.should('be.visible')
.contains('.menuitem', 'New ' + filetype)
.as('menuitem')
.should('be.visible')
.click()

cy.get('@menuitem').find('.filenameform input[type=text]').type('MyNewFile')
cy.get('@menuitem').find('.filenameform .icon-confirm').click()

cy.waitForViewer()
cy.waitForCollabora()
describe('Creates a new file', function() {
const newFileTypeLabels = [
'document', 'spreadsheet', 'presentation', 'diagram',
]
newFileTypeLabels.forEach((filetype) => {
it('Create empty ' + filetype + ' file', function() {
cy.newFileFromMenu(filetype, 'MyNewFile')
cy.waitForViewer()
cy.waitForCollabora()

cy.screenshot('new-file-' + filetype)
cy.screenshot('new-file-' + filetype)

cy.get('@loleafletframe').within(() => {
cy.get('#closebutton').click()
cy.waitForViewerClose()
cy.closeDocument()
})
})
})
Expand Down
33 changes: 32 additions & 1 deletion cypress/e2e/share-link.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { randHash } from '../utils/index.js'
const shareOwner = new User(randHash(), randHash())
const otherUser = new User(randHash(), randHash())

describe.skip('Public sharing of office documents', () => {
describe('Public sharing of office documents', () => {
before(function() {
cy.nextcloudTestingAppConfigSet('richdocuments', 'doc_format', '')
cy.createUser(shareOwner)
Expand Down Expand Up @@ -105,6 +105,37 @@ describe.skip('Public sharing of office documents', () => {
})
})
})

describe('New file', () => {
before(() => {
cy.createFolder(shareOwner, '/Shared-Folder')
cy.createFolder(shareOwner, '/Shared-Folder/Subfolder')
})

it('Creates a new file in a public share as a guest', () => {
cy.shareLink(shareOwner, '/Shared-Folder', { permissions: 13 }).then((token) => {
cy.logout()

cy.visit(`/s/${token}`, {
onBeforeLoad(win) {
cy.spy(win, 'postMessage').as('postMessage')
},
})

cy.get('tr[data-cy-files-list-row-name="Subfolder"]')
.should('be.visible')
.click()

cy.newFileFromMenu('document', 'MyNewFile')
waitForCollabora()

// Make sure the document is still in the correct subfolder
cy.reload()
cy.get('tr[data-cy-files-list-row-name="MyNewFile.odt"]')
.should('be.visible')
})
})
})
})
})

Expand Down
15 changes: 15 additions & 0 deletions cypress/support/commands.js
Original file line number Diff line number Diff line change
Expand Up @@ -454,3 +454,18 @@ Cypress.Commands.add('makeTalkRoomPublic', (user, token, password = '') => {
})
})

Cypress.Commands.add('newFileFromMenu', (fileType = 'document', fileName = 'MyNewFile') => {
cy.get('div[data-cy-files-content-breadcrumbs=""]')
.find('form[data-cy-upload-picker=""]')
.should('be.visible')
.click()

cy.get('button[role="menuitem"]')
.contains('New ' + fileType)
.should('be.visible')
.click()

cy.get('input[data-cy-files-new-node-dialog-input=""]')
.should('be.visible')
.type(fileName + '{enter}')
})
8 changes: 7 additions & 1 deletion lib/Listener/RegisterTemplateFileCreatorListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,13 @@ public function handle(Event $event): void {
return;
}

if (!$this->permissionManager->isEnabledForUser() || !$this->permissionManager->userCanEdit() || empty($this->capabilitiesService->getCapabilities())) {
if (empty($this->capabilitiesService->getCapabilities())) {
return;
}

$user = $this->permissionManager->loggedInUser();
$userCanCreate = $this->permissionManager->isEnabledForUser($user) && $this->permissionManager->userCanEdit($user);
if ($user && !$userCanCreate) {
return;
}

Expand Down
3 changes: 0 additions & 3 deletions src/public.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,12 @@ import {
isDownloadHidden,
} from './helpers/index.js'
import { getCapabilities } from './services/capabilities.ts'
import { registerNewFileMenuEntries } from './view/NewFileMenu.js'

document.addEventListener('DOMContentLoaded', () => {
if (!isPublicShare() || !OCA.Viewer) {
return
}

registerNewFileMenuEntries()

const isEnabledFilesPdfViewer = getCapabilities().mimetypesNoDefaultOpen.includes('application/pdf')

if ((isDownloadHidden() || !isEnabledFilesPdfViewer) && isPdf()) {
Expand Down
17 changes: 1 addition & 16 deletions src/services/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,7 @@
*/

import axios from '@nextcloud/axios'
import { generateOcsUrl, generateFilePath } from '@nextcloud/router'
import { getSharingToken } from '@nextcloud/sharing/public'

export const createEmptyFile = async (context, mimeType, fileName, templateId = null) => {
const shareToken = getSharingToken()

const response = await axios.post(generateOcsUrl('apps/richdocuments/api/v1/file', 2), {
mimeType,
fileName,
directoryPath: context.dirname,
shareToken,
templateId,
})

return response.data
}
import { generateFilePath } from '@nextcloud/router'

export const savePersonalSetting = (data) => {
return axios.post(generateFilePath('richdocuments', 'ajax', 'personal.php'), data)
Expand Down
105 changes: 0 additions & 105 deletions src/view/NewFileMenu.js

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ public function testHandleRegistersWithoutDrawSupport() {
public function testHandleDoesNotRegisterIfUserCannotEdit() {
$event = $this->createMock(RegisterTemplateCreatorEvent::class);
$event->method('getTemplateManager')->willReturn($this->templateManager);
$this->permissionManager->method('loggedInUser')->willReturn('user');
$this->permissionManager->method('isEnabledForUser')->willReturn(true);
$this->permissionManager->method('userCanEdit')->willReturn(false);
$this->capabilitiesService->method('getCapabilities')->willReturn(['something']);
Expand Down
Loading