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])