Merge pull request #1697 from ONLYOFFICE/feature/add-theme-system
Feature/add theme system
This commit is contained in:
		
						commit
						97c461c555
					
				| 
						 | 
				
			
			@ -11,7 +11,16 @@ define([
 | 
			
		|||
    
 | 
			
		||||
    Common.UI.Themes = new (function(locale) {
 | 
			
		||||
        !locale && (locale = {});
 | 
			
		||||
 | 
			
		||||
        const THEME_TYPE_LIGHT = 'light';
 | 
			
		||||
        const THEME_TYPE_DARK = 'dark';
 | 
			
		||||
        const THEME_TYPE_SYSTEM = 'system';
 | 
			
		||||
        var themes_map = {
 | 
			
		||||
            'theme-system': {
 | 
			
		||||
                text: locale.txtThemeSystem || 'Auto',
 | 
			
		||||
                type: THEME_TYPE_SYSTEM,
 | 
			
		||||
                source: 'static',
 | 
			
		||||
            },
 | 
			
		||||
            'theme-light': {
 | 
			
		||||
                text: locale.txtThemeLight || 'Light',
 | 
			
		||||
                type: 'light',
 | 
			
		||||
| 
						 | 
				
			
			@ -261,6 +270,21 @@ define([
 | 
			
		|||
            }
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        const is_theme_type_system = id => themes_map[id].type == THEME_TYPE_SYSTEM;
 | 
			
		||||
        const get_system_theme_type = () => window.matchMedia('(prefers-color-scheme: dark)').matches ? THEME_TYPE_DARK : THEME_TYPE_LIGHT;
 | 
			
		||||
        const get_system_default_theme = () => {
 | 
			
		||||
            const id = get_system_theme_type() == THEME_TYPE_DARK ?
 | 
			
		||||
                                id_default_dark_theme : id_default_light_theme;
 | 
			
		||||
 | 
			
		||||
            return {id: id, info: themes_map[id]};
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        const on_system_theme_dark = function (mql)  {
 | 
			
		||||
            if ( Common.localStorage.getBool('ui-theme-use-system', false) ) {
 | 
			
		||||
                this.setTheme('theme-system');
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        return {
 | 
			
		||||
            init: function (api) {
 | 
			
		||||
                var me = this;
 | 
			
		||||
| 
						 | 
				
			
			@ -313,6 +337,7 @@ define([
 | 
			
		|||
                obj.name = theme_name;
 | 
			
		||||
                api.asc_setSkin(obj);
 | 
			
		||||
 | 
			
		||||
                window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', on_system_theme_dark.bind(this));
 | 
			
		||||
                Common.NotificationCenter.on('document:ready', on_document_ready.bind(this));
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -333,6 +358,9 @@ define([
 | 
			
		|||
            },
 | 
			
		||||
 | 
			
		||||
            currentThemeId: function () {
 | 
			
		||||
                if ( Common.localStorage.getBool('ui-theme-use-system', false) )
 | 
			
		||||
                    return 'theme-system';
 | 
			
		||||
 | 
			
		||||
                var t = Common.localStorage.getItem('ui-theme') || Common.localStorage.getItem('ui-theme-id');
 | 
			
		||||
                var id = get_ui_theme_name(t);
 | 
			
		||||
                return !!themes_map[id] ? id : id_default_light_theme;
 | 
			
		||||
| 
						 | 
				
			
			@ -346,8 +374,9 @@ define([
 | 
			
		|||
                return themes_map[this.defaultThemeId(type)]
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
            isDarkTheme: function () {
 | 
			
		||||
                return themes_map[this.currentThemeId()].type == 'dark';
 | 
			
		||||
            isDarkTheme: function (id) {
 | 
			
		||||
                !id && (id = this.currentThemeId());
 | 
			
		||||
                return (is_theme_type_system(id) ? get_system_default_theme().info.type : themes_map[id].type) == THEME_TYPE_DARK;
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
            isContentThemeDark: function () {
 | 
			
		||||
| 
						 | 
				
			
			@ -384,6 +413,14 @@ define([
 | 
			
		|||
                if ( !obj ) return;
 | 
			
		||||
 | 
			
		||||
                var id = get_ui_theme_name(obj);
 | 
			
		||||
 | 
			
		||||
                if ( is_theme_type_system(id) ) {
 | 
			
		||||
                    Common.localStorage.setBool('ui-theme-use-system', true);
 | 
			
		||||
                    id = get_system_default_theme().id;
 | 
			
		||||
                } else {
 | 
			
		||||
                    Common.localStorage.setBool('ui-theme-use-system', false);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if ( (this.currentThemeId() != id || force) && !!themes_map[id] ) {
 | 
			
		||||
                    document.body.className = document.body.className.replace(/theme-[\w-]+\s?/gi, '').trim();
 | 
			
		||||
                    document.body.classList.add(id, 'theme-type-' + themes_map[id].type);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,9 @@
 | 
			
		|||
 | 
			
		||||
+function init_themes() {
 | 
			
		||||
    if ( localStorage.getItem("ui-theme-use-system") == '1' ) {
 | 
			
		||||
        localStorage.removeItem("ui-theme-id");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var objtheme = localStorage.getItem("ui-theme");
 | 
			
		||||
    if ( typeof(objtheme) == 'string' &&
 | 
			
		||||
            objtheme.startsWith("{") && objtheme.endsWith("}") )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -679,7 +679,7 @@ define([
 | 
			
		|||
                dataHintDirection: 'bottom',
 | 
			
		||||
                dataHintOffset: 'big'
 | 
			
		||||
            }).on('selected', function(combo, record) {
 | 
			
		||||
                me.chDarkMode.setDisabled(record.themeType!=='dark');
 | 
			
		||||
                me.chDarkMode.setDisabled(!Common.UI.Themes.isDarkTheme(record.value));
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            this.chDarkMode = new Common.UI.CheckBox({
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -188,6 +188,7 @@
 | 
			
		|||
  "Common.UI.Themes.txtThemeClassicLight": "Classic Light",
 | 
			
		||||
  "Common.UI.Themes.txtThemeDark": "Dark",
 | 
			
		||||
  "Common.UI.Themes.txtThemeLight": "Light",
 | 
			
		||||
  "Common.UI.Themes.txtThemeSystem": "Auto",
 | 
			
		||||
  "Common.UI.Window.cancelButtonText": "Cancel",
 | 
			
		||||
  "Common.UI.Window.closeButtonText": "Close",
 | 
			
		||||
  "Common.UI.Window.noButtonText": "No",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -275,6 +275,7 @@
 | 
			
		|||
  "Common.UI.Themes.txtThemeClassicLight": "Classic Light",
 | 
			
		||||
  "Common.UI.Themes.txtThemeDark": "Dark",
 | 
			
		||||
  "Common.UI.Themes.txtThemeLight": "Light",
 | 
			
		||||
  "Common.UI.Themes.txtThemeSystem": "Auto",
 | 
			
		||||
  "Common.UI.Window.cancelButtonText": "Cancel",
 | 
			
		||||
  "Common.UI.Window.closeButtonText": "Close",
 | 
			
		||||
  "Common.UI.Window.noButtonText": "No",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -133,6 +133,7 @@
 | 
			
		|||
  "Common.UI.Themes.txtThemeClassicLight": "Classic Light",
 | 
			
		||||
  "Common.UI.Themes.txtThemeDark": "Dark",
 | 
			
		||||
  "Common.UI.Themes.txtThemeLight": "Light",
 | 
			
		||||
  "Common.UI.Themes.txtThemeSystem": "Auto",
 | 
			
		||||
  "Common.UI.Window.cancelButtonText": "Cancel",
 | 
			
		||||
  "Common.UI.Window.closeButtonText": "Close",
 | 
			
		||||
  "Common.UI.Window.noButtonText": "No",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue