// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
import React from 'react';
import crypto from 'crypto';
import Suggestion from 'components/suggestion/suggestion.jsx';
import Provider from 'components/suggestion/provider.jsx';
import SuggestionBox from 'components/suggestion/suggestion_box.jsx';
import SuggestionList from 'components/suggestion/suggestion_list.jsx';
import {autocompleteUsersInTeam} from 'actions/user_actions.jsx';
import AppDispatcher from 'dispatcher/app_dispatcher.jsx';
import {Client4} from 'mattermost-redux/client';
import {ActionTypes} from 'utils/constants.jsx';
import * as Utils from 'utils/utils.jsx';
import AdminSettings from 'components/admin_console/admin_settings.jsx';
import {FormattedMessage} from 'react-intl';
import SettingsGroup from 'components/admin_console/settings_group.jsx';
import BooleanSetting from 'components/admin_console/boolean_setting.jsx';
import GeneratedSetting from 'components/admin_console/generated_setting.jsx';
import Setting from 'components/admin_console/setting.jsx';
import './style.scss';
class UserSuggestion extends Suggestion {
render() {
const {item, isSelection} = this.props;
let className = 'suggestion-list__item mentions__name';
if (isSelection) {
className += ' suggestion--selected';
}
const username = item.username;
let description = '';
if ((item.first_name || item.last_name) && item.nickname) {
description = `- ${Utils.getFullName(item)} (${item.nickname})`;
} else if (item.nickname) {
description = `- (${item.nickname})`;
} else if (item.first_name || item.last_name) {
description = `- ${Utils.getFullName(item)}`;
}
return (
{'@' + username}
{' '}
{description}
);
}
}
class UserProvider extends Provider {
handlePretextChanged(suggestionId, pretext) {
const normalizedPretext = pretext.toLowerCase();
this.startNewRequest(suggestionId, normalizedPretext);
autocompleteUsersInTeam(
normalizedPretext,
(data) => {
if (this.shouldCancelDispatch(normalizedPretext)) {
return;
}
const users = Object.assign([], data.users);
AppDispatcher.handleServerAction({
type: ActionTypes.SUGGESTION_RECEIVED_SUGGESTIONS,
id: suggestionId,
matchedPretext: normalizedPretext,
terms: users.map((user) => user.username),
items: users,
component: UserSuggestion
});
}
);
return true;
}
}
export default class JIRASettings extends AdminSettings {
constructor(props) {
super(props);
this.getConfigFromState = this.getConfigFromState.bind(this);
this.renderSettings = this.renderSettings.bind(this);
this.handleSecretChange = this.handleSecretChange.bind(this);
this.handleEnabledChange = this.handleEnabledChange.bind(this);
this.handleUserSelected = this.handleUserSelected.bind(this);
this.userSuggestionProviders = [new UserProvider()];
}
getConfigFromState(config) {
config.PluginSettings.Plugins = {
jira: {
Enabled: this.state.enabled,
Secret: this.state.secret,
UserName: this.state.userName
}
};
return config;
}
getStateFromConfig(config) {
const settings = config.PluginSettings;
const ret = {
enabled: false,
secret: '',
userName: '',
siteURL: config.ServiceSettings.SiteURL
};
if (typeof settings.Plugins !== 'undefined' && typeof settings.Plugins.jira !== 'undefined') {
ret.enabled = settings.Plugins.jira.Enabled || settings.Plugins.jira.enabled || false;
ret.secret = settings.Plugins.jira.Secret || settings.Plugins.jira.secret || '';
ret.userName = settings.Plugins.jira.UserName || settings.Plugins.jira.username || '';
}
return ret;
}
handleSecretChange(id, secret) {
this.handleChange(id, secret.replace('+', '-').replace('/', '_'));
}
handleEnabledChange(enabled) {
if (enabled && this.state.secret === '') {
this.handleSecretChange('secret', crypto.randomBytes(256).toString('base64').substring(0, 32));
}
this.handleChange('enabled', enabled);
}
handleUserSelected(user) {
this.handleChange('userName', user.username);
}
renderTitle() {
return Utils.localizeMessage('admin.plugins.jira', 'JIRA (Beta)');
}
renderSettings() {
var webhookDocsLink = (
);
return (
this.handleEnabledChange(value)}
/>
this.handleChange('userName', e.target.value)}
onItemSelected={this.handleUserSelected}
listComponent={SuggestionList}
listStyle='bottom'
providers={this.userSuggestionProviders}
disabled={!this.state.enabled}
type='input'
requiredCharacters={0}
openOnFocus={true}
/>
' + Utils.localizeMessage('admin.plugins.jira.secretParamPlaceholder', 'secret') + '')) +
'&team=' +
Utils.localizeMessage('admin.plugins.jira.teamParamPlaceholder', 'teamname') +
'&channel=' +
Utils.localizeMessage('admin.plugins.jira.channelParamNamePlaceholder', 'channelname') +
''
}}
/>
);
}
}