Compare commits
	
		
			23 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 477c650f3f | |||
| fc15c68cba | |||
| 32b5f5420b | |||
| ee87f82799 | |||
| 7c08f522aa | |||
| e211554579 | |||
| 7ba890dfd7 | |||
| 68b4309164 | |||
| d803f3d490 | |||
| 5468766d87 | |||
| e967d8d20c | |||
| ad4db882f0 | |||
| 84aa846b87 | |||
| 3532968b33 | |||
| 6bb49db4ee | |||
| 38fb111f7a | |||
| a50447f457 | |||
| b1a2044631 | |||
| c883920caa | |||
| 21453ef272 | |||
| 10182433f8 | |||
| b338f33a63 | |||
| cb82200481 | 
| @@ -1,2 +1,4 @@ | ||||
| public/env.sample.js | ||||
| .pnpm-store | ||||
| .yarn | ||||
| .pnp.* | ||||
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -4,3 +4,5 @@ public/env.js | ||||
| public/index.html | ||||
| /dist | ||||
| .pnpm-store | ||||
| .yarn | ||||
| .pnp.* | ||||
| @@ -2,39 +2,23 @@ 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 | ||||
|       - 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 | ||||
|   - name: build dev | ||||
|     image: woodpeckerci/plugin-docker-buildx | ||||
|     settings: | ||||
|       repo: registry.odit.services/odit/website | ||||
|       repo: registry.odit.services/lfk/frontend | ||||
|       tags: | ||||
|         - edge | ||||
|         - dev | ||||
|         - latest | ||||
|       registry: registry.odit.services | ||||
|       platforms: linux/amd64,linux/arm64 | ||||
|       cache_from: registry.odit.services/odit/website:edge | ||||
|       cache_from: registry.odit.services/lfk/frontend:dev | ||||
|       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 | ||||
|   | ||||
| @@ -12,9 +12,6 @@ steps: | ||||
|         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 | ||||
|   | ||||
							
								
								
									
										33
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -2,11 +2,44 @@ | ||||
|  | ||||
| All notable changes to this project will be documented in this file. Dates are displayed in UTC. | ||||
|  | ||||
| #### [1.5.3](https://git.odit.services/lfk/frontend/compare/1.5.2...1.5.3) | ||||
|  | ||||
| - feat(dx): Yarn support [`fc15c68`](https://git.odit.services/lfk/frontend/commit/fc15c68cba0d1986563eaf63da3a68784a685a9e) | ||||
| - feat(about): cleanup ui [`84aa846`](https://git.odit.services/lfk/frontend/commit/84aa846b87186b52a2f8632724d4f2cb70af062b) | ||||
| - feat(dashboard): reorder menu items [`e967d8d`](https://git.odit.services/lfk/frontend/commit/e967d8d20c6972b64b0096594a09043553e9c7e5) | ||||
| - fix: unexpected/ missing props [`d803f3d`](https://git.odit.services/lfk/frontend/commit/d803f3d4905d6f792b77d17025467ac13c29068b) | ||||
| - chore(deps): bump some [`68b4309`](https://git.odit.services/lfk/frontend/commit/68b4309164eac40b6fda969b60a7e238985d49f8) | ||||
| - fix(ci): Switch over to new woodpecker version [`7ba890d`](https://git.odit.services/lfk/frontend/commit/7ba890dfd7ba908ebef0338f6faa5e7d804cb5ef) | ||||
| - refactor(ci): Only build licences, don't export [`32b5f54`](https://git.odit.services/lfk/frontend/commit/32b5f5420bf9ff656b713d61b3a0113b9d6cb69f) | ||||
| - feat: cleanup random page toasts [`ad4db88`](https://git.odit.services/lfk/frontend/commit/ad4db882f0f4d00a80ae5e0072e09c071c07ffa2) | ||||
| - fix(ci): Update git pushb settings [`ee87f82`](https://git.odit.services/lfk/frontend/commit/ee87f82799ce559fd43d671ab412f2643eafeac6) | ||||
| - fix(ci): Update relase machanism [`7c08f52`](https://git.odit.services/lfk/frontend/commit/7c08f522aa4b2986544a4c0e5d3261c4c7296121) | ||||
| - fix(ci): Install pnpm [`e211554`](https://git.odit.services/lfk/frontend/commit/e211554579b1f27d13194eff4aad76f6f030141e) | ||||
| - fix(orgs): ImportRunnerModal props [`5468766`](https://git.odit.services/lfk/frontend/commit/5468766d875a6278f01ed1fd9573688374befdd5) | ||||
|  | ||||
| #### [1.5.2](https://git.odit.services/lfk/frontend/compare/1.5.1...1.5.2) | ||||
|  | ||||
| > 21 November 2024 | ||||
|  | ||||
| - feat: improved dashboard titles ui + a11y [`21453ef`](https://git.odit.services/lfk/frontend/commit/21453ef272665c0b7c7b04009b7b74e110fbd988) | ||||
| - feat: improved dashboard titles ui + a11y [`c883920`](https://git.odit.services/lfk/frontend/commit/c883920caaaaef30a8e54dd0e7eecd68943f3041) | ||||
| - feat(dashboard): improved a11y of active sidebar menu item [`a50447f`](https://git.odit.services/lfk/frontend/commit/a50447f457ecc045995efb7b952b07ea09c91373) | ||||
| - feat: improved mobile buttons + search ui [`38fb111`](https://git.odit.services/lfk/frontend/commit/38fb111f7a2b5a1a01b17b00e89ee081e4b91bd9) | ||||
| - feat(i18n/de): rename "Track" to "Laufstrecke" [`1018243`](https://git.odit.services/lfk/frontend/commit/10182433f825968ee55298399b231173698a795c) | ||||
| - 🚀RELEASE v1.5.2 [`3532968`](https://git.odit.services/lfk/frontend/commit/3532968b3399b985b1ed28ba6b89a13f35f9289b) | ||||
| - feat(dashboard): improved mobile ui hamburger button [`b338f33`](https://git.odit.services/lfk/frontend/commit/b338f33a63ad8e98ab44deff2f80dbd5fe2a0fc2) | ||||
| - feat(dashboard): match greeting style with rest of titles [`b1a2044`](https://git.odit.services/lfk/frontend/commit/b1a20446314d1b25e9f653bd2767b072fd629f97) | ||||
| - feat(dashboard): add lfk icon and app name to mobile nav bar [`6bb49db`](https://git.odit.services/lfk/frontend/commit/6bb49db4eee95486f5a947d708b80a7a94d36933) | ||||
| - feat(users/UsersOverview): improve ui by adding borders to badges [`cb82200`](https://git.odit.services/lfk/frontend/commit/cb82200481c629a0dd8b235821115ae4276948ca) | ||||
|  | ||||
| #### [1.5.1](https://git.odit.services/lfk/frontend/compare/1.5.0...1.5.1) | ||||
|  | ||||
| > 21 November 2024 | ||||
|  | ||||
| - 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) | ||||
| - 🚀RELEASE v1.5.1 [`9abf74d`](https://git.odit.services/lfk/frontend/commit/9abf74d6d217e7745c1055bdbfbe97de7b14572f) | ||||
| - 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) | ||||
|   | ||||
| @@ -13,7 +13,7 @@ | ||||
|  | ||||
|   <body> | ||||
|     <span style="display: none; visibility: hidden" id="buildinfo" | ||||
|       >RELEASE_INFO-1.5.1-RELEASE_INFO</span | ||||
|       >RELEASE_INFO-1.5.3-RELEASE_INFO</span | ||||
|     > | ||||
|     <noscript>You need to enable JavaScript to run this app.</noscript> | ||||
|     <script src="/env.js"></script> | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "@odit/lfk-frontend", | ||||
|   "version": "1.5.1", | ||||
|   "version": "1.5.3", | ||||
|   "type": "module", | ||||
|   "scripts": { | ||||
|     "i18n-order": "node order.js", | ||||
| @@ -51,10 +51,10 @@ | ||||
|     "localforage": "1.10.0", | ||||
|     "marked": "4.3.0", | ||||
|     "svelte": "3.58.0", | ||||
|     "svelte-french-toast": "1.0.4-beta.0", | ||||
|     "svelte-french-toast": "1.2.0", | ||||
|     "svelte-i18n": "3.6.0", | ||||
|     "tinro": "0.6.12", | ||||
|     "validator": "13.9.0", | ||||
|     "validator": "13.12.0", | ||||
|     "xlsx": "0.18.5" | ||||
|   }, | ||||
|   "volta": { | ||||
|   | ||||
							
								
								
									
										32
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										32
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							| @@ -36,8 +36,8 @@ importers: | ||||
|         specifier: 3.58.0 | ||||
|         version: 3.58.0 | ||||
|       svelte-french-toast: | ||||
|         specifier: 1.0.4-beta.0 | ||||
|         version: 1.0.4-beta.0(svelte@3.58.0) | ||||
|         specifier: 1.2.0 | ||||
|         version: 1.2.0(svelte@3.58.0) | ||||
|       svelte-i18n: | ||||
|         specifier: 3.6.0 | ||||
|         version: 3.6.0(svelte@3.58.0) | ||||
| @@ -45,8 +45,8 @@ importers: | ||||
|         specifier: 0.6.12 | ||||
|         version: 0.6.12 | ||||
|       validator: | ||||
|         specifier: 13.9.0 | ||||
|         version: 13.9.0 | ||||
|         specifier: 13.12.0 | ||||
|         version: 13.12.0 | ||||
|       xlsx: | ||||
|         specifier: 0.18.5 | ||||
|         version: 0.18.5 | ||||
| @@ -1699,10 +1699,10 @@ packages: | ||||
|     resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} | ||||
|     engines: {node: '>= 0.4'} | ||||
|  | ||||
|   svelte-french-toast@1.0.4-beta.0: | ||||
|     resolution: {integrity: sha512-PkYNukEQAPZyV5ei+JzeYEsbaXFSbJS8/SDTdC8giYa5Atxp2SRepFnPDWx6mu7rV53g886FNLktPMLwRljkpw==} | ||||
|   svelte-french-toast@1.2.0: | ||||
|     resolution: {integrity: sha512-5PW+6RFX3xQPbR44CngYAP1Sd9oCq9P2FOox4FZffzJuZI2mHOB7q5gJBVnOiLF5y3moVGZ7u2bYt7+yPAgcEQ==} | ||||
|     peerDependencies: | ||||
|       svelte: ^3.57.0 | ||||
|       svelte: ^3.57.0 || ^4.0.0 | ||||
|  | ||||
|   svelte-hmr@0.15.1: | ||||
|     resolution: {integrity: sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==} | ||||
| @@ -1720,10 +1720,10 @@ packages: | ||||
|   svelte-select@3.17.0: | ||||
|     resolution: {integrity: sha512-ITmX/XUiSdkaILmsTviKRkZPaXckM5/FA7Y8BhiUPoamaZG/ZDyOo6ydjFu9fDVFTbwoAUGUi6HBjs+ZdK2AwA==} | ||||
|  | ||||
|   svelte-writable-derived@3.0.1: | ||||
|     resolution: {integrity: sha512-zBWCS5c3MA9o4NT/UJHP3KoPOhtmH2ZQ/QRK31w9LzLdPP7MNncUcBGIu4iH2RVt17iRfR6agm7nEqwNvsYuMw==} | ||||
|   svelte-writable-derived@3.1.1: | ||||
|     resolution: {integrity: sha512-w4LR6/bYZEuCs7SGr+M54oipk/UQKtiMadyOhW0PTwAtJ/Ai12QS77sLngEcfBx2q4H8ZBQucc9ktSA5sUGZWw==} | ||||
|     peerDependencies: | ||||
|       svelte: ^3.2.1 | ||||
|       svelte: ^3.2.1 || ^4.0.0-next.1 || ^5.0.0-next.94 | ||||
|  | ||||
|   svelte@3.58.0: | ||||
|     resolution: {integrity: sha512-brIBNNB76mXFmU/Kerm4wFnkskBbluBDCjx/8TcpYRb298Yh2dztS2kQ6bhtjMcvUhd5ynClfwpz5h2gnzdQ1A==} | ||||
| @@ -1821,8 +1821,8 @@ packages: | ||||
|   util-deprecate@1.0.2: | ||||
|     resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} | ||||
|  | ||||
|   validator@13.9.0: | ||||
|     resolution: {integrity: sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==} | ||||
|   validator@13.12.0: | ||||
|     resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} | ||||
|     engines: {node: '>= 0.10'} | ||||
|  | ||||
|   vite@4.3.3: | ||||
| @@ -3499,10 +3499,10 @@ snapshots: | ||||
|  | ||||
|   supports-preserve-symlinks-flag@1.0.0: {} | ||||
|  | ||||
|   svelte-french-toast@1.0.4-beta.0(svelte@3.58.0): | ||||
|   svelte-french-toast@1.2.0(svelte@3.58.0): | ||||
|     dependencies: | ||||
|       svelte: 3.58.0 | ||||
|       svelte-writable-derived: 3.0.1(svelte@3.58.0) | ||||
|       svelte-writable-derived: 3.1.1(svelte@3.58.0) | ||||
|  | ||||
|   svelte-hmr@0.15.1(svelte@3.58.0): | ||||
|     dependencies: | ||||
| @@ -3520,7 +3520,7 @@ snapshots: | ||||
|  | ||||
|   svelte-select@3.17.0: {} | ||||
|  | ||||
|   svelte-writable-derived@3.0.1(svelte@3.58.0): | ||||
|   svelte-writable-derived@3.1.1(svelte@3.58.0): | ||||
|     dependencies: | ||||
|       svelte: 3.58.0 | ||||
|  | ||||
| @@ -3631,7 +3631,7 @@ snapshots: | ||||
|  | ||||
|   util-deprecate@1.0.2: {} | ||||
|  | ||||
|   validator@13.9.0: {} | ||||
|   validator@13.12.0: {} | ||||
|  | ||||
|   vite@4.3.3: | ||||
|     dependencies: | ||||
|   | ||||
| @@ -20,7 +20,6 @@ | ||||
|         OpenAPI.TOKEN = value.access_token; | ||||
|         const jwtinfo = JSON.parse(atob(OpenAPI.TOKEN.split(".")[1])); | ||||
|         store.login(value, jwtinfo); | ||||
|         toast($_("welcome_wavinghand")); | ||||
|       } | ||||
|     } | ||||
|   }); | ||||
| @@ -50,7 +49,6 @@ | ||||
|           store.login(result.access_token, jwtinfo); | ||||
|           location.replace("/"); | ||||
|           toast.dismiss(); | ||||
|           toast($_("welcome_wavinghand")); | ||||
|         }) | ||||
|         .catch((err) => { | ||||
|           toast.dismiss(); | ||||
|   | ||||
| @@ -11,29 +11,29 @@ | ||||
| </script> | ||||
|  | ||||
| <section class="container p-5"> | ||||
|   <span class="mb-1 text-3xl font-extrabold leading-tight"> | ||||
|   <h4 class="mb-1 text-3xl font-extrabold leading-tight font-mono"> | ||||
|     {$_("cards")} | ||||
|     {#if store.state.jwtinfo.userdetails.permissions.includes("CARD:CREATE")} | ||||
|       <button | ||||
|         on:click={() => { | ||||
|           modal_open = true; | ||||
|         }} | ||||
|         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" | ||||
|       > | ||||
|         {$_("add-card")} | ||||
|       </button> | ||||
|       <button | ||||
|         on:click={() => { | ||||
|           bulk_modal_open = true; | ||||
|         }} | ||||
|         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" | ||||
|       > | ||||
|         {$_("create-bulk-cards")} | ||||
|       </button> | ||||
|     {/if} | ||||
|   </span> | ||||
|   </h4> | ||||
|   {#if store.state.jwtinfo.userdetails.permissions.includes("CARD:CREATE")} | ||||
|     <button | ||||
|       on:click={() => { | ||||
|         modal_open = true; | ||||
|       }} | ||||
|       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:w-auto sm:text-sm mt-1 sm:mt-0" | ||||
|     > | ||||
|       {$_("add-card")} | ||||
|     </button> | ||||
|     <button | ||||
|       on:click={() => { | ||||
|         bulk_modal_open = true; | ||||
|       }} | ||||
|       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:w-auto sm:text-sm mt-1 sm:mt-0" | ||||
|     > | ||||
|       {$_("create-bulk-cards")} | ||||
|     </button> | ||||
|   {/if} | ||||
|   <CardsOverview bind:current_cards bind:addCards /> | ||||
| </section> | ||||
|  | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|  | ||||
| <div class="text-center items-center justify-center"> | ||||
|   <p class="mb-16 text-lg text-gray-500"> | ||||
|     <img class="m-auto" style="height:15rem" src={cards_empty} alt="" /> | ||||
|     <img class="m-auto mt-2" style="height:15rem" src={cards_empty} alt="" /> | ||||
|     <span class="font-bold">{$_("there-are-no-cards-yet")}</span><br /> | ||||
|     <span>{$_("add-your-first-card")}</span> | ||||
|   </p> | ||||
|   | ||||
| @@ -151,7 +151,6 @@ | ||||
|   } | ||||
|  | ||||
|   onMount(async () => { | ||||
|     toast.loading($_("loading-cards")); | ||||
|     let page = 0; | ||||
|     let pagesize = 500; | ||||
|     while (page >= 0) { | ||||
| @@ -172,8 +171,6 @@ | ||||
|       dataLoaded = true; | ||||
|       page++; | ||||
|     } | ||||
|     toast.dismiss(); | ||||
|     toast.success($_("all-cards-loaded")); | ||||
|   }); | ||||
| </script> | ||||
|  | ||||
| @@ -219,7 +216,7 @@ | ||||
|       {#if selected.length > 0} | ||||
|         <button | ||||
|           type="button" | ||||
|           class="w-full 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 sm:ml-3 sm:w-auto sm:text-sm inline-flex" | ||||
|           class="w-full 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 sm:w-auto sm:text-sm inline-flex" | ||||
|           id="options-menu" | ||||
|           on:click={async () => { | ||||
|             const prom = []; | ||||
|   | ||||
| @@ -152,7 +152,7 @@ | ||||
|           {#if delete_triggered} | ||||
|             <button | ||||
|               on:click={deleteContact} | ||||
|               class="w-full 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 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|               class="w-full 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 sm:w-auto sm:text-sm" | ||||
|               >{$_("confirm-deletion")}</button | ||||
|             > | ||||
|             <button | ||||
| @@ -169,7 +169,7 @@ | ||||
|                 delete_triggered = true; | ||||
|               }} | ||||
|               type="button" | ||||
|               class="w-full 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 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|               class="w-full 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 sm:w-auto sm:text-sm" | ||||
|               >{$_("delete-contact")}</button | ||||
|             > | ||||
|           {/if} | ||||
| @@ -180,7 +180,7 @@ | ||||
|             class:opacity-50={!save_enabled} | ||||
|             type="button" | ||||
|             on:click={submit} | ||||
|             class="w-full 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 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:w-auto sm:text-sm" | ||||
|             >{$_("save-changes")}</button | ||||
|           > | ||||
|         {/if} | ||||
|   | ||||
| @@ -8,20 +8,20 @@ | ||||
| </script> | ||||
|  | ||||
| <section class="container p-5"> | ||||
|   <span class="mb-1 text-3xl font-extrabold leading-tight"> | ||||
|   <h4 class="mb-1 text-3xl font-extrabold leading-tight font-mono"> | ||||
|     {$_("contacts")} | ||||
|     {#if store.state.jwtinfo.userdetails.permissions.includes("CONTACT:CREATE")} | ||||
|       <button | ||||
|         on:click={() => { | ||||
|           modal_open = true; | ||||
|         }} | ||||
|         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" | ||||
|       > | ||||
|         {$_("create-a-new-contact")} | ||||
|       </button> | ||||
|     {/if} | ||||
|   </span> | ||||
|   </h4> | ||||
|   {#if store.state.jwtinfo.userdetails.permissions.includes("CONTACT:CREATE")} | ||||
|     <button | ||||
|       on:click={() => { | ||||
|         modal_open = true; | ||||
|       }} | ||||
|       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:w-auto sm:text-sm" | ||||
|     > | ||||
|       {$_("create-a-new-contact")} | ||||
|     </button> | ||||
|   {/if} | ||||
|   <ContactsOverview bind:current_contacts /> | ||||
| </section> | ||||
|  | ||||
|   | ||||
| @@ -32,7 +32,7 @@ | ||||
|         bind:value={searchvalue} | ||||
|         placeholder={$_("datatable.search")} | ||||
|         aria-label={$_("datatable.search")} | ||||
|         class="mb-4" | ||||
|         class="mb-2 w-full sm:w-auto mt-1 sm:mt-0 p-2 rounded-md border" | ||||
|       /> | ||||
|       <div | ||||
|         class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll" | ||||
|   | ||||
| @@ -24,12 +24,12 @@ | ||||
|     </a> | ||||
|     <nav class="text-sm font-medium text-gray-600" aria-label="Main Navigation"> | ||||
|       <a | ||||
|         class:bg-gray-100={$router.path === "/"} | ||||
|         class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900" | ||||
|         class:activenav={$router.path === "/"} | ||||
|         class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900" | ||||
|         href="/" | ||||
|       > | ||||
|         <svg | ||||
|           class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600" | ||||
|           class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600" | ||||
|           xmlns="http://www.w3.org/2000/svg" | ||||
|           viewBox="0 0 20 20" | ||||
|           fill="currentColor" | ||||
| @@ -40,79 +40,16 @@ | ||||
|         </svg> | ||||
|         <span>{$_("dashboard-title")}</span> | ||||
|       </a> | ||||
|       {#if store.state.jwtinfo.userdetails.permissions.includes("ORGANIZATION:GET")} | ||||
|         <a | ||||
|           class:bg-gray-100={$router.path.includes("/orgs/")} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900" | ||||
|           href="/orgs/" | ||||
|         > | ||||
|           <svg | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600" | ||||
|             fill="currentColor" | ||||
|             xmlns="http://www.w3.org/2000/svg" | ||||
|             viewBox="0 0 24 24" | ||||
|             width="24" | ||||
|             height="24" | ||||
|             ><path fill="none" d="M0 0h24v24H0z" /> | ||||
|             <path | ||||
|               d="M17 19h2v-8h-6v8h2v-6h2v6zM3 19V4a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v5h2v10h1v2H2v-2h1zm4-8v2h2v-2H7zm0 4v2h2v-2H7zm0-8v2h2V7H7z" | ||||
|             /></svg | ||||
|           > | ||||
|           <span>{$_("orgs")}</span> | ||||
|         </a> | ||||
|       {/if} | ||||
|       {#if store.state.jwtinfo.userdetails.permissions.includes("USER:GET")} | ||||
|         <a | ||||
|           class:bg-gray-100={$router.path === "/users/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900" | ||||
|           href="/users/" | ||||
|         > | ||||
|           <svg | ||||
|             xmlns="http://www.w3.org/2000/svg" | ||||
|             width="24" | ||||
|             height="24" | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600" | ||||
|             fill="currentColor" | ||||
|             viewBox="0 0 24 24" | ||||
|             ><path fill="none" d="M0 0h24v24H0z" /> | ||||
|             <path | ||||
|               d="M12 14v8H4a8 8 0 018-8zm0-1a6 6 0 110-12 6 6 0 010 12zm2.6 5.81a3.51 3.51 0 010-1.62l-1-.57 1-1.74 1 .58a3.5 3.5 0 011.4-.82V13.5h2v1.15a3.5 3.5 0 011.4.8l1-.57 1 1.74-1 .57a3.51 3.51 0 010 1.62l1 .57-1 1.74-1-.58a3.5 3.5 0 01-1.4.82v1.14h-2v-1.15a3.5 3.5 0 01-1.4-.8l-1 .57-1-1.74 1-.57zM18 17a1 1 0 100 2 1 1 0 000-2z" | ||||
|             /></svg | ||||
|           > | ||||
|           <span>{$_("users")}</span> | ||||
|         </a> | ||||
|       {/if} | ||||
|       {#if store.state.jwtinfo.userdetails.permissions.includes("USERGROUP:GET")} | ||||
|         <a | ||||
|           class:bg-gray-100={$router.path === "/groups/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900" | ||||
|           href="/groups/" | ||||
|         > | ||||
|           <svg | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600" | ||||
|             fill="currentColor" | ||||
|             width="24" | ||||
|             height="24" | ||||
|             xmlns="http://www.w3.org/2000/svg" | ||||
|             viewBox="0 0 640 512" | ||||
|             ><path | ||||
|               fill="currentColor" | ||||
|               d="M610.5 341.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 368.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm224 32c1.9 0 3.7-.5 5.6-.6 8.3-21.7 20.5-42.1 36.3-59.2 7.4-8 17.9-12.6 28.9-12.6 6.9 0 13.7 1.8 19.6 5.3l7.9 4.6c.8-.5 1.6-.9 2.4-1.4 7-14.6 11.2-30.8 11.2-48 0-61.9-50.1-112-112-112S208 82.1 208 144c0 61.9 50.1 112 112 112zm105.2 194.5c-2.3-1.2-4.6-2.6-6.8-3.9-8.2 4.8-15.3 9.8-27.5 9.8-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-10.7-34.5 24.9-49.7 25.8-50.3-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-3.8-2.2-7-5-9.8-8.1-3.3.2-6.5.6-9.8.6-24.6 0-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h255.4c-3.7-6-6.2-12.8-6.2-20.3v-9.2zM173.1 274.6C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z" | ||||
|             /></svg | ||||
|           > | ||||
|           <span>{$_("user-groups")}</span> | ||||
|         </a> | ||||
|       {/if} | ||||
|       {#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:GET")} | ||||
|         <a | ||||
|           class:bg-gray-100={$router.path === "/runners/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900" | ||||
|           class:activenav={$router.path === "/runners/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900" | ||||
|           href="/runners/" | ||||
|         > | ||||
|           <svg | ||||
|             xmlns="http://www.w3.org/2000/svg" | ||||
|             viewBox="0 0 24 24" | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600" | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600" | ||||
|             fill="currentColor" | ||||
|             width="24" | ||||
|             height="24" | ||||
| @@ -126,12 +63,12 @@ | ||||
|       {/if} | ||||
|       {#if store.state.jwtinfo.userdetails.permissions.includes("TEAM:GET")} | ||||
|         <a | ||||
|           class:bg-gray-100={$router.path === "/teams/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900" | ||||
|           class:activenav={$router.path === "/teams/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900" | ||||
|           href="/teams/" | ||||
|         > | ||||
|           <svg | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600" | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600" | ||||
|             fill="currentColor" | ||||
|             width="24" | ||||
|             height="24" | ||||
| @@ -145,14 +82,35 @@ | ||||
|           <span>{$_("teams")}</span> | ||||
|         </a> | ||||
|       {/if} | ||||
|       {#if store.state.jwtinfo.userdetails.permissions.includes("ORGANIZATION:GET")} | ||||
|         <a | ||||
|           class:activenav={$router.path.includes("/orgs/")} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900" | ||||
|           href="/orgs/" | ||||
|         > | ||||
|           <svg | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600" | ||||
|             fill="currentColor" | ||||
|             xmlns="http://www.w3.org/2000/svg" | ||||
|             viewBox="0 0 24 24" | ||||
|             width="24" | ||||
|             height="24" | ||||
|             ><path fill="none" d="M0 0h24v24H0z" /> | ||||
|             <path | ||||
|               d="M17 19h2v-8h-6v8h2v-6h2v6zM3 19V4a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v5h2v10h1v2H2v-2h1zm4-8v2h2v-2H7zm0 4v2h2v-2H7zm0-8v2h2V7H7z" | ||||
|             /></svg | ||||
|           > | ||||
|           <span>{$_("orgs")}</span> | ||||
|         </a> | ||||
|       {/if} | ||||
|       {#if store.state.jwtinfo.userdetails.permissions.includes("DONOR:GET")} | ||||
|         <a | ||||
|           class:bg-gray-100={$router.path.includes("/donors/")} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900" | ||||
|           class:activenav={$router.path.includes("/donors/")} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900" | ||||
|           href="/donors/" | ||||
|         > | ||||
|           <svg | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600" | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600" | ||||
|             fill="currentColor" | ||||
|             xmlns="http://www.w3.org/2000/svg" | ||||
|             viewBox="0 0 24 24" | ||||
| @@ -168,12 +126,12 @@ | ||||
|       {/if} | ||||
|       {#if store.state.jwtinfo.userdetails.permissions.includes("DONATION:GET")} | ||||
|         <a | ||||
|           class:bg-gray-100={$router.path.includes("/donations/")} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900" | ||||
|           class:activenav={$router.path.includes("/donations/")} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900" | ||||
|           href="/donations/" | ||||
|         > | ||||
|           <svg | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600" | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600" | ||||
|             fill="currentColor" | ||||
|             xmlns="http://www.w3.org/2000/svg" | ||||
|             viewBox="0 0 24 24" | ||||
| @@ -189,12 +147,12 @@ | ||||
|       {/if} | ||||
|       {#if store.state.jwtinfo.userdetails.permissions.includes("TRACK:GET")} | ||||
|         <a | ||||
|           class:bg-gray-100={$router.path === "/tracks/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900" | ||||
|           class:activenav={$router.path === "/tracks/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900" | ||||
|           href="/tracks/" | ||||
|         > | ||||
|           <svg | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600" | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600" | ||||
|             fill="currentColor" | ||||
|             width="24" | ||||
|             height="24" | ||||
| @@ -210,12 +168,12 @@ | ||||
|       {/if} | ||||
|       {#if store.state.jwtinfo.userdetails.permissions.includes("CARD:GET")} | ||||
|         <a | ||||
|           class:bg-gray-100={$router.path === "/cards/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900" | ||||
|           class:activenav={$router.path === "/cards/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900" | ||||
|           href="/cards/" | ||||
|         > | ||||
|           <svg | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600" | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600" | ||||
|             fill="currentColor" | ||||
|             width="24" | ||||
|             height="24" | ||||
| @@ -233,12 +191,12 @@ | ||||
|       {/if} | ||||
|       {#if store.state.jwtinfo.userdetails.permissions.includes("SCAN:GET")} | ||||
|         <a | ||||
|           class:bg-gray-100={$router.path === "/scans/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900" | ||||
|           class:activenav={$router.path === "/scans/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900" | ||||
|           href="/scans/" | ||||
|         > | ||||
|           <svg | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600" | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600" | ||||
|             fill="currentColor" | ||||
|             width="24" | ||||
|             height="24" | ||||
| @@ -255,13 +213,13 @@ | ||||
|       {/if} | ||||
|       {#if store.state.jwtinfo.userdetails.permissions.includes("CONTACT:GET")} | ||||
|         <a | ||||
|           class:bg-gray-100={$router.path === "/contacts/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900" | ||||
|           class:activenav={$router.path === "/contacts/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900" | ||||
|           href="/contacts/" | ||||
|         > | ||||
|           <svg | ||||
|             fill="currentColor" | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600" | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600" | ||||
|             xmlns="http://www.w3.org/2000/svg" | ||||
|             viewBox="0 0 24 24" | ||||
|             width="24" | ||||
| @@ -276,12 +234,12 @@ | ||||
|       {/if} | ||||
|       {#if store.state.jwtinfo.userdetails.permissions.includes("STATION:GET")} | ||||
|         <a | ||||
|           class:bg-gray-100={$router.path === "/scanstations/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900" | ||||
|           class:activenav={$router.path === "/scanstations/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900" | ||||
|           href="/scanstations/" | ||||
|         > | ||||
|           <svg | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600" | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600" | ||||
|             fill="currentColor" | ||||
|             width="24" | ||||
|             height="24" | ||||
| @@ -298,12 +256,12 @@ | ||||
|       {/if} | ||||
|       {#if store.state.jwtinfo.userdetails.permissions.includes("STATSCLIENT:GET")} | ||||
|         <a | ||||
|           class:bg-gray-100={$router.path === "/statsclients/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900" | ||||
|           class:activenav={$router.path === "/statsclients/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900" | ||||
|           href="/statsclients/" | ||||
|         > | ||||
|           <svg | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600" | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600" | ||||
|             fill="currentColor" | ||||
|             width="24" | ||||
|             height="24" | ||||
| @@ -318,13 +276,55 @@ | ||||
|           <span>{$_("statsclients")}</span> | ||||
|         </a> | ||||
|       {/if} | ||||
|       {#if store.state.jwtinfo.userdetails.permissions.includes("USER:GET")} | ||||
|         <a | ||||
|           class:activenav={$router.path === "/users/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900" | ||||
|           href="/users/" | ||||
|         > | ||||
|           <svg | ||||
|             xmlns="http://www.w3.org/2000/svg" | ||||
|             width="24" | ||||
|             height="24" | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600" | ||||
|             fill="currentColor" | ||||
|             viewBox="0 0 24 24" | ||||
|             ><path fill="none" d="M0 0h24v24H0z" /> | ||||
|             <path | ||||
|               d="M12 14v8H4a8 8 0 018-8zm0-1a6 6 0 110-12 6 6 0 010 12zm2.6 5.81a3.51 3.51 0 010-1.62l-1-.57 1-1.74 1 .58a3.5 3.5 0 011.4-.82V13.5h2v1.15a3.5 3.5 0 011.4.8l1-.57 1 1.74-1 .57a3.51 3.51 0 010 1.62l1 .57-1 1.74-1-.58a3.5 3.5 0 01-1.4.82v1.14h-2v-1.15a3.5 3.5 0 01-1.4-.8l-1 .57-1-1.74 1-.57zM18 17a1 1 0 100 2 1 1 0 000-2z" | ||||
|             /></svg | ||||
|           > | ||||
|           <span>{$_("users")}</span> | ||||
|         </a> | ||||
|       {/if} | ||||
|       {#if store.state.jwtinfo.userdetails.permissions.includes("USERGROUP:GET")} | ||||
|         <a | ||||
|           class:activenav={$router.path === "/groups/"} | ||||
|           class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900" | ||||
|           href="/groups/" | ||||
|         > | ||||
|           <svg | ||||
|             class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600" | ||||
|             fill="currentColor" | ||||
|             width="24" | ||||
|             height="24" | ||||
|             xmlns="http://www.w3.org/2000/svg" | ||||
|             viewBox="0 0 640 512" | ||||
|             ><path | ||||
|               fill="currentColor" | ||||
|               d="M610.5 341.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 368.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm224 32c1.9 0 3.7-.5 5.6-.6 8.3-21.7 20.5-42.1 36.3-59.2 7.4-8 17.9-12.6 28.9-12.6 6.9 0 13.7 1.8 19.6 5.3l7.9 4.6c.8-.5 1.6-.9 2.4-1.4 7-14.6 11.2-30.8 11.2-48 0-61.9-50.1-112-112-112S208 82.1 208 144c0 61.9 50.1 112 112 112zm105.2 194.5c-2.3-1.2-4.6-2.6-6.8-3.9-8.2 4.8-15.3 9.8-27.5 9.8-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-10.7-34.5 24.9-49.7 25.8-50.3-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-3.8-2.2-7-5-9.8-8.1-3.3.2-6.5.6-9.8.6-24.6 0-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h255.4c-3.7-6-6.2-12.8-6.2-20.3v-9.2zM173.1 274.6C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z" | ||||
|             /></svg | ||||
|           > | ||||
|           <span>{$_("user-groups")}</span> | ||||
|         </a> | ||||
|       {/if} | ||||
|       <a | ||||
|         class:bg-gray-100={$router.path === "/settings/"} | ||||
|         class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900" | ||||
|         class:activenav={$router.path === "/settings/"} | ||||
|         class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900" | ||||
|         href="/settings/" | ||||
|       > | ||||
|         <svg | ||||
|           class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600" | ||||
|           class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600" | ||||
|           xmlns="http://www.w3.org/2000/svg" | ||||
|           viewBox="0 0 20 20" | ||||
|           fill="currentColor" | ||||
| @@ -338,12 +338,12 @@ | ||||
|         <span>{$_("settings")}</span> | ||||
|       </a> | ||||
|       <a | ||||
|         class:bg-gray-100={$router.path === "/about/"} | ||||
|         class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900" | ||||
|         class:activenav={$router.path === "/about/"} | ||||
|         class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900" | ||||
|         href="/about/" | ||||
|       > | ||||
|         <svg | ||||
|           class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600" | ||||
|           class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600" | ||||
|           xmlns="http://www.w3.org/2000/svg" | ||||
|           fill="none" | ||||
|           stroke="currentColor" | ||||
| @@ -358,14 +358,14 @@ | ||||
|       </a> | ||||
|       <button | ||||
|         tabindex="0" | ||||
|         class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900" | ||||
|         class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-200 hover:text-gray-900" | ||||
|         on:click={() => { | ||||
|           AuthService.authControllerLogout(); | ||||
|           logout(); | ||||
|         }} | ||||
|       > | ||||
|         <svg | ||||
|           class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600" | ||||
|           class="flex-shrink-0 w-5 h-5 mr-2 transition group-hover:text-gray-600" | ||||
|           fill="currentColor" | ||||
|           width="24" | ||||
|           height="24" | ||||
| @@ -382,7 +382,7 @@ | ||||
|   </div> | ||||
|   <div class="ml-0 transition md:ml-60"> | ||||
|     <header | ||||
|       class="flex items-center justify-between w-full px-4 bg-white border-b h-14 md:hidden" | ||||
|       class="flex items-center w-full px-4 bg-white border-b h-14 md:hidden" | ||||
|     > | ||||
|       <button | ||||
|         on:click={() => { | ||||
| @@ -390,18 +390,15 @@ | ||||
|         }} | ||||
|         class="block btn btn-light md:hidden" | ||||
|       > | ||||
|         <span class="sr-only">Menu</span><svg | ||||
|           class="w-4 h-4" | ||||
|           xmlns="http://www.w3.org/2000/svg" | ||||
|           viewBox="0 0 20 20" | ||||
|           fill="currentcolor" | ||||
|           ><path | ||||
|             fill-rule="evenodd" | ||||
|             d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4A1 1 0 013 5zm0 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zm0 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z" | ||||
|             clip-rule="evenodd" | ||||
|           /></svg | ||||
|         ></button | ||||
|         <span class="sr-only">Menu</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-6"> | ||||
|           <path stroke-linecap="round" stroke-linejoin="round" d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5" /> | ||||
|         </svg> | ||||
|         </button | ||||
|       > | ||||
|       <span class="inline-block"> | ||||
|         <img src="/lfk-logo.png" alt="Logo" class="h-8 inline-block" /> | ||||
|         <span class="text-lg font-bold">LfK!Admin</span> | ||||
|       </span> | ||||
|     </header> | ||||
|     <Toaster position="top-right" /> | ||||
|     <slot> | ||||
|   | ||||
| @@ -3,18 +3,16 @@ | ||||
|   import { StatsService } from "@odit/lfk-client-js"; | ||||
|   import store from "../../store"; | ||||
|   import StatCard from "./StatCard.svelte"; | ||||
|   let navOpen = false; | ||||
|   const stats_promise = StatsService.statsControllerGet(); | ||||
| </script> | ||||
|  | ||||
| <div class="p-2 md:p-5 overflow-x-hidden"> | ||||
|   <h1 class="text-3xl leading-tight mb-4"> | ||||
|     {$_("dashboard-greeting")}, | ||||
|     <span class="text-blue-500" | ||||
|   <h4 class="mb-1 text-3xl font-extrabold leading-tight font-mono"> | ||||
|     {$_("dashboard-greeting")} <span class="text-blue-500" | ||||
|       >{store.state.jwtinfo.userdetails.firstname} | ||||
|       {store.state.jwtinfo.userdetails.lastname}</span | ||||
|     > | ||||
|   </h1> | ||||
|   </h4> | ||||
|   {#await stats_promise} | ||||
|     <div | ||||
|       class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2" | ||||
| @@ -25,7 +23,7 @@ | ||||
|     </div> | ||||
|   {:then stats} | ||||
|     <div | ||||
|       class="grid gap-2 grid-cols-2 lg:grid-cols-3 xl:grid-cols-5 2xl:grid-cols-6 sm:gap-4" | ||||
|       class="grid gap-1 grid-cols-2 lg:grid-cols-3 xl:grid-cols-5 2xl:grid-cols-6 sm:gap-4" | ||||
|     > | ||||
|       <StatCard | ||||
|         title={$_("runners")} | ||||
|   | ||||
| @@ -7,13 +7,13 @@ | ||||
| </script> | ||||
|  | ||||
| <a {href}> | ||||
|   <div class="p-4 rounded-lg bg-white border border-grey-100"> | ||||
|   <div class="p-3 py-4 sm:p-4 rounded-lg bg-white border border-grey-100"> | ||||
|     <div class="flex flex-row items-center justify-between"> | ||||
|       <div class="flex flex-col"> | ||||
|         <div class="text-xs uppercase font-normal text-grey-500"> | ||||
|         <div class="text-md sm:text-xs uppercase font-normal text-grey-500"> | ||||
|           {title} | ||||
|         </div> | ||||
|         <div class="text-xl font-bold font-mono">{value}</div> | ||||
|         <div class="text-2xl sm:text-xl font-bold font-mono">{value}</div> | ||||
|       </div> | ||||
|       <slot /> | ||||
|     </div> | ||||
|   | ||||
| @@ -100,7 +100,6 @@ | ||||
|   } | ||||
|  | ||||
|   onMount(async () => { | ||||
|     toast.loading($_("loading-donors")); | ||||
|     donors = (await DonorService.donorControllerGetAll()).map( | ||||
|       (r) => { | ||||
|         return { label: getDonorLabel(r), value: r }; | ||||
| @@ -111,8 +110,6 @@ | ||||
|         return { label: getDonorLabel(r), value: r }; | ||||
|       } | ||||
|     ); | ||||
|     toast.dismiss(); | ||||
|     toast.success($_("all-donors-loaded")); | ||||
|   }); | ||||
| </script> | ||||
|  | ||||
|   | ||||
| @@ -9,20 +9,20 @@ | ||||
| </script> | ||||
|  | ||||
| <section class="container p-5"> | ||||
|   <span class="mb-1 text-3xl font-extrabold leading-tight"> | ||||
|   <h4 class="mb-1 text-3xl font-extrabold leading-tight font-mono"> | ||||
|     {$_("donations")} | ||||
|     {#if store.state.jwtinfo.userdetails.permissions.includes("DONATION:CREATE")} | ||||
|       <button | ||||
|         on:click={() => { | ||||
|           modal_open = true; | ||||
|         }} | ||||
|         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" | ||||
|       > | ||||
|         {$_("add-donation")} | ||||
|       </button> | ||||
|     {/if} | ||||
|   </span> | ||||
|   </h4> | ||||
|   {#if store.state.jwtinfo.userdetails.permissions.includes("DONATION:CREATE")} | ||||
|     <button | ||||
|       on:click={() => { | ||||
|         modal_open = true; | ||||
|       }} | ||||
|       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:w-auto sm:text-sm" | ||||
|     > | ||||
|       {$_("add-donation")} | ||||
|     </button> | ||||
|   {/if} | ||||
|   <DonationsOverview bind:current_donations bind:addDonations /> | ||||
| </section> | ||||
|  | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|  | ||||
| <div class="text-center items-center justify-center"> | ||||
|   <p class="mb-16 text-lg text-gray-500"> | ||||
|     <img class="m-auto" style="height:15rem" src={donations_empty} alt="" /> | ||||
|     <img class="m-auto mt-2" style="height:15rem" src={donations_empty} alt="" /> | ||||
|     <span class="font-bold">{$_("there-are-no-donations-yet")}</span><br /> | ||||
|     <span>{$_("add-your-fist-donation")}</span> | ||||
|   </p> | ||||
|   | ||||
| @@ -231,7 +231,7 @@ | ||||
|       bind:value={searchvalue} | ||||
|       placeholder={$_("datatable.search")} | ||||
|       aria-label={$_("datatable.search")} | ||||
|       class="mb-4" | ||||
|       class="mb-2 w-full sm:w-auto mt-1 sm:mt-0 p-2 rounded-md border" | ||||
|     /> | ||||
|     <div | ||||
|       class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll" | ||||
|   | ||||
| @@ -9,61 +9,61 @@ | ||||
| </script> | ||||
|  | ||||
| <section class="container p-5"> | ||||
|   <span class="mb-1 text-3xl font-extrabold leading-tight"> | ||||
|   <h4 class="mb-1 text-3xl font-extrabold leading-tight font-mono"> | ||||
|     {$_("donors")} | ||||
|     {#if store.state.jwtinfo.userdetails.permissions.includes("DONOR:CREATE")} | ||||
|       <button | ||||
|         on:click={() => { | ||||
|           modal_open = true; | ||||
|         }} | ||||
|         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" | ||||
|       > | ||||
|         {$_("add-donor")} | ||||
|       </button> | ||||
|     {/if} | ||||
|     {#if store.state.jwtinfo.userdetails.permissions.includes("DONOR:GET")} | ||||
|       <button | ||||
|         on:click={() => { | ||||
|           const data = current_donors | ||||
|             .filter((d) => d.receiptNeeded === true) | ||||
|             .map(function (d) { | ||||
|               d.address.address2 = | ||||
|                 d.address.address2 === "" ? "" : " " + d.address.address2; | ||||
|               const address = `${d.address.address1}${d.address.address2}, ${d.address.postalcode} ${d.address.city}, ${d.address.country}`; | ||||
|               return [ | ||||
|                 d.firstname, | ||||
|                 d.middlename, | ||||
|                 d.lastname, | ||||
|                 (d.paidDonationAmount/100).toFixed(2), | ||||
|                 address, | ||||
|               ]; | ||||
|             }); | ||||
|           let csv = `${$_("csv_import__firstname")};${$_( | ||||
|             "csv_import__middlename" | ||||
|           )};${$_("csv_import__lastname")};${$_( | ||||
|             "total_donation_amount_in_eur" | ||||
|           )};${$_("address")}\n`; | ||||
|           data.forEach(function (row) { | ||||
|             csv += row.join(";"); | ||||
|             csv += "\n"; | ||||
|   </h4> | ||||
|   {#if store.state.jwtinfo.userdetails.permissions.includes("DONOR:CREATE")} | ||||
|     <button | ||||
|       on:click={() => { | ||||
|         modal_open = true; | ||||
|       }} | ||||
|       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:w-auto sm:text-sm mt-1 sm:mt-0" | ||||
|     > | ||||
|       {$_("add-donor")} | ||||
|     </button> | ||||
|   {/if} | ||||
|   {#if store.state.jwtinfo.userdetails.permissions.includes("DONOR:GET")} | ||||
|     <button | ||||
|       on:click={() => { | ||||
|         const data = current_donors | ||||
|           .filter((d) => d.receiptNeeded === true) | ||||
|           .map(function (d) { | ||||
|             d.address.address2 = | ||||
|               d.address.address2 === "" ? "" : " " + d.address.address2; | ||||
|             const address = `${d.address.address1}${d.address.address2}, ${d.address.postalcode} ${d.address.city}, ${d.address.country}`; | ||||
|             return [ | ||||
|               d.firstname, | ||||
|               d.middlename, | ||||
|               d.lastname, | ||||
|               (d.paidDonationAmount/100).toFixed(2), | ||||
|               address, | ||||
|             ]; | ||||
|           }); | ||||
|           let hiddenElement = document.createElement("a"); | ||||
|           hiddenElement.href = "data:text/csv;charset=utf-8," + encodeURI(csv); | ||||
|           hiddenElement.target = "_blank"; | ||||
|           hiddenElement.download = `${$_( | ||||
|             "filename_sponsoringquittungsliste" | ||||
|           )}.csv`; | ||||
|           hiddenElement.click(); | ||||
|           hiddenElement.remove(); | ||||
|         }} | ||||
|         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" | ||||
|       > | ||||
|         {$_("sponsoring-quittungs-liste_herunterladen")} | ||||
|       </button> | ||||
|     {/if} | ||||
|   </span> | ||||
|         let csv = `${$_("csv_import__firstname")};${$_( | ||||
|           "csv_import__middlename" | ||||
|         )};${$_("csv_import__lastname")};${$_( | ||||
|           "total_donation_amount_in_eur" | ||||
|         )};${$_("address")}\n`; | ||||
|         data.forEach(function (row) { | ||||
|           csv += row.join(";"); | ||||
|           csv += "\n"; | ||||
|         }); | ||||
|         let hiddenElement = document.createElement("a"); | ||||
|         hiddenElement.href = "data:text/csv;charset=utf-8," + encodeURI(csv); | ||||
|         hiddenElement.target = "_blank"; | ||||
|         hiddenElement.download = `${$_( | ||||
|           "filename_sponsoringquittungsliste" | ||||
|         )}.csv`; | ||||
|         hiddenElement.click(); | ||||
|         hiddenElement.remove(); | ||||
|       }} | ||||
|       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:w-auto sm:text-sm mt-1 sm:mt-0" | ||||
|     > | ||||
|       {$_("sponsoring-quittungs-liste_herunterladen")} | ||||
|     </button> | ||||
|   {/if} | ||||
|   <DonorsOverview bind:current_donors bind:addDonors /> | ||||
| </section> | ||||
|  | ||||
|   | ||||
| @@ -202,7 +202,7 @@ | ||||
|       bind:value={searchvalue} | ||||
|       placeholder={$_("datatable.search")} | ||||
|       aria-label={$_("datatable.search")} | ||||
|       class="mb-4" | ||||
|       class="mb-2 w-full sm:w-auto mt-1 sm:mt-0 p-2 rounded-md border" | ||||
|     /> | ||||
|     <div | ||||
|       class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll" | ||||
|   | ||||
| @@ -1,210 +1,196 @@ | ||||
| <script> | ||||
|   import { _ } from "svelte-i18n"; | ||||
|   import { clickOutside } from "../base/outsideclick"; | ||||
| 	import { _ } from "svelte-i18n"; | ||||
| 	import { clickOutside } from "../base/outsideclick"; | ||||
|  | ||||
|   export let modal_open; | ||||
|   (function () { | ||||
|     document.onkeydown = function (e) { | ||||
|       e = e || window.event; | ||||
|       if (e.key === "Escape") { | ||||
|         modal_open = false; | ||||
|       } | ||||
|     }; | ||||
|   })(); | ||||
|   const license_promise = fetch("/licenses.json"); | ||||
|   let licenses = []; | ||||
|   $: currentlicense = ""; | ||||
|   $: licensetext = ""; | ||||
|   license_promise | ||||
|     .then((response) => response.json()) | ||||
|     .then((json) => { | ||||
|       licenses = json; | ||||
|     }); | ||||
| 	let modal_open = false; | ||||
| 	(function () { | ||||
| 		document.onkeydown = function (e) { | ||||
| 			e = e || window.event; | ||||
| 			if (e.key === "Escape") { | ||||
| 				modal_open = false; | ||||
| 			} | ||||
| 		}; | ||||
| 	})(); | ||||
| 	const license_promise = fetch("/licenses.json"); | ||||
| 	let licenses = []; | ||||
| 	$: currentlicense = ""; | ||||
| 	$: licensetext = ""; | ||||
| 	license_promise | ||||
| 		.then((response) => response.json()) | ||||
| 		.then((json) => { | ||||
| 			licenses = json; | ||||
| 		}); | ||||
| </script> | ||||
|  | ||||
| {#if modal_open} | ||||
|   <div | ||||
|     class="fixed z-10 inset-0 overflow-y-auto" | ||||
|     use:clickOutside | ||||
|     on:click_outside={() => { | ||||
|       modal_open = false; | ||||
|     }} | ||||
|   > | ||||
|     <div | ||||
|       class="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0" | ||||
|     > | ||||
|       <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 bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full" | ||||
|         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"> | ||||
|           <div class="sm:flex sm:items-start"> | ||||
|             <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" | ||||
|             > | ||||
|               <svg | ||||
|                 fill="currentColor" | ||||
|                 class="h-6 w-6 text-blue-600" | ||||
|                 xmlns="http://www.w3.org/2000/svg" | ||||
|                 viewBox="0 0 24 24" | ||||
|                 width="24" | ||||
|                 height="24" | ||||
|                 ><path fill="none" d="M0 0h24v24H0z" /> | ||||
|                 <path | ||||
|                   d="M14 20v2H2v-2h12zM14.586.686l7.778 7.778L20.95 9.88l-1.06-.354L17.413 12l5.657 5.657-1.414 1.414L16 13.414l-2.404 2.404.283 1.132-1.415 1.414-7.778-7.778 1.415-1.414 1.13.282 6.294-6.293-.353-1.06L14.586.686z" | ||||
|                 /></svg | ||||
|               > | ||||
|             </div> | ||||
|             <div class="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left"> | ||||
|               <h3 class="text-lg leading-6 font-medium"> | ||||
|                 {$_("read-license")} | ||||
|               </h3> | ||||
|               <div class="mt-2 mb-6"> | ||||
|                 <p class="text-sm text-gray-500">{currentlicense}</p> | ||||
|               </div> | ||||
|               <div class="mt-2 mb-6"> | ||||
|                 <p class="text-sm text-gray-500">{licensetext}</p> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse"> | ||||
|           <button | ||||
|             on:click={() => { | ||||
|               modal_open = false; | ||||
|             }} | ||||
|             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" | ||||
|           > | ||||
|             {$_("close")} | ||||
|           </button> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| 	<div | ||||
| 		class="fixed z-10 inset-0 overflow-y-auto" | ||||
| 		use:clickOutside | ||||
| 		on:click_outside={() => { | ||||
| 			modal_open = false; | ||||
| 		}} | ||||
| 	> | ||||
| 		<div | ||||
| 			class="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 sm:block sm:p-0" | ||||
| 		> | ||||
| 			<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 bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full" | ||||
| 				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"> | ||||
| 					<div class="sm:flex sm:items-start"> | ||||
| 						<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" | ||||
| 						> | ||||
| 							<svg | ||||
| 								fill="currentColor" | ||||
| 								class="h-6 w-6 text-blue-600" | ||||
| 								xmlns="http://www.w3.org/2000/svg" | ||||
| 								viewBox="0 0 24 24" | ||||
| 								width="24" | ||||
| 								height="24" | ||||
| 								><path fill="none" d="M0 0h24v24H0z" /> | ||||
| 								<path | ||||
| 									d="M14 20v2H2v-2h12zM14.586.686l7.778 7.778L20.95 9.88l-1.06-.354L17.413 12l5.657 5.657-1.414 1.414L16 13.414l-2.404 2.404.283 1.132-1.415 1.414-7.778-7.778 1.415-1.414 1.13.282 6.294-6.293-.353-1.06L14.586.686z" | ||||
| 								/></svg | ||||
| 							> | ||||
| 						</div> | ||||
| 						<div class="mt-3 sm:mt-0 sm:ml-4 sm:text-left"> | ||||
| 							<h3 class="text-lg leading-6 font-medium"> | ||||
| 								{$_("read-license")} | ||||
| 							</h3> | ||||
| 							<div class="mt-2 mb-6"> | ||||
| 								<p class="text-sm text-gray-500">{currentlicense}</p> | ||||
| 							</div> | ||||
| 							<div class="mt-2 mb-6"> | ||||
| 								<p class="text-sm text-gray-500">{licensetext}</p> | ||||
| 							</div> | ||||
| 						</div> | ||||
| 					</div> | ||||
| 				</div> | ||||
| 				<div class="bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse"> | ||||
| 					<button | ||||
| 						on:click={() => { | ||||
| 							modal_open = false; | ||||
| 						}} | ||||
| 						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:w-auto sm:text-sm" | ||||
| 					> | ||||
| 						{$_("close")} | ||||
| 					</button> | ||||
| 				</div> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 	</div> | ||||
| {/if} | ||||
| <!-- /// --> | ||||
| <div class="pt-12 px-4 sm:px-6 lg:px-8 lg:pt-20 bg-gray-900 pb-12"> | ||||
|   <div class="text-center mb-8"> | ||||
|     <h1 | ||||
|       class="mt-9 font-display text-4xl leading-none font-semibold text-white sm:text-5xl lg:text-6xl" | ||||
|     > | ||||
|       {$_("about")} | ||||
|       🧾 | ||||
|     </h1> | ||||
|     <p | ||||
|       class="mt-2 max-w-xl mx-auto text-xl lg:max-w-3xl lg:text-2xl text-gray-300" | ||||
|     > | ||||
|       Lauf für Kaya! | ||||
|       <strong class="text-white font-medium"> | ||||
|         {$_("by")} | ||||
|         <a href="https://odit.services" class="underline">ODIT.Services</a> | ||||
|       </strong> | ||||
|       <br /> | ||||
|       <span class="text-lg">{$_("lfk-is-os")}</span> | ||||
|     </p> | ||||
|   </div> | ||||
| </div> | ||||
|  | ||||
| <div class="pt-0 pb-16 overflow-hidden lg:pt-12 lg:py-24"> | ||||
|   <div class="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8"> | ||||
|     <h2 class="text-4xl font-display font-semibold md:text-5xl"> | ||||
|       {$_("credits")} | ||||
|     </h2> | ||||
|     <div class="max-w-3xl mx-auto text-xl leading-8 font-medium mt-8"> | ||||
|       <p class="text-center">{$_("oss_credit_description")}</p> | ||||
|     </div> | ||||
|     <div class="w-screen leading-8 pl-5 mt-5"> | ||||
|       {#await license_promise} | ||||
|         <p class="text-center w-full">{$_("licenses-are-being-loaded")}</p> | ||||
|       {:then} | ||||
|         <table> | ||||
|           <thead class="border-b border-gray-400"> | ||||
|             <tr class="odd:bg-white even:bg-gray-100"> | ||||
|               <th>{$_("dependency_name")}</th> | ||||
|               <th>{$_("license")}</th> | ||||
|               <th>{$_("repo_link")}</th> | ||||
|               <th>{$_("installed-version")}</th> | ||||
|               <th>{$_("author")}</th> | ||||
|             </tr> | ||||
|           </thead> | ||||
|           <tbody> | ||||
|             {#each licenses as l} | ||||
|               <tr class="odd:bg-white even:bg-gray-100"> | ||||
|                 <td>{l.name}</td> | ||||
|                 <td> | ||||
|                   {l.license || "?"}<br /><button | ||||
|                     class="underline cursor-pointer" | ||||
|                     on:click={() => { | ||||
|                       modal_open = true; | ||||
|                       currentlicense = l.name + "@" + l.version; | ||||
|                       licensetext = | ||||
|                         l.licensetext || $_("no-license-text-could-be-found"); | ||||
|                     }}>{$_("read-license")}</button | ||||
|                   > | ||||
|                 </td> | ||||
|                 <td> | ||||
|                   {(l.repo?.url || l.repo) | ||||
|                     .replace("git+", "") | ||||
|                     .replace("git://", "")} | ||||
|                 </td> | ||||
|                 <td>{l.version || "?"}</td> | ||||
|                 <td>{l.author?.name || l.author || "?"}</td> | ||||
|               </tr> | ||||
|             {/each} | ||||
|           </tbody> | ||||
|         </table> | ||||
|       {: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} | ||||
|     </div> | ||||
|     <div class="w-full leading-8 mt-8"> | ||||
|       <p class="text-xl font-medium">{$_("icon-image-credits")}</p> | ||||
|       <ul class="list-disc"> | ||||
|         <li> | ||||
|           <a | ||||
|             class="underline" | ||||
|             target="_blank" | ||||
|             rel="noopener noreferrer" | ||||
|             href="https://storyset.com">https://storyset.com</a | ||||
|           > | ||||
|         </li> | ||||
|         <li> | ||||
|           <a | ||||
|             class="underline" | ||||
|             target="_blank" | ||||
|             rel="noopener noreferrer" | ||||
|             href="https://undraw.co">https://undraw.co</a | ||||
|           > | ||||
|         </li> | ||||
|         <li> | ||||
|           <a | ||||
|             class="underline" | ||||
|             target="_blank" | ||||
|             rel="noopener noreferrer" | ||||
|             href="https://remixicon.com">https://remixicon.com</a | ||||
|           > | ||||
|         </li> | ||||
|       </ul> | ||||
|     </div> | ||||
|   </div> | ||||
| </div> | ||||
| <section class="container p-5"> | ||||
| 	<h4 class="mb-1 text-3xl font-extrabold leading-tight font-mono"> | ||||
| 		{$_("about")} | ||||
| 	</h4> | ||||
| 	<p class="mt-2 mb-2"> | ||||
| 		Lauf für Kaya! | ||||
| 		<strong class="font-medium"> | ||||
| 			{$_("by")} | ||||
| 			<a href="https://odit.services" class="underline">ODIT.Services</a> | ||||
| 		</strong> | ||||
| 		<br /> | ||||
| 		<span>{$_("lfk-is-os")}</span> | ||||
| 	</p> | ||||
| 	<h4 class="mb-1 text-3xl font-extrabold leading-tight font-mono"> | ||||
| 		{$_("credits")} | ||||
| 	</h4> | ||||
| 	<p class="text-left">{$_("oss_credit_description")}</p> | ||||
| 	<div class="mt-5 overflow-x-auto"> | ||||
| 		{#await license_promise} | ||||
| 			<p>{$_("licenses-are-being-loaded")}</p> | ||||
| 		{:then} | ||||
| 			<table class="font-mono"> | ||||
| 				<thead class="border-b border-gray-400"> | ||||
| 					<tr class="odd:bg-white even:bg-gray-100"> | ||||
| 						<th>{$_("dependency_name")}</th> | ||||
| 						<th>{$_("license")}</th> | ||||
| 						<th>{$_("repo_link")}</th> | ||||
| 						<th>{$_("installed-version")}</th> | ||||
| 						<th>{$_("author")}</th> | ||||
| 					</tr> | ||||
| 				</thead> | ||||
| 				<tbody> | ||||
| 					{#each licenses as l} | ||||
| 						<tr class="odd:bg-white even:bg-gray-100 *:p-2"> | ||||
| 							<td>{l.name}</td> | ||||
| 							<td> | ||||
| 								<button | ||||
| 									class="underline cursor-pointer" | ||||
| 									on:click={() => { | ||||
| 										modal_open = true; | ||||
| 										currentlicense = l.name + "@" + l.version; | ||||
| 										licensetext = | ||||
| 											l.licensetext || $_("no-license-text-could-be-found"); | ||||
| 									}}>{l.license || "?"}</button | ||||
| 								> | ||||
| 							</td> | ||||
| 							<td> | ||||
| 								{(l.repo?.url || l.repo) | ||||
| 									.replace("git+", "") | ||||
| 									.replace("git://", "")} | ||||
| 							</td> | ||||
| 							<td>{l.version || "?"}</td> | ||||
| 							<td>{l.author?.name || l.author || "?"}</td> | ||||
| 						</tr> | ||||
| 					{/each} | ||||
| 				</tbody> | ||||
| 			</table> | ||||
| 		{: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} | ||||
| 	</div> | ||||
| 	<div class="w-full mt-8"> | ||||
| 		<p class="font-medium">{$_("icon-image-credits")}</p> | ||||
| 		<ul class="list-disc ml-6"> | ||||
| 			<li> | ||||
| 				<a | ||||
| 					class="underline" | ||||
| 					target="_blank" | ||||
| 					rel="noopener noreferrer" | ||||
| 					href="https://storyset.com">https://storyset.com</a | ||||
| 				> | ||||
| 			</li> | ||||
| 			<li> | ||||
| 				<a | ||||
| 					class="underline" | ||||
| 					target="_blank" | ||||
| 					rel="noopener noreferrer" | ||||
| 					href="https://undraw.co">https://undraw.co</a | ||||
| 				> | ||||
| 			</li> | ||||
| 			<li> | ||||
| 				<a | ||||
| 					class="underline" | ||||
| 					target="_blank" | ||||
| 					rel="noopener noreferrer" | ||||
| 					href="https://remixicon.com">https://remixicon.com</a | ||||
| 				> | ||||
| 			</li> | ||||
| 		</ul> | ||||
| 	</div> | ||||
| </section> | ||||
|   | ||||
| @@ -132,7 +132,7 @@ | ||||
|           {#if delete_triggered} | ||||
|             <button | ||||
|               on:click={deleteGroup} | ||||
|               class="w-full 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 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|               class="w-full 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 sm:w-auto sm:text-sm" | ||||
|               >{$_("confirm-deletion")}</button | ||||
|             > | ||||
|             <button | ||||
| @@ -149,7 +149,7 @@ | ||||
|                 delete_triggered = true; | ||||
|               }} | ||||
|               type="button" | ||||
|               class="w-full 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 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|               class="w-full 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 sm:w-auto sm:text-sm" | ||||
|               >{$_("delete-group")}</button | ||||
|             > | ||||
|           {/if} | ||||
| @@ -160,7 +160,7 @@ | ||||
|             class:opacity-50={!save_enabled} | ||||
|             type="button" | ||||
|             on:click={submit} | ||||
|             class="w-full 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 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:w-auto sm:text-sm" | ||||
|             >{$_("save-changes")}</button | ||||
|           > | ||||
|         {/if} | ||||
|   | ||||
| @@ -143,13 +143,13 @@ | ||||
|             class:opacity-50={save_enabled} | ||||
|             type="button" | ||||
|             on:click={submit} | ||||
|             class="w-full 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 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:w-auto sm:text-sm" | ||||
|             >{$_("save-changes")}</button | ||||
|           > | ||||
|         {:else} | ||||
|           <button | ||||
|             type="button" | ||||
|             class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-yellow-600 text-base font-medium text-white hover:bg-yellow-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-yellow-500 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|             class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-yellow-600 text-base font-medium text-white hover:bg-yellow-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-yellow-500 sm:w-auto sm:text-sm" | ||||
|             >{$_("applying-changes")}</button | ||||
|           > | ||||
|         {/if} | ||||
| @@ -193,7 +193,7 @@ | ||||
|                       } | ||||
|                     }} | ||||
|                     type="button" | ||||
|                     class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-green-200 text-base font-medium text-black hover:bg-green-700 hover:text-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|                     class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-green-200 text-base font-medium text-black hover:bg-green-700 hover:text-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500 sm:w-auto sm:text-sm" | ||||
|                     >+</button | ||||
|                   > | ||||
|                 </p> | ||||
| @@ -233,7 +233,7 @@ | ||||
|                     } | ||||
|                   }} | ||||
|                   type="button" | ||||
|                   class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-300 text-base font-medium text-black hover:bg-red-700 hover:text-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-500 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|                   class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-300 text-base font-medium text-black hover:bg-red-700 hover:text-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-500 sm:w-auto sm:text-sm" | ||||
|                   >-</button | ||||
|                 > | ||||
|               </p> | ||||
|   | ||||
| @@ -8,20 +8,20 @@ | ||||
| </script> | ||||
|  | ||||
| <section class="container p-5"> | ||||
|   <span class="mb-1 text-3xl font-extrabold leading-tight"> | ||||
|   <h4 class="mb-1 text-3xl font-extrabold leading-tight font-mono"> | ||||
|     {$_("user-groups")} | ||||
|     {#if store.state.jwtinfo.userdetails.permissions.includes("USERGROUP:CREATE")} | ||||
|       <button | ||||
|         on:click={() => { | ||||
|           modal_open = true; | ||||
|         }} | ||||
|         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" | ||||
|       > | ||||
|         {$_("add-user-group")} | ||||
|       </button> | ||||
|     {/if} | ||||
|   </span> | ||||
|   </h4> | ||||
|   {#if store.state.jwtinfo.userdetails.permissions.includes("USERGROUP:CREATE")} | ||||
|     <button | ||||
|       on:click={() => { | ||||
|         modal_open = true; | ||||
|       }} | ||||
|       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:w-auto sm:text-sm" | ||||
|     > | ||||
|       {$_("add-user-group")} | ||||
|     </button> | ||||
|   {/if} | ||||
|   <UserGroupsOverview bind:current_groups /> | ||||
| </section> | ||||
|  | ||||
|   | ||||
| @@ -31,7 +31,7 @@ | ||||
|         bind:value={searchvalue} | ||||
|         placeholder={$_("datatable.search")} | ||||
|         aria-label={$_("datatable.search")} | ||||
|         class="mb-4" | ||||
|         class="mb-2 w-full sm:w-auto mt-1 sm:mt-0 p-2 rounded-md border" | ||||
|       /> | ||||
|       <div | ||||
|         class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll" | ||||
|   | ||||
| @@ -163,7 +163,7 @@ | ||||
|               import_modal_open = true; | ||||
|             }} | ||||
|             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:w-auto sm:text-sm" | ||||
|           > | ||||
|             {$_("import-runners")} | ||||
|           </button> | ||||
| @@ -172,7 +172,7 @@ | ||||
|           {#if delete_triggered} | ||||
|             <button | ||||
|               on:click={deleteOrganization} | ||||
|               class="w-full 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 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|               class="w-full 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 sm:w-auto sm:text-sm" | ||||
|               >{$_("confirm-delete")}</button | ||||
|             > | ||||
|             <button | ||||
| @@ -189,7 +189,7 @@ | ||||
|                 delete_triggered = true; | ||||
|               }} | ||||
|               type="button" | ||||
|               class="w-full 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 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|               class="w-full 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 sm:w-auto sm:text-sm" | ||||
|               >{$_("delete-organization")}</button | ||||
|             > | ||||
|           {/if} | ||||
| @@ -200,7 +200,7 @@ | ||||
|             disabled={!save_enabled} | ||||
|             class:opacity-50={!save_enabled} | ||||
|             type="button" | ||||
|             class="w-full 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 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:w-auto sm:text-sm" | ||||
|             >{$_("save-changes")}</button | ||||
|           > | ||||
|         {/if} | ||||
|   | ||||
| @@ -58,7 +58,7 @@ | ||||
|         bind:value={searchvalue} | ||||
|         placeholder={$_("datatable.search")} | ||||
|         aria-label={$_("datatable.search")} | ||||
|         class="mb-4" | ||||
|         class="mb-2 w-full sm:w-auto mt-1 sm:mt-0 p-2 rounded-md border" | ||||
|       /> | ||||
|       <div class="h-12"> | ||||
|         <GenerateSponsoringContracts | ||||
|   | ||||
| @@ -10,31 +10,31 @@ | ||||
| </script> | ||||
|  | ||||
| <section class="container p-5"> | ||||
|   <span class="mb-1 text-3xl font-extrabold leading-tight"> | ||||
|   <h4 class="mb-1 text-3xl font-extrabold leading-tight font-mono"> | ||||
|     {$_("organizations")} | ||||
|     {#if store.state.jwtinfo.userdetails.permissions.includes("ORGANIZATION:CREATE")} | ||||
|       <button | ||||
|         on:click={() => { | ||||
|           modal_open = true; | ||||
|         }} | ||||
|         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" | ||||
|       > | ||||
|         {$_("create-organization")} | ||||
|       </button> | ||||
|     {/if} | ||||
|     {#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:IMPORT")} | ||||
|       <button | ||||
|         on:click={() => { | ||||
|           import_modal_open = true; | ||||
|         }} | ||||
|         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" | ||||
|       > | ||||
|         {$_("import-runners")} | ||||
|       </button> | ||||
|     {/if} | ||||
|   </span> | ||||
|   </h4> | ||||
|   {#if store.state.jwtinfo.userdetails.permissions.includes("ORGANIZATION:CREATE")} | ||||
|     <button | ||||
|       on:click={() => { | ||||
|         modal_open = true; | ||||
|       }} | ||||
|       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:w-auto sm:text-sm mt-1 sm:mt-0" | ||||
|     > | ||||
|       {$_("create-organization")} | ||||
|     </button> | ||||
|   {/if} | ||||
|   {#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:IMPORT")} | ||||
|     <button | ||||
|       on:click={() => { | ||||
|         import_modal_open = true; | ||||
|       }} | ||||
|       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:w-auto sm:text-sm mt-1 sm:mt-0" | ||||
|     > | ||||
|       {$_("import-runners")} | ||||
|     </button> | ||||
|   {/if} | ||||
|   <OrgOverview bind:current_organizations /> | ||||
| </section> | ||||
|  | ||||
| @@ -48,7 +48,6 @@ | ||||
|     passed_org={{}} | ||||
|     passed_orgs={current_organizations} | ||||
|     opened_from="OrgOverview" | ||||
|     current_runners={[]} | ||||
|     bind:import_modal_open | ||||
|   /> | ||||
| {/if} | ||||
|   | ||||
| @@ -149,7 +149,7 @@ | ||||
|           {#if delete_triggered} | ||||
|             <button | ||||
|               on:click={deleteRunner} | ||||
|               class="w-full 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 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|               class="w-full 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 sm:w-auto sm:text-sm" | ||||
|               >{$_("confirm-deletion")}</button | ||||
|             > | ||||
|             <button | ||||
| @@ -175,7 +175,7 @@ | ||||
|                 delete_triggered = true; | ||||
|               }} | ||||
|               type="button" | ||||
|               class="w-full 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 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|               class="w-full 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 sm:w-auto sm:text-sm" | ||||
|               >{$_("delete-runner")}</button | ||||
|             > | ||||
|           {/if} | ||||
| @@ -186,7 +186,7 @@ | ||||
|             class:opacity-50={!save_enabled} | ||||
|             type="button" | ||||
|             on:click={submit} | ||||
|             class="w-full 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 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:w-auto sm:text-sm" | ||||
|             >{$_("save-changes")}</button | ||||
|           > | ||||
|         {/if} | ||||
|   | ||||
| @@ -11,29 +11,29 @@ | ||||
| </script> | ||||
|  | ||||
| <section class="container p-5"> | ||||
|   <span class="mb-1 text-3xl font-extrabold leading-tight"> | ||||
|   <h4 class="mb-1 text-3xl font-extrabold leading-tight font-mono"> | ||||
|     {$_("runners")} | ||||
|     {#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:CREATE")} | ||||
|       <button | ||||
|         on:click={() => { | ||||
|           modal_open = true; | ||||
|         }} | ||||
|         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" | ||||
|       > | ||||
|         {$_("laeufer-hinzufuegen")} | ||||
|       </button> | ||||
|       <button | ||||
|         on:click={() => { | ||||
|           import_modal_open = true; | ||||
|         }} | ||||
|         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" | ||||
|       > | ||||
|         {$_("import-runners")} | ||||
|       </button> | ||||
|     {/if} | ||||
|   </span> | ||||
|   </h4> | ||||
|   {#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:CREATE")} | ||||
|     <button | ||||
|       on:click={() => { | ||||
|         modal_open = true; | ||||
|       }} | ||||
|       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:w-auto sm:text-sm mt-1 sm:mt-0" | ||||
|     > | ||||
|       {$_("laeufer-hinzufuegen")} | ||||
|     </button> | ||||
|     <button | ||||
|       on:click={() => { | ||||
|         import_modal_open = true; | ||||
|       }} | ||||
|       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:w-auto sm:text-sm mt-1 sm:mt-0" | ||||
|     > | ||||
|       {$_("import-runners")} | ||||
|     </button> | ||||
|   {/if} | ||||
|   <RunnersOverview bind:current_runners bind:addRunners /> | ||||
| </section> | ||||
|  | ||||
|   | ||||
| @@ -9,20 +9,20 @@ | ||||
| </script> | ||||
|  | ||||
| <section class="container p-5"> | ||||
|   <span class="mb-1 text-3xl font-extrabold leading-tight"> | ||||
|   <h4 class="mb-1 text-3xl font-extrabold leading-tight font-mono"> | ||||
|     {$_("scans")} | ||||
|     {#if store.state.jwtinfo.userdetails.permissions.includes("SCAN:CREATE")} | ||||
|       <button | ||||
|         on:click={() => { | ||||
|           modal_open = true; | ||||
|         }} | ||||
|         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" | ||||
|       > | ||||
|         {$_("add-scan")} | ||||
|       </button> | ||||
|     {/if} | ||||
|   </span> | ||||
|   </h4> | ||||
|   {#if store.state.jwtinfo.userdetails.permissions.includes("SCAN:CREATE")} | ||||
|     <button | ||||
|       on:click={() => { | ||||
|         modal_open = true; | ||||
|       }} | ||||
|       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:w-auto sm:text-sm" | ||||
|     > | ||||
|       {$_("add-scan")} | ||||
|     </button> | ||||
|   {/if} | ||||
|   <ScansOverview bind:current_scans bind:addScans /> | ||||
| </section> | ||||
|  | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|  | ||||
| <div class="text-center items-center justify-center"> | ||||
|   <p class="mb-16 text-lg text-gray-500"> | ||||
|     <img class="m-auto" style="height:15rem" src={scans_empty} alt="" /> | ||||
|     <img class="m-auto mt-2" style="height:15rem" src={scans_empty} alt="" /> | ||||
|     <span class="font-bold">{$_("there-are-no-scans-yet")}</span><br /> | ||||
|     <span>{$_("add-your-fist-scan")}</span> | ||||
|   </p> | ||||
|   | ||||
| @@ -220,7 +220,7 @@ | ||||
|     {#if selected.length > 0} | ||||
|       <button | ||||
|         type="button" | ||||
|         class="w-full 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 sm:ml-3 sm:w-auto sm:text-sm inline-flex" | ||||
|         class="w-full 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 sm:w-auto sm:text-sm inline-flex" | ||||
|         id="options-menu" | ||||
|         on:click={async () => { | ||||
|           const prom = []; | ||||
|   | ||||
| @@ -111,7 +111,7 @@ | ||||
|           {#if delete_triggered} | ||||
|             <button | ||||
|               on:click={deleteStation} | ||||
|               class="w-full 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 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|               class="w-full 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 sm:w-auto sm:text-sm" | ||||
|               >{$_("confirm-deletion")}</button | ||||
|             > | ||||
|             <button | ||||
| @@ -128,7 +128,7 @@ | ||||
|                 delete_triggered = true; | ||||
|               }} | ||||
|               type="button" | ||||
|               class="w-full 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 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|               class="w-full 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 sm:w-auto sm:text-sm" | ||||
|               >{$_("delete-station")}</button | ||||
|             > | ||||
|           {/if} | ||||
| @@ -139,7 +139,7 @@ | ||||
|             class:opacity-50={!save_enabled} | ||||
|             type="button" | ||||
|             on:click={submit} | ||||
|             class="w-full 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 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:w-auto sm:text-sm" | ||||
|             >{$_("save-changes")}</button | ||||
|           > | ||||
|         {/if} | ||||
|   | ||||
| @@ -24,20 +24,20 @@ | ||||
| </script> | ||||
|  | ||||
| <section class="container p-5"> | ||||
| 	<span class="mb-1 text-3xl font-extrabold leading-tight"> | ||||
| 	<h4 class="mb-1 text-3xl font-extrabold leading-tight font-mono"> | ||||
| 		{$_("scanstations")} | ||||
| 		{#if store.state.jwtinfo.userdetails.permissions.includes("STATION:CREATE")} | ||||
| 			<button | ||||
| 				on:click={() => { | ||||
| 					modal_open = true; | ||||
| 				}} | ||||
| 				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" | ||||
| 			> | ||||
| 				{$_("create-a-new-scanstation")} | ||||
| 			</button> | ||||
| 		{/if} | ||||
| 	</span> | ||||
| 	</h4> | ||||
| 	{#if store.state.jwtinfo.userdetails.permissions.includes("STATION:CREATE")} | ||||
| 		<button | ||||
| 			on:click={() => { | ||||
| 				modal_open = true; | ||||
| 			}} | ||||
| 			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:w-auto sm:text-sm" | ||||
| 		> | ||||
| 			{$_("create-a-new-scanstation")} | ||||
| 		</button> | ||||
| 	{/if} | ||||
| 	<ConfirmScanStationDeletion | ||||
| 		on:cancelDelete={(event) => { | ||||
| 			modal_open = false; | ||||
| @@ -64,7 +64,7 @@ | ||||
| 					bind:value={searchvalue} | ||||
| 					placeholder={$_("datatable.search")} | ||||
| 					aria-label={$_("datatable.search")} | ||||
| 					class="mb-4" | ||||
| 					class="mb-2 w-full sm:w-auto mt-1 sm:mt-0 p-2 rounded-md border" | ||||
| 				/> | ||||
| 				<div | ||||
| 					class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll" | ||||
|   | ||||
| @@ -169,7 +169,7 @@ | ||||
|                   disabled={!save_enabled} | ||||
|                   class:opacity-50={!save_enabled} | ||||
|                   on:click={submit} | ||||
|                   class="w-full 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 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:w-auto sm:text-sm" | ||||
|                 > | ||||
|                   {$_("save-changes")} | ||||
|                 </button> | ||||
| @@ -233,7 +233,7 @@ | ||||
|                   disabled={!update_password_enabled} | ||||
|                   class:opacity-50={!update_password_enabled} | ||||
|                   on:click={changePassword} | ||||
|                   class="w-full 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 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:w-auto sm:text-sm" | ||||
|                 > | ||||
|                   {$_("update-password")} | ||||
|                 </button> | ||||
|   | ||||
| @@ -1,26 +1,26 @@ | ||||
| <script> | ||||
|   import { _ } from "svelte-i18n"; | ||||
| 	import { _ } from "svelte-i18n"; | ||||
|  | ||||
|   export let detailsLink; | ||||
|   export let detailsAction; | ||||
|   export let deleteEnabled; | ||||
|   export let deleteAction; | ||||
| 	export let detailsLink = null; | ||||
| 	export let detailsAction = null; | ||||
| 	export let deleteEnabled; | ||||
| 	export let deleteAction; | ||||
| </script> | ||||
|  | ||||
| {#if detailsLink} | ||||
|   <a href={detailsLink} class="text-indigo-600 hover:text-indigo-900" | ||||
|     >{$_("details")}</a | ||||
|   > | ||||
| 	<a href={detailsLink} class="text-indigo-600 hover:text-indigo-900" | ||||
| 		>{$_("details")}</a | ||||
| 	> | ||||
| {:else if detailsAction} | ||||
|   <button on:click={detailsAction} class="text-indigo-600 hover:text-indigo-900" | ||||
|     >{$_("details")}</button | ||||
|   > | ||||
| 	<button on:click={detailsAction} class="text-indigo-600 hover:text-indigo-900" | ||||
| 		>{$_("details")}</button | ||||
| 	> | ||||
| {/if} | ||||
| {#if deleteEnabled} | ||||
|   <button | ||||
|     tabindex="0" | ||||
|     on:click={deleteAction} | ||||
|     class="ml-4 text-red-600 hover:text-red-900 cursor-pointer" | ||||
|     >{$_("delete")}</button | ||||
|   > | ||||
| 	<button | ||||
| 		tabindex="0" | ||||
| 		on:click={deleteAction} | ||||
| 		class="ml-4 text-red-600 hover:text-red-900 cursor-pointer" | ||||
| 		>{$_("delete")}</button | ||||
| 	> | ||||
| {/if} | ||||
|   | ||||
| @@ -5,14 +5,14 @@ | ||||
|   import { createEventDispatcher } from "svelte"; | ||||
|   import toast from "svelte-french-toast"; | ||||
|   export let modal_open; | ||||
|   export let delete_station; | ||||
|   export let delete_client; | ||||
|   const dispatch = createEventDispatcher(); | ||||
|   function cancelDelete() { | ||||
|     modal_open = false; | ||||
|     dispatch("cancelDelete", { id: delete_station.id }); | ||||
|     dispatch("cancelDelete", { id: delete_client.id }); | ||||
|   } | ||||
|   function deleteClient() { | ||||
|     StatsClientService.statsClientControllerRemove(delete_station.id, true) | ||||
|     StatsClientService.statsClientControllerRemove(delete_client.id, true) | ||||
|       .then((resp) => { | ||||
|         toast($_("statsclient-deleted")); | ||||
|         location.replace("./"); | ||||
|   | ||||
| @@ -82,7 +82,7 @@ | ||||
|           {#if delete_triggered} | ||||
|             <button | ||||
|               on:click={deleteClient} | ||||
|               class="w-full 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 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|               class="w-full 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 sm:w-auto sm:text-sm" | ||||
|               >{$_("confirm-deletion")}</button | ||||
|             > | ||||
|             <button | ||||
| @@ -99,7 +99,7 @@ | ||||
|                 delete_triggered = true; | ||||
|               }} | ||||
|               type="button" | ||||
|               class="w-full 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 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|               class="w-full 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 sm:w-auto sm:text-sm" | ||||
|               >{$_("delete-statsclient")}</button | ||||
|             > | ||||
|           {/if} | ||||
|   | ||||
| @@ -1,44 +1,39 @@ | ||||
| <script> | ||||
|   import { _ } from "svelte-i18n"; | ||||
|   import store from "../../store"; | ||||
|   import AddStatsClientModal from "./AddStatsClientModal.svelte"; | ||||
|   import CopyStatsClientTokenModal from "./CopyStatsClientTokenModal.svelte"; | ||||
|   import StatsClientsOverview from "./StatsClientsOverview.svelte"; | ||||
|   export let modal_open = false; | ||||
|   export let copy_modal_open = false; | ||||
|   export let new_client = {}; | ||||
|   let current_clients = []; | ||||
| 	import { _ } from "svelte-i18n"; | ||||
| 	import store from "../../store"; | ||||
| 	import AddStatsClientModal from "./AddStatsClientModal.svelte"; | ||||
| 	import CopyStatsClientTokenModal from "./CopyStatsClientTokenModal.svelte"; | ||||
| 	import StatsClientsOverview from "./StatsClientsOverview.svelte"; | ||||
| 	export let modal_open = false; | ||||
| 	export let copy_modal_open = false; | ||||
| 	export let new_client = {}; | ||||
| 	let current_clients = []; | ||||
| </script> | ||||
|  | ||||
| <section class="container p-5"> | ||||
|   <span class="mb-1 text-3xl font-extrabold leading-tight"> | ||||
|     {$_("statsclients")} | ||||
|     {#if store.state.jwtinfo.userdetails.permissions.includes("STATSCLIENT:CREATE")} | ||||
|       <button | ||||
|         on:click={() => { | ||||
|           modal_open = true; | ||||
|         }} | ||||
|         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" | ||||
|       > | ||||
|         {$_("create-a-new-statsclient")} | ||||
|       </button> | ||||
|     {/if} | ||||
|   </span> | ||||
|   <StatsClientsOverview | ||||
|     bind:current_clients | ||||
|     bind:modal_open | ||||
|     bind:new_client | ||||
|     bind:copy_modal_open | ||||
|   /> | ||||
| 	<h4 class="mb-1 text-3xl font-extrabold leading-tight font-mono"> | ||||
| 		{$_("statsclients")} | ||||
| 	</h4> | ||||
| 	{#if store.state.jwtinfo.userdetails.permissions.includes("STATSCLIENT:CREATE")} | ||||
| 		<button | ||||
| 			on:click={() => { | ||||
| 				modal_open = true; | ||||
| 			}} | ||||
| 			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:w-auto sm:text-sm" | ||||
| 		> | ||||
| 			{$_("create-a-new-statsclient")} | ||||
| 		</button> | ||||
| 	{/if} | ||||
| 	<StatsClientsOverview bind:current_clients /> | ||||
| </section> | ||||
|  | ||||
| {#if store.state.jwtinfo.userdetails.permissions.includes("STATSCLIENT:CREATE")} | ||||
|   <AddStatsClientModal | ||||
|     bind:modal_open | ||||
|     bind:current_clients | ||||
|     bind:new_client | ||||
|     bind:copy_modal_open | ||||
|   /> | ||||
|   <CopyStatsClientTokenModal bind:copy_modal_open bind:new_client /> | ||||
| 	<AddStatsClientModal | ||||
| 		bind:modal_open | ||||
| 		bind:current_clients | ||||
| 		bind:new_client | ||||
| 		bind:copy_modal_open | ||||
| 	/> | ||||
| 	<CopyStatsClientTokenModal bind:copy_modal_open bind:new_client /> | ||||
| {/if} | ||||
|   | ||||
| @@ -43,7 +43,7 @@ | ||||
|         bind:value={searchvalue} | ||||
|         placeholder={$_("datatable.search")} | ||||
|         aria-label={$_("datatable.search")} | ||||
|         class="mb-4" | ||||
|         class="mb-2 w-full sm:w-auto mt-1 sm:mt-0 p-2 rounded-md border" | ||||
|       /> | ||||
|       <div | ||||
|         class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll" | ||||
|   | ||||
| @@ -126,7 +126,7 @@ | ||||
|               import_modal_open = true; | ||||
|             }} | ||||
|             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:w-auto sm:text-sm" | ||||
|           > | ||||
|             {$_("import-runners")} | ||||
|           </button> | ||||
| @@ -135,7 +135,7 @@ | ||||
|           {#if delete_triggered} | ||||
|             <button | ||||
|               on:click={deleteTeam} | ||||
|               class="w-full 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 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|               class="w-full 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 sm:w-auto sm:text-sm" | ||||
|               >{$_("confirm-delete")}</button | ||||
|             > | ||||
|             <button | ||||
| @@ -152,7 +152,7 @@ | ||||
|                 delete_triggered = true; | ||||
|               }} | ||||
|               type="button" | ||||
|               class="w-full 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 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|               class="w-full 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 sm:w-auto sm:text-sm" | ||||
|               >{$_("delete-team")}</button | ||||
|             > | ||||
|           {/if} | ||||
| @@ -163,7 +163,7 @@ | ||||
|             disabled={!save_enabled} | ||||
|             class:opacity-50={!save_enabled} | ||||
|             type="button" | ||||
|             class="w-full 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 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:w-auto sm:text-sm" | ||||
|             >{$_("save-changes")}</button | ||||
|           > | ||||
|         {/if} | ||||
|   | ||||
| @@ -8,20 +8,20 @@ | ||||
| </script> | ||||
|  | ||||
| <section class="container p-5"> | ||||
|   <span class="mb-1 text-3xl font-extrabold leading-tight"> | ||||
|   <h4 class="mb-1 text-3xl font-extrabold leading-tight font-mono"> | ||||
|     {$_("teams")} | ||||
|     {#if store.state.jwtinfo.userdetails.permissions.includes("TEAM:CREATE")} | ||||
|       <button | ||||
|         on:click={() => { | ||||
|           modal_open = true; | ||||
|         }} | ||||
|         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" | ||||
|       > | ||||
|         {$_("create-team")} | ||||
|       </button> | ||||
|     {/if} | ||||
|   </span> | ||||
|   </h4> | ||||
|   {#if store.state.jwtinfo.userdetails.permissions.includes("TEAM:CREATE")} | ||||
|     <button | ||||
|       on:click={() => { | ||||
|         modal_open = true; | ||||
|       }} | ||||
|       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:w-auto sm:text-sm" | ||||
|     > | ||||
|       {$_("create-team")} | ||||
|     </button> | ||||
|   {/if} | ||||
|   <TeamsOverview bind:current_teams /> | ||||
| </section> | ||||
|  | ||||
|   | ||||
| @@ -54,7 +54,7 @@ | ||||
|         bind:value={searchvalue} | ||||
|         placeholder={$_("datatable.search")} | ||||
|         aria-label={$_("datatable.search")} | ||||
|         class="mb-4" | ||||
|         class="mb-2 w-full sm:w-auto mt-1 sm:mt-0 p-2 rounded-md border" | ||||
|       /> | ||||
|       <div class="h-12"> | ||||
|         <GenerateSponsoringContracts | ||||
|   | ||||
| @@ -19,18 +19,18 @@ | ||||
| </script> | ||||
|  | ||||
| <section class="container p-5"> | ||||
|   <span class="mb-1 text-3xl font-extrabold leading-tight"> | ||||
|     Tracks | ||||
|     <button | ||||
|       on:click={() => { | ||||
|         modal_open = true; | ||||
|       }} | ||||
|       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" | ||||
|     > | ||||
|       {$_("create-track")} | ||||
|     </button> | ||||
|   </span> | ||||
|   <h4 class="mb-1 text-3xl font-extrabold leading-tight font-mono"> | ||||
|     {$_("tracks")} | ||||
|   </h4> | ||||
|   <button | ||||
|     on:click={() => { | ||||
|       modal_open = true; | ||||
|     }} | ||||
|     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:w-auto sm:text-sm" | ||||
|   > | ||||
|     {$_("create-track")} | ||||
|   </button> | ||||
|   {#await tracks_promise} | ||||
|     <div | ||||
|       class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2" | ||||
|   | ||||
| @@ -162,7 +162,7 @@ | ||||
|           {#if delete_triggered} | ||||
|             <button | ||||
|               on:click={deleteUser} | ||||
|               class="w-full 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 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|               class="w-full 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 sm:w-auto sm:text-sm" | ||||
|               >{$_("confirm-delete")}</button | ||||
|             > | ||||
|             <button | ||||
| @@ -179,7 +179,7 @@ | ||||
|                 delete_triggered = true; | ||||
|               }} | ||||
|               type="button" | ||||
|               class="w-full 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 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|               class="w-full 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 sm:w-auto sm:text-sm" | ||||
|               >{$_("delete-user")}</button | ||||
|             > | ||||
|           {/if} | ||||
| @@ -190,7 +190,7 @@ | ||||
|             class:opacity-50={!save_enabled} | ||||
|             type="button" | ||||
|             on:click={submit} | ||||
|             class="w-full 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 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:w-auto sm:text-sm" | ||||
|             >{$_("save-changes")}</button | ||||
|           > | ||||
|         {/if} | ||||
|   | ||||
| @@ -150,13 +150,13 @@ | ||||
|             class:opacity-50={save_enabled} | ||||
|             type="button" | ||||
|             on:click={submit} | ||||
|             class="w-full 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 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:w-auto sm:text-sm" | ||||
|             >{$_("save-changes")}</button | ||||
|           > | ||||
|         {:else} | ||||
|           <button | ||||
|             type="button" | ||||
|             class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-yellow-600 text-base font-medium text-white hover:bg-yellow-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-yellow-500 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|             class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-yellow-600 text-base font-medium text-white hover:bg-yellow-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-yellow-500 sm:w-auto sm:text-sm" | ||||
|             >{$_("applying-changes")}</button | ||||
|           > | ||||
|         {/if} | ||||
| @@ -203,7 +203,7 @@ | ||||
|                       } | ||||
|                     }} | ||||
|                     type="button" | ||||
|                     class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-green-200 text-base font-medium text-black hover:bg-green-700 hover:text-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|                     class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-green-200 text-base font-medium text-black hover:bg-green-700 hover:text-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500 sm:w-auto sm:text-sm" | ||||
|                     >+</button | ||||
|                   > | ||||
|                 </p> | ||||
| @@ -243,7 +243,7 @@ | ||||
|                     } | ||||
|                   }} | ||||
|                   type="button" | ||||
|                   class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-300 text-base font-medium text-black hover:bg-red-700 hover:text-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-500 sm:ml-3 sm:w-auto sm:text-sm" | ||||
|                   class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-300 text-base font-medium text-black hover:bg-red-700 hover:text-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-500 sm:w-auto sm:text-sm" | ||||
|                   >-</button | ||||
|                 > | ||||
|               </p> | ||||
|   | ||||
| @@ -8,20 +8,20 @@ | ||||
| </script> | ||||
|  | ||||
| <section class="container p-5"> | ||||
|   <span class="mb-1 text-3xl font-extrabold leading-tight"> | ||||
|   <h4 class="mb-1 text-3xl font-extrabold leading-tight font-mono"> | ||||
|     {$_("users")} | ||||
|     {#if store.state.jwtinfo.userdetails.permissions.includes("USER:CREATE")} | ||||
|       <button | ||||
|         on:click={() => { | ||||
|           modal_open = true; | ||||
|         }} | ||||
|         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" | ||||
|       > | ||||
|         {$_("create-user")} | ||||
|       </button> | ||||
|     {/if} | ||||
|   </span> | ||||
|   </h4> | ||||
|   {#if store.state.jwtinfo.userdetails.permissions.includes("USER:CREATE")} | ||||
|     <button | ||||
|       on:click={() => { | ||||
|         modal_open = true; | ||||
|       }} | ||||
|       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:w-auto sm:text-sm" | ||||
|     > | ||||
|       {$_("create-user")} | ||||
|     </button> | ||||
|   {/if} | ||||
|   <UsersOverview bind:current_users /> | ||||
| </section> | ||||
|  | ||||
|   | ||||
| @@ -37,7 +37,7 @@ | ||||
|         bind:value={searchvalue} | ||||
|         placeholder={$_("datatable.search")} | ||||
|         aria-label={$_("datatable.search")} | ||||
|         class="mb-4" | ||||
|         class="mb-2 w-full sm:w-auto mt-1 sm:mt-0 p-2 rounded-md border" | ||||
|       /> | ||||
|       <!-- {/if} --> | ||||
|       <!-- <button | ||||
| @@ -45,7 +45,7 @@ | ||||
|           advanced_search = !advanced_search; | ||||
|         }} | ||||
|         type="button" | ||||
|         class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-gray-600 text-base font-medium text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-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-gray-600 text-base font-medium text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-500 sm:w-auto sm:text-sm"> | ||||
|         {#if advanced_search} | ||||
|           toggle simple search | ||||
|         {:else}toggle advanced search{/if} | ||||
| @@ -105,12 +105,12 @@ | ||||
|                   <td class="px-6 py-4 whitespace-nowrap"> | ||||
|                     {#if u.enabled} | ||||
|                       <span | ||||
|                         class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800" | ||||
|                         class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full border 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" | ||||
|                         class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full border bg-red-100 text-red-800" | ||||
|                         >{$_("inactive")}</span | ||||
|                       > | ||||
|                     {/if} | ||||
| @@ -119,7 +119,7 @@ | ||||
|                     {#each u.groups as g} | ||||
|                       <a | ||||
|                         href="../groups/{g.id}" | ||||
|                         class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800" | ||||
|                         class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full border bg-gray-100 text-gray-800" | ||||
|                         >{g.name}</a | ||||
|                       > | ||||
|                     {/each} | ||||
|   | ||||
| @@ -112,7 +112,7 @@ | ||||
|     "create-a-new-scanstation": "Neue Station erstellen", | ||||
|     "create-a-new-statsclient": "Neuen Statsclient erstellen", | ||||
|     "create-a-new-team": "Erstelle ein neues Team", | ||||
|     "create-a-new-track": "Neuen Track erstellen", | ||||
|     "create-a-new-track": "Neue Laufstrecke erstellen", | ||||
|     "create-a-new-user": "Neuen Benutzer anlegen", | ||||
|     "create-a-new-user-group": "Erstelle eine neue Gruppe", | ||||
|     "create-and-generate-pdf": "Erstellen und PDF herunterladen", | ||||
| @@ -120,7 +120,7 @@ | ||||
|     "create-bulk-cards": "Blankokarten erstellen", | ||||
|     "create-organization": "Organisation erstellen", | ||||
|     "create-team": "Team erstellen", | ||||
|     "create-track": "Track erstellen", | ||||
|     "create-track": "Laufstrecke erstellen", | ||||
|     "create-user": "Benutzer anlegen", | ||||
|     "create-without-pdf": "Ohne PDF erstellen", | ||||
|     "created-blanco-cards": "Blankokarten wurden erstellt", | ||||
| @@ -454,20 +454,20 @@ | ||||
|     "total-paid-amount": "Gezahlt", | ||||
|     "total-scans": "Scans", | ||||
|     "total_donation_amount_in_eur": "Gesamtbetrag in €", | ||||
|     "track": "Track", | ||||
|     "track-added": "Track hinzugefügt", | ||||
|     "track-data-is-being-loaded": "Trackdaten werden geladen", | ||||
|     "track-deleted": "Track gelöscht", | ||||
|     "track-is-being-added": "Track wird hinzugefügt...", | ||||
|     "track-is-being-deleted": "Track wird gelöscht", | ||||
|     "track-is-being-updated": "Track wird aktualisiert...", | ||||
|     "track-length-in-m": "Tracklänge (in Metern)", | ||||
|     "track": "Laufstrecke", | ||||
|     "track-added": "Laufstrecke hinzugefügt", | ||||
|     "track-data-is-being-loaded": "Laufstrecke wird geladen", | ||||
|     "track-deleted": "Laufstrecke gelöscht", | ||||
|     "track-is-being-added": "Laufstrecke wird hinzugefügt...", | ||||
|     "track-is-being-deleted": "Laufstrecke wird gelöscht", | ||||
|     "track-is-being-updated": "Laufstrecke wird aktualisiert...", | ||||
|     "track-length-in-m": "Laufstrecke in Metern", | ||||
|     "track-length-must-be-greater-than-0": "Die Länge muss größer als 0 (Meter) sein", | ||||
|     "track-name": "Trackname", | ||||
|     "track-name": "Name der Laufstrecke", | ||||
|     "track-name-must-not-be-empty": "Der Name muss angegeben werden", | ||||
|     "track-updated": "Track aktualisiert", | ||||
|     "track-was-updated": "Track wurde aktualisiert", | ||||
|     "tracks": "Tracks", | ||||
|     "track-updated": "Laufstrecke aktualisiert", | ||||
|     "track-was-updated": "Laufstrecke wurde aktualisiert", | ||||
|     "tracks": "Laufstrecken", | ||||
|     "unpaid": "Offen", | ||||
|     "update-card": "Karte aktualisieren", | ||||
|     "update-password": "Passwort ändern", | ||||
|   | ||||
| @@ -1,3 +1,7 @@ | ||||
| @tailwind base; | ||||
| @tailwind components; | ||||
| .activenav { | ||||
|     @apply bg-gray-300; | ||||
|     @apply text-black; | ||||
| } | ||||
| @tailwind utilities; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user