DosenApp.vue 3.76 KB
<script setup lang="ts">
import figma from '@images/icons/project-icons/figma.png'
import html5 from '@images/icons/project-icons/html5.png'
import python from '@images/icons/project-icons/python.png'
import react from '@images/icons/project-icons/react.png'
import sketch from '@images/icons/project-icons/sketch.png'
import vue from '@images/icons/project-icons/vue.png'
import xamarin from '@images/icons/project-icons/xamarin.png'

// Project Table Header
const applicationTableHeaders = [
  { title: 'UI App', key: 'application' },
  { title: 'Link', key: 'link' },
]

const applications = [
  {
    logo: react,
    name: 'Human Resource Information System Universitas Indonesia',
    nameShort: 'HRIS UI',
    link: 'https://hris.ui.ac.id/',
  },
  {
    logo: figma,
    name: 'Sistem Informasi Akademik NextGeneration',
    nameShort: 'SIAKNG',
    link: 'https://academic.ui.ac.id/',
  },
  {
    logo: figma,
    name: 'E-learning Management System',
    nameShort: 'EMAS-2',
    link: 'https://emas2.ui.ac.id/',
  },
  {
    logo: vue,
    name: 'Dashboard App',
    nameShort: 'Vuejs Project',
    link: '#',
  },
  {
    logo: xamarin,
    name: 'Foodista mobile app',
    nameShort: 'Xamarin Project',
    link: '#',
  },
  {
    logo: python,
    name: 'Dojo Email App',
    nameShort: 'Python Project',
    link: '#',
  },
  {
    logo: sketch,
    name: 'Blockchain App',
    nameShort: 'Sketch Project',
    link: '#',
  },
  {
    logo: html5,
    name: 'Hoffman App',
    nameShort: 'HTML Project',
    link: '#',
  },
]

// Search query state
const searchQuery = ref('');

// Filter aplikasi berdasarkan pencarian
const filteredApplications = computed(() => {
  const query = searchQuery.value.toLowerCase();
  return applications.filter((app) =>
    [app.name, app.nameShort, app.link].some((field) =>
      field.toLowerCase().includes(query)
    )
  );
});
</script>

<template>
  <VCard title="List Aplikasi untuk Dosen" class="projectList">
    <!-- 👉 User Project List Table -->

    <!-- Search Input -->
    <div class="search-container mb-4 pl-2 pr-2">
      <!-- <VTextField v-model="searchQuery" label="Search" clearable variant="outlined" density="comfortable" /> -->
      <VTextField v-model="searchQuery" label="Search" placeholder="Search ..." append-inner-icon="ri-search-line"
        clearable @click:clear="searchQuery = ''" single-line hide-details dense outlined />
    </div>

    <!-- SECTION Datatable -->
    <VDataTable :headers="applicationTableHeaders" :items="filteredApplications" hide-default-footer fixed-header
      item-value="name">

      <!-- application -->
      <template #item.application="{ item }">
        <div class="d-flex align-center gap-x-3">
          <VAvatar :size="34" :image="item.logo" />
          <div>
            <h6 class="text-h6 text-no-wrap">
              {{ item.name }}
            </h6>
            <div class="text-body-2">
              {{ item.nameShort }}
            </div>
          </div>
        </div>
      </template>

      <!-- link -->
      <template #item.link="{ item }">
        <div class="d-flex align-center gap-3">
          <div class="text-high-emphasis">
            <a :href="item.link" target="_blank" rel="noopener">{{ item.link }}</a>
          </div>
        </div>
      </template>

      <!-- TODO Refactor this after vuetify provides proper solution for removing default footer -->
      <template #bottom />
    </VDataTable>
    <!-- !SECTION -->
  </VCard>
</template>

<style lang="scss">
.projectList {
  .v-table {
    &--density-default {
      .v-table__wrapper {
        table {
          tbody {
            tr {
              td {
                block-size: 56px;
              }
            }
          }
        }
      }
    }
  }
}

.search-container {
  display: flex;
  justify-content: flex-end;
}
</style>