gaf-mobile
Version:
GAF mobile Web site
145 lines (120 loc) • 4.41 kB
JavaScript
module('gafMobileApp')
.controller('MyProjectsCtrl', function($scope, $route, $location,
$anchorScroll, Projects, Bids, Pager, CookieStore, MilestoneRequests,
LOOKING_FOR_COOKIE) {
var _this = this;
_this.loading = true;
// Show users lookingFor val by default
var lookingFor = CookieStore.get(LOOKING_FOR_COOKIE);
var defaultVal = lookingFor === 'Worker' ? 'freelancer' : 'employer';
var selectTab = $location.hash();
$scope.tab = {
name: selectTab ? selectTab : defaultVal
};
// Change tab and update the location.
_this.changeTab = function(tab) {
if ($scope.tab.name !== tab) {
$scope.tab.name = tab;
$location.hash(tab);
// We use replace() here to update the current history record
// instead of creating a new one.
$location.replace();
} else {
// To go the top of the current view
$anchorScroll();
}
};
var pageSize = 3;
_this.selectedBids = {};
_this.users = {};
_this.projects = {
employer: {
open: [],
work_in_progress: [],
complete: [],
},
freelancer: {
active: [],
in_progress: [],
complete: []
}
};
_this.hasMoreProjects = angular.copy(_this.projects);
// Pager for employer projects
var loadEmployerProjects = Pager(Projects.getUserProjectsByStatus
.bind(Projects), pageSize, 1, 0);
// Pager for freelancer projects
var loadFreelancerProjects = Pager(Bids.getBidderProjectsByStatus
.bind(Bids), pageSize, 1, 0);
_this.shouldShowCreateMilestoneButton = {};
var checkProjectMilestones = function(projects) {
angular.forEach(projects.getProjects(), function(project) {
MilestoneRequests.getMilestoneRequestsForProject(project.get().id)
.then(function(requests) {
if (requests.get().length === 0) {
_this.shouldShowCreateMilestoneButton[project.get().id] = true;
}
});
});
};
_this.shouldShowAwardBidButton = function(project) {
return project.bid_stats.bid_count > 0 &&
(project.status === 'active' || (project.status === 'frozen' &&
project.sub_status !== 'frozen_awarded'));
};
// Load projects according project status for either freelancer/employer
_this.loadProjects = function(status, user) {
var params = { user_details: true, user_avatar: true };
var loader;
if (user === 'freelancer') {
loader = loadFreelancerProjects;
}
else {
loader = loadEmployerProjects;
params.selected_bids = true;
}
// Reset offset for current array according to its length
loader.setOffset(
_this.projects[user][status].length / pageSize);
return loader.nextPage(status, params)
.then(function(projects) {
_this.loading = false;
// Check if status is open or work in progress and user is
// employer, then load milestones
if (status === 'work_in_progress') {
checkProjectMilestones(projects);
}
// Check for more projects
_this.hasMoreProjects[user][status] = loader.hasNext();
_this.projects[user][status] = _this.projects[user][status]
.concat(projects.getProjects());
// Load users
_this.users = angular.extend(_this.users, projects.getUsers().getMap());
// Load selected bids
_this.selectedBids = angular.extend(_this.selectedBids,
projects.getSelectedBidsList());
});
};
_this.getDeadline = function(project) {
var seconds;
if(_this.selectedBids[project.get().id]) {
seconds =
_this.selectedBids[project.get().id][0].time_submitted +
_this.selectedBids[project.get().id][0].period * 24 * 3600;
if(seconds < (Date.now() / 1000)) {
return { secondsLeft: seconds };
}
else {
return { secondsMore: seconds };
}
}
};
// Load stuff for both views
_this.loadProjects('open', 'employer');
_this.loadProjects('work_in_progress', 'employer');
_this.loadProjects('complete', 'employer');
_this.loadProjects('active', 'freelancer');
_this.loadProjects('in_progress', 'freelancer');
_this.loadProjects('complete', 'freelancer');
});
;
angular.