inventur/app/js/components/ArticleCard.vue
2021-07-18 01:04:13 +02:00

316 lines
8.0 KiB
Vue

<template>
<div
class="card"
>
<div class="card-content">
<span class="card-title">
{{ article.name }}
</span>
</div>
<div class="card-tabs">
<ul class="tabs tabs-fixed-width">
<li class="tab">
<a
:href="'#' + identifier + '_info'"
class="active"
>Info</a>
</li>
<li class="tab">
<a :href="'#' + identifier + '_variants'">Varianten</a>
</li>
</ul>
</div>
<div class="card-content">
<div
:id="identifier + '_info'"
class="row"
>
<div class="input-field inline col s8">
<input
:id="'a_name_' + article.id"
v-model="article.name"
placeholder="Artikelname"
class="validate"
>
<label
:for="'a_name_' + article.id"
class="active"
>Name</label>
</div>
<div class="input-field inline col s4">
<input
:id="'a_short_' + article.id"
v-model="article.short"
placeholder="Kurzname"
class="validate"
>
<label
:for="'a_short_' + article.id"
class="active"
>Kürzel</label>
</div>
<div class="input-field col s4">
<materialize-select
:id="'a_group_' + article.id"
v-model.number="article.group"
:value="article.group"
placeholder="Artikelgruppe"
>
<option
v-for="group in groups"
:key="group.id"
:value="group.id"
>
{{ group.name }}
</option>
</materialize-select>
<label :for="'a_group_' + article.id">Artikelgruppe</label>
</div>
<div class="input-field col s4">
<input
:id="'a_csize_' + article.id"
v-model.number="article.content.size"
placeholder="Gesamtinhalt"
type="number"
class="validate"
step="0.01"
>
<label
:for="'a_csize_' + article.id"
class="active"
>Gesamtinhalt</label>
</div>
<div class="input-field col s4">
<materialize-select
:id="'a_dim_' + article.id"
v-model.number="article.dimension"
:value="article.dimension"
placeholder="Dimension"
>
<option
v-for="dim in dimensions"
:key="dim.id"
:value="dim.id"
>
{{ dim.name }}
</option>
</materialize-select>
<label :for="'a_dim_' + article.id">Dimension</label>
</div>
<div class="input-field col s4">
<input
:id="'a_psize_' + article.id"
v-model.number="article.portion.size"
placeholder="Gesamtinhalt"
type="number"
class="validate"
step="0.01"
max="5"
>
<label
:for="'a_psize_' + article.id"
class="active"
>Portionsinhalt</label>
</div>
<div class="input-field col s4">
<MaterializeSelect
:id="'a_ptype_' + article.id"
v-model.number="article.portion.type"
:value="article.portion.type"
placeholder="Art"
>
<option
v-for="dim in dimensions"
:key="dim.id"
:value="dim.id"
>
{{ dim.name }}
</option>
</MaterializeSelect>
<label :for="'a_ptype_' + article.id">Portionsbezeichnung</label>
</div>
<div class="input-field col s4">
<input
:id="'a_pprice_' + article.id"
v-model.number="article.portion.price"
placeholder="Preis"
type="number"
step="0.01"
class="validate"
>
<label
:for="'a_pprice_' + article.id"
class="active"
>Portionspreis in </label>
</div>
<div class="col s12 right">
<span
class="right"
>Gesamtpreis
<TweenedNumber
:wert="article.ContentPrice"
:einheit="'€'"
:precision="2"
/></span>
</div>
</div>
<div
:id="identifier + '_variants'"
class="row"
>
<div class="col s12">
<ArticleVariant
v-for="(variant, index) in variants"
:key="'article_' + article.id + '_variant_' + index"
:identifier="'article_' + article.id + '_variant_' + index"
:variant="variant"
:article="article"
/>
<a
href="#"
@click="addVariant(article)"
>Variante hinzufügen</a>
</div>
</div>
</div>
<div class="card-action">
<a
href="#"
@click="deleteArticle(article)"
>Artikel löschen</a>
<a
v-if="changed"
href="#"
@click="storeArticle(article)"
>Artikel speichern</a>
</div>
</div>
</template>
<script>
import { Article, thawArticle } from '../model/article';
import MaterializeSelect from "./MaterializeSelect";
import TweenedNumber from "./TweenedNumber";
import ArticleVariant from "./ArticleVariant";
import { thawVariant, Variant } from '../model/variant';
export default {
name: "Article",
components: {MaterializeSelect, TweenedNumber, ArticleVariant},
props: {
a: {
type: Object,
default() { return new Article(); }
},
dimensions: {
type: Array,
default() { return []; }
},
groups: {
type: Array,
default() { return []; }
},
identifier: {
type: String,
}
},
data() {
return {
changed: false,
article: null,
original: null,
variants: [],
tabs: null
}
},
computed: {
},
watch: {
article: {
handler(newValue, oldVal) {
this.changed = JSON.stringify(newValue) != this.original;
},
deep: true
}
},
created() {
this.article = this.a;
this.original = JSON.stringify(this.a);
this.loadVariants(this.article);
},
mounted() {
var tabs = this.$el.getElementsByClassName("tabs")[0];
M.Tabs.init(tabs, {});
this.tabs = M.Tabs.getInstance(tabs);
this.$M.updateTextFields();
},
methods: {
storeArticle: function(article) {
this.$http
.post(
"/api/artikel" + (article.id > 0 ? '/' + article.id : ''),
JSON.stringify(article),
{
headers: {
'Content-Type': 'application/json'
}
}
)
.then(response => {
this.$M.toast({ html: response.data + " Artikel aktualisiert." });
this.article = thawArticle(response.data);
})
.catch(error => {
this.$M.toast({ html: response });
});
},
deleteArticle: function(article) {
this.$http
.delete(
"/api/artikel/" + article.id,
)
.then(response => {
this.$emit('delete-article', article);
this.$M.toast({ html: response.data + " Artikel gelöscht." });
})
.catch(error => {
this.$M.toast({ html: response });
});
},
addVariant(article) {
var variant = new Variant();
variant.ArticleId = article.id;
this.variants.push(variant);
},
loadVariants: function(article) {
this.$http
.get(
"/api/artikel/" + article.id + '/varianten',
)
.then(response => {
return response.data;
})
.then(json => {
if (json != null) {
json.forEach(element => {
this.variants.push(thawVariant(element));
});
}
})
.then(() => {
this.$M.updateTextFields();
})
.catch(error => {
this.$M.toast({ html: error });
});
},
}
};
</script>