[management] Improved eventtypes management
This commit is contained in:
		
							parent
							
								
									e0176c57e1
								
							
						
					
					
						commit
						3db6e0d2d1
					
				| 
						 | 
				
			
			@ -1,16 +1,16 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <div>
 | 
			
		||||
    <q-dialog v-model="edittype">
 | 
			
		||||
    <q-dialog v-model="dialogOpen">
 | 
			
		||||
      <q-card>
 | 
			
		||||
        <q-card-section>
 | 
			
		||||
          <div class="text-h6">Editere Diensttyp {{ actualEvent.name }}</div>
 | 
			
		||||
        </q-card-section>
 | 
			
		||||
        <q-card-section>
 | 
			
		||||
          <q-input v-model="newEventName" dense label="name" filled />
 | 
			
		||||
          <q-input v-model="newEventName" :rules="rules" ref="dialogInput" dense label="name" filled />
 | 
			
		||||
        </q-card-section>
 | 
			
		||||
        <q-card-actions>
 | 
			
		||||
          <q-btn flat color="danger" label="Abbrechen" @click="discardChanges()" />
 | 
			
		||||
          <q-btn flat color="primary" label="Speichern" @click="saveChanges()" />
 | 
			
		||||
          <q-btn flat color="primary" label="Speichern" :disable="!!dialogInput && !dialogInput.validate()" @click="saveChanges()" />
 | 
			
		||||
        </q-card-actions>
 | 
			
		||||
      </q-card>
 | 
			
		||||
    </q-dialog>
 | 
			
		||||
| 
						 | 
				
			
			@ -19,10 +19,17 @@
 | 
			
		|||
      <q-card-section>
 | 
			
		||||
        <q-table title="Veranstaltungstypen" :rows="rows" row-key="jobid" :columns="columns">
 | 
			
		||||
          <template #top-right>
 | 
			
		||||
            <q-input v-model="newEventType" dense placeholder="Neuer Typ" />
 | 
			
		||||
 | 
			
		||||
            <div></div>
 | 
			
		||||
            <q-btn color="primary" icon="mdi-plus" label="Hinzufügen" @click="addType" />
 | 
			
		||||
            <q-input
 | 
			
		||||
              v-model="newEventType"
 | 
			
		||||
              ref="input"
 | 
			
		||||
              :rules="rules"
 | 
			
		||||
              dense
 | 
			
		||||
              placeholder="Neuer Typ"
 | 
			
		||||
            >
 | 
			
		||||
              <slot name="after"
 | 
			
		||||
                ><q-btn color="primary" icon="mdi-plus" title="Hinzufügen" @click="addType"
 | 
			
		||||
              /></slot>
 | 
			
		||||
            </q-input>
 | 
			
		||||
          </template>
 | 
			
		||||
          <template #body-cell-actions="props">
 | 
			
		||||
            <!-- <q-btn :label="item"> -->
 | 
			
		||||
| 
						 | 
				
			
			@ -43,8 +50,10 @@
 | 
			
		|||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import { isAxiosError } from '@flaschengeist/api';
 | 
			
		||||
import { defineComponent, ref, computed, onBeforeMount } from 'vue';
 | 
			
		||||
import { useScheduleStore } from '../../store';
 | 
			
		||||
import { Notify, QInput } from 'quasar';
 | 
			
		||||
 | 
			
		||||
export default defineComponent({
 | 
			
		||||
  name: 'EventTypes',
 | 
			
		||||
| 
						 | 
				
			
			@ -52,15 +61,24 @@ export default defineComponent({
 | 
			
		|||
  setup() {
 | 
			
		||||
    const store = useScheduleStore();
 | 
			
		||||
    const newEventType = ref('');
 | 
			
		||||
    const edittype = ref(false);
 | 
			
		||||
    const dialogOpen = ref(false);
 | 
			
		||||
    const emptyEvent: FG.EventType = { id: -1, name: '' };
 | 
			
		||||
    const actualEvent = ref(emptyEvent);
 | 
			
		||||
    const newEventName = ref('');
 | 
			
		||||
    const input = ref<QInput>(null);
 | 
			
		||||
    const dialogInput = ref<QInput>(null);
 | 
			
		||||
 | 
			
		||||
    onBeforeMount(async () => await store.getEventTypes());
 | 
			
		||||
 | 
			
		||||
    const rows = computed(() => store.eventTypes);
 | 
			
		||||
 | 
			
		||||
    const rules = [
 | 
			
		||||
      (s: any) => !!s || 'Darf nicht leer sein!',
 | 
			
		||||
      (s: string) =>
 | 
			
		||||
        store.eventTypes.find((e) => e.name === s) === undefined ||
 | 
			
		||||
        'Der Name wird bereits verwendet',
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    const columns = [
 | 
			
		||||
      {
 | 
			
		||||
        name: 'name',
 | 
			
		||||
| 
						 | 
				
			
			@ -77,29 +95,41 @@ export default defineComponent({
 | 
			
		|||
      },
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    async function addType() {
 | 
			
		||||
      await store.addEventType(newEventType.value);
 | 
			
		||||
      // if null then conflict with name
 | 
			
		||||
      newEventType.value = '';
 | 
			
		||||
    function addType() {
 | 
			
		||||
      if (input.value === null || input.value.validate())
 | 
			
		||||
        store
 | 
			
		||||
          .addEventType(newEventType.value)
 | 
			
		||||
          .then(() => {
 | 
			
		||||
            newEventType.value = '';
 | 
			
		||||
          })
 | 
			
		||||
          .catch((e) => {
 | 
			
		||||
            if (isAxiosError(e, 409))
 | 
			
		||||
              Notify.create({
 | 
			
		||||
                type: 'negative',
 | 
			
		||||
                message: 'Der Name wird bereits verwendet',
 | 
			
		||||
              });
 | 
			
		||||
            else
 | 
			
		||||
              Notify.create({
 | 
			
		||||
                type: 'negative',
 | 
			
		||||
                message: 'Unbekannter Fehler beim speichern.',
 | 
			
		||||
              });
 | 
			
		||||
          });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function editType(event: FG.EventType) {
 | 
			
		||||
      edittype.value = true;
 | 
			
		||||
      dialogOpen.value = true;
 | 
			
		||||
      actualEvent.value = event;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async function saveChanges() {
 | 
			
		||||
      try {
 | 
			
		||||
        await store.renameEventType(actualEvent.value.id, newEventName.value);
 | 
			
		||||
      } finally {
 | 
			
		||||
        discardChanges();
 | 
			
		||||
      }
 | 
			
		||||
    function saveChanges() {
 | 
			
		||||
      if (dialogInput.value === null || dialogInput.value.validate())
 | 
			
		||||
        store.renameEventType(actualEvent.value.id, newEventName.value).then(() => discardChanges());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function discardChanges() {
 | 
			
		||||
      actualEvent.value = emptyEvent;
 | 
			
		||||
      newEventName.value = '';
 | 
			
		||||
      edittype.value = false;
 | 
			
		||||
      dialogOpen.value = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async function deleteType(id: number) {
 | 
			
		||||
| 
						 | 
				
			
			@ -107,16 +137,19 @@ export default defineComponent({
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    return {
 | 
			
		||||
      columns,
 | 
			
		||||
      rows,
 | 
			
		||||
      addType,
 | 
			
		||||
      newEventType,
 | 
			
		||||
      deleteType,
 | 
			
		||||
      edittype,
 | 
			
		||||
      editType,
 | 
			
		||||
      actualEvent,
 | 
			
		||||
      newEventName,
 | 
			
		||||
      addType,
 | 
			
		||||
      columns,
 | 
			
		||||
      deleteType,
 | 
			
		||||
      dialogInput,
 | 
			
		||||
      dialogOpen,
 | 
			
		||||
      discardChanges,
 | 
			
		||||
      editType,
 | 
			
		||||
      input,
 | 
			
		||||
      rows,
 | 
			
		||||
      rules,
 | 
			
		||||
      newEventType,
 | 
			
		||||
      newEventName,
 | 
			
		||||
      saveChanges,
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue