From d1eb78da3f4da8968e59d272264859f45ad62517 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Fri, 5 Dec 2014 00:16:47 +0000 Subject: [PATCH] Work event item frontend --- RIGS/static/js/interaction.js | 143 +++++++++++++--------------- RIGS/templates/RIGS/item_row.html | 10 +- RIGS/templates/RIGS/item_table.html | 34 ++++++- db.sqlite3 | Bin 25445376 -> 25445376 bytes 4 files changed, 100 insertions(+), 87 deletions(-) diff --git a/RIGS/static/js/interaction.js b/RIGS/static/js/interaction.js index 6b7eff6f..b87c0135 100644 --- a/RIGS/static/js/interaction.js +++ b/RIGS/static/js/interaction.js @@ -1,77 +1,48 @@ function setupItemTable(items_json) { objectitems = JSON.parse(items_json) - $.each(objectitems, function(key, val) { + $.each(objectitems, function (key, val) { objectitems[key] = JSON.parse(val); }) - newitem = -1 + newitem = -1; } function updatePrices() { // individual rows - $('.item_row').each(function() { - var pk = $(this).data('pk'); + var sum = 0; + for (var pk in objectitems) { var fields = objectitems[pk].fields; var sub = fields.cost * fields.quantity; - $('#item-'+pk+' .sub-total').html(parseFloat(sub).toFixed(2)).data('subtotal', sub); - }) + $('#item-' + pk + ' .sub-total').html(parseFloat(sub).toFixed(2)).data('subtotal', sub); - var sum = 0; - - $('.sub-total').each(function() { - sum += Number($(this).data('subtotal')); - }); - $('#sumtotal').text(parseFloat(sum).toFixed(2)); - var vat = sum * Number($('#vat-rate').data('rate')); - $('#vat').text(parseFloat(vat).toFixed(2)); - $('#total').text(parseFloat(sum+vat).toFixed(2)); -} - -function addItemRow(url) { - $tbody = $('#item-table tbody'); - $.ajax({ - url:url, - success:function(r) { - $tbody.append(r); - updatePrices(); - } - }); -} - -var csrftoken = $.cookie('csrftoken'); -function csrfSafeMethod(method) { - // these HTTP methods do not require CSRF protection - return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); -} -$.ajaxSetup({ - crossDomain: false, // obviates need for sameOrigin test - beforeSend: function(xhr, settings) { - if (!csrfSafeMethod(settings.type)) { - xhr.setRequestHeader("X-CSRFToken", csrftoken); - } + sum += Number(sub); } -}); -$('#item-table').on('click', '.item-delete', function() { - delete objectitems[$(this).data('pk')] - $('#item-'+$(this).data('pk')).remove(); + $('#sumtotal').text(parseFloat(sum).toFixed(2)); + var vat = sum * Number($('#vat-rate').data('rate')); + $('#vat').text(parseFloat(vat).toFixed(2)); + $('#total').text(parseFloat(sum + vat).toFixed(2)); +} + +$('#item-table').on('click', '.item-delete', function () { + delete objectitems[$(this).data('pk')] + $('#item-' + $(this).data('pk')).remove(); updatePrices(); }); -$('#item-table').on('click', '.item-add', function() { - $('#item-form').data('pk', newitem--); +$('#item-table').on('click', '.item-add', function () { + $('#item-form').data('pk', newitem); // Set the form values - var fields = objectitems[pk].fields; $('#item_name').val(''); $('#item_description').val(''); $('#item_quantity').val(''); $('#item_cost').val(''); }); -$('#item-table').on('click', '.item-edit', function() { +$('#item-table').on('click', '.item-edit', function () { // set the pk as we will need this later var pk = $(this).data('pk'); - $('#item-form').data('pk', pk); + $('#item-form').data('pk', pk); // Set the form values var fields = objectitems[pk].fields; @@ -81,54 +52,74 @@ $('#item-table').on('click', '.item-edit', function() { $('#item_cost').val(fields.cost); }); -$('body').on('submit','#item-form', function(e) { - e.preventDefault(); +$('body').on('submit', '#item-form', function (e) { + e.preventDefault(); var pk = $(this).data('pk'); $('#itemModal').modal('hide'); - if(pk < 0) { - // @todo: Add new item + var fields; + if (pk == newitem--) { + // Create the new data structure and add it on. + fields = new Object(); + fields['name'] = $('#item_name').val() + fields['description'] = $('#item_description').val(); + fields['cost'] = $('#item_cost').val(); + fields['quantity'] = $('#item_quantity').val(); + + var order = 0; + for (item in objectitems) { + order++; + } + + fields['order'] = order; + + objectitems[pk] = new Object(); + objectitems[pk]['fields'] = fields; + + // Add the new table + $('#new-item-row').clone().attr('id', 'item-' + pk).data('pk', pk).appendTo('#item-table-body'); } else { + // Existing item // update data structure - var fields = objectitems[pk].fields; + fields = objectitems[pk].fields; fields.name = $('#item_name').val() fields.description = $('#item_description').val(); fields.cost = $('#item_cost').val(); fields.quantity = $('#item_quantity').val(); objectitems[pk].fields = fields; - // update the table - $row = $('#item-'+pk); - $row.find('.name').html(fields.name); - $row.find('.description').html(fields.description); - $row.find('.cost').html(parseFloat(fields.cost).toFixed(2)); - $row.find('.quantity').html(fields.quantity); - - updatePrices(); } + // update the table + $row = $('#item-' + pk); + $row.find('.name').html(fields.name); + $row.find('.description').html(fields.description); + $row.find('.cost').html(parseFloat(fields.cost).toFixed(2)); + $row.find('.quantity').html(fields.quantity); + + updatePrices(); }); -$('body').on('submit', '.itemised_form', function(e) { +$('body').on('submit', '.itemised_form', function (e) { $('#id_items_json').val(JSON.stringify(objectitems)); }); // Return a helper with preserved width of cells -var fixHelper = function(e, ui) { - ui.children().each(function() { - $(this).width($(this).width()); - }); - return ui; +var fixHelper = function (e, ui) { + ui.children().each(function () { + $(this).width($(this).width()); + }); + return ui; }; $("#item-table tbody").sortable({ - helper: fixHelper, - update: function(e, ui) { - info = $(this).sortable("toArray"); - itemorder = new Array(); - $.each(info, function(key, value) { - pk = $('#'+value).data('pk'); - objectitems[pk].fields.order = key; - }); + helper: fixHelper, + update: function (e, ui) { + info = $(this).sortable("toArray"); + itemorder = new Array(); + $.each(info, function (key, value) { + pk = $('#' + value).data('pk'); + objectitems[pk].fields.order = key; + }); - } + } }); \ No newline at end of file diff --git a/RIGS/templates/RIGS/item_row.html b/RIGS/templates/RIGS/item_row.html index ce55dc14..1ceb6f9f 100644 --- a/RIGS/templates/RIGS/item_row.html +++ b/RIGS/templates/RIGS/item_row.html @@ -1,11 +1,9 @@ - + {{ item.name }} - {% if item.description %} -
- {{item.description|linebreaksbr}} -
- {% endif %} +
+ {{item.description|linebreaksbr}} +
£ {{item.cost|floatformat:2}} {{item.quantity}} diff --git a/RIGS/templates/RIGS/item_table.html b/RIGS/templates/RIGS/item_table.html index 8a849ece..7d5e701f 100644 --- a/RIGS/templates/RIGS/item_table.html +++ b/RIGS/templates/RIGS/item_table.html @@ -17,7 +17,7 @@ {% endif %} - + {% for item in object.items.all %} {% include 'RIGS/item_row.html' %} {% endfor %} @@ -26,17 +26,41 @@ Sum Total - £ {{object.sum_total}} + £ {{object.sum_total|default:0|floatformat:2}} VAT @ - {{object.vat_rate.as_percent|floatformat}}% - £ {{object.vat|floatformat:2}} + {{object.vat_rate.as_percent|floatformat|default:"TBD"}}% + £ {{object.vat|default:0|floatformat:2}} Total - £ {{object.total|floatformat:2}} + £ {{object.total|default:0|floatformat:2}} + + + + + + + {% if edit %} + + {% endif %} + + diff --git a/db.sqlite3 b/db.sqlite3 index cc3554a3875cdf6857e2383420659e68da18cf2b..4a10371acb3c62c9f228d854fc6f4dd47553abe8 100644 GIT binary patch delta 8978 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 H!IA$4;v}se delta 8141 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 YGw;Q9Xmv#%SPb$(0Vt%s6&Bj|UwG8#l>h($