Skip to content
This repository has been archived by the owner on Mar 13, 2024. It is now read-only.

loader for user modals #630

Merged
merged 3 commits into from
Feb 6, 2018
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add loader for channel_invite_modal and add_users_to_team modal
 * Fix loader for search in all multiselect modals
  • Loading branch information
sudheer committed Feb 5, 2018
commit 750f86308f0334095be8b93731747bf48dd900fb
24 changes: 20 additions & 4 deletions components/add_users_to_team/add_users_to_team.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ export default class AddUsersToTeam extends React.Component {
show: true,
search: false,
saving: false,
addError: null
addError: null,
loadingUsers: true
};
}

Expand All @@ -58,7 +59,9 @@ export default class AddUsersToTeam extends React.Component {
UserStore.addNotInTeamChangeListener(this.onChange);
UserStore.addStatusesChangeListener(this.onChange);

this.props.actions.getProfilesNotInTeam(TeamStore.getCurrentId(), 0, USERS_PER_PAGE * 2);
this.props.actions.getProfilesNotInTeam(TeamStore.getCurrentId(), 0, USERS_PER_PAGE * 2).then(() => {
this.setUsersLoadingState(false);
});
}

componentWillUnmount() {
Expand Down Expand Up @@ -124,6 +127,12 @@ export default class AddUsersToTeam extends React.Component {
this.setState({values});
}

setUsersLoadingState = (loadingState) => {
this.setState({
loadingUsers: loadingState
});
}

onChange() {
let users;
if (this.term) {
Expand All @@ -146,7 +155,10 @@ export default class AddUsersToTeam extends React.Component {

handlePageChange(page, prevPage) {
if (page > prevPage) {
this.props.actions.getProfilesNotInTeam(TeamStore.getCurrentId(), page + 1, USERS_PER_PAGE);
this.setUsersLoadingState(true);
this.props.actions.getProfilesNotInTeam(TeamStore.getCurrentId(), page + 1, USERS_PER_PAGE).then(() => {
this.setUsersLoadingState(false);
});
}
}

Expand All @@ -161,7 +173,10 @@ export default class AddUsersToTeam extends React.Component {

this.searchTimeoutId = setTimeout(
() => {
searchUsersNotInTeam(term, TeamStore.getCurrentId(), {});
this.setUsersLoadingState(true);
searchUsersNotInTeam(term, TeamStore.getCurrentId(), {}).then(() => {
this.setUsersLoadingState(false);
});
},
Constants.SEARCH_TIMEOUT_MILLISECONDS
);
Expand Down Expand Up @@ -273,6 +288,7 @@ export default class AddUsersToTeam extends React.Component {
numRemainingText={numRemainingText}
buttonSubmitText={buttonSubmitText}
saving={this.state.saving}
loading={this.state.loadingUsers}
/>
</Modal.Body>
</Modal>
Expand Down
23 changes: 19 additions & 4 deletions components/channel_invite_modal/channel_invite_modal.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ export default class ChannelInviteModal extends React.Component {
values: [],
show: true,
statusChange: false,
saving: false
saving: false,
loadingUsers: true
};
}

Expand All @@ -67,7 +68,9 @@ export default class ChannelInviteModal extends React.Component {
UserStore.addNotInChannelChangeListener(this.onChange);
UserStore.addStatusesChangeListener(this.onStatusChange);

this.props.actions.getProfilesNotInChannel(TeamStore.getCurrentId(), this.props.channel.id, 0);
this.props.actions.getProfilesNotInChannel(TeamStore.getCurrentId(), this.props.channel.id, 0).then(() => {
this.setUsersLoadingState(false);
});
this.props.actions.getTeamStats(TeamStore.getCurrentId());
}

Expand Down Expand Up @@ -124,9 +127,18 @@ export default class ChannelInviteModal extends React.Component {
this.setState({values});
}

setUsersLoadingState = (loadingState) => {
this.setState({
loadingUsers: loadingState
});
}

handlePageChange = (page, prevPage) => {
if (page > prevPage) {
this.props.actions.getProfilesNotInChannel(TeamStore.getCurrentId(), this.props.channel.id, page + 1, USERS_PER_PAGE);
this.setUsersLoadingState(true);
this.props.actions.getProfilesNotInChannel(TeamStore.getCurrentId(), this.props.channel.id, page + 1, USERS_PER_PAGE).then(() => {
this.setUsersLoadingState(false);
});
}
}

Expand Down Expand Up @@ -169,7 +181,10 @@ export default class ChannelInviteModal extends React.Component {

this.searchTimeoutId = setTimeout(
() => {
searchUsers(term, TeamStore.getCurrentId(), {not_in_channel_id: this.props.channel.id});
this.setUsersLoadingState(true);
searchUsers(term, TeamStore.getCurrentId(), {not_in_channel_id: this.props.channel.id}).then(() => {
this.setUsersLoadingState(false);
});
},
Constants.SEARCH_TIMEOUT_MILLISECONDS
);
Expand Down
59 changes: 30 additions & 29 deletions components/more_direct_channels/more_direct_channels.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -65,24 +65,16 @@ export default class MoreDirectChannels extends React.Component {
values,
show: true,
search: false,
savingChannel: false,
loadingChannels: true
saving: false,
loadingUsers: true
};
}

componentDidMount() {
UserStore.addChangeListener(this.onChange);
UserStore.addInTeamChangeListener(this.onChange);
UserStore.addStatusesChangeListener(this.onChange);
if (this.listType === 'any') {
this.props.actions.getProfiles(0, USERS_PER_PAGE * 2, false).then(() => {
this.toggleChannelLoadingState();
});
} else {
this.props.actions.getProfilesInTeam(TeamStore.getCurrentId(), 0, USERS_PER_PAGE * 2).then(() => {
this.toggleChannelLoadingState();
});
}
this.getUserProfiles();
}

componentWillUnmount() {
Expand All @@ -95,9 +87,9 @@ export default class MoreDirectChannels extends React.Component {
this.setState({show: false});
}

toggleChannelLoadingState = (forceFlag) => {
setUsersLoadingState = (loadingState) => {
this.setState({
loadingChannels: typeof forceFlag === 'undefined' ? !this.state.loadingChannels : forceFlag
loadingUsers: loadingState
});
}

Expand All @@ -112,7 +104,7 @@ export default class MoreDirectChannels extends React.Component {
}

handleSubmit(values = this.state.values) {
if (this.state.savingChannel) {
if (this.state.saving) {
return;
}

Expand All @@ -121,19 +113,19 @@ export default class MoreDirectChannels extends React.Component {
return;
}

this.setState({savingChannel: true});
this.setState({saving: true});

const success = (channel) => {
// Due to how react-overlays Modal handles focus, we delay pushing
// the new channel information until the modal is fully exited.
// The channel information will be pushed in `handleExit`
this.exitToChannel = TeamStore.getCurrentTeamRelativeUrl() + '/channels/' + channel.name;
this.setState({savingChannel: false});
this.setState({saving: false});
this.handleHide();
};

const error = () => {
this.setState({savingChannel: false});
this.setState({saving: false});
};

if (userIds.length === 1) {
Expand Down Expand Up @@ -180,17 +172,23 @@ export default class MoreDirectChannels extends React.Component {
});
}

getUserProfiles(page) {
const pageNum = page ? page + 1 : 0;
if (this.listType === 'any') {
this.props.actions.getProfiles(pageNum, USERS_PER_PAGE * 2).then(() => {
this.setUsersLoadingState(false);
});
} else {
this.props.actions.getProfilesInTeam(TeamStore.getCurrentId(), pageNum, USERS_PER_PAGE * 2).then(() => {
this.setUsersLoadingState(false);
});
}
}

handlePageChange(page, prevPage) {
if (page > prevPage) {
if (this.listType === 'any') {
this.props.actions.getProfiles(page + 1, USERS_PER_PAGE).then(() => {
this.toggleChannelLoadingState(false);
});
} else {
this.props.actions.getProfilesInTeam(page + 1, USERS_PER_PAGE).then(() => {
this.toggleChannelLoadingState(false);
});
}
this.setUsersLoadingState(true);
this.getUserProfiles(page);
}
}

Expand Down Expand Up @@ -219,7 +217,10 @@ export default class MoreDirectChannels extends React.Component {

this.searchTimeoutId = setTimeout(
() => {
searchUsers(term, teamId, {}, this.resetPaging);
this.setUsersLoadingState(true);
searchUsers(term, teamId, {}, this.resetPaging).then(() => {
this.setUsersLoadingState(false);
});
},
Constants.SEARCH_TIMEOUT_MILLISECONDS
);
Expand Down Expand Up @@ -382,8 +383,8 @@ export default class MoreDirectChannels extends React.Component {
numRemainingText={numRemainingText}
buttonSubmitText={buttonSubmitText}
submitImmediatelyOn={this.handleSubmitImmediatelyOn}
saving={this.state.savingChannel}
loadingChannels={this.state.loadingChannels}
saving={this.state.saving}
loading={this.state.loadingUsers}
/>
</Modal.Body>
</Modal>
Expand Down
59 changes: 30 additions & 29 deletions components/multiselect/multiselect.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -191,33 +191,34 @@ export default class MultiSelect extends React.Component {
const pageStart = this.state.page * this.props.perPage;
const pageEnd = pageStart + this.props.perPage;
optionsToDisplay = options.slice(pageStart, pageEnd);

if (options.length > pageEnd) {
nextButton = (
<button
className='btn btn-default filter-control filter-control__next'
onClick={this.nextPage}
>
<FormattedMessage
id='filtered_user_list.next'
defaultMessage='Next'
/>
</button>
);
}

if (this.state.page > 0) {
previousButton = (
<button
className='btn btn-default filter-control filter-control__prev'
onClick={this.prevPage}
>
<FormattedMessage
id='filtered_user_list.prev'
defaultMessage='Previous'
/>
</button>
);
if (!this.props.loading) {
if (options.length > pageEnd) {
nextButton = (
<button
className='btn btn-default filter-control filter-control__next'
onClick={this.nextPage}
>
<FormattedMessage
id='filtered_user_list.next'
defaultMessage='Next'
/>
</button>
);
}

if (this.state.page > 0) {
previousButton = (
<button
className='btn btn-default filter-control filter-control__prev'
onClick={this.prevPage}
>
<FormattedMessage
id='filtered_user_list.prev'
defaultMessage='Previous'
/>
</button>
);
}
}
} else {
optionsToDisplay = options;
Expand Down Expand Up @@ -267,7 +268,7 @@ export default class MultiSelect extends React.Component {
onPageChange={this.props.handlePageChange}
onAdd={this.onAdd}
onSelect={this.onSelect}
loadingChannels={this.props.loadingChannels}
loading={this.props.loading}
/>
<div className='filter-controls'>
{previousButton}
Expand Down Expand Up @@ -295,5 +296,5 @@ MultiSelect.propTypes = {
buttonSubmitText: PropTypes.node,
submitImmediatelyOn: PropTypes.func,
saving: PropTypes.bool,
loadingChannels: PropTypes.bool
loading: PropTypes.bool
};
4 changes: 2 additions & 2 deletions components/multiselect/multiselect_list.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ export default class MultiSelectList extends React.Component {

render() {
const options = this.props.options;
if (this.props.loadingChannels) {
if (this.props.loading) {
return (
<div>
<LoadingScreen
Expand Down Expand Up @@ -177,5 +177,5 @@ MultiSelectList.propTypes = {
onPageChange: PropTypes.func,
onAdd: PropTypes.func,
onSelect: PropTypes.func,
loadingChannels: PropTypes.bool
loading: PropTypes.bool
};