Lunaresk f41fdd076b major: add dynamic receipt item forms
New:
- Added the possibility to insert custom items on receipt upload in case
the receipt couldn't be read.
Changes:
- Changed the display of the sum at the overview. You now see what you
owe your establishment instead of just seeing how much you bought.
- In addition the sum in the overview now accounts for membership time.
You don't have to pay for something bought after you moved out for
example.
2023-11-26 23:16:05 +01:00

154 lines
4.8 KiB
JavaScript

function requesting_checkbox_pressed() {
var $radiobuttongroup = $(this).parent().next().next().next()
var $itemid = $(this).parent().parent().attr('id')
if ($(this).prop("checked")) {
$radiobuttongroup.show()
var $radiobuttons = $radiobuttongroup.children()
$radiobuttons.each(function (i) {
var $radiobutton = $(this).children().get(0)
if ($radiobutton.checked) {
switch (parseInt($radiobutton.value)) {
case 1:
$("#" + $itemid + "_new").show();
break;
case 2:
$("#" + $itemid + "_existing").show();
break;
}
}
})
} else {
$radiobuttongroup.hide()
$("#" + $itemid + "_new").hide();
$("#" + $itemid + "_existing").hide();
}
}
function new_or_existing_radiobutton_pressed() {
var $itemid = $(this).parent().parent().parent().attr('id')
switch (parseInt($(this).prop("value"))) {
case 1:
$("#" + $itemid + "_new").show();
$("#" + $itemid + "_existing").hide();
break;
case 2:
$("#" + $itemid + "_new").hide();
$("#" + $itemid + "_existing").show();
break;
case 3:
$("#" + $itemid + "_new").hide();
$("#" + $itemid + "_existing").hide();
break;
}
}
// credit from here on goes to rmed
// https://www.rmedgar.com/blog/dynamic-fields-flask-wtf/
function replaceTemplateIndex(value, index) {
const ID_RE = /(custom_items-)_/
return value.replace(ID_RE, '$1'+index);
}
function adjustIndices(removedIndex) {
var $forms = $('.form-custom_item');
$forms.each(function(i) {
var $form = $(this);
var index = parseInt($form.data('index'));
var newIndex = index - 1;
if (index < removedIndex) {
// Skip
return true;
}
// This will replace the original index with the new one
// only if it is found in the format -num-, preventing
// accidental replacing of fields that may have numbers
// intheir names.
var regex = new RegExp('(custom_items-)'+index);
var repVal = '$1'+newIndex;
// Change ID in form itself
$form.attr('id', $form.attr('id').replace(index, newIndex));
$form.data('index', newIndex);
// Change IDs in form fields
$form.find('label, input, select, textarea').each(function(j) {
var $item = $(this);
if ($item.is('label')) {
// Update labels
$item.attr('for', $item.attr('for').replace(regex, repVal));
return;
}
// Update other fields
$item.attr('id', $item.attr('id').replace(regex, repVal));
$item.attr('name', $item.attr('name').replace(regex, repVal));
});
});
}
function remove_custom_entry() {
var $removed_entry = $(this).closest('.form-custom_item');
var removedIndex = parseInt($removed_entry.data('index'));
$removed_entry.remove();
// Update indices
adjustIndices(removedIndex);
}
function add_custom_entry() {
var $template_form = $("#custom_items-_")
var $last_entry = $('.form-custom_item').last();
console.log($last_entry);
var new_index = 0;
if ($last_entry.length > 0) {
new_index = parseInt($last_entry.data('index')) + 1;
}
var $new_form = $template_form.clone()
console.log("New Index: " + new_index)
$new_form.attr('id', replaceTemplateIndex($new_form.attr('id'), new_index));
$new_form.data('index', new_index)
console.log("NewFormData Index: " + $new_form.data('index'))
console.log("NewFormData ID: " + $new_form.data('id'))
$new_form.find('label, input, select, textarea').each(function(idx) {
var $item = $(this);
if ($item.is('label')) {
// Update labels
$item.attr('for', replaceTemplateIndex($item.attr('for'), new_index));
return;
}
// Update other fields
$item.attr('id', replaceTemplateIndex($item.attr('id'), new_index));
$item.attr('name', replaceTemplateIndex($item.attr('name'), new_index));
});
$("#custom_items-container").append($new_form);
$new_form.addClass('form-custom_item');
$new_form.removeClass('custom_items-template');
$new_form.find('.remove-custom_item').click(remove_custom_entry);
$new_form.show();
}
$(document).ready(function () {
$(".form-requesting").click(requesting_checkbox_pressed);
$(".form-new_or_existing").click(new_or_existing_radiobutton_pressed);
$(".remove-custom_item").click(remove_custom_entry);
$("#append").click(add_custom_entry);
});