Skip to content
Draft
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
2 changes: 1 addition & 1 deletion assets/document-formats
3 changes: 3 additions & 0 deletions lib/Preview.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@
namespace OCA\Onlyoffice;

use OC\Files\View;
use OCP\Files\File;
use OCP\IImage;
use OCP\Preview\IProviderV2;
use OCA\Files_Sharing\External\Storage as SharingExternalStorage;
use OCA\Files_Versions\Versions\IVersionManager;
use OCP\AppFramework\QueryException;
Expand Down
1,335 changes: 227 additions & 1,108 deletions npm-shrinkwrap.json

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@
"dependencies": {
"@nextcloud/auth": "^2.5.1",
"@nextcloud/event-bus": "^3.3.1",
"@nextcloud/files": "^3.0.0",
"@nextcloud/files": "^4.0.0-beta.8",
"@nextcloud/initial-state": "^2.2.0",
"@nextcloud/l10n": "^3.4.1",
"@nextcloud/router": "^3.1.0",
"@nextcloud/sharing": "^0.2.4",
"@nextcloud/vue": "^8.0.0",
"@nextcloud/vue": "^8.35.2",
"vue": "^2.7.16"
},
"devDependencies": {
Expand Down
18 changes: 18 additions & 0 deletions src/editor.js
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,7 @@
config.events.onRequestReferenceSource = OCA.Onlyoffice.onRequestReferenceSource
config.events.onMetaChange = OCA.Onlyoffice.onMetaChange
config.events.onRequestRefreshFile = OCA.Onlyoffice.onRequestRefreshFile
config.events.onRequestSmartPicker = OCA.Onlyoffice.onRequestSmartPicker

if (OCA.Onlyoffice.currentUser.uid) {
config.events.onRequestUsers = OCA.Onlyoffice.onRequestUsers
Expand Down Expand Up @@ -376,6 +377,16 @@
})
}

OCA.Onlyoffice.editorInsertLink = function(link) {
OCA.Onlyoffice.docEditor.insertLink(link)

}

OCA.Onlyoffice.editorInsertPlainText = function(text) {
OCA.Onlyoffice.docEditor.insertPlainText(text)

}

OCA.Onlyoffice.onRequestMailMergeRecipients = function() {
const recipientMimes = [
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
Expand Down Expand Up @@ -444,6 +455,13 @@
'*')
}

OCA.Onlyoffice.onRequestSmartPicker = function() {
window.parent.postMessage({
method: 'editorRequestSmartPicker',
},
'*')
}

OCA.Onlyoffice.onRequestSharingSettings = function() {
window.parent.postMessage({
method: 'editorRequestSharingSettings',
Expand Down
29 changes: 29 additions & 0 deletions src/listener.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@

/* global _, $ */

import { getLinkWithPicker } from '@nextcloud/vue/dist/Components/NcRichText.js'

/**
* @param {object} OCA Nextcloud OCA object
*/
Expand Down Expand Up @@ -67,6 +69,30 @@
saveData.dir)
}

OCA.Onlyoffice.onSmartPickerRequest = async function() {
try {
if (this.showLinkPicker) {
return
}
this.showLinkPicker = true
const link = await getLinkWithPicker(null, true)
try {
const url = new URL(link)
if (url.protocol === 'http:' || url.protocol === 'https:') {
$(OCA.Onlyoffice.frameSelector)[0].contentWindow.OCA.Onlyoffice.editorInsertLink(link)
return
}
} catch (e) {
console.debug('error when parsing the link picker result')
}
$(OCA.Onlyoffice.frameSelector)[0].contentWindow.OCA.Onlyoffice.editorInsertPlainText(link)
} catch (e) {
console.error('Link picker promise rejected :', e)
} finally {
this.showLinkPicker = false
}
}

OCA.Onlyoffice.onRequestInsertImage = function(imageMimes) {
OC.dialogs.filepicker(t(OCA.Onlyoffice.AppName, 'Insert image'),
$(OCA.Onlyoffice.frameSelector)[0].contentWindow.OCA.Onlyoffice.editorInsertImage,
Expand Down Expand Up @@ -180,6 +206,9 @@
case 'onShowMessage':
OCA.Onlyoffice.onShowMessage(event.data.param)
break
case 'editorRequestSmartPicker':
OCA.Onlyoffice.onSmartPickerRequest()
break
}
}, false)

Expand Down
101 changes: 63 additions & 38 deletions src/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,18 @@
import {
File,
FileAction,
getSidebar,
registerFileAction,
Permission,
DefaultType,
addNewFileMenuEntry,
davGetClient,
davRootPath,
davGetDefaultPropfind,
davResultToNode,
} from '@nextcloud/files'
import {
getClient,
getRootPath,
getDefaultPropfind,
resultToNode,
} from '@nextcloud/files/dav'
import { emit } from '@nextcloud/event-bus'
import AppDarkSvg from '!!raw-loader!../img/app-dark.svg'
import NewDocxSvg from '!!raw-loader!../img/new-docx.svg'
Expand Down Expand Up @@ -210,8 +213,9 @@ import { loadState } from '@nextcloud/initial-state'

$('body').addClass('onlyoffice-inline')

if (OCA.Files.Sidebar) {
OCA.Files.Sidebar.close()
const sidebar = getSidebar()
if (sidebar) {
sidebar.close()
}

const scrollTop = $('#app-content').scrollTop()
Expand Down Expand Up @@ -248,21 +252,39 @@ import { loadState } from '@nextcloud/initial-state'

OCA.Onlyoffice.OpenShareDialog = function() {
if (OCA.Onlyoffice.context) {
const sidebar = getSidebar()
if (!$('#app-sidebar-vue').is(':visible')) {
OCA.Files.Sidebar.open(OCA.Onlyoffice.context.dir + '/' + OCA.Onlyoffice.context.fileName)
OCA.Files.Sidebar.setActiveTab('sharing')
const client = getClient()
client.stat(`${getRootPath()}${OCA.Onlyoffice.context.dir + '/' + OCA.Onlyoffice.context.fileName}`, {
details: true,
data: getDefaultPropfind(),
}).then((result) => {
const node = resultToNode(result.data)
emit('files:node:updated', node)
sidebar.open(node)
sidebar.setActiveTab('sharing')
})
} else {
OCA.Files.Sidebar.close()
sidebar.close()
}
}
}

OCA.Onlyoffice.RefreshVersionsDialog = function() {
if (OCA.Onlyoffice.context) {
const sidebar = getSidebar()
if ($('#app-sidebar-vue').is(':visible')) {
OCA.Files.Sidebar.close()
OCA.Files.Sidebar.open(OCA.Onlyoffice.context.dir + '/' + OCA.Onlyoffice.context.fileName)
OCA.Files.Sidebar.setActiveTab('versionsTabView')
sidebar.close()
const client = getClient()
client.stat(`${getRootPath()}${OCA.Onlyoffice.context.dir + '/' + OCA.Onlyoffice.context.fileName}`, {
details: true,
data: getDefaultPropfind(),
}).then((result) => {
const node = resultToNode(result.data)
emit('files:node:updated', node)
sidebar.open(node)
sidebar.setActiveTab('versionsTabView')
})
}
}
}
Expand All @@ -278,16 +300,18 @@ import { loadState } from '@nextcloud/initial-state'
OCA.Onlyoffice.context.fileName = fileName
}

OCA.Onlyoffice.FileClickExec = async function(file, view, dir, isDefault = true) {
OCA.Onlyoffice.FileClickExec = async function({ nodes, view, dir, isDefault = true }) {
const file = nodes[0]

if (OCA.Onlyoffice.context !== null && OCA.Onlyoffice.setting.sameTab && !OCA.Onlyoffice.Desktop) {
return null
}

OCA.Onlyoffice.OpenEditor(file.fileid, dir, file.basename, 0, isDefault)
OCA.Onlyoffice.OpenEditor(file.fileid, file.dirname, file.basename, 0, isDefault)

OCA.Onlyoffice.context = {
fileName: file.basename,
dir,
dir: file.dirname,
}

return null
Expand Down Expand Up @@ -439,11 +463,11 @@ import { loadState } from '@nextcloud/initial-state'
const targetFolderPath = OC.dirname(filePath)

if (!dialogFileList) {
const results = await davGetClient().getDirectoryContents(davRootPath + targetFolderPath, {
const results = await getClient().getDirectoryContents(getRootPath() + targetFolderPath, {
details: true,
data: davGetDefaultPropfind(),
data: getDefaultPropfind(),
})
dialogFileList = results.data.map((result) => davResultToNode(result))
dialogFileList = results.data.map((result) => resultToNode(result))
}

if (type === 'target') {
Expand Down Expand Up @@ -560,13 +584,14 @@ import { loadState } from '@nextcloud/initial-state'
id: 'onlyoffice-open-def',
displayName: () => t(OCA.Onlyoffice.AppName, 'Open in ONLYOFFICE'),
iconSvgInline: () => AppDarkSvg,
enabled: (files) => {
const config = getConfig(files[0])
enabled: ({ nodes }) => {
const file = nodes[0]
const config = getConfig(file)

if (!config) return false
if (!config.def) return false

if (Permission.READ !== (files[0].permissions & Permission.READ)) { return false }
if (Permission.READ !== (file.permissions & Permission.READ)) { return false }

return true
},
Expand All @@ -579,38 +604,38 @@ import { loadState } from '@nextcloud/initial-state'
id: 'onlyoffice-open',
displayName: () => t(OCA.Onlyoffice.AppName, 'Open in ONLYOFFICE'),
iconSvgInline: () => AppDarkSvg,
enabled: (files) => {
const config = getConfig(files[0])
enabled: ({ nodes }) => {
const config = getConfig(nodes[0])

if (!config) return false
if (config.def) return false

if (Permission.READ !== (files[0].permissions & Permission.READ)) { return false }
if (Permission.READ !== (nodes[0].permissions & Permission.READ)) { return false }

return true
},
exec(file, view, dir) {
OCA.Onlyoffice.FileClickExec(file, view, dir, false)
exec({ nodes, view, dir }) {
OCA.Onlyoffice.FileClickExec(nodes[0], view, dir, false)
},
}))

registerFileAction(new FileAction({
id: 'onlyoffice-convert',
displayName: () => t(OCA.Onlyoffice.AppName, 'Convert with ONLYOFFICE'),
iconSvgInline: () => AppDarkSvg,
enabled: (files) => {
const config = getConfig(files[0])
enabled: ({ nodes }) => {
const config = getConfig(nodes[0])

if (!config) return false
if (!config.conv) return false

const required = isPublicShare() ? Permission.UPDATE : Permission.READ
if (required !== (files[0].permissions & required)) { return false }
if (required !== (nodes[0].permissions & required)) { return false }

if (files[0].attributes['mount-type'] === 'shared') {
if (required !== (files[0].attributes['share-permissions'] & required)) { return false }
if (nodes[0].attributes['mount-type'] === 'shared') {
if (required !== (nodes[0].attributes['share-permissions'] & required)) { return false }

const attributes = JSON.parse(files[0].attributes['share-attributes'])
const attributes = JSON.parse(nodes[0].attributes['share-attributes'])
const downloadAttribute = attributes.find((attribute) => attribute.scope === 'permissions' && attribute.key === 'download')
if (downloadAttribute !== undefined && downloadAttribute.enabled === false) { return false }
}
Expand All @@ -624,19 +649,19 @@ import { loadState } from '@nextcloud/initial-state'
id: 'onlyoffice-create-form',
displayName: () => t(OCA.Onlyoffice.AppName, 'Create form'),
iconSvgInline: () => AppDarkSvg,
enabled: (files) => {
const config = getConfig(files[0])
enabled: ({ nodes }) => {
const config = getConfig(nodes[0])

if (!config) return false
if (!config.createForm) return false

const required = isPublicShare() ? Permission.UPDATE : Permission.READ
if (required !== (files[0].permissions & required)) { return false }
if (required !== (nodes[0].permissions & required)) { return false }

if (files[0].attributes['mount-type'] === 'shared') {
if (required !== (files[0].attributes['share-permissions'] & required)) { return false }
if (nodes[0].attributes['mount-type'] === 'shared') {
if (required !== (nodes[0].attributes['share-permissions'] & required)) { return false }

const attributes = JSON.parse(files[0].attributes['share-attributes'])
const attributes = JSON.parse(nodes[0].attributes['share-attributes'])
const downloadAttribute = attributes.find((attribute) => attribute.scope === 'permissions' && attribute.key === 'download')
if (downloadAttribute !== undefined && downloadAttribute.enabled === false) { return false }
}
Expand Down