From b8cbd1e3d546a359ff7a1e77a3f862c2cf0c7233 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Wed, 16 Sep 2015 14:51:34 +0200 Subject: [PATCH 01/26] Improving placeholders --- app/coffee/modules/backlog/main.coffee | 20 +++++++++++++------ app/coffee/modules/kanban/main.coffee | 6 +++++- app/coffee/modules/projects/lightboxes.coffee | 5 +---- app/coffee/modules/taskboard/main.coffee | 8 ++++++++ app/locales/locale-en.json | 4 ++-- app/partials/admin/admin-project-profile.jade | 2 +- app/partials/backlog/backlog.jade | 2 ++ app/partials/includes/components/summary.jade | 9 ++++++--- .../includes/components/taskboard-task.jade | 6 ++++-- app/partials/includes/modules/sprints.jade | 4 ++-- app/partials/kanban/kanban-task.jade | 6 ++++-- 11 files changed, 49 insertions(+), 23 deletions(-) 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}}") From b6165e859aa1f1d49ed8ca61540e309ed98777d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Mon, 5 Oct 2015 09:41:51 +0200 Subject: [PATCH 02/26] User logged home placeholders --- app/locales/locale-en.json | 1 + .../external-app.controller.coffee | 4 +- app/modules/home/duties/duty.scss | 15 ------- .../home/projects/home-project-list.scss | 1 + app/modules/home/working-on/empty.jade | 6 +++ app/modules/home/working-on/empty.scss | 42 +++++++++++++++++++ app/modules/home/working-on/working-on.jade | 17 +++++--- 7 files changed, 63 insertions(+), 23 deletions(-) create mode 100644 app/modules/home/working-on/empty.jade create mode 100644 app/modules/home/working-on/empty.scss diff --git a/app/locales/locale-en.json b/app/locales/locale-en.json index 42a49964..240b1791 100644 --- a/app/locales/locale-en.json +++ b/app/locales/locale-en.json @@ -328,6 +328,7 @@ "HOME": { "PAGE_TITLE": "Home - Taiga", "PAGE_DESCRIPTION": "The Taiga home page with your main projects and all your assigned and watched user stories, tasks and issues", + "EMPTY_WORKING_ON": "It feels empty, doesn't it? Start working with Taiga and you'll see here the stories, tasks and issues you are workin on.", "EMPTY_WATCHING": "Follow the projects, User Stories, Tasks, Issues... that you want to know about :)", "EMPTY_PROJECT_LIST": "You don't have any projects yet", "WORKING_ON_SECTION": "Working on", diff --git a/app/modules/external-apps/external-app.controller.coffee b/app/modules/external-apps/external-app.controller.coffee index 6c963753..21561f9a 100644 --- a/app/modules/external-apps/external-app.controller.coffee +++ b/app/modules/external-apps/external-app.controller.coffee @@ -12,8 +12,8 @@ class ExternalAppController extends taiga.Controller "tgLoader" ] - constructor: (@routeParams, @externalAppsService, @window, @currentUserService, @location, - @navUrls, @xhrError, @loader) -> + constructor: (@routeParams, @externalAppsService, @window, @currentUserService, @location, @navUrls, + @xhrError, @loader) -> @loader.start(false) @._applicationId = @routeParams.application @._state = @routeParams.state diff --git a/app/modules/home/duties/duty.scss b/app/modules/home/duties/duty.scss index c4a2804b..8cb9d689 100644 --- a/app/modules/home/duties/duty.scss +++ b/app/modules/home/duties/duty.scss @@ -58,18 +58,3 @@ margin: 2rem 30%; } } -.watching-empty { - padding: 5vh; - text-align: center; - svg { - margin: 2rem auto; - max-width: 160px; - text-align: center; - path { - fill: $whitish; - } - } - p { - @extend %small; - } -} diff --git a/app/modules/home/projects/home-project-list.scss b/app/modules/home/projects/home-project-list.scss index abdaed0d..b443e4d4 100644 --- a/app/modules/home/projects/home-project-list.scss +++ b/app/modules/home/projects/home-project-list.scss @@ -63,6 +63,7 @@ } p { @extend %small; + @extend %light; } .create-project-button { display: block; diff --git a/app/modules/home/working-on/empty.jade b/app/modules/home/working-on/empty.jade new file mode 100644 index 00000000..c9193b9a --- /dev/null +++ b/app/modules/home/working-on/empty.jade @@ -0,0 +1,6 @@ +- for (var x = 0; x < 2; x++) + .empty-ticket + .avatar + .data + .line + .line diff --git a/app/modules/home/working-on/empty.scss b/app/modules/home/working-on/empty.scss new file mode 100644 index 00000000..26fe4c83 --- /dev/null +++ b/app/modules/home/working-on/empty.scss @@ -0,0 +1,42 @@ +.working-on-empty, +.watching-empty { + margin-bottom: 4rem; + p { + @extend %light; + margin: 1rem 0 0; + } +} + +.empty-ticket { + display: flex; + &:not(:last-child) { + border-bottom: 1px solid $whitish; + padding: 1rem 0; + } + &:last-child { + padding: 1rem 0 0; + } + .avatar { + background: darken($whitish, 5%); + flex-basis: 48px; + height: 48px; + margin-right: 1rem; + width: 48px; + } + + .data { + display: flex; + flex-direction: column; + } + + .line { + background: $whitish; + height: 1rem; + margin-bottom: 1rem; + width: 40vw; + &:last-child { + margin: 0; + width: 20vw; + } + } +} diff --git a/app/modules/home/working-on/working-on.jade b/app/modules/home/working-on/working-on.jade index 34e287ef..4777e130 100644 --- a/app/modules/home/working-on/working-on.jade +++ b/app/modules/home/working-on/working-on.jade @@ -1,12 +1,17 @@ -div.title-bar.working-on-title(ng-show="vm.assignedTo.size", translate="HOME.WORKING_ON_SECTION") +div.title-bar.working-on-title(translate="HOME.WORKING_ON_SECTION") + section.working-on(ng-show="vm.assignedTo.size") div.duty-single(tg-duty="duty", tg-repeat="duty in vm.assignedTo", ng-class="{blocked: duty.is_blocked}") +section.working-on-empty(ng-show="!vm.assignedTo.size") + p(translate="HOME.EMPTY_WORKING_ON") + include empty.jade + div.title-bar.watching-title(translate="HOME.WATCHING_SECTION") -section.watching-empty(ng-show="!vm.watching.size") - include ../../../svg/hide.svg - p(translate="HOME.EMPTY_WATCHING") - section.watching(ng-show="vm.watching.size") - div.duty-single(tg-duty="duty", tg-repeat="duty in vm.watching", ng-class="{blocked: duty.is_blocked}") \ No newline at end of file + div.duty-single(tg-duty="duty", tg-repeat="duty in vm.watching", ng-class="{blocked: duty.is_blocked}") + +section.watching-empty(ng-show="!vm.watching.size") + p(translate="HOME.EMPTY_WATCHING") + include empty.jade From 161d3e3bd7ba07ce5bc73a101e79e0668b71fe6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Mon, 5 Oct 2015 09:43:29 +0200 Subject: [PATCH 03/26] Keep import prject option if user has projects --- app/modules/home/projects/home-project-list.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/modules/home/projects/home-project-list.jade b/app/modules/home/projects/home-project-list.jade index c273ab2a..b104ac32 100644 --- a/app/modules/home/projects/home-project-list.jade +++ b/app/modules/home/projects/home-project-list.jade @@ -14,7 +14,7 @@ a.see-more-projects-btn.button-gray(href="#", title="{{'PROJECT.NAVIGATION.SEE_MORE_PROJECTS' | translate}}", translate="PROJECT.NAVIGATION.SEE_MORE_PROJECTS") -section.projects-empty(ng-hide="vm.projects.size") +section.projects-empty include ../../../svg/empty-project.svg p(translate="HOME.EMPTY_PROJECT_LIST") a.create-project-button.button-green(href="#", ng-click="vm.newProject()", From ab319029ddb4f2c060359d0c8c3b2b8b8da7d777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Mon, 5 Oct 2015 11:57:40 +0200 Subject: [PATCH 04/26] Empty backlog placeholder --- app/images/backlog-empty.png | Bin 0 -> 23914 bytes app/images/sprint-empty.png | Bin 0 -> 17029 bytes app/partials/backlog/backlog.jade | 48 ++++++++++-------- app/styles/core/elements.scss | 23 --------- app/styles/layout/backlog.scss | 23 +++++---- app/styles/modules/backlog/backlog-table.scss | 17 +++++++ .../modules/search/search-result-table.scss | 1 - 7 files changed, 58 insertions(+), 54 deletions(-) create mode 100644 app/images/backlog-empty.png create mode 100644 app/images/sprint-empty.png diff --git a/app/images/backlog-empty.png b/app/images/backlog-empty.png new file mode 100644 index 0000000000000000000000000000000000000000..a7179c86ccfe1b8b428b71c8b09857fbdd29086a GIT binary patch literal 23914 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

IQHPqUhh)j9k`HipYGr9kr;k|BU5+fXN@1W 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 P1O!lsmP&<^dGP-Ma|ALh literal 0 HcmV?d00001 diff --git a/app/images/sprint-empty.png b/app/images/sprint-empty.png new file mode 100644 index 0000000000000000000000000000000000000000..e51329a451475114cfe498606c0b1e9e1fe5c606 GIT binary patch literal 17029 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 QxBvhE07*qoM6N<$f;Po}y8r+H literal 0 HcmV?d00001 diff --git a/app/partials/backlog/backlog.jade b/app/partials/backlog/backlog.jade index 701c35e0..11ebca9b 100644 --- a/app/partials/backlog/backlog.jade +++ b/app/partials/backlog/backlog.jade @@ -19,33 +19,41 @@ div.wrapper(tg-backlog, ng-controller="BacklogController as ctrl", div.backlog-menu div.backlog-table-options - a.trans-button.move-to-current-sprint(href="", - title="{{'BACKLOG.MOVE_US_TO_CURRENT_SPRINT' | translate}}", - id="move-to-current-sprint") + a.trans-button.move-to-current-sprint( + href="" + title="{{'BACKLOG.MOVE_US_TO_CURRENT_SPRINT' | translate}}" + id="move-to-current-sprint" + ) span.icon.icon-move span.text(translate="BACKLOG.MOVE_US_TO_CURRENT_SPRINT") - a.trans-button(href="", - title="{{'BACKLOG.FILTERS.TOGGLE' | translate}}", - id="show-filters-button") - span.icon.icon-filter - span.text(translate="BACKLOG.FILTERS.SHOW") - a.trans-button(href="", - title="{{'BACKLOG.TAGS.TOGGLE' | translate}}", - id="show-tags") - span.icon.icon-tag - span.text(translate="BACKLOG.TAGS.SHOW") + a.trans-button( + href="" + title="{{'BACKLOG.FILTERS.TOGGLE' | translate}}" + id="show-filters-button" + translate="BACKLOG.FILTERS.SHOW" + ) + a.trans-button( + href="" + title="{{'BACKLOG.TAGS.TOGGLE' | translate}}" + id="show-tags" + translate="BACKLOG.TAGS.SHOW" + ) include ../includes/components/addnewus section.backlog-table(ng-class="{'hidden': !userstories.length}") include ../includes/modules/backlog-table - div.empty.empty-backlog(ng-class="{'hidden': userstories.length}", tg-backlog-empty-sortable) - span.icon.icon-backlog - span.title(translate="BACKLOG.EMPTY") - a(href="", title="{{'BACKLOG.CREATE_NEW_US' | translate}}", - ng-click="ctrl.addNewUs('standard')", - tg-check-permission="add_us", - translate="BACKLOG.CREATE_NEW_US_EMPTY_HELP") + div.empty-backlog(ng-class="{'hidden': userstories.length}", tg-backlog-empty-sortable) + img( + src="/images/backlog-empty.png" + alt="{{'BACKLOG.EMPTY' | translate}}" + ) + p.title(translate="BACKLOG.EMPTY") + a(href="", title="{{'BACKLOG.CREATE_NEW_US' | translate}}" + ng-click="ctrl.addNewUs('standard')" + tg-check-permission="add_us" + translate="BACKLOG.CREATE_NEW_US_EMPTY_HELP" + ) sidebar.menu-secondary.sidebar include ../includes/modules/sprints diff --git a/app/styles/core/elements.scss b/app/styles/core/elements.scss index 9c42a1b8..2d50b9f1 100644 --- a/app/styles/core/elements.scss +++ b/app/styles/core/elements.scss @@ -79,26 +79,3 @@ sup { } } } - - -//Empty -.empty { - border: 1px dashed $gray-light; - color: $gray-light; - min-height: 10rem; - padding: 5% 0; - text-align: center; - .icon { - @extend %xxlarge; - margin-bottom: 2rem; - } - span { - display: block; - &.title { - @extend %xlarge; - @extend %title; - margin-bottom: 1rem; - text-transform: uppercase; - } - } -} diff --git a/app/styles/layout/backlog.scss b/app/styles/layout/backlog.scss index 65941a74..b9fc2f38 100644 --- a/app/styles/layout/backlog.scss +++ b/app/styles/layout/backlog.scss @@ -4,16 +4,19 @@ display: flex; justify-content: space-between; margin-bottom: 1rem; - padding: .5rem; - .trans-button { - display: inline-block; - margin-right: 1rem; - padding: .3rem 0; - &.move-to-current-sprint { - display: none; - } - span { - vertical-align: middle; + .backlog-table-options { + .trans-button { + @extend %trans-button; + color: $blackish; + display: inline-block; + padding: .4rem 1.5rem; + &:hover { + background: $gray-light; + color: $whitish; + } + &.move-to-current-sprint { + display: none; + } } } .button-bulk { diff --git a/app/styles/modules/backlog/backlog-table.scss b/app/styles/modules/backlog/backlog-table.scss index 365ed4c7..c128124e 100644 --- a/app/styles/modules/backlog/backlog-table.scss +++ b/app/styles/modules/backlog/backlog-table.scss @@ -248,3 +248,20 @@ padding-right: 45px; } } + +.empty-backlog { + @extend %light; + padding: 2rem; + text-align: center; + img { + margin-bottom: 1rem; + } + .title { + @extend %large; + margin-bottom: .5rem; + text-transform: uppercase; + } + a { + color: $primary; + } +} diff --git a/app/styles/modules/search/search-result-table.scss b/app/styles/modules/search/search-result-table.scss index db6ec827..04f34949 100644 --- a/app/styles/modules/search/search-result-table.scss +++ b/app/styles/modules/search/search-result-table.scss @@ -4,7 +4,6 @@ border: 0; } } - .row { align-content: center; align-items: center; From feea0cb823b1ada1a524c880fe476a41fcf9ff6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Mon, 5 Oct 2015 12:37:00 +0200 Subject: [PATCH 05/26] Add new sprint placeholder --- app/coffee/modules/backlog/main.coffee | 1 + app/locales/locale-en.json | 4 +++- app/partials/includes/modules/sprints.jade | 28 ++++++++++++++++------ app/styles/modules/backlog/sprints.scss | 17 +++++++++++++ 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/app/coffee/modules/backlog/main.coffee b/app/coffee/modules/backlog/main.coffee index 7efb86df..3d432046 100644 --- a/app/coffee/modules/backlog/main.coffee +++ b/app/coffee/modules/backlog/main.coffee @@ -182,6 +182,7 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F return @rs.sprints.list(@scope.projectId, params).then (result) => sprints = result.milestones + @scope.totalMilestones = sprints @scope.totalClosedMilestones = result.closed @scope.totalOpenMilestones = result.open @scope.totalMilestones = @scope.totalOpenMilestones + @scope.totalClosedMilestones diff --git a/app/locales/locale-en.json b/app/locales/locale-en.json index 240b1791..8fe5ee04 100644 --- a/app/locales/locale-en.json +++ b/app/locales/locale-en.json @@ -946,8 +946,10 @@ "LINK_TASKBOARD": "Sprint Taskboard", "TITLE_LINK_TASKBOARD": "Go to Taskboard of \"{{name}}\"", "NUMBER_SPRINTS": "
sprints", - "TITLE_ACTION_NEW_SPRINT": "+ New sprint", + "EMPTY": "YOU HAVE NO SPRINTS CREATED", "ACTION_NEW_SPRINT": "+ New sprint", + "TITLE_ACTION_NEW_SPRINT": "Add new sprint", + "TEXT_ACTION_NEW_SPRINT": "You may want to create a new sprint in your project", "ACTION_SHOW_CLOSED_SPRINTS": "Show closed sprints", "ACTION_HIDE_CLOSED_SPRINTS": "Hide closed sprints" } diff --git a/app/partials/includes/modules/sprints.jade b/app/partials/includes/modules/sprints.jade index db2b25ad..60769e53 100644 --- a/app/partials/includes/modules/sprints.jade +++ b/app/partials/includes/modules/sprints.jade @@ -1,13 +1,27 @@ section.sprints header h1(translate="BACKLOG.SPRINTS.TITLE") - div.summary - div.total-sprints - 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") - span.text(translate="BACKLOG.SPRINTS.ACTION_NEW_SPRINT") + //- + div.summary + div.total-sprints + span.number(ng-bind="totalMilestones") -- + a.button-green.add-sprint(href="", title="{{ 'BACKLOG.SPRINTS.TITLE_ACTION_NEW_SPRINT' | translate }}", + span.description(translate="BACKLOG.SPRINTS.NUMBER_SPRINTS") + ng-click="ctrl.addNewSprint()", tg-check-permission="add_milestone") + span.text(translate="BACKLOG.SPRINTS.ACTION_NEW_SPRINT") + + div.sprints-empty(ng-if="!totalMilestones") + img( + src="/images/sprint-empty.png" + alt="{{'BACKLOG.SPRINTS.EMPTY' | translate}}" + ) + p.title(translate="BACKLOG.SPRINTS.EMPTY") + a( + href="" + ng-click="ctrl.addNewSprint()" + title="{{'BACKLOG.SPRINTS.TITLE_ACTION_NEW_SPRINT' | translate}}" + translate="BACKLOG.SPRINTS.TEXT_ACTION_NEW_SPRINT" + ) div.sprint.sprint-open(ng-repeat="sprint in openSprints track by sprint.id", tg-backlog-sprint="sprint", diff --git a/app/styles/modules/backlog/sprints.scss b/app/styles/modules/backlog/sprints.scss index cfb90545..69253101 100644 --- a/app/styles/modules/backlog/sprints.scss +++ b/app/styles/modules/backlog/sprints.scss @@ -231,3 +231,20 @@ background: $gray-light; } } + +.sprints-empty { + @extend %light; + text-align: center; + img { + margin: 1rem 0; + width: 60%; + } + .title { + @extend %large; + margin-bottom: .5rem; + text-transform: uppercase; + } + a { + color: $primary; + } +} From c1fa656d90729434aa613898485ce369700cc4a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Mon, 5 Oct 2015 14:27:32 +0200 Subject: [PATCH 06/26] Sprints sidebar emty fixes --- app/locales/locale-en.json | 3 +-- app/partials/includes/modules/sprints.jade | 25 +++++++++++-------- app/styles/modules/backlog/sprints.scss | 28 +++++++++++++++------- app/svg/add.svg | 3 +++ 4 files changed, 38 insertions(+), 21 deletions(-) create mode 100644 app/svg/add.svg diff --git a/app/locales/locale-en.json b/app/locales/locale-en.json index 8fe5ee04..b6239fb9 100644 --- a/app/locales/locale-en.json +++ b/app/locales/locale-en.json @@ -946,8 +946,7 @@ "LINK_TASKBOARD": "Sprint Taskboard", "TITLE_LINK_TASKBOARD": "Go to Taskboard of \"{{name}}\"", "NUMBER_SPRINTS": "
sprints", - "EMPTY": "YOU HAVE NO SPRINTS CREATED", - "ACTION_NEW_SPRINT": "+ New sprint", + "EMPTY": "YOU HAVE NO SPRINTS", "TITLE_ACTION_NEW_SPRINT": "Add new sprint", "TEXT_ACTION_NEW_SPRINT": "You may want to create a new sprint in your project", "ACTION_SHOW_CLOSED_SPRINTS": "Show closed sprints", diff --git a/app/partials/includes/modules/sprints.jade b/app/partials/includes/modules/sprints.jade index 60769e53..3324f818 100644 --- a/app/partials/includes/modules/sprints.jade +++ b/app/partials/includes/modules/sprints.jade @@ -1,14 +1,19 @@ section.sprints - header - h1(translate="BACKLOG.SPRINTS.TITLE") - //- - div.summary - div.total-sprints - span.number(ng-bind="totalMilestones") -- - a.button-green.add-sprint(href="", title="{{ 'BACKLOG.SPRINTS.TITLE_ACTION_NEW_SPRINT' | translate }}", - span.description(translate="BACKLOG.SPRINTS.NUMBER_SPRINTS") - ng-click="ctrl.addNewSprint()", tg-check-permission="add_milestone") - span.text(translate="BACKLOG.SPRINTS.ACTION_NEW_SPRINT") + header.sprint-header + h1 + span.number( + ng-bind="totalMilestones" + ng-if="totalMilestones" + ) + span(translate="BACKLOG.SPRINTS.TITLE") + a.add-sprint( + href="" + title="{{ 'BACKLOG.SPRINTS.TITLE_ACTION_NEW_SPRINT' | translate}}" + ng-click="ctrl.addNewSprint()" + ng-if="totalMilestones" + tg-check-permission="add_milestone" + ) + include ../../../svg/add.svg div.sprints-empty(ng-if="!totalMilestones") img( diff --git a/app/styles/modules/backlog/sprints.scss b/app/styles/modules/backlog/sprints.scss index 69253101..e7c6979f 100644 --- a/app/styles/modules/backlog/sprints.scss +++ b/app/styles/modules/backlog/sprints.scss @@ -1,17 +1,27 @@ .sprints { - .summary { - background: darken($whitish, 10%); + .sprint-header { + align-content: center; + align-items: center; display: flex; justify-content: space-between; } - .total-sprints { - align-items: flex-start; - color: $grayer; - display: flex; + h1 { + margin: 0; } .add-sprint { - margin: 0; - padding: .3rem 1.5rem; + background: $primary; + padding: .25rem .25rem 0; + transition: background .2s; + &:hover { + background: $primary-light; + } + svg { + height: 1.4rem; + width: 1.5rem; + } + path { + fill: $whitish; + } } .filter-closed-sprints { @extend %small; @@ -237,7 +247,7 @@ text-align: center; img { margin: 1rem 0; - width: 60%; + width: 50%; } .title { @extend %large; diff --git a/app/svg/add.svg b/app/svg/add.svg new file mode 100644 index 00000000..77a2901a --- /dev/null +++ b/app/svg/add.svg @@ -0,0 +1,3 @@ + + + From 11dc3b24219a257bba5bd1b533995dda1be05159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Mon, 5 Oct 2015 14:42:07 +0200 Subject: [PATCH 07/26] Fixes on backlog options --- app/styles/components/buttons.scss | 7 +++++-- app/styles/layout/backlog.scss | 26 +++++++++++++++----------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/app/styles/components/buttons.scss b/app/styles/components/buttons.scss index af107dde..51f877c7 100755 --- a/app/styles/components/buttons.scss +++ b/app/styles/components/buttons.scss @@ -10,11 +10,11 @@ padding: .4rem 2.5rem; text-align: center; text-transform: uppercase; - transition: all .3s linear; + transition: all .2s linear; vertical-align: middle; &:hover { color: $white; - transition: all .3s linear; + transition: all .2s linear; } &:visited { color: $white; @@ -49,6 +49,9 @@ color: $primary; } } + &:visited { + color: $blackish; + } } diff --git a/app/styles/layout/backlog.scss b/app/styles/layout/backlog.scss index b9fc2f38..b5edef9e 100644 --- a/app/styles/layout/backlog.scss +++ b/app/styles/layout/backlog.scss @@ -4,20 +4,24 @@ display: flex; justify-content: space-between; margin-bottom: 1rem; - .backlog-table-options { - .trans-button { - @extend %trans-button; - color: $blackish; - display: inline-block; - padding: .4rem 1.5rem; + .trans-button { + @extend %trans-button; + color: $blackish; + display: inline-block; + padding: .4rem 1.5rem; + &.active, + &:hover { + background: $gray; + color: $whitish; + } + &.active { &:hover { - background: $gray-light; - color: $whitish; - } - &.move-to-current-sprint { - display: none; + background: lighten($gray, 30%); } } + &.move-to-current-sprint { + display: none; + } } .button-bulk { margin-left: .2rem; From 0de2d7388f5ec14d2031946b8f583167e3e89a7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Wed, 7 Oct 2015 09:31:50 +0200 Subject: [PATCH 08/26] Customize graph --- app/locales/locale-en.json | 4 ++++ app/partials/backlog/backlog.jade | 9 +++++-- app/styles/components/summary.scss | 38 ++++++++++++++++++++++++++++++ app/styles/core/animation.scss | 9 +++++++ app/svg/graph.svg | 10 ++++---- 5 files changed, 62 insertions(+), 8 deletions(-) diff --git a/app/locales/locale-en.json b/app/locales/locale-en.json index b6239fb9..088340a5 100644 --- a/app/locales/locale-en.json +++ b/app/locales/locale-en.json @@ -882,6 +882,10 @@ "PAGE_TITLE": "Backlog - {{projectName}}", "PAGE_DESCRIPTION": "The backlog panel, with user stories and sprints of the project {{projectName}}: {{projectDescription}}", "SECTION_NAME": "Backlog", + "CUSTOMIZE_GRAPH": "Customize your backlog graph", + "CUSTOMIZE_GRAPH_TEXT": "To have a nice graph that helps you follow the evolution of the project you have to set up the points and sprints through the", + "CUSTOMIZE_GRAPH_ADMIN": "Admin", + "CUSTOMIZE_GRAPH_TITLE": "Set up the points and sprints through the Admin", "MOVE_US_TO_CURRENT_SPRINT": "Move to Current Sprint", "SHOW_FILTERS": "Show filters", "SHOW_TAGS": "Show tags", diff --git a/app/partials/backlog/backlog.jade b/app/partials/backlog/backlog.jade index 11ebca9b..9b2122a8 100644 --- a/app/partials/backlog/backlog.jade +++ b/app/partials/backlog/backlog.jade @@ -11,9 +11,14 @@ 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.empty-burndown(ng-if="showGraphPlaceholder") + div.graph-icon + include ../../svg/graph.svg + div.empty-text + p.title(translate="BACKLOG.CUSTOMIZE_GRAPH") + p {{'BACKLOG.CUSTOMIZE_GRAPH_TEXT' | translate}} #[a(href="", title="{{'BACKLOG.CUSTOMIZE_GRAPH_TITLE' | translate}}") {{'BACKLOG.CUSTOMIZE_GRAPH_ADMIN' | translate}}] - div.graphics-container.burndown-container.js-burndown-graph + div.graphics-container.js-burndown-graph div.burndown(tg-burndown-backlog-graph) include ../includes/modules/burndown diff --git a/app/styles/components/summary.scss b/app/styles/components/summary.scss index 2d435a17..dcbdb50e 100644 --- a/app/styles/components/summary.scss +++ b/app/styles/components/summary.scss @@ -150,6 +150,44 @@ $summary-background: $grayer; } } +.empty-burndown { + @extend %light; + align-content: center; + align-items: center; + background: rgba($primary-dark, .15); + display: flex; + flex-direction: row; + justify-content: center; + margin-bottom: 1rem; + padding: 2rem 6rem; + svg { + flex-basis: 5rem; + flex-shrink: 0; + margin-right: 1rem; + width: 5rem; + } + p { + margin: 0; + } + .empty-text { + flex: 1; + } + .title { + @extend %light; + @extend %large; + color: $primary-dark; + margin: 0; + text-transform: uppercase; + } + path { + fill: $primary-dark; + } + a { + @extend %bold; + animation: blink 2s infinite; + } +} + .graphics-container { @include slide(300px, hidden, 0); } diff --git a/app/styles/core/animation.scss b/app/styles/core/animation.scss index 1a2fc285..50bc216c 100644 --- a/app/styles/core/animation.scss +++ b/app/styles/core/animation.scss @@ -58,3 +58,12 @@ transform: translateY(0); } } + +@keyframes blink { + 85% { + opacity: 1; + } + 100% { + opacity: .6; + } +} diff --git a/app/svg/graph.svg b/app/svg/graph.svg index 4563bf70..b4a28d94 100644 --- a/app/svg/graph.svg +++ b/app/svg/graph.svg @@ -1,8 +1,6 @@ - - - - - - + + + + From 15dbf078a47323c5b2303335b10442794fdb5ec2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Wed, 7 Oct 2015 09:42:47 +0200 Subject: [PATCH 09/26] Fix broken sidebar projects list --- .../home/projects/home-project-list.jade | 33 ++++++++++--------- .../home/projects/home-project-list.scss | 10 +++--- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/app/modules/home/projects/home-project-list.jade b/app/modules/home/projects/home-project-list.jade index b104ac32..54040b22 100644 --- a/app/modules/home/projects/home-project-list.jade +++ b/app/modules/home/projects/home-project-list.jade @@ -1,20 +1,23 @@ -ul.home-project-list(ng-show="vm.projects.size") - li.home-project-list-single(tg-bind-scope, tg-repeat="project in vm.projects") - a(href="#", tg-nav="project:project=project.get('slug')") - h2.home-project-list-single-title - span.project-name(title="{{ ::project.get('name') }}") {{::project.get('name')}} - span.private(ng-if="project.get('is_private')", title="{{'PROJECT.PRIVATE' | translate}}") - include ../../../svg/lock.svg - p {{ ::project.get('description') | limitTo:150 }} - span(ng-if="::project.get('description').size > 150") ... +section.home-project-list(ng-show="vm.projects.size") + ul + li.home-project-list-single(tg-bind-scope, tg-repeat="project in vm.projects") + a(href="#", tg-nav="project:project=project.get('slug')") + h2.home-project-list-single-title + span.project-name(title="{{ ::project.get('name') }}") {{::project.get('name')}} + span.private(ng-if="project.get('is_private')", title="{{'PROJECT.PRIVATE' | translate}}") + include ../../../svg/lock.svg + p {{ ::project.get('description') | limitTo:150 }} + span(ng-if="::project.get('description').size > 150") ... -a.see-more-projects-btn.button-gray(href="#", - ng-show="vm.projects.size", - tg-nav="projects", - title="{{'PROJECT.NAVIGATION.SEE_MORE_PROJECTS' | translate}}", - translate="PROJECT.NAVIGATION.SEE_MORE_PROJECTS") + a.see-more-projects-btn.button-gray( + href="#", + ng-show="vm.projects.size", + tg-nav="projects", + title="{{'PROJECT.NAVIGATION.SEE_MORE_PROJECTS' | translate}}", + translate="PROJECT.NAVIGATION.SEE_MORE_PROJECTS" + ) -section.projects-empty +section.projects-empty(ng-show="!vm.projects.size") include ../../../svg/empty-project.svg p(translate="HOME.EMPTY_PROJECT_LIST") a.create-project-button.button-green(href="#", ng-click="vm.newProject()", diff --git a/app/modules/home/projects/home-project-list.scss b/app/modules/home/projects/home-project-list.scss index b443e4d4..21d67b31 100644 --- a/app/modules/home/projects/home-project-list.scss +++ b/app/modules/home/projects/home-project-list.scss @@ -18,11 +18,11 @@ transition: fill .3s linear; } } - } - a { - display: flex; - flex-direction: column; - min-height: 5rem; + a { + display: flex; + flex-direction: column; + min-height: 5rem; + } } h2 { @extend %text; From a3a3734258ee056013ce17070587f95e75806421 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Wed, 7 Oct 2015 13:56:13 +0200 Subject: [PATCH 10/26] Taskboard placeholder --- app/locales/locale-en.json | 2 + .../includes/components/card-placeholder.jade | 7 ++++ .../includes/components/taskboard-task.jade | 6 +-- .../includes/modules/taskboard-table.jade | 15 ++++++-- app/styles/components/card-placeholder.scss | 37 +++++++++++++++++++ app/styles/components/taskboard-task.scss | 5 +++ 6 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 app/partials/includes/components/card-placeholder.jade create mode 100644 app/styles/components/card-placeholder.scss diff --git a/app/locales/locale-en.json b/app/locales/locale-en.json index 088340a5..c663b509 100644 --- a/app/locales/locale-en.json +++ b/app/locales/locale-en.json @@ -973,6 +973,8 @@ "TITLE_ACTION_ADD_BULK": "Add some new Tasks in bulk", "TITLE_ACTION_ASSIGN": "Assign task", "TITLE_ACTION_EDIT": "Edit task", + "PLACEHOLDER_CARD_TITLE": "This could be a task", + "PLACEHOLDER_CARD_TEXT": "Split Stories into tasks to track them separately", "TABLE": { "COLUMN": "User story", "TITLE_ACTION_FOLD": "Fold column", diff --git a/app/partials/includes/components/card-placeholder.jade b/app/partials/includes/components/card-placeholder.jade new file mode 100644 index 00000000..89af6d87 --- /dev/null +++ b/app/partials/includes/components/card-placeholder.jade @@ -0,0 +1,7 @@ +.placeholder-avatar + .image + .text + .line + .line +p.title {{'TASKBOARD.PLACEHOLDER_CARD_TITLE' | translate}} +p {{'TASKBOARD.PLACEHOLDER_CARD_TEXT' | translate}} diff --git a/app/partials/includes/components/taskboard-task.jade b/app/partials/includes/components/taskboard-task.jade index bb0a13b8..dd34369e 100644 --- a/app/partials/includes/components/taskboard-task.jade +++ b/app/partials/includes/components/taskboard-task.jade @@ -1,7 +1,5 @@ -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-tagline(tg-colorize-tags="task.tags", tg-colorize-tags-type="taskboard") +div.taskboard-task-inner 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/taskboard-table.jade b/app/partials/includes/modules/taskboard-table.jade index e3163ba9..2b0f1476 100644 --- a/app/partials/includes/modules/taskboard-table.jade +++ b/app/partials/includes/modules/taskboard-table.jade @@ -37,6 +37,15 @@ div.taskboard-table(tg-taskboard-squish-column) span(translate="TASKBOARD.TABLE.ROW_UNASSIGED_TASKS_TITLE") include ../components/addnewtask.jade div.taskboard-tasks-box.task-column(ng-repeat="st in taskStatusList track by st.id", tg-taskboard-sortable, class="squish-status-{{st.id}}", ng-class="{'column-fold':statusesFolded[st.id]}", tg-bind-scope) - div.taskboard-task(ng-repeat="task in usTasks[null][st.id] track by task.id", - tg-taskboard-task, tg-bind-scope, tg-class-permission="{'readonly': '!modify_task'}") - include ../components/taskboard-task + div.taskboard-task( + ng-repeat="task in usTasks[null][st.id] track by task.id" + tg-taskboard-task + tg-bind-scope + tg-class-permission="{'readonly': '!modify_task'}" + ng-class="{'card-placeholder': task.isPlaceholder}" + ) + div(ng-if="!task.isPlaceholder") + include ../components/taskboard-task + + div(ng-if="task.isPlaceholder") + include ../components/card-placeholder diff --git a/app/styles/components/card-placeholder.scss b/app/styles/components/card-placeholder.scss new file mode 100644 index 00000000..5a61b4b6 --- /dev/null +++ b/app/styles/components/card-placeholder.scss @@ -0,0 +1,37 @@ +.card-placeholder { + background: darken($whitish, 5%); + border: 1px solid darken($whitish, 8%); + cursor: default; + padding: 1rem; + .placeholder-avatar { + display: flex; + } + .image { + background: darken($whitish, 8%); + flex-basis: 48px; + height: 48px; + margin-right: .5rem; + width: 48px; + } + .text { + flex: 1; + } + .line { + background: darken($whitish, 8%); + height: 1rem; + margin-bottom: 1rem; + width: 80%; + &:last-child { + width: 40%; + } + } + .title { + @extend %large; + text-transform: uppercase; + } + p { + @extend %light; + color: $gray; + margin: 0; + } +} diff --git a/app/styles/components/taskboard-task.scss b/app/styles/components/taskboard-task.scss index a8d58830..b3eaeb21 100644 --- a/app/styles/components/taskboard-task.scss +++ b/app/styles/components/taskboard-task.scss @@ -36,6 +36,11 @@ } } } + &.card-placeholder { + background: darken($whitish, 5%); + border: 1px solid darken($whitish, 8%); + cursor: default; + } .taskboard-tagline { border-color: $card-hover; display: flex; From 0753d8029dd4b24465491a54ee616fdc4ec99f3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Wed, 7 Oct 2015 15:29:08 +0200 Subject: [PATCH 11/26] WIP kanban card placeholder --- app/coffee/modules/kanban/main.coffee | 9 +++++++-- .../components/card-placeholder.jade | 0 app/partials/includes/modules/kanban-table.jade | 13 +++++++++---- app/partials/includes/modules/taskboard-table.jade | 2 +- app/partials/kanban/kanban-task.jade | 10 ++++++---- 5 files changed, 23 insertions(+), 11 deletions(-) rename app/partials/{includes => common}/components/card-placeholder.jade (100%) diff --git a/app/coffee/modules/kanban/main.coffee b/app/coffee/modules/kanban/main.coffee index 714e5ca9..612194b2 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) @@ -439,7 +439,12 @@ KanbanUserstoryDirective = ($rootscope, $loading, $rs) -> $el.off() return { - templateUrl: "kanban/kanban-task.html" + #templateUrl: "kanban/kanban-task.html" + templateUrl: (elem, attr) -> + if attr.placeholder + return "common/components/card-placeholder.html" + else + return "kanban/kanban-task.html" link: link require: "ngModel" } diff --git a/app/partials/includes/components/card-placeholder.jade b/app/partials/common/components/card-placeholder.jade similarity index 100% rename from app/partials/includes/components/card-placeholder.jade rename to app/partials/common/components/card-placeholder.jade diff --git a/app/partials/includes/modules/kanban-table.jade b/app/partials/includes/modules/kanban-table.jade index 7082a0ce..2fae77f0 100644 --- a/app/partials/includes/modules/kanban-table.jade +++ b/app/partials/includes/modules/kanban-table.jade @@ -46,9 +46,14 @@ div.kanban-table(tg-kanban-squish-column) tg-kanban-column-height-fixer, tg-bind-scope) - div.kanban-task(ng-repeat="us in usByStatus[s.id] track by us.id", - tg-kanban-userstory, ng-model="us", tg-bind-scope, - tg-class-permission="{'readonly': '!modify_task'}" - ng-class="ctrl.getCardClass(s.id)") + div.kanban-task( + ng-repeat="us in usByStatus[s.id] track by us.id", + tg-kanban-userstory, + ng-model="us", + tg-bind-scope, + tg-class-permission="{'readonly': '!modify_task'}" + ng-class="ctrl.getCardClass(s.id), 'card-placeholder': us.isPlaceholder}" + placeholder="{{us.isPlaceholder}}" + ) div.kanban-column-intro(ng-if="s.is_archived", tg-kanban-archived-status-intro="s") diff --git a/app/partials/includes/modules/taskboard-table.jade b/app/partials/includes/modules/taskboard-table.jade index 2b0f1476..05ff82fc 100644 --- a/app/partials/includes/modules/taskboard-table.jade +++ b/app/partials/includes/modules/taskboard-table.jade @@ -48,4 +48,4 @@ div.taskboard-table(tg-taskboard-squish-column) include ../components/taskboard-task div(ng-if="task.isPlaceholder") - include ../components/card-placeholder + include ../../common/components/card-placeholder diff --git a/app/partials/kanban/kanban-task.jade b/app/partials/kanban/kanban-task.jade index 177e9b28..a63842bc 100644 --- a/app/partials/kanban/kanban-task.jade +++ b/app/partials/kanban/kanban-task.jade @@ -1,7 +1,9 @@ -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.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.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}}") From e07e3b156e09fcfdb0df7f338ac81922c0cc0082 Mon Sep 17 00:00:00 2001 From: Juanfran Date: Thu, 8 Oct 2015 09:36:00 +0200 Subject: [PATCH 12/26] kanban us placeholder --- app/coffee/modules/kanban/main.coffee | 40 ++++++++++--------- .../includes/modules/kanban-table.jade | 6 +-- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/app/coffee/modules/kanban/main.coffee b/app/coffee/modules/kanban/main.coffee index 612194b2..fc98e66b 100644 --- a/app/coffee/modules/kanban/main.coffee +++ b/app/coffee/modules/kanban/main.coffee @@ -34,14 +34,10 @@ module = angular.module("taigaKanban") # Vars defaultViewMode = "maximized" -defaultViewModes = { - maximized: { - cardClass: "kanban-task-maximized" - } - minimized: { - cardClass: "kanban-task-minimized" - } -} +viewModes = [ + "maximized", + "minimized" +] ############################################################################# @@ -225,8 +221,9 @@ class KanbanController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi @scope.statusViewModes = {} for status in @scope.usStatusList - mode = storedStatusViewModes[status.id] - @scope.statusViewModes[status.id] = if _.has(defaultViewModes, mode) then mode else defaultViewMode + mode = storedStatusViewModes[status.id] || defaultViewMode + + @scope.statusViewModes[status.id] = mode @.storeStatusViewModes() @@ -237,9 +234,13 @@ class KanbanController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.Fi @scope.statusViewModes[statusId] = newViewMode @.storeStatusViewModes() - getCardClass: (statusId)-> + isMaximized: (statusId) -> mode = @scope.statusViewModes[statusId] or defaultViewMode - return defaultViewModes[mode].cardClass or defaultViewModes[defaultViewMode].cardClass + return mode == 'maximized' + + isMinimized: (statusId) -> + mode = @scope.statusViewModes[statusId] or defaultViewMode + return mode == 'minimized' # Utils methods @@ -418,7 +419,7 @@ KanbanUserstoryDirective = ($rootscope, $loading, $rs) -> else if not us.is_blocked and $el.hasClass("blocked") $el.removeClass("blocked") - $el.find(".icon-edit").on "click", (event) -> + $el.on 'click', '.icon-edit', (event) -> if $el.find(".icon-edit").hasClass("noclick") return @@ -435,16 +436,17 @@ KanbanUserstoryDirective = ($rootscope, $loading, $rs) -> $rootscope.$broadcast("usform:edit", editingUserStory) currentLoading.finish() + $scope.getTemplateUrl = () -> + if $scope.us.isPlaceholder + return "common/components/card-placeholder.html" + else + return "kanban/kanban-task.html" + $scope.$on "$destroy", -> $el.off() return { - #templateUrl: "kanban/kanban-task.html" - templateUrl: (elem, attr) -> - if attr.placeholder - return "common/components/card-placeholder.html" - else - return "kanban/kanban-task.html" + template: '', link: link require: "ngModel" } diff --git a/app/partials/includes/modules/kanban-table.jade b/app/partials/includes/modules/kanban-table.jade index 2fae77f0..23c55db8 100644 --- a/app/partials/includes/modules/kanban-table.jade +++ b/app/partials/includes/modules/kanban-table.jade @@ -48,11 +48,11 @@ div.kanban-table(tg-kanban-squish-column) div.kanban-task( ng-repeat="us in usByStatus[s.id] track by us.id", - tg-kanban-userstory, - ng-model="us", + tg-kanban-userstory, + ng-model="us", tg-bind-scope, tg-class-permission="{'readonly': '!modify_task'}" - ng-class="ctrl.getCardClass(s.id), 'card-placeholder': us.isPlaceholder}" + ng-class="{'kanban-task-maximized': ctrl.isMaximized(s.id), 'kanban-task-minimized': ctrl.isMinimized(s.id), 'card-placeholder': us.isPlaceholder}" placeholder="{{us.isPlaceholder}}" ) From 0320826af3fac35afe20a3ba98f80ce3ae77d1ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Thu, 8 Oct 2015 10:56:48 +0200 Subject: [PATCH 13/26] Add kanban placeholder styles --- app/styles/components/kanban-task.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/styles/components/kanban-task.scss b/app/styles/components/kanban-task.scss index 401c45a0..5a7e689a 100644 --- a/app/styles/components/kanban-task.scss +++ b/app/styles/components/kanban-task.scss @@ -33,6 +33,12 @@ color: $white; } } + &.card-placeholder { + background: darken($whitish, 5%); + border: 1px solid darken($whitish, 8%); + cursor: default; + padding: 1rem; + } .kanban-tagline { border-color: $card-hover; display: flex; From e41c23a57fc7eb4814fd37c8a27a0cc3823f9e3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Thu, 8 Oct 2015 15:35:58 +0200 Subject: [PATCH 14/26] Add dashed styles to placeholder cards --- app/styles/components/card-placeholder.scss | 4 ++-- app/styles/components/kanban-task.scss | 5 ++--- app/styles/components/taskboard-task.scss | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/styles/components/card-placeholder.scss b/app/styles/components/card-placeholder.scss index 5a61b4b6..ce334a12 100644 --- a/app/styles/components/card-placeholder.scss +++ b/app/styles/components/card-placeholder.scss @@ -1,6 +1,6 @@ .card-placeholder { - background: darken($whitish, 5%); - border: 1px solid darken($whitish, 8%); + background: darken($whitish, 2%); + border: 1px dashed darken($whitish, 8%); cursor: default; padding: 1rem; .placeholder-avatar { diff --git a/app/styles/components/kanban-task.scss b/app/styles/components/kanban-task.scss index 5a7e689a..70a6480e 100644 --- a/app/styles/components/kanban-task.scss +++ b/app/styles/components/kanban-task.scss @@ -34,10 +34,9 @@ } } &.card-placeholder { - background: darken($whitish, 5%); - border: 1px solid darken($whitish, 8%); + background: darken($whitish, 2%); + border: 3px dashed darken($whitish, 8%); cursor: default; - padding: 1rem; } .kanban-tagline { border-color: $card-hover; diff --git a/app/styles/components/taskboard-task.scss b/app/styles/components/taskboard-task.scss index b3eaeb21..016d126b 100644 --- a/app/styles/components/taskboard-task.scss +++ b/app/styles/components/taskboard-task.scss @@ -37,8 +37,8 @@ } } &.card-placeholder { - background: darken($whitish, 5%); - border: 1px solid darken($whitish, 8%); + background: darken($whitish, 2%); + border: 3px dashed darken($whitish, 8%); cursor: default; } .taskboard-tagline { From 338cbf89ecfe47339ce674e8a0e4ea81581a4895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Thu, 8 Oct 2015 16:24:58 +0200 Subject: [PATCH 15/26] Search results placeholder --- app/images/search-empty.png | Bin 0 -> 15459 bytes .../components/empty-search-results.jade | 6 ++++ .../includes/modules/search-result-table.jade | 24 +++++---------- .../modules/search/search-result-table.scss | 29 ++++++++++-------- 4 files changed, 30 insertions(+), 29 deletions(-) create mode 100644 app/images/search-empty.png create mode 100644 app/partials/includes/components/empty-search-results.jade diff --git a/app/images/search-empty.png b/app/images/search-empty.png new file mode 100644 index 0000000000000000000000000000000000000000..7b20d0093b6cc79b6018233017a568c8e295ad5c GIT binary patch literal 15459 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 Date: Fri, 9 Oct 2015 08:47:48 +0200 Subject: [PATCH 16/26] Add link to admin panel in graph --- app/partials/backlog/backlog.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/partials/backlog/backlog.jade b/app/partials/backlog/backlog.jade index 9b2122a8..dcd74893 100644 --- a/app/partials/backlog/backlog.jade +++ b/app/partials/backlog/backlog.jade @@ -16,7 +16,7 @@ div.wrapper(tg-backlog, ng-controller="BacklogController as ctrl", include ../../svg/graph.svg div.empty-text p.title(translate="BACKLOG.CUSTOMIZE_GRAPH") - p {{'BACKLOG.CUSTOMIZE_GRAPH_TEXT' | translate}} #[a(href="", title="{{'BACKLOG.CUSTOMIZE_GRAPH_TITLE' | translate}}") {{'BACKLOG.CUSTOMIZE_GRAPH_ADMIN' | translate}}] + p {{'BACKLOG.CUSTOMIZE_GRAPH_TEXT' | translate}} #[a(href="", tg-nav="project-admin-project-profile-details:project=project.slug", title="{{'BACKLOG.CUSTOMIZE_GRAPH_TITLE' | translate}}") {{'BACKLOG.CUSTOMIZE_GRAPH_ADMIN' | translate}}] div.graphics-container.js-burndown-graph div.burndown(tg-burndown-backlog-graph) From a52790ff28f5b5e5eb06de4ad46fb2662b084f3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Tue, 13 Oct 2015 15:54:55 +0200 Subject: [PATCH 17/26] Add padding to placeholder text in dashboard --- app/modules/home/working-on/empty.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/modules/home/working-on/empty.scss b/app/modules/home/working-on/empty.scss index 26fe4c83..cf8c5c3c 100644 --- a/app/modules/home/working-on/empty.scss +++ b/app/modules/home/working-on/empty.scss @@ -3,7 +3,8 @@ margin-bottom: 4rem; p { @extend %light; - margin: 1rem 0 0; + margin: 2rem 9rem 1rem; + text-align: center; } } From f3e9110351c85677e40dec5744590e74d75c0326 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Wed, 14 Oct 2015 09:19:23 +0200 Subject: [PATCH 18/26] Fix show/hide buttons on backlog options --- app/coffee/modules/backlog/main.coffee | 4 ++-- app/partials/backlog/backlog.jade | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/coffee/modules/backlog/main.coffee b/app/coffee/modules/backlog/main.coffee index 3d432046..e2757184 100644 --- a/app/coffee/modules/backlog/main.coffee +++ b/app/coffee/modules/backlog/main.coffee @@ -705,12 +705,12 @@ BacklogDirective = ($repo, $rootscope, $translate) -> elm.addClass("active") text = $translate.instant("BACKLOG.TAGS.HIDE") - elm.find(".text").text(text) + elm.text(text) else elm.removeClass("active") text = $translate.instant("BACKLOG.TAGS.SHOW") - elm.find(".text").text(text) + elm.text(text) showHideFilter = ($scope, $el, $ctrl) -> sidebar = $el.find("sidebar.filters-bar") diff --git a/app/partials/backlog/backlog.jade b/app/partials/backlog/backlog.jade index dcd74893..ecfaa186 100644 --- a/app/partials/backlog/backlog.jade +++ b/app/partials/backlog/backlog.jade @@ -32,12 +32,14 @@ div.wrapper(tg-backlog, ng-controller="BacklogController as ctrl", span.icon.icon-move span.text(translate="BACKLOG.MOVE_US_TO_CURRENT_SPRINT") a.trans-button( + ng-if="userstories.length" href="" title="{{'BACKLOG.FILTERS.TOGGLE' | translate}}" id="show-filters-button" translate="BACKLOG.FILTERS.SHOW" ) a.trans-button( + ng-if="userstories.length" href="" title="{{'BACKLOG.TAGS.TOGGLE' | translate}}" id="show-tags" From b28e33fcb39dc537400d2ff5207e7420f4431b8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Wed, 14 Oct 2015 09:39:36 +0200 Subject: [PATCH 19/26] Show placeholder if there is only one Story --- app/coffee/modules/taskboard/main.coffee | 1 + app/partials/includes/modules/taskboard-table.jade | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app/coffee/modules/taskboard/main.coffee b/app/coffee/modules/taskboard/main.coffee index c3d3941c..5c1b1148 100644 --- a/app/coffee/modules/taskboard/main.coffee +++ b/app/coffee/modules/taskboard/main.coffee @@ -185,6 +185,7 @@ class TaskboardController extends mixOf(taiga.Controller, taiga.PageMixin) @scope.usTasks[task.user_story][task.status].push(task) if tasks.length == 0 + if @scope.userstories.length > 0 usId = @scope.userstories[0].id else diff --git a/app/partials/includes/modules/taskboard-table.jade b/app/partials/includes/modules/taskboard-table.jade index 05ff82fc..a832b449 100644 --- a/app/partials/includes/modules/taskboard-table.jade +++ b/app/partials/includes/modules/taskboard-table.jade @@ -24,10 +24,20 @@ div.taskboard-table(tg-taskboard-squish-column) span(ng-bind="us.total_points") span(translate="TASKBOARD.TABLE.FIELD_POINTS") include ../components/addnewtask + div.taskboard-tasks-box.task-column(ng-repeat="st in taskStatusList track by st.id", tg-taskboard-sortable, class="squish-status-{{st.id}}", ng-class="{'column-fold':statusesFolded[st.id]}", tg-bind-scope) - div.taskboard-task(ng-repeat="task in usTasks[us.id][st.id] track by task.id", - tg-taskboard-task, tg-bind-scope, tg-class-permission="{'readonly': '!modify_task'}") + div.taskboard-task( + ng-repeat="task in usTasks[us.id][st.id] track by task.id" + tg-taskboard-task + tg-bind-scope + tg-class-permission="{'readonly': '!modify_task'}" + ng-class="{'card-placeholder': task.isPlaceholder}" + ) + div(ng-if="!task.isPlaceholder") include ../components/taskboard-task + + div(ng-if="task.isPlaceholder") + include ../../common/components/card-placeholder div.task-row(ng-init="us = null", ng-class="{'row-fold':usFolded[null]}") div.taskboard-userstory-box.task-column From e8c2506c5b2f6dd5f12d08b52b9f877f32a3cf41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Wed, 14 Oct 2015 11:00:03 +0200 Subject: [PATCH 20/26] Edit placeholder text in taskboard task --- app/coffee/modules/kanban/main.coffee | 2 +- app/locales/locale-en.json | 4 +++- .../common/components/kanban-placeholder.jade | 7 +++++++ ...-placeholder.jade => taskboard-placeholder.jade} | 0 app/partials/includes/modules/kanban-table.jade | 13 ++++++------- app/partials/includes/modules/taskboard-table.jade | 5 +++-- app/styles/components/card-placeholder.scss | 1 - 7 files changed, 20 insertions(+), 12 deletions(-) create mode 100644 app/partials/common/components/kanban-placeholder.jade rename app/partials/common/components/{card-placeholder.jade => taskboard-placeholder.jade} (100%) diff --git a/app/coffee/modules/kanban/main.coffee b/app/coffee/modules/kanban/main.coffee index fc98e66b..a3f76cf5 100644 --- a/app/coffee/modules/kanban/main.coffee +++ b/app/coffee/modules/kanban/main.coffee @@ -438,7 +438,7 @@ KanbanUserstoryDirective = ($rootscope, $loading, $rs) -> $scope.getTemplateUrl = () -> if $scope.us.isPlaceholder - return "common/components/card-placeholder.html" + return "common/components/kanban-placeholder.html" else return "kanban/kanban-task.html" diff --git a/app/locales/locale-en.json b/app/locales/locale-en.json index c663b509..d0c9a6ee 100644 --- a/app/locales/locale-en.json +++ b/app/locales/locale-en.json @@ -1124,7 +1124,9 @@ "ACTION_HIDE_ARCHIVED": "Hide archived", "HIDDEN_USER_STORIES": "The user stories in this status are hidden by default", "ARCHIVED": "You have archived", - "UNDO_ARCHIVED": "Drag & drop again to undo" + "UNDO_ARCHIVED": "Drag & drop again to undo", + "PLACEHOLDER_CARD_TITLE": "Find Here User Stories", + "PLACEHOLDER_CARD_TEXT": "Stories might also have subtasks to separate requirements" }, "SEARCH": { "PAGE_TITLE": "Search - {{projectName}}", diff --git a/app/partials/common/components/kanban-placeholder.jade b/app/partials/common/components/kanban-placeholder.jade new file mode 100644 index 00000000..551fcbe8 --- /dev/null +++ b/app/partials/common/components/kanban-placeholder.jade @@ -0,0 +1,7 @@ +.placeholder-avatar + .image + .text + .line + .line +p.title {{'KANBAN.PLACEHOLDER_CARD_TITLE' | translate}} +p {{'KANBAN.PLACEHOLDER_CARD_TEXT' | translate}} diff --git a/app/partials/common/components/card-placeholder.jade b/app/partials/common/components/taskboard-placeholder.jade similarity index 100% rename from app/partials/common/components/card-placeholder.jade rename to app/partials/common/components/taskboard-placeholder.jade diff --git a/app/partials/includes/modules/kanban-table.jade b/app/partials/includes/modules/kanban-table.jade index 23c55db8..ba98f484 100644 --- a/app/partials/includes/modules/kanban-table.jade +++ b/app/partials/includes/modules/kanban-table.jade @@ -40,12 +40,12 @@ div.kanban-table(tg-kanban-squish-column) div.kanban-table-body div.kanban-table-inner div.kanban-uses-box.task-column(ng-class='{vfold:folds[s.id]}', - ng-repeat="s in usStatusList track by s.id", - tg-kanban-sortable, - tg-kanban-wip-limit="s", - tg-kanban-column-height-fixer, - tg-bind-scope) - + ng-repeat="s in usStatusList track by s.id", + tg-kanban-sortable, + tg-kanban-wip-limit="s", + tg-kanban-column-height-fixer, + tg-bind-scope + ) div.kanban-task( ng-repeat="us in usByStatus[s.id] track by us.id", tg-kanban-userstory, @@ -55,5 +55,4 @@ div.kanban-table(tg-kanban-squish-column) ng-class="{'kanban-task-maximized': ctrl.isMaximized(s.id), 'kanban-task-minimized': ctrl.isMinimized(s.id), 'card-placeholder': us.isPlaceholder}" placeholder="{{us.isPlaceholder}}" ) - div.kanban-column-intro(ng-if="s.is_archived", tg-kanban-archived-status-intro="s") diff --git a/app/partials/includes/modules/taskboard-table.jade b/app/partials/includes/modules/taskboard-table.jade index a832b449..37a5fcc5 100644 --- a/app/partials/includes/modules/taskboard-table.jade +++ b/app/partials/includes/modules/taskboard-table.jade @@ -37,7 +37,8 @@ div.taskboard-table(tg-taskboard-squish-column) include ../components/taskboard-task div(ng-if="task.isPlaceholder") - include ../../common/components/card-placeholder + - var card = 'task' + include ../../common/components/taskboard-placeholder div.task-row(ng-init="us = null", ng-class="{'row-fold':usFolded[null]}") div.taskboard-userstory-box.task-column @@ -58,4 +59,4 @@ div.taskboard-table(tg-taskboard-squish-column) include ../components/taskboard-task div(ng-if="task.isPlaceholder") - include ../../common/components/card-placeholder + include ../../common/components/taskboard-placeholder diff --git a/app/styles/components/card-placeholder.scss b/app/styles/components/card-placeholder.scss index ce334a12..27691a88 100644 --- a/app/styles/components/card-placeholder.scss +++ b/app/styles/components/card-placeholder.scss @@ -26,7 +26,6 @@ } } .title { - @extend %large; text-transform: uppercase; } p { From 76967be9bfb8ad6b6244d83fafaa04b459ad27aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Juli=C3=A1n?= Date: Wed, 14 Oct 2015 13:27:22 +0200 Subject: [PATCH 21/26] Empty Issues Page --- app/images/issues-empty.png | Bin 0 -> 26569 bytes app/locales/locale-en.json | 5 ++--- .../{list-filters.jade => issues-options.jade} | 2 +- app/partials/includes/modules/issues-table.jade | 14 +++++++------- app/partials/issue/issues.jade | 2 +- app/styles/layout/kanban.scss | 3 --- .../issues-options.scss} | 3 +-- app/styles/modules/issues/issues-table.scss | 16 +++++++++++++++- 8 files changed, 27 insertions(+), 18 deletions(-) create mode 100644 app/images/issues-empty.png rename app/partials/includes/modules/{list-filters.jade => issues-options.jade} (80%) rename app/styles/modules/{filters/list-filters.scss => issues/issues-options.scss} (82%) diff --git a/app/images/issues-empty.png b/app/images/issues-empty.png new file mode 100644 index 0000000000000000000000000000000000000000..4668e0279b676910c28a368833c838b26621e952 GIT binary patch literal 26569 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 literal 0 HcmV?d00001 diff --git a/app/locales/locale-en.json b/app/locales/locale-en.json index d0c9a6ee..c1a97761 100644 --- a/app/locales/locale-en.json +++ b/app/locales/locale-en.json @@ -1101,8 +1101,7 @@ "TITLE_ACTION_ASSIGNED_TO": "Assigned to", "EMPTY": { "TITLE": "There are no issues to report :-)", - "SUBTITLE": "Did you find an issue?", - "ACTION_CREATE_ISSUE": "Create a new Issue" + "SUBTITLE": "Did you find an issue?" } } }, @@ -1125,7 +1124,7 @@ "HIDDEN_USER_STORIES": "The user stories in this status are hidden by default", "ARCHIVED": "You have archived", "UNDO_ARCHIVED": "Drag & drop again to undo", - "PLACEHOLDER_CARD_TITLE": "Find Here User Stories", + "PLACEHOLDER_CARD_TITLE": "These are your User Stories", "PLACEHOLDER_CARD_TEXT": "Stories might also have subtasks to separate requirements" }, "SEARCH": { diff --git a/app/partials/includes/modules/list-filters.jade b/app/partials/includes/modules/issues-options.jade similarity index 80% rename from app/partials/includes/modules/list-filters.jade rename to app/partials/includes/modules/issues-options.jade index 5ebb73a8..4cbce556 100644 --- a/app/partials/includes/modules/list-filters.jade +++ b/app/partials/includes/modules/issues-options.jade @@ -1,4 +1,4 @@ -section.list-filters(tg-check-permission="add_issue") +section.issues-options(tg-check-permission="add_issue") div.new-issue a.button-green(href="", ng-click="ctrl.addNewIssue()") span.text(translate="ISSUES.ACTION_NEW_ISSUE") diff --git a/app/partials/includes/modules/issues-table.jade b/app/partials/includes/modules/issues-table.jade index d3672c83..de9de296 100644 --- a/app/partials/includes/modules/issues-table.jade +++ b/app/partials/includes/modules/issues-table.jade @@ -30,10 +30,10 @@ section.issues-table.basic-table(ng-class="{empty: !issues.length}") figure.avatar span.icon.icon-arrow-bottom(tg-check-permission="modify_issue") -section.empty.empty-issues(ng-class="{hidden: issues.length}") - span.icon.icon-issues - span.title(translate="ISSUES.TABLE.EMPTY.TITLE") - span(translate="ISSUES.TABLE.EMPTY.SUBTITLE") - a(href="", ng-click="ctrl.addNewIssue()", - title="{{'ISSUES.TABLE.EMPTY.ACTION_CREATE_ISSUE' | translate}}", - translate="ISSUES.TABLE.EMPTY.ACTION_CREATE_ISSUE") +section.empty-issues(ng-if="!issues.length") + img( + src="../../images/issues-empty.png", + alt="{{ISSUES.TABLE.EMPTY.TITLE | translate }}" + ) + p.title(translate="ISSUES.TABLE.EMPTY.TITLE") + p(translate="ISSUES.TABLE.EMPTY.SUBTITLE") diff --git a/app/partials/issue/issues.jade b/app/partials/issue/issues.jade index 8073ca4a..cee3d14a 100644 --- a/app/partials/issue/issues.jade +++ b/app/partials/issue/issues.jade @@ -9,7 +9,7 @@ div.wrapper.issues(tg-issues, ng-controller="IssuesController as ctrl", ng-init= header include ../includes/components/mainTitle - include ../includes/modules/list-filters + include ../includes/modules/issues-options include ../includes/modules/issues-table // Paginator is rendered using js. diff --git a/app/styles/layout/kanban.scss b/app/styles/layout/kanban.scss index 924d451b..b57d9884 100644 --- a/app/styles/layout/kanban.scss +++ b/app/styles/layout/kanban.scss @@ -12,7 +12,4 @@ .burndown-container { display: none; } - .list-filters { - margin-bottom: 1rem; - } } diff --git a/app/styles/modules/filters/list-filters.scss b/app/styles/modules/issues/issues-options.scss similarity index 82% rename from app/styles/modules/filters/list-filters.scss rename to app/styles/modules/issues/issues-options.scss index 56e0a7e9..3e00b74f 100644 --- a/app/styles/modules/filters/list-filters.scss +++ b/app/styles/modules/issues/issues-options.scss @@ -1,10 +1,9 @@ -.list-filters { +.issues-options { align-items: center; background-color: $whitish; display: flex; justify-content: flex-end; margin-bottom: 2rem; - padding: .5rem 1rem; .button-bulk { margin-left: .2rem; } diff --git a/app/styles/modules/issues/issues-table.scss b/app/styles/modules/issues/issues-table.scss index 99d11211..cb82feb2 100644 --- a/app/styles/modules/issues/issues-table.scss +++ b/app/styles/modules/issues/issues-table.scss @@ -126,4 +126,18 @@ } } - +.empty-issues { + margin-top: 4rem; + text-align: center; + img { + margin-bottom: 1rem; + } + .title { + @extend %large; + text-transform: uppercase; + } + p { + @extend %light; + margin: 0; + } +} From 15b2ef20d74ef2733d15cbbe57f8943c3c5b2ae8 Mon Sep 17 00:00:00 2001 From: Juanfran Date: Thu, 15 Oct 2015 09:20:54 +0200 Subject: [PATCH 22/26] prevent burndown graph initial animation --- app/coffee/modules/backlog/main.coffee | 22 ++++++++++++++++++---- app/styles/components/summary.scss | 7 ++++++- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/app/coffee/modules/backlog/main.coffee b/app/coffee/modules/backlog/main.coffee index e2757184..10f737a1 100644 --- a/app/coffee/modules/backlog/main.coffee +++ b/app/coffee/modules/backlog/main.coffee @@ -935,17 +935,31 @@ module.directive("tgBacklogUsPoints", ["$tgEstimationsService", "$tgRepo", "$tgT ## Burndown graph directive ############################################################################# ToggleBurndownVisibility = ($storage) -> + hide = () -> + $(".js-burndown-graph").removeClass("shown") + $(".js-toggle-burndown-visibility-button").removeClass("active") + $(".js-burndown-graph").removeClass("open") + + show = (firstLoad) -> + $(".js-toggle-burndown-visibility-button").addClass("active") + + if firstLoad + $(".js-burndown-graph").addClass("shown") + else + $(".js-burndown-graph").addClass("open") + link = ($scope, $el, $attrs) -> + firstLoad = true hash = generateHash(["is-burndown-grpahs-collapsed"]) $scope.isBurndownGraphCollapsed = $storage.get(hash) or false toggleGraph = -> if $scope.isBurndownGraphCollapsed - $(".js-toggle-burndown-visibility-button").removeClass("active") - $(".js-burndown-graph").removeClass("open") + hide(firstLoad) else - $(".js-toggle-burndown-visibility-button").addClass("active") - $(".js-burndown-graph").addClass("open") + show(firstLoad) + + firstLoad = false $scope.$watch "showGraphPlaceholder", () -> if $scope.showGraphPlaceholder? diff --git a/app/styles/components/summary.scss b/app/styles/components/summary.scss index dcbdb50e..25f26f33 100644 --- a/app/styles/components/summary.scss +++ b/app/styles/components/summary.scss @@ -189,5 +189,10 @@ $summary-background: $grayer; } .graphics-container { - @include slide(300px, hidden, 0); + $height: 300px; + @include slide($height, hidden, 0); + &.shown { + max-height: $height; + transition: none; + } } From ef9e1b32cf66eea1a29cb0b692d80872ac3ff42f Mon Sep 17 00:00:00 2001 From: Juanfran Date: Thu, 15 Oct 2015 09:27:10 +0200 Subject: [PATCH 23/26] fix dragging to backlog --- app/coffee/modules/backlog/main.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/coffee/modules/backlog/main.coffee b/app/coffee/modules/backlog/main.coffee index 10f737a1..0a17ad90 100644 --- a/app/coffee/modules/backlog/main.coffee +++ b/app/coffee/modules/backlog/main.coffee @@ -299,7 +299,7 @@ class BacklogController extends mixOf(taiga.Controller, taiga.PageMixin, taiga.F newSprint = @scope.sprintsById[newSprintId] # Move to closed sprint - if !newSprint + if !newSprint && newSprintId newSprint = @scope.closedSprintsById[newSprintId] movedToClosedSprint = true if newSprint From 39407acf42a0e4776849a1d13a5d503636728589 Mon Sep 17 00:00:00 2001 From: Juanfran Date: Thu, 15 Oct 2015 12:53:57 +0200 Subject: [PATCH 24/26] add 'items' params in the sortable empty backlog --- app/coffee/modules/backlog/sortable.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/app/coffee/modules/backlog/sortable.coffee b/app/coffee/modules/backlog/sortable.coffee index 70b25dbf..48188254 100644 --- a/app/coffee/modules/backlog/sortable.coffee +++ b/app/coffee/modules/backlog/sortable.coffee @@ -144,6 +144,7 @@ BacklogEmptySortableDirective = ($repo, $rs, $rootscope) -> # If the user has not enough permissions we don't enable the sortable if project.my_permissions.indexOf("modify_us") > -1 $el.sortable({ + items: ".us-item-row", dropOnEmpty: true }) From a217ed6445d44b52335d46100f5aac3723a6fcdc Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 15 Oct 2015 14:18:44 +0200 Subject: [PATCH 25/26] Removing doomline when necesary --- app/coffee/modules/backlog/main.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/coffee/modules/backlog/main.coffee b/app/coffee/modules/backlog/main.coffee index 0a17ad90..115cdaab 100644 --- a/app/coffee/modules/backlog/main.coffee +++ b/app/coffee/modules/backlog/main.coffee @@ -581,7 +581,7 @@ BacklogDirective = ($repo, $rootscope, $translate) -> linkDoomLine = ($scope, $el, $attrs, $ctrl) -> reloadDoomLine = -> - if $scope.stats? + if $scope.stats? and $scope.stats.total_points? and $scope.stats.total_points != 0 removeDoomlineDom() stats = $scope.stats From 87ace91aa33df6a1cc00d168dab23d4753b6da59 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 15 Oct 2015 14:58:22 +0200 Subject: [PATCH 26/26] Fixing lightboxes on taskboard tasks --- app/partials/includes/modules/taskboard-table.jade | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/partials/includes/modules/taskboard-table.jade b/app/partials/includes/modules/taskboard-table.jade index 37a5fcc5..de30e250 100644 --- a/app/partials/includes/modules/taskboard-table.jade +++ b/app/partials/includes/modules/taskboard-table.jade @@ -24,18 +24,17 @@ div.taskboard-table(tg-taskboard-squish-column) span(ng-bind="us.total_points") span(translate="TASKBOARD.TABLE.FIELD_POINTS") include ../components/addnewtask - + div.taskboard-tasks-box.task-column(ng-repeat="st in taskStatusList track by st.id", tg-taskboard-sortable, class="squish-status-{{st.id}}", ng-class="{'column-fold':statusesFolded[st.id]}", tg-bind-scope) div.taskboard-task( ng-repeat="task in usTasks[us.id][st.id] track by task.id" - tg-taskboard-task tg-bind-scope tg-class-permission="{'readonly': '!modify_task'}" ng-class="{'card-placeholder': task.isPlaceholder}" ) - div(ng-if="!task.isPlaceholder") + div(ng-if="!task.isPlaceholder", tg-taskboard-task) include ../components/taskboard-task - + div(ng-if="task.isPlaceholder") - var card = 'task' include ../../common/components/taskboard-placeholder @@ -57,6 +56,6 @@ div.taskboard-table(tg-taskboard-squish-column) ) div(ng-if="!task.isPlaceholder") include ../components/taskboard-task - + div(ng-if="task.isPlaceholder") include ../../common/components/taskboard-placeholder