From e0f3f5fdef2101d0ba11a066c4e0e0500d1456f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Fri, 27 Jun 2014 14:58:15 +0200 Subject: [PATCH] Move taskboard.coffe data to a model taskboard --- app/coffee/modules/taskboard.coffee | 214 -------------------- app/coffee/modules/taskboard/main.coffee | 238 +++++++++++++++++++++++ 2 files changed, 238 insertions(+), 214 deletions(-) create mode 100644 app/coffee/modules/taskboard/main.coffee diff --git a/app/coffee/modules/taskboard.coffee b/app/coffee/modules/taskboard.coffee index 16184b99..5ec30653 100644 --- a/app/coffee/modules/taskboard.coffee +++ b/app/coffee/modules/taskboard.coffee @@ -19,218 +19,4 @@ # File: modules/taskboard.coffee ### -taiga = @.taiga -mixOf = @.taiga.mixOf -groupBy = @.taiga.groupBy -bindOnce = @.taiga.bindOnce - module = angular.module("taigaTaskboard", []) - -############################################################################# -## Taskboard Controller -############################################################################# - -class TaskboardController extends mixOf(taiga.Controller, taiga.PageMixin) - @.$inject = [ - "$scope", - "$rootScope", - "$tgRepo", - "$tgConfirm", - "$tgResources", - "$routeParams", - "$q" - ] - - constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q) -> - @scope.sprintId = @params.id - @scope.sectionName = "Taskboard" - - promise = @.loadInitialData() - promise.then null, -> - console.log "FAIL" #TODO - - loadSprintStats: -> - return @rs.sprints.stats(@scope.projectId, @scope.sprintId).then (stats) => - totalPointsSum =_.reduce(_.values(stats.total_points), ((res, n) -> res + n), 0) - completedPointsSum = _.reduce(_.values(stats.completed_points), ((res, n) -> res + n), 0) - remainingPointsSum = totalPointsSum - completedPointsSum - remainingTasks = stats.total_tasks - stats.completed_tasks - @scope.stats = stats - @scope.stats.totalPointsSum = totalPointsSum - @scope.stats.completedPointsSum = completedPointsSum - @scope.stats.remainingPointsSum = remainingPointsSum - @scope.stats.remainingTasks = remainingTasks - return stats - - loadSprint: -> - return @rs.sprints.get(@scope.projectId, @scope.sprintId).then (sprint) => - @scope.sprint = sprint - @scope.userstories = sprint.user_stories - return sprint - - loadTasks: -> - return @rs.tasks.list(@scope.projectId, @scope.sprintId).then (tasks) => - @scope.tasks = tasks - @scope.tasksByStatus = _.groupBy(tasks, "status") - return tasks - - loadProject: -> - return @rs.projects.get(@scope.projectId).then (project) => - @scope.project = project - - @scope.pointsList = _.sortBy(project.points, "order") - @scope.pointsById = groupBy(@scope.pointsList, (e) -> e.id) - - @scope.roleList = _.sortBy(project.roles, "order") - @scope.roleById = groupBy(@scope.roleList, (e) -> e.id) - - @scope.taskStatusList = _.sortBy(project.task_statuses, "order") - - @scope.usStatusList = _.sortBy(project.us_statuses, "order") - @scope.usStatusById = groupBy(@scope.usStatusList, (e) -> e.id) - - return project - - loadTaskboard: -> - return @q.all([ - @.loadSprintStats(), - @.loadSprint() - # @.loadTasks(), - ]).then(=> @.loadTasks()) - - loadInitialData: -> - promise = @repo.resolve({pslug: @params.pslug}).then (data) => - @scope.projectId = data.project - return data - - return promise.then(=> @.loadProject()) - .then(=> @.loadUsersAndRoles()) - .then(=> @.loadTaskboard()) - -module.controller("TaskboardController", TaskboardController) - - -############################################################################# -## TaskboardDirective -############################################################################# - -TaskboardDirective = -> - - ######################### - ## Drag & Drop Link - ######################### - - linkSortable = ($scope, $el, $attrs, $ctrl) -> - console.log "TaskboardDirective.linkSortable" #TODO - - link = ($scope, $el, $attrs) -> - $ctrl = $el.controller() - linkSortable($scope, $el, $attrs, $ctrl) - - $scope.$on "$destroy", -> - $el.off() - - return {link: link} - - -############################################################################# -## Task Row Size Fixer Directive -############################################################################# - -TaskboardRowSizeFixer = -> - link = ($scope, $el, $attrs) -> - bindOnce $scope, "taskStatusList", (statuses) -> - itemSize = 300 + (10 * statuses.length) - size = (1 + statuses.length) * itemSize - $el.css("width", size + "px") - - return {link: link} - - -TaskboardUsPointsDirective = ($repo, $confirm) -> - pointsTemplate = _.template(""" - <% _.each(usRolePoints, function(rolePoint) { %> -
  • - <%- rolePoint.role.name %> <%- rolePoint.point.name %> - -
  • - <% }); %> - """) - renderUserStoryPoints = ($el, $scope, us) -> - points = $scope.pointsList - usRolePoints = [] - - for role_id, point_id of us.points - role = $scope.roleById[role_id] - point = $scope.pointsById[point_id] - if role and point - usRolePoints.push({role: role, point: point}) - - bindOnce $scope, "project", (project) -> - html = pointsTemplate({ - points: points - usRolePoints: usRolePoints - }) - $el.html(html) - - link = ($scope, $el, $attrs) -> - $ctrl = $el.controller() - us = $scope.$eval($attrs.tgTaskboardUsPoints) - renderUserStoryPoints($el, $scope, us) - - $el.on "click", ".us-role-points", (event) -> - event.stopPropagation() - - target = angular.element(event.currentTarget) - popover = target.parent().find(".pop-points") - popover.show() - - body = angular.element("body") - body.one "click", (event) -> - popover.hide() - - $el.on "click", ".point", (event) -> - event.preventDefault() - event.stopPropagation() - - target = angular.element(event.currentTarget) - roleId = target.data("role-id") - pointId = target.data("point-id") - newPoints = _.clone(us.points, false) - newPoints[roleId] = pointId - us.points = newPoints - - $el.find(".pop-points").hide() - - $scope.$apply -> - onSuccess = -> - $repo.refresh(us) -> - # TODO: Remove me when backlog will be fixed - $ctrl.loadSprintStats() - - onError = -> - $confirm.notify("error", "There is an error. Try it later.") - us.revert() - renderUserStoryPoints($el, $scope, us) - - renderUserStoryPoints($el, $scope, us) - $repo.save(us).then(onSuccess, onError) - - $scope.$on "$destroy", -> - $el.off() - - return {link: link} - - -module.directive("tgTaskboard", TaskboardDirective) -module.directive("tgTaskboardRowSizeFixer", TaskboardRowSizeFixer) -module.directive("tgTaskboardUsPoints", ["$tgRepo", "$tgConfirm", TaskboardUsPointsDirective]) diff --git a/app/coffee/modules/taskboard/main.coffee b/app/coffee/modules/taskboard/main.coffee new file mode 100644 index 00000000..9ef2cbbc --- /dev/null +++ b/app/coffee/modules/taskboard/main.coffee @@ -0,0 +1,238 @@ +### +# Copyright (C) 2014 Andrey Antukh +# Copyright (C) 2014 Jesús Espino Garcia +# Copyright (C) 2014 David Barragán Merino +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# File: modules/taskboard.coffee +### + +taiga = @.taiga + +mixOf = @.taiga.mixOf +groupBy = @.taiga.groupBy +bindOnce = @.taiga.bindOnce + +module = angular.module("taigaTaskboard") + + +############################################################################# +## Taskboard Controller +############################################################################# + +class TaskboardController extends mixOf(taiga.Controller, taiga.PageMixin) + @.$inject = [ + "$scope", + "$rootScope", + "$tgRepo", + "$tgConfirm", + "$tgResources", + "$routeParams", + "$q" + ] + + constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q) -> + @scope.sprintId = @params.id + @scope.sectionName = "Taskboard" + + promise = @.loadInitialData() + promise.then null, -> + console.log "FAIL" #TODO + + loadSprintStats: -> + return @rs.sprints.stats(@scope.projectId, @scope.sprintId).then (stats) => + totalPointsSum =_.reduce(_.values(stats.total_points), ((res, n) -> res + n), 0) + completedPointsSum = _.reduce(_.values(stats.completed_points), ((res, n) -> res + n), 0) + remainingPointsSum = totalPointsSum - completedPointsSum + remainingTasks = stats.total_tasks - stats.completed_tasks + @scope.stats = stats + @scope.stats.totalPointsSum = totalPointsSum + @scope.stats.completedPointsSum = completedPointsSum + @scope.stats.remainingPointsSum = remainingPointsSum + @scope.stats.remainingTasks = remainingTasks + return stats + + loadSprint: -> + return @rs.sprints.get(@scope.projectId, @scope.sprintId).then (sprint) => + @scope.sprint = sprint + @scope.userstories = sprint.user_stories + return sprint + + loadTasks: -> + return @rs.tasks.list(@scope.projectId, @scope.sprintId).then (tasks) => + @scope.tasks = tasks + @scope.tasksByStatus = _.groupBy(tasks, "status") + return tasks + + loadProject: -> + return @rs.projects.get(@scope.projectId).then (project) => + @scope.project = project + + @scope.pointsList = _.sortBy(project.points, "order") + @scope.pointsById = groupBy(@scope.pointsList, (e) -> e.id) + + @scope.roleList = _.sortBy(project.roles, "order") + @scope.roleById = groupBy(@scope.roleList, (e) -> e.id) + + @scope.taskStatusList = _.sortBy(project.task_statuses, "order") + + @scope.usStatusList = _.sortBy(project.us_statuses, "order") + @scope.usStatusById = groupBy(@scope.usStatusList, (e) -> e.id) + + return project + + loadTaskboard: -> + return @q.all([ + @.loadSprintStats(), + @.loadSprint() + # @.loadTasks(), + ]).then(=> @.loadTasks()) + + loadInitialData: -> + promise = @repo.resolve({pslug: @params.pslug}).then (data) => + @scope.projectId = data.project + return data + + return promise.then(=> @.loadProject()) + .then(=> @.loadUsersAndRoles()) + .then(=> @.loadTaskboard()) + +module.controller("TaskboardController", TaskboardController) + + +############################################################################# +## TaskboardDirective +############################################################################# + +TaskboardDirective = -> + + ######################### + ## Drag & Drop Link + ######################### + + linkSortable = ($scope, $el, $attrs, $ctrl) -> + console.log "TaskboardDirective.linkSortable" #TODO + + link = ($scope, $el, $attrs) -> + $ctrl = $el.controller() + linkSortable($scope, $el, $attrs, $ctrl) + + $scope.$on "$destroy", -> + $el.off() + + return {link: link} + + +############################################################################# +## Task Row Size Fixer Directive +############################################################################# + +TaskboardRowSizeFixer = -> + link = ($scope, $el, $attrs) -> + bindOnce $scope, "taskStatusList", (statuses) -> + itemSize = 300 + (10 * statuses.length) + size = (1 + statuses.length) * itemSize + $el.css("width", size + "px") + + return {link: link} + + +TaskboardUsPointsDirective = ($repo, $confirm) -> + pointsTemplate = _.template(""" + <% _.each(usRolePoints, function(rolePoint) { %> +
  • + <%- rolePoint.role.name %> <%- rolePoint.point.name %> + +
  • + <% }); %> + """) + renderUserStoryPoints = ($el, $scope, us) -> + points = $scope.pointsList + usRolePoints = [] + + for role_id, point_id of us.points + role = $scope.roleById[role_id] + point = $scope.pointsById[point_id] + if role and point + usRolePoints.push({role: role, point: point}) + + bindOnce $scope, "project", (project) -> + html = pointsTemplate({ + points: points + usRolePoints: usRolePoints + }) + $el.html(html) + + link = ($scope, $el, $attrs) -> + $ctrl = $el.controller() + us = $scope.$eval($attrs.tgTaskboardUsPoints) + renderUserStoryPoints($el, $scope, us) + + $el.on "click", ".us-role-points", (event) -> + event.stopPropagation() + + target = angular.element(event.currentTarget) + popover = target.parent().find(".pop-points") + popover.show() + + body = angular.element("body") + body.one "click", (event) -> + popover.hide() + + $el.on "click", ".point", (event) -> + event.preventDefault() + event.stopPropagation() + + target = angular.element(event.currentTarget) + roleId = target.data("role-id") + pointId = target.data("point-id") + newPoints = _.clone(us.points, false) + newPoints[roleId] = pointId + us.points = newPoints + + $el.find(".pop-points").hide() + + $scope.$apply -> + onSuccess = -> + $repo.refresh(us) -> + # TODO: Remove me when backlog will be fixed + $ctrl.loadSprintStats() + + onError = -> + $confirm.notify("error", "There is an error. Try it later.") + us.revert() + renderUserStoryPoints($el, $scope, us) + + renderUserStoryPoints($el, $scope, us) + $repo.save(us).then(onSuccess, onError) + + $scope.$on "$destroy", -> + $el.off() + + return {link: link} + + +module.directive("tgTaskboard", TaskboardDirective) +module.directive("tgTaskboardRowSizeFixer", TaskboardRowSizeFixer) +module.directive("tgTaskboardUsPoints", ["$tgRepo", "$tgConfirm", TaskboardUsPointsDirective])