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",
{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

View File

@ -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])
#############################################################################

View File

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

View File

@ -71,6 +71,9 @@ 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"

View File

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

View File

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

View File

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

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

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

View File

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

View File

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

View File

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

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,
&.new-status {
&.new-value {
padding-left: 50px;
}
&.hidden {