From 90a8564d219af079c8a1785c57b8e9a0d3e79820 Mon Sep 17 00:00:00 2001 From: Jacob Schatz Date: Thu, 31 Mar 2016 14:48:12 -0400 Subject: [PATCH 01/11] Add instance and event manager --- app/assets/javascripts/glpage.js.coffee | 48 +++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 app/assets/javascripts/glpage.js.coffee diff --git a/app/assets/javascripts/glpage.js.coffee b/app/assets/javascripts/glpage.js.coffee new file mode 100644 index 000000000000..1ce33ed96fa4 --- /dev/null +++ b/app/assets/javascripts/glpage.js.coffee @@ -0,0 +1,48 @@ +window.GlPage = { + instances: {} + events: [] + pages: {} + new: (name) -> + @pages[name] = { + instances: {} + events: [] + use: (instance, name) -> + generated = name || Math.random().toString(36).substring(7) + @instances[generated] = { + instance: instance + name: generated + } + generated + + get: (name) -> + @instances[name].instance + + on: (el, args...) -> + # turn args into array + $el = $(el) + @events.push({ + el: el, + args: args + }) + $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) + ) + + remove: (name) -> + delete @instances[name] + + removeAll: -> + @instances = {} + @allOff() + @events = [] + return + } +} \ No newline at end of file -- GitLab From 4beb3b084abfe91b193f8785e52aac2b37a88adc Mon Sep 17 00:00:00 2001 From: Jacob Schatz Date: Thu, 31 Mar 2016 14:54:34 -0400 Subject: [PATCH 02/11] Remove comment --- app/assets/javascripts/glpage.js.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/app/assets/javascripts/glpage.js.coffee b/app/assets/javascripts/glpage.js.coffee index 1ce33ed96fa4..ecae113c79a9 100644 --- a/app/assets/javascripts/glpage.js.coffee +++ b/app/assets/javascripts/glpage.js.coffee @@ -18,7 +18,6 @@ window.GlPage = { @instances[name].instance on: (el, args...) -> - # turn args into array $el = $(el) @events.push({ el: el, -- GitLab From c666ccb8890f82ad38d700f92ec35a13c33dda57 Mon Sep 17 00:00:00 2001 From: Jacob Schatz Date: Thu, 31 Mar 2016 15:06:12 -0400 Subject: [PATCH 03/11] Add shortcut methods --- app/assets/javascripts/glpage.js.coffee | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/app/assets/javascripts/glpage.js.coffee b/app/assets/javascripts/glpage.js.coffee index ecae113c79a9..82fe347013b3 100644 --- a/app/assets/javascripts/glpage.js.coffee +++ b/app/assets/javascripts/glpage.js.coffee @@ -44,4 +44,22 @@ window.GlPage = { @events = [] return } + + get: (name) -> + @pages[name] + + use: (name, instance, name) -> + @pages[name].use(instance, name) + + on: (name, el, args...) -> + @pages[name].on(el, args) + + off: (name, el, args...) -> + @pages[name].off(el, args) + + allOff: (name) -> + @pages[name].allOff() + + removeAll: (name) -> + @pages[name].removeAll() } \ No newline at end of file -- GitLab From 0516a9557a12868afbc30df777c79fbbc8a6ec71 Mon Sep 17 00:00:00 2001 From: Jacob Schatz Date: Thu, 31 Mar 2016 15:50:26 -0400 Subject: [PATCH 04/11] Add the helper to the object --- app/assets/javascripts/glpage.js.coffee | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/app/assets/javascripts/glpage.js.coffee b/app/assets/javascripts/glpage.js.coffee index 82fe347013b3..0f6b119ca2ee 100644 --- a/app/assets/javascripts/glpage.js.coffee +++ b/app/assets/javascripts/glpage.js.coffee @@ -47,19 +47,4 @@ window.GlPage = { get: (name) -> @pages[name] - - use: (name, instance, name) -> - @pages[name].use(instance, name) - - on: (name, el, args...) -> - @pages[name].on(el, args) - - off: (name, el, args...) -> - @pages[name].off(el, args) - - allOff: (name) -> - @pages[name].allOff() - - removeAll: (name) -> - @pages[name].removeAll() } \ No newline at end of file -- GitLab From 344f575fcf34113d8c15cd0413f4f30e0815829c Mon Sep 17 00:00:00 2001 From: Jacob Schatz Date: Thu, 31 Mar 2016 16:04:27 -0400 Subject: [PATCH 05/11] Return the instance obj itself on use --- app/assets/javascripts/glpage.js.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/glpage.js.coffee b/app/assets/javascripts/glpage.js.coffee index 0f6b119ca2ee..26767c45ea4c 100644 --- a/app/assets/javascripts/glpage.js.coffee +++ b/app/assets/javascripts/glpage.js.coffee @@ -12,7 +12,7 @@ window.GlPage = { instance: instance name: generated } - generated + @instances[generated] get: (name) -> @instances[name].instance -- GitLab From 15966e20179c54729cb9fd1e3130412ae8fdeea8 Mon Sep 17 00:00:00 2001 From: Arinde Eniola Date: Wed, 13 Apr 2016 13:40:42 +0100 Subject: [PATCH 06/11] extend the on and off methods in the event manager --- app/assets/javascripts/glpage.js.coffee | 78 +++++++++++++++++++------ 1 file changed, 61 insertions(+), 17 deletions(-) diff --git a/app/assets/javascripts/glpage.js.coffee b/app/assets/javascripts/glpage.js.coffee index 26767c45ea4c..900deeed0e0c 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() -- GitLab From 2aed900d894ddf033c102d4e0568d76ddb912709 Mon Sep 17 00:00:00 2001 From: Arinde Eniola Date: Wed, 13 Apr 2016 14:50:24 +0100 Subject: [PATCH 07/11] make changes to how the manager use class instances --- app/assets/javascripts/glpage.js.coffee | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/app/assets/javascripts/glpage.js.coffee b/app/assets/javascripts/glpage.js.coffee index 900deeed0e0c..fd0af84d4647 100644 --- a/app/assets/javascripts/glpage.js.coffee +++ b/app/assets/javascripts/glpage.js.coffee @@ -1,18 +1,16 @@ window.GlPage = { - instances: {} - events: [] pages: {} new: (name) -> @pages[name] = { instances: {} events: [] - use: (instance, name) -> - generated = name || Math.random().toString(36).substring(7) - @instances[generated] = { - instance: instance - name: generated - } - @instances[generated] + + use: (args...) -> + if args.length > 1 + for className in args + @instances[className] = new className() + else if args.length is 1 + @instances[args[0]] = new args[0]() delegate: (targetsObj) -> (e, data) -> @@ -31,7 +29,7 @@ window.GlPage = { return get: (name) -> - @instances[name].instance + @instances[name] on: (selector, eventType, handler) -> $el = $(selector) @@ -84,7 +82,7 @@ window.GlPage = { removeAll: -> @instances = {} - @allOff() + @off() @events = [] return } -- GitLab From c11d70425072645d7c5387c2bb53dfb39b6bb910 Mon Sep 17 00:00:00 2001 From: Arinde Eniola Date: Wed, 13 Apr 2016 15:41:36 +0100 Subject: [PATCH 08/11] add a trigger handler for tiggering events --- app/assets/javascripts/glpage.js.coffee | 28 +++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/glpage.js.coffee b/app/assets/javascripts/glpage.js.coffee index fd0af84d4647..bf6c293e5c0a 100644 --- a/app/assets/javascripts/glpage.js.coffee +++ b/app/assets/javascripts/glpage.js.coffee @@ -31,6 +31,26 @@ window.GlPage = { get: (name) -> @instances[name] + trigger: (selector, eventType, data) -> + $element = type = data = event = defaultFunc = undefined + + $element = selector + event = eventType + + if not data + data = {} + + if event.defaultCallback + defaultFunc = event.defaultCallback + event = $.Event(event.type) + + type = event.type or event + + $element.trigger((event or type), data) + + if defaultFunc and not event.isDefaultPrevented() + defaultFunc.call($element, event, data) + on: (selector, eventType, handler) -> $el = $(selector) callback = undefined @@ -56,7 +76,7 @@ window.GlPage = { off: (args...) -> $el = type = callback = undefined - lastIndex = args.length - 1 + lastArgIndex = args.length - 1 if args.length is 0 @events.forEach((event) => @@ -64,9 +84,9 @@ window.GlPage = { $el.off(event.type, event.callback) ) - if typeof args[lastIndex] is 'function' - callback = args[lastIndex] - lastIndex -= 1 + if typeof args[lastArgIndex] is 'function' + callback = args[lastArgIndex] + lastArgIndex -= 1 if lastIndex == 1 $el = $(args[0]) -- GitLab From 5a10f38aafb0eb230bd1fe9db766d1b6289c4823 Mon Sep 17 00:00:00 2001 From: Arinde Eniola Date: Wed, 13 Apr 2016 18:13:55 +0100 Subject: [PATCH 09/11] fix some bugs --- app/assets/javascripts/glpage.js.coffee | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/glpage.js.coffee b/app/assets/javascripts/glpage.js.coffee index bf6c293e5c0a..0b28e42d4cb5 100644 --- a/app/assets/javascripts/glpage.js.coffee +++ b/app/assets/javascripts/glpage.js.coffee @@ -14,13 +14,14 @@ window.GlPage = { delegate: (targetsObj) -> (e, data) -> + $currentTarget = $(e.currentTarget) $target = $(e.target) for selector, callback of targetsObj - child = $target.find(selector) - if !e.isPropagationStopped() && child.length + children = $currentTarget.find(selector) + if !e.isPropagationStopped() && children.length data ?= {} - e.currentTarget = data.el = child[0] + e.currentTarget = data.el = children[0] callback.apply(e.currentTarget, [e, data]) triggerEventAlias: (targetEvent) -> @@ -67,7 +68,7 @@ window.GlPage = { throw new Error 'Unable to register event #{type}, handler should be a function, object or string' @events.push({ - el: el, + el: $el, type: eventType, handler: callback }) @@ -88,7 +89,7 @@ window.GlPage = { callback = args[lastArgIndex] lastArgIndex -= 1 - if lastIndex == 1 + if lastArgIndex == 1 $el = $(args[0]) type = args[1] -- GitLab From 741b8fe127a4913796ae299fb862d9612c12c825 Mon Sep 17 00:00:00 2001 From: Arinde Eniola Date: Thu, 14 Apr 2016 18:58:58 +0100 Subject: [PATCH 10/11] make some changes --- app/assets/javascripts/glpage.js.coffee | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/glpage.js.coffee b/app/assets/javascripts/glpage.js.coffee index 0b28e42d4cb5..46554f0e6078 100644 --- a/app/assets/javascripts/glpage.js.coffee +++ b/app/assets/javascripts/glpage.js.coffee @@ -20,7 +20,7 @@ window.GlPage = { for selector, callback of targetsObj children = $currentTarget.find(selector) if !e.isPropagationStopped() && children.length - data ?= {} + data = {} if not data e.currentTarget = data.el = children[0] callback.apply(e.currentTarget, [e, data]) @@ -38,8 +38,7 @@ window.GlPage = { $element = selector event = eventType - if not data - data = {} + data = {} if not data if event.defaultCallback defaultFunc = event.defaultCallback -- GitLab From eee8916e6b1c21051ad5a532a613b703c398ef48 Mon Sep 17 00:00:00 2001 From: Arinde Eniola Date: Thu, 14 Apr 2016 23:28:36 +0100 Subject: [PATCH 11/11] some changes --- app/assets/javascripts/glpage.js.coffee | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/glpage.js.coffee b/app/assets/javascripts/glpage.js.coffee index 46554f0e6078..3c753b844a70 100644 --- a/app/assets/javascripts/glpage.js.coffee +++ b/app/assets/javascripts/glpage.js.coffee @@ -11,6 +11,8 @@ window.GlPage = { @instances[className] = new className() else if args.length is 1 @instances[args[0]] = new args[0]() + else + throw new Error 'You must provide at least one argument' delegate: (targetsObj) -> (e, data) -> @@ -79,7 +81,7 @@ window.GlPage = { lastArgIndex = args.length - 1 if args.length is 0 - @events.forEach((event) => + $.each(@events, (event) => $el = $(event.el) $el.off(event.type, event.callback) ) -- GitLab