// 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') + '' }} />
); } }