FleetCart/Modules/Product/Resources/assets/admin/js/edit.js
2023-12-03 14:07:47 +00:00

146 lines
4.3 KiB
JavaScript

import Vue from "vue";
import ProductMixin from "./mixins/ProductMixin";
import Errors from "@admin/js/Errors";
Vue.prototype.route = route;
new Vue({
el: "#app",
mixins: [ProductMixin],
data: {
formSubmissionType: null,
form: {
brand_id: "",
categories: [],
tags: [],
media: [],
name: "lorem ipsum",
description: "<p>lorem ipsum dolor</p>",
is_active: 1,
price: 999,
tax_class_id: "",
is_virtual: 0,
manage_stock: 0,
in_stock: 1,
special_price_type: "fixed",
meta: {},
variations: [],
variants: [],
attributes: [],
options: [],
downloads: [],
},
errors: new Errors(),
selectizeConfig: {
plugins: ["remove_button"],
},
searchableSelectizeConfig: {},
categoriesSelectizeConfig: {
plugins: ["remove_button"],
onItemAdd(value) {
this.getItem(value)[0].innerHTML = this.getItem(
value
)[0].innerHTML.replace(/¦––\s/g, "");
},
},
flatPickrConfig: {
mode: "single",
enableTime: true,
altInput: true,
},
},
created() {
this.setFormData();
this.setSearchableSelectizeConfig();
this.setDefaultVariantUid();
this.setVariantsLength();
},
methods: {
prepareFormData(formData) {
this.prepareAttributes(formData.attributes);
this.prepareVariations(formData.variations);
this.prepareVariants(formData.variants);
this.prepareOptions(formData.options);
return formData;
},
setFormData() {
this.form = { ...this.prepareFormData(FleetCart.data["product"]) };
},
setDefaultVariantUid() {
if (this.hasAnyVariant) {
this.defaultVariantUid = this.form.variants.find(
({ is_default }) => is_default === true
).uid;
}
},
setVariantsLength() {
this.variantsLength = this.form.variants.length;
},
submit({ submissionType }) {
this.formSubmissionType = submissionType;
$.ajax({
type: "PUT",
url: route("admin.products.update", {
id: this.form.id,
...(submissionType === "save_and_exit" && {
exit_flash: true,
}),
}),
data: this.transformData(this.form),
dataType: "json",
success: (response) => {
if (submissionType === "save_and_exit") {
location.href = route("admin.products.index");
return;
}
this.form = { ...response.product_resource };
this.errors.reset();
this.prepareFormData(this.form);
this.resetBulkEditVariantFields();
toaster(response.message, {
type: "success",
});
},
})
.catch((error) => {
this.formSubmissionType = null;
toaster(error.responseJSON.message, {
type: "default",
});
if (error.status === 422) {
this.errors.reset();
this.errors.record(error.responseJSON.errors);
this.scrollToFirstErrorField(this.$refs.form.elements);
return;
}
if (this.hasAnyVariant) {
this.regenerateVariationsAndVariantsUid();
}
})
.always(() => {
if (submissionType === "save") {
this.formSubmissionType = null;
}
});
},
},
});