Merge branch 'feature/load-external-themes' into develop
This commit is contained in:
		
						commit
						bae484e6a4
					
				| 
						 | 
				
			
			@ -866,7 +866,8 @@
 | 
			
		|||
        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 && config.document.permissions && (config.document.permissions.fillForms===true) &&
 | 
			
		||||
                                                                       (config.document.permissions.edit === false) && (config.document.permissions.review !== true) && (config.editorConfig.mode !== 'view'))
 | 
			
		||||
                ? "embed"
 | 
			
		||||
                : "main";
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
    })();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										101
									
								
								apps/common/embed/lib/view/LoadMask.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								apps/common/embed/lib/view/LoadMask.js
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,101 @@
 | 
			
		|||
/*
 | 
			
		||||
 *
 | 
			
		||||
 * (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) {
 | 
			
		||||
                rendered = true;
 | 
			
		||||
                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;
 | 
			
		||||
            rendered = false;
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        setTitle: function(text) {
 | 
			
		||||
            title = text;
 | 
			
		||||
 | 
			
		||||
            if (ownerEl && loaderEl){
 | 
			
		||||
                var el = $('.asc-loadmask-title', loaderEl);
 | 
			
		||||
                el.html(title);
 | 
			
		||||
                loaderEl.css('min-width', el.width() + 105);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -53,6 +53,8 @@
 | 
			
		|||
@import "../../../../../vendor/bootstrap/less/responsive-utilities.less";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@import "loadmask.less";
 | 
			
		||||
 | 
			
		||||
@toolbarBorderColor:            #dbdbdb;
 | 
			
		||||
@toolbarBorderShadowColor:      #FAFAFA;
 | 
			
		||||
@toolbarTopColor:               #F7F7F7;
 | 
			
		||||
| 
						 | 
				
			
			@ -683,9 +685,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 {
 | 
			
		||||
| 
						 | 
				
			
			@ -712,4 +718,64 @@
 | 
			
		|||
    -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;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.tooltip {
 | 
			
		||||
    .tooltip-inner {
 | 
			
		||||
        .toolbar & {
 | 
			
		||||
            font-weight: normal;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										74
									
								
								apps/common/embed/resources/less/loadmask.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								apps/common/embed/resources/less/loadmask.less
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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}));
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,53 @@ 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) {
 | 
			
		||||
            if ( typeof(objtheme) == 'string' &&
 | 
			
		||||
                    objtheme.startsWith("{") && objtheme.endsWith("}") )
 | 
			
		||||
            {
 | 
			
		||||
                objtheme = JSON.parse(objtheme);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if ( objtheme && typeof(objtheme) == 'object' )
 | 
			
		||||
                return objtheme.id;
 | 
			
		||||
 | 
			
		||||
            return objtheme;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return {
 | 
			
		||||
| 
						 | 
				
			
			@ -203,13 +236,13 @@ define([
 | 
			
		|||
                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 +275,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 +290,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 +304,20 @@ 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,
 | 
			
		||||
                        };
 | 
			
		||||
 | 
			
		||||
                        if ( themes_map[id].source != 'static' ) {
 | 
			
		||||
                            theme_obj.colors = obj;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        Common.localStorage.setItem('ui-theme', JSON.stringify(theme_obj));
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    Common.localStorage.setItem('ui-theme-id', id);
 | 
			
		||||
                    Common.NotificationCenter.trigger('uitheme:changed', id);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 ) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										28
									
								
								apps/common/main/lib/util/themeinit.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								apps/common/main/lib/util/themeinit.js
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}();
 | 
			
		||||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
})();
 | 
			
		||||
| 
						 | 
				
			
			@ -789,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';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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>'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 213 B After Width: | Height: | Size: 367 B  | 
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 577 B After Width: | Height: | Size: 546 B  | 
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 513 B After Width: | Height: | Size: 977 B  | 
| 
						 | 
				
			
			@ -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 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,6 +49,7 @@
 | 
			
		|||
    .asc-loadmask-title {
 | 
			
		||||
        .fontsize(@font-size-large);
 | 
			
		||||
        margin: 0 8px 0 12px;
 | 
			
		||||
        white-space: pre-wrap;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .left-panel & {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										20
									
								
								apps/common/main/resources/themes/classic-light.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								apps/common/main/resources/themes/classic-light.json
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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)"
 | 
			
		||||
        }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										5
									
								
								apps/common/main/resources/themes/themes.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								apps/common/main/resources/themes/themes.json
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
{
 | 
			
		||||
    "themes": [
 | 
			
		||||
        "../../common/main/resources/themes/classic-light.json"
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
        };
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -46,7 +44,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 +65,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 +121,8 @@ const PluginsController = inject('storeAppOptions')(observer(props => {
 | 
			
		|||
    };
 | 
			
		||||
 | 
			
		||||
    const pluginClose = plugin => {
 | 
			
		||||
        if (iframe) {
 | 
			
		||||
            iframe = null;
 | 
			
		||||
        if (plugin) {
 | 
			
		||||
            modal.close();
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 **/
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -98,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++) {
 | 
			
		||||
| 
						 | 
				
			
			@ -582,7 +588,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)));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -51,6 +61,7 @@ export class storeComments {
 | 
			
		|||
        if (index !== -1) {
 | 
			
		||||
            collection.splice(index, 1);
 | 
			
		||||
        }
 | 
			
		||||
        this.removeShowComment(id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    changeComment (id, changeComment) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			@ -760,13 +759,20 @@ 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);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    if(!comment) {
 | 
			
		||||
        if (comments.length > 0) {
 | 
			
		||||
            onViewNextComment();
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        <Fragment>
 | 
			
		||||
            <Toolbar position='bottom'>
 | 
			
		||||
| 
						 | 
				
			
			@ -779,77 +785,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}) => {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -212,6 +212,8 @@
 | 
			
		|||
 | 
			
		||||
.dialog.modal-in {
 | 
			
		||||
  z-index: 14000;
 | 
			
		||||
  max-height: 100%;
 | 
			
		||||
  overflow: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.dialog-backdrop.backdrop-in {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -560,4 +560,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;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 {
 | 
			
		||||
| 
						 | 
				
			
			@ -493,4 +507,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;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -196,6 +196,9 @@
 | 
			
		|||
        display: flex;
 | 
			
		||||
        flex-wrap: wrap;
 | 
			
		||||
        justify-content: space-around;
 | 
			
		||||
        &::before, &::after {
 | 
			
		||||
            display: none;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    li {
 | 
			
		||||
        position: relative;
 | 
			
		||||
| 
						 | 
				
			
			@ -784,9 +787,6 @@ input[type="number"]::-webkit-inner-spin-button {
 | 
			
		|||
            padding: 0;
 | 
			
		||||
            text-align: left;
 | 
			
		||||
            font-size: 16px;
 | 
			
		||||
            span {
 | 
			
		||||
                padding: 0;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    .picker-center-highlight {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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>');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -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>');
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			@ -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-->
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			@ -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-->
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,7 +43,9 @@ DE.ApplicationController = new(function(){
 | 
			
		|||
        labelDocName,
 | 
			
		||||
        appOptions = {},
 | 
			
		||||
        btnSubmit,
 | 
			
		||||
        _submitFail, $submitedTooltip;
 | 
			
		||||
        _submitFail, $submitedTooltip, $requiredTooltip;
 | 
			
		||||
 | 
			
		||||
    var LoadingDocument = -256;
 | 
			
		||||
 | 
			
		||||
    // Initialize analytics
 | 
			
		||||
    // -------------------------
 | 
			
		||||
| 
						 | 
				
			
			@ -166,6 +168,10 @@ DE.ApplicationController = new(function(){
 | 
			
		|||
                    _submitFail = false;
 | 
			
		||||
                    $submitedTooltip && $submitedTooltip.hide();
 | 
			
		||||
                    btnSubmit.attr({disabled: true});
 | 
			
		||||
                    btnSubmit.css("pointer-events", "none");
 | 
			
		||||
                break;
 | 
			
		||||
            case LoadingDocument:
 | 
			
		||||
                text = me.textLoadingDocument + '           ';
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                text = me.waitText;
 | 
			
		||||
| 
						 | 
				
			
			@ -173,22 +179,27 @@ DE.ApplicationController = new(function(){
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        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(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();});
 | 
			
		||||
            btnSubmit.css("pointer-events", "auto");
 | 
			
		||||
            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();
 | 
			
		||||
        me.loadMask && me.loadMask.hide();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function onDocMouseMoveStart() {
 | 
			
		||||
| 
						 | 
				
			
			@ -251,12 +262,24 @@ DE.ApplicationController = new(function(){
 | 
			
		|||
        common.utils.dialogPrint(url, api);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function hidePreloader() {
 | 
			
		||||
        $('#loading-mask').fadeOut('slow');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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));
 | 
			
		||||
| 
						 | 
				
			
			@ -326,6 +349,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('sync_onAllRequiredFormsFilled', onFillRequiredFields);
 | 
			
		||||
 | 
			
		||||
        Common.Gateway.on('processmouse',       onProcessMouse);
 | 
			
		||||
        Common.Gateway.on('downloadas',         onDownloadAs);
 | 
			
		||||
| 
						 | 
				
			
			@ -406,6 +430,37 @@ DE.ApplicationController = new(function(){
 | 
			
		|||
            $pagenum.focus();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // TODO: add asc_hasRequiredFields to sdk
 | 
			
		||||
 | 
			
		||||
        if (appOptions.canSubmitForms && !api.asc_IsAllRequiredFormsFilled()) {
 | 
			
		||||
            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>');
 | 
			
		||||
                $(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();
 | 
			
		||||
                    api.asc_MoveToFillingForm(true, true, true);
 | 
			
		||||
                    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'
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        var documentMoveTimer;
 | 
			
		||||
        var ismoved = false;
 | 
			
		||||
        $(document).mousemove(function(event){
 | 
			
		||||
| 
						 | 
				
			
			@ -495,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) {
 | 
			
		||||
| 
						 | 
				
			
			@ -527,6 +573,7 @@ DE.ApplicationController = new(function(){
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        hidePreloader();
 | 
			
		||||
        onLongActionEnd(Asc.c_oAscAsyncActionType['BlockInteraction'], LoadingDocument);
 | 
			
		||||
 | 
			
		||||
        var message;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -757,6 +804,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'
 | 
			
		||||
    }
 | 
			
		||||
})();
 | 
			
		||||
| 
						 | 
				
			
			@ -21,10 +21,12 @@
 | 
			
		|||
  "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",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
        },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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');
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 || {}));
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			@ -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',
 | 
			
		||||
| 
						 | 
				
			
			@ -2130,7 +2125,7 @@ define([
 | 
			
		|||
                        schemecolors.push(clr);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (index == 21) {
 | 
			
		||||
                    if (index == 22) {
 | 
			
		||||
                        this.mnuColorSchema.addItem({
 | 
			
		||||
                            caption: '--'
 | 
			
		||||
                        });
 | 
			
		||||
| 
						 | 
				
			
			@ -2140,7 +2135,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 +2466,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 || {}));
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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" />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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",
 | 
			
		||||
| 
						 | 
				
			
			@ -2721,6 +2722,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",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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?",
 | 
			
		||||
| 
						 | 
				
			
			@ -136,14 +134,14 @@
 | 
			
		|||
  },
 | 
			
		||||
  "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"
 | 
			
		||||
  },
 | 
			
		||||
  "Common": {
 | 
			
		||||
    "ThemeColorPalette": {
 | 
			
		||||
      "textThemeColors": "Theme Colors",
 | 
			
		||||
      "textStandartColors": "Standart Colors",
 | 
			
		||||
      "textStandartColors": "Standard Colors",
 | 
			
		||||
      "textCustomColors": "Custom Colors"
 | 
			
		||||
    },
 | 
			
		||||
    "Collaboration": {
 | 
			
		||||
| 
						 | 
				
			
			@ -331,6 +329,8 @@
 | 
			
		|||
    "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",
 | 
			
		||||
    "txtIncorrectPwd": "Password is incorrect",
 | 
			
		||||
    "textNoTextFound": "Text not found",
 | 
			
		||||
    "textReplace": "Replace",
 | 
			
		||||
    "textReplaceAll": "Replace All",
 | 
			
		||||
| 
						 | 
				
			
			@ -466,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\"",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -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));
 | 
			
		||||
| 
						 | 
				
			
			@ -607,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;
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 });
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -15,14 +15,14 @@ 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();
 | 
			
		||||
            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);
 | 
			
		||||
| 
						 | 
				
			
			@ -35,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);
 | 
			
		||||
| 
						 | 
				
			
			@ -47,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);
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -76,7 +80,7 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeReview')(prop
 | 
			
		|||
                    {
 | 
			
		||||
                        text: _t.leaveButtonText,
 | 
			
		||||
                        onClick: function() {
 | 
			
		||||
                            goBack();
 | 
			
		||||
                            goBack(true);
 | 
			
		||||
                        }
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
| 
						 | 
				
			
			@ -86,7 +90,7 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeReview')(prop
 | 
			
		|||
                ]
 | 
			
		||||
            }).open();
 | 
			
		||||
        } else {
 | 
			
		||||
            goBack();
 | 
			
		||||
            goBack(true);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    const goBack = (current) => {
 | 
			
		||||
| 
						 | 
				
			
			@ -161,20 +165,15 @@ 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);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const onEditDocument = () => {
 | 
			
		||||
        Common.Gateway.requestEditRights();
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        <ToolbarView openOptions={props.openOptions}
 | 
			
		||||
                     isEdit={appOptions.isEdit}
 | 
			
		||||
| 
						 | 
				
			
			@ -192,8 +191,11 @@ const ToolbarController = inject('storeAppOptions', 'users', 'storeReview')(prop
 | 
			
		|||
                     disabledSettings={disabledSettings}
 | 
			
		||||
                     displayCollaboration={displayCollaboration}
 | 
			
		||||
                     readerMode={readerMode}
 | 
			
		||||
                     showEditDocument={showEditDocument}
 | 
			
		||||
                     onEditDocument={onEditDocument}
 | 
			
		||||
                     isDisconnected={isDisconnected}
 | 
			
		||||
        />
 | 
			
		||||
    )
 | 
			
		||||
});
 | 
			
		||||
}));
 | 
			
		||||
 | 
			
		||||
export {ToolbarController as Toolbar};
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +1,13 @@
 | 
			
		|||
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);
 | 
			
		||||
        this.props.storeApplicationSettings.changeUnitMeasurement(Common.Utils.Metric.getCurrentMetric());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setUnitMeasurement(value) {
 | 
			
		||||
| 
						 | 
				
			
			@ -34,6 +36,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 +46,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 +78,4 @@ class ApplicationSettingsController extends Component {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export default ApplicationSettingsController;
 | 
			
		||||
export default inject("storeAppOptions", "storeApplicationSettings")(observer(ApplicationSettingsController));
 | 
			
		||||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			@ -32,19 +33,21 @@ 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));
 | 
			
		||||
                            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();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -57,7 +60,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();
 | 
			
		||||
| 
						 | 
				
			
			@ -70,7 +73,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,7 +125,7 @@ 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,
 | 
			
		||||
| 
						 | 
				
			
			@ -134,6 +137,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,
 | 
			
		||||
| 
						 | 
				
			
			@ -143,9 +157,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();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 :
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,12 @@ export class storeAppOptions {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    isEdit = false;
 | 
			
		||||
 | 
			
		||||
    canViewComments = false;
 | 
			
		||||
    changeCanViewComments(value) {
 | 
			
		||||
        this.canViewComments = value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    canReview = false;
 | 
			
		||||
    canViewReview = false;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -80,7 +85,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 +97,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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -74,6 +74,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) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
                })}
 | 
			
		||||
| 
						 | 
				
			
			@ -24,6 +25,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'),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 key='break' 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 key='footnote' 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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -198,7 +198,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>
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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-->
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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-->
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 || {}));
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -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) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,6 +27,9 @@
 | 
			
		|||
      "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",
 | 
			
		||||
      "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.",
 | 
			
		||||
| 
						 | 
				
			
			@ -129,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",
 | 
			
		||||
| 
						 | 
				
			
			@ -137,11 +143,13 @@
 | 
			
		|||
    "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",
 | 
			
		||||
    "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"
 | 
			
		||||
  },
 | 
			
		||||
| 
						 | 
				
			
			@ -210,7 +218,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\"",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -111,12 +111,62 @@ 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();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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",
 | 
			
		||||
| 
						 | 
				
			
			@ -152,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();
 | 
			
		||||
| 
						 | 
				
			
			@ -292,10 +293,13 @@ 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));
 | 
			
		||||
        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));
 | 
			
		||||
| 
						 | 
				
			
			@ -305,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);
 | 
			
		||||
        });
 | 
			
		||||
| 
						 | 
				
			
			@ -585,12 +593,11 @@ 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',
 | 
			
		||||
                bold: true,
 | 
			
		||||
                close: false,
 | 
			
		||||
                onClick: () => {
 | 
			
		||||
                    const password = document.getElementById('modal-password').value;
 | 
			
		||||
                    this.api.asc_setAdvancedOptions(type, new Asc.asc_CDRMAdvancedOptions(password));
 | 
			
		||||
| 
						 | 
				
			
			@ -600,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,
 | 
			
		||||
| 
						 | 
				
			
			@ -610,14 +628,13 @@ 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();
 | 
			
		||||
            this.isDRM = true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 });
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -12,15 +12,15 @@ 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();
 | 
			
		||||
            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);
 | 
			
		||||
| 
						 | 
				
			
			@ -33,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);
 | 
			
		||||
| 
						 | 
				
			
			@ -45,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);
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
| 
						 | 
				
			
			@ -75,7 +79,7 @@ const ToolbarController = inject('storeAppOptions', 'users')(props => {
 | 
			
		|||
                    {
 | 
			
		||||
                        text: _t.leaveButtonText,
 | 
			
		||||
                        onClick: function() {
 | 
			
		||||
                            goBack();
 | 
			
		||||
                            goBack(true);
 | 
			
		||||
                        }
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
| 
						 | 
				
			
			@ -85,7 +89,7 @@ const ToolbarController = inject('storeAppOptions', 'users')(props => {
 | 
			
		|||
                ]
 | 
			
		||||
            }).open();
 | 
			
		||||
        } else {
 | 
			
		||||
            goBack();
 | 
			
		||||
            goBack(true);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    const goBack = (current) => {
 | 
			
		||||
| 
						 | 
				
			
			@ -176,13 +180,8 @@ 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();
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
| 
						 | 
				
			
			@ -202,8 +201,11 @@ const ToolbarController = inject('storeAppOptions', 'users')(props => {
 | 
			
		|||
                     disabledEditControls={disabledEditControls}
 | 
			
		||||
                     disabledSettings={disabledSettings}
 | 
			
		||||
                     displayCollaboration={displayCollaboration}
 | 
			
		||||
                     showEditDocument={showEditDocument}
 | 
			
		||||
                     onEditDocument={onEditDocument}
 | 
			
		||||
                     isDisconnected={isDisconnected}
 | 
			
		||||
        />
 | 
			
		||||
    )
 | 
			
		||||
});
 | 
			
		||||
}));
 | 
			
		||||
 | 
			
		||||
export {ToolbarController as Toolbar};
 | 
			
		||||
| 
						 | 
				
			
			@ -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";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,12 @@
 | 
			
		|||
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.props.storeApplicationSettings.changeUnitMeasurement(Common.Utils.Metric.getCurrentMetric());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setUnitMeasurement(value) {
 | 
			
		||||
| 
						 | 
				
			
			@ -37,4 +39,4 @@ class ApplicationSettingsController extends Component {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export default ApplicationSettingsController;
 | 
			
		||||
export default inject("storeApplicationSettings")(observer(ApplicationSettingsController));
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
		Reference in a new issue