diff --git a/app/modules/components/joy-ride/joy-ride.directive.coffee b/app/modules/components/joy-ride/joy-ride.directive.coffee index 6755310e..9464aad0 100644 --- a/app/modules/components/joy-ride/joy-ride.directive.coffee +++ b/app/modules/components/joy-ride/joy-ride.directive.coffee @@ -17,19 +17,31 @@ JoyRideDirective = ($rootScope, currentUserService, joyRideService) -> intro.oncomplete () -> $('html,body').scrollTop(0) - startIntro = (joyRideName) -> - intro.setOption('steps', joyRideService.get(joyRideName)) - intro.start(); + intro.onexit () -> + currentUserService.disableJoyRide() + + initJoyrRide = (next, config) -> + if !config[next.joyride] + return + + intro.setOption('steps', joyRideService.get(next.joyride)) + intro.start() $rootScope.$on '$routeChangeSuccess', (event, next) -> return if !next.joyride || !currentUserService.isAuthenticated() + intro.oncomplete () -> + currentUserService.disableJoyRide(next.joyride) + if next.loader un = $rootScope.$on 'loader:end', () -> - startIntro(next.joyride) + currentUserService.loadJoyRideConfig() + .then (config) -> initJoyrRide(next, config) + un() else - startIntro(next.joyride) + currentUserService.loadJoyRideConfig() + .then (config) -> initJoyrRide(next, config) return { scope: {}, diff --git a/app/modules/resources/resources.coffee b/app/modules/resources/resources.coffee index 8d73ce4d..077cb726 100644 --- a/app/modules/resources/resources.coffee +++ b/app/modules/resources/resources.coffee @@ -1,5 +1,6 @@ services = [ "tgProjectsResources", + "tgUserResources", "tgUsersResources", "tgUserstoriesResource", "tgTasksResource", diff --git a/app/modules/resources/user-resource.service.coffee b/app/modules/resources/user-resource.service.coffee new file mode 100644 index 00000000..d51d3498 --- /dev/null +++ b/app/modules/resources/user-resource.service.coffee @@ -0,0 +1,41 @@ +Resource = (urlsService, http, paginateResponseService) -> + service = {} + + service.getUserStorage = (key) -> + url = urlsService.resolve("user-storage") + + if key + url += '/' + key + + httpOptions = {} + + return http.get(url, {}).then (response) -> + return response.data.value + + service.setUserStorage = (key, value) -> + url = urlsService.resolve("user-storage") + '/' + key + + params = { + key: key, + value: value + } + + return http.put(url, params) + + service.createUserStorage = (key, value) -> + url = urlsService.resolve("user-storage") + + params = { + key: key, + value: value + } + + return http.post(url, params) + + return () -> + return {"user": service} + +Resource.$inject = ["$tgUrls", "$tgHttp"] + +module = angular.module("taigaResources2") +module.factory("tgUserResources", Resource) diff --git a/app/modules/services/current-user.service.coffee b/app/modules/services/current-user.service.coffee index a4301dae..21d7c217 100644 --- a/app/modules/services/current-user.service.coffee +++ b/app/modules/services/current-user.service.coffee @@ -5,13 +5,15 @@ groupBy = @.taiga.groupBy class CurrentUserService @.$inject = [ "tgProjectsService", - "$tgStorage" + "$tgStorage", + "tgResources" ] - constructor: (@projectsService, @storageService) -> + constructor: (@projectsService, @storageService, @rs) -> @._user = null @._projects = Immutable.Map() @._projectsById = Immutable.Map() + @._joyride = null taiga.defineImmutableProperty @, "projects", () => return @._projects taiga.defineImmutableProperty @, "projectsById", () => return @._projectsById @@ -55,7 +57,43 @@ class CurrentUserService return @.projects + disableJoyRide: (section) -> + if section + @._joyride[section] = false + else + @._joyride = { + backlog: false, + kanban: false, + dashboard: false + } + + @rs.user.setUserStorage('joyride', @._joyride) + + loadJoyRideConfig: () -> + return new Promise (resolve) => + if @._joyride != null + resolve(@._joyride) + return + + @rs.user.getUserStorage('joyride') + .then (config) => + @._joyride = config + resolve(@._joyride) + .catch () => + #joyride not defined + @._joyride = { + backlog: true, + kanban: true, + dashboard: true + } + + @rs.user.createUserStorage('joyride', @._joyride) + + resolve(@._joyride) + _loadUserInfo: () -> - return @.loadProjects() + return Promise.all([ + @.loadProjects() + ]) angular.module("taigaCommon").service("tgCurrentUserService", CurrentUserService) diff --git a/app/modules/services/current-user.service.spec.coffee b/app/modules/services/current-user.service.spec.coffee index e17e44e9..7a418ff0 100644 --- a/app/modules/services/current-user.service.spec.coffee +++ b/app/modules/services/current-user.service.spec.coffee @@ -17,6 +17,17 @@ describe "tgCurrentUserService", -> provide.value "tgProjectsService", mocks.projectsService + _mockResources = () -> + mocks.resources = { + user: { + setUserStorage: sinon.stub(), + getUserStorage: sinon.stub(), + createUserStorage: sinon.stub() + } + } + + provide.value "tgResources", mocks.resources + _inject = (callback) -> inject (_tgCurrentUserService_) -> currentUserService = _tgCurrentUserService_ @@ -27,6 +38,7 @@ describe "tgCurrentUserService", -> provide = $provide _mockTgStorage() _mockProjectsService() + _mockResources() return null @@ -105,3 +117,35 @@ describe "tgCurrentUserService", -> currentUserService.removeUser() expect(currentUserService._user).to.be.null + + it "disable joyride", () -> + currentUserService.disableJoyRide() + + expect(mocks.resources.user.setUserStorage).to.have.been.calledWith('joyride', { + backlog: false, + kanban: false, + dashboard: false + }); + + it "load joyride config", (done) -> + mocks.resources.user.getUserStorage.withArgs('joyride').promise().resolve(true) + + currentUserService.loadJoyRideConfig().then (config) -> + expect(config).to.be.true + + done() + + it "create default joyride config", (done) -> + mocks.resources.user.getUserStorage.withArgs('joyride').promise().reject() + + currentUserService.loadJoyRideConfig().then (config) -> + joyride = { + backlog: true, + kanban: true, + dashboard: true + } + + expect(mocks.resources.user.createUserStorage).to.have.been.calledWith('joyride', joyride) + expect(config).to.be.eql(joyride) + + done()