Merge pull request 'feature/pdf-history' (#922) from feature/pdf-history into release/v9.3.0

This commit is contained in:
Maxim Kadushkin
2026-01-23 08:53:59 +00:00
16 changed files with 438 additions and 59 deletions

View File

@ -789,6 +789,9 @@ define([
if ((!me.btnMailRecepients || !Common.UI.LayoutManager.isElementVisible('toolbar-collaboration-mailmerge')) && separator_last)
me.$el.find(separator_last).hide();
//! NOTE: conflicted code from branch feature/pdf-history. remove if is not relevant and merge is successful
//! Common.NotificationCenter.trigger('tab:visible', 'review', (window.PDFE && (config.isPDFAnnotate || config.isPDFEdit) || !window.PDFE && (config.isEdit || config.canViewReview || me.canComments))
//! && Common.UI.LayoutManager.isElementVisible('toolbar-collaboration'));
var visible = (config.isEdit || config.canViewReview || me.canComments) && Common.UI.LayoutManager.isElementVisible('toolbar-collaboration');
Common.NotificationCenter.trigger('tab:visible', 'review', visible);
if (Common.Utils.InternalSettings.get('toolbar-active-tab') && visible) { // collaboration tab has hign priority in view mode

View File

@ -148,6 +148,7 @@ require([
'Print',
'FormsTab',
'Common.Controllers.Fonts',
'Common.Controllers.History',
'Common.Controllers.Chat',
'Common.Controllers.Comments',
'Common.Controllers.Draw',
@ -156,7 +157,8 @@ require([
'Common.Controllers.ExternalDiagramEditor',
// 'Common.Controllers.ExternalOleEditor',
'Common.Controllers.Protection',
'Common.Controllers.Shortcuts'
'Common.Controllers.Shortcuts',
'Common.Controllers.ReviewChanges'
]
});
@ -187,6 +189,7 @@ require([
'pdfeditor/main/app/controller/FormsTab',
'pdfeditor/main/app/view/ChartSettings',
'common/main/lib/util/utils',
'common/main/lib/controller/History',
'common/main/lib/controller/Fonts',
'common/main/lib/controller/Comments',
'common/main/lib/controller/Chat',
@ -197,7 +200,8 @@ require([
// 'common/main/lib/controller/ExternalOleEditor',
'common/main/lib/controller/Draw',
'common/main/lib/controller/Protection',
'common/main/lib/controller/Shortcuts'
'common/main/lib/controller/Shortcuts',
'common/main/lib/controller/ReviewChanges'
], function() {
const code_path = !window.isIEBrowser ? 'pdfeditor/main/code' : 'pdfeditor/main/ie/code';
app.postLaunchScripts = [

View File

@ -101,9 +101,9 @@ define([
'file:close': this.clickToolbarTab.bind(this, 'other'),
'save:disabled': this.changeToolbarSaveState.bind(this)
},
// 'Common.Views.ReviewChanges': {
// 'collaboration:chat': _.bind(this.onShowHideChat, this)
// },
'Common.Views.ReviewChanges': {
'collaboration:chat': _.bind(this.onShowHideChat, this)
},
'ViewTab': {
'viewtab:navigation': _.bind(this.onShowHideNavigation, this),
'leftmenu:hide': _.bind(this.onLeftMenuHide, this)
@ -123,6 +123,10 @@ define([
Common.NotificationCenter.on('leftmenu:change', _.bind(this.onMenuChange, this));
Common.NotificationCenter.on('app:comment:add', _.bind(this.onAppAddComment, this));
Common.NotificationCenter.on('collaboration:history', _.bind(function () {
if ( !this.leftMenu.panelHistory.isVisible() )
this.clickMenuFileItem(null, 'history');
}, this));
Common.NotificationCenter.on('file:print', _.bind(this.clickToolbarPrint, this));
Common.NotificationCenter.on('search:resetmode', _.bind(this.onSetDefaultSearchMode, this));
},
@ -174,6 +178,8 @@ define([
}
/** coauthoring end **/
this.leftMenu.getMenu('file').setApi(api);
if (this.mode.canUseHistory)
this.getApplication().getController('Common.Controllers.History').setApi(this.api).setMode(this.mode);
this.getApplication().getController('PageThumbnails').setApi(this.api).setMode(this.mode);
this.getApplication().getController('Search').setApi(this.api).setMode(this.mode);
this.leftMenu.setOptionsPanel('advancedsearch', this.getApplication().getController('Search').getView('Common.Views.SearchPanel'));
@ -203,6 +209,9 @@ define([
}
/** coauthoring end **/
if (this.mode.canUseHistory)
this.leftMenu.setOptionsPanel('history', this.getApplication().getController('Common.Controllers.History').getView('Common.Views.History'));
if (this.mode.canUseViwerNavigation) {
this.leftMenu.setOptionsPanel('navigation', this.getApplication().getController('Navigation').getView('Navigation'));
} else {
@ -271,6 +280,31 @@ define([
case 'close-editor': Common.NotificationCenter.trigger('close'); break;
case 'switch:mobile': Common.Gateway.switchEditorType('mobile', true); break;
case 'suggest': Common.NotificationCenter.trigger('suggest'); break;
case 'history':
if (!this.leftMenu.panelHistory.isVisible()) {
if (this.api.isDocumentModified()) {
var me = this;
this.api.asc_stopSaving();
Common.UI.warning({
closable: false,
width: 500,
title: this.notcriticalErrorTitle,
msg: this.leavePageText,
buttons: ['ok', 'cancel'],
primary: 'ok',
callback: function(btn) {
if (btn == 'ok') {
me.api.asc_undoAllChanges();
me.api.asc_continueSaving();
me.showHistory();
} else
me.api.asc_continueSaving();
}
});
} else
this.showHistory();
}
break;
default: close_menu = false;
}
@ -634,16 +668,16 @@ define([
if (this.leftMenu._state.disabled !== disable) {
this.leftMenu._state.disabled = disable;
if (this.mode) {
if (disable) {
this.previsEdit = this.mode.isEdit;
this.prevcanEdit = this.mode.canEdit;
this.mode.isEdit = this.mode.canEdit = !disable;
} else {
this.mode.isEdit = this.previsEdit;
this.mode.canEdit = this.prevcanEdit;
}
if (disable) {
this.previsEdit = this.mode.isEdit;
this.prevcanEdit = this.mode.canEdit;
this.mode.isEdit = this.mode.canEdit = !disable;
} else {
this.mode.isEdit = this.previsEdit;
this.mode.canEdit = this.prevcanEdit;
}
}
}
if (disable) this.leftMenu.close();
@ -653,6 +687,8 @@ define([
this.leftMenu.btnChat.setDisabled(disable);
if (!options || options.navigation && options.navigation.disable)
this.leftMenu.btnNavigation.setDisabled(disable);
if (!options || options.thumbnails && options.thumbnails.disable)
this.leftMenu.btnThumbnails.setDisabled(disable);
this.leftMenu.setDisabledPluginButtons(disable);
},
@ -868,6 +904,17 @@ define([
}
},
showHistory: function() {
if (!this.mode.wopi) {
var maincontroller = PDFE.getController('Main');
if (!maincontroller.loadMask)
maincontroller.loadMask = new Common.UI.LoadMask({owner: $('#viewport')});
maincontroller.loadMask.setTitle(this.textLoadHistory);
maincontroller.loadMask.show();
}
Common.Gateway.requestHistory();
},
onShowHideChat: function(state) {
if (this.mode.canCoAuthoring && this.mode.canChat && !this.mode.isLightVersion) {
if (state) {
@ -962,7 +1009,8 @@ define([
txtUntitled: 'Untitled',
txtCompatible: 'The document will be saved to the new format. It will allow to use all the editor features, but might affect the document layout.<br>Use the \'Compatibility\' option of the advanced settings if you want to make the files compatible with older MS Word versions.',
warnDownloadAsPdf: 'Your {0} will be converted to an editable format. This may take a while. The resulting document will be optimized to allow you to edit the text, so it might not look exactly like the original {0}, especially if the original file contained lots of graphics.',
textSelectPath: 'Enter a new name for saving the file copy'
textSelectPath: 'Enter a new name for saving the file copy',
textLoadHistory : 'Loading version history...'
}, PDFE.Controllers.LeftMenu || {}));
});

View File

@ -83,6 +83,7 @@ define([
models: [],
collections: [
'Common.Collections.TextArt',
'Common.Collections.HistoryUsers',
],
views: [],
@ -91,9 +92,9 @@ define([
'FileMenu': {
'settings:apply': _.bind(this.applySettings, this)
},
// 'Common.Views.ReviewChanges': {
// 'settings:apply': _.bind(this.applySettings, this)
// }
'Common.Views.ReviewChanges': {
'settings:apply': _.bind(this.applySettings, this)
}
});
this.translationTable = {
@ -497,7 +498,6 @@ define([
docInfo.asc_putIsEnabledMacroses(!!enable);
enable = !this.editorConfig.customization || (this.editorConfig.customization.plugins!==false);
docInfo.asc_putIsEnabledPlugins(!!enable);
// docInfo.put_Review(this.permissions.review);
var type = /^(?:(djvu|xps|oxps))$/.exec(data.doc.fileType);
var coEditMode = (type && typeof type[1] === 'string') ? 'strict' : // offline viewer for djvu|xps|oxps
@ -544,10 +544,10 @@ define([
Common.NotificationCenter.trigger('api:disconnect');
!old_rights && Common.UI.TooltipManager.showTip({ step: 'changeRights', text: _.isEmpty(data.message) ? this.warnProcessRightsChange : Common.Utils.String.htmlEncode(data.message),
target: '#toolbar', maxwidth: 600, showButton: false, automove: true, noHighlight: true, noArrow: true, multiple: true,
callback: function() {
me._state.lostEditingRights = false;
callback: function(){
me._state.lostEditingRights = false;
}});
}
}
},
onDownloadAs: function(format) {
@ -621,10 +621,12 @@ define([
statusBar: true,
rightMenu: {clear: !temp, disable: true},
leftMenu: {disable: true, previewMode: true},
fileMenu: {protect: true},
fileMenu: {protect: true, history: temp},
navigation: {disable: !temp, previewMode: true},
thumbnails: {disable: !temp},
comments: {disable: !temp, previewMode: true},
chat: true,
review: true,
viewport: true,
documentHolder: {clear: !temp, disable: true},
toolbar: true,
@ -651,6 +653,9 @@ define([
if (options.statusBar) {
app.getController('Statusbar').getView('Statusbar').SetDisabled(disable);
}
if (options.review) {
app.getController('Common.Controllers.ReviewChanges').SetDisabled(disable);
}
if (options.viewport) {
app.getController('Viewport').SetDisabled(disable);
}
@ -864,9 +869,6 @@ define([
if (this.appOptions.isEdit && (id==Asc.c_oAscAsyncAction['Save'] || id==Asc.c_oAscAsyncAction['ForceSaveButton']) && (!this._state.fastCoauth || this._state.usersCount<2))
this.synchronizeChanges();
// else if (this.appOptions.isEdit && (id==Asc.c_oAscAsyncAction['Save'] || id==Asc.c_oAscAsyncAction['ForceSaveButton'] || id == Asc.c_oAscAsyncAction['ApplyChanges']) &&
// this._state.fastCoauth)
// this.getApplication().getController('Common.Controllers.ReviewChanges').synchronizeChanges();
if ( id == Asc.c_oAscAsyncAction['Disconnect']) {
this._state.timerDisconnect && clearTimeout(this._state.timerDisconnect);
@ -966,9 +968,9 @@ define([
Common.UI.Menu.Manager.hideAll();
this.disableEditing(true, 'reconnect');
var me = this;
me._state.timerDisconnect = setTimeout(function(){
me._state.timerDisconnect = setTimeout(function(){
Common.UI.TooltipManager.showTip('disconnect');
}, me._state.unloadTimer || 0);
}, me._state.unloadTimer || 0);
this.getApplication().getController('Statusbar').setStatusCaption(text);
return;
@ -1170,6 +1172,7 @@ define([
Common.Gateway.on('applyeditrights', _.bind(me.onApplyEditRights, me));
Common.Gateway.on('processrightschange', _.bind(me.onProcessRightsChange, me));
Common.Gateway.on('processmouse', _.bind(me.onProcessMouse, me));
Common.Gateway.on('refreshhistory', _.bind(me.onRefreshHistory, me));
Common.Gateway.on('downloadas', _.bind(me.onDownloadAs, me));
Common.Gateway.on('setfavorite', _.bind(me.onSetFavorite, me));
Common.Gateway.on('requestclose', _.bind(me.onRequestClose, me));
@ -1258,19 +1261,19 @@ define([
!modal ? Common.UI.TooltipManager.showTip({ step: 'licenseError', text: license, header: title, target: '#toolbar', maxwidth: 430,
automove: true, noHighlight: true, noArrow: true, textButton: this.textContinue}) :
Common.UI.info({
maxwidth: 500,
Common.UI.info({
maxwidth: 500,
title: title,
msg : license,
buttons: buttons,
primary: primary,
callback: function(btn) {
if (btn == 'buynow')
window.open('{{PUBLISHER_URL}}', "_blank");
else if (btn == 'contact')
window.open('mailto:{{SALES_EMAIL}}', "_blank");
}
});
msg : license,
buttons: buttons,
primary: primary,
callback: function(btn) {
if (btn == 'buynow')
window.open('{{PUBLISHER_URL}}', "_blank");
else if (btn == 'contact')
window.open('mailto:{{SALES_EMAIL}}', "_blank");
}
});
} else if (!this.appOptions.isDesktopApp && !this.appOptions.canBrandingExt &&
this.editorConfig && this.editorConfig.customization && (this.editorConfig.customization.loaderName || this.editorConfig.customization.loaderLogo ||
this.editorConfig.customization.font && (this.editorConfig.customization.font.size || this.editorConfig.customization.font.name))) {
@ -1311,7 +1314,7 @@ define([
return;
}
if ( this.onServerVersion(params.asc_getBuildVersion()) || !this.onLanguageLoaded() ) return;
if ( this.onServerVersion(params.asc_getBuildVersion()) || !this.onLanguageLoaded()) return;
if ( this._isDocReady || this._isPermissionsInited ) {
this.api.asc_LoadDocument();
return;
@ -1344,6 +1347,10 @@ define([
this.appOptions.canSwitchMode = this.appOptions.isPDFAnnotate && this.appOptions.canPDFEdit; // switch between View/annotate and pdf edit
// this.appOptions.canCoEditing = (this.appOptions.isPDFAnnotate || this.appOptions.isPDFFill) && !(this.appOptions.isDesktopApp && this.appOptions.isOffline);
this.appOptions.canUseHistory = pdfEdit && this.appOptions.canLicense && this.editorConfig.canUseHistory && this.appOptions.canCoAuthoring && !this.appOptions.isOffline;
this.appOptions.canHistoryClose = this.editorConfig.canHistoryClose;
this.appOptions.canHistoryRestore= this.editorConfig.canHistoryRestore;
this.appOptions.canComments = pdfEdit && this.appOptions.canLicense && (this.permissions.comment===undefined ? this.appOptions.isPDFAnnotate : this.permissions.comment) && (this.editorConfig.mode !== 'view');
this.appOptions.canComments = this.appOptions.canComments && !((typeof (this.editorConfig.customization) == 'object') && this.editorConfig.customization.comments===false);
this.appOptions.canViewComments = this.appOptions.canComments || pdfEdit && !((typeof (this.editorConfig.customization) == 'object') && this.editorConfig.customization.comments===false);
@ -1655,9 +1662,9 @@ define([
applyModeEditorElements: function() {
var me = this,
application = this.getApplication();
// reviewController = application.getController('Common.Controllers.ReviewChanges');
// reviewController.setMode(me.appOptions).setConfig({config: me.editorConfig}, me.api).loadDocument({doc:me.document});
application = this.getApplication(),
reviewController = application.getController('Common.Controllers.ReviewChanges');
reviewController.setMode(me.appOptions).setConfig({config: me.editorConfig}, me.api).loadDocument({doc:me.document});
if (this.appOptions.isEdit) {
if (me.appOptions.isSignatureSupport || me.appOptions.isPasswordSupport)
@ -1704,11 +1711,14 @@ define([
onError: function(id, level, errData) {
switch (id) {
case Asc.c_oAscError.ID.LoadingScriptError:
this.showTips([this.scriptLoadError]);
this.tooltip && this.tooltip.getBSTip().$tip.css('z-index', 10000);
return;
this.showTips([this.scriptLoadError]);
this.tooltip && this.tooltip.getBSTip().$tip.css('z-index', 10000);
return;
case Asc.c_oAscError.ID.CanNotPasteImage:
this.showTips([this.errorCannotPasteImg], {timeout: 7000, hideCloseTip: true});
this.showTips([this.errorCannotPasteImg], {timeout: 7000, hideCloseTip: true});
return;
case Asc.c_oAscError.ID.DocumentAndChangeMismatch:
this.getApplication().getController('Common.Controllers.History').onHashError();
return;
case Asc.c_oAscError.ID.UpdateVersion:
Common.UI.TooltipManager.showTip('updateVersion');
@ -1723,7 +1733,7 @@ define([
if (this._state.lostEditingRights) {
this._state.lostEditingRights = false;
return;
}
}
this._state.lostEditingRights = true;
Common.NotificationCenter.trigger('collaboration:sharingdeny');
var me = this;
@ -2420,7 +2430,7 @@ define([
Common.localStorage.setItem("pdfe-settings-showchanges-strict", 'last');
Common.Utils.InternalSettings.set("pdfe-settings-showchanges-strict", 'last');
this.api.SetCollaborativeMarksShowType(Asc.c_oAscCollaborativeMarksShowType.LastChanges);
// this.getApplication().getController('Common.Controllers.ReviewChanges').applySettings();
this.getApplication().getController('Common.Controllers.ReviewChanges').applySettings();
}
this.onEditComplete();
}, this)
@ -2484,6 +2494,7 @@ define([
var filemenu = this.getApplication().getController('LeftMenu').getView('LeftMenu').getMenu('file');
filemenu.loadDocument({doc:this.document});
filemenu.panels && filemenu.panels['info'] && filemenu.panels['info'].updateInfo(this.document);
this.getApplication().getController('Common.Controllers.ReviewChanges').loadDocument({doc:this.document});
Common.Gateway.metaChange(meta);
if (this.appOptions.wopi) {
@ -2758,6 +2769,176 @@ define([
}
},
DisableVersionHistory: function() {
this.editorConfig.canUseHistory = false;
this.appOptions.canUseHistory = false;
},
onRefreshHistory: function(opts) {
if (!this.appOptions.canUseHistory) return;
this.loadMask && this.loadMask.hide();
if (opts.data.error || !opts.data.history) {
var historyStore = this.getApplication().getCollection('Common.Collections.HistoryVersions');
if (historyStore && historyStore.size()>0) {
historyStore.each(function(item){
item.set('canRestore', false);
});
}
Common.UI.alert({
title: this.notcriticalErrorTitle,
msg: (opts.data.error) ? opts.data.error : this.txtErrorLoadHistory,
iconCls: 'warn',
buttons: ['ok'],
callback: _.bind(function(btn){
this.onEditComplete();
}, this)
});
} else {
this.api.asc_coAuthoringDisconnect();
appHeader.setCanRename(false);
appHeader.getButton('users') && appHeader.getButton('users').hide();
appHeader.getButton('share') && appHeader.getButton('share').setVisible(false);
this.getApplication().getController('LeftMenu').getView('LeftMenu').showHistory();
this.disableEditing(true);
this._renameDialog && this._renameDialog.close();
var versions = opts.data.history,
historyStore = this.getApplication().getCollection('Common.Collections.HistoryVersions'),
currentVersion = null,
arrIds = [];
if (historyStore) {
var arrVersions = [], ver, version, group = -1, prev_ver = -1, arrColors = [], docIdPrev = '',
usersStore = this.getApplication().getCollection('Common.Collections.HistoryUsers'), user = null, usersCnt = 0;
for (var ver=versions.length-1, index = 0; ver>=0; ver--, index++) {
version = versions[ver];
if (version.versionGroup===undefined || version.versionGroup===null)
version.versionGroup = version.version;
if (version) {
if (!version.user) version.user = {};
docIdPrev = (ver>0 && versions[ver-1]) ? versions[ver-1].key : version.key + '0';
user = usersStore.findUser(version.user.id);
if (!user) {
var color = Common.UI.ExternalUsers.getColor(version.user.id || version.user.name || this.textAnonymous, true);
user = new Common.Models.User({
id : version.user.id,
username : version.user.name || this.textAnonymous,
colorval : color,
color : this.generateUserColor(color)
});
usersStore.add(user);
}
var avatar = Common.UI.ExternalUsers.getImage(version.user.id);
(avatar===undefined) && arrIds.push(version.user.id);
arrVersions.push(new Common.Models.HistoryVersion({
version: version.versionGroup,
revision: version.version,
userid : version.user.id,
username : version.user.name || this.textAnonymous,
usercolor: user.get('color'),
initials : Common.Utils.getUserInitials(AscCommon.UserInfoParser.getParsedName(version.user.name || this.textAnonymous)),
avatar : avatar,
created: version.created,
docId: version.key,
markedAsVersion: (group!==version.versionGroup),
selected: (opts.data.currentVersion == version.version),
canRestore: this.appOptions.canHistoryRestore && (ver < versions.length-1),
isExpanded: true,
serverVersion: version.serverVersion,
fileType: 'docx',
index: index
}));
if (opts.data.currentVersion == version.version) {
currentVersion = arrVersions[arrVersions.length-1];
}
group = version.versionGroup;
if (prev_ver!==version.version) {
prev_ver = version.version;
arrColors.reverse();
for (i=0; i<arrColors.length; i++) {
arrVersions[arrVersions.length-i-2].set('arrColors',arrColors);
}
arrColors = [];
}
arrColors.push(user.get('colorval'));
var changes = version.changes, change, i;
if (changes && changes.length>0 && false) { // hide changes for pdf
arrVersions[arrVersions.length-1].set('docIdPrev', docIdPrev);
if (!_.isEmpty(version.serverVersion) && version.serverVersion == this.appOptions.buildVersion) {
arrVersions[arrVersions.length-1].set('changeid', changes.length-1);
arrVersions[arrVersions.length-1].set('hasSubItems', changes.length>1);
arrVersions[arrVersions.length-1].set('documentSha256', changes[changes.length-1].documentSha256);
for (i=changes.length-2; i>=0; i--, index++) {
change = changes[i];
user = usersStore.findUser(change.user.id);
if (!user) {
var color = Common.UI.ExternalUsers.getColor(change.user.id || change.user.name || this.textAnonymous, true);
user = new Common.Models.User({
id : change.user.id,
username : change.user.name || this.textAnonymous,
colorval : color,
color : this.generateUserColor(color)
});
usersStore.add(user);
}
avatar = Common.UI.ExternalUsers.getImage(change.user.id);
(avatar===undefined) && arrIds.push(change.user.id);
arrVersions.push(new Common.Models.HistoryVersion({
version: version.versionGroup,
revision: version.version,
changeid: i,
userid : change.user.id,
username : change.user.name || this.textAnonymous,
usercolor: user.get('color'),
initials : Common.Utils.getUserInitials(AscCommon.UserInfoParser.getParsedName(change.user.name || this.textAnonymous)),
avatar : avatar,
created: change.created,
docId: version.key,
docIdPrev: docIdPrev,
selected: false,
canRestore: this.appOptions.canHistoryRestore && this.appOptions.canDownload,
isRevision: false,
isVisible: true,
serverVersion: version.serverVersion,
documentSha256: change.documentSha256,
fileType: 'docx',
hasParent: true,
index: index,
level: 1
}));
arrColors.push(user.get('colorval'));
}
}
} else if (ver==0 && versions.length==1) {
arrVersions[arrVersions.length-1].set('docId', version.key + '1');
}
}
}
if (arrColors.length>0) {
arrColors.reverse();
for (i=0; i<arrColors.length; i++) {
arrVersions[arrVersions.length-i-1].set('arrColors',arrColors);
}
arrColors = [];
}
historyStore.reset(arrVersions);
if (currentVersion===null && historyStore.size()>0) {
currentVersion = historyStore.at(0);
currentVersion.set('selected', true);
}
if (currentVersion)
this.getApplication().getController('Common.Controllers.History').onSelectRevision(null, null, currentVersion);
arrIds.length && Common.UI.ExternalUsers.get('info', arrIds);
}
}
},
generateUserColor: function(color) {
return"#"+("000000"+color.toString(16)).substr(-6);
},
onSaveDocumentBinary: function(data) {
Common.Gateway.saveDocument(data);
},

View File

@ -643,7 +643,7 @@ define([
if (annotPr && annotPr.asc_getCanEditText && annotPr.asc_getCanEditText()) {
in_text_annot = true;
no_text = false;
}
}
} else if (type == Asc.c_oAscTypeSelectElement.PdfPage) {
page_deleted = pr.asc_getDeleteLock();
page_rotate_lock = pr.asc_getRotateLock();
@ -654,7 +654,7 @@ define([
no_text = false;
in_text_form = ft===AscPDF.FIELD_TYPES.text || ft===AscPDF.FIELD_TYPES.combobox || ft===AscPDF.FIELD_TYPES.listbox;
in_check_form = ft===AscPDF.FIELD_TYPES.checkbox || ft===AscPDF.FIELD_TYPES.radiobutton;
}
}
}
if (this._state.prcontrolsdisable !== paragraph_locked) {
@ -819,8 +819,8 @@ define([
options.asc_setIsSaveAs(false);
me.api.asc_DownloadOrigin(options);
} else {
Common.UI.info({
maxwidth: 500,
Common.UI.info({
maxwidth: 500,
msg: this.errorAccessDeny,
callback: function(btn) {
Common.NotificationCenter.trigger('edit:complete', toolbar);
@ -1555,6 +1555,13 @@ define([
}
me.getApplication().getController('Common.Controllers.ExternalLinks').setConfig({toolbar: me}).setApi(me.api);
!config.canComments && me.toolbar.setVisible('comment', false);
var tab = {action: 'review', caption: me.toolbar.textTabCollaboration, dataHintTitle: 'U', layoutname: 'toolbar-collaboration'};
var $panel = me.getApplication().getController('Common.Controllers.ReviewChanges').createToolbarPanel();
if ( $panel ) {
me.toolbar.addTab(tab, $panel, 7);
me.toolbar.setVisible('review', (config.isPDFAnnotate || config.isPDFEdit) && Common.UI.LayoutManager.isElementVisible('toolbar-collaboration') ); // use config.canViewReview in review controller. set visible review tab in view mode only when asc_HaveRevisionsChanges
}
}
var tab = {caption: me.toolbar.textTabView, action: 'view', extcls: config.isEdit ? 'canedit' : '', layoutname: 'toolbar-view', dataHintTitle: 'W'};
@ -1600,7 +1607,7 @@ define([
me.toolbar.setVisible('forms', true);
Array.prototype.push.apply(me.toolbar.lockControls, forms.getView('FormsTab').getButtons());
}
}
}
}
},
@ -1714,6 +1721,30 @@ define([
me.toolbar.btnSubmit.updateHint(me.textRequired);
}
}
me.btnsComment = [];
if ( config.canComments ) {
var _set = Common.enumLock;
me.btnsComment = Common.Utils.injectButtons(me.toolbar.$el.find('.slot-comment'), 'tlbtn-addcomment-', 'toolbar__icon btn-big-add-comment', me.toolbar.capBtnComment, [_set.lostConnect], undefined, undefined, undefined, '1', 'bottom', 'small');
if ( me.btnsComment.length ) {
var _comments = PDFE.getController('Common.Controllers.Comments').getView();
me.btnsComment.forEach(function (btn) {
btn.updateHint( _comments.textHintAddComment );
btn.on('click', function (btn, e) {
Common.NotificationCenter.trigger('app:comment:add', 'toolbar');
});
if (btn.cmpEl.closest('#review-changes-panel').length>0)
btn.setCaption(me.toolbar.capBtnAddComment);
}, me);
if (_comments.buttonAddNew) {
_comments.buttonAddNew.options.lock = [ _set.lostConnect ];
me.btnsComment.add(_comments.buttonAddNew);
}
Array.prototype.push.apply(me.toolbar.lockControls, me.btnsComment);
Array.prototype.push.apply(me.toolbar.toolbarControls, me.btnsComment);
}
}
});
},

View File

@ -154,10 +154,11 @@ define([
Common.NotificationCenter.on('layout:changed', _.bind(this.onLayoutChanged, this));
$(window).on('resize', _.bind(this.onWindowResize, this));
var leftPanel = $('#left-menu');
var leftPanel = $('#left-menu'),
histPanel = $('#left-panel-history');
this.viewport.hlayout.on('layout:resizedrag', function() {
this.api.Resize();
Common.localStorage.setItem('pdfe-mainmenu-width', leftPanel.width() );
Common.localStorage.setItem('pdfe-mainmenu-width', histPanel.is(':visible') ? (histPanel.width()+SCALE_MIN) : leftPanel.width() );
}, this);
this.boxSdk = $('#editor_sdk');
@ -220,6 +221,14 @@ define([
case 'rightmenu':
this.viewport.hlayout.doLayout();
break;
case 'history':
var panel = this.viewport.hlayout.getItem('history');
if (panel.resize.el) {
this.boxSdk.css('border-left', '');
panel.resize.el.show();
}
this.viewport.hlayout.doLayout();
break;
case 'leftmenu':
var panel = this.viewport.hlayout.getItem('left');
if (panel.resize.el) {

View File

@ -13,6 +13,7 @@
<li id="fm-btn-protect" class="fm-btn"></li>
<li class="devider"></li>
<li id="fm-btn-info" class="fm-btn" data-layout-name="toolbar-file-info"></li>
<li id="fm-btn-history" class="fm-btn"></li>
<li id="fm-btn-rights" class="fm-btn"></li>
<li id="fm-btn-back" class="fm-btn"></li>
<li class="devider-last"></li>

View File

@ -11,6 +11,7 @@
<div id="about-menu-panel" class="left-menu-full-ct" style="display:none;"></div>
<div id="editor-container" class="layout-item"><div id="editor_sdk"></div></div>
<div id="right-menu" class="layout-item hint-section" data-layout-name="rightMenu"></div>
<div id="left-panel-history" class="layout-item"></div>
</div>
</div>
<div id="statusbar" class="layout-item" data-layout-name="statusBar"></div>

View File

@ -254,6 +254,21 @@ define([
iconCls: 'menu__icon btn-users-share'
});
this.miHistory = new Common.UI.MenuItem({
el : $markup.elementById('#fm-btn-history'),
action : 'history',
caption : this.btnHistoryCaption,
canFocused: false,
dataHint: 1,
dataHintDirection: 'left-top',
dataHintOffset: [-2, 22],
iconCls: 'menu__icon btn-version-history'
});
if ( !!this.options.miHistory ) {
this.miHistory.setDisabled(this.options.miHistory.isDisabled());
delete this.options.miHistory;
}
this.miSettings = new Common.UI.MenuItem({
el : $markup.elementById('#fm-btn-settings'),
action : 'opts',
@ -313,6 +328,7 @@ define([
this.miNew,
this.miInfo,
this.miAccess,
this.miHistory,
this.miSettings,
this.miHelp,
this.miBack,
@ -411,6 +427,12 @@ define([
(this.mode.sharingSettingsUrl&&this.mode.sharingSettingsUrl.length || this.mode.canRequestSharingSettings));
this.miAccess[isVisible?'show':'hide']();
isVisible = this.mode.canUseHistory&&!this.mode.isDisconnected;
// separatorVisible = separatorVisible || isVisible;
this.miHistory[isVisible?'show':'hide']();
// this.miHistory.$el.find('+.devider')[separatorVisible?'show':'hide']();
// separatorVisible && (lastSeparator = this.miHistory.$el.find('+.devider'));
isVisible = Common.UI.LayoutManager.isElementVisible('toolbar-file-settings');
this.miSettings[isVisible?'show':'hide']();
isVisible = this.mode.canHelp;
@ -644,9 +666,11 @@ define([
},
SetDisabled: function(disable, options) {
var _btn_protect = this.getButton('protect');
var _btn_protect = this.getButton('protect'),
_btn_history = this.getButton('history');
options && options.protect && _btn_protect.setDisabled(disable);
options && options.history && _btn_history.setDisabled(disable);
options && options.info && (this.panels ? this.panels['info'].setPreviewMode(disable) : this._state.infoPreviewMode = disable );
},
@ -664,6 +688,9 @@ define([
} else
if (type == 'protect') {
return this.options.miProtect ? this.options.miProtect : (this.options.miProtect = new Common.UI.MenuItem({}));
} else
if (type == 'history') {
return this.options.miHistory ? this.options.miHistory : (this.options.miHistory = new Common.UI.MenuItem({}));
}
} else {
if (type == 'save') {
@ -674,6 +701,9 @@ define([
}else
if (type == 'protect') {
return this.miProtect;
}else
if (type == 'history') {
return this.miHistory;
}
}
},
@ -699,6 +729,7 @@ define([
btnExitCaption : 'Exit',
btnFileOpenCaption : 'Open...',
btnCloseEditor : 'Close File',
ariaFileMenu : 'File menu'
ariaFileMenu : 'File menu',
btnHistoryCaption : 'Versions History'
}, PDFE.Views.FileMenu || {}));
});

View File

@ -48,6 +48,7 @@ define([
'common/main/lib/view/Comments',
'common/main/lib/view/Chat',
/** coauthoring end **/
'common/main/lib/view/History',
'common/main/lib/view/Plugins',
'common/main/lib/view/About',
'pdfeditor/main/app/view/FileMenu',
@ -289,6 +290,9 @@ define([
} else
if (name == 'advancedsearch') {
this.panelSearch = panel.render('#left-panel-search');
} else /** coauthoring end **/
if (name == 'history') {
this.panelHistory = panel.render('#left-panel-history');
}
},
@ -422,6 +426,13 @@ define([
return this;
},
showHistory: function() {
this._state.pluginIsRunning = false;
this.panelHistory.show();
this.panelHistory.$el.width((parseInt(Common.localStorage.getItem('pdfe-mainmenu-width')) || MENU_SCALE_PART) - SCALE_MIN);
Common.NotificationCenter.trigger('layout:changed', 'history');
},
setDeveloperMode: function(mode, beta, version) {
if ( !this.$el.is(':visible') ) return;

View File

@ -112,7 +112,17 @@ define([
autohide: false,
min: 300,
max: 600
}}, { // sdk
}}, { // history versions
el: items[3],
rely: true,
alias: 'history',
resize: {
hidden: true,
autohide: false,
min: 300,
max: 600
}
}, { // sdk
el: items[1],
stretch: true
}, {

View File

@ -138,6 +138,7 @@ require([
'Print',
'FormsTab',
'Common.Controllers.Fonts'
,'Common.Controllers.History'
,'Common.Controllers.Chat'
,'Common.Controllers.Comments'
,'Common.Controllers.Draw'
@ -147,6 +148,7 @@ require([
// ,'Common.Controllers.ExternalOleEditor'
,'Common.Controllers.Protection'
,'Common.Controllers.Shortcuts'
,'Common.Controllers.ReviewChanges'
]
});
@ -178,6 +180,7 @@ require([
'pdfeditor/main/app/view/ChartSettings',
'common/main/lib/util/utils',
'common/main/lib/controller/Fonts',
'common/main/lib/controller/History',
'common/main/lib/controller/Comments'
,'common/main/lib/controller/Chat'
,'common/main/lib/controller/Plugins'
@ -187,6 +190,7 @@ require([
,'common/main/lib/controller/Draw'
,'common/main/lib/controller/Protection'
,'common/main/lib/controller/Shortcuts'
,'common/main/lib/controller/ReviewChanges'
], function() {
app.postLaunchScripts = [
'common/main/lib/controller/ScreenReaderFocus',

View File

@ -829,6 +829,32 @@
"Common.Views.RecentFiles.txtOpenRecent": "Open Recent",
"Common.Views.RenameDialog.textName": "File name",
"Common.Views.RenameDialog.txtInvalidName": "The file name cannot contain any of the following characters: ",
"Common.Views.ReviewChanges.strFast": "Fast",
"Common.Views.ReviewChanges.strFastDesc": "Real-time co-editing. All changes are saved automatically.",
"Common.Views.ReviewChanges.strStrict": "Strict",
"Common.Views.ReviewChanges.strStrictDesc": "Use the 'Save' button to sync the changes you and others make.",
"Common.Views.ReviewChanges.tipCoAuthMode": "Set co-editing mode",
"Common.Views.ReviewChanges.tipCommentRem": "Delete comments",
"Common.Views.ReviewChanges.tipCommentRemCurrent": "Delete current comments",
"Common.Views.ReviewChanges.tipCommentResolve": "Resolve comments",
"Common.Views.ReviewChanges.tipCommentResolveCurrent": "Resolve current comments",
"Common.Views.ReviewChanges.tipHistory": "Show version history",
"Common.Views.ReviewChanges.tipSharing": "Manage document access rights",
"Common.Views.ReviewChanges.txtChat": "Chat",
"Common.Views.ReviewChanges.txtClose": "Close",
"Common.Views.ReviewChanges.txtCoAuthMode": "Co-editing Mode",
"Common.Views.ReviewChanges.txtCommentRemAll": "Delete all comments",
"Common.Views.ReviewChanges.txtCommentRemCurrent": "Delete current comments",
"Common.Views.ReviewChanges.txtCommentRemMy": "Delete my comments",
"Common.Views.ReviewChanges.txtCommentRemMyCurrent": "Delete my current comments",
"Common.Views.ReviewChanges.txtCommentRemove": "Delete",
"Common.Views.ReviewChanges.txtCommentResolve": "Resolve",
"Common.Views.ReviewChanges.txtCommentResolveAll": "Resolve all comments",
"Common.Views.ReviewChanges.txtCommentResolveCurrent": "Resolve current comments",
"Common.Views.ReviewChanges.txtCommentResolveMy": "Resolve my comments",
"Common.Views.ReviewChanges.txtCommentResolveMyCurrent": "Resolve my current comments",
"Common.Views.ReviewChanges.txtHistory": "Version history",
"Common.Views.ReviewChanges.txtSharing": "Sharing",
"Common.Views.ReviewPopover.textAdd": "Add",
"Common.Views.ReviewPopover.textAddReply": "Add Reply",
"Common.Views.ReviewPopover.textCancel": "Cancel",
@ -1425,6 +1451,7 @@
"PDFE.Controllers.LeftMenu.warnDownloadAs": "If you continue saving in this format all features except the text will be lost.<br>Are you sure you want to continue?",
"PDFE.Controllers.LeftMenu.warnDownloadAsPdf": "Your {0} will be converted to an editable format. This may take a while. The resulting document will be optimized to allow you to edit the text, so it might not look exactly like the original {0}, especially if the original file contained lots of graphics.",
"PDFE.Controllers.LeftMenu.warnDownloadAsRTF": "If you continue saving in this format some of the formatting might be lost.<br>Are you sure you want to continue?",
"PDFE.Controllers.LeftMenu.textLoadHistory": "Loading version history...",
"PDFE.Controllers.Main.applyChangesTextText": "Loading the changes...",
"PDFE.Controllers.Main.applyChangesTitleText": "Loading the changes",
"PDFE.Controllers.Main.confirmMaxChangesSize": "The size of actions exceeds the limitation set for your server.<br>Press \"Undo\" to cancel your last action or press \"Continue\" to keep action locally (you need to download the file or copy its content to make sure nothing is lost).",
@ -1595,6 +1622,7 @@
"PDFE.Controllers.Main.warnNoLicense": "You've reached the limit for simultaneous connections to %1 editors. This document will be opened for viewing only.<br>Contact %1 sales team for personal upgrade terms.",
"PDFE.Controllers.Main.warnNoLicenseUsers": "You've reached the user limit for %1 editors. Contact %1 sales team for personal upgrade terms.",
"PDFE.Controllers.Main.warnProcessRightsChange": "You have been denied the right to edit the file.",
"PDFE.Controllers.Main.txtErrorLoadHistory": "History loading failed",
"PDFE.Controllers.Navigation.txtBeginning": "Beginning of document",
"PDFE.Controllers.Navigation.txtGotoBeginning": "Go to the beginning of the document",
"PDFE.Controllers.Print.textMarginsLast": "Last custom",
@ -2035,6 +2063,7 @@
"PDFE.Views.FileMenu.btnSwitchToMobileCaption": "Switch to Mobile",
"PDFE.Views.FileMenu.btnToEditCaption": "Edit Document",
"PDFE.Views.FileMenu.textDownload": "Download",
"PDFE.Views.FileMenu.btnHistoryCaption": "Version History",
"PDFE.Views.FileMenuPanels.CreateNew.txtBlank": "Blank Document",
"PDFE.Views.FileMenuPanels.CreateNew.txtCreateNew": "Create new",
"PDFE.Views.FileMenuPanels.DocumentInfo.okButtonText": "Apply",
@ -3019,6 +3048,8 @@
"PDFE.Views.Toolbar.txtRotateRight": "Rotate right",
"PDFE.Views.Toolbar.txtSize": "Size",
"PDFE.Views.Toolbar.txtUngroup": "Ungroup",
"PDFE.Views.Toolbar.textTabCollaboration": "Collaboration",
"PDFE.Views.Toolbar.capBtnAddComment": "Add Comment",
"PDFE.Views.ViewTab.textAlwaysShowToolbar": "Always Show Toolbar",
"PDFE.Views.ViewTab.textDarkDocument": "Dark Document",
"PDFE.Views.ViewTab.textFill": "Fill",

View File

@ -96,6 +96,7 @@
@import "../../../../common/main/resources/less/winxp_fix.less";
@import "../../../../common/main/resources/less/symboltable.less";
@import "../../../../common/main/resources/less/hint-manager.less";
@import "../../../../common/main/resources/less/history.less";
@import "../../../../common/main/resources/less/bigscaling.less";
@import "../../../../common/main/resources/less/updown-picker.less";
@import "../../../../common/main/resources/less/calendar.less";

View File

@ -71,6 +71,13 @@ label {
}
}
#left-panel-history {
left: 40px;
width: 300px;
height: 100%;
display: none;
}
#editor_sdk {
width: 100%;
height: 100%;

View File

@ -11,6 +11,12 @@
}
}
.left-panel {
#left-panel-history {
height: 100%;
}
}
.left-menu-full-ct {
width: 100%;
height: 100%;