/* Society Self-Service Copyright © 2018-2019 Yingtong Li (RunasSudo) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ function recalcTotal(args) { var total = 0; var gst = 0; for (var row of args.grid.data) { total += row['Unit price\n(incl GST)'] * row['Units']; if (!row['GST-free']) { gst += (row['Unit price\n(incl GST)'] * row['Units']) / 11; } } $(args.grid._body).find('.totalrow').remove(); var totalrow = $(''); totalrow.append($('Includes GST of:').prop('colspan', args.grid.fields.length - (editing ? 2 : 1))); totalrow.append($('').text('$' + gst.toFixed(2))); if (editing) { totalrow.append($('')); } $(args.grid._body).find('tr:last').after(totalrow); var totalrow = $(''); totalrow.append($('Total:').prop('colspan', args.grid.fields.length - (editing ? 2 : 1))); totalrow.append($('').text('$' + total.toFixed(2))); if (editing) { totalrow.append($('')); } $(args.grid._body).find('tr:last').after(totalrow); } // Allow floats function FloatNumberField(config) { jsGrid.NumberField.call(this, config); } FloatNumberField.prototype = new jsGrid.NumberField({ filterValue: function() { return parseFloat(this.filterControl.val()); }, insertValue: function() { return parseFloat(this.insertControl.val()); }, editValue: function() { return parseFloat(this.editControl.val()); } }); jsGrid.fields.float = FloatNumberField; function makeGrid() { f = [ { name: 'Description', type: 'text', width: '50%', validate: 'required' }, { name: 'Unit price\n(incl GST)', type: 'float', width: '12.5%', validate: 'required', itemTemplate: function(value, item) { return '$' + value.toFixed(2); } }, { name: 'Units', type: 'float', width: '12.5%', validate: 'required' }, { name: 'GST-free', type: 'checkbox', width: '5%' }, { name: 'Total', align: 'right', width: '10%', itemTemplate: function(value, item) { return '$' + (item['Unit price\n(incl GST)'] * item['Units']).toFixed(2); } }, ]; if (editing) { f.push({ type: 'control', width: '10%', modeSwitchButton: false }); } $('#items_grid').jsGrid({ width: '100%', height: editing ? '20em' : 'auto', inserting: editing, editing: editing, noDataContent: editing ? 'No entries. Enter details above then click the green plus icon.' : 'No entries', data: items_data, fields: f, onItemUpdated: recalcTotal, onRefreshed: recalcTotal, }); if (!editing) { $('.jsgrid-filter-row, .jsgrid-insert-row').attr('style', 'display: none !important;'); /* Override Semantic UI */ } }