2021-10-04 13:53:48 +02:00
|
|
|
<template>
|
|
|
|
<div class="sports-menu">
|
|
|
|
<label
|
|
|
|
v-for="sport in translatedSports"
|
|
|
|
type="checkbox"
|
|
|
|
:key="sport.id"
|
|
|
|
:style="{ color: sportColors[sport.label] }"
|
|
|
|
>
|
|
|
|
<input
|
|
|
|
type="checkbox"
|
|
|
|
:id="sport.id"
|
|
|
|
:name="sport.label"
|
|
|
|
:checked="selectedSportIds.includes(sport.id)"
|
|
|
|
@input="updateSelectedSportIds(sport.id)"
|
|
|
|
/>
|
|
|
|
<SportImage :sport-label="sport.label" />
|
2021-10-05 19:10:26 +02:00
|
|
|
<span class="sport-label">{{ sport.translatedLabel }}</span>
|
2021-10-04 13:53:48 +02:00
|
|
|
</label>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script lang="ts">
|
2021-10-23 15:47:17 +02:00
|
|
|
import { ComputedRef, PropType, computed, defineComponent, inject } from 'vue'
|
2021-10-04 13:53:48 +02:00
|
|
|
import { useI18n } from 'vue-i18n'
|
|
|
|
|
|
|
|
import { ISport, ITranslatedSport } from '@/types/sports'
|
2021-10-23 15:47:17 +02:00
|
|
|
import { translateSports } from '@/utils/sports'
|
2021-10-04 13:53:48 +02:00
|
|
|
|
|
|
|
export default defineComponent({
|
|
|
|
name: 'SportsMenu',
|
|
|
|
props: {
|
|
|
|
selectedSportIds: {
|
|
|
|
type: Array as PropType<number[]>,
|
|
|
|
default: () => [],
|
|
|
|
},
|
|
|
|
userSports: {
|
|
|
|
type: Object as PropType<ISport[]>,
|
|
|
|
required: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
emits: ['selectedSportIdsUpdate'],
|
|
|
|
setup(props, { emit }) {
|
|
|
|
const { t } = useI18n()
|
|
|
|
const translatedSports: ComputedRef<ITranslatedSport[]> = computed(() =>
|
|
|
|
translateSports(props.userSports, t)
|
|
|
|
)
|
|
|
|
|
|
|
|
function updateSelectedSportIds(sportId: number) {
|
|
|
|
emit('selectedSportIdsUpdate', sportId)
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
2021-10-23 15:47:17 +02:00
|
|
|
sportColors: inject('sportColors'),
|
2021-10-04 13:53:48 +02:00
|
|
|
translatedSports,
|
|
|
|
updateSelectedSportIds,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
})
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<style lang="scss">
|
|
|
|
@import '~@/scss/base.scss';
|
|
|
|
.sports-menu {
|
|
|
|
display: flex;
|
|
|
|
justify-content: space-between;
|
|
|
|
padding: $default-padding;
|
|
|
|
@media screen and (max-width: $medium-limit) {
|
|
|
|
justify-content: normal;
|
|
|
|
flex-wrap: wrap;
|
|
|
|
}
|
|
|
|
|
|
|
|
label {
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
font-size: 0.9em;
|
|
|
|
font-weight: normal;
|
|
|
|
min-width: 120px;
|
|
|
|
padding: $default-padding;
|
|
|
|
@media screen and (max-width: $medium-limit) {
|
|
|
|
min-width: 100px;
|
|
|
|
}
|
|
|
|
@media screen and (max-width: $x-small-limit) {
|
2021-10-05 19:10:26 +02:00
|
|
|
min-width: 20px;
|
|
|
|
.sport-label {
|
|
|
|
display: none;
|
|
|
|
}
|
2021-10-04 13:53:48 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
.sport-img {
|
|
|
|
padding: 3px;
|
|
|
|
width: 20px;
|
|
|
|
height: 20px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</style>
|