Skip to content

Commit

Permalink
Bugs are children of mockups on frontend, bug counts on project show …
Browse files Browse the repository at this point in the history
…and index
  • Loading branch information
dhdemerson committed Jun 12, 2014
1 parent e3f9b6d commit 1eee447
Show file tree
Hide file tree
Showing 16 changed files with 358 additions and 278 deletions.
2 changes: 2 additions & 0 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -123,12 +123,14 @@ app.delete('/api/projects/:project_id', routes.deleteProject);
// API Mockups.
app.put('/api/projects/:project_id/mockups/:mockup_id', routes.putMockup);
app.get('/api/projects/:project_id/mockups/:mockup_id', routes.getMockup);
app.get('/api/projects/:project_id/mockups/:mockup_id/img', routes.getMockupImg);

// API Bugs
app.get('/api/projects/:project_id/bugs', routes.getBugs);
app.get('/api/projects/:project_id/mockups/:mockup_id/bugs', routes.getBugs);
app.post('/api/projects/:project_id/mockups/:mockup_id/bugs', routes.postBug);
app.get('/api/bugs/:bug_id', routes.getBug);
app.get('/api/bugs', routes.getBugs);
app.put('/api/projects/:project_id/mockups/:mockup_id/bugs/:bug_id', routes.putBug);
app.delete('/api/projects/:project_id/mockups/:mockup_id/bugs/:bug_id', routes.deleteBug);

Expand Down
37 changes: 24 additions & 13 deletions public/js/controllers/AppCtrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,18 @@ foxographApp.controller({
// Load in the projects.
Restangular.all('projects').getList().then(function (projectList) {
console.log("BW - Loaded projects.");
$rootScope.projects = projectList
$rootScope.projects = projectList;
Restangular.all('bugs').getList().then(function (bugList) {
var mockups = _.flatten(_.pluck(projectList, 'mockups'));
projectList = _.map(projectList, function(project) {
return _.map(project.mockups, function(mockup) {
mockup.bugs = _.where(bugList, {'mockup': mockup._id});
return mockup;
});
});

$rootScope.project = projectList;
});
});

Restangular.all('themes').getList().then(function (themeList) {
Expand All @@ -31,18 +42,18 @@ foxographApp.controller({

Restangular.all('products').getList().then(function (productList) {
$rootScope.products = productList;
});
});

// Keep our themes, products, and projects nice and ordered
$rootScope.$watch('themes', function() {
$rootScope.$watch('themes', function() {
if ($rootScope.themes) {
var themes = $rootScope.themes;

// reject themes without id's if there is a theme with the same name with an id
// useful after project creation and update
themes = _.reject(themes, function(theme) {
theme._id === undefined && _.some(themes, function(themeComp) {
theme.name === themeComp.name
return theme._id === undefined && _.some(themes, function(themeComp) {
return theme.name === themeComp.name;
});
});

Expand All @@ -56,15 +67,15 @@ foxographApp.controller({
}
});

$rootScope.$watch('products', function() {
$rootScope.$watch('products', function() {
if ($rootScope.products) {
var products = $rootScope.products;

// reject products without id's if there is a product with the same name with an id
// useful after project creation and update
products = _.reject(products, function(product) {
product._id === undefined && _.some(products, function(productComp) {
product.name === productComp.name
return product._id === undefined && _.some(products, function(productComp) {
return product.name === productComp.name;
});
});

Expand All @@ -74,13 +85,13 @@ foxographApp.controller({
// prevent infinite updating
if (!identical(products, $rootScope.products)) {
$rootScope.products = products;
}
}
}
});

$rootScope.$watch('projects', function() {
if (!$rootScope.projects) {
return
return;
}

updateHeader();
Expand All @@ -91,7 +102,7 @@ foxographApp.controller({

if (!identical(projects, $rootScope.projects)) {
$rootScope.projects = projects;
}
}
});

$rootScope.$on('$stateChangeSuccess', updateHeader);
Expand All @@ -110,7 +121,7 @@ foxographApp.controller({
(c1[i]._id === c2[i]._id && c1[i].name !== c2[i].name)) { return false; }
}

return true
return true;
}

function updateHeader() {
Expand Down
8 changes: 8 additions & 0 deletions public/js/controllers/DashboardCtrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,13 @@ foxographApp.controller({

$scope.filteredThemes = [];
$scope.filteredProducts = [];

$scope.countBugs = function(mockups) {
var bugs = _.flatten(_.pluck(mockups, 'bugs'));
if (bugs.length === 1 && bugs[0] === undefined) {
return -1;
}
return bugs.length;
};
}
});
25 changes: 15 additions & 10 deletions public/js/controllers/ProjectMockupCtrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ foxographApp.controller({

'ProjectMockupCtrl': function ProjectMockupCtrl($scope, $rootScope, $stateParams, $location, $filter, Restangular, Image) {



$rootScope.$watch('projects', loadMockup)

$rootScope.$watch('projects', loadMockup);

$scope.$watch('bugs', function() {
if ($scope.mockup && $scope.bugs) {
$scope.bugs = Restangular.restangularizeCollection($scope.mockup, $scope.bugs, 'bugs');
$scope.bugs = Restangular.restangularizeCollection($scope.mockup, $scope.bugs, 'bugs');
}
});

Expand All @@ -31,14 +31,19 @@ foxographApp.controller({
var project = _.findWhere($rootScope.projects, {slug: $stateParams.project_slug});
$scope.project = Restangular.restangularizeElement(null, project, 'projects');
if ($scope.project) {
var mockup = _.findWhere($scope.project.mockups, {slug: $stateParams.mockup_slug})
var mockupPromise = $scope.project.one('mockups', mockup._id).get();
mockupPromise.then(function(mockup) {
$scope.mockup = mockup;
$scope.mockup.all('bugs').getList().then(function(bugList) {
$scope.bugs = bugList
var mockup = _.findWhere($scope.project.mockups, {slug: $stateParams.mockup_slug});
if (!mockup.image) {
Restangular.restangularizeElement($scope.project, mockup, 'mockups');
mockup.one('img').get().then(function(image) {
if (_.isEmpty(image.data)) {
mockup.image = null;
} else {
mockup.image = image.data;
}
$scope.mockup = mockup;
});
});
}
$scope.mockup = mockup;
}
}
}
Expand Down
74 changes: 37 additions & 37 deletions public/js/controllers/ProjectShowCtrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ foxographApp.controller({
// project.
'ProjectShowCtrl': function ProjectShowCtrl($scope, $rootScope, $location, $state, $stateParams, Restangular, $filter) {
console.log('BW - Setting project_id to ', $stateParams.project_id);

$scope.form = {};

$rootScope.$watch('projects', function() {
Expand All @@ -36,17 +36,17 @@ foxographApp.controller({
}
if($scope.form.name !== $scope.project.name) return true;

var projectThemes = _.map($scope.project.themes, function(theme) {return theme._id});
var formThemes = _.map($scope.form.themes, function(theme) {return theme._id});
var projectThemes = _.map($scope.project.themes, function(theme) {return theme._id;});
var formThemes = _.map($scope.form.themes, function(theme) {return theme._id;});

var projectProducts = _.map($scope.project.products, function(product) {return product._id});
var formProducts = _.map($scope.form.products, function(product) {return product._id});
var projectProducts = _.map($scope.project.products, function(product) {return product._id;});
var formProducts = _.map($scope.form.products, function(product) {return product._id;});

if (_.xor(projectThemes, formThemes).length !== 0 ||
_.xor(projectProducts, formProducts).length !== 0) {
return true;
}
return false;
return false;
}

$scope.$watch('form', function() {
Expand All @@ -59,47 +59,68 @@ foxographApp.controller({
$scope.project.mockups.push({name: mockupName});
var projectPromise = $scope.project.put();
projectPromise.then(function(project) {
var projects = _.without($rootScope.projects, $scope.project)
var projects = _.without($rootScope.projects, $scope.project);
projects.push(project);
$rootScope.projects = projects;
});
}
}
};

$scope.updateProject = function() {
var projectPromise = $scope.form.put()
var projectPromise = $scope.form.put();
projectPromise.then(function(project) {
console.log(project);
var projects = _.without($rootScope.projects, $scope.project)
var projects = _.without($rootScope.projects, $scope.project);
projects.push(project);
$rootScope.projects = projects;

// add newly created products to rootscope
var newProducts = _.where(project.products, function(product) {
return ! _.some($rootScope.products, {_id: product._id})
return ! _.some($rootScope.products, {_id: product._id});
});

// delete any newly created products that were unsaved
$rootScope.products = _.filter($rootScope.products.concat(newProducts), "_id");


// add newly created themes to rootscope
var newThemes = _.where(project.themes, function(theme) {
return ! _.some($rootScope.themes, {_id: theme._id})
return ! _.some($rootScope.themes, {_id: theme._id});
});

// delete any newly created themes that were unsaved
$rootScope.themes = _.filter($rootScope.themes.concat(newThemes), "_id");

$state.go('app.project.show', {'project_slug': project.slug});
})
}
});
};

$scope.$on('$destroy', function() {
$rootScope.themes = _.filter($rootScope.themes, "_id");
$rootScope.products = _.filter($rootScope.products, "_id");
});

$scope.resolved = function(bugs) {
console.log(bugs);
return _.where(bugs, function(bug) {
return bug.status === 'RESOLVED' || bug.status === 'VERIFIED';
});
};

$scope.assigned = function(bugs) {
return _.where(bugs, function(bug) {
return (bug.status !== 'RESOLVED' && bug.status !== 'VERIFIED') &&
bug.assigned !== 'Nobody; OK to take it and work on it';
});
};

$scope.unassigned = function(bugs) {
return _.where(bugs, function(bug) {
return (bug.status !== 'RESOLVED' && bug.status !== 'VERIFIED') &&
bug.assigned === 'Nobody; OK to take it and work on it';
});
};


$scope.deleteProject = function (project) {
project.remove().then(function (data) {
Expand All @@ -125,26 +146,5 @@ foxographApp.controller({
}
});
};



// $rootScope.project_id = $stateParams.project_id;

// Handle a change in project id by setting the project.
/* $rootScope.$watch('project_id', function changeProject(project_id) {
if (!$rootScope.projects) {
// Hopefully we'll do this later.
// We should totally make this into an Ensure clause on the route!!!
return;
}
if (!$rootScope.project_id) {
$scope.project = null;
$scope.mockup = null;
return;
}
}); */

// If we have projects, and a project_id, make sure that we've set the project.

}
});
19 changes: 7 additions & 12 deletions public/js/directives/bugPanel.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,27 +19,24 @@ foxographApp.directive('bugPanel', function ($document, Restangular) {
transclude : true,
replace: true,
link: function postLink(scope, element, attrs) {

console.log(element);

var MAX_WIDTH = element[0].parentElement.offsetWidth;
var MAX_HEIGHT = element[0].parentElement.offsetHeight;
var BUG_WIDTH = 320;
var BUG_HEIGHT = 40;

var trashLink = angular.element(element.children()[6]);
var trashIcon = angular.element(trashLink.children()[0]);
Restangular.restangularizeElement(scope.mockup, scope.bug, "bugs");

scope.deleteBug = function(bugs, $index) {
// passing in bugs and destructive modification to avoid
// passing in bugs and destructive modification to avoid
// climbing mount parent.parent.parent.parent...
scope.bug.remove();
bugs.splice($index, 1);
}
};

element[0].onmousedown = function(e) {

if (!(scope.auth.email === scope.project.user)) {
if (scope.auth.email !== scope.project.user) {
e.stopPropagation();
return false;
}
Expand All @@ -60,7 +57,7 @@ foxographApp.directive('bugPanel', function ($document, Restangular) {
});
e.stopPropagation();
return false;
}
};

$document[0].onmouseup = function(e) {
$document[0].onmousemove = null;
Expand All @@ -70,17 +67,15 @@ foxographApp.directive('bugPanel', function ($document, Restangular) {
scope.dragging = false;
});

console.log(scope.bug);

scope.bug.put();

e.stopPropagation();
return false;
}
};

e.stopPropagation();
return false;
}
};
}
};
});
Loading

0 comments on commit 1eee447

Please sign in to comment.