Added Keyboard Controls for Tab Nav and Back to List Added Select On Enter for First Entry in Search for Customers and Vendors
124 lines
2.9 KiB
Vue
124 lines
2.9 KiB
Vue
<template>
|
|
<UDashboardNavbar title="Lieferanten" :badge="filteredRows.length">
|
|
<template #right>
|
|
<UInput
|
|
id="searchinput"
|
|
name="searchinput"
|
|
v-model="searchString"
|
|
icon="i-heroicons-funnel"
|
|
autocomplete="off"
|
|
placeholder="Suche..."
|
|
class="hidden lg:block"
|
|
@keydown.esc="$event.target.blur()"
|
|
>
|
|
<template #trailing>
|
|
<UKbd value="/" />
|
|
</template>
|
|
</UInput>
|
|
|
|
<UButton @click="router.push(`/vendors/create/`)">+ Lieferant</UButton>
|
|
|
|
</template>
|
|
</UDashboardNavbar>
|
|
|
|
<UDashboardToolbar>
|
|
<template #right>
|
|
<USelectMenu
|
|
v-model="selectedColumns"
|
|
icon="i-heroicons-adjustments-horizontal-solid"
|
|
:options="templateColumns"
|
|
multiple
|
|
class="hidden lg:block"
|
|
by="key"
|
|
>
|
|
<template #label>
|
|
Spalten
|
|
</template>
|
|
</USelectMenu>
|
|
</template>
|
|
</UDashboardToolbar>
|
|
|
|
<UTable
|
|
:rows="filteredRows"
|
|
:columns="columns"
|
|
:ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }"
|
|
class="w-full"
|
|
@select="(i) => router.push(`/vendors/show/${i.id}`)"
|
|
:empty-state="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine Lieferanten anzuzeigen' }"
|
|
>
|
|
<template #address-data="{row}">
|
|
{{row.infoData.street ? `${row.infoData.street}, ` : ''}}{{row.infoData.special ? `${row.infoData.special},` : ''}} {{(row.infoData.zip || row.infoData.city) ? `${row.infoData.zip} ${row.infoData.city}, ` : ''}} {{row.infoData.country}}
|
|
</template>
|
|
</UTable>
|
|
|
|
</template>
|
|
|
|
<script setup>
|
|
definePageMeta({
|
|
middleware: "auth"
|
|
})
|
|
|
|
defineShortcuts({
|
|
'/': () => {
|
|
//console.log(searchinput)
|
|
//searchinput.value.focus()
|
|
document.getElementById("searchinput").focus()
|
|
},
|
|
'+': () => {
|
|
router.push("/vendors/create")
|
|
},
|
|
'enter': {
|
|
usingInput: "searchinput",
|
|
handler: () => {
|
|
router.push(`/vendors/show/${selectedEntry.value}`)
|
|
}
|
|
}
|
|
})
|
|
|
|
const dataStore = useDataStore()
|
|
const router = useRouter()
|
|
const mode = ref("show")
|
|
|
|
const templateColumns = [
|
|
{
|
|
key: 'vendorNumber',
|
|
label: "Lieferantennr.",
|
|
sortable: true
|
|
},
|
|
{
|
|
key: "name",
|
|
label: "Name",
|
|
sortable: true
|
|
},
|
|
{
|
|
key: "address",
|
|
label: "Adresse",
|
|
sortable: true
|
|
}
|
|
]
|
|
const selectedColumns = ref(templateColumns)
|
|
const columns = computed(() => templateColumns.filter((column) => selectedColumns.value.includes(column)))
|
|
|
|
const searchString = ref('')
|
|
const selectedEntry = ref(null)
|
|
|
|
const filteredRows = computed(() => {
|
|
if(!searchString.value) {
|
|
return dataStore.vendors
|
|
}
|
|
|
|
let results = dataStore.vendors.filter(item => {
|
|
return Object.values(item).some((value) => {
|
|
return String(value).toLowerCase().includes(searchString.value.toLowerCase())
|
|
})
|
|
})
|
|
|
|
selectedEntry.value = results[0].id
|
|
|
|
return results
|
|
})
|
|
</script>
|
|
|
|
<style scoped>
|
|
|
|
</style> |