Skip to content
Snippets Groups Projects
ShowListGrid.vue 1.93 KiB
Newer Older
  • Learn to ignore specific revisions
  • <template>
      <div
        class="tw-grid tw-gap-6 tw-grid-cols-[repeat(auto-fill,minmax(var(--grid-item-width),1fr))] [--grid-item-width:300px] lg:[--grid-item-width:350px] tw-mx-auto"
      >
        <template v-for="(show, index) in showList" :key="show.id">
          <template v-if="index === splitIndex && splitIndex !== 0">
            <div class="tw-col-span-full">
              <hr class="tw-w-full" />
              <h2 class="tw-text-3xl tw-font-black tw-m-0 tw-mt-8">
                {{ t('showListGrid.otherShows') }}
              </h2>
            </div>
          </template>
          <ShowListGridItem
            :show="show"
            :data-show-grid-item="index"
            @focus="lastFocusedShowIndex = index"
          />
        </template>
    
        <div class="tw-col-span-full tw-flex tw-justify-center">
          <button v-if="hasMore" class="btn btn-default" @click="loadMore">
    
            {{ t('loadMoreItems', { items: t('show.plural') }) }}
    
          </button>
        </div>
      </div>
    </template>
    
    <script lang="ts" setup>
    
    import { PaginatedListResult } from '@rokoli/bnb/drf'
    
    import { computed, ref } from 'vue'
    import { Show } from '@/types'
    import { useI18n } from '@/i18n'
    import { useAuthStore } from '@/stores/auth'
    import ShowListGridItem from './ShowListGridItem.vue'
    
    defineOptions({ compatConfig: { MODE: 3 } })
    
    const props = defineProps<{
      shows: PaginatedListResult<Show>[]
      split: boolean
      hasMore?: boolean
    }>()
    const emit = defineEmits<{ loadMore: [] }>()
    const { t } = useI18n()
    const { steeringUser } = useAuthStore()
    const lastFocusedShowIndex = ref(0)
    const showList = computed(() => props.shows.flatMap((shows) => shows.items))
    const splitIndex = computed(() => {
      if (!props.split) return -1
      const id = steeringUser?.id
      return id ? showList.value.findIndex((show) => !show.ownerIds.includes(id)) : -1
    })
    
    function loadMore() {
      emit('loadMore')
      const el = document.querySelector<HTMLAnchorElement>(
        `[data-show-grid-item="${lastFocusedShowIndex.value}"]`,
      )
      if (el) el.focus()
    }
    </script>