diff -r dabcd35f8f92 -r ce92dc75cb09 www/js/rec_edit.js --- a/www/js/rec_edit.js Thu Jan 03 20:56:47 2019 +0100 +++ b/www/js/rec_edit.js Fri Jan 04 17:52:17 2019 +0100 @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (C) 2018 + * Copyright (C) 2018-2019 * * Michiel Broek * @@ -83,6 +83,65 @@ theme: theme }); + function setReadonly(ro) { + var rw = ! ro; + var w100 = 100; + var w80 = 80; + if (ro) { // jqxNumberInput width -20 for no spinbuttons + w100 = 80; + w80 = 60; + } + $("#batch_size").jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w100 }); + $("#boil_size").jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w100 }); + $("#boil_time").jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w100 }); + $("#efficiency").jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w100 }); + $("#est_og").jqxNumberInput({ spinButtons: rw, readOnly: ro }); + $("#type").jqxDropDownList({ disabled: ro }); + $("#styleSelect").jqxDropDownList({ disabled: ro }); + $("#color_method").jqxDropDownList({ disabled: ro }); + $("#ibu_method").jqxDropDownList({ disabled: ro }); + $("#Delete").jqxButton({ disabled: ro }); + $("#fermentableGrid").jqxGrid({ editable: rw }); + $("#faddrowbutton").jqxDropDownList({ disabled: ro }); + $("#finstockbutton").jqxCheckBox({ disabled: ro }); + $("#fdeleterowbutton").jqxButton({ disabled: ro }); + $("#hopGrid").jqxGrid({ editable: rw }); + $("#haddrowbutton").jqxDropDownList({ disabled: ro }); + $("#hinstockbutton").jqxCheckBox({ disabled: ro }); + $("#hdeleterowbutton").jqxButton({ disabled: ro }); + $("#miscGrid").jqxGrid({ editable: rw }); + $("#maddrowbutton").jqxDropDownList({ disabled: ro }); + $("#minstockbutton").jqxCheckBox({ disabled: ro }); + $("#mdeleterowbutton").jqxButton({ disabled: ro }); + $("#yeastGrid").jqxGrid({ editable: rw }); + $("#yaddrowbutton").jqxDropDownList({ disabled: ro }); + $("#yinstockbutton").jqxCheckBox({ disabled: ro }); + $("#ydeleterowbutton").jqxButton({ disabled: ro }); + $("#mashGrid").jqxGrid({ editable: rw }); + $("#saddrowbutton").jqxButton({ disabled: ro }); + $("#sdeleterowbutton").jqxButton({ disabled: ro }); + $("#w1_name").jqxDropDownList({ disabled: ro }); + $("#w2_name").jqxDropDownList({ disabled: ro }); + $("#pr_name").jqxDropDownList({ disabled: ro }); + $("#wa_cacl2").jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w100 }); + $("#wa_caso4").jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w100 }); + $("#wa_mgso4").jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w100 }); + $("#wa_nacl").jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w100 }); + $("#mash_ph").jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w100 }); + $("#calc_acid").jqxCheckBox({ disabled: ro }); + $("#wa_base_name").jqxDropDownList({ disabled: ro }); + $("#wa_base").jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w100 }); + $("#wa_acid_name").jqxDropDownList({ disabled: ro }); + $("#wa_acid").jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w100 }); + $("#wa_acid_perc").jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w80 }); + $("#sparge_temp").jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w100 }); + $("#sparge_volume").jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w100 }); + $("#sparge_ph").jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w100 }); + $("#sparge_source").jqxDropDownList({ disabled: ro }); + $("#sparge_acid_type").jqxDropDownList({ disabled: ro }); + $("#sparge_acid_perc").jqxNumberInput({ spinButtons: rw, readOnly: ro, width: w100 }); + }; + function calcFermentables() { console.log("calcFermentables()"); sugarsf = 0; @@ -266,9 +325,7 @@ break; } } -// console.log("set something, found: "+found); if (! found) { -// console.log("need to add this misc"); var miscs = new $.jqx.dataAdapter(miscInvSource, { loadComplete: function () { var records = miscs.records; @@ -456,13 +513,7 @@ var RA = 0; var acid = 0; var frac = 0; - var MolWt = 0; - var pK1 = 0; - var pK2 = 0; - var pK3 = 0; var TpH = 0; - var AcidSG = 0; - var AcidPrc = 0; var protonDeficit = 0; if (dataRecord.w1_name == "") { @@ -548,13 +599,12 @@ var BT = $("#wa_base_name").val(); var result = GetAcidSpecs(AT); - pK1 = result.pK1; - pK2 = result.pK2; - pK3 = result.pK3; - MolWt = result.MolWt; - AcidSG = result.AcidSG; - AcidPrc = result.AcidPrc; - // console.log(AT+" pK1: "+pK1+" pK2: "+pK2+" pK3: "+pK3+" MolWt: "+MolWt+" AcidSG: "+AcidSG+" AcidPrc: "+AcidPrc); + var pK1 = result.pK1; + var pK2 = result.pK2; + var pK3 = result.pK3; + var MolWt = result.MolWt; + var AcidSG = result.AcidSG; + var AcidPrc = result.AcidPrc; if (dataRecord.calc_acid) { TpH = parseFloat(dataRecord.mash_ph); @@ -581,16 +631,16 @@ } else if (protonDeficit < 0) { //Add base $("#wa_acid").val(0); setWaterAgent(last_acid, 0); - r1d = Math.pow(10, (TpH - 6.38)); - r2d = Math.pow(10, (TpH - 10.38)); - f1d = 1 / (1 + r1d + r1d * r2d); - f2d = f1d * r1d; - f3d = f2d * r2d; + var r1d = Math.pow(10, (TpH - 6.38)); + var r2d = Math.pow(10, (TpH - 10.38)); + var f1d = 1 / (1 + r1d + r1d * r2d); + var f2d = f1d * r1d; + var f3d = f2d * r2d; switch (BT) { - case 'NaHCO3': base = -protonDeficit / (f1d - f3d); //mmol totaal - base = base * MMNaHCO3/1000; //gram - $("#wa_base").val(Math.round(base * 100) / 100); - setWaterAgent(BT, Math.round(base * 100) / 100); + case 'NaHCO3': RA = -protonDeficit / (f1d - f3d); //mmol totaal + RA = RA * MMNaHCO3/1000; //gram + $("#wa_base").val(Math.round(RA * 100) / 100); + setWaterAgent(BT, Math.round(RA * 100) / 100); if (liters > 0) { // Na RA = parseFloat($("#wa_nacl").jqxNumberInput('decimal')) * MMNa / MMNaCl + @@ -605,10 +655,10 @@ RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); } break; - case 'Na2CO3': base = -protonDeficit / (2 * f1d + f2d); //mmol totaal - base = base * MMNa2CO3/1000; //gram - $("#wa_base").val(Math.round(base * 100) / 100); - setWaterAgent(BT, Math.round(base * 100) / 100); + case 'Na2CO3': RA = -protonDeficit / (2 * f1d + f2d); //mmol totaal + RA = RA * MMNa2CO3/1000; //gram + $("#wa_base").val(Math.round(RA * 100) / 100); + setWaterAgent(BT, Math.round(RA * 100) / 100); if (liters > 0) { RA = parseFloat($("#wa_nacl").jqxNumberInput('decimal')) * MMNa / MMNaCl + parseFloat($("#wa_base").jqxNumberInput('decimal')) * 2 * MMNa / MMNa2CO3; @@ -622,12 +672,12 @@ RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); } break; - case 'CaCO3': base = -protonDeficit * (f1d - f3d); //mmol totaal - base = base * MMCaCO3/1000; //gram + case 'CaCO3': RA = -protonDeficit * (f1d - f3d); //mmol totaal + RA = RA * MMCaCO3/1000; //gram //but only 1/3 is effective, so add 3 times as much - base = 3 * base; - $("#wa_base").val(Math.round(base * 100) / 100); - setWaterAgent(BT, Math.round(base * 100) / 100); + RA = 3 * RA; + $("#wa_base").val(Math.round(RA * 100) / 100); + setWaterAgent(BT, Math.round(RA * 100) / 100); if (liters > 0) { //Bicarbonate RA = parseFloat($("#wa_base").jqxNumberInput('decimal')) / 3 * MMHCO3 / MMCaCO3; @@ -643,9 +693,9 @@ RA = ResidualAlkalinity(wb_total_alkalinity, wb_calcium, wb_magnesium); } break; - case 'Ca(OH)2': base = -protonDeficit / 19.3; // g - $("#wa_base").val(Math.round(base * 100) / 100); - setWaterAgent(BT, Math.round(base * 100) / 100); + case 'Ca(OH)2': RA = -protonDeficit / 19.3; // g + $("#wa_base").val(Math.round(RA * 100) / 100); + setWaterAgent(BT, Math.round(RA * 100) / 100); if (liters > 0) { // Bicarbonate RA = -protonDeficit / liters; @@ -727,10 +777,10 @@ frac = CalcFrac(pHa, pK1, pK2, pK3); protonDeficit = Acid * frac; - deltapH = 0.001; - deltapd = 0.1; - pd = ProtonDeficit(pHa); - n = 0; + var deltapH = 0.001; + var deltapd = 0.1; + var pd = ProtonDeficit(pHa); + var n = 0; // console.log("n: "+n+" pd: "+pd+" protonDeficit: "+protonDeficit+" frac: "+frac+" pHa: "+pHa); while (((pd < (protonDeficit - deltapd)) || (pd > (protonDeficit + deltapd))) && (n < 2000)) { @@ -851,50 +901,50 @@ console.log("calcSparge() target pH: "+TargetpH+" Source: "+Source_pH+" alkalinity: "+Source_alkalinity); // Step 1: Compute the mole fractions of carbonic (f1o), bicarbonate (f2o) and carbonate(f3o) at the water pH - r1 = Math.pow(10, Source_pH - 6.38); - r2 = Math.pow(10, Source_pH - 10.33); - d = 1 + r1 + r1*r2; - f1 = 1/d; - f2 = r1/d; - f3 = r1 * r2 / d; + var r1 = Math.pow(10, Source_pH - 6.38); + var r2 = Math.pow(10, Source_pH - 10.33); + var d = 1 + r1 + r1*r2; + var f1 = 1/d; + var f2 = r1/d; + var f3 = r1 * r2 / d; //Step 2. Compute the mole fractions at pH = 4.3 (the pH which defines alkalinity) - r143 = Math.pow(10, 4.3 - 6.38); - r243 = Math.pow(10, 4.3 - 10.33); - d43 = 1 + r143 + r143*r243; - f143 = 1/d43; - f243 = r143 / d43; - f343 = r143 * r243 / d43; + var r143 = Math.pow(10, 4.3 - 6.38); + var r243 = Math.pow(10, 4.3 - 10.33); + var d43 = 1 + r143 + r143*r243; + var f143 = 1/d43; + var f243 = r143 / d43; + var f343 = r143 * r243 / d43; //Step 3. Convert the sample alkalinity to milliequivalents/L - alkalinity = Source_alkalinity / 50; + var alkalinity = Source_alkalinity / 50; //Step 4. Solve alkalinity = alkalinity / ((f143-f1)+(f3-f343)); //Step 5. Compute mole fractions at desired pH - r1g = Math.pow(10, TargetpH - 6.38); - r2g = Math.pow(10, TargetpH - 10.33); - dg = 1 + r1g + r1g*r2g; - f1g = 1/dg; - f2g = r1g / dg; - f3g = r1g * r2g / dg; + var r1g = Math.pow(10, TargetpH - 6.38); + var r2g = Math.pow(10, TargetpH - 10.33); + var dg = 1 + r1g + r1g*r2g; + var f1g = 1/dg; + var f2g = r1g / dg; + var f3g = r1g * r2g / dg; //Step 6. Use these to compute the milliequivalents acid required per liter (mEq/L) - Acid = alkalinity * ((f1g-f1)+(f3-f3g)) + Math.pow(10, -TargetpH) - Math.pow(10, -Source_pH); //mEq/l + var Acid = alkalinity * ((f1g-f1)+(f3-f3g)) + Math.pow(10, -TargetpH) - Math.pow(10, -Source_pH); //mEq/l if ($("#sparge_acid_type").val() == "") { $("#sparge_acid_type").val('Melkzuur'); dataRecord.sparge_acid_type = 'Melkzuur'; } - AT = dataRecord.sparge_acid_type; + var AT = dataRecord.sparge_acid_type; var result = GetAcidSpecs(AT); - pK1 = result.pK1; - pK2 = result.pK2; - pK3 = result.pK3; - MolWt = result.MolWt; - AcidSG = result.AcidSG; - AcidPrc = result.AcidPrc; - fract = CalcFrac(TargetpH, pK1, pK2, pK3); + var pK1 = result.pK1; + var pK2 = result.pK2; + var pK3 = result.pK3; + var MolWt = result.MolWt; + var AcidSG = result.AcidSG; + var AcidPrc = result.AcidPrc; + var fract = CalcFrac(TargetpH, pK1, pK2, pK3); //Step 9. Now divide the mEq required by the "fraction". This is the required number of moles of acid. Acid /= fract; @@ -917,15 +967,13 @@ function calcFermentablesFromOG(OG) { console.log("calcFermentablesFromOG("+OG+")"); - var i; var efficiency = parseFloat($("#efficiency").jqxNumberInput('decimal')); var rows = $('#fermentableGrid').jqxGrid('getrows'); var sug = sg_to_plato(OG) * parseFloat($("#batch_size").jqxNumberInput('decimal')) * OG / 100; //total amount of sugars in kg var tot = 0; - var d; - for (i = 0; i < rows.length; i++) { - row = rows[i]; - d = row.f_percentage / 100 * (row.f_yield / 100) * (1 - row.f_moisture / 100); + for (var i = 0; i < rows.length; i++) { + var row = rows[i]; + var d = row.f_percentage / 100 * (row.f_yield / 100) * (1 - row.f_moisture / 100); if (row.f_added == "Mash") d = efficiency / 100 * d; tot += d; @@ -936,8 +984,8 @@ totmass = sug / tot; if (totmass) { - for (i = 0; i < rows.length; i++) { - row = rows[i]; + for (var i = 0; i < rows.length; i++) { + var row = rows[i]; $("#fermentableGrid").jqxGrid('setcellvalue', i, "f_amount", row.f_percentage / 100 * totmass); } } @@ -1095,6 +1143,13 @@ dataRecord.sparge_acid_perc = parseFloat(event.args.value); calcSparge(); }); + $('#locked').on('checked', function (event) { + setReadonly(true); + }); + $('#locked').on('unchecked', function (event) { + setReadonly(false); + }); +// setReadonly(false); }; $("#styleSelect").jqxDropDownList({ @@ -1276,6 +1331,7 @@ // Hidden record uuid $("#name").val(dataRecord.name); $("#notes").val(dataRecord.notes); + $("#locked").val(dataRecord.locked); $("#st_name").val(dataRecord.st_name); $("#st_letter").val(dataRecord.st_letter); $("#st_guide").val(dataRecord.st_guide); @@ -1360,6 +1416,8 @@ var fermentableSource = { localdata: data.fermentables, datatype: "local", + cache: false, + async: false, datafields: [ { name: 'f_name', type: 'string' }, { name: 'f_origin', type: 'string' }, @@ -1661,6 +1719,7 @@ localdata: data.hops, datatype: "local", cache: false, + async: false, datafields: [ { name: 'h_name', type: 'string' }, { name: 'h_origin', type: 'string' }, @@ -1881,6 +1940,7 @@ localdata: data.miscs, datatype: "local", cache: false, + async: false, datafields: [ { name: 'm_name', type: 'string' }, { name: 'm_amount', type: 'float' }, @@ -2111,6 +2171,7 @@ localdata: data.yeasts, datatype: "local", cache: false, + async: false, datafields: [ { name: 'y_name', type: 'string' }, { name: 'y_laboratory', type: 'string' }, @@ -2304,6 +2365,7 @@ localdata: data.mashs, datatype: "local", cache: false, + async: false, datafields: [ { name: 'step_name', type: 'string' }, { name: 'step_type', type: 'string' }, @@ -2370,6 +2432,7 @@ calcInit(); $('#jqxLoader').jqxLoader('close'); $('#jqxTabs').jqxTabs('first'); + // setReadonly(dataRecord.locked); }, columns: [ { text: 'Stap naam', datafield: 'step_name' }, @@ -2435,6 +2498,7 @@ var srcAcid = [ "Melkzuur", "Zoutzuur", "Fosforzuur", "Zwavelzuur" ]; var srcSource = [ "Bron 1", "Bron 2", "Gemengd" ]; $("#name").jqxInput({ theme: theme, width: 640, height: 23 }); + $("#locked").jqxCheckBox({ theme: theme, width: 120, height: 23 }); $("#notes").jqxInput({ theme: theme, width: 960, height: 200 }); $("#st_name").jqxInput({ theme: theme, width: 250, height: 23 }); $("#st_letter").jqxInput({ theme: theme, width: 100, height: 23 }); @@ -2696,6 +2760,7 @@ record: my_record, uuid: dataRecord.uuid, name: $("#name").val(), + locked: $("#locked").val(), notes: $("#notes").val(), st_name: $('#st_name').val(), st_letter: $('#st_letter').val(),