Merge branch 'drag-and-drop-refactor'
commit
3fb2cdf709
|
@ -61,6 +61,7 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
|
||||||
@scope.$on("sprintform:remove:success", @.loadProjectStats)
|
@scope.$on("sprintform:remove:success", @.loadProjectStats)
|
||||||
@scope.$on("usform:new:success", @.loadUserstories)
|
@scope.$on("usform:new:success", @.loadUserstories)
|
||||||
@scope.$on("usform:edit:success", @.loadUserstories)
|
@scope.$on("usform:edit:success", @.loadUserstories)
|
||||||
|
@scope.$on("sprint:us:move", @.moveUs)
|
||||||
|
|
||||||
loadProjectStats: ->
|
loadProjectStats: ->
|
||||||
return @rs.projects.stats(@scope.projectId).then (stats) =>
|
return @rs.projects.stats(@scope.projectId).then (stats) =>
|
||||||
|
@ -73,6 +74,7 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
|
||||||
return @rs.sprints.list(@scope.projectId).then (sprints) =>
|
return @rs.sprints.list(@scope.projectId).then (sprints) =>
|
||||||
@scope.sprints = sprints
|
@scope.sprints = sprints
|
||||||
@scope.sprintsCounter = sprints.length
|
@scope.sprintsCounter = sprints.length
|
||||||
|
@scope.sprintsById = groupBy(sprints, (x) -> x.id)
|
||||||
return sprints
|
return sprints
|
||||||
|
|
||||||
loadUserstories: ->
|
loadUserstories: ->
|
||||||
|
@ -140,6 +142,125 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
|
||||||
res = _.find(selectedStatuses, (x) -> x == taiga.toString(us.status))
|
res = _.find(selectedStatuses, (x) -> x == taiga.toString(us.status))
|
||||||
return not res
|
return not res
|
||||||
|
|
||||||
|
prepareBulkUpdateData: (uses) ->
|
||||||
|
return _.map(uses, (x) -> [x.id, x.order])
|
||||||
|
|
||||||
|
resortUserStories: (uses) ->
|
||||||
|
items = []
|
||||||
|
for item, index in uses
|
||||||
|
item.order = index
|
||||||
|
if item.isModified()
|
||||||
|
items.push(item)
|
||||||
|
|
||||||
|
return items
|
||||||
|
|
||||||
|
moveUs: (ctx, us, newUsIndex, newSprintId) ->
|
||||||
|
oldSprintId = us.milestone
|
||||||
|
|
||||||
|
# In the same sprint or in the backlog
|
||||||
|
if newSprintId == oldSprintId
|
||||||
|
items = null
|
||||||
|
userstories = null
|
||||||
|
|
||||||
|
if newSprintId == null
|
||||||
|
userstories = @scope.userstories
|
||||||
|
else
|
||||||
|
userstories = @scope.sprintsById[newSprintId].user_stories
|
||||||
|
|
||||||
|
@scope.$apply ->
|
||||||
|
r = userstories.indexOf(us)
|
||||||
|
userstories.splice(r, 1)
|
||||||
|
userstories.splice(newUsIndex, 0, us)
|
||||||
|
|
||||||
|
# Rehash userstories order field
|
||||||
|
items = @.resortUserStories(userstories)
|
||||||
|
data = @.prepareBulkUpdateData(items)
|
||||||
|
|
||||||
|
# Persist in bulk all affected
|
||||||
|
# userstories with order change
|
||||||
|
promise = @rs.userstories.bulkUpdateOrder(us.project, data)
|
||||||
|
promise.then null, ->
|
||||||
|
console.log "FAIL"
|
||||||
|
|
||||||
|
return promise
|
||||||
|
|
||||||
|
# From sprint to backlog
|
||||||
|
if newSprintId == null
|
||||||
|
us.milestone = null
|
||||||
|
|
||||||
|
@scope.$apply =>
|
||||||
|
# Add new us to backlog userstories list
|
||||||
|
@scope.userstories.splice(newUsIndex, 0, us)
|
||||||
|
@scope.visibleUserstories.splice(newUsIndex, 0, us)
|
||||||
|
|
||||||
|
# Execute the prefiltering of user stories
|
||||||
|
@.filterVisibleUserstories()
|
||||||
|
|
||||||
|
# Remove the us from the sprint list.
|
||||||
|
sprint = @scope.sprintsById[oldSprintId]
|
||||||
|
r = sprint.user_stories.indexOf(us)
|
||||||
|
sprint.user_stories.splice(r, 1)
|
||||||
|
|
||||||
|
# Persist the milestone change of userstory
|
||||||
|
promise = @repo.save(us)
|
||||||
|
|
||||||
|
# Rehash userstories order field
|
||||||
|
# and persist in bulk all changes.
|
||||||
|
promise = promise.then =>
|
||||||
|
items = @.resortUserStories(@scope.userstories)
|
||||||
|
data = @.prepareBulkUpdateData(items)
|
||||||
|
return @rs.userstories.bulkUpdateOrder(us.project, data)
|
||||||
|
|
||||||
|
promise.then null, ->
|
||||||
|
# TODO
|
||||||
|
console.log "FAIL"
|
||||||
|
|
||||||
|
return promise
|
||||||
|
|
||||||
|
# From backlog to sprint
|
||||||
|
newSprint = @scope.sprintsById[newSprintId]
|
||||||
|
if us.milestone == null
|
||||||
|
us.milestone = newSprintId
|
||||||
|
|
||||||
|
@scope.$apply =>
|
||||||
|
# Add moving us to sprint user stories list
|
||||||
|
newSprint.user_stories.splice(newUsIndex, 0, us)
|
||||||
|
|
||||||
|
# Remove moving us from backlog userstories lists.
|
||||||
|
r = @scope.visibleUserstories.indexOf(us)
|
||||||
|
@scope.visibleUserstories.splice(r, 1)
|
||||||
|
r = @scope.userstories.indexOf(us)
|
||||||
|
@scope.userstories.splice(r, 1)
|
||||||
|
|
||||||
|
# From sprint to sprint
|
||||||
|
else
|
||||||
|
us.milestone = newSprintId
|
||||||
|
|
||||||
|
@scope.$apply =>
|
||||||
|
# Add new us to backlog userstories list
|
||||||
|
newSprint.user_stories.splice(newUsIndex, 0, us)
|
||||||
|
|
||||||
|
# Remove the us from the sprint list.
|
||||||
|
oldSprint = @scope.sprintsById[oldSprintId]
|
||||||
|
r = oldSprint.user_stories.indexOf(us)
|
||||||
|
oldSprint.user_stories.splice(r, 1)
|
||||||
|
|
||||||
|
# Persist the milestone change of userstory
|
||||||
|
promise = @repo.save(us)
|
||||||
|
|
||||||
|
# Rehash userstories order field
|
||||||
|
# and persist in bulk all changes.
|
||||||
|
promise = promise.then =>
|
||||||
|
items = @.resortUserStories(newSprint.user_stories)
|
||||||
|
data = @.prepareBulkUpdateData(items)
|
||||||
|
return @rs.userstories.bulkUpdateOrder(us.project, data)
|
||||||
|
|
||||||
|
promise.then null, ->
|
||||||
|
# TODO
|
||||||
|
console.log "FAIL"
|
||||||
|
|
||||||
|
return promise
|
||||||
|
|
||||||
getUrlFilters: ->
|
getUrlFilters: ->
|
||||||
return _.pick(@location.search(), "statuses", "tags")
|
return _.pick(@location.search(), "statuses", "tags")
|
||||||
|
|
||||||
|
@ -169,7 +290,6 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F
|
||||||
@scope.filters.statuses = _.map _.countBy(plainStatuses), (v, k) =>
|
@scope.filters.statuses = _.map _.countBy(plainStatuses), (v, k) =>
|
||||||
obj = {id:k, type:"statuses", name: @scope.usStatusById[k].name, count:v}
|
obj = {id:k, type:"statuses", name: @scope.usStatusById[k].name, count:v}
|
||||||
obj.selected = true if isSelected("statuses", obj.id)
|
obj.selected = true if isSelected("statuses", obj.id)
|
||||||
console.log "statuses", obj
|
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
return @scope.filters
|
return @scope.filters
|
||||||
|
|
|
@ -42,17 +42,17 @@ BacklogSortableDirective = ($repo, $rs, $rootscope) ->
|
||||||
# http://stackoverflow.com/questions/5791886/jquery-draggable-shows-
|
# http://stackoverflow.com/questions/5791886/jquery-draggable-shows-
|
||||||
# helper-in-wrong-place-when-scrolled-down-page
|
# helper-in-wrong-place-when-scrolled-down-page
|
||||||
|
|
||||||
resort = (uses) ->
|
# resort = (uses) ->
|
||||||
items = []
|
# items = []
|
||||||
for item, index in uses
|
# for item, index in uses
|
||||||
item.order = index
|
# item.order = index
|
||||||
if item.isModified()
|
# if item.isModified()
|
||||||
items.push(item)
|
# items.push(item)
|
||||||
|
#
|
||||||
|
# return items
|
||||||
|
|
||||||
return items
|
# prepareBulkUpdateData = (uses) ->
|
||||||
|
# return _.map(uses, (x) -> [x.id, x.order])
|
||||||
prepareBulkUpdateData = (uses) ->
|
|
||||||
return _.map(uses, (x) -> [x.id, x.order])
|
|
||||||
|
|
||||||
linkSortable = ($scope, $el, $attrs, $ctrl) ->
|
linkSortable = ($scope, $el, $attrs, $ctrl) ->
|
||||||
# State
|
# State
|
||||||
|
@ -61,6 +61,13 @@ BacklogSortableDirective = ($repo, $rs, $rootscope) ->
|
||||||
itemEl = null
|
itemEl = null
|
||||||
tdom = $el
|
tdom = $el
|
||||||
|
|
||||||
|
deleteElement = (itemEl) ->
|
||||||
|
# Completelly remove item and its scope from dom
|
||||||
|
itemEl.scope().$destroy()
|
||||||
|
itemEl.off()
|
||||||
|
itemEl.remove()
|
||||||
|
|
||||||
|
|
||||||
tdom.sortable({
|
tdom.sortable({
|
||||||
# handle: ".icon-drag-v",
|
# handle: ".icon-drag-v",
|
||||||
items: "div.sprint-table > div.row, .backlog-table-body > div.row"
|
items: "div.sprint-table > div.row, .backlog-table-body > div.row"
|
||||||
|
@ -68,6 +75,7 @@ BacklogSortableDirective = ($repo, $rs, $rootscope) ->
|
||||||
|
|
||||||
tdom.on "sortstop", (event, ui) ->
|
tdom.on "sortstop", (event, ui) ->
|
||||||
# Common state for stop event handler
|
# Common state for stop event handler
|
||||||
|
|
||||||
parentEl = ui.item.parent()
|
parentEl = ui.item.parent()
|
||||||
itemEl = ui.item
|
itemEl = ui.item
|
||||||
itemUs = itemEl.scope().us
|
itemUs = itemEl.scope().us
|
||||||
|
@ -75,131 +83,19 @@ BacklogSortableDirective = ($repo, $rs, $rootscope) ->
|
||||||
newParentScope = parentEl.scope()
|
newParentScope = parentEl.scope()
|
||||||
|
|
||||||
if itemEl.is(".milestone-us-item-row") and parentEl.is(".backlog-table-body")
|
if itemEl.is(".milestone-us-item-row") and parentEl.is(".backlog-table-body")
|
||||||
itemUs.milestone = null
|
deleteElement(itemEl)
|
||||||
|
$scope.$broadcast("sprint:us:move", itemUs, itemIndex, null)
|
||||||
# Completelly remove item and its scope from dom
|
|
||||||
itemEl.scope().$destroy()
|
|
||||||
itemEl.off()
|
|
||||||
itemEl.remove()
|
|
||||||
|
|
||||||
$scope.$apply ->
|
|
||||||
# Add new us to backlog userstories list
|
|
||||||
newParentScope.userstories.splice(itemIndex, 0, itemUs)
|
|
||||||
newParentScope.visibleUserstories.splice(itemIndex, 0, itemUs)
|
|
||||||
|
|
||||||
# Execute the prefiltering of user stories
|
|
||||||
$ctrl.filterVisibleUserstories()
|
|
||||||
|
|
||||||
# Remove the us from the sprint list.
|
|
||||||
r = oldParentScope.sprint.user_stories.indexOf(itemUs)
|
|
||||||
oldParentScope.sprint.user_stories.splice(r, 1)
|
|
||||||
|
|
||||||
# Persist the milestone change of userstory
|
|
||||||
promise = $repo.save(itemUs)
|
|
||||||
|
|
||||||
# Rehash userstories order field
|
|
||||||
# and persist in bulk all changes.
|
|
||||||
promise = promise.then ->
|
|
||||||
projectId = $scope.projectId
|
|
||||||
|
|
||||||
items = resort(newParentScope.userstories)
|
|
||||||
data = prepareBulkUpdateData(items)
|
|
||||||
|
|
||||||
return $rs.userstories.bulkUpdateOrder(projectId, data)
|
|
||||||
|
|
||||||
promise.then null, ->
|
|
||||||
# TODO
|
|
||||||
console.log "FAIL"
|
|
||||||
|
|
||||||
else if itemEl.is(".us-item-row") and parentEl.is(".sprint-table")
|
else if itemEl.is(".us-item-row") and parentEl.is(".sprint-table")
|
||||||
|
deleteElement(itemEl)
|
||||||
# Completelly remove item and its scope from dom
|
$scope.$broadcast("sprint:us:move", itemUs, itemIndex, newParentScope.sprint.id)
|
||||||
itemEl.scope().$destroy()
|
|
||||||
itemEl.off()
|
|
||||||
itemEl.remove()
|
|
||||||
|
|
||||||
itemUs.milestone = newParentScope.sprint.id
|
|
||||||
|
|
||||||
$scope.$apply ->
|
|
||||||
# Add moving us to sprint user stories list
|
|
||||||
newParentScope.sprint.user_stories.splice(itemIndex, 0, itemUs)
|
|
||||||
|
|
||||||
# Remove moving us from backlog userstories lists.
|
|
||||||
r = oldParentScope.visibleUserstories.indexOf(itemUs)
|
|
||||||
oldParentScope.visibleUserstories.splice(r, 1)
|
|
||||||
r = oldParentScope.userstories.indexOf(itemUs)
|
|
||||||
oldParentScope.userstories.splice(r, 1)
|
|
||||||
|
|
||||||
# Persist the milestone change of userstory
|
|
||||||
promise = $repo.save(itemUs)
|
|
||||||
|
|
||||||
# Rehash userstories order field
|
|
||||||
# and persist in bulk all changes.
|
|
||||||
promise = promise.then ->
|
|
||||||
projectId = $scope.projectId
|
|
||||||
items = resort(newParentScope.sprint.user_stories)
|
|
||||||
data = prepareBulkUpdateData(items)
|
|
||||||
return $rs.userstories.bulkUpdateOrder(projectId, data)
|
|
||||||
|
|
||||||
# TODO: handle properly the error
|
|
||||||
promise.then null, ->
|
|
||||||
console.log "FAIL"
|
|
||||||
|
|
||||||
else if parentEl.is(".sprint-table") and newParentScope.sprint.id != oldParentScope.sprint.id
|
else if parentEl.is(".sprint-table") and newParentScope.sprint.id != oldParentScope.sprint.id
|
||||||
itemUs.milestone = newParentScope.sprint.id
|
deleteElement(itemEl)
|
||||||
|
$scope.$broadcast("sprint:us:move", itemUs, itemIndex, newParentScope.sprint.id)
|
||||||
# Completelly remove item and its scope from dom
|
|
||||||
itemEl.scope().$destroy()
|
|
||||||
itemEl.off()
|
|
||||||
itemEl.remove()
|
|
||||||
|
|
||||||
$scope.$apply ->
|
|
||||||
# Add new us to backlog userstories list
|
|
||||||
newParentScope.sprint.user_stories.splice(itemIndex, 0, itemUs)
|
|
||||||
|
|
||||||
# Remove the us from the sprint list.
|
|
||||||
r = oldParentScope.sprint.user_stories.indexOf(itemUs)
|
|
||||||
oldParentScope.sprint.user_stories.splice(r, 1)
|
|
||||||
|
|
||||||
# Persist the milestone change of userstory
|
|
||||||
promise = $repo.save(itemUs)
|
|
||||||
|
|
||||||
# Rehash userstories order field
|
|
||||||
# and persist in bulk all changes.
|
|
||||||
promise = promise.then ->
|
|
||||||
projectId = $scope.projectId
|
|
||||||
|
|
||||||
items = resort(newParentScope.sprint.user_stories)
|
|
||||||
data = prepareBulkUpdateData(items)
|
|
||||||
return $rs.userstories.bulkUpdateOrder(projectId, data)
|
|
||||||
|
|
||||||
promise.then null, ->
|
|
||||||
# TODO
|
|
||||||
console.log "FAIL"
|
|
||||||
|
|
||||||
else
|
else
|
||||||
items = null
|
$scope.$broadcast("sprint:us:move", itemUs, itemIndex, itemUs.milestone)
|
||||||
userstories = null
|
|
||||||
|
|
||||||
if parentEl.is(".backlog-table-body")
|
|
||||||
userstories = newParentScope.userstories
|
|
||||||
else
|
|
||||||
userstories = newParentScope.sprint.user_stories
|
|
||||||
|
|
||||||
$scope.$apply ->
|
|
||||||
r = userstories.indexOf(itemUs)
|
|
||||||
userstories.splice(r, 1)
|
|
||||||
userstories.splice(itemIndex, 0, itemUs)
|
|
||||||
|
|
||||||
# Rehash userstories order field
|
|
||||||
items = resort(userstories)
|
|
||||||
data = prepareBulkUpdateData(items)
|
|
||||||
|
|
||||||
# Persist in bulk all affected
|
|
||||||
# userstories with order change
|
|
||||||
promise = $rs.userstories.bulkUpdateOrder($scope.projectId, data)
|
|
||||||
promise.then null, ->
|
|
||||||
console.log "FAIL"
|
|
||||||
|
|
||||||
tdom.on "sortstart", (event, ui) ->
|
tdom.on "sortstart", (event, ui) ->
|
||||||
oldParentScope = ui.item.parent().scope()
|
oldParentScope = ui.item.parent().scope()
|
||||||
|
|
Loading…
Reference in New Issue