truly-ui
Version:
Web Components for Desktop Applications.
345 lines • 84 kB
JavaScript
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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