- Timestamp:
- 06/26/13 14:43:57 (12 years ago)
- Location:
- Dev/trunk
- Files:
-
- 8 added
- 1 deleted
- 15 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
Dev/trunk/Gruntfile.js
r464 r466 29 29 dest: developmentDir, 30 30 ext: '.js' 31 }] 32 } 33 }, 34 coffeelint: { 35 compile: { 36 options: require('./'+srcDir+'.coffeelint.json'), 37 files: [{ 38 expand: true, 39 cwd: srcDir, 40 src: ['client/qed-client/**/*.coffee', 'server/**.coffee'] 31 41 }] 32 42 } … … 116 126 }); 117 127 128 grunt.loadNpmTasks('grunt-coffeelint'); 118 129 grunt.loadNpmTasks('grunt-contrib-clean'); 119 130 grunt.loadNpmTasks('grunt-contrib-coffee'); … … 126 137 // development tasks 127 138 grunt.registerTask('install-deps', ['copy:server-deps', 'copy:client-deps']); 128 grunt.registerTask('compile', ['less:compile', 'jshint:compile', 'htmlhint:compile', 'coffee:compile', 'copy:compile']); 139 grunt.registerTask('lint', ['jshint:compile', 'htmlhint:compile', 'coffeelint:compile']); 140 grunt.registerTask('compile', ['lint', 'less:compile', 'coffee:compile', 'copy:compile']); 129 141 grunt.registerTask('build', ['clean:development', 'install-deps', 'compile']); 130 142 … … 135 147 grunt.registerTask('default', ['compile']); 136 148 149 // util functions 150 137 151 }; -
Dev/trunk/package.json
r464 r466 13 13 "grunt-contrib-clean": "~0.4.1", 14 14 "grunt-contrib-coffee": "~0.7.0", 15 "underscore": "~1.4.4" 15 "underscore": "~1.4.4", 16 "grunt-coffeelint": "0.0.6" 16 17 } 17 18 } -
Dev/trunk/src/client/index.html
r452 r466 30 30 </div> 31 31 <div id="toaster" data-dojo-type="qed-client/app/Notifications"></div> 32 <div id="loginDialog" data-dojo-type="qed-client/ui/LoginDialog"></div> 32 33 </body> 33 34 </html> -
Dev/trunk/src/client/qed-client/index.js
r463 r466 4 4 "./app/Router", 5 5 "./routes", 6 "./session", 6 7 "./store", 7 8 "./store/request", … … 9 10 "dojo/_base/array", 10 11 "dojo/parser", 11 "dojo/request/registry",12 12 "./stddeps", 13 13 "dojo/domReady!" 14 ], function(Content, Page, Router, routes, s tore, request, MainMenu, array, parser, registry) {14 ], function(Content, Page, Router, routes, session, store, request, MainMenu, array, parser) { 15 15 16 registry.register(/.*/,request); 16 parser.parse(); 17 18 new MainMenu({},"menu").startup(); 19 20 array.forEach(routes,function(route){ 21 Router.register(route); 22 }); 23 Router.startup(); 24 25 session.restore(); 17 26 18 parser.parse();19 store.info()20 .then(function(){21 new MainMenu({},"menu").startup();22 array.forEach(routes,function(route){23 Router.register(route);24 });25 Router.startup();26 },function(){27 Content.startup();28 Content.set(new Page({29 templateString: "<div>Application database is not properly configured. Contact your system administrator.</div>"30 }));31 });32 27 }); -
Dev/trunk/src/client/qed-client/pages/surveyRun.js
r463 r466 86 86 }, 87 87 _link: function(url,label) { 88 return '<a target="_bla ck" href="'+url+'">'+(label || url)+'</a>';88 return '<a target="_blank" href="'+url+'">'+(label || url)+'</a>'; 89 89 }, 90 90 _onSave: function(evt) { … … 111 111 if ( evt ) { event.stop(evt); } 112 112 return false; 113 },114 _onExport: function(evt) {115 if ( evt ) { event.stop(evt); }116 return false;117 113 } 118 114 }); -
Dev/trunk/src/client/qed-client/pages/templates/question.html
r443 r466 1 < divclass="orange">1 <form class="orange"> 2 2 <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'top'"> 3 3 <h2> … … 15 15 </div> 16 16 </div> 17 </ div>17 </form> -
Dev/trunk/src/client/qed-client/pages/templates/surveyRun.html
r463 r466 45 45 <div> 46 46 <div class="qedLabel">Export results</div> 47 <button data-dojo-type="dijit/form/Button" 48 class="qedField blue" 49 data-dojo-props="baseClass: 'rftBlockButton', iconClass: 'rftIcon rftIconSave'" 50 data-dojo-attach-event="onClick:_onExport">To CSV</button> 47 <a target="_blank" href="/surveyRun/${surveyRunId}/csv" class="qedField">To CSV</a> 51 48 </div> 52 49 </fieldset> -
Dev/trunk/src/client/qed-client/stddeps.js
r457 r466 33 33 './model/widgets/SurveyWidget', 34 34 35 './ui/LoginDialog', 35 36 './ui/MainMenu', 36 37 './ui/MenuBarLink', 37 38 './ui/MenuLink', 39 './ui/SessionMenu', 38 40 39 41 './widgets/LineWithActionsWidget', -
Dev/trunk/src/client/qed-client/store.js
r443 r466 9 9 10 10 var couchStore = new CouchStore({ 11 target: ' data/couch/' /*,11 target: 'api/data/' /*, 12 12 validate: function(object) { 13 13 var result = jsonSchema.validate(object,schema); -
Dev/trunk/src/client/qed-client/store/CouchStore.js
r463 r466 5 5 "dojo/_base/json", 6 6 "dojo/_base/lang", 7 "dojo/request /registry",7 "dojo/request", 8 8 "dojo/store/util/QueryResults" 9 9 ], function(Deferred, array, declare, json, lang, request, QueryResults) { -
Dev/trunk/src/client/qed-client/ui/MenuLink.js
r443 r466 1 define(['dojo/_base/declare','dijit/MenuItem','../app/Router' 2 ], function(declare,MenuItem,Router) { 1 define([ 2 "../app/Router", 3 "dijit/MenuItem", 4 "dojo/_base/declare", 5 "dojo/_base/event" 6 ], function(Router, MenuItem, declare, event) { 3 7 return declare([MenuItem],{ 4 8 options:{ 5 9 path: null 6 10 }, 7 onClick: function( ) {11 onClick: function(evt) { 8 12 if ( this.path ) { Router.go(this.path); } 13 if ( evt ) { event.stop(evt); } 14 return false; 9 15 } 10 16 }); -
Dev/trunk/src/client/qed-client/ui/templates/MainMenu.html
r443 r466 12 12 </div> 13 13 <div class="rftMainMenuButton" data-dojo-type="./MenuBarLink" data-dojo-props="path:'/results'">Results</div> 14 <div class="rftMainMenuButton" data-dojo-type="./ MenuBarLink">Logout</div>14 <div class="rftMainMenuButton" data-dojo-type="./SessionMenu"></div> 15 15 </div> 16 16 </div> -
Dev/trunk/src/client/qed-client/widgets/_ComplexValueMixin.coffee
r465 r466 15 15 @inherited arguments 16 16 if @domNode.tagName.toLowerCase() isnt "form" 17 console.warn "Not scoping a _ComplexValueMixin in a form element can cause name clashes. E.g. radio buttons might stop working correctly. It is recommended to use <form> as the root element in your template for", @declaredClass 17 console.warn "Not scoping a _ComplexValueMixin in a 18 form element can cause name clashes. E.g. 19 radio buttons might stop working correctly. 20 It is recommended to use <form> as the root 21 element in your template for", @declaredClass 18 22 19 23 _setDisabledAttr: (value) -> 20 24 @_set "disabled", value 21 array.forEach @_getDescendantFormWidgets(), (child) => 25 array.forEach @_getDescendantFormWidgets(), (child) => 22 26 child.set "disabled", value 23 27 -
Dev/trunk/src/server/app.js
r464 r466 4 4 var fs = require("fs"); 5 5 var path = require("path"); 6 var proxy = require("./ simple-http-proxy");6 var proxy = require("./util/simple-http-proxy"); 7 7 var _ = require("underscore"); 8 8 … … 31 31 } 32 32 })); 33 passport.serializeUser(function(user, done) { 34 done(null, user.username); 35 }); 36 passport.deserializeUser(function(id, done) { 37 done(null, {username: id}); 38 }); 33 39 34 40 var app = express(); … … 56 62 }); 57 63 64 58 65 // url to login (might work on others as well?) 59 66 // you should then have a session to work with 60 app.post('/api/login'); 67 // should return a user info object 68 function returnUser(req,res) { 69 res.send(200, req.user); 70 } 71 app.post( 72 '/api/login', 73 passport.authenticate('local'), 74 returnUser); 61 75 76 // ensure we're authenticated on API calls 77 app.use('/api', function(req,res,next){ 78 if (!req.user) { 79 return res.send(401,{error:"Login before accessing API."}); 80 } else { 81 return next(); 82 } 83 }); 84 85 app.get( 86 '/api/login', 87 returnUser); 88 89 app.post( 90 '/api/logout', function(req,res){ 91 req.logout(); 92 res.send(200,{}); 93 }); 94 95 app.get('/api/surveyRun/:id/response/csv', 96 function(req, res) { 97 var id = req.params.id; 98 // query CouchDB and build the CSV file 99 res.set({ 100 'Content-Type': 'text/csv', 101 'Content-Disposition': 'attachment; filename=responses-'+id+'.csv' 102 }); 103 res.send(200, "Response for surveyRun "+id); 104 }); 105 62 106 // forward to couch 63 app.use('/ data/couch', proxy(settings.couchDbURL));107 app.use('/api/data', proxy(settings.couchDbURL)); 64 108 65 109 return app; -
Dev/trunk/src/server/config/config-couchdb.js
r464 r466 1 1 var q = require('q'); 2 var HTTP = require('q-io/http'); 3 var URL = require('url'); 2 var request = require('../util/request'); 4 3 var _ = require('underscore'); 5 4 var util = require('util'); … … 27 26 } 28 27 29 function request(method,path,content) {28 function dbRequest(method,path,content) { 30 29 var url = couchDbURL+path; 31 var parsedURL = URL.parse(url);32 30 var options = { 33 url: url,34 31 method: method, 35 32 headers: { … … 37 34 'accept': 'application/json' 38 35 }, 39 body: { 40 forEach: function(callback) { 41 callback(JSON.stringify(content || {})); 42 } 43 } 36 body: content 44 37 }; 45 // because q-io doesn't support auth properly, we have to 46 // build the f*ing wheel again. 47 if ( parsedURL.auth ) { 48 var auth = new Buffer(parsedURL.auth).toString("base64"); 49 options.headers.authorization = 'Basic '+auth; 50 } 51 return HTTP.request(options) 52 .then(function(res){ 53 return res.body.read().then(function(content){ 54 return JSON.parse(content.toString() || "{}"); 55 }); 56 },function(res){ 57 return res.body.read().then(function(error){ 58 console.warn(error); // q.all doesn't do errors, so let's show them here 59 return JSON.parse(error.toString() || "{}"); 60 }); 61 }); 38 return request(url,options); 62 39 } 63 40 64 41 console.log("Configuring CouchDB for QED"); 65 42 console.log("Checking CouchDB version"); 66 return request('GET','')43 return dbRequest('GET','') 67 44 .then(function(res){ 68 45 if (res.version !== "1.2.0" ) { … … 73 50 }).then(function(res){ 74 51 console.log("Checking database 'qed'"); 75 return request('GET','qed')52 return dbRequest('GET','qed') 76 53 .then(function(res){ 77 54 console.log("Database 'qed' found."); 78 55 },function(err){ 79 56 console.log("Creating database 'qed'"); 80 return request('PUT','qed');57 return dbRequest('PUT','qed'); 81 58 }); 82 59 }).then(function(){ … … 92 69 case "update": 93 70 console.log(docUrl+" updating."); 94 return request('GET',docUrl)71 return dbRequest('GET',docUrl) 95 72 .then(function(oldDoc){ 96 73 _.extend(oldDoc,doc); 97 return request('PUT',docUrl,oldDoc);74 return dbRequest('PUT',docUrl,oldDoc); 98 75 },function(){ 99 return request('PUT',docUrl,doc);76 return dbRequest('PUT',docUrl,doc); 100 77 }); 101 78 break; … … 103 80 default: 104 81 console.log(docUrl+" replacing."); 105 return request('GET',docUrl)82 return dbRequest('GET',docUrl) 106 83 .then(function(oldDoc){ 107 84 _.extend(doc,_.pick(oldDoc,'_id','_rev')); 108 return request('PUT',docUrl,doc);85 return dbRequest('PUT',docUrl,doc); 109 86 },function(){ 110 return request('PUT',docUrl,doc);87 return dbRequest('PUT',docUrl,doc); 111 88 }); 112 89 break;
Note: See TracChangeset
for help on using the changeset viewer.