diff --git a/admin/api/team.go b/admin/api/team.go index 5ae6ddee..0451266f 100644 --- a/admin/api/team.go +++ b/admin/api/team.go @@ -36,6 +36,7 @@ func init() { router.GET("/api/teams/:tid/", apiHandler(teamHandler( func(team fic.Team, _ []byte) (interface{}, error) { return team, nil }))) + router.PUT("/api/teams/:tid/", apiHandler(teamHandler(updateTeam))) router.POST("/api/teams/:tid/", apiHandler(teamHandler(addTeamMember))) router.DELETE("/api/teams/:tid/", apiHandler(teamHandler( func(team fic.Team, _ []byte) (interface{}, error) { @@ -60,6 +61,8 @@ func init() { router.GET("/api/teams/:tid/members", apiHandler(teamHandler( func(team fic.Team, _ []byte) (interface{}, error) { return team.GetMembers() }))) + router.POST("/api/teams/:tid/members", apiHandler(teamHandler(addTeamMember))) + router.PUT("/api/teams/:tid/members", apiHandler(teamHandler(setTeamMember))) router.GET("/api/teams/:tid/name", apiHandler(teamHandler( func(team fic.Team, _ []byte) (interface{}, error) { return team.InitialName, nil }))) @@ -141,6 +144,21 @@ func createTeam(_ httprouter.Params, body []byte) (interface{}, error) { return fic.CreateTeam(strings.TrimSpace(ut.Name), ut.Color) } +func updateTeam(team fic.Team, body []byte) (interface{}, error) { + var ut fic.Team + if err := json.Unmarshal(body, &ut); err != nil { + return nil, err + } + + ut.Id = team.Id + + if _, err := ut.Update(); err != nil { + return nil, err + } + + return ut, nil +} + func addTeamMember(team fic.Team, body []byte) (interface{}, error) { var members []uploadedMember if err := json.Unmarshal(body, &members); err != nil { @@ -154,6 +172,20 @@ func addTeamMember(team fic.Team, body []byte) (interface{}, error) { return team.GetMembers() } +func setTeamMember(team fic.Team, body []byte) (interface{}, error) { + var members []uploadedMember + if err := json.Unmarshal(body, &members); err != nil { + return nil, err + } + + team.ClearMembers() + for _, member := range members { + team.AddMember(strings.TrimSpace(member.Firstname), strings.TrimSpace(member.Lastname), strings.TrimSpace(member.Nickname), strings.TrimSpace(member.Company)) + } + + return team.GetMembers() +} + func dispMemberTeam(ps httprouter.Params, body []byte) (interface{}, error) { if mid, err := strconv.Atoi(string(ps.ByName("mid"))); err != nil { return fic.Team{}, err diff --git a/admin/static/js/app.js b/admin/static/js/app.js index 74709e7e..884bc3c9 100644 --- a/admin/static/js/app.js +++ b/admin/static/js/app.js @@ -30,6 +30,10 @@ angular.module("FICApp", ["ngRoute", "ngResource", "ngSanitize"]) templateUrl: "views/team-list.html" }) .when("/teams/:teamId", { + controller: "TeamController", + templateUrl: "views/team-edit.html" + }) + .when("/teams/:teamId/stats", { controller: "TeamController", templateUrl: "views/team.html" }) @@ -80,7 +84,9 @@ angular.module("FICApp") }) }) .factory("TeamMember", function($resource) { - return $resource("/api/teams/:teamId/members", { teamId: '@id' }) + return $resource("/api/teams/:teamId/members", { teamId: '@id' }, { + 'save': {method: 'PUT'}, + }) }) .factory("TeamMy", function($resource) { return $resource("/api/teams/:teamId/my.json", { teamId: '@id' }) @@ -146,6 +152,16 @@ angular.module("FICApp") return input.capitalize(); } }) + .filter("toColor", function() { + return function(input) { + num >>>= 0; + var b = num & 0xFF, + g = (num & 0xFF00) >>> 8, + r = (num & 0xFF0000) >>> 16, + a = ( (num & 0xFF000000) >>> 24 ) / 255 ; + return "#" + r.toString(16) + g.toString(16) + b.toString(16); + } + }) .filter("size", function() { var units = [ "o", @@ -193,6 +209,31 @@ angular.module("FICApp") } }) + .directive('color', function() { + return { + require: 'ngModel', + link: function(scope, ele, attr, ctrl){ + ctrl.$formatters.unshift(function(num){ + num >>>= 0; + var b = num & 0xFF, + g = (num & 0xFF00) >>> 8, + r = (num & 0xFF0000) >>> 16, + a = ( (num & 0xFF000000) >>> 24 ) / 255 ; + return "#" + r.toString(16) + g.toString(16) + b.toString(16); + }); + ctrl.$parsers.unshift(function(viewValue){ + var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(viewValue); + return result ? ( + parseInt(result[1], 16) * 256 * 256 + + parseInt(result[2], 16) * 256 + + parseInt(result[3], 16) + + ) : 0; + }); + } + }; + }) + .directive('integer', function() { return { require: 'ngModel', @@ -472,9 +513,44 @@ angular.module("FICApp") $location.url("/teams/" + id); }; }) - .controller("TeamController", function($scope, Team, TeamMember, $routeParams) { + .controller("TeamMembersController", function($scope, TeamMember, $routeParams) { + $scope.fields = ["firstname", "lastname", "nickname", "company"]; + + }) + .controller("TeamController", function($scope, $location, Team, TeamMember, $routeParams) { $scope.team = Team.get({ teamId: $routeParams.teamId }); + $scope.fields = ["name", "color"]; $scope.members = TeamMember.query({ teamId: $routeParams.teamId }); + + $scope.saveTeam = function() { + if (this.team.id) { + this.team.$update(); + } else { + this.team.$save(function() { + $location.url("/teams/" + $scope.team.id); + }); + } + } + $scope.deleteTeam = function() { + this.team.$remove(function() { $location.url("/teams/");}); + } + $scope.showStats = function() { + $location.url("/teams/" + $scope.team.id + "/stats"); + } + $scope.newMember = function() { + $scope.members.push(new TeamMember()); + } + $scope.saveTeamMembers = function() { + if (this.team.id) { + TeamMember.save({ teamId: this.team.id }, $scope.members); + } + } + $scope.removeMember = function(member) { + angular.forEach($scope.members, function(m, k) { + if (member == m) + $scope.members.splice(k, 1); + }); + } }) .controller("TeamStatsController", function($scope, TeamStats, $routeParams) { $scope.teamstats = TeamStats.get({ teamId: $routeParams.teamId }); diff --git a/admin/static/views/team-edit.html b/admin/static/views/team-edit.html new file mode 100644 index 00000000..64f96774 --- /dev/null +++ b/admin/static/views/team-edit.html @@ -0,0 +1,48 @@ +

{{ team.name }} ({{ team.initialName}}) et , {{ member.firstname | capitalize }} {{ member.nickname }} {{ member.lastname | capitalize }} Statistiques

+ +
+
+ +
+ {{ team.id }} +
+
+
+ +
+ {{ team.initialName }} +
+
+
+ +
+ + +
+
+
+ + Delete +
+
+ +
+
+ +
+ +
+

Membres Add member

+ +
+
+ +
+ +
+
+ +
+
+
+
diff --git a/admin/static/views/team-list.html b/admin/static/views/team-list.html index bc261e0c..2c0cea97 100644 --- a/admin/static/views/team-list.html +++ b/admin/static/views/team-list.html @@ -1,4 +1,4 @@ -

Équipes

+

Équipes Ajouter une équipe

diff --git a/libfic/member.go b/libfic/member.go index 0b4ce660..40132e90 100644 --- a/libfic/member.go +++ b/libfic/member.go @@ -80,3 +80,13 @@ func (m Member) Delete() (int64, error) { return nb, err } } + +func (t Team) ClearMembers() (int64, error) { + if res, err := DBExec("DELETE FROM team_members WHERE id_team = ?", t.Id); err != nil { + return 0, err + } else if nb, err := res.RowsAffected(); err != nil { + return 0, err + } else { + return nb, err + } +}