Fix views

This commit is contained in:
Philipp Lang 2023-12-19 02:18:58 +01:00
parent 2a6fd1152b
commit 3697885bca
6 changed files with 70 additions and 70 deletions

View File

@ -1,18 +1,40 @@
<template> <template>
<button class="btn label" v-bind="$attrs" :class="colors[color]" v-tooltip="menuStore.tooltipsVisible ? slotContent : ''" v-if="$attrs.onClick"> <button v-if="$attrs.onClick" v-tooltip="menuStore.tooltipsVisible ? slotContent : ''" class="btn label" v-bind="$attrs" :class="colors[color]">
<ui-sprite v-show="icon" class="w-3 h-3 xl:mr-2" :src="icon"></ui-sprite> <ui-sprite v-show="icon" class="w-3 h-3 xl:mr-2" :src="icon"></ui-sprite>
<span class="hidden xl:inline"><slot></slot></span> <span class="hidden xl:inline">
<slot></slot>
</span>
</button> </button>
<i-link :href="href" class="btn label" v-bind="$attrs" :class="colors[color]" v-tooltip="menuStore.tooltipsVisible ? slotContent : ''" v-else> <i-link v-if="!$attrs.onClick && !asA" v-tooltip="menuStore.tooltipsVisible ? slotContent : ''" :href="href" class="btn label" v-bind="$attrs" :class="colors[color]">
<ui-sprite v-show="icon" class="w-3 h-3 xl:mr-2" :src="icon"></ui-sprite> <ui-sprite v-show="icon" class="w-3 h-3 xl:mr-2" :src="icon"></ui-sprite>
<span class="hidden xl:inline"><slot></slot></span> <span class="hidden xl:inline">
<slot></slot>
</span>
</i-link> </i-link>
<a v-if="asA" v-tooltip="menuStore.tooltipsVisible ? slotContent : ''" :href="href" target="_BLANK" class="btn label" v-bind="$attrs" :class="colors[color]">
<ui-sprite v-show="icon" class="w-3 h-3 xl:mr-2" :src="icon"></ui-sprite>
<span class="hidden xl:inline">
<slot></slot>
</span>
</a>
</template> </template>
<script> <script>
import {menuStore} from '../../stores/menuStore.js'; import {menuStore} from '../../stores/menuStore.js';
export default { export default {
props: {
asA: {
type: Boolean,
default: () => false,
},
href: {
required: false,
default: () => '#',
},
icon: {},
color: {},
},
data: function () { data: function () {
return { return {
menuStore: menuStore(), menuStore: menuStore(),
@ -23,19 +45,11 @@ export default {
}, },
}; };
}, },
props: {
href: {
required: false,
default: () => '#',
},
icon: {},
color: {},
},
computed: { computed: {
slotContent() { slotContent() {
return this.$slots.default()[0].children; return this.$slots.default()[0].children;
} },
}, },
}; };
</script> </script>

View File

@ -2,10 +2,8 @@
<page-layout> <page-layout>
<template #toolbar> <template #toolbar>
<page-toolbar-button color="primary" icon="plus" @click="create">Rechnung anlegen</page-toolbar-button> <page-toolbar-button color="primary" icon="plus" @click="create">Rechnung anlegen</page-toolbar-button>
<page-toolbar-button color="primary" icon="plus" @click="massstore = { year: '' }">Massenrechnung <page-toolbar-button color="primary" icon="plus" @click="massstore = {year: ''}">Massenrechnung anlegen</page-toolbar-button>
anlegen</page-toolbar-button> <page-toolbar-button :href="meta.links.masspdf" color="primary" icon="plus" as-a>Post-Briefe abrufen</page-toolbar-button>
<page-toolbar-button :href="meta.links.masspdf" color="primary" icon="plus">Post-Briefe
abrufen</page-toolbar-button>
</template> </template>
<ui-popup v-if="massstore !== null" heading="Massenrechnung anlegen" @close="massstore = null"> <ui-popup v-if="massstore !== null" heading="Massenrechnung anlegen" @close="massstore = null">
@ -23,49 +21,43 @@
<div> <div>
<p class="mt-4">Diese Rechnung löschen?</p> <p class="mt-4">Diese Rechnung löschen?</p>
<div class="grid grid-cols-2 gap-3 mt-6"> <div class="grid grid-cols-2 gap-3 mt-6">
<a href="#" class="text-center btn btn-danger" @click.prevent=" <a
remove(deleting); href="#"
deleting = null; class="text-center btn btn-danger"
">Rechnung löschen</a> @click.prevent="
remove(deleting);
deleting = null;
"
>Rechnung löschen</a
>
<a href="#" class="text-center btn btn-primary" @click.prevent="deleting = null">Abbrechen</a> <a href="#" class="text-center btn btn-primary" @click.prevent="deleting = null">Abbrechen</a>
</div> </div>
</div> </div>
</ui-popup> </ui-popup>
<ui-popup v-if="single !== null" :heading="`Rechnung ${single.id ? 'bearbeiten' : 'erstellen'}`" <ui-popup v-if="single !== null" :heading="`Rechnung ${single.id ? 'bearbeiten' : 'erstellen'}`" inner-width="max-w-4xl" @close="cancel">
inner-width="max-w-4xl" @close="cancel">
<form class="grid grid-cols-2 gap-3 mt-4" @submit.prevent="submit"> <form class="grid grid-cols-2 gap-3 mt-4" @submit.prevent="submit">
<ui-box heading="Empfänger" container-class="grid grid-cols-2 gap-3 col-span-full"> <ui-box heading="Empfänger" container-class="grid grid-cols-2 gap-3 col-span-full">
<f-text id="to_name" v-model="single.to.name" name="to_name" label="Name" class="col-span-full" <f-text id="to_name" v-model="single.to.name" name="to_name" label="Name" class="col-span-full" required></f-text>
required></f-text> <f-text id="to_address" v-model="single.to.address" name="to_address" label="Adresse" class="col-span-full" required></f-text>
<f-text id="to_address" v-model="single.to.address" name="to_address" label="Adresse"
class="col-span-full" required></f-text>
<f-text id="to_zip" v-model="single.to.zip" name="to_zip" label="PLZ" required></f-text> <f-text id="to_zip" v-model="single.to.zip" name="to_zip" label="PLZ" required></f-text>
<f-text id="to_location" v-model="single.to.location" name="to_location" label="Ort" required></f-text> <f-text id="to_location" v-model="single.to.location" name="to_location" label="Ort" required></f-text>
<f-text id="mail_email" v-model="single.mail_email" name="mail_email" label="E-Mail-Adresse" <f-text id="mail_email" v-model="single.mail_email" name="mail_email" label="E-Mail-Adresse" class="col-span-full"></f-text>
class="col-span-full"></f-text>
</ui-box> </ui-box>
<ui-box heading="Status" container-class="grid gap-3"> <ui-box heading="Status" container-class="grid gap-3">
<f-select id="status" v-model="single.status" :options="meta.statuses" name="status" label="Status" <f-select id="status" v-model="single.status" :options="meta.statuses" name="status" label="Status" required></f-select>
required></f-select> <f-select id="via" v-model="single.via" :options="meta.vias" name="via" label="Rechnungsweg" required></f-select>
<f-select id="via" v-model="single.via" :options="meta.vias" name="via" label="Rechnungsweg"
required></f-select>
<f-text id="greeting" v-model="single.greeting" name="greeting" label="Anrede" required></f-text> <f-text id="greeting" v-model="single.greeting" name="greeting" label="Anrede" required></f-text>
<f-text id="usage" v-model="single.usage" name="usage" label="Verwendungszweck" required></f-text> <f-text id="usage" v-model="single.usage" name="usage" label="Verwendungszweck" required></f-text>
</ui-box> </ui-box>
<ui-box heading="Positionen" class="col-span-full" container-class="grid gap-3"> <ui-box heading="Positionen" class="col-span-full" container-class="grid gap-3">
<template #in-title> <template #in-title>
<ui-icon-button class="ml-3 btn-primary" icon="plus" <ui-icon-button class="ml-3 btn-primary" icon="plus" @click="single.positions.push({...meta.default_position})">Neu</ui-icon-button>
@click="single.positions.push({ ...meta.default_position })">Neu</ui-icon-button>
</template> </template>
<div v-for="(position, index) in single.positions" :key="index" class="flex items-end space-x-3"> <div v-for="(position, index) in single.positions" :key="index" class="flex items-end space-x-3">
<f-text :id="`position-description-${index}`" v-model="position.description" class="grow" <f-text :id="`position-description-${index}`" v-model="position.description" class="grow" :name="`position-description-${index}`" label="Beschreibung" required></f-text>
:name="`position-description-${index}`" label="Beschreibung" required></f-text> <f-text :id="`position-price-${index}`" v-model="position.price" mode="area" :name="`position-price-${index}`" label="Preis" required></f-text>
<f-text :id="`position-price-${index}`" v-model="position.price" mode="area" <f-select :id="`position-member-${index}`" v-model="position.member_id" :options="meta.members" :name="`position-member-${index}`" label="Mitglied" required></f-select>
:name="`position-price-${index}`" label="Preis" required></f-text> <button type="button" class="btn btn-danger btn-sm h-[35px]" icon="trash" @click="single.positions.splice(index, 1)"><ui-sprite src="trash"></ui-sprite></button>
<f-select :id="`position-member-${index}`" v-model="position.member_id" :options="meta.members"
:name="`position-member-${index}`" label="Mitglied" required></f-select>
<button type="button" class="btn btn-danger btn-sm h-[35px]" icon="trash"
@click="single.positions.splice(index, 1)"><ui-sprite src="trash"></ui-sprite></button>
</div> </div>
</ui-box> </ui-box>
<section class="flex mt-4 space-x-2"> <section class="flex mt-4 space-x-2">
@ -101,14 +93,10 @@
<div v-text="invoice.via"></div> <div v-text="invoice.via"></div>
</td> </td>
<td> <td>
<a v-tooltip="`Anschauen`" :href="invoice.links.pdf" target="_BLANK" <a v-tooltip="`Anschauen`" :href="invoice.links.pdf" target="_BLANK" class="inline-flex btn btn-info btn-sm"><ui-sprite src="eye"></ui-sprite></a>
class="inline-flex btn btn-info btn-sm"><ui-sprite src="eye"></ui-sprite></a> <a v-tooltip="`Erinnerung anschauen`" :href="invoice.links.rememberpdf" target="_BLANK" class="ml-2 inline-flex btn btn-info btn-sm"><ui-sprite src="document"></ui-sprite></a>
<a v-tooltip="`Erinnerung anschauen`" :href="invoice.links.rememberpdf" target="_BLANK" <a v-tooltip="`Bearbeiten`" href="#" class="ml-2 inline-flex btn btn-warning btn-sm" @click.prevent="edit(invoice)"><ui-sprite src="pencil"></ui-sprite></a>
class="ml-2 inline-flex btn btn-info btn-sm"><ui-sprite src="document"></ui-sprite></a> <a v-tooltip="`Löschen`" href="#" class="ml-2 inline-flex btn btn-danger btn-sm" @click.prevent="deleting = invoice"><ui-sprite src="trash"></ui-sprite></a>
<a v-tooltip="`Bearbeiten`" href="#" class="ml-2 inline-flex btn btn-warning btn-sm"
@click.prevent="edit(invoice)"><ui-sprite src="pencil"></ui-sprite></a>
<a v-tooltip="`Löschen`" href="#" class="ml-2 inline-flex btn btn-danger btn-sm"
@click.prevent="deleting = invoice"><ui-sprite src="trash"></ui-sprite></a>
</td> </td>
</tr> </tr>
</table> </table>
@ -119,10 +107,10 @@
</template> </template>
<script setup> <script setup>
import { ref } from 'vue'; import {ref} from 'vue';
import { indexProps, useIndex } from '../../composables/useInertiaApiIndex.js'; import {indexProps, useIndex} from '../../composables/useInertiaApiIndex.js';
const props = defineProps(indexProps); const props = defineProps(indexProps);
var { axios, meta, data, reloadPage, create, single, edit, cancel, submit, remove } = useIndex(props.data, 'invoice'); var {axios, meta, data, reloadPage, create, single, edit, cancel, submit, remove} = useIndex(props.data, 'invoice');
const massstore = ref(null); const massstore = ref(null);
const deleting = ref(null); const deleting = ref(null);

View File

@ -45,7 +45,7 @@
</ui-box> </ui-box>
<ui-box heading="Zahlungen" class="area-payments"> <ui-box heading="Zahlungen" class="area-payments">
<payments :value="inner.payments"></payments> <payments :value="inner.invoicePositions"></payments>
</ui-box> </ui-box>
<ui-box heading="Karte" container-class="grow" class="area-map hidden xl:flex"> <ui-box heading="Karte" container-class="grow" class="area-map hidden xl:flex">
@ -59,7 +59,6 @@
import {defineAsyncComponent} from 'vue'; import {defineAsyncComponent} from 'vue';
export default { export default {
props: { props: {
data: {}, data: {},
meta: {}, meta: {},

View File

@ -2,21 +2,21 @@
<div> <div>
<table cellspacing="0" cellpadding="0" border="0" class="hidden md:table custom-table custom-table-sm text-sm"> <table cellspacing="0" cellpadding="0" border="0" class="hidden md:table custom-table custom-table-sm text-sm">
<thead> <thead>
<th>Nr</th> <th>Beschreibung</th>
<th>Beitrag</th> <th>Beitrag</th>
<th>Status</th> <th>Status</th>
</thead> </thead>
<tr v-for="(payment, index) in inner" :key="index"> <tr v-for="(position, index) in inner" :key="index">
<td v-text="payment.nr"></td> <td v-text="position.description"></td>
<td v-text="`${payment.subscription.name} (${payment.subscription.amount_human})`"></td> <td v-text="position.price_human"></td>
<td v-text="payment.status_name"></td> <td v-text="position.invoice.status"></td>
</tr> </tr>
</table> </table>
<div class="md:hidden grid gap-3"> <div class="md:hidden grid gap-3">
<ui-box class="relative" :heading="payment.nr" v-for="(payment, index) in inner" :key="index" second> <ui-box v-for="(position, index) in inner" :key="index" class="relative" :heading="position.description" second>
<div class="text-xs text-gray-200" v-text="`${payment.subscription.name} (${payment.subscription.amount_human})`"></div> <div class="text-xs text-gray-200" v-text="position.price_human"></div>
<div class="text-xs text-gray-200" v-text="payment.status_name"></div> <div class="text-xs text-gray-200" v-text="position.invoice.status"></div>
</ui-box> </ui-box>
</div> </div>
</div> </div>
@ -24,16 +24,15 @@
<script> <script>
export default { export default {
props: {
value: {},
},
data: function () { data: function () {
return { return {
inner: [], inner: [],
}; };
}, },
props: {
value: {},
},
created() { created() {
this.inner = this.value; this.inner = this.value;
}, },

View File

@ -1,5 +1,5 @@
@component('mail::message') @component('mail::message')
# {{ $salutation }}, # {{ $invoice->greeting }},
Im Anhang findet ihr die aktuelle Rechnung des Stammes Silva für das laufende Jahr. Bitte begleicht diese bis zum angegebenen Datum. Im Anhang findet ihr die aktuelle Rechnung des Stammes Silva für das laufende Jahr. Bitte begleicht diese bis zum angegebenen Datum.

View File

@ -1,5 +1,5 @@
@component('mail::message') @component('mail::message')
# {{ $salutation }}, # {{ $invoice->greeting }},
Hiermit möchten wir euch an die noch ausstehenden Mitgliedsbeiträge des Stammes Silva für das laufende Jahr erinnern. Bitte begleicht diese bis zum angegebenen Datum. Hiermit möchten wir euch an die noch ausstehenden Mitgliedsbeiträge des Stammes Silva für das laufende Jahr erinnern. Bitte begleicht diese bis zum angegebenen Datum.