"use client"; import React, { useState, useEffect } from "react"; import FilterComponent from "../../components/FilterComponent"; interface DataModel { status: string; type: string; nsapp: string; os_type: string; disk_size: number; core_count: number; ram_size: number; method: string; pve_version: string; created_at: string; } const DataFetcher: React.FC = () => { const [data, setData] = useState([]); const [filteredData, setFilteredData] = useState([]); const [filters, setFilters] = useState>({}); const [loading, setLoading] = useState(true); const [currentPage, setCurrentPage] = useState(1); const [itemsPerPage, setItemsPerPage] = useState(25); const [error, setError] = useState(null); useEffect(() => { const fetchPaginatedData = async () => { setLoading(true); try { const response = await fetch(`https://api.htl-braunau.at/dev/data/paginated?page=${currentPage}&limit=${itemsPerPage === 0 ? '' : itemsPerPage}`); if (!response.ok) throw new Error(`Failed to fetch data: ${response.statusText}`); const result: DataModel[] = await response.json(); setData(result); } catch (err) { setError((err as Error).message); } finally { setLoading(false); } }; fetchPaginatedData(); }, [currentPage, itemsPerPage]); const applyFilters = async (column: string, operator: string, value: any) => { setFilters((prev) => { const updatedFilters = { ...prev }; if (!updatedFilters[column]) updatedFilters[column] = []; // Prevent duplicate filters const alreadyExists = updatedFilters[column].some((filter: { operator: string; value: any }) => filter.operator === operator && filter.value === value ); if (!alreadyExists) { updatedFilters[column].push({ operator, value }); } return updatedFilters; }); }; const removeFilter = (column: string, index: number) => { setFilters((prev) => { const updatedFilters = { ...prev }; updatedFilters[column] = updatedFilters[column].filter((_: any, i: number) => i !== index); // If no filters remain, remove the column entry if (updatedFilters[column].length === 0) delete updatedFilters[column]; return updatedFilters; }); }; useEffect(() => { let filtered = [...data]; Object.keys(filters).forEach((key) => { if (!filters[key] || filters[key].length === 0) return; filtered = filtered.filter((item) => { const itemValue = item[key as keyof DataModel]; return filters[key].some(({ operator, value }: { operator: string; value: any }) => { if (typeof itemValue === "number") { value = parseFloat(value); if (operator === "greater") return itemValue > value; if (operator === "greater or equal") return itemValue >= value; if (operator === "less") return itemValue < value; if (operator === "less or equal") return itemValue <= value; } if (typeof itemValue === "string") { if (operator === "equals") return itemValue.toLowerCase() === value.toLowerCase(); if (operator === "not equals") return itemValue.toLowerCase() !== value.toLowerCase(); if (operator === "contains") return itemValue.toLowerCase().includes(value.toLowerCase()); if (operator === "does not contain") return !itemValue.toLowerCase().includes(value.toLowerCase()); } return false; }); }); }); setFilteredData(filtered); }, [filters, data]); const columns: { key: string; type: "text" | "number"; label: string }[] = [ { key: "status", type: "text", label: "Status" }, { key: "type", type: "text", label: "Type" }, { key: "nsapp", type: "text", label: "NS App" }, { key: "os_type", type: "text", label: "OS Type" }, { key: "disk_size", type: "number", label: "Disk Size" }, { key: "core_count", type: "number", label: "CPU Cores" }, { key: "ram_size", type: "number", label: "RAM Size" }, { key: "method", type: "text", label: "Method" }, { key: "pve_version", type: "text", label: "PVE Version" }, { key: "created_at", type: "text", label: "Created At" } ]; return (

Created LXCs

{columns.map(({ key, type, label }) => ( ))} {/* Filters Row - Displays below headers */} {columns.map(({ key, label }) => ( ))} {filteredData.length > 0 ? ( filteredData.map((item, index) => ( )) ) : ( )}
{label}
{filters[key] && filters[key].length > 0 ? (
{filters[key].map((filter: { operator: string; value: any }, index: number) => (
{filter.operator} "{filter.value}"
))}
) : ( )}
{item.status} {item.type} {item.nsapp} {item.os_type} {item.disk_size} {item.core_count} {item.ram_size} {item.method} {item.pve_version} {item.created_at}
No results found
); }; export default DataFetcher;