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

109 lines
3.3 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
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"
: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: () => [],
},
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()) {
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>