Skip to content
Snippets Groups Projects
SelectTimetable.vue 3.05 KiB
Newer Older
<script>
import timetableTypes from "./timetableTypes";

export default {
  name: "SelectTimetable",
  props: {
    value: {
      type: Object,
Jonathan Weth's avatar
Jonathan Weth committed
      required: false,
      default: null,
    },
    availableTimetables: {
      type: Array,
      required: true,
    },
    loading: {
      type: Boolean,
      required: false,
      default: false,
    },
  },
  data() {
    return {
      selected: null,
      selectedFull: null,
      search: "",
      types: timetableTypes,
    };
  },
  watch: {
    value(val) {
      this.selectedFull = val;
      this.selected = val.id;
    },
    selectedFull(val) {
      this.$emit("input", val);
    },
  },
  computed: {
    availableTimetablesFiltered() {
      // Filter timetables by selected types
      return this.availableTimetables.filter((timetable) => {
        return this.selectedType == timetable.type;
      });
    },
  },
};
</script>

<template>
  <div>
    <v-card-text class="mb-0">
      <!-- Search field for timetables -->
      <v-text-field
        search
        filled
        rounded
        clearable
        autofocus
        v-model="search"
        :placeholder="$t('chronos.timetable.search')"
        prepend-inner-icon="mdi-magnify"
        hide-details="auto"
        class="mb-2"
      />

      <!-- Filter by timetable types -->
      <v-btn-toggle v-model="selectedType" dense block class="d-flex">
        <v-btn
          v-for="type in types"
          :key="type.id"
          class="flex-grow-1"
          :value="type.id"
        >
          {{ $t(type.name) }}
        </v-btn>
      </v-btn-toggle>
    </v-card-text>

    <!-- Select of available timetables -->
    <v-data-iterator
      :items="availableTimetablesFiltered"
      item-key="id"
      :search="search"
      single-expand
      disable-pagination
Julian's avatar
Julian committed
      hide-default-footer
      :loading="loading"
    >
      <template #default="{ items, isExpanded, expand }">
        <v-list class="scrollable-list">
          <v-list-item-group v-model="selected">
            <v-list-item
              v-for="item in items"
              @click="selectedFull = item"
              :value="item.id"
              :key="item.id"
            >
              <v-list-item-icon color="primary">
                <v-icon v-if="item.type in types" color="secondary">
                  {{ types[item.type].icon }}
                </v-icon>
                <v-icon v-else color="secondary">mdi-grid</v-icon>
              </v-list-item-icon>
              <v-list-item-content>
                <v-list-item-title>{{ item.name }}</v-list-item-title>
              </v-list-item-content>
              <v-list-item-action>
                <v-icon>mdi-chevron-right</v-icon>
              </v-list-item-action>
            </v-list-item>
          </v-list-item-group>
        </v-list>
      </template>
Jonathan Weth's avatar
Jonathan Weth committed
      <template #loading>
        <v-skeleton-loader
          type="list-item-avatar@10"
Jonathan Weth's avatar
Jonathan Weth committed
        />
      </template>
    </v-data-iterator>
  </div>
</template>

<style scoped>
.scrollable-list {
  height: 100%;
  overflow-y: scroll;
}
</style>