<template> <akaunting-modal :title="title" :show="display" @cancel="onCancel" v-if="display"> <template #modal-body> <div class="py-1 px-5 bg-body"> <div class="grid sm:grid-cols-6 gap-x-8 gap-y-6 my-3.5"> <div class="sm:col-span-3"> <base-input v-model="form.name" :label="text.name" :placeholder="placeholder.name" :error="form.errors.name[0]" @input="form.errors.name[0] = ''" inputGroupClasses="input-group-merge"> </base-input> </div> <div class="sm:col-span-3"> <base-input :error="form.errors.class[0]" :label="text.type"> <el-select @change="form.errors.class[0] = ''" v-model="form.class" filterable :placeholder="placeholder.type"> <el-option v-for="(name, value) in types" :key="name" :label="name" :value="value"> </el-option> </el-select> </base-input> </div> <div class="sm:col-span-3"> <base-input :label="text.width" not-required> <el-select v-model="form.width" filterable :placeholder="placeholder.width"> <el-option v-for="option in widthOptions" :key="option.label" :label="option.label" :value="option.value"> </el-option> </el-select> </base-input> </div> <div class="sm:col-span-3"> <base-input not-required v-model="form.sort" :label="text.sort" :placeholder="placeholder.sort" :error="form.errors.sort[0]" @input="form.errors.sort[0] = ''" inputGroupClasses="input-group-merge"></base-input> </div> </div> </div> </template> <template #card-footer> <div class="flex items-center justify-end"> <button type="button" class="flex items-center justify-center px-6 py-1.5 text-base rounded-lg mr-2 bg-transparent hover:bg-gray-300 disabled:bg-gray-200" @click="onCancel"> {{ text.cancel }} </button> <button :disabled="form.loading" type="button" class="relative flex items-center justify-center bg-green hover:bg-green-700 text-white px-6 py-1.5 text-base rounded-lg disabled:bg-green-100" @click="onSave"> <i v-if="form.loading" class="animate-submit delay-[0.28s] absolute w-2 h-2 rounded-full left-0 right-0 -top-3.5 m-auto before:absolute before:w-2 before:h-2 before:rounded-full before:animate-submit before:delay-[0.14s] after:absolute after:w-2 after:h-2 after:rounded-full after:animate-submit before:-left-3.5 after:-right-3.5 after:delay-[0.42s]"></i> <span :class="[{'opacity-0': form.loading}]">{{ text.save }}</span> </button> </div> </template> </akaunting-modal> </template> <script> import axios from 'axios'; import { Select, Option } from 'element-ui'; import AkauntingModal from "./AkauntingModal"; import NProgress from 'nprogress' import 'nprogress/nprogress.css' import Form from './../plugins/form'; import NProgressAxios from './../plugins/nprogress-axios'; export default { name: 'akaunting-widget', components: { AkauntingModal, [Select.name]: Select, [Option.name]: Option, }, props: { show: { type: Boolean, default: false, description: "Modal Status" }, action: { type: String, default: 'create', description: "Widget modal action create/edit" }, title: { type: String, default: '', description: "Modal header title" }, text: { type: Object, default: {}, description: "Widget form texts" }, placeholder: { type: Object, default: {}, description: "Widget form placeholder" }, name: { type: String, default: '', description: "Widget Name Field" }, width: { type: String, default: '', description: "Widget Width Field" }, type: { type: String, default: '', description: "Widget Class Field" }, types: { type: Object, default: {}, description: "Widget Get Classes" }, sort: { type: Number, default: 0, description: "Widget Sort Field" }, dashboard_id: { type: Number, default: 0, description: "Widget Dashboard Id" }, widget_id: { type: [Number, String], default: 0, description: "Edit Widget ID" }, }, data() { return { widthOptions: [ { label: '25%', value: 'w-full lg:w-1/4 px-6' }, { label: '33%', value: 'w-full lg:w-1/3 px-6' }, { label: '50%', value: 'w-full lg:w-2/4 px-12' }, { label: '100%', value: 'w-full px-12' } ], form: { loading: false, class: this.type, name: this.name, width: this.width, sort: this.sort, dashboard_id: this.dashboard_id, errors: { name: [], class: [], sort: [], } }, display: this.show }; }, methods: { closeModal() { this.$emit("update:show", false); this.$emit("close"); }, onSave() { this.form.loading = true; let data = Object.assign({}, this.form); delete data.loading; var self = this; var path = url + '/common/widgets'; if ((self.action != 'create')) { path = url + '/common/widgets/' + self.widget_id; data['_method'] = 'PATCH'; } axios.post(path, data) .then(function (response) { self.form.loading = false; if (response.data.redirect) { self.form.loading = true; window.location.href = response.data.redirect; } if (response.errors) { self.form.errors.name = (error.response.data.errors.name) ? error.response.data.errors.name : []; self.form.errors.class = (error.response.data.errors.class) ? error.response.data.errors.class : []; self.form.errors.sort = (error.response.data.errors.sort) ? error.response.data.errors.sort : []; self.form.loading = false; } self.form.response = response.data; }) .catch(function (error) { self.form.errors.name = (error.response.data.errors.name) ? error.response.data.errors.name : []; self.form.errors.class = (error.response.data.errors.class) ? error.response.data.errors.class : []; self.form.errors.sort = (error.response.data.errors.sort) ? error.response.data.errors.sort : []; self.form.loading = false; }); }, onCancel() { let documentClasses = document.body.classList; documentClasses.remove('overflow-y-hidden', 'overflow-overlay', '-ml-4'); this.display = false; this.form.name = ''; this.form.enabled = 1; this.$emit("cancel"); }, onEnabled(value) { this.form.enabled = value; } }, watch: { show(val) { let documentClasses = document.body.classList; if (val) { documentClasses.add('overflow-y-hidden', 'overflow-overlay', '-ml-4'); } else { documentClasses.remove('overflow-y-hidden', 'overflow-overlay', '-ml-4'); } } } } </script>