PLT-3518/PLT-3519 Custom emoji followup (#3507)

* Fixed emoji list filter when full name or nickname are enabled

* Changed custom emoji list to only be visible if the user can create custom emoji
Этот коммит содержится в:
Harrison Healey
2016-07-06 13:52:28 -04:00
коммит произвёл Joram Wilander
родитель fd880ad047
Коммит 1a3f952c56
6 изменённых файлов: 75 добавлений и 69 удалений

Просмотреть файл

@@ -4,6 +4,7 @@
import React from 'react'; import React from 'react';
import TeamStore from 'stores/team_store.jsx'; import TeamStore from 'stores/team_store.jsx';
import * as Utils from 'utils/utils.jsx';
import BackstageCategory from './backstage_category.jsx'; import BackstageCategory from './backstage_category.jsx';
import BackstageSection from './backstage_section.jsx'; import BackstageSection from './backstage_section.jsx';
@@ -18,7 +19,7 @@ export default class BackstageSidebar extends React.Component {
} }
renderCustomEmoji() { renderCustomEmoji() {
if (window.mm_config.EnableCustomEmoji !== 'true') { if (window.mm_config.EnableCustomEmoji !== 'true' || !Utils.canCreateCustomEmoji(this.props.user)) {
return null; return null;
} }
@@ -44,7 +45,7 @@ export default class BackstageSidebar extends React.Component {
return null; return null;
} }
if (window.mm_config.RestrictCustomEmojiCreation !== 'all' && !TeamStore.isTeamAdmin(this.props.user.id, this.props.team.id)) { if (window.mm_config.EnableOnlyAdminIntegrations !== 'false' && !TeamStore.isTeamAdmin(this.props.user.id, this.props.team.id)) {
return null; return null;
} }

Просмотреть файл

@@ -5,7 +5,6 @@ import React from 'react';
import * as AsyncClient from 'utils/async_client.jsx'; import * as AsyncClient from 'utils/async_client.jsx';
import EmojiStore from 'stores/emoji_store.jsx'; import EmojiStore from 'stores/emoji_store.jsx';
import TeamStore from 'stores/team_store.jsx';
import * as Utils from 'utils/utils.jsx'; import * as Utils from 'utils/utils.jsx';
import {FormattedMessage} from 'react-intl'; import {FormattedMessage} from 'react-intl';
@@ -24,8 +23,6 @@ export default class EmojiList extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.canCreateEmojis = this.canCreateEmojis.bind(this);
this.handleEmojiChange = this.handleEmojiChange.bind(this); this.handleEmojiChange = this.handleEmojiChange.bind(this);
this.deleteEmoji = this.deleteEmoji.bind(this); this.deleteEmoji = this.deleteEmoji.bind(this);
@@ -68,31 +65,6 @@ export default class EmojiList extends React.Component {
AsyncClient.deleteEmoji(emoji.id); AsyncClient.deleteEmoji(emoji.id);
} }
canCreateEmojis() {
if (global.window.mm_license.IsLicensed !== 'true') {
return true;
}
if (Utils.isSystemAdmin(this.props.user.roles)) {
return true;
}
if (window.mm_config.RestrictCustomEmojiCreation === 'all') {
return true;
}
if (window.mm_config.RestrictCustomEmojiCreation === 'admin') {
// check whether the user is an admin on any of their teams
for (const member of TeamStore.getTeamMembers()) {
if (Utils.isAdmin(member.roles)) {
return true;
}
}
}
return false;
}
render() { render() {
const filter = this.state.filter.toLowerCase(); const filter = this.state.filter.toLowerCase();
const isSystemAdmin = Utils.isSystemAdmin(this.props.user.roles); const isSystemAdmin = Utils.isSystemAdmin(this.props.user.roles);
@@ -131,26 +103,6 @@ export default class EmojiList extends React.Component {
} }
} }
let addLink = null;
if (this.canCreateEmojis()) {
addLink = (
<Link
className='add-link'
to={'/' + this.props.team.name + '/emoji/add'}
>
<button
type='button'
className='btn btn-primary'
>
<FormattedMessage
id='emoji_list.add'
defaultMessage='Add Custom Emoji'
/>
</button>
</Link>
);
}
return ( return (
<div className='backstage-content emoji-list'> <div className='backstage-content emoji-list'>
<div className='backstage-header'> <div className='backstage-header'>
@@ -160,7 +112,20 @@ export default class EmojiList extends React.Component {
defaultMessage='Custom Emoji' defaultMessage='Custom Emoji'
/> />
</h1> </h1>
{addLink} <Link
className='add-link'
to={'/' + this.props.team.name + '/emoji/add'}
>
<button
type='button'
className='btn btn-primary'
>
<FormattedMessage
id='emoji_list.add'
defaultMessage='Add Custom Emoji'
/>
</button>
</Link>
</div> </div>
<div className='backstage-filters'> <div className='backstage-filters'>
<div className='backstage-filter__search'> <div className='backstage-filter__search'>

Просмотреть файл

@@ -45,9 +45,9 @@ export default class EmojiListItem extends React.Component {
if (creator) { if (creator) {
if (creator.username.toLowerCase().indexOf(filter) !== -1 || if (creator.username.toLowerCase().indexOf(filter) !== -1 ||
(creator.first_name && creator.first_name.toLowerCase().indexOf(filter)) || (creator.first_name && creator.first_name.toLowerCase().indexOf(filter) !== -1) ||
(creator.last_name && creator.last_name.toLowerCase().indexOf(filter)) || (creator.last_name && creator.last_name.toLowerCase().indexOf(filter) !== -1) ||
(creator.nickname && creator.nickname.toLowerCase().indexOf(filter))) { (creator.nickname && creator.nickname.toLowerCase().indexOf(filter) !== -1)) {
return true; return true;
} }
} }

Просмотреть файл

@@ -30,6 +30,8 @@ export default class NavbarDropdown extends React.Component {
this.onTeamChange = this.onTeamChange.bind(this); this.onTeamChange = this.onTeamChange.bind(this);
this.openAccountSettings = this.openAccountSettings.bind(this); this.openAccountSettings = this.openAccountSettings.bind(this);
this.renderCustomEmojiLink = this.renderCustomEmojiLink.bind(this);
this.state = { this.state = {
showUserSettingsModal: false, showUserSettingsModal: false,
showAboutModal: false, showAboutModal: false,
@@ -37,9 +39,11 @@ export default class NavbarDropdown extends React.Component {
teamMembers: TeamStore.getTeamMembers() teamMembers: TeamStore.getTeamMembers()
}; };
} }
handleAboutModal() { handleAboutModal() {
this.setState({showAboutModal: true}); this.setState({showAboutModal: true});
} }
aboutModalDismissed() { aboutModalDismissed() {
this.setState({showAboutModal: false}); this.setState({showAboutModal: false});
} }
@@ -69,12 +73,31 @@ export default class NavbarDropdown extends React.Component {
TeamStore.removeChangeListener(this.onTeamChange); TeamStore.removeChangeListener(this.onTeamChange);
document.removeEventListener('keydown', this.openAccountSettings); document.removeEventListener('keydown', this.openAccountSettings);
} }
openAccountSettings(e) { openAccountSettings(e) {
if (Utils.cmdOrCtrlPressed(e) && e.shiftKey && e.keyCode === Constants.KeyCodes.A) { if (Utils.cmdOrCtrlPressed(e) && e.shiftKey && e.keyCode === Constants.KeyCodes.A) {
e.preventDefault(); e.preventDefault();
this.setState({showUserSettingsModal: true}); this.setState({showUserSettingsModal: true});
} }
} }
renderCustomEmojiLink() {
if (window.mm_config.EnableCustomEmoji !== 'true' || !Utils.canCreateCustomEmoji(this.props.currentUser)) {
return null;
}
return (
<li>
<Link to={'/' + Utils.getTeamNameFromUrl() + '/emoji'}>
<FormattedMessage
id='navbar_dropdown.emoji'
defaultMessage='Custom Emoji'
/>
</Link>
</li>
);
}
render() { render() {
var teamLink = ''; var teamLink = '';
var inviteLink = ''; var inviteLink = '';
@@ -85,7 +108,10 @@ export default class NavbarDropdown extends React.Component {
var isSystemAdmin = false; var isSystemAdmin = false;
var teamSettings = null; var teamSettings = null;
let integrationsLink = null; let integrationsLink = null;
let customEmojiLink = null;
if (!currentUser) {
return null;
}
if (currentUser != null) { if (currentUser != null) {
isAdmin = TeamStore.isTeamAdminForCurrentTeam() || UserStore.isSystemAdminForCurrentUser(); isAdmin = TeamStore.isTeamAdminForCurrentTeam() || UserStore.isSystemAdminForCurrentUser();
@@ -177,19 +203,6 @@ export default class NavbarDropdown extends React.Component {
); );
} }
if (window.mm_config.EnableCustomEmoji === 'true') {
customEmojiLink = (
<li>
<Link to={'/' + Utils.getTeamNameFromUrl() + '/emoji'}>
<FormattedMessage
id='navbar_dropdown.emoji'
defaultMessage='Custom Emoji'
/>
</Link>
</li>
);
}
if (isSystemAdmin) { if (isSystemAdmin) {
sysAdminLink = ( sysAdminLink = (
<li> <li>
@@ -342,7 +355,7 @@ export default class NavbarDropdown extends React.Component {
</li> </li>
<li className='divider'></li> <li className='divider'></li>
{integrationsLink} {integrationsLink}
{customEmojiLink} {this.renderCustomEmojiLink()}
<li className='divider'></li> <li className='divider'></li>
{teamSettings} {teamSettings}
{manageLink} {manageLink}

Просмотреть файл

@@ -214,4 +214,5 @@ TeamStore.dispatchToken = AppDispatcher.register((payload) => {
} }
}); });
window.TeamStore = TeamStore;
export default TeamStore; export default TeamStore;

Просмотреть файл

@@ -1341,3 +1341,29 @@ export function localizeMessage(id, defaultMessage) {
export function mod(a, b) { export function mod(a, b) {
return ((a % b) + b) % b; return ((a % b) + b) % b;
} }
export function canCreateCustomEmoji(user) {
if (global.window.mm_license.IsLicensed !== 'true') {
return true;
}
if (isSystemAdmin(user.roles)) {
return true;
}
// already checked for system admin for both these cases
if (window.mm_config.RestrictCustomEmojiCreation === 'system_admin') {
return false;
} else if (window.mm_config.RestrictCustomEmojiCreation === 'admin') {
// check whether the user is an admin on any of their teams
for (const member of TeamStore.getTeamMembers()) {
if (isAdmin(member.roles)) {
return true;
}
}
return false;
}
return true;
}