Determine public API of SelectList

This commit is contained in:
Matt Colyer
2013-08-26 15:36:31 -07:00
parent 9521358c55
commit 696a54392e

View File

@@ -3,13 +3,12 @@ $ = require 'jquery'
Editor = require 'editor'
fuzzyFilter = require 'fuzzy-filter'
# Public: Provides an interface for users to make a selection from a list of
# Public: Provides a widget for users to make a selection from a list of
# choices.
module.exports =
class SelectList extends View
### Internal ###
# Private:
@content: ->
@div class: @viewClass(), =>
@subview 'miniEditor', new Editor(mini: true)
@@ -19,6 +18,7 @@ class SelectList extends View
@span class: 'badge', outlet: 'loadingBadge'
@ol outlet: 'list'
# Private:
@viewClass: -> 'select-list'
maxItems: Infinity
@@ -26,6 +26,7 @@ class SelectList extends View
inputThrottle: 50
cancelling: false
# Public:
initialize: ->
requireStylesheet 'select-list'
@@ -52,16 +53,19 @@ class SelectList extends View
@confirmSelection() if $(e.target).closest('li').hasClass('selected')
e.preventDefault()
# Private:
schedulePopulateList: ->
clearTimeout(@scheduleTimeout)
populateCallback = =>
@populateList() if @isOnDom()
@scheduleTimeout = setTimeout(populateCallback, @inputThrottle)
# Public:
setArray: (@array) ->
@populateList()
@setLoading()
# Public:
setError: (message='') ->
if message.length is 0
@error.text('').hide()
@@ -69,6 +73,7 @@ class SelectList extends View
@setLoading()
@error.text(message).show()
# Public:
setLoading: (message='') ->
if message.length is 0
@loading.text("")
@@ -79,9 +84,11 @@ class SelectList extends View
@loading.text(message)
@loadingArea.show()
# Public:
getFilterQuery: ->
@miniEditor.getText()
# Public:
populateList: ->
return unless @array?
@@ -105,24 +112,29 @@ class SelectList extends View
else
@setError(@getEmptyMessage(@array.length, filteredArray.length))
# Public:
getEmptyMessage: (itemCount, filteredItemCount) -> 'No matches found'
# Private:
selectPreviousItem: ->
item = @getSelectedItem().prev()
item = @list.find('li:last') unless item.length
@selectItem(item)
# Private:
selectNextItem: ->
item = @getSelectedItem().next()
item = @list.find('li:first') unless item.length
@selectItem(item)
# Public:
selectItem: (item) ->
return unless item.length
@list.find('.selected').removeClass('selected')
item.addClass 'selected'
@scrollToItem(item)
# Public:
scrollToItem: (item) ->
scrollTop = @list.scrollTop()
desiredTop = item.position().top + scrollTop
@@ -133,12 +145,15 @@ class SelectList extends View
else if desiredBottom > @list.scrollBottom()
@list.scrollBottom(desiredBottom)
# Public:
getSelectedItem: ->
@list.find('li.selected')
# Public:
getSelectedElement: ->
@getSelectedItem().data('select-list-element')
# Public:
confirmSelection: ->
element = @getSelectedElement()
if element?
@@ -146,22 +161,27 @@ class SelectList extends View
else
@cancel()
# Private:
attach: ->
@storeFocusedElement()
# Private:
storeFocusedElement: ->
@previouslyFocusedElement = $(':focus')
# Private:
restoreFocus: ->
if @previouslyFocusedElement?.isOnDom()
@previouslyFocusedElement.focus()
else
rootView.focus()
# Public:
cancelled: ->
@miniEditor.setText('')
@miniEditor.updateDisplay()
# Public:
cancel: ->
@list.empty()
@cancelling = true