[events]: Added removal of events + minor optical improvement
This commit is contained in:
		
							parent
							
								
									851ce3aa8b
								
							
						
					
					
						commit
						f2610b8e84
					
				| 
						 | 
				
			
			@ -1 +1 @@
 | 
			
		|||
Subproject commit d0e503b1bfc65f64216042d0fe39daf5377b7901
 | 
			
		||||
Subproject commit ac6d0693a062f60d539d7f6d8fdee00fbcc528c7
 | 
			
		||||
| 
						 | 
				
			
			@ -53,11 +53,15 @@
 | 
			
		|||
          locale="de-de"
 | 
			
		||||
          style="height: 100%; min-height: 400px"
 | 
			
		||||
        >
 | 
			
		||||
          <template #day="{ scope: { timestamp } }" style="min-height: 200px">
 | 
			
		||||
            <template v-if="!events[timestamp.weekday]" style="min-height: 200px"> </template>
 | 
			
		||||
            <template v-for="(agenda, index) in events[timestamp.weekday]" :key="agenda.id">
 | 
			
		||||
              <eventslot v-model="events[timestamp.weekday][index]" />
 | 
			
		||||
            </template>
 | 
			
		||||
          <template #day="{ scope: { timestamp } }">
 | 
			
		||||
            <div itemref="" class="q-pb-sm" style="min-height: 200px">
 | 
			
		||||
              <eventslot
 | 
			
		||||
                v-for="(agenda, index) in events[timestamp.weekday]"
 | 
			
		||||
                :key="index"
 | 
			
		||||
                v-model="events[timestamp.weekday][index]"
 | 
			
		||||
                @removeEvent="remove"
 | 
			
		||||
              />
 | 
			
		||||
            </div>
 | 
			
		||||
          </template>
 | 
			
		||||
        </q-calendar-agenda>
 | 
			
		||||
      </div>
 | 
			
		||||
| 
						 | 
				
			
			@ -86,7 +90,8 @@ export default defineComponent({
 | 
			
		|||
 | 
			
		||||
    const calendarRealView = computed(() => (calendarDays.value != 7 ? 'day' : 'week'));
 | 
			
		||||
    const calendarDays = computed(() =>
 | 
			
		||||
      calendarView.value == 'day' ? 1 : windowWidth.value < 1000 ? 3 : 7
 | 
			
		||||
      // <= 1023 is the breakpoint for sm to md
 | 
			
		||||
      calendarView.value == 'day' ? 1 : windowWidth.value <= 1023 ? 3 : 7
 | 
			
		||||
    );
 | 
			
		||||
    const events = ref<Agendas>({});
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -102,6 +107,22 @@ export default defineComponent({
 | 
			
		|||
      await loadAgendas();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    async function remove(id: number) {
 | 
			
		||||
      if (await store.removeEvent(id)) {
 | 
			
		||||
        // Successfull removed
 | 
			
		||||
        for (const idx in events.value) {
 | 
			
		||||
          const i = events.value[idx].findIndex((event) => event.id === id);
 | 
			
		||||
          if (i !== -1) {
 | 
			
		||||
            events.value[idx].splice(i, 1);
 | 
			
		||||
            break;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        // Not found, this means our eventa are outdated
 | 
			
		||||
        await loadAgendas();
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async function loadAgendas() {
 | 
			
		||||
      const selected = new Date(selectedDate.value);
 | 
			
		||||
      console.log(selected);
 | 
			
		||||
| 
						 | 
				
			
			@ -180,6 +201,7 @@ export default defineComponent({
 | 
			
		|||
      updateProxy,
 | 
			
		||||
      saveNewSelectedDate,
 | 
			
		||||
      proxyDate,
 | 
			
		||||
      remove,
 | 
			
		||||
      calendarDays,
 | 
			
		||||
      calendarView,
 | 
			
		||||
      calendarRealView,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,26 +1,52 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <q-card
 | 
			
		||||
    class="justify-start content-center items-center rounded-borders border-primary shadow-5 q-mb-xs"
 | 
			
		||||
    class="q-mx-xs q-mt-sm justify-start content-center items-center rounded-borders shadow-5"
 | 
			
		||||
    bordered
 | 
			
		||||
  >
 | 
			
		||||
    <header class="text-primary q-px-xs">
 | 
			
		||||
      <div class="col text-weight-bolder">
 | 
			
		||||
    <q-card-section class="text-primary q-pa-xs">
 | 
			
		||||
      <div class="text-weight-bolder text-center" style="font-size: 1.5vw">
 | 
			
		||||
        {{ event.type.name }}
 | 
			
		||||
        <template v-if="event.name"
 | 
			
		||||
          >: <span style="font-size: 1.2vw">{{ event.name }}</span>
 | 
			
		||||
        </template>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div v-if="event.description" class="col text-weight-medium" style="font-size: 10px">
 | 
			
		||||
        Info
 | 
			
		||||
      <div v-if="event.description" class="text-weight-medium" style="font-size: 1vw">
 | 
			
		||||
        {{ event.description }}
 | 
			
		||||
      </div>
 | 
			
		||||
    </header>
 | 
			
		||||
    <div v-for="(job, index) in event.jobs" :key="index">
 | 
			
		||||
      <q-separator style="justify-start content-center" />
 | 
			
		||||
      <JobSlot v-model="event.jobs[index]" :event-id="event.id" />
 | 
			
		||||
    </div>
 | 
			
		||||
    </q-card-section>
 | 
			
		||||
    <q-separator />
 | 
			
		||||
    <q-card-section class="q-pa-xs">
 | 
			
		||||
      <!-- Jobs -->
 | 
			
		||||
      <JobSlot
 | 
			
		||||
        v-for="(job, index) in event.jobs"
 | 
			
		||||
        :key="index"
 | 
			
		||||
        v-model="event.jobs[index]"
 | 
			
		||||
        class="col q-my-xs"
 | 
			
		||||
        :event-id="event.id"
 | 
			
		||||
      />
 | 
			
		||||
    </q-card-section>
 | 
			
		||||
    <q-card-actions v-if="canEdit || canDelete" vertical align="center">
 | 
			
		||||
      <router-link v-if="canEdit" :to="{ name: 'events-edit', params: { id: event.id } }">
 | 
			
		||||
        <template #default>
 | 
			
		||||
          <q-btn color="secondary" flat label="Bearbeiten" style="min-width: 95%" />
 | 
			
		||||
        </template>
 | 
			
		||||
      </router-link>
 | 
			
		||||
      <q-btn
 | 
			
		||||
        v-if="canDelete"
 | 
			
		||||
        color="negative"
 | 
			
		||||
        flat
 | 
			
		||||
        label="Löschen"
 | 
			
		||||
        style="min-width: 95%"
 | 
			
		||||
        @click="remove"
 | 
			
		||||
      />
 | 
			
		||||
    </q-card-actions>
 | 
			
		||||
  </q-card>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import { defineComponent, computed, PropType } from 'vue';
 | 
			
		||||
import { hasPermission } from 'src/utils/permission';
 | 
			
		||||
import { PERMISSIONS } from 'src/plugins/schedule/permissions';
 | 
			
		||||
import JobSlot from './JobSlot.vue';
 | 
			
		||||
 | 
			
		||||
export default defineComponent({
 | 
			
		||||
| 
						 | 
				
			
			@ -32,13 +58,26 @@ export default defineComponent({
 | 
			
		|||
      type: Object as PropType<FG.Event>,
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  emits: { 'update:modelValue': (val: FG.Event) => !!val },
 | 
			
		||||
  emits: {
 | 
			
		||||
    'update:modelValue': (val: FG.Event) => !!val,
 | 
			
		||||
    removeEvent: (val: number) => typeof val === 'number',
 | 
			
		||||
  },
 | 
			
		||||
  setup(props, { emit }) {
 | 
			
		||||
    const canDelete = computed(() => hasPermission(PERMISSIONS.DELETE));
 | 
			
		||||
    const canEdit = computed(() => hasPermission(PERMISSIONS.EDIT));
 | 
			
		||||
    const event = computed({
 | 
			
		||||
      get: () => props.modelValue,
 | 
			
		||||
      set: (v) => emit('update:modelValue', v),
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    function remove() {
 | 
			
		||||
      emit('removeEvent', props.modelValue.id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return {
 | 
			
		||||
      canDelete,
 | 
			
		||||
      canEdit,
 | 
			
		||||
      remove,
 | 
			
		||||
      event,
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <q-card-section>
 | 
			
		||||
  <q-card bordered>
 | 
			
		||||
    <div class="text-weight-medium q-px-xs">
 | 
			
		||||
      {{ asHour(modelValue.start) }}
 | 
			
		||||
      <template v-if="modelValue.end">- {{ asHour(modelValue.end) }}</template>
 | 
			
		||||
| 
						 | 
				
			
			@ -31,7 +31,7 @@
 | 
			
		|||
        <q-btn v-if="isEnrolled" flat color="negative" label="Austragen" @click="signOutFromJob" />
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  </q-card-section>
 | 
			
		||||
  </q-card>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -85,6 +85,16 @@ export const useScheduleStore = defineStore({
 | 
			
		|||
        throw error;
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    async removeEvent(id: number) {
 | 
			
		||||
      try {
 | 
			
		||||
        await api.delete(`/schedule/events/${id}`);
 | 
			
		||||
      } catch (e) {
 | 
			
		||||
        const error = <AxiosError>e;
 | 
			
		||||
        if (error.response && error.response.status === 404) return false;
 | 
			
		||||
        throw e;
 | 
			
		||||
      }
 | 
			
		||||
      return true;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    async removeEventType(id: number) {
 | 
			
		||||
      await api.delete(`/schedule/event-types/${id}`);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue