diff --git a/src/components/donors/DonorsOverview.svelte b/src/components/donors/DonorsOverview.svelte index f0d6127e..4df90655 100644 --- a/src/components/donors/DonorsOverview.svelte +++ b/src/components/donors/DonorsOverview.svelte @@ -5,26 +5,155 @@ import DonorsEmptyState from "./DonorsEmptyState.svelte"; import ConfirmDonorDeletion from "./ConfirmDonorDeletion.svelte"; import Toastify from "toastify-js"; + import TableBottom from "../shared/TableBottom.svelte"; + import { + createSvelteTable, + flexRender, + getCoreRowModel, + getFilteredRowModel, + getPaginationRowModel, + getSortedRowModel, + renderComponent, + } from "@tanstack/svelte-table"; + import { writable } from "svelte/store"; + import { onMount } from "svelte"; + import InputElement from "../shared/InputElement.svelte"; + import TableHeader from "../shared/TableHeader.svelte"; + import TableActions from "../shared/TableActions.svelte"; $: searchvalue = ""; $: active_deletes = []; $: current_donations = []; + $: selectedDonors = + $table?.getSelectedRowModel().rows.map((row) => row.original) || []; + $: selected = + $table?.getSelectedRowModel().rows.map((row) => row.index) || []; + + $: dataLoaded = false; + let modal_open = false; let delete_donor = {}; export let current_donors = []; - const donors_promise = DonorService.donorControllerGetAll().then((val) => { - current_donors = val; + + //Section table + const columns = [ + { + accessorKey: "id", + header: () => "id", + cell: (info) => { + return "TODO:"; + }, + filterFn: `equalsString`, + }, + { + accessorKey: "name", + header: () => $_("name"), + cell: (info) => { + return "TODO:"; + }, + filterFn: `includesString`, + }, + { + accessorKey: "address", + header: () => $_("contact-information"), + cell: (info) => { + return "TODO:"; + }, + filterFn: `includesString`, + }, + { + accessorKey: "sponsorings", + header: () => $_("sponsorings"), + cell: (info) => { + return "TODO:"; + }, + filterFn: `includesString`, + }, + { + accessorKey: "sponsorings", + header: () => $_("total-donation-amount"), + cell: (info) => { + return "TODO:"; + }, + filterFn: `group`, + }, + { + accessorKey: "sponsorings", + header: () => $_("total-paid-amount"), + cell: (info) => { + return "TODO:"; + }, + enableColumnFilter: false, + }, + { + accessorKey: "actions", + header: () => $_("action"), + cell: (info) => { + return renderComponent(TableActions, { + detailsLink: `./${info.row.original.id}`, + deleteAction: () => { + active_deletes = + current_donors[ + current_donors.findIndex((r) => r.id == info.row.original.id) + ]; + }, + deleteEnabled: + store.state.jwtinfo.userdetails.permissions.includes( + "DONOR:DELETE" + ), + }); + }, + enableColumnFilter: false, + enableSorting: false, + }, + ]; + const options = writable({ + data: [], + columns: columns, + initialState: { + pagination: { + pageSize: 50, + }, + }, + enableRowSelection: true, + getCoreRowModel: getCoreRowModel(), + getFilteredRowModel: getFilteredRowModel(), + getPaginationRowModel: getPaginationRowModel(), + getSortedRowModel: getSortedRowModel(), }); - const donation_promise = DonationService.donationControllerGetAll().then( - (val) => { - current_donations = val; - } - ); + const table = createSvelteTable(options); + function should_display_based_on_id(id) { if (searchvalue.toString().slice(-1) === "*") { return id.toString().startsWith(searchvalue.replace("*", "")); } return id.toString() === searchvalue; } + + onMount(async () => { + let page = 0; + while (page >= 0) { + const donors = await DonorService.donorControllerGetAll(page, 500); + const donations = await DonationService.donationControllerGetAll( + page, + 500 + ); + if (donors.length == 0 && donations.length == 0) { + page = -2; + } + + current_donors = current_donors.concat(...donors); + current_donations = current_donations.concat(...donors); + options.update((options) => ({ + ...options, + data: current_donors, + })); + + dataLoaded = true; + page++; + } + + console.log("All donors loaded"); + }); -{#if store.state.jwtinfo.userdetails.permissions.includes('DONOR:GET')} - {#await donors_promise && donation_promise} + bind:delete_donor +/> +{#if store.state.jwtinfo.userdetails.permissions.includes("DONOR:GET")} + {#if !dataLoaded} - {:then} - {#if current_donors.length === 0} - - {:else} - -
- - - - - - - - - + + {#each $table.getRowModel().rows as row} + + + {#each row.getVisibleCells() as cell} + + {/each} + + {/each} + +
- {$_('name')} - - {$_('contact-information')} - - {$_('donations')} - - {$_('total-donation-amount')} - - {$_('total-paid-amount')} - - {$_('action')} + {:else if current_donors.length === 0} + + {:else} + +
+ + + {#each $table.getHeaderGroups() as headerGroup} + + + {#each headerGroup.headers as header} + + {/each} - - - {#each current_donors as donor} - {#if donor.firstname - .toLowerCase() - .includes( - searchvalue.toLowerCase() - ) || donor.lastname - .toLowerCase() - .includes( - searchvalue.toLowerCase() - ) || should_display_based_on_id(donor.id)} - - - - - - - {#if active_deletes[donor.id] === true} - - {:else} - - {/if} - - {/if} - {/each} - -
+ $table.toggleAllRowsSelected()} + />
-
-
-
- {donor.firstname} - {donor.middlename || ''} - {donor.lastname} -
-
-
-
- {#if donor.email} -
{donor.email}
- {/if} - {#if donor.phone} -
{donor.phone}
- {/if} - {#if donor.address.address1 !== null} - {donor.address.address1}
- - {donor.address.postalcode} - {donor.address.city} - {donor.address.country} - {/if} -
- {#if current_donations.filter((d) => d.donor.id == donor.id).length > 0} - {#each current_donations.filter((o) => o.donor.id == donor.id) as d} - {#if d.responseType === 'DISTANCEDONATION'} - {d.runner.firstname} - {d.runner.middlename || ''} - {d.runner.lastname} - {:else} - {$_('fixed-donation')}: - {(d.amount / 100) - .toFixed(2) - .toLocaleString('de-DE', { valute: 'EUR' })}€ - {/if} - {/each} - {:else}{$_('donor-has-no-associated-donations')}{/if} - - {(donor.donationAmount / 100) - .toFixed(2) - .toLocaleString('de-DE', { valute: 'EUR' })}€ - - {(donor.paidDonationAmount / 100) - .toFixed(2) - .toLocaleString('de-DE', { valute: 'EUR' })}€ - - - - - {$_('details')} - {#if store.state.jwtinfo.userdetails.permissions.includes('DONOR:DELETE')} - - {/if} -
-
- {/if} - {:catch error} -
- - {$_('general_promise_error')} - {error} - + {/each} +
+ row.toggleSelected()} + /> + + +
- {/await} +
+ + {/if} {/if}