view release on metacpan or search on metacpan
- fix issue in Auth, where we were calling API::user() by class, not by
object, broke during recent update to API code. (fixes #50)
- add API::env_light_aux() and DB::db() to POD
- added new sig handler for warn with env var SUPPRESS_WARN=1 to quiet
warnings. Recommended only while testing
- fix issue where the month in the UI date was off-by-one (fixes #46)
- renamed "log_level" config file variable to "debug_level"
- removed config/ from the distribution, and consolidated the testing()
and _ui_testing() configuration to use the config file in t/ instead
- added new config directive, "devel", if set to 1, we'll turn the
background of the time display in the UI red to signify this isn't
a production system (closes #47)
- fix logic bugs and other JS weirdness in core.js that was completely
breaking the UI's interpretation of aux override (fixes #53)
- rewrite logic in core.js so that if override is disabled, setting aux
state doesn't happen (fixes #54)
- disabled "toggle" in the base config file for the light aux (updated
tests)
- updated API::_bool() to allow the $bool param to be both true/false
and 1/0, as we do call it in both of those contexts, so we don't
have to translate the param in code before sending it in
lib/App/RPi/EnvUI/Configuration.pod view on Meta::CPAN
Value: Integer, C<-1> through C<7>. Sets the debug logging level.
Default: C<-1> (off)
=head3 devel
Value: Bool. True to signify that this is not a production system, False to
signify it is.
When enabled, the UI's time/date bar's background colour will change to red for
easy identification of a development system.
Default: C<0> (off)
=head2 CONTROL CONFIGURATION SECTION
The C<control> configuration section specifies parameters for specific actions
within the system.
=head3 temp_limit
public/css/envui.css view on Meta::CPAN
}
.inner_aux {
width: 33.33333%;
}
/* main menu */
#time {
padding: 10px 20px;
background: #c0c0c0;
color: #FFF;
}
.menuHeader {
padding: 10px 20px;
display: block;
text-decoration: none;
color: #FFF;
}
.menuHeader:hover {
background: green;
}
.menuBackground {
background: #c0c0c0;
text-align: left;
}
.dropDownMenu a {
color: #FFF;
}
.dropDownMenu,
.dropDownMenu ul {
list-style: none;
margin: 0;
public/css/envui.css view on Meta::CPAN
}
.dropDownMenu li {
position: relative;
}
.dropDownMenu a {
padding: 10px 20px;
display: block;
text-decoration: none;
}
.dropDownMenu a:hover {
background: green;
}
/* Level 1 Drop Down */
.dropDownMenu > li {
display: inline-block;
vertical-align: top;
margin-left: -4px; /* solve the 4 pixels spacing between list-items */
}
.dropDownMenu > li:first-child {
margin-left: 0;
}
/* Level 2 */
.dropDownMenu ul {
box-shadow: 2px 2px 15px 0 rgba(0,0,0, 0.5);
}
.dropDownMenu > li > ul {
text-align: left;
display: none;
background: #c0c0c0;
position: absolute;
top: 100%;
left: 0;
width: 240px;
z-index: 999999;
}
/* Level 3 */
.dropDownMenu > li > ul > li > ul {
text-align: left;
display: none;
background: #c0c0c0;
position: absolute;
left: 100%;
top: 0;
z-index: 9999999;
}
.graph_container {
box-sizing: border-box;
width: 600px;
height: 200px;
padding: 20px 15px 15px 15px;
margin: 15px auto 30px auto;
border: 1px solid #ddd;
background: #fff;
background: linear-gradient(#f6f6f6 0, #fff 50px);
background: -o-linear-gradient(#f6f6f6 0, #fff 50px);
background: -ms-linear-gradient(#f6f6f6 0, #fff 50px);
background: -moz-linear-gradient(#f6f6f6 0, #fff 50px);
background: -webkit-linear-gradient(#f6f6f6 0, #fff 50px);
box-shadow: 0 3px 10px rgba(0,0,0,0.15);
-o-box-shadow: 0 3px 10px rgba(0,0,0,0.1);
-ms-box-shadow: 0 3px 10px rgba(0,0,0,0.1);
-moz-box-shadow: 0 3px 10px rgba(0,0,0,0.1);
-webkit-box-shadow: 0 3px 10px rgba(0,0,0,0.1);
}
.graph {
width: 100%;
height: 100%;
public/css/flipswitch.css view on Meta::CPAN
}
/* Icon-only buttons */
.ui-btn-icon-notext.ui-btn-corner-all,
.ui-btn-icon-notext.ui-corner-all {
-webkit-border-radius: 1em;
border-radius: 1em;
}
/* Radius clip workaround for cleaning up corner trapping */
.ui-btn-corner-all,
.ui-corner-all {
-webkit-background-clip: padding;
background-clip: padding-box;
}
/* Bar: Toolbars, dividers, slider track */
.ui-bar-a,
.ui-page-theme-a .ui-bar-inherit,
html .ui-bar-a .ui-bar-inherit,
html .ui-body-a .ui-bar-inherit,
html body .ui-group-theme-a .ui-bar-inherit {
background-color: #e9e9e9 /*{a-bar-background-color}*/;
border-color: #ddd /*{a-bar-border}*/;
color: #333 /*{a-bar-color}*/;
font-weight: bold;
}
/* Button up */
.ui-page-theme-a .ui-btn,
html .ui-bar-a .ui-btn,
html .ui-body-a .ui-btn,
html body .ui-group-theme-a .ui-btn,
html head + body .ui-btn.ui-btn-a,
/* Button visited */
.ui-page-theme-a .ui-btn:visited,
html .ui-bar-a .ui-btn:visited,
html .ui-body-a .ui-btn:visited,
html body .ui-group-theme-a .ui-btn:visited,
html head + body .ui-btn.ui-btn-a:visited {
background-color: #f6f6f6 /*{a-bup-background-color}*/;
border-color: #ddd /*{a-bup-border}*/;
color: #333 /*{a-bup-color}*/;
}
/* Button hover */
.ui-page-theme-a .ui-btn:hover,
html .ui-bar-a .ui-btn:hover,
html .ui-body-a .ui-btn:hover,
html body .ui-group-theme-a .ui-btn:hover,
html head + body .ui-btn.ui-btn-a:hover {
background-color: #ededed /*{a-bhover-background-color}*/;
border-color: #ddd /*{a-bhover-border}*/;
color: #333 /*{a-bhover-color}*/;
}
/* Button down */
.ui-page-theme-a .ui-btn:active,
html .ui-bar-a .ui-btn:active,
html .ui-body-a .ui-btn:active,
html body .ui-group-theme-a .ui-btn:active,
html head + body .ui-btn.ui-btn-a:active {
background-color: #e8e8e8 /*{a-bdown-background-color}*/;
border-color: #ddd /*{a-bdown-border}*/;
color: #333 /*{a-bdown-color}*/;
}
/* Active button */
.ui-page-theme-a .ui-btn.ui-btn-active,
html .ui-bar-a .ui-btn.ui-btn-active,
html .ui-body-a .ui-btn.ui-btn-active,
html body .ui-group-theme-a .ui-btn.ui-btn-active,
html head + body .ui-btn.ui-btn-a.ui-btn-active,
/* Active checkbox icon */
.ui-page-theme-a .ui-checkbox-on:after,
html .ui-bar-a .ui-checkbox-on:after,
html .ui-body-a .ui-checkbox-on:after,
html body .ui-group-theme-a .ui-checkbox-on:after,
.ui-btn.ui-checkbox-on.ui-btn-a:after,
/* Active flipswitch background */
.ui-page-theme-a .ui-flipswitch-active,
html .ui-bar-a .ui-flipswitch-active,
html .ui-body-a .ui-flipswitch-active,
html body .ui-group-theme-a .ui-flipswitch-active,
html body .ui-flipswitch.ui-bar-a.ui-flipswitch-active,
/* Active slider track */
.ui-page-theme-a .ui-slider-track .ui-btn-active,
html .ui-bar-a .ui-slider-track .ui-btn-active,
html .ui-body-a .ui-slider-track .ui-btn-active,
html body .ui-group-theme-a .ui-slider-track .ui-btn-active,
html body div.ui-slider-track.ui-body-a .ui-btn-active {
background-color: green /*{a-active-background-color}*/;
border-color: green /*{a-active-border}*/;
color: black /*{a-active-color}*/;
}
public/css/flipswitch.struct.css view on Meta::CPAN
}
.ui-loader {
display: none;
z-index: 9999999;
position: fixed;
top: 50%;
left: 50%;
border:0;
}
.ui-loader-default {
background: none;
filter: Alpha(Opacity=18);
opacity: .18;
width: 2.875em;
height: 2.875em;
margin-left: -1.4375em;
margin-top: -1.4375em;
}
.ui-loader-verbose {
width: 12.5em;
filter: Alpha(Opacity=88);
public/css/flipswitch.struct.css view on Meta::CPAN
width: 0;
height: 0;
overflow: hidden;
}
.ui-loader-verbose h1 {
font-size: 1em;
margin: 0;
text-align: center;
}
.ui-loader .ui-icon-loading {
background-color: #000;
display: block;
margin: 0;
width: 2.75em;
height: 2.75em;
padding: .0625em;
-webkit-border-radius: 2.25em;
border-radius: 2.25em;
}
.ui-loader-verbose .ui-icon-loading {
margin: 0 auto .625em;
public/css/flipswitch.struct.css view on Meta::CPAN
.ui-flipswitch {
display: inline-block;
vertical-align: middle;
width: 6.875em; /* Override this and padding-left in next rule if you use labels other than "on/off" and need more space */
height: 1.875em;
border-width: 1px;
border-style: solid;
margin: .5em 0;
overflow: hidden;
-webkit-transition-property: padding, width, background-color, color, border-color;
-moz-transition-property: padding, width, background-color, color, border-color;
-o-transition-property: padding, width, background-color, color, border-color;
transition-property: padding, width, background-color, color, border-color;
-webkit-transition-duration: 100ms;
-moz-transition-duration: 100ms;
-o-transition-duration: 100ms;
transition-duration: 100ms;
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
cursor: pointer;
public/js/core.js view on Meta::CPAN
$('div.ui-page-active .button').on('change', aux_action);
// main menu
$('div.ui-page-active .myMenu ul li').hover(function() {
$(this).children('ul').stop(true, false, true).slideToggle(300);
});
$.get('/get_config/devel', function(devel){
if (parseInt(devel) == '1'){
$('#time').css({'background-color': 'red'});
}
});
// draggable widgets
var s_positions = localStorage.positions || "{}";
var positions = $.parseJSON(s_positions);
$.each(positions, function (id, pos){
$('div.ui-page-active #'+ id).css(pos);
public/js/flot.js view on Meta::CPAN
*
* Version 1.1.
*
* Inspiration from jQuery color animation plugin by John Resig.
*
* Released under the MIT license by Ole Laursen, October 2009.
*
* Examples:
*
* $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString()
* var c = $.color.extract($("#mydiv"), 'background-color');
* console.log(c.r, c.g, c.b, c.a);
* $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)"
*
* Note that .scale() and .add() return the same modified object
* instead of making a new one.
*
* V. 1.1: Fix error handling so e.g. parsing an empty string does
* produce a color rather than just crashing.
*/
(function($){$.color={};$.color.make=function(r,g,b,a){var o={};o.r=r||0;o.g=g||0;o.b=b||0;o.a=a!=null?a:1;o.add=function(c,d){for(var i=0;i<c.length;++i)o[c.charAt(i)]+=d;return o.normalize()};o.scale=function(c,f){for(var i=0;i<c.length;++i)o[c.cha...
public/js/flot.js view on Meta::CPAN
// the color theme used for graphs
colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"],
legend: {
show: true,
noColumns: 1, // number of colums in legend table
labelFormatter: null, // fn: string -> string
labelBoxBorderColor: "#ccc", // border color for the little label boxes
container: null, // container (as jQuery object) to put legend in, null means default on top of graph
position: "ne", // position of default legend container within plot
margin: 5, // distance from grid edge to default legend container within plot
backgroundColor: null, // null means auto-detect
backgroundOpacity: 0.85, // set to 0 to avoid background
sorted: null // default to no legend sorting
},
xaxis: {
show: null, // null = auto-detect, true = always, false = never
position: "bottom", // or "top"
mode: null, // null or "time"
font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: "italic", weight: "bold", family: "sans-serif", variant: "small-caps" }
color: null, // base color, labels, ticks
tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)"
transform: null, // null or f: number -> number to transform axis
public/js/flot.js view on Meta::CPAN
horizontal: false,
zero: true
},
shadowSize: 3,
highlightColor: null
},
grid: {
show: true,
aboveData: false,
color: "#545454", // primary color used for outline and labels
backgroundColor: null, // null for transparent, else color
borderColor: null, // set if different from the grid color
tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)"
margin: 0, // distance from the canvas edge to the grid
labelMargin: 5, // in pixels
axisMargin: 8, // in pixels
borderWidth: 2, // in pixels
minBorderMargin: null, // in pixels, null means taken from points radius
markings: null, // array of ranges or fn: axes -> array of ranges
markingsColor: "#f4f4f4",
markingsLineWidth: 2,
public/js/flot.js view on Meta::CPAN
}
function draw() {
surface.clear();
executeHooks(hooks.drawBackground, [ctx]);
var grid = options.grid;
// draw background, if any
if (grid.show && grid.backgroundColor)
drawBackground();
if (grid.show && !grid.aboveData) {
drawGrid();
}
for (var i = 0; i < series.length; ++i) {
executeHooks(hooks.drawSeries, [ctx, series[i]]);
drawSeries(series[i]);
}
public/js/flot.js view on Meta::CPAN
to = tmp;
}
return { from: from, to: to, axis: axis };
}
function drawBackground() {
ctx.save();
ctx.translate(plotOffset.left, plotOffset.top);
ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)");
ctx.fillRect(0, 0, plotWidth, plotHeight);
ctx.restore();
}
function drawGrid() {
var i, axes, bw, bc;
ctx.save();
ctx.translate(plotOffset.left, plotOffset.top);
public/js/flot.js view on Meta::CPAN
m = [m, m];
if (p.charAt(0) == "n")
pos += 'top:' + (m[1] + plotOffset.top) + 'px;';
else if (p.charAt(0) == "s")
pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;';
if (p.charAt(1) == "e")
pos += 'right:' + (m[0] + plotOffset.right) + 'px;';
else if (p.charAt(1) == "w")
pos += 'left:' + (m[0] + plotOffset.left) + 'px;';
var legend = $('<div class="legend">' + table.replace('style="', 'style="position:absolute;' + pos +';') + '</div>').appendTo(placeholder);
if (options.legend.backgroundOpacity != 0.0) {
// put in the transparent background
// separately to avoid blended labels and
// label boxes
var c = options.legend.backgroundColor;
if (c == null) {
c = options.grid.backgroundColor;
if (c && typeof c == "string")
c = $.color.parse(c);
else
c = $.color.extract(legend, 'background-color');
c.a = 1;
c = c.toString();
}
var div = legend.children();
$('<div style="position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos +'background-color:' + c + ';"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity);
}
}
}
// interactive features
var highlights = [],
redrawTimeout = null;