diff --git a/fhem/www/frontend/controls_frontend.txt b/fhem/www/frontend/controls_frontend.txt index 798bbaf5d..9f123927e 100644 --- a/fhem/www/frontend/controls_frontend.txt +++ b/fhem/www/frontend/controls_frontend.txt @@ -282,7 +282,7 @@ UPD 2014-01-12_12:09:17 5144 www/frontend/app/view/StatusPanel.js UPD 2014-01-12_12:55:22 10486 www/frontend/app/view/Viewport.js UPD 2014-01-12_04:44:35 22438 www/frontend/app/controller/MainController.js UPD 2014-01-12_02:49:58 16562 www/frontend/app/controller/StatusController.js -UPD 2014-01-12_03:28:35 109269 www/frontend/app/controller/ChartController.js +UPD 2014-03-14_05:50:19 111937 www/frontend/app/controller/ChartController.js UPD 2013-06-30_11:46:54 5415 www/frontend/app/controller/TableDataController.js UPD 2013-04-01_07:04:35 202 www/frontend/app/model/ReadingsModel.js UPD 2013-04-01_07:04:36 338 www/frontend/app/model/SavedChartsModel.js diff --git a/fhem/www/frontend/www/frontend/app/controller/ChartController.js b/fhem/www/frontend/www/frontend/app/controller/ChartController.js index d10bda0da..05e48c1a1 100644 --- a/fhem/www/frontend/www/frontend/app/controller/ChartController.js +++ b/fhem/www/frontend/www/frontend/app/controller/ChartController.js @@ -239,12 +239,21 @@ Ext.define('FHEM.controller.ChartController', { var splitArr = row.split(" "), i = 2; // 2 is needed as offset, because get function starts at one and our array at 0 Ext.each(splitArr, function(key) { - if (key.lastIndexOf(":") + 1 === key.length && + // first we need to check if key is empty string, which can be caused by logfiles + // that contain multiple spaces between key / values in one row... + // in that case, we will skip the entry + if (key !== "" && + key.lastIndexOf(":") + 1 === key.length && !Ext.Array.contains(keyArray, key.replace(":", ""))) { keyArray.push(key.replace(":", "")); keyIndexArray.push(i); } - i++; + + // only raise counter when key is not empty string (multiple whitespaces), + // as the get function will exactly work like this + if (key !== "") { + i++; + } }); }); @@ -781,10 +790,10 @@ Ext.define('FHEM.controller.ChartController', { }); // last fallback, similar to parseint - queryString += '$fld[3]*1'; + queryString += '$fld[' + (yaxisindex - 1) + ']*1'; // add closing brackets - for (bracket = 1; bracket < count; bracket++) { + for (var bracket = 1; bracket < count; bracket++) { queryString += ")"; } } @@ -1328,8 +1337,10 @@ Ext.define('FHEM.controller.ChartController', { * reset the form fields e.g. when loading a new chart */ resetFormFields: function() { - this.getLinechartpanel().axiscounter = 0; + //remove a possibly set record of the last loaded chart + this.getLinechartpanel().record = null; + var fieldset = this.getChartformpanel().down('fieldset[name=axesfieldset]'); fieldset.removeAll(); this.getLinechartpanel().createNewYAxis(); @@ -1396,196 +1407,233 @@ Ext.define('FHEM.controller.ChartController', { /** - * save the current chart to database + * save the current chart */ - saveChartData: function() { + saveChartData: function(btn, evt, savename, scope) { - var me = this; + var me = scope ? scope : this, + update = false, + lcp = me.getLinechartpanel(); - Ext.Msg.prompt("Select a name", "Enter a name to save the Chart", function(action, savename) { - if (action === "ok" && !Ext.isEmpty(savename)) { - //replacing spaces in name - savename = savename.replace(/ /g, "_"); - //replacing + in name - savename = savename.replace(/\+/g, "_"); + // detect if we have a loaded chart or a new one + if (lcp && lcp.record && lcp.record !== null) { + // we have a already saved chart, need to update + savename = lcp.record.NAME; + update = true; + } else { + // we got a new chart which needs to be saved + if (!savename || Ext.isEmpty(savename)) { + Ext.Msg.prompt("Select a name", "Enter a name to save the Chart", function(action, savename) { + if (action === "ok" && !Ext.isEmpty(savename)) { + me.saveChartData(null, null, savename, me); + } + }, me); + // we need to return as the script continues without waiting for user input + return; + } + } + + if (savename && !Ext.isEmpty(savename)) { + //replacing spaces in name + savename = savename.replace(/ /g, "_"); + //replacing + in name + savename = savename.replace(/\+/g, "_"); + + //getting the necessary values + var logtypes = Ext.ComponentQuery.query('radiogroup[name=datasourceradio]'), + devices = Ext.ComponentQuery.query('combobox[name=devicecombo]'), + yaxes = Ext.ComponentQuery.query('combobox[name=yaxiscombo]'), + rowFieldSets = Ext.ComponentQuery.query('fieldset[commonName=singlerowfieldset]'), + axissideradio = Ext.ComponentQuery.query('radiogroup[name=axisside]'), + yaxesstatistics = Ext.ComponentQuery.query('combobox[name=yaxisstatisticscombo]'), + + basesstart = Ext.ComponentQuery.query('numberfield[name=basestart]'), + basesend = Ext.ComponentQuery.query('numberfield[name=baseend]'), + basescolors = Ext.ComponentQuery.query('combobox[name=baselinecolorcombo]'), + basesfills = Ext.ComponentQuery.query('checkboxfield[name=baselinefillcheck]'), - //getting the necessary values - var logtypes = Ext.ComponentQuery.query('radiogroup[name=datasourceradio]'), - devices = Ext.ComponentQuery.query('combobox[name=devicecombo]'), - yaxes = Ext.ComponentQuery.query('combobox[name=yaxiscombo]'), - rowFieldSets = Ext.ComponentQuery.query('fieldset[commonName=singlerowfieldset]'), - axissideradio = Ext.ComponentQuery.query('radiogroup[name=axisside]'), - yaxesstatistics = Ext.ComponentQuery.query('combobox[name=yaxisstatisticscombo]'), + starttime = me.getStarttimepicker().getValue(), + dbstarttime = Ext.Date.format(starttime, 'Y-m-d_H:i:s'), + endtime = me.getEndtimepicker().getValue(), + dbendtime = Ext.Date.format(endtime, 'Y-m-d_H:i:s'), + dynamicradio = Ext.ComponentQuery.query('radiogroup[name=dynamictime]')[0], + generalization = Ext.ComponentQuery.query('radio[boxLabel=active]')[0], + generalizationfactor = Ext.ComponentQuery.query('combobox[name=genfactor]')[0].getValue(), + leftaxisconfiguration = Ext.ComponentQuery.query('radiogroup[name=leftaxisconfiguration]')[0].getChecked()[0].inputValue, + rightaxisconfiguration = Ext.ComponentQuery.query('radiogroup[name=rightaxisconfiguration]')[0].getChecked()[0].inputValue, + chart = me.getChart(); + + //setting the start / endtime parameter in the chartconfig to the string of the radiofield, gets parsed on load + if (this.getStarttimepicker().isDisabled()) { + dynamicradio.eachBox(function(box, idx) { + if (box.checked) { + dbstarttime = box.inputValue; + dbendtime = box.inputValue; + } + }); + } + + var jsonConfig = '{'; + var i = 0; + Ext.each(devices, function(dev) { - basesstart = Ext.ComponentQuery.query('numberfield[name=basestart]'), - basesend = Ext.ComponentQuery.query('numberfield[name=baseend]'), - basescolors = Ext.ComponentQuery.query('combobox[name=baselinecolorcombo]'), - basesfills = Ext.ComponentQuery.query('checkboxfield[name=baselinefillcheck]'), + var logtype = logtypes[i].getChecked()[0].inputValue, + device = dev.getValue(), + yaxis = yaxes[i].getValue() ? yaxes[i].getValue() : yaxes[i].rawValue, + linestrokewidth = rowFieldSets[i].styleConfig.linestrokewidth, + linecolorhexcode = rowFieldSets[i].styleConfig.linecolorhexcode.toString(), + fillopacity = rowFieldSets[i].styleConfig.fillopacity, + fillcolorhexcode = rowFieldSets[i].styleConfig.fillcolorhexcode, + yaxisshowpoints = rowFieldSets[i].styleConfig.yaxisshowpoints, + pointshape = rowFieldSets[i].styleConfig.pointshape, + pointradius = rowFieldSets[i].styleConfig.pointradius, + yaxissmoothing = rowFieldSets[i].styleConfig.yaxissmoothing, + yaxislegendcheck = rowFieldSets[i].styleConfig.yaxislegendcheck, + pointcolorhexcode = rowFieldSets[i].styleConfig.pointcolorhexcode, + yaxisfillcheck = rowFieldSets[i].styleConfig.yaxisfillcheck, + yaxisstepcheck = rowFieldSets[i].styleConfig.yaxisstepcheck, + yaxisstatistics = yaxesstatistics[i].getValue(), + axisside = axissideradio[i].getChecked()[0].getSubmitValue(), + rightaxistitle = me.getChartformpanel().down('textfield[name=rightaxistitle]').getValue(), + leftaxistitle = me.getChartformpanel().down('textfield[name=leftaxistitle]').getValue(); + //replacing spaces in title + rightaxistitle = rightaxistitle.replace(/ /g, "_"); + leftaxistitle = leftaxistitle.replace(/ /g, "_"); + //replacing + in title + rightaxistitle = rightaxistitle.replace(/\+/g, "_"); + leftaxistitle = leftaxistitle.replace(/\+/g, "_"); + if (i === 0) { + jsonConfig += '"y":"' + yaxis + '","device":"' + device + '",'; + jsonConfig += '"logtype":"' + logtype + '",'; + jsonConfig += '"linestrokewidth":"' + linestrokewidth + '",'; + jsonConfig += '"linecolorhexcode":"' + linecolorhexcode + '",'; + jsonConfig += '"fillopacity":"' + fillopacity + '",'; + jsonConfig += '"fillcolorhexcode":"' + fillcolorhexcode + '",'; + jsonConfig += '"yaxisshowpoints":"' + yaxisshowpoints + '",'; + jsonConfig += '"pointshape":"' + pointshape + '",'; + jsonConfig += '"pointradius":"' + pointradius + '",'; + jsonConfig += '"yaxissmoothing":"' + yaxissmoothing + '",'; + jsonConfig += '"yaxislegendcheck":"' + yaxislegendcheck + '",'; + jsonConfig += '"pointcolorhexcode":"' + pointcolorhexcode + '",'; + jsonConfig += '"yaxisfillcheck":"' + yaxisfillcheck + '",'; + jsonConfig += '"yaxisstepcheck":"' + yaxisstepcheck + '",'; + jsonConfig += '"yaxisside":"' + axisside + '",'; + jsonConfig += '"leftaxistitle":"' + leftaxistitle + '",'; + jsonConfig += '"rightaxistitle":"' + rightaxistitle + '",'; - starttime = me.getStarttimepicker().getValue(), - dbstarttime = Ext.Date.format(starttime, 'Y-m-d_H:i:s'), - endtime = me.getEndtimepicker().getValue(), - dbendtime = Ext.Date.format(endtime, 'Y-m-d_H:i:s'), - dynamicradio = Ext.ComponentQuery.query('radiogroup[name=dynamictime]')[0], - generalization = Ext.ComponentQuery.query('radio[boxLabel=active]')[0], - generalizationfactor = Ext.ComponentQuery.query('combobox[name=genfactor]')[0].getValue(), - leftaxisconfiguration = Ext.ComponentQuery.query('radiogroup[name=leftaxisconfiguration]')[0].getChecked()[0].inputValue, - rightaxisconfiguration = Ext.ComponentQuery.query('radiogroup[name=rightaxisconfiguration]')[0].getChecked()[0].inputValue, - chart = me.getChart(), - store = chart.getStore(); + if (yaxisstatistics !== "none") { + jsonConfig += '"yaxisstatistics":"' + yaxisstatistics + '",'; + } + } else { + var logtypename = "y" + (i + 1) + "logtype", + axisname = "y" + (i + 1) + "axis", + devicename = "y" + (i + 1) + "device", + sidename = "y" + (i + 1) + "axisside", + statsname = "y" + (i + 1) + "axisstatistics", + prefix = "y" + (i + 1); + + jsonConfig += '"' + axisname + '":"' + yaxis + '","' + devicename + '":"' + device + '",'; + jsonConfig += '"' + logtypename + '":"' + logtype + '",'; + + jsonConfig += '"' + prefix + 'linestrokewidth' + '":"' + linestrokewidth + '",'; + jsonConfig += '"' + prefix + 'linecolorhexcode' + '":"' + linecolorhexcode + '",'; + jsonConfig += '"' + prefix + 'fillopacity' + '":"' + fillopacity + '",'; + jsonConfig += '"' + prefix + 'fillcolorhexcode' + '":"' + fillcolorhexcode + '",'; + jsonConfig += '"' + prefix + 'yaxisshowpoints' + '":"' + yaxisshowpoints + '",'; + jsonConfig += '"' + prefix + 'pointshape' + '":"' + pointshape + '",'; + jsonConfig += '"' + prefix + 'pointradius' + '":"' + pointradius + '",'; + jsonConfig += '"' + prefix + 'yaxissmoothing' + '":"' + yaxissmoothing + '",'; + jsonConfig += '"' + prefix + 'yaxislegendcheck' + '":"' + yaxislegendcheck + '",'; + jsonConfig += '"' + prefix + 'pointcolorhexcode' + '":"' + pointcolorhexcode + '",'; + jsonConfig += '"' + prefix + 'axisfillcheck' + '":"' + yaxisfillcheck + '",'; + jsonConfig += '"' + prefix + 'axisstepcheck' + '":"' + yaxisstepcheck + '",'; + + jsonConfig += '"' + sidename + '":"' + axisside + '",'; + if (yaxisstatistics !== "none") { + jsonConfig += '"' + statsname + '":"' + yaxisstatistics + '",'; + } + } + i++; + }); + + if(generalization.checked) { + jsonConfig += '"generalization":"true",'; + jsonConfig += '"generalizationfactor":"' + generalizationfactor + '",'; + } + + if (leftaxisconfiguration === 'manual') { + var leftaxismin = Ext.ComponentQuery.query('numberfield[name=leftaxisminimum]')[0].getValue(), + leftaxismax = Ext.ComponentQuery.query('numberfield[name=leftaxismaximum]')[0].getValue(); + + if (Ext.isNumeric(leftaxismin) && Ext.isNumeric(leftaxismax)) { + jsonConfig += '"leftaxismin":"' + leftaxismin + '",'; + jsonConfig += '"leftaxismax":"' + leftaxismax + '",'; + } else { + Ext.Msg.alert("Error", "Left axis configuration is invalid, values will not be saved!"); + } + } + + if (rightaxisconfiguration === "manual") { + var rightaxismin = Ext.ComponentQuery.query('numberfield[name=rightaxisminimum]')[0].getValue(), + rightaxismax = Ext.ComponentQuery.query('numberfield[name=rightaxismaximum]')[0].getValue(); - //setting the start / endtime parameter in the chartconfig to the string of the radiofield, gets parsed on load - if (this.getStarttimepicker().isDisabled()) { - dynamicradio.eachBox(function(box, idx) { - if (box.checked) { - dbstarttime = box.inputValue; - dbendtime = box.inputValue; + if (Ext.isNumeric(rightaxismin) && Ext.isNumeric(rightaxismax)) { + jsonConfig += '"rightaxismin":"' + rightaxismin + '",'; + jsonConfig += '"rightaxismax":"' + rightaxismax + '",'; + } else { + Ext.Msg.alert("Error", "Right axis configuration is invalid, values will not be saved!"); + } + } + + var j = 0; + Ext.each(basesstart, function(base) { + var basestart = basesstart[j].getValue(), + baseend = basesend[j].getValue(), + basecolor = basescolors[j].getDisplayValue(), + basefill = basesfills[j].checked; + + j++; + jsonConfig += '"base' + j + 'start":"' + basestart + '","base' + j + 'end":"' + baseend + '",'; + jsonConfig += '"base' + j + 'color":"' + basecolor + '","base' + j + 'fill":"' + basefill + '",'; + }); + + jsonConfig += '"starttime":"' + dbstarttime + '","endtime":"' + dbendtime + '"}'; + + if (chart) { + chart.setLoading(true); + } + + //decide if we save to db or to file + var filelogbool = false, + dblogbool = false; + + Ext.each(logtypes, function(typeradio) { + if (typeradio.getChecked()[0].inputValue === "filelog") { + filelogbool = true; + } else { + dblogbool = true; + } + }); + + if (filelogbool === true && dblogbool === false) { + + var filelogrecfound = false; + // check for create or update + if (update === true) { + // find the current chart and relplace it + Ext.each(FHEM.filelogcharts, function(chart) { + if (chart.ID === lcp.record.ID) { + filelogrecfound = chart; } }); - } - - var jsonConfig = '{'; - var i = 0; - Ext.each(devices, function(dev) { - - var logtype = logtypes[i].getChecked()[0].inputValue, - device = dev.getValue(), - yaxis = yaxes[i].getValue(), - linestrokewidth = rowFieldSets[i].styleConfig.linestrokewidth, - linecolorhexcode = rowFieldSets[i].styleConfig.linecolorhexcode.toString(), - fillopacity = rowFieldSets[i].styleConfig.fillopacity, - fillcolorhexcode = rowFieldSets[i].styleConfig.fillcolorhexcode, - yaxisshowpoints = rowFieldSets[i].styleConfig.yaxisshowpoints, - pointshape = rowFieldSets[i].styleConfig.pointshape, - pointradius = rowFieldSets[i].styleConfig.pointradius, - yaxissmoothing = rowFieldSets[i].styleConfig.yaxissmoothing, - yaxislegendcheck = rowFieldSets[i].styleConfig.yaxislegendcheck, - pointcolorhexcode = rowFieldSets[i].styleConfig.pointcolorhexcode, - yaxisfillcheck = rowFieldSets[i].styleConfig.yaxisfillcheck, - yaxisstepcheck = rowFieldSets[i].styleConfig.yaxisstepcheck, - yaxisstatistics = yaxesstatistics[i].getValue(), - axisside = axissideradio[i].getChecked()[0].getSubmitValue(), - rightaxistitle = me.getChartformpanel().down('textfield[name=rightaxistitle]').getValue(), - leftaxistitle = me.getChartformpanel().down('textfield[name=leftaxistitle]').getValue(); - //replacing spaces in title - rightaxistitle = rightaxistitle.replace(/ /g, "_"); - leftaxistitle = leftaxistitle.replace(/ /g, "_"); - //replacing + in title - rightaxistitle = rightaxistitle.replace(/\+/g, "_"); - leftaxistitle = leftaxistitle.replace(/\+/g, "_"); - if (i === 0) { - jsonConfig += '"y":"' + yaxis + '","device":"' + device + '",'; - jsonConfig += '"logtype":"' + logtype + '",'; - jsonConfig += '"linestrokewidth":"' + linestrokewidth + '",'; - jsonConfig += '"linecolorhexcode":"' + linecolorhexcode + '",'; - jsonConfig += '"fillopacity":"' + fillopacity + '",'; - jsonConfig += '"fillcolorhexcode":"' + fillcolorhexcode + '",'; - jsonConfig += '"yaxisshowpoints":"' + yaxisshowpoints + '",'; - jsonConfig += '"pointshape":"' + pointshape + '",'; - jsonConfig += '"pointradius":"' + pointradius + '",'; - jsonConfig += '"yaxissmoothing":"' + yaxissmoothing + '",'; - jsonConfig += '"yaxislegendcheck":"' + yaxislegendcheck + '",'; - jsonConfig += '"pointcolorhexcode":"' + pointcolorhexcode + '",'; - jsonConfig += '"yaxisfillcheck":"' + yaxisfillcheck + '",'; - jsonConfig += '"yaxisstepcheck":"' + yaxisstepcheck + '",'; - jsonConfig += '"yaxisside":"' + axisside + '",'; - jsonConfig += '"leftaxistitle":"' + leftaxistitle + '",'; - jsonConfig += '"rightaxistitle":"' + rightaxistitle + '",'; - - if (yaxisstatistics !== "none") { - jsonConfig += '"yaxisstatistics":"' + yaxisstatistics + '",'; - } + if (!filelogrecfound) { + Ext.Msg.alert("Error", "Could not find the original Chart to update.."); } else { - var logtypename = "y" + (i + 1) + "logtype", - axisname = "y" + (i + 1) + "axis", - devicename = "y" + (i + 1) + "device", - sidename = "y" + (i + 1) + "axisside", - statsname = "y" + (i + 1) + "axisstatistics", - prefix = "y" + (i + 1); - - jsonConfig += '"' + axisname + '":"' + yaxis + '","' + devicename + '":"' + device + '",'; - jsonConfig += '"' + logtypename + '":"' + logtype + '",'; - - jsonConfig += '"' + prefix + 'linestrokewidth' + '":"' + linestrokewidth + '",'; - jsonConfig += '"' + prefix + 'linecolorhexcode' + '":"' + linecolorhexcode + '",'; - jsonConfig += '"' + prefix + 'fillopacity' + '":"' + fillopacity + '",'; - jsonConfig += '"' + prefix + 'fillcolorhexcode' + '":"' + fillcolorhexcode + '",'; - jsonConfig += '"' + prefix + 'yaxisshowpoints' + '":"' + yaxisshowpoints + '",'; - jsonConfig += '"' + prefix + 'pointshape' + '":"' + pointshape + '",'; - jsonConfig += '"' + prefix + 'pointradius' + '":"' + pointradius + '",'; - jsonConfig += '"' + prefix + 'yaxissmoothing' + '":"' + yaxissmoothing + '",'; - jsonConfig += '"' + prefix + 'yaxislegendcheck' + '":"' + yaxislegendcheck + '",'; - jsonConfig += '"' + prefix + 'pointcolorhexcode' + '":"' + pointcolorhexcode + '",'; - jsonConfig += '"' + prefix + 'axisfillcheck' + '":"' + yaxisfillcheck + '",'; - jsonConfig += '"' + prefix + 'axisstepcheck' + '":"' + yaxisstepcheck + '",'; - - jsonConfig += '"' + sidename + '":"' + axisside + '",'; - if (yaxisstatistics !== "none") { - jsonConfig += '"' + statsname + '":"' + yaxisstatistics + '",'; - } + filelogrecfound.TIMESTAMP = Ext.Date.format(new Date(), 'Y-m-d H:i:s'); + filelogrecfound.VALUE = Ext.decode(jsonConfig); + me.updateFileLogCharts(false); } - i++; - }); - - if(generalization.checked) { - jsonConfig += '"generalization":"true",'; - jsonConfig += '"generalizationfactor":"' + generalizationfactor + '",'; - } - - if (leftaxisconfiguration === 'manual') { - var leftaxismin = Ext.ComponentQuery.query('numberfield[name=leftaxisminimum]')[0].getValue(), - leftaxismax = Ext.ComponentQuery.query('numberfield[name=leftaxismaximum]')[0].getValue(); - - if (Ext.isNumeric(leftaxismin) && Ext.isNumeric(leftaxismax)) { - jsonConfig += '"leftaxismin":"' + leftaxismin + '",'; - jsonConfig += '"leftaxismax":"' + leftaxismax + '",'; - } else { - Ext.Msg.alert("Error", "Left axis configuration is invalid, values will not be saved!"); - } - } - - if (rightaxisconfiguration === "manual") { - var rightaxismin = Ext.ComponentQuery.query('numberfield[name=rightaxisminimum]')[0].getValue(), - rightaxismax = Ext.ComponentQuery.query('numberfield[name=rightaxismaximum]')[0].getValue(); - - if (Ext.isNumeric(rightaxismin) && Ext.isNumeric(rightaxismax)) { - jsonConfig += '"rightaxismin":"' + rightaxismin + '",'; - jsonConfig += '"rightaxismax":"' + rightaxismax + '",'; - } else { - Ext.Msg.alert("Error", "Right axis configuration is invalid, values will not be saved!"); - } - } - - var j = 0; - Ext.each(basesstart, function(base) { - var basestart = basesstart[j].getValue(), - baseend = basesend[j].getValue(), - basecolor = basescolors[j].getDisplayValue(), - basefill = basesfills[j].checked; - - j++; - jsonConfig += '"base' + j + 'start":"' + basestart + '","base' + j + 'end":"' + baseend + '",'; - jsonConfig += '"base' + j + 'color":"' + basecolor + '","base' + j + 'fill":"' + basefill + '",'; - }); - - jsonConfig += '"starttime":"' + dbstarttime + '","endtime":"' + dbendtime + '"}'; - - chart.setLoading(true); - - //decide if we save to db or to file - var filelogbool = false, - dblogbool = false; - - Ext.each(logtypes, function(typeradio) { - if (typeradio.getChecked()[0].inputValue === "filelog") { - filelogbool = true; - } else { - dblogbool = true; - } - }); - - if (filelogbool === true && dblogbool === false) { - + } else { // create the current chart object var chartobject = {}, hash = 0, @@ -1607,42 +1655,56 @@ Ext.define('FHEM.controller.ChartController', { // append the chartobject to the global FHEM.filelogcharts FHEM.filelogcharts.push(chartobject); - me.updateFileLogCharts(true); - - } else { - - var url = '../../../fhem?cmd=get+' + FHEM.dblogname + '+-+webchart+' + dbstarttime + '+' + dbendtime + '+'; - url +=devices[0].getValue() + '+savechart+""+""+' + savename + '+' + jsonConfig + '&XHR=1'; - Ext.Ajax.request({ - method: 'POST', - disableCaching: false, - url: url, - success: function(response){ - chart.setLoading(false); - var json = Ext.decode(response.responseText); - if (json.success === "true" || json.data && json.data.length === 0) { - me.getMaintreepanel().fireEvent("treeupdated"); - Ext.Msg.alert("Success", "Chart successfully saved!"); - } else if (json.msg) { - Ext.Msg.alert("Error", "The Chart could not be saved, error Message is:

" + json.msg); - } else { - Ext.Msg.alert("Error", "The Chart could not be saved!"); - } - }, - failure: function() { - chart.setLoading(false); - if (json && json.msg) { - Ext.Msg.alert("Error", "The Chart could not be saved, error Message is:

" + json.msg); - } else { - Ext.Msg.alert("Error", "The Chart could not be saved!"); - } - } - }); } + } else { + + var url; + + // check for create or update + if (update === true) { + url = '../../../fhem?cmd=get+' + FHEM.dblogname + '+-+webchart+' + dbstarttime + '+' + dbendtime + '+'; + url +=devices[0].getValue() + '+updatechart+""+""+' + lcp.record.ID + '+' + jsonConfig + '&XHR=1'; + } else { + url = '../../../fhem?cmd=get+' + FHEM.dblogname + '+-+webchart+' + dbstarttime + '+' + dbendtime + '+'; + url +=devices[0].getValue() + '+savechart+""+""+' + savename + '+' + jsonConfig + '&XHR=1'; + } + + Ext.Ajax.request({ + method: 'POST', + disableCaching: false, + url: url, + success: function(response){ + if (chart) { + chart.setLoading(false); + } + var json = Ext.decode(response.responseText); + if (json.success === "true" || json.data && json.data.length === 0) { + me.getMaintreepanel().fireEvent("treeupdated"); + Ext.Msg.alert("Success", "Chart successfully saved!"); + } else if (json.msg) { + Ext.Msg.alert("Error", "The Chart could not be saved, error Message is:

" + json.msg); + } else { + Ext.Msg.alert("Error", "The Chart could not be saved!"); + } + }, + failure: function() { + if (chart) { + chart.setLoading(false); + } + if (json && json.msg) { + Ext.Msg.alert("Error", "The Chart could not be saved, error Message is:

" + json.msg); + } else { + Ext.Msg.alert("Error", "The Chart could not be saved!"); + } + } + }); } - }, this); + + } else { + Ext.Msg.alert("Error", "No name for the chart has been found!"); + } }, @@ -1729,6 +1791,9 @@ Ext.define('FHEM.controller.ChartController', { if (chartdata && !Ext.isEmpty(chartdata)) { + // set the rec of the loading record to panel to detect if chart needs update or create on save + this.getLinechartpanel().record = record.raw.data; + //reset y-axis max me.maxYValue = 0; me.minYValue = 9999999; @@ -1782,6 +1847,9 @@ Ext.define('FHEM.controller.ChartController', { } else { yaxes[i].getStore().getProxy().url = url = '../../../fhem?cmd=get+' + FHEM.dblogname + '+-+webchart+""+""+' + chartdata.device + '+getreadings&XHR=1'; } + // disable the datasource selection, as changing this on a saved chart would be + // a lot of work... + logtypes[i].setDisabled(true); yaxes[i].setDisabled(false); yaxes[i].setValue(chartdata.y); rowFieldSets[i].styleConfig.linestrokewidth = chartdata.linestrokewidth || 2;