Compare commits

...

2 Commits

Author SHA1 Message Date
868dc3f7e2
chore(release): 1.12.2
All checks were successful
Build release images / build-container (push) Successful in 1m3s
2025-04-28 21:12:35 +02:00
9e8c236281
feat(cardassignment): Now with hand scanner support 2025-04-28 21:07:42 +02:00
6 changed files with 554 additions and 502 deletions

View File

@ -2,8 +2,15 @@
All notable changes to this project will be documented in this file. Dates are displayed in UTC. All notable changes to this project will be documented in this file. Dates are displayed in UTC.
#### [1.12.2](https://git.odit.services/lfk/frontend/compare/1.12.1...1.12.2)
- feat(cardassignment): Now with hand scanner support [`9e8c236`](https://git.odit.services/lfk/frontend/commit/9e8c236281f6686318c27dcb1bd02dfbc2b30ee8)
#### [1.12.1](https://git.odit.services/lfk/frontend/compare/1.12.0...1.12.1) #### [1.12.1](https://git.odit.services/lfk/frontend/compare/1.12.0...1.12.1)
> 28 April 2025
- chore(release): 1.12.1 [`827fb31`](https://git.odit.services/lfk/frontend/commit/827fb317bc946268e4a1d60b15f3805b67b240f6)
- fix(donations): Don't show enter payment for anon donations [`32f72df`](https://git.odit.services/lfk/frontend/commit/32f72df10583a08efb26e0983c0c5c829ab03e19) - fix(donations): Don't show enter payment for anon donations [`32f72df`](https://git.odit.services/lfk/frontend/commit/32f72df10583a08efb26e0983c0c5c829ab03e19)
- chore(deps): Fresh lock [`1ec8e21`](https://git.odit.services/lfk/frontend/commit/1ec8e2186bdcd69c2acbc785feef4927973bc986) - chore(deps): Fresh lock [`1ec8e21`](https://git.odit.services/lfk/frontend/commit/1ec8e2186bdcd69c2acbc785feef4927973bc986)
- fix(donations): Support anon donations in deletion modal [`27187b4`](https://git.odit.services/lfk/frontend/commit/27187b428da1e757f85392d77d49670f51a19829) - fix(donations): Support anon donations in deletion modal [`27187b4`](https://git.odit.services/lfk/frontend/commit/27187b428da1e757f85392d77d49670f51a19829)

View File

@ -13,7 +13,7 @@
<body> <body>
<span style="display: none; visibility: hidden" id="buildinfo" <span style="display: none; visibility: hidden" id="buildinfo"
>RELEASE_INFO-1.12.1-RELEASE_INFO</span >RELEASE_INFO-1.12.2-RELEASE_INFO</span
> >
<noscript>You need to enable JavaScript to run this app.</noscript> <noscript>You need to enable JavaScript to run this app.</noscript>
<script src="/env.js"></script> <script src="/env.js"></script>

View File

@ -1,6 +1,6 @@
{ {
"name": "@odit/lfk-frontend", "name": "@odit/lfk-frontend",
"version": "1.12.1", "version": "1.12.2",
"type": "module", "type": "module",
"scripts": { "scripts": {
"i18n-order": "node order.js", "i18n-order": "node order.js",

View File

@ -1,16 +1,111 @@
<script> <script>
import { _ } from "svelte-i18n"; import { _, time } from "svelte-i18n";
import { RunnerCardService, RunnerService } from "@odit/lfk-client-js"; import { RunnerCardService, RunnerService } from "@odit/lfk-client-js";
import QrCodeScanner from "./QrCodeScanner.svelte"; import QrCodeScanner from "./QrCodeScanner.svelte";
import { onMount } from "svelte";
let state = "scan_runner"; let state = "scan_runner";
let runnerinfo = { id: 0, firstname: "", lastname: "" }; let runnerinfo = { id: 0, firstname: "", lastname: "" };
let cardCode = ""; let cardCode = "";
let scannerActive = true; let scannerActive = true;
let barcodeInput;
let nextButton;
let tryAgainButton;
function resetAll() { function resetAll() {
state = "scan_runner"; state = "scan_runner";
runnerinfo = { id: 0, firstname: "", lastname: "" }; runnerinfo = { id: 0, firstname: "", lastname: "" };
cardCode = ""; cardCode = "";
scannerActive = true; scannerActive = true;
setTimeout(() => {
barcodeInput && barcodeInput.focus();
}, 100);
}
onMount(() => {
if (barcodeInput) {
barcodeInput.focus();
}
});
function handleInput(input) {
if (runnerinfo.id === 0) {
new Audio("/beep.mp3").play();
if (input.includes("https://portal.lauf-fuer-kaya.de/profile/")) {
const runnerID = JSON.parse(
atob(
input
.replace("https://portal.lauf-fuer-kaya.de/profile/", "")
.split(".")[1]
)
).id;
RunnerService.runnerControllerGetOne(runnerID)
.then((runner) => {
runnerinfo = runner;
})
.catch((e) => {
console.error(e);
state = "error_runner";
setTimeout(() => {
tryAgainButton && tryAgainButton.focus();
}, 100);
// resetAll();
});
} else {
const runnerID = parseInt(input);
RunnerService.runnerControllerGetOne(runnerID)
.then((runner) => {
runnerinfo = runner;
})
.catch((e) => {
console.error(e);
state = "error_runner";
setTimeout(() => {
tryAgainButton && tryAgainButton.focus();
}, 100);
// resetAll();
});
}
} else {
if (`${input}`.length > 10) {
cardCode = input;
new Audio("/beep.mp3").play();
state = "assigning";
RunnerCardService.runnerCardControllerGetAll()
.then((cards) => {
// console.log(cards);
const card = cards.find((c) => c.code === cardCode);
if (card) {
console.log("card found", card);
RunnerCardService.runnerCardControllerPut(card.id, {
enabled: true,
id: card.id,
runner: runnerinfo.id,
})
.then(() => {
state = "done";
setTimeout(() => {
nextButton && nextButton.focus();
}, 100);
})
.catch(() => {
state = "error_card";
scannerActive = false;
setTimeout(() => {
tryAgainButton && tryAgainButton.focus();
}, 100);
});
} else {
console.log("card not found");
// scannerActive = true;
state = "error_card";
scannerActive = false;
}
})
.catch(() => {
scannerActive = true;
});
}
}
} }
</script> </script>
@ -257,6 +352,7 @@
on:click={() => { on:click={() => {
resetAll(); resetAll();
}} }}
bind:this={nextButton}
type="button" type="button"
class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 focus:outline-hidden focus:bg-blue-200 disabled:opacity-50 disabled:pointer-events-none dark:text-blue-500 dark:bg-blue-800/30 dark:hover:bg-blue-800/20 dark:focus:bg-blue-800/20 mt-2" class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 focus:outline-hidden focus:bg-blue-200 disabled:opacity-50 disabled:pointer-events-none dark:text-blue-500 dark:bg-blue-800/30 dark:hover:bg-blue-800/20 dark:focus:bg-blue-800/20 mt-2"
> >
@ -307,6 +403,7 @@
on:click={() => { on:click={() => {
resetAll(); resetAll();
}} }}
bind:this={tryAgainButton}
type="button" type="button"
class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 focus:outline-hidden focus:bg-blue-200 disabled:opacity-50 disabled:pointer-events-none dark:text-blue-500 dark:bg-blue-800/30 dark:hover:bg-blue-800/20 dark:focus:bg-blue-800/20 mt-2" class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-blue-100 text-blue-800 hover:bg-blue-200 focus:outline-hidden focus:bg-blue-200 disabled:opacity-50 disabled:pointer-events-none dark:text-blue-500 dark:bg-blue-800/30 dark:hover:bg-blue-800/20 dark:focus:bg-blue-800/20 mt-2"
> >
@ -397,82 +494,28 @@
} }
scannerActive = false; scannerActive = false;
console.log({ type: "DETECT", code: e.detail.decodedText }); console.log({ type: "DETECT", code: e.detail.decodedText });
if (runnerinfo.id === 0) { handleInput(e.detail.decodedText);
new Audio("/beep.mp3").play();
if (
e.detail.decodedText.includes(
"https://portal.lauf-fuer-kaya.de/profile/"
)
) {
const runnerID = JSON.parse(
atob(
e.detail.decodedText
.replace("https://portal.lauf-fuer-kaya.de/profile/", "")
.split(".")[1]
)
).id;
RunnerService.runnerControllerGetOne(runnerID)
.then((runner) => {
runnerinfo = runner;
})
.catch((e) => {
console.error(e);
state = "error_runner";
// resetAll();
});
} else {
const runnerID = parseInt(e.detail.decodedText);
RunnerService.runnerControllerGetOne(runnerID)
.then((runner) => {
runnerinfo = runner;
})
.catch((e) => {
console.error(e);
state = "error_runner";
// resetAll();
});
}
} else {
if (`${e.detail.decodedText}`.length > 10) {
cardCode = e.detail.decodedText;
new Audio("/beep.mp3").play();
state = "assigning";
RunnerCardService.runnerCardControllerGetAll()
.then((cards) => {
// console.log(cards);
const card = cards.find((c) => c.code === cardCode);
if (card) {
console.log("card found", card);
RunnerCardService.runnerCardControllerPut(card.id, {
enabled: true,
id: card.id,
runner: runnerinfo.id,
})
.then(() => {
state = "done";
})
.catch(() => {
state = "error_card";
scannerActive = false;
});
} else {
console.log("card not found");
// scannerActive = true;
state = "error_card";
scannerActive = false;
}
})
.catch(() => {
scannerActive = true;
});
}
}
} }
}} }}
width={320} width={320}
height={320} height={320}
class="w-full max-w-sm bg-neutral-300 rounded-lg overflow-hidden" class="w-full max-w-sm bg-neutral-300 rounded-lg overflow-hidden"
/> />
<form
on:submit={(e) => {
handleInput(barcodeInput.value);
barcodeInput.value = "";
e.preventDefault();
}}
class="mt-2"
>
<input
type="text"
placeholder={$_("barcode_scanner")}
class="w-full max-w-sm bg-neutral-300 rounded-lg overflow-hidden mt-2"
bind:this={barcodeInput}
/>
</form>
{/if} {/if}
{#if runnerinfo.id !== 0 && state !== "scan_card"} {#if runnerinfo.id !== 0 && state !== "scan_card"}
<button <button

View File

@ -52,6 +52,7 @@
"available-permissions": "Verfügbar", "available-permissions": "Verfügbar",
"average-distance": "∅ Strecke/Läufer", "average-distance": "∅ Strecke/Läufer",
"average-donation": "∅ Sponsoring", "average-donation": "∅ Sponsoring",
"barcode_scanner": "Scannen mit Handscanner",
"by": "von", "by": "von",
"cancel": "Abbrechen", "cancel": "Abbrechen",
"cancel-delete": "Löschen abbrechen", "cancel-delete": "Löschen abbrechen",

View File

@ -52,6 +52,7 @@
"available-permissions": "available", "available-permissions": "available",
"average-distance": "∅ distance", "average-distance": "∅ distance",
"average-donation": "∅ donation", "average-donation": "∅ donation",
"barcode_scanner": "Scan via barcode scanner",
"by": "by", "by": "by",
"cancel": "Cancel", "cancel": "Cancel",
"cancel-delete": "Cancel Delete", "cancel-delete": "Cancel Delete",