Compare commits

..

No commits in common. "e9ce9644ff03f981cec6e9ad56aa5fdf0ff71ef4" and "019e14ab1f99906f13d36c7148d0f4b7894072f2" have entirely different histories.

4 changed files with 322 additions and 386 deletions

View File

@ -32,7 +32,7 @@
export let original_data = {}; export let original_data = {};
export let current_cards = []; export let current_cards = [];
export const addCards = (cards) => { export const addCards = (cards) => {
console.log(cards); console.log(cards)
current_cards = current_cards.concat(...cards); current_cards = current_cards.concat(...cards);
options.update((options) => ({ options.update((options) => ({
...options, ...options,
@ -155,27 +155,15 @@
}).showToast(); }).showToast();
} }
onMount(async () => { onMount(() => {
let page = 0; RunnerCardService.runnerCardControllerGetAll().then((val) => {
while (page >= 0) { current_cards = val;
const cards = await RunnerCardService.runnerCardControllerGetAll(
page,
500
);
if (cards.length == 0) {
page = -2;
}
current_cards = current_cards.concat(...cards);
options.update((options) => ({ options.update((options) => ({
...options, ...options,
data: current_cards, data: current_cards,
})); }));
dataLoaded = true; dataLoaded = true;
page++; });
}
console.log("All cards loaded");
}); });
</script> </script>
@ -241,7 +229,7 @@
...options, ...options,
data: current_cards, data: current_cards,
})); }));
$table.resetRowSelection(); $table.resetRowSelection()
}} }}
> >
{$_("delete-cards")} {$_("delete-cards")}
@ -261,10 +249,7 @@
</svg> </svg>
</button> </button>
{/if} {/if}
<GenerateRunnerCards <GenerateRunnerCards cards_show={selected.length>0} bind:generate_cards={selectedCards} />
cards_show={selected.length > 0}
bind:generate_cards={selectedCards}
/>
</div> </div>
<div class="overflow-x-auto"> <div class="overflow-x-auto">
<table class="w-full"> <table class="w-full">

View File

@ -5,16 +5,18 @@
import Toastify from "toastify-js"; import Toastify from "toastify-js";
import DonationsEmptyState from "./DonationsEmptyState.svelte"; import DonationsEmptyState from "./DonationsEmptyState.svelte";
import AddDonationPaymentModal from "./AddDonationPaymentModal.svelte"; import AddDonationPaymentModal from "./AddDonationPaymentModal.svelte";
import { onMount } from "svelte";
$: searchvalue = ""; $: searchvalue = "";
$: active_deletes = []; $: active_deletes = [];
$: dataLoaded = false;
export let current_donations = []; export let current_donations = [];
export let payment_modal_open = false; export let payment_modal_open = false;
export let editable = {}; export let editable = {};
export let original_data = {}; export let original_data = {};
export let paid_amount_input = 0; export let paid_amount_input = 0;
const donations_promise = DonationService.donationControllerGetAll().then(
(val) => {
current_donations = val;
}
);
function should_display_based_on_id(id) { function should_display_based_on_id(id) {
if (searchvalue.toString().slice(-1) === "*") { if (searchvalue.toString().slice(-1) === "*") {
return id.toString().startsWith(searchvalue.replace("*", "")); return id.toString().startsWith(searchvalue.replace("*", ""));
@ -27,97 +29,64 @@
paid_amount_input = (donation.paidAmount/100).toFixed(2); paid_amount_input = (donation.paidAmount/100).toFixed(2);
payment_modal_open = true; payment_modal_open = true;
} }
onMount(async () => {
let page = 0;
while (page >= 0) {
const donations = await DonationService.donationControllerGetAll(
page,
500
);
if (donations.length == 0) {
page = -2;
}
current_donations = current_donations.concat(...donations);
dataLoaded = true;
page++;
}
console.log("All donations loaded");
});
</script> </script>
<AddDonationPaymentModal <AddDonationPaymentModal bind:current_donations bind:original_data bind:editable bind:paid_amount_input bind:payment_modal_open />
bind:current_donations {#if store.state.jwtinfo.userdetails.permissions.includes('DONATION:GET')}
bind:original_data {#await donations_promise}
bind:editable
bind:paid_amount_input
bind:payment_modal_open
/>
{#if store.state.jwtinfo.userdetails.permissions.includes("DONATION:GET")}
{#if !dataLoaded}
<div <div
class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2" class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2"
role="alert" role="alert">
>
<p class="font-bold">donations are being loaded</p> <p class="font-bold">donations are being loaded</p>
<p class="text-sm">{$_("this-might-take-a-moment")}</p> <p class="text-sm">{$_('this-might-take-a-moment')}</p>
</div> </div>
{:else if current_donations.length === 0} {:then}
{#if current_donations.length === 0}
<DonationsEmptyState /> <DonationsEmptyState />
{:else} {:else}
<input <input
type="search" type="search"
bind:value={searchvalue} bind:value={searchvalue}
placeholder={$_("datatable.search")} placeholder={$_('datatable.search')}
aria-label={$_("datatable.search")} aria-label={$_('datatable.search')}
class="mb-4" class="mb-4" />
/>
<div <div
class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll" class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll">
>
<table class="divide-y divide-gray-200 w-full"> <table class="divide-y divide-gray-200 w-full">
<thead class="bg-gray-50"> <thead class="bg-gray-50">
<tr> <tr>
<th <th
scope="col" scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
> {$_('donor')}
{$_("donor")}
</th> </th>
<th <th
scope="col" scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
> {$_('runner')}
{$_("runner")}
</th> </th>
<th <th
scope="col" scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
> {$_('amount-per-kilometer')}
{$_("amount-per-kilometer")}
</th> </th>
<th <th
scope="col" scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
> {$_('donation-amount')}
{$_("donation-amount")}
</th> </th>
<th <th
scope="col" scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
> {$_('paid-amount')}
{$_("paid-amount")}
</th> </th>
<th <th
scope="col" scope="col"
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
> {$_('status')}
{$_("status")}
</th> </th>
<th scope="col" class="relative px-6 py-3"> <th scope="col" class="relative px-6 py-3">
<span class="sr-only">{$_("action")}</span> <span class="sr-only">{$_('action')}</span>
</th> </th>
</tr> </tr>
</thead> </thead>
@ -125,23 +94,29 @@
{#each current_donations as donation} {#each current_donations as donation}
{#if donation.donor.firstname {#if donation.donor.firstname
.toLowerCase() .toLowerCase()
.includes(searchvalue.toLowerCase()) || donation.donor.lastname .includes(
searchvalue.toLowerCase()
) || donation.donor.lastname
.toLowerCase() .toLowerCase()
.includes(searchvalue.toLowerCase()) || donation.runner?.firstname .includes(
searchvalue.toLowerCase()
) || donation.runner?.firstname
.toLowerCase() .toLowerCase()
.includes(searchvalue.toLowerCase()) || donation.runner?.lastname .includes(
searchvalue.toLowerCase()
) || donation.runner?.lastname
.toLowerCase() .toLowerCase()
.includes(searchvalue.toLowerCase()) || should_display_based_on_id(donation.id)} .includes(
searchvalue.toLowerCase()
) || should_display_based_on_id(donation.id)}
<tr data-rowid="donation_{donation.id}"> <tr data-rowid="donation_{donation.id}">
<td class="px-6 py-4 whitespace-nowrap"> <td class="px-6 py-4 whitespace-nowrap">
<div class="flex items-center"> <div class="flex items-center">
<a <a
href="../donors/{donation.donor.id}" href="../donors/{donation.donor.id}"
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800" class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800">{donation.donor.firstname}
>{donation.donor.firstname} {donation.donor.middlename || ''}
{donation.donor.middlename || ""} {donation.donor.lastname}</a>
{donation.donor.lastname}</a
>
</div> </div>
</td> </td>
<td class="px-6 py-4 whitespace-nowrap"> <td class="px-6 py-4 whitespace-nowrap">
@ -149,15 +124,13 @@
<div class="text-sm font-medium text-gray-900"> <div class="text-sm font-medium text-gray-900">
<a <a
href="../runners/{donation.runner.id}" href="../runners/{donation.runner.id}"
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800" class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800">{donation.runner.firstname}
>{donation.runner.firstname} {donation.runner.middlename || ''}
{donation.runner.middlename || ""} {donation.runner.lastname}</a>
{donation.runner.lastname}</a
>
</div> </div>
{:else} {:else}
<div class="text-sm font-medium text-gray-900"> <div class="text-sm font-medium text-gray-900">
{$_("fixed-donation")} {$_('fixed-donation')}
</div> </div>
{/if} {/if}
</td> </td>
@ -166,11 +139,11 @@
<div class="text-sm font-medium text-gray-900"> <div class="text-sm font-medium text-gray-900">
{(donation.amountPerDistance / 100) {(donation.amountPerDistance / 100)
.toFixed(2) .toFixed(2)
.toLocaleString("de-DE", { valute: "EUR" })}€ .toLocaleString('de-DE', { valute: 'EUR' })}€
</div> </div>
{:else} {:else}
<div class="text-sm font-medium text-gray-900"> <div class="text-sm font-medium text-gray-900">
{$_("fixed-donation")} {$_('fixed-donation')}
</div> </div>
{/if} {/if}
</td> </td>
@ -178,88 +151,69 @@
<div class="text-sm font-medium text-gray-900"> <div class="text-sm font-medium text-gray-900">
{(donation.amount / 100) {(donation.amount / 100)
.toFixed(2) .toFixed(2)
.toLocaleString("de-DE", { valute: "EUR" })}€ .toLocaleString('de-DE', { valute: 'EUR' })}€
</div> </div>
</td> </td>
<td class="px-6 py-4 whitespace-nowrap"> <td class="px-6 py-4 whitespace-nowrap">
<div class="text-sm font-medium text-gray-900"> <div class="text-sm font-medium text-gray-900">
{(donation.paidAmount / 100) {(donation.paidAmount / 100)
.toFixed(2) .toFixed(2)
.toLocaleString("de-DE", { valute: "EUR" })}€ .toLocaleString('de-DE', { valute: 'EUR' })}€
</div> </div>
</td> </td>
<td class="px-6 py-4 whitespace-nowrap"> <td class="px-6 py-4 whitespace-nowrap">
{#if donation.status =="PAID"} {#if donation.status =="PAID"}
<span <span
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800" class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">{$_('paid')}</span>
>{$_("paid")}</span
>
{:else} {:else}
<span <span
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800" class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800">{$_('open')}</span>
>{$_("open")}</span
>
{/if} {/if}
</td> </td>
{#if active_deletes[donation.id] === true} {#if active_deletes[donation.id] === true}
<td <td
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium" class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
>
<button <button
on:click={() => { on:click={() => {
active_deletes[donation.id] = false; active_deletes[donation.id] = false;
}} }}
tabindex="0" tabindex="0"
class="ml-4 text-indigo-600 hover:text-indigo-900 cursor-pointer" class="ml-4 text-indigo-600 hover:text-indigo-900 cursor-pointer">{$_('cancel-delete')}</button>
>{$_("cancel-delete")}</button
>
<button <button
on:click={() => { on:click={() => {
DonationService.donationControllerRemove( DonationService.donationControllerRemove(donation.id, false).then(
donation.id, (resp) => {
false
).then((resp) => {
current_donations = current_donations.filter( current_donations = current_donations.filter(
(obj) => obj.id !== donation.id (obj) => obj.id !== donation.id
); );
Toastify({ Toastify({
text: $_("donation-deleted"), text: $_('donation-deleted'),
duration: 500, duration: 500,
backgroundColor: backgroundColor:
"linear-gradient(to right, #00b09b, #96c93d)", 'linear-gradient(to right, #00b09b, #96c93d)',
}).showToast(); }).showToast();
}); }
);
}} }}
tabindex="0" tabindex="0"
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer" class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('confirm-delete')}</button>
>{$_("confirm-delete")}</button
>
</td> </td>
{:else} {:else}
<td <td
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium" class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
>
<button <button
on:click={() => { on:click={() => {open_payment_modal(donation);}}
open_payment_modal(donation); class="text-[#025a21] hover:text-green-900 mr-4">{$_('enter-payment')}</button>
}}
class="text-[#025a21] hover:text-green-900 mr-4"
>{$_("enter-payment")}</button
>
<a <a
href="./{donation.id}" href="./{donation.id}"
class="text-indigo-600 hover:text-indigo-900" class="text-indigo-600 hover:text-indigo-900">{$_('details')}</a>
>{$_("details")}</a {#if store.state.jwtinfo.userdetails.permissions.includes('DONATION:DELETE')}
>
{#if store.state.jwtinfo.userdetails.permissions.includes("DONATION:DELETE")}
<button <button
on:click={() => { on:click={() => {
active_deletes[donation.id] = true; active_deletes[donation.id] = true;
}} }}
tabindex="0" tabindex="0"
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer" class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('delete')}</button>
>{$_("delete")}</button
>
{/if} {/if}
</td> </td>
{/if} {/if}
@ -270,4 +224,12 @@
</table> </table>
</div> </div>
{/if} {/if}
{:catch error}
<div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500">
<span class="inline-block align-middle mr-8">
<b class="capitalize">{$_('general_promise_error')}</b>
{error}
</span>
</div>
{/await}
{/if} {/if}

View File

@ -50,6 +50,7 @@
})); }));
}; };
//Section table //Section table
const columns = [ const columns = [
{ {
@ -156,7 +157,16 @@
}).showToast(); }).showToast();
} }
onMount(async () => { onMount(() => {
RunnerService.runnerControllerGetAll().then((val) => {
current_runners = val;
dataLoaded = true;
options.update((options) => ({
...options,
data: current_runners,
}));
});
RunnerTeamService.runnerTeamControllerGetAll().then((val) => { RunnerTeamService.runnerTeamControllerGetAll().then((val) => {
teams = val; teams = val;
}); });
@ -165,24 +175,6 @@
orgs = val; orgs = val;
} }
); );
let page = 0;
while (page >= 0) {
const runners = await RunnerService.runnerControllerGetAll(page, 1000);
if (runners.length == 0) {
page = -2;
}
current_runners = current_runners.concat(...runners);
options.update((options) => ({
...options,
data: current_runners,
}));
dataLoaded = true;
page++;
}
console.log("All runners loaded");
}); });
</script> </script>

View File

@ -30,7 +30,6 @@
$table?.getSelectedRowModel().rows.map((row) => row.index) || []; $table?.getSelectedRowModel().rows.map((row) => row.index) || [];
$: active_delete = undefined; $: active_delete = undefined;
$: dataLoaded = false;
export let current_scans = []; export let current_scans = [];
export const addScans = (scans) => { export const addScans = (scans) => {
current_scans = current_scans.concat(...scans); current_scans = current_scans.concat(...scans);
@ -40,6 +39,15 @@
})); }));
}; };
const scans_promise = ScanService.scanControllerGetAll().then((val) => {
current_scans = val;
// handler.setRows(val);
current_scans = val;
options.update((options) => ({
...options,
data: current_scans,
}));
});
let allTracks = []; let allTracks = [];
TrackService.trackControllerGetAll().then((val) => { TrackService.trackControllerGetAll().then((val) => {
allTracks = val; allTracks = val;
@ -91,7 +99,7 @@
accessorKey: "timestamp", accessorKey: "timestamp",
header: () => $_("timestamp"), header: () => $_("timestamp"),
cell: (info) => { cell: (info) => {
return new Date(parseInt(info.getValue()) * 1000).toLocaleString(); return (new Date(parseInt(info.getValue())*1000)).toLocaleString()
}, },
enableColumnFilter: false, enableColumnFilter: false,
}, },
@ -175,26 +183,6 @@
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)", backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
}).showToast(); }).showToast();
} }
onMount(async () => {
let page = 0;
while (page >= 0) {
const scans = await ScanService.scanControllerGetAll(page, 500);
if (scans.length == 0) {
page = -2;
}
current_scans = current_scans.concat(...scans);
options.update((options) => ({
...options,
data: current_scans,
}));
dataLoaded = true;
page++;
}
console.log("All scans loaded");
});
</script> </script>
<DeleteScanModal <DeleteScanModal
@ -205,7 +193,7 @@
}} }}
/> />
{#if store.state.jwtinfo.userdetails.permissions.includes("SCAN:GET")} {#if store.state.jwtinfo.userdetails.permissions.includes("SCAN:GET")}
{#if !dataLoaded} {#await scans_promise}
<div <div
class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2" class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2"
role="alert" role="alert"
@ -213,7 +201,8 @@
<p class="font-bold">{$_("scans-are-being-loaded")}</p> <p class="font-bold">{$_("scans-are-being-loaded")}</p>
<p class="text-sm">{$_("this-might-take-a-moment")}</p> <p class="text-sm">{$_("this-might-take-a-moment")}</p>
</div> </div>
{:else if current_scans.length === 0} {:then}
{#if current_scans.length === 0}
<ScansEmptyState /> <ScansEmptyState />
{:else} {:else}
{#if selected.length > 0} {#if selected.length > 0}
@ -305,4 +294,12 @@
</div> </div>
<TableBottom {table} {selected} /> <TableBottom {table} {selected} />
{/if} {/if}
{:catch error}
<div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500">
<span class="inline-block align-middle mr-8">
<b class="capitalize">{$_("general_promise_error")}</b>
{error}
</span>
</div>
{/await}
{/if} {/if}