code style theme chooser
Этот коммит содержится в:
55
web/react/components/user_settings/code_theme_chooser.jsx
Обычный файл
55
web/react/components/user_settings/code_theme_chooser.jsx
Обычный файл
@@ -0,0 +1,55 @@
|
||||
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
|
||||
// See License.txt for license information.
|
||||
|
||||
var Constants = require('../../utils/constants.jsx');
|
||||
|
||||
export default class CodeThemeChooser extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {};
|
||||
}
|
||||
render() {
|
||||
const theme = this.props.theme;
|
||||
|
||||
const premadeThemes = [];
|
||||
for (const k in Constants.CODE_THEMES) {
|
||||
if (Constants.CODE_THEMES.hasOwnProperty(k)) {
|
||||
let activeClass = '';
|
||||
if (k === theme.codeTheme) {
|
||||
activeClass = 'active';
|
||||
}
|
||||
|
||||
premadeThemes.push(
|
||||
<div
|
||||
className='col-xs-6 col-sm-3 premade-themes'
|
||||
key={'premade-theme-key' + k}
|
||||
>
|
||||
<div
|
||||
className={activeClass}
|
||||
onClick={() => this.props.updateTheme(k)}
|
||||
>
|
||||
<label>
|
||||
<img
|
||||
className='img-responsive'
|
||||
src={'/static/images/themes/code_themes/' + k + '.png'}
|
||||
/>
|
||||
<div className='theme-label'>{Constants.CODE_THEMES[k]}</div>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='row'>
|
||||
{premadeThemes}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
CodeThemeChooser.propTypes = {
|
||||
theme: React.PropTypes.object.isRequired,
|
||||
updateTheme: React.PropTypes.func.isRequired
|
||||
};
|
||||
@@ -7,6 +7,7 @@ var Utils = require('../../utils/utils.jsx');
|
||||
|
||||
const CustomThemeChooser = require('./custom_theme_chooser.jsx');
|
||||
const PremadeThemeChooser = require('./premade_theme_chooser.jsx');
|
||||
const CodeThemeChooser = require('./code_theme_chooser.jsx');
|
||||
const AppDispatcher = require('../../dispatcher/app_dispatcher.jsx');
|
||||
const Constants = require('../../utils/constants.jsx');
|
||||
const ActionTypes = Constants.ActionTypes;
|
||||
@@ -18,12 +19,14 @@ export default class UserSettingsAppearance extends React.Component {
|
||||
this.onChange = this.onChange.bind(this);
|
||||
this.submitTheme = this.submitTheme.bind(this);
|
||||
this.updateTheme = this.updateTheme.bind(this);
|
||||
this.updateCodeTheme = this.updateCodeTheme.bind(this);
|
||||
this.handleClose = this.handleClose.bind(this);
|
||||
this.handleImportModal = this.handleImportModal.bind(this);
|
||||
|
||||
this.state = this.getStateFromStores();
|
||||
|
||||
this.originalTheme = this.state.theme;
|
||||
this.originalCodeTheme = this.state.theme.codeTheme;
|
||||
}
|
||||
componentDidMount() {
|
||||
UserStore.addChangeListener(this.onChange);
|
||||
@@ -58,6 +61,10 @@ export default class UserSettingsAppearance extends React.Component {
|
||||
type = 'custom';
|
||||
}
|
||||
|
||||
if (!theme.codeTheme) {
|
||||
theme.codeTheme = Constants.DEFAULT_CODE_THEME;
|
||||
}
|
||||
|
||||
return {theme, type};
|
||||
}
|
||||
onChange() {
|
||||
@@ -93,6 +100,13 @@ export default class UserSettingsAppearance extends React.Component {
|
||||
);
|
||||
}
|
||||
updateTheme(theme) {
|
||||
theme.codeTheme = this.state.theme.codeTheme;
|
||||
this.setState({theme});
|
||||
Utils.applyTheme(theme);
|
||||
}
|
||||
updateCodeTheme(codeTheme) {
|
||||
var theme = this.state.theme;
|
||||
theme.codeTheme = codeTheme;
|
||||
this.setState({theme});
|
||||
Utils.applyTheme(theme);
|
||||
}
|
||||
@@ -102,6 +116,7 @@ export default class UserSettingsAppearance extends React.Component {
|
||||
handleClose() {
|
||||
const state = this.getStateFromStores();
|
||||
state.serverError = null;
|
||||
state.theme.codeTheme = this.originalCodeTheme;
|
||||
|
||||
Utils.applyTheme(state.theme);
|
||||
|
||||
@@ -170,7 +185,13 @@ export default class UserSettingsAppearance extends React.Component {
|
||||
</div>
|
||||
{custom}
|
||||
<hr />
|
||||
{serverError}
|
||||
<strong className='radio'>{'Code Theme'}</strong>
|
||||
<CodeThemeChooser
|
||||
theme={this.state.theme}
|
||||
updateTheme={this.updateCodeTheme}
|
||||
/>
|
||||
<hr />
|
||||
{serverError}
|
||||
<a
|
||||
className='btn btn-sm btn-primary'
|
||||
href='#'
|
||||
|
||||
@@ -304,6 +304,13 @@ module.exports = {
|
||||
uiName: 'Mention Highlight Link'
|
||||
}
|
||||
],
|
||||
CODE_THEMES: {
|
||||
github: 'GitHub',
|
||||
solarized_light: 'Solarized light',
|
||||
monokai: 'Monokai',
|
||||
solarized_dark: 'Solarized Dark'
|
||||
},
|
||||
DEFAULT_CODE_THEME: 'github',
|
||||
Preferences: {
|
||||
CATEGORY_DIRECT_CHANNEL_SHOW: 'direct_channel_show',
|
||||
CATEGORY_DISPLAY_SETTINGS: 'display_settings',
|
||||
|
||||
@@ -424,6 +424,11 @@ export function toTitleCase(str) {
|
||||
}
|
||||
|
||||
export function applyTheme(theme) {
|
||||
if (!theme.codeTheme) {
|
||||
theme.codeTheme = Constants.DEFAULT_CODE_THEME;
|
||||
}
|
||||
updateCodeTheme(theme.codeTheme);
|
||||
|
||||
if (theme.sidebarBg) {
|
||||
changeCss('.sidebar--left, .settings-modal .settings-table .settings-links, .sidebar--menu', 'background:' + theme.sidebarBg, 1);
|
||||
}
|
||||
@@ -612,6 +617,27 @@ export function rgb2hex(rgbIn) {
|
||||
return '#' + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
|
||||
}
|
||||
|
||||
export function updateCodeTheme(theme) {
|
||||
const path = '/static/css/highlight/' + theme + '.css';
|
||||
const $link = $('link.code_theme');
|
||||
if (path !== $link.attr('href')) {
|
||||
changeCss('code.hljs', 'visibility: hidden');
|
||||
var xmlHTTP = new XMLHttpRequest();
|
||||
xmlHTTP.open('GET', path, true);
|
||||
xmlHTTP.onload = function onLoad() {
|
||||
$link.attr('href', path);
|
||||
if (isBrowserFirefox()) {
|
||||
$link.one('load', () => {
|
||||
changeCss('code.hljs', 'visibility: visible');
|
||||
});
|
||||
} else {
|
||||
changeCss('code.hljs', 'visibility: visible');
|
||||
}
|
||||
};
|
||||
xmlHTTP.send();
|
||||
}
|
||||
}
|
||||
|
||||
export function placeCaretAtEnd(el) {
|
||||
el.focus();
|
||||
if (typeof window.getSelection != 'undefined' && typeof document.createRange != 'undefined') {
|
||||
|
||||
Двоичные данные
web/static/images/themes/code_themes/github.png
Обычный файл
Двоичные данные
web/static/images/themes/code_themes/github.png
Обычный файл
Двоичный файл не отображается.
|
После Ширина: | Высота: | Размер: 9.4 KiB |
Двоичные данные
web/static/images/themes/code_themes/monokai.png
Обычный файл
Двоичные данные
web/static/images/themes/code_themes/monokai.png
Обычный файл
Двоичный файл не отображается.
|
После Ширина: | Высота: | Размер: 9.1 KiB |
Двоичные данные
web/static/images/themes/code_themes/solarized_dark.png
Обычный файл
Двоичные данные
web/static/images/themes/code_themes/solarized_dark.png
Обычный файл
Двоичный файл не отображается.
|
После Ширина: | Высота: | Размер: 8.0 KiB |
Двоичные данные
web/static/images/themes/code_themes/solarized_light.png
Обычный файл
Двоичные данные
web/static/images/themes/code_themes/solarized_light.png
Обычный файл
Двоичный файл не отображается.
|
После Ширина: | Высота: | Размер: 8.7 KiB |
@@ -24,7 +24,7 @@
|
||||
<link rel="stylesheet" href="/static/css/bootstrap-colorpicker.min.css">
|
||||
<link rel="stylesheet" href="/static/css/styles.css">
|
||||
<link rel="stylesheet" href="/static/css/google-fonts.css">
|
||||
<link rel="stylesheet" href="/static/css/highlight/monokai_sublime.css">
|
||||
<link rel="stylesheet" class="code_theme" href="">
|
||||
|
||||
<link id="favicon" rel="icon" href="/static/images/favicon.ico" type="image/x-icon">
|
||||
<link rel="shortcut icon" href="/static/images/favicon.ico" type="image/x-icon">
|
||||
|
||||
Ссылка в новой задаче
Block a user