UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

265 lines 69.5 kB
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