Added locked setting to the recipes. Is not working well when a recipe is loaded and locked. Added uuid load and save for recipes. Mad a lot of variables local in functions. The subgrids are loaded async.

Fri, 04 Jan 2019 17:52:17 +0100

author
Michiel Broek <mbroek@mbse.eu>
date
Fri, 04 Jan 2019 17:52:17 +0100
changeset 168
ce92dc75cb09
parent 167
dabcd35f8f92
child 169
9a685ee91537

Added locked setting to the recipes. Is not working well when a recipe is loaded and locked. Added uuid load and save for recipes. Mad a lot of variables local in functions. The subgrids are loaded async.

www/includes/db_recipes.php file | annotate | diff | comparison | revisions
www/js/rec_edit.js file | annotate | diff | comparison | revisions
www/rec_edit.php file | annotate | diff | comparison | revisions
--- a/www/includes/db_recipes.php	Thu Jan 03 20:56:47 2019 +0100
+++ b/www/includes/db_recipes.php	Fri Jan 04 17:52:17 2019 +0100
@@ -32,6 +32,7 @@
 		$uuid = str_replace("\n", "", file_get_contents('/proc/sys/kernel/random/uuid'));
 		$sql .= "uuid='" . $uuid;
 	}
+	($_POST['locked'] == 'true') ? $sql .= "', locked='1" : $sql .= "', locked='0";
 	$sql .= "', st_name='" . mysqli_real_escape_string($connect, $_POST['st_name']);
 	$sql .= "', st_letter='" . mysqli_real_escape_string($connect, $_POST['st_letter']);
 	$sql .= "', st_guide='" . mysqli_real_escape_string($connect, $_POST['st_guide']);
@@ -206,6 +207,8 @@
 		}
 		$comma = TRUE;
 		$recipes .= '{"record":' . $row['record'];
+		$recipes .= ',"uuid":"' . $row['uuid'];
+		$recipes .= '","locked":' . $row['locked'];
 		$recipes .=  ',"st_guide":"' . str_replace($escapers, $replacements, $row['st_guide']);
 		$recipes .= '","st_letter":"' . str_replace($escapers, $replacements, $row['st_letter']);
 		$recipes .= '","st_name":"'  . str_replace($escapers, $replacements, $row['st_name']);
--- 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 <mbroek at mbse dot eu>
  *
@@ -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(),
--- a/www/rec_edit.php	Thu Jan 03 20:56:47 2019 +0100
+++ b/www/rec_edit.php	Fri Jan 04 17:52:17 2019 +0100
@@ -21,7 +21,9 @@
        <table style="width: 100%;">
         <tr>
          <td style="vertical-align: top; float: right; padding: 3px;">Recept naam:</td>
-         <td align="left" colspan="5" style="vertical-align: top; padding: 3px;"><input id="name" /></td>
+	 <td align="left" colspan="3" style="vertical-align: top; padding: 3px;"><input id="name" /></td>
+         <td style="vertical-align: top; float: right; padding: 3px;">Alleen lezen:</td>
+         <td align="left" style="padding: 3px;"><div id="locked"></div></td>
         </tr>
         <tr>
          <td style="vertical-align: top; float: right; padding: 3px;">Opmerkingen:</td>

mercurial