UNPKG

@qeydar/datepicker

Version:

A comprehensive Date and Time Picker for Angular with Jalali calendar support

825 lines (817 loc) 112 kB
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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