measuring-stations/src/App.vue
2024-08-15 11:42:08 +02:00

124 lines
4.3 KiB
Vue

<template>
<h1 class="text-center text-2xl py-2 font-bold">Ständeansicht</h1>
<div class="absolute top-2 right-2 flex flex-row gap-2">
<span title="Anleitung">
<BookOpenIcon class="h-8 w-8 text-black cursor-pointer" @click="handbook = !handbook" />
</span>
<span title="Ansicht exportieren">
<DocumentArrowDownIcon class="h-8 w-8 text-black cursor-pointer" @click="exportData" />
</span>
<span title="Ansicht importieren">
<DocumentArrowUpIcon
class="h-8 w-8 text-black cursor-pointer"
@click="($refs.fileImport as HTMLInputElement).click()"
/><input class="!hidden" type="file" ref="fileImport" @change="importData" />
</span>
<span title="Einstellungen">
<Cog6ToothIcon class="h-8 w-8 text-black cursor-pointer" @click="settings = true" />
</span>
<span title="neu erstellen">
<PlusIcon class="h-8 w-8 text-black cursor-pointer" @click="popup = true" />
</span>
</div>
<hr />
<div class="w-full h-full overflow-y-scroll">
<handbookPage v-if="handbook" @close="handbook = false" />
<div
v-else
class="w-full grid auto-rows-auto gap-4 p-4"
:class="colcount == 0 ? 'grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4' : ''"
:style="colcount == 0 ? '' : `grid-template-columns: repeat(${colcount}, minmax(0, 1fr));`"
>
<statistic v-for="item in items" :key="item.id" :id="item.id" />
</div>
</div>
<div
v-if="popup"
@click="popup = false"
class="absolute h-full w-full bg-black/40 z-20 flex justify-center items-center"
>
<form
ref="form"
@submit.prevent="submitForm"
@click.stop
class="relative w-96 h-auto bg-white flex flex-col gap-2 rounded-md p-4"
>
<XMarkIcon class="h-5 w-5 text-black cursor-pointer absolute top-2 right-2" @click="popup = false" />
<h1 class="text-center text-lg">neuen Eintrag</h1>
<div class="flex flex-col">
<label for="title">Titel</label>
<input id="title" type="text" class="w-full" required />
</div>
<div class="flex flex-col">
<label for="img">Bildlink</label>
<input id="img" type="text" class="w-full" required />
</div>
<button primary>erstellen</button>
</form>
</div>
<div
v-if="settings"
@click="settings = false"
class="absolute h-full w-full bg-black/40 z-20 flex justify-center items-center"
>
<form
ref="formsettings"
@submit.prevent="submitFormSettings"
@click.stop
class="relative w-96 h-auto bg-white flex flex-col gap-2 rounded-md p-4"
>
<XMarkIcon class="h-5 w-5 text-black cursor-pointer absolute top-2 right-2" @click="settings = false" />
<h1 class="text-center text-lg">Einstellungen</h1>
<div class="flex flex-col">
<label for="colcount">Spaltenzahl (0 = automatisch)</label>
<input id="colcount" type="number" class="w-full" min="0" required :value="colcount" />
</div>
<button primary>speichern</button>
</form>
</div>
</template>
<script setup lang="ts">
import { defineComponent } from "vue";
import { mapState, mapActions } from "pinia";
import statistic from "./components/statistic.vue";
import handbookPage from "./components/handbook.vue";
import { useDataStorage } from "./stores/dataStorage";
import { PlusIcon, Cog6ToothIcon, XMarkIcon } from "@heroicons/vue/24/solid";
import { DocumentArrowDownIcon, DocumentArrowUpIcon, BookOpenIcon } from "@heroicons/vue/24/outline";
</script>
<script lang="ts">
export default defineComponent({
data() {
return {
popup: false,
settings: false,
handbook: false,
};
},
computed: {
...mapState(useDataStorage, ["items", "colcount"]),
},
mounted() {
this.load();
},
methods: {
...mapActions(useDataStorage, ["create", "load", "saveSettings", "exportData", "importData"]),
submitForm(form: any) {
let data = form.target.elements;
this.create(data.title.value, data.img.value);
(this.$refs.form as HTMLFormElement).reset();
this.popup = false;
},
submitFormSettings(form: any) {
let data = form.target.elements;
this.saveSettings({ colcount: parseInt(data.colcount.value) });
(this.$refs.formsettings as HTMLFormElement).reset();
this.settings = false;
},
},
});
</script>