From 99d33c2c5cf3e86e33c2abf8619cee471ecf63ac Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Wed, 19 May 2021 23:54:27 +0300
Subject: [PATCH 01/86] Bug 50447

---
 apps/documenteditor/main/app/view/Toolbar.js     | 9 +++++----
 apps/presentationeditor/main/app/view/Toolbar.js | 9 +++++----
 apps/spreadsheeteditor/main/app/view/Toolbar.js  | 9 +++++----
 3 files changed, 15 insertions(+), 12 deletions(-)

diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js
index 76b0d9fe5..3b3ebca59 100644
--- a/apps/documenteditor/main/app/view/Toolbar.js
+++ b/apps/documenteditor/main/app/view/Toolbar.js
@@ -82,7 +82,7 @@ define([
                  * UI Components
                  */
 
-                this.SchemeNames = [
+                this.SchemeNames = [ this.txtScheme22,
                     this.txtScheme1, this.txtScheme2, this.txtScheme3, this.txtScheme4, this.txtScheme5,
                     this.txtScheme6, this.txtScheme7, this.txtScheme8, this.txtScheme9, this.txtScheme10,
                     this.txtScheme11, this.txtScheme12, this.txtScheme13, this.txtScheme14, this.txtScheme15,
@@ -2130,7 +2130,7 @@ define([
                         schemecolors.push(clr);
                     }
 
-                    if (index == 21) {
+                    if (index == 22) {
                         this.mnuColorSchema.addItem({
                             caption: '--'
                         });
@@ -2140,7 +2140,7 @@ define([
                         template: itemTemplate,
                         cls: 'color-schemas-menu',
                         colors: schemecolors,
-                        caption: (index < 21) ? (me.SchemeNames[index] || name) : name,
+                        caption: (index < 22) ? (me.SchemeNames[index] || name) : name,
                         value: index,
                         checkable: true,
                         toggleGroup: 'menuSchema'
@@ -2471,7 +2471,8 @@ define([
             mniCapitalizeWords: 'Capitalize Each Word',
             mniToggleCase: 'tOGGLE cASE',
             textChangeLevel: 'Change List Level',
-            mniTextToTable: 'Convert Text to Table'
+            mniTextToTable: 'Convert Text to Table',
+            txtScheme22: 'New Office'
         }
     })(), DE.Views.Toolbar || {}));
 });
diff --git a/apps/presentationeditor/main/app/view/Toolbar.js b/apps/presentationeditor/main/app/view/Toolbar.js
index 2cfc5e353..8fc62a9cd 100644
--- a/apps/presentationeditor/main/app/view/Toolbar.js
+++ b/apps/presentationeditor/main/app/view/Toolbar.js
@@ -104,7 +104,7 @@ define([
                 me.synchTooltip = undefined;
                 me.needShowSynchTip = false;
 
-                me.SchemeNames = [
+                me.SchemeNames = [me.txtScheme22,
                     me.txtScheme1, me.txtScheme2, me.txtScheme3, me.txtScheme4, me.txtScheme5,
                     me.txtScheme6, me.txtScheme7, me.txtScheme8, me.txtScheme9, me.txtScheme10,
                     me.txtScheme11, me.txtScheme12, me.txtScheme13, me.txtScheme14, me.txtScheme15,
@@ -1444,7 +1444,7 @@ define([
                             schemecolors.push(clr);
                         }
 
-                        if (index == 21) {
+                        if (index == 22) {
                             mnuColorSchema.addItem({
                                 caption: '--'
                             });
@@ -1454,7 +1454,7 @@ define([
                             template: itemTemplate,
                             cls: 'color-schemas-menu',
                             colors: schemecolors,
-                            caption: (index < 21) ? (me.SchemeNames[index] || name) : name,
+                            caption: (index < 22) ? (me.SchemeNames[index] || name) : name,
                             value: index,
                             checkable: true,
                             toggleGroup: 'menuSchema'
@@ -1815,7 +1815,8 @@ define([
             mniCapitalizeWords: 'Capitalize Each Word',
             mniToggleCase: 'tOGGLE cASE',
             strMenuNoFill: 'No Fill',
-            tipHighlightColor: 'Highlight color'
+            tipHighlightColor: 'Highlight color',
+            txtScheme22: 'New Office'
         }
     }()), PE.Views.Toolbar || {}));
 });
\ No newline at end of file
diff --git a/apps/spreadsheeteditor/main/app/view/Toolbar.js b/apps/spreadsheeteditor/main/app/view/Toolbar.js
index 54e6b0f38..444f1e459 100644
--- a/apps/spreadsheeteditor/main/app/view/Toolbar.js
+++ b/apps/spreadsheeteditor/main/app/view/Toolbar.js
@@ -116,7 +116,7 @@ define([
             var me = this,
                 options = {};
 
-            me.SchemeNames = [
+            me.SchemeNames = [me.txtScheme22,
                 me.txtScheme1, me.txtScheme2, me.txtScheme3, me.txtScheme4, me.txtScheme5,
                 me.txtScheme6, me.txtScheme7, me.txtScheme8, me.txtScheme9, me.txtScheme10,
                 me.txtScheme11, me.txtScheme12, me.txtScheme13, me.txtScheme14, me.txtScheme15,
@@ -2263,7 +2263,7 @@ define([
                     schemecolors.push(clr);
                 }
 
-                if (index == 21) {
+                if (index == 22) {
                     this.mnuColorSchema.addItem({
                         caption : '--'
                     });
@@ -2273,7 +2273,7 @@ define([
                     template: itemTemplate,
                     cls     : 'color-schemas-menu',
                     colors  : schemecolors,
-                    caption: (index < 21) ? (me.SchemeNames[index] || name) : name,
+                    caption: (index < 22) ? (me.SchemeNames[index] || name) : name,
                     value: index,
                     checkable: true,
                     toggleGroup: 'menuSchema'
@@ -2694,6 +2694,7 @@ define([
         textAutoColor: 'Automatic',
         textItems: 'Items',
         tipInsertSpark: 'Insert sparkline',
-        capInsertSpark: 'Sparklines'
+        capInsertSpark: 'Sparklines',
+        txtScheme22: 'New Office'
     }, SSE.Views.Toolbar || {}));
 });
\ No newline at end of file

From a405a14afc4fcc187d47b941e3e76006f8202ae6 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Wed, 19 May 2021 23:59:47 +0300
Subject: [PATCH 02/86] Update translation

---
 apps/documenteditor/main/locale/en.json     | 1 +
 apps/presentationeditor/main/locale/en.json | 1 +
 apps/spreadsheeteditor/main/locale/en.json  | 1 +
 3 files changed, 3 insertions(+)

diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json
index 6476da0f4..acc8433d0 100644
--- a/apps/documenteditor/main/locale/en.json
+++ b/apps/documenteditor/main/locale/en.json
@@ -2719,6 +2719,7 @@
   "DE.Views.Toolbar.txtScheme2": "Grayscale",
   "DE.Views.Toolbar.txtScheme20": "Urban",
   "DE.Views.Toolbar.txtScheme21": "Verve",
+  "DE.Views.Toolbar.txtScheme22": "New Office",
   "DE.Views.Toolbar.txtScheme3": "Apex",
   "DE.Views.Toolbar.txtScheme4": "Aspect",
   "DE.Views.Toolbar.txtScheme5": "Civic",
diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json
index 4ebc14728..f96525ac9 100644
--- a/apps/presentationeditor/main/locale/en.json
+++ b/apps/presentationeditor/main/locale/en.json
@@ -1988,6 +1988,7 @@
   "PE.Views.Toolbar.txtScheme2": "Grayscale",
   "PE.Views.Toolbar.txtScheme20": "Urban",
   "PE.Views.Toolbar.txtScheme21": "Verve",
+  "PE.Views.Toolbar.txtScheme22": "New Office",
   "PE.Views.Toolbar.txtScheme3": "Apex",
   "PE.Views.Toolbar.txtScheme4": "Aspect",
   "PE.Views.Toolbar.txtScheme5": "Civic",
diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json
index 2f0c2043b..5453b6740 100644
--- a/apps/spreadsheeteditor/main/locale/en.json
+++ b/apps/spreadsheeteditor/main/locale/en.json
@@ -3304,6 +3304,7 @@
   "SSE.Views.Toolbar.txtScheme2": "Grayscale",
   "SSE.Views.Toolbar.txtScheme20": "Urban",
   "SSE.Views.Toolbar.txtScheme21": "Verve",
+  "SSE.Views.Toolbar.txtScheme22": "New Office",
   "SSE.Views.Toolbar.txtScheme3": "Apex",
   "SSE.Views.Toolbar.txtScheme4": "Aspect",
   "SSE.Views.Toolbar.txtScheme5": "Civic",

From 77d85118b4c3c60bc74b67192c6be12191cce55f Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Tue, 1 Jun 2021 02:01:44 +0300
Subject: [PATCH 03/86] [DE embedded] Show tooltip for disabled submit button

---
 apps/common/embed/resources/less/common.less  | 52 +++++++++++++++++++
 .../embed/js/ApplicationController.js         | 42 ++++++++++++---
 apps/documenteditor/embed/locale/en.json      |  2 +
 3 files changed, 89 insertions(+), 7 deletions(-)

diff --git a/apps/common/embed/resources/less/common.less b/apps/common/embed/resources/less/common.less
index 5eae33403..3c2dd271c 100644
--- a/apps/common/embed/resources/less/common.less
+++ b/apps/common/embed/resources/less/common.less
@@ -712,4 +712,56 @@
     -webkit-box-shadow: 0 4px 15px -2px rgba(0, 0, 0, 0.5);
     box-shadow: 0 4px 15px -2px rgba(0, 0, 0, 0.5);
     font-size: 11px;
+}
+
+.required-tooltip {
+    position: absolute;
+    z-index: 1000;
+
+    padding: 15px;
+    border-radius: 5px;
+    background-color: @btnColored;
+    color: #fff;
+    -webkit-box-shadow: 0 4px 15px -2px rgba(0, 0, 0, 0.5);
+    box-shadow: 0 4px 15px -2px rgba(0, 0, 0, 0.5);
+    font-size: 11px;
+
+    &.bottom-left {
+        border-top-right-radius: 0;
+        margin: 15px 0 0 0;
+
+        .tip-arrow {
+            position: absolute;
+            overflow: hidden;
+            right: 0;
+            top: -15px;
+            width: 15px;
+            height: 15px;
+            .box-shadow(8px 5px 8px -5px rgba(0, 0, 0, 0.2));
+
+            &:after {
+                content: '';
+                position: absolute;
+                top: 8px;
+                left: 8px;
+                background-color: @btnColored;
+                width: 15px;
+                height: 15px;
+
+                -moz-transform: rotate(45deg);
+                -ms-transform: rotate(45deg);
+                -webkit-transform: rotate(45deg);
+                -o-transform: rotate(45deg);
+                transform: rotate(45deg);
+                .box-shadow(0 0 8px -1px rgba(0, 0, 0, 0.2));
+            }
+        }
+    }
+    .close-div {
+        display: inline-block;
+        border: 1px solid #fff;
+        border-radius: 2px;
+        padding: 3px 12px;
+        margin-top: 10px;
+    }
 }
\ No newline at end of file
diff --git a/apps/documenteditor/embed/js/ApplicationController.js b/apps/documenteditor/embed/js/ApplicationController.js
index b51279b9e..a30bffbb4 100644
--- a/apps/documenteditor/embed/js/ApplicationController.js
+++ b/apps/documenteditor/embed/js/ApplicationController.js
@@ -43,7 +43,7 @@ DE.ApplicationController = new(function(){
         labelDocName,
         appOptions = {},
         btnSubmit,
-        _submitFail, $submitedTooltip;
+        _submitFail, $submitedTooltip, $requiredTooltip;
 
     // Initialize analytics
     // -------------------------
@@ -181,12 +181,14 @@ DE.ApplicationController = new(function(){
     function onLongActionEnd(type, id){
         if (id==Asc.c_oAscAsyncAction['Submit']) {
             btnSubmit.removeAttr('disabled');
-            if (!$submitedTooltip) {
-                $submitedTooltip = $('<div class="submit-tooltip" style="display:none;">' + me.textSubmited + '</div>');
-                $(document.body).append($submitedTooltip);
-                $submitedTooltip.on('click', function() {$submitedTooltip.hide();});
+            if (!_submitFail) {
+                if (!$submitedTooltip) {
+                    $submitedTooltip = $('<div class="submit-tooltip" style="display:none;">' + me.textSubmited + '</div>');
+                    $(document.body).append($submitedTooltip);
+                    $submitedTooltip.on('click', function() {$submitedTooltip.hide();});
+                }
+                $submitedTooltip.show();
             }
-            !_submitFail && $submitedTooltip.show();
         }
         hideMask();
     }
@@ -251,6 +253,11 @@ DE.ApplicationController = new(function(){
         common.utils.dialogPrint(url, api);
     }
 
+    function onFillRequiredFields() {
+        btnSubmit && btnSubmit.removeAttr('disabled');
+        $requiredTooltip && $requiredTooltip.hide();
+    }
+
     function hidePreloader() {
         $('#loading-mask').fadeOut('slow');
     }
@@ -326,6 +333,7 @@ DE.ApplicationController = new(function(){
         api.asc_registerCallback('asc_onDownloadUrl',           onDownloadUrl);
         api.asc_registerCallback('asc_onPrint',                 onPrint);
         api.asc_registerCallback('asc_onPrintUrl',              onPrintUrl);
+        api.asc_registerCallback('asc_onFillRequiredFields',    onFillRequiredFields);
 
         Common.Gateway.on('processmouse',       onProcessMouse);
         Common.Gateway.on('downloadas',         onDownloadAs);
@@ -406,6 +414,24 @@ DE.ApplicationController = new(function(){
             $pagenum.focus();
         });
 
+        // TODO: add asc_hasRequiredFields to sdk
+        /*
+        if (appOptions.canSubmitForms && api.asc_hasRequiredFields()) {
+            btnSubmit.attr({disabled: true});
+            if (!common.localStorage.getItem("de-embed-hide-submittip")) {
+                var offset = btnSubmit.offset();
+                $requiredTooltip = $('<div class="required-tooltip bottom-left" style="display:none;"><div class="tip-arrow bottom-left"></div><div>' + me.textRequired + '</div><div class="close-div">' + me.textGotIt + '</div></div>');
+                $(document.body).append($requiredTooltip);
+                $requiredTooltip.css({top : offset.top + btnSubmit.height() + 'px', left: offset.left + btnSubmit.outerWidth()/2 - $requiredTooltip.outerWidth() + 'px'});
+                $requiredTooltip.find('.close-div').on('click', function() {
+                    $requiredTooltip.hide();
+                    common.localStorage.setItem("de-embed-hide-submittip", 1);
+                });
+                $requiredTooltip.show();
+            }
+        }
+        */
+
         var documentMoveTimer;
         var ismoved = false;
         $(document).mousemove(function(event){
@@ -757,6 +783,8 @@ DE.ApplicationController = new(function(){
         errorSubmit: 'Submit failed.',
         errorEditingDownloadas: 'An error occurred during the work with the document.<br>Use the \'Download as...\' option to save the file backup copy to your computer hard drive.',
         textGuest: 'Guest',
-        textAnonymous: 'Anonymous'
+        textAnonymous: 'Anonymous',
+        textRequired: 'Fill all required fields to send form.',
+        textGotIt: 'Got it'
     }
 })();
\ No newline at end of file
diff --git a/apps/documenteditor/embed/locale/en.json b/apps/documenteditor/embed/locale/en.json
index 6c9cff05d..ba2a995f1 100644
--- a/apps/documenteditor/embed/locale/en.json
+++ b/apps/documenteditor/embed/locale/en.json
@@ -31,6 +31,8 @@
   "DE.ApplicationController.unknownErrorText": "Unknown error.",
   "DE.ApplicationController.unsupportedBrowserErrorText": "Your browser is not supported.",
   "DE.ApplicationController.waitText": "Please, wait...",
+  "DE.ApplicationController.textRequired": "Fill all required fields to send form.",
+  "DE.ApplicationController.textGotIt": "Got it",
   "DE.ApplicationView.txtDownload": "Download",
   "DE.ApplicationView.txtDownloadDocx": "Download as docx",
   "DE.ApplicationView.txtDownloadPdf": "Download as pdf",

From 948731ccff24677dcdc8d6d2e64477d33d3244ba Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Tue, 1 Jun 2021 15:41:59 +0300
Subject: [PATCH 04/86] [DE embed] Add tooltip for disabled submit button

---
 apps/common/embed/resources/less/common.less  | 14 ++++++++++++-
 apps/documenteditor/embed/index.html          |  2 +-
 apps/documenteditor/embed/index.html.deploy   |  2 +-
 apps/documenteditor/embed/index_loader.html   |  2 +-
 .../embed/index_loader.html.deploy            |  2 +-
 .../embed/js/ApplicationController.js         | 20 ++++++++++++++++++-
 6 files changed, 36 insertions(+), 6 deletions(-)

diff --git a/apps/common/embed/resources/less/common.less b/apps/common/embed/resources/less/common.less
index 3c2dd271c..54012b65b 100644
--- a/apps/common/embed/resources/less/common.less
+++ b/apps/common/embed/resources/less/common.less
@@ -683,9 +683,13 @@
         border: 1px solid rgba(0,0,0,0.15);
         color: #333;
         font-weight: bold;
-        line-height: 26px;
         font-size: 11px;
         box-shadow: 0 6px 12px rgba(0,0,0,0.175);
+
+        padding: 5px 12px;
+        white-space: pre-wrap;
+        text-align: left;
+        word-wrap: break-word;
     }
 
     .tooltip-arrow {
@@ -764,4 +768,12 @@
         padding: 3px 12px;
         margin-top: 10px;
     }
+}
+
+.tooltip {
+    .tooltip-inner {
+        .toolbar & {
+            font-weight: normal;
+        }
+    }
 }
\ No newline at end of file
diff --git a/apps/documenteditor/embed/index.html b/apps/documenteditor/embed/index.html
index fe9d9a3a9..bd9ab347c 100644
--- a/apps/documenteditor/embed/index.html
+++ b/apps/documenteditor/embed/index.html
@@ -198,7 +198,7 @@
               <span id="title-doc-name"></span>
           </div>
           <div class="group right">
-              <button id="id-btn-submit" class="control-btn has-caption margin-right-small colored"><span class="caption"></span></button>
+              <div id="id-submit-group" style="display: inline-block;"><button id="id-btn-submit" class="control-btn has-caption margin-right-small colored"><span class="caption"></span></button></div>
               <div id="id-pages" class="item margin-right-small"><input id="page-number" class="form-control input-xs masked" type="text" value="0"><span class="text" id="pages" tabindex="-1">of 0</span></div>
               <div id="box-tools" class="dropdown">
                   <button class="control-btn svg-icon more-vertical"></button>
diff --git a/apps/documenteditor/embed/index.html.deploy b/apps/documenteditor/embed/index.html.deploy
index 4cdbc7f05..b2bfd8c2b 100644
--- a/apps/documenteditor/embed/index.html.deploy
+++ b/apps/documenteditor/embed/index.html.deploy
@@ -190,7 +190,7 @@
               <span id="title-doc-name"></span>
           </div>
           <div class="group right">
-              <button id="id-btn-submit" class="control-btn has-caption margin-right-small colored"><span class="caption"></span></button>
+              <div id="id-submit-group" style="display: inline-block;"><button id="id-btn-submit" class="control-btn has-caption margin-right-small colored"><span class="caption"></span></button></div>
               <div id="id-pages" class="item margin-right-small"><input id="page-number" class="form-control input-xs masked" type="text" value="0"><span class="text" id="pages" tabindex="-1">of 0</span></div>
               <div id="box-tools" class="dropdown">
                   <button class="control-btn svg-icon more-vertical"></button>
diff --git a/apps/documenteditor/embed/index_loader.html b/apps/documenteditor/embed/index_loader.html
index 842ca9611..75cf5466f 100644
--- a/apps/documenteditor/embed/index_loader.html
+++ b/apps/documenteditor/embed/index_loader.html
@@ -299,7 +299,7 @@
               <span id="title-doc-name"></span>
           </div>
           <div class="group right">
-              <button id="id-btn-submit" class="control-btn has-caption margin-right-small colored"><span class="caption"></span></button>
+              <div id="id-submit-group" style="display: inline-block;"><button id="id-btn-submit" class="control-btn has-caption margin-right-small colored"><span class="caption"></span></button></div>
               <div id="id-pages" class="item margin-right-small"><input id="page-number" class="form-control input-xs masked" type="text" value="0"><span class="text" id="pages" tabindex="-1">of 0</span></div>
               <div id="box-tools" class="dropdown">
                   <button class="control-btn svg-icon more-vertical"></button>
diff --git a/apps/documenteditor/embed/index_loader.html.deploy b/apps/documenteditor/embed/index_loader.html.deploy
index d0bcf12f8..6222ab1b2 100644
--- a/apps/documenteditor/embed/index_loader.html.deploy
+++ b/apps/documenteditor/embed/index_loader.html.deploy
@@ -291,7 +291,7 @@
               <span id="title-doc-name"></span>
           </div>
           <div class="group right">
-              <button id="id-btn-submit" class="control-btn has-caption margin-right-small colored"><span class="caption"></span></button>
+              <div id="id-submit-group" style="display: inline-block;"><button id="id-btn-submit" class="control-btn has-caption margin-right-small colored"><span class="caption"></span></button></div>
               <div id="id-pages" class="item margin-right-small"><input id="page-number" class="form-control input-xs masked" type="text" value="0"><span class="text" id="pages" tabindex="-1">of 0</span></div>
               <div id="box-tools" class="dropdown">
                   <button class="control-btn svg-icon more-vertical"></button>
diff --git a/apps/documenteditor/embed/js/ApplicationController.js b/apps/documenteditor/embed/js/ApplicationController.js
index a30bffbb4..e2aa0592d 100644
--- a/apps/documenteditor/embed/js/ApplicationController.js
+++ b/apps/documenteditor/embed/js/ApplicationController.js
@@ -166,6 +166,7 @@ DE.ApplicationController = new(function(){
                     _submitFail = false;
                     $submitedTooltip && $submitedTooltip.hide();
                     btnSubmit.attr({disabled: true});
+                    btnSubmit.css("pointer-events", "none");
                 break;
             default:
                 text = me.waitText;
@@ -181,6 +182,7 @@ DE.ApplicationController = new(function(){
     function onLongActionEnd(type, id){
         if (id==Asc.c_oAscAsyncAction['Submit']) {
             btnSubmit.removeAttr('disabled');
+            btnSubmit.css("pointer-events", "auto");
             if (!_submitFail) {
                 if (!$submitedTooltip) {
                     $submitedTooltip = $('<div class="submit-tooltip" style="display:none;">' + me.textSubmited + '</div>');
@@ -254,7 +256,10 @@ DE.ApplicationController = new(function(){
     }
 
     function onFillRequiredFields() {
-        btnSubmit && btnSubmit.removeAttr('disabled');
+        if (btnSubmit) {
+            btnSubmit.removeAttr('disabled');
+            btnSubmit.css("pointer-events", "auto");
+        }
         $requiredTooltip && $requiredTooltip.hide();
     }
 
@@ -417,7 +422,9 @@ DE.ApplicationController = new(function(){
         // TODO: add asc_hasRequiredFields to sdk
         /*
         if (appOptions.canSubmitForms && api.asc_hasRequiredFields()) {
+            var sgroup = $('#id-submit-group');
             btnSubmit.attr({disabled: true});
+            btnSubmit.css("pointer-events", "none");
             if (!common.localStorage.getItem("de-embed-hide-submittip")) {
                 var offset = btnSubmit.offset();
                 $requiredTooltip = $('<div class="required-tooltip bottom-left" style="display:none;"><div class="tip-arrow bottom-left"></div><div>' + me.textRequired + '</div><div class="close-div">' + me.textGotIt + '</div></div>');
@@ -426,8 +433,19 @@ DE.ApplicationController = new(function(){
                 $requiredTooltip.find('.close-div').on('click', function() {
                     $requiredTooltip.hide();
                     common.localStorage.setItem("de-embed-hide-submittip", 1);
+                    sgroup.attr('data-toggle', 'tooltip');
+                    sgroup.tooltip({
+                        title       : me.textRequired,
+                        placement   : 'bottom'
+                    });
                 });
                 $requiredTooltip.show();
+            } else {
+                sgroup.attr('data-toggle', 'tooltip');
+                sgroup.tooltip({
+                    title       : me.textRequired,
+                    placement   : 'bottom'
+                });
             }
         }
         */

From ddae1f9da3871a034af8f2bb040faf8fa63ed1b3 Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Tue, 1 Jun 2021 18:38:08 +0300
Subject: [PATCH 05/86] [PE mobile] Bug 49391

---
 apps/presentationeditor/mobile/locale/en.json |  7 ++-
 .../mobile/src/controller/ContextMenu.jsx     | 50 +++++++++++++++++++
 2 files changed, 56 insertions(+), 1 deletion(-)

diff --git a/apps/presentationeditor/mobile/locale/en.json b/apps/presentationeditor/mobile/locale/en.json
index c83fb611a..5f469fd96 100644
--- a/apps/presentationeditor/mobile/locale/en.json
+++ b/apps/presentationeditor/mobile/locale/en.json
@@ -132,7 +132,10 @@
   "ContextMenu": {
     "menuViewComment": "View Comment",
     "menuAddComment": "Add Comment",
+    "menuMerge": "Merge",
+    "menuSplit": "Split",
     "menuDelete": "Delete",
+    "menuDeleteTable": "Delete Table",
     "menuEdit": "Edit",
     "menuAddLink": "Add Link",
     "menuOpenLink": "Open Link",
@@ -140,7 +143,9 @@
     "menuCancel": "Cancel",
     "textCopyCutPasteActions": "Copy, Cut and Paste Actions",
     "errorCopyCutPaste": "Copy, cut and paste actions using the context menu will be performed within the current file only.",
-    "textDoNotShowAgain": "Don't show again"
+    "textDoNotShowAgain": "Don't show again",
+    "textColumns": "Columns",
+    "textRows": "Rows"
   },
   "Toolbar": {
     "dlgLeaveTitleText": "You leave the application",
diff --git a/apps/presentationeditor/mobile/src/controller/ContextMenu.jsx b/apps/presentationeditor/mobile/src/controller/ContextMenu.jsx
index e72ce5d66..fde237e74 100644
--- a/apps/presentationeditor/mobile/src/controller/ContextMenu.jsx
+++ b/apps/presentationeditor/mobile/src/controller/ContextMenu.jsx
@@ -117,6 +117,56 @@ class ContextMenu extends ContextMenuController {
         }).open();
     }
 
+    showSplitModal() {
+        const { t } = this.props;
+        const _t = t("ContextMenu", { returnObjects: true });
+        let picker;
+        const dialog = f7.dialog.create({
+            title: _t.menuSplit,
+            text: '',
+            content: `<div class="content-block">
+                        <div class="row">
+                            <div class="col-50">${_t.textColumns}</div>
+                            <div class="col-50">${_t.textRows}</div>
+                        </div>
+                        <div id="picker-split-size"></div>
+                    </div>`,
+            buttons: [
+                {
+                    text: _t.menuCancel
+                },
+                {
+                    text: 'OK',
+                    bold: true,
+                    onClick: function () {
+                        const size = picker.value;
+                        Common.EditorApi.get().SplitCell(parseInt(size[0]), parseInt(size[1]));
+                    }
+                }
+            ]
+        }).open();
+        dialog.on('opened', () => {
+            picker = f7.picker.create({
+                containerEl: document.getElementById('picker-split-size'),
+                cols: [
+                    {
+                        textAlign: 'center',
+                        width: '100%',
+                        values: [1,2,3,4,5,6,7,8,9,10]
+                    },
+                    {
+                        textAlign: 'center',
+                        width: '100%',
+                        values: [1,2,3,4,5,6,7,8,9,10]
+                    }
+                ],
+                toolbar: false,
+                rotateEffect: true,
+                value: [3, 3]
+            });
+        });
+    }
+
     openLink(url) {
         const api = Common.EditorApi.get();
         if (api.asc_getUrlType(url) > 0) {

From be7c25e02f5d4f1a00571aa2f71cf59760d4add4 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Wed, 2 Jun 2021 15:44:20 +0300
Subject: [PATCH 06/86] Fix embedded mode for filling forms

---
 apps/api/documents/api.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apps/api/documents/api.js b/apps/api/documents/api.js
index 2db589f2d..52503867a 100644
--- a/apps/api/documents/api.js
+++ b/apps/api/documents/api.js
@@ -866,7 +866,7 @@
         path += app + "/";
         path += (config.type === "mobile" || isSafari_mobile)
             ? "mobile"
-            : (config.type === "embedded" || (app=='documenteditor') && (config.document.permissions.fillForms===true) && (config.document.permissions.edit === false) && (config.editorConfig.mode !== 'view'))
+            : (config.type === "embedded" || (app=='documenteditor') && config.document.permissions && (config.document.permissions.fillForms===true) && (config.document.permissions.edit === false) && (config.editorConfig.mode !== 'view'))
                 ? "embed"
                 : "main";
 

From ae35a1b94f570efa9a2757e0f77aa7986965392e Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Wed, 2 Jun 2021 15:46:22 +0300
Subject: [PATCH 07/86] Fix Bug 50696

---
 apps/common/Gateway.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apps/common/Gateway.js b/apps/common/Gateway.js
index 436f0032b..14c1704f7 100644
--- a/apps/common/Gateway.js
+++ b/apps/common/Gateway.js
@@ -151,7 +151,7 @@ if (window.Common === undefined) {
 
         var _onMessage = function(msg) {
             // TODO: check message origin
-            if (msg.origin !== window.parentOrigin && msg.origin !== window.location.origin) return;
+            if (msg.origin !== window.parentOrigin && msg.origin !== window.location.origin && !(msg.origin==="null" && (window.parentOrigin==="file://" || window.location.origin==="file://"))) return;
 
             var data = msg.data;
             if (Object.prototype.toString.apply(data) !== '[object String]' || !window.JSON) {

From c2d5da8395620c4538929a2dae6f0cc81dbd9d13 Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Thu, 3 Jun 2021 00:31:39 +0300
Subject: [PATCH 08/86] [common] Bug 48484

---
 apps/common/mobile/lib/controller/collaboration/Comments.jsx | 1 +
 1 file changed, 1 insertion(+)

diff --git a/apps/common/mobile/lib/controller/collaboration/Comments.jsx b/apps/common/mobile/lib/controller/collaboration/Comments.jsx
index e1ebcda4b..8e4951b1a 100644
--- a/apps/common/mobile/lib/controller/collaboration/Comments.jsx
+++ b/apps/common/mobile/lib/controller/collaboration/Comments.jsx
@@ -478,6 +478,7 @@ class ViewCommentsController extends Component {
     }
     deleteComment (comment) {
         const api = Common.EditorApi.get();
+        Device.phone ? f7.sheet.close('#view-comment-sheet') : f7.popover.close('#view-comment-popover');
         comment && api.asc_removeComment(comment.uid);
     }
     deleteReply (comment, reply) {

From 3b5a06424217f9783102b4f98f8bd310c8485d0e Mon Sep 17 00:00:00 2001
From: Maxim Kadushkin <maxim.kadushkin@onlyoffice.com>
Date: Thu, 3 Jun 2021 15:41:28 +0300
Subject: [PATCH 09/86] [deploy] fix build mobile apps

---
 vendor/framework7-react/build/webpack.config.js | 1 -
 vendor/framework7-react/package.json            | 4 ++--
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/vendor/framework7-react/build/webpack.config.js b/vendor/framework7-react/build/webpack.config.js
index e94bccaa5..e9a53c7dc 100644
--- a/vendor/framework7-react/build/webpack.config.js
+++ b/vendor/framework7-react/build/webpack.config.js
@@ -53,7 +53,6 @@ module.exports = {
   devtool: env === 'production' ? false : 'source-map',
   optimization: {
     minimizer: [new TerserPlugin({
-      sourceMap: true,
     })],
     moduleIds: 'named',
   },
diff --git a/vendor/framework7-react/package.json b/vendor/framework7-react/package.json
index 3dc653b35..2fa213be4 100644
--- a/vendor/framework7-react/package.json
+++ b/vendor/framework7-react/package.json
@@ -69,9 +69,9 @@
     "postcss-preset-env": "^6.7.0",
     "rimraf": "^3.0.2",
     "style-loader": "^1.3.0",
-    "terser-webpack-plugin": "^3.1.0",
+    "terser-webpack-plugin": "^5.1.3",
     "url-loader": "^4.1.1",
-    "webpack": "^5.26.3",
+    "webpack": "^5.38.1",
     "webpack-cli": "^4.5.0",
     "webpack-dev-server": "^3.11.2",
     "workbox-webpack-plugin": "^6.1.2"

From f5ca014da53ba85d0e48eab11ff1a2c6ad25739c Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Thu, 3 Jun 2021 16:25:52 +0300
Subject: [PATCH 10/86] [DE PE SSE mobile] Bug 49112

---
 .../mobile/resources/less/common-ios.less     | 22 ++++++++++++
 .../resources/less/common-material.less       | 35 +++++++++++++++++++
 apps/documenteditor/mobile/locale/en.json     |  1 +
 .../src/controller/settings/Download.jsx      | 14 ++++----
 apps/presentationeditor/mobile/locale/en.json |  3 +-
 .../mobile/src/controller/Main.jsx            | 17 +++++----
 apps/spreadsheeteditor/mobile/locale/en.json  |  1 +
 .../mobile/src/controller/Main.jsx            |  2 +-
 .../src/controller/settings/Download.jsx      |  7 ++--
 .../mobile/src/less/app-ios.less              | 20 -----------
 10 files changed, 81 insertions(+), 41 deletions(-)

diff --git a/apps/common/mobile/resources/less/common-ios.less b/apps/common/mobile/resources/less/common-ios.less
index 396a2051a..a4c90680a 100644
--- a/apps/common/mobile/resources/less/common-ios.less
+++ b/apps/common/mobile/resources/less/common-ios.less
@@ -541,4 +541,26 @@
         white-space: normal;
         text-overflow: ellipsis;
     }
+
+    input.modal-text-input {
+        box-sizing: border-box;
+        height: 26px;
+        background: #fff;
+        margin: 0;
+        margin-top: 15px;
+        padding: 0 5px;
+        border: 1px solid rgba(0,0,0,.3);
+        border-radius: 0;
+        width: 100%;
+        font-size: 14px;
+        font-family: inherit;
+        display: block;
+        box-shadow: 0 0 0 transparent;
+        -webkit-appearance: none;
+        -moz-appearance: none;
+        -ms-appearance: none;
+        appearance: none;
+    }
 }
+
+
diff --git a/apps/common/mobile/resources/less/common-material.less b/apps/common/mobile/resources/less/common-material.less
index c3cf6f0d3..daa240ba9 100644
--- a/apps/common/mobile/resources/less/common-material.less
+++ b/apps/common/mobile/resources/less/common-material.less
@@ -477,4 +477,39 @@
             margin-left: 0;
         }
     }
+
+    input.modal-text-input {
+        box-sizing: border-box;
+        height: 36px;
+        background: #fff;
+        margin: 0;
+        margin-top: 15px;
+        padding: 0;
+        border: none;
+        width: 100%;
+        font-size: 16px;
+        font-family: inherit;
+        display: block;
+        box-shadow: none;
+        -webkit-appearance: none;
+        -moz-appearance: none;
+        -ms-appearance: none;
+        appearance: none;
+        -webkit-transition-duration: .2s;
+        transition-duration: .2s;
+    }
+
+    .input-field {
+        .inputs-list {
+            margin: 15px 0 0;
+            ul {
+                &::before, &::after {
+                    display: none;
+                }
+            }
+            .item-input, .item-inner {
+                padding: 0;
+            }
+        }
+    }
 }
diff --git a/apps/documenteditor/mobile/locale/en.json b/apps/documenteditor/mobile/locale/en.json
index eb22ff811..464648cc9 100644
--- a/apps/documenteditor/mobile/locale/en.json
+++ b/apps/documenteditor/mobile/locale/en.json
@@ -331,6 +331,7 @@
     "closeButtonText": "Close File",
     "advDRMOptions": "Protected File",
     "txtProtected": "Once you enter the password and open the file, the current password to the file will be reset",
+    "textOpenFile": "Enter a password to open the file",
     "textNoTextFound": "Text not found",
     "textReplace": "Replace",
     "textReplaceAll": "Replace All",
diff --git a/apps/documenteditor/mobile/src/controller/settings/Download.jsx b/apps/documenteditor/mobile/src/controller/settings/Download.jsx
index 7f7db5e3f..858dbfa65 100644
--- a/apps/documenteditor/mobile/src/controller/settings/Download.jsx
+++ b/apps/documenteditor/mobile/src/controller/settings/Download.jsx
@@ -122,16 +122,16 @@ const onAdvancedOptions = (type, advOptions, mode, formatOptions, _t, isDocReady
         });
     } else if (type == Asc.c_oAscAdvancedOptionsID.DRM) {
         Common.Notifications.trigger('preloader:close');
-        Common.Notifications.trigger('preloader:endAction', Asc.c_oAscAsyncActionType['BlockInteraction'], -256);
+        // Common.Notifications.trigger('preloader:endAction', Asc.c_oAscAsyncActionType['BlockInteraction'], -256);
         const buttons = [{
             text: 'OK',
             bold: true,
             onClick: function () {
                 const password = document.getElementById('modal-password').value;
                 api.asc_setAdvancedOptions(type, new Asc.asc_CDRMAdvancedOptions(password));
-                if (!isDocReady) {
-                    Common.Notifications.trigger('preloader:beginAction', Asc.c_oAscAsyncActionType['BlockInteraction'], -256);
-                }
+                // if (!isDocReady) {
+                //     Common.Notifications.trigger('preloader:beginAction', Asc.c_oAscAsyncActionType['BlockInteraction'], -256);
+                // }
             }
         }];
         if (canRequestClose)
@@ -143,9 +143,9 @@ const onAdvancedOptions = (type, advOptions, mode, formatOptions, _t, isDocReady
             });
         f7.dialog.create({
             title: _t.advDRMOptions,
-            text: _t.txtProtected,
-            content:
-                '<div class="input-field"><input type="password" name="modal-password" placeholder="' + _t.advDRMPassword + '" id="modal-password"></div>',
+            text: _t.textOpenFile,
+            content: Device.ios ?
+            '<div class="input-field"><input type="password" class="modal-text-input" name="modal-password" placeholder="' + _t.advDRMPassword + '" id="modal-password"></div>' : '<div class="input-field"><div class="inputs-list list inline-labels"><ul><li><div class="item-content item-input"><div class="item-inner"><div class="item-input-wrap"><input type="password" name="modal-password" id="modal-password" placeholder=' + _t.advDRMPassword + '></div></div></div></li></ul></div></div>',
             buttons: buttons,
             cssClass: 'dlg-adv-options'
         }).open();
diff --git a/apps/presentationeditor/mobile/locale/en.json b/apps/presentationeditor/mobile/locale/en.json
index 5f469fd96..7bcd5c37c 100644
--- a/apps/presentationeditor/mobile/locale/en.json
+++ b/apps/presentationeditor/mobile/locale/en.json
@@ -27,7 +27,8 @@
       "closeButtonText": "Close File",
       "advDRMOptions": "Protected File",
       "advDRMPassword": "Password",
-
+      "txtProtected": "Once you enter the password and open the file, the current password to the file will be reset",
+      "textOpenFile": "Enter a password to open the file",
       "leavePageText": "You have unsaved changes in this document. Click 'Stay on this Page' to await the autosave of the document. Click 'Leave this Page' to discard all the unsaved changes.",
       "titleLicenseExp": "License expired",
       "warnLicenseExp": "Your license has expired. Please update your license and refresh the page.",
diff --git a/apps/presentationeditor/mobile/src/controller/Main.jsx b/apps/presentationeditor/mobile/src/controller/Main.jsx
index e34fed388..a6a850a4f 100644
--- a/apps/presentationeditor/mobile/src/controller/Main.jsx
+++ b/apps/presentationeditor/mobile/src/controller/Main.jsx
@@ -14,6 +14,7 @@ import LongActionsController from "./LongActions";
 import {LocalStorage} from "../../../../common/mobile/utils/LocalStorage";
 import About from '../../../../common/mobile/lib/view/About';
 import PluginsController from '../../../../common/mobile/lib/controller/Plugins.jsx';
+import { Device } from '../../../../common/mobile/utils/device';
 
 @inject(
     "storeFocusObjects",
@@ -585,7 +586,7 @@ class MainController extends Component {
 
         if (type == Asc.c_oAscAdvancedOptionsID.DRM) {
             Common.Notifications.trigger('preloader:close');
-            Common.Notifications.trigger('preloader:endAction', Asc.c_oAscAsyncActionType['BlockInteraction'], this.LoadingDocument);
+            // Common.Notifications.trigger('preloader:endAction', Asc.c_oAscAsyncActionType['BlockInteraction'], this.LoadingDocument);
 
             const buttons = [{
                 text: 'OK',
@@ -595,9 +596,9 @@ class MainController extends Component {
                     const password = document.getElementById('modal-password').value;
                     this.api.asc_setAdvancedOptions(type, new Asc.asc_CDRMAdvancedOptions(password));
 
-                    if (!this._isDocReady) {
-                        Common.Notifications.trigger('preloader:beginAction', Asc.c_oAscAsyncActionType['BlockInteraction'], this.LoadingDocument);
-                    }
+                    // if (!this._isDocReady) {
+                    //     Common.Notifications.trigger('preloader:beginAction', Asc.c_oAscAsyncActionType['BlockInteraction'], this.LoadingDocument);
+                    // }
                 }
             }];
             if (this.props.storeAppOptions.canRequestClose)
@@ -610,11 +611,9 @@ class MainController extends Component {
 
             f7.dialog.create({
                 title: _t.advDRMOptions,
-                text: (typeof advOptions === 'string' ? advOptions : _t.txtProtected),
-                content:
-                    `<div class="input-field">
-                        <input type="password" name="modal-password" placeholder="${ _t.advDRMPassword }" class="modal-text-input">
-                    </div>`,
+                text: _t.textOpenFile,
+                content: Device.ios ?
+                '<div class="input-field"><input type="password" class="modal-text-input" name="modal-password" placeholder="' + _t.advDRMPassword + '" id="modal-password"></div>' : '<div class="input-field"><div class="inputs-list list inline-labels"><ul><li><div class="item-content item-input"><div class="item-inner"><div class="item-input-wrap"><input type="password" name="modal-password" id="modal-password" placeholder=' + _t.advDRMPassword + '></div></div></div></li></ul></div></div>',
                 buttons: buttons,
                 cssClass: 'dlg-adv-options'
             }).open();
diff --git a/apps/spreadsheeteditor/mobile/locale/en.json b/apps/spreadsheeteditor/mobile/locale/en.json
index afedbcdc0..4784e7f7d 100644
--- a/apps/spreadsheeteditor/mobile/locale/en.json
+++ b/apps/spreadsheeteditor/mobile/locale/en.json
@@ -458,6 +458,7 @@
             "advDRMPassword": "Password",
             "closeButtonText": "Close File",
             "txtProtected": "Once you enter the password and open the file, the current password to the file will be reset",
+            "textOpenFile": "Enter a password to open the file",
             "textCancel": "Cancel",
             "textUnitOfMeasurement": "Unit Of Measurement",
             "textCentimeter": "Centimeter",
diff --git a/apps/spreadsheeteditor/mobile/src/controller/Main.jsx b/apps/spreadsheeteditor/mobile/src/controller/Main.jsx
index 466c4b7be..3d2d5ea0d 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/Main.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/Main.jsx
@@ -318,7 +318,7 @@ class MainController extends Component {
         
         this.api.asc_registerCallback('asc_onAdvancedOptions', (type, advOptions, mode, formatOptions) => {
             const {t} = this.props;
-            const _t = t("Settings", { returnObjects: true });
+            const _t = t("View.Settings", { returnObjects: true });
             onAdvancedOptions(type, advOptions, mode, formatOptions, _t, this.props.storeAppOptions.canRequestClose);
         });
 
diff --git a/apps/spreadsheeteditor/mobile/src/controller/settings/Download.jsx b/apps/spreadsheeteditor/mobile/src/controller/settings/Download.jsx
index 91d4b6be4..ac3829d56 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/settings/Download.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/settings/Download.jsx
@@ -121,6 +121,7 @@ const onAdvancedOptions = (type, advOptions, mode, formatOptions, _t, canRequest
         });
 
     } else if (type == Asc.c_oAscAdvancedOptionsID.DRM) {
+        Common.Notifications.trigger('preloader:close');
         //me.onLongActionEnd(Asc.c_oAscAsyncActionType.BlockInteraction, LoadingDocument);
         const buttons = [{
             text: 'OK',
@@ -144,9 +145,9 @@ const onAdvancedOptions = (type, advOptions, mode, formatOptions, _t, canRequest
 
         f7.dialog.create({
             title: _t.advDRMOptions,
-            text: _t.txtProtected,
-            content:
-                '<div class="input-field"><input type="password" name="modal-password" placeholder="' + _t.advDRMPassword + '" id="modal-password"></div>',
+            text: _t.textOpenFile,
+            content: Device.ios ?
+                '<div class="input-field"><input type="password" class="modal-text-input" name="modal-password" placeholder="' + _t.advDRMPassword + '" id="modal-password"></div>' : '<div class="input-field"><div class="inputs-list list inline-labels"><ul><li><div class="item-content item-input"><div class="item-inner"><div class="item-input-wrap"><input type="password" name="modal-password" id="modal-password" placeholder=' + _t.advDRMPassword + '></div></div></div></li></ul></div></div>',
             buttons: buttons
         }).open();
     }
diff --git a/apps/spreadsheeteditor/mobile/src/less/app-ios.less b/apps/spreadsheeteditor/mobile/src/less/app-ios.less
index 7dd7f4917..38ff8771c 100644
--- a/apps/spreadsheeteditor/mobile/src/less/app-ios.less
+++ b/apps/spreadsheeteditor/mobile/src/less/app-ios.less
@@ -1,25 +1,5 @@
 
 .device-ios {
-    input.modal-text-input {
-        box-sizing: border-box;
-        height: 26px;
-        background: #fff;
-        margin: 0;
-        margin-top: 15px;
-        padding: 0 5px;
-        border: 1px solid rgba(0,0,0,.3);
-        border-radius: 0;
-        width: 100%;
-        font-size: 14px;
-        font-family: inherit;
-        display: block;
-        box-shadow: 0 0 0 transparent;
-        -webkit-appearance: none;
-        -moz-appearance: none;
-        -ms-appearance: none;
-        appearance: none;
-    }
-
     // For filter options
     .radio-checkbox-item {
         label.item-content input[type=checkbox]:checked ~ .item-inner {

From c0c4766574ebe3cbe4c02f51f3cb15584391fa2e Mon Sep 17 00:00:00 2001
From: Maxim Kadushkin <maxim.kadushkin@onlyoffice.com>
Date: Fri, 4 Jun 2021 10:34:56 +0300
Subject: [PATCH 11/86] [SSE PE] fix bug 50724

---
 apps/presentationeditor/main/resources/less/rightmenu.less | 2 +-
 apps/spreadsheeteditor/main/resources/less/rightmenu.less  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/apps/presentationeditor/main/resources/less/rightmenu.less b/apps/presentationeditor/main/resources/less/rightmenu.less
index 3f24d4c27..80eb58d1b 100644
--- a/apps/presentationeditor/main/resources/less/rightmenu.less
+++ b/apps/presentationeditor/main/resources/less/rightmenu.less
@@ -15,7 +15,7 @@
 }
 
 .combo-pattern-item {
-    .background-ximage('@{common-image-path}/right-panels/patterns.png', '@{common-image-path}/right-panels/patterns@2x.png', 112px);
+    .background-ximage-v2('right-panels/patterns.png', 112px);
 }
 
 .combo-dataview-menu {
diff --git a/apps/spreadsheeteditor/main/resources/less/rightmenu.less b/apps/spreadsheeteditor/main/resources/less/rightmenu.less
index 8daedd91f..d8736eef1 100644
--- a/apps/spreadsheeteditor/main/resources/less/rightmenu.less
+++ b/apps/spreadsheeteditor/main/resources/less/rightmenu.less
@@ -9,7 +9,7 @@
 }
 
 .combo-pattern-item {
-    .background-ximage('@{common-image-path}/right-panels/patterns.png', '@{common-image-path}/right-panels/patterns@2x.png', 112px);
+    .background-ximage-v2('right-panels/patterns.png', 112px);
 }
 
 .combo-dataview-menu {

From d8ae65d05d4a784bf8db5b83006037ae74685208 Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Sat, 5 Jun 2021 13:05:28 +0300
Subject: [PATCH 12/86] [DE SSE mobile] Bug 47948

---
 .../settings/ApplicationSettings.jsx          | 26 +++++++++++-
 .../mobile/src/store/appOptions.js            |  5 +++
 .../mobile/src/store/applicationSettings.js   |  5 ++-
 .../settings/ApplicationSettings.jsx          | 42 +++++++++++++------
 .../mobile/src/store/appOptions.js            |  4 ++
 .../src/view/settings/ApplicationSettings.jsx |  6 ++-
 6 files changed, 72 insertions(+), 16 deletions(-)

diff --git a/apps/documenteditor/mobile/src/controller/settings/ApplicationSettings.jsx b/apps/documenteditor/mobile/src/controller/settings/ApplicationSettings.jsx
index 388ea1ab7..3a4ce7af5 100644
--- a/apps/documenteditor/mobile/src/controller/settings/ApplicationSettings.jsx
+++ b/apps/documenteditor/mobile/src/controller/settings/ApplicationSettings.jsx
@@ -1,11 +1,32 @@
 import React, { Component } from "react";
 import { ApplicationSettings } from "../../view/settings/ApplicationSettings";
 import { LocalStorage } from '../../../../../common/mobile/utils/LocalStorage';
+import {observer, inject} from "mobx-react";
 
 class ApplicationSettingsController extends Component {
     constructor(props) {
         super(props);
         this.switchDisplayComments = this.switchDisplayComments.bind(this);
+
+        const valueViewComments = LocalStorage.getBool("de-mobile-settings-livecomment");
+        const valueResolvedComments = LocalStorage.getBool("de-settings-resolvedcomment");
+        const valueUnitMeasurement = LocalStorage.getItem("de-mobile-settings-unit");
+        const valueSpellCheck = LocalStorage.getBool("de-mobile-spellcheck");
+        const valueNoCharacters = LocalStorage.getBool("de-mobile-no-characters");
+        const valueHiddenBorders = LocalStorage.getBool("de-mobile-hidden-borders");
+        const valueMacrosMode = LocalStorage.getItem("de-mobile-macros-mode");
+        
+        if(typeof valueViewComments !== 'undefined') {
+            this.props.storeApplicationSettings.changeDisplayComments(valueViewComments);
+            this.props.storeAppOptions.changeCanViewComments(valueViewComments);
+        }
+
+        typeof valueResolvedComments !== 'undefined' && this.props.storeApplicationSettings.changeDisplayResolved(valueResolvedComments);
+        typeof valueUnitMeasurement !== 'undefined' && this.props.storeApplicationSettings.changeUnitMeasurement(valueUnitMeasurement);
+        typeof valueSpellCheck !== 'undefined' && this.props.storeApplicationSettings.changeSpellCheck(valueSpellCheck);
+        typeof valueNoCharacters !== 'undefined' && this.props.storeApplicationSettings.changeNoCharacters(valueNoCharacters);
+        typeof valueHiddenBorders !== 'undefined' && this.props.storeApplicationSettings.changeShowTableEmptyLine(valueHiddenBorders);
+        typeof valueMacrosMode !== 'undefined' && this.props.storeApplicationSettings.changeMacrosSettings(valueMacrosMode);
     }
 
     setUnitMeasurement(value) {
@@ -34,6 +55,8 @@ class ApplicationSettingsController extends Component {
 
     switchDisplayComments(value) {
         const api = Common.EditorApi.get();
+        this.props.storeAppOptions.changeCanViewComments(value);
+
         if (!value) {
             api.asc_hideComments();
             this.switchDisplayResolved(value);
@@ -42,6 +65,7 @@ class ApplicationSettingsController extends Component {
             const resolved = LocalStorage.getBool("de-settings-resolvedcomment");
             api.asc_showComments(resolved);
         }
+
         LocalStorage.setBool("de-mobile-settings-livecomment", value);
     }
 
@@ -73,4 +97,4 @@ class ApplicationSettingsController extends Component {
 }
 
 
-export default ApplicationSettingsController;
\ No newline at end of file
+export default inject("storeAppOptions", "storeApplicationSettings")(observer(ApplicationSettingsController));
\ No newline at end of file
diff --git a/apps/documenteditor/mobile/src/store/appOptions.js b/apps/documenteditor/mobile/src/store/appOptions.js
index d22f062ce..98486a1df 100644
--- a/apps/documenteditor/mobile/src/store/appOptions.js
+++ b/apps/documenteditor/mobile/src/store/appOptions.js
@@ -27,7 +27,12 @@ export class storeAppOptions {
     }
 
     isEdit = false;
+
     canViewComments = false;
+    changeCanViewComments(value) {
+        this.canViewComments = value;
+    }
+
     canReview = false;
     canViewReview = false;
 
diff --git a/apps/documenteditor/mobile/src/store/applicationSettings.js b/apps/documenteditor/mobile/src/store/applicationSettings.js
index 9fea1a4f0..0cc34353f 100644
--- a/apps/documenteditor/mobile/src/store/applicationSettings.js
+++ b/apps/documenteditor/mobile/src/store/applicationSettings.js
@@ -1,4 +1,5 @@
 import {makeObservable, action, observable} from 'mobx';
+import { LocalStorage } from '../../../../common/mobile/utils/LocalStorage';
 
 export class storeApplicationSettings {
     constructor() {
@@ -24,8 +25,8 @@ export class storeApplicationSettings {
     isSpellChecking = true;
     isNonprintingCharacters = false;
     isHiddenTableBorders = false;
-    isComments = true;
-    isResolvedComments = true;
+    isComments = false;
+    isResolvedComments = false;
     macrosMode = 0;
 
     changeUnitMeasurement(value) {
diff --git a/apps/spreadsheeteditor/mobile/src/controller/settings/ApplicationSettings.jsx b/apps/spreadsheeteditor/mobile/src/controller/settings/ApplicationSettings.jsx
index 1704fee0c..2ab0a9080 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/settings/ApplicationSettings.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/settings/ApplicationSettings.jsx
@@ -1,15 +1,33 @@
 import React, { Component } from "react";
 import { ApplicationSettings } from "../../view/settings/ApplicationSettings";
 import {observer, inject} from "mobx-react";
+import { LocalStorage } from '../../../../../common/mobile/utils/LocalStorage';
 
 class ApplicationSettingsController extends Component {
     constructor(props) {
         super(props);
         this.onFormulaLangChange = this.onFormulaLangChange.bind(this);
+        this.onChangeDisplayComments = this.onChangeDisplayComments.bind(this);
         this.onRegSettings = this.onRegSettings.bind(this);
         this.initRegSettings = this.initRegSettings.bind(this);
         this.props.storeApplicationSettings.initRegData();
         this.initRegSettings();
+
+        const valueViewComments = LocalStorage.getBool("sse-mobile-settings-livecomment");
+        const valueResolvedComments = LocalStorage.getBool("sse-settings-resolvedcomment");
+        const valueUnitMeasurement = LocalStorage.getItem("sse-mobile-settings-unit");
+        const valueRefStyle = LocalStorage.getBool('sse-settings-r1c1');
+        const valueMacrosMode = LocalStorage.getItem("sse-mobile-macros-mode");
+        
+        if(typeof valueViewComments !== 'undefined') {
+            this.props.storeApplicationSettings.changeDisplayComments(valueViewComments);
+            this.props.storeAppOptions.changeCanViewComments(valueViewComments);
+        }
+
+        typeof valueResolvedComments !== 'undefined' && this.props.storeApplicationSettings.changeDisplayResolved(valueResolvedComments);
+        typeof valueUnitMeasurement !== 'undefined' && this.props.storeApplicationSettings.changeUnitMeasurement(valueUnitMeasurement);
+        typeof valueRefStyle !== 'undefined' && this.props.storeApplicationSettings.changeRefStyle(valueRefStyle);
+        typeof valueMacrosMode !== 'undefined' && this.props.storeApplicationSettings.changeMacrosSettings(valueMacrosMode);
     }
 
     initRegSettings() {
@@ -32,54 +50,54 @@ class ApplicationSettingsController extends Component {
 
     onChangeDisplayComments(displayComments) {
         const api = Common.EditorApi.get();
+        this.props.storeAppOptions.changeCanViewComments(displayComments);
 
         if (!displayComments) {
             api.asc_hideComments();
-            Common.localStorage.setBool("sse-settings-resolvedcomment", false);
+            LocalStorage.setBool("sse-settings-resolvedcomment", false);
         } else {
-            let resolved = Common.localStorage.getBool("sse-settings-resolvedcomment");
+            let resolved = LocalStorage.getBool("sse-settings-resolvedcomment");
             api.asc_showComments(resolved);
         }
 
-        Common.localStorage.setBool("sse-mobile-settings-livecomment", displayComments);
+        LocalStorage.setBool("sse-mobile-settings-livecomment", displayComments);
     }
 
     onChangeDisplayResolved(value) {
         const api = Common.EditorApi.get();
-        let displayComments = Common.localStorage.getBool("sse-mobile-settings-livecomment");
+        let displayComments = LocalStorage.getBool("sse-mobile-settings-livecomment");
 
         if (displayComments) {
             api.asc_showComments(value);
-            Common.localStorage.setBool("sse-settings-resolvedcomment", value);
+            LocalStorage.setBool("sse-settings-resolvedcomment", value);
         }
     }
 
     clickR1C1Style(checked) {
         const api = Common.EditorApi.get();
-        Common.localStorage.setBool('sse-settings-r1c1', checked);
+        LocalStorage.setBool('sse-settings-r1c1', checked);
         api.asc_setR1C1Mode(checked);
     }
 
     unitMeasurementChange(value) {
         value = value ? +value : Common.Utils.Metric.getDefaultMetric();
         Common.Utils.Metric.setCurrentMetric(value);
-        Common.localStorage.setItem("se-mobile-settings-unit", value);
+        LocalStorage.setItem("sse-mobile-settings-unit", value);
     }
 
     onChangeMacrosSettings(value) {
         Common.Utils.InternalSettings.set("sse-mobile-macros-mode", +value);
-        Common.localStorage.setItem("sse-mobile-macros-mode", +value);
+        LocalStorage.setItem("sse-mobile-macros-mode", +value);
     }
 
     onFormulaLangChange(value) {
-        Common.localStorage.setItem("sse-settings-func-lang", value);
+        LocalStorage.setItem("sse-settings-func-lang", value);
         this.initRegSettings();
-        // SSE.getController('AddFunction').onDocumentReady();
     }
 
     onRegSettings(regCode) {
         const api = Common.EditorApi.get();
-        Common.localStorage.setItem("sse-settings-regional", regCode);
+        LocalStorage.setItem("sse-settings-regional", regCode);
         this.initRegSettings();
         if (regCode!==null) api.asc_setLocale(+regCode);
     }
@@ -102,4 +120,4 @@ class ApplicationSettingsController extends Component {
 }
 
 
-export default inject("storeApplicationSettings")(observer(ApplicationSettingsController));
\ No newline at end of file
+export default inject("storeApplicationSettings", "storeAppOptions")(observer(ApplicationSettingsController));
\ No newline at end of file
diff --git a/apps/spreadsheeteditor/mobile/src/store/appOptions.js b/apps/spreadsheeteditor/mobile/src/store/appOptions.js
index 33d830d27..6f2043af7 100644
--- a/apps/spreadsheeteditor/mobile/src/store/appOptions.js
+++ b/apps/spreadsheeteditor/mobile/src/store/appOptions.js
@@ -19,7 +19,11 @@ export class storeAppOptions {
 
     isEdit = false;
     config = {};
+    
     canViewComments = false;
+    changeCanViewComments(value) {
+        this.canViewComments = value;
+    }
 
     lostEditingRights = false;
     changeEditingRights (value) {
diff --git a/apps/spreadsheeteditor/mobile/src/view/settings/ApplicationSettings.jsx b/apps/spreadsheeteditor/mobile/src/view/settings/ApplicationSettings.jsx
index 4755b03b0..f3f4ea323 100644
--- a/apps/spreadsheeteditor/mobile/src/view/settings/ApplicationSettings.jsx
+++ b/apps/spreadsheeteditor/mobile/src/view/settings/ApplicationSettings.jsx
@@ -26,6 +26,10 @@ const PageApplicationSettings = props => {
         props.unitMeasurementChange(value);
     };
 
+    console.log(isComments);
+    console.log(props.storeAppOptions.canViewComments);
+
+
     // set mode
     // const appOptions = props.storeAppOptions;
     // const _isEdit = appOptions.isEdit;
@@ -185,7 +189,7 @@ const PageMacrosSettings = props => {
     );
 };
 
-const ApplicationSettings = inject("storeApplicationSettings")(observer(PageApplicationSettings));
+const ApplicationSettings = inject("storeApplicationSettings", "storeAppOptions")(observer(PageApplicationSettings));
 const MacrosSettings = inject("storeApplicationSettings")(observer(PageMacrosSettings));
 const RegionalSettings = inject("storeApplicationSettings")(observer(PageRegionalSettings));
 const FormulaLanguage = inject("storeApplicationSettings")(observer(PageFormulaLanguage));

From 9f50f96c271518b96bb766dcb34b47e762dd4276 Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Sat, 5 Jun 2021 13:07:59 +0300
Subject: [PATCH 13/86] Removed console.log

---
 .../mobile/src/view/settings/ApplicationSettings.jsx          | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/apps/spreadsheeteditor/mobile/src/view/settings/ApplicationSettings.jsx b/apps/spreadsheeteditor/mobile/src/view/settings/ApplicationSettings.jsx
index f3f4ea323..9039e0cda 100644
--- a/apps/spreadsheeteditor/mobile/src/view/settings/ApplicationSettings.jsx
+++ b/apps/spreadsheeteditor/mobile/src/view/settings/ApplicationSettings.jsx
@@ -26,10 +26,6 @@ const PageApplicationSettings = props => {
         props.unitMeasurementChange(value);
     };
 
-    console.log(isComments);
-    console.log(props.storeAppOptions.canViewComments);
-
-
     // set mode
     // const appOptions = props.storeAppOptions;
     // const _isEdit = appOptions.isEdit;

From f9aefa5170a25f21699114e22fcab9fc481dbbe9 Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Mon, 7 Jun 2021 13:13:14 +0300
Subject: [PATCH 14/86] [PE mobile] Correct application settings

---
 .../src/controller/settings/ApplicationSettings.jsx   | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/apps/presentationeditor/mobile/src/controller/settings/ApplicationSettings.jsx b/apps/presentationeditor/mobile/src/controller/settings/ApplicationSettings.jsx
index bc72b63bb..44d520fa1 100644
--- a/apps/presentationeditor/mobile/src/controller/settings/ApplicationSettings.jsx
+++ b/apps/presentationeditor/mobile/src/controller/settings/ApplicationSettings.jsx
@@ -1,10 +1,19 @@
 import React, { Component } from "react";
 import { ApplicationSettings } from "../../view/settings/ApplicationSettings";
 import { LocalStorage } from '../../../../../common/mobile/utils/LocalStorage';
+import {observer, inject} from "mobx-react";
 
 class ApplicationSettingsController extends Component {
     constructor(props) {
         super(props);
+
+        const valueUnitMeasurement = LocalStorage.getItem("pe-mobile-settings-unit");
+        const valueSpellCheck = LocalStorage.getBool("pe-mobile-spellcheck");
+        const valueMacrosMode = LocalStorage.getItem("pe-mobile-macros-mode");
+
+        typeof valueUnitMeasurement !== 'undefined' && this.props.storeApplicationSettings.changeUnitMeasurement(valueUnitMeasurement);
+        typeof valueSpellCheck !== 'undefined' && this.props.storeApplicationSettings.changeSpellCheck(valueSpellCheck);
+        typeof valueMacrosMode !== 'undefined' && this.props.storeApplicationSettings.changeMacrosSettings(valueMacrosMode);
     }
 
     setUnitMeasurement(value) {
@@ -37,4 +46,4 @@ class ApplicationSettingsController extends Component {
 }
 
 
-export default ApplicationSettingsController;
\ No newline at end of file
+export default inject("storeApplicationSettings")(observer(ApplicationSettingsController));
\ No newline at end of file

From 04569201b945d920055a33bb7f2cacf0ca9d1c94 Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Mon, 7 Jun 2021 15:33:31 +0300
Subject: [PATCH 15/86] [SSE mobile] Fix bug 50037

---
 apps/spreadsheeteditor/mobile/locale/en.json           | 3 ++-
 apps/spreadsheeteditor/mobile/src/controller/Error.jsx | 4 ++++
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/apps/spreadsheeteditor/mobile/locale/en.json b/apps/spreadsheeteditor/mobile/locale/en.json
index 4784e7f7d..8c9a6f6b0 100644
--- a/apps/spreadsheeteditor/mobile/locale/en.json
+++ b/apps/spreadsheeteditor/mobile/locale/en.json
@@ -164,7 +164,8 @@
         "errorFrmlMaxTextLength": "Text values in formulas are limited to 255 characters.<br>Use the CONCATENATE function or concatenation operator (&)",
         "errorFrmlMaxLength": "You cannot add this formula as its length exceeded the allowed number of characters.<br>Please edit it and try again.",
         "errorFrmlMaxReference": "You cannot enter this formula because it has too many values,<br>cell references, and/or names.",
-        "errorDataValidate":"The value you entered is not valid.<br>A user has restricted values that can be entered into this cell."
+        "errorDataValidate":"The value you entered is not valid.<br>A user has restricted values that can be entered into this cell.",
+        "errorLockedCellPivot": "You cannot change data inside a pivot table."
     },
     "ContextMenu": {
         "menuViewComment": "View Comment",
diff --git a/apps/spreadsheeteditor/mobile/src/controller/Error.jsx b/apps/spreadsheeteditor/mobile/src/controller/Error.jsx
index 340da6739..702300374 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/Error.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/Error.jsx
@@ -166,6 +166,10 @@ const ErrorController = inject('storeAppOptions')(({storeAppOptions, LoadingDocu
             case Asc.c_oAscError.ID.PasteMaxRangeError:
                 config.msg = _t.errorPasteMaxRange;
                 break;
+            
+            case Asc.c_oAscError.ID.LockedCellPivot:
+                config.msg = _t.errorLockedCellPivot;
+                break;
 
             case Asc.c_oAscError.ID.LockedAllError:
                 config.msg = _t.errorLockedAll;

From 47a4436d06578e1f5c2c96154fc08f1fd0f2e76b Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Mon, 7 Jun 2021 19:54:19 +0300
Subject: [PATCH 16/86] [DE PE SSE mobile] Correct application settings and
 comments

---
 .../lib/controller/collaboration/Comments.jsx |  5 ++++-
 .../settings/ApplicationSettings.jsx          | 21 +------------------
 .../settings/ApplicationSettings.jsx          |  9 +-------
 .../settings/ApplicationSettings.jsx          | 17 +--------------
 4 files changed, 7 insertions(+), 45 deletions(-)

diff --git a/apps/common/mobile/lib/controller/collaboration/Comments.jsx b/apps/common/mobile/lib/controller/collaboration/Comments.jsx
index 8e4951b1a..f0d773903 100644
--- a/apps/common/mobile/lib/controller/collaboration/Comments.jsx
+++ b/apps/common/mobile/lib/controller/collaboration/Comments.jsx
@@ -51,6 +51,7 @@ class CommentsController extends Component {
         this.usersStore = this.props.users;
         this.appOptions = this.props.storeAppOptions;
         this.storeComments = this.props.storeComments;
+        this.storeApplicationSettings = this.props.storeApplicationSettings;
 
         Common.Notifications.on('engineCreated', api => {
             api.asc_registerCallback('asc_onAddComment', this.addComment.bind(this));
@@ -74,6 +75,8 @@ class CommentsController extends Component {
                 /** coauthoring begin **/
                 const isLiveCommenting = LocalStorage.getBool(`${window.editorType}-mobile-settings-livecomment`, true);
                 const resolved = LocalStorage.getBool(`${window.editorType}-settings-resolvedcomment`, true);
+                this.storeApplicationSettings.changeDisplayComments(isLiveCommenting);
+                this.storeApplicationSettings.changeDisplayResolved(resolved);
                 isLiveCommenting ? api.asc_showComments(resolved) : api.asc_hideComments();
                 /** coauthoring end **/
             }
@@ -583,7 +586,7 @@ class ViewCommentsController extends Component {
     }
 }
 
-const _CommentsController = inject('storeAppOptions', 'storeComments', 'users')(observer(CommentsController));
+const _CommentsController = inject('storeAppOptions', 'storeComments', 'users', "storeApplicationSettings")(observer(CommentsController));
 const _AddCommentController = inject('storeAppOptions', 'storeComments', 'users')(observer(AddCommentController));
 const _EditCommentController = inject('storeComments', 'users')(observer(EditCommentController));
 const _ViewCommentsController = inject('storeComments', 'users')(observer(withTranslation()(ViewCommentsController)));
diff --git a/apps/documenteditor/mobile/src/controller/settings/ApplicationSettings.jsx b/apps/documenteditor/mobile/src/controller/settings/ApplicationSettings.jsx
index 3a4ce7af5..b9cfc7d39 100644
--- a/apps/documenteditor/mobile/src/controller/settings/ApplicationSettings.jsx
+++ b/apps/documenteditor/mobile/src/controller/settings/ApplicationSettings.jsx
@@ -7,26 +7,7 @@ class ApplicationSettingsController extends Component {
     constructor(props) {
         super(props);
         this.switchDisplayComments = this.switchDisplayComments.bind(this);
-
-        const valueViewComments = LocalStorage.getBool("de-mobile-settings-livecomment");
-        const valueResolvedComments = LocalStorage.getBool("de-settings-resolvedcomment");
-        const valueUnitMeasurement = LocalStorage.getItem("de-mobile-settings-unit");
-        const valueSpellCheck = LocalStorage.getBool("de-mobile-spellcheck");
-        const valueNoCharacters = LocalStorage.getBool("de-mobile-no-characters");
-        const valueHiddenBorders = LocalStorage.getBool("de-mobile-hidden-borders");
-        const valueMacrosMode = LocalStorage.getItem("de-mobile-macros-mode");
-        
-        if(typeof valueViewComments !== 'undefined') {
-            this.props.storeApplicationSettings.changeDisplayComments(valueViewComments);
-            this.props.storeAppOptions.changeCanViewComments(valueViewComments);
-        }
-
-        typeof valueResolvedComments !== 'undefined' && this.props.storeApplicationSettings.changeDisplayResolved(valueResolvedComments);
-        typeof valueUnitMeasurement !== 'undefined' && this.props.storeApplicationSettings.changeUnitMeasurement(valueUnitMeasurement);
-        typeof valueSpellCheck !== 'undefined' && this.props.storeApplicationSettings.changeSpellCheck(valueSpellCheck);
-        typeof valueNoCharacters !== 'undefined' && this.props.storeApplicationSettings.changeNoCharacters(valueNoCharacters);
-        typeof valueHiddenBorders !== 'undefined' && this.props.storeApplicationSettings.changeShowTableEmptyLine(valueHiddenBorders);
-        typeof valueMacrosMode !== 'undefined' && this.props.storeApplicationSettings.changeMacrosSettings(valueMacrosMode);
+        this.props.storeApplicationSettings.changeUnitMeasurement(Common.Utils.Metric.getCurrentMetric());
     }
 
     setUnitMeasurement(value) {
diff --git a/apps/presentationeditor/mobile/src/controller/settings/ApplicationSettings.jsx b/apps/presentationeditor/mobile/src/controller/settings/ApplicationSettings.jsx
index 44d520fa1..fce2d7d05 100644
--- a/apps/presentationeditor/mobile/src/controller/settings/ApplicationSettings.jsx
+++ b/apps/presentationeditor/mobile/src/controller/settings/ApplicationSettings.jsx
@@ -6,14 +6,7 @@ import {observer, inject} from "mobx-react";
 class ApplicationSettingsController extends Component {
     constructor(props) {
         super(props);
-
-        const valueUnitMeasurement = LocalStorage.getItem("pe-mobile-settings-unit");
-        const valueSpellCheck = LocalStorage.getBool("pe-mobile-spellcheck");
-        const valueMacrosMode = LocalStorage.getItem("pe-mobile-macros-mode");
-
-        typeof valueUnitMeasurement !== 'undefined' && this.props.storeApplicationSettings.changeUnitMeasurement(valueUnitMeasurement);
-        typeof valueSpellCheck !== 'undefined' && this.props.storeApplicationSettings.changeSpellCheck(valueSpellCheck);
-        typeof valueMacrosMode !== 'undefined' && this.props.storeApplicationSettings.changeMacrosSettings(valueMacrosMode);
+        this.props.storeApplicationSettings.changeUnitMeasurement(Common.Utils.Metric.getCurrentMetric());
     }
 
     setUnitMeasurement(value) {
diff --git a/apps/spreadsheeteditor/mobile/src/controller/settings/ApplicationSettings.jsx b/apps/spreadsheeteditor/mobile/src/controller/settings/ApplicationSettings.jsx
index 2ab0a9080..f2abdf87a 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/settings/ApplicationSettings.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/settings/ApplicationSettings.jsx
@@ -12,22 +12,7 @@ class ApplicationSettingsController extends Component {
         this.initRegSettings = this.initRegSettings.bind(this);
         this.props.storeApplicationSettings.initRegData();
         this.initRegSettings();
-
-        const valueViewComments = LocalStorage.getBool("sse-mobile-settings-livecomment");
-        const valueResolvedComments = LocalStorage.getBool("sse-settings-resolvedcomment");
-        const valueUnitMeasurement = LocalStorage.getItem("sse-mobile-settings-unit");
-        const valueRefStyle = LocalStorage.getBool('sse-settings-r1c1');
-        const valueMacrosMode = LocalStorage.getItem("sse-mobile-macros-mode");
-        
-        if(typeof valueViewComments !== 'undefined') {
-            this.props.storeApplicationSettings.changeDisplayComments(valueViewComments);
-            this.props.storeAppOptions.changeCanViewComments(valueViewComments);
-        }
-
-        typeof valueResolvedComments !== 'undefined' && this.props.storeApplicationSettings.changeDisplayResolved(valueResolvedComments);
-        typeof valueUnitMeasurement !== 'undefined' && this.props.storeApplicationSettings.changeUnitMeasurement(valueUnitMeasurement);
-        typeof valueRefStyle !== 'undefined' && this.props.storeApplicationSettings.changeRefStyle(valueRefStyle);
-        typeof valueMacrosMode !== 'undefined' && this.props.storeApplicationSettings.changeMacrosSettings(valueMacrosMode);
+        this.props.storeApplicationSettings.changeUnitMeasurement(Common.Utils.Metric.getCurrentMetric());
     }
 
     initRegSettings() {

From 55de02cb15a24c70b9b0f9aa02f02f9d26de0871 Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Tue, 8 Jun 2021 16:59:11 +0300
Subject: [PATCH 17/86] [common] Fig Bug 48484

---
 .../lib/controller/collaboration/Comments.jsx |   3 +-
 apps/common/mobile/lib/store/comments.js      |  10 ++
 .../lib/view/collaboration/Comments.jsx       | 141 +++++++++---------
 3 files changed, 85 insertions(+), 69 deletions(-)

diff --git a/apps/common/mobile/lib/controller/collaboration/Comments.jsx b/apps/common/mobile/lib/controller/collaboration/Comments.jsx
index f0d773903..4d476b7aa 100644
--- a/apps/common/mobile/lib/controller/collaboration/Comments.jsx
+++ b/apps/common/mobile/lib/controller/collaboration/Comments.jsx
@@ -481,7 +481,8 @@ class ViewCommentsController extends Component {
     }
     deleteComment (comment) {
         const api = Common.EditorApi.get();
-        Device.phone ? f7.sheet.close('#view-comment-sheet') : f7.popover.close('#view-comment-popover');
+       
+        this.props.storeComments.removeShowComment(comment.uid);
         comment && api.asc_removeComment(comment.uid);
     }
     deleteReply (comment, reply) {
diff --git a/apps/common/mobile/lib/store/comments.js b/apps/common/mobile/lib/store/comments.js
index 86248d9d2..49cf46fe4 100644
--- a/apps/common/mobile/lib/store/comments.js
+++ b/apps/common/mobile/lib/store/comments.js
@@ -39,6 +39,16 @@ export class storeComments {
         });
     }
 
+    removeShowComment(id) {
+        const index = this.showComments.findIndex((comment) => {
+            return comment.uid === id;
+        });
+
+        if (index !== -1) {
+            this.showComments.splice(index, 1);
+        }
+    }
+
     addComment (comment) {
         comment.groupName ? this.groupCollectionComments.push(comment) : this.collectionComments.push(comment);
     }
diff --git a/apps/common/mobile/lib/view/collaboration/Comments.jsx b/apps/common/mobile/lib/view/collaboration/Comments.jsx
index 169b310a8..5c73e2e59 100644
--- a/apps/common/mobile/lib/view/collaboration/Comments.jsx
+++ b/apps/common/mobile/lib/view/collaboration/Comments.jsx
@@ -740,7 +740,6 @@ const CommentList = inject("storeComments", "storeAppOptions")(observer(({storeC
     const isAndroid = Device.android;
 
     const viewMode = !storeAppOptions.canComments;
-
     const comments = storeComments.showComments;
 
     const [currentIndex, setCurrentIndex] = useState(0);
@@ -767,6 +766,11 @@ const CommentList = inject("storeComments", "storeAppOptions")(observer(({storeC
         }
     };
 
+    if(!comment) {
+        Device.phone ? f7.sheet.close('#view-comment-sheet') : f7.popover.close('#view-comment-popover');
+        return null;
+    }
+
     return (
         <Fragment>
             <Toolbar position='bottom'>
@@ -779,77 +783,78 @@ const CommentList = inject("storeComments", "storeAppOptions")(observer(({storeC
                 </div>
             </Toolbar>
             <div className='pages'>
-            <Page className='page-current-comment'>
-            <List className='comment-list'>
-            <ListItem>
-                <div slot='header' className='comment-header'>
-                    <div className='left'>
-                        {isAndroid && <div className='initials' style={{backgroundColor: `${comment.userColor ? comment.userColor : '#cfcfcf'}`}}>{comment.userInitials}</div>}
-                        <div>
-                            <div className='user-name'>{comment.userName}</div>
-                            <div className='comment-date'>{comment.date}</div>
-                        </div>
-                    </div>
-                    {!viewMode &&
-                    <div className='right'>
-                        <div className='comment-resolve' onClick={() => {onResolveComment(comment);}}><Icon icon={comment.resolved ? 'icon-resolve-comment check' : 'icon-resolve-comment'} /></div>
-                        <div className='comment-menu'
-                             onClick={() => {openActionComment(true);}}
-                        ><Icon icon='icon-menu-comment'/></div>
-                    </div>
-                    }
-                </div>
-                <div slot='footer'>
-                    {comment.quote && <div className='comment-quote'>{sliceQuote(comment.quote)}</div>}
-                    <div className='comment-text'><pre>{pickLink(comment.comment)}</pre></div>
-                    {comment.replies.length > 0 &&
-                    <ul className='reply-list'>
-                        {comment.replies.map((reply, indexReply) => {
-                            return (
-                                <li key={`reply-${indexReply}`}
-                                    className='reply-item'
-                                >
-                                    <div className='item-content'>
-                                        <div className='item-inner'>
-                                            <div className='item-title'>
-                                                <div slot='header' className='reply-header'>
-                                                    <div className='left'>
-                                                        {isAndroid && <div className='initials' style={{backgroundColor: `${reply.userColor ? reply.userColor : '#cfcfcf'}`}}>{reply.userInitials}</div>}
-                                                        <div>
-                                                            <div className='user-name'>{reply.userName}</div>
-                                                            <div className='reply-date'>{reply.date}</div>
-                                                        </div>
-                                                    </div>
-                                                    {!viewMode &&
-                                                    <div className='right'>
-                                                        <div className='reply-menu'
-                                                             onClick={() => {setReply(reply); openActionReply(true);}}
-                                                        >
-                                                            <Icon icon='icon-menu-comment'/>
-                                                        </div>
-                                                    </div>
-                                                    }
-                                                </div>
-                                                <div slot='footer'>
-                                                    <div className='reply-text'><pre>{pickLink(reply.reply)}</pre></div>
-                                                </div>
-                                            </div>
-                                        </div>
+                <Page className='page-current-comment'>
+                    <List className='comment-list'>
+                        <ListItem>
+                            <div slot='header' className='comment-header'>
+                                <div className='left'>
+                                    {isAndroid && <div className='initials' style={{backgroundColor: `${comment.userColor ? comment.userColor : '#cfcfcf'}`}}>{comment.userInitials}</div>}
+                                    <div>
+                                        <div className='user-name'>{comment.userName}</div>
+                                        <div className='comment-date'>{comment.date}</div>
                                     </div>
-                                </li>
-                            )
-                        })}
-                    </ul>
-                    }
-                </div>
-            </ListItem>
-            </List>
-            <CommentActions comment={comment} onCommentMenuClick={onCommentMenuClick} opened={commentActionsOpened} openActionComment={openActionComment}/>
-            <ReplyActions comment={comment} reply={reply} onCommentMenuClick={onCommentMenuClick} opened={replyActionsOpened} openActionReply={openActionReply}/>
-            </Page>
+                                </div>
+                                {!viewMode &&
+                                <div className='right'>
+                                    <div className='comment-resolve' onClick={() => {onResolveComment(comment);}}><Icon icon={comment.resolved ? 'icon-resolve-comment check' : 'icon-resolve-comment'} /></div>
+                                    <div className='comment-menu'
+                                        onClick={() => {openActionComment(true);}}
+                                    ><Icon icon='icon-menu-comment'/></div>
+                                </div>
+                                }
+                            </div>
+                            <div slot='footer'>
+                                {comment.quote && <div className='comment-quote'>{sliceQuote(comment.quote)}</div>}
+                                <div className='comment-text'><pre>{pickLink(comment.comment)}</pre></div>
+                                {comment.replies.length > 0 &&
+                                <ul className='reply-list'>
+                                    {comment.replies.map((reply, indexReply) => {
+                                        return (
+                                            <li key={`reply-${indexReply}`}
+                                                className='reply-item'
+                                            >
+                                                <div className='item-content'>
+                                                    <div className='item-inner'>
+                                                        <div className='item-title'>
+                                                            <div slot='header' className='reply-header'>
+                                                                <div className='left'>
+                                                                    {isAndroid && <div className='initials' style={{backgroundColor: `${reply.userColor ? reply.userColor : '#cfcfcf'}`}}>{reply.userInitials}</div>}
+                                                                    <div>
+                                                                        <div className='user-name'>{reply.userName}</div>
+                                                                        <div className='reply-date'>{reply.date}</div>
+                                                                    </div>
+                                                                </div>
+                                                                {!viewMode &&
+                                                                <div className='right'>
+                                                                    <div className='reply-menu'
+                                                                        onClick={() => {setReply(reply); openActionReply(true);}}
+                                                                    >
+                                                                        <Icon icon='icon-menu-comment'/>
+                                                                    </div>
+                                                                </div>
+                                                                }
+                                                            </div>
+                                                            <div slot='footer'>
+                                                                <div className='reply-text'><pre>{pickLink(reply.reply)}</pre></div>
+                                                            </div>
+                                                        </div>
+                                                    </div>
+                                                </div>
+                                            </li>
+                                        )
+                                    })}
+                                </ul>
+                                }
+                            </div>
+                        </ListItem>
+                    </List>
+                    <CommentActions comment={comment} onCommentMenuClick={onCommentMenuClick} opened={commentActionsOpened} openActionComment={openActionComment}/>
+                    <ReplyActions comment={comment} reply={reply} onCommentMenuClick={onCommentMenuClick} opened={replyActionsOpened} openActionReply={openActionReply}/>
+                </Page>
             </div>
         </Fragment>
     )
+
 }));
 
 const ViewCommentSheet = ({closeCurComments, onCommentMenuClick, onResolveComment}) => {

From 7657c036cd195b8a4856b4133f7ced731165d17d Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Tue, 8 Jun 2021 18:21:59 +0300
Subject: [PATCH 18/86] [common] Correct styles for icons

---
 apps/common/mobile/resources/less/material/icons.less | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/apps/common/mobile/resources/less/material/icons.less b/apps/common/mobile/resources/less/material/icons.less
index d13a8b631..815b921c9 100644
--- a/apps/common/mobile/resources/less/material/icons.less
+++ b/apps/common/mobile/resources/less/material/icons.less
@@ -11,7 +11,7 @@
         &.icon-prev {
             width: 20px;
             height: 20px;
-            .encoded-svg-background('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 22 22" fill="@{white}"><g><polygon points="5.1,10.9 13.9,2 16,4.1 9.2,11.1 16,17.9 13.9,20 5.1,11.2 5,11.1 "/></g></svg>');
+            .encoded-svg-background('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 22 22" fill="@{themeColor}"><g><polygon points="5.1,10.9 13.9,2 16,4.1 9.2,11.1 16,17.9 13.9,20 5.1,11.2 5,11.1 "/></g></svg>');
             &:after {
               display: none;
             }
@@ -19,7 +19,7 @@
         &.icon-next {
             width: 20px;
             height: 20px;
-            .encoded-svg-background('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 22 22" fill="@{white}"><g><polygon points="16.9,10.9 8.1,2 6,4.1 12.8,11.1 6,17.9 8.1,20 16.9,11.2 17,11.1 "/></g></svg>');
+            .encoded-svg-background('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 22 22" fill="@{themeColor}"><g><polygon points="16.9,10.9 8.1,2 6,4.1 12.8,11.1 6,17.9 8.1,20 16.9,11.2 17,11.1 "/></g></svg>');
             &:after {
                 display: none;
             }

From 77773d2c4099ecb8768129e90197fe325825fa2b Mon Sep 17 00:00:00 2001
From: JuliaSvinareva <Julia.Svinaryova@onlyoffice.com>
Date: Tue, 8 Jun 2021 18:22:28 +0300
Subject: [PATCH 19/86] [DE PE SSE] Fix bug 50766

---
 apps/documenteditor/mobile/src/controller/Toolbar.jsx     | 4 ++--
 apps/presentationeditor/mobile/src/controller/Toolbar.jsx | 4 ++--
 apps/spreadsheeteditor/mobile/src/controller/Toolbar.jsx  | 4 ++--
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/apps/documenteditor/mobile/src/controller/Toolbar.jsx b/apps/documenteditor/mobile/src/controller/Toolbar.jsx
index 30d47b86b..eddef0afa 100644
--- a/apps/documenteditor/mobile/src/controller/Toolbar.jsx
+++ b/apps/documenteditor/mobile/src/controller/Toolbar.jsx
@@ -76,7 +76,7 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeReview')(prop
                     {
                         text: _t.leaveButtonText,
                         onClick: function() {
-                            goBack();
+                            goBack(true);
                         }
                     },
                     {
@@ -86,7 +86,7 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeReview')(prop
                 ]
             }).open();
         } else {
-            goBack();
+            goBack(true);
         }
     };
     const goBack = (current) => {
diff --git a/apps/presentationeditor/mobile/src/controller/Toolbar.jsx b/apps/presentationeditor/mobile/src/controller/Toolbar.jsx
index d92f94f4a..2ba059cfa 100644
--- a/apps/presentationeditor/mobile/src/controller/Toolbar.jsx
+++ b/apps/presentationeditor/mobile/src/controller/Toolbar.jsx
@@ -75,7 +75,7 @@ const ToolbarController = inject('storeAppOptions', 'users')(props => {
                     {
                         text: _t.leaveButtonText,
                         onClick: function() {
-                            goBack();
+                            goBack(true);
                         }
                     },
                     {
@@ -85,7 +85,7 @@ const ToolbarController = inject('storeAppOptions', 'users')(props => {
                 ]
             }).open();
         } else {
-            goBack();
+            goBack(true);
         }
     };
     const goBack = (current) => {
diff --git a/apps/spreadsheeteditor/mobile/src/controller/Toolbar.jsx b/apps/spreadsheeteditor/mobile/src/controller/Toolbar.jsx
index 16dd1b657..b55d691d7 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/Toolbar.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/Toolbar.jsx
@@ -76,7 +76,7 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeSpreadsheetIn
                     {
                         text: _t.leaveButtonText,
                         onClick: function() {
-                            goBack();
+                            goBack(true);
                         }
                     },
                     {
@@ -86,7 +86,7 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeSpreadsheetIn
                 ]
             }).open();
         } else {
-            goBack();
+            goBack(true);
         }
     };
     const goBack = (current) => {

From 464fd70b5ba786f909cd824f5a9381c92a714422 Mon Sep 17 00:00:00 2001
From: JuliaSvinareva <Julia.Svinaryova@onlyoffice.com>
Date: Tue, 8 Jun 2021 18:39:39 +0300
Subject: [PATCH 20/86] [DE PE SSE mobile] Fix bug 50779

---
 apps/documenteditor/mobile/src/controller/Main.jsx     | 4 ++++
 apps/presentationeditor/mobile/src/controller/Main.jsx | 4 ++++
 apps/spreadsheeteditor/mobile/src/controller/Main.jsx  | 4 ++++
 3 files changed, 12 insertions(+)

diff --git a/apps/documenteditor/mobile/src/controller/Main.jsx b/apps/documenteditor/mobile/src/controller/Main.jsx
index 161971b67..22162a3b0 100644
--- a/apps/documenteditor/mobile/src/controller/Main.jsx
+++ b/apps/documenteditor/mobile/src/controller/Main.jsx
@@ -510,6 +510,10 @@ class MainController extends Component {
     }
 
     bindEvents() {
+        $$(window).on('resize', () => {
+            this.api.Resize();
+        });
+
         this.api.asc_registerCallback('asc_onDocumentUpdateVersion', this.onUpdateVersion.bind(this));
         this.api.asc_registerCallback('asc_onServerVersion', this.onServerVersion.bind(this));
         this.api.asc_registerCallback('asc_onDocumentName', this.onDocumentName.bind(this));
diff --git a/apps/presentationeditor/mobile/src/controller/Main.jsx b/apps/presentationeditor/mobile/src/controller/Main.jsx
index a6a850a4f..cd75ed0cf 100644
--- a/apps/presentationeditor/mobile/src/controller/Main.jsx
+++ b/apps/presentationeditor/mobile/src/controller/Main.jsx
@@ -293,6 +293,10 @@ class MainController extends Component {
     }
 
     bindEvents () {
+        $$(window).on('resize', () => {
+            this.api.Resize();
+        });
+
         this.api.asc_registerCallback('asc_onDocumentContentReady', this.onDocumentContentReady.bind(this));
         this.api.asc_registerCallback('asc_onDocumentUpdateVersion', this.onUpdateVersion.bind(this));
         this.api.asc_registerCallback('asc_onServerVersion', this.onServerVersion.bind(this));
diff --git a/apps/spreadsheeteditor/mobile/src/controller/Main.jsx b/apps/spreadsheeteditor/mobile/src/controller/Main.jsx
index 3d2d5ea0d..b7c2d51fd 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/Main.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/Main.jsx
@@ -292,6 +292,10 @@ class MainController extends Component {
     }
 
     bindEvents() {
+        $$(window).on('resize', () => {
+            this.api.asc_Resize();
+        });
+
         this.api.asc_registerCallback('asc_onDocumentUpdateVersion',      this.onUpdateVersion.bind(this));
         this.api.asc_registerCallback('asc_onServerVersion',              this.onServerVersion.bind(this));
         this.api.asc_registerCallback('asc_onPrintUrl',                   this.onPrintUrl.bind(this));

From 4b5f86f75de29315fed8e139841a66c3177268b9 Mon Sep 17 00:00:00 2001
From: JuliaSvinareva <Julia.Svinaryova@onlyoffice.com>
Date: Tue, 8 Jun 2021 19:12:38 +0300
Subject: [PATCH 21/86] [SSE mobile] Fix bug 50765

---
 apps/spreadsheeteditor/mobile/src/controller/Statusbar.jsx | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/apps/spreadsheeteditor/mobile/src/controller/Statusbar.jsx b/apps/spreadsheeteditor/mobile/src/controller/Statusbar.jsx
index 778eaeb84..6ca23f1da 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/Statusbar.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/Statusbar.jsx
@@ -56,9 +56,10 @@ const Statusbar = inject('sheets', 'storeAppOptions', 'users')(props => {
     }, []);
 
     const onApiActiveSheetChanged = (index) => {
-        // console.log(index);
-        sheets.setActiveWorksheet(index);
-        Common.Notifications.trigger('sheet:active', index);
+        if (index < sheets.sheets.length) {
+            sheets.setActiveWorksheet(index);
+            Common.Notifications.trigger('sheet:active', index);
+        }
     }
 
     const onApiHideTabContextMenu = () => {

From e821bb196e0c13469bee8fc3984551ce714be85b Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Wed, 9 Jun 2021 13:59:04 +0300
Subject: [PATCH 22/86] [SSE mobile] Fix Bug 50791

---
 apps/spreadsheeteditor/mobile/src/view/edit/EditLink.jsx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/apps/spreadsheeteditor/mobile/src/view/edit/EditLink.jsx b/apps/spreadsheeteditor/mobile/src/view/edit/EditLink.jsx
index 5b8772a34..b5923fa3c 100644
--- a/apps/spreadsheeteditor/mobile/src/view/edit/EditLink.jsx
+++ b/apps/spreadsheeteditor/mobile/src/view/edit/EditLink.jsx
@@ -108,7 +108,7 @@ const EditLink = props => {
 
     const valueRange = linkInfo.asc_getRange();
     const [range, setRange] = useState(valueRange || '');
-    
+
     return (
         <Fragment>
             <List inlineLabels className='inputs-list'>
@@ -159,7 +159,7 @@ const EditLink = props => {
             </List>
             <List className="buttons-list">
                 <ListButton title={_t.textEditLink}
-                            className={`button-fill button-raised${(typeLink === 'ext' && link.length < 1 || typeLink === 'int' || range.length < 1 || !curSheet.length) && ' disabled'}`}
+                            className={`button-fill button-raised ${(typeLink === 1 && !link.length) || (typeLink === 2 && (!range.length || !curSheet.length)) ? 'disabled' : ''}`}
                             onClick={() => {props.onEditLink(typeLink === 1 ?
                                 {type: 1, url: link, text: stateDisplayText, tooltip: screenTip} :
                                 {type: 2, url: range, sheet: curSheet, text: stateDisplayText, tooltip: screenTip})}}

From e2e68d25b5d5be704a4f9bcaa4b76f3f5170f8fb Mon Sep 17 00:00:00 2001
From: JuliaSvinareva <Julia.Svinaryova@onlyoffice.com>
Date: Wed, 9 Jun 2021 15:18:04 +0300
Subject: [PATCH 23/86] [mobile] Fix bug 50797

---
 apps/common/mobile/resources/less/ios/icons.less          | 5 +++++
 apps/common/mobile/resources/less/material/icons.less     | 5 +++++
 apps/documenteditor/mobile/src/controller/Main.jsx        | 2 +-
 apps/documenteditor/mobile/src/controller/Toolbar.jsx     | 8 ++++++++
 apps/documenteditor/mobile/src/store/appOptions.js        | 4 ++--
 apps/documenteditor/mobile/src/view/Toolbar.jsx           | 3 +++
 apps/presentationeditor/mobile/src/controller/Main.jsx    | 2 +-
 apps/presentationeditor/mobile/src/controller/Toolbar.jsx | 8 ++++++++
 apps/presentationeditor/mobile/src/less/icons-ios.less    | 6 ------
 .../mobile/src/less/icons-material.less                   | 6 ------
 apps/presentationeditor/mobile/src/store/appOptions.js    | 4 ++--
 apps/presentationeditor/mobile/src/view/Toolbar.jsx       | 3 +++
 apps/spreadsheeteditor/mobile/src/controller/Main.jsx     | 2 +-
 apps/spreadsheeteditor/mobile/src/controller/Toolbar.jsx  | 8 ++++++++
 apps/spreadsheeteditor/mobile/src/less/icons-ios.less     | 5 -----
 .../spreadsheeteditor/mobile/src/less/icons-material.less | 5 -----
 apps/spreadsheeteditor/mobile/src/store/appOptions.js     | 5 ++---
 apps/spreadsheeteditor/mobile/src/view/Toolbar.jsx        | 3 +++
 18 files changed, 52 insertions(+), 32 deletions(-)

diff --git a/apps/common/mobile/resources/less/ios/icons.less b/apps/common/mobile/resources/less/ios/icons.less
index 6022b7bf3..4339dc06a 100644
--- a/apps/common/mobile/resources/less/ios/icons.less
+++ b/apps/common/mobile/resources/less/ios/icons.less
@@ -24,5 +24,10 @@
                 display: none;
             }
         }
+        &.icon-edit {
+            width: 22px;
+            height: 22px;
+            .encoded-svg-background('<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 22 22" fill="@{themeColor}"><g><path d="M0,20h22v1H0V20z"/><polygon points="19.3,5.3 6.1,18.4 4.6,16.9 17.8,3.8 17.1,3.1 3.5,16.7 3,20 6.3,19.5 19.9,5.9 	"/><path d="M20.5,5.3L22,3.8c0,0-0.2-1.2-0.9-1.9C20.4,1.1,19.2,1,19.2,1l-1.5,1.5L20.5,5.3z"/></g></svg>');
+        }
     }
 }
diff --git a/apps/common/mobile/resources/less/material/icons.less b/apps/common/mobile/resources/less/material/icons.less
index d13a8b631..e5fcb7190 100644
--- a/apps/common/mobile/resources/less/material/icons.less
+++ b/apps/common/mobile/resources/less/material/icons.less
@@ -32,6 +32,11 @@
                 height: 24px;
                 .encoded-svg-background('<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M14.9912 6C14.9912 8.18203 14.4464 9.76912 13.7789 10.7492C13.101 11.7447 12.4042 12 11.9912 12C11.5782 12 10.8814 11.7447 10.2035 10.7492C9.53601 9.76912 8.99121 8.18203 8.99121 6C8.99121 4.23017 10.4571 3 11.9912 3C13.5254 3 14.9912 4.23017 14.9912 6ZM13.4917 13.6397C13.0059 13.8771 12.4989 14 11.9912 14C11.4861 14 10.9817 13.8784 10.4983 13.6434C8.53188 14.3681 6.94518 15.0737 5.78927 15.7768C4.10512 16.8011 4 17.4079 4 17.5C4 17.7664 4.1014 18.3077 5.27104 18.8939C6.50029 19.5099 8.64545 19.9999 12 20C15.3546 20 17.4997 19.5099 18.7289 18.8939C19.8986 18.3078 20 17.7664 20 17.5C20 17.4079 19.8949 16.8011 18.2107 15.7768C17.0529 15.0726 15.4627 14.3657 13.4917 13.6397ZM15.2272 12.1594C16.2765 10.7825 16.9912 8.67814 16.9912 6C16.9912 3 14.5 1 11.9912 1C9.48242 1 6.99121 3 6.99121 6C6.99121 8.68159 7.70777 10.7879 8.75931 12.1647C4.60309 13.7964 2 15.4951 2 17.5C2 19.9852 5 21.9999 12 22C19 22 22 19.9852 22 17.5C22 15.4929 19.3913 13.7927 15.2272 12.1594Z" fill="@{navBarIconColor}"/></svg>');
             }
+            &.icon-edit {
+                width: 22px;
+                height: 22px;
+                .encoded-svg-background('<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 22 22" fill="@{navBarIconColor}"><g><path d="M0,20h22v1H0V20z"/><polygon points="17.1,3.1 3.5,16.7 3,20 6.3,19.5 19.9,5.9 	"/><path d="M20.5,5.3L22,3.8c0,0-0.2-1.2-0.9-1.9C20.4,1.1,19.2,1,19.2,1l-1.5,1.5L20.5,5.3z"/></g></svg>');
+            }
         }
     }
 }
diff --git a/apps/documenteditor/mobile/src/controller/Main.jsx b/apps/documenteditor/mobile/src/controller/Main.jsx
index 22162a3b0..b30a0f26b 100644
--- a/apps/documenteditor/mobile/src/controller/Main.jsx
+++ b/apps/documenteditor/mobile/src/controller/Main.jsx
@@ -184,7 +184,7 @@ class MainController extends Component {
 
                 const storeAppOptions = this.props.storeAppOptions;
 
-                storeAppOptions.setPermissionOptions(this.document, licType, params, this.permissions);
+                storeAppOptions.setPermissionOptions(this.document, licType, params, this.permissions, EditorUIController.isSupportEditFeature());
 
                 this.applyMode(storeAppOptions);
 
diff --git a/apps/documenteditor/mobile/src/controller/Toolbar.jsx b/apps/documenteditor/mobile/src/controller/Toolbar.jsx
index eddef0afa..a0028b81c 100644
--- a/apps/documenteditor/mobile/src/controller/Toolbar.jsx
+++ b/apps/documenteditor/mobile/src/controller/Toolbar.jsx
@@ -15,6 +15,8 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeReview')(prop
     const displayCollaboration = props.users.hasEditUsers || appOptions.canViewComments || appOptions.canReview || appOptions.canViewReview;
     const readerMode = appOptions.readerMode;
 
+    const showEditDocument = !appOptions.isEdit && appOptions.canEdit && appOptions.canRequestEditRights;
+
     useEffect(() => {
         const onDocumentReady = () => {
             const api = Common.EditorApi.get();
@@ -175,6 +177,10 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeReview')(prop
         setDisabledControls(false);
     };
 
+    const onEditDocument = () => {
+        Common.Gateway.requestEditRights();
+    };
+
     return (
         <ToolbarView openOptions={props.openOptions}
                      isEdit={appOptions.isEdit}
@@ -192,6 +198,8 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeReview')(prop
                      disabledSettings={disabledSettings}
                      displayCollaboration={displayCollaboration}
                      readerMode={readerMode}
+                     showEditDocument={showEditDocument}
+                     onEditDocument={onEditDocument}
         />
     )
 });
diff --git a/apps/documenteditor/mobile/src/store/appOptions.js b/apps/documenteditor/mobile/src/store/appOptions.js
index d22f062ce..5f7e43e4e 100644
--- a/apps/documenteditor/mobile/src/store/appOptions.js
+++ b/apps/documenteditor/mobile/src/store/appOptions.js
@@ -80,7 +80,7 @@ export class storeAppOptions {
         this.canBack = this.canBackToFolder === true;
         this.canPlugins = false;
     }
-    setPermissionOptions (document, licType, params, permissions) {
+    setPermissionOptions (document, licType, params, permissions, isSupportEditFeature) {
         this.review = (permissions.review === undefined) ? (permissions.edit !== false) : permissions.review;
         this.canAnalytics = params.asc_getIsAnalyticsEnable();
         this.canLicense = (licType === Asc.c_oLicenseResult.Success || licType === Asc.c_oLicenseResult.SuccessLimit);
@@ -92,7 +92,7 @@ export class storeAppOptions {
         this.canEdit = (permissions.edit !== false || permissions.review === true) && // can edit or review
             (this.config.canRequestEditRights || this.config.mode !== 'view') && // if mode=="view" -> canRequestEditRights must be defined
             (!this.isReviewOnly || this.canLicense) && // if isReviewOnly==true -> canLicense must be true
-            true/*isSupportEditFeature*/;
+            isSupportEditFeature;
         this.isEdit = this.canLicense && this.canEdit && this.config.mode !== 'view';
         this.canReview = this.canLicense && this.isEdit && (permissions.review===true);
         this.canUseHistory = this.canLicense && !this.isLightVersion && this.config.canUseHistory && this.canCoAuthoring && !this.isDesktopApp;
diff --git a/apps/documenteditor/mobile/src/view/Toolbar.jsx b/apps/documenteditor/mobile/src/view/Toolbar.jsx
index 21b2c4a93..aa45f2793 100644
--- a/apps/documenteditor/mobile/src/view/Toolbar.jsx
+++ b/apps/documenteditor/mobile/src/view/Toolbar.jsx
@@ -24,6 +24,9 @@ const ToolbarView = props => {
                     onUndoClick: props.onUndo,
                     onRedoClick: props.onRedo
                 })}
+                {props.showEditDocument &&
+                    <Link className={props.disabledControls ? 'disabled' : ''} icon='icon-edit' href={false} onClick={props.onEditDocument}></Link>
+                }
                 {props.isEdit && EditorUIController.getToolbarOptions && EditorUIController.getToolbarOptions({
                         disabled: disableEditBtn || props.disabledControls,
                         onEditClick: e => props.openOptions('edit'),
diff --git a/apps/presentationeditor/mobile/src/controller/Main.jsx b/apps/presentationeditor/mobile/src/controller/Main.jsx
index cd75ed0cf..993c3cbdb 100644
--- a/apps/presentationeditor/mobile/src/controller/Main.jsx
+++ b/apps/presentationeditor/mobile/src/controller/Main.jsx
@@ -153,7 +153,7 @@ class MainController extends Component {
                 this.appOptions.canLicense      = (licType === Asc.c_oLicenseResult.Success || licType === Asc.c_oLicenseResult.SuccessLimit);
 
                 const storeAppOptions = this.props.storeAppOptions;
-                storeAppOptions.setPermissionOptions(this.document, licType, params, this.permissions);
+                storeAppOptions.setPermissionOptions(this.document, licType, params, this.permissions, EditorUIController.isSupportEditFeature());
                 this.applyMode(storeAppOptions);
 
                 this.api.asc_LoadDocument();
diff --git a/apps/presentationeditor/mobile/src/controller/Toolbar.jsx b/apps/presentationeditor/mobile/src/controller/Toolbar.jsx
index 2ba059cfa..42a240a7b 100644
--- a/apps/presentationeditor/mobile/src/controller/Toolbar.jsx
+++ b/apps/presentationeditor/mobile/src/controller/Toolbar.jsx
@@ -12,6 +12,8 @@ const ToolbarController = inject('storeAppOptions', 'users')(props => {
     const isDisconnected = props.users.isDisconnected;
     const displayCollaboration = props.users.hasEditUsers || appOptions.canViewComments;
 
+    const showEditDocument = !appOptions.isEdit && appOptions.canEdit && appOptions.canRequestEditRights;
+
     useEffect(() => {
         const onDocumentReady = () => {
             const api = Common.EditorApi.get();
@@ -185,6 +187,10 @@ const ToolbarController = inject('storeAppOptions', 'users')(props => {
         f7.popup.close();
     };
 
+    const onEditDocument = () => {
+        Common.Gateway.requestEditRights();
+    };
+
     return (
         <ToolbarView openOptions={props.openOptions}
                      isEdit={appOptions.isEdit}
@@ -202,6 +208,8 @@ const ToolbarController = inject('storeAppOptions', 'users')(props => {
                      disabledEditControls={disabledEditControls}
                      disabledSettings={disabledSettings}
                      displayCollaboration={displayCollaboration}
+                     showEditDocument={showEditDocument}
+                     onEditDocument={onEditDocument}
         />
     )
 });
diff --git a/apps/presentationeditor/mobile/src/less/icons-ios.less b/apps/presentationeditor/mobile/src/less/icons-ios.less
index d08a23aaf..b72ce6628 100644
--- a/apps/presentationeditor/mobile/src/less/icons-ios.less
+++ b/apps/presentationeditor/mobile/src/less/icons-ios.less
@@ -19,12 +19,6 @@
       .encoded-svg-background('<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 22 22" fill="@{themeColor}"><g><rect x="2" y="17" width="18" height="1"/><rect x="2" y="13" width="18" height="1"/><rect x="2" y="9" width="18" height="1"/><rect x="2" y="5" width="18" height="1"/></g></svg>');
     }
 
-    &.icon-edit {
-      width: 22px;
-      height: 22px;
-      .encoded-svg-background('<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 22 22" fill="@{themeColor}"><g><path d="M0,20h22v1H0V20z"/><polygon points="19.3,5.3 6.1,18.4 4.6,16.9 17.8,3.8 17.1,3.1 3.5,16.7 3,20 6.3,19.5 19.9,5.9 	"/><path d="M20.5,5.3L22,3.8c0,0-0.2-1.2-0.9-1.9C20.4,1.1,19.2,1,19.2,1l-1.5,1.5L20.5,5.3z"/></g></svg>');
-    }
-
     &.icon-edit-settings {
       width: 22px;
       height: 22px;
diff --git a/apps/presentationeditor/mobile/src/less/icons-material.less b/apps/presentationeditor/mobile/src/less/icons-material.less
index 199f3c59c..ecd71da8f 100644
--- a/apps/presentationeditor/mobile/src/less/icons-material.less
+++ b/apps/presentationeditor/mobile/src/less/icons-material.less
@@ -522,12 +522,6 @@
         .encoded-svg-background('<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 22 22" fill="@{navBarIconColor}"><g><path d="M21,12h-9v9h-2v-9H1v-2h9V1h2v9h9V12z"/></g></svg>');
       }
 
-      &.icon-edit {
-        width: 22px;
-        height: 22px;
-        .encoded-svg-background('<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 22 22" fill="@{navBarIconColor}"><g><path d="M0,20h22v1H0V20z"/><polygon points="17.1,3.1 3.5,16.7 3,20 6.3,19.5 19.9,5.9 	"/><path d="M20.5,5.3L22,3.8c0,0-0.2-1.2-0.9-1.9C20.4,1.1,19.2,1,19.2,1l-1.5,1.5L20.5,5.3z"/></g></svg>');
-      }
-
       &.icon-play {
         width: 22px;
         height: 22px;
diff --git a/apps/presentationeditor/mobile/src/store/appOptions.js b/apps/presentationeditor/mobile/src/store/appOptions.js
index 0cb3fc7cd..c2c95246f 100644
--- a/apps/presentationeditor/mobile/src/store/appOptions.js
+++ b/apps/presentationeditor/mobile/src/store/appOptions.js
@@ -63,7 +63,7 @@ export class storeAppOptions {
         this.canPlugins = false;
     }
 
-    setPermissionOptions (document, licType, params, permissions) {
+    setPermissionOptions (document, licType, params, permissions, isSupportEditFeature) {
         this.review = (permissions.review === undefined) ? (permissions.edit !== false) : permissions.review;
         this.canAnalytics = params.asc_getIsAnalyticsEnable();
         this.canLicense = (licType === Asc.c_oLicenseResult.Success || licType === Asc.c_oLicenseResult.SuccessLimit);
@@ -75,7 +75,7 @@ export class storeAppOptions {
         this.canEdit = (permissions.edit !== false || permissions.review === true) && // can edit or review
             (this.config.canRequestEditRights || this.config.mode !== 'view') && // if mode=="view" -> canRequestEditRights must be defined
             (!this.isReviewOnly || this.canLicense) && // if isReviewOnly==true -> canLicense must be true
-            true/*isSupportEditFeature*/;
+            isSupportEditFeature;
         this.isEdit = this.canLicense && this.canEdit && this.config.mode !== 'view';
         this.canReview = this.canLicense && this.isEdit && (permissions.review===true);
         this.canUseHistory = this.canLicense && !this.isLightVersion && this.config.canUseHistory && this.canCoAuthoring && !this.isDesktopApp;
diff --git a/apps/presentationeditor/mobile/src/view/Toolbar.jsx b/apps/presentationeditor/mobile/src/view/Toolbar.jsx
index 06c95d950..903d9a05d 100644
--- a/apps/presentationeditor/mobile/src/view/Toolbar.jsx
+++ b/apps/presentationeditor/mobile/src/view/Toolbar.jsx
@@ -24,6 +24,9 @@ const ToolbarView = props => {
                     onRedoClick: props.onRedo
                 })}
                 <Link className={(props.disabledControls || props.disabledPreview) && 'disabled'} icon='icon-play' href={false} onClick={() => {props.openOptions('preview')}}></Link>
+                {props.showEditDocument &&
+                    <Link className={props.disabledControls ? 'disabled' : ''} icon='icon-edit' href={false} onClick={props.onEditDocument}></Link>
+                }
                 {props.isEdit && EditorUIController.getToolbarOptions && EditorUIController.getToolbarOptions({
                     disabledAdd: props.disabledAdd || props.disabledControls,
                     disabledEdit: props.disabledEdit || props.disabledControls,
diff --git a/apps/spreadsheeteditor/mobile/src/controller/Main.jsx b/apps/spreadsheeteditor/mobile/src/controller/Main.jsx
index b7c2d51fd..f96ca6aef 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/Main.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/Main.jsx
@@ -186,7 +186,7 @@ class MainController extends Component {
                 this.appOptions.canLicense = (licType === Asc.c_oLicenseResult.Success || licType === Asc.c_oLicenseResult.SuccessLimit);
 
                 const appOptions = this.props.storeAppOptions;
-                appOptions.setPermissionOptions(this.document, licType, params, this.permissions);
+                appOptions.setPermissionOptions(this.document, licType, params, this.permissions, EditorUIController.isSupportEditFeature());
 
                 this.applyMode(appOptions);
 
diff --git a/apps/spreadsheeteditor/mobile/src/controller/Toolbar.jsx b/apps/spreadsheeteditor/mobile/src/controller/Toolbar.jsx
index b55d691d7..ade8d976a 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/Toolbar.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/Toolbar.jsx
@@ -13,6 +13,8 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeSpreadsheetIn
     const displayCollaboration = props.users.hasEditUsers || appOptions.canViewComments;
     const docTitle = props.storeSpreadsheetInfo.dataDoc ? props.storeSpreadsheetInfo.dataDoc.title : '';
 
+    const showEditDocument = !appOptions.isEdit && appOptions.canEdit && appOptions.canRequestEditRights;
+
     useEffect(() => {
         const onDocumentReady = () => {
             const api = Common.EditorApi.get();
@@ -186,6 +188,10 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeSpreadsheetIn
         f7.popup.close();
     };
 
+    const onEditDocument = () => {
+        Common.Gateway.requestEditRights();
+    };
+
     return (
         <ToolbarView openOptions={props.openOptions}
                      isEdit={appOptions.isEdit}
@@ -200,6 +206,8 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeSpreadsheetIn
                      disabledEditControls={disabledEditControls}
                      disabledSettings={disabledSettings}
                      displayCollaboration={displayCollaboration}
+                     showEditDocument={showEditDocument}
+                     onEditDocument={onEditDocument}
         />
     )
 });
diff --git a/apps/spreadsheeteditor/mobile/src/less/icons-ios.less b/apps/spreadsheeteditor/mobile/src/less/icons-ios.less
index 26229adbb..1a908bcff 100644
--- a/apps/spreadsheeteditor/mobile/src/less/icons-ios.less
+++ b/apps/spreadsheeteditor/mobile/src/less/icons-ios.less
@@ -12,11 +12,6 @@
             height: 24px;
             .encoded-svg-background('<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 22 22" fill="@{themeColor}"><g><path d="M15.8,15c1.4-1.6,2.2-3.7,2.2-5.9c0-5-4-9-9-9C4,0,0,4,0,9c0,5,4,9,9,9c2.3,0,4.4-0.9,5.9-2.2l5.8,5.8l0.2-0.6l0.7-0.2L15.8,15z M9,17c-4.4,0-8-3.6-8-8c0-4.4,3.6-8,8-8c4.4,0,8,3.6,8,8C17,13.5,13.5,17,9,17z"/></g></svg>');
         }
-        &.icon-edit {
-            width: 22px;
-            height: 22px;
-            .encoded-svg-background('<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 22 22" fill="@{themeColor}"><g><path d="M0,20h22v1H0V20z"/><polygon points="19.3,5.3 6.1,18.4 4.6,16.9 17.8,3.8 17.1,3.1 3.5,16.7 3,20 6.3,19.5 19.9,5.9 	"/><path d="M20.5,5.3L22,3.8c0,0-0.2-1.2-0.9-1.9C20.4,1.1,19.2,1,19.2,1l-1.5,1.5L20.5,5.3z"/></g></svg>');
-        }
         &.icon-edit-settings {
             width: 22px;
             height: 22px;
diff --git a/apps/spreadsheeteditor/mobile/src/less/icons-material.less b/apps/spreadsheeteditor/mobile/src/less/icons-material.less
index 046876ee2..8c80a42f0 100644
--- a/apps/spreadsheeteditor/mobile/src/less/icons-material.less
+++ b/apps/spreadsheeteditor/mobile/src/less/icons-material.less
@@ -431,11 +431,6 @@
                 height: 22px;
                 .encoded-svg-background('<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 22 22" fill="@{navBarIconColor}"><g><path d="M21,12h-9v9h-2v-9H1v-2h9V1h2v9h9V12z"/></g></svg>');
             }
-            &.icon-edit {
-                width: 22px;
-                height: 22px;
-                .encoded-svg-background('<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 22 22" fill="@{navBarIconColor}"><g><path d="M0,20h22v1H0V20z"/><polygon points="17.1,3.1 3.5,16.7 3,20 6.3,19.5 19.9,5.9 	"/><path d="M20.5,5.3L22,3.8c0,0-0.2-1.2-0.9-1.9C20.4,1.1,19.2,1,19.2,1l-1.5,1.5L20.5,5.3z"/></g></svg>');
-            }
             &.icon-settings {
                 width: 22px;
                 height: 22px;
diff --git a/apps/spreadsheeteditor/mobile/src/store/appOptions.js b/apps/spreadsheeteditor/mobile/src/store/appOptions.js
index 33d830d27..0013291b2 100644
--- a/apps/spreadsheeteditor/mobile/src/store/appOptions.js
+++ b/apps/spreadsheeteditor/mobile/src/store/appOptions.js
@@ -66,7 +66,7 @@ export class storeAppOptions {
         this.canPlugins = false;
     }
 
-    setPermissionOptions (document, licType, params, permissions) {
+    setPermissionOptions (document, licType, params, permissions, isSupportEditFeature) {
         permissions.edit = params.asc_getRights() !== Asc.c_oRights.Edit ? false : true;
         this.canAutosave = true;
         this.canAnalytics = params.asc_getIsAnalyticsEnable();
@@ -76,9 +76,8 @@ export class storeAppOptions {
         this.isOffline = Common.EditorApi.get().asc_isOffline();
         this.canRequestEditRights = this.config.canRequestEditRights;
         this.canEdit = permissions.edit !== false  && // can edit or review
-            (this.config.canRequestEditRights || this.config.mode !== 'view') && true; // if mode=="view" -> canRequestEditRights must be defined
+            (this.config.canRequestEditRights || this.config.mode !== 'view') && isSupportEditFeature; // if mode=="view" -> canRequestEditRights must be defined
             // (!this.isReviewOnly || this.canLicense) && // if isReviewOnly==true -> canLicense must be true
-            // true /*isSupportEditFeature*/;
         this.isEdit = (this.canLicense || this.isEditDiagram || this.isEditMailMerge) && permissions.edit !== false && this.config.mode !== 'view' && true;
         this.canComments = this.canLicense && (permissions.comment === undefined ? this.isEdit : permissions.comment) && (this.config.mode !== 'view');
         this.canComments = this.canComments && !((typeof (this.customization) == 'object') && this.customization.comments===false);
diff --git a/apps/spreadsheeteditor/mobile/src/view/Toolbar.jsx b/apps/spreadsheeteditor/mobile/src/view/Toolbar.jsx
index bf1b7d602..93c1c7740 100644
--- a/apps/spreadsheeteditor/mobile/src/view/Toolbar.jsx
+++ b/apps/spreadsheeteditor/mobile/src/view/Toolbar.jsx
@@ -19,6 +19,9 @@ const ToolbarView = props => {
             {!Device.phone && <NavTitle>{props.docTitle}</NavTitle>}
             <NavRight>
                 {Device.android && undo_box}
+                {props.showEditDocument &&
+                    <Link className={props.disabledControls ? 'disabled' : ''} icon='icon-edit' href={false} onClick={props.onEditDocument}></Link>
+                }
                 {props.isEdit && EditorUIController.toolbarOptions && EditorUIController.toolbarOptions.getEditOptions({
                     disabled: props.disabledEditControls || props.disabledControls,
                     onEditClick: () => props.openOptions('edit'),

From 7b3c27c619a2a8ba5c7b4fc5fda1595ef035c035 Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Wed, 9 Jun 2021 16:28:16 +0300
Subject: [PATCH 24/86] [PE mobile] Fix Bug 50793

---
 apps/presentationeditor/mobile/src/controller/Main.jsx | 1 -
 1 file changed, 1 deletion(-)

diff --git a/apps/presentationeditor/mobile/src/controller/Main.jsx b/apps/presentationeditor/mobile/src/controller/Main.jsx
index a6a850a4f..0e16e7584 100644
--- a/apps/presentationeditor/mobile/src/controller/Main.jsx
+++ b/apps/presentationeditor/mobile/src/controller/Main.jsx
@@ -591,7 +591,6 @@ class MainController extends Component {
             const buttons = [{
                 text: 'OK',
                 bold: true,
-                close: false,
                 onClick: () => {
                     const password = document.getElementById('modal-password').value;
                     this.api.asc_setAdvancedOptions(type, new Asc.asc_CDRMAdvancedOptions(password));

From 5c63e5cb0e8e636ac70267ad6d79654dcb8cbbae Mon Sep 17 00:00:00 2001
From: JuliaSvinareva <Julia.Svinaryova@onlyoffice.com>
Date: Wed, 9 Jun 2021 17:17:42 +0300
Subject: [PATCH 25/86] [common] Fix bug 48484

---
 .../common/mobile/lib/controller/collaboration/Comments.jsx | 5 +++--
 apps/common/mobile/lib/store/comments.js                    | 1 +
 apps/common/mobile/lib/view/collaboration/Comments.jsx      | 6 ++++--
 3 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/apps/common/mobile/lib/controller/collaboration/Comments.jsx b/apps/common/mobile/lib/controller/collaboration/Comments.jsx
index 4d476b7aa..86855daed 100644
--- a/apps/common/mobile/lib/controller/collaboration/Comments.jsx
+++ b/apps/common/mobile/lib/controller/collaboration/Comments.jsx
@@ -101,6 +101,9 @@ class CommentsController extends Component {
     }
     removeComment (id) {
         this.storeComments.removeComment(id);
+        if (this.storeComments.showComments.length < 1) {
+            Device.phone ? f7.sheet.close('#view-comment-sheet') : f7.popover.close('#view-comment-popover');
+        }
     }
     removeComments (data) {
         for (let i = 0; i < data.length; i++) {
@@ -481,8 +484,6 @@ class ViewCommentsController extends Component {
     }
     deleteComment (comment) {
         const api = Common.EditorApi.get();
-       
-        this.props.storeComments.removeShowComment(comment.uid);
         comment && api.asc_removeComment(comment.uid);
     }
     deleteReply (comment, reply) {
diff --git a/apps/common/mobile/lib/store/comments.js b/apps/common/mobile/lib/store/comments.js
index 49cf46fe4..6d5fc05cc 100644
--- a/apps/common/mobile/lib/store/comments.js
+++ b/apps/common/mobile/lib/store/comments.js
@@ -61,6 +61,7 @@ export class storeComments {
         if (index !== -1) {
             collection.splice(index, 1);
         }
+        this.removeShowComment(id);
     }
 
     changeComment (id, changeComment) {
diff --git a/apps/common/mobile/lib/view/collaboration/Comments.jsx b/apps/common/mobile/lib/view/collaboration/Comments.jsx
index 5c73e2e59..d403f8cbb 100644
--- a/apps/common/mobile/lib/view/collaboration/Comments.jsx
+++ b/apps/common/mobile/lib/view/collaboration/Comments.jsx
@@ -759,7 +759,7 @@ const CommentList = inject("storeComments", "storeAppOptions")(observer(({storeC
     };
 
     const onViewNextComment = () => {
-        if (currentIndex + 1 === comments.length) {
+        if (currentIndex + 1 >= comments.length) {
             setCurrentIndex(0);
         } else {
             setCurrentIndex(currentIndex + 1);
@@ -767,7 +767,9 @@ const CommentList = inject("storeComments", "storeAppOptions")(observer(({storeC
     };
 
     if(!comment) {
-        Device.phone ? f7.sheet.close('#view-comment-sheet') : f7.popover.close('#view-comment-popover');
+        if (comments.length > 0) {
+            onViewNextComment();
+        }
         return null;
     }
 

From 8d953f5dbb2ac4d8ce0c04de7b360e2bb3ff3eab Mon Sep 17 00:00:00 2001
From: Maxim Kadushkin <maxim.kadushkin@onlyoffice.com>
Date: Thu, 10 Jun 2021 15:14:35 +0300
Subject: [PATCH 26/86] [themes] redactoring for mobile

---
 .../resources/less/colors-table-dark.less     | 13 ++++----
 .../mobile/resources/less/colors-table.less   | 33 +++++++++++++++----
 2 files changed, 33 insertions(+), 13 deletions(-)

diff --git a/apps/common/mobile/resources/less/colors-table-dark.less b/apps/common/mobile/resources/less/colors-table-dark.less
index b788bc7bd..3c32e27d3 100644
--- a/apps/common/mobile/resources/less/colors-table-dark.less
+++ b/apps/common/mobile/resources/less/colors-table-dark.less
@@ -1,21 +1,22 @@
 
 :root {
     .theme-dark {
+        --brand-word: #208BFF;
+        --brand-cell: #34C759;
+        --brand-slide: #FF4A31;
+
         --background-primary: #1C1C1E;
         --background-secondary: #2C2C2E;
         --background-tab-active: #636366;
-        --text-tertiary: #48484A;
         --background-tab-normal: #757575;
+        --background-menu-divider: fade(#545458, 36%);
+
+        --text-tertiary: #48484A;
         --text-normal: #FFF;
         --text-secondary: fade(#EBEBF5, 60%);
         --text-link: #1976D2;
         --text-error: #FF453A;
 
-        --background-menu-divider: fade(#545458, 36%);
-        --brand-word: #208BFF;
-        --brand-cell: #34C759;
-        --brand-slide: #FF4A31;
-
         --component-disabled-opacity: .4;
     }
 }
\ No newline at end of file
diff --git a/apps/common/mobile/resources/less/colors-table.less b/apps/common/mobile/resources/less/colors-table.less
index a5474ece2..142875f1c 100644
--- a/apps/common/mobile/resources/less/colors-table.less
+++ b/apps/common/mobile/resources/less/colors-table.less
@@ -1,19 +1,38 @@
 
 :root {
+    --brand-word: #446995;
+    --brand-cell: #40865C;
+    --brand-slide: #AA5252;
+
     --background-primary: #FFF;
     --background-secondary: #FFF;
     --background-tab-active: #AEAEB2;
-    --text-tertiary: #C7C7CC;
+    --background-menu-divider: fade(#3C3C43, 36%);
     --background-tab-normal: fade(#FFF, 50%);
+
+    --text-tertiary: #C7C7CC;
     --text-normal: #000;
     --text-secondary: fade(#3C3C43, 60%);
     --text-link: #007AFF;
     --text-error: #FF3B30;
 
-    --background-menu-divider: fade(#3C3C43, 36%);
-    --brand-word: #446995;
-    --brand-cell: #40865C;
-    --brand-slide: #AA5252;
-
     --component-disabled-opacity: .4;
-}
\ No newline at end of file
+}
+
+@brand-word: var(--brand-word);
+@brand-cell: var(--brand-cell);
+@brand-slide: var(--brand-slide);
+
+@background-primary: var(--background-primary);
+@background-secondary: var(--background-secondary);
+@background-tab-active: var(--background-tab-active);
+@background-tab-normal: var(--background-tab-normal);
+@background-menu-divider: var(--background-menu-divider);
+
+@text-tertiary: var(--text-tertiary);
+@text-normal: var(--text-normal);
+@text-secondary: var(--text-secondary);
+@text-link: var(--text-link);
+@text-error: var(--text-error);
+
+@component-disabled-opacity: var(--component-disabled-opacity);

From b49af817e2cdc21ec8540f807c6db96bc4d5248f Mon Sep 17 00:00:00 2001
From: Maxim Kadushkin <maxim.kadushkin@onlyoffice.com>
Date: Thu, 10 Jun 2021 16:05:11 +0300
Subject: [PATCH 27/86] [all mobile] emulate default device when it's not a
 compatible

---
 apps/documenteditor/mobile/src/index_dev.html     | 12 ++++++++++++
 apps/presentationeditor/mobile/src/index_dev.html | 12 ++++++++++++
 apps/spreadsheeteditor/mobile/src/index_dev.html  | 12 ++++++++++++
 3 files changed, 36 insertions(+)

diff --git a/apps/documenteditor/mobile/src/index_dev.html b/apps/documenteditor/mobile/src/index_dev.html
index e6206d4cb..34e64efc6 100644
--- a/apps/documenteditor/mobile/src/index_dev.html
+++ b/apps/documenteditor/mobile/src/index_dev.html
@@ -33,6 +33,18 @@
             // Framework7 doesn't set Device.android flag when navigator.platform == 'Win32', change it for debug
             navigator.__defineGetter__('platform', () => 'Win32Debug');
 
+        if ( !isAndroid ) {
+            const ua = navigator.userAgent;
+            const iPad = ua.match(/(iPad).*OS\s([\d_]+)/);
+            const iPhone = !iPad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
+
+            if ( !iPad && !iPhone ) {
+                Object.defineProperty(navigator, 'userAgent', {
+                    get: function () { return `iPad; CPU OS 11_0 ${ua}`; }
+                });
+            }
+        }
+
         const getUrlParams = () => {
             let e,
                 a = /\+/g,  // Regex for replacing addition symbol with a space
diff --git a/apps/presentationeditor/mobile/src/index_dev.html b/apps/presentationeditor/mobile/src/index_dev.html
index 4342a52b6..cb2743791 100644
--- a/apps/presentationeditor/mobile/src/index_dev.html
+++ b/apps/presentationeditor/mobile/src/index_dev.html
@@ -33,6 +33,18 @@
             // Framework7 doesn't set Device.android flag when navigator.platform == 'Win32', change it for debug
             navigator.__defineGetter__('platform', () => 'Win32Debug');
 
+        if ( !isAndroid ) {
+            const ua = navigator.userAgent;
+            const iPad = ua.match(/(iPad).*OS\s([\d_]+)/);
+            const iPhone = !iPad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
+
+            if ( !iPad && !iPhone ) {
+                Object.defineProperty(navigator, 'userAgent', {
+                    get: function () { return `iPad; CPU OS 11_0 ${ua}`; }
+                });
+            }
+        }
+
         const getUrlParams = () => {
             let e,
                 a = /\+/g,  // Regex for replacing addition symbol with a space
diff --git a/apps/spreadsheeteditor/mobile/src/index_dev.html b/apps/spreadsheeteditor/mobile/src/index_dev.html
index 8b053439c..4494d3717 100644
--- a/apps/spreadsheeteditor/mobile/src/index_dev.html
+++ b/apps/spreadsheeteditor/mobile/src/index_dev.html
@@ -33,6 +33,18 @@
             // Framework7 doesn't set Device.android flag when navigator.platform == 'Win32', change it for debug
             navigator.__defineGetter__('platform', () => 'Win32Debug');
 
+        if ( !isAndroid ) {
+            const ua = navigator.userAgent;
+            const iPad = ua.match(/(iPad).*OS\s([\d_]+)/);
+            const iPhone = !iPad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
+
+            if ( !iPad && !iPhone ) {
+                Object.defineProperty(navigator, 'userAgent', {
+                    get: function () { return `iPad; CPU OS 11_0 ${ua}`; }
+                });
+            }
+        }
+
         const getUrlParams = () => {
             let e,
                 a = /\+/g,  // Regex for replacing addition symbol with a space

From 80bbdf2828953cd68ca3e44d44a30cc1c1077ecf Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Thu, 10 Jun 2021 19:53:15 +0300
Subject: [PATCH 28/86] [PE SSE mobile] Fix Bug 50792

---
 apps/presentationeditor/mobile/src/view/add/AddLink.jsx | 4 ----
 apps/spreadsheeteditor/mobile/src/view/add/AddLink.jsx  | 4 ----
 2 files changed, 8 deletions(-)

diff --git a/apps/presentationeditor/mobile/src/view/add/AddLink.jsx b/apps/presentationeditor/mobile/src/view/add/AddLink.jsx
index 4894ac965..fd164ddb6 100644
--- a/apps/presentationeditor/mobile/src/view/add/AddLink.jsx
+++ b/apps/presentationeditor/mobile/src/view/add/AddLink.jsx
@@ -116,11 +116,7 @@ const PageLink = props => {
                                placeholder={_t.textLink}
                                value={link}
                                onChange={(event) => {
-                                if (link.includes('https://')) {
-                                    setDisplay(link)
-                                }
                                 setLink(event.target.value)
-                                setDisplay(event.target.value)
                             }}
                     /> :
                     <ListItem link={'/add-link-to/'} title={_t.textLinkTo} after={displayTo} routeProps={{
diff --git a/apps/spreadsheeteditor/mobile/src/view/add/AddLink.jsx b/apps/spreadsheeteditor/mobile/src/view/add/AddLink.jsx
index bb107b16e..57f69fec0 100644
--- a/apps/spreadsheeteditor/mobile/src/view/add/AddLink.jsx
+++ b/apps/spreadsheeteditor/mobile/src/view/add/AddLink.jsx
@@ -88,11 +88,7 @@ const AddLinkView = props => {
                                placeholder={_t.textLink}
                                value={link}
                                onChange={(event) => {
-                                if (link.includes('https://')) {
-                                    setDisplayText(link)
-                                }
                                 setLink(event.target.value)
-                                setDisplayText(event.target.value)
                             }}
                                className={isIos ? 'list-input-right' : ''}
                     />

From 210e8dcd3bc1d963ca463a274c8265bf5aa87c90 Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Fri, 11 Jun 2021 01:08:23 +0300
Subject: [PATCH 29/86] [DE PE SSE mobile] Fix Bug 50796

---
 .../mobile/src/controller/Search.jsx          | 14 ++++-
 .../mobile/src/controller/Search.jsx          | 16 ++++--
 .../mobile/src/view/settings/Settings.jsx     | 18 ++++--
 .../mobile/src/controller/Search.jsx          | 16 ++++--
 .../mobile/src/controller/Statusbar.jsx       |  5 +-
 .../mobile/src/view/Statusbar.jsx             | 55 ++++++++++---------
 .../mobile/src/view/settings/Settings.jsx     | 17 ++++--
 7 files changed, 92 insertions(+), 49 deletions(-)

diff --git a/apps/documenteditor/mobile/src/controller/Search.jsx b/apps/documenteditor/mobile/src/controller/Search.jsx
index 31b888efc..6c2a34f13 100644
--- a/apps/documenteditor/mobile/src/controller/Search.jsx
+++ b/apps/documenteditor/mobile/src/controller/Search.jsx
@@ -4,6 +4,7 @@ import { SearchController, SearchView, SearchSettingsView } from '../../../../co
 import { f7 } from 'framework7-react';
 import { withTranslation } from 'react-i18next';
 import { Device } from '../../../../common/mobile/utils/device';
+import { observer, inject } from "mobx-react";
 
 class SearchSettings extends SearchSettingsView {
     constructor(props) {
@@ -22,6 +23,8 @@ class SearchSettings extends SearchSettingsView {
         const show_popover = !Device.phone;
         const { t } = this.props;
         const _t = t("Settings", {returnObjects: true});
+        const storeAppOptions = this.props.storeAppOptions;
+        const isEdit = storeAppOptions.isEdit;
 
         const markup = (
                 <Page>
@@ -34,9 +37,14 @@ class SearchSettings extends SearchSettingsView {
                     </Navbar>
                     <List>
                         <ListItem radio title={_t.textFind} name="find-replace-checkbox" checked={!this.state.useReplace} onClick={e => this.onFindReplaceClick('find')} />
-                        <ListItem radio title={_t.textFindAndReplace} name="find-replace-checkbox" checked={this.state.useReplace} onClick={e => this.onFindReplaceClick('replace')} />
-                        <ListItem radio title={_t.textFindAndReplaceAll} name="find-replace-checkbox" checked={this.state.isReplaceAll}
+                        {isEdit ? 
+                            <ListItem radio title={_t.textFindAndReplace} name="find-replace-checkbox" checked={this.state.useReplace} 
+                                onClick={e => this.onFindReplaceClick('replace')} />
+                        : null}
+                        {isEdit ? 
+                            <ListItem radio title={_t.textFindAndReplaceAll} name="find-replace-checkbox" checked={this.state.isReplaceAll}
                                 onClick={() => this.onFindReplaceClick('replace-all')}></ListItem>
+                        : null}
                     </List>
                     <List>
                         <ListItem title={_t.textCaseSensitive}>
@@ -115,6 +123,6 @@ const Search = withTranslation()(props => {
     return <DESearchView _t={_t} onSearchQuery={onSearchQuery} onReplaceQuery={onReplaceQuery} onReplaceAllQuery={onReplaceAllQuery} />
 });
 
-const SearchSettingsWithTranslation = withTranslation()(SearchSettings);
+const SearchSettingsWithTranslation = inject("storeAppOptions")(observer(withTranslation()(SearchSettings)));
 
 export {Search, SearchSettingsWithTranslation as SearchSettings}
diff --git a/apps/presentationeditor/mobile/src/controller/Search.jsx b/apps/presentationeditor/mobile/src/controller/Search.jsx
index 9cf8975d4..497d7a70b 100644
--- a/apps/presentationeditor/mobile/src/controller/Search.jsx
+++ b/apps/presentationeditor/mobile/src/controller/Search.jsx
@@ -4,6 +4,7 @@ import { SearchController, SearchView, SearchSettingsView } from '../../../../co
 import { f7 } from 'framework7-react';
 import { withTranslation } from 'react-i18next';
 import { Device } from '../../../../common/mobile/utils/device';
+import { observer, inject } from "mobx-react";
 
 class SearchSettings extends SearchSettingsView {
     constructor(props) {
@@ -15,6 +16,8 @@ class SearchSettings extends SearchSettingsView {
         const show_popover = !Device.phone;
         const { t } = this.props;
         const _t = t("View.Settings", {returnObjects: true});
+        const storeAppOptions = this.props.storeAppOptions;
+        const isEdit = storeAppOptions.isEdit;
 
         const markup = (
                 <Page>
@@ -27,9 +30,14 @@ class SearchSettings extends SearchSettingsView {
                     </Navbar>
                     <List>
                         <ListItem radio title={_t.textFind} name="find-replace-checkbox" checked={!this.state.useReplace} onClick={e => this.onFindReplaceClick('find')} />
-                        <ListItem radio title={_t.textFindAndReplace} name="find-replace-checkbox" checked={this.state.useReplace} onClick={e => this.onFindReplaceClick('replace')} />
-                        <ListItem radio title={_t.textFindAndReplaceAll} name="find-replace-checkbox" checked={this.state.isReplaceAll}
-                            onClick={() => this.onFindReplaceClick('replace-all')}></ListItem>
+                        {isEdit ?
+                            <ListItem radio title={_t.textFindAndReplace} name="find-replace-checkbox" checked={this.state.useReplace} 
+                                onClick={e => this.onFindReplaceClick('replace')} />
+                        : null}
+                        {isEdit ?
+                            <ListItem radio title={_t.textFindAndReplaceAll} name="find-replace-checkbox" checked={this.state.isReplaceAll}
+                                onClick={() => this.onFindReplaceClick('replace-all')}></ListItem>
+                        : null}
                     </List>
                     <List>
                         <ListItem title={_t.textCaseSensitive}>
@@ -97,6 +105,6 @@ const Search = withTranslation()(props => {
     return <PESearchView _t={_t} onSearchQuery={onSearchQuery} onReplaceQuery={onReplaceQuery} onReplaceAllQuery={onReplaceAllQuery} />
 });
 
-const SearchSettingsWithTranslation = withTranslation()(SearchSettings);
+const SearchSettingsWithTranslation = inject("storeAppOptions")(observer(withTranslation()(SearchSettings)));
 
 export {Search, SearchSettingsWithTranslation as SearchSettings}
diff --git a/apps/presentationeditor/mobile/src/view/settings/Settings.jsx b/apps/presentationeditor/mobile/src/view/settings/Settings.jsx
index ff83ceda8..22f9a2339 100644
--- a/apps/presentationeditor/mobile/src/view/settings/Settings.jsx
+++ b/apps/presentationeditor/mobile/src/view/settings/Settings.jsx
@@ -1,8 +1,9 @@
 import React, {Component, useEffect} from 'react';
 import {View,Page,Navbar,NavRight,Link,Popup,Popover,Icon,ListItem,List} from 'framework7-react';
-import { withTranslation } from 'react-i18next';
+import { useTranslation } from 'react-i18next';
 import {f7} from 'framework7-react';
 import {Device} from '../../../../../common/mobile/utils/device';
+import { observer, inject } from "mobx-react";
 import ApplicationSettingsController from "../../controller/settings/ApplicationSettings";
 import { MacrosSettings } from "./ApplicationSettings";
 import DownloadController from "../../controller/settings/Download";
@@ -56,8 +57,8 @@ const routes = [
 ];
 
 
-const SettingsList = withTranslation()(props => {
-    const {t} = props;
+const SettingsList = inject("storeAppOptions")(observer(props => {
+    const { t } = useTranslation();
     const _t = t('View.Settings', {returnObjects: true});
     const navbar = <Navbar title={_t.textSettings}>
         {!props.inPopover  && <NavRight><Link popupClose=".settings-popup">{_t.textDone}</Link></NavRight>}
@@ -107,13 +108,20 @@ const SettingsList = withTranslation()(props => {
         window.open(url, "_blank");
     };
 
+    const appOptions = props.storeAppOptions;
+    let _isEdit = false;
+
+    if (!appOptions.isDisconnected) {
+        _isEdit = appOptions.isEdit;
+    } 
+    
     return (
         <View style={props.style} stackPages={true} routes={routes}>
             <Page>
                 {navbar}
                 <List>
                     {!props.inPopover &&
-                        <ListItem title={_t.textFindAndReplace} link="#" searchbarEnable='.searchbar' onClick={closeModal} className='no-indicator'>
+                        <ListItem disabled={appOptions.readerMode ? true : false} title={!_isEdit ? _t.textFind : _t.textFindAndReplace} link="#" searchbarEnable='.searchbar' onClick={closeModal} className='no-indicator'>
                             <Icon slot="media" icon="icon-search"></Icon>
                         </ListItem>
                     }
@@ -147,7 +155,7 @@ const SettingsList = withTranslation()(props => {
             </Page>
         </View>
     )
-});
+}));
 
 class SettingsView extends Component {
     constructor(props) {
diff --git a/apps/spreadsheeteditor/mobile/src/controller/Search.jsx b/apps/spreadsheeteditor/mobile/src/controller/Search.jsx
index ee4613c56..f6949e9c6 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/Search.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/Search.jsx
@@ -5,6 +5,7 @@ import { f7 } from 'framework7-react';
 import { withTranslation } from 'react-i18next';
 import { Dom7 } from 'framework7';
 import { Device } from '../../../../common/mobile/utils/device';
+import { observer, inject } from "mobx-react";
 
 class SearchSettings extends SearchSettingsView {
     constructor(props) {
@@ -23,6 +24,8 @@ class SearchSettings extends SearchSettingsView {
         const show_popover = !Device.phone;
         const { t } = this.props;
         const _t = t("View.Settings", { returnObjects: true });
+        const storeAppOptions = this.props.storeAppOptions;
+        const isEdit = storeAppOptions.isEdit;
 
         const markup = (
             <Page>
@@ -35,9 +38,14 @@ class SearchSettings extends SearchSettingsView {
                 </Navbar>
                 <List>
                     <ListItem radio title={_t.textFind} name="find-replace-checkbox" checked={!this.state.useReplace} onClick={e => this.onFindReplaceClick('find')} />
-                    <ListItem radio title={_t.textFindAndReplace} name="find-replace-checkbox" checked={this.state.useReplace} onClick={e => this.onFindReplaceClick('replace')} />
-                    <ListItem radio title={_t.textFindAndReplaceAll} name="find-replace-checkbox" checked={this.state.isReplaceAll}
-                        onClick={() => this.onFindReplaceClick('replace-all')}></ListItem>
+                    {isEdit ?
+                        <ListItem radio title={_t.textFindAndReplace} name="find-replace-checkbox" checked={this.state.useReplace} 
+                            onClick={e => this.onFindReplaceClick('replace')} />
+                    : null}
+                    {isEdit ? 
+                        <ListItem radio title={_t.textFindAndReplaceAll} name="find-replace-checkbox" checked={this.state.isReplaceAll}
+                            onClick={() => this.onFindReplaceClick('replace-all')}></ListItem>
+                    : null}
                 </List>
                 <BlockTitle>{_t.textSearchIn}</BlockTitle>
                 <List>
@@ -206,6 +214,6 @@ const Search = withTranslation()(props => {
     return <SESearchView _t={_t} onSearchQuery={onSearchQuery} onReplaceQuery={onReplaceQuery} onReplaceAllQuery={onReplaceAllQuery} />
 });
 
-const SearchSettingsWithTranslation = withTranslation()(SearchSettings);
+const SearchSettingsWithTranslation = inject("storeAppOptions")(observer(withTranslation()(SearchSettings)));
 
 export {Search, SearchSettingsWithTranslation as SearchSettings}
\ No newline at end of file
diff --git a/apps/spreadsheeteditor/mobile/src/controller/Statusbar.jsx b/apps/spreadsheeteditor/mobile/src/controller/Statusbar.jsx
index 6ca23f1da..47d3840c2 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/Statusbar.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/Statusbar.jsx
@@ -195,12 +195,13 @@ const Statusbar = inject('sheets', 'storeAppOptions', 'users')(props => {
 
         if (index == api.asc_getActiveWorksheetIndex()) {
             if (!opened) {
-                if (!isDisconnected) {
+                if (isEdit && !isDisconnected) {
                     api.asc_closeCellEditor();
                     f7.popover.open('#idx-tab-context-menu-popover', target);
                 }
             }
-        } else {
+        } 
+        else {
             f7.popover.close('#idx-tab-context-menu-popover', false);
             onTabClicked(i);
             // Common.Notifications.trigger('sheet:active', index);
diff --git a/apps/spreadsheeteditor/mobile/src/view/Statusbar.jsx b/apps/spreadsheeteditor/mobile/src/view/Statusbar.jsx
index c4915bbba..7af545d6f 100644
--- a/apps/spreadsheeteditor/mobile/src/view/Statusbar.jsx
+++ b/apps/spreadsheeteditor/mobile/src/view/Statusbar.jsx
@@ -8,12 +8,13 @@ const viewStyle = {
     height: 30
 };
 
-const StatusbarView = inject('sheets')(observer(props => {
+const StatusbarView = inject('sheets', "storeAppOptions")(observer(props => {
     const { t } = useTranslation();
     const _t = t('Statusbar', {returnObjects: true});
     const isAndroid = Device.android;
     const isPhone = Device.isPhone;
-    const { sheets } = props;
+    const { sheets, storeAppOptions } = props;
+    const isEdit = storeAppOptions.isEdit;
     const hiddenSheets = sheets.hiddenWorksheets();
     const allSheets = sheets.sheets;
     const getTabClassList = model => `tab ${model.active ? 'active' : ''} ${model.locked ? 'locked' : ''}`;
@@ -134,30 +135,32 @@ const StatusbarView = inject('sheets')(observer(props => {
                     </ul>
                 </div>
             </View>
-            <Popover id="idx-tab-context-menu-popover"
-                className="document-menu"
-                backdrop={false}
-                closeByBackdropClick={false}
-                closeByOutsideClick={false}
-            >
-                {isPhone || isAndroid ? ( 
-                    <List className="list-block">
-                        <ListButton title={_t.textDuplicate} onClick={() => props.onTabMenu('copy')} />
-                        <ListButton title={_t.textDelete} onClick={() => props.onTabMenu('del')} />
-                        <ListButton title={_t.textMore} onClick={() => props.onTabMenu('showMore')} /> 
-                    </List>
-                ) : (
-                    <List className="list-block">
-                        <ListButton title={_t.textDuplicate} onClick={() => props.onTabMenu('copy')} />
-                        <ListButton title={_t.textDelete} onClick={() => props.onTabMenu('del')} />
-                        <ListButton title={_t.textRename} onClick={() => props.onTabMenu('ren')} />
-                        <ListButton title={_t.textHide} onClick={() => props.onTabMenu('hide')} />
-                        {hiddenSheets.length ? (
-                            <ListButton title={_t.textUnhide} onClick={() => props.onTabMenu('unhide')} />
-                        ) : null}
-                    </List>
-                )}
-            </Popover>
+            {isEdit ? 
+                <Popover id="idx-tab-context-menu-popover"
+                    className="document-menu"
+                    backdrop={false}
+                    closeByBackdropClick={false}
+                    closeByOutsideClick={false}
+                >
+                    {isPhone || isAndroid ? ( 
+                        <List className="list-block">
+                            <ListButton title={_t.textDuplicate} onClick={() => props.onTabMenu('copy')} />
+                            <ListButton title={_t.textDelete} onClick={() => props.onTabMenu('del')} />
+                            <ListButton title={_t.textMore} onClick={() => props.onTabMenu('showMore')} /> 
+                        </List>
+                    ) : (
+                        <List className="list-block">
+                            <ListButton title={_t.textDuplicate} onClick={() => props.onTabMenu('copy')} />
+                            <ListButton title={_t.textDelete} onClick={() => props.onTabMenu('del')} />
+                            <ListButton title={_t.textRename} onClick={() => props.onTabMenu('ren')} />
+                            <ListButton title={_t.textHide} onClick={() => props.onTabMenu('hide')} />
+                            {hiddenSheets.length ? (
+                                <ListButton title={_t.textUnhide} onClick={() => props.onTabMenu('unhide')} />
+                            ) : null}
+                        </List>
+                    )}
+                </Popover>
+            : null}
             {isPhone || isAndroid ? (
                 <Actions id="idx-tab-menu-actions" backdrop={true} closeByBackdropClick={true}>
                     <ActionsGroup>
diff --git a/apps/spreadsheeteditor/mobile/src/view/settings/Settings.jsx b/apps/spreadsheeteditor/mobile/src/view/settings/Settings.jsx
index 3fa8009e5..6d3793350 100644
--- a/apps/spreadsheeteditor/mobile/src/view/settings/Settings.jsx
+++ b/apps/spreadsheeteditor/mobile/src/view/settings/Settings.jsx
@@ -1,8 +1,9 @@
 import React, {Component, useEffect} from 'react';
 import {View,Page,Navbar,NavRight,Link,Popup,Popover,Icon,ListItem,List} from 'framework7-react';
-import { withTranslation } from 'react-i18next';
+import { useTranslation } from 'react-i18next';
 import {f7} from 'framework7-react';
 import {Device} from '../../../../../common/mobile/utils/device';
+import { observer, inject } from "mobx-react";
 import SpreadsheetSettingsController from '../../controller/settings/SpreadsheetSettings.jsx';
 import ApplicationSettingsController from '../../controller/settings/ApplicationSettings.jsx';
 import SpreadsheetInfoController from '../../controller/settings/SpreadsheetInfo.jsx';
@@ -64,8 +65,8 @@ const routes = [
 ];
 
 
-const SettingsList = withTranslation()(props => {
-    const {t} = props;
+const SettingsList = inject("storeAppOptions")(observer(props => {
+    const { t } = useTranslation();
     const _t = t('View.Settings', {returnObjects: true});
     const navbar = <Navbar title={_t.textSettings}>
         {!props.inPopover  && <NavRight><Link popupClose=".settings-popup">{_t.textDone}</Link></NavRight>}
@@ -115,14 +116,20 @@ const SettingsList = withTranslation()(props => {
         window.open(url, "_blank");
     };
 
+    const appOptions = props.storeAppOptions;
+    let _isEdit = false;
 
+    if (!appOptions.isDisconnected) {
+        _isEdit = appOptions.isEdit;
+    } 
+    
     return (
         <View style={props.style} stackPages={true} routes={routes}>
             <Page>
                 {navbar}
                 <List>
                     {!props.inPopover &&
-                        <ListItem title={_t.textFindAndReplace} link="#" searchbarEnable='.searchbar' onClick={closeModal} className='no-indicator'>
+                        <ListItem disabled={appOptions.readerMode ? true : false} title={!_isEdit ? _t.textFind : _t.textFindAndReplace} link="#" searchbarEnable='.searchbar' onClick={closeModal} className='no-indicator'>
                             <Icon slot="media" icon="icon-search"></Icon>
                         </ListItem>
                     }
@@ -156,7 +163,7 @@ const SettingsList = withTranslation()(props => {
             </Page>
         </View>
     )
-});
+}));
 
 class SettingsView extends Component {
     constructor(props) {

From bafa7f968863614a32122f7d31e105724a4498df Mon Sep 17 00:00:00 2001
From: JuliaSvinareva <Julia.Svinaryova@onlyoffice.com>
Date: Fri, 11 Jun 2021 15:12:28 +0300
Subject: [PATCH 30/86] [mobile] Fix bug 50823

---
 .../mobile/src/controller/LongActions.jsx     | 22 ++++++-------------
 .../src/controller/settings/Download.jsx      | 10 ++++-----
 .../mobile/src/controller/LongActions.jsx     | 20 +++++------------
 .../mobile/src/controller/Main.jsx            |  8 +++----
 .../mobile/src/controller/LongActions.jsx     | 20 +++++------------
 .../mobile/src/controller/Main.jsx            |  2 +-
 .../src/controller/settings/Download.jsx      | 21 +++++++++---------
 7 files changed, 40 insertions(+), 63 deletions(-)

diff --git a/apps/documenteditor/mobile/src/controller/LongActions.jsx b/apps/documenteditor/mobile/src/controller/LongActions.jsx
index da831fd29..7d5a4f200 100644
--- a/apps/documenteditor/mobile/src/controller/LongActions.jsx
+++ b/apps/documenteditor/mobile/src/controller/LongActions.jsx
@@ -39,11 +39,7 @@ const LongActionsController = () => {
             api.asc_unregisterCallback('asc_onEndAction', onLongActionEnd);
             api.asc_unregisterCallback('asc_onOpenDocumentProgress', onOpenDocument);
 
-            Common.Notifications.off('preloader:endAction', (type, id) => {
-                if (stackLongActions.exist({id: id, type: type})) {
-                    onLongActionEnd(type, id);
-                }
-            });
+            Common.Notifications.off('preloader:endAction', onLongActionEnd);
             Common.Notifications.off('preloader:beginAction', onLongActionBegin);
             Common.Notifications.off('preloader:close', closePreloader);
         })
@@ -55,22 +51,18 @@ const LongActionsController = () => {
         setLongActionView(action);
     };
 
-    const onLongActionEnd = (type, id) => {
+    const onLongActionEnd = (type, id, forceClose) => {
+        if (!stackLongActions.exist({id: id, type: type})) return;
+
         let action = {id: id, type: type};
         stackLongActions.pop(action);
 
         //this.updateWindowTitle(true);
 
-        action = stackLongActions.get({type: Asc.c_oAscAsyncActionType.Information});
+        action = stackLongActions.get({type: Asc.c_oAscAsyncActionType.Information}) || stackLongActions.get({type: Asc.c_oAscAsyncActionType.BlockInteraction});
 
-        if (action) {
-            setLongActionView(action)
-        }
-
-        action = stackLongActions.get({type: Asc.c_oAscAsyncActionType.BlockInteraction});
-
-        if (action) {
-            setLongActionView(action)
+        if (action && !forceClose) {
+            setLongActionView(action);
         } else {
             loadMask && loadMask.el && loadMask.el.classList.contains('modal-in') && f7.dialog.close(loadMask.el);
         }
diff --git a/apps/documenteditor/mobile/src/controller/settings/Download.jsx b/apps/documenteditor/mobile/src/controller/settings/Download.jsx
index 858dbfa65..aa5982539 100644
--- a/apps/documenteditor/mobile/src/controller/settings/Download.jsx
+++ b/apps/documenteditor/mobile/src/controller/settings/Download.jsx
@@ -70,7 +70,7 @@ const onAdvancedOptions = (type, advOptions, mode, formatOptions, _t, isDocReady
             pagesName.push(page.asc_getCodePageName());
         }
         Common.Notifications.trigger('preloader:close');
-        Common.Notifications.trigger('preloader:endAction', Asc.c_oAscAsyncActionType['BlockInteraction'], -256);
+        Common.Notifications.trigger('preloader:endAction', Asc.c_oAscAsyncActionType['BlockInteraction'], -256, true);
         const buttons = [];
         if (mode === 2) {
             buttons.push({
@@ -122,16 +122,16 @@ const onAdvancedOptions = (type, advOptions, mode, formatOptions, _t, isDocReady
         });
     } else if (type == Asc.c_oAscAdvancedOptionsID.DRM) {
         Common.Notifications.trigger('preloader:close');
-        // Common.Notifications.trigger('preloader:endAction', Asc.c_oAscAsyncActionType['BlockInteraction'], -256);
+        Common.Notifications.trigger('preloader:endAction', Asc.c_oAscAsyncActionType['BlockInteraction'], -256, true);
         const buttons = [{
             text: 'OK',
             bold: true,
             onClick: function () {
                 const password = document.getElementById('modal-password').value;
                 api.asc_setAdvancedOptions(type, new Asc.asc_CDRMAdvancedOptions(password));
-                // if (!isDocReady) {
-                //     Common.Notifications.trigger('preloader:beginAction', Asc.c_oAscAsyncActionType['BlockInteraction'], -256);
-                // }
+                if (!isDocReady) {
+                    Common.Notifications.trigger('preloader:beginAction', Asc.c_oAscAsyncActionType['BlockInteraction'], -256);
+                }
             }
         }];
         if (canRequestClose)
diff --git a/apps/presentationeditor/mobile/src/controller/LongActions.jsx b/apps/presentationeditor/mobile/src/controller/LongActions.jsx
index 18669369f..4ef67ab68 100644
--- a/apps/presentationeditor/mobile/src/controller/LongActions.jsx
+++ b/apps/presentationeditor/mobile/src/controller/LongActions.jsx
@@ -39,11 +39,7 @@ const LongActionsController = () => {
             api.asc_unregisterCallback('asc_onEndAction', onLongActionEnd);
             api.asc_unregisterCallback('asc_onOpenDocumentProgress', onOpenDocument);
 
-            Common.Notifications.off('preloader:endAction', (type, id) => {
-                if (stackLongActions.exist({id: id, type: type})) {
-                    onLongActionEnd(type, id);
-                }
-            });
+            Common.Notifications.off('preloader:endAction', onLongActionEnd);
             Common.Notifications.off('preloader:beginAction', onLongActionBegin);
             Common.Notifications.off('preloader:close', closePreloader);
         })
@@ -55,21 +51,17 @@ const LongActionsController = () => {
         setLongActionView(action);
     };
 
-    const onLongActionEnd = (type, id) => {
+    const onLongActionEnd = (type, id, forceClose) => {
+        if (!stackLongActions.exist({id: id, type: type})) return;
+
         let action = {id: id, type: type};
         stackLongActions.pop(action);
 
         //this.updateWindowTitle(true);
 
-        action = stackLongActions.get({type: Asc.c_oAscAsyncActionType.Information});
+        action = stackLongActions.get({type: Asc.c_oAscAsyncActionType.Information}) || stackLongActions.get({type: Asc.c_oAscAsyncActionType.BlockInteraction});
 
-        if (action) {
-            setLongActionView(action)
-        }
-
-        action = stackLongActions.get({type: Asc.c_oAscAsyncActionType.BlockInteraction});
-
-        if (action) {
+        if (action && !forceClose) {
             setLongActionView(action)
         } else {
             loadMask && loadMask.el && loadMask.el.classList.contains('modal-in') && f7.dialog.close(loadMask.el);
diff --git a/apps/presentationeditor/mobile/src/controller/Main.jsx b/apps/presentationeditor/mobile/src/controller/Main.jsx
index c2b883528..6210b4bf6 100644
--- a/apps/presentationeditor/mobile/src/controller/Main.jsx
+++ b/apps/presentationeditor/mobile/src/controller/Main.jsx
@@ -590,7 +590,7 @@ class MainController extends Component {
 
         if (type == Asc.c_oAscAdvancedOptionsID.DRM) {
             Common.Notifications.trigger('preloader:close');
-            // Common.Notifications.trigger('preloader:endAction', Asc.c_oAscAsyncActionType['BlockInteraction'], this.LoadingDocument);
+            Common.Notifications.trigger('preloader:endAction', Asc.c_oAscAsyncActionType['BlockInteraction'], this.LoadingDocument, true);
 
             const buttons = [{
                 text: 'OK',
@@ -599,9 +599,9 @@ class MainController extends Component {
                     const password = document.getElementById('modal-password').value;
                     this.api.asc_setAdvancedOptions(type, new Asc.asc_CDRMAdvancedOptions(password));
 
-                    // if (!this._isDocReady) {
-                    //     Common.Notifications.trigger('preloader:beginAction', Asc.c_oAscAsyncActionType['BlockInteraction'], this.LoadingDocument);
-                    // }
+                    if (!this._isDocReady) {
+                        Common.Notifications.trigger('preloader:beginAction', Asc.c_oAscAsyncActionType['BlockInteraction'], this.LoadingDocument);
+                    }
                 }
             }];
             if (this.props.storeAppOptions.canRequestClose)
diff --git a/apps/spreadsheeteditor/mobile/src/controller/LongActions.jsx b/apps/spreadsheeteditor/mobile/src/controller/LongActions.jsx
index b4dda7b72..adba817b8 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/LongActions.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/LongActions.jsx
@@ -41,11 +41,7 @@ const LongActionsController = () => {
             api.asc_unregisterCallback('asc_onOpenDocumentProgress', onOpenDocument);
             api.asc_unregisterCallback('asc_onConfirmAction', onConfirmAction);
 
-            Common.Notifications.off('preloader:endAction', (type, id) => {
-                if (stackLongActions.exist({id: id, type: type})) {
-                    onLongActionEnd(type, id);
-                }
-            });
+            Common.Notifications.off('preloader:endAction', onLongActionEnd);
             Common.Notifications.off('preloader:beginAction', onLongActionBegin);
             Common.Notifications.off('preloader:close', closePreloader);
         })
@@ -57,21 +53,17 @@ const LongActionsController = () => {
         setLongActionView(action);
     };
 
-    const onLongActionEnd = (type, id) => {
+    const onLongActionEnd = (type, id, forceClose) => {
+        if (!stackLongActions.exist({id: id, type: type})) return;
+
         let action = {id: id, type: type};
         stackLongActions.pop(action);
 
         //this.updateWindowTitle(true);
 
-        action = stackLongActions.get({type: Asc.c_oAscAsyncActionType.Information});
+        action = stackLongActions.get({type: Asc.c_oAscAsyncActionType.Information}) || stackLongActions.get({type: Asc.c_oAscAsyncActionType.BlockInteraction});
 
-        if (action) {
-            setLongActionView(action)
-        }
-
-        action = stackLongActions.get({type: Asc.c_oAscAsyncActionType.BlockInteraction});
-
-        if (action) {
+        if (action && !forceClose) {
             setLongActionView(action)
         } else {
             loadMask && loadMask.el && loadMask.el.classList.contains('modal-in') && f7.dialog.close(loadMask.el);
diff --git a/apps/spreadsheeteditor/mobile/src/controller/Main.jsx b/apps/spreadsheeteditor/mobile/src/controller/Main.jsx
index f96ca6aef..f23dd952d 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/Main.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/Main.jsx
@@ -323,7 +323,7 @@ class MainController extends Component {
         this.api.asc_registerCallback('asc_onAdvancedOptions', (type, advOptions, mode, formatOptions) => {
             const {t} = this.props;
             const _t = t("View.Settings", { returnObjects: true });
-            onAdvancedOptions(type, advOptions, mode, formatOptions, _t, this.props.storeAppOptions.canRequestClose);
+            onAdvancedOptions(type, advOptions, mode, formatOptions, _t, this._isDocReady, this.props.storeAppOptions.canRequestClose);
         });
 
     }
diff --git a/apps/spreadsheeteditor/mobile/src/controller/settings/Download.jsx b/apps/spreadsheeteditor/mobile/src/controller/settings/Download.jsx
index ac3829d56..320a6e650 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/settings/Download.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/settings/Download.jsx
@@ -21,7 +21,7 @@ class DownloadController extends Component {
                     _t.warnDownloadAs,
                     _t.notcriticalErrorTitle,
                     function () {
-                        onAdvancedOptions(Asc.c_oAscAdvancedOptionsID.CSV, api.asc_getAdvancedOptions(), 2, new Asc.asc_CDownloadOptions(format), _t)
+                        onAdvancedOptions(Asc.c_oAscAdvancedOptionsID.CSV, api.asc_getAdvancedOptions(), 2, new Asc.asc_CDownloadOptions(format), _t, true);
                     }
                 )
             } else {
@@ -39,7 +39,7 @@ class DownloadController extends Component {
 
 const DownloadWithTranslation = withTranslation()(DownloadController);
 
-const onAdvancedOptions = (type, advOptions, mode, formatOptions, _t, canRequestClose) => {
+const onAdvancedOptions = (type, advOptions, mode, formatOptions, _t, isDocReady, canRequestClose) => {
     const api = Common.EditorApi.get();
 
     if (type == Asc.c_oAscAdvancedOptionsID.CSV) {
@@ -52,7 +52,8 @@ const onAdvancedOptions = (type, advOptions, mode, formatOptions, _t, canRequest
             pagesName.push(page.asc_getCodePageName());
         }
 
-        // me.onLongActionEnd(Asc.c_oAscAsyncActionType.BlockInteraction, LoadingDocument);
+        Common.Notifications.trigger('preloader:close');
+        Common.Notifications.trigger('preloader:endAction', Asc.c_oAscAsyncActionType['BlockInteraction'], -256, true);
 
         const buttons = [];
 
@@ -76,9 +77,9 @@ const onAdvancedOptions = (type, advOptions, mode, formatOptions, _t, canRequest
                     api.asc_setAdvancedOptions(type, new Asc.asc_CTextOptions(encoding, delimiter));
                 }
 
-                //if (!me._isDocReady) {
-                        //me.onLongActionBegin(Asc.c_oAscAsyncActionType['BlockInteraction'], LoadingDocument);
-                //}
+                if (!isDocReady) {
+                    Common.Notifications.trigger('preloader:beginAction', Asc.c_oAscAsyncActionType['BlockInteraction'], -256);
+                }
             }
         });
 
@@ -122,16 +123,16 @@ const onAdvancedOptions = (type, advOptions, mode, formatOptions, _t, canRequest
 
     } else if (type == Asc.c_oAscAdvancedOptionsID.DRM) {
         Common.Notifications.trigger('preloader:close');
-        //me.onLongActionEnd(Asc.c_oAscAsyncActionType.BlockInteraction, LoadingDocument);
+        Common.Notifications.trigger('preloader:endAction', Asc.c_oAscAsyncActionType['BlockInteraction'], -256, true);
         const buttons = [{
             text: 'OK',
             bold: true,
             onClick: function () {
                 const password = document.getElementById('modal-password').value;
                 api.asc_setAdvancedOptions(type, new Asc.asc_CDRMAdvancedOptions(password));
-                //if (!me._isDocReady) {
-                    //me.onLongActionBegin(Asc.c_oAscAsyncActionType['BlockInteraction'], LoadingDocument);
-                //}
+                if (!isDocReady) {
+                    Common.Notifications.trigger('preloader:beginAction', Asc.c_oAscAsyncActionType['BlockInteraction'], -256);
+                }
             }
         }];
 

From 0b2cb9f13dc454865a2fdac09b96a288324f24cd Mon Sep 17 00:00:00 2001
From: JuliaSvinareva <Julia.Svinaryova@onlyoffice.com>
Date: Fri, 11 Jun 2021 16:15:57 +0300
Subject: [PATCH 31/86] [SSE mobile] Fix bug 50824

---
 .../controller/settings/SpreadsheetInfo.jsx   | 36 ++++++++++---------
 .../src/view/settings/SpreadsheetInfo.jsx     |  8 ++---
 2 files changed, 24 insertions(+), 20 deletions(-)

diff --git a/apps/spreadsheeteditor/mobile/src/controller/settings/SpreadsheetInfo.jsx b/apps/spreadsheeteditor/mobile/src/controller/settings/SpreadsheetInfo.jsx
index 238036bcd..a3325b307 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/settings/SpreadsheetInfo.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/settings/SpreadsheetInfo.jsx
@@ -6,13 +6,17 @@ class SpreadsheetInfoController extends Component {
     constructor(props) {
         super(props);
         this.docProps = this.getDocProps();
-        this.getModified = this.getModified();
-        this.getModifiedBy = this.getModifiedBy();
-        this.getCreators = this.getCreators();
-        this.title = this.getTitle();
-        this.subject = this.getSubject();
-        this.description = this.getDescription();
-        this.getCreated = this.getCreated();
+        if (this.docProps) {
+            this.dataApp = this.getAppProps();
+            this.modified = this.getModified();
+            this.modifiedBy = this.getModifiedBy();
+            this.creators = this.getCreators();
+            this.title = this.getTitle();
+            this.subject = this.getSubject();
+            this.description = this.getDescription();
+            this.created = this.getCreated();
+
+        }
     }
 
     getDocProps() {
@@ -23,7 +27,6 @@ class SpreadsheetInfoController extends Component {
     getAppProps() {
         const api = Common.EditorApi.get();
         const appProps = api.asc_getAppProps();
-
         if (appProps) {
             let appName =
                 (appProps.asc_getApplication() || "") +
@@ -31,12 +34,12 @@ class SpreadsheetInfoController extends Component {
                 (appProps.asc_getAppVersion() || "");
             return appName;
         }
+        return null;
     }
 
     getModified() {
         let valueModified = this.docProps.asc_getModified();
         const _lang = this.props.storeAppOptions.lang;
-
         if (valueModified) {
             return (
                 valueModified.toLocaleString(_lang, {
@@ -48,14 +51,15 @@ class SpreadsheetInfoController extends Component {
                 valueModified.toLocaleTimeString(_lang, { timeStyle: "short" })
             );
         }
+        return null;
     }
 
     getModifiedBy() {
         let valueModifiedBy = this.docProps.asc_getLastModifiedBy();
-
         if (valueModifiedBy) {
             return Common.Utils.UserInfoParser.getParsedName(valueModifiedBy);
         }
+        return null;
     }
 
     getCreators() {
@@ -77,20 +81,20 @@ class SpreadsheetInfoController extends Component {
     getCreated() {
         let value = this.docProps.asc_getCreated();
         const _lang = this.props.storeAppOptions.lang;
-
         if(value) {
             return value.toLocaleString(_lang, {year: 'numeric', month: '2-digit', day: '2-digit'}) + ' ' + value.toLocaleTimeString(_lang, {timeStyle: 'short'});
         }
+        return null;
     }
 
     render() {
         return (
             <SpreadsheetInfo
-                getAppProps={this.getAppProps}
-                getModified={this.getModified}
-                getModifiedBy={this.getModifiedBy}
-                getCreators={this.getCreators}
-                getCreated={this.getCreated}
+                dataApp={this.dataApp}
+                modified={this.modified}
+                modifiedBy={this.modifiedBy}
+                creators={this.creators}
+                created={this.created}
                 title={this.title}
                 subject={this.subject}
                 description={this.description}
diff --git a/apps/spreadsheeteditor/mobile/src/view/settings/SpreadsheetInfo.jsx b/apps/spreadsheeteditor/mobile/src/view/settings/SpreadsheetInfo.jsx
index 294e5ac43..8cd420b90 100644
--- a/apps/spreadsheeteditor/mobile/src/view/settings/SpreadsheetInfo.jsx
+++ b/apps/spreadsheeteditor/mobile/src/view/settings/SpreadsheetInfo.jsx
@@ -7,11 +7,11 @@ const PageSpreadsheetInfo = (props) => {
     const { t } = useTranslation();
     const _t = t("View.Settings", { returnObjects: true });
     const storeSpreadsheetInfo = props.storeSpreadsheetInfo;
-    const dataApp = props.getAppProps();
-    const dataModified = props.getModified;
-    const dataModifiedBy = props.getModifiedBy;
-    const creators = props.getCreators;
     const dataDoc = storeSpreadsheetInfo.dataDoc;
+    const dataApp = props.dataApp;
+    const dataModified = props.modified;
+    const dataModifiedBy = props.modifiedBy;
+    const creators = props.creators;
   
     return (
         <Page>

From 571768c1ffe5540e584cbc5f806f6b44d135170c Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Fri, 11 Jun 2021 17:20:32 +0300
Subject: [PATCH 32/86] [DE PE SSE mobile] Bug 47148

---
 apps/documenteditor/mobile/src/store/textSettings.js     | 5 +++++
 apps/presentationeditor/mobile/src/store/textSettings.js | 5 +++++
 apps/spreadsheeteditor/mobile/src/store/cellSettings.js  | 4 ++++
 apps/spreadsheeteditor/mobile/src/store/textSettings.js  | 4 ++++
 4 files changed, 18 insertions(+)

diff --git a/apps/documenteditor/mobile/src/store/textSettings.js b/apps/documenteditor/mobile/src/store/textSettings.js
index 9f3efa926..b1bd8dc06 100644
--- a/apps/documenteditor/mobile/src/store/textSettings.js
+++ b/apps/documenteditor/mobile/src/store/textSettings.js
@@ -71,6 +71,11 @@ export class storeTextSettings {
                 type        : font.asc_getFontType()
             });
         }
+
+        array.sort(function(a, b) {
+            return (a.name.toLowerCase() > b.name.toLowerCase()) ? 1 : -1;
+        });
+
         this.fontsArray = array;
     }
     resetFontName (font) {
diff --git a/apps/presentationeditor/mobile/src/store/textSettings.js b/apps/presentationeditor/mobile/src/store/textSettings.js
index 7f4b50f26..524a26b15 100644
--- a/apps/presentationeditor/mobile/src/store/textSettings.js
+++ b/apps/presentationeditor/mobile/src/store/textSettings.js
@@ -75,6 +75,11 @@ export class storeTextSettings {
                 type        : font.asc_getFontType()
             });
         }
+
+        array.sort(function(a, b) {
+            return (a.name.toLowerCase() > b.name.toLowerCase()) ? 1 : -1;
+        });
+
         this.fontsArray = array;
     }
 
diff --git a/apps/spreadsheeteditor/mobile/src/store/cellSettings.js b/apps/spreadsheeteditor/mobile/src/store/cellSettings.js
index f4b7e4e81..838aefe52 100644
--- a/apps/spreadsheeteditor/mobile/src/store/cellSettings.js
+++ b/apps/spreadsheeteditor/mobile/src/store/cellSettings.js
@@ -140,6 +140,10 @@ export class storeCellSettings {
             });
         }
 
+        array.sort(function(a, b) {
+            return (a.name.toLowerCase() > b.name.toLowerCase()) ? 1 : -1;
+        });
+
         this.fontsArray = array;
     }
 
diff --git a/apps/spreadsheeteditor/mobile/src/store/textSettings.js b/apps/spreadsheeteditor/mobile/src/store/textSettings.js
index 38dc619da..e9b3e5e6d 100644
--- a/apps/spreadsheeteditor/mobile/src/store/textSettings.js
+++ b/apps/spreadsheeteditor/mobile/src/store/textSettings.js
@@ -74,6 +74,10 @@ export class storeTextSettings {
             });
         }
 
+        array.sort(function(a, b) {
+            return (a.name.toLowerCase() > b.name.toLowerCase()) ? 1 : -1;
+        });
+
         this.fontsArray = array;
     }
 

From 3ab7e17ef80be831354b63a02098cd5060ac984c Mon Sep 17 00:00:00 2001
From: ShimaginAndrey <andrey.shimagin@onlyoffice.com>
Date: Tue, 15 Jun 2021 16:11:17 +0300
Subject: [PATCH 33/86] Fix Bug 50776

---
 apps/documenteditor/mobile/src/controller/Error.jsx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/apps/documenteditor/mobile/src/controller/Error.jsx b/apps/documenteditor/mobile/src/controller/Error.jsx
index 21b8d35e4..647fde4a9 100644
--- a/apps/documenteditor/mobile/src/controller/Error.jsx
+++ b/apps/documenteditor/mobile/src/controller/Error.jsx
@@ -204,8 +204,8 @@ const ErrorController = inject('storeAppOptions')(({storeAppOptions, LoadingDocu
                 if (id === Asc.c_oAscError.ID.Warning && btn === 'ok' && (storeAppOptions.canDownload || storeAppOptions.canDownloadOrigin)) {
                     api.asc_DownloadOrigin();
                 } else if(id === Asc.c_oAscError.ID.SplitCellMaxRows ||
-                                 Asc.c_oAscError.ID.SplitCellMaxCols ||
-                                 Asc.c_oAscError.ID.SplitCellRowsDivider && btn === 'ok' && (storeAppOptions.canDownload || storeAppOptions.canDownloadOrigin)) {
+                            id === Asc.c_oAscError.ID.SplitCellMaxCols ||
+                            id === Asc.c_oAscError.ID.SplitCellRowsDivider) {
                         Common.Notifications.trigger('showSplitModal',true);
                 }
                 storeAppOptions.changeEditingRights(false);

From d2c7b5dfe828d94f72028d67fb0f371cbcf8204d Mon Sep 17 00:00:00 2001
From: ShimaginAndrey <andrey.shimagin@onlyoffice.com>
Date: Tue, 15 Jun 2021 16:12:16 +0300
Subject: [PATCH 34/86] Fix Bug 50802

---
 apps/common/mobile/resources/less/comments.less | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/apps/common/mobile/resources/less/comments.less b/apps/common/mobile/resources/less/comments.less
index 26b52eeff..4067b7a57 100644
--- a/apps/common/mobile/resources/less/comments.less
+++ b/apps/common/mobile/resources/less/comments.less
@@ -212,6 +212,8 @@
 
 .dialog.modal-in {
   z-index: 14000;
+  max-height: 100%;
+  overflow: auto;
 }
 
 .dialog-backdrop.backdrop-in {

From 237d03ea5759292372f960fcfbcc78b32fcb43e9 Mon Sep 17 00:00:00 2001
From: ShimaginAndrey <andrey.shimagin@onlyoffice.com>
Date: Tue, 15 Jun 2021 16:14:02 +0300
Subject: [PATCH 35/86] Fix Bug 50831

---
 apps/documenteditor/mobile/locale/en.json     | 6 ++----
 apps/presentationeditor/mobile/locale/en.json | 8 +++-----
 2 files changed, 5 insertions(+), 9 deletions(-)

diff --git a/apps/documenteditor/mobile/locale/en.json b/apps/documenteditor/mobile/locale/en.json
index 464648cc9..441904234 100644
--- a/apps/documenteditor/mobile/locale/en.json
+++ b/apps/documenteditor/mobile/locale/en.json
@@ -1,5 +1,5 @@
 {
-  "Main" : {
+  "Main": {
     "SDK": {
       "Series": "Series",
       "Diagram Title": "Chart Title",
@@ -47,12 +47,10 @@
     "textPaidFeature": "Paid feature",
     "textCustomLoader": "Please note that according to the terms of the license you are not entitled to change the loader. Please contact our Sales Department to get a quote.",
     "textClose": "Close",
-
     "errorProcessSaveResult": "Saving is failed.",
     "criticalErrorTitle": "Error",
     "warnProcessRightsChange": "You have been denied the right to edit the file.",
     "errorAccessDeny": "You are trying to perform an action you do not have rights for.<br>Please contact your Document Server administrator.",
-
     "errorUpdateVersion": "The file version has been changed. The page will be reloaded.",
     "titleUpdateVersion": "Version changed",
     "textHasMacros": "The file contains automatic macros.<br>Do you want to run macros?",
@@ -468,7 +466,7 @@
     "textCancel": "Cancel",
     "textPictureFromLibrary": "Picture from Library",
     "textPictureFromURL": "Picture from URL",
-    "textLinkSettings": "LinkSettings",
+    "textLinkSettings": "Link Settings",
     "textBack": "Back",
     "textEmptyImgUrl": "You need to specify image URL.",
     "txtNotUrl": "This field should be a URL in the format \"http://www.example.com\"",
diff --git a/apps/presentationeditor/mobile/locale/en.json b/apps/presentationeditor/mobile/locale/en.json
index 7bcd5c37c..c7de2720b 100644
--- a/apps/presentationeditor/mobile/locale/en.json
+++ b/apps/presentationeditor/mobile/locale/en.json
@@ -1,6 +1,6 @@
 {
-  "Controller" : {
-    "Main" : {
+  "Controller": {
+    "Main": {
       "SDK": {
         "Series": "Series",
         "Diagram Title": "Chart Title",
@@ -48,12 +48,10 @@
       "textPaidFeature": "Paid feature",
       "textCustomLoader": "Please note that according to the terms of the license you are not entitled to change the loader. Please contact our Sales Department to get a quote.",
       "textClose": "Close",
-
       "errorProcessSaveResult": "Saving is failed.",
       "criticalErrorTitle": "Error",
       "warnProcessRightsChange": "You have been denied the right to edit the file.",
       "errorAccessDeny": "You are trying to perform an action you do not have rights for.<br>Please contact your Document Server administrator.",
-
       "errorUpdateVersion": "The file version has been changed. The page will be reloaded.",
       "titleUpdateVersion": "Version changed",
       "textHasMacros": "The file contains automatic macros.<br>Do you want to run macros?",
@@ -219,7 +217,7 @@
       "textOther": "Other",
       "textPictureFromLibrary": "Picture from Library",
       "textPictureFromURL": "Picture from URL",
-      "textLinkSettings": "LinkSettings",
+      "textLinkSettings": "Link Settings",
       "textBack": "Back",
       "textEmptyImgUrl": "You need to specify image URL.",
       "txtNotUrl": "This field should be a URL in the format \"http://www.example.com\"",

From 0022202b4dcc95f36b65fab0c4e370b7d4f749f5 Mon Sep 17 00:00:00 2001
From: ShimaginAndrey <andrey.shimagin@onlyoffice.com>
Date: Tue, 15 Jun 2021 16:22:38 +0300
Subject: [PATCH 36/86] Fix Bug 48109

---
 .../mobile/src/view/add/Add.jsx               | 18 ++++---
 .../mobile/src/view/add/AddOther.jsx          | 51 +++++++++++--------
 2 files changed, 42 insertions(+), 27 deletions(-)

diff --git a/apps/documenteditor/mobile/src/view/add/Add.jsx b/apps/documenteditor/mobile/src/view/add/Add.jsx
index 7e490ea58..c09a2690a 100644
--- a/apps/documenteditor/mobile/src/view/add/Add.jsx
+++ b/apps/documenteditor/mobile/src/view/add/Add.jsx
@@ -76,30 +76,36 @@ const AddLayoutContent = ({ tabs }) => {
     )
 };
 
-const AddTabs = props => {
+const AddTabs = inject("storeFocusObjects")(observer(({storeFocusObjects, showPanels, style, inPopover}) => {
     const { t } = useTranslation();
     const _t = t('Add', {returnObjects: true});
-    const showPanels = props.showPanels;
     const tabs = [];
-    if (!showPanels) {
+    const options = storeFocusObjects.settings;
+    if (!showPanels && options.indexOf('text') > -1) {
         tabs.push({
             caption: _t.textTable,
             id: 'add-table',
             icon: 'icon-add-table',
             component: <AddTableController/>
         });
+    }
+    if(!showPanels) {
         tabs.push({
             caption: _t.textShape,
             id: 'add-shape',
             icon: 'icon-add-shape',
             component: <AddShapeController/>
         });
+    }
+    if(!showPanels) {
         tabs.push({
             caption: _t.textImage,
             id: 'add-image',
             icon: 'icon-add-image',
             component: <AddImageController/>
         });
+    }
+    if(!showPanels) {
         tabs.push({
             caption: _t.textOther,
             id: 'add-other',
@@ -115,14 +121,14 @@ const AddTabs = props => {
         });
     }
     return (
-        <View style={props.style} stackPages={true} routes={routes}>
+        <View style={style} stackPages={true} routes={routes}>
             <Page pageContent={false}>
-                <AddLayoutNavbar tabs={tabs} inPopover={props.inPopover}/>
+                <AddLayoutNavbar tabs={tabs} inPopover={inPopover}/>
                 <AddLayoutContent tabs={tabs} />
             </Page>
         </View>
     )
-};
+}));
 
 class AddView extends Component {
     constructor(props) {
diff --git a/apps/documenteditor/mobile/src/view/add/AddOther.jsx b/apps/documenteditor/mobile/src/view/add/AddOther.jsx
index f32b48ae0..687bb0c07 100644
--- a/apps/documenteditor/mobile/src/view/add/AddOther.jsx
+++ b/apps/documenteditor/mobile/src/view/add/AddOther.jsx
@@ -153,46 +153,55 @@ const PageFootnote = props => {
 const AddOther = props => {
     const { t } = useTranslation();
     const _t = t('Add', {returnObjects: true});
+
+    const storeFocusObjects = props.storeFocusObjects;
+    let isShape = storeFocusObjects.settings.indexOf('shape') > -1,
+        isText = storeFocusObjects.settings.indexOf('text') > -1,
+        isChart = storeFocusObjects.settings.indexOf('chart') > -1;
+
     return (
         <List>
-            <ListItem title={_t.textComment} onClick={() => {
+            {isText &&<ListItem title={_t.textComment} onClick={() => {
                 props.closeModal();
                 Common.Notifications.trigger('addcomment');
             }}>
                 <Icon slot="media" icon="icon-insert-comment"></Icon>
-            </ListItem>
-            <ListItem title={_t.textLink} link={'/add-link/'} routeProps={{
+            </ListItem>}
+            {isText && <ListItem title={_t.textLink} link={'/add-link/'} routeProps={{
                 onInsertLink: props.onInsertLink,
                 getDisplayLinkText: props.getDisplayLinkText
             }}>
                 <Icon slot="media" icon="icon-link"></Icon>
-            </ListItem>
+            </ListItem>}
             <ListItem title={_t.textPageNumber} link={'/add-page-number/'} routeProps={{
                 onInsertPageNumber: props.onInsertPageNumber
             }}>
                 <Icon slot="media" icon="icon-pagenumber"></Icon>
             </ListItem>
-            <ListItem title={_t.textBreak} link={'/add-break/'} routeProps={{
-                onPageBreak: props.onPageBreak,
-                onColumnBreak: props.onColumnBreak,
-                onInsertSectionBreak: props.onInsertSectionBreak
-            }}>
-                <Icon slot="media" icon="icon-sectionbreak"></Icon>
-            </ListItem>
-            <ListItem title={_t.textFootnote} link={'/add-footnote/'} routeProps={{
-                getFootnoteProps: props.getFootnoteProps,
-                getFootnoteStartAt: props.getFootnoteStartAt,
-                onFootnoteStartAt: props.onFootnoteStartAt,
-                onInsertFootnote: props.onInsertFootnote,
-                initFootnoteStartAt: props.initFootnoteStartAt
-            }}>
-                <Icon slot="media" icon="icon-footnote"></Icon>
-            </ListItem>
+            {(isShape || isChart) ? null :
+                <ListItem title={_t.textBreak} link={'/add-break/'} routeProps={{
+                    onPageBreak: props.onPageBreak,
+                    onColumnBreak: props.onColumnBreak,
+                    onInsertSectionBreak: props.onInsertSectionBreak
+                }}>
+                    <Icon slot="media" icon="icon-sectionbreak"></Icon>
+                </ListItem>
+            }
+            {(isShape || isChart) ? null : 
+                <ListItem title={_t.textFootnote} link={'/add-footnote/'} routeProps={{
+                    getFootnoteProps: props.getFootnoteProps,
+                    getFootnoteStartAt: props.getFootnoteStartAt,
+                    onFootnoteStartAt: props.onFootnoteStartAt,
+                    onInsertFootnote: props.onInsertFootnote,
+                    initFootnoteStartAt: props.initFootnoteStartAt
+                }}>
+                    <Icon slot="media" icon="icon-footnote"></Icon>
+                </ListItem>}
         </List>
     )
 };
 
-const AddOtherContainer = inject("storeComments")(observer(AddOther));
+const AddOtherContainer = inject("storeComments","storeFocusObjects")(observer(AddOther));
 
 export {AddOtherContainer as AddOther,
         PageNumber as PageAddNumber,

From 84b722a49a5005648d04bb1c5263430b1c75618b Mon Sep 17 00:00:00 2001
From: Maxim Kadushkin <maxim.kadushkin@onlyoffice.com>
Date: Tue, 15 Jun 2021 17:55:25 +0300
Subject: [PATCH 37/86] [SSE mobile] fix bug 50785

---
 build/spreadsheeteditor.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build/spreadsheeteditor.json b/build/spreadsheeteditor.json
index d4270756a..e210e924b 100644
--- a/build/spreadsheeteditor.json
+++ b/build/spreadsheeteditor.json
@@ -378,7 +378,7 @@
                 {
                     "expand": true,
                     "cwd": "../apps/spreadsheeteditor/mobile/locale/",
-                    "src": "*",
+                    "src": "**/*",
                     "dest": "../deploy/web-apps/apps/spreadsheeteditor/mobile/locale/"
                 },
                 {

From e3b52d0bcb2be327b0f08a32b4c6d37690f19654 Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Wed, 16 Jun 2021 19:14:58 +0300
Subject: [PATCH 38/86] [DE PE SSE mobile] Fix Bug 50778

---
 apps/documenteditor/mobile/locale/en.json     | 2 +-
 apps/presentationeditor/mobile/locale/en.json | 2 +-
 apps/spreadsheeteditor/mobile/locale/en.json  | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/apps/documenteditor/mobile/locale/en.json b/apps/documenteditor/mobile/locale/en.json
index 464648cc9..e1d8253ba 100644
--- a/apps/documenteditor/mobile/locale/en.json
+++ b/apps/documenteditor/mobile/locale/en.json
@@ -136,7 +136,7 @@
   },
   "Toolbar": {
     "dlgLeaveTitleText": "You leave the application",
-    "dlgLeaveMsgText": "You have unsaved changes in this document. Click \\'Stay on this Page\\' to await the autosave of the document. Click \\'Leave this Page\\' to discard all the unsaved changes.",
+    "dlgLeaveMsgText": "You have unsaved changes in this document. Click 'Stay on this Page' to await the autosave of the document. Click 'Leave this Page' to discard all the unsaved changes.",
     "leaveButtonText": "Leave this Page",
     "stayButtonText": "Stay on this Page"
   },
diff --git a/apps/presentationeditor/mobile/locale/en.json b/apps/presentationeditor/mobile/locale/en.json
index 7bcd5c37c..dd6dc5c95 100644
--- a/apps/presentationeditor/mobile/locale/en.json
+++ b/apps/presentationeditor/mobile/locale/en.json
@@ -150,7 +150,7 @@
   },
   "Toolbar": {
     "dlgLeaveTitleText": "You leave the application",
-    "dlgLeaveMsgText": "You have unsaved changes in this document. Click \\'Stay on this Page\\' to await the autosave of the document. Click \\'Leave this Page\\' to discard all the unsaved changes.",
+    "dlgLeaveMsgText": "You have unsaved changes in this document. Click 'Stay on this Page' to await the autosave of the document. Click 'Leave this Page' to discard all the unsaved changes.",
     "leaveButtonText": "Leave this Page",
     "stayButtonText": "Stay on this Page"
   },
diff --git a/apps/spreadsheeteditor/mobile/locale/en.json b/apps/spreadsheeteditor/mobile/locale/en.json
index 8c9a6f6b0..56819cc2f 100644
--- a/apps/spreadsheeteditor/mobile/locale/en.json
+++ b/apps/spreadsheeteditor/mobile/locale/en.json
@@ -193,7 +193,7 @@
     },
     "Toolbar": {
         "dlgLeaveTitleText": "You leave the application",
-        "dlgLeaveMsgText": "You have unsaved changes in this document. Click \\'Stay on this Page\\' to await the autosave of the document. Click \\'Leave this Page\\' to discard all the unsaved changes.",
+        "dlgLeaveMsgText": "You have unsaved changes in this document. Click 'Stay on this Page' to await the autosave of the document. Click 'Leave this Page' to discard all the unsaved changes.",
         "leaveButtonText": "Leave this Page",
         "stayButtonText": "Stay on this Page"
     },

From 6c9ad6286139c2a442f761a9bd7012a76ac0c572 Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Wed, 16 Jun 2021 19:20:59 +0300
Subject: [PATCH 39/86] [PE mobile] Fix Bug 50848

---
 apps/presentationeditor/mobile/src/view/edit/EditSlide.jsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apps/presentationeditor/mobile/src/view/edit/EditSlide.jsx b/apps/presentationeditor/mobile/src/view/edit/EditSlide.jsx
index 4557b9f72..2db973287 100644
--- a/apps/presentationeditor/mobile/src/view/edit/EditSlide.jsx
+++ b/apps/presentationeditor/mobile/src/view/edit/EditSlide.jsx
@@ -310,7 +310,7 @@ const PageTransition = props => {
                 </ListItem>
             </List>
             <List className="buttons-list">
-                <ListItem href="#" className="button button-raised button-fill" onClick={props.onApplyAll}>{_t.textApplyAll}</ListItem>
+                <ListButton className="button-fill button-raised" onClick={props.onApplyAll}>{_t.textApplyAll}</ListButton>
             </List>
         </Page>
     );

From f9a705efe0e8c6af87edf75c61c5c83332482a65 Mon Sep 17 00:00:00 2001
From: Maxim Kadushkin <maxim.kadushkin@onlyoffice.com>
Date: Wed, 16 Jun 2021 20:11:55 +0300
Subject: [PATCH 40/86] [desktop] send theme type to native app

---
 apps/common/main/lib/controller/Desktop.js | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/apps/common/main/lib/controller/Desktop.js b/apps/common/main/lib/controller/Desktop.js
index 0efe310ff..15367696b 100644
--- a/apps/common/main/lib/controller/Desktop.js
+++ b/apps/common/main/lib/controller/Desktop.js
@@ -246,7 +246,9 @@ define([
                         'modal:show': _onModalDialog.bind(this, 'open'),
                         'modal:close': _onModalDialog.bind(this, 'close')
                         , 'uitheme:changed' : function (name) {
-                            native.execCommand("uitheme:changed", name);
+                            var theme = Common.UI.Themes.get(name);
+                            if ( theme )
+                                native.execCommand("uitheme:changed", JSON.stringify({name:name, type:theme.type}));
                         }
                     });
                 }

From b8ec15dacbc0a781e7f901d5a2f500cfc0eea07a Mon Sep 17 00:00:00 2001
From: Maxim Kadushkin <maxim.kadushkin@onlyoffice.com>
Date: Wed, 16 Jun 2021 20:20:06 +0300
Subject: [PATCH 41/86] [deploy] refactoring for deployment scripts

---
 build/Gruntfile.js | 4 ++--
 build/package.json | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/build/Gruntfile.js b/build/Gruntfile.js
index 3261b2c18..58af0a5c9 100644
--- a/build/Gruntfile.js
+++ b/build/Gruntfile.js
@@ -99,7 +99,7 @@ module.exports = function(grunt) {
     grunt.loadNpmTasks('grunt-contrib-htmlmin');
     grunt.loadNpmTasks('grunt-json-minify');
     grunt.loadNpmTasks('grunt-text-replace');
-    grunt.loadNpmTasks('grunt-mocha');
+    // grunt.loadNpmTasks('grunt-mocha');
     grunt.loadNpmTasks('grunt-inline');
     grunt.loadNpmTasks('grunt-svgmin');
     grunt.loadNpmTasks('grunt-exec');
@@ -524,7 +524,7 @@ module.exports = function(grunt) {
                     options: {
                         cwd: '../vendor/framework7-react',
                     },
-                    cmd: 'npm i',
+                    cmd: 'npm i --include=dev',
                 },
             }
         });
diff --git a/build/package.json b/build/package.json
index 0ffe7ce6c..f16bcf600 100644
--- a/build/package.json
+++ b/build/package.json
@@ -23,11 +23,11 @@
     "iconv-lite": "^0.5.1",
     "less-plugin-clean-css": "1.5.0",
     "lodash": "^4.17.20",
+    "grunt-exec": "^3.0.0",
     "vinyl-fs": "^3.0.3"
   },
   "devDependencies": {
     "chai": "1.9.1",
-    "grunt-exec": "^3.0.0",
     "mocha": "^6.2.2",
     "grunt-mocha": "^1.0.0"
   }

From 20ec8e411586a4829de9cc1f4066bd0b149a0e59 Mon Sep 17 00:00:00 2001
From: ShimaginAndrey <andrey.shimagin@onlyoffice.com>
Date: Thu, 17 Jun 2021 12:09:30 +0300
Subject: [PATCH 42/86] Fix Bug 50838

---
 apps/spreadsheeteditor/mobile/src/controller/FilterOptions.jsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apps/spreadsheeteditor/mobile/src/controller/FilterOptions.jsx b/apps/spreadsheeteditor/mobile/src/controller/FilterOptions.jsx
index e13be4046..61d761418 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/FilterOptions.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/FilterOptions.jsx
@@ -51,7 +51,7 @@ const FilterOptionsController = () => {
 
     const onSort = (type) => {
         const api = Common.EditorApi.get();
-        api.asc_sortColFilter(type == 'sortdown' ? Asc.c_oAscSortOptions.Ascending : Asc.c_oAscSortOptions.Descending, configFilter.asc_getCellId(), configFilter.asc_getDisplayName(), undefined, true);
+        api.asc_sortColFilter(type == 'sortdown' ? Asc.c_oAscSortOptions.Ascending : Asc.c_oAscSortOptions.Descending, configFilter.asc_getCellId(), configFilter.asc_getDisplayName());
     };
     
     const onClearFilter = () => {

From 60a8c3c2248f0eb7315c298ecd19e557b2e85485 Mon Sep 17 00:00:00 2001
From: ShimaginAndrey <andrey.shimagin@onlyoffice.com>
Date: Thu, 17 Jun 2021 14:40:27 +0300
Subject: [PATCH 43/86] =?UTF-8?q?Refactoring=20code=20=E2=84=9648109?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 apps/documenteditor/mobile/src/view/add/AddOther.jsx | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/apps/documenteditor/mobile/src/view/add/AddOther.jsx b/apps/documenteditor/mobile/src/view/add/AddOther.jsx
index 687bb0c07..b5d111964 100644
--- a/apps/documenteditor/mobile/src/view/add/AddOther.jsx
+++ b/apps/documenteditor/mobile/src/view/add/AddOther.jsx
@@ -179,15 +179,14 @@ const AddOther = props => {
                 <Icon slot="media" icon="icon-pagenumber"></Icon>
             </ListItem>
             {(isShape || isChart) ? null :
-                <ListItem title={_t.textBreak} link={'/add-break/'} routeProps={{
+                [ <ListItem title={_t.textBreak} link={'/add-break/'} routeProps={{
                     onPageBreak: props.onPageBreak,
                     onColumnBreak: props.onColumnBreak,
                     onInsertSectionBreak: props.onInsertSectionBreak
                 }}>
                     <Icon slot="media" icon="icon-sectionbreak"></Icon>
-                </ListItem>
-            }
-            {(isShape || isChart) ? null : 
+                </ListItem>,
+                
                 <ListItem title={_t.textFootnote} link={'/add-footnote/'} routeProps={{
                     getFootnoteProps: props.getFootnoteProps,
                     getFootnoteStartAt: props.getFootnoteStartAt,
@@ -196,7 +195,8 @@ const AddOther = props => {
                     initFootnoteStartAt: props.initFootnoteStartAt
                 }}>
                     <Icon slot="media" icon="icon-footnote"></Icon>
-                </ListItem>}
+                </ListItem> ]
+            }
         </List>
     )
 };

From 31705e5aea579b7dd2678faa6782fc60d1e6931f Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Thu, 17 Jun 2021 14:53:47 +0300
Subject: [PATCH 44/86] [PE SSE mobile] Fix Bug 50889

---
 .../src/view/settings/ApplicationSettings.jsx | 10 +--
 .../mobile/src/view/settings/Settings.jsx     |  8 ++-
 .../src/view/settings/ApplicationSettings.jsx | 71 ++++++++++---------
 .../mobile/src/view/settings/Settings.jsx     |  8 ++-
 4 files changed, 51 insertions(+), 46 deletions(-)

diff --git a/apps/presentationeditor/mobile/src/view/settings/ApplicationSettings.jsx b/apps/presentationeditor/mobile/src/view/settings/ApplicationSettings.jsx
index 9fbb4f59f..54a805d50 100644
--- a/apps/presentationeditor/mobile/src/view/settings/ApplicationSettings.jsx
+++ b/apps/presentationeditor/mobile/src/view/settings/ApplicationSettings.jsx
@@ -16,14 +16,14 @@ const PageApplicationSettings = props => {
     };
 
     // set mode
-    // const appOptions = props.storeAppOptions;
-    // const _isEdit = appOptions.isEdit;
+    const appOptions = props.storeAppOptions;
+    const _isEdit = appOptions.isEdit;
     // const _isShowMacros = (!appOptions.isDisconnected && appOptions.customization) ? appOptions.customization.macros !== false : true;
 
     return (
         <Page>
             <Navbar title={_t.textApplicationSettings} backLink={_t.textBack} />
-            {/* {_isEdit && */}
+            {_isEdit &&
                 <Fragment>
                     <BlockTitle>{_t.textUnitOfMeasurement}</BlockTitle>
                     <List>
@@ -46,7 +46,7 @@ const PageApplicationSettings = props => {
                         </ListItem>
                     </List>
                 </Fragment>
-            {/* } */}
+            }
             {/* {_isShowMacros && */}
                 <List mediaList>
                     <ListItem title={_t.textMacrosSettings} link="/macros-settings/" routeProps={{
@@ -84,7 +84,7 @@ const PageMacrosSettings = props => {
     );
 };
 
-const ApplicationSettings = inject("storeApplicationSettings")(observer(PageApplicationSettings));
+const ApplicationSettings = inject("storeApplicationSettings", "storeAppOptions")(observer(PageApplicationSettings));
 const MacrosSettings = inject("storeApplicationSettings")(observer(PageMacrosSettings));
 
 export {ApplicationSettings, MacrosSettings};
\ No newline at end of file
diff --git a/apps/presentationeditor/mobile/src/view/settings/Settings.jsx b/apps/presentationeditor/mobile/src/view/settings/Settings.jsx
index 22f9a2339..6a3704aea 100644
--- a/apps/presentationeditor/mobile/src/view/settings/Settings.jsx
+++ b/apps/presentationeditor/mobile/src/view/settings/Settings.jsx
@@ -130,9 +130,11 @@ const SettingsList = inject("storeAppOptions")(observer(props => {
                             <Icon slot="media" icon="icon-collaboration"></Icon>
                         </ListItem> 
                     : null}
-                    <ListItem link="#" title={_t.textPresentationSettings} onClick={onoptionclick.bind(this, '/presentation-settings/')}>
-                        <Icon slot="media" icon="icon-setup"></Icon>
-                    </ListItem>
+                    {_isEdit && 
+                        <ListItem link="#" title={_t.textPresentationSettings} onClick={onoptionclick.bind(this, '/presentation-settings/')}>
+                            <Icon slot="media" icon="icon-setup"></Icon>
+                        </ListItem>
+                    }
                     <ListItem title={_t.textApplicationSettings} link="#" onClick={onoptionclick.bind(this, '/application-settings/')}>
                         <Icon slot="media" icon="icon-app-settings"></Icon>
                     </ListItem>
diff --git a/apps/spreadsheeteditor/mobile/src/view/settings/ApplicationSettings.jsx b/apps/spreadsheeteditor/mobile/src/view/settings/ApplicationSettings.jsx
index 9039e0cda..d2738b577 100644
--- a/apps/spreadsheeteditor/mobile/src/view/settings/ApplicationSettings.jsx
+++ b/apps/spreadsheeteditor/mobile/src/view/settings/ApplicationSettings.jsx
@@ -27,14 +27,14 @@ const PageApplicationSettings = props => {
     };
 
     // set mode
-    // const appOptions = props.storeAppOptions;
-    // const _isEdit = appOptions.isEdit;
+    const appOptions = props.storeAppOptions;
+    const _isEdit = appOptions.isEdit;
     // const _isShowMacros = (!appOptions.isDisconnected && appOptions.customization) ? appOptions.customization.macros !== false : true;
 
     return (
         <Page>
             <Navbar title={_t.textApplicationSettings} backLink={_t.textBack} />
-            {/* {_isEdit && */}
+            {_isEdit &&
                 <Fragment>
                     <BlockTitle>{_t.textUnitOfMeasurement}</BlockTitle>
                     <List>
@@ -59,39 +59,40 @@ const PageApplicationSettings = props => {
                             onRegSettings: props.onRegSettings
                         }}></ListItem>
                     </List>
-                    <BlockTitle>{_t.textCommentingDisplay}</BlockTitle>
-                    <List>
-                        <ListItem>
-                            <span>{_t.textComments}</span>
-                            <Toggle checked={isComments}
-                                    onChange={() => {
-                                        storeApplicationSettings.changeDisplayComments(!isComments);
-                                        props.onChangeDisplayComments(!isComments);
-                                    }}
-                            />
-                        </ListItem>
-                        <ListItem>
-                            <span>{_t.textResolvedComments}</span>
-                            <Toggle checked={isResolvedComments} disabled={!isComments}
-                                    onChange={() => {
-                                        storeApplicationSettings.changeDisplayResolved(!isResolvedComments);
-                                        props.onChangeDisplayResolved(!isResolvedComments);
-                                    }}
-                            />
-                        </ListItem>
-                    </List>
-                    <List>
-                        <ListItem>
-                            <span>{_t.textR1C1Style}</span>
-                            <Toggle checked={isRefStyle}
-                                    onChange={() => {
-                                        storeApplicationSettings.changeRefStyle(!isRefStyle);
-                                        props.clickR1C1Style(!isRefStyle);
-                                    }}
-                            />
-                        </ListItem>
-                    </List>
                 </Fragment>
+            }
+                <BlockTitle>{_t.textCommentingDisplay}</BlockTitle>
+                <List>
+                    <ListItem>
+                        <span>{_t.textComments}</span>
+                        <Toggle checked={isComments}
+                                onChange={() => {
+                                    storeApplicationSettings.changeDisplayComments(!isComments);
+                                    props.onChangeDisplayComments(!isComments);
+                                }}
+                        />
+                    </ListItem>
+                    <ListItem>
+                        <span>{_t.textResolvedComments}</span>
+                        <Toggle checked={isResolvedComments} disabled={!isComments}
+                                onChange={() => {
+                                    storeApplicationSettings.changeDisplayResolved(!isResolvedComments);
+                                    props.onChangeDisplayResolved(!isResolvedComments);
+                                }}
+                        />
+                    </ListItem>
+                </List>
+                <List>
+                    <ListItem>
+                        <span>{_t.textR1C1Style}</span>
+                        <Toggle checked={isRefStyle}
+                                onChange={() => {
+                                    storeApplicationSettings.changeRefStyle(!isRefStyle);
+                                    props.clickR1C1Style(!isRefStyle);
+                                }}
+                        />
+                    </ListItem>
+                </List>
             {/* } */}
             {/* {_isShowMacros && */}
                 <List>
diff --git a/apps/spreadsheeteditor/mobile/src/view/settings/Settings.jsx b/apps/spreadsheeteditor/mobile/src/view/settings/Settings.jsx
index 6d3793350..ac8caca6e 100644
--- a/apps/spreadsheeteditor/mobile/src/view/settings/Settings.jsx
+++ b/apps/spreadsheeteditor/mobile/src/view/settings/Settings.jsx
@@ -138,9 +138,11 @@ const SettingsList = inject("storeAppOptions")(observer(props => {
                             <Icon slot="media" icon="icon-collaboration"></Icon>
                         </ListItem> 
                     : null}
-                    <ListItem link="#" title={_t.textSpreadsheetSettings} onClick={onoptionclick.bind(this, '/spreadsheet-settings/')}>
-                        <Icon slot="media" icon="icon-table-settings"></Icon>
-                    </ListItem>
+                    {_isEdit && 
+                        <ListItem link="#" title={_t.textSpreadsheetSettings} onClick={onoptionclick.bind(this, '/spreadsheet-settings/')}>
+                            <Icon slot="media" icon="icon-table-settings"></Icon>
+                        </ListItem>
+                    }
                     <ListItem title={_t.textApplicationSettings} link="#" onClick={onoptionclick.bind(this, '/application-settings/')}>
                         <Icon slot="media" icon="icon-app-settings"></Icon>
                     </ListItem>

From 0b19e0948f211a2e0b8f63b4dc697d2e2de8ddac Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Thu, 17 Jun 2021 15:50:32 +0300
Subject: [PATCH 45/86] [DE mobile] Fix Bug 50894

---
 .../documenteditor/mobile/src/less/icons-material.less | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/apps/documenteditor/mobile/src/less/icons-material.less b/apps/documenteditor/mobile/src/less/icons-material.less
index 71c229de1..03e09345e 100644
--- a/apps/documenteditor/mobile/src/less/icons-material.less
+++ b/apps/documenteditor/mobile/src/less/icons-material.less
@@ -26,6 +26,16 @@
         height: 22px;
         .encoded-svg-background('<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 22 22" fill="@{navBarIconColor}"><g><path d="M12.1,2H9.9C9.6,2,9.4,2.2,9.3,2.5L8.8,4.9c0,0.2-0.2,0.3-0.3,0.3s-0.1,0-0.2-0.1L6.2,3.8C6.1,3.7,6,3.7,5.8,3.7c-0.1,0-0.3,0-0.4,0.1L3.8,5.4c-0.1,0.2-0.2,0.5,0,0.8l1.3,2.1c0.1,0.2,0.1,0.4-0.2,0.5L2.5,9.3C2.2,9.4,2,9.6,2,9.9v2.2c0,0.3,0.2,0.5,0.5,0.6l2.4,0.5c0.3,0.1,0.4,0.3,0.2,0.5l-1.3,2.1c-0.2,0.2-0.1,0.6,0.1,0.8l1.6,1.6c0.1,0.1,0.3,0.2,0.4,0.2s0.2,0,0.3-0.1L8.3,17c0.1-0.1,0.1-0.1,0.2-0.1s0.3,0.1,0.3,0.3l0.5,2.3C9.4,19.8,9.6,20,9.9,20h2.2c0.3,0,0.5-0.2,0.6-0.5l0.5-2.4c0-0.2,0.1-0.3,0.3-0.3c0.1,0,0.1,0,0.2,0.1l2.1,1.3c0.1,0.1,0.2,0.1,0.3,0.1c0.2,0,0.3-0.1,0.4-0.2l1.6-1.6c0.2-0.2,0.2-0.5,0.1-0.8l-1.3-2.1c-0.2-0.2-0.1-0.5,0.2-0.5l2.4-0.5c0.3-0.1,0.5-0.3,0.5-0.6V9.8c0-0.3-0.2-0.5-0.5-0.6l-2.4-0.5c-0.3-0.1-0.4-0.3-0.2-0.5l1.3-2.1c0.2-0.2,0.1-0.6-0.1-0.8l-1.6-1.6c-0.1-0.1-0.3-0.2-0.4-0.2s-0.2,0-0.3,0.1l-2.1,1.3C13.6,5,13.6,5,13.5,5s-0.3-0.1-0.3-0.3l-0.5-2.2C12.6,2.2,12.4,2,12.1,2L12.1,2z M11,14.5c-1.9,0-3.5-1.6-3.5-3.5S9.1,7.5,11,7.5s3.5,1.6,3.5,3.5S12.9,14.5,11,14.5L11,14.5z"/></g></svg>');
       }
+      &.icon-prev {
+        width: 20px;
+        height: 20px;
+        .encoded-svg-background('<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 22 22" fill="@{navBarIconColor}"><g><polygon points="5.1,10.9 13.9,2 16,4.1 9.2,11.1 16,17.9 13.9,20 5.1,11.2 5,11.1 "/></g></svg>');
+      }
+      &.icon-next {
+          width: 20px;
+          height: 20px;
+          .encoded-svg-background('<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 22 22" fill="@{navBarIconColor}"><g><polygon points="16.9,10.9 8.1,2 6,4.1 12.8,11.1 6,17.9 8.1,20 16.9,11.2 17,11.1 "/></g></svg>');
+      }
       &.icon-expand-down {
         width: 22px;
         height: 22px;

From 670910d5f4d96fdad90be925d28c50f006aad60e Mon Sep 17 00:00:00 2001
From: ShimaginAndrey <andrey.shimagin@onlyoffice.com>
Date: Thu, 17 Jun 2021 16:11:26 +0300
Subject: [PATCH 46/86] [SSE mobile] Bug 50875

---
 apps/spreadsheeteditor/mobile/src/controller/FilterOptions.jsx | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/apps/spreadsheeteditor/mobile/src/controller/FilterOptions.jsx b/apps/spreadsheeteditor/mobile/src/controller/FilterOptions.jsx
index e13be4046..3a8742057 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/FilterOptions.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/FilterOptions.jsx
@@ -52,6 +52,8 @@ const FilterOptionsController = () => {
     const onSort = (type) => {
         const api = Common.EditorApi.get();
         api.asc_sortColFilter(type == 'sortdown' ? Asc.c_oAscSortOptions.Ascending : Asc.c_oAscSortOptions.Descending, configFilter.asc_getCellId(), configFilter.asc_getDisplayName(), undefined, true);
+        f7.sheet.close('.picker__sheet');
+        f7.popover.close('#picker-popover');
     };
     
     const onClearFilter = () => {

From 198163bfc0e088a9c6e4d61f5bdf4641bdaf53ac Mon Sep 17 00:00:00 2001
From: JuliaSvinareva <Julia.Svinaryova@onlyoffice.com>
Date: Thu, 17 Jun 2021 18:23:58 +0300
Subject: [PATCH 47/86] [DE mobile] Fix bug 50879

---
 .../src/controller/settings/Download.jsx      | 11 ++++++----
 .../src/controller/settings/Settings.jsx      | 20 +++++++++----------
 apps/documenteditor/mobile/src/page/main.jsx  |  2 +-
 3 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/apps/documenteditor/mobile/src/controller/settings/Download.jsx b/apps/documenteditor/mobile/src/controller/settings/Download.jsx
index aa5982539..7b3a3a703 100644
--- a/apps/documenteditor/mobile/src/controller/settings/Download.jsx
+++ b/apps/documenteditor/mobile/src/controller/settings/Download.jsx
@@ -25,6 +25,7 @@ class DownloadController extends Component {
         const _t = t("Settings", { returnObjects: true });
 
         if(format) {
+            this.closeModal();
             if (format == Asc.c_oAscFileType.TXT || format == Asc.c_oAscFileType.RTF) {
                 f7.dialog.confirm(
                     (format === Asc.c_oAscFileType.TXT) ? _t.textDownloadTxt : _t.textDownloadRtf,
@@ -35,16 +36,18 @@ class DownloadController extends Component {
                             onAdvancedOptions(Asc.c_oAscAdvancedOptionsID.TXT, api.asc_getAdvancedOptions(), 2, new Asc.asc_CDownloadOptions(format), _t, isDocReady);
                         }
                         else {
-                            api.asc_DownloadAs(new Asc.asc_CDownloadOptions(format));
+                            setTimeout(() => {
+                                api.asc_DownloadAs(new Asc.asc_CDownloadOptions(format));
+                            }, 400);
                         }
                     }
                 );
             } 
             else {
-                api.asc_DownloadAs(new Asc.asc_CDownloadOptions(format));
+                setTimeout(() => {
+                    api.asc_DownloadAs(new Asc.asc_CDownloadOptions(format));
+                }, 400);
             }
-
-            this.closeModal();
         }
     }
 
diff --git a/apps/documenteditor/mobile/src/controller/settings/Settings.jsx b/apps/documenteditor/mobile/src/controller/settings/Settings.jsx
index d0b1fe751..0dff72abe 100644
--- a/apps/documenteditor/mobile/src/controller/settings/Settings.jsx
+++ b/apps/documenteditor/mobile/src/controller/settings/Settings.jsx
@@ -19,11 +19,6 @@ const Settings = props => {
         }
     });
 
-    const onviewclosed = () => {
-        if ( props.onclosed )
-            props.onclosed();
-    };
-
     const closeModal = () => {
         if (Device.phone) {
             f7.sheet.close('.settings-popup');
@@ -46,15 +41,14 @@ const Settings = props => {
     };
 
     const onPrint = () => {
+        closeModal();
         setTimeout(() => {
             Common.EditorApi.get().asc_Print();
-        }, 1);
-        closeModal();
+        }, 400);
     };
 
     const showHelp = () => {
         let url = __HELP_URL__;
-        // let url = 'https://helpcenter.onlyoffice.com';
 
         if (url.charAt(url.length-1) !== '/') {
             url += '/';
@@ -68,17 +62,21 @@ const Settings = props => {
         }
 
         closeModal();
-        window.open(url, "_blank");
+        setTimeout(() => {
+            window.open(url, "_blank");
+        }, 400);
     };
 
     const onOrthographyCheck = () => {
         closeModal();
-        Common.EditorApi.get().asc_pluginRun("asc.{B631E142-E40B-4B4C-90B9-2D00222A286E}", 0);
+        setTimeout(() => {
+            Common.EditorApi.get().asc_pluginRun("asc.{B631E142-E40B-4B4C-90B9-2D00222A286E}", 0);
+        }, 400);
     };
 
     return <SettingsView usePopover={!Device.phone}
                          openOptions={props.openOptions}
-                         onclosed={onviewclosed}
+                         onclosed={props.onclosed}
                          onReaderMode={onReaderMode}
                          onPrint={onPrint}
                          showHelp={showHelp}
diff --git a/apps/documenteditor/mobile/src/page/main.jsx b/apps/documenteditor/mobile/src/page/main.jsx
index 9bc3c3b24..a502fca1a 100644
--- a/apps/documenteditor/mobile/src/page/main.jsx
+++ b/apps/documenteditor/mobile/src/page/main.jsx
@@ -129,7 +129,7 @@ class MainPage extends Component {
               }
               {
                   !this.state.settingsVisible ? null :
-                      <Settings openOptions={this.handleClickToOpenOptions} onclosed={this.handleOptionsViewClosed.bind(this, 'settings')} />
+                      <Settings openOptions={this.handleClickToOpenOptions.bind(this)} onclosed={this.handleOptionsViewClosed.bind(this, 'settings')} />
               }
               {
                   !this.state.collaborationVisible ? null :

From bbbfb5ddde6732ff87e3dd7128c64142ec9dce86 Mon Sep 17 00:00:00 2001
From: JuliaSvinareva <Julia.Svinaryova@onlyoffice.com>
Date: Thu, 17 Jun 2021 18:24:31 +0300
Subject: [PATCH 48/86] [mobile] Fix plugins

---
 apps/common/mobile/lib/controller/Plugins.jsx | 2 --
 1 file changed, 2 deletions(-)

diff --git a/apps/common/mobile/lib/controller/Plugins.jsx b/apps/common/mobile/lib/controller/Plugins.jsx
index e4f889def..5ded098ec 100644
--- a/apps/common/mobile/lib/controller/Plugins.jsx
+++ b/apps/common/mobile/lib/controller/Plugins.jsx
@@ -35,8 +35,6 @@ const PluginsController = inject('storeAppOptions')(observer(props => {
             api.asc_unregisterCallback("asc_onPluginClose", pluginClose);
             api.asc_unregisterCallback("asc_onPluginResize", pluginResize);
             api.asc_unregisterCallback('asc_onPluginsInit', onPluginsInit);
-
-            Common.Gateway.off('init', loadConfig);
         };
     });
 

From e8d9a42d3e3c564f5b8cf91a784a4cfa32b58bf2 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Thu, 17 Jun 2021 18:58:44 +0300
Subject: [PATCH 49/86] [DE embed] Check required fields

---
 .../embed/js/ApplicationController.js           | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/apps/documenteditor/embed/js/ApplicationController.js b/apps/documenteditor/embed/js/ApplicationController.js
index e2aa0592d..bab462149 100644
--- a/apps/documenteditor/embed/js/ApplicationController.js
+++ b/apps/documenteditor/embed/js/ApplicationController.js
@@ -255,12 +255,15 @@ DE.ApplicationController = new(function(){
         common.utils.dialogPrint(url, api);
     }
 
-    function onFillRequiredFields() {
-        if (btnSubmit) {
+    function onFillRequiredFields(isFilled) {
+        if (isFilled) {
             btnSubmit.removeAttr('disabled');
             btnSubmit.css("pointer-events", "auto");
+            // $requiredTooltip && $requiredTooltip.hide();
+        } else {
+            btnSubmit.attr({disabled: true});
+            btnSubmit.css("pointer-events", "none");
         }
-        $requiredTooltip && $requiredTooltip.hide();
     }
 
     function hidePreloader() {
@@ -338,7 +341,7 @@ DE.ApplicationController = new(function(){
         api.asc_registerCallback('asc_onDownloadUrl',           onDownloadUrl);
         api.asc_registerCallback('asc_onPrint',                 onPrint);
         api.asc_registerCallback('asc_onPrintUrl',              onPrintUrl);
-        api.asc_registerCallback('asc_onFillRequiredFields',    onFillRequiredFields);
+        api.asc_registerCallback('sync_onAllRequiredFormsFilled', onFillRequiredFields);
 
         Common.Gateway.on('processmouse',       onProcessMouse);
         Common.Gateway.on('downloadas',         onDownloadAs);
@@ -420,8 +423,8 @@ DE.ApplicationController = new(function(){
         });
 
         // TODO: add asc_hasRequiredFields to sdk
-        /*
-        if (appOptions.canSubmitForms && api.asc_hasRequiredFields()) {
+
+        if (appOptions.canSubmitForms && !api.asc_IsAllRequiredFormsFilled()) {
             var sgroup = $('#id-submit-group');
             btnSubmit.attr({disabled: true});
             btnSubmit.css("pointer-events", "none");
@@ -432,6 +435,7 @@ DE.ApplicationController = new(function(){
                 $requiredTooltip.css({top : offset.top + btnSubmit.height() + 'px', left: offset.left + btnSubmit.outerWidth()/2 - $requiredTooltip.outerWidth() + 'px'});
                 $requiredTooltip.find('.close-div').on('click', function() {
                     $requiredTooltip.hide();
+                    api.asc_MoveToFillingForm(true, true, true);
                     common.localStorage.setItem("de-embed-hide-submittip", 1);
                     sgroup.attr('data-toggle', 'tooltip');
                     sgroup.tooltip({
@@ -448,7 +452,6 @@ DE.ApplicationController = new(function(){
                 });
             }
         }
-        */
 
         var documentMoveTimer;
         var ismoved = false;

From 005bb841dcc2e9dee33d53b6bcb24da9f66aabdd Mon Sep 17 00:00:00 2001
From: ShimaginAndrey <andrey.shimagin@onlyoffice.com>
Date: Thu, 17 Jun 2021 18:58:45 +0300
Subject: [PATCH 50/86] Fix Bug 50832

---
 .../mobile/resources/less/common-material.less     | 14 ++++++++++++++
 .../mobile/src/view/add/AddImage.jsx               |  2 +-
 .../mobile/src/view/add/AddOther.jsx               |  4 ++--
 .../mobile/src/view/add/AddImage.jsx               |  2 +-
 .../mobile/src/view/add/AddImage.jsx               |  2 +-
 5 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/apps/common/mobile/resources/less/common-material.less b/apps/common/mobile/resources/less/common-material.less
index daa240ba9..b2b44f5a9 100644
--- a/apps/common/mobile/resources/less/common-material.less
+++ b/apps/common/mobile/resources/less/common-material.less
@@ -56,6 +56,20 @@
         }
     }
 
+    .add-popup {
+        .view{
+            .block-title{
+                margin-bottom: 0;
+                margin-top: 8px;
+            }
+            .inputs-list {
+                ul:after, :before{
+                    display: none;
+                }
+            }
+        }
+    }
+
     // Buttons
     .segmented {
         .decrement, .increment {
diff --git a/apps/documenteditor/mobile/src/view/add/AddImage.jsx b/apps/documenteditor/mobile/src/view/add/AddImage.jsx
index 1fed2d95a..aaaf9c31c 100644
--- a/apps/documenteditor/mobile/src/view/add/AddImage.jsx
+++ b/apps/documenteditor/mobile/src/view/add/AddImage.jsx
@@ -11,7 +11,7 @@ const PageLinkSettings = props => {
         <Page>
             <Navbar title={_t.textLinkSettings} backLink={_t.textBack}></Navbar>
             <BlockTitle>{_t.textAddress}</BlockTitle>
-            <List>
+            <List className='inputs-list'>
                 <ListInput
                     type='text'
                     placeholder={_t.textImageURL}
diff --git a/apps/documenteditor/mobile/src/view/add/AddOther.jsx b/apps/documenteditor/mobile/src/view/add/AddOther.jsx
index b5d111964..240e27521 100644
--- a/apps/documenteditor/mobile/src/view/add/AddOther.jsx
+++ b/apps/documenteditor/mobile/src/view/add/AddOther.jsx
@@ -179,7 +179,7 @@ const AddOther = props => {
                 <Icon slot="media" icon="icon-pagenumber"></Icon>
             </ListItem>
             {(isShape || isChart) ? null :
-                [ <ListItem title={_t.textBreak} link={'/add-break/'} routeProps={{
+                [ <ListItem key='break' title={_t.textBreak} link={'/add-break/'} routeProps={{
                     onPageBreak: props.onPageBreak,
                     onColumnBreak: props.onColumnBreak,
                     onInsertSectionBreak: props.onInsertSectionBreak
@@ -187,7 +187,7 @@ const AddOther = props => {
                     <Icon slot="media" icon="icon-sectionbreak"></Icon>
                 </ListItem>,
                 
-                <ListItem title={_t.textFootnote} link={'/add-footnote/'} routeProps={{
+                <ListItem key='footnote' title={_t.textFootnote} link={'/add-footnote/'} routeProps={{
                     getFootnoteProps: props.getFootnoteProps,
                     getFootnoteStartAt: props.getFootnoteStartAt,
                     onFootnoteStartAt: props.onFootnoteStartAt,
diff --git a/apps/presentationeditor/mobile/src/view/add/AddImage.jsx b/apps/presentationeditor/mobile/src/view/add/AddImage.jsx
index c34d4e608..28991117e 100644
--- a/apps/presentationeditor/mobile/src/view/add/AddImage.jsx
+++ b/apps/presentationeditor/mobile/src/view/add/AddImage.jsx
@@ -11,7 +11,7 @@ const PageLinkSettings = props => {
         <Page>
             <Navbar title={_t.textLinkSettings} backLink={_t.textBack}></Navbar>
             <BlockTitle>{_t.textAddress}</BlockTitle>
-            <List>
+            <List className='inputs-list'>
                 <ListInput
                     type='text'
                     placeholder={_t.textImageURL}
diff --git a/apps/spreadsheeteditor/mobile/src/view/add/AddImage.jsx b/apps/spreadsheeteditor/mobile/src/view/add/AddImage.jsx
index a23ad9a3c..a3311cb6c 100644
--- a/apps/spreadsheeteditor/mobile/src/view/add/AddImage.jsx
+++ b/apps/spreadsheeteditor/mobile/src/view/add/AddImage.jsx
@@ -27,7 +27,7 @@ const PageLinkSettings = props => {
         <Page>
             <Navbar title={_t.textLinkSettings} backLink={_t.textBack}></Navbar>
             <BlockTitle>{_t.textAddress}</BlockTitle>
-            <List>
+            <List className='inputs-list'>
                 <ListInput
                     type='text'
                     placeholder={_t.textImageURL}

From db70a44d4e1f9655fcd2dd1aad6f443a5709d9e4 Mon Sep 17 00:00:00 2001
From: Maxim Kadushkin <maxim.kadushkin@onlyoffice.com>
Date: Thu, 17 Jun 2021 19:19:07 +0300
Subject: [PATCH 51/86] [all] fix launch customized app

---
 build/documenteditor.json     | 3 ++-
 build/presentationeditor.json | 3 ++-
 build/spreadsheeteditor.json  | 3 ++-
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/build/documenteditor.json b/build/documenteditor.json
index a1d168912..a220200a8 100644
--- a/build/documenteditor.json
+++ b/build/documenteditor.json
@@ -355,7 +355,8 @@
                 }
             ],
             "index-page": {
-                "../deploy/web-apps/apps/documenteditor/mobile/index.html": "../apps/documenteditor/mobile/index.html"
+                "../deploy/web-apps/apps/documenteditor/mobile/index.html": "../apps/documenteditor/mobile/index.html",
+                "../deploy/web-apps/apps/documenteditor/mobile/index_loader.html": "../apps/documenteditor/mobile/index.html"
             },
             "localization": [
                 {
diff --git a/build/presentationeditor.json b/build/presentationeditor.json
index f5954e7f7..ccddf34cd 100644
--- a/build/presentationeditor.json
+++ b/build/presentationeditor.json
@@ -371,7 +371,8 @@
                 }
             ],
             "index-page": {
-                "../deploy/web-apps/apps/presentationeditor/mobile/index.html": "../apps/presentationeditor/mobile/index.html"
+                "../deploy/web-apps/apps/presentationeditor/mobile/index.html": "../apps/presentationeditor/mobile/index.html",
+                "../deploy/web-apps/apps/presentationeditor/mobile/index_loader.html": "../apps/presentationeditor/mobile/index.html"
             },
             "localization": [
                 {
diff --git a/build/spreadsheeteditor.json b/build/spreadsheeteditor.json
index e210e924b..8d3be3fb9 100644
--- a/build/spreadsheeteditor.json
+++ b/build/spreadsheeteditor.json
@@ -372,7 +372,8 @@
                 }
             ],
             "index-page": {
-                "../deploy/web-apps/apps/spreadsheeteditor/mobile/index.html": "../apps/spreadsheeteditor/mobile/index.html"
+                "../deploy/web-apps/apps/spreadsheeteditor/mobile/index.html": "../apps/spreadsheeteditor/mobile/index.html",
+                "../deploy/web-apps/apps/spreadsheeteditor/mobile/index_loader.html": "../apps/spreadsheeteditor/mobile/index.html"
             },
             "localization": [
                 {

From 582b29cabf7439360106d1c7d8c884a1f00aa357 Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Thu, 17 Jun 2021 21:38:09 +0300
Subject: [PATCH 52/86] [common] Fix Bug 48242

---
 apps/common/mobile/lib/controller/Plugins.jsx | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/apps/common/mobile/lib/controller/Plugins.jsx b/apps/common/mobile/lib/controller/Plugins.jsx
index e4f889def..2c64eaa2f 100644
--- a/apps/common/mobile/lib/controller/Plugins.jsx
+++ b/apps/common/mobile/lib/controller/Plugins.jsx
@@ -46,7 +46,6 @@ const PluginsController = inject('storeAppOptions')(observer(props => {
         api.asc_pluginButtonClick(index);
     };
 
-
     const showPluginModal = (plugin, variationIndex, frameId, urlAddition) => {
         let isAndroid = Device.android;
         let variation = plugin.get_Variations()[variationIndex];
@@ -68,7 +67,8 @@ const PluginsController = inject('storeAppOptions')(observer(props => {
                     if ((storeAppOptions.isEdit || b.isViewer !== false)) {
                         newBtns[index] = {
                             text: b.text,
-                            attributes: {result: index}
+                            attributes: {result: index},
+                            close: false
                         };
                     }
                 });
@@ -123,8 +123,8 @@ const PluginsController = inject('storeAppOptions')(observer(props => {
     };
 
     const pluginClose = plugin => {
-        if (iframe) {
-            iframe = null;
+        if (plugin) {
+            modal.close();
         }
     };
 

From 84d03010f83eb1c1439f5fa3825986d1b4e541f9 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Fri, 18 Jun 2021 11:14:43 +0300
Subject: [PATCH 53/86] [DE] Fill required fields before send form

---
 apps/documenteditor/main/app/controller/FormsTab.js | 12 ++++++++++++
 apps/documenteditor/main/app/view/FormsTab.js       |  3 ++-
 apps/documenteditor/main/locale/en.json             |  1 +
 3 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/apps/documenteditor/main/app/controller/FormsTab.js b/apps/documenteditor/main/app/controller/FormsTab.js
index 9ef385626..43500dbdf 100644
--- a/apps/documenteditor/main/app/controller/FormsTab.js
+++ b/apps/documenteditor/main/app/controller/FormsTab.js
@@ -233,6 +233,18 @@ define([
         },
 
         onSubmitClick: function() {
+            if (!this.api.asc_IsAllRequiredFormsFilled()) {
+                var me = this;
+                Common.UI.warning({
+                    msg: this.view.textRequired,
+                    callback: function() {
+                        me.api.asc_MoveToFillingForm(true, true, true);
+                        Common.NotificationCenter.trigger('edit:complete', me.toolbar);
+                    }
+                });
+                return;
+            }
+
             this.api.asc_SendForm();
             Common.NotificationCenter.trigger('edit:complete', this.toolbar);
         },
diff --git a/apps/documenteditor/main/app/view/FormsTab.js b/apps/documenteditor/main/app/view/FormsTab.js
index fa93c0802..2437a1451 100644
--- a/apps/documenteditor/main/app/view/FormsTab.js
+++ b/apps/documenteditor/main/app/view/FormsTab.js
@@ -388,7 +388,8 @@ define([
             tipPrevForm: 'Go to the previous field',
             tipNextForm: 'Go to the next field',
             tipSubmit: 'Submit form',
-            textSubmited: 'Form submitted successfully'
+            textSubmited: 'Form submitted successfully',
+            textRequired: 'Fill all required fields to send form.'
         }
     }()), DE.Views.FormsTab || {}));
 });
\ No newline at end of file
diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json
index d6a5bcb78..c2e2bb592 100644
--- a/apps/documenteditor/main/locale/en.json
+++ b/apps/documenteditor/main/locale/en.json
@@ -1794,6 +1794,7 @@
   "DE.Views.FormsTab.tipSubmit": "Submit form",
   "DE.Views.FormsTab.tipTextField": "Insert text field",
   "DE.Views.FormsTab.tipViewForm": "View form",
+  "DE.Views.FormsTab.textRequired": "Fill all required fields to send form.",
   "DE.Views.HeaderFooterSettings.textBottomCenter": "Bottom center",
   "DE.Views.HeaderFooterSettings.textBottomLeft": "Bottom left",
   "DE.Views.HeaderFooterSettings.textBottomPage": "Bottom of Page",

From 055fbeb06295fa2334f0ac4768d48fbb26fc9571 Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Fri, 18 Jun 2021 12:43:41 +0300
Subject: [PATCH 54/86] [SSE mobile] Fix Bug 50800

---
 apps/common/mobile/resources/less/common.less                  | 3 ---
 .../mobile/src/controller/settings/Download.jsx                | 3 ++-
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/apps/common/mobile/resources/less/common.less b/apps/common/mobile/resources/less/common.less
index b8292d970..efea54205 100644
--- a/apps/common/mobile/resources/less/common.less
+++ b/apps/common/mobile/resources/less/common.less
@@ -784,9 +784,6 @@ input[type="number"]::-webkit-inner-spin-button {
             padding: 0;
             text-align: left;
             font-size: 16px;
-            span {
-                padding: 0;
-            }
         }
     }
     .picker-center-highlight {
diff --git a/apps/spreadsheeteditor/mobile/src/controller/settings/Download.jsx b/apps/spreadsheeteditor/mobile/src/controller/settings/Download.jsx
index 320a6e650..af1fbf4c2 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/settings/Download.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/settings/Download.jsx
@@ -94,7 +94,8 @@ const onAdvancedOptions = (type, advOptions, mode, formatOptions, _t, isDocReady
                 '</div>' +
                 '<div id="txt-encoding" class="small"></div>' +
             '</div>',
-            buttons: buttons
+            buttons: buttons,
+            cssClass: 'dlg-adv-options'
         }).open();
 
         const recommendedSettings = advOptions.asc_getRecommendedSettings();

From d31dd64efe2cc5ec50243e71c767d1ad95aaa192 Mon Sep 17 00:00:00 2001
From: JuliaSvinareva <Julia.Svinaryova@onlyoffice.com>
Date: Fri, 18 Jun 2021 12:51:50 +0300
Subject: [PATCH 55/86] [PE mobile] Fix bug 50867

---
 apps/presentationeditor/mobile/src/controller/Preview.jsx | 2 ++
 apps/presentationeditor/mobile/src/view/Preview.jsx       | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/apps/presentationeditor/mobile/src/controller/Preview.jsx b/apps/presentationeditor/mobile/src/controller/Preview.jsx
index df6cd83aa..feeab5209 100644
--- a/apps/presentationeditor/mobile/src/controller/Preview.jsx
+++ b/apps/presentationeditor/mobile/src/controller/Preview.jsx
@@ -3,6 +3,7 @@ import { inject } from 'mobx-react';
 import { f7 } from 'framework7-react';
 import { useTranslation } from 'react-i18next';
 import Preview from "../view/Preview";
+import ContextMenu from './ContextMenu';
 
 const PreviewController = props => {
     const { t } = useTranslation();
@@ -20,6 +21,7 @@ const PreviewController = props => {
             api.DemonstrationEndShowMessage(_t.textFinalMessage);
         };
 
+        ContextMenu.closeContextMenu();
         show();
         onDocumentReady();
 
diff --git a/apps/presentationeditor/mobile/src/view/Preview.jsx b/apps/presentationeditor/mobile/src/view/Preview.jsx
index 96a618b42..aeba8cf40 100644
--- a/apps/presentationeditor/mobile/src/view/Preview.jsx
+++ b/apps/presentationeditor/mobile/src/view/Preview.jsx
@@ -2,7 +2,7 @@ import React from 'react';
 
 const Preview = () => {
     return (
-        <div id="pe-preview" style={{position: 'absolute', left: 0, top: 0, width: '100%', height: '100%', zIndex: 1000}}>
+        <div id="pe-preview" style={{position: 'absolute', left: 0, top: 0, width: '100%', height: '100%', zIndex: 14000}}>
             <div id="presentation-preview" style={{width: '100%', height: '100%'}}></div>
         </div>
     )

From 8e85201c1682541948cfe7f5a79c6188aa4617ef Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Fri, 18 Jun 2021 13:06:41 +0300
Subject: [PATCH 56/86] Update translation

---
 apps/documenteditor/embed/locale/en.json    |   4 +-
 apps/documenteditor/main/locale/el.json     |  16 +-
 apps/documenteditor/main/locale/en.json     |   6 +-
 apps/documenteditor/main/locale/es.json     |   6 +-
 apps/documenteditor/main/locale/fr.json     |   6 +-
 apps/documenteditor/main/locale/pt.json     |   2 +-
 apps/documenteditor/main/locale/ro.json     |  43 +++++-
 apps/documenteditor/main/locale/ru.json     |   6 +-
 apps/documenteditor/main/locale/zh.json     |   2 +-
 apps/presentationeditor/main/locale/de.json |   2 +-
 apps/presentationeditor/main/locale/el.json |   8 +-
 apps/presentationeditor/main/locale/en.json |   4 +-
 apps/presentationeditor/main/locale/es.json |  10 +-
 apps/presentationeditor/main/locale/fr.json |   8 +-
 apps/presentationeditor/main/locale/pt.json |   6 +-
 apps/presentationeditor/main/locale/ro.json |  27 +++-
 apps/presentationeditor/main/locale/ru.json |   6 +-
 apps/presentationeditor/main/locale/zh.json |   2 +-
 apps/spreadsheeteditor/main/locale/el.json  |  34 +++++
 apps/spreadsheeteditor/main/locale/en.json  |   4 +-
 apps/spreadsheeteditor/main/locale/es.json  |  10 +-
 apps/spreadsheeteditor/main/locale/fr.json  |  10 +-
 apps/spreadsheeteditor/main/locale/pt.json  | 114 +++++++++++++-
 apps/spreadsheeteditor/main/locale/ro.json  | 157 +++++++++++++++++++-
 apps/spreadsheeteditor/main/locale/ru.json  |   6 +-
 apps/spreadsheeteditor/main/locale/zh.json  |   2 +-
 26 files changed, 428 insertions(+), 73 deletions(-)

diff --git a/apps/documenteditor/embed/locale/en.json b/apps/documenteditor/embed/locale/en.json
index ba2a995f1..d1d9306a2 100644
--- a/apps/documenteditor/embed/locale/en.json
+++ b/apps/documenteditor/embed/locale/en.json
@@ -21,18 +21,18 @@
   "DE.ApplicationController.scriptLoadError": "The connection is too slow, some of the components could not be loaded. Please reload the page.",
   "DE.ApplicationController.textAnonymous": "Anonymous",
   "DE.ApplicationController.textClear": "Clear All Fields",
+  "DE.ApplicationController.textGotIt": "Got it",
   "DE.ApplicationController.textGuest": "Guest",
   "DE.ApplicationController.textLoadingDocument": "Loading document",
   "DE.ApplicationController.textNext": "Next Field",
   "DE.ApplicationController.textOf": "of",
+  "DE.ApplicationController.textRequired": "Fill all required fields to send form.",
   "DE.ApplicationController.textSubmit": "Submit",
   "DE.ApplicationController.textSubmited": "<b>Form submitted successfully</b><br>Click to close the tip",
   "DE.ApplicationController.txtClose": "Close",
   "DE.ApplicationController.unknownErrorText": "Unknown error.",
   "DE.ApplicationController.unsupportedBrowserErrorText": "Your browser is not supported.",
   "DE.ApplicationController.waitText": "Please, wait...",
-  "DE.ApplicationController.textRequired": "Fill all required fields to send form.",
-  "DE.ApplicationController.textGotIt": "Got it",
   "DE.ApplicationView.txtDownload": "Download",
   "DE.ApplicationView.txtDownloadDocx": "Download as docx",
   "DE.ApplicationView.txtDownloadPdf": "Download as pdf",
diff --git a/apps/documenteditor/main/locale/el.json b/apps/documenteditor/main/locale/el.json
index 2a6409d74..cfe438cef 100644
--- a/apps/documenteditor/main/locale/el.json
+++ b/apps/documenteditor/main/locale/el.json
@@ -370,6 +370,7 @@
   "Common.Views.ReviewChanges.txtCommentRemMy": "Αφαίρεση των Σχολίων Μου",
   "Common.Views.ReviewChanges.txtCommentRemMyCurrent": "Αφαίρεση Πρόσφατων Σχολίων Μου",
   "Common.Views.ReviewChanges.txtCommentRemove": "Αφαίρεση",
+  "Common.Views.ReviewChanges.txtCommentResolve": "Επίλυση",
   "Common.Views.ReviewChanges.txtCommentResolveAll": "Επίλυση όλων των σχολίων",
   "Common.Views.ReviewChanges.txtCommentResolveCurrent": "Επίλυση των τρεχόντων σχολίων",
   "Common.Views.ReviewChanges.txtCommentResolveMy": "Επίλυση των σχολίων μου",
@@ -1688,7 +1689,7 @@
   "DE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "Θα χρειαστεί να αποδεχτείτε τις αλλαγές προτού τις δείτε",
   "DE.Views.FileMenuPanels.Settings.strFast": "Γρήγορη",
   "DE.Views.FileMenuPanels.Settings.strFontRender": "Βελτιστοποίηση Γραμματοσειράς",
-  "DE.Views.FileMenuPanels.Settings.strForcesave": "Πάντα να αποθηκεύεται σε διακομιστή (διαφορετικά αποθηκεύεται στο διακομιστή κατά το κλείσιμο του εγγράφου)",
+  "DE.Views.FileMenuPanels.Settings.strForcesave": "Προσθήκη έκδοσης στο χώρο αποθήκευσης μετά την Αποθήκευση ή Ctrl+S",
   "DE.Views.FileMenuPanels.Settings.strInputMode": "Ενεργοποίηση ιερογλυφικών",
   "DE.Views.FileMenuPanels.Settings.strLiveComment": "Ενεργοποίηση προβολής σχολίων",
   "DE.Views.FileMenuPanels.Settings.strMacrosSettings": "Ρυθμίσεις Mακροεντολών",
@@ -1710,7 +1711,7 @@
   "DE.Views.FileMenuPanels.Settings.textAutoSave": "Αυτόματη αποθήκευση",
   "DE.Views.FileMenuPanels.Settings.textCompatible": "Συμβατότητα",
   "DE.Views.FileMenuPanels.Settings.textDisabled": "Απενεργοποιημένο",
-  "DE.Views.FileMenuPanels.Settings.textForceSave": "Αποθήκευση στον Διακομιστή",
+  "DE.Views.FileMenuPanels.Settings.textForceSave": "Αποθήκευση ενδιάμεσων εκδόσεων",
   "DE.Views.FileMenuPanels.Settings.textMinute": "Κάθε Λεπτό",
   "DE.Views.FileMenuPanels.Settings.textOldVersions": "Τα αρχεία να γίνονται συμβατά με παλαιότερες εκδόσεις MS Word όταν αποθηκεύονται ως DOCX",
   "DE.Views.FileMenuPanels.Settings.txtAll": "Προβολή Όλων",
@@ -1745,6 +1746,7 @@
   "DE.Views.FormSettings.textDisconnect": "Αποσύνδεση",
   "DE.Views.FormSettings.textDropDown": "Πτυσσόμενη Λίστα",
   "DE.Views.FormSettings.textField": "Πεδίο Κειμένου",
+  "DE.Views.FormSettings.textFixed": "Πεδίο σταθερού μεγέθους",
   "DE.Views.FormSettings.textFromFile": "Από Αρχείο",
   "DE.Views.FormSettings.textFromStorage": "Από Αποθηκευτικό Χώρο",
   "DE.Views.FormSettings.textFromUrl": "Από διεύθυνση URL",
@@ -2473,8 +2475,13 @@
   "DE.Views.TableSettingsAdvanced.txtNoBorders": "Χωρίς περιγράμματα",
   "DE.Views.TableSettingsAdvanced.txtPercent": "Επί τοις εκατό",
   "DE.Views.TableSettingsAdvanced.txtPt": "Σημείο",
+  "DE.Views.TableToTextDialog.textEmpty": "Πρέπει να εισάγετε έναν χαρακτήρα για το προσαρμοσμένο διαχωριστικό.",
   "DE.Views.TableToTextDialog.textNested": "Μετατροπή εμφωλευμένων πινάκων",
   "DE.Views.TableToTextDialog.textOther": "Άλλο",
+  "DE.Views.TableToTextDialog.textPara": "Σημεία παραγράφων",
+  "DE.Views.TableToTextDialog.textSemicolon": "Ερωτηματικό",
+  "DE.Views.TableToTextDialog.textSeparator": "Ξεχωρίστε το κείμενο με",
+  "DE.Views.TableToTextDialog.textTab": "Στηλοθέτες",
   "DE.Views.TableToTextDialog.textTitle": "Μετατροπή Πίνακα σε Κείμενο",
   "DE.Views.TextArtSettings.strColor": "Χρώμα",
   "DE.Views.TextArtSettings.strFill": "Γέμισμα",
@@ -2502,10 +2509,15 @@
   "DE.Views.TextToTableDialog.textAutofit": "Συμπεριφορά Αυτόματης Προσαρμογής",
   "DE.Views.TextToTableDialog.textColumns": "Στήλες",
   "DE.Views.TextToTableDialog.textContents": "Αυτόματη προσαρμογή στα περιεχόμενα",
+  "DE.Views.TextToTableDialog.textEmpty": "Πρέπει να εισάγετε έναν χαρακτήρα για το προσαρμοσμένο διαχωριστικό.",
   "DE.Views.TextToTableDialog.textFixed": "Σταθερό πλάτος στήλης",
   "DE.Views.TextToTableDialog.textOther": "Άλλο",
   "DE.Views.TextToTableDialog.textPara": "Παράγραφοι",
   "DE.Views.TextToTableDialog.textRows": "Γραμμές",
+  "DE.Views.TextToTableDialog.textSemicolon": "Ερωτηματικό",
+  "DE.Views.TextToTableDialog.textSeparator": "Ξεχωρίστε το κείμενο σε",
+  "DE.Views.TextToTableDialog.textTab": "Στηλοθέτες",
+  "DE.Views.TextToTableDialog.textTableSize": "Μέγεθος πίνακα",
   "DE.Views.TextToTableDialog.textTitle": "Μετατροπή Κειμένου σε Πίνακα",
   "DE.Views.TextToTableDialog.textWindow": "Αυτόματη προσαρμογή στο παράθυρο",
   "DE.Views.TextToTableDialog.txtAutoText": "Αυτόματα",
diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json
index 58614e740..22135ced5 100644
--- a/apps/documenteditor/main/locale/en.json
+++ b/apps/documenteditor/main/locale/en.json
@@ -1689,7 +1689,7 @@
   "DE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "You will need to accept changes before you can see them",
   "DE.Views.FileMenuPanels.Settings.strFast": "Fast",
   "DE.Views.FileMenuPanels.Settings.strFontRender": "Font Hinting",
-  "DE.Views.FileMenuPanels.Settings.strForcesave": "Always save to server (otherwise save to server on document close)",
+  "DE.Views.FileMenuPanels.Settings.strForcesave": "Add version to storage after clicking Save or Ctrl+S",
   "DE.Views.FileMenuPanels.Settings.strInputMode": "Turn on hieroglyphs",
   "DE.Views.FileMenuPanels.Settings.strLiveComment": "Turn on display of the comments",
   "DE.Views.FileMenuPanels.Settings.strMacrosSettings": "Macros Settings",
@@ -1711,7 +1711,7 @@
   "DE.Views.FileMenuPanels.Settings.textAutoSave": "Autosave",
   "DE.Views.FileMenuPanels.Settings.textCompatible": "Compatibility",
   "DE.Views.FileMenuPanels.Settings.textDisabled": "Disabled",
-  "DE.Views.FileMenuPanels.Settings.textForceSave": "Save to Server",
+  "DE.Views.FileMenuPanels.Settings.textForceSave": "Saving intermediate versions",
   "DE.Views.FileMenuPanels.Settings.textMinute": "Every Minute",
   "DE.Views.FileMenuPanels.Settings.textOldVersions": "Make the files compatible with older MS Word versions when saved as DOCX",
   "DE.Views.FileMenuPanels.Settings.txtAll": "View All",
@@ -1783,6 +1783,7 @@
   "DE.Views.FormsTab.textHighlight": "Highlight Settings",
   "DE.Views.FormsTab.textNewColor": "Add New Custom Color",
   "DE.Views.FormsTab.textNoHighlight": "No highlighting",
+  "DE.Views.FormsTab.textRequired": "Fill all required fields to send form.",
   "DE.Views.FormsTab.textSubmited": "Form submitted successfully",
   "DE.Views.FormsTab.tipCheckBox": "Insert checkbox",
   "DE.Views.FormsTab.tipComboBox": "Insert combo box",
@@ -1794,7 +1795,6 @@
   "DE.Views.FormsTab.tipSubmit": "Submit form",
   "DE.Views.FormsTab.tipTextField": "Insert text field",
   "DE.Views.FormsTab.tipViewForm": "View form",
-  "DE.Views.FormsTab.textRequired": "Fill all required fields to send form.",
   "DE.Views.HeaderFooterSettings.textBottomCenter": "Bottom center",
   "DE.Views.HeaderFooterSettings.textBottomLeft": "Bottom left",
   "DE.Views.HeaderFooterSettings.textBottomPage": "Bottom of Page",
diff --git a/apps/documenteditor/main/locale/es.json b/apps/documenteditor/main/locale/es.json
index 1f08bc52f..bb2a4e06d 100644
--- a/apps/documenteditor/main/locale/es.json
+++ b/apps/documenteditor/main/locale/es.json
@@ -182,7 +182,7 @@
   "Common.UI.SynchronizeTip.textSynchronize": "El documento ha sido cambiado por otro usuario.<br>Por favor haga clic para guardar sus cambios y recargue las actualizaciones.",
   "Common.UI.ThemeColorPalette.textStandartColors": "Colores estándar",
   "Common.UI.ThemeColorPalette.textThemeColors": "Colores de tema",
-  "Common.UI.Themes.txtThemeClassicLight": "Claro clásico",
+  "Common.UI.Themes.txtThemeClassicLight": "Clásico claro",
   "Common.UI.Themes.txtThemeDark": "Oscuro",
   "Common.UI.Themes.txtThemeLight": "Claro",
   "Common.UI.Window.cancelButtonText": "Cancelar",
@@ -1689,7 +1689,7 @@
   "DE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "Usted tendrá que aceptar los cambios antes de poder verlos",
   "DE.Views.FileMenuPanels.Settings.strFast": "rápido",
   "DE.Views.FileMenuPanels.Settings.strFontRender": "Hinting",
-  "DE.Views.FileMenuPanels.Settings.strForcesave": "Siempre guardar en el servidor (de lo contrario guardar en el servidor al cerrar documento)",
+  "DE.Views.FileMenuPanels.Settings.strForcesave": "Añadir la versión al almacenamiento después de hacer clic en Guardar o Ctrl+S",
   "DE.Views.FileMenuPanels.Settings.strInputMode": "Activar jeroglíficos",
   "DE.Views.FileMenuPanels.Settings.strLiveComment": "Activar opción de demostración de comentarios",
   "DE.Views.FileMenuPanels.Settings.strMacrosSettings": "Ajustes de macros",
@@ -1711,7 +1711,7 @@
   "DE.Views.FileMenuPanels.Settings.textAutoSave": "Guardar automáticamente",
   "DE.Views.FileMenuPanels.Settings.textCompatible": "Compatibilidad",
   "DE.Views.FileMenuPanels.Settings.textDisabled": "Desactivado",
-  "DE.Views.FileMenuPanels.Settings.textForceSave": "Guardar al Servidor",
+  "DE.Views.FileMenuPanels.Settings.textForceSave": "Guardar versiones intermedias",
   "DE.Views.FileMenuPanels.Settings.textMinute": "Cada minuto",
   "DE.Views.FileMenuPanels.Settings.textOldVersions": "Hacer que los archivos sean compatibles con versiones anteriores de MS Word cuando se guarden como DOCX",
   "DE.Views.FileMenuPanels.Settings.txtAll": "Ver todo",
diff --git a/apps/documenteditor/main/locale/fr.json b/apps/documenteditor/main/locale/fr.json
index 2a1df83ce..4452b337f 100644
--- a/apps/documenteditor/main/locale/fr.json
+++ b/apps/documenteditor/main/locale/fr.json
@@ -182,7 +182,7 @@
   "Common.UI.SynchronizeTip.textSynchronize": "Le document a été modifié par un autre utilisateur.<br>Cliquez pour enregistrer vos modifications et recharger les mises à jour.",
   "Common.UI.ThemeColorPalette.textStandartColors": "Couleurs standard",
   "Common.UI.ThemeColorPalette.textThemeColors": "Couleurs de thème",
-  "Common.UI.Themes.txtThemeClassicLight": "Clair classique",
+  "Common.UI.Themes.txtThemeClassicLight": "Classique clair",
   "Common.UI.Themes.txtThemeDark": "Sombre",
   "Common.UI.Themes.txtThemeLight": "Clair",
   "Common.UI.Window.cancelButtonText": "Annuler",
@@ -1689,7 +1689,7 @@
   "DE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "Avant de pouvoir afficher les modifications, vous avez besoin de les accépter ",
   "DE.Views.FileMenuPanels.Settings.strFast": "Rapide",
   "DE.Views.FileMenuPanels.Settings.strFontRender": "Hinting de la police",
-  "DE.Views.FileMenuPanels.Settings.strForcesave": "Toujours enregistrer sur le serveur ( sinon enregistrer sur le serveur lors de la fermeture du document )",
+  "DE.Views.FileMenuPanels.Settings.strForcesave": "Ajouter une version à l'espace de stockage en cliquant Enregistrer ou Ctrl+S",
   "DE.Views.FileMenuPanels.Settings.strInputMode": "Activer des hiéroglyphes",
   "DE.Views.FileMenuPanels.Settings.strLiveComment": "Activer l'affichage des commentaires",
   "DE.Views.FileMenuPanels.Settings.strMacrosSettings": "Réglages macros",
@@ -1711,7 +1711,7 @@
   "DE.Views.FileMenuPanels.Settings.textAutoSave": "Enregistrement automatique",
   "DE.Views.FileMenuPanels.Settings.textCompatible": "Compatibilité",
   "DE.Views.FileMenuPanels.Settings.textDisabled": "Désactivé",
-  "DE.Views.FileMenuPanels.Settings.textForceSave": "Enregistrer sur le serveur",
+  "DE.Views.FileMenuPanels.Settings.textForceSave": "Enregistrer des versions intermédiaires",
   "DE.Views.FileMenuPanels.Settings.textMinute": "Chaque minute",
   "DE.Views.FileMenuPanels.Settings.textOldVersions": "Rendre les fichiers compatibles avec les anciennes versions de MS Word lorsqu'ils sont enregistrés au format DOCX",
   "DE.Views.FileMenuPanels.Settings.txtAll": "Surligner toutes les modifications",
diff --git a/apps/documenteditor/main/locale/pt.json b/apps/documenteditor/main/locale/pt.json
index 28ff2d255..711516688 100644
--- a/apps/documenteditor/main/locale/pt.json
+++ b/apps/documenteditor/main/locale/pt.json
@@ -182,7 +182,7 @@
   "Common.UI.SynchronizeTip.textSynchronize": "O documento foi alterado por outro usuário.<br>Clique para salvar suas alterações e recarregar as atualizações.",
   "Common.UI.ThemeColorPalette.textStandartColors": "Cores padronizadas",
   "Common.UI.ThemeColorPalette.textThemeColors": "Cores de tema",
-  "Common.UI.Themes.txtThemeClassicLight": "Claro clássico",
+  "Common.UI.Themes.txtThemeClassicLight": "Clássico claro",
   "Common.UI.Themes.txtThemeDark": "Escuro",
   "Common.UI.Themes.txtThemeLight": "Claro",
   "Common.UI.Window.cancelButtonText": "Cancelar",
diff --git a/apps/documenteditor/main/locale/ro.json b/apps/documenteditor/main/locale/ro.json
index af2967761..895228b08 100644
--- a/apps/documenteditor/main/locale/ro.json
+++ b/apps/documenteditor/main/locale/ro.json
@@ -182,7 +182,7 @@
   "Common.UI.SynchronizeTip.textSynchronize": "Documentul a fost modificat de către un alt utilizator.<br>Salvați modificările făcute de dumneavoastră și reîmprospătați documentul.",
   "Common.UI.ThemeColorPalette.textStandartColors": "Culori standard",
   "Common.UI.ThemeColorPalette.textThemeColors": "Culori temă",
-  "Common.UI.Themes.txtThemeClassicLight": "Luminos Clasic",
+  "Common.UI.Themes.txtThemeClassicLight": "Clasic Luminos",
   "Common.UI.Themes.txtThemeDark": "Întunecat",
   "Common.UI.Themes.txtThemeLight": "Luminos",
   "Common.UI.Window.cancelButtonText": "Revocare",
@@ -206,10 +206,12 @@
   "Common.Views.About.txtVersion": "Versiune",
   "Common.Views.AutoCorrectDialog.textAdd": "Adaugă",
   "Common.Views.AutoCorrectDialog.textApplyText": "Se aplică în timp ce tastați",
+  "Common.Views.AutoCorrectDialog.textAutoCorrect": "AutoCorecție",
   "Common.Views.AutoCorrectDialog.textAutoFormat": "Formatare automată la tastare",
   "Common.Views.AutoCorrectDialog.textBulleted": "Creare automată a listei cu marcatori",
   "Common.Views.AutoCorrectDialog.textBy": "După",
   "Common.Views.AutoCorrectDialog.textDelete": "Ștergere",
+  "Common.Views.AutoCorrectDialog.textFLSentence": "Scrie cu majusculă prima literă a propoziției",
   "Common.Views.AutoCorrectDialog.textHyphens": "Cratime (--) cu linie de dialog (—)",
   "Common.Views.AutoCorrectDialog.textMathCorrect": "Autocorecție matematică",
   "Common.Views.AutoCorrectDialog.textNumbered": "Creare automată a listei numerotate",
@@ -346,6 +348,8 @@
   "Common.Views.ReviewChanges.tipCoAuthMode": "Activare modul de colaborare",
   "Common.Views.ReviewChanges.tipCommentRem": "Ștergere comentarii",
   "Common.Views.ReviewChanges.tipCommentRemCurrent": "Se șterg aceste comentarii",
+  "Common.Views.ReviewChanges.tipCommentResolve": "Soluționare comentarii",
+  "Common.Views.ReviewChanges.tipCommentResolveCurrent": "Soluționarea comentariilor curente",
   "Common.Views.ReviewChanges.tipCompare": "Comparați acest document cu altul",
   "Common.Views.ReviewChanges.tipHistory": "Afișare istoricul versiunei",
   "Common.Views.ReviewChanges.tipRejectCurrent": "Respinge modificare",
@@ -366,6 +370,11 @@
   "Common.Views.ReviewChanges.txtCommentRemMy": "Se șterg comentariile mele",
   "Common.Views.ReviewChanges.txtCommentRemMyCurrent": "Se șterg comentariile mele curente",
   "Common.Views.ReviewChanges.txtCommentRemove": "Ștergere",
+  "Common.Views.ReviewChanges.txtCommentResolve": "Rezolvare",
+  "Common.Views.ReviewChanges.txtCommentResolveAll": "Marchează toate comentarii ca soluționate",
+  "Common.Views.ReviewChanges.txtCommentResolveCurrent": "Soluționarea comentariilor curente",
+  "Common.Views.ReviewChanges.txtCommentResolveMy": "Soluționarea comentariilor mele",
+  "Common.Views.ReviewChanges.txtCommentResolveMyCurrent": "Soluționarea comentariilor mele curente",
   "Common.Views.ReviewChanges.txtCompare": "Comparare",
   "Common.Views.ReviewChanges.txtDocLang": "Limbă",
   "Common.Views.ReviewChanges.txtFinal": "Toate modificările sunt acceptate (Previzualizare)",
@@ -526,6 +535,7 @@
   "DE.Controllers.Main.errorUsersExceed": "Limita de utilizatori stipulată de planul tarifar a fost depășită",
   "DE.Controllers.Main.errorViewerDisconnect": "Conexiunea a fost pierdută. Încă mai puteți vizualiza documentul,<br>dar nu și să-l descărcați sau imprimați până când conexiunea se restabilește și pagina se reîmprospătează.",
   "DE.Controllers.Main.leavePageText": "Nu ați salvat modificările din documentul. Faceți clic pe Rămâi în pagină și apoi pe Salvare dacă doriți să le salvați. Faceți clic pe Părăsește aceasta pagina ca să renunțați la toate modificările nesalvate.",
+  "DE.Controllers.Main.leavePageTextOnClose": "Toate modificările nesalvate din documentul vor fi pierdute.<br> Pentru a le salva, faceți clic pe Revocare și apoi pe Salvare. Apăsați OK dacă doriți să renunțați la modificările nesalvate.",
   "DE.Controllers.Main.loadFontsTextText": "Încărcarea datelor...",
   "DE.Controllers.Main.loadFontsTitleText": "Încărcare date",
   "DE.Controllers.Main.loadFontTextText": "Încărcarea datelor...",
@@ -581,6 +591,7 @@
   "DE.Controllers.Main.textShape": "Forma",
   "DE.Controllers.Main.textStrict": "Modul strict",
   "DE.Controllers.Main.textTryUndoRedo": "Funcții Anulare/Refacere sunt dezactivate în modul Rapid de editare colaborativă.<br>Faceți clic pe Modul strict ca să comutați la modul Strict de editare colaborativă și să nu intrați în conflict cu alte persoane. Toate modificările vor fi trimise numai după ce le salvați. Ulilizati Setări avansate ale editorului ca să comutați între moduri de editare colaborativă. ",
+  "DE.Controllers.Main.textTryUndoRedoWarn": "Funcții Anulare/Refacere sunt dezactivate în modul Rapid de editare colaborativă.",
   "DE.Controllers.Main.titleLicenseExp": "Licența a expirat",
   "DE.Controllers.Main.titleServerVersion": "Editorul a fost actualizat",
   "DE.Controllers.Main.titleUpdateVersion": "Versiunea s-a modificat",
@@ -614,6 +625,7 @@
   "DE.Controllers.Main.txtMissArg": "Argumentul lipsește",
   "DE.Controllers.Main.txtMissOperator": "Operatorul lipsește",
   "DE.Controllers.Main.txtNeedSynchronize": "Aveți actualizări disponibile",
+  "DE.Controllers.Main.txtNone": "Niciunul",
   "DE.Controllers.Main.txtNoTableOfContents": "Documentul nu are anteturi. Aplicați un stil de titlu pentru textul care va fi inclus în cuprins.",
   "DE.Controllers.Main.txtNoTableOfFigures": "Nu s-a găsit nici o rubrică din tabel de figuri",
   "DE.Controllers.Main.txtNoText": "Eroare! Textul formatat cu stilul specificat nu este găsit în document.",
@@ -1677,7 +1689,7 @@
   "DE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "Pentru a vizualiza modificările, trebuie mai întâi să le acceptați",
   "DE.Views.FileMenuPanels.Settings.strFast": "Rapid",
   "DE.Views.FileMenuPanels.Settings.strFontRender": "Sugestie font",
-  "DE.Views.FileMenuPanels.Settings.strForcesave": "Se salvează întotdeauna pe server (altfel utilizați metoda document close pentru salvare)",
+  "DE.Views.FileMenuPanels.Settings.strForcesave": "Versiunea se adaugă la stocarea după ce faceți clic pe Salvare sau Ctrl+S",
   "DE.Views.FileMenuPanels.Settings.strInputMode": "Activare hieroglife",
   "DE.Views.FileMenuPanels.Settings.strLiveComment": "Activarea afișare comentarii",
   "DE.Views.FileMenuPanels.Settings.strMacrosSettings": "Setări macrocomandă",
@@ -1699,7 +1711,7 @@
   "DE.Views.FileMenuPanels.Settings.textAutoSave": "Salvare automată",
   "DE.Views.FileMenuPanels.Settings.textCompatible": "Compatibilitate",
   "DE.Views.FileMenuPanels.Settings.textDisabled": "Dezactivat",
-  "DE.Views.FileMenuPanels.Settings.textForceSave": "Salvare pe server",
+  "DE.Views.FileMenuPanels.Settings.textForceSave": "Salvarea versiunilor intermediare",
   "DE.Views.FileMenuPanels.Settings.textMinute": "La fiecare minută",
   "DE.Views.FileMenuPanels.Settings.textOldVersions": "Faceți ca fișierele salvate în formatul DOCX să fie compatibile cu versiunile mai vechi ale MS Word ",
   "DE.Views.FileMenuPanels.Settings.txtAll": "Vizualizare toate",
@@ -1734,6 +1746,7 @@
   "DE.Views.FormSettings.textDisconnect": "Deconectare",
   "DE.Views.FormSettings.textDropDown": "Derulant",
   "DE.Views.FormSettings.textField": "Câmp text",
+  "DE.Views.FormSettings.textFixed": "Câmpul cu dimensiunea fixă ",
   "DE.Views.FormSettings.textFromFile": "Din fișier",
   "DE.Views.FormSettings.textFromStorage": "Din serviciul stocare",
   "DE.Views.FormSettings.textFromUrl": "Prin URL-ul",
@@ -1745,6 +1758,7 @@
   "DE.Views.FormSettings.textNoBorder": "Fără bordură",
   "DE.Views.FormSettings.textPlaceholder": "Substituent",
   "DE.Views.FormSettings.textRadiobox": "Buton opțiune",
+  "DE.Views.FormSettings.textRequired": "Obligatoriu",
   "DE.Views.FormSettings.textSelectImage": "Selectați imaginea",
   "DE.Views.FormSettings.textTip": "Tip",
   "DE.Views.FormSettings.textTipAdd": "Se adaugă o valoare nouă",
@@ -2356,6 +2370,7 @@
   "DE.Views.TableSettings.textBorders": "Stil borduri",
   "DE.Views.TableSettings.textCellSize": "Dimensiune rânduri și coloane",
   "DE.Views.TableSettings.textColumns": "Coloane",
+  "DE.Views.TableSettings.textConvert": "Conversie tabel în text",
   "DE.Views.TableSettings.textDistributeCols": "Distribuire coloane",
   "DE.Views.TableSettings.textDistributeRows": "Distribuire rânduri",
   "DE.Views.TableSettings.textEdit": "Rânduri și coloane",
@@ -2460,7 +2475,14 @@
   "DE.Views.TableSettingsAdvanced.txtNoBorders": "Fără borduri",
   "DE.Views.TableSettingsAdvanced.txtPercent": "Procent",
   "DE.Views.TableSettingsAdvanced.txtPt": "Punct",
+  "DE.Views.TableToTextDialog.textEmpty": "Introduceți caracterul separator particularizat.",
+  "DE.Views.TableToTextDialog.textNested": "Conversia tabelelor imbricate",
   "DE.Views.TableToTextDialog.textOther": "Altă",
+  "DE.Views.TableToTextDialog.textPara": "Semne de paragraf",
+  "DE.Views.TableToTextDialog.textSemicolon": "Semicoloană",
+  "DE.Views.TableToTextDialog.textSeparator": "Separator",
+  "DE.Views.TableToTextDialog.textTab": "Tabulatori",
+  "DE.Views.TableToTextDialog.textTitle": "Conversie tabel în text",
   "DE.Views.TextArtSettings.strColor": "Culoare",
   "DE.Views.TextArtSettings.strFill": "Umplere",
   "DE.Views.TextArtSettings.strSize": "Dimensiune",
@@ -2484,7 +2506,21 @@
   "DE.Views.TextArtSettings.tipAddGradientPoint": "Adăugare stop gradient",
   "DE.Views.TextArtSettings.tipRemoveGradientPoint": "Eliminare stop gradient",
   "DE.Views.TextArtSettings.txtNoBorders": "Fără linie",
+  "DE.Views.TextToTableDialog.textAutofit": "Comportament potrivire automată",
+  "DE.Views.TextToTableDialog.textColumns": "Coloane",
+  "DE.Views.TextToTableDialog.textContents": "Potrivire automată conținut",
+  "DE.Views.TextToTableDialog.textEmpty": "Introduceți caracterul separator particularizat.",
+  "DE.Views.TextToTableDialog.textFixed": "Lățime fixă a coloanei",
   "DE.Views.TextToTableDialog.textOther": "Altă",
+  "DE.Views.TextToTableDialog.textPara": "Paragrafe",
+  "DE.Views.TextToTableDialog.textRows": "Rânduri",
+  "DE.Views.TextToTableDialog.textSemicolon": "Semicoloană",
+  "DE.Views.TextToTableDialog.textSeparator": "Separarea textului la",
+  "DE.Views.TextToTableDialog.textTab": "Tabulatori",
+  "DE.Views.TextToTableDialog.textTableSize": "Dimensiune tabel",
+  "DE.Views.TextToTableDialog.textTitle": "Conversie text în tabel",
+  "DE.Views.TextToTableDialog.textWindow": "Potrivire automată fereastră",
+  "DE.Views.TextToTableDialog.txtAutoText": "Automat",
   "DE.Views.Toolbar.capBtnAddComment": "Adaugă comentariu",
   "DE.Views.Toolbar.capBtnBlankPage": "Pagina necompletată",
   "DE.Views.Toolbar.capBtnColumns": "Coloane",
@@ -2528,6 +2564,7 @@
   "DE.Views.Toolbar.mniImageFromUrl": "Imaginea prin URL",
   "DE.Views.Toolbar.mniLowerCase": "minuscule",
   "DE.Views.Toolbar.mniSentenceCase": "Tip propoziție.",
+  "DE.Views.Toolbar.mniTextToTable": "Conversie text în tabel",
   "DE.Views.Toolbar.mniToggleCase": "cOMURARE LITERE MARI/MICI.",
   "DE.Views.Toolbar.mniUpperCase": "MAJUSCULE",
   "DE.Views.Toolbar.strMenuNoFill": "Fără umplere",
diff --git a/apps/documenteditor/main/locale/ru.json b/apps/documenteditor/main/locale/ru.json
index 0f4faf0aa..261e06c30 100644
--- a/apps/documenteditor/main/locale/ru.json
+++ b/apps/documenteditor/main/locale/ru.json
@@ -182,7 +182,7 @@
   "Common.UI.SynchronizeTip.textSynchronize": "Документ изменен другим пользователем.<br>Нажмите, чтобы сохранить свои изменения и загрузить обновления.",
   "Common.UI.ThemeColorPalette.textStandartColors": "Стандартные цвета",
   "Common.UI.ThemeColorPalette.textThemeColors": "Цвета темы",
-  "Common.UI.Themes.txtThemeClassicLight": "Светлая классическая",
+  "Common.UI.Themes.txtThemeClassicLight": "Классическая светлая",
   "Common.UI.Themes.txtThemeDark": "Темная",
   "Common.UI.Themes.txtThemeLight": "Светлая",
   "Common.UI.Window.cancelButtonText": "Отмена",
@@ -1689,7 +1689,7 @@
   "DE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "Прежде чем вы сможете увидеть изменения, их надо будет принять",
   "DE.Views.FileMenuPanels.Settings.strFast": "Быстрый",
   "DE.Views.FileMenuPanels.Settings.strFontRender": "Хинтинг шрифтов",
-  "DE.Views.FileMenuPanels.Settings.strForcesave": "Всегда сохранять на сервере (в противном случае сохранять на сервере при закрытии документа)",
+  "DE.Views.FileMenuPanels.Settings.strForcesave": "Добавлять версию в хранилище после нажатия кнопки Сохранить или Ctrl+S",
   "DE.Views.FileMenuPanels.Settings.strInputMode": "Включить иероглифы",
   "DE.Views.FileMenuPanels.Settings.strLiveComment": "Включить отображение комментариев в тексте",
   "DE.Views.FileMenuPanels.Settings.strMacrosSettings": "Настройки макросов",
@@ -1711,7 +1711,7 @@
   "DE.Views.FileMenuPanels.Settings.textAutoSave": "Автосохранение",
   "DE.Views.FileMenuPanels.Settings.textCompatible": "Совместимость",
   "DE.Views.FileMenuPanels.Settings.textDisabled": "Отключено",
-  "DE.Views.FileMenuPanels.Settings.textForceSave": "Сохранять на сервере",
+  "DE.Views.FileMenuPanels.Settings.textForceSave": "Сохранение промежуточных версий",
   "DE.Views.FileMenuPanels.Settings.textMinute": "Каждую минуту",
   "DE.Views.FileMenuPanels.Settings.textOldVersions": "Сделать файлы совместимыми с более старыми версиями MS Word при сохранении как DOCX",
   "DE.Views.FileMenuPanels.Settings.txtAll": "Все",
diff --git a/apps/documenteditor/main/locale/zh.json b/apps/documenteditor/main/locale/zh.json
index a88cbe0cc..e36c42a85 100644
--- a/apps/documenteditor/main/locale/zh.json
+++ b/apps/documenteditor/main/locale/zh.json
@@ -755,7 +755,7 @@
   "DE.Controllers.Main.txtXAxis": "X轴",
   "DE.Controllers.Main.txtYAxis": "Y轴",
   "DE.Controllers.Main.txtZeroDivide": "除数为零",
-  "DE.Controllers.Main.unknownErrorText": "示知错误",
+  "DE.Controllers.Main.unknownErrorText": "未知错误",
   "DE.Controllers.Main.unsupportedBrowserErrorText": "您的浏览器不受支持",
   "DE.Controllers.Main.uploadDocExtMessage": "未知的文档格式",
   "DE.Controllers.Main.uploadDocFileCountMessage": "没有文档上载了",
diff --git a/apps/presentationeditor/main/locale/de.json b/apps/presentationeditor/main/locale/de.json
index a4d838038..8728d69f5 100644
--- a/apps/presentationeditor/main/locale/de.json
+++ b/apps/presentationeditor/main/locale/de.json
@@ -1182,7 +1182,7 @@
   "PE.Views.DocumentHolder.txtBorderProps": "Rahmeneigenschaften",
   "PE.Views.DocumentHolder.txtBottom": "Unten",
   "PE.Views.DocumentHolder.txtChangeLayout": "Layout ändern",
-  "PE.Views.DocumentHolder.txtChangeTheme": "Thema ändern",
+  "PE.Views.DocumentHolder.txtChangeTheme": "Design ändern",
   "PE.Views.DocumentHolder.txtColumnAlign": "Spaltenausrichtung",
   "PE.Views.DocumentHolder.txtDecreaseArg": "Argumentgröße reduzieren",
   "PE.Views.DocumentHolder.txtDeleteArg": "Argument löschen",
diff --git a/apps/presentationeditor/main/locale/el.json b/apps/presentationeditor/main/locale/el.json
index 6f73c9965..c5fe20844 100644
--- a/apps/presentationeditor/main/locale/el.json
+++ b/apps/presentationeditor/main/locale/el.json
@@ -1088,7 +1088,7 @@
   "PE.Views.DocumentHolder.addCommentText": "Προσθήκη Σχολίου",
   "PE.Views.DocumentHolder.addToLayoutText": "Προσθήκη στη Διάταξη",
   "PE.Views.DocumentHolder.advancedImageText": "Προηγμένες Ρυθμίσεις Εικόνας",
-  "PE.Views.DocumentHolder.advancedParagraphText": "Προηγμένες Ρυθμίσεις Κειμένου",
+  "PE.Views.DocumentHolder.advancedParagraphText": "Προηγμένες Ρυθμίσεις Παραγράφου",
   "PE.Views.DocumentHolder.advancedShapeText": "Προηγμένες Ρυθμίσεις Σχήματος",
   "PE.Views.DocumentHolder.advancedTableText": "Προηγμένες Ρυθμίσεις Πίνακα",
   "PE.Views.DocumentHolder.alignmentText": "Στοίχιση",
@@ -1334,7 +1334,7 @@
   "PE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "Θα χρειαστεί να αποδεχτείτε αλλαγές πριν να τις δείτε",
   "PE.Views.FileMenuPanels.Settings.strFast": "Γρήγορη",
   "PE.Views.FileMenuPanels.Settings.strFontRender": "Βελτιστοποίηση Γραμματοσειράς",
-  "PE.Views.FileMenuPanels.Settings.strForcesave": "Πάντα να αποθηκεύεται σε διακομιστή (διαφορετικά αποθηκεύεται στο διακομιστή κατά το κλείσιμο του εγγράφου)",
+  "PE.Views.FileMenuPanels.Settings.strForcesave": "Προσθήκη έκδοσης στο χώρο αποθήκευσης μετά την Αποθήκευση ή Ctrl+S",
   "PE.Views.FileMenuPanels.Settings.strInputMode": "Ενεργοποίηση ιερογλυφικών",
   "PE.Views.FileMenuPanels.Settings.strMacrosSettings": "Ρυθμίσεις Mακροεντολών",
   "PE.Views.FileMenuPanels.Settings.strPaste": "Αποκοπή, αντιγραφή και επικόλληση",
@@ -1353,7 +1353,7 @@
   "PE.Views.FileMenuPanels.Settings.textAutoRecover": "Αυτόματη ανάκτηση",
   "PE.Views.FileMenuPanels.Settings.textAutoSave": "Αυτόματη αποθήκευση",
   "PE.Views.FileMenuPanels.Settings.textDisabled": "Απενεργοποιημένο",
-  "PE.Views.FileMenuPanels.Settings.textForceSave": "Αποθήκευση στον Διακομιστή",
+  "PE.Views.FileMenuPanels.Settings.textForceSave": "Αποθήκευση ενδιάμεσων εκδόσεων",
   "PE.Views.FileMenuPanels.Settings.textMinute": "Κάθε Λεπτό",
   "PE.Views.FileMenuPanels.Settings.txtAll": "Προβολή Όλων",
   "PE.Views.FileMenuPanels.Settings.txtAutoCorrect": "Επιλογής αυτόματης διόρθωσης...",
@@ -1509,7 +1509,7 @@
   "PE.Views.ParagraphSettingsAdvanced.txtAutoText": "Αυτόματα",
   "PE.Views.RightMenu.txtChartSettings": "Ρυθμίσεις γραφήματος",
   "PE.Views.RightMenu.txtImageSettings": "Ρυθμίσεις εικόνας",
-  "PE.Views.RightMenu.txtParagraphSettings": "Ρυθμίσεις κειμένου",
+  "PE.Views.RightMenu.txtParagraphSettings": "Ρυθμίσεις Παραγράφου",
   "PE.Views.RightMenu.txtShapeSettings": "Ρυθμίσεις σχήματος",
   "PE.Views.RightMenu.txtSignatureSettings": "Ρυθμίσεις υπογραφής",
   "PE.Views.RightMenu.txtSlideSettings": "Ρυθμίσεις διαφάνειας",
diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json
index a9aa5ed54..922388c7c 100644
--- a/apps/presentationeditor/main/locale/en.json
+++ b/apps/presentationeditor/main/locale/en.json
@@ -1334,7 +1334,7 @@
   "PE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "You will need to accept changes before you can see them",
   "PE.Views.FileMenuPanels.Settings.strFast": "Fast",
   "PE.Views.FileMenuPanels.Settings.strFontRender": "Font Hinting",
-  "PE.Views.FileMenuPanels.Settings.strForcesave": "Always save to server (otherwise save to server on document close)",
+  "PE.Views.FileMenuPanels.Settings.strForcesave": "Add version to storage after clicking Save or Ctrl+S",
   "PE.Views.FileMenuPanels.Settings.strInputMode": "Turn on hieroglyphs",
   "PE.Views.FileMenuPanels.Settings.strMacrosSettings": "Macros Settings",
   "PE.Views.FileMenuPanels.Settings.strPaste": "Cut, copy and paste",
@@ -1353,7 +1353,7 @@
   "PE.Views.FileMenuPanels.Settings.textAutoRecover": "Autorecover",
   "PE.Views.FileMenuPanels.Settings.textAutoSave": "Autosave",
   "PE.Views.FileMenuPanels.Settings.textDisabled": "Disabled",
-  "PE.Views.FileMenuPanels.Settings.textForceSave": "Save to Server",
+  "PE.Views.FileMenuPanels.Settings.textForceSave": "Saving intermediate versions",
   "PE.Views.FileMenuPanels.Settings.textMinute": "Every Minute",
   "PE.Views.FileMenuPanels.Settings.txtAll": "View All",
   "PE.Views.FileMenuPanels.Settings.txtAutoCorrect": "AutoCorrect options...",
diff --git a/apps/presentationeditor/main/locale/es.json b/apps/presentationeditor/main/locale/es.json
index 120196578..69f1d3545 100644
--- a/apps/presentationeditor/main/locale/es.json
+++ b/apps/presentationeditor/main/locale/es.json
@@ -75,7 +75,7 @@
   "Common.UI.SynchronizeTip.textSynchronize": "El documento ha sido cambiado por otro usuario.<br>Por favor haga clic para guardar sus cambios y recargue las actualizaciones.",
   "Common.UI.ThemeColorPalette.textStandartColors": "Colores estándar",
   "Common.UI.ThemeColorPalette.textThemeColors": "Colores de tema",
-  "Common.UI.Themes.txtThemeClassicLight": "Claro clásico",
+  "Common.UI.Themes.txtThemeClassicLight": "Clásico claro",
   "Common.UI.Themes.txtThemeDark": "Oscuro",
   "Common.UI.Themes.txtThemeLight": "Claro",
   "Common.UI.Window.cancelButtonText": "Cancelar",
@@ -1088,7 +1088,7 @@
   "PE.Views.DocumentHolder.addCommentText": "Añadir comentario",
   "PE.Views.DocumentHolder.addToLayoutText": "Añadir al Diseño",
   "PE.Views.DocumentHolder.advancedImageText": "Ajustes avanzados de imagen",
-  "PE.Views.DocumentHolder.advancedParagraphText": "Ajustes avanzados de texto",
+  "PE.Views.DocumentHolder.advancedParagraphText": "Ajustes avanzados de párrafo",
   "PE.Views.DocumentHolder.advancedShapeText": "Ajustes avanzados de forma",
   "PE.Views.DocumentHolder.advancedTableText": "Ajustes avanzados de tabla",
   "PE.Views.DocumentHolder.alignmentText": "Alineación",
@@ -1334,7 +1334,7 @@
   "PE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "Usted tendrá que aceptar los cambios antes de poder verlos",
   "PE.Views.FileMenuPanels.Settings.strFast": "rápido",
   "PE.Views.FileMenuPanels.Settings.strFontRender": "Hinting",
-  "PE.Views.FileMenuPanels.Settings.strForcesave": "Siempre guardar en el servidor (de lo contrario guardar en el servidor al cerrar documento)",
+  "PE.Views.FileMenuPanels.Settings.strForcesave": "Añadir la versión al almacenamiento después de hacer clic en Guardar o Ctrl+S",
   "PE.Views.FileMenuPanels.Settings.strInputMode": "Activar jeroglíficos",
   "PE.Views.FileMenuPanels.Settings.strMacrosSettings": "Ajustes de macros",
   "PE.Views.FileMenuPanels.Settings.strPaste": "Cortar, copiar y pegar",
@@ -1353,7 +1353,7 @@
   "PE.Views.FileMenuPanels.Settings.textAutoRecover": "Autorrecuperación",
   "PE.Views.FileMenuPanels.Settings.textAutoSave": "Guardar automáticamente",
   "PE.Views.FileMenuPanels.Settings.textDisabled": "Desactivado",
-  "PE.Views.FileMenuPanels.Settings.textForceSave": "Guardar al servidor",
+  "PE.Views.FileMenuPanels.Settings.textForceSave": "Guardar versiones intermedias",
   "PE.Views.FileMenuPanels.Settings.textMinute": "Cada minuto",
   "PE.Views.FileMenuPanels.Settings.txtAll": "Ver todo",
   "PE.Views.FileMenuPanels.Settings.txtAutoCorrect": "Opciones de autocorrección",
@@ -1509,7 +1509,7 @@
   "PE.Views.ParagraphSettingsAdvanced.txtAutoText": "Auto",
   "PE.Views.RightMenu.txtChartSettings": "Ajustes de gráfico",
   "PE.Views.RightMenu.txtImageSettings": "Ajustes de imagen",
-  "PE.Views.RightMenu.txtParagraphSettings": "Ajustes de texto",
+  "PE.Views.RightMenu.txtParagraphSettings": "Ajustes de párrafo",
   "PE.Views.RightMenu.txtShapeSettings": "Ajustes de forma",
   "PE.Views.RightMenu.txtSignatureSettings": "Configuración de firma",
   "PE.Views.RightMenu.txtSlideSettings": "Ajustes de diapositiva",
diff --git a/apps/presentationeditor/main/locale/fr.json b/apps/presentationeditor/main/locale/fr.json
index bf28fbc38..0e10003f8 100644
--- a/apps/presentationeditor/main/locale/fr.json
+++ b/apps/presentationeditor/main/locale/fr.json
@@ -75,7 +75,7 @@
   "Common.UI.SynchronizeTip.textSynchronize": "Le document a été modifié par un autre utilisateur.<br>Cliquez pour enregistrer vos modifications et recharger les mises à jour.",
   "Common.UI.ThemeColorPalette.textStandartColors": "Couleurs standard",
   "Common.UI.ThemeColorPalette.textThemeColors": "Couleurs de thème",
-  "Common.UI.Themes.txtThemeClassicLight": "Clair classique",
+  "Common.UI.Themes.txtThemeClassicLight": "Classique clair",
   "Common.UI.Themes.txtThemeDark": "Sombre",
   "Common.UI.Themes.txtThemeLight": "Clair",
   "Common.UI.Window.cancelButtonText": "Annuler",
@@ -1334,7 +1334,7 @@
   "PE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "Avant de pouvoir afficher les modifications, vous avez besoin de les accépter ",
   "PE.Views.FileMenuPanels.Settings.strFast": "Rapide",
   "PE.Views.FileMenuPanels.Settings.strFontRender": "Hinting de la police",
-  "PE.Views.FileMenuPanels.Settings.strForcesave": "Toujours enregistrer sur le serveur ( sinon enregistrer sur le serveur lors de la fermeture du document )",
+  "PE.Views.FileMenuPanels.Settings.strForcesave": "Ajouter une version dans l'espace de stockage en cliquant Enregistrer ou Ctrl+S",
   "PE.Views.FileMenuPanels.Settings.strInputMode": "Activer les hiéroglyphes",
   "PE.Views.FileMenuPanels.Settings.strMacrosSettings": "Réglages macros",
   "PE.Views.FileMenuPanels.Settings.strPaste": "Couper, copier et coller",
@@ -1353,7 +1353,7 @@
   "PE.Views.FileMenuPanels.Settings.textAutoRecover": "Récupération automatique",
   "PE.Views.FileMenuPanels.Settings.textAutoSave": "Enregistrement automatique",
   "PE.Views.FileMenuPanels.Settings.textDisabled": "Désactivé",
-  "PE.Views.FileMenuPanels.Settings.textForceSave": "Enregistrer sur le serveur",
+  "PE.Views.FileMenuPanels.Settings.textForceSave": "Enregistrer des versions intermédiaires",
   "PE.Views.FileMenuPanels.Settings.textMinute": "Chaque minute",
   "PE.Views.FileMenuPanels.Settings.txtAll": "Surligner toutes les modifications",
   "PE.Views.FileMenuPanels.Settings.txtAutoCorrect": "Options de correction automatique",
@@ -1509,7 +1509,7 @@
   "PE.Views.ParagraphSettingsAdvanced.txtAutoText": "Auto",
   "PE.Views.RightMenu.txtChartSettings": "Paramètres du graphique",
   "PE.Views.RightMenu.txtImageSettings": "Paramètres de l'image",
-  "PE.Views.RightMenu.txtParagraphSettings": "Paramètres du texte",
+  "PE.Views.RightMenu.txtParagraphSettings": "Paramètres du paragraphe",
   "PE.Views.RightMenu.txtShapeSettings": "Paramètres de la forme",
   "PE.Views.RightMenu.txtSignatureSettings": "Paramètre de signature",
   "PE.Views.RightMenu.txtSlideSettings": "Paramètres de la diapositive",
diff --git a/apps/presentationeditor/main/locale/pt.json b/apps/presentationeditor/main/locale/pt.json
index 989ee5dcd..53d18946d 100644
--- a/apps/presentationeditor/main/locale/pt.json
+++ b/apps/presentationeditor/main/locale/pt.json
@@ -75,7 +75,7 @@
   "Common.UI.SynchronizeTip.textSynchronize": "O documento foi alterado por outro usuário.<br>Clique para salvar suas alterações e recarregar as atualizações.",
   "Common.UI.ThemeColorPalette.textStandartColors": "Cores padrão",
   "Common.UI.ThemeColorPalette.textThemeColors": "Cores do tema",
-  "Common.UI.Themes.txtThemeClassicLight": "Claro clássico",
+  "Common.UI.Themes.txtThemeClassicLight": "Clássico claro",
   "Common.UI.Themes.txtThemeDark": "Escuro",
   "Common.UI.Themes.txtThemeLight": "Claro",
   "Common.UI.Window.cancelButtonText": "Cancelar",
@@ -1088,7 +1088,7 @@
   "PE.Views.DocumentHolder.addCommentText": "Adicionar comentário",
   "PE.Views.DocumentHolder.addToLayoutText": "Adicionar ao Layout",
   "PE.Views.DocumentHolder.advancedImageText": "Configurações avançadas de imagem",
-  "PE.Views.DocumentHolder.advancedParagraphText": "Configurações avançadas de texto",
+  "PE.Views.DocumentHolder.advancedParagraphText": "Configurações avançadas de parágrafo",
   "PE.Views.DocumentHolder.advancedShapeText": "Configurações avançadas de forma",
   "PE.Views.DocumentHolder.advancedTableText": "Configurações avançadas de tabela",
   "PE.Views.DocumentHolder.alignmentText": "Alinhamento",
@@ -1509,7 +1509,7 @@
   "PE.Views.ParagraphSettingsAdvanced.txtAutoText": "Automático",
   "PE.Views.RightMenu.txtChartSettings": "Configurações do gráfico",
   "PE.Views.RightMenu.txtImageSettings": "Configurações de imagem",
-  "PE.Views.RightMenu.txtParagraphSettings": "Configurações de texto",
+  "PE.Views.RightMenu.txtParagraphSettings": "Configurações do parágrafo",
   "PE.Views.RightMenu.txtShapeSettings": "Configurações da forma",
   "PE.Views.RightMenu.txtSignatureSettings": "Configurações de Assinatura",
   "PE.Views.RightMenu.txtSlideSettings": "Configurações de slide",
diff --git a/apps/presentationeditor/main/locale/ro.json b/apps/presentationeditor/main/locale/ro.json
index f93fc2faa..e8febcf90 100644
--- a/apps/presentationeditor/main/locale/ro.json
+++ b/apps/presentationeditor/main/locale/ro.json
@@ -75,7 +75,7 @@
   "Common.UI.SynchronizeTip.textSynchronize": "Documentul a fost modificat de către un alt utilizator.<br>Salvați modificările făcute de dumneavoastră și reîmprospătați documentul.",
   "Common.UI.ThemeColorPalette.textStandartColors": "Culori standard",
   "Common.UI.ThemeColorPalette.textThemeColors": "Culori temă",
-  "Common.UI.Themes.txtThemeClassicLight": "Luminos Clasic",
+  "Common.UI.Themes.txtThemeClassicLight": "Clasic Luminos",
   "Common.UI.Themes.txtThemeDark": "Întunecat",
   "Common.UI.Themes.txtThemeLight": "Luminos",
   "Common.UI.Window.cancelButtonText": "Anulare",
@@ -99,10 +99,12 @@
   "Common.Views.About.txtVersion": "Versiune",
   "Common.Views.AutoCorrectDialog.textAdd": "Adaugă",
   "Common.Views.AutoCorrectDialog.textApplyText": "Se aplică în timp ce tastați",
+  "Common.Views.AutoCorrectDialog.textAutoCorrect": "AutoCorecție",
   "Common.Views.AutoCorrectDialog.textAutoFormat": "Formatare automată la tastare",
   "Common.Views.AutoCorrectDialog.textBulleted": "Creare automată a listei cu marcatori",
   "Common.Views.AutoCorrectDialog.textBy": "După",
   "Common.Views.AutoCorrectDialog.textDelete": "Ștergere",
+  "Common.Views.AutoCorrectDialog.textFLSentence": "Scrie cu majusculă prima literă a propoziției",
   "Common.Views.AutoCorrectDialog.textHyphens": "Cratime (--) cu linie de dialog (—)",
   "Common.Views.AutoCorrectDialog.textMathCorrect": "Autocorecție matematică",
   "Common.Views.AutoCorrectDialog.textNumbered": "Creare automată a listei numerotate",
@@ -154,6 +156,7 @@
   "Common.Views.Header.textBack": "Deschidere locația fișierului",
   "Common.Views.Header.textCompactView": "Ascundere bară de instrumente",
   "Common.Views.Header.textHideLines": "Ascundere rigle",
+  "Common.Views.Header.textHideNotes": "Ascunde notele",
   "Common.Views.Header.textHideStatusBar": "Ascundere bară de stare",
   "Common.Views.Header.textRemoveFavorite": "Eliminare din Preferințe",
   "Common.Views.Header.textSaveBegin": "Salvare în progres...",
@@ -239,6 +242,8 @@
   "Common.Views.ReviewChanges.tipCoAuthMode": "Activare modul de colaborare",
   "Common.Views.ReviewChanges.tipCommentRem": "Ștergere comentarii",
   "Common.Views.ReviewChanges.tipCommentRemCurrent": "Se șterg aceste comentarii",
+  "Common.Views.ReviewChanges.tipCommentResolve": "Soluționare comentarii",
+  "Common.Views.ReviewChanges.tipCommentResolveCurrent": "Soluționarea comentariilor curente",
   "Common.Views.ReviewChanges.tipHistory": "Afișare istoricul versiunei",
   "Common.Views.ReviewChanges.tipRejectCurrent": "Respinge modificare",
   "Common.Views.ReviewChanges.tipReview": "Urmărirea modificărilor",
@@ -258,6 +263,11 @@
   "Common.Views.ReviewChanges.txtCommentRemMy": "Se șterg comentariile mele",
   "Common.Views.ReviewChanges.txtCommentRemMyCurrent": "Se șterg comentariile mele curente",
   "Common.Views.ReviewChanges.txtCommentRemove": "Ștergere",
+  "Common.Views.ReviewChanges.txtCommentResolve": "Rezolvare",
+  "Common.Views.ReviewChanges.txtCommentResolveAll": "Marchează toate comentarii ca soluționate",
+  "Common.Views.ReviewChanges.txtCommentResolveCurrent": "Soluționarea comentariilor curente",
+  "Common.Views.ReviewChanges.txtCommentResolveMy": "Soluționarea comentariilor mele",
+  "Common.Views.ReviewChanges.txtCommentResolveMyCurrent": "Soluționarea comentariilor mele curente",
   "Common.Views.ReviewChanges.txtDocLang": "Limbă",
   "Common.Views.ReviewChanges.txtFinal": "Toate modificările sunt acceptate (Previzualizare)",
   "Common.Views.ReviewChanges.txtFinalCap": "Final",
@@ -344,9 +354,11 @@
   "Common.Views.UserNameDialog.textDontShow": "Nu mai întreabă",
   "Common.Views.UserNameDialog.textLabel": "Etichetă:",
   "Common.Views.UserNameDialog.textLabelError": "Etichetă trebuie completată",
+  "PE.Controllers.LeftMenu.leavePageText": "Toate modificările nesalvate din documentul vor fi pierdute.<br> Pentru a le salva, faceți clic pe Revocare și apoi pe Salvare. Apăsați OK dacă doriți să renunțați la modificările nesalvate.",
   "PE.Controllers.LeftMenu.newDocumentTitle": "Prezentare fără titlu",
   "PE.Controllers.LeftMenu.notcriticalErrorTitle": "Avertisment",
   "PE.Controllers.LeftMenu.requestEditRightsText": "Solicitarea permisiunii pentru editare...",
+  "PE.Controllers.LeftMenu.textLoadHistory": "Încărcarea istoricului versiunii...",
   "PE.Controllers.LeftMenu.textNoTextFound": "Datele căutate nu au fost găsite. Alegeți alte opțiuni de căutare.",
   "PE.Controllers.LeftMenu.textReplaceSkipped": "A avut loc o înlocuire. {0} apariții ignorate.",
   "PE.Controllers.LeftMenu.textReplaceSuccess": "Căutarea a fost finalizată. Înlocuiri: {0}",
@@ -391,6 +403,7 @@
   "PE.Controllers.Main.errorUsersExceed": "Limita de utilizatori stipulată de planul tarifar a fost depășită",
   "PE.Controllers.Main.errorViewerDisconnect": "Conexiunea a fost pierdută. Încă mai puteți vizualiza documentul,<br>dar nu și să-l descărcați sau imprimați până când conexiunea se restabilește și pagina se reîmprospătează.",
   "PE.Controllers.Main.leavePageText": "Nu ați salvat modificările din prezentarea. Faceți clic pe  \"Rămâi în pagină\" și apoi pe Salvare dacă doriți să le salvați. Faceți clic pe 'Părăsește aceasta pagina' ca să renunțați la toate modificările nesalvate.",
+  "PE.Controllers.Main.leavePageTextOnClose": "Toate modificările vor fi pierdute dacă nu au fost salvate.<br> Faceți clic pe Anulare și apoi pe Salvează ca să le salvați. Faceți clic pe OK ca să renunțați la toate modificările nesalvate.",
   "PE.Controllers.Main.loadFontsTextText": "Încărcarea datelor...",
   "PE.Controllers.Main.loadFontsTitleText": "Încărcare date",
   "PE.Controllers.Main.loadFontTextText": "Încărcarea datelor...",
@@ -441,6 +454,7 @@
   "PE.Controllers.Main.textShape": "Forma",
   "PE.Controllers.Main.textStrict": "Modul strict",
   "PE.Controllers.Main.textTryUndoRedo": "Funcții Anulare/Refacere sunt dezactivate în modul Rapid de editare colaborativă.<br>Faceți clic pe Modul strict ca să comutați la modul Strict de editare colaborativă și să nu intrați în conflict cu alte persoane. Toate modificările vor fi trimise numai după ce le salvați. Ulilizati Setări avansate ale editorului ca să comutați între moduri de editare colaborativă. ",
+  "PE.Controllers.Main.textTryUndoRedoWarn": "Funcții Anulare/Refacere sunt dezactivate în modul Rapid de editare colaborativă.",
   "PE.Controllers.Main.titleLicenseExp": "Licența a expirat",
   "PE.Controllers.Main.titleServerVersion": "Editorul a fost actualizat",
   "PE.Controllers.Main.txtAddFirstSlide": "Faceți clic pentru a adăuga primul diapozitiv",
@@ -455,6 +469,7 @@
   "PE.Controllers.Main.txtDiagram": "SmartArt",
   "PE.Controllers.Main.txtDiagramTitle": "Titlu diagramă",
   "PE.Controllers.Main.txtEditingMode": "Setare modul de editare...",
+  "PE.Controllers.Main.txtErrorLoadHistory": "Încărcarea istoricului a eșuat",
   "PE.Controllers.Main.txtFiguredArrows": "Săgeți în forme diferite",
   "PE.Controllers.Main.txtFooter": "Subsol",
   "PE.Controllers.Main.txtHeader": "Antet",
@@ -464,6 +479,7 @@
   "PE.Controllers.Main.txtMath": "Matematica",
   "PE.Controllers.Main.txtMedia": "Media",
   "PE.Controllers.Main.txtNeedSynchronize": "Aveți actualizări disponibile",
+  "PE.Controllers.Main.txtNone": "Niciunul",
   "PE.Controllers.Main.txtPicture": "Imagine",
   "PE.Controllers.Main.txtRectangles": "Dreptunghiuri",
   "PE.Controllers.Main.txtSeries": "Serie",
@@ -1072,7 +1088,7 @@
   "PE.Views.DocumentHolder.addCommentText": "Adaugă comentariu",
   "PE.Views.DocumentHolder.addToLayoutText": "Adăugare aspect",
   "PE.Views.DocumentHolder.advancedImageText": "Setări avansate imagine",
-  "PE.Views.DocumentHolder.advancedParagraphText": "Setări avansate text",
+  "PE.Views.DocumentHolder.advancedParagraphText": "Setări avansate paragraf ",
   "PE.Views.DocumentHolder.advancedShapeText": "Setări avansate forma",
   "PE.Views.DocumentHolder.advancedTableText": "Setări avansate tabel",
   "PE.Views.DocumentHolder.alignmentText": "Aliniere",
@@ -1263,6 +1279,7 @@
   "PE.Views.FileMenu.btnCreateNewCaption": "Crearea unui document nou",
   "PE.Views.FileMenu.btnDownloadCaption": "Descărcare ca...",
   "PE.Views.FileMenu.btnHelpCaption": "Asistență...",
+  "PE.Views.FileMenu.btnHistoryCaption": "Istoricul versiune",
   "PE.Views.FileMenu.btnInfoCaption": "Informații despre prezentare...",
   "PE.Views.FileMenu.btnPrintCaption": "Imprimare",
   "PE.Views.FileMenu.btnProtectCaption": "Protejare",
@@ -1317,7 +1334,7 @@
   "PE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "Pentru a vizualiza modificările, trebuie mai întâi să le acceptați",
   "PE.Views.FileMenuPanels.Settings.strFast": "Rapid",
   "PE.Views.FileMenuPanels.Settings.strFontRender": "Sugestie font",
-  "PE.Views.FileMenuPanels.Settings.strForcesave": "Se salvează întotdeauna pe server (altfel utilizați metoda document close pentru salvare)",
+  "PE.Views.FileMenuPanels.Settings.strForcesave": "Versiunea se adaugă la stocarea după ce faceți clic pe Salvare sau Ctrl+S",
   "PE.Views.FileMenuPanels.Settings.strInputMode": "Activare hieroglife",
   "PE.Views.FileMenuPanels.Settings.strMacrosSettings": "Setări macrocomandă",
   "PE.Views.FileMenuPanels.Settings.strPaste": "Decupare, copiere și lipire",
@@ -1336,7 +1353,7 @@
   "PE.Views.FileMenuPanels.Settings.textAutoRecover": "Recuperare automată",
   "PE.Views.FileMenuPanels.Settings.textAutoSave": "Salvare automată",
   "PE.Views.FileMenuPanels.Settings.textDisabled": "Dezactivat",
-  "PE.Views.FileMenuPanels.Settings.textForceSave": "Salvare pe server",
+  "PE.Views.FileMenuPanels.Settings.textForceSave": "Salvarea versiunilor intermediare",
   "PE.Views.FileMenuPanels.Settings.textMinute": "La fiecare minută",
   "PE.Views.FileMenuPanels.Settings.txtAll": "Vizualizare toate",
   "PE.Views.FileMenuPanels.Settings.txtAutoCorrect": "Opțiuni AutoCorecție...",
@@ -1492,7 +1509,7 @@
   "PE.Views.ParagraphSettingsAdvanced.txtAutoText": "Auto",
   "PE.Views.RightMenu.txtChartSettings": "Setări diagramă",
   "PE.Views.RightMenu.txtImageSettings": "Setări imagine",
-  "PE.Views.RightMenu.txtParagraphSettings": "Setări text",
+  "PE.Views.RightMenu.txtParagraphSettings": "Setări paragraf",
   "PE.Views.RightMenu.txtShapeSettings": "Setări forma",
   "PE.Views.RightMenu.txtSignatureSettings": "Setări semnătura",
   "PE.Views.RightMenu.txtSlideSettings": "Setări diapozitiv",
diff --git a/apps/presentationeditor/main/locale/ru.json b/apps/presentationeditor/main/locale/ru.json
index e64240417..6937cec7e 100644
--- a/apps/presentationeditor/main/locale/ru.json
+++ b/apps/presentationeditor/main/locale/ru.json
@@ -75,7 +75,7 @@
   "Common.UI.SynchronizeTip.textSynchronize": "Документ изменен другим пользователем.<br/>Нажмите, чтобы сохранить свои изменения и загрузить обновления.",
   "Common.UI.ThemeColorPalette.textStandartColors": "Стандартные цвета",
   "Common.UI.ThemeColorPalette.textThemeColors": "Цвета темы",
-  "Common.UI.Themes.txtThemeClassicLight": "Светлая классическая",
+  "Common.UI.Themes.txtThemeClassicLight": "Классическая светлая",
   "Common.UI.Themes.txtThemeDark": "Темная",
   "Common.UI.Themes.txtThemeLight": "Светлая",
   "Common.UI.Window.cancelButtonText": "Отмена",
@@ -1334,7 +1334,7 @@
   "PE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "Прежде чем вы сможете увидеть изменения, их надо будет принять",
   "PE.Views.FileMenuPanels.Settings.strFast": "Быстрый",
   "PE.Views.FileMenuPanels.Settings.strFontRender": "Хинтинг шрифтов",
-  "PE.Views.FileMenuPanels.Settings.strForcesave": "Всегда сохранять на сервере (в противном случае сохранять на сервере при закрытии документа)",
+  "PE.Views.FileMenuPanels.Settings.strForcesave": "Добавлять версию в хранилище после нажатия кнопки Сохранить или Ctrl+S",
   "PE.Views.FileMenuPanels.Settings.strInputMode": "Включить иероглифы",
   "PE.Views.FileMenuPanels.Settings.strMacrosSettings": "Настройки макросов",
   "PE.Views.FileMenuPanels.Settings.strPaste": "Вырезание, копирование и вставка",
@@ -1353,7 +1353,7 @@
   "PE.Views.FileMenuPanels.Settings.textAutoRecover": "Автовосстановление",
   "PE.Views.FileMenuPanels.Settings.textAutoSave": "Автосохранение",
   "PE.Views.FileMenuPanels.Settings.textDisabled": "Отключено",
-  "PE.Views.FileMenuPanels.Settings.textForceSave": "Сохранять на сервере",
+  "PE.Views.FileMenuPanels.Settings.textForceSave": "Сохранение промежуточных версий",
   "PE.Views.FileMenuPanels.Settings.textMinute": "Каждую минуту",
   "PE.Views.FileMenuPanels.Settings.txtAll": "Все",
   "PE.Views.FileMenuPanels.Settings.txtAutoCorrect": "Параметры автозамены...",
diff --git a/apps/presentationeditor/main/locale/zh.json b/apps/presentationeditor/main/locale/zh.json
index ecbf2eec2..f15c47a41 100644
--- a/apps/presentationeditor/main/locale/zh.json
+++ b/apps/presentationeditor/main/locale/zh.json
@@ -638,7 +638,7 @@
   "PE.Controllers.Main.txtTheme_turtle": "龟",
   "PE.Controllers.Main.txtXAxis": "X轴",
   "PE.Controllers.Main.txtYAxis": "Y轴",
-  "PE.Controllers.Main.unknownErrorText": "示知错误",
+  "PE.Controllers.Main.unknownErrorText": "未知错误",
   "PE.Controllers.Main.unsupportedBrowserErrorText": "你的浏览器不支持",
   "PE.Controllers.Main.uploadImageExtMessage": "未知图像格式",
   "PE.Controllers.Main.uploadImageFileCountMessage": "没有图片上传",
diff --git a/apps/spreadsheeteditor/main/locale/el.json b/apps/spreadsheeteditor/main/locale/el.json
index a15ac6ce6..52f389a82 100644
--- a/apps/spreadsheeteditor/main/locale/el.json
+++ b/apps/spreadsheeteditor/main/locale/el.json
@@ -48,8 +48,22 @@
   "Common.define.chartData.textStock": "Μετοχή",
   "Common.define.chartData.textSurface": "Επιφάνεια",
   "Common.define.chartData.textWinLossSpark": "Νίκες/Ήττες",
+  "Common.define.conditionalData.exampleText": "ΑαΒβΓγΨψΩω",
+  "Common.define.conditionalData.text1Above": "1 τυπική απόκλιση πάνω",
+  "Common.define.conditionalData.text1Below": "1 τυπική απόκλιση κάτω",
+  "Common.define.conditionalData.text2Above": "2 τυπική απόκλιση πάνω",
+  "Common.define.conditionalData.text2Below": "2 τυπική απόκλιση κάτω",
+  "Common.define.conditionalData.text3Above": "3 τυπική απόκλιση πάνω",
+  "Common.define.conditionalData.text3Below": "3 τυπική απόκλιση κάτω",
+  "Common.define.conditionalData.textAbove": "Πάνω από",
   "Common.define.conditionalData.textDate": "Ημερομηνία",
   "Common.define.conditionalData.textFormula": "Τύπος",
+  "Common.define.conditionalData.textText": "Κείμενο",
+  "Common.define.conditionalData.textThisWeek": "Αυτή την εβδομάδα",
+  "Common.define.conditionalData.textToday": "Σήμερα",
+  "Common.define.conditionalData.textTomorrow": "Αύριο",
+  "Common.define.conditionalData.textTop": "Επάνω",
+  "Common.define.conditionalData.textYesterday": "Χθες",
   "Common.Translation.warnFileLocked": "Το αρχείο τελεί υπό επεξεργασία σε άλλη εφαρμογή. Μπορείτε να συνεχίσετε την επεξεργασία και να το αποθηκεύσετε ως αντίγραφo.",
   "Common.Translation.warnFileLockedBtnEdit": "Δημιουργία αντιγράφου",
   "Common.Translation.warnFileLockedBtnView": "Άνοιγμα για προβολή",
@@ -257,6 +271,7 @@
   "Common.Views.ReviewChanges.txtCommentRemMy": "Αφαίρεση των Σχολίων Μου",
   "Common.Views.ReviewChanges.txtCommentRemMyCurrent": "Αφαίρεση Πρόσφατων Σχολίων Μου",
   "Common.Views.ReviewChanges.txtCommentRemove": "Αφαίρεση",
+  "Common.Views.ReviewChanges.txtCommentResolve": "Επίλυση",
   "Common.Views.ReviewChanges.txtDocLang": "Γλώσσα",
   "Common.Views.ReviewChanges.txtFinal": "Όλες οι αλλαγές έγιναν αποδεκτές (Προεπισκόπηση)",
   "Common.Views.ReviewChanges.txtFinalCap": "Τελικός",
@@ -1970,12 +1985,30 @@
   "SSE.Views.FileMenuPanels.Settings.txtGeneral": "Γενικά",
   "SSE.Views.FileMenuPanels.Settings.txtPageSettings": "Ρυθμίσεις Σελίδας",
   "SSE.Views.FileMenuPanels.Settings.txtSpellChecking": "Έλεγχος ορθογραφίας",
+  "SSE.Views.FormatRulesEditDlg.notcriticalErrorTitle": "Προειδοποίηση",
+  "SSE.Views.FormatRulesEditDlg.text2Scales": "Δίχρωμη κλίμακα",
+  "SSE.Views.FormatRulesEditDlg.text3Scales": "Τρίχρωμη κλίμακα",
+  "SSE.Views.FormatRulesEditDlg.textAllBorders": "Όλα τα περιγράμματα",
+  "SSE.Views.FormatRulesEditDlg.textColor": "Χρώμα κειμένου",
   "SSE.Views.FormatRulesEditDlg.textFill": "Γέμισμα",
   "SSE.Views.FormatRulesEditDlg.textFormat": "Μορφή",
   "SSE.Views.FormatRulesEditDlg.textFormula": "Τύπος",
+  "SSE.Views.FormatRulesEditDlg.textNewColor": "Προσθήκη Νέου Προσαρμοσμένου Χρώματος",
+  "SSE.Views.FormatRulesEditDlg.textStrikeout": "Διαγραφή",
+  "SSE.Views.FormatRulesEditDlg.textSubscript": "Δείκτης",
+  "SSE.Views.FormatRulesEditDlg.textSuperscript": "Εκθέτης",
+  "SSE.Views.FormatRulesEditDlg.textUnderline": "Υπογράμμιση",
   "SSE.Views.FormatRulesEditDlg.txtDate": "Ημερομηνία",
   "SSE.Views.FormatRulesEditDlg.txtFraction": "Κλάσμα",
+  "SSE.Views.FormatRulesEditDlg.txtText": "Κείμενο",
   "SSE.Views.FormatRulesManagerDlg.guestText": "Επισκέπτης",
+  "SSE.Views.FormatRulesManagerDlg.text1Above": "1 τυπική απόκλιση πάνω από το μέσο όρο",
+  "SSE.Views.FormatRulesManagerDlg.text1Below": "1 τυπική απόκλιση κάτω από το μέσο όρο",
+  "SSE.Views.FormatRulesManagerDlg.text2Above": "2 τυπική απόκλιση πάνω από το μέσο όρο",
+  "SSE.Views.FormatRulesManagerDlg.text2Below": "2 τυπική απόκλιση κάτω από το μέσο όρο",
+  "SSE.Views.FormatRulesManagerDlg.text3Above": "3 τυπική απόκλιση πάνω από το μέσο όρο",
+  "SSE.Views.FormatRulesManagerDlg.text3Below": "3 τυπική απόκλιση κάτω από το μέσο όρο",
+  "SSE.Views.FormatRulesManagerDlg.textAbove": "Πάνω από τον μέσο όρο",
   "SSE.Views.FormatRulesManagerDlg.textDelete": "Διαγραφή",
   "SSE.Views.FormatRulesManagerDlg.textEdit": "Επεξεργασία",
   "SSE.Views.FormatRulesManagerDlg.textFormat": "Μορφή",
@@ -2863,6 +2896,7 @@
   "SSE.Views.Toolbar.capInsertHyperlink": "Υπερσύνδεσμος",
   "SSE.Views.Toolbar.capInsertImage": "Εικόνα",
   "SSE.Views.Toolbar.capInsertShape": "Σχήμα",
+  "SSE.Views.Toolbar.capInsertSpark": "Μικρογραφήματα",
   "SSE.Views.Toolbar.capInsertTable": "Πίνακας",
   "SSE.Views.Toolbar.capInsertText": "Πλαίσιο Κειμένου",
   "SSE.Views.Toolbar.mniImageFromFile": "Εικόνα από Αρχείο",
diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json
index bfc50145a..06340e575 100644
--- a/apps/spreadsheeteditor/main/locale/en.json
+++ b/apps/spreadsheeteditor/main/locale/en.json
@@ -1995,7 +1995,7 @@
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strDecimalSeparator": "Decimal separator",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFast": "Fast",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFontRender": "Font Hinting",
-  "SSE.Views.FileMenuPanels.MainSettingsGeneral.strForcesave": "Always save to server (otherwise save to server on document close)",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.strForcesave": "Add version to storage after clicking Save or Ctrl+S",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocale": "Formula Language",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocaleEx": "Example: SUM; MIN; MAX; COUNT",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strLiveComment": "Turn on display of the comments",
@@ -2020,7 +2020,7 @@
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textAutoRecover": "Autorecover",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textAutoSave": "Autosave",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textDisabled": "Disabled",
-  "SSE.Views.FileMenuPanels.MainSettingsGeneral.textForceSave": "Save to Server",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.textForceSave": "Saving intermediate versions",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textMinute": "Every Minute",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textRefStyle": "Reference Style",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtBe": "Belarusian",
diff --git a/apps/spreadsheeteditor/main/locale/es.json b/apps/spreadsheeteditor/main/locale/es.json
index c02edc188..0b6d29ed9 100644
--- a/apps/spreadsheeteditor/main/locale/es.json
+++ b/apps/spreadsheeteditor/main/locale/es.json
@@ -127,7 +127,7 @@
   "Common.UI.SynchronizeTip.textSynchronize": "El documento ha sido cambiado por otro usuario.<br/>Por favor haga clic para guardar sus cambios y recargue las actualizaciones.",
   "Common.UI.ThemeColorPalette.textStandartColors": "Colores estándar",
   "Common.UI.ThemeColorPalette.textThemeColors": "Colores de tema",
-  "Common.UI.Themes.txtThemeClassicLight": "Claro clásico",
+  "Common.UI.Themes.txtThemeClassicLight": "Clásico claro",
   "Common.UI.Themes.txtThemeDark": "Oscuro",
   "Common.UI.Themes.txtThemeLight": "Claro",
   "Common.UI.Window.cancelButtonText": "Cancelar",
@@ -1914,7 +1914,7 @@
   "SSE.Views.DocumentHolder.txtSortFontColor": "Color de letra seleccionado en la parte superior",
   "SSE.Views.DocumentHolder.txtSparklines": "Sparklines",
   "SSE.Views.DocumentHolder.txtText": "Texto",
-  "SSE.Views.DocumentHolder.txtTextAdvanced": "Ajustes avanzados de texto",
+  "SSE.Views.DocumentHolder.txtTextAdvanced": "Ajustes avanzados de párrafo",
   "SSE.Views.DocumentHolder.txtTime": "Hora",
   "SSE.Views.DocumentHolder.txtUngroup": "Desagrupar",
   "SSE.Views.DocumentHolder.txtWidth": "Ancho",
@@ -1994,7 +1994,7 @@
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strDecimalSeparator": "Separador decimal",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFast": "rápido",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFontRender": "Hinting",
-  "SSE.Views.FileMenuPanels.MainSettingsGeneral.strForcesave": "Siempre guardar en el servidor (de lo contrario guardar en el servidor al cerrar documento)",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.strForcesave": "Añadir la versión al almacenamiento después de hacer clic en Guardar o Ctrl+S",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocale": "Idioma de fórmulas",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocaleEx": "Ejemplo: SUMA; MIN; MAX; CONTAR",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strLiveComment": "Activar la visualización de comentarios",
@@ -2019,7 +2019,7 @@
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textAutoRecover": "Autorrecuperación",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textAutoSave": "Guardar automáticamente",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textDisabled": "Desactivado",
-  "SSE.Views.FileMenuPanels.MainSettingsGeneral.textForceSave": "Guardar al servidor",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.textForceSave": "Guardar versiones intermedias",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textMinute": "Cada minuto",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textRefStyle": "Estilo de referencias",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtBe": "Bieloruso",
@@ -2679,7 +2679,7 @@
   "SSE.Views.RightMenu.txtCellSettings": "Ajustes de celda",
   "SSE.Views.RightMenu.txtChartSettings": "Ajustes de gráfico",
   "SSE.Views.RightMenu.txtImageSettings": "Ajustes de imagen",
-  "SSE.Views.RightMenu.txtParagraphSettings": "Ajustes de texto",
+  "SSE.Views.RightMenu.txtParagraphSettings": "Ajustes de párrafo",
   "SSE.Views.RightMenu.txtPivotSettings": "Ajustes de tabla de pivote",
   "SSE.Views.RightMenu.txtSettings": "Ajustes comunes",
   "SSE.Views.RightMenu.txtShapeSettings": "Ajustes de forma",
diff --git a/apps/spreadsheeteditor/main/locale/fr.json b/apps/spreadsheeteditor/main/locale/fr.json
index 4b0d750f4..48318d550 100644
--- a/apps/spreadsheeteditor/main/locale/fr.json
+++ b/apps/spreadsheeteditor/main/locale/fr.json
@@ -127,7 +127,7 @@
   "Common.UI.SynchronizeTip.textSynchronize": "Le document a été modifié par un autre utilisateur.<br>Cliquez pour enregistrer vos modifications et recharger les mises à jour.",
   "Common.UI.ThemeColorPalette.textStandartColors": "Couleurs standard",
   "Common.UI.ThemeColorPalette.textThemeColors": "Couleurs de thème",
-  "Common.UI.Themes.txtThemeClassicLight": "Clair classique",
+  "Common.UI.Themes.txtThemeClassicLight": "Classique clair",
   "Common.UI.Themes.txtThemeDark": "Sombre",
   "Common.UI.Themes.txtThemeLight": "Clair",
   "Common.UI.Window.cancelButtonText": "Annuler",
@@ -1914,7 +1914,7 @@
   "SSE.Views.DocumentHolder.txtSortFontColor": "Couleur sélectionné de la police sur le dessus",
   "SSE.Views.DocumentHolder.txtSparklines": "Graphiques sparkline",
   "SSE.Views.DocumentHolder.txtText": "Texte",
-  "SSE.Views.DocumentHolder.txtTextAdvanced": "Paramètres avancés du texte",
+  "SSE.Views.DocumentHolder.txtTextAdvanced": "Paramètres avancés du paragraphe",
   "SSE.Views.DocumentHolder.txtTime": "Heure",
   "SSE.Views.DocumentHolder.txtUngroup": "Dissocier",
   "SSE.Views.DocumentHolder.txtWidth": "Largeur",
@@ -1994,7 +1994,7 @@
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strDecimalSeparator": "Séparateur décimal",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFast": "Rapide",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFontRender": "Hinting de la police",
-  "SSE.Views.FileMenuPanels.MainSettingsGeneral.strForcesave": "Toujours enregistrer sur le serveur (sinon enregistrer sur le serveur lors de la fermeture du document)",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.strForcesave": "Ajouter une version dans l'espace de stockage en cliquant Enregistrer ou Ctrl+S",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocale": "La langue de formule",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocaleEx": "Example: SUM; MIN; MAX; COUNT",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strLiveComment": "Activer l'affichage des commentaires",
@@ -2019,7 +2019,7 @@
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textAutoRecover": "Récupération automatique",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textAutoSave": "Enregistrement automatique",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textDisabled": "Désactivé",
-  "SSE.Views.FileMenuPanels.MainSettingsGeneral.textForceSave": "Enregistrer sur le serveur",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.textForceSave": "Enregistrer des versions intermédiaires",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textMinute": "Chaque minute",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textRefStyle": "Style de références",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtBe": "Biélorusse",
@@ -2679,7 +2679,7 @@
   "SSE.Views.RightMenu.txtCellSettings": "Paramètres de cellule",
   "SSE.Views.RightMenu.txtChartSettings": "Paramètres du graphique",
   "SSE.Views.RightMenu.txtImageSettings": "Paramètres de l'image",
-  "SSE.Views.RightMenu.txtParagraphSettings": "Paramètres du texte",
+  "SSE.Views.RightMenu.txtParagraphSettings": "Paramètres du paragraphe",
   "SSE.Views.RightMenu.txtPivotSettings": "Paramètres de tableau croisé",
   "SSE.Views.RightMenu.txtSettings": "Paramètres communs",
   "SSE.Views.RightMenu.txtShapeSettings": "Paramètres de forme",
diff --git a/apps/spreadsheeteditor/main/locale/pt.json b/apps/spreadsheeteditor/main/locale/pt.json
index bcfda5ce6..a406c8eb7 100644
--- a/apps/spreadsheeteditor/main/locale/pt.json
+++ b/apps/spreadsheeteditor/main/locale/pt.json
@@ -50,6 +50,12 @@
   "Common.define.chartData.textWinLossSpark": "Ganhos/Perdas",
   "Common.define.conditionalData.exampleText": "AaBbCcYyZz",
   "Common.define.conditionalData.noFormatText": "Nenhum conjunto de formatos",
+  "Common.define.conditionalData.text1Above": "1 desvio padrão acima",
+  "Common.define.conditionalData.text1Below": "1 desvio padrão abaixo",
+  "Common.define.conditionalData.text2Above": "2 desvios padrão acima",
+  "Common.define.conditionalData.text2Below": "2 desvios padrão abaixo",
+  "Common.define.conditionalData.text3Above": "3 desvios padrão acima",
+  "Common.define.conditionalData.text3Below": "3 desvios padrão abaixo",
   "Common.define.conditionalData.textAbove": "Acima",
   "Common.define.conditionalData.textAverage": "Média",
   "Common.define.conditionalData.textBegins": "Começa com",
@@ -81,8 +87,18 @@
   "Common.define.conditionalData.textNextWeek": "Próxima semana",
   "Common.define.conditionalData.textNotBetween": "Não entre...",
   "Common.define.conditionalData.textNotBlanks": "Não contém espaços em branco",
+  "Common.define.conditionalData.textNotContains": "Não contém",
   "Common.define.conditionalData.textNotEqual": "Não igual a",
   "Common.define.conditionalData.textNotErrors": "Não contém erros",
+  "Common.define.conditionalData.textText": "Тexto",
+  "Common.define.conditionalData.textThisMonth": "Este mês",
+  "Common.define.conditionalData.textThisWeek": "Esta semana",
+  "Common.define.conditionalData.textToday": "Hoje",
+  "Common.define.conditionalData.textTomorrow": "Amanhã",
+  "Common.define.conditionalData.textTop": "Superior",
+  "Common.define.conditionalData.textUnique": "Único",
+  "Common.define.conditionalData.textValue": "O valor é",
+  "Common.define.conditionalData.textYesterday": "Ontem",
   "Common.Translation.warnFileLocked": "Documento está em uso por outra aplicação. Você pode continuar editando e salvá-lo como uma cópia.",
   "Common.Translation.warnFileLockedBtnEdit": "Criar uma cópia",
   "Common.Translation.warnFileLockedBtnView": "Aberto para visualização",
@@ -111,7 +127,7 @@
   "Common.UI.SynchronizeTip.textSynchronize": "O documento foi alterado por outro usuário.<br>Clique para salvar suas alterações e recarregar as atualizações.",
   "Common.UI.ThemeColorPalette.textStandartColors": "Cores padrão",
   "Common.UI.ThemeColorPalette.textThemeColors": "Cores do tema",
-  "Common.UI.Themes.txtThemeClassicLight": "Claro clássico",
+  "Common.UI.Themes.txtThemeClassicLight": "Clássico claro",
   "Common.UI.Themes.txtThemeDark": "Escuro",
   "Common.UI.Themes.txtThemeLight": "Claro",
   "Common.UI.Window.cancelButtonText": "Cancelar",
@@ -224,11 +240,13 @@
   "Common.Views.ListSettingsDialog.txtType": "Tipo",
   "Common.Views.OpenDialog.closeButtonText": "Fechar arquivo",
   "Common.Views.OpenDialog.textInvalidRange": "Intervalo de células inválido",
+  "Common.Views.OpenDialog.textSelectData": "Selecionar dados",
   "Common.Views.OpenDialog.txtAdvanced": "Avançado",
   "Common.Views.OpenDialog.txtColon": "Cólon",
   "Common.Views.OpenDialog.txtComma": "Vírgula",
   "Common.Views.OpenDialog.txtDelimiter": "Delimiter",
   "Common.Views.OpenDialog.txtDestData": "Escolha onde colocar os dados",
+  "Common.Views.OpenDialog.txtEmpty": "Este campo é obrigatório",
   "Common.Views.OpenDialog.txtEncoding": "Encoding ",
   "Common.Views.OpenDialog.txtIncorrectPwd": "Senha incorreta.",
   "Common.Views.OpenDialog.txtOpenFile": "Inserir a Senha para Abrir o Arquivo",
@@ -275,6 +293,8 @@
   "Common.Views.ReviewChanges.tipCoAuthMode": "Definir o modo de co-edição",
   "Common.Views.ReviewChanges.tipCommentRem": "Remover comentários",
   "Common.Views.ReviewChanges.tipCommentRemCurrent": "Remover comentários atuais",
+  "Common.Views.ReviewChanges.tipCommentResolve": "Resolver comentários",
+  "Common.Views.ReviewChanges.tipCommentResolveCurrent": "Resolver comentários atuais",
   "Common.Views.ReviewChanges.tipHistory": "Mostrar histórico de versão",
   "Common.Views.ReviewChanges.tipRejectCurrent": "Rejeitar alteração atual",
   "Common.Views.ReviewChanges.tipReview": "Rastrear alterações",
@@ -294,6 +314,11 @@
   "Common.Views.ReviewChanges.txtCommentRemMy": "Remover meus comentários",
   "Common.Views.ReviewChanges.txtCommentRemMyCurrent": "Remover meus comentários atuais",
   "Common.Views.ReviewChanges.txtCommentRemove": "Retirar",
+  "Common.Views.ReviewChanges.txtCommentResolve": "Resolver",
+  "Common.Views.ReviewChanges.txtCommentResolveAll": "Resolver todos os comentários",
+  "Common.Views.ReviewChanges.txtCommentResolveCurrent": "Resolver comentários atuais",
+  "Common.Views.ReviewChanges.txtCommentResolveMy": "Resolver meus comentários",
+  "Common.Views.ReviewChanges.txtCommentResolveMyCurrent": "Resolver meus comentários atuais",
   "Common.Views.ReviewChanges.txtDocLang": "Idioma",
   "Common.Views.ReviewChanges.txtFinal": "Todas as alterações aceitas (Visualização)",
   "Common.Views.ReviewChanges.txtFinalCap": "Final",
@@ -381,12 +406,14 @@
   "Common.Views.UserNameDialog.textLabel": "Rótulo:",
   "Common.Views.UserNameDialog.textLabelError": "Etiqueta não deve estar vazia.",
   "SSE.Controllers.DataTab.textColumns": "Colunas",
+  "SSE.Controllers.DataTab.textEmptyUrl": "Você precisa especificar o URL.",
   "SSE.Controllers.DataTab.textRows": "Linhas",
   "SSE.Controllers.DataTab.textWizard": "Texto para colunas",
   "SSE.Controllers.DataTab.txtDataValidation": "Validação de dados",
   "SSE.Controllers.DataTab.txtExpand": "Expandir",
   "SSE.Controllers.DataTab.txtExpandRemDuplicates": "Os dados próximos à seleção não serão removidos. Deseja expandir a seleção para incluir os dados adjacentes ou continuar apenas com as células atualmente selecionadas?",
   "SSE.Controllers.DataTab.txtExtendDataValidation": "A seleção contém algumas células sem configurações de validação de dados.<br> Você deseja estender a validação de dados a essas células?",
+  "SSE.Controllers.DataTab.txtImportWizard": "Assistente de importação de texto",
   "SSE.Controllers.DataTab.txtRemDuplicates": "Remover Duplicatas",
   "SSE.Controllers.DataTab.txtRemoveDataValidation": "A seleção contém mais de um tipo de validação.<br>Configurações de corrente de partida e continua?",
   "SSE.Controllers.DataTab.txtRemSelected": "Remover em selecionado",
@@ -707,6 +734,7 @@
   "SSE.Controllers.Main.textShape": "Forma",
   "SSE.Controllers.Main.textStrict": "Strict mode",
   "SSE.Controllers.Main.textTryUndoRedo": "The Undo/Redo functions are disabled for the Fast co-editing mode.<br>Click the 'Strict mode' button to switch to the Strict co-editing mode to edit the file without other users interference and send your changes only after you save them. You can switch between the co-editing modes using the editor Advanced settings.",
+  "SSE.Controllers.Main.textTryUndoRedoWarn": "As funções Desfazer/Refazer estão desabilitadas para o modo de coedição rápido",
   "SSE.Controllers.Main.textYes": "Sim",
   "SSE.Controllers.Main.titleLicenseExp": "Licença expirada",
   "SSE.Controllers.Main.titleRecalcFormulas": "Calculando...",
@@ -1008,7 +1036,9 @@
   "SSE.Controllers.Toolbar.textOperator": "Operadores",
   "SSE.Controllers.Toolbar.textPivot": "Tabela Dinâmica",
   "SSE.Controllers.Toolbar.textRadical": "Radicais",
+  "SSE.Controllers.Toolbar.textRating": "Classificações",
   "SSE.Controllers.Toolbar.textScript": "Scripts",
+  "SSE.Controllers.Toolbar.textShapes": "Formas",
   "SSE.Controllers.Toolbar.textSymbols": "Símbolos",
   "SSE.Controllers.Toolbar.textWarning": "Aviso",
   "SSE.Controllers.Toolbar.txtAccent_Accent": "Agudo",
@@ -1427,6 +1457,7 @@
   "SSE.Views.CellSettings.textRadial": "Radial",
   "SSE.Views.CellSettings.textSelectBorders": "Selecione as bordas que você deseja alterar aplicando o estilo escolhido acima",
   "SSE.Views.CellSettings.textSelection": "Da seleção atual",
+  "SSE.Views.CellSettings.textThisPivot": "De uma tabela dinâmica",
   "SSE.Views.CellSettings.textThisSheet": "A partir desta folha de trabalho",
   "SSE.Views.CellSettings.textThisTable": "A partir desta tabela",
   "SSE.Views.CellSettings.tipAddGradientPoint": "Adicionar ponto de gradiente",
@@ -1640,9 +1671,12 @@
   "SSE.Views.CreatePivotDialog.textSelectData": "Selecionar dados",
   "SSE.Views.CreatePivotDialog.textTitle": "Criar tabela dinâmica",
   "SSE.Views.CreatePivotDialog.txtEmpty": "Este campo é obrigatório",
+  "SSE.Views.CreateSparklineDialog.textDataRange": "Intervalo de dados de origem",
   "SSE.Views.CreateSparklineDialog.textDestination": "Escolha, onde colocar os sparklines",
   "SSE.Views.CreateSparklineDialog.textInvalidRange": "Intervalo de células inválido",
+  "SSE.Views.CreateSparklineDialog.textSelectData": "Selecionar dados",
   "SSE.Views.CreateSparklineDialog.textTitle": "Criar Sparklines",
+  "SSE.Views.CreateSparklineDialog.txtEmpty": "Este campo é obrigatório",
   "SSE.Views.DataTab.capBtnGroup": "Grupo",
   "SSE.Views.DataTab.capBtnTextCustomSort": "Classificação personalizada",
   "SSE.Views.DataTab.capBtnTextDataValidation": "Validação de dados",
@@ -1880,7 +1914,7 @@
   "SSE.Views.DocumentHolder.txtSortFontColor": "Selecionou cor da fonte no topo",
   "SSE.Views.DocumentHolder.txtSparklines": "Minigráficos",
   "SSE.Views.DocumentHolder.txtText": "Texto",
-  "SSE.Views.DocumentHolder.txtTextAdvanced": "Configurações avançadas de texto",
+  "SSE.Views.DocumentHolder.txtTextAdvanced": "Configurações avançadas de parágrafo",
   "SSE.Views.DocumentHolder.txtTime": "Tempo",
   "SSE.Views.DocumentHolder.txtUngroup": "Desagrupar",
   "SSE.Views.DocumentHolder.txtWidth": "Largura",
@@ -2016,11 +2050,19 @@
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtNl": "Holandês",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtPl": "Polonês",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtPt": "Ponto",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtPtlang": "Português",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtRo": "Romeno",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtRu": "Russian",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtRunMacros": "Habilitar todos",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtRunMacrosDesc": "Habilitar todas as macros sem uma notificação",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtSk": "Eslovaco",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtSl": "Esloveno",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtStopMacros": "Desabilitar tudo",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtStopMacrosDesc": "Desativar todas as macros sem uma notificação",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtSv": "Sueco",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtTr": "Turco",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtUk": "Ucraniano",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtVi": "Vietnamita",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtWarnMacros": "Mostrar notificação",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtWarnMacrosDesc": "Desativar todas as macros com uma notificação",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtWin": "como Windows",
@@ -2046,6 +2088,9 @@
   "SSE.Views.FileMenuPanels.Settings.txtPageSettings": "Configurações de página",
   "SSE.Views.FileMenuPanels.Settings.txtSpellChecking": "Verificação ortográfica",
   "SSE.Views.FormatRulesEditDlg.fillColor": "Cor do plano de fundo",
+  "SSE.Views.FormatRulesEditDlg.notcriticalErrorTitle": "Aviso",
+  "SSE.Views.FormatRulesEditDlg.text2Scales": "Escala Bicolor",
+  "SSE.Views.FormatRulesEditDlg.text3Scales": "Escala Tricolor",
   "SSE.Views.FormatRulesEditDlg.textAllBorders": "Todas as bordas",
   "SSE.Views.FormatRulesEditDlg.textAppearance": "Aparência de barra",
   "SSE.Views.FormatRulesEditDlg.textApply": "Aplicar ao intervalo",
@@ -2058,19 +2103,28 @@
   "SSE.Views.FormatRulesEditDlg.textBordersStyle": "Estilo de borda",
   "SSE.Views.FormatRulesEditDlg.textBottomBorders": "Bordas inferiores",
   "SSE.Views.FormatRulesEditDlg.textCannotAddCF": "Não é possível adicionar a formatação condicional.",
+  "SSE.Views.FormatRulesEditDlg.textCellMidpoint": "Ponto médio da célula",
   "SSE.Views.FormatRulesEditDlg.textCenterBorders": "Bordas verticais interiores",
   "SSE.Views.FormatRulesEditDlg.textClear": "Limpar",
+  "SSE.Views.FormatRulesEditDlg.textColor": "Cor do texto",
   "SSE.Views.FormatRulesEditDlg.textContext": "Contexto",
   "SSE.Views.FormatRulesEditDlg.textCustom": "Personalizado",
   "SSE.Views.FormatRulesEditDlg.textDiagDownBorder": "Borda inferior diagonal",
   "SSE.Views.FormatRulesEditDlg.textDiagUpBorder": "Borda superior diagonal",
   "SSE.Views.FormatRulesEditDlg.textEmptyFormula": "Insira uma fórmula válida.",
+  "SSE.Views.FormatRulesEditDlg.textEmptyFormulaExt": "A fórmula que você inseriu não avalia para um número, data, hora ou string.",
   "SSE.Views.FormatRulesEditDlg.textEmptyText": "Digite um valor.",
+  "SSE.Views.FormatRulesEditDlg.textEmptyValue": "O valor inserido não é um número, data, hora ou string válido.",
+  "SSE.Views.FormatRulesEditDlg.textErrorGreater": "O valor para o {0} deve ser maior do que o valor para o {1}.",
   "SSE.Views.FormatRulesEditDlg.textErrorTop10Between": "Digite um número entre {0} e {1}.",
   "SSE.Views.FormatRulesEditDlg.textFill": "Preencher",
   "SSE.Views.FormatRulesEditDlg.textFormat": "Formato",
   "SSE.Views.FormatRulesEditDlg.textFormula": "Fórmula",
   "SSE.Views.FormatRulesEditDlg.textGradient": "Gradiente",
+  "SSE.Views.FormatRulesEditDlg.textIconLabel": "quando {0} {1} e",
+  "SSE.Views.FormatRulesEditDlg.textIconLabelFirst": "quando {0} {1}",
+  "SSE.Views.FormatRulesEditDlg.textIconLabelLast": "quando o valor é",
+  "SSE.Views.FormatRulesEditDlg.textIconsOverlap": "Um ou mais intervalos de dados de ícones se sobrepõem.<br>Ajustar valores de intervalos de dados de ícones para que os intervalos não se sobreponham.",
   "SSE.Views.FormatRulesEditDlg.textIconStyle": "Estilo Ícone",
   "SSE.Views.FormatRulesEditDlg.textInsideBorders": "Bordas interiores",
   "SSE.Views.FormatRulesEditDlg.textInvalid": "Faixa de dados inválida.",
@@ -2090,22 +2144,64 @@
   "SSE.Views.FormatRulesEditDlg.textNewColor": "Adicionar nova cor personalizada",
   "SSE.Views.FormatRulesEditDlg.textNoBorders": "Sem bordas",
   "SSE.Views.FormatRulesEditDlg.textNone": "Nenhum",
+  "SSE.Views.FormatRulesEditDlg.textNotValidPercentage": "Um ou mais dos valores especificados não é uma porcentagem válida.",
+  "SSE.Views.FormatRulesEditDlg.textNotValidPercentageExt": "O valor especificado {0} não é uma porcentagem válida.",
+  "SSE.Views.FormatRulesEditDlg.textNotValidPercentile": "Um ou mais dos valores especificados não é um percentil válido.",
+  "SSE.Views.FormatRulesEditDlg.textNotValidPercentileExt": "O valor especificado {0} não é um percentil válido.",
+  "SSE.Views.FormatRulesEditDlg.textOutBorders": "Bordas externas",
+  "SSE.Views.FormatRulesEditDlg.textPercent": "Por cento",
+  "SSE.Views.FormatRulesEditDlg.textPercentile": "Percentil",
+  "SSE.Views.FormatRulesEditDlg.textPosition": "Posição",
+  "SSE.Views.FormatRulesEditDlg.textPositive": "Positivo",
+  "SSE.Views.FormatRulesEditDlg.textPresets": "Predefinições",
+  "SSE.Views.FormatRulesEditDlg.textPreview": "Pré-visualizar",
+  "SSE.Views.FormatRulesEditDlg.textRelativeRef": "Não é possível utilizar referências relativas em critérios de formatação condicional para escalas de cores, barras de dados e conjuntos de ícones.",
+  "SSE.Views.FormatRulesEditDlg.textReverse": "Ordem Reversa dos Ícones",
+  "SSE.Views.FormatRulesEditDlg.textRight2Left": "Da direita para a esquerda",
+  "SSE.Views.FormatRulesEditDlg.textRightBorders": "Bordas direitas",
+  "SSE.Views.FormatRulesEditDlg.textRule": "Regra",
+  "SSE.Views.FormatRulesEditDlg.textSameAs": "O mesmo que positivo",
+  "SSE.Views.FormatRulesEditDlg.textSelectData": "Selecionar dados",
+  "SSE.Views.FormatRulesEditDlg.textShortBar": "barra mais curta",
+  "SSE.Views.FormatRulesEditDlg.textShowBar": "Mostrar apenas barra",
+  "SSE.Views.FormatRulesEditDlg.textShowIcon": "Mostrar apenas ícone",
+  "SSE.Views.FormatRulesEditDlg.textSingleRef": "Este tipo de referência não pode ser usado em uma fórmula de formatação condicional.<br>Alterar a referência para uma única célula, ou usar a referência com uma função de planilha, tal como =SOMA(A1:B5).",
+  "SSE.Views.FormatRulesEditDlg.textSolid": "Sólido",
+  "SSE.Views.FormatRulesEditDlg.textStrikeout": "Tachado",
+  "SSE.Views.FormatRulesEditDlg.textSubscript": "Subscrito",
+  "SSE.Views.FormatRulesEditDlg.textSuperscript": "Sobrescrito",
+  "SSE.Views.FormatRulesEditDlg.textTopBorders": "Bordas superiores",
+  "SSE.Views.FormatRulesEditDlg.textUnderline": "Sublinhado",
   "SSE.Views.FormatRulesEditDlg.tipBorders": "Bordas",
   "SSE.Views.FormatRulesEditDlg.tipNumFormat": "Formato Numérico",
   "SSE.Views.FormatRulesEditDlg.txtAccounting": "Contabilidade",
   "SSE.Views.FormatRulesEditDlg.txtCurrency": "Moeda",
   "SSE.Views.FormatRulesEditDlg.txtDate": "Data",
+  "SSE.Views.FormatRulesEditDlg.txtEmpty": "Este campo é obrigatório",
   "SSE.Views.FormatRulesEditDlg.txtFraction": "Fração",
   "SSE.Views.FormatRulesEditDlg.txtGeneral": "Geral",
   "SSE.Views.FormatRulesEditDlg.txtNumber": "Número",
+  "SSE.Views.FormatRulesEditDlg.txtPercentage": "Porcentagem",
+  "SSE.Views.FormatRulesEditDlg.txtScientific": "Científico",
+  "SSE.Views.FormatRulesEditDlg.txtText": "Тexto",
+  "SSE.Views.FormatRulesEditDlg.txtTime": "Hora",
   "SSE.Views.FormatRulesEditDlg.txtTitleEdit": "Editar regra de formatação",
   "SSE.Views.FormatRulesEditDlg.txtTitleNew": "Nova regra de formatação",
   "SSE.Views.FormatRulesManagerDlg.guestText": "Convidado(a)",
+  "SSE.Views.FormatRulesManagerDlg.text1Above": "1 desvio padrão acima da Média",
+  "SSE.Views.FormatRulesManagerDlg.text1Below": "1 desvio padrão abaixo da Média",
+  "SSE.Views.FormatRulesManagerDlg.text2Above": "2 desvios padrão acima da Média",
+  "SSE.Views.FormatRulesManagerDlg.text2Below": "2 desvios padrão abaixo da Média",
+  "SSE.Views.FormatRulesManagerDlg.text3Above": "3 desvios padrão acima da Média",
+  "SSE.Views.FormatRulesManagerDlg.text3Below": "3 desvios padrão abaixo da Média",
   "SSE.Views.FormatRulesManagerDlg.textAbove": "Acima da média",
   "SSE.Views.FormatRulesManagerDlg.textApply": "Aplicar à",
+  "SSE.Views.FormatRulesManagerDlg.textBeginsWith": "O valor da célula começa com",
   "SSE.Views.FormatRulesManagerDlg.textBelow": "Abaixo da média",
   "SSE.Views.FormatRulesManagerDlg.textBetween": "está entre {0} e {1}",
+  "SSE.Views.FormatRulesManagerDlg.textCellValue": "Valor da célula",
   "SSE.Views.FormatRulesManagerDlg.textColorScale": "Escala de cor graduada",
+  "SSE.Views.FormatRulesManagerDlg.textContains": "O valor da célula contém",
   "SSE.Views.FormatRulesManagerDlg.textContainsBlank": "A célula contém um valor em branco",
   "SSE.Views.FormatRulesManagerDlg.textContainsError": "A célula contém um erro",
   "SSE.Views.FormatRulesManagerDlg.textDelete": "Excluir",
@@ -2119,9 +2215,19 @@
   "SSE.Views.FormatRulesManagerDlg.textIconSet": "Conjunto de ícones",
   "SSE.Views.FormatRulesManagerDlg.textNew": "Novo",
   "SSE.Views.FormatRulesManagerDlg.textNotBetween": "não se encontra entre {0} e {1}.",
+  "SSE.Views.FormatRulesManagerDlg.textNotContains": "O valor da célula não contém",
   "SSE.Views.FormatRulesManagerDlg.textNotContainsBlank": "A célula não contém um valor em branco",
+  "SSE.Views.FormatRulesManagerDlg.textNotContainsError": "A célula não contém um erro",
+  "SSE.Views.FormatRulesManagerDlg.textRules": "Regras",
+  "SSE.Views.FormatRulesManagerDlg.textScope": "Mostrar regras de formatação para",
+  "SSE.Views.FormatRulesManagerDlg.textSelectData": "Selecionar dados",
   "SSE.Views.FormatRulesManagerDlg.textSelection": "Seleção atual",
+  "SSE.Views.FormatRulesManagerDlg.textThisPivot": "Tabela dinâmica",
+  "SSE.Views.FormatRulesManagerDlg.textThisSheet": "Esta folha de trabalho",
+  "SSE.Views.FormatRulesManagerDlg.textThisTable": "Esta tabela",
+  "SSE.Views.FormatRulesManagerDlg.textUnique": "Valores únicos",
   "SSE.Views.FormatRulesManagerDlg.textUp": "Mover regra para cima",
+  "SSE.Views.FormatRulesManagerDlg.tipIsLocked": "Este elemento está sendo editado por outro usuário.",
   "SSE.Views.FormatRulesManagerDlg.txtTitle": "Formatação condicional",
   "SSE.Views.FormatSettingsDialog.textCategory": "Categoria",
   "SSE.Views.FormatSettingsDialog.textDecimal": "Decimal",
@@ -2573,7 +2679,7 @@
   "SSE.Views.RightMenu.txtCellSettings": "Configurações de célula",
   "SSE.Views.RightMenu.txtChartSettings": "Configurações do gráfico",
   "SSE.Views.RightMenu.txtImageSettings": "Configurações de imagem",
-  "SSE.Views.RightMenu.txtParagraphSettings": "Configurações de texto",
+  "SSE.Views.RightMenu.txtParagraphSettings": "Configurações do parágrafo",
   "SSE.Views.RightMenu.txtPivotSettings": "Configurações de tabela dinâmica",
   "SSE.Views.RightMenu.txtSettings": "Configurações comuns",
   "SSE.Views.RightMenu.txtShapeSettings": "Configurações da forma",
@@ -3010,6 +3116,7 @@
   "SSE.Views.Toolbar.capInsertHyperlink": "Hiperlink",
   "SSE.Views.Toolbar.capInsertImage": "Imagem",
   "SSE.Views.Toolbar.capInsertShape": "Forma",
+  "SSE.Views.Toolbar.capInsertSpark": "Minigráficos",
   "SSE.Views.Toolbar.capInsertTable": "Tabela",
   "SSE.Views.Toolbar.capInsertText": "Caixa de texto",
   "SSE.Views.Toolbar.mniImageFromFile": "Imagem do arquivo",
@@ -3094,6 +3201,7 @@
   "SSE.Views.Toolbar.textTabLayout": "Layout",
   "SSE.Views.Toolbar.textTabProtect": "Proteção",
   "SSE.Views.Toolbar.textTabView": "Ver",
+  "SSE.Views.Toolbar.textThisPivot": "De uma tabela dinâmica",
   "SSE.Views.Toolbar.textThisSheet": "A partir desta folha de trabalho",
   "SSE.Views.Toolbar.textThisTable": "A partir desta tabela",
   "SSE.Views.Toolbar.textTop": "Superior: ",
diff --git a/apps/spreadsheeteditor/main/locale/ro.json b/apps/spreadsheeteditor/main/locale/ro.json
index 010536dc3..d046ea724 100644
--- a/apps/spreadsheeteditor/main/locale/ro.json
+++ b/apps/spreadsheeteditor/main/locale/ro.json
@@ -48,6 +48,39 @@
   "Common.define.chartData.textStock": "Bursiere",
   "Common.define.chartData.textSurface": "Suprafața",
   "Common.define.chartData.textWinLossSpark": "Câștig/pierdere",
+  "Common.define.conditionalData.exampleText": "AaBbCcYyZz",
+  "Common.define.conditionalData.text1Above": "1 abatere standard deasupra",
+  "Common.define.conditionalData.text1Below": "1 abatere standard dedesubt ",
+  "Common.define.conditionalData.text2Above": "2 abateri standard deasupra",
+  "Common.define.conditionalData.text2Below": "2 abateri standard dedesubt",
+  "Common.define.conditionalData.text3Above": "3 abateri standard deasupra",
+  "Common.define.conditionalData.text3Below": "3 abateri standard dedesubt",
+  "Common.define.conditionalData.textAbove": "Deasupra",
+  "Common.define.conditionalData.textAverage": "Medie",
+  "Common.define.conditionalData.textBegins": "Începe cu",
+  "Common.define.conditionalData.textBelow": "Dedesubt",
+  "Common.define.conditionalData.textBetween": "Între",
+  "Common.define.conditionalData.textBlank": "Necompletat",
+  "Common.define.conditionalData.textBlanks": "Conțime celule goale",
+  "Common.define.conditionalData.textBottom": "Jos",
+  "Common.define.conditionalData.textContains": "Conține",
+  "Common.define.conditionalData.textDataBar": "Bară de date",
+  "Common.define.conditionalData.textDate": "Dată",
+  "Common.define.conditionalData.textDuplicate": "Dubluri",
+  "Common.define.conditionalData.textEnds": "Se termină cu",
+  "Common.define.conditionalData.textEqAbove": "Egal cu sau deasupra",
+  "Common.define.conditionalData.textEqBelow": "Egal cu sau sub",
+  "Common.define.conditionalData.textEqual": "Egal cu",
+  "Common.define.conditionalData.textError": "Eroare",
+  "Common.define.conditionalData.textErrors": "Conține erori",
+  "Common.define.conditionalData.textFormula": "Formula",
+  "Common.define.conditionalData.textGreater": "Mai mare decât",
+  "Common.define.conditionalData.textGreaterEq": "Mai mare sau egal",
+  "Common.define.conditionalData.textIconSets": "Ansamble de icoane",
+  "Common.define.conditionalData.textLast7days": "În ultimele 7 zile",
+  "Common.define.conditionalData.textNotBlanks": "Nu conțime celule goale",
+  "Common.define.conditionalData.textNotContains": "Nu conține",
+  "Common.define.conditionalData.textNotErrors": "Nu conține erori",
   "Common.Translation.warnFileLocked": "Fișierul este editat într-o altă aplicație. Puteți continua să editați și să-l salvați ca o copie.",
   "Common.Translation.warnFileLockedBtnEdit": "Crează o copie",
   "Common.Translation.warnFileLockedBtnView": "Deschide vizualizarea",
@@ -76,7 +109,7 @@
   "Common.UI.SynchronizeTip.textSynchronize": "Documentul a fost modificat de către un alt utilizator.<br>Salvați modificările făcute de dumneavoastră și reîmprospătați documentul.",
   "Common.UI.ThemeColorPalette.textStandartColors": "Culori standard",
   "Common.UI.ThemeColorPalette.textThemeColors": "Culori temă",
-  "Common.UI.Themes.txtThemeClassicLight": "Luminos Clasic",
+  "Common.UI.Themes.txtThemeClassicLight": "Clasic Luminos",
   "Common.UI.Themes.txtThemeDark": "Întunecat",
   "Common.UI.Themes.txtThemeLight": "Luminos",
   "Common.UI.Window.cancelButtonText": "Anulare",
@@ -100,6 +133,7 @@
   "Common.Views.About.txtVersion": "Versiune",
   "Common.Views.AutoCorrectDialog.textAdd": "Adaugă",
   "Common.Views.AutoCorrectDialog.textApplyAsWork": "Se aplică în timp ce lucrați",
+  "Common.Views.AutoCorrectDialog.textAutoCorrect": "AutoCorecție",
   "Common.Views.AutoCorrectDialog.textAutoFormat": "Formatare automată la tastare",
   "Common.Views.AutoCorrectDialog.textBy": "După",
   "Common.Views.AutoCorrectDialog.textDelete": "Ștergere",
@@ -190,6 +224,7 @@
   "Common.Views.OpenDialog.txtColon": "Două puncte",
   "Common.Views.OpenDialog.txtComma": "Virgulă",
   "Common.Views.OpenDialog.txtDelimiter": "Delimitator",
+  "Common.Views.OpenDialog.txtDestData": "Alegeți locul unde se va plasa datele",
   "Common.Views.OpenDialog.txtEncoding": "Codificare",
   "Common.Views.OpenDialog.txtIncorrectPwd": "Parolă incorectă",
   "Common.Views.OpenDialog.txtOpenFile": "Introduceți parola pentru deschidere fișier",
@@ -619,6 +654,7 @@
   "SSE.Controllers.Main.errorWrongOperator": "Eroare în formulă. Operator necorespunzător.<br>Corectați eroarea.",
   "SSE.Controllers.Main.errRemDuplicates": "Valori dublate au fost identificate și eliminate: {0}, valorile unice rămase: {1}.",
   "SSE.Controllers.Main.leavePageText": "Nu ați salvat modificările din foaia de calcul. Faceți clic pe  Rămâi în pagină și apoi pe Salvare dacă doriți să le salvați. Faceți clic pe Părăsește aceasta pagina ca să renunțați la toate modificările nesalvate.",
+  "SSE.Controllers.Main.leavePageTextOnClose": "Toate modificările nesalvate din foaia de calcul vor fi pierdute.<br> Pentru a le salva, faceți clic pe Revocare și apoi pe Salvare. Apăsați OK dacă doriți să renunțați la modificările nesalvate.",
   "SSE.Controllers.Main.loadFontsTextText": "Încărcarea datelor...",
   "SSE.Controllers.Main.loadFontsTitleText": "Încărcarea datelor",
   "SSE.Controllers.Main.loadFontTextText": "Încărcarea datelor...",
@@ -954,9 +990,11 @@
   "SSE.Controllers.Toolbar.errorStockChart": "Sortarea rândurilor în ordinea incorectă. Pentru crearea unei diagrame de stoc, datele în foaie trebuie sortate în ordinea următoare:<br> prețul de deschidere, prețul maxim, prețul minim, prețul de închidere.",
   "SSE.Controllers.Toolbar.textAccent": "Accente",
   "SSE.Controllers.Toolbar.textBracket": "Paranteze",
+  "SSE.Controllers.Toolbar.textDirectional": "Direcțional",
   "SSE.Controllers.Toolbar.textFontSizeErr": "Valoarea introdusă nu este corectă.<br>Selectați valoarea cuprinsă înte 1 și 409.",
   "SSE.Controllers.Toolbar.textFraction": "Fracții",
   "SSE.Controllers.Toolbar.textFunction": "Funcții",
+  "SSE.Controllers.Toolbar.textIndicator": "Indicatorii",
   "SSE.Controllers.Toolbar.textInsert": "Inserare",
   "SSE.Controllers.Toolbar.textIntegral": "Integrale",
   "SSE.Controllers.Toolbar.textLargeOperator": "Operatori mari",
@@ -1360,8 +1398,12 @@
   "SSE.Views.CellSettings.textBackground": "Culoare de fundal",
   "SSE.Views.CellSettings.textBorderColor": "Culoare",
   "SSE.Views.CellSettings.textBorders": "Stil borduri",
+  "SSE.Views.CellSettings.textClearRule": "Golire reguli",
   "SSE.Views.CellSettings.textColor": "Culoare de umplere",
+  "SSE.Views.CellSettings.textColorScales": "Scale de culori",
+  "SSE.Views.CellSettings.textCondFormat": "Formatarea condiționată",
   "SSE.Views.CellSettings.textControl": "Control de text",
+  "SSE.Views.CellSettings.textDataBars": "Bare de date",
   "SSE.Views.CellSettings.textDirection": "Orientare",
   "SSE.Views.CellSettings.textFill": "Umplere",
   "SSE.Views.CellSettings.textForeground": "Culoarea de prim plan",
@@ -1377,6 +1419,10 @@
   "SSE.Views.CellSettings.textPosition": "Poziție",
   "SSE.Views.CellSettings.textRadial": "Radială",
   "SSE.Views.CellSettings.textSelectBorders": "Selectați borduri pe care doriți să le modificați prin aplicarea stilului selectat",
+  "SSE.Views.CellSettings.textSelection": "Din selecția curentă",
+  "SSE.Views.CellSettings.textThisPivot": "Din acest tabel pivot",
+  "SSE.Views.CellSettings.textThisSheet": "Din această foaie de calcul",
+  "SSE.Views.CellSettings.textThisTable": "Din acest tabel",
   "SSE.Views.CellSettings.tipAddGradientPoint": "Adăugare stop gradient",
   "SSE.Views.CellSettings.tipAll": "Adăugare bordură exterioară și toate borduri interioare",
   "SSE.Views.CellSettings.tipBottom": "Adăugare numai bordură exterioară de jos",
@@ -1586,14 +1632,19 @@
   "SSE.Views.CreatePivotDialog.textInvalidRange": "Zonă de celule nu este validă",
   "SSE.Views.CreatePivotDialog.textNew": "Foaie de calcul nouă",
   "SSE.Views.CreatePivotDialog.textSelectData": "Selectare date",
-  "SSE.Views.CreatePivotDialog.textTitle": "Creare tabelă Pivot",
+  "SSE.Views.CreatePivotDialog.textTitle": "Creare tabel Pivot",
   "SSE.Views.CreatePivotDialog.txtEmpty": "Câmp obligatoriu",
+  "SSE.Views.CreateSparklineDialog.textDestination": "Alegeți locul unde se va plasa diagrama sparkline",
+  "SSE.Views.CreateSparklineDialog.textTitle": "Creare diagrame sparkline",
   "SSE.Views.DataTab.capBtnGroup": "Grupare",
   "SSE.Views.DataTab.capBtnTextCustomSort": "Sortare particularizată",
   "SSE.Views.DataTab.capBtnTextDataValidation": "Validarea datelor",
   "SSE.Views.DataTab.capBtnTextRemDuplicates": "Eliminare dubluri",
   "SSE.Views.DataTab.capBtnTextToCol": "Text în coloane",
   "SSE.Views.DataTab.capBtnUngroup": "Anularea grupării",
+  "SSE.Views.DataTab.capDataFromText": "Din text/CSV",
+  "SSE.Views.DataTab.mniFromFile": "Colectare date din fișier",
+  "SSE.Views.DataTab.mniFromUrl": "Colectare date prin URL",
   "SSE.Views.DataTab.textBelow": "Rânduri rezumative sub detalii",
   "SSE.Views.DataTab.textClear": "Golire schiță",
   "SSE.Views.DataTab.textColumns": "Anularea grupării coloanelor",
@@ -1602,6 +1653,7 @@
   "SSE.Views.DataTab.textRightOf": "Rezumat coloane la dreapta detaliilor",
   "SSE.Views.DataTab.textRows": "Anularea grupării rândurilor",
   "SSE.Views.DataTab.tipCustomSort": "Sortare particularizată",
+  "SSE.Views.DataTab.tipDataFromText": "Colectare date din fișierul text/CSV",
   "SSE.Views.DataTab.tipDataValidation": "Validarea datelor",
   "SSE.Views.DataTab.tipGroup": "Grupare zonă de celule",
   "SSE.Views.DataTab.tipRemDuplicates": "Eliminarea rândurilor dublate dintr-o foaie",
@@ -1725,6 +1777,7 @@
   "SSE.Views.DocumentHolder.textArrangeForward": "Aducere în plan apropiat",
   "SSE.Views.DocumentHolder.textArrangeFront": "Aducere în prim plan",
   "SSE.Views.DocumentHolder.textAverage": "Medie",
+  "SSE.Views.DocumentHolder.textBullets": "Marcatori",
   "SSE.Views.DocumentHolder.textCount": "Contorizare",
   "SSE.Views.DocumentHolder.textCrop": "Trunchiere",
   "SSE.Views.DocumentHolder.textCropFill": "Umplere",
@@ -1737,6 +1790,7 @@
   "SSE.Views.DocumentHolder.textFromStorage": "Din serviciul stocare",
   "SSE.Views.DocumentHolder.textFromUrl": "Prin URL-ul",
   "SSE.Views.DocumentHolder.textListSettings": "Setări lista",
+  "SSE.Views.DocumentHolder.textMacro": "Asocierea macrocomenzii",
   "SSE.Views.DocumentHolder.textMax": "Max",
   "SSE.Views.DocumentHolder.textMin": "Min",
   "SSE.Views.DocumentHolder.textMore": "Mai multe funcții",
@@ -1818,7 +1872,7 @@
   "SSE.Views.DocumentHolder.txtSortFontColor": "Culoarea fontului selectat în partea de sus",
   "SSE.Views.DocumentHolder.txtSparklines": "Diagrame sparkline",
   "SSE.Views.DocumentHolder.txtText": "Text",
-  "SSE.Views.DocumentHolder.txtTextAdvanced": "Setări avansate text",
+  "SSE.Views.DocumentHolder.txtTextAdvanced": "Setări avansate paragraf ",
   "SSE.Views.DocumentHolder.txtTime": "Oră",
   "SSE.Views.DocumentHolder.txtUngroup": "Anularea grupării",
   "SSE.Views.DocumentHolder.txtWidth": "Lățime",
@@ -1926,17 +1980,27 @@
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textForceSave": "Salvare pe server",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textMinute": "La fiecare minută",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textRefStyle": "Stil referință",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtBe": "Belarusă",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtBg": "Bulgară",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtCa": "Catalană",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtCacheMode": "Mod implicit memoria Cache",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtCm": "Centimetru",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtCs": "Cehă",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtDa": "Daneză",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtDe": "Germană",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtEl": "Greacă",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtEn": "Engleză",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtEs": "Spaniolă",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtFi": "Finlandeză",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtFr": "Franceză",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtHu": "Maghiară",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtId": "Indoneziană",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtInch": "Inch",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtIt": "Italiană",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtLiveComment": "Afișare comentarii",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtMac": "ca OS X",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtNative": "Sursă",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtNl": "Neerlandeză",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtPl": "Poloneză",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtPt": "Punct",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtRu": "Rusă",
@@ -1947,6 +2011,7 @@
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtWarnMacros": "Afișare notificări",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtWarnMacrosDesc": "Se dezactivează toate macrocomenzile, cu notificare   ",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtWin": "ca Windows",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtZh": "Chineză",
   "SSE.Views.FileMenuPanels.MainSpellCheckSettings.okButtonText": "Aplicare",
   "SSE.Views.FileMenuPanels.MainSpellCheckSettings.strDictionaryLanguage": "Limbă de dicționar",
   "SSE.Views.FileMenuPanels.MainSpellCheckSettings.strIgnoreWordsInUPPERCASE": "Ignoră cuvintele cu MAJUSCULE",
@@ -1967,6 +2032,77 @@
   "SSE.Views.FileMenuPanels.Settings.txtGeneral": "General",
   "SSE.Views.FileMenuPanels.Settings.txtPageSettings": "Setare pagină",
   "SSE.Views.FileMenuPanels.Settings.txtSpellChecking": "Verificarea ortografică",
+  "SSE.Views.FormatRulesEditDlg.fillColor": "Culoare de fundal",
+  "SSE.Views.FormatRulesEditDlg.text2Scales": "Scară cu două culori",
+  "SSE.Views.FormatRulesEditDlg.text3Scales": "Scară cu trei culori",
+  "SSE.Views.FormatRulesEditDlg.textAllBorders": "Toate borduri",
+  "SSE.Views.FormatRulesEditDlg.textAppearance": "Aspect bară",
+  "SSE.Views.FormatRulesEditDlg.textApply": "Se aplică la zonă",
+  "SSE.Views.FormatRulesEditDlg.textAutomatic": "Automat",
+  "SSE.Views.FormatRulesEditDlg.textAxis": "Axă",
+  "SSE.Views.FormatRulesEditDlg.textBarDirection": "Direcția barei",
+  "SSE.Views.FormatRulesEditDlg.textBold": "Aldin",
+  "SSE.Views.FormatRulesEditDlg.textBorder": "Bordura",
+  "SSE.Views.FormatRulesEditDlg.textBordersColor": "Culoare borduri",
+  "SSE.Views.FormatRulesEditDlg.textBordersStyle": "Stil bordură",
+  "SSE.Views.FormatRulesEditDlg.textBottomBorders": "Bordurile în partea de jos",
+  "SSE.Views.FormatRulesEditDlg.textCannotAddCF": "Formatarea condiționată nu poate fi ajutată.",
+  "SSE.Views.FormatRulesEditDlg.textCellMidpoint": "Punctul central al celulei",
+  "SSE.Views.FormatRulesEditDlg.textCenterBorders": "Bordurile verticale în interiorul ",
+  "SSE.Views.FormatRulesEditDlg.textClear": "Golire",
+  "SSE.Views.FormatRulesEditDlg.textContext": "Context",
+  "SSE.Views.FormatRulesEditDlg.textCustom": "Particularizat",
+  "SSE.Views.FormatRulesEditDlg.textDiagDownBorder": "Bordură diagonală descendentă",
+  "SSE.Views.FormatRulesEditDlg.textDiagUpBorder": "Bordură diagonală ascendentă",
+  "SSE.Views.FormatRulesEditDlg.textEmptyFormula": "Introduceți o formulă valabilă.",
+  "SSE.Views.FormatRulesEditDlg.textEmptyText": "Introduceți o valoare.",
+  "SSE.Views.FormatRulesEditDlg.textErrorTop10Between": "Introduceți cifra între {0} și {1}.",
+  "SSE.Views.FormatRulesEditDlg.textFill": "Umplere",
+  "SSE.Views.FormatRulesEditDlg.textFormat": "Formatare",
+  "SSE.Views.FormatRulesEditDlg.textFormula": "Formula",
+  "SSE.Views.FormatRulesEditDlg.textGradient": "Gradient",
+  "SSE.Views.FormatRulesEditDlg.textIconStyle": "Stil icoană",
+  "SSE.Views.FormatRulesEditDlg.textInsideBorders": "Borduri în interiorul ",
+  "SSE.Views.FormatRulesEditDlg.textInvalidRange": "EROARE! Zonă de celule nu este validă",
+  "SSE.Views.FormatRulesEditDlg.textMiddleBorders": "Bordurile orizontale în interiorul ",
+  "SSE.Views.FormatRulesEditDlg.textNewColor": "Adăugarea unei culori particularizate noi",
+  "SSE.Views.FormatRulesEditDlg.tipBorders": "Borduri",
+  "SSE.Views.FormatRulesEditDlg.txtAccounting": "Contabilitate",
+  "SSE.Views.FormatRulesEditDlg.txtCurrency": "Monedă",
+  "SSE.Views.FormatRulesEditDlg.txtDate": "Dată",
+  "SSE.Views.FormatRulesEditDlg.txtFraction": "Fracție",
+  "SSE.Views.FormatRulesEditDlg.txtGeneral": "General",
+  "SSE.Views.FormatRulesEditDlg.txtTitleEdit": "Editare regulă de formatare",
+  "SSE.Views.FormatRulesManagerDlg.guestText": "Invitat",
+  "SSE.Views.FormatRulesManagerDlg.text1Above": "1 abatere standard deasupra medie",
+  "SSE.Views.FormatRulesManagerDlg.text1Below": "1 abatere standard sub medie",
+  "SSE.Views.FormatRulesManagerDlg.text2Above": "2 abateri standard deasupra medie",
+  "SSE.Views.FormatRulesManagerDlg.text2Below": "2 abateri standard sub medie",
+  "SSE.Views.FormatRulesManagerDlg.text3Above": "3 abateri standard deasupra medie",
+  "SSE.Views.FormatRulesManagerDlg.text3Below": "3 abateri standard sub medie",
+  "SSE.Views.FormatRulesManagerDlg.textAbove": "Deasupra medie",
+  "SSE.Views.FormatRulesManagerDlg.textApply": "Se aplică la",
+  "SSE.Views.FormatRulesManagerDlg.textBeginsWith": "Valoarea din celulă se începe cu",
+  "SSE.Views.FormatRulesManagerDlg.textBelow": "Sub medie",
+  "SSE.Views.FormatRulesManagerDlg.textCellValue": "Valoarea din celulă",
+  "SSE.Views.FormatRulesManagerDlg.textColorScale": "Scală de culoare cu gradare ",
+  "SSE.Views.FormatRulesManagerDlg.textContains": "Valoarea din celulă conține",
+  "SSE.Views.FormatRulesManagerDlg.textContainsBlank": "Celula canține o valorae goală",
+  "SSE.Views.FormatRulesManagerDlg.textContainsError": "Celula conține o eroare",
+  "SSE.Views.FormatRulesManagerDlg.textDelete": "Ștergere",
+  "SSE.Views.FormatRulesManagerDlg.textDuplicate": "Valori duble",
+  "SSE.Views.FormatRulesManagerDlg.textEdit": "Editare",
+  "SSE.Views.FormatRulesManagerDlg.textEnds": "Valoarea din celulă se termină cu",
+  "SSE.Views.FormatRulesManagerDlg.textEqAbove": "Egal cu sau deasupra medie",
+  "SSE.Views.FormatRulesManagerDlg.textEqBelow": "Egal cu sau sub medie",
+  "SSE.Views.FormatRulesManagerDlg.textFormat": "Formatare",
+  "SSE.Views.FormatRulesManagerDlg.textIconSet": "Ansamblul de icoane",
+  "SSE.Views.FormatRulesManagerDlg.textNotContains": "Valoarea din celulă nu conține",
+  "SSE.Views.FormatRulesManagerDlg.textNotContainsBlank": "Celula nu conține nicio valoare goală",
+  "SSE.Views.FormatRulesManagerDlg.textNotContainsError": "Celula nu conține nicio eroare",
+  "SSE.Views.FormatRulesManagerDlg.textSelection": "Selecția curentă",
+  "SSE.Views.FormatRulesManagerDlg.textThisTable": "Acest tabel",
+  "SSE.Views.FormatRulesManagerDlg.txtTitle": "Formatarea condiționată",
   "SSE.Views.FormatSettingsDialog.textCategory": "Categorie",
   "SSE.Views.FormatSettingsDialog.textDecimal": "Zecimal",
   "SSE.Views.FormatSettingsDialog.textFormat": "Formatare",
@@ -2131,6 +2267,7 @@
   "SSE.Views.LeftMenu.txtLimit": "Limitare acces",
   "SSE.Views.LeftMenu.txtTrial": "PERIOADĂ DE PROBĂ",
   "SSE.Views.LeftMenu.txtTrialDev": "Mod dezvoltator de încercare",
+  "SSE.Views.MacroDialog.textTitle": "Asocierea macrocomenzii",
   "SSE.Views.MainSettingsPrint.okButtonText": "Salvează",
   "SSE.Views.MainSettingsPrint.strBottom": "Jos",
   "SSE.Views.MainSettingsPrint.strLandscape": "Vedere",
@@ -2347,7 +2484,7 @@
   "SSE.Views.PivotTable.textColHeader": "Anteturi coloană",
   "SSE.Views.PivotTable.textRowBanded": "Rânduri alternante",
   "SSE.Views.PivotTable.textRowHeader": "Anteturi rând",
-  "SSE.Views.PivotTable.tipCreatePivot": "Inserare tabelă Pivot",
+  "SSE.Views.PivotTable.tipCreatePivot": "Inserare tabel Pivot",
   "SSE.Views.PivotTable.tipGrandTotals": "Afișare sau ascundere totaluri generale",
   "SSE.Views.PivotTable.tipRefresh": "Actualizarea sursei de informație",
   "SSE.Views.PivotTable.tipSelect": "Selectați tabel Pivot întreg",
@@ -2415,7 +2552,7 @@
   "SSE.Views.RightMenu.txtCellSettings": "Setări celula",
   "SSE.Views.RightMenu.txtChartSettings": "Setări diagramă",
   "SSE.Views.RightMenu.txtImageSettings": "Setări imagine",
-  "SSE.Views.RightMenu.txtParagraphSettings": "Setări text",
+  "SSE.Views.RightMenu.txtParagraphSettings": "Setări paragraf",
   "SSE.Views.RightMenu.txtPivotSettings": "Setări tabelă Pivot",
   "SSE.Views.RightMenu.txtSettings": "Setări comune",
   "SSE.Views.RightMenu.txtShapeSettings": "Setări forma",
@@ -2832,6 +2969,7 @@
   "SSE.Views.TextArtSettings.txtPapyrus": "Papirus",
   "SSE.Views.TextArtSettings.txtWood": "Lemn",
   "SSE.Views.Toolbar.capBtnAddComment": "Adaugă comentariu",
+  "SSE.Views.Toolbar.capBtnColorSchemas": "Schemă de culori",
   "SSE.Views.Toolbar.capBtnComment": "Comentariu",
   "SSE.Views.Toolbar.capBtnInsHeader": "Antet/Subsol",
   "SSE.Views.Toolbar.capBtnInsSlicer": "Slicer",
@@ -2874,8 +3012,11 @@
   "SSE.Views.Toolbar.textBottomBorders": "bordurile în partea de jos",
   "SSE.Views.Toolbar.textCenterBorders": "Bordurile verticale în interiorul ",
   "SSE.Views.Toolbar.textClearPrintArea": "Golire zonă de imprimare",
+  "SSE.Views.Toolbar.textClearRule": "Golire reguli",
   "SSE.Views.Toolbar.textClockwise": "Unghi de rotație în sens orar",
+  "SSE.Views.Toolbar.textColorScales": "Scale de culori",
   "SSE.Views.Toolbar.textCounterCw": "Unghi de rotație în sens antiorar",
+  "SSE.Views.Toolbar.textDataBars": "Bare de date",
   "SSE.Views.Toolbar.textDelLeft": "Deplasare celule la stânga",
   "SSE.Views.Toolbar.textDelUp": "Deplasare celule în sus",
   "SSE.Views.Toolbar.textDiagDownBorder": "Bordură diagonală descendentă",
@@ -2914,6 +3055,7 @@
   "SSE.Views.Toolbar.textRotateUp": "Rotirea textului în sus",
   "SSE.Views.Toolbar.textScale": "Scară",
   "SSE.Views.Toolbar.textScaleCustom": "Particularizat",
+  "SSE.Views.Toolbar.textSelection": "Din selecția curentă",
   "SSE.Views.Toolbar.textSetPrintArea": "Setare zonă de imprimare",
   "SSE.Views.Toolbar.textStrikeout": "Tăiere cu o linie",
   "SSE.Views.Toolbar.textSubscript": "Indice",
@@ -2928,6 +3070,9 @@
   "SSE.Views.Toolbar.textTabLayout": "Aspect",
   "SSE.Views.Toolbar.textTabProtect": "Protejare",
   "SSE.Views.Toolbar.textTabView": "Vizualizare",
+  "SSE.Views.Toolbar.textThisPivot": "Din acest tabel pivot",
+  "SSE.Views.Toolbar.textThisSheet": "Din această foaie de calcul",
+  "SSE.Views.Toolbar.textThisTable": "Din acest tabel",
   "SSE.Views.Toolbar.textTop": "Sus:",
   "SSE.Views.Toolbar.textTopBorders": "Borduri de sus",
   "SSE.Views.Toolbar.textUnderline": "Subliniat",
@@ -2948,6 +3093,7 @@
   "SSE.Views.Toolbar.tipChangeChart": "Modificare tip diagramă",
   "SSE.Views.Toolbar.tipClearStyle": "Golire",
   "SSE.Views.Toolbar.tipColorSchemas": "Modificare schemă de culori",
+  "SSE.Views.Toolbar.tipCondFormat": "Formatarea condiționată",
   "SSE.Views.Toolbar.tipCopy": "Copiere",
   "SSE.Views.Toolbar.tipCopyStyle": "Copiere stil",
   "SSE.Views.Toolbar.tipDecDecimal": "Micșorare zecimală",
@@ -2975,6 +3121,7 @@
   "SSE.Views.Toolbar.tipInsertOpt": "Inserare celule",
   "SSE.Views.Toolbar.tipInsertShape": "Inserare formă automată",
   "SSE.Views.Toolbar.tipInsertSlicer": "Inserare slicer",
+  "SSE.Views.Toolbar.tipInsertSpark": "Inserare diagramă sparkline",
   "SSE.Views.Toolbar.tipInsertSymbol": "Inserare simbol",
   "SSE.Views.Toolbar.tipInsertTable": "Inserare tabel",
   "SSE.Views.Toolbar.tipInsertText": "Inserare casetă text",
diff --git a/apps/spreadsheeteditor/main/locale/ru.json b/apps/spreadsheeteditor/main/locale/ru.json
index 324806a0b..50946ceb9 100644
--- a/apps/spreadsheeteditor/main/locale/ru.json
+++ b/apps/spreadsheeteditor/main/locale/ru.json
@@ -127,7 +127,7 @@
   "Common.UI.SynchronizeTip.textSynchronize": "Документ изменен другим пользователем.<br/>Нажмите, чтобы сохранить свои изменения и загрузить обновления.",
   "Common.UI.ThemeColorPalette.textStandartColors": "Стандартные цвета",
   "Common.UI.ThemeColorPalette.textThemeColors": "Цвета темы",
-  "Common.UI.Themes.txtThemeClassicLight": "Светлая классическая",
+  "Common.UI.Themes.txtThemeClassicLight": "Классическая светлая",
   "Common.UI.Themes.txtThemeDark": "Темная",
   "Common.UI.Themes.txtThemeLight": "Светлая",
   "Common.UI.Window.cancelButtonText": "Отмена",
@@ -1994,7 +1994,7 @@
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strDecimalSeparator": "Десятичный разделитель",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFast": "Быстрый",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFontRender": "Хинтинг шрифтов",
-  "SSE.Views.FileMenuPanels.MainSettingsGeneral.strForcesave": "Всегда сохранять на сервере (в противном случае сохранять на сервере при закрытии документа)",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.strForcesave": "Добавлять версию в хранилище после нажатия кнопки Сохранить или Ctrl+S",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocale": "Язык формул",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocaleEx": "Пример: СУММ; МИН; МАКС; СЧЁТ",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.strLiveComment": "Включить отображение комментариев в тексте",
@@ -2019,7 +2019,7 @@
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textAutoRecover": "Автовосстановление",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textAutoSave": "Автосохранение",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textDisabled": "Отключено",
-  "SSE.Views.FileMenuPanels.MainSettingsGeneral.textForceSave": "Сохранять на сервере",
+  "SSE.Views.FileMenuPanels.MainSettingsGeneral.textForceSave": "Сохранение промежуточных версий",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textMinute": "Каждую минуту",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.textRefStyle": "Стиль ссылок",
   "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtBe": "Белорусский",
diff --git a/apps/spreadsheeteditor/main/locale/zh.json b/apps/spreadsheeteditor/main/locale/zh.json
index 7c4d7ebc4..bed415854 100644
--- a/apps/spreadsheeteditor/main/locale/zh.json
+++ b/apps/spreadsheeteditor/main/locale/zh.json
@@ -831,7 +831,7 @@
   "SSE.Controllers.Main.txtValues": "值",
   "SSE.Controllers.Main.txtXAxis": "X轴",
   "SSE.Controllers.Main.txtYAxis": "Y轴",
-  "SSE.Controllers.Main.unknownErrorText": "示知错误",
+  "SSE.Controllers.Main.unknownErrorText": "未知错误",
   "SSE.Controllers.Main.unsupportedBrowserErrorText": "你的浏览器不支持",
   "SSE.Controllers.Main.uploadImageExtMessage": "未知图像格式",
   "SSE.Controllers.Main.uploadImageFileCountMessage": "没有图片上传",

From 093a5857aba631ddc04f175ebed72584c5a50f06 Mon Sep 17 00:00:00 2001
From: Maxim Kadushkin <maxim.kadushkin@onlyoffice.com>
Date: Fri, 18 Jun 2021 13:10:18 +0300
Subject: [PATCH 57/86] [deploy] debug

---
 vendor/framework7-react/build/webpack.config.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/vendor/framework7-react/build/webpack.config.js b/vendor/framework7-react/build/webpack.config.js
index e9a53c7dc..ba15ce0d7 100644
--- a/vendor/framework7-react/build/webpack.config.js
+++ b/vendor/framework7-react/build/webpack.config.js
@@ -50,7 +50,7 @@ module.exports = {
       jquery: 'jQuery'
   },
 
-  devtool: env === 'production' ? false : 'source-map',
+  devtool: env === 'production' ? /*false*/'source-map' : 'source-map', // TODO: turn off debugger source map before release
   optimization: {
     minimizer: [new TerserPlugin({
     })],

From b713a7fe09d9d18776066e631464f6a04e71de6c Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Fri, 18 Jun 2021 13:50:43 +0300
Subject: [PATCH 58/86] [SSE] Fix Bug 50788

---
 apps/spreadsheeteditor/main/app/controller/Main.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js
index 1c151ad97..b4a7ff145 100644
--- a/apps/spreadsheeteditor/main/app/controller/Main.js
+++ b/apps/spreadsheeteditor/main/app/controller/Main.js
@@ -1739,7 +1739,7 @@ define([
                 }
 
                 if (!Common.Utils.ModalWindow.isVisible() || $('.asc-window.modal.alert[data-value=' + id + ']').length<1)
-                    Common.UI.alert(config).$window.attr('data-value', id);
+                    setTimeout(function() {Common.UI.alert(config).$window.attr('data-value', id);}, 1);
 
                 (id!==undefined) && Common.component.Analytics.trackEvent('Internal Error', id.toString());
             },

From c85901a9083fb67fd8635817287d49e5da95865e Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Fri, 18 Jun 2021 14:11:47 +0300
Subject: [PATCH 59/86] [DE mobile] Fix Bug 50904

---
 apps/documenteditor/mobile/locale/en.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apps/documenteditor/mobile/locale/en.json b/apps/documenteditor/mobile/locale/en.json
index e1d8253ba..5c411af04 100644
--- a/apps/documenteditor/mobile/locale/en.json
+++ b/apps/documenteditor/mobile/locale/en.json
@@ -143,7 +143,7 @@
   "Common": {
     "ThemeColorPalette": {
       "textThemeColors": "Theme Colors",
-      "textStandartColors": "Standart Colors",
+      "textStandartColors": "Standard Colors",
       "textCustomColors": "Custom Colors"
     },
     "Collaboration": {

From f39449e57d2bd2ea8aab59f510755e70a51007e5 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Fri, 18 Jun 2021 14:33:57 +0300
Subject: [PATCH 60/86] [SSE] Fix Bug 50762

---
 apps/spreadsheeteditor/main/app/view/ChartSettingsDlg.js | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/apps/spreadsheeteditor/main/app/view/ChartSettingsDlg.js b/apps/spreadsheeteditor/main/app/view/ChartSettingsDlg.js
index ad14d1b3b..687f68387 100644
--- a/apps/spreadsheeteditor/main/app/view/ChartSettingsDlg.js
+++ b/apps/spreadsheeteditor/main/app/view/ChartSettingsDlg.js
@@ -1419,6 +1419,8 @@ define([    'text!spreadsheeteditor/main/app/template/ChartSettingsDlg.template'
                     this.cmbLegendPos.setValue(props.getLegendPos());
 
                     this.updateDataLabels(this._state.ChartType, props.getDataLabelsPos());
+                    this.cmbDataLabels.setDisabled(this._state.ChartType==Asc.c_oAscChartTypeSettings.surfaceNormal ||
+                                                   this._state.ChartType == Asc.c_oAscChartTypeSettings.surfaceWireframe);
 
                     this.chSeriesName.setValue(this.chartSettings.getShowSerName(), true);
                     this.chCategoryName.setValue(this.chartSettings.getShowCatName(), true);

From 67397c762d4b351a95c00720591b5edbc8505d77 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Fri, 18 Jun 2021 14:34:26 +0300
Subject: [PATCH 61/86] [SSE] Fix icons for surface and contour chart types

---
 .../main/app/view/ChartTypeDialog.js          | 21 +++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/apps/spreadsheeteditor/main/app/view/ChartTypeDialog.js b/apps/spreadsheeteditor/main/app/view/ChartTypeDialog.js
index ba3f190ee..a7708b77c 100644
--- a/apps/spreadsheeteditor/main/app/view/ChartTypeDialog.js
+++ b/apps/spreadsheeteditor/main/app/view/ChartTypeDialog.js
@@ -232,8 +232,25 @@ define([
                 this.mnuChartTypePicker.selectRecord(record, true);
                 if (record) {
                     this.btnChartType.setIconCls('svgicon ' + 'chart-' + record.get('iconCls'));
-                } else
-                    this.btnChartType.setIconCls('svgicon');
+                } else {
+                    var iconcls = '';
+                    switch (this.currentChartType) {
+                        case Asc.c_oAscChartTypeSettings.surfaceNormal:
+                            iconcls = 'chart-surface-normal';
+                            break;
+                        case Asc.c_oAscChartTypeSettings.surfaceWireframe:
+                            iconcls = 'chart-surface-wireframe';
+                            break;
+                        case Asc.c_oAscChartTypeSettings.contourNormal:
+                            iconcls = 'chart-contour-wireframe';
+                            break;
+                        case Asc.c_oAscChartTypeSettings.contourWireframe:
+                            iconcls = 'chart-contour-wireframe';
+                            break;
+
+                    }
+                    this.btnChartType.setIconCls('svgicon ' + iconcls);
+                }
                 this.seriesList.on('item:add', _.bind(this.addControls, this));
                 this.seriesList.on('item:change', _.bind(this.addControls, this));
                 this.ShowHideSettings(this.currentChartType);

From bd3629838e0d205b9c34acddfb2018391a749948 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Fri, 18 Jun 2021 15:24:44 +0300
Subject: [PATCH 62/86] [DE] Fix Bug 50920

---
 apps/documenteditor/main/app/controller/Toolbar.js | 6 +++++-
 apps/documenteditor/main/app/view/Toolbar.js       | 5 -----
 2 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js
index 8a36cc75b..a48fe02ad 100644
--- a/apps/documenteditor/main/app/controller/Toolbar.js
+++ b/apps/documenteditor/main/app/controller/Toolbar.js
@@ -1227,8 +1227,12 @@ define([
 
         onHorizontalAlign: function(type, btn, e) {
             this._state.pralign = undefined;
-            if (this.api)
+            if (this.api) {
+                if (!btn.pressed) {
+                    type = (type==1) ? 3 : 1;
+                }
                 this.api.put_PrAlign(type);
+            }
 
             Common.NotificationCenter.trigger('edit:complete', this.toolbar);
             Common.component.Analytics.trackEvent('ToolBar', 'Align');
diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js
index 3b3ebca59..534b5fad1 100644
--- a/apps/documenteditor/main/app/view/Toolbar.js
+++ b/apps/documenteditor/main/app/view/Toolbar.js
@@ -311,7 +311,6 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-align-left',
                         enableToggle: true,
-                        allowDepress: false,
                         toggleGroup: 'alignGroup'
                     });
                     this.paragraphControls.push(this.btnAlignLeft);
@@ -321,7 +320,6 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-align-center',
                         enableToggle: true,
-                        allowDepress: false,
                         toggleGroup: 'alignGroup'
                     });
                     this.paragraphControls.push(this.btnAlignCenter);
@@ -331,7 +329,6 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-align-right',
                         enableToggle: true,
-                        allowDepress: false,
                         toggleGroup: 'alignGroup'
                     });
                     this.paragraphControls.push(this.btnAlignRight);
@@ -341,12 +338,10 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-align-just',
                         enableToggle: true,
-                        allowDepress: false,
                         toggleGroup: 'alignGroup'
                     });
                     this.paragraphControls.push(this.btnAlignJust);
 
-
                     this.btnDecLeftOffset = new Common.UI.Button({
                         id: 'id-toolbar-btn-decoffset',
                         cls: 'btn-toolbar',

From c632c239bdabbc91c8fe58952bccd047b91bde8c Mon Sep 17 00:00:00 2001
From: JuliaSvinareva <Julia.Svinaryova@onlyoffice.com>
Date: Fri, 18 Jun 2021 15:42:02 +0300
Subject: [PATCH 63/86] [SSE mobile] Bug 50785

---
 .../spreadsheeteditor/mobile/src/store/functions.js | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/apps/spreadsheeteditor/mobile/src/store/functions.js b/apps/spreadsheeteditor/mobile/src/store/functions.js
index 7c5b90a6d..c73acc728 100644
--- a/apps/spreadsheeteditor/mobile/src/store/functions.js
+++ b/apps/spreadsheeteditor/mobile/src/store/functions.js
@@ -1,21 +1,20 @@
-import {action, computed, makeObservable} from 'mobx';
+import {action, observable, makeObservable} from 'mobx';
 
 export class storeFunctions {
     constructor() {
         makeObservable(this, {
             initFunctions: action,
-            functions: computed
+            functions: observable
         });
     }
 
+    functions = {};
+
     initFunctions (groups, data) {
-        this.groups = groups;
-        this.data = data;
+        this.functions = this.getFunctions(groups, data);
     }
 
-    get functions () {
-        const groups = this.groups;
-        const data = this.data;
+    getFunctions (groups, data) {
         const functions = {};
         for (let g in groups) {
             const group = groups[g];

From 10e10ca77b09eeb260ddc3309eac9a957de6027e Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Fri, 18 Jun 2021 16:06:53 +0300
Subject: [PATCH 64/86] [DE PE SSE mobile] Fix Bug 50897

---
 apps/documenteditor/mobile/src/view/edit/Edit.jsx         | 2 +-
 apps/documenteditor/mobile/src/view/edit/EditChart.jsx    | 2 ++
 apps/documenteditor/mobile/src/view/edit/EditShape.jsx    | 8 +++++---
 apps/documenteditor/mobile/src/view/edit/EditTable.jsx    | 8 +++++---
 apps/presentationeditor/mobile/src/view/edit/Edit.jsx     | 2 +-
 .../presentationeditor/mobile/src/view/edit/EditChart.jsx | 2 ++
 .../presentationeditor/mobile/src/view/edit/EditShape.jsx | 2 ++
 .../presentationeditor/mobile/src/view/edit/EditTable.jsx | 8 +++++---
 apps/spreadsheeteditor/mobile/src/view/edit/Edit.jsx      | 2 +-
 apps/spreadsheeteditor/mobile/src/view/edit/EditChart.jsx | 2 ++
 apps/spreadsheeteditor/mobile/src/view/edit/EditShape.jsx | 2 ++
 11 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/apps/documenteditor/mobile/src/view/edit/Edit.jsx b/apps/documenteditor/mobile/src/view/edit/Edit.jsx
index bd9bb4c7a..42001e455 100644
--- a/apps/documenteditor/mobile/src/view/edit/Edit.jsx
+++ b/apps/documenteditor/mobile/src/view/edit/Edit.jsx
@@ -202,7 +202,7 @@ const EditLayoutNavbar = ({ editors, inPopover }) => {
             editors.length > 1 ?
                 <div className='tab-buttons tabbar'>
                     {editors.map((item, index) => <Link key={"de-link-" + item.id}  tabLink={"#" + item.id} tabLinkActive={index === 0}>{item.caption}</Link>)}
-                    {isAndroid && <span className='tab-link-highlight' style={{width: 100 / editors.lenght + '%'}}></span>}
+                    {isAndroid && <span className='tab-link-highlight' style={{width: 100 / editors.length + '%'}}></span>}
                 </div> :
                 <NavTitle>{ editors[0].caption }</NavTitle>
         }
diff --git a/apps/documenteditor/mobile/src/view/edit/EditChart.jsx b/apps/documenteditor/mobile/src/view/edit/EditChart.jsx
index a539c9339..6d0981d07 100644
--- a/apps/documenteditor/mobile/src/view/edit/EditChart.jsx
+++ b/apps/documenteditor/mobile/src/view/edit/EditChart.jsx
@@ -147,6 +147,7 @@ const PageStyle = props => {
     const types = storeChartSettings.types;
     const curType = chartProperties ? chartProperties.getType() : null;
     const chartStyles = storeChartSettings.chartStyles;
+    const isAndroid = Device.android;
     // console.log(chartStyles, curType);
     // console.log(Asc.c_oAscChartTypeSettings.comboBarLine, Asc.c_oAscChartTypeSettings.comboBarLineSecondary, Asc.c_oAscChartTypeSettings.comboAreaBar, Asc.c_oAscChartTypeSettings.comboCustom);
 
@@ -184,6 +185,7 @@ const PageStyle = props => {
                     {chartStyles ? <Link key={"de-link-chart-style"}  tabLink={"#edit-chart-style"}>{_t.textStyle}</Link> : null}
                     <Link key={"de-link-chart-fill"}  tabLink={"#edit-chart-fill"}>{_t.textFill}</Link>
                     <Link key={"de-link-chart-border"}  tabLink={"#edit-chart-border"}>{_t.textBorder}</Link>
+                    {isAndroid && <span className='tab-link-highlight'></span>}
                 </div>
                 {Device.phone &&
                     <NavRight>
diff --git a/apps/documenteditor/mobile/src/view/edit/EditShape.jsx b/apps/documenteditor/mobile/src/view/edit/EditShape.jsx
index 227dc6f1f..b4c785b50 100644
--- a/apps/documenteditor/mobile/src/view/edit/EditShape.jsx
+++ b/apps/documenteditor/mobile/src/view/edit/EditShape.jsx
@@ -144,6 +144,7 @@ const PageStyle = props => {
     const _t = t('Edit', {returnObjects: true});
     const storeShapeSettings = props.storeShapeSettings;
     const shapeObject = props.storeFocusObjects.shapeObject;
+    const isAndroid = Device.android;
 
     let borderSize, borderType, transparent;
     if (shapeObject) {
@@ -177,9 +178,10 @@ const PageStyle = props => {
         <Page>
             <Navbar backLink={_t.textBack}>
                 <div className='tab-buttons tabbar'>
-                    <Link key={"de-link-shape-fill"}  tabLink={"#edit-shape-fill"} tabLinkActive={true}>{_t.textFill}</Link>
-                    <Link key={"de-link-shape-border"}  tabLink={"#edit-shape-border"}>{_t.textBorder}</Link>
-                    <Link key={"de-link-shape-effects"}  tabLink={"#edit-shape-effects"}>{_t.textEffects}</Link>
+                    <Link key={"de-link-shape-fill"} tabLink={"#edit-shape-fill"} tabLinkActive={true}>{_t.textFill}</Link>
+                    <Link key={"de-link-shape-border"} tabLink={"#edit-shape-border"}>{_t.textBorder}</Link>
+                    <Link key={"de-link-shape-effects"} tabLink={"#edit-shape-effects"}>{_t.textEffects}</Link>
+                    {isAndroid && <span className='tab-link-highlight'></span>}
                 </div>
                 {Device.phone &&
                     <NavRight>
diff --git a/apps/documenteditor/mobile/src/view/edit/EditTable.jsx b/apps/documenteditor/mobile/src/view/edit/EditTable.jsx
index 528c3bf23..d17639b5b 100644
--- a/apps/documenteditor/mobile/src/view/edit/EditTable.jsx
+++ b/apps/documenteditor/mobile/src/view/edit/EditTable.jsx
@@ -466,6 +466,7 @@ const PageStyle = props => {
     const _t = t('Edit', {returnObjects: true});
     const storeTableSettings = props.storeTableSettings;
     const templates = storeTableSettings.styles;
+    const isAndroid = Device.android;
 
     const tableObject = props.storeFocusObjects.tableObject;
     if (!tableObject && Device.phone) {
@@ -477,9 +478,10 @@ const PageStyle = props => {
         <Page>
             <Navbar backLink={_t.textBack}>
                 <div className="tab-buttons tabbar">
-                    <Link key={"de-link-table-style"}  tabLink={"#edit-table-style"} tabLinkActive={true}>{_t.textStyle}</Link>
-                    <Link key={"de-link-table-fill"}  tabLink={"#edit-table-fill"}>{_t.textFill}</Link>
-                    <Link key={"de-link-table-border"}  tabLink={"#edit-table-border"}>{_t.textBorder}</Link>
+                    <Link key={"de-link-table-style"} tabLink={"#edit-table-style"} tabLinkActive={true}>{_t.textStyle}</Link>
+                    <Link key={"de-link-table-fill"} tabLink={"#edit-table-fill"}>{_t.textFill}</Link>
+                    <Link key={"de-link-table-border"} tabLink={"#edit-table-border"}>{_t.textBorder}</Link>
+                    {isAndroid && <span className='tab-link-highlight'></span>}
                 </div>
                 {Device.phone &&
                     <NavRight>
diff --git a/apps/presentationeditor/mobile/src/view/edit/Edit.jsx b/apps/presentationeditor/mobile/src/view/edit/Edit.jsx
index 3f9537494..f4d43fb8a 100644
--- a/apps/presentationeditor/mobile/src/view/edit/Edit.jsx
+++ b/apps/presentationeditor/mobile/src/view/edit/Edit.jsx
@@ -231,7 +231,7 @@ const EditLayoutNavbar = ({ editors, inPopover }) => {
                 editors.length > 1 ?
                     <div className='tab-buttons tabbar'>
                         {editors.map((item, index) => <Link key={"pe-link-" + item.id}  tabLink={"#" + item.id} tabLinkActive={index === 0}>{item.caption}</Link>)}
-                        {isAndroid && <span className='tab-link-highlight' style={{width: 100 / editors.lenght + '%'}}></span>}
+                        {isAndroid && <span className='tab-link-highlight' style={{width: 100 / editors.length + '%'}}></span>}
                     </div> :
                     <NavTitle>{ editors[0].caption }</NavTitle>
             }
diff --git a/apps/presentationeditor/mobile/src/view/edit/EditChart.jsx b/apps/presentationeditor/mobile/src/view/edit/EditChart.jsx
index 2112aa589..a9929cc34 100644
--- a/apps/presentationeditor/mobile/src/view/edit/EditChart.jsx
+++ b/apps/presentationeditor/mobile/src/view/edit/EditChart.jsx
@@ -159,6 +159,7 @@ const PageStyle = props => {
     const styles = storeChartSettings.styles;
     const shapeObject = props.storeFocusObjects.shapeObject;
     const chartStyles = storeChartSettings.chartStyles;
+    const isAndroid = Device.android;
 
     let borderSize, borderType, borderColor;
 
@@ -194,6 +195,7 @@ const PageStyle = props => {
                     {chartStyles ? <Link key={"pe-link-chart-style"} tabLink={"#edit-chart-style"}>{_t.textStyle}</Link> : null}
                     <Link key={"pe-link-chart-fill"} tabLink={"#edit-chart-fill"}>{_t.textFill}</Link>
                     <Link key={"pe-link-chart-border"} tabLink={"#edit-chart-border"}>{_t.textBorder}</Link>
+                    {isAndroid && <span className='tab-link-highlight'></span>}
                 </div>
                 {Device.phone &&
                     <NavRight>
diff --git a/apps/presentationeditor/mobile/src/view/edit/EditShape.jsx b/apps/presentationeditor/mobile/src/view/edit/EditShape.jsx
index 71210945c..39a55a8b4 100644
--- a/apps/presentationeditor/mobile/src/view/edit/EditShape.jsx
+++ b/apps/presentationeditor/mobile/src/view/edit/EditShape.jsx
@@ -89,6 +89,7 @@ const PageStyle = props => {
     const storeFocusObjects = props.storeFocusObjects;
     const storeShapeSettings = props.storeShapeSettings;
     const shapeObject = storeFocusObjects.shapeObject;
+    const isAndroid = Device.android;
 
     let borderSize, borderType, transparent;
     if (shapeObject) {
@@ -125,6 +126,7 @@ const PageStyle = props => {
                     <Link key={"pe-link-shape-fill"}  tabLink={"#edit-shape-fill"} tabLinkActive={true}>{_t.textFill}</Link>
                     <Link key={"pe-link-shape-border"}  tabLink={"#edit-shape-border"}>{_t.textBorder}</Link>
                     <Link key={"pe-link-shape-effects"}  tabLink={"#edit-shape-effects"}>{_t.textEffects}</Link>
+                    {isAndroid && <span className='tab-link-highlight'></span>}
                 </div>
                 {Device.phone &&
                     <NavRight>
diff --git a/apps/presentationeditor/mobile/src/view/edit/EditTable.jsx b/apps/presentationeditor/mobile/src/view/edit/EditTable.jsx
index 2377f9295..789ba0a45 100644
--- a/apps/presentationeditor/mobile/src/view/edit/EditTable.jsx
+++ b/apps/presentationeditor/mobile/src/view/edit/EditTable.jsx
@@ -313,14 +313,16 @@ const PageStyle = props => {
     const _t = t('View.Edit', {returnObjects: true});
     const storeTableSettings = props.storeTableSettings;
     const templates = storeTableSettings.styles;
+    const isAndroid = Device.android;
 
     return (
         <Page>
             <Navbar backLink={_t.textBack}>
                 <div className="tab-buttons tabbar">
-                    <Link key={"pe-link-table-style"}  tabLink={"#edit-table-style"} tabLinkActive={true}>{_t.textStyle}</Link>
-                    <Link key={"pe-link-table-fill"}  tabLink={"#edit-table-fill"}>{_t.textFill}</Link>
-                    <Link key={"pe-link-table-border"}  tabLink={"#edit-table-border"}>{_t.textBorder}</Link>
+                    <Link key={"pe-link-table-style"} tabLink={"#edit-table-style"} tabLinkActive={true}>{_t.textStyle}</Link>
+                    <Link key={"pe-link-table-fill"} tabLink={"#edit-table-fill"}>{_t.textFill}</Link>
+                    <Link key={"pe-link-table-border"} tabLink={"#edit-table-border"}>{_t.textBorder}</Link>
+                    {isAndroid && <span className='tab-link-highlight'></span>}
                 </div>
                 {Device.phone &&
                     <NavRight>
diff --git a/apps/spreadsheeteditor/mobile/src/view/edit/Edit.jsx b/apps/spreadsheeteditor/mobile/src/view/edit/Edit.jsx
index 3df3425df..2115c773d 100644
--- a/apps/spreadsheeteditor/mobile/src/view/edit/Edit.jsx
+++ b/apps/spreadsheeteditor/mobile/src/view/edit/Edit.jsx
@@ -296,7 +296,7 @@ const EditLayoutNavbar = ({ editors, inPopover }) => {
                 editors.length > 1 ?
                     <div className='tab-buttons tabbar'>
                         {editors.map((item, index) => <Link key={"sse-link-" + item.id}  tabLink={"#" + item.id} tabLinkActive={index === 0}>{item.caption}</Link>)}
-                        {isAndroid && <span className='tab-link-highlight' style={{width: 100 / editors.lenght + '%'}}></span>}
+                        {isAndroid && <span className='tab-link-highlight' style={{width: 100 / editors.length + '%'}}></span>}
                     </div> :
                     <NavTitle>{ editors[0].caption }</NavTitle>
             }
diff --git a/apps/spreadsheeteditor/mobile/src/view/edit/EditChart.jsx b/apps/spreadsheeteditor/mobile/src/view/edit/EditChart.jsx
index 7662e68fa..66e0d6e43 100644
--- a/apps/spreadsheeteditor/mobile/src/view/edit/EditChart.jsx
+++ b/apps/spreadsheeteditor/mobile/src/view/edit/EditChart.jsx
@@ -147,6 +147,7 @@ const PageBorderColor = props => {
 const PageStyle = props => {
     const { t } = useTranslation();
     const _t = t('View.Edit', {returnObjects: true});
+    const isAndroid = Device.android;
     const storeChartSettings = props.storeChartSettings;
     const storeFocusObjects = props.storeFocusObjects;
     const chartProperties = storeFocusObjects.chartObject && storeFocusObjects.chartObject.get_ChartProperties();
@@ -195,6 +196,7 @@ const PageStyle = props => {
                     {chartStyles ? <Link key={"sse-link-chart-style"} tabLink={"#edit-chart-style"}>{_t.textStyle}</Link> : null}
                     <Link key={"sse-link-chart-fill"} tabLink={"#edit-chart-fill"}>{_t.textFill}</Link>
                     <Link key={"sse-link-chart-border"} tabLink={"#edit-chart-border"}>{_t.textBorder}</Link>
+                    {isAndroid && <span className='tab-link-highlight'></span>}
                 </div>
                 {Device.phone &&
                     <NavRight>
diff --git a/apps/spreadsheeteditor/mobile/src/view/edit/EditShape.jsx b/apps/spreadsheeteditor/mobile/src/view/edit/EditShape.jsx
index dd3eeb6e5..ef6ffd9d7 100644
--- a/apps/spreadsheeteditor/mobile/src/view/edit/EditShape.jsx
+++ b/apps/spreadsheeteditor/mobile/src/view/edit/EditShape.jsx
@@ -83,6 +83,7 @@ const PaletteFill = inject("storeFocusObjects", "storeShapeSettings", "storePale
 const PageStyle = props => {
     const { t } = useTranslation();
     const _t = t('View.Edit', {returnObjects: true});
+    const isAndroid = Device.android;
     const storeShapeSettings = props.storeShapeSettings;
     const storeFocusObjects = props.storeFocusObjects;
     const shapeObject = storeFocusObjects.shapeObject.get_ShapeProperties();
@@ -121,6 +122,7 @@ const PageStyle = props => {
                     <Link key={"se-link-shape-fill"}  tabLink={"#edit-shape-fill"} tabLinkActive={true}>{_t.textFill}</Link>
                     <Link key={"se-link-shape-border"}  tabLink={"#edit-shape-border"}>{_t.textBorder}</Link>
                     <Link key={"se-link-shape-effects"}  tabLink={"#edit-shape-effects"}>{_t.textEffects}</Link>
+                    {isAndroid && <span className='tab-link-highlight'></span>}
                 </div>
                 {Device.phone &&
                     <NavRight>

From 1fd322493f0aab7f5466fed1a58993dfd8bab0ad Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Fri, 18 Jun 2021 16:08:47 +0300
Subject: [PATCH 65/86] Refactoring

---
 apps/api/documents/api.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apps/api/documents/api.js b/apps/api/documents/api.js
index 52503867a..1ad4fc5c1 100644
--- a/apps/api/documents/api.js
+++ b/apps/api/documents/api.js
@@ -866,7 +866,7 @@
         path += app + "/";
         path += (config.type === "mobile" || isSafari_mobile)
             ? "mobile"
-            : (config.type === "embedded" || (app=='documenteditor') && config.document.permissions && (config.document.permissions.fillForms===true) && (config.document.permissions.edit === false) && (config.editorConfig.mode !== 'view'))
+            : (config.type === "embedded" || (app=='documenteditor') && config.document && config.document.permissions && (config.document.permissions.fillForms===true) && (config.document.permissions.edit === false) && (config.editorConfig.mode !== 'view'))
                 ? "embed"
                 : "main";
 

From 41d95920a7170943c5e38d923e0a0e62bbf76a7b Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Fri, 18 Jun 2021 16:53:50 +0300
Subject: [PATCH 66/86] Fix loading mask on document opening

---
 apps/common/main/lib/util/utils.js                  | 8 ++++++++
 apps/common/main/resources/less/loadmask.less       | 1 +
 apps/documenteditor/main/app/controller/Main.js     | 4 ++--
 apps/presentationeditor/main/app/controller/Main.js | 4 ++--
 apps/spreadsheeteditor/main/app/controller/Main.js  | 4 ++--
 5 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/apps/common/main/lib/util/utils.js b/apps/common/main/lib/util/utils.js
index 7d41f09ff..e230a013d 100644
--- a/apps/common/main/lib/util/utils.js
+++ b/apps/common/main/lib/util/utils.js
@@ -641,6 +641,14 @@ Common.Utils.String = new (function() {
                 var nTrailingChar = 0xDC00 | (nUnicode & 0x3FF);
                 return String.fromCharCode(nLeadingChar) + String.fromCharCode(nTrailingChar);
             }
+        },
+
+        fixedDigits: function(num, digits, fill) {
+            (fill===undefined) && (fill = '0');
+            var strfill = "",
+                str = num.toString();
+            for (var i=str.length; i<digits; i++) strfill += fill;
+            return strfill + str;
         }
     }
 })();
diff --git a/apps/common/main/resources/less/loadmask.less b/apps/common/main/resources/less/loadmask.less
index 3d7133631..19d53f109 100644
--- a/apps/common/main/resources/less/loadmask.less
+++ b/apps/common/main/resources/less/loadmask.less
@@ -49,6 +49,7 @@
     .asc-loadmask-title {
         .fontsize(@font-size-large);
         margin: 0 8px 0 12px;
+        white-space: pre-wrap;
     }
 
     .left-panel & {
diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js
index ae3ba4a75..1a3e619b7 100644
--- a/apps/documenteditor/main/app/controller/Main.js
+++ b/apps/documenteditor/main/app/controller/Main.js
@@ -942,7 +942,7 @@ define([
                         break;
 
                     case LoadingDocument:
-                        title   = this.loadingDocumentTitleText;
+                        title   = this.loadingDocumentTitleText + '           ';
                         text    = this.loadingDocumentTextText;
                         break;
                     default:
@@ -1246,7 +1246,7 @@ define([
             onOpenDocument: function(progress) {
                 var elem = document.getElementById('loadmask-text');
                 var proc = (progress.asc_getCurrentFont() + progress.asc_getCurrentImage())/(progress.asc_getFontsCount() + progress.asc_getImagesCount());
-                proc = this.textLoadingDocument + ': ' + Math.min(Math.round(proc*100), 100) + '%';
+                proc = this.textLoadingDocument + ': ' + Common.Utils.String.fixedDigits(Math.min(Math.round(proc*100), 100), 3, "  ") + "%";
                 elem ? elem.innerHTML = proc : this.loadMask && this.loadMask.setTitle(proc);
             },
 
diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js
index 6326bf485..2cbff6ff1 100644
--- a/apps/presentationeditor/main/app/controller/Main.js
+++ b/apps/presentationeditor/main/app/controller/Main.js
@@ -691,7 +691,7 @@ define([
                         break;
 
                     case LoadingDocument:
-                        title   = this.loadingDocumentTitleText;
+                        title   = this.loadingDocumentTitleText + '           ';
                         text    = this.loadingDocumentTextText;
                         break;
                     default:
@@ -981,7 +981,7 @@ define([
             onOpenDocument: function(progress) {
                 var elem = document.getElementById('loadmask-text');
                 var proc = (progress.asc_getCurrentFont() + progress.asc_getCurrentImage())/(progress.asc_getFontsCount() + progress.asc_getImagesCount());
-                proc = this.textLoadingDocument + ': ' + Math.min(Math.round(proc*100), 100) + '%';
+                proc = this.textLoadingDocument + ': ' + Common.Utils.String.fixedDigits(Math.min(Math.round(proc*100), 100), 3, "  ") + "%";
                 elem ? elem.innerHTML = proc : this.loadMask && this.loadMask.setTitle(proc);
             },
 
diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js
index b4a7ff145..6ee4976a2 100644
--- a/apps/spreadsheeteditor/main/app/controller/Main.js
+++ b/apps/spreadsheeteditor/main/app/controller/Main.js
@@ -739,7 +739,7 @@ define([
                         break;
 
                     case LoadingDocument:
-                        title   = this.loadingDocumentTitleText;
+                        title   = this.loadingDocumentTitleText + '           ';
                         break;
                     default:
                         if (typeof action.id == 'string'){
@@ -1043,7 +1043,7 @@ define([
             onOpenDocument: function(progress) {
                 var elem = document.getElementById('loadmask-text');
                 var proc = (progress.asc_getCurrentFont() + progress.asc_getCurrentImage())/(progress.asc_getFontsCount() + progress.asc_getImagesCount());
-                proc = this.textLoadingDocument + ': ' + Math.min(Math.round(proc*100), 100) + '%';
+                proc = this.textLoadingDocument + ': ' + Common.Utils.String.fixedDigits(Math.min(Math.round(proc*100), 100), 3, "  ") + "%";
                 elem ? elem.innerHTML = proc : this.loadMask && this.loadMask.setTitle(proc);
             },
 

From cbb10c939ca38f6bd0e9a1970f7d8c51f53ceb8a Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Fri, 18 Jun 2021 17:17:55 +0300
Subject: [PATCH 67/86] Fix Bug 50924

---
 apps/api/documents/api.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/apps/api/documents/api.js b/apps/api/documents/api.js
index 1ad4fc5c1..1dfdf981b 100644
--- a/apps/api/documents/api.js
+++ b/apps/api/documents/api.js
@@ -866,7 +866,8 @@
         path += app + "/";
         path += (config.type === "mobile" || isSafari_mobile)
             ? "mobile"
-            : (config.type === "embedded" || (app=='documenteditor') && config.document && config.document.permissions && (config.document.permissions.fillForms===true) && (config.document.permissions.edit === false) && (config.editorConfig.mode !== 'view'))
+            : (config.type === "embedded" || (app=='documenteditor') && config.document && config.document.permissions && (config.document.permissions.fillForms===true) &&
+                                                                       (config.document.permissions.edit === false) && (config.document.permissions.review !== true) && (config.editorConfig.mode !== 'view'))
                 ? "embed"
                 : "main";
 

From 177a4dd5ecd933c326b6b1d1b0109e047116f47b Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Fri, 18 Jun 2021 17:22:38 +0300
Subject: [PATCH 68/86] Fix layout for tt lang

---
 apps/common/main/lib/view/SearchDialog.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apps/common/main/lib/view/SearchDialog.js b/apps/common/main/lib/view/SearchDialog.js
index cd18d12f0..3a6039a56 100644
--- a/apps/common/main/lib/view/SearchDialog.js
+++ b/apps/common/main/lib/view/SearchDialog.js
@@ -99,7 +99,7 @@
                 '<div class="separator horizontal"></div>',
                 '<div class="footer right">',
                     '<button class="btn normal dlg-btn" result="replace">'+this.txtBtnReplace+'</button>',
-                    '<button class="btn normal dlg-btn" result="replaceall" style="margin-left: 6px;">'+this.txtBtnReplaceAll+'</button>',
+                    '<button class="btn normal dlg-btn" result="replaceall" style="margin-left: 6px;width: auto;">'+this.txtBtnReplaceAll+'</button>',
                     '<button class="btn normal dlg-btn iconic" result="back"><span class="icon img-commonctrl back"></span></button>',
                     '<button class="btn normal dlg-btn iconic" result="next" style="margin-left: 6px;"><span class="icon img-commonctrl next"></span></button>',
                 '</div>'

From f1b4663ec4c57ad3ec0689507fbd595a3701f226 Mon Sep 17 00:00:00 2001
From: ShimaginAndrey <andrey.shimagin@onlyoffice.com>
Date: Fri, 18 Jun 2021 18:07:15 +0300
Subject: [PATCH 69/86] [DE PE SSE mobile] Fix Bug 50903

---
 apps/common/mobile/lib/component/ThemeColorPalette.jsx | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/apps/common/mobile/lib/component/ThemeColorPalette.jsx b/apps/common/mobile/lib/component/ThemeColorPalette.jsx
index 7a7dd86ad..b0637aa45 100644
--- a/apps/common/mobile/lib/component/ThemeColorPalette.jsx
+++ b/apps/common/mobile/lib/component/ThemeColorPalette.jsx
@@ -56,12 +56,15 @@ const CustomColors = ({ options, customColors, onColorClick, curColor }) => {
             ></a>)
         }
     }
+
+    let indexCurColor = colors.indexOf(curColor);
+    
     return (
         <div className='palette'>
             {colors && colors.length > 0 && colors.map((color, index) => {
                 return(
                     <a key={`dc-${index}`}
-                       className={curColor && curColor === color ? 'active' : ''}
+                       className={curColor && curColor === color && index === indexCurColor ? 'active' : ''}
                        style={{background: `#${color}`}}
                        onClick={() => {onColorClick(color)}}
                     ></a>

From 5a6dfc5e8eed0d3a90a650c4e032632e1838ed1c Mon Sep 17 00:00:00 2001
From: JuliaSvinareva <Julia.Svinaryova@onlyoffice.com>
Date: Fri, 18 Jun 2021 20:49:51 +0300
Subject: [PATCH 70/86] [mobile] Fix bug 50878

---
 .../collaboration/Collaboration.jsx           |  1 +
 .../mobile/src/controller/Toolbar.jsx         | 26 +++++++------------
 .../mobile/src/view/Toolbar.jsx               |  7 ++---
 .../mobile/src/controller/Toolbar.jsx         | 26 +++++++------------
 .../mobile/src/view/Toolbar.jsx               | 13 +++++-----
 .../mobile/src/controller/Toolbar.jsx         | 26 +++++++------------
 .../mobile/src/view/Toolbar.jsx               |  7 ++---
 7 files changed, 46 insertions(+), 60 deletions(-)

diff --git a/apps/common/mobile/lib/controller/collaboration/Collaboration.jsx b/apps/common/mobile/lib/controller/collaboration/Collaboration.jsx
index 8104543e3..6cb82db7c 100644
--- a/apps/common/mobile/lib/controller/collaboration/Collaboration.jsx
+++ b/apps/common/mobile/lib/controller/collaboration/Collaboration.jsx
@@ -17,6 +17,7 @@ class CollaborationController extends Component {
             api.asc_registerCallback('asc_OnTryUndoInFastCollaborative', this.onTryUndoInFastCollaborative.bind(this));
         });
 
+        Common.Notifications.on('api:disconnect', this.onCoAuthoringDisconnect.bind(this));
         Common.Notifications.on('document:ready', this.onDocumentReady.bind(this));
     }
 
diff --git a/apps/documenteditor/mobile/src/controller/Toolbar.jsx b/apps/documenteditor/mobile/src/controller/Toolbar.jsx
index a0028b81c..79286c70a 100644
--- a/apps/documenteditor/mobile/src/controller/Toolbar.jsx
+++ b/apps/documenteditor/mobile/src/controller/Toolbar.jsx
@@ -1,10 +1,10 @@
 import React, { useEffect, useState } from 'react';
-import { inject } from 'mobx-react';
+import { inject, observer } from 'mobx-react';
 import { f7 } from 'framework7-react';
 import { useTranslation } from 'react-i18next';
 import ToolbarView from "../view/Toolbar";
 
-const ToolbarController = inject('storeAppOptions', 'users', 'storeReview')(props => {
+const ToolbarController = inject('storeAppOptions', 'users', 'storeReview')(observer(props => {
     const {t} = useTranslation();
     const _t = t("Toolbar", { returnObjects: true });
 
@@ -23,8 +23,6 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeReview')(prop
             api.asc_registerCallback('asc_onCanUndo', onApiCanUndo);
             api.asc_registerCallback('asc_onCanRedo', onApiCanRedo);
             api.asc_registerCallback('asc_onFocusObject', onApiFocusObject);
-            api.asc_registerCallback('asc_onCoAuthoringDisconnect', onCoAuthoringDisconnect);
-            Common.Notifications.on('api:disconnect', onCoAuthoringDisconnect);
             Common.Notifications.on('toolbar:activatecontrols', activateControls);
             Common.Notifications.on('toolbar:deactivateeditcontrols', deactivateEditControls);
             Common.Notifications.on('goback', goBack);
@@ -37,10 +35,15 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeReview')(prop
             onDocumentReady();
         }
 
+        if (isDisconnected) {
+            f7.popover.close();
+            f7.sheet.close();
+            f7.popup.close();
+        }
+
         return () => {
             Common.Notifications.off('document:ready', onDocumentReady);
             Common.Notifications.off('setdoctitle', setDocTitle);
-            Common.Notifications.off('api:disconnect', onCoAuthoringDisconnect);
             Common.Notifications.off('toolbar:activatecontrols', activateControls);
             Common.Notifications.off('toolbar:deactivateeditcontrols', deactivateEditControls);
             Common.Notifications.off('goback', goBack);
@@ -49,7 +52,6 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeReview')(prop
             api.asc_unregisterCallback('asc_onCanUndo', onApiCanUndo);
             api.asc_unregisterCallback('asc_onCanRedo', onApiCanRedo);
             api.asc_unregisterCallback('asc_onFocusObject', onApiFocusObject);
-            api.asc_unregisterCallback('asc_onCoAuthoringDisconnect', onCoAuthoringDisconnect);
         }
     });
 
@@ -163,15 +165,6 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeReview')(prop
         }
     };
 
-    const onCoAuthoringDisconnect = (enableDownload) => {
-        deactivateEditControls(enableDownload);
-        setCanUndo(false);
-        setCanRedo(false);
-        f7.popover.close();
-        f7.sheet.close();
-        f7.popup.close();
-    };
-
     const [disabledControls, setDisabledControls] = useState(true);
     const activateControls = () => {
         setDisabledControls(false);
@@ -200,8 +193,9 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeReview')(prop
                      readerMode={readerMode}
                      showEditDocument={showEditDocument}
                      onEditDocument={onEditDocument}
+                     isDisconnected={isDisconnected}
         />
     )
-});
+}));
 
 export {ToolbarController as Toolbar};
\ No newline at end of file
diff --git a/apps/documenteditor/mobile/src/view/Toolbar.jsx b/apps/documenteditor/mobile/src/view/Toolbar.jsx
index aa45f2793..6a801fdd1 100644
--- a/apps/documenteditor/mobile/src/view/Toolbar.jsx
+++ b/apps/documenteditor/mobile/src/view/Toolbar.jsx
@@ -4,14 +4,15 @@ import { Device } from '../../../../common/mobile/utils/device';
 import EditorUIController from '../lib/patch'
 
 const ToolbarView = props => {
-    const disableEditBtn = props.isObjectLocked || props.stateDisplayMode || props.disabledEditControls;
+    const isDisconnected = props.isDisconnected;
+    const disableEditBtn = props.isObjectLocked || props.stateDisplayMode || props.disabledEditControls || isDisconnected;
     return (
         <Fragment>
             <NavLeft>
                 {props.isShowBack && <Link className={`btn-doc-back${props.disabledControls && ' disabled'}`} icon='icon-back' onClick={props.onBack}></Link>}
                 {Device.ios && props.isEdit && EditorUIController.getUndoRedo && EditorUIController.getUndoRedo({
-                    disabledUndo: !props.isCanUndo,
-                    disabledRedo: !props.isCanRedo,
+                    disabledUndo: !props.isCanUndo || isDisconnected,
+                    disabledRedo: !props.isCanRedo || isDisconnected,
                     onUndoClick: props.onUndo,
                     onRedoClick: props.onRedo
                 })}
diff --git a/apps/presentationeditor/mobile/src/controller/Toolbar.jsx b/apps/presentationeditor/mobile/src/controller/Toolbar.jsx
index 42a240a7b..87225a53d 100644
--- a/apps/presentationeditor/mobile/src/controller/Toolbar.jsx
+++ b/apps/presentationeditor/mobile/src/controller/Toolbar.jsx
@@ -1,10 +1,10 @@
 import React, { useEffect, useState } from 'react';
-import { inject } from 'mobx-react';
+import { inject, observer } from 'mobx-react';
 import { f7 } from 'framework7-react';
 import { useTranslation } from 'react-i18next';
 import ToolbarView from "../view/Toolbar";
 
-const ToolbarController = inject('storeAppOptions', 'users')(props => {
+const ToolbarController = inject('storeAppOptions', 'users')(observer(props => {
     const {t} = useTranslation();
     const _t = t("Toolbar", { returnObjects: true });
 
@@ -20,9 +20,7 @@ const ToolbarController = inject('storeAppOptions', 'users')(props => {
             api.asc_registerCallback('asc_onCanUndo', onApiCanUndo);
             api.asc_registerCallback('asc_onCanRedo', onApiCanRedo);
             api.asc_registerCallback('asc_onFocusObject', onApiFocusObject);
-            api.asc_registerCallback('asc_onCoAuthoringDisconnect', onCoAuthoringDisconnect);
             api.asc_registerCallback('asc_onCountPages', onApiCountPages);
-            Common.Notifications.on('api:disconnect', onCoAuthoringDisconnect);
             Common.Notifications.on('toolbar:activatecontrols', activateControls);
             Common.Notifications.on('toolbar:deactivateeditcontrols', deactivateEditControls);
             Common.Notifications.on('goback', goBack);
@@ -35,10 +33,15 @@ const ToolbarController = inject('storeAppOptions', 'users')(props => {
             onDocumentReady();
         }
 
+        if (isDisconnected) {
+            f7.popover.close();
+            f7.sheet.close();
+            f7.popup.close();
+        }
+
         return () => {
             Common.Notifications.off('document:ready', onDocumentReady);
             Common.Notifications.off('setdoctitle', setDocTitle);
-            Common.Notifications.off('api:disconnect', onCoAuthoringDisconnect);
             Common.Notifications.off('toolbar:activatecontrols', activateControls);
             Common.Notifications.off('toolbar:deactivateeditcontrols', deactivateEditControls);
             Common.Notifications.off('goback', goBack);
@@ -47,7 +50,6 @@ const ToolbarController = inject('storeAppOptions', 'users')(props => {
             api.asc_unregisterCallback('asc_onCanUndo', onApiCanUndo);
             api.asc_unregisterCallback('asc_onCanRedo', onApiCanRedo);
             api.asc_unregisterCallback('asc_onFocusObject', onApiFocusObject);
-            api.asc_unregisterCallback('asc_onCoAuthoringDisconnect', onCoAuthoringDisconnect);
             api.asc_unregisterCallback('asc_onCountPages', onApiCountPages);
         }
     });
@@ -178,15 +180,6 @@ const ToolbarController = inject('storeAppOptions', 'users')(props => {
         setDisabledControls(false);
     };
 
-    const onCoAuthoringDisconnect = (enableDownload) => {
-        deactivateEditControls(enableDownload);
-        setCanUndo(false);
-        setCanRedo(false);
-        f7.popover.close();
-        f7.sheet.close();
-        f7.popup.close();
-    };
-
     const onEditDocument = () => {
         Common.Gateway.requestEditRights();
     };
@@ -210,8 +203,9 @@ const ToolbarController = inject('storeAppOptions', 'users')(props => {
                      displayCollaboration={displayCollaboration}
                      showEditDocument={showEditDocument}
                      onEditDocument={onEditDocument}
+                     isDisconnected={isDisconnected}
         />
     )
-});
+}));
 
 export {ToolbarController as Toolbar};
\ No newline at end of file
diff --git a/apps/presentationeditor/mobile/src/view/Toolbar.jsx b/apps/presentationeditor/mobile/src/view/Toolbar.jsx
index 903d9a05d..42f93da4f 100644
--- a/apps/presentationeditor/mobile/src/view/Toolbar.jsx
+++ b/apps/presentationeditor/mobile/src/view/Toolbar.jsx
@@ -4,13 +4,14 @@ import { Device } from '../../../../common/mobile/utils/device';
 import EditorUIController from '../lib/patch'
 
 const ToolbarView = props => {
+    const isDisconnected = props.isDisconnected;
     return (
         <Fragment>
             <NavLeft>
                 {props.isShowBack && <Link className={`btn-doc-back${props.disabledControls && ' disabled'}`} icon='icon-back' onClick={props.onBack}></Link>}
                 {Device.ios && props.isEdit && EditorUIController.getUndoRedo && EditorUIController.getUndoRedo({
-                    disabledUndo: !props.isCanUndo,
-                    disabledRedo: !props.isCanRedo,
+                    disabledUndo: !props.isCanUndo || isDisconnected,
+                    disabledRedo: !props.isCanRedo || isDisconnected,
                     onUndoClick: props.onUndo,
                     onRedoClick: props.onRedo
                 })}
@@ -18,8 +19,8 @@ const ToolbarView = props => {
             {!Device.phone && <NavTitle>{props.docTitle}</NavTitle>}
             <NavRight>
                 {Device.android && props.isEdit && EditorUIController.getUndoRedo && EditorUIController.getUndoRedo({
-                    disabledUndo: !props.isCanUndo,
-                    disabledRedo: !props.isCanRedo,
+                    disabledUndo: !props.isCanUndo || isDisconnected,
+                    disabledRedo: !props.isCanRedo || isDisconnected,
                     onUndoClick: props.onUndo,
                     onRedoClick: props.onRedo
                 })}
@@ -28,8 +29,8 @@ const ToolbarView = props => {
                     <Link className={props.disabledControls ? 'disabled' : ''} icon='icon-edit' href={false} onClick={props.onEditDocument}></Link>
                 }
                 {props.isEdit && EditorUIController.getToolbarOptions && EditorUIController.getToolbarOptions({
-                    disabledAdd: props.disabledAdd || props.disabledControls,
-                    disabledEdit: props.disabledEdit || props.disabledControls,
+                    disabledAdd: props.disabledAdd || props.disabledControls || isDisconnected,
+                    disabledEdit: props.disabledEdit || props.disabledControls || isDisconnected,
                     onEditClick: () => props.openOptions('edit'),
                     onAddClick: () => props.openOptions('add')
                 })}
diff --git a/apps/spreadsheeteditor/mobile/src/controller/Toolbar.jsx b/apps/spreadsheeteditor/mobile/src/controller/Toolbar.jsx
index ade8d976a..8db15a70a 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/Toolbar.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/Toolbar.jsx
@@ -1,10 +1,10 @@
 import React, { useEffect, useState } from 'react';
-import { inject } from 'mobx-react';
+import { inject, observer } from 'mobx-react';
 import { f7 } from 'framework7-react';
 import { useTranslation } from 'react-i18next';
 import ToolbarView from "../view/Toolbar";
 
-const ToolbarController = inject('storeAppOptions', 'users', 'storeSpreadsheetInfo')(props => {
+const ToolbarController = inject('storeAppOptions', 'users', 'storeSpreadsheetInfo')(observer(props => {
     const {t} = useTranslation();
     const _t = t("Toolbar", { returnObjects: true });
 
@@ -24,9 +24,7 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeSpreadsheetIn
             api.asc_registerCallback('asc_onWorkbookLocked', onApiSelectionChanged);
             api.asc_registerCallback('asc_onWorksheetLocked', onApiSelectionChanged);
             api.asc_registerCallback('asc_onActiveSheetChanged', onApiActiveSheetChanged);
-            api.asc_registerCallback('asc_onCoAuthoringDisconnect', onCoAuthoringDisconnect);
 
-            Common.Notifications.on('api:disconnect', onCoAuthoringDisconnect);
             Common.Notifications.on('toolbar:activatecontrols', activateControls);
             Common.Notifications.on('toolbar:deactivateeditcontrols', deactivateEditControls);
             Common.Notifications.on('goback', goBack);
@@ -39,9 +37,14 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeSpreadsheetIn
             onDocumentReady();
         }
 
+        if (isDisconnected) {
+            f7.popover.close();
+            f7.sheet.close();
+            f7.popup.close();
+        }
+
         return () => {
             Common.Notifications.off('document:ready', onDocumentReady);
-            Common.Notifications.off('api:disconnect', onCoAuthoringDisconnect);
             Common.Notifications.off('toolbar:activatecontrols', activateControls);
             Common.Notifications.off('toolbar:deactivateeditcontrols', deactivateEditControls);
             Common.Notifications.off('goback', goBack);
@@ -54,7 +57,6 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeSpreadsheetIn
             api.asc_unregisterCallback('asc_onWorkbookLocked', onApiSelectionChanged);
             api.asc_unregisterCallback('asc_onWorksheetLocked', onApiSelectionChanged);
             api.asc_unregisterCallback('asc_onActiveSheetChanged', onApiActiveSheetChanged);
-            api.asc_unregisterCallback('asc_onCoAuthoringDisconnect', onCoAuthoringDisconnect);
         }
     });
 
@@ -179,15 +181,6 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeSpreadsheetIn
         setDisabledControls(false);
     };
 
-    const onCoAuthoringDisconnect = (enableDownload) => {
-        deactivateEditControls(enableDownload);
-        setCanUndo(false);
-        setCanRedo(false);
-        f7.popover.close();
-        f7.sheet.close();
-        f7.popup.close();
-    };
-
     const onEditDocument = () => {
         Common.Gateway.requestEditRights();
     };
@@ -208,8 +201,9 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeSpreadsheetIn
                      displayCollaboration={displayCollaboration}
                      showEditDocument={showEditDocument}
                      onEditDocument={onEditDocument}
+                     isDisconnected={isDisconnected}
         />
     )
-});
+}));
 
 export {ToolbarController as Toolbar};
\ No newline at end of file
diff --git a/apps/spreadsheeteditor/mobile/src/view/Toolbar.jsx b/apps/spreadsheeteditor/mobile/src/view/Toolbar.jsx
index 93c1c7740..0cf7909be 100644
--- a/apps/spreadsheeteditor/mobile/src/view/Toolbar.jsx
+++ b/apps/spreadsheeteditor/mobile/src/view/Toolbar.jsx
@@ -4,9 +4,10 @@ import { Device } from '../../../../common/mobile/utils/device';
 import EditorUIController from '../lib/patch'
 
 const ToolbarView = props => {
+    const isDisconnected = props.isDisconnected;
     const undo_box = props.isEdit && EditorUIController.toolbarOptions ? EditorUIController.toolbarOptions.getUndoRedo({
-            disabledUndo: !props.isCanUndo,
-            disabledRedo: !props.isCanRedo,
+            disabledUndo: !props.isCanUndo || isDisconnected,
+            disabledRedo: !props.isCanRedo || isDisconnected,
             onUndoClick: props.onUndo,
             onRedoClick: props.onRedo
         }) : null;
@@ -23,7 +24,7 @@ const ToolbarView = props => {
                     <Link className={props.disabledControls ? 'disabled' : ''} icon='icon-edit' href={false} onClick={props.onEditDocument}></Link>
                 }
                 {props.isEdit && EditorUIController.toolbarOptions && EditorUIController.toolbarOptions.getEditOptions({
-                    disabled: props.disabledEditControls || props.disabledControls,
+                    disabled: props.disabledEditControls || props.disabledControls || isDisconnected,
                     onEditClick: () => props.openOptions('edit'),
                     onAddClick: () => props.openOptions('add')
                 })}

From 7a3aca5c8fff187ec994945cce81d3d786bff068 Mon Sep 17 00:00:00 2001
From: ShimaginAndrey <andrey.shimagin@onlyoffice.com>
Date: Mon, 21 Jun 2021 13:01:40 +0300
Subject: [PATCH 71/86] [PE SSE mobile] Fix Bug 50926

---
 apps/presentationeditor/mobile/src/controller/ContextMenu.jsx | 2 +-
 apps/spreadsheeteditor/mobile/src/controller/ContextMenu.jsx  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/apps/presentationeditor/mobile/src/controller/ContextMenu.jsx b/apps/presentationeditor/mobile/src/controller/ContextMenu.jsx
index fde237e74..99ed87b06 100644
--- a/apps/presentationeditor/mobile/src/controller/ContextMenu.jsx
+++ b/apps/presentationeditor/mobile/src/controller/ContextMenu.jsx
@@ -111,7 +111,7 @@ class ContextMenu extends ContextMenuController {
                 text: 'OK',
                 onClick: () => {
                     const dontShow = $$('input[name="checkbox-show"]').prop('checked');
-                    if (dontShow) LocalStorage.setItem("de-hide-copy-cut-paste-warning", 1);
+                    if (dontShow) LocalStorage.setItem("pe-hide-copy-cut-paste-warning", 1);
                 }
             }]
         }).open();
diff --git a/apps/spreadsheeteditor/mobile/src/controller/ContextMenu.jsx b/apps/spreadsheeteditor/mobile/src/controller/ContextMenu.jsx
index 7965086fb..15462d90b 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/ContextMenu.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/ContextMenu.jsx
@@ -142,7 +142,7 @@ class ContextMenu extends ContextMenuController {
                 text: 'OK',
                 onClick: () => {
                     const dontShow = $$('input[name="checkbox-show"]').prop('checked');
-                    if (dontShow) LocalStorage.setItem("de-hide-copy-cut-paste-warning", 1);
+                    if (dontShow) LocalStorage.setItem("sse-hide-copy-cut-paste-warning", 1);
                 }
             }]
         }).open();

From b5bbb3c6b4b7e3279f53828c85b9d3ce886a7095 Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Mon, 21 Jun 2021 15:03:09 +0300
Subject: [PATCH 72/86] [PE mobile] Fix Bug 50845

---
 .../mobile/src/view/edit/EditSlide.jsx        | 27 +++++--------------
 1 file changed, 7 insertions(+), 20 deletions(-)

diff --git a/apps/presentationeditor/mobile/src/view/edit/EditSlide.jsx b/apps/presentationeditor/mobile/src/view/edit/EditSlide.jsx
index 2db973287..cb1ed06ab 100644
--- a/apps/presentationeditor/mobile/src/view/edit/EditSlide.jsx
+++ b/apps/presentationeditor/mobile/src/view/edit/EditSlide.jsx
@@ -45,8 +45,6 @@ const PageTheme = props => {
     const storeSlideSettings = props.storeSlideSettings;
     const arrayThemes = storeSlideSettings.arrayThemes;
     const slideThemeIndex = storeSlideSettings.slideThemeIndex;
-    const defaultThemes = arrayThemes[0];
-    const docThemes = arrayThemes[1];
 
     return (
         <Page className="slide-theme">
@@ -59,32 +57,21 @@ const PageTheme = props => {
                     </NavRight>
                 }
             </Navbar>
-            {arrayThemes.length ? (
+            {arrayThemes.length && (
                 <List className="slide-theme__list">
-                    {defaultThemes.map((elem, index) => {
+                    {arrayThemes.map(theme => {
                         return (
-                            <ListItem key={elem.Index} className={elem.Index === slideThemeIndex ? "item-theme active" : "item-theme"} 
-                                style={{backgroundPosition: "0 " + index * -40 + "px"}} 
+                            <ListItem key={theme.themeId} className={theme.themeId === slideThemeIndex ? "item-theme active" : "item-theme"} 
+                                style={{backgroundPosition: `0 -${theme.offsety}px`, backgroundImage: theme.imageUrl && `url(${theme.imageUrl})`}}
                                 onClick={() => {
-                                    storeSlideSettings.changeSlideThemeIndex(elem.Index);
-                                    props.onThemeClick(elem.Index);
-                                }}>
-                            </ListItem>
-                        );
-                    })}
-                    {docThemes.map((elem, index) => {
-                        return (
-                            <ListItem key={elem.Index} className={elem.Index === slideThemeIndex ? "item-theme active" : "item-theme"}
-                                style={{backgroundPosition: "0 -0px", backgroundImage: "url(" + elem.ThemeInfo.Thumbnail + ")"}}
-                                onClick={() => {
-                                    storeSlideSettings.changeSlideThemeIndex(elem.Index);
-                                    props.onThemeClick(elem.Index);
+                                    storeSlideSettings.changeSlideThemeIndex(theme.themeId);
+                                    props.onThemeClick(theme.themeId);
                                 }}>
                             </ListItem>
                         );
                     })}
                 </List>
-            ) : null}
+            )}
         </Page>
     );
 };

From e3f64d39db4da01e0ddd01620ab608a4f88abffd Mon Sep 17 00:00:00 2001
From: JuliaSvinareva <Julia.Svinaryova@onlyoffice.com>
Date: Mon, 21 Jun 2021 15:29:34 +0300
Subject: [PATCH 73/86] [SSE mobile] Fix bug 50785

---
 .../mobile/src/controller/add/AddFunction.jsx                 | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/apps/spreadsheeteditor/mobile/src/controller/add/AddFunction.jsx b/apps/spreadsheeteditor/mobile/src/controller/add/AddFunction.jsx
index 46220d98d..5c6a4a525 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/add/AddFunction.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/add/AddFunction.jsx
@@ -12,8 +12,8 @@ class _FunctionGroups extends Component {
         super(props);
     }
     componentDidMount() {
-        Common.Notifications.on('engineCreated', api => {
-            this.api = api;
+        Common.Notifications.on('document:ready', () => {
+            this.api = Common.EditorApi.get();
             this.init();
         });
     }

From 698d85360aa8e71da80c0f8d998184fc353b75ed Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Mon, 21 Jun 2021 16:05:01 +0300
Subject: [PATCH 74/86] [PE mobile] Fix Bug 50847

---
 apps/common/mobile/resources/less/common.less |  3 ++
 .../mobile/src/view/edit/EditSlide.jsx        | 37 +++++++++++--------
 2 files changed, 24 insertions(+), 16 deletions(-)

diff --git a/apps/common/mobile/resources/less/common.less b/apps/common/mobile/resources/less/common.less
index efea54205..1371c75b2 100644
--- a/apps/common/mobile/resources/less/common.less
+++ b/apps/common/mobile/resources/less/common.less
@@ -196,6 +196,9 @@
         display: flex;
         flex-wrap: wrap;
         justify-content: space-around;
+        &::before, &::after {
+            display: none;
+        }
     }
     li {
         position: relative;
diff --git a/apps/presentationeditor/mobile/src/view/edit/EditSlide.jsx b/apps/presentationeditor/mobile/src/view/edit/EditSlide.jsx
index cb1ed06ab..60acd7b49 100644
--- a/apps/presentationeditor/mobile/src/view/edit/EditSlide.jsx
+++ b/apps/presentationeditor/mobile/src/view/edit/EditSlide.jsx
@@ -4,6 +4,7 @@ import {f7, Page, Navbar, List, ListItem, Row, BlockTitle, Link, Toggle, Icon, V
 import { ThemeColorPalette, CustomColorPicker } from '../../../../../common/mobile/lib/component/ThemeColorPalette.jsx';
 import { useTranslation } from 'react-i18next';
 import {Device} from '../../../../../common/mobile/utils/device';
+import { element } from 'prop-types';
 
 const EditSlide = props => {
     const { t } = useTranslation();
@@ -82,7 +83,7 @@ const PageLayout = props => {
     const storeFocusObjects = props.storeFocusObjects;
     const storeSlideSettings = props.storeSlideSettings;
     storeSlideSettings.changeSlideLayoutIndex(storeFocusObjects.slideObject.get_LayoutIndex());
-    const arrayLayouts = storeSlideSettings.arrayLayouts;
+    const arrayLayouts = storeSlideSettings.slideLayouts;
     const slideLayoutIndex = storeSlideSettings.slideLayoutIndex;
    
     return (
@@ -96,21 +97,25 @@ const PageLayout = props => {
                     </NavRight>
                 }
             </Navbar>
-            {arrayLayouts.length ? (
-                <List className="slide-layout__list">
-                    {arrayLayouts.map((elem, index) => {
-                        return (
-                            <ListItem key={index} className={slideLayoutIndex === index ? "active" : ""} 
-                                onClick={() => {
-                                    storeSlideSettings.changeSlideLayoutIndex(index);
-                                    props.onLayoutClick(index);
-                                }}>
-                                <img src={elem.Image} style={{width: elem.Width, height: elem.Height}} alt=""/>
-                            </ListItem>
-                        )
-                    })}
-                </List>
-            ) : null}
+            {arrayLayouts.length && 
+                arrayLayouts.map((layouts, index) => {
+                    return (
+                        <List className="slide-layout__list" key={index}>
+                            {layouts.map(layout => {
+                                return (
+                                    <ListItem key={layout.type} className={slideLayoutIndex === layout.type ? "active" : ""} 
+                                        onClick={() => {
+                                            storeSlideSettings.changeSlideLayoutIndex(layout.type);
+                                            props.onLayoutClick(layout.type);
+                                        }}>
+                                        <img src={layout.image} style={{width: layout.width, height: layout.height}} alt=""/>
+                                    </ListItem>
+                                )
+                            })}
+                        </List>
+                    );
+                })
+            }
         </Page>
     );
 };

From 91c3517696d3b375e07ed5226c2d599afac525d8 Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Tue, 22 Jun 2021 00:42:02 +0300
Subject: [PATCH 75/86] [PE mobile] Fix Bug 50946

---
 apps/presentationeditor/mobile/src/controller/add/AddLink.jsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apps/presentationeditor/mobile/src/controller/add/AddLink.jsx b/apps/presentationeditor/mobile/src/controller/add/AddLink.jsx
index 609372460..1c054a041 100644
--- a/apps/presentationeditor/mobile/src/controller/add/AddLink.jsx
+++ b/apps/presentationeditor/mobile/src/controller/add/AddLink.jsx
@@ -64,7 +64,7 @@ class AddLinkController extends Component {
                     break;
                 case 1:
                     url = url + "showjump?jump=previousslide";
-                    slidetip = _t.textPrevSlide;
+                    slidetip = _t.textPreviousSlide;
                     break;
                 case 2:
                     url = url + "showjump?jump=firstslide";

From 263cc0c27da555e2bda98b345dd38d99ec1e2f3c Mon Sep 17 00:00:00 2001
From: Maxim Kadushkin <maxim.kadushkin@onlyoffice.com>
Date: Tue, 22 Jun 2021 14:08:01 +0300
Subject: [PATCH 76/86] [all] fix bug 50735

---
 .../img/right-panels/rowscols_icon.png        | Bin 213 -> 367 bytes
 .../img/right-panels/rowscols_icon@1.5x.png   | Bin 577 -> 546 bytes
 .../img/right-panels/rowscols_icon@2x.png     | Bin 513 -> 977 bytes
 apps/common/main/resources/less/common.less   |  39 ++++++------------
 4 files changed, 12 insertions(+), 27 deletions(-)

diff --git a/apps/common/main/resources/img/right-panels/rowscols_icon.png b/apps/common/main/resources/img/right-panels/rowscols_icon.png
index 4936930c443d1dac21ec6dbd2678021171e7bfec..61ad3eb8fa9e0a6b1470ecfb0c9f8694e7486b90 100644
GIT binary patch
literal 367
zcmeAS@N?(olHy`uVBq!ia0vp^7C@}P!3HGVnRmYcQjEnx?oJHr&dIz4a#+$GeH|GX
zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjKtah8*NBqf{Irtt#G+J&g2c?c61}|C5(N`I
z13g2_E7vxG6y5i9aSVxYe>*vl@2~=ggYBI7d;jgE4SsBlxa$(6uCFM#p>g^#kvD$l
zem<4FH$h>yo;!<W>^aM(c@NKCkl(V$+1Yx=Jx<4jYRB^*p7q$DsGKaoBB%R8^4^AQ
zft>DdeNhMJ`yBL7=lGY>ck!q$>(2^rjy|ELGxxcp61V-(n5A%q>)KR}ny2X|jvAtC
zw0+L+=2+wsE3BhZm~AJd5qO<t4Ri6Nt_4;;FTPekI98+bYR|Ik?~7U%v^=?zk)WvI
z;n&Ny_uut~1DDJrn18RYZI)76+49$bLDf!AeA*fAdCp$>*?Q4Uj~1r_1B-#d)78&q
Iol`;+0GRfS)&Kwi

literal 213
zcmV;`04o29P)<h;3K|Lk000e1NJLTq002|~001Be1ONa4CefFj0001-Nkl<ZcmeH}
zQ3^sa5CeO-{o4EACsF}hD9AGG6Dpbg3j{|@!C|@y{q`s$#J(Qw3H9z0z4fOrCbXv`
zD<&507i~Fj)Eo6ijrsbw@3|gcWT=*P^`u(1V^NC|Xm3g34~z_bE_tsis?;LOqLHCJ
zjeMpjEzLbuRz-E@yjKv_ng5IEJR-_^dILl!WNW+!H##A&m-oP{Hx0Z1+4Nt+%T#h=
P00000NkvXXu0mjfhH_Q)

diff --git a/apps/common/main/resources/img/right-panels/rowscols_icon@1.5x.png b/apps/common/main/resources/img/right-panels/rowscols_icon@1.5x.png
index ed7943a0bb337369810fcc3484e7872c1f573358..b00e33d9f519cbfae87344f8cf09f024c54533a3 100644
GIT binary patch
literal 546
zcmeAS@N?(olHy`uVBq!ia0vp^AwX=v!3HGz`C@y46k~CayA#8@b22Z19F}xPUq=Rp
zjs4tz5?O(K&H|6fVg?4j!ywFfJby(BP*AeOHKHUqKdq!Zu_%?HATcwqL@zJ3M8QPQ
zK+n+f%C${EMU0a?T^vIy;@(c{?rnD9anXF}wIfNRL1^8S5+_bgRn;X^cF)WZn!Dvs
zQ+Z<eO!Y{n+efZlcDo>%Y}d8#eSLICSOv$_+gX)dS97;UWTfes7>muCIsJmzBGIz>
z7i`bFrrA!rdvM-!r_DMhswStMf{_?Ia=0&Y*)0@qNsG+z%9z%=42e;A6KKMdYZA#m
znakqD-nY~(v#7Fv<7OW`uVc#M)>of$bxN4H&-S#Y9dj~HUO02(g)=oR7nChSyjpaf
zE*dMWd*gaXWKUXNKy=_X4%gESJ2r{m5oy`!{4GYb>sQAP<+>?V2j^rh4m!F(G}f=_
z6HsK5?abh{Kjw8i1@2a;klH`RE5X-Rd}$Yh<mT!{C5|6V&b>Q1tE%hWPPHk^-$!rX
zyrF&XE?p)U9nPmOqwh|(eRDNe@>z@0`N`WWe?&S>e0K7-&21;wV5j9yTUY)26uctr
ze0&|J$Es&bx3H*O{Tvj<ylB;r93c7XN6sy#mbw2D_p@?X|37?BBKeH{u6O);-=9o7
T60Ery7=;X;u6{1-oD!M<YVqh>

literal 577
zcmV-H0>1r;P)<h;3K|Lk000e1NJLTq004df001xu1^@s6*Ky920000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz<4Ht8RCwC#o9%IeKoEw3NdcB%39$rc
zC?Hl4O0g4S1@a$yNIEbjq=RJFS^befKt4QHo@eI9ncFqKxtHbkB#9yb0C;fXG)=!*
zhVdxN(uYtF#;ZmzI+eNWRE-HWx=b)0<ALT5Xzs>*-;mGpqO)&v*XMmhK8ssDdpuw~
zU_8*(16@5`JzYJp#{<R##sghFT|EE*0Kl}(-7U#O8^Nlo;(Pp3UUUxq!^~KS=Dwi!
zJUw{PImGy(7Y*n5g@W-I4;T*^4;T+i#mfU7FFHg1gXPl%i~b@nuQK%Y!=|5Q6fzD~
zRTVS2I9%wIYvW&?aU2)HD@o$HjFXJ4CYD(&M`yQ+mvAoQBqOVdWftqDGZ}HQ_jV<2
zq*~s7$8Bz-IhGr$(p~5jL$5les{iP;xwB5o4c6T0?Pw<p_tlhOv7P0H!j(=jxKXFY
zdg)9?s-l%G*k@aAmz)W!-Gxr6;FTHMs-a5`$2sWV)z>vn`WRE@HMVZ66wL{Bq?@D8
zx&}`lx9YTvbz4Pi&g90oJf}X$ILd-;oAyt;)gCQ(GQ8+)d7ggODaLM__IcY9dg)9?
zT<pD_GvAwzNgC4}%MF4TonrP?XVY=+qSJD3`}ur<!xuOJ008hf{0J}rh7Na)0#C*C
P00000NkvXXu0mjf8@~qP

diff --git a/apps/common/main/resources/img/right-panels/rowscols_icon@2x.png b/apps/common/main/resources/img/right-panels/rowscols_icon@2x.png
index 113f8835b42e3505723eb2504ed34ee418e3849b..a2a69e6bd11aeb5a5d923d6a0d32ab8be6ce5029 100644
GIT binary patch
literal 977
zcmeAS@N?(olHy`uVBq!ia0vp^1wib;!3HD`&HDTdNHG=%xjQkeJ16rJ$YDu$^mSxl
z*x1kgCy^D%=PdAuEM{QfI}E~%$MaXD00kvWTq8<?^V3So6N^$A3KBE(O7!wlOB77>
z4D<{wuUy*%RK)D)>Eakt5%+e6Z=RAPPiy2swVt%|r523e8)PQCig}iKu5%QdEc#jQ
zFW1?WU+j0n!b^MYPX?WOS~cmflk-<4jwS_;f8pD1zuoz4#ax4eXED52*f&Y-lU`9`
zx?-(C!8&B(hoEu!p#w7?f8)>%RbRM8^5m4|k8KTf&sMxvnPR3q^Ha$l_GL>Y^XIl)
zN>d4**Z2Lv7L&(oCkNc>NjY`-quh*XX?seAyk<}IskFMseECw(c0Z>~<4KzS>ZVcI
zSNtR_io0sRWM-<pq{y)2)d^9vK3?<G$aOP%`f`a|cJD1t=JY<h3626RAY`C^t8Q0y
z%ahHE<6pn?u(QuS{GH=uy8Guc_fJ1R%2ljn%d(U@+1ePqu(G{zyAYe7k3@z1ByQ&A
zPM`Uh^Hq7~%rN+1ry|bg*ZNGB?VRY@-M9W7I<V6?Md91D4(3N478}bHA`VB*i}X^H
z{<MCxeU7dm`w_uHC!T{+*FO1t`&Y&5QrBGJXWI7QX77_t2Remy|1-Vhee^RZp*el?
zx9gb-MSq^Cezp^^KEj_{en{%-C!X{B6vA%Jo0E3#zf^~aedWnL{73i<Z^&ndoHl;K
zI&tlOJLd1Vs@?yD{7S1}`>58t_tNCcXLejYP`kOf&i&3^`SS|*G#EC0y`HYH|M-sW
z!LRZv!lc}ns<|`g8Be&MeB_S&c{8EsIe))O{#d&A;BhZ;i`~<X=|ki{tiCB(ms8fb
z`L)}lIUtLoKYxF;G}#rX^+VING?mF~_Zt+bOgee(e(8bx?7jPK<reZ^vd}cOob_IG
z>CEpHEp{dlqa&{N&uF=H=K4qFW!yY-^MfpE;#iNxDf4-WGq;^H*K7%I+<3j?(XYjf
z+AR7HO%!6ET)*|M#dOuvzZ28r1%K-8l1+F4l2M6$!u~tCH><K<Wj#>&?uLW?wNsDP
zH|$wItLngm<NLfG+dFLh8{5EGv-Dd>g;R~vt)5@TpvXA+e^WVw#DVav{topc>PZ~e
nHcU(Jdan;k`KMAg{^0$@bi2XlZA=F+$1!-i`njxgN@xNAep<k(

literal 513
zcmeAS@N?(olHy`uVBq!ia0vp^D}dO6g9S*cgnqfez`%II)5S5Qg7NJv!@NTdBCIRl
zs3}y%KcAcMzR_|SH<z_+0dKI%)g=p)S|eSxyXWt@`ORC|&FHsoWpZ7=;jxbWwbzb0
zu9Tm$b$**^?SZU)|0S+C%3g77mcRdL-_zCSLcWGpJ;^@1Cq96^6oM{%?f)LY{#EYP
ze}quE-92a7D-y{)hU-6GuN17E(%if+`@*H29s4c?@V#09MZeVS*h??Wso19z@<;x~
zf~+gq7j)##t#RBtD`KCG2Cpr%asL^fFD6r)S6$W+JGVlwPoLlG_z5B9*rN-wOt@mF
zZaMv|%xf2yZ&vb;PYX<X4or1<mhAqB%V*2iCb<^9TlRDBzSb$>cyzj1u7TUX_KhWT
zdzB;m!YvkaTiO)%*}P!T`Q>pSK>x+|3wecA+FwMEPG|kgCRUr%xW39!@abp68irE)
zlZ6+)Hgg63;Hcv`JF(`DX3Z1(hMjR2K6xwk^jmAkcv-$`J*R(thTW=uIg9-<vwu}N
zM*Dtut)6{<yVov`+Eu-;7N_pg|2DH<x0CyWr)m7j)en~B3118U@XGRH?yE&^?sH2{
z*WL0}m%W<P^gF|%=+QA{b3d7rHD3*mNqlDBU%G$RkpjP4z^G;LboFyt=akR{0I)6W
AMgRZ+

diff --git a/apps/common/main/resources/less/common.less b/apps/common/main/resources/less/common.less
index d732bc597..b4a0128b6 100644
--- a/apps/common/main/resources/less/common.less
+++ b/apps/common/main/resources/less/common.less
@@ -222,49 +222,34 @@ textarea {
 
 .btn-edit-table,
 .btn-change-shape {
-    .background-ximage-v2('right-panels/rowscols_icon.png', 84px);
+    .background-ximage-v2('right-panels/rowscols_icon.png', 56px);
     margin-right: 2px !important;
     margin-bottom: 1px !important;
+
+    background-position-x: calc(@button-small-normal-icon-offset-x - 8px);
+
+    .btn-group.open &,
+        button.active:not(.disabled) &,
+        button:active:not(.disabled) &
+    {
+        background-position-x: calc(@button-small-active-icon-offset-x - 8px);
+    }
 }
 
 .btn-edit-table {
-    background-position: 0 0;
+    background-position-y: 0;
 
     button.over & {
         //background-position: -28px 0;
     }
-
-    .btn-group.open &,
-        button.active:not(.disabled) &,
-        button:active:not(.disabled) &
-    {
-        //background-position: -56px 0;
-    }
-
-    // TODO: not good, must be controled by variable
-    .theme-dark & {
-        background-position-x: -56px;
-    }
 }
 
 .btn-change-shape {
-    background-position: 0 -16px;
+    background-position-y: -16px;
 
     button.over & {
         //background-position: -28px -16px;
     }
-
-    .btn-group.open &,
-        button.active:not(.disabled) &,
-        button:active:not(.disabled) &
-    {
-        //background-position: -56px -16px;
-    }
-
-    // TODO: not good, must be controled by variable
-    .theme-dark & {
-        background-position-x: -56px;
-    }
 }
 
 .doc-content-color {

From 4789fd68f00b80e1076758ea43568a3040f9d7a4 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Tue, 22 Jun 2021 15:42:21 +0300
Subject: [PATCH 77/86] Fix Bug 27605

---
 apps/documenteditor/main/app/view/DocumentHolder.js             | 1 +
 apps/documenteditor/main/app/view/ImageSettings.js              | 1 +
 apps/documenteditor/main/app/view/ImageSettingsAdvanced.js      | 2 ++
 apps/documenteditor/mobile/src/controller/edit/EditImage.jsx    | 1 +
 apps/presentationeditor/main/app/view/DocumentHolder.js         | 1 +
 apps/presentationeditor/main/app/view/ImageSettings.js          | 1 +
 apps/presentationeditor/main/app/view/ImageSettingsAdvanced.js  | 1 +
 .../presentationeditor/mobile/src/controller/edit/EditImage.jsx | 1 +
 apps/spreadsheeteditor/main/app/controller/DocumentHolder.js    | 1 +
 apps/spreadsheeteditor/main/app/view/ImageSettings.js           | 1 +
 apps/spreadsheeteditor/mobile/src/controller/edit/EditImage.jsx | 1 +
 11 files changed, 12 insertions(+)

diff --git a/apps/documenteditor/main/app/view/DocumentHolder.js b/apps/documenteditor/main/app/view/DocumentHolder.js
index 97ad0f1bd..d087ec28f 100644
--- a/apps/documenteditor/main/app/view/DocumentHolder.js
+++ b/apps/documenteditor/main/app/view/DocumentHolder.js
@@ -2378,6 +2378,7 @@ define([
                     properties.put_Width(originalImageSize.get_ImageWidth());
                     properties.put_Height(originalImageSize.get_ImageHeight());
                     properties.put_ResetCrop(true);
+                    properties.put_Rot(0);
                     me.api.ImgApply(properties);
 
                     me.fireEvent('editcomplete', this);
diff --git a/apps/documenteditor/main/app/view/ImageSettings.js b/apps/documenteditor/main/app/view/ImageSettings.js
index f48827afc..9a754a41e 100644
--- a/apps/documenteditor/main/app/view/ImageSettings.js
+++ b/apps/documenteditor/main/app/view/ImageSettings.js
@@ -410,6 +410,7 @@ define([
                 properties.put_Width(w);
                 properties.put_Height(h);
                 properties.put_ResetCrop(true);
+                properties.put_Rot(0);
                 this.api.ImgApply(properties);
                 this.fireEvent('editcomplete', this);
             }
diff --git a/apps/documenteditor/main/app/view/ImageSettingsAdvanced.js b/apps/documenteditor/main/app/view/ImageSettingsAdvanced.js
index 4637114d2..75278fe85 100644
--- a/apps/documenteditor/main/app/view/ImageSettingsAdvanced.js
+++ b/apps/documenteditor/main/app/view/ImageSettingsAdvanced.js
@@ -174,6 +174,7 @@ define([    'text!documenteditor/main/app/template/ImageSettingsAdvanced.templat
                 el: $('#image-advanced-button-original-size')
             });
             this.btnOriginalSize.on('click', _.bind(function(btn, e) {
+                this.spnAngle.setValue(0);
                 this.spnWidth.setValue(this.sizeOriginal.width, true);
                 this.spnHeight.setValue(this.sizeOriginal.height, true);
                 this._nRatio = this.sizeOriginal.width/this.sizeOriginal.height;
@@ -181,6 +182,7 @@ define([    'text!documenteditor/main/app/template/ImageSettingsAdvanced.templat
                     this._changedProps.put_Height(Common.Utils.Metric.fnRecalcToMM(this.spnHeight.getNumberValue()));
                     this._changedProps.put_Width(Common.Utils.Metric.fnRecalcToMM(this.spnWidth.getNumberValue()));
                     this._changedProps.put_ResetCrop(true);
+                    this._changedProps.put_Rot(0);
                 }
             }, this));
 
diff --git a/apps/documenteditor/mobile/src/controller/edit/EditImage.jsx b/apps/documenteditor/mobile/src/controller/edit/EditImage.jsx
index 108056b23..ca94da190 100644
--- a/apps/documenteditor/mobile/src/controller/edit/EditImage.jsx
+++ b/apps/documenteditor/mobile/src/controller/edit/EditImage.jsx
@@ -30,6 +30,7 @@ class EditImageController extends Component {
             properties.put_Width(imgSize.get_ImageWidth());
             properties.put_Height(imgSize.get_ImageHeight());
             properties.put_ResetCrop(true);
+            properties.put_Rot(0);
             api.ImgApply(properties);
         }
     }
diff --git a/apps/presentationeditor/main/app/view/DocumentHolder.js b/apps/presentationeditor/main/app/view/DocumentHolder.js
index 71a7fc834..9285ce0ee 100644
--- a/apps/presentationeditor/main/app/view/DocumentHolder.js
+++ b/apps/presentationeditor/main/app/view/DocumentHolder.js
@@ -2887,6 +2887,7 @@ define([
                         properties.put_Width(originalImageSize.get_ImageWidth());
                         properties.put_Height(originalImageSize.get_ImageHeight());
                         properties.put_ResetCrop(true);
+                        properties.put_Rot(0);
                         me.api.ImgApply(properties);
                     }
 
diff --git a/apps/presentationeditor/main/app/view/ImageSettings.js b/apps/presentationeditor/main/app/view/ImageSettings.js
index 343e8e852..f5c6bcac8 100644
--- a/apps/presentationeditor/main/app/view/ImageSettings.js
+++ b/apps/presentationeditor/main/app/view/ImageSettings.js
@@ -300,6 +300,7 @@ define([
                 properties.put_Width(w);
                 properties.put_Height(h);
                 properties.put_ResetCrop(true);
+                properties.put_Rot(0);
                 this.api.ImgApply(properties);
                 this.fireEvent('editcomplete', this);
             }
diff --git a/apps/presentationeditor/main/app/view/ImageSettingsAdvanced.js b/apps/presentationeditor/main/app/view/ImageSettingsAdvanced.js
index d475e0f7a..54a874037 100644
--- a/apps/presentationeditor/main/app/view/ImageSettingsAdvanced.js
+++ b/apps/presentationeditor/main/app/view/ImageSettingsAdvanced.js
@@ -133,6 +133,7 @@ define([    'text!presentationeditor/main/app/template/ImageSettingsAdvanced.tem
                 el: $('#image-advanced-button-original-size')
             });
             this.btnOriginalSize.on('click', _.bind(function(btn, e) {
+                this.spnAngle.setValue(0);
                 this.spnWidth.setValue(this.sizeOriginal.width, true);
                 this.spnHeight.setValue(this.sizeOriginal.height, true);
                 this._nRatio = this.sizeOriginal.width/this.sizeOriginal.height;
diff --git a/apps/presentationeditor/mobile/src/controller/edit/EditImage.jsx b/apps/presentationeditor/mobile/src/controller/edit/EditImage.jsx
index eb607e1f6..5c59109c2 100644
--- a/apps/presentationeditor/mobile/src/controller/edit/EditImage.jsx
+++ b/apps/presentationeditor/mobile/src/controller/edit/EditImage.jsx
@@ -79,6 +79,7 @@ class EditImageController extends Component {
         properties.put_Width(imgsize.get_ImageWidth());
         properties.put_Height(imgsize.get_ImageHeight());
         properties.put_ResetCrop(true);
+        properties.put_Rot(0);
         api.ImgApply(properties);
     }
 
diff --git a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js
index 657726150..7e1ede550 100644
--- a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js
+++ b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js
@@ -3512,6 +3512,7 @@ define([
                 properties.asc_putWidth(w);
                 properties.asc_putHeight(h);
                 properties.put_ResetCrop(true);
+                properties.put_Rot(0);
                 this.api.asc_setGraphicObjectProps(properties);
 
                 Common.NotificationCenter.trigger('edit:complete', this.documentHolder);
diff --git a/apps/spreadsheeteditor/main/app/view/ImageSettings.js b/apps/spreadsheeteditor/main/app/view/ImageSettings.js
index 86e6c9324..0c342a78b 100644
--- a/apps/spreadsheeteditor/main/app/view/ImageSettings.js
+++ b/apps/spreadsheeteditor/main/app/view/ImageSettings.js
@@ -428,6 +428,7 @@ define([
                 properties.asc_putWidth(w);
                 properties.asc_putHeight(h);
                 properties.put_ResetCrop(true);
+                properties.put_Rot(0);
                 this.api.asc_setGraphicObjectProps(properties);
                 Common.NotificationCenter.trigger('edit:complete', this);
             }
diff --git a/apps/spreadsheeteditor/mobile/src/controller/edit/EditImage.jsx b/apps/spreadsheeteditor/mobile/src/controller/edit/EditImage.jsx
index 446dc647d..d882773b1 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/edit/EditImage.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/edit/EditImage.jsx
@@ -51,6 +51,7 @@ class EditImageController extends Component {
         properties.put_Width(imgsize.get_ImageWidth());
         properties.put_Height(imgsize.get_ImageHeight());
         properties.put_ResetCrop(true);
+        properties.put_Rot(0);
         api.asc_setGraphicObjectProps(properties);
     }
 

From 5229b93eebd964e86586a5d11b3c69b9c3e8484a Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Wed, 23 Jun 2021 00:34:35 +0300
Subject: [PATCH 78/86] [PE mobile] Bug 50789

---
 apps/spreadsheeteditor/mobile/src/store/textSettings.js | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/apps/spreadsheeteditor/mobile/src/store/textSettings.js b/apps/spreadsheeteditor/mobile/src/store/textSettings.js
index e9b3e5e6d..b17cb0ca7 100644
--- a/apps/spreadsheeteditor/mobile/src/store/textSettings.js
+++ b/apps/spreadsheeteditor/mobile/src/store/textSettings.js
@@ -16,6 +16,7 @@ export class storeTextSettings {
             paragraphValign: observable,
             textIn: observable,
             initTextSettings: action,
+            initFontSettings: action,
             initEditorFonts: action,
             initFontInfo: action,
             changeTextColor: action,
@@ -46,6 +47,10 @@ export class storeTextSettings {
             default: this.textIn = 0;
         }
 
+        this.initFontSettings(xfs);
+    }
+
+    initFontSettings(xfs) {
         this.fontName = xfs.asc_getFontName();
         this.fontSize = xfs.asc_getFontSize();
 

From c5874e48ac0a6b21b2bc8ff7ff77791c07700232 Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Wed, 23 Jun 2021 01:38:47 +0300
Subject: [PATCH 79/86] [PE mobile] Fix Bug 47072

---
 .../mobile/src/controller/edit/EditText.jsx                 | 6 +++---
 apps/presentationeditor/mobile/src/view/edit/EditText.jsx   | 4 ++--
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/apps/presentationeditor/mobile/src/controller/edit/EditText.jsx b/apps/presentationeditor/mobile/src/controller/edit/EditText.jsx
index c81767977..46dae3c2a 100644
--- a/apps/presentationeditor/mobile/src/controller/edit/EditText.jsx
+++ b/apps/presentationeditor/mobile/src/controller/edit/EditText.jsx
@@ -134,11 +134,11 @@ class EditTextController extends Component {
         let size = curSize;
 
         if (isDecrement) {
-            typeof size === 'undefined' ? api.FontSizeOut() : size = Math.max(1, --size);
+            typeof size === 'undefined' || size == '' ? api.FontSizeOut() : size = Math.max(1, --size);
         } else {
-            typeof size === 'undefined' ? api.FontSizeIn : size = Math.min(300, ++size);
+            typeof size === 'undefined' || size == '' ? api.FontSizeIn() : size = Math.min(300, ++size);
         }
-        if (typeof size !== 'undefined') {
+        if (typeof size !== 'undefined' || size == '') {
             api.put_TextPrFontSize(size);
         }
     };
diff --git a/apps/presentationeditor/mobile/src/view/edit/EditText.jsx b/apps/presentationeditor/mobile/src/view/edit/EditText.jsx
index d7bd881f5..cb78c4800 100644
--- a/apps/presentationeditor/mobile/src/view/edit/EditText.jsx
+++ b/apps/presentationeditor/mobile/src/view/edit/EditText.jsx
@@ -15,7 +15,7 @@ const EditText = props => {
     const fontName = storeTextSettings.fontName || _t.textFonts;
     const fontSize = storeTextSettings.fontSize;
     const fontColor = storeTextSettings.textColor;
-    const displaySize = typeof fontSize === 'undefined' ? _t.textAuto : fontSize + ' ' + _t.textPt;
+    const displaySize = typeof fontSize === 'undefined' || fontSize == '' ? _t.textAuto : fontSize + ' ' + _t.textPt;
     const isBold = storeTextSettings.isBold;
     const isItalic = storeTextSettings.isItalic;
     const isUnderline = storeTextSettings.isUnderline;
@@ -173,7 +173,7 @@ const PageFonts = props => {
     const _t = t('View.Edit', {returnObjects: true});
     const storeTextSettings = props.storeTextSettings;
     const size = storeTextSettings.fontSize;
-    const displaySize = typeof size === 'undefined' ? _t.textAuto : size + ' ' + _t.textPt;
+    const displaySize = typeof size === 'undefined' || size == '' ? _t.textAuto : size + ' ' + _t.textPt;
     const curFontName = storeTextSettings.fontName;
     const fonts = storeTextSettings.fontsArray;
 

From a09aaaf883c1c54b7ad0cae3dc0213decdadf7a8 Mon Sep 17 00:00:00 2001
From: ShimaginAndrey <andrey.shimagin@onlyoffice.com>
Date: Wed, 23 Jun 2021 14:50:39 +0300
Subject: [PATCH 80/86] [DE PE SSE mobile] Fix Bug 50794

---
 apps/documenteditor/mobile/locale/en.json       |  1 +
 .../mobile/src/controller/Main.jsx              |  3 ++-
 .../mobile/src/controller/settings/Download.jsx | 15 +++++++++++++--
 apps/presentationeditor/mobile/locale/en.json   |  1 +
 .../mobile/src/controller/Main.jsx              | 17 ++++++++++++++++-
 apps/spreadsheeteditor/mobile/locale/en.json    |  3 ++-
 .../mobile/src/controller/Main.jsx              |  3 ++-
 .../mobile/src/controller/settings/Download.jsx | 12 +++++++++++-
 8 files changed, 48 insertions(+), 7 deletions(-)

diff --git a/apps/documenteditor/mobile/locale/en.json b/apps/documenteditor/mobile/locale/en.json
index 441904234..ee1e7ff8d 100644
--- a/apps/documenteditor/mobile/locale/en.json
+++ b/apps/documenteditor/mobile/locale/en.json
@@ -330,6 +330,7 @@
     "advDRMOptions": "Protected File",
     "txtProtected": "Once you enter the password and open the file, the current password to the file will be reset",
     "textOpenFile": "Enter a password to open the file",
+    "txtIncorrectPwd": "Password is incorrect",
     "textNoTextFound": "Text not found",
     "textReplace": "Replace",
     "textReplaceAll": "Replace All",
diff --git a/apps/documenteditor/mobile/src/controller/Main.jsx b/apps/documenteditor/mobile/src/controller/Main.jsx
index b30a0f26b..4bf67dcf4 100644
--- a/apps/documenteditor/mobile/src/controller/Main.jsx
+++ b/apps/documenteditor/mobile/src/controller/Main.jsx
@@ -611,7 +611,8 @@ class MainController extends Component {
         this.api.asc_registerCallback('asc_onAdvancedOptions', (type, advOptions, mode, formatOptions) => {
             const {t} = this.props;
             const _t = t("Settings", { returnObjects: true });
-            onAdvancedOptions(type, advOptions, mode, formatOptions, _t, this._isDocReady, this.props.storeAppOptions.canRequestClose);
+            onAdvancedOptions(type, advOptions, mode, formatOptions, _t, this._isDocReady, this.props.storeAppOptions.canRequestClose, this.isDRM);
+            if(type == Asc.c_oAscAdvancedOptionsID.DRM) this.isDRM = true;
         });
     }
 
diff --git a/apps/documenteditor/mobile/src/controller/settings/Download.jsx b/apps/documenteditor/mobile/src/controller/settings/Download.jsx
index aa5982539..a0d54ab35 100644
--- a/apps/documenteditor/mobile/src/controller/settings/Download.jsx
+++ b/apps/documenteditor/mobile/src/controller/settings/Download.jsx
@@ -32,7 +32,7 @@ class DownloadController extends Component {
                     () => {
                         if (format == Asc.c_oAscFileType.TXT) {
                             const isDocReady = this.props.storeAppOptions.isDocReady;
-                            onAdvancedOptions(Asc.c_oAscAdvancedOptionsID.TXT, api.asc_getAdvancedOptions(), 2, new Asc.asc_CDownloadOptions(format), _t, isDocReady);
+                            onAdvancedOptions(Asc.c_oAscAdvancedOptionsID.TXT, api.asc_getAdvancedOptions(), 2, new Asc.asc_CDownloadOptions(format), _t, isDocReady, isDRM);
                         }
                         else {
                             api.asc_DownloadAs(new Asc.asc_CDownloadOptions(format));
@@ -57,7 +57,7 @@ class DownloadController extends Component {
 
 const DownloadWithTranslation = inject("storeAppOptions")(observer(withTranslation()(DownloadController)));
 
-const onAdvancedOptions = (type, advOptions, mode, formatOptions, _t, isDocReady, canRequestClose) => {
+const onAdvancedOptions = (type, advOptions, mode, formatOptions, _t, isDocReady, canRequestClose, isDRM) => {
     if ($$('.dlg-adv-options.modal-in').length > 0) return;
 
     const api = Common.EditorApi.get();
@@ -134,6 +134,17 @@ const onAdvancedOptions = (type, advOptions, mode, formatOptions, _t, isDocReady
                 }
             }
         }];
+
+        if(isDRM) {
+            f7.dialog.create({
+                text: _t.txtIncorrectPwd,
+                buttons : [{
+                    text: 'OK',
+                    bold: true,
+                }]
+            }).open();
+        }
+
         if (canRequestClose)
             buttons.push({
                 text: _t.closeButtonText,
diff --git a/apps/presentationeditor/mobile/locale/en.json b/apps/presentationeditor/mobile/locale/en.json
index c7de2720b..5546b0303 100644
--- a/apps/presentationeditor/mobile/locale/en.json
+++ b/apps/presentationeditor/mobile/locale/en.json
@@ -29,6 +29,7 @@
       "advDRMPassword": "Password",
       "txtProtected": "Once you enter the password and open the file, the current password to the file will be reset",
       "textOpenFile": "Enter a password to open the file",
+      "txtIncorrectPwd": "Password is incorrect",
       "leavePageText": "You have unsaved changes in this document. Click 'Stay on this Page' to await the autosave of the document. Click 'Leave this Page' to discard all the unsaved changes.",
       "titleLicenseExp": "License expired",
       "warnLicenseExp": "Your license has expired. Please update your license and refresh the page.",
diff --git a/apps/presentationeditor/mobile/src/controller/Main.jsx b/apps/presentationeditor/mobile/src/controller/Main.jsx
index 6210b4bf6..720a35539 100644
--- a/apps/presentationeditor/mobile/src/controller/Main.jsx
+++ b/apps/presentationeditor/mobile/src/controller/Main.jsx
@@ -300,7 +300,6 @@ class MainController extends Component {
         this.api.asc_registerCallback('asc_onDocumentContentReady', this.onDocumentContentReady.bind(this));
         this.api.asc_registerCallback('asc_onDocumentUpdateVersion', this.onUpdateVersion.bind(this));
         this.api.asc_registerCallback('asc_onServerVersion', this.onServerVersion.bind(this));
-        this.api.asc_registerCallback('asc_onAdvancedOptions', this.onAdvancedOptions.bind(this));
         this.api.asc_registerCallback('asc_onDocumentName', this.onDocumentName.bind(this));
         this.api.asc_registerCallback('asc_onPrintUrl', this.onPrintUrl.bind(this));
         this.api.asc_registerCallback('asc_onPrint', this.onPrint.bind(this));
@@ -310,6 +309,10 @@ class MainController extends Component {
 
         const storePresentationSettings = this.props.storePresentationSettings;
 
+        this.api.asc_registerCallback('asc_onAdvancedOptions', (type, advOptions) => {
+            this.onAdvancedOptions(type, advOptions);
+        });
+
         this.api.asc_registerCallback('asc_onPresentationSize', (width, height) => {
             storePresentationSettings.changeSizeIndex(width, height);
         });
@@ -604,6 +607,17 @@ class MainController extends Component {
                     }
                 }
             }];
+
+            if(this.isDRM) {
+                f7.dialog.create({
+                    text: _t.txtIncorrectPwd,
+                    buttons : [{
+                        text: 'OK',
+                        bold: true,
+                    }]
+                }).open();
+            }
+
             if (this.props.storeAppOptions.canRequestClose)
                 buttons.push({
                     text: _t.closeButtonText,
@@ -620,6 +634,7 @@ class MainController extends Component {
                 buttons: buttons,
                 cssClass: 'dlg-adv-options'
             }).open();
+            this.isDRM = true;
         }
     }
 
diff --git a/apps/spreadsheeteditor/mobile/locale/en.json b/apps/spreadsheeteditor/mobile/locale/en.json
index 8c9a6f6b0..7921455e0 100644
--- a/apps/spreadsheeteditor/mobile/locale/en.json
+++ b/apps/spreadsheeteditor/mobile/locale/en.json
@@ -164,7 +164,7 @@
         "errorFrmlMaxTextLength": "Text values in formulas are limited to 255 characters.<br>Use the CONCATENATE function or concatenation operator (&)",
         "errorFrmlMaxLength": "You cannot add this formula as its length exceeded the allowed number of characters.<br>Please edit it and try again.",
         "errorFrmlMaxReference": "You cannot enter this formula because it has too many values,<br>cell references, and/or names.",
-        "errorDataValidate":"The value you entered is not valid.<br>A user has restricted values that can be entered into this cell.",
+        "errorDataValidate": "The value you entered is not valid.<br>A user has restricted values that can be entered into this cell.",
         "errorLockedCellPivot": "You cannot change data inside a pivot table."
     },
     "ContextMenu": {
@@ -460,6 +460,7 @@
             "closeButtonText": "Close File",
             "txtProtected": "Once you enter the password and open the file, the current password to the file will be reset",
             "textOpenFile": "Enter a password to open the file",
+            "txtIncorrectPwd": "Password is incorrect",
             "textCancel": "Cancel",
             "textUnitOfMeasurement": "Unit Of Measurement",
             "textCentimeter": "Centimeter",
diff --git a/apps/spreadsheeteditor/mobile/src/controller/Main.jsx b/apps/spreadsheeteditor/mobile/src/controller/Main.jsx
index f23dd952d..a021ed9e2 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/Main.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/Main.jsx
@@ -323,7 +323,8 @@ class MainController extends Component {
         this.api.asc_registerCallback('asc_onAdvancedOptions', (type, advOptions, mode, formatOptions) => {
             const {t} = this.props;
             const _t = t("View.Settings", { returnObjects: true });
-            onAdvancedOptions(type, advOptions, mode, formatOptions, _t, this._isDocReady, this.props.storeAppOptions.canRequestClose);
+            onAdvancedOptions(type, advOptions, mode, formatOptions, _t, this._isDocReady, this.props.storeAppOptions.canRequestClose,this.isDRM);
+            if(type == Asc.c_oAscAdvancedOptionsID.DRM) this.isDRM = true;
         });
 
     }
diff --git a/apps/spreadsheeteditor/mobile/src/controller/settings/Download.jsx b/apps/spreadsheeteditor/mobile/src/controller/settings/Download.jsx
index 320a6e650..24dc66428 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/settings/Download.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/settings/Download.jsx
@@ -39,7 +39,7 @@ class DownloadController extends Component {
 
 const DownloadWithTranslation = withTranslation()(DownloadController);
 
-const onAdvancedOptions = (type, advOptions, mode, formatOptions, _t, isDocReady, canRequestClose) => {
+const onAdvancedOptions = (type, advOptions, mode, formatOptions, _t, isDocReady, canRequestClose, isDRM) => {
     const api = Common.EditorApi.get();
 
     if (type == Asc.c_oAscAdvancedOptionsID.CSV) {
@@ -136,6 +136,16 @@ const onAdvancedOptions = (type, advOptions, mode, formatOptions, _t, isDocReady
             }
         }];
 
+        if(isDRM) {
+            f7.dialog.create({
+                text: _t.txtIncorrectPwd,
+                buttons : [{
+                    text: 'OK',
+                    bold: true,
+                }]
+            }).open();
+        }
+
         if (canRequestClose)
             buttons.push({
                 text: _t.closeButtonText,

From b7d5babce10a08ba737d645ffcd916380b1caf9a Mon Sep 17 00:00:00 2001
From: SergeyEzhin <ezhin@mail.ru>
Date: Wed, 23 Jun 2021 16:08:12 +0300
Subject: [PATCH 81/86] [SSE mobile] Fix Bug 50958

---
 .../mobile/src/controller/settings/ApplicationSettings.jsx | 5 ++---
 .../mobile/src/store/applicationSettings.js                | 7 +++++--
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/apps/spreadsheeteditor/mobile/src/controller/settings/ApplicationSettings.jsx b/apps/spreadsheeteditor/mobile/src/controller/settings/ApplicationSettings.jsx
index f2abdf87a..df4028e75 100644
--- a/apps/spreadsheeteditor/mobile/src/controller/settings/ApplicationSettings.jsx
+++ b/apps/spreadsheeteditor/mobile/src/controller/settings/ApplicationSettings.jsx
@@ -2,6 +2,7 @@ import React, { Component } from "react";
 import { ApplicationSettings } from "../../view/settings/ApplicationSettings";
 import {observer, inject} from "mobx-react";
 import { LocalStorage } from '../../../../../common/mobile/utils/LocalStorage';
+import {FunctionGroups} from '../../controller/add/AddFunction';
 
 class ApplicationSettingsController extends Component {
     constructor(props) {
@@ -16,11 +17,9 @@ class ApplicationSettingsController extends Component {
     }
 
     initRegSettings() {
-        this.props.storeApplicationSettings.getRegCode();
-
         const info = new Asc.asc_CFormatCellsInfo();
         const api = Common.EditorApi.get();
-        const regCode = this.props.storeApplicationSettings.regCode;
+        const regCode = this.props.storeApplicationSettings.getRegCode();
 
         info.asc_setType(Asc.c_oAscNumFormatType.None);
         info.asc_setSymbol(regCode);
diff --git a/apps/spreadsheeteditor/mobile/src/store/applicationSettings.js b/apps/spreadsheeteditor/mobile/src/store/applicationSettings.js
index faea20f77..d18e04d2e 100644
--- a/apps/spreadsheeteditor/mobile/src/store/applicationSettings.js
+++ b/apps/spreadsheeteditor/mobile/src/store/applicationSettings.js
@@ -1,4 +1,5 @@
 import {makeObservable, action, observable} from 'mobx';
+import { LocalStorage } from '../../../../common/mobile/utils/LocalStorage';
 
 export class storeApplicationSettings {
     constructor() {
@@ -27,7 +28,7 @@ export class storeApplicationSettings {
 
     unitMeasurement = Common.Utils.Metric.getCurrentMetric();
     macrosMode = 0;
-    formulaLang = Common.Locale.currentLang || dataLang[0].value;
+    formulaLang = LocalStorage.getItem('sse-settings-func-lang') || dataLang[0].value;
     regCode = undefined;
     regExample = '';
     regData = [];
@@ -70,7 +71,7 @@ export class storeApplicationSettings {
 
     getRegCode() {
         const regData = this.regData;
-        let value = Number(Common.localStorage.getItem('sse-settings-regional'));
+        let value = Number(LocalStorage.getItem('sse-settings-regional'));
         
         regData.forEach(obj => {
             if(obj.code === value) {
@@ -81,6 +82,8 @@ export class storeApplicationSettings {
         if(!this.regCode) {
             this.regCode = 0x0409;
         }
+
+        return this.regCode;
     }
 
     changeRegCode(value) {

From 8766f4db6133f33df87746e2937c3a4a682199ca Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Thu, 24 Jun 2021 19:08:21 +0300
Subject: [PATCH 82/86] [DE embedded] Show loader mask

---
 apps/common/embed/lib/util/utils.js           |  8 ++
 apps/common/embed/lib/view/LoadMask.js        | 99 +++++++++++++++++++
 apps/common/embed/resources/less/common.less  |  2 +
 .../common/embed/resources/less/loadmask.less | 74 ++++++++++++++
 apps/documenteditor/embed/index.html          |  6 +-
 apps/documenteditor/embed/index.html.deploy   |  5 -
 apps/documenteditor/embed/index_loader.html   |  6 +-
 .../embed/index_loader.html.deploy            |  5 -
 .../embed/js/ApplicationController.js         | 30 +++---
 build/documenteditor.json                     |  1 +
 10 files changed, 201 insertions(+), 35 deletions(-)
 create mode 100644 apps/common/embed/lib/view/LoadMask.js
 create mode 100644 apps/common/embed/resources/less/loadmask.less

diff --git a/apps/common/embed/lib/util/utils.js b/apps/common/embed/lib/util/utils.js
index 8676bb859..7cddcafc7 100644
--- a/apps/common/embed/lib/util/utils.js
+++ b/apps/common/embed/lib/util/utils.js
@@ -84,6 +84,14 @@
                 _user.group && (_user.fullname = (_user.group).toString() + AscCommon.UserInfoParser.getSeparator() + _user.fullname);
                 _user.guest = !_user.name;
                 return _user;
+            },
+
+            fixedDigits: function(num, digits, fill) {
+                (fill===undefined) && (fill = '0');
+                var strfill = "",
+                    str = num.toString();
+                for (var i=str.length; i<digits; i++) strfill += fill;
+                return strfill + str;
             }
         };
     })();
diff --git a/apps/common/embed/lib/view/LoadMask.js b/apps/common/embed/lib/view/LoadMask.js
new file mode 100644
index 000000000..901114b5a
--- /dev/null
+++ b/apps/common/embed/lib/view/LoadMask.js
@@ -0,0 +1,99 @@
+/*
+ *
+ * (c) Copyright Ascensio System SIA 2010-2021
+ *
+ * This program is a free software product. You can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License (AGPL)
+ * version 3 as published by the Free Software Foundation. In accordance with
+ * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
+ * that Ascensio System SIA expressly excludes the warranty of non-infringement
+ * of any third-party rights.
+ *
+ * This program is distributed WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR  PURPOSE. For
+ * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
+ *
+ * You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
+ * street, Riga, Latvia, EU, LV-1050.
+ *
+ * The  interactive user interfaces in modified source and object code versions
+ * of the Program must display Appropriate Legal Notices, as required under
+ * Section 5 of the GNU AGPL version 3.
+ *
+ * Pursuant to Section 7(b) of the License you must retain the original Product
+ * logo when distributing the program. Pursuant to Section 7(e) we decline to
+ * grant you any rights under trademark law for use of our trademarks.
+ *
+ * All the Product's GUI elements, including illustrations and icon sets, as
+ * well as technical writing content are licensed under the terms of the
+ * Creative Commons Attribution-ShareAlike 4.0 International. See the License
+ * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
+ *
+ */
+/**
+ *  LoadMask.js
+ *
+ *  Displays loading mask over selected element(s) or component. Accepts both single and multiple selectors.
+ *
+ *  Created by Julia Radzhabova 24.06.2021
+ *  Copyright (c) 2021 Ascensio System SIA. All rights reserved.
+ *
+ */
+
+!window.common && (window.common = {});
+!common.view && (common.view = {});
+
+common.view.LoadMask = function(owner) {
+    var tpl = '<div class="asc-loadmask-body" role="presentation" tabindex="-1">' +
+                '<i id="loadmask-spinner" class="asc-loadmask-image"></i>' +
+                '<div class="asc-loadmask-title"></div>' +
+               '</div>';
+    var ownerEl = owner || $(document.body),
+        loaderEl,
+        maskedEl,
+        title = '',
+        timerId = 0,
+        rendered = false;
+    return {
+
+        show: function(){
+            if (!loaderEl || !maskedEl) {
+                loaderEl = $(tpl);
+                maskedEl = $('<div class="asc-loadmask"></div>');
+            }
+
+            $('.asc-loadmask-title', loaderEl).html(title);
+
+            // show mask after 500 ms if it wont be hided
+            if (!rendered) {
+                timerId = setTimeout(function () {
+                    ownerEl.append(maskedEl);
+                    ownerEl.append(loaderEl);
+
+                    loaderEl.css('min-width', $('.asc-loadmask-title', loaderEl).width() + 105);
+                },500);
+            }
+        },
+
+        hide: function() {
+            if (timerId) {
+                clearTimeout(timerId);
+                timerId = 0;
+            }
+            maskedEl && maskedEl.remove();
+            loaderEl && loaderEl.remove();
+            maskedEl = loaderEl = null;
+        },
+
+        setTitle: function(text) {
+            title = text;
+
+            if (ownerEl && loaderEl){
+                var el = $('.asc-loadmask-title', loaderEl);
+                el.html(title);
+                loaderEl.css('min-width', el.width() + 105);
+            }
+        }
+    }
+};
+
diff --git a/apps/common/embed/resources/less/common.less b/apps/common/embed/resources/less/common.less
index 54012b65b..006c2f810 100644
--- a/apps/common/embed/resources/less/common.less
+++ b/apps/common/embed/resources/less/common.less
@@ -53,6 +53,8 @@
 @import "../../../../../vendor/bootstrap/less/responsive-utilities.less";
 
 
+@import "loadmask.less";
+
 @toolbarBorderColor:            #dbdbdb;
 @toolbarBorderShadowColor:      #FAFAFA;
 @toolbarTopColor:               #F7F7F7;
diff --git a/apps/common/embed/resources/less/loadmask.less b/apps/common/embed/resources/less/loadmask.less
new file mode 100644
index 000000000..26d068654
--- /dev/null
+++ b/apps/common/embed/resources/less/loadmask.less
@@ -0,0 +1,74 @@
+@loadmask-zindex: 10000;
+@loadmask-image-height: 28px;
+@loadmask-image-width: 28px;
+@loadmask-small-image-height: 20px;
+@loadmask-small-image-width: 20px;
+@background-loader-ie: fade(#000, 65%);
+@background-loader: fade(#181818, 90%);
+@text-contrast-background-ie: #fff;
+@text-contrast-background: #fff;
+
+.asc-loadmask {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  zoom: 1;
+  background-color: transparent;
+  z-index: @loadmask-zindex;
+}
+
+.asc-loadmask-body {
+  position: absolute;
+  z-index: @loadmask-zindex + 1;
+  padding: 24px;
+  line-height: @loadmask-image-height;
+  border: none;
+  background-image: none;
+  background-color: @background-loader-ie;
+  background-color: @background-loader;
+  color: @text-contrast-background-ie;
+  color: @text-contrast-background;
+  border-radius: 6px;
+
+  left: 50%;
+  top: 50%;
+  transform: translate(-50%);
+
+  & > div {
+    display: inline-block;
+    vertical-align: middle;
+  }
+
+  .asc-loadmask-image {
+    background-image: ~"url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyOCAyOCI+PGNpcmNsZSBjeD0iMTQiIGN5PSIxNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjEuNSIgcj0iMTAuMjUiIHN0cm9rZS1kYXNoYXJyYXk9IjE2MCUsIDQwJSIgLz48L3N2Zz4=)";
+    height: 28px;
+    width: 28px;
+    float: left;
+    margin-left: 8px;
+  }
+
+  .asc-loadmask-title {
+    font-size: 13px;
+    margin: 0 8px 0 12px;
+    white-space: pre-wrap;
+  }
+}
+
+@keyframes rotation {
+  from {
+    transform: rotate(0);
+  }
+
+  to {
+    transform: rotate(360deg);
+  }
+}
+
+#loadmask-spinner {
+  animation-duration: .8s;
+  animation-name: rotation;
+  animation-iteration-count: infinite;
+  animation-timing-function: linear;
+}
diff --git a/apps/documenteditor/embed/index.html b/apps/documenteditor/embed/index.html
index bd9ab347c..ab20ccc1f 100644
--- a/apps/documenteditor/embed/index.html
+++ b/apps/documenteditor/embed/index.html
@@ -222,11 +222,6 @@
           </div>
       </div>
 
-      <div id="id-loadmask" class="hide modal cmd-loader-body">
-          <div class="cmd-loader-image"></div>
-          <div class="cmd-loader-title">Please wait...</div>
-      </div>
-
       <div class="hyperlink-tooltip" data-toggle="tooltip" title="Press Ctrl and click the link" style="display:none;"></div>
 
       <!--vendor-->
@@ -257,6 +252,7 @@
       <script type="text/javascript" src="../../common/Analytics.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/util/LocalStorage.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/util/utils.js"></script>
+      <script type="text/javascript" src="../../common/embed/lib/view/LoadMask.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/view/modals.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/controller/modals.js"></script>
       <script type="text/javascript" src="js/ApplicationView.js"></script>
diff --git a/apps/documenteditor/embed/index.html.deploy b/apps/documenteditor/embed/index.html.deploy
index b2bfd8c2b..c6c09db65 100644
--- a/apps/documenteditor/embed/index.html.deploy
+++ b/apps/documenteditor/embed/index.html.deploy
@@ -214,11 +214,6 @@
           </div>
       </div>
 
-      <div id="id-loadmask" class="hide modal cmd-loader-body">
-          <div class="cmd-loader-image"></div>
-          <div class="cmd-loader-title">Please wait...</div>
-      </div>
-
       <div class="hyperlink-tooltip" data-toggle="tooltip" title="Press Ctrl and click the link" style="display:none;"></div>
 
       <!--vendor-->
diff --git a/apps/documenteditor/embed/index_loader.html b/apps/documenteditor/embed/index_loader.html
index 75cf5466f..938ddb42f 100644
--- a/apps/documenteditor/embed/index_loader.html
+++ b/apps/documenteditor/embed/index_loader.html
@@ -323,11 +323,6 @@
           </div>
       </div>
 
-      <div id="id-loadmask" class="hide modal cmd-loader-body">
-          <div class="cmd-loader-image"></div>
-          <div class="cmd-loader-title">Please wait...</div>
-      </div>
-
       <div class="hyperlink-tooltip" data-toggle="tooltip" title="Press Ctrl and click the link" style="display:none;"></div>
 
       <!--vendor-->
@@ -351,6 +346,7 @@
       <script type="text/javascript" src="../../common/Analytics.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/util/LocalStorage.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/util/utils.js"></script>
+      <script type="text/javascript" src="../../common/embed/lib/view/LoadMask.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/view/modals.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/controller/modals.js"></script>
       <script type="text/javascript" src="js/ApplicationView.js"></script>
diff --git a/apps/documenteditor/embed/index_loader.html.deploy b/apps/documenteditor/embed/index_loader.html.deploy
index 6222ab1b2..29f7ab10c 100644
--- a/apps/documenteditor/embed/index_loader.html.deploy
+++ b/apps/documenteditor/embed/index_loader.html.deploy
@@ -315,11 +315,6 @@
           </div>
       </div>
 
-      <div id="id-loadmask" class="hide modal cmd-loader-body">
-          <div class="cmd-loader-image"></div>
-          <div class="cmd-loader-title">Please wait...</div>
-      </div>
-
       <div class="hyperlink-tooltip" data-toggle="tooltip" title="Press Ctrl and click the link" style="display:none;"></div>
 
       <!--vendor-->
diff --git a/apps/documenteditor/embed/js/ApplicationController.js b/apps/documenteditor/embed/js/ApplicationController.js
index bab462149..ddc3b7363 100644
--- a/apps/documenteditor/embed/js/ApplicationController.js
+++ b/apps/documenteditor/embed/js/ApplicationController.js
@@ -45,6 +45,8 @@ DE.ApplicationController = new(function(){
         btnSubmit,
         _submitFail, $submitedTooltip, $requiredTooltip;
 
+    var LoadingDocument = -256;
+
     // Initialize analytics
     // -------------------------
 
@@ -168,14 +170,19 @@ DE.ApplicationController = new(function(){
                     btnSubmit.attr({disabled: true});
                     btnSubmit.css("pointer-events", "none");
                 break;
+            case LoadingDocument:
+                text = me.textLoadingDocument + '           ';
+                break;
             default:
                 text = me.waitText;
                 break;
         }
 
         if (type == Asc.c_oAscAsyncActionType['BlockInteraction']) {
-            $('#id-loadmask .cmd-loader-title').html(text);
-            showMask();
+            if (!me.loadMask)
+                me.loadMask = new common.view.LoadMask();
+            me.loadMask.setTitle(text);
+            me.loadMask.show();
         }
     }
 
@@ -192,7 +199,7 @@ DE.ApplicationController = new(function(){
                 $submitedTooltip.show();
             }
         }
-        hideMask();
+        me.loadMask && me.loadMask.hide();
     }
 
     function onDocMouseMoveStart() {
@@ -272,6 +279,7 @@ DE.ApplicationController = new(function(){
 
     function onDocumentContentReady() {
         hidePreloader();
+        onLongActionEnd(Asc.c_oAscAsyncActionType['BlockInteraction'], LoadingDocument);
 
         var zf = (config.customization && config.customization.zoom ? parseInt(config.customization.zoom) : -2);
         (zf == -1) ? api.zoomFitToPage() : ((zf == -2) ? api.zoomFitToWidth() : api.zoom(zf>0 ? zf : 100));
@@ -542,24 +550,15 @@ DE.ApplicationController = new(function(){
         else
             $parent.css('padding-right', _left_width - _right_width);
 
+        onLongActionBegin(Asc.c_oAscAsyncActionType['BlockInteraction'], LoadingDocument);
+
         api.asc_LoadDocument();
         api.Resize();
     }
 
-    function showMask() {
-        $('#id-loadmask').modal({
-            backdrop: 'static',
-            keyboard: false
-        });
-    }
-
-    function hideMask() {
-        $('#id-loadmask').modal('hide');
-    }
-
     function onOpenDocument(progress) {
         var proc = (progress.asc_getCurrentFont() + progress.asc_getCurrentImage())/(progress.asc_getFontsCount() + progress.asc_getImagesCount());
-        $('#loadmask-text').html(me.textLoadingDocument + ': ' + Math.min(Math.round(proc * 100), 100) + '%');
+        me.loadMask && me.loadMask.setTitle(me.textLoadingDocument + ': ' + common.utils.fixedDigits(Math.min(Math.round(proc*100), 100), 3, "  ") + '%');
     }
 
     function onError(id, level, errData) {
@@ -574,6 +573,7 @@ DE.ApplicationController = new(function(){
         }
 
         hidePreloader();
+        onLongActionEnd(Asc.c_oAscAsyncActionType['BlockInteraction'], LoadingDocument);
 
         var message;
 
diff --git a/build/documenteditor.json b/build/documenteditor.json
index a220200a8..4af60d759 100644
--- a/build/documenteditor.json
+++ b/build/documenteditor.json
@@ -412,6 +412,7 @@
                 "../apps/common/Analytics.js",
                 "../apps/common/embed/lib/util/LocalStorage.js",
                 "../apps/common/embed/lib/util/utils.js",
+                "../apps/common/embed/lib/view/LoadMask.js",
                 "../apps/common/embed/lib/view/modals.js",
                 "../apps/common/embed/lib/controller/modals.js",
                 "../apps/documenteditor/embed/js/ApplicationView.js",

From 2edcfb779be863f0f061fe8ab31fbed3d23b28bf Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Fri, 25 Jun 2021 00:48:20 +0300
Subject: [PATCH 83/86] [PE embedded][SSE embedded] Show loader mask

---
 apps/common/embed/lib/view/LoadMask.js        |  2 ++
 apps/presentationeditor/embed/index.html      |  6 +---
 .../embed/index.html.deploy                   |  5 ---
 .../embed/index_loader.html                   |  6 +---
 .../embed/index_loader.html.deploy            |  5 ---
 .../embed/js/ApplicationController.js         | 31 +++++++++----------
 apps/spreadsheeteditor/embed/index.html       |  6 +---
 .../spreadsheeteditor/embed/index.html.deploy |  5 ---
 .../spreadsheeteditor/embed/index_loader.html |  6 +---
 .../embed/index_loader.html.deploy            |  5 ---
 .../embed/js/ApplicationController.js         | 31 +++++++++----------
 build/presentationeditor.json                 |  1 +
 build/spreadsheeteditor.json                  |  1 +
 13 files changed, 38 insertions(+), 72 deletions(-)

diff --git a/apps/common/embed/lib/view/LoadMask.js b/apps/common/embed/lib/view/LoadMask.js
index 901114b5a..87f15409b 100644
--- a/apps/common/embed/lib/view/LoadMask.js
+++ b/apps/common/embed/lib/view/LoadMask.js
@@ -66,6 +66,7 @@ common.view.LoadMask = function(owner) {
 
             // show mask after 500 ms if it wont be hided
             if (!rendered) {
+                rendered = true;
                 timerId = setTimeout(function () {
                     ownerEl.append(maskedEl);
                     ownerEl.append(loaderEl);
@@ -83,6 +84,7 @@ common.view.LoadMask = function(owner) {
             maskedEl && maskedEl.remove();
             loaderEl && loaderEl.remove();
             maskedEl = loaderEl = null;
+            rendered = false;
         },
 
         setTitle: function(text) {
diff --git a/apps/presentationeditor/embed/index.html b/apps/presentationeditor/embed/index.html
index b0baf0920..991f9b627 100644
--- a/apps/presentationeditor/embed/index.html
+++ b/apps/presentationeditor/embed/index.html
@@ -273,11 +273,6 @@
           </div>
       </div>
 
-      <div id="id-loadmask" class="hide modal cmd-loader-body">
-          <div class="cmd-loader-image"></div>
-          <div class="cmd-loader-title">Please wait...</div>
-      </div>
-
       <div class="hyperlink-tooltip" data-toggle="tooltip" title="Press Ctrl and click the link" style="display:none;"></div>
 
       <!--vendor-->
@@ -307,6 +302,7 @@
       <script type="text/javascript" src="../../common/Analytics.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/util/LocalStorage.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/util/utils.js"></script>
+      <script type="text/javascript" src="../../common/embed/lib/view/LoadMask.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/view/modals.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/controller/modals.js"></script>
       <script type="text/javascript" src="js/ApplicationView.js"></script>
diff --git a/apps/presentationeditor/embed/index.html.deploy b/apps/presentationeditor/embed/index.html.deploy
index 5db22646c..a3a0347ab 100644
--- a/apps/presentationeditor/embed/index.html.deploy
+++ b/apps/presentationeditor/embed/index.html.deploy
@@ -267,11 +267,6 @@
           </div>
       </div>
 
-      <div id="id-loadmask" class="hide modal cmd-loader-body">
-          <div class="cmd-loader-image"></div>
-          <div class="cmd-loader-title">Please wait...</div>
-      </div>
-
       <div class="hyperlink-tooltip" data-toggle="tooltip" title="Press Ctrl and click the link" style="display:none;"></div>
 
       <!--vendor-->
diff --git a/apps/presentationeditor/embed/index_loader.html b/apps/presentationeditor/embed/index_loader.html
index 5d725ac73..e90de1d35 100644
--- a/apps/presentationeditor/embed/index_loader.html
+++ b/apps/presentationeditor/embed/index_loader.html
@@ -322,11 +322,6 @@
           </div>
       </div>
 
-      <div id="id-loadmask" class="hide modal cmd-loader-body">
-          <div class="cmd-loader-image"></div>
-          <div class="cmd-loader-title">Please wait...</div>
-      </div>
-
       <div class="hyperlink-tooltip" data-toggle="tooltip" title="Press Ctrl and click the link" style="display:none;"></div>
 
       <!--vendor-->
@@ -349,6 +344,7 @@
       <script type="text/javascript" src="../../common/Analytics.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/util/LocalStorage.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/util/utils.js"></script>
+      <script type="text/javascript" src="../../common/embed/lib/view/LoadMask.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/view/modals.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/controller/modals.js"></script>
       <script type="text/javascript" src="js/ApplicationView.js"></script>
diff --git a/apps/presentationeditor/embed/index_loader.html.deploy b/apps/presentationeditor/embed/index_loader.html.deploy
index cb929d1b1..ee5f914c6 100644
--- a/apps/presentationeditor/embed/index_loader.html.deploy
+++ b/apps/presentationeditor/embed/index_loader.html.deploy
@@ -315,11 +315,6 @@
           </div>
       </div>
 
-      <div id="id-loadmask" class="hide modal cmd-loader-body">
-          <div class="cmd-loader-image"></div>
-          <div class="cmd-loader-title">Please wait...</div>
-      </div>
-
       <div class="hyperlink-tooltip" data-toggle="tooltip" title="Press Ctrl and click the link" style="display:none;"></div>
 
       <!--vendor-->
diff --git a/apps/presentationeditor/embed/js/ApplicationController.js b/apps/presentationeditor/embed/js/ApplicationController.js
index 6f4ca8d87..78df5f6a2 100644
--- a/apps/presentationeditor/embed/js/ApplicationController.js
+++ b/apps/presentationeditor/embed/js/ApplicationController.js
@@ -43,6 +43,8 @@ PE.ApplicationController = new(function(){
         ttOffset = [0, -10],
         labelDocName;
 
+    var LoadingDocument = -256;
+
     // Initialize analytics
     // -------------------------
 
@@ -156,19 +158,24 @@ PE.ApplicationController = new(function(){
             case Asc.c_oAscAsyncAction['Print']:
                 text = me.downloadTextText;
                 break;
+            case LoadingDocument:
+                text = me.textLoadingDocument + '           ';
+                break;
             default:
                 text = me.waitText;
                 break;
         }
 
         if (type == Asc.c_oAscAsyncActionType['BlockInteraction']) {
-            $('#id-loadmask .cmd-loader-title').html(text);
-            showMask();
+            if (!me.loadMask)
+                me.loadMask = new common.view.LoadMask();
+            me.loadMask.setTitle(text);
+            me.loadMask.show();
         }
     }
 
     function onLongActionEnd(){
-        hideMask();
+        me.loadMask && me.loadMask.hide();
     }
 
     function onDocMouseMoveStart() {
@@ -244,6 +251,7 @@ PE.ApplicationController = new(function(){
             onPlayStart();
         }
         hidePreloader();
+        onLongActionEnd(Asc.c_oAscAsyncActionType['BlockInteraction'], LoadingDocument);
 
         var zf = (config.customization && config.customization.zoom ? parseInt(config.customization.zoom) : -1);
         (zf == -1) ? api.zoomFitToPage() : ((zf == -2) ? api.zoomFitToWidth() : api.zoom(zf>0 ? zf : 100));
@@ -469,6 +477,7 @@ PE.ApplicationController = new(function(){
         else
             $parent.css('padding-right', _left_width - _right_width);
 
+        onLongActionBegin(Asc.c_oAscAsyncActionType['BlockInteraction'], LoadingDocument);
         api.asc_setViewMode(true);
         api.asc_LoadDocument();
         api.Resize();
@@ -476,7 +485,7 @@ PE.ApplicationController = new(function(){
 
     function onOpenDocument(progress) {
         var proc = (progress.asc_getCurrentFont() + progress.asc_getCurrentImage())/(progress.asc_getFontsCount() + progress.asc_getImagesCount());
-        $('#loadmask-text').html(me.textLoadingDocument + ': ' + Math.min(Math.round(proc * 100), 100) + '%');
+        me.loadMask && me.loadMask.setTitle(me.textLoadingDocument + ': ' + common.utils.fixedDigits(Math.min(Math.round(proc*100), 100), 3, "  ") + '%');
     }
 
     var isplaymode;
@@ -505,17 +514,6 @@ PE.ApplicationController = new(function(){
             $('#page-number').val(number);
     }
 
-    function showMask() {
-        $('#id-loadmask').modal({
-            backdrop: 'static',
-            keyboard: false
-        });
-    }
-
-    function hideMask() {
-        $('#id-loadmask').modal('hide');
-    }
-
     function onError(id, level, errData) {
         if (id == Asc.c_oAscError.ID.LoadingScriptError) {
             $('#id-critical-error-title').text(me.criticalErrorTitle);
@@ -528,7 +526,8 @@ PE.ApplicationController = new(function(){
         }
 
         hidePreloader();
-
+        onLongActionEnd(Asc.c_oAscAsyncActionType['BlockInteraction'], LoadingDocument);
+        
         var message;
 
         switch (id)
diff --git a/apps/spreadsheeteditor/embed/index.html b/apps/spreadsheeteditor/embed/index.html
index a7eb4880a..c21511fc4 100644
--- a/apps/spreadsheeteditor/embed/index.html
+++ b/apps/spreadsheeteditor/embed/index.html
@@ -246,11 +246,6 @@
           </div>
       </div>
 
-      <div id="id-loadmask" class="hide modal cmd-loader-body">
-          <div class="cmd-loader-image"></div>
-          <div class="cmd-loader-title">Please wait...</div>
-      </div>
-
       <div class="hyperlink-tooltip" data-toggle="tooltip" title="Press Ctrl and click the link" style="display:none;"></div>
 
       <!--vendor-->
@@ -283,6 +278,7 @@
       <script type="text/javascript" src="../../common/Analytics.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/util/LocalStorage.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/util/utils.js"></script>
+      <script type="text/javascript" src="../../common/embed/lib/view/LoadMask.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/view/modals.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/controller/modals.js"></script>
       <script type="text/javascript" src="js/ApplicationView.js"></script>
diff --git a/apps/spreadsheeteditor/embed/index.html.deploy b/apps/spreadsheeteditor/embed/index.html.deploy
index 13573b703..50678b73f 100644
--- a/apps/spreadsheeteditor/embed/index.html.deploy
+++ b/apps/spreadsheeteditor/embed/index.html.deploy
@@ -238,11 +238,6 @@
           </div>
       </div>
 
-      <div id="id-loadmask" class="hide modal cmd-loader-body">
-          <div class="cmd-loader-image"></div>
-          <div class="cmd-loader-title">Please wait...</div>
-      </div>
-
       <div class="hyperlink-tooltip" data-toggle="tooltip" title="Press Ctrl and click the link" style="display:none;"></div>
 
       <!--vendor-->
diff --git a/apps/spreadsheeteditor/embed/index_loader.html b/apps/spreadsheeteditor/embed/index_loader.html
index f703fe302..dffe44305 100644
--- a/apps/spreadsheeteditor/embed/index_loader.html
+++ b/apps/spreadsheeteditor/embed/index_loader.html
@@ -321,11 +321,6 @@
           </div>
       </div>
 
-      <div id="id-loadmask" class="hide modal cmd-loader-body">
-          <div class="cmd-loader-image"></div>
-          <div class="cmd-loader-title">Please wait...</div>
-      </div>
-
       <div class="hyperlink-tooltip" data-toggle="tooltip" title="Press Ctrl and click the link" style="display:none;"></div>
 
       <!--vendor-->
@@ -351,6 +346,7 @@
       <script type="text/javascript" src="../../common/Analytics.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/util/LocalStorage.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/util/utils.js"></script>
+      <script type="text/javascript" src="../../common/embed/lib/view/LoadMask.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/view/modals.js"></script>
       <script type="text/javascript" src="../../common/embed/lib/controller/modals.js"></script>
       <script type="text/javascript" src="js/ApplicationView.js"></script>
diff --git a/apps/spreadsheeteditor/embed/index_loader.html.deploy b/apps/spreadsheeteditor/embed/index_loader.html.deploy
index 56166bc85..097125983 100644
--- a/apps/spreadsheeteditor/embed/index_loader.html.deploy
+++ b/apps/spreadsheeteditor/embed/index_loader.html.deploy
@@ -313,11 +313,6 @@
           </div>
       </div>
 
-      <div id="id-loadmask" class="hide modal cmd-loader-body">
-          <div class="cmd-loader-image"></div>
-          <div class="cmd-loader-title">Please wait...</div>
-      </div>
-
       <div class="hyperlink-tooltip" data-toggle="tooltip" title="Press Ctrl and click the link" style="display:none;"></div>
 
       <!--vendor-->
diff --git a/apps/spreadsheeteditor/embed/js/ApplicationController.js b/apps/spreadsheeteditor/embed/js/ApplicationController.js
index e2a5a7031..c2dd584da 100644
--- a/apps/spreadsheeteditor/embed/js/ApplicationController.js
+++ b/apps/spreadsheeteditor/embed/js/ApplicationController.js
@@ -45,6 +45,8 @@ SSE.ApplicationController = new(function(){
         ttOffset = [6, -15],
         labelDocName;
 
+    var LoadingDocument = -256;
+
     // Initialize analytics
     // -------------------------
 
@@ -196,6 +198,7 @@ SSE.ApplicationController = new(function(){
 
     function onDocumentContentReady() {
         hidePreloader();
+        onLongActionEnd(Asc.c_oAscAsyncActionType['BlockInteraction'], LoadingDocument);
 
         if ( permissions.print === false)
             $('#idt-print').hide();
@@ -230,6 +233,7 @@ SSE.ApplicationController = new(function(){
         api.asc_registerCallback('asc_onDownloadUrl',           onDownloadUrl);
         api.asc_registerCallback('asc_onPrint',                 onPrint);
         api.asc_registerCallback('asc_onPrintUrl',              onPrintUrl);
+        api.asc_registerCallback('asc_onStartAction',           onLongActionBegin);
 
         Common.Gateway.on('processmouse',       onProcessMouse);
         Common.Gateway.on('downloadas',         onDownloadAs);
@@ -371,24 +375,14 @@ SSE.ApplicationController = new(function(){
         else
             $parent.css('padding-right', _left_width - _right_width);
 
+        onLongActionBegin(Asc.c_oAscAsyncActionType['BlockInteraction'], LoadingDocument);
         api.asc_setViewMode(true);
         api.asc_LoadDocument();
     }
     
-    function showMask() {
-        $('#id-loadmask').modal({
-            backdrop: 'static',
-            keyboard: false
-        });
-    }
-
-    function hideMask() {
-        $('#id-loadmask').modal('hide');
-    }
-
     function onOpenDocument(progress) {
         var proc = (progress.asc_getCurrentFont() + progress.asc_getCurrentImage())/(progress.asc_getFontsCount() + progress.asc_getImagesCount());
-        $('#loadmask-text').html(me.textLoadingDocument + ': ' + Math.min(Math.round(proc * 100), 100) + '%');
+        me.loadMask && me.loadMask.setTitle(me.textLoadingDocument + ': ' + common.utils.fixedDigits(Math.min(Math.round(proc*100), 100), 3, "  ") + '%');
     }
 
     function onLongActionBegin(type, id){
@@ -398,14 +392,19 @@ SSE.ApplicationController = new(function(){
             case Asc.c_oAscAsyncAction['Print']:
                 text = me.downloadTextText;
                 break;
+            case LoadingDocument:
+                text = me.textLoadingDocument + '           ';
+                break;
             default:
                 text = me.waitText;
                 break;
         }
 
         if (type == Asc.c_oAscAsyncActionType['BlockInteraction']) {
-            $('#id-loadmask .cmd-loader-title').html(text);
-            showMask();
+            if (!me.loadMask)
+                me.loadMask = new common.view.LoadMask();
+            me.loadMask.setTitle(text);
+            me.loadMask.show();
         }
     }
 
@@ -424,7 +423,7 @@ SSE.ApplicationController = new(function(){
                     break;
             }
 
-            hideMask();
+            me.loadMask && me.loadMask.hide();
         }
     }
 
@@ -440,6 +439,7 @@ SSE.ApplicationController = new(function(){
         }
 
         hidePreloader();
+        onLongActionEnd(Asc.c_oAscAsyncActionType['BlockInteraction'], LoadingDocument);
 
         var message;
 
@@ -625,7 +625,6 @@ SSE.ApplicationController = new(function(){
         });
 
         if (api){
-            api.asc_registerCallback('asc_onStartAction',           onLongActionBegin);
             api.asc_registerCallback('asc_onEndAction',             onLongActionEnd);
             api.asc_registerCallback('asc_onError',                 onError);
             api.asc_registerCallback('asc_onOpenDocumentProgress',  onOpenDocument);
diff --git a/build/presentationeditor.json b/build/presentationeditor.json
index ccddf34cd..14f0dd739 100644
--- a/build/presentationeditor.json
+++ b/build/presentationeditor.json
@@ -416,6 +416,7 @@
                 "../apps/common/Analytics.js",
                 "../apps/common/embed/lib/util/LocalStorage.js",
                 "../apps/common/embed/lib/util/utils.js",
+                "../apps/common/embed/lib/view/LoadMask.js",
                 "../apps/common/embed/lib/view/modals.js",
                 "../apps/common/embed/lib/controller/modals.js",
                 "../apps/presentationeditor/embed/js/ApplicationView.js",
diff --git a/build/spreadsheeteditor.json b/build/spreadsheeteditor.json
index 8d3be3fb9..67a466ff3 100644
--- a/build/spreadsheeteditor.json
+++ b/build/spreadsheeteditor.json
@@ -429,6 +429,7 @@
                 "../apps/common/Analytics.js",
                 "../apps/common/embed/lib/util/LocalStorage.js",
                 "../apps/common/embed/lib/util/utils.js",
+                "../apps/common/embed/lib/view/LoadMask.js",
                 "../apps/common/embed/lib/view/modals.js",
                 "../apps/common/embed/lib/controller/modals.js",
                 "../apps/spreadsheeteditor/embed/js/ApplicationView.js",

From 4afe790e0ff76978e7f7ec82f25b705e64659dd1 Mon Sep 17 00:00:00 2001
From: Maxim Kadushkin <maxim.kadushkin@onlyoffice.com>
Date: Fri, 25 Jun 2021 11:03:05 +0300
Subject: [PATCH 84/86] [themes] refactoring

---
 .../lib/controller/ExternalDiagramEditor.js   |  4 +--
 apps/common/main/lib/controller/Themes.js     | 33 ++++++++++++++++---
 apps/common/main/lib/util/htmlutils.js        |  8 ++---
 apps/presentationeditor/main/app.reporter.js  |  2 +-
 .../main/app_dev.reporter.js                  |  2 +-
 5 files changed, 36 insertions(+), 13 deletions(-)

diff --git a/apps/common/main/lib/controller/ExternalDiagramEditor.js b/apps/common/main/lib/controller/ExternalDiagramEditor.js
index 731df5d8d..5c8641012 100644
--- a/apps/common/main/lib/controller/ExternalDiagramEditor.js
+++ b/apps/common/main/lib/controller/ExternalDiagramEditor.js
@@ -56,7 +56,7 @@ define([
 
 
         var createExternalEditor = function() {
-            !!customization && (customization.uiTheme = Common.localStorage.getItem("ui-theme", "theme-light"));
+            !!customization && (customization.uiTheme = Common.localStorage.getItem("ui-theme-id", "theme-light"));
             externalEditor = new DocsAPI.DocEditor('id-diagram-editor-placeholder', {
                 width       : '100%',
                 height      : '100%',
@@ -245,7 +245,7 @@ define([
 
             showExternalEditor: function () {
                 if ( externalEditor ) {
-                    var value = Common.localStorage.getItem("ui-theme", "theme-light");
+                    var value = Common.localStorage.getItem("ui-theme-id", "theme-light");
                     externalEditor.serviceCommand('theme:change', value);
                 }
 
diff --git a/apps/common/main/lib/controller/Themes.js b/apps/common/main/lib/controller/Themes.js
index 1c11545a3..32373d23b 100644
--- a/apps/common/main/lib/controller/Themes.js
+++ b/apps/common/main/lib/controller/Themes.js
@@ -198,18 +198,31 @@ define([
             // get_themes_config('../../common/main/resources/themes/themes.json')
         }
 
+        var get_ui_theme_name = function (objtheme) {
+            if ( typeof(objtheme) == 'string' &&
+                    objtheme.startsWith("{") && objtheme.endsWith("}") )
+            {
+                objtheme = JSON.parse(objtheme);
+            }
+
+            if ( objtheme && typeof(objtheme) == 'object' )
+                return objtheme.id;
+
+            return objtheme;
+        }
+
         return {
             init: function (api) {
                 var me = this;
 
                 $(window).on('storage', function (e) {
-                    if ( e.key == 'ui-theme' ) {
+                    if ( e.key == 'ui-theme' || e.key == 'ui-theme-id' ) {
                         me.setTheme(e.originalEvent.newValue);
                     }
                 })
 
                 this.api = api;
-                var theme_name = Common.localStorage.getItem('ui-theme');
+                var theme_name = get_ui_theme_name(Common.localStorage.getItem('ui-theme'));
                 if ( !themes_map[theme_name] )
                     theme_name = id_default_light_theme;
 
@@ -242,7 +255,7 @@ define([
             },
 
             currentThemeId: function () {
-                return Common.localStorage.getItem('ui-theme') || id_default_light_theme;
+                return get_ui_theme_name(Common.localStorage.getItem('ui-theme')) || id_default_light_theme;
             },
 
             defaultThemeId: function (type) {
@@ -257,7 +270,8 @@ define([
                 return themes_map[this.currentThemeId()].type == 'dark';
             },
 
-            setTheme: function (id, force) {
+            setTheme: function (obj, force) {
+                var id = get_ui_theme_name(obj);
                 if ( (this.currentThemeId() != id || force) && !!themes_map[id] ) {
                     var classname = document.body.className.replace(/theme-\w+\s?/, '');
                     document.body.className = classname;
@@ -270,7 +284,16 @@ define([
 
                     this.api.asc_setSkin(obj);
 
-                    Common.localStorage.setItem('ui-theme', id);
+                    if ( !(Common.Utils.isIE10 || Common.Utils.isIE11) ) {
+                        var theme_obj = {
+                            id: id,
+                            type: obj.type,
+                        };
+
+                        Common.localStorage.setItem('ui-theme', JSON.stringify(theme_obj));
+                    }
+
+                    Common.localStorage.setItem('ui-theme-id', id);
                     Common.NotificationCenter.trigger('uitheme:changed', id);
                 }
             },
diff --git a/apps/common/main/lib/util/htmlutils.js b/apps/common/main/lib/util/htmlutils.js
index 7d5b0161b..9277da26f 100644
--- a/apps/common/main/lib/util/htmlutils.js
+++ b/apps/common/main/lib/util/htmlutils.js
@@ -32,7 +32,7 @@ var params = (function() {
     return urlParams;
 })();
 
-if ( !!params.uitheme && !localStorage.getItem("ui-theme") ) {
+if ( !!params.uitheme && !localStorage.getItem("ui-theme-id") ) {
     // const _t = params.uitheme.match(/([\w-]+)/g);
 
     if ( params.uitheme == 'default-dark' )
@@ -41,14 +41,14 @@ if ( !!params.uitheme && !localStorage.getItem("ui-theme") ) {
     if ( params.uitheme == 'default-light' )
         params.uitheme = 'theme-classic-light';
 
-    localStorage.setItem("ui-theme", params.uitheme);
+    localStorage.setItem("ui-theme-id", params.uitheme);
 }
 
-var ui_theme_name = localStorage.getItem("ui-theme");
+var ui_theme_name = localStorage.getItem("ui-theme-id");
 if ( !ui_theme_name ) {
     if ( window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ) {
         ui_theme_name = 'theme-dark';
-        localStorage.setItem("ui-theme", ui_theme_name);
+        localStorage.setItem("ui-theme-id", ui_theme_name);
     }
 }
 if ( !!ui_theme_name ) {
diff --git a/apps/presentationeditor/main/app.reporter.js b/apps/presentationeditor/main/app.reporter.js
index 0c69433aa..bfbc78e32 100644
--- a/apps/presentationeditor/main/app.reporter.js
+++ b/apps/presentationeditor/main/app.reporter.js
@@ -93,7 +93,7 @@ require([
     var api = new Asc.asc_docs_api({
         'id-view'  : 'editor_sdk',
         using      : 'reporter',
-        skin       : localStorage.getItem("ui-theme")
+        skin       : localStorage.getItem("ui-theme-id")
     });
 
     var setDocumentTitle = function(title) {
diff --git a/apps/presentationeditor/main/app_dev.reporter.js b/apps/presentationeditor/main/app_dev.reporter.js
index 77687a322..1a2cc0821 100644
--- a/apps/presentationeditor/main/app_dev.reporter.js
+++ b/apps/presentationeditor/main/app_dev.reporter.js
@@ -94,7 +94,7 @@ require([
     var api = new Asc.asc_docs_api({
         'id-view'  : 'editor_sdk',
         using      : 'reporter',
-        skin       : localStorage.getItem("ui-theme")
+        skin       : localStorage.getItem("ui-theme-id")
     });
 
     var setDocumentTitle = function(title) {

From 88c62da5f615f34917105013e7c0f0e286638f06 Mon Sep 17 00:00:00 2001
From: Maxim Kadushkin <maxim.kadushkin@onlyoffice.com>
Date: Fri, 25 Jun 2021 11:29:11 +0300
Subject: [PATCH 85/86] [common] refactoring

---
 apps/common/main/lib/util/utils.js | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/apps/common/main/lib/util/utils.js b/apps/common/main/lib/util/utils.js
index e230a013d..ec6f0c975 100644
--- a/apps/common/main/lib/util/utils.js
+++ b/apps/common/main/lib/util/utils.js
@@ -797,10 +797,12 @@ Common.Utils.getConfigJson = function (url) {
 };
 
 Common.Utils.loadConfig = function(url, callback) {
-    "use strict";
-
-    fetch(url)
-        .then(function(response){
+    fetch(url, {
+            method: 'get',
+            headers: {
+                'Accept': 'application/json',
+            },
+        }).then(function(response){
             if ( response.ok )
                 return response.json();
             else return 'error';

From d484103500dba6cda2b4c6477fbdf01d86f932fe Mon Sep 17 00:00:00 2001
From: Maxim Kadushkin <maxim.kadushkin@onlyoffice.com>
Date: Fri, 25 Jun 2021 11:53:43 +0300
Subject: [PATCH 86/86] [themes] load external themes

---
 apps/common/main/lib/controller/Themes.js     | 76 ++++++++++++-------
 apps/common/main/lib/util/themeinit.js        | 28 +++++++
 .../main/resources/themes/classic-light.json  | 20 +++++
 apps/common/main/resources/themes/themes.json |  5 ++
 apps/documenteditor/main/index.html           |  1 +
 5 files changed, 104 insertions(+), 26 deletions(-)
 create mode 100644 apps/common/main/lib/util/themeinit.js
 create mode 100644 apps/common/main/resources/themes/classic-light.json
 create mode 100644 apps/common/main/resources/themes/themes.json

diff --git a/apps/common/main/lib/controller/Themes.js b/apps/common/main/lib/controller/Themes.js
index 32373d23b..c43c88411 100644
--- a/apps/common/main/lib/controller/Themes.js
+++ b/apps/common/main/lib/controller/Themes.js
@@ -12,21 +12,34 @@ define([
         var themes_map = {
             'theme-light': {
                 text: locale.txtThemeLight || 'Light',
-                type: 'light'
+                type: 'light',
+                source: 'static',
             },
             'theme-classic-light': {
                 text: locale.txtThemeClassicLight || 'Classic Light',
-                type: 'light'
+                type: 'light',
+                source: 'static',
             },
             'theme-dark': {
                 text: locale.txtThemeDark || 'Dark',
-                type: 'dark'
+                type: 'dark',
+                source: 'static',
             },
         }
+
+        if ( !!window.currentLoaderTheme ) {
+            themes_map[currentLoaderTheme.id] = {};
+            window.currentLoaderTheme = undefined;
+        }
+
         var id_default_light_theme = 'theme-classic-light',
             id_default_dark_theme = 'theme-dark';
 
         var name_colors = [
+            "toolbar-header-document",
+            "toolbar-header-spreadsheet",
+            "toolbar-header-presentation",
+
             "background-normal",
             "background-toolbar",
             "background-toolbar-additional",
@@ -169,33 +182,40 @@ define([
         }
 
         var get_themes_config = function (url) {
-            fetch(url, {
-                method: 'get',
-                headers: {
-                    'Accept': 'application/json',
-                },
-            }).then(function(response) {
-                if (!response.ok) {
-                    throw new Error('server error');
+            Common.Utils.loadConfig(url,
+                function ( obj ) {
+                    if ( obj != 'error' ) {
+                        parse_themes_object(obj);
+                    }
                 }
-                return response.json();
-            }).then(function(response) {
-                if ( response.then ) {
-                    // return response.json();
-                } else {
-                    parse_themes_object(response);
-
-                    /* to break promises chain */
-                    throw new Error('loaded');
-                }
-            }).catch(function(e) {
-                if ( e.message == 'loaded' ) {
-                } else console.log('fetch error: ' + e);
-            });
+            );
+            // fetch(url, {
+            //     method: 'get',
+            //     headers: {
+            //         'Accept': 'application/json',
+            //     },
+            // }).then(function(response) {
+            //     if (!response.ok) {
+            //         throw new Error('server error');
+            //     }
+            //     return response.json();
+            // }).then(function(response) {
+            //     if ( response.then ) {
+            //         // return response.json();
+            //     } else {
+            //         parse_themes_object(response);
+            //
+            //         /* to break promises chain */
+            //         throw new Error('loaded');
+            //     }
+            // }).catch(function(e) {
+            //     if ( e.message == 'loaded' ) {
+            //     } else console.log('fetch error: ' + e);
+            // });
         }
 
         var on_document_ready = function (el) {
-            // get_themes_config('../../common/main/resources/themes/themes.json')
+            get_themes_config('../../common/main/resources/themes/themes.json');
         }
 
         var get_ui_theme_name = function (objtheme) {
@@ -290,6 +310,10 @@ define([
                             type: obj.type,
                         };
 
+                        if ( themes_map[id].source != 'static' ) {
+                            theme_obj.colors = obj;
+                        }
+
                         Common.localStorage.setItem('ui-theme', JSON.stringify(theme_obj));
                     }
 
diff --git a/apps/common/main/lib/util/themeinit.js b/apps/common/main/lib/util/themeinit.js
new file mode 100644
index 000000000..6b3ea3839
--- /dev/null
+++ b/apps/common/main/lib/util/themeinit.js
@@ -0,0 +1,28 @@
+
++function init_themes() {
+    var objtheme = localStorage.getItem("ui-theme");
+    if ( typeof(objtheme) == 'string' &&
+            objtheme.startsWith("{") && objtheme.endsWith("}") )
+    {
+        objtheme = JSON.parse(objtheme);
+    }
+
+    var ui_theme_name = objtheme && typeof(objtheme) == 'object' ? objtheme.id :
+        typeof(objtheme) == 'string' ? objtheme : localStorage.getItem("ui-theme-id");
+
+    if ( !!ui_theme_name ) {
+        if ( !!objtheme && !!objtheme.colors ) {
+            var colors = [];
+            for ( var c in objtheme.colors ) {
+                colors.push('--' + c + ':' + objtheme.colors[c]);
+            }
+
+            var style = document.createElement('style');
+            style.type = 'text/css';
+            style.innerHTML = '.' + ui_theme_name + '{'+ colors.join(';') +';}';
+            document.getElementsByTagName('head')[0].appendChild(style);
+
+            window.currentLoaderTheme = objtheme;
+        }
+    }
+}();
\ No newline at end of file
diff --git a/apps/common/main/resources/themes/classic-light.json b/apps/common/main/resources/themes/classic-light.json
new file mode 100644
index 000000000..deb591dca
--- /dev/null
+++ b/apps/common/main/resources/themes/classic-light.json
@@ -0,0 +1,20 @@
+{
+        "name": "Classic Light 2",
+        "id": "theme-classic-light2",
+        "type": "light",
+        "colors": {
+            "toolbar-header-document": "#446995",
+            "toolbar-header-spreadsheet": "#40865c",
+            "toolbar-header-presentation": "#aa5252",
+
+            "background-normal": "#f00",
+            "background-toolbar": "#f100f1",
+            "background-toolbar-additional": "#f100f1",
+            "background-primary-dialog-button": "#7d858c",
+            "background-tab-underline": "#444",
+            "background-notification-popover": "#fcfed7",
+            "background-notification-badge": "#ffd112",
+            "background-scrim": "rgba(0,0,0, 0.2)",
+            "background-loader": "rgba(0,0,0, .65)"
+        }
+}
\ No newline at end of file
diff --git a/apps/common/main/resources/themes/themes.json b/apps/common/main/resources/themes/themes.json
new file mode 100644
index 000000000..3e8afe8db
--- /dev/null
+++ b/apps/common/main/resources/themes/themes.json
@@ -0,0 +1,5 @@
+{
+    "themes": [
+        "../../common/main/resources/themes/classic-light.json"
+    ]
+}
\ No newline at end of file
diff --git a/apps/documenteditor/main/index.html b/apps/documenteditor/main/index.html
index 0f0757a29..d6b135425 100644
--- a/apps/documenteditor/main/index.html
+++ b/apps/documenteditor/main/index.html
@@ -242,6 +242,7 @@
         if(/MSIE \d|Trident.*rv:/.test(navigator.userAgent))
             document.write('<script src="../../common/main/lib/util/fix-ie-compat.js"><\/script>');
     </script>
+    <script src="../../common/main/lib/util/themeinit.js"></script>
 
     <!-- debug begin -->
     <link rel="stylesheet/less" type="text/css" href="resources/less/app.less" />