diff --git a/apps/api/documents/api.js b/apps/api/documents/api.js index 2c838d9db..0c1ec666e 100644 --- a/apps/api/documents/api.js +++ b/apps/api/documents/api.js @@ -124,7 +124,8 @@ help: true, compactHeader: false, toolbarNoTabs: false, - toolbarHideFileName: false + toolbarHideFileName: false, + reviewDisplay: 'original' }, plugins: { autostart: ['asc.{FFE1F462-1EA2-4391-990D-4CC84940B754}'], diff --git a/apps/common/main/lib/component/CheckBox.js b/apps/common/main/lib/component/CheckBox.js index fa353ba98..5aaa8a112 100644 --- a/apps/common/main/lib/component/CheckBox.js +++ b/apps/common/main/lib/component/CheckBox.js @@ -137,6 +137,9 @@ define([ }, setDisabled: function(disabled) { + if (!this.rendered) + return; + disabled = (disabled===true); if (disabled !== this.disabled) { this.$label.toggleClass('disabled', disabled); diff --git a/apps/common/main/lib/component/InputField.js b/apps/common/main/lib/component/InputField.js index 199a2d9ab..054721355 100644 --- a/apps/common/main/lib/component/InputField.js +++ b/apps/common/main/lib/component/InputField.js @@ -239,6 +239,8 @@ define([ }, onKeyDown: function(e) { + this.trigger('keydown:before', this, e); + if (e.isDefaultPrevented()) return; diff --git a/apps/common/main/lib/component/Menu.js b/apps/common/main/lib/component/Menu.js index 73cc749a6..9359e0ffc 100644 --- a/apps/common/main/lib/component/Menu.js +++ b/apps/common/main/lib/component/Menu.js @@ -380,7 +380,7 @@ define([ onAfterShowMenu: function(e) { this.trigger('show:after', this, e); if (this.scroller) { - this.scroller.update(); + this.scroller.update({alwaysVisibleY: this.scrollAlwaysVisible}); var menuRoot = (this.cmpEl.attr('role') === 'menu') ? this.cmpEl : this.cmpEl.find('[role=menu]'), $selected = menuRoot.find('> li .checked'); if ($selected.length) { diff --git a/apps/common/main/lib/component/RadioBox.js b/apps/common/main/lib/component/RadioBox.js index 57348aa19..8b7ff4b6f 100644 --- a/apps/common/main/lib/component/RadioBox.js +++ b/apps/common/main/lib/component/RadioBox.js @@ -107,6 +107,9 @@ define([ }, setDisabled: function(disabled) { + if (!this.rendered) + return; + if (disabled !== this.disabled) { this.$radio.toggleClass('disabled', disabled); (disabled) ? this.$radio.attr({disabled: disabled}) : this.$radio.removeAttr('disabled'); diff --git a/apps/common/main/lib/controller/ReviewChanges.js b/apps/common/main/lib/controller/ReviewChanges.js index c569405a5..d1cef5bfe 100644 --- a/apps/common/main/lib/controller/ReviewChanges.js +++ b/apps/common/main/lib/controller/ReviewChanges.js @@ -671,7 +671,13 @@ define([ }); } else if (config.canViewReview) { config.canViewReview = me.api.asc_HaveRevisionsChanges(true); // check revisions from all users - config.canViewReview && me.turnDisplayMode(config.isRestrictedEdit ? 'markup' : Common.localStorage.getItem(me.view.appPrefix + "review-mode") || 'original'); // load display mode only in viewer + if (config.canViewReview) { + var val = Common.localStorage.getItem(me.view.appPrefix + "review-mode"); + if (val===null) + val = me.appConfig.customization && /^(original|final|markup)$/i.test(me.appConfig.customization.reviewDisplay) ? me.appConfig.customization.reviewDisplay.toLocaleLowerCase() : 'original'; + me.turnDisplayMode(config.isRestrictedEdit ? 'markup' : val); // load display mode only in viewer + me.view.turnDisplayMode(config.isRestrictedEdit ? 'markup' : val); + } } if (me.view && me.view.btnChat) { diff --git a/apps/common/main/lib/view/About.js b/apps/common/main/lib/view/About.js index 068e6bb3c..4a50978b3 100644 --- a/apps/common/main/lib/view/About.js +++ b/apps/common/main/lib/view/About.js @@ -90,7 +90,7 @@ define([ '', '', '', - '<% print(publisherurl.replace(/https?:\\/{2}/, "")) %>', + '<% print(publisherurl.replace(/https?:\\/{2}/, "").replace(/\\/$/,"")) %>', '', '', '', @@ -143,7 +143,7 @@ define([ '', '', '', - '', + '', '', '', '' @@ -156,7 +156,7 @@ define([ el.html(this.template({ publishername: '{{PUBLISHER_NAME}}', publisheraddr: '{{PUBLISHER_ADDRESS}}', - publisherurl: /^(?:https?:\/{2})?(\S+)/.exec('{{PUBLISHER_URL}}')[1], + publisherurl: '{{PUBLISHER_URL}}', supportemail: '{{SUPPORT_EMAIL}}', phonenum: '{{PUBLISHER_PHONE}}', scope: this diff --git a/apps/common/main/lib/view/ReviewChanges.js b/apps/common/main/lib/view/ReviewChanges.js index 3492b3820..2325f1b31 100644 --- a/apps/common/main/lib/view/ReviewChanges.js +++ b/apps/common/main/lib/view/ReviewChanges.js @@ -209,13 +209,49 @@ define([ caption: this.txtNext }); - if (!this.appConfig.isRestrictedEdit) // hide Display mode option for fillForms and commenting mode + if (!this.appConfig.isRestrictedEdit) {// hide Display mode option for fillForms and commenting mode + var menuTemplate = _.template('
<%= caption %>
' + + '<% if (options.description !== null) { %>' + + '<% } %>
'); + this.btnReviewView = new Common.UI.Button({ cls: 'btn-toolbar x-huge icon-top', iconCls: 'btn-ic-reviewview', caption: this.txtView, - menu: true + menu: new Common.UI.Menu({ + cls: 'ppm-toolbar', + items: [ + { + caption: this.txtMarkupCap, + checkable: true, + toggleGroup: 'menuReviewView', + checked: true, + value: 'markup', + template: menuTemplate, + description: this.txtMarkup + }, + { + caption: this.txtFinalCap, + checkable: true, + toggleGroup: 'menuReviewView', + checked: false, + template: menuTemplate, + description: this.txtFinal, + value: 'final' + }, + { + caption: this.txtOriginalCap, + checkable: true, + toggleGroup: 'menuReviewView', + checked: false, + template: menuTemplate, + description: this.txtOriginal, + value: 'original' + } + ] + }) }); + } } if (!!this.appConfig.sharingSettingsUrl && this.appConfig.sharingSettingsUrl.length && this._readonlyRights!==true) { @@ -319,41 +355,7 @@ define([ me.btnPrev.updateHint(me.hintPrev); me.btnNext.updateHint(me.hintNext); - me.btnReviewView && me.btnReviewView.setMenu( - new Common.UI.Menu({ - cls: 'ppm-toolbar', - items: [ - { - caption: me.txtMarkupCap, - checkable: true, - toggleGroup: 'menuReviewView', - checked: true, - value: 'markup', - template: menuTemplate, - description: me.txtMarkup - }, - { - caption: me.txtFinalCap, - checkable: true, - toggleGroup: 'menuReviewView', - checked: false, - template: menuTemplate, - description: me.txtFinal, - value: 'final' - }, - { - caption: me.txtOriginalCap, - checkable: true, - toggleGroup: 'menuReviewView', - checked: false, - template: menuTemplate, - description: me.txtOriginal, - value: 'original' - } - ] - })); me.btnReviewView && me.btnReviewView.updateHint(me.tipReviewView); - !me.appConfig.canReview && me.turnDisplayMode(Common.localStorage.getItem(me.appPrefix + "review-mode") || 'original'); } me.btnSharing && me.btnSharing.updateHint(me.tipSharing); me.btnHistory && me.btnHistory.updateHint(me.tipHistory); diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index 4ce6dc609..d4f560f53 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -228,7 +228,7 @@ define([ }); $(document.body).on('blur', 'input, textarea', function(e) { - if (!me.isModalShowed) { + if (!me.isModalShowed && !me.getApplication().getController('LeftMenu').getView('LeftMenu').getMenu('file').isVisible()) { if (/form-control/.test(e.target.className)) me.inFormControl = false; if (!e.relatedTarget || @@ -1095,7 +1095,7 @@ define([ primary: 'contact', callback: function(btn) { if (btn == 'contact') - window.open('mailto:sales@onlyoffice.com', "_blank"); + window.open('mailto:{{SALES_EMAIL}}', "_blank"); } }); } @@ -1189,10 +1189,6 @@ define([ this.appOptions.canBranding = params.asc_getCustomization(); if (this.appOptions.canBranding) appHeader.setBranding(this.editorConfig.customization); - else if (typeof this.editorConfig.customization == 'object') { - this.editorConfig.customization.compactHeader = this.editorConfig.customization.toolbarNoTabs = - this.editorConfig.customization.toolbarHideFileName = false; - } this.appOptions.canRename && appHeader.setCanRename(true); this.appOptions.canBrandingExt = params.asc_getCanBranding() && (typeof this.editorConfig.customization == 'object' || this.editorConfig.plugins); diff --git a/apps/documenteditor/main/app/view/FileMenuPanels.js b/apps/documenteditor/main/app/view/FileMenuPanels.js index 3154ccfd8..11191c455 100644 --- a/apps/documenteditor/main/app/view/FileMenuPanels.js +++ b/apps/documenteditor/main/app/view/FileMenuPanels.js @@ -673,50 +673,84 @@ define([ this.template = _.template([ '', '', - '', - '', - '', - '', - '', - '', - '', - '', '', '', '', - '', - '', - '', - '', - '', - '', - '', - '', - '', '', - '', - '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + // '', + // '', + // '', + // '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', '', @@ -726,21 +760,124 @@ define([ this.infoObj = {PageCount: 0, WordsCount: 0, ParagraphCount: 0, SymbolsCount: 0, SymbolsWSCount:0}; this.inProgress = false; this.menu = options.menu; + this.coreProps = null; + this.authors = []; }, render: function() { $(this.el).html(this.template()); - this.lblTitle = $('#id-info-title'); + var me = this; + + // server info this.lblPlacement = $('#id-info-placement'); - this.lblDate = $('#id-info-date'); - this.lblAuthor = $('#id-info-author'); - this.lblApplication = $('#id-info-appname'); + this.lblOwner = $('#id-info-owner'); + this.lblUploaded = $('#id-info-uploaded'); + + // statistic info this.lblStatPages = $('#id-info-pages'); this.lblStatWords = $('#id-info-words'); this.lblStatParagraphs = $('#id-info-paragraphs'); this.lblStatSymbols = $('#id-info-symbols'); this.lblStatSpaces = $('#id-info-spaces'); + // this.lblEditTime = $('#id-info-edittime'); + + // edited info + var keyDownBefore = function(input, e){ + if (e.keyCode === Common.UI.Keys.ESC) { + var newVal = input._input.val(), + oldVal = input.getValue(); + if (newVal !== oldVal) { + input.setValue(oldVal); + e.stopPropagation(); + } + } + }; + + this.inputTitle = new Common.UI.InputField({ + el : $('#id-info-title'), + style : 'width: 200px;', + placeHolder : this.txtAddText, + validateOnBlur: false + }).on('changed:after', function(input, newValue, oldValue) { + if (newValue !== oldValue && me.coreProps && me.api) { + me.coreProps.asc_putTitle(me.inputTitle.getValue()); + me.api.asc_setCoreProps(me.coreProps); + } + }).on('keydown:before', keyDownBefore); + this.inputSubject = new Common.UI.InputField({ + el : $('#id-info-subject'), + style : 'width: 200px;', + placeHolder : this.txtAddText, + validateOnBlur: false + }).on('changed:after', function(input, newValue, oldValue) { + if (newValue !== oldValue && me.coreProps && me.api) { + me.coreProps.asc_putSubject(me.inputSubject.getValue()); + me.api.asc_setCoreProps(me.coreProps); + } + }).on('keydown:before', keyDownBefore); + this.inputComment = new Common.UI.InputField({ + el : $('#id-info-comment'), + style : 'width: 200px;', + placeHolder : this.txtAddText, + validateOnBlur: false + }).on('changed:after', function(input, newValue, oldValue) { + if (newValue !== oldValue && me.coreProps && me.api) { + me.coreProps.asc_putDescription(me.inputComment.getValue()); + me.api.asc_setCoreProps(me.coreProps); + } + }).on('keydown:before', keyDownBefore); + + // modify info + this.lblModifyDate = $('#id-info-modify-date'); + this.lblModifyBy = $('#id-info-modify-by'); + + // creation info + this.lblDate = $('#id-info-date'); + this.lblApplication = $('#id-info-appname'); + this.tblAuthor = $('#id-info-author table'); + this.trAuthor = $('#id-info-add-author').closest('tr'); + this.authorTpl = ''; + + this.tblAuthor.on('click', function(e) { + var btn = $(e.target); + if (btn.hasClass('close') && !btn.hasClass('disabled')) { + var el = btn.closest('tr'), + idx = me.tblAuthor.find('tr').index(el); + el.remove(); + me.authors.splice(idx, 1); + if (me.coreProps && me.api) { + me.coreProps.asc_putCreator(me.authors.join(';')); + me.api.asc_setCoreProps(me.coreProps); + } + } + }); + + this.inputAuthor = new Common.UI.InputField({ + el : $('#id-info-add-author'), + style : 'width: 200px;', + validateOnBlur: false, + placeHolder: this.txtAddAuthor + }).on('changed:after', function(input, newValue, oldValue) { + if (newValue == oldValue) return; + + var val = newValue.trim(); + if (!!val && val !== oldValue.trim()) { + val.split(/\s*[,;]\s*/).forEach(function(item){ + var str = item.trim(); + if (str) { + var div = $(Common.Utils.String.format(me.authorTpl, Common.Utils.String.htmlEncode(str))); + me.trAuthor.before(div); + me.authors.push(item); + } + }); + me.inputAuthor.setValue(''); + if (me.coreProps && me.api) { + me.coreProps.asc_putCreator(me.authors.join(';')); + me.api.asc_setCoreProps(me.coreProps); + } + } + }).on('keydown:before', keyDownBefore); this.rendered = true; @@ -760,6 +897,7 @@ define([ Common.UI.BaseView.prototype.show.call(this,arguments); this.updateStatisticInfo(); + this.updateFileInfo(); }, hide: function() { @@ -773,37 +911,95 @@ define([ if (!this.rendered) return; + var visible = false; doc = doc || {}; - this.lblTitle.text((doc.title) ? doc.title : '-'); - if (doc.info) { - if (doc.info.author) - this.lblAuthor.text(doc.info.author); - this._ShowHideInfoItem('author', doc.info.author!==undefined && doc.info.author!==null); - if (doc.info.created ) - this.lblDate.text( doc.info.created ); - this._ShowHideInfoItem('date', doc.info.created!==undefined && doc.info.created!==null); + // server info if (doc.info.folder ) this.lblPlacement.text( doc.info.folder ); - this._ShowHideInfoItem('placement', doc.info.folder!==undefined && doc.info.folder!==null); + visible = this._ShowHideInfoItem(this.lblPlacement, doc.info.folder!==undefined && doc.info.folder!==null) || visible; + if (doc.info.author) + this.lblOwner.text(doc.info.author); + visible = this._ShowHideInfoItem(this.lblOwner, doc.info.author!==undefined && doc.info.author!==null) || visible; + if (doc.info.uploaded) + this.lblUploaded.text(doc.info.uploaded.toLocaleString()); + visible = this._ShowHideInfoItem(this.lblUploaded, doc.info.uploaded!==undefined && doc.info.uploaded!==null) || visible; } else this._ShowHideDocInfo(false); + $('tr.divider.general', this.el)[visible?'show':'hide'](); + var appname = (this.api) ? this.api.asc_getAppProps() : null; if (appname) { appname = (appname.asc_getApplication() || '') + ' ' + (appname.asc_getAppVersion() || ''); this.lblApplication.text(appname); } - this._ShowHideInfoItem('appname', !!appname); + this._ShowHideInfoItem(this.lblApplication, !!appname); + + this.coreProps = (this.api) ? this.api.asc_getCoreProps() : null; + if (this.coreProps) { + var value = this.coreProps.asc_getCreated(); + if (value) + this.lblDate.text(value.toLocaleString()); + this._ShowHideInfoItem(this.lblDate, !!value); + } }, - _ShowHideInfoItem: function(cls, visible) { - $('tr.'+cls, this.el)[visible?'show':'hide'](); + updateFileInfo: function() { + if (!this.rendered) + return; + + var me = this, + props = (this.api) ? this.api.asc_getCoreProps() : null, + value; + + this.coreProps = props; + // var app = (this.api) ? this.api.asc_getAppProps() : null; + // if (app) { + // value = app.asc_getTotalTime(); + // if (value) + // this.lblEditTime.text(value + ' ' + this.txtMinutes); + // } + // this._ShowHideInfoItem(this.lblEditTime, !!value); + + if (props) { + var visible = false; + value = props.asc_getModified(); + if (value) + this.lblModifyDate.text(value.toLocaleString()); + visible = this._ShowHideInfoItem(this.lblModifyDate, !!value) || visible; + value = props.asc_getLastModifiedBy(); + if (value) + this.lblModifyBy.text(value); + visible = this._ShowHideInfoItem(this.lblModifyBy, !!value) || visible; + $('tr.divider.modify', this.el)[visible?'show':'hide'](); + + value = props.asc_getTitle(); + this.inputTitle.setValue(value || ''); + value = props.asc_getSubject(); + this.inputSubject.setValue(value || ''); + value = props.asc_getDescription(); + this.inputComment.setValue(value || ''); + + this.tblAuthor.find('tr:not(:last-of-type)').remove(); + this.authors = []; + value = props.asc_getCreator();//"123\"\"\"\<\>,456"; + value && value.split(/\s*[,;]\s*/).forEach(function(item) { + var div = $(Common.Utils.String.format(me.authorTpl, Common.Utils.String.htmlEncode(item))); + me.trAuthor.before(div); + me.authors.push(item); + }); + } + }, + + _ShowHideInfoItem: function(el, visible) { + el.closest('tr')[visible?'show':'hide'](); + return visible; }, _ShowHideDocInfo: function(visible) { - this._ShowHideInfoItem('date', visible); - this._ShowHideInfoItem('placement', visible); - this._ShowHideInfoItem('author', visible); + this._ShowHideInfoItem(this.lblPlacement, visible); + this._ShowHideInfoItem(this.lblOwner, visible); + this._ShowHideInfoItem(this.lblUploaded, visible); }, updateStatisticInfo: function() { @@ -824,7 +1020,8 @@ define([ this.api.asc_registerCallback('asc_onGetDocInfoStop', _.bind(this._onGetDocInfoEnd, this)); this.api.asc_registerCallback('asc_onDocInfo', _.bind(this._onDocInfo, this)); this.api.asc_registerCallback('asc_onGetDocInfoEnd', _.bind(this._onGetDocInfoEnd, this)); - this.api.asc_registerCallback('asc_onDocumentName', _.bind(this.onDocumentName, this)); + // this.api.asc_registerCallback('asc_onDocumentName', _.bind(this.onDocumentName, this)); + this.api.asc_registerCallback('asc_onLockCore', _.bind(this.onLockCore, this)); this.updateInfo(this.doc); return this; }, @@ -873,21 +1070,39 @@ define([ }, onDocumentName: function(name) { - this.lblTitle.text((name) ? name : '-'); + // this.lblTitle.text((name) ? name : '-'); }, - txtTitle: 'Document Title', - txtAuthor: 'Author', - txtPlacement: 'Placement', - txtDate: 'Creation Date', - txtStatistics: 'Statistics', + onLockCore: function(lock) { + this.inputTitle.setDisabled(lock); + this.inputSubject.setDisabled(lock); + this.inputComment.setDisabled(lock); + this.inputAuthor.setDisabled(lock); + this.tblAuthor.find('.close').toggleClass('disabled', lock); + !lock && this.updateFileInfo(); + }, + + txtPlacement: 'Location', + txtOwner: 'Owner', + txtUploaded: 'Uploaded', txtPages: 'Pages', txtWords: 'Words', txtParagraphs: 'Paragraphs', txtSymbols: 'Symbols', txtSpaces: 'Symbols with spaces', txtLoading: 'Loading...', - txtAppName: 'Application' + txtAppName: 'Application', + txtEditTime: 'Total Editing time', + txtTitle: 'Title', + txtSubject: 'Subject', + txtComment: 'Comment', + txtModifyDate: 'Last Modified', + txtModifyBy: 'Last Modified By', + txtCreated: 'Created', + txtAuthor: 'Author', + txtAddAuthor: 'Add Author', + txtAddText: 'Add Text', + txtMinutes: 'min' }, DE.Views.FileMenuPanels.DocumentInfo || {})); DE.Views.FileMenuPanels.DocumentRights = Common.UI.BaseView.extend(_.extend({ diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index 92eeb944f..af546d82d 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -1345,18 +1345,27 @@ "DE.Views.FileMenuPanels.CreateNew.newDocumentText": "New Text Document", "DE.Views.FileMenuPanels.CreateNew.noTemplatesText": "There are no templates", "DE.Views.FileMenuPanels.DocumentInfo.txtAppName": "Application", + "DE.Views.FileMenuPanels.DocumentInfo.txtAddAuthor": "Add Author", + "DE.Views.FileMenuPanels.DocumentInfo.txtAddText": "Add Text", "DE.Views.FileMenuPanels.DocumentInfo.txtAuthor": "Author", "DE.Views.FileMenuPanels.DocumentInfo.txtBtnAccessRights": "Change access rights", - "DE.Views.FileMenuPanels.DocumentInfo.txtDate": "Creation Date", + "DE.Views.FileMenuPanels.DocumentInfo.txtComment": "Comment", + "del_DE.Views.FileMenuPanels.DocumentInfo.txtDate": "Creation Date", + "DE.Views.FileMenuPanels.DocumentInfo.txtCreated": "Created", "DE.Views.FileMenuPanels.DocumentInfo.txtLoading": "Loading...", + "DE.Views.FileMenuPanels.DocumentInfo.txtModifyDate": "Last Modified", + "DE.Views.FileMenuPanels.DocumentInfo.txtModifyBy": "Last Modified By", + "DE.Views.FileMenuPanels.DocumentInfo.txtOwner": "Owner", "DE.Views.FileMenuPanels.DocumentInfo.txtPages": "Pages", "DE.Views.FileMenuPanels.DocumentInfo.txtParagraphs": "Paragraphs", "DE.Views.FileMenuPanels.DocumentInfo.txtPlacement": "Location", "DE.Views.FileMenuPanels.DocumentInfo.txtRights": "Persons who have rights", "DE.Views.FileMenuPanels.DocumentInfo.txtSpaces": "Symbols with spaces", "DE.Views.FileMenuPanels.DocumentInfo.txtStatistics": "Statistics", + "DE.Views.FileMenuPanels.DocumentInfo.txtSubject": "Subject", "DE.Views.FileMenuPanels.DocumentInfo.txtSymbols": "Symbols", - "DE.Views.FileMenuPanels.DocumentInfo.txtTitle": "Document Title", + "DE.Views.FileMenuPanels.DocumentInfo.txtTitle": "Title", + "DE.Views.FileMenuPanels.DocumentInfo.txtUploaded": "Uploaded", "DE.Views.FileMenuPanels.DocumentInfo.txtWords": "Words", "DE.Views.FileMenuPanels.DocumentRights.txtBtnAccessRights": "Change access rights", "DE.Views.FileMenuPanels.DocumentRights.txtRights": "Persons who have rights", diff --git a/apps/documenteditor/main/resources/less/filemenu.less b/apps/documenteditor/main/resources/less/filemenu.less index 67712c42c..aad7cc050 100644 --- a/apps/documenteditor/main/resources/less/filemenu.less +++ b/apps/documenteditor/main/resources/less/filemenu.less @@ -304,29 +304,31 @@ } table { - td { - padding: 0 20px 5px 0; + tr { + td { + padding: 0 20px 5px 0; - &.left { - padding: 5px 10px; - text-align: right; - width: 30%; + &.left { + padding: 5px 10px; + text-align: right; + width: 30%; - label { - font-weight: bold; + label { + font-weight: bold; + } + } + + &.right { + padding: 5px 10px; + width: 70%; } } - &.right { - padding: 5px 10px; - width: 70%; + &.divider { + height: 10px; } } - &.divider { - height: 10px; - } - &.main { width: 100%; margin: 30px 0; @@ -347,6 +349,27 @@ label, span { font-size: 12px; } + + .close { + width: 16px; + height: 16px; + cursor: pointer; + display: inline-block; + vertical-align: middle; + margin-left: 5px; + + background-position: @but-close-offset-x @but-close-offset-y; + + &.over, + &:hover { + background-position: @but-close-offset-x @but-close-offset-y - 16px; + } + + &.disabled { + background-position: @but-close-offset-x @but-close-offset-y - 32px; + cursor: default; + } + } } #panel-protect { diff --git a/apps/documenteditor/mobile/app/controller/Main.js b/apps/documenteditor/mobile/app/controller/Main.js index deed7d300..07e8f817d 100644 --- a/apps/documenteditor/mobile/app/controller/Main.js +++ b/apps/documenteditor/mobile/app/controller/Main.js @@ -660,7 +660,7 @@ define([ text: me.textContactUs, bold: true, onClick: function() { - window.open('mailto:sales@onlyoffice.com', "_blank"); + window.open('mailto:{{SALES_EMAIL}}', "_blank"); } }, { text: me.textClose }] diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index dc72cc675..cc8c8df46 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -207,7 +207,7 @@ define([ }); $(document.body).on('blur', 'input, textarea', function(e) { - if (!me.isModalShowed) { + if (!me.isModalShowed && !me.getApplication().getController('LeftMenu').getView('LeftMenu').getMenu('file').isVisible()) { if (/form-control/.test(e.target.className)) me.inFormControl = false; if (!e.relatedTarget || @@ -839,7 +839,7 @@ define([ primary: 'contact', callback: function(btn) { if (btn == 'contact') - window.open('mailto:sales@onlyoffice.com', "_blank"); + window.open('mailto:{{SALES_EMAIL}}', "_blank"); } }); } @@ -910,10 +910,6 @@ define([ this.appOptions.canBranding = params.asc_getCustomization(); if (this.appOptions.canBranding) appHeader.setBranding(this.editorConfig.customization); - else if (typeof this.editorConfig.customization == 'object') { - this.editorConfig.customization.compactHeader = this.editorConfig.customization.toolbarNoTabs = - this.editorConfig.customization.toolbarHideFileName = false; - } this.appOptions.canRename && appHeader.setCanRename(true); this.appOptions.canBrandingExt = params.asc_getCanBranding() && (typeof this.editorConfig.customization == 'object' || this.editorConfig.plugins); diff --git a/apps/presentationeditor/main/app/view/FileMenuPanels.js b/apps/presentationeditor/main/app/view/FileMenuPanels.js index 3a7d31bd7..c3dd93d24 100644 --- a/apps/presentationeditor/main/app/view/FileMenuPanels.js +++ b/apps/presentationeditor/main/app/view/FileMenuPanels.js @@ -595,40 +595,179 @@ define([ this.template = _.template([ '
-
', + '
', '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', + '', + '', + '', '
', '
', '', - '', - '', - '', - '', - '', - '', - '', - '', '', '', '', - '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + // '', + // '', + // '', + // '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', '', - '', + '', '', - '', - '', - '', + '', + '', + '', '', - '', '
-
', + '', + '', + '', + '', + '
', + '
' ].join('')); this.menu = options.menu; + this.coreProps = null; + this.authors = []; }, render: function() { $(this.el).html(this.template()); - this.lblTitle = $('#id-info-title'); + var me = this; + + // server info this.lblPlacement = $('#id-info-placement'); + this.lblOwner = $('#id-info-owner'); + this.lblUploaded = $('#id-info-uploaded'); + + // edited info + var keyDownBefore = function(input, e){ + if (e.keyCode === Common.UI.Keys.ESC) { + var newVal = input._input.val(), + oldVal = input.getValue(); + if (newVal !== oldVal) { + input.setValue(oldVal); + e.stopPropagation(); + } + } + }; + + this.inputTitle = new Common.UI.InputField({ + el : $('#id-info-title'), + style : 'width: 200px;', + placeHolder : this.txtAddText, + validateOnBlur: false + }).on('changed:after', function(input, newValue, oldValue) { + if (newValue !== oldValue && me.coreProps && me.api) { + me.coreProps.asc_putTitle(me.inputTitle.getValue()); + me.api.asc_setCoreProps(me.coreProps); + } + }).on('keydown:before', keyDownBefore); + this.inputSubject = new Common.UI.InputField({ + el : $('#id-info-subject'), + style : 'width: 200px;', + placeHolder : this.txtAddText, + validateOnBlur: false + }).on('changed:after', function(input, newValue, oldValue) { + if (newValue !== oldValue && me.coreProps && me.api) { + me.coreProps.asc_putSubject(me.inputSubject.getValue()); + me.api.asc_setCoreProps(me.coreProps); + } + }).on('keydown:before', keyDownBefore); + this.inputComment = new Common.UI.InputField({ + el : $('#id-info-comment'), + style : 'width: 200px;', + placeHolder : this.txtAddText, + validateOnBlur: false + }).on('changed:after', function(input, newValue, oldValue) { + if (newValue !== oldValue && me.coreProps && me.api) { + me.coreProps.asc_putDescription(me.inputComment.getValue()); + me.api.asc_setCoreProps(me.coreProps); + } + }).on('keydown:before', keyDownBefore); + + // modify info + this.lblModifyDate = $('#id-info-modify-date'); + this.lblModifyBy = $('#id-info-modify-by'); + + // creation info this.lblDate = $('#id-info-date'); - this.lblAuthor = $('#id-info-author'); this.lblApplication = $('#id-info-appname'); + this.tblAuthor = $('#id-info-author table'); + this.trAuthor = $('#id-info-add-author').closest('tr'); + this.authorTpl = '
'; + + this.tblAuthor.on('click', function(e) { + var btn = $(e.target); + if (btn.hasClass('close') && !btn.hasClass('disabled')) { + var el = btn.closest('tr'), + idx = me.tblAuthor.find('tr').index(el); + el.remove(); + me.authors.splice(idx, 1); + if (me.coreProps && me.api) { + me.coreProps.asc_putCreator(me.authors.join(';')); + me.api.asc_setCoreProps(me.coreProps); + } + } + }); + + this.inputAuthor = new Common.UI.InputField({ + el : $('#id-info-add-author'), + style : 'width: 200px;', + validateOnBlur: false, + placeHolder: this.txtAddAuthor + }).on('changed:after', function(input, newValue, oldValue) { + if (newValue == oldValue) return; + + var val = newValue.trim(); + if (!!val && val !== oldValue.trim()) { + val.split(/\s*[,;]\s*/).forEach(function(item){ + var str = item.trim(); + if (str) { + var div = $(Common.Utils.String.format(me.authorTpl, Common.Utils.String.htmlEncode(str))); + me.trAuthor.before(div); + me.authors.push(item); + } + }); + me.inputAuthor.setValue(''); + if (me.coreProps && me.api) { + me.coreProps.asc_putCreator(me.authors.join(';')); + me.api.asc_setCoreProps(me.coreProps); + } + } + }).on('keydown:before', keyDownBefore); this.rendered = true; @@ -646,6 +785,8 @@ define([ show: function() { Common.UI.BaseView.prototype.show.call(this,arguments); + + this.updateFileInfo(); }, hide: function() { @@ -657,37 +798,95 @@ define([ if (!this.rendered) return; + var visible = false; doc = doc || {}; - this.lblTitle.text((doc.title) ? doc.title : '-'); - if (doc.info) { - if (doc.info.author) - this.lblAuthor.text(doc.info.author); - this._ShowHideInfoItem('author', doc.info.author!==undefined && doc.info.author!==null); - if (doc.info.created ) - this.lblDate.text( doc.info.created ); - this._ShowHideInfoItem('date', doc.info.created!==undefined && doc.info.created!==null); + // server info if (doc.info.folder ) this.lblPlacement.text( doc.info.folder ); - this._ShowHideInfoItem('placement', doc.info.folder!==undefined && doc.info.folder!==null); + visible = this._ShowHideInfoItem(this.lblPlacement, doc.info.folder!==undefined && doc.info.folder!==null) || visible; + if (doc.info.author) + this.lblOwner.text(doc.info.author); + visible = this._ShowHideInfoItem(this.lblOwner, doc.info.author!==undefined && doc.info.author!==null) || visible; + if (doc.info.uploaded) + this.lblUploaded.text(doc.info.uploaded.toLocaleString()); + visible = this._ShowHideInfoItem(this.lblUploaded, doc.info.uploaded!==undefined && doc.info.uploaded!==null) || visible; } else this._ShowHideDocInfo(false); + $('tr.divider.general', this.el)[visible?'show':'hide'](); + var appname = (this.api) ? this.api.asc_getAppProps() : null; if (appname) { appname = (appname.asc_getApplication() || '') + ' ' + (appname.asc_getAppVersion() || ''); this.lblApplication.text(appname); } - this._ShowHideInfoItem('appname', !!appname); + this._ShowHideInfoItem(this.lblApplication, !!appname); + + this.coreProps = (this.api) ? this.api.asc_getCoreProps() : null; + if (this.coreProps) { + var value = this.coreProps.asc_getCreated(); + if (value) + this.lblDate.text(value.toLocaleString()); + this._ShowHideInfoItem(this.lblDate, !!value); + } }, - _ShowHideInfoItem: function(cls, visible) { - $('tr.'+cls, this.el)[visible?'show':'hide'](); + updateFileInfo: function() { + if (!this.rendered) + return; + + var me = this, + props = (this.api) ? this.api.asc_getCoreProps() : null, + value; + + this.coreProps = props; + // var app = (this.api) ? this.api.asc_getAppProps() : null; + // if (app) { + // value = app.asc_getTotalTime(); + // if (value) + // this.lblEditTime.text(value + ' ' + this.txtMinutes); + // } + // this._ShowHideInfoItem(this.lblEditTime, !!value); + + if (props) { + var visible = false; + value = props.asc_getModified(); + if (value) + this.lblModifyDate.text(value.toLocaleString()); + visible = this._ShowHideInfoItem(this.lblModifyDate, !!value) || visible; + value = props.asc_getLastModifiedBy(); + if (value) + this.lblModifyBy.text(value); + visible = this._ShowHideInfoItem(this.lblModifyBy, !!value) || visible; + $('tr.divider.modify', this.el)[visible?'show':'hide'](); + + value = props.asc_getTitle(); + this.inputTitle.setValue(value || ''); + value = props.asc_getSubject(); + this.inputSubject.setValue(value || ''); + value = props.asc_getDescription(); + this.inputComment.setValue(value || ''); + + this.tblAuthor.find('tr:not(:last-of-type)').remove(); + this.authors = []; + value = props.asc_getCreator();//"123\"\"\"\<\>,456"; + value && value.split(/\s*[,;]\s*/).forEach(function(item) { + var div = $(Common.Utils.String.format(me.authorTpl, Common.Utils.String.htmlEncode(item))); + me.trAuthor.before(div); + me.authors.push(item); + }); + } + }, + + _ShowHideInfoItem: function(el, visible) { + el.closest('tr')[visible?'show':'hide'](); + return visible; }, _ShowHideDocInfo: function(visible) { - this._ShowHideInfoItem('date', visible); - this._ShowHideInfoItem('placement', visible); - this._ShowHideInfoItem('author', visible); + this._ShowHideInfoItem(this.lblPlacement, visible); + this._ShowHideInfoItem(this.lblOwner, visible); + this._ShowHideInfoItem(this.lblUploaded, visible); }, setMode: function(mode) { @@ -696,15 +895,35 @@ define([ setApi: function(o) { this.api = o; + this.api.asc_registerCallback('asc_onLockCore', _.bind(this.onLockCore, this)); this.updateInfo(this.doc); return this; }, - txtTitle: 'Document Title', + onLockCore: function(lock) { + this.inputTitle.setDisabled(lock); + this.inputSubject.setDisabled(lock); + this.inputComment.setDisabled(lock); + this.inputAuthor.setDisabled(lock); + this.tblAuthor.find('.close').toggleClass('disabled', lock); + !lock && this.updateFileInfo(); + }, + + txtPlacement: 'Location', + txtOwner: 'Owner', + txtUploaded: 'Uploaded', + txtAppName: 'Application', + txtEditTime: 'Total Editing time', + txtTitle: 'Title', + txtSubject: 'Subject', + txtComment: 'Comment', + txtModifyDate: 'Last Modified', + txtModifyBy: 'Last Modified By', + txtCreated: 'Created', txtAuthor: 'Author', - txtPlacement: 'Placement', - txtDate: 'Creation Date', - txtAppName: 'Application' + txtAddAuthor: 'Add Author', + txtAddText: 'Add Text', + txtMinutes: 'min' }, PE.Views.FileMenuPanels.DocumentInfo || {})); PE.Views.FileMenuPanels.DocumentRights = Common.UI.BaseView.extend(_.extend({ diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json index d39ed76a3..df7a78bb2 100644 --- a/apps/presentationeditor/main/locale/en.json +++ b/apps/presentationeditor/main/locale/en.json @@ -1152,12 +1152,21 @@ "PE.Views.FileMenuPanels.CreateNew.newDocumentText": "New Presentation", "PE.Views.FileMenuPanels.CreateNew.noTemplatesText": "There are no templates", "PE.Views.FileMenuPanels.DocumentInfo.txtAppName": "Application", + "PE.Views.FileMenuPanels.DocumentInfo.txtAddAuthor": "Add Author", + "PE.Views.FileMenuPanels.DocumentInfo.txtAddText": "Add Text", "PE.Views.FileMenuPanels.DocumentInfo.txtAuthor": "Author", "PE.Views.FileMenuPanels.DocumentInfo.txtBtnAccessRights": "Change access rights", - "PE.Views.FileMenuPanels.DocumentInfo.txtDate": "Creation Date", + "PE.Views.FileMenuPanels.DocumentInfo.txtComment": "Comment", + "del_PE.Views.FileMenuPanels.DocumentInfo.txtDate": "Creation Date", + "PE.Views.FileMenuPanels.DocumentInfo.txtCreated": "Created", + "PE.Views.FileMenuPanels.DocumentInfo.txtModifyDate": "Last Modified", + "PE.Views.FileMenuPanels.DocumentInfo.txtModifyBy": "Last Modified By", + "PE.Views.FileMenuPanels.DocumentInfo.txtOwner": "Owner", "PE.Views.FileMenuPanels.DocumentInfo.txtPlacement": "Location", "PE.Views.FileMenuPanels.DocumentInfo.txtRights": "Persons who have rights", - "PE.Views.FileMenuPanels.DocumentInfo.txtTitle": "Presentation Title", + "PE.Views.FileMenuPanels.DocumentInfo.txtSubject": "Subject", + "PE.Views.FileMenuPanels.DocumentInfo.txtTitle": "Title", + "PE.Views.FileMenuPanels.DocumentInfo.txtUploaded": "Uploaded", "PE.Views.FileMenuPanels.DocumentRights.txtBtnAccessRights": "Change access rights", "PE.Views.FileMenuPanels.DocumentRights.txtRights": "Persons who have rights", "PE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Warning", diff --git a/apps/presentationeditor/main/resources/less/leftmenu.less b/apps/presentationeditor/main/resources/less/leftmenu.less index 206dbcc46..8b3682eaa 100644 --- a/apps/presentationeditor/main/resources/less/leftmenu.less +++ b/apps/presentationeditor/main/resources/less/leftmenu.less @@ -433,6 +433,27 @@ label, span { font-size: 12px; } + + .close { + width: 16px; + height: 16px; + cursor: pointer; + display: inline-block; + vertical-align: middle; + margin-left: 5px; + + background-position: @but-close-offset-x @but-close-offset-y; + + &.over, + &:hover { + background-position: @but-close-offset-x @but-close-offset-y - 16px; + } + + &.disabled { + background-position: @but-close-offset-x @but-close-offset-y - 32px; + cursor: default; + } + } } #panel-protect { diff --git a/apps/presentationeditor/mobile/app/controller/Main.js b/apps/presentationeditor/mobile/app/controller/Main.js index c3ca9ef5c..cf0603d52 100644 --- a/apps/presentationeditor/mobile/app/controller/Main.js +++ b/apps/presentationeditor/mobile/app/controller/Main.js @@ -608,7 +608,7 @@ define([ text: me.textContactUs, bold: true, onClick: function() { - window.open('mailto:sales@onlyoffice.com', "_blank"); + window.open('mailto:{{SALES_EMAIL}}', "_blank"); } }, { text: me.textClose }] diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index 11a97f5ab..6f957c497 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -205,7 +205,7 @@ define([ $(document.body).on('blur', 'input, textarea', function(e) { if (me.isAppDisabled === true || me.isFrameClosed) return; - if ((!me.isModalShowed || $('.asc-window.enable-key-events:visible').length>0) && !(me.loadMask && me.loadMask.isVisible())) { + if ((!me.isModalShowed || $('.asc-window.enable-key-events:visible').length>0) && !(me.loadMask && me.loadMask.isVisible()) && !me.getApplication().getController('LeftMenu').getView('LeftMenu').getMenu('file').isVisible()) { if (/form-control/.test(e.target.className)) me.inFormControl = false; if (!e.relatedTarget || @@ -853,7 +853,7 @@ define([ primary: 'contact', callback: function(btn) { if (btn == 'contact') - window.open('mailto:sales@onlyoffice.com', "_blank"); + window.open('mailto:{{SALES_EMAIL}}', "_blank"); } }); } @@ -912,10 +912,6 @@ define([ this.appOptions.canBranding = params.asc_getCustomization(); if (this.appOptions.canBranding) this.headerView.setBranding(this.editorConfig.customization); - else if (typeof this.editorConfig.customization == 'object') { - this.editorConfig.customization.compactHeader = this.editorConfig.customization.toolbarNoTabs = - this.editorConfig.customization.toolbarHideFileName = false; - } this.appOptions.canRename && this.headerView.setCanRename(true); } else diff --git a/apps/spreadsheeteditor/main/app/view/CellEditor.js b/apps/spreadsheeteditor/main/app/view/CellEditor.js index a1bd038ff..c57fe2575 100644 --- a/apps/spreadsheeteditor/main/app/view/CellEditor.js +++ b/apps/spreadsheeteditor/main/app/view/CellEditor.js @@ -62,8 +62,6 @@ define([ { caption: this.textManager, value: 'manager' }, { caption: '--' } ] - }).on('show:after', function () { - this.scroller.update({alwaysVisibleY: true}); }) }); this.btnNamedRanges.render($('#ce-cell-name-menu')); diff --git a/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js b/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js index 65731d5a8..e5e83fbd8 100644 --- a/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js +++ b/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js @@ -1050,40 +1050,175 @@ define([ this.template = _.template([ '', '', - '', - '', - '', - '', - '', - '', - '', - '', '', '', '', - '', - '', - '', + '', + '', + '', '', - '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', '', - '', + '', + '', + '', + '', + '', + '', + '', + '', + '', '', - '', '
-
', + '', + '', + '', + '', + '
', + '
' ].join('')); this.menu = options.menu; + this.coreProps = null; + this.authors = []; }, render: function() { $(this.el).html(this.template()); - this.lblTitle = $('#id-info-title'); + var me = this; + + // server info this.lblPlacement = $('#id-info-placement'); + this.lblOwner = $('#id-info-owner'); + this.lblUploaded = $('#id-info-uploaded'); + + // edited info + var keyDownBefore = function(input, e){ + if (e.keyCode === Common.UI.Keys.ESC) { + var newVal = input._input.val(), + oldVal = input.getValue(); + if (newVal !== oldVal) { + input.setValue(oldVal); + e.stopPropagation(); + } + } + }; + + this.inputTitle = new Common.UI.InputField({ + el : $('#id-info-title'), + style : 'width: 200px;', + placeHolder : this.txtAddText, + validateOnBlur: false + }).on('changed:after', function(input, newValue, oldValue) { + if (newValue !== oldValue && me.coreProps && me.api) { + me.coreProps.asc_putTitle(me.inputTitle.getValue()); + me.api.asc_setCoreProps(me.coreProps); + } + }).on('keydown:before', keyDownBefore); + this.inputSubject = new Common.UI.InputField({ + el : $('#id-info-subject'), + style : 'width: 200px;', + placeHolder : this.txtAddText, + validateOnBlur: false + }).on('changed:after', function(input, newValue, oldValue) { + if (newValue !== oldValue && me.coreProps && me.api) { + me.coreProps.asc_putSubject(me.inputSubject.getValue()); + me.api.asc_setCoreProps(me.coreProps); + } + }).on('keydown:before', keyDownBefore); + this.inputComment = new Common.UI.InputField({ + el : $('#id-info-comment'), + style : 'width: 200px;', + placeHolder : this.txtAddText, + validateOnBlur: false + }).on('changed:after', function(input, newValue, oldValue) { + if (newValue !== oldValue && me.coreProps && me.api) { + me.coreProps.asc_putDescription(me.inputComment.getValue()); + me.api.asc_setCoreProps(me.coreProps); + } + }).on('keydown:before', keyDownBefore); + + // modify info + this.lblModifyDate = $('#id-info-modify-date'); + this.lblModifyBy = $('#id-info-modify-by'); + + // creation info this.lblDate = $('#id-info-date'); - this.lblAuthor = $('#id-info-author'); this.lblApplication = $('#id-info-appname'); + this.tblAuthor = $('#id-info-author table'); + this.trAuthor = $('#id-info-add-author').closest('tr'); + this.authorTpl = '
'; + + this.tblAuthor.on('click', function(e) { + var btn = $(e.target); + if (btn.hasClass('close') && !btn.hasClass('disabled')) { + var el = btn.closest('tr'), + idx = me.tblAuthor.find('tr').index(el); + el.remove(); + me.authors.splice(idx, 1); + if (me.coreProps && me.api) { + me.coreProps.asc_putCreator(me.authors.join(';')); + me.api.asc_setCoreProps(me.coreProps); + } + } + }); + + this.inputAuthor = new Common.UI.InputField({ + el : $('#id-info-add-author'), + style : 'width: 200px;', + validateOnBlur: false, + placeHolder: this.txtAddAuthor + }).on('changed:after', function(input, newValue, oldValue) { + if (newValue == oldValue) return; + + var val = newValue.trim(); + if (!!val && val !== oldValue.trim()) { + val.split(/\s*[,;]\s*/).forEach(function(item){ + var str = item.trim(); + if (str) { + var div = $(Common.Utils.String.format(me.authorTpl, Common.Utils.String.htmlEncode(str))); + me.trAuthor.before(div); + me.authors.push(item); + } + }); + me.inputAuthor.setValue(''); + if (me.coreProps && me.api) { + me.coreProps.asc_putCreator(me.authors.join(';')); + me.api.asc_setCoreProps(me.coreProps); + } + } + }).on('keydown:before', keyDownBefore); this.rendered = true; @@ -1101,6 +1236,8 @@ define([ show: function() { Common.UI.BaseView.prototype.show.call(this,arguments); + + this.updateFileInfo(); }, hide: function() { @@ -1112,37 +1249,95 @@ define([ if (!this.rendered) return; + var visible = false; doc = doc || {}; - this.lblTitle.text((doc.title) ? doc.title : '-'); - if (doc.info) { - if (doc.info.author) - this.lblAuthor.text(doc.info.author); - this._ShowHideInfoItem('author', doc.info.author!==undefined && doc.info.author!==null); - if (doc.info.created ) - this.lblDate.text( doc.info.created ); - this._ShowHideInfoItem('date', doc.info.created!==undefined && doc.info.created!==null); + // server info if (doc.info.folder ) this.lblPlacement.text( doc.info.folder ); - this._ShowHideInfoItem('placement', doc.info.folder!==undefined && doc.info.folder!==null); + visible = this._ShowHideInfoItem(this.lblPlacement, doc.info.folder!==undefined && doc.info.folder!==null) || visible; + if (doc.info.author) + this.lblOwner.text(doc.info.author); + visible = this._ShowHideInfoItem(this.lblOwner, doc.info.author!==undefined && doc.info.author!==null) || visible; + if (doc.info.uploaded) + this.lblUploaded.text(doc.info.uploaded.toLocaleString()); + visible = this._ShowHideInfoItem(this.lblUploaded, doc.info.uploaded!==undefined && doc.info.uploaded!==null) || visible; } else this._ShowHideDocInfo(false); + $('tr.divider.general', this.el)[visible?'show':'hide'](); + var appname = (this.api) ? this.api.asc_getAppProps() : null; if (appname) { appname = (appname.asc_getApplication() || '') + ' ' + (appname.asc_getAppVersion() || ''); this.lblApplication.text(appname); } - this._ShowHideInfoItem('appname', !!appname); + this._ShowHideInfoItem(this.lblApplication, !!appname); + + this.coreProps = (this.api) ? this.api.asc_getCoreProps() : null; + if (this.coreProps) { + var value = this.coreProps.asc_getCreated(); + if (value) + this.lblDate.text(value.toLocaleString()); + this._ShowHideInfoItem(this.lblDate, !!value); + } }, - _ShowHideInfoItem: function(cls, visible) { - $('tr.'+cls, this.el)[visible?'show':'hide'](); + updateFileInfo: function() { + if (!this.rendered) + return; + + var me = this, + props = (this.api) ? this.api.asc_getCoreProps() : null, + value; + + this.coreProps = props; + // var app = (this.api) ? this.api.asc_getAppProps() : null; + // if (app) { + // value = app.asc_getTotalTime(); + // if (value) + // this.lblEditTime.text(value + ' ' + this.txtMinutes); + // } + // this._ShowHideInfoItem(this.lblEditTime, !!value); + + if (props) { + var visible = false; + value = props.asc_getModified(); + if (value) + this.lblModifyDate.text(value.toLocaleString()); + visible = this._ShowHideInfoItem(this.lblModifyDate, !!value) || visible; + value = props.asc_getLastModifiedBy(); + if (value) + this.lblModifyBy.text(value); + visible = this._ShowHideInfoItem(this.lblModifyBy, !!value) || visible; + $('tr.divider.modify', this.el)[visible?'show':'hide'](); + + value = props.asc_getTitle(); + this.inputTitle.setValue(value || ''); + value = props.asc_getSubject(); + this.inputSubject.setValue(value || ''); + value = props.asc_getDescription(); + this.inputComment.setValue(value || ''); + + this.tblAuthor.find('tr:not(:last-of-type)').remove(); + this.authors = []; + value = props.asc_getCreator();//"123\"\"\"\<\>,456"; + value && value.split(/\s*[,;]\s*/).forEach(function(item) { + var div = $(Common.Utils.String.format(me.authorTpl, Common.Utils.String.htmlEncode(item))); + me.trAuthor.before(div); + me.authors.push(item); + }); + } + }, + + _ShowHideInfoItem: function(el, visible) { + el.closest('tr')[visible?'show':'hide'](); + return visible; }, _ShowHideDocInfo: function(visible) { - this._ShowHideInfoItem('date', visible); - this._ShowHideInfoItem('placement', visible); - this._ShowHideInfoItem('author', visible); + this._ShowHideInfoItem(this.lblPlacement, visible); + this._ShowHideInfoItem(this.lblOwner, visible); + this._ShowHideInfoItem(this.lblUploaded, visible); }, setMode: function(mode) { @@ -1151,15 +1346,34 @@ define([ setApi: function(o) { this.api = o; + this.api.asc_registerCallback('asc_onLockCore', _.bind(this.onLockCore, this)); this.updateInfo(this.doc); return this; }, - txtTitle: 'Document Title', + onLockCore: function(lock) { + this.inputTitle.setDisabled(lock); + this.inputSubject.setDisabled(lock); + this.inputComment.setDisabled(lock); + this.inputAuthor.setDisabled(lock); + this.tblAuthor.find('.close').toggleClass('disabled', lock); + !lock && this.updateFileInfo(); + }, + + txtPlacement: 'Location', + txtOwner: 'Owner', + txtUploaded: 'Uploaded', + txtAppName: 'Application', + txtTitle: 'Title', + txtSubject: 'Subject', + txtComment: 'Comment', + txtModifyDate: 'Last Modified', + txtModifyBy: 'Last Modified By', + txtDate: 'Created', txtAuthor: 'Author', - txtPlacement: 'Placement', - txtDate: 'Creation Date', - txtAppName: 'Application' + txtAddAuthor: 'Add Author', + txtAddText: 'Add Text', + txtMinutes: 'min' }, SSE.Views.FileMenuPanels.DocumentInfo || {})); SSE.Views.FileMenuPanels.DocumentRights = Common.UI.BaseView.extend(_.extend({ diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index c077fde15..538261825 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -768,8 +768,8 @@ "SSE.Controllers.Toolbar.textOperator": "Operators", "SSE.Controllers.Toolbar.textPivot": "Pivot Table", "SSE.Controllers.Toolbar.textRadical": "Radicals", - "SSE.Controllers.Toolbar.textScript": "Scripts", "SSE.Controllers.Toolbar.textSymbols": "Symbols", + "SSE.Controllers.Toolbar.textScript": "Scripts", "SSE.Controllers.Toolbar.textWarning": "Warning", "SSE.Controllers.Toolbar.txtAccent_Accent": "Acute", "SSE.Controllers.Toolbar.txtAccent_ArrowD": "Right-left arrow above", @@ -1507,12 +1507,21 @@ "SSE.Views.FileMenuPanels.CreateNew.newDescriptionText": "Create a new blank spreadsheet which you will be able to style and format after it is created during the editing. Or choose one of the templates to start a spreadsheet of a certain type or purpose where some styles have already been pre-applied.", "SSE.Views.FileMenuPanels.CreateNew.newDocumentText": "New Spreadsheet", "SSE.Views.FileMenuPanels.DocumentInfo.txtAppName": "Application", + "SSE.Views.FileMenuPanels.DocumentInfo.txtAddAuthor": "Add Author", + "SSE.Views.FileMenuPanels.DocumentInfo.txtAddText": "Add Text", "SSE.Views.FileMenuPanels.DocumentInfo.txtAuthor": "Author", "SSE.Views.FileMenuPanels.DocumentInfo.txtBtnAccessRights": "Change access rights", - "SSE.Views.FileMenuPanels.DocumentInfo.txtDate": "Creation Date", + "SSE.Views.FileMenuPanels.DocumentInfo.txtComment": "Comment", + "del_SSE.Views.FileMenuPanels.DocumentInfo.txtDate": "Creation Date", + "SSE.Views.FileMenuPanels.DocumentInfo.txtCreated": "Created", + "SSE.Views.FileMenuPanels.DocumentInfo.txtModifyDate": "Last Modified", + "SSE.Views.FileMenuPanels.DocumentInfo.txtModifyBy": "Last Modified By", + "SSE.Views.FileMenuPanels.DocumentInfo.txtOwner": "Owner", "SSE.Views.FileMenuPanels.DocumentInfo.txtPlacement": "Location", "SSE.Views.FileMenuPanels.DocumentInfo.txtRights": "Persons who have rights", - "SSE.Views.FileMenuPanels.DocumentInfo.txtTitle": "Spreadsheet Title", + "SSE.Views.FileMenuPanels.DocumentInfo.txtSubject": "Subject", + "SSE.Views.FileMenuPanels.DocumentInfo.txtTitle": "Title", + "SSE.Views.FileMenuPanels.DocumentInfo.txtUploaded": "Uploaded", "SSE.Views.FileMenuPanels.DocumentRights.txtBtnAccessRights": "Change access rights", "SSE.Views.FileMenuPanels.DocumentRights.txtRights": "Persons who have rights", "SSE.Views.FileMenuPanels.MainSettingsGeneral.okButtonText": "Apply", diff --git a/apps/spreadsheeteditor/main/resources/less/leftmenu.less b/apps/spreadsheeteditor/main/resources/less/leftmenu.less index 2e10d4039..021ce8f9f 100644 --- a/apps/spreadsheeteditor/main/resources/less/leftmenu.less +++ b/apps/spreadsheeteditor/main/resources/less/leftmenu.less @@ -500,6 +500,27 @@ label, span { font-size: 12px; } + + .close { + width: 16px; + height: 16px; + cursor: pointer; + display: inline-block; + vertical-align: middle; + margin-left: 5px; + + background-position: @but-close-offset-x @but-close-offset-y; + + &.over, + &:hover { + background-position: @but-close-offset-x @but-close-offset-y - 16px; + } + + &.disabled { + background-position: @but-close-offset-x @but-close-offset-y - 32px; + cursor: default; + } + } } #panel-protect { diff --git a/apps/spreadsheeteditor/mobile/app/controller/Main.js b/apps/spreadsheeteditor/mobile/app/controller/Main.js index 6bff89d52..f77652414 100644 --- a/apps/spreadsheeteditor/mobile/app/controller/Main.js +++ b/apps/spreadsheeteditor/mobile/app/controller/Main.js @@ -623,7 +623,7 @@ define([ text: me.textContactUs, bold: true, onClick: function() { - window.open('mailto:sales@onlyoffice.com', "_blank"); + window.open('mailto:{{SALES_EMAIL}}', "_blank"); } }, { text: me.textClose }]