From 4c55b5618b9d99fce75e8a4bfb937ccd045da969 Mon Sep 17 00:00:00 2001 From: juanfran Date: Thu, 13 Oct 2016 14:45:45 +0200 Subject: [PATCH] add an independent object in the sprint form and destroy datapicker everytime the date change --- app/coffee/modules/backlog/lightboxes.coffee | 60 +++++++++++-------- app/coffee/modules/backlog/main.coffee | 5 +- app/coffee/modules/backlog/sprints.coffee | 7 +-- app/coffee/modules/base/model.coffee | 10 ++++ app/coffee/modules/common/components.coffee | 21 ++++--- .../modules/lightbox-sprint-add-edit.jade | 8 +-- app/partials/includes/modules/sprint.jade | 2 +- app/partials/includes/modules/sprints.jade | 2 +- 8 files changed, 70 insertions(+), 45 deletions(-) diff --git a/app/coffee/modules/backlog/lightboxes.coffee b/app/coffee/modules/backlog/lightboxes.coffee index d26ca64d..324ce8b1 100644 --- a/app/coffee/modules/backlog/lightboxes.coffee +++ b/app/coffee/modules/backlog/lightboxes.coffee @@ -37,11 +37,12 @@ CreateEditSprint = ($repo, $confirm, $rs, $rootscope, lightboxService, $loading, hasErrors = false createSprint = true form = null + $scope.newSprint = {} resetSprint = () -> form.reset() if form - $scope.sprint = { + $scope.newSprint = { project: null name: null estimated_start: null @@ -62,19 +63,23 @@ CreateEditSprint = ($repo, $confirm, $rs, $rootscope, lightboxService, $loading, return hasErrors = false - newSprint = angular.copy($scope.sprint) broadcastEvent = null + estimated_start = $('.date-start').val() + estimated_end = $('.date-end').val() + if createSprint - newSprint.estimated_start = moment(newSprint.estimated_start, prettyDate).format("YYYY-MM-DD") - newSprint.estimated_finish = moment(newSprint.estimated_finish,prettyDate).format("YYYY-MM-DD") + newSprint = angular.copy($scope.newSprint) + newSprint.estimated_start = moment(estimated_start, prettyDate).format("YYYY-MM-DD") + newSprint.estimated_finish = moment(estimated_end, prettyDate).format("YYYY-MM-DD") + promise = $repo.create("milestones", newSprint) broadcastEvent = "sprintform:create:success" else - newSprint.setAttr("estimated_start", - moment(newSprint.estimated_start, prettyDate).format("YYYY-MM-DD")) - newSprint.setAttr("estimated_finish", - moment(newSprint.estimated_finish, prettyDate).format("YYYY-MM-DD")) + newSprint = $scope.newSprint.realClone() + newSprint.estimated_start = moment(estimated_start, prettyDate).format("YYYY-MM-DD") + newSprint.estimated_finish = moment(estimated_end, prettyDate).format("YYYY-MM-DD") + promise = $repo.save(newSprint) broadcastEvent = "sprintform:edit:success" @@ -85,6 +90,13 @@ CreateEditSprint = ($repo, $confirm, $rs, $rootscope, lightboxService, $loading, promise.then (data) -> currentLoading.finish() $scope.sprintsCounter += 1 if createSprint + + $scope.sprints = _.map $scope.sprints, (it) -> + if it.id == data.id + return data + else + return it + $rootscope.$broadcast(broadcastEvent, data) lightboxService.close($el) @@ -100,19 +112,19 @@ CreateEditSprint = ($repo, $confirm, $rs, $rootscope, lightboxService, $loading, remove = -> title = $translate.instant("LIGHTBOX.DELETE_SPRINT.TITLE") - message = $scope.sprint.name + message = $scope.newSprint.name $confirm.askOnDelete(title, message).then (askResponse) => onSuccess = -> askResponse.finish() $scope.milestonesCounter -= 1 lightboxService.close($el) - $rootscope.$broadcast("sprintform:remove:success", $scope.sprint) + $rootscope.$broadcast("sprintform:remove:success", $scope.newSprint) onError = -> askResponse.finish(false) $confirm.notify("error") - $repo.remove($scope.sprint).then(onSuccess, onError) + $repo.remove($scope.newSprint).then(onSuccess, onError) getLastSprint = -> openSprints = _.filter $scope.sprints, (sprint) -> @@ -131,9 +143,9 @@ CreateEditSprint = ($repo, $confirm, $rs, $rootscope, lightboxService, $loading, createSprint = true prettyDate = $translate.instant("COMMON.PICKERDATE.FORMAT") - $scope.sprint.project = projectId - $scope.sprint.name = null - $scope.sprint.slug = null + $scope.newSprint.project = projectId + $scope.newSprint.name = null + $scope.newSprint.slug = null lastSprint = getLastSprint() @@ -141,19 +153,19 @@ CreateEditSprint = ($repo, $confirm, $rs, $rootscope, lightboxService, $loading, if lastSprint estimatedStart = moment(lastSprint.estimated_finish) - else if $scope.sprint.estimated_start - estimatedStart = moment($scope.sprint.estimated_start) + else if $scope.newSprint.estimated_start + estimatedStart = moment($scope.newSprint.estimated_start) - $scope.sprint.estimated_start = estimatedStart.format(prettyDate) + $scope.newSprint.estimated_start = estimatedStart.format(prettyDate) estimatedFinish = moment().add(2, "weeks") if lastSprint estimatedFinish = moment(lastSprint.estimated_finish).add(2, "weeks") - else if $scope.sprint.estimated_finish - estimatedFinish = moment($scope.sprint.estimated_finish) + else if $scope.newSprint.estimated_finish + estimatedFinish = moment($scope.newSprint.estimated_finish) - $scope.sprint.estimated_finish = estimatedFinish.format(prettyDate) + $scope.newSprint.estimated_finish = estimatedFinish.format(prettyDate) lastSprintNameDom = $el.find(".last-sprint-name") if lastSprint?.name? @@ -179,10 +191,10 @@ CreateEditSprint = ($repo, $confirm, $rs, $rootscope, lightboxService, $loading, createSprint = false prettyDate = $translate.instant("COMMON.PICKERDATE.FORMAT") - $scope.$apply -> - $scope.sprint = sprint - $scope.sprint.estimated_start = moment($scope.sprint.estimated_start).format(prettyDate) - $scope.sprint.estimated_finish = moment($scope.sprint.estimated_finish).format(prettyDate) + $scope.$apply () -> + $scope.newSprint = sprint.realClone() + $scope.newSprint.estimated_start = moment($scope.newSprint.estimated_start).format(prettyDate) + $scope.newSprint.estimated_finish = moment($scope.newSprint.estimated_finish).format(prettyDate) $el.find(".delete-sprint").removeClass("hidden") diff --git a/app/coffee/modules/backlog/main.coffee b/app/coffee/modules/backlog/main.coffee index c742d74f..b1527031 100644 --- a/app/coffee/modules/backlog/main.coffee +++ b/app/coffee/modules/backlog/main.coffee @@ -239,7 +239,7 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F sprint.user_stories = _.sortBy(sprint.user_stories, "sprint_order") @scope.sprints = sprints - @scope.openSprints = _.filter(sprints, (sprint) => not sprint.closed).reverse() + @scope.closedSprints = [] if !@scope.closedSprints @scope.sprintsCounter = sprints.length @@ -250,6 +250,9 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F return sprints + openSprints: -> + return _.filter(@scope.sprints, (sprint) => not sprint.closed).reverse() + loadAllPaginatedUserstories: () -> page = @.page diff --git a/app/coffee/modules/backlog/sprints.coffee b/app/coffee/modules/backlog/sprints.coffee index fb7ee961..41cd56c0 100644 --- a/app/coffee/modules/backlog/sprints.coffee +++ b/app/coffee/modules/backlog/sprints.coffee @@ -98,6 +98,7 @@ BacklogSprintHeaderDirective = ($navUrls, $template, $compile, $translate) -> start = moment(sprint.estimated_start).format(prettyDate) finish = moment(sprint.estimated_finish).format(prettyDate) + estimatedDateRange = "#{start}-#{finish}" ctx = { @@ -117,19 +118,15 @@ BacklogSprintHeaderDirective = ($navUrls, $template, $compile, $translate) -> compiledTemplate = $compile(template)(templateScope) $el.html(compiledTemplate) - $scope.$watch $attrs.ngModel, (sprint) -> + $scope.$watch "sprint", (sprint) -> render(sprint) - $scope.$on "sprintform:edit:success", -> - render($model.$modelValue) - $scope.$on "$destroy", -> $el.off() return { link: link restrict: "EA" - require: "ngModel" } module.directive("tgBacklogSprintHeader", ["$tgNavUrls", "$tgTemplate", "$compile", "$translate" diff --git a/app/coffee/modules/base/model.coffee b/app/coffee/modules/base/model.coffee index e91a3a0b..36f157be 100644 --- a/app/coffee/modules/base/model.coffee +++ b/app/coffee/modules/base/model.coffee @@ -31,6 +31,16 @@ class Model @.setAttrs(data) @.initialize() + realClone: -> + attrs = _.cloneDeep(@._attrs) + + instance = new Model(@._name, attrs, @._dataTypes) + + instance._modifiedAttrs = _.cloneDeep(@._modifiedAttrs) + instance._isModified = _.cloneDeep(@._isModified) + + return instance + clone: -> instance = new Model(@._name, @._attrs, @._dataTypes) instance._modifiedAttrs = @._modifiedAttrs diff --git a/app/coffee/modules/common/components.coffee b/app/coffee/modules/common/components.coffee index 5da45d4a..4a020dbc 100644 --- a/app/coffee/modules/common/components.coffee +++ b/app/coffee/modules/common/components.coffee @@ -64,27 +64,30 @@ DateSelectorDirective = ($rootscope, datePickerConfigService) -> _.merge(datePickerConfig, { field: $el[0] - onSelect: (date) => - selectedDate = date - onOpen: => - $el.picker.setDate(selectedDate) if selectedDate? }) $el.picker = new Pikaday(datePickerConfig) - unbind = $rootscope.$on "$translateChangeEnd", (ctx) => initialize() + unbind = $rootscope.$on "$translateChangeEnd", (ctx) => + $el.picker.destroy() if $el.picker + initialize() - $scope.$watch $attrs.ngModel, (val) -> - initialize() if val? and not $el.picker - $el.picker.setDate(val) if val? + $attrs.$observe "pickerValue", (val) -> + $el.val(val) + + if val? + $el.picker.destroy() if $el.picker + initialize() + + $el.picker.setDate(val) $scope.$on "$destroy", -> $el.off() unbind() + $el.picker.destroy() return { link: link - require: "ngModel" } module.directive("tgDateSelector", ["$rootScope", "tgDatePickerConfigService", DateSelectorDirective]) diff --git a/app/partials/includes/modules/lightbox-sprint-add-edit.jade b/app/partials/includes/modules/lightbox-sprint-add-edit.jade index e0ceddc7..254e3276 100644 --- a/app/partials/includes/modules/lightbox-sprint-add-edit.jade +++ b/app/partials/includes/modules/lightbox-sprint-add-edit.jade @@ -6,7 +6,7 @@ form input.sprint-name( type="text" name="name" - ng-model="sprint.name" + ng-model="newSprint.name" ng-model-options="{ debounce: 200 }" data-required="true" data-maxlength="500" @@ -19,16 +19,16 @@ form input.date-start( type="text" name="estimated_start" - ng-model="sprint.estimated_start" + picker-value="{{newSprint.estimated_start}}" data-required="true" - tg-date-selector + tg-date-selector placeholder="{{'LIGHTBOX.ADD_EDIT_SPRINT.PLACEHOLDER_SPRINT_START' | translate}}" ) div input.date-end( type="text" name="estimated_finish" - ng-model="sprint.estimated_finish" + picker-value="{{newSprint.estimated_finish}}" data-required="true" tg-date-selector placeholder="{{'LIGHTBOX.ADD_EDIT_SPRINT.PLACEHOLDER_SPRINT_END' | translate}}" diff --git a/app/partials/includes/modules/sprint.jade b/app/partials/includes/modules/sprint.jade index f85bc3d6..429db948 100644 --- a/app/partials/includes/modules/sprint.jade +++ b/app/partials/includes/modules/sprint.jade @@ -1,4 +1,4 @@ -header(tg-backlog-sprint-header, ng-model="sprint") +header(tg-backlog-sprint-header) .summary-progress-wrapper div.sprint-progress-bar(tg-progress-bar="100 * sprint.closed_points / sprint.total_points") diff --git a/app/partials/includes/modules/sprints.jade b/app/partials/includes/modules/sprints.jade index 8c0b856b..f901627c 100644 --- a/app/partials/includes/modules/sprints.jade +++ b/app/partials/includes/modules/sprints.jade @@ -29,7 +29,7 @@ section.sprints tg-check-permission="add_milestone" ) - div.sprint.sprint-open(ng-repeat="sprint in openSprints track by sprint.id", + div.sprint.sprint-open(ng-repeat="sprint in ctrl.openSprints() track by sprint.id", tg-backlog-sprint="sprint", tg-sprint-sortable) include sprint