fix: feed page - missing ordering params and row select functionality
Some checks failed
Build / build (push) Failing after 45s

This commit is contained in:
Corban-Lee Jones 2025-05-09 16:41:54 +01:00
parent 6b77d062f0
commit 9b6eb86cd8

View File

@ -3,10 +3,9 @@ import HSDropdown from "preline/dist/dropdown";
import HSDataTable, { IDataTableOptions } from "preline/dist/datatable"; import HSDataTable, { IDataTableOptions } from "preline/dist/datatable";
import HSSelect, { ISelectOptions } from "preline/dist/select"; import HSSelect, { ISelectOptions } from "preline/dist/select";
import HSOverlay, { IOverlayOptions } from "preline/dist/overlay"; import HSOverlay, { IOverlayOptions } from "preline/dist/overlay";
import HSDatepicker, { ICustomDatepickerOptions } from "preline/dist/datepicker"; import { Api, AjaxSettings, ConfigColumnDefs } from "datatables.net-dt";
import { AjaxSettings, ConfigColumnDefs } from "datatables.net-dt"; import "datatables.net-select-dt"
import prisma from "../../../../../generated/prisma"; import prisma from "../../../../../generated/prisma";
import { ISingleOption } from "preline";
import { TextChannel } from "discord.js"; import { TextChannel } from "discord.js";
declare let guildId: string; declare let guildId: string;
@ -40,9 +39,10 @@ const emptyTableHtml: string = `
`; `;
const columnDefs: ConfigColumnDefs[] = [ const columnDefs: ConfigColumnDefs[] = [
// Select checkbox column { // Select checkbox column
{
target: 0, target: 0,
orderable: false,
searchable: false,
className: "size-px whitespace-nowrap", className: "size-px whitespace-nowrap",
render: (_data: unknown, _type: unknown, row: prisma.Feed) => { return ` render: (_data: unknown, _type: unknown, row: prisma.Feed) => { return `
<div class="ps-6 py-4"> <div class="ps-6 py-4">
@ -80,6 +80,8 @@ const columnDefs: ConfigColumnDefs[] = [
{ {
target: 3, target: 3,
data: "channels", data: "channels",
orderable: false,
searchable: false,
className: "size-px", className: "size-px",
render: (data: prisma.Channel[], type: string, row: prisma.Feed) => { render: (data: prisma.Channel[], type: string, row: prisma.Feed) => {
if (type !== "display") { return data; } if (type !== "display") { return data; }
@ -128,6 +130,8 @@ const columnDefs: ConfigColumnDefs[] = [
{ {
target: 4, target: 4,
data: "filters", data: "filters",
orderable: false,
searchable: false,
className: "size-px whitespace-nowrap", className: "size-px whitespace-nowrap",
render: (data: prisma.Filter[], type: string, row: prisma.Feed) => { render: (data: prisma.Filter[], type: string, row: prisma.Feed) => {
if (type !== "display") return data; if (type !== "display") return data;
@ -167,6 +171,8 @@ const columnDefs: ConfigColumnDefs[] = [
{ {
target: 5, target: 5,
data: null, // "message_style_id" data: null, // "message_style_id"
orderable: false,
searchable: false,
className: "size-px whitespace-nowrap", className: "size-px whitespace-nowrap",
render: (_data: unknown, type: string, row: any) => { render: (_data: unknown, type: string, row: any) => {
if (!row.message_style || type !== "display") return null; if (!row.message_style || type !== "display") return null;
@ -186,6 +192,7 @@ const columnDefs: ConfigColumnDefs[] = [
target: 6, target: 6,
data: "created_at", data: "created_at",
orderable: true, orderable: true,
searchable: false,
className: "size-px whitespace-nowrap", className: "size-px whitespace-nowrap",
render: (data: string) => { return ` render: (data: string) => { return `
<div class="px-6 py-4"> <div class="px-6 py-4">
@ -199,6 +206,7 @@ const columnDefs: ConfigColumnDefs[] = [
target: 7, target: 7,
data: "active", data: "active",
orderable: true, orderable: true,
searchable: false,
className: "size-px whitespace-nowrap", className: "size-px whitespace-nowrap",
render: (data: boolean) => { render: (data: boolean) => {
const wrapper = $("<div>").addClass("px-6 py-4"); const wrapper = $("<div>").addClass("px-6 py-4");
@ -259,9 +267,51 @@ let table: HSDataTable;
window.addEventListener("preline:ready", () => { window.addEventListener("preline:ready", () => {
const tableEl = $("#table").get(0); const tableEl = $("#table").get(0);
if (!HSDataTable.getInstance(tableEl, true)) {
table = new HSDataTable(tableEl, tableOptions); if (HSDataTable.getInstance(tableEl, true)) return;
}
table = new HSDataTable(tableEl, tableOptions);
(table as any).dataTable
.on("select", onTableSelectChange)
.on("deselect", onTableSelectChange)
.on("draw", onTableSelectChange);
});
const onTableSelectChange = () => {
const selectedRowsCount = (table as any).dataTable.rows({ selected: true }).count();
$("#deleteRowsBtn").prop("disabled", selectedRowsCount === 0);
$(".rows-selected-count-js").text(selectedRowsCount);
const $elem = $(".rows-selected-count-js.zero-empty-js");
selectedRowsCount === 0 ? $elem.hide() : $elem.show();
};
$("#selectAllBox").on("change", function() {
const dt: Api = (table as any).dataTable;
(this as HTMLInputElement).checked
? dt.rows().select()
: dt.rows().deselect();
});
$("#deleteRowsBtn").on("click", async () => {
const dt: Api = (table as any).dataTable;
const rowsData = dt.rows({ selected: true }).data().toArray();
const rowIds = rowsData.map((row: prisma.Feed) => row.id);
await $.ajax({
url: `/guild/${guildId}/feeds/api`,
method: "delete",
dataType: "json",
data: { ids: rowIds },
success: () => {
dt.draw();
dt.rows().deselect();
},
error: error => {
alert(typeof error === "object" ? JSON.stringify(error, null, 4) : error);
}
});
}); });
// #endregion // #endregion