var augment = function() { bean.add(w.el('ondemand')[0], 'click', function() { console.log('click', gather()); if(gather().polling_strategy === 'ondemand') { w.el('time').attr('disabled', 'disabled'); } else { w.el('time').removeAttr('disabled'); } }); };
var augment = function() { var add = qwery('.app-add')[0]; bean.add(add, 'click', function() { var removes = qwery('.app-remove'); var r = bonzo(add).before(t.build_instruction.render({ instruction : '' })); augment.bindRemove(qwery('.app-remove', r.previous())[0]); }); v.each(qwery('.app-remove'), function(remove) { augment.bindRemove(remove); }); bean.add(w.el('ondemand')[0], 'click', function() { console.log('click', gather()); if(gather().polling_strategy === 'ondemand') { w.el('time').attr('disabled', 'disabled'); } else { w.el('time').removeAttr('disabled'); } }); };
page.req('project', page.projectId, function(_, project) { page.body.html(t.projectEdit.render({ project : adapt(project), action : 'Save project' }, t)); augment(); bean.add(qwery('form')[0], 'submit', function(e) { var p = gather(); p.id = project.id; page.req('project/update', p); bean.fire(page, 'projectUpdated', [p]); page.go('/' + p.id); e.preventDefault(); }); });
page.handle(/^\/add$/, function() { page.body.html(t.projectEdit.render({ project : adapt({ name : 'Perforator', repo_url : 'file:///home/tahu/Desktop/PERFORATOR/perforator', branch : 'origin/master', build_instructions : [ './rebar get-deps', './rebar compile', './rebar perf' ], polling_strategy : 'ondemand' }), action : 'Add project' }, t)); augment(); bean.add(qwery('form')[0], 'submit', function(e) { var project = gather(); page.req('project/new', project, function(_, id) { project.id = id; bean.fire(page, 'projectAdded', [project]); page.go('/' + project.id); }); e.preventDefault(); }); });
page.handle(/^\/login$/, function(from, to) { page.body.append(t.login()); page.beforego(function(from, to) { page.body.empty(); }); loginResult = bonzo(qwery('#loginResult')[0]); var forgotModel = { username : bv.makeProperty('username') }; var model = { username : bv.makeProperty('username'), password : bv.makeProperty('password') }; bv.listen(model, loginValidator); model.username._input.focus(); bean.add(qwery('#loginForm')[0], 'submit', function(e) { e.preventDefault(); var login = bv.extract(model); v.each(model, function(key, property) { model[key].touched = true; bv.validateProperty(loginValidator, false, model, login, key, property); }); loginValidator.validate(login, function(_, errors) { if(!errors) { page.once('login', function(_, msg) { if(msg === null) { model.username.error([]); model.password.error([]); model.username._input.focus(); loginResult.removeClass('hidden'); loginResult.html('<p>Incorrect username/email or password.</p>'); } else { page.setId(msg.sessionId, bonzo(qwery('#rememberme')).attr('checked')); page.setUser(msg.user); page.go('/'); } }); page.emit('login', null, login); } }); }); bean.add(qwery('#forgot')[0], 'click', function(e) { e.preventDefault(); var forgot = bv.extract(forgotModel); v.each(forgotModel, function(key, property) { forgotModel[key].touched = true; bv.validateProperty(forgotValidator, false, forgotModel, forgot, key, property); }); forgotValidator.validate(forgot, function(_, errors) { if(!errors) { page.req('/sendReminder', forgot, function(_, reminderSent) { if(reminderSent) { page.body.empty(); page.body.append(t.reminderSent()); } else { model.username.error([]); model.password.ok(); loginResult.removeClass('hidden'); loginResult.html('<p>Incorrect username or email.</p>'); } }); } else { forgotModel.username._input.focus(); } }); }); });
var bv = require('./validator-bootstrap'); var LoginValidator = require('../LoginValidator'); var loginValidator = new LoginValidator.LoginValidator(); var ForgotValidator = require('../ForgotValidator'); var forgotValidator = new ForgotValidator.ForgotValidator(); var bean = require('bean'); var bonzo = require('bonzo'); var v = require('valentine'); var qwery = require('qwery'); var window = require('./window'); var loginResult; bean.add(loginValidator, 'validation', function(property, errors) { loginResult.addClass('hidden'); }); exports.init = function(page, t, cb) { page.handle(/^\/login$/, function(from, to) { page.body.append(t.login()); page.beforego(function(from, to) { page.body.empty(); }); loginResult = bonzo(qwery('#loginResult')[0]); var forgotModel = { username : bv.makeProperty('username') }; var model = { username : bv.makeProperty('username'), password : bv.makeProperty('password') }; bv.listen(model, loginValidator); model.username._input.focus();
augment.bindRemove = function(remove) { bean.add(remove, 'click', function() { bonzo(remove.parentNode).remove(); }); };
v.each(module.test_cases, function(test) { bean.add(qwery('#' + test.id)[0].parentNode.parentNode, 'click', function() { page.go('/' + page.projectId + '/test/' + module.name + '/' + test.name); }); });
}, function(err, modules, previousModules) { console.log('rendering build', modules, previousModules); if(err) { page.body.html(t.error.render({ title : 'Build #' + buildId + ' did not succeed', message : err.err, details : err.msg })); return; } v.each(modules, function(module) { v.each(module.test_cases, function(test) { test.id = 'test-' + module.name + '-' + test.name; }); }); var seriesMap = {}; v.each(series, function(series) { seriesMap[series.key] = series; }); page.body.html(t.run.render({ modules : modules, series : series, id : buildId })); var select = bonzo(qwery('select')); bean.add(select[0], 'change', function() { setSeries(select.val()); }); var chart = w.nv.models.bulletChart(); v.each(modules, function(module) { v.each(module.test_cases, function(test) { bean.add(qwery('#' + test.id)[0].parentNode.parentNode, 'click', function() { page.go('/' + page.projectId + '/test/' + module.name + '/' + test.name); }); }); }); var currentSeries = null; var setSeries = function(key) { currentSeries = key; v.each(modules, function(module) { var previousModule = previousModules ? common.findBy(previousModules, 'name', module.name) : null; console.log('previousModule', module.name); v.each(module.test_cases, function(test) { var previousTest = previousModule ? common.findBy(previousModule.test_cases, 'name', test.name) : null; console.log('previousTest', test.name); var id = 'test-' + module.name + '-' + test.name; w.el(id).empty(); if(!test.successful) { bonzo(w.el(id)[0].parentNode).html('<p>' + test.name + ' did not succeed.</p>'); return; } var data = test.result[key]; // TODO make it real data.previous = previousTest && previousTest.successful ? previousTest.result[key] : data; var ranges = [data.min, data.mean, data.max]; w.d3.select('#' + id).datum({ title: test.name, subtitle: seriesMap[key].units, ranges: ranges, measures: [data.mean], markers: [data.previous.mean] }).call(chart); bonzo(qwery('#' + id + ' .measure')).css('fill', data.mean > data.previous.mean ? (seriesMap[key].higherBetter ? '#0f0' : '#f00') : (seriesMap[key].higherBetter ? '#f00' : '#0f0')); }); }); }; setSeries(series[0].key); w.nv.utils.windowResize(function() { setSeries(currentSeries); }); });
v.each(qwery('select'), function(select) { bean.add(select, 'change', change); });
exports.init = function(page, tasks) { var taskMap = {}; v.each(tasks, function(task) { taskMap[String(task.id)] = task; }); var editor = {}; var user = page.getUser(); var removeHandlePatch = function(){}; var solution = { username : null, taskId : null }; var solutionOpened = null; editor.getSolution = function() { return { username : solution.username, taskId : solution.taskId }; }; var contentEl = bonzo(qwery('#content')); var headingEl = bonzo(bonzo.create('<h2><i></i> Problem <span class="opened"></span></h2>')); contentEl.append(headingEl); var foldable = new Foldable().init(headingEl, bonzo(headingEl[0].childNodes[0])); var openedEl = bonzo(headingEl[0].childNodes[2]); var descriptionEl = bonzo(bonzo.create('<div class="descriptionpad"></div>')).appendTo(contentEl); descriptionEl.hide(); bean.add(foldable, 'open', function() { if(!solutionOpened && solution.username === user.username) { solutionOpened = util.now(); page.emit('openSolution', null, { sessionId : page.getId(), taskId : solution.taskId }); openedEl.text('(first opened ' + moment(solutionOpened * 1000).format('YYYY-MM-DD HH:mm') +')'); } descriptionEl.show(); }); bean.add(foldable, 'close', function() { descriptionEl.hide(); }); contentEl.append('<h2>Solution</h2>'); var codepadEl = bonzo(bonzo.create('<div class="codepad"></div>')).appendTo(contentEl); var textareaEl = bonzo(bonzo.create('<div class="textarea"></div>')).appendTo(codepadEl); var resizerEl = bonzo(bonzo.create('<div class="resizer"></div>')).appendTo(codepadEl); var spacerEl = bonzo(bonzo.create('<div class="codepadspacer"></div>')).appendTo(contentEl); var submitEl = bonzo(bonzo.create('<p class="submit"><button class="btn btn-primary">Submit for review</button></p>')).appendTo(contentEl); var editorEl = window.textareaToEditor(textareaEl[0]); var submissions = new SubmissionsWidget().init(bonzo(bonzo.create('<div>')).appendTo(contentEl), page); var handlePatch = function(_, msg) { editorEl.getSession().setValue(dmp.patch_apply(msg.patch, editorEl.getSession().getValue())[0]); }; var dim = { height : parseInt(window.getCookie('editorHeight'), 10) || 300 }; var resize = function(height) { spacerEl.css('height', height + 10); textareaEl.css('height', height); resizerEl.css('top', height); editorEl.resize(); }; var delay = new Delay(); var lastSyncedDescription = null; var sync = function() { var v = editorEl.getSession().getValue(); if(lastSyncedDescription !== v) { page.emit('patchSolution', null, { sessionId : page.getId(), taskId : solution.taskId, patch : dmp.patch_make(dmp.diff_main(lastSyncedDescription, v)) }); lastSyncedDescription = v; } }; var textareaListener = function() { delay.set(sync); }; editor.setSolution = function(newSolution) { if(solution.username === newSolution.username && solution.taskId === newSolution.taskId) { return; } if(solution.username === user.username) { editorEl.getSession().removeEventListener('change', textareaListener); } else { removeHandlePatch(); } solution = newSolution; foldable.close(); var tokens = marked.lexer(taskMap[String(solution.taskId)].description); v.each(tokens, function(token) { if(token.type === 'heading') { token.depth += 2; } }); descriptionEl.html(marked.parser(tokens)); page.req('/getSubmissions', { taskId : solution.taskId, username : solution.username }, function(_, s) { submissions.clear(); v.each(s, v.bind(submissions, submissions.add)); }); page.req('/getSolution', { taskId : solution.taskId, username : solution.username }, function(_, solution) { editorEl.getSession().setValue(solution.description); solutionOpened = solution.opened; if(solutionOpened) { openedEl.text('(first opened ' + moment(solutionOpened * 1000).format('YYYY-MM-DD HH:mm') +')'); } else { openedEl.text('(never opened)'); } if(solution.username === user.username) { editorEl.setReadOnly(false); submitEl.show(); lastSyncedDescription = solution.description; editorEl.getSession().addEventListener('change', textareaListener); } else { editorEl.setReadOnly(true); submitEl.hide(); } }); if(solution.username !== user.username) { removeHandlePatch = page.on('patch-' + solution.username + '-' + solution.taskId, handlePatch); } }; bean.add(submitEl[0], 'click', function(e) { var submission = { time : new Date().getTime() / 1000, taskId : solution.taskId, description : editorEl.getSession().getValue() }; submission.reviews = []; v.each(submission.description.split('\n'), function(line) { submission.reviews.push([]); }); page.req('/submitSolution', { sessionId : page.getId(), submission : submission }, function(err, submissionId) { submission.id = submissionId; submissions.add(submission); }); }); bean.add(window.window, 'mousemove', function(e) { if(rdown !== null) { resize(dim.height + (e.pageY - rdown.y)); } }); var rdown = null; bean.add(window.window, 'mouseup', function(e) { dim.height = parseInt(textareaEl.css('height'), 10); window.setCookie('editorHeight', String(dim.height)); rdown = null; }); bean.add(resizerEl[0], 'mousedown', function(e) { rdown = { y : e.pageY }; dim = { height : parseInt(textareaEl.css('height'), 10) }; e.preventDefault(); e.stopPropagation(); }); resize(dim.height); return editor; };