@junte/ui
Version:
Quality Angular UI components kit
184 lines • 39.5 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Component, ContentChild, ContentChildren, ElementRef, forwardRef, HostBinding, HostListener, Input, QueryList, Renderer2, TemplateRef, ViewChild, ViewChildren } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { addMonths, addYears, subMonths, subYears } from 'date-fns';
import { NGXLogger } from 'ngx-logger';
import { delay, filter, map } from 'rxjs/operators';
import { ContentApi, PropertyApi } from '../../core/decorators/api';
import { Breakpoint } from '../../core/enums/breakpoint';
import { UI } from '../../core/enums/ui';
import { Width } from '../../core/enums/width';
import { today } from '../../forms/calendar/utils';
import { BreakpointService } from '../../layout/responsive/breakpoint.service';
import { GanttTypes } from './enums';
import { GanttLineComponent } from './gantt-line/gantt-line.component';
var GanttComponent = /** @class */ (function () {
function GanttComponent(logger, breakpoint, renderer) {
var _this = this;
this.logger = logger;
this.breakpoint = breakpoint;
this.renderer = renderer;
this.host = 'jnt-gantt-host';
this.ui = UI;
this.addMonths = addMonths;
this.subMonths = subMonths;
this.addYears = addYears;
this.subYears = subYears;
this.types = GanttTypes;
this._current = new Date();
this._width = Width.fluid;
this.type = GanttTypes.month;
this.loading = false;
this.sections = this.lines;
this.today = today();
this.onChange = function () { return _this.logger.error('value accessor is not registered'); };
this.onTouched = function () { return _this.logger.error('value accessor is not registered'); };
this.registerOnChange = function (fn) { return _this.onChange = fn; };
this.registerOnTouched = function (fn) { return _this.onTouched = fn; };
this.onBlur = function () { return _this.onTouched(); };
}
GanttComponent_1 = GanttComponent;
Object.defineProperty(GanttComponent.prototype, "mobile", {
get: function () {
return this.breakpoint.current === Breakpoint.mobile;
},
enumerable: true,
configurable: true
});
Object.defineProperty(GanttComponent.prototype, "width", {
get: function () {
return this._width;
},
set: function (width) {
this._width = width || Width.fluid;
},
enumerable: true,
configurable: true
});
Object.defineProperty(GanttComponent.prototype, "current", {
get: function () {
return this._current;
},
set: function (current) {
this._current = current;
this.onChange(current);
},
enumerable: true,
configurable: true
});
GanttComponent.prototype.ngAfterViewInit = function () {
var _this = this;
this.calendarDays.changes.pipe(delay(0), filter(function () { return !!_this.currentLine && _this.breakpoint.current !== Breakpoint.mobile; }), map(function (days) { return ({ days: days, line: _this.currentLine.nativeElement }); })).subscribe(function (_a) {
var days = _a.days, line = _a.line;
var day = days.find(function (day) { return day.nativeElement.attributes['data-current'].value === 'true'; });
if (!!day) {
_this.renderer.setStyle(line, 'display', 'block');
_this.renderer.setStyle(line, 'left', day.nativeElement.offsetLeft + (day.nativeElement.offsetWidth / 2) - 2 + "px");
}
});
};
GanttComponent.prototype.writeValue = function (date) {
this._current = date;
};
var GanttComponent_1;
GanttComponent.ctorParameters = function () { return [
{ type: NGXLogger },
{ type: BreakpointService },
{ type: Renderer2 }
]; };
__decorate([
HostBinding('attr.host'),
__metadata("design:type", Object)
], GanttComponent.prototype, "host", void 0);
__decorate([
PropertyApi({
description: 'Type of gantt',
type: 'ui.gantt.type.month | ui.gantt.type.year',
default: GanttTypes.month,
}),
Input(),
__metadata("design:type", String)
], GanttComponent.prototype, "type", void 0);
__decorate([
PropertyApi({
description: 'Card width',
path: 'ui.width',
default: Width.fluid,
options: [Width.default,
Width.fluid]
}),
HostBinding('attr.data-width'),
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], GanttComponent.prototype, "width", null);
__decorate([
PropertyApi({
description: 'Title',
type: 'string',
default: 'Test title',
}),
Input(),
__metadata("design:type", String)
], GanttComponent.prototype, "title", void 0);
__decorate([
PropertyApi({
description: 'Loading',
type: 'boolean',
default: 'false',
}),
Input(),
__metadata("design:type", Object)
], GanttComponent.prototype, "loading", void 0);
__decorate([
ContentApi({
selector: '#toolsTemplate',
description: 'Tools template'
}),
ContentChild('toolsTemplate'),
__metadata("design:type", TemplateRef)
], GanttComponent.prototype, "toolsTemplate", void 0);
__decorate([
ContentApi({
selector: '#ganttTitleTemplate',
description: 'title template'
}),
ContentChild('ganttTitleTemplate'),
__metadata("design:type", TemplateRef)
], GanttComponent.prototype, "titleTemplate", void 0);
__decorate([
ContentChildren(GanttLineComponent, { descendants: true }),
__metadata("design:type", QueryList)
], GanttComponent.prototype, "lines", void 0);
__decorate([
ViewChildren('calendarDay'),
__metadata("design:type", QueryList)
], GanttComponent.prototype, "calendarDays", void 0);
__decorate([
ViewChild('currentLine'),
__metadata("design:type", ElementRef)
], GanttComponent.prototype, "currentLine", void 0);
__decorate([
HostListener('blur'),
__metadata("design:type", Object)
], GanttComponent.prototype, "onBlur", void 0);
GanttComponent = GanttComponent_1 = __decorate([
Component({
selector: 'jnt-gantt',
template: "<ng-template #noDataTemplate>\n <ng-container *ngIf=\"loading; else emptyDataTemplate\">\n <tr child-of=\"jnt-gantt-host\" data-loading>\n <td child-of=\"jnt-gantt-host\" [attr.colspan]=\"(current | jntGetDaysInMonth) + 2\">\n <jnt-skeleton child-of=\"jnt-gantt-host\" [type]=\"ui.skeleton.type.text\" [lines]=\"8\"></jnt-skeleton>\n </td>\n </tr>\n </ng-container>\n <ng-template #emptyDataTemplate>\n <tr child-of=\"jnt-gantt-host\" data-nodata>\n <td child-of=\"jnt-gantt-host\" [attr.colspan]=\"(current | jntGetDaysInMonth) + 1\">\n <jnt-icon child-of=\"jnt-gantt-host\" [icon]=\"ui.icons.neutral\"></jnt-icon>\n </td>\n </tr>\n </ng-template>\n</ng-template>\n\n<ng-template #titleDefaultTemplate let-title=\"title\">\n {{title}}\n</ng-template>\n<ng-template #lineTitleDefaultTemplate let-title=\"title\">\n {{title}}\n</ng-template>\n\n<div child-of=\"jnt-gantt-host\" data-spinner *ngIf=\"!!lines.length && loading\">\n <jnt-spinner child-of=\"jnt-gantt-host\" [size]=\"ui.size.large\"></jnt-spinner>\n</div>\n\n<ng-template #ganttYearTemplate>\n <ng-container *jntMinFor=\"ui.breakpoint.tablet\">\n <table child-of=\"jnt-gantt-host\" data-year border=\"0\" cellpadding=\"5\" [cellSpacing]=\"0\">\n <thead child-of=\"jnt-gantt-host\" >\n <tr child-of=\"jnt-gantt-host\" >\n <td child-of=\"jnt-gantt-host\" data-gutter></td>\n <td child-of=\"jnt-gantt-host\" data-empty>\n <ng-container *ngIf=\"toolsTemplate\">\n <ng-container *ngTemplateOutlet=\"toolsTemplate\"></ng-container>\n </ng-container>\n </td>\n <td child-of=\"jnt-gantt-host\" data-controls [attr.colspan]=\"12\">\n <div child-of=\"jnt-gantt-host\" data-month>\n <jnt-button child-of=\"jnt-gantt-host\" [icon]=\"ui.icons.chevronLeft\"\n [outline]=\"ui.outline.transparent\"\n [scheme]=\"ui.scheme.secondary\"\n [size]=\"ui.size.small\"\n (click)=\"current = subYears(current, 1)\">\n </jnt-button>\n <div child-of=\"jnt-gantt-host\" >\n {{current | jntFormat: 'yyyy'}}\n </div>\n <jnt-button child-of=\"jnt-gantt-host\" [icon]=\"ui.icons.chevronRight\"\n [outline]=\"ui.outline.transparent\"\n [scheme]=\"ui.scheme.secondary\"\n [size]=\"ui.size.small\"\n (click)=\"current = addYears(current, 1)\">\n </jnt-button>\n </div>\n </td>\n </tr>\n <tr child-of=\"jnt-gantt-host\" data-timeline>\n <td child-of=\"jnt-gantt-host\" data-gutter></td>\n <td child-of=\"jnt-gantt-host\" >\n <ng-container *ngTemplateOutlet=\"!!titleTemplate ? titleTemplate : titleDefaultTemplate;context: this\"></ng-container>\n </td>\n <td child-of=\"jnt-gantt-host\" data-day *ngFor=\"let month of (current | jntStartOfYear | betweenMonths:(current | jntEndOfYear))\"\n [attr.current]=\"month\">\n {{month | monthName}}\n </td>\n </tr>\n </thead>\n <tbody child-of=\"jnt-gantt-host\" >\n\n <ng-container *ngIf=\"lines?.length > 0; else noDataTemplate\">\n <ng-container *ngFor=\"let line of lines\">\n\n <ng-template #emptyYearPeriodsTabletTemplate>\n <tr child-of=\"jnt-gantt-host\" >\n <td child-of=\"jnt-gantt-host\" data-gutter></td>\n <td child-of=\"jnt-gantt-host\" data-title>\n <ng-container *ngTemplateOutlet=\"line.titleTemplate || lineTitleDefaultTemplate; context: {title: line.title}\"></ng-container>\n </td>\n <td child-of=\"jnt-gantt-host\" data-day *ngFor=\"let day of (current | datesInMonth)\">\n </td>\n </tr>\n </ng-template>\n\n <ng-container *ngIf=\"line.periods?.length > 0; else emptyYearPeriodsTabletTemplate\">\n <tr child-of=\"jnt-gantt-host\" *ngFor=\"let period of line.periods; let i = index\">\n <ng-container *ngIf=\"i === 0\">\n <td child-of=\"jnt-gantt-host\" data-gutter [attr.rowspan]=\"line.periods.length\"></td>\n <td child-of=\"jnt-gantt-host\" data-title [attr.rowspan]=\"line.periods.length\">\n <ng-container *ngTemplateOutlet=\"line.titleTemplate || lineTitleDefaultTemplate; context: {title: line.title}\"></ng-container>\n </td>\n </ng-container>\n\n <ng-template #periodTemplate let-from=\"from\" let-to=\"to\" let-start=\"start\" let-end=\"end\" let-period=\"period\">\n <td child-of=\"jnt-gantt-host\" *ngFor=\"let d of start | betweenMonths:from | pop\"></td>\n <td child-of=\"jnt-gantt-host\" [attr.colspan]=\"(from | betweenMonths:to).length\">\n <ng-container *ngIf=\"!((period.to | jntIsBefore:start) || (period.from | jntIsAfter:end))\">\n <ng-container *ngTemplateOutlet=\"period.indicatorYearTemplate;\n context: {period: period, current: current, today: today}\">\n </ng-container>\n </ng-container>\n </td>\n <td child-of=\"jnt-gantt-host\" *ngFor=\"let d of to | betweenMonths:end | pop\"></td>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"periodTemplate;context:\n {start: current | jntStartOfYear,\n end: current | jntEndOfYear,\n period: period,\n current: current,\n from: [[period.from, current | jntStartOfYear] | jntMax, current | jntEndOfYear] | jntMin,\n to: [[period.to, current | jntEndOfYear] | jntMin, current | jntStartOfYear] | jntMax}\">\n </ng-container>\n </tr>\n </ng-container>\n </ng-container>\n </ng-container>\n\n </tbody>\n </table>\n </ng-container>\n\n \n\n <ng-container *jntFor=\"ui.breakpoint.mobile\">\n <jnt-stack child-of=\"jnt-gantt-host\" [align]=\"ui.align.stretch\">\n <ng-container *ngIf=\"toolsTemplate\">\n <ng-container *ngTemplateOutlet=\"toolsTemplate\"></ng-container>\n </ng-container>\n\n <jnt-accordion child-of=\"jnt-gantt-host\" *ngIf=\"lines?.length > 0\">\n <jnt-accordion-section child-of=\"jnt-gantt-host\" *ngFor=\"let line of lines\" [title]=\"line.title\">\n <ng-template #accordionContentTemplate>\n\n <table child-of=\"jnt-gantt-host\" cellpadding=\"3\" [cellSpacing]=\"0\" data-mobile>\n <tbody child-of=\"jnt-gantt-host\" >\n\n <ng-template #emptyYearPeriodsMobileTemplate>\n <tr child-of=\"jnt-gantt-host\" data-nodata>\n <td child-of=\"jnt-gantt-host\" [attr.colspan]=\"(current | jntGetDaysInMonth) + 1\">\n <jnt-icon child-of=\"jnt-gantt-host\" [icon]=\"ui.icons.neutral\"></jnt-icon>\n </td>\n </tr>\n </ng-template>\n\n <ng-container *ngIf=\"line.periods?.length > 0; else emptyYearPeriodsMobileTemplate\">\n <div child-of=\"jnt-gantt-host\" data-controls>\n <div child-of=\"jnt-gantt-host\" data-month>\n <jnt-button child-of=\"jnt-gantt-host\" [icon]=\"ui.icons.chevronLeft\"\n [outline]=\"ui.outline.transparent\"\n [size]=\"ui.size.small\"\n (click)=\"current = subYears(current, 1)\">\n </jnt-button>\n <div child-of=\"jnt-gantt-host\" >\n {{current | jntFormat: 'yyyy'}}\n </div>\n <jnt-button child-of=\"jnt-gantt-host\" [icon]=\"ui.icons.chevronRight\"\n [outline]=\"ui.outline.transparent\"\n [size]=\"ui.size.small\"\n (click)=\"current = addYears(current, 1)\">\n </jnt-button>\n </div>\n </div>\n\n <tr child-of=\"jnt-gantt-host\" *ngFor=\"let month of (current | jntStartOfYear | betweenMonths:(current | jntEndOfYear))\"\n [attr.current]=\"month\">\n <td child-of=\"jnt-gantt-host\" data-day>{{month | monthName}}</td>\n <ng-container *ngFor=\"let period of line.periods; let i = index\">\n\n <ng-template #periodTemplate let-from=\"from\" let-to=\"to\" let-start=\"start\" let-end=\"end\"\n let-period=\"period\">\n <ng-container *ngIf=\"!(month | isWithinInterval:(from | jntStartOfMonth):(to | jntEndOfMonth))\">\n <td child-of=\"jnt-gantt-host\" ></td>\n </ng-container>\n <ng-container *ngIf=\"from | jntIsSameMonth:month\">\n <td child-of=\"jnt-gantt-host\" [attr.rowspan]=\"(from | betweenMonths:to).length\">\n <ng-container *ngIf=\"!((period.to | jntIsBefore:start) || (period.from | jntIsAfter:end))\">\n <ng-container *ngTemplateOutlet=\"period.indicatorYearTemplate;\n context: {period: period, current: current, today: today}\">\n </ng-container>\n </ng-container>\n </td>\n </ng-container>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"periodTemplate;context:\n { start: current | jntStartOfYear,\n end: current | jntEndOfYear,\n period: period,\n current: current,\n from: [[period.from, current | jntStartOfYear] | jntMax, current | jntEndOfYear] | jntMin,\n to: [[period.to, current | jntEndOfYear] | jntMin, current | jntStartOfYear] | jntMax}\">\n </ng-container>\n\n </ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n\n </ng-template>\n </jnt-accordion-section>\n </jnt-accordion>\n </jnt-stack>\n\n </ng-container>\n</ng-template>\n\n<ng-container *ngIf=\"type === types.month; else ganttYearTemplate\">\n <ng-container *jntMinFor=\"ui.breakpoint.tablet\">\n <table child-of=\"jnt-gantt-host\" border=\"0\" cellpadding=\"5\" [cellSpacing]=\"0\">\n <thead child-of=\"jnt-gantt-host\" >\n <tr child-of=\"jnt-gantt-host\" >\n <td child-of=\"jnt-gantt-host\" data-gutter></td>\n <td child-of=\"jnt-gantt-host\" data-empty>\n <ng-container *ngIf=\"toolsTemplate\">\n <ng-container *ngTemplateOutlet=\"toolsTemplate\"></ng-container>\n </ng-container>\n </td>\n <td child-of=\"jnt-gantt-host\" data-controls [attr.colspan]=\"(current | jntGetDaysInMonth)\">\n <div child-of=\"jnt-gantt-host\" data-month>\n <jnt-button child-of=\"jnt-gantt-host\" [icon]=\"ui.icons.chevronLeft\"\n [outline]=\"ui.outline.transparent\"\n [scheme]=\"ui.scheme.secondary\"\n [size]=\"ui.size.small\"\n (click)=\"current = subMonths(current, 1)\">\n </jnt-button>\n <div child-of=\"jnt-gantt-host\" >\n {{current | jntFormat: 'MMMM'}}, {{current | jntFormat: 'yyyy'}}\n </div>\n <jnt-button child-of=\"jnt-gantt-host\" [icon]=\"ui.icons.chevronRight\"\n [outline]=\"ui.outline.transparent\"\n [scheme]=\"ui.scheme.secondary\"\n [size]=\"ui.size.small\"\n (click)=\"current = addMonths(current, 1)\">\n </jnt-button>\n </div>\n </td>\n </tr>\n <tr child-of=\"jnt-gantt-host\" data-timeline>\n <td child-of=\"jnt-gantt-host\" data-gutter></td>\n <td child-of=\"jnt-gantt-host\" >\n <ng-container *ngTemplateOutlet=\"!!titleTemplate ? titleTemplate : titleDefaultTemplate;context: this\"></ng-container>\n </td>\n <td child-of=\"jnt-gantt-host\" data-day *ngFor=\"let day of (current | datesInMonth)\"\n [attr.data-current]=\"day | jntIsToday\"\n [attr.data-weekend]=\"day | jntIsWeekend\"\n #calendarDay>\n {{day | jntGetDate}}\n </td>\n </tr>\n </thead>\n <tbody child-of=\"jnt-gantt-host\" >\n <div child-of=\"jnt-gantt-host\" data-current-line #currentLine></div>\n\n <ng-container *ngIf=\"lines?.length > 0; else noDataTemplate\">\n <ng-container *ngFor=\"let line of lines\">\n\n <ng-template #emptyMonthPeriodsTabletTemplate>\n <tr child-of=\"jnt-gantt-host\" >\n <td child-of=\"jnt-gantt-host\" data-gutter></td>\n <td child-of=\"jnt-gantt-host\" data-title>\n <ng-container *ngTemplateOutlet=\"line.titleTemplate || lineTitleDefaultTemplate; context: {title: line.title}\"></ng-container>\n </td>\n <td child-of=\"jnt-gantt-host\" data-day *ngFor=\"let day of (current | datesInMonth)\">\n </td>\n </tr>\n </ng-template>\n\n <ng-container *ngIf=\"line.periods?.length > 0; else emptyMonthPeriodsTabletTemplate\">\n <tr child-of=\"jnt-gantt-host\" *ngFor=\"let period of line.periods; let i = index\">\n\n <ng-container *ngIf=\"i === 0\">\n <td child-of=\"jnt-gantt-host\" data-gutter [attr.rowspan]=\"line.periods.length\"></td>\n <td child-of=\"jnt-gantt-host\" data-title [attr.rowspan]=\"line.periods.length\">\n <ng-container *ngTemplateOutlet=\"line.titleTemplate || lineTitleDefaultTemplate; context: {title: line.title}\"></ng-container>\n </td>\n </ng-container>\n\n <ng-template #periodTemplate let-from=\"from\" let-to=\"to\" let-start=\"start\" let-end=\"end\"\n let-period=\"period\">\n <td child-of=\"jnt-gantt-host\" *ngFor=\"let d of start | betweenDays:from | pop\"></td>\n <td child-of=\"jnt-gantt-host\" [attr.colspan]=\"(from | betweenDays:to).length\">\n <ng-container *ngIf=\"!((period.to | jntIsBefore:start) || (period.from | jntIsAfter:end))\">\n <ng-container *ngTemplateOutlet=\"period.indicatorMonthTemplate;\n context: {period: period, current: current, today: today}\">\n </ng-container>\n </ng-container>\n </td>\n <td child-of=\"jnt-gantt-host\" *ngFor=\"let d of to | betweenDays:end | pop\"></td>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"periodTemplate;context:\n {start: current | jntStartOfMonth,\n end: current | jntEndOfMonth,\n period: period,\n current: current,\n from: [[period.from, current | jntStartOfMonth] | jntMax, current | jntEndOfMonth] | jntMin,\n to: [[period.to, current | jntEndOfMonth] | jntMin, current | jntStartOfMonth] | jntMax}\">\n </ng-container>\n\n </tr>\n </ng-container>\n </ng-container>\n\n </ng-container>\n </tbody>\n </table>\n </ng-container>\n\n \n\n <ng-container *jntFor=\"ui.breakpoint.mobile\">\n <jnt-accordion child-of=\"jnt-gantt-host\" *ngIf=\"lines?.length > 0\">\n <jnt-accordion-section child-of=\"jnt-gantt-host\" *ngFor=\"let line of lines\" [title]=\"line.title\">\n <ng-template #accordionContentTemplate>\n <div child-of=\"jnt-gantt-host\" >\n <ng-container *ngIf=\"toolsTemplate\">\n <ng-container *ngTemplateOutlet=\"toolsTemplate\"></ng-container>\n </ng-container>\n </div>\n <div child-of=\"jnt-gantt-host\" data-controls>\n <div child-of=\"jnt-gantt-host\" data-month>\n <jnt-button child-of=\"jnt-gantt-host\" [icon]=\"ui.icons.chevronLeft\"\n [outline]=\"ui.outline.transparent\"\n [scheme]=\"ui.scheme.secondary\"\n [size]=\"ui.size.small\"\n (click)=\"current = subMonths(current, 1)\">\n </jnt-button>\n <div child-of=\"jnt-gantt-host\" >\n {{current | jntFormat: 'MMMM'}}, {{current | jntFormat: 'yyyy'}}\n </div>\n <jnt-button child-of=\"jnt-gantt-host\" [icon]=\"ui.icons.chevronRight\"\n [outline]=\"ui.outline.transparent\"\n [scheme]=\"ui.scheme.secondary\"\n [size]=\"ui.size.small\"\n (click)=\"current = addMonths(current, 1)\">\n </jnt-button>\n </div>\n </div>\n <table child-of=\"jnt-gantt-host\" cellpadding=\"3\" [cellSpacing]=\"0\" data-mobile>\n <tbody child-of=\"jnt-gantt-host\" >\n\n <ng-template #emptyMonthPeriodsMobileTemplate>\n <tr child-of=\"jnt-gantt-host\" data-nodata>\n <td child-of=\"jnt-gantt-host\" >\n <jnt-icon child-of=\"jnt-gantt-host\" [icon]=\"ui.icons.neutral\"></jnt-icon>\n </td>\n </tr>\n </ng-template>\n\n <ng-container *ngIf=\"line.periods?.length > 0; else emptyMonthPeriodsMobileTemplate\">\n\n <tr child-of=\"jnt-gantt-host\" *ngFor=\"let day of (current | datesInMonth)\">\n <td child-of=\"jnt-gantt-host\" data-day\n [attr.data-current]=\"day | jntIsToday\"\n [attr.data-weekend]=\"day | jntIsWeekend\"\n #calendarDay>\n {{day | jntGetDate}}\n </td>\n <ng-container *ngFor=\"let period of line.periods; let i = index\">\n\n <ng-template #periodTemplate let-from=\"from\" let-to=\"to\" let-start=\"start\" let-end=\"end\"\n let-period=\"period\">\n\n <ng-container *ngIf=\"!(day | isWithinInterval:(from | jntStartOfDay):(to | jntEndOfDay))\">\n <td child-of=\"jnt-gantt-host\" ></td>\n </ng-container>\n <ng-container *ngIf=\"from | isSameDay:day\">\n <td child-of=\"jnt-gantt-host\" [attr.rowspan]=\"(from | betweenDays:to).length\">\n <ng-container *ngIf=\"!((period.to | jntIsBefore:start) || (period.from | jntIsAfter:end))\">\n <ng-container *ngTemplateOutlet=\"period.indicatorMonthTemplate;\n context: {period: period, current: current, today: today}\">\n </ng-container>\n </ng-container>\n </td>\n </ng-container>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"periodTemplate;context:\n {start: current | jntStartOfMonth,\n end: current | jntEndOfMonth,\n period: period,\n current: current,\n from: [[period.from, current | jntStartOfMonth] | jntMax, current | jntEndOfMonth] | jntMin,\n to: [[period.to, current | jntEndOfMonth] | jntMin, current | jntStartOfMonth] | jntMax}\">\n </ng-container>\n\n </ng-container>\n </tr>\n </ng-container>\n\n </tbody>\n </table>\n </ng-template>\n </jnt-accordion-section>\n </jnt-accordion>\n </ng-container>\n</ng-container>",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return GanttComponent_1; }),
multi: true
}
]
}),
__metadata("design:paramtypes", [NGXLogger,
BreakpointService,
Renderer2])
], GanttComponent);
return GanttComponent;
}());
export { GanttComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGp1bnRlL3VpLyIsInNvdXJjZXMiOlsibGliL2NvbGxlY3Rpb25zL2dhbnR0L2dhbnR0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDckMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFhdkU7SUFxR0Us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aUI7WUFDbkIsU0FBUztPQXZHNUIsY0FBYyxDQTRIMUI7SUFBRCxxQkFBQztDQUFBLEFBNUhELElBNEhDO1NBNUhZLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGFkZE1vbnRocywgYWRkWWVhcnMsIHN1Yk1vbnRocywgc3ViWWVhcnMgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBOR1hMb2dnZXIgfSBmcm9tICduZ3gtbG9nZ2VyJztcbmltcG9ydCB7IGRlbGF5LCBmaWx0ZXIsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvbnRlbnRBcGksIFByb3BlcnR5QXBpIH0gZnJvbSAnLi4vLi4vY29yZS9kZWNvcmF0b3JzL2FwaSc7XG5pbXBvcnQgeyBCcmVha3BvaW50IH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy9icmVha3BvaW50JztcbmltcG9ydCB7IFVJIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy91aSc7XG5pbXBvcnQgeyBXaWR0aCB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvd2lkdGgnO1xuaW1wb3J0IHsgdG9kYXkgfSBmcm9tICcuLi8uLi9mb3Jtcy9jYWxlbmRhci91dGlscyc7XG5pbXBvcnQgeyBCcmVha3BvaW50U2VydmljZSB9IGZyb20gJy4uLy4uL2xheW91dC9yZXNwb25zaXZlL2JyZWFrcG9pbnQuc2VydmljZSc7XG5pbXBvcnQgeyBHYW50dFR5cGVzIH0gZnJvbSAnLi9lbnVtcyc7XG5pbXBvcnQgeyBHYW50dExpbmVDb21wb25lbnQgfSBmcm9tICcuL2dhbnR0LWxpbmUvZ2FudHQtbGluZS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdqbnQtZ2FudHQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2FudHQuZW5jYXBzdWxhdGVkLmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEdhbnR0Q29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEdhbnR0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5ob3N0JykgcmVhZG9ubHkgaG9zdCA9ICdqbnQtZ2FudHQtaG9zdCc7XG5cbiAgdWkgPSBVSTtcbiAgYWRkTW9udGhzID0gYWRkTW9udGhzO1xuICBzdWJNb250aHMgPSBzdWJNb250aHM7XG4gIGFkZFllYXJzID0gYWRkWWVhcnM7XG4gIHN1YlllYXJzID0gc3ViWWVhcnM7XG4gIHR5cGVzID0gR2FudHRUeXBlcztcblxuICBwcml2YXRlIF9jdXJyZW50OiBEYXRlID0gbmV3IERhdGUoKTtcbiAgcHJpdmF0ZSBfd2lkdGg6IFdpZHRoID0gV2lkdGguZmx1aWQ7XG5cbiAgZ2V0IG1vYmlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5icmVha3BvaW50LmN1cnJlbnQgPT09IEJyZWFrcG9pbnQubW9iaWxlO1xuICB9XG5cbiAgQFByb3BlcnR5QXBpKHtcbiAgICBkZXNjcmlwdGlvbjogJ1R5cGUgb2YgZ2FudHQnLFxuICAgIHR5cGU6ICd1aS5nYW50dC50eXBlLm1vbnRoIHwgdWkuZ2FudHQudHlwZS55ZWFyJyxcbiAgICBkZWZhdWx0OiBHYW50dFR5cGVzLm1vbnRoLFxuICB9KVxuICBASW5wdXQoKVxuICB0eXBlOiBHYW50dFR5cGVzID0gR2FudHRUeXBlcy5tb250aDtcblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnQ2FyZCB3aWR0aCcsXG4gICAgcGF0aDogJ3VpLndpZHRoJyxcbiAgICBkZWZhdWx0OiBXaWR0aC5mbHVpZCxcbiAgICBvcHRpb25zOiBbV2lkdGguZGVmYXVsdCxcbiAgICAgIFdpZHRoLmZsdWlkXVxuICB9KVxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS13aWR0aCcpXG4gIEBJbnB1dCgpXG4gIHNldCB3aWR0aCh3aWR0aDogV2lkdGgpIHtcbiAgICB0aGlzLl93aWR0aCA9IHdpZHRoIHx8IFdpZHRoLmZsdWlkO1xuICB9XG5cbiAgZ2V0IHdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgfVxuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdUaXRsZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJ1Rlc3QgdGl0bGUnLFxuICB9KVxuICBASW5wdXQoKVxuICB0aXRsZTogc3RyaW5nO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdMb2FkaW5nJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogJ2ZhbHNlJyxcbiAgfSlcbiAgQElucHV0KClcbiAgbG9hZGluZyA9IGZhbHNlO1xuXG4gIEBDb250ZW50QXBpKHtcbiAgICBzZWxlY3RvcjogJyN0b29sc1RlbXBsYXRlJyxcbiAgICBkZXNjcmlwdGlvbjogJ1Rvb2xzIHRlbXBsYXRlJ1xuICB9KVxuICBAQ29udGVudENoaWxkKCd0b29sc1RlbXBsYXRlJylcbiAgdG9vbHNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICBAQ29udGVudEFwaSh7XG4gICAgc2VsZWN0b3I6ICcjZ2FudHRUaXRsZVRlbXBsYXRlJyxcbiAgICBkZXNjcmlwdGlvbjogJ3RpdGxlIHRlbXBsYXRlJ1xuICB9KVxuICBAQ29udGVudENoaWxkKCdnYW50dFRpdGxlVGVtcGxhdGUnKVxuICB0aXRsZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oR2FudHRMaW5lQ29tcG9uZW50LCB7ZGVzY2VuZGFudHM6IHRydWV9KVxuICBsaW5lczogUXVlcnlMaXN0PEdhbnR0TGluZUNvbXBvbmVudD47XG5cbiAgQFZpZXdDaGlsZHJlbignY2FsZW5kYXJEYXknKVxuICBjYWxlbmRhckRheXM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcblxuICBAVmlld0NoaWxkKCdjdXJyZW50TGluZScpXG4gIGN1cnJlbnRMaW5lOiBFbGVtZW50UmVmO1xuXG4gIHNlY3Rpb25zID0gdGhpcy5saW5lcztcbiAgdG9kYXkgPSB0b2RheSgpO1xuICBlcnJvcjogRXJyb3I7XG5cbiAgb25DaGFuZ2U6IChkYXRlOiBEYXRlKSA9PiB2b2lkID0gKCkgPT4gdGhpcy5sb2dnZXIuZXJyb3IoJ3ZhbHVlIGFjY2Vzc29yIGlzIG5vdCByZWdpc3RlcmVkJyk7XG4gIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHRoaXMubG9nZ2VyLmVycm9yKCd2YWx1ZSBhY2Nlc3NvciBpcyBub3QgcmVnaXN0ZXJlZCcpO1xuICByZWdpc3Rlck9uQ2hhbmdlID0gZm4gPT4gdGhpcy5vbkNoYW5nZSA9IGZuO1xuICByZWdpc3Rlck9uVG91Y2hlZCA9IGZuID0+IHRoaXMub25Ub3VjaGVkID0gZm47XG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInKSBvbkJsdXIgPSAoKSA9PiB0aGlzLm9uVG91Y2hlZCgpO1xuXG4gIGdldCBjdXJyZW50KCkge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50O1xuICB9XG5cbiAgc2V0IGN1cnJlbnQoY3VycmVudDogRGF0ZSkge1xuICAgIHRoaXMuX2N1cnJlbnQgPSBjdXJyZW50O1xuICAgIHRoaXMub25DaGFuZ2UoY3VycmVudCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxvZ2dlcjogTkdYTG9nZ2VyLFxuICAgICAgICAgICAgICBwcml2YXRlIGJyZWFrcG9pbnQ6IEJyZWFrcG9pbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmNhbGVuZGFyRGF5cy5jaGFuZ2VzLnBpcGUoXG4gICAgICBkZWxheSgwKSxcbiAgICAgIGZpbHRlcigoKSA9PiAhIXRoaXMuY3VycmVudExpbmUgJiYgdGhpcy5icmVha3BvaW50LmN1cnJlbnQgIT09IEJyZWFrcG9pbnQubW9iaWxlKSxcbiAgICAgIG1hcChkYXlzID0+ICh7ZGF5cywgbGluZTogdGhpcy5jdXJyZW50TGluZS5uYXRpdmVFbGVtZW50fSkpXG4gICAgKS5zdWJzY3JpYmUoKHtkYXlzLCBsaW5lfSkgPT4ge1xuICAgICAgY29uc3QgZGF5ID0gZGF5cy5maW5kKGRheSA9PiBkYXkubmF0aXZlRWxlbWVudC5hdHRyaWJ1dGVzWydkYXRhLWN1cnJlbnQnXS52YWx1ZSA9PT0gJ3RydWUnKTtcbiAgICAgIGlmICghIWRheSkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGxpbmUsICdkaXNwbGF5JywgJ2Jsb2NrJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobGluZSwgJ2xlZnQnLFxuICAgICAgICAgIGAke2RheS5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQgKyAoZGF5Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggLyAyKSAtIDJ9cHhgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUoZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuX2N1cnJlbnQgPSBkYXRlO1xuICB9XG59XG4iXX0=