111 lines
2.5 KiB
CoffeeScript
111 lines
2.5 KiB
CoffeeScript
|
class @Todos
|
||
|
constructor: (opts = {}) ->
|
||
|
{
|
||
|
@el = $('.js-todos-options')
|
||
|
} = opts
|
||
|
|
||
|
@perPage = @el.data('perPage')
|
||
|
|
||
|
@clearListeners()
|
||
|
@initBtnListeners()
|
||
|
|
||
|
clearListeners: ->
|
||
|
$('.done-todo').off('click')
|
||
|
$('.js-todos-mark-all').off('click')
|
||
|
$('.todo').off('click')
|
||
|
|
||
|
initBtnListeners: ->
|
||
|
$('.done-todo').on('click', @doneClicked)
|
||
|
$('.js-todos-mark-all').on('click', @allDoneClicked)
|
||
|
$('.todo').on('click', @goToTodoUrl)
|
||
|
|
||
|
doneClicked: (e) =>
|
||
|
e.preventDefault()
|
||
|
e.stopImmediatePropagation()
|
||
|
|
||
|
$this = $(e.currentTarget)
|
||
|
$this.disable()
|
||
|
|
||
|
$.ajax
|
||
|
type: 'POST'
|
||
|
url: $this.attr('href')
|
||
|
dataType: 'json'
|
||
|
data: '_method': 'delete'
|
||
|
success: (data) =>
|
||
|
@redirectIfNeeded data.count
|
||
|
@clearDone $this.closest('li')
|
||
|
@updateBadges data
|
||
|
|
||
|
allDoneClicked: (e) =>
|
||
|
e.preventDefault()
|
||
|
e.stopImmediatePropagation()
|
||
|
|
||
|
$this = $(e.currentTarget)
|
||
|
$this.disable()
|
||
|
|
||
|
$.ajax
|
||
|
type: 'POST'
|
||
|
url: $this.attr('href')
|
||
|
dataType: 'json'
|
||
|
data: '_method': 'delete'
|
||
|
success: (data) =>
|
||
|
$this.remove()
|
||
|
$('.js-todos-list').remove()
|
||
|
@updateBadges data
|
||
|
|
||
|
clearDone: ($row) ->
|
||
|
$ul = $row.closest('ul')
|
||
|
$row.remove()
|
||
|
|
||
|
if not $ul.find('li').length
|
||
|
$ul.parents('.panel').remove()
|
||
|
|
||
|
updateBadges: (data) ->
|
||
|
$('.todos-pending .badge, .todos-pending-count').text data.count
|
||
|
$('.todos-done .badge').text data.done_count
|
||
|
|
||
|
getTotalPages: ->
|
||
|
@el.data('totalPages')
|
||
|
|
||
|
getCurrentPage: ->
|
||
|
@el.data('currentPage')
|
||
|
|
||
|
getTodosPerPage: ->
|
||
|
@el.data('perPage')
|
||
|
|
||
|
redirectIfNeeded: (total) ->
|
||
|
currPages = @getTotalPages()
|
||
|
currPage = @getCurrentPage()
|
||
|
|
||
|
# Refresh if no remaining Todos
|
||
|
if not total
|
||
|
location.reload()
|
||
|
return
|
||
|
|
||
|
# Do nothing if no pagination
|
||
|
return if not currPages
|
||
|
|
||
|
newPages = Math.ceil(total / @getTodosPerPage())
|
||
|
url = location.href # Includes query strings
|
||
|
|
||
|
# If new total of pages is 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
|
||
|
pageParams =
|
||
|
page: currPages - 1
|
||
|
url = gl.utils.mergeUrlParams(pageParams, url)
|
||
|
|
||
|
Turbolinks.visit(url)
|
||
|
|
||
|
goToTodoUrl: (e)->
|
||
|
todoLink = $(this).data('url')
|
||
|
return unless todoLink
|
||
|
|
||
|
# Allow Meta-Click or Mouse3-click to open in a new tab
|
||
|
if e.metaKey or e.which is 2
|
||
|
e.preventDefault()
|
||
|
window.open(todoLink,'_blank')
|
||
|
else
|
||
|
Turbolinks.visit(todoLink)
|