Skip to content
This repository was archived by the owner on Mar 4, 2025. It is now read-only.

Commit 54438df

Browse files
author
Parth Shah
committed
load more functionality for my-challenges & my-srms
1 parent f3dcd4e commit 54438df

File tree

14 files changed

+254
-244
lines changed

14 files changed

+254
-244
lines changed

app/directives/challenge-tile/challenge-tile.directive.jade

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,9 @@
5656
ng-show="challenge.status === 'COMPLETED' || challenge.status === 'PAST'",
5757
ng-switch="challenge.track")
5858
header
59-
// TODO: handle url for past marathon match
60-
a(ng-href="https://www.{{DOMAIN}}/challenge-details/{{challenge.id}}/?type={{challenge.track}}") {{challenge.name}}
59+
60+
a(ng-hide="challenge.subTrack === 'MARATHON_MATCH'", ng-href="https://www.{{DOMAIN}}/challenge-details/{{challenge.id}}/?type={{challenge.track}}") {{challenge.name}}
61+
a(ng-show="challenge.subTrack === 'MARATHON_MATCH'", ng-href="https://community.{{DOMAIN}}/tc?module=MatchDetails&rd={{challenge.rounds[0].id}}") {{challenge.name}}
6162

6263
p.date-completed {{challenge.submissionEndDate | date : 'MMMM yyyy'}}
6364

app/index.jade

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ html
171171
script(src="directives/skill-tile/skill-tile.directive.js")
172172
script(src="directives/slideable.directive.js")
173173
script(src="directives/srm-tile/srm-tile.directive.js")
174+
script(src="directives/tc-paginator/tc-loadMore-paginator.directive.js")
174175
script(src="directives/tc-paginator/tc-paginator.directive.js")
175176
script(src="directives/tc-section/tc-section.directive.js")
176177
script(src="directives/track-toggle/track-toggle.directive.js")

app/my-challenges/my-challenges.controller.js

Lines changed: 46 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -3,104 +3,92 @@
33

44
angular.module('tc.myChallenges').controller('MyChallengesController', MyChallengesController);
55

6-
MyChallengesController.$inject = ['ChallengeService', 'UserService', '$q', '$log', 'CONSTANTS', 'Helpers', '$scope', 'userIdentity', '$stateParams'];
6+
MyChallengesController.$inject = ['ChallengeService', 'UserService', '$q', '$log', '$state', 'CONSTANTS', 'Helpers', '$scope', 'userIdentity', '$stateParams'];
77

8-
function MyChallengesController(ChallengeService, UserService, $q, $log, CONSTANTS, Helpers, $scope, userIdentity, $stateParams) {
8+
function MyChallengesController(ChallengeService, UserService, $q, $log, $state, CONSTANTS, Helpers, $scope, userIdentity, $stateParams) {
9+
$log = $log.getInstance('MyChallengesController');
910
var vm = this;
1011
vm.domain = CONSTANTS.domain;
11-
vm.loading = true;
1212
vm.myChallenges = [];
13-
vm.userHasChallenges = true;
14-
vm.viewActiveChallenges = viewActiveChallenges;
15-
vm.viewPastChallenges = viewPastChallenges;
16-
vm.view = 'tile';
13+
vm.loading = CONSTANTS.STATE_LOADING;
14+
vm.view = UserService.getPreference($state.$current.name+'.challengeListView') || 'tile';
1715
vm.changeView = changeView;
16+
vm.changeFilter = changeFilter;
17+
vm.loadMore = loadMore;
18+
vm.getChallenges = getChallenges;
19+
vm.totalCount = 0;
1820
vm.statusFilter = _.get($stateParams, 'status','active');
21+
if (vm.statusFilter !== 'active' && vm.statusFilter !== 'completed') {
22+
$log.error('invalid filter, defaulting to active');
23+
vm.statusFilter = 'active';
24+
}
25+
vm.orderBy;
1926

20-
// paging params, these are updated by tc-pager
21-
vm.pageParams = {
22-
offset : 0,
23-
limit: 16,
24-
count: 0,
25-
totalCount: 0,
26-
// counter used to indicate page change
27-
updated: 0
27+
var currentOffset = 0;
28+
var defaultParams = {
29+
orderBy: 'submissionEndDate',
30+
limit: 10
2831
};
29-
vm.orderBy = 'submissionEndDate';
3032

3133
var userId = userIdentity.userId;
3234
var handle = userIdentity.handle;
3335

3436
activate();
3537

3638
function activate() {
37-
vm.isError = false;
3839
vm.isCopilot = _.includes(userIdentity.roles, 'copilot');
39-
40-
// watches page change counter to reload the data
41-
$scope.$watch('vm.pageParams.updated', function(updatedParams) {
42-
_getChallenges();
43-
});
44-
if (vm.statusFilter == 'completed') {
45-
viewPastChallenges();
46-
} else {
47-
viewActiveChallenges();
48-
}
40+
vm.myChallenges = [];
41+
changeFilter(vm.statusFilter);
4942
}
5043

5144
function changeView(view) {
5245
vm.view = view;
46+
// update UserPreference
47+
UserService.setPreference($state.$current.name+'.challengeListView', view);
5348
}
5449

55-
function viewActiveChallenges() {
56-
if (vm.statusFilter != 'active') {
57-
vm.myChallenges = [];
58-
vm.pageParams.offset = 0;
59-
vm.statusFilter = 'active';
60-
_getChallenges();
61-
}
62-
};
50+
function changeFilter(filter) {
51+
currentOffset = 0;
52+
vm.statusFilter = filter;
53+
vm.orderBy = vm.statusFilter === 'active' ? 'registrationEndDate' : 'submissionEndDate';
54+
vm.getChallenges(currentOffset);
55+
}
6356

64-
function viewPastChallenges() {
65-
if (vm.statusFilter != 'completed') {
57+
function getChallenges(offset) {
58+
vm.loading = CONSTANTS.STATE_LOADING;
59+
if (!offset) {
60+
// reset
61+
offset = 0;
6662
vm.myChallenges = [];
67-
vm.pageParams.offset = 0;
68-
vm.statusFilter = 'completed';
69-
_getChallenges();
7063
}
71-
};
7264

73-
function _getChallenges() {
7465
var params = {
75-
limit: vm.pageParams.limit,
76-
offset: vm.pageParams.offset,
77-
orderBy: vm.orderBy, // TODO verify if this is the correct sort order clause,
66+
limit: defaultParams.limit,
67+
offset: offset,
68+
orderBy: vm.orderBy + ' desc',
7869
filter: "status=" + vm.statusFilter
7970
};
80-
vm.loading = true;
8171

8272
return ChallengeService.getUserChallenges(handle, params)
83-
.then(function(challenges){
73+
.then(function(challenges) {
8474
if (vm.statusFilter == 'active') {
8575
ChallengeService.processActiveDevDesignChallenges(challenges);
8676
} else {
8777
ChallengeService.processPastChallenges(challenges);
8878
}
89-
if (challenges.length > 0) {
90-
vm.myChallenges = challenges;
91-
vm.userHasChallenges = true;
92-
vm.loading = false;
93-
} else {
94-
vm.userHasChallenges = false;
95-
vm.loading = false;
96-
}
79+
vm.myChallenges = vm.myChallenges.concat(challenges);
80+
vm.totalCount = challenges.metadata.totalCount;
81+
vm.loading = CONSTANTS.STATE_READY;
9782
})
9883
.catch(function(err) {
99-
vm.userHasChallenges = false;
100-
vm.isError = true;
101-
vm.loading = false;
84+
vm.loading = CONSTANTS.STATE_ERROR;
10285
$log.error(err);
10386
});
10487
}
88+
89+
function loadMore() {
90+
currentOffset+=1;
91+
vm.getChallenges(currentOffset);
92+
}
10593
}
10694
})();

app/my-challenges/my-challenges.jade

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,29 @@
77

88
.my-challenges // My Challenges
99

10-
.section-loading(ng-show="vm.loading")
11-
12-
section.noChallenges(ng-if="!vm.userHasChallenges && !vm.loading")
13-
p(ng-hide="vm.isError") You have not participated in any challenges yet.
14-
15-
p(ng-show="vm.isError") There was an error fetching challenges. Please try again later.
16-
1710
.content
18-
section.challenges(ng-show="vm.userHasChallenges && !vm.loading")
11+
section.challenges
1912
.top
2013
.filters
21-
a(ng-click="vm.viewActiveChallenges()", ng-class="{disabled: vm.statusFilter == 'active'}") Active
14+
a(ng-click="vm.statusFilter !== 'active' && vm.changeFilter('active')", ng-class="{disabled: vm.statusFilter == 'active'}") Active
2215
span   |  
23-
a(ng-click="vm.viewPastChallenges()", ng-class="{disabled: vm.statusFilter == 'completed'}") Past
16+
a(ng-click="vm.statusFilter !== 'completed' && vm.changeFilter('completed')", ng-class="{disabled: vm.statusFilter == 'completed'}") Past
2417

2518
.challenge-view-toggle
2619
button.tile(ng-click="vm.changeView('tile')", ng-class="{ disabled: vm.view === 'tile' }") Grid
2720

2821
button.list(ng-click="vm.changeView('list')", ng-class="{ disabled: vm.view === 'list' }") List
2922

30-
.data(ng-class="vm.view + '-view'")
31-
challenge-tile(ng-repeat="challenge in vm.myChallenges | orderBy:registrationEndDate:true", challenge="challenge", view="vm.view", ng-class="vm.view + '-view'")
23+
.noChallenges(ng-show="vm.myChallenges.length === 0 && vm.loading === 'ready'")
24+
p(ng-show="vm.statusFilter === 'completed'") You have not participated in any challenges yet.
25+
p(ng-if="vm.statusFilter === 'active'") There are no upcoming challenges.
26+
27+
.hasChallenges(ng-show="vm.myChallenges.length")
28+
29+
.data(ng-class="vm.view + '-view'")
30+
challenge-tile(
31+
ng-repeat="challenge in vm.myChallenges | orderBy:vm.orderBy:false",
32+
challenge="challenge", view="vm.view", ng-class="vm.view + '-view'")
3233

33-
.bottom
34-
tc-paginator(data="vm.myChallenges", page-params="vm.pageParams")
34+
tc-section(state="vm.loading")
35+
button.tc-btn(ng-show="vm.totalCount > vm.myChallenges.length", ng-click="vm.loadMore()") Load More

app/my-challenges/my-challenges.spec.js

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
describe('My Challenges Controller', function() {
33
var controller;
44
var domain;
5-
var authService, challengeService, userService, identity;
5+
var authService, challengeService, userService, identity, mockState;
66
var marathons = mockData.getMockMarathons();
77
var challenges = mockData.getMockiOSChallenges();
88

@@ -35,6 +35,8 @@ describe('My Challenges Controller', function() {
3535
};
3636
};
3737

38+
mockState = { '$current' : {'name': 'test'}};
39+
3840
// mock user api
3941
sinon.stub(userService, 'getUserIdentity', function() {
4042
return {
@@ -63,59 +65,62 @@ describe('My Challenges Controller', function() {
6365

6466
bard.verifyNoOutstandingHttpRequests();
6567

66-
xdescribe('inialization', function() {
67-
var myChallenges = null;
68+
describe('intialization', function() {
69+
var ctrl = null;
70+
var spy;
6871
beforeEach( function(){
6972
$scope = $rootScope.$new();
70-
myChallenges = $controller('MyChallengesController', {
73+
ctrl = $controller('MyChallengesController', {
7174
ChallengeService : challengeService,
7275
UserService : userService,
7376
$scope: $scope,
7477
userIdentity: identity,
75-
statusFilter: 'active'
78+
$state: mockState
7679
});
7780
$rootScope.$apply();
81+
spy = sinon.spy(ctrl, 'getChallenges');
7882
});
7983

8084
it('vm.domain should exist', function() {
81-
expect(myChallenges.domain).to.equal(domain);
85+
expect(ctrl.domain).to.equal(domain);
8286
});
8387

84-
it('vm.userHasChallenges should be initialized to default value', function() {
88+
it('default values should be initialized', function() {
8589
// default value for pageIndex
86-
expect(myChallenges.userHasChallenges).to.equal(true);
87-
});
88-
89-
it('myChallenges.myChallenges should be initialized', function() {
90-
// default value for pageIndex
91-
expect(myChallenges.myChallenges).to.exist;
92-
expect(myChallenges.myChallenges.length).to.equal(challenges.length);
90+
expect(ctrl.myChallenges).to.exist;
91+
// expect(ctrl.myChallenges.length).to.equal(challenges.length);
92+
expect(ctrl.totalCount).to.equal(2);
93+
expect(ctrl.statusFilter).to.equal('active');
94+
expect(ctrl.view).to.equal('tile');
95+
expect(ctrl.loading).to.equal('ready');
96+
expect(spy.withArgs(0).calledOnce);
9397
});
9498
});
9599

96-
xdescribe('active/past filters', function() {
97-
var myChallenges = null;
100+
describe('active/past filters', function() {
101+
var ctrl = null;
102+
var spy;
98103
beforeEach( function(){
99104
$scope = $rootScope.$new();
100-
myChallenges = $controller('MyChallengesController', {
105+
ctrl = $controller('MyChallengesController', {
101106
ChallengeService : challengeService,
102107
UserService : userService,
103108
$scope: $scope,
104109
userIdentity: identity,
105-
statusFilter: 'completed'
110+
$state: mockState,
111+
$stateParams: {'status': 'completed'}
106112
});
107113
$rootScope.$apply();
114+
spy = sinon.spy(ctrl, 'getChallenges');
108115
});
109116

110117
it('past challenges should be fetched', function() {
111-
expect(myChallenges.myChallenges).to.exist;
112-
expect(myChallenges.myChallenges.length).to.equal(challenges.length);
113-
// apply past filter
114-
myChallenges.viewPastChallenges();
115-
$rootScope.$apply();
116-
expect(myChallenges.myChallenges).to.exist;
118+
expect(ctrl.myChallenges).to.exist;
117119
// should have one less challenge for past filter as per mocked method
118-
expect(myChallenges.myChallenges.length).to.equal(challenges.length - 1);
120+
expect(ctrl.myChallenges.length).to.equal(challenges.length - 1);
121+
expect(spy.withArgs(0).calledOnce);
122+
expect(ctrl.statusFilter).to.equal('completed');
123+
expect(ctrl.loading).to.equal('ready');
119124
});
120125
});
121126

0 commit comments

Comments
 (0)