user service to get contacts

stable
Juanfran 2015-05-07 12:11:59 +02:00
parent 9cb6a37f3c
commit 4ae492996d
12 changed files with 292 additions and 28 deletions

View File

@ -145,6 +145,9 @@ urls = {
# locales # locales
"locales": "/locales" "locales": "/locales"
# user
"contacts": "/users/%s/contacts"
} }
# Initialize api urls service # Initialize api urls service
@ -192,5 +195,6 @@ module.run([
"$tgWebhookLogsResourcesProvider", "$tgWebhookLogsResourcesProvider",
"$tgLocalesResourcesProvider", "$tgLocalesResourcesProvider",
"$tgTimelineResourcesProvider", "$tgTimelineResourcesProvider",
"$tgUsersResourcesProvider",
initResources initResources
]) ])

View File

@ -24,7 +24,11 @@ taiga = @.taiga
resourceProvider = ($repo) -> resourceProvider = ($repo) ->
service = {} service = {}
service.profile = (userId, params) -> service.profile = (userId, page) ->
params = {
page: page
}
return $repo.queryOnePaginatedRaw("timeline-profile", userId, params) return $repo.queryOnePaginatedRaw("timeline-profile", userId, params)
return (instance) -> return (instance) ->

View File

@ -0,0 +1,47 @@
###
# Copyright (C) 2014 Andrey Antukh <niwi@niwi.be>
# Copyright (C) 2014 Jesús Espino Garcia <jespinog@gmail.com>
# Copyright (C) 2014 David Barragán Merino <bameda@dbarragan.com>
#
# 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 <http://www.gnu.org/licenses/>.
#
# File: modules/resources/user.coffee
###
taiga = @.taiga
sizeFormat = @.taiga.sizeFormat
resourceProvider = ($http, $urls) ->
service = {}
service.contacts = (userId, options={}) ->
url = $urls.resolve("contacts", userId)
httpOptions = {headers: {}}
if not options.enablePagination
httpOptions.headers["x-disable-pagination"] = "1"
return $http.get(url, {}, httpOptions)
.then (result) ->
return result.data
return (instance) ->
instance.users = service
module = angular.module("taigaResources")
module.factory("$tgUsersResourcesProvider", ["$tgHttp", "$tgUrls", "$q",
resourceProvider])

View File

@ -0,0 +1,20 @@
class ProfileProjectsController
@.$inject = [
"tgUserService",
"$tgAuth"
]
constructor: (@userService, @auth) ->
loadProjects: () ->
userId = @auth.getUser().id
@userService.getProjects(userId)
.then (projects) =>
return @userService.attachUserContactsToProjects(userId, projects)
.then (projects) =>
@.projects = projects
angular.module("taigaProfile")
.controller("ProfileProjects", ProfileProjectsController)

View File

@ -0,0 +1,72 @@
describe "ProfileProjects", ->
$controller = null
$q = null
provide = null
$rootScope = null
mocks = {}
_mockUserService = () ->
mocks.userService = {
getProjects: sinon.stub(),
attachUserContactsToProjects: sinon.stub()
}
provide.value "tgUserService", mocks.userService
_mockAuthService = () ->
stub = sinon.stub()
stub.returns({id: 2})
provide.value "$tgAuth", {
getUser: stub
}
_mocks = () ->
module ($provide) ->
provide = $provide
_mockUserService()
_mockAuthService()
return null
_inject = (callback) ->
inject (_$controller_, _$q_, _$rootScope_) ->
$q = _$q_
$rootScope = _$rootScope_
$controller = _$controller_
beforeEach ->
module "taigaProfile"
_mocks()
_inject()
it "load projects with contacts attached", (done) ->
userId = 2
projects = [
{id: 1},
{id: 2},
{id: 3}
]
projectsWithContacts = [
{id: 1, contacts: "fake"},
{id: 2, contacts: "fake"},
{id: 3, contacts: "fake"}
]
mocks.userService.getProjects = (userId) ->
expect(userId).to.be.equal(userId)
return $q (resolve, reject) ->
resolve(projects)
mocks.userService.attachUserContactsToProjects.withArgs(userId, projects).returns(projectsWithContacts)
ctrl = $controller("ProfileProjects")
ctrl.loadProjects().then () ->
expect(ctrl.projects).to.be.equal(projectsWithContacts)
done()
$rootScope.$apply()

View File

@ -1,17 +1,14 @@
ProfileProjectsDirective = (projectsService) -> ProfileProjectsDirective = () ->
link = (scope, el, attrs, ctrl) -> link = (scope, elm, attr, ctrl) ->
scope.vm = {} ctrl.loadProjects()
taiga.defineImmutableProperty(scope.vm, "projects", () -> projectsService.currentUserProjects.get("all"))
directive = { return {
templateUrl: "profile/profile-projects/profile-projects.html" templateUrl: "profile/profile-projects/profile-projects.html",
scope: {} scope: {},
link: link link: link
bindToController: true,
controllerAs: "vm",
controller: "ProfileProjects"
} }
return directive
ProfileProjectsDirective.$inject = ["tgProjectsService"]
angular.module("taigaProfile").directive("tgProfileProjects", ProfileProjectsDirective) angular.module("taigaProfile").directive("tgProfileProjects", ProfileProjectsDirective)

View File

@ -1,13 +1,22 @@
ProfileTabDirective = () -> ProfileTabDirective = () ->
link = ($scope, $el, $attrs, $ctrl) -> link = (scope, element, attrs, ctrl, transclude) ->
$scope.tab = {} scope.tab = {}
$scope.tab.name = $attrs.tgProfileTab scope.tab.name = attrs.tgProfileTab
$scope.tab.title = $attrs.tabTitle scope.tab.title = attrs.tabTitle
$scope.tab.icon = $attrs.tabIcon scope.tab.icon = attrs.tabIcon
$scope.tab.active = !!$attrs.tabActive scope.tab.active = !!attrs.tabActive
$ctrl.addTab($scope.tab) ctrl.addTab(scope.tab)
scope.$watch "tab.active", (active) ->
if active
transclude scope, (clone, scope) ->
element.append(clone)
else
element.children().each (idx, elm) ->
scope.$$childHead.$destroy()
elm.remove()
return { return {
scope: {} scope: {}
@ -15,11 +24,6 @@ ProfileTabDirective = () ->
link: link link: link
transclude: true transclude: true
replace: true replace: true
template: """
<div ng-show="tab.active">
<ng-transclude></ng-transclude>
</div>
"""
} }
angular.module("taigaProfile") angular.module("taigaProfile")

View File

@ -1,6 +1,6 @@
div div
nav.profile-content-tabs nav.profile-content-tabs
a.tab(ng-repeat="tab in vm.tabs", href="", title="{{::tab.title}}", ng-class="{active: tab.active}" ng-click="vm.toggleTab(tab)") a.tab(ng-repeat="tab in ::vm.tabs", href="", title="{{::tab.title}}", ng-class="{active: tab.active}" ng-click="vm.toggleTab(tab)")
span.icon(ng-class="::tab.icon") span.icon(ng-class="::tab.icon")
span {{::tab.name}} span {{::tab.name}}

View File

@ -17,7 +17,6 @@ class ProfileTimelineItemController
@.activity.sprint = timeline.data.milestone @.activity.sprint = timeline.data.milestone
@.activity.title = @profileTimelineItemTitle.getTitle(timeline, event, type) @.activity.title = @profileTimelineItemTitle.getTitle(timeline, event, type)
@.activity.created_formated = moment(timeline.created).fromNow() @.activity.created_formated = moment(timeline.created).fromNow()
#test
@.activity.obj = @.getObject(timeline, event) @.activity.obj = @.getObject(timeline, event)
if type.description if type.description

View File

@ -1,3 +1,3 @@
section.profile-timeline section.profile-timeline
div(infinite-scroll="vm.loadTimeline()", infinite-scroll-distance="3", infinite-scroll-disabled='vm.loadingData') div(infinite-scroll="vm.loadTimeline()", infinite-scroll-distance="3", infinite-scroll-disabled="vm.loadingData")
div(tg-repeat="timeline in vm.timelineList", tg-profile-timeline-item="timeline") div(tg-repeat="timeline in vm.timelineList", tg-profile-timeline-item="timeline")

View File

@ -0,0 +1,24 @@
taiga = @.taiga
class UserService extends taiga.Service
@.$inject = ["$tgResources"]
constructor: (@rs) ->
getProjects: (userId) ->
return @rs.projects.listByMember(userId)
.then (projects) -> return Immutable.fromJS(projects)
attachUserContactsToProjects: (userId, projects) ->
return @rs.users.contacts(userId)
.then (contacts) -> return Immutable.fromJS(contacts)
.then (contacts) ->
projects = projects.map (project) ->
project.contacts = contacts.filter (contact) ->
return project.members.indexOf(contact.id) != -1
return project
return projects
angular.module("taigaCommon").service("tgUserService", UserService)

View File

@ -0,0 +1,93 @@
# pending new resouercees
describe.skip "UserService", ->
userService = null
$q = null
provide = null
$rootScope = null
mocks = {}
_mockResources = () ->
mocks.resources = {}
mocks.resources.projects = {
listByMember: sinon.stub()
}
mocks.resources.users = {
contacts: sinon.stub()
}
provide.value "$tgResources", mocks.resources
_mocks = () ->
module ($provide) ->
provide = $provide
_mockResources()
return null
_inject = (callback) ->
inject (_tgUserService_, _$q_, _$rootScope_) ->
userService = _tgUserService_
$q = _$q_
$rootScope = _$rootScope_
beforeEach ->
module "taigaCommon"
_mocks()
_inject()
it "get user projects", (done) ->
userId = 2
projects = [
{id: 1},
{id: 2},
{id: 3}
]
mocks.resources.projects.listByMember = (userId) ->
expect(userId).to.be.equal(userId)
return $q (resolve, reject) ->
resolve(projects)
userService.getProjects(userId).then (_projects_) ->
expect(_projects_.toJS()).to.be.eql(projects)
done()
$rootScope.$apply()
it "attach user contacts to projects", (done) ->
userId = 2
class Project
constructor: (@id, @members) ->
projects = Immutable.fromJS([
new Project(1, [1, 2, 3]),
new Project(1, [2, 3]),
new Project(1, [1])
])
contacts = Immutable.fromJS([
{id: 1, name: "fake1"},
{id: 2, name: "fake2"},
{id: 3, name: "fake3"}
])
mocks.resources.users.contacts = (userId) ->
expect(userId).to.be.equal(userId)
return $q (resolve, reject) ->
resolve(contacts)
userService.attachUserContactsToProjects(userId, projects).then (_projects_) ->
contacts = _projects_.get(0).contacts
console.log _projects_.get(0)
expect(contacts[0]).to.be.equal('fake1')
done()
$rootScope.$apply()