flaschengeist-frontend/src/plugins/schedule/components/management/CreateEvent.vue

193 lines
5.9 KiB
Vue
Raw Normal View History

2021-01-23 13:40:35 +00:00
<template>
<q-page padding>
<q-card>
<q-form @submit="save" @reset="reset">
<q-card-section class="fit row justify-start content-center items-center">
2021-01-27 21:37:12 +00:00
<q-card-section class="fit ">
<div class="text-h6">Veranstaltung erstellen</div>
</q-card-section>
2021-01-26 19:38:46 +00:00
<q-select
filled
use-input
label="Veranstaltungstyp"
input-debounce="0"
class="col-xs-12 col-sm-6 q-pa-sm"
v-model="event.type"
:options="eventtypes"
option-label="name"
option-value="name"
map-options
clearable
:rules="[notEmpty]"
2021-01-23 13:40:35 +00:00
/>
2021-01-27 21:37:12 +00:00
<IsoDateInput
class="col-xs-12 col-sm-6 q-pa-sm"
v-model="event.start"
label="Veranstaltungsbeginn"
:rules="[noValidDate, notEmpty]"
/>
<q-card-section class="fit justify-start content-center items-center">
<q-input
class="col-xs-12 col-sm-6 q-pa-sm"
label="Beschreibung"
type="textarea"
v-model="event.description"
filled
/>
</q-card-section>
2021-01-23 13:40:35 +00:00
</q-card-section>
2021-01-26 19:38:46 +00:00
<q-card-section>
<q-btn color="primary" label="Schicht hinzufügen" @click="addJob()" />
</q-card-section>
<q-card-section v-for="job in event.jobs" v-bind:key="job.id">
<q-card class="q-my-auto">
<q-card-section class="fit row justify-start content-center items-center">
<IsoDateInput
class="col-xs-12 col-sm-6 q-pa-sm"
v-model="job.start"
label="Beginn"
2021-01-27 21:37:12 +00:00
type="datetime"
2021-01-26 19:38:46 +00:00
:rules="[noValidDate, notEmpty]"
/>
<IsoDateInput
class="col-xs-12 col-sm-6 q-pa-sm"
v-model="job.end"
label="Ende"
2021-01-27 21:37:12 +00:00
type="datetime"
:rules="[noValidDate, isAfterDate, notEmpty]"
2021-01-26 19:38:46 +00:00
/>
<q-input
class="col-xs-12 col-sm-6 q-pa-sm"
label="Beschreibung"
type="textarea"
2021-01-27 21:37:12 +00:00
v-model="job.comment"
2021-01-26 19:38:46 +00:00
filled
:rules="[notEmpty]"
/>
<q-select
filled
use-input
label="Dienstart"
input-debounce="0"
class="col-xs-12 col-sm-6 q-pa-sm"
v-model="job.type"
:options="jobtypes"
option-label="name"
option-value="name"
map-options
clearable
:rules="[notEmpty]"
/>
<q-input label="Dienstanzahl" type="number" v-model="job.required_services" filled />
2021-01-27 21:37:12 +00:00
<q-btn
label="Schicht löschen"
color="negative"
@click="removeJob(job.id)"
:disabled="jobDeleteDisabled"
/>
2021-01-26 19:38:46 +00:00
</q-card-section>
</q-card>
</q-card-section>
2021-01-23 13:40:35 +00:00
<q-card-actions align="right">
<q-btn label="Reset" type="reset" />
<q-btn color="primary" type="submit" label="Speichern" />
</q-card-actions>
</q-form>
</q-card>
</q-page>
</template>
<script lang="ts">
2021-01-26 19:38:46 +00:00
import { defineComponent, ref, onBeforeMount, computed } from '@vue/composition-api';
import IsoDateInput from 'src/components/utils/IsoDateInput.vue';
2021-01-23 13:40:35 +00:00
import { Store } from 'vuex';
import { StateInterface } from 'src/store';
2021-01-26 19:38:46 +00:00
import { ScheduleInterface } from '../../store/schedule';
import { date } from 'quasar';
// import { emit } from 'process';
2021-01-23 13:40:35 +00:00
export default defineComponent({
name: 'CreateEvent',
2021-01-26 19:38:46 +00:00
components: { IsoDateInput },
2021-01-23 13:40:35 +00:00
setup(_, { root }) {
const store = <Store<StateInterface>>root.$store;
2021-01-26 19:38:46 +00:00
const state = <ScheduleInterface>store.state.schedule;
const eventtypes = computed(() => state.eventTypes);
const jobtypes = computed(() => state.jobTypes);
2021-01-27 21:37:12 +00:00
const jobDeleteDisabled = computed(() => event.value.jobs.length < 2);
const newJob = ref<FG.Job>(({
id: NaN,
start: undefined,
end: undefined,
2021-01-26 19:38:46 +00:00
comment: '',
services: [],
required_services: 2
2021-01-27 21:37:12 +00:00
} as unknown) as FG.Job);
2021-01-26 19:38:46 +00:00
const event = ref<FG.Event>({
id: NaN,
start: new Date(),
description: '',
2021-01-27 21:37:12 +00:00
jobs: [Object.assign({}, newJob.value)]
} as FG.Event);
2021-01-26 19:38:46 +00:00
onBeforeMount(() => {
void store.dispatch('schedule/getEventTypes');
void store.dispatch('schedule/getJobTypes');
});
2021-01-27 21:37:12 +00:00
2021-01-26 19:38:46 +00:00
function addJob() {
2021-01-27 21:37:12 +00:00
const addJob = Object.assign({}, newJob.value);
event.value.jobs.unshift(addJob);
2021-01-26 19:38:46 +00:00
}
function removeJob(id: number) {
let jobtoremove = event.value.jobs.findIndex(job => job.id == id);
if (jobtoremove != undefined) {
event.value.jobs.splice(jobtoremove, 1);
}
}
function save() {
console.log('Event:', event);
store.dispatch('schedule/addEvent', event.value).catch(error => {
2021-01-23 13:40:35 +00:00
console.warn(error);
});
}
2021-01-26 19:38:46 +00:00
function reset() {
2021-01-27 21:37:12 +00:00
event.value.id = NaN;
event.value.start = new Date();
event.value.description = '';
delete event.value['type'];
event.value.jobs = [Object.assign({}, newJob.value)];
2021-01-26 19:38:46 +00:00
}
function notEmpty(val: string) {
return !!val || 'Feld darf nicht leer sein!';
}
function noValidDate(val: string) {
return !!date.isValid(val) || 'Datum/Zeit muss gesetzt sein!';
}
2021-01-27 21:37:12 +00:00
function isAfterDate(val: Date) {
// return event.value.jobsstart.getTime() > val.getTime() || 'Ende muss hinter dem Start liegen';
}
2021-01-26 19:38:46 +00:00
return {
2021-01-27 21:37:12 +00:00
jobDeleteDisabled,
2021-01-26 19:38:46 +00:00
addJob,
eventtypes,
removeJob,
jobtypes,
notEmpty,
noValidDate,
save,
reset,
2021-01-27 21:37:12 +00:00
event,
isAfterDate
2021-01-26 19:38:46 +00:00
};
2021-01-23 13:40:35 +00:00
}
});
</script>
<style scoped></style>