Improve event card UI
							parent
							
								
									e1c6a7bb14
								
							
						
					
					
						commit
						ebbd969afd
					
				| 
						 | 
				
			
			@ -1,15 +1,19 @@
 | 
			
		|||
<script setup lang="ts">
 | 
			
		||||
import type { EventSchema } from "@/client";
 | 
			
		||||
import type { EventSchema, EventWithPlayerSchema } from "@/client";
 | 
			
		||||
import { useRosterStore } from "@/stores/roster";
 | 
			
		||||
import { useTeamsStore } from "@/stores/teams";
 | 
			
		||||
import { useTeamsEventsStore } from "@/stores/teams/events";
 | 
			
		||||
import moment from "moment";
 | 
			
		||||
import { computed } from "vue";
 | 
			
		||||
 | 
			
		||||
const teamsStore = useTeamsStore();
 | 
			
		||||
const rosterStore = useRosterStore();
 | 
			
		||||
const teamEventsStore = useTeamsEventsStore();
 | 
			
		||||
 | 
			
		||||
const date = computed(() => moment(props.event.startTime));
 | 
			
		||||
const date = computed(() => moment(props.event.event.startTime));
 | 
			
		||||
 | 
			
		||||
const formattedTime = computed(() => {
 | 
			
		||||
  const team = teamsStore.teams[props.event.teamId];
 | 
			
		||||
  const team = teamsStore.teams[props.event.event.teamId];
 | 
			
		||||
  const offsetDate = date.value.clone().tz(team.tzTimezone);
 | 
			
		||||
  return `${date.value.format("LT")} (${offsetDate.format("LT z")})`;
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -23,8 +27,24 @@ const shortMonth = computed(() => {
 | 
			
		|||
});
 | 
			
		||||
 | 
			
		||||
const props = defineProps<{
 | 
			
		||||
  event: EventSchema;
 | 
			
		||||
  event: EventWithPlayerSchema;
 | 
			
		||||
}>();
 | 
			
		||||
 | 
			
		||||
function attend() {
 | 
			
		||||
  teamEventsStore.attendEvent(props.event.event.id);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function unattend() {
 | 
			
		||||
  teamEventsStore.unattendEvent(props.event.event.id);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function attendOrUnattend() {
 | 
			
		||||
  if (props.event.playerEvent?.hasConfirmed) {
 | 
			
		||||
    unattend();
 | 
			
		||||
  } else {
 | 
			
		||||
    attend();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<template>
 | 
			
		||||
| 
						 | 
				
			
			@ -39,7 +59,7 @@ const props = defineProps<{
 | 
			
		|||
    </div>
 | 
			
		||||
    <div class="details">
 | 
			
		||||
      <div>
 | 
			
		||||
        <h3>{{ event.name }}</h3>
 | 
			
		||||
        <h3>{{ event.event.name }}</h3>
 | 
			
		||||
        <div>
 | 
			
		||||
          <span>
 | 
			
		||||
            <i class="bi bi-clock-fill margin" />
 | 
			
		||||
| 
						 | 
				
			
			@ -48,11 +68,33 @@ const props = defineProps<{
 | 
			
		|||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="subdetails">
 | 
			
		||||
        <span v-if="event.description">{{ event.description }}</span>
 | 
			
		||||
        <span v-if="event.event.description">{{ event.event.description }}</span>
 | 
			
		||||
        <em v-else class="subtext">No description provided.</em>
 | 
			
		||||
        <button class="class-info">
 | 
			
		||||
          <i class="tf2class tf2-PocketScout margin" />
 | 
			
		||||
          Accept as Pocket Scout
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="button-group">
 | 
			
		||||
        <button
 | 
			
		||||
          @click="attendOrUnattend()"
 | 
			
		||||
          v-if="event.playerEvent"
 | 
			
		||||
          :class="{
 | 
			
		||||
            'class-info': true,
 | 
			
		||||
            'confirmed': event.playerEvent.hasConfirmed,
 | 
			
		||||
          }"
 | 
			
		||||
        >
 | 
			
		||||
          <template v-if="!event.playerEvent.hasConfirmed">
 | 
			
		||||
            <i class="bi bi-check2" />
 | 
			
		||||
            Confirm
 | 
			
		||||
          </template>
 | 
			
		||||
          <template v-else>
 | 
			
		||||
            <i class="bi bi-check2-all" />
 | 
			
		||||
            Confirmed
 | 
			
		||||
          </template>
 | 
			
		||||
          <span v-if="event.playerEvent.role">
 | 
			
		||||
            as {{ rosterStore.roleNames[event.playerEvent.role.role] }}
 | 
			
		||||
          </span>
 | 
			
		||||
        </button>
 | 
			
		||||
        <button @click="attend" v-else>
 | 
			
		||||
          <i class="bi bi-check2" />
 | 
			
		||||
          Attend
 | 
			
		||||
        </button>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
| 
						 | 
				
			
			@ -62,11 +104,8 @@ const props = defineProps<{
 | 
			
		|||
<style scoped>
 | 
			
		||||
.event-card {
 | 
			
		||||
  display: flex;
 | 
			
		||||
  padding: 1rem;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  /*background-color: white;*/
 | 
			
		||||
  border: 1px solid var(--text);
 | 
			
		||||
  border-radius: 8px;
 | 
			
		||||
  align-items: stretch;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -77,6 +116,10 @@ const props = defineProps<{
 | 
			
		|||
  justify-content: center;
 | 
			
		||||
  line-height: 1;
 | 
			
		||||
  flex-basis: 4rem;
 | 
			
		||||
  padding: 1rem;
 | 
			
		||||
  background-color: var(--text);
 | 
			
		||||
  color: var(--base);
 | 
			
		||||
  border-radius: 8px 0 0 8px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.date .month {
 | 
			
		||||
| 
						 | 
				
			
			@ -91,8 +134,12 @@ const props = defineProps<{
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
.details {
 | 
			
		||||
  padding: 1rem;
 | 
			
		||||
  border: 1px solid var(--text);
 | 
			
		||||
  border-radius: 0 8px 8px 0;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  gap: 0.5rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -110,4 +157,15 @@ const props = defineProps<{
 | 
			
		|||
  font-size: 1.2rem;
 | 
			
		||||
  vertical-align: middle;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.button-group {
 | 
			
		||||
  display: flex;
 | 
			
		||||
  gap: 0.5rem;
 | 
			
		||||
  justify-content: flex-end;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
button.confirmed {
 | 
			
		||||
  background-color: var(--text);
 | 
			
		||||
  color: var(--base);
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,15 +1,15 @@
 | 
			
		|||
<script setup lang="ts">
 | 
			
		||||
import type { EventSchema } from "@/client";
 | 
			
		||||
import type { EventWithPlayerSchema } from "@/client";
 | 
			
		||||
import EventCard from "./EventCard.vue";
 | 
			
		||||
 | 
			
		||||
const props = defineProps<{
 | 
			
		||||
  events: EventSchema[];
 | 
			
		||||
  events: EventWithPlayerSchema[];
 | 
			
		||||
}>();
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="events-list" v-if="props.events?.length > 0">
 | 
			
		||||
    <EventCard v-for="event in props.events" :key="event.id" :event="event" />
 | 
			
		||||
    <EventCard v-for="event in props.events" :key="event.event.id" :event="event" />
 | 
			
		||||
  </div>
 | 
			
		||||
  <div class="events-list" v-else>
 | 
			
		||||
    <em class="subtext">No upcoming events.</em>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue