From 56db6ad08cf23dbdcee326fa39bda8bcdcdecf9e Mon Sep 17 00:00:00 2001
From: ralder <ralder@yandex.ru>
Date: Wed, 15 Jul 2015 09:03:28 -0700
Subject: remove admin's ability to manage members of default channel (fixes
 #172)

---
 web/react/components/navbar.jsx | 159 ++++++++++++++++++++--------------------
 1 file changed, 78 insertions(+), 81 deletions(-)

(limited to 'web/react/components/navbar.jsx')

diff --git a/web/react/components/navbar.jsx b/web/react/components/navbar.jsx
index 35f7d9044..78cf7d8b8 100644
--- a/web/react/components/navbar.jsx
+++ b/web/react/components/navbar.jsx
@@ -2,21 +2,20 @@
 // See License.txt for license information.
 
 
-var AppDispatcher = require('../dispatcher/app_dispatcher.jsx');
 var utils = require('../utils/utils.jsx');
 var client = require('../utils/client.jsx');
 var AsyncClient = require('../utils/async_client.jsx');
-var Sidebar = require('./sidebar.jsx');
 var UserStore = require('../stores/user_store.jsx');
-var SocketStore = require('../stores/socket_store.jsx');
 var ChannelStore = require('../stores/channel_store.jsx');
-var Constants = require('../utils/constants.jsx');
+
 var UserProfile = require('./user_profile.jsx');
 var MessageWrapper = require('./message_wrapper.jsx');
+
+var Constants = require('../utils/constants.jsx');
 var ActionTypes = Constants.ActionTypes;
+var AppDispatcher = require('../dispatcher/app_dispatcher.jsx');
 
 function getCountsStateFromStores() {
-
     var count = 0;
     var channels = ChannelStore.getAll();
     var members = ChannelStore.getAllMembers();
@@ -34,7 +33,7 @@ function getCountsStateFromStores() {
         }
     });
 
-    return { count: count }
+    return { count: count };
 }
 
 var NotifyCounts =  React.createClass({
@@ -54,11 +53,10 @@ var NotifyCounts =  React.createClass({
         return getCountsStateFromStores();
     },
     render: function() {
-        if (this.state.count == 0) {
-            return (<span></span>);
-        }
-        else {
-            return (<span className="badge badge-notify">{ this.state.count }</span>);
+        if (this.state.count) {
+            return <span className="badge badge-notify">{ this.state.count }</span>;
+        } else {
+            return null;
         }
     }
 });
@@ -66,25 +64,25 @@ var NotifyCounts =  React.createClass({
 var NavbarLoginForm = React.createClass({
     handleSubmit: function(e) {
         e.preventDefault();
-        var state = { }
+        var state = { };
 
         var domain = this.refs.domain.getDOMNode().value.trim();
         if (!domain) {
-            state.server_error = "A domain is required"
+            state.server_error = "A domain is required";
             this.setState(state);
             return;
         }
 
        var email = this.refs.email.getDOMNode().value.trim();
         if (!email) {
-            state.server_error = "An email is required"
+            state.server_error = "An email is required";
             this.setState(state);
             return;
         }
 
         var password = this.refs.password.getDOMNode().value.trim();
         if (!password) {
-            state.server_error = "A password is required"
+            state.server_error = "A password is required";
             this.setState(state);
             return;
         }
@@ -105,7 +103,7 @@ var NavbarLoginForm = React.createClass({
                     window.location.href = '/channels/town-square';
                 }
 
-            }.bind(this),
+            },
             function(err) {
                 if (err.message == "Login failed because email address has not been verified") {
                     window.location.href = '/verify?domain=' + encodeURIComponent(domain) + '&email=' + encodeURIComponent(email);
@@ -159,13 +157,14 @@ function getStateFromStores() {
 }
 
 module.exports = React.createClass({
+    displayName: 'Navbar',
+
     componentDidMount: function() {
         ChannelStore.addChangeListener(this._onChange);
         ChannelStore.addExtraInfoChangeListener(this._onChange);
-        var self = this;
-        $('.inner__wrap').click(self.hideSidebars);
+        $('.inner__wrap').click(this.hideSidebars);
 
-        $('body').on('click.infopopover', function(e){
+        $('body').on('click.infopopover', function(e) {
             if ($(e.target).attr('data-toggle') !== 'popover'
                 && $(e.target).parents('.popover.in').length === 0) {
                 $('.info-popover').popover('hide');
@@ -181,13 +180,13 @@ module.exports = React.createClass({
     },
     handleLeave: function(e) {
         client.leaveChannel(this.state.channel.id,
-            function(data) {
+            function() {
                 AsyncClient.getChannels(true);
                 window.location.href = '/channels/town-square';
-            }.bind(this),
+            },
             function(err) {
                 AsyncClient.dispatchError(err, "handleLeave");
-            }.bind(this)
+            }
         );
     },
     hideSidebars: function(e) {
@@ -204,7 +203,7 @@ module.exports = React.createClass({
             });
 
             if (e.target.className != 'navbar-toggle' && e.target.className != 'icon-bar') {
-                $('.inner__wrap').removeClass('move--right').removeClass('move--left').removeClass('move--left-small');
+                $('.inner__wrap').removeClass('move--right move--left move--left-small');
                 $('.sidebar--left').removeClass('move--right');
                 $('.sidebar--right').removeClass('move--left');
                 $('.sidebar--menu').removeClass('move--left');
@@ -229,24 +228,22 @@ module.exports = React.createClass({
     render: function() {
 
         var currentId = UserStore.getCurrentId();
-        var channelName = "";
         var popoverContent = "";
         var channelTitle = this.props.teamName;
         var isAdmin = false;
         var isDirect = false;
         var description = ""
+        var channel = this.state.channel;
 
-        if (this.state.channel) {
-            var channel = this.state.channel;
-            description = utils.textToJsx(this.state.channel.description, {"singleline": true, "noMentionHighlight": true});
-            popoverContent = React.renderToString(<MessageWrapper message={this.state.channel.description}/>);
-            channelName = this.state.channel.name;
+        if (channel) {
+            description = utils.textToJsx(channel.description, {"singleline": true, "noMentionHighlight": true});
+            popoverContent = React.renderToString(<MessageWrapper message={channel.description}/>);
             isAdmin = this.state.member.roles.indexOf("admin") > -1;
 
             if (channel.type === 'O') {
-                channelTitle = this.state.channel.display_name;
+                channelTitle = channel.display_name;
             } else if (channel.type === 'P') {
-                channelTitle = this.state.channel.display_name;
+                channelTitle = channel.display_name;
             } else if (channel.type === 'D') {
                 isDirect = true;
                 if (this.state.users.length > 1) {
@@ -258,12 +255,11 @@ module.exports = React.createClass({
                 }
             }
 
-            if(this.state.channel.description.length == 0){
-                popoverContent = React.renderToString(<div>No channel description yet. <br /><a href='#' data-toggle='modal' data-desc={this.state.channel.description} data-title={this.state.channel.display_name} data-channelid={this.state.channel.id} data-target='#edit_channel'>Click here</a> to add one.</div>);
+            if (channel.description.length == 0) {
+                popoverContent = React.renderToString(<div>No channel description yet. <br /><a href='#' data-toggle='modal' data-desc={channel.description} data-title={channel.display_name} data-channelid={channel.id} data-target='#edit_channel'>Click here</a> to add one.</div>);
             }
         }
 
-        var loginForm = currentId == null ? <NavbarLoginForm /> : null;
         var navbar_collapse_button = currentId != null ? null :
                         <button type="button" className="navbar-toggle" data-toggle="collapse" data-target="#navbar-collapse-1">
                             <span className="sr-only">Toggle sidebar</span>
@@ -292,60 +288,61 @@ module.exports = React.createClass({
                         { navbar_collapse_button }
                         { sidebar_collapse_button }
                         { right_sidebar_collapse_button }
-                    { !isDirect && this.state.channel ?
-                        <div className="navbar-brand">
-                            <div className="dropdown">
-                                <div data-toggle="popover" data-content={popoverContent} className="description info-popover"></div>
-                                <a href="#" className="dropdown-toggle theme" type="button" id="channel_header_dropdown" data-toggle="dropdown" aria-expanded="true">
-                                    <strong className="heading">{channelTitle} </strong>
-                                    <span className="glyphicon glyphicon-chevron-down header-dropdown__icon"></span>
-                                </a>
-                                <ul className="dropdown-menu" role="menu" aria-labelledby="channel_header_dropdown">
-                                    <li role="presentation"><a role="menuitem" data-toggle="modal" data-target="#channel_invite" href="#">Add Members</a></li>
-                                    { isAdmin ?
-                                        <li role="presentation"><a role="menuitem" data-toggle="modal" data-target="#channel_members" href="#">Manage Members</a></li>
-                                        : ""
-                                    }
-                                    <li role="presentation"><a role="menuitem" href="#" data-toggle="modal" data-target="#edit_channel" data-desc={this.state.channel.description} data-title={this.state.channel.display_name} data-channelid={this.state.channel.id}>Set Channel Description...</a></li>
-                                    <li role="presentation"><a role="menuitem" href="#" data-toggle="modal" data-target="#channel_notifications" data-title={this.state.channel.display_name} data-channelid={this.state.channel.id}>Notification Preferences</a></li>
-                                    { isAdmin && channelName != Constants.DEFAULT_CHANNEL ?
-                                        <li role="presentation"><a role="menuitem" href="#" data-toggle="modal" data-target="#rename_channel" data-display={this.state.channel.display_name} data-name={this.state.channel.name} data-channelid={this.state.channel.id}>Rename Channel...</a></li>
-                                        : ""
-                                    }
-                                    { isAdmin && channelName != Constants.DEFAULT_CHANNEL ?
-                                        <li role="presentation"><a role="menuitem" href="#" data-toggle="modal" data-target="#delete_channel" data-title={this.state.channel.display_name} data-channelid={this.state.channel.id}>Delete Channel...</a></li>
-                                        : ""
-                                    }
-                                    { channelName != Constants.DEFAULT_CHANNEL ?
-                                        <li role="presentation"><a role="menuitem" href="#" onClick={this.handleLeave}>Leave Channel</a></li>
-                                        : ""
-                                    }
-                                </ul>
+                        { !isDirect && channel ?
+                            <div className="navbar-brand">
+                                <div className="dropdown">
+                                    <div data-toggle="popover" data-content={popoverContent} className="description info-popover"></div>
+                                    <a href="#" className="dropdown-toggle theme" type="button" id="channel_header_dropdown" data-toggle="dropdown" aria-expanded="true">
+                                        <span className="heading">{channelTitle} </span>
+                                        <span className="glyphicon glyphicon-chevron-down header-dropdown__icon"></span>
+                                    </a>
+                                    <ul className="dropdown-menu" role="menu" aria-labelledby="channel_header_dropdown">
+                                        { !ChannelStore.isDefault(channel) ?
+                                            <li role="presentation"><a role="menuitem" data-toggle="modal" data-target="#channel_invite" href="#">Add Members</a></li>
+                                            : null
+                                        }
+                                        { isAdmin && !ChannelStore.isDefault(channel) ?
+                                            <li role="presentation"><a role="menuitem" data-toggle="modal" data-target="#channel_members" href="#">Manage Members</a></li>
+                                            : null
+                                        }
+                                        <li role="presentation"><a role="menuitem" href="#" data-toggle="modal" data-target="#edit_channel" data-desc={channel.description} data-title={channel.display_name} data-channelid={channel.id}>Set Channel Description...</a></li>
+                                        <li role="presentation"><a role="menuitem" href="#" data-toggle="modal" data-target="#channel_notifications" data-title={channel.display_name} data-channelid={channel.id}>Notification Preferences</a></li>
+                                        { isAdmin && !ChannelStore.isDefault(channel) ?
+                                            <li role="presentation"><a role="menuitem" href="#" data-toggle="modal" data-target="#rename_channel" data-display={channel.display_name} data-name={channel.name} data-channelid={channel.id}>Rename Channel...</a></li>
+                                            : null
+                                        }
+                                        { isAdmin && !ChannelStore.isDefault(channel) ?
+                                            <li role="presentation"><a role="menuitem" href="#" data-toggle="modal" data-target="#delete_channel" data-title={channel.display_name} data-channelid={channel.id}>Delete Channel...</a></li>
+                                            : null
+                                        }
+                                        { !ChannelStore.isDefault(channel) ?
+                                            <li role="presentation"><a role="menuitem" href="#" onClick={this.handleLeave}>Leave Channel</a></li>
+                                            : null
+                                        }
+                                    </ul>
+                                </div>
                             </div>
-                        </div>
-                        : "" }
-                        { isDirect && this.state.channel ?
+                            : null
+                        }
+                        { isDirect && channel ?
                             <div className="navbar-brand">
-                                <strong>
-                                    <a href="#"><strong className="heading">{channelTitle}</strong></a>
-                                </strong>
+                                <a href="#" className="heading">{ channelTitle }</a>
                             </div>
-                        : "" }
-                        { !this.state.channel ?
+                        : null }
+                        { !channel ?
                             <div className="navbar-brand">
-                                <strong>
-                                    <a href="/"><strong className="heading">{ channelTitle }</strong></a>
-                                </strong>
+                                <a href="/" className="heading">{ channelTitle }</a>
                             </div>
-                        : "" }
-                    </div>
-                    <div className="collapse navbar-collapse" id="navbar-collapse-1">
-                        { loginForm }
+                        : null }
                     </div>
+                    { !currentId ?
+                        <div className="collapse navbar-collapse" id="navbar-collapse-1">
+                            <NavbarLoginForm />
+                        </div>
+                        : null
+                    }
                 </div>
             </nav>
         );
-}
+    }
 });
-
-
-- 
cgit v1.2.3-1-g7c22

