Compare commits
	
		
			8 Commits
		
	
	
		
			1.13.2
			...
			feature/an
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 8c56aa3c46 | |||
| f642849dbb | |||
| 7ac92ae6ca | |||
| 95af9f9914 | |||
| 1004aee16c | |||
| 0baf2fc460 | |||
| 09b59175ee | |||
| a21f61f3f3 | 
| @@ -1,340 +1,384 @@ | |||||||
| <script> | <script> | ||||||
|   import { _ } from "svelte-i18n"; | 	import { _ } from "svelte-i18n"; | ||||||
|   import { clickOutside } from "../base/outsideclick"; | 	import { clickOutside } from "../base/outsideclick"; | ||||||
|  |  | ||||||
|   import { | 	import { | ||||||
|     DonationService, | 		DonationService, | ||||||
|     DonorService, | 		DonorService, | ||||||
|     RunnerService, | 		RunnerService, | ||||||
|   } from "@odit/lfk-client-js"; | 	} from "@odit/lfk-client-js"; | ||||||
|   import Select from "svelte-select"; | 	import Select from "svelte-select"; | ||||||
|   import { createEventDispatcher, onMount } from "svelte"; | 	import { createEventDispatcher, onMount } from "svelte"; | ||||||
|   import toast from "svelte-french-toast"; | 	import toast from "svelte-french-toast"; | ||||||
|   export let modal_open; | 	export let modal_open; | ||||||
|   const dispatch = createEventDispatcher(); | 	const dispatch = createEventDispatcher(); | ||||||
|   const getDonorLabel = (option) => | 	const getDonorLabel = (option) => | ||||||
|     option.firstname + " " + (option.middlename || "") + " " + option.lastname; | 		option.firstname + " " + (option.middlename || "") + " " + option.lastname; | ||||||
|   const filterDonors = (label, filterText, option) => | 	const filterDonors = (label, filterText, option) => | ||||||
|     label.toLowerCase().includes(filterText.toLowerCase()) || | 		label.toLowerCase().includes(filterText.toLowerCase()) || | ||||||
|     option.value.id.toString().startsWith(filterText.toLowerCase()); | 		option.value.id.toString().startsWith(filterText.toLowerCase()); | ||||||
|   $: donor = 0; | 	$: donor = 0; | ||||||
|   $: runner = 0; | 	$: runner = 0; | ||||||
|   $: donors = []; | 	$: donors = []; | ||||||
|   $: runners = []; | 	$: runners = []; | ||||||
|   $: is_fixed = false; | 	$: type = "distance"; | ||||||
|   $: is_paid = false; | 	$: is_paid = false; | ||||||
|   $: amount_input = 0; | 	$: amount_input = 0; | ||||||
|   $: processed_last_submit = true; | 	$: processed_last_submit = true; | ||||||
|   $: is_amount_valid = amount_input > 0; | 	$: is_amount_valid = amount_input > 0; | ||||||
|   $: createbtnenabled = is_amount_valid; | 	$: createbtnenabled = is_amount_valid; | ||||||
|   (() => { | 	(() => { | ||||||
|     document.onkeydown = (e) => { | 		document.onkeydown = (e) => { | ||||||
|       e = e || window.event; | 			e = e || window.event; | ||||||
|       if (e.key === "Escape") { | 			if (e.key === "Escape") { | ||||||
|         modal_open = false; | 				modal_open = false; | ||||||
|       } | 			} | ||||||
|       if (e.keyCode === 13) { | 			if (e.keyCode === 13) { | ||||||
|         if (createbtnenabled === true) { | 				if (createbtnenabled === true) { | ||||||
|           createbtnenabled = false; | 					createbtnenabled = false; | ||||||
|           submit(); | 					submit(); | ||||||
|         } | 				} | ||||||
|       } | 			} | ||||||
|     }; | 		}; | ||||||
|   })(); | 	})(); | ||||||
|   function submit() { | 	function submit() { | ||||||
|     if (processed_last_submit === true) { | 		if (processed_last_submit === true) { | ||||||
|       let amount_cent = Math.floor(amount_input * 100); | 			let amount_cent = Math.floor(amount_input * 100); | ||||||
|       processed_last_submit = false; | 			processed_last_submit = false; | ||||||
|       toast.loading($_("adding-donation")); | 			toast.loading($_("adding-donation")); | ||||||
|       if (is_fixed) { | 			if (type === "fixed") { | ||||||
|         let postdata = { | 				let postdata = { | ||||||
|           donor, | 					donor, | ||||||
|           amount: amount_cent, | 					amount: amount_cent, | ||||||
|           paidAmount: 0, | 					paidAmount: 0, | ||||||
|         }; | 				}; | ||||||
|         if (is_paid) { | 				if (is_paid) { | ||||||
|           postdata.paidAmount = amount_cent; | 					postdata.paidAmount = amount_cent; | ||||||
|         } | 				} | ||||||
|         DonationService.donationControllerPostFixed(postdata) | 				DonationService.donationControllerPostFixed(postdata) | ||||||
|           .then((result) => { | 					.then((result) => { | ||||||
|             donor = donors[0].id || 0; | 						donor = donors[0].id || 0; | ||||||
|             runner = runners[0].id || 0; | 						runner = runners[0].id || 0; | ||||||
|             amount_input = 0; | 						amount_input = 0; | ||||||
|             modal_open = false; | 						modal_open = false; | ||||||
|             // | 						// | ||||||
|             toast.dismiss(); | 						toast.dismiss(); | ||||||
|             toast.success($_("donation_added")); | 						toast.success($_("donation_added")); | ||||||
|             dispatch("created", { donations: [result] }); | 						dispatch("created", { donations: [result] }); | ||||||
|           }) | 					}) | ||||||
|           .catch((err) => { | 					.catch((err) => { | ||||||
|             // | 						// | ||||||
|           }) | 					}) | ||||||
|           .finally(() => { | 					.finally(() => { | ||||||
|             processed_last_submit = true; | 						processed_last_submit = true; | ||||||
|           }); | 					}); | ||||||
|       } else { | 			} else if (type === "anonymous") { | ||||||
|         let postdata = { | 				let postdata = { | ||||||
|           donor, | 					amount: amount_cent, | ||||||
|           runner, | 					paidAmount: 0, | ||||||
|           amountPerDistance: amount_cent, | 				}; | ||||||
|         }; | 				if (is_paid) { | ||||||
|         DonationService.donationControllerPostDistance(postdata) | 					postdata.paidAmount = amount_cent; | ||||||
|           .then((result) => { | 				} | ||||||
|             donor = donors[0].id || 0; | 				DonationService.donationControllerPostFixed(postdata) | ||||||
|             runner = runners[0].id || 0; | 					.then((result) => { | ||||||
|             amount_input = 0; | 						amount_input = 0; | ||||||
|             modal_open = false; | 						modal_open = false; | ||||||
|             // | 						// | ||||||
|             toast.dismiss(); | 						toast.dismiss(); | ||||||
|             toast.success($_("donation_added")); | 						toast.success($_("donation_added")); | ||||||
|             dispatch("created", { donations: [result] }); | 						dispatch("created", { donations: [result] }); | ||||||
|           }) | 					}) | ||||||
|           .catch((err) => { | 					.catch((err) => { | ||||||
|             // | 						// | ||||||
|           }) | 					}) | ||||||
|           .finally(() => { | 					.finally(() => { | ||||||
|             processed_last_submit = true; | 						processed_last_submit = true; | ||||||
|           }); | 					}); | ||||||
|       } | 			} else if (type === "distance") { | ||||||
|     } | 				let postdata = { | ||||||
|   } | 					donor, | ||||||
|  | 					runner, | ||||||
|  | 					amountPerDistance: amount_cent, | ||||||
|  | 				}; | ||||||
|  | 				DonationService.donationControllerPostDistance(postdata) | ||||||
|  | 					.then((result) => { | ||||||
|  | 						donor = donors[0].id || 0; | ||||||
|  | 						runner = runners[0].id || 0; | ||||||
|  | 						amount_input = 0; | ||||||
|  | 						modal_open = false; | ||||||
|  | 						// | ||||||
|  | 						toast.dismiss(); | ||||||
|  | 						toast.success($_("donation_added")); | ||||||
|  | 						dispatch("created", { donations: [result] }); | ||||||
|  | 					}) | ||||||
|  | 					.catch((err) => { | ||||||
|  | 						// | ||||||
|  | 					}) | ||||||
|  | 					.finally(() => { | ||||||
|  | 						processed_last_submit = true; | ||||||
|  | 					}); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|   onMount(async () => { | 	onMount(async () => { | ||||||
|     donors = (await DonorService.donorControllerGetAll()).map( | 		donors = (await DonorService.donorControllerGetAll()).map((r) => { | ||||||
|       (r) => { | 			return { label: getDonorLabel(r), value: r }; | ||||||
|         return { label: getDonorLabel(r), value: r }; | 		}); | ||||||
|       } | 		runners = (await RunnerService.runnerControllerGetAll()).map((r) => { | ||||||
|     ); | 			return { label: getDonorLabel(r), value: r }; | ||||||
|     runners = (await RunnerService.runnerControllerGetAll()).map( | 		}); | ||||||
|       (r) => { | 	}); | ||||||
|         return { label: getDonorLabel(r), value: r }; |  | ||||||
|       } |  | ||||||
|     ); |  | ||||||
|   }); |  | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
| {#if modal_open} | {#if modal_open} | ||||||
|   <div | 	<div | ||||||
|     class="fixed z-10 inset-0 overflow-y-hidden" | 		class="fixed z-10 inset-0 overflow-y-hidden" | ||||||
|     use:clickOutside | 		use:clickOutside | ||||||
|     on:click_outside={() => { | 		on:click_outside={() => { | ||||||
|       modal_open = false; | 			modal_open = false; | ||||||
|     }} | 		}} | ||||||
|   > | 	> | ||||||
|     <div | 		<div | ||||||
|       class="flex items-end justify-center h-screen text-center sm:block p-0 lg:p-4" | 			class="flex items-end justify-center h-screen text-center sm:block p-0 lg:p-4" | ||||||
|     > | 		> | ||||||
|       <div class="fixed inset-0 transition-opacity" aria-hidden="true"> | 			<div class="fixed inset-0 transition-opacity" aria-hidden="true"> | ||||||
|         <div | 				<div | ||||||
|           class="absolute inset-0 bg-gray-500 opacity-75" | 					class="absolute inset-0 bg-neutral-500 opacity-75" | ||||||
|           data-id="modal_backdrop" | 					data-id="modal_backdrop" | ||||||
|         /> | 				/> | ||||||
|       </div> | 			</div> | ||||||
|       <span | 			<span | ||||||
|         class="hidden sm:inline-block sm:align-middle sm:h-screen" | 				class="hidden sm:inline-block sm:align-middle sm:h-screen" | ||||||
|         aria-hidden="true">​</span | 				aria-hidden="true">​</span | ||||||
|       > | 			> | ||||||
|       <div | 			<div | ||||||
|         class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10" | 				class="inline-block align-bottom text-left shadow-xl transform transition-all sm:align-middle w-full lg:w-auto min-w-auto lg:min-w-[35vw] relative z-10" | ||||||
|         role="dialog" | 				role="dialog" | ||||||
|         aria-modal="true" | 				aria-modal="true" | ||||||
|         aria-labelledby="modal-headline" | 				aria-labelledby="modal-headline" | ||||||
|       > | 			> | ||||||
|         <div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4 rounded-t-xl"> | 				<div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4 rounded-t-xl"> | ||||||
|           <div class=""> | 					<div class=""> | ||||||
|             <div | 						<div | ||||||
|               class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10" | 							class="flex-shrink-0 flex items-center justify-center size-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10" | ||||||
|             > | 						> | ||||||
|               <svg | 							<svg | ||||||
|                 class="h-6 w-6 text-blue-600" | 								class="size-6 text-blue-600" | ||||||
|                 fill="currentColor" | 								fill="currentColor" | ||||||
|                 xmlns="http://www.w3.org/2000/svg" | 								xmlns="http://www.w3.org/2000/svg" | ||||||
|                 viewBox="0 0 24 24" | 								viewBox="0 0 24 24" | ||||||
|                 width="24" | 								width="24" | ||||||
|                 height="24" | 								height="24" | ||||||
|                 ><path fill="none" d="M0 0h24v24H0z" /> | 								><path fill="none" d="M0 0h24v24H0z" /> | ||||||
|                 <path | 								<path | ||||||
|                   d="M14 2a8 8 0 013.3 15.3A8 8 0 116.7 6.7 8 8 0 0114 2zm-3 7H9v1a2.5 2.5 0 00-.16 5h2.25a.5.5 0 010 1H7v2h2v1h2v-1a2.5 2.5 0 00.16-5H8.91a.5.5 0 010-1H13v-2h-2V9zm3-5a5.99 5.99 0 00-4.48 2.01 8 8 0 018.47 8.47A6 6 0 0014 4z" | 									d="M14 2a8 8 0 013.3 15.3A8 8 0 116.7 6.7 8 8 0 0114 2zm-3 7H9v1a2.5 2.5 0 00-.16 5h2.25a.5.5 0 010 1H7v2h2v1h2v-1a2.5 2.5 0 00.16-5H8.91a.5.5 0 010-1H13v-2h-2V9zm3-5a5.99 5.99 0 00-4.48 2.01 8 8 0 018.47 8.47A6 6 0 0014 4z" | ||||||
|                 /></svg | 								/></svg | ||||||
|               > | 							> | ||||||
|             </div> | 						</div> | ||||||
|             <div class="mt-3"> | 						<div class="mt-3"> | ||||||
|               <h3 class="text-lg leading-6 font-medium text-gray-900"> |               <h3 class="text-xl leading-6 font-medium text-neutral-900"> | ||||||
|                 {#if is_fixed} |                 Sponsoring erstellen | ||||||
|                   {$_("create-a-new-fixed-donation")} |  | ||||||
|                 {:else}{$_("create-a-new-distance-donation")}{/if} |  | ||||||
|               </h3> |               </h3> | ||||||
|               <label class="content-center align-middle object-center"> | 							<nav | ||||||
|                 <span class="text-base" class:text-gray-300={is_fixed} | 								class="relative z-0 flex border border-neutral-200 rounded-xl overflow-hidden mb-2" | ||||||
|                   >{$_("distance-donation")}</span | 							> | ||||||
|                 > | 								<button | ||||||
|                 <input | 									on:click={() => { | ||||||
|                   class="toggle relative w-10 h-5 transition-all duration-200 ease-in-out bg-gray-400 rounded-full shadow-inner outline-none appearance-none align-middle" | 										type = "distance"; | ||||||
|                   type="checkbox" | 									}} | ||||||
|                   bind:checked={is_fixed} | 									type="button" | ||||||
|                 /> | 									id="bar-with-underline-item-1" | ||||||
|                 <span class="ml-2 text-base" class:text-gray-300={!is_fixed} | 									class:donation_active_tab={type === "distance"} | ||||||
|                   >{$_("fixed-donation")}</span | 									class:donation_inactive_tab={type !== "distance"} | ||||||
|                 > | 									aria-selected={type === "distance"} | ||||||
|               </label> | 									role="tab" | ||||||
|               <div class="mb-6"> | 								> | ||||||
|                 <p class="text-sm text-gray-500"> | 									{$_("spende_pro_km")} | ||||||
|                   {$_( | 								</button> | ||||||
|                     "please-provide-the-nessecary-information-to-create-a-new-donation" | 								<button | ||||||
|                   )} | 									on:click={() => { | ||||||
|                 </p> | 										type = "fixed"; | ||||||
|               </div> | 									}} | ||||||
|               <div class="grid grid-cols-6 gap-2 lg:gap-6 text-left"> | 									type="button" | ||||||
|                 <div class="col-span-6"> | 									id="bar-with-underline-item-2" | ||||||
|                   <label | 									class:donation_active_tab={type === "fixed"} | ||||||
|                     for="donor" | 									class:donation_inactive_tab={type !== "fixed"} | ||||||
|                     class="block text-sm font-medium text-gray-700" | 									aria-selected={type === "fixed"} | ||||||
|                     >{$_("donor")}</label | 									role="tab" | ||||||
|                   > | 								> | ||||||
|                   <Select | 									{$_("festbetrag")} | ||||||
|                     containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2" | 								</button> | ||||||
|                     itemFilter={(label, filterText, option) => | 								<button | ||||||
|                       filterDonors(label, filterText, option)} | 									on:click={() => { | ||||||
|                     items={donors} | 										type = "anonymous"; | ||||||
|                     showChevron={true} | 									}} | ||||||
|                     placeholder={$_("search-for-donor-name-or-id")} | 									type="button" | ||||||
|                     noOptionsMessage={$_("no-donors-found")} | 									id="bar-with-underline-item-3" | ||||||
|                     on:select={(selectedValue) => | 									class:donation_active_tab={type === "anonymous"} | ||||||
|                       (donor = selectedValue.detail.value.id)} | 									class:donation_inactive_tab={type !== "anonymous"} | ||||||
|                     on:clear={() => (donors = null)} | 									aria-selected={type === "anonymous"} | ||||||
|                   /> | 									role="tab" | ||||||
|                 </div> | 								> | ||||||
|                 {#if !is_fixed} | 									{$_("anonyme_spende")} | ||||||
|                   <div class="col-span-6"> | 								</button> | ||||||
|                     <label | 							</nav> | ||||||
|                       for="donor" |  | ||||||
|                       class="block text-sm font-medium text-gray-700" | 							<div class="grid grid-cols-6 gap-2 lg:gap-6 text-left"> | ||||||
|                       >{$_("runner")}</label | 								{#if type === "anonymous"} | ||||||
|                     > | 									<div class="col-span-6"> | ||||||
|                     <Select | 										<label | ||||||
|                       containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2" | 											for="donation_amount_eur" | ||||||
|                       itemFilter={(label, filterText, option) => | 											class="block text-sm font-medium text-neutral-900" | ||||||
|                         filterDonors(label, filterText, option)} | 										> | ||||||
|                       items={runners} | 											{$_("donation-amount")}</label | ||||||
|                       showChevron={true} | 										> | ||||||
|                       placeholder={$_("search-for-runner-by-name-or-id")} | 										<div class="mt-1 flex rounded-md shadow-sm"> | ||||||
|                       noOptionsMessage={$_("no-runners-found")} | 											<input | ||||||
|                       on:select={(selectedValue) => | 												autocomplete="off" | ||||||
|                         (runner = selectedValue.detail.value.id)} | 												class:border-red-500={!is_amount_valid} | ||||||
|                       on:clear={() => (runner = null)} | 												class:focus:border-red-500={!is_amount_valid} | ||||||
|                     /> | 												class:focus:ring-red-500={!is_amount_valid} | ||||||
|                   </div> | 												bind:value={amount_input} | ||||||
|                 {/if} | 												type="number" | ||||||
|                 <div class="col-span-6"> | 												step="0.01" | ||||||
|                   <label | 												name="donation_amount_eur" | ||||||
|                     for="donation_amount_eur" | 												class="focus:ring-indigo-500 focus:border-indigo-500 flex-1 block w-full rounded-none rounded-l-md sm:text-sm border-neutral-300 border bg-neutral-50 text-neutral-800 p-2" | ||||||
|                     class="block text-sm font-medium text-gray-700" | 												placeholder="2.00" | ||||||
|                   > | 											/> | ||||||
|                     {#if !is_fixed} | 											<span | ||||||
|                       {$_("amount-per-kilometer")} | 												class="inline-flex items-center px-3 rounded-r-md border border-neutral-300 bg-neutral-50 text-neutral-500 text-sm" | ||||||
|                     {:else}{$_("donation-amount")}{/if}</label | 												>€</span | ||||||
|                   > | 											> | ||||||
|                   <div class="mt-1 flex rounded-md shadow-sm"> | 										</div> | ||||||
|                     <input | 										{#if !is_amount_valid} | ||||||
|                       autocomplete="off" | 											<span | ||||||
|                       class:border-red-500={!is_amount_valid} | 												class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1" | ||||||
|                       class:focus:border-red-500={!is_amount_valid} | 											> | ||||||
|                       class:focus:ring-red-500={!is_amount_valid} | 												{$_("donation-amount-must-be-greater-that-0-00eur")} | ||||||
|                       bind:value={amount_input} | 											</span> | ||||||
|                       type="number" | 										{/if} | ||||||
|                       step="0.01" | 									</div> | ||||||
|                       name="donation_amount_eur" | 								{:else} | ||||||
|                       class="focus:ring-indigo-500 focus:border-indigo-500 flex-1 block w-full rounded-none rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 p-2" | 									<div class="col-span-6"> | ||||||
|                       placeholder="2.00" | 										<label | ||||||
|                     /> | 											for="donor" | ||||||
|                     <span | 											class="block text-sm font-medium text-neutral-900" | ||||||
|                       class="inline-flex items-center px-3 rounded-r-md border border-gray-300 bg-gray-50 text-gray-500 text-sm" | 											>{$_("donor")}</label | ||||||
|                       >€</span | 										> | ||||||
|                     > | 										<Select | ||||||
|                   </div> | 											containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-neutral-300 border bg-neutral-50 text-neutral-800 rounded-md p-2" | ||||||
|                   {#if !is_amount_valid} | 											itemFilter={(label, filterText, option) => | ||||||
|                     <span | 												filterDonors(label, filterText, option)} | ||||||
|                       class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1" | 											items={donors} | ||||||
|                     > | 											showChevron={true} | ||||||
|                       {$_("donation-amount-must-be-greater-that-0-00eur")} | 											placeholder={$_("search-for-donor-name-or-id")} | ||||||
|                     </span> | 											noOptionsMessage={$_("no-donors-found")} | ||||||
|                   {/if} | 											on:select={(selectedValue) => | ||||||
|                 </div> | 												(donor = selectedValue.detail.value.id)} | ||||||
|                 {#if is_fixed} | 											on:clear={() => (donors = null)} | ||||||
|                   <div class="col-span-6"> | 										/> | ||||||
|                     <label | 									</div> | ||||||
|                       for="paid" | 									{#if type === "distance"} | ||||||
|                       class="block text-sm font-medium text-gray-700" | 										<div class="col-span-6"> | ||||||
|                       >{$_("already-paid")}</label | 											<label | ||||||
|                     > | 												for="donor" | ||||||
|                     <p class="text-gray-500"> | 												class="block text-sm font-medium text-neutral-900" | ||||||
|                       <input | 												>{$_("runner")}</label | ||||||
|                         id="paid" | 											> | ||||||
|                         bind:checked={is_paid} | 											<Select | ||||||
|                         name="paid" | 												containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-neutral-300 border bg-neutral-50 text-neutral-800 rounded-md p-2" | ||||||
|                         type="checkbox" | 												itemFilter={(label, filterText, option) => | ||||||
|                         class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded" | 													filterDonors(label, filterText, option)} | ||||||
|                       /> | 												items={runners} | ||||||
|                       <span class="align-text-bottom"> | 												showChevron={true} | ||||||
|                         {#if is_paid} | 												placeholder={$_("search-for-runner-by-name-or-id")} | ||||||
|                           {$_("paid")} | 												noOptionsMessage={$_("no-runners-found")} | ||||||
|                         {:else} | 												on:select={(selectedValue) => | ||||||
|                           {$_("open")} | 													(runner = selectedValue.detail.value.id)} | ||||||
|                         {/if} | 												on:clear={() => (runner = null)} | ||||||
|                       </span> | 											/> | ||||||
|                     </p> | 										</div> | ||||||
|                   </div> | 									{/if} | ||||||
|                 {/if} | 									<div class="col-span-6"> | ||||||
|               </div> | 										<label | ||||||
|             </div> | 											for="donation_amount_eur" | ||||||
|           </div> | 											class="block text-sm font-medium text-neutral-900" | ||||||
|         </div> | 										> | ||||||
|         <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10"> | 											{#if type === "fixed"} | ||||||
|           <button | 												{$_("donation-amount")} | ||||||
|             disabled={!createbtnenabled} | 											{:else}{$_("amount-per-kilometer")}{/if}</label | ||||||
|             class:opacity-50={!createbtnenabled} | 										> | ||||||
|             on:click={submit} | 										<div class="mt-1 flex rounded-md shadow-sm"> | ||||||
|             type="button" | 											<input | ||||||
|             class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500" | 												autocomplete="off" | ||||||
|           > | 												class:border-red-500={!is_amount_valid} | ||||||
|             {$_("create")} | 												class:focus:border-red-500={!is_amount_valid} | ||||||
|           </button> | 												class:focus:ring-red-500={!is_amount_valid} | ||||||
|           <button | 												bind:value={amount_input} | ||||||
|             on:click={() => { | 												type="number" | ||||||
|               modal_open = false; | 												step="0.01" | ||||||
|             }} | 												name="donation_amount_eur" | ||||||
|             type="button" | 												class="focus:ring-indigo-500 focus:border-indigo-500 flex-1 block w-full rounded-none rounded-l-md sm:text-sm border-neutral-300 border bg-neutral-50 text-neutral-800 p-2" | ||||||
|             class="w-full justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 hidden lg:block" | 												placeholder="2.00" | ||||||
|           > | 											/> | ||||||
|             {$_("cancel")} | 											<span | ||||||
|           </button> | 												class="inline-flex items-center px-3 rounded-r-md border border-neutral-300 bg-neutral-50 text-neutral-500 text-sm" | ||||||
|         </div> | 												>€</span | ||||||
|       </div> | 											> | ||||||
|     </div> | 										</div> | ||||||
|   </div> | 										{#if !is_amount_valid} | ||||||
|  | 											<span | ||||||
|  | 												class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1" | ||||||
|  | 											> | ||||||
|  | 												{$_("donation-amount-must-be-greater-that-0-00eur")} | ||||||
|  | 											</span> | ||||||
|  | 										{/if} | ||||||
|  | 									</div> | ||||||
|  | 								{/if} | ||||||
|  | 								{#if type === "fixed" || type === "anonymous"} | ||||||
|  | 									<div class="flex"> | ||||||
|  | 										<input | ||||||
|  | 											bind:checked={is_paid} | ||||||
|  | 											type="checkbox" | ||||||
|  | 											class="shrink-0 mt-0.5 border-neutral-200 rounded-sm text-blue-600 focus:ring-blue-500 checked:border-blue-500 disabled:opacity-50 disabled:pointer-events-none" | ||||||
|  | 											id="hs-default-checkbox" | ||||||
|  | 										/> | ||||||
|  | 										<label | ||||||
|  | 											for="hs-default-checkbox" | ||||||
|  | 											class="text-base text-neutral-900 ms-2 font-medium" | ||||||
|  | 											>{$_("already-paid")}</label | ||||||
|  | 										> | ||||||
|  | 									</div> | ||||||
|  | 								{/if} | ||||||
|  | 							</div> | ||||||
|  | 						</div> | ||||||
|  | 					</div> | ||||||
|  | 				</div> | ||||||
|  | 				<div | ||||||
|  | 					class="bg-neutral-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10" | ||||||
|  | 				> | ||||||
|  | 					<button | ||||||
|  | 						disabled={!createbtnenabled} | ||||||
|  | 						class:opacity-50={!createbtnenabled} | ||||||
|  | 						on:click={submit} | ||||||
|  | 						type="button" | ||||||
|  | 						class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500" | ||||||
|  | 					> | ||||||
|  | 						{$_("create")} | ||||||
|  | 					</button> | ||||||
|  | 					<button | ||||||
|  | 						on:click={() => { | ||||||
|  | 							modal_open = false; | ||||||
|  | 						}} | ||||||
|  | 						type="button" | ||||||
|  | 						class="w-full justify-center rounded-md border border-neutral-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-neutral-900 hover:bg-neutral-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 hidden lg:block" | ||||||
|  | 					> | ||||||
|  | 						{$_("cancel")} | ||||||
|  | 					</button> | ||||||
|  | 				</div> | ||||||
|  | 			</div> | ||||||
|  | 		</div> | ||||||
|  | 	</div> | ||||||
| {/if} | {/if} | ||||||
|  |  | ||||||
| <style> |  | ||||||
|   .toggle:before { |  | ||||||
|     content: ""; |  | ||||||
|     position: absolute; |  | ||||||
|     width: 1.25rem; |  | ||||||
|     height: 1.25rem; |  | ||||||
|     border-radius: 50%; |  | ||||||
|     top: 0; |  | ||||||
|     left: 0; |  | ||||||
|     transform: scale(1.1); |  | ||||||
|     box-shadow: 0 0.125rem 0.5rem rgba(0, 0, 0, 0.2); |  | ||||||
|     background-color: white; |  | ||||||
|     transition: 0.2s ease-in-out; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   .toggle:checked { |  | ||||||
|     /* @apply: bg-indigo-400; */ |  | ||||||
|     background-color: #7f9cf5; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   .toggle:checked:before { |  | ||||||
|     left: 1.25rem; |  | ||||||
|   } |  | ||||||
| </style> |  | ||||||
|   | |||||||
| @@ -1,18 +1,21 @@ | |||||||
| <script> | <script> | ||||||
|   import { _ } from "svelte-i18n"; | 	import { _ } from "svelte-i18n"; | ||||||
|   export let donor; | 	export let donor; | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
| {#if !donor || donor.firstname == 0} | {#if !donor || donor.firstname == 0} | ||||||
|   {$_("donor-has-no-associated-donations")} | 	<span | ||||||
|  | 		class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800 border border-current" | ||||||
|  | 		>{$_('anonymer_sponsor')}</span | ||||||
|  | 	> | ||||||
| {:else} | {:else} | ||||||
|   <div class="flex items-center"> | 	<div class="flex items-center"> | ||||||
|     <a | 		<a | ||||||
|       href="../donors/{donor.id}" | 			href="../donors/{donor.id}" | ||||||
|       class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800 border border-current" | 			class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800 border border-current" | ||||||
|       >{donor.firstname} | 			>{donor.firstname} | ||||||
|       {#if donor.middlename}{donor.middlename}{/if} | 			{#if donor.middlename}{donor.middlename}{/if} | ||||||
|       {donor.lastname}</a | 			{donor.lastname}</a | ||||||
|     > | 		> | ||||||
|   </div> | 	</div> | ||||||
| {/if} | {/if} | ||||||
|   | |||||||
| @@ -41,6 +41,8 @@ | |||||||
|     "already-paid": "Bereits bezahlt", |     "already-paid": "Bereits bezahlt", | ||||||
|     "amount": "Anzahl", |     "amount": "Anzahl", | ||||||
|     "amount-per-kilometer": "Betrag pro Kilometer", |     "amount-per-kilometer": "Betrag pro Kilometer", | ||||||
|  |     "anonyme_spende": "Anonyme Spende", | ||||||
|  |     "anonymer_sponsor": "👻 Anonymer Sponsor", | ||||||
|     "apartment-suite-etc": "Apartment, Wohnung, etc.", |     "apartment-suite-etc": "Apartment, Wohnung, etc.", | ||||||
|     "api-endpoint": "API-Endpunkt", |     "api-endpoint": "API-Endpunkt", | ||||||
|     "application_name": "Lauf für Kaya! - Admin", |     "application_name": "Lauf für Kaya! - Admin", | ||||||
| @@ -224,6 +226,7 @@ | |||||||
|     "error_on_login": "😢Fehler beim Login", |     "error_on_login": "😢Fehler beim Login", | ||||||
|     "everything-concerning-your-profile": "Alles zu deinem Profil", |     "everything-concerning-your-profile": "Alles zu deinem Profil", | ||||||
|     "faq": "FAQ", |     "faq": "FAQ", | ||||||
|  |     "festbetrag": "Festbetrag", | ||||||
|     "filename_sponsoringquittungsliste": "SponsoringQuittungsListe", |     "filename_sponsoringquittungsliste": "SponsoringQuittungsListe", | ||||||
|     "filter-by-organization-team": "Filtern nach Organisation / Team", |     "filter-by-organization-team": "Filtern nach Organisation / Team", | ||||||
|     "first-name": "Vorname", |     "first-name": "Vorname", | ||||||
| @@ -418,6 +421,7 @@ | |||||||
|     "settings": "Einstellungen", |     "settings": "Einstellungen", | ||||||
|     "settings-for-your-profile": "Die Einstellungen deines Accounts", |     "settings-for-your-profile": "Die Einstellungen deines Accounts", | ||||||
|     "something-about-the-group": "Infos zur Gruppe", |     "something-about-the-group": "Infos zur Gruppe", | ||||||
|  |     "spende_pro_km": "Spende pro km", | ||||||
|     "sponsoring-quittungs-liste_herunterladen": "Sponsoring-Quittungs-Liste herunterladen", |     "sponsoring-quittungs-liste_herunterladen": "Sponsoring-Quittungs-Liste herunterladen", | ||||||
|     "sponsorings": "Sponsoringerklaerungen", |     "sponsorings": "Sponsoringerklaerungen", | ||||||
|     "station-deleted": "Scannerstation gelöscht", |     "station-deleted": "Scannerstation gelöscht", | ||||||
|   | |||||||
| @@ -41,6 +41,8 @@ | |||||||
|     "already-paid": "Already paid", |     "already-paid": "Already paid", | ||||||
|     "amount": "Amount", |     "amount": "Amount", | ||||||
|     "amount-per-kilometer": "Amount per kilometer", |     "amount-per-kilometer": "Amount per kilometer", | ||||||
|  |     "anonyme_spende": "Anonymous Donation", | ||||||
|  |     "anonymer_sponsor": "👻 Anonymous Donor", | ||||||
|     "apartment-suite-etc": "Apartment, suite, etc.", |     "apartment-suite-etc": "Apartment, suite, etc.", | ||||||
|     "api-endpoint": "API-Endpoint", |     "api-endpoint": "API-Endpoint", | ||||||
|     "application_name": "Lauf für Kaya! - Admin", |     "application_name": "Lauf für Kaya! - Admin", | ||||||
| @@ -224,6 +226,7 @@ | |||||||
|     "error_on_login": "Error on login", |     "error_on_login": "Error on login", | ||||||
|     "everything-concerning-your-profile": "Everything concerning your profile", |     "everything-concerning-your-profile": "Everything concerning your profile", | ||||||
|     "faq": "FAQ", |     "faq": "FAQ", | ||||||
|  |     "festbetrag": "Fixed Donation", | ||||||
|     "filename_sponsoringquittungsliste": "DonorReceiptList", |     "filename_sponsoringquittungsliste": "DonorReceiptList", | ||||||
|     "filter-by-organization-team": "Filter by Organization/ Team", |     "filter-by-organization-team": "Filter by Organization/ Team", | ||||||
|     "first-name": "First name", |     "first-name": "First name", | ||||||
| @@ -418,6 +421,7 @@ | |||||||
|     "settings": "Settings", |     "settings": "Settings", | ||||||
|     "settings-for-your-profile": "Settings for your profile", |     "settings-for-your-profile": "Settings for your profile", | ||||||
|     "something-about-the-group": "Something about the group...", |     "something-about-the-group": "Something about the group...", | ||||||
|  |     "spende_pro_km": "donation per km", | ||||||
|     "sponsoring-quittungs-liste_herunterladen": "Download donor receipt list", |     "sponsoring-quittungs-liste_herunterladen": "Download donor receipt list", | ||||||
|     "sponsorings": "Sponsorings", |     "sponsorings": "Sponsorings", | ||||||
|     "station-deleted": "station deleted", |     "station-deleted": "station deleted", | ||||||
|   | |||||||
| @@ -25,3 +25,9 @@ | |||||||
| #html5-qrcode-button-camera-stop { | #html5-qrcode-button-camera-stop { | ||||||
| 	@apply px-2 inline-flex text-lg leading-5 font-semibold rounded-md border border-current bg-red-100 text-red-800 mb-2 cursor-pointer; | 	@apply px-2 inline-flex text-lg leading-5 font-semibold rounded-md border border-current bg-red-100 text-red-800 mb-2 cursor-pointer; | ||||||
| } | } | ||||||
|  | .donation_inactive_tab { | ||||||
|  | 	@apply min-w-0 flex-1 bg-white first:border-s-0 border-s border-b-2 border-neutral-200 py-4 px-4 text-neutral-800 hover:text-neutral-700 text-sm font-medium text-center overflow-hidden hover:bg-neutral-200 cursor-pointer focus:z-10 focus:outline-hidden focus:bg-neutral-200 disabled:opacity-50 disabled:pointer-events-none; | ||||||
|  | } | ||||||
|  | .donation_active_tab { | ||||||
|  | 	@apply min-w-0 flex-1 bg-blue-400 text-white first:border-s-0 border-s border-b-2 border-neutral-200 py-4 px-4 text-sm font-medium text-center overflow-hidden cursor-pointer focus:outline-hidden; | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user