From cdfd4d621eebc0407ac46b01026e4c2c916a14d2 Mon Sep 17 00:00:00 2001 From: rudolfkoenig Date: Sun, 10 Apr 2016 13:42:52 +0000 Subject: [PATCH] fhemweb.js: online attribute updates, perlSyntaxCheck for Attributes git-svn-id: https://svn.fhem.de/fhem/trunk@11220 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/01_FHEMWEB.pm | 34 ++++++++++++++++++++-------------- fhem/www/pgm2/fhemweb.js | 40 ++++++++++++++++++++++++++++++++-------- 2 files changed, 52 insertions(+), 22 deletions(-) diff --git a/fhem/FHEM/01_FHEMWEB.pm b/fhem/FHEM/01_FHEMWEB.pm index c605ec68d..2978a0d78 100755 --- a/fhem/FHEM/01_FHEMWEB.pm +++ b/fhem/FHEM/01_FHEMWEB.pm @@ -1061,14 +1061,7 @@ FW_makeTable($$$@) FW_makeEdit($name, $n, $val); } else { - if( $title eq "Attributes" ) { - my $id = "sel_attr$name"; $id =~ s/\./_/g; - FW_pO "
". - "". - "$n
"; - } else { - FW_pO "
$n
"; - } + FW_pO "
$n
"; if(ref($val)) { #handle readings my ($v, $t) = ($val->{VAL}, $val->{TIME}); @@ -1083,16 +1076,17 @@ FW_makeTable($$$@) } } else { $val = FW_htmlEscape($val); + my $tattr = "informId=\"$name-$n\" class=\"dval\""; # if possible provide some links if ($n eq "room"){ - FW_pO "
". + FW_pO "
". join(",", map { FW_pH("room=$_",$_,0,"",1,1) } split(",",$val)). "
"; } elsif ($n eq "webCmd"){ my $lc = "detail=$name&cmd.$name=set $name"; - FW_pO "
". + FW_pO "
". join(":", map {FW_pH("$lc $_",$_,0,"",1,1)} split(":",$val) ). "
"; @@ -1104,7 +1098,7 @@ FW_makeTable($$$@) } else { $val = "
$val
" if($val =~ m/\n/ && $title eq "Attributes"); - FW_pO "
". + FW_pO "
". join(",", map { ($_ ne $name && $defs{$_}) ? FW_pH( "detail=$_", $_ ,0,"",1,1) : $_ } split(",",$val)). "
"; @@ -1138,13 +1132,14 @@ FW_detailSelect(@) $list =~ s/"/"/g; my $ret =""; + my $psc = AttrVal("global", "perlSyntaxCheck", ($featurelevel>5.7) ? 1 : 0); $ret .= "
"; $ret .= "
"; $ret .= FW_hidden("detail", $d); $ret .= FW_hidden("fwcsrf", $defs{$FW_wname}{CSRFTOKEN}) if($FW_CSRF); $ret .= FW_hidden("dev.$cmd$d", $d.($param ? " $param":"")); - $ret .= FW_submit("cmd.$cmd$d", $cmd, $cmd); + $ret .= FW_submit("cmd.$cmd$d", $cmd, $cmd.($psc?" psc":"")); $ret .= "
 $d ". ($param ? " $param":"")."
"; $ret .= FW_select("sel_$cmd$d","arg.$cmd$d",\@al, $selEl, $cmd); @@ -2505,6 +2500,7 @@ FW_Notify($$) my $h = $ntfy->{inform}; return undef if(!$h); my $isStatus = ($h->{type} =~ m/status/); + my $events; my $dn = $dev->{NAME}; if($dn eq "global" && $isStatus) { @@ -2512,7 +2508,15 @@ FW_Notify($$) my $data = FW_longpollInfo($h->{fmt}, "#FHEMWEB:$ntfy->{NAME}","\$('#saveCheck').css('visibility','$vs')",""); addToWritebuffer($ntfy, $data."\n"); - $dn = $1 if($dev->{CHANGED} && $dev->{CHANGED}->[0] =~ m/^MODIFIED (.*)$/); + + if($dev->{CHANGED}) { + $dn = $1 if($dev->{CHANGED}->[0] =~ m/^MODIFIED (.*)$/); + if($dev->{CHANGED}->[0] =~ m/^ATTR ([^ ]+) ([^ ]+.*) (.*)$/) { + $dn = $1; + my @a = ("$2: $3"); + $events = \@a; + } + } } if($dn eq $ntfy->{SNAME} && @@ -2530,7 +2534,9 @@ FW_Notify($$) my @data; my %extPage; my $isRaw = ($h->{type} =~ m/raw/); - my $events = deviceEvents($dev, AttrVal($FW_wname, "addStateEvent",!$isRaw)); + $events = deviceEvents($dev, AttrVal($FW_wname, "addStateEvent",!$isRaw)) + if(!$events); +Log 1, "C: $dn $events->[0]"; if($isStatus) { # Why is saving this stuff needed? FLOORPLAN? diff --git a/fhem/www/pgm2/fhemweb.js b/fhem/www/pgm2/fhemweb.js index 4a103abae..e472db835 100644 --- a/fhem/www/pgm2/fhemweb.js +++ b/fhem/www/pgm2/fhemweb.js @@ -196,6 +196,19 @@ FW_jqueryReadyFn() }); }); + $("table.attributes tr div.dname") // Click on attribute fills input value + .each(function(){ + $(this) + .html(''+$(this).html()+'') + .css({cursor:"pointer"}) + .click(function(){ + var aname = "#sel_attr"+$(this).attr("data-name"); + $(aname).val($(this).text()); + FW_detailSelect(aname); + }); + }); + + FW_smallScreenCommands(); FW_inlineModify(); @@ -460,10 +473,28 @@ FW_replaceLink(el) function FW_inlineModify() // Do not generate a new HTML page upon pressing modify { - $("div#edit input.psc[type=submit]").click(function(e){ + $("div input.psc[type=submit]").click(function(e){ e.preventDefault(); var newDef = $(this).closest("form").find("textarea").val(); var cmd = $(this).attr("name")+"="+$(this).attr("value")+" "+newDef; + + if( newDef == undefined ) { + var div = $(this).closest("div.makeSelect"); + var devName = $(div).attr("dev"), + cmd = $(div).attr("cmd"); + var sel = $(this).closest("form").find("select"); + var arg = $(sel).val(); + if($(".dval[informid="+devName+"-"+arg+"]").length == 0) { + console.log(this); + $(this).unbind('click').click();// No element found to replace + return; + } + newDef = $(this).closest("form").find("input:text").val(); + if(newDef == undefined) + newDef = $(this).closest("form").find("select:last").val(); + cmd = $(this).attr("name")+"="+cmd+" "+devName+" "+arg+" "+newDef; + } + FW_cmd(FW_root+"?"+encodeURIComponent(cmd)+"&XHR=1", function(resp){ if(resp) return FW_okDialog(resp); @@ -725,13 +756,6 @@ FW_queryValue(cmd, el) qConn.send(null); } -function -FW_querySetSelected(el, val) // called by the attribute links -{ - $("#"+el).val(val); - FW_detailSelect("#"+el); -} - /*************** TEXTFIELD **************/ function FW_createTextField(elName, devName, vArr, currVal, set, params, cmd)