From 88ae4e7122f5a05acb5a4724c4bd8fb12d2b49a5 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Wed, 23 Jul 2014 12:41:02 +0200 Subject: [PATCH] Adding admin for issue types, priority and severity --- app/coffee/app.coffee | 10 ++ .../modules/admin/project-values.coffee | 99 +++++++++---------- app/coffee/modules/base.coffee | 3 + app/coffee/modules/resources.coffee | 5 +- app/coffee/modules/resources/issues.coffee | 4 +- app/coffee/modules/resources/tasks.coffee | 4 +- .../modules/resources/userstories.coffee | 4 +- ...admin-project-values-issue-priorities.jade | 24 +++++ ...admin-project-values-issue-severities.jade | 24 +++++ .../admin-project-values-issue-status.jade | 4 +- .../admin-project-values-issue-types.jade | 24 +++++ .../admin-project-values-task-status.jade | 4 +- .../admin-project-values-us-status.jade | 4 +- .../modules/admin-submenu-project-values.jade | 4 +- .../views/modules/admin/project-status.jade | 30 +++--- .../views/modules/admin/project-types.jade | 42 ++++++++ app/styles/modules/common/colors-table.scss | 2 +- 17 files changed, 210 insertions(+), 81 deletions(-) create mode 100644 app/partials/admin-project-values-issue-priorities.jade create mode 100644 app/partials/admin-project-values-issue-severities.jade create mode 100644 app/partials/admin-project-values-issue-types.jade create mode 100644 app/partials/views/modules/admin/project-types.jade diff --git a/app/coffee/app.coffee b/app/coffee/app.coffee index e980d456..822655f4 100644 --- a/app/coffee/app.coffee +++ b/app/coffee/app.coffee @@ -69,6 +69,16 @@ configure = ($routeProvider, $locationProvider, $httpProvider, $provide) -> $routeProvider.when("/project/:pslug/admin/project-values/issue-status", {templateUrl: "/partials/admin-project-values-issue-status.html"}) + $routeProvider.when("/project/:pslug/admin/project-values/issue-types", + {templateUrl: "/partials/admin-project-values-issue-types.html"}) + + $routeProvider.when("/project/:pslug/admin/project-values/issue-priorities", + {templateUrl: "/partials/admin-project-values-issue-priorities.html"}) + + $routeProvider.when("/project/:pslug/admin/project-values/issue-severities", + {templateUrl: "/partials/admin-project-values-issue-severities.html"}) + + $routeProvider.when("/project/:pslug/admin/memberships", {templateUrl: "/partials/admin-memberships.html"}) # Auth diff --git a/app/coffee/modules/admin/project-values.coffee b/app/coffee/modules/admin/project-values.coffee index 1e497c9d..a7023f28 100644 --- a/app/coffee/modules/admin/project-values.coffee +++ b/app/coffee/modules/admin/project-values.coffee @@ -31,10 +31,10 @@ bindOnce = @.taiga.bindOnce module = angular.module("taigaAdmin") ############################################################################# -## Project values status Controller +## Project values Controller ############################################################################# -class ProjectValuesStatusController extends mixOf(taiga.Controller, taiga.PageMixin) +class ProjectValuesController extends mixOf(taiga.Controller, taiga.PageMixin) @.$inject = [ "$scope", "$rootScope", @@ -53,18 +53,17 @@ class ProjectValuesStatusController extends mixOf(taiga.Controller, taiga.PageMi promise.then null, -> console.log "FAIL" #TODO - @scope.$on("admin:project-values:status:move", @.moveStatus) + @scope.$on("admin:project-values:move", @.moveValue) loadProject: -> return @rs.projects.get(@scope.projectId).then (project) => @scope.project = project return project - loadStatus: => - #TODO: - return @rs[@scope.resource].listStatuses(@scope.projectId).then (statuses) => - @scope.statuses = statuses - @scope.maxStatusOrder = _.max(statuses, "order").order + loadValues: => + return @rs[@scope.resource].listValues(@scope.projectId, @scope.type).then (values) => + @scope.values = values + @scope.maxValueOrder = _.max(values, "order").order loadInitialData: -> promise = @repo.resolve({pslug: @params.pslug}).then (data) => @@ -73,26 +72,26 @@ class ProjectValuesStatusController extends mixOf(taiga.Controller, taiga.PageMi return promise.then( => @q.all([ @.loadProject(), - @.loadStatus(), + @.loadValues(), ])) - moveStatus: (ctx, itemStatus, itemIndex) => - statuses = @scope.statuses - r = statuses.indexOf(itemStatus) - statuses.splice(r, 1) - statuses.splice(itemIndex, 0, itemStatus) - _.each statuses, (usStatus, index) -> - usStatus.order = index + moveValue: (ctx, itemValue, itemIndex) => + values = @scope.values + r = values.indexOf(itemValue) + values.splice(r, 1) + values.splice(itemIndex, 0, itemValue) + _.each values, (value, index) -> + value.order = index - @repo.saveAll(statuses) + @repo.saveAll(values) -module.controller("ProjectValuesStatusController", ProjectValuesStatusController) +module.controller("ProjectValuesController", ProjectValuesController) ############################################################################# -## Project values status directive +## Project values directive ############################################################################# -ProjectStatusDirective = ($log, $repo, $confirm, $location) -> +ProjectValuesDirective = ($log, $repo, $confirm, $location) -> ######################### ## Drag & Drop Link @@ -121,28 +120,28 @@ ProjectStatusDirective = ($log, $repo, $confirm, $location) -> tdom.on "sortstop", (event, ui) -> parentEl = ui.item.parent() itemEl = ui.item - itemStatus = itemEl.scope().status + itemValue = itemEl.scope().value itemIndex = itemEl.index() - $scope.$broadcast("admin:project-values:status:move", itemStatus, itemIndex) + $scope.$broadcast("admin:project-values:move", itemValue, itemIndex) $scope.$on "$destroy", -> $el.off() ######################### - ## Status Link + ## Value Link ######################### - linkStatus = ($scope, $el, $attrs) -> + linkValue = ($scope, $el, $attrs) -> $ctrl = $el.controller() - statusType = $attrs.type + valueType = $attrs.type - initializeNewStatus = -> - $scope.newStatus = { + initializeNewValue = -> + $scope.newValue = { "name": "" "is_closed": false } - initializeNewStatus() + initializeNewValue() submit = => promise = $repo.save($scope.project) promise.then -> @@ -162,30 +161,30 @@ ProjectStatusDirective = ($log, $repo, $confirm, $location) -> $el.on "click", ".show-add-new", (event) -> event.preventDefault() - $el.find(".new-status").css('display': 'flex') + $el.find(".new-value").css('display': 'flex') $el.on "click", ".add-new", (event) -> event.preventDefault() - form = $el.find(".new-status").parents("form").checksley() + form = $el.find(".new-value").parents("form").checksley() return if not form.validate() - $scope.newStatus.project = $scope.project.id - $scope.newStatus.order = $scope.maxStatusOrder + 1 - promise = $repo.create(statusType, $scope.newStatus) + $scope.newValue.project = $scope.project.id + $scope.newValue.order = $scope.maxValueOrder + 1 + promise = $repo.create(valueType, $scope.newValue) promise.then => - $ctrl.loadStatus() - $el.find(".new-status").hide() - initializeNewStatus() + $ctrl.loadValues() + $el.find(".new-value").hide() + initializeNewValue() promise.then null, (data) -> form.setErrors(data) $el.on "click", ".delete-new", (event) -> event.preventDefault() - $el.find(".new-status").hide() - initializeNewStatus() + $el.find(".new-value").hide() + initializeNewValue() - $el.on "click", ".edit-status", (event) -> + $el.on "click", ".edit-value", (event) -> event.preventDefault() target = angular.element(event.currentTarget) @@ -199,8 +198,8 @@ ProjectStatusDirective = ($log, $repo, $confirm, $location) -> form = target.parents("form").checksley() return if not form.validate() - status = target.scope().status - promise = $repo.save(status) + value = target.scope().value + promise = $repo.save(value) promise.then => row = target.parents(".row.table-main") row.hide() @@ -216,28 +215,28 @@ ProjectStatusDirective = ($log, $repo, $confirm, $location) -> row.hide() row.siblings(".visualization").css("display": "flex") - $el.on "click", ".delete-status", (event) -> + $el.on "click", ".delete-value", (event) -> event.preventDefault() target = angular.element(event.currentTarget) - status = target.scope().status + value = target.scope().value #TODO: i18n - title = "Delete status" - subtitle = status.name + title = "Delete" + subtitle = value.name $confirm.ask(title, subtitle).then => - $repo.remove(status).then => - $ctrl.loadStatus() + $repo.remove(value).then => + $ctrl.loadValues() link = ($scope, $el, $attrs) -> linkDragAndDrop($scope, $el, $attrs) - linkStatus($scope, $el, $attrs) + linkValue($scope, $el, $attrs) $scope.$on "$destroy", -> $el.off() return {link:link} -module.directive("tgProjectStatus", ["$log", "$tgRepo", "$tgConfirm", "$tgLocation", ProjectStatusDirective]) +module.directive("tgProjectValues", ["$log", "$tgRepo", "$tgConfirm", "$tgLocation", ProjectValuesDirective]) ############################################################################# @@ -277,7 +276,7 @@ ColorSelectionDirective = () -> $el.on "click", ".select-color .selected-color", (event) -> event.preventDefault() - $el.find(".select-color").hide() + $el.find(".select-color").hide() $scope.$on "$destroy", -> $el.off() diff --git a/app/coffee/modules/base.coffee b/app/coffee/modules/base.coffee index c54cfd1a..f901e7ca 100644 --- a/app/coffee/modules/base.coffee +++ b/app/coffee/modules/base.coffee @@ -76,6 +76,9 @@ urls = { "project-admin-project-values-us-status": "/project/:project/admin/project-values/us-status", "project-admin-project-values-task-status": "/project/:project/admin/project-values/task-status", "project-admin-project-values-issue-status": "/project/:project/admin/project-values/issue-status", + "project-admin-project-values-issue-types": "/project/:project/admin/project-values/issue-types", + "project-admin-project-values-issue-priorities": "/project/:project/admin/project-values/issue-priorities", + "project-admin-project-values-issue-severities": "/project/:project/admin/project-values/issue-severities", "project-admin-memberships": "/project/:project/admin/memberships" } diff --git a/app/coffee/modules/resources.coffee b/app/coffee/modules/resources.coffee index 06fa6033..8987b380 100644 --- a/app/coffee/modules/resources.coffee +++ b/app/coffee/modules/resources.coffee @@ -71,7 +71,10 @@ urls = { "userstory-statuses": "/api/v1/userstory-statuses" "task-statuses": "/api/v1/task-statuses" "issue-statuses": "/api/v1/issue-statuses" - + "issue-types": "/api/v1/issue-types" + "priorities": "/api/v1/priorities" + "severities": "/api/v1/severities" + # History "history/userstory": "/api/v1/history/userstory" "history/issue": "/api/v1/history/issue" diff --git a/app/coffee/modules/resources/issues.coffee b/app/coffee/modules/resources/issues.coffee index dad48648..381154a0 100644 --- a/app/coffee/modules/resources/issues.coffee +++ b/app/coffee/modules/resources/issues.coffee @@ -42,9 +42,9 @@ resourceProvider = ($repo) -> service.history = (issueId) -> return $repo.queryOneRaw("history/issue", issueId) - service.listStatuses = (projectId) -> + service.listValues = (projectId, type) -> params = {"project": projectId} - return $repo.queryMany("issue-statuses", params) + return $repo.queryMany(type, params) return (instance) -> instance.issues = service diff --git a/app/coffee/modules/resources/tasks.coffee b/app/coffee/modules/resources/tasks.coffee index cd3bdb37..62bca542 100644 --- a/app/coffee/modules/resources/tasks.coffee +++ b/app/coffee/modules/resources/tasks.coffee @@ -43,9 +43,9 @@ resourceProvider = ($repo, $http, $urls) -> service.history = (taskId) -> return $repo.queryOneRaw("history/task", taskId) - service.listStatuses = (projectId) -> + service.listValues = (projectId, type) -> params = {"project": projectId} - return $repo.queryMany("task-statuses", params) + return $repo.queryMany(type, params) return (instance) -> instance.tasks = service diff --git a/app/coffee/modules/resources/userstories.coffee b/app/coffee/modules/resources/userstories.coffee index 9f272965..1f51264f 100644 --- a/app/coffee/modules/resources/userstories.coffee +++ b/app/coffee/modules/resources/userstories.coffee @@ -44,9 +44,9 @@ resourceProvider = ($repo, $http, $urls) -> service.history = (usId) -> return $repo.queryOneRaw("history/userstory", usId) - service.listStatuses = (projectId) -> + service.listValues = (projectId, type) -> params = {"project": projectId} - return $repo.queryMany("userstory-statuses", params) + return $repo.queryMany(type, params) return (instance) -> instance.userstories = service diff --git a/app/partials/admin-project-values-issue-priorities.jade b/app/partials/admin-project-values-issue-priorities.jade new file mode 100644 index 00000000..ef663165 --- /dev/null +++ b/app/partials/admin-project-values-issue-priorities.jade @@ -0,0 +1,24 @@ +extends layout + +block head + title Taiga Project management web application with scrum in mind! + +block content + div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl", + ng-init="section='admin'; resource='issues'; type='priorities'; sectionName='Issue Priorities'", + type="priorities") + sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values") + include views/modules/admin-menu + + sidebar.menu-tertiary.sidebar(tg-admin-navigation="values-priorities") + include views/modules/admin-submenu-project-values + + section.main.admin-roles + header + include views/components/mainTitle + + div.project-values-options + a.button.button-green.show-add-new(href="", title="Add New") + span Add new type + + include views/modules/admin/project-types diff --git a/app/partials/admin-project-values-issue-severities.jade b/app/partials/admin-project-values-issue-severities.jade new file mode 100644 index 00000000..3c676f24 --- /dev/null +++ b/app/partials/admin-project-values-issue-severities.jade @@ -0,0 +1,24 @@ +extends layout + +block head + title Taiga Project management web application with scrum in mind! + +block content + div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl", + ng-init="section='admin'; resource='issues'; type='severities'; sectionName='Issue severities'", + type="priorities") + sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values") + include views/modules/admin-menu + + sidebar.menu-tertiary.sidebar(tg-admin-navigation="values-severities") + include views/modules/admin-submenu-project-values + + section.main.admin-roles + header + include views/components/mainTitle + + div.project-values-options + a.button.button-green.show-add-new(href="", title="Add New") + span Add new type + + include views/modules/admin/project-types diff --git a/app/partials/admin-project-values-issue-status.jade b/app/partials/admin-project-values-issue-status.jade index 627717ad..584b8dbc 100644 --- a/app/partials/admin-project-values-issue-status.jade +++ b/app/partials/admin-project-values-issue-status.jade @@ -4,8 +4,8 @@ block head title Taiga Project management web application with scrum in mind! block content - div.wrapper(tg-project-status, ng-controller="ProjectValuesStatusController as ctrl", - ng-init="section='admin'; resource='issues'; sectionName='Issue Statuses'", + div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl", + ng-init="section='admin'; resource='issues'; type='issue-statuses'; sectionName='Issue Statuses'", type="issue-statuses") sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values") include views/modules/admin-menu diff --git a/app/partials/admin-project-values-issue-types.jade b/app/partials/admin-project-values-issue-types.jade new file mode 100644 index 00000000..2328a004 --- /dev/null +++ b/app/partials/admin-project-values-issue-types.jade @@ -0,0 +1,24 @@ +extends layout + +block head + title Taiga Project management web application with scrum in mind! + +block content + div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl", + ng-init="section='admin'; resource='issues'; type='issue-types'; sectionName='Issue Types'", + type="issue-types") + sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values") + include views/modules/admin-menu + + sidebar.menu-tertiary.sidebar(tg-admin-navigation="values-issue-types") + include views/modules/admin-submenu-project-values + + section.main.admin-roles + header + include views/components/mainTitle + + div.project-values-options + a.button.button-green.show-add-new(href="", title="Add New") + span Add new type + + include views/modules/admin/project-types diff --git a/app/partials/admin-project-values-task-status.jade b/app/partials/admin-project-values-task-status.jade index 6b4e8601..e18fa2a1 100644 --- a/app/partials/admin-project-values-task-status.jade +++ b/app/partials/admin-project-values-task-status.jade @@ -4,8 +4,8 @@ block head title Taiga Project management web application with scrum in mind! block content - div.wrapper(tg-project-status, ng-controller="ProjectValuesStatusController as ctrl", - ng-init="section='admin'; resource='tasks'; sectionName='Task Statuses'", + div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl", + ng-init="section='admin'; resource='tasks'; type='task-statuses'; sectionName='Task Statuses'", type="task-statuses") sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values") include views/modules/admin-menu diff --git a/app/partials/admin-project-values-us-status.jade b/app/partials/admin-project-values-us-status.jade index 31d13ceb..933c8a6c 100644 --- a/app/partials/admin-project-values-us-status.jade +++ b/app/partials/admin-project-values-us-status.jade @@ -4,8 +4,8 @@ block head title Taiga Project management web application with scrum in mind! block content - div.wrapper(tg-project-status, ng-controller="ProjectValuesStatusController as ctrl", - ng-init="section='admin'; resource='userstories'; sectionName='Us Statuses'", + div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl", + ng-init="section='admin'; resource='userstories'; type='userstory-statuses'; sectionName='Us Statuses'", type="userstory-statuses") sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values") include views/modules/admin-menu diff --git a/app/partials/views/modules/admin-submenu-project-values.jade b/app/partials/views/modules/admin-submenu-project-values.jade index e4bdf70f..05c890da 100644 --- a/app/partials/views/modules/admin-submenu-project-values.jade +++ b/app/partials/views/modules/admin-submenu-project-values.jade @@ -30,11 +30,11 @@ section.admin-submenu span.icon.icon-arrow-right li#adminmenu-values-priorities - a(href="", tg-nav="project-admin-project-values-priorities:project=project.slug") + a(href="", tg-nav="project-admin-project-values-issue-priorities:project=project.slug") span.title Issue Priorities span.icon.icon-arrow-right li#adminmenu-values-severities - a(href="", tg-nav="project-admin-project-values-severities:project=project.slug") + a(href="", tg-nav="project-admin-project-values-issue-severities:project=project.slug") span.title Issue Severities span.icon.icon-arrow-right diff --git a/app/partials/views/modules/admin/project-status.jade b/app/partials/views/modules/admin/project-status.jade index b2d9236b..88490982 100644 --- a/app/partials/views/modules/admin/project-status.jade +++ b/app/partials/views/modules/admin/project-status.jade @@ -8,42 +8,42 @@ section.colors-table div.table-main form.sortable - div(ng-repeat="status in statuses") + div(ng-repeat="value in values") div.row.table-main.visualization span.icon.icon-drag-v div.color-column - div.current-color(style="background: {{ status.color }}") + div.current-color(style="background: {{ value.color }}") div.status-name - span {{ status.name }} + span {{ value.name }} div.is-closed-column - div.icon.icon-check-square(ng-show="status.is_closed") + div.icon.icon-check-square(ng-show="value.is_closed") div.options-column - a.edit-status.icon.icon-edit(href="", title="Edit value") - a.delete-status.icon.icon-delete(href="", title="Delete value") + a.edit-value.icon.icon-edit(href="", title="Edit value") + a.delete-value.icon.icon-delete(href="", title="Delete value") div.row.table-main.edition.hidden - div.color-column(tg-color-selection, ng-model="status") - div.current-color(style="background: {{ status.color }}") + div.color-column(tg-color-selection, ng-model="value") + div.current-color(style="background: {{ value.color }}") include ../../components/select-color div.status-name - input(name="name", type="text", placeholder="Write a name for the new status", ng-model="status.name", data-required="true", data-maxlength="255") + input(name="name", type="text", placeholder="Write a name for the new status", ng-model="value.name", data-required="true", data-maxlength="255") div.is-closed-column - select(name="is_closed", ng-model="status.is_closed", ng-options="e.id as e.name for e in [{'id':true, 'name':'Yes'},{'id':false, 'name': 'No'}]", data-required="true") + select(name="is_closed", ng-model="value.is_closed", ng-options="e.id as e.name for e in [{'id':true, 'name':'Yes'},{'id':false, 'name': 'No'}]", data-required="true") div.options-column a.save.icon.icon-floppy(href="", title="Add") a.cancel.icon.icon-delete(href="", title="Delete") form - div.row.table-main.new-status.hidden - div.color-column(tg-color-selection, ng-model="newStatus") - div.current-color(style="background: {{ newStatus.color }}") + div.row.table-main.new-value.hidden + div.color-column(tg-color-selection, ng-model="newValue") + div.current-color(style="background: {{ newValue.color }}") include ../../components/select-color div.status-name - input(name="name", type="text", placeholder="Write a name for the new status", ng-model="newStatus.name", data-required="true", data-maxlength="255") + input(name="name", type="text", placeholder="Write a name for the new status", ng-model="newValue.name", data-required="true", data-maxlength="255") div.is-closed-column - select(name="is_closed", ng-model="newStatus.is_closed", ng-options="e.id as e.name for e in [{'id':true, 'name':'Yes'},{'id':false, 'name': 'No'}]", data-required="true") + select(name="is_closed", ng-model="newValue.is_closed", ng-options="e.id as e.name for e in [{'id':true, 'name':'Yes'},{'id':false, 'name': 'No'}]", data-required="true") div.options-column a.add-new.icon.icon-floppy(href="", title="Add") a.delete-new.icon.icon-delete(href="", title="Delete") diff --git a/app/partials/views/modules/admin/project-types.jade b/app/partials/views/modules/admin/project-types.jade new file mode 100644 index 00000000..b95d1293 --- /dev/null +++ b/app/partials/views/modules/admin/project-types.jade @@ -0,0 +1,42 @@ +section.colors-table + div.table-header + div.row + div.color-column Color + div.status-name Name + div.options-column + + div.table-main + form.sortable + div(ng-repeat="value in values") + div.row.table-main.visualization + span.icon.icon-drag-v + div.color-column + div.current-color(style="background: {{ value.color }}") + div.status-name + span {{ value.name }} + div.options-column + a.edit-value.icon.icon-edit(href="", title="Edit value") + a.delete-value.icon.icon-delete(href="", title="Delete value") + + div.row.table-main.edition.hidden + div.color-column(tg-color-selection, ng-model="value") + div.current-color(style="background: {{ value.color }}") + include ../../components/select-color + + div.status-name + input(name="name", type="text", placeholder="Write a name for the new status", ng-model="value.name", data-required="true", data-maxlength="255") + div.options-column + a.save.icon.icon-floppy(href="", title="Add") + a.cancel.icon.icon-delete(href="", title="Delete") + + form + div.row.table-main.new-value.hidden + div.color-column(tg-color-selection, ng-model="newValue") + div.current-color(style="background: {{ newValue.color }}") + include ../../components/select-color + + div.status-name + input(name="name", type="text", placeholder="Write a name for the new status", ng-model="newValue.name", data-required="true", data-maxlength="255") + div.options-column + a.add-new.icon.icon-floppy(href="", title="Add") + a.delete-new.icon.icon-delete(href="", title="Delete") diff --git a/app/styles/modules/common/colors-table.scss b/app/styles/modules/common/colors-table.scss index c9790527..ad55b3d3 100644 --- a/app/styles/modules/common/colors-table.scss +++ b/app/styles/modules/common/colors-table.scss @@ -20,7 +20,7 @@ } } &.edition, - &.new-status { + &.new-value { padding-left: 50px; } &.hidden {