diff --git a/.gitignore b/.gitignore index ac929a5d..b2496c6e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,5 @@ public/env.js public/sw.js public/index.html public/workbox-*.js -svelte.config.js \ No newline at end of file +svelte.config.js +public/index.html diff --git a/package.json b/package.json index 9a12930a..dfc78c94 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ }, "dependencies": { "@odit/lfk-client-js": "0.3.0", + "csvtojson": "^2.0.10", "filepond": "4.25.1", "gridjs": "3.2.2", "localforage": "1.9.0", @@ -23,7 +24,8 @@ "tailwindcss": "2.0.2", "tinro": "0.5.8", "toastify-js": "1.9.3", - "validator": "13.5.2" + "validator": "13.5.2", + "xlsx": "^0.16.9" }, "devDependencies": { "@odit/license-exporter": "0.0.9", diff --git a/public/index.html b/public/index.html deleted file mode 100644 index 1b0be8ea..00000000 --- a/public/index.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/App.svelte b/src/App.svelte index e6798d93..90ccbcef 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -48,6 +48,7 @@ OpenAPI.BASE = config.baseurl; import { register as registerSW } from "./swmodule"; import TeamDetail from "./components/TeamDetail.svelte"; + import RunnerDetail from "./components/RunnerDetail.svelte"; store.init(); registerSW(); @@ -81,8 +82,13 @@ - - + + + + + + + diff --git a/src/components/AddRunnerModal.svelte b/src/components/AddRunnerModal.svelte index 57573fd7..32c0da99 100644 --- a/src/components/AddRunnerModal.svelte +++ b/src/components/AddRunnerModal.svelte @@ -2,7 +2,11 @@ import { _ } from "svelte-i18n"; import { clickOutside } from "./outsideclick"; import { focusTrap } from "svelte-focus-trap"; - import { RunnerService, RunnerTeamService } from "@odit/lfk-client-js"; + import { + RunnerService, + RunnerTeamService, + RunnerOrganizationService, + } from "@odit/lfk-client-js"; import isEmail from "validator/es/lib/isEmail"; import isMobilePhone from "validator/es/lib/isMobilePhone"; import Toastify from "toastify-js"; @@ -14,9 +18,13 @@ let middlename_input; let phone_input; let email_input; - let groups = []; + let teams = []; RunnerTeamService.runnerTeamControllerGetAll().then((val) => { - groups = val; + teams = val; + }); + let orgs = []; + RunnerOrganizationService.runnerOrganizationControllerGetAll().then((val) => { + orgs = val; }); function focus(el) { el.focus(); @@ -146,11 +154,11 @@

- Create a new Runner + {$_('create-a-new-runner')}

- Please provide the required information to add a new runner. + {$_('please-provide-the-required-information-to-add-a-new-runner')}

@@ -215,13 +223,20 @@
+ class="block text-sm font-medium text-gray-700">{$_('team')}
@@ -243,8 +258,7 @@ {#if !isPhoneValidOrEmpty} - the provided phone number is invalid.
please enter a - valid international number... + {$_('the-provided-phone-number-is-invalid-less-than-br-greater-than-please-enter-a-valid-international-number')}
{/if}
diff --git a/src/components/ImportRunnerModal.svelte b/src/components/ImportRunnerModal.svelte new file mode 100644 index 00000000..6fa5f316 --- /dev/null +++ b/src/components/ImportRunnerModal.svelte @@ -0,0 +1,286 @@ + + +{#if import_modal_open} +
{ + import_modal_open = false; + }}> +
+ +
+{/if} diff --git a/src/components/OrgDetail.svelte b/src/components/OrgDetail.svelte index 0e9c7890..91db9aff 100644 --- a/src/components/OrgDetail.svelte +++ b/src/components/OrgDetail.svelte @@ -4,6 +4,7 @@ import Toastify from "toastify-js"; import store from "../store"; import ConfirmOrgDeletion from "./ConfirmOrgDeletion.svelte"; + import ImportRunnerModal from "./ImportRunnerModal.svelte"; import PromiseError from "./PromiseError.svelte"; $: delete_triggered = false; $: save_enabled = !data_changed; @@ -64,14 +65,33 @@ } else { } } + export let import_modal_open = false; + { + import_modal_open = false; + }} + passed_orgs={[]} + passed_org={orgdata} + opened_from="OrgDetail" + bind:import_modal_open /> {#if data_loaded}
{original.name} + {#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:IMPORT')} + + {/if} {#if store.state.jwtinfo.userdetails.permissions.includes('USER:DELETE')} {#if delete_triggered} {/if} + {#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:IMPORT')} + + {/if}

manage runner organizations

@@ -28,4 +39,12 @@ {#if store.state.jwtinfo.userdetails.permissions.includes('ORGANIZATION:CREATE')} + { + import_modal_open = false; + }} + passed_org={{}} + passed_orgs={current_organizations} + opened_from="OrgOverview" + bind:import_modal_open /> {/if} diff --git a/src/components/RunnerDetail.svelte b/src/components/RunnerDetail.svelte new file mode 100644 index 00000000..7ff0ba37 --- /dev/null +++ b/src/components/RunnerDetail.svelte @@ -0,0 +1,264 @@ + + +{#await runner_promise} + +{:then} +
+
+
+ +
+
+
+ {original_data.firstname} + {original_data.middlename || ''} + {original_data.lastname} + + {#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:DELETE')} + {#if delete_triggered} + + + {/if} + {#if !delete_triggered} + + {/if} + {/if} + {#if !delete_triggered} + + {/if} + +
+ +
+ + + {#if !isFirstnameValid} + + {$_('first-name-is-required')} + + {/if} +
+
+ + +
+
+ + + {#if !isLastnameValid} + + {$_('last-name-is-required')} + + {/if} +
+
+ + + {#if !isEmailValid} + + {$_('valid-email-is-required')} + + {/if} +
+
+ + +
+
+ {$_('group')} + +
+
+ {$_('distance')} +
+ {original_data.distance} km +
+
+{:catch error} + +{/await} diff --git a/src/components/Runners.svelte b/src/components/Runners.svelte index 35910eed..4e4f3eee 100644 --- a/src/components/Runners.svelte +++ b/src/components/Runners.svelte @@ -2,15 +2,17 @@ import { _ } from "svelte-i18n"; import store from "../store"; import AddRunnerModal from "./AddRunnerModal.svelte"; + import ImportRunnerModal from "./ImportRunnerModal.svelte"; import RunnersOverview from "./RunnersOverview.svelte"; - export let modal_open = false; let current_runners = []; + export let modal_open = false; + export let import_modal_open = false;
{$_('runners')} - {#if store.state.jwtinfo.userdetails.permissions.includes('USER:CREATE')} + {#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:CREATE')} + {/if} -

läuft bei ihnen

-{#if store.state.jwtinfo.userdetails.permissions.includes('USER:CREATE')} +{#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:CREATE')} + { + import_modal_open = false; + }} + passed_team={{}} + passed_orgs={[]} + passed_org={{}} + opened_from="RunnerOverview" + bind:import_modal_open /> {/if} diff --git a/src/components/RunnersOverview.svelte b/src/components/RunnersOverview.svelte index 2175cf6e..bf84213d 100644 --- a/src/components/RunnersOverview.svelte +++ b/src/components/RunnersOverview.svelte @@ -37,25 +37,25 @@ - Name + {$_('name')} - Contact Information + {$_('contact-information')} - Group + {$_('group')} - Distance in km + {$_('distance-in-km')} - Action + {$_('action')} @@ -69,8 +69,7 @@
-
+
{runner.firstname} {runner.middlename || ''} {runner.lastname} @@ -111,8 +110,7 @@ }); }} tabindex="0" - class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">Confirm - Delete + class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('confirm-delete')} {:else} Delete + class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('delete')} {/if} {/if} diff --git a/src/components/TeamDetail.svelte b/src/components/TeamDetail.svelte index e5f1e947..243c69b8 100644 --- a/src/components/TeamDetail.svelte +++ b/src/components/TeamDetail.svelte @@ -6,6 +6,7 @@ import { _ } from "svelte-i18n"; import Toastify from "toastify-js"; import store from "../store"; + import ImportRunnerModal from "./ImportRunnerModal.svelte"; import PromiseError from "./PromiseError.svelte"; import ConfirmTeamDeletion from "./ConfirmTeamDeletion.svelte"; export let params; @@ -16,6 +17,7 @@ [], false, ]; + export let import_modal_open = false; $: delete_triggered = false; $: save_enabled = !data_changed; $: data_loaded = false; @@ -71,12 +73,31 @@ } + { + import_modal_open = false; + }} + passed_team={teamdata} + passed_orgs={[]} + passed_org={{}} + opened_from="TeamDetail" + bind:import_modal_open /> {#if data_loaded}
{original.name} + {#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:IMPORT')} + + {/if} {#if store.state.jwtinfo.userdetails.permissions.includes('TEAM:DELETE')} {#if delete_triggered}