From 26006f294087456993fd0a1de4d18d7a80f2fa04 Mon Sep 17 00:00:00 2001 From: Juanfran Date: Fri, 11 Dec 2015 10:03:42 +0100 Subject: [PATCH] cancelable search --- app/coffee/app.coffee | 2 +- app/coffee/modules/base/http.coffee | 2 -- app/coffee/modules/common/wisiwyg.coffee | 8 +++++- app/coffee/modules/resources/search.coffee | 29 +++++++++++++++++----- app/coffee/modules/search.coffee | 14 ++++------- 5 files changed, 36 insertions(+), 19 deletions(-) diff --git a/app/coffee/app.coffee b/app/coffee/app.coffee index 39ce4fd5..60e3ad73 100644 --- a/app/coffee/app.coffee +++ b/app/coffee/app.coffee @@ -419,7 +419,7 @@ configure = ($routeProvider, $locationProvider, $httpProvider, $provide, $tgEven # Add next param when user try to access to a secction need auth permissions. authHttpIntercept = ($q, $location, $navUrls, $lightboxService) -> httpResponseError = (response) -> - if response.status == 0 || response.status == -1 + if response.status == 0 || (response.status == -1 && !response.config.cancelable) $lightboxService.closeAll() $location.path($navUrls.resolve("error")) $location.replace() diff --git a/app/coffee/modules/base/http.coffee b/app/coffee/modules/base/http.coffee index e6c9dc03..619f4a19 100644 --- a/app/coffee/modules/base/http.coffee +++ b/app/coffee/modules/base/http.coffee @@ -45,8 +45,6 @@ class HttpService extends taiga.Service request: (options) -> options.headers = _.merge({}, options.headers or {}, @.headers()) - if _.isPlainObject(options.data) - options.data = JSON.stringify(options.data) return @http(options) diff --git a/app/coffee/modules/common/wisiwyg.coffee b/app/coffee/modules/common/wisiwyg.coffee index d3b82c55..98ce7ea4 100644 --- a/app/coffee/modules/common/wisiwyg.coffee +++ b/app/coffee/modules/common/wisiwyg.coffee @@ -69,6 +69,8 @@ MarkitupDirective = ($rootscope, $rs, $selectedText, $template, $compile, $trans $scope.$on "markdown-editor:submit", -> closePreviewMode() + cancelablePromise = null + preview = -> markdownDomNode = element.parents(".markdown") markItUpDomNode = element.parents(".markItUp") @@ -370,7 +372,11 @@ MarkitupDirective = ($rootscope, $rs, $selectedText, $template, $compile, $trans return true return false - $rs.search.do($scope.projectId, term).then (res) => + cancelablePromise.abort() if cancelablePromise + + cancelablePromise = $rs.search.do($scope.projectId, term) + + cancelablePromise.then (res) => # ignore wikipages if they're the only results. can't exclude them in search if res.count < 1 or res.count == res.wikipages.length callback([]) diff --git a/app/coffee/modules/resources/search.coffee b/app/coffee/modules/resources/search.coffee index a452b4ae..48639e25 100644 --- a/app/coffee/modules/resources/search.coffee +++ b/app/coffee/modules/resources/search.coffee @@ -22,22 +22,39 @@ taiga = @.taiga -resourceProvider = ($repo, $urls, $http) -> +resourceProvider = ($repo, $urls, $http, $q) -> service = {} service.do = (projectId, term) -> + deferredAbort = $q.defer() + url = $urls.resolve("search") params = { - project: projectId - text: term, - get_all: false + url: url, + method: "GET", + timeout: deferredAbort.promise, + cancelable: true, + params: { + project: projectId + text: term, + get_all: false, + } } - return $http.get(url, params).then (data) -> + request = $http.request(params).then (data) -> return data.data + request.abort = () -> + deferredAbort.resolve() + + request.finally = () -> + request.abort = angular.noop + deferredAbort = request = null + + return request + return (instance) -> instance.search = service module = angular.module("taigaResources") -module.factory("$tgSearchResourcesProvider", ["$tgRepo", "$tgUrls", "$tgHttp", resourceProvider]) +module.factory("$tgSearchResourcesProvider", ["$tgRepo", "$tgUrls", "$tgHttp", "$q", resourceProvider]) diff --git a/app/coffee/modules/search.coffee b/app/coffee/modules/search.coffee index 57066946..7f20fc3a 100644 --- a/app/coffee/modules/search.coffee +++ b/app/coffee/modules/search.coffee @@ -95,19 +95,15 @@ class SearchController extends mixOf(taiga.Controller, taiga.PageMixin) @scope.loading = true @._loadSearchData(term).then (data) => - if data - @scope.searchResults = data - @scope.loading = false + @scope.searchResults = data + @scope.loading = false _loadSearchData: (term = "") -> - @.deferredAbort.resolve() if @.deferredAbort + @._promise.abort() if @._promise - @.deferredAbort = @q.defer() + @._promise = @rs.search.do(@scope.projectId, term) - @rs.search.do(@scope.projectId, term).then (data) => - @.deferredAbort.resolve(data) - - return @.deferredAbort.promise + return @._promise loadInitialData: -> return @.loadProject().then (project) =>