abstracted table functions

This commit is contained in:
Corban-Lee Jones 2024-06-26 11:14:17 +01:00
parent 450d40be89
commit 5a3b458f3e
5 changed files with 94 additions and 74 deletions

View File

@ -5,10 +5,15 @@ $(document).ready(async function() {
$("#subscriptionsTab").click(); $("#subscriptionsTab").click();
// Bind table select checkboxes
bindTableCheckboxes("#subTable", subTable, "#deleteSelectedSubscriptionsBtn"); bindTableCheckboxes("#subTable", subTable, "#deleteSelectedSubscriptionsBtn");
bindTableCheckboxes("#filtersTable", filtersTable, "#deleteSelectedFiltersBtn"); bindTableCheckboxes("#filtersTable", filtersTable, "#deleteSelectedFiltersBtn");
bindTableCheckboxes("#contentTable", contentTable, "#deleteSelectedContentBtn") bindTableCheckboxes("#contentTable", contentTable, "#deleteSelectedContentBtn")
// Bind pagination - subTable
await bindTablePagination("#subPagination", loadSubscriptions);
await bindTablePaginationResizer("#subTablePageSize", loadSubscriptions);
await loadSavedGuilds(); await loadSavedGuilds();
await loadServerOptions(); await loadServerOptions();
}); });

View File

@ -92,9 +92,9 @@ function initSubscriptionTable() {
] ]
}); });
subTable.on('page.dt length.dt', function() { // subTable.on('page.dt length.dt', async function() {
loadSubscriptions(getCurrentlyActiveServer().guild_id); // await loadSubscriptions(getCurrentlyActiveServer().guild_id);
}); // });
} }
$("#subTable").on("change", ".sub-toggle-active", async function () { $("#subTable").on("change", ".sub-toggle-active", async function () {
@ -120,6 +120,10 @@ $("#subTable").on("change", ".sub-toggle-active", async function () {
sub.guild_id, sub.guild_id,
sub.extra_notes, sub.extra_notes,
sub.filters, sub.filters,
{
title: sub.article_title_mutators.map(mutator => mutator.id),
desc: sub.article_desc_mutators.map(mutator => mutator.id)
},
active, active,
handleErrorMsg=false handleErrorMsg=false
); );
@ -133,7 +137,7 @@ $("#subTable").on("change", ".sub-toggle-active", async function () {
); );
} }
catch (error) { catch (error) {
console.error(error); console.error(error);
showToast( showToast(
"danger", "danger",
"Error Updating Subscription", "Error Updating Subscription",
@ -215,6 +219,11 @@ $("#subForm").on("submit", async function(event) {
var subPrimaryKey = await saveSubscription(id, name, url, guildId, extraNotes, subFilters, subMutators, active); var subPrimaryKey = await saveSubscription(id, name, url, guildId, extraNotes, subFilters, subMutators, active);
if (!subPrimaryKey) {
alert("prevented /subscriptions/false/subchannels");
return
}
await deleteSubChannels(subPrimaryKey); await deleteSubChannels(subPrimaryKey);
subChannels.forEach(async channelId => { subChannels.forEach(async channelId => {
await saveSubChannel(channelId, subPrimaryKey); await saveSubChannel(channelId, subPrimaryKey);
@ -245,6 +254,8 @@ async function saveSubscription(id, name, url, guildId, extraNotes, filters, mut
else response = await editSubscription(id, formData); else response = await editSubscription(id, formData);
} }
catch (err) { catch (err) {
console.error(err)
if (handleErrorMsg) if (handleErrorMsg)
showToast("danger", "Subscription Error", err.responseText, 18000); showToast("danger", "Subscription Error", err.responseText, 18000);
@ -296,8 +307,10 @@ async function loadSubscriptions(guildId, page=1, pageSize=null) {
try { try {
const subscriptions = await getSubscriptions(guildId, page, pageSize); const subscriptions = await getSubscriptions(guildId, page, pageSize);
subTable.rows.add(subscriptions.results).draw(false); subTable.rows.add(subscriptions.results).draw(false);
handleSubPagination(page, pageSize, subscriptions.count, subscriptions.next, subscriptions.previous);
handleSubPageInfo(subscriptions.results.length, subscriptions.count); updateTablePagination("#subPagination", page, pageSize, subscriptions.count, subscriptions.next, subscriptions.previous);
updateTablePaginationInfo("#subTablePageInfo", subscriptions.results.length, subscriptions.count);
$("#subTable thead .table-select-all").prop("disabled", subscriptions.results.length === 0); $("#subTable thead .table-select-all").prop("disabled", subscriptions.results.length === 0);
console.debug("loading subs, " + subscriptions.results.length + " found"); console.debug("loading subs, " + subscriptions.results.length + " found");
} }
@ -307,69 +320,6 @@ async function loadSubscriptions(guildId, page=1, pageSize=null) {
} }
} }
$("#subTablePageSize").on("change", async function() {
const page = 1; // reset to page 1 to ensure the page exists.
const pageSize = $(this).val();
loadSubscriptions(getCurrentlyActiveServer().guild_id, page, pageSize);
});
function handleSubPageInfo(showing, total) {
$("#subTablePageInfo .pageinfo-showing").text(showing);
$("#subTablePageInfo .pageinfo-total").text(total);
}
// Update the UI pagination options according to the passed data.
function handleSubPagination(currentPage, pageSize, totalItems, nextExists, prevExists) {
$("#subPagination").attr("data-page", currentPage);
// Remove existing page-specific buttons
$("#subPagination .page-pick").remove();
// Determine states of 'previous page' and 'next page' buttons
$("#subPagination .page-prev").toggleClass("disabled", !prevExists).attr("tabindex", prevExists ? "" : "-1");
$("#subPagination .page-next").toggleClass("disabled", !nextExists).attr("tabindex", nextExists ? "" : "-1");
// Calculate amount of pages to account for
const pages = Math.max(Math.ceil(totalItems / pageSize), 1);
// Create a button for each page
for (let i = 1; i < pages + 1; i++) {
let pageItem = $("<li>").addClass("page-item");
let pageLink = $("<button>")
.attr("type", "button")
.attr("data-page", i)
.addClass("page-link page-pick")
.text(i)
pageItem.append(pageLink);
// Insert the new page button before the 'next page' button
$("#subPagination .pagination .page-next").parent().before(pageItem);
}
// Disable the button for the current page
$(`#subPagination .pagination .page-pick[data-page="${currentPage}"]`).addClass("disabled").attr("tabindex", -1);
}
$("#subPagination .pagination").on("click", ".page-link", async function() {
let wantedPage;
let currentPage = parseInt($("#subPagination").attr("data-page"));
if ($(this).hasClass("page-prev"))
wantedPage = currentPage - 1
else if ($(this).hasClass("page-next"))
wantedPage = currentPage + 1;
else
wantedPage = $(this).attr("data-page");
console.debug("moving to page: " + wantedPage);
await loadSubscriptions(getCurrentlyActiveServer().guild_id, wantedPage)
});
$(document).on("selectedServerChange", async function() { $(document).on("selectedServerChange", async function() {
// Hide alerts // Hide alerts
@ -528,10 +478,10 @@ async function loadMutatorOptions() {
const mutators = await getMutators(); const mutators = await getMutators();
console.log(JSON.stringify(mutators)); console.log(JSON.stringify(mutators));
mutators.forEach(filter => { mutators.forEach(mutator => {
$(".sub-mutators-field").append($("<option>", { $(".sub-mutators-field").append($("<option>", {
text: filter.name, text: mutator.name,
value: filter.id value: mutator.id
})); }));
}); });
} }

64
apps/static/js/table.js Normal file
View File

@ -0,0 +1,64 @@
// Updates the pagination text for a given pageInfoId
function updateTablePaginationInfo(pageInfoId, showing, total) {
$(`${pageInfoId} .pageinfo-showing`).text(showing);
$(`${pageInfoId} .pageinfo-total`).text(total);
}
// Updates the pagination buttons for a given pageControlsId
function updateTablePagination(pageControlsId, currentPage, pageSize, totalItems, nextExists, prevExists) {
$(pageControlsId).attr("data-page", currentPage);
// Remove existing page specific buttons
$(`${pageControlsId} .page-pick`).remove();
// Determine states of 'previous page' 'next page' buttons
$(`${pageControlsId} .page-prev`).toggleClass("disabled", !prevExists).attr("tabindex", prevExists ? "" : "-1");
$(`${pageControlsId} .page-next`).toggleClass("disabled", !nextExists).attr("tabindex", nextExists ? "" : "-1");
// Calculate amount of pages to account for
const pages = Math.max(Math.ceil(totalItems / pageSize), 1);
// alert(pages + " " + totalItems + " " + pageSize + " ")
for (let i = 1; i <= pages; i++) {
let pageItem = $("<li>").addClass("page-item");
let pageLink = $("<button>")
.attr("type", "button")
.attr("data-page", i)
.addClass("page-link page-pick")
.text(i);
// Insert the new page button before the 'next page' button
pageItem.append(pageLink)
$(`${pageControlsId} .pagination .page-next`).parent().before(pageItem);
$(`${pageControlsId} .pagination .page-pick[data-page="${currentPage}"]`).addClass("disabled").attr("tabindex", -1);
}
}
// Bind the table pagination buttons to control the table pagination
async function bindTablePagination(pageControlsId, dataLoadFunc) {
$(`${pageControlsId} .pagination`).on("click", ".page-link", async function() {
let wantedPage;
let currentPage = parseInt($(pageControlsId).attr("data-page"));
if ($(this).hasClass("page-prev"))
wantedPage = currentPage - 1;
else if ($(this).hasClass("page-next"))
wantedPage = currentPage + 1;
else
wantedPage = $(this).attr("data-page");
await dataLoadFunc(getCurrentlyActiveServer().guild_id, wantedPage)
});
}
// Bind the table pagination page resizer control
async function bindTablePaginationResizer(resizerControlId, dataLoadFunc) {
$(resizerControlId).on("change", async function() {
const page = 1;
const pageSize = $(this).val();
await dataLoadFunc(getCurrentlyActiveServer().guild_id, page, pageSize);
});
}

View File

@ -96,12 +96,12 @@
<div class="form-text">Apply mutators to article descriptions.</div> <div class="form-text">Apply mutators to article descriptions.</div>
</div> </div>
</div> </div>
<div class="col-lg-6 pe-lg-4"> <div class="col-lg-6 pe-lg-4 d-none">
<label for="" class="form-label">Article Fetch Limit</label> <label for="" class="form-label">Article Fetch Limit</label>
<input type="number" id="subFetchLimit" class="form-control rounded-1" max="10" min="1"> <input type="number" id="subFetchLimit" class="form-control rounded-1" max="10" min="1">
<div class="form-text">Limit the number of articles fetched every cycle.</div> <div class="form-text">Limit the number of articles fetched every cycle.</div>
</div> </div>
<div class="col-lg-6 ps-lg-4"> <div class="col-lg-6 ps-lg-4 d-none">
<div class="form-switch ps-0"> <div class="form-switch ps-0">
<label for="subResetFetchLimit" class="form-check-label mb-2">Max Fetch Limit after the First Cycle</label> <label for="subResetFetchLimit" class="form-check-label mb-2">Max Fetch Limit after the First Cycle</label>
<br> <br>

View File

@ -184,6 +184,7 @@
</li> </li>
</script> </script>
<script src="{% static 'js/api.js' %}"></script> <script src="{% static 'js/api.js' %}"></script>
<script src="{% static 'js/table.js' %}"></script>
<script src="{% static 'js/home/index.js' %}"></script> <script src="{% static 'js/home/index.js' %}"></script>
<script src="{% static 'js/home/servers.js' %}"></script> <script src="{% static 'js/home/servers.js' %}"></script>
<script src="{% static 'js/home/subscriptions.js' %}"></script> <script src="{% static 'js/home/subscriptions.js' %}"></script>