diff --git a/tailbone/templates/receiving/view.mako b/tailbone/templates/receiving/view.mako index 72758aae..1bd2427e 100644 --- a/tailbone/templates/receiving/view.mako +++ b/tailbone/templates/receiving/view.mako @@ -9,10 +9,11 @@ % if not batch.executed: // keep track of which cost value is currently being edited - var editing = null; + var editing_catalog_cost = null; + var editing_invoice_cost = null; function start_editing(td) { - var value = 0; + var value = null; var text = td.text().replace(/^\s+|\s+$/g, ''); if (text) { td.data('previous-value', text); @@ -21,27 +22,58 @@ } var input = $(''); td.append(input); - input.val(value.toString()).select().focus(); - editing = td; + value = value ? value.toString() : ''; + input.val(value).select().focus(); } - function start_editing_next() { - var tr = editing.parents('tr:first'); + function start_editing_catalog_cost(td) { + start_editing(td); + editing_catalog_cost = td; + } + + function start_editing_invoice_cost(td) { + start_editing(td); + editing_invoice_cost = td; + } + + function start_editing_next_catalog_cost() { + var tr = editing_catalog_cost.parents('tr:first'); var next = tr.next('tr:first'); if (next.length) { - start_editing(next.find('td.invoice_unit_cost')); + start_editing_catalog_cost(next.find('td.catalog_unit_cost')); + } else { + editing_catalog_cost = null; } } - function cancel_edit() { - var input = editing.find('input'); + function start_editing_next_invoice_cost() { + var tr = editing_invoice_cost.parents('tr:first'); + var next = tr.next('tr:first'); + if (next.length) { + start_editing_invoice_cost(next.find('td.invoice_unit_cost')); + } else { + editing_invoice_cost = null; + } + } + + function cancel_edit(td) { + var input = td.find('input'); input.blur(); input.remove(); - var value = editing.data('previous-value'); + var value = td.data('previous-value'); if (value) { - editing.text(value); + td.text(value); } - editing = null; + } + + function cancel_edit_catalog_cost() { + cancel_edit(editing_catalog_cost); + editing_catalog_cost = null; + } + + function cancel_edit_invoice_cost() { + cancel_edit(editing_invoice_cost); + editing_invoice_cost = null; } % endif @@ -49,13 +81,80 @@ $(function() { % if not batch.executed: - $('.grid-wrapper').on('click', '.grid td.invoice_unit_cost', function() { - if (editing) { - editing.find('input').focus(); + $('.grid-wrapper').on('click', '.grid td.catalog_unit_cost', function() { + if (editing_catalog_cost) { + editing_catalog_cost.find('input').focus(); + return + } + if (editing_invoice_cost) { + editing_invoice_cost.find('input').focus(); return } var td = $(this); - start_editing(td); + start_editing_catalog_cost(td); + }); + + $('.grid-wrapper').on('click', '.grid td.invoice_unit_cost', function() { + if (editing_invoice_cost) { + editing_invoice_cost.find('input').focus(); + return + } + if (editing_catalog_cost) { + editing_catalog_cost.find('input').focus(); + return + } + var td = $(this); + start_editing_invoice_cost(td); + }); + + $('.grid-wrapper').on('keyup', '.grid td.catalog_unit_cost input', function(event) { + var input = $(this); + + // let numeric keys modify input value + if (! key_modifies(event)) { + + // when user presses Enter while editing cost value, submit + // value to server for immediate persistence + if (event.which == 13) { + $('.grid-wrapper').mask("Updating cost..."); + var url = '${url('receiving.update_row_cost', uuid=batch.uuid)}'; + var td = input.parents('td:first'); + var tr = td.parents('tr:first'); + var data = { + '_csrf': $('[name="_csrf"]').val(), + 'row_uuid': tr.data('uuid'), + 'catalog_unit_cost': input.val() + }; + $.post(url, data, function(data) { + if (data.error) { + alert(data.error); + } else { + var total = null; + + // update catalog cost for row + td.text(data.row.catalog_unit_cost); + + // mark cost as confirmed + if (data.row.catalog_cost_confirmed) { + tr.addClass('catalog_cost_confirmed'); + } + + input.blur(); + input.remove(); + start_editing_next_catalog_cost(); + } + $('.grid-wrapper').unmask(); + }); + + // When user presses Escape while editing totals, cancel the edit. + } else if (event.which == 27) { + cancel_edit_catalog_cost(); + + // Most other keys at this point should be unwanted... + } else if (! key_allowed(event)) { + return false; + } + } }); $('.grid-wrapper').on('keyup', '.grid td.invoice_unit_cost input', function(event) { @@ -100,14 +199,14 @@ input.blur(); input.remove(); - start_editing_next(); + start_editing_next_invoice_cost(); } $('.grid-wrapper').unmask(); }); // When user presses Escape while editing totals, cancel the edit. } else if (event.which == 27) { - cancel_edit(); + cancel_edit_invoice_cost(); // Most other keys at this point should be unwanted... } else if (! key_allowed(event)) { @@ -167,13 +266,16 @@ ${parent.extra_styles()} % if not batch.executed and master.has_perm('edit_row'):