From 019bf6a7fed85138a6a3be6ef70fbb994be49abe Mon Sep 17 00:00:00 2001 From: hmhealey Date: Tue, 27 Oct 2015 12:34:21 -0400 Subject: Added ability to see/edit channel purpose in the client --- web/react/components/channel_header.jsx | 156 ++++++++++++--------- .../components/edit_channel_purpose_modal.jsx | 118 ++++++++++++++++ web/react/components/more_channels.jsx | 3 +- web/react/components/navbar.jsx | 46 ++++-- web/react/components/new_channel_flow.jsx | 10 +- web/react/components/new_channel_modal.jsx | 14 +- web/react/utils/client.jsx | 17 +++ 7 files changed, 273 insertions(+), 91 deletions(-) create mode 100644 web/react/components/edit_channel_purpose_modal.jsx (limited to 'web/react') diff --git a/web/react/components/channel_header.jsx b/web/react/components/channel_header.jsx index 39f283746..101fd85e5 100644 --- a/web/react/components/channel_header.jsx +++ b/web/react/components/channel_header.jsx @@ -11,6 +11,7 @@ const TextFormatting = require('../utils/text_formatting.jsx'); const Utils = require('../utils/utils.jsx'); const MessageWrapper = require('./message_wrapper.jsx'); const PopoverListMembers = require('./popover_list_members.jsx'); +const EditChannelPurposeModal = require('./edit_channel_purpose_modal.jsx'); const AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); const Constants = require('../utils/constants.jsx'); @@ -27,7 +28,9 @@ export default class ChannelHeader extends React.Component { this.handleLeave = this.handleLeave.bind(this); this.searchMentions = this.searchMentions.bind(this); - this.state = this.getStateFromStores(); + const state = this.getStateFromStores(); + state.showEditChannelPurposeModal = false; + this.state = state; } getStateFromStores() { return { @@ -232,6 +235,20 @@ export default class ChannelHeader extends React.Component { ); + dropdownContents.push( +
  • + this.setState({showEditChannelPurposeModal: true})} + > + Set {channelTerm} Purpose... + +
  • + ); dropdownContents.push(
  • - - - -
    -
    +
    + + + + + + + - - - - - -
    +
    +
    + + {channelTitle} + + +
      + {dropdownContents} +
    +
    + +
    + +
    +
    + + + - -
    - -
    -
    - - - -
    + + + + + this.setState({showEditChannelPurposeModal: false})} + channel={channel} + /> +
    ); } } diff --git a/web/react/components/edit_channel_purpose_modal.jsx b/web/react/components/edit_channel_purpose_modal.jsx new file mode 100644 index 000000000..d8102642e --- /dev/null +++ b/web/react/components/edit_channel_purpose_modal.jsx @@ -0,0 +1,118 @@ +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +const AsyncClient = require('../utils/async_client.jsx'); +const Client = require('../utils/client.jsx'); +const Modal = ReactBootstrap.Modal; + +export default class EditChannelPurposeModal extends React.Component { + constructor(props) { + super(props); + + this.handleHide = this.handleHide.bind(this); + this.handleSave = this.handleSave.bind(this); + + this.state = {serverError: ''}; + } + + handleHide() { + this.setState({serverError: ''}); + + if (this.props.onModalDismissed) { + this.props.onModalDismissed(); + } + } + + handleSave() { + if (!this.props.channel) { + return; + } + + const data = { + channel_id: this.props.channel.id, + channel_purpose: ReactDOM.findDOMNode(this.refs.purpose).value.trim() + }; + + Client.updateChannelPurpose(data, + () => { + AsyncClient.getChannel(this.props.channel.id); + + this.handleHide(); + }, + (err) => { + if (err.message === 'Invalid channel_purpose parameter') { + this.setState({serverError: 'This channel purpose is too long, please enter a shorter one'}); + } else { + this.setState({serverError: err.message}); + } + } + ); + } + + render() { + if (!this.props.show) { + return null; + } + + let serverError = null; + if (this.state.serverError) { + serverError = ( +
    +
    + +
    + ); + } + + let title = {'Edit Purpose'}; + if (this.props.channel.display_name) { + title = {'Edit Purpose for '}{this.props.channel.display_name}; + } + + return ( + + + + {title} + + + +