Commit 9926fe8a authored by Harrison Healey's avatar Harrison Healey Committed by GitHub
Browse files

Merge release 3.2 into master (#3548)

* Bumping version to: 3.2.0-rc1

* PLT-2863 fixing bad merge that broke this PR (#3523)

* PLT-2863 adding remove user from team

* PLT-2863 adding the client side UI

* Fixing trailing space

* Fixing reported issues

* Adding documentatino

* Switching to final javascript driver

* Fixing bad merge

* Fixing bad merge

* PLT-3538 Fix Login page doesn't show SAML option if gitlab is enabled (#3524)

* Login error messages fix (#3525)

* daily translations 20160708 (#3533)

* Fixed permissions when getting a file attachment to use the correct user id (#3535)

* PLT-3575 Fix Cannot upload certificates with .cer file extension on SAML (#3534)

* PLT-3560 blocking adding to channel once user is removed (#3537)

* Always allow system admins to see the Integrations sidebar (#3536)

* Plt 3475 - Post control improvements (#3538)

* Adding class to post when dropdown is active.

* plt-3475 - Post controls improvements

* daily translations 20160711 (#3544)
parent 903d2d6a
......@@ -205,6 +205,19 @@ export function emitPostFocusRightHandSideFromSearch(post, isMentionSearch) {
);
}
export function emitLeaveTeam() {
Client.removeUserFromTeam(
TeamStore.getCurrentId(),
UserStore.getCurrentId(),
() => {
// DO nothing. The websocket should cause a re-direct
},
(err) => {
AsyncClient.dispatchError(err, 'removeUserFromTeam');
}
);
}
export function emitLoadMorePostsEvent() {
const id = ChannelStore.getCurrentId();
loadMorePostsTop(id, false);
......
......@@ -14,6 +14,7 @@ import Client from 'utils/web_client.jsx';
import * as Utils from 'utils/utils.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
import * as GlobalActions from 'actions/global_actions.jsx';
import * as UserActions from 'actions/user_actions.jsx';
import {handleNewPost} from 'actions/post_actions.jsx';
import Constants from 'utils/constants.jsx';
......@@ -232,6 +233,7 @@ function handleLeaveTeamEvent(msg) {
browserHistory.push('/');
}
} else if (TeamStore.getCurrentId() === msg.team_id) {
UserActions.getMoreDmList();
GlobalActions.emitProfilesForDmList();
}
}
......
......@@ -166,7 +166,7 @@ export default class SamlSettings extends AdminSettings {
}
uploadingText={Utils.localizeMessage('admin.saml.uploading.certificate', 'Uploading Certificate...')}
disabled={!this.state.enable}
fileType='.crt'
fileType='.crt,.cer'
onSubmit={this.uploadCertificate}
/>
);
......@@ -260,7 +260,7 @@ export default class SamlSettings extends AdminSettings {
}
uploadingText={Utils.localizeMessage('admin.saml.uploading.certificate', 'Uploading Certificate...')}
disabled={!this.state.enable || !this.state.encrypt}
fileType='.crt'
fileType='.crt,.cer'
onSubmit={this.uploadCertificate}
/>
);
......
......@@ -45,7 +45,9 @@ export default class BackstageSidebar extends React.Component {
return null;
}
if (window.mm_config.EnableOnlyAdminIntegrations !== 'false' && !TeamStore.isTeamAdmin(this.props.user.id, this.props.team.id)) {
if (window.mm_config.EnableOnlyAdminIntegrations !== 'false' &&
!Utils.isSystemAdmin(this.props.user.roles) &&
!TeamStore.isTeamAdmin(this.props.user.id, this.props.team.id)) {
return null;
}
......
......@@ -484,7 +484,7 @@ export default class LoginController extends React.Component {
loginControls.push(
<a
className='btn btn-custom-login saml'
key='gitlab'
key='saml'
href={'/login/sso/saml' + this.props.location.search}
>
<span>
......
......@@ -18,9 +18,12 @@ export default class Post extends React.Component {
super(props);
this.handleCommentClick = this.handleCommentClick.bind(this);
this.handleDropdownOpened = this.handleDropdownOpened.bind(this);
this.forceUpdateInfo = this.forceUpdateInfo.bind(this);
this.state = {};
this.state = {
dropdownOpened: false
};
}
handleCommentClick(e) {
e.preventDefault();
......@@ -35,11 +38,16 @@ export default class Post extends React.Component {
results: null
});
}
handleDropdownOpened(opened) {
this.setState({
dropdownOpened: opened
});
}
forceUpdateInfo() {
this.refs.info.forceUpdate();
this.refs.header.forceUpdate();
}
shouldComponentUpdate(nextProps) {
shouldComponentUpdate(nextProps, nextState) {
if (!Utils.areObjectsEqual(nextProps.post, this.props.post)) {
return true;
}
......@@ -88,6 +96,14 @@ export default class Post extends React.Component {
return true;
}
if (nextProps.emojis !== this.props.emojis) {
return true;
}
if (nextState.dropdownOpened !== this.state.dropdownOpened) {
return true;
}
return false;
}
render() {
......@@ -187,11 +203,16 @@ export default class Post extends React.Component {
profilePicContainer = '';
}
let dropdownOpenedClass = '';
if (this.state.dropdownOpened) {
dropdownOpenedClass = 'post--hovered';
}
return (
<div>
<div
id={'post_' + post.id}
className={'post ' + sameUserClass + ' ' + compactClass + ' ' + rootUser + ' ' + postType + ' ' + currentUserCss + ' ' + shouldHighlightClass + ' ' + systemMessageClass + ' ' + hideControls}
className={'post ' + sameUserClass + ' ' + compactClass + ' ' + rootUser + ' ' + postType + ' ' + currentUserCss + ' ' + shouldHighlightClass + ' ' + systemMessageClass + ' ' + hideControls + ' ' + dropdownOpenedClass}
>
<div className={'post__content ' + centerClass}>
{profilePicContainer}
......@@ -202,6 +223,7 @@ export default class Post extends React.Component {
sameRoot={this.props.sameRoot}
commentCount={commentCount}
handleCommentClick={this.handleCommentClick}
handleDropdownOpened={this.handleDropdownOpened}
isLastComment={this.props.isLastComment}
sameUser={this.props.sameUser}
user={this.props.user}
......
......@@ -64,6 +64,7 @@ export default class PostHeader extends React.Component {
post={post}
commentCount={this.props.commentCount}
handleCommentClick={this.props.handleCommentClick}
handleDropdownOpened={this.props.handleDropdownOpened}
allowReply='true'
isLastComment={this.props.isLastComment}
sameUser={this.props.sameUser}
......@@ -90,6 +91,7 @@ PostHeader.propTypes = {
commentCount: React.PropTypes.number.isRequired,
isLastComment: React.PropTypes.bool.isRequired,
handleCommentClick: React.PropTypes.func.isRequired,
handleDropdownOpened: React.PropTypes.func.isRequired,
sameUser: React.PropTypes.bool.isRequired,
compactDisplay: React.PropTypes.bool,
displayNameType: React.PropTypes.string,
......
......@@ -18,16 +18,20 @@ export default class PostInfo extends React.Component {
constructor(props) {
super(props);
this.dropdownPosition = this.dropdownPosition.bind(this);
this.handleDropdownClick = this.handleDropdownClick.bind(this);
this.handlePermalink = this.handlePermalink.bind(this);
}
dropdownPosition(e) {
handleDropdownClick(e) {
var position = $('#post-list').height() - $(e.target).offset().top;
var dropdown = $(e.target).closest('.col__reply').find('.dropdown-menu');
if (position < dropdown.height()) {
dropdown.addClass('bottom');
}
}
componentDidMount() {
$('#post_dropdown' + this.props.post.id).on('shown.bs.dropdown', () => this.props.handleDropdownOpened(true));
$('#post_dropdown' + this.props.post.id).on('hidden.bs.dropdown', () => this.props.handleDropdownOpened(false));
}
createDropdown() {
var post = this.props.post;
var isOwner = this.props.currentUser.id === post.user_id;
......@@ -140,14 +144,16 @@ export default class PostInfo extends React.Component {
}
return (
<div>
<div
id={'post_dropdown' + this.props.post.id}
>
<a
href='#'
className='dropdown-toggle post__dropdown theme'
type='button'
data-toggle='dropdown'
aria-expanded='false'
onClick={this.dropdownPosition}
onClick={this.handleDropdownClick}
/>
<ul
className='dropdown-menu'
......@@ -231,6 +237,7 @@ PostInfo.propTypes = {
isLastComment: React.PropTypes.bool.isRequired,
allowReply: React.PropTypes.string.isRequired,
handleCommentClick: React.PropTypes.func.isRequired,
handleDropdownOpened: React.PropTypes.func.isRequired,
sameUser: React.PropTypes.bool.isRequired,
currentUser: React.PropTypes.object.isRequired,
compactDisplay: React.PropTypes.bool,
......
This diff is collapsed.
......@@ -233,15 +233,15 @@
"admin.general.localization.serverLocaleTitle": "Default Server Language:",
"admin.general.log": "Logging",
"admin.general.policy": "Policy",
"admin.general.policy.permissionsAll": "All team members",
"admin.general.policy.permissionsAdmin": "Team and System Admins",
"admin.general.policy.permissionsAll": "All team members",
"admin.general.policy.permissionsSystemAdmin": "System Admins",
"admin.general.policy.teamInviteTitle": "Enable sending team invites from:",
"admin.general.policy.teamInviteDescription": "Selecting \"All team members\" allows any team member to invite others using an email invitation or team invite link.<br/><br/>Selecting \"Team and System Admins\" hides the email invitation and team invite link in the Main Menu from users who are not Team or System Admins. Note: If \"Get Team Invite Link\" is used to share a link, it will need to be regenerated after the desired users joined the team.<br/><br/>Selecting \"System Admins\" hides the email invitation and team invite link in the Main Menu from users who are not System Admins. Note: If \"Get Team Invite Link\" is used to share a link, it will need to be regenerated after the desired users joined the team.",
"admin.general.policy.restrictPublicChannelManagementTitle": "Enable public channel management permissions for:",
"admin.general.policy.restrictPublicChannelManagementDescription": "Selecting \"All team members\" allows any team members to create, delete, rename, and set the header or purpose for public channels.<br/><br/>Selecting \"Team and System Admins\" restricts channel management permissions for public channels to Team and System Admins, including creating, deleting, renaming, and setting the channel header or purpose.<br/><br/>Selecting \"System Admins\" restricts channel management permissions for public channels to System Admins, including creating, deleting, renaming, and setting the channel header or purpose.",
"admin.general.policy.restrictPrivateChannelManagementTitle": "Enable private group management permissions for:",
"admin.general.policy.restrictPrivateChannelManagementDescription": "Selecting \"All team members\" allows any team members to create, delete, rename, and set the header or purpose for private groups.<br/><br/>Selecting \"Team and System Admins\" restricts group management permissions for private groups to Team and System Admins, including creating, deleting, renaming, and setting the group header or purpose.<br/><br/>Selecting \"System Admins\" restricts group management permissions for private groups to System Admins, including creating, deleting, renaming, and setting the group header or purpose.",
"admin.general.policy.restrictPrivateChannelManagementTitle": "Enable private group management permissions for:",
"admin.general.policy.restrictPublicChannelManagementDescription": "Selecting \"All team members\" allows any team members to create, delete, rename, and set the header or purpose for public channels.<br/><br/>Selecting \"Team and System Admins\" restricts channel management permissions for public channels to Team and System Admins, including creating, deleting, renaming, and setting the channel header or purpose.<br/><br/>Selecting \"System Admins\" restricts channel management permissions for public channels to System Admins, including creating, deleting, renaming, and setting the channel header or purpose.",
"admin.general.policy.restrictPublicChannelManagementTitle": "Enable public channel management permissions for:",
"admin.general.policy.teamInviteDescription": "Selecting \"All team members\" allows any team member to invite others using an email invitation or team invite link.<br/><br/>Selecting \"Team and System Admins\" hides the email invitation and team invite link in the Main Menu from users who are not Team or System Admins. Note: If \"Get Team Invite Link\" is used to share a link, it will need to be regenerated after the desired users joined the team.<br/><br/>Selecting \"System Admins\" hides the email invitation and team invite link in the Main Menu from users who are not System Admins. Note: If \"Get Team Invite Link\" is used to share a link, it will need to be regenerated after the desired users joined the team.",
"admin.general.policy.teamInviteTitle": "Enable sending team invites from:",
"admin.general.privacy": "Privacy",
"admin.general.usersAndTeams": "Users and Teams",
"admin.gitab.clientSecretDescription": "Obtain this value via the instructions above for logging into GitLab.",
......@@ -352,17 +352,17 @@
"admin.ldap.serverTitle": "LDAP Server:",
"admin.ldap.skipCertificateVerification": "Skip Certificate Verification",
"admin.ldap.skipCertificateVerificationDesc": "Skips the certificate verification step for TLS or STARTTLS connections. Not recommended for production environments where TLS is required. For testing only.",
"admin.ldap.syncFailure": "Sync Failure: {error}",
"admin.ldap.syncIntervalHelpText": "LDAP Synchronization is the process by which Mattermost updates its users to reflect any updated data on the LDAP server. For example if a name for a user is updated on the LDAP server, the change will be reflected in Mattermost when the synchronization is performed. Accounts that have been removed from the LDAP server will have their active sessions cleared and no longer be able to login to Mattermost. Mattermost will perform this synchronization regularly according to the interval supplied here. For example, if 60 is supplied, Mattermost will update the users every hour.",
"admin.ldap.syncIntervalTitle": "Synchronization Interval (minutes)",
"admin.ldap.syncNowHelpText": "Initiates an LDAP synchronization immediately.",
"admin.ldap.sync_button": "LDAP Synchronize Now",
"admin.ldap.uernameAttrDesc": "The attribute in the LDAP server that will be used to populate the username field in Mattermost. This may be the same as the ID Attribute.",
"admin.ldap.userFilterDisc": "(Optional) Enter an LDAP Filter to use when searching for user objects. Only the users selected by the query will be able to access Mattermost. For Active Directory, the query to filter out disabled users is (&(objectCategory=Person)(!(UserAccountControl:1.2.840.113556.1.4.803:=2))).",
"admin.ldap.userFilterEx": "Ex. \"(objectClass=user)\"",
"admin.ldap.userFilterTitle": "User Filter:",
"admin.ldap.usernameAttrEx": "Ex \"sAMAccountName\"",
"admin.ldap.usernameAttrTitle": "Username Attribute:",
"admin.ldap.sync_button": "LDAP Synchronize Now",
"admin.ldap.syncNowHelpText": "Initiates an LDAP synchronization immediately.",
"admin.ldap.syncFailure": "Sync Failure: {error}",
"admin.license.choose": "Choose File",
"admin.license.chooseFile": "Choose File",
"admin.license.edition": "Edition: ",
......@@ -507,22 +507,17 @@
"admin.save": "Save",
"admin.saving": "Saving Config...",
"admin.security.connection": "Connections",
"admin.security.inviteSalt.disabled": "Invite salt cannot be changed while sending emails is disabled.",
"admin.security.login": "Login",
"admin.security.password": "Password",
"admin.security.passwordResetSalt.disabled": "Password reset salt cannot be changed while sending emails is disabled.",
"admin.security.public_links": "Public Links",
"admin.security.requireEmailVerification.disabled": "Email verification cannot be changed while sending emails is disabled.",
"admin.security.session": "Sessions",
"admin.security.signup": "Signup",
"admin.select_team.close": "Close",
"admin.select_team.select": "Select",
"admin.select_team.selectTeam": "Select Team",
"admin.security.password": "Password",
"admin.security.login": "Login",
"admin.security.connection": "Connections",
"admin.security.public_links": "Public Links",
"admin.security.session": "Sessions",
"admin.security.signup": "Signup",
"admin.security.requireEmailVerification.disabled": "Email verification cannot be changed while sending emails is disabled.",
"admin.security.passwordResetSalt.disabled": "Password reset salt cannot be changed while sending emails is disabled.",
"admin.security.inviteSalt.disabled": "Invite salt cannot be changed while sending emails is disabled.",
"admin.service.attemptDescription": "Number of login attempts allowed before a user is locked out and required to reset their password via email.",
"admin.service.attemptExample": "Ex \"10\"",
"admin.service.attemptTitle": "Maximum Login Attempts:",
......@@ -594,10 +589,10 @@
"admin.sidebar.localization": "Localization",
"admin.sidebar.logging": "Logging",
"admin.sidebar.login": "Login",
"admin.sidebar.password": "Password",
"admin.sidebar.logs": "Logs",
"admin.sidebar.notifications": "Notifications",
"admin.sidebar.other": "OTHER",
"admin.sidebar.password": "Password",
"admin.sidebar.policy": "Policy",
"admin.sidebar.privacy": "Privacy",
"admin.sidebar.publicLinks": "Public Links",
......@@ -714,14 +709,14 @@
"admin.user_item.switchToEmail": "Switch to Email/Password",
"admin.user_item.sysAdmin": "System Admin",
"admin.user_item.teamAdmin": "Team Admin",
"admin.webserverModeGzip": "gzip",
"admin.webserverModeGzipDescription": "The Mattermost server will serve static files compressed with gzip.",
"admin.webserverModeUncompressed": "Uncompressed",
"admin.webserverModeUncompressedDescription": "The Mattermost server will serve static files uncompressed.",
"admin.webserverModeDisabled": "Disabled",
"admin.webserverModeDisabledDescription": "The Mattermost server will not serve static files.",
"admin.webserverModeGzip": "gzip",
"admin.webserverModeGzipDescription": "The Mattermost server will serve static files compressed with gzip.",
"admin.webserverModeHelpText": "gzip compression applies to static content files. It is recommended to enable gzip to improve performance unless your environment has specific restrictions, such as a web proxy that distributes gzip files poorly. This setting requires a server restart to take effect.",
"admin.webserverModeTitle": "Webserver Mode:",
"admin.webserverModeUncompressed": "Uncompressed",
"admin.webserverModeUncompressedDescription": "The Mattermost server will serve static files uncompressed.",
"analytics.chart.loading": "Loading...",
"analytics.chart.meaningful": "Not enough data for a meaningful representation.",
"analytics.system.activeUsers": "Active Users With Posts",
......@@ -1223,11 +1218,11 @@
"navbar_dropdown.accountSettings": "Account Settings",
"navbar_dropdown.console": "System Console",
"navbar_dropdown.create": "Create a New Team",
"navbar_dropdown.leave": "Leave Team",
"navbar_dropdown.emoji": "Custom Emoji",
"navbar_dropdown.help": "Help",
"navbar_dropdown.integrations": "Integrations",
"navbar_dropdown.inviteMember": "Invite New Member",
"navbar_dropdown.leave": "Leave Team",
"navbar_dropdown.logout": "Logout",
"navbar_dropdown.manageMembers": "Manage Members",
"navbar_dropdown.report": "Report a Problem",
......@@ -1368,10 +1363,10 @@
"signup_team.disabled": "Team creation has been disabled. Please contact an administrator for access.",
"signup_team.join_open": "Teams you can join: ",
"signup_team.noTeams": "There are no teams included in the Team Directory and team creation has been disabled.",
"signup_team.no_teams": "No teams have been created. Please contact your administrator.",
"signup_team.no_teams_canCreate": "No teams have been created. You may create one by clicking \"Create a new team\".",
"signup_team.no_open_teams": "No teams are available to join. Please ask your administrator for an invite.",
"signup_team.no_open_teams_canCreate": "No teams are available to join. Please create a new team or ask your administrator for an invite.",
"signup_team.no_teams": "No teams have been created. Please contact your administrator.",
"signup_team.no_teams_canCreate": "No teams have been created. You may create one by clicking \"Create a new team\".",
"signup_team.none": "No team creation method has been enabled. Please contact an administrator for access.",
"signup_team_complete.completed": "You've already completed the signup process for this invitation or this invitation has expired.",
"signup_team_confirm.checkEmail": "Please check your email: <strong>{email}</strong><br />Your email contains a link to set up your team",
......@@ -1432,11 +1427,11 @@
"team_members_dropdown.confirmDemotion": "Confirm Demotion",
"team_members_dropdown.confirmDemotionCmd": "platform -assign_role -team_name=\"yourteam\" -email=\"name@yourcompany.com\" -role=\"system_admin\"",
"team_members_dropdown.inactive": "Inactive",
"team_members_dropdown.leave_team": "Remove From Team",
"team_members_dropdown.makeActive": "Make Active",
"team_members_dropdown.makeAdmin": "Make Team Admin",
"team_members_dropdown.makeInactive": "Make Inactive",
"team_members_dropdown.makeMember": "Make Member",
"team_members_dropdown.leave_team": "Remove From Team",
"team_members_dropdown.member": "Member",
"team_members_dropdown.systemAdmin": "System Admin",
"team_members_dropdown.teamAdmin": "Team Admin",
......@@ -1651,26 +1646,26 @@
"user.settings.security.newPassword": "New Password",
"user.settings.security.oneSignin": "You may only have one sign-in method at a time. Switching sign-in method will send an email notifying you if the change was successful.",
"user.settings.security.password": "Password",
"user.settings.security.passwordGitlabCantUpdate": "Login occurs through GitLab. Password cannot be updated.",
"user.settings.security.passwordLdapCantUpdate": "Login occurs through LDAP. Password cannot be updated.",
"user.settings.security.passwordError": "Your password must contain at least {min} characters.",
"user.settings.security.passwordErrorLowercase": "Your password must contain at least {min} characters made up of at least one lowercase letter.",
"user.settings.security.passwordErrorLowercaseNumber": "Your password must contain at least {min} characters made up of at least one lowercase letter and at least one number.",
"user.settings.security.passwordErrorLowercaseUppercase": "Your password must contain at least {min} characters made up of at least one lowercase letter and at least one uppercase letter.",
"user.settings.security.passwordErrorLowercaseNumberSymbol": "Your password must contain at least {min} characters made up of at least one lowercase letter, at least one number, and at least one symbol (e.g. \"~!@#$%^&*()\").",
"user.settings.security.passwordErrorLowercaseSymbol": "Your password must contain at least {min} characters made up of at least one lowercase letter and at least one symbol (e.g. \"~!@#$%^&*()\").",
"user.settings.security.passwordErrorLowercaseUppercase": "Your password must contain at least {min} characters made up of at least one lowercase letter and at least one uppercase letter.",
"user.settings.security.passwordErrorLowercaseUppercaseNumber": "Your password must contain at least {min} characters made up of at least one lowercase letter, at least one uppercase letter, and at least one number.",
"user.settings.security.passwordErrorLowercaseNumberSymbol": "Your password must contain at least {min} characters made up of at least one lowercase letter, at least one number, and at least one symbol (e.g. \"~!@#$%^&*()\").",
"user.settings.security.passwordErrorLowercaseUppercaseSymbol": "Your password must contain at least {min} characters made up of at least one lowercase letter, at least one uppercase letter, and at least one symbol (e.g. \"~!@#$%^&*()\").",
"user.settings.security.passwordErrorLowercaseUppercaseNumberSymbol": "Your password must contain at least {min} characters made up of at least one lowercase letter, at least one uppercase letter, at least one number, and at least one symbol (e.g. \"~!@#$%^&*()\").",
"user.settings.security.passwordErrorUppercase": "Your password must contain at least {min} characters made up of at least one uppercase letter.",
"user.settings.security.passwordErrorUppercaseNumber": "Your password must contain at least {min} characters made up of at least one uppercase letter and at least one number.",
"user.settings.security.passwordErrorUppercaseSymbol": "Your password must contain at least {min} characters made up of at least one uppercase letter and at least one symbol (e.g. \"~!@#$%^&*()\").",
"user.settings.security.passwordErrorUppercaseNumberSymbol": "Your password must contain at least {min} characters made up of at least one uppercase letter, at least one number, and at least one symbol (e.g. \"~!@#$%^&*()\").",
"user.settings.security.passwordErrorLowercaseUppercaseSymbol": "Your password must contain at least {min} characters made up of at least one lowercase letter, at least one uppercase letter, and at least one symbol (e.g. \"~!@#$%^&*()\").",
"user.settings.security.passwordErrorNumber": "Your password must contain at least {min} characters made up of at least one number.",
"user.settings.security.passwordErrorNumberSymbol": "Your password must contain at least {min} characters made up of at least one number and at least one symbol (e.g. \"~!@#$%^&*()\").",
"user.settings.security.passwordErrorSymbol": "Your password must contain at least {min} characters made up of at least one symbol (e.g. \"~!@#$%^&*()\").",
"user.settings.security.passwordMinLength": "Invalid minimum length, cannot show preview.",
"user.settings.security.passwordErrorUppercase": "Your password must contain at least {min} characters made up of at least one uppercase letter.",
"user.settings.security.passwordErrorUppercaseNumber": "Your password must contain at least {min} characters made up of at least one uppercase letter and at least one number.",
"user.settings.security.passwordErrorUppercaseNumberSymbol": "Your password must contain at least {min} characters made up of at least one uppercase letter, at least one number, and at least one symbol (e.g. \"~!@#$%^&*()\").",
"user.settings.security.passwordErrorUppercaseSymbol": "Your password must contain at least {min} characters made up of at least one uppercase letter and at least one symbol (e.g. \"~!@#$%^&*()\").",
"user.settings.security.passwordGitlabCantUpdate": "Login occurs through GitLab. Password cannot be updated.",
"user.settings.security.passwordLdapCantUpdate": "Login occurs through LDAP. Password cannot be updated.",
"user.settings.security.passwordMatchError": "The new passwords you entered do not match",
"user.settings.security.passwordMinLength": "Invalid minimum length, cannot show preview.",
"user.settings.security.retypePassword": "Retype New Password",
"user.settings.security.saml": "SAML",
"user.settings.security.switchEmail": "Switch to using email and password",
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -495,6 +495,20 @@ body.ios {
}
}
&.post--hovered {
.dropdown,
.comment-icon__container,
.post__reply,
.post__remove,
.permalink-icon {
visibility: visible;
}
.post__body {
background: transparent !important;
}
}
&.post--highlight {
background-color: beige;
}
......@@ -672,7 +686,8 @@ body.ios {
&.same--user {
padding: 0 .5em 0 1em;
&:hover {
&:hover,
&.post--hovered {
.post__time {
@include opacity(.5);
}
......
......@@ -598,7 +598,7 @@ export function applyTheme(theme) {
}
if (theme.centerChannelBg) {
changeCss('@media(min-width: 768px){.app__body .post:hover .post__header .col__reply', 'background:' + theme.centerChannelBg, 1);
changeCss('@media(min-width: 768px){.app__body .post:hover .post__header .col__reply, .app__body .post.post--hovered .post__header .col__reply', 'background:' + theme.centerChannelBg, 1);
changeCss('.app__body .app__content, .app__body .markdown__table, .app__body .markdown__table tbody tr, .app__body .suggestion-list__content, .app__body .modal .modal-content, .app__body .post.post--compact .post-image__column', 'background:' + theme.centerChannelBg, 1);
changeCss('#post-list .post-list-holder-by-time', 'background:' + theme.centerChannelBg, 1);
changeCss('#post-create', 'background:' + theme.centerChannelBg, 1);
......@@ -619,7 +619,7 @@ export function applyTheme(theme) {
if (theme.centerChannelColor) {
changeCss('.app__body .post-list__arrows', 'fill:' + changeOpacity(theme.centerChannelColor, 0.3), 1);
changeCss('@media(min-width: 768px){.app__body .post:hover .post__header .col__reply', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 2);
changeCss('@media(min-width: 768px){.app__body .post:hover .post__header .col__reply, .app__body .post.post--hovered .post__header .col__reply', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 2);
changeCss('.app__body .sidebar--left, .app__body .sidebar--right .sidebar--right__header, .app__body .suggestion-list__content .command', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
changeCss('.app__body .post.post--system .post__body', 'color:' + changeOpacity(theme.centerChannelColor, 0.6), 1);
changeCss('.app__body .input-group-addon, .app__body .app__content, .app__body .post-create__container .post-create-body .btn-file, .app__body .post-create__container .post-create-footer .msg-typing, .app__body .suggestion-list__content .command, .app__body .modal .modal-content, .app__body .dropdown-menu, .app__body .popover, .app__body .mentions__name, .app__body .tip-overlay, .app__body .form-control[disabled], .app__body .form-control[readonly], .app__body fieldset[disabled] .form-control', 'color:' + theme.centerChannelColor, 1);
......@@ -659,10 +659,10 @@ export function applyTheme(theme) {
changeCss('.app__body .search-item-container, .app__body .post-right__container .post.post--root', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.1), 1);
changeCss('.app__body .modal .custom-textarea:focus', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.3), 1);
changeCss('.app__body .channel-intro, .app__body .modal .settings-modal .settings-table .settings-content .divider-dark, .app__body hr, .app__body .modal .settings-modal .settings-table .settings-links, .app__body .modal .settings-modal .settings-table .settings-content .appearance-section .theme-elements__header', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
changeCss('.app__body .post.current--user .post__body, .app__body .post.post--comment.other--root.current--user .post-comment, .app__body pre, .app__body .post-right__container .post.post--root', 'background:' + changeOpacity(theme.centerChannelColor, 0.07), 1);
changeCss('.app__body .post.current--user .post__body, .app__body .post.post--comment.other--root.current--user .post-comment, .app__body pre, .app__body .post-right__container .post.post--root', 'background:' + changeOpacity(theme.centerChannelColor, 0.05), 1);
changeCss('.app__body .post.post--comment.other--root.current--user .post-comment, .app__body .more-modal__list .more-modal__row, .app__body .member-div:first-child, .app__body .member-div, .app__body .access-history__table .access__report, .app__body .activity-log__table', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.1), 2);
changeCss('@media(max-width: 1800px){.app__body .inner-wrap.move--left .post.post--comment.same--root', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.07), 2);
changeCss('.app__body .post:hover, .app__body .more-modal__list .more-modal__row:hover, .app__body .modal .settings-modal .settings-table .settings-content .section-min:hover', 'background:' + changeOpacity(theme.centerChannelColor, 0.07), 1);
changeCss('.app__body .post:hover, .app__body .post.post--hovered, .app__body .more-modal__list .more-modal__row:hover, .app__body .modal .settings-modal .settings-table .settings-content .section-min:hover', 'background:' + changeOpacity(theme.centerChannelColor, 0.08), 1);
changeCss('.app__body .date-separator.hovered--before:after, .app__body .date-separator.hovered--after:before, .app__body .new-separator.hovered--after:before, .app__body .new-separator.hovered--before:after', 'background:' + changeOpacity(theme.centerChannelColor, 0.07), 1);
changeCss('.app__body .suggestion-list__content .command:hover, .app__body .mentions__name:hover, .app__body .suggestion--selected, .app__body .dropdown-menu>li>a:focus, .app__body .dropdown-menu>li>a:hover, .app__body .bot-indicator', 'background:' + changeOpacity(theme.centerChannelColor, 0.15), 1);
changeCss('code, .app__body .form-control[disabled], .app__body .form-control[readonly], .app__body fieldset[disabled] .form-control', 'background:' + changeOpacity(theme.centerChannelColor, 0.1), 1);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment