Compare commits
12 Commits
Author | SHA1 | Date | |
---|---|---|---|
ccb5125a48 | |||
1c356a41f5 | |||
6012d0577e | |||
5ec1dfa8b0 | |||
3754f09b2f | |||
b9e0be4483 | |||
e1d5d54cfb | |||
e97c5c3b7e | |||
19887c8f96 | |||
b9aa00e8de | |||
ded31980bf | |||
264e0d7ed9 |
14
CHANGELOG.md
14
CHANGELOG.md
@ -2,11 +2,25 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
|
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
|
||||||
|
|
||||||
|
#### [0.1.3](https://git.odit.services/lfk/frontend/compare/0.1.2...0.1.3)
|
||||||
|
|
||||||
|
- 🌎 improved i18n for AddUserModal and UserDetail [`1c356a4`](https://git.odit.services/lfk/frontend/commit/1c356a41f54a954afaa69ed524f62c1676f7bbee)
|
||||||
|
- 🧹 simplified UsersOverview table [`e1d5d54`](https://git.odit.services/lfk/frontend/commit/e1d5d54cfb1fb20e56f0e971e2cfd196e9a913ac)
|
||||||
|
- 🌎 added i18n for UsersOverview [`3754f09`](https://git.odit.services/lfk/frontend/commit/3754f09b2f395a82ff8c3a9c655ab8a782e7eb71)
|
||||||
|
- 🖊 add basic UserDetail editing reactivity [`6012d05`](https://git.odit.services/lfk/frontend/commit/6012d0577e2ae6caf44aaee54335188bc767fff7)
|
||||||
|
- AddUserModal - data validation [`264e0d7`](https://git.odit.services/lfk/frontend/commit/264e0d7ed98c5000da543af154d6e36a6b956e4a)
|
||||||
|
- ✨ sample layout for advanced search [`5ec1dfa`](https://git.odit.services/lfk/frontend/commit/5ec1dfa8b0da4619f14e73794b9a9e22872aa330)
|
||||||
|
- userdetail - dynamic buttons [`ded3198`](https://git.odit.services/lfk/frontend/commit/ded31980bfbf9f09afa2818bdcc8cc3e40748441)
|
||||||
|
- 🔍 UsersOverview table - basic fuzzy search [`b9e0be4`](https://git.odit.services/lfk/frontend/commit/b9e0be448398d087005e220d08e34461490be14e)
|
||||||
|
|
||||||
#### [0.1.2](https://git.odit.services/lfk/frontend/compare/0.1.2-1...0.1.2)
|
#### [0.1.2](https://git.odit.services/lfk/frontend/compare/0.1.2-1...0.1.2)
|
||||||
|
|
||||||
|
> 10 January 2021
|
||||||
|
|
||||||
- Merge commit '2a37dfafa426e070aa136d171a1a01aa7f609d18' into dev [`#29`](https://git.odit.services/lfk/frontend/issues/29)
|
- Merge commit '2a37dfafa426e070aa136d171a1a01aa7f609d18' into dev [`#29`](https://git.odit.services/lfk/frontend/issues/29)
|
||||||
- Merge commit '5810b4ec4396ad650d90493fb48e2a8320865b42' into dev [`#4`](https://git.odit.services/lfk/frontend/issues/4)
|
- Merge commit '5810b4ec4396ad650d90493fb48e2a8320865b42' into dev [`#4`](https://git.odit.services/lfk/frontend/issues/4)
|
||||||
- 🔒 added basic manual refresh every 4mins [`d92c6c0`](https://git.odit.services/lfk/frontend/commit/d92c6c0de9d6b72027b8aa27b22e3dc7b5116af1)
|
- 🔒 added basic manual refresh every 4mins [`d92c6c0`](https://git.odit.services/lfk/frontend/commit/d92c6c0de9d6b72027b8aa27b22e3dc7b5116af1)
|
||||||
|
- 🚀RELEASE v0.1.2 [`242b5af`](https://git.odit.services/lfk/frontend/commit/242b5afbe93a6100826b0340f821ad2a2c4de343)
|
||||||
- dropped redundant console.log [`2a37dfa`](https://git.odit.services/lfk/frontend/commit/2a37dfafa426e070aa136d171a1a01aa7f609d18)
|
- dropped redundant console.log [`2a37dfa`](https://git.odit.services/lfk/frontend/commit/2a37dfafa426e070aa136d171a1a01aa7f609d18)
|
||||||
- 💾 save new auth data to localstorage [`2cbb431`](https://git.odit.services/lfk/frontend/commit/2cbb431acc0fe1aa333ddedb76510486a5fcf191)
|
- 💾 save new auth data to localstorage [`2cbb431`](https://git.odit.services/lfk/frontend/commit/2cbb431acc0fe1aa333ddedb76510486a5fcf191)
|
||||||
- new license file version [CI SKIP] [`519ba79`](https://git.odit.services/lfk/frontend/commit/519ba79e1d5d97e2f59f769ef952a649481b55c0)
|
- new license file version [CI SKIP] [`519ba79`](https://git.odit.services/lfk/frontend/commit/519ba79e1d5d97e2f59f769ef952a649481b55c0)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@odit/lfk-frontend",
|
"name": "@odit/lfk-frontend",
|
||||||
"version": "0.1.2",
|
"version": "0.1.3",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"i18n-order": "node order.js",
|
"i18n-order": "node order.js",
|
||||||
"dev": "snowpack dev",
|
"dev": "snowpack dev",
|
||||||
@ -15,6 +15,7 @@
|
|||||||
"filepond": "4.25.1",
|
"filepond": "4.25.1",
|
||||||
"gridjs": "3.2.1",
|
"gridjs": "3.2.1",
|
||||||
"localforage": "1.9.0",
|
"localforage": "1.9.0",
|
||||||
|
"lodash.isequal": "^4.5.0",
|
||||||
"svelte-filepond": "0.0.1",
|
"svelte-filepond": "0.0.1",
|
||||||
"svelte-focus-trap": "1.0.1",
|
"svelte-focus-trap": "1.0.1",
|
||||||
"svelte-i18n": "3.3.0",
|
"svelte-i18n": "3.3.0",
|
||||||
|
@ -3,11 +3,10 @@
|
|||||||
import { clickOutside } from "./outsideclick";
|
import { clickOutside } from "./outsideclick";
|
||||||
import { focusTrap } from "svelte-focus-trap";
|
import { focusTrap } from "svelte-focus-trap";
|
||||||
import { tracks as tracksstore } from "../store.js";
|
import { tracks as tracksstore } from "../store.js";
|
||||||
import { TrackService, UserService } from "@odit/lfk-client-js";
|
import { UserService } from "@odit/lfk-client-js";
|
||||||
import isEmail from "validator/es/lib/isEmail";
|
import isEmail from "validator/es/lib/isEmail";
|
||||||
import Toastify from "toastify-js";
|
import Toastify from "toastify-js";
|
||||||
import "toastify-js/src/toastify.css";
|
import "toastify-js/src/toastify.css";
|
||||||
import About from "./About.svelte";
|
|
||||||
export let modal_open;
|
export let modal_open;
|
||||||
let firstname_input;
|
let firstname_input;
|
||||||
let lastname_input;
|
let lastname_input;
|
||||||
@ -22,14 +21,13 @@
|
|||||||
$: email_input_value = "";
|
$: email_input_value = "";
|
||||||
$: lastname_input_value = "";
|
$: lastname_input_value = "";
|
||||||
$: firstname_input_value = "";
|
$: firstname_input_value = "";
|
||||||
$: track_min_duration = 0;
|
|
||||||
$: tracklength = 0;
|
|
||||||
$: processed_last_submit = true;
|
$: processed_last_submit = true;
|
||||||
$: isPasswordValid = password_input_value.trim().length === 0;
|
$: isPasswordValid = password_input_value.trim().length !== 0;
|
||||||
$: isEmailValid = isEmail(email_input_value);
|
$: isEmailValid = isEmail(email_input_value);
|
||||||
$: isLastnameValid = lastname_input_value.trim().length === 0;
|
$: isLastnameValid = lastname_input_value.trim().length !== 0;
|
||||||
$: isFirstnameValid = firstname_input_value.trim().length === 0;
|
$: isFirstnameValid = firstname_input_value.trim().length !== 0;
|
||||||
$: createbtnenabled = !isFirstnameValid && !isLastnameValid;
|
$: createbtnenabled =
|
||||||
|
isFirstnameValid && isLastnameValid && isEmailValid && isPasswordValid;
|
||||||
(function () {
|
(function () {
|
||||||
document.onkeydown = function (e) {
|
document.onkeydown = function (e) {
|
||||||
e = e || window.event;
|
e = e || window.event;
|
||||||
@ -55,7 +53,8 @@
|
|||||||
firstname: firstname_input_value,
|
firstname: firstname_input_value,
|
||||||
lastname: lastname_input_value,
|
lastname: lastname_input_value,
|
||||||
middlename: middlename_input_value,
|
middlename: middlename_input_value,
|
||||||
email:email_input_value,password:password_input_value
|
email: email_input_value,
|
||||||
|
password: password_input_value,
|
||||||
})
|
})
|
||||||
.then((result) => {
|
.then((result) => {
|
||||||
firstname_input_value = "";
|
firstname_input_value = "";
|
||||||
@ -137,33 +136,33 @@
|
|||||||
<div class="col-span-6">
|
<div class="col-span-6">
|
||||||
<label
|
<label
|
||||||
for="firstname"
|
for="firstname"
|
||||||
class="block text-sm font-medium text-gray-700">First Name</label>
|
class="block text-sm font-medium text-gray-700">{$_('first-name')}</label>
|
||||||
<input
|
<input
|
||||||
use:focus
|
use:focus
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
placeholder="First Name"
|
placeholder={$_('first-name')}
|
||||||
class:border-red-500={isFirstnameValid}
|
class:border-red-500={!isFirstnameValid}
|
||||||
class:focus:border-red-500={isFirstnameValid}
|
class:focus:border-red-500={!isFirstnameValid}
|
||||||
class:focus:ring-red-500={isFirstnameValid}
|
class:focus:ring-red-500={!isFirstnameValid}
|
||||||
bind:value={firstname_input_value}
|
bind:value={firstname_input_value}
|
||||||
bind:this={firstname_input}
|
bind:this={firstname_input}
|
||||||
type="text"
|
type="text"
|
||||||
name="firstname"
|
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" />
|
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" />
|
||||||
{#if isFirstnameValid}
|
{#if !isFirstnameValid}
|
||||||
<span
|
<span
|
||||||
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1">
|
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1">
|
||||||
First Name is required
|
{$_('first-name-is-required')}
|
||||||
</span>
|
</span>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-span-6">
|
<div class="col-span-6">
|
||||||
<label
|
<label
|
||||||
for="trackname"
|
for="trackname"
|
||||||
class="block text-sm font-medium text-gray-700">Middle Name</label>
|
class="block text-sm font-medium text-gray-700">{$_('middle-name')}</label>
|
||||||
<input
|
<input
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
placeholder="Middle Name"
|
placeholder={$_('middle-name')}
|
||||||
bind:value={middlename_input_value}
|
bind:value={middlename_input_value}
|
||||||
bind:this={middlename_input}
|
bind:this={middlename_input}
|
||||||
type="text"
|
type="text"
|
||||||
@ -177,50 +176,50 @@
|
|||||||
<input
|
<input
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
placeholder="Last Name"
|
placeholder="Last Name"
|
||||||
class:border-red-500={isLastnameValid}
|
class:border-red-500={!isLastnameValid}
|
||||||
class:focus:border-red-500={isLastnameValid}
|
class:focus:border-red-500={!isLastnameValid}
|
||||||
class:focus:ring-red-500={isLastnameValid}
|
class:focus:ring-red-500={!isLastnameValid}
|
||||||
bind:value={lastname_input_value}
|
bind:value={lastname_input_value}
|
||||||
bind:this={lastname_input}
|
bind:this={lastname_input}
|
||||||
type="text"
|
type="text"
|
||||||
name="lastname"
|
name="lastname"
|
||||||
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" />
|
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" />
|
||||||
{#if isLastnameValid}
|
{#if !isLastnameValid}
|
||||||
<span
|
<span
|
||||||
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1">
|
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1">
|
||||||
Last Name is required
|
{$_('last-name-is-required')}
|
||||||
</span>
|
</span>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-span-6">
|
<div class="col-span-6">
|
||||||
<label
|
<label
|
||||||
for="password"
|
for="password"
|
||||||
class="block text-sm font-medium text-gray-700">Password</label>
|
class="block text-sm font-medium text-gray-700">{$_('password')}</label>
|
||||||
<input
|
<input
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
placeholder="Password"
|
placeholder={$_('password')}
|
||||||
class:border-red-500={isPasswordValid}
|
class:border-red-500={!isPasswordValid}
|
||||||
class:focus:border-red-500={isPasswordValid}
|
class:focus:border-red-500={!isPasswordValid}
|
||||||
class:focus:ring-red-500={isPasswordValid}
|
class:focus:ring-red-500={!isPasswordValid}
|
||||||
bind:value={password_input_value}
|
bind:value={password_input_value}
|
||||||
bind:this={password_input}
|
bind:this={password_input}
|
||||||
type="password"
|
type="password"
|
||||||
name="password"
|
name="password"
|
||||||
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" />
|
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" />
|
||||||
{#if isPasswordValid}
|
{#if !isPasswordValid}
|
||||||
<span
|
<span
|
||||||
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1">
|
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1">
|
||||||
Password is required
|
{$_('password-is-required')}
|
||||||
</span>
|
</span>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-span-6">
|
<div class="col-span-6">
|
||||||
<label
|
<label
|
||||||
for="email"
|
for="email"
|
||||||
class="block text-sm font-medium text-gray-700">E-Mail</label>
|
class="block text-sm font-medium text-gray-700">{$_('e-mail-adress')}</label>
|
||||||
<input
|
<input
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
placeholder="E-Mail"
|
placeholder={$_('e-mail-adress')}
|
||||||
class:border-red-500={!isEmailValid}
|
class:border-red-500={!isEmailValid}
|
||||||
class:focus:border-red-500={!isEmailValid}
|
class:focus:border-red-500={!isEmailValid}
|
||||||
class:focus:ring-red-500={!isEmailValid}
|
class:focus:ring-red-500={!isEmailValid}
|
||||||
@ -232,7 +231,7 @@
|
|||||||
{#if !isEmailValid}
|
{#if !isEmailValid}
|
||||||
<span
|
<span
|
||||||
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1">
|
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1">
|
||||||
valid email is required
|
{$_('valid-email-is-required')}
|
||||||
</span>
|
</span>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
@ -247,7 +246,7 @@
|
|||||||
on:click={submit}
|
on:click={submit}
|
||||||
type="button"
|
type="button"
|
||||||
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm">
|
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm">
|
||||||
Create
|
{$_('create')}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
@ -255,7 +254,7 @@
|
|||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm">
|
class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm">
|
||||||
Cancel
|
{$_('cancel')}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,15 +1,28 @@
|
|||||||
<script>
|
<script>
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
|
import lodashIsEqual from "lodash.isequal";
|
||||||
import { UserService } from "@odit/lfk-client-js";
|
import { UserService } from "@odit/lfk-client-js";
|
||||||
import "gridjs/dist/theme/mermaid.css";
|
import "gridjs/dist/theme/mermaid.css";
|
||||||
import { tracks as tracksstore } from "../store.js";
|
|
||||||
import PromiseError from "./PromiseError.svelte";
|
import PromiseError from "./PromiseError.svelte";
|
||||||
export let params;
|
export let params;
|
||||||
const user_promise = UserService.userControllerGetOne(params.userid);
|
const user_promise = UserService.userControllerGetOne(params.userid);
|
||||||
|
let data_loaded = false;
|
||||||
|
let original_data = undefined;
|
||||||
|
$: editable_userdata = undefined;
|
||||||
user_promise.then((data) => {
|
user_promise.then((data) => {
|
||||||
console.log(data);
|
data_loaded = true;
|
||||||
tracksstore.set(data);
|
original_data = data;
|
||||||
|
editable_userdata = data;
|
||||||
});
|
});
|
||||||
|
// $: changes_performed = lodashIsEqual(original_data, editable_userdata);
|
||||||
|
$: changes_performed = !lodashIsEqual({ test: 1 }, { test: 1 });
|
||||||
|
function submit() {
|
||||||
|
if (data_loaded === true && changes_performed === true) {
|
||||||
|
console.log("ok, submitting...");
|
||||||
|
} else {
|
||||||
|
console.log("no changes performed");
|
||||||
|
}
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#await user_promise}
|
{#await user_promise}
|
||||||
@ -58,14 +71,31 @@
|
|||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<span
|
<div class="mb-8 text-3xl font-extrabold leading-tight">
|
||||||
class="mb-4 text-3xl font-extrabold leading-tight">{user.firstname}
|
{user.firstname}
|
||||||
{user.middlename || ''}
|
{user.middlename || ''}
|
||||||
{user.lastname}
|
{user.lastname}
|
||||||
<button
|
<span data-id="user_actions_${user.id}">
|
||||||
type="button"
|
<button
|
||||||
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm">Delete
|
class="hidden w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-green-400 text-base font-medium text-white sm:w-auto sm:text-sm"
|
||||||
User</button></span>
|
data-userid="${user.id}"
|
||||||
|
onclick="user__delete_cancel()">{$_('cancel')}</button>
|
||||||
|
<button
|
||||||
|
class="hidden w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-500 text-base font-medium text-white sm:w-auto sm:text-sm"
|
||||||
|
data-userid="${user.id}"
|
||||||
|
onclick="user__delete_confirm()">{$_('confirm-delete')}</button>
|
||||||
|
<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">{$_('delete-user')}</button>
|
||||||
|
<button
|
||||||
|
disabled={!changes_performed}
|
||||||
|
class:opacity-50={!changes_performed}
|
||||||
|
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">{$_('save-changes')}</button>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<div class="mt-2 flex items-center">
|
<div class="mt-2 flex items-center">
|
||||||
<img
|
<img
|
||||||
@ -86,8 +116,13 @@
|
|||||||
<div class="mt-3 text-sm w-full">
|
<div class="mt-3 text-sm w-full">
|
||||||
<input
|
<input
|
||||||
id="enabled"
|
id="enabled"
|
||||||
|
on:change={() => {
|
||||||
|
editable_userdata.enabled = !editable_userdata.enabled;
|
||||||
|
// TODO: this reactive set does not work?
|
||||||
|
}}
|
||||||
name="enabled"
|
name="enabled"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
|
checked={editable_userdata.enabled}
|
||||||
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded" />
|
class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded" />
|
||||||
<label
|
<label
|
||||||
for="enabled"
|
for="enabled"
|
||||||
@ -95,34 +130,42 @@
|
|||||||
<p class="text-gray-500">set the user active/ inactive</p>
|
<p class="text-gray-500">set the user active/ inactive</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-sm w-full">
|
<div class="text-sm w-full">
|
||||||
<label for="firstname" class="font-medium text-gray-700">First name</label>
|
<label
|
||||||
|
for="firstname"
|
||||||
|
class="font-medium text-gray-700">{$_('first-name')}</label>
|
||||||
<input
|
<input
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
placeholder="First name"
|
placeholder={$_('first-name')}
|
||||||
type="text"
|
type="text"
|
||||||
|
bind:value={editable_userdata.firstname}
|
||||||
name="firstname"
|
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 dark:bg-gray-900 dark:text-gray-100 rounded-md p-2" />
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 dark:bg-gray-900 dark:text-gray-100 rounded-md p-2" />
|
||||||
</div>
|
</div>
|
||||||
<div class="text-sm w-full">
|
<div class="text-sm w-full">
|
||||||
<label for="middlename" class="font-medium text-gray-700">Middle name</label>
|
<label
|
||||||
|
for="middlename"
|
||||||
|
class="font-medium text-gray-700">{$_('middle-name')}</label>
|
||||||
<input
|
<input
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
placeholder="Middle name"
|
placeholder={$_('middle-name')}
|
||||||
type="text"
|
type="text"
|
||||||
|
bind:value={editable_userdata.middlename}
|
||||||
name="middlename"
|
name="middlename"
|
||||||
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" />
|
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" />
|
||||||
</div>
|
</div>
|
||||||
<div class="text-sm w-full">
|
<div class="text-sm w-full">
|
||||||
<label for="lastname" class="font-medium text-gray-700">Last name</label>
|
<label
|
||||||
|
for="lastname"
|
||||||
|
class="font-medium text-gray-700">{$_('last-name')}</label>
|
||||||
<input
|
<input
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
placeholder="Last name"
|
placeholder={$_('last-name')}
|
||||||
type="text"
|
type="text"
|
||||||
|
bind:value={editable_userdata.lastname}
|
||||||
name="lastname"
|
name="lastname"
|
||||||
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" />
|
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" />
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
{:catch error}
|
{:catch error}
|
||||||
<!-- promise was rejected -->
|
|
||||||
<PromiseError {error} />
|
<PromiseError {error} />
|
||||||
{/await}
|
{/await}
|
||||||
|
@ -7,19 +7,17 @@
|
|||||||
|
|
||||||
<section class="container p-5">
|
<section class="container p-5">
|
||||||
<span class="mb-1 text-3xl font-extrabold leading-tight">
|
<span class="mb-1 text-3xl font-extrabold leading-tight">
|
||||||
Users
|
{$_('users')}
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
modal_open = true;
|
modal_open = true;
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm">
|
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm">
|
||||||
Create User
|
{$_('create-user')}
|
||||||
</button>
|
</button>
|
||||||
</span>
|
</span>
|
||||||
<p class="mb-8 text-lg text-gray-500">
|
<p class="mb-8 text-lg text-gray-500">{$_('manage-admin-users')}</p>
|
||||||
manage admin users
|
|
||||||
</p>
|
|
||||||
<UsersOverview />
|
<UsersOverview />
|
||||||
</section>
|
</section>
|
||||||
<AddUserModal bind:modal_open />
|
<AddUserModal bind:modal_open />
|
||||||
|
@ -1,25 +1,20 @@
|
|||||||
<script>
|
<script>
|
||||||
import { _, json } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
import Toastify from "toastify-js";
|
import Toastify from "toastify-js";
|
||||||
import TracksEmptyState from "./TracksEmptyState.svelte";
|
import { UserService } from "@odit/lfk-client-js";
|
||||||
import { TrackService, UserService } from "@odit/lfk-client-js";
|
|
||||||
const users_promise = UserService.userControllerGetAll();
|
const users_promise = UserService.userControllerGetAll();
|
||||||
import { getlang } from "./datatable_i18n";
|
|
||||||
import { Grid, html } from "gridjs";
|
|
||||||
import "gridjs/dist/theme/mermaid.css";
|
import "gridjs/dist/theme/mermaid.css";
|
||||||
import { tracks as tracksstore } from "../store.js";
|
import { users as usersstore } from "../store.js";
|
||||||
import UsersEmptyState from "./UsersEmptyState.svelte";
|
import UsersEmptyState from "./UsersEmptyState.svelte";
|
||||||
|
$: searchvalue = "";
|
||||||
$: userscache = [];
|
$: userscache = [];
|
||||||
$: blocked = [];
|
$: advanced_search = false;
|
||||||
let table;
|
usersstore.subscribe((val) => {
|
||||||
let datatable;
|
|
||||||
let datatable_inited = false;
|
|
||||||
tracksstore.subscribe((val) => {
|
|
||||||
userscache = val;
|
userscache = val;
|
||||||
});
|
});
|
||||||
users_promise.then((data) => {
|
users_promise.then((data) => {
|
||||||
console.log(data);
|
console.log(data);
|
||||||
tracksstore.set(data);
|
usersstore.set(data);
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@ -34,6 +29,26 @@
|
|||||||
{#if userscache.length === 0}
|
{#if userscache.length === 0}
|
||||||
<UsersEmptyState />
|
<UsersEmptyState />
|
||||||
{:else}
|
{:else}
|
||||||
|
{#if advanced_search}
|
||||||
|
advanced search
|
||||||
|
{:else}
|
||||||
|
<input
|
||||||
|
type="search"
|
||||||
|
bind:value={searchvalue}
|
||||||
|
placeholder={$_('datatable.search')}
|
||||||
|
aria-label={$_('datatable.search')}
|
||||||
|
class="gridjs-input gridjs-search-input mb-4" />
|
||||||
|
{/if}
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
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">
|
||||||
|
{#if advanced_search}
|
||||||
|
toggle simple search
|
||||||
|
{:else}toggle advanced search{/if}
|
||||||
|
</button>
|
||||||
<div
|
<div
|
||||||
class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll">
|
class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll">
|
||||||
<table class="divide-y divide-gray-200 w-full">
|
<table class="divide-y divide-gray-200 w-full">
|
||||||
@ -44,11 +59,6 @@
|
|||||||
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
Name
|
Name
|
||||||
</th>
|
</th>
|
||||||
<th
|
|
||||||
scope="col"
|
|
||||||
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
|
||||||
Title
|
|
||||||
</th>
|
|
||||||
<th
|
<th
|
||||||
scope="col"
|
scope="col"
|
||||||
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
@ -66,145 +76,65 @@
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody class="divide-y divide-gray-200">
|
<tbody class="divide-y divide-gray-200">
|
||||||
{#each users as u}
|
{#each users as u}
|
||||||
<tr>
|
{#if Object.values(u)
|
||||||
<td class="px-6 py-4 whitespace-nowrap">
|
.toString()
|
||||||
<div class="flex items-center">
|
.toLowerCase()
|
||||||
{#if u.profilePic}
|
.includes(searchvalue)}
|
||||||
<div class="flex-shrink-0 h-10 w-10">
|
<tr>
|
||||||
<img
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
class="h-10 w-10 rounded-full"
|
<div class="flex items-center">
|
||||||
src={u.profilePic}
|
{#if u.profilePic}
|
||||||
alt="" />
|
<div class="flex-shrink-0 h-10 w-10">
|
||||||
</div>
|
<img
|
||||||
{/if}
|
class="h-10 w-10 rounded-full"
|
||||||
<div class="ml-4">
|
src={u.profilePic}
|
||||||
<div
|
alt="" />
|
||||||
class="text-sm font-medium text-gray-900 dark:text-gray-100">
|
</div>
|
||||||
{u.firstname}
|
{/if}
|
||||||
{u.middlename || ''}
|
<div class="ml-4">
|
||||||
{u.lastname}
|
<div
|
||||||
</div>
|
class="text-sm font-medium text-gray-900 dark:text-gray-100">
|
||||||
<div class="text-sm text-gray-500">
|
{u.firstname}
|
||||||
{u.email || u.username}
|
{u.middlename || ''}
|
||||||
|
{u.lastname}
|
||||||
|
</div>
|
||||||
|
<div class="text-sm text-gray-500">
|
||||||
|
{u.email || u.username}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</td>
|
||||||
</td>
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
<td class="px-6 py-4 whitespace-nowrap">
|
{#if u.enabled}
|
||||||
<div class="text-sm text-gray-900 dark:text-gray-100">
|
<span
|
||||||
Regional Paradigm Technician
|
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">Active</span>
|
||||||
</div>
|
{:else}
|
||||||
<div class="text-sm text-gray-500">Optimization</div>
|
<span
|
||||||
</td>
|
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800">Inactive</span>
|
||||||
<td class="px-6 py-4 whitespace-nowrap">
|
{/if}
|
||||||
{#if u.enabled}
|
</td>
|
||||||
<span
|
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
|
||||||
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">Active</span>
|
{#each u.groups as g}
|
||||||
{:else}
|
<a
|
||||||
<span
|
href="../groups/{g.id}"
|
||||||
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800">Inactive</span>
|
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800">{g.name}</a>
|
||||||
{/if}
|
{/each}
|
||||||
</td>
|
</td>
|
||||||
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
|
<td
|
||||||
{#each u.groups as g}
|
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
|
||||||
<a
|
<a
|
||||||
href="../groups/{g.id}"
|
href="./{u.id}"
|
||||||
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800">{g.name}</a>
|
class="text-indigo-600 hover:text-indigo-900">Edit</a>
|
||||||
{/each}
|
<span
|
||||||
</td>
|
tabindex="0"
|
||||||
<td
|
href="#"
|
||||||
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
|
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">Delete</span>
|
||||||
<a
|
</td>
|
||||||
href="./{u.id}"
|
</tr>
|
||||||
class="text-indigo-600 hover:text-indigo-900">Edit</a>
|
{/if}
|
||||||
<span
|
|
||||||
tabindex="0"
|
|
||||||
href="#"
|
|
||||||
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">Delete</span>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{/each}
|
{/each}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<div
|
|
||||||
class="grid px-4 py-3 text-xs font-semibold tracking-wide text-gray-500 uppercase border-t dark:border-gray-700 bg-gray-50 sm:grid-cols-9 dark:text-gray-400 dark:bg-gray-900">
|
|
||||||
<span class="flex items-center col-span-3"> Showing 21-30 of 100 </span>
|
|
||||||
<span class="col-span-2" />
|
|
||||||
<!-- Pagination -->
|
|
||||||
<span class="flex col-span-4 mt-2 sm:mt-auto sm:justify-end">
|
|
||||||
<nav aria-label="Table navigation">
|
|
||||||
<ul class="inline-flex items-center">
|
|
||||||
<li>
|
|
||||||
<button
|
|
||||||
class="px-3 py-1 rounded-md rounded-l-lg focus:outline-none focus:shadow-outline-purple"
|
|
||||||
aria-label="Previous">
|
|
||||||
<svg
|
|
||||||
aria-hidden="true"
|
|
||||||
class="w-4 h-4 fill-current"
|
|
||||||
viewBox="0 0 20 20">
|
|
||||||
<path
|
|
||||||
d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z"
|
|
||||||
clip-rule="evenodd"
|
|
||||||
fill-rule="evenodd" />
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<button
|
|
||||||
class="px-3 py-1 rounded-md focus:outline-none focus:shadow-outline-purple">
|
|
||||||
1
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<button
|
|
||||||
class="px-3 py-1 rounded-md focus:outline-none focus:shadow-outline-purple">
|
|
||||||
2
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<button
|
|
||||||
class="px-3 py-1 text-white transition-colors duration-150 bg-purple-600 border border-r-0 border-purple-600 rounded-md focus:outline-none focus:shadow-outline-purple">
|
|
||||||
3
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<button
|
|
||||||
class="px-3 py-1 rounded-md focus:outline-none focus:shadow-outline-purple">
|
|
||||||
4
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
<li><span class="px-3 py-1">...</span></li>
|
|
||||||
<li>
|
|
||||||
<button
|
|
||||||
class="px-3 py-1 rounded-md focus:outline-none focus:shadow-outline-purple">
|
|
||||||
8
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<button
|
|
||||||
class="px-3 py-1 rounded-md focus:outline-none focus:shadow-outline-purple">
|
|
||||||
9
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<button
|
|
||||||
class="px-3 py-1 rounded-md rounded-r-lg focus:outline-none focus:shadow-outline-purple"
|
|
||||||
aria-label="Next">
|
|
||||||
<svg
|
|
||||||
class="w-4 h-4 fill-current"
|
|
||||||
aria-hidden="true"
|
|
||||||
viewBox="0 0 20 20">
|
|
||||||
<path
|
|
||||||
d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
|
|
||||||
clip-rule="evenodd"
|
|
||||||
fill-rule="evenodd" />
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
{:catch error}
|
{:catch error}
|
||||||
|
@ -7,11 +7,15 @@
|
|||||||
"application_name": "Lauf für Kaya! - Admin",
|
"application_name": "Lauf für Kaya! - Admin",
|
||||||
"author": "Author",
|
"author": "Author",
|
||||||
"by": "by",
|
"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",
|
"cannot-reset-your-password-directly": "Bummer. We unfortunately cannot reset your password directly. Please send us a mail and confirm your identity",
|
||||||
"changelog": "Changelog",
|
"changelog": "Changelog",
|
||||||
|
"confirm-delete": "Confirm Delete",
|
||||||
"count_organizations": "# Organizations",
|
"count_organizations": "# Organizations",
|
||||||
"count_teams": "# Teams",
|
"count_teams": "# Teams",
|
||||||
|
"create": "Create",
|
||||||
"create-a-new-track": "Create a new Track",
|
"create-a-new-track": "Create a new Track",
|
||||||
|
"create-user": "Create User",
|
||||||
"credits": "Credits",
|
"credits": "Credits",
|
||||||
"dashboard-greeting": "hello there",
|
"dashboard-greeting": "hello there",
|
||||||
"dashboard-title": "Dashboard",
|
"dashboard-title": "Dashboard",
|
||||||
@ -30,6 +34,7 @@
|
|||||||
"no_matching_records_found": "No matching records found",
|
"no_matching_records_found": "No matching records found",
|
||||||
"an_error_happened_while_fetching_the_data": "An error happened while fetching the data"
|
"an_error_happened_while_fetching_the_data": "An error happened while fetching the data"
|
||||||
},
|
},
|
||||||
|
"delete-user": "Delete User",
|
||||||
"dependency_name": "Name",
|
"dependency_name": "Name",
|
||||||
"dont-have-your-email-connected": "Don't have your email connected?",
|
"dont-have-your-email-connected": "Don't have your email connected?",
|
||||||
"dont-panic-were-resetting-it": "Don't panic, we're resetting it ✌",
|
"dont-panic-were-resetting-it": "Don't panic, we're resetting it ✌",
|
||||||
@ -37,6 +42,8 @@
|
|||||||
"email_address_or_username": "Email / username",
|
"email_address_or_username": "Email / username",
|
||||||
"error_on_login": "Error on login",
|
"error_on_login": "Error on login",
|
||||||
"faq": "FAQ",
|
"faq": "FAQ",
|
||||||
|
"first-name": "First name",
|
||||||
|
"first-name-is-required": "First Name is required",
|
||||||
"forgot_password?": "Forgot your password?",
|
"forgot_password?": "Forgot your password?",
|
||||||
"general-stats": "General Stats",
|
"general-stats": "General Stats",
|
||||||
"general_promise_error": "😢 Error",
|
"general_promise_error": "😢 Error",
|
||||||
@ -44,6 +51,8 @@
|
|||||||
"hallo": "hello",
|
"hallo": "hello",
|
||||||
"installed-version": "Installed version",
|
"installed-version": "Installed version",
|
||||||
"invalid-mail-reset": "the provided email is invalid",
|
"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.",
|
"lfk-is-os": "The \"Lauf für Kaya!\" Frontend is (like all other projects for the \"LfK!\" Also) an open source project.",
|
||||||
"license": "License",
|
"license": "License",
|
||||||
"log_in": "Log in",
|
"log_in": "Log in",
|
||||||
@ -51,12 +60,15 @@
|
|||||||
"login_is_checked": "Login is being checked...",
|
"login_is_checked": "Login is being checked...",
|
||||||
"logout": "Logout",
|
"logout": "Logout",
|
||||||
"mail-validation-in-progress": "mail validation in progress...",
|
"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",
|
"minimum-lap-time-in-s": "minimum lap time in s",
|
||||||
"no-license-text-could-be-found": "No license text could be found 😢",
|
"no-license-text-could-be-found": "No license text could be found 😢",
|
||||||
"no-tracks-added-yet": "there are no tracks added yet.",
|
"no-tracks-added-yet": "there are no tracks added yet.",
|
||||||
"orgs": "Orgs",
|
"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!",
|
"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": "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.",
|
"please-provide-the-required-information-to-add-a-new-track": "Please provide the required information to add a new track.",
|
||||||
"profile-picture": "Profile Picture",
|
"profile-picture": "Profile Picture",
|
||||||
"read-license": "Read License",
|
"read-license": "Read License",
|
||||||
@ -64,6 +76,7 @@
|
|||||||
"repo_link": "Link",
|
"repo_link": "Link",
|
||||||
"reset-my-password": "Reset my password",
|
"reset-my-password": "Reset my password",
|
||||||
"runners": "Runners",
|
"runners": "Runners",
|
||||||
|
"save-changes": "Save Changes",
|
||||||
"send-a-mail-to-lfk-odit-services": "send a mail to lfk@odit.services",
|
"send-a-mail-to-lfk-odit-services": "send a mail to lfk@odit.services",
|
||||||
"settings": "Settings",
|
"settings": "Settings",
|
||||||
"signout": "Sign out",
|
"signout": "Sign out",
|
||||||
@ -80,6 +93,7 @@
|
|||||||
"track-name": "Track name",
|
"track-name": "Track name",
|
||||||
"tracks": "Tracks",
|
"tracks": "Tracks",
|
||||||
"users": "Users",
|
"users": "Users",
|
||||||
|
"valid-email-is-required": "valid email is required",
|
||||||
"welcome_wavinghand": "Welcome 👋",
|
"welcome_wavinghand": "Welcome 👋",
|
||||||
"your_profile": "Your Profile"
|
"your_profile": "Your Profile"
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user