Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArinde Eniola <eniolaarinde1@gmail.com>2016-04-13 15:40:42 +0300
committerArinde Eniola <eniolaarinde1@gmail.com>2016-04-13 15:41:25 +0300
commit15966e20179c54729cb9fd1e3130412ae8fdeea8 (patch)
treec8ff9701a42c5bafd8bb156cb5c5c91714481478
parent344f575fcf34113d8c15cd0413f4f30e0815829c (diff)
extend the on and off methods in the event manager
-rw-r--r--app/assets/javascripts/glpage.js.coffee78
1 files changed, 61 insertions, 17 deletions
diff --git a/app/assets/javascripts/glpage.js.coffee b/app/assets/javascripts/glpage.js.coffee
index 26767c45ea4..900deeed0e0 100644
--- a/app/assets/javascripts/glpage.js.coffee
+++ b/app/assets/javascripts/glpage.js.coffee
@@ -13,31 +13,75 @@ window.GlPage = {
name: generated
}
@instances[generated]
-
+
+ delegate: (targetsObj) ->
+ (e, data) ->
+ $target = $(e.target)
+
+ for selector, callback of targetsObj
+ child = $target.find(selector)
+ if !e.isPropagationStopped() && child.length
+ data ?= {}
+ e.currentTarget = data.el = child[0]
+ callback.apply(e.currentTarget, [e, data])
+
+ triggerEventAlias: (targetEvent) ->
+ (e, data) ->
+ $(e.target).trigger targetEvent, data
+ return
+
get: (name) ->
@instances[name].instance
-
- on: (el, args...) ->
- $el = $(el)
+
+ on: (selector, eventType, handler) ->
+ $el = $(selector)
+ callback = undefined
+ type = eventType
+
+ if typeof handler is 'string'
+ callback = @triggerEventAlias(handler)
+ else if typeof handler is 'object'
+ callback = @delegate(handler)
+ else
+ callback = handler
+
+ if typeof callback isnt 'function'
+ throw new Error 'Unable to register event #{type}, handler should be a function, object or string'
+
@events.push({
el: el,
- args: args
+ type: eventType,
+ handler: callback
})
- $el.on.apply($el, args)
-
- off: (el, args...) ->
- $el = $(el)
- $el.off.apply($el, args)
-
- allOff: ->
- @events.forEach((event) =>
- $el = $(event.el)
- $el.off.apply($el, event.args)
- )
+
+ $el.on(type, callback)
+
+ off: (args...) ->
+ $el = type = callback = undefined
+ lastIndex = args.length - 1
+
+ if args.length is 0
+ @events.forEach((event) =>
+ $el = $(event.el)
+ $el.off(event.type, event.callback)
+ )
+
+ if typeof args[lastIndex] is 'function'
+ callback = args[lastIndex]
+ lastIndex -= 1
+
+ if lastIndex == 1
+ $el = $(args[0])
+ type = args[1]
+
+ if callback
+ $el.off(type, callback)
+ else
+ $el.off(type)
remove: (name) ->
delete @instances[name]
-
+
removeAll: ->
@instances = {}
@allOff()