From 9f947aef57a17378e6cd546a29db3dd76b49494f Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Sun, 1 Mar 2026 01:38:49 +0300 Subject: [PATCH 1/5] [forms] fix bug 80349 --- apps/documenteditor/main/app/controller/FormsTab.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/documenteditor/main/app/controller/FormsTab.js b/apps/documenteditor/main/app/controller/FormsTab.js index 77bd7f4272..3d127da58b 100644 --- a/apps/documenteditor/main/app/controller/FormsTab.js +++ b/apps/documenteditor/main/app/controller/FormsTab.js @@ -161,7 +161,7 @@ define([ getView: function(name) { return !name && this.view ? - this.view : Backbone.Controller.prototype.getView.call(this, name); + this.view : name ? Backbone.Controller.prototype.getView.call(this, name) : undefined; }, onCoAuthoringDisconnect: function() { From 78b7f5dd774c4e4c246089b041a195ce0d7ad825 Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Sun, 1 Mar 2026 01:41:48 +0300 Subject: [PATCH 2/5] [DE] fix bug 80379 --- apps/documenteditor/main/app/controller/ViewTab.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/documenteditor/main/app/controller/ViewTab.js b/apps/documenteditor/main/app/controller/ViewTab.js index 3c543e33c0..9a62b47ca6 100644 --- a/apps/documenteditor/main/app/controller/ViewTab.js +++ b/apps/documenteditor/main/app/controller/ViewTab.js @@ -286,7 +286,8 @@ define([ }, onDocumentReady: function() { - Common.Utils.lockControls(Common.enumLock.disableOnStart, false, {array: this.view.lockedControls}); + if ( this.view ) + Common.Utils.lockControls(Common.enumLock.disableOnStart, false, {array: this.view.lockedControls}); }, onMultiplePages: function (pressed) { From 31e4b7b59b4f235bc3a9ba1f47c4e8d4e0d732aa Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Sun, 1 Mar 2026 01:43:12 +0300 Subject: [PATCH 3/5] [DE] fix tab 'View' in view mode --- .../main/app/controller/Toolbar.js | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 0a69f25859..78c990959e 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -4027,20 +4027,20 @@ define([ } } } - config.isEdit && config.canFeatureContentControl && me.onChangeSdtGlobalSettings(); - - tab = {caption: me.toolbar.textTabView, action: 'view', extcls: config.isEdit ? 'canedit' : '', layoutname: 'toolbar-view', dataHintTitle: 'W'}; - var viewtab = application.getController('ViewTab'); - viewtab.setApi(me.api).setConfig({toolbar: me, mode: config}); - $panel = viewtab.createToolbarPanel(); - if ($panel) { - var visible = Common.UI.LayoutManager.isElementVisible('toolbar-view'); - me.toolbar.addTab(tab, $panel, 8); - me.toolbar.setVisible('view', visible); - !editmode && !compactview && visible && Common.Utils.InternalSettings.set('toolbar-active-tab', 'view'); // need to activate later - } - config.isEdit && Array.prototype.push.apply(me.toolbar.lockControls, viewtab.getView('ViewTab').getButtons()); } + config.isEdit && config.canFeatureContentControl && me.onChangeSdtGlobalSettings(); + + tab = {caption: me.toolbar.textTabView, action: 'view', extcls: config.isEdit ? 'canedit' : '', layoutname: 'toolbar-view', dataHintTitle: 'W'}; + const viewtab = application.getController('ViewTab'); + viewtab.setApi(me.api).setConfig({toolbar: me, mode: config}); + $panel = viewtab.createToolbarPanel(); + if ($panel) { + const visible = Common.UI.LayoutManager.isElementVisible('toolbar-view'); + me.toolbar.addTab(tab, $panel, 8); + me.toolbar.setVisible('view', visible); + !editmode && !compactview && visible && Common.Utils.InternalSettings.set('toolbar-active-tab', 'view'); // need to activate later + } + config.isEdit && Array.prototype.push.apply(me.toolbar.lockControls, viewtab.getView('ViewTab').getButtons()); }, onAppReady: function (config) { From 4cd59aaa52df72d9824ed3f734ab79ccda8d93f3 Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Sun, 1 Mar 2026 02:01:37 +0300 Subject: [PATCH 4/5] [forms] fix bug 80255 --- apps/documenteditor/main/app/view/DocumentHolderExt.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/documenteditor/main/app/view/DocumentHolderExt.js b/apps/documenteditor/main/app/view/DocumentHolderExt.js index 659e97dc92..76edaeb06a 100644 --- a/apps/documenteditor/main/app/view/DocumentHolderExt.js +++ b/apps/documenteditor/main/app/view/DocumentHolderExt.js @@ -954,7 +954,9 @@ define([], function () { content_locked = lock_type==Asc.c_oAscSdtLockType.SdtContentLocked || lock_type==Asc.c_oAscSdtLockType.ContentLocked, is_form = control_props && control_props.get_FormPr(); - me.menuImgStretchContentControl.setVisible(is_form); + me.menuImgStretchContentControl.setVisible(is_form && (!lock_type || lock_type == Asc.c_oAscSdtLockType.Unlocked)); + is_form && console.log('menuImgStretch visible'); + me.menuImgRemoveControl.setVisible(in_control); me.menuImgControlSettings.setVisible(in_control && me.mode.canEditContentControl && !is_form); menuImgControlSeparator.setVisible(in_control); @@ -1820,6 +1822,8 @@ define([], function () { is_form = control_props && control_props.get_FormPr(); me.menuTableRemoveForm.setVisible(is_form); me.menuTableStretchContentControl.setVisible(is_form); + is_form && console.log('menuTableStretch visible'); + menuTableControl.setVisible(!is_form); if (is_form) { me.menuTableRemoveForm.setDisabled(lock_type==Asc.c_oAscSdtLockType.SdtContentLocked || lock_type==Asc.c_oAscSdtLockType.SdtLocked); From 444bef78ce6f6e4c18174723f2e0d7f2c3c2bbeb Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Sun, 1 Mar 2026 13:53:36 +0300 Subject: [PATCH 5/5] Merge branch 'release/v9.4.0' of https://git.onlyoffice.com/ONLYOFFICE/web-apps into release/v9.4.0 --- .../main/app/controller/Toolbar.js | 107 +++++++++--------- 1 file changed, 53 insertions(+), 54 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 2a605d6129..37fd1552e7 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -3966,64 +3966,63 @@ define([ Array.prototype.push.apply(me.toolbar.lockControls, chartbuttons); } - if ( config.canProtect) { - tab = {action: 'protect', caption: me.toolbar.textTabProtect, layoutname: 'toolbar-protect', dataHintTitle: 'T'}; - $panel = application.getController('Common.Controllers.Protection').createToolbarPanel(); - if ($panel) { - const doctabController = application.getController('DocProtection'); - const doctabView = doctabController.getView('DocProtection'); - const doctabButtons = doctabView.getButtons(); - if(doctabButtons.length > 0 && (config.isSignatureSupport || config.isPasswordSupport)) { - $panel.append($('
')); - } - $panel.append(doctabController.createToolbarPanel()); - me.toolbar.addTab(tab, $panel, 7); - me.toolbar.setVisible('protect', Common.UI.LayoutManager.isElementVisible('toolbar-protect')); - Array.prototype.push.apply(me.toolbar.lockControls, doctabButtons); + if ( config.canProtect) { + tab = {action: 'protect', caption: me.toolbar.textTabProtect, layoutname: 'toolbar-protect', dataHintTitle: 'T'}; + $panel = application.getController('Common.Controllers.Protection').createToolbarPanel(); + if ($panel) { + const doctabController = application.getController('DocProtection'); + const doctabView = doctabController.getView('DocProtection'); + const doctabButtons = doctabView.getButtons(); + if(doctabButtons.length > 0 && (config.isSignatureSupport || config.isPasswordSupport)) { + $panel.append($('
')); } - } - - var links = application.getController('Links'); - links.setApi(me.api).setConfig({toolbar: me}); - Array.prototype.push.apply(me.toolbar.lockControls, links.getView('Links').getButtons()); - - me.getApplication().getController('Common.Controllers.ExternalLinks').setConfig({toolbar: me}).setApi(me.api); - me.toolbar.lockControls.push(application.getController('Viewport').getView('Common.Views.Header').getButton('mode')); - } else if (config.isRestrictedEdit && config.canFillForms && config.isPDFForm) { - me.toolbar.setMode(config); - - me.toolbar.btnSave.on('disabled', _.bind(me.onBtnChangeState, me, 'save:disabled')); - - // if (!(me.mode.canRequestEditRights && me.mode.isPDFForm && me.mode.canFillForms && me.mode.isRestrictedEdit)) - // me.toolbar.btnEditMode && me.toolbar.btnEditMode.cmpEl.parents('.group').hide().next('.separator').hide(); - - if (!config.compactHeader) { - // hide 'print' and 'save' buttons group and next separator - me.toolbar.btnPrint.$el.parents('.group').hide().next().hide(); - - // hide 'undo' and 'redo' buttons and retrieve parent container - var $box = me.toolbar.btnUndo.$el.hide().next().hide().parent(); - - // move 'paste' button to the container instead of 'undo' and 'redo' - me.toolbar.btnPaste.$el.detach().appendTo($box); - me.toolbar.btnPaste.$el.find('button').attr('data-hint-direction', 'bottom'); - me.toolbar.btnCopy.$el.removeClass('split'); - me.toolbar.processPanelVisible(null, true); + $panel.append(doctabController.createToolbarPanel()); + me.toolbar.addTab(tab, $panel, 7); + me.toolbar.setVisible('protect', Common.UI.LayoutManager.isElementVisible('toolbar-protect')); + Array.prototype.push.apply(me.toolbar.lockControls, doctabButtons); } } - if ( config.isEdit && config.canFeatureContentControl && config.canFeatureForms || config.isRestrictedEdit && config.canFillForms ) { - if (config.isFormCreator) { - tab = {caption: config.isRestrictedEdit && config.canFillForms && config.isPDFForm ? me.toolbar.textTabHome : me.textTabForms, action: 'forms', dataHintTitle: 'M'}; - var forms = application.getController('FormsTab'); - forms.setApi(me.api).setConfig({toolbar: me, config: config}); - $panel = forms.createToolbarPanel(); - if ($panel) { - me.toolbar.addTab(tab, $panel, 5); - me.toolbar.setVisible('forms', true); - Array.prototype.push.apply(me.toolbar.lockControls, forms.getView('FormsTab').getButtons()); - !compactview && (config.isFormCreator || config.isRestrictedEdit && config.canFillForms) && me.toolbar.setTab('forms'); - } + var links = application.getController('Links'); + links.setApi(me.api).setConfig({toolbar: me}); + Array.prototype.push.apply(me.toolbar.lockControls, links.getView('Links').getButtons()); + + me.getApplication().getController('Common.Controllers.ExternalLinks').setConfig({toolbar: me}).setApi(me.api); + me.toolbar.lockControls.push(application.getController('Viewport').getView('Common.Views.Header').getButton('mode')); + } else if (config.isRestrictedEdit && config.canFillForms && config.isPDFForm) { + me.toolbar.setMode(config); + + me.toolbar.btnSave.on('disabled', _.bind(me.onBtnChangeState, me, 'save:disabled')); + + // if (!(me.mode.canRequestEditRights && me.mode.isPDFForm && me.mode.canFillForms && me.mode.isRestrictedEdit)) + // me.toolbar.btnEditMode && me.toolbar.btnEditMode.cmpEl.parents('.group').hide().next('.separator').hide(); + + if (!config.compactHeader) { + // hide 'print' and 'save' buttons group and next separator + me.toolbar.btnPrint.$el.parents('.group').hide().next().hide(); + + // hide 'undo' and 'redo' buttons and retrieve parent container + var $box = me.toolbar.btnUndo.$el.hide().next().hide().parent(); + + // move 'paste' button to the container instead of 'undo' and 'redo' + me.toolbar.btnPaste.$el.detach().appendTo($box); + me.toolbar.btnPaste.$el.find('button').attr('data-hint-direction', 'bottom'); + me.toolbar.btnCopy.$el.removeClass('split'); + me.toolbar.processPanelVisible(null, true); + } + } + + if ( config.isEdit && config.canFeatureContentControl && config.canFeatureForms || config.isRestrictedEdit && config.canFillForms ) { + if (config.isFormCreator) { + tab = {caption: config.isRestrictedEdit && config.canFillForms && config.isPDFForm ? me.toolbar.textTabHome : me.textTabForms, action: 'forms', dataHintTitle: 'M'}; + var forms = application.getController('FormsTab'); + forms.setApi(me.api).setConfig({toolbar: me, config: config}); + $panel = forms.createToolbarPanel(); + if ($panel) { + me.toolbar.addTab(tab, $panel, 5); + me.toolbar.setVisible('forms', true); + Array.prototype.push.apply(me.toolbar.lockControls, forms.getView('FormsTab').getButtons()); + !compactview && (config.isFormCreator || config.isRestrictedEdit && config.canFillForms) && me.toolbar.setTab('forms'); } } }