ng-devui
Version:
DevUI components based on Angular
448 lines • 94.4 kB
JavaScript
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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