UNPKG

ng-devui

Version:

DevUI components based on Angular

448 lines 94.4 kB
import { CdkVirtualScrollViewport, ScrollDispatcher } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, ViewChild } from '@angular/core'; import { I18nService } from 'ng-devui/i18n'; import { Subject } from 'rxjs'; import { debounceTime, filter, takeUntil } from 'rxjs/operators'; import { DatepickerProCommonDataService, DatepickerProService } from '../datepicker-pro.service'; import * as i0 from "@angular/core"; import * as i1 from "ng-devui/i18n"; import * as i2 from "../datepicker-pro.service"; import * as i3 from "@angular/cdk/scrolling"; import * as i4 from "@angular/common"; import * as i5 from "ng-devui/popover"; const DAY_DURATION = 24 * 60 * 60 * 1000; const HOUR_DURATION = 60 * 60 * 1000; export class CalendarPanelComponent { get curHoverDate() { return this.pickerSrv.curHoverDate; } set curHoverDate(value) { this.pickerSrv.curHoverDate = value; this.cdr.detectChanges(); } get curDate() { if (this.isRangeType) { if (this.pickerSrv.currentActiveInput === 'start') { return this.pickerSrv.curRangeDate[0]; } else if (this.pickerSrv.currentActiveInput === 'end') { return this.pickerSrv.curRangeDate[1]; } } else { return this.pickerSrv.curDate; } } set curDate(value) { if (this.isRangeType) { if (this.pickerSrv.currentActiveInput === 'start') { this.pickerSrv.curRangeDate[0] = value; } else if (this.pickerSrv.currentActiveInput === 'end') { if (this.pickerSrv.showTime) { this.pickerSrv.curRangeDate[1] = (this.pickerSrv.curRangeDate[1] && this.pickerSrv.curRangeDate[1].toDateString() === value.toDateString()) ? value : new Date(value.setHours(23, 59, 59)); } else { this.pickerSrv.curRangeDate[1] = new Date(value.setHours(23, 59, 59)); } } } else { this.pickerSrv.curDate = value; } } get selectedRangeDate() { return this.pickerSrv.curRangeDate; } set selectedRangeDate(dateList) { this.pickerSrv.curRangeDate = dateList; } get markDateTemplate() { return this.pickerSrv.markDateInfoTemplate; } constructor(i18n, pickerSrv, dataSrv, cdr, scrollDispatcher) { this.i18n = i18n; this.pickerSrv = pickerSrv; this.dataSrv = dataSrv; this.cdr = cdr; this.scrollDispatcher = scrollDispatcher; this.isWeekSelect = false; this.currentBodyIndex = 0; this.calendarItemSize = 186; // 一个月份日历的高度 this.unsubscribe$ = new Subject(); this.allMonthList = []; this.yearAndMonthList = []; this.isListCollopse = false; this.weekHoverRange = []; this.isSummerTimeZone = false; } setI18nText() { this.i18nText = this.i18n.getI18nText().datePickerPro; this.i18nSubscription = this.i18n.langChange().pipe(takeUntil(this.unsubscribe$)).subscribe((data) => { this.i18nText = data.datePickerPro; this.cdr.detectChanges(); }); } ngOnInit() { this.setI18nText(); this.today = new Date(); this.isSummerTimeZone = this.judgeIsSummerTimeZone(); this.initDataList(); this.initObservable(); } // 判断当前时区是否需要夏令时变换 judgeIsSummerTimeZone() { const Jan1 = new Date(2023, 0); const Jul1 = new Date(2023, 6); // 两个日期之间在非夏令时地区相差181天整 if ((Jul1.getTime() - Jan1.getTime()) / DAY_DURATION !== 181) { return true; } ; return false; } initObservable() { this.pickerSrv.toggleEvent.pipe(takeUntil(this.unsubscribe$)).subscribe(isOpen => { if (isOpen) { setTimeout(() => { this.scrollBodyCmp.checkViewportSize(); this.scrollListCmp.checkViewportSize(); this.goToDate(this.curDate || new Date(), 'auto'); }); // 首次展开添加滚动监听 if (!this.scrollListener) { this.initScrollListener(); } } else { this.curHoverDate = null; } }); this.pickerSrv.updateDateValue.pipe(takeUntil(this.unsubscribe$)).subscribe(res => { if (this.isRangeType) { this.updateRangeDate(res.value); } else { this.updateSingleDate(res.value); } }); this.pickerSrv.detectedChanges.pipe(takeUntil(this.unsubscribe$)).subscribe(() => { this.cdr.detectChanges(); }); this.pickerSrv.activeInputChange.pipe(takeUntil(this.unsubscribe$)).subscribe(type => { if (type === 'start') { this.goToDate(this.selectedRangeDate[0] || this.selectedRangeDate[1] || new Date()); } else { if (!this.selectedRangeDate[1] && this.selectedRangeDate[0]) { this.updateRangeDate([ this.selectedRangeDate[0], new Date(new Date(this.selectedRangeDate[0].getTime()).setHours(23, 59, 59)) ]); } this.goToDate(this.selectedRangeDate[1] || this.selectedRangeDate[0] || new Date()); } }); } initScrollListener() { this.scrollDispatcher.scrolled().pipe(takeUntil(this.unsubscribe$), filter((res) => { return res && res.getElementRef().nativeElement.classList.contains('devui-tbody-wrapper'); }), debounceTime(50)).subscribe(() => { const offsetY = this.scrollBodyCmp.measureScrollOffset(); // 当滚动超过一个月面板的一半时,就更新月份 this.currentBodyIndex = Math.floor(offsetY / this.calendarItemSize) + (offsetY % this.calendarItemSize > 100 ? 1 : 0); const listIndex = this.isListCollopse ? Math.floor(this.currentBodyIndex / 12) : this.currentBodyIndex + Math.floor(this.currentBodyIndex / 12) + 1; this.goToListByIndex(listIndex); this.cdr.detectChanges(); }); } initDataList() { const key = `${this.pickerSrv.calendarRange.join('-')}-${this.pickerSrv.minDate.toDateString() + this.pickerSrv.maxDate.toDateString()}`; if (this.dataSrv.calendarDataCache[key]) { this.yearAndMonthList = this.dataSrv.calendarDataCache[key].yearAndMonthList; this.allMonthList = this.dataSrv.calendarDataCache[key].allMonthList; return; } this.yearAndMonthList = []; this.allMonthList = []; for (let yearIndex = this.pickerSrv.calendarRange[0]; yearIndex <= this.pickerSrv.calendarRange[1]; yearIndex++) { this.yearAndMonthList.push({ year: yearIndex, isMonth: false, active: false }); for (let monthIndex = 0; monthIndex < 12; monthIndex++) { this.allMonthList.push({ year: yearIndex, month: monthIndex, displayWeeks: this.getDisplayWeeks(yearIndex, monthIndex) }); this.yearAndMonthList.push({ year: yearIndex, month: monthIndex, isMonth: true, active: false }); } } this.dataSrv.calendarDataCache[key] = { yearAndMonthList: this.yearAndMonthList, allMonthList: this.allMonthList }; } getDisplayWeeks(yearIndex, monthIndex) { const firstDayOfMonth = new Date(yearIndex, monthIndex, 1); const weekOfDay = firstDayOfMonth.getDay(); const startDate = new Date(firstDayOfMonth.getTime() - weekOfDay * DAY_DURATION); const displayWeeks = []; for (let i = 0; i < 6; i++) { const startWeekDate = startDate.getTime() + i * 7 * DAY_DURATION; const weekDays = new Array(7).fill(0).map((value, index) => { let currentDate = new Date(startWeekDate + index * DAY_DURATION); // 夏令时区检测出错误的冬令时时间,加快一小时 if (this.isSummerTimeZone && currentDate.getHours() === 23) { currentDate = new Date(startWeekDate + index * DAY_DURATION + HOUR_DURATION); } return { day: this.fillLeft(currentDate.getDate()), date: currentDate, inMonth: currentDate.getMonth().toString() === monthIndex.toString(), isToday: currentDate.toDateString() === this.today.toDateString() }; }); displayWeeks.push(weekDays); } return displayWeeks; } goToDate(date, scrollBehavior) { const indexObj = this.getCurrentIndex(date); const scroll = scrollBehavior || (Math.abs(indexObj.bodyIndex - this.currentBodyIndex) > 18 ? 'auto' : 'smooth'); this.currentBodyIndex = indexObj.bodyIndex; this.scrollBodyCmp.scrollToIndex(indexObj.bodyIndex, scroll); this.goToListByIndex(indexObj.listIndex); this.cdr.detectChanges(); } goToListByIndex(index) { const indexDelta = Math.abs(this.scrollListCmp.measureScrollOffset() / 30 - index); this.scrollListCmp.scrollToIndex(index - 4, indexDelta < 12 ? 'smooth' : 'auto'); this.updateListActive(index); } selectMonth(year, month) { const date = new Date(year, month, 1); const curYear = this.yearAndMonthList.find(t => t.active)?.year || this.curDate.getFullYear(); // 太远的虚拟滚动会导致白屏,所以超过两年的滚动都直接跳转 const isSmoothAnimation = Math.abs(curYear - year) < 2; if (this.isListCollopse) { this.toggleListCollopse(date); } else { this.goToDate(date, isSmoothAnimation ? 'smooth' : 'auto'); } } updateRangeDate(dateList) { if (!dateList) { this.selectedRangeDate = []; this.cdr.detectChanges(); return; } const curDate = (this.pickerSrv.currentActiveInput === 'start' ? (dateList[0] || dateList[1]) : (dateList[1] || dateList[0])) || new Date(); const moreThanOneYear = Math.abs(curDate.getFullYear() - (this.currentBodyIndex / 12 + this.pickerSrv.calendarRange[0])) > 1; this.selectedRangeDate = dateList; this.goToDate(curDate, moreThanOneYear ? 'auto' : 'smooth'); this.cdr.detectChanges(); } updateSingleDate(date) { if (!date) { this.curDate = null; this.cdr.detectChanges(); return; } const moreThanOneYear = Math.abs(date.getFullYear() - (this.currentBodyIndex / 12 + this.pickerSrv.calendarRange[0])) > 1; this.curDate = date; this.goToDate(this.curDate, moreThanOneYear ? 'auto' : 'smooth'); this.cdr.detectChanges(); } updateListActive(index) { const curActive = this.yearAndMonthList.find(t => t.active); if (curActive) { curActive.active = false; } this.yearAndMonthList[index].active = true; } getCurrentIndex(curDate) { const year = curDate.getFullYear(); const month = curDate.getMonth(); const listIndex = this.isListCollopse ? (year - this.pickerSrv.calendarRange[0]) : (year - this.pickerSrv.calendarRange[0]) * 13 + month + 1; return { bodyIndex: (year - this.pickerSrv.calendarRange[0]) * 12 + month, listIndex }; } selectDate(day) { if (this.isDisabled(day.date) || !day.inMonth) { return; } if (this.isWeekSelect) { this.pickerSrv.curRangeDate = this.getWeekRange(day.date); this.pickerSrv.currentActiveInput = 'end'; } else { this.curDate = new Date(day.date.setHours(this.pickerSrv.curHour, this.pickerSrv.curMin, this.pickerSrv.curSec)); } if (this.isRangeType) { this.pickerSrv.fixRangeDate(); } this.cdr.detectChanges(); // 非时间模式下选完开始日期跳转到结束日期 if (this.isRangeType && !this.pickerSrv.showTime) { if (this.pickerSrv.currentActiveInput === 'start') { this.pickerSrv.currentActiveInput = 'end'; } else if (this.pickerSrv.currentActiveInput === 'end' && !this.selectedRangeDate[0]) { this.selectedRangeDate[0] = this.curDate; this.pickerSrv.currentActiveInput = 'start'; } else { this.pickerSrv.closeDropdownEvent.next(false); } } this.pickerSrv.selectedDateChange.next({ type: this.isRangeType ? 'range' : 'single', value: this.isRangeType ? this.selectedRangeDate : this.curDate }); if (this.isRangeType && this.pickerSrv.showTime) { this.pickerSrv.updateTimeChange.next({ activeInput: this.pickerSrv.currentActiveInput, hour: this.pickerSrv.curHour, min: this.pickerSrv.curMin, seconds: this.pickerSrv.curSec }); } if (this.pickerSrv.closeAfterSelected) { this.pickerSrv.closeDropdownEvent.next(false); } } isStartDate(date) { return this.pickerSrv.isStartDate(date); } isDisabled(date) { return !this.pickerSrv.dateInRange(date); } isEndDate(date) { return this.pickerSrv.isEndDate(date); } isDateInRange(date) { if (this.isWeekSelect) { return this.isInWeekHoverRange(date); } else { return this.pickerSrv.isDateInRange(date); } } isDateInSelectRange(date) { return this.pickerSrv.isDateInSelectRange(date); } isDateActive(date) { return this.pickerSrv.isDateActive(date); } isActiveTypeDate(date) { return this.pickerSrv.isActiveInputTypeDate(date); } isDateAbandon(date) { return this.pickerSrv.isDateAbandon(date); } isDateSuggest(date) { return this.pickerSrv.isInSuggestList(date); } isDateMarked(date) { return this.pickerSrv.isMarkedDate(date); } isSingleDate() { if (this.pickerSrv.currentActiveInput === 'start') { return !this.pickerSrv.curRangeDate[1]; } else if (this.pickerSrv.currentActiveInput === 'end') { return !this.pickerSrv.curRangeDate[0]; } } setHoverTarget(date, isInMonth) { if (!isInMonth) { this.curHoverDate = null; return; } this.curHoverDate = date; if (this.isWeekSelect) { this.weekHoverRange = this.getWeekRange(date); this.curWeekHoverDate = date; this.cdr.markForCheck(); return; } } getWeekRange(date) { if (!date) { return []; } const diff = date.getDay() < this.pickerSrv.startIndexOfWeek ? 7 - (this.pickerSrv.startIndexOfWeek - date.getDay()) : date.getDay() - this.pickerSrv.startIndexOfWeek; const weekStart = new Date(date.getTime() - diff * DAY_DURATION); const weekEnd = new Date(weekStart.getTime() + DAY_DURATION * 6); weekEnd.setHours(23, 59, 59); return [weekStart, weekEnd]; } isInWeekHoverRange(date) { const range = this.getWeekRange(this.curWeekHoverDate); const time = date.getTime(); const timeStr = date.toDateString(); if (this.pickerSrv.isDateActive(date)) { return false; } return ((range[0]?.getTime() < time && time < range[1]?.getTime()) || (range[0]?.toDateString() === timeStr || timeStr === range[1]?.toDateString())); } toggleListCollopse(toDate) { const activeItem = this.yearAndMonthList.find(t => t.active); const curYear = activeItem?.year; const curMonth = activeItem?.month; this.isListCollopse = !this.isListCollopse; if (this.isListCollopse) { this.yearAndMonthList = this.yearAndMonthList.filter(t => !t.isMonth); } else { this.initDataList(); } setTimeout(() => { this.goToDate(toDate || new Date(curYear, curMonth || 0, 1), 'auto'); }); } fillLeft(num) { return num < 10 ? `0${num}` : `${num}`; } ngOnDestroy() { this.unsubscribe$.next(); this.unsubscribe$.complete(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CalendarPanelComponent, deps: [{ token: i1.I18nService }, { token: i2.DatepickerProService }, { token: i2.DatepickerProCommonDataService }, { token: i0.ChangeDetectorRef }, { token: i3.ScrollDispatcher }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CalendarPanelComponent, selector: "d-calendar-panel", inputs: { isRangeType: "isRangeType", isWeekSelect: "isWeekSelect" }, viewQueries: [{ propertyName: "scrollBodyCmp", first: true, predicate: ["scrollBody"], descendants: true }, { propertyName: "scrollListCmp", first: true, predicate: ["scrollList"], descendants: true }], ngImport: i0, template: "<div class=\"devui-canlender-panel\">\n <cdk-virtual-scroll-viewport #scrollList [itemSize]=\"30\" class=\"devui-canlender-panel-year-list\" minBufferPx=\"400\" maxBufferPx=\"600\">\n <div\n class=\"devui-canlender-panel-year-list-item\"\n [ngClass]=\"{ 'title-active': item.active }\"\n *cdkVirtualFor=\"let item of yearAndMonthList; let index = index\"\n >\n <p class=\"devui-year-title\" *ngIf=\"!item.isMonth && !isListCollopse\" (click)=\"toggleListCollopse()\">{{ item.year }}</p>\n <p class=\"devui-year-title\" *ngIf=\"!item.isMonth && isListCollopse\" (click)=\"selectMonth(item.year, 0)\">{{ item.year }}</p>\n <p class=\"devui-month-title\" *ngIf=\"item.isMonth\" (click)=\"selectMonth(item.year, item.month)\">\n {{ i18nText.monthsOfYear[item.month] }}\n </p>\n </div>\n </cdk-virtual-scroll-viewport>\n\n <div class=\"devui-canlender-panel-main\">\n <table class=\"devui-table\">\n <thead>\n <tr class=\"small text-center devui-week-header\">\n <td *ngFor=\"let item of i18nText?.daysOfWeek\">{{ item }}</td>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td colspan=\"7\">\n <cdk-virtual-scroll-viewport\n #scrollBody\n [itemSize]=\"calendarItemSize\"\n class=\"devui-tbody-wrapper\"\n minBufferPx=\"400\"\n maxBufferPx=\"600\"\n >\n <div *cdkVirtualFor=\"let month of allMonthList; let index = index\">\n <p class=\"devui-table-month-title\">{{ i18nText?.getYearMonthStr(month.year, month.month + 1) }}</p>\n <table\n class=\"devui-month-table\"\n [ngClass]=\"{\n 'devui-single-date': isSingleDate()\n }\"\n (mouseleave)=\"curHoverDate = null; curWeekHoverDate = null\"\n >\n <tbody>\n <tr class=\"small text-center devui-week-header\" *ngFor=\"let week of month.displayWeeks\">\n <td\n [ngClass]=\"{\n 'devui-table-date': day.inMonth,\n 'devui-table-date-selected': isDateActive(day.date),\n 'devui-table-date-abandon-selected': isDateAbandon(day.date),\n 'devui-table-date-today': day.isToday,\n 'devui-table-date-disable': isDisabled(day.date),\n 'devui-table-date-inrange': isDateInRange(day.date),\n 'devui-table-date-start': isStartDate(day.date),\n 'devui-table-date-end': isEndDate(day.date),\n 'devui-table-date-in-selected-range': isDateInSelectRange(day.date),\n 'devui-table-date-active-type': isActiveTypeDate(day.date),\n 'devui-table-date-suggested': isDateSuggest(day.date),\n 'devui-table-date-marked': isDateMarked(day.date)\n }\"\n *ngFor=\"let day of week\"\n dPopover\n [content]=\"markDate\"\n [visible]=\"isDateMarked(day.date) && curHoverDate === day.date && !!markDateTemplate\"\n (click)=\"selectDate(day)\"\n (mouseenter)=\"setHoverTarget(day.date, day.inMonth)\"\n >\n <span>{{ day.inMonth ? day.day : '' }}</span>\n <ng-template #markDate>\n <ng-template [ngTemplateOutlet]=\"markDateTemplate\" [ngTemplateOutletContext]=\"{ date: day.date }\"></ng-template>\n </ng-template>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </cdk-virtual-scroll-viewport>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n</div>\n", styles: [".devui-canlender-panel{text-align:center;font-size:0}.devui-canlender-panel-collopse-button{position:absolute;top:0;left:60px;font-size:16px;z-index:10;cursor:pointer;color:var(--devui-aide-text, #595959)}.devui-canlender-panel-year-list{padding:8px 0;display:inline-block;width:80px;height:305px;overflow:auto;-ms-overflow-style:none}.devui-canlender-panel-year-list::-webkit-scrollbar{width:0!important}.devui-canlender-panel-year-list-item{background-color:var(--devui-global-bg, #f5f5f5)}.devui-canlender-panel-year-list-item .devui-year-title{font-size:14px;font-weight:700;line-height:30px;cursor:pointer}.devui-canlender-panel-year-list-item .devui-month-title{font-size:12px;line-height:30px;cursor:pointer}.devui-canlender-panel-year-list-item.title-active{background-color:var(--devui-base-bg, #ffffff)}.devui-canlender-panel-year-list-item:hover:not(.title-active){background-color:var(--devui-list-item-selected-bg, #cedefd)}.devui-canlender-panel-main{width:249px;height:305px;padding:4px;display:inline-block;font-size:12px}.devui-tbody-wrapper{height:270px;width:100%;overflow-x:hidden;-ms-overflow-style:none}.devui-tbody-wrapper::-webkit-scrollbar{width:0!important}.devui-table{border-spacing:0}.devui-table .devui-week-header td{width:34px;height:22px}.devui-table .devui-table-month-title{text-align:start;line-height:26px;color:var(--devui-aide-text, #595959);padding-left:8px}.devui-table .devui-month-table{color:var(--devui-text, #191919);border-spacing:0 4px;border-collapse:separate}.devui-table .devui-month-table .devui-table-date{padding:0 4px;width:30px}.devui-table .devui-month-table .devui-table-date span{cursor:pointer;display:block;width:22px;height:22px;line-height:22px;border-radius:var(--devui-border-radius-feedback, 4px)}.devui-table .devui-month-table .devui-table-date:not(.devui-table-date-disable):not(.devui-table-date-selected):hover span{background-color:var(--devui-list-item-hover-bg, #f2f2f3)}.devui-table .devui-month-table .devui-table-date.devui-table-date-today span{color:var(--devui-info, #0a59f7)}.devui-table .devui-month-table .devui-table-date.devui-table-date-selected{position:relative}.devui-table .devui-month-table .devui-table-date.devui-table-date-selected span{background:var(--devui-list-item-active-bg, #cedefd);color:var(--devui-list-item-active-text, #000000)}.devui-table .devui-month-table .devui-table-date.devui-table-date-selected span:hover{box-shadow:none;border-color:transparent}.devui-table .devui-month-table .devui-table-date.devui-table-date-selected.devui-table-date-abandon-selected span{background:var(--devui-primary-disabled, #9dbdfc)}.devui-table .devui-month-table .devui-table-date.devui-table-date-selected.devui-table-date-active-type:not(.devui-table-date-abandon-selected) span{animation:2s ease 0s infinite normal both breath-animation;position:absolute;top:0;right:7px;z-index:2}.devui-table .devui-month-table .devui-table-date.devui-table-date-selected.devui-table-date-active-type.devui-table-date-end:not(.devui-table-date-abandon-selected) span{right:8px}@keyframes breath-animation{0%{box-shadow:0 0 0 var(--devui-list-item-active-bg, #cedefd)}50%{box-shadow:0 0 8px var(--devui-list-item-active-bg, #cedefd)}to{box-shadow:0 0 0 var(--devui-list-item-active-bg, #cedefd)}}.devui-table .devui-month-table .devui-table-date.devui-table-date-inrange{background-color:var(--devui-list-item-hover-bg, #f2f2f3)}.devui-table .devui-month-table .devui-table-date.devui-table-date-inrange span:hover{background-color:var(--devui-range-item-hover-bg, #cedefd)}.devui-table .devui-month-table .devui-table-date.devui-table-date-start:not(.devui-table-date-end,.devui-table-date-disable){position:relative}.devui-table .devui-month-table .devui-table-date.devui-table-date-start:not(.devui-table-date-end,.devui-table-date-disable):after{content:\"\";display:block;position:absolute;width:8px;height:22px;background-color:var(--devui-list-item-hover-bg, #f2f2f3);right:0;top:0}.devui-table .devui-month-table .devui-table-date.devui-table-date-start:not(.devui-table-date-end,.devui-table-date-disable):not(:hover):not(.devui-table-date-selected):after{display:none}.devui-table .devui-month-table .devui-table-date.devui-table-date-start:not(.devui-table-date-end,.devui-table-date-disable) span{border-radius:var(--devui-border-radius-feedback, 4px) 0 0 var(--devui-border-radius-feedback, 4px)}.devui-table .devui-month-table .devui-table-date.devui-table-date-end:not(.devui-table-date-start,.devui-table-date-disable){position:relative}.devui-table .devui-month-table .devui-table-date.devui-table-date-end:not(.devui-table-date-start,.devui-table-date-disable):after{content:\"\";display:block;position:absolute;width:5px;height:22px;background-color:var(--devui-list-item-hover-bg, #f2f2f3);left:0;top:0}.devui-table .devui-month-table .devui-table-date.devui-table-date-end:not(.devui-table-date-start,.devui-table-date-disable) span{border-radius:0 var(--devui-border-radius-feedback, 4px) var(--devui-border-radius-feedback, 4px) 0}.devui-table .devui-month-table .devui-table-date.devui-table-date-in-selected-range:not(.devui-table-date-inrange):not(:hover){background-color:var(--devui-disabled-bg, #f3f3f3)}.devui-table .devui-month-table .devui-table-date.devui-table-date-disable span{cursor:not-allowed;color:var(--devui-disabled-text, #c2c2c2)}.devui-table .devui-month-table .devui-table-date.devui-table-date-disable span:hover{box-shadow:none;border-color:transparent}.devui-table .devui-month-table .devui-table-date.devui-table-date-marked span{position:relative}.devui-table .devui-month-table .devui-table-date.devui-table-date-marked span:after{content:\"\";display:block;position:absolute;right:9px;bottom:2px;width:3px;height:3px;border-radius:50%;background-color:var(--devui-list-item-active-bg, #cedefd)}.devui-table .devui-month-table .devui-table-date.devui-table-date-marked.devui-table-date-selected span:after{background-color:var(--devui-list-item-active-text, #000000)}.devui-table .devui-month-table .devui-table-date.devui-table-date-suggested{border-bottom:1px solid var(--devui-link-light-active, #9dbdfc)}.devui-table .devui-month-table.devui-single-date .devui-table-date.devui-table-date-start:after{display:none}.devui-table .devui-month-table.devui-single-date .devui-table-date.devui-table-date-end:after{display:none}.devui-table .devui-tbody-wrapper{transform:none}:host{display:inline-block}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i3.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i3.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i5.PopoverDirective, selector: "[dPopover]", inputs: ["content", "controlled", "position", "showAnimation", "showAnimate", "scrollElement", "autoHideCoefficient", "appendToBody", "zIndex", "popType", "popMaxWidth", "trigger", "hoverToContent", "hoverDelayTime", "popoverStyle", "mouseEnterDelay", "mouseLeaveDelay", "visible"], exportAs: ["dPopover"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CalendarPanelComponent, decorators: [{ type: Component, args: [{ selector: 'd-calendar-panel', preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"devui-canlender-panel\">\n <cdk-virtual-scroll-viewport #scrollList [itemSize]=\"30\" class=\"devui-canlender-panel-year-list\" minBufferPx=\"400\" maxBufferPx=\"600\">\n <div\n class=\"devui-canlender-panel-year-list-item\"\n [ngClass]=\"{ 'title-active': item.active }\"\n *cdkVirtualFor=\"let item of yearAndMonthList; let index = index\"\n >\n <p class=\"devui-year-title\" *ngIf=\"!item.isMonth && !isListCollopse\" (click)=\"toggleListCollopse()\">{{ item.year }}</p>\n <p class=\"devui-year-title\" *ngIf=\"!item.isMonth && isListCollopse\" (click)=\"selectMonth(item.year, 0)\">{{ item.year }}</p>\n <p class=\"devui-month-title\" *ngIf=\"item.isMonth\" (click)=\"selectMonth(item.year, item.month)\">\n {{ i18nText.monthsOfYear[item.month] }}\n </p>\n </div>\n </cdk-virtual-scroll-viewport>\n\n <div class=\"devui-canlender-panel-main\">\n <table class=\"devui-table\">\n <thead>\n <tr class=\"small text-center devui-week-header\">\n <td *ngFor=\"let item of i18nText?.daysOfWeek\">{{ item }}</td>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td colspan=\"7\">\n <cdk-virtual-scroll-viewport\n #scrollBody\n [itemSize]=\"calendarItemSize\"\n class=\"devui-tbody-wrapper\"\n minBufferPx=\"400\"\n maxBufferPx=\"600\"\n >\n <div *cdkVirtualFor=\"let month of allMonthList; let index = index\">\n <p class=\"devui-table-month-title\">{{ i18nText?.getYearMonthStr(month.year, month.month + 1) }}</p>\n <table\n class=\"devui-month-table\"\n [ngClass]=\"{\n 'devui-single-date': isSingleDate()\n }\"\n (mouseleave)=\"curHoverDate = null; curWeekHoverDate = null\"\n >\n <tbody>\n <tr class=\"small text-center devui-week-header\" *ngFor=\"let week of month.displayWeeks\">\n <td\n [ngClass]=\"{\n 'devui-table-date': day.inMonth,\n 'devui-table-date-selected': isDateActive(day.date),\n 'devui-table-date-abandon-selected': isDateAbandon(day.date),\n 'devui-table-date-today': day.isToday,\n 'devui-table-date-disable': isDisabled(day.date),\n 'devui-table-date-inrange': isDateInRange(day.date),\n 'devui-table-date-start': isStartDate(day.date),\n 'devui-table-date-end': isEndDate(day.date),\n 'devui-table-date-in-selected-range': isDateInSelectRange(day.date),\n 'devui-table-date-active-type': isActiveTypeDate(day.date),\n 'devui-table-date-suggested': isDateSuggest(day.date),\n 'devui-table-date-marked': isDateMarked(day.date)\n }\"\n *ngFor=\"let day of week\"\n dPopover\n [content]=\"markDate\"\n [visible]=\"isDateMarked(day.date) && curHoverDate === day.date && !!markDateTemplate\"\n (click)=\"selectDate(day)\"\n (mouseenter)=\"setHoverTarget(day.date, day.inMonth)\"\n >\n <span>{{ day.inMonth ? day.day : '' }}</span>\n <ng-template #markDate>\n <ng-template [ngTemplateOutlet]=\"markDateTemplate\" [ngTemplateOutletContext]=\"{ date: day.date }\"></ng-template>\n </ng-template>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </cdk-virtual-scroll-viewport>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n</div>\n", styles: [".devui-canlender-panel{text-align:center;font-size:0}.devui-canlender-panel-collopse-button{position:absolute;top:0;left:60px;font-size:16px;z-index:10;cursor:pointer;color:var(--devui-aide-text, #595959)}.devui-canlender-panel-year-list{padding:8px 0;display:inline-block;width:80px;height:305px;overflow:auto;-ms-overflow-style:none}.devui-canlender-panel-year-list::-webkit-scrollbar{width:0!important}.devui-canlender-panel-year-list-item{background-color:var(--devui-global-bg, #f5f5f5)}.devui-canlender-panel-year-list-item .devui-year-title{font-size:14px;font-weight:700;line-height:30px;cursor:pointer}.devui-canlender-panel-year-list-item .devui-month-title{font-size:12px;line-height:30px;cursor:pointer}.devui-canlender-panel-year-list-item.title-active{background-color:var(--devui-base-bg, #ffffff)}.devui-canlender-panel-year-list-item:hover:not(.title-active){background-color:var(--devui-list-item-selected-bg, #cedefd)}.devui-canlender-panel-main{width:249px;height:305px;padding:4px;display:inline-block;font-size:12px}.devui-tbody-wrapper{height:270px;width:100%;overflow-x:hidden;-ms-overflow-style:none}.devui-tbody-wrapper::-webkit-scrollbar{width:0!important}.devui-table{border-spacing:0}.devui-table .devui-week-header td{width:34px;height:22px}.devui-table .devui-table-month-title{text-align:start;line-height:26px;color:var(--devui-aide-text, #595959);padding-left:8px}.devui-table .devui-month-table{color:var(--devui-text, #191919);border-spacing:0 4px;border-collapse:separate}.devui-table .devui-month-table .devui-table-date{padding:0 4px;width:30px}.devui-table .devui-month-table .devui-table-date span{cursor:pointer;display:block;width:22px;height:22px;line-height:22px;border-radius:var(--devui-border-radius-feedback, 4px)}.devui-table .devui-month-table .devui-table-date:not(.devui-table-date-disable):not(.devui-table-date-selected):hover span{background-color:var(--devui-list-item-hover-bg, #f2f2f3)}.devui-table .devui-month-table .devui-table-date.devui-table-date-today span{color:var(--devui-info, #0a59f7)}.devui-table .devui-month-table .devui-table-date.devui-table-date-selected{position:relative}.devui-table .devui-month-table .devui-table-date.devui-table-date-selected span{background:var(--devui-list-item-active-bg, #cedefd);color:var(--devui-list-item-active-text, #000000)}.devui-table .devui-month-table .devui-table-date.devui-table-date-selected span:hover{box-shadow:none;border-color:transparent}.devui-table .devui-month-table .devui-table-date.devui-table-date-selected.devui-table-date-abandon-selected span{background:var(--devui-primary-disabled, #9dbdfc)}.devui-table .devui-month-table .devui-table-date.devui-table-date-selected.devui-table-date-active-type:not(.devui-table-date-abandon-selected) span{animation:2s ease 0s infinite normal both breath-animation;position:absolute;top:0;right:7px;z-index:2}.devui-table .devui-month-table .devui-table-date.devui-table-date-selected.devui-table-date-active-type.devui-table-date-end:not(.devui-table-date-abandon-selected) span{right:8px}@keyframes breath-animation{0%{box-shadow:0 0 0 var(--devui-list-item-active-bg, #cedefd)}50%{box-shadow:0 0 8px var(--devui-list-item-active-bg, #cedefd)}to{box-shadow:0 0 0 var(--devui-list-item-active-bg, #cedefd)}}.devui-table .devui-month-table .devui-table-date.devui-table-date-inrange{background-color:var(--devui-list-item-hover-bg, #f2f2f3)}.devui-table .devui-month-table .devui-table-date.devui-table-date-inrange span:hover{background-color:var(--devui-range-item-hover-bg, #cedefd)}.devui-table .devui-month-table .devui-table-date.devui-table-date-start:not(.devui-table-date-end,.devui-table-date-disable){position:relative}.devui-table .devui-month-table .devui-table-date.devui-table-date-start:not(.devui-table-date-end,.devui-table-date-disable):after{content:\"\";display:block;position:absolute;width:8px;height:22px;background-color:var(--devui-list-item-hover-bg, #f2f2f3);right:0;top:0}.devui-table .devui-month-table .devui-table-date.devui-table-date-start:not(.devui-table-date-end,.devui-table-date-disable):not(:hover):not(.devui-table-date-selected):after{display:none}.devui-table .devui-month-table .devui-table-date.devui-table-date-start:not(.devui-table-date-end,.devui-table-date-disable) span{border-radius:var(--devui-border-radius-feedback, 4px) 0 0 var(--devui-border-radius-feedback, 4px)}.devui-table .devui-month-table .devui-table-date.devui-table-date-end:not(.devui-table-date-start,.devui-table-date-disable){position:relative}.devui-table .devui-month-table .devui-table-date.devui-table-date-end:not(.devui-table-date-start,.devui-table-date-disable):after{content:\"\";display:block;position:absolute;width:5px;height:22px;background-color:var(--devui-list-item-hover-bg, #f2f2f3);left:0;top:0}.devui-table .devui-month-table .devui-table-date.devui-table-date-end:not(.devui-table-date-start,.devui-table-date-disable) span{border-radius:0 var(--devui-border-radius-feedback, 4px) var(--devui-border-radius-feedback, 4px) 0}.devui-table .devui-month-table .devui-table-date.devui-table-date-in-selected-range:not(.devui-table-date-inrange):not(:hover){background-color:var(--devui-disabled-bg, #f3f3f3)}.devui-table .devui-month-table .devui-table-date.devui-table-date-disable span{cursor:not-allowed;color:var(--devui-disabled-text, #c2c2c2)}.devui-table .devui-month-table .devui-table-date.devui-table-date-disable span:hover{box-shadow:none;border-color:transparent}.devui-table .devui-month-table .devui-table-date.devui-table-date-marked span{position:relative}.devui-table .devui-month-table .devui-table-date.devui-table-date-marked span:after{content:\"\";display:block;position:absolute;right:9px;bottom:2px;width:3px;height:3px;border-radius:50%;background-color:var(--devui-list-item-active-bg, #cedefd)}.devui-table .devui-month-table .devui-table-date.devui-table-date-marked.devui-table-date-selected span:after{background-color:var(--devui-list-item-active-text, #000000)}.devui-table .devui-month-table .devui-table-date.devui-table-date-suggested{border-bottom:1px solid var(--devui-link-light-active, #9dbdfc)}.devui-table .devui-month-table.devui-single-date .devui-table-date.devui-table-date-start:after{display:none}.devui-table .devui-month-table.devui-single-date .devui-table-date.devui-table-date-end:after{display:none}.devui-table .devui-tbody-wrapper{transform:none}:host{display:inline-block}\n"] }] }], ctorParameters: () => [{ type: i1.I18nService }, { type: i2.DatepickerProService }, { type: i2.DatepickerProCommonDataService }, { type: i0.ChangeDetectorRef }, { type: i3.ScrollDispatcher }], propDecorators: { scrollBodyCmp: [{ type: ViewChild, args: ['scrollBody'] }], scrollListCmp: [{ type: ViewChild, args: ['scrollList'] }], isRangeType: [{ type: Input }], isWeekSelect: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vZGV2dWkvZGF0ZXBpY2tlci1wcm8vbGliL2NhbGVuZGFyLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL2RldnVpL2RhdGVwaWNrZXItcHJvL2xpYi9jYWxlbmRhci1wYW5lbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLHdCQUF3QixFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbkcsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUFFLEtBQUssRUFBcUIsU0FBUyxFQUMvQyxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWlCLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7OztBQUdqRyxNQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDekMsTUFBTSxhQUFhLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFTckMsTUFBTSxPQUFPLHNCQUFzQjtJQXNCakMsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztJQUNyQyxDQUFDO0lBRUQsSUFBSSxZQUFZLENBQUMsS0FBVztRQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVB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