akaunting/resources/assets/js/components/AkauntingRecurring.vue

384 lines
13 KiB
Vue

<template>
<div class="sm:col-span-6 space-y-6 sm:space-y-2">
<div class="flex flex-wrap lg:flex-nowrap items-center space-y-1 lg:space-y-0" :class="{ 'justify-start': frequency == 'custom' }">
<div class="w-24 sm:w-60 px-0 sm:px-2 text-sm">
{{ frequencyText }}
</div>
<el-select class="w-36" v-model="frequency" @input="change">
<el-option
v-for="(label, value) in frequencies"
:key="value"
:label="label"
:value="value">
</el-option>
</el-select>
<div class="w-20 sm:w-auto px-2 text-sm text-center" v-if="frequency == 'custom'">
{{ frequencyEveryText }}
</div>
<input type="text" class="w-20 text-sm px-3 py-2.5 mt-1 rounded-lg border border-light-gray text-black placeholder-light-gray bg-white disabled:bg-gray-200 focus:outline-none focus:ring-transparent focus:border-purple" v-model="interval" @input="change" v-if="frequency == 'custom'">
<div class="text-red text-sm mt-1 block" v-if="invertalError" v-html="invertalError"></div>
<el-select class="w-36 ml-2" v-model="customFrequency" @input="change" v-if="frequency == 'custom'">
<el-option
v-for="(label, value) in customFrequencies"
:key="value"
:label="label"
:value="value">
</el-option>
</el-select>
<div class="text-red text-sm mt-1 block" v-if="customFrequencyError" v-html="customFrequencyError"></div>
</div>
<div class="flex flex-wrap lg:flex-nowrap items-center space-y-3 lg:space-y-0" :class="{ 'justify-start': limit !== 'never' }">
<div class="w-24 sm:w-60 px-0 sm:px-2 text-sm">
{{ startText }}
</div>
<div
:class="startedError ? 'pt-0' : '' && startedError || limitDateError ? 'pt-0 pb-5' : 'pb-10' && startedError && limitDateError ? 'pt-6 pb-5' : 'pb-10'">
<el-date-picker
class="w-36 cursor-pointer recurring-invoice-data"
v-model="started_at"
@input="change"
type="date"
align="right"
:format="formatDate"
value-format="yyyy-MM-dd"
:picker-options="{
disabledDate(time) {
return time.getTime() < Date.now();
},
shortcuts: [
{
text: dateRangeText['today'],
onClick(picker) {
picker.$emit('pick', new Date());
}
},
{
text: dateRangeText['yesterday'],
onClick(picker) {
const date = new Date();
date.setTime(date.getTime() - 3600 * 1000 * 24);
picker.$emit('pick', date);
}
},
{
text: dateRangeText['week_ago'],
onClick(picker) {
const date = new Date();
date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
picker.$emit('pick', date);
}
}
]
}">
</el-date-picker>
<div class="text-red text-sm mt-1 block" v-if="startedError" v-html="startedError"></div>
</div>
<div class="w-24 px-2 text-sm text-center"
:class="(startedError || limitDateError ? 'pt-10 pb-14' : 'pb-10') && (startedError && limitDateError ? 'pt-6 pb-14' : 'pb-10')">
{{ middleText }}
</div>
<el-select class="w-20" v-model="limit" @input="change"
:class="startedError || limitDateError ? 'pt-0 pb-6' : '' && startedError && limitDateError ? 'pt-6 pb-16' : 'pb-10'">
<el-option
v-for="(label, value) in limits"
:key="value"
:label="label"
:value="value">
</el-option>
</el-select>
<input type="text" class="w-20 cursor-pointer text-sm px-3 py-2.5 mt-1 ml-2 rounded-lg border border-light-gray text-black placeholder-light-gray bg-white disabled:bg-gray-200 focus:outline-none focus:ring-transparent focus:border-purple" v-model="limitCount" v-if="limit == 'after'" @input="change">
<div class="text-red text-sm mt-1 block" v-if="limitCountError" v-html="limitCountError"></div>
<div class="pl-2 text-sm" v-if="limit == 'after'">
{{ endText }}
</div>
<div
:class="startedError || limitDateError ? 'pt-10 pb-10' : 'pb-10' && startedError && limitDateError ? ' pt-20 pb-14' : 'pb-10'">
<el-date-picker
class="w-36 ml-2 cursor-pointer recurring-invoice-data"
v-model="limitDate"
type="date"
align="right"
:format="formatDate"
value-format="yyyy-MM-dd"
v-if="limit == 'on'"
@input="change"
>
</el-date-picker>
<div class="text-red text-sm mt-1 ml-2 block" v-if="limitDateError" v-html="limitDateError"></div>
</div>
</div>
<div v-if="sendEmailShow" class="flex flex-wrap lg:flex-nowrap items-center space-y-1 lg:space-y-0">
<div class="w-24 sm:w-60 px-0 sm:px-2 text-sm">
{{ sendEmailText }}
</div>
<div class="flex items-center mt-1">
<label @click="sendEmail=1;change();" v-bind:class="[sendEmail == 1 ? ['bg-green-500','text-white'] : 'bg-black-100']" class="relative w-10 ltr:rounded-tl-lg ltr:rounded-bl-lg rtl:rounded-tr-lg rtl:rounded-br-lg py-2 px-1 text-sm text-center transition-all cursor-pointer">
{{ sendEmailYesText }}
</label>
<label @click="sendEmail=0;change();"v-bind:class="[sendEmail == 0 ? ['bg-red-500','text-white'] : 'bg-black-100']" class="relative w-10 ltr:rounded-tr-lg ltr:rounded-br-lg rtl:rounded-tl-lg rtl:rounded-bl-lg py-2 px-1 text-sm text-center transition-all cursor-pointer">
{{ sendEmailNoText }}
</label>
</div>
</div>
</div>
</template>
<script>
import { Select, Option, DatePicker } from 'element-ui';
export default {
name: 'akaunting-recurring',
components: {
[Select.name]: Select,
[Option.name]: Option,
[DatePicker.name]: DatePicker,
},
props: {
startText: {
type: String,
default: 'Create first invoice on',
description: "Default reccuring text"
},
dateRangeText: {
type: Object,
default: {
today : 'Today',
yesterday : 'Yesterday',
week_ago : 'A week ago',
},
description: "Default reccuring text"
},
middleText: {
type: String,
default: 'and end',
description: "Default reccuring text"
},
endText: {
type: String,
default: 'invoices',
description: "Default reccuring text"
},
frequencies: null,
frequencyText: {
type: String,
default: 'Repeat this invoice',
description: "Default reccuring text"
},
frequencyEveryText: {
type: String,
default: 'every',
description: "Default reccuring text"
},
frequencyValue: {
type: String,
default: 'monthly',
description: "Default reccuring type"
},
invertalError: {
type: String,
default: null,
description: "Selectbox input error message"
},
customFrequencies: null,
customFrequencyValue: {
type: String,
default: 'monthly',
description: "Default reccuring type"
},
customFrequencyError: {
type: String,
default: null,
description: "Selectbox input error message"
},
startedValue: {
type: String,
default: 'never',
description: "Default reccuring limit"
},
startedError: {
type: String,
default: null,
description: "Selectbox input error message"
},
limits: null,
limitValue: {
type: String,
default: 'never',
description: "Default reccuring limit"
},
limitCountValue: {
type: [Number, String],
default: 0,
description: "Default reccuring limit"
},
limitCountError: {
type: String,
default: null,
description: "Selectbox input error message"
},
limitDateValue: {
type: String,
default: '',
description: "Default reccuring limit"
},
limitDateError: {
type: String,
default: null,
description: "Selectbox input error message"
},
dateFormat: {
type: String,
default: 'dd MM yyyy',
description: "Default date format"
},
sendEmailShow: {
type: [String, Number, Array, Object, Boolean],
default: '1',
description: "Created recurring model send automatically option"
},
sendEmailText: {
type: String,
default: 'Send email automatically',
description: "Created recurring model send automatically option"
},
sendEmailYesText: {
type: String,
default: 'Yes',
description: "Send email option yes text"
},
sendEmailNoText: {
type: String,
default: 'No',
description: "Send email option no text"
},
sendEmailValue: {
type: [Number, String],
default: 0,
description: "Send Email value"
}
},
data() {
return {
frequency: '',
interval: '',
customFrequency: '',
started_at: '',
limit: '',
limitCount: 0,
limitDate: '',
formatDate: 'dd MM YYYY',
sendEmail: 0,
}
},
created() {
this.formatDate = this.convertToDarteFormat(this.dateFormat);
},
mounted() {
this.frequency = this.frequencyValue;
this.customFrequency = this.customFrequencyValue;
this.started_at = this.startedValue;
this.limit = this.limitValue;
this.limitCount = this.limitCountValue;
this.limitDate = this.limitDateValue;
if (this.limit == 'count') {
if (this.limitCount > 0) {
this.limit = 'after';
} else {
this.limit = 'never';
}
} else {
this.limit = 'on';
}
this.sendEmail = this.sendEmailValue;
setTimeout(function() {
this.change();
}.bind(this), 800);
},
methods: {
change() {
this.$emit('change', this.frequency);
this.$emit('frequency', this.frequency);
this.$emit('interval', this.interval);
this.$emit('custom_frequency', this.customFrequency);
this.$emit('started', this.started_at);
switch (this.limit) {
case 'after':
this.$emit('limit', 'count');
this.$emit('limit_count', this.limitCount);
this.$emit('limit_date', null);
break;
case 'on':
this.$emit('limit', 'date');
this.$emit('limit_date', this.limitDate);
this.$emit('limit_count', 0);
break;
case 'never':
default:
this.$emit('limit', 'count');
this.$emit('limit_count', 0);
break;
}
this.$emit('send_email', this.sendEmail);
},
convertToDarteFormat(format) {
return format.replace('d', 'dd')
.replace('M', 'MMM')
.replace('m', 'MM')
.replace('F', 'MMMM')
.replace('y', 'yyyy')
.replace('Y', 'yyyy');
},
}
}
</script>
<style>
.el-input__inner {
height: 42px;
}
</style>