mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-03 10:46:53 +00:00
FHEMWEB: widgetOverride attribtue added
git-svn-id: https://svn.fhem.de/fhem/trunk@5734 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
a4f6d09e85
commit
4783a85d27
@ -44,6 +44,7 @@ sub FW_textfield($$$);
|
|||||||
sub FW_textfieldv($$$$);
|
sub FW_textfieldv($$$$);
|
||||||
sub FW_updateHashes();
|
sub FW_updateHashes();
|
||||||
sub FW_visibleDevices(;$);
|
sub FW_visibleDevices(;$);
|
||||||
|
sub FW_widgetOverride($$);
|
||||||
|
|
||||||
use vars qw($FW_dir); # base directory for web server
|
use vars qw($FW_dir); # base directory for web server
|
||||||
use vars qw($FW_icondir); # icon base directory
|
use vars qw($FW_icondir); # icon base directory
|
||||||
@ -161,7 +162,7 @@ FHEMWEB_Initialize($)
|
|||||||
###############
|
###############
|
||||||
# Initialize internal structures
|
# Initialize internal structures
|
||||||
map { addToAttrList($_) } ( "webCmd", "icon", "devStateIcon",
|
map { addToAttrList($_) } ( "webCmd", "icon", "devStateIcon",
|
||||||
"sortby", "devStateStyle");
|
"widgetOverride", "sortby", "devStateStyle");
|
||||||
InternalTimer(time()+60, "FW_closeOldClients", 0, 0);
|
InternalTimer(time()+60, "FW_closeOldClients", 0, 0);
|
||||||
|
|
||||||
$FW_dir = "$attr{global}{modpath}/www";
|
$FW_dir = "$attr{global}{modpath}/www";
|
||||||
@ -941,8 +942,8 @@ FW_doDetail($)
|
|||||||
FW_pO "<form method=\"$FW_formmethod\" action=\"$FW_ME\">";
|
FW_pO "<form method=\"$FW_formmethod\" action=\"$FW_ME\">";
|
||||||
FW_pO FW_hidden("detail", $d);
|
FW_pO FW_hidden("detail", $d);
|
||||||
|
|
||||||
FW_makeSelect($d, "set", getAllSets($d), "set");
|
FW_makeSelect($d, "set", FW_widgetOverride($d, getAllSets($d)), "set");
|
||||||
FW_makeSelect($d, "get", getAllGets($d), "get");
|
FW_makeSelect($d, "get", FW_widgetOverride($d, getAllGets($d)), "get");
|
||||||
|
|
||||||
FW_makeTable("Internals", $d, $h);
|
FW_makeTable("Internals", $d, $h);
|
||||||
FW_makeTable("Readings", $d, $h->{READINGS});
|
FW_makeTable("Readings", $d, $h->{READINGS});
|
||||||
@ -951,6 +952,7 @@ FW_doDetail($)
|
|||||||
my $roomList = "multiple,".join(",",
|
my $roomList = "multiple,".join(",",
|
||||||
sort map { $_ =~ s/ /#/g ;$_} keys %FW_rooms);
|
sort map { $_ =~ s/ /#/g ;$_} keys %FW_rooms);
|
||||||
$attrList =~ s/room /room:$roomList /;
|
$attrList =~ s/room /room:$roomList /;
|
||||||
|
$attrList = FW_widgetOverride($d, $attrList);
|
||||||
FW_makeSelect($d, "attr", $attrList,"attr");
|
FW_makeSelect($d, "attr", $attrList,"attr");
|
||||||
|
|
||||||
FW_makeTable("Attributes", $d, $attr{$d}, "deleteattr");
|
FW_makeTable("Attributes", $d, $attr{$d}, "deleteattr");
|
||||||
@ -1258,6 +1260,7 @@ FW_showRoom()
|
|||||||
$row++;
|
$row++;
|
||||||
|
|
||||||
my ($allSets, $cmdlist, $txt) = FW_devState($d, $rf, \%extPage);
|
my ($allSets, $cmdlist, $txt) = FW_devState($d, $rf, \%extPage);
|
||||||
|
$allSets = FW_widgetOverride($d, $allSets);
|
||||||
|
|
||||||
my $colSpan = ($usuallyAtEnd{$d} ? ' colspan="2"' : '');
|
my $colSpan = ($usuallyAtEnd{$d} ? ' colspan="2"' : '');
|
||||||
FW_pO "<td informId=\"$d\"$colSpan>$txt</td>";
|
FW_pO "<td informId=\"$d\"$colSpan>$txt</td>";
|
||||||
@ -2495,6 +2498,28 @@ FW_ActivateInform()
|
|||||||
$FW_activateInform = 1;
|
$FW_activateInform = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub
|
||||||
|
FW_widgetOverride($$)
|
||||||
|
{
|
||||||
|
my ($d, $str) = @_;
|
||||||
|
|
||||||
|
return $str if(!$str);
|
||||||
|
|
||||||
|
my $da = AttrVal($d, "widgetOverride", "");
|
||||||
|
my $fa = AttrVal($FW_wname, "widgetOverride", "");
|
||||||
|
return $str if(!$da && !$fa);
|
||||||
|
|
||||||
|
my @list;
|
||||||
|
push @list, split(" ", $fa) if($fa);
|
||||||
|
push @list, split(" ", $da) if($da);
|
||||||
|
foreach my $na (@list) {
|
||||||
|
my ($n,$a) = split(":", $na);
|
||||||
|
$str =~ s/\b($n)\b(:[^ ]*)?/$1:$a/g;
|
||||||
|
}
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
@ -2935,7 +2960,30 @@ FW_ActivateInform()
|
|||||||
The first specified command is looked up in the "set device ?" list
|
The first specified command is looked up in the "set device ?" list
|
||||||
(see the <a href="#setList">setList</a> attribute for dummy devices).
|
(see the <a href="#setList">setList</a> attribute for dummy devices).
|
||||||
If <b>there</b> it contains some known modifiers (colon, followed
|
If <b>there</b> it contains some known modifiers (colon, followed
|
||||||
by a comma separated list), then a different widget will be displayed:
|
by a comma separated list), then a different widget will be displayed.
|
||||||
|
See also the widgetOverride attribute below. Examples:
|
||||||
|
<ul>
|
||||||
|
define d1 dummy<br>
|
||||||
|
attr d1 webCmd state<br>
|
||||||
|
attr d1 setList state:on,off<br>
|
||||||
|
define d2 dummy<br>
|
||||||
|
attr d2 webCmd state<br>
|
||||||
|
attr d2 setList state:slider,0,1,10<br>
|
||||||
|
define d3 dummy<br>
|
||||||
|
attr d3 webCmd state<br>
|
||||||
|
attr d3 setList state:time<br>
|
||||||
|
</ul>
|
||||||
|
If the command is state, then the value will be used as a command.<br>
|
||||||
|
Note: this is an attribute for the displayed device, not for the FHEMWEB
|
||||||
|
instance.
|
||||||
|
</li>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
|
||||||
|
<a name="widgetOverride"></a>
|
||||||
|
<li>widgetOverride<br>
|
||||||
|
Space spearate list of name:modifier pairs, to override the widget
|
||||||
|
for a set/get/attribute specified by the module author.
|
||||||
<ul>
|
<ul>
|
||||||
<li>if the modifier is ":noArg", then no further input field is
|
<li>if the modifier is ":noArg", then no further input field is
|
||||||
displayed </li>
|
displayed </li>
|
||||||
@ -2949,21 +2997,12 @@ FW_ActivateInform()
|
|||||||
multiple values can be selected, the result is comma separated.</li>
|
multiple values can be selected, the result is comma separated.</li>
|
||||||
<li>else a dropdown with all the modifier values is displayed</li>
|
<li>else a dropdown with all the modifier values is displayed</li>
|
||||||
</ul>
|
</ul>
|
||||||
If the command is state, then the value will be used as a command.<br>
|
If this attribute is specified for a FHEMWEB instance, then it is
|
||||||
Examples for the modifier:
|
applied to all devices shown. Examples:
|
||||||
<ul>
|
<ul>
|
||||||
define d1 dummy<br>
|
attr FS20dev widgetOverride on-till:time<br>
|
||||||
attr d1 webCmd state<br>
|
attr WEB room:textField<br>
|
||||||
attr d1 setList state:on,off<br>
|
|
||||||
define d2 dummy<br>
|
|
||||||
attr d2 webCmd state<br>
|
|
||||||
attr d2 setList state:slider,0,1,10<br>
|
|
||||||
define d3 dummy<br>
|
|
||||||
attr d3 webCmd state<br>
|
|
||||||
attr d3 setList state:time<br>
|
|
||||||
</ul>
|
</ul>
|
||||||
Note: this is an attribute for the displayed device, not for the FHEMWEB
|
|
||||||
instance.
|
|
||||||
</li>
|
</li>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
@ -3442,7 +3481,30 @@ FW_ActivateInform()
|
|||||||
Der erste angegebene Befehl wird in der "set device ?" list
|
Der erste angegebene Befehl wird in der "set device ?" list
|
||||||
nachgeschlagen (Siehe das <a href="#setList">setList</a> Attrib
|
nachgeschlagen (Siehe das <a href="#setList">setList</a> Attrib
|
||||||
für Dummy Geräte). Wenn <b>dort</b> bekannte Modifier sind,
|
für Dummy Geräte). Wenn <b>dort</b> bekannte Modifier sind,
|
||||||
wird ein anderes Widget angezeigt:
|
wird ein anderes Widget angezeigt. Siehe auch widgetOverride.<br>
|
||||||
|
Wenn der Befehl state ist, wird der Wert als Kommando interpretiert.<br>
|
||||||
|
Beispiele:
|
||||||
|
<ul>
|
||||||
|
define d1 dummy<br>
|
||||||
|
attr d1 webCmd state<br>
|
||||||
|
attr d1 setList state:on,off<br>
|
||||||
|
define d2 dummy<br>
|
||||||
|
attr d2 webCmd state<br>
|
||||||
|
attr d2 setList state:slider,0,1,10<br>
|
||||||
|
define d3 dummy<br>
|
||||||
|
attr d3 webCmd state<br>
|
||||||
|
attr d3 setList state:time<br>
|
||||||
|
</ul>
|
||||||
|
Anmerkung: dies ist ein Attribut für das anzuzeigende Gerät,
|
||||||
|
nicht für die FHEMWEBInstanz.
|
||||||
|
</li><br>
|
||||||
|
|
||||||
|
|
||||||
|
<a name="widgetOverride"></a>
|
||||||
|
<li>widgetOverride<br>
|
||||||
|
Leerzeichen separierte Liste von Name/Modifier Paaren, mit dem man den
|
||||||
|
vom Modulautor fuer einen bestimmten Parameter (Set/Get/Attribut)
|
||||||
|
vorgesehene Widgets aendern kann.
|
||||||
<ul>
|
<ul>
|
||||||
<li>Ist der Modifier ":noArg", wird kein weiteres Eingabefeld
|
<li>Ist der Modifier ":noArg", wird kein weiteres Eingabefeld
|
||||||
angezeigt.</li>
|
angezeigt.</li>
|
||||||
@ -3458,28 +3520,19 @@ FW_ActivateInform()
|
|||||||
JavaScript programmierter Slider angezeigt</li>
|
JavaScript programmierter Slider angezeigt</li>
|
||||||
|
|
||||||
<li>Ist der Modifier ":multiple,val1,val2,...", dann ein
|
<li>Ist der Modifier ":multiple,val1,val2,...", dann ein
|
||||||
Mehrfachauswahl ist möglich, das Ergebnis ist Komma-separiert.</li>
|
Mehrfachauswahl ist möglich, das Ergebnis ist
|
||||||
|
Komma-separiert.</li>
|
||||||
|
|
||||||
<li>In allen anderen Fällen erscheint ein Dropdown mit allen
|
<li>In allen anderen Fällen erscheint ein Dropdown mit allen
|
||||||
Modifier Werten.</li>
|
Modifier Werten.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
Falls das Attribut für eine WEB Instanz gesetzt wurde, dann wird
|
||||||
Wenn der Befehl state ist, wird der Wert als Kommando interpretiert.<br>
|
es bei allen von diesem Web-Instan angezeigten Geräten angewendet.
|
||||||
Beispiele für modifier:
|
Beispiele:
|
||||||
<ul>
|
<ul>
|
||||||
define d1 dummy<br>
|
attr FS20dev widgetOverride on-till:time<br>
|
||||||
attr d1 webCmd state<br>
|
attr WEB room:textField<br>
|
||||||
attr d1 setList state:on,off<br>
|
|
||||||
define d2 dummy<br>
|
|
||||||
attr d2 webCmd state<br>
|
|
||||||
attr d2 setList state:slider,0,1,10<br>
|
|
||||||
define d3 dummy<br>
|
|
||||||
attr d3 webCmd state<br>
|
|
||||||
attr d3 setList state:time<br>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
Anmerkung: dies ist ein Attribut für das anzuzeigende Gerät,
|
|
||||||
nicht für die FHEMWEBInstanz.
|
|
||||||
</li><br>
|
</li><br>
|
||||||
|
|
||||||
<a name="column"></a>
|
<a name="column"></a>
|
||||||
|
@ -20,7 +20,8 @@ table { border-radius:8px; }
|
|||||||
table.room { border:1px solid gray; width: 100%; background: #D7FFFF; }
|
table.room { border:1px solid gray; width: 100%; background: #D7FFFF; }
|
||||||
table.room tr.sel { background: #A0FFFF; }
|
table.room tr.sel { background: #A0FFFF; }
|
||||||
tr.column td { padding:0; vertical-align:top;}
|
tr.column td { padding:0; vertical-align:top;}
|
||||||
|
.changed { color:red; }
|
||||||
|
.col2 { text-align:center; }
|
||||||
|
|
||||||
/* Documentation */
|
/* Documentation */
|
||||||
h2,h3,h4 { color:#52865D; line-height:1.3;
|
h2,h3,h4 { color:#52865D; line-height:1.3;
|
||||||
@ -28,8 +29,7 @@ h2,h3,h4 { color:#52865D; line-height:1.3;
|
|||||||
div.dist { padding-top:0.3em; }
|
div.dist { padding-top:0.3em; }
|
||||||
button.dist { margin:10px; background:transparent; border:0px; cursor:pointer; }
|
button.dist { margin:10px; background:transparent; border:0px; cursor:pointer; }
|
||||||
div.block { border:1px solid gray; background: #F8F8E0; padding:0.7em; }
|
div.block { border:1px solid gray; background: #F8F8E0; padding:0.7em; }
|
||||||
.changed { color:red; }
|
#right { position:absolute; top:20px; left:180px; }
|
||||||
.col2 { text-align:center; }
|
|
||||||
|
|
||||||
|
|
||||||
/* Widgets */
|
/* Widgets */
|
||||||
|
@ -187,16 +187,17 @@ FW_delayedStart()
|
|||||||
function
|
function
|
||||||
FW_selChange(sel, list, elName)
|
FW_selChange(sel, list, elName)
|
||||||
{
|
{
|
||||||
var value;
|
var cmd, value;
|
||||||
var l = list.split(" ");
|
var l = list.split(" ");
|
||||||
for(var i=0; i < l.length; i++) {
|
for(var i=0; i < l.length; i++) {
|
||||||
cmd = l[i];
|
cmd = l[i];
|
||||||
var off = l[i].indexOf(":");
|
var off = cmd.indexOf(":");
|
||||||
if(off >= 0)
|
if(off >= 0)
|
||||||
cmd = l[i].substring(0, off);
|
cmd = cmd.substring(0, off);
|
||||||
if(cmd == sel) {
|
if(cmd == sel) {
|
||||||
if(off >= 0)
|
if(off >= 0)
|
||||||
value = l[i].substring(off+1);
|
value = l[i].substring(off+1);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var el = document.getElementsByName(elName)[0];
|
var el = document.getElementsByName(elName)[0];
|
||||||
|
@ -7,6 +7,29 @@ FW_textFieldUpdateLine(d)
|
|||||||
el.value = d[1];
|
el.value = d[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function
|
||||||
|
FW_textFieldSelChange(name, devName, vArr)
|
||||||
|
{
|
||||||
|
if(vArr.length != 1 || vArr[0] != "textField")
|
||||||
|
return undefined;
|
||||||
|
|
||||||
|
var o = new Object();
|
||||||
|
o.newEl = document.createElement('input');
|
||||||
|
o.newEl.type='text';
|
||||||
|
o.newEl.size=30;
|
||||||
|
o.qFn = 'FW_textFieldSetSelected(qArg, "%")';
|
||||||
|
o.qArg = o.newEl;
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
function
|
||||||
|
FW_textFieldSetSelected(el, val)
|
||||||
|
{
|
||||||
|
if(typeof el == 'string')
|
||||||
|
el = document.getElementById(el);
|
||||||
|
el.value=val;
|
||||||
|
}
|
||||||
|
|
||||||
function
|
function
|
||||||
textField_setText(el,cmd)
|
textField_setText(el,cmd)
|
||||||
{
|
{
|
||||||
@ -17,5 +40,6 @@ textField_setText(el,cmd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
FW_widgets['textField'] = {
|
FW_widgets['textField'] = {
|
||||||
updateLine:FW_textFieldUpdateLine
|
updateLine:FW_textFieldUpdateLine,
|
||||||
|
selChange:FW_textFieldSelChange
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user