@qeydar/datepicker
Version:
A comprehensive Date and Time Picker for Angular with Jalali calendar support
825 lines (817 loc) • 112 kB
JavaScript
import { Component, Input, Output, EventEmitter, ViewChild, HostListener, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
import { TimePickerComponent } from '../time-picker/time-picker.component';
import { takeUntil } from 'rxjs';
import { NgIf } from '@angular/common';
import { CalendarHeaderComponent } from './components/calendar-header.component';
import { CalendarSidebarComponent } from './components/calendar-sidebar.component';
import { DaysGridComponent } from './components/days-grid.component';
import { MonthsGridComponent } from './components/months-grid.component';
import { YearsGridComponent } from './components/years-grid.component';
import { CalendarFooterComponent } from './components/calendar-footer.component';
import * as i0 from "@angular/core";
import * as i1 from "../date-picker.service";
import * as i2 from "../date-adapter";
import * as i3 from "./services/calendar-utils.service";
import * as i4 from "./services/validation-strategy.service";
import * as i5 from "./services/selection-strategy.service";
export class DatePickerPopupComponent {
constructor(el, cdr, dpService, jalali, gregorian, destroy$, calendarUtils, validationStrategy, selectionStrategy) {
this.el = el;
this.cdr = cdr;
this.dpService = dpService;
this.jalali = jalali;
this.gregorian = gregorian;
this.destroy$ = destroy$;
this.calendarUtils = calendarUtils;
this.validationStrategy = validationStrategy;
this.selectionStrategy = selectionStrategy;
// ========== Input Properties ==========
this.rtl = false;
this.selectedDate = null;
this.selectedStartDate = null;
this.selectedEndDate = null;
this.mode = 'day';
this.isRange = false;
this.customLabels = [];
this.minDate = null;
this.maxDate = null;
this.cssClass = '';
this.footerDescription = '';
this.activeInput = null;
this.showSidebar = true;
this.showTimePicker = false;
this.timeDisplayFormat = 'HH:mm';
this.disabledDates = [];
// ========== Output Properties ==========
this.dateSelected = new EventEmitter();
this.dateRangeSelected = new EventEmitter();
this.closePicker = new EventEmitter();
this.clickInside = new EventEmitter();
// ========== Class Properties ==========
this.weekDays = [];
this.periods = [];
this.days = [];
this.selectedPeriod = '';
this.tempEndDate = null;
this.monthListNum = Array.from({ length: 12 }, (_, i) => i + 1);
this.yearList = [];
this.yearRanges = [];
this.viewMode = 'days';
this.timeoutId = null;
// helpers for child bindings
this.isActiveMonthNumber = (m) => m === this.dateAdapter.getMonth(this.currentDate) + 1;
this.isActiveYearNumber = (y) => y === this.dateAdapter.getYear(this.currentDate);
cdr.markForCheck();
}
// ========== Getters ==========
get getDate() {
return this.selectedDate || this.selectedStartDate || this.selectedEndDate || new Date();
}
// ========== Lifecycle Hooks ==========
ngOnInit() {
this.initializeComponent();
}
ngOnChanges(changes) {
this.handleChanges(changes);
}
ngAfterViewInit() {
this.scrollToSelectedItem();
this.setTimePickerDate();
this.templates.forEach((item) => {
switch (item.getType()) {
case 'day':
this.dayTemplate = item.template;
break;
case 'month':
this.monthTemplate = item.template;
break;
case 'quarter':
this.quarterTemplate = item.template;
break;
case 'year':
this.yearTemplate = item.template;
break;
}
});
this.cdr.markForCheck();
}
ngOnDestroy() {
if (this.timeoutId != null) {
clearTimeout(this.timeoutId);
}
}
// ========== Initialization Methods ==========
initializeComponent() {
this.setDateAdapter();
this.setInitialDate();
this.generateCalendar();
this.weekDays = this.calendarUtils.getWeekDays(this.dateAdapter);
if (this.mode === 'year') {
this.showYearSelector();
}
this.initLabels();
}
initLabels() {
const today = this.dateAdapter.today();
if (this.customLabels?.length) {
this.periods = this.customLabels;
}
else if (this.isRange) {
this.generateDefaultPeriods(today);
}
}
generateDefaultPeriods(today) {
this.periods = this.calendarUtils.generateDefaultPeriods(today, this.lang);
}
// ========== Date Adapter Methods ==========
setDateAdapter() {
this.lang = this.dpService.locale;
}
// ========== Calendar Generation Methods ==========
generateCalendar() {
this.days = this.calendarUtils.generateDaysGrid(this.currentDate, this.dateAdapter);
}
// ========== View Mode Management ==========
setViewMode() {
this.viewMode = this.calendarUtils.determineViewMode(this.mode);
if (this.mode === 'month') {
this.generateYearList(15);
}
}
showMonthSelector() {
this.viewMode = 'months';
this.generateYearList(15);
this.scrollToSelectedItem(this.dateAdapter.getYear(this.getDate));
this.cdr.markForCheck();
}
showYearSelector() {
this.viewMode = 'years';
this.generateYearRanges();
this.generateYearList();
this.scrollToSelectedItem();
this.cdr.markForCheck();
}
// ========== Time Selection Methods ==========
onTimeChange(time) {
const timeDate = time instanceof Date ? time : new Date(time);
if (!this.isRange) {
this.updateSingleDateTime(timeDate);
}
else {
this.updateRangeDateTime(timeDate);
}
}
updateSingleDateTime(timeDate) {
if (!this.selectedDate) {
this.selectedDate = this.dateAdapter.today();
}
const result = this.selectionStrategy.updateSingleTime(timeDate, this.selectedDate);
this.selectedDate = result.selectedDate;
}
updateRangeDateTime(timeDate) {
const result = this.selectionStrategy.updateRangeTime(timeDate, this.activeInput, this.selectedStartDate, this.selectedEndDate);
this.selectedStartDate = result.selectedStartDate;
this.selectedEndDate = result.selectedEndDate;
if (result.shouldEmit) {
if (this.activeInput === 'start') {
this.dateRangeSelected.emit({ start: this.selectedStartDate, end: null });
}
else if (this.activeInput === 'end') {
clearTimeout(this.timeoutId);
this.timeoutId = setTimeout(() => {
this.dateRangeSelected.emit({ start: this.selectedStartDate, end: this.selectedEndDate });
}, 300);
}
}
}
setTimePickerDate(date) {
if (this.showTimePicker) {
if (this.isRange) {
this.dpService.activeInput$.asObservable()
.pipe(takeUntil(this.destroy$))
.subscribe(active => {
if (active == 'start') {
this.timePicker.updateFromDate(this.selectedStartDate);
}
else {
this.timePicker.updateFromDate(this.selectedEndDate);
}
this.timePicker.scrollToTime();
});
}
else {
this.timePicker.updateFromDate(date || this.selectedDate);
this.timePicker.scrollToTime();
}
}
}
// ========== Date Selection Methods ==========
selectDate(date) {
if (this.isDateDisabled(date))
return;
if (this.showTimePicker) {
const existingDate = this.isRange ?
(this.activeInput === 'start' ? this.selectedStartDate : this.selectedEndDate) :
this.selectedDate;
if (existingDate) {
date = this.selectionStrategy.applyTimeToDate(date, existingDate);
}
}
else {
date = this.selectionStrategy.applyTimeToDate(date, new Date());
}
if (this.isRange) {
this.handleRangeSelection(date);
}
else {
this.handleSingleSelection(date);
}
this.currentDate = date;
this.cdr.markForCheck();
}
handleRangeSelection(date) {
const prevStartDate = this.selectedStartDate;
const prevEndDate = this.selectedEndDate;
const result = this.selectionStrategy.handleRangeSelection(date, this.selectedStartDate, this.selectedEndDate, this.showTimePicker);
this.selectedStartDate = result.selectedStartDate;
this.selectedEndDate = result.selectedEndDate;
if (!this.showTimePicker) {
this.activeInput = result.activeInput;
this.dpService.activeInput$.next(result.activeInput);
}
else if (this.showTimePicker) {
this.activeInput = result.activeInput;
this.dpService.activeInput$.next(result.activeInput);
}
if (result.shouldEmit) {
this.dateRangeSelected.emit({ start: this.selectedStartDate, end: this.selectedEndDate });
}
if (prevStartDate !== this.selectedStartDate || prevEndDate !== this.selectedEndDate)
this.cdr.markForCheck();
}
handleSingleSelection(date) {
const result = this.selectionStrategy.handleSingleSelection(date, this.selectedDate, this.showTimePicker);
this.selectedDate = result.selectedDate;
if (result.shouldEmit) {
this.dateSelected.emit(result.selectedDate);
}
}
selectMonth(month, closeAfterSelection = false) {
if (this.isMonthDisabled(month))
return;
this.currentDate = this.dateAdapter.createDate(this.dateAdapter.getYear(this.currentDate), month - 1, 1);
if (this.isRange && this.mode === 'month') {
this.handleRangeSelection(this.currentDate);
return;
}
if (this.mode === 'month' || closeAfterSelection) {
this.selectedDate = this.currentDate;
this.dateSelected.emit(this.currentDate);
this.closeDatePicker();
}
else {
this.viewMode = 'days';
this.generateCalendar();
this.cdr.detectChanges();
}
this.scrollToSelectedItem(month);
}
selectYear(year, sideSelector = false) {
if (this.isYearDisabled(year))
return;
this.currentDate = this.dateAdapter.createDate(year, this.dateAdapter.getMonth(this.currentDate), 1);
if (this.isRange && this.mode === 'year') {
this.handleRangeSelection(this.currentDate);
return;
}
if (this.mode === 'year') {
this.selectedDate = this.currentDate;
this.dateSelected.emit(this.currentDate);
this.closeDatePicker();
return;
}
if (sideSelector) {
this.currentDate = this.dateAdapter.setYear(this.selectedDate, year);
this.scrollToSelectedItem(year);
}
else {
this.viewMode = 'months';
this.cdr.detectChanges();
}
}
// ========== Navigation Methods ==========
goPrev() {
if (this.viewMode === 'days') {
this.prevMonth();
this.cdr.detectChanges();
return;
}
let id;
if (this.viewMode === 'months') {
this.currentDate = this.calendarUtils.navigateToPrevYear(this.currentDate, this.dateAdapter);
id = this.dateAdapter.getYear(this.currentDate);
}
if (this.viewMode === 'years') {
this.yearList = this.calendarUtils.navigateToPrevYearRange(this.yearList);
id = this.yearList[0];
}
this.cdr.detectChanges();
this.scrollToSelectedItem(id);
}
goNext() {
if (this.viewMode === 'days') {
this.nextMonth();
this.cdr.detectChanges();
return;
}
let id;
if (this.viewMode === 'months') {
this.currentDate = this.calendarUtils.navigateToNextYear(this.currentDate, this.dateAdapter);
id = this.dateAdapter.getYear(this.currentDate);
}
if (this.viewMode === 'years') {
this.yearList = this.calendarUtils.navigateToNextYearRange(this.yearList);
id = this.yearList[0];
}
this.cdr.detectChanges();
this.scrollToSelectedItem(id);
}
prevMonth() {
if (this.isPrevMonthDisabled())
return;
this.currentDate = this.calendarUtils.navigateToPrevMonth(this.currentDate, this.dateAdapter);
this.generateCalendar();
this.scrollToSelectedItem(this.dateAdapter.getMonth(this.currentDate) + 1);
}
nextMonth() {
if (this.isNextMonthDisabled())
return;
this.currentDate = this.calendarUtils.navigateToNextMonth(this.currentDate, this.dateAdapter);
this.generateCalendar();
this.scrollToSelectedItem(this.dateAdapter.getMonth(this.currentDate) + 1);
}
// ========== State Check Methods ==========
isSelected(date) {
if (this.isRange) {
return this.selectionStrategy.isRangeSelected(date, this.selectedStartDate, this.selectedEndDate, this.dateAdapter);
}
return this.selectionStrategy.isSelected(date, this.selectedDate, this.dateAdapter);
}
isRangeStart(date) {
return this.isRange && this.selectionStrategy.isRangeStart(date, this.selectedStartDate, this.dateAdapter);
}
isRangeEnd(date) {
return this.isRange && this.selectionStrategy.isRangeEnd(date, this.selectedEndDate, this.dateAdapter);
}
isInRange(date) {
return this.isRange && this.selectionStrategy.isInRange(date, this.selectedStartDate, this.selectedEndDate, this.tempEndDate, this.dateAdapter);
}
isToday(date) {
return this.selectionStrategy.isToday(date, this.dateAdapter, this.showToday);
}
isActiveMonth(month) {
return this.calendarUtils.isActiveMonth(month, this.currentDate, this.dateAdapter);
}
isActiveYear(year) {
return this.calendarUtils.isActiveYear(year, this.currentDate, this.dateAdapter);
}
isActiveYearRange(startYear) {
return this.calendarUtils.isActiveYearRange(startYear, this.yearList);
}
// ========== Disabled State Methods ==========
isDateDisabled(date) {
return this.validationStrategy.isDateDisabled(date, this.dateAdapter, this.minDate, this.maxDate, this.disabledDates, this.disabledDatesFilter, this.dateFormat);
}
isMonthDisabled(month) {
const year = this.dateAdapter.getYear(this.currentDate);
return this.validationStrategy.isMonthDisabled(month, year, this.dateAdapter, this.minDate, this.maxDate, this.disabledDates, this.disabledDatesFilter, this.dateFormat);
}
isYearDisabled(year) {
return this.validationStrategy.isYearDisabled(year, this.dateAdapter, this.minDate, this.maxDate, this.disabledDates, this.disabledDatesFilter, this.dateFormat);
}
isYearRangeDisabled(yearRange) {
return this.validationStrategy.isYearRangeDisabled(yearRange, this.dateAdapter, this.minDate, this.maxDate, this.disabledDates, this.disabledDatesFilter, this.dateFormat);
}
isPrevMonthDisabled() {
return this.validationStrategy.isPrevNavigationDisabled(this.currentDate, this.viewMode, this.dateAdapter, this.minDate, this.yearList);
}
isNextMonthDisabled() {
return this.validationStrategy.isNextNavigationDisabled(this.currentDate, this.viewMode, this.dateAdapter, this.maxDate, this.yearList);
}
parseDisabledDates() {
return this.validationStrategy.parseDisabledDates(this.disabledDates, this.dateAdapter, this.dateFormat);
}
// ========== Event Handlers ==========
onMouseEnter(date, event) {
this.tempEndDate = this.selectionStrategy.handleMouseEnter(date, this.selectedStartDate, this.selectedEndDate);
}
onClickInside() {
this.clickInside.emit(true);
}
// ========== Utility Methods ==========
getMonthName(month) {
return this.calendarUtils.getMonthName(month, this.dateAdapter);
}
getCurrentMonthName() {
return this.calendarUtils.getCurrentMonthName(this.currentDate, this.dateAdapter);
}
getCurrentYear() {
return this.calendarUtils.getCurrentYear(this.currentDate, this.dateAdapter);
}
getWeekDays() {
return this.calendarUtils.getWeekDays(this.dateAdapter);
}
isSameMonth(date1, date2) {
return this.calendarUtils.isSameMonth(date1, date2, this.dateAdapter);
}
closeDatePicker() {
this.closePicker.emit();
}
// ========== Year Management Methods ==========
generateYearRanges(length = 15) {
this.yearRanges = this.calendarUtils.generateYearRanges(length, this.dateAdapter);
}
generateYearList(length = 15) {
const date = this.selectedDate || this.selectedEndDate || this.selectedStartDate || new Date();
const currentYear = this.dateAdapter.getYear(date);
this.yearList = this.calendarUtils.generateYearList(currentYear, length);
}
selectYearRange(startYear) {
this.yearList = Array.from({ length: 15 }, (_, i) => startYear + i);
this.viewMode = 'years';
this.cdr.detectChanges();
this.scrollToSelectedItem(startYear);
}
// ========== Period Selection Methods ==========
isActivePeriod(period) {
return this.selectionStrategy.isActivePeriod(period, this.selectedStartDate, this.selectedEndDate, this.dateAdapter, this.periods);
}
selectPeriod(period) {
const result = this.selectionStrategy.selectPeriod(period);
this.selectedPeriod = result.selectedPeriod;
if (!result.isCustom && result.dateRange) {
this.dateRangeSelected.emit(result.dateRange);
}
}
onTodayClick() {
this.currentDate = this.selectedDate = new Date();
this.viewMode = 'days';
this.generateCalendar();
this.selectDate(this.currentDate);
this.setTimePickerDate(this.currentDate);
this.cdr.detectChanges();
}
onOkClick() {
if (this.isRange) {
this.dateRangeSelected.emit({ start: this.selectedStartDate, end: this.selectedEndDate });
this.closeDatePicker();
}
else {
this.dateSelected.emit(this.selectedDate);
}
}
// ========== Scroll Management ==========
scrollToSelectedItem(id = null) {
if (!this.showSidebar)
return;
if (this.timeoutId != null) {
clearTimeout(this.timeoutId);
}
const itemId = this.determineScrollItemId(id);
if (!itemId || !this.sidebar || !this.sidebar.itemSelector)
return;
this.timeoutId = setTimeout(() => {
const selectedElement = this.sidebar.itemSelector.nativeElement.querySelector(`#selector_${itemId}`);
if (selectedElement) {
selectedElement.scrollIntoView({ behavior: 'smooth', block: 'center' });
}
}, 0);
}
determineScrollItemId(id) {
if (id != null)
return id;
if (!this.getDate)
return null;
return this.calendarUtils.getScrollItemId(this.viewMode, this.getDate, this.dateAdapter, this.yearRanges);
}
// ========== State Management ==========
handleChanges(changes) {
if (changes['dateAdapter']) {
this.setDateAdapter();
this.weekDays = this.dateAdapter.getDayOfWeekNames('short');
}
if (changes['selectedDate'] ||
changes['selectedStartDate'] ||
changes['selectedEndDate'] ||
changes['mode'] ||
changes['dateAdapter']) {
this.setInitialDate();
this.generateCalendar();
}
if (changes['minDate'] || changes['maxDate']) {
this.adjustCurrentDateToValidRange();
}
}
setInitialDate() {
this.currentDate = this.determineInitialDate();
this.setViewMode();
this.adjustCurrentDateToValidRange();
}
determineInitialDate() {
if (this.isRange) {
if (this.activeInput === 'start') {
return this.selectedStartDate || this.dateAdapter.today();
}
return this.selectedEndDate || this.selectedStartDate || this.dateAdapter.today();
}
return this.selectedDate || this.dateAdapter.today();
}
adjustCurrentDateToValidRange() {
const adjustedDate = this.validationStrategy.adjustDateToValidRange(this.currentDate, this.dateAdapter, this.minDate, this.maxDate);
if (!this.dateAdapter.isSameDay(this.currentDate, adjustedDate)) {
this.currentDate = adjustedDate;
this.generateCalendar();
}
}
}
DatePickerPopupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DatePickerPopupComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.QeydarDatePickerService }, { token: i2.JalaliDateAdapter }, { token: i2.GregorianDateAdapter }, { token: i1.DestroyService }, { token: i3.CalendarUtilsService }, { token: i4.ValidationStrategyService }, { token: i5.SelectionStrategyService }], target: i0.ɵɵFactoryTarget.Component });
DatePickerPopupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: DatePickerPopupComponent, isStandalone: true, selector: "qeydar-date-picker-popup", inputs: { rtl: "rtl", selectedDate: "selectedDate", selectedStartDate: "selectedStartDate", selectedEndDate: "selectedEndDate", mode: "mode", isRange: "isRange", customLabels: "customLabels", minDate: "minDate", maxDate: "maxDate", cssClass: "cssClass", footerDescription: "footerDescription", activeInput: "activeInput", showSidebar: "showSidebar", showToday: "showToday", showTimePicker: "showTimePicker", timeDisplayFormat: "timeDisplayFormat", dateFormat: "dateFormat", readOnly: "readOnly", disabledDates: "disabledDates", disabledDatesFilter: "disabledDatesFilter", disabledTimesFilter: "disabledTimesFilter", templates: "templates", dateAdapter: "dateAdapter" }, outputs: { dateSelected: "dateSelected", dateRangeSelected: "dateRangeSelected", closePicker: "closePicker", clickInside: "clickInside" }, host: { listeners: { "click": "onClickInside()" }, classAttribute: "qeydar-date-picker-popup" }, viewQueries: [{ propertyName: "sidebar", first: true, predicate: CalendarSidebarComponent, descendants: true }, { propertyName: "timePicker", first: true, predicate: TimePickerComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: `
<div class="date-picker-popup" [class.rtl]="rtl" [class]="cssClass" [class.readOnly]="readOnly" tabindex="-1">
<div class="date-picker-content">
<qeydar-calendar-sidebar
*ngIf="showSidebar"
[showSidebar]="showSidebar"
[isRange]="isRange"
[viewMode]="viewMode"
[periods]="periods"
[monthListNum]="monthListNum"
[yearList]="yearList"
[yearRanges]="yearRanges"
[isActivePeriod]="isActivePeriod.bind(this)"
[getMonthName]="getMonthName.bind(this)"
[isActiveMonth]="isActiveMonth.bind(this)"
[isMonthDisabled]="isMonthDisabled.bind(this)"
[isActiveYear]="isActiveYear.bind(this)"
[isYearDisabled]="isYearDisabled.bind(this)"
[isActiveYearRange]="isActiveYearRange.bind(this)"
[isYearRangeDisabled]="isYearRangeDisabled.bind(this)"
(selectPeriod)="selectPeriod($event)"
(selectMonth)="selectMonth($event, false)"
(selectYear)="selectYear($event, true)"
(selectYearRange)="selectYearRange($event)"
></qeydar-calendar-sidebar>
<div class="calendar">
<qeydar-calendar-header
[mode]="mode"
[currentMonthName]="getCurrentMonthName()"
[currentYear]="getCurrentYear()"
[prevDisabled]="isPrevMonthDisabled()"
[nextDisabled]="isNextMonthDisabled()"
(prev)="goPrev()"
(next)="goNext()"
(showMonths)="showMonthSelector()"
(showYears)="showYearSelector()"
></qeydar-calendar-header>
<qeydar-days-grid
[viewMode]="viewMode"
[days]="days"
[weekDays]="getWeekDays()"
[currentDate]="currentDate"
[dayTemplate]="$any(dayTemplate)"
[isSameMonth]="isSameMonth.bind(this)"
[isSelected]="isSelected.bind(this)"
[isInRange]="isInRange.bind(this)"
[isRangeStart]="isRangeStart.bind(this)"
[isRangeEnd]="isRangeEnd.bind(this)"
[isToday]="isToday.bind(this)"
[isDateDisabled]="isDateDisabled.bind(this)"
[getDayNumber]="dateAdapter.getDate.bind(dateAdapter)"
(selectDay)="selectDate($event)"
(mouseEnter)="onMouseEnter($event, $any(null))"
></qeydar-days-grid>
<qeydar-months-grid
[viewMode]="viewMode"
[monthListNum]="monthListNum"
[monthTemplate]="$any(monthTemplate)"
[isActiveMonthNumber]="isActiveMonthNumber.bind(this)"
[isMonthDisabled]="isMonthDisabled.bind(this)"
[getMonthName]="getMonthName.bind(this)"
(selectMonth)="selectMonth($event,false)"
></qeydar-months-grid>
<qeydar-years-grid
[viewMode]="viewMode"
[mode]="mode"
[yearList]="yearList"
[yearTemplate]="$any(yearTemplate)"
[isActiveYear]="isActiveYearNumber.bind(this)"
[isYearDisabled]="isYearDisabled.bind(this)"
(selectYear)="selectYear($event)"
></qeydar-years-grid>
</div>
<!-- Time Picker Integration -->
<div *ngIf="showTimePicker" class="time-picker-section">
<qeydar-time-picker
#timePicker
[rtl]="rtl"
[dateAdapter]="dateAdapter"
[valueType]="'date'"
[displayFormat]="timeDisplayFormat"
[inline]="true"
[disabledTimesFilter]="disabledTimesFilter"
[cssClass]="'embedded-time-picker'"
[selectedDate]="selectedDate"
(timeChange)="onTimeChange($event)"
></qeydar-time-picker>
</div>
</div>
<qeydar-calendar-footer
*ngIf="footerDescription || showTimePicker || showToday"
[footerDescription]="footerDescription"
[showTimePicker]="showTimePicker"
[showToday]="showToday"
[okLabel]="lang.ok"
[todayLabel]="lang.today"
(okClick)="onOkClick()"
(todayClick)="onTodayClick()"
></qeydar-calendar-footer>
</div>
`, isInline: true, styles: [":root{--dp-color-bg: #fff;--dp-color-surface: #fff;--dp-color-text: #555;--dp-color-muted: #8a8a8a;--dp-color-border: #e5e5e5;--dp-color-primary: #bfeaff;--dp-color-primary-contrast: #fff;--dp-color-primary-text: #0175e0;--dp-color-primary-button: #1890ff;--dp-color-primary-week: #18396cb0;--dp-color-accent: #ff4081;--dp-color-danger: #d32f2f;--dp-color-success: #2e7d32;--dp-color-warning: #f9a825;--dp-color-hover: #e6f7ff;--dp-spacing-0: 0;--dp-spacing-1: 4px;--dp-spacing-2: 8px;--dp-spacing-3: 12px;--dp-spacing-4: 16px;--dp-spacing-5: 20px;--dp-spacing-6: 24px;--dp-spacing-7: 28px;--dp-spacing-8: 32px;--dp-radius-0: 0;--dp-radius-1: 4px;--dp-radius-2: 6px;--dp-radius-3: 8px;--dp-font-size-xs: 11px;--dp-font-size-sm: 12px;--dp-font-size-md: 14px;--dp-font-size-lg: 16px}.u-hidden{display:none!important}.u-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.u-text-muted{color:var(--dp-color-muted)}.u-text-center{text-align:center}.u-w-100{width:100%}.u-h-100{height:100%}.qeydar-calendar-nav-left:before,.qeydar-calendar-nav-right:before{position:relative;content:\"\";display:inline-block;height:6px;width:6px;vertical-align:baseline;border-style:solid;border-color:var(--dp-color-text);border-width:2px 2px 0 0}.qeydar-calendar-nav-left:before{transform:rotate(-135deg)!important}.qeydar-calendar-nav-right:before{transform:rotate(45deg)}button:disabled{opacity:.5;cursor:not-allowed}[tabindex=\"-1\"]:focus{outline:none!important}.rtl{direction:rtl}.rtl .arrow{rotate:180deg}.rtl .qeydar-calendar-nav-left:before{transform:rotate(45deg)!important}.rtl .qeydar-calendar-nav-right:before{transform:rotate(-135deg)}.rtl .calendar{direction:rtl}[dir=rtl] .arrow{rotate:180deg}.time-picker-section{border-inline-start:1px solid var(--dp-color-border)}.readOnly{pointer-events:none}.date-picker-popup{background:var(--dp-color-surface);color:var(--dp-color-text)}.date-picker-content{display:flex}.calendar{flex:1 1 auto}.date-picker-footer{border-top:1px solid var(--dp-color-border)}.period-selector,.side-selector{overflow-y:auto;-webkit-overflow-scrolling:touch}qeydar-date-picker-popup *{font-family:inherit;font-weight:400;box-sizing:border-box;padding:0;margin:0}qeydar-date-picker-popup.up .date-picker-popup{bottom:100%;margin-bottom:5px}qeydar-date-picker-popup.down .date-picker-popup{top:100%;margin-top:5px}qeydar-date-picker-popup .date-picker-popup{display:flex;flex-direction:column;border-radius:4px;box-shadow:0 2px 10px #0000001a;overflow:hidden;z-index:1000;width:fit-content;border:1px solid var(--dp-color-border);background:var(--dp-color-surface)}qeydar-date-picker-popup .date-picker-content{display:flex;flex-direction:row;max-height:295px}qeydar-date-picker-popup .date-picker-footer{padding:10px;display:flex;flex-direction:column;justify-content:space-between}qeydar-date-picker-popup .calendar{padding:10px 15px 15px;flex-grow:1;background:var(--dp-color-surface);width:280px;max-width:280px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: TimePickerComponent, selector: "qeydar-time-picker", inputs: ["placeholder", "rtl", "placement", "minTime", "maxTime", "lang", "valueType", "cssClass", "showIcon", "dateAdapter", "inline", "disableInputMask", "disabled", "disabledTimesFilter", "allowEmpty", "readOnly", "readOnlyInput", "displayFormat", "selectedDate"], outputs: ["timeChange", "openChange"] }, { kind: "component", type: CalendarHeaderComponent, selector: "qeydar-calendar-header", inputs: ["mode", "currentMonthName", "currentYear", "prevDisabled", "nextDisabled"], outputs: ["prev", "next", "showMonths", "showYears"] }, { kind: "component", type: CalendarSidebarComponent, selector: "qeydar-calendar-sidebar", inputs: ["showSidebar", "isRange", "viewMode", "periods", "monthListNum", "yearList", "yearRanges", "isActivePeriod", "getMonthName", "isActiveMonth", "isMonthDisabled", "isActiveYear", "isYearDisabled", "isActiveYearRange", "isYearRangeDisabled"], outputs: ["selectPeriod", "selectMonth", "selectYear", "selectYearRange"] }, { kind: "component", type: DaysGridComponent, selector: "qeydar-days-grid", inputs: ["viewMode", "days", "weekDays", "currentDate", "dayTemplate", "isSameMonth", "isSelected", "isInRange", "isRangeStart", "isRangeEnd", "isToday", "isDateDisabled", "getDayNumber"], outputs: ["selectDay", "mouseEnter"] }, { kind: "component", type: MonthsGridComponent, selector: "qeydar-months-grid", inputs: ["viewMode", "monthListNum", "monthTemplate", "isActiveMonthNumber", "isMonthDisabled", "getMonthName"], outputs: ["selectMonth"] }, { kind: "component", type: YearsGridComponent, selector: "qeydar-years-grid", inputs: ["viewMode", "mode", "yearList", "yearTemplate", "isActiveYear", "isYearDisabled"], outputs: ["selectYear"] }, { kind: "component", type: CalendarFooterComponent, selector: "qeydar-calendar-footer", inputs: ["footerDescription", "showTimePicker", "showToday", "okLabel", "todayLabel"], outputs: ["todayClick", "okClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DatePickerPopupComponent, decorators: [{
type: Component,
args: [{ selector: 'qeydar-date-picker-popup', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
class: 'qeydar-date-picker-popup'
}, imports: [
NgIf,
TimePickerComponent,
CalendarHeaderComponent,
CalendarSidebarComponent,
DaysGridComponent,
MonthsGridComponent,
YearsGridComponent,
CalendarFooterComponent
], template: `
<div class="date-picker-popup" [class.rtl]="rtl" [class]="cssClass" [class.readOnly]="readOnly" tabindex="-1">
<div class="date-picker-content">
<qeydar-calendar-sidebar
*ngIf="showSidebar"
[showSidebar]="showSidebar"
[isRange]="isRange"
[viewMode]="viewMode"
[periods]="periods"
[monthListNum]="monthListNum"
[yearList]="yearList"
[yearRanges]="yearRanges"
[isActivePeriod]="isActivePeriod.bind(this)"
[getMonthName]="getMonthName.bind(this)"
[isActiveMonth]="isActiveMonth.bind(this)"
[isMonthDisabled]="isMonthDisabled.bind(this)"
[isActiveYear]="isActiveYear.bind(this)"
[isYearDisabled]="isYearDisabled.bind(this)"
[isActiveYearRange]="isActiveYearRange.bind(this)"
[isYearRangeDisabled]="isYearRangeDisabled.bind(this)"
(selectPeriod)="selectPeriod($event)"
(selectMonth)="selectMonth($event, false)"
(selectYear)="selectYear($event, true)"
(selectYearRange)="selectYearRange($event)"
></qeydar-calendar-sidebar>
<div class="calendar">
<qeydar-calendar-header
[mode]="mode"
[currentMonthName]="getCurrentMonthName()"
[currentYear]="getCurrentYear()"
[prevDisabled]="isPrevMonthDisabled()"
[nextDisabled]="isNextMonthDisabled()"
(prev)="goPrev()"
(next)="goNext()"
(showMonths)="showMonthSelector()"
(showYears)="showYearSelector()"
></qeydar-calendar-header>
<qeydar-days-grid
[viewMode]="viewMode"
[days]="days"
[weekDays]="getWeekDays()"
[currentDate]="currentDate"
[dayTemplate]="$any(dayTemplate)"
[isSameMonth]="isSameMonth.bind(this)"
[isSelected]="isSelected.bind(this)"
[isInRange]="isInRange.bind(this)"
[isRangeStart]="isRangeStart.bind(this)"
[isRangeEnd]="isRangeEnd.bind(this)"
[isToday]="isToday.bind(this)"
[isDateDisabled]="isDateDisabled.bind(this)"
[getDayNumber]="dateAdapter.getDate.bind(dateAdapter)"
(selectDay)="selectDate($event)"
(mouseEnter)="onMouseEnter($event, $any(null))"
></qeydar-days-grid>
<qeydar-months-grid
[viewMode]="viewMode"
[monthListNum]="monthListNum"
[monthTemplate]="$any(monthTemplate)"
[isActiveMonthNumber]="isActiveMonthNumber.bind(this)"
[isMonthDisabled]="isMonthDisabled.bind(this)"
[getMonthName]="getMonthName.bind(this)"
(selectMonth)="selectMonth($event,false)"
></qeydar-months-grid>
<qeydar-years-grid
[viewMode]="viewMode"
[mode]="mode"
[yearList]="yearList"
[yearTemplate]="$any(yearTemplate)"
[isActiveYear]="isActiveYearNumber.bind(this)"
[isYearDisabled]="isYearDisabled.bind(this)"
(selectYear)="selectYear($event)"
></qeydar-years-grid>
</div>
<!-- Time Picker Integration -->
<div *ngIf="showTimePicker" class="time-picker-section">
<qeydar-time-picker
#timePicker
[rtl]="rtl"
[dateAdapter]="dateAdapter"
[valueType]="'date'"
[displayFormat]="timeDisplayFormat"
[inline]="true"
[disabledTimesFilter]="disabledTimesFilter"
[cssClass]="'embedded-time-picker'"
[selectedDate]="selectedDate"
(timeChange)="onTimeChange($event)"
></qeydar-time-picker>
</div>
</div>
<qeydar-calendar-footer
*ngIf="footerDescription || showTimePicker || showToday"
[footerDescription]="footerDescription"
[showTimePicker]="showTimePicker"
[showToday]="showToday"
[okLabel]="lang.ok"
[todayLabel]="lang.today"
(okClick)="onOkClick()"
(todayClick)="onTodayClick()"
></qeydar-calendar-footer>
</div>
`, styles: [":root{--dp-color-bg: #fff;--dp-color-surface: #fff;--dp-color-text: #555;--dp-color-muted: #8a8a8a;--dp-color-border: #e5e5e5;--dp-color-primary: #bfeaff;--dp-color-primary-contrast: #fff;--dp-color-primary-text: #0175e0;--dp-color-primary-button: #1890ff;--dp-color-primary-week: #18396cb0;--dp-color-accent: #ff4081;--dp-color-danger: #d32f2f;--dp-color-success: #2e7d32;--dp-color-warning: #f9a825;--dp-color-hover: #e6f7ff;--dp-spacing-0: 0;--dp-spacing-1: 4px;--dp-spacing-2: 8px;--dp-spacing-3: 12px;--dp-spacing-4: 16px;--dp-spacing-5: 20px;--dp-spacing-6: 24px;--dp-spacing-7: 28px;--dp-spacing-8: 32px;--dp-radius-0: 0;--dp-radius-1: 4px;--dp-radius-2: 6px;--dp-radius-3: 8px;--dp-font-size-xs: 11px;--dp-font-size-sm: 12px;--dp-font-size-md: 14px;--dp-font-size-lg: 16px}.u-hidden{display:none!important}.u-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.u-text-muted{color:var(--dp-color-muted)}.u-text-center{text-align:center}.u-w-100{width:100%}.u-h-100{height:100%}.qeydar-calendar-nav-left:before,.qeydar-calendar-nav-right:before{position:relative;content:\"\";display:inline-block;height:6px;width:6px;vertical-align:baseline;border-style:solid;border-color:var(--dp-color-text);border-width:2px 2px 0 0}.qeydar-calendar-nav-left:before{transform:rotate(-135deg)!important}.qeydar-calendar-nav-right:before{transform:rotate(45deg)}button:disabled{opacity:.5;cursor:not-allowed}[tabindex=\"-1\"]:focus{outline:none!important}.rtl{direction:rtl}.rtl .arrow{rotate:180deg}.rtl .qeydar-calendar-nav-left:before{transform:rotate(45deg)!important}.rtl .qeydar-calendar-nav-right:before{transform:rotate(-135deg)}.rtl .calendar{direction:rtl}[dir=rtl] .arrow{rotate:180deg}.time-picker-section{border-inline-start:1px solid var(--dp-color-border)}.readOnly{pointer-events:none}.date-picker-popup{background:var(--dp-color-surface);color:var(--dp-color-text)}.date-picker-content{display:flex}.calendar{flex:1 1 auto}.date-picker-footer{border-top:1px solid var(--dp-color-border)}.period-selector,.side-selector{overflow-y:auto;-webkit-overflow-scrolling:touch}qeydar-date-picker-popup *{font-family:inherit;font-weight:400;box-sizing:border-box;padding:0;margin:0}qeydar-date-picker-popup.up .date-picker-popup{bottom:100%;margin-bottom:5px}qeydar-date-picker-popup.down .date-picker-popup{top:100%;margin-top:5px}qeydar-date-picker-popup .date-picker-popup{display:flex;flex-direction:column;border-radius:4px;box-shadow:0 2px 10px #0000001a;overflow:hidden;z-index:1000;width:fit-content;border:1px solid var(--dp-color-border);background:var(--dp-color-surface)}qeydar-date-picker-popup .date-picker-content{display:flex;flex-direction:row;max-height:295px}qeydar-date-picker-popup .date-picker-footer{padding:10px;display:flex;flex-direction:column;justify-content:space-between}qeydar-date-picker-popup .calendar{padding:10px 15px 15px;flex-grow:1;background:var(--dp-color-surface);width:280px;max-width:280px}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.QeydarDatePickerService }, { type: i2.JalaliDateAdapter }, { type: i2.GregorianDateAdapter }, { type: i1.DestroyService }, { type: i3.CalendarUtilsService }, { type: i4.ValidationStrategyService }, { type: i5.SelectionStrategyService }]; }, propDecorators: { rtl: [{
type: Input
}], selectedDate: [{
type: Input
}], selectedStartDate: [{
type: Input
}], selectedEndDate: [{
type: Input
}], mode: [{
type: Input
}], isRange: [{
type: Input
}], customLabels: [{
type: Input
}], minDate: [{
type: Input
}], maxDate: [{
type: Input
}], cssClass: [{
type: Input
}], footerDescription: [{
type: Input
}], activeInput: [{
type: Input
}], showSidebar: [{
type: Input
}], showToday: [{
type: Input
}], showTimePicker: [{
type: Input
}], timeDisplayFormat: [{
type: Input
}], dateFormat: [{
type: Input
}], readOnly: [{
type: Input
}], disabledDates: [{
type: Input
}], disabledDatesFilter: [{
type: Input
}], disabledTimesFilter: [{
type: Input
}], templates: [{
type: Input
}], dateAdapter: [{
type: Input
}], dateSelected: [{
type: Output
}], dateRangeSelected: [{
type: Output
}], closePicker: [{
type: Output
}], clickInside: [{
type: Output
}], sidebar: [{
type: ViewChild,
args: [CalendarSidebarComponent]
}], timePicker: [{
type: ViewChild,
args: [TimePickerComponent]
}], onClickInside: [{
type: HostListener,
args: ['click']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXItcG9wdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcWV5ZGFyLWRhdGVwaWNrZXIvc3JjL2RhdGUtcGlja2VyLXBvcHVwL2RhdGUtcGlja2VyLXBvcHVwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFnRCxTQUFTLEVBQW9DLFlBQVksRUFBYSx1QkFBdUIsRUFBMEIsaUJBQWlCLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFLdlEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDakYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDbkYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7Ozs7Ozs7QUFrSWpGLE1BQU0sT0FBTyx3QkFBd0I7SUE4RG5DLFlBQ1MsRUFBYyxFQUNkLEdBQXNCLEVBQ3RCLFNBQWtDLEVBQ2xDLE1BQXlCLEVBQ3pCLFNBQStCLEVBQy9CLFFBQXdCLEVBQ3ZCLGFBQW1DLEVBQ25DLGtCQUE2QyxFQUM3QyxpQkFBMkM7UUFSNUMsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLFFBQUcsR0FBSCxH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