UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

188 lines 15.8 kB
/** * @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