summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/todos.js.coffee
blob: 08b29bd821439810a5d317e37b34f689210a123d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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)

      location.replace url

  goToTodoUrl: (e)->
    todoLink = $(this).data('url')
    if e.metaKey
      e.preventDefault()
      window.open(todoLink,'_blank')
    else
      Turbolinks.visit(todoLink)