2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-03 16:56:54 +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:
rudolfkoenig 2014-05-03 14:20:42 +00:00
parent a4f6d09e85
commit 4783a85d27
4 changed files with 119 additions and 41 deletions

View File

@ -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&uuml;r Dummy Ger&auml;te). Wenn <b>dort</b> bekannte Modifier sind, f&uuml;r Dummy Ger&auml;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&uuml;r das anzuzeigende Ger&auml;t,
nicht f&uuml;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&ouml;glich, das Ergebnis ist Komma-separiert.</li> Mehrfachauswahl ist m&ouml;glich, das Ergebnis ist
Komma-separiert.</li>
<li>In allen anderen F&auml;llen erscheint ein Dropdown mit allen <li>In allen anderen F&auml;llen erscheint ein Dropdown mit allen
Modifier Werten.</li> Modifier Werten.</li>
</ul> </ul>
Falls das Attribut f&uuml;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&auml;ten angewendet.
Beispiele f&uuml;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&uuml;r das anzuzeigende Ger&auml;t,
nicht f&uuml;r die FHEMWEBInstanz.
</li><br> </li><br>
<a name="column"></a> <a name="column"></a>

View File

@ -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 */

View File

@ -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];

View File

@ -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
}; };