hesabixCore/webUI/src/components/forms/Hdatepicker.vue

95 lines
2.9 KiB
Vue
Raw Normal View History

2025-03-26 21:40:38 +03:30
<template>
<div>
<v-text-field v-model="displayDate" :label="label" prepend-inner-icon="mdi-calendar" persistent-placeholder
class="v-date-input" :rules="rules" @input="updateDateFromInput" @click:prepend="togglePicker"></v-text-field>
<date-picker v-model="displayDate" type="date" format="jYYYY/jMM/jDD" display-format="jYYYY/jMM/jDD"
:min="minDatePersian" :max="maxDatePersian" custom-input=".v-date-input" :input-mode="false"
:editable="pickerActive" @close="pickerActive = false"></date-picker>
</div>
</template>
<script>
import axios from 'axios';
import moment from 'jalali-moment';
export default {
props: {
value: {
type: String,
default: '',
},
label: {
type: String,
default: 'تاریخ',
},
rules: {
type: Array,
default: () => [],
},
},
data() {
return {
displayDate: '', // تاریخ به فرمت شمسی
pickerActive: false, // کنترل باز شدن تقویم
minDatePersian: '', // تاریخ شروع سال مالی (شمسی برای پکیج)
maxDatePersian: '', // تاریخ پایان سال مالی (شمسی برای پکیج)
};
},
watch: {
displayDate(newVal) {
if (newVal) {
this.$emit('input', newVal); // ارسال تاریخ شمسی به والد
} else {
this.$emit('input', '');
2025-03-21 14:20:43 +03:30
}
},
2025-03-26 21:40:38 +03:30
value(newVal) {
if (newVal) {
this.displayDate = newVal;
} else {
this.displayDate = '';
2025-03-21 14:20:43 +03:30
}
},
2025-03-26 21:40:38 +03:30
},
async mounted() {
await this.fetchYearData();
if (!this.value && this.displayDate) {
this.$emit('input', this.displayDate);
}
},
methods: {
async fetchYearData() {
2025-03-21 14:20:43 +03:30
2025-03-26 21:40:38 +03:30
axios.get('/api/year/get').then((response) => {
this.minDatePersian = response.data.start; // فرمت YYYY/MM/DD شمسی
this.maxDatePersian = response.data.end; // فرمت YYYY/MM/DD شمسی
this.displayDate = response.data.now; // تاریخ جاری شمسی
});
2025-03-21 14:20:43 +03:30
},
2025-03-26 21:40:38 +03:30
updateDateFromInput(value) {
// بررسی و اعتبارسنجی تاریخ وارد شده توسط کاربر
if (value && moment(value, 'YYYY/MM/DD', 'fa', true).isValid()) {
const parsedDate = moment(value, 'YYYY/MM/DD').locale('fa');
if (
parsedDate.isSameOrAfter(moment(this.minDatePersian, 'YYYY/MM/DD')) &&
parsedDate.isSameOrBefore(moment(this.maxDatePersian, 'YYYY/MM/DD'))
) {
this.displayDate = value;
} else {
this.displayDate = ''; // یا خطا نمایش بدید
}
}
},
togglePicker() {
this.pickerActive = !this.pickerActive; // تغییر وضعیت تقویم
},
},
};
2025-03-21 14:20:43 +03:30
</script>
<style scoped>
2025-03-26 21:40:38 +03:30
/* مطمئن شدن که تقویم فقط با آیکون فعال بشه */
.v-date-input {
position: relative;
}
2025-03-21 14:20:43 +03:30
</style>