Ejegg has uploaded a new change for review.
https://gerrit.wikimedia.org/r/169236
Change subject: Add log out button
......................................................................
Add log out button
Change-Id: I29b69d735ff411cf50e507812df1f4d8c8b34052
---
M dist/index.html
M dist/js.manifest.json
R dist/scripts-59c9511f.js
M routes/data.js
M server.js
M src/components/nav-bar/nav-bar.html
6 files changed, 10 insertions(+), 5 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/wikimedia/fundraising/dash
refs/changes/36/169236/1
diff --git a/dist/index.html b/dist/index.html
index a803c4f..ee48aad 100644
--- a/dist/index.html
+++ b/dist/index.html
@@ -3,7 +3,7 @@
<head>
<link rel="stylesheet" href="style-60b26a8d.css">
- <script src="scripts-6ddfc5ac.js"></script>
+ <script src="scripts-59c9511f.js"></script>
</head>
<body>
diff --git a/dist/js.manifest.json b/dist/js.manifest.json
index 2738de5..0655c2e 100755
--- a/dist/js.manifest.json
+++ b/dist/js.manifest.json
@@ -1,4 +1,4 @@
{
"date-pickers.js": "date-pickers-d41d8cd9.js",
- "scripts.js": "scripts-6ddfc5ac.js"
+ "scripts.js": "scripts-59c9511f.js"
}
\ No newline at end of file
diff --git a/dist/scripts-6ddfc5ac.js b/dist/scripts-59c9511f.js
similarity index 99%
rename from dist/scripts-6ddfc5ac.js
rename to dist/scripts-59c9511f.js
index 3ab9798..96e3a72 100755
--- a/dist/scripts-6ddfc5ac.js
+++ b/dist/scripts-59c9511f.js
@@ -61,7 +61,7 @@
* see: http://github.com/requirejs/text for details
*/
define("text",["module"],function(t){var
e,n,i,r,o,s=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],a=/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,l=/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im,u="undefined"!=typeof
location&&location.href,c=u&&location.protocol&&location.protocol.replace(/\:/,""),d=u&&location.hostname,h=u&&(location.port||void
0),p={},f=t.config&&t.config()||{};return
e={version:"2.0.12",strip:function(t){if(t){t=t.replace(a,"");var
e=t.match(l);e&&(t=e[1])}else t="";return t},jsEscape:function(t){return
t.replace(/(['\\])/g,"\\$1").replace(/[\f]/g,"\\f").replace(/[\b]/g,"\\b").replace(/[\n]/g,"\\n").replace(/[\t]/g,"\\t").replace(/[\r]/g,"\\r").replace(/[\u2028]/g,"\\u2028").replace(/[\u2029]/g,"\\u2029")},createXhr:f.createXhr||function(){var
t,e,n;if("undefined"!=typeof XMLHttpRequest)return new
XMLHttpRequest;if("undefined"!=typeof
ActiveXObject)for(e=0;3>e;e+=1){n=s[e];try{t=new
ActiveXObject(n)}catch(i){}if(t){s=[n];break}}return
t},parseName:function(t){var
e,n,i,r=!1,o=t.indexOf("."),s=0===t.indexOf("./")||0===t.indexOf("../");return-1!==o&&(!s||o>1)?(e=t.substring(0,o),n=t.substring(o+1,t.length)):e=t,i=n||e,o=i.indexOf("!"),-1!==o&&(r="strip"===i.substring(o+1),i=i.substring(0,o),n?n=i:e=i),{moduleName:e,ext:n,strip:r}},xdRegExp:/^((\w+)\:)?\/\/([^\/\\]+)/,useXhr:function(t,n,i,r){var
o,s,a,l=e.xdRegExp.exec(t);return
l?(o=l[2],s=l[3],s=s.split(":"),a=s[1],s=s[0],!(o&&o!==n||s&&s.toLowerCase()!==i.toLowerCase()||(a||s)&&a!==r)):!0},finishLoad:function(t,n,i,r){i=n?e.strip(i):i,f.isBuild&&(p[t]=i),r(i)},load:function(t,n,i,r){if(r&&r.isBuild&&!r.inlineText)return
void i();f.isBuild=r&&r.isBuild;var
o=e.parseName(t),s=o.moduleName+(o.ext?"."+o.ext:""),a=n.toUrl(s),l=f.useXhr||e.useXhr;//!strip
part to avoid file system issues.
-return 0===a.indexOf("empty:")?void
i():void(!u||l(a,c,d,h)?e.get(a,function(n){e.finishLoad(t,o.strip,n,i)},function(t){i.error&&i.error(t)}):n([s],function(t){e.finishLoad(o.moduleName+"."+o.ext,o.strip,t,i)}))},write:function(t,n,i){if(p.hasOwnProperty(n)){var
r=e.jsEscape(p[n]);i.asModule(t+"!"+n,"define(function () { return
'"+r+"';});\n")}},writeFile:function(t,n,i,r,o){var
s=e.parseName(n),a=s.ext?"."+s.ext:"",l=s.moduleName+a,u=i.toUrl(s.moduleName+a)+".js";e.load(l,i,function(){var
n=function(t){return r(u,t)};n.asModule=function(t,e){return
r.asModule(t,u,e)},e.write(t,l,n,o)},o)}},"node"===f.env||!f.env&&"undefined"!=typeof
process&&process.versions&&process.versions.node&&!process.versions["node-webkit"]?(n=require.nodeRequire("fs"),e.get=function(t,e,i){try{var
r=n.readFileSync(t,"utf8");0===r.indexOf("")&&(r=r.substring(1)),e(r)}catch(o){i&&i(o)}}):"xhr"===f.env||!f.env&&e.createXhr()?e.get=function(t,n,i,r){var
o,s=e.createXhr();if(s.open("GET",t,!0),r)for(o in
r)r.hasOwnProperty(o)&&s.setRequestHeader(o.toLowerCase(),r[o]);f.onXhr&&f.onXhr(s,t),s.onreadystatechange=function(){var
e,r;4===s.readyState&&(e=s.status||0,e>399&&600>e?(r=new Error(t+" HTTP
status:
"+e),r.xhr=s,i&&i(r)):n(s.responseText),f.onXhrComplete&&f.onXhrComplete(s,t))},s.send(null)}:"rhino"===f.env||!f.env&&"undefined"!=typeof
Packages&&"undefined"!=typeof java?e.get=function(t,e){var n,i,r="utf-8",o=new
java.io.File(t),s=java.lang.System.getProperty("line.separator"),a=new
java.io.BufferedReader(new java.io.InputStreamReader(new
java.io.FileInputStream(o),r)),l="";try{for(n=new
java.lang.StringBuffer,i=a.readLine(),i&&i.length()&&65279===i.charAt(0)&&(i=i.substring(1)),null!==i&&n.append(i);null!==(i=a.readLine());)n.append(s),n.append(i);l=String(n.toString())}finally{a.close()}e(l)}:("xpconnect"===f.env||!f.env&&"undefined"!=typeof
Components&&Components.classes&&Components.interfaces)&&(i=Components.classes,r=Components.interfaces,Components.utils["import"]("resource://gre/modules/FileUtils.jsm"),o="@mozilla.org/windows-registry-key;1"in
i,e.get=function(t,e){var n,s,a,l={};o&&(t=t.replace(/\//g,"\\")),a=new
FileUtils.File(t);try{n=i["@mozilla.org/network/file-input-stream;1"].createInstance(r.nsIFileInputStream),n.init(a,1,0,!1),s=i["@mozilla.org/intl/converter-input-stream;1"].createInstance(r.nsIConverterInputStream),s.init(n,"utf-8",n.available(),r.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER),s.readString(n.available(),l),s.close(),n.close(),e(l.value)}catch(u){throw
new Error((a&&a.path||"")+":
"+u)}}),e}),define("text!components/nav-bar/nav-bar.html",[],function(){return'<div
id="navContainer">\n <div class="boxedIcon" id="showNavMenu"
data-bind="click: showNav"><i class="fa fa-th-list"></i></div>\n <div
class="navWrapper">\n <div class="row text-center">\n
<h2 class=\'titlebrand\'>Dash</h2>\n </div>\n\n <div
class="row sidebar-nav">\n <div class="col-md-12">\n
<div class="row-fluid">\n
<ul>\n <li><span
id="navDefaultBoard"><i class="fa fa-dashboard"></span></i></li>\n
<li><span id="navProfileSettings"><i class="fa
fa-user"></span></i></li>\n </ul>\n
</div>\n <div
class="row-fluid">\n <ul>\n
<li><span id="navFavorites"><i class="fa
fa-star-o"></span></i></li>\n
<li><span id="navLibrary"><i class="fa fa-book"></span></i></li>\n
</ul>\n </div>\n
<div class="row-fluid">\n
<ul class="text-center" id="collapseNavMenu" data-bind="click: hideNav">\n
<span id="navCollapseArrows"><i
class="fa fa-angle-double-left"></i></span>\n
</ul>\n </div>\n <div>\n
<a href="/auth/drupal" data-bind="visible:
showLogIn">Log in</a>\n <span
data-bind="text: welcome"></span>\n </div>\n
</div>\n </div>\n
</div>\n</div>\n'}),define("components/nav-bar/nav-bar",["knockout","text!components/nav-bar/nav-bar.html"],function(t,e){function
n(e){var n=this;n.route=e.route,n.hideNav=function(){$("#navContainer
.navWrapper").toggleClass("hide"),$("#showNavMenu").css("display","inline"),$("#dashApp").css("padding","0
0 0 55px")},n.showNav=function(){window.setTimeout(function(){$("#navContainer
.navWrapper").toggleClass("hide"),$("#dashApp").css("padding-left","175px")},200)},n.showLogIn=t.observable(!1),n.welcome=t.observable(""),$.get("/user/info",function(t){t?n.welcome("Welcome,
"+t.name):n.showLogIn(!0)})}return{viewModel:n,template:e}}),define("text!components/home/home.html",[],function(){return'<input
data-bind="value: dashboardTitle" style="width: 200px;"/>\n
<p>hi</p>\n<dashboard params="url:
dashboardUrl"></dashboard>'}),define("components/home/home",["knockout","text!./home.html"],function(t,e){function
n(e){var
n=this;n.action=e&&e.action||"view",n.dashboardTitle=t.observable("Dashboard:test"),n.dashboardUrl=t.computed(function(){return"http://meta.wikimedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=json&titles="+n.dashboardTitle()},n)}return{viewModel:n,template:e}}),define("text!components/app-content/app-content.html",[],function(){return'<div
class="container">\n <div class="row">\n <div
data-bind="component: \'fraud-gauge\'" class="col-md-4"></div>\n
</div>\n</div>\n'}),define("components/app-content/app-content",["jquery","knockout","text!./app-content.html"],function(t,e,n){function
i(t){var
n=this;n.url=t.url||"hi",n.name=e.observable(),n.content=e.observable("this is
the
content"),n.description=e.observable(),n.graphs=e.observableArray([])}return{viewModel:i,template:n}}),define("text!components/utils/date-pickers/date-pickers.html",[],function(){return'<div
class="form-group">\n <div>\n\n <label>Choose Preset Time
Period:</label>\n <div>\n <label>\n
<select class="form-control" id="timePeriodDropdown" data-bind="options:
availableTimePresets, selectedOptions: chosenTimePeriodPresetDate"></select>\n
</label>\n </div>\n\n <!-- <label>Or Custom
Date & Time:</label>\n <div class="input-group"
id="customTimepicker">\n <input type="text" class="input-sm
form-control" id="customDate" placeholder="Date" data-bind="value:
chosenTimePeriodDate" data-provide="datepicker" name="start" />\n\n
<div class="input-group" id="customTimepickerRange">\n
<div class="bootstrap-timepicker">\n <input
id="queryTimepickerFrom" type="text" class="input-sm form-control"
placeholder="From Time" data-bind="value: chosenTimePeriodFromTime"
data-bind="click: setupTimepicker(event)">\n </div>\n
<span class="input-group-addon">to</span>\n <div
class="bootstrap-timepicker">\n <input
id="queryTimepickerTo" type="text" class="input-sm form-control"
placeholder="Time" data-bind="value: chosenTimePeriodToTime" data-bind="click:
setupTimepicker(event)">\n </div>\n </div>\n
</div>\n\n <div>\n <label>Or Custom
Range:</label>\n <div class="input-group"
id="customDatepicker">\n <input type="text" class="input-sm
form-control" placeholder="Date" data-bind="value: dateBeginRange"
id="customDateFrom" data-provide="datepicker" name="start" />\n
<span class="input-group-addon">to</span>\n <input
type="text" class="input-sm form-control" placeholder="Date" data-bind="value:
dateEndRange" data-provide="datepicker" name="end" />\n </div>\n
</div> -->\n </div>\n\n </div>\n
</div>\n</div>'}),/*!
+return 0===a.indexOf("empty:")?void
i():void(!u||l(a,c,d,h)?e.get(a,function(n){e.finishLoad(t,o.strip,n,i)},function(t){i.error&&i.error(t)}):n([s],function(t){e.finishLoad(o.moduleName+"."+o.ext,o.strip,t,i)}))},write:function(t,n,i){if(p.hasOwnProperty(n)){var
r=e.jsEscape(p[n]);i.asModule(t+"!"+n,"define(function () { return
'"+r+"';});\n")}},writeFile:function(t,n,i,r,o){var
s=e.parseName(n),a=s.ext?"."+s.ext:"",l=s.moduleName+a,u=i.toUrl(s.moduleName+a)+".js";e.load(l,i,function(){var
n=function(t){return r(u,t)};n.asModule=function(t,e){return
r.asModule(t,u,e)},e.write(t,l,n,o)},o)}},"node"===f.env||!f.env&&"undefined"!=typeof
process&&process.versions&&process.versions.node&&!process.versions["node-webkit"]?(n=require.nodeRequire("fs"),e.get=function(t,e,i){try{var
r=n.readFileSync(t,"utf8");0===r.indexOf("")&&(r=r.substring(1)),e(r)}catch(o){i&&i(o)}}):"xhr"===f.env||!f.env&&e.createXhr()?e.get=function(t,n,i,r){var
o,s=e.createXhr();if(s.open("GET",t,!0),r)for(o in
r)r.hasOwnProperty(o)&&s.setRequestHeader(o.toLowerCase(),r[o]);f.onXhr&&f.onXhr(s,t),s.onreadystatechange=function(){var
e,r;4===s.readyState&&(e=s.status||0,e>399&&600>e?(r=new Error(t+" HTTP
status:
"+e),r.xhr=s,i&&i(r)):n(s.responseText),f.onXhrComplete&&f.onXhrComplete(s,t))},s.send(null)}:"rhino"===f.env||!f.env&&"undefined"!=typeof
Packages&&"undefined"!=typeof java?e.get=function(t,e){var n,i,r="utf-8",o=new
java.io.File(t),s=java.lang.System.getProperty("line.separator"),a=new
java.io.BufferedReader(new java.io.InputStreamReader(new
java.io.FileInputStream(o),r)),l="";try{for(n=new
java.lang.StringBuffer,i=a.readLine(),i&&i.length()&&65279===i.charAt(0)&&(i=i.substring(1)),null!==i&&n.append(i);null!==(i=a.readLine());)n.append(s),n.append(i);l=String(n.toString())}finally{a.close()}e(l)}:("xpconnect"===f.env||!f.env&&"undefined"!=typeof
Components&&Components.classes&&Components.interfaces)&&(i=Components.classes,r=Components.interfaces,Components.utils["import"]("resource://gre/modules/FileUtils.jsm"),o="@mozilla.org/windows-registry-key;1"in
i,e.get=function(t,e){var n,s,a,l={};o&&(t=t.replace(/\//g,"\\")),a=new
FileUtils.File(t);try{n=i["@mozilla.org/network/file-input-stream;1"].createInstance(r.nsIFileInputStream),n.init(a,1,0,!1),s=i["@mozilla.org/intl/converter-input-stream;1"].createInstance(r.nsIConverterInputStream),s.init(n,"utf-8",n.available(),r.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER),s.readString(n.available(),l),s.close(),n.close(),e(l.value)}catch(u){throw
new Error((a&&a.path||"")+":
"+u)}}),e}),define("text!components/nav-bar/nav-bar.html",[],function(){return'<div
id="navContainer">\n <div class="boxedIcon" id="showNavMenu"
data-bind="click: showNav"><i class="fa fa-th-list"></i></div>\n <div
class="navWrapper">\n <div class="row text-center">\n
<h2 class=\'titlebrand\'>Dash</h2>\n </div>\n\n <div
class="row sidebar-nav">\n <div class="col-md-12">\n
<div class="row-fluid">\n
<ul>\n <li><span
id="navDefaultBoard"><i class="fa fa-dashboard"></span></i></li>\n
<li><span id="navProfileSettings"><i class="fa
fa-user"></span></i></li>\n </ul>\n
</div>\n <div
class="row-fluid">\n <ul>\n
<li><span id="navFavorites"><i class="fa
fa-star-o"></span></i></li>\n
<li><span id="navLibrary"><i class="fa fa-book"></span></i></li>\n
</ul>\n </div>\n
<div class="row-fluid">\n
<ul class="text-center" id="collapseNavMenu" data-bind="click: hideNav">\n
<span id="navCollapseArrows"><i
class="fa fa-angle-double-left"></i></span>\n
</ul>\n </div>\n <div>\n
<a href="/auth/drupal" data-bind="visible:
showLogIn">Log in</a>\n <p
data-bind="text: welcome"></p>\n <a
href="/logout" data-bind="visible: !showLogIn()">Log out</a>\n
</div>\n </div>\n </div>\n
</div>\n</div>\n'}),define("components/nav-bar/nav-bar",["knockout","text!components/nav-bar/nav-bar.html"],function(t,e){function
n(e){var n=this;n.route=e.route,n.hideNav=function(){$("#navContainer
.navWrapper").toggleClass("hide"),$("#showNavMenu").css("display","inline"),$("#dashApp").css("padding","0
0 0 55px")},n.showNav=function(){window.setTimeout(function(){$("#navContainer
.navWrapper").toggleClass("hide"),$("#dashApp").css("padding-left","175px")},200)},n.showLogIn=t.observable(!1),n.welcome=t.observable(""),$.get("/user/info",function(t){t?n.welcome("Welcome,
"+t.name):n.showLogIn(!0)})}return{viewModel:n,template:e}}),define("text!components/home/home.html",[],function(){return'<input
data-bind="value: dashboardTitle" style="width: 200px;"/>\n
<p>hi</p>\n<dashboard params="url:
dashboardUrl"></dashboard>'}),define("components/home/home",["knockout","text!./home.html"],function(t,e){function
n(e){var
n=this;n.action=e&&e.action||"view",n.dashboardTitle=t.observable("Dashboard:test"),n.dashboardUrl=t.computed(function(){return"http://meta.wikimedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=json&titles="+n.dashboardTitle()},n)}return{viewModel:n,template:e}}),define("text!components/app-content/app-content.html",[],function(){return'<div
class="container">\n <div class="row">\n <div
data-bind="component: \'fraud-gauge\'" class="col-md-4"></div>\n
</div>\n</div>\n'}),define("components/app-content/app-content",["jquery","knockout","text!./app-content.html"],function(t,e,n){function
i(t){var
n=this;n.url=t.url||"hi",n.name=e.observable(),n.content=e.observable("this is
the
content"),n.description=e.observable(),n.graphs=e.observableArray([])}return{viewModel:i,template:n}}),define("text!components/utils/date-pickers/date-pickers.html",[],function(){return'<div
class="form-group">\n <div>\n\n <label>Choose Preset Time
Period:</label>\n <div>\n <label>\n
<select class="form-control" id="timePeriodDropdown" data-bind="options:
availableTimePresets, selectedOptions: chosenTimePeriodPresetDate"></select>\n
</label>\n </div>\n\n <!-- <label>Or Custom
Date & Time:</label>\n <div class="input-group"
id="customTimepicker">\n <input type="text" class="input-sm
form-control" id="customDate" placeholder="Date" data-bind="value:
chosenTimePeriodDate" data-provide="datepicker" name="start" />\n\n
<div class="input-group" id="customTimepickerRange">\n
<div class="bootstrap-timepicker">\n <input
id="queryTimepickerFrom" type="text" class="input-sm form-control"
placeholder="From Time" data-bind="value: chosenTimePeriodFromTime"
data-bind="click: setupTimepicker(event)">\n </div>\n
<span class="input-group-addon">to</span>\n <div
class="bootstrap-timepicker">\n <input
id="queryTimepickerTo" type="text" class="input-sm form-control"
placeholder="Time" data-bind="value: chosenTimePeriodToTime" data-bind="click:
setupTimepicker(event)">\n </div>\n </div>\n
</div>\n\n <div>\n <label>Or Custom
Range:</label>\n <div class="input-group"
id="customDatepicker">\n <input type="text" class="input-sm
form-control" placeholder="Date" data-bind="value: dateBeginRange"
id="customDateFrom" data-provide="datepicker" name="start" />\n
<span class="input-group-addon">to</span>\n <input
type="text" class="input-sm form-control" placeholder="Date" data-bind="value:
dateEndRange" data-provide="datepicker" name="end" />\n </div>\n
</div> -->\n </div>\n\n </div>\n
</div>\n</div>'}),/*!
* Timepicker Component for Twitter Bootstrap
*
* Copyright 2013 Joris de Wit
diff --git a/routes/data.js b/routes/data.js
index 2ffba5d..e0ce18b 100644
--- a/routes/data.js
+++ b/routes/data.js
@@ -173,7 +173,7 @@
i;
if ( !req.session || !req.session.passport ||
!req.session.passport.user ) {
- res.json( 'Error: Not logged in' );
+ res.json( { error: 'Error: Not logged in' } );
return;
}
diff --git a/server.js b/server.js
index 0ac5392..3ecf4be 100644
--- a/server.js
+++ b/server.js
@@ -81,6 +81,10 @@
function( req, res ) {
res.redirect( '/' );
});
+app.get( '/logout', function( req, res ) {
+ req.logout();
+ res.redirect( '/' );
+});
server = app.listen(
serverConfig[3],
diff --git a/src/components/nav-bar/nav-bar.html
b/src/components/nav-bar/nav-bar.html
index 55f65ae..39105c6 100644
--- a/src/components/nav-bar/nav-bar.html
+++ b/src/components/nav-bar/nav-bar.html
@@ -26,7 +26,8 @@
</div>
<div>
<a href="/auth/drupal"
data-bind="visible: showLogIn">Log in</a>
- <span data-bind="text: welcome"></span>
+ <p data-bind="text: welcome"></p>
+ <a href="/logout" data-bind="visible:
!showLogIn()">Log out</a>
</div>
</div>
</div>
--
To view, visit https://gerrit.wikimedia.org/r/169236
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I29b69d735ff411cf50e507812df1f4d8c8b34052
Gerrit-PatchSet: 1
Gerrit-Project: wikimedia/fundraising/dash
Gerrit-Branch: master
Gerrit-Owner: Ejegg <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits