Normalise line endings.
This commit is contained in:
parent
31ae1b0ae4
commit
c86353c61c
22
.gitattributes
vendored
Normal file
22
.gitattributes
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
||||
|
||||
# Custom for Visual Studio
|
||||
*.cs diff=csharp
|
||||
*.sln merge=union
|
||||
*.csproj merge=union
|
||||
*.vbproj merge=union
|
||||
*.fsproj merge=union
|
||||
*.dbproj merge=union
|
||||
|
||||
# Standard to msysgit
|
||||
*.doc diff=astextplain
|
||||
*.DOC diff=astextplain
|
||||
*.docx diff=astextplain
|
||||
*.DOCX diff=astextplain
|
||||
*.dot diff=astextplain
|
||||
*.DOT diff=astextplain
|
||||
*.pdf diff=astextplain
|
||||
*.PDF diff=astextplain
|
||||
*.rtf diff=astextplain
|
||||
*.RTF diff=astextplain
|
6
.gitignore
vendored
6
.gitignore
vendored
@ -1,4 +1,4 @@
|
||||
.project.txt
|
||||
.pydevproject.txt
|
||||
*.pyc
|
||||
.project.txt
|
||||
.pydevproject.txt
|
||||
*.pyc
|
||||
*Thumbs.db
|
14
README.rst
14
README.rst
@ -1,8 +1,8 @@
|
||||
PyDashy
|
||||
#######
|
||||
|
||||
`Main Documentation <http://evolvedlight.github.com/pydashie/>`_
|
||||
|
||||
PyDashy is a port of `Dashing <https://github.com/Shopify/dashing>`_ by `Shopify <http://www.shopify.com/>`_ to Python 2.7
|
||||
|
||||
PyDashy
|
||||
#######
|
||||
|
||||
`Main Documentation <http://evolvedlight.github.com/pydashie/>`_
|
||||
|
||||
PyDashy is a port of `Dashing <https://github.com/Shopify/dashing>`_ by `Shopify <http://www.shopify.com/>`_ to Python 2.7
|
||||
|
||||
.. image:: http://evolvedlight.github.com/pydashie/images/mainscreen.png
|
@ -1,18 +1,18 @@
|
||||
console.log("Yeah! The dashboard has started!")
|
||||
|
||||
Dashing.on 'ready', ->
|
||||
Dashing.widget_margins ||= [5, 5]
|
||||
Dashing.widget_base_dimensions ||= [300, 360]
|
||||
Dashing.numColumns ||= 4
|
||||
|
||||
contentWidth = (Dashing.widget_base_dimensions[0] + Dashing.widget_margins[0] * 2) * Dashing.numColumns
|
||||
|
||||
Batman.setImmediate ->
|
||||
$('.gridster').width(contentWidth)
|
||||
$('.gridster ul:first').gridster
|
||||
widget_margins: Dashing.widget_margins
|
||||
widget_base_dimensions: Dashing.widget_base_dimensions
|
||||
avoid_overlapped_widgets: !Dashing.customGridsterLayout
|
||||
draggable:
|
||||
stop: Dashing.showGridsterInstructions
|
||||
start: -> Dashing.currentWidgetPositions = Dashing.getWidgetPositions()
|
||||
console.log("Yeah! The dashboard has started!")
|
||||
|
||||
Dashing.on 'ready', ->
|
||||
Dashing.widget_margins ||= [5, 5]
|
||||
Dashing.widget_base_dimensions ||= [300, 360]
|
||||
Dashing.numColumns ||= 4
|
||||
|
||||
contentWidth = (Dashing.widget_base_dimensions[0] + Dashing.widget_margins[0] * 2) * Dashing.numColumns
|
||||
|
||||
Batman.setImmediate ->
|
||||
$('.gridster').width(contentWidth)
|
||||
$('.gridster ul:first').gridster
|
||||
widget_margins: Dashing.widget_margins
|
||||
widget_base_dimensions: Dashing.widget_base_dimensions
|
||||
avoid_overlapped_widgets: !Dashing.customGridsterLayout
|
||||
draggable:
|
||||
stop: Dashing.showGridsterInstructions
|
||||
start: -> Dashing.currentWidgetPositions = Dashing.getWidgetPositions()
|
||||
|
File diff suppressed because one or more lines are too long
@ -1,161 +1,161 @@
|
||||
(function() {
|
||||
|
||||
Batman.extend(Batman.DOM, {
|
||||
querySelectorAll: function(node, selector) {
|
||||
return jQuery(selector, node);
|
||||
},
|
||||
querySelector: function(node, selector) {
|
||||
return jQuery(selector, node)[0];
|
||||
},
|
||||
setInnerHTML: function(node, html) {
|
||||
var child, childNodes, result, _i, _j, _len, _len1;
|
||||
childNodes = (function() {
|
||||
var _i, _len, _ref, _results;
|
||||
_ref = node.childNodes;
|
||||
_results = [];
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
child = _ref[_i];
|
||||
_results.push(child);
|
||||
}
|
||||
return _results;
|
||||
})();
|
||||
for (_i = 0, _len = childNodes.length; _i < _len; _i++) {
|
||||
child = childNodes[_i];
|
||||
Batman.DOM.willRemoveNode(child);
|
||||
}
|
||||
result = jQuery(node).html(html);
|
||||
for (_j = 0, _len1 = childNodes.length; _j < _len1; _j++) {
|
||||
child = childNodes[_j];
|
||||
Batman.DOM.didRemoveNode(child);
|
||||
}
|
||||
return result;
|
||||
},
|
||||
removeNode: function(node) {
|
||||
var _ref;
|
||||
Batman.DOM.willRemoveNode(node);
|
||||
if ((_ref = node.parentNode) != null) {
|
||||
_ref.removeChild(node);
|
||||
}
|
||||
return Batman.DOM.didRemoveNode(node);
|
||||
},
|
||||
destroyNode: function(node) {
|
||||
Batman.DOM.willDestroyNode(node);
|
||||
Batman.DOM.willRemoveNode(node);
|
||||
jQuery(node).remove();
|
||||
Batman.DOM.didRemoveNode(node);
|
||||
return Batman.DOM.didDestroyNode(node);
|
||||
},
|
||||
appendChild: function(parent, child) {
|
||||
Batman.DOM.willInsertNode(child);
|
||||
jQuery(parent).append(child);
|
||||
return Batman.DOM.didInsertNode(child);
|
||||
}
|
||||
});
|
||||
|
||||
Batman.Request.prototype._parseResponseHeaders = function(xhr) {
|
||||
var headers;
|
||||
return headers = xhr.getAllResponseHeaders().split('\n').reduce(function(acc, header) {
|
||||
var key, matches, value;
|
||||
if (matches = header.match(/([^:]*):\s*(.*)/)) {
|
||||
key = matches[1];
|
||||
value = matches[2];
|
||||
acc[key] = value;
|
||||
}
|
||||
return acc;
|
||||
}, {});
|
||||
};
|
||||
|
||||
Batman.Request.prototype._prepareOptions = function(data) {
|
||||
var options, _ref,
|
||||
_this = this;
|
||||
options = {
|
||||
url: this.get('url'),
|
||||
type: this.get('method'),
|
||||
dataType: this.get('type'),
|
||||
data: data || this.get('data'),
|
||||
username: this.get('username'),
|
||||
password: this.get('password'),
|
||||
headers: this.get('headers'),
|
||||
beforeSend: function() {
|
||||
return _this.fire('loading');
|
||||
},
|
||||
success: function(response, textStatus, xhr) {
|
||||
_this.mixin({
|
||||
xhr: xhr,
|
||||
status: xhr.status,
|
||||
response: response,
|
||||
responseHeaders: _this._parseResponseHeaders(xhr)
|
||||
});
|
||||
return _this.fire('success', response);
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
_this.mixin({
|
||||
xhr: xhr,
|
||||
status: xhr.status,
|
||||
response: xhr.responseText,
|
||||
responseHeaders: _this._parseResponseHeaders(xhr)
|
||||
});
|
||||
xhr.request = _this;
|
||||
return _this.fire('error', xhr);
|
||||
},
|
||||
complete: function() {
|
||||
return _this.fire('loaded');
|
||||
}
|
||||
};
|
||||
if ((_ref = this.get('method')) === 'PUT' || _ref === 'POST') {
|
||||
if (!this.hasFileUploads()) {
|
||||
options.contentType = this.get('contentType');
|
||||
if (typeof options.data === 'object') {
|
||||
options.processData = false;
|
||||
options.data = Batman.URI.queryFromParams(options.data);
|
||||
}
|
||||
} else {
|
||||
options.contentType = false;
|
||||
options.processData = false;
|
||||
options.data = this.constructor.objectToFormData(options.data);
|
||||
}
|
||||
}
|
||||
return options;
|
||||
};
|
||||
|
||||
Batman.Request.prototype.send = function(data) {
|
||||
return jQuery.ajax(this._prepareOptions(data));
|
||||
};
|
||||
|
||||
Batman.mixins.animation = {
|
||||
show: function(addToParent) {
|
||||
var jq, show, _ref, _ref1;
|
||||
jq = $(this);
|
||||
show = function() {
|
||||
return jq.show(600);
|
||||
};
|
||||
if (addToParent) {
|
||||
if ((_ref = addToParent.append) != null) {
|
||||
_ref.appendChild(this);
|
||||
}
|
||||
if ((_ref1 = addToParent.before) != null) {
|
||||
_ref1.parentNode.insertBefore(this, addToParent.before);
|
||||
}
|
||||
jq.hide();
|
||||
setTimeout(show, 0);
|
||||
} else {
|
||||
show();
|
||||
}
|
||||
return this;
|
||||
},
|
||||
hide: function(removeFromParent) {
|
||||
var _this = this;
|
||||
$(this).hide(600, function() {
|
||||
var _ref;
|
||||
if (removeFromParent) {
|
||||
if ((_ref = _this.parentNode) != null) {
|
||||
_ref.removeChild(_this);
|
||||
}
|
||||
}
|
||||
return Batman.DOM.didRemoveNode(_this);
|
||||
});
|
||||
return this;
|
||||
}
|
||||
};
|
||||
|
||||
(function() {
|
||||
|
||||
Batman.extend(Batman.DOM, {
|
||||
querySelectorAll: function(node, selector) {
|
||||
return jQuery(selector, node);
|
||||
},
|
||||
querySelector: function(node, selector) {
|
||||
return jQuery(selector, node)[0];
|
||||
},
|
||||
setInnerHTML: function(node, html) {
|
||||
var child, childNodes, result, _i, _j, _len, _len1;
|
||||
childNodes = (function() {
|
||||
var _i, _len, _ref, _results;
|
||||
_ref = node.childNodes;
|
||||
_results = [];
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
child = _ref[_i];
|
||||
_results.push(child);
|
||||
}
|
||||
return _results;
|
||||
})();
|
||||
for (_i = 0, _len = childNodes.length; _i < _len; _i++) {
|
||||
child = childNodes[_i];
|
||||
Batman.DOM.willRemoveNode(child);
|
||||
}
|
||||
result = jQuery(node).html(html);
|
||||
for (_j = 0, _len1 = childNodes.length; _j < _len1; _j++) {
|
||||
child = childNodes[_j];
|
||||
Batman.DOM.didRemoveNode(child);
|
||||
}
|
||||
return result;
|
||||
},
|
||||
removeNode: function(node) {
|
||||
var _ref;
|
||||
Batman.DOM.willRemoveNode(node);
|
||||
if ((_ref = node.parentNode) != null) {
|
||||
_ref.removeChild(node);
|
||||
}
|
||||
return Batman.DOM.didRemoveNode(node);
|
||||
},
|
||||
destroyNode: function(node) {
|
||||
Batman.DOM.willDestroyNode(node);
|
||||
Batman.DOM.willRemoveNode(node);
|
||||
jQuery(node).remove();
|
||||
Batman.DOM.didRemoveNode(node);
|
||||
return Batman.DOM.didDestroyNode(node);
|
||||
},
|
||||
appendChild: function(parent, child) {
|
||||
Batman.DOM.willInsertNode(child);
|
||||
jQuery(parent).append(child);
|
||||
return Batman.DOM.didInsertNode(child);
|
||||
}
|
||||
});
|
||||
|
||||
Batman.Request.prototype._parseResponseHeaders = function(xhr) {
|
||||
var headers;
|
||||
return headers = xhr.getAllResponseHeaders().split('\n').reduce(function(acc, header) {
|
||||
var key, matches, value;
|
||||
if (matches = header.match(/([^:]*):\s*(.*)/)) {
|
||||
key = matches[1];
|
||||
value = matches[2];
|
||||
acc[key] = value;
|
||||
}
|
||||
return acc;
|
||||
}, {});
|
||||
};
|
||||
|
||||
Batman.Request.prototype._prepareOptions = function(data) {
|
||||
var options, _ref,
|
||||
_this = this;
|
||||
options = {
|
||||
url: this.get('url'),
|
||||
type: this.get('method'),
|
||||
dataType: this.get('type'),
|
||||
data: data || this.get('data'),
|
||||
username: this.get('username'),
|
||||
password: this.get('password'),
|
||||
headers: this.get('headers'),
|
||||
beforeSend: function() {
|
||||
return _this.fire('loading');
|
||||
},
|
||||
success: function(response, textStatus, xhr) {
|
||||
_this.mixin({
|
||||
xhr: xhr,
|
||||
status: xhr.status,
|
||||
response: response,
|
||||
responseHeaders: _this._parseResponseHeaders(xhr)
|
||||
});
|
||||
return _this.fire('success', response);
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
_this.mixin({
|
||||
xhr: xhr,
|
||||
status: xhr.status,
|
||||
response: xhr.responseText,
|
||||
responseHeaders: _this._parseResponseHeaders(xhr)
|
||||
});
|
||||
xhr.request = _this;
|
||||
return _this.fire('error', xhr);
|
||||
},
|
||||
complete: function() {
|
||||
return _this.fire('loaded');
|
||||
}
|
||||
};
|
||||
if ((_ref = this.get('method')) === 'PUT' || _ref === 'POST') {
|
||||
if (!this.hasFileUploads()) {
|
||||
options.contentType = this.get('contentType');
|
||||
if (typeof options.data === 'object') {
|
||||
options.processData = false;
|
||||
options.data = Batman.URI.queryFromParams(options.data);
|
||||
}
|
||||
} else {
|
||||
options.contentType = false;
|
||||
options.processData = false;
|
||||
options.data = this.constructor.objectToFormData(options.data);
|
||||
}
|
||||
}
|
||||
return options;
|
||||
};
|
||||
|
||||
Batman.Request.prototype.send = function(data) {
|
||||
return jQuery.ajax(this._prepareOptions(data));
|
||||
};
|
||||
|
||||
Batman.mixins.animation = {
|
||||
show: function(addToParent) {
|
||||
var jq, show, _ref, _ref1;
|
||||
jq = $(this);
|
||||
show = function() {
|
||||
return jq.show(600);
|
||||
};
|
||||
if (addToParent) {
|
||||
if ((_ref = addToParent.append) != null) {
|
||||
_ref.appendChild(this);
|
||||
}
|
||||
if ((_ref1 = addToParent.before) != null) {
|
||||
_ref1.parentNode.insertBefore(this, addToParent.before);
|
||||
}
|
||||
jq.hide();
|
||||
setTimeout(show, 0);
|
||||
} else {
|
||||
show();
|
||||
}
|
||||
return this;
|
||||
},
|
||||
hide: function(removeFromParent) {
|
||||
var _this = this;
|
||||
$(this).hide(600, function() {
|
||||
var _ref;
|
||||
if (removeFromParent) {
|
||||
if ((_ref = _this.parentNode) != null) {
|
||||
_ref.removeChild(_this);
|
||||
}
|
||||
}
|
||||
return Batman.DOM.didRemoveNode(_this);
|
||||
});
|
||||
return this;
|
||||
}
|
||||
};
|
||||
|
||||
}).call(this);
|
File diff suppressed because it is too large
Load Diff
6
pydashie/assets/javascripts/d3.v2.min.js
vendored
6
pydashie/assets/javascripts/d3.v2.min.js
vendored
File diff suppressed because one or more lines are too long
@ -1,110 +1,110 @@
|
||||
#= require jquery
|
||||
#= require es5-shim
|
||||
#= require batman
|
||||
#= require batman.jquery
|
||||
|
||||
|
||||
Batman.Filters.prettyNumber = (num) ->
|
||||
num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") unless isNaN(num)
|
||||
|
||||
Batman.Filters.dashize = (str) ->
|
||||
dashes_rx1 = /([A-Z]+)([A-Z][a-z])/g;
|
||||
dashes_rx2 = /([a-z\d])([A-Z])/g;
|
||||
|
||||
return str.replace(dashes_rx1, '$1_$2').replace(dashes_rx2, '$1_$2').replace('_', '-').toLowerCase()
|
||||
|
||||
Batman.Filters.shortenedNumber = (num) ->
|
||||
return num if isNaN(num)
|
||||
if num >= 1000000000
|
||||
(num / 1000000000).toFixed(1) + 'B'
|
||||
else if num >= 1000000
|
||||
(num / 1000000).toFixed(1) + 'M'
|
||||
else if num >= 1000
|
||||
(num / 1000).toFixed(1) + 'K'
|
||||
else
|
||||
num
|
||||
|
||||
class window.Dashing extends Batman.App
|
||||
@root ->
|
||||
Dashing.params = Batman.URI.paramsFromQuery(window.location.search.slice(1));
|
||||
|
||||
class Dashing.Widget extends Batman.View
|
||||
constructor: ->
|
||||
# Set the view path
|
||||
@constructor::source = Batman.Filters.underscore(@constructor.name)
|
||||
super
|
||||
|
||||
@mixin($(@node).data())
|
||||
Dashing.widgets[@id] ||= []
|
||||
Dashing.widgets[@id].push(@)
|
||||
@mixin(Dashing.lastEvents[@id]) # in case the events from the server came before the widget was rendered
|
||||
|
||||
type = Batman.Filters.dashize(@view)
|
||||
$(@node).addClass("widget widget-#{type} #{@id}")
|
||||
|
||||
@accessor 'updatedAtMessage', ->
|
||||
if updatedAt = @get('updatedAt')
|
||||
timestamp = updatedAt.toString().match(/\d*:\d*/)[0]
|
||||
"Last updated at #{timestamp}"
|
||||
|
||||
@::on 'ready', ->
|
||||
Dashing.Widget.fire 'ready'
|
||||
|
||||
receiveData: (data) =>
|
||||
@mixin(data)
|
||||
@onData(data)
|
||||
|
||||
onData: (data) =>
|
||||
# Widgets override this to handle incoming data
|
||||
|
||||
Dashing.AnimatedValue =
|
||||
get: Batman.Property.defaultAccessor.get
|
||||
set: (k, to) ->
|
||||
if !to? || isNaN(to)
|
||||
@[k] = to
|
||||
else
|
||||
timer = "interval_#{k}"
|
||||
num = if (!isNaN(@[k]) && @[k]?) then @[k] else 0
|
||||
unless @[timer] || num == to
|
||||
to = parseFloat(to)
|
||||
num = parseFloat(num)
|
||||
up = to > num
|
||||
num_interval = Math.abs(num - to) / 90
|
||||
@[timer] =
|
||||
setInterval =>
|
||||
num = if up then Math.ceil(num+num_interval) else Math.floor(num-num_interval)
|
||||
if (up && num > to) || (!up && num < to)
|
||||
num = to
|
||||
clearInterval(@[timer])
|
||||
@[timer] = null
|
||||
delete @[timer]
|
||||
@[k] = num
|
||||
@set k, to
|
||||
, 10
|
||||
@[k] = num
|
||||
|
||||
Dashing.widgets = widgets = {}
|
||||
Dashing.lastEvents = lastEvents = {}
|
||||
Dashing.debugMode = false
|
||||
|
||||
source = new EventSource('/events')
|
||||
source.addEventListener 'open', (e) ->
|
||||
console.log("Connection opened")
|
||||
|
||||
source.addEventListener 'error', (e)->
|
||||
console.log("Connection error")
|
||||
if (e.readyState == EventSource.CLOSED)
|
||||
console.log("Connection closed")
|
||||
|
||||
source.addEventListener 'message', (e) =>
|
||||
data = JSON.parse(e.data)
|
||||
if Dashing.debugMode
|
||||
console.log("Received data for #{data.id}", data)
|
||||
lastEvents[data.id] = data
|
||||
if widgets[data.id]?.length > 0
|
||||
for widget in widgets[data.id]
|
||||
widget.receiveData(data)
|
||||
|
||||
|
||||
$(document).ready ->
|
||||
Dashing.run()
|
||||
#= require jquery
|
||||
#= require es5-shim
|
||||
#= require batman
|
||||
#= require batman.jquery
|
||||
|
||||
|
||||
Batman.Filters.prettyNumber = (num) ->
|
||||
num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") unless isNaN(num)
|
||||
|
||||
Batman.Filters.dashize = (str) ->
|
||||
dashes_rx1 = /([A-Z]+)([A-Z][a-z])/g;
|
||||
dashes_rx2 = /([a-z\d])([A-Z])/g;
|
||||
|
||||
return str.replace(dashes_rx1, '$1_$2').replace(dashes_rx2, '$1_$2').replace('_', '-').toLowerCase()
|
||||
|
||||
Batman.Filters.shortenedNumber = (num) ->
|
||||
return num if isNaN(num)
|
||||
if num >= 1000000000
|
||||
(num / 1000000000).toFixed(1) + 'B'
|
||||
else if num >= 1000000
|
||||
(num / 1000000).toFixed(1) + 'M'
|
||||
else if num >= 1000
|
||||
(num / 1000).toFixed(1) + 'K'
|
||||
else
|
||||
num
|
||||
|
||||
class window.Dashing extends Batman.App
|
||||
@root ->
|
||||
Dashing.params = Batman.URI.paramsFromQuery(window.location.search.slice(1));
|
||||
|
||||
class Dashing.Widget extends Batman.View
|
||||
constructor: ->
|
||||
# Set the view path
|
||||
@constructor::source = Batman.Filters.underscore(@constructor.name)
|
||||
super
|
||||
|
||||
@mixin($(@node).data())
|
||||
Dashing.widgets[@id] ||= []
|
||||
Dashing.widgets[@id].push(@)
|
||||
@mixin(Dashing.lastEvents[@id]) # in case the events from the server came before the widget was rendered
|
||||
|
||||
type = Batman.Filters.dashize(@view)
|
||||
$(@node).addClass("widget widget-#{type} #{@id}")
|
||||
|
||||
@accessor 'updatedAtMessage', ->
|
||||
if updatedAt = @get('updatedAt')
|
||||
timestamp = updatedAt.toString().match(/\d*:\d*/)[0]
|
||||
"Last updated at #{timestamp}"
|
||||
|
||||
@::on 'ready', ->
|
||||
Dashing.Widget.fire 'ready'
|
||||
|
||||
receiveData: (data) =>
|
||||
@mixin(data)
|
||||
@onData(data)
|
||||
|
||||
onData: (data) =>
|
||||
# Widgets override this to handle incoming data
|
||||
|
||||
Dashing.AnimatedValue =
|
||||
get: Batman.Property.defaultAccessor.get
|
||||
set: (k, to) ->
|
||||
if !to? || isNaN(to)
|
||||
@[k] = to
|
||||
else
|
||||
timer = "interval_#{k}"
|
||||
num = if (!isNaN(@[k]) && @[k]?) then @[k] else 0
|
||||
unless @[timer] || num == to
|
||||
to = parseFloat(to)
|
||||
num = parseFloat(num)
|
||||
up = to > num
|
||||
num_interval = Math.abs(num - to) / 90
|
||||
@[timer] =
|
||||
setInterval =>
|
||||
num = if up then Math.ceil(num+num_interval) else Math.floor(num-num_interval)
|
||||
if (up && num > to) || (!up && num < to)
|
||||
num = to
|
||||
clearInterval(@[timer])
|
||||
@[timer] = null
|
||||
delete @[timer]
|
||||
@[k] = num
|
||||
@set k, to
|
||||
, 10
|
||||
@[k] = num
|
||||
|
||||
Dashing.widgets = widgets = {}
|
||||
Dashing.lastEvents = lastEvents = {}
|
||||
Dashing.debugMode = false
|
||||
|
||||
source = new EventSource('/events')
|
||||
source.addEventListener 'open', (e) ->
|
||||
console.log("Connection opened")
|
||||
|
||||
source.addEventListener 'error', (e)->
|
||||
console.log("Connection error")
|
||||
if (e.readyState == EventSource.CLOSED)
|
||||
console.log("Connection closed")
|
||||
|
||||
source.addEventListener 'message', (e) =>
|
||||
data = JSON.parse(e.data)
|
||||
if Dashing.debugMode
|
||||
console.log("Received data for #{data.id}", data)
|
||||
lastEvents[data.id] = data
|
||||
if widgets[data.id]?.length > 0
|
||||
for widget in widgets[data.id]
|
||||
widget.receiveData(data)
|
||||
|
||||
|
||||
$(document).ready ->
|
||||
Dashing.run()
|
||||
|
@ -1,37 +1,37 @@
|
||||
#= require_directory ./gridster
|
||||
|
||||
# This file enables gridster integration (http://gridster.net/)
|
||||
# Delete it if you'd rather handle the layout yourself.
|
||||
# You'll miss out on a lot if you do, but we won't hold it against you.
|
||||
|
||||
Dashing.gridsterLayout = (positions) ->
|
||||
Dashing.customGridsterLayout = true
|
||||
positions = positions.replace(/^"|"$/g, '')
|
||||
positions = $.parseJSON(positions)
|
||||
widgets = $("[data-row^=]")
|
||||
for widget, index in widgets
|
||||
$(widget).attr('data-row', positions[index].row)
|
||||
$(widget).attr('data-col', positions[index].col)
|
||||
|
||||
Dashing.getWidgetPositions = ->
|
||||
$(".gridster ul:first").gridster().data('gridster').serialize()
|
||||
|
||||
Dashing.showGridsterInstructions = ->
|
||||
newWidgetPositions = Dashing.getWidgetPositions()
|
||||
|
||||
unless JSON.stringify(newWidgetPositions) == JSON.stringify(Dashing.currentWidgetPositions)
|
||||
Dashing.currentWidgetPositions = newWidgetPositions
|
||||
$('#save-gridster').slideDown()
|
||||
$('#gridster-code').text("
|
||||
<script type='text/javascript'>\n
|
||||
$(function() {\n
|
||||
\ \ Dashing.gridsterLayout('#{JSON.stringify(Dashing.currentWidgetPositions)}')\n
|
||||
});\n
|
||||
</script>
|
||||
")
|
||||
|
||||
$ ->
|
||||
$('#save-gridster').leanModal()
|
||||
|
||||
$('#save-gridster').click ->
|
||||
$('#save-gridster').slideUp()
|
||||
#= require_directory ./gridster
|
||||
|
||||
# This file enables gridster integration (http://gridster.net/)
|
||||
# Delete it if you'd rather handle the layout yourself.
|
||||
# You'll miss out on a lot if you do, but we won't hold it against you.
|
||||
|
||||
Dashing.gridsterLayout = (positions) ->
|
||||
Dashing.customGridsterLayout = true
|
||||
positions = positions.replace(/^"|"$/g, '')
|
||||
positions = $.parseJSON(positions)
|
||||
widgets = $("[data-row^=]")
|
||||
for widget, index in widgets
|
||||
$(widget).attr('data-row', positions[index].row)
|
||||
$(widget).attr('data-col', positions[index].col)
|
||||
|
||||
Dashing.getWidgetPositions = ->
|
||||
$(".gridster ul:first").gridster().data('gridster').serialize()
|
||||
|
||||
Dashing.showGridsterInstructions = ->
|
||||
newWidgetPositions = Dashing.getWidgetPositions()
|
||||
|
||||
unless JSON.stringify(newWidgetPositions) == JSON.stringify(Dashing.currentWidgetPositions)
|
||||
Dashing.currentWidgetPositions = newWidgetPositions
|
||||
$('#save-gridster').slideDown()
|
||||
$('#gridster-code').text("
|
||||
<script type='text/javascript'>\n
|
||||
$(function() {\n
|
||||
\ \ Dashing.gridsterLayout('#{JSON.stringify(Dashing.currentWidgetPositions)}')\n
|
||||
});\n
|
||||
</script>
|
||||
")
|
||||
|
||||
$ ->
|
||||
$('#save-gridster').leanModal()
|
||||
|
||||
$('#save-gridster').click ->
|
||||
$('#save-gridster').slideUp()
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
6
pydashie/assets/javascripts/jquery.js
vendored
6
pydashie/assets/javascripts/jquery.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
||||
// leanModal v1.1 by Ray Stone - http://finelysliced.com.au
|
||||
// Dual licensed under the MIT and GPL
|
||||
|
||||
(function($){$.fn.extend({leanModal:function(options){var defaults={top:100,overlay:0.5,closeButton:null};var overlay=$("<div id='lean_overlay'></div>");$("body").append(overlay);options=$.extend(defaults,options);return this.each(function(){var o=options;$(this).click(function(e){var modal_id=$(this).attr("href");$("#lean_overlay").click(function(){close_modal(modal_id)});$(o.closeButton).click(function(){close_modal(modal_id)});var modal_height=$(modal_id).outerHeight();var modal_width=$(modal_id).outerWidth();
|
||||
$("#lean_overlay").css({"display":"block",opacity:0});$("#lean_overlay").fadeTo(200,o.overlay);$(modal_id).css({"display":"block","position":"fixed","opacity":0,"z-index":11000,"left":50+"%","margin-left":-(modal_width/2)+"px","top":o.top+"px"});$(modal_id).fadeTo(200,1);e.preventDefault()})});function close_modal(modal_id){$("#lean_overlay").fadeOut(200);$(modal_id).css({"display":"none"})}}})})(jQuery);
|
||||
// leanModal v1.1 by Ray Stone - http://finelysliced.com.au
|
||||
// Dual licensed under the MIT and GPL
|
||||
|
||||
(function($){$.fn.extend({leanModal:function(options){var defaults={top:100,overlay:0.5,closeButton:null};var overlay=$("<div id='lean_overlay'></div>");$("body").append(overlay);options=$.extend(defaults,options);return this.each(function(){var o=options;$(this).click(function(e){var modal_id=$(this).attr("href");$("#lean_overlay").click(function(){close_modal(modal_id)});$(o.closeButton).click(function(){close_modal(modal_id)});var modal_height=$(modal_id).outerHeight();var modal_width=$(modal_id).outerWidth();
|
||||
$("#lean_overlay").css({"display":"block",opacity:0});$("#lean_overlay").fadeTo(200,o.overlay);$(modal_id).css({"display":"block","position":"fixed","opacity":0,"z-index":11000,"left":50+"%","margin-left":-(modal_width/2)+"px","top":o.top+"px"});$(modal_id).fadeTo(200,1);e.preventDefault()})});function close_modal(modal_id){$("#lean_overlay").fadeOut(200);$(modal_id).css({"display":"none"})}}})})(jQuery);
|
||||
|
2
pydashie/assets/javascripts/rickshaw.min.js
vendored
2
pydashie/assets/javascripts/rickshaw.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@ -1,255 +1,255 @@
|
||||
/*
|
||||
//=require_directory .
|
||||
//=require_tree ../../widgets
|
||||
*/
|
||||
// ----------------------------------------------------------------------------
|
||||
// Sass declarations
|
||||
// ----------------------------------------------------------------------------
|
||||
$background-color: #222;
|
||||
$text-color: #fff;
|
||||
|
||||
$background-warning-color-1: #e82711;
|
||||
$background-warning-color-2: #9b2d23;
|
||||
$text-warning-color: #fff;
|
||||
|
||||
$background-danger-color-1: #eeae32;
|
||||
$background-danger-color-2: #ff9618;
|
||||
$text-danger-color: #fff;
|
||||
|
||||
@-webkit-keyframes status-warning-background {
|
||||
0% { background-color: $background-warning-color-1; }
|
||||
50% { background-color: $background-warning-color-2; }
|
||||
100% { background-color: $background-warning-color-1; }
|
||||
}
|
||||
@-webkit-keyframes status-danger-background {
|
||||
0% { background-color: $background-danger-color-1; }
|
||||
50% { background-color: $background-danger-color-2; }
|
||||
100% { background-color: $background-danger-color-1; }
|
||||
}
|
||||
@mixin animation($animation-name, $duration, $function, $animation-iteration-count:""){
|
||||
-webkit-animation: $animation-name $duration $function #{$animation-iteration-count};
|
||||
-moz-animation: $animation-name $duration $function #{$animation-iteration-count};
|
||||
-ms-animation: $animation-name $duration $function #{$animation-iteration-count};
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Base styles
|
||||
// ----------------------------------------------------------------------------
|
||||
html {
|
||||
font-size: 100%;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
-ms-text-size-adjust: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
background-color: $background-color;
|
||||
font-size: 20px;
|
||||
color: $text-color;
|
||||
font-family: 'Open Sans', "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
}
|
||||
|
||||
b, strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
img {
|
||||
border: 0;
|
||||
-ms-interpolation-mode: bicubic;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
img, object {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
iframe {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
td {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
ul, ol {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, p {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
h1 {
|
||||
margin-bottom: 12px;
|
||||
text-align: center;
|
||||
font-size: 30px;
|
||||
font-weight: 400;
|
||||
}
|
||||
h2 {
|
||||
text-transform: uppercase;
|
||||
font-size: 76px;
|
||||
font-weight: 700;
|
||||
color: $text-color;
|
||||
}
|
||||
h3 {
|
||||
font-size: 25px;
|
||||
font-weight: 600;
|
||||
color: $text-color;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Base widget styles
|
||||
// ----------------------------------------------------------------------------
|
||||
.gridster {
|
||||
margin: 0px auto;
|
||||
}
|
||||
|
||||
.icon-background {
|
||||
width: 100%!important;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
opacity: 0.1;
|
||||
font-size: 275px;
|
||||
}
|
||||
|
||||
.list-nostyle {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.gridster ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.gs_w {
|
||||
width: 100%;
|
||||
display: table;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.widget {
|
||||
padding: 25px 12px;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
display: table-cell;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.widget.status-warning {
|
||||
background-color: $background-warning-color-1;
|
||||
@include animation(status-warning-background, 2s, ease, infinite);
|
||||
|
||||
.icon-warning-sign {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.title, .more-info {
|
||||
color: $text-warning-color;
|
||||
}
|
||||
}
|
||||
|
||||
.widget.status-danger {
|
||||
color: $text-danger-color;
|
||||
background-color: $background-danger-color-1;
|
||||
@include animation(status-danger-background, 2s, ease, infinite);
|
||||
|
||||
.icon-warning-sign {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.title, .more-info {
|
||||
color: $text-danger-color;
|
||||
}
|
||||
}
|
||||
|
||||
.more-info {
|
||||
font-size: 15px;
|
||||
position: absolute;
|
||||
bottom: 32px;
|
||||
left: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.updated-at {
|
||||
font-size: 15px;
|
||||
position: absolute;
|
||||
bottom: 12px;
|
||||
left: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
#save-gridster {
|
||||
display: none;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
margin: 0px auto;
|
||||
left: 50%;
|
||||
z-index: 1000;
|
||||
background: black;
|
||||
width: 190px;
|
||||
text-align: center;
|
||||
border: 1px solid white;
|
||||
border-top: 0px;
|
||||
margin-left: -95px;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
#save-gridster:hover {
|
||||
padding-top: 25px;
|
||||
}
|
||||
|
||||
#saving-instructions {
|
||||
display: none;
|
||||
padding: 10px;
|
||||
width: 500px;
|
||||
height: 122px;
|
||||
z-index: 1000;
|
||||
background: white;
|
||||
top: 100px;
|
||||
color: black;
|
||||
font-size: 15px;
|
||||
padding-bottom: 4px;
|
||||
|
||||
textarea {
|
||||
white-space: nowrap;
|
||||
width: 494px;
|
||||
height: 80px;
|
||||
}
|
||||
}
|
||||
|
||||
#lean_overlay {
|
||||
position: fixed;
|
||||
z-index:100;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
height:100%;
|
||||
width:100%;
|
||||
background: #000;
|
||||
display: none;
|
||||
}
|
||||
|
||||
#container {
|
||||
padding-top: 5px;
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Clearfix
|
||||
// ----------------------------------------------------------------------------
|
||||
.clearfix:before, .clearfix:after { content: "\0020"; display: block; height: 0; overflow: hidden; }
|
||||
.clearfix:after { clear: both; }
|
||||
.clearfix { zoom: 1; }
|
||||
|
||||
/*
|
||||
//=require_directory .
|
||||
//=require_tree ../../widgets
|
||||
*/
|
||||
// ----------------------------------------------------------------------------
|
||||
// Sass declarations
|
||||
// ----------------------------------------------------------------------------
|
||||
$background-color: #222;
|
||||
$text-color: #fff;
|
||||
|
||||
$background-warning-color-1: #e82711;
|
||||
$background-warning-color-2: #9b2d23;
|
||||
$text-warning-color: #fff;
|
||||
|
||||
$background-danger-color-1: #eeae32;
|
||||
$background-danger-color-2: #ff9618;
|
||||
$text-danger-color: #fff;
|
||||
|
||||
@-webkit-keyframes status-warning-background {
|
||||
0% { background-color: $background-warning-color-1; }
|
||||
50% { background-color: $background-warning-color-2; }
|
||||
100% { background-color: $background-warning-color-1; }
|
||||
}
|
||||
@-webkit-keyframes status-danger-background {
|
||||
0% { background-color: $background-danger-color-1; }
|
||||
50% { background-color: $background-danger-color-2; }
|
||||
100% { background-color: $background-danger-color-1; }
|
||||
}
|
||||
@mixin animation($animation-name, $duration, $function, $animation-iteration-count:""){
|
||||
-webkit-animation: $animation-name $duration $function #{$animation-iteration-count};
|
||||
-moz-animation: $animation-name $duration $function #{$animation-iteration-count};
|
||||
-ms-animation: $animation-name $duration $function #{$animation-iteration-count};
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Base styles
|
||||
// ----------------------------------------------------------------------------
|
||||
html {
|
||||
font-size: 100%;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
-ms-text-size-adjust: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
background-color: $background-color;
|
||||
font-size: 20px;
|
||||
color: $text-color;
|
||||
font-family: 'Open Sans', "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
}
|
||||
|
||||
b, strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
img {
|
||||
border: 0;
|
||||
-ms-interpolation-mode: bicubic;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
img, object {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
iframe {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
td {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
ul, ol {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, p {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
h1 {
|
||||
margin-bottom: 12px;
|
||||
text-align: center;
|
||||
font-size: 30px;
|
||||
font-weight: 400;
|
||||
}
|
||||
h2 {
|
||||
text-transform: uppercase;
|
||||
font-size: 76px;
|
||||
font-weight: 700;
|
||||
color: $text-color;
|
||||
}
|
||||
h3 {
|
||||
font-size: 25px;
|
||||
font-weight: 600;
|
||||
color: $text-color;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Base widget styles
|
||||
// ----------------------------------------------------------------------------
|
||||
.gridster {
|
||||
margin: 0px auto;
|
||||
}
|
||||
|
||||
.icon-background {
|
||||
width: 100%!important;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
opacity: 0.1;
|
||||
font-size: 275px;
|
||||
}
|
||||
|
||||
.list-nostyle {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.gridster ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.gs_w {
|
||||
width: 100%;
|
||||
display: table;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.widget {
|
||||
padding: 25px 12px;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
display: table-cell;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.widget.status-warning {
|
||||
background-color: $background-warning-color-1;
|
||||
@include animation(status-warning-background, 2s, ease, infinite);
|
||||
|
||||
.icon-warning-sign {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.title, .more-info {
|
||||
color: $text-warning-color;
|
||||
}
|
||||
}
|
||||
|
||||
.widget.status-danger {
|
||||
color: $text-danger-color;
|
||||
background-color: $background-danger-color-1;
|
||||
@include animation(status-danger-background, 2s, ease, infinite);
|
||||
|
||||
.icon-warning-sign {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.title, .more-info {
|
||||
color: $text-danger-color;
|
||||
}
|
||||
}
|
||||
|
||||
.more-info {
|
||||
font-size: 15px;
|
||||
position: absolute;
|
||||
bottom: 32px;
|
||||
left: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.updated-at {
|
||||
font-size: 15px;
|
||||
position: absolute;
|
||||
bottom: 12px;
|
||||
left: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
#save-gridster {
|
||||
display: none;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
margin: 0px auto;
|
||||
left: 50%;
|
||||
z-index: 1000;
|
||||
background: black;
|
||||
width: 190px;
|
||||
text-align: center;
|
||||
border: 1px solid white;
|
||||
border-top: 0px;
|
||||
margin-left: -95px;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
#save-gridster:hover {
|
||||
padding-top: 25px;
|
||||
}
|
||||
|
||||
#saving-instructions {
|
||||
display: none;
|
||||
padding: 10px;
|
||||
width: 500px;
|
||||
height: 122px;
|
||||
z-index: 1000;
|
||||
background: white;
|
||||
top: 100px;
|
||||
color: black;
|
||||
font-size: 15px;
|
||||
padding-bottom: 4px;
|
||||
|
||||
textarea {
|
||||
white-space: nowrap;
|
||||
width: 494px;
|
||||
height: 80px;
|
||||
}
|
||||
}
|
||||
|
||||
#lean_overlay {
|
||||
position: fixed;
|
||||
z-index:100;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
height:100%;
|
||||
width:100%;
|
||||
background: #000;
|
||||
display: none;
|
||||
}
|
||||
|
||||
#container {
|
||||
padding-top: 5px;
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Clearfix
|
||||
// ----------------------------------------------------------------------------
|
||||
.clearfix:before, .clearfix:after { content: "\0020"; display: block; height: 0; overflow: hidden; }
|
||||
.clearfix:after { clear: both; }
|
||||
.clearfix { zoom: 1; }
|
||||
|
||||
|
606
pydashie/assets/stylesheets/font-awesome.css
vendored
606
pydashie/assets/stylesheets/font-awesome.css
vendored
@ -1,303 +1,303 @@
|
||||
/* Font Awesome
|
||||
the iconic font designed for use with Twitter Bootstrap
|
||||
-------------------------------------------------------
|
||||
The full suite of pictographic icons, examples, and documentation
|
||||
can be found at: http://fortawesome.github.com/Font-Awesome/
|
||||
|
||||
License
|
||||
-------------------------------------------------------
|
||||
The Font Awesome webfont, CSS, and LESS files are licensed under CC BY 3.0:
|
||||
http://creativecommons.org/licenses/by/3.0/ A mention of
|
||||
'Font Awesome - http://fortawesome.github.com/Font-Awesome' in human-readable
|
||||
source code is considered acceptable attribution (most common on the web).
|
||||
If human readable source code is not available to the end user, a mention in
|
||||
an 'About' or 'Credits' screen is considered acceptable (most common in desktop
|
||||
or mobile software).
|
||||
|
||||
Contact
|
||||
-------------------------------------------------------
|
||||
Email: dave@davegandy.com
|
||||
Twitter: http://twitter.com/fortaweso_me
|
||||
Work: http://lemonwi.se co-founder
|
||||
|
||||
*/
|
||||
@font-face {
|
||||
font-family: "FontAwesome";
|
||||
src: url('/assets/fontawesome-webfont.eot');
|
||||
src: url('/assets/fontawesome-webfont.eot?#iefix') format('eot'), url('/assets/fontawesome-webfont.woff') format('woff'), url('/assets/fontawesome-webfont.ttf') format('truetype'), url('/assets/fontawesome-webfont.svg#FontAwesome') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
/* Font Awesome styles
|
||||
------------------------------------------------------- */
|
||||
[class^="icon-"]:before, [class*=" icon-"]:before {
|
||||
font-family: FontAwesome;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
display: inline-block;
|
||||
text-decoration: inherit;
|
||||
}
|
||||
a [class^="icon-"], a [class*=" icon-"] {
|
||||
display: inline-block;
|
||||
text-decoration: inherit;
|
||||
}
|
||||
/* makes the font 33% larger relative to the icon container */
|
||||
.icon-large:before {
|
||||
vertical-align: top;
|
||||
font-size: 1.3333333333333333em;
|
||||
}
|
||||
.btn [class^="icon-"], .btn [class*=" icon-"] {
|
||||
/* keeps button heights with and without icons the same */
|
||||
|
||||
line-height: .9em;
|
||||
}
|
||||
li [class^="icon-"], li [class*=" icon-"] {
|
||||
display: inline-block;
|
||||
width: 1.25em;
|
||||
text-align: center;
|
||||
}
|
||||
li .icon-large[class^="icon-"], li .icon-large[class*=" icon-"] {
|
||||
/* 1.5 increased font size for icon-large * 1.25 width */
|
||||
|
||||
width: 1.875em;
|
||||
}
|
||||
li[class^="icon-"], li[class*=" icon-"] {
|
||||
margin-left: 0;
|
||||
list-style-type: none;
|
||||
}
|
||||
li[class^="icon-"]:before, li[class*=" icon-"]:before {
|
||||
text-indent: -2em;
|
||||
text-align: center;
|
||||
}
|
||||
li[class^="icon-"].icon-large:before, li[class*=" icon-"].icon-large:before {
|
||||
text-indent: -1.3333333333333333em;
|
||||
}
|
||||
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
|
||||
readers do not read off random characters that represent icons */
|
||||
.icon-glass:before { content: "\f000"; }
|
||||
.icon-music:before { content: "\f001"; }
|
||||
.icon-search:before { content: "\f002"; }
|
||||
.icon-envelope:before { content: "\f003"; }
|
||||
.icon-heart:before { content: "\f004"; }
|
||||
.icon-star:before { content: "\f005"; }
|
||||
.icon-star-empty:before { content: "\f006"; }
|
||||
.icon-user:before { content: "\f007"; }
|
||||
.icon-film:before { content: "\f008"; }
|
||||
.icon-th-large:before { content: "\f009"; }
|
||||
.icon-th:before { content: "\f00a"; }
|
||||
.icon-th-list:before { content: "\f00b"; }
|
||||
.icon-ok:before { content: "\f00c"; }
|
||||
.icon-remove:before { content: "\f00d"; }
|
||||
.icon-zoom-in:before { content: "\f00e"; }
|
||||
|
||||
.icon-zoom-out:before { content: "\f010"; }
|
||||
.icon-off:before { content: "\f011"; }
|
||||
.icon-signal:before { content: "\f012"; }
|
||||
.icon-cog:before { content: "\f013"; }
|
||||
.icon-trash:before { content: "\f014"; }
|
||||
.icon-home:before { content: "\f015"; }
|
||||
.icon-file:before { content: "\f016"; }
|
||||
.icon-time:before { content: "\f017"; }
|
||||
.icon-road:before { content: "\f018"; }
|
||||
.icon-download-alt:before { content: "\f019"; }
|
||||
.icon-download:before { content: "\f01a"; }
|
||||
.icon-upload:before { content: "\f01b"; }
|
||||
.icon-inbox:before { content: "\f01c"; }
|
||||
.icon-play-circle:before { content: "\f01d"; }
|
||||
.icon-repeat:before { content: "\f01e"; }
|
||||
|
||||
/* \f020 doesn't work in Safari. all shifted one down */
|
||||
.icon-refresh:before { content: "\f021"; }
|
||||
.icon-list-alt:before { content: "\f022"; }
|
||||
.icon-lock:before { content: "\f023"; }
|
||||
.icon-flag:before { content: "\f024"; }
|
||||
.icon-headphones:before { content: "\f025"; }
|
||||
.icon-volume-off:before { content: "\f026"; }
|
||||
.icon-volume-down:before { content: "\f027"; }
|
||||
.icon-volume-up:before { content: "\f028"; }
|
||||
.icon-qrcode:before { content: "\f029"; }
|
||||
.icon-barcode:before { content: "\f02a"; }
|
||||
.icon-tag:before { content: "\f02b"; }
|
||||
.icon-tags:before { content: "\f02c"; }
|
||||
.icon-book:before { content: "\f02d"; }
|
||||
.icon-bookmark:before { content: "\f02e"; }
|
||||
.icon-print:before { content: "\f02f"; }
|
||||
|
||||
.icon-camera:before { content: "\f030"; }
|
||||
.icon-font:before { content: "\f031"; }
|
||||
.icon-bold:before { content: "\f032"; }
|
||||
.icon-italic:before { content: "\f033"; }
|
||||
.icon-text-height:before { content: "\f034"; }
|
||||
.icon-text-width:before { content: "\f035"; }
|
||||
.icon-align-left:before { content: "\f036"; }
|
||||
.icon-align-center:before { content: "\f037"; }
|
||||
.icon-align-right:before { content: "\f038"; }
|
||||
.icon-align-justify:before { content: "\f039"; }
|
||||
.icon-list:before { content: "\f03a"; }
|
||||
.icon-indent-left:before { content: "\f03b"; }
|
||||
.icon-indent-right:before { content: "\f03c"; }
|
||||
.icon-facetime-video:before { content: "\f03d"; }
|
||||
.icon-picture:before { content: "\f03e"; }
|
||||
|
||||
.icon-pencil:before { content: "\f040"; }
|
||||
.icon-map-marker:before { content: "\f041"; }
|
||||
.icon-adjust:before { content: "\f042"; }
|
||||
.icon-tint:before { content: "\f043"; }
|
||||
.icon-edit:before { content: "\f044"; }
|
||||
.icon-share:before { content: "\f045"; }
|
||||
.icon-check:before { content: "\f046"; }
|
||||
.icon-move:before { content: "\f047"; }
|
||||
.icon-step-backward:before { content: "\f048"; }
|
||||
.icon-fast-backward:before { content: "\f049"; }
|
||||
.icon-backward:before { content: "\f04a"; }
|
||||
.icon-play:before { content: "\f04b"; }
|
||||
.icon-pause:before { content: "\f04c"; }
|
||||
.icon-stop:before { content: "\f04d"; }
|
||||
.icon-forward:before { content: "\f04e"; }
|
||||
|
||||
.icon-fast-forward:before { content: "\f050"; }
|
||||
.icon-step-forward:before { content: "\f051"; }
|
||||
.icon-eject:before { content: "\f052"; }
|
||||
.icon-chevron-left:before { content: "\f053"; }
|
||||
.icon-chevron-right:before { content: "\f054"; }
|
||||
.icon-plus-sign:before { content: "\f055"; }
|
||||
.icon-minus-sign:before { content: "\f056"; }
|
||||
.icon-remove-sign:before { content: "\f057"; }
|
||||
.icon-ok-sign:before { content: "\f058"; }
|
||||
.icon-question-sign:before { content: "\f059"; }
|
||||
.icon-info-sign:before { content: "\f05a"; }
|
||||
.icon-screenshot:before { content: "\f05b"; }
|
||||
.icon-remove-circle:before { content: "\f05c"; }
|
||||
.icon-ok-circle:before { content: "\f05d"; }
|
||||
.icon-ban-circle:before { content: "\f05e"; }
|
||||
|
||||
.icon-arrow-left:before { content: "\f060"; }
|
||||
.icon-arrow-right:before { content: "\f061"; }
|
||||
.icon-arrow-up:before { content: "\f062"; }
|
||||
.icon-arrow-down:before { content: "\f063"; }
|
||||
.icon-share-alt:before { content: "\f064"; }
|
||||
.icon-resize-full:before { content: "\f065"; }
|
||||
.icon-resize-small:before { content: "\f066"; }
|
||||
.icon-plus:before { content: "\f067"; }
|
||||
.icon-minus:before { content: "\f068"; }
|
||||
.icon-asterisk:before { content: "\f069"; }
|
||||
.icon-exclamation-sign:before { content: "\f06a"; }
|
||||
.icon-gift:before { content: "\f06b"; }
|
||||
.icon-leaf:before { content: "\f06c"; }
|
||||
.icon-fire:before { content: "\f06d"; }
|
||||
.icon-eye-open:before { content: "\f06e"; }
|
||||
|
||||
.icon-eye-close:before { content: "\f070"; }
|
||||
.icon-warning-sign:before { content: "\f071"; }
|
||||
.icon-plane:before { content: "\f072"; }
|
||||
.icon-calendar:before { content: "\f073"; }
|
||||
.icon-random:before { content: "\f074"; }
|
||||
.icon-comment:before { content: "\f075"; }
|
||||
.icon-magnet:before { content: "\f076"; }
|
||||
.icon-chevron-up:before { content: "\f077"; }
|
||||
.icon-chevron-down:before { content: "\f078"; }
|
||||
.icon-retweet:before { content: "\f079"; }
|
||||
.icon-shopping-cart:before { content: "\f07a"; }
|
||||
.icon-folder-close:before { content: "\f07b"; }
|
||||
.icon-folder-open:before { content: "\f07c"; }
|
||||
.icon-resize-vertical:before { content: "\f07d"; }
|
||||
.icon-resize-horizontal:before { content: "\f07e"; }
|
||||
|
||||
.icon-bar-chart:before { content: "\f080"; }
|
||||
.icon-twitter-sign:before { content: "\f081"; }
|
||||
.icon-facebook-sign:before { content: "\f082"; }
|
||||
.icon-camera-retro:before { content: "\f083"; }
|
||||
.icon-key:before { content: "\f084"; }
|
||||
.icon-cogs:before { content: "\f085"; }
|
||||
.icon-comments:before { content: "\f086"; }
|
||||
.icon-thumbs-up:before { content: "\f087"; }
|
||||
.icon-thumbs-down:before { content: "\f088"; }
|
||||
.icon-star-half:before { content: "\f089"; }
|
||||
.icon-heart-empty:before { content: "\f08a"; }
|
||||
.icon-signout:before { content: "\f08b"; }
|
||||
.icon-linkedin-sign:before { content: "\f08c"; }
|
||||
.icon-pushpin:before { content: "\f08d"; }
|
||||
.icon-external-link:before { content: "\f08e"; }
|
||||
|
||||
.icon-signin:before { content: "\f090"; }
|
||||
.icon-trophy:before { content: "\f091"; }
|
||||
.icon-github-sign:before { content: "\f092"; }
|
||||
.icon-upload-alt:before { content: "\f093"; }
|
||||
.icon-lemon:before { content: "\f094"; }
|
||||
.icon-phone:before { content: "\f095"; }
|
||||
.icon-check-empty:before { content: "\f096"; }
|
||||
.icon-bookmark-empty:before { content: "\f097"; }
|
||||
.icon-phone-sign:before { content: "\f098"; }
|
||||
.icon-twitter:before { content: "\f099"; }
|
||||
.icon-facebook:before { content: "\f09a"; }
|
||||
.icon-github:before { content: "\f09b"; }
|
||||
.icon-unlock:before { content: "\f09c"; }
|
||||
.icon-credit-card:before { content: "\f09d"; }
|
||||
.icon-rss:before { content: "\f09e"; }
|
||||
|
||||
.icon-hdd:before { content: "\f0a0"; }
|
||||
.icon-bullhorn:before { content: "\f0a1"; }
|
||||
.icon-bell:before { content: "\f0a2"; }
|
||||
.icon-certificate:before { content: "\f0a3"; }
|
||||
.icon-hand-right:before { content: "\f0a4"; }
|
||||
.icon-hand-left:before { content: "\f0a5"; }
|
||||
.icon-hand-up:before { content: "\f0a6"; }
|
||||
.icon-hand-down:before { content: "\f0a7"; }
|
||||
.icon-circle-arrow-left:before { content: "\f0a8"; }
|
||||
.icon-circle-arrow-right:before { content: "\f0a9"; }
|
||||
.icon-circle-arrow-up:before { content: "\f0aa"; }
|
||||
.icon-circle-arrow-down:before { content: "\f0ab"; }
|
||||
.icon-globe:before { content: "\f0ac"; }
|
||||
.icon-wrench:before { content: "\f0ad"; }
|
||||
.icon-tasks:before { content: "\f0ae"; }
|
||||
|
||||
.icon-filter:before { content: "\f0b0"; }
|
||||
.icon-briefcase:before { content: "\f0b1"; }
|
||||
.icon-fullscreen:before { content: "\f0b2"; }
|
||||
|
||||
.icon-group:before { content: "\f0c0"; }
|
||||
.icon-link:before { content: "\f0c1"; }
|
||||
.icon-cloud:before { content: "\f0c2"; }
|
||||
.icon-beaker:before { content: "\f0c3"; }
|
||||
.icon-cut:before { content: "\f0c4"; }
|
||||
.icon-copy:before { content: "\f0c5"; }
|
||||
.icon-paper-clip:before { content: "\f0c6"; }
|
||||
.icon-save:before { content: "\f0c7"; }
|
||||
.icon-sign-blank:before { content: "\f0c8"; }
|
||||
.icon-reorder:before { content: "\f0c9"; }
|
||||
.icon-list-ul:before { content: "\f0ca"; }
|
||||
.icon-list-ol:before { content: "\f0cb"; }
|
||||
.icon-strikethrough:before { content: "\f0cc"; }
|
||||
.icon-underline:before { content: "\f0cd"; }
|
||||
.icon-table:before { content: "\f0ce"; }
|
||||
|
||||
.icon-magic:before { content: "\f0d0"; }
|
||||
.icon-truck:before { content: "\f0d1"; }
|
||||
.icon-pinterest:before { content: "\f0d2"; }
|
||||
.icon-pinterest-sign:before { content: "\f0d3"; }
|
||||
.icon-google-plus-sign:before { content: "\f0d4"; }
|
||||
.icon-google-plus:before { content: "\f0d5"; }
|
||||
.icon-money:before { content: "\f0d6"; }
|
||||
.icon-caret-down:before { content: "\f0d7"; }
|
||||
.icon-caret-up:before { content: "\f0d8"; }
|
||||
.icon-caret-left:before { content: "\f0d9"; }
|
||||
.icon-caret-right:before { content: "\f0da"; }
|
||||
.icon-columns:before { content: "\f0db"; }
|
||||
.icon-sort:before { content: "\f0dc"; }
|
||||
.icon-sort-down:before { content: "\f0dd"; }
|
||||
.icon-sort-up:before { content: "\f0de"; }
|
||||
|
||||
.icon-envelope-alt:before { content: "\f0e0"; }
|
||||
.icon-linkedin:before { content: "\f0e1"; }
|
||||
.icon-undo:before { content: "\f0e2"; }
|
||||
.icon-legal:before { content: "\f0e3"; }
|
||||
.icon-dashboard:before { content: "\f0e4"; }
|
||||
.icon-comment-alt:before { content: "\f0e5"; }
|
||||
.icon-comments-alt:before { content: "\f0e6"; }
|
||||
.icon-bolt:before { content: "\f0e7"; }
|
||||
.icon-sitemap:before { content: "\f0e8"; }
|
||||
.icon-umbrella:before { content: "\f0e9"; }
|
||||
.icon-paste:before { content: "\f0ea"; }
|
||||
|
||||
.icon-user-md:before { content: "\f200"; }
|
||||
/* Font Awesome
|
||||
the iconic font designed for use with Twitter Bootstrap
|
||||
-------------------------------------------------------
|
||||
The full suite of pictographic icons, examples, and documentation
|
||||
can be found at: http://fortawesome.github.com/Font-Awesome/
|
||||
|
||||
License
|
||||
-------------------------------------------------------
|
||||
The Font Awesome webfont, CSS, and LESS files are licensed under CC BY 3.0:
|
||||
http://creativecommons.org/licenses/by/3.0/ A mention of
|
||||
'Font Awesome - http://fortawesome.github.com/Font-Awesome' in human-readable
|
||||
source code is considered acceptable attribution (most common on the web).
|
||||
If human readable source code is not available to the end user, a mention in
|
||||
an 'About' or 'Credits' screen is considered acceptable (most common in desktop
|
||||
or mobile software).
|
||||
|
||||
Contact
|
||||
-------------------------------------------------------
|
||||
Email: dave@davegandy.com
|
||||
Twitter: http://twitter.com/fortaweso_me
|
||||
Work: http://lemonwi.se co-founder
|
||||
|
||||
*/
|
||||
@font-face {
|
||||
font-family: "FontAwesome";
|
||||
src: url('/assets/fontawesome-webfont.eot');
|
||||
src: url('/assets/fontawesome-webfont.eot?#iefix') format('eot'), url('/assets/fontawesome-webfont.woff') format('woff'), url('/assets/fontawesome-webfont.ttf') format('truetype'), url('/assets/fontawesome-webfont.svg#FontAwesome') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
/* Font Awesome styles
|
||||
------------------------------------------------------- */
|
||||
[class^="icon-"]:before, [class*=" icon-"]:before {
|
||||
font-family: FontAwesome;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
display: inline-block;
|
||||
text-decoration: inherit;
|
||||
}
|
||||
a [class^="icon-"], a [class*=" icon-"] {
|
||||
display: inline-block;
|
||||
text-decoration: inherit;
|
||||
}
|
||||
/* makes the font 33% larger relative to the icon container */
|
||||
.icon-large:before {
|
||||
vertical-align: top;
|
||||
font-size: 1.3333333333333333em;
|
||||
}
|
||||
.btn [class^="icon-"], .btn [class*=" icon-"] {
|
||||
/* keeps button heights with and without icons the same */
|
||||
|
||||
line-height: .9em;
|
||||
}
|
||||
li [class^="icon-"], li [class*=" icon-"] {
|
||||
display: inline-block;
|
||||
width: 1.25em;
|
||||
text-align: center;
|
||||
}
|
||||
li .icon-large[class^="icon-"], li .icon-large[class*=" icon-"] {
|
||||
/* 1.5 increased font size for icon-large * 1.25 width */
|
||||
|
||||
width: 1.875em;
|
||||
}
|
||||
li[class^="icon-"], li[class*=" icon-"] {
|
||||
margin-left: 0;
|
||||
list-style-type: none;
|
||||
}
|
||||
li[class^="icon-"]:before, li[class*=" icon-"]:before {
|
||||
text-indent: -2em;
|
||||
text-align: center;
|
||||
}
|
||||
li[class^="icon-"].icon-large:before, li[class*=" icon-"].icon-large:before {
|
||||
text-indent: -1.3333333333333333em;
|
||||
}
|
||||
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
|
||||
readers do not read off random characters that represent icons */
|
||||
.icon-glass:before { content: "\f000"; }
|
||||
.icon-music:before { content: "\f001"; }
|
||||
.icon-search:before { content: "\f002"; }
|
||||
.icon-envelope:before { content: "\f003"; }
|
||||
.icon-heart:before { content: "\f004"; }
|
||||
.icon-star:before { content: "\f005"; }
|
||||
.icon-star-empty:before { content: "\f006"; }
|
||||
.icon-user:before { content: "\f007"; }
|
||||
.icon-film:before { content: "\f008"; }
|
||||
.icon-th-large:before { content: "\f009"; }
|
||||
.icon-th:before { content: "\f00a"; }
|
||||
.icon-th-list:before { content: "\f00b"; }
|
||||
.icon-ok:before { content: "\f00c"; }
|
||||
.icon-remove:before { content: "\f00d"; }
|
||||
.icon-zoom-in:before { content: "\f00e"; }
|
||||
|
||||
.icon-zoom-out:before { content: "\f010"; }
|
||||
.icon-off:before { content: "\f011"; }
|
||||
.icon-signal:before { content: "\f012"; }
|
||||
.icon-cog:before { content: "\f013"; }
|
||||
.icon-trash:before { content: "\f014"; }
|
||||
.icon-home:before { content: "\f015"; }
|
||||
.icon-file:before { content: "\f016"; }
|
||||
.icon-time:before { content: "\f017"; }
|
||||
.icon-road:before { content: "\f018"; }
|
||||
.icon-download-alt:before { content: "\f019"; }
|
||||
.icon-download:before { content: "\f01a"; }
|
||||
.icon-upload:before { content: "\f01b"; }
|
||||
.icon-inbox:before { content: "\f01c"; }
|
||||
.icon-play-circle:before { content: "\f01d"; }
|
||||
.icon-repeat:before { content: "\f01e"; }
|
||||
|
||||
/* \f020 doesn't work in Safari. all shifted one down */
|
||||
.icon-refresh:before { content: "\f021"; }
|
||||
.icon-list-alt:before { content: "\f022"; }
|
||||
.icon-lock:before { content: "\f023"; }
|
||||
.icon-flag:before { content: "\f024"; }
|
||||
.icon-headphones:before { content: "\f025"; }
|
||||
.icon-volume-off:before { content: "\f026"; }
|
||||
.icon-volume-down:before { content: "\f027"; }
|
||||
.icon-volume-up:before { content: "\f028"; }
|
||||
.icon-qrcode:before { content: "\f029"; }
|
||||
.icon-barcode:before { content: "\f02a"; }
|
||||
.icon-tag:before { content: "\f02b"; }
|
||||
.icon-tags:before { content: "\f02c"; }
|
||||
.icon-book:before { content: "\f02d"; }
|
||||
.icon-bookmark:before { content: "\f02e"; }
|
||||
.icon-print:before { content: "\f02f"; }
|
||||
|
||||
.icon-camera:before { content: "\f030"; }
|
||||
.icon-font:before { content: "\f031"; }
|
||||
.icon-bold:before { content: "\f032"; }
|
||||
.icon-italic:before { content: "\f033"; }
|
||||
.icon-text-height:before { content: "\f034"; }
|
||||
.icon-text-width:before { content: "\f035"; }
|
||||
.icon-align-left:before { content: "\f036"; }
|
||||
.icon-align-center:before { content: "\f037"; }
|
||||
.icon-align-right:before { content: "\f038"; }
|
||||
.icon-align-justify:before { content: "\f039"; }
|
||||
.icon-list:before { content: "\f03a"; }
|
||||
.icon-indent-left:before { content: "\f03b"; }
|
||||
.icon-indent-right:before { content: "\f03c"; }
|
||||
.icon-facetime-video:before { content: "\f03d"; }
|
||||
.icon-picture:before { content: "\f03e"; }
|
||||
|
||||
.icon-pencil:before { content: "\f040"; }
|
||||
.icon-map-marker:before { content: "\f041"; }
|
||||
.icon-adjust:before { content: "\f042"; }
|
||||
.icon-tint:before { content: "\f043"; }
|
||||
.icon-edit:before { content: "\f044"; }
|
||||
.icon-share:before { content: "\f045"; }
|
||||
.icon-check:before { content: "\f046"; }
|
||||
.icon-move:before { content: "\f047"; }
|
||||
.icon-step-backward:before { content: "\f048"; }
|
||||
.icon-fast-backward:before { content: "\f049"; }
|
||||
.icon-backward:before { content: "\f04a"; }
|
||||
.icon-play:before { content: "\f04b"; }
|
||||
.icon-pause:before { content: "\f04c"; }
|
||||
.icon-stop:before { content: "\f04d"; }
|
||||
.icon-forward:before { content: "\f04e"; }
|
||||
|
||||
.icon-fast-forward:before { content: "\f050"; }
|
||||
.icon-step-forward:before { content: "\f051"; }
|
||||
.icon-eject:before { content: "\f052"; }
|
||||
.icon-chevron-left:before { content: "\f053"; }
|
||||
.icon-chevron-right:before { content: "\f054"; }
|
||||
.icon-plus-sign:before { content: "\f055"; }
|
||||
.icon-minus-sign:before { content: "\f056"; }
|
||||
.icon-remove-sign:before { content: "\f057"; }
|
||||
.icon-ok-sign:before { content: "\f058"; }
|
||||
.icon-question-sign:before { content: "\f059"; }
|
||||
.icon-info-sign:before { content: "\f05a"; }
|
||||
.icon-screenshot:before { content: "\f05b"; }
|
||||
.icon-remove-circle:before { content: "\f05c"; }
|
||||
.icon-ok-circle:before { content: "\f05d"; }
|
||||
.icon-ban-circle:before { content: "\f05e"; }
|
||||
|
||||
.icon-arrow-left:before { content: "\f060"; }
|
||||
.icon-arrow-right:before { content: "\f061"; }
|
||||
.icon-arrow-up:before { content: "\f062"; }
|
||||
.icon-arrow-down:before { content: "\f063"; }
|
||||
.icon-share-alt:before { content: "\f064"; }
|
||||
.icon-resize-full:before { content: "\f065"; }
|
||||
.icon-resize-small:before { content: "\f066"; }
|
||||
.icon-plus:before { content: "\f067"; }
|
||||
.icon-minus:before { content: "\f068"; }
|
||||
.icon-asterisk:before { content: "\f069"; }
|
||||
.icon-exclamation-sign:before { content: "\f06a"; }
|
||||
.icon-gift:before { content: "\f06b"; }
|
||||
.icon-leaf:before { content: "\f06c"; }
|
||||
.icon-fire:before { content: "\f06d"; }
|
||||
.icon-eye-open:before { content: "\f06e"; }
|
||||
|
||||
.icon-eye-close:before { content: "\f070"; }
|
||||
.icon-warning-sign:before { content: "\f071"; }
|
||||
.icon-plane:before { content: "\f072"; }
|
||||
.icon-calendar:before { content: "\f073"; }
|
||||
.icon-random:before { content: "\f074"; }
|
||||
.icon-comment:before { content: "\f075"; }
|
||||
.icon-magnet:before { content: "\f076"; }
|
||||
.icon-chevron-up:before { content: "\f077"; }
|
||||
.icon-chevron-down:before { content: "\f078"; }
|
||||
.icon-retweet:before { content: "\f079"; }
|
||||
.icon-shopping-cart:before { content: "\f07a"; }
|
||||
.icon-folder-close:before { content: "\f07b"; }
|
||||
.icon-folder-open:before { content: "\f07c"; }
|
||||
.icon-resize-vertical:before { content: "\f07d"; }
|
||||
.icon-resize-horizontal:before { content: "\f07e"; }
|
||||
|
||||
.icon-bar-chart:before { content: "\f080"; }
|
||||
.icon-twitter-sign:before { content: "\f081"; }
|
||||
.icon-facebook-sign:before { content: "\f082"; }
|
||||
.icon-camera-retro:before { content: "\f083"; }
|
||||
.icon-key:before { content: "\f084"; }
|
||||
.icon-cogs:before { content: "\f085"; }
|
||||
.icon-comments:before { content: "\f086"; }
|
||||
.icon-thumbs-up:before { content: "\f087"; }
|
||||
.icon-thumbs-down:before { content: "\f088"; }
|
||||
.icon-star-half:before { content: "\f089"; }
|
||||
.icon-heart-empty:before { content: "\f08a"; }
|
||||
.icon-signout:before { content: "\f08b"; }
|
||||
.icon-linkedin-sign:before { content: "\f08c"; }
|
||||
.icon-pushpin:before { content: "\f08d"; }
|
||||
.icon-external-link:before { content: "\f08e"; }
|
||||
|
||||
.icon-signin:before { content: "\f090"; }
|
||||
.icon-trophy:before { content: "\f091"; }
|
||||
.icon-github-sign:before { content: "\f092"; }
|
||||
.icon-upload-alt:before { content: "\f093"; }
|
||||
.icon-lemon:before { content: "\f094"; }
|
||||
.icon-phone:before { content: "\f095"; }
|
||||
.icon-check-empty:before { content: "\f096"; }
|
||||
.icon-bookmark-empty:before { content: "\f097"; }
|
||||
.icon-phone-sign:before { content: "\f098"; }
|
||||
.icon-twitter:before { content: "\f099"; }
|
||||
.icon-facebook:before { content: "\f09a"; }
|
||||
.icon-github:before { content: "\f09b"; }
|
||||
.icon-unlock:before { content: "\f09c"; }
|
||||
.icon-credit-card:before { content: "\f09d"; }
|
||||
.icon-rss:before { content: "\f09e"; }
|
||||
|
||||
.icon-hdd:before { content: "\f0a0"; }
|
||||
.icon-bullhorn:before { content: "\f0a1"; }
|
||||
.icon-bell:before { content: "\f0a2"; }
|
||||
.icon-certificate:before { content: "\f0a3"; }
|
||||
.icon-hand-right:before { content: "\f0a4"; }
|
||||
.icon-hand-left:before { content: "\f0a5"; }
|
||||
.icon-hand-up:before { content: "\f0a6"; }
|
||||
.icon-hand-down:before { content: "\f0a7"; }
|
||||
.icon-circle-arrow-left:before { content: "\f0a8"; }
|
||||
.icon-circle-arrow-right:before { content: "\f0a9"; }
|
||||
.icon-circle-arrow-up:before { content: "\f0aa"; }
|
||||
.icon-circle-arrow-down:before { content: "\f0ab"; }
|
||||
.icon-globe:before { content: "\f0ac"; }
|
||||
.icon-wrench:before { content: "\f0ad"; }
|
||||
.icon-tasks:before { content: "\f0ae"; }
|
||||
|
||||
.icon-filter:before { content: "\f0b0"; }
|
||||
.icon-briefcase:before { content: "\f0b1"; }
|
||||
.icon-fullscreen:before { content: "\f0b2"; }
|
||||
|
||||
.icon-group:before { content: "\f0c0"; }
|
||||
.icon-link:before { content: "\f0c1"; }
|
||||
.icon-cloud:before { content: "\f0c2"; }
|
||||
.icon-beaker:before { content: "\f0c3"; }
|
||||
.icon-cut:before { content: "\f0c4"; }
|
||||
.icon-copy:before { content: "\f0c5"; }
|
||||
.icon-paper-clip:before { content: "\f0c6"; }
|
||||
.icon-save:before { content: "\f0c7"; }
|
||||
.icon-sign-blank:before { content: "\f0c8"; }
|
||||
.icon-reorder:before { content: "\f0c9"; }
|
||||
.icon-list-ul:before { content: "\f0ca"; }
|
||||
.icon-list-ol:before { content: "\f0cb"; }
|
||||
.icon-strikethrough:before { content: "\f0cc"; }
|
||||
.icon-underline:before { content: "\f0cd"; }
|
||||
.icon-table:before { content: "\f0ce"; }
|
||||
|
||||
.icon-magic:before { content: "\f0d0"; }
|
||||
.icon-truck:before { content: "\f0d1"; }
|
||||
.icon-pinterest:before { content: "\f0d2"; }
|
||||
.icon-pinterest-sign:before { content: "\f0d3"; }
|
||||
.icon-google-plus-sign:before { content: "\f0d4"; }
|
||||
.icon-google-plus:before { content: "\f0d5"; }
|
||||
.icon-money:before { content: "\f0d6"; }
|
||||
.icon-caret-down:before { content: "\f0d7"; }
|
||||
.icon-caret-up:before { content: "\f0d8"; }
|
||||
.icon-caret-left:before { content: "\f0d9"; }
|
||||
.icon-caret-right:before { content: "\f0da"; }
|
||||
.icon-columns:before { content: "\f0db"; }
|
||||
.icon-sort:before { content: "\f0dc"; }
|
||||
.icon-sort-down:before { content: "\f0dd"; }
|
||||
.icon-sort-up:before { content: "\f0de"; }
|
||||
|
||||
.icon-envelope-alt:before { content: "\f0e0"; }
|
||||
.icon-linkedin:before { content: "\f0e1"; }
|
||||
.icon-undo:before { content: "\f0e2"; }
|
||||
.icon-legal:before { content: "\f0e3"; }
|
||||
.icon-dashboard:before { content: "\f0e4"; }
|
||||
.icon-comment-alt:before { content: "\f0e5"; }
|
||||
.icon-comments-alt:before { content: "\f0e6"; }
|
||||
.icon-bolt:before { content: "\f0e7"; }
|
||||
.icon-sitemap:before { content: "\f0e8"; }
|
||||
.icon-umbrella:before { content: "\f0e9"; }
|
||||
.icon-paste:before { content: "\f0ea"; }
|
||||
|
||||
.icon-user-md:before { content: "\f200"; }
|
||||
|
@ -1,57 +1,57 @@
|
||||
/*! gridster.js - v0.1.0 - 2012-08-14
|
||||
* http://gridster.net/
|
||||
* Copyright (c) 2012 ducksboard; Licensed MIT */
|
||||
|
||||
.gridster {
|
||||
position:relative;
|
||||
}
|
||||
|
||||
.gridster > * {
|
||||
margin: 0 auto;
|
||||
-webkit-transition: height .4s;
|
||||
-moz-transition: height .4s;
|
||||
-o-transition: height .4s;
|
||||
-ms-transition: height .4s;
|
||||
transition: height .4s;
|
||||
}
|
||||
|
||||
.gridster .gs_w{
|
||||
z-index: 2;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.ready .gs_w:not(.preview-holder) {
|
||||
-webkit-transition: opacity .3s, left .3s, top .3s;
|
||||
-moz-transition: opacity .3s, left .3s, top .3s;
|
||||
-o-transition: opacity .3s, left .3s, top .3s;
|
||||
transition: opacity .3s, left .3s, top .3s;
|
||||
}
|
||||
|
||||
.gridster .preview-holder {
|
||||
z-index: 1;
|
||||
position: absolute;
|
||||
background-color: #fff;
|
||||
border-color: #fff;
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
.gridster .player-revert {
|
||||
z-index: 10!important;
|
||||
-webkit-transition: left .3s, top .3s!important;
|
||||
-moz-transition: left .3s, top .3s!important;
|
||||
-o-transition: left .3s, top .3s!important;
|
||||
transition: left .3s, top .3s!important;
|
||||
}
|
||||
|
||||
.gridster .dragging {
|
||||
z-index: 10!important;
|
||||
-webkit-transition: all 0s !important;
|
||||
-moz-transition: all 0s !important;
|
||||
-o-transition: all 0s !important;
|
||||
transition: all 0s !important;
|
||||
}
|
||||
|
||||
/* Uncomment this if you set helper : "clone" in draggable options */
|
||||
/*.gridster .player {
|
||||
opacity:0;
|
||||
/*! gridster.js - v0.1.0 - 2012-08-14
|
||||
* http://gridster.net/
|
||||
* Copyright (c) 2012 ducksboard; Licensed MIT */
|
||||
|
||||
.gridster {
|
||||
position:relative;
|
||||
}
|
||||
|
||||
.gridster > * {
|
||||
margin: 0 auto;
|
||||
-webkit-transition: height .4s;
|
||||
-moz-transition: height .4s;
|
||||
-o-transition: height .4s;
|
||||
-ms-transition: height .4s;
|
||||
transition: height .4s;
|
||||
}
|
||||
|
||||
.gridster .gs_w{
|
||||
z-index: 2;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.ready .gs_w:not(.preview-holder) {
|
||||
-webkit-transition: opacity .3s, left .3s, top .3s;
|
||||
-moz-transition: opacity .3s, left .3s, top .3s;
|
||||
-o-transition: opacity .3s, left .3s, top .3s;
|
||||
transition: opacity .3s, left .3s, top .3s;
|
||||
}
|
||||
|
||||
.gridster .preview-holder {
|
||||
z-index: 1;
|
||||
position: absolute;
|
||||
background-color: #fff;
|
||||
border-color: #fff;
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
.gridster .player-revert {
|
||||
z-index: 10!important;
|
||||
-webkit-transition: left .3s, top .3s!important;
|
||||
-moz-transition: left .3s, top .3s!important;
|
||||
-o-transition: left .3s, top .3s!important;
|
||||
transition: left .3s, top .3s!important;
|
||||
}
|
||||
|
||||
.gridster .dragging {
|
||||
z-index: 10!important;
|
||||
-webkit-transition: all 0s !important;
|
||||
-moz-transition: all 0s !important;
|
||||
-o-transition: all 0s !important;
|
||||
transition: all 0s !important;
|
||||
}
|
||||
|
||||
/* Uncomment this if you set helper : "clone" in draggable options */
|
||||
/*.gridster .player {
|
||||
opacity:0;
|
||||
}*/
|
270
pydashie/main.py
270
pydashie/main.py
@ -1,136 +1,136 @@
|
||||
import os
|
||||
import json
|
||||
import time
|
||||
import random
|
||||
import Queue
|
||||
import datetime
|
||||
import collections
|
||||
import coffeescript
|
||||
import SocketServer
|
||||
from repeated_timer import RepeatedTimer
|
||||
from flask import Flask, render_template, Response, send_from_directory, g, request
|
||||
app = Flask(__name__)
|
||||
|
||||
events_queue = {}
|
||||
items = collections.deque()
|
||||
seedX = 0
|
||||
|
||||
@app.route("/")
|
||||
def hello():
|
||||
return render_template('main.html', title='pyDashie')
|
||||
|
||||
@app.route("/assets/application.js")
|
||||
def javascripts():
|
||||
# scripts = [
|
||||
# 'assets/javascripts/jquery.js',
|
||||
# 'assets/javascripts/es5-shim.js',
|
||||
# 'assets/javascripts/d3.v2.min.js',
|
||||
# 'assets/javascripts/batman.js',
|
||||
# 'assets/javascripts/batman.jquery.js',
|
||||
# 'assets/javascripts/jquery.gridster.js',
|
||||
# 'assets/javascripts/jquery.leanModal.min.js',
|
||||
# 'assets/javascripts/dashing.coffee',
|
||||
# 'assets/javascripts/jquery.knob.js',
|
||||
# 'assets/javascripts/rickshaw.min.js',
|
||||
# 'assets/javascripts/application.coffee',
|
||||
# 'assets/javascripts/dashing.gridster.coffee'
|
||||
# ]
|
||||
scripts = ['assets/javascripts/application.js']
|
||||
|
||||
base_directory = os.getcwd()
|
||||
full_paths = [os.path.join(base_directory, script_name) for script_name in scripts]
|
||||
output = ''
|
||||
for path in full_paths:
|
||||
if '.coffee' in path:
|
||||
print('Compiling Coffee on %s ' % path)
|
||||
output = output + coffeescript.compile(open(path).read())
|
||||
else:
|
||||
output = output + open(path).read()
|
||||
return Response(output, mimetype='application/javascript')
|
||||
|
||||
@app.route('/assets/application.css')
|
||||
def application_css():
|
||||
scripts = [
|
||||
'assets/stylesheets/application.css',
|
||||
]
|
||||
base_directory = os.getcwd()
|
||||
full_paths = [os.path.join(base_directory, script_name) for script_name in scripts]
|
||||
output = ''
|
||||
for path in full_paths:
|
||||
output = output + open(path).read()
|
||||
return Response(output, mimetype='text/css')
|
||||
|
||||
@app.route('/assets/images/<path:filename>')
|
||||
def send_static_img(filename):
|
||||
directory = os.path.join(os.getcwd(), 'assets', 'images')
|
||||
return send_from_directory(directory, filename)
|
||||
|
||||
@app.route('/views/<widget_name>.html')
|
||||
def widget_html(widget_name):
|
||||
base_directory = os.getcwd()
|
||||
path = os.path.join(base_directory, 'widgets', widget_name, '%s.html' % widget_name)
|
||||
return open(path).read()
|
||||
|
||||
@app.route('/events')
|
||||
def events():
|
||||
event_stream_port = request.environ['REMOTE_PORT']
|
||||
current_event_queue = Queue.Queue()
|
||||
events_queue[event_stream_port] = current_event_queue
|
||||
return Response(pop_queue(current_event_queue), mimetype='text/event-stream')
|
||||
|
||||
def pop_queue(current_event_queue):
|
||||
while True:
|
||||
yield current_event_queue.get()
|
||||
|
||||
def send_event(widget_id, body):
|
||||
body['id'] = widget_id
|
||||
body['updateAt'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S +0000')
|
||||
formatted_json = 'data: %s\n\n' % (json.dumps(body))
|
||||
print 'Current Connection Feed Pool: %s' % len(events_queue)
|
||||
for event_queue in events_queue.values():
|
||||
event_queue.put(formatted_json)
|
||||
|
||||
def sample_synergy():
|
||||
synergy_data = {'value': random.randint(0, 100)}
|
||||
send_event('synergy', synergy_data)
|
||||
|
||||
def sample_buzzwords():
|
||||
my_little_pony_names = ['Rainbow Dash',
|
||||
'Blossomforth',
|
||||
'Derpy',
|
||||
'Fluttershy',
|
||||
'Lofty',
|
||||
'Scootaloo',
|
||||
'Skydancer']
|
||||
items = [{'label': pony_name, 'value': random.randint(0, 20)} for pony_name in my_little_pony_names]
|
||||
buzzwords_data = {'items':items}
|
||||
send_event('buzzwords', buzzwords_data)
|
||||
|
||||
def sample_convergence():
|
||||
global seedX
|
||||
if not seedX:
|
||||
seedX = 0
|
||||
items.append({'x':seedX,
|
||||
'y':random.randint(0,20)})
|
||||
seedX += 1
|
||||
if len(items) > 10:
|
||||
items.popleft()
|
||||
item_data = {'points': list(items)}
|
||||
send_event('convergence', item_data)
|
||||
|
||||
def close_stream(*args, **kwargs):
|
||||
remote_port = args[2][1]
|
||||
del events_queue[remote_port]
|
||||
|
||||
if __name__ == "__main__":
|
||||
SocketServer.BaseServer.handle_error = close_stream
|
||||
rt = RepeatedTimer(1, sample_synergy)
|
||||
rt2 = RepeatedTimer(5, sample_buzzwords)
|
||||
rt3 = RepeatedTimer(1, sample_convergence)
|
||||
try:
|
||||
print 'Before app run'
|
||||
app.run(debug=True, port=5000, threaded=True, use_reloader=False, use_debugger=True)
|
||||
finally:
|
||||
rt.stop()
|
||||
rt2.stop()
|
||||
import os
|
||||
import json
|
||||
import time
|
||||
import random
|
||||
import Queue
|
||||
import datetime
|
||||
import collections
|
||||
import coffeescript
|
||||
import SocketServer
|
||||
from repeated_timer import RepeatedTimer
|
||||
from flask import Flask, render_template, Response, send_from_directory, g, request
|
||||
app = Flask(__name__)
|
||||
|
||||
events_queue = {}
|
||||
items = collections.deque()
|
||||
seedX = 0
|
||||
|
||||
@app.route("/")
|
||||
def hello():
|
||||
return render_template('main.html', title='pyDashie')
|
||||
|
||||
@app.route("/assets/application.js")
|
||||
def javascripts():
|
||||
# scripts = [
|
||||
# 'assets/javascripts/jquery.js',
|
||||
# 'assets/javascripts/es5-shim.js',
|
||||
# 'assets/javascripts/d3.v2.min.js',
|
||||
# 'assets/javascripts/batman.js',
|
||||
# 'assets/javascripts/batman.jquery.js',
|
||||
# 'assets/javascripts/jquery.gridster.js',
|
||||
# 'assets/javascripts/jquery.leanModal.min.js',
|
||||
# 'assets/javascripts/dashing.coffee',
|
||||
# 'assets/javascripts/jquery.knob.js',
|
||||
# 'assets/javascripts/rickshaw.min.js',
|
||||
# 'assets/javascripts/application.coffee',
|
||||
# 'assets/javascripts/dashing.gridster.coffee'
|
||||
# ]
|
||||
scripts = ['assets/javascripts/application.js']
|
||||
|
||||
base_directory = os.getcwd()
|
||||
full_paths = [os.path.join(base_directory, script_name) for script_name in scripts]
|
||||
output = ''
|
||||
for path in full_paths:
|
||||
if '.coffee' in path:
|
||||
print('Compiling Coffee on %s ' % path)
|
||||
output = output + coffeescript.compile(open(path).read())
|
||||
else:
|
||||
output = output + open(path).read()
|
||||
return Response(output, mimetype='application/javascript')
|
||||
|
||||
@app.route('/assets/application.css')
|
||||
def application_css():
|
||||
scripts = [
|
||||
'assets/stylesheets/application.css',
|
||||
]
|
||||
base_directory = os.getcwd()
|
||||
full_paths = [os.path.join(base_directory, script_name) for script_name in scripts]
|
||||
output = ''
|
||||
for path in full_paths:
|
||||
output = output + open(path).read()
|
||||
return Response(output, mimetype='text/css')
|
||||
|
||||
@app.route('/assets/images/<path:filename>')
|
||||
def send_static_img(filename):
|
||||
directory = os.path.join(os.getcwd(), 'assets', 'images')
|
||||
return send_from_directory(directory, filename)
|
||||
|
||||
@app.route('/views/<widget_name>.html')
|
||||
def widget_html(widget_name):
|
||||
base_directory = os.getcwd()
|
||||
path = os.path.join(base_directory, 'widgets', widget_name, '%s.html' % widget_name)
|
||||
return open(path).read()
|
||||
|
||||
@app.route('/events')
|
||||
def events():
|
||||
event_stream_port = request.environ['REMOTE_PORT']
|
||||
current_event_queue = Queue.Queue()
|
||||
events_queue[event_stream_port] = current_event_queue
|
||||
return Response(pop_queue(current_event_queue), mimetype='text/event-stream')
|
||||
|
||||
def pop_queue(current_event_queue):
|
||||
while True:
|
||||
yield current_event_queue.get()
|
||||
|
||||
def send_event(widget_id, body):
|
||||
body['id'] = widget_id
|
||||
body['updateAt'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S +0000')
|
||||
formatted_json = 'data: %s\n\n' % (json.dumps(body))
|
||||
print 'Current Connection Feed Pool: %s' % len(events_queue)
|
||||
for event_queue in events_queue.values():
|
||||
event_queue.put(formatted_json)
|
||||
|
||||
def sample_synergy():
|
||||
synergy_data = {'value': random.randint(0, 100)}
|
||||
send_event('synergy', synergy_data)
|
||||
|
||||
def sample_buzzwords():
|
||||
my_little_pony_names = ['Rainbow Dash',
|
||||
'Blossomforth',
|
||||
'Derpy',
|
||||
'Fluttershy',
|
||||
'Lofty',
|
||||
'Scootaloo',
|
||||
'Skydancer']
|
||||
items = [{'label': pony_name, 'value': random.randint(0, 20)} for pony_name in my_little_pony_names]
|
||||
buzzwords_data = {'items':items}
|
||||
send_event('buzzwords', buzzwords_data)
|
||||
|
||||
def sample_convergence():
|
||||
global seedX
|
||||
if not seedX:
|
||||
seedX = 0
|
||||
items.append({'x':seedX,
|
||||
'y':random.randint(0,20)})
|
||||
seedX += 1
|
||||
if len(items) > 10:
|
||||
items.popleft()
|
||||
item_data = {'points': list(items)}
|
||||
send_event('convergence', item_data)
|
||||
|
||||
def close_stream(*args, **kwargs):
|
||||
remote_port = args[2][1]
|
||||
del events_queue[remote_port]
|
||||
|
||||
if __name__ == "__main__":
|
||||
SocketServer.BaseServer.handle_error = close_stream
|
||||
rt = RepeatedTimer(1, sample_synergy)
|
||||
rt2 = RepeatedTimer(5, sample_buzzwords)
|
||||
rt3 = RepeatedTimer(1, sample_convergence)
|
||||
try:
|
||||
print 'Before app run'
|
||||
app.run(debug=True, port=5000, threaded=True, use_reloader=False, use_debugger=True)
|
||||
finally:
|
||||
rt.stop()
|
||||
rt2.stop()
|
||||
rt3.stop()
|
@ -1,26 +1,26 @@
|
||||
from threading import Timer
|
||||
|
||||
class RepeatedTimer(object):
|
||||
def __init__(self, interval, function, *args, **kwargs):
|
||||
self._timer = None
|
||||
self.interval = interval
|
||||
self.function = function
|
||||
self.args = args
|
||||
self.kwargs = kwargs
|
||||
self.is_running = False
|
||||
self.start()
|
||||
|
||||
def _run(self):
|
||||
self.is_running = False
|
||||
self.start()
|
||||
self.function(*self.args, **self.kwargs)
|
||||
|
||||
def start(self):
|
||||
if not self.is_running:
|
||||
self._timer = Timer(self.interval, self._run)
|
||||
self._timer.start()
|
||||
self.is_running = True
|
||||
|
||||
def stop(self):
|
||||
self._timer.cancel()
|
||||
self.is_running = False
|
||||
from threading import Timer
|
||||
|
||||
class RepeatedTimer(object):
|
||||
def __init__(self, interval, function, *args, **kwargs):
|
||||
self._timer = None
|
||||
self.interval = interval
|
||||
self.function = function
|
||||
self.args = args
|
||||
self.kwargs = kwargs
|
||||
self.is_running = False
|
||||
self.start()
|
||||
|
||||
def _run(self):
|
||||
self.is_running = False
|
||||
self.start()
|
||||
self.function(*self.args, **self.kwargs)
|
||||
|
||||
def start(self):
|
||||
if not self.is_running:
|
||||
self._timer = Timer(self.interval, self._run)
|
||||
self._timer.start()
|
||||
self.is_running = True
|
||||
|
||||
def stop(self):
|
||||
self._timer.cancel()
|
||||
self.is_running = False
|
||||
|
@ -1,45 +1,45 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
|
||||
<title>{{title}}</title>
|
||||
|
||||
<!-- The javascript and css are managed by sprockets. The files can be found in the /assets folder-->
|
||||
<script type="text/javascript" src="/assets/application.js"></script>
|
||||
<link rel="stylesheet" href="/assets/application.css">
|
||||
|
||||
<link href='http://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700' rel='stylesheet' type='text/css'>
|
||||
<link rel="icon" href="/assets/images/favicon.ico">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div id="container">
|
||||
<div class="gridster">
|
||||
<ul>
|
||||
<li data-row="1" data-col="1" data-sizex="2" data-sizey="1">
|
||||
<div data-id="welcome" data-view="Text" data-title="Hello" data-text="This is your shiny new (python powered) dashboard." data-moreinfo="Protip: You can drag the widgets around!"></div>
|
||||
</li>
|
||||
|
||||
<li data-row="1" data-col="1" data-sizex="1" data-sizey="1">
|
||||
<div data-id="synergy" data-view="Meter" data-title="Synergy" data-min="0" data-max="100"></div>
|
||||
</li>
|
||||
|
||||
<li data-row="1" data-col="1" data-sizex="1" data-sizey="2">
|
||||
<div data-id="buzzwords" data-view="List" data-unordered="true" data-title="Buzzwords" data-moreinfo="Absolute ranking of pony preferences"></div>
|
||||
</li>
|
||||
|
||||
<li data-row="1" data-col="1" data-sizex="1" data-sizey="1">
|
||||
<div data-view="Image" data-image="/images/dashie.png"></div>
|
||||
</li>
|
||||
|
||||
<li data-row="1" data-col="1" data-sizex="2" data-sizey="1">
|
||||
<div data-id="convergence" data-view="Graph" data-title="Convergence" style="background-color:#ff9618"></div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
|
||||
<title>{{title}}</title>
|
||||
|
||||
<!-- The javascript and css are managed by sprockets. The files can be found in the /assets folder-->
|
||||
<script type="text/javascript" src="/assets/application.js"></script>
|
||||
<link rel="stylesheet" href="/assets/application.css">
|
||||
|
||||
<link href='http://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700' rel='stylesheet' type='text/css'>
|
||||
<link rel="icon" href="/assets/images/favicon.ico">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div id="container">
|
||||
<div class="gridster">
|
||||
<ul>
|
||||
<li data-row="1" data-col="1" data-sizex="2" data-sizey="1">
|
||||
<div data-id="welcome" data-view="Text" data-title="Hello" data-text="This is your shiny new (python powered) dashboard." data-moreinfo="Protip: You can drag the widgets around!"></div>
|
||||
</li>
|
||||
|
||||
<li data-row="1" data-col="1" data-sizex="1" data-sizey="1">
|
||||
<div data-id="synergy" data-view="Meter" data-title="Synergy" data-min="0" data-max="100"></div>
|
||||
</li>
|
||||
|
||||
<li data-row="1" data-col="1" data-sizex="1" data-sizey="2">
|
||||
<div data-id="buzzwords" data-view="List" data-unordered="true" data-title="Buzzwords" data-moreinfo="Absolute ranking of pony preferences"></div>
|
||||
</li>
|
||||
|
||||
<li data-row="1" data-col="1" data-sizex="1" data-sizey="1">
|
||||
<div data-view="Image" data-image="/images/dashie.png"></div>
|
||||
</li>
|
||||
|
||||
<li data-row="1" data-col="1" data-sizex="2" data-sizey="1">
|
||||
<div data-id="convergence" data-view="Graph" data-title="Convergence" style="background-color:#ff9618"></div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -1,18 +1,18 @@
|
||||
class Dashing.Clock extends Dashing.Widget
|
||||
|
||||
ready: ->
|
||||
setInterval(@startTime, 500)
|
||||
|
||||
startTime: =>
|
||||
today = new Date()
|
||||
|
||||
h = today.getHours()
|
||||
m = today.getMinutes()
|
||||
s = today.getSeconds()
|
||||
m = @formatTime(m)
|
||||
s = @formatTime(s)
|
||||
@set('time', h + ":" + m + ":" + s)
|
||||
@set('date', today.toDateString())
|
||||
|
||||
formatTime: (i) ->
|
||||
class Dashing.Clock extends Dashing.Widget
|
||||
|
||||
ready: ->
|
||||
setInterval(@startTime, 500)
|
||||
|
||||
startTime: =>
|
||||
today = new Date()
|
||||
|
||||
h = today.getHours()
|
||||
m = today.getMinutes()
|
||||
s = today.getSeconds()
|
||||
m = @formatTime(m)
|
||||
s = @formatTime(s)
|
||||
@set('time', h + ":" + m + ":" + s)
|
||||
@set('date', today.toDateString())
|
||||
|
||||
formatTime: (i) ->
|
||||
if i < 10 then "0" + i else i
|
@ -1,2 +1,2 @@
|
||||
<h1 data-bind="date"></h1>
|
||||
<h1 data-bind="date"></h1>
|
||||
<h2 data-bind="time"></h2>
|
@ -1,13 +1,13 @@
|
||||
// ----------------------------------------------------------------------------
|
||||
// Sass declarations
|
||||
// ----------------------------------------------------------------------------
|
||||
$background-color: #dc5945;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Widget-clock styles
|
||||
// ----------------------------------------------------------------------------
|
||||
.widget-clock {
|
||||
|
||||
background-color: $background-color;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Sass declarations
|
||||
// ----------------------------------------------------------------------------
|
||||
$background-color: #dc5945;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Widget-clock styles
|
||||
// ----------------------------------------------------------------------------
|
||||
.widget-clock {
|
||||
|
||||
background-color: $background-color;
|
||||
|
||||
}
|
@ -1,24 +1,24 @@
|
||||
class Dashing.Comments extends Dashing.Widget
|
||||
|
||||
@accessor 'quote', ->
|
||||
"“#{@get('current_comment')?.body}”"
|
||||
|
||||
ready: ->
|
||||
@currentIndex = 0
|
||||
@commentElem = $(@node).find('.comment-container')
|
||||
@nextComment()
|
||||
@startCarousel()
|
||||
|
||||
onData: (data) ->
|
||||
@currentIndex = 0
|
||||
|
||||
startCarousel: ->
|
||||
setInterval(@nextComment, 8000)
|
||||
|
||||
nextComment: =>
|
||||
comments = @get('comments')
|
||||
if comments
|
||||
@commentElem.fadeOut =>
|
||||
@currentIndex = (@currentIndex + 1) % comments.length
|
||||
@set 'current_comment', comments[@currentIndex]
|
||||
class Dashing.Comments extends Dashing.Widget
|
||||
|
||||
@accessor 'quote', ->
|
||||
"“#{@get('current_comment')?.body}”"
|
||||
|
||||
ready: ->
|
||||
@currentIndex = 0
|
||||
@commentElem = $(@node).find('.comment-container')
|
||||
@nextComment()
|
||||
@startCarousel()
|
||||
|
||||
onData: (data) ->
|
||||
@currentIndex = 0
|
||||
|
||||
startCarousel: ->
|
||||
setInterval(@nextComment, 8000)
|
||||
|
||||
nextComment: =>
|
||||
comments = @get('comments')
|
||||
if comments
|
||||
@commentElem.fadeOut =>
|
||||
@currentIndex = (@currentIndex + 1) % comments.length
|
||||
@set 'current_comment', comments[@currentIndex]
|
||||
@commentElem.fadeIn()
|
@ -1,7 +1,7 @@
|
||||
<h1 class="title" data-bind="title"></h1>
|
||||
<div class="comment-container">
|
||||
<h3><img data-bind-src='current_comment.avatar'/><span data-bind='current_comment.name' class="name"></span></h3>
|
||||
<p class="comment" data-bind='quote'></p>
|
||||
</div>
|
||||
|
||||
<h1 class="title" data-bind="title"></h1>
|
||||
<div class="comment-container">
|
||||
<h3><img data-bind-src='current_comment.avatar'/><span data-bind='current_comment.name' class="name"></span></h3>
|
||||
<p class="comment" data-bind='quote'></p>
|
||||
</div>
|
||||
|
||||
<p class="more-info" data-bind="moreinfo | raw"></p>
|
@ -1,33 +1,33 @@
|
||||
// ----------------------------------------------------------------------------
|
||||
// Sass declarations
|
||||
// ----------------------------------------------------------------------------
|
||||
$background-color: #eb9c3c;
|
||||
|
||||
$title-color: rgba(255, 255, 255, 0.7);
|
||||
$moreinfo-color: rgba(255, 255, 255, 0.7);
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Widget-comment styles
|
||||
// ----------------------------------------------------------------------------
|
||||
.widget-comments {
|
||||
|
||||
background-color: $background-color;
|
||||
|
||||
.title {
|
||||
color: $title-color;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.name {
|
||||
padding-left: 5px;
|
||||
}
|
||||
|
||||
.comment-container {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.more-info {
|
||||
color: $moreinfo-color;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Sass declarations
|
||||
// ----------------------------------------------------------------------------
|
||||
$background-color: #eb9c3c;
|
||||
|
||||
$title-color: rgba(255, 255, 255, 0.7);
|
||||
$moreinfo-color: rgba(255, 255, 255, 0.7);
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Widget-comment styles
|
||||
// ----------------------------------------------------------------------------
|
||||
.widget-comments {
|
||||
|
||||
background-color: $background-color;
|
||||
|
||||
.title {
|
||||
color: $title-color;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.name {
|
||||
padding-left: 5px;
|
||||
}
|
||||
|
||||
.comment-container {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.more-info {
|
||||
color: $moreinfo-color;
|
||||
}
|
||||
|
||||
}
|
@ -1,35 +1,35 @@
|
||||
class Dashing.Graph extends Dashing.Widget
|
||||
|
||||
@accessor 'current', ->
|
||||
return @get('displayedValue') if @get('displayedValue')
|
||||
points = @get('points')
|
||||
if points
|
||||
points[points.length - 1].y
|
||||
|
||||
ready: ->
|
||||
container = $(@node).parent()
|
||||
# Gross hacks. Let's fix this.
|
||||
width = (Dashing.widget_base_dimensions[0] * container.data("sizex")) + Dashing.widget_margins[0] * 2 * (container.data("sizex") - 1)
|
||||
height = (Dashing.widget_base_dimensions[1] * container.data("sizey"))
|
||||
@graph = new Rickshaw.Graph(
|
||||
element: @node
|
||||
width: width
|
||||
height: height
|
||||
series: [
|
||||
{
|
||||
color: "#fff",
|
||||
data: [{x:0, y:0}]
|
||||
}
|
||||
]
|
||||
)
|
||||
|
||||
@graph.series[0].data = @get('points') if @get('points')
|
||||
|
||||
x_axis = new Rickshaw.Graph.Axis.Time(graph: @graph)
|
||||
y_axis = new Rickshaw.Graph.Axis.Y(graph: @graph, tickFormat: Rickshaw.Fixtures.Number.formatKMBT)
|
||||
@graph.render()
|
||||
|
||||
onData: (data) ->
|
||||
if @graph
|
||||
@graph.series[0].data = data.points
|
||||
@graph.render()
|
||||
class Dashing.Graph extends Dashing.Widget
|
||||
|
||||
@accessor 'current', ->
|
||||
return @get('displayedValue') if @get('displayedValue')
|
||||
points = @get('points')
|
||||
if points
|
||||
points[points.length - 1].y
|
||||
|
||||
ready: ->
|
||||
container = $(@node).parent()
|
||||
# Gross hacks. Let's fix this.
|
||||
width = (Dashing.widget_base_dimensions[0] * container.data("sizex")) + Dashing.widget_margins[0] * 2 * (container.data("sizex") - 1)
|
||||
height = (Dashing.widget_base_dimensions[1] * container.data("sizey"))
|
||||
@graph = new Rickshaw.Graph(
|
||||
element: @node
|
||||
width: width
|
||||
height: height
|
||||
series: [
|
||||
{
|
||||
color: "#fff",
|
||||
data: [{x:0, y:0}]
|
||||
}
|
||||
]
|
||||
)
|
||||
|
||||
@graph.series[0].data = @get('points') if @get('points')
|
||||
|
||||
x_axis = new Rickshaw.Graph.Axis.Time(graph: @graph)
|
||||
y_axis = new Rickshaw.Graph.Axis.Y(graph: @graph, tickFormat: Rickshaw.Fixtures.Number.formatKMBT)
|
||||
@graph.render()
|
||||
|
||||
onData: (data) ->
|
||||
if @graph
|
||||
@graph.series[0].data = data.points
|
||||
@graph.render()
|
||||
|
@ -1,5 +1,5 @@
|
||||
<h1 class="title" data-bind="title"></h1>
|
||||
|
||||
<h2 class="value" data-bind="current | prettyNumber | prepend prefix"></h2>
|
||||
|
||||
<h1 class="title" data-bind="title"></h1>
|
||||
|
||||
<h2 class="value" data-bind="current | prettyNumber | prepend prefix"></h2>
|
||||
|
||||
<p class="more-info" data-bind="moreinfo"></p>
|
@ -1,65 +1,65 @@
|
||||
// ----------------------------------------------------------------------------
|
||||
// Sass declarations
|
||||
// ----------------------------------------------------------------------------
|
||||
$background-color: #dc5945;
|
||||
|
||||
$title-color: rgba(255, 255, 255, 0.7);
|
||||
$moreinfo-color: rgba(255, 255, 255, 0.3);
|
||||
$tick-color: rgba(0, 0, 0, 0.4);
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Widget-graph styles
|
||||
// ----------------------------------------------------------------------------
|
||||
.widget-graph {
|
||||
|
||||
background-color: $background-color;
|
||||
position: relative;
|
||||
|
||||
|
||||
svg {
|
||||
position: absolute;
|
||||
opacity: 0.4;
|
||||
fill-opacity: 0.4;
|
||||
left: 0px;
|
||||
top: 0px;
|
||||
}
|
||||
|
||||
.title, .value {
|
||||
position: relative;
|
||||
z-index: 99;
|
||||
}
|
||||
|
||||
.title {
|
||||
color: $title-color;
|
||||
}
|
||||
|
||||
.more-info {
|
||||
color: $moreinfo-color;
|
||||
font-weight: 600;
|
||||
font-size: 20px;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.x_tick {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
.title {
|
||||
font-size: 20px;
|
||||
color: $tick-color;
|
||||
opacity: 0.5;
|
||||
padding-bottom: 3px;
|
||||
}
|
||||
}
|
||||
|
||||
.y_ticks {
|
||||
font-size: 20px;
|
||||
fill: $tick-color;
|
||||
fill-opacity: 1;
|
||||
}
|
||||
|
||||
.domain {
|
||||
display: none;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Sass declarations
|
||||
// ----------------------------------------------------------------------------
|
||||
$background-color: #dc5945;
|
||||
|
||||
$title-color: rgba(255, 255, 255, 0.7);
|
||||
$moreinfo-color: rgba(255, 255, 255, 0.3);
|
||||
$tick-color: rgba(0, 0, 0, 0.4);
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Widget-graph styles
|
||||
// ----------------------------------------------------------------------------
|
||||
.widget-graph {
|
||||
|
||||
background-color: $background-color;
|
||||
position: relative;
|
||||
|
||||
|
||||
svg {
|
||||
position: absolute;
|
||||
opacity: 0.4;
|
||||
fill-opacity: 0.4;
|
||||
left: 0px;
|
||||
top: 0px;
|
||||
}
|
||||
|
||||
.title, .value {
|
||||
position: relative;
|
||||
z-index: 99;
|
||||
}
|
||||
|
||||
.title {
|
||||
color: $title-color;
|
||||
}
|
||||
|
||||
.more-info {
|
||||
color: $moreinfo-color;
|
||||
font-weight: 600;
|
||||
font-size: 20px;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.x_tick {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
.title {
|
||||
font-size: 20px;
|
||||
color: $tick-color;
|
||||
opacity: 0.5;
|
||||
padding-bottom: 3px;
|
||||
}
|
||||
}
|
||||
|
||||
.y_ticks {
|
||||
font-size: 20px;
|
||||
fill: $tick-color;
|
||||
fill-opacity: 1;
|
||||
}
|
||||
|
||||
.domain {
|
||||
display: none;
|
||||
}
|
||||
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
class Dashing.Iframe extends Dashing.Widget
|
||||
|
||||
ready: ->
|
||||
# This is fired when the widget is done being rendered
|
||||
|
||||
onData: (data) ->
|
||||
# Handle incoming data
|
||||
# You can access the html node of this widget with `@node`
|
||||
class Dashing.Iframe extends Dashing.Widget
|
||||
|
||||
ready: ->
|
||||
# This is fired when the widget is done being rendered
|
||||
|
||||
onData: (data) ->
|
||||
# Handle incoming data
|
||||
# You can access the html node of this widget with `@node`
|
||||
# Example: $(@node).fadeOut().fadeIn() will make the node flash each time data comes in.
|
@ -1,8 +1,8 @@
|
||||
.widget-iframe {
|
||||
padding: 3px 0px 0px 0px !important;
|
||||
|
||||
iframe {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.widget-iframe {
|
||||
padding: 3px 0px 0px 0px !important;
|
||||
|
||||
iframe {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
class Dashing.Image extends Dashing.Widget
|
||||
|
||||
ready: ->
|
||||
# This is fired when the widget is done being rendered
|
||||
|
||||
onData: (data) ->
|
||||
# Handle incoming data
|
||||
# You can access the html node of this widget with `@node`
|
||||
class Dashing.Image extends Dashing.Widget
|
||||
|
||||
ready: ->
|
||||
# This is fired when the widget is done being rendered
|
||||
|
||||
onData: (data) ->
|
||||
# Handle incoming data
|
||||
# You can access the html node of this widget with `@node`
|
||||
# Example: $(@node).fadeOut().fadeIn() will make the node flash each time data comes in.
|
@ -1,13 +1,13 @@
|
||||
// ----------------------------------------------------------------------------
|
||||
// Sass declarations
|
||||
// ----------------------------------------------------------------------------
|
||||
$background-color: #4b4b4b;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Widget-image styles
|
||||
// ----------------------------------------------------------------------------
|
||||
.widget-image {
|
||||
|
||||
background-color: $background-color;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Sass declarations
|
||||
// ----------------------------------------------------------------------------
|
||||
$background-color: #4b4b4b;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Widget-image styles
|
||||
// ----------------------------------------------------------------------------
|
||||
.widget-image {
|
||||
|
||||
background-color: $background-color;
|
||||
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
class Dashing.List extends Dashing.Widget
|
||||
ready: ->
|
||||
if @get('unordered')
|
||||
$(@node).find('ol').remove()
|
||||
else
|
||||
class Dashing.List extends Dashing.Widget
|
||||
ready: ->
|
||||
if @get('unordered')
|
||||
$(@node).find('ol').remove()
|
||||
else
|
||||
$(@node).find('ul').remove()
|
@ -1,18 +1,18 @@
|
||||
<h1 class="title" data-bind="title"></h1>
|
||||
|
||||
<ol>
|
||||
<li data-foreach-item="items">
|
||||
<span class="label" data-bind="item.label"></span>
|
||||
<span class="value" data-bind="item.value"></span>
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<ul class="list-nostyle">
|
||||
<li data-foreach-item="items">
|
||||
<span class="label" data-bind="item.label"></span>
|
||||
<span class="value" data-bind="item.value"></span>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p class="more-info" data-bind="moreinfo"></p>
|
||||
<h1 class="title" data-bind="title"></h1>
|
||||
|
||||
<ol>
|
||||
<li data-foreach-item="items">
|
||||
<span class="label" data-bind="item.label"></span>
|
||||
<span class="value" data-bind="item.value"></span>
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<ul class="list-nostyle">
|
||||
<li data-foreach-item="items">
|
||||
<span class="label" data-bind="item.label"></span>
|
||||
<span class="value" data-bind="item.value"></span>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p class="more-info" data-bind="moreinfo"></p>
|
||||
<p class="updated-at" data-bind="updatedAtMessage"></p>
|
@ -1,60 +1,60 @@
|
||||
// ----------------------------------------------------------------------------
|
||||
// Sass declarations
|
||||
// ----------------------------------------------------------------------------
|
||||
$background-color: #12b0c5;
|
||||
$value-color: #fff;
|
||||
|
||||
$title-color: rgba(255, 255, 255, 0.7);
|
||||
$label-color: rgba(255, 255, 255, 0.7);
|
||||
$moreinfo-color: rgba(255, 255, 255, 0.7);
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Widget-list styles
|
||||
// ----------------------------------------------------------------------------
|
||||
.widget-list {
|
||||
|
||||
background-color: $background-color;
|
||||
vertical-align: top;
|
||||
|
||||
.title {
|
||||
color: $title-color;
|
||||
}
|
||||
|
||||
ol, ul {
|
||||
margin: 0 15px;
|
||||
text-align: left;
|
||||
color: $label-color;
|
||||
}
|
||||
|
||||
ol {
|
||||
list-style-position: inside;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.list-nostyle {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.label {
|
||||
color: $label-color;
|
||||
}
|
||||
|
||||
.value {
|
||||
float: right;
|
||||
margin-left: 12px;
|
||||
font-weight: 600;
|
||||
color: $value-color;
|
||||
}
|
||||
|
||||
.updated-at {
|
||||
color: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
.more-info {
|
||||
color: $moreinfo-color;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Sass declarations
|
||||
// ----------------------------------------------------------------------------
|
||||
$background-color: #12b0c5;
|
||||
$value-color: #fff;
|
||||
|
||||
$title-color: rgba(255, 255, 255, 0.7);
|
||||
$label-color: rgba(255, 255, 255, 0.7);
|
||||
$moreinfo-color: rgba(255, 255, 255, 0.7);
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Widget-list styles
|
||||
// ----------------------------------------------------------------------------
|
||||
.widget-list {
|
||||
|
||||
background-color: $background-color;
|
||||
vertical-align: top;
|
||||
|
||||
.title {
|
||||
color: $title-color;
|
||||
}
|
||||
|
||||
ol, ul {
|
||||
margin: 0 15px;
|
||||
text-align: left;
|
||||
color: $label-color;
|
||||
}
|
||||
|
||||
ol {
|
||||
list-style-position: inside;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.list-nostyle {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.label {
|
||||
color: $label-color;
|
||||
}
|
||||
|
||||
.value {
|
||||
float: right;
|
||||
margin-left: 12px;
|
||||
font-weight: 600;
|
||||
color: $value-color;
|
||||
}
|
||||
|
||||
.updated-at {
|
||||
color: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
.more-info {
|
||||
color: $moreinfo-color;
|
||||
}
|
||||
|
||||
}
|
@ -1,14 +1,14 @@
|
||||
class Dashing.Meter extends Dashing.Widget
|
||||
|
||||
@accessor 'value', Dashing.AnimatedValue
|
||||
|
||||
constructor: ->
|
||||
super
|
||||
@observe 'value', (value) ->
|
||||
$(@node).find(".meter").val(value).trigger('change')
|
||||
|
||||
ready: ->
|
||||
meter = $(@node).find(".meter")
|
||||
meter.attr("data-bgcolor", meter.css("background-color"))
|
||||
meter.attr("data-fgcolor", meter.css("color"))
|
||||
class Dashing.Meter extends Dashing.Widget
|
||||
|
||||
@accessor 'value', Dashing.AnimatedValue
|
||||
|
||||
constructor: ->
|
||||
super
|
||||
@observe 'value', (value) ->
|
||||
$(@node).find(".meter").val(value).trigger('change')
|
||||
|
||||
ready: ->
|
||||
meter = $(@node).find(".meter")
|
||||
meter.attr("data-bgcolor", meter.css("background-color"))
|
||||
meter.attr("data-fgcolor", meter.css("color"))
|
||||
meter.knob()
|
@ -1,7 +1,7 @@
|
||||
<h1 class="title" data-bind="title"></h1>
|
||||
|
||||
<input class="meter" data-angleOffset=-125 data-angleArc=250 data-width=200 data-readOnly=true data-bind-value="value | shortenedNumber" data-bind-data-min="min" data-bind-data-max="max">
|
||||
|
||||
<p class="more-info" data-bind="moreinfo"></p>
|
||||
|
||||
<h1 class="title" data-bind="title"></h1>
|
||||
|
||||
<input class="meter" data-angleOffset=-125 data-angleArc=250 data-width=200 data-readOnly=true data-bind-value="value | shortenedNumber" data-bind-data-min="min" data-bind-data-max="max">
|
||||
|
||||
<p class="more-info" data-bind="moreinfo"></p>
|
||||
|
||||
<p class="updated-at" data-bind="updatedAtMessage"></p>
|
@ -1,35 +1,35 @@
|
||||
// ----------------------------------------------------------------------------
|
||||
// Sass declarations
|
||||
// ----------------------------------------------------------------------------
|
||||
$background-color: #9c4274;
|
||||
|
||||
$title-color: rgba(255, 255, 255, 0.7);
|
||||
$moreinfo-color: rgba(255, 255, 255, 0.3);
|
||||
|
||||
$meter-background: darken($background-color, 15%);
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Widget-meter styles
|
||||
// ----------------------------------------------------------------------------
|
||||
.widget-meter {
|
||||
|
||||
background-color: $background-color;
|
||||
|
||||
input.meter {
|
||||
background-color: $meter-background;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.title {
|
||||
color: $title-color;
|
||||
}
|
||||
|
||||
.more-info {
|
||||
color: $moreinfo-color;
|
||||
}
|
||||
|
||||
.updated-at {
|
||||
color: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Sass declarations
|
||||
// ----------------------------------------------------------------------------
|
||||
$background-color: #9c4274;
|
||||
|
||||
$title-color: rgba(255, 255, 255, 0.7);
|
||||
$moreinfo-color: rgba(255, 255, 255, 0.3);
|
||||
|
||||
$meter-background: darken($background-color, 15%);
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Widget-meter styles
|
||||
// ----------------------------------------------------------------------------
|
||||
.widget-meter {
|
||||
|
||||
background-color: $background-color;
|
||||
|
||||
input.meter {
|
||||
background-color: $meter-background;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.title {
|
||||
color: $title-color;
|
||||
}
|
||||
|
||||
.more-info {
|
||||
color: $moreinfo-color;
|
||||
}
|
||||
|
||||
.updated-at {
|
||||
color: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
}
|
@ -1,20 +1,20 @@
|
||||
class Dashing.Number extends Dashing.Widget
|
||||
@accessor 'current', Dashing.AnimatedValue
|
||||
|
||||
@accessor 'difference', ->
|
||||
if @get('last')
|
||||
last = parseInt(@get('last'))
|
||||
current = parseInt(@get('current'))
|
||||
if last != 0
|
||||
diff = Math.abs(Math.round((current - last) / last * 100))
|
||||
"#{diff}%"
|
||||
else
|
||||
""
|
||||
|
||||
@accessor 'arrow', ->
|
||||
if @get('last')
|
||||
if parseInt(@get('current')) > parseInt(@get('last')) then 'icon-arrow-up' else 'icon-arrow-down'
|
||||
|
||||
onData: (data) ->
|
||||
if data.status
|
||||
class Dashing.Number extends Dashing.Widget
|
||||
@accessor 'current', Dashing.AnimatedValue
|
||||
|
||||
@accessor 'difference', ->
|
||||
if @get('last')
|
||||
last = parseInt(@get('last'))
|
||||
current = parseInt(@get('current'))
|
||||
if last != 0
|
||||
diff = Math.abs(Math.round((current - last) / last * 100))
|
||||
"#{diff}%"
|
||||
else
|
||||
""
|
||||
|
||||
@accessor 'arrow', ->
|
||||
if @get('last')
|
||||
if parseInt(@get('current')) > parseInt(@get('last')) then 'icon-arrow-up' else 'icon-arrow-down'
|
||||
|
||||
onData: (data) ->
|
||||
if data.status
|
||||
$(@get('node')).addClass("status-#{data.status}")
|
@ -1,11 +1,11 @@
|
||||
<h1 class="title" data-bind="title"></h1>
|
||||
|
||||
<h2 class="value" data-bind="current | shortenedNumber | prepend prefix"></h2>
|
||||
|
||||
<p class="change-rate">
|
||||
<i data-bind-class="arrow"></i><span data-bind="difference"></span>
|
||||
</p>
|
||||
|
||||
<p class="more-info" data-bind="moreinfo | raw"></p>
|
||||
|
||||
<p class="updated-at" data-bind="updatedAtMessage"></p>
|
||||
<h1 class="title" data-bind="title"></h1>
|
||||
|
||||
<h2 class="value" data-bind="current | shortenedNumber | prepend prefix"></h2>
|
||||
|
||||
<p class="change-rate">
|
||||
<i data-bind-class="arrow"></i><span data-bind="difference"></span>
|
||||
</p>
|
||||
|
||||
<p class="more-info" data-bind="moreinfo | raw"></p>
|
||||
|
||||
<p class="updated-at" data-bind="updatedAtMessage"></p>
|
||||
|
@ -1,39 +1,39 @@
|
||||
// ----------------------------------------------------------------------------
|
||||
// Sass declarations
|
||||
// ----------------------------------------------------------------------------
|
||||
$background-color: #47bbb3;
|
||||
$value-color: #fff;
|
||||
|
||||
$title-color: rgba(255, 255, 255, 0.7);;
|
||||
$moreinfo-color: rgba(255, 255, 255, 0.7);;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Widget-number styles
|
||||
// ----------------------------------------------------------------------------
|
||||
.widget-number {
|
||||
|
||||
background-color: $background-color;
|
||||
|
||||
.title {
|
||||
color: $title-color;
|
||||
}
|
||||
|
||||
.value {
|
||||
color: $value-color;
|
||||
}
|
||||
|
||||
.change-rate {
|
||||
font-weight: 500;
|
||||
font-size: 30px;
|
||||
color: $value-color;
|
||||
}
|
||||
|
||||
.more-info {
|
||||
color: $moreinfo-color;
|
||||
}
|
||||
|
||||
.updated-at {
|
||||
color: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Sass declarations
|
||||
// ----------------------------------------------------------------------------
|
||||
$background-color: #47bbb3;
|
||||
$value-color: #fff;
|
||||
|
||||
$title-color: rgba(255, 255, 255, 0.7);;
|
||||
$moreinfo-color: rgba(255, 255, 255, 0.7);;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Widget-number styles
|
||||
// ----------------------------------------------------------------------------
|
||||
.widget-number {
|
||||
|
||||
background-color: $background-color;
|
||||
|
||||
.title {
|
||||
color: $title-color;
|
||||
}
|
||||
|
||||
.value {
|
||||
color: $value-color;
|
||||
}
|
||||
|
||||
.change-rate {
|
||||
font-weight: 500;
|
||||
font-size: 30px;
|
||||
color: $value-color;
|
||||
}
|
||||
|
||||
.more-info {
|
||||
color: $moreinfo-color;
|
||||
}
|
||||
|
||||
.updated-at {
|
||||
color: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
<h1 class="title" data-bind="title"></h1>
|
||||
|
||||
<h3 data-bind="text | raw"></h3>
|
||||
|
||||
<p class="more-info" data-bind="moreinfo | raw"></p>
|
||||
|
||||
<h1 class="title" data-bind="title"></h1>
|
||||
|
||||
<h3 data-bind="text | raw"></h3>
|
||||
|
||||
<p class="more-info" data-bind="moreinfo | raw"></p>
|
||||
|
||||
<p class="updated-at" data-bind="updatedAtMessage"></p>
|
@ -1,32 +1,32 @@
|
||||
// ----------------------------------------------------------------------------
|
||||
// Sass declarations
|
||||
// ----------------------------------------------------------------------------
|
||||
$background-color: #ec663c;
|
||||
|
||||
$title-color: rgba(255, 255, 255, 0.7);
|
||||
$moreinfo-color: rgba(255, 255, 255, 0.7);
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Widget-text styles
|
||||
// ----------------------------------------------------------------------------
|
||||
.widget-text {
|
||||
|
||||
background-color: $background-color;
|
||||
|
||||
.title {
|
||||
color: $title-color;
|
||||
}
|
||||
|
||||
.more-info {
|
||||
color: $moreinfo-color;
|
||||
}
|
||||
|
||||
.updated-at {
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
}
|
||||
|
||||
|
||||
&.large h3 {
|
||||
font-size: 65px;
|
||||
}
|
||||
// ----------------------------------------------------------------------------
|
||||
// Sass declarations
|
||||
// ----------------------------------------------------------------------------
|
||||
$background-color: #ec663c;
|
||||
|
||||
$title-color: rgba(255, 255, 255, 0.7);
|
||||
$moreinfo-color: rgba(255, 255, 255, 0.7);
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Widget-text styles
|
||||
// ----------------------------------------------------------------------------
|
||||
.widget-text {
|
||||
|
||||
background-color: $background-color;
|
||||
|
||||
.title {
|
||||
color: $title-color;
|
||||
}
|
||||
|
||||
.more-info {
|
||||
color: $moreinfo-color;
|
||||
}
|
||||
|
||||
.updated-at {
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
}
|
||||
|
||||
|
||||
&.large h3 {
|
||||
font-size: 65px;
|
||||
}
|
||||
}
|
18
setup.py
18
setup.py
@ -1,9 +1,9 @@
|
||||
from distutils.core import setup
|
||||
|
||||
setup(
|
||||
name='PyDashie',
|
||||
version='0.1dev',
|
||||
packages=['pydashie',],
|
||||
license='MIT',
|
||||
long_description=open('README.txt').read(),
|
||||
)
|
||||
from distutils.core import setup
|
||||
|
||||
setup(
|
||||
name='PyDashie',
|
||||
version='0.1dev',
|
||||
packages=['pydashie',],
|
||||
license='MIT',
|
||||
long_description=open('README.txt').read(),
|
||||
)
|
||||
|
Loading…
x
Reference in New Issue
Block a user