summaryrefslogtreecommitdiffstats
path: root/webapp/components/select_team
diff options
context:
space:
mode:
authorHarrison Healey <harrisonmhealey@gmail.com>2016-09-30 07:26:52 -0400
committerChristopher Speller <crspeller@gmail.com>2016-09-30 07:26:52 -0400
commit13bd14d626f7bb2a347d3acdf456f945f1a6258e (patch)
tree6e65fbf051cd6dbe08f4290d80d6e4244e6abc59 /webapp/components/select_team
parentd42eb461330d4d2d23c25f6ea747725f08726230 (diff)
downloadchat-13bd14d626f7bb2a347d3acdf456f945f1a6258e.tar.gz
chat-13bd14d626f7bb2a347d3acdf456f945f1a6258e.tar.bz2
chat-13bd14d626f7bb2a347d3acdf456f945f1a6258e.zip
Added spinner icon to select_team listing after clicking on a team to load (#4120)
Diffstat (limited to 'webapp/components/select_team')
-rw-r--r--webapp/components/select_team/components/select_team_item.jsx50
-rw-r--r--webapp/components/select_team/components/select_team_listing.jsx0
-rw-r--r--webapp/components/select_team/select_team.jsx68
3 files changed, 80 insertions, 38 deletions
diff --git a/webapp/components/select_team/components/select_team_item.jsx b/webapp/components/select_team/components/select_team_item.jsx
new file mode 100644
index 000000000..b29c4b1c4
--- /dev/null
+++ b/webapp/components/select_team/components/select_team_item.jsx
@@ -0,0 +1,50 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import React from 'react';
+
+import {Link} from 'react-router/es6';
+
+export default class SelectTeamItem extends React.Component {
+ static propTypes = {
+ team: React.PropTypes.object.isRequired,
+ url: React.PropTypes.string.isRequired,
+ onTeamClick: React.PropTypes.func.isRequired,
+ loading: React.PropTypes.bool.isRequired
+ };
+
+ constructor(props) {
+ super(props);
+
+ this.handleTeamClick = this.handleTeamClick.bind(this);
+ }
+
+ handleTeamClick() {
+ this.props.onTeamClick(this.props.team);
+ }
+
+ render() {
+ let icon;
+ if (this.props.loading) {
+ icon = (
+ <span className='fa fa-refresh fa-spin right signup-team__icon'/>
+ );
+ } else {
+ icon = (
+ <span className='fa fa-angle-right right signup-team__icon'/>
+ );
+ }
+
+ return (
+ <div className='signup-team-dir'>
+ <Link
+ to={this.props.url}
+ onClick={this.handleTeamClick}
+ >
+ <span className='signup-team-dir__name'>{this.props.team.display_name}</span>
+ {icon}
+ </Link>
+ </div>
+ );
+ }
+}
diff --git a/webapp/components/select_team/components/select_team_listing.jsx b/webapp/components/select_team/components/select_team_listing.jsx
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/webapp/components/select_team/components/select_team_listing.jsx
diff --git a/webapp/components/select_team/select_team.jsx b/webapp/components/select_team/select_team.jsx
index 084ff64b2..e6156ecb9 100644
--- a/webapp/components/select_team/select_team.jsx
+++ b/webapp/components/select_team/select_team.jsx
@@ -9,6 +9,7 @@ import ErrorBar from 'components/error_bar.jsx';
import LoadingScreen from 'components/loading_screen.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
import * as GlobalActions from 'actions/global_actions.jsx';
+import SelectTeamItem from './components/select_team_item.jsx';
import {Link} from 'react-router/es6';
@@ -22,8 +23,10 @@ export default class SelectTeam extends React.Component {
constructor(props) {
super(props);
this.onTeamChange = this.onTeamChange.bind(this);
+ this.handleTeamClick = this.handleTeamClick.bind(this);
const state = this.getStateFromStores(false);
+ state.loadingTeamId = '';
this.state = state;
}
@@ -49,6 +52,10 @@ export default class SelectTeam extends React.Component {
};
}
+ handleTeamClick(team) {
+ this.setState({loadingTeamId: team.id});
+ }
+
render() {
let content = null;
let teamContents = [];
@@ -56,51 +63,36 @@ export default class SelectTeam extends React.Component {
const isSystemAdmin = Utils.isSystemAdmin(UserStore.getCurrentUser().roles);
let teamMembersCount = 0;
- for (var index in this.state.teamMembers) {
- if (this.state.teamMembers.hasOwnProperty(index)) {
- var teamMember = this.state.teamMembers[index];
- var team = this.state.teams[teamMember.team_id];
- isAlreadyMember[teamMember.team_id] = true;
- teamMembersCount++;
- teamContents.push(
- <div
- key={'team_' + team.name}
- className='signup-team-dir'
- >
- <Link
- to={'/' + team.name + '/channels/town-square'}
- >
- <span className='signup-team-dir__name'>{team.display_name}</span>
- <span
- className='fa fa-angle-right right signup-team__icon'
- aria-hidden='true'
- />
- </Link>
- </div>
- );
- }
+ for (const teamMember of this.state.teamMembers) {
+ const teamId = teamMember.team_id;
+ const team = this.state.teams[teamId];
+ isAlreadyMember[teamId] = true;
+ teamMembersCount++;
+
+ teamContents.push(
+ <SelectTeamItem
+ key={'team_' + team.name}
+ team={team}
+ url={'/' + team.name + '/channels/town-square'}
+ onTeamClick={this.handleTeamClick}
+ loading={this.state.loadingTeamId === teamId}
+ />
+ );
}
var openTeamContents = [];
- for (var id in this.state.teamListings) {
+ for (const id in this.state.teamListings) {
if (this.state.teamListings.hasOwnProperty(id) && !isAlreadyMember[id]) {
- var openTeam = this.state.teamListings[id];
+ const openTeam = this.state.teamListings[id];
openTeamContents.push(
- <div
+ <SelectTeamItem
key={'team_' + openTeam.name}
- className='signup-team-dir'
- >
- <Link
- to={`/signup_user_complete/?id=${openTeam.invite_id}`}
- >
- <span className='signup-team-dir__name'>{openTeam.display_name}</span>
- <span
- className='fa fa-angle-right right signup-team__icon'
- aria-hidden='true'
- />
- </Link>
- </div>
+ team={openTeam}
+ url={`/signup_user_complete/?id=${openTeam.invite_id}`}
+ onTeamClick={this.handleTeamClick}
+ loading={this.state.loadingTeamId === openTeam.id}
+ />
);
}
}