Added spinner icon to select_team listing after clicking on a team to load (#4120)

Этот коммит содержится в:
Harrison Healey
2016-09-30 07:26:52 -04:00
коммит произвёл Christopher Speller
родитель d42eb46133
Коммит 13bd14d626
5 изменённых файлов: 82 добавлений и 41 удалений

Просмотреть файл

@@ -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>
);
}
}

Просмотреть файл

Просмотреть файл

@@ -9,6 +9,7 @@ import ErrorBar from 'components/error_bar.jsx';
import LoadingScreen from 'components/loading_screen.jsx'; import LoadingScreen from 'components/loading_screen.jsx';
import * as AsyncClient from 'utils/async_client.jsx'; import * as AsyncClient from 'utils/async_client.jsx';
import * as GlobalActions from 'actions/global_actions.jsx'; import * as GlobalActions from 'actions/global_actions.jsx';
import SelectTeamItem from './components/select_team_item.jsx';
import {Link} from 'react-router/es6'; import {Link} from 'react-router/es6';
@@ -22,8 +23,10 @@ export default class SelectTeam extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.onTeamChange = this.onTeamChange.bind(this); this.onTeamChange = this.onTeamChange.bind(this);
this.handleTeamClick = this.handleTeamClick.bind(this);
const state = this.getStateFromStores(false); const state = this.getStateFromStores(false);
state.loadingTeamId = '';
this.state = state; this.state = state;
} }
@@ -49,6 +52,10 @@ export default class SelectTeam extends React.Component {
}; };
} }
handleTeamClick(team) {
this.setState({loadingTeamId: team.id});
}
render() { render() {
let content = null; let content = null;
let teamContents = []; let teamContents = [];
@@ -56,51 +63,36 @@ export default class SelectTeam extends React.Component {
const isSystemAdmin = Utils.isSystemAdmin(UserStore.getCurrentUser().roles); const isSystemAdmin = Utils.isSystemAdmin(UserStore.getCurrentUser().roles);
let teamMembersCount = 0; let teamMembersCount = 0;
for (var index in this.state.teamMembers) { for (const teamMember of this.state.teamMembers) {
if (this.state.teamMembers.hasOwnProperty(index)) { const teamId = teamMember.team_id;
var teamMember = this.state.teamMembers[index]; const team = this.state.teams[teamId];
var team = this.state.teams[teamMember.team_id]; isAlreadyMember[teamId] = true;
isAlreadyMember[teamMember.team_id] = true; teamMembersCount++;
teamMembersCount++;
teamContents.push( teamContents.push(
<div <SelectTeamItem
key={'team_' + team.name} key={'team_' + team.name}
className='signup-team-dir' team={team}
> url={'/' + team.name + '/channels/town-square'}
<Link onTeamClick={this.handleTeamClick}
to={'/' + team.name + '/channels/town-square'} loading={this.state.loadingTeamId === teamId}
> />
<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>
);
}
} }
var openTeamContents = []; var openTeamContents = [];
for (var id in this.state.teamListings) { for (const id in this.state.teamListings) {
if (this.state.teamListings.hasOwnProperty(id) && !isAlreadyMember[id]) { if (this.state.teamListings.hasOwnProperty(id) && !isAlreadyMember[id]) {
var openTeam = this.state.teamListings[id]; const openTeam = this.state.teamListings[id];
openTeamContents.push( openTeamContents.push(
<div <SelectTeamItem
key={'team_' + openTeam.name} key={'team_' + openTeam.name}
className='signup-team-dir' team={openTeam}
> url={`/signup_user_complete/?id=${openTeam.invite_id}`}
<Link onTeamClick={this.handleTeamClick}
to={`/signup_user_complete/?id=${openTeam.invite_id}`} loading={this.state.loadingTeamId === openTeam.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>
); );
} }
} }

Просмотреть файл

@@ -493,9 +493,8 @@
top: .66em; top: .66em;
&.fa-spin { &.fa-spin {
color: $gray;
font-size: .9em; font-size: .9em;
right: 10px; right: -2px;
top: 16px; top: 16px;
} }
} }

Просмотреть файл

@@ -139,7 +139,7 @@ class TeamStoreClass extends EventEmitter {
for (var index in this.team_members) { for (var index in this.team_members) {
if (this.team_members.hasOwnProperty(index)) { if (this.team_members.hasOwnProperty(index)) {
if (this.team_members[index].team_id === teamId) { if (this.team_members[index].team_id === teamId) {
Reflect.deleteProperty(this.team_members, index); this.team_members.splice(index, 1);
} }
} }
} }