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