From 64e8332d38db07e6f121d7b72a37f8a24765c49e Mon Sep 17 00:00:00 2001 From: Ben Warzeski Date: Fri, 26 Jun 2020 14:46:51 -0400 Subject: [PATCH] Topic teams actions (#24336) * modern eslint allowances * update topic teams to request team membership per local teamset * update tests for topic_teams change * cleanup Co-authored-by: Ben Warzeski --- .../teams/static/teams/js/.eslintrc.json | 7 ++ .../teams/js/spec/views/teams_tab_spec.js | 85 +++++++------- .../teams/js/spec/views/topic_teams_spec.js | 100 +++++++++++----- .../teams/static/teams/js/views/teams_tab.js | 13 -- .../static/teams/js/views/topic_teams.js | 111 +++++++++++------- 5 files changed, 187 insertions(+), 129 deletions(-) create mode 100644 lms/djangoapps/teams/static/teams/js/.eslintrc.json diff --git a/lms/djangoapps/teams/static/teams/js/.eslintrc.json b/lms/djangoapps/teams/static/teams/js/.eslintrc.json new file mode 100644 index 0000000000..0ab11857ae --- /dev/null +++ b/lms/djangoapps/teams/static/teams/js/.eslintrc.json @@ -0,0 +1,7 @@ +{ + "rules": { + "comma-dangle": "off", + "object-curly-spacing": "off", + "no-underscore-dangle": "off" + } +} diff --git a/lms/djangoapps/teams/static/teams/js/spec/views/teams_tab_spec.js b/lms/djangoapps/teams/static/teams/js/spec/views/teams_tab_spec.js index 8866c2ef55..de4d13b8ac 100644 --- a/lms/djangoapps/teams/static/teams/js/spec/views/teams_tab_spec.js +++ b/lms/djangoapps/teams/static/teams/js/spec/views/teams_tab_spec.js @@ -38,14 +38,14 @@ define([ )); }; - var createTeamsTabView = function(test, options) { + var createTeamsTabView = function(options) { var teamsTabView = new TeamsTabView( { el: $('.teams-content'), context: TeamSpecHelpers.createMockContext(options) } ); - requests = AjaxHelpers.requests(test); + requests = AjaxHelpers.requests(); PageHelpers.preventBackboneChangingUrl(); teamsTabView.start(); return teamsTabView; @@ -65,7 +65,7 @@ define([ describe('Navigation', function() { it('does not render breadcrumbs for the top level tabs', function() { - var teamsTabView = createTeamsTabView(this); + var teamsTabView = createTeamsTabView(); teamsTabView.router.navigate('#my-teams', {trigger: true}); expect(teamsTabView.$('.breadcrumbs').length).toBe(0); teamsTabView.router.navigate('#browse', {trigger: true}); @@ -73,20 +73,20 @@ define([ }); it('does not interfere with anchor links to #main', function() { - var teamsTabView = createTeamsTabView(this); + var teamsTabView = createTeamsTabView(); teamsTabView.router.navigate('#main', {trigger: true}); expect(teamsTabView.$('.wrapper-msg')).toHaveClass('is-hidden'); }); it('displays and focuses an error message when trying to navigate to a nonexistent page', function() { - var teamsTabView = createTeamsTabView(this); + var teamsTabView = createTeamsTabView(); teamsTabView.router.navigate('no_such_page', {trigger: true}); expectError(teamsTabView, 'The page "no_such_page" could not be found.'); expectFocus(teamsTabView.$('.warning')); }); it('displays and focuses an error message when trying to navigate to a nonexistent topic', function() { - var teamsTabView = createTeamsTabView(this); + var teamsTabView = createTeamsTabView(); teamsTabView.router.navigate('topics/no_such_topic', {trigger: true}); AjaxHelpers.expectRequest(requests, 'GET', '/api/team/v0/topics/no_such_topic,course/1', null); AjaxHelpers.respondWithError(requests, 404); @@ -95,7 +95,7 @@ define([ }); it('displays and focuses an error message when trying to navigate to a nonexistent team', function() { - var teamsTabView = createTeamsTabView(this); + var teamsTabView = createTeamsTabView(); teamsTabView.router.navigate('teams/' + TeamSpecHelpers.testTopicID + '/no_such_team', {trigger: true}); AjaxHelpers.expectRequest(requests, 'GET', '/api/team/v0/teams/no_such_team?expand=user', null); AjaxHelpers.respondWithError(requests, 404); @@ -104,7 +104,7 @@ define([ }); it('displays and focuses an error message when it receives a 401 AJAX response', function() { - var teamsTabView = createTeamsTabView(this).render(); + var teamsTabView = createTeamsTabView().render(); teamsTabView.router.navigate('topics/' + TeamSpecHelpers.testTopicID, {trigger: true}); AjaxHelpers.respondWithError(requests, 401); expectError(teamsTabView, 'Your request could not be completed. Reload the page and try again.'); @@ -112,7 +112,7 @@ define([ }); it('displays and focuses an error message when it receives a 500 AJAX response', function() { - var teamsTabView = createTeamsTabView(this).render(); + var teamsTabView = createTeamsTabView().render(); teamsTabView.router.navigate('topics/' + TeamSpecHelpers.testTopicID, {trigger: true}); AjaxHelpers.respondWithError(requests, 500); expectError( @@ -124,7 +124,7 @@ define([ }); it('does not navigate to the topics page when syncing its collection if not on search page', function() { - var teamsTabView = createTeamsTabView(this), + var teamsTabView = createTeamsTabView(), collection = TeamSpecHelpers.createMockTeams(); teamsTabView.createTeamsListView({ collection: collection, @@ -179,7 +179,7 @@ define([ } ] }, function(url, expectedEvent) { - var teamsTabView = createTeamsTabView(this, { + var teamsTabView = createTeamsTabView({ userInfo: TeamSpecHelpers.createMockUserInfo({staff: true}) }); teamsTabView.teamsCollection = TeamSpecHelpers.createMockTeams(); @@ -193,7 +193,7 @@ define([ describe('Discussion privileges', function() { it('allows privileged access to any team', function() { - var teamsTabView = createTeamsTabView(this, { + var teamsTabView = createTeamsTabView({ userInfo: TeamSpecHelpers.createMockUserInfo({privileged: true}) }); // Note: using `undefined` here to ensure that we @@ -203,7 +203,7 @@ define([ }); it('allows access to a team which an unprivileged user is a member of', function() { - var teamsTabView = createTeamsTabView(this, { + var teamsTabView = createTeamsTabView({ userInfo: TeamSpecHelpers.createMockUserInfo({ username: TeamSpecHelpers.testUser, privileged: false @@ -221,7 +221,7 @@ define([ }); it('does not allow access if the user is neither privileged nor a team member', function() { - var teamsTabView = createTeamsTabView(this, { + var teamsTabView = createTeamsTabView({ userInfo: TeamSpecHelpers.createMockUserInfo({privileged: false, staff: true}) }); expect(teamsTabView.readOnlyDiscussion({ @@ -233,7 +233,7 @@ define([ describe('Manage Tab', function() { var manageTabSelector = '.page-content-nav>.nav-item[data-url=manage]'; it('is not visible to unprivileged users', function() { - var teamsTabView = createTeamsTabView(this, { + var teamsTabView = createTeamsTabView({ userInfo: TeamSpecHelpers.createMockUserInfo({privileged: false}), hasManagedTopic: true }); @@ -241,7 +241,7 @@ define([ }); it('is not visible when there are no managed topics', function() { - var teamsTabView = createTeamsTabView(this, { + var teamsTabView = createTeamsTabView({ userInfo: TeamSpecHelpers.createMockUserInfo({privileged: true}), hasManagedTopic: false }); @@ -249,7 +249,7 @@ define([ }); it('is visible to privileged users when there is a managed topic', function() { - var teamsTabView = createTeamsTabView(this, { + var teamsTabView = createTeamsTabView({ userInfo: TeamSpecHelpers.createMockUserInfo({privileged: true}), hasManagedTopic: true }); @@ -260,7 +260,7 @@ define([ describe('Browse Tab', function() { var browseTabSelector = '.page-content-nav>.nav-item[data-url=browse]'; it('is not visible if there are no open and no public teamsets', function() { - var teamsTabView = createTeamsTabView(this, { + var teamsTabView = createTeamsTabView({ hasOpenTopic: false, hasPublicManagedTopic: false }); @@ -268,7 +268,7 @@ define([ }); it('is visible if there are open teamsets', function() { - var teamsTabView = createTeamsTabView(this, { + var teamsTabView = createTeamsTabView({ hasOpenTopic: true, hasPublicManagedTopic: false }); @@ -276,7 +276,7 @@ define([ }); it('is visible if there are public teamsets', function() { - var teamsTabView = createTeamsTabView(this, { + var teamsTabView = createTeamsTabView({ hasOpenTopic: false, hasPublicManagedTopic: true }); @@ -284,7 +284,7 @@ define([ }); it('is visible if there are both public and open teamsets', function() { - var teamsTabView = createTeamsTabView(this, { + var teamsTabView = createTeamsTabView({ hasOpenTopic: true, hasPublicManagedTopic: true }); @@ -293,39 +293,46 @@ define([ }); describe('Search', function() { - var performSearch = function(reqs, teamsTabView) { + var teamsTabView; + + var performSearch = function() { teamsTabView.$('.search-field').val('foo'); teamsTabView.$('.action-search').click(); verifyTeamsRequest({ order_by: '', text_search: 'foo' }); - AjaxHelpers.respondWithJson(reqs, TeamSpecHelpers.createMockTeamsResponse({results: []})); + AjaxHelpers.respondWithJson( + requests, + TeamSpecHelpers.createMockTeamsResponse({ results: [] } + )); + AjaxHelpers.respondWithJson(requests, { count: 0 }); - // Expect exactly one search request to be fired - AjaxHelpers.expectNoRequests(reqs); + // Expect exactly one search request to be fired, and one request to see if the user is + // in a team in the current teamset + AjaxHelpers.expectNoRequests(requests); }; - it('can search teams', function() { - var teamsTabView = createTeamsTabView(this); + beforeEach(function() { + teamsTabView = createTeamsTabView(); teamsTabView.browseTopic(TeamSpecHelpers.testTopicID); verifyTeamsRequest({ order_by: 'last_activity_at', text_search: '' }); AjaxHelpers.respondWithJson(requests, {}); - performSearch(requests, teamsTabView); + AjaxHelpers.respondWithJson(requests, { count: 0 }); + }); + + it('can search teams', function() { + performSearch(); expect(teamsTabView.$('.page-title').text()).toBe('Team Search'); expect(teamsTabView.$('.page-description').text()).toBe('Showing results for "foo"'); }); it('can clear a search', function() { - var teamsTabView = createTeamsTabView(this); - teamsTabView.browseTopic(TeamSpecHelpers.testTopicID); - AjaxHelpers.respondWithJson(requests, {}); - // Perform a search - performSearch(requests, teamsTabView); + performSearch(); // Clear the search and submit it again teamsTabView.$('.search-field').val(''); @@ -335,17 +342,14 @@ define([ order_by: 'last_activity_at' }); AjaxHelpers.respondWithJson(requests, {}); + AjaxHelpers.respondWithJson(requests, { count: 0 }); expect(teamsTabView.$('.page-title').text()).toBe('Test Topic 1'); expect(teamsTabView.$('.page-description').text()).toBe('Test description 1'); }); it('can navigate back to all teams from a search', function() { - var teamsTabView = createTeamsTabView(this); - teamsTabView.browseTopic(TeamSpecHelpers.testTopicID); - AjaxHelpers.respondWithJson(requests, {}); - // Perform a search - performSearch(requests, teamsTabView); + performSearch(); // Verify the breadcrumbs have a link back to the teams list, and click on it expect(teamsTabView.$('.breadcrumbs a').length).toBe(2); @@ -355,15 +359,12 @@ define([ text_search: '' }); AjaxHelpers.respondWithJson(requests, {}); + AjaxHelpers.respondWithJson(requests, { count: 0 }); expect(teamsTabView.$('.page-title').text()).toBe('Test Topic 1'); expect(teamsTabView.$('.page-description').text()).toBe('Test description 1'); }); it('does not switch to showing results when the search returns an error', function() { - var teamsTabView = createTeamsTabView(this); - teamsTabView.browseTopic(TeamSpecHelpers.testTopicID); - AjaxHelpers.respondWithJson(requests, {}); - // Perform a search but respond with a 500 teamsTabView.$('.search-field').val('foo'); teamsTabView.$('.action-search').click(); diff --git a/lms/djangoapps/teams/static/teams/js/spec/views/topic_teams_spec.js b/lms/djangoapps/teams/static/teams/js/spec/views/topic_teams_spec.js index f58878f345..5048422012 100644 --- a/lms/djangoapps/teams/static/teams/js/spec/views/topic_teams_spec.js +++ b/lms/djangoapps/teams/static/teams/js/spec/views/topic_teams_spec.js @@ -2,33 +2,69 @@ define([ 'backbone', 'underscore', 'teams/js/views/topic_teams', + 'edx-ui-toolkit/js/utils/spec-helpers/ajax-helpers', 'teams/js/spec_helpers/team_spec_helpers', 'common/js/spec_helpers/page_helpers' -], function(Backbone, _, TopicTeamsView, TeamSpecHelpers, PageHelpers) { +], function(Backbone, _, TopicTeamsView, AjaxHelpers, TeamSpecHelpers, PageHelpers) { 'use strict'; describe('Topic Teams View', function() { - var createTopicTeamsView = function(options, isInstructorManagedTopic) { - options = options || {}; // eslint-disable-line no-param-reassign - return new TopicTeamsView({ + var requests, teamsView; + + var verifyTeamsetTeamsRequest = function(hasTeams) { + AjaxHelpers.expectRequestURL( + requests, + TeamSpecHelpers.testContext.teamMembershipsUrl, + { + username: TeamSpecHelpers.testUser, + course_id: TeamSpecHelpers.testCourseID, + teamset_id: TeamSpecHelpers.testTopicID, + } + ); + AjaxHelpers.respondWithJson( + requests, + { count: hasTeams ? 1 : 0 } + ); + AjaxHelpers.expectNoRequests(requests); + }; + + var createTopicTeamsView = function(_options) { + var options = _options || {}; + var onTeamInTeamset = options.onTeamInTeamset || false, + isInstructorManagedTopic = options.isInstructorManagedTopic || false; + + var result, topicTeamsView; + + requests = AjaxHelpers.requests(this); + topicTeamsView = new TopicTeamsView({ el: '.teams-container', model: isInstructorManagedTopic ? TeamSpecHelpers.createMockInstructorManagedTopic() : TeamSpecHelpers.createMockTopic(), collection: options.teams || TeamSpecHelpers.createMockTeams({results: []}), - myTopicTeamsCollection: ( - options.myTopicTeamsCollection || TeamSpecHelpers.createMockTeams({results: []}) - ), context: _.extend({}, TeamSpecHelpers.testContext, options) - }).render(); + }); + result = topicTeamsView.render(); + + if ( + topicTeamsView.context.userInfo.staff || + topicTeamsView.context.userInfo.privileged || + isInstructorManagedTopic + ) { + AjaxHelpers.expectNoRequests(requests); + } else { + verifyTeamsetTeamsRequest(onTeamInTeamset); + } + return result; }; - var verifyActions = function(teamsView, options) { + var verifyActions = function(showActions) { var expectedTitle = 'Are you having trouble finding a team to join?', expectedMessage = 'Browse teams in other topics or search teams in this topic. ' + 'If you still can\'t find a team to join, create a new team in this topic.', title = teamsView.$('.title').text().trim(), - message = teamsView.$('.copy').text().trim(); - options = options || {showActions: true}; // eslint-disable-line no-param-reassign - if (options.showActions) { + message = teamsView.$('.copy').text().trim(), + _showActions = showActions === undefined ? true : showActions; + + if (_showActions) { expect(title).toBe(expectedTitle); expect(message).toBe(expectedMessage); } else { @@ -49,32 +85,35 @@ define([ results: testTeamData }) }; - var teamsView = createTopicTeamsView(options); - var footerEl = teamsView.$('.teams-paging-footer'); + var footerEl; + + teamsView = createTopicTeamsView(options); + footerEl = teamsView.$('.teams-paging-footer'); + expect(teamsView.$('.teams-paging-header').text()).toMatch('Showing 1-5 out of 6 total'); expect(footerEl.text()).toMatch('1\\s+out of\\s+\/\\s+2'); // eslint-disable-line no-useless-escape expect(footerEl).not.toHaveClass('hidden'); TeamSpecHelpers.verifyCards(teamsView, testTeamData); - verifyActions(teamsView); + verifyActions(); }); it('can browse all teams', function() { - var teamsView = createTopicTeamsView(); + teamsView = createTopicTeamsView(); spyOn(Backbone.history, 'navigate'); teamsView.$('.browse-teams').click(); expect(Backbone.history.navigate.calls.mostRecent().args[0]).toBe('browse'); }); it('gives the search field focus when clicking on the search teams link', function() { - var teamsView = createTopicTeamsView(); + teamsView = createTopicTeamsView(); spyOn($.fn, 'focus').and.callThrough(); teamsView.$('.search-teams').click(); expect(teamsView.$('.search-field').first().focus).toHaveBeenCalled(); }); it('can show the create team modal', function() { - var teamsView = createTopicTeamsView(); + teamsView = createTopicTeamsView(); spyOn(Backbone.history, 'navigate'); teamsView.$('a.create-team').click(); expect(Backbone.history.navigate.calls.mostRecent().args[0]).toBe( @@ -83,14 +122,13 @@ define([ }); it('does not show actions for a user already in a team in the teamset', function() { - var options = {myTopicTeamsCollection: TeamSpecHelpers.createMockTeams()}; - var teamsView = createTopicTeamsView(options); - verifyActions(teamsView, {showActions: false}); + teamsView = createTopicTeamsView({ onTeamInTeamset: true }); + verifyActions(false); }); it('does not show actions for a student in an instructor managed topic', function() { - var teamsView = createTopicTeamsView({}, true); - verifyActions(teamsView, {showActions: false}); + teamsView = createTopicTeamsView({ isInstructorManagedTopic: true }); + verifyActions(false); }); it('shows actions for a privileged user already in a team', function() { @@ -99,10 +137,10 @@ define([ privileged: true, staff: false }, - myTopicTeamsCollection: TeamSpecHelpers.createMockTeams() + onTeamInTeamset: true, }; - var teamsView = createTopicTeamsView(options); - verifyActions(teamsView, {showActions: true}); + teamsView = createTopicTeamsView(options); + verifyActions(); }); it('shows actions for a staff user already in a team', function() { @@ -111,10 +149,10 @@ define([ privileged: false, staff: true }, - myTopicTeamsCollection: TeamSpecHelpers.createMockTeams() + onTeamInTeamset: true, }; - var teamsView = createTopicTeamsView(options); - verifyActions(teamsView, {showActions: true}); + teamsView = createTopicTeamsView(options); + verifyActions(); }); /* @@ -123,7 +161,7 @@ define([ var requests = AjaxHelpers.requests(this), teamMemberships = TeamSpecHelpers.createMockTeamMemberships([]), teamsView = createTopicTeamsView({ teamMemberships: teamMemberships }); - verifyActions(teamsView, {showActions: true}); + verifyActions({showActions: true}); teamMemberships.teamEvents.trigger('teams:update', { action: 'create' }); teamsView.render(); AjaxHelpers.expectRequestURL( @@ -138,7 +176,7 @@ define([ } ); AjaxHelpers.respondWithJson(requests, {}); - verifyActions(teamsView, {showActions: false}); + verifyActions({showActions: false}); }); */ }); diff --git a/lms/djangoapps/teams/static/teams/js/views/teams_tab.js b/lms/djangoapps/teams/static/teams/js/views/teams_tab.js index e80f2265ec..6f1a08952e 100644 --- a/lms/djangoapps/teams/static/teams/js/views/teams_tab.js +++ b/lms/djangoapps/teams/static/teams/js/views/teams_tab.js @@ -380,24 +380,11 @@ createTeamsListView: function(options) { var topic = options.topic, collection = options.collection, - myTopicTeamsCollection = new TeamCollection( - this.context.userInfo.teams, - { - teamEvents: this.teamEvents, - course_id: this.context.courseID, - username: this.context.userInfo.username, - topic_id: topic.get('id'), - perPage: 5, - parse: true, - url: this.context.myTeamsUrl - } - ), teamsView = new TopicTeamsView({ router: this.router, context: this.context, model: topic, collection: collection, - myTopicTeamsCollection: myTopicTeamsCollection, showSortControls: options.showSortControls }), searchFieldView = new SearchFieldView({ diff --git a/lms/djangoapps/teams/static/teams/js/views/topic_teams.js b/lms/djangoapps/teams/static/teams/js/views/topic_teams.js index 0bfefaf79c..f49d772918 100644 --- a/lms/djangoapps/teams/static/teams/js/views/topic_teams.js +++ b/lms/djangoapps/teams/static/teams/js/views/topic_teams.js @@ -1,6 +1,7 @@ (function(define) { 'use strict'; define([ + 'jquery', 'underscore', 'backbone', 'gettext', @@ -9,7 +10,34 @@ 'common/js/components/views/paging_header', 'text!teams/templates/team-actions.underscore', 'teams/js/views/team_utils' - ], function(_, Backbone, gettext, HtmlUtils, TeamsView, PagingHeader, teamActionsTemplate, TeamUtils) { + ], function($, _, Backbone, gettext, HtmlUtils, TeamsView, PagingHeader, teamActionsTemplate, TeamUtils) { + // Translators: this string is shown at the bottom of the teams page + // to find a team to join or else to create a new one. There are three + // links that need to be included in the message: + // 1. Browse teams in other topics + // 2. search teams + // 3. create a new team + // Be careful to start each link with the appropriate start indicator + // (e.g. {browse_span_start} for #1) and finish it with {span_end}. + var actionMessage = interpolate_text( // eslint-disable-line no-undef + _.escape(gettext( + '{browse_span_start}Browse teams in other ' + + 'topics{span_end} or {search_span_start}search teams{span_end} ' + + 'in this topic. If you still can\'t find a team to join, ' + + '{create_span_start}create a new team in this topic{span_end}.' + )), + { + browse_span_start: '', + search_span_start: '', + create_span_start: '', + span_end: '' + } + ); + + var canUserCreateTeamErrorMessage = gettext( + 'An error occurred while looking up team membership. Try refreshing the page.' + ); + var TopicTeamsView = TeamsView.extend({ events: { 'click a.browse-teams': 'browseTeams', @@ -24,51 +52,48 @@ TeamsView.prototype.initialize.call(this, options); }, - canUserCreateTeam: function() { - // Note: non-staff and non-privileged users are automatically added to any team - // that they create. This means that if multiple team membership is - // disabled that they cannot create a new team when they already - // belong to one. - return this.context.userInfo.staff - || this.context.userInfo.privileged - || (!TeamUtils.isInstructorManagedTopic(this.model.attributes.type) - && this.options.myTopicTeamsCollection.length === 0); + checkIfUserCanCreateTeam: function() { + var deferred = $.Deferred(); + if (this.context.userInfo.staff || this.context.userInfo.privileged) { + deferred.resolve(true); + } else if (TeamUtils.isInstructorManagedTopic(this.model.attributes.type)) { + deferred.resolve(false); + } else { + $.ajax({ + type: 'GET', + url: this.context.teamMembershipsUrl, + data: { + username: this.context.userInfo.username, + course_id: this.context.courseID, + teamset_id: this.model.get('id') + } + }).done(function(data) { + deferred.resolve(data.count === 0); + }).fail(function(data) { + TeamUtils.parseAndShowMessage(data, canUserCreateTeamErrorMessage); + deferred.resolve(false); + }); + } + return deferred.promise(); + }, + + + showActions: function() { + HtmlUtils.append( + this.$el, + HtmlUtils.template(teamActionsTemplate)({message: actionMessage}) + ); }, render: function() { - var self = this; - this.collection.refresh().done(function() { - var message; - TeamsView.prototype.render.call(self); - if (self.canUserCreateTeam()) { - message = interpolate_text( // eslint-disable-line no-undef - // Translators: this string is shown at the bottom of the teams page - // to find a team to join or else to create a new one. There are three - // links that need to be included in the message: - // 1. Browse teams in other topics - // 2. search teams - // 3. create a new team - // Be careful to start each link with the appropriate start indicator - // (e.g. {browse_span_start} for #1) and finish it with {span_end}. - _.escape(gettext( - '{browse_span_start}Browse teams in other ' + - 'topics{span_end} or {search_span_start}search teams{span_end} ' + - 'in this topic. If you still can\'t find a team to join, ' + - '{create_span_start}create a new team in this topic{span_end}.' - )), - { - browse_span_start: '', - search_span_start: '', - create_span_start: '', - span_end: '' - } - ); - HtmlUtils.append( - self.$el, - HtmlUtils.template(teamActionsTemplate)({message: message}) - ); - } - }); + this.collection.refresh().done(_.bind(function() { + TeamsView.prototype.render.call(this); + this.checkIfUserCanCreateTeam().done(_.bind(function(canUserCreateTeam) { + if (canUserCreateTeam) { + this.showActions(); + } + }, this)); + }, this)); return this; },