feat(components): Add loader to roster builder
parent
bb82f20a47
commit
d1c5e8987f
|
@ -0,0 +1,39 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="loader">
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.loader {
|
||||||
|
width: 12px;
|
||||||
|
aspect-ratio: 1;
|
||||||
|
border-radius: 50%;
|
||||||
|
animation: loader-anim 1s infinite linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes loader-anim {
|
||||||
|
0% {
|
||||||
|
box-shadow: 20px 4px var(--overlay-0), -20px -4px var(--overlay-0);
|
||||||
|
background: var(--overlay-0);
|
||||||
|
}
|
||||||
|
25% {
|
||||||
|
box-shadow: 20px 0 var(--overlay-0), -20px 0 var(--overlay-0);
|
||||||
|
background: var(--overlay-0);
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
box-shadow: 20px -4px var(--overlay-0), -20px 4px var(--overlay-0);
|
||||||
|
background: var(--overlay-0);
|
||||||
|
}
|
||||||
|
75% {
|
||||||
|
box-shadow: 20px 0 var(--overlay-0), -20px 0 var(--overlay-0);
|
||||||
|
background: var(--overlay-0);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
box-shadow: 20px 4px var(--overlay-0), -20px -4px var(--overlay-0);
|
||||||
|
background: var(--overlay-0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,18 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import Loader from './Loader.vue';
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="loader-container">
|
||||||
|
<Loader />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.loader-container {
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -111,7 +111,7 @@ export const useRosterStore = defineStore("roster", () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
function fetchAvailablePlayers(startTime: number, teamId: number) {
|
function fetchAvailablePlayers(startTime: number, teamId: number) {
|
||||||
clientStore.call(
|
return clientStore.call(
|
||||||
fetchAvailablePlayers.name,
|
fetchAvailablePlayers.name,
|
||||||
() => client.default.viewAvailableAtTime(startTime.toString(), teamId),
|
() => client.default.viewAvailableAtTime(startTime.toString(), teamId),
|
||||||
(response) => {
|
(response) => {
|
||||||
|
|
|
@ -1,18 +1,22 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import PlayerCard from "../components/PlayerCard.vue";
|
import PlayerCard from "../components/PlayerCard.vue";
|
||||||
import { computed, reactive, onMounted } from "vue";
|
import { computed, reactive, onMounted, ref } from "vue";
|
||||||
import { useRosterStore } from "../stores/roster";
|
import { useRosterStore } from "../stores/roster";
|
||||||
import { useRoute } from "vue-router";
|
import { useRoute } from "vue-router";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import { useEventsStore } from "@/stores/events";
|
import { useEventsStore } from "@/stores/events";
|
||||||
import EventSchedulerForm from "@/components/EventSchedulerForm.vue";
|
import EventSchedulerForm from "@/components/EventSchedulerForm.vue";
|
||||||
import { useEventForm } from "@/composables/event-form";
|
import { useEventForm } from "@/composables/event-form";
|
||||||
|
import Loader from "@/components/Loader.vue";
|
||||||
|
import LoaderContainer from "@/components/LoaderContainer.vue";
|
||||||
|
|
||||||
const rosterStore = useRosterStore();
|
const rosterStore = useRosterStore();
|
||||||
const eventsStore = useEventsStore();
|
const eventsStore = useEventsStore();
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
|
|
||||||
|
const isLoading = ref(false);
|
||||||
|
|
||||||
const hasAvailablePlayers = computed(() => {
|
const hasAvailablePlayers = computed(() => {
|
||||||
return rosterStore.availablePlayerRoles.length > 0;
|
return rosterStore.availablePlayerRoles.length > 0;
|
||||||
});
|
});
|
||||||
|
@ -28,22 +32,33 @@ function closeSelection() {
|
||||||
}
|
}
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
|
isLoading.value = true;
|
||||||
|
|
||||||
if (eventId.value) {
|
if (eventId.value) {
|
||||||
const event = await eventsStore.fetchEvent(eventId.value);
|
const event = await eventsStore.fetchEvent(eventId.value);
|
||||||
rosterStore.startTime = moment(event.startTime).unix();
|
rosterStore.startTime = moment(event.startTime).unix();
|
||||||
rosterStore.title = event.name;
|
rosterStore.title = event.name;
|
||||||
rosterStore.description = event.description;
|
rosterStore.description = event.description;
|
||||||
Object.assign(rosterStore.selectedPlayers, { });
|
Object.assign(rosterStore.selectedPlayers, { });
|
||||||
rosterStore.fetchPlayersFromEvent(eventId.value);
|
rosterStore.fetchPlayersFromEvent(eventId.value)
|
||||||
|
.then(() => {
|
||||||
|
isLoading.value = false;
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
rosterStore.startTime = Number(route.params.startTime);
|
rosterStore.startTime = Number(route.params.startTime);
|
||||||
rosterStore.fetchAvailablePlayers(rosterStore.startTime, Number(route.params.teamId));
|
rosterStore.fetchAvailablePlayers(rosterStore.startTime, Number(route.params.teamId))
|
||||||
|
.then(() => {
|
||||||
|
isLoading.value = false;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<main>
|
<main v-if="isLoading">
|
||||||
|
<LoaderContainer />
|
||||||
|
</main>
|
||||||
|
<main v-else>
|
||||||
<div class="top">
|
<div class="top">
|
||||||
<a>
|
<a>
|
||||||
<i class="bi bi-arrow-left" />
|
<i class="bi bi-arrow-left" />
|
||||||
|
|
Loading…
Reference in New Issue