theme-lib
Version:
This is a simple example Angular Library published to npm.
188 lines • 15.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/*
* @license
* Copyright Akveo. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import { Injectable } from '@angular/core';
import { NbDateService } from './date.service';
import { batch, range } from '../helpers';
/**
* @template D
*/
export class NbCalendarMonthModelService {
/**
* @param {?} dateService
*/
constructor(dateService) {
this.dateService = dateService;
}
/**
* @param {?} activeMonth
* @param {?=} boundingMonth
* @return {?}
*/
createDaysGrid(activeMonth, boundingMonth = true) {
/** @type {?} */
const weeks = this.createDates(activeMonth);
return this.withBoundingMonths(weeks, activeMonth, boundingMonth);
}
/**
* @private
* @param {?} activeMonth
* @return {?}
*/
createDates(activeMonth) {
/** @type {?} */
const days = this.createDateRangeForMonth(activeMonth);
/** @type {?} */
const startOfWeekDayDiff = this.getStartOfWeekDayDiff(activeMonth);
return batch(days, this.dateService.DAYS_IN_WEEK, startOfWeekDayDiff);
}
/**
* @private
* @param {?} weeks
* @param {?} activeMonth
* @param {?} boundingMonth
* @return {?}
*/
withBoundingMonths(weeks, activeMonth, boundingMonth) {
/** @type {?} */
let withBoundingMonths = weeks;
if (this.isShouldAddPrevBoundingMonth(withBoundingMonths)) {
withBoundingMonths = this.addPrevBoundingMonth(withBoundingMonths, activeMonth, boundingMonth);
}
if (this.isShouldAddNextBoundingMonth(withBoundingMonths)) {
withBoundingMonths = this.addNextBoundingMonth(withBoundingMonths, activeMonth, boundingMonth);
}
return withBoundingMonths;
}
/**
* @private
* @param {?} weeks
* @param {?} activeMonth
* @param {?} boundingMonth
* @return {?}
*/
addPrevBoundingMonth(weeks, activeMonth, boundingMonth) {
/** @type {?} */
const firstWeek = weeks.shift();
/** @type {?} */
const requiredItems = this.dateService.DAYS_IN_WEEK - firstWeek.length;
firstWeek.unshift(...this.createPrevBoundingDays(activeMonth, boundingMonth, requiredItems));
return [firstWeek, ...weeks];
}
/**
* @private
* @param {?} weeks
* @param {?} activeMonth
* @param {?} boundingMonth
* @return {?}
*/
addNextBoundingMonth(weeks, activeMonth, boundingMonth) {
/** @type {?} */
const lastWeek = weeks.pop();
/** @type {?} */
const requiredItems = this.dateService.DAYS_IN_WEEK - lastWeek.length;
lastWeek.push(...this.createNextBoundingDays(activeMonth, boundingMonth, requiredItems));
return [...weeks, lastWeek];
}
/**
* @private
* @param {?} activeMonth
* @param {?} boundingMonth
* @param {?} requiredItems
* @return {?}
*/
createPrevBoundingDays(activeMonth, boundingMonth, requiredItems) {
/** @type {?} */
const month = this.dateService.addMonth(activeMonth, -1);
/** @type {?} */
const daysInMonth = this.dateService.getNumberOfDaysInMonth(month);
return this.createDateRangeForMonth(month)
.slice(daysInMonth - requiredItems)
.map(date => boundingMonth ? date : null);
}
/**
* @private
* @param {?} activeMonth
* @param {?} boundingMonth
* @param {?} requiredItems
* @return {?}
*/
createNextBoundingDays(activeMonth, boundingMonth, requiredItems) {
/** @type {?} */
const month = this.dateService.addMonth(activeMonth, 1);
return this.createDateRangeForMonth(month)
.slice(0, requiredItems)
.map(date => boundingMonth ? date : null);
}
/**
* @private
* @param {?} date
* @return {?}
*/
getStartOfWeekDayDiff(date) {
/** @type {?} */
const startOfMonth = this.dateService.getMonthStart(date);
return this.getWeekStartDiff(startOfMonth);
}
/**
* @private
* @param {?} date
* @return {?}
*/
getWeekStartDiff(date) {
return (7 - this.dateService.getFirstDayOfWeek() + this.dateService.getDayOfWeek(date)) % 7;
}
/**
* @private
* @param {?} weeks
* @return {?}
*/
isShouldAddPrevBoundingMonth(weeks) {
return weeks[0].length < this.dateService.DAYS_IN_WEEK;
}
/**
* @private
* @param {?} weeks
* @return {?}
*/
isShouldAddNextBoundingMonth(weeks) {
return weeks[weeks.length - 1].length < this.dateService.DAYS_IN_WEEK;
}
/**
* @private
* @param {?} date
* @return {?}
*/
createDateRangeForMonth(date) {
/** @type {?} */
const daysInMonth = this.dateService.getNumberOfDaysInMonth(date);
return range(daysInMonth, i => {
/** @type {?} */
const year = this.dateService.getYear(date);
/** @type {?} */
const month = this.dateService.getMonth(date);
return this.dateService.createDate(year, month, i + 1);
});
}
}
NbCalendarMonthModelService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
NbCalendarMonthModelService.ctorParameters = () => [
{ type: NbDateService }
];
if (false) {
/**
* @type {?}
* @protected
*/
NbCalendarMonthModelService.prototype.dateService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbW9udGgtbW9kZWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3RoZW1lLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2NhbGVuZGFyLWtpdC9zZXJ2aWNlcy9jYWxlbmRhci1tb250aC1tb2RlbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU1BLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDOzs7O0FBSTFDLE1BQU0sT0FBTywyQkFBMkI7Ozs7SUFFdEMsWUFBc0IsV0FBNkI7UUFBN0IsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO0lBQ25ELENBQUM7Ozs7OztJQUVELGNBQWMsQ0FBQyxXQUFjLEVBQUUsZ0JBQXlCLElBQUk7O2NBQ3BELEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztRQUMzQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7Ozs7OztJQUVPLFdBQVcsQ0FBQyxXQUFjOztjQUMxQixJQUFJLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQzs7Y0FDaEQsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQztRQUNsRSxPQUFPLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUN4RSxDQUFDOzs7Ozs7OztJQUVPLGtCQUFrQixDQUFDLEtBQVksRUFBRSxXQUFjLEVBQUUsYUFBc0I7O1lBQ3pFLGtCQUFrQixHQUFHLEtBQUs7UUFFOUIsSUFBSSxJQUFJLENBQUMsNEJB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SSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUYsQ0FBQzs7Ozs7O0lBRU8sNEJBQTRCLENBQUMsS0FBWTtRQUMvQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUM7SUFDekQsQ0FBQzs7Ozs7O0lBRU8sNEJBQTRCLENBQUMsS0FBWTtRQUMvQyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQztJQUN4RSxDQUFDOzs7Ozs7SUFFTyx1QkFBdUIsQ0FBQyxJQUFPOztjQUMvQixXQUFXLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUM7UUFDekUsT0FBTyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxFQUFFOztrQkFDdEIsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQzs7a0JBQ3JDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDN0MsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUN4RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OztZQXBGRixVQUFVOzs7O1lBSkYsYUFBYTs7Ozs7OztJQU9SLGtEQUF1QyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBBa3Zlby4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuICovXHJcblxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBOYkRhdGVTZXJ2aWNlIH0gZnJvbSAnLi9kYXRlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBiYXRjaCwgcmFuZ2UgfSBmcm9tICcuLi9oZWxwZXJzJztcclxuXHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOYkNhbGVuZGFyTW9udGhNb2RlbFNlcnZpY2U8RD4ge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgZGF0ZVNlcnZpY2U6IE5iRGF0ZVNlcnZpY2U8RD4pIHtcclxuICB9XHJcblxyXG4gIGNyZWF0ZURheXNHcmlkKGFjdGl2ZU1vbnRoOiBELCBib3VuZGluZ01vbnRoOiBib29sZWFuID0gdHJ1ZSk6IERbXVtdIHtcclxuICAgIGNvbnN0IHdlZWtzID0gdGhpcy5jcmVhdGVEYXRlcyhhY3RpdmVNb250aCk7XHJcbiAgICByZXR1cm4gdGhpcy53aXRoQm91bmRpbmdNb250aHMod2Vla3MsIGFjdGl2ZU1vbnRoLCBib3VuZGluZ01vbnRoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRGF0ZXMoYWN0aXZlTW9udGg6IEQpOiBEW11bXSB7XHJcbiAgICBjb25zdCBkYXlzID0gdGhpcy5jcmVhdGVEYXRlUmFuZ2VGb3JNb250aChhY3RpdmVNb250aCk7XHJcbiAgICBjb25zdCBzdGFydE9mV2Vla0RheURpZmYgPSB0aGlzLmdldFN0YXJ0T2ZXZWVrRGF5RGlmZihhY3RpdmVNb250aCk7XHJcbiAgICByZXR1cm4gYmF0Y2goZGF5cywgdGhpcy5kYXRlU2VydmljZS5EQVlTX0lOX1dFRUssIHN0YXJ0T2ZXZWVrRGF5RGlmZik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHdpdGhCb3VuZGluZ01vbnRocyh3ZWVrczogRFtdW10sIGFjdGl2ZU1vbnRoOiBELCBib3VuZGluZ01vbnRoOiBib29sZWFuKTogRFtdW10ge1xyXG4gICAgbGV0IHdpdGhCb3VuZGluZ01vbnRocyA9IHdlZWtzO1xyXG5cclxuICAgIGlmICh0aGlzLmlzU2hvdWxkQWRkUHJldkJvdW5kaW5nTW9udGgod2l0aEJvdW5kaW5nTW9udGhzKSkge1xyXG4gICAgICB3aXRoQm91bmRpbmdNb250aHMgPSB0aGlzLmFkZFByZXZCb3VuZGluZ01vbnRoKHdpdGhCb3VuZGluZ01vbnRocywgYWN0aXZlTW9udGgsIGJvdW5kaW5nTW9udGgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzU2hvdWxkQWRkTmV4dEJvdW5kaW5nTW9udGgod2l0aEJvdW5kaW5nTW9udGhzKSkge1xyXG4gICAgICB3aXRoQm91bmRpbmdNb250aHMgPSB0aGlzLmFkZE5leHRCb3VuZGluZ01vbnRoKHdpdGhCb3VuZGluZ01vbnRocywgYWN0aXZlTW9udGgsIGJvdW5kaW5nTW9udGgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB3aXRoQm91bmRpbmdNb250aHM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZFByZXZCb3VuZGluZ01vbnRoKHdlZWtzOiBEW11bXSwgYWN0aXZlTW9udGg6IEQsIGJvdW5kaW5nTW9udGg6IGJvb2xlYW4pOiBEW11bXSB7XHJcbiAgICBjb25zdCBmaXJzdFdlZWsgPSB3ZWVrcy5zaGlmdCgpO1xyXG4gICAgY29uc3QgcmVxdWlyZWRJdGVtczogbnVtYmVyID0gdGhpcy5kYXRlU2VydmljZS5EQVlTX0lOX1dFRUsgLSBmaXJzdFdlZWsubGVuZ3RoO1xyXG4gICAgZmlyc3RXZWVrLnVuc2hpZnQoLi4udGhpcy5jcmVhdGVQcmV2Qm91bmRpbmdEYXlzKGFjdGl2ZU1vbnRoLCBib3VuZGluZ01vbnRoLCByZXF1aXJlZEl0ZW1zKSk7XHJcbiAgICByZXR1cm4gW2ZpcnN0V2VlaywgLi4ud2Vla3NdO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGROZXh0Qm91bmRpbmdNb250aCh3ZWVrczogRFtdW10sIGFjdGl2ZU1vbnRoOiBELCBib3VuZGluZ01vbnRoOiBib29sZWFuKTogRFtdW10ge1xyXG4gICAgY29uc3QgbGFzdFdlZWsgPSB3ZWVrcy5wb3AoKTtcclxuICAgIGNvbnN0IHJlcXVpcmVkSXRlbXM6IG51bWJlciA9IHRoaXMuZGF0ZVNlcnZpY2UuREFZU19JTl9XRUVLIC0gbGFzdFdlZWsubGVuZ3RoO1xyXG4gICAgbGFzdFdlZWsucHVzaCguLi50aGlzLmNyZWF0ZU5leHRCb3VuZGluZ0RheXMoYWN0aXZlTW9udGgsIGJvdW5kaW5nTW9udGgsIHJlcXVpcmVkSXRlbXMpKTtcclxuICAgIHJldHVybiBbLi4ud2Vla3MsIGxhc3RXZWVrXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUHJldkJvdW5kaW5nRGF5cyhhY3RpdmVNb250aDogRCwgYm91bmRpbmdNb250aDogYm9vbGVhbiwgcmVxdWlyZWRJdGVtczogbnVtYmVyKTogRFtdIHtcclxuICAgIGNvbnN0IG1vbnRoID0gdGhpcy5kYXRlU2VydmljZS5hZGRNb250aChhY3RpdmVNb250aCwgLTEpO1xyXG4gICAgY29uc3QgZGF5c0luTW9udGggPSB0aGlzLmRhdGVTZXJ2aWNlLmdldE51bWJlck9mRGF5c0luTW9udGgobW9udGgpO1xyXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlRGF0ZVJhbmdlRm9yTW9udGgobW9udGgpXHJcbiAgICAgIC5zbGljZShkYXlzSW5Nb250aCAtIHJlcXVpcmVkSXRlbXMpXHJcbiAgICAgIC5tYXAoZGF0ZSA9PiBib3VuZGluZ01vbnRoID8gZGF0ZSA6IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVOZXh0Qm91bmRpbmdEYXlzKGFjdGl2ZU1vbnRoOiBELCBib3VuZGluZ01vbnRoOiBib29sZWFuLCByZXF1aXJlZEl0ZW1zOiBudW1iZXIpOiBEW10ge1xyXG4gICAgY29uc3QgbW9udGggPSB0aGlzLmRhdGVTZXJ2aWNlLmFkZE1vbnRoKGFjdGl2ZU1vbnRoLCAxKTtcclxuICAgIHJldHVybiB0aGlzLmNyZWF0ZURhdGVSYW5nZUZvck1vbnRoKG1vbnRoKVxyXG4gICAgICAuc2xpY2UoMCwgcmVxdWlyZWRJdGVtcylcclxuICAgICAgLm1hcChkYXRlID0+IGJvdW5kaW5nTW9udGggPyBkYXRlIDogbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFN0YXJ0T2ZXZWVrRGF5RGlmZihkYXRlOiBEKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHN0YXJ0T2ZNb250aCA9IHRoaXMuZGF0ZVNlcnZpY2UuZ2V0TW9udGhTdGFydChkYXRlKTtcclxuICAgIHJldHVybiB0aGlzLmdldFdlZWtTdGFydERpZmYoc3RhcnRPZk1vbnRoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0V2Vla1N0YXJ0RGlmZihkYXRlOiBEKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAoNyAtIHRoaXMuZGF0ZVNlcnZpY2UuZ2V0Rmlyc3REYXlPZldlZWsoKSArIHRoaXMuZGF0ZVNlcnZpY2UuZ2V0RGF5T2ZXZWVrKGRhdGUpKSAlIDc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzU2hvdWxkQWRkUHJldkJvdW5kaW5nTW9udGgod2Vla3M6IERbXVtdKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gd2Vla3NbMF0ubGVuZ3RoIDwgdGhpcy5kYXRlU2VydmljZS5EQVlTX0lOX1dFRUs7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzU2hvdWxkQWRkTmV4dEJvdW5kaW5nTW9udGgod2Vla3M6IERbXVtdKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gd2Vla3Nbd2Vla3MubGVuZ3RoIC0gMV0ubGVuZ3RoIDwgdGhpcy5kYXRlU2VydmljZS5EQVlTX0lOX1dFRUs7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURhdGVSYW5nZUZvck1vbnRoKGRhdGU6IEQpOiBEW10ge1xyXG4gICAgY29uc3QgZGF5c0luTW9udGg6IG51bWJlciA9IHRoaXMuZGF0ZVNlcnZpY2UuZ2V0TnVtYmVyT2ZEYXlzSW5Nb250aChkYXRlKTtcclxuICAgIHJldHVybiByYW5nZShkYXlzSW5Nb250aCwgaSA9PiB7XHJcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmRhdGVTZXJ2aWNlLmdldFllYXIoZGF0ZSk7XHJcbiAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5kYXRlU2VydmljZS5nZXRNb250aChkYXRlKTtcclxuICAgICAgcmV0dXJuIHRoaXMuZGF0ZVNlcnZpY2UuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCwgaSArIDEpXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19