diff --git a/app/coffee/app.coffee b/app/coffee/app.coffee index 6264c53a..aa62c61d 100644 --- a/app/coffee/app.coffee +++ b/app/coffee/app.coffee @@ -60,6 +60,9 @@ configure = ($routeProvider, $locationProvider, $httpProvider, $provide, $routeProvider.when("/project/:pslug/admin/project-profile/features", {templateUrl: "/partials/admin-project-features.html"}) + $routeProvider.when("/project/:pslug/admin/project-values/us-status", + {templateUrl: "/partials/admin-project-values-us-status.html"}) + # Auth $routeProvider.when("/login", {templateUrl: "/partials/login.html"}) $routeProvider.when("/register", {templateUrl: "/partials/register.html"}) diff --git a/app/coffee/modules/admin/project-values.coffee b/app/coffee/modules/admin/project-values.coffee new file mode 100644 index 00000000..5df4335c --- /dev/null +++ b/app/coffee/modules/admin/project-values.coffee @@ -0,0 +1,130 @@ +### +# Copyright (C) 2014 Andrey Antukh +# Copyright (C) 2014 Jesús Espino Garcia +# Copyright (C) 2014 David Barragán Merino +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# File: modules/admin/project-profile.coffee +### + +taiga = @.taiga + +mixOf = @.taiga.mixOf +trim = @.taiga.trim +toString = @.taiga.toString +joinStr = @.taiga.joinStr +groupBy = @.taiga.groupBy +bindOnce = @.taiga.bindOnce + +module = angular.module("taigaAdmin") + +############################################################################# +## Project Values Controller +############################################################################# + +class ProjectValuesController extends mixOf(taiga.Controller, taiga.PageMixin) + @.$inject = [ + "$scope", + "$rootScope", + "$tgRepo", + "$tgConfirm", + "$tgResources", + "$routeParams", + "$q", + "$location" + ] + + constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location) -> + @scope.project = {} + + promise = @.loadInitialData() + promise.then null, -> + console.log "FAIL" #TODO + + loadProject: -> + return @rs.projects.get(@scope.projectId).then (project) => + @scope.project = project + return project + + loadInitialData: -> + promise = @repo.resolve({pslug: @params.pslug}).then (data) => + @scope.projectId = data.project + return data + + return promise.then(=> @.loadProject()) + + +module.controller("ProjectValuesController", ProjectValuesController) + +############################################################################# +## Project US Values Directive +############################################################################# + +ProjectUsStatusDirective = ($log, $repo, $confirm, $location, $model) -> + link = ($scope, $el, $attrs) -> + $ctrl = $el.controller() + $scope.newUs = { + "name": "" + "is_closed": false + "project": $scope.project.id + } + + submit = => + promise = $repo.save($scope.project) + promise.then -> + $confirm.notify("success") + + promise.then null, (data) -> + console.log "FAIL" + # TODO + + $el.on "submit", "form", (event) -> + event.preventDefault() + submit() + + $el.on "click", "form a.button-green", (event) -> + event.preventDefault() + submit() + + $el.on "click", ".show-add-new", (event) -> + event.preventDefault() + $el.find(".new-us-status").css('display': 'flex') + + $el.on "click", ".add-new", (event) -> + event.preventDefault() + $scope.newUs.project = $scope.project.id + $repo.create("userstory-statuses", $scope.newUs).then => + console.log "LOAD" + $ctrl.loadProject() + + $el.on "click", ".delete-new", (event) -> + event.preventDefault() + $el.find(".new-us-status").hide() + + $el.on "click", ".delete-us-status", (event) -> + event.preventDefault() + target = angular.element(event.currentTarget) + status = $model.make_model("userstory-statuses", target.scope().status) + + #TODO: i18n + title = "Delete User Story status" + subtitle = status.name + $confirm.ask(title, subtitle).then => + $repo.remove(status).then => + $ctrl.loadProject() + + return {link:link} + +module.directive("tgProjectUsStatus", ["$log", "$tgRepo", "$tgConfirm", "$tgLocation", "$tgModel", ProjectUsStatusDirective]) diff --git a/app/coffee/modules/base.coffee b/app/coffee/modules/base.coffee index 84ae6033..e05a7a1f 100644 --- a/app/coffee/modules/base.coffee +++ b/app/coffee/modules/base.coffee @@ -70,6 +70,7 @@ urls = { "project-admin-project-profile-details": "/project/:project/admin/project-profile/details", "project-admin-project-profile-default-values": "/project/:project/admin/project-profile/default-values", "project-admin-project-profile-features": "/project/:project/admin/project-profile/features" + "project-admin-project-values-us-status": "/project/:project/admin/project-values/us-status" } init = ($log, $navurls) -> diff --git a/app/coffee/modules/common/filters.coffee b/app/coffee/modules/common/filters.coffee index 3481e798..b0f632dc 100644 --- a/app/coffee/modules/common/filters.coffee +++ b/app/coffee/modules/common/filters.coffee @@ -19,6 +19,7 @@ # File: modules/common/filters.coffee ### +module = angular.module("taigaCommon") defaultFilter = -> return (value, defaultValue) -> @@ -26,6 +27,14 @@ defaultFilter = -> return defaultValue return value -module = angular.module("taigaCommon") module.filter("default", defaultFilter) +yesNoFilter = -> + #TODO: i18n + return (value) -> + if value + return "Yes" + + return "No" + +module.filter("yesNo", yesNoFilter) diff --git a/app/coffee/modules/resources.coffee b/app/coffee/modules/resources.coffee index cda6e546..40ee8859 100644 --- a/app/coffee/modules/resources.coffee +++ b/app/coffee/modules/resources.coffee @@ -68,6 +68,7 @@ urls = { "users-change-password": "/api/v1/users/change_password" "resolver": "/api/v1/resolver" "wiki-attachment": "/media/attachment-files/%s/wikipage/%s" + "userstory-statuses": "/api/v1/userstory-statuses" # History "history/userstory": "/api/v1/history/userstory" diff --git a/app/partials/admin-project-values-us-status.jade b/app/partials/admin-project-values-us-status.jade new file mode 100644 index 00000000..af9b48e9 --- /dev/null +++ b/app/partials/admin-project-values-us-status.jade @@ -0,0 +1,23 @@ +extends layout + +block head + title Taiga Project management web application with scrum in mind! + +block content + div.wrapper(tg-project-us-status, ng-controller="ProjectValuesController as ctrl", + ng-init="section='admin'") + sidebar.menu-secondary.sidebar(tg-admin-navigation="project-values") + include views/modules/admin-menu + + sidebar.menu-tertiary.sidebar(tg-admin-navigation="values-us-status") + 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 status + + include views/modules/admin/project-us-status diff --git a/app/partials/admin-project-values.jade b/app/partials/admin-project-values.jade deleted file mode 100644 index a397f2d4..00000000 --- a/app/partials/admin-project-values.jade +++ /dev/null @@ -1,21 +0,0 @@ -extends layout - -block head - title Taiga Project management web application with scrum in mind! - -block content - div.wrapper - sidebar.menu-secondary.sidebar - include views/modules/admin-menu - sidebar.menu-tertiary.sidebar - include views/modules/admin-submenu - - section.main.admin-roles - header - include views/components/mainTitle - - div.project-values-options - a.button.button-green(href="", title="Add New") - span Add new status - - include views/modules/admin/project-values diff --git a/app/partials/views/modules/admin-menu.jade b/app/partials/views/modules/admin-menu.jade index 22f6461b..e8e35106 100644 --- a/app/partials/views/modules/admin-menu.jade +++ b/app/partials/views/modules/admin-menu.jade @@ -16,11 +16,7 @@ section.admin-menu a(href="") span.title Roles span.icon.icon-arrow-right - li#adminmenu-sprints - a(href="") - span.title Sprints - span.icon.icon-arrow-right li#adminmenu-project-values - a(href="") + a(href="", tg-nav="project-admin-project-values-us-status:project=project.slug") span.title Project values span.icon.icon-arrow-right diff --git a/app/partials/views/modules/admin-submenu-project-values.jade b/app/partials/views/modules/admin-submenu-project-values.jade new file mode 100644 index 00000000..2e55256b --- /dev/null +++ b/app/partials/views/modules/admin-submenu-project-values.jade @@ -0,0 +1,41 @@ +section.admin-submenu + header + h1 P... Values + + nav + ul + li#adminmenu-values-us-status + a(href="", tg-nav="project-admin-project-values-us-status:project=project.slug") + span.title US statuses + span.icon.icon-arrow-right + + li#adminmenu-values-us-points + a(href="", tg-nav="project-admin-project-values-us-points:project=project.slug") + span.title US points + span.icon.icon-arrow-right + + li#adminmenu-values-task-status + a(href="", tg-nav="project-admin-project-values-task-status:project=project.slug") + span.title Task statuses + span.icon.icon-arrow-right + + + li#adminmenu-values-issue-status + a(href="", tg-nav="project-admin-project-values-issue-status:project=project.slug") + span.title Issue statuses + span.icon.icon-arrow-right + + li#adminmenu-values-issue-types + a(href="", tg-nav="project-admin-project-values-issue-types:project=project.slug") + span.title Issue types + span.icon.icon-arrow-right + + li#adminmenu-values-priorities + a(href="", tg-nav="project-admin-project-values-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") + span.title Issue Severities + span.icon.icon-arrow-right diff --git a/app/partials/views/modules/admin/project-us-status.jade b/app/partials/views/modules/admin/project-us-status.jade new file mode 100644 index 00000000..14d07648 --- /dev/null +++ b/app/partials/views/modules/admin/project-us-status.jade @@ -0,0 +1,29 @@ +section.project-values-table + div.project-values-header + div.project-values-row + div.project-values-name + span Name + div.project-values-isclosed + span Is closed? + div.project-values-settings + + div.project-values-body + div.project-values-row(ng-repeat="status in project.us_statuses") + div.project-values-name + span {{ status.name }} + div.project-values-isclosed + span {{ status.is_closed|yesNo }} + div.project-values-settings + a.edit-us-status.icon.icon-edit(href="", title="Edit value") + a.delete-us-status.icon.icon-delete(href="", title="Delete value") + + div.project-values-row.new-us-status.hidden + div.project-values-name + input(type="text", placeholder="Write a name for the new status", ng-model="newUs.name") + div.project-values-isclosed + select(ng-model="newUs.is_closed") + option(selected) No + option Yes + div.project-values-settings + 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-values.jade b/app/partials/views/modules/admin/project-values.jade deleted file mode 100644 index 1cb0f214..00000000 --- a/app/partials/views/modules/admin/project-values.jade +++ /dev/null @@ -1,35 +0,0 @@ -section.project-values-table - div.project-values-header - div.project-values-row - div.project-values-name - span Name - div.project-values-isclosed - span Is closed? - div.project-values-settings - div.project-values-body - div.project-values-row - div.project-values-name - span Definition needed - div.project-values-isclosed - span No - div.project-values-settings - a.icon.icon-edit(href="", title="Edit value") - a.icon.icon-delete(href="", title="Delete value") - div.project-values-row - div.project-values-name - span Approval pending - div.project-values-isclosed - span No - div.project-values-settings - a.icon.icon-edit(href="", title="Edit value") - a.icon.icon-delete(href="", title="Delete value") - div.project-values-row - div.project-values-name - input(type="text", placeholder="Write a name for the new status") - div.project-values-isclosed - select - option(selected) No - option Yes - div.project-values-settings - a.icon.icon-floppy(href="", title="Delete value") - a.icon.icon-delete(href="", title="Delete value")