Esempio n. 1
0
 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');
         }
     });
 };
Esempio n. 2
0
 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');
         }
     });
 };
Esempio n. 3
0
 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();
     });
 });
Esempio n. 4
0
 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();
     });
 });
Esempio n. 5
0
    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();
                }
            });
        });
    });
Esempio n. 6
0
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();
Esempio n. 7
0
 augment.bindRemove = function(remove) {
     bean.add(remove, 'click', function() {
         bonzo(remove.parentNode).remove();
     });
 };
Esempio n. 8
0
 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);
     });
 });
Esempio n. 9
0
        }, 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);
            });
        });
Esempio n. 10
0
 v.each(qwery('select'), function(select) {
     bean.add(select, 'change', change);
 });
Esempio n. 11
0
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;
};