mirror of
https://github.com/overleaf/overleaf.git
synced 2025-03-06 09:01:43 +00:00
added basic new a/b test funnely framework
This commit is contained in:
parent
f3c04feda7
commit
62f207c368
3 changed files with 49 additions and 2 deletions
|
@ -43,7 +43,7 @@ html(itemscope, itemtype='http://schema.org/Product')
|
||||||
|
|
||||||
script(type="text/javascript").
|
script(type="text/javascript").
|
||||||
window.csrfToken = "#{csrfToken}";
|
window.csrfToken = "#{csrfToken}";
|
||||||
|
|
||||||
block scripts
|
block scripts
|
||||||
script(src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js")
|
script(src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js")
|
||||||
script(src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.14/angular.min.js")
|
script(src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.14/angular.min.js")
|
||||||
|
@ -54,6 +54,7 @@ html(itemscope, itemtype='http://schema.org/Product')
|
||||||
jsPath: '#{jsPath}'
|
jsPath: '#{jsPath}'
|
||||||
};
|
};
|
||||||
window.systemMessages = !{JSON.stringify(systemMessages).replace(/\//g, '\\/')};
|
window.systemMessages = !{JSON.stringify(systemMessages).replace(/\//g, '\\/')};
|
||||||
|
window.ab = {}
|
||||||
|
|
||||||
- if (typeof(settings.algolia) != "undefined")
|
- if (typeof(settings.algolia) != "undefined")
|
||||||
script.
|
script.
|
||||||
|
@ -125,5 +126,8 @@ html(itemscope, itemtype='http://schema.org/Product')
|
||||||
category: "questions"
|
category: "questions"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
span(ng-controller="AbTestController")
|
||||||
|
script.
|
||||||
|
window.ab.plan14 = {step:1}
|
||||||
|
|
||||||
|
|
||||||
|
|
42
services/web/public/coffee/analytics/AbTestingManager.coffee
Normal file
42
services/web/public/coffee/analytics/AbTestingManager.coffee
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
define [
|
||||||
|
"base"
|
||||||
|
"libs/md5"
|
||||||
|
], (App) ->
|
||||||
|
|
||||||
|
App.factory "abTestManager", ($http, ipCookie) ->
|
||||||
|
|
||||||
|
_buildCookieKey = (testName)-> "sl_abt_#{testName}"
|
||||||
|
|
||||||
|
_getTestCookie = (testName)->
|
||||||
|
cookieKey = _buildCookieKey(testName)
|
||||||
|
return ipCookie(cookieKey)
|
||||||
|
|
||||||
|
_persistCookieStep = (testName, newStep)->
|
||||||
|
ipCookie(_buildCookieKey(testName), step:newStep, {expires:10})
|
||||||
|
ga('send', 'event', 'ab_tests', testName, {step:newStep})
|
||||||
|
|
||||||
|
_checkIfStepIsNext = (cookieStep, newStep)->
|
||||||
|
if !cookieStep? and newStep != 0
|
||||||
|
return false
|
||||||
|
else if newStep == 0
|
||||||
|
return true
|
||||||
|
else if (cookieStep+1) == newStep
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
return false
|
||||||
|
|
||||||
|
processTestWithStep: processTestWithStep = (testName, newStep)->
|
||||||
|
currentCookieStep = _getTestCookie(testName)?.step
|
||||||
|
if _checkIfStepIsNext(currentCookieStep, newStep)
|
||||||
|
_persistCookieStep(testName, newStep)
|
||||||
|
|
||||||
|
getABTestBucket: getABTestBucket = (user_id, test_name, buckets) ->
|
||||||
|
hash = CryptoJS.MD5("#{user_id}:#{test_name}")
|
||||||
|
bucketIndex = parseInt(hash.toString().slice(0,2), 16) % (buckets?.length or 2)
|
||||||
|
return buckets[bucketIndex]
|
||||||
|
|
||||||
|
App.controller "AbTestController", ($scope, abTestManager)->
|
||||||
|
testKeys = _.keys(window.ab)
|
||||||
|
|
||||||
|
_.each testKeys, (testName)->
|
||||||
|
abTestManager.processTestWithStep testName, window.ab[testName]?.step
|
|
@ -12,6 +12,7 @@ define [
|
||||||
"main/translations"
|
"main/translations"
|
||||||
"main/subscription-dashboard"
|
"main/subscription-dashboard"
|
||||||
"main/annual-upgrade"
|
"main/annual-upgrade"
|
||||||
|
"analytics/AbTestingmanager"
|
||||||
"directives/asyncForm"
|
"directives/asyncForm"
|
||||||
"directives/stopPropagation"
|
"directives/stopPropagation"
|
||||||
"directives/focus"
|
"directives/focus"
|
||||||
|
|
Loading…
Reference in a new issue