From dc3b666635ae7e5daa49bc631bd23aa6f0c5293e Mon Sep 17 00:00:00 2001 From: kuaifan Date: Wed, 27 Apr 2022 07:20:11 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4office=E6=98=A0=E5=B0=84?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 9 +- docker/office/resources/api/documents/api.js | 1002 +++++++++++++++++ .../{ => main/resources}/css/app.css | 0 .../{ => main/resources}/css/app.css | 0 .../{ => main/resources}/css/app.css | 0 5 files changed, 1007 insertions(+), 4 deletions(-) create mode 100644 docker/office/resources/api/documents/api.js rename docker/office/resources/documenteditor/{ => main/resources}/css/app.css (100%) rename docker/office/resources/presentationeditor/{ => main/resources}/css/app.css (100%) rename docker/office/resources/spreadsheeteditor/{ => main/resources}/css/app.css (100%) diff --git a/docker-compose.yml b/docker-compose.yml index 24a7fea23..03b3f82c8 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -84,13 +84,14 @@ services: container_name: "dootask-office-${APP_ID}" image: "onlyoffice/documentserver:7.0.1.37" volumes: - - ./docker/office/data:/var/www/onlyoffice/Data - ./docker/office/logs:/var/log/onlyoffice - - ./docker/office/resources/documenteditor/css/app.css:/var/www/onlyoffice/documentserver/web-apps/apps/documenteditor/main/resources/css/app.css - - ./docker/office/resources/presentationeditor/css/app.css:/var/www/onlyoffice/documentserver/web-apps/apps/presentationeditor/main/resources/css/app.css - - ./docker/office/resources/spreadsheeteditor/css/app.css:/var/www/onlyoffice/documentserver/web-apps/apps/spreadsheeteditor/main/resources/css/app.css + - ./docker/office/data:/var/www/onlyoffice/Data + - ./docker/office/resources/api/documents/api.js:/var/www/onlyoffice/documentserver/web-apps/apps/api/documents/api.js + - ./docker/office/resources/documenteditor/main/resources/css/app.css:/var/www/onlyoffice/documentserver/web-apps/apps/documenteditor/main/resources/css/app.css - ./docker/office/resources/documenteditor/mobile/css/app.css:/var/www/onlyoffice/documentserver/web-apps/apps/documenteditor/mobile/css/app.css + - ./docker/office/resources/presentationeditor/main/resources/css/app.css:/var/www/onlyoffice/documentserver/web-apps/apps/presentationeditor/main/resources/css/app.css - ./docker/office/resources/presentationeditor/mobile/css/app.css:/var/www/onlyoffice/documentserver/web-apps/apps/presentationeditor/mobile/css/app.css + - ./docker/office/resources/spreadsheeteditor/main/resources/css/app.css:/var/www/onlyoffice/documentserver/web-apps/apps/spreadsheeteditor/main/resources/css/app.css - ./docker/office/resources/spreadsheeteditor/mobile/css/app.css:/var/www/onlyoffice/documentserver/web-apps/apps/spreadsheeteditor/mobile/css/app.css environment: TZ: "Asia/Shanghai" diff --git a/docker/office/resources/api/documents/api.js b/docker/office/resources/api/documents/api.js new file mode 100644 index 000000000..a1a0373ad --- /dev/null +++ b/docker/office/resources/api/documents/api.js @@ -0,0 +1,1002 @@ +/*! + * Copyright (c) Ascensio System SIA 2022. All rights reserved + * + * http://www.onlyoffice.com + * + * Version: 7.0.1 (build:37) + */ + +;(function(window) { + try { + window.localStorage.removeItem('ui-theme-id') + } catch () { } +})(window); + +;(function(DocsAPI, window, document, undefined) { + + /* + + # Full # + + config = { + type: 'desktop or mobile or embedded', + width: '100% by default', + height: '100% by default', + documentType: 'word' | 'cell' | 'slide',// deprecate 'text' | 'spreadsheet' | 'presentation', + token: encrypted signature + document: { + title: 'document title', + url: 'document url' + fileType: 'document file type', + options: , + key: 'key', + vkey: 'vkey', + info: { + owner: 'owner name', + folder: 'path to document', + uploaded: '', + sharingSettings: [ + { + user: 'user name', + permissions: '', + isLink: false + }, + ... + ], + favorite: '' // true/false/undefined (undefined - don't show fav. button) + }, + permissions: { + edit: , // default = true + download: , // default = true + reader: , + review: , // default = edit + print: , // default = true + comment: // default = edit, + modifyFilter: // default = true + modifyContentControl: // default = true + fillForms: // default = edit || review, + copy: // default = true, + editCommentAuthorOnly: // default = false + deleteCommentAuthorOnly: // default = false, + reviewGroups: ["Group1", ""] // current user can accept/reject review changes made by users from Group1 and users without a group. [] - use groups, but can't change any group's changes + commentGroups: { // {} - use groups, but can't view/edit/delete any group's comments + view: ["Group1", ""] // current user can view comments made by users from Group1 and users without a group. + edit: ["Group1", ""] // current user can edit comments made by users from Group1 and users without a group. + remove: ["Group1", ""] // current user can remove comments made by users from Group1 and users without a group. + }, + protect: // default = true. show/hide protect tab or protect buttons + } + }, + editorConfig: { + actionLink: { // open file and scroll to data, used with onMakeActionLink or the onRequestSendNotify event + action: { + type: "bookmark", // or type="comment" + data: // or comment id + } + }, + mode: 'view or edit', + lang: , + location: , + canCoAuthoring: , + canBackToFolder: - deprecated. use "customization.goback" parameter, + createUrl: 'create document url', + sharingSettingsUrl: 'document sharing settings url', + fileChoiceUrl: 'source url', // for mail merge or image from storage + callbackUrl: , + mergeFolderUrl: 'folder for saving merged file', // must be deprecated, use saveAsUrl instead + saveAsUrl: 'folder for saving files' + licenseUrl: , + customerId: , + region: // can be 'en-us' or lang code + + user: { + id: 'user id', + name: 'user name', + group: 'group name' // for customization.reviewPermissions parameter + }, + recent: [ + { + title: 'document title', + url: 'document url', + folder: 'path to document', + }, + ... + ], + templates: [ + { + title: 'template name', // name - is deprecated + image: 'template icon url', + url: 'http://...' + }, + ... + ], + customization: { + logo: { + image: url, + imageDark: url, // logo for dark theme + imageEmbedded: url, // deprecated, use image instead + url: http://... + }, + customer: { + name: 'SuperPuper', + address: 'New-York, 125f-25', + mail: 'support@gmail.com', + www: 'www.superpuper.com', + info: 'Some info', + logo: '', + logoDark: '', // logo for dark theme + }, + about: true, + feedback: { + visible: false, + url: http://... + }, + goback: { + url: 'http://...', + text: 'Go to London', + blank: true, + requestClose: false // if true - goback send onRequestClose event instead opening url + }, + reviewPermissions: { + "Group1": ["Group2"], // users from Group1 can accept/reject review changes made by users from Group2 + "Group2": ["Group1", "Group2"] // users from Group2 can accept/reject review changes made by users from Group1 and Group2 + "Group3": [""] // users from Group3 can accept/reject review changes made by users without a group + }, + anonymous: { // set name for anonymous user + request: bool (default: true), // enable set name + label: string (default: "Guest") // postfix for user name + }, + review: { + hideReviewDisplay: false, // hide button Review mode + hoverMode: false, // true - show review balloons on mouse move, not on click on text + showReviewChanges: false, + reviewDisplay: 'original', // original for viewer, markup for editor + trackChanges: undefined // true/false - open editor with track changes mode on/off, + }, + chat: true, + comments: true, + zoom: 100, + compactToolbar: false, + leftMenu: true, + rightMenu: true, + hideRightMenu: false, // hide or show right panel on first loading + toolbar: true, + statusBar: true, + autosave: true, + forcesave: false, + commentAuthorOnly: false, // must be deprecated. use permissions.editCommentAuthorOnly and permissions.deleteCommentAuthorOnly instead + showReviewChanges: false, // must be deprecated. use customization.review.showReviewChanges instead + help: true, + compactHeader: false, + toolbarNoTabs: false, + toolbarHideFileName: false, + reviewDisplay: 'original', // must be deprecated. use customization.review.reviewDisplay instead + spellcheck: true, + compatibleFeatures: false, + unit: 'cm' // cm, pt, inch, + mentionShare : true // customize tooltip for mention, + macros: true // can run macros in document + plugins: true // can run plugins in document + macrosMode: 'warn' // warn about automatic macros, 'enable', 'disable', 'warn', + trackChanges: undefined // true/false - open editor with track changes mode on/off, // must be deprecated. use customization.review.trackChanges instead + hideRulers: false // hide or show rulers on first loading (presentation or document editor) + hideNotes: false // hide or show notes panel on first loading (presentation editor) + uiTheme: 'theme-dark' // set interface theme: id or default-dark/default-light + }, + coEditing: { + mode: 'fast', // , 'fast' or 'strict'. if 'fast' and 'customization.autosave'=false -> set 'customization.autosave'=true + change: true, // can change co-authoring mode + }, + plugins: { + autostart: ['asc.{FFE1F462-1EA2-4391-990D-4CC84940B754}'], + pluginsData: [ + "helloworld/config.json", + "chess/config.json", + "speech/config.json", + "clipart/config.json", + ] + }, + wopi: { // only for wopi + FileNameMaxLength: 250 // max filename length for rename, 250 by default + } + }, + events: { + 'onAppReady': , + 'onDocumentStateChange': + 'onDocumentReady': + 'onRequestEditRights': , + 'onRequestHistory': ,// must call refreshHistory method + 'onRequestHistoryData': ,// must call setHistoryData method + 'onRequestRestore': , + 'onRequestHistoryClose': , + 'onError': , + 'onWarning': , + 'onInfo': ,// send view or edit mode + 'onOutdatedVersion': ,// send when previous version is opened + 'onDownloadAs': ,// send url of downloaded file as a response for downloadAs method + 'onRequestSaveAs': , + 'onCollaborativeChanges': ,// send when other user co-edit document + 'onRequestRename': , + 'onMetaChange': // send when meta information changed + 'onRequestClose': , + 'onMakeActionLink': ,// must call setActionLink method + 'onRequestUsers': ,// must call setUsers method + 'onRequestSendNotify': //send when user is mentioned in a comment, + 'onRequestInsertImage': ,// must call insertImage method + 'onRequestCompareFile': ,// must call setRevisedFile method + 'onRequestSharingSettings': ,// must call setSharingSettings method + 'onRequestCreateNew': , + } + } + + # Embedded # + + config = { + type: 'embedded', + width: '100% by default', + height: '100% by default', + documentType: 'word' | 'cell' | 'slide',// deprecate 'text' | 'spreadsheet' | 'presentation', + document: { + title: 'document title', + url: 'document url', + fileType: 'document file type', + key: 'key', + vkey: 'vkey' + }, + editorConfig: { + licenseUrl: , + customerId: , + autostart: 'document', // action for app's autostart. for presentations default value is 'player' + embedded: { + embedUrl: 'url', + fullscreenUrl: 'url', + saveUrl: 'url', + shareUrl: 'url', + toolbarDocked: 'top or bottom' + } + }, + events: { + 'onAppReady': , + 'onBack': , + 'onError': , + 'onDocumentReady': , + 'onWarning': + } + } + */ + + // TODO: allow several instances on one page simultaneously + + DocsAPI.DocEditor = function(placeholderId, config) { + var _self = this, + _config = config || {}; + + extend(_config, DocsAPI.DocEditor.defaultConfig); + _config.editorConfig.canUseHistory = _config.events && !!_config.events.onRequestHistory; + _config.editorConfig.canHistoryClose = _config.events && !!_config.events.onRequestHistoryClose; + _config.editorConfig.canHistoryRestore = _config.events && !!_config.events.onRequestRestore; + _config.editorConfig.canSendEmailAddresses = _config.events && !!_config.events.onRequestEmailAddresses; + _config.editorConfig.canRequestEditRights = _config.events && !!_config.events.onRequestEditRights; + _config.editorConfig.canRequestClose = _config.events && !!_config.events.onRequestClose; + _config.editorConfig.canRename = _config.events && !!_config.events.onRequestRename; + _config.editorConfig.canMakeActionLink = _config.events && !!_config.events.onMakeActionLink; + _config.editorConfig.canRequestUsers = _config.events && !!_config.events.onRequestUsers; + _config.editorConfig.canRequestSendNotify = _config.events && !!_config.events.onRequestSendNotify; + _config.editorConfig.mergeFolderUrl = _config.editorConfig.mergeFolderUrl || _config.editorConfig.saveAsUrl; + _config.editorConfig.canRequestSaveAs = _config.events && !!_config.events.onRequestSaveAs; + _config.editorConfig.canRequestInsertImage = _config.events && !!_config.events.onRequestInsertImage; + _config.editorConfig.canRequestMailMergeRecipients = _config.events && !!_config.events.onRequestMailMergeRecipients; + _config.editorConfig.canRequestCompareFile = _config.events && !!_config.events.onRequestCompareFile; + _config.editorConfig.canRequestSharingSettings = _config.events && !!_config.events.onRequestSharingSettings; + _config.editorConfig.canRequestCreateNew = _config.events && !!_config.events.onRequestCreateNew; + _config.frameEditorId = placeholderId; + _config.parentOrigin = window.location.origin; + + var onMouseUp = function (evt) { + _processMouse(evt); + }; + + var _attachMouseEvents = function() { + if (window.addEventListener) { + window.addEventListener("mouseup", onMouseUp, false) + } else if (window.attachEvent) { + window.attachEvent("onmouseup", onMouseUp); + } + }; + + var _detachMouseEvents = function() { + if (window.removeEventListener) { + window.removeEventListener("mouseup", onMouseUp, false) + } else if (window.detachEvent) { + window.detachEvent("onmouseup", onMouseUp); + } + }; + + var _onAppReady = function() { + if (_config.type === 'mobile') { + document.body.onfocus = function(e) { + setTimeout(function(){ + iframe.contentWindow.focus(); + + _sendCommand({ + command: 'resetFocus', + data: {} + }) + }, 10); + }; + } + + _attachMouseEvents(); + + if (_config.editorConfig) { + _init(_config.editorConfig); + } + + if (_config.document) { + _openDocument(_config.document); + } + }; + + var _callLocalStorage = function(data) { + if (data.cmd == 'get') { + if (data.keys && data.keys.length) { + var af = data.keys.split(','), re = af[0]; + for (i = 0; ++i < af.length;) + re += '|' + af[i]; + + re = new RegExp(re); k = {}; + for (i in localStorage) + if (re.test(i)) k[i] = localStorage[i]; + } else { + k = localStorage; + } + + _sendCommand({ + command: 'internalCommand', + data: { + type: 'localstorage', + keys: k + } + }); + } else + if (data.cmd == 'set') { + var k = data.keys, i; + for (i in k) { + localStorage.setItem(i, k[i]); + } + } + }; + + var _onMessage = function(msg) { + if ( msg ) { + if ( msg.type === "onExternalPluginMessage" ) { + _sendCommand(msg); + } else if (msg.type === "onExternalPluginMessageCallback") { + postMessage(window.parent, msg); + } else + if ( msg.frameEditorId == placeholderId ) { + var events = _config.events || {}, + handler = events[msg.event], + res; + + if (msg.event === 'onRequestEditRights' && !handler) { + _applyEditRights(false, 'handler isn\'t defined'); + } else if (msg.event === 'onInternalMessage' && msg.data && msg.data.type == 'localstorage') { + _callLocalStorage(msg.data.data); + } else { + if (msg.event === 'onAppReady') { + _onAppReady(); + } + + if (handler && typeof handler == "function") { + res = handler.call(_self, {target: _self, data: msg.data}); + } + } + } + } + }; + + var _checkConfigParams = function() { + if (_config.document) { + if (!_config.document.url || ((typeof _config.document.fileType !== 'string' || _config.document.fileType=='') && + (typeof _config.documentType !== 'string' || _config.documentType==''))) { + window.alert("One or more required parameter for the config object is not set"); + return false; + } + + var appMap = { + 'text': 'docx', + 'text-pdf': 'pdf', + 'spreadsheet': 'xlsx', + 'presentation': 'pptx', + 'word': 'docx', + 'cell': 'xlsx', + 'slide': 'pptx' + }, app; + + if (_config.documentType=='text' || _config.documentType=='spreadsheet' ||_config.documentType=='presentation') + console.warn("The \"documentType\" parameter for the config object must take one of the values word/cell/slide."); + + if (typeof _config.documentType === 'string' && _config.documentType != '') { + app = appMap[_config.documentType.toLowerCase()]; + if (!app) { + window.alert("The \"documentType\" parameter for the config object is invalid. Please correct it."); + return false; + } else if (typeof _config.document.fileType !== 'string' || _config.document.fileType == '') { + _config.document.fileType = app; + } + } + + if (typeof _config.document.fileType === 'string' && _config.document.fileType != '') { + _config.document.fileType = _config.document.fileType.toLowerCase(); + var type = /^(?:(xls|xlsx|ods|csv|xlst|xlsy|gsheet|xlsm|xlt|xltm|xltx|fods|ots)|(pps|ppsx|ppt|pptx|odp|pptt|ppty|gslides|pot|potm|potx|ppsm|pptm|fodp|otp)|(doc|docx|doct|odt|gdoc|txt|rtf|pdf|mht|htm|html|epub|djvu|xps|oxps|docm|dot|dotm|dotx|fodt|ott|fb2|xml|oform|docxf))$/ + .exec(_config.document.fileType); + if (!type) { + window.alert("The \"document.fileType\" parameter for the config object is invalid. Please correct it."); + return false; + } else if (typeof _config.documentType !== 'string' || _config.documentType == ''){ + if (typeof type[1] === 'string') _config.documentType = 'cell'; else + if (typeof type[2] === 'string') _config.documentType = 'slide'; else + if (typeof type[3] === 'string') _config.documentType = 'word'; + } + } + + var type = /^(?:(pdf|djvu|xps|oxps))$/.exec(_config.document.fileType); + if (type && typeof type[1] === 'string') { + _config.editorConfig.canUseHistory = false; + } + + if (!_config.document.title || _config.document.title=='') + _config.document.title = 'Unnamed.' + _config.document.fileType; + + if (!_config.document.key) { + _config.document.key = 'xxxxxxxxxxxxxxxxxxxx'.replace(/[x]/g, function (c) {var r = Math.random() * 16 | 0; return r.toString(16);}); + } else if (typeof _config.document.key !== 'string') { + window.alert("The \"document.key\" parameter for the config object must be string. Please correct it."); + return false; + } + + if (_config.editorConfig.user && _config.editorConfig.user.id && (typeof _config.editorConfig.user.id == 'number')) { + _config.editorConfig.user.id = _config.editorConfig.user.id.toString(); + console.warn("The \"id\" parameter for the editorConfig.user object must be a string."); + } + + _config.document.token = _config.token; + } + + return true; + }; + + (function() { + var result = /[\?\&]placement=(\w+)&?/.exec(window.location.search); + if (!!result && result.length) { + if (result[1] == 'desktop') { + _config.editorConfig.targetApp = result[1]; + // _config.editorConfig.canBackToFolder = false; + if (!_config.editorConfig.customization) _config.editorConfig.customization = {}; + _config.editorConfig.customization.about = false; + _config.editorConfig.customization.compactHeader = false; + } + } + })(); + + var target = document.getElementById(placeholderId), + iframe; + + if (target && _checkConfigParams()) { + iframe = createIframe(_config); + if (iframe.src) { + var pathArray = iframe.src.split('/'); + this.frameOrigin = pathArray[0] + '//' + pathArray[2]; + } + target.parentNode && target.parentNode.replaceChild(iframe, target); + var _msgDispatcher = new MessageDispatcher(_onMessage, this); + } + + /* + cmd = { + command: 'commandName', + data: + } + */ + + var _destroyEditor = function(cmd) { + var target = document.createElement("div"); + target.setAttribute('id', placeholderId); + + if (iframe) { + _msgDispatcher && _msgDispatcher.unbindEvents(); + _detachMouseEvents(); + iframe.parentNode && iframe.parentNode.replaceChild(target, iframe); + } + }; + + var _sendCommand = function(cmd) { + if (iframe && iframe.contentWindow) + postMessage(iframe.contentWindow, cmd); + }; + + var _init = function(editorConfig) { + _sendCommand({ + command: 'init', + data: { + config: editorConfig + } + }); + }; + + var _openDocument = function(doc) { + _sendCommand({ + command: 'openDocument', + data: { + doc: doc + } + }); + }; + + var _showMessage = function(title, msg) { + msg = msg || title; + _sendCommand({ + command: 'showMessage', + data: { + msg: msg + } + }); + }; + + var _applyEditRights = function(allowed, message) { + _sendCommand({ + command: 'applyEditRights', + data: { + allowed: allowed, + message: message + } + }); + }; + + var _processSaveResult = function(result, message) { + _sendCommand({ + command: 'processSaveResult', + data: { + result: result, + message: message + } + }); + }; + + // TODO: remove processRightsChange, use denyEditingRights + var _processRightsChange = function(enabled, message) { + _sendCommand({ + command: 'processRightsChange', + data: { + enabled: enabled, + message: message + } + }); + }; + + var _denyEditingRights = function(message) { + _sendCommand({ + command: 'processRightsChange', + data: { + enabled: false, + message: message + } + }); + }; + + var _refreshHistory = function(data, message) { + _sendCommand({ + command: 'refreshHistory', + data: { + data: data, + message: message + } + }); + }; + + var _setHistoryData = function(data, message) { + _sendCommand({ + command: 'setHistoryData', + data: { + data: data, + message: message + } + }); + }; + + var _setEmailAddresses = function(data) { + _sendCommand({ + command: 'setEmailAddresses', + data: { + data: data + } + }); + }; + + var _setActionLink = function (data) { + _sendCommand({ + command: 'setActionLink', + data: { + url: data + } + }); + }; + + var _processMailMerge = function(enabled, message) { + _sendCommand({ + command: 'processMailMerge', + data: { + enabled: enabled, + message: message + } + }); + }; + + var _downloadAs = function(data) { + _sendCommand({ + command: 'downloadAs', + data: data + }); + }; + + var _setUsers = function(data) { + _sendCommand({ + command: 'setUsers', + data: data + }); + }; + + var _showSharingSettings = function(data) { + _sendCommand({ + command: 'showSharingSettings', + data: data + }); + }; + + var _setSharingSettings = function(data) { + _sendCommand({ + command: 'setSharingSettings', + data: data + }); + }; + + var _insertImage = function(data) { + _sendCommand({ + command: 'insertImage', + data: data + }); + }; + + var _setMailMergeRecipients = function(data) { + _sendCommand({ + command: 'setMailMergeRecipients', + data: data + }); + }; + + var _setRevisedFile = function(data) { + _sendCommand({ + command: 'setRevisedFile', + data: data + }); + }; + + var _setFavorite = function(data) { + _sendCommand({ + command: 'setFavorite', + data: data + }); + }; + + var _requestClose = function(data) { + _sendCommand({ + command: 'requestClose', + data: data + }); + }; + + var _processMouse = function(evt) { + var r = iframe.getBoundingClientRect(); + var data = { + type: evt.type, + x: evt.x - r.left, + y: evt.y - r.top, + event: evt + }; + + _sendCommand({ + command: 'processMouse', + data: data + }); + }; + + var _grabFocus = function(data) { + setTimeout(function(){ + _sendCommand({ + command: 'grabFocus', + data: data + }); + }, 10); + }; + + var _blurFocus = function(data) { + _sendCommand({ + command: 'blurFocus', + data: data + }); + }; + + var _serviceCommand = function(command, data) { + _sendCommand({ + command: 'internalCommand', + data: { + command: command, + data: data + } + }); + }; + + return { + showMessage : _showMessage, + processSaveResult : _processSaveResult, + processRightsChange : _processRightsChange, + denyEditingRights : _denyEditingRights, + refreshHistory : _refreshHistory, + setHistoryData : _setHistoryData, + setEmailAddresses : _setEmailAddresses, + setActionLink : _setActionLink, + processMailMerge : _processMailMerge, + downloadAs : _downloadAs, + serviceCommand : _serviceCommand, + attachMouseEvents : _attachMouseEvents, + detachMouseEvents : _detachMouseEvents, + destroyEditor : _destroyEditor, + setUsers : _setUsers, + showSharingSettings : _showSharingSettings, + setSharingSettings : _setSharingSettings, + insertImage : _insertImage, + setMailMergeRecipients: _setMailMergeRecipients, + setRevisedFile : _setRevisedFile, + setFavorite : _setFavorite, + requestClose : _requestClose, + grabFocus : _grabFocus, + blurFocus : _blurFocus + } + }; + + + DocsAPI.DocEditor.defaultConfig = { + type: 'desktop', + width: '100%', + height: '100%', + editorConfig: { + lang: 'en', + canCoAuthoring: true, + customization: { + about: true, + feedback: false + } + } + }; + + DocsAPI.DocEditor.version = function() { + return '7.0.1'; + }; + + MessageDispatcher = function(fn, scope) { + var _fn = fn, + _scope = scope || window, + eventFn = function(msg) { + _onMessage(msg); + }; + + var _bindEvents = function() { + if (window.addEventListener) { + window.addEventListener("message", eventFn, false) + } + else if (window.attachEvent) { + window.attachEvent("onmessage", eventFn); + } + }; + + var _unbindEvents = function() { + if (window.removeEventListener) { + window.removeEventListener("message", eventFn, false) + } + else if (window.detachEvent) { + window.detachEvent("onmessage", eventFn); + } + }; + + var _onMessage = function(msg) { + // TODO: check message origin + if (msg && window.JSON && _scope.frameOrigin==msg.origin ) { + + try { + var msg = window.JSON.parse(msg.data); + if (_fn) { + _fn.call(_scope, msg); + } + } catch(e) {} + } + }; + + _bindEvents.call(this); + + return { + unbindEvents: _unbindEvents + } + }; + + function getBasePath() { + var scripts = document.getElementsByTagName('script'), + match; + + for (var i = scripts.length - 1; i >= 0; i--) { + match = scripts[i].src.match(/(.*)api\/documents\/api.js/i); + if (match) { + return match[1]; + } + } + + return ""; + } + + function getExtensionPath() { + if ("undefined" == typeof(extensionParams) || null == extensionParams["url"]) + return null; + return extensionParams["url"] + "apps/"; + } + + function getAppPath(config) { + var extensionPath = getExtensionPath(), + path = extensionPath ? extensionPath : getBasePath(), + appMap = { + 'text': 'documenteditor', + 'text-pdf': 'documenteditor', + 'spreadsheet': 'spreadsheeteditor', + 'presentation': 'presentationeditor', + 'word': 'documenteditor', + 'cell': 'spreadsheeteditor', + 'slide': 'presentationeditor' + }, + app = appMap['word']; + + if (typeof config.documentType === 'string') { + app = appMap[config.documentType.toLowerCase()]; + } else + if (!!config.document && typeof config.document.fileType === 'string') { + var type = /^(?:(xls|xlsx|ods|csv|xlst|xlsy|gsheet|xlsm|xlt|xltm|xltx|fods|ots)|(pps|ppsx|ppt|pptx|odp|pptt|ppty|gslides|pot|potm|potx|ppsm|pptm|fodp|otp))$/ + .exec(config.document.fileType); + if (type) { + if (typeof type[1] === 'string') app = appMap['cell']; else + if (typeof type[2] === 'string') app = appMap['slide']; + } + } + + var userAgent = navigator.userAgent.toLowerCase(), + check = function(regex){ return regex.test(userAgent); }, + isIE = !check(/opera/) && (check(/msie/) || check(/trident/) || check(/edge/)), + isChrome = !isIE && check(/\bchrome\b/), + isSafari_mobile = !isIE && !isChrome && check(/safari/) && (navigator.maxTouchPoints>0), + path_type; + + path += app + "/"; + path_type = (config.type === "mobile" || isSafari_mobile) + ? "mobile" : (config.type === "embedded") + ? "embed" : (config.document && typeof config.document.fileType === 'string' && config.document.fileType.toLowerCase() === 'oform') + ? "forms" : "main"; + + path += path_type; + var index = "/index.html"; + if (config.editorConfig && path_type!=="forms") { + var customization = config.editorConfig.customization; + if ( typeof(customization) == 'object' && ( customization.toolbarNoTabs || + (config.editorConfig.targetApp!=='desktop') && (customization.loaderName || customization.loaderLogo))) { + index = "/index_loader.html"; + } else if (config.editorConfig.mode === 'editdiagram' || config.editorConfig.mode === 'editmerge') + index = "/index_internal.html"; + + } + path += index; + return path; + } + + function getAppParameters(config) { + var params = "?_dc=7.0.1-37"; + + if (config.editorConfig && config.editorConfig.lang) + params += "&lang=" + config.editorConfig.lang; + + if (config.editorConfig && config.editorConfig.targetApp!=='desktop') { + if ( (typeof(config.editorConfig.customization) == 'object') && config.editorConfig.customization.loaderName) { + if (config.editorConfig.customization.loaderName !== 'none') params += "&customer=" + encodeURIComponent(config.editorConfig.customization.loaderName); + } else + params += "&customer=ONLYOFFICE"; + if ( (typeof(config.editorConfig.customization) == 'object') && config.editorConfig.customization.loaderLogo) { + if (config.editorConfig.customization.loaderLogo !== '') params += "&logo=" + encodeURIComponent(config.editorConfig.customization.loaderLogo); + } else if ( (typeof(config.editorConfig.customization) == 'object') && config.editorConfig.customization.logo) { + if (config.type=='embedded' && (config.editorConfig.customization.logo.image || config.editorConfig.customization.logo.imageEmbedded)) + params += "&headerlogo=" + encodeURIComponent(config.editorConfig.customization.logo.image || config.editorConfig.customization.logo.imageEmbedded); + else if (config.type!='embedded' && (config.editorConfig.customization.logo.image || config.editorConfig.customization.logo.imageDark)) { + config.editorConfig.customization.logo.image && (params += "&headerlogo=" + encodeURIComponent(config.editorConfig.customization.logo.image)); + config.editorConfig.customization.logo.imageDark && (params += "&headerlogodark=" + encodeURIComponent(config.editorConfig.customization.logo.imageDark)); + } + } + } + + if (config.editorConfig && (config.editorConfig.mode == 'editdiagram' || config.editorConfig.mode == 'editmerge')) + params += "&internal=true"; + + if (config.frameEditorId) + params += "&frameEditorId=" + config.frameEditorId; + + if (config.editorConfig && config.editorConfig.mode == 'view' || + config.document && config.document.permissions && (config.document.permissions.edit === false && !config.document.permissions.review )) + params += "&mode=view"; + + if (config.editorConfig && config.editorConfig.customization && !!config.editorConfig.customization.compactHeader) + params += "&compact=true"; + + if (config.editorConfig && config.editorConfig.customization && (config.editorConfig.customization.toolbar===false)) + params += "&toolbar=false"; + else if (config.document && config.document.permissions && (config.document.permissions.edit === false && config.document.permissions.fillForms )) + params += "&toolbar=true"; + + if (config.parentOrigin) + params += "&parentOrigin=" + config.parentOrigin; + + if (config.editorConfig && config.editorConfig.customization && config.editorConfig.customization.uiTheme ) + params += "&uitheme=" + config.editorConfig.customization.uiTheme; + + return params; + } + + function createIframe(config) { + var iframe = document.createElement("iframe"); + + iframe.src = getAppPath(config) + getAppParameters(config); + iframe.width = config.width; + iframe.height = config.height; + iframe.align = "top"; + iframe.frameBorder = 0; + iframe.name = "frameEditor"; + iframe.allowFullscreen = true; + iframe.setAttribute("allowfullscreen",""); // for IE11 + iframe.setAttribute("onmousewheel",""); // for Safari on Mac + iframe.setAttribute("allow", "autoplay; camera; microphone; display-capture"); + + if (config.type == "mobile") + { + iframe.style.position = "fixed"; + iframe.style.overflow = "hidden"; + document.body.style.overscrollBehaviorY = "contain"; + } + return iframe; + } + + function postMessage(wnd, msg) { + if (wnd && wnd.postMessage && window.JSON) { + // TODO: specify explicit origin + wnd.postMessage(window.JSON.stringify(msg), "*"); + } + + } + + function extend(dest, src) { + for (var prop in src) { + if (src.hasOwnProperty(prop)) { + if (typeof dest[prop] === 'undefined') { + dest[prop] = src[prop]; + } else + if (typeof dest[prop] === 'object' && + typeof src[prop] === 'object') { + extend(dest[prop], src[prop]) + } + } + } + return dest; + } + +})(window.DocsAPI = window.DocsAPI || {}, window, document); diff --git a/docker/office/resources/documenteditor/css/app.css b/docker/office/resources/documenteditor/main/resources/css/app.css similarity index 100% rename from docker/office/resources/documenteditor/css/app.css rename to docker/office/resources/documenteditor/main/resources/css/app.css diff --git a/docker/office/resources/presentationeditor/css/app.css b/docker/office/resources/presentationeditor/main/resources/css/app.css similarity index 100% rename from docker/office/resources/presentationeditor/css/app.css rename to docker/office/resources/presentationeditor/main/resources/css/app.css diff --git a/docker/office/resources/spreadsheeteditor/css/app.css b/docker/office/resources/spreadsheeteditor/main/resources/css/app.css similarity index 100% rename from docker/office/resources/spreadsheeteditor/css/app.css rename to docker/office/resources/spreadsheeteditor/main/resources/css/app.css