%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/vendor/npm-asset/at.js/src/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/vendor/npm-asset/at.js/src/controller.coffee |
class Controller
uid: ->
(Math.random().toString(16)+"000000000").substr(2,8) + (new Date().getTime())
constructor: (@app, @at) ->
@$inputor = @app.$inputor
@id = @$inputor[0].id || this.uid()
@expectedQueryCBId = null
@setting = null
@query = null
@pos = 0
@range = null
if (@$el = $("#atwho-ground-#{@id}", @app.$el)).length == 0
@app.$el.append @$el = $("<div id='atwho-ground-#{@id}'></div>")
@model = new Model(this)
@view = new View(this)
init: (setting) ->
@setting = $.extend {}, @setting || $.fn.atwho.default, setting
@view.init()
@model.reload @setting.data
destroy: ->
this.trigger 'beforeDestroy'
@model.destroy()
@view.destroy()
@$el.remove()
callDefault: (funcName, args...) ->
try
DEFAULT_CALLBACKS[funcName].apply this, args
catch error
$.error "#{error} Or maybe At.js doesn't have function #{funcName}"
# Delegate custom `jQueryEvent` to the inputor
# This function will add `atwho` as namespace to every jQuery event
# and pass current context as the last param to it.
#
# @example
# this.trigger "roll_n_rock", [1,2,3,4]
#
# $inputor.on "rool_n_rock", (e, one, two, three, four) ->
# console.log one, two, three, four
#
# @param name [String] Event name
# @param data [Array] data to callback
trigger: (name, data=[]) ->
data.push this
alias = this.getOpt('alias')
eventName = if alias then "#{name}-#{alias}.atwho" else "#{name}.atwho"
@$inputor.trigger eventName, data
# Get callback either in settings which was set by plugin user or in default callbacks list.
#
# @param funcName [String] callback's name
# @return [Function] The callback.
callbacks: (funcName)->
this.getOpt("callbacks")[funcName] || DEFAULT_CALLBACKS[funcName]
# Because different registered at chars have different settings.
# so we should give their own for them.
#
# @param at [String] setting's at name
# @param default_value [?] return this if nothing is returned from current settings.
# @return [?] setting's value
getOpt: (at, default_value) ->
try
@setting[at]
catch e
null
insertContentFor: ($li) ->
tpl = this.getOpt('insertTpl')
data = $.extend {}, $li.data('item-data'), {'atwho-at': @at}
this.callbacks("tplEval").call(this, tpl, data, "onInsert")
# Render list view
#
# @param data [Array] The data
renderView: (data) ->
searchKey = this.getOpt("searchKey")
data = this.callbacks("sorter").call(this, @query.text, data[0..1000] , searchKey)
@view.render data[0...this.getOpt('limit')]
@arrayToDefaultHash: (data) ->
return data if not $.isArray data
for item in data
if $.isPlainObject item then item else name:item
# Searching!
lookUp: (e) ->
return if e && e.type == 'click' && !@getOpt('lookUpOnClick')
return if @getOpt('suspendOnComposing') and @app.isComposing
query = @catchQuery e
if not query
@expectedQueryCBId = null
return query
@app.setContextFor @at
if wait = this.getOpt('delay')
@_delayLookUp query, wait
else
@_lookUp query
query
_delayLookUp: (query, wait) ->
now = if Date.now then Date.now() else new Date().getTime()
@previousCallTime ||= now
remaining = wait - (now - @previousCallTime)
if 0 < remaining < wait
@previousCallTime = now
@_stopDelayedCall()
@delayedCallTimeout = setTimeout(=>
@previousCallTime = 0
@delayedCallTimeout = null
@_lookUp query
, wait)
else
@_stopDelayedCall()
@previousCallTime = 0 if @previousCallTime isnt now
@_lookUp query
_stopDelayedCall: ->
if @delayedCallTimeout
clearTimeout @delayedCallTimeout
@delayedCallTimeout = null
_generateQueryCBId: ->
return {};
_lookUp: (query) ->
_callback = (queryCBId, data) ->
# ensure only the latest instance of this function perform actions
if queryCBId isnt @expectedQueryCBId
return
if data and data.length > 0
this.renderView @constructor.arrayToDefaultHash data
else
@view.hide()
@expectedQueryCBId = @_generateQueryCBId()
@model.query query.text, $.proxy(_callback, this, @expectedQueryCBId)