diff --git a/admin/api/claim.go b/admin/api/claim.go index 46cac18b..d3438254 100644 --- a/admin/api/claim.go +++ b/admin/api/claim.go @@ -2,6 +2,7 @@ package api import ( "encoding/json" + "errors" "time" "srs.epita.fr/fic-server/libfic" @@ -11,9 +12,12 @@ import ( func init() { // Tasks - router.GET("/api/claims/", apiHandler(getClaims)) - router.POST("/api/claims/", apiHandler(newClaim)) - router.DELETE("/api/claims/", apiHandler(clearClaims)) + router.GET("/api/claims", apiHandler(getClaims)) + router.POST("/api/claims", apiHandler(newClaim)) + router.DELETE("/api/claims", apiHandler(clearClaims)) + router.GET("/api/teams/:tid/claims", apiHandler(teamHandler(getTeamClaims))) + router.GET("/api/exercices/:eid/claims", apiHandler(exerciceHandler(getExerciceClaims))) + router.GET("/api/themes/:thid/exercices/:eid/claims", apiHandler(exerciceHandler(getExerciceClaims))) router.GET("/api/claims/:cid", apiHandler(claimHandler(showClaim))) router.PUT("/api/claims/:cid", apiHandler(claimHandler(updateClaim))) @@ -21,8 +25,8 @@ func init() { router.DELETE("/api/claims/:cid", apiHandler(claimHandler(deleteClaim))) // Assignees - router.GET("/api/claims-assignees/", apiHandler(getAssignees)) - router.POST("/api/claims-assignees/", apiHandler(newAssignee)) + router.GET("/api/claims-assignees", apiHandler(getAssignees)) + router.POST("/api/claims-assignees", apiHandler(newAssignee)) router.GET("/api/claims-assignees/:aid", apiHandler(claimAssigneeHandler(showClaimAssignee))) router.PUT("/api/claims-assignees/:aid", apiHandler(claimAssigneeHandler(updateClaimAssignee))) @@ -33,6 +37,14 @@ func getClaims(_ httprouter.Params, _ []byte) (interface{}, error) { return fic.GetClaims() } +func getTeamClaims(team fic.Team, _ []byte) (interface{}, error) { + return team.GetClaims() +} + +func getExerciceClaims(exercice fic.Exercice, _ []byte) (interface{}, error) { + return exercice.GetClaims() +} + type ClaimExported struct { Id int64 `json:"id"` Subject string `json:"subject"` @@ -97,6 +109,10 @@ func newClaim(_ httprouter.Params, body []byte) (interface{}, error) { return nil, err } + if uc.Subject == "" { + return nil, errors.New("Claim's subject cannot be empty.") + } + var t *fic.Team if uc.Team != nil { if team, err := fic.GetTeam(*uc.Team); err != nil { @@ -130,6 +146,10 @@ func newClaim(_ httprouter.Params, body []byte) (interface{}, error) { a = nil } + if uc.Priority == "" { + uc.Priority = "medium" + } + return fic.NewClaim(uc.Subject, t, e, a, uc.Priority) } diff --git a/admin/static/js/app.js b/admin/static/js/app.js index 2496526c..2a24b5a7 100644 --- a/admin/static/js/app.js +++ b/admin/static/js/app.js @@ -229,6 +229,9 @@ angular.module("FICApp") patch: {method: 'PATCH'} }) }) + .factory("ExerciceClaims", function($resource) { + return $resource("/api/exercices/:exerciceId/claims", { exerciceId: '@idExercice'}) + }) .factory("ExerciceTags", function($resource) { return $resource("/api/exercices/:exerciceId/tags", { exerciceId: '@idExercice'}, { update: {method: 'PUT'} @@ -267,7 +270,7 @@ angular.module("FICApp") } }) .filter("toColor", function() { - return function(input) { + return function(num) { num >>>= 0; var b = num & 0xFF, g = (num & 0xFF00) >>> 8, @@ -1056,14 +1059,14 @@ angular.module("FICApp") $location.url("/claims/" + id); }; }) - .controller("ClaimController", function($scope, Claim, ClaimAssignee, Teams, Exercice, $routeParams, $location, $http) { + .controller("ClaimController", function($scope, Claim, ClaimAssignee, Teams, Exercice, $routeParams, $location, $http, $rootScope) { $scope.claim = Claim.get({ claimId: $routeParams.claimId }, function(v) { v.id_team = "" + v.id_team; if (!v.priority) v.priority = "medium"; }); if ($routeParams.claimId == "new") - $scope.fields = ["id_team", "subject", "priority", "id_exercice", "id_assignee"]; + $scope.fields = ["id_team", "id_exercice", "subject", "priority", "id_assignee"]; else $scope.fields = ["state", "subject", "priority", "id_exercice", "id_assignee", "id_team", "creation"]; $scope.assignees = ClaimAssignee.query(); @@ -1132,6 +1135,8 @@ angular.module("FICApp") if (!this.ndescription) this.ndescription = "Création de la tâche"; $scope.saveDescription(); + }, function(response) { + $rootScope.newBox('danger', 'An error occurs when trying to save claim:', response.data.errmsg); }); } } @@ -1362,6 +1367,22 @@ angular.module("FICApp") } }) + .controller("ExerciceClaimsController", function($scope, ExerciceClaims, Team, ClaimAssignee, $routeParams, $location) { + $scope.claims = ExerciceClaims.query({ exerciceId: $routeParams.exerciceId }); + $scope.assignees = ClaimAssignee.query(); + + $scope.claims.$promise.then(function(claims) { + claims.forEach(function(claim, cid) { + $scope.claims[cid].team = Team.get({ teamId: claim.id_team }); + }) + }); + + $scope.showClosed = false; + $scope.show = function(id) { + $location.url("/claims/" + id); + }; + }) + .controller("ExerciceTagsController", function($scope, ExerciceTags, $routeParams, $rootScope) { $scope.tags = ExerciceTags.query({ exerciceId: $routeParams.exerciceId }); diff --git a/admin/static/views/claim.html b/admin/static/views/claim.html index d74f4aba..4eb2a579 100644 --- a/admin/static/views/claim.html +++ b/admin/static/views/claim.html @@ -9,8 +9,13 @@ - - + +
+ +
+ Aller au challenge +
+
diff --git a/admin/static/views/exercice.html b/admin/static/views/exercice.html index d369d615..facd244d 100644 --- a/admin/static/views/exercice.html +++ b/admin/static/views/exercice.html @@ -35,6 +35,20 @@
+ +
+ + + + + + + + + +
+
+

Téléchargements

diff --git a/libfic/todo.go b/libfic/todo.go index ad82cfe5..623cea14 100644 --- a/libfic/todo.go +++ b/libfic/todo.go @@ -46,7 +46,27 @@ func GetClaims() (res []Claim, err error) { // GetClaims returns a list of all Claim registered for the Team. func (t Team) GetClaims() (res []Claim, err error) { var rows *sql.Rows - if rows, err = DBQuery("SELECT id_claim, subject, id_team, id_exercice, id_assignee, creation, state, priority FROM claims WHERE IdTeam = ?", t.Id); err != nil { + if rows, err = DBQuery("SELECT id_claim, subject, id_team, id_exercice, id_assignee, creation, state, priority FROM claims WHERE id_team = ?", t.Id); err != nil { + return nil, err + } + defer rows.Close() + + for rows.Next() { + var c Claim + if err = rows.Scan(&c.Id, &c.Subject, &c.IdTeam, &c.IdExercice, &c.IdAssignee, &c.Creation, &c.State, &c.Priority); err != nil { + return + } + res = append(res, c) + } + err = rows.Err() + + return +} + +// GetExercices returns a list of all Claim registered for the Exercice. +func (e Exercice) GetClaims() (res []Claim, err error) { + var rows *sql.Rows + if rows, err = DBQuery("SELECT id_claim, subject, id_team, id_exercice, id_assignee, creation, state, priority FROM claims WHERE id_exercice = ?", e.Id); err != nil { return nil, err } defer rows.Close()