diff --git a/app/coffee/modules/backlog/main.coffee b/app/coffee/modules/backlog/main.coffee index 2d79f42e..7efb86df 100644 --- a/app/coffee/modules/backlog/main.coffee +++ b/app/coffee/modules/backlog/main.coffee @@ -61,6 +61,7 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F @scope.sectionName = @translate.instant("BACKLOG.SECTION_NAME") @showTags = false @activeFilters = false + @scope.showGraphPlaceholder = null @.initializeEventHandlers() @@ -146,12 +147,14 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F loadProjectStats: -> return @rs.projects.stats(@scope.projectId).then (stats) => @scope.stats = stats + totalPoints = if stats.total_points then stats.total_points else stats.defined_points - if stats.total_points - @scope.stats.completedPercentage = Math.round(100 * stats.closed_points / stats.total_points) + if totalPoints + @scope.stats.completedPercentage = Math.round(100 * stats.closed_points / totalPoints) else @scope.stats.completedPercentage = 0 + @scope.showGraphPlaceholder = !(stats.total_points? && stats.total_milestones?) return stats unloadClosedSprints: -> @@ -180,6 +183,8 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F sprints = result.milestones @scope.totalClosedMilestones = result.closed + @scope.totalOpenMilestones = result.open + @scope.totalMilestones = @scope.totalOpenMilestones + @scope.totalClosedMilestones # NOTE: Fix order of USs because the filter orderBy does not work propertly in partials files for sprint in sprints @@ -931,6 +936,8 @@ module.directive("tgBacklogUsPoints", ["$tgEstimationsService", "$tgRepo", "$tgT ToggleBurndownVisibility = ($storage) -> link = ($scope, $el, $attrs) -> hash = generateHash(["is-burndown-grpahs-collapsed"]) + $scope.isBurndownGraphCollapsed = $storage.get(hash) or false + toggleGraph = -> if $scope.isBurndownGraphCollapsed $(".js-toggle-burndown-visibility-button").removeClass("active") @@ -939,8 +946,10 @@ ToggleBurndownVisibility = ($storage) -> $(".js-toggle-burndown-visibility-button").addClass("active") $(".js-burndown-graph").addClass("open") - $scope.isBurndownGraphCollapsed = $storage.get(hash) or false - toggleGraph() + $scope.$watch "showGraphPlaceholder", () -> + if $scope.showGraphPlaceholder? + $scope.isBurndownGraphCollapsed = $scope.isBurndownGraphCollapsed || $scope.showGraphPlaceholder + toggleGraph() $el.on "click", ".js-toggle-burndown-visibility-button", -> $scope.isBurndownGraphCollapsed = !$scope.isBurndownGraphCollapsed @@ -951,7 +960,6 @@ ToggleBurndownVisibility = ($storage) -> $el.off() return { - scope: {} link: link } @@ -1110,7 +1118,7 @@ TgBacklogProgressBarDirective = ($template, $compile) -> $scope.$watch $attrs.tgBacklogProgressBar, (stats) -> if stats? - totalPoints = stats.total_points + totalPoints = if stats.total_points then stats.total_points else stats.defined_points definedPoints = stats.defined_points closedPoints = stats.closed_points if definedPoints > totalPoints diff --git a/app/coffee/modules/kanban/main.coffee b/app/coffee/modules/kanban/main.coffee index 988f693a..714e5ca9 100644 --- a/app/coffee/modules/kanban/main.coffee +++ b/app/coffee/modules/kanban/main.coffee @@ -145,7 +145,7 @@ class KanbanController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi if not usByStatus[status.id]? usByStatus[status.id] = [] if @scope.usByStatus? - for us in @scope.usByStatus[status.id] + for us in @scope.usByStatus[status.id] if us.status != status.id us_archived.push(us) @@ -157,6 +157,10 @@ class KanbanController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi usByStatus[status.id] = _.sortBy(usByStatus[status.id], "kanban_order") + if userstories.length == 0 + status = @scope.usStatusList[0] + usByStatus[status.id].push({isPlaceholder: true}) + @scope.usByStatus = usByStatus # The broadcast must be executed when the DOM has been fully reloaded. diff --git a/app/coffee/modules/projects/lightboxes.coffee b/app/coffee/modules/projects/lightboxes.coffee index d5a482ea..ea85af96 100644 --- a/app/coffee/modules/projects/lightboxes.coffee +++ b/app/coffee/modules/projects/lightboxes.coffee @@ -74,10 +74,7 @@ CreateProject = ($rootscope, $repo, $confirm, $location, $navurls, $rs, $project promise.then(onSuccessSubmit, onErrorSubmit) openLightbox = -> - $scope.data = { - total_story_points: 100 - total_milestones: 5 - } + $scope.data = {} if !$scope.templates.length $rs.projects.templates().then (result) => diff --git a/app/coffee/modules/taskboard/main.coffee b/app/coffee/modules/taskboard/main.coffee index a6ecad42..c3d3941c 100644 --- a/app/coffee/modules/taskboard/main.coffee +++ b/app/coffee/modules/taskboard/main.coffee @@ -184,6 +184,14 @@ class TaskboardController extends mixOf(taiga.Controller, taiga.PageMixin) if @scope.usTasks[task.user_story]? and @scope.usTasks[task.user_story][task.status]? @scope.usTasks[task.user_story][task.status].push(task) + if tasks.length == 0 + if @scope.userstories.length > 0 + usId = @scope.userstories[0].id + else + usId = null + + @scope.usTasks[usId][@scope.taskStatusList[0].id].push({isPlaceholder: true}) + return tasks loadTaskboard: -> diff --git a/app/locales/locale-en.json b/app/locales/locale-en.json index bfc3b851..42a49964 100644 --- a/app/locales/locale-en.json +++ b/app/locales/locale-en.json @@ -420,8 +420,8 @@ "PROJECT_DETAILS": "Project details", "PROJECT_NAME": "Project name", "PROJECT_SLUG": "Project slug", - "NUMBER_SPRINTS": "Number of sprints", - "NUMBER_US_POINTS": "Number of US points", + "NUMBER_SPRINTS": "Number of sprints (0 for an undetermined quantity)", + "NUMBER_US_POINTS": "Number of US points (0 for an undetermined quantity)", "TAGS": "Tags", "DESCRIPTION": "Description", "PUBLIC_PROJECT": "Public project", diff --git a/app/partials/admin/admin-project-profile.jade b/app/partials/admin/admin-project-profile.jade index 24f58587..aebc5d45 100644 --- a/app/partials/admin/admin-project-profile.jade +++ b/app/partials/admin/admin-project-profile.jade @@ -29,7 +29,7 @@ div.wrapper(tg-project-profile, ng-controller="ProjectProfileController as ctrl" label(for="total-story-points", translate="ADMIN.PROJECT_PROFILE.NUMBER_US_POINTS") input(type="number", name="total_story_points", min="0", placeholder="{{'ADMIN.PROJECT_PROFILE.NUMBER_US_POINTS' | translate}}", id="total-story-points", ng-model="project.total_story_points", - data-type="digits", data-required="true") + data-type="digits") fieldset label(for="tags", translate="ADMIN.PROJECT_PROFILE.TAGS") diff --git a/app/partials/backlog/backlog.jade b/app/partials/backlog/backlog.jade index c45275ef..701c35e0 100644 --- a/app/partials/backlog/backlog.jade +++ b/app/partials/backlog/backlog.jade @@ -11,6 +11,8 @@ div.wrapper(tg-backlog, ng-controller="BacklogController as ctrl", div.backlog-summary(tg-toggle-burndown-visibility) include ../includes/components/summary + div(ng-if="showGraphPlaceholder") TODO PLACEHOLDER + div.graphics-container.burndown-container.js-burndown-graph div.burndown(tg-burndown-backlog-graph) include ../includes/modules/burndown diff --git a/app/partials/includes/components/summary.jade b/app/partials/includes/components/summary.jade index 0b8ac558..e81b0b05 100644 --- a/app/partials/includes/components/summary.jade +++ b/app/partials/includes/components/summary.jade @@ -4,7 +4,7 @@ div.summary div.data span.number(ng-bind="stats.completedPercentage + '%'") - div.summary-stats + div.summary-stats(ng-if="stats.total_points") span.number(ng-bind="stats.total_points") -- span.description(translate="BACKLOG.SUMMARY.PROJECT_POINTS") div.summary-stats @@ -17,6 +17,9 @@ div.summary span.number(ng-bind="stats.speed | number:0") -- span.description(translate="BACKLOG.SUMMARY.POINTS_PER_SPRINT") - - div.stats.js-toggle-burndown-visibility-button(title="{{'BACKLOG.SPRINT_SUMMARY.TOGGLE_BAKLOG_GRAPH' | translate}}") + + div.stats.js-toggle-burndown-visibility-button( + title="{{'BACKLOG.SPRINT_SUMMARY.TOGGLE_BAKLOG_GRAPH' | translate}}", + ng-if="!showGraphPlaceholder" + ) include ../../../svg/graph.svg diff --git a/app/partials/includes/components/taskboard-task.jade b/app/partials/includes/components/taskboard-task.jade index dd34369e..bb0a13b8 100644 --- a/app/partials/includes/components/taskboard-task.jade +++ b/app/partials/includes/components/taskboard-task.jade @@ -1,5 +1,7 @@ -div.taskboard-tagline(tg-colorize-tags="task.tags", tg-colorize-tags-type="taskboard") -div.taskboard-task-inner +div(ng-show="task.isPlaceholder") TODO PLACEHOLDER + +div.taskboard-tagline(ng-show="!task.isPlaceholder", tg-colorize-tags="task.tags", tg-colorize-tags-type="taskboard") +div.taskboard-task-inner(ng-show="!task.isPlaceholder") div.taskboard-user-avatar(tg-taskboard-user-avatar, users="usersById", task="task", project="project", ng-class="{iocaine: task.is_iocaine}") span.icon.icon-iocaine(ng-if="task.is_iocaine", title="{{'COMMON.IOCAINE_TEXT' | translate}}") p.taskboard-text diff --git a/app/partials/includes/modules/sprints.jade b/app/partials/includes/modules/sprints.jade index 4e16e493..db2b25ad 100644 --- a/app/partials/includes/modules/sprints.jade +++ b/app/partials/includes/modules/sprints.jade @@ -3,7 +3,7 @@ section.sprints h1(translate="BACKLOG.SPRINTS.TITLE") div.summary div.total-sprints - span.number(ng-bind="project.total_milestones") -- + span.number(ng-bind="totalMilestones") -- span.description(translate="BACKLOG.SPRINTS.NUMBER_SPRINTS") a.button-green.add-sprint(href="", title="{{ 'BACKLOG.SPRINTS.TITLE_ACTION_NEW_SPRINT' | translate }}", ng-click="ctrl.addNewSprint()", tg-check-permission="add_milestone") @@ -15,7 +15,7 @@ section.sprints include sprint a.filter-closed-sprints(href="", tg-backlog-toggle-closed-sprints-visualization, - ng-show="totalClosedMilestones") + ng-if="totalClosedMilestones") span.icon.icon-archive span.text(translate="BACKLOG.SPRINTS.ACTION_SHOW_CLOSED_SPRINTS") diff --git a/app/partials/kanban/kanban-task.jade b/app/partials/kanban/kanban-task.jade index e108a4ab..177e9b28 100644 --- a/app/partials/kanban/kanban-task.jade +++ b/app/partials/kanban/kanban-task.jade @@ -1,5 +1,7 @@ -div.kanban-tagline(tg-colorize-tags="us.tags", tg-colorize-tags-type="kanban", ng-hide="us.isArchived") -div.kanban-task-inner(ng-class="{'task-archived': us.isArchived}") +div(ng-show="us.isPlaceholder") TODO PLACEHOLDER + +div.kanban-tagline(ng-show="!us.isPlaceholder", tg-colorize-tags="us.tags", tg-colorize-tags-type="kanban", ng-hide="us.isArchived") +div.kanban-task-inner(ng-show="!us.isPlaceholder", ng-class="{'task-archived': us.isArchived}") div.avatar-wrapper(tg-kanban-user-avatar="us.assigned_to", ng-model="us", ng-hide="us.isArchived") div.task-text(ng-hide="us.isArchived") a.task-assigned(href="", title="{{'US.ASSIGN' | translate}}")