diff -r 10c6eeee60ce -r 4f14a18b581e www/js/prod_divide.js --- a/www/js/prod_divide.js Wed Sep 18 22:50:44 2019 +0200 +++ b/www/js/prod_divide.js Thu Sep 19 22:35:02 2019 +0200 @@ -33,8 +33,39 @@ autoDropDownHeight: true }); + // Calculate the volume in the main batch. + function calcLeftover() { + rows = $('#splitGrid').jqxGrid('getrows'); + leftover = Round(available, 1); + for (i = 0; i < rows.length; i++) { + row = rows[i]; + leftover -= row.split_size; + //console.log('i:' + i + ' split_size:' + row.split_size); + } + $('#leftover').val(leftover); + //console.log('calcLeftover():' + leftover); + } + + // Calculate available volume but ignore the current row. + function calcRoom(r) { + var rows, row, i, vol = 0; + + rows = $('#splitGrid').jqxGrid('getrows'); + for (i = 0; i < rows.length; i++) { + row = rows[i]; + if (i != r) + vol += row.split_size; + } + maxvolume = Round(available - minvolume - vol, 1); + console.log('calcRoom(' + r + '):' + vol + ' room:' + maxvolume); + } + var dataRecord = {}, i, + available = 0, + leftover = 0, + minvolume = 0, + maxvolume = 0, url = 'includes/db_product.php', // Prepare the data @@ -245,11 +276,11 @@ { name: 'divide_size', type: 'float' }, { name: 'divide_parts', type: 'int' }, { name: 'divide_from', type: 'string' }, - { name: 'fermentables', type: 'array' }, - { name: 'hops', type: 'array' }, - { name: 'miscs', type: 'array' }, - { name: 'yeasts', type: 'array' }, - { name: 'mashs', type: 'array' } + { name: 'fermentables', type: 'string' }, + { name: 'hops', type: 'string' }, + { name: 'miscs', type: 'string' }, + { name: 'yeasts', type: 'string' }, + { name: 'mashs', type: 'string' } ], id: 'record', url: url + '?record=' + my_record @@ -284,6 +315,7 @@ cache: false, async: false, datafields: [ + { name: 'split_code', type: 'string' }, { name: 'split_name', type: 'string' }, { name: 'split_size', type: 'float' } ], @@ -299,39 +331,74 @@ splitAdapter = new $.jqx.dataAdapter(splitSource, {}); $('#splitGrid').jqxGrid({ width: 1240, - height: 400, + height: 375, source: splitAdapter, + editable: true, + enabletooltips: true, + selectionmode: 'singlecell', + editmode: 'click', theme: theme, - selectionmode: 'singlerow', showtoolbar: true, rendertoolbar: function(toolbar) { var container = $('
'); toolbar.append(container); container.append(''); container.append(''); - $('#saddrowbutton').jqxButton({ template: 'primary', theme: theme, height: 27, width: 150 }); + $('#saddrowbutton').jqxButton({ template: 'primary', theme: theme, disabled: true, height: 27, width: 150 }); $('#saddrowbutton').on('click', function() { var row = {}, rowscount = $('#splitGrid').jqxGrid('getdatainformation').rowscount; + row['split_code'] = dataRecord.code + '-' + (rowscount + 1); row['split_name'] = dataRecord.name + ' ' + (rowscount + 1); row['split_size'] = 0; $('#splitGrid').jqxGrid('addrow', null, row); + $('#sdeleterowbutton').jqxButton({ disabled: false }); // Enable delete + $('#divide_type').jqxDropDownList({ disabled: true }); // Disable dropdown }); - // delete selected split - $('#sdeleterowbutton').jqxButton({ template: 'danger', theme: theme, height: 27, width: 150 }); + // Delete last added split + $('#sdeleterowbutton').jqxButton({ template: 'danger', theme: theme, disabled: true, height: 27, width: 150 }); $('#sdeleterowbutton').on('click', function() { - var rowscount, id, selectedrowindex = $('#splitGrid').jqxGrid('getselectedrowindex'); + var rowscount, id, row; rowscount = $('#splitGrid').jqxGrid('getdatainformation').rowscount; - if (selectedrowindex >= 0 && selectedrowindex < rowscount) { - id = $('#splitGrid').jqxGrid('getrowid', selectedrowindex); - $('#splitGrid').jqxGrid('deleterow', id); + id = $('#splitGrid').jqxGrid('getrowid', rowscount - 1); + // First, give back this batch volume. + row = $('#splitGrid').jqxGrid('getrowdata', id); + leftover += row.split_size; + if (leftover > available) + leftover = available; + $('#leftover').val(leftover); + // Then delete the row. + $('#splitGrid').jqxGrid('deleterow', id); + if (rowscount == 1) { + $('#sdeleterowbutton').jqxButton({ disabled: true }); // No more rows + $('#divide_type').jqxDropDownList({ disabled: false }); } }); }, columns: [ + { text: 'Splits code', datafield: 'split_code', width: 120, editable: false }, { text: 'Splits naam', datafield: 'split_name' }, - { text: 'Splits volume', datafield: 'split_size', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f2' } + { text: 'Splits volume', datafield: 'split_size', width: 120, align: 'right', cellsalign: 'right', cellsformat: 'f1', columntype: 'numberinput', + validation: function (cell, value) { + if (value < 0 || value > maxvolume) { + return { result: false, message: 'Volume should be between 0 and ' + maxvolume + ' liter' }; + } + return true; + }, + createeditor: function (row, cellvalue, editor) { + editor.jqxNumberInput({ decimalDigits: 1, digits: 3 }); + } + } ] }); + $('#splitGrid').on('cellbeginedit', function (event) { + var args = event.args; + calcRoom(args.rowindex); // Make maxvolume available. + }); + $('#splitGrid').on('cellvaluechanged', function (event) { + var args = event.args; + //console.log("cellvaluechanged, Column: " + args.datafield + ", Row: " + (1 + args.rowindex) + ", Value: " + args.value); + calcLeftover(); + }); }; dataAdapter.dataBind(); @@ -344,9 +411,43 @@ $('#code').jqxInput({ theme: theme, width: 100, height: 23 }); $('#stage').jqxTooltip({ content: 'De productie fase van dit product.' }); $('#stage').jqxInput({ theme: theme, width: 100, height: 23 }); + $('#available').jqxNumberInput(Show1dec); + $('#leftover').jqxNumberInput(Show1dec); $('#divide_type').val(0); $('#divide_type').on('change', function(event) { - dataRecord.divide_type = event.args.index; + var index = event.args.index; + console.log('divide_type:' + index); + dataRecord.divide_type = index; + switch (index) { + case 0: + available = 0; + break; + case 1: + available = dataRecord.boil_size; + break; + case 2: + available = dataRecord.batch_size; + break; + case 3: + available = dataRecord.brew_fermenter_volume; + break; + case 4: + case 5: + available = Round(dataRecord.brew_fermenter_volume * 0.92, 1); // Estimate volume without yeast trub + break; + case 6: + available = dataRecord.package_volume; + break; + } + leftover = available; + minvolume = Round(0.1 * available, 1); + $('#available').val(available); + $('#leftover').val(leftover); + if (index != 0) { + $('#saddrowbutton').jqxButton({ disabled: false }); + } else { + $('#saddrowbutton').jqxButton({ disabled: true }); + } }); $('#Cancel').jqxButton({ template: 'primary', width: '80px', theme: theme }); @@ -356,6 +457,24 @@ $('#Save').jqxButton({ template: 'success', width: '80px', theme: theme }); $('#Save').bind('click', function() { + var rows, row, i, batch; + if (leftover != available) { + console.log('Save and there are splits'); + + rows = $('#splitGrid').jqxGrid('getrows'); + for (i = 0; i < rows.length; i++) { + row = rows[i]; + console.log('split ' + i); +// batch = dataRecord; +// batch.divide_from = batch.uuid; +// batch.divide_size = row.split_size; +// batch.divide_parts = rows.length; +// delete batch['uuid']; +// batch.record = -1; +// batch.name = row.split_name; +// batch.code = row.split_code; + } + } // saveRecord(1); });