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
|
2025-03-31 02:05:53 +03:30
|
|
|
:class="['v-date-input', `date-input-${uniqueId}`]" :rules="rules" @input="updateDateFromInput" @click:prepend="togglePicker"></v-text-field>
|
2025-03-26 21:40:38 +03:30
|
|
|
<date-picker v-model="displayDate" type="date" format="jYYYY/jMM/jDD" display-format="jYYYY/jMM/jDD"
|
2025-04-03 14:16:18 +03:30
|
|
|
:min="ignoreYearRange ? (min || null) : minDatePersian"
|
|
|
|
:max="ignoreYearRange ? null : maxDatePersian"
|
|
|
|
:custom-input="`.date-input-${uniqueId}`"
|
|
|
|
:input-mode="true"
|
|
|
|
:editable="pickerActive"
|
|
|
|
@close="pickerActive = false"></date-picker>
|
2025-03-26 21:40:38 +03:30
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
|
|
import axios from 'axios';
|
|
|
|
import moment from 'jalali-moment';
|
|
|
|
|
|
|
|
export default {
|
|
|
|
props: {
|
2025-03-31 02:05:53 +03:30
|
|
|
modelValue: {
|
2025-03-26 21:40:38 +03:30
|
|
|
type: String,
|
|
|
|
default: '',
|
|
|
|
},
|
|
|
|
label: {
|
|
|
|
type: String,
|
|
|
|
default: 'تاریخ',
|
|
|
|
},
|
|
|
|
rules: {
|
|
|
|
type: Array,
|
|
|
|
default: () => [],
|
|
|
|
},
|
2025-04-03 14:16:18 +03:30
|
|
|
ignoreYearRange: {
|
|
|
|
type: Boolean,
|
|
|
|
default: false
|
|
|
|
},
|
|
|
|
min: {
|
|
|
|
type: String,
|
|
|
|
default: null
|
|
|
|
}
|
2025-03-26 21:40:38 +03:30
|
|
|
},
|
|
|
|
data() {
|
|
|
|
return {
|
2025-03-31 02:05:53 +03:30
|
|
|
displayDate: this.modelValue, // مقداردهی اولیه از prop
|
2025-03-26 21:40:38 +03:30
|
|
|
pickerActive: false, // کنترل باز شدن تقویم
|
|
|
|
minDatePersian: '', // تاریخ شروع سال مالی (شمسی برای پکیج)
|
|
|
|
maxDatePersian: '', // تاریخ پایان سال مالی (شمسی برای پکیج)
|
2025-03-31 02:05:53 +03:30
|
|
|
uniqueId: '', // شناسه یکتا برای هر نمونه
|
|
|
|
isInitialized: false, // فلگ برای کنترل مقداردهی اولیه
|
2025-03-26 21:40:38 +03:30
|
|
|
};
|
|
|
|
},
|
2025-03-31 02:05:53 +03:30
|
|
|
created() {
|
|
|
|
// ایجاد شناسه یکتا برای هر نمونه از کامپوننت
|
|
|
|
this.uniqueId = Math.random().toString(36).substring(2, 15);
|
|
|
|
},
|
2025-03-26 21:40:38 +03:30
|
|
|
watch: {
|
2025-03-31 02:05:53 +03:30
|
|
|
displayDate(newVal, oldVal) {
|
|
|
|
if (newVal !== oldVal) {
|
|
|
|
this.$emit('update:modelValue', newVal);
|
2025-03-21 14:20:43 +03:30
|
|
|
}
|
|
|
|
},
|
2025-03-31 02:05:53 +03:30
|
|
|
modelValue: {
|
|
|
|
immediate: true,
|
|
|
|
handler(newVal) {
|
|
|
|
if (newVal && newVal !== this.displayDate) {
|
|
|
|
this.displayDate = newVal;
|
|
|
|
}
|
2025-03-21 14:20:43 +03:30
|
|
|
}
|
2025-03-31 02:05:53 +03:30
|
|
|
}
|
2025-03-26 21:40:38 +03:30
|
|
|
},
|
|
|
|
async mounted() {
|
|
|
|
await this.fetchYearData();
|
|
|
|
},
|
|
|
|
methods: {
|
|
|
|
async fetchYearData() {
|
2025-03-31 02:05:53 +03:30
|
|
|
try {
|
|
|
|
const response = await axios.get('/api/year/get');
|
|
|
|
this.minDatePersian = response.data.start;
|
|
|
|
this.maxDatePersian = response.data.end;
|
|
|
|
|
|
|
|
// فقط اگر مقدار اولیه نداریم، از تاریخ جاری استفاده کنیم
|
|
|
|
if (!this.modelValue && !this.isInitialized) {
|
|
|
|
this.displayDate = response.data.now;
|
|
|
|
this.$emit('update:modelValue', response.data.now);
|
|
|
|
this.isInitialized = true;
|
|
|
|
}
|
|
|
|
} catch (error) {
|
|
|
|
console.error('خطا در دریافت اطلاعات سال:', error);
|
|
|
|
}
|
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()) {
|
2025-04-03 14:16:18 +03:30
|
|
|
this.displayDate = value;
|
2025-03-26 21:40:38 +03:30
|
|
|
}
|
|
|
|
},
|
|
|
|
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>
|