Files
exchange-2.0/resources/assets/vue/components/bookings/elements/DownloadComponent.vue
T

149 lines
5.1 KiB
Vue

<template>
<div class="row m-b-20">
<div class="col">
<div class="row">
<div class="col">
<div class="row m-l-0 m-r-0">
<div class="col-12 col-md mb-2 mb-md-0 p-l-3 p-r-3 p-md-0">
<validation-wrapper-component :validator="$v.parameters.startDate">
<label class="all-caps">Start Date</label>
<date-picker-component :parameters="parameters" v-model.lazy="parameters.startDate"></date-picker-component>
</validation-wrapper-component>
</div>
<div class="col-12 col-md mb-2 mb-md-0 p-l-3 p-r-3 p-md-0">
<validation-wrapper-component :validator="$v.parameters.endDate">
<label class="all-caps">End Date</label>
<date-picker-component :parameters="parameters" v-model.lazy="parameters.endDate"></date-picker-component>
</validation-wrapper-component>
</div>
<div class="col-12 col-md mb-2 mb-md-0 p-l-3 p-r-3 p-md-0">
<validation-wrapper-component selectable :validator="$v.parameters.reportType">
<label class="all-caps">Report Type</label>
<select-component :options="options()" v-model="parameters.reportType"></select-component>
</validation-wrapper-component>
</div>
<div class="col-12 col-md-auto p-l-3 p-r-3 p-md-0">
<div class="btn btn-lg btn-primary fs-11 w-100 h-100 d-flex justify-content-center align-items-center" :class="{ disabled: isDownloading }" @click="handleClick">
<span>
Export
</span>
<span v-if="isDownloading" class="spinner"></span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import componentHandler from "../../../general/mixins/componentHandler";
import { required } from "vuelidate/lib/validators";
export default {
props: {
section:{
type: String,
required: true
}
},
data(){
return {
parameters: {
startDate: '',
endDate: '',
reportType: '',
},
isDownloading: false,
}
},
mounted(){
switch(this.section) {
case 'paymentsReportSection':
this.parameters.reportType = 'Sales Invoice Report'
break;
}
},
validations: {
parameters: {
startDate: {
required
},
endDate: {
required
},
reportType: {
required
},
}
},
methods: {
options() {
return [
'Sales Invoice Report',
'Customers Report',
];
},
handleClick(){
if (!this.validate()) return;
const reportType = this.parameters.reportType;
const routesMap = {
'Sales Invoice Report': route('api.export.transactions.sales-invoices'),
'Customers Report': route('api.export.companies.customers-data'),
};
let url = `${routesMap[reportType]}?startDate=${this.parameters.startDate}&endDate=${this.parameters.endDate}`;
this.isDownloading = true;
if(window.LARAVEL_VAPOR_ENABLED){
this.submit(url, 'get', this.section, false, false);
}
else{
window.open(this.url, '_blank');
this.isDownloading = false;
}
},
successHandler(response) {
if(window.LARAVEL_VAPOR_ENABLED){
if (response.payload !== undefined && response.payload.src) {
window.open(response.payload.src, '_blank');
}
else if (response.src) {
window.open(response.src, '_blank');
}
}
this.isDownloading = false;
},
errorHandler(error) {
this.isDownloading = false;
},
},
mixins: [componentHandler]
};
</script>
<style scoped>
.spinner {
border: 2px solid rgba(0, 0, 0, 0.1);
border-left-color: #000;
border-radius: 50%;
width: 20px;
height: 20px;
animation: spin 1s linear infinite;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
@keyframes spin {
0% {
transform: translate(-50%, -50%) rotate(0deg);
}
100% {
transform: translate(-50%, -50%) rotate(360deg);
}
}
</style>