diff --git a/apps/home/static/home/js/tables.js b/apps/home/static/home/js/tables.js index a5a3f09..982d818 100644 --- a/apps/home/static/home/js/tables.js +++ b/apps/home/static/home/js/tables.js @@ -75,7 +75,7 @@ $(document).on("selectedServerChange", function() { }); -// region Data Control +// region Load & Clear Data function wipeTable(tableId) { $(`${tableId} thead .table-select-all`).prop("checked", false).prop("indeterminate", false); @@ -90,18 +90,20 @@ function populateTable(tableId, data) { async function loadTableData(tableId, url, method) { fixTablePagination(tableId); + disableTableControls(tableId); // Create querystring for filtering against the API - let filters = getTableFilters(tableId); - let ordering = getTableOrdering(tableId); - let querystring = makeQuerystring(filters, ordering); + const filters = getTableFilters(tableId); + const ordering = getTableOrdering(tableId); + const querystring = makeQuerystring(filters, ordering); // API request - let data = await ajaxRequest(url + querystring, method); + const data = await ajaxRequest(url + querystring, method); // Update table with new data wipeTable(tableId); populateTable(tableId, data); + enableTableControls(tableId); } @@ -143,7 +145,7 @@ function fixTablePagination(tableId) { function updateTablePagination(tableId, data) { let filters = getTableFilters(tableId); - let $paginationArea = $("#subTable").closest('.js-tableBody').siblings('.js-tableControls').find('.pagination'); + let $paginationArea = $(tableId).closest('.js-tableBody').siblings('.js-tableControls').find('.pagination'); $paginationArea.data("page", filters.page); // store the page for later // Remove existing buttons for specific pages @@ -242,12 +244,14 @@ function bindTablePageSizer(tableId) { _searchTimeouts = {}; function bindTableSearch(tableId) { - let $tableFilters = $(tableId).closest('.js-tableBody').siblings('.js-tableFilters'); + const $tableFilters = $(tableId).closest('.js-tableBody').siblings('.js-tableFilters'); $tableFilters.on("input", ".table-search-input", function() { + $(this).data("was-focused", true); clearTimeout(_searchTimeouts[tableId]); - let searchString = $(this).val(); + const searchString = $(this).val(); setTableFilter(tableId, "search", searchString); + setTableFilter(tableId, "page", 1); // back to first page, as desired page no. might not exist after filtering _searchTimeouts[tableId] = setTimeout(function() { $(tableId).trigger("doDataLoad"); @@ -303,5 +307,31 @@ function determineSelectAllState(tableId) { $checkbox.prop("checked", doCheck); $checkbox.prop("indeterminate", doIndeterminate); - // TODO: disable/enable delete button here + $(tableId).closest(".js-tableBody").siblings(".js-tableFilters").find(".table-del-btn").prop("disabled", !doCheck && !doIndeterminate); +} + + +// region On/Off Controls + +function enableTableControls(tableId) { + setTableControlsUsability(tableId, false); +} + +function disableTableControls(tableId) { + setTableControlsUsability(tableId, true); +} + +function setTableControlsUsability(tableId, disabled) { + const $table = $(tableId); + const $tableBody = $table.closest(".js-tableBody"); + const $tableFilters = $tableBody.siblings(".js-tableFilters"); + const $tableControls = $tableBody.siblings(".tableControls"); + + $tableBody.find(".disable-while-loading").prop("disabled", disabled); + $tableFilters.find(".disable-while-loading").prop("disabled", disabled); + $tableControls.find(".disable-while-loading").prop("disabled", disabled); + + // Re-focus search bar if used + const $search = $tableFilters.find(".disable-while-loading[type=search]"); + $search.data("was-focused") ? $search.focus() : null; } diff --git a/apps/home/templates/home/tabs/styles.html b/apps/home/templates/home/tabs/styles.html index d8dc9ed..04c9e0e 100644 --- a/apps/home/templates/home/tabs/styles.html +++ b/apps/home/templates/home/tabs/styles.html @@ -39,7 +39,7 @@