Added Keyboard Controls for Tab Nav and Back to List Added Select On Enter for First Entry in Search for Customers and Vendors
255 lines
6.1 KiB
Vue
255 lines
6.1 KiB
Vue
<script setup>
|
|
import dayjs from "dayjs";
|
|
|
|
definePageMeta({
|
|
middleware: "auth"
|
|
})
|
|
|
|
const dataStore = useDataStore()
|
|
const route = useRoute()
|
|
const router = useRouter()
|
|
const toast = useToast()
|
|
const id = ref(route.params.id ? route.params.id : null )
|
|
|
|
let currentItem = ref(null)
|
|
|
|
//Working
|
|
const mode = ref(route.params.mode || "show")
|
|
const itemInfo = ref({
|
|
name: "",
|
|
licensePlate: "",
|
|
type: "",
|
|
driver: null,
|
|
active: true
|
|
})
|
|
const oldItemInfo = ref({})
|
|
|
|
const tabItems = [{
|
|
label: 'Informationen',
|
|
},{
|
|
label: "Logbuch"
|
|
},/* {
|
|
label: 'Eingangsrechnungen',
|
|
},*/ {
|
|
label: 'Dokumente',
|
|
}]
|
|
|
|
const incomingInvoicesColumns = [
|
|
{
|
|
key: "state",
|
|
label: "Status",
|
|
sortable: true
|
|
},{
|
|
key: "vendor",
|
|
label: "Lieferant",
|
|
sortable: true
|
|
},{
|
|
key: "date",
|
|
label: "Datum",
|
|
sortable: true
|
|
},{
|
|
key: "description",
|
|
label: "Beschreibung",
|
|
sortable: true
|
|
},{
|
|
key: "accounts",
|
|
label: "Betrag",
|
|
sortable: true
|
|
},
|
|
]
|
|
|
|
//Functions
|
|
const setupPage = () => {
|
|
if(mode.value === "show" || mode.value === "edit"){
|
|
currentItem.value = dataStore.getVehicleById(Number(useRoute().params.id))
|
|
}
|
|
|
|
if(mode.value === "edit") itemInfo.value = currentItem.value
|
|
if(currentItem.value) oldItemInfo.value = JSON.parse(JSON.stringify(currentItem.value))
|
|
}
|
|
|
|
const cancelEditorCreate = () => {
|
|
if(currentItem.value) {
|
|
router.push(`/vehicles/show/${currentItem.value.id}`)
|
|
} else {
|
|
router.push(`/vehicles`)
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const getRowAmount = (row) => {
|
|
let amount = 0
|
|
|
|
row.accounts.forEach(account => {
|
|
amount += account.amountNet
|
|
amount += account.amountTax
|
|
})
|
|
|
|
return amount
|
|
}
|
|
|
|
setupPage()
|
|
</script>
|
|
|
|
<template>
|
|
<UDashboardNavbar
|
|
:title="currentItem ? currentItem.licensePlate : (mode === 'create' ? 'Fahrzeug erstellen' : 'Fahrzeug bearbeiten')"
|
|
:ui="{center: 'flex items-stretch gap-1.5 min-w-0'}"
|
|
>
|
|
<template #left>
|
|
<UButton
|
|
icon="i-heroicons-chevron-left"
|
|
variant="outline"
|
|
@click="router.push(`/vehicles`)"
|
|
>
|
|
Fahrzeuge
|
|
</UButton>
|
|
</template>
|
|
<template #center>
|
|
<h1
|
|
v-if="currentItem"
|
|
:class="['text-xl','font-medium']"
|
|
>{{currentItem ? `Fahrzeug: ${currentItem.licensePlate}` : (mode === 'create' ? 'Fahrzeug erstellen' : 'Fahrzeug bearbeiten')}}</h1>
|
|
</template>
|
|
<template #right>
|
|
<UButton
|
|
v-if="mode === 'edit'"
|
|
@click="dataStore.updateItem('vehicles',itemInfo, oldItemInfo)"
|
|
>
|
|
Speichern
|
|
</UButton>
|
|
<UButton
|
|
v-else-if="mode === 'create'"
|
|
@click="dataStore.createNewItem('vehicles',itemInfo)"
|
|
>
|
|
Erstellen
|
|
</UButton>
|
|
<UButton
|
|
@click="cancelEditorCreate"
|
|
color="red"
|
|
class="ml-2"
|
|
v-if="mode === 'edit' || mode === 'create'"
|
|
>
|
|
Abbrechen
|
|
</UButton>
|
|
<UButton
|
|
v-if="mode === 'show'"
|
|
@click="router.push(`/vehicles/edit/${currentItem.id}`)"
|
|
>
|
|
Bearbeiten
|
|
</UButton>
|
|
</template>
|
|
</UDashboardNavbar>
|
|
<UTabs
|
|
:items="tabItems"
|
|
v-if="mode === 'show'"
|
|
class="p-5"
|
|
>
|
|
<template #item="{item}">
|
|
<UCard class="mt-5">
|
|
<div class="truncate" v-if="item.label === 'Informationen'">
|
|
<p>Typ: {{currentItem.type}}</p>
|
|
<p>Fahrgestellnummer: {{currentItem.vin}}</p>
|
|
<p>Fahrer: {{dataStore.profiles.find(profile => profile.id === currentItem.driver) ? dataStore.profiles.find(profile => profile.id === currentItem.driver).fullName : 'Kein Fahrer gewählt'}}</p>
|
|
</div>
|
|
<div v-else-if="item.label === 'Eingangsrechnungen'">
|
|
<UTable
|
|
:rows="dataStore.getIncomingInvoicesByVehicleId(currentItem.id)"
|
|
:columns="incomingInvoicesColumns"
|
|
@select="(row) => router.push('/receipts/show/' + row.id)"
|
|
>
|
|
<template #vendor-data="{row}">
|
|
{{dataStore.getVendorById(row.vendor) ? dataStore.getVendorById(row.vendor).name : ""}}
|
|
</template>
|
|
<template #date-data="{row}">
|
|
{{dayjs(row.date).format("DD.MM.YYYY")}}
|
|
</template>
|
|
<template #accounts-data="{row}">
|
|
{{getRowAmount(row) ? String(getRowAmount(row).toFixed(2)).replace('.',',') + " €" : ""}}
|
|
</template>
|
|
</UTable>
|
|
|
|
</div>
|
|
<div v-else-if="item.label === 'Logbuch'">
|
|
<HistoryDisplay
|
|
type="vehicle"
|
|
v-if="currentItem"
|
|
:element-id="currentItem.id"
|
|
/>
|
|
</div>
|
|
<div v-else-if="item.label === 'Dokumente'">
|
|
<Toolbar>
|
|
<DocumentUpload
|
|
type="vehicle"
|
|
:element-id="currentItem.id"
|
|
/>
|
|
</Toolbar>
|
|
|
|
<DocumentList
|
|
:documents="dataStore.getDocumentsByVehicleId(currentItem.id)"
|
|
/>
|
|
</div>
|
|
</UCard>
|
|
|
|
</template>
|
|
|
|
</UTabs>
|
|
<UForm
|
|
v-else-if="mode == 'edit' || mode == 'create'"
|
|
class="p-5"
|
|
>
|
|
|
|
<UFormGroup
|
|
label="Kennzeichen:"
|
|
>
|
|
<UInput
|
|
v-model="itemInfo.licensePlate"
|
|
/>
|
|
</UFormGroup>
|
|
|
|
|
|
|
|
<UFormGroup
|
|
label="Fahrzeug aktiv:"
|
|
>
|
|
<UCheckbox
|
|
v-model="itemInfo.active"
|
|
/>
|
|
</UFormGroup>
|
|
<UFormGroup
|
|
label="Fahrgestellnummer:"
|
|
>
|
|
<UInput
|
|
v-model="itemInfo.vin"
|
|
/>
|
|
</UFormGroup>
|
|
<UFormGroup
|
|
label="Typ:"
|
|
>
|
|
<UTextarea
|
|
v-model="itemInfo.type"
|
|
/>
|
|
</UFormGroup>
|
|
<UFormGroup
|
|
label="Fahrer:"
|
|
>
|
|
<USelectMenu
|
|
v-model="itemInfo.driver"
|
|
:options="[{id: null, fullName: 'Kein Fahrer'},...dataStore.profiles]"
|
|
option-attribute="fullName"
|
|
value-attribute="id"
|
|
|
|
>
|
|
<template #label>
|
|
{{dataStore.profiles.find(profile => profile.id === itemInfo.driver) ? dataStore.profiles.find(profile => profile.id === itemInfo.driver).fullName : 'Kein Fahrer ausgewählt'}}
|
|
</template>
|
|
</USelectMenu>
|
|
</UFormGroup>
|
|
</UForm>
|
|
</template>
|
|
|
|
<style scoped>
|
|
|
|
</style> |