diff --git a/assets/webconfig/content/connection_lost.html b/assets/webconfig/content/connection_lost.html
index fa883b28..f1114904 100644
--- a/assets/webconfig/content/connection_lost.html
+++ b/assets/webconfig/content/connection_lost.html
@@ -1,15 +1,22 @@
-
-
-
-
-
Connection to Hyperion Service lost!
-
-
+
+
+
+
+
Lost connection to Hyperion service!
+
+ Possible reasons:
+
1. Hyperion restarts
+
2. You perform an update
+
3. An older browser session
+
3. Hyperion isn't running
+
+
+
This page will be automatically refreshed.
+
We reconnect again after Hyperion is available.
+
If not, click me
+
+
diff --git a/assets/webconfig/css/hyperion.css b/assets/webconfig/css/hyperion.css
index 4c04f22a..051c8953 100644
--- a/assets/webconfig/css/hyperion.css
+++ b/assets/webconfig/css/hyperion.css
@@ -49,9 +49,21 @@ table.borderless td,table.borderless th{border: none !important;}
.introd{padding-left:14px;border-left:5px solid #0088cc;}
.introd h4{line-height:25px;}
-.overlay {
+/*backported bootstrap 4 forms-label alignment*/
+.col-form-label {
+ padding-top: .5rem;
+ padding-bottom: .5rem;
+ margin-bottom: 0;
+}
+
+.logoimg{
background-image: url('/img/hyperion/hyperionlogo.png');
background-repeat: no-repeat;
+}
+
+.overlay {
+ background-image: url('/img/hyperion/hyperionwhitelogo.png');
+ background-repeat: no-repeat;
background-position: center center;
background-color: rgba(1, 1, 1, 0.7);
position: fixed;
diff --git a/assets/webconfig/img/hyperion/hyperionwhitelogo.png b/assets/webconfig/img/hyperion/hyperionwhitelogo.png
new file mode 100644
index 00000000..65338f68
Binary files /dev/null and b/assets/webconfig/img/hyperion/hyperionwhitelogo.png differ
diff --git a/assets/webconfig/js/lib/jsoneditor.js b/assets/webconfig/js/lib/jsoneditor.js
index 8b81c0ff..6ddc4869 100755
--- a/assets/webconfig/js/lib/jsoneditor.js
+++ b/assets/webconfig/js/lib/jsoneditor.js
@@ -1938,6 +1938,7 @@ JSONEditor.defaults.editors.string = JSONEditor.AbstractEditor.extend({
var self = this, i;
if(!this.options.compact) this.header = this.label = this.theme.getFormInputLabel(this.getTitle());
if(this.schema.description) this.description = this.theme.getFormInputDescription(this.schema.description);
+ if(this.schema.append) this.append = this.theme.getFormInputAppend(this.schema.append);
this.format = this.schema.format;
if(!this.format && this.schema.media && this.schema.media.type) {
@@ -2122,7 +2123,7 @@ JSONEditor.defaults.editors.string = JSONEditor.AbstractEditor.extend({
if(this.format) this.input.setAttribute('data-schemaformat',this.format);
- this.control = this.theme.getFormControl(this.label, this.input, this.description);
+ this.control = this.theme.getFormControl(this.label, this.input, this.description, this.append);
this.container.appendChild(this.control);
// Any special formatting that needs to happen after the input is added to the dom
@@ -2716,6 +2717,12 @@ JSONEditor.defaults.editors.object = JSONEditor.AbstractEditor.extend({
this.description = this.theme.getDescription(this.schema.description);
this.container.appendChild(this.description);
}
+
+ // Appends
+ if(this.schema.append) {
+ this.append = this.theme.getAppend(this.schema.append);
+ this.container.appendChild(this.append);
+ }
// Validation error placeholder area
this.error_holder = document.createElement('div');
@@ -3313,6 +3320,10 @@ JSONEditor.defaults.editors.array = JSONEditor.AbstractEditor.extend({
if(this.schema.description) {
this.description = this.theme.getDescription(this.schema.description);
this.container.appendChild(this.description);
+ }
+ if(this.schema.append) {
+ this.append = this.theme.getAppend(this.schema.append);
+ this.container.appendChild(this.append);
}
this.error_holder = document.createElement('div');
this.container.appendChild(this.error_holder);
@@ -3988,6 +3999,10 @@ JSONEditor.defaults.editors.table = JSONEditor.defaults.editors.array.extend({
if(this.schema.description) {
this.description = this.theme.getDescription(this.schema.description);
this.container.appendChild(this.description);
+ }
+ if(this.schema.append) {
+ this.append = this.theme.getAppend(this.schema.append);
+ this.container.appendChild(this.append);
}
this.panel = this.theme.getIndentedPanel();
this.container.appendChild(this.panel);
@@ -4974,7 +4989,8 @@ JSONEditor.defaults.editors.select = JSONEditor.AbstractEditor.extend({
var self = this;
if(!this.options.compact) this.header = this.label = this.theme.getFormInputLabel(this.getTitle());
if(this.schema.description) this.description = this.theme.getFormInputDescription(this.schema.description);
-
+ if(this.schema.append) this.append = this.theme.getFormInputAppend(this.schema.append);
+
if(this.options.compact) this.container.className += ' compact';
this.input = this.theme.getSelectInput(this.enum_options);
@@ -5320,6 +5336,7 @@ JSONEditor.defaults.editors.selectize = JSONEditor.AbstractEditor.extend({
var self = this;
if(!this.options.compact) this.header = this.label = this.theme.getFormInputLabel(this.getTitle());
if(this.schema.description) this.description = this.theme.getFormInputDescription(this.schema.description);
+ if(this.schema.append) this.append = this.theme.getFormInputAppend(this.schema.append);
if(this.options.compact) this.container.className += ' compact';
@@ -5547,6 +5564,7 @@ JSONEditor.defaults.editors.multiselect = JSONEditor.AbstractEditor.extend({
var self = this, i;
if(!this.options.compact) this.header = this.label = this.theme.getFormInputLabel(this.getTitle());
if(this.schema.description) this.description = this.theme.getFormInputDescription(this.schema.description);
+ if(this.schema.append) this.append = this.theme.getFormInputAppend(this.schema.append);
if((!this.schema.format && this.option_keys.length < 8) || this.schema.format === "checkbox") {
this.input_type = 'checkboxes';
@@ -6025,6 +6043,9 @@ JSONEditor.defaults.editors.arraySelectize = JSONEditor.AbstractEditor.extend({
if(this.schema.description) {
this.description = this.theme.getDescription(this.schema.description);
}
+ if(this.schema.append) {
+ this.append = this.theme.getAppend(this.schema.append);
+ }
this.input = document.createElement('select');
this.input.setAttribute('multiple', 'multiple');
@@ -6307,6 +6328,11 @@ JSONEditor.AbstractTheme = Class.extend({
el.innerHTML = text;
return el;
},
+ getAppend: function(text) {
+ var el = document.createElement('p');
+ el.innerHTML = text;
+ return el;
+ },
getCheckboxDescription: function(text) {
return this.getDescription(text);
},
@@ -6518,7 +6544,13 @@ JSONEditor.defaults.themes.bootstrap2 = JSONEditor.AbstractTheme.extend({
el.textContent = text;
return el;
},
- getFormControl: function(label, input, description) {
+ getFormInputAppend: function(text) {
+ var el = document.createElement('div');
+ el.className = 'input-group-addon';
+ el.textContent = text;
+ return el;
+ },
+ getFormControl: function(label, input, description, append) {
var ret = document.createElement('div');
ret.className = 'control-group';
@@ -6676,26 +6708,35 @@ JSONEditor.defaults.themes.bootstrap3 = JSONEditor.AbstractTheme.extend({
}
return el;
},
- getFormControl: function(label, input, description) {
+ getFormControl: function(label, input, description, append) {
var group = document.createElement('div');
+ var subgroup = document.createElement('div');
- if(label && input.type === 'checkbox') {
- group.className += ' checkbox';
- label.appendChild(input);
- label.style.fontSize = '14px';
- group.style.marginTop = '0';
- group.appendChild(label);
- input.style.position = 'relative';
- input.style.cssFloat = 'left';
- }
+ if (append){
+ group.className += ' form-group';
+ if(label) {
+ label.className += ' col-form-label col-md-2';
+ group.appendChild(label);
+ }
+ group.appendChild(subgroup);
+ subgroup.className += 'col-md-10 input-group';
+ subgroup.appendChild(input);
+ subgroup.appendChild(append);
+ }
else {
group.className += ' form-group';
if(label) {
- label.className += ' control-label';
+ label.className += ' col-form-label col-md-2';
group.appendChild(label);
}
- group.appendChild(input);
- }
+ group.appendChild(subgroup);
+ subgroup.className += ' input-group col-md-10';
+ subgroup.appendChild(input);
+ if (input.type === 'checkbox'){
+ label.style.fontWeight = 'bold';
+ }
+ }
+
if(description) group.appendChild(description);
@@ -6713,6 +6754,12 @@ JSONEditor.defaults.themes.bootstrap3 = JSONEditor.AbstractTheme.extend({
el.innerHTML = text;
return el;
},
+ getFormInputAppend: function(text) {
+ var el = document.createElement('div');
+ el.className = 'input-group-addon';
+ el.textContent = text;
+ return el;
+ },
getHeaderButtonHolder: function() {
var el = this.getButtonHolder();
el.style.marginLeft = '10px';
diff --git a/libsrc/hyperion/hyperion.schema.json b/libsrc/hyperion/hyperion.schema.json
index e10ae6a4..21e60c81 100644
--- a/libsrc/hyperion/hyperion.schema.json
+++ b/libsrc/hyperion/hyperion.schema.json
@@ -30,6 +30,7 @@
"name" :
{
"type" : "string",
+ "title" : "Configuration name",
"required" : true,
"propertyOrder" : 1
},
@@ -48,6 +49,7 @@
"colorOrder" :
{
"type" : "string",
+ "title" : "RGB byte order",
"enum" : ["rgb", "bgr", "rbg", "brg", "gbr", "grb"],
"propertyOrder" : 3
}
@@ -397,6 +399,7 @@
"minimum" : 25,
"maximum": 600,
"default" : 200,
+ "append" : "ms",
"propertyOrder" : 3
},
"updateFrequency" :
@@ -406,6 +409,7 @@
"minimum" : 1.000,
"maximum" : 100.000,
"default" : 25.000,
+ "append" : "Hz",
"propertyOrder" : 4
},
"updateDelay" :
@@ -415,6 +419,7 @@
"minimum" : 0,
"maximum": 2048,
"default" : 0,
+ "append" : "ms",
"propertyOrder" : 5
},
"continuousOutput" :
@@ -430,9 +435,11 @@
"grabber-v4l2" :
{
"type":"array",
+ "title" : "USB Grabber",
"items":
{
"type" : "object",
+ "title" : "USB Grabber",
"properties" :
{
"enable" :
@@ -469,6 +476,7 @@
"type" : "integer",
"title" : "Width",
"default" : -1,
+ "append" : "Pixel",
"propertyOrder" : 5
},
"height" :
@@ -476,6 +484,7 @@
"type" : "integer",
"title" : "Height",
"default" : -1,
+ "append" : "Pixel",
"propertyOrder" : 6
},
"frameDecimation" :
@@ -520,6 +529,7 @@
"title" : "Crop left",
"minimum" : 0,
"default" : 0,
+ "append" : "Pixel",
"propertyOrder" : 12
},
"cropRight" :
@@ -528,6 +538,7 @@
"title" : "Crop right",
"minimum" : 0,
"default" : 0,
+ "append" : "Pixel",
"propertyOrder" : 13
},
"cropTop" :
@@ -536,6 +547,7 @@
"title" : "Crop top",
"minimum" : 0,
"default" : 0,
+ "append" : "Pixel",
"propertyOrder" : 14
},
"cropBottom" :
@@ -544,6 +556,7 @@
"title" : "Crop bottom",
"minimum" : 0,
"default" : 0,
+ "append" : "Pixel",
"propertyOrder" : 15
},
"redSignalThreshold" :
@@ -553,6 +566,7 @@
"minimum" : 0.0,
"maximum" : 1.0,
"default" : 0.1,
+ "append" : "%",
"propertyOrder" : 16
},
"greenSignalThreshold" :
@@ -562,6 +576,7 @@
"minimum" : 0.0,
"maximum" : 1.0,
"default" : 0.1,
+ "append" : "%",
"propertyOrder" : 17
},
"blueSignalThreshold" :
@@ -571,6 +586,7 @@
"minimum" : 0.0,
"maximum" : 1.0,
"default" : 0.1,
+ "append" : "%",
"propertyOrder" : 18
}
},
@@ -601,20 +617,23 @@
{
"type" : "integer",
"title" : "Width",
- "default" : 96
+ "default" : 96,
+ "append" : "Pixel"
},
"height" :
{
"type" : "integer",
"title" : "Height",
- "default" : 96
+ "default" : 96,
+ "append" : "Pixel"
},
"frequency_Hz" :
{
"type" : "integer",
"title" : "Frequency",
"minimum" : 0,
- "default" : 10
+ "default" : 10,
+ "append" : "Hz"
},
"priority" :
{
@@ -628,28 +647,32 @@
"type" : "integer",
"title" : "Crop left",
"minimum" : 0,
- "default" : 0
+ "default" : 0,
+ "append" : "Pixel"
},
"cropRight" :
{
"type" : "integer",
"title" : "Crop right",
"minimum" : 0,
- "default" : 0
+ "default" : 0,
+ "append" : "Pixel"
},
"cropTop" :
{
"type" : "integer",
"title" : "Crop top",
"minimum" : 0,
- "default" : 0
+ "default" : 0,
+ "append" : "Pixel"
},
"cropBottom" :
{
"type" : "integer",
"title" : "Crop bottom",
"minimum" : 0,
- "default" : 0
+ "default" : 0,
+ "append" : "Pixel"
},
"useXGetImage" :
{
@@ -707,6 +730,7 @@
"minimum" : 0.0,
"maximum" : 1.0,
"default" : 0.05,
+ "append" : "%",
"propertyOrder" : 2
},
"unknownFrameCnt" :
diff --git a/libsrc/leddevice/schemas/schema-adalight.json b/libsrc/leddevice/schemas/schema-adalight.json
index 4755a475..8dacc228 100644
--- a/libsrc/leddevice/schemas/schema-adalight.json
+++ b/libsrc/leddevice/schemas/schema-adalight.json
@@ -17,6 +17,7 @@
"type": "integer",
"title":"Delay after connect",
"default": 250,
+ "append" : "ms",
"propertyOrder" : 3
}
},
diff --git a/libsrc/leddevice/schemas/schema-adalightapa102.json b/libsrc/leddevice/schemas/schema-adalightapa102.json
index 4755a475..8dacc228 100644
--- a/libsrc/leddevice/schemas/schema-adalightapa102.json
+++ b/libsrc/leddevice/schemas/schema-adalightapa102.json
@@ -17,6 +17,7 @@
"type": "integer",
"title":"Delay after connect",
"default": 250,
+ "append" : "ms",
"propertyOrder" : 3
}
},
diff --git a/libsrc/leddevice/schemas/schema-atmo.json b/libsrc/leddevice/schemas/schema-atmo.json
index 4755a475..8dacc228 100644
--- a/libsrc/leddevice/schemas/schema-atmo.json
+++ b/libsrc/leddevice/schemas/schema-atmo.json
@@ -17,6 +17,7 @@
"type": "integer",
"title":"Delay after connect",
"default": 250,
+ "append" : "ms",
"propertyOrder" : 3
}
},
diff --git a/libsrc/leddevice/schemas/schema-philipshue.json b/libsrc/leddevice/schemas/schema-philipshue.json
index 8c48bafa..8b338e59 100644
--- a/libsrc/leddevice/schemas/schema-philipshue.json
+++ b/libsrc/leddevice/schemas/schema-philipshue.json
@@ -23,8 +23,9 @@
},
"transitiontime": {
"type": "integer",
- "title":"Transistion time (x100ms)",
+ "title":"Transistion time",
"default" : 1,
+ "append" : "x100ms",
"propertyOrder" : 4
},
"switchOffOnBlack": {