Advertisement
kunbata

Platform page

May 11th, 2024
331
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //platform page
  2.  
  3. "use client"
  4.  
  5. import {AppContext} from "@/app/context";
  6. import {useCallback, useContext, useEffect, useState} from "react";
  7. import {dataBalkRobotEndpoints, invokeDataBalkRobot} from "@/core/services/dataBalkRobot";
  8. import {Spinner} from "@fluentui/react-components";
  9. import Table from "@/components/general/tables/incidentTable";
  10. import Filter from "@/components/general/filter";
  11. import {columns, columnSizingOptions} from "@/app/(service)/platform/columns";
  12. import {BeheerIncident} from "@/app/(service)/interfaces";
  13. import IncidentCards from "@/app/(service)/platform/cards";
  14. import {filters} from "@/app/(service)/platform/filters";
  15. import {DataGridProps} from "@fluentui-contrib/react-data-grid-react-window";
  16.  
  17. const Platform = () => {
  18.     const customer  = useContext(AppContext)?.customer;
  19.  
  20.     const initialSelectedFilters: Record<string, number[]> = {"Status": [
  21.         799880000, 799880001, 799880002]};
  22.  
  23.     filters.forEach((category) => {
  24.         initialSelectedFilters[category.title] = [];
  25.     });
  26.  
  27.     const [beheerIncidents, setBeheerIncidents] = useState<BeheerIncident[]>([]);
  28.     const [selectedFilters, setSelectedFilters] = useState(initialSelectedFilters);
  29.     const [isCardView, setIsCardView] = useState(true);
  30.     const [loading, setLoading] = useState(false);
  31.     const [searchText, setSearchText] = useState<string>("");
  32.     const [sortState, setSortState] = useState<Parameters<NonNullable<DataGridProps["onSortChange"]>>[1]>({
  33.         sortColumn: "melder",
  34.         sortDirection: "descending",
  35.     });
  36.  
  37.     const handleSearchTextChange = (newSearchText) => {
  38.         const updatedSearchText = typeof newSearchText === "string" ? newSearchText : newSearchText?.value || "";
  39.         setSearchText(updatedSearchText);
  40.     };
  41.  
  42.     const fetchData = useCallback(async () => {
  43.         try {
  44.             setLoading(true);
  45.             const beheerIncidents = await invokeDataBalkRobot<BeheerIncident[]>(dataBalkRobotEndpoints.getBeheerIncident + `${customer?.accountId}`, "GET");
  46.             setBeheerIncidents(beheerIncidents);
  47.         } catch (error: any) {
  48.             console.log(error)
  49.         } finally {
  50.             setLoading(false);
  51.         }
  52.     }, [customer]);
  53.  
  54.     useEffect(() => {
  55.         fetchData().then();
  56.     }, [fetchData]);
  57.  
  58.     const applyFilters = (incidents: BeheerIncident[], selectedFilters: Record<string, number[]>, search: string) => {
  59.         const filtered = incidents.filter((incident) => {
  60.             for (const category in selectedFilters) {
  61.                 if (selectedFilters[category].length > 0) {
  62.                     const propertyMatched = (
  63.                         incident.frequentie === undefined || selectedFilters[category].includes(incident.frequentie)
  64.                     ) || (
  65.                         incident.prioriteit === undefined || selectedFilters[category].includes(incident.prioriteit)
  66.                     ) || (
  67.                         incident.status === undefined || selectedFilters[category].includes(incident.status)
  68.                     ) || (
  69.                         incident.fibo === undefined || selectedFilters[category].includes(incident.fibo)
  70.                     );
  71.  
  72.                     if (!propertyMatched) {
  73.                         console.log("Property not matched:", incident);
  74.                         return false;
  75.                     }
  76.                 }
  77.             }
  78.  
  79.             const searchLowerCase = (search || "").toString().toLowerCase();
  80.  
  81.             if (searchLowerCase.trim() !== "") {
  82.                 if (
  83.                     !incident.onderwerp.toLowerCase().includes(searchLowerCase) &&
  84.                     !incident.beheernummer.toLowerCase().includes(searchLowerCase) &&
  85.                     !incident.behandelaarFullName.toLowerCase().includes(searchLowerCase)
  86.                 ) {
  87.                     return false;
  88.                 }
  89.             }
  90.  
  91.             return true;
  92.         });
  93.  
  94.         return filtered;
  95.     };
  96.  
  97.     const handleFilterChange = (categoryName: string, optionId: number) => {
  98.         const updatedFilters = { ...selectedFilters };
  99.  
  100.         if (updatedFilters[categoryName].includes(optionId)) {
  101.             updatedFilters[categoryName] = updatedFilters[categoryName].filter((id) => id !== optionId);
  102.         } else {
  103.             updatedFilters[categoryName] = [...updatedFilters[categoryName], optionId];
  104.         }
  105.         setSelectedFilters(updatedFilters);
  106.     };
  107.  
  108.     const handleSortChange = (event, sortState) => {
  109.         setSortState(sortState);
  110.  
  111.         setBeheerIncidents(beheerIncidents.sort((a, b) => {
  112.  
  113.             if (sortState.sortColumn == "melder"){
  114.                 return sortState.sortDirection == "ascending" ? a.behandelaarFullName.localeCompare(b.behandelaarFullName) : b.behandelaarFullName.localeCompare(a.behandelaarFullName);
  115.             }
  116.  
  117.             if (sortState.sortDirection == "ascending"){
  118.                 if (a[sortState.sortColumn] > b[sortState.sortColumn]) return 1;
  119.                 if (a[sortState.sortColumn] < b[sortState.sortColumn]) return -1;
  120.             }
  121.  
  122.             //Descending
  123.             if (sortState.sortDirection == "descending"){
  124.                 if (a[sortState.sortColumn] > b[sortState.sortColumn]) return -1;
  125.                 if (a[sortState.sortColumn] < b[sortState.sortColumn]) return 1;
  126.             }
  127.             return 0; // Rows are equal
  128.  
  129.         }));
  130.     };
  131.  
  132.     const filteredIncidents: BeheerIncident[] = applyFilters(beheerIncidents, selectedFilters, searchText);
  133.  
  134.     const renderedIncidents = isCardView ? (
  135.         <IncidentCards incidents={filteredIncidents}/>
  136.     ) : (
  137.         <Table items={beheerIncidents} columns={columns} columnSizingOptions={columnSizingOptions} sortState={sortState} onSortChange={handleSortChange}/>
  138.     );
  139.  
  140.     const toggleView = () => {
  141.         setIsCardView(!isCardView);
  142.     };
  143.  
  144.     return (
  145.         <main>
  146.             <Filter
  147.                 toggleView={toggleView}
  148.                 filters={filters}
  149.                 handleFilterChange={handleFilterChange}
  150.                 selectedFilters={selectedFilters}
  151.                 handleSearchTextChange={handleSearchTextChange}
  152.                 searchText={searchText}
  153.                 searchBoxWidth={"34em"}
  154.             />
  155.             {loading ? (
  156.                 <Spinner />
  157.             ) : (
  158.                 renderedIncidents
  159.             )}
  160.         </main>
  161.     )
  162. }
  163.  
  164. export default Platform;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement