Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,5 @@ mrq-config.py
dump.rdb
supervisord.pid
memory_traces
mrq/dashboard/static/node_modules/
mrq/dashboard/static/bin/
4 changes: 4 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,14 @@ RUN apt-get update && \
bzip2 \
mongodb-org \
nginx redis-server \
g++ \
&& \
apt-get clean -y && \
rm -rf /var/lib/apt/lists/*

RUN curl -sL https://deb.nodesource.com/setup_7.x | bash -
RUN apt-get install -y --no-install-recommends nodejs

# Download pypy
RUN curl -sL 'https://bitbucket.org/squeaky/portable-pypy/downloads/pypy-5.8-1-linux_x86_64-portable.tar.bz2' > /pypy.tar.bz2 && tar jxvf /pypy.tar.bz2 && rm -rf /pypy.tar.bz2 && mv /pypy-* /pypy

Expand Down
2 changes: 2 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,13 @@ clean:
find . -name __pycache__ | xargs rm -r

dashboard:
cd mrq/dashboard/static && npm install && mkdir -p bin && npm run build
python mrq/dashboard/app.py

stack:
mongod --smallfiles --noprealloc --nojournal &
redis-server &
cd mrq/dashboard/static && npm install && mkdir -p bin && npm run build
python mrq/dashboard/app.py &

pep8:
Expand Down
48 changes: 0 additions & 48 deletions mrq/dashboard/static/js/config.js

This file was deleted.

287 changes: 142 additions & 145 deletions mrq/dashboard/static/js/main.js
Original file line number Diff line number Diff line change
@@ -1,150 +1,147 @@
require([
"backbone", "underscore", "jquery", "app",

//other plain-JS deps

"datatablesbs3", "bootstrap", "backbonequeryparams", "sparkline"

],function(Backbone, _, $, app) {


// Models come from mongodb
Backbone.Model.prototype.idAttribute = '_id';

// http://datatables.net/plug-ins/api#fnSetFilteringDelay
$.fn.dataTableExt.oApi.fnSetFilteringDelay = function ( oSettings, iDelay ) {
var _that = this;

if ( iDelay === undefined ) {
iDelay = 250;
}

this.each( function ( i ) {
$.fn.dataTableExt.iApiIndex = i;
var
$this = this,
oTimerId = null,
sPreviousSearch = null,
anControl = $( 'input', _that.fnSettings().aanFeatures.f );

anControl.unbind( 'keyup' ).bind( 'keyup', function() {
var $$this = $this;

if (sPreviousSearch === null || sPreviousSearch != anControl.val()) {
window.clearTimeout(oTimerId);
sPreviousSearch = anControl.val();
oTimerId = window.setTimeout(function() {
$.fn.dataTableExt.iApiIndex = i;
_that.fnFilter( anControl.val() );
}, iDelay);
}
});

return this;
} );
return this;
};

$.fn.dataTableExt.oApi.fnReloadAjax = function ( oSettings, sNewSource, fnCallback, bStandingRedraw )
{
// DataTables 1.10 compatibility - if 1.10 then versionCheck exists.
// 1.10s API has ajax reloading built in, so we use those abilities
// directly.
if ( $.fn.dataTable.versionCheck ) {
var api = new $.fn.dataTable.Api( oSettings );

if ( sNewSource ) {
api.ajax.url( sNewSource ).load( fnCallback, !bStandingRedraw );
}
else {
api.ajax.reload( fnCallback, !bStandingRedraw );
}
return;
}

if ( sNewSource !== undefined && sNewSource !== null ) {
oSettings.sAjaxSource = sNewSource;
}

// Server-side processing should just call fnDraw
if ( oSettings.oFeatures.bServerSide ) {
this.fnDraw();
return;
}

this.oApi._fnProcessingDisplay( oSettings, true );
var that = this;
var iStart = oSettings._iDisplayStart;
var aData = [];

this.oApi._fnServerParams( oSettings, aData );

oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aData, function(json) {
/* Clear the old information from the table */
that.oApi._fnClearTable( oSettings );

/* Got the data - add it to the table */
var aData = (oSettings.sAjaxDataProp !== "") ?
that.oApi._fnGetObjectDataFn( oSettings.sAjaxDataProp )( json ) : json;

for ( var i=0 ; i<aData.length ; i++ )
{
that.oApi._fnAddData( oSettings, aData[i] );
}

oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();

that.fnDraw();

if ( bStandingRedraw === true )
{
oSettings._iDisplayStart = iStart;
that.oApi._fnCalculateEnd( oSettings );
that.fnDraw( false );
}

that.oApi._fnProcessingDisplay( oSettings, false );

/* Callback user function - for event handlers etc */
if ( typeof fnCallback == 'function' && fnCallback !== null )
{
fnCallback( oSettings );
}
}, oSettings );
};

$(function() {


// All navigation that is relative should be passed through the navigate
// method, to be processed by the router. If the link has a `data-bypass`
// attribute, bypass the delegation completely.
$(document).on("click", "a:not([data-bypass])", function(evt) {

// Get the absolute anchor href.
var href = $(this).attr("href");

// If the href exists and is a hash route, run it through Backbone.
if (href && href.indexOf("#") === 0) {
// Stop the default event to ensure the link will not cause a page
// refresh.
evt.preventDefault();

// `Backbone.history.navigate` is sufficient for all Routers and will
// trigger the correct events. The Router's internal `navigate` method
// calls this anyways. The fragment is sliced from the root.
Backbone.history.navigate(href, true);
}
"backbone", "underscore", "jquery", "app",

//other plain-JS deps

"datatables", "datatablesbs3", "bootstrap", "backbonequeryparams", "sparkline",

// CSS
"../css/mrq-dashboard.css", "../css/bootstrap-theme.min.css", "../css/datatables.css", "../css/jquery.circliful.css"

], function (Backbone, _, $, app) {

// Models come from mongodb
Backbone.Model.prototype.idAttribute = '_id';

// http://datatables.net/plug-ins/api#fnSetFilteringDelay
$.fn.dataTableExt.oApi.fnSetFilteringDelay = function (oSettings, iDelay) {
var _that = this;

if (iDelay === undefined) {
iDelay = 250;
}

this.each(function (i) {
$.fn.dataTableExt.iApiIndex = i;
var
$this = this,
oTimerId = null,
sPreviousSearch = null,
anControl = $('input', _that.fnSettings().aanFeatures.f);

anControl.unbind('keyup').bind('keyup', function () {
var $$this = $this;

if (sPreviousSearch === null || sPreviousSearch != anControl.val()) {
window.clearTimeout(oTimerId);
sPreviousSearch = anControl.val();
oTimerId = window.setTimeout(function () {
$.fn.dataTableExt.iApiIndex = i;
_that.fnFilter(anControl.val());
}, iDelay);
}
});

return this;
});
return this;
};

$.fn.dataTableExt.oApi.fnReloadAjax = function (oSettings, sNewSource, fnCallback, bStandingRedraw) {
// DataTables 1.10 compatibility - if 1.10 then versionCheck exists.
// 1.10s API has ajax reloading built in, so we use those abilities
// directly.
if ($.fn.dataTable.versionCheck) {
var api = new $.fn.dataTable.Api(oSettings);

if (sNewSource) {
api.ajax.url(sNewSource).load(fnCallback, !bStandingRedraw);
}
else {
api.ajax.reload(fnCallback, !bStandingRedraw);
}
return;
}

if (sNewSource !== undefined && sNewSource !== null) {
oSettings.sAjaxSource = sNewSource;
}

// Server-side processing should just call fnDraw
if (oSettings.oFeatures.bServerSide) {
this.fnDraw();
return;
}

this.oApi._fnProcessingDisplay(oSettings, true);
var that = this;
var iStart = oSettings._iDisplayStart;
var aData = [];

this.oApi._fnServerParams(oSettings, aData);

oSettings.fnServerData.call(oSettings.oInstance, oSettings.sAjaxSource, aData, function (json) {
/* Clear the old information from the table */
that.oApi._fnClearTable(oSettings);

/* Got the data - add it to the table */
var aData = (oSettings.sAjaxDataProp !== "") ?
that.oApi._fnGetObjectDataFn(oSettings.sAjaxDataProp)(json) : json;

for (var i = 0; i < aData.length; i++) {
that.oApi._fnAddData(oSettings, aData[i]);
}

oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();

that.fnDraw();

if (bStandingRedraw === true) {
oSettings._iDisplayStart = iStart;
that.oApi._fnCalculateEnd(oSettings);
that.fnDraw(false);
}

that.oApi._fnProcessingDisplay(oSettings, false);

/* Callback user function - for event handlers etc */
if (typeof fnCallback == 'function' && fnCallback !== null) {
fnCallback(oSettings);
}
}, oSettings);
};

$(function () {


// All navigation that is relative should be passed through the navigate
// method, to be processed by the router. If the link has a `data-bypass`
// attribute, bypass the delegation completely.
$(document).on("click", "a:not([data-bypass])", function (evt) {

// Get the absolute anchor href.
var href = $(this).attr("href");

// If the href exists and is a hash route, run it through Backbone.
if (href && href.indexOf("#") === 0) {
// Stop the default event to ensure the link will not cause a page
// refresh.
evt.preventDefault();

// `Backbone.history.navigate` is sufficient for all Routers and will
// trigger the correct events. The Router's internal `navigate` method
// calls this anyways. The fragment is sliced from the root.
Backbone.history.navigate(href, true);
}
});

app.start({
"container": "#app-container"
});

// For easy debug
window.APP = app;
});

app.start({
"container":"#app-container"
});

// For easy debug
window.APP = app;
});



});
2 changes: 1 addition & 1 deletion mrq/dashboard/static/js/vendor/moment.min.js

Large diffs are not rendered by default.

Loading