Compare commits
	
		
			16 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						aa720f2460
	
				 | 
					
					
						|||
| 
						
						
							
						
						ac4ef8fb6d
	
				 | 
					
					
						|||
| 
						
						
							
						
						eae0afda23
	
				 | 
					
					
						|||
| 
						
						
							
						
						5291f8a4d1
	
				 | 
					
					
						|||
| 
						
						
							
						
						e2d7de1e9e
	
				 | 
					
					
						|||
| 
						
						
							
						
						d7c9c27ec7
	
				 | 
					
					
						|||
| 
						
						
							
						
						153b1b3c2b
	
				 | 
					
					
						|||
| 
						
						
							
						
						ec63c7c1c5
	
				 | 
					
					
						|||
| 
						
						
							
						
						05c2535698
	
				 | 
					
					
						|||
| 
						
						
							
						
						e261d5e345
	
				 | 
					
					
						|||
| 
						
						
							
						
						c00497d776
	
				 | 
					
					
						|||
| 
						
						
							
						
						766eeab49f
	
				 | 
					
					
						|||
| 
						
						
							
						
						3c9b404234
	
				 | 
					
					
						|||
| 
						
						
							
						
						9c56b3883e
	
				 | 
					
					
						|||
| 
						
						
							
						
						3d506db975
	
				 | 
					
					
						|||
| 
						
						
							
						
						d7e84a79a8
	
				 | 
					
					
						
							
								
								
									
										56
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -2,9 +2,65 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
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.10.0](https://git.odit.services/lfk/frontend/compare/1.9.11...1.10.0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- feat: working CardAssignment [`ac4ef8f`](https://git.odit.services/lfk/frontend/commit/ac4ef8fb6ded5c5d5678a651420e356b3ef45399)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### [1.9.11](https://git.odit.services/lfk/frontend/compare/1.9.10...1.9.11)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 8 April 2025
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- feat(dash): add runnersViaKiosk [`5291f8a`](https://git.odit.services/lfk/frontend/commit/5291f8a4d1721cd0c745191ebc85f221c34a23c8)
 | 
				
			||||||
 | 
					- chore(release): 1.9.11 [`eae0afd`](https://git.odit.services/lfk/frontend/commit/eae0afda23a54020e25821c0188d8cbec3139593)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### [1.9.10](https://git.odit.services/lfk/frontend/compare/1.9.9...1.9.10)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 8 April 2025
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- feat: add experimental ui for mobile card assignment [`d7c9c27`](https://git.odit.services/lfk/frontend/commit/d7c9c27ec7a1fea1cbaf26914843d044bbae32fe)
 | 
				
			||||||
 | 
					- chore(release): 1.9.10 [`e2d7de1`](https://git.odit.services/lfk/frontend/commit/e2d7de1e9e1fd134f54876fa80f19f94fbea3672)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### [1.9.9](https://git.odit.services/lfk/frontend/compare/1.9.8...1.9.9)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 4 April 2025
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- chore(release): 1.9.9 [`153b1b3`](https://git.odit.services/lfk/frontend/commit/153b1b3c2badee4826be614c3dbaafc10e1fbfea)
 | 
				
			||||||
 | 
					- fix(CopyScanStationTokenModal): code sizes [`ec63c7c`](https://git.odit.services/lfk/frontend/commit/ec63c7c1c51ccaf25bdd1eacffda66c820003a4c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### [1.9.8](https://git.odit.services/lfk/frontend/compare/1.9.7...1.9.8)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 2 April 2025
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- feat(GenerateSponsoringContracts): show download progress [`e261d5e`](https://git.odit.services/lfk/frontend/commit/e261d5e345f3175672bf86646ed838dd23400e50)
 | 
				
			||||||
 | 
					- chore(release): 1.9.8 [`05c2535`](https://git.odit.services/lfk/frontend/commit/05c253569877a45f3c4759262255ca70aa9ee4a3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### [1.9.7](https://git.odit.services/lfk/frontend/compare/1.9.6...1.9.7)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 2 April 2025
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- fix: ImportRunnerModal scrolling & team select [`766eeab`](https://git.odit.services/lfk/frontend/commit/766eeab49fb3ca5715c19dbf9bc53cb71124d3df)
 | 
				
			||||||
 | 
					- chore(release): 1.9.7 [`c00497d`](https://git.odit.services/lfk/frontend/commit/c00497d7760a935965cc83213f72f35999a3c168)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### [1.9.6](https://git.odit.services/lfk/frontend/compare/1.9.5...1.9.6)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 29 March 2025
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- chore(release): 1.9.6 [`3c9b404`](https://git.odit.services/lfk/frontend/commit/3c9b404234c7d7d2f0c48256be2130a0ed8ae047)
 | 
				
			||||||
 | 
					- pnpm allow builds [`9c56b38`](https://git.odit.services/lfk/frontend/commit/9c56b3883eeab9e1a5e1c4921bfb6528c230e0d4)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### [1.9.5](https://git.odit.services/lfk/frontend/compare/1.9.4...1.9.5)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 29 March 2025
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- feat: modal improvements [`d7e84a7`](https://git.odit.services/lfk/frontend/commit/d7e84a79a892294d532cc93aa3391c14a7a5ce99)
 | 
				
			||||||
 | 
					- chore(release): 1.9.5 [`3d506db`](https://git.odit.services/lfk/frontend/commit/3d506db97502399e8b381b4cf38af2f07a584aec)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### [1.9.4](https://git.odit.services/lfk/frontend/compare/1.9.3...1.9.4)
 | 
					#### [1.9.4](https://git.odit.services/lfk/frontend/compare/1.9.3...1.9.4)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 29 March 2025
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- feat: improve modals [`90b0fec`](https://git.odit.services/lfk/frontend/commit/90b0fec2366b608d163decdcd8798e879cf8218d)
 | 
					- feat: improve modals [`90b0fec`](https://git.odit.services/lfk/frontend/commit/90b0fec2366b608d163decdcd8798e879cf8218d)
 | 
				
			||||||
 | 
					- chore(release): 1.9.4 [`102471e`](https://git.odit.services/lfk/frontend/commit/102471eaaae390d3ef815afde9ac4081be7d5dbc)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### [1.9.3](https://git.odit.services/lfk/frontend/compare/1.9.2...1.9.3)
 | 
					#### [1.9.3](https://git.odit.services/lfk/frontend/compare/1.9.2...1.9.3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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.9.4-RELEASE_INFO</span
 | 
					      >RELEASE_INFO-1.10.0-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>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "@odit/lfk-frontend",
 | 
					  "name": "@odit/lfk-frontend",
 | 
				
			||||||
  "version": "1.9.4",
 | 
					  "version": "1.10.0",
 | 
				
			||||||
  "type": "module",
 | 
					  "type": "module",
 | 
				
			||||||
  "scripts": {
 | 
					  "scripts": {
 | 
				
			||||||
    "i18n-order": "node order.js",
 | 
					    "i18n-order": "node order.js",
 | 
				
			||||||
@@ -43,12 +43,13 @@
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "@fontsource/athiti": "^5.2.5",
 | 
					    "@fontsource/athiti": "^5.2.5",
 | 
				
			||||||
    "@odit/lfk-client-js": "1.2.0",
 | 
					    "@odit/lfk-client-js": "1.2.2",
 | 
				
			||||||
    "@paralleldrive/cuid2": "2.2.2",
 | 
					    "@paralleldrive/cuid2": "2.2.2",
 | 
				
			||||||
    "@tanstack/svelte-table": "8.9.1",
 | 
					    "@tanstack/svelte-table": "8.9.1",
 | 
				
			||||||
    "bwip-js": "3.4.0",
 | 
					    "bwip-js": "3.4.0",
 | 
				
			||||||
    "check-password-strength": "2.0.10",
 | 
					    "check-password-strength": "2.0.10",
 | 
				
			||||||
    "csvtojson": "2.0.10",
 | 
					    "csvtojson": "2.0.10",
 | 
				
			||||||
 | 
					    "html5-qrcode": "^2.3.8",
 | 
				
			||||||
    "localforage": "1.10.0",
 | 
					    "localforage": "1.10.0",
 | 
				
			||||||
    "marked": "4.3.0",
 | 
					    "marked": "4.3.0",
 | 
				
			||||||
    "svelte": "3.58.0",
 | 
					    "svelte": "3.58.0",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										36
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										36
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							@@ -12,8 +12,8 @@ importers:
 | 
				
			|||||||
        specifier: ^5.2.5
 | 
					        specifier: ^5.2.5
 | 
				
			||||||
        version: 5.2.5
 | 
					        version: 5.2.5
 | 
				
			||||||
      '@odit/lfk-client-js':
 | 
					      '@odit/lfk-client-js':
 | 
				
			||||||
        specifier: 1.2.0
 | 
					        specifier: 1.2.2
 | 
				
			||||||
        version: 1.2.0
 | 
					        version: 1.2.2
 | 
				
			||||||
      '@paralleldrive/cuid2':
 | 
					      '@paralleldrive/cuid2':
 | 
				
			||||||
        specifier: 2.2.2
 | 
					        specifier: 2.2.2
 | 
				
			||||||
        version: 2.2.2
 | 
					        version: 2.2.2
 | 
				
			||||||
@@ -29,6 +29,9 @@ importers:
 | 
				
			|||||||
      csvtojson:
 | 
					      csvtojson:
 | 
				
			||||||
        specifier: 2.0.10
 | 
					        specifier: 2.0.10
 | 
				
			||||||
        version: 2.0.10
 | 
					        version: 2.0.10
 | 
				
			||||||
 | 
					      html5-qrcode:
 | 
				
			||||||
 | 
					        specifier: ^2.3.8
 | 
				
			||||||
 | 
					        version: 2.3.8
 | 
				
			||||||
      localforage:
 | 
					      localforage:
 | 
				
			||||||
        specifier: 1.10.0
 | 
					        specifier: 1.10.0
 | 
				
			||||||
        version: 1.10.0
 | 
					        version: 1.10.0
 | 
				
			||||||
@@ -77,7 +80,7 @@ importers:
 | 
				
			|||||||
        version: 3.3.3(prettier@3.5.3)(svelte@3.58.0)
 | 
					        version: 3.3.3(prettier@3.5.3)(svelte@3.58.0)
 | 
				
			||||||
      release-it:
 | 
					      release-it:
 | 
				
			||||||
        specifier: 17.10.0
 | 
					        specifier: 17.10.0
 | 
				
			||||||
        version: 17.10.0
 | 
					        version: 17.10.0(typescript@5.8.3)
 | 
				
			||||||
      svelte-select:
 | 
					      svelte-select:
 | 
				
			||||||
        specifier: 3.17.0
 | 
					        specifier: 3.17.0
 | 
				
			||||||
        version: 3.17.0
 | 
					        version: 3.17.0
 | 
				
			||||||
@@ -352,8 +355,8 @@ packages:
 | 
				
			|||||||
  '@octokit/types@13.6.1':
 | 
					  '@octokit/types@13.6.1':
 | 
				
			||||||
    resolution: {integrity: sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g==}
 | 
					    resolution: {integrity: sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g==}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  '@odit/lfk-client-js@1.2.0':
 | 
					  '@odit/lfk-client-js@1.2.2':
 | 
				
			||||||
    resolution: {integrity: sha512-RR/Ij3PDMF840VJtphO51k+3voJcTlvRIxzTFBkvrwriBmLJwchBQxq40K4/kyVIFH7lLwO3uJy0PaxgEoTbFQ==}
 | 
					    resolution: {integrity: sha512-6UflZ8T8rV3yaBCMGC/fbBbsQkcld2RijcGrtv48bTqHGoUUG8aXuMXU7741I+eucxfxcal2/JfHih/I87IX7A==}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  '@odit/license-exporter@0.2.0':
 | 
					  '@odit/license-exporter@0.2.0':
 | 
				
			||||||
    resolution: {integrity: sha512-RRyfQzDLoyLQlGSd8ThJQ3h0fiCe4tkmm935AUvSVQWP+p88FcnI4iaktKBJJVBnIpDhkv/7sDSA5dFc/QMM5w==}
 | 
					    resolution: {integrity: sha512-RRyfQzDLoyLQlGSd8ThJQ3h0fiCe4tkmm935AUvSVQWP+p88FcnI4iaktKBJJVBnIpDhkv/7sDSA5dFc/QMM5w==}
 | 
				
			||||||
@@ -924,6 +927,9 @@ packages:
 | 
				
			|||||||
    resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
 | 
					    resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
 | 
				
			||||||
    engines: {node: '>= 0.4'}
 | 
					    engines: {node: '>= 0.4'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  html5-qrcode@2.3.8:
 | 
				
			||||||
 | 
					    resolution: {integrity: sha512-jsr4vafJhwoLVEDW3n1KvPnCCXWaQfRng0/EEYk1vNcQGcG/htAdhJX0be8YyqMoSz7+hZvOZSTAepsabiuhiQ==}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  http-proxy-agent@7.0.2:
 | 
					  http-proxy-agent@7.0.2:
 | 
				
			||||||
    resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
 | 
					    resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
 | 
				
			||||||
    engines: {node: '>= 14'}
 | 
					    engines: {node: '>= 14'}
 | 
				
			||||||
@@ -1794,6 +1800,11 @@ packages:
 | 
				
			|||||||
  type@2.7.2:
 | 
					  type@2.7.2:
 | 
				
			||||||
    resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==}
 | 
					    resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  typescript@5.8.3:
 | 
				
			||||||
 | 
					    resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==}
 | 
				
			||||||
 | 
					    engines: {node: '>=14.17'}
 | 
				
			||||||
 | 
					    hasBin: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  uglify-js@3.19.3:
 | 
					  uglify-js@3.19.3:
 | 
				
			||||||
    resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==}
 | 
					    resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==}
 | 
				
			||||||
    engines: {node: '>=0.8.0'}
 | 
					    engines: {node: '>=0.8.0'}
 | 
				
			||||||
@@ -2165,7 +2176,7 @@ snapshots:
 | 
				
			|||||||
    dependencies:
 | 
					    dependencies:
 | 
				
			||||||
      '@octokit/openapi-types': 22.2.0
 | 
					      '@octokit/openapi-types': 22.2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  '@odit/lfk-client-js@1.2.0': {}
 | 
					  '@odit/lfk-client-js@1.2.2': {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  '@odit/license-exporter@0.2.0':
 | 
					  '@odit/license-exporter@0.2.0':
 | 
				
			||||||
    dependencies:
 | 
					    dependencies:
 | 
				
			||||||
@@ -2439,12 +2450,14 @@ snapshots:
 | 
				
			|||||||
      graceful-fs: 4.2.11
 | 
					      graceful-fs: 4.2.11
 | 
				
			||||||
      xdg-basedir: 5.1.0
 | 
					      xdg-basedir: 5.1.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cosmiconfig@9.0.0:
 | 
					  cosmiconfig@9.0.0(typescript@5.8.3):
 | 
				
			||||||
    dependencies:
 | 
					    dependencies:
 | 
				
			||||||
      env-paths: 2.2.1
 | 
					      env-paths: 2.2.1
 | 
				
			||||||
      import-fresh: 3.3.0
 | 
					      import-fresh: 3.3.0
 | 
				
			||||||
      js-yaml: 4.1.0
 | 
					      js-yaml: 4.1.0
 | 
				
			||||||
      parse-json: 5.2.0
 | 
					      parse-json: 5.2.0
 | 
				
			||||||
 | 
					    optionalDependencies:
 | 
				
			||||||
 | 
					      typescript: 5.8.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  crc-32@1.2.2: {}
 | 
					  crc-32@1.2.2: {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2765,6 +2778,8 @@ snapshots:
 | 
				
			|||||||
    dependencies:
 | 
					    dependencies:
 | 
				
			||||||
      function-bind: 1.1.2
 | 
					      function-bind: 1.1.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  html5-qrcode@2.3.8: {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  http-proxy-agent@7.0.2:
 | 
					  http-proxy-agent@7.0.2:
 | 
				
			||||||
    dependencies:
 | 
					    dependencies:
 | 
				
			||||||
      agent-base: 7.1.1
 | 
					      agent-base: 7.1.1
 | 
				
			||||||
@@ -3322,14 +3337,14 @@ snapshots:
 | 
				
			|||||||
    dependencies:
 | 
					    dependencies:
 | 
				
			||||||
      rc: 1.2.8
 | 
					      rc: 1.2.8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  release-it@17.10.0:
 | 
					  release-it@17.10.0(typescript@5.8.3):
 | 
				
			||||||
    dependencies:
 | 
					    dependencies:
 | 
				
			||||||
      '@iarna/toml': 2.2.5
 | 
					      '@iarna/toml': 2.2.5
 | 
				
			||||||
      '@octokit/rest': 20.1.1
 | 
					      '@octokit/rest': 20.1.1
 | 
				
			||||||
      async-retry: 1.3.3
 | 
					      async-retry: 1.3.3
 | 
				
			||||||
      chalk: 5.3.0
 | 
					      chalk: 5.3.0
 | 
				
			||||||
      ci-info: 4.1.0
 | 
					      ci-info: 4.1.0
 | 
				
			||||||
      cosmiconfig: 9.0.0
 | 
					      cosmiconfig: 9.0.0(typescript@5.8.3)
 | 
				
			||||||
      execa: 8.0.0
 | 
					      execa: 8.0.0
 | 
				
			||||||
      git-url-parse: 14.0.0
 | 
					      git-url-parse: 14.0.0
 | 
				
			||||||
      globby: 14.0.2
 | 
					      globby: 14.0.2
 | 
				
			||||||
@@ -3607,6 +3622,9 @@ snapshots:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  type@2.7.2: {}
 | 
					  type@2.7.2: {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  typescript@5.8.3:
 | 
				
			||||||
 | 
					    optional: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  uglify-js@3.19.3:
 | 
					  uglify-js@3.19.3:
 | 
				
			||||||
    optional: true
 | 
					    optional: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								pnpm-workspace.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								pnpm-workspace.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					onlyBuiltDependencies:
 | 
				
			||||||
 | 
					  - es5-ext
 | 
				
			||||||
 | 
					  - esbuild
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								public/beep.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								public/beep.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -41,6 +41,7 @@
 | 
				
			|||||||
  import Settings from "./components/settings/Settings.svelte";
 | 
					  import Settings from "./components/settings/Settings.svelte";
 | 
				
			||||||
  import Transition from "./components/base/Transition.svelte";
 | 
					  import Transition from "./components/base/Transition.svelte";
 | 
				
			||||||
  import Orgs from "./components/orgs/Orgs.svelte";
 | 
					  import Orgs from "./components/orgs/Orgs.svelte";
 | 
				
			||||||
 | 
					  import CardAssignment from "./components/general/CardAssignment.svelte";
 | 
				
			||||||
  import Runners from "./components/runners/Runners.svelte";
 | 
					  import Runners from "./components/runners/Runners.svelte";
 | 
				
			||||||
  import Footer from "./components/general/Footer.svelte";
 | 
					  import Footer from "./components/general/Footer.svelte";
 | 
				
			||||||
  import TracksOverview from "./components/tracks/TracksOverview.svelte";
 | 
					  import TracksOverview from "./components/tracks/TracksOverview.svelte";
 | 
				
			||||||
@@ -141,6 +142,11 @@
 | 
				
			|||||||
            <RunnerDetail {params} />
 | 
					            <RunnerDetail {params} />
 | 
				
			||||||
          </Route>
 | 
					          </Route>
 | 
				
			||||||
        </Route>
 | 
					        </Route>
 | 
				
			||||||
 | 
					        <Route path="/cardassignment/*">
 | 
				
			||||||
 | 
					          <Route path="/">
 | 
				
			||||||
 | 
					            <CardAssignment />
 | 
				
			||||||
 | 
					          </Route>
 | 
				
			||||||
 | 
					        </Route>
 | 
				
			||||||
        <Route path="/teams/*">
 | 
					        <Route path="/teams/*">
 | 
				
			||||||
          <Route path="/">
 | 
					          <Route path="/">
 | 
				
			||||||
            <Teams />
 | 
					            <Teams />
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -119,7 +119,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w- 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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -135,18 +135,18 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:mt-0 sm:text-left">
 | 
					            <div class="mt-3 sm:mt-0">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("create-bulk-blanco-cards")}
 | 
					                {$_("create-bulk-blanco-cards")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_(
 | 
					                  {$_(
 | 
				
			||||||
                    "just-enter-how-many-you-want-and-the-system-will-create-them"
 | 
					                    "just-enter-how-many-you-want-and-the-system-will-create-them"
 | 
				
			||||||
                  )}
 | 
					                  )}
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              <div class="grid grid-cols-6 gap-6 text-left">
 | 
					              <div class="grid grid-cols-6 gap-2 lg:gap-6 text-left">
 | 
				
			||||||
                <div class="col-span-6">
 | 
					                <div class="col-span-6">
 | 
				
			||||||
                  <label
 | 
					                  <label
 | 
				
			||||||
                    for="amount"
 | 
					                    for="amount"
 | 
				
			||||||
@@ -183,7 +183,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            disabled={!createbtnenabled}
 | 
					            disabled={!createbtnenabled}
 | 
				
			||||||
            class:opacity-50={!createbtnenabled}
 | 
					            class:opacity-50={!createbtnenabled}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -112,7 +112,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -128,11 +128,11 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:mt-0 sm:text-left">
 | 
					            <div class="mt-3 sm:mt-0">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("create-a-new-card")}
 | 
					                {$_("create-a-new-card")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_("you-can-provide-a-runner-but-you-dont-have-to")}
 | 
					                  {$_("you-can-provide-a-runner-but-you-dont-have-to")}
 | 
				
			||||||
                  {$_(
 | 
					                  {$_(
 | 
				
			||||||
@@ -140,7 +140,7 @@
 | 
				
			|||||||
                  )}
 | 
					                  )}
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              <div class="grid grid-cols-6 gap-6 text-left">
 | 
					              <div class="grid grid-cols-6 gap-2 lg:gap-6 text-left">
 | 
				
			||||||
                <div class="col-span-6">
 | 
					                <div class="col-span-6">
 | 
				
			||||||
                  <label
 | 
					                  <label
 | 
				
			||||||
                    for="donor"
 | 
					                    for="donor"
 | 
				
			||||||
@@ -165,7 +165,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            disabled={!createbtnenabled}
 | 
					            disabled={!createbtnenabled}
 | 
				
			||||||
            class:opacity-50={!createbtnenabled}
 | 
					            class:opacity-50={!createbtnenabled}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -106,7 +106,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -122,16 +122,16 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:text-left max-h-[75vh] overflow-y-auto">
 | 
					            <div class="mt-3 sm:text-left max-h-[75vh] overflow-y-auto">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("edit-a-card")}
 | 
					                {$_("edit-a-card")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_("you-can-provide-a-runner-but-you-dont-have-to")}
 | 
					                  {$_("you-can-provide-a-runner-but-you-dont-have-to")}
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              <div class="grid grid-cols-6 gap-6 text-left">
 | 
					              <div class="grid grid-cols-6 gap-2 lg:gap-6 text-left">
 | 
				
			||||||
                <div class="col-span-6">
 | 
					                <div class="col-span-6">
 | 
				
			||||||
                  <label
 | 
					                  <label
 | 
				
			||||||
                    for="runner"
 | 
					                    for="runner"
 | 
				
			||||||
@@ -174,7 +174,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            disabled={!createbtnenabled}
 | 
					            disabled={!createbtnenabled}
 | 
				
			||||||
            class:opacity-50={!createbtnenabled}
 | 
					            class:opacity-50={!createbtnenabled}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -62,7 +62,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -78,7 +78,7 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:text-left max-h-[75vh] overflow-y-auto">
 | 
					            <div class="mt-3 sm:text-left max-h-[75vh] overflow-y-auto">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("please-confirm-the-deletion-of-card")}
 | 
					                {$_("please-confirm-the-deletion-of-card")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
@@ -99,7 +99,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            on:click={submit}
 | 
					            on:click={submit}
 | 
				
			||||||
            type="button"
 | 
					            type="button"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -164,7 +164,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -179,18 +179,18 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:text-left max-h-[75vh] overflow-y-auto">
 | 
					            <div class="mt-3 sm:text-left max-h-[75vh] overflow-y-auto">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("create-a-new-contact")}
 | 
					                {$_("create-a-new-contact")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_(
 | 
					                  {$_(
 | 
				
			||||||
                    "please-provide-the-required-information-to-add-a-new-contact"
 | 
					                    "please-provide-the-required-information-to-add-a-new-contact"
 | 
				
			||||||
                  )}
 | 
					                  )}
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              <div class="grid grid-cols-6 gap-6 text-left">
 | 
					              <div class="grid grid-cols-6 gap-2 lg:gap-6 text-left">
 | 
				
			||||||
                <div class="col-span-6">
 | 
					                <div class="col-span-6">
 | 
				
			||||||
                  <label
 | 
					                  <label
 | 
				
			||||||
                    for="firstname"
 | 
					                    for="firstname"
 | 
				
			||||||
@@ -454,7 +454,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            disabled={!createbtnenabled}
 | 
					            disabled={!createbtnenabled}
 | 
				
			||||||
            class:opacity-50={!createbtnenabled}
 | 
					            class:opacity-50={!createbtnenabled}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,7 +41,27 @@
 | 
				
			|||||||
				</svg>
 | 
									</svg>
 | 
				
			||||||
				<span>{$_("dashboard-title")}</span>
 | 
									<span>{$_("dashboard-title")}</span>
 | 
				
			||||||
			</a>
 | 
								</a>
 | 
				
			||||||
			{#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:GET")}
 | 
								{#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:GET") && store.state.jwtinfo.userdetails.permissions.includes("CARD:GET")}
 | 
				
			||||||
 | 
									<a
 | 
				
			||||||
 | 
										class:activenav={$router.path.includes("/cardassignment/")}
 | 
				
			||||||
 | 
										class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
 | 
				
			||||||
 | 
										href="/cardassignment/"
 | 
				
			||||||
 | 
									>
 | 
				
			||||||
 | 
										<svg
 | 
				
			||||||
 | 
											xmlns="http://www.w3.org/2000/svg"
 | 
				
			||||||
 | 
											viewBox="0 0 24 24"
 | 
				
			||||||
 | 
											fill="currentColor"
 | 
				
			||||||
 | 
											class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600"
 | 
				
			||||||
 | 
										>
 | 
				
			||||||
 | 
											<path
 | 
				
			||||||
 | 
												fill-rule="evenodd"
 | 
				
			||||||
 | 
												d="M14.615 1.595a.75.75 0 0 1 .359.852L12.982 9.75h7.268a.75.75 0 0 1 .548 1.262l-10.5 11.25a.75.75 0 0 1-1.272-.71l1.992-7.302H3.75a.75.75 0 0 1-.548-1.262l10.5-11.25a.75.75 0 0 1 .913-.143Z"
 | 
				
			||||||
 | 
												clip-rule="evenodd"
 | 
				
			||||||
 | 
											/>
 | 
				
			||||||
 | 
										</svg>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										<span>Card Assignment</span>
 | 
				
			||||||
 | 
									</a>
 | 
				
			||||||
				<a
 | 
									<a
 | 
				
			||||||
					class:activenav={$router.path.includes("/runners/")}
 | 
										class:activenav={$router.path.includes("/runners/")}
 | 
				
			||||||
					class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
 | 
										class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900 w-full font-semibold"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -234,6 +234,23 @@
 | 
				
			|||||||
					/></svg
 | 
										/></svg
 | 
				
			||||||
				>
 | 
									>
 | 
				
			||||||
			</StatCard>
 | 
								</StatCard>
 | 
				
			||||||
 | 
								<StatCard
 | 
				
			||||||
 | 
									title={$_('runners_via_kiosk')}
 | 
				
			||||||
 | 
									value={stats.runnersViaKiosk}
 | 
				
			||||||
 | 
									href="/runners/"
 | 
				
			||||||
 | 
								>
 | 
				
			||||||
 | 
									<svg
 | 
				
			||||||
 | 
										height="24"
 | 
				
			||||||
 | 
										width="24"
 | 
				
			||||||
 | 
										fill="currentColor"
 | 
				
			||||||
 | 
										xmlns="http://www.w3.org/2000/svg"
 | 
				
			||||||
 | 
										viewBox="0 0 24 24"
 | 
				
			||||||
 | 
										><path d="M0 0h24v24H0z" fill="none" />
 | 
				
			||||||
 | 
										<path
 | 
				
			||||||
 | 
											d="M13.49 5.48c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm-3.6 13.9l1-4.4 2.1 2v6h2v-7.5l-2.1-2 .6-3c1.3 1.5 3.3 2.5 5.5 2.5v-2c-1.9 0-3.5-1-4.3-2.4l-1-1.6c-.4-.6-1-1-1.7-1-.3 0-.5.1-.8.1l-5.2 2.2v4.7h2v-3.4l1.8-.7-1.6 8.1-4.9-1-.4 2 7 1.4z"
 | 
				
			||||||
 | 
										/></svg
 | 
				
			||||||
 | 
									>
 | 
				
			||||||
 | 
								</StatCard>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
	{:catch error}
 | 
						{:catch error}
 | 
				
			||||||
		<div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500">
 | 
							<div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500">
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -143,7 +143,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -158,7 +158,7 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:text-left">
 | 
					            <div class="mt-3">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {#if is_fixed}
 | 
					                {#if is_fixed}
 | 
				
			||||||
                  {$_("create-a-new-fixed-donation")}
 | 
					                  {$_("create-a-new-fixed-donation")}
 | 
				
			||||||
@@ -177,14 +177,14 @@
 | 
				
			|||||||
                  >{$_("fixed-donation")}</span
 | 
					                  >{$_("fixed-donation")}</span
 | 
				
			||||||
                >
 | 
					                >
 | 
				
			||||||
              </label>
 | 
					              </label>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_(
 | 
					                  {$_(
 | 
				
			||||||
                    "please-provide-the-nessecary-information-to-create-a-new-donation"
 | 
					                    "please-provide-the-nessecary-information-to-create-a-new-donation"
 | 
				
			||||||
                  )}
 | 
					                  )}
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              <div class="grid grid-cols-6 gap-6 text-left">
 | 
					              <div class="grid grid-cols-6 gap-2 lg:gap-6 text-left">
 | 
				
			||||||
                <div class="col-span-6">
 | 
					                <div class="col-span-6">
 | 
				
			||||||
                  <label
 | 
					                  <label
 | 
				
			||||||
                    for="donor"
 | 
					                    for="donor"
 | 
				
			||||||
@@ -289,7 +289,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            disabled={!createbtnenabled}
 | 
					            disabled={!createbtnenabled}
 | 
				
			||||||
            class:opacity-50={!createbtnenabled}
 | 
					            class:opacity-50={!createbtnenabled}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -104,7 +104,7 @@
 | 
				
			|||||||
        <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 h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -124,14 +124,14 @@
 | 
				
			|||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("enter-payment")}
 | 
					                {$_("enter-payment")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_(
 | 
					                  {$_(
 | 
				
			||||||
                    "you-can-enter-the-donations-paid-amount-manually-or-use-the-max-button-to-use-the-donations-exact-amount"
 | 
					                    "you-can-enter-the-donations-paid-amount-manually-or-use-the-max-button-to-use-the-donations-exact-amount"
 | 
				
			||||||
                  )}
 | 
					                  )}
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              <div class="grid grid-cols gap-6">
 | 
					              <div class="grid grid-cols gap-2 lg:gap-6">
 | 
				
			||||||
                <div class="w-full">
 | 
					                <div class="w-full">
 | 
				
			||||||
                  <label
 | 
					                  <label
 | 
				
			||||||
                    for="token"
 | 
					                    for="token"
 | 
				
			||||||
@@ -179,7 +179,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            disabled={!createbtnenabled}
 | 
					            disabled={!createbtnenabled}
 | 
				
			||||||
            class:opacity-50={!createbtnenabled}
 | 
					            class:opacity-50={!createbtnenabled}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -65,7 +65,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -80,7 +80,7 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:text-left max-h-[75vh] overflow-y-auto">
 | 
					            <div class="mt-3 sm:text-left max-h-[75vh] overflow-y-auto">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("please-confirm-the-deletion-of-donation")}
 | 
					                {$_("please-confirm-the-deletion-of-donation")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
@@ -93,7 +93,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            on:click={submit}
 | 
					            on:click={submit}
 | 
				
			||||||
            type="button"
 | 
					            type="button"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -152,7 +152,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -167,18 +167,18 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:text-left">
 | 
					            <div class="mt-3">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("create-a-new-donor")}
 | 
					                {$_("create-a-new-donor")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_(
 | 
					                  {$_(
 | 
				
			||||||
                    "please-provide-the-nessecary-information-to-add-a-new-donor"
 | 
					                    "please-provide-the-nessecary-information-to-add-a-new-donor"
 | 
				
			||||||
                  )}
 | 
					                  )}
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              <div class="grid grid-cols-6 gap-6 text-left">
 | 
					              <div class="grid grid-cols-6 gap-2 lg:gap-6 text-left">
 | 
				
			||||||
                <div class="col-span-6">
 | 
					                <div class="col-span-6">
 | 
				
			||||||
                  <label
 | 
					                  <label
 | 
				
			||||||
                    for="firstname"
 | 
					                    for="firstname"
 | 
				
			||||||
@@ -418,7 +418,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            disabled={!createbtnenabled}
 | 
					            disabled={!createbtnenabled}
 | 
				
			||||||
            class:opacity-50={!createbtnenabled}
 | 
					            class:opacity-50={!createbtnenabled}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -42,7 +42,7 @@
 | 
				
			|||||||
				<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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -54,13 +54,13 @@
 | 
				
			|||||||
								/></svg
 | 
													/></svg
 | 
				
			||||||
							>
 | 
												>
 | 
				
			||||||
						</div>
 | 
											</div>
 | 
				
			||||||
						<div class="mt-3 text-center sm:text-left max-h-[75vh] overflow-y-auto">
 | 
											<div class="mt-3 sm:text-left max-h-[75vh] overflow-y-auto">
 | 
				
			||||||
							<h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
												<h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
								{$_(
 | 
													{$_(
 | 
				
			||||||
									"do-you-want-to-delete-this-donor-with-all-related-donations"
 | 
														"do-you-want-to-delete-this-donor-with-all-related-donations"
 | 
				
			||||||
								)}
 | 
													)}
 | 
				
			||||||
							</h3>
 | 
												</h3>
 | 
				
			||||||
							<div class="mt-2 mb-6">
 | 
												<div class="mb-6">
 | 
				
			||||||
								<p class="text-sm text-gray-500">
 | 
													<p class="text-sm text-gray-500">
 | 
				
			||||||
									{$_("all-associated-donations-will-get-deleted-as-well")}
 | 
														{$_("all-associated-donations-will-get-deleted-as-well")}
 | 
				
			||||||
								</p>
 | 
													</p>
 | 
				
			||||||
@@ -68,7 +68,7 @@
 | 
				
			|||||||
						</div>
 | 
											</div>
 | 
				
			||||||
					</div>
 | 
										</div>
 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
				<div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
									<div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
					<button
 | 
										<button
 | 
				
			||||||
						on:click={deleteDonor}
 | 
											on:click={deleteDonor}
 | 
				
			||||||
						type="button"
 | 
											type="button"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,7 +52,7 @@
 | 
				
			|||||||
				<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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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
 | 
				
			||||||
								fill="currentColor"
 | 
													fill="currentColor"
 | 
				
			||||||
@@ -71,16 +71,16 @@
 | 
				
			|||||||
							<h3 class="text-lg leading-6 font-medium">
 | 
												<h3 class="text-lg leading-6 font-medium">
 | 
				
			||||||
								{$_("read-license")}
 | 
													{$_("read-license")}
 | 
				
			||||||
							</h3>
 | 
												</h3>
 | 
				
			||||||
							<div class="mt-2 mb-6">
 | 
												<div class="mb-6">
 | 
				
			||||||
								<p class="text-sm text-gray-500">{currentlicense}</p>
 | 
													<p class="text-sm text-gray-500">{currentlicense}</p>
 | 
				
			||||||
							</div>
 | 
												</div>
 | 
				
			||||||
							<div class="mt-2 mb-6">
 | 
												<div class="mb-6">
 | 
				
			||||||
								<p class="text-sm text-gray-500">{licensetext}</p>
 | 
													<p class="text-sm text-gray-500">{licensetext}</p>
 | 
				
			||||||
							</div>
 | 
												</div>
 | 
				
			||||||
						</div>
 | 
											</div>
 | 
				
			||||||
					</div>
 | 
										</div>
 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
				<div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
									<div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
					<button
 | 
										<button
 | 
				
			||||||
						on:click={() => {
 | 
											on:click={() => {
 | 
				
			||||||
							modal_open = false;
 | 
												modal_open = false;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										123
									
								
								src/components/general/CardAssignment.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								src/components/general/CardAssignment.svelte
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,123 @@
 | 
				
			|||||||
 | 
					<script>
 | 
				
			||||||
 | 
						import { RunnerCardService, RunnerService } from "@odit/lfk-client-js";
 | 
				
			||||||
 | 
						import QrCodeScanner from "./QrCodeScanner.svelte";
 | 
				
			||||||
 | 
						let state = "scan_runner";
 | 
				
			||||||
 | 
						let runnerinfo = { id: 0, firstname: "", lastname: "" };
 | 
				
			||||||
 | 
						let cardCode = "";
 | 
				
			||||||
 | 
						$: scannerActive = state.includes("scan");
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="p-4">
 | 
				
			||||||
 | 
						<h3 class="text-3xl font-bold">Card Assignment for Mobile</h3>
 | 
				
			||||||
 | 
						<!-- <p>state</p>
 | 
				
			||||||
 | 
						<p>{state}</p>
 | 
				
			||||||
 | 
						<p>scannerActive</p>
 | 
				
			||||||
 | 
						<p>{scannerActive}</p> -->
 | 
				
			||||||
 | 
						{#if state.includes("scan_")}
 | 
				
			||||||
 | 
							<!--  -->
 | 
				
			||||||
 | 
							{#if state === "scan_runner"}
 | 
				
			||||||
 | 
								<h3 class="text-xl font-bold">Scan Runner (Selfservice QR)</h3>
 | 
				
			||||||
 | 
							{/if}
 | 
				
			||||||
 | 
							{#if state === "scan_card"}
 | 
				
			||||||
 | 
								<h3 class="text-xl font-bold">Runner Scanned</h3>
 | 
				
			||||||
 | 
								<p>{runnerinfo.firstname} {runnerinfo.lastname} [#{runnerinfo.id}]</p>
 | 
				
			||||||
 | 
								<h3 class="text-xl font-bold">Scan Card (Code 128 Barcode)</h3>
 | 
				
			||||||
 | 
							{/if}
 | 
				
			||||||
 | 
							<QrCodeScanner
 | 
				
			||||||
 | 
								paused={!scannerActive}
 | 
				
			||||||
 | 
								on:detect={(e) => {
 | 
				
			||||||
 | 
									console.log({ type: "DETECT", code: e.detail.decodedText });
 | 
				
			||||||
 | 
									if (state === "scan_runner") {
 | 
				
			||||||
 | 
										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;
 | 
				
			||||||
 | 
											new Audio("/beep.mp3").play();
 | 
				
			||||||
 | 
											RunnerService.runnerControllerGetOne(runnerID).then((runner) => {
 | 
				
			||||||
 | 
												console.log(runner);
 | 
				
			||||||
 | 
												runnerinfo = runner;
 | 
				
			||||||
 | 
											});
 | 
				
			||||||
 | 
											state = "scan_card";
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if (state === "scan_card") {
 | 
				
			||||||
 | 
										if (
 | 
				
			||||||
 | 
											!e.detail.decodedText.includes(
 | 
				
			||||||
 | 
												"https://portal.lauf-fuer-kaya.de/profile/"
 | 
				
			||||||
 | 
											)
 | 
				
			||||||
 | 
										) {
 | 
				
			||||||
 | 
											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";
 | 
				
			||||||
 | 
													});
 | 
				
			||||||
 | 
												} else {
 | 
				
			||||||
 | 
													state = "error_card_404";
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
 | 
											});
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}}
 | 
				
			||||||
 | 
								width={320}
 | 
				
			||||||
 | 
								height={320}
 | 
				
			||||||
 | 
								class="w-full max-w-sm bg-neutral-300 rounded-lg overflow-hidden"
 | 
				
			||||||
 | 
							/>
 | 
				
			||||||
 | 
							{#if state === "scan_card"}
 | 
				
			||||||
 | 
								<button
 | 
				
			||||||
 | 
									on:click={() => {
 | 
				
			||||||
 | 
										state = "scan_runner";
 | 
				
			||||||
 | 
										runnerinfo = { id: 0, firstname: "", lastname: "" };
 | 
				
			||||||
 | 
										cardCode = "";
 | 
				
			||||||
 | 
									}}
 | 
				
			||||||
 | 
									type="button"
 | 
				
			||||||
 | 
									class="py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-red-100 text-red-800 hover:bg-red-200 focus:outline-hidden focus:bg-red-200 disabled:opacity-50 disabled:pointer-events-none dark:text-red-500 dark:bg-red-800/30 dark:hover:bg-red-800/20 dark:focus:bg-red-800/20 w-full mt-2"
 | 
				
			||||||
 | 
								>
 | 
				
			||||||
 | 
									Cancel
 | 
				
			||||||
 | 
								</button>
 | 
				
			||||||
 | 
							{/if}
 | 
				
			||||||
 | 
							<!--  -->
 | 
				
			||||||
 | 
						{:else}
 | 
				
			||||||
 | 
							<!--  -->
 | 
				
			||||||
 | 
							{#if state === "assigning"}
 | 
				
			||||||
 | 
								<p>Assigning Card {cardCode} ⌛</p>
 | 
				
			||||||
 | 
								<p>Please wait a moment while we assign the card...</p>
 | 
				
			||||||
 | 
							{/if}
 | 
				
			||||||
 | 
							{#if state === "done"}
 | 
				
			||||||
 | 
								<p>
 | 
				
			||||||
 | 
									Assigned Card {cardCode} to {runnerinfo.firstname}
 | 
				
			||||||
 | 
									{runnerinfo.lastname} [#{runnerinfo.id}] ✅
 | 
				
			||||||
 | 
								</p>
 | 
				
			||||||
 | 
								<button
 | 
				
			||||||
 | 
									on:click={() => {
 | 
				
			||||||
 | 
										// state = "scan_runner";
 | 
				
			||||||
 | 
										// runnerinfo = { id: 0, firstname: "", lastname: "" };
 | 
				
			||||||
 | 
										// cardCode = "";
 | 
				
			||||||
 | 
										location.reload();
 | 
				
			||||||
 | 
									}}
 | 
				
			||||||
 | 
									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 w-full mt-2"
 | 
				
			||||||
 | 
								>
 | 
				
			||||||
 | 
									Done
 | 
				
			||||||
 | 
								</button>
 | 
				
			||||||
 | 
							{/if}
 | 
				
			||||||
 | 
							<!--  -->
 | 
				
			||||||
 | 
						{/if}
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
							
								
								
									
										84
									
								
								src/components/general/QrCodeScanner.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								src/components/general/QrCodeScanner.svelte
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,84 @@
 | 
				
			|||||||
 | 
					<script>
 | 
				
			||||||
 | 
						import { onMount, createEventDispatcher } from "svelte";
 | 
				
			||||||
 | 
						import {
 | 
				
			||||||
 | 
							Html5QrcodeScanner,
 | 
				
			||||||
 | 
							Html5QrcodeScanType,
 | 
				
			||||||
 | 
							Html5QrcodeSupportedFormats,
 | 
				
			||||||
 | 
							Html5QrcodeScannerState,
 | 
				
			||||||
 | 
						} from "html5-qrcode";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						export let width;
 | 
				
			||||||
 | 
						export let height;
 | 
				
			||||||
 | 
						export let paused = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const dispatch = createEventDispatcher();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						function onScanSuccess(decodedText, decodedResult) {
 | 
				
			||||||
 | 
							if (!paused) {
 | 
				
			||||||
 | 
								dispatch("detect", { decodedText });
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// usually better to ignore and keep scanning
 | 
				
			||||||
 | 
						function onScanFailure(message) {
 | 
				
			||||||
 | 
							if (!paused) {
 | 
				
			||||||
 | 
								dispatch("error", { message });
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						let scanner;
 | 
				
			||||||
 | 
						onMount(() => {
 | 
				
			||||||
 | 
							scanner = new Html5QrcodeScanner(
 | 
				
			||||||
 | 
								"qr-scanner",
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									fps: 10,
 | 
				
			||||||
 | 
									rememberLastUsedCamera: true,
 | 
				
			||||||
 | 
									qrbox: { width, height },
 | 
				
			||||||
 | 
									aspectRatio: 1,
 | 
				
			||||||
 | 
									supportedScanTypes: [Html5QrcodeScanType.SCAN_TYPE_CAMERA],
 | 
				
			||||||
 | 
									formatsToSupport: [
 | 
				
			||||||
 | 
										Html5QrcodeSupportedFormats.CODE_39,
 | 
				
			||||||
 | 
										Html5QrcodeSupportedFormats.EAN_8,
 | 
				
			||||||
 | 
										Html5QrcodeSupportedFormats.EAN_13,
 | 
				
			||||||
 | 
										Html5QrcodeSupportedFormats.QR_CODE,
 | 
				
			||||||
 | 
										Html5QrcodeSupportedFormats.CODE_128,
 | 
				
			||||||
 | 
									],
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								false // non-verbose
 | 
				
			||||||
 | 
							);
 | 
				
			||||||
 | 
							scanner.render(onScanSuccess, onScanFailure);
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// pause/resume scanner to avoid unintended scans
 | 
				
			||||||
 | 
						$: togglePause(paused);
 | 
				
			||||||
 | 
						function togglePause(paused) {
 | 
				
			||||||
 | 
							if (paused && scanner?.getState() === Html5QrcodeScannerState.SCANNING) {
 | 
				
			||||||
 | 
								scanner?.pause();
 | 
				
			||||||
 | 
							} else if (scanner?.getState() === Html5QrcodeScannerState.PAUSED) {
 | 
				
			||||||
 | 
								scanner?.resume();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div id="qr-scanner" class={$$props.class} />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style>
 | 
				
			||||||
 | 
						/* Hide unwanted icons */
 | 
				
			||||||
 | 
						#qr-scanner :global(img[alt="Info icon"]),
 | 
				
			||||||
 | 
						#qr-scanner :global(img[alt="Camera based scan"]) {
 | 
				
			||||||
 | 
							display: none;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Change camera permission button text */
 | 
				
			||||||
 | 
						#qr-scanner :global(#html5-qrcode-button-camera-permission) {
 | 
				
			||||||
 | 
							visibility: hidden;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						#qr-scanner :global(#html5-qrcode-button-camera-permission::after) {
 | 
				
			||||||
 | 
							position: absolute;
 | 
				
			||||||
 | 
							inset: auto 0 0;
 | 
				
			||||||
 | 
							display: block;
 | 
				
			||||||
 | 
							content: "Allow camera access";
 | 
				
			||||||
 | 
							visibility: visible;
 | 
				
			||||||
 | 
							padding: 10px 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
@@ -87,7 +87,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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
 | 
				
			||||||
                xmlns="http://www.w3.org/2000/svg"
 | 
					                xmlns="http://www.w3.org/2000/svg"
 | 
				
			||||||
@@ -102,18 +102,18 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:text-left max-h-[75vh] overflow-y-auto">
 | 
					            <div class="mt-3 sm:text-left max-h-[75vh] overflow-y-auto">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("create-a-new-user-group")}
 | 
					                {$_("create-a-new-user-group")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_(
 | 
					                  {$_(
 | 
				
			||||||
                    "please-provide-the-required-information-for-creating-a-new-user-group"
 | 
					                    "please-provide-the-required-information-for-creating-a-new-user-group"
 | 
				
			||||||
                  )}
 | 
					                  )}
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              <div class="grid grid-cols-6 gap-6 text-left">
 | 
					              <div class="grid grid-cols-6 gap-2 lg:gap-6 text-left">
 | 
				
			||||||
                <div class="col-span-6">
 | 
					                <div class="col-span-6">
 | 
				
			||||||
                  <label
 | 
					                  <label
 | 
				
			||||||
                    for="firstname"
 | 
					                    for="firstname"
 | 
				
			||||||
@@ -159,7 +159,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            disabled={!createbtnenabled}
 | 
					            disabled={!createbtnenabled}
 | 
				
			||||||
            class:opacity-50={!createbtnenabled}
 | 
					            class:opacity-50={!createbtnenabled}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,7 @@
 | 
				
			|||||||
  $: address_input2_value = "";
 | 
					  $: address_input2_value = "";
 | 
				
			||||||
  $: address_zipcode_value = "";
 | 
					  $: address_zipcode_value = "";
 | 
				
			||||||
  $: address_city_value = "";
 | 
					  $: address_city_value = "";
 | 
				
			||||||
  $: address_checked = true;
 | 
					  $: address_checked = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let address_input1;
 | 
					  let address_input1;
 | 
				
			||||||
  let address_input2;
 | 
					  let address_input2;
 | 
				
			||||||
@@ -110,7 +110,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -124,18 +124,18 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:text-left max-h-[75vh] overflow-y-auto">
 | 
					            <div class="mt-3 sm:text-left">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("create-a-new-organization")}
 | 
					                {$_("create-a-new-organization")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_(
 | 
					                  {$_(
 | 
				
			||||||
                    "please-provide-the-required-information-to-add-a-new-organization"
 | 
					                    "please-provide-the-required-information-to-add-a-new-organization"
 | 
				
			||||||
                  )}
 | 
					                  )}
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              <div class="grid grid-cols-6 gap-6 text-left">
 | 
					              <div class="grid grid-cols-6 gap-2 lg:gap-6 text-left">
 | 
				
			||||||
                <div class="col-span-6">
 | 
					                <div class="col-span-6">
 | 
				
			||||||
                  <label
 | 
					                  <label
 | 
				
			||||||
                    for="firstname"
 | 
					                    for="firstname"
 | 
				
			||||||
@@ -222,7 +222,7 @@
 | 
				
			|||||||
                      class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
 | 
					                      class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
 | 
				
			||||||
                    />
 | 
					                    />
 | 
				
			||||||
                  </div>
 | 
					                  </div>
 | 
				
			||||||
                  <div class="col-span-6">
 | 
					                  <div class="col-span-2">
 | 
				
			||||||
                    <label
 | 
					                    <label
 | 
				
			||||||
                      for="zipcode"
 | 
					                      for="zipcode"
 | 
				
			||||||
                      class="block text-sm font-medium text-gray-700"
 | 
					                      class="block text-sm font-medium text-gray-700"
 | 
				
			||||||
@@ -248,7 +248,7 @@
 | 
				
			|||||||
                      </span>
 | 
					                      </span>
 | 
				
			||||||
                    {/if}
 | 
					                    {/if}
 | 
				
			||||||
                  </div>
 | 
					                  </div>
 | 
				
			||||||
                  <div class="col-span-6">
 | 
					                  <div class="col-span-4">
 | 
				
			||||||
                    <label
 | 
					                    <label
 | 
				
			||||||
                      for="city"
 | 
					                      for="city"
 | 
				
			||||||
                      class="block text-sm font-medium text-gray-700"
 | 
					                      class="block text-sm font-medium text-gray-700"
 | 
				
			||||||
@@ -279,7 +279,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            disabled={!createbtnenabled}
 | 
					            disabled={!createbtnenabled}
 | 
				
			||||||
            class:opacity-50={!createbtnenabled}
 | 
					            class:opacity-50={!createbtnenabled}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -53,7 +53,7 @@
 | 
				
			|||||||
				<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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -68,13 +68,13 @@
 | 
				
			|||||||
								/></svg
 | 
													/></svg
 | 
				
			||||||
							>
 | 
												>
 | 
				
			||||||
						</div>
 | 
											</div>
 | 
				
			||||||
						<div class="mt-3 text-center sm:text-left max-h-[75vh] overflow-y-auto">
 | 
											<div class="mt-3 sm:text-left max-h-[75vh] overflow-y-auto">
 | 
				
			||||||
							<h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
												<h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
								{$_("do-you-want-to-delete-the-organization-delete_org-name", {
 | 
													{$_("do-you-want-to-delete-the-organization-delete_org-name", {
 | 
				
			||||||
									values: { orgname: delete_org.name },
 | 
														values: { orgname: delete_org.name },
 | 
				
			||||||
								})}
 | 
													})}
 | 
				
			||||||
							</h3>
 | 
												</h3>
 | 
				
			||||||
							<div class="mt-2 mb-6">
 | 
												<div class="mb-6">
 | 
				
			||||||
								<p class="text-sm text-gray-500">
 | 
													<p class="text-sm text-gray-500">
 | 
				
			||||||
									{$_("all-associated-teams-and-runners-will-be-deleted-too")}
 | 
														{$_("all-associated-teams-and-runners-will-be-deleted-too")}
 | 
				
			||||||
								</p>
 | 
													</p>
 | 
				
			||||||
@@ -82,7 +82,7 @@
 | 
				
			|||||||
						</div>
 | 
											</div>
 | 
				
			||||||
					</div>
 | 
										</div>
 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
				<div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
									<div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
					<button
 | 
										<button
 | 
				
			||||||
						on:click={deleteOrg}
 | 
											on:click={deleteOrg}
 | 
				
			||||||
						type="button"
 | 
											type="button"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										81
									
								
								src/components/pdf_generation/DownloadProgressModal.svelte
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								src/components/pdf_generation/DownloadProgressModal.svelte
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,81 @@
 | 
				
			|||||||
 | 
					<script>
 | 
				
			||||||
 | 
						import { _ } from "svelte-i18n";
 | 
				
			||||||
 | 
						import { clickOutside } from "../base/outsideclick";
 | 
				
			||||||
 | 
						import { onMount } from "svelte";
 | 
				
			||||||
 | 
						export let download_details = "";
 | 
				
			||||||
 | 
						export let modal_open;
 | 
				
			||||||
 | 
						onMount(() => {
 | 
				
			||||||
 | 
							document.onkeydown = (e) => {
 | 
				
			||||||
 | 
								e = e || window.event;
 | 
				
			||||||
 | 
								if (e.key === "Escape") {
 | 
				
			||||||
 | 
									modal_open = false;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (e.keyCode === 13) {
 | 
				
			||||||
 | 
									if (createbtnenabled === true) {
 | 
				
			||||||
 | 
										createbtnenabled = false;
 | 
				
			||||||
 | 
										submit();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{#if modal_open}
 | 
				
			||||||
 | 
						<div
 | 
				
			||||||
 | 
							class="fixed z-10 inset-0 overflow-y-hidden"
 | 
				
			||||||
 | 
							use:clickOutside
 | 
				
			||||||
 | 
							on:click_outside={() => {
 | 
				
			||||||
 | 
								modal_open = false;
 | 
				
			||||||
 | 
							}}
 | 
				
			||||||
 | 
						>
 | 
				
			||||||
 | 
							<div
 | 
				
			||||||
 | 
								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="absolute inset-0 bg-gray-500 opacity-75"
 | 
				
			||||||
 | 
										data-id="modal_backdrop"
 | 
				
			||||||
 | 
									/>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
								<span
 | 
				
			||||||
 | 
									class="hidden sm:inline-block sm:align-middle sm:h-screen"
 | 
				
			||||||
 | 
									aria-hidden="true">​</span
 | 
				
			||||||
 | 
								>
 | 
				
			||||||
 | 
								<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]"
 | 
				
			||||||
 | 
									role="dialog"
 | 
				
			||||||
 | 
									aria-modal="true"
 | 
				
			||||||
 | 
									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="">
 | 
				
			||||||
 | 
											<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"
 | 
				
			||||||
 | 
											>
 | 
				
			||||||
 | 
												<svg
 | 
				
			||||||
 | 
													xmlns="http://www.w3.org/2000/svg"
 | 
				
			||||||
 | 
													viewBox="0 0 24 24"
 | 
				
			||||||
 | 
													class="h-6 w-6 text-blue-600"
 | 
				
			||||||
 | 
													fill="currentColor"
 | 
				
			||||||
 | 
													width="24"
 | 
				
			||||||
 | 
													height="24"
 | 
				
			||||||
 | 
													><path fill="none" d="M0 0h24v24H0z" />
 | 
				
			||||||
 | 
													<path
 | 
				
			||||||
 | 
														d="M9.83 8.79L8 9.456V13H6V8.05h.015l5.268-1.918c.244-.093.51-.14.782-.131a2.616 2.616 0 0 1 2.427 1.82c.186.583.356.977.51 1.182A4.992 4.992 0 0 0 19 11v2a6.986 6.986 0 0 1-5.402-2.547l-.581 3.297L15 15.67V23h-2v-5.986l-2.05-1.987-.947 4.298-6.894-1.215.348-1.97 4.924.868L9.83 8.79zM13.5 5.5a2 2 0 1 1 0-4 2 2 0 0 1 0 4z"
 | 
				
			||||||
 | 
													/></svg
 | 
				
			||||||
 | 
												>
 | 
				
			||||||
 | 
											</div>
 | 
				
			||||||
 | 
											<div class="mt-3 sm:text-left text-base">
 | 
				
			||||||
 | 
												<h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
 | 
													{$_('download_laeuft')}
 | 
				
			||||||
 | 
												</h3>
 | 
				
			||||||
 | 
												<div class="w-full">
 | 
				
			||||||
 | 
													{download_details}
 | 
				
			||||||
 | 
												</div>
 | 
				
			||||||
 | 
											</div>
 | 
				
			||||||
 | 
										</div>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
 | 
					{/if}
 | 
				
			||||||
@@ -7,6 +7,7 @@
 | 
				
			|||||||
	import DocumentServer from "./DocumentServer";
 | 
						import DocumentServer from "./DocumentServer";
 | 
				
			||||||
	import { init } from "@paralleldrive/cuid2";
 | 
						import { init } from "@paralleldrive/cuid2";
 | 
				
			||||||
	import toast from "svelte-french-toast";
 | 
						import toast from "svelte-french-toast";
 | 
				
			||||||
 | 
						import DownloadProgressModal from "./DownloadProgressModal.svelte";
 | 
				
			||||||
	const createId = init({ length: 10, fingerprint: "lfk-frontend" });
 | 
						const createId = init({ length: 10, fingerprint: "lfk-frontend" });
 | 
				
			||||||
	const documentServer = new DocumentServer(
 | 
						const documentServer = new DocumentServer(
 | 
				
			||||||
		config.baseurl_documentserver,
 | 
							config.baseurl_documentserver,
 | 
				
			||||||
@@ -17,8 +18,12 @@
 | 
				
			|||||||
	export let generate_runners = [];
 | 
						export let generate_runners = [];
 | 
				
			||||||
	export let generate_orgs = [];
 | 
						export let generate_orgs = [];
 | 
				
			||||||
	export let generate_teams = [];
 | 
						export let generate_teams = [];
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						export let download_modal_open = false;
 | 
				
			||||||
 | 
						export let download_details = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	function generateSponsoringContract(locale) {
 | 
						function generateSponsoringContract(locale) {
 | 
				
			||||||
 | 
							download_modal_open = true;
 | 
				
			||||||
		if (generate_orgs.length > 0) {
 | 
							if (generate_orgs.length > 0) {
 | 
				
			||||||
			generateOrgContracts(locale);
 | 
								generateOrgContracts(locale);
 | 
				
			||||||
		} else if (generate_teams.length > 0) {
 | 
							} else if (generate_teams.length > 0) {
 | 
				
			||||||
@@ -41,19 +46,24 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	async function generateTeamContracts(locale) {
 | 
						async function generateTeamContracts(locale) {
 | 
				
			||||||
		toast.loading($_("generating-pdfs"));
 | 
							toast.loading($_("generating-pdfs"));
 | 
				
			||||||
 | 
							let totalCount = generate_teams.length;
 | 
				
			||||||
		let count = 0;
 | 
							let count = 0;
 | 
				
			||||||
		for (const t of generate_teams) {
 | 
							for (const t of generate_teams) {
 | 
				
			||||||
			count++;
 | 
								count++;
 | 
				
			||||||
 | 
								download_details = `${t.parentGroup.name} > ${t.name}`;
 | 
				
			||||||
			const runners = await RunnerTeamService.runnerTeamControllerGetRunners(
 | 
								const runners = await RunnerTeamService.runnerTeamControllerGetRunners(
 | 
				
			||||||
				t.id
 | 
									t.id
 | 
				
			||||||
			);
 | 
								);
 | 
				
			||||||
			documentServer
 | 
								await documentServer
 | 
				
			||||||
				.generateContracts(runners, locale)
 | 
									.generateContracts(runners, locale)
 | 
				
			||||||
				.then((blob) => {
 | 
									.then((blob) => {
 | 
				
			||||||
					download(
 | 
										download(
 | 
				
			||||||
						blob,
 | 
											blob,
 | 
				
			||||||
						`${$_("sponsorings")}_${t.name}-${locale}-${createId()}.pdf`
 | 
											`${$_("sponsorings")}_${t.name}-${locale}-${createId()}.pdf`
 | 
				
			||||||
					);
 | 
										);
 | 
				
			||||||
 | 
										if (count === totalCount) {
 | 
				
			||||||
 | 
											download_modal_open = false;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
				})
 | 
									})
 | 
				
			||||||
				.catch((err) => {});
 | 
									.catch((err) => {});
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -61,15 +71,23 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	async function generateOrgContracts(locale) {
 | 
						async function generateOrgContracts(locale) {
 | 
				
			||||||
		toast.loading($_("generating-pdf"));
 | 
							toast.loading($_("generating-pdf"));
 | 
				
			||||||
		let count_orgs = 0;
 | 
							let totalCount = 0;
 | 
				
			||||||
		for (const o of generate_orgs) {
 | 
							for (const o of generate_orgs) {
 | 
				
			||||||
			count_orgs++;
 | 
								totalCount++;
 | 
				
			||||||
			let count = 0;
 | 
								for (const t of o.teams) {
 | 
				
			||||||
 | 
									totalCount++;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							console.log({ totalCount });
 | 
				
			||||||
 | 
							let count = 0;
 | 
				
			||||||
 | 
							for (const o of generate_orgs) {
 | 
				
			||||||
 | 
								count++;
 | 
				
			||||||
			let runners =
 | 
								let runners =
 | 
				
			||||||
				await RunnerOrganizationService.runnerOrganizationControllerGetRunners(
 | 
									await RunnerOrganizationService.runnerOrganizationControllerGetRunners(
 | 
				
			||||||
					o.id,
 | 
										o.id,
 | 
				
			||||||
					true
 | 
										true
 | 
				
			||||||
				);
 | 
									);
 | 
				
			||||||
 | 
								download_details = o.name;
 | 
				
			||||||
			await documentServer
 | 
								await documentServer
 | 
				
			||||||
				.generateContracts(runners, locale)
 | 
									.generateContracts(runners, locale)
 | 
				
			||||||
				.then((blob) => {
 | 
									.then((blob) => {
 | 
				
			||||||
@@ -84,6 +102,7 @@
 | 
				
			|||||||
				let runners = await RunnerTeamService.runnerTeamControllerGetRunners(
 | 
									let runners = await RunnerTeamService.runnerTeamControllerGetRunners(
 | 
				
			||||||
					t.id
 | 
										t.id
 | 
				
			||||||
				);
 | 
									);
 | 
				
			||||||
 | 
									download_details = `${o.name} > ${t.name}`;
 | 
				
			||||||
				await documentServer
 | 
									await documentServer
 | 
				
			||||||
					.generateContracts(runners, locale)
 | 
										.generateContracts(runners, locale)
 | 
				
			||||||
					.then((blob) => {
 | 
										.then((blob) => {
 | 
				
			||||||
@@ -93,15 +112,19 @@
 | 
				
			|||||||
								t.name
 | 
													t.name
 | 
				
			||||||
							}-${locale}-${createId()}.pdf`
 | 
												}-${locale}-${createId()}.pdf`
 | 
				
			||||||
						);
 | 
											);
 | 
				
			||||||
 | 
											console.log({ count });
 | 
				
			||||||
 | 
											if (count === totalCount) {
 | 
				
			||||||
 | 
												download_modal_open = false;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
					.catch((err) => {});
 | 
										.catch((err) => {});
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	function generateRunnerContracts(locale) {
 | 
						async function generateRunnerContracts(locale) {
 | 
				
			||||||
		toast.loading($_("generating-pdf"));
 | 
							toast.loading($_("generating-pdf"));
 | 
				
			||||||
		documentServer
 | 
							await documentServer
 | 
				
			||||||
			.generateContracts(generate_runners, locale)
 | 
								.generateContracts(generate_runners, locale)
 | 
				
			||||||
			.then((blob) => {
 | 
								.then((blob) => {
 | 
				
			||||||
				let fileName = `${$_("sponsorings")}-${locale}-${createId()}.pdf`;
 | 
									let fileName = `${$_("sponsorings")}-${locale}-${createId()}.pdf`;
 | 
				
			||||||
@@ -111,6 +134,7 @@
 | 
				
			|||||||
					}-${locale}-${createId()}.pdf`;
 | 
										}-${locale}-${createId()}.pdf`;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				download(blob, fileName);
 | 
									download(blob, fileName);
 | 
				
			||||||
 | 
									download_modal_open = false;
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
			.catch((err) => {
 | 
								.catch((err) => {
 | 
				
			||||||
				console.error(err);
 | 
									console.error(err);
 | 
				
			||||||
@@ -119,6 +143,7 @@
 | 
				
			|||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{#if sponsoring_contracts_show}
 | 
					{#if sponsoring_contracts_show}
 | 
				
			||||||
 | 
						<DownloadProgressModal {download_details} modal_open={download_modal_open} />
 | 
				
			||||||
	<button
 | 
						<button
 | 
				
			||||||
		on:click={() => {
 | 
							on:click={() => {
 | 
				
			||||||
			generateSponsoringContract("de");
 | 
								generateSponsoringContract("de");
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -145,7 +145,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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
 | 
				
			||||||
                xmlns="http://www.w3.org/2000/svg"
 | 
					                xmlns="http://www.w3.org/2000/svg"
 | 
				
			||||||
@@ -160,18 +160,18 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:text-left max-h-[75vh] overflow-y-auto">
 | 
					            <div class="mt-3 sm:text-left max-h-[75vh] overflow-y-auto">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("create-a-new-runner")}
 | 
					                {$_("create-a-new-runner")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_(
 | 
					                  {$_(
 | 
				
			||||||
                    "please-provide-the-required-information-to-add-a-new-runner"
 | 
					                    "please-provide-the-required-information-to-add-a-new-runner"
 | 
				
			||||||
                  )}
 | 
					                  )}
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              <div class="grid grid-cols-6 gap-6 text-left">
 | 
					              <div class="grid grid-cols-6 gap-2 lg:gap-6 text-left">
 | 
				
			||||||
                <div class="col-span-6">
 | 
					                <div class="col-span-6">
 | 
				
			||||||
                  <label
 | 
					                  <label
 | 
				
			||||||
                    for="firstname"
 | 
					                    for="firstname"
 | 
				
			||||||
@@ -323,7 +323,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            disabled={!createbtnenabled}
 | 
					            disabled={!createbtnenabled}
 | 
				
			||||||
            class:opacity-50={!createbtnenabled}
 | 
					            class:opacity-50={!createbtnenabled}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,7 +59,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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
 | 
				
			||||||
                xmlns="http://www.w3.org/2000/svg"
 | 
					                xmlns="http://www.w3.org/2000/svg"
 | 
				
			||||||
@@ -74,7 +74,7 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:text-left max-h-[75vh] overflow-y-auto">
 | 
					            <div class="mt-3 sm:text-left">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_('delete_runner')}
 | 
					                {$_('delete_runner')}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
@@ -86,7 +86,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            on:click={submit}
 | 
					            on:click={submit}
 | 
				
			||||||
            type="button"
 | 
					            type="button"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,401 +1,386 @@
 | 
				
			|||||||
<script>
 | 
					<script>
 | 
				
			||||||
  import csv from "csvtojson";
 | 
						import csv from "csvtojson";
 | 
				
			||||||
  import { read as readXlsx, utils as xlsx_utils } from "xlsx";
 | 
						import { read as readXlsx, utils as xlsx_utils } from "xlsx";
 | 
				
			||||||
  import { _ } from "svelte-i18n";
 | 
						import { _ } from "svelte-i18n";
 | 
				
			||||||
  import { clickOutside } from "../base/outsideclick";
 | 
						import { clickOutside } from "../base/outsideclick";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  import {
 | 
						import {
 | 
				
			||||||
    ImportService,
 | 
							ImportService,
 | 
				
			||||||
    RunnerTeamService,
 | 
							RunnerTeamService,
 | 
				
			||||||
    RunnerOrganizationService,
 | 
							RunnerOrganizationService,
 | 
				
			||||||
  } from "@odit/lfk-client-js";
 | 
						} from "@odit/lfk-client-js";
 | 
				
			||||||
  import { createEventDispatcher } from "svelte";
 | 
						import { createEventDispatcher } from "svelte";
 | 
				
			||||||
  import Select from "svelte-select";
 | 
						import Select from "svelte-select";
 | 
				
			||||||
  import toast from "svelte-french-toast";
 | 
						import toast from "svelte-french-toast";
 | 
				
			||||||
  export let opened_from;
 | 
						export let opened_from;
 | 
				
			||||||
  export let passed_org;
 | 
						export let passed_org;
 | 
				
			||||||
  export let passed_orgs;
 | 
						export let passed_orgs;
 | 
				
			||||||
  export let passed_team;
 | 
						export let passed_team;
 | 
				
			||||||
  export let import_modal_open;
 | 
						export let import_modal_open;
 | 
				
			||||||
  $: searchvalue = "";
 | 
						$: searchvalue = "";
 | 
				
			||||||
  $: importButtonEnabled =
 | 
						$: importButtonEnabled =
 | 
				
			||||||
    recent_processed &&
 | 
							recent_processed &&
 | 
				
			||||||
    (!(selected_org_or_team == "" || selected_org_or_team == null) ||
 | 
							(!(selected_org_or_team == "" || selected_org_or_team == null) ||
 | 
				
			||||||
      !(passed_org?.id == null || passed_org?.id == 0) ||
 | 
								!(passed_org?.id == null || passed_org?.id == 0) ||
 | 
				
			||||||
      !(passed_team?.id == null || passed_team?.id == 0));
 | 
								!(passed_team?.id == null || passed_team?.id == 0));
 | 
				
			||||||
  const dispatch = createEventDispatcher();
 | 
						const dispatch = createEventDispatcher();
 | 
				
			||||||
  function cancelModal() {
 | 
						function cancelModal() {
 | 
				
			||||||
    json_output = [];
 | 
							json_output = [];
 | 
				
			||||||
    import_modal_open = false;
 | 
							import_modal_open = false;
 | 
				
			||||||
    dispatch("cancel");
 | 
							dispatch("cancel");
 | 
				
			||||||
  }
 | 
						}
 | 
				
			||||||
  (() => {
 | 
						(() => {
 | 
				
			||||||
    document.onkeydown = (e) => {
 | 
							document.onkeydown = (e) => {
 | 
				
			||||||
      e = e || window.event;
 | 
								e = e || window.event;
 | 
				
			||||||
      if (e.key === "Escape") {
 | 
								if (e.key === "Escape") {
 | 
				
			||||||
        cancelModal();
 | 
									cancelModal();
 | 
				
			||||||
      }
 | 
								}
 | 
				
			||||||
      if (e.keyCode === 13) {
 | 
								if (e.keyCode === 13) {
 | 
				
			||||||
        //
 | 
									//
 | 
				
			||||||
      }
 | 
								}
 | 
				
			||||||
    };
 | 
							};
 | 
				
			||||||
  })();
 | 
						})();
 | 
				
			||||||
  let groups = [];
 | 
						let groups = [];
 | 
				
			||||||
  RunnerOrganizationService.runnerOrganizationControllerGetAll().then((val) => {
 | 
						RunnerOrganizationService.runnerOrganizationControllerGetAll().then((val) => {
 | 
				
			||||||
    const orgs = val.map((r) => {
 | 
							const orgs = val.map((r) => {
 | 
				
			||||||
      return { label: r.name, value: `ORG_${r.id}` };
 | 
								return { label: r.name, value: `ORG_${r.id}` };
 | 
				
			||||||
    });
 | 
							});
 | 
				
			||||||
    groups = groups.concat(orgs);
 | 
							groups = groups.concat(orgs);
 | 
				
			||||||
    RunnerTeamService.runnerTeamControllerGetAll().then((val) => {
 | 
							RunnerTeamService.runnerTeamControllerGetAll().then((val) => {
 | 
				
			||||||
      const teams = val.map((r) => {
 | 
								const teams = val.map((r) => {
 | 
				
			||||||
        return {
 | 
									return {
 | 
				
			||||||
          label: `${r.parentGroup.name} > ${r.name}`,
 | 
										label: `${r.parentGroup.name} > ${r.name}`,
 | 
				
			||||||
          value: `TEAM_${r.id}`,
 | 
										value: `TEAM_${r.id}`,
 | 
				
			||||||
        };
 | 
									};
 | 
				
			||||||
      });
 | 
								});
 | 
				
			||||||
      groups = groups.concat(teams);
 | 
								groups = groups.concat(teams);
 | 
				
			||||||
    });
 | 
							});
 | 
				
			||||||
  });
 | 
						});
 | 
				
			||||||
  let selected_org;
 | 
						let selected_org;
 | 
				
			||||||
  $: selected_org_or_team = "";
 | 
						$: selected_org_or_team = "";
 | 
				
			||||||
  let files;
 | 
						let files;
 | 
				
			||||||
  let recent_processed = true;
 | 
						let recent_processed = true;
 | 
				
			||||||
  $: json_output = [];
 | 
						$: json_output = [];
 | 
				
			||||||
  $: {
 | 
						$: {
 | 
				
			||||||
    if (files) {
 | 
							if (files) {
 | 
				
			||||||
      if (
 | 
								if (
 | 
				
			||||||
        files[0].type ===
 | 
									files[0].type ===
 | 
				
			||||||
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
 | 
									"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
 | 
				
			||||||
      ) {
 | 
								) {
 | 
				
			||||||
        const reader = new FileReader();
 | 
									const reader = new FileReader();
 | 
				
			||||||
        reader.addEventListener("load", async (e) => {
 | 
									reader.addEventListener("load", async (e) => {
 | 
				
			||||||
          const data = new Uint8Array(e.target.result);
 | 
										const data = new Uint8Array(e.target.result);
 | 
				
			||||||
          const out = readXlsx(data, { type: "array" });
 | 
										const out = readXlsx(data, { type: "array" });
 | 
				
			||||||
          json_output = xlsx_utils.sheet_to_json(
 | 
										json_output = xlsx_utils.sheet_to_json(
 | 
				
			||||||
            out.Sheets[Object.keys(out.Sheets)[0]]
 | 
											out.Sheets[Object.keys(out.Sheets)[0]]
 | 
				
			||||||
          );
 | 
										);
 | 
				
			||||||
        });
 | 
									});
 | 
				
			||||||
        reader.readAsArrayBuffer(files[0]);
 | 
									reader.readAsArrayBuffer(files[0]);
 | 
				
			||||||
      } else {
 | 
								} else {
 | 
				
			||||||
        const reader = new FileReader();
 | 
									const reader = new FileReader();
 | 
				
			||||||
        reader.addEventListener("load", async (e) => {
 | 
									reader.addEventListener("load", async (e) => {
 | 
				
			||||||
          json_output = await csv({
 | 
										json_output = await csv({
 | 
				
			||||||
            delimiter: [";", ","],
 | 
											delimiter: [";", ","],
 | 
				
			||||||
            trim: true,
 | 
											trim: true,
 | 
				
			||||||
          }).fromString(e.target.result);
 | 
										}).fromString(e.target.result);
 | 
				
			||||||
        });
 | 
									});
 | 
				
			||||||
        reader.readAsText(files[0]);
 | 
									reader.readAsText(files[0]);
 | 
				
			||||||
      }
 | 
								}
 | 
				
			||||||
    }
 | 
							}
 | 
				
			||||||
  }
 | 
						}
 | 
				
			||||||
  function importAction() {
 | 
						function importAction() {
 | 
				
			||||||
    if (recent_processed === true) {
 | 
							if (recent_processed === true) {
 | 
				
			||||||
      toast.loading($_("runners-are-being-imported"));
 | 
								toast.loading($_("runners-are-being-imported"));
 | 
				
			||||||
      recent_processed = false;
 | 
								recent_processed = false;
 | 
				
			||||||
      const mapped = json_output.map(function (runner) {
 | 
								const mapped = json_output.map(function (runner) {
 | 
				
			||||||
        return {
 | 
									return {
 | 
				
			||||||
          firstname: runner[`${$_("csv_import__firstname")}`],
 | 
										firstname: runner[`${$_("csv_import__firstname")}`],
 | 
				
			||||||
          middlename: runner[`${$_("csv_import__middlename")}`],
 | 
										middlename: runner[`${$_("csv_import__middlename")}`],
 | 
				
			||||||
          lastname: runner[`${$_("csv_import__lastname")}`],
 | 
										lastname: runner[`${$_("csv_import__lastname")}`],
 | 
				
			||||||
          team:
 | 
										team:
 | 
				
			||||||
            runner[`${$_("csv_import__team")}`] ||
 | 
											runner[`${$_("csv_import__team")}`] ||
 | 
				
			||||||
            runner[`${$_("csv_import__class")}`],
 | 
											runner[`${$_("csv_import__class")}`],
 | 
				
			||||||
        };
 | 
									};
 | 
				
			||||||
      });
 | 
								});
 | 
				
			||||||
      let org = 0;
 | 
								let org = 0;
 | 
				
			||||||
      if (opened_from === "OrgDetail") {
 | 
								if (opened_from === "OrgDetail") {
 | 
				
			||||||
        org = passed_org.id;
 | 
									org = passed_org.id;
 | 
				
			||||||
      }
 | 
								}
 | 
				
			||||||
      if (opened_from === "OrgOverview") {
 | 
								if (opened_from === "OrgOverview") {
 | 
				
			||||||
        org = parseInt(selected_org);
 | 
									org = parseInt(selected_org);
 | 
				
			||||||
      }
 | 
								}
 | 
				
			||||||
      if (opened_from === "OrgOverview" || opened_from === "OrgDetail") {
 | 
								if (opened_from === "OrgOverview" || opened_from === "OrgDetail") {
 | 
				
			||||||
        ImportService.importControllerPostOrgsJson(org, mapped)
 | 
									ImportService.importControllerPostOrgsJson(org, mapped)
 | 
				
			||||||
          .then((resp) => {
 | 
										.then((resp) => {
 | 
				
			||||||
            toast.dismiss();
 | 
											toast.dismiss();
 | 
				
			||||||
            recent_processed = true;
 | 
											recent_processed = true;
 | 
				
			||||||
            toast.success($_("import-finished"));
 | 
											toast.success($_("import-finished"));
 | 
				
			||||||
            cancelModal();
 | 
											cancelModal();
 | 
				
			||||||
          })
 | 
										})
 | 
				
			||||||
          .catch((err) => {
 | 
										.catch((err) => {
 | 
				
			||||||
            toast.dismiss();
 | 
											toast.dismiss();
 | 
				
			||||||
            recent_processed = true;
 | 
											recent_processed = true;
 | 
				
			||||||
            toast.error($_("error-during-import"));
 | 
											toast.error($_("error-during-import"));
 | 
				
			||||||
            cancelModal();
 | 
											cancelModal();
 | 
				
			||||||
          });
 | 
										});
 | 
				
			||||||
      }
 | 
								}
 | 
				
			||||||
      if (opened_from === "TeamDetail") {
 | 
								if (opened_from === "TeamDetail") {
 | 
				
			||||||
        ImportService.importControllerPostTeamsJson(passed_team.id, mapped)
 | 
									ImportService.importControllerPostTeamsJson(passed_team.id, mapped)
 | 
				
			||||||
          .then((resp) => {
 | 
										.then((resp) => {
 | 
				
			||||||
            toast.dismiss();
 | 
											toast.dismiss();
 | 
				
			||||||
            recent_processed = true;
 | 
											recent_processed = true;
 | 
				
			||||||
            toast.success($_("import-finished"));
 | 
											toast.success($_("import-finished"));
 | 
				
			||||||
            cancelModal();
 | 
											cancelModal();
 | 
				
			||||||
          })
 | 
										})
 | 
				
			||||||
          .catch((err) => {
 | 
										.catch((err) => {
 | 
				
			||||||
            toast.dismiss();
 | 
											toast.dismiss();
 | 
				
			||||||
            recent_processed = true;
 | 
											recent_processed = true;
 | 
				
			||||||
            toast.error($_("error-during-import"));
 | 
											toast.error($_("error-during-import"));
 | 
				
			||||||
            cancelModal();
 | 
											cancelModal();
 | 
				
			||||||
          });
 | 
										});
 | 
				
			||||||
      }
 | 
								}
 | 
				
			||||||
      if (opened_from === "RunnerOverview") {
 | 
								if (opened_from === "RunnerOverview") {
 | 
				
			||||||
        if (selected_org_or_team.includes("ORG_")) {
 | 
									if (selected_org_or_team.includes("ORG_")) {
 | 
				
			||||||
          selected_org_or_team = selected_org_or_team.split("_")[1];
 | 
										selected_org_or_team = selected_org_or_team.split("_")[1];
 | 
				
			||||||
          ImportService.importControllerPostOrgsJson(
 | 
										ImportService.importControllerPostOrgsJson(
 | 
				
			||||||
            selected_org_or_team,
 | 
											selected_org_or_team,
 | 
				
			||||||
            mapped
 | 
											mapped
 | 
				
			||||||
          )
 | 
										)
 | 
				
			||||||
            .then((resp) => {
 | 
											.then((resp) => {
 | 
				
			||||||
              dispatch("created", { runners: resp });
 | 
												dispatch("created", { runners: resp });
 | 
				
			||||||
              toast.dismiss();
 | 
												toast.dismiss();
 | 
				
			||||||
              recent_processed = true;
 | 
												recent_processed = true;
 | 
				
			||||||
              toast.success($_("import-finished"));
 | 
												toast.success($_("import-finished"));
 | 
				
			||||||
              cancelModal();
 | 
												cancelModal();
 | 
				
			||||||
            })
 | 
											})
 | 
				
			||||||
            .catch((err) => {
 | 
											.catch((err) => {
 | 
				
			||||||
              toast.dismiss();
 | 
												toast.dismiss();
 | 
				
			||||||
              recent_processed = true;
 | 
												recent_processed = true;
 | 
				
			||||||
              toast.error($_("error-during-import"));
 | 
												toast.error($_("error-during-import"));
 | 
				
			||||||
              cancelModal();
 | 
												cancelModal();
 | 
				
			||||||
            });
 | 
											});
 | 
				
			||||||
        }
 | 
									}
 | 
				
			||||||
        if (selected_org_or_team.includes("TEAM_")) {
 | 
									if (selected_org_or_team.includes("TEAM_")) {
 | 
				
			||||||
          selected_org_or_team = selected_org_or_team.split("_")[1];
 | 
										selected_org_or_team = selected_org_or_team.split("_")[1];
 | 
				
			||||||
          ImportService.importControllerPostTeamsJson(
 | 
										ImportService.importControllerPostTeamsJson(
 | 
				
			||||||
            selected_org_or_team,
 | 
											selected_org_or_team,
 | 
				
			||||||
            mapped
 | 
											mapped
 | 
				
			||||||
          )
 | 
										)
 | 
				
			||||||
            .then((resp) => {
 | 
											.then((resp) => {
 | 
				
			||||||
              dispatch("created", { runners: resp });
 | 
												dispatch("created", { runners: resp });
 | 
				
			||||||
              toast.dismiss();
 | 
												toast.dismiss();
 | 
				
			||||||
              recent_processed = true;
 | 
												recent_processed = true;
 | 
				
			||||||
              toast.success($_("import-finished"));
 | 
												toast.success($_("import-finished"));
 | 
				
			||||||
              cancelModal();
 | 
												cancelModal();
 | 
				
			||||||
            })
 | 
											})
 | 
				
			||||||
            .catch((err) => {
 | 
											.catch((err) => {
 | 
				
			||||||
              toast.dismiss();
 | 
												toast.dismiss();
 | 
				
			||||||
              recent_processed = true;
 | 
												recent_processed = true;
 | 
				
			||||||
              toast.error($_("error-during-import"));
 | 
												toast.error($_("error-during-import"));
 | 
				
			||||||
              cancelModal();
 | 
												cancelModal();
 | 
				
			||||||
            });
 | 
											});
 | 
				
			||||||
        }
 | 
									}
 | 
				
			||||||
      }
 | 
								}
 | 
				
			||||||
    }
 | 
							}
 | 
				
			||||||
  }
 | 
						}
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{#if import_modal_open}
 | 
					{#if import_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={() => {
 | 
				
			||||||
      cancelModal();
 | 
								cancelModal();
 | 
				
			||||||
    }}
 | 
							}}
 | 
				
			||||||
  >
 | 
						>
 | 
				
			||||||
    <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-gray-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]"
 | 
									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]"
 | 
				
			||||||
        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 lg:rounded-xl">
 | 
									<div
 | 
				
			||||||
          <div class="">
 | 
										class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4 rounded-t-xl lg:rounded-xl"
 | 
				
			||||||
            <div
 | 
									>
 | 
				
			||||||
              class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10"
 | 
										<div class="">
 | 
				
			||||||
            >
 | 
											<div
 | 
				
			||||||
              <svg
 | 
												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"
 | 
				
			||||||
                xmlns="http://www.w3.org/2000/svg"
 | 
											>
 | 
				
			||||||
                viewBox="0 0 24 24"
 | 
												<svg
 | 
				
			||||||
                class="h-6 w-6 text-blue-600"
 | 
													xmlns="http://www.w3.org/2000/svg"
 | 
				
			||||||
                fill="currentColor"
 | 
													viewBox="0 0 24 24"
 | 
				
			||||||
                width="24"
 | 
													class="h-6 w-6 text-blue-600"
 | 
				
			||||||
                height="24"
 | 
													fill="currentColor"
 | 
				
			||||||
                ><path fill="none" d="M0 0h24v24H0z" />
 | 
													width="24"
 | 
				
			||||||
                <path
 | 
													height="24"
 | 
				
			||||||
                  d="M9.83 8.79L8 9.456V13H6V8.05h.015l5.268-1.918c.244-.093.51-.14.782-.131a2.616 2.616 0 0 1 2.427 1.82c.186.583.356.977.51 1.182A4.992 4.992 0 0 0 19 11v2a6.986 6.986 0 0 1-5.402-2.547l-.581 3.297L15 15.67V23h-2v-5.986l-2.05-1.987-.947 4.298-6.894-1.215.348-1.97 4.924.868L9.83 8.79zM13.5 5.5a2 2 0 1 1 0-4 2 2 0 0 1 0 4z"
 | 
													><path fill="none" d="M0 0h24v24H0z" />
 | 
				
			||||||
                /></svg
 | 
													<path
 | 
				
			||||||
              >
 | 
														d="M9.83 8.79L8 9.456V13H6V8.05h.015l5.268-1.918c.244-.093.51-.14.782-.131a2.616 2.616 0 0 1 2.427 1.82c.186.583.356.977.51 1.182A4.992 4.992 0 0 0 19 11v2a6.986 6.986 0 0 1-5.402-2.547l-.581 3.297L15 15.67V23h-2v-5.986l-2.05-1.987-.947 4.298-6.894-1.215.348-1.97 4.924.868L9.83 8.79zM13.5 5.5a2 2 0 1 1 0-4 2 2 0 0 1 0 4z"
 | 
				
			||||||
            </div>
 | 
													/></svg
 | 
				
			||||||
            <div class="mt-3 text-center sm:mt-0 sm:text-left w-full">
 | 
												>
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-bold mt-2 text-gray-900">
 | 
											</div>
 | 
				
			||||||
                {$_("runner-import")}
 | 
											<div class="mt-3 sm:mt-0 sm:text-left w-full">
 | 
				
			||||||
              </h3>
 | 
												<h3 class="text-lg leading-6 font-bold mt-2 text-gray-900">
 | 
				
			||||||
            </div>
 | 
													{$_("runner-import")}
 | 
				
			||||||
          </div>
 | 
												</h3>
 | 
				
			||||||
          <div class="mt-5 text-center sm:mt-0 sm:text-left w-full">
 | 
											</div>
 | 
				
			||||||
            {#if json_output.length === 0}
 | 
										</div>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
										<div class="sm:text-left w-full">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
											{#if json_output.length === 0}
 | 
				
			||||||
                  {$_("please-provide-the-required-csv-xlsx-file")}
 | 
												<div class="mb-6">
 | 
				
			||||||
                </p>
 | 
													<p class="text-sm text-gray-500">
 | 
				
			||||||
              </div>
 | 
														{$_("please-provide-the-required-csv-xlsx-file")}
 | 
				
			||||||
              <div class="overflow-hidden relative mt-4 mb-4">
 | 
													</p>
 | 
				
			||||||
                <input
 | 
												</div>
 | 
				
			||||||
                  accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
 | 
												<div class="overflow-hidden relative mt-4 mb-4">
 | 
				
			||||||
                  bind:files
 | 
													<input
 | 
				
			||||||
                  type="file"
 | 
														accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
 | 
				
			||||||
                />
 | 
														bind:files
 | 
				
			||||||
              </div>
 | 
														type="file"
 | 
				
			||||||
              <div class="overflow-hidden relative mt-4 mb-4">
 | 
													/>
 | 
				
			||||||
                <button
 | 
												</div>
 | 
				
			||||||
                  on:click={() => {
 | 
												<div class="overflow-hidden relative mt-4 mb-4">
 | 
				
			||||||
                    cancelModal();
 | 
													<button
 | 
				
			||||||
                  }}
 | 
														on:click={() => {
 | 
				
			||||||
                  type="button"
 | 
															cancelModal();
 | 
				
			||||||
                  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"
 | 
														}}
 | 
				
			||||||
                >
 | 
														type="button"
 | 
				
			||||||
                  {$_("cancel")}
 | 
														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"
 | 
				
			||||||
                </button>
 | 
													>
 | 
				
			||||||
              </div>
 | 
														{$_("cancel")}
 | 
				
			||||||
            {/if}
 | 
													</button>
 | 
				
			||||||
            {#if json_output.length > 0}
 | 
												</div>
 | 
				
			||||||
              {#if opened_from === "OrgOverview"}
 | 
											{/if}
 | 
				
			||||||
                <p>{$_("import__target-organization")}</p>
 | 
											{#if json_output.length > 0}
 | 
				
			||||||
                <select
 | 
												{#if opened_from === "OrgOverview"}
 | 
				
			||||||
                  name="team"
 | 
													<p>{$_("import__target-organization")}</p>
 | 
				
			||||||
                  bind:value={selected_org}
 | 
													<select
 | 
				
			||||||
                  class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
 | 
														name="team"
 | 
				
			||||||
                >
 | 
														bind:value={selected_org}
 | 
				
			||||||
                  {#each passed_orgs as o}
 | 
														class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
 | 
				
			||||||
                    <option value={o.id}>{o.name}</option>
 | 
													>
 | 
				
			||||||
                  {/each}
 | 
														{#each passed_orgs as o}
 | 
				
			||||||
                </select>
 | 
															<option value={o.id}>{o.name}</option>
 | 
				
			||||||
                <p>{$_("confirm-runner-import")}</p>
 | 
														{/each}
 | 
				
			||||||
              {/if}
 | 
													</select>
 | 
				
			||||||
              {#if opened_from === "RunnerOverview"}
 | 
													<p>{$_("confirm-runner-import")}</p>
 | 
				
			||||||
                <p>{$_("group")}</p>
 | 
												{/if}
 | 
				
			||||||
                <Select
 | 
												{#if opened_from === "RunnerOverview"}
 | 
				
			||||||
                  containerClasses="rounded-l-md mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
 | 
													<p>{$_("group")}</p>
 | 
				
			||||||
                  itemFilter={(label, filterText, option) =>
 | 
													<select
 | 
				
			||||||
                    label.toLowerCase().includes(filterText.toLowerCase()) ||
 | 
														bind:value={selected_org_or_team}
 | 
				
			||||||
                    option.id.value
 | 
														class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-neutral-800 rounded-md p-2"
 | 
				
			||||||
                      .toString()
 | 
													>
 | 
				
			||||||
                      .startsWith(filterText.toLowerCase())}
 | 
														{#each groups as g}
 | 
				
			||||||
                  items={groups}
 | 
															<option value={g.value}>{g.label}</option>
 | 
				
			||||||
                  showChevron={true}
 | 
														{/each}
 | 
				
			||||||
                  placeholder={$_(
 | 
													</select>
 | 
				
			||||||
                    "search-for-an-organization-or-team-by-name-or-id"
 | 
												{/if}
 | 
				
			||||||
                  )}
 | 
												{#if opened_from === "OrgDetail"}
 | 
				
			||||||
                  noOptionsMessage={$_("no-organization-or-team-found")}
 | 
													<p>
 | 
				
			||||||
                  on:select={(selectedValue) => {
 | 
														{$_("runnerimport_verify_runners_org", {
 | 
				
			||||||
                    selected_org_or_team = selectedValue.detail.value;
 | 
															values: { org_name: passed_org.name },
 | 
				
			||||||
                  }}
 | 
														})}
 | 
				
			||||||
                  on:clear={() => (selected_org_or_team = null)}
 | 
													</p>
 | 
				
			||||||
                />
 | 
												{/if}
 | 
				
			||||||
              {/if}
 | 
												<div class="relative w-full mt-4 mb-4">
 | 
				
			||||||
              {#if opened_from === "OrgDetail"}
 | 
													<div class="w-full overflow-x-auto max-h-[50vh]">
 | 
				
			||||||
                <p>
 | 
														<table class="divide-y divide-gray-200 w-full">
 | 
				
			||||||
                  {$_("runnerimport_verify_runners_org", {
 | 
															<thead class="bg-gray-50">
 | 
				
			||||||
                    values: { org_name: passed_org.name },
 | 
																<tr class="odd:bg-white even:bg-gray-100">
 | 
				
			||||||
                  })}
 | 
																	<th
 | 
				
			||||||
                </p>
 | 
																		scope="col"
 | 
				
			||||||
              {/if}
 | 
																		class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
 | 
				
			||||||
              <input
 | 
																	>
 | 
				
			||||||
                type="search"
 | 
																		{$_("csv_import__firstname")}
 | 
				
			||||||
                bind:value={searchvalue}
 | 
																	</th>
 | 
				
			||||||
                placeholder={$_("datatable.search")}
 | 
																	<th
 | 
				
			||||||
                aria-label={$_("datatable.search")}
 | 
																		scope="col"
 | 
				
			||||||
                class="p-2 w-full"
 | 
																		class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
 | 
				
			||||||
              />
 | 
																	>
 | 
				
			||||||
              <div class="relative w-full mt-4 mb-4">
 | 
																		{$_("csv_import__middlename")}
 | 
				
			||||||
                <div class="w-full overflow-x-auto">
 | 
																	</th>
 | 
				
			||||||
                  <table class="divide-y divide-gray-200 w-full">
 | 
																	<th
 | 
				
			||||||
                    <thead class="bg-gray-50">
 | 
																		scope="col"
 | 
				
			||||||
                      <tr class="odd:bg-white even:bg-gray-100">
 | 
																		class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
 | 
				
			||||||
                        <th
 | 
																	>
 | 
				
			||||||
                          scope="col"
 | 
																		{$_("csv_import__lastname")}
 | 
				
			||||||
                          class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
 | 
																	</th>
 | 
				
			||||||
                        >
 | 
																	{#if (opened_from !== "TeamDetail" && opened_from !== "RunnerOverview") || (opened_from === "RunnerOverview" && selected_org_or_team.includes("ORG_"))}
 | 
				
			||||||
                          {$_("csv_import__firstname")}
 | 
																		<th
 | 
				
			||||||
                        </th>
 | 
																			scope="col"
 | 
				
			||||||
                        <th
 | 
																			class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
 | 
				
			||||||
                          scope="col"
 | 
																		>
 | 
				
			||||||
                          class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
 | 
																			{$_("csv_import__team")}
 | 
				
			||||||
                        >
 | 
																		</th>
 | 
				
			||||||
                          {$_("csv_import__middlename")}
 | 
																	{/if}
 | 
				
			||||||
                        </th>
 | 
																</tr>
 | 
				
			||||||
                        <th
 | 
															</thead>
 | 
				
			||||||
                          scope="col"
 | 
															<tbody class="divide-y divide-gray-200">
 | 
				
			||||||
                          class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
 | 
																{#each json_output as runner}
 | 
				
			||||||
                        >
 | 
																	{#if Object.values(runner)
 | 
				
			||||||
                          {$_("csv_import__lastname")}
 | 
																		.toString()
 | 
				
			||||||
                        </th>
 | 
																		.toLowerCase()
 | 
				
			||||||
                        {#if (opened_from !== "TeamDetail" && opened_from !== "RunnerOverview") || (opened_from === "RunnerOverview" && selected_org_or_team.includes("ORG_"))}
 | 
																		.includes(searchvalue)}
 | 
				
			||||||
                          <th
 | 
																		<tr class="odd:bg-white even:bg-gray-100">
 | 
				
			||||||
                            scope="col"
 | 
																			<td class="px-6 py-4 whitespace-nowrap">
 | 
				
			||||||
                            class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
 | 
																				{runner[`${$_("csv_import__firstname")}`]}
 | 
				
			||||||
                          >
 | 
																			</td>
 | 
				
			||||||
                            {$_("csv_import__team")}
 | 
																			<td class="px-6 py-4 whitespace-nowrap">
 | 
				
			||||||
                          </th>
 | 
																				{runner[`${$_("csv_import__middlename")}`] || ""}
 | 
				
			||||||
                        {/if}
 | 
																			</td>
 | 
				
			||||||
                      </tr>
 | 
																			<td class="px-6 py-4 whitespace-nowrap">
 | 
				
			||||||
                    </thead>
 | 
																				{runner[`${$_("csv_import__lastname")}`]}
 | 
				
			||||||
                    <tbody class="divide-y divide-gray-200">
 | 
																			</td>
 | 
				
			||||||
                      {#each json_output as runner}
 | 
																			{#if (opened_from !== "TeamDetail" && opened_from !== "RunnerOverview") || (opened_from === "RunnerOverview" && selected_org_or_team.includes("ORG_"))}
 | 
				
			||||||
                        {#if Object.values(runner)
 | 
																				<td class="px-6 py-4 whitespace-nowrap">
 | 
				
			||||||
                          .toString()
 | 
																					{runner[`${$_("csv_import__team")}`] ||
 | 
				
			||||||
                          .toLowerCase()
 | 
																						runner[`${$_("csv_import__class")}`] ||
 | 
				
			||||||
                          .includes(searchvalue)}
 | 
																						"---"}
 | 
				
			||||||
                          <tr class="odd:bg-white even:bg-gray-100">
 | 
																				</td>
 | 
				
			||||||
                            <td class="px-6 py-4 whitespace-nowrap">
 | 
																			{/if}
 | 
				
			||||||
                              {runner[`${$_("csv_import__firstname")}`]}
 | 
																		</tr>
 | 
				
			||||||
                            </td>
 | 
																	{/if}
 | 
				
			||||||
                            <td class="px-6 py-4 whitespace-nowrap">
 | 
																{/each}
 | 
				
			||||||
                              {runner[`${$_("csv_import__middlename")}`] || ""}
 | 
															</tbody>
 | 
				
			||||||
                            </td>
 | 
														</table>
 | 
				
			||||||
                            <td class="px-6 py-4 whitespace-nowrap">
 | 
													</div>
 | 
				
			||||||
                              {runner[`${$_("csv_import__lastname")}`]}
 | 
													<button
 | 
				
			||||||
                            </td>
 | 
														disabled={!importButtonEnabled}
 | 
				
			||||||
                            {#if (opened_from !== "TeamDetail" && opened_from !== "RunnerOverview") || (opened_from === "RunnerOverview" && selected_org_or_team.includes("ORG_"))}
 | 
														class:opacity-50={!importButtonEnabled}
 | 
				
			||||||
                              <td class="px-6 py-4 whitespace-nowrap">
 | 
														on:click={importAction}
 | 
				
			||||||
                                {runner[`${$_("csv_import__team")}`] ||
 | 
														type="button"
 | 
				
			||||||
                                  runner[`${$_("csv_import__class")}`] ||
 | 
														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"
 | 
				
			||||||
                                  "---"}
 | 
													>
 | 
				
			||||||
                              </td>
 | 
														{$_("import-runners")}
 | 
				
			||||||
                            {/if}
 | 
													</button>
 | 
				
			||||||
                          </tr>
 | 
													<button
 | 
				
			||||||
                        {/if}
 | 
														on:click={() => {
 | 
				
			||||||
                      {/each}
 | 
															cancelModal();
 | 
				
			||||||
                    </tbody>
 | 
														}}
 | 
				
			||||||
                  </table>
 | 
														type="button"
 | 
				
			||||||
                </div>
 | 
														class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500"
 | 
				
			||||||
                <button
 | 
													>
 | 
				
			||||||
                  disabled={!importButtonEnabled}
 | 
														{$_("cancel")}
 | 
				
			||||||
                  class:opacity-50={!importButtonEnabled}
 | 
													</button>
 | 
				
			||||||
                  on:click={importAction}
 | 
												</div>
 | 
				
			||||||
                  type="button"
 | 
											{/if}
 | 
				
			||||||
                  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"
 | 
										</div>
 | 
				
			||||||
                >
 | 
									</div>
 | 
				
			||||||
                  {$_("import-runners")}
 | 
								</div>
 | 
				
			||||||
                </button>
 | 
							</div>
 | 
				
			||||||
                <button
 | 
						</div>
 | 
				
			||||||
                  on:click={() => {
 | 
					 | 
				
			||||||
                    cancelModal();
 | 
					 | 
				
			||||||
                  }}
 | 
					 | 
				
			||||||
                  type="button"
 | 
					 | 
				
			||||||
                  class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500"
 | 
					 | 
				
			||||||
                >
 | 
					 | 
				
			||||||
                  {$_("cancel")}
 | 
					 | 
				
			||||||
                </button>
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
            {/if}
 | 
					 | 
				
			||||||
          </div>
 | 
					 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
      </div>
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
{/if}
 | 
					{/if}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -180,6 +180,7 @@
 | 
				
			|||||||
	import store from "../../store";
 | 
						import store from "../../store";
 | 
				
			||||||
	import AddRunnerModal from "./AddRunnerModal.svelte";
 | 
						import AddRunnerModal from "./AddRunnerModal.svelte";
 | 
				
			||||||
	import ImportRunnerModal from "./ImportRunnerModal.svelte";
 | 
						import ImportRunnerModal from "./ImportRunnerModal.svelte";
 | 
				
			||||||
 | 
						import toast from "svelte-french-toast";
 | 
				
			||||||
	$: current_runners = [];
 | 
						$: current_runners = [];
 | 
				
			||||||
	export let modal_open = false;
 | 
						export let modal_open = false;
 | 
				
			||||||
	export let import_modal_open = false;
 | 
						export let import_modal_open = false;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -96,7 +96,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -112,18 +112,18 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:text-left">
 | 
					            <div class="mt-3">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("create-a-new-scan-fixed-only")}
 | 
					                {$_("create-a-new-scan-fixed-only")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_(
 | 
					                  {$_(
 | 
				
			||||||
                    "please-provide-the-nessecary-information-to-create-a-new-scan"
 | 
					                    "please-provide-the-nessecary-information-to-create-a-new-scan"
 | 
				
			||||||
                  )}
 | 
					                  )}
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              <div class="grid grid-cols-6 gap-6 text-left">
 | 
					              <div class="grid grid-cols-6 gap-2 lg:gap-6 text-left">
 | 
				
			||||||
                <div class="col-span-6">
 | 
					                <div class="col-span-6">
 | 
				
			||||||
                  <label
 | 
					                  <label
 | 
				
			||||||
                    for="donor"
 | 
					                    for="donor"
 | 
				
			||||||
@@ -180,7 +180,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            disabled={!createbtnenabled}
 | 
					            disabled={!createbtnenabled}
 | 
				
			||||||
            class:opacity-50={!createbtnenabled}
 | 
					            class:opacity-50={!createbtnenabled}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -61,7 +61,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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
 | 
				
			||||||
                xmlns="http://www.w3.org/2000/svg"
 | 
					                xmlns="http://www.w3.org/2000/svg"
 | 
				
			||||||
@@ -76,17 +76,17 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:text-left max-h-[75vh] overflow-y-auto">
 | 
					            <div class="mt-3 sm:text-left max-h-[75vh] overflow-y-auto">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("please-confirm-the-deletion-of-scan")}
 | 
					                {$_("please-confirm-the-deletion-of-scan")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                #{delete_scan.id}
 | 
					                #{delete_scan.id}
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            on:click={submit}
 | 
					            on:click={submit}
 | 
				
			||||||
            type="button"
 | 
					            type="button"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -100,7 +100,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -115,18 +115,18 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:mt-0 sm:text-left">
 | 
					            <div class="mt-3 sm:mt-0">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("create-a-new-scanstation")}
 | 
					                {$_("create-a-new-scanstation")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_(
 | 
					                  {$_(
 | 
				
			||||||
                    "please-provide-the-required-information-to-create-a-new-scanstation"
 | 
					                    "please-provide-the-required-information-to-create-a-new-scanstation"
 | 
				
			||||||
                  )}
 | 
					                  )}
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              <div class="grid grid-cols-6 gap-6 text-left">
 | 
					              <div class="grid grid-cols-6 gap-2 lg:gap-6 text-left">
 | 
				
			||||||
                <div class="col-span-6">
 | 
					                <div class="col-span-6">
 | 
				
			||||||
                  <label
 | 
					                  <label
 | 
				
			||||||
                    for="track"
 | 
					                    for="track"
 | 
				
			||||||
@@ -188,7 +188,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            disabled={!createbtnenabled}
 | 
					            disabled={!createbtnenabled}
 | 
				
			||||||
            class:opacity-50={!createbtnenabled}
 | 
					            class:opacity-50={!createbtnenabled}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,7 +50,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -62,11 +62,11 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:text-left max-h-[75vh] overflow-y-auto">
 | 
					            <div class="mt-3 sm:text-left max-h-[75vh] overflow-y-auto">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("attention")}
 | 
					                {$_("attention")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_(
 | 
					                  {$_(
 | 
				
			||||||
                    "do-you-want-to-delete-this-donor-with-all-related-donations"
 | 
					                    "do-you-want-to-delete-this-donor-with-all-related-donations"
 | 
				
			||||||
@@ -78,7 +78,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            on:click={deleteStation}
 | 
					            on:click={deleteStation}
 | 
				
			||||||
            type="button"
 | 
					            type="button"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -83,7 +83,7 @@
 | 
				
			|||||||
				<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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -96,11 +96,11 @@
 | 
				
			|||||||
								/></svg
 | 
													/></svg
 | 
				
			||||||
							>
 | 
												>
 | 
				
			||||||
						</div>
 | 
											</div>
 | 
				
			||||||
						<div class="mt-3 text-center sm:text-left max-h-[75vh] overflow-y-auto">
 | 
											<div class="mt-3 sm:text-left max-h-[75vh] overflow-y-auto">
 | 
				
			||||||
							<h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
												<h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
								{$_("token")}
 | 
													{$_("token")}
 | 
				
			||||||
							</h3>
 | 
												</h3>
 | 
				
			||||||
							<div class="mt-2 mb-6">
 | 
												<div class="mb-6">
 | 
				
			||||||
								<p class="text-sm text-gray-500">
 | 
													<p class="text-sm text-gray-500">
 | 
				
			||||||
									{$_(
 | 
														{$_(
 | 
				
			||||||
										"the-scanstations-api-token-will-only-get-displayed-once-you-wont-be-able-to-change-or-view-it-again"
 | 
															"the-scanstations-api-token-will-only-get-displayed-once-you-wont-be-able-to-change-or-view-it-again"
 | 
				
			||||||
@@ -109,7 +109,7 @@
 | 
				
			|||||||
									{$_("please-copy-the-token-and-store-it-somewhere-save")}
 | 
														{$_("please-copy-the-token-and-store-it-somewhere-save")}
 | 
				
			||||||
								</p>
 | 
													</p>
 | 
				
			||||||
							</div>
 | 
												</div>
 | 
				
			||||||
							<div class="mt-2 mb-6">
 | 
												<div class="mb-6">
 | 
				
			||||||
								<label
 | 
													<label
 | 
				
			||||||
									for="token"
 | 
														for="token"
 | 
				
			||||||
									class="block text-sm font-medium text-gray-700"
 | 
														class="block text-sm font-medium text-gray-700"
 | 
				
			||||||
@@ -170,7 +170,7 @@
 | 
				
			|||||||
						<img
 | 
											<img
 | 
				
			||||||
							class:w-[50%]={is_qrcode}
 | 
												class:w-[50%]={is_qrcode}
 | 
				
			||||||
							class:w-full={!is_qrcode}
 | 
												class:w-full={!is_qrcode}
 | 
				
			||||||
							class="md:w-auto mb-2 mx-auto"
 | 
												class="w-full lg:max-w-[50vw] lg:max-h-[10rem] object-contain mb-2 mx-auto"
 | 
				
			||||||
							alt="Registrierungscode"
 | 
												alt="Registrierungscode"
 | 
				
			||||||
							src={textToBase64Barcode(window.config.baseurl, is_qrcode)}
 | 
												src={textToBase64Barcode(window.config.baseurl, is_qrcode)}
 | 
				
			||||||
						/>
 | 
											/>
 | 
				
			||||||
@@ -178,13 +178,13 @@
 | 
				
			|||||||
						<img
 | 
											<img
 | 
				
			||||||
							class:w-[50%]={is_qrcode}
 | 
												class:w-[50%]={is_qrcode}
 | 
				
			||||||
							class:w-full={!is_qrcode}
 | 
												class:w-full={!is_qrcode}
 | 
				
			||||||
							class="md:w-auto mb-2 mx-auto"
 | 
												class="w-full lg:max-w-[50vw] lg:max-h-[10rem] object-contain mb-2 mx-auto"
 | 
				
			||||||
							alt="Registrierungscode"
 | 
												alt="Registrierungscode"
 | 
				
			||||||
							src={barcode}
 | 
												src={barcode}
 | 
				
			||||||
						/>
 | 
											/>
 | 
				
			||||||
					</div>
 | 
										</div>
 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
				<div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
									<div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
					<button
 | 
										<button
 | 
				
			||||||
						on:click={close}
 | 
											on:click={close}
 | 
				
			||||||
						type="button"
 | 
											type="button"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,7 +51,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -63,11 +63,11 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:text-left max-h-[75vh] overflow-y-auto">
 | 
					            <div class="mt-3 sm:text-left max-h-[75vh] overflow-y-auto">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("attention")}
 | 
					                {$_("attention")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_("do-you-really-want-to-delete-your-profile")}
 | 
					                  {$_("do-you-really-want-to-delete-your-profile")}
 | 
				
			||||||
                  <br />
 | 
					                  <br />
 | 
				
			||||||
@@ -81,7 +81,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            on:click={deleteMe}
 | 
					            on:click={deleteMe}
 | 
				
			||||||
            type="button"
 | 
					            type="button"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -66,7 +66,7 @@
 | 
				
			|||||||
  <div class="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8">
 | 
					  <div class="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8">
 | 
				
			||||||
    <span class="text-3xl font-bold">{$_("settings")}</span>
 | 
					    <span class="text-3xl font-bold">{$_("settings")}</span>
 | 
				
			||||||
    <div>
 | 
					    <div>
 | 
				
			||||||
      <div class="md:grid md:grid-cols-3 md:gap-6">
 | 
					      <div class="md:grid md:grid-cols-3 md:gap-2 lg:gap-6">
 | 
				
			||||||
        <div class="md:col-span-1">
 | 
					        <div class="md:col-span-1">
 | 
				
			||||||
          <div class="sm:px-0">
 | 
					          <div class="sm:px-0">
 | 
				
			||||||
            <h3 class="text-lg font-medium leading-6 text-gray-900">
 | 
					            <h3 class="text-lg font-medium leading-6 text-gray-900">
 | 
				
			||||||
@@ -174,7 +174,7 @@
 | 
				
			|||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
  <div class="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8">
 | 
					  <div class="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8">
 | 
				
			||||||
    <div>
 | 
					    <div>
 | 
				
			||||||
      <div class="md:grid md:grid-cols-3 md:gap-6">
 | 
					      <div class="md:grid md:grid-cols-3 md:gap-2 lg:gap-6">
 | 
				
			||||||
        <div class="md:col-span-1">
 | 
					        <div class="md:col-span-1">
 | 
				
			||||||
          <div class="sm:px-0">
 | 
					          <div class="sm:px-0">
 | 
				
			||||||
            <h3 class="text-lg font-medium leading-6 text-gray-900">
 | 
					            <h3 class="text-lg font-medium leading-6 text-gray-900">
 | 
				
			||||||
@@ -245,7 +245,7 @@
 | 
				
			|||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
  <div class="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8">
 | 
					  <div class="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8">
 | 
				
			||||||
    <div>
 | 
					    <div>
 | 
				
			||||||
      <div class="md:grid md:grid-cols-3 md:gap-6">
 | 
					      <div class="md:grid md:grid-cols-3 md:gap-2 lg:gap-6">
 | 
				
			||||||
        <div class="md:col-span-1">
 | 
					        <div class="md:col-span-1">
 | 
				
			||||||
          <div class="sm:px-0">
 | 
					          <div class="sm:px-0">
 | 
				
			||||||
            <h3 class="text-lg font-medium leading-6 text-gray-900">
 | 
					            <h3 class="text-lg font-medium leading-6 text-gray-900">
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -86,7 +86,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -101,18 +101,18 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:text-left max-h-[75vh] overflow-y-auto">
 | 
					            <div class="mt-3 sm:text-left max-h-[75vh] overflow-y-auto">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("create-a-new-statsclient")}
 | 
					                {$_("create-a-new-statsclient")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_(
 | 
					                  {$_(
 | 
				
			||||||
                    "please-provide-the-required-information-to-create-a-new-statsclient"
 | 
					                    "please-provide-the-required-information-to-create-a-new-statsclient"
 | 
				
			||||||
                  )}
 | 
					                  )}
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              <div class="grid grid-cols-6 gap-6 text-left">
 | 
					              <div class="grid grid-cols-6 gap-2 lg:gap-6 text-left">
 | 
				
			||||||
                <div class="col-span-6">
 | 
					                <div class="col-span-6">
 | 
				
			||||||
                  <label
 | 
					                  <label
 | 
				
			||||||
                    for="description"
 | 
					                    for="description"
 | 
				
			||||||
@@ -133,7 +133,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            disabled={!createbtnenabled}
 | 
					            disabled={!createbtnenabled}
 | 
				
			||||||
            class:opacity-50={!createbtnenabled}
 | 
					            class:opacity-50={!createbtnenabled}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -49,7 +49,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -61,11 +61,11 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <!-- <div class="mt-3 text-center sm:text-left max-h-[75vh] overflow-y-auto">
 | 
					            <!-- <div class="mt-3 sm:text-left max-h-[75vh] overflow-y-auto">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_('attention')}
 | 
					                {$_('attention')}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_(
 | 
					                  {$_(
 | 
				
			||||||
                    'do-you-want-to-delete-this-donor-with-all-related-donations'
 | 
					                    'do-you-want-to-delete-this-donor-with-all-related-donations'
 | 
				
			||||||
@@ -77,7 +77,7 @@
 | 
				
			|||||||
            </div> -->
 | 
					            </div> -->
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            on:click={deleteClient}
 | 
					            on:click={deleteClient}
 | 
				
			||||||
            type="button"
 | 
					            type="button"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,7 +60,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -73,11 +73,11 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:text-left max-h-[75vh] overflow-y-auto">
 | 
					            <div class="mt-3 sm:text-left max-h-[75vh] overflow-y-auto">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("token")}
 | 
					                {$_("token")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_(
 | 
					                  {$_(
 | 
				
			||||||
                    "the-statsclient-api-token-will-only-get-displayed-once-you-wont-be-able-to-change-or-view-it-again"
 | 
					                    "the-statsclient-api-token-will-only-get-displayed-once-you-wont-be-able-to-change-or-view-it-again"
 | 
				
			||||||
@@ -86,7 +86,7 @@
 | 
				
			|||||||
                  {$_("please-copy-the-token-and-store-it-somewhere-save")}
 | 
					                  {$_("please-copy-the-token-and-store-it-somewhere-save")}
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <label
 | 
					                <label
 | 
				
			||||||
                  for="token"
 | 
					                  for="token"
 | 
				
			||||||
                  class="block text-sm font-medium text-gray-700"
 | 
					                  class="block text-sm font-medium text-gray-700"
 | 
				
			||||||
@@ -123,7 +123,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            on:click={close}
 | 
					            on:click={close}
 | 
				
			||||||
            type="button"
 | 
					            type="button"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -97,7 +97,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -112,18 +112,18 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:text-left">
 | 
					            <div class="mt-3">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("create-a-new-team")}
 | 
					                {$_("create-a-new-team")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_(
 | 
					                  {$_(
 | 
				
			||||||
                    "please-provide-the-required-information-to-add-a-new-team"
 | 
					                    "please-provide-the-required-information-to-add-a-new-team"
 | 
				
			||||||
                  )}
 | 
					                  )}
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              <div class="grid grid-cols-6 gap-6 text-left">
 | 
					              <div class="grid grid-cols-6 gap-2 lg:gap-6 text-left">
 | 
				
			||||||
                <div class="col-span-6">
 | 
					                <div class="col-span-6">
 | 
				
			||||||
                  <label
 | 
					                  <label
 | 
				
			||||||
                    for="firstname"
 | 
					                    for="firstname"
 | 
				
			||||||
@@ -184,7 +184,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            disabled={!createbtnenabled}
 | 
					            disabled={!createbtnenabled}
 | 
				
			||||||
            class:opacity-50={!createbtnenabled}
 | 
					            class:opacity-50={!createbtnenabled}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,7 +52,7 @@
 | 
				
			|||||||
				<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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -67,13 +67,13 @@
 | 
				
			|||||||
								/></svg
 | 
													/></svg
 | 
				
			||||||
							>
 | 
												>
 | 
				
			||||||
						</div>
 | 
											</div>
 | 
				
			||||||
						<div class="mt-3 text-center sm:text-left max-h-[75vh] overflow-y-auto">
 | 
											<div class="mt-3 sm:text-left max-h-[75vh] overflow-y-auto">
 | 
				
			||||||
							<h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
												<h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
								{$_("do-you-want-to-delete-the-team-delete_team-name", {
 | 
													{$_("do-you-want-to-delete-the-team-delete_team-name", {
 | 
				
			||||||
									values: { teamname: delete_team.name },
 | 
														values: { teamname: delete_team.name },
 | 
				
			||||||
								})}
 | 
													})}
 | 
				
			||||||
							</h3>
 | 
												</h3>
 | 
				
			||||||
							<div class="mt-2 mb-6">
 | 
												<div class="mb-6">
 | 
				
			||||||
								<p class="text-sm text-gray-500">
 | 
													<p class="text-sm text-gray-500">
 | 
				
			||||||
									{$_("all-associated-runners-will-be-deleted-too")}
 | 
														{$_("all-associated-runners-will-be-deleted-too")}
 | 
				
			||||||
								</p>
 | 
													</p>
 | 
				
			||||||
@@ -81,7 +81,7 @@
 | 
				
			|||||||
						</div>
 | 
											</div>
 | 
				
			||||||
					</div>
 | 
										</div>
 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
				<div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
									<div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
					<button
 | 
										<button
 | 
				
			||||||
						on:click={deleteTeam}
 | 
											on:click={deleteTeam}
 | 
				
			||||||
						type="button"
 | 
											type="button"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -95,7 +95,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -110,18 +110,18 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:text-left max-h-[75vh] overflow-y-auto">
 | 
					            <div class="mt-3 sm:text-left max-h-[75vh] overflow-y-auto">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("create-a-new-track")}
 | 
					                {$_("create-a-new-track")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_(
 | 
					                  {$_(
 | 
				
			||||||
                    "please-provide-the-required-information-to-add-a-new-track"
 | 
					                    "please-provide-the-required-information-to-add-a-new-track"
 | 
				
			||||||
                  )}
 | 
					                  )}
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              <div class="grid grid-cols-6 gap-6 text-left">
 | 
					              <div class="grid grid-cols-6 gap-2 lg:gap-6 text-left">
 | 
				
			||||||
                <div class="col-span-6">
 | 
					                <div class="col-span-6">
 | 
				
			||||||
                  <label
 | 
					                  <label
 | 
				
			||||||
                    for="trackname"
 | 
					                    for="trackname"
 | 
				
			||||||
@@ -215,7 +215,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            disabled={!createbtnenabled}
 | 
					            disabled={!createbtnenabled}
 | 
				
			||||||
            class:opacity-50={!createbtnenabled}
 | 
					            class:opacity-50={!createbtnenabled}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -112,7 +112,7 @@
 | 
				
			|||||||
        <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="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-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="h-6 w-6 text-blue-600"
 | 
				
			||||||
@@ -127,18 +127,18 @@
 | 
				
			|||||||
                /></svg
 | 
					                /></svg
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="mt-3 text-center sm:text-left">
 | 
					            <div class="mt-3">
 | 
				
			||||||
              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
					              <h3 class="text-lg leading-6 font-medium text-gray-900">
 | 
				
			||||||
                {$_("create-a-new-user")}
 | 
					                {$_("create-a-new-user")}
 | 
				
			||||||
              </h3>
 | 
					              </h3>
 | 
				
			||||||
              <div class="mt-2 mb-6">
 | 
					              <div class="mb-6">
 | 
				
			||||||
                <p class="text-sm text-gray-500">
 | 
					                <p class="text-sm text-gray-500">
 | 
				
			||||||
                  {$_(
 | 
					                  {$_(
 | 
				
			||||||
                    "please-provide-the-required-information-to-add-a-new-user"
 | 
					                    "please-provide-the-required-information-to-add-a-new-user"
 | 
				
			||||||
                  )}
 | 
					                  )}
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              <div class="grid grid-cols-6 gap-6 text-left">
 | 
					              <div class="grid grid-cols-6 gap-2 lg:gap-6 text-left">
 | 
				
			||||||
                <div class="col-span-6">
 | 
					                <div class="col-span-6">
 | 
				
			||||||
                  <label
 | 
					                  <label
 | 
				
			||||||
                    for="firstname"
 | 
					                    for="firstname"
 | 
				
			||||||
@@ -272,7 +272,7 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="bg-gray-50 px-4 py-3 sm:px-6 grid gap-2 lg:rounded-b-xl">
 | 
					        <div class="bg-gray-50 px-4 lg:py-3 sm:px-6 grid gap-2 lg:rounded-b-xl pt-3 pb-10">
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            disabled={!createbtnenabled}
 | 
					            disabled={!createbtnenabled}
 | 
				
			||||||
            class:opacity-50={!createbtnenabled}
 | 
					            class:opacity-50={!createbtnenabled}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -204,6 +204,7 @@
 | 
				
			|||||||
    "donors-are-being-loaded": "Sponsoren werden geladen",
 | 
					    "donors-are-being-loaded": "Sponsoren werden geladen",
 | 
				
			||||||
    "dont-have-your-email-connected": "Deine E-Mail ist nicht verknüpft?",
 | 
					    "dont-have-your-email-connected": "Deine E-Mail ist nicht verknüpft?",
 | 
				
			||||||
    "dont-panic-were-resetting-it": "Keine Panik, wir setzen es zurück ✌",
 | 
					    "dont-panic-were-resetting-it": "Keine Panik, wir setzen es zurück ✌",
 | 
				
			||||||
 | 
					    "download_laeuft": "Download läuft...",
 | 
				
			||||||
    "e-mail-adress": "E-Mail-Adresse",
 | 
					    "e-mail-adress": "E-Mail-Adresse",
 | 
				
			||||||
    "edit": "Bearbeiten",
 | 
					    "edit": "Bearbeiten",
 | 
				
			||||||
    "edit-a-card": "Läuferkarte bearbeiten",
 | 
					    "edit-a-card": "Läuferkarte bearbeiten",
 | 
				
			||||||
@@ -381,6 +382,7 @@
 | 
				
			|||||||
    "runners": "Läufer",
 | 
					    "runners": "Läufer",
 | 
				
			||||||
    "runners-are-being-imported": "Läufer werden importiert ...",
 | 
					    "runners-are-being-imported": "Läufer werden importiert ...",
 | 
				
			||||||
    "runners-are-being-loaded": "Läufer werden geladen ...",
 | 
					    "runners-are-being-loaded": "Läufer werden geladen ...",
 | 
				
			||||||
 | 
					    "runners_via_kiosk": "Läufer via Kiosk",
 | 
				
			||||||
    "save": "Speichern",
 | 
					    "save": "Speichern",
 | 
				
			||||||
    "save-changes": "Änderungen speichern",
 | 
					    "save-changes": "Änderungen speichern",
 | 
				
			||||||
    "scan-added": "Scan hinzugefügt",
 | 
					    "scan-added": "Scan hinzugefügt",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -204,6 +204,7 @@
 | 
				
			|||||||
    "donors-are-being-loaded": "donors are being loaded",
 | 
					    "donors-are-being-loaded": "donors are being loaded",
 | 
				
			||||||
    "dont-have-your-email-connected": "Don't have your email connected?",
 | 
					    "dont-have-your-email-connected": "Don't have your email connected?",
 | 
				
			||||||
    "dont-panic-were-resetting-it": "Don't panic, we're resetting it ✌",
 | 
					    "dont-panic-were-resetting-it": "Don't panic, we're resetting it ✌",
 | 
				
			||||||
 | 
					    "download_laeuft": "Download in progress...",
 | 
				
			||||||
    "e-mail-adress": "E-Mail Adress",
 | 
					    "e-mail-adress": "E-Mail Adress",
 | 
				
			||||||
    "edit": "Edit",
 | 
					    "edit": "Edit",
 | 
				
			||||||
    "edit-a-card": "Edit a card",
 | 
					    "edit-a-card": "Edit a card",
 | 
				
			||||||
@@ -381,6 +382,7 @@
 | 
				
			|||||||
    "runners": "Runners",
 | 
					    "runners": "Runners",
 | 
				
			||||||
    "runners-are-being-imported": "Runners are being imported...",
 | 
					    "runners-are-being-imported": "Runners are being imported...",
 | 
				
			||||||
    "runners-are-being-loaded": "runners are being loaded...",
 | 
					    "runners-are-being-loaded": "runners are being loaded...",
 | 
				
			||||||
 | 
					    "runners_via_kiosk": "Runners via Kiosk",
 | 
				
			||||||
    "save": "Save",
 | 
					    "save": "Save",
 | 
				
			||||||
    "save-changes": "Save Changes",
 | 
					    "save-changes": "Save Changes",
 | 
				
			||||||
    "scan-added": "Scan added",
 | 
					    "scan-added": "Scan added",
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user