Adding admin for issue types, priority and severity

stable
Alejandro Alonso 2014-07-23 12:41:02 +02:00
parent 64f80cf4ab
commit 88ae4e7122
17 changed files with 210 additions and 81 deletions

View File

@ -69,6 +69,16 @@ configure = ($routeProvider, $locationProvider, $httpProvider, $provide) ->
$routeProvider.when("/project/:pslug/admin/project-values/issue-status", $routeProvider.when("/project/:pslug/admin/project-values/issue-status",
{templateUrl: "/partials/admin-project-values-issue-status.html"}) {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", $routeProvider.when("/project/:pslug/admin/memberships",
{templateUrl: "/partials/admin-memberships.html"}) {templateUrl: "/partials/admin-memberships.html"})
# Auth # Auth

View File

@ -31,10 +31,10 @@ bindOnce = @.taiga.bindOnce
module = angular.module("taigaAdmin") 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 = [ @.$inject = [
"$scope", "$scope",
"$rootScope", "$rootScope",
@ -53,18 +53,17 @@ class ProjectValuesStatusController extends mixOf(taiga.Controller, taiga.PageMi
promise.then null, -> promise.then null, ->
console.log "FAIL" #TODO console.log "FAIL" #TODO
@scope.$on("admin:project-values:status:move", @.moveStatus) @scope.$on("admin:project-values:move", @.moveValue)
loadProject: -> loadProject: ->
return @rs.projects.get(@scope.projectId).then (project) => return @rs.projects.get(@scope.projectId).then (project) =>
@scope.project = project @scope.project = project
return project return project
loadStatus: => loadValues: =>
#TODO: return @rs[@scope.resource].listValues(@scope.projectId, @scope.type).then (values) =>
return @rs[@scope.resource].listStatuses(@scope.projectId).then (statuses) => @scope.values = values
@scope.statuses = statuses @scope.maxValueOrder = _.max(values, "order").order
@scope.maxStatusOrder = _.max(statuses, "order").order
loadInitialData: -> loadInitialData: ->
promise = @repo.resolve({pslug: @params.pslug}).then (data) => 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([ return promise.then( => @q.all([
@.loadProject(), @.loadProject(),
@.loadStatus(), @.loadValues(),
])) ]))
moveStatus: (ctx, itemStatus, itemIndex) => moveValue: (ctx, itemValue, itemIndex) =>
statuses = @scope.statuses values = @scope.values
r = statuses.indexOf(itemStatus) r = values.indexOf(itemValue)
statuses.splice(r, 1) values.splice(r, 1)
statuses.splice(itemIndex, 0, itemStatus) values.splice(itemIndex, 0, itemValue)
_.each statuses, (usStatus, index) -> _.each values, (value, index) ->
usStatus.order = 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 ## Drag & Drop Link
@ -121,28 +120,28 @@ ProjectStatusDirective = ($log, $repo, $confirm, $location) ->
tdom.on "sortstop", (event, ui) -> tdom.on "sortstop", (event, ui) ->
parentEl = ui.item.parent() parentEl = ui.item.parent()
itemEl = ui.item itemEl = ui.item
itemStatus = itemEl.scope().status itemValue = itemEl.scope().value
itemIndex = itemEl.index() itemIndex = itemEl.index()
$scope.$broadcast("admin:project-values:status:move", itemStatus, itemIndex) $scope.$broadcast("admin:project-values:move", itemValue, itemIndex)
$scope.$on "$destroy", -> $scope.$on "$destroy", ->
$el.off() $el.off()
######################### #########################
## Status Link ## Value Link
######################### #########################
linkStatus = ($scope, $el, $attrs) -> linkValue = ($scope, $el, $attrs) ->
$ctrl = $el.controller() $ctrl = $el.controller()
statusType = $attrs.type valueType = $attrs.type
initializeNewStatus = -> initializeNewValue = ->
$scope.newStatus = { $scope.newValue = {
"name": "" "name": ""
"is_closed": false "is_closed": false
} }
initializeNewStatus() initializeNewValue()
submit = => submit = =>
promise = $repo.save($scope.project) promise = $repo.save($scope.project)
promise.then -> promise.then ->
@ -162,30 +161,30 @@ ProjectStatusDirective = ($log, $repo, $confirm, $location) ->
$el.on "click", ".show-add-new", (event) -> $el.on "click", ".show-add-new", (event) ->
event.preventDefault() event.preventDefault()
$el.find(".new-status").css('display': 'flex') $el.find(".new-value").css('display': 'flex')
$el.on "click", ".add-new", (event) -> $el.on "click", ".add-new", (event) ->
event.preventDefault() event.preventDefault()
form = $el.find(".new-status").parents("form").checksley() form = $el.find(".new-value").parents("form").checksley()
return if not form.validate() return if not form.validate()
$scope.newStatus.project = $scope.project.id $scope.newValue.project = $scope.project.id
$scope.newStatus.order = $scope.maxStatusOrder + 1 $scope.newValue.order = $scope.maxValueOrder + 1
promise = $repo.create(statusType, $scope.newStatus) promise = $repo.create(valueType, $scope.newValue)
promise.then => promise.then =>
$ctrl.loadStatus() $ctrl.loadValues()
$el.find(".new-status").hide() $el.find(".new-value").hide()
initializeNewStatus() initializeNewValue()
promise.then null, (data) -> promise.then null, (data) ->
form.setErrors(data) form.setErrors(data)
$el.on "click", ".delete-new", (event) -> $el.on "click", ".delete-new", (event) ->
event.preventDefault() event.preventDefault()
$el.find(".new-status").hide() $el.find(".new-value").hide()
initializeNewStatus() initializeNewValue()
$el.on "click", ".edit-status", (event) -> $el.on "click", ".edit-value", (event) ->
event.preventDefault() event.preventDefault()
target = angular.element(event.currentTarget) target = angular.element(event.currentTarget)
@ -199,8 +198,8 @@ ProjectStatusDirective = ($log, $repo, $confirm, $location) ->
form = target.parents("form").checksley() form = target.parents("form").checksley()
return if not form.validate() return if not form.validate()
status = target.scope().status value = target.scope().value
promise = $repo.save(status) promise = $repo.save(value)
promise.then => promise.then =>
row = target.parents(".row.table-main") row = target.parents(".row.table-main")
row.hide() row.hide()
@ -216,28 +215,28 @@ ProjectStatusDirective = ($log, $repo, $confirm, $location) ->
row.hide() row.hide()
row.siblings(".visualization").css("display": "flex") row.siblings(".visualization").css("display": "flex")
$el.on "click", ".delete-status", (event) -> $el.on "click", ".delete-value", (event) ->
event.preventDefault() event.preventDefault()
target = angular.element(event.currentTarget) target = angular.element(event.currentTarget)
status = target.scope().status value = target.scope().value
#TODO: i18n #TODO: i18n
title = "Delete status" title = "Delete"
subtitle = status.name subtitle = value.name
$confirm.ask(title, subtitle).then => $confirm.ask(title, subtitle).then =>
$repo.remove(status).then => $repo.remove(value).then =>
$ctrl.loadStatus() $ctrl.loadValues()
link = ($scope, $el, $attrs) -> link = ($scope, $el, $attrs) ->
linkDragAndDrop($scope, $el, $attrs) linkDragAndDrop($scope, $el, $attrs)
linkStatus($scope, $el, $attrs) linkValue($scope, $el, $attrs)
$scope.$on "$destroy", -> $scope.$on "$destroy", ->
$el.off() $el.off()
return {link:link} return {link:link}
module.directive("tgProjectStatus", ["$log", "$tgRepo", "$tgConfirm", "$tgLocation", ProjectStatusDirective]) module.directive("tgProjectValues", ["$log", "$tgRepo", "$tgConfirm", "$tgLocation", ProjectValuesDirective])
############################################################################# #############################################################################

View File

@ -76,6 +76,9 @@ urls = {
"project-admin-project-values-us-status": "/project/:project/admin/project-values/us-status", "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-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-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" "project-admin-memberships": "/project/:project/admin/memberships"
} }

View File

@ -71,6 +71,9 @@ urls = {
"userstory-statuses": "/api/v1/userstory-statuses" "userstory-statuses": "/api/v1/userstory-statuses"
"task-statuses": "/api/v1/task-statuses" "task-statuses": "/api/v1/task-statuses"
"issue-statuses": "/api/v1/issue-statuses" "issue-statuses": "/api/v1/issue-statuses"
"issue-types": "/api/v1/issue-types"
"priorities": "/api/v1/priorities"
"severities": "/api/v1/severities"
# History # History
"history/userstory": "/api/v1/history/userstory" "history/userstory": "/api/v1/history/userstory"

View File

@ -42,9 +42,9 @@ resourceProvider = ($repo) ->
service.history = (issueId) -> service.history = (issueId) ->
return $repo.queryOneRaw("history/issue", issueId) return $repo.queryOneRaw("history/issue", issueId)
service.listStatuses = (projectId) -> service.listValues = (projectId, type) ->
params = {"project": projectId} params = {"project": projectId}
return $repo.queryMany("issue-statuses", params) return $repo.queryMany(type, params)
return (instance) -> return (instance) ->
instance.issues = service instance.issues = service

View File

@ -43,9 +43,9 @@ resourceProvider = ($repo, $http, $urls) ->
service.history = (taskId) -> service.history = (taskId) ->
return $repo.queryOneRaw("history/task", taskId) return $repo.queryOneRaw("history/task", taskId)
service.listStatuses = (projectId) -> service.listValues = (projectId, type) ->
params = {"project": projectId} params = {"project": projectId}
return $repo.queryMany("task-statuses", params) return $repo.queryMany(type, params)
return (instance) -> return (instance) ->
instance.tasks = service instance.tasks = service

View File

@ -44,9 +44,9 @@ resourceProvider = ($repo, $http, $urls) ->
service.history = (usId) -> service.history = (usId) ->
return $repo.queryOneRaw("history/userstory", usId) return $repo.queryOneRaw("history/userstory", usId)
service.listStatuses = (projectId) -> service.listValues = (projectId, type) ->
params = {"project": projectId} params = {"project": projectId}
return $repo.queryMany("userstory-statuses", params) return $repo.queryMany(type, params)
return (instance) -> return (instance) ->
instance.userstories = service instance.userstories = service

View File

@ -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

View File

@ -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

View File

@ -4,8 +4,8 @@ block head
title Taiga Project management web application with scrum in mind! title Taiga Project management web application with scrum in mind!
block content block content
div.wrapper(tg-project-status, ng-controller="ProjectValuesStatusController as ctrl", div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl",
ng-init="section='admin'; resource='issues'; sectionName='Issue Statuses'", ng-init="section='admin'; resource='issues'; type='issue-statuses'; sectionName='Issue Statuses'",
type="issue-statuses") type="issue-statuses")
sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values") sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
include views/modules/admin-menu include views/modules/admin-menu

View File

@ -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

View File

@ -4,8 +4,8 @@ block head
title Taiga Project management web application with scrum in mind! title Taiga Project management web application with scrum in mind!
block content block content
div.wrapper(tg-project-status, ng-controller="ProjectValuesStatusController as ctrl", div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl",
ng-init="section='admin'; resource='tasks'; sectionName='Task Statuses'", ng-init="section='admin'; resource='tasks'; type='task-statuses'; sectionName='Task Statuses'",
type="task-statuses") type="task-statuses")
sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values") sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
include views/modules/admin-menu include views/modules/admin-menu

View File

@ -4,8 +4,8 @@ block head
title Taiga Project management web application with scrum in mind! title Taiga Project management web application with scrum in mind!
block content block content
div.wrapper(tg-project-status, ng-controller="ProjectValuesStatusController as ctrl", div.wrapper(tg-project-values, ng-controller="ProjectValuesController as ctrl",
ng-init="section='admin'; resource='userstories'; sectionName='Us Statuses'", ng-init="section='admin'; resource='userstories'; type='userstory-statuses'; sectionName='Us Statuses'",
type="userstory-statuses") type="userstory-statuses")
sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values") sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values")
include views/modules/admin-menu include views/modules/admin-menu

View File

@ -30,11 +30,11 @@ section.admin-submenu
span.icon.icon-arrow-right span.icon.icon-arrow-right
li#adminmenu-values-priorities 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.title Issue Priorities
span.icon.icon-arrow-right span.icon.icon-arrow-right
li#adminmenu-values-severities 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.title Issue Severities
span.icon.icon-arrow-right span.icon.icon-arrow-right

View File

@ -8,42 +8,42 @@ section.colors-table
div.table-main div.table-main
form.sortable form.sortable
div(ng-repeat="status in statuses") div(ng-repeat="value in values")
div.row.table-main.visualization div.row.table-main.visualization
span.icon.icon-drag-v span.icon.icon-drag-v
div.color-column div.color-column
div.current-color(style="background: {{ status.color }}") div.current-color(style="background: {{ value.color }}")
div.status-name div.status-name
span {{ status.name }} span {{ value.name }}
div.is-closed-column 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 div.options-column
a.edit-status.icon.icon-edit(href="", title="Edit value") a.edit-value.icon.icon-edit(href="", title="Edit value")
a.delete-status.icon.icon-delete(href="", title="Delete value") a.delete-value.icon.icon-delete(href="", title="Delete value")
div.row.table-main.edition.hidden div.row.table-main.edition.hidden
div.color-column(tg-color-selection, ng-model="status") div.color-column(tg-color-selection, ng-model="value")
div.current-color(style="background: {{ status.color }}") div.current-color(style="background: {{ value.color }}")
include ../../components/select-color include ../../components/select-color
div.status-name 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 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 div.options-column
a.save.icon.icon-floppy(href="", title="Add") a.save.icon.icon-floppy(href="", title="Add")
a.cancel.icon.icon-delete(href="", title="Delete") a.cancel.icon.icon-delete(href="", title="Delete")
form form
div.row.table-main.new-status.hidden div.row.table-main.new-value.hidden
div.color-column(tg-color-selection, ng-model="newStatus") div.color-column(tg-color-selection, ng-model="newValue")
div.current-color(style="background: {{ newStatus.color }}") div.current-color(style="background: {{ newValue.color }}")
include ../../components/select-color include ../../components/select-color
div.status-name 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 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 div.options-column
a.add-new.icon.icon-floppy(href="", title="Add") a.add-new.icon.icon-floppy(href="", title="Add")
a.delete-new.icon.icon-delete(href="", title="Delete") a.delete-new.icon.icon-delete(href="", title="Delete")

View File

@ -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")

View File

@ -20,7 +20,7 @@
} }
} }
&.edition, &.edition,
&.new-status { &.new-value {
padding-left: 50px; padding-left: 50px;
} }
&.hidden { &.hidden {