// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. 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'; import Constants from '../utils/constants.jsx'; export default class RenameChannelModal extends React.Component { constructor(props) { super(props); this.handleSubmit = this.handleSubmit.bind(this); this.onNameChange = this.onNameChange.bind(this); this.onDisplayNameChange = this.onDisplayNameChange.bind(this); this.displayNameKeyUp = this.displayNameKeyUp.bind(this); this.handleClose = this.handleClose.bind(this); this.handleShow = this.handleShow.bind(this); this.handleShown = this.handleShown.bind(this); this.handleSubmit = this.handleSubmit.bind(this); this.state = { displayName: '', channelName: '', channelId: '', serverError: '', nameError: '', displayNameError: '', invalid: false }; } handleSubmit(e) { e.preventDefault(); if (this.state.channelId.length !== 26) { return; } const channel = ChannelStore.get(this.state.channelId); const oldName = channel.name; const oldDisplayName = channel.displayName; const state = {serverError: ''}; channel.display_name = this.state.displayName.trim(); if (!channel.display_name) { state.displayNameError = 'This field is required'; state.invalid = true; } else if (channel.display_name.length > 22) { state.displayNameError = 'This field must be less than 22 characters'; state.invalid = true; } else { state.displayNameError = ''; } channel.name = this.state.channelName.trim(); if (!channel.name) { state.nameError = 'This field is required'; state.invalid = true; } else if (channel.name.length > 22) { state.nameError = 'This field must be less than 22 characters'; state.invalid = true; } else { const cleanedName = Utils.cleanUpUrlable(channel.name); if (cleanedName === channel.name) { state.nameError = ''; } else { state.nameError = 'Must be lowercase alphanumeric characters'; state.invalid = true; } } this.setState(state); if (state.invalid || (oldName === channel.name && oldDisplayName === channel.display_name)) { return; } Client.updateChannel(channel, () => { $(ReactDOM.findDOMNode(this.refs.modal)).modal('hide'); AsyncClient.getChannel(channel.id); Utils.updateAddressBar(channel.name); ReactDOM.findDOMNode(this.refs.displayName).value = ''; ReactDOM.findDOMNode(this.refs.channelName).value = ''; }, (err) => { state.serverError = err.message; state.invalid = true; this.setState(state); } ); } onNameChange() { this.setState({channelName: ReactDOM.findDOMNode(this.refs.channelName).value}); } onDisplayNameChange() { this.setState({displayName: ReactDOM.findDOMNode(this.refs.displayName).value}); } displayNameKeyUp() { if (this.state.channelName !== Constants.DEFAULT_CHANNEL) { const displayName = ReactDOM.findDOMNode(this.refs.displayName).value.trim(); const channelName = Utils.cleanUpUrlable(displayName); ReactDOM.findDOMNode(this.refs.channelName).value = channelName; this.setState({channelName: channelName}); } } handleClose() { this.setState({ displayName: '', channelName: '', channelId: '', serverError: '', nameError: '', displayNameError: '', invalid: false }); } handleShow(e) { const button = $(e.relatedTarget); this.setState({displayName: button.attr('data-display'), channelName: button.attr('data-name'), channelId: button.attr('data-channelid')}); } handleShown() { $('#rename_channel #display_name').focus(); } componentDidMount() { $(ReactDOM.findDOMNode(this.refs.modal)).on('show.bs.modal', this.handleShow); $(ReactDOM.findDOMNode(this.refs.modal)).on('hidden.bs.modal', this.handleClose); $(ReactDOM.findDOMNode(this.refs.modal)).on('shown.bs.modal', this.handleShown); } componentWillUnmount() { $(ReactDOM.findDOMNode(this.refs.modal)).off('hidden.bs.modal', this.handleClose); } render() { let displayNameError = null; let displayNameClass = 'form-group'; if (this.state.displayNameError) { displayNameError = ; displayNameClass += ' has-error'; } let nameError = null; let nameClass = 'form-group'; if (this.state.nameError) { nameError = ; nameClass += ' has-error'; } let serverError = null; if (this.state.serverError) { serverError =
; } let handleInputLabel = 'Handle'; let handleInputClass = 'form-control'; let readOnlyHandleInput = false; if (this.state.channelName === Constants.DEFAULT_CHANNEL) { handleInputLabel += ' - Cannot be changed for the default channel'; handleInputClass += ' disabled-input'; readOnlyHandleInput = true; } return ( ); } }