366 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			366 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|     <akaunting-modal
 | |
|             :title="title"
 | |
|             :show="display"
 | |
|             @cancel="onCancel"
 | |
|             v-if="display">
 | |
|         <template #modal-body>
 | |
|             <div class="modal-body text-left">
 | |
|                 <div class="row">
 | |
|                     <div class="col-md-12">
 | |
|                         <base-input
 | |
|                                 v-model="form.name"
 | |
|                                 :label="text.name"
 | |
|                                 prepend-icon="fas fa-font"
 | |
|                                 :placeholder="placeholder.name"
 | |
|                                 inputGroupClasses="input-group-merge">
 | |
|                         </base-input>
 | |
|                     </div>
 | |
| 
 | |
|                     <div class="col-md-12">
 | |
|                         <base-input
 | |
|                                 :label="text.type">
 | |
|                             <span class="el-input__prefix">
 | |
|                                 <span class="el-input__suffix-inner el-select-icon">
 | |
|                                     <i class="select-icon-position el-input__icon fa fa-bars"></i>
 | |
|                                 </span>
 | |
|                             </span>
 | |
|                             <el-select
 | |
|                                     class="select-primary"
 | |
|                                     v-model="form.widget_id" filterable
 | |
|                                     :placeholder="placeholder.type">
 | |
|                                 <el-option v-for="option in types"
 | |
|                                            class="select-primary"
 | |
|                                            :key="option.name"
 | |
|                                            :label="option.name"
 | |
|                                            :value="option.id">
 | |
|                                 </el-option>
 | |
|                             </el-select>
 | |
|                         </base-input>
 | |
|                     </div>
 | |
| 
 | |
|                     <div class="col-md-12">
 | |
|                         <base-input
 | |
|                                 :label="text.width">
 | |
|                             <span class="el-input__prefix">
 | |
|                                 <span class="el-input__suffix-inner el-select-icon">
 | |
|                                     <i class="select-icon-position el-input__icon fas fa-ruler-horizontal"></i>
 | |
|                                 </span>
 | |
|                             </span>
 | |
|                             <el-select
 | |
|                                     class="select-primary"
 | |
|                                     v-model="form.width" filterable
 | |
|                                     :placeholder="placeholder.width">
 | |
|                                 <el-option v-for="option in widthOptions"
 | |
|                                            class="select-primary"
 | |
|                                            :key="option.label"
 | |
|                                            :label="option.label"
 | |
|                                            :value="option.value">
 | |
|                                 </el-option>
 | |
|                             </el-select>
 | |
|                         </base-input>
 | |
|                     </div>
 | |
| 
 | |
|                     <div class="col-md-12">
 | |
|                         <base-input
 | |
|                                 v-model="form.sort"
 | |
|                                 :label="text.sort"
 | |
|                                 prepend-icon="fas fa-sort"
 | |
|                                 :placeholder="placeholder.sort"
 | |
|                                 inputGroupClasses="input-group-merge"></base-input>
 | |
|                     </div>
 | |
|                 </div>
 | |
|             </div>
 | |
|         </template>
 | |
| 
 | |
|         <template #card-footer>
 | |
|             <div class="row">
 | |
|                 <div class="col-md-12">
 | |
|                     <div class="float-right">
 | |
|                         <button type="button" class="btn btn-icon btn-outline-secondary" @click="onCancel">
 | |
|                             <span class="btn-inner--icon"><i class="fas fa-times"></i></span>
 | |
|                             <span class="btn-inner--text">{{ text.cancel }}</span>
 | |
|                         </button>
 | |
| 
 | |
|                         <button :disabled="form.loading" type="button" class="btn btn-icon btn-success button-submit" @click="onSave">
 | |
|                             <div v-if="form.loading" class="aka-loader-frame"><div class="aka-loader"></div></div>
 | |
|                             <span v-if="!form.loading" class="btn-inner--icon"><i class="fas fa-save"></i></span>
 | |
|                             <span v-if="!form.loading" class="btn-inner--text">{{ text.save }}</span>
 | |
|                         </button>
 | |
|                     </div>
 | |
|                 </div>
 | |
|             </div>
 | |
|         </template>
 | |
|     </akaunting-modal>
 | |
| </template>
 | |
| 
 | |
| <style>
 | |
|     .form-group .el-select {
 | |
|         width: 100%
 | |
|     }
 | |
| 
 | |
|     .el-input__prefix
 | |
|     {
 | |
|         left: 20px;
 | |
|         z-index: 999;
 | |
|         top: 2px;
 | |
|     }
 | |
| 
 | |
|     .el-select .el-input .el-input__inner {
 | |
|         font-size: .875rem;
 | |
|         width: 100%;
 | |
|         height: calc(1.5em + 1.25rem + 2px);
 | |
|         -webkit-transition: all .15s ease-in-out;
 | |
|         transition: all .15s ease-in-out
 | |
|     }
 | |
| 
 | |
|     @media (prefers-reduced-motion:reduce) {
 | |
|         .el-select .el-input .el-input__inner {
 | |
|             -webkit-transition: none;
 | |
|             transition: none
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     .el-select .el-input .el-input__inner:focus {
 | |
|         border-color: #324cdd!important;
 | |
|         border: 1px solid #2a44db
 | |
|     }
 | |
| 
 | |
|     .el-select .el-input .el-input__inner::-webkit-input-placeholder {
 | |
|         color: #adb5bd;
 | |
|         opacity: 1
 | |
|     }
 | |
| 
 | |
|     .el-select .el-input .el-input__inner::-moz-placeholder {
 | |
|         color: #adb5bd;
 | |
|         opacity: 1
 | |
|     }
 | |
| 
 | |
|     .el-select .el-input .el-input__inner::-ms-input-placeholder {
 | |
|         color: #adb5bd;
 | |
|         opacity: 1
 | |
|     }
 | |
| 
 | |
|     .el-select .el-input .el-input__inner::placeholder {
 | |
|         color: #adb5bd;
 | |
|         opacity: 1
 | |
|     }
 | |
| 
 | |
|     .el-select .el-input .el-input__inner:disabled {
 | |
|         background-color: #e9ecef;
 | |
|         opacity: 1
 | |
|     }
 | |
| 
 | |
|     .el-select .el-input.is-focus .el-input__inner {
 | |
|         border-color: #324cdd!important;
 | |
|         border: 1px solid #2a44db
 | |
|     }
 | |
| 
 | |
|     .el-select-dropdown.el-popper .el-select-dropdown__item.selected,.el-select-dropdown.el-popper.is-multiple .el-select-dropdown__item.selected {
 | |
|         color: #5e72e4
 | |
|     }
 | |
| 
 | |
|     .el-select .el-select__tags {
 | |
|         padding-left: 10px
 | |
|     }
 | |
| 
 | |
|     .el-select .el-select__tags .el-tag {
 | |
|         display: -webkit-box;
 | |
|         display: -ms-flexbox;
 | |
|         display: flex;
 | |
|         -webkit-box-pack: center;
 | |
|         -ms-flex-pack: center;
 | |
|         justify-content: center;
 | |
|         -webkit-box-align: center;
 | |
|         -ms-flex-align: center;
 | |
|         align-items: center;
 | |
|         padding: .625rem .625rem .5rem;
 | |
|         height: 25px;
 | |
|         margin: .125rem;
 | |
|         border-radius: .25rem;
 | |
|         background: #172b4d;
 | |
|         color: #fff;
 | |
|         line-height: 1.5;
 | |
|         cursor: pointer;
 | |
|         -webkit-box-shadow: 0 1px 2px rgba(68,68,68,.25);
 | |
|         box-shadow: 0 1px 2px rgba(68,68,68,.25);
 | |
|         -webkit-transition: all .15s ease;
 | |
|         transition: all .15s ease
 | |
|     }
 | |
| 
 | |
|     @media (prefers-reduced-motion:reduce) {
 | |
|         .el-select .el-select__tags .el-tag {
 | |
|             -webkit-transition: none;
 | |
|             transition: none
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     .el-select .el-select__tags .el-tag .el-tag__close.el-icon-close {
 | |
|         background-color: transparent;
 | |
|         color: #fff;
 | |
|         font-size: 12px
 | |
|     }
 | |
| </style>
 | |
| 
 | |
| <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: Boolean,
 | |
|         action: {
 | |
|             type: String,
 | |
|             default: 'create',
 | |
|             description: "Modal header title"
 | |
|         },
 | |
|         title: {
 | |
|             type: String,
 | |
|             default: '',
 | |
|             description: "Modal header title"
 | |
|         },
 | |
|         text: {},
 | |
|         placeholder: {},
 | |
|         name: {
 | |
|             type: String,
 | |
|             default: ''
 | |
|         },
 | |
|         width: {
 | |
|             type: String,
 | |
|             default: ''
 | |
|         },
 | |
|         type: {
 | |
|             type: String,
 | |
|             default: 'create',
 | |
|             description: "Modal header title"
 | |
|         },
 | |
|         sort: {
 | |
|             type: String,
 | |
|             default: 'create',
 | |
|             description: "Modal header title"
 | |
|         },
 | |
|         types: {},
 | |
|         dashboard_id: {
 | |
|             type: Number,
 | |
|             default: 0,
 | |
|             description: "Modal header title"
 | |
|         },
 | |
|         widget_id: {
 | |
|             type: Number,
 | |
|             default: 0,
 | |
|             description: "Modal header title"
 | |
|         },
 | |
|     },
 | |
| 
 | |
|     data() {
 | |
|         return {
 | |
|             widthOptions: [
 | |
|                 {
 | |
|                     label: '25%',
 | |
|                     value: 'col-md-3'
 | |
|                 },
 | |
|                 {
 | |
|                     label: '33%',
 | |
|                     value: 'col-md-4'
 | |
|                 },
 | |
|                 {
 | |
|                     label: '50%',
 | |
|                     value: 'col-md-6'
 | |
|                 },
 | |
|                 {
 | |
|                     label: '100%',
 | |
|                     value: 'col-md-12'
 | |
|                 }
 | |
|             ],
 | |
|             form: {
 | |
|                 loading: false,
 | |
|                 name: this.name,
 | |
|                 width: this.width,
 | |
|                 widget_id: this.type,
 | |
|                 sort: this.sort,
 | |
|                 dashboard_id: this.dashboard_id
 | |
|             },
 | |
|             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;
 | |
|                 }
 | |
| 
 | |
|                 self.form.response = response.data;
 | |
|             })
 | |
|             .catch(function (error) {
 | |
|                 this.errors.record(error.response.data.errors);
 | |
| 
 | |
|                 self.form.loading = false;
 | |
|             });
 | |
|         },
 | |
| 
 | |
|         onCancel() {
 | |
|             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("modal-open");
 | |
|             } else {
 | |
|                 documentClasses.remove("modal-open");
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | |
| </script>
 |