truly-ui
Version:
Web Components for Desktop Applications.
265 lines • 69.5 kB
JavaScript
import { Component, Input, ChangeDetectionStrategy, Output, EventEmitter, ViewChildren } from '@angular/core';
import { Subscription } from 'rxjs';
import { ScheduleI18n } from '../../i18n/schedule-i18n';
import * as i0 from "@angular/core";
import * as i1 from "../../services/generate-events.service";
import * as i2 from "../../services/event.service";
import * as i3 from "../../services/work-scale.service";
import * as i4 from "@angular/common";
import * as i5 from "../../../tooltip/directives/tooltip.directive";
import * as i6 from "../../../icons/icons";
export class ViewDayComponent {
constructor(changeDetectionRef, generateEvents, eventService, workScaleService) {
this.changeDetectionRef = changeDetectionRef;
this.generateEvents = generateEvents;
this.eventService = eventService;
this.workScaleService = workScaleService;
this.currentDate = new Date();
this.showNowIndicator = false;
this.texts = ScheduleI18n;
this.onRowDbClick = new EventEmitter();
this.onRowClick = new EventEmitter();
this.onEventDbClick = new EventEmitter();
this.onEventClick = new EventEmitter();
this.onEventMouseover = new EventEmitter();
this.onEventMouseout = new EventEmitter();
this.onEventContextmenu = new EventEmitter();
this.currentTime = new Date();
this.indexRowSelected = null;
this.eventsWithPositions = [];
this.subscriptions = new Subscription();
this.subscriptions.add(this.workScaleService.updateScale.subscribe((timesCollection) => {
this.timesCollection = timesCollection;
this.changeDetectionRef.detectChanges();
this.indexRowSelected = null;
}));
this.subscriptions.add(this.eventService.updateEvents.subscribe((event) => {
this.generateEventsPositions(event);
this.inicializeNowIndicator();
this.changeDetectionRef.detectChanges();
this.indexRowSelected = null;
}));
}
ngOnInit() { }
ngAfterViewInit() { }
ngOnChanges(changes) {
if (changes['currentDate'] !== undefined) {
this.workScaleService.currentDate = changes['currentDate'].currentValue;
this.indexRowSelected = null;
this.eventService.getEventsOfDay();
}
if (changes['workScale'] !== undefined) {
this.indexRowSelected = null;
this.workScaleService.reload(changes['workScale'].currentValue);
}
if (changes['events'] !== undefined) {
this.createWorkScaleByEvents(changes['events'].currentValue, this.workScale);
this.indexRowSelected = null;
this.eventService.loadEvents(changes['events'].currentValue);
this.eventService.getEventsOfDay();
}
this.changeDetectionRef.detectChanges();
}
rowDbClick(time, index, periodIndex) {
const workScaleInterval = this.workScaleService.workScale[periodIndex].interval;
const minutesToStart = index > 0 ? (workScaleInterval / this.slotSettings.slotCount) * (index) : 0;
const minutesToEnd = (workScaleInterval / this.slotSettings.slotCount) * (index + 1);
this.onRowDbClick.emit({
start: new Date(time).setMinutes(new Date(time).getMinutes() + minutesToStart),
end: new Date(time).setMinutes(new Date(time).getMinutes() + minutesToEnd),
});
}
rowClick(time, index, periodIndex, scheduleRow) {
const workScaleInterval = this.workScaleService.workScale[periodIndex].interval;
const minutesToStart = index > 0 ? (workScaleInterval / this.slotSettings.slotCount) * (index) : 0;
const minutesToEnd = (workScaleInterval / this.slotSettings.slotCount) * (index + 1);
this.indexRowSelected = scheduleRow.getAttribute('data-row-index');
this.onRowClick.emit({
start: new Date(time).setMinutes(new Date(time).getMinutes() + minutesToStart),
end: new Date(time).setMinutes(new Date(time).getMinutes() + minutesToEnd),
});
}
inicializeNowIndicator() {
// this.nowIndicatorPositionTop = this.showNowIndicator ? this.generateEvents.convertMillisecondsToPixel() : -1000;
this.changeDetectionRef.detectChanges();
}
generateEventsPositions(events) {
if (events !== undefined) {
this.generateEvents.initializeArray(this.workScaleService.workScaleInMileseconds, this.scheduleSlats);
this.eventsWithPositions = this.generateEvents.with(events);
}
}
createWorkScaleByEvents(events, workScale) {
if (workScale && workScale.length > 0) {
const scales = workScale.filter(work => work.expansed === undefined);
for (let i = 0; i <= events.length - 1; i++) {
workScale.forEach((value, workScaleIndex, array) => {
const eventStartDate = new Date(events[i].date.start).setSeconds(0, 0);
const eventEndDate = new Date(events[i].date.end).setSeconds(0, 0);
const workStartDate = this.workScaleService.transformHourToMileseconds(scales[workScaleIndex].start, new Date(eventStartDate));
const workEndDate = this.workScaleService.transformHourToMileseconds(scales[workScaleIndex].end, new Date(eventEndDate));
// Handle Overflow in BEFORE workScale
if ((eventEndDate >= workEndDate && eventStartDate >= workEndDate) ||
(eventEndDate >= workEndDate && eventStartDate <= workEndDate)) {
if (workScale.length - 1 === workScaleIndex) {
scales.push({
start: this.workScaleService.transformMilesecondsToHour(workEndDate),
end: this.workScaleService.transformMilesecondsToHour(eventEndDate),
interval: (scales[workScaleIndex].interval),
expansed: true,
});
}
}
// Handle Overflow in AFTER workScale
if ((eventEndDate <= workStartDate && eventStartDate <= workStartDate) ||
(eventEndDate <= workStartDate && eventStartDate >= workStartDate)) {
if (workScaleIndex === 0) {
scales.push({
start: this.workScaleService.transformMilesecondsToHour(eventStartDate),
end: this.workScaleService.transformMilesecondsToHour(workStartDate),
interval: (scales[workScaleIndex].interval),
expansed: true,
});
}
}
});
}
this.workScaleService.reload(this.addMiddleScales(events, this.reduceScales(scales)));
}
}
addMiddleScales(events, workScale) {
const scales = workScale.filter(work => work);
for (let workScaleIndex = 0; workScaleIndex < workScale.length - 1; workScaleIndex++) {
for (let e = 0; e <= events.length - 1; e++) {
const eventStartDate = new Date(events[e].date.start).setSeconds(0, 0);
const eventEndDate = new Date(events[e].date.end).setSeconds(0, 0);
const workStartDate = this.workScaleService.transformHourToMileseconds(workScale[workScaleIndex].end, new Date(eventStartDate));
const workEndDate = this.workScaleService.transformHourToMileseconds(workScale[workScaleIndex + 1].start, new Date(eventEndDate));
// Horario de inicio dentro do intervalo
if (eventStartDate >= workStartDate && eventStartDate <= workEndDate) {
scales.push({
start: workScale[workScaleIndex].end,
end: workScale[workScaleIndex + 1].start,
interval: workScale[workScaleIndex].interval,
expansed: true,
middle: true,
});
break;
}
// Horario de fim dentro do intervalo
if (eventEndDate >= workStartDate && eventEndDate <= workEndDate) {
scales.push({
start: workScale[workScaleIndex].end,
end: workScale[workScaleIndex + 1].start,
interval: workScale[workScaleIndex].interval,
expansed: true,
middle: true,
});
break;
}
}
}
return this.reduceScales(scales);
}
reduceScales(scales) {
const orderedScales = this.sortScaleByStart(scales);
const notExpansedScales = orderedScales.filter((scale) => !scale.expansed);
const middleHourScale = orderedScales.filter((scale) => scale.middle);
const beforeHourScale = this.reduceBeforeScale(orderedScales);
const afterHourScale = this.reduceAfterScale(orderedScales);
return this.sortScaleByStart(this.removeNextSameStartAndEndSacalesTime(this.removeSameStartAndEndSacalesTime(notExpansedScales.concat(afterHourScale).concat(middleHourScale).concat(beforeHourScale))));
}
removeSameStartAndEndSacalesTime(scales) {
return this.sortScaleByStart(scales).filter((value => value.start !== value.end));
}
removeNextSameStartAndEndSacalesTime(scales) {
return this.sortScaleByStart(scales).filter((value, index, array) => {
if (array[index - 1]) {
return value.start !== array[index - 1].start && value.end !== array[index - 1].end;
}
return true;
});
}
reduceBeforeScale(scales) {
return scales.reduce((previous, current) => {
const cStart = this.workScaleService.transformHourToMileseconds(current.start);
const pStart = this.workScaleService.transformHourToMileseconds(previous.start);
if (cStart < pStart) {
return { ...current, start: current.start };
}
const cEnd = this.workScaleService.transformHourToMileseconds(current.end);
const pEnd = this.workScaleService.transformHourToMileseconds(previous.end);
if (cEnd < pEnd) {
return { ...current, end: current.end };
}
return previous;
}, { end: '23:59', start: '23:59', interval: 0, expansed: null });
}
reduceAfterScale(scales) {
return scales.reduce((previous, current) => {
const cStart = this.workScaleService.transformHourToMileseconds(current.start);
const pStart = this.workScaleService.transformHourToMileseconds(previous.start);
if (cStart > pStart) {
return { ...current, start: current.start };
}
const cEnd = this.workScaleService.transformHourToMileseconds(current.end);
const pEnd = this.workScaleService.transformHourToMileseconds(previous.end);
if (cEnd > pEnd) {
return { ...current, end: current.end };
}
return previous;
}, { end: '01:00', start: '01:00', interval: 0, expansed: null });
}
sortScaleByStart(scales) {
return scales.sort((scaleA, scaleB) => {
return this.workScaleService.transformHourToMileseconds(scaleA.start) -
this.workScaleService.transformHourToMileseconds(scaleB.start);
});
}
ngOnDestroy() {
this.subscriptions.unsubscribe();
}
}
/** @nocollapse */ ViewDayComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ViewDayComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.GenerateEventsService }, { token: i2.EventService }, { token: i3.WorkScaleService }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ ViewDayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ViewDayComponent, selector: "tl-view-day", inputs: { currentDate: "currentDate", statusConfig: "statusConfig", typesConfig: "typesConfig", showNowIndicator: "showNowIndicator", slotSettings: "slotSettings", workScale: "workScale", slatNumberRowsAsArray: "slatNumberRowsAsArray", texts: "texts", events: "events" }, outputs: { onRowDbClick: "onRowDbClick", onRowClick: "onRowClick", onEventDbClick: "onEventDbClick", onEventClick: "onEventClick", onEventMouseover: "onEventMouseover", onEventMouseout: "onEventMouseout", onEventContextmenu: "onEventContextmenu" }, viewQueries: [{ propertyName: "scheduleSlats", predicate: ["scheduleSlats"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"ui-schedule-slats\"\n *ngFor=\"let times of timesCollection; let timesIndex = index; let lastTurn = last; let firstTurn = first;\">\n\n <!-- CREATE TIMES BOXES-->\n <div class=\"ui-schedule-times\">\n <div class=\"ui-schedule-time-row\"\n *ngFor=\"let time of times\"\n [ngClass]=\"{ firstTurn: firstTurn }\"\n [ngStyle]=\"{\n height: (slotSettings.slotCount * slotSettings.slotHight) + 'px',\n 'align-items': slotSettings.slotCount > 1 ? 'flex-start' : 'center'\n }\">\n <div class=\"ui-schedule-time-description\">\n <span class=\"ui-hour-detail\">{{time | date: 'HH'}}</span>:{{time | date: 'mm'}}\n </div>\n </div>\n </div>\n\n <!-- CREATE WIDGET CONTENT-->\n <div #scheduleSlats class=\"ui-schedule-widget-content\">\n <div *ngFor=\"let time of times; let last = last; let first = first;\" class=\"ui-schedule-widget-rows\">\n <div #scheduleRow class=\"ui-schedule-row\" [attr.data-row-index]=\"time.getTime() * (index+1)\" *ngFor=\"let slot of slatNumberRowsAsArray; let index = index\"\n (click)=\"rowClick( time, index, timesIndex, scheduleRow )\"\n (dblclick)=\"rowDbClick( time, index, timesIndex )\"\n [ngStyle]=\"{ height: slotSettings.slotHight + 'px' }\"\n [ngClass]=\"{ last: last, first: first, lastTurn: lastTurn, firstTurn: firstTurn }\"\n [class.selected]=\"scheduleRow?.getAttribute('data-row-index') === indexRowSelected\">\n </div>\n </div>\n </div>\n\n</div>\n<div class=\"ui-schedule-skeleton\" >\n <div class=\"ui-schedule-grid-events\">\n <div class=\"ui-schedule-list-events\">\n\n <!-- CREATE EVENTS BOXES-->\n <div class=\"ui-schedule-event-box\" [style.borderLeftWidth]=\"event?.data?.blocked ? 0 : '5px'\"\n #elementBox\n *ngFor=\"let event of eventsWithPositions; let index = index\"\n [ngStyle]=\"{\n top: event?.positions.top + 'px',\n left: event?.positions.left + 'px',\n height: event?.positions.height + 'px',\n width: event?.positions.width + 'px'\n }\"\n [style.borderLeftColor]=\"statusConfig ? statusConfig[event?.data?.status]?.color : '#FFFFFF'\"\n [tooltip]=\"{text: statusConfig ? statusConfig[event?.data?.status]?.description : '' , placement: 'top-center'}\"\n (contextmenu)=\"onEventContextmenu.emit( { event: $event, data: event?.data, element: elementBox } ); false\"\n (click)=\"onEventClick.emit( event?.data )\"\n (dblclick)=\"onEventDbClick.emit( event?.data )\"\n (mouseover)=\"onEventMouseout.emit( event?.data )\"\n (mouseout)=\"onEventMouseout.emit( event?.data )\"\n >\n <ng-container *ngIf=\"!event?.data?.blocked\">\n <div class=\"ui-schedule-event-content\">\n <div class=\"ui-event-data\">\n <div class=\"ui-event-title\">\n <span class=\"title\">{{event?.data?.title}}</span>\n <div class=\"tags\" *ngIf=\"event?.data?.tags?.length > 0 \">\n <div class=\"tag-item\" *ngFor=\"let tag of event?.data?.tags;\" [style.backgroundColor]=\"tag.color\" >\n {{tag.title}}\n </div>\n </div>\n </div>\n <div class=\"ui-event-detail\">{{event?.data?.detail}}</div>\n </div>\n <div class=\"ui-event-note\">\n {{event?.data?.note}}\n </div>\n </div>\n <div class=\"ui-event-hour\">\n <span>{{event?.data?.date?.start | date: 'HH:mm'}} - {{event?.data?.date?.end | date: 'HH:mm'}}</span>\n <span class=\"ui-event-typeconfig-description\">{{typesConfig[event?.data?.type]?.description}}</span>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"event?.data?.blocked\">\n <div class=\"ui-schedule-event-blocked\">\n <div class=\"ui-event-title\">{{event?.data?.title}}</div>\n <div class=\"ui-event-hour\">\n <tl-icon [lib]=\"'fa'\" [style]=\"'far'\">clock</tl-icon>\n {{event?.data?.date?.start | date: 'HH:mm'}} - {{event?.data?.date?.end | date: 'HH:mm'}}<br>\n </div>\n </div>\n\n </ng-container>\n </div>\n </div>\n </div>\n <!--<div class=\"ui-schedule-now-indicator ui-schedule-now-arrow\"-->\n <!--[tooltip]=\"{text: currentTime | date: 'HH:mm', placement: 'right'}\"-->\n <!--[ngStyle]=\"{top: nowIndicatorPositionTop + 'px'}\">-->\n <!--</div>-->\n</div>\n", styles: [".ui-schedule-slats{display:grid;position:relative;grid-template-columns:60px auto;border-top:1px solid #D6D6D6}.ui-schedule-times{color:#949799;font-weight:300;background-color:#fff;border-right:1px solid #D6D6D6}.ui-schedule-time-row{box-sizing:border-box;border-bottom:1px solid #D6D6D6;width:100%;display:flex;justify-content:center}.ui-schedule-time-row:last-child{border-bottom:none}.ui-schedule-time-row>.ui-schedule-time-description{display:flex;align-items:baseline}.ui-schedule-time-row>.ui-schedule-time-description .ui-hour-detail{font-weight:700;font-size:1.6em;line-height:1.5}.ui-schedule-widget-rows>.ui-schedule-row{background-color:#f5f5f5;border-bottom:1px #D6D6D6 dotted;cursor:pointer}.ui-schedule-widget-rows>.ui-schedule-row.selected{background-color:#ededed}.ui-schedule-widget-rows>.ui-schedule-row:first-child{border-bottom:1px #D6D6D6 dotted}.ui-schedule-widget-rows>.ui-schedule-row:last-child:not(.last){border-bottom:1px #D6D6D6 solid}.ui-schedule-widget-rows>.ui-schedule-row:last-child{border-bottom:none}.ui-schedule-widget-content{width:100%}.ui-schedule-widget-content .ui-schedule-row{padding-left:10px;content:\" \";box-sizing:border-box}.ui-schedule-widget-content .ui-schedule-row:hover{background-color:#ededed}.ui-schedule-skeleton>.ui-schedule-now-indicator{margin-top:-5px;position:absolute}.ui-schedule-skeleton>.ui-schedule-now-arrow{left:0;border:1px solid red;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.ui-schedule-grid-events{position:absolute;inset:0 0 0 60px;height:0}.ui-schedule-list-events{position:relative}.ui-schedule-event-box{font-family:Segoe UI,Lato,\"sans-serif\",Arial;background-color:#fff;border-radius:4px 4px 2px 2px;border-left-width:5px;border-left-color:transparent;border-left-style:solid;border-top:1px #D6D6D6 solid;border-right:1px #D6D6D6 solid;border-bottom:1px #D6D6D6 solid;-webkit-user-select:none;user-select:none;cursor:pointer;display:flex;box-sizing:border-box;position:absolute}.ui-schedule-event-content{display:flex;width:65%;flex-flow:column;place-content:space-between}.ui-schedule-event-content>.ui-event-data{padding:2px 0 0 5px;line-height:1.3em}.ui-schedule-event-content>.ui-event-data>.ui-event-title{display:flex;height:17px}.ui-schedule-event-content>.ui-event-data>.ui-event-title>.title{font-size:.9em;font-weight:600;color:#454e58;white-space:nowrap;text-overflow:ellipsis}.ui-schedule-event-content>.ui-event-data>.ui-event-title>.tags{display:flex;margin-left:10px}.ui-schedule-event-content>.ui-event-data>.ui-event-title>.tags>.tag-item{border-radius:2px;margin-right:5px;min-width:85px;height:20px;display:flex;align-items:center;justify-content:center;color:#fff;font-size:.8em;white-space:nowrap}.ui-schedule-event-content>.ui-event-data>.ui-event-detail{font-size:.85em;color:#949799;white-space:nowrap;text-overflow:ellipsis}.ui-schedule-event-content>.ui-event-note{font-size:.85em;color:#949799;white-space:nowrap;text-overflow:ellipsis;padding-left:5px}.ui-schedule-event-blocked{width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;background:repeating-linear-gradient(135deg,rgba(245,245,245,.7),rgba(245,245,245,.7) 10px,#FFFFFF 10px,#FFFFFF 20px)}.ui-schedule-event-blocked>.ui-event-title{font-size:1.1em;font-weight:600;color:#454e58;white-space:nowrap;text-overflow:ellipsis;font-variant-caps:all-petite-caps}.ui-schedule-event-blocked>.ui-event-hour{font-size:1.1em;color:#454e58;justify-content:center;margin-right:0}.ui-event-hour{color:#454e58;display:flex;font-size:.88em;justify-content:center;margin-right:10px;width:35%;flex-flow:column;align-items:flex-end}.ui-event-hour>.ui-event-typeconfig-description{font-size:.88em;font-weight:700}\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.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.TooltipDirective, selector: "[tooltip]", inputs: ["tooltip"] }, { kind: "component", type: i6.TlIcons, selector: "tl-icon", inputs: ["icon", "lib", "style", "size", "animation", "color", "align"] }, { kind: "pipe", type: i4.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ViewDayComponent, decorators: [{
type: Component,
args: [{ selector: 'tl-view-day', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ui-schedule-slats\"\n *ngFor=\"let times of timesCollection; let timesIndex = index; let lastTurn = last; let firstTurn = first;\">\n\n <!-- CREATE TIMES BOXES-->\n <div class=\"ui-schedule-times\">\n <div class=\"ui-schedule-time-row\"\n *ngFor=\"let time of times\"\n [ngClass]=\"{ firstTurn: firstTurn }\"\n [ngStyle]=\"{\n height: (slotSettings.slotCount * slotSettings.slotHight) + 'px',\n 'align-items': slotSettings.slotCount > 1 ? 'flex-start' : 'center'\n }\">\n <div class=\"ui-schedule-time-description\">\n <span class=\"ui-hour-detail\">{{time | date: 'HH'}}</span>:{{time | date: 'mm'}}\n </div>\n </div>\n </div>\n\n <!-- CREATE WIDGET CONTENT-->\n <div #scheduleSlats class=\"ui-schedule-widget-content\">\n <div *ngFor=\"let time of times; let last = last; let first = first;\" class=\"ui-schedule-widget-rows\">\n <div #scheduleRow class=\"ui-schedule-row\" [attr.data-row-index]=\"time.getTime() * (index+1)\" *ngFor=\"let slot of slatNumberRowsAsArray; let index = index\"\n (click)=\"rowClick( time, index, timesIndex, scheduleRow )\"\n (dblclick)=\"rowDbClick( time, index, timesIndex )\"\n [ngStyle]=\"{ height: slotSettings.slotHight + 'px' }\"\n [ngClass]=\"{ last: last, first: first, lastTurn: lastTurn, firstTurn: firstTurn }\"\n [class.selected]=\"scheduleRow?.getAttribute('data-row-index') === indexRowSelected\">\n </div>\n </div>\n </div>\n\n</div>\n<div class=\"ui-schedule-skeleton\" >\n <div class=\"ui-schedule-grid-events\">\n <div class=\"ui-schedule-list-events\">\n\n <!-- CREATE EVENTS BOXES-->\n <div class=\"ui-schedule-event-box\" [style.borderLeftWidth]=\"event?.data?.blocked ? 0 : '5px'\"\n #elementBox\n *ngFor=\"let event of eventsWithPositions; let index = index\"\n [ngStyle]=\"{\n top: event?.positions.top + 'px',\n left: event?.positions.left + 'px',\n height: event?.positions.height + 'px',\n width: event?.positions.width + 'px'\n }\"\n [style.borderLeftColor]=\"statusConfig ? statusConfig[event?.data?.status]?.color : '#FFFFFF'\"\n [tooltip]=\"{text: statusConfig ? statusConfig[event?.data?.status]?.description : '' , placement: 'top-center'}\"\n (contextmenu)=\"onEventContextmenu.emit( { event: $event, data: event?.data, element: elementBox } ); false\"\n (click)=\"onEventClick.emit( event?.data )\"\n (dblclick)=\"onEventDbClick.emit( event?.data )\"\n (mouseover)=\"onEventMouseout.emit( event?.data )\"\n (mouseout)=\"onEventMouseout.emit( event?.data )\"\n >\n <ng-container *ngIf=\"!event?.data?.blocked\">\n <div class=\"ui-schedule-event-content\">\n <div class=\"ui-event-data\">\n <div class=\"ui-event-title\">\n <span class=\"title\">{{event?.data?.title}}</span>\n <div class=\"tags\" *ngIf=\"event?.data?.tags?.length > 0 \">\n <div class=\"tag-item\" *ngFor=\"let tag of event?.data?.tags;\" [style.backgroundColor]=\"tag.color\" >\n {{tag.title}}\n </div>\n </div>\n </div>\n <div class=\"ui-event-detail\">{{event?.data?.detail}}</div>\n </div>\n <div class=\"ui-event-note\">\n {{event?.data?.note}}\n </div>\n </div>\n <div class=\"ui-event-hour\">\n <span>{{event?.data?.date?.start | date: 'HH:mm'}} - {{event?.data?.date?.end | date: 'HH:mm'}}</span>\n <span class=\"ui-event-typeconfig-description\">{{typesConfig[event?.data?.type]?.description}}</span>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"event?.data?.blocked\">\n <div class=\"ui-schedule-event-blocked\">\n <div class=\"ui-event-title\">{{event?.data?.title}}</div>\n <div class=\"ui-event-hour\">\n <tl-icon [lib]=\"'fa'\" [style]=\"'far'\">clock</tl-icon>\n {{event?.data?.date?.start | date: 'HH:mm'}} - {{event?.data?.date?.end | date: 'HH:mm'}}<br>\n </div>\n </div>\n\n </ng-container>\n </div>\n </div>\n </div>\n <!--<div class=\"ui-schedule-now-indicator ui-schedule-now-arrow\"-->\n <!--[tooltip]=\"{text: currentTime | date: 'HH:mm', placement: 'right'}\"-->\n <!--[ngStyle]=\"{top: nowIndicatorPositionTop + 'px'}\">-->\n <!--</div>-->\n</div>\n", styles: [".ui-schedule-slats{display:grid;position:relative;grid-template-columns:60px auto;border-top:1px solid #D6D6D6}.ui-schedule-times{color:#949799;font-weight:300;background-color:#fff;border-right:1px solid #D6D6D6}.ui-schedule-time-row{box-sizing:border-box;border-bottom:1px solid #D6D6D6;width:100%;display:flex;justify-content:center}.ui-schedule-time-row:last-child{border-bottom:none}.ui-schedule-time-row>.ui-schedule-time-description{display:flex;align-items:baseline}.ui-schedule-time-row>.ui-schedule-time-description .ui-hour-detail{font-weight:700;font-size:1.6em;line-height:1.5}.ui-schedule-widget-rows>.ui-schedule-row{background-color:#f5f5f5;border-bottom:1px #D6D6D6 dotted;cursor:pointer}.ui-schedule-widget-rows>.ui-schedule-row.selected{background-color:#ededed}.ui-schedule-widget-rows>.ui-schedule-row:first-child{border-bottom:1px #D6D6D6 dotted}.ui-schedule-widget-rows>.ui-schedule-row:last-child:not(.last){border-bottom:1px #D6D6D6 solid}.ui-schedule-widget-rows>.ui-schedule-row:last-child{border-bottom:none}.ui-schedule-widget-content{width:100%}.ui-schedule-widget-content .ui-schedule-row{padding-left:10px;content:\" \";box-sizing:border-box}.ui-schedule-widget-content .ui-schedule-row:hover{background-color:#ededed}.ui-schedule-skeleton>.ui-schedule-now-indicator{margin-top:-5px;position:absolute}.ui-schedule-skeleton>.ui-schedule-now-arrow{left:0;border:1px solid red;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.ui-schedule-grid-events{position:absolute;inset:0 0 0 60px;height:0}.ui-schedule-list-events{position:relative}.ui-schedule-event-box{font-family:Segoe UI,Lato,\"sans-serif\",Arial;background-color:#fff;border-radius:4px 4px 2px 2px;border-left-width:5px;border-left-color:transparent;border-left-style:solid;border-top:1px #D6D6D6 solid;border-right:1px #D6D6D6 solid;border-bottom:1px #D6D6D6 solid;-webkit-user-select:none;user-select:none;cursor:pointer;display:flex;box-sizing:border-box;position:absolute}.ui-schedule-event-content{display:flex;width:65%;flex-flow:column;place-content:space-between}.ui-schedule-event-content>.ui-event-data{padding:2px 0 0 5px;line-height:1.3em}.ui-schedule-event-content>.ui-event-data>.ui-event-title{display:flex;height:17px}.ui-schedule-event-content>.ui-event-data>.ui-event-title>.title{font-size:.9em;font-weight:600;color:#454e58;white-space:nowrap;text-overflow:ellipsis}.ui-schedule-event-content>.ui-event-data>.ui-event-title>.tags{display:flex;margin-left:10px}.ui-schedule-event-content>.ui-event-data>.ui-event-title>.tags>.tag-item{border-radius:2px;margin-right:5px;min-width:85px;height:20px;display:flex;align-items:center;justify-content:center;color:#fff;font-size:.8em;white-space:nowrap}.ui-schedule-event-content>.ui-event-data>.ui-event-detail{font-size:.85em;color:#949799;white-space:nowrap;text-overflow:ellipsis}.ui-schedule-event-content>.ui-event-note{font-size:.85em;color:#949799;white-space:nowrap;text-overflow:ellipsis;padding-left:5px}.ui-schedule-event-blocked{width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;background:repeating-linear-gradient(135deg,rgba(245,245,245,.7),rgba(245,245,245,.7) 10px,#FFFFFF 10px,#FFFFFF 20px)}.ui-schedule-event-blocked>.ui-event-title{font-size:1.1em;font-weight:600;color:#454e58;white-space:nowrap;text-overflow:ellipsis;font-variant-caps:all-petite-caps}.ui-schedule-event-blocked>.ui-event-hour{font-size:1.1em;color:#454e58;justify-content:center;margin-right:0}.ui-event-hour{color:#454e58;display:flex;font-size:.88em;justify-content:center;margin-right:10px;width:35%;flex-flow:column;align-items:flex-end}.ui-event-hour>.ui-event-typeconfig-description{font-size:.88em;font-weight:700}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.GenerateEventsService }, { type: i2.EventService }, { type: i3.WorkScaleService }]; }, propDecorators: { currentDate: [{
type: Input
}], statusConfig: [{
type: Input
}], typesConfig: [{
type: Input
}], showNowIndicator: [{
type: Input
}], slotSettings: [{
type: Input
}], workScale: [{
type: Input
}], slatNumberRowsAsArray: [{
type: Input
}], texts: [{
type: Input
}], events: [{
type: Input,
args: ['events']
}], scheduleSlats: [{
type: ViewChildren,
args: ['scheduleSlats']
}], onRowDbClick: [{
type: Output
}], onRowClick: [{
type: Output
}], onEventDbClick: [{
type: Output
}], onEventClick: [{
type: Output
}], onEventMouseover: [{
type: Output
}], onEventMouseout: [{
type: Output
}], onEventContextmenu: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy1kYXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1bHktdWkvc3JjL2NvbXBvbmVudHMvc2NoZWR1bGUvdmlld3MvZGF5L3ZpZXctZGF5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL3NjaGVkdWxlL3ZpZXdzL2RheS92aWV3LWRheS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUF1RCxLQUFLLEVBQ3JFLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUM1RCxNQUFNLGVBQWUsQ0FBQztBQU92QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7QUFVeEQsTUFBTSxPQUFPLGdCQUFnQjtJQW1EM0IsWUFDVSxrQkFBcUMsRUFDckMsY0FBcUMsRUFDckMsWUFBMEIsRUFDMUIsZ0JBQWtDO1FBSGxDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBbUI7UUFDckMsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBQ3JDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFyRG5DLGdCQUFXLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQU16QixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFRekIsVUFBSyxHQUFHLFlBQVksQ0FBQztRQU1wQixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFbEMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFaEMsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXBDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVB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RyxVQUFVO3NCQUFuQixNQUFNO2dCQUVHLGNBQWM7c0JBQXZCLE1BQU07Z0JBRUcsWUFBWTtzQkFBckIsTUFBTTtnQkFFRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBRUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxrQkFBa0I7c0JBQTNCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgSW5wdXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgU2ltcGxlQ2hhbmdlcyxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgT25EZXN0cm95XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2NoZWR1bGVEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vdHlwZXMvZGF0YXNvdXJjZS50eXBlJztcbmltcG9ydCB7IEdlbmVyYXRlRXZlbnRzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2dlbmVyYXRlLWV2ZW50cy5zZXJ2aWNlJztcbmltcG9ydCB7IFNsb3RTZXR0aW5nc1R5cGUgfSBmcm9tICcuLi8uLi90eXBlcy9zbG90LXNldHRpbmdzLnR5cGUnO1xuaW1wb3J0IHsgV29ya1NjYWxlVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzL3dvcmstc2NhbGUudHlwZSc7XG5pbXBvcnQgeyBFdmVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFdvcmtTY2FsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy93b3JrLXNjYWxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTY2hlZHVsZUkxOG4gfSBmcm9tICcuLi8uLi9pMThuL3NjaGVkdWxlLWkxOG4nO1xuaW1wb3J0IHsgSG9saWRheXNUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMvaG9saWRheXMudHlwZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RsLXZpZXctZGF5JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ZpZXctZGF5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdmlldy1kYXkuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG5cbn0pXG5leHBvcnQgY2xhc3MgVmlld0RheUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgpIGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTtcblxuICBASW5wdXQoKSBzdGF0dXNDb25maWc6IHtTdGF0dXNUeXBlfTtcblxuICBASW5wdXQoKSB0eXBlc0NvbmZpZzogYW55O1xuXG4gIEBJbnB1dCgpIHNob3dOb3dJbmRpY2F0b3IgPSBmYWxzZTtcblxuICBASW5wdXQoKSBzbG90U2V0dGluZ3M6IFNsb3RTZXR0aW5nc1R5cGU7XG5cbiAgQElucHV0KCkgd29ya1NjYWxlOiBXb3JrU2NhbGVUeXBlIHwgV29ya1NjYWxlVHlwZVtdO1xuXG4gIEBJbnB1dCgpIHNsYXROdW1iZXJSb3dzQXNBcnJheTogQXJyYXk8TnVtYmVyPjtcblxuICBASW5wdXQoKSB0ZXh0cyA9IFNjaGVkdWxlSTE4bjtcblxuICBASW5wdXQoJ2V2ZW50cycpIGV2ZW50czogU2NoZWR1bGVEYXRhU291cmNlW107XG5cbiAgQFZpZXdDaGlsZHJlbignc2NoZWR1bGVTbGF0cycpIHNjaGVkdWxlU2xhdHM6IFF1ZXJ5TGlzdDxhbnk+O1xuXG4gIEBPdXRwdXQoKSBvblJvd0RiQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpIG9uUm93Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpIG9uRXZlbnREYkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKSBvbkV2ZW50Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpIG9uRXZlbnRNb3VzZW92ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpIG9uRXZlbnRNb3VzZW91dCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KCkgb25FdmVudENvbnRleHRtZW51ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHB1YmxpYyBub3dJbmRpY2F0b3JQb3NpdGlvblRvcDogbnVtYmVyO1xuXG4gIHB1YmxpYyB0aW1lc0NvbGxlY3Rpb246IEFycmF5PEFycmF5PERhdGU+PjtcblxuICBwdWJsaWMgY3VycmVudFRpbWUgPSBuZXcgRGF0ZSgpO1xuXG4gIHB1YmxpYyBpbmRleFJvd1NlbGVjdGVkID0gbnVsbDtcblxuICBwdWJsaWMgZXZlbnRzV2l0aFBvc2l0aW9uczoge1xuICAgIHBvc2l0aW9uczoge2lkOiBzdHJpbmcsIHRvcDogbnVtYmVyLCBsZWZ0OiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCB3aWR0aDogbnVtYmVyfSxcbiAgICBkYXRhOiBTY2hlZHVsZURhdGFTb3VyY2VcbiAgfVtdID0gW107XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0aW9uUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGdlbmVyYXRlRXZlbnRzOiBHZW5