From bdc0de6adab2db95e6075a993bd50317e9e36eb5 Mon Sep 17 00:00:00 2001 From: Philipp Dormann Date: Fri, 15 Jan 2021 18:49:45 +0100 Subject: [PATCH 01/11] =?UTF-8?q?=E2=9C=A8=20added=20Org=20base=20componen?= =?UTF-8?q?ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ref #16 --- src/components/AddOrgModal.svelte | 166 +++++++++++++++++ src/components/OrgOverview.svelte | 151 ++++++++++++++++ src/components/Orgs.svelte | 28 ++- src/components/OrgsEmptyState.svelte | 15 ++ src/locales/en.json | 254 ++++++++++++++------------- 5 files changed, 483 insertions(+), 131 deletions(-) create mode 100644 src/components/AddOrgModal.svelte create mode 100644 src/components/OrgOverview.svelte create mode 100644 src/components/OrgsEmptyState.svelte diff --git a/src/components/AddOrgModal.svelte b/src/components/AddOrgModal.svelte new file mode 100644 index 00000000..1af6e0c6 --- /dev/null +++ b/src/components/AddOrgModal.svelte @@ -0,0 +1,166 @@ + + +{#if modal_open} +
{ + modal_open = false; + }}> +
+ +
+{/if} diff --git a/src/components/OrgOverview.svelte b/src/components/OrgOverview.svelte new file mode 100644 index 00000000..7b9a89ee --- /dev/null +++ b/src/components/OrgOverview.svelte @@ -0,0 +1,151 @@ + + +{#if store.state.jwtinfo.userdetails.permissions.includes('ORGANISATION:GET')} + {#await RunnerOrganisationService.runnerOrganisationControllerGetAll()} + + {:then orgs} + {#if orgs.length === 0} + + {:else} + +
+ + + + + + + + + + + {#each orgs as o} + {#if Object.values(o) + .toString() + .toLowerCase() + .includes(searchvalue)} + + + + + {#if active_deletes[o.id] === true} + + {:else} + + {/if} + + {/if} + {/each} + +
+ Name + + Address + + Contact + + Action +
+
+
+
+ {o.name} +
+
+
+
+
+
+
+ {#if o.address} + {JSON.stringify(o.address)} + {:else}no address specified{/if} +
+
+
+
+
+
+
+ {#if o.contact} + {JSON.stringify(o.contact)} + {:else}no contact specified{/if} +
+
+
+
+ + + + Edit + {#if store.state.jwtinfo.userdetails.permissions.includes('ORGANISATION:DELETE')} + + {/if} +
+
+ {/if} + {:catch error} +
+ + {$_('general_promise_error')} + {error} + +
+ {/await} +{/if} diff --git a/src/components/Orgs.svelte b/src/components/Orgs.svelte index 1ced1f5a..4571e8f4 100644 --- a/src/components/Orgs.svelte +++ b/src/components/Orgs.svelte @@ -1,13 +1,31 @@
- Orgs + {$_('organizations')} + {#if store.state.jwtinfo.userdetails.permissions.includes('ORGANISATION:CREATE')} + + {/if} -

- add, delete, edit organizations -

- +

manage runner organizations

+
+ +{#if store.state.jwtinfo.userdetails.permissions.includes('ORGANISATION:CREATE')} + +{/if} diff --git a/src/components/OrgsEmptyState.svelte b/src/components/OrgsEmptyState.svelte new file mode 100644 index 00000000..5e927dc9 --- /dev/null +++ b/src/components/OrgsEmptyState.svelte @@ -0,0 +1,15 @@ + + +
+

+ There are no organizations added yet.
+ Add your first organization +

+
+ + diff --git a/src/locales/en.json b/src/locales/en.json index 0c3b7555..82c38a96 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -1,127 +1,129 @@ { - "404message": "Sorry, the page you are looking for could not be found.", - "404title": "Error 404", - "about": "About", - "action": "Action", - "add-your-first-track": "Add your first track", - "application_name": "Lauf fΓΌr Kaya! - Admin", - "author": "Author", - "browse": "Browse", - "by": "by", - "cancel": "Cancel", - "cannot-reset-your-password-directly": "Bummer. We unfortunately cannot reset your password directly. Please send us a mail and confirm your identity", - "changelog": "Changelog", - "close": "Close", - "confirm-delete": "Confirm Delete", - "count_organizations": "# Organizations", - "count_teams": "# Teams", - "create": "Create", - "create-a-new-track": "Create a new Track", - "create-user": "Create User", - "credits": "Credits", - "dashboard-greeting": "hello there", - "dashboard-title": "Dashboard", - "datatable": { - "search": "πŸ” Search...", - "sort_column_ascending": "Sort column ascending", - "sort_column_descending": "Sort column descending", - "previous": "Previous", - "next": "Next", - "page": "Page", - "showing": "Showing", - "records": "Records", - "of": "of", - "to": "to", - "loading": "Loading...", - "no_matching_records_found": "No matching records found", - "an_error_happened_while_fetching_the_data": "An error happened while fetching the data" - }, - "delete-user": "Delete User", - "dependency_name": "Name", - "dont-have-your-email-connected": "Don't have your email connected?", - "dont-panic-were-resetting-it": "Don't panic, we're resetting it ✌", - "drag-and-drop-your-files-or": "Drag & Drop your files or", - "e-mail-adress": "E-Mail Adress", - "email_address_or_username": "Email / username", - "error_on_login": "Error on login", - "faq": "FAQ", - "filepond__abort": "Abort", - "filepond__cancel": "Cancel", - "filepond__error-during-load": "Error during load", - "filepond__error-during-remove": "Error during remove", - "filepond__error-during-revert": "Error during revert", - "filepond__error-during-upload": "Error during upload", - "filepond__field-contains-invalid-files": "Field contains invalid files", - "filepond__loading": "Loading", - "filepond__remove": "Remove", - "filepond__retry": "Retry", - "filepond__size-not-available": "Size not available", - "filepond__tap-to-cancel": "tap to cancel", - "filepond__tap-to-retry": "tap to retry", - "filepond__tap-to-undo": "tap to undo", - "filepond__undo": "Undo", - "filepond__upload": "Upload", - "filepond__upload-cancelled": "Upload cancelled", - "filepond__upload-complete": "Upload complete", - "filepond__uploading": "Uploading", - "filepond__waiting-for-size": "Waiting for size", - "first-name": "First name", - "first-name-is-required": "First Name is required", - "forgot_password?": "Forgot your password?", - "general-stats": "General Stats", - "general_promise_error": "😒 Error", - "goback": "Go Home", - "groups": "Groups", - "hallo": "hello", - "installed-version": "Installed version", - "invalid-mail-reset": "the provided email is invalid", - "last-name": "Last name", - "last-name-is-required": "Last Name is required", - "lfk-is-os": "The \"Lauf fΓΌr Kaya!\" Frontend is (like all other projects for the \"LfK!\" Also) an open source project.", - "license": "License", - "licenses-are-being-loaded": "Licenses are being loaded...", - "log_in": "Log in", - "log_in_to_your_account": "Log in to your account", - "login_is_checked": "Login is being checked...", - "logout": "Logout", - "mail-validation-in-progress": "mail validation in progress...", - "manage-admin-users": "manage admin users", - "middle-name": "Middle name", - "minimum-lap-time-in-s": "minimum lap time in s", - "no-license-text-could-be-found": "No license text could be found 😒", - "no-tracks-added-yet": "there are no tracks added yet.", - "orgs": "Orgs", - "oss_credit_description": "We use a lot of open source software on these projects, and would like to thank the following projects and contributors who help make open source great!", - "password": "Password", - "password-is-required": "Password is required", - "please-provide-the-required-information-to-add-a-new-track": "Please provide the required information to add a new track.", - "profile-picture": "Profile Picture", - "read-license": "Read License", - "register": "Register", - "repo_link": "Link", - "reset-my-password": "Reset my password", - "runners": "Runners", - "save-changes": "Save Changes", - "send-a-mail-to-lfk-odit-services": "send a mail to lfk@odit.services", - "settings": "Settings", - "signout": "Sign out", - "stats-are-being-loaded": "stats are being loaded...", - "teams": "Teams", - "this-might-take-a-moment": "This might take a moment πŸ‘€", - "total-distance": "total distance", - "total-donations": "total donations", - "total-scans": "total scans", - "track-added": "Track added", - "track-data-is-being-loaded": "Track data is being loaded", - "track-is-being-added": "Track is being added...", - "track-length-in-m": "Track Length in m", - "track-name": "Track name", - "tracks": "Tracks", - "updating-user": "updating user...", - "user-updated": "User updated", - "username": "Username", - "users": "Users", - "valid-email-is-required": "valid email is required", - "welcome_wavinghand": "Welcome πŸ‘‹", - "your_profile": "Your Profile" -} \ No newline at end of file + "404message": "Sorry, the page you are looking for could not be found.", + "404title": "Error 404", + "about": "About", + "action": "Action", + "add-your-first-track": "Add your first track", + "application_name": "Lauf fΓΌr Kaya! - Admin", + "author": "Author", + "browse": "Browse", + "by": "by", + "cancel": "Cancel", + "cannot-reset-your-password-directly": "Bummer. We unfortunately cannot reset your password directly. Please send us a mail and confirm your identity", + "changelog": "Changelog", + "close": "Close", + "confirm-delete": "Confirm Delete", + "count_organizations": "# Organizations", + "count_teams": "# Teams", + "create": "Create", + "create-a-new-track": "Create a new Track", + "create-user": "Create User", + "credits": "Credits", + "dashboard-greeting": "hello there", + "dashboard-title": "Dashboard", + "datatable": { + "search": "πŸ” Search...", + "sort_column_ascending": "Sort column ascending", + "sort_column_descending": "Sort column descending", + "previous": "Previous", + "next": "Next", + "page": "Page", + "showing": "Showing", + "records": "Records", + "of": "of", + "to": "to", + "loading": "Loading...", + "no_matching_records_found": "No matching records found", + "an_error_happened_while_fetching_the_data": "An error happened while fetching the data" + }, + "delete-user": "Delete User", + "dependency_name": "Name", + "dont-have-your-email-connected": "Don't have your email connected?", + "dont-panic-were-resetting-it": "Don't panic, we're resetting it ✌", + "drag-and-drop-your-files-or": "Drag & Drop your files or", + "e-mail-adress": "E-Mail Adress", + "email_address_or_username": "Email / username", + "error_on_login": "Error on login", + "faq": "FAQ", + "filepond__abort": "Abort", + "filepond__cancel": "Cancel", + "filepond__error-during-load": "Error during load", + "filepond__error-during-remove": "Error during remove", + "filepond__error-during-revert": "Error during revert", + "filepond__error-during-upload": "Error during upload", + "filepond__field-contains-invalid-files": "Field contains invalid files", + "filepond__loading": "Loading", + "filepond__remove": "Remove", + "filepond__retry": "Retry", + "filepond__size-not-available": "Size not available", + "filepond__tap-to-cancel": "tap to cancel", + "filepond__tap-to-retry": "tap to retry", + "filepond__tap-to-undo": "tap to undo", + "filepond__undo": "Undo", + "filepond__upload": "Upload", + "filepond__upload-cancelled": "Upload cancelled", + "filepond__upload-complete": "Upload complete", + "filepond__uploading": "Uploading", + "filepond__waiting-for-size": "Waiting for size", + "first-name": "First name", + "first-name-is-required": "First Name is required", + "forgot_password?": "Forgot your password?", + "general-stats": "General Stats", + "general_promise_error": "😒 Error", + "goback": "Go Home", + "groups": "Groups", + "hallo": "hello", + "installed-version": "Installed version", + "invalid-mail-reset": "the provided email is invalid", + "last-name": "Last name", + "last-name-is-required": "Last Name is required", + "lfk-is-os": "The \"Lauf fΓΌr Kaya!\" Frontend is (like all other projects for the \"LfK!\" Also) an open source project.", + "license": "License", + "licenses-are-being-loaded": "Licenses are being loaded...", + "log_in": "Log in", + "log_in_to_your_account": "Log in to your account", + "login_is_checked": "Login is being checked...", + "logout": "Logout", + "mail-validation-in-progress": "mail validation in progress...", + "manage-admin-users": "manage admin users", + "middle-name": "Middle name", + "minimum-lap-time-in-s": "minimum lap time in s", + "no-license-text-could-be-found": "No license text could be found 😒", + "no-tracks-added-yet": "there are no tracks added yet.", + "orgs": "Orgs", + "oss_credit_description": "We use a lot of open source software on these projects, and would like to thank the following projects and contributors who help make open source great!", + "password": "Password", + "password-is-required": "Password is required", + "please-provide-the-required-information-to-add-a-new-track": "Please provide the required information to add a new track.", + "profile-picture": "Profile Picture", + "read-license": "Read License", + "register": "Register", + "repo_link": "Link", + "reset-my-password": "Reset my password", + "runners": "Runners", + "save-changes": "Save Changes", + "send-a-mail-to-lfk-odit-services": "send a mail to lfk@odit.services", + "settings": "Settings", + "signout": "Sign out", + "stats-are-being-loaded": "stats are being loaded...", + "teams": "Teams", + "this-might-take-a-moment": "This might take a moment πŸ‘€", + "total-distance": "total distance", + "total-donations": "total donations", + "total-scans": "total scans", + "track-added": "Track added", + "track-data-is-being-loaded": "Track data is being loaded", + "track-is-being-added": "Track is being added...", + "track-length-in-m": "Track Length in m", + "track-name": "Track name", + "tracks": "Tracks", + "updating-user": "updating user...", + "user-updated": "User updated", + "username": "Username", + "users": "Users", + "valid-email-is-required": "valid email is required", + "welcome_wavinghand": "Welcome πŸ‘‹", + "your_profile": "Your Profile", + "organizations": "Organizations", + "create-organization": "Create Organization" +} From 7a09869b0ca9d5dd38cf0c0010b71ab9ce6c6f40 Mon Sep 17 00:00:00 2001 From: Philipp Dormann Date: Fri, 15 Jan 2021 19:14:46 +0100 Subject: [PATCH 02/11] =?UTF-8?q?=F0=9F=8F=AC=20OrgDetail=20ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ref #16 --- src/components/OrgDetail.svelte | 238 ++++++++++++++++++++---------- src/components/OrgOverview.svelte | 2 +- src/locales/en.json | 4 +- 3 files changed, 164 insertions(+), 80 deletions(-) diff --git a/src/components/OrgDetail.svelte b/src/components/OrgDetail.svelte index fc3107eb..9e116ce4 100644 --- a/src/components/OrgDetail.svelte +++ b/src/components/OrgDetail.svelte @@ -1,83 +1,165 @@ -
- - Orgs - -

- configure the tracks & minimum lap times -

-
-
- +{#if data_loaded} +
+
+ {data_original.name} + + {#if store.state.jwtinfo.userdetails.permissions.includes('USER:DELETE')} + {#if delete_triggered} + + + {/if} + {#if !delete_triggered} + + {/if} + {/if} + {#if !delete_triggered} + + {/if} +
-
-
+
+
+ +
+
+
+ + +
+
+ + +
+
+ + +
+ +{:else} + {#await promise} + organization detail is being loaded... + {:catch error} + + {/await} +{/if} diff --git a/src/components/OrgOverview.svelte b/src/components/OrgOverview.svelte index 7b9a89ee..a66540e0 100644 --- a/src/components/OrgOverview.svelte +++ b/src/components/OrgOverview.svelte @@ -1,6 +1,6 @@ {#if store.state.jwtinfo.userdetails.permissions.includes('ORGANISATION:GET')} - {#await RunnerOrganisationService.runnerOrganisationControllerGetAll()} + {#await promise} - {:then orgs} - {#if orgs.length === 0} + {:then} + {#if current_organizations.length === 0} {:else} - {#each orgs as o} + {#each current_organizations as o} {#if Object.values(o) .toString() .toLowerCase() From 0e2a10fe94075b3cda8ef3ebae6a6159a2e6bbf9 Mon Sep 17 00:00:00 2001 From: Philipp Dormann Date: Fri, 15 Jan 2021 19:25:30 +0100 Subject: [PATCH 05/11] =?UTF-8?q?=E2=9C=A8=20basic=20functionality=20in=20?= =?UTF-8?q?OrgDetail?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ref #16 --- src/components/OrgDetail.svelte | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/components/OrgDetail.svelte b/src/components/OrgDetail.svelte index 9e116ce4..34e19954 100644 --- a/src/components/OrgDetail.svelte +++ b/src/components/OrgDetail.svelte @@ -4,27 +4,40 @@ import store from "../store"; import PromiseError from "./PromiseError.svelte"; $: delete_triggered = false; - $: save_enabled = false; + $: save_enabled = !data_changed; export let params; - console.log(params); - let data_original = {}; + let orgdata = {}; + let original = {}; $: data_loaded = false; + $: data_changed = JSON.stringify(orgdata) === JSON.stringify(original); const promise = RunnerOrganisationService.runnerOrganisationControllerGetOne( params.orgid ).then((value) => { data_loaded = true; - data_original = Object.assign(data_original, value); + orgdata = Object.assign(orgdata, value); + original = Object.assign(original, value); }); + function deleteOrganisation() { + RunnerOrganisationService.runnerOrganisationControllerRemove( + original.id, + true + ) + .then((resp) => { + location.replace("./"); + }) + .catch((err) => {}); + } {#if data_loaded}
- {data_original.name} - + {original.name} + {#if store.state.jwtinfo.userdetails.permissions.includes('USER:DELETE')} {#if delete_triggered} + 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">{$_('delete-organization')} {/if} {/if} {#if !delete_triggered} @@ -127,7 +140,7 @@ autocomplete="off" placeholder="Name" type="text" - bind:value={data_original.name} + bind:value={orgdata.name} name="name" class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 dark:bg-gray-900 dark:text-gray-100 rounded-md p-2" />
@@ -139,7 +152,7 @@ autocomplete="off" placeholder={$_('contact')} type="text" - bind:value={data_original.contact} + bind:value={orgdata.contact} name="contact" class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 dark:bg-gray-900 dark:text-gray-100 rounded-md p-2" />
@@ -151,7 +164,7 @@ autocomplete="off" placeholder={$_('address')} type="text" - bind:value={data_original.address} + bind:value={orgdata.address} name="address" class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 dark:bg-gray-900 dark:text-gray-100 rounded-md p-2" /> From 01c01a46faa9332a2e437861fdb42afe962da833 Mon Sep 17 00:00:00 2001 From: Philipp Dormann Date: Fri, 15 Jan 2021 19:25:42 +0100 Subject: [PATCH 06/11] =?UTF-8?q?=F0=9F=8C=8E=20i18n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ref #16 --- src/locales/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/locales/en.json b/src/locales/en.json index d31ce045..4138bb74 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -127,5 +127,6 @@ "organizations": "Organizations", "create-organization": "Create Organization", "contact": "Contact", - "address": "Address" + "address": "Address", + "delete-organization": "Delete Organization" } From 93249258c6b0f34da22f0ed5d290b437d221a8fd Mon Sep 17 00:00:00 2001 From: Philipp Dormann Date: Fri, 15 Jan 2021 20:03:29 +0100 Subject: [PATCH 07/11] =?UTF-8?q?=F0=9F=8F=81=20finish=20basic=20functiona?= =?UTF-8?q?lity=20of=20AddOrgModal=20+=20OrgDetail?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ref #16 --- src/components/AddOrgModal.svelte | 10 +++++----- src/components/OrgDetail.svelte | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/components/AddOrgModal.svelte b/src/components/AddOrgModal.svelte index f22940b5..bd7131bb 100644 --- a/src/components/AddOrgModal.svelte +++ b/src/components/AddOrgModal.svelte @@ -6,7 +6,7 @@ import Toastify from "toastify-js"; export let modal_open; export let current_organizations; - let firstname_input; + let name_input_dom; function focus(el) { el.focus(); } @@ -14,8 +14,8 @@ $: processed_last_submit = true; $: isOrgnameValid = name.trim().length !== 0; $: createbtnenabled = isOrgnameValid; - (function () { - document.onkeydown = function (e) { + (() => { + document.onkeydown = (e) => { e = e || window.event; if (e.key === "Escape") { modal_open = false; @@ -36,7 +36,7 @@ duration: -1, }).showToast(); RunnerOrganisationService.runnerOrganisationControllerPost({ - name: "ORG." + Date.now(), + name, address: undefined, contact: undefined, }) @@ -123,7 +123,7 @@ class:focus:border-red-500={!isOrgnameValid} class:focus:ring-red-500={!isOrgnameValid} bind:value={name} - bind:this={firstname_input} + bind:this={name_input_dom} type="text" name="firstname" class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" /> diff --git a/src/components/OrgDetail.svelte b/src/components/OrgDetail.svelte index 34e19954..42b68879 100644 --- a/src/components/OrgDetail.svelte +++ b/src/components/OrgDetail.svelte @@ -1,6 +1,7 @@ {#if data_loaded} @@ -56,6 +82,7 @@ {/if} {#if !delete_triggered}