diff --git a/fhem/CHANGED b/fhem/CHANGED index 34d4e6586..4c8ff6213 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - change: 01_FHEMWEB.js: on demand loading of fhemweb_*.js (Forum #76868) - bugfix: 73_GardenaSmartBridge: fix part of code - feature: 49_SSCam: V3.1.0, move extevent from CAM- to SVS-model, Reading PollState enhanced, minor fixes diff --git a/fhem/FHEM/01_FHEMWEB.pm b/fhem/FHEM/01_FHEMWEB.pm index b88414e55..76f807e40 100644 --- a/fhem/FHEM/01_FHEMWEB.pm +++ b/fhem/FHEM/01_FHEMWEB.pm @@ -77,6 +77,7 @@ use vars qw($FW_plotmode);# Global plot mode (WEB attribute), used by SVG use vars qw($FW_plotsize);# Global plot size (WEB attribute), used by SVG use vars qw(%FW_webArgs); # all arguments specified in the GET use vars qw(@FW_fhemwebjs);# List of fhemweb*js scripts to load +use vars qw($FW_fhemwebjs);# List of fhemweb*js scripts to load use vars qw($FW_detail); # currently selected device for detail view use vars qw($FW_cmdret); # Returned data by the fhem call use vars qw($FW_room); # currently selected room @@ -208,11 +209,13 @@ FHEMWEB_Initialize($) $FW_cssdir = "$FW_dir/pgm2"; $FW_gplotdir = "$FW_dir/gplot"; - # Blacklist is needed due to an update bug, where MOV was not implemented - my %bl = (_multiple=>1,_noArg=>1,_slider=>1,_svg=>1,_textField=>1,_time=>1); if(opendir(DH, "$FW_dir/pgm2")) { - @FW_fhemwebjs = sort grep { $_ =~ m/^fhemweb(.*).js$/ && !$bl{$1}; } - readdir(DH); + $FW_fhemwebjs = join(",", map { $_ = ~m/^fhemweb_(.*).js$/; $1 } + grep { /fhemweb_(.*).js$/ } + readdir(DH)); + $data{FWEXT}{"readingsGroup" }{SCRIPT} = "fhemweb_readingsGroup.js"; + $data{FWEXT}{"readingsHistory"}{SCRIPT} = "fhemweb_readingsHistory.js"; + @FW_fhemwebjs = ("fhemweb.js"); closedir(DH); } @@ -890,10 +893,7 @@ FW_answerCall($) no strict "refs"; ($FW_RETTYPE, $FW_RET) = &{$h->{FUNC}}($arg); if(defined($FW_RETTYPE) && $FW_RETTYPE =~ m,text/html,) { - my $dataAttr = - "data-confirmDelete='" .AttrVal($FW_wname,"confirmDelete",1) ."' ". - "data-confirmJSError='".AttrVal($FW_wname,"confirmJSError",1)."' ". - "data-webName='$FW_wname '"; + my $dataAttr = FW_dataAttr(); $FW_RET =~ s/{NR} if( !$FW_id ); - my $dataAttr = - "data-confirmDelete='" .AttrVal($FW_wname,"confirmDelete", 1)."' ". - "data-confirmJSError='".AttrVal($FW_wname,"confirmJSError",1)."' ". - "data-addHtmlTitle='" .AttrVal($FW_wname,"addHtmlTitle", 1)."' ". - "data-webName='$FW_wname '"; + my $dataAttr = FW_dataAttr(); FW_pO "\n"; if($FW_activateInform) { @@ -1084,6 +1080,17 @@ FW_answerCall($) return 0; } +sub +FW_dataAttr() +{ + return + "data-confirmDelete='" .AttrVal($FW_wname,"confirmDelete", 1)."' ". + "data-confirmJSError='".AttrVal($FW_wname,"confirmJSError",1)."' ". + "data-addHtmlTitle='" .AttrVal($FW_wname,"addHtmlTitle", 1)."' ". + "data-availableJs='$FW_fhemwebjs' ". + "data-webName='$FW_wname '"; +} + sub FW_addContent(;$) { @@ -1337,7 +1344,7 @@ FW_doDetail($) $t = "MISSING" if(!defined($t)); FW_addContent(); - if($FW_ss) { # FS20MS2 special: on and off, is not the same as toggle + if($FW_ss) { my $webCmd = AttrVal($d, "webCmd", undef); if($webCmd) { FW_pO ""; @@ -3618,8 +3625,6 @@ FW_widgetOverride($$) attr WEB JavaScripts codemirror/fhem_codemirror.js
attr WEB codemirrorParam { "theme":"blackboard", "lineNumbers":true } - Note: if the filename starts with - then it will be excluded for the - automatically loaded list (e.g. -fhemweb_fbcalllist.js)
@@ -4412,9 +4417,6 @@ FW_widgetOverride($$) attr WEB JavaScripts codemirror/fhem_codemirror.js
attr WEB codemirrorParam { "theme":"blackboard", "lineNumbers":true } - Falls der Dateiname mit - anfängt, dann wird diese sonst - aus www/pgm2 automatisch geladene Datei nicht geladen. (z.Bsp.: - -fhemweb_fbcalllist.js)
diff --git a/fhem/www/pgm2/fhemweb.js b/fhem/www/pgm2/fhemweb.js index 65ff2d343..eb8d7a3fc 100644 --- a/fhem/www/pgm2/fhemweb.js +++ b/fhem/www/pgm2/fhemweb.js @@ -10,6 +10,7 @@ var FW_isiOS = navigator.userAgent.match(/(iPad|iPhone|iPod)/); var FW_scripts = {}, FW_links = {}; var FW_docReady = false, FW_longpollType, FW_csrfToken, FW_csrfOk=true; var FW_root = "/fhem"; // root +var FW_availableJs=[]; var embedLoadRetry = 100; // createFn returns an HTML Element, which may contain @@ -50,7 +51,8 @@ FW_replaceWidgets(parent) var rd=$(this).attr("reading"); var params = cmd.split(" "); var type=$(this).attr("type"); - if( type == undefined ) type = "set"; + if(type == undefined) + type = "set"; FW_replaceWidget(this, dev, $(this).attr("arg").split(","), $(this).attr("current"), rd, params[0], params.slice(1), function(arg) { @@ -68,6 +70,13 @@ FW_jqueryReadyFn() FW_docReady = true; FW_serverGenerated = $("body").attr("generated"); FW_longpollType = $("body").attr("longpoll"); + var ajs = $("body").attr("data-availableJs"); + if(ajs) { + ajs = ajs.split(","); + for(var i1=0; i1'+ - set+' '+params.join(' ')+ ''); - $(newEl).click(function(arg) { cmd(params[0]) }); + if(!newEl) { // Simple link + newEl = $('
'+ + set+' '+params.join(' ')+ '
'); + $(newEl).click(function(arg) { cmd(params[0]) }); + $(oldEl).replaceWith(newEl); + if(readyFn) + return readyFn(newEl); + return; + } + + $(newEl).addClass(wn+"_widget"); + + if( $(newEl).find("[informId]").length==0 && !$(newEl).attr("informId") ) { + if(reading) + $(newEl).attr("informId", devName+"-"+reading); + var addTitle = $("body").attr("data-addHtmlTitle"); + if(reading != "state" && addTitle==1) + $(newEl).attr("title", reading); + } $(oldEl).replaceWith(newEl); - return newEl; + + if(newEl.activateFn) // CSS is not applied if newEl is not in the document + newEl.activateFn(); + if(readyFn) + readyFn(newEl); } - - $(newEl).addClass(wn+"_widget"); - - if( $(newEl).find("[informId]").length == 0 && !$(newEl).attr("informId") ) { - if(reading) - $(newEl).attr("informId", devName+"-"+reading); - var addTitle = $("body").attr("data-addHtmlTitle"); - if(reading != "state" && addTitle==1) - $(newEl).attr("title", reading); - } - - $(oldEl).replaceWith(newEl); - - if(newEl.activateFn) // CSS is not applied if newEl is not in the document - newEl.activateFn(); - return newEl; } function