$(document).ready(function() { // Select or reset table columns $('#save_tableconfig').click(function(event) { $('select[name="columns"] option').prop("selected", "selected"); }); $('#reset_tableconfig').click(function(event) { $('select[name="columns"]').val([]); }); // Swap columns between available and selected lists $('#add_columns').click(function(e) { let selected_columns = $('#id_available_columns option:selected'); $('#id_columns').append($(selected_columns).clone()); $(selected_columns).remove(); e.preventDefault(); }); $('#remove_columns').click(function(e) { let selected_columns = $('#id_columns option:selected'); $('#id_available_columns').append($(selected_columns).clone()); $(selected_columns).remove(); e.preventDefault(); }); $('form.userconfigform').submit(function(event) { event.preventDefault(); // Derive an array from the dotted path to the config root let path = this.getAttribute('data-config-root').split('.'); let data = {}; let pointer = data; // Construct a nested JSON object from the path let node; for (node of path) { pointer[node] = {}; pointer = pointer[node]; } // Assign the form data to the child node let field; $.each($(this).find('[id^="id_"]:input'), function(index, value) { field = $(value); pointer[field.attr("name")] = field.val(); }); // Make the REST API request $.ajax({ url: netbox_api_path + 'users/config/', async: true, contentType: 'application/json', dataType: 'json', type: 'PATCH', beforeSend: function(xhr, settings) { xhr.setRequestHeader("X-CSRFToken", netbox_csrf_token); }, data: JSON.stringify(data), }).done(function () { // Reload the page window.location.reload(true); }).fail(function (xhr, status, error) { alert("Failed to update user config (" + status + "): " + error); }); }); });