Compare commits
	
		
			44 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						9abf74d6d2
	
				 | 
					
					
						|||
| 
						
						
							
						
						50e81a6cb5
	
				 | 
					
					
						|||
| 
						
						
							
						
						8fae1fb6b3
	
				 | 
					
					
						|||
| 
						
						
							
						
						372fa110ec
	
				 | 
					
					
						|||
| 
						
						
							
						
						35bec9fe58
	
				 | 
					
					
						|||
| 
						
						
							
						
						93d67bdba9
	
				 | 
					
					
						|||
| 
						
						
							
						
						a5e72a18e3
	
				 | 
					
					
						|||
| 
						
						
							
						
						91d2f46b93
	
				 | 
					
					
						|||
| 
						
						
							
						
						c60bae4533
	
				 | 
					
					
						|||
| 
						
						
							
						
						43ac878d44
	
				 | 
					
					
						|||
| 
						
						
							
						
						ceabd06a43
	
				 | 
					
					
						|||
| 
						
						
							
						
						9bfc0c5338
	
				 | 
					
					
						|||
| 
						
						
							
						
						fb8206ff13
	
				 | 
					
					
						|||
| 
						
						
							
						
						dceb0ef461
	
				 | 
					
					
						|||
| 
						
						
							
						
						88bc1982ca
	
				 | 
					
					
						|||
| 
						
						
							
						
						e741a9d7e7
	
				 | 
					
					
						|||
| 
						
						
							
						
						65f1d22205
	
				 | 
					
					
						|||
| 
						
						
							
						
						d867c08aba
	
				 | 
					
					
						|||
| 6193eff38e | |||
| 
						
						
							
						
						f1929e7cf9
	
				 | 
					
					
						|||
| 
						
						
							
						
						373484c242
	
				 | 
					
					
						|||
| 
						
						
							
						
						f77460bb0c
	
				 | 
					
					
						|||
| 
						
						
							
						
						574e0dcb05
	
				 | 
					
					
						|||
| 
						
						
							
						
						7b19a0aa08
	
				 | 
					
					
						|||
| 08642d7618 | |||
| 
						
						
							
						
						c3e9c27cd3
	
				 | 
					
					
						|||
| 
						
						
							
						
						29a2854671
	
				 | 
					
					
						|||
| 
						
						
							
						
						8e6786e722
	
				 | 
					
					
						|||
| 
						
						
							
						
						6ad40564e3
	
				 | 
					
					
						|||
| 
						
						
							
						
						776973bfe9
	
				 | 
					
					
						|||
| 
						
						
							
						
						6025e43baa
	
				 | 
					
					
						|||
| 
						
						
							
						
						d9a47f882c
	
				 | 
					
					
						|||
| 
						
						
							
						
						4235758a6d
	
				 | 
					
					
						|||
| 
						
						
							
						
						59fe2dfabb
	
				 | 
					
					
						|||
| 
						
						
							
						
						6364536dcd
	
				 | 
					
					
						|||
| 
						
						
							
						
						a8a771114d
	
				 | 
					
					
						|||
| 
						
						
							
						
						4e0a2c8301
	
				 | 
					
					
						|||
| 
						
						
							
						
						b6fed92a17
	
				 | 
					
					
						|||
| 
						
						
							
						
						97b57aeb0c
	
				 | 
					
					
						|||
| 
						
						
							
						
						e25ed1fff9
	
				 | 
					
					
						|||
| 
						
						
							
						
						a2ff5b8a14
	
				 | 
					
					
						|||
| 
						
						
							
						
						0284f18beb
	
				 | 
					
					
						|||
| 
						
						
							
						
						803d64c78c
	
				 | 
					
					
						|||
| 
						
						
							
						
						dacb2f8ace
	
				 | 
					
					
						
							
								
								
									
										101
									
								
								.drone.yml
									
									
									
									
									
								
							
							
						
						
									
										101
									
								
								.drone.yml
									
									
									
									
									
								
							@@ -1,101 +0,0 @@
 | 
				
			|||||||
---
 | 
					 | 
				
			||||||
kind: secret
 | 
					 | 
				
			||||||
name: docker_username
 | 
					 | 
				
			||||||
get:
 | 
					 | 
				
			||||||
  path: odit-registry-builder
 | 
					 | 
				
			||||||
  name: username
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
kind: secret
 | 
					 | 
				
			||||||
name: docker_password
 | 
					 | 
				
			||||||
get:
 | 
					 | 
				
			||||||
  path: odit-registry-builder
 | 
					 | 
				
			||||||
  name: password
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
kind: secret
 | 
					 | 
				
			||||||
name: git_ssh
 | 
					 | 
				
			||||||
get:
 | 
					 | 
				
			||||||
  path: odit-git-bot
 | 
					 | 
				
			||||||
  name: sshkey
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
kind: secret
 | 
					 | 
				
			||||||
name: npm_url
 | 
					 | 
				
			||||||
get:
 | 
					 | 
				
			||||||
  path: odit-npm-cache
 | 
					 | 
				
			||||||
  name: url
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
kind: pipeline
 | 
					 | 
				
			||||||
type: kubernetes
 | 
					 | 
				
			||||||
name: build:dev
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
steps:
 | 
					 | 
				
			||||||
  - name: run full license export
 | 
					 | 
				
			||||||
    depends_on: ["clone"]
 | 
					 | 
				
			||||||
    image: registry.odit.services/hub/library/node:19.7.0-alpine3.16
 | 
					 | 
				
			||||||
    commands:
 | 
					 | 
				
			||||||
      - npm config set registry $NPM_REGISTRY_URL && npm i -g pnpm@8
 | 
					 | 
				
			||||||
      - pnpm i
 | 
					 | 
				
			||||||
      - pnpm licenses:export
 | 
					 | 
				
			||||||
    environment:
 | 
					 | 
				
			||||||
      NPM_REGISTRY_URL:
 | 
					 | 
				
			||||||
        from_secret: npm_url
 | 
					 | 
				
			||||||
  - name: push new licenses file to repo
 | 
					 | 
				
			||||||
    depends_on: ["run full license export"]
 | 
					 | 
				
			||||||
    image: appleboy/drone-git-push
 | 
					 | 
				
			||||||
    settings:
 | 
					 | 
				
			||||||
      branch: dev
 | 
					 | 
				
			||||||
      commit: true
 | 
					 | 
				
			||||||
      commit_message: new license file version [CI SKIP]
 | 
					 | 
				
			||||||
      author_email: bot@odit.services
 | 
					 | 
				
			||||||
      remote: git@git.odit.services:lfk/frontend.git
 | 
					 | 
				
			||||||
      ssh_key:
 | 
					 | 
				
			||||||
        from_secret: git_ssh
 | 
					 | 
				
			||||||
  - name: build dev
 | 
					 | 
				
			||||||
    depends_on: ["clone"]
 | 
					 | 
				
			||||||
    image: registry.odit.services/library/drone-kaniko
 | 
					 | 
				
			||||||
    settings:
 | 
					 | 
				
			||||||
      username:
 | 
					 | 
				
			||||||
        from_secret: docker_username
 | 
					 | 
				
			||||||
      password:
 | 
					 | 
				
			||||||
        from_secret: docker_password
 | 
					 | 
				
			||||||
      build_args:
 | 
					 | 
				
			||||||
        - NPM_REGISTRY_URL:
 | 
					 | 
				
			||||||
          from_secret: npm_url
 | 
					 | 
				
			||||||
      repo: lfk/frontend
 | 
					 | 
				
			||||||
      tags:
 | 
					 | 
				
			||||||
        - dev
 | 
					 | 
				
			||||||
      cache: true
 | 
					 | 
				
			||||||
      registry: registry.odit.services
 | 
					 | 
				
			||||||
trigger:
 | 
					 | 
				
			||||||
  branch:
 | 
					 | 
				
			||||||
    - dev
 | 
					 | 
				
			||||||
  event:
 | 
					 | 
				
			||||||
    - push
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
---
 | 
					 | 
				
			||||||
kind: pipeline
 | 
					 | 
				
			||||||
type: kubernetes
 | 
					 | 
				
			||||||
name: build:tags
 | 
					 | 
				
			||||||
steps:
 | 
					 | 
				
			||||||
  - name: build $DRONE_TAG
 | 
					 | 
				
			||||||
    depends_on: ["clone"]
 | 
					 | 
				
			||||||
    image: registry.odit.services/library/drone-kaniko
 | 
					 | 
				
			||||||
    settings:
 | 
					 | 
				
			||||||
      username:
 | 
					 | 
				
			||||||
        from_secret: docker_username
 | 
					 | 
				
			||||||
      password:
 | 
					 | 
				
			||||||
        from_secret: docker_password
 | 
					 | 
				
			||||||
      build_args:
 | 
					 | 
				
			||||||
        - NPM_REGISTRY_URL:
 | 
					 | 
				
			||||||
          from_secret: npm_url
 | 
					 | 
				
			||||||
      repo: lfk/frontend
 | 
					 | 
				
			||||||
      tags:
 | 
					 | 
				
			||||||
        - "${DRONE_TAG}"
 | 
					 | 
				
			||||||
      cache: true
 | 
					 | 
				
			||||||
      registry: registry.odit.services
 | 
					 | 
				
			||||||
trigger:
 | 
					 | 
				
			||||||
  event:
 | 
					 | 
				
			||||||
    - tag
 | 
					 | 
				
			||||||
							
								
								
									
										42
									
								
								.woodpecker/build.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								.woodpecker/build.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
				
			|||||||
 | 
					steps:
 | 
				
			||||||
 | 
					  - name: run full license export
 | 
				
			||||||
 | 
					    image: registry.odit.services/hub/library/node:19.7.0-alpine3.16
 | 
				
			||||||
 | 
					    commands:
 | 
				
			||||||
 | 
					      - npm config set registry $NPM_REGISTRY_URL && npm i -g pnpm@8
 | 
				
			||||||
 | 
					      - pnpm i
 | 
				
			||||||
 | 
					      - pnpm licenses:export
 | 
				
			||||||
 | 
					    secrets:
 | 
				
			||||||
 | 
					      - source: odit-npm-cache-url
 | 
				
			||||||
 | 
					        target: NPM_REGISTRY_URL
 | 
				
			||||||
 | 
					  - name: push new licenses file to repo
 | 
				
			||||||
 | 
					    image: appleboy/drone-git-push
 | 
				
			||||||
 | 
					    settings:
 | 
				
			||||||
 | 
					      branch: dev
 | 
				
			||||||
 | 
					      commit: true
 | 
				
			||||||
 | 
					      commit_message: new license file version [CI SKIP]
 | 
				
			||||||
 | 
					      author_email: bot@odit.services
 | 
				
			||||||
 | 
					      remote: git@git.odit.services:lfk/frontend.git
 | 
				
			||||||
 | 
					      ssh_key:
 | 
				
			||||||
 | 
					        from_secret: odit-git-bot-sshkey
 | 
				
			||||||
 | 
					  - name: build edge
 | 
				
			||||||
 | 
					    image: woodpeckerci/plugin-docker-buildx
 | 
				
			||||||
 | 
					    settings:
 | 
				
			||||||
 | 
					      repo: registry.odit.services/odit/website
 | 
				
			||||||
 | 
					      tags:
 | 
				
			||||||
 | 
					        - edge
 | 
				
			||||||
 | 
					      registry: registry.odit.services
 | 
				
			||||||
 | 
					      platforms: linux/amd64,linux/arm64
 | 
				
			||||||
 | 
					      cache_from: registry.odit.services/odit/website:edge
 | 
				
			||||||
 | 
					      username:
 | 
				
			||||||
 | 
					        from_secret: odit-registry-builder-username
 | 
				
			||||||
 | 
					      password:
 | 
				
			||||||
 | 
					        from_secret: odit-registry-builder-password
 | 
				
			||||||
 | 
					    secrets:
 | 
				
			||||||
 | 
					      - source: odit-npm-cache-url
 | 
				
			||||||
 | 
					        target: NPM_REGISTRY_URL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					when:
 | 
				
			||||||
 | 
					  event:
 | 
				
			||||||
 | 
					    - push
 | 
				
			||||||
 | 
					  branch:
 | 
				
			||||||
 | 
					    - dev
 | 
				
			||||||
							
								
								
									
										20
									
								
								.woodpecker/release.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								.woodpecker/release.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					steps:
 | 
				
			||||||
 | 
					  - name: build tag
 | 
				
			||||||
 | 
					    image: woodpeckerci/plugin-docker-buildx
 | 
				
			||||||
 | 
					    settings:
 | 
				
			||||||
 | 
					      repo: registry.odit.services/lfk/frontend
 | 
				
			||||||
 | 
					      tags:
 | 
				
			||||||
 | 
					        - "${CI_COMMIT_TAG}"
 | 
				
			||||||
 | 
					      registry: registry.odit.services
 | 
				
			||||||
 | 
					      platforms: linux/amd64,linux/arm64
 | 
				
			||||||
 | 
					      cache_from: registry.odit.services/lfk/frontend:latest
 | 
				
			||||||
 | 
					      username:
 | 
				
			||||||
 | 
					        from_secret: odit-registry-builder-username
 | 
				
			||||||
 | 
					      password:
 | 
				
			||||||
 | 
					        from_secret: odit-registry-builder-password
 | 
				
			||||||
 | 
					    secrets:
 | 
				
			||||||
 | 
					      - source: odit-npm-cache-url
 | 
				
			||||||
 | 
					        target: NPM_REGISTRY_URL
 | 
				
			||||||
 | 
					when:
 | 
				
			||||||
 | 
					  event:
 | 
				
			||||||
 | 
					    - tag
 | 
				
			||||||
							
								
								
									
										97
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										97
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -2,8 +2,105 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
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.5.1](https://git.odit.services/lfk/frontend/compare/1.5.0...1.5.1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- chore(deps): pnpm@9 [`35bec9f`](https://git.odit.services/lfk/frontend/commit/35bec9fe584b93cd52e8bab4e469713468a67f70)
 | 
				
			||||||
 | 
					- chore(deps): bump some [`8fae1fb`](https://git.odit.services/lfk/frontend/commit/8fae1fb6b3e033f789d2568cbd2640c0d163dc53)
 | 
				
			||||||
 | 
					- fix(scanstations): CopyScanStationTokenModal open after create [`372fa11`](https://git.odit.services/lfk/frontend/commit/372fa110ec402dae166a302f2209c79353983148)
 | 
				
			||||||
 | 
					- fix(config): add explicit window.config [`91d2f46`](https://git.odit.services/lfk/frontend/commit/91d2f46b934bcba1429bd1d96e772c25c42a3e28)
 | 
				
			||||||
 | 
					- fix(dockerfile): AS casing [`50e81a6`](https://git.odit.services/lfk/frontend/commit/50e81a6cb5773381e153cbec3bed7db820ced84a)
 | 
				
			||||||
 | 
					- refactor(scanstations/CopyScanStationTokenModal): drop dispatch [`a5e72a1`](https://git.odit.services/lfk/frontend/commit/a5e72a18e368b5a7ee7b4e1894de613ecb767f28)
 | 
				
			||||||
 | 
					- chore(deps): node:23.2.0 [`93d67bd`](https://git.odit.services/lfk/frontend/commit/93d67bdba90a67b45d8895d9facaf66e908d53d6)
 | 
				
			||||||
 | 
					- fix(tracks/AddTrackModal): i18n [`c60bae4`](https://git.odit.services/lfk/frontend/commit/c60bae45334c2aa90d8931da07691c196469da46)
 | 
				
			||||||
 | 
					- fix: tailwind config [`43ac878`](https://git.odit.services/lfk/frontend/commit/43ac878d44b556c6d7811610f6fe0c9a5eff305f)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### [1.5.0](https://git.odit.services/lfk/frontend/compare/1.4.13...1.5.0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 20 November 2024
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- feat(ci)!: Switch to woodpecker [`fb8206f`](https://git.odit.services/lfk/frontend/commit/fb8206ff130f4f65dcf619a2a786e7d5895b77a1)
 | 
				
			||||||
 | 
					- 🚀RELEASE v1.5.0 [`ceabd06`](https://git.odit.services/lfk/frontend/commit/ceabd06a4319c3c9ffab680f909730d5bd789540)
 | 
				
			||||||
 | 
					- fix(components): Add missing toast imports [`9bfc0c5`](https://git.odit.services/lfk/frontend/commit/9bfc0c5338933e832d5df50457c7978c026d8df6)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### [1.4.13](https://git.odit.services/lfk/frontend/compare/1.4.12...1.4.13)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 31 July 2023
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- 🚀RELEASE v1.4.13 [`dceb0ef`](https://git.odit.services/lfk/frontend/commit/dceb0ef46197dc56e29c5f52a5bd8f9fe9b70b27)
 | 
				
			||||||
 | 
					- Show donations as euro in export [`88bc198`](https://git.odit.services/lfk/frontend/commit/88bc1982cab4481e2e9245f81eff27e095b66a0f)
 | 
				
			||||||
 | 
					- new license file version [CI SKIP] [`6193eff`](https://git.odit.services/lfk/frontend/commit/6193eff38e1a9d5726bc7d572ab36b921de843d0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### [1.4.12](https://git.odit.services/lfk/frontend/compare/1.4.11...1.4.12)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 18 May 2023
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- 🚀RELEASE v1.4.12 [`65f1d22`](https://git.odit.services/lfk/frontend/commit/65f1d222050b0dec81fc847c1921b6135a55ce50)
 | 
				
			||||||
 | 
					- fix(donation/payment): Funny javascript number to float conversion where integers were needed [`d867c08`](https://git.odit.services/lfk/frontend/commit/d867c08aba234d3a7fe9e2311d37dc5e96fc2afc)
 | 
				
			||||||
 | 
					- new license file version [CI SKIP] [`08642d7`](https://git.odit.services/lfk/frontend/commit/08642d7618faeae31f0acfe776642c9fa156e5ff)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### [1.4.11](https://git.odit.services/lfk/frontend/compare/1.4.10...1.4.11)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 10 May 2023
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- chore(deps): Lockfile [`f77460b`](https://git.odit.services/lfk/frontend/commit/f77460bb0c8ce6d0f3d83a077017d5fc7bf55af7)
 | 
				
			||||||
 | 
					- 🚀RELEASE v1.4.11 [`373484c`](https://git.odit.services/lfk/frontend/commit/373484c2424bea7ae0d70d342e0ae2076aab1b6a)
 | 
				
			||||||
 | 
					- feat(orgs): Show total distance [`574e0dc`](https://git.odit.services/lfk/frontend/commit/574e0dcb051305bde2fc76d8456a35baec0cf309)
 | 
				
			||||||
 | 
					- chore(deps): More bumps [`7b19a0a`](https://git.odit.services/lfk/frontend/commit/7b19a0aa08bb6c89c51d27c0d05777e8fcfdad17)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### [1.4.10](https://git.odit.services/lfk/frontend/compare/1.4.9...1.4.10)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 10 May 2023
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- chore(deps): Bumped svelte-table [`29a2854`](https://git.odit.services/lfk/frontend/commit/29a2854671b3af5b85ea96d050a9076f47b6575d)
 | 
				
			||||||
 | 
					- 🚀RELEASE v1.4.10 [`c3e9c27`](https://git.odit.services/lfk/frontend/commit/c3e9c27cd3d4b916f1661d4958cabab038918587)
 | 
				
			||||||
 | 
					- chore(deps): Pin and bump [`8e6786e`](https://git.odit.services/lfk/frontend/commit/8e6786e72227b3f07cc805f0957d5b7fd123ec13)
 | 
				
			||||||
 | 
					- chore(deps): Bumped scanclientjs [`6ad4056`](https://git.odit.services/lfk/frontend/commit/6ad40564e3e342046f6ee19fab9e455ec3bbff9b)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### [1.4.9](https://git.odit.services/lfk/frontend/compare/1.4.8...1.4.9)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 9 May 2023
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- 🚀RELEASE v1.4.9 [`776973b`](https://git.odit.services/lfk/frontend/commit/776973bfe9b34c26a1c80d5e458cc2644dd9036b)
 | 
				
			||||||
 | 
					- Changed the in table replacement method [`d9a47f8`](https://git.odit.services/lfk/frontend/commit/d9a47f882c1c6bcf98ef85d50d70c010d54b326e)
 | 
				
			||||||
 | 
					- Fixed empty return [`6025e43`](https://git.odit.services/lfk/frontend/commit/6025e43baa8516657a60a1de9a82c2189221c6ac)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### [1.4.8](https://git.odit.services/lfk/frontend/compare/1.4.7...1.4.8)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 9 May 2023
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Switched donor loading to non-paginated [`59fe2df`](https://git.odit.services/lfk/frontend/commit/59fe2dfabb224863876c4db31a965c34a51a9369)
 | 
				
			||||||
 | 
					- 🚀RELEASE v1.4.8 [`4235758`](https://git.odit.services/lfk/frontend/commit/4235758a6d1499715287d6ab193cc87c68d5742e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### [1.4.7](https://git.odit.services/lfk/frontend/compare/1.4.6...1.4.7)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 4 May 2023
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Paginated modal data loading [`a8a7711`](https://git.odit.services/lfk/frontend/commit/a8a771114df6eb57d5b1d5497a5be49e619d4102)
 | 
				
			||||||
 | 
					- Moved loading to onmount [`4e0a2c8`](https://git.odit.services/lfk/frontend/commit/4e0a2c83015bde5e360c5fb2c0babbeaa03dc2b5)
 | 
				
			||||||
 | 
					- 🚀RELEASE v1.4.7 [`6364536`](https://git.odit.services/lfk/frontend/commit/6364536dcd840c71f7cb6afb31bbc4f160ac4f73)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### [1.4.6](https://git.odit.services/lfk/frontend/compare/1.4.5...1.4.6)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 4 May 2023
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- 🚀RELEASE v1.4.6 [`b6fed92`](https://git.odit.services/lfk/frontend/commit/b6fed92a176af1c975484d9146ee5634e0031401)
 | 
				
			||||||
 | 
					- fix(donor/details): don't load donations [`a2ff5b8`](https://git.odit.services/lfk/frontend/commit/a2ff5b8a142ce4e6b8876f64935f9787ec44a51e)
 | 
				
			||||||
 | 
					- fix(donor/detail): Set email to null to avoid vaidation errors [`97b57ae`](https://git.odit.services/lfk/frontend/commit/97b57aeb0cc9058542a36dea9c8b2852169c250f)
 | 
				
			||||||
 | 
					- fix(donor/detail): Set phone to null to avoid vaidation errors [`e25ed1f`](https://git.odit.services/lfk/frontend/commit/e25ed1fff9b200605d5d2b78238b774ec7289aaa)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### [1.4.5](https://git.odit.services/lfk/frontend/compare/1.4.4...1.4.5)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 4 May 2023
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Revert "revert: buggy pagination" [`dacb2f8`](https://git.odit.services/lfk/frontend/commit/dacb2f8ace373f6594fc64af133971af053f00c0)
 | 
				
			||||||
 | 
					- fix: Removed dynamic pagesize adjustments [`803d64c`](https://git.odit.services/lfk/frontend/commit/803d64c78caa570d31d6055e70e2d2af6834f04b)
 | 
				
			||||||
 | 
					- 🚀RELEASE v1.4.5 [`0284f18`](https://git.odit.services/lfk/frontend/commit/0284f18beb8b24d4d4d071eca13bc5868666232c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### [1.4.4](https://git.odit.services/lfk/frontend/compare/1.4.3...1.4.4)
 | 
					#### [1.4.4](https://git.odit.services/lfk/frontend/compare/1.4.3...1.4.4)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 4 May 2023
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- 🚀RELEASE v1.4.4 [`b7a5396`](https://git.odit.services/lfk/frontend/commit/b7a53960e5f37ae089d77bc11668d917145e2abb)
 | 
				
			||||||
- fix(AddDonationModal): missing toast dismiss on success distance donation [`66f1e6b`](https://git.odit.services/lfk/frontend/commit/66f1e6b4fe1350ee79673a0aff97e36f44179c92)
 | 
					- fix(AddDonationModal): missing toast dismiss on success distance donation [`66f1e6b`](https://git.odit.services/lfk/frontend/commit/66f1e6b4fe1350ee79673a0aff97e36f44179c92)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### [1.4.3](https://git.odit.services/lfk/frontend/compare/1.4.2...1.4.3)
 | 
					#### [1.4.3](https://git.odit.services/lfk/frontend/compare/1.4.2...1.4.3)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,9 @@
 | 
				
			|||||||
FROM registry.odit.services/hub/library/node:20.0.0-alpine3.17 as build
 | 
					FROM registry.odit.services/hub/library/node:23.2.0-alpine3.20 AS build
 | 
				
			||||||
ARG NPM_REGISTRY_URL=https://registry.npmjs.org
 | 
					ARG NPM_REGISTRY_URL=https://registry.npmjs.org
 | 
				
			||||||
WORKDIR /app
 | 
					WORKDIR /app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COPY package.json pnpm-lock.yaml vite.config.js tailwind.config.js postcss.config.cjs index.html ./
 | 
					COPY package.json pnpm-lock.yaml vite.config.js tailwind.config.cjs postcss.config.cjs index.html ./
 | 
				
			||||||
RUN npm config set registry $NPM_REGISTRY_URL && npm i -g pnpm@8
 | 
					RUN npm config set registry $NPM_REGISTRY_URL && npm i -g pnpm@9
 | 
				
			||||||
RUN mkdir /pnpm && pnpm config set store-dir /pnpm && pnpm i
 | 
					RUN mkdir /pnpm && pnpm config set store-dir /pnpm && pnpm i
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COPY src ./src
 | 
					COPY src ./src
 | 
				
			||||||
@@ -11,6 +11,6 @@ COPY public ./public
 | 
				
			|||||||
RUN pnpm build
 | 
					RUN pnpm build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# final image
 | 
					# final image
 | 
				
			||||||
FROM registry.odit.services/library/nginx-brotli:3.15 as final
 | 
					FROM registry.odit.services/library/nginx-brotli:3.15 AS final
 | 
				
			||||||
COPY --from=build /app/dist /usr/share/nginx/html
 | 
					COPY --from=build /app/dist /usr/share/nginx/html
 | 
				
			||||||
COPY ./nginx.conf /etc/nginx/nginx.conf
 | 
					COPY ./nginx.conf /etc/nginx/nginx.conf
 | 
				
			||||||
@@ -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.4.4-RELEASE_INFO</span
 | 
					      >RELEASE_INFO-1.5.1-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>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										28
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								package.json
									
									
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "@odit/lfk-frontend",
 | 
					  "name": "@odit/lfk-frontend",
 | 
				
			||||||
  "version": "1.4.4",
 | 
					  "version": "1.5.1",
 | 
				
			||||||
  "type": "module",
 | 
					  "type": "module",
 | 
				
			||||||
  "scripts": {
 | 
					  "scripts": {
 | 
				
			||||||
    "i18n-order": "node order.js",
 | 
					    "i18n-order": "node order.js",
 | 
				
			||||||
@@ -12,16 +12,16 @@
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
  "license": "CC-BY-NC-SA-4.0",
 | 
					  "license": "CC-BY-NC-SA-4.0",
 | 
				
			||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
    "@odit/license-exporter": "0.0.12",
 | 
					    "@odit/license-exporter": "0.2.0",
 | 
				
			||||||
    "@sveltejs/vite-plugin-svelte": "2.1.1",
 | 
					    "@sveltejs/vite-plugin-svelte": "2.1.1",
 | 
				
			||||||
    "auto-changelog": "2.4.0",
 | 
					    "auto-changelog": "2.5.0",
 | 
				
			||||||
    "autoprefixer": "10.4.14",
 | 
					    "autoprefixer": "10.4.20",
 | 
				
			||||||
    "postcss": "8.4.23",
 | 
					    "postcss": "8.4.49",
 | 
				
			||||||
    "prettier": "^2.8.8",
 | 
					    "prettier": "3.3.3",
 | 
				
			||||||
    "prettier-plugin-svelte": "^2.10.0",
 | 
					    "prettier-plugin-svelte": "3.2.8",
 | 
				
			||||||
    "release-it": "15.10.1",
 | 
					    "release-it": "17.10.0",
 | 
				
			||||||
    "svelte-select": "3.17.0",
 | 
					    "svelte-select": "3.17.0",
 | 
				
			||||||
    "tailwindcss": "3.3.2",
 | 
					    "tailwindcss": "3.4.15",
 | 
				
			||||||
    "vite": "4.3.3"
 | 
					    "vite": "4.3.3"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "release-it": {
 | 
					  "release-it": {
 | 
				
			||||||
@@ -42,11 +42,11 @@
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "@odit/lfk-client-js": "1.1.1",
 | 
					    "@odit/lfk-client-js": "1.1.3",
 | 
				
			||||||
    "@paralleldrive/cuid2": "^2.2.0",
 | 
					    "@paralleldrive/cuid2": "2.2.2",
 | 
				
			||||||
    "@tanstack/svelte-table": "^8.8.6",
 | 
					    "@tanstack/svelte-table": "8.9.1",
 | 
				
			||||||
    "bwip-js": "^3.4.0",
 | 
					    "bwip-js": "3.4.0",
 | 
				
			||||||
    "check-password-strength": "2.0.7",
 | 
					    "check-password-strength": "2.0.10",
 | 
				
			||||||
    "csvtojson": "2.0.10",
 | 
					    "csvtojson": "2.0.10",
 | 
				
			||||||
    "localforage": "1.10.0",
 | 
					    "localforage": "1.10.0",
 | 
				
			||||||
    "marked": "4.3.0",
 | 
					    "marked": "4.3.0",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5467
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										5467
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -8,3 +8,4 @@ const config = {
 | 
				
			|||||||
	default_password: "demo",
 | 
						default_password: "demo",
 | 
				
			||||||
	prefersHashRouting: true,
 | 
						prefersHashRouting: true,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					window.config = config;
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -153,7 +153,7 @@
 | 
				
			|||||||
  onMount(async () => {
 | 
					  onMount(async () => {
 | 
				
			||||||
    toast.loading($_("loading-cards"));
 | 
					    toast.loading($_("loading-cards"));
 | 
				
			||||||
    let page = 0;
 | 
					    let page = 0;
 | 
				
			||||||
    let pagesize = 100;
 | 
					    let pagesize = 500;
 | 
				
			||||||
    while (page >= 0) {
 | 
					    while (page >= 0) {
 | 
				
			||||||
      const cards = await RunnerCardService.runnerCardControllerGetAll(
 | 
					      const cards = await RunnerCardService.runnerCardControllerGetAll(
 | 
				
			||||||
        page,
 | 
					        page,
 | 
				
			||||||
@@ -171,7 +171,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      dataLoaded = true;
 | 
					      dataLoaded = true;
 | 
				
			||||||
      page++;
 | 
					      page++;
 | 
				
			||||||
      pagesize += 100;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    toast.dismiss();
 | 
					    toast.dismiss();
 | 
				
			||||||
    toast.success($_("all-cards-loaded"));
 | 
					    toast.success($_("all-cards-loaded"));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
    RunnerService,
 | 
					    RunnerService,
 | 
				
			||||||
  } from "@odit/lfk-client-js";
 | 
					  } from "@odit/lfk-client-js";
 | 
				
			||||||
  import Select from "svelte-select";
 | 
					  import Select from "svelte-select";
 | 
				
			||||||
  import { createEventDispatcher } from "svelte";
 | 
					  import { createEventDispatcher, onMount } from "svelte";
 | 
				
			||||||
  import toast from "svelte-french-toast";
 | 
					  import toast from "svelte-french-toast";
 | 
				
			||||||
  export let modal_open;
 | 
					  export let modal_open;
 | 
				
			||||||
  const dispatch = createEventDispatcher();
 | 
					  const dispatch = createEventDispatcher();
 | 
				
			||||||
@@ -23,16 +23,6 @@
 | 
				
			|||||||
  $: runners = [];
 | 
					  $: runners = [];
 | 
				
			||||||
  $: is_fixed = false;
 | 
					  $: is_fixed = false;
 | 
				
			||||||
  $: is_paid = false;
 | 
					  $: is_paid = false;
 | 
				
			||||||
  DonorService.donorControllerGetAll().then((val) => {
 | 
					 | 
				
			||||||
    donors = val.map((r) => {
 | 
					 | 
				
			||||||
      return { label: getDonorLabel(r), value: r };
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
  RunnerService.runnerControllerGetAll().then((val) => {
 | 
					 | 
				
			||||||
    runners = val.map((r) => {
 | 
					 | 
				
			||||||
      return { label: getDonorLabel(r), value: r };
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
  $: amount_input = 0;
 | 
					  $: amount_input = 0;
 | 
				
			||||||
  $: processed_last_submit = true;
 | 
					  $: processed_last_submit = true;
 | 
				
			||||||
  $: is_amount_valid = amount_input > 0;
 | 
					  $: is_amount_valid = amount_input > 0;
 | 
				
			||||||
@@ -108,6 +98,22 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  onMount(async () => {
 | 
				
			||||||
 | 
					    toast.loading($_("loading-donors"));
 | 
				
			||||||
 | 
					    donors = (await DonorService.donorControllerGetAll()).map(
 | 
				
			||||||
 | 
					      (r) => {
 | 
				
			||||||
 | 
					        return { label: getDonorLabel(r), value: r };
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					    runners = (await RunnerService.runnerControllerGetAll()).map(
 | 
				
			||||||
 | 
					      (r) => {
 | 
				
			||||||
 | 
					        return { label: getDonorLabel(r), value: r };
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					    toast.dismiss();
 | 
				
			||||||
 | 
					    toast.success($_("all-donors-loaded"));
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{#if modal_open}
 | 
					{#if modal_open}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,7 +33,7 @@
 | 
				
			|||||||
      toast.loading($_("updating-donation"));
 | 
					      toast.loading($_("updating-donation"));
 | 
				
			||||||
      const editable = Object.assign({}, original_data);
 | 
					      const editable = Object.assign({}, original_data);
 | 
				
			||||||
      editable.donor = editable.donor.id;
 | 
					      editable.donor = editable.donor.id;
 | 
				
			||||||
      editable.paidAmount = paid_amount_input * 100;
 | 
					      editable.paidAmount = Math.round(paid_amount_input * 100);
 | 
				
			||||||
      if (editable.responseType == "DISTANCEDONATION" || editable.runner) {
 | 
					      if (editable.responseType == "DISTANCEDONATION" || editable.runner) {
 | 
				
			||||||
        editable.runner = editable.runner.id;
 | 
					        editable.runner = editable.runner.id;
 | 
				
			||||||
        DonationService.donationControllerPutDistance(
 | 
					        DonationService.donationControllerPutDistance(
 | 
				
			||||||
@@ -46,7 +46,7 @@
 | 
				
			|||||||
            toast.dismiss();
 | 
					            toast.dismiss();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            toast.success($_("donation-updated"));
 | 
					            toast.success($_("donation-updated"));
 | 
				
			||||||
            dispatch("created", { donation: response });
 | 
					            dispatch("created", { donation: result });
 | 
				
			||||||
          })
 | 
					          })
 | 
				
			||||||
          .catch((err) => {
 | 
					          .catch((err) => {
 | 
				
			||||||
            //
 | 
					            //
 | 
				
			||||||
@@ -61,7 +61,7 @@
 | 
				
			|||||||
            //
 | 
					            //
 | 
				
			||||||
            toast.dismiss();
 | 
					            toast.dismiss();
 | 
				
			||||||
            toast.success($_("donation-updated"));
 | 
					            toast.success($_("donation-updated"));
 | 
				
			||||||
            dispatch("created", { donation: response });
 | 
					            dispatch("created", { donation: result });
 | 
				
			||||||
          })
 | 
					          })
 | 
				
			||||||
          .catch((err) => {
 | 
					          .catch((err) => {
 | 
				
			||||||
            //
 | 
					            //
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,7 @@
 | 
				
			|||||||
    DonorService,
 | 
					    DonorService,
 | 
				
			||||||
    RunnerService,
 | 
					    RunnerService,
 | 
				
			||||||
  } from "@odit/lfk-client-js";
 | 
					  } from "@odit/lfk-client-js";
 | 
				
			||||||
 | 
					  import toast from 'svelte-french-toast'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  import PromiseError from "../base/PromiseError.svelte";
 | 
					  import PromiseError from "../base/PromiseError.svelte";
 | 
				
			||||||
  import Select from "svelte-select";
 | 
					  import Select from "svelte-select";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -167,13 +167,26 @@
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  onMount(async () => {
 | 
					  onMount(async () => {
 | 
				
			||||||
    const donations = await DonationService.donationControllerGetAll();
 | 
					    let page = 0;
 | 
				
			||||||
    current_donations = donations;
 | 
					    let pagesize = 300;
 | 
				
			||||||
 | 
					    while (page >= 0) {
 | 
				
			||||||
 | 
					      const donations = await DonationService.donationControllerGetAll(
 | 
				
			||||||
 | 
					        page,
 | 
				
			||||||
 | 
					        pagesize
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					      if (donations.length == 0) {
 | 
				
			||||||
 | 
					        page = -2;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      current_donations = current_donations.concat(...donations);
 | 
				
			||||||
      options.update((options) => ({
 | 
					      options.update((options) => ({
 | 
				
			||||||
        ...options,
 | 
					        ...options,
 | 
				
			||||||
        data: current_donations,
 | 
					        data: current_donations,
 | 
				
			||||||
      }));
 | 
					      }));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      dataLoaded = true;
 | 
					      dataLoaded = true;
 | 
				
			||||||
 | 
					      page++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -182,9 +195,12 @@
 | 
				
			|||||||
  payment_modal_open={active_edits.length > 0}
 | 
					  payment_modal_open={active_edits.length > 0}
 | 
				
			||||||
  paid_amount_input={(active_edits[0]?.paidAmount || 0) / 100}
 | 
					  paid_amount_input={(active_edits[0]?.paidAmount || 0) / 100}
 | 
				
			||||||
  on:created={(event) => {
 | 
					  on:created={(event) => {
 | 
				
			||||||
    current_donations[
 | 
					    current_donations = current_donations.map((d)=>{
 | 
				
			||||||
      current_donations.findIndex((d) => d.id === event.detail.donation.id)
 | 
					      if(d.id === event.detail.donation.id){
 | 
				
			||||||
    ].paidAmount = event.detail.donation.paidAmount;
 | 
					        d.paidAmount = event.detail.donation.paidAmount;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return d;
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
    options.update((options) => ({
 | 
					    options.update((options) => ({
 | 
				
			||||||
      ...options,
 | 
					      ...options,
 | 
				
			||||||
      data: current_donations,
 | 
					      data: current_donations,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,6 @@
 | 
				
			|||||||
  $: delete_triggered = false;
 | 
					  $: delete_triggered = false;
 | 
				
			||||||
  $: original_data = {};
 | 
					  $: original_data = {};
 | 
				
			||||||
  $: editable = {};
 | 
					  $: editable = {};
 | 
				
			||||||
  $: current_donations = [];
 | 
					 | 
				
			||||||
  $: changes_performed = !(
 | 
					  $: changes_performed = !(
 | 
				
			||||||
    JSON.stringify(original_data) === JSON.stringify(editable)
 | 
					    JSON.stringify(original_data) === JSON.stringify(editable)
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -29,11 +28,6 @@
 | 
				
			|||||||
    isPhoneValidOrEmpty &&
 | 
					    isPhoneValidOrEmpty &&
 | 
				
			||||||
    ((isAddress1Valid && iszipcodevalid && iscityvalid) ||
 | 
					    ((isAddress1Valid && iszipcodevalid && iscityvalid) ||
 | 
				
			||||||
      editable.address_checked === false);
 | 
					      editable.address_checked === false);
 | 
				
			||||||
  const donation_promise = DonationService.donationControllerGetAll().then(
 | 
					 | 
				
			||||||
    (val) => {
 | 
					 | 
				
			||||||
      current_donations = val;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
  const promise = DonorService.donorControllerGetOne(params.donorid).then(
 | 
					  const promise = DonorService.donorControllerGetOne(params.donorid).then(
 | 
				
			||||||
    (data) => {
 | 
					    (data) => {
 | 
				
			||||||
      data_loaded = true;
 | 
					      data_loaded = true;
 | 
				
			||||||
@@ -69,7 +63,9 @@
 | 
				
			|||||||
        editable.address = null;
 | 
					        editable.address = null;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      if (editable.email) editable.email = editable.email;
 | 
					      if (editable.email) editable.email = editable.email;
 | 
				
			||||||
 | 
					      else editable.email = null;
 | 
				
			||||||
      if (editable.phone) editable.phone = editable.phone;
 | 
					      if (editable.phone) editable.phone = editable.phone;
 | 
				
			||||||
 | 
					      else editable.phone = null;
 | 
				
			||||||
      if (editable.middlename) editable.middlename = editable.middlename;
 | 
					      if (editable.middlename) editable.middlename = editable.middlename;
 | 
				
			||||||
      editable.receiptNeeded = editable.address_checked;
 | 
					      editable.receiptNeeded = editable.address_checked;
 | 
				
			||||||
      DonorService.donorControllerPut(original_data.id, editable)
 | 
					      DonorService.donorControllerPut(original_data.id, editable)
 | 
				
			||||||
@@ -96,7 +92,7 @@
 | 
				
			|||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<ConfirmDonorDeletion bind:modal_open bind:delete_donor />
 | 
					<ConfirmDonorDeletion bind:modal_open bind:delete_donor />
 | 
				
			||||||
{#await promise && donation_promise}
 | 
					{#await promise}
 | 
				
			||||||
  {$_("loading-donor-details")}
 | 
					  {$_("loading-donor-details")}
 | 
				
			||||||
{:then}
 | 
					{:then}
 | 
				
			||||||
  <section class="container p-5 select-none">
 | 
					  <section class="container p-5 select-none">
 | 
				
			||||||
@@ -206,8 +202,8 @@
 | 
				
			|||||||
      >
 | 
					      >
 | 
				
			||||||
      <br />
 | 
					      <br />
 | 
				
			||||||
      <span class="font-medium text-gray-700">{$_("donations")}:</span>
 | 
					      <span class="font-medium text-gray-700">{$_("donations")}:</span>
 | 
				
			||||||
      {#if current_donations.filter((d) => d.donor.id == editable.id).length > 0}
 | 
					      {#if original_data.donations.length > 0}
 | 
				
			||||||
        {#each current_donations.filter((o) => o.donor.id == editable.id) as d}
 | 
					        {#each original_data.donations as d}
 | 
				
			||||||
          {#if d.responseType === "DISTANCEDONATION"}
 | 
					          {#if d.responseType === "DISTANCEDONATION"}
 | 
				
			||||||
            <a
 | 
					            <a
 | 
				
			||||||
              href="../donations/{d.id}"
 | 
					              href="../donations/{d.id}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,7 +35,7 @@
 | 
				
			|||||||
                d.firstname,
 | 
					                d.firstname,
 | 
				
			||||||
                d.middlename,
 | 
					                d.middlename,
 | 
				
			||||||
                d.lastname,
 | 
					                d.lastname,
 | 
				
			||||||
                d.paidDonationAmount,
 | 
					                (d.paidDonationAmount/100).toFixed(2),
 | 
				
			||||||
                address,
 | 
					                address,
 | 
				
			||||||
              ];
 | 
					              ];
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -146,13 +146,23 @@
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  onMount(async () => {
 | 
					  onMount(async () => {
 | 
				
			||||||
    const donors = await DonorService.donorControllerGetAll();
 | 
					    let page = 0;
 | 
				
			||||||
    current_donors = donors;
 | 
					    let pagesize = 300;
 | 
				
			||||||
 | 
					    while (page >= 0) {
 | 
				
			||||||
 | 
					      const donors = await DonorService.donorControllerGetAll(page, pagesize);
 | 
				
			||||||
 | 
					      if (donors.length == 0) {
 | 
				
			||||||
 | 
					        page = -2;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      current_donors = current_donors.concat(...donors);
 | 
				
			||||||
      options.update((options) => ({
 | 
					      options.update((options) => ({
 | 
				
			||||||
        ...options,
 | 
					        ...options,
 | 
				
			||||||
      data: donors,
 | 
					        data: current_donors,
 | 
				
			||||||
      }));
 | 
					      }));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      dataLoaded = true;
 | 
					      dataLoaded = true;
 | 
				
			||||||
 | 
					      page++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,7 @@
 | 
				
			|||||||
  import { _ } from "svelte-i18n";
 | 
					  import { _ } from "svelte-i18n";
 | 
				
			||||||
  import store from "../../store";
 | 
					  import store from "../../store";
 | 
				
			||||||
  import { UserGroupService } from "@odit/lfk-client-js";
 | 
					  import { UserGroupService } from "@odit/lfk-client-js";
 | 
				
			||||||
 | 
					  import toast from 'svelte-french-toast'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  import PromiseError from "../base/PromiseError.svelte";
 | 
					  import PromiseError from "../base/PromiseError.svelte";
 | 
				
			||||||
  let data_loaded = false;
 | 
					  let data_loaded = false;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@
 | 
				
			|||||||
    CreatePermission,
 | 
					    CreatePermission,
 | 
				
			||||||
    UserGroupService,
 | 
					    UserGroupService,
 | 
				
			||||||
  } from "@odit/lfk-client-js";
 | 
					  } from "@odit/lfk-client-js";
 | 
				
			||||||
 | 
					  import toast from 'svelte-french-toast'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  import PromiseError from "../base/PromiseError.svelte";
 | 
					  import PromiseError from "../base/PromiseError.svelte";
 | 
				
			||||||
  export let params;
 | 
					  export let params;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@
 | 
				
			|||||||
    RunnerOrganizationService,
 | 
					    RunnerOrganizationService,
 | 
				
			||||||
  } from "@odit/lfk-client-js";
 | 
					  } from "@odit/lfk-client-js";
 | 
				
			||||||
  import { getLocaleFromNavigator, _ } from "svelte-i18n";
 | 
					  import { getLocaleFromNavigator, _ } from "svelte-i18n";
 | 
				
			||||||
 | 
					  import toast from 'svelte-french-toast'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  import store from "../../store";
 | 
					  import store from "../../store";
 | 
				
			||||||
  import ConfirmOrgDeletion from "./ConfirmOrgDeletion.svelte";
 | 
					  import ConfirmOrgDeletion from "./ConfirmOrgDeletion.svelte";
 | 
				
			||||||
@@ -470,6 +471,11 @@
 | 
				
			|||||||
            {/if}
 | 
					            {/if}
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        {/if}
 | 
					        {/if}
 | 
				
			||||||
 | 
					        <div class="text-sm w-full">
 | 
				
			||||||
 | 
					          <span class="font-medium text-gray-700">{$_("distance")}</span>
 | 
				
			||||||
 | 
					          <br />
 | 
				
			||||||
 | 
					          <span class="text-gray-700">{(original_object.total_distance / 1000).toFixed(2)} km</span>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  </section>
 | 
					  </section>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@
 | 
				
			|||||||
    RunnerOrganizationService,
 | 
					    RunnerOrganizationService,
 | 
				
			||||||
    RunnerTeamService,
 | 
					    RunnerTeamService,
 | 
				
			||||||
  } from "@odit/lfk-client-js";
 | 
					  } from "@odit/lfk-client-js";
 | 
				
			||||||
 | 
					  import toast from 'svelte-french-toast'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  import { init } from "@paralleldrive/cuid2";
 | 
					  import { init } from "@paralleldrive/cuid2";
 | 
				
			||||||
  const createId = init({ length: 10, fingerprint: "lfk-frontend" });
 | 
					  const createId = init({ length: 10, fingerprint: "lfk-frontend" });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,7 @@
 | 
				
			|||||||
  import Select from "svelte-select";
 | 
					  import Select from "svelte-select";
 | 
				
			||||||
  import { createEventDispatcher } from "svelte";
 | 
					  import { createEventDispatcher } from "svelte";
 | 
				
			||||||
  const dispatch = createEventDispatcher();
 | 
					  const dispatch = createEventDispatcher();
 | 
				
			||||||
 | 
					  import toast from 'svelte-french-toast'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  export let modal_open;
 | 
					  export let modal_open;
 | 
				
			||||||
  $: selected_team = undefined;
 | 
					  $: selected_team = undefined;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -161,13 +161,22 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const runners = await RunnerService.runnerControllerGetAll();
 | 
					    let page = 0;
 | 
				
			||||||
    current_runners = runners;
 | 
					    while (page >= 0) {
 | 
				
			||||||
 | 
					      const runners = await RunnerService.runnerControllerGetAll(page, 500);
 | 
				
			||||||
 | 
					      if (runners.length == 0) {
 | 
				
			||||||
 | 
					        page = -2;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      current_runners = current_runners.concat(...runners);
 | 
				
			||||||
      options.update((options) => ({
 | 
					      options.update((options) => ({
 | 
				
			||||||
        ...options,
 | 
					        ...options,
 | 
				
			||||||
        data: current_runners,
 | 
					        data: current_runners,
 | 
				
			||||||
      }));
 | 
					      }));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      dataLoaded = true;
 | 
					      dataLoaded = true;
 | 
				
			||||||
 | 
					      page++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -178,13 +178,23 @@
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  onMount(async () => {
 | 
					  onMount(async () => {
 | 
				
			||||||
    const scans = await ScanService.scanControllerGetAll();
 | 
					    let page = 0;
 | 
				
			||||||
    current_scans = scans;
 | 
					    let pagesize = 500;
 | 
				
			||||||
 | 
					    while (page >= 0) {
 | 
				
			||||||
 | 
					      const scans = await ScanService.scanControllerGetAll(page, pagesize);
 | 
				
			||||||
 | 
					      if (scans.length == 0) {
 | 
				
			||||||
 | 
					        page = -2;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      current_scans = current_scans.concat(...scans);
 | 
				
			||||||
      options.update((options) => ({
 | 
					      options.update((options) => ({
 | 
				
			||||||
        ...options,
 | 
					        ...options,
 | 
				
			||||||
        data: current_scans,
 | 
					        data: current_scans,
 | 
				
			||||||
      }));
 | 
					      }));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      dataLoaded = true;
 | 
					      dataLoaded = true;
 | 
				
			||||||
 | 
					      page++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +1,11 @@
 | 
				
			|||||||
<script>
 | 
					<script>
 | 
				
			||||||
	import { _ } from "svelte-i18n";
 | 
						import { _ } from "svelte-i18n";
 | 
				
			||||||
 | 
						import { tick } from "svelte";
 | 
				
			||||||
  import { tick, createEventDispatcher } from "svelte";
 | 
					 | 
				
			||||||
	import bwipjs from "bwip-js";
 | 
						import bwipjs from "bwip-js";
 | 
				
			||||||
 | 
						import toast from "svelte-french-toast";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	export let copy_modal_open;
 | 
						export let copy_modal_open;
 | 
				
			||||||
	export let new_station;
 | 
						export let new_station;
 | 
				
			||||||
  const dispatch = createEventDispatcher();
 | 
					 | 
				
			||||||
	let valueCopy = null;
 | 
						let valueCopy = null;
 | 
				
			||||||
	let areaDom;
 | 
						let areaDom;
 | 
				
			||||||
	let copied = false;
 | 
						let copied = false;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +1,25 @@
 | 
				
			|||||||
<script>
 | 
					<script>
 | 
				
			||||||
	import { _ } from "svelte-i18n";
 | 
						import { _ } from "svelte-i18n";
 | 
				
			||||||
	import store from "../../store";
 | 
						import store from "../../store";
 | 
				
			||||||
 | 
						import { ScanStationService } from "@odit/lfk-client-js";
 | 
				
			||||||
	import AddScanStationModal from "./AddScanStationModal.svelte";
 | 
						import AddScanStationModal from "./AddScanStationModal.svelte";
 | 
				
			||||||
	import CopyScanStationTokenModal from "./CopyScanStationTokenModal.svelte";
 | 
						import CopyScanStationTokenModal from "./CopyScanStationTokenModal.svelte";
 | 
				
			||||||
  import ScanStationsOverview from "./ScanStationsOverview.svelte";
 | 
						import ScanStationsEmptyState from "./ScanStationsEmptyState.svelte";
 | 
				
			||||||
 | 
						import ConfirmScanStationDeletion from "./ConfirmScanStationDeletion.svelte";
 | 
				
			||||||
 | 
						import toast from "svelte-french-toast";
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
	export let modal_open = false;
 | 
						export let modal_open = false;
 | 
				
			||||||
	export let copy_modal_open = false;
 | 
						export let copy_modal_open = false;
 | 
				
			||||||
	export let new_station = {};
 | 
						export let new_station = {};
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						const promise = ScanStationService.scanStationControllerGetAll().then(
 | 
				
			||||||
 | 
							(result) => {
 | 
				
			||||||
 | 
								current_stations = result;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						);
 | 
				
			||||||
 | 
						$: searchvalue = "";
 | 
				
			||||||
 | 
						$: active_deletes = [];
 | 
				
			||||||
 | 
						let delete_station = {};
 | 
				
			||||||
	let current_stations = [];
 | 
						let current_stations = [];
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -25,12 +38,184 @@
 | 
				
			|||||||
			</button>
 | 
								</button>
 | 
				
			||||||
		{/if}
 | 
							{/if}
 | 
				
			||||||
	</span>
 | 
						</span>
 | 
				
			||||||
  <ScanStationsOverview
 | 
						<ConfirmScanStationDeletion
 | 
				
			||||||
    bind:current_stations
 | 
							on:cancelDelete={(event) => {
 | 
				
			||||||
 | 
								modal_open = false;
 | 
				
			||||||
 | 
								active_deletes[event.detail.id] = false;
 | 
				
			||||||
 | 
							}}
 | 
				
			||||||
		bind:modal_open
 | 
							bind:modal_open
 | 
				
			||||||
    bind:new_station
 | 
							bind:delete_station
 | 
				
			||||||
    bind:copy_modal_open
 | 
					 | 
				
			||||||
	/>
 | 
						/>
 | 
				
			||||||
 | 
						{#if store.state.jwtinfo.userdetails.permissions.includes("STATION:GET")}
 | 
				
			||||||
 | 
							{#await promise}
 | 
				
			||||||
 | 
								<div
 | 
				
			||||||
 | 
									class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2"
 | 
				
			||||||
 | 
									role="alert"
 | 
				
			||||||
 | 
								>
 | 
				
			||||||
 | 
									<p class="font-bold">{$_("scanstations-are-being-loaded")}</p>
 | 
				
			||||||
 | 
									<p class="text-sm">{$_("this-might-take-a-moment")}</p>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							{:then}
 | 
				
			||||||
 | 
								{#if current_stations.length === 0}
 | 
				
			||||||
 | 
									<ScanStationsEmptyState />
 | 
				
			||||||
 | 
								{:else}
 | 
				
			||||||
 | 
									<input
 | 
				
			||||||
 | 
										type="search"
 | 
				
			||||||
 | 
										bind:value={searchvalue}
 | 
				
			||||||
 | 
										placeholder={$_("datatable.search")}
 | 
				
			||||||
 | 
										aria-label={$_("datatable.search")}
 | 
				
			||||||
 | 
										class="mb-4"
 | 
				
			||||||
 | 
									/>
 | 
				
			||||||
 | 
									<div
 | 
				
			||||||
 | 
										class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll"
 | 
				
			||||||
 | 
									>
 | 
				
			||||||
 | 
										<table class="divide-y divide-gray-200 w-full">
 | 
				
			||||||
 | 
											<thead class="bg-gray-50">
 | 
				
			||||||
 | 
												<tr class="odd:bg-white even:bg-gray-100">
 | 
				
			||||||
 | 
													<th
 | 
				
			||||||
 | 
														scope="col"
 | 
				
			||||||
 | 
														class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
 | 
				
			||||||
 | 
													>
 | 
				
			||||||
 | 
														{$_("track")}
 | 
				
			||||||
 | 
													</th>
 | 
				
			||||||
 | 
													<th
 | 
				
			||||||
 | 
														scope="col"
 | 
				
			||||||
 | 
														class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
 | 
				
			||||||
 | 
													>
 | 
				
			||||||
 | 
														{$_("description")}
 | 
				
			||||||
 | 
													</th>
 | 
				
			||||||
 | 
													<th
 | 
				
			||||||
 | 
														scope="col"
 | 
				
			||||||
 | 
														class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
 | 
				
			||||||
 | 
													>
 | 
				
			||||||
 | 
														{$_("status")}
 | 
				
			||||||
 | 
													</th>
 | 
				
			||||||
 | 
													<th scope="col" class="relative px-6 py-3">
 | 
				
			||||||
 | 
														<span class="sr-only">{$_("action")}</span>
 | 
				
			||||||
 | 
													</th>
 | 
				
			||||||
 | 
												</tr>
 | 
				
			||||||
 | 
											</thead>
 | 
				
			||||||
 | 
											<tbody class="divide-y divide-gray-200">
 | 
				
			||||||
 | 
												{#each current_stations as s}
 | 
				
			||||||
 | 
													{#if Object.values(s)
 | 
				
			||||||
 | 
														.toString()
 | 
				
			||||||
 | 
														.toLowerCase()
 | 
				
			||||||
 | 
														.includes(searchvalue)}
 | 
				
			||||||
 | 
														<tr
 | 
				
			||||||
 | 
															class="odd:bg-white even:bg-gray-100"
 | 
				
			||||||
 | 
															data-rowid="station_{s.id}"
 | 
				
			||||||
 | 
														>
 | 
				
			||||||
 | 
															<td class="px-6 py-4 whitespace-nowrap">
 | 
				
			||||||
 | 
																<div class="flex items-center">
 | 
				
			||||||
 | 
																	<div class="ml-4">
 | 
				
			||||||
 | 
																		<div class="text-sm font-medium text-gray-900">
 | 
				
			||||||
 | 
																			<a
 | 
				
			||||||
 | 
																				href="../tracks"
 | 
				
			||||||
 | 
																				class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800"
 | 
				
			||||||
 | 
																			>
 | 
				
			||||||
 | 
																				{s.track.name || s.track.distance + "m"}</a
 | 
				
			||||||
 | 
																			>
 | 
				
			||||||
 | 
																		</div>
 | 
				
			||||||
 | 
																	</div>
 | 
				
			||||||
 | 
																</div>
 | 
				
			||||||
 | 
															</td>
 | 
				
			||||||
 | 
															<td class="px-6 py-4 whitespace-nowrap">
 | 
				
			||||||
 | 
																<div class="flex items-center">
 | 
				
			||||||
 | 
																	<div class="ml-4">
 | 
				
			||||||
 | 
																		<div class="text-sm font-medium text-gray-900">
 | 
				
			||||||
 | 
																			{s.description}
 | 
				
			||||||
 | 
																		</div>
 | 
				
			||||||
 | 
																	</div>
 | 
				
			||||||
 | 
																</div>
 | 
				
			||||||
 | 
															</td>
 | 
				
			||||||
 | 
															<td class="px-6 py-4 whitespace-nowrap">
 | 
				
			||||||
 | 
																<div class="flex items-center">
 | 
				
			||||||
 | 
																	{#if s.enabled}
 | 
				
			||||||
 | 
																		<span
 | 
				
			||||||
 | 
																			class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800"
 | 
				
			||||||
 | 
																			>{$_("active")}</span
 | 
				
			||||||
 | 
																		>
 | 
				
			||||||
 | 
																	{:else}
 | 
				
			||||||
 | 
																		<span
 | 
				
			||||||
 | 
																			class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800"
 | 
				
			||||||
 | 
																			>{$_("inactive")}</span
 | 
				
			||||||
 | 
																		>
 | 
				
			||||||
 | 
																	{/if}
 | 
				
			||||||
 | 
																</div>
 | 
				
			||||||
 | 
															</td>
 | 
				
			||||||
 | 
															{#if active_deletes[s.id] === true}
 | 
				
			||||||
 | 
																<td
 | 
				
			||||||
 | 
																	class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium"
 | 
				
			||||||
 | 
																>
 | 
				
			||||||
 | 
																	<button
 | 
				
			||||||
 | 
																		on:click={() => {
 | 
				
			||||||
 | 
																			active_deletes[s.id] = false;
 | 
				
			||||||
 | 
																		}}
 | 
				
			||||||
 | 
																		tabindex="0"
 | 
				
			||||||
 | 
																		class="ml-4 text-indigo-600 hover:text-indigo-900 cursor-pointer"
 | 
				
			||||||
 | 
																		>{$_("cancel-delete")}</button
 | 
				
			||||||
 | 
																	>
 | 
				
			||||||
 | 
																	<button
 | 
				
			||||||
 | 
																		on:click={() => {
 | 
				
			||||||
 | 
																			ScanStationService.scanStationControllerRemove(
 | 
				
			||||||
 | 
																				s.id,
 | 
				
			||||||
 | 
																				false
 | 
				
			||||||
 | 
																			)
 | 
				
			||||||
 | 
																				.then((resp) => {
 | 
				
			||||||
 | 
																					current_stations = current_stations.filter(
 | 
				
			||||||
 | 
																						(obj) => obj.id !== s.id
 | 
				
			||||||
 | 
																					);
 | 
				
			||||||
 | 
																					toast($_("station-deleted"));
 | 
				
			||||||
 | 
																				})
 | 
				
			||||||
 | 
																				.catch((err) => {
 | 
				
			||||||
 | 
																					modal_open = true;
 | 
				
			||||||
 | 
																					delete_station = s;
 | 
				
			||||||
 | 
																				});
 | 
				
			||||||
 | 
																		}}
 | 
				
			||||||
 | 
																		tabindex="0"
 | 
				
			||||||
 | 
																		class="ml-4 text-red-600 hover:text-red-900 cursor-pointer"
 | 
				
			||||||
 | 
																		>{$_("confirm-delete")}</button
 | 
				
			||||||
 | 
																	>
 | 
				
			||||||
 | 
																</td>
 | 
				
			||||||
 | 
															{:else}
 | 
				
			||||||
 | 
																<td
 | 
				
			||||||
 | 
																	class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium"
 | 
				
			||||||
 | 
																>
 | 
				
			||||||
 | 
																	<a
 | 
				
			||||||
 | 
																		href="/scanstations/{s.id}"
 | 
				
			||||||
 | 
																		class="text-indigo-600 hover:text-indigo-900"
 | 
				
			||||||
 | 
																		>{$_("details")}</a
 | 
				
			||||||
 | 
																	>
 | 
				
			||||||
 | 
																	{#if store.state.jwtinfo.userdetails.permissions.includes("STATION:DELETE")}
 | 
				
			||||||
 | 
																		<button
 | 
				
			||||||
 | 
																			on:click={() => {
 | 
				
			||||||
 | 
																				active_deletes[s.id] = true;
 | 
				
			||||||
 | 
																			}}
 | 
				
			||||||
 | 
																			tabindex="0"
 | 
				
			||||||
 | 
																			class="ml-4 text-red-600 hover:text-red-900 cursor-pointer"
 | 
				
			||||||
 | 
																			>{$_("delete")}</button
 | 
				
			||||||
 | 
																		>
 | 
				
			||||||
 | 
																	{/if}
 | 
				
			||||||
 | 
																</td>
 | 
				
			||||||
 | 
															{/if}
 | 
				
			||||||
 | 
														</tr>
 | 
				
			||||||
 | 
													{/if}
 | 
				
			||||||
 | 
												{/each}
 | 
				
			||||||
 | 
											</tbody>
 | 
				
			||||||
 | 
										</table>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								{/if}
 | 
				
			||||||
 | 
							{:catch error}
 | 
				
			||||||
 | 
								<div
 | 
				
			||||||
 | 
									class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500"
 | 
				
			||||||
 | 
								>
 | 
				
			||||||
 | 
									<span class="inline-block align-middle mr-8">
 | 
				
			||||||
 | 
										<b class="capitalize">{$_("general_promise_error")}</b>
 | 
				
			||||||
 | 
										{error}
 | 
				
			||||||
 | 
									</span>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							{/await}
 | 
				
			||||||
 | 
						{/if}
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("STATION:CREATE")}
 | 
					{#if store.state.jwtinfo.userdetails.permissions.includes("STATION:CREATE")}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,195 +0,0 @@
 | 
				
			|||||||
<script>
 | 
					 | 
				
			||||||
  import { _ } from "svelte-i18n";
 | 
					 | 
				
			||||||
  import { ScanStationService } from "@odit/lfk-client-js";
 | 
					 | 
				
			||||||
  const promise = ScanStationService.scanStationControllerGetAll().then(
 | 
					 | 
				
			||||||
    (result) => {
 | 
					 | 
				
			||||||
      current_stations = result;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
  import store from "../../store";
 | 
					 | 
				
			||||||
  import ScanStationsEmptyState from "./ScanStationsEmptyState.svelte";
 | 
					 | 
				
			||||||
  import ConfirmScanStationDeletion from "./ConfirmScanStationDeletion.svelte";
 | 
					 | 
				
			||||||
  import toast from "svelte-french-toast";
 | 
					 | 
				
			||||||
  $: searchvalue = "";
 | 
					 | 
				
			||||||
  $: active_deletes = [];
 | 
					 | 
				
			||||||
  let delete_station = {};
 | 
					 | 
				
			||||||
  let modal_open = false;
 | 
					 | 
				
			||||||
  export let current_stations = [];
 | 
					 | 
				
			||||||
</script>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<ConfirmScanStationDeletion
 | 
					 | 
				
			||||||
  on:cancelDelete={(event) => {
 | 
					 | 
				
			||||||
    modal_open = false;
 | 
					 | 
				
			||||||
    active_deletes[event.detail.id] = false;
 | 
					 | 
				
			||||||
  }}
 | 
					 | 
				
			||||||
  bind:modal_open
 | 
					 | 
				
			||||||
  bind:delete_station
 | 
					 | 
				
			||||||
/>
 | 
					 | 
				
			||||||
{#if store.state.jwtinfo.userdetails.permissions.includes("STATION:GET")}
 | 
					 | 
				
			||||||
  {#await promise}
 | 
					 | 
				
			||||||
    <div
 | 
					 | 
				
			||||||
      class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2"
 | 
					 | 
				
			||||||
      role="alert"
 | 
					 | 
				
			||||||
    >
 | 
					 | 
				
			||||||
      <p class="font-bold">{$_("scanstations-are-being-loaded")}</p>
 | 
					 | 
				
			||||||
      <p class="text-sm">{$_("this-might-take-a-moment")}</p>
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
  {:then}
 | 
					 | 
				
			||||||
    {#if current_stations.length === 0}
 | 
					 | 
				
			||||||
      <ScanStationsEmptyState />
 | 
					 | 
				
			||||||
    {:else}
 | 
					 | 
				
			||||||
      <input
 | 
					 | 
				
			||||||
        type="search"
 | 
					 | 
				
			||||||
        bind:value={searchvalue}
 | 
					 | 
				
			||||||
        placeholder={$_("datatable.search")}
 | 
					 | 
				
			||||||
        aria-label={$_("datatable.search")}
 | 
					 | 
				
			||||||
        class="mb-4"
 | 
					 | 
				
			||||||
      />
 | 
					 | 
				
			||||||
      <div
 | 
					 | 
				
			||||||
        class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll"
 | 
					 | 
				
			||||||
      >
 | 
					 | 
				
			||||||
        <table class="divide-y divide-gray-200 w-full">
 | 
					 | 
				
			||||||
          <thead class="bg-gray-50">
 | 
					 | 
				
			||||||
            <tr class="odd:bg-white even:bg-gray-100">
 | 
					 | 
				
			||||||
              <th
 | 
					 | 
				
			||||||
                scope="col"
 | 
					 | 
				
			||||||
                class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
 | 
					 | 
				
			||||||
              >
 | 
					 | 
				
			||||||
                {$_("track")}
 | 
					 | 
				
			||||||
              </th>
 | 
					 | 
				
			||||||
              <th
 | 
					 | 
				
			||||||
                scope="col"
 | 
					 | 
				
			||||||
                class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
 | 
					 | 
				
			||||||
              >
 | 
					 | 
				
			||||||
                {$_("description")}
 | 
					 | 
				
			||||||
              </th>
 | 
					 | 
				
			||||||
              <th
 | 
					 | 
				
			||||||
                scope="col"
 | 
					 | 
				
			||||||
                class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
 | 
					 | 
				
			||||||
              >
 | 
					 | 
				
			||||||
                {$_("status")}
 | 
					 | 
				
			||||||
              </th>
 | 
					 | 
				
			||||||
              <th scope="col" class="relative px-6 py-3">
 | 
					 | 
				
			||||||
                <span class="sr-only">{$_("action")}</span>
 | 
					 | 
				
			||||||
              </th>
 | 
					 | 
				
			||||||
            </tr>
 | 
					 | 
				
			||||||
          </thead>
 | 
					 | 
				
			||||||
          <tbody class="divide-y divide-gray-200">
 | 
					 | 
				
			||||||
            {#each current_stations as s}
 | 
					 | 
				
			||||||
              {#if Object.values(s)
 | 
					 | 
				
			||||||
                .toString()
 | 
					 | 
				
			||||||
                .toLowerCase()
 | 
					 | 
				
			||||||
                .includes(searchvalue)}
 | 
					 | 
				
			||||||
                <tr
 | 
					 | 
				
			||||||
                  class="odd:bg-white even:bg-gray-100"
 | 
					 | 
				
			||||||
                  data-rowid="station_{s.id}"
 | 
					 | 
				
			||||||
                >
 | 
					 | 
				
			||||||
                  <td class="px-6 py-4 whitespace-nowrap">
 | 
					 | 
				
			||||||
                    <div class="flex items-center">
 | 
					 | 
				
			||||||
                      <div class="ml-4">
 | 
					 | 
				
			||||||
                        <div class="text-sm font-medium text-gray-900">
 | 
					 | 
				
			||||||
                          <a
 | 
					 | 
				
			||||||
                            href="../tracks"
 | 
					 | 
				
			||||||
                            class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800"
 | 
					 | 
				
			||||||
                          >
 | 
					 | 
				
			||||||
                            {s.track.name || s.track.distance + "m"}</a
 | 
					 | 
				
			||||||
                          >
 | 
					 | 
				
			||||||
                        </div>
 | 
					 | 
				
			||||||
                      </div>
 | 
					 | 
				
			||||||
                    </div>
 | 
					 | 
				
			||||||
                  </td>
 | 
					 | 
				
			||||||
                  <td class="px-6 py-4 whitespace-nowrap">
 | 
					 | 
				
			||||||
                    <div class="flex items-center">
 | 
					 | 
				
			||||||
                      <div class="ml-4">
 | 
					 | 
				
			||||||
                        <div class="text-sm font-medium text-gray-900">
 | 
					 | 
				
			||||||
                          {s.description}
 | 
					 | 
				
			||||||
                        </div>
 | 
					 | 
				
			||||||
                      </div>
 | 
					 | 
				
			||||||
                    </div>
 | 
					 | 
				
			||||||
                  </td>
 | 
					 | 
				
			||||||
                  <td class="px-6 py-4 whitespace-nowrap">
 | 
					 | 
				
			||||||
                    <div class="flex items-center">
 | 
					 | 
				
			||||||
                      {#if s.enabled}
 | 
					 | 
				
			||||||
                        <span
 | 
					 | 
				
			||||||
                          class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800"
 | 
					 | 
				
			||||||
                          >{$_("active")}</span
 | 
					 | 
				
			||||||
                        >
 | 
					 | 
				
			||||||
                      {:else}
 | 
					 | 
				
			||||||
                        <span
 | 
					 | 
				
			||||||
                          class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800"
 | 
					 | 
				
			||||||
                          >{$_("inactive")}</span
 | 
					 | 
				
			||||||
                        >
 | 
					 | 
				
			||||||
                      {/if}
 | 
					 | 
				
			||||||
                    </div>
 | 
					 | 
				
			||||||
                  </td>
 | 
					 | 
				
			||||||
                  {#if active_deletes[s.id] === true}
 | 
					 | 
				
			||||||
                    <td
 | 
					 | 
				
			||||||
                      class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium"
 | 
					 | 
				
			||||||
                    >
 | 
					 | 
				
			||||||
                      <button
 | 
					 | 
				
			||||||
                        on:click={() => {
 | 
					 | 
				
			||||||
                          active_deletes[s.id] = false;
 | 
					 | 
				
			||||||
                        }}
 | 
					 | 
				
			||||||
                        tabindex="0"
 | 
					 | 
				
			||||||
                        class="ml-4 text-indigo-600 hover:text-indigo-900 cursor-pointer"
 | 
					 | 
				
			||||||
                        >{$_("cancel-delete")}</button
 | 
					 | 
				
			||||||
                      >
 | 
					 | 
				
			||||||
                      <button
 | 
					 | 
				
			||||||
                        on:click={() => {
 | 
					 | 
				
			||||||
                          ScanStationService.scanStationControllerRemove(
 | 
					 | 
				
			||||||
                            s.id,
 | 
					 | 
				
			||||||
                            false
 | 
					 | 
				
			||||||
                          )
 | 
					 | 
				
			||||||
                            .then((resp) => {
 | 
					 | 
				
			||||||
                              current_stations = current_stations.filter(
 | 
					 | 
				
			||||||
                                (obj) => obj.id !== s.id
 | 
					 | 
				
			||||||
                              );
 | 
					 | 
				
			||||||
                              toast($_("station-deleted"));
 | 
					 | 
				
			||||||
                            })
 | 
					 | 
				
			||||||
                            .catch((err) => {
 | 
					 | 
				
			||||||
                              modal_open = true;
 | 
					 | 
				
			||||||
                              delete_station = s;
 | 
					 | 
				
			||||||
                            });
 | 
					 | 
				
			||||||
                        }}
 | 
					 | 
				
			||||||
                        tabindex="0"
 | 
					 | 
				
			||||||
                        class="ml-4 text-red-600 hover:text-red-900 cursor-pointer"
 | 
					 | 
				
			||||||
                        >{$_("confirm-delete")}</button
 | 
					 | 
				
			||||||
                      >
 | 
					 | 
				
			||||||
                    </td>
 | 
					 | 
				
			||||||
                  {:else}
 | 
					 | 
				
			||||||
                    <td
 | 
					 | 
				
			||||||
                      class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium"
 | 
					 | 
				
			||||||
                    >
 | 
					 | 
				
			||||||
                      <a
 | 
					 | 
				
			||||||
                        href="/scanstations/{s.id}"
 | 
					 | 
				
			||||||
                        class="text-indigo-600 hover:text-indigo-900"
 | 
					 | 
				
			||||||
                        >{$_("details")}</a
 | 
					 | 
				
			||||||
                      >
 | 
					 | 
				
			||||||
                      {#if store.state.jwtinfo.userdetails.permissions.includes("STATION:DELETE")}
 | 
					 | 
				
			||||||
                        <button
 | 
					 | 
				
			||||||
                          on:click={() => {
 | 
					 | 
				
			||||||
                            active_deletes[s.id] = true;
 | 
					 | 
				
			||||||
                          }}
 | 
					 | 
				
			||||||
                          tabindex="0"
 | 
					 | 
				
			||||||
                          class="ml-4 text-red-600 hover:text-red-900 cursor-pointer"
 | 
					 | 
				
			||||||
                          >{$_("delete")}</button
 | 
					 | 
				
			||||||
                        >
 | 
					 | 
				
			||||||
                      {/if}
 | 
					 | 
				
			||||||
                    </td>
 | 
					 | 
				
			||||||
                  {/if}
 | 
					 | 
				
			||||||
                </tr>
 | 
					 | 
				
			||||||
              {/if}
 | 
					 | 
				
			||||||
            {/each}
 | 
					 | 
				
			||||||
          </tbody>
 | 
					 | 
				
			||||||
        </table>
 | 
					 | 
				
			||||||
      </div>
 | 
					 | 
				
			||||||
    {/if}
 | 
					 | 
				
			||||||
  {:catch error}
 | 
					 | 
				
			||||||
    <div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500">
 | 
					 | 
				
			||||||
      <span class="inline-block align-middle mr-8">
 | 
					 | 
				
			||||||
        <b class="capitalize">{$_("general_promise_error")}</b>
 | 
					 | 
				
			||||||
        {error}
 | 
					 | 
				
			||||||
      </span>
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
  {/await}
 | 
					 | 
				
			||||||
{/if}
 | 
					 | 
				
			||||||
@@ -2,6 +2,7 @@
 | 
				
			|||||||
  import { _ } from "svelte-i18n";
 | 
					  import { _ } from "svelte-i18n";
 | 
				
			||||||
  import isEmail from "validator/es/lib/isEmail";
 | 
					  import isEmail from "validator/es/lib/isEmail";
 | 
				
			||||||
  import { MeService } from "@odit/lfk-client-js";
 | 
					  import { MeService } from "@odit/lfk-client-js";
 | 
				
			||||||
 | 
					  import toast from 'svelte-french-toast'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  import ConfirmProfileDeletion from "./ConfirmProfileDeletion.svelte";
 | 
					  import ConfirmProfileDeletion from "./ConfirmProfileDeletion.svelte";
 | 
				
			||||||
  import PasswordStrength, {
 | 
					  import PasswordStrength, {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@
 | 
				
			|||||||
  import { tick, createEventDispatcher } from "svelte";
 | 
					  import { tick, createEventDispatcher } from "svelte";
 | 
				
			||||||
  export let copy_modal_open;
 | 
					  export let copy_modal_open;
 | 
				
			||||||
  export let new_client;
 | 
					  export let new_client;
 | 
				
			||||||
 | 
					  import toast from 'svelte-french-toast'
 | 
				
			||||||
  const dispatch = createEventDispatcher();
 | 
					  const dispatch = createEventDispatcher();
 | 
				
			||||||
  let valueCopy = null;
 | 
					  let valueCopy = null;
 | 
				
			||||||
  let areaDom;
 | 
					  let areaDom;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@
 | 
				
			|||||||
    RunnerTeamService,
 | 
					    RunnerTeamService,
 | 
				
			||||||
  } from "@odit/lfk-client-js";
 | 
					  } from "@odit/lfk-client-js";
 | 
				
			||||||
  import { getLocaleFromNavigator, _ } from "svelte-i18n";
 | 
					  import { getLocaleFromNavigator, _ } from "svelte-i18n";
 | 
				
			||||||
 | 
					  import toast from 'svelte-french-toast'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  import store from "../../store";
 | 
					  import store from "../../store";
 | 
				
			||||||
  import Select from "svelte-select";
 | 
					  import Select from "svelte-select";
 | 
				
			||||||
@@ -290,6 +291,13 @@
 | 
				
			|||||||
        on:clear={() => (teamdata.parentGroup = null)}
 | 
					        on:clear={() => (teamdata.parentGroup = null)}
 | 
				
			||||||
      />
 | 
					      />
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="text-sm w-full">
 | 
				
			||||||
 | 
					      <span class="font-medium text-gray-700">{$_("distance")}</span>
 | 
				
			||||||
 | 
					      <br />
 | 
				
			||||||
 | 
					      <span class="text-gray-700"
 | 
				
			||||||
 | 
					        >{(original.total_distance / 1000).toFixed(2)} km</span
 | 
				
			||||||
 | 
					      >
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
  </section>
 | 
					  </section>
 | 
				
			||||||
{:else}
 | 
					{:else}
 | 
				
			||||||
  {#await promise}
 | 
					  {#await promise}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -223,7 +223,7 @@
 | 
				
			|||||||
            type="button"
 | 
					            type="button"
 | 
				
			||||||
            class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm"
 | 
					            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 sm:ml-3 sm:w-auto sm:text-sm"
 | 
				
			||||||
          >
 | 
					          >
 | 
				
			||||||
            Create
 | 
					            {$_("create")}
 | 
				
			||||||
          </button>
 | 
					          </button>
 | 
				
			||||||
          <button
 | 
					          <button
 | 
				
			||||||
            on:click={() => {
 | 
					            on:click={() => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,6 +37,7 @@
 | 
				
			|||||||
    "all-associated-scans-will-get-deleted-as-well": "Alle Scans dieser Station werden ebenfalls gelöscht",
 | 
					    "all-associated-scans-will-get-deleted-as-well": "Alle Scans dieser Station werden ebenfalls gelöscht",
 | 
				
			||||||
    "all-associated-teams-and-runners-will-be-deleted-too": "Alle assoziierten Teams und Läufer werden auch gelöscht!",
 | 
					    "all-associated-teams-and-runners-will-be-deleted-too": "Alle assoziierten Teams und Läufer werden auch gelöscht!",
 | 
				
			||||||
    "all-cards-loaded": "Alle Karten geladen",
 | 
					    "all-cards-loaded": "Alle Karten geladen",
 | 
				
			||||||
 | 
					    "all-donors-loaded": "Alle Sponsoren geladen",
 | 
				
			||||||
    "already-paid": "Bereits bezahlt",
 | 
					    "already-paid": "Bereits bezahlt",
 | 
				
			||||||
    "amount": "Anzahl",
 | 
					    "amount": "Anzahl",
 | 
				
			||||||
    "amount-per-kilometer": "Betrag pro Kilometer",
 | 
					    "amount-per-kilometer": "Betrag pro Kilometer",
 | 
				
			||||||
@@ -270,6 +271,7 @@
 | 
				
			|||||||
    "loading-contact-details": "Kontaktdaten werden geladen ...",
 | 
					    "loading-contact-details": "Kontaktdaten werden geladen ...",
 | 
				
			||||||
    "loading-donation-details": "Lade Sponsoringdetails",
 | 
					    "loading-donation-details": "Lade Sponsoringdetails",
 | 
				
			||||||
    "loading-donor-details": "Lade Details",
 | 
					    "loading-donor-details": "Lade Details",
 | 
				
			||||||
 | 
					    "loading-donors": "Sponsoren werden geladen",
 | 
				
			||||||
    "loading-group-detail": "Lade Gruppendetails...",
 | 
					    "loading-group-detail": "Lade Gruppendetails...",
 | 
				
			||||||
    "loading-profile-data": "Lade Profildaten",
 | 
					    "loading-profile-data": "Lade Profildaten",
 | 
				
			||||||
    "loading-runners": "Läufer werden geladen...",
 | 
					    "loading-runners": "Läufer werden geladen...",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,6 +37,7 @@
 | 
				
			|||||||
    "all-associated-scans-will-get-deleted-as-well": "All associated scans will get deleted as well",
 | 
					    "all-associated-scans-will-get-deleted-as-well": "All associated scans will get deleted as well",
 | 
				
			||||||
    "all-associated-teams-and-runners-will-be-deleted-too": "All associated teams and runners will be deleted too!",
 | 
					    "all-associated-teams-and-runners-will-be-deleted-too": "All associated teams and runners will be deleted too!",
 | 
				
			||||||
    "all-cards-loaded": "All cards loaded",
 | 
					    "all-cards-loaded": "All cards loaded",
 | 
				
			||||||
 | 
					    "all-donors-loaded": "All donors loaded",
 | 
				
			||||||
    "already-paid": "Already paid",
 | 
					    "already-paid": "Already paid",
 | 
				
			||||||
    "amount": "Amount",
 | 
					    "amount": "Amount",
 | 
				
			||||||
    "amount-per-kilometer": "Amount per kilometer",
 | 
					    "amount-per-kilometer": "Amount per kilometer",
 | 
				
			||||||
@@ -270,6 +271,7 @@
 | 
				
			|||||||
    "loading-contact-details": "Loading contact details...",
 | 
					    "loading-contact-details": "Loading contact details...",
 | 
				
			||||||
    "loading-donation-details": "Loading donation details",
 | 
					    "loading-donation-details": "Loading donation details",
 | 
				
			||||||
    "loading-donor-details": "Loading donor details",
 | 
					    "loading-donor-details": "Loading donor details",
 | 
				
			||||||
 | 
					    "loading-donors": "Loading donors",
 | 
				
			||||||
    "loading-group-detail": "Loading group detail...",
 | 
					    "loading-group-detail": "Loading group detail...",
 | 
				
			||||||
    "loading-profile-data": "Loading profile data",
 | 
					    "loading-profile-data": "Loading profile data",
 | 
				
			||||||
    "loading-runners": "loading runners...",
 | 
					    "loading-runners": "loading runners...",
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user