diff --git a/app/assets/javascripts/todos.js.coffee b/app/assets/javascripts/todos.js.coffee index b6b4bd90e6a..e9652ee411f 100644 --- a/app/assets/javascripts/todos.js.coffee +++ b/app/assets/javascripts/todos.js.coffee @@ -1,4 +1,6 @@ class @Todos + PER_PAGE = 20 + constructor: (@name) -> @clearListeners() @initBtnListeners() @@ -24,6 +26,7 @@ class @Todos dataType: 'json' data: '_method': 'delete' success: (data) => + @redirectIfNeeded data.count @clearDone $this.closest('li') @updateBadges data @@ -54,3 +57,43 @@ class @Todos updateBadges: (data) -> $('.todos-pending .badge, .todos-pending-count').text data.count $('.todos-done .badge').text data.done_count + + getRenderedPages: -> + $('.gl-pagination .page').length + + getCurrentPage: -> + parseInt($.trim($('.gl-pagination .page.active').text())) + + redirectIfNeeded: (total) -> + currPages = @getRenderedPages() + currPage = @getCurrentPage() + + newPages = Math.ceil(total / PER_PAGE) + url = location.href # Includes query strings + + # Refresh if no remaining Todos + if !total + location.reload() + return + + # Do nothing if no pagination + return if !currPages + + # If new total of pages if different than we have now + if newPages isnt currPages + # Redirect to previous page if thereĀ“s one available + if currPages > 1 and currPage is currPages + url = @updateQueryStringParameter(url, 'page', currPages - 1) + + location.replace url + + updateQueryStringParameter: (uri, key, value) -> + separator = if uri.indexOf('?') isnt -1 then "&" else "?" + + # Matches key and value + regex = new RegExp("([?&])" + key + "=.*?(&|#|$)", "i") + + if uri.match(regex) + return uri.replace(regex, '$1' + key + "=" + value + '$2') + + uri + separator + key + "=" + value