UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

345 lines 84 kB
import { Component, Input, ChangeDetectionStrategy, Output, EventEmitter, ViewChildren } from '@angular/core'; import { WorkScaleType } from '../../types/work-scale.type'; 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 WeekComponent { constructor(changeDetectionRef, generateEvents, eventService, workScaleService) { this.changeDetectionRef = changeDetectionRef; this.generateEvents = generateEvents; this.eventService = eventService; this.workScaleService = workScaleService; this.currentDate = []; 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.weekEvents = []; 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() { this.initializeCurrentDate(); } initializeCurrentDate() { const currentDate = new Date(); // Obter o dia da semana (0 - domingo, 1 - segunda-feira, ..., 6 - sábado) const currentDay = currentDate.getDay(); // Calcular os dias que faltam para o próximo domingo const daysRemaining = 7 - currentDay; // Preencher o array currentDate com os dias que faltam for (let i = 0; i < daysRemaining; i++) { const date = new Date(currentDate); date.setDate(currentDate.getDate() + i); this.currentDate.push(date); } } 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.indexRowSelected = null; this.eventService.loadEvents(changes['events'].currentValue); this.eventService.getEventsOfDay(); const currentDate = this.workScaleService.currentDate; // Obter a data de início e fim da semana atual const startDate = new Date(currentDate); startDate.setDate(startDate.getDate() - startDate.getDay()); // Definir o dia da semana para o domingo startDate.setHours(0, 0, 0, 0); // Definir as horas, minutos, segundos e milissegundos para zero const endDate = new Date(startDate); endDate.setDate(startDate.getDate() + 6); // Definir o dia da semana para o sábado endDate.setHours(23, 59, 59, 999); // Definir as horas, minutos, segundos e milissegundos para o final do dia // Filtrar os eventos dentro do intervalo de datas const events = changes['events'].currentValue.filter((event) => event.date.start >= startDate && event.date.start <= endDate); // Agrupar os eventos por dia da semana const groupedEvents = events.reduce((result, event) => { const start = event.date.start; if (start instanceof Date) { const day = start.getDay(); const dayOfWeek = ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'][day]; if (!result[dayOfWeek]) { result[dayOfWeek] = { day: dayOfWeek, events: [] }; } result[dayOfWeek].events.push(event); } return result; }, {}); // Converter o objeto em um array de objetos {day: string, events: ScheduleDataSource[]} this.weekEvents = Object.keys(groupedEvents).map((dayOfWeek) => ({ day: dayOfWeek, events: groupedEvents[dayOfWeek] })); // Calcular o intervalo entre os dias da semana de cada mês const monthStart = new Date(startDate.getFullYear(), startDate.getMonth(), 1); const monthEnd = new Date(startDate.getFullYear(), startDate.getMonth() + 1, 0); this.monthInterval = `${monthStart.toLocaleDateString()} - ${monthEnd.toLocaleDateString()}`; 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); const startDate = new Date(time); startDate.setMinutes(startDate.getMinutes() + minutesToStart); const endDate = new Date(time); endDate.setMinutes(endDate.getMinutes() + minutesToEnd); const startOfWeek = startDate.getDate() - startDate.getDay() + 1; const endOfWeek = startOfWeek + 6; const startOfWeekDate = new Date(startDate.setDate(startOfWeek)); const endOfWeekDate = new Date(startDate.setDate(endOfWeek)); this.onRowDbClick.emit({ start: startOfWeekDate, end: endOfWeekDate, }); } 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'); const startDate = new Date(time); startDate.setMinutes(startDate.getMinutes() + minutesToStart); const endDate = new Date(time); endDate.setMinutes(endDate.getMinutes() + minutesToEnd); const startOfWeek = startDate.getDate() - startDate.getDay() + 1; const endOfWeek = startOfWeek + 6; const startOfWeekDate = new Date(startDate.setDate(startOfWeek)); const endOfWeekDate = new Date(startDate.setDate(endOfWeek)); this.onRowClick.emit({ start: startOfWeekDate, end: endOfWeekDate, }); } 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) { const workScale = [ // configure os valores desejados aqui new WorkScaleType('08:00', '13:30', 30), new WorkScaleType('13:30', '18:00', 60), new WorkScaleType('31:00', '36:30', 30), new WorkScaleType('36:30', '43:00', 60), new WorkScaleType('55:00', '60:30', 30), new WorkScaleType('60:30', '67:00', 60), new WorkScaleType('79:00', '84:30', 30), new WorkScaleType('84:30', '91:00', 60), new WorkScaleType('103:00', '108:30', 30), new WorkScaleType('108:30', '115:00', 60), new WorkScaleType('127:00', '132:30', 30), new WorkScaleType('132:30', '139:00', 60), new WorkScaleType('151:00', '156:30', 30), new WorkScaleType('156:30', '162:00', 60) ]; 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); eventStartDate.setSeconds(0, 0); const eventEndDate = new Date(events[i].date.end); eventEndDate.setSeconds(0, 0); const workStartDate = this.workScaleService.transformHourToMileseconds(scales[workScaleIndex].start, eventStartDate); const workEndDate = this.workScaleService.transformHourToMileseconds(scales[workScaleIndex].end, eventEndDate); if ((eventEndDate.getTime() >= workEndDate && eventStartDate.getTime() >= workEndDate) || (eventEndDate.getTime() >= workEndDate && eventStartDate.getTime() <= workEndDate)) { if (workScale.length - 1 === workScaleIndex) { scales.push({ end: this.workScaleService.transformMilesecondsToHour(eventEndDate.getTime()), start: this.workScaleService.transformMilesecondsToHour(eventStartDate.getTime()), interval: scales[workScaleIndex].interval, expansed: true, }); } } if ((eventEndDate.getTime() <= workStartDate && eventStartDate.getTime() <= workStartDate) || (eventEndDate.getTime() <= workStartDate && eventStartDate.getTime() >= workStartDate)) { if (workScaleIndex === 0) { scales.push({ end: this.workScaleService.transformMilesecondsToHour(eventEndDate.getTime()), start: this.workScaleService.transformMilesecondsToHour(eventStartDate.getTime()), 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 */ WeekComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: WeekComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.GenerateEventsService }, { token: i2.EventService }, { token: i3.WorkScaleService }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ WeekComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: WeekComponent, selector: "tl-week", inputs: { 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: 'dd/MM'}}</span><br>\n <span>{{time | date: 'HH:mm'}}</span>\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: 'dd/yy'}} - {{event?.data?.date?.end | date: 'dd/yy'}}</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: 'dd/yy'}} - {{event?.data?.date?.end | date: 'dd/yy'}}<br>\n </div>\n </div>\n\n </ng-container>\n </div>\n </div>\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:block;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: WeekComponent, decorators: [{ type: Component, args: [{ selector: 'tl-week', 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: 'dd/MM'}}</span><br>\n <span>{{time | date: 'HH:mm'}}</span>\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: 'dd/yy'}} - {{event?.data?.date?.end | date: 'dd/yy'}}</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: 'dd/yy'}} - {{event?.data?.date?.end | date: 'dd/yy'}}<br>\n </div>\n </div>\n\n </ng-container>\n </div>\n </div>\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:block;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: { 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vlay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90cnVseS11aS9zcmMvY29tcG9uZW50cy9zY2hlZHVsZS92aWV3cy93ZWVrL3dlZWsuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1bHktdWkvc3JjL2NvbXBvbmVudHMvc2NoZWR1bGUvdmlld3Mvd2Vlay93ZWVrLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQXVELEtBQUssRUFDckUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQzVELE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUc1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7QUFXeEQsTUFBTSxPQUFPLGFBQWE7SUF5RHhCLFlBQ1Usa0JBQXFDLEVBQ3JDLGNBQXFDLEVBQ3JDLFlBQTBCLEVBQzFCLGdCQUFrQztRQUhsQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW1CO1FBQ3JDLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUNyQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBM0Q1QyxnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQU1oQixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFRekIsVUFBSyxHQUFHLFlBQVksQ0FBQztRQU1wQixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFbEMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFaEMsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXBDLGlC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QztJQUVPLHVCQUF1QixDQUFDLE1BQTRCO1FBQzFELE1BQU0sU0FBUyxHQUFHO1lBQ2hCLHNDQUFzQztZQUN0QyxJQUFJLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxJQUFJLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxJQUFJLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxJQUFJLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxJQUFJLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxJQUFJLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxJQUFJLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxJQUFJLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUN6QyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUN6QyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUN6QyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUN6QyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUN6QyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQztTQUMxQyxDQUFDO1FBRUYsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMs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