diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..6fac664 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "src/onlyoffice/connector/browser/app_data"] + path = src/onlyoffice/connector/browser/app_data + url = https://github.com/ONLYOFFICE/document-templates + branch = main/new diff --git a/CHANGELOG.md b/CHANGELOG.md index cf17b2d..3670c94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 2.1.0 +## Added +- support docxf and oform formats +- create blank docxf from creation menu +- "save as" in editor + ## 2.0.0 ## Added - JWT support diff --git a/README.md b/README.md index 53a1387..c695e42 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Plone ONLYOFFICE integration plugin +# Plone ONLYOFFICE integration plugin This plugin allows users to edit office documents within [Plone](https://plone.org/) using ONLYOFFICE Docs packaged as Document Server - [Community or Enterprise Edition](#onlyoffice-docs-editions). @@ -12,7 +12,7 @@ The plugin allows to: Supported formats: -* For viewing and editing: DOCX, XLSX, PPTX. +* For viewing and editing: DOCX, XLSX, PPTX, DOCXF, OFORM. * For viewing only: PDF, ODT, ODS, ODP, DOC, XLS, PPT. ## Installing ONLYOFFICE Docs @@ -137,22 +137,25 @@ The table below will help you make the right choice. | Pricing and licensing | Community Edition | Enterprise Edition | | ------------- | ------------- | ------------- | -| | [Get it now](https://www.onlyoffice.com/download.aspx?utm_source=github&utm_medium=cpc&utm_campaign=GitHubPlone) | [Start Free Trial](https://www.onlyoffice.com/enterprise-edition-free.aspx?utm_source=github&utm_medium=cpc&utm_campaign=GitHubPlone) | -| Cost | FREE | [Go to the pricing page](https://www.onlyoffice.com/enterprise-edition.aspx?utm_source=github&utm_medium=cpc&utm_campaign=GitHubPlone) | +| | [Get it now](https://www.onlyoffice.com/download-docs.aspx?utm_source=github&utm_medium=cpc&utm_campaign=GitHubPlone#docs-community) | [Start Free Trial](https://www.onlyoffice.com/download-docs.aspx?utm_source=github&utm_medium=cpc&utm_campaign=GitHubPlone#docs-enterprise) | +| Cost | FREE | [Go to the pricing page](https://www.onlyoffice.com/docs-enterprise-prices.aspx?utm_source=github&utm_medium=cpc&utm_campaign=GitHubPlone) | | Simultaneous connections | up to 20 maximum | As in chosen pricing plan | | Number of users | up to 20 recommended | As in chosen pricing plan | | License | GNU AGPL v.3 | Proprietary | -| **Support** | **Community Edition** | **Enterprise Edition** | -| Documentation | [Help Center](https://helpcenter.onlyoffice.com/server/docker/opensource/index.aspx) | [Help Center](https://helpcenter.onlyoffice.com/server/integration-edition/index.aspx) | +| **Support** | **Community Edition** | **Enterprise Edition** | +| Documentation | [Help Center](https://helpcenter.onlyoffice.com/installation/docs-community-index.aspx) | [Help Center](https://helpcenter.onlyoffice.com/installation/docs-enterprise-index.aspx) | | Standard support | [GitHub](https://github.com/ONLYOFFICE/DocumentServer/issues) or paid | One year support included | -| Premium support | [Buy Now](https://www.onlyoffice.com/support.aspx?utm_source=github&utm_medium=cpc&utm_campaign=GitHubPlone) | [Buy Now](https://www.onlyoffice.com/support.aspx?utm_source=github&utm_medium=cpc&utm_campaign=GitHubPlone) | -| **Services** | **Community Edition** | **Enterprise Edition** | -| Conversion Service | + | + | -| Document Builder Service | + | + | +| Premium support | [Contact us](mailto:sales@onlyoffice.com) | [Contact us](mailto:sales@onlyoffice.com) | +| **Services** | **Community Edition** | **Enterprise Edition** | +| Conversion Service | + | + | +| Document Builder Service | + | + | | **Interface** | **Community Edition** | **Enterprise Edition** | | Tabbed interface | + | + | +| Dark theme | + | + | +| 125%, 150%, 175%, 200% scaling | + | + | | White Label | - | - | -| Integrated test example (node.js) | - | + | +| Integrated test example (node.js) | + | + | +| Mobile web editors | - | +* | | **Plugins & Macros** | **Community Edition** | **Enterprise Edition** | | Plugins | + | + | | Macros | + | + | @@ -166,29 +169,33 @@ The table below will help you make the right choice. | **Document Editor features** | **Community Edition** | **Enterprise Edition** | | Font and paragraph formatting | + | + | | Object insertion | + | + | -| Adding Content control | - | + | +| Adding Content control | + | + | | Editing Content control | + | + | | Layout tools | + | + | | Table of contents | + | + | | Navigation panel | + | + | -| Comparing Documents | - | +* | +| Mail Merge | + | + | +| Comparing Documents | + | + | | **Spreadsheet Editor features** | **Community Edition** | **Enterprise Edition** | | Font and paragraph formatting | + | + | | Object insertion | + | + | | Functions, formulas, equations | + | + | | Table templates | + | + | | Pivot tables | + | + | -| Conditional formatting for viewing | +** | +** | -| Sheet views | - | + | +| Data validation | + | + | +| Conditional formatting | + | + | +| Sparklines | + | + | +| Sheet Views | + | + | | **Presentation Editor features** | **Community Edition** | **Enterprise Edition** | | Font and paragraph formatting | + | + | | Object insertion | + | + | -| Animations | + | + | +| Transitions | + | + | | Presenter mode | + | + | | Notes | + | + | -| | [Get it now](https://www.onlyoffice.com/download.aspx?utm_source=github&utm_medium=cpc&utm_campaign=GitHubPlone) | [Start Free Trial](https://www.onlyoffice.com/enterprise-edition-free.aspx?utm_source=github&utm_medium=cpc&utm_campaign=GitHubPlone) | - -\* It's possible to add documents for comparison from your local drive and from URL. Adding files for comparison from storage is not available yet. - -\** Support for all conditions and gradient. Adding/Editing capabilities are coming soon +| **Form creator features** | **Community Edition** | **Enterprise Edition** | +| Adding form fields | + | + | +| Form preview | + | + | +| Saving as PDF | + | + | +| | [Get it now](https://www.onlyoffice.com/download-docs.aspx?utm_source=github&utm_medium=cpc&utm_campaign=GitHubPlone#docs-community) | [Start Free Trial](https://www.onlyoffice.com/download-docs.aspx?utm_source=github&utm_medium=cpc&utm_campaign=GitHubPlone#docs-enterprise) | +\* If supported by DMS. \ No newline at end of file diff --git a/setup.py b/setup.py index 4924fcf..c8cd79a 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ setup( name='onlyoffice.connector', - version='2.0.0', + version='2.1.0', description="Plone ONLYOFFICE integration plugin", long_description=long_description, long_description_content_type="text/markdown", diff --git a/src/onlyoffice/connector/browser/api.py b/src/onlyoffice/connector/browser/api.py index 559a7d4..808c80d 100644 --- a/src/onlyoffice/connector/browser/api.py +++ b/src/onlyoffice/connector/browser/api.py @@ -26,13 +26,28 @@ from zope.component import getMultiAdapter from zope.component import getUtility from zope.publisher.interfaces import NotFound +from plone.app.uuid.utils import uuidToObject +from plone.protect.utils import addTokenToUrl +from Acquisition import aq_inner +from Acquisition import aq_parent +from plone.app.dexterity.interfaces import IDXFileFactory +from zExceptions import BadRequest +from plone.app.content.utils import json_dumps +from AccessControl import getSecurityManager +from Products.CMFPlone.permissions import AddPortalContent +from Products.CMFCore.utils import getToolByName from onlyoffice.connector.core.config import Config from onlyoffice.connector.core import fileUtils from onlyoffice.connector.core import utils +from onlyoffice.connector.core import featureUtils from onlyoffice.connector.interfaces import logger +from onlyoffice.connector.interfaces import _ from urllib.request import urlopen +from onlyoffice.connector.interfaces import _ import json +import os +import mimetypes class Edit(form.EditForm): def isAvailable(self): @@ -44,7 +59,29 @@ def isAvailable(self): def __call__(self): self.docUrl = Config(getUtility(IRegistry)).docUrl + self.saveAs = featureUtils.getSaveAsObject(self.context) + self.editorCfg = get_config(self, True) + self.relatedItemsOptions = json.dumps(fileUtils.getRelatedRtemsOptions(self.context)) + self.token = get_token(self) + if not self.editorCfg: + index = ViewPageTemplateFile("templates/error.pt") + return index(self) + return self.index() + +class FillForm(form.EditForm): + def isAvailable(self): + filename = self.context.file.filename + return fileUtils.canFillForm(filename) + + docUrl = None + editorCfg = None + + def __call__(self): + self.docUrl = Config(getUtility(IRegistry)).docUrl + self.saveAs = featureUtils.getSaveAsObject(self.context) self.editorCfg = get_config(self, True) + self.relatedItemsOptions = json.dumps(fileUtils.getRelatedRtemsOptions(self.context)) + self.token = get_token(self) if not self.editorCfg: index = ViewPageTemplateFile("templates/error.pt") return index(self) @@ -60,27 +97,35 @@ def isAvailable(self): def __call__(self): self.docUrl = Config(getUtility(IRegistry)).docUrl + self.saveAs = featureUtils.getSaveAsObject(self.context) self.editorCfg = get_config(self, False) + self.relatedItemsOptions = json.dumps(fileUtils.getRelatedRtemsOptions(self.context)) + self.token = get_token(self) if not self.editorCfg: index = ViewPageTemplateFile("templates/error.pt") return index(self) return self.index() +def portal_state(self): + context = aq_inner(self.context) + portal_state = getMultiAdapter((context, self.request), name=u'plone_portal_state') + return portal_state + +def get_token(self): + authenticator = getMultiAdapter((self.context, self.request), name="authenticator") + + return authenticator.token() + def get_config(self, forEdit): # def viewURLFor(self, item): # cstate = getMultiAdapter((item, item.REQUEST), name='plone_context_state') # return cstate.view_url() - def portal_state(self): - context = aq_inner(self.context) - portal_state = getMultiAdapter((context, self.request), name=u'plone_portal_state') - return portal_state - logger.info("getting config for " + self.context.absolute_url()) canEdit = forEdit and bool(getSecurityManager().checkPermission('Modify portal content', self.context)) filename = self.context.file.filename - if not fileUtils.canView(filename) or (forEdit and not fileUtils.canEdit(filename)): + if not fileUtils.canView(filename) or (forEdit and not fileUtils.canEdit(filename) and not fileUtils.canFillForm(filename)): # self.request.response.status = 500 # self.request.response.setHeader('Location', self.viewURLFor(self.context)) return None @@ -199,4 +244,80 @@ def _getFile(self): if file is None: raise NotFound(self, self.fieldname, self.request) - return file \ No newline at end of file + return file + +class Create(BrowserView): + def __call__( + self, + documentType + ): + fileName = fileUtils.getDefaultNameByType(documentType) + fileExt = fileUtils.getDefaultExtByType(documentType) + + if fileName is None or fileExt is None: + raise NotFound(self, documentType, self.request) + + template = 'new.' + fileExt + + state = portal_state(self) + language = state.language() + + localePath = fileUtils.localePath.get(language) + if localePath is None: + language = language.split('-')[0] + localePath = fileUtils.localePath.get(language) + if localePath is None: + localePath = fileUtils.localePath.get('en') + + file = open(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'app_data', localePath, template), 'rb') + + try: + data = file.read() + finally: + file.close() + + factory = IDXFileFactory(self.context) + contentType = mimetypes.guess_type(template)[0] or '' + + file = factory(fileName + '.' + fileExt, contentType, data) + + self.request.response.redirect(addTokenToUrl('{0}/onlyoffice-edit'.format(file.absolute_url()))) + +class SaveAs(BrowserView): + def __call__(self): + body = json.loads(self.request.get('BODY')) + url = body.get('url') + fileType = body.get('fileType') + fileTitle = body.get('fileTitle') + folderUID = body.get('folderUID') + + if not url or not fileType or not fileTitle: + raise BadRequest(u'Required url or fileType or fileTitle parameters not found.') + + if not folderUID: + portal_url = getToolByName(self.context, "portal_url") + folder = portal_url.getPortalObject() + else: + folder = uuidToObject(folderUID) + + if not getSecurityManager().checkPermission(AddPortalContent, folder): + response = self.request.RESPONSE + response.setStatus(403) + return "You are not authorized to add content to this folder." + + fileName = fileUtils.getCorrectFileName(fileTitle + "." + fileType) + contentType = mimetypes.guess_type(fileName)[0] or '' + + data = urlopen(url).read() + + factory = IDXFileFactory(folder) + file = factory(fileName, contentType, data) + + self.request.response.setHeader( + "Content-Type", "application/json; charset=utf-8" + ) + + return json_dumps({ + "status": "success", + "fileName": fileName + }) diff --git a/src/onlyoffice/connector/browser/app_data b/src/onlyoffice/connector/browser/app_data new file mode 160000 index 0000000..47e28a8 --- /dev/null +++ b/src/onlyoffice/connector/browser/app_data @@ -0,0 +1 @@ +Subproject commit 47e28a87f5eb0fd90739ff8a6f959e7807d47b0b diff --git a/src/onlyoffice/connector/browser/configure.zcml b/src/onlyoffice/connector/browser/configure.zcml index 06c38ee..242bf94 100644 --- a/src/onlyoffice/connector/browser/configure.zcml +++ b/src/onlyoffice/connector/browser/configure.zcml @@ -14,6 +14,10 @@ /> --> + + + + + + + + + + + + diff --git a/src/onlyoffice/connector/browser/menu.py b/src/onlyoffice/connector/browser/menu.py new file mode 100644 index 0000000..8ee21fe --- /dev/null +++ b/src/onlyoffice/connector/browser/menu.py @@ -0,0 +1,83 @@ +# +# (c) Copyright Ascensio System SIA 2021 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from plone.app.contentmenu.interfaces import IActionsMenu, IActionsSubMenuItem +from plone.app.contentmenu.menu import BrowserMenu, BrowserSubMenuItem +from zope.interface import implementer +from zope.security import checkPermission +from zope.component import getMultiAdapter +from plone.protect.utils import addTokenToUrl +from onlyoffice.connector.interfaces import logger +from onlyoffice.connector.interfaces import _ +from onlyoffice.connector.core import fileUtils + +@implementer(IActionsSubMenuItem) +class OnlyofficeCreateSubMenuItem(BrowserSubMenuItem): + + title = _(u'Create in ONLYOFFICE') + submenuId = 'plone_contentmenu_onlyoffice_create' + + def __init__(self, context, request): + super(OnlyofficeCreateSubMenuItem, self).__init__(context, request) + self.context_state = getMultiAdapter( + (context, request), + name='plone_context_state' + ) + + extra = { + 'id': 'onlyoffice-create' + } + + order = 10 + + @property + def action(self): + return self.context.absolute_url() + + def available(self): + if checkPermission('cmf.AddPortalContent', self.context) and self.context_state.is_structural_folder(): + return True + return False + + def selected(self): + return False + +@implementer(IActionsMenu) +class OnlyofficeCreateMenu(BrowserMenu): + + def getMenuItems(self, context, request): + + documentTypes = ['word', 'cell', 'slide', 'form'] + + currentUrl = context.absolute_url() + menuItems = [] + + for documentType in documentTypes: + menuItems.append({ + 'title': fileUtils.getDefaultNameByType(documentType), + 'description': '', + 'action': addTokenToUrl('{0}/onlyoffice-create?documentType={1}'.format(currentUrl, documentType), request), + 'selected': False, + 'icon': None, + 'extra': { + 'id': 'document', + 'separator': None, + 'class': 'contenttype-onlyoffice icon-onlyoffice-file-' + documentType + }, + 'submenu': None + }) + + return menuItems \ No newline at end of file diff --git a/src/onlyoffice/connector/browser/static/config.json b/src/onlyoffice/connector/browser/static/config.json new file mode 100644 index 0000000..62c1ad3 --- /dev/null +++ b/src/onlyoffice/connector/browser/static/config.json @@ -0,0 +1,80 @@ +{ + "name": "onlyoffice", + "css_prefix_text": "icon-", + "css_use_suffix": false, + "hinting": true, + "units_per_em": 1000, + "ascent": 850, + "glyphs": [ + { + "uid": "303997a4c91b3ead94043625b1629697", + "css": "onlyoffice-logo", + "code": 59393, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M437.5 926L26.3 732.9C-8.8 716.1-8.8 690 26.3 674.7L169.5 607.2 436 732.9C471.1 749.8 527.4 749.8 560.9 732.9L827.5 607.2 970.7 674.7C1005.7 691.5 1005.7 717.6 970.7 732.9L559.4 926C527.4 941.3 471.1 941.3 437.5 926ZM437.5 688.5L26.3 495.4C-8.8 478.5-8.8 452.5 26.3 437.1L166.4 371.2 437.5 498.4C472.6 515.3 528.9 515.3 562.5 498.4L833.6 371.2 973.7 437.1C1008.8 454 1008.8 480 973.7 495.4L562.5 688.5C527.4 705.3 471.1 705.3 437.5 688.5ZM437.5 457.1L26.3 264C-8.8 247.1-8.8 221.1 26.3 205.7L437.5 12.6C472.6-4.2 528.9-4.2 562.5 12.6L973.7 205.7C1008.8 222.6 1008.8 248.6 973.7 264L562.5 457.1C527.4 472.4 471.1 472.4 437.5 457.1Z", + "width": 1000 + }, + "search": [ + "16" + ] + }, + { + "uid": "694d51a314bd37e8d0a5f10c38a71dd2", + "css": "file-word", + "code": 59392, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M940.6 0H59.4C28.1 0 0 28.1 0 59.4V940.6C0 971.9 28.1 1000 59.4 1000H940.6C975 1000 1000 971.9 1000 940.6V59.4C1000 28.1 971.9 0 940.6 0ZM843.8 750H156.3V656.3H843.8V750ZM843.8 531.3H156.3V437.5H843.8V531.3ZM843.8 312.5H156.3V218.8H843.8V312.5Z", + "width": 1000 + }, + "search": [ + "file-word" + ] + }, + { + "uid": "848f0b15e652462da0ee0e496d9ecbb7", + "css": "file-cell", + "code": 59394, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M468.8 468.8H187.5V250H468.8V468.8ZM812.5 531.3H531.3V750H812.5V531.3ZM812.5 250H531.3V468.8H812.5V250ZM468.8 531.3H187.5V750H468.8V531.3ZM1000 65.6V934.4C1000 971.9 968.8 1000 934.4 1000H65.6C31.3 1003.1 0 971.9 0 937.5V65.6C0 31.3 31.3 0 65.6 0H931.3C968.8 0 1000 31.3 1000 65.6ZM906.3 156.3H93.8V843.8H906.3V156.3Z", + "width": 1000 + }, + "search": [ + "file-cell" + ] + }, + { + "uid": "ef8943399733f05d64dd3ad31b19f220", + "css": "file-slide", + "code": 59395, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M781.3 750H218.8V250H781.3V750ZM1000 65.6V931.3C1000 968.8 968.8 996.9 934.4 996.9H65.6C31.3 1000 0 968.8 0 934.4V65.6C0 31.3 31.3 0 65.6 0H931.3C968.8 0 1000 31.3 1000 65.6ZM875 156.3H125V843.8H875V156.3Z", + "width": 1000 + }, + "search": [ + "file-slide" + ] + }, + { + "uid": "add7fc68dd08cdbe077bd72202390c87", + "css": "file-form", + "code": 59396, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M934.4 0H65.6C31.3 0 0 31.3 0 65.6V931.3C0 968.8 31.3 1000 65.6 1000H931.3C968.8 1000 996.9 968.8 996.9 934.4V65.6C1000 31.3 968.8 0 934.4 0ZM812.5 640.6V718.8H187.5V562.5H812.5V640.6ZM812.5 437.5H187.5V281.3H812.5V437.5Z", + "width": 1000 + }, + "search": [ + "file-form" + ] + } + ] +} \ No newline at end of file diff --git a/src/onlyoffice/connector/browser/static/css/onlyoffice.css b/src/onlyoffice/connector/browser/static/css/onlyoffice.css new file mode 100644 index 0000000..3979f06 --- /dev/null +++ b/src/onlyoffice/connector/browser/static/css/onlyoffice.css @@ -0,0 +1,32 @@ +@font-face { + font-family: 'onlyoffice'; + src: url('../++resource++onlyoffice-static/font/onlyoffice.eot?85072311'); + src: url('../++resource++onlyoffice-static/font/onlyoffice.eot?85072311#iefix') format('embedded-opentype'), + url('../++resource++onlyoffice-static/font/onlyoffice.woff2?85072311') format('woff2'), + url('../++resource++onlyoffice-static/font/onlyoffice.woff?85072311') format('woff'), + url('../++resource++onlyoffice-static/font/onlyoffice.ttf?85072311') format('truetype'), + url('../++resource++onlyoffice-static/font/onlyoffice.svg?85072311#onlyoffice') format('svg'); + font-weight: normal; + font-style: normal; +} +/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ +/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ +/* +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: 'onlyoffice'; + src: url('../++resource++onlyoffice-static/font/onlyoffice.svg?85072311#onlyoffice') format('svg'); + } +} +*/ +[class^="icon-onlyoffice"]:before, [class*=" icon-onlyoffice"]:before { + font-family: "onlyoffice" !important; +} + +.icon-onlyoffice-create:before { content: '\e801' !important; } /* '' */ +.icon-onlyoffice-edit:before { content: '\e801' !important; } /* '' */ +.icon-onlyoffice-fill-form:before { content: '\e801' !important; } /* '' */ +.icon-onlyoffice-file-word:before { content: '\e800' !important; } /* '' */ +.icon-onlyoffice-file-cell:before { content: '\e802' !important; } /* '' */ +.icon-onlyoffice-file-slide:before { content: '\e803' !important; } /* '' */ +.icon-onlyoffice-file-form:before { content: '\e804' !important; } /* '' */ diff --git a/src/onlyoffice/connector/browser/static/font/onlyoffice.eot b/src/onlyoffice/connector/browser/static/font/onlyoffice.eot new file mode 100644 index 0000000..72d0e24 Binary files /dev/null and b/src/onlyoffice/connector/browser/static/font/onlyoffice.eot differ diff --git a/src/onlyoffice/connector/browser/static/font/onlyoffice.svg b/src/onlyoffice/connector/browser/static/font/onlyoffice.svg new file mode 100644 index 0000000..34111c4 --- /dev/null +++ b/src/onlyoffice/connector/browser/static/font/onlyoffice.svg @@ -0,0 +1,20 @@ + + + +Copyright (C) 2021 by original authors @ fontello.com + + + + + + + + + + + + + + + + diff --git a/src/onlyoffice/connector/browser/static/font/onlyoffice.ttf b/src/onlyoffice/connector/browser/static/font/onlyoffice.ttf new file mode 100644 index 0000000..eafe9b7 Binary files /dev/null and b/src/onlyoffice/connector/browser/static/font/onlyoffice.ttf differ diff --git a/src/onlyoffice/connector/browser/static/font/onlyoffice.woff b/src/onlyoffice/connector/browser/static/font/onlyoffice.woff new file mode 100644 index 0000000..6e5a731 Binary files /dev/null and b/src/onlyoffice/connector/browser/static/font/onlyoffice.woff differ diff --git a/src/onlyoffice/connector/browser/static/font/onlyoffice.woff2 b/src/onlyoffice/connector/browser/static/font/onlyoffice.woff2 new file mode 100644 index 0000000..64e0923 Binary files /dev/null and b/src/onlyoffice/connector/browser/static/font/onlyoffice.woff2 differ diff --git a/src/onlyoffice/connector/browser/templates/view.pt b/src/onlyoffice/connector/browser/templates/view.pt index 5cd56fb..b1f8e79 100644 --- a/src/onlyoffice/connector/browser/templates/view.pt +++ b/src/onlyoffice/connector/browser/templates/view.pt @@ -27,15 +27,166 @@
+ + + +