|
import { CdkVirtualScrollViewport } from "@angular/cdk/scrolling"; |
|
import { |
|
ChangeDetectionStrategy, |
|
Component, |
|
EventEmitter, |
|
Input, |
|
Output, |
|
ViewChild, |
|
ViewEncapsulation |
|
} from "@angular/core"; |
|
import * as moment from "moment"; |
|
|
|
|
|
@Component({ |
|
selector: "horizontal-date-scroller", |
|
styleUrls: ["scroller.css"], |
|
templateUrl: "scroller.html", |
|
encapsulation: ViewEncapsulation.None, |
|
changeDetection: ChangeDetectionStrategy.OnPush |
|
}) |
|
|
|
export class HorizontalDateScroller { |
|
items: any[] = []; |
|
currentDate = new Date(); |
|
currentMonth = ""; |
|
stopDate = new Date(); |
|
selectedItem = null; |
|
|
|
@Input() fromDate!: moment.Moment; |
|
@Input() toDate!: moment.Moment; |
|
|
|
@Output() dateChanged: EventEmitter<string> = new EventEmitter(); |
|
|
|
@ViewChild(CdkVirtualScrollViewport) viewPort!: CdkVirtualScrollViewport; |
|
|
|
ngOnInit() { |
|
|
|
|
|
this.items = this.getDates(this.fromDate, this.toDate); |
|
const [lastItem] = this.items.slice(-1) |
|
this.select(lastItem); |
|
setTimeout (() => { |
|
this.viewPort.scrollToIndex(this.items.indexOf(lastItem)) |
|
}, 1000); |
|
} |
|
|
|
|
|
|
|
getDates(fromDate: moment.Moment, toDate: moment.Moment) { |
|
let dateArray: string[] = []; |
|
|
|
let currentDate = fromDate; |
|
while (currentDate <= toDate) { |
|
dateArray.push(currentDate.format("YYYY-MM-DD")); |
|
currentDate = moment(currentDate).add(1, "days"); |
|
} |
|
return dateArray; |
|
} |
|
|
|
|
|
select(item: any) { |
|
this.selectedItem = item; |
|
this.dateChanged.emit(moment(this.selectedItem).format("YYYY-MM-DD")) |
|
} |
|
|
|
|
|
changeMonth(e: any) { |
|
const offset = this.viewPort.measureScrollOffset("end") |
|
const renderedRange = this.viewPort.getRenderedRange(); |
|
const renderedSize = this.viewPort.measureRangeSize(renderedRange)/(renderedRange.end - renderedRange.start) |
|
const totalSize = this.items.length * renderedSize; |
|
let indexNumer = Math.floor(((totalSize - offset)/totalSize) * this.items.length) - 1; |
|
this.currentDate = this.items[indexNumer]; |
|
this.currentMonth = new Date(this.currentDate).toLocaleString("default", {month: "short"}); |
|
} |
|
|
|
|
|
returnWeekDay(item: any) { |
|
return moment(item, "YYYY-MM-DD").format("dddd").substring(0,3); |
|
|
|
} |
|
} |
|
|