Grocy.Components.UserfieldsForm = {}; Grocy.Components.UserfieldsForm.Save = function(success, error) { if (!$("#userfields-form").length) { if (success) { success(); } return; } var jsonData = {}; $("#userfields-form .userfield-input").not("div").each(function() { var input = $(this); var fieldName = input.attr("data-userfield-name"); var fieldValue = input.val(); if (input.attr("type") == "checkbox") { jsonData[fieldName] = "0"; if (input.is(":checked")) { jsonData[fieldName] = "1"; } } else if (input.attr("type") == "file") { var oldFile = input.data('old-file') if (oldFile) { Grocy.Api.Delete('files/userfiles/' + oldFile, null, null, function(xhr) { Grocy.FrontendHelpers.ShowGenericError('Could not delete file', xhr); }); jsonData[fieldName] = ""; } if (input[0].files.length > 0) { // Files service requires an extension var fileName = RandomString() + '.' + CleanFileName(input[0].files[0].name.split('.').reverse()[0]); jsonData[fieldName] = btoa(fileName) + '_' + btoa(CleanFileName(input[0].files[0].name)); Grocy.Api.UploadFile(input[0].files[0], 'userfiles', fileName, function(result) { }, function(xhr) { // When navigating away immediately from the current page, this is maybe a false positive - so ignore this for now // Grocy.FrontendHelpers.ShowGenericError('Error while saving, probably this item already exists', xhr.response) } ); } } else if ($(this).hasAttr("multiple")) { jsonData[fieldName] = $(this).val().join(","); } else { jsonData[fieldName] = fieldValue; } }); Grocy.Api.Put('userfields/' + $("#userfields-form").data("entity") + '/' + Grocy.EditObjectId, jsonData, function(result) { if (success) { success(); } }, function(xhr) { if (error) { error(); } } ); } Grocy.Components.UserfieldsForm.Load = function() { if (!$("#userfields-form").length) { return; } if (typeof Grocy.EditObjectId == "undefined") { // Init fields by configured default values Grocy.Api.Get("objects/userfields?query[]=entity=" + $("#userfields-form").data("entity"), function(result) { $.each(result, function(key, userfield) { var input = $(".userfield-input[data-userfield-name='" + userfield.name + "']"); if (userfield.type == "datetime" && userfield.default_value == "now") { input.val(moment().format("YYYY-MM-DD HH:mm:ss")) } else if (userfield.type == "date" && userfield.default_value == "now") { input.val(moment().format("YYYY-MM-DD")) } }); $("form").each(function() { Grocy.FrontendHelpers.ValidateForm(this.id); }); }, function(xhr) { console.error(xhr); } ); } else { // Load object field values Grocy.Api.Get('userfields/' + $("#userfields-form").data("entity") + '/' + Grocy.EditObjectId, function(result) { $.each(result, function(key, value) { var input = $(".userfield-input[data-userfield-name='" + key + "']"); if (input.attr("type") == "checkbox" && value == 1) { input.prop("checked", true); } else if (input.hasAttr("multiple")) { input.val(value.split(",")); $(".selectpicker").selectpicker("render"); } else if (input.attr('type') == "file") { if (value) { var fileName = atob(value.split('_')[1]); var fileSrc = value.split('_')[0]; var formGroup = input.parent().parent().parent(); formGroup.find("label.custom-file-label").text(fileName); formGroup.find(".userfield-file-show").attr('href', U('/files/userfiles/' + value)); formGroup.find('.userfield-file-show').removeClass('d-none'); formGroup.find('img.userfield-current-file') .attr('src', U('/files/userfiles/' + value + '?force_serve_as=picture&best_fit_width=250&best_fit_height=250')); formGroup.find('.userfield-file-delete').click( function() { formGroup.find("label.custom-file-label").text(__t("No file selected")); formGroup.find(".userfield-file-show").addClass('d-none'); input.attr('data-old-file', fileSrc); } ); input.on("change", function(e) { formGroup.find(".userfield-file-show").addClass('d-none'); }); } } else if (input.attr("data-userfield-type") == "link") { if (value) { var data = JSON.parse(value); var formRow = input.parent().parent(); formRow.find(".userfield-link-title").val(data.title); formRow.find(".userfield-link-link").val(data.link); input.val(value); } } else { input.val(value); } }); $("form").each(function() { Grocy.FrontendHelpers.ValidateForm(this.id); }); }, function(xhr) { console.error(xhr); } ); } } Grocy.Components.UserfieldsForm.Clear = function() { if (!$("#userfields-form").length) { return; } Grocy.Api.Get('objects/userfields?query[]=entity=' + $("#userfields-form").data("entity"), function(result) { $.each(result, function(key, userfield) { var input = $(".userfield-input[data-userfield-name='" + userfield.name + "']"); if (input.attr("type") == "checkbox") { input.prop("checked", false); } else if (input.hasAttr("multiple")) { input.val(""); $(".selectpicker").selectpicker("render"); } else if (input.attr('type') == "file") { var formGroup = input.parent().parent().parent(); formGroup.find("label.custom-file-label").text(""); formGroup.find(".userfield-file-show").attr('href', U('/files/userfiles/' + value)); formGroup.find('.userfield-file-show').removeClass('d-none'); formGroup.find('img.userfield-current-file') .attr('src', U('/files/userfiles/' + value + '?force_serve_as=picture&best_fit_width=250&best_fit_height=250')); formGroup.find('.userfield-file-delete').click( function() { formGroup.find("label.custom-file-label").text(__t("No file selected")); formGroup.find(".userfield-file-show").addClass('d-none'); input.attr('data-old-file', ""); } ); input.on("change", function(e) { formGroup.find(".userfield-file-show").addClass('d-none'); }); } else if (input.attr("data-userfield-type") == "link") { var formRow = input.parent().parent(); formRow.find(".userfield-link-title").val(data.title); formRow.find(".userfield-link-link").val(data.link); input.val(""); } else { input.val(""); } }); $("form").each(function() { Grocy.FrontendHelpers.ValidateForm(this.id); }); }, function(xhr) { console.error(xhr); } ); } $(".userfield-link").keyup(function(e) { var formRow = $(this).parent().parent(); var title = formRow.find(".userfield-link-title").val(); var link = formRow.find(".userfield-link-link").val(); var value = { "title": title, "link": link }; formRow.find(".userfield-input").val(JSON.stringify(value)); }); $(".userfield-input").change(function(e) { $("form").each(function() { Grocy.FrontendHelpers.ValidateForm(this.id); }); });