From 4783a85d27d9c099561b3fea63ffa188fbd945cd Mon Sep 17 00:00:00 2001 From: rudolfkoenig <> Date: Sat, 3 May 2014 14:20:42 +0000 Subject: [PATCH] FHEMWEB: widgetOverride attribtue added git-svn-id: https://svn.fhem.de/fhem/trunk@5734 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/01_FHEMWEB.pm | 121 +++++++++++++++++++++-------- fhem/www/pgm2/defaultCommon.css | 6 +- fhem/www/pgm2/fhemweb.js | 7 +- fhem/www/pgm2/fhemweb_textField.js | 26 ++++++- 4 files changed, 119 insertions(+), 41 deletions(-) diff --git a/fhem/FHEM/01_FHEMWEB.pm b/fhem/FHEM/01_FHEMWEB.pm index 13b147c81..f08e877c7 100755 --- a/fhem/FHEM/01_FHEMWEB.pm +++ b/fhem/FHEM/01_FHEMWEB.pm @@ -44,6 +44,7 @@ sub FW_textfield($$$); sub FW_textfieldv($$$$); sub FW_updateHashes(); sub FW_visibleDevices(;$); +sub FW_widgetOverride($$); use vars qw($FW_dir); # base directory for web server use vars qw($FW_icondir); # icon base directory @@ -161,7 +162,7 @@ FHEMWEB_Initialize($) ############### # Initialize internal structures map { addToAttrList($_) } ( "webCmd", "icon", "devStateIcon", - "sortby", "devStateStyle"); + "widgetOverride", "sortby", "devStateStyle"); InternalTimer(time()+60, "FW_closeOldClients", 0, 0); $FW_dir = "$attr{global}{modpath}/www"; @@ -941,8 +942,8 @@ FW_doDetail($) FW_pO "
"; FW_pO FW_hidden("detail", $d); - FW_makeSelect($d, "set", getAllSets($d), "set"); - FW_makeSelect($d, "get", getAllGets($d), "get"); + FW_makeSelect($d, "set", FW_widgetOverride($d, getAllSets($d)), "set"); + FW_makeSelect($d, "get", FW_widgetOverride($d, getAllGets($d)), "get"); FW_makeTable("Internals", $d, $h); FW_makeTable("Readings", $d, $h->{READINGS}); @@ -951,6 +952,7 @@ FW_doDetail($) my $roomList = "multiple,".join(",", sort map { $_ =~ s/ /#/g ;$_} keys %FW_rooms); $attrList =~ s/room /room:$roomList /; + $attrList = FW_widgetOverride($d, $attrList); FW_makeSelect($d, "attr", $attrList,"attr"); FW_makeTable("Attributes", $d, $attr{$d}, "deleteattr"); @@ -1258,6 +1260,7 @@ FW_showRoom() $row++; my ($allSets, $cmdlist, $txt) = FW_devState($d, $rf, \%extPage); + $allSets = FW_widgetOverride($d, $allSets); my $colSpan = ($usuallyAtEnd{$d} ? ' colspan="2"' : ''); FW_pO "$txt"; @@ -2495,6 +2498,28 @@ FW_ActivateInform() $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; =pod @@ -2935,7 +2960,30 @@ FW_ActivateInform() The first specified command is looked up in the "set device ?" list (see the setList attribute for dummy devices). If there 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: + + If the command is state, then the value will be used as a command.
+ Note: this is an attribute for the displayed device, not for the FHEMWEB + instance. + +
+ + + +
  • widgetOverride
    + Space spearate list of name:modifier pairs, to override the widget + for a set/get/attribute specified by the module author. - If the command is state, then the value will be used as a command.
    - Examples for the modifier: + If this attribute is specified for a FHEMWEB instance, then it is + applied to all devices shown. Examples: - Note: this is an attribute for the displayed device, not for the FHEMWEB - instance.

  • @@ -3442,7 +3481,30 @@ FW_ActivateInform() Der erste angegebene Befehl wird in der "set device ?" list nachgeschlagen (Siehe das setList Attrib für Dummy Geräte). Wenn dort bekannte Modifier sind, - wird ein anderes Widget angezeigt: + wird ein anderes Widget angezeigt. Siehe auch widgetOverride.
    + Wenn der Befehl state ist, wird der Wert als Kommando interpretiert.
    + Beispiele: + + Anmerkung: dies ist ein Attribut für das anzuzeigende Gerät, + nicht für die FHEMWEBInstanz. +
    + + + +
  • widgetOverride
    + Leerzeichen separierte Liste von Name/Modifier Paaren, mit dem man den + vom Modulautor fuer einen bestimmten Parameter (Set/Get/Attribut) + vorgesehene Widgets aendern kann. - - Wenn der Befehl state ist, wird der Wert als Kommando interpretiert.
    - Beispiele für modifier: + Falls das Attribut für eine WEB Instanz gesetzt wurde, dann wird + es bei allen von diesem Web-Instan angezeigten Geräten angewendet. + Beispiele: - - Anmerkung: dies ist ein Attribut für das anzuzeigende Gerät, - nicht für die FHEMWEBInstanz.

  • diff --git a/fhem/www/pgm2/defaultCommon.css b/fhem/www/pgm2/defaultCommon.css index cf513bd27..bb0666778 100644 --- a/fhem/www/pgm2/defaultCommon.css +++ b/fhem/www/pgm2/defaultCommon.css @@ -20,7 +20,8 @@ table { border-radius:8px; } table.room { border:1px solid gray; width: 100%; background: #D7FFFF; } table.room tr.sel { background: #A0FFFF; } tr.column td { padding:0; vertical-align:top;} - +.changed { color:red; } +.col2 { text-align:center; } /* Documentation */ 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; } button.dist { margin:10px; background:transparent; border:0px; cursor:pointer; } div.block { border:1px solid gray; background: #F8F8E0; padding:0.7em; } -.changed { color:red; } -.col2 { text-align:center; } +#right { position:absolute; top:20px; left:180px; } /* Widgets */ diff --git a/fhem/www/pgm2/fhemweb.js b/fhem/www/pgm2/fhemweb.js index 9e1d6c1dc..3baff83d0 100644 --- a/fhem/www/pgm2/fhemweb.js +++ b/fhem/www/pgm2/fhemweb.js @@ -187,16 +187,17 @@ FW_delayedStart() function FW_selChange(sel, list, elName) { - var value; + var cmd, value; var l = list.split(" "); for(var i=0; i < l.length; i++) { cmd = l[i]; - var off = l[i].indexOf(":"); + var off = cmd.indexOf(":"); if(off >= 0) - cmd = l[i].substring(0, off); + cmd = cmd.substring(0, off); if(cmd == sel) { if(off >= 0) value = l[i].substring(off+1); + break; } } var el = document.getElementsByName(elName)[0]; diff --git a/fhem/www/pgm2/fhemweb_textField.js b/fhem/www/pgm2/fhemweb_textField.js index 291d2f25b..4682176e7 100644 --- a/fhem/www/pgm2/fhemweb_textField.js +++ b/fhem/www/pgm2/fhemweb_textField.js @@ -7,6 +7,29 @@ FW_textFieldUpdateLine(d) 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 textField_setText(el,cmd) { @@ -17,5 +40,6 @@ textField_setText(el,cmd) } FW_widgets['textField'] = { - updateLine:FW_textFieldUpdateLine + updateLine:FW_textFieldUpdateLine, + selChange:FW_textFieldSelChange };