Skip to content

Commit

Permalink
[api] ShiftCheckbox
Browse files Browse the repository at this point in the history
  • Loading branch information
doublerebel committed Oct 7, 2017
0 parents commit f738182
Showing 1 changed file with 82 additions and 0 deletions.
82 changes: 82 additions & 0 deletions src/spine-shift-checkbox.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
Spine = require "spine"


class ShiftCheckbox extends Spine.Controller
selectAllClass: "scb-select-all"
selectedClass: "scb-selected"
lastIndex: -1

_targetFromEvent: (e) ->
$ e.target

allCheckboxes: ->
@$ ":checkbox"

checkboxes: ->
@allCheckboxes().not ".#{@selectAllClass}"

checked: ->
@checkboxes().filter ":checked"

selectAll: (e) ->
@allCheckboxes().prop(checked: true)
.trigger "change"

deselectAll: (e) ->
@allCheckboxes().prop(checked: false)
.trigger "change"

selectOrDeselectAll: (e) ->
checkboxes = @checkboxes()
if (checkboxes.not ":checked").length then @selectAll e
else @deselectAll e
@trigger "change", checkboxes

selectOneOrRange: (e) ->
$target = @_targetFromEvent e
checkboxes = @checkboxes()
index = checkboxes.index $target
changed = $target

if e.shiftKey and @lastIndex isnt -1
di = if index > @lastIndex then 1 else -1
i = @lastIndex
while i isnt index
checkbox = checkboxes.eq i
checkbox.prop checked: "checked"
checkbox.trigger "change"
changed.add checkbox
i += di

@lastIndex = index
@trigger "change", changed

selectOneOrMany: (e) ->
$target = @_targetFromEvent e
if $target.hasClass @selectAllClass then @selectOrDeselectAll e
else @selectOneOrRange e

updateParentClass: (e) ->
$target = @_targetFromEvent e
return if $target.hasClass @selectAllClass

$parent = $target.closest @parentSelector
if $target.is ":checked" then $parent.addClass @selectedClass
else $parent.removeClass @selectedClass

events:
"click :checkbox": "selectOneOrMany"
"change :checkbox": "updateParentClass"

constructor: (options, @callback) ->
super

selected: ->
(@$ @parentSelector).has(":checkbox:checked").not(":has(.#{@selectAllClass})")

destroy: ->
(@$ @parentSelector).has(":checkbox").removeClass @selectedClass
@stopListening()


module.exports = ShiftCheckbox

0 comments on commit f738182

Please sign in to comment.