<template> <base-input :label="title" :name="name" :class="formClasses" :error="formError"> <el-select v-model="real_model" @input="change" disabled filterable v-if="disabled" :placeholder="placeholder"> <div v-if="addNew.status && options.length != 0" class="el-select-dropdown__wrap" slot="empty"> <span></span> </div> <div v-else-if="addNew.status && options.length == 0" slot="empty"> <ul class="el-scrollbar__view el-select-dropdown__list"> <li class="el-select-dropdown__item hover" @click="onAddItem"> <span>{{ add_new_text }}</span> </li> </ul> </div> <template slot="prefix"> <span class="el-input__suffix-inner el-select-icon"> <i :class="'select-icon-position el-input__icon fa fa-' + icon"></i> </span> </template> <el-option v-if="!group" v-for="(label, value) in selectOptions" :key="value" :label="label" :value="value"> </el-option> <el-option-group v-if="group" v-for="(options, name) in selectOptions" :key="name" :label="name"> <el-option v-for="(label, value) in options" :key="value" :label="label" :value="value"> </el-option> </el-option-group> <li v-if="addNew.status" class="el-select-dropdown__item hover" @click="onAddItem"> <span>{{ add_new_text }}</span> </li> </el-select> <el-select v-model="real_model" @input="change" filterable v-if="!disabled && !multiple" :placeholder="placeholder"> <div v-if="addNew.status && options.length != 0" class="el-select-dropdown__wrap" slot="empty"> <span></span> </div> <div v-else-if="addNew.status && options.length == 0" slot="empty"> <ul class="el-scrollbar__view el-select-dropdown__list"> <li class="el-select-dropdown__item hover" @click="onAddItem"> <span>{{ add_new_text }}</span> </li> </ul> </div> <template slot="prefix"> <span class="el-input__suffix-inner el-select-icon"> <i :class="'select-icon-position el-input__icon fa fa-' + icon"></i> </span> </template> <el-option v-if="!group" v-for="(label, value) in selectOptions" :key="value" :label="label" :value="value"> </el-option> <el-option-group v-if="group" v-for="(options, name) in selectOptions" :key="name" :label="name"> <el-option v-for="(label, value) in options" :key="value" :label="label" :value="value"> </el-option> </el-option-group> <li v-if="addNew.status" class="el-select-dropdown__item hover" @click="onAddItem"> <span>{{ add_new_text }}</span> </li> </el-select> <el-select v-model="real_model" @input="change" filterable v-if="!disabled && multiple && !collapse" multiple :placeholder="placeholder"> <div v-if="addNew.status && options.length != 0" class="el-select-dropdown__wrap" slot="empty"> <span></span> </div> <div v-else-if="addNew.status && options.length == 0" slot="empty"> <ul class="el-scrollbar__view el-select-dropdown__list"> <li class="el-select-dropdown__item hover" @click="onAddItem"> <span>{{ add_new_text }}</span> </li> </ul> </div> <template slot="prefix"> <span class="el-input__suffix-inner el-select-icon"> <i :class="'select-icon-position el-input__icon fa fa-' + icon"></i> </span> </template> <el-option v-if="!group" v-for="(label, value) in selectOptions" :key="value" :label="label" :value="value"> </el-option> <el-option-group v-if="group" v-for="(options, name) in selectOptions" :key="name" :label="name"> <el-option v-for="(label, value) in options" :key="value" :label="label" :value="value"> </el-option> </el-option-group> <li v-if="addNew.status" class="el-select-dropdown__item hover" @click="onAddItem"> <span>{{ add_new_text }}</span> </li> </el-select> <el-select v-model="real_model" @input="change" filterable v-if="!disabled && multiple && collapse" multiple collapse-tags :placeholder="placeholder"> <div v-if="addNew.status && options.length != 0" class="el-select-dropdown__wrap" slot="empty"> <span></span> </div> <div v-else-if="addNew.status && options.length == 0" slot="empty"> <ul class="el-scrollbar__view el-select-dropdown__list"> <li class="el-select-dropdown__item hover" @click="onAddItem"> <span>{{ add_new_text }}</span> </li> </ul> </div> <template slot="prefix"> <span class="el-input__suffix-inner el-select-icon"> <i :class="'select-icon-position el-input__icon fa fa-' + icon"></i> </span> </template> <el-option v-if="!group" v-for="(label, value) in selectOptions" :key="value" :label="label" :value="value"> </el-option> <el-option-group v-if="group" v-for="(options, name) in selectOptions" :key="name" :label="name"> <el-option v-for="(label, value) in options" :key="value" :label="label" :value="value"> </el-option> </el-option-group> <li v-if="addNew.status" class="el-select-dropdown__item hover" @click="onAddItem"> <span>{{ add_new_text }}</span> </li> </el-select> <component v-bind:is="add_new_html" @submit="onSubmit"></component> </base-input> </template> <script> import { Select, Option, OptionGroup, ColorPicker } from 'element-ui'; import AkauntingModalAddNew from './AkauntingModalAddNew'; import AkauntingModal from './AkauntingModal'; import AkauntingRadioGroup from './forms/AkauntingRadioGroup'; import AkauntingSelect from './AkauntingSelect'; import AkauntingDate from './AkauntingDate'; import AkauntingRecurring from './AkauntingRecurring'; import Form from './../plugins/form'; export default { name: "akaunting-select", components: { [Select.name]: Select, [Option.name]: Option, [OptionGroup.name]: OptionGroup, [ColorPicker.name]: ColorPicker, AkauntingModalAddNew, AkauntingRadioGroup, AkauntingSelect, AkauntingModal, AkauntingDate, AkauntingRecurring, }, props: { title: { type: String, default: '', description: "Modal header title" }, placeholder: { type: String, default: '', description: "Modal header title" }, formClasses: null, formError: null, name: null, value: null, options: null, model: null, icon: { type: String, description: "Prepend icon (left)" }, addNew: { type: Object, default: function () { return { text: 'Add New Item', status: false, path: null, type: 'modal', // modal, inline field: 'name', buttons: {} }; }, description: "Selectbox Add New Item Feature" }, group: false, multiple:false, disabled:false, collapse: false }, data() { return { add_new: this.addNew, add_new_text: this.addNew.text, selectOptions: this.options, real_model: this.model, add_new_html: '', form: {}, } }, mounted() { this.real_model = this.value; this.$emit('interface', this.real_model); }, methods: { change() { this.$emit('change', this.real_model); this.$emit('interface', this.real_model); }, onAddItem() { // Get Select Input value var value = this.$children[0].$children[0].$children[0].$refs.input.value; if (this.add_new.type == 'inline') { this.addInline(value); } else { this.onModal(value); } }, addInline(value) { }, onModal(value) { let add_new = this.add_new; axios.get(this.add_new.path) .then(response => { add_new.status = true; add_new.html = response.data.html; this.$children[0].$children[0].visible = false; this.add_new_html = Vue.component('add-new-component', function (resolve, reject) { resolve({ template: '<div><akaunting-modal-add-new :show="add_new.status" @submit="onSubmit" @cancel="add_new.status = false" :buttons="add_new.buttons" :title="add_new.text" :is_component=true :message="add_new.html"></akaunting-modal-add-new></div>', components: { AkauntingModalAddNew, AkauntingRadioGroup, AkauntingSelect, AkauntingModal, AkauntingDate, AkauntingRecurring, [ColorPicker.name]: ColorPicker, }, data: function () { return { add_new: add_new, } }, methods: { onSubmit(event) { this.$emit('submit', event); } } }) }); }) .catch(e => { this.errors.push(e); }) .finally(function () { // always executed }); }, onSubmit(event) { this.form = event; axios.post(this.form.action, this.form.data()) .then(response => { this.form.loading = false; if (response.data.success) { this.selectOptions[response.data.data.id] = response.data.data['name']; this.real_model = response.data.data.id.toString(); this.change(); this.add_new.status = false; } }) .catch(error => { this.form.loading = false; this.form.onFail(error); this.method_show_html = error.message; }); }, addModal() { }, }, watch: { options: function (options) { // update options //this.selectOptions = options; } }, } </script> <style scoped> .form-group .modal { z-index: 3050; } </style>