Miscs from bool to ints. Miscs database uses POST instead of GET. Dropdowns are unsing indexes. Dynamic edit screen adjust for weight and liter. Edit screen redesigned. Friendly show duration of ingredients.

Thu, 24 Jan 2019 20:54:45 +0100

author
Michiel Broek <mbroek@mbse.eu>
date
Thu, 24 Jan 2019 20:54:45 +0100
changeset 200
7b2f11652d67
parent 199
dad62ec9af18
child 201
f9b7e3f6be7c

Miscs from bool to ints. Miscs database uses POST instead of GET. Dropdowns are unsing indexes. Dynamic edit screen adjust for weight and liter. Edit screen redesigned. Friendly show duration of ingredients.

README.design file | annotate | diff | comparison | revisions
www/import/from_brouwhulp.php file | annotate | diff | comparison | revisions
www/includes/db_inventory_miscs.php file | annotate | diff | comparison | revisions
www/inv_miscs.php file | annotate | diff | comparison | revisions
www/js/global.js file | annotate | diff | comparison | revisions
www/js/inv_miscs.js file | annotate | diff | comparison | revisions
www/js/inv_yeasts.js file | annotate | diff | comparison | revisions
--- a/README.design	Wed Jan 23 22:53:24 2019 +0100
+++ b/README.design	Thu Jan 24 20:54:45 2019 +0100
@@ -36,7 +36,7 @@
 inventory_equipments		Ok.	Ok.
 inventory_fermentables		Ok.	Ok.		Ok.	Ok.	Ok.	Ok.
 inventory_hops			Ok.	Ok.		Ok.	Ok.	Ok.	Ok.
-inventory_miscs			Ok.
+inventory_miscs			Ok.	Ok.		Ok.	Ok.	Ok.	Ok.
 inventory_suppliers		Ok.	Ok.
 inventory_water			Ok.	Ok.
 inventory_yeasts		Ok.	Ok.		Ok.	Ok.	Ok.	Ok.
@@ -47,13 +47,11 @@
 recipes
 products
 
+
 Handelsmaten (een zooitje ongeregeld):
-vergistbare ingredienten:	Prijs per kilo, hoeveelheid in gram.
-hoppen				Prijs per ons, hoeveelheid in gram.
 Kruiden				Prijs per gram, hoeveelheden in gram.
 Additieven			Prijs per 100 ml, hoeveeheid in ml.
 Water				Prijs per liter of kuub, hoveelheden in liters.
-Gist				Prijs per gram / ml. hoeveelheden in gram/ml.
 
 Alles naar standaard maten in de database en presentatie naar behoefte?
 Opslag kilos, liter en Euros met veel cijfers achter de comma.
--- a/www/import/from_brouwhulp.php	Wed Jan 23 22:53:24 2019 +0100
+++ b/www/import/from_brouwhulp.php	Thu Jan 24 20:54:45 2019 +0100
@@ -276,10 +276,18 @@
 		$sql .= "', best_for='" . mysqli_real_escape_string($db, $yeast->BEST_FOR);
 		if ($yeast->MAX_REUSE)
 			$sql .= "', max_reuse='" . $yeast->MAX_REUSE;
+
+		if ($yeast->FORM == 'Liquid') {
+			$sql .= "', cells='100000000000";	// 100 billion cells per pack
+		} else if ($yeast->FORM == 'Dry') {
+			$sql .= "', cells='15000000000";	// 6..15 billion per gram
+		} else {
+			$sql .= "', cells='1700000000";		// 1.7 billion cells per ml.
+		}
 		if ($yeast->INVENTORY)
-			$sql .= "', inventory='" . floatval($yeast->INVENTORY) / 1000.0;
+			$sql .= "', inventory='" . floatval($yeast->INVENTORY) / 1000.0; // To kg or liter
 		if ($yeast->COST)
-			$sql .= "', cost='" . floatval($yeast->COST) * 1000.0;
+			$sql .= "', cost='" . floatval($yeast->COST) * 1000.0; 	// to Euro/kg or liter
 		if ($yeast->CULTURE_DATE) {
 			$date = substr($yeast->CULTURE_DATE, 6, 4) . '-' . substr($yeast->CULTURE_DATE, 3, 2) . '-' . substr($yeast->CULTURE_DATE, 0, 2);
 			$sql .= "', production_date='" . $date;
@@ -356,8 +364,39 @@
 		$sql  = "INSERT INTO inventory_miscs SET name='" . mysqli_real_escape_string($db, $misc->NAME);
 		if ($misc->NOTES)
 			$sql .= "', notes='" . mysqli_real_escape_string($db, $misc->NOTES);
-		$sql .= "', type='" . $misc->TYPE;
-		$sql .= "', use_use='" . $misc->USE;
+
+		if ($misc->TYPE == 'Spice')
+			$sql .= "', type='0";
+		else if ($misc->TYPE == 'Herb')
+			$sql .= "', type='1";
+		else if ($misc->TYPE == 'Flavor')
+			$sql .= "', type='2";
+		else if ($misc->TYPE == 'Fining')
+			$sql .= "', type='3";
+		else if ($misc->TYPE == 'Water agent')
+			$sql .= "', type='4";
+		else if ($misc->TYPE == 'Yeast nutrient')
+			$sql .= "', type='5";
+		else if ($misc->TYPE == 'Other')
+			$sql .= "', type='6";
+		else
+			echo "Unknown TYPE " . $misc->TYPE . PHP_EOL;
+
+		if ($misc->USE == 'Starter')
+			$sql .= "', use_use='0";
+		else if ($misc->USE == 'Mash')
+			$sql .= "', use_use='1";
+		else if ($misc->USE == 'Boil')
+			$sql .= "', use_use='2";
+		else if ($misc->USE == 'Primary')
+			$sql .= "', use_use='3";
+		else if ($misc->USE == 'Secondary')
+			$sql .= "', use_use='4";
+		else if ($misc->USE == 'Bottling')
+			$sql .= "', use_use='5";
+		else
+			echo "Unknown USE " . $misc->USE . PHP_EOL;
+
 		$sql .= "', time='" . $misc->TIME;
 		($misc->AMOUNT_IS_WEIGHT == 'TRUE') ? $sql .= "', amount_is_weight='1" : $sql .= "', amount_is_weight='0";
 		if ($misc->USE_FOR)
--- a/www/includes/db_inventory_miscs.php	Wed Jan 23 22:53:24 2019 +0100
+++ b/www/includes/db_inventory_miscs.php	Thu Jan 24 20:54:45 2019 +0100
@@ -10,67 +10,68 @@
 }
 mysqli_set_charset($connect, "utf8" );
 
-// get data and store in a json array
-$query = "SELECT * FROM inventory_miscs ORDER BY name";
-if (isset($_GET['insert'])) {
-	// INSERT COMMAND
-	$sql  = "INSERT INTO `inventory_miscs` SET name='" . mysqli_real_escape_string($connect, $_GET['name']);
-	$sql .= "', type='" . $_GET['type'];
-	$sql .= "', use_use='" . $_GET['use_use'];
-	$sql .= "', time='" . $_GET['time'];
-	($_GET['amount_is_weight'] == 'true') ? $sql .= "', amount_is_weight='1" : $sql .= "', amount_is_weight='0";
-	$sql .= "', use_for='" . mysqli_real_escape_string($connect, $_GET['use_for']);
-	$sql .= "', notes='" . mysqli_real_escape_string($connect, $_GET['notes']);
-	($_GET['always_on_stock'] == 'true') ? $sql .= "', always_on_stock='1" : $sql .= "', always_on_stock='0";
-	$sql .= "', inventory='" . $_GET['inventory'];
-	$sql .= "', cost='" . $_GET['cost'];
-	$sql .= "', production_date='" . $_GET['production_date'];
-	$sql .= "', tht_date='" . $_GET['tht_date'];
-	$sql .= "';";
+if (isset($_POST['insert']) || isset($_POST['update'])) {
+	if (isset($_POST['insert'])) {
+		$sql  = "INSERT INTO `inventory_miscs` SET ";
+	}
+	if (isset($_POST['update'])) {
+		$sql  = "UPDATE `inventory_miscs` SET ";
+	}
+
+	$sql .= "name='" . mysqli_real_escape_string($connect, $_POST['name']);
+	$sql .= "', type='" . $_POST['type'];
+	$sql .= "', use_use='" . $_POST['use_use'];
+	$sql .= "', time='" . $_POST['time'];
+	($_POST['amount_is_weight'] == 'true') ? $sql .= "', amount_is_weight='1" : $sql .= "', amount_is_weight='0";
+	$sql .= "', use_for='" . mysqli_real_escape_string($connect, $_POST['use_for']);
+	$sql .= "', notes='" . mysqli_real_escape_string($connect, $_POST['notes']);
+	($_POST['always_on_stock'] == 'true') ? $sql .= "', always_on_stock='1" : $sql .= "', always_on_stock='0";
+	$sql .= "', inventory='" . floatval($_POST['inventory']) / 1000.0;
+	$sql .= "', cost='" . $_POST['cost'] . "'";
+	if ($_POST['production_date'] == '')
+		$sql .= ", production_date=NULL";
+	else
+		$sql .= ", production_date='" . $_POST['production_date'] . "'";
+	if ($_POST['tht_date'] == '')
+		$sql .= ", tht_date=NULL";
+	else
+		$sql .= ", tht_date='" . $_POST['tht_date'] . "'";
+
+	if (isset($_POST['insert'])) {
+		$sql .= ";";
+	}
+	if (isset($_POST['update'])) {
+		$sql .= " WHERE record='" . $_POST['record'] . "';";
+	}
+	syslog(LOG_NOTICE, $sql);
+
 	$result = mysqli_query($connect, $sql);
 	if (! $result) {
 		syslog(LOG_NOTICE, "db_inventory_miscs: ".$sql." result: ".mysqli_error($connect));
 	} else {
-		syslog(LOG_NOTICE, "db_inventory_miscs: inserted ".$_GET['name']);
+		if (isset($_POST['update'])) {
+			syslog(LOG_NOTICE, "db_inventory_miscs: updated record ".$_POST['record']);
+		} else {
+			$lastid = mysqli_insert_id($connect);
+			syslog(LOG_NOTICE, "db_inventory_miscs: inserted record ".$lastid);
+		}
 	}
 	echo $result;
 
-} else if (isset($_GET['update'])) {
-	// UPDATE COMMAND
-	$sql  = "UPDATE `inventory_miscs` SET name='" . mysqli_real_escape_string($connect, $_GET['name']);
-	$sql .= "', type='" . $_GET['type'];
-	$sql .= "', use_use='" . $_GET['use_use'];
-	$sql .= "', time='" . $_GET['time'];
-	($_GET['amount_is_weight'] == 'true') ? $sql .= "', amount_is_weight='1" : $sql .= "', amount_is_weight='0";
-	$sql .= "', use_for='" . mysqli_real_escape_string($connect, $_GET['use_for']);
-	$sql .= "', notes='" . mysqli_real_escape_string($connect, $_GET['notes']);
-	($_GET['always_on_stock'] == 'true') ? $sql .= "', always_on_stock='1" : $sql .= "', always_on_stock='0";
-	$sql .= "', inventory='" . $_GET['inventory'];
-	$sql .= "', cost='" . $_GET['cost'];
-	$sql .= "', production_date='" . $_GET['production_date'];
-	$sql .= "', tht_date='" . $_GET['tht_date'];
-	$sql .= "' WHERE record='" . $_GET['record'] . "';";
+} else if (isset($_POST['delete'])) {
+	// DELETE COMMAND
+	$sql = "DELETE FROM `inventory_miscs` WHERE record='".$_POST['record']."';";
 	$result = mysqli_query($connect, $sql);
 	if (! $result) {
 		syslog(LOG_NOTICE, "db_inventory_miscs: ".$sql." result: ".mysqli_error($connect));
 	} else {
-		syslog(LOG_NOTICE, "db_inventory_miscs: updated record ".$_GET['record']);
-	}
-	echo $result;
-
-} else if (isset($_GET['delete'])) {
-	// DELETE COMMAND
-	$sql = "DELETE FROM `inventory_miscs` WHERE record='".$_GET['record']."';";
-	$result = mysqli_query($connect, $sql);
-	if (! $result) {
-		syslog(LOG_NOTICE, "db_inventory_miscs: ".$sql." result: ".mysqli_error($connect));
-	} else {
-		syslog(LOG_NOTICE, "db_inventory_miscs: deleted record ".$_GET['record']);
+		syslog(LOG_NOTICE, "db_inventory_miscs: deleted record ".$_POST['record']);
 	}
 	echo $result;
 
 } else {
 	// SELECT COMMAND
+	$query = "SELECT * FROM inventory_miscs ORDER BY name";
 	$result = mysqli_query($connect, $query) or die("SQL Error 1: " . mysqli_error($connect));
 	while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
 		$miscs[] = array(
@@ -83,7 +84,7 @@
 			'use_for' => $row['use_for'],
 			'notes' => $row['notes'],
 			'always_on_stock' => $row['always_on_stock'],
-			'inventory' => $row['inventory'],
+			'inventory' => floatval($row['inventory']) * 1000.0,
 			'cost' => $row['cost'],
 			'production_date' => $row['production_date'],
 			'tht_date' => $row['tht_date']
--- a/www/inv_miscs.php	Wed Jan 23 22:53:24 2019 +0100
+++ b/www/inv_miscs.php	Thu Jan 24 20:54:45 2019 +0100
@@ -13,40 +13,45 @@
    <div id="popupWindow">
     <div>Wijzig ingredient.</div>
     <div style="overflow: hidden;">
-     <table>
+     <table style="width: 100%;">
       <tr>
        <td align="right" style="vertical-align: top;">Ingredient naam:</td>
        <td align="left" colspan="3" style="vertical-align: top;"><input id="name" /></td>
       </tr>
       <tr>
-       <td align="right" style="vertical-align: top;">Soort:</td>
-       <td align="left"><div id="type" /></div></td>
-       <td align="right" style="vertical-align: top;">Gebruik tijdens:</td>
-       <td align="left"><div id="use_use" /></div></td>
-      </tr>
-      <tr>
-       <td align="right" style="vertical-align: top;">Gebruik tijd:</td>
-       <td align="left" style="vertical-align: top;"><input id="time" /></td>
-       <td align="right" style="vertical-align: top;">Hoeveelheid is gewicht:</td>
-       <td align="left"><div id="amount_is_weight"></div></td>
-      </tr>
-      <tr>
-       <td align="right" style="vertical-align: top;">Toepassing:</td>
-       <td align="left" colspan="3"><textarea id="use_for"></textarea></td>
-      </tr>
-      <tr>
        <td align="right" style="vertical-align: top;">Opmerkingen:</td>
        <td align="left" colspan="3"><textarea id="notes"></textarea></td>
       </tr>
       <tr>
-       <td align="right" style="vertical-align: top;">Altijd op voorraad::</td>
-       <td align="left" colspan="3"><div id="always_on_stock"></div></td>
+       <td align="right" style="vertical-align: top;">Type:</td>
+       <td align="left"><div id="type" /></div></td>
+       <td align="right" style="vertical-align: top;"><div id="pmpt_inventory">Voorraad xx:</div></td>
+       <td align="left"><div id="inventory"></div></td>
+      </tr>
+      <tr>
+       <td align="right" style="vertical-align: top;">Eenheid is gewicht:</td>
+       <td align="left"><div id="amount_is_weight"></div></td>
+       <td align="right" style="vertical-align: top;"><div id="pmpt_cost">Prijs per xx:</div></td>
+       <td align="left"><div id="cost"></div></td>
       </tr>
       <tr>
-       <td align="right" style="vertical-align: top;">Voorraad:</td>
-       <td align="left"><div id="inventory"></div></td>
-       <td align="right" style="vertical-align: top;">Prijs:</td>
-       <td align="left"><div id="cost"></div></td>
+       <td align="right" style="vertical-align: top;">Toevoegen:</td>
+       <td align="left"><div id="use_use" /></div></td>
+       <td align="right" style="vertical-align: top;">Waarde voorraad:</td>
+       <td align="left"><div id="totval"></div></td>
+      </tr>
+      <tr>
+       <td align="right" style="vertical-align: top;">Tijd minuten:</td>
+       <td align="left"><div id="time" /></div></td>
+       <td align="right" style="vertical-align: top;">Altijd op voorraad::</td>
+       <td align="left"><div id="always_on_stock"></div></td>
+      </tr>
+      <tr>
+       <td align="right" style="vertical-align: top;">Toepassing:</td>
+       <td align="left"i colspan="3"><textarea id="use_for"></textarea></td>
+      </tr>
+      <tr>
+       <td colspan="4">&nbsp;</td>
       </tr>
       <tr>
        <td align="right" style="vertical-align: top;">Productie datum:</td>
@@ -55,12 +60,12 @@
        <td align="left" style="vertical-align: top;"><div id="tht_date"></div></td>
       </tr>
       <tr>
-       <td style="padding-top: 10px;" align="right"><input type="button" id="Delete" value="Delete" /></td>
+       <td style="padding-top: 110px;" align="right"><input type="button" id="Delete" value="Verwijder" /></td>
        <td align="right"></td>
        <td align="right"></td>
-       <td style="padding-top: 10px;" align="right">
-        <input style="margin-right: 5px;" type="button" id="Save" value="Save" />
-        <input id="Cancel" type="button" value="Cancel" />
+       <td style="padding-top: 110px;" align="left">
+        <input style="margin-right: 5px;" type="button" id="Save" value="Sla op" />
+        <input id="Cancel" type="button" value="Annuleer" />
        </td>
       </tr>
      </table>
--- a/www/js/global.js	Wed Jan 23 22:53:24 2019 +0100
+++ b/www/js/global.js	Thu Jan 24 20:54:45 2019 +0100
@@ -140,12 +140,12 @@
 var YeastTypeAdapter = new $.jqx.dataAdapter(YeastTypeSource);
 
 var YeastFormData = [
-	{ id: 0, en: 'Liquid',  nl: 'vloeibaar' },
-	{ id: 1, en: 'Dry',     nl: 'droog' },
-	{ id: 2, en: 'Slant',   nl: 'schuine buis' },
-	{ id: 3, en: 'Culture', nl: 'slurry' },
-	{ id: 4, en: 'Frozen',  nl: 'ingevroren' },
-	{ id: 5, en: 'Bottle',  nl: 'depot' }
+	{ id: 0, en: 'Liquid',  nl: 'vloeibaar',    cells: 100000000000 },
+	{ id: 1, en: 'Dry',     nl: 'droog',        cells: 15000000000 },
+	{ id: 2, en: 'Slant',   nl: 'schuine buis', cells: 1700000000 },
+	{ id: 3, en: 'Culture', nl: 'slurry',       cells: 1700000000 },
+	{ id: 4, en: 'Frozen',  nl: 'ingevroren',   cells: 1700000000 },
+	{ id: 5, en: 'Bottle',  nl: 'depot',        cells: 1700000000 }
 ];
 var YeastFormSource = {
 	localdata: YeastFormData,
@@ -179,6 +179,37 @@
 };
 var StarterTypeAdapter = new $.jqx.dataAdapter(StarterTypeSource);
 
+var MiscTypeData = [
+	{ id: 0, en: 'Spice',          nl: 'specerij' },
+	{ id: 1, en: 'Herb',           nl: 'kruid' },
+	{ id: 2, en: 'Flavor',         nl: 'smaakstof' },
+	{ id: 3, en: 'Fining',         nl: 'klaringsmiddel' },
+	{ id: 4, en: 'Water agent',    nl: 'brouwzout' },
+	{ id: 5, en: 'Yeast nutrient', nl: 'gistvoeding' },
+	{ id: 6, en: 'Other',          nl: 'anders' }
+];
+var MiscTypeSource = {
+	localdata: MiscTypeData,
+	datatype: "array",
+	datafields: [{ name: 'id' }, { name: 'en' }, { name: 'nl' }]
+};
+var MiscTypeAdapter = new $.jqx.dataAdapter(MiscTypeSource);
+
+var MiscUseData = [
+	{ id: 0, en: 'Starter',   nl: 'starter' },
+	{ id: 1, en: 'Mash',      nl: 'maischen' },
+	{ id: 2, en: 'Boil',      nl: 'koken' },
+	{ id: 3, en: 'Primary',   nl: 'hoofdvergisting' },
+	{ id: 4, en: 'Secondary', nl: 'nagisting/lagering' },
+	{ id: 5, en: 'Bottling',  nl: 'bottelen' }
+];
+var MiscUseSource = {
+	localdata: MiscUseData,
+	datatype: "array",
+	datafields: [{ name: 'id' }, { name: 'en' }, { name: 'nl' }]
+};
+var MiscUseAdapter = new $.jqx.dataAdapter(MiscUseSource);
+
 
 
 
--- a/www/js/inv_miscs.js	Wed Jan 23 22:53:24 2019 +0100
+++ b/www/js/inv_miscs.js	Thu Jan 24 20:54:45 2019 +0100
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * Copyright (C) 2014-2018
+ * Copyright (C) 2014-2019
  *
  * Michiel Broek <mbroek at mbse dot eu>
  *
@@ -31,8 +31,8 @@
 		okButton: $('#delOk'),
 		cancelButton: $('#delCancel'),
 		initContent: function () {
-			$('#delOk').jqxButton({ width: '65px', theme: theme });
-			$('#delCancel').jqxButton({ width: '65px', theme: theme });
+			$('#delOk').jqxButton({ template: "danger", width: '65px', theme: theme });
+			$('#delCancel').jqxButton({ template: "success", width: '65px', theme: theme });
 			$('#delCancel').focus();
 		}
 	});
@@ -41,6 +41,25 @@
 
 
 $(document).ready(function () {
+
+	var dataRecord = {};
+
+	function calcTotal(cost, inventory) {
+
+		$('#totval').val(cost * (inventory / 1000));
+	}
+
+	function prompts(isweight) {
+
+		if (isweight) {
+			$("#pmpt_cost").html('Prijs per kg:');
+			$("#pmpt_inventory").html('Voorraad gram:');
+		} else {
+			$("#pmpt_cost").html('Prijs per liter:');
+			$("#pmpt_inventory").html('Voorraad ml:');
+		}
+	}
+
 	var url = "includes/db_inventory_miscs.php";
 	// prepare the data
 	var source = {
@@ -49,14 +68,14 @@
 		datafields: [
 			{ name: 'record', type: 'number' },
 			{ name: 'name', type: 'string' },
-			{ name: 'type', type: 'string' },
-			{ name: 'use_use', type: 'string' },
-			{ name: 'time', type: 'float' },
+			{ name: 'type', type: 'int' },
+			{ name: 'use_use', type: 'int' },
+			{ name: 'time', type: 'int' },
 			{ name: 'amount', type: 'float' },
-			{ name: 'amount_is_weight', type: 'bool' },
+			{ name: 'amount_is_weight', type: 'int' },
 			{ name: 'use_for', type: 'string' },
 			{ name: 'notes', type: 'string' },
-			{ name: 'always_on_stock', type: 'bool' },
+			{ name: 'always_on_stock', type: 'int' },
 			{ name: 'inventory', type: 'float' },
 			{ name: 'cost', type: 'float' },
 			{ name: 'production_date', type: 'string' },
@@ -72,6 +91,7 @@
 				url: url,
 				cache: false,
 				data: data,
+				type: "POST",
 				success: function (data, status, xhr) {
 					// delete command is executed.
 					commit(true);
@@ -88,6 +108,7 @@
 				url: url,
 				cache: false,
 				data: data,
+				type: "POST",
 				success: function (data, status, xhr) {
 					commit(true);
 				},
@@ -103,6 +124,7 @@
 				url: url,
 				cache: false,
 				data: data,
+				type: "POST",
 				success: function (data, status, xhr) {
 					// update command is executed.
 					commit(true);
@@ -113,21 +135,37 @@
 			});
 		}
 	};
-	var srcType = [ "Spice", "Fining", "Water Agent", "Herb", "Flavor", "Yeast nutrient", "Other" ];
-	var srcUse = [ "Boil", "Mash", "Primary", "Secondary", "Bottling" ];
 	// initialize the input fields.
-	$("#name").jqxInput({ theme: theme, width: 250, height: 23 });
-	$("#type").jqxDropDownList({ theme: theme, source: srcType, width: 130, height: 23, dropDownHeight: 220 });
-	$("#use_use").jqxDropDownList({ theme: theme, source: srcUse, width: 90, height: 23, dropDownHeight: 156 });
-	$("#time").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 70, height: 23, min: 0, decimalDigits: 2, spinButtons: true });
+	$("#name").jqxInput({ theme: theme, width: 640, height: 23 });
+	$("#notes").jqxInput({ theme: theme, width: 800, height: 100 });
+
+	$("#type").jqxDropDownList({theme: theme,
+		source: MiscTypeAdapter,
+		valueMember: 'id',
+		displayMember: 'nl',
+		width: 180,
+		height: 23,
+		autoDropDownHeight: true
+	});
+	$("#use_use").jqxDropDownList({
+		theme: theme,
+		source: MiscUseAdapter,
+		valueMember: 'id',
+		displayMember: 'nl',
+		width: 180,
+		height: 23,
+		autoDropDownHeight: true
+	});
+	$("#time").jqxNumberInput( PosInt );
 	$("#amount_is_weight").jqxCheckBox({ theme: theme, width: 120, height: 23 });
 	$("#use_for").jqxInput({ theme: theme, width: 640, height: 48 });
-	$("#notes").jqxInput({ theme: theme, width: 640, height: 100 });
 	$("#always_on_stock").jqxCheckBox({ theme: theme, width: 120, height: 23 });
-	$("#inventory").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 70, height: 23, min: 0, decimalDigits: 1, spinButtons: true });
-	$("#production_date").jqxDateTimeInput({ theme: theme, width: 100, height: 23, formatString: 'yyyy-MM-dd' });
-	$("#cost").jqxNumberInput({ inputMode: 'simple', spinMode: 'simple', theme: theme, width: 70, height: 23, min: 0, decimalDigits: 2, spinButtons: true });
-	$("#tht_date").jqxDateTimeInput({ theme: theme, width: 100, height: 23, formatString: 'yyyy-MM-dd' });
+	$("#inventory").jqxNumberInput( Spin1dec1 );
+	$("#production_date").jqxDateTimeInput( Dateopts );
+	$("#cost").jqxNumberInput( Spin2dec1 );
+	$("#tht_date").jqxDateTimeInput( Dateopts );
+	$("#totval").jqxNumberInput( Spin2dec1 );
+	$("#totval").jqxNumberInput({ width: 90, readOnly: true, spinButtons: false });
 
 	var dataAdapter = new $.jqx.dataAdapter(source);
 	var editrow = -1;
@@ -144,21 +182,21 @@
 			var addButton = $("<div style='float: right; margin-right: 15px;'><img style='position: relative; margin-top: 2px;' src='images/add.png'/><span style='margin-left: 4px; position: relative; top: -3px;'>Nieuw</span></div>");
 			container.append(addButton);
 			statusbar.append(container);
-			addButton.jqxButton({ theme: theme, width: 120, height: 20 });
+			addButton.jqxButton({ theme: theme, width: 90, height: 20 });
 			// add new row.
 			addButton.click(function (event) {
 				editrow = -1;
-				$("#popupWindow").jqxWindow({ position: { x: 230, y: 30 } });
+				$("#popupWindow").jqxWindow({ position: { x: 110, y: 30 } });
 				$("#name").val('');
-				$("#type").val('');
-				$("#use_use").val('');
-				$("#time").val('');
-				$("#amount_is_weight").val('');
+				$("#type").val(0);
+				$("#use_use").val(0);
+				$("#time").val(0);
+				$("#amount_is_weight").val(1);
 				$("#use_for").val('');
 				$("#notes").val('');
-				$("#always_on_stock").val('');
-				$("#inventory").val('');
-				$("#cost").val('');
+				$("#always_on_stock").val(0);
+				$("#inventory").val(0);
+				$("#cost").val(0);
 				$("#production_date").val('');
 				$("#tht_date").val('');
 				$("#popupWindow").jqxWindow('open');
@@ -167,21 +205,45 @@
 		filterable: true,
 		filtermode: 'excel',
 		columns: [
-			{ text: 'Ingredient naam', datafield: 'name', width: 525 },
-			{ text: 'Soort', datafield: 'type', align: 'center', cellsalign: 'center', width: 110 },
-			{ text: 'Gebruik', datafield: 'use_use', align: 'center', cellsalign: 'center', width: 100 },
-			{ text: 'Tijd', datafield: 'time', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f2' },
+			{ text: 'Ingredient naam', datafield: 'name' },
+			{ text: 'Type', datafield: 'type', align: 'center', cellsalign: 'center', width: 120,
+			  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
+				return "<div style='margin: 4px;' class='jqx-center-align'>" + MiscTypeData[value].nl + "</div>";
+			  }
+		       	},
+			{ text: 'Gebruik', datafield: 'use_use', align: 'center', cellsalign: 'center', width: 120,
+			  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
+				return "<div style='margin: 4px;' class='jqx-center-align'>" + MiscUseData[value].nl + "</div>";
+			  }
+			},
+			{ text: 'Tijd', datafield: 'time', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f0',
+			  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
+				if (value == 0)
+					return "<div style='margin: 4px;' class='jqx-right-align'></div>";
+				if (value == 1)
+					return "<div style='margin: 4px;' class='jqx-right-align'>1 minuut</div>";
+				if (value < 60)
+					return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value, "f0")+" minuten</div>";
+				if (value == 60)
+					return "<div style='margin: 4px;' class='jqx-right-align'>1 uur</div>";
+				if (value < 1440)
+					return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value / 60, "f0")+" uren</div>";
+				if (value == 1440)
+					return "<div style='margin: 4px;' class='jqx-right-align'>1 dag</div>";
+				return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value / 1440, "f0")+" dagen</div>";
+			  }
+		       	},
 			{ text: 'Voor. gr/ml.', datafield: 'inventory', width: 110, align: 'right', cellsalign: 'right' },
 			{ text: 'Prijs kg/l', datafield: 'cost', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'c2' },
 			{ text: 'THT datum', datafield: 'tht_date', width: 100, align: 'center', cellsalign: 'center' },
-			{ text: 'Wijzig', datafield: 'Edit', columntype: 'button', align: 'center', cellsrenderer: function () {
+			{ text: 'Wijzig', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
 				return "Wijzig";
 				}, buttonclick: function (row) {
 					// open the popup window when the user clicks a button.
 					editrow = row;
-					$("#popupWindow").jqxWindow({ position: { x: 230, y: 30 } });
+					$("#popupWindow").jqxWindow({ position: { x: 110, y: 30 } });
 					// get the clicked row's data and initialize the input fields.
-					var dataRecord = $("#jqxgrid").jqxGrid('getrowdata', editrow);
+					dataRecord = $("#jqxgrid").jqxGrid('getrowdata', editrow);
 					$("#name").val(dataRecord.name);
 					$("#type").val(dataRecord.type);
 					$("#use_use").val(dataRecord.use_use);
@@ -194,20 +256,47 @@
 					$("#cost").val(dataRecord.cost);
 					$("#production_date").val(dataRecord.production_date);
 					$("#tht_date").val(dataRecord.tht_date);
+					calcTotal(dataRecord.cost, dataRecord.inventory);
+					prompts(dataRecord.amount_is_weight);
 					// show the popup window.
 					$("#popupWindow").jqxWindow('open');
 				}
 			}
 		]
 	});
+
+	$("#cost").on('change', function (event) {
+		dataRecord.cost = parseFloat(event.args.value);
+		calcTotal(dataRecord.cost, dataRecord.inventory);
+	});
+	$("#inventory").on('change', function (event) {
+		dataRecord.inventory = parseFloat(event.args.value);
+		calcTotal(dataRecord.cost, dataRecord.inventory);
+	});
+	$("#amount_is_weight").on('checked', function (event) {
+		dataRecord.amount_is_weight = true;
+		prompts(true);
+	});
+	$("#amount_is_weight").on('unchecked', function (event) {
+		dataRecord.amount_is_weight = false;
+		prompts(false);
+	});
+
 	// initialize the popup window and buttons.
 	$("#popupWindow").jqxWindow({
-		width: 860, resizable: false, theme: theme, isModal: true, autoOpen: false, cancelButton: $("#Cancel"), modalOpacity: 0.40
+		width: 1050,
+		height: 550,
+		resizable: false,
+		theme: theme,
+		isModal: true,
+		autoOpen: false,
+		cancelButton: $("#Cancel"),
+		modalOpacity: 0.40
 	});
 	$("#popupWindow").on('open', function () {
 		$("#name").jqxInput('selectAll');
 	});
-	$("#Delete").jqxButton({ theme: theme });
+	$("#Delete").jqxButton({ template: "danger", width: '90px', theme: theme });
 	$("#Delete").click(function () {
 		if (editrow >= 0) {
 			// Open a popup to confirm this action.
@@ -219,49 +308,36 @@
 		}
 		$("#popupWindow").jqxWindow('hide');
 	});
-	$("#Cancel").jqxButton({ theme: theme });
-	$("#Save").jqxButton({ theme: theme });
+	$("#Cancel").jqxButton({ template: "primary", width: '90px', theme: theme });
+	$("#Save").jqxButton({ template: "success", width: '90px', theme: theme });
 	// update the edited row when the user clicks the 'Save' button.
 	$("#Save").click(function () {
+		var rowID = -1;
 		if (editrow >= 0) {
-			var rowID = $('#jqxgrid').jqxGrid('getrowid', editrow);
-			var row = {
-				record: rowID,
-				name: $("#name").val(),
-				type: $("#type").val(),
-				use_use: $("#use_use").val(),
-				time: parseFloat($("#time").jqxNumberInput('decimal')),
-				amount_is_weight: $("#amount_is_weight").val(),
-				use_for: $("#use_for").val(),
-				notes: $("#notes").val(),
-				always_on_stock: $("#always_on_stock").val(),
-				inventory: parseFloat($("#inventory").jqxNumberInput('decimal')),
-				cost: parseFloat($("#cost").jqxNumberInput('decimal')),
-		                production_date: $("#production_date").val(),
-		                tht_date: $("#tht_date").val()
-			};
+			rowID = $('#jqxgrid').jqxGrid('getrowid', editrow);
+		}
+		var row = {
+			record: rowID,
+			name: $("#name").val(),
+			type: $("#type").val(),
+			use_use: $("#use_use").val(),
+			time: parseFloat($("#time").jqxNumberInput('decimal')),
+			amount_is_weight: $("#amount_is_weight").val(),
+			use_for: $("#use_for").val(),
+			notes: $("#notes").val(),
+			always_on_stock: $("#always_on_stock").val(),
+			inventory: parseFloat($("#inventory").jqxNumberInput('decimal')),
+			cost: parseFloat($("#cost").jqxNumberInput('decimal')),
+	                production_date: $("#production_date").val(),
+	                tht_date: $("#tht_date").val()
+		};
+		if (editrow >= 0) {
 			$('#jqxgrid').jqxGrid('updaterow', rowID, row);
-			$("#popupWindow").jqxWindow('hide');
 		} else {
-			// Insert a record
-			var newrow = {
-				record: -1,
-				name: $("#name").val(),
-				type: $("#type").val(),
-				use_use: $("#use_use").val(),
-				time: parseFloat($("#time").jqxNumberInput('decimal')),
-				amount_is_weight: $("#amount_is_weight").val(),
-				use_for: $("#use_for").val(),
-				notes: $("#notes").val(),
-				always_on_stock: $("#always_on_stock").val(),
-				inventory: parseFloat($("#inventory").jqxNumberInput('decimal')),
-				cost: parseFloat($("#cost").jqxNumberInput('decimal')),
-				production_date: $("#production_date").val(),
-				tht_date: $("#tht_date").val()
-			};
-			$('#jqxgrid').jqxGrid('addrow', null, newrow);
-			$("#popupWindow").jqxWindow('hide');
+			$('#jqxgrid').jqxGrid('addrow', null, row);
 		}
+		$("#popupWindow").jqxWindow('hide');
+		location.reload( true );        // reload ourself.
 	});
 	createDelElements();
 });
--- a/www/js/inv_yeasts.js	Wed Jan 23 22:53:24 2019 +0100
+++ b/www/js/inv_yeasts.js	Thu Jan 24 20:54:45 2019 +0100
@@ -73,7 +73,8 @@
 			{ name: 'inventory', type: 'float' },
 			{ name: 'cost', type: 'float' },
 			{ name: 'production_date', type: 'string' },
-			{ name: 'tht_date', type: 'string' }
+			{ name: 'tht_date', type: 'string' },
+			{ name: 'cells', type: 'float' }
 		],
 		id: 'record',
 		url: url,

mercurial