parent
2d0beaaaad
commit
c6a15264b3
172
src/components/cards/CardsOverview.svelte
Normal file
172
src/components/cards/CardsOverview.svelte
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
<script>
|
||||||
|
import { getLocaleFromNavigator, _ } from "svelte-i18n";
|
||||||
|
import {
|
||||||
|
RunnerCardService,
|
||||||
|
ScanService,
|
||||||
|
} from "@odit/lfk-client-js";
|
||||||
|
import store from "../../store";
|
||||||
|
import Toastify from "toastify-js";
|
||||||
|
import CardsEmptyState from "./CardsEmptyState.svelte";
|
||||||
|
$: searchvalue = "";
|
||||||
|
$: active_deletes = [];
|
||||||
|
export let current_cards = [];
|
||||||
|
const cards_promise = RunnerCardService.runnerCardControllerGetAll().then((val) => {
|
||||||
|
current_cards = val;
|
||||||
|
});
|
||||||
|
function should_display_based_on_id(id) {
|
||||||
|
if (searchvalue.toString().slice(-1) === "*") {
|
||||||
|
return id.toString().startsWith(searchvalue.replace("*", ""));
|
||||||
|
}
|
||||||
|
return id.toString() === searchvalue;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes('CARD:GET')}
|
||||||
|
{#await cards_promise}
|
||||||
|
<div
|
||||||
|
class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2"
|
||||||
|
role="alert">
|
||||||
|
<p class="font-bold">{$_('loading-cards')}</p>
|
||||||
|
<p class="text-sm">{$_('this-might-take-a-moment')}</p>
|
||||||
|
</div>
|
||||||
|
{:then}
|
||||||
|
{#if current_cards.length === 0}
|
||||||
|
<CardsEmptyState />
|
||||||
|
{:else}
|
||||||
|
<input
|
||||||
|
type="search"
|
||||||
|
bind:value={searchvalue}
|
||||||
|
placeholder={$_('datatable.search')}
|
||||||
|
aria-label={$_('datatable.search')}
|
||||||
|
class="gridjs-input gridjs-search-input mb-4" />
|
||||||
|
<div
|
||||||
|
class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll">
|
||||||
|
<table class="divide-y divide-gray-200 w-full">
|
||||||
|
<thead class="bg-gray-50">
|
||||||
|
<tr>
|
||||||
|
<th
|
||||||
|
scope="col"
|
||||||
|
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
{$_('code')}
|
||||||
|
</th>
|
||||||
|
<th
|
||||||
|
scope="col"
|
||||||
|
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
{$_('runner')}
|
||||||
|
</th>
|
||||||
|
<th
|
||||||
|
scope="col"
|
||||||
|
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
{$_('status')}
|
||||||
|
</th>
|
||||||
|
<th scope="col" class="relative px-6 py-3">
|
||||||
|
<span class="sr-only">{$_('action')}</span>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody class="divide-y divide-gray-200">
|
||||||
|
{#each current_cards as card}
|
||||||
|
{#if card.code
|
||||||
|
.toLowerCase()
|
||||||
|
.includes(
|
||||||
|
searchvalue.toLowerCase()
|
||||||
|
) || card.runner?.firstname
|
||||||
|
.toLowerCase()
|
||||||
|
.includes(
|
||||||
|
searchvalue.toLowerCase()
|
||||||
|
) || card.runner?.middlename
|
||||||
|
.toLowerCase()
|
||||||
|
.includes(
|
||||||
|
searchvalue.toLowerCase()
|
||||||
|
) || card.runner?.lastname
|
||||||
|
.toLowerCase()
|
||||||
|
.includes(
|
||||||
|
searchvalue.toLowerCase()
|
||||||
|
) || should_display_based_on_id(card.id)}
|
||||||
|
<tr data-rowid="card_{card.id}">
|
||||||
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
|
<div class="flex items-center">
|
||||||
|
{card.code}
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<a
|
||||||
|
href="../runners/{card.runner.id}"
|
||||||
|
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800">{card.runner.firstname}
|
||||||
|
{card.runner.middlename || ''}
|
||||||
|
{card.runner.lastname}</a>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
|
<div class="flex items-center">
|
||||||
|
{#if card.enabled}
|
||||||
|
<span
|
||||||
|
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">{$_('enabled_large')}</span>
|
||||||
|
{:else}
|
||||||
|
<span
|
||||||
|
class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800">{$_('disabled')}</span>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
{#if active_deletes[card.id] === true}
|
||||||
|
<td
|
||||||
|
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
active_deletes[card.id] = false;
|
||||||
|
}}
|
||||||
|
tabindex="0"
|
||||||
|
class="ml-4 text-indigo-600 hover:text-indigo-900 cursor-pointer">{$_('cancel-delete')}</button>
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
RunnerCardService.runnerCardControllerRemove(card.id, false).then(
|
||||||
|
(resp) => {
|
||||||
|
current_cards = current_cards.filter(
|
||||||
|
(obj) => obj.id !== card.id
|
||||||
|
);
|
||||||
|
Toastify({
|
||||||
|
text: $_('card-deleted'),
|
||||||
|
duration: 500,
|
||||||
|
backgroundColor:
|
||||||
|
'linear-gradient(to right, #00b09b, #96c93d)',
|
||||||
|
}).showToast();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
tabindex="0"
|
||||||
|
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('confirm-delete')}</button>
|
||||||
|
</td>
|
||||||
|
{:else}
|
||||||
|
<td
|
||||||
|
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
|
||||||
|
<a
|
||||||
|
href="./{card.id}"
|
||||||
|
class="text-indigo-600 hover:text-indigo-900">{$_('details')}</a>
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes('CARD:DELETE')}
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
active_deletes[card.id] = true;
|
||||||
|
}}
|
||||||
|
tabindex="0"
|
||||||
|
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('delete')}</button>
|
||||||
|
{/if}
|
||||||
|
</td>
|
||||||
|
{/if}
|
||||||
|
</tr>
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
{:catch error}
|
||||||
|
<div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500">
|
||||||
|
<span class="inline-block align-middle mr-8">
|
||||||
|
<b class="capitalize">{$_('general_promise_error')}</b>
|
||||||
|
{error}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
{/await}
|
||||||
|
{/if}
|
@ -380,5 +380,10 @@
|
|||||||
"cards": "Läuferkarten",
|
"cards": "Läuferkarten",
|
||||||
"add-card": "Karte erstellen",
|
"add-card": "Karte erstellen",
|
||||||
"add-your-first-card": "Erstelle deine erste Läuferkarte",
|
"add-your-first-card": "Erstelle deine erste Läuferkarte",
|
||||||
"there-are-no-cards-yet": "Es gibt noch keine Läuferkarten."
|
"there-are-no-cards-yet": "Es gibt noch keine Läuferkarten.",
|
||||||
|
"loading-cards": "Läuferkarten werden geladen",
|
||||||
|
"code": "Code",
|
||||||
|
"enabled_large": "Aktiviert",
|
||||||
|
"disabled": "Deaktiviert",
|
||||||
|
"card-deleted": "Karte gelöscht"
|
||||||
}
|
}
|
||||||
|
@ -380,5 +380,10 @@
|
|||||||
"cards": "Cards",
|
"cards": "Cards",
|
||||||
"add-card": "Add Card",
|
"add-card": "Add Card",
|
||||||
"add-your-first-card": "Add your first card",
|
"add-your-first-card": "Add your first card",
|
||||||
"there-are-no-cards-yet": "There are no cards yet."
|
"there-are-no-cards-yet": "There are no cards yet.",
|
||||||
|
"loading-cards": "Loading cards",
|
||||||
|
"code": "Code",
|
||||||
|
"enabled_large": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"card-deleted": "Card deleted"
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user