Files
Backend-Api/ServiceHost/wwwroot/AssetsClient/js/services/jalali-date-validator.js
2025-06-03 21:27:14 +03:30

117 lines
3.3 KiB
JavaScript

class JalaliDateInput {
constructor(inputElement) {
this.input = inputElement;
this.input.maxLength = 10;
this.input.placeholder = "____/__/__";
this.input.addEventListener("input", this.onInput.bind(this));
}
onInput(e) {
let value = e.target.value.replace(/\D/g, "");
let year = value.slice(0, 4);
let rawMonth = value.slice(4, 6);
let rawDay = value.slice(6, 8);
//let month = "";
//if (rawMonth.length === 1) {
// const m = parseInt(rawMonth);
// if (m >= 2 && m <= 9) {
// month = "0" + m;
// } else if (m === 1) {
// month = "1";
// }
//} else if (rawMonth.length === 2) {
// let m = parseInt(rawMonth);
// if (isNaN(m)) {
// month = "";
// } else {
// if (m > 12) m = 12;
// month = m.toString().padStart(2, "0");
// }
//}
let month = "";
if (rawMonth.length === 1) {
month = rawMonth;
} else if (rawMonth.length === 2) {
let m = parseInt(rawMonth);
if (!isNaN(m)) {
if (m < 1) m = 1;
if (m > 12) m = 12;
month = m.toString().padStart(2, "0");
}
}
let day = "";
if (rawDay.length === 1) {
day = rawDay;
} else if (rawDay.length === 2 && year.length === 4 && month.length === 2) {
let d = parseInt(rawDay);
if (!isNaN(d)) {
let maxDay = JalaliDateUtils.maxDayInMonth(parseInt(year), parseInt(month));
if (d > maxDay) d = maxDay;
day = d.toString().padStart(2, "0");
}
}
let formatted = year;
if (month) {
formatted += "/" + month;
} else if (value.length > 4) {
formatted += "/";
}
if (day) {
formatted += "/" + day;
} else if (value.length > 6) {
formatted += "/";
}
//let formatted = year;
//if (month) {
// formatted += "/" + month;
//} else if (value.length >= 4) {
// formatted += "/";
//}
//if (day) {
// formatted += "/" + day;
//} else if (value.length >= 6) {
// formatted += "/";
//}
this.input.value = formatted;
}
formatMonth(rawMonth) {
if (!rawMonth) return "";
let month = parseInt(rawMonth, 10);
if (isNaN(month)) return "";
if (month > 12) month = 12;
return month.toString().padStart(2, "0");
}
formatDay(year, month, rawDay) {
if (!rawDay || !month) return "";
let day = parseInt(rawDay, 10);
if (isNaN(day)) return "";
let maxDay = JalaliDateUtils.maxDayInMonth(parseInt(year), parseInt(month));
if (day > maxDay) day = maxDay;
return day.toString().padStart(2, "0");
}
}
class JalaliDateUtils {
static isLeapYear(year) {
const leapYears = [1, 5, 9, 13, 17, 22, 26, 30];
return leapYears.includes(year % 33);
}
static maxDayInMonth(year, month) {
if (month < 1) return 1;
if (month <= 6) return 31;
if (month <= 11) return 30;
return this.isLeapYear(year) ? 30 : 29;
}
}