From bd6d8388af9cfd22b972a07b01d142e2af731d6c Mon Sep 17 00:00:00 2001 From: rudolfkoenig <> Date: Mon, 16 Apr 2012 13:41:00 +0000 Subject: [PATCH] Some attribute values are selectable via dropdown git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@1458 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- webfrontend/pgm2/01_FHEMWEB.pm | 54 ++++++++++------------- webfrontend/pgm2/fhemweb.js | 78 ++++++++++++++++++++++++++++++++++ webfrontend/pgm2/longpoll.js | 51 ---------------------- 3 files changed, 100 insertions(+), 83 deletions(-) create mode 100644 webfrontend/pgm2/fhemweb.js delete mode 100644 webfrontend/pgm2/longpoll.js diff --git a/webfrontend/pgm2/01_FHEMWEB.pm b/webfrontend/pgm2/01_FHEMWEB.pm index cc9e9f816..9c2bab0be 100755 --- a/webfrontend/pgm2/01_FHEMWEB.pm +++ b/webfrontend/pgm2/01_FHEMWEB.pm @@ -21,7 +21,7 @@ sub FW_makeEdit($$$); sub FW_makeTable($$@); sub FW_ReadIcons(); sub FW_roomOverview($); -sub FW_select($$$$); +sub FW_select($$$$@); sub FW_showLog($); sub FW_showRoom(); sub FW_showWeblink($$$$); @@ -396,23 +396,13 @@ FW_AnswerCall($) $FW_tp ? "640,160" : "800,160"); ############################## # Axels FHEMWEB modules... - my $fwextPtr; if(defined($data{FWEXT})) { foreach my $k (sort keys %{$data{FWEXT}}) { if($arg =~ m/^$k/) { - - if($data{FWEXT}{$k}{EMBEDDED}) { - $fwextPtr = $data{FWEXT}{$k}; - last; - - } else { - no strict "refs"; - ($FW_RETTYPE, $FW_RET) = &{$data{FWEXT}{$k}{FUNC}}($arg); - use strict "refs"; - return 0; - - } - + no strict "refs"; + ($FW_RETTYPE, $FW_RET) = &{$data{FWEXT}{$k}{FUNC}}($arg); + use strict "refs"; + return 0; } } } @@ -497,7 +487,6 @@ FW_AnswerCall($) if($FW_tp || $FW_ss) { FW_pO ''; FW_pO ''; - #FW_pO '' if($FW_ss) { FW_pO ''; } elsif($FW_tp) { @@ -511,15 +500,11 @@ FW_AnswerCall($) $prf = "smallscreen" if(!$prf && $FW_ss); $prf = "touchpad" if(!$prf && $FW_tp); FW_pO ""; - FW_pO "{STYLESHEET}\" rel=\"stylesheet\"/>" - if($fwextPtr && $fwextPtr->{STYLESHEET}); FW_pO "" if($FW_plotmode eq "SVG"); - FW_pO "" - if($FW_longpoll); - FW_pO "" - if($fwextPtr && $fwextPtr->{JAVASCRIPT}); - FW_pO "\n"; + FW_pO ""; + my $onload = $FW_longpoll ? "onload=\"FW_delayedStart()\"" : ""; + FW_pO "\n"; if($FW_cmdret) { $FW_detail = ""; @@ -538,8 +523,7 @@ FW_AnswerCall($) } FW_roomOverview($cmd); - if($fwextPtr) { &{$fwextPtr->{FUNC}}($arg); } - elsif($cmd =~ m/^style /) { FW_style($cmd,undef); } + if($cmd =~ m/^style /) { FW_style($cmd,undef); } elsif($FW_detail) { FW_doDetail($FW_detail); } elsif($FW_room) { FW_showRoom(); } elsif($cmd =~ /^logwrapper/) { FW_logWrapper($cmd); } @@ -681,13 +665,14 @@ FW_makeSelect($$$$) { my ($d, $cmd, $list,$class) = @_; return if(!$list || $FW_hiddenroom{input}); - my @al = sort map { s/[:;].*//;$_ } split(" ", $list); + my @al = sort map { s/:.*//;$_ } split(" ", $list); FW_pO "
"; FW_pO FW_hidden("detail", $d); FW_pO FW_hidden("dev.$cmd$d", $d); FW_pO FW_submit("cmd.$cmd$d", $cmd) . " $d"; - FW_pO FW_select("arg.$cmd$d",\@al,undef,$class); + FW_pO FW_select("arg.$cmd$d",\@al, undef, $class, + "FW_selChange(this.options[selectedIndex].text,'$list','val.$cmd$d')"); FW_pO FW_textfield("val.$cmd$d", 30, $class); FW_pO "
"; } @@ -721,7 +706,11 @@ FW_doDetail($) FW_makeTable($d, $defs{$d}); FW_pO "Readings" if($defs{$d}{READINGS}); FW_makeTable($d, $defs{$d}{READINGS}); - FW_makeSelect($d, "attr", getAllAttr($d),"attr"); + my $attrList = getAllAttr($d); + my $roomList = join(",", sort keys %FW_rooms); + $roomList=~s/ /\ /g; + $attrList =~ s/room /room:$roomList /; + FW_makeSelect($d, "attr", $attrList,"attr"); FW_makeTable($d, $attr{$d}, "deleteattr"); @@ -1287,10 +1276,11 @@ FW_hidden($$) ################## # Generate a select field with option list sub -FW_select($$$$) +FW_select($$$$@) { - my ($n, $va, $def,$class) = @_; - my $s = ""; foreach my $v (@{$va}) { if($def && $v eq $def) { @@ -2068,7 +2058,7 @@ FW_devState($$) $link .= "&room=$room"; } if($FW_longpoll) { - $txt = "$txt"; + $txt = "$txt"; } elsif($FW_ss || $FW_tp) { $txt = "$txt"; diff --git a/webfrontend/pgm2/fhemweb.js b/webfrontend/pgm2/fhemweb.js new file mode 100644 index 000000000..1efcfee62 --- /dev/null +++ b/webfrontend/pgm2/fhemweb.js @@ -0,0 +1,78 @@ +/*************** LONGPOLL START **************/ +var FW_pollConn; + +function +FW_cmd(arg) /* see also FW_devState */ +{ + var req = new XMLHttpRequest(); + req.open("GET", arg, true); + req.send(null); +} + +function +FW_doUpdate() +{ + if(FW_pollConn.readyState != 4 || FW_pollConn.status != 200) + return; + var lines = FW_pollConn.responseText.split("\n"); + for(var i=0; i < lines.length; i++) { + var d = lines[i].split(";", 3); // Complete arg + if(d.length != 3) + continue; + var el = document.getElementById(d[0]); + if(el) + el.innerHTML=d[2]; + } + FW_pollConn.abort(); + FW_longpoll(); +} + +function +FW_longpoll() +{ + FW_pollConn = new XMLHttpRequest(); + var room="room=all"; + var sa = document.location.search.substring(1).split("&"); + for(var i = 0; i < sa.length; i++) { + if(sa[i].substring(0,5) == "room=") + room=sa[i]; + } + var query = document.location.pathname+"?"+room+"&XHR=1&inform=1"; + FW_pollConn.open("GET", query, true); + FW_pollConn.onreadystatechange = FW_doUpdate; + FW_pollConn.send(null); +} + +function +FW_delayedStart() +{ + setTimeout("FW_longpoll()", 1000); +} + +function +FW_selChange(sel, list, elName) +{ + var value; + var l = list.split(" "); + for(var i=0; i < l.length; i++) { + var nv = l[i].split(":",2); + if(nv[0] == sel) { + value = nv[1]; break; + } + } + + var el = document.getElementsByName(elName)[0]; + if(value==undefined) { + newEl = document.createElement('input'); + newEl.type='text'; newEl.size=30; + } else { + newEl = document.createElement('select'); + var vArr = value.split(","); + for(var j=0; j < vArr.length; j++) { + newEl.options[j] = new Option(vArr[j], vArr[j]); + } + } + newEl.class=el.class; newEl.name=el.name; + el.parentNode.replaceChild(newEl, el); +} +/*************** LONGPOLL END **************/ diff --git a/webfrontend/pgm2/longpoll.js b/webfrontend/pgm2/longpoll.js deleted file mode 100644 index 4f96c452e..000000000 --- a/webfrontend/pgm2/longpoll.js +++ /dev/null @@ -1,51 +0,0 @@ -var pollConn; - -function -cmd(arg) -{ - var req = new XMLHttpRequest(); - req.open("GET", arg, true); - req.send(null); -} - -function -doUpdate() -{ - if(pollConn.readyState != 4 || pollConn.status != 200) - return; - var lines = pollConn.responseText.split("\n"); - for(var i=0; i < lines.length; i++) { - var d = lines[i].split(";", 3); // Complete arg - if(d.length != 3) - continue; - var el = document.getElementById(d[0]); - if(el) - el.innerHTML=d[2]; - } - pollConn.abort(); - longpoll(); -} - -function -longpoll() -{ - pollConn = new XMLHttpRequest(); - var room="room=all"; - var sa = document.location.search.substring(1).split("&"); - for(var i = 0; i < sa.length; i++) { - if(sa[i].substring(0,5) == "room=") - room=sa[i]; - } - var query = document.location.pathname+"?"+room+"&XHR=1&inform=1"; - pollConn.open("GET", query, true); - pollConn.onreadystatechange = doUpdate; - pollConn.send(null); -} - -function -delayedStart() -{ - setTimeout("longpoll()", 1000); -} - -window.onload = delayedStart;