diff --git a/composer.lock b/composer.lock index c1113a28c3..9a432e455d 100644 --- a/composer.lock +++ b/composer.lock @@ -481,12 +481,12 @@ "source": { "type": "git", "url": "https://github.com/nextcloud-deps/ocp.git", - "reference": "df0b0d885420a4168cd1470ee33364a3369bed1c" + "reference": "5d4e0489bad530d511c988afacf336ed087fa765" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/df0b0d885420a4168cd1470ee33364a3369bed1c", - "reference": "df0b0d885420a4168cd1470ee33364a3369bed1c", + "url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/5d4e0489bad530d511c988afacf336ed087fa765", + "reference": "5d4e0489bad530d511c988afacf336ed087fa765", "shasum": "" }, "require": { @@ -522,7 +522,7 @@ "issues": "https://github.com/nextcloud-deps/ocp/issues", "source": "https://github.com/nextcloud-deps/ocp/tree/master" }, - "time": "2025-01-25T00:41:21+00:00" + "time": "2025-02-22T00:42:30+00:00" }, { "name": "nikic/php-parser", diff --git a/cypress/e2e/integration.spec.js b/cypress/e2e/integration.spec.js index 4214f90f6f..5596065197 100644 --- a/cypress/e2e/integration.spec.js +++ b/cypress/e2e/integration.spec.js @@ -32,8 +32,11 @@ describe('Nextcloud integration', function() { it('Sharing sidebar', function() { cy.get('@loleafletframe').within(() => { - cy.get('#File-tab-label').click() - cy.get('#ShareAs-button').click() + cy.get('.notebookbar-tabs-container', { timeout: 30_000 }) + .should('be.visible') + + cy.get('button[aria-label="File"]').click() + cy.get('button#ShareAs-button').click() }) cy.get('#app-sidebar-vue') @@ -47,8 +50,11 @@ describe('Nextcloud integration', function() { it('Versions sidebar', function() { cy.get('@loleafletframe').within(() => { - cy.get('#File-tab-label').click() - cy.get('#Rev-History-button').click() + cy.get('.notebookbar-tabs-container', { timeout: 30_000 }) + .should('be.visible') + + cy.get('button[aria-label="File"]').click() + cy.get('button[aria-label="See history"]').click() }) cy.get('#app-sidebar-vue') @@ -65,32 +71,40 @@ describe('Nextcloud integration', function() { it('Save as', function() { const exportFilename = 'document.rtf' cy.get('@loleafletframe').within(() => { - cy.get('#File-tab-label').click() - cy.get('#saveas').click() + cy.get('.notebookbar-tabs-container', { timeout: 30_000 }) + .should('be.visible') + + cy.get('button[aria-label="File"]').click() + cy.get('button[aria-label="Save As"]').click() + cy.get('#saveas-entries #saveas-entry-1').click() }) - cy.get('.saveas-dialog').should('be.visible') - cy.get('.saveas-dialog input[type=text]') - .should('be.visible') - .should('have.value', `/${exportFilename}`) - cy.get('.saveas-dialog button.button-vue--vue-primary').click() + cy.get('.saveas-dialog').should('be.visible') + cy.get('.saveas-dialog input[type=text]') + .should('be.visible') + .should('have.value', `/${exportFilename}`) - cy.get('@loleafletframe').within(() => { - cy.get('#closebutton').click() - cy.waitForViewerClose() - }) + cy.get('.saveas-dialog button.button-vue--vue-primary').click() - // FIXME: We should not need to reload - cy.get('.breadcrumb__crumbs a').eq(0).click({ force: true }) + cy.get('@loleafletframe').within(() => { + cy.get('#closebutton').click() + cy.waitForViewerClose() + }) - cy.openFile(exportFilename) + // FIXME: We should not need to reload + cy.get('.breadcrumb__crumbs a').eq(0).click({ force: true }) + + cy.openFile(exportFilename) }) it('Open locally', function() { cy.get('@loleafletframe').within(() => { - cy.get('#Open_Local_Editor').click() + cy.get('.notebookbar-shortcuts-bar', { timeout: 30_000 }) + .should('be.visible') + + cy.get('button[aria-label="Open in local editor"]').click() }) cy.get('.confirmation-dialog').should('be.visible') diff --git a/cypress/e2e/open.spec.js b/cypress/e2e/open.spec.js index 4bfd1e0e33..ad7bf88237 100644 --- a/cypress/e2e/open.spec.js +++ b/cypress/e2e/open.spec.js @@ -41,10 +41,8 @@ describe('Open existing office files', function() { // Share action cy.wait(2000) cy.get('@loleafletframe').within(() => { - cy.get('#main-menu #menu-file > a').click() - cy.get('#main-menu #menu-shareas > a').should('be.visible').click() + cy.verifyOpen(filename) }) - cy.verifyOpen(filename) // FIXME: wait for sidebar tab content // FIXME: validate sharing tab @@ -69,9 +67,8 @@ describe('Open existing office files', function() { cy.screenshot('open-file_' + filename) cy.get('@loleafletframe').within(() => { - cy.get('button.icon-nextcloud-sidebar').click() + cy.verifyOpen(filename) }) - cy.verifyOpen(filename) // FIXME: wait for sidebar tab content // FIXME: validate sharing tab cy.screenshot('share-sidebar_' + filename) @@ -133,9 +130,8 @@ describe('Open PDF with richdocuments', () => { // Verify that the correct file is open cy.get('@loleafletframe').within(() => { - cy.get('button.icon-nextcloud-sidebar').click() + cy.verifyOpen('document.pdf') }) - cy.verifyOpen('document.pdf') // Make sure we can close the document cy.closeDocument() diff --git a/cypress/support/commands.js b/cypress/support/commands.js index fe613859a5..7d621c8e8e 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -223,7 +223,7 @@ Cypress.Commands.add('nextcloudTestingAppConfigSet', (appId, configKey, configVa }) Cypress.Commands.add('waitForViewer', () => { - cy.get('#viewer', { timeout: 30000 }) + cy.get('#viewer', { timeout: 50000 }) .should('be.visible') .and('have.class', 'modal-mask') .and('not.have.class', 'icon-loading') @@ -292,11 +292,9 @@ Cypress.Commands.add('closeDocument', () => { }) Cypress.Commands.add('verifyOpen', (filename) => { - cy.get('#app-sidebar-vue') - .should('be.visible') - cy.get('.app-sidebar-header__mainname') - .should('be.visible') - .should('contain.text', filename) + cy.get('input#document-name-input').should(($docName) => { + expect($docName.val()).to.equal(filename) + }) }) Cypress.Commands.add('uploadSystemTemplate', ({ fixturePath, fileName, mimeType }) => { diff --git a/l10n/da.js b/l10n/da.js index 62338f1b20..28e18523d3 100644 --- a/l10n/da.js +++ b/l10n/da.js @@ -6,7 +6,7 @@ OC.L10N.register( "New Presentation.odp" : "Ny præsentation.odp", "New Document.docx" : "Nyt dokument.docx", "New Spreadsheet.xlsx" : "Nyt regneark.xlsx", - "New Presentation.pptx" : "Nyt præsentation.pptx", + "New Presentation.pptx" : "Ny præsentation.pptx", "File already exists" : "Filen findes allerede", "Saved" : "Gemt", "The file was uploaded" : "Filen blev uploadet", @@ -28,9 +28,9 @@ OC.L10N.register( "Word Document (.docx)" : "Word dokument (.docx)", "OpenDocument Text (.odt)" : "OpenDocument tekst (.odt)", "Excel Workbook (.xlsx)" : "Excel regneark (.xlsx)", - "New document" : "Nyt Dokument", - "New spreadsheet" : "Nyt Regneark", - "New presentation" : "Ny Præsentation", + "New document" : "Nyt dokument", + "New spreadsheet" : "Nyt regneark", + "New presentation" : "Ny præsentation", "New diagram" : "Nyt diagram", "Headings" : "Overskrifter", "Images" : "Billeder", @@ -59,7 +59,7 @@ OC.L10N.register( "Select file or folder to link to" : "Link til fil eller mappe", "Select file" : "Vælg fil", "Close" : "Luk", - "Edit" : "Redigér", + "Edit" : "Rediger", "The file should now open locally. If you don't see this happening, make sure that the desktop client is installed on your system." : "Filen skulle nu åbne lokalt. Hvis dette ikke sker, så vær sikker på at desktopklienten er installeret på dit system.", "Failed to revert the document to older version" : "Det lykkedes ikke at gendanne dokumentet, til en ældre version", "Remove from favorites" : "Fjernet fra favoritter", @@ -79,6 +79,8 @@ OC.L10N.register( "New filename" : "Nyt filnavn", "Saving…" : "Gemmer...", "Create a new document" : "Opret nyt dokument", + "Add a new template" : "Opret en ny skabelon", + "Add a new one?" : "Tilføj en ny?", "Collabora Online" : "Collabora Online" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/da.json b/l10n/da.json index 4c1f0fa3fa..da92159086 100644 --- a/l10n/da.json +++ b/l10n/da.json @@ -4,7 +4,7 @@ "New Presentation.odp" : "Ny præsentation.odp", "New Document.docx" : "Nyt dokument.docx", "New Spreadsheet.xlsx" : "Nyt regneark.xlsx", - "New Presentation.pptx" : "Nyt præsentation.pptx", + "New Presentation.pptx" : "Ny præsentation.pptx", "File already exists" : "Filen findes allerede", "Saved" : "Gemt", "The file was uploaded" : "Filen blev uploadet", @@ -26,9 +26,9 @@ "Word Document (.docx)" : "Word dokument (.docx)", "OpenDocument Text (.odt)" : "OpenDocument tekst (.odt)", "Excel Workbook (.xlsx)" : "Excel regneark (.xlsx)", - "New document" : "Nyt Dokument", - "New spreadsheet" : "Nyt Regneark", - "New presentation" : "Ny Præsentation", + "New document" : "Nyt dokument", + "New spreadsheet" : "Nyt regneark", + "New presentation" : "Ny præsentation", "New diagram" : "Nyt diagram", "Headings" : "Overskrifter", "Images" : "Billeder", @@ -57,7 +57,7 @@ "Select file or folder to link to" : "Link til fil eller mappe", "Select file" : "Vælg fil", "Close" : "Luk", - "Edit" : "Redigér", + "Edit" : "Rediger", "The file should now open locally. If you don't see this happening, make sure that the desktop client is installed on your system." : "Filen skulle nu åbne lokalt. Hvis dette ikke sker, så vær sikker på at desktopklienten er installeret på dit system.", "Failed to revert the document to older version" : "Det lykkedes ikke at gendanne dokumentet, til en ældre version", "Remove from favorites" : "Fjernet fra favoritter", @@ -77,6 +77,8 @@ "New filename" : "Nyt filnavn", "Saving…" : "Gemmer...", "Create a new document" : "Opret nyt dokument", + "Add a new template" : "Opret en ny skabelon", + "Add a new one?" : "Tilføj en ny?", "Collabora Online" : "Collabora Online" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/de.js b/l10n/de.js index 25290de68d..c864dea4e3 100644 --- a/l10n/de.js +++ b/l10n/de.js @@ -71,7 +71,7 @@ OC.L10N.register( "This might be due to a missing configuration of your web server. For more information, please visit: " : "Dies kann an einer fehlenden Konfiguration deines Webservers liegen. Für weitere Informationen, besuche bitte:", "Connecting Collabora Online Single Click with Nginx" : "Collabora Online mit einem Klick mit Nginx verbinden", "Setting up a new server" : "Neuen Server einrichten", - "Collabora Online should use the same protocol as the server installation." : "Collabora Online sollte das gleiche Protokoll wie die Server-Installation nutzen.", + "Collabora Online should use the same protocol as the server installation." : "Collabora Online sollte das gleiche Protokoll wie die Serverinstallation nutzen.", "Your browser has been unable to connect to the Collabora server:" : "Dein Browser konnte keine Verbindung zum Collabora-Server herstellen:", "This URL is determined on the Collabora server either from the configured URL or the server_name parameter in coolwsd.xml." : "Diese URL wird auf dem Collabora-Server entweder aus der konfigurierten URL oder dem Parameter server_name in coolwsd.xml ermittelt.", "Collabora Online server is reachable." : "Collabora Online Server ist erreichbar.", @@ -251,7 +251,7 @@ OC.L10N.register( "New drawing" : "Neue Zeichnung", "Could not create file" : "Die Datei konnte nicht erstellt werden", "Select template" : "Vorlage auswählen", - "Saved with error: Collabora Online should use the same protocol as the server installation." : "Mit Fehler gespeichert: Collabora Online sollte das gleiche Protokoll wie die Server-Installation nutzen.", + "Saved with error: Collabora Online should use the same protocol as the server installation." : "Mit Fehler gespeichert: Collabora Online sollte das gleiche Protokoll wie die Serverinstallation nutzen.", "Could not establish connection to the Collabora Online server. This might be due to a missing configuration of your web server. For more information, please visit: " : "Es konnte keine Verbindung zum Collabora Online-Server hergestellt werden. Dies könnte auf eine fehlende Konfiguration deines Web-Servers zurückzuführen sein. Für weitere Informationen besuche bitte:", "Nextcloud Office requires a seperate server running Collabora Online to provide editing capabilities." : "Nextcloud Office benötigt einen separaten Server, auf dem Collabora Online läuft, um Funktionen zur Bearbeitungs bereitzustellen.", "Collabora Online requires a seperate server acting as a WOPI-like Client to provide editing capabilities." : "Collabora Online benötigt einen separaten Server, der als WOPI-ähnlicher-Client fungiert, um Funktionen zum Bearbeiten bereitzustellen.", @@ -264,7 +264,7 @@ OC.L10N.register( "Set" : "Setzen", "Please enter the filename to store the document as." : "Bitte den Dateinamen angeben, unter welchem dieses Dokument gespeichert werden soll.", "New filename" : "Neuer Dateiname", - "Failed to connect to {productName}. Please try again later or contact your server administrator." : "Fehler beim Verbinden mit {productName}. Bitte versuchen es noch einmal oder kontaktiere deinen Administrator.", + "Failed to connect to {productName}. Please try again later or contact your server administrator." : "Fehler beim Verbinden mit {productName}. Bitte versuchen es noch einmal oder kontaktiere deine Administration.", "Saving…" : "Speichere …", "Insert from {name}" : "Einfügen von {name}", "Last saved version" : "Letzte gespeicherte Version", diff --git a/l10n/de.json b/l10n/de.json index a2ed4a302c..828e504a02 100644 --- a/l10n/de.json +++ b/l10n/de.json @@ -69,7 +69,7 @@ "This might be due to a missing configuration of your web server. For more information, please visit: " : "Dies kann an einer fehlenden Konfiguration deines Webservers liegen. Für weitere Informationen, besuche bitte:", "Connecting Collabora Online Single Click with Nginx" : "Collabora Online mit einem Klick mit Nginx verbinden", "Setting up a new server" : "Neuen Server einrichten", - "Collabora Online should use the same protocol as the server installation." : "Collabora Online sollte das gleiche Protokoll wie die Server-Installation nutzen.", + "Collabora Online should use the same protocol as the server installation." : "Collabora Online sollte das gleiche Protokoll wie die Serverinstallation nutzen.", "Your browser has been unable to connect to the Collabora server:" : "Dein Browser konnte keine Verbindung zum Collabora-Server herstellen:", "This URL is determined on the Collabora server either from the configured URL or the server_name parameter in coolwsd.xml." : "Diese URL wird auf dem Collabora-Server entweder aus der konfigurierten URL oder dem Parameter server_name in coolwsd.xml ermittelt.", "Collabora Online server is reachable." : "Collabora Online Server ist erreichbar.", @@ -249,7 +249,7 @@ "New drawing" : "Neue Zeichnung", "Could not create file" : "Die Datei konnte nicht erstellt werden", "Select template" : "Vorlage auswählen", - "Saved with error: Collabora Online should use the same protocol as the server installation." : "Mit Fehler gespeichert: Collabora Online sollte das gleiche Protokoll wie die Server-Installation nutzen.", + "Saved with error: Collabora Online should use the same protocol as the server installation." : "Mit Fehler gespeichert: Collabora Online sollte das gleiche Protokoll wie die Serverinstallation nutzen.", "Could not establish connection to the Collabora Online server. This might be due to a missing configuration of your web server. For more information, please visit: " : "Es konnte keine Verbindung zum Collabora Online-Server hergestellt werden. Dies könnte auf eine fehlende Konfiguration deines Web-Servers zurückzuführen sein. Für weitere Informationen besuche bitte:", "Nextcloud Office requires a seperate server running Collabora Online to provide editing capabilities." : "Nextcloud Office benötigt einen separaten Server, auf dem Collabora Online läuft, um Funktionen zur Bearbeitungs bereitzustellen.", "Collabora Online requires a seperate server acting as a WOPI-like Client to provide editing capabilities." : "Collabora Online benötigt einen separaten Server, der als WOPI-ähnlicher-Client fungiert, um Funktionen zum Bearbeiten bereitzustellen.", @@ -262,7 +262,7 @@ "Set" : "Setzen", "Please enter the filename to store the document as." : "Bitte den Dateinamen angeben, unter welchem dieses Dokument gespeichert werden soll.", "New filename" : "Neuer Dateiname", - "Failed to connect to {productName}. Please try again later or contact your server administrator." : "Fehler beim Verbinden mit {productName}. Bitte versuchen es noch einmal oder kontaktiere deinen Administrator.", + "Failed to connect to {productName}. Please try again later or contact your server administrator." : "Fehler beim Verbinden mit {productName}. Bitte versuchen es noch einmal oder kontaktiere deine Administration.", "Saving…" : "Speichere …", "Insert from {name}" : "Einfügen von {name}", "Last saved version" : "Letzte gespeicherte Version", diff --git a/l10n/de_DE.js b/l10n/de_DE.js index e4719ab70c..1fd7e9a847 100644 --- a/l10n/de_DE.js +++ b/l10n/de_DE.js @@ -71,7 +71,7 @@ OC.L10N.register( "This might be due to a missing configuration of your web server. For more information, please visit: " : "Dies kann an einer fehlenden Konfiguration Ihres Webservers liegen. Für weitere Informationen, besuchen Sie bitte:", "Connecting Collabora Online Single Click with Nginx" : "Collabora Online mit einem Klick mit Nginx verbinden", "Setting up a new server" : "Neuen Server einrichten", - "Collabora Online should use the same protocol as the server installation." : "Collabora Online sollte das gleiche Protokoll wie die Server-Installation nutzen.", + "Collabora Online should use the same protocol as the server installation." : "Collabora Online sollte das gleiche Protokoll wie die Serverinstallation nutzen.", "Your browser has been unable to connect to the Collabora server:" : "Ihr Browser konnte keine Verbindung zum Collabora-Server herstellen:", "This URL is determined on the Collabora server either from the configured URL or the server_name parameter in coolwsd.xml." : "Diese URL wird auf dem Collabora-Server entweder aus der konfigurierten URL oder dem Parameter server_name in coolwsd.xml ermittelt.", "Collabora Online server is reachable." : "Collabora Online Server ist erreichbar.", @@ -251,7 +251,7 @@ OC.L10N.register( "New drawing" : "Neue Zeichnung", "Could not create file" : "Die Datei konnte nicht erstellt werden", "Select template" : "Vorlage auswählen", - "Saved with error: Collabora Online should use the same protocol as the server installation." : "Mit Fehler gespeichert: Collabora Online sollte das gleiche Protokoll wie die Server-Installation nutzen.", + "Saved with error: Collabora Online should use the same protocol as the server installation." : "Mit Fehler gespeichert: Collabora Online sollte das gleiche Protokoll wie die Serverinstallation nutzen.", "Could not establish connection to the Collabora Online server. This might be due to a missing configuration of your web server. For more information, please visit: " : "Es konnte keine Verbindung zum Collabora Online-Server hergestellt werden. Dies könnte auf eine fehlende Konfiguration Ihres Web-Servers zurückzuführen sein. Für weitere Informationen besuchen Sie bitte:", "Nextcloud Office requires a seperate server running Collabora Online to provide editing capabilities." : "Nextcloud Office benötigt einen separaten Server, auf dem Collabora Online läuft, um Bearbeitungsfunktionen bereitzustellen.", "Collabora Online requires a seperate server acting as a WOPI-like Client to provide editing capabilities." : "Collabora Online benötigt einen separaten Server, der als WOPI-ähnlicher-Client fungiert, um Bearbeitungsfunktionen bereitzustellen.", @@ -264,7 +264,7 @@ OC.L10N.register( "Set" : "Setzen", "Please enter the filename to store the document as." : "Bitte den Dateinamen, unter welchem dieses Dokument gespeichert werden soll, eingeben.", "New filename" : "Neuer Dateiname", - "Failed to connect to {productName}. Please try again later or contact your server administrator." : "Fehler beim Verbinden mit {productName}. Bitte versuchen Sie es noch einmal oder kontaktieren Sie Ihren Administrator.", + "Failed to connect to {productName}. Please try again later or contact your server administrator." : "Fehler beim Verbinden mit {productName}. Bitte versuchen Sie es noch einmal oder kontaktieren Sie Ihre Administration.", "Saving…" : "Speichere…", "Insert from {name}" : "Einfügen von {name}", "Last saved version" : "Letzte gespeicherte Version", diff --git a/l10n/de_DE.json b/l10n/de_DE.json index 064d465636..ebc71df3a4 100644 --- a/l10n/de_DE.json +++ b/l10n/de_DE.json @@ -69,7 +69,7 @@ "This might be due to a missing configuration of your web server. For more information, please visit: " : "Dies kann an einer fehlenden Konfiguration Ihres Webservers liegen. Für weitere Informationen, besuchen Sie bitte:", "Connecting Collabora Online Single Click with Nginx" : "Collabora Online mit einem Klick mit Nginx verbinden", "Setting up a new server" : "Neuen Server einrichten", - "Collabora Online should use the same protocol as the server installation." : "Collabora Online sollte das gleiche Protokoll wie die Server-Installation nutzen.", + "Collabora Online should use the same protocol as the server installation." : "Collabora Online sollte das gleiche Protokoll wie die Serverinstallation nutzen.", "Your browser has been unable to connect to the Collabora server:" : "Ihr Browser konnte keine Verbindung zum Collabora-Server herstellen:", "This URL is determined on the Collabora server either from the configured URL or the server_name parameter in coolwsd.xml." : "Diese URL wird auf dem Collabora-Server entweder aus der konfigurierten URL oder dem Parameter server_name in coolwsd.xml ermittelt.", "Collabora Online server is reachable." : "Collabora Online Server ist erreichbar.", @@ -249,7 +249,7 @@ "New drawing" : "Neue Zeichnung", "Could not create file" : "Die Datei konnte nicht erstellt werden", "Select template" : "Vorlage auswählen", - "Saved with error: Collabora Online should use the same protocol as the server installation." : "Mit Fehler gespeichert: Collabora Online sollte das gleiche Protokoll wie die Server-Installation nutzen.", + "Saved with error: Collabora Online should use the same protocol as the server installation." : "Mit Fehler gespeichert: Collabora Online sollte das gleiche Protokoll wie die Serverinstallation nutzen.", "Could not establish connection to the Collabora Online server. This might be due to a missing configuration of your web server. For more information, please visit: " : "Es konnte keine Verbindung zum Collabora Online-Server hergestellt werden. Dies könnte auf eine fehlende Konfiguration Ihres Web-Servers zurückzuführen sein. Für weitere Informationen besuchen Sie bitte:", "Nextcloud Office requires a seperate server running Collabora Online to provide editing capabilities." : "Nextcloud Office benötigt einen separaten Server, auf dem Collabora Online läuft, um Bearbeitungsfunktionen bereitzustellen.", "Collabora Online requires a seperate server acting as a WOPI-like Client to provide editing capabilities." : "Collabora Online benötigt einen separaten Server, der als WOPI-ähnlicher-Client fungiert, um Bearbeitungsfunktionen bereitzustellen.", @@ -262,7 +262,7 @@ "Set" : "Setzen", "Please enter the filename to store the document as." : "Bitte den Dateinamen, unter welchem dieses Dokument gespeichert werden soll, eingeben.", "New filename" : "Neuer Dateiname", - "Failed to connect to {productName}. Please try again later or contact your server administrator." : "Fehler beim Verbinden mit {productName}. Bitte versuchen Sie es noch einmal oder kontaktieren Sie Ihren Administrator.", + "Failed to connect to {productName}. Please try again later or contact your server administrator." : "Fehler beim Verbinden mit {productName}. Bitte versuchen Sie es noch einmal oder kontaktieren Sie Ihre Administration.", "Saving…" : "Speichere…", "Insert from {name}" : "Einfügen von {name}", "Last saved version" : "Letzte gespeicherte Version", diff --git a/l10n/is.js b/l10n/is.js index 4003e53d44..7f3323c3fd 100644 --- a/l10n/is.js +++ b/l10n/is.js @@ -25,11 +25,22 @@ OC.L10N.register( "Only template files can be uploaded" : "Aðeins er hægt að senda inn sniðskrár", "Invalid file provided" : "Ógild skrá gefin", "Template not found" : "Sniðmát fannst ekki", + "PDF (.pdf)" : "PDF (.pdf)", + "Image (.png)" : "Mynd (.png)", + "Image (.svg)" : "Mynd (.svg)", + "Text (.rtf)" : "Texti (.rtf)", + "Text (.txt)" : "Texti (.txt)", + "Word Document (.docx)" : "Word-skjal (.docx)", + "OpenDocument Text (.odt)" : "OpenDocument textaskjal (.odt)", "New document" : "Nýtt skjal", "New spreadsheet" : "Nýr töflureiknir", "New presentation" : "Ný kynning", + "Nextcloud Office" : "Nextcloud Office", "Headings" : "Fyrirsagnir", + "Sections" : "Hlutar", "Images" : "Myndir", + "Sheets" : "Blöð", + "Slides" : "Skyggnur", "Office" : "Skrifstofa", "Empty" : "Tómt", "Anonymous guest" : "Nafnlaus gestur", @@ -37,6 +48,7 @@ OC.L10N.register( "Edit office documents directly in your browser." : "Breyttu skrifstofuskjölum beint í vafranum þínum.", "New" : "Nýtt", "Collabora Online is a powerful LibreOffice-based online office suite with collaborative editing, which supports all major documents, spreadsheet and presentation file formats and works together with all modern browsers." : "Collabora Online er öflugur vöndull vinnuforrita byggður á LibreOffice og er með hópvinnslueiginleikum sem styðja við skráasnið allra helstu gerða skjala, töflureikna og kynninga, auk þess að virka í öllum nútímalegum vöfrum.", + "Use your own server" : "Notaðu þinn eigin þjón", "URL (and Port) of Collabora Online-server" : "URL-slóð (og gátt) Collabora Online þjónsins", "Disable certificate verification (insecure)" : "Gera sannvottun skilríkja óvirka (óöruggt)", "Enable if your Collabora Online server uses a self signed certificate" : "Virkja þetta ef Collabora Online þjónninn notar skilríki undirritað af handhafa", diff --git a/l10n/is.json b/l10n/is.json index 8e4546f1a7..a9b7203716 100644 --- a/l10n/is.json +++ b/l10n/is.json @@ -23,11 +23,22 @@ "Only template files can be uploaded" : "Aðeins er hægt að senda inn sniðskrár", "Invalid file provided" : "Ógild skrá gefin", "Template not found" : "Sniðmát fannst ekki", + "PDF (.pdf)" : "PDF (.pdf)", + "Image (.png)" : "Mynd (.png)", + "Image (.svg)" : "Mynd (.svg)", + "Text (.rtf)" : "Texti (.rtf)", + "Text (.txt)" : "Texti (.txt)", + "Word Document (.docx)" : "Word-skjal (.docx)", + "OpenDocument Text (.odt)" : "OpenDocument textaskjal (.odt)", "New document" : "Nýtt skjal", "New spreadsheet" : "Nýr töflureiknir", "New presentation" : "Ný kynning", + "Nextcloud Office" : "Nextcloud Office", "Headings" : "Fyrirsagnir", + "Sections" : "Hlutar", "Images" : "Myndir", + "Sheets" : "Blöð", + "Slides" : "Skyggnur", "Office" : "Skrifstofa", "Empty" : "Tómt", "Anonymous guest" : "Nafnlaus gestur", @@ -35,6 +46,7 @@ "Edit office documents directly in your browser." : "Breyttu skrifstofuskjölum beint í vafranum þínum.", "New" : "Nýtt", "Collabora Online is a powerful LibreOffice-based online office suite with collaborative editing, which supports all major documents, spreadsheet and presentation file formats and works together with all modern browsers." : "Collabora Online er öflugur vöndull vinnuforrita byggður á LibreOffice og er með hópvinnslueiginleikum sem styðja við skráasnið allra helstu gerða skjala, töflureikna og kynninga, auk þess að virka í öllum nútímalegum vöfrum.", + "Use your own server" : "Notaðu þinn eigin þjón", "URL (and Port) of Collabora Online-server" : "URL-slóð (og gátt) Collabora Online þjónsins", "Disable certificate verification (insecure)" : "Gera sannvottun skilríkja óvirka (óöruggt)", "Enable if your Collabora Online server uses a self signed certificate" : "Virkja þetta ef Collabora Online þjónninn notar skilríki undirritað af handhafa", diff --git a/l10n/it.js b/l10n/it.js index 7fdbb2bd53..9969478db3 100644 --- a/l10n/it.js +++ b/l10n/it.js @@ -155,6 +155,7 @@ OC.L10N.register( "Error: Cannot start the Collabora Online Built-in server, please setup a standalone one." : "Errore: impossibile avviare il server integrato Collabora Online, configura un server autonomo.", "Close version preview" : "Chiudi anteprima della versione", "Edit with {productName}" : "Modifica con {productName}", + "Open file locally" : "Apri file localmente", "Open locally" : "Aprire localmente", "Continue editing online" : "Continua a modificare in linea", "The file should now open locally. If you don't see this happening, make sure that the desktop client is installed on your system." : "I file dovrebbe ora aprirsi in locale. Se non succede, assicurati che il client desktop sia installato nel tuo sistema.", diff --git a/l10n/it.json b/l10n/it.json index a1a7638979..84c7232b2d 100644 --- a/l10n/it.json +++ b/l10n/it.json @@ -153,6 +153,7 @@ "Error: Cannot start the Collabora Online Built-in server, please setup a standalone one." : "Errore: impossibile avviare il server integrato Collabora Online, configura un server autonomo.", "Close version preview" : "Chiudi anteprima della versione", "Edit with {productName}" : "Modifica con {productName}", + "Open file locally" : "Apri file localmente", "Open locally" : "Aprire localmente", "Continue editing online" : "Continua a modificare in linea", "The file should now open locally. If you don't see this happening, make sure that the desktop client is installed on your system." : "I file dovrebbe ora aprirsi in locale. Se non succede, assicurati che il client desktop sia installato nel tuo sistema.", diff --git a/l10n/ru.js b/l10n/ru.js index 8bce09fdad..cd9159a419 100644 --- a/l10n/ru.js +++ b/l10n/ru.js @@ -147,6 +147,7 @@ OC.L10N.register( "To use Zotero specify your API key here. You can create your API key in your" : "Чтобы использовать Zotero, укажите здесь свой ключ API. Вы можете создать свой ключ API в", "Zotero account API settings." : "Настройки API учетной записи Zotero.", "This instance does not support Zotero, because the feature is missing or disabled. Please contact the administration." : "Этот экземпляр не поддерживает Zotero, поскольку эта функция отсутствует или отключена. Пожалуйста, свяжитесь с администрацией.", + "Failed to save settings." : "Не удалось сохранить настройки.", "Description" : "Описание", "Add new token" : "Добавить токен", "No font overview" : "Нет средства просмотра шрифтов.", diff --git a/l10n/ru.json b/l10n/ru.json index a2c7a4c3cc..174eee2fc5 100644 --- a/l10n/ru.json +++ b/l10n/ru.json @@ -145,6 +145,7 @@ "To use Zotero specify your API key here. You can create your API key in your" : "Чтобы использовать Zotero, укажите здесь свой ключ API. Вы можете создать свой ключ API в", "Zotero account API settings." : "Настройки API учетной записи Zotero.", "This instance does not support Zotero, because the feature is missing or disabled. Please contact the administration." : "Этот экземпляр не поддерживает Zotero, поскольку эта функция отсутствует или отключена. Пожалуйста, свяжитесь с администрацией.", + "Failed to save settings." : "Не удалось сохранить настройки.", "Description" : "Описание", "Add new token" : "Добавить токен", "No font overview" : "Нет средства просмотра шрифтов.", diff --git a/lib/Controller/SettingsController.php b/lib/Controller/SettingsController.php index bd3a22346d..9233ea978e 100644 --- a/lib/Controller/SettingsController.php +++ b/lib/Controller/SettingsController.php @@ -14,6 +14,7 @@ use OCA\Richdocuments\Service\DiscoveryService; use OCA\Richdocuments\Service\FontService; use OCA\Richdocuments\Service\SettingsService; +use OCA\Richdocuments\TemplateManager; use OCA\Richdocuments\UploadException; use OCP\App\IAppManager; use OCP\AppFramework\Controller; @@ -61,6 +62,7 @@ public function __construct( private IURLGenerator $urlGenerator, private WopiMapper $wopiMapper, private ?string $userId, + private TemplateManager $templateManager, ) { parent::__construct($appName, $request); } @@ -474,6 +476,7 @@ public function uploadFontFile(): JSONResponse { /** * @param string $type + * @param string $token * @param string $category * @param string $name * @@ -490,7 +493,16 @@ public function getSettingsFile(string $type, string $token, string $category, s $userId = $wopi->getEditorUid() ?: $wopi->getOwnerUid(); $type = $type . '/' . $userId; } - $systemFile = $this->settingsService->getSettingsFile($type, $category, $name); + + // special handling for presentation template + if ($category === 'template') { + $this->templateManager->setUserId($userId); + $templateId = $this->request->getParam('identifier'); + $systemFile = $this->templateManager->get((int)$templateId); + } else { + $systemFile = $this->settingsService->getSettingsFile($type, $category, $name); + } + return new DataDisplayResponse( $systemFile->getContent(), 200, @@ -504,7 +516,6 @@ public function getSettingsFile(string $type, string $token, string $category, s return new DataDisplayResponse('Something went wrong', 500); } } - /** * @param string $key diff --git a/lib/Controller/WopiController.php b/lib/Controller/WopiController.php index 4399b221e5..10fe1f0ae2 100644 --- a/lib/Controller/WopiController.php +++ b/lib/Controller/WopiController.php @@ -178,7 +178,9 @@ public function checkFileInfo(string $fileId, string $access_token): JSONRespons if ($this->capabilitiesService->hasSettingIframeSupport()) { if (!$isPublic) { - $response['UserSettings'] = $this->generateSettings($userId, 'userconfig'); + // FIXME: Figure out what is going on here + // have not yet been able to trace the issue + // $response['UserSettings'] = $this->generateSettings($userId, 'userconfig'); } $response['SharedSettings'] = $this->generateSettings($userId, 'systemconfig'); } @@ -405,7 +407,7 @@ public function getSettings(string $type, string $access_token): JSONResponse { if (empty($type)) { return new JSONResponse(['error' => 'Invalid type parameter'], Http::STATUS_BAD_REQUEST); } - + try { $wopi = $this->wopiMapper->getWopiForToken($access_token); if ($wopi->getTokenType() !== Wopi::TOKEN_TYPE_SETTING_AUTH) { @@ -415,7 +417,7 @@ public function getSettings(string $type, string $access_token): JSONResponse { $isPublic = empty($wopi->getEditorUid()); $guestUserId = 'Guest-' . \OC::$server->getSecureRandom()->generate(8); $userId = !$isPublic ? $wopi->getEditorUid() : $guestUserId; - + $userConfig = $this->settingsService->generateSettingsConfig($type, $userId); return new JSONResponse($userConfig, Http::STATUS_OK); } catch (UnknownTokenException|ExpiredTokenException $e) { @@ -426,7 +428,7 @@ public function getSettings(string $type, string $access_token): JSONResponse { return new JSONResponse(['error' => 'Internal Server Error'], Http::STATUS_INTERNAL_SERVER_ERROR); } } - + #[NoAdminRequired] #[NoCSRFRequired] #[PublicPage] @@ -444,11 +446,11 @@ public function uploadSettingsFile(string $fileId, string $access_token): JSONRe $fileContent = stream_get_contents($content); fclose($content); - + // Use the fileId as a file path URL (e.g., "/settings/systemconfig/wordbook/en_US%20(1).dic") $settingsUrl = new SettingsUrl($fileId); $result = $this->settingsService->uploadFile($settingsUrl, $fileContent, $userId); - + return new JSONResponse([ 'status' => 'success', 'filename' => $settingsUrl->getFileName(), @@ -501,7 +503,7 @@ public function deleteSettingsFile(string $fileId, string $access_token): JSONRe } } - + /** * Given an access token and a fileId, replaces the files with the request body. * Expects a valid token in access_token parameter. @@ -984,7 +986,7 @@ private function getWopiUrlForTemplate(Wopi $wopi): string { $nextcloudUrl = $this->appConfig->getNextcloudUrl() ?: trim($this->urlGenerator->getAbsoluteURL(''), '/'); return $nextcloudUrl . '/index.php/apps/richdocuments/wopi/template/' . $wopi->getTemplateId() . '?access_token=' . $wopi->getToken(); } - + private function generateSettingToken(string $userId): string { return $this->settingsService->generateIframeToken('user', $userId)['token']; } diff --git a/lib/Listener/FileCreatedFromTemplateListener.php b/lib/Listener/FileCreatedFromTemplateListener.php index 8553a20b8a..746d479bb8 100644 --- a/lib/Listener/FileCreatedFromTemplateListener.php +++ b/lib/Listener/FileCreatedFromTemplateListener.php @@ -54,18 +54,18 @@ public function handle(Event $event): void { return; } - if ($this->templateManager->isSupportedTemplateSource($templateFile->getExtension())) { - // Only use TemplateSource if supported filetype - $this->templateManager->setTemplateSource($event->getTarget()->getId(), $templateFile->getId()); - } - if ($this->capabilitiesService->hasFormFilling()) { try { - $filledTemplate = $this->templateFieldService->fillFields($templateFile, $event->getTemplateFields()); + $filledTemplate = $this->templateFieldService->fillFields($templateFile, $event->getTemplateFields(), null, $event->getTarget()->getExtension()); $event->getTarget()->putContent($filledTemplate); } catch (\Exception $e) { $this->logger->error($e->getMessage(), ['exception' => $e]); } + } else { + if ($this->templateManager->isSupportedTemplateSource($templateFile->getExtension())) { + // Only use TemplateSource if supported filetype + $this->templateManager->setTemplateSource($event->getTarget()->getId(), $templateFile->getId()); + } } // Avoid having the mimetype of the source file set diff --git a/lib/Service/SettingsService.php b/lib/Service/SettingsService.php index 0c944d7e31..ff14417955 100644 --- a/lib/Service/SettingsService.php +++ b/lib/Service/SettingsService.php @@ -10,6 +10,7 @@ use OCA\Richdocuments\AppInfo\Application; use OCA\Richdocuments\Db\WopiMapper; +use OCA\Richdocuments\TemplateManager; use OCA\Richdocuments\WOPI\SettingsUrl; use OCP\Files\Folder; use OCP\Files\IAppData; @@ -44,6 +45,7 @@ public function __construct( private WopiMapper $wopiMapper, private IGroupManager $groupManager, private IRootFolder $rootFolder, + private TemplateManager $templateManager, ) { // Create a distributed cache for caching file lists $this->cache = $cacheFactory->createDistributed(Application::APPNAME); @@ -141,12 +143,12 @@ public function generateIframeToken(string $type, string $userId): array { if ($type === 'admin' && !$this->groupManager->isAdmin($userId)) { throw new NotPermittedException('Permission denied'); } - + $serverHost = $this->urlGenerator->getAbsoluteURL('/'); $version = $this->capabilitiesService->getProductVersion(); - + $wopi = $this->wopiMapper->generateUserSettingsToken(-1, $userId, $version, $serverHost); - + return [ 'token' => $wopi->getToken(), 'token_ttl' => $wopi->getExpiry(), @@ -164,7 +166,41 @@ public function generateIframeToken(string $type, string $userId): array { public function getFolderEtag($type) : string { return $this->getTypeFolder($type)->getEtag(); } - + + public const SUPPORTED_PRESENTATION_MIMES = [ + 'application/vnd.oasis.opendocument.presentation', + 'application/vnd.oasis.opendocument.presentation-template', + ]; + + /** + * @param string $type + * @param string $userId + * @return array + */ + public function getPresentationTemplates(string $type, string $userId): array { + $this->templateManager->setUserId($userId); + $templates = array_filter( + $type === 'systemconfig' ? $this->templateManager->getSystem('presentation') : $this->templateManager->getUser('presentation'), + function ($template) { + return in_array( + $template->getMimeType(), + self::SUPPORTED_PRESENTATION_MIMES, + true + ); + } + ); + + $result = []; + foreach ($templates as $template) { + $uri = $this->generateFileUri($type, 'template', $template->getName(), $userId, $template->getId()); + $result[] = [ + 'uri' => $uri, + 'stamp' => $template->getEtag(), + ]; + } + return $result; + } + /** * generate setting config * @@ -189,6 +225,7 @@ public function generateSettingsConfig(string $type, string $userId): array { $config[$category] = $files; } + $config['template'] = $this->getPresentationTemplates($type, $userId); return $config; } @@ -268,15 +305,14 @@ private function refreshFolderEtag($type) { * @param string $fileName * @return string */ - private function generateFileUri(string $type, string $category, string $fileName, string $userId): string { - + private function generateFileUri(string $type, string $category, string $fileName, string $userId, ?int $identifier = null): string { // Passing userId is dangerous so we have to trim from url... if (strpos($type, '/') !== false) { $type = explode('/', $type)[0]; } $token = $this->generateIframeToken($type, $userId); - + return $this->urlGenerator->linkToRouteAbsolute( 'richdocuments.settings.getSettingsFile', [ @@ -284,6 +320,7 @@ private function generateFileUri(string $type, string $category, string $fileNam 'token' => $token['token'], 'category' => $category, 'name' => $fileName, + 'identifier' => $identifier, ] ); } @@ -302,13 +339,13 @@ public function getSettingsFile(string $type, string $category, string $name): I } catch (NotFoundException $e) { throw new NotFoundException("Type folder '{$type}' not found."); } - + try { $categoryFolder = $baseFolder->getFolder($category); } catch (NotFoundException $e) { throw new NotFoundException("Category folder '{$category}' not found in type '{$type}'."); } - + try { return $categoryFolder->getFile($name); } catch (NotFoundException $e) { @@ -337,7 +374,7 @@ public function deleteSettingsFile(string $type, string $category, string $name, throw new NotFoundException("User folder '{$userId}' not found."); } } - + try { $categoryFolder = $baseFolder->getFolder($category); } catch (NotFoundException $e) { diff --git a/lib/Service/TemplateFieldService.php b/lib/Service/TemplateFieldService.php index 917a23a6fc..d4fd1faf5f 100644 --- a/lib/Service/TemplateFieldService.php +++ b/lib/Service/TemplateFieldService.php @@ -177,7 +177,7 @@ public function fillFields(Node|int $file, array $fields = [], ?string $destinat $formFormat = [ 'name' => 'format', - 'contents' => $file->getExtension(), + 'contents' => $format === null ? $file->getExtension() : $format, ]; $form = RemoteOptionsService::getDefaultOptions(); @@ -191,13 +191,6 @@ public function fillFields(Node|int $file, array $fields = [], ?string $destinat $content = $response->getBody(); - if ($format !== null) { - $tmp = $this->tempManager->getTemporaryFile(); - file_put_contents($tmp, $content); - $fp = fopen($tmp, 'rb'); - $content = $this->remoteService->convertTo($file->getName(), $fp, $format); - } - if ($destination !== null) { $this->writeToDestination($destination, $content); } diff --git a/lib/TemplateManager.php b/lib/TemplateManager.php index b1709b3ebd..2281bb9a90 100644 --- a/lib/TemplateManager.php +++ b/lib/TemplateManager.php @@ -235,10 +235,10 @@ public function getSystemFormatted($type = null) { /** * Get all user templates - * + * @param $type * @return File[] */ - public function getUser($type = null) { + public function getUser($type = null): array { if ($this->userId === null) { return []; } diff --git a/package-lock.json b/package-lock.json index 610861bac0..dea8b6c0c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8873,9 +8873,9 @@ "license": "ISC" }, "node_modules/elliptic": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", - "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dev": true, "license": "MIT", "dependencies": { @@ -27189,9 +27189,9 @@ "dev": true }, "elliptic": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", - "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dev": true, "requires": { "bn.js": "^4.11.9",