| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- # For sending event data to metabase and google analytics
- # ---
- # by default,
- # event not sent to MB.
- # for MB, add event-tracking-mb='true'
- # by default, event sent to MB via sendMB
- # event not sent to GA.
- # for GA, add event-tracking-ga attribute, where the value is the GA category
- # Either GA or MB can use the attribute event-tracking-send-once='true' to
- # send event just once
- # MB will use the key and GA will use the action to determine if the event
- # has been sent
- # event-tracking-trigger attribute is required to send event
- isInViewport = (element) ->
- elTop = element.offset().top
- elBtm = elTop + element.outerHeight()
- viewportTop = $(window).scrollTop()
- viewportBtm = viewportTop + $(window).height()
- elBtm > viewportTop && elTop < viewportBtm
- define [
- 'base'
- ], (App) ->
- App.directive 'eventTracking', ['event_tracking', (event_tracking) ->
- return {
- scope: {
- eventTracking: '@',
- eventSegmentation: '=?'
- }
- link: (scope, element, attrs) ->
- sendGA = attrs.eventTrackingGa || false
- sendMB = attrs.eventTrackingMb || false
- sendMBFunction = if attrs.eventTrackingSendOnce then 'sendMBOnce' else 'sendMB'
- sendGAFunction = if attrs.eventTrackingSendOnce then 'sendGAOnce' else 'send'
- segmentation = scope.eventSegmentation || {}
- segmentation.page = window.location.pathname
- sendEvent = (scrollEvent) ->
- ###
- @param {boolean} scrollEvent Use to unbind scroll event
- ###
- if sendMB
- event_tracking[sendMBFunction] scope.eventTracking, segmentation
- if sendGA
- event_tracking[sendGAFunction] attrs.eventTrackingGa, attrs.eventTrackingAction || scope.eventTracking, attrs.eventTrackingLabel || ''
- if scrollEvent
- $(window).unbind('resize scroll')
- if attrs.eventTrackingTrigger == 'load'
- sendEvent()
- else if attrs.eventTrackingTrigger == 'click'
- element.on 'click', (e) ->
- sendEvent()
- else if attrs.eventTrackingTrigger == 'hover'
- timer = null
- timeoutAmt = 500
- if attrs.eventHoverAmt
- timeoutAmt = parseInt(attrs.eventHoverAmt, 10)
- element.on 'mouseenter', () ->
- timer = setTimeout((-> sendEvent()), timeoutAmt)
- return
- .on 'mouseleave', () ->
- clearTimeout(timer)
- else if attrs.eventTrackingTrigger == 'scroll'
- if !event_tracking.eventInCache(scope.eventTracking)
- $(window).on 'resize scroll', () ->
- _.throttle(
- if isInViewport(element) && !event_tracking.eventInCache(scope.eventTracking)
- sendEvent(true)
- , 500)
- }
- ]
|