summaryrefslogtreecommitdiffstats
path: root/web
diff options
context:
space:
mode:
Diffstat (limited to 'web')
-rw-r--r--web/react/components/channel_members_modal.jsx9
-rw-r--r--web/react/components/create_post.jsx10
-rw-r--r--web/react/components/file_attachment.jsx118
-rw-r--r--web/react/components/file_upload.jsx10
-rw-r--r--web/react/components/invite_member_modal.jsx4
-rw-r--r--web/react/components/more_channels.jsx115
-rw-r--r--web/react/components/settings_sidebar.jsx4
-rw-r--r--web/react/components/suggestion/search_suggestion_list.jsx2
-rw-r--r--web/react/components/team_general_tab.jsx4
-rw-r--r--web/react/components/team_import_tab.jsx5
-rw-r--r--web/react/components/team_members_dropdown.jsx2
-rw-r--r--web/react/components/team_settings_modal.jsx2
-rw-r--r--web/react/components/textbox.jsx51
-rw-r--r--web/react/components/user_list_row.jsx5
-rw-r--r--web/react/components/user_settings/user_settings_advanced.jsx10
-rw-r--r--web/react/components/user_settings/user_settings_developer.jsx10
-rw-r--r--web/react/components/user_settings/user_settings_display.jsx10
-rw-r--r--web/react/components/user_settings/user_settings_general.jsx10
-rw-r--r--web/react/components/user_settings/user_settings_integrations.jsx10
-rw-r--r--web/react/components/user_settings/user_settings_modal.jsx2
-rw-r--r--web/react/components/user_settings/user_settings_notifications.jsx10
-rw-r--r--web/react/components/user_settings/user_settings_security.jsx10
-rw-r--r--web/react/utils/text_formatting.jsx13
-rw-r--r--web/react/utils/utils.jsx33
-rw-r--r--web/sass-files/sass/partials/_base.scss30
-rw-r--r--web/sass-files/sass/partials/_modal.scss22
-rw-r--r--web/sass-files/sass/partials/_post.scss35
-rw-r--r--web/sass-files/sass/partials/_post_right.scss6
-rw-r--r--web/sass-files/sass/partials/_responsive.scss186
-rw-r--r--web/sass-files/sass/partials/_settings.scss599
-rw-r--r--web/static/i18n/en.json12
-rw-r--r--web/static/i18n/es.json10
-rw-r--r--web/static/i18n/pt.json8
33 files changed, 722 insertions, 645 deletions
diff --git a/web/react/components/channel_members_modal.jsx b/web/react/components/channel_members_modal.jsx
index 688ab7dd2..dc8e3baaf 100644
--- a/web/react/components/channel_members_modal.jsx
+++ b/web/react/components/channel_members_modal.jsx
@@ -44,6 +44,7 @@ export default class ChannelMembersModal extends React.Component {
}
getStateFromStores() {
const extraInfo = ChannelStore.getCurrentExtraInfo();
+ const profiles = UserStore.getActiveOnlyProfiles();
if (extraInfo.member_count !== extraInfo.members.length) {
AsyncClient.getChannelExtraInfo(this.props.channel.id, -1);
@@ -53,9 +54,8 @@ export default class ChannelMembersModal extends React.Component {
};
}
- // clone the member list since we mutate it later on
const memberList = extraInfo.members.map((member) => {
- return Object.assign({}, member);
+ return profiles[member.id];
});
function compareByUsername(a, b) {
@@ -130,8 +130,8 @@ export default class ChannelMembersModal extends React.Component {
onClick={this.handleRemove.bind(this, user)}
>
<FormattedMessage
- id='channel_members_modal.removeMember'
- defaultMessage='Remove Member'
+ id='channel_members_modal.remove'
+ defaultMessage='Remove'
/>
</button>
);
@@ -178,7 +178,6 @@ export default class ChannelMembersModal extends React.Component {
this.props.onModalDismissed();
}}
>
- <i className='glyphicon glyphicon-envelope'/>
<FormattedMessage
id='channel_members_modal.addNew'
defaultMessage=' Add New Members'
diff --git a/web/react/components/create_post.jsx b/web/react/components/create_post.jsx
index 9d7a19554..62319b1a7 100644
--- a/web/react/components/create_post.jsx
+++ b/web/react/components/create_post.jsx
@@ -130,7 +130,7 @@ class CreatePost extends React.Component {
post.message,
false,
(data) => {
- PostStore.storeDraft(data.channel_id, null);
+ PostStore.storeDraft(this.state.channelId, null);
this.setState({messageText: '', submitting: false, postError: null, previews: [], serverError: null});
if (data.goto_location && data.goto_location.length > 0) {
@@ -262,9 +262,7 @@ class CreatePost extends React.Component {
message = err.message;
}
- if (clientId === -1) {
- this.setState({serverError: message});
- } else {
+ if (clientId !== -1) {
const draft = PostStore.getDraft(this.state.channelId);
const index = draft.uploadsInProgress.indexOf(clientId);
@@ -274,8 +272,10 @@ class CreatePost extends React.Component {
PostStore.storeDraft(this.state.channelId, draft);
- this.setState({uploadsInProgress: draft.uploadsInProgress, serverError: message});
+ this.setState({uploadsInProgress: draft.uploadsInProgress});
}
+
+ this.setState({serverError: message});
}
removePreview(id) {
const previews = Object.assign([], this.state.previews);
diff --git a/web/react/components/file_attachment.jsx b/web/react/components/file_attachment.jsx
index 810f90b13..c719c6c7d 100644
--- a/web/react/components/file_attachment.jsx
+++ b/web/react/components/file_attachment.jsx
@@ -19,12 +19,10 @@ class FileAttachment extends React.Component {
super(props);
this.loadFiles = this.loadFiles.bind(this);
- this.playGif = this.playGif.bind(this);
- this.stopGif = this.stopGif.bind(this);
this.addBackgroundImage = this.addBackgroundImage.bind(this);
this.canSetState = false;
- this.state = {fileSize: -1, mime: '', playing: false, loading: false, format: ''};
+ this.state = {fileSize: -1};
}
componentDidMount() {
this.loadFiles();
@@ -95,42 +93,6 @@ class FileAttachment extends React.Component {
return true;
}
- playGif(e, filename) {
- var img = new Image();
- var fileUrl = utils.getFileUrl(filename);
-
- this.setState({loading: true});
- img.load(fileUrl);
- img.onload = () => {
- var state = {playing: true, loading: false};
-
- switch (true) {
- case img.width > img.height:
- state.format = 'landscape';
- break;
- case img.height > img.width:
- state.format = 'portrait';
- break;
- default:
- state.format = 'quadrat';
- break;
- }
-
- this.setState(state);
-
- // keep displaying background image for a short moment while browser is
- // loading gif, to prevent white background flashing through
- setTimeout(() => this.removeBackgroundImage.bind(this)(filename), 100);
- };
- img.onError = () => this.setState({loading: false});
-
- e.stopPropagation();
- }
- stopGif(e, filename) {
- this.setState({playing: false});
- this.addBackgroundImage(filename);
- e.stopPropagation();
- }
getFileInfoFromName(name) {
var fileInfo = utils.splitFileLocation(name);
@@ -164,74 +126,18 @@ class FileAttachment extends React.Component {
var filename = this.props.filename;
var fileInfo = utils.splitFileLocation(filename);
- var fileUrl = utils.getFileUrl(filename);
+ var fileUrl = utils.getFileUrl(filename, true);
var type = utils.getFileType(fileInfo.ext);
- var playbackControls = '';
- var loadedFile = '';
- var loadingIndicator = '';
- if (this.state.mime === 'image/gif') {
- playbackControls = (
- <div
- className='file-playback-controls play'
- onClick={(e) => this.playGif(e, filename)}
- >
- {"►"}
- </div>
- );
- }
- if (this.state.playing) {
- loadedFile = (
- <img
- className={'file__loaded ' + this.state.format}
- src={fileUrl}
- />
- );
- playbackControls = (
+ var thumbnail;
+ if (type === 'image') {
+ thumbnail = (
<div
- className='file-playback-controls stop'
- onClick={(e) => this.stopGif(e, filename)}
- >
- {"■"}
- </div>
- );
- }
- if (this.state.loading) {
- loadingIndicator = (
- <img
- className='spinner file__loading'
- src='/static/images/load.gif'
+ ref={filename}
+ className='post__load'
+ style={{backgroundImage: 'url(/static/images/load.gif)'}}
/>
);
- playbackControls = '';
- }
-
- var thumbnail;
- if (type === 'image') {
- if (this.state.playing) {
- thumbnail = (
- <div
- ref={filename}
- className='post__load'
- style={{backgroundImage: 'url(/static/images/load.gif)'}}
- >
- {playbackControls}
- {loadedFile}
- </div>
- );
- } else {
- thumbnail = (
- <div
- ref={filename}
- className='post__load'
- style={{backgroundImage: 'url(/static/images/load.gif)'}}
- >
- {loadingIndicator}
- {playbackControls}
- {loadedFile}
- </div>
- );
- }
} else {
thumbnail = <div className={'file-icon ' + utils.getIconClassName(type)}/>;
}
@@ -242,12 +148,12 @@ class FileAttachment extends React.Component {
filename,
function success(data) {
if (this.canSetState) {
- this.setState({fileSize: parseInt(data.size, 10), mime: data.mime});
+ this.setState({fileSize: parseInt(data.size, 10)});
}
}.bind(this),
- function error() {
- // Do nothing
- }
+ function error() {
+ // Do nothing
+ }
);
} else {
fileSizeString = utils.fileSizeToString(this.state.fileSize);
diff --git a/web/react/components/file_upload.jsx b/web/react/components/file_upload.jsx
index cb8ede51b..f8965e13e 100644
--- a/web/react/components/file_upload.jsx
+++ b/web/react/components/file_upload.jsx
@@ -108,12 +108,12 @@ class FileUpload extends React.Component {
}
}
- handleChange() {
- var element = $(ReactDOM.findDOMNode(this.refs.fileInput));
+ handleChange(e) {
+ if (e.target.files.length > 0) {
+ this.uploadFiles(e.target.files);
- this.uploadFiles(element.prop('files'));
-
- Utils.clearFileInput(element[0]);
+ Utils.clearFileInput(e.target);
+ }
}
handleDrop(e) {
diff --git a/web/react/components/invite_member_modal.jsx b/web/react/components/invite_member_modal.jsx
index 0c0330c40..184ba1357 100644
--- a/web/react/components/invite_member_modal.jsx
+++ b/web/react/components/invite_member_modal.jsx
@@ -495,7 +495,7 @@ class InviteMemberModal extends React.Component {
<ConfirmModal
title={formatMessage(holders.modalTitle)}
message={formatMessage(holders.modalMessage)}
- confirm_button={formatMessage(holders.modalButton)}
+ confirmButton={formatMessage(holders.modalButton)}
show={this.state.showConfirmModal}
onConfirm={this.handleHide.bind(this, false)}
onCancel={() => this.setState({showConfirmModal: false})}
@@ -512,4 +512,4 @@ InviteMemberModal.propTypes = {
intl: intlShape.isRequired
};
-export default injectIntl(InviteMemberModal); \ No newline at end of file
+export default injectIntl(InviteMemberModal);
diff --git a/web/react/components/more_channels.jsx b/web/react/components/more_channels.jsx
index db61e5f49..3309ef52e 100644
--- a/web/react/components/more_channels.jsx
+++ b/web/react/components/more_channels.jsx
@@ -1,7 +1,7 @@
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
-import * as utils from '../utils/utils.jsx';
+import * as Utils from '../utils/utils.jsx';
import * as client from '../utils/client.jsx';
import * as AsyncClient from '../utils/async_client.jsx';
import ChannelStore from '../stores/channel_store.jsx';
@@ -24,6 +24,7 @@ export default class MoreChannels extends React.Component {
this.onListenerChange = this.onListenerChange.bind(this);
this.handleJoin = this.handleJoin.bind(this);
this.handleNewChannel = this.handleNewChannel.bind(this);
+ this.createChannelRow = this.createChannelRow.bind(this);
var initState = getStateFromStores();
initState.channelType = '';
@@ -48,7 +49,7 @@ export default class MoreChannels extends React.Component {
}
onListenerChange() {
var newState = getStateFromStores();
- if (!utils.areObjectsEqual(newState.channels, this.state.channels)) {
+ if (!Utils.areObjectsEqual(newState.channels, this.state.channels)) {
this.setState(newState);
}
}
@@ -58,7 +59,7 @@ export default class MoreChannels extends React.Component {
() => {
$(ReactDOM.findDOMNode(this.refs.modal)).modal('hide');
AsyncClient.getChannel(channel.id);
- utils.switchChannel(channel);
+ Utils.switchChannel(channel);
this.setState({joiningChannel: -1});
},
(err) => {
@@ -70,13 +71,54 @@ export default class MoreChannels extends React.Component {
$(ReactDOM.findDOMNode(this.refs.modal)).modal('hide');
this.setState({showNewChannelModal: true});
}
+ createChannelRow(channel, index) {
+ let joinButton;
+ if (this.state.joiningChannel === index) {
+ joinButton = (
+ <img
+ className='join-channel-loading-gif'
+ src='/static/images/load.gif'
+ />
+ );
+ } else {
+ joinButton = (
+ <button
+ onClick={this.handleJoin.bind(self, channel, index)}
+ className='btn btn-primary'
+ >
+ <FormattedMessage
+ id='more_channels.join'
+ defaultMessage='Join'
+ />
+ </button>
+ );
+ }
+
+ return (
+ <tr key={channel.id}>
+ <td className='more-row'>
+ <div className='more-details'>
+ <p className='more-name'>{channel.display_name}</p>
+ <p className='more-description'>{channel.purpose}</p>
+ </div>
+ <div className='more-actions'>
+ {joinButton}
+ </div>
+ </td>
+ </tr>
+ );
+ }
render() {
+ let maxHeight = 1000;
+ if (Utils.windowHeight() <= 1200) {
+ maxHeight = Utils.windowHeight() - 300;
+ }
+
var serverError;
if (this.state.serverError) {
serverError = <div className='form-group has-error'><label className='control-label'>{this.state.serverError}</label></div>;
}
- var self = this;
var moreChannels;
if (this.state.channels != null) {
@@ -87,59 +129,25 @@ export default class MoreChannels extends React.Component {
moreChannels = (
<table className='more-table table'>
<tbody>
- {channels.map(function cMap(channel, index) {
- var joinButton;
- if (self.state.joiningChannel === index) {
- joinButton = (
- <img
- className='join-channel-loading-gif'
- src='/static/images/load.gif'
- />
- );
- } else {
- joinButton = (
- <button
- onClick={self.handleJoin.bind(self, channel, index)}
- className='btn btn-primary'
- >
- <FormattedMessage
- id='more_channels.join'
- defaultMessage='Join'
- />
- </button>
- );
- }
-
- return (
- <tr key={channel.id}>
- <td>
- <p className='more-name'>{channel.display_name}</p>
- <p className='more-description'>{channel.purpose}</p>
- </td>
- <td className='td--action'>
- {joinButton}
- </td>
- </tr>
- );
- })}
+ {channels.map(this.createChannelRow)}
</tbody>
</table>
);
} else {
moreChannels = (
<div className='no-channel-message'>
- <p className='primary-message'>
- <FormattedMessage
- id='more_channels.noMore'
- defaultMessage='No more channels to join'
- />
- </p>
- <p className='secondary-message'>
- <FormattedMessage
- id='more_channels.createClick'
- defaultMessage="Click 'Create New Channel' to make a new one"
- />
- </p>
+ <p className='primary-message'>
+ <FormattedMessage
+ id='more_channels.noMore'
+ defaultMessage='No more channels to join'
+ />
+ </p>
+ <p className='secondary-message'>
+ <FormattedMessage
+ id='more_channels.createClick'
+ defaultMessage="Click 'Create New Channel' to make a new one"
+ />
+ </p>
</div>
);
}
@@ -192,7 +200,10 @@ export default class MoreChannels extends React.Component {
onModalDismissed={() => this.setState({showNewChannelModal: false})}
/>
</div>
- <div className='modal-body'>
+ <div
+ className='modal-body'
+ style={{maxHeight}}
+ >
{moreChannels}
{serverError}
</div>
diff --git a/web/react/components/settings_sidebar.jsx b/web/react/components/settings_sidebar.jsx
index 90c0e8435..da8001f6f 100644
--- a/web/react/components/settings_sidebar.jsx
+++ b/web/react/components/settings_sidebar.jsx
@@ -4,10 +4,6 @@
import * as Utils from '../utils/utils.jsx';
export default class SettingsSidebar extends React.Component {
- componentDidUpdate() {
- $('.settings-modal').find('.modal-body').scrollTop(0);
- $('.settings-modal').find('.modal-body').perfectScrollbar('update');
- }
constructor(props) {
super(props);
diff --git a/web/react/components/suggestion/search_suggestion_list.jsx b/web/react/components/suggestion/search_suggestion_list.jsx
index 40f5d8777..60a5562fa 100644
--- a/web/react/components/suggestion/search_suggestion_list.jsx
+++ b/web/react/components/suggestion/search_suggestion_list.jsx
@@ -30,7 +30,7 @@ export default class SearchSuggestionList extends SuggestionList {
text = (
<FormattedMessage
id='suggestion.search.private'
- defaultMessage='Public Groups'
+ defaultMessage='Private Groups'
/>
);
}
diff --git a/web/react/components/team_general_tab.jsx b/web/react/components/team_general_tab.jsx
index c1b2a2e7f..ef7410b2f 100644
--- a/web/react/components/team_general_tab.jsx
+++ b/web/react/components/team_general_tab.jsx
@@ -611,7 +611,9 @@ class GeneralTab extends React.Component {
className='modal-title'
ref='title'
>
- <i className='modal-back'></i>
+ <div className='modal-back'>
+ <i className='fa fa-angle-left'></i>
+ </div>
<FormattedMessage
id='general_tab.title'
defaultMessage='General Settings'
diff --git a/web/react/components/team_import_tab.jsx b/web/react/components/team_import_tab.jsx
index 828e9fc4e..c9a8afe6c 100644
--- a/web/react/components/team_import_tab.jsx
+++ b/web/react/components/team_import_tab.jsx
@@ -131,7 +131,10 @@ class TeamImportTab extends React.Component {
<h4
className='modal-title'
ref='title'
- ><i className='modal-back'></i>
+ >
+ <div className='modal-back'>
+ <i className='fa fa-angle-left'></i>
+ </div>
<FormattedMessage
id='team_import_tab.import'
defaultMessage='Import'
diff --git a/web/react/components/team_members_dropdown.jsx b/web/react/components/team_members_dropdown.jsx
index 8aacba8ca..cd7585d94 100644
--- a/web/react/components/team_members_dropdown.jsx
+++ b/web/react/components/team_members_dropdown.jsx
@@ -308,8 +308,8 @@ export default class TeamMembersDropdown extends React.Component {
data-toggle='dropdown'
aria-expanded='true'
>
- <span className='fa fa-pencil'></span>
<span>{currentRoles} </span>
+ <span className='fa fa-chevron-down'></span>
</a>
<ul
className='dropdown-menu member-menu'
diff --git a/web/react/components/team_settings_modal.jsx b/web/react/components/team_settings_modal.jsx
index d517f92fb..bef3ebf24 100644
--- a/web/react/components/team_settings_modal.jsx
+++ b/web/react/components/team_settings_modal.jsx
@@ -91,7 +91,7 @@ class TeamSettingsModal extends React.Component {
/>
</h4>
</div>
- <div className='modal-body'>
+ <div className='modal-body settings-modal__body'>
<div className='settings-table'>
<div className='settings-links'>
<SettingsSidebar
diff --git a/web/react/components/textbox.jsx b/web/react/components/textbox.jsx
index 23ecfb57b..46900e436 100644
--- a/web/react/components/textbox.jsx
+++ b/web/react/components/textbox.jsx
@@ -129,12 +129,12 @@ export default class Textbox extends React.Component {
}
render() {
+ const hasText = this.props.messageText.length > 0;
+
let previewLink = null;
if (Utils.isFeatureEnabled(PreReleaseFeatures.MARKDOWN_PREVIEW)) {
- const previewLinkVisible = this.props.messageText.length > 0;
previewLink = (
<a
- style={{visibility: previewLinkVisible ? 'visible' : 'hidden'}}
onClick={this.showPreview}
className='textbox-preview-link'
>
@@ -153,6 +153,51 @@ export default class Textbox extends React.Component {
);
}
+ let helpText = (
+ <div
+ style={{visibility: hasText ? 'visible' : 'hidden', opacity: hasText ? '0.5' : '0'}}
+ className='help_format_text'
+ >
+ <b>
+ <FormattedMessage
+ id='textbox.bold'
+ defaultMessage='**bold**'
+ />
+ </b>
+ <i>
+ <FormattedMessage
+ id='textbox.italic'
+ defaultMessage='_italic_'
+ />
+ </i>
+ <span>~~<strike>
+ <FormattedMessage
+ id='textbox.strike'
+ defaultMessage='strike'
+ />
+ </strike>~~ </span>
+ <code>
+ <FormattedMessage
+ id='textbox.inlinecode'
+ defaultMessage='`inline code`'
+ />
+ </code>
+ <code>
+ <FormattedMessage
+ id='textbox.preformatted'
+ defaultMessage='```preformatted```'
+ />
+ </code>
+ <span>
+ <FormattedMessage
+ id='textbox.quote'
+ defaultMessage='>quote'
+ />
+ </span>
+ {previewLink}
+ </div>
+ );
+
return (
<div
ref='wrapper'
@@ -184,7 +229,7 @@ export default class Textbox extends React.Component {
dangerouslySetInnerHTML={{__html: this.state.preview ? TextFormatting.formatText(this.props.messageText) : ''}}
>
</div>
- {previewLink}
+ {helpText}
<a
target='_blank'
href='http://docs.mattermost.com/help/getting-started/messaging-basics.html'
diff --git a/web/react/components/user_list_row.jsx b/web/react/components/user_list_row.jsx
index 2aeca7d47..d8442e770 100644
--- a/web/react/components/user_list_row.jsx
+++ b/web/react/components/user_list_row.jsx
@@ -10,9 +10,9 @@ export default function UserListRow({user, actions}) {
let name = user.username;
if (user.nickname && nameFormat === Constants.Preferences.DISPLAY_PREFER_NICKNAME) {
- name = `${user.nickname} (${user.username})`;
+ name = `${user.nickname} (@${user.username})`;
} else if ((user.first_name || user.last_name) && (nameFormat === Constants.Preferences.DISPLAY_PREFER_NICKNAME || nameFormat === Constants.Preferences.DISPLAY_PREFER_FULL_NAME)) {
- name = `${Utils.getFullName(user)} (${user.username})`;
+ name = `${Utils.getFullName(user)} (@${user.username})`;
}
const buttons = actions.map((Action, index) => {
@@ -28,7 +28,6 @@ export default function UserListRow({user, actions}) {
<tr>
<td
key={user.id}
- className='direct-channel'
style={{display: 'flex'}}
>
<img
diff --git a/web/react/components/user_settings/user_settings_advanced.jsx b/web/react/components/user_settings/user_settings_advanced.jsx
index efaf63ada..cdaa5fd8a 100644
--- a/web/react/components/user_settings/user_settings_advanced.jsx
+++ b/web/react/components/user_settings/user_settings_advanced.jsx
@@ -300,10 +300,12 @@ class AdvancedSettingsDisplay extends React.Component {
className='modal-title'
ref='title'
>
- <i
- className='modal-back'
- onClick={this.props.collapseModal}
- />
+ <div className='modal-back'>
+ <i
+ className='fa fa-angle-left'
+ onClick={this.props.collapseModal}
+ />
+ </div>
<FormattedMessage
id='user.settings.advance.title'
defaultMessage='Advanced Settings'
diff --git a/web/react/components/user_settings/user_settings_developer.jsx b/web/react/components/user_settings/user_settings_developer.jsx
index 5868e0ad3..0acfd4a16 100644
--- a/web/react/components/user_settings/user_settings_developer.jsx
+++ b/web/react/components/user_settings/user_settings_developer.jsx
@@ -94,10 +94,12 @@ class DeveloperTab extends React.Component {
className='modal-title'
ref='title'
>
- <i
- className='modal-back'
- onClick={this.props.collapseModal}
- />
+ <div className='modal-back'>
+ <i
+ className='fa fa-angle-left'
+ onClick={this.props.collapseModal}
+ />
+ </div>
<FormattedMessage
id='user.settings.developer.title'
defaultMessage='Developer Settings'
diff --git a/web/react/components/user_settings/user_settings_display.jsx b/web/react/components/user_settings/user_settings_display.jsx
index 3e468e08f..b0e64b0aa 100644
--- a/web/react/components/user_settings/user_settings_display.jsx
+++ b/web/react/components/user_settings/user_settings_display.jsx
@@ -444,10 +444,12 @@ export default class UserSettingsDisplay extends React.Component {
className='modal-title'
ref='title'
>
- <i
- className='modal-back'
- onClick={this.props.collapseModal}
- />
+ <div className='modal-back'>
+ <i
+ className='fa fa-angle-left'
+ onClick={this.props.collapseModal}
+ />
+ </div>
<FormattedMessage
id='user.settings.display.title'
defaultMessage='Display Settings'
diff --git a/web/react/components/user_settings/user_settings_general.jsx b/web/react/components/user_settings/user_settings_general.jsx
index 2f2116c2a..b0b1c414e 100644
--- a/web/react/components/user_settings/user_settings_general.jsx
+++ b/web/react/components/user_settings/user_settings_general.jsx
@@ -759,10 +759,12 @@ class UserSettingsGeneralTab extends React.Component {
className='modal-title'
ref='title'
>
- <i
- className='modal-back'
- onClick={this.props.collapseModal}
- />
+ <div className='modal-back'>
+ <i
+ className='fa fa-angle-left'
+ onClick={this.props.collapseModal}
+ />
+ </div>
<FormattedMessage
id='user.settings.general.title'
defaultMessage='General Settings'
diff --git a/web/react/components/user_settings/user_settings_integrations.jsx b/web/react/components/user_settings/user_settings_integrations.jsx
index e4f460a6d..7633b2f95 100644
--- a/web/react/components/user_settings/user_settings_integrations.jsx
+++ b/web/react/components/user_settings/user_settings_integrations.jsx
@@ -163,10 +163,12 @@ class UserSettingsIntegrationsTab extends React.Component {
className='modal-title'
ref='title'
>
- <i
- className='modal-back'
- onClick={this.props.collapseModal}
- />
+ <div className='modal-back'>
+ <i
+ className='fa fa-angle-left'
+ onClick={this.props.collapseModal}
+ />
+ </div>
<FormattedMessage
id='user.settings.integrations.title'
defaultMessage='Integration Settings'
diff --git a/web/react/components/user_settings/user_settings_modal.jsx b/web/react/components/user_settings/user_settings_modal.jsx
index 80d03d88e..fa3415988 100644
--- a/web/react/components/user_settings/user_settings_modal.jsx
+++ b/web/react/components/user_settings/user_settings_modal.jsx
@@ -309,7 +309,7 @@ class UserSettingsModal extends React.Component {
<ConfirmModal
title={formatMessage(holders.confirmTitle)}
message={formatMessage(holders.confirmMsg)}
- confirm_button={formatMessage(holders.confirmBtns)}
+ confirmButton={formatMessage(holders.confirmBtns)}
show={this.state.showConfirmModal}
onConfirm={this.handleConfirm}
onCancel={this.handleCancelConfirmation}
diff --git a/web/react/components/user_settings/user_settings_notifications.jsx b/web/react/components/user_settings/user_settings_notifications.jsx
index ee9febb8e..3ef6435f1 100644
--- a/web/react/components/user_settings/user_settings_notifications.jsx
+++ b/web/react/components/user_settings/user_settings_notifications.jsx
@@ -774,10 +774,12 @@ class NotificationsTab extends React.Component {
className='modal-title'
ref='title'
>
- <i
- className='modal-back'
- onClick={this.props.collapseModal}
- />
+ <div className='modal-back'>
+ <i
+ className='fa fa-angle-left'
+ onClick={this.props.collapseModal}
+ />
+ </div>
<FormattedMessage
id='user.settings.notifications.title'
defaultMessage='Notification Settings'
diff --git a/web/react/components/user_settings/user_settings_security.jsx b/web/react/components/user_settings/user_settings_security.jsx
index 53d79906f..cba7ffdea 100644
--- a/web/react/components/user_settings/user_settings_security.jsx
+++ b/web/react/components/user_settings/user_settings_security.jsx
@@ -389,10 +389,12 @@ class SecurityTab extends React.Component {
className='modal-title'
ref='title'
>
- <i
- className='modal-back'
- onClick={this.props.collapseModal}
- />
+ <div className='modal-back'>
+ <i
+ className='fa fa-angle-left'
+ onClick={this.props.collapseModal}
+ />
+ </div>
<FormattedMessage
id='user.settings.security.title'
defaultMessage='Security Settings'
diff --git a/web/react/utils/text_formatting.jsx b/web/react/utils/text_formatting.jsx
index dae2252a6..a930e9ece 100644
--- a/web/react/utils/text_formatting.jsx
+++ b/web/react/utils/text_formatting.jsx
@@ -123,14 +123,13 @@ function autolinkAtMentions(text, tokens) {
return (Constants.SPECIAL_MENTIONS.indexOf(u) !== -1 || UserStore.getProfileByUsername(u));
}
- function addToken(username, mention, extraText) {
+ function addToken(username, mention) {
const index = tokens.size;
const alias = `MM_ATMENTION${index}`;
tokens.set(alias, {
value: `<a class='mention-link' href='#' data-mention='${username}'>${mention}</a>`,
- originalText: mention,
- extraText
+ originalText: mention
});
return alias;
}
@@ -152,9 +151,9 @@ function autolinkAtMentions(text, tokens) {
usernameLower = usernameLower.substring(0, c - 1);
if (mentionExists(usernameLower)) {
- const extraText = originalUsername.substr(c - 1);
- const alias = addToken(usernameLower, '@' + usernameLower, extraText);
- return alias;
+ const suffix = originalUsername.substr(c - 1);
+ const alias = addToken(usernameLower, '@' + usernameLower);
+ return alias + suffix;
}
} else {
// If the last character is not punctuation, no point in going any further
@@ -188,7 +187,7 @@ function highlightCurrentMentions(text, tokens) {
const newAlias = `MM_SELFMENTION${index}`;
newTokens.set(newAlias, {
- value: `<span class='mention-highlight'>${alias}</span>` + (token.extraText || ''),
+ value: `<span class='mention-highlight'>${alias}</span>`,
originalText: token.originalText
});
output = output.replace(alias, newAlias);
diff --git a/web/react/utils/utils.jsx b/web/react/utils/utils.jsx
index 6ab2f64d4..6942a8e08 100644
--- a/web/react/utils/utils.jsx
+++ b/web/react/utils/utils.jsx
@@ -606,16 +606,17 @@ export function toTitleCase(str) {
export function applyTheme(theme) {
if (theme.sidebarBg) {
- changeCss('.sidebar--left, .settings-modal .settings-table .settings-links, .sidebar--menu', 'background:' + theme.sidebarBg, 1);
+ changeCss('.sidebar--left, .modal .settings-modal .settings-table .settings-links, .sidebar--menu', 'background:' + theme.sidebarBg, 1);
+ changeCss('body', 'scrollbar-face-color:' + theme.sidebarBg, 3);
}
if (theme.sidebarText) {
- changeCss('.sidebar--left .nav-pills__container li>a, .sidebar--right, .settings-modal .nav-pills>li a, .sidebar--menu', 'color:' + changeOpacity(theme.sidebarText, 0.6), 1);
- changeCss('@media(max-width: 768px){.settings-modal .settings-table .nav>li>a', 'color:' + theme.sidebarText, 1);
+ changeCss('.sidebar--left .nav-pills__container li>a, .sidebar--right, .modal .settings-modal .nav-pills>li a, .sidebar--menu', 'color:' + changeOpacity(theme.sidebarText, 0.6), 1);
+ changeCss('@media(max-width: 768px){.modal .settings-modal .settings-table .nav>li>a', 'color:' + theme.sidebarText, 1);
changeCss('.sidebar--left .nav-pills__container li>h4, .sidebar--left .add-channel-btn', 'color:' + changeOpacity(theme.sidebarText, 0.6), 1);
changeCss('.sidebar--left .add-channel-btn:hover, .sidebar--left .add-channel-btn:focus', 'color:' + theme.sidebarText, 1);
changeCss('.sidebar--left .status .offline--icon, .sidebar--left .status .offline--icon', 'fill:' + theme.sidebarText, 1);
- changeCss('@media(max-width: 768px){.settings-modal .settings-table .nav>li>a', 'border-color:' + changeOpacity(theme.sidebarText, 0.2), 2);
+ changeCss('@media(max-width: 768px){.modal .settings-modal .settings-table .nav>li>a', 'border-color:' + changeOpacity(theme.sidebarText, 0.2), 2);
}
if (theme.sidebarUnreadText) {
@@ -623,16 +624,16 @@ export function applyTheme(theme) {
}
if (theme.sidebarTextHoverBg) {
- changeCss('.sidebar--left .nav-pills__container li>a:hover, .sidebar--left .nav-pills__container li>a:focus, .settings-modal .nav-pills>li:hover a, .settings-modal .nav-pills>li:focus a', 'background:' + theme.sidebarTextHoverBg, 1);
- changeCss('@media(max-width: 768px){.settings-modal .settings-table .nav>li:hover a', 'background:' + theme.sidebarTextHoverBg, 1);
+ changeCss('.sidebar--left .nav-pills__container li>a:hover, .sidebar--left .nav-pills__container li>a:focus, .modal .settings-modal .nav-pills>li:hover a, .modal .settings-modal .nav-pills>li:focus a', 'background:' + theme.sidebarTextHoverBg, 1);
+ changeCss('@media(max-width: 768px){.modal .settings-modal .settings-table .nav>li:hover a', 'background:' + theme.sidebarTextHoverBg, 1);
}
if (theme.sidebarTextActiveBorder) {
- changeCss('.sidebar--left .nav li.active a:before, .settings-modal .nav-pills>li.active a:before', 'background:' + theme.sidebarTextActiveBorder, 1);
+ changeCss('.sidebar--left .nav li.active a:before, .modal .settings-modal .nav-pills>li.active a:before', 'background:' + theme.sidebarTextActiveBorder, 1);
}
if (theme.sidebarTextActiveColor) {
- changeCss('.sidebar--left .nav-pills__container li.active a, .sidebar--left .nav-pills__container li.active a:hover, .sidebar--left .nav-pills__container li.active a:focus, .settings-modal .nav-pills>li.active a, .settings-modal .nav-pills>li.active a:hover, .settings-modal .nav-pills>li.active a:active', 'color:' + theme.sidebarTextActiveColor, 2);
+ changeCss('.sidebar--left .nav-pills__container li.active a, .sidebar--left .nav-pills__container li.active a:hover, .sidebar--left .nav-pills__container li.active a:focus, .modal .settings-modal .nav-pills>li.active a, .modal .settings-modal .nav-pills>li.active a:hover, .modal .settings-modal .nav-pills>li.active a:active', 'color:' + theme.sidebarTextActiveColor, 2);
changeCss('.sidebar--left .nav li.active a, .sidebar--left .nav li.active a:hover, .sidebar--left .nav li.active a:focus', 'background:' + changeOpacity(theme.sidebarTextActiveColor, 0.1), 1);
}
@@ -665,12 +666,12 @@ export function applyTheme(theme) {
if (theme.mentionBj) {
changeCss('.sidebar--left .nav-pills__unread-indicator', 'background:' + theme.mentionBj, 1);
- changeCss('.sidebar--left .badge', 'background:' + theme.mentionBj, 1);
+ changeCss('.sidebar--left .badge', 'background:' + theme.mentionBj + '!important;', 1);
}
if (theme.mentionColor) {
changeCss('.sidebar--left .nav-pills__unread-indicator', 'color:' + theme.mentionColor, 2);
- changeCss('.sidebar--left .badge', 'color:' + theme.mentionColor, 2);
+ changeCss('.sidebar--left .badge', 'color:' + theme.mentionColor + '!important;', 2);
}
if (theme.centerChannelBg) {
@@ -686,6 +687,8 @@ export function applyTheme(theme) {
changeCss('.popover.top>.arrow:after, .tip-overlay.tip-overlay--chat .arrow', 'border-top-color:' + theme.centerChannelBg, 1);
changeCss('@media(min-width: 768px){.search-bar__container .search__form .search-bar, .form-control', 'background:' + theme.centerChannelBg, 1);
changeCss('.attachment__content', 'background:' + theme.centerChannelBg, 1);
+ changeCss('body', 'scrollbar-face-color:' + theme.centerChannelBg, 2);
+ changeCss('body', 'scrollbar-track-color:' + theme.centerChannelBg, 2);
}
if (theme.centerChannelColor) {
@@ -705,7 +708,7 @@ export function applyTheme(theme) {
changeCss('.markdown__table tbody tr:nth-child(2n)', 'background:' + changeOpacity(theme.centerChannelColor, 0.07), 1);
changeCss('.channel-header__info>div.dropdown .header-dropdown__icon', 'color:' + changeOpacity(theme.centerChannelColor, 0.8), 1);
changeCss('.channel-header #member_popover', 'color:' + changeOpacity(theme.centerChannelColor, 0.8), 1);
- changeCss('.custom-textarea, .custom-textarea:focus, .preview-container .preview-div, .post-image__column .post-image__details, .sidebar--right .sidebar-right__body, .markdown__table th, .markdown__table td, .suggestion-content, .modal .modal-content, .settings-modal .settings-table .settings-content .divider-light, .webhooks__container, .dropdown-menu, .modal .modal-header, .popover', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
+ changeCss('.custom-textarea, .custom-textarea:focus, .preview-container .preview-div, .post-image__column .post-image__details, .sidebar--right .sidebar-right__body, .markdown__table th, .markdown__table td, .suggestion-content, .modal .modal-content, .modal .settings-modal .settings-table .settings-content .divider-light, .webhooks__container, .dropdown-menu, .modal .modal-header, .popover', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
changeCss('.popover.bottom>.arrow', 'border-bottom-color:' + changeOpacity(theme.centerChannelColor, 0.25), 1);
changeCss('.search-help-popover .search-autocomplete__divider span', 'color:' + changeOpacity(theme.centerChannelColor, 0.7), 1);
changeCss('.popover.right>.arrow', 'border-right-color:' + changeOpacity(theme.centerChannelColor, 0.25), 1);
@@ -726,18 +729,20 @@ export function applyTheme(theme) {
changeCss('.date-separator .separator__hr, .modal-footer, .modal .custom-textarea', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
changeCss('.search-item-container, .post-right__container .post.post--root', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.1), 1);
changeCss('.modal .custom-textarea:focus', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.3), 1);
- changeCss('.channel-intro, .settings-modal .settings-table .settings-content .divider-dark, hr, .settings-modal .settings-table .settings-links, .settings-modal .settings-table .settings-content .appearance-section .theme-elements__header', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
+ changeCss('.channel-intro, .modal .settings-modal .settings-table .settings-content .divider-dark, hr, .modal .settings-modal .settings-table .settings-links, .modal .settings-modal .settings-table .settings-content .appearance-section .theme-elements__header', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
changeCss('.post.current--user .post__body, .post.post--comment.other--root.current--user .post-comment, pre, .post-right__container .post.post--root', 'background:' + changeOpacity(theme.centerChannelColor, 0.07), 1);
changeCss('.post.current--user .post__body, .post.post--comment.other--root.current--user .post-comment, .post.same--root.post--comment .post__body, .modal .more-table tbody>tr td, .member-div:first-child, .member-div, .access-history__table .access__report, .activity-log__table', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.1), 2);
changeCss('@media(max-width: 1800px){.inner__wrap.move--left .post.post--comment.same--root', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.07), 2);
- changeCss('.post:hover, .modal .more-table tbody>tr:hover td, .settings-modal .settings-table .settings-content .section-min:hover', 'background:' + changeOpacity(theme.centerChannelColor, 0.07), 1);
+ changeCss('.post:hover, .modal .more-table tbody>tr:hover td, .modal .settings-modal .settings-table .settings-content .section-min:hover', 'background:' + changeOpacity(theme.centerChannelColor, 0.07), 1);
changeCss('.date-separator.hovered--before:after, .date-separator.hovered--after:before, .new-separator.hovered--after:before, .new-separator.hovered--before:after', 'background:' + changeOpacity(theme.centerChannelColor, 0.07), 1);
changeCss('.command-name:hover, .mentions-name:hover, .suggestion--selected, .dropdown-menu>li>a:focus, .dropdown-menu>li>a:hover, .bot-indicator', 'background:' + changeOpacity(theme.centerChannelColor, 0.15), 1);
changeCss('code, .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control', 'background:' + changeOpacity(theme.centerChannelColor, 0.1), 1);
changeCss('@media(min-width: 960px){.post.current--user:hover .post__body ', 'background: none;', 1);
changeCss('.sidebar--right', 'color:' + theme.centerChannelColor, 2);
- changeCss('.search-help-popover .search-autocomplete__item:hover, .settings-modal .settings-table .settings-content .appearance-section .theme-elements__body', 'background:' + changeOpacity(theme.centerChannelColor, 0.05), 1);
+ changeCss('.search-help-popover .search-autocomplete__item:hover, .modal .settings-modal .settings-table .settings-content .appearance-section .theme-elements__body', 'background:' + changeOpacity(theme.centerChannelColor, 0.05), 1);
changeCss('.search-help-popover .search-autocomplete__item.selected', 'background:' + changeOpacity(theme.centerChannelColor, 0.15), 1);
+ changeCss('::-webkit-scrollbar-thumb', 'background:' + changeOpacity(theme.centerChannelColor, 0.4), 1);
+ changeCss('body', 'scrollbar-arrow-color:' + theme.centerChannelColor, 4);
}
if (theme.newMessageSeparator) {
diff --git a/web/sass-files/sass/partials/_base.scss b/web/sass-files/sass/partials/_base.scss
index ee6a6b955..4dcf0ff85 100644
--- a/web/sass-files/sass/partials/_base.scss
+++ b/web/sass-files/sass/partials/_base.scss
@@ -224,3 +224,33 @@ a:focus, a:hover {
margin-bottom: 0.25em;
background-size: contain;
}
+
+
+// Scrollbar Css
+
+::-webkit-scrollbar
+{
+ width: 8px; /* for vertical scrollbars */
+ height: 8px; /* for horizontal scrollbars */
+}
+
+::-webkit-scrollbar-track
+{
+ background: rgba(0, 0, 0, 0.1);
+}
+
+::-webkit-scrollbar-thumb
+{
+ @include border-radius(5px);
+ background: rgba(0, 0, 0, 0.4);
+}
+
+body{
+ scrollbar-face-color: rgba(0, 0, 0, 0.1);
+ scrollbar-shadow-color: #2D2C4D;
+ scrollbar-highlight-color:#7D7E94;
+ scrollbar-3dlight-color: #7D7E94;
+ scrollbar-darkshadow-color: #2D2C4D;
+ scrollbar-track-color: rgba(0, 0, 0, 0.1);
+ scrollbar-arrow-color: #C1C1D1;
+} \ No newline at end of file
diff --git a/web/sass-files/sass/partials/_modal.scss b/web/sass-files/sass/partials/_modal.scss
index ca83c77da..5b02652af 100644
--- a/web/sass-files/sass/partials/_modal.scss
+++ b/web/sass-files/sass/partials/_modal.scss
@@ -23,17 +23,29 @@
border-radius: 50px;
margin-right: 8px;
}
+ .more-row {
+ display: flex;
+
+ .more-details {
+ flex-grow: 1;
+ flex-shrink: 1;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ .more-actions {
+ flex-grow: 0;
+ flex-shrink: 0;
+ }
+ }
.more-name {
font-weight: 600;
font-size: 0.95em;
- overflow: hidden;
- text-overflow: ellipsis;
+ white-space: nowrap;
}
.more-description {
@include opacity(0.7);
display: block;
- overflow: hidden;
- text-overflow: ellipsis;
+ white-space: nowrap;
}
tbody {
> tr {
@@ -49,7 +61,7 @@
width: 100%;
@include legacy-pie-clearfix;
text-overflow: ellipsis;
- padding: 8px 8px 8px 15px;
+ padding: 8px 15px;
&.padding--equal {
padding: 8px;
}
diff --git a/web/sass-files/sass/partials/_post.scss b/web/sass-files/sass/partials/_post.scss
index 4478b3f15..39cebe856 100644
--- a/web/sass-files/sass/partials/_post.scss
+++ b/web/sass-files/sass/partials/_post.scss
@@ -58,22 +58,37 @@ body.ios {
box-shadow: none;
white-space: normal;
}
- .textbox-preview-link, .textbox-help-link {
+ .textbox-help-link {
position: absolute;
z-index: 3;
bottom: -23px;
font-size: 13px;
cursor: pointer;
}
- .textbox-preview-link {
- right: 45px;
- }
.textbox-help-link {
right: 0;
}
min-height:36px;
}
+.help_format_text {
+ position: absolute;
+ bottom: -23px;
+ right: 40px;
+ font-size: 0.85em;
+ @include opacity(0);
+ @include single-transition(all 0.2s ease);
+
+ b, i, code {
+ margin-right: 3px;
+ }
+ .textbox-preview-link{
+ font-size: 13px;
+ cursor: pointer;
+ margin-left: 15px;
+ }
+}
+
.date-separator, .new-separator {
text-align: center;
height: 2em;
@@ -709,6 +724,12 @@ body.ios {
margin-top: 1.4em;
}
+ li {
+ > p {
+ margin-top: 10px;
+ }
+ }
+
img {
max-height: 400px;
}
@@ -765,14 +786,12 @@ body.ios {
.post__embed-visibility {
cursor: pointer;
- display: block;
font: normal normal normal 14px/1 FontAwesome;
text-rendering: auto;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
- font-size: 0;
- width: 30px;
- margin-top: -5px;
+ margin: 5px 0 10px;
+ display: inline-block;
&:hover{
text-decoration: none;
diff --git a/web/sass-files/sass/partials/_post_right.scss b/web/sass-files/sass/partials/_post_right.scss
index 2b48fd2c2..5df6fdc01 100644
--- a/web/sass-files/sass/partials/_post_right.scss
+++ b/web/sass-files/sass/partials/_post_right.scss
@@ -22,6 +22,12 @@
}
+
+ .help_format_text {
+ bottom: -63px;
+ right: auto;
+ }
+
.post {
&.post--root {
diff --git a/web/sass-files/sass/partials/_responsive.scss b/web/sass-files/sass/partials/_responsive.scss
index 0f978a806..a9a572768 100644
--- a/web/sass-files/sass/partials/_responsive.scss
+++ b/web/sass-files/sass/partials/_responsive.scss
@@ -98,8 +98,6 @@
.post {
- background: none !important;
-
.post__dropdown {
line-height: 9px;
text-decoration: none;
@@ -120,9 +118,9 @@
visibility: visible;
display: none;
- &.icon--show {
- display: inline-block;
- }
+ &.icon--show {
+ display: inline-block;
+ }
}
@@ -310,6 +308,11 @@
}
}
}
+ .row--invite {
+ .col-sm-6 {
+ padding: 0;
+ }
+ }
.modal {
.info__label {
text-align: left;
@@ -319,6 +322,10 @@
.modal-action {
margin-top: 10px;
}
+ button.close {
+ font-weight: normal;
+ font-size: 27px;
+ }
.modal-title {
float: none;
max-width: 90%;
@@ -332,95 +339,89 @@
}
}
}
- }
- .row--invite {
- .col-sm-6 {
- padding: 0;
- }
- }
- .settings-modal {
- &.display--content {
- .modal-header {
- display: none;
- }
- .settings-table {
- display: block;
- .settings-content {
- &.minimize-settings {
- display: block;
- }
- .section-min:hover {
- background: none;
- }
- .no-padding--left {
- padding-left: 15px;
- }
- }
- .settings-links {
+ .settings-modal {
+ &.display--content {
+ .modal-header {
display: none;
}
- .modal-header {
+ .settings-table {
display: block;
- position: absolute;
- top: 0;
- width: 100%;
- z-index: 5;
- }
- .modal-title {
- padding-left: 20px;
- }
- .user-settings {
- .tab-header {
- display: none;
+ .settings-content {
+ &.minimize-settings {
+ display: block;
+ }
+ .section-min:hover {
+ background: none;
+ }
+ .no-padding--left {
+ padding-left: 15px;
+ }
}
- .divider-dark.first {
+ .settings-links {
display: none;
}
+ .modal-header {
+ display: block;
+ position: absolute;
+ top: 0;
+ width: 100%;
+ z-index: 5;
+ .modal-title {
+ width: 100%;
+ text-align: center;
+ }
+ }
+ .user-settings {
+ .tab-header {
+ display: none;
+ }
+ .divider-dark.first {
+ display: none;
+ }
+ }
}
}
- }
- .settings-table {
- .nav {
- &.position--top {
+ .settings-table {
+ padding: 0;
+ .nav {
+ &.position--top {
+ top: auto;
+ }
+ position: relative;
top: auto;
+ width: 100%;
}
- position: relative;
- top: auto;
- width: 100%;
- }
- .settings-content {
- .section-edit {
- position: absolute;
- top: 14px;
- right: 0;
- padding-right: 0;
- .fa {
- display: inline-block;
+ .settings-content {
+ .section-edit {
+ position: absolute;
+ top: 14px;
+ right: 0;
+ padding-right: 0;
+ .fa {
+ display: inline-block;
+ }
}
- }
- &.minimize-settings {
- padding: 0;
- display: none;
- .user-settings {
- padding: 70px 20px 30px;
+ &.minimize-settings {
+ padding: 0;
+ display: none;
+ .user-settings {
+ padding: 70px 20px 30px;
+ }
+ }
+ .section-min:hover {
+ background: none !important;
}
}
- .section-min:hover {
- background: none !important;
- }
- }
- .settings-links {
- background: #fff;
- }
- .nav {
- > li {
- > a {
- border-top: 1px solid #ddd;
- font-size: 1.1em;
- line-height: 2.7;
- color: #555;
- .glyphicon {
- margin-left: 7px;
+ .nav {
+ > li {
+ > a {
+ border-top: 1px solid #ddd;
+ font-size: 1.1em;
+ line-height: 2.7;
+ color: #555;
+ .glyphicon {
+ margin-left: 7px;
+ }
}
}
}
@@ -572,7 +573,8 @@
.glyphicon-refresh-animate {
right: 33px;
top: 15px;
- color: #aaa;
+ color: #fff;
+ color: rgba(255,255,255,0.5);
}
.form-control {
border: none;
@@ -800,22 +802,24 @@
}
}
@media screen and (max-width: 480px) {
- .settings-modal {
+ .modal {
+ .settings-modal {
- .settings-table {
+ .settings-table {
- .security-links {
- margin-bottom: 10px;
- display: block;
+ .security-links {
+ margin-bottom: 10px;
+ display: block;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
- &:last-child {
- margin-bottom: 0;
}
}
- }
-
+ }
}
.tip-overlay.tip-overlay--sidebar {
diff --git a/web/sass-files/sass/partials/_settings.scss b/web/sass-files/sass/partials/_settings.scss
index 99b564fe5..6574dd927 100644
--- a/web/sass-files/sass/partials/_settings.scss
+++ b/web/sass-files/sass/partials/_settings.scss
@@ -12,358 +12,369 @@
}
}
-.settings-modal {
- width:800px;
- max-width: 100%;
- .modal-content {
- width:800px;
- max-width: 100%;
- }
- .modal-back {
- width: 40px;
- height: 56px;
- background: url("../images/arrow-left.png") no-repeat;
- @include background-size(8px 13px);
- background-position: center;
- top: 0;
- left: 0;
- cursor: pointer;
- position: absolute;
- }
- .modal-body {
- padding: 0;
- }
- li {
- list-style: none;
- }
- label {
- font-weight: 600;
- }
-
- .no-padding--left {
- padding-left: 0;
- }
- .padding-top {
- padding-top: 7px;
- &.x2 {
- padding-top: 14px;
- }
- &.x3 {
- padding-top: 21px;
+.modal {
+ .settings-modal {
+ width: 800px;
+ .modal-back {
+ width: 50px;
+ height: 40px;
+ top: 12px;
+ font-size: 27px;
+ font-weight: normal;
+ line-height: 32px;
+ position: absolute;
+ left: 0;
+ text-align: center;
+ .fa {
+ line-height: inherit;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ left: 0;
+ }
}
- }
- .padding-bottom {
- padding-bottom: 7px;
- &.x2 {
- padding-bottom: 14px;
+ .modal-body {
+ padding: 0;
+ margin: 0 auto;
+ min-height: calc(100% - 62px);
}
- &.x3 {
- padding-bottom: 21px;
+ li {
+ list-style: none;
}
- .control-label {
+ label {
font-weight: 600;
- &.text-left {
- text-align: left;
- }
}
- }
- .profile-img {
- width: 128px;
- height: 128px;
- }
- .settings-table {
- display: table;
- table-layout: fixed;
- width: 100%;
- > div {
- display: table-cell;
- vertical-align: top;
+
+ .no-padding--left {
+ padding-left: 0;
}
- .nav {
- position: fixed;
- width: 179px;
- &.position--top {
- top: 57px;
+ .padding-top {
+ padding-top: 7px;
+ &.x2 {
+ padding-top: 14px;
+ }
+ &.x3 {
+ padding-top: 21px;
}
}
- .security-links {
- margin-right: 20px;
- .fa {
- margin-right: 6px;
+ .padding-bottom {
+ padding-bottom: 7px;
+ &.x2 {
+ padding-bottom: 14px;
+ }
+ &.x3 {
+ padding-bottom: 21px;
+ }
+ .control-label {
+ font-weight: 600;
+ &.text-left {
+ text-align: left;
+ }
}
}
- .settings-links {
- width: 180px;
- background: #FAFAFA;
- border-right: 1px solid #DDD;
+ .profile-img {
+ width: 128px;
+ height: 128px;
}
- .settings-content {
- padding: 0px 20px 30px;
- .modal-header {
- display: none;
+ .settings-table {
+ max-width: 1000px;
+ margin: 0 auto;
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+ > div {
+ display: table-cell;
+ vertical-align: top;
}
- .section-min {
- padding: 1em 0;
- margin-bottom: 0;
- cursor: pointer;
- position: relative;
- @include clearfix;
- &:hover {
- background: #f9f9f9;
- }
- &:hover .fa {
- display: inline-block;
- }
- &:hover .section-edit {
- text-decoration: underline;
+ .nav {
+ position: fixed;
+ width: 179px;
+ &.position--top {
+ top: 57px;
}
}
-
- .section-max {
- background: rgba(black, 0.05);
- padding: 1em 0 1.3em;
- margin-bottom: 0;
- @include clearfix;
- .section-title {
- margin-bottom: 10px;
+ .security-links {
+ margin-right: 20px;
+ .fa {
+ margin-right: 6px;
}
}
-
- .appearance-section {
- .theme-group {
- .input-group-addon {
- padding: 4px 5px;
- width: 40px;
- }
- img {
- border: 1px solid rgba(black, 0.15);
- width: 29px;
- }
+ .settings-links {
+ width: 180px;
+ }
+ .settings-content {
+ padding: 0px 20px 30px;
+ .modal-header {
+ display: none;
}
- .group--code {
- select {
- padding-right: 25px;
+ .section-min {
+ padding: 1em 0;
+ margin-bottom: 0;
+ cursor: pointer;
+ position: relative;
+ @include clearfix;
+ &:hover {
+ background: #f9f9f9;
}
- select::-ms-expand {
- display: none;
- }
- &:before {
- pointer-events: none;
- position: absolute;
- top: 11px;
- right: 50px;
- z-index: 5;
- content: "\f0d7";
+ &:hover .fa {
display: inline-block;
- font: normal normal normal 14px/1 FontAwesome;
- font-size: inherit;
- text-rendering: auto;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
}
- select {
- -moz-appearance:none;
- -webkit-appearance:none;
- appearance:none;
- }
- }
- .premade-themes {
- margin-bottom: 10px;
- .theme-label {
- font-weight: 400;
- margin-top: 5px;
- }
- img {
- border: 3px solid transparent;
+ &:hover .section-edit {
+ text-decoration: underline;
+ }
}
- .active {
- img {
- border-color: $primary-color;
+
+ .section-max {
+ background: rgba(black, 0.05);
+ padding: 1em 0 1.3em;
+ margin-bottom: 0;
+ @include clearfix;
+ .section-title {
+ margin-bottom: 10px;
}
}
- }
- .theme-elements {
- padding-left:15px;
+ .appearance-section {
+ .theme-group {
+ .input-group-addon {
+ padding: 4px 5px;
+ width: 40px;
+ }
+ img {
+ border: 1px solid rgba(black, 0.15);
+ width: 29px;
+ }
+ }
+ .group--code {
+ select {
+ padding-right: 25px;
+ }
+ select::-ms-expand {
+ display: none;
+ }
+ &:before {
+ pointer-events: none;
+ position: absolute;
+ top: 11px;
+ right: 50px;
+ z-index: 5;
+ content: "\f0d7";
+ display: inline-block;
+ font: normal normal normal 14px/1 FontAwesome;
+ font-size: inherit;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ }
+ select {
+ -moz-appearance:none;
+ -webkit-appearance:none;
+ appearance:none;
+ }
+ }
+ .premade-themes {
+ margin-bottom: 10px;
+ .theme-label {
+ font-weight: 400;
+ margin-top: 5px;
+ }
+ img {
+ border: 3px solid transparent;
+ }
+ .active {
+ img {
+ border-color: $primary-color;
+ }
+ }
+ }
- .element {
- margin-right:10px;
+ .theme-elements {
+ padding-left:15px;
- &:nth-child(2n) {
- margin-right: 0;
- }
+ .element {
+ margin-right:10px;
- }
- }
+ &:nth-child(2n) {
+ margin-right: 0;
+ }
- .theme-elements__header {
- margin: 10px 20px 0px 0;
- border-bottom: 1px solid #ccc;
- padding: 5px 0 10px;
- font-size: em(13.5px);
- font-weight: 600;
- cursor: pointer;
+ }
+ }
- .fa-minus {
- display: none;
- }
+ .theme-elements__header {
+ margin: 10px 20px 0px 0;
+ border-bottom: 1px solid #ccc;
+ padding: 5px 0 10px;
+ font-size: em(13.5px);
+ font-weight: 600;
+ cursor: pointer;
+
+ .fa-minus {
+ display: none;
+ }
+
+ &.open {
+ .fa-minus {
+ display: inline-block;
+ }
+ .fa-plus {
+ display: none;
+ }
+ }
+
+ .header__icon {
+ float: right;
+ @include opacity(0.5);
+ }
- &.open {
- .fa-minus {
- display: inline-block;
}
- .fa-plus {
+
+ .theme-elements__body {
+ padding-top: 5px;
display: none;
+ @include legacy-pie-clearfix;
+ background: rgba(255, 255, 255, 0.05);
+ padding: 20px 0 0 20px;
+ margin: 0 20px 0 0;
+ @include border-radius(0 0 3px 3px);
}
- }
- .header__icon {
- float: right;
- @include opacity(0.5);
+ .custom-label {
+ white-space: nowrap;
+ font-weight: normal;
+ font-size: 12px;
+ width: 100%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ margin-bottom: 0;
+ }
+ .input-group-addon {
+ background: transparent;
+ }
+ .radio {
+ label {
+ font-weight: 600;
+ }
+ }
}
- }
-
- .theme-elements__body {
- padding-top: 5px;
- display: none;
- @include legacy-pie-clearfix;
- background: rgba(255, 255, 255, 0.05);
- padding: 20px 0 0 20px;
- margin: 0 20px 0 0;
- @include border-radius(0 0 3px 3px);
- }
-
- .custom-label {
- white-space: nowrap;
- font-weight: normal;
- font-size: 12px;
- width: 100%;
- overflow: hidden;
- text-overflow: ellipsis;
- margin-bottom: 0;
- }
- .input-group-addon {
- background: transparent;
- }
- .radio {
- label {
+ .section-title {
+ margin-bottom: 5px;
font-weight: 600;
+ padding-right: 50px;
}
- }
- }
- .section-title {
- margin-bottom: 5px;
- font-weight: 600;
- padding-right: 50px;
- }
+ .section-edit {
+ text-align: right;
+ margin-bottom: 5px;
+ .fa {
+ margin-right: 5px;
+ font-size: 12px;
+ @include opacity(0.5);
+ display: none;
+ &.fa-chevron-down {
+ top: -1px;
+ margin-right: 0;
+ position: relative;
+ }
+ }
+ }
- .section-edit {
- text-align: right;
- margin-bottom: 5px;
- .fa {
- margin-right: 5px;
- font-size: 12px;
- @include opacity(0.5);
- display: none;
- }
- }
+ .section-describe {
+ @include opacity(0.7);
+ white-space:pre;
+ @include clearfix;
+ text-overflow: ellipsis;
+ }
- .section-describe {
- @include opacity(0.7);
- white-space:pre;
- @include clearfix;
- text-overflow: ellipsis;
- }
+ .divider-dark {
+ border-bottom:1px solid #aaaaaa;
+ }
- .divider-dark {
- border-bottom:1px solid #aaaaaa;
- }
+ .divider-light {
+ border-bottom:1px solid lightgrey;
+ }
- .divider-light {
- border-bottom:1px solid lightgrey;
- }
+ .setting-list {
+ padding: 0;
+ list-style-type:none;
+ }
- .setting-list {
- padding: 0;
- list-style-type:none;
- }
+ .setting-list__hint {
+ margin-top: 20px;
+ }
- .setting-list__hint {
- margin-top: 20px;
- }
+ .mentions-input {
+ margin-top: 10px;
+ }
- .mentions-input {
- margin-top: 10px;
- }
+ .setting-list-item {
+ margin-top:7px;
+ }
+ .has-error {
+ color: #a94442;
+ }
- .setting-list-item {
- margin-top:7px;
- }
- .has-error {
- color: #a94442;
- }
+ .file-status {
+ font-size: 13px;
+ margin-top: 8px;
+ color: #555;
+ }
- .file-status {
- font-size: 13px;
- margin-top: 8px;
- color: #555;
- }
+ .confirm-import {
+ padding: 4px 10px;
+ margin: 10px 0;
+ }
- .confirm-import {
- padding: 4px 10px;
- margin: 10px 0;
+ }
}
-
}
-}
-.nav-pills {
- > li {
- margin: 0;
- a {
- border-radius: 0;
- color: #777;
- }
- .glyphicon {
- width: 25px;
- top: 2px;
- }
- &:hover {
+ .nav-pills {
+ > li {
+ margin: 0;
a {
- background: #E6F2FA;
+ padding: 8px 5px 8px 15px;
+ border-radius: 0;
+ color: #777;
}
- }
- &.active {
- a {
- color: #111;
- background-color: #E1E1E1;
- &:before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- width: 5px;
- height: 100%;
- background: #000;
+ .glyphicon {
+ width: 25px;
+ top: 2px;
+ }
+ &:hover {
+ a {
+ background-color: rgba(black, 0.1);
}
}
- a, a:hover, a:focus {
- padding-right: 10px;
- background-color: rgba(black, 0.1);
- border-radius: 0;
- font-weight: 400;
- position: relative;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
+ &.active {
+ a {
+ color: #111;
+ background-color: #E1E1E1;
+ &:before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 5px;
+ height: 100%;
+ background: #000;
+ }
+ }
+ a, a:hover, a:focus {
+ background-color: rgba(black, 0.1);
+ border-radius: 0;
+ font-weight: 400;
+ position: relative;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
}
}
}
-}
-h3 {
- font-size: em(20px);
-}
+ h3 {
+ font-size: em(20px);
+ }
}
.channel-settings {
diff --git a/web/static/i18n/en.json b/web/static/i18n/en.json
index 96672eba6..236a6c282 100644
--- a/web/static/i18n/en.json
+++ b/web/static/i18n/en.json
@@ -561,7 +561,7 @@
"channel_loader.wrote": " wrote: ",
"channel_members_modal.addNew": " Add New Members",
"channel_members_modal.close": "Close",
- "channel_members_modal.removeMember": "Remove Member",
+ "channel_members_modal.remove": "Remove",
"channel_memebers_modal.members": " Members",
"channel_modal.cancel": "Cancel",
"channel_modal.channel": "Channel",
@@ -972,7 +972,7 @@
"ldap_signup.team_error": "Please enter a team name",
"suggestion.mention.all": "Notifies everyone in the team",
"suggestion.mention.channel": "Notifies everyone in the channel",
- "suggestion.search.private": "Public Groups",
+ "suggestion.search.private": "Private Groups",
"suggestion.search.public": "Public Channels",
"team_export_tab.download": "download",
"team_export_tab.export": "Export",
@@ -1060,9 +1060,15 @@
"team_signup_welcome.validEmailError": "Please enter a valid email address",
"team_signup_welcome.welcome": "Welcome to:",
"team_signup_welcome.yes": "Yes, this address is correct",
+ "textbox.bold": "**bold**",
"textbox.edit": "Edit message",
"textbox.help": "Help",
+ "textbox.inlinecode": "`inline code`",
+ "textbox.italic": "_italic_",
+ "textbox.preformatted": "```preformatted```",
"textbox.preview": "Preview",
+ "textbox.quote": ">quote",
+ "textbox.strike": "strike",
"tutorial_intro.allSet": "You’re all set",
"tutorial_intro.end": "Click “Next” to enter Town Square. This is the first channel teammates see when they sign up. Use it for posting updates everyone needs to know.",
"tutorial_intro.invite": "Invite teammates",
@@ -1295,4 +1301,4 @@
"view_image_popover.download": "Download",
"view_image_popover.file": "File {count} of {total}",
"view_image_popover.publicLink": "Get Public Link"
-} \ No newline at end of file
+}
diff --git a/web/static/i18n/es.json b/web/static/i18n/es.json
index 77779847f..0f3bc02d7 100644
--- a/web/static/i18n/es.json
+++ b/web/static/i18n/es.json
@@ -561,7 +561,7 @@
"channel_loader.wrote": " escribió: ",
"channel_members_modal.addNew": " Agregar nuevos Miembros",
"channel_members_modal.close": "Cerrar",
- "channel_members_modal.removeMember": "Elminar Miembro",
+ "channel_members_modal.remove": "Eliminar",
"channel_memebers_modal.members": " Miembros",
"channel_modal.cancel": "Cancelar",
"channel_modal.channel": "Canal",
@@ -1054,9 +1054,15 @@
"team_signup_welcome.validEmailError": "Por favor ingresa una dirección de correo electrónico válida",
"team_signup_welcome.welcome": "Bienvenido a:",
"team_signup_welcome.yes": "Sí, esta dirección es correcta",
+ "textbox.bold": "**negritas**",
"textbox.edit": "Editar mensaje",
"textbox.help": "Ayuda",
+ "textbox.inlinecode": "`código`",
+ "textbox.italic": "_italica_",
+ "textbox.preformatted": "```preformateado```",
"textbox.preview": "Previsualizar",
+ "textbox.quote": ">cita",
+ "textbox.strike": "tachado",
"tutorial_intro.allSet": "Ya estás listo para comenzar",
"tutorial_intro.end": "Pincha “Siguiente” para entrar al Canal General. Este es el primer canal que ven tus compañeros cuando ingresan. Utilizalo para mandar mensajes que todos deben leer.",
"tutorial_intro.invite": "Invitar compañeros",
@@ -1289,4 +1295,4 @@
"view_image_popover.download": "Descargar",
"view_image_popover.file": "Archivo {count} de {total}",
"view_image_popover.publicLink": "Obtener Enlace Público"
-} \ No newline at end of file
+}
diff --git a/web/static/i18n/pt.json b/web/static/i18n/pt.json
index eaec8ba78..f4b998ded 100644
--- a/web/static/i18n/pt.json
+++ b/web/static/i18n/pt.json
@@ -558,7 +558,6 @@
"channel_loader.wrote": " escreveu: ",
"channel_members_modal.addNew": " Adicionar Novos Membros",
"channel_members_modal.close": "Fechar",
- "channel_members_modal.removeMember": "Remover Membro",
"channel_memebers_modal.members": " Membros",
"channel_modal.cancel": "Cancelar",
"channel_modal.channel": "Canal",
@@ -961,7 +960,6 @@
"sso_signup.team_error": "Por favor entre o nome da equipe",
"suggestion.mention.all": "Notificar todo mundo na equipe",
"suggestion.mention.channel": "Notifica todos no canal",
- "suggestion.search.private": "Grupos Públicos",
"suggestion.search.public": "Canais Públicos",
"team_export_tab.download": "download",
"team_export_tab.export": "Exportar",
@@ -1049,9 +1047,15 @@
"team_signup_welcome.validEmailError": "Por favor entre um endereço de e-mail válido",
"team_signup_welcome.welcome": "Bem-vindo:",
"team_signup_welcome.yes": "Sim, este endereço de email está correto",
+ "textbox.bold": "**negrito**",
"textbox.edit": "Editar mensagem",
"textbox.help": "Ajuda",
+ "textbox.inlinecode": "`código`",
+ "textbox.italic": "_itálico_",
+ "textbox.preformatted": "```pre-formatado```",
"textbox.preview": "Pré-visualização",
+ "textbox.quote": ">citado",
+ "textbox.strike": "tachado",
"tutorial_intro.allSet": "Está tudo pronto",
"tutorial_intro.end": "Clique em “Próximo” para entrar Town Square. Este é o primeiro canal que sua equipe de trabalho vê quando eles se inscrevem. Use para postar atualizações que todos precisam saber.",
"tutorial_intro.invite": "Convidar pessoas para equipe",