{"version":3,"file":"sowatech-shared-scheduler.mjs","sources":["../../../projects/shared/scheduler/date-selectors/scheduler-month-selector/scheduler-month-selector.component.ts","../../../projects/shared/scheduler/date-selectors/scheduler-month-selector/scheduler-month-selector.component.html","../../../projects/shared/scheduler/date-selectors/scheduler-week-selector/scheduler-week-selector.component.ts","../../../projects/shared/scheduler/date-selectors/scheduler-week-selector/scheduler-week-selector.component.html","../../../projects/shared/scheduler/date-selectors/scheduler-date-selector/scheduler-date-selector.component.ts","../../../projects/shared/scheduler/date-selectors/scheduler-date-selector/scheduler-date-selector.component.html","../../../projects/shared/scheduler/scheduler-shared.ts","../../../projects/shared/scheduler/scheduler-base.ts","../../../projects/shared/scheduler/scheduler-calendar.component.ts","../../../projects/shared/scheduler/scheduler-calendar.component.html","../../../projects/shared/scheduler/scheduler-timeline.component.ts","../../../projects/shared/scheduler/scheduler-timeline.component.html","../../../projects/shared/scheduler/scheduler.module.ts","../../../projects/shared/scheduler/sowatech-shared-scheduler.ts"],"sourcesContent":["import { Component, Input, OnInit, Output, EventEmitter } from '@angular/core';\r\nimport moment from 'moment';\r\nimport 'moment/locale/de';\r\n\r\n@Component({\r\n    selector: 'scheduler-month-selector',\r\n    templateUrl: 'scheduler-month-selector.component.html',\r\n    styles: ['.month-padding {padding: 0px 4px 4px;}'],\r\n    standalone: false\r\n})\r\n\r\nexport class SchedulerMonthSelectorComponent implements OnInit {\r\n    constructor() {\r\n    }\r\n\r\n    ngOnInit() {\r\n        for (let i = 0; i < 12; i++) {\r\n            const monthName = moment(new Date(2000, i)).format('MMM');\r\n            const month = new MonthsViewModel(monthName, i);\r\n            this.months.push(month);\r\n        }\r\n        this.selectedMonthChanged();\r\n    }\r\n\r\n    public months: Array<MonthsViewModel> = new Array<MonthsViewModel>();\r\n\r\n    @Output() onChanged = new EventEmitter<SelectedMonth>();\r\n    @Input() set selectedMonth(value: SelectedMonth) {\r\n        if (value) {\r\n            this._selectedMonth.monthIndex = value.monthIndex;\r\n            this._selectedMonth.year = value.year;\r\n            this.selectedMonthChanged();\r\n        }\r\n    }\r\n\r\n    get selectedMonth(): SelectedMonth {\r\n        return this._selectedMonth;\r\n    }\r\n    private _selectedMonth: SelectedMonth = new SelectedMonth();\r\n\r\n    private _date: Date;\r\n    get date(): Date {\r\n        if (this._date)\r\n            return this._date ? this._date : this.selectedMonth.date;\r\n\r\n    }\r\n\r\n\r\n    selectMonth(monthIndex: TMonth, year?: number) {\r\n        if (this._selectedMonth.monthIndex != monthIndex || year && this._selectedMonth.year != year) {\r\n            this._selectedMonth.monthIndex = monthIndex;\r\n            if (year > 0) this._selectedMonth.year = year;\r\n            this.selectedMonthChanged();\r\n        }\r\n    }\r\n\r\n    increaseYear() {\r\n        this._selectedMonth.monthIndex = TMonth.Jan;\r\n        this._selectedMonth.year += 1;\r\n        this.selectedMonthChanged();\r\n    }\r\n\r\n    decreaseYear() {\r\n        this._selectedMonth.monthIndex = TMonth.Dec;\r\n        this._selectedMonth.year -= 1;\r\n        this.selectedMonthChanged();\r\n    }\r\n\r\n    private selectedMonthChanged() {\r\n        this._date = this._selectedMonth.date;\r\n        this.onChanged.emit(this._selectedMonth);\r\n    }\r\n}\r\n\r\nenum TMonth { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }\r\n\r\n\r\nexport class MonthsViewModel {\r\n    constructor(text: string, value: number) {\r\n        this.text = text;\r\n        this.monthIndex = value;\r\n    }\r\n    text: string;\r\n    monthIndex: number;\r\n    cssClass: string;\r\n}\r\n\r\nexport class SelectedMonth {\r\n    constructor(date: Date);\r\n    constructor(monthIndex?: TMonth, year?: number);\r\n    constructor(arg1?: any, year?: number) {\r\n        if (arg1 instanceof Date) {\r\n            const date = arg1 as Date;\r\n            this.monthIndex = date.getMonth();\r\n            this.year = date.getFullYear();\r\n        }\r\n        else {\r\n            const today = new Date();\r\n            const monthIndex = arg1;\r\n            this.monthIndex = monthIndex ? monthIndex : today.getMonth();\r\n            this.year = year ? year : today.getFullYear();\r\n        }\r\n    }\r\n    monthIndex: number;\r\n\r\n    year: number;\r\n\r\n    get date(): Date {\r\n        const startOfMonth = moment().year(this.year).month(this.monthIndex).startOf('month');\r\n        return startOfMonth.toDate();\r\n    }\r\n    get dateEndOfMonth(): Date {\r\n        const endOMonth = moment().year(this.year).month(this.monthIndex).endOf('month');\r\n        return endOMonth.toDate();\r\n    }\r\n}\r\n","<div>\r\n  <div class=\"row text-center\"><b style=\"color:#204077; font-size:xx-small;\">{{date | date: \"MMMM yyyy\"}}</b></div>\r\n  <div style=\"float:left; width:5%;\">\r\n    <button class=\"btn btn-default btn-xs\" (click)=\"decreaseYear()\" data-toggle=\"tooltip\"\r\n      title=\"{{selectedMonth.year-1}}\"><i class=\"fas fa-angle-left\"></i></button>\r\n    </div>\r\n\r\n    <div style=\"float:left; width: 90%;\">\r\n      <div class=\"btn-group btn-group-justified\">\r\n        @for (month of months; track month) {\r\n          <div class=\"btn-group\">\r\n            <button class=\"btn btn-xs top-radius\" (click)=\"selectMonth(month.monthIndex)\"\r\n              [ngClass]=\"month.monthIndex==selectedMonth.monthIndex?'btn-primary':'btn-default'\" data-toggle=\"tooltip\"\r\n              title=\"{{month.text}} {{selectedMonth.year}}\">{{month.text}}</button>\r\n          </div>\r\n        }\r\n      </div>\r\n    </div>\r\n\r\n    <div style=\"float:right; width:5%;\">\r\n      <div class=\"btn-group pull-right\">\r\n        <button class=\"btn btn-default btn-xs\" (click)=\"increaseYear()\" data-toggle=\"tooltip\"\r\n          title=\"{{selectedMonth.year+1}}\"><i class=\"fas fa-angle-right\"></i></button>\r\n        </div>\r\n      </div>\r\n    </div>\r\n","import { DatePipe } from '@angular/common';\r\nimport { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\r\nimport { LoggerService } from '@sowatech/shared/logger';\r\nimport { DropDownContainerComponent } from '@sowatech/shared/swt-controls';\r\nimport moment from 'moment';\r\nimport 'moment/locale/de';\r\nimport { AvailbleBSPositions } from 'ngx-bootstrap/positioning';\r\n\r\nconst CLASS = 'SchedulerWeekSelectorComponent';\r\n\r\n@Component({\r\n    selector: 'scheduler-week-selector',\r\n    templateUrl: 'scheduler-week-selector.component.html',\r\n    providers: [DatePipe],\r\n    styles: [\r\n        '.other-month-bar { background: #C3D2E0; height:3px; float: left; }',\r\n        '.this-month-bar { background:#6480AD; height:3px}',\r\n        '.other-month-font{ color:#8596b1; font-size:xx-small; white-space: nowrap; }',\r\n        '.this-month-font{ color:#204077; font-size:xx-small; white-space: nowrap; }',\r\n        '.top-radius { border-top-left-radius: 0px; border-top-right-radius: 0px; }'\r\n    ],\r\n    standalone: false\r\n})\r\nexport class SchedulerWeekSelectorComponent implements OnInit {\r\n    constructor(\r\n        private logger: LoggerService,\r\n    ) {\r\n        this.selectedWeek = new SelectedWeek();\r\n        this.setDate(new Date());\r\n    }\r\n\r\n    ngOnInit() {\r\n        this.logger.log(CLASS + '.ngOnInit()');\r\n        this.initWeeks(this.selectedWeek.isoWeek);\r\n        this.onInitFinished = true;\r\n    }\r\n\r\n    selectedMonth: any;\r\n    private onInitFinished = false;\r\n    private month: TMonth; // 0 - 11\r\n    private year: number;\r\n    public selectedDateInterval: Date;\r\n    public weeks: Array<WeekViewModel> = new Array<WeekViewModel>();\r\n    public monthOverview: MonthOverviewModel;\r\n    public invalidDate = false;\r\n    public previousMonthWidth: number;\r\n    public nextMonthWidth: number;\r\n    // public thisMonthWidth;\r\n\r\n\r\n    // eslint-disable-next-line @angular-eslint/no-output-on-prefix\r\n    @Output() public onChanged = new EventEmitter<SelectedWeek>();\r\n    @ViewChild('datedropdown') public datedropdown: DropDownContainerComponent;\r\n    @Input() public showDate = true;\r\n    @Input() public showCW = true;\r\n    @Input() public dateFormat: string; // DatePipe\r\n    @Input() public calendarPlacement: AvailbleBSPositions = 'top';\r\n    @Input() public set date(value: Date) {\r\n        this.setDate(value);\r\n    }\r\n    public get date(): Date { return this.selectedWeek.date; }\r\n\r\n    public setDate(value: Date) {\r\n        this.logger.log(CLASS + '.setDate: ' + moment);\r\n        const valueMoment = value ? moment(value) : moment();\r\n        this.selectedDateInterval = value;\r\n        this.year = valueMoment.isoWeekYear();\r\n        const isoWeek = valueMoment.isoWeek();\r\n        this.month = this.getMonthOfIsoweek(this.year, isoWeek);\r\n        // if (this.onInitFinished)\r\n        this.initWeeks(isoWeek);\r\n    }\r\n\r\n    public selectedDateIntervalChanged(dateIso: Date | string) {\r\n        // ! type string wird hier nicht beachtet\r\n        this.logger.log(CLASS + '.selectedDateIntervalChanged');\r\n        this.datedropdown.collapse();\r\n        this.setDate(dateIso as Date);\r\n    }\r\n\r\n    public inputValueChanged(dateIso: string) {\r\n        this.logger.log(CLASS + '.inputValueChanged');\r\n        dateIso = dateIso.substr(3, 2) + '/' + dateIso.substr(0, 2) + '/' + dateIso.substr(6, 4);\r\n        const date = new Date(dateIso);\r\n\r\n        if (moment(date).isValid()) {\r\n            this.setDate(date);\r\n            this.invalidDate = false;\r\n        }\r\n        else\r\n            this.invalidDate = true;\r\n    }\r\n\r\n    public getMonthOfIsoweek(year: number, isoWeek: number): TMonth {\r\n        const lastIsoWeek = moment().year(year).endOf('year').isoWeek();\r\n        try {\r\n            if (lastIsoWeek === isoWeek && lastIsoWeek !== 1)\r\n                return moment().year(year).isoWeek(isoWeek).startOf('isoWeek').month();\r\n            else\r\n                return moment().year(year).isoWeek(isoWeek).endOf('isoWeek').month(); //.add(TIsoWeekDay.Thu-TIsoWeekDay.Mon,\"days\")}\r\n        }\r\n        catch {\r\n            return null;\r\n        }\r\n    }\r\n\r\n    public getFirstIsoWeekOfMonth(year: number, month: TMonth): number {\r\n        this.logger.log(CLASS + '.getFirstIsoWeekOfMonth');\r\n        if (month === TMonth.Jan)\r\n            return 1;\r\n        else\r\n            return moment().year(year).month(month).startOf('month').startOf('week').isoWeek(); // Week that contains the first day of selected month\r\n    }\r\n\r\n    public getIsoWeeksOfMonth(year: number, month: TMonth): Array<number> {\r\n        this.logger.log(CLASS + '.getIsoWeeksOfMonth');\r\n        const isoWeeks = new Array<number>();\r\n        let currentMonth = month;\r\n        let isoWeek = this.getFirstIsoWeekOfMonth(year, month);\r\n        while (currentMonth === month) {\r\n            isoWeeks.push(isoWeek);\r\n            isoWeek++;\r\n            currentMonth = this.getMonthOfIsoweek(year, isoWeek);\r\n        }\r\n        return isoWeeks;\r\n    }\r\n\r\n    public initWeeks(selectIsoWeek: number) {\r\n        this.logger.log(CLASS + '.initWeeks() selectIsoWeek=' + selectIsoWeek);\r\n        const isoWeeks = this.getIsoWeeksOfMonth(this.year, this.month);\r\n        this.weeks = isoWeeks.map(isoWeek => new WeekViewModel(this.year, isoWeek));\r\n\r\n        this.selectWeek(this.year, selectIsoWeek);\r\n        const amountOfWeeks = this.weeks.length;\r\n        this.initMonthDisplay(amountOfWeeks);\r\n    }\r\n\r\n\r\n    public clickWeek(week: WeekViewModel) {\r\n        this.selectWeek(week.year, week.isoWeek);\r\n    }\r\n\r\n\r\n    public getDayWidthPercent(amountOfWeeksInMonth: number): number {\r\n        const daysPerWeek = 7;\r\n        return 100 / amountOfWeeksInMonth / daysPerWeek;\r\n    }\r\n\r\n    public getNumOfDaysOfIsoWeekNotInMonth(isoWeek: number, month: TMonth): number {\r\n        let numOfDays = 0;\r\n        for (let day = TIsoWeekDay.Mon; day <= TIsoWeekDay.Sun; day++) {\r\n            const monthOfDay = moment().year(this.year).isoWeek(isoWeek).isoWeekday(day).month();\r\n            if (monthOfDay != month)\r\n                numOfDays++;\r\n        }\r\n        return numOfDays;\r\n    }\r\n\r\n    public initMonthDisplay(amountOfWeeks: number) {\r\n        const dayWidthPercent = this.getDayWidthPercent(amountOfWeeks);\r\n\r\n        const firstWeek = this.getFirstIsoWeekOfMonth(this.year, this.month);\r\n        this.previousMonthWidth = this.getNumOfDaysOfIsoWeekNotInMonth(firstWeek, this.month) * dayWidthPercent;\r\n        const lastWeek = this.weeks[this.weeks.length - 1].isoWeek;\r\n        this.nextMonthWidth = this.month !== TMonth.Dec ? 0 : this.getNumOfDaysOfIsoWeekNotInMonth(lastWeek, TMonth.Dec) * dayWidthPercent;\r\n        // this.thisMonthWidth = 100 - this.nextMonthWidth - this.previousMonthWidth;\r\n        this.monthOverview = new MonthOverviewModel(this.year, this.month);\r\n    }\r\n\r\n    public selectedWeek: SelectedWeek;\r\n    public selectWeek(year: number, isoWeek: number) {\r\n        if (year !== this.selectedWeek.year || this.selectedWeek.isoWeek != isoWeek) {\r\n            this.logger.log(CLASS + '.selectWeek: ' + isoWeek.toString() + 'year: ' + year.toString());\r\n            this.selectedWeek.isoWeek = isoWeek;\r\n            this.selectedWeek.year = year;\r\n            this.onChanged.emit(this.selectedWeek);\r\n        }\r\n    }\r\n\r\n    public nextMonth() {\r\n        if (this.month === TMonth.Dec) {\r\n            this.month = TMonth.Jan;\r\n            this.year++;\r\n            const firstIsoWeekOfYear = 1;\r\n            this.initWeeks(firstIsoWeekOfYear);\r\n        }\r\n        else {\r\n            this.month++;\r\n            const firstIsoWeekOfMonth = this.getFirstIsoWeekOfMonth(this.year, this.month);\r\n            this.initWeeks(firstIsoWeekOfMonth);\r\n        }\r\n    }\r\n\r\n    public previousMonth() {\r\n        if (this.month === TMonth.Jan) {\r\n            this.month = TMonth.Dec;\r\n            this.year--;\r\n        }\r\n        else\r\n            this.month--;\r\n\r\n        const isoWeeks = this.getIsoWeeksOfMonth(this.year, this.month);\r\n        const lastIsoWeekOfMonth = isoWeeks[(isoWeeks.length - 1)];\r\n        this.initWeeks(lastIsoWeekOfMonth);\r\n    }\r\n}\r\n\r\nenum TMonth { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }\r\nenum TIsoWeekDay { Mon = 1, Tue = 2, Wed = 3, Thu = 4, Fri = 5, Sat = 6, Sun = 7 }\r\n\r\n\r\nexport class WeekViewModel {\r\n    constructor(year: number, isoWeek: number) {\r\n        this.isoWeek = isoWeek;\r\n        this.year = year;\r\n        this.setDate();\r\n    }\r\n\r\n    public isoWeek: number;\r\n    public year: number;\r\n    public date: Date;\r\n\r\n    private setDate() {\r\n        const startOfIsoWeek = moment().year(this.year).isoWeek(this.isoWeek).startOf('isoWeek');\r\n        this.date = startOfIsoWeek.toDate();\r\n    }\r\n}\r\n\r\nexport class SelectedWeek {\r\n    constructor(year?: number, isoWeek?: number) {\r\n        this.isoWeek = isoWeek ? isoWeek : moment().isoWeek();\r\n        this.year = year > 0 ? year : moment().isoWeekYear();\r\n    }\r\n    public isoWeek: number;\r\n    public year: number;\r\n\r\n    public get month(): number {\r\n        const lastIsoWeek = moment().year(this.year).endOf('year').isoWeek();\r\n        if (lastIsoWeek == this.isoWeek && lastIsoWeek != 1)\r\n            return moment().year(this.year).isoWeek(this.isoWeek).startOf('isoWeek').month();\r\n\r\n        else return moment().year(this.year).isoWeek(this.isoWeek).endOf('isoWeek').month();\r\n    }\r\n\r\n    public get date(): Date {\r\n        const startOfIsoWeek = moment().year(this.year).isoWeek(this.isoWeek).startOf('isoWeek');\r\n        return startOfIsoWeek.toDate();\r\n    }\r\n\r\n    public get dateEndOfWeek(): Date {\r\n        const endOfIsoWeek = moment().year(this.year).isoWeek(this.isoWeek).endOf('isoWeek');\r\n        return endOfIsoWeek.toDate();\r\n    }\r\n}\r\n\r\nexport class MonthOverviewModel {\r\n    constructor(year: number, month: TMonth) {\r\n        this.month = moment().year(year).month(month).startOf('month').toDate();\r\n\r\n        //previous Month\r\n        if (month === TMonth.Jan) {\r\n            this.previousMonth = moment().year(year - 1).month(TMonth.Dec).startOf('month').toDate();\r\n            this.dateFormatPM = 'MMM yy';\r\n        }\r\n        else {\r\n            this.previousMonth = moment().year(year).month(month - 1).startOf('month').toDate();\r\n            this.dateFormatPM = 'MMM';\r\n        }\r\n        //next Month\r\n        if (month === TMonth.Dec) {\r\n            this.nextMonth = moment().year(year + 1).month(TMonth.Jan).startOf('month').toDate();\r\n            this.dateFormatPM = 'MMM';\r\n            this.dateFormatNM = 'MMM yy';\r\n        }\r\n        else\r\n            this.nextMonth = null;\r\n    }\r\n\r\n    public month: Date;\r\n    public previousMonth: Date;\r\n    public nextMonth: Date;\r\n    public dateFormatPM: string; //previous Month\r\n    public dateFormatNM: string; //next Month\r\n}\r\n","<ng-template #popDatepicker>\r\n  <div class=\"text-center text-danger\">\r\n    @if (invalidDate) {\r\n      <small i18n=\"@@SchedulerWeekSelector.InvalidDate.dsp.Label\">Ungültiges Datum</small>\r\n    }\r\n  </div>\r\n  <!-- swt-date-picker-kalendar hält sich nicht an die Größe des containers. Die 180px ist die Weite des datePickers.\r\n  Der Dropdown-container muss so weit sein, wie der swt-date-input. -->\r\n  <swt-dropdown-container #datedropdown [id]=\"1\" width=\"180px\" alignContent=\"right\" [container]=\"'scheduler-week-selector .popover-content'\">\r\n    <swt-date-input dropdown-input (change)=\"inputValueChanged($any($event.target).value)\" [name]=\"$any(selectedDateInterval)\"\r\n      [(ngModel)]=\"selectedDateInterval\" [showErrorMessage]=\"false\">\r\n    </swt-date-input>\r\n    <swt-date-picker #swtDatePicker [name]=\"$any(selectedDateInterval)\" [(ngModel)]=\"selectedDateInterval\"\r\n      (change)=\"selectedDateIntervalChanged($event)\">\r\n    </swt-date-picker>\r\n  </swt-dropdown-container>\r\n</ng-template>\r\n\r\n<button class=\"btn btn-calendar btn-xs pull-right\" [popover]=\"popDatepicker\" [outsideClick]=\"true\"\r\n  [placement]=\"calendarPlacement\" popoverTitle=\"Datum wählen\"\r\n  i18n-popoverTitle=\"@@SchedulerWeekSelector.ChooseDate.dsp.Tooltip\" title=\"Datum wählen\"\r\n  i18n-title=\"@@SchedulerWeekSelector.ChooseDate.dsp.Tooltip\">\r\n  <i class=\"far fa-calendar-edit\"></i>\r\n</button>\r\n\r\n<div>\r\n  <div style=\"width:100%; padding-left:5%; padding-right:5%;\">\r\n    <div style=\"width:100%;\">\r\n      @if (nextMonthWidth !== 0) {\r\n        <div class=\"padding-right-xs pull-right visible-lg\"\r\n          [style.width.%]=\"nextMonthWidth\">\r\n          <b class=\"other-month-font\">{{monthOverview.nextMonth | date:monthOverview.dateFormatNM}}</b>\r\n        </div>\r\n      }\r\n      <div class=\"padding-right-xs pull-left  visible-lg\" [style.width.%]=\"previousMonthWidth\">\r\n        @if (previousMonthWidth !== 0) {\r\n          <b class=\"other-month-font\">{{monthOverview.previousMonth |\r\n          date:monthOverview.dateFormatPM}}</b>\r\n        }\r\n      </div>\r\n      <div><b class=\"this-month-font m-l-xs\">{{monthOverview.month | date: \"MMMM yyyy\"}}</b></div>\r\n    </div>\r\n    <div style=\"width:100%; padding-right:1px\">\r\n      <div class=\"other-month-bar pull-right\" [style.width.%]=nextMonthWidth></div>\r\n      <div class=\"other-month-bar\" [style.width.%]=previousMonthWidth></div>\r\n      <div class=\"this-month-bar\"></div>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div style=\"width:100%\">\r\n  <div style=\"width:5%; float:left;\">\r\n    <div class=\"btn-group\">\r\n      <button class=\"btn btn-default btn-xs\" (click)=\"previousMonth()\" placement=\"auto\">\r\n        <i class=\"fa fa-angle-left\"></i>\r\n      </button>\r\n    </div>\r\n  </div>\r\n  <div style=\"width:90%; float:left;\">\r\n    <div class=\"btn-group btn-group-justified\">\r\n      @for (week of weeks; track week) {\r\n        <div class=\"btn-group\">\r\n          <button class=\"btn btn-xs top-radius\" (click)=\"clickWeek(week)\"\r\n            [ngClass]=\"week.isoWeek === selectedWeek.isoWeek ? 'btn-primary' : 'btn-default'\"\r\n            data-toggle=\"tooltip\" title=\"{{week.date|date:'shortDate'}}\">\r\n            <span\r\n              [ngClass]=\"{'hidden-md' : showCW && showDate, 'visible-xs visible-sm' : !showCW && showDate, 'visible-xs' : !showCW}\">\r\n              KW {{week.isoWeek}}\r\n            </span>\r\n            @if (showDate) {\r\n              <span class=\"hidden-xs hidden-sm\">{{week.date|date:dateFormat}}</span>\r\n            }\r\n          </button>\r\n        </div>\r\n      }\r\n    </div>\r\n  </div>\r\n  <div style=\"width:5%; float:right;\">\r\n    <div class=\"btn-group pull-right\">\r\n      <button class=\"btn btn-default btn-xs\" (click)=\"nextMonth()\"><i class=\"fa fa-angle-right\"></i></button>\r\n    </div>\r\n  </div>\r\n</div>\r\n","import { OnInit, Component, Input, EventEmitter, Output, ViewChild, computed, signal, booleanAttribute } from '@angular/core';\r\nimport { LoggerService } from '@sowatech/shared/logger';\r\nimport moment from 'moment';\r\nimport { AvailbleBSPositions } from 'ngx-bootstrap/positioning';\r\n\r\nimport { SelectedMonth } from '../scheduler-month-selector/scheduler-month-selector.component';\r\nimport { SelectedWeek, SchedulerWeekSelectorComponent } from '../scheduler-week-selector/scheduler-week-selector.component';\r\n\r\nimport 'moment/locale/de';\r\n\r\nconst CLASS = 'SchedulerDateSelectorComponent';\r\n\r\n@Component({\r\n    selector: 'scheduler-date-selector',\r\n    templateUrl: 'scheduler-date-selector.component.html',\r\n    standalone: false\r\n})\r\nexport class SchedulerDateSelectorComponent implements OnInit {\r\n    public dateOfStartTimeFrame: Date = new Date();\r\n    public dateOfEndTimeFrame: Date = new Date();\r\n\r\n    // inputs specifically for WEEKselector\r\n    @Input() public showDate: boolean;\r\n    @Input() public showCW: boolean;\r\n    @Input() public dateFormat = 'MMM dd';\r\n    @Input() public selector: 'week' | 'month';\r\n    @Input() public calendarPlacement: AvailbleBSPositions = 'top';\r\n    @Input() public allowUserSwitch = false; // allows User to switch between both selectors\r\n    @Input({ transform: booleanAttribute }) public showTodayButton = false;\r\n\r\n    @Input() public set date(value: Date) {\r\n        if (!value) return;\r\n        this.setSelectedDate(value);\r\n        const valueMoment = moment(value);\r\n        this.setSelectedMonth(valueMoment.year(), valueMoment.month());\r\n        this.initDateTimeFrames();\r\n    }\r\n    public get date(): Date { return this.dateSignal(); }\r\n\r\n    private dateSignal = signal(new Date());\r\n\r\n    private _selectedMonth: SelectedMonth;\r\n    @Input() public set selectedMonth(value: SelectedMonth) {\r\n        if (!value) return;\r\n        this.setSelectedMonth(value.year, value.monthIndex);\r\n        this.setSelectedDate(value.date);\r\n        this.initDateTimeFrames();\r\n    }\r\n    public get selectedMonth(): SelectedMonth { return this._selectedMonth; }\r\n\r\n    @Output() public onChangedDate = new EventEmitter<SelectedWeek | SelectedMonth>();\r\n    @Output() public onChangedSelector = new EventEmitter<'week' | 'month'>();\r\n\r\n    @ViewChild('weekSelector') protected weekSelector: SchedulerWeekSelectorComponent;\r\n\r\n    constructor(private logger: LoggerService) { }\r\n\r\n    ngOnInit() {\r\n        setTimeout(() => {\r\n            this.initDateTimeFrames();\r\n        }, 0);\r\n    }\r\n\r\n    private initDateTimeFrames() {\r\n        if (this.selector === 'week')\r\n            this.setDateTimeFrames(this.weekSelector.selectedWeek.date, this.weekSelector.selectedWeek.dateEndOfWeek);\r\n        if (this.selector === 'month')\r\n            this.setDateTimeFrames(this.selectedMonth.date, this.selectedMonth.dateEndOfMonth);\r\n    }\r\n\r\n    private setSelectedMonth(year: number, monthIndex: number) {\r\n        this.logger.log(CLASS + '.setSelectedMonth');\r\n        this._selectedMonth = new SelectedMonth(monthIndex, year);\r\n    }\r\n\r\n    private setSelectedDate(date: Date) {\r\n        this.dateSignal.set(date);\r\n    }\r\n\r\n    protected setDateToToday() {\r\n        this.date = new Date();\r\n    }\r\n\r\n    protected isToday = computed(() => {\r\n        const dateAsMoment = moment(this.date);\r\n        const today = moment(new Date());\r\n        if (this.selector === 'week')\r\n            return dateAsMoment.isoWeek() === today.isoWeek() && dateAsMoment.year() === today.year();\r\n        else\r\n            return dateAsMoment.month() === today.month() && dateAsMoment.year() === today.year();\r\n    });\r\n\r\n\r\n\r\n    public toggleSelector() {\r\n        this.logger.log(CLASS + '.toggleSelector');\r\n        if (this.selector === 'week')\r\n            this.selector = 'month';\r\n\r\n        else this.selector = 'week';\r\n        this.onChangedSelector.emit(this.selector);\r\n    }\r\n\r\n    private setDateTimeFrames(startTime: Date, endTime) {\r\n        this.dateOfStartTimeFrame = startTime;\r\n        this.dateOfEndTimeFrame = endTime;\r\n    }\r\n\r\n    public onChangedWeek(selectedWeek: SelectedWeek) {\r\n        this.logger.log(CLASS + '.onChangedWeek');\r\n        this.setDateTimeFrames(selectedWeek.date, selectedWeek.dateEndOfWeek);\r\n        this.setSelectedDate(selectedWeek.date);\r\n        this.setSelectedMonth(selectedWeek.year, selectedWeek.month);\r\n        this.onChangedDate.emit(selectedWeek);\r\n    }\r\n\r\n    public onChangedMonth(selectedMonth: SelectedMonth) {\r\n        this.logger.log(CLASS + '.onChangedMonth');\r\n        this.setDateTimeFrames(selectedMonth.date, selectedMonth.dateEndOfMonth);\r\n        this.setSelectedDate(selectedMonth.date);\r\n        this.onChangedDate.emit(selectedMonth);\r\n    }\r\n}\r\n","@if (allowUserSwitch) {\r\n  <button class=\"btn btn-calendar btn-xs pull-right\" (click)=\"toggleSelector()\">\r\n    @if (selector === 'month') {\r\n      <i class=\"far fa-calendar-week\" title=\"zur Wochenansicht\"\r\n      i18n-title=\"@@SchedulerDateSelector.ToWeekView.act.Tooltip\"></i>\r\n    }\r\n    @if (selector === 'week') {\r\n      <i class=\"far fa-calendar-alt\" title=\"zur Monatsansicht\"\r\n      i18n-title=\"@@SchedulerDateSelector.ToMonthView.act.Tooltip\"></i>\r\n    }\r\n  </button>\r\n}\r\n@if (showTodayButton) {\r\n  <button class=\"btn btn-calendar btn-xs pull-right\" (click)=\"setDateToToday()\">\r\n    <i  [ngClass]=\"isToday() ? 'fas fa-calendar-check' : 'far fa-calendar-check'\" title=\"auf heute wechseln\"\r\n    i18n-title=\"@@SchedulerDateSelector.ToToday.act.Tooltip\"></i>\r\n  </button>\r\n}\r\n@if (selector === 'month') {\r\n  <scheduler-month-selector [selectedMonth]=\"selectedMonth\"\r\n  (onChanged)=\"onChangedMonth($event)\"></scheduler-month-selector>\r\n}\r\n@if (selector === 'week') {\r\n  <scheduler-week-selector #weekSelector [dateFormat]=\"dateFormat\" [date]=\"date\" [showCW]=\"showCW\"\r\n  [showDate]=\"showDate\" (onChanged)=\"onChangedWeek($event)\" [calendarPlacement]=\"calendarPlacement\"></scheduler-week-selector>\r\n}\r\n","import moment, { Moment, unitOfTime } from 'moment';\r\n\r\nimport 'moment/locale/de';\r\nimport { TDestRowType } from './types/dest-row.type';\r\nimport { TSchedulerVariantType } from './types/scheduler-variant.type';\r\n\r\n//enum DayOfWeek { Sun = 0, Mon = 1, Tue = 2, Wed = 3, Thu = 4, Fri = 5, Sat = 6 };\r\n\r\nexport class MonthItem {\r\n    constructor(monthMoment: moment.Moment, numOfSlots?: number) {\r\n        this.dateIso = monthMoment.startOf('month').toISOString();\r\n        const monthNameFormat = 'MMM YYYY';\r\n        this.name = monthMoment.format(monthNameFormat);\r\n        this.class = 'month-' + (monthMoment.month() + 1).toString();\r\n        this.numOfSlots = numOfSlots ? numOfSlots : monthMoment.daysInMonth();\r\n    }\r\n    dateIso: string;\r\n    name: string;\r\n    class: string;\r\n    numOfSlots: number;\r\n}\r\n\r\nexport class DayItem {\r\n    constructor(dayMoment: moment.Moment, numOfSlots = 1, dayNameFormat = 'dd') {\r\n        this.dateOfDay = dayMoment.startOf('day').toDate();\r\n        this.dateIso = dayMoment.startOf('day').toISOString();\r\n        //let dayNameFormat = \"dd DD\";\r\n        this.name = dayMoment.format(dayNameFormat);\r\n        this.class = 'day-' + (dayMoment.day()).toString();\r\n        this.numOfSlots = numOfSlots;\r\n    }\r\n    dateOfDay: Date;\r\n    dateIso: string;\r\n    name: string;\r\n    class: string;\r\n    numOfSlots: number;\r\n}\r\n\r\nexport class TimeLineSlotHeader {\r\n    public timeStart: Moment;\r\n    public timeEnd: Moment;\r\n    public slotSpan: number;\r\n    public text: string;\r\n    public timeInfoTitle: string;\r\n    public cssClass: string;\r\n    public cellInfoTitle: string;\r\n\r\n    constructor(timeStart: Moment, public timelineSlotUnitOfTime: unitOfTime.Diff, colspan = 1) {\r\n        this.timeStart = timeStart.clone();\r\n        this.timeEnd = timeStart.clone();\r\n        this.slotSpan = colspan;\r\n        this.text = (timelineSlotUnitOfTime === 'hours') ? timeStart.format('HH') : timeStart.format('DD');\r\n        this.timeInfoTitle = (timelineSlotUnitOfTime === 'hours') ? timeStart.format('dd DD.MM HH:mm') : timeStart.format('dd DD.MM');\r\n    }\r\n\r\n    public appendCellData(cssClass: string, cellTitle: string) {\r\n        this.cssClass += ' ' + cssClass;\r\n        this.cellInfoTitle += cellTitle != null ? ' ' + cellTitle : '';\r\n    }\r\n\r\n    public setNewEndTime(timeEnd: Moment) {\r\n        this.timeEnd = timeEnd.clone();\r\n        this.text = `${this.timeStart.hour()} - ${timeEnd.hour()}`;\r\n        const timeF = 'HH:mm';\r\n        this.timeInfoTitle = `${this.timeStart.format('dd DD.MM')} ${this.timeStart.format(timeF)} - ${timeEnd.format(timeF)}`;\r\n    }\r\n\r\n    public isEndOfDay(visibleHoursUntil: number) {\r\n        return (this.timelineSlotUnitOfTime === 'hours') && this.timeEnd.hour() + 1 === visibleHoursUntil;\r\n    }\r\n\r\n    public get title() {\r\n        return (this.timeInfoTitle ?? '') + ' ' + (this.cellInfoTitle ?? '');\r\n    }\r\n}\r\n\r\n//Basically columns of a grid. The column owns the cellData which u can access with the resourceId(rowId)\r\nexport class TimeLineSlot {\r\n    constructor(\r\n        slotMoment: moment.Moment,\r\n        private timelineSlotUnitOfTime: moment.unitOfTime.Diff) {\r\n        this.slotMoment = slotMoment.clone();\r\n\r\n        this.nameOfDay = slotMoment.format('dd');\r\n        switch (timelineSlotUnitOfTime) {\r\n            case 'hours':\r\n                this.headerText = slotMoment.format('HH');\r\n                this.headerTitle = slotMoment.format('dd DD.MM. HH:mm');\r\n                break;\r\n            default:\r\n                this.headerText = slotMoment.format('DD');\r\n                this.headerTitle = slotMoment.format('dd DD.MM.');\r\n                break;\r\n        }\r\n\r\n        this.slotDateTimeIso = slotMoment.toISOString();\r\n        this.slotDateIso = slotMoment.startOf('day').toISOString();\r\n        this.class = 'day-of-week-' + slotMoment.toDate().getDay();\r\n        this.class += ' month-' + (slotMoment.month() + 1).toString();\r\n        this.cells = {};\r\n    }\r\n\r\n    private slotMoment: moment.Moment;\r\n\r\n    private get slotEndMoment(): moment.Moment {\r\n        return this.slotMoment.clone().add(1, this.timelineSlotUnitOfTime);\r\n    }\r\n    public get date(): Date {\r\n        return this.slotMoment.toDate();\r\n    }\r\n\r\n    public isEndOfDay(visibleHoursUntil: number) {\r\n        return this.slotEndMoment.hour() === visibleHoursUntil;\r\n    }\r\n\r\n    public isLastSlotCell(span: number) {\r\n        return this.slotEndMoment.hour() % span === 0;\r\n    }\r\n\r\n    public headerText: string;\r\n    public headerTitle: string;\r\n    public nameOfDay: string;\r\n    public class: string;\r\n    public slotDateTimeIso: string;\r\n    public slotDateIso: string;\r\n    public isFirstSlotCell = false;\r\n    //Should probably be typed as an actual dictionary\r\n    //Per slot(column) you get access to the singular cells via resourceId(rowId). There is Cells that affect the header of a slot(column) or\r\n    //all cells within a slot(column) by using the keys 'HEADER' or 'ALL' respectively.\r\n    public cells: object; //dictionary of TimeLineSlotCell mit Zugriff via resourceId, z.B. cells[resourceId].text oder über getCell(resourceId)\r\n    public getCell(lineId: any | 'HEADER' | 'ALL'): TimeLineSlotCell {\r\n        return this.cells[lineId];\r\n    }\r\n\r\n    public getOrCreateCell(lineId: any | 'HEADER' | 'ALL'): TimeLineSlotCell {\r\n\r\n        let cell = this.getCell(lineId);\r\n        if (!cell) {\r\n            cell = new TimeLineSlotCell(lineId, null);\r\n            this.cells[lineId] = cell;\r\n        }\r\n        return cell;\r\n    }\r\n\r\n    public isSlotForDate(date: Date | string, timeLineVariant: TSchedulerVariantType): boolean {\r\n        let result = false;\r\n        let nextSlotMoment: moment.Moment;\r\n\r\n        switch (this.timelineSlotUnitOfTime) {\r\n            case 'hours':\r\n                nextSlotMoment = this.slotMoment.clone().endOf('hour');\r\n                break;\r\n            case 'days':\r\n                nextSlotMoment = this.slotMoment.clone().endOf('day');\r\n                break;\r\n            default:\r\n                throw new Error('NotImplemented timelineSlotUnitOfTime=' + this.timelineSlotUnitOfTime);\r\n        }\r\n        result = moment(date).isBetween(this.slotMoment, nextSlotMoment, null, '[]');//[] = inclusive\r\n        return result;\r\n    }\r\n\r\n    public isSlotIntersectingDateInterval(dateFrom: Date | string, dateTo: Date | string): boolean {\r\n        const result = this.slotMoment.isSameOrBefore(dateTo) && this.slotEndMoment.isAfter(dateFrom);\r\n        return result;\r\n    }\r\n\r\n    public tryFillCellData(dataItems: Array<TimelineSlotDataItem>, timeLineVariant: TSchedulerVariantType, getSlotCellLineId: (timelineSlotDataItem: TimelineSlotDataItem) => any) {\r\n        this.cells = {};\r\n        if (!dataItems) return;\r\n        for (const dataItem of dataItems) {\r\n            if (this.isSlotForDate(dataItem.date, timeLineVariant)) {\r\n                const lineId = getSlotCellLineId(dataItem);\r\n                let timeLineSlotCell = this.getCell(dataItem.resourceId);\r\n                if (!timeLineSlotCell)\r\n                    timeLineSlotCell = new TimeLineSlotCell(lineId, dataItem);\r\n                else\r\n                    timeLineSlotCell.add(dataItem);\r\n                //let lineId = dataItem.resourceId ? dataItem.resourceId : \"HEADER\";\r\n                this.cells[lineId] = timeLineSlotCell;\r\n            }\r\n        }\r\n    }\r\n\r\n    public headerCellTitle(): string {\r\n        let result = this.cellTitle();\r\n        //@ts-ignore\r\n        const headerCell = this.cells.HEADER;\r\n        if (headerCell && headerCell.title)\r\n            result += headerCell.title + ' ';\r\n\r\n        return result;\r\n    }\r\n\r\n    public cellTitle(lineId: any = null): string {\r\n        let result = '';\r\n        if (lineId) {\r\n            const lineCell = this.getCell(lineId);\r\n            if (lineCell && lineCell.title)\r\n                result += lineCell.title + ' ';\r\n\r\n        }\r\n        //get the class of the cell(not a cell more an info-item) that affects EVERY single cell in the slot(column)\r\n        //@ts-ignore\r\n        const allCell = this.cells.ALL;\r\n        if (allCell && allCell.title)\r\n            result += allCell.title + ' ';\r\n\r\n        return result;\r\n    }\r\n\r\n    public headerCellClass(): string {\r\n        let result = this.cellClass();\r\n        //get the class of the cell(not a cell more an info-item) that affects the Header cell of the slot(column)\r\n        //@ts-ignore\r\n        const headerCell = this.cells.HEADER;\r\n        if (headerCell && headerCell.class)\r\n            result += headerCell.class + ' ';\r\n\r\n        return result;\r\n    }\r\n\r\n    public cellClass(lineId: any = null): string {\r\n        let result = this.class + ' ';\r\n        //get the class of the cell(not a cell more an info-item) that affects EVERY single cell in the slot(column)\r\n        //@ts-ignore\r\n        const allCell = this.cells.ALL;\r\n        if (allCell && allCell.class)\r\n            result += allCell.class + ' ';\r\n\r\n\r\n        if (lineId) {\r\n            const lineCell = this.getCell(lineId);\r\n            if (lineCell && lineCell.class)\r\n                result += lineCell.class + ' ';\r\n\r\n        }\r\n        return result;\r\n    }\r\n\r\n\r\n}\r\n// is the actual cell data that you get access to over the TimeLineSlot(column) with the respective resourceId(rowId).\r\n// there is also so called \"cells\" that affect the entire slot(column) or the header of a slot(column). You can access these\r\n// via a dictionary\r\nexport class TimeLineSlotCell {\r\n    constructor(lineId: any, dataItem: TimelineSlotDataItem = null) {\r\n        if (dataItem) this.add(dataItem);\r\n        this.lineId = lineId;\r\n    }\r\n\r\n    public title = '';\r\n    public text = '';\r\n    public class = '';\r\n    public lineId: any;\r\n\r\n    public add(dataItem: TimelineSlotDataItem) {\r\n        if (dataItem.title) {\r\n            if (this.title) this.title += ' ';\r\n            this.title += dataItem.title;\r\n        }\r\n        if (dataItem.text) {\r\n            if (this.text) this.text += ' ';\r\n            this.text += dataItem.text;\r\n        }\r\n        if (dataItem.class) {\r\n            if (this.class) this.class += ' ';\r\n            this.class += 'custom-cell ' + dataItem.class;\r\n        }\r\n        this.dataItems.push(dataItem);\r\n    }\r\n\r\n    public dataItems: Array<TimelineSlotDataItem> = [];\r\n    public appointments?: Array<AppointmentModel> = [];\r\n\r\n    public addAppointment(scheduledItem: IScheduledItem) {\r\n        if (!this.appointments) this.appointments = [];\r\n        this.appointments.push(new AppointmentModel(scheduledItem, this.lineId));\r\n        this.appointments.sort((a, b) => a.start.valueOf() - b.start.valueOf());\r\n    }\r\n}\r\n\r\nexport class TimeSlotCellClickEvent {\r\n    lineId: any;\r\n    date: Date;\r\n    dataItems: Array<TimelineSlotDataItem> = [];\r\n}\r\n\r\n//Input data\r\nexport class TimelineSlotDataItem {\r\n    public resourceId?: any; // identifies the resource row, resourceId=null: =>Header Row\r\n    public date: Date;  //identifies the time slot\r\n\r\n    public class?: string; //css class will be added to class of timeslot cell\r\n    public title?: string;//title will be added to title attribute of timeslot cell\r\n    public text?: string;//text will be added to text content of timeslot cell\r\n}\r\n\r\n//---- item\r\n\r\nexport interface IScheduledItem {\r\n    start: Date | string;//DateIso\r\n    end: Date | string;//DateIso\r\n    resourceId?: string;\r\n    text?: string;\r\n    title?: string;\r\n    class?: string;\r\n    styles?: { [klass: string]: string; };\r\n    ident?: string | number;//external ident for reference\r\n    bgColor?: string;\r\n    bgStriped?: boolean;\r\n    borderWidth?: string;\r\n    borderColor?: string;\r\n}\r\n\r\nexport class ScheduledItemModel implements IScheduledItem {\r\n    public resourceId: string;\r\n    public left: number;\r\n    public width: number;\r\n    public height: number;\r\n    public top: number;\r\n    public start: Date | string;\r\n    public end: Date | string;\r\n    public text: string;\r\n    public title: string;\r\n    public class: string;\r\n    public styles: { [klasse: string]: string; };\r\n    public ident: string | number;\r\n    public cellRowIndex: number;\r\n    public bgColor?: string;\r\n    public bgStriped?: boolean;\r\n    public borderWidth?: string;\r\n    public borderColor?: string;\r\n\r\n    public get diffSeconds(): number {\r\n        return moment(this.end).diff(this.start, 'seconds');\r\n    }\r\n\r\n    public get diffDays(): number {\r\n        return moment(this.end).diff(this.start, 'days');\r\n    }\r\n}\r\n\r\nexport class ScheduledItemClickEvent {\r\n    resourceId?: any;\r\n    start: Date | string;\r\n    end: Date | string;\r\n    ident: any;\r\n    text: string;\r\n}\r\n\r\nexport class ScheduledItemDragDropEvent {\r\n\r\n    constructor(\r\n        public original: DragEvent,\r\n        item: IScheduledItem,\r\n        public destRowType: TDestRowType = null,\r\n        public destResourceId?: any,\r\n        public destStart?: Date | string,\r\n        public destEnd?: Date | string\r\n    ) {\r\n        if (item) {\r\n            this.ident = item.ident;\r\n            this.srcResourceId = item.resourceId;\r\n            this.srcStart = item.start;\r\n            this.srcEnd = item.end;\r\n        }\r\n    }\r\n\r\n\r\n    ident: any;\r\n    text: string;\r\n\r\n    srcResourceId?: any;\r\n    srcStart: Date | string;\r\n    srcEnd: Date | string;\r\n\r\n}\r\n\r\nexport class SchedulerDataTransferItem {\r\n\r\n    item: ScheduledItemModel;\r\n    offsetX: number;\r\n    offsetY: number;\r\n    slotOffset: number;\r\n\r\n    toJson(): string {\r\n        return SchedulerDataTransferItem.toJson(this);\r\n    }\r\n\r\n    static toJson(item: SchedulerDataTransferItem): string {\r\n        return JSON.stringify(item);\r\n    }\r\n\r\n    static fromJson(json: string): SchedulerDataTransferItem {\r\n        try {\r\n            const result: SchedulerDataTransferItem = json ? JSON.parse(json) : null;\r\n            if (result && result.item)\r\n                Object.setPrototypeOf(result.item, ScheduledItemModel.prototype);//weist dem deserialisierten Object die Methoden/Properties der class ScheduledItemModel zu\r\n\r\n            return result;\r\n        }\r\n        catch (error) {\r\n            console.warn(error);\r\n            return null;\r\n        }\r\n    }\r\n}\r\n//--- AppointmentModel\r\n\r\nexport class AppointmentModel {\r\n    constructor(scheduledItem: IScheduledItem, lineId: any) {\r\n        this.start = new Date(scheduledItem.start as any);\r\n        this.end = scheduledItem.end ? new Date(scheduledItem.end as any) : null;\r\n        this.text = scheduledItem.text;\r\n        this.lineId = lineId;\r\n        this.class = scheduledItem.class;\r\n        this.title = scheduledItem.title;\r\n        this.ident = scheduledItem.ident;\r\n        this.resourceId = scheduledItem.resourceId;\r\n    }\r\n    public lineId: any;\r\n    public start: Date;\r\n    public end: Date;\r\n    public text: string;\r\n    public class: string;\r\n    public title: string;\r\n    public ident: string | number;\r\n    public resourceId?: string;\r\n}\r\nenum TIsoWeekDay { Mon = 1, Tue = 2, Wed = 3, Thu = 4, Fri = 5, Sat = 6, Sun = 7 }\r\n","import 'moment/locale/de';\r\n\r\nimport { ChangeDetectorRef, Directive, EventEmitter, OnDestroy, OnInit } from '@angular/core';\r\nimport { LoggerService } from '@sowatech/shared/logger';\r\nimport moment from 'moment';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { DayItem, IScheduledItem, MonthItem, ScheduledItemClickEvent, ScheduledItemDragDropEvent, ScheduledItemModel, SchedulerDataTransferItem, TimeLineSlot, TimeLineSlotCell, TimelineSlotDataItem, TimeLineSlotHeader, TimeSlotCellClickEvent, } from './scheduler-shared';\r\nimport { TDestRowType } from './types/dest-row.type';\r\nimport { TScheduledItemsDateFormat } from './types/scheduled-items-date-format.type';\r\nimport { TSchedulerVariantType } from './types/scheduler-variant.type';\r\n\r\nexport const CELL_PADDING = 4;\r\nexport const TABLE_MARGIN_VERTICAL = 0; //6 Das Margin verschiebt ebenfalls das relative Div zum Positionieren\r\nexport const TABLE_BORDER = 1;\r\n\r\nexport type THeaderSlotSpan = 1 | 2 | 3 | 4 | 6 | 8 | 12 | 24;\r\n\r\nconst DATATRANSFER_SCHEDULERITEM = 'SchedulerItem';\r\n\r\nconst CLASS = 'SchedulerTimelineBase';\r\n\r\n@Directive()\r\nexport abstract class SchedulerTimelineBase implements OnInit, OnDestroy {\r\n    constructor(\r\n        // public locale: LocaleService,\r\n        protected logger: LoggerService,\r\n        protected changeDetectorRef: ChangeDetectorRef\r\n    ) {\r\n    }\r\n\r\n    protected subscriptions = new Array<Subscription>();\r\n    protected onInitCompleted = false;\r\n    ngOnInit() {\r\n        this.onInitCompleted = true;\r\n        this.recalcTimeLine();\r\n        this.refresh();\r\n    }\r\n\r\n    ngOnDestroy() {\r\n        for (const s of this.subscriptions)\r\n            s.unsubscribe();\r\n\r\n    }\r\n\r\n    public refresh() {\r\n        if (this.onInitCompleted) {\r\n            this.logger.log(CLASS + '.refresh()');\r\n            this.refreshTimelineSlots();\r\n            this.recalcWidthsAndHeights();\r\n            this.refreshItems();\r\n            //this.changeDetectorRef.detectChanges();//aktivieren falls changeDetection = ChangeDetectionStrategy.OnPush\r\n        }\r\n    }\r\n\r\n    public tableWidth: number = null;//1000;\r\n    protected tableCustomColumnsWidth = 0;//width for e.g. resource-columns etc. added by inherited components. this width will be substracted from the available space for timeslots\r\n\r\n    public headerHeight = 32;\r\n    private numOfHeaderRows = 1;\r\n    public headerRowHeight: number;\r\n\r\n    public headerSlotSpan = 1;\r\n\r\n    public showNameOfMonth = false;\r\n    public showNameOfDay = false;\r\n\r\n    public cellPadding: number;\r\n    public small = true;\r\n    public rowHeight = 32;\r\n\r\n    protected setVariant(value: TSchedulerVariantType) {\r\n        this.variant = value;\r\n        this.recalcTimeLine();\r\n        this.refresh();\r\n    }\r\n    protected variant: TSchedulerVariantType = 'isoWeekMonth';\r\n\r\n    protected setSlotUnitOfTime(unit: moment.unitOfTime.Diff, visibleRangeFrom?: string, visibleRangeTo?: string) {\r\n        switch (unit) {\r\n            case 'hours':\r\n                this.visibleHoursFrom = visibleRangeFrom ? +visibleRangeFrom : null;\r\n                this.visibleHoursUntil = visibleRangeTo ? +visibleRangeTo : null;\r\n                break;\r\n            case 'days':\r\n            default:\r\n                this.visibleHoursFrom = null;\r\n                this.visibleHoursUntil = null;\r\n                break;\r\n        }\r\n        this.timelineSlotUnitOfTime = unit;\r\n        this.refresh();\r\n    }\r\n    protected timelineSlotUnitOfTime: moment.unitOfTime.Diff = 'days';\r\n\r\n    //nur bei timelineSlotUnitOfTime=\"hours\"\r\n    protected visibleHoursFrom: number = null;\r\n\r\n    //nur bei timelineSlotUnitOfTime=\"hours\"\r\n    public visibleHoursUntil: number = null;\r\n\r\n    private timeLineDate: Date;\r\n    public setTimeLineDate(value: Date | string) {\r\n        const date = typeof (value) === 'string' ? new Date(value) : value;\r\n        if ((date ? date.getTime() : null) != (this.timeLineDate ? this.timeLineDate.getTime() : null)) {\r\n            this.timeLineDate = date;\r\n            this.recalcTimeLine(date);\r\n            this.refresh();\r\n        }\r\n    }\r\n    protected timeLineStartMoment: moment.Moment;\r\n    protected timeLineEndMoment: moment.Moment;\r\n\r\n    public get timeLineStart(): Date { //For External\r\n        return this.timeLineStartMoment ? this.timeLineStartMoment.toDate() : null;\r\n    }\r\n\r\n    public get timeLineEnd(): Date { //For External\r\n        return this.timeLineEndMoment ? this.timeLineEndMoment.toDate() : null;\r\n    }\r\n\r\n    public monthItems = new Array<MonthItem>(); //table header band for the currentyl shown month(s). depending on variant and first/last weekday of month 1-3 \"monthItems\" are visible\"\r\n    public dayItems = new Array<DayItem>(); //table header band for the currentyl shown day(s).\r\n\r\n    protected setSlotWidth(value: number) {\r\n        this.timeLineSlotWidth = value > 0 ? value - (CELL_PADDING * 2) - TABLE_BORDER : null;\r\n        this.recalcTimeLine();\r\n    }\r\n    public timeLineSlotWidth: number; //inner width in pixels\r\n    public get timeLineSlotOuterWidth(): number //outer width (inkl padding & border) in pixels\r\n    {\r\n        return this.timeLineSlotWidth > 0 ? this.timeLineSlotWidth + (CELL_PADDING * 2) + TABLE_BORDER : null;\r\n    }\r\n\r\n    public timeLineSlotNumber: number; //readonly. calculated num of slots\r\n    public timeLineSlotHeaders: Array<TimeLineSlotHeader> = [];\r\n    public timeLineSlots: Array<TimeLineSlot> = []; //the shown table columns, normally representing 1 day of time\r\n\r\n    //-- recalc dimensions\r\n\r\n    private recalcTimeLine(date?: Date | string) {\r\n        if (!this.onInitCompleted) {\r\n            if (date) this.timeLineStartMoment = moment(date);\r\n            return;\r\n        }\r\n\r\n        if (!date) date = this.timeLineStartMoment ? this.timeLineStartMoment.toDate() : new Date();\r\n        const startMoment = moment(date);\r\n        const startOfMonthMoment = moment(date).startOf('month');\r\n        const endOfMonthMoment = startOfMonthMoment.clone().endOf('month');\r\n        switch (this.variant) {\r\n            case 'calendarMonth':\r\n                this.timeLineStartMoment = startOfMonthMoment.clone();\r\n                this.timeLineEndMoment = endOfMonthMoment.clone();\r\n                break;\r\n            case 'isoWeekMonth':\r\n                this.timeLineStartMoment = startOfMonthMoment.clone().startOf('isoWeek');//isoWeek starts on monday\r\n                this.timeLineEndMoment = endOfMonthMoment.clone().endOf('isoWeek');\r\n                break;\r\n            case 'weekMonth':\r\n                this.timeLineStartMoment = startOfMonthMoment.clone().startOf('week');//week starts on sunday\r\n                this.timeLineEndMoment = endOfMonthMoment.clone().endOf('week');\r\n                break;\r\n            case 'isoWeek':\r\n                this.timeLineStartMoment = startMoment.clone().startOf('isoWeek');//isoWeek starts on monday\r\n                this.timeLineEndMoment = this.timeLineStartMoment.clone().endOf('isoWeek');\r\n                break;\r\n            default: throw ('Unhandled variant=' + this.variant);\r\n        }\r\n\r\n        //this.recalcMonthItems(startOfMonthMoment, endOfMonthMoment);\r\n        this.recalcWidthsAndHeights();\r\n    }\r\n\r\n    //private recalcMonthItems(startOfMonthMoment: moment.Moment, endOfMonthMoment: moment.Moment) {\r\n    //this.monthItems = [];\r\n    //let numOfDaysInLastMonth = startOfMonthMoment.diff(this.timeLineStartMoment, \"days\");\r\n    //if (numOfDaysInLastMonth > 0) {\r\n    //    let lastMonthItem = new MonthItem(this.timeLineStartMoment, numOfDaysInLastMonth);\r\n    //    this.monthItems.push(lastMonthItem);\r\n    //}\r\n\r\n    //let startOfMonthInTimeline = this.timeLineStartMoment.diff(startOfMonthMoment) > 0 ? this.timeLineStartMoment : startOfMonthMoment;\r\n    //let endOfMonthInTimeline = this.timeLineEndMoment.diff(endOfMonthMoment) > 0 ? endOfMonthMoment : this.timeLineEndMoment;\r\n    //let numOfDaysInMonth = endOfMonthInTimeline.diff(startOfMonthInTimeline, \"days\") + 1;\r\n    //let currentMonthItem = new MonthItem(startOfMonthMoment, numOfDaysInMonth);\r\n    //this.monthItems.push(currentMonthItem);\r\n\r\n    //let numOfDaysInNextMonth = this.timeLineEndMoment.diff(endOfMonthMoment, \"days\");\r\n    //if (numOfDaysInNextMonth > 0) {\r\n    //    let nextMonthItem = new MonthItem(this.timeLineEndMoment, numOfDaysInNextMonth);\r\n    //    this.monthItems.push(nextMonthItem);\r\n    //}\r\n    //}\r\n\r\n    protected recalcWidthsAndHeights() {\r\n        this.cellPadding = CELL_PADDING;\r\n\r\n        this.numOfHeaderRows = 1;\r\n        if (this.showNameOfMonth) this.numOfHeaderRows++;\r\n        if (this.showNameOfDay) this.numOfHeaderRows++;\r\n        const rowBorder = 1;\r\n        this.headerRowHeight = this.headerHeight / this.numOfHeaderRows;// - (this.numOfHeaderRows * rowBorder);\r\n\r\n        const timeLineSlotsTotalWidth = this.timeLineSlotOuterWidth > 0 ? this.timeLineSlotOuterWidth * this.timeLineSlotNumber : null;\r\n\r\n        if (timeLineSlotsTotalWidth > 0)\r\n            this.tableWidth = timeLineSlotsTotalWidth + this.tableCustomColumnsWidth + TABLE_BORDER * 2;\r\n        //this.logger.debug(CLASS + \".recalcWidthsAndHeights: slotnumber=\" + this.timeLineSlotNumber + \" tableWidth=\" + this.tableWidth);\r\n\r\n        else\r\n            this.tableWidth = null;\r\n\r\n    }\r\n\r\n    //--- TimeLineSlots --\r\n\r\n    public setSlotDataItems(values: Array<TimelineSlotDataItem>) {\r\n        this._slotDataItems = values;\r\n        this.refresh();\r\n    }\r\n    private _slotDataItems = new Array<TimelineSlotDataItem>();\r\n\r\n    //public timelineSlotDuration: number = 1;//TODO\r\n    //public timelineSlotDurationUnit: string = \"days\";//TODO\r\n\r\n\r\n    // algorithm to build the timelineslots(columns) of the gridsystem. It also builds the timelineslotheader(grid-header)\r\n    // which can span over multiple slots. The slots get their cellData assigned here. CellData is the actual cells of the grid. Some CellData\r\n    // might affect the entire column or the header of the column. Explained in cellData.\r\n    public timelineSlotsRefreshed = new EventEmitter<void>();\r\n    public refreshTimelineSlots() {\r\n        if (!this.onInitCompleted) return;\r\n\r\n        this.timeLineSlotHeaders = [];\r\n        this.timeLineSlots = [];\r\n\r\n        const slotMoments = this.buildTimelineSlotMoments();\r\n        let headerCache: TimeLineSlotHeader | undefined;\r\n        for (const slotMoment of slotMoments) {\r\n            if (slotMoment.hour() % this.headerSlotSpan === 0) {\r\n                if (headerCache) {\r\n                    this.timeLineSlotHeaders.push(headerCache);\r\n                    headerCache = undefined;\r\n                }\r\n                headerCache = new TimeLineSlotHeader(slotMoment, this.timelineSlotUnitOfTime, this.headerSlotSpan);\r\n            } else headerCache.setNewEndTime(slotMoment);\r\n\r\n            const slot = new TimeLineSlot(slotMoment, this.timelineSlotUnitOfTime);\r\n            slot.tryFillCellData(this._slotDataItems, this.variant, (arg) => this.getSlotCellLineId(arg));\r\n            this.timeLineSlots.push(slot);\r\n            headerCache.appendCellData(slot.headerCellClass(), slot.headerCellTitle());\r\n        }\r\n        if (headerCache)\r\n            this.timeLineSlotHeaders.push(headerCache);\r\n\r\n        this.timeLineSlotNumber = slotMoments.length;\r\n        this.timelineSlotsRefreshed.emit();\r\n        this.logger.debug(CLASS + '.refreshTimelineSlots: slotnumber=' + this.timeLineSlotNumber);\r\n        this.buildDayItems();\r\n        this.buildMonthItems();\r\n    }\r\n\r\n    private buildDayItems() {\r\n        this.dayItems = [];\r\n        for (const slot of this.timeLineSlots) {\r\n            const slotMomentOfDay = moment(slot.date).startOf('day');\r\n            const slotDayIso = slotMomentOfDay.toISOString();\r\n            let dayItem: DayItem = this.dayItems.find(ditem => ditem.dateIso == slotDayIso);\r\n            if (dayItem)\r\n                dayItem.numOfSlots++;\r\n\r\n            else {\r\n                const dayFormat = this.timelineSlotUnitOfTime == 'hours' ? 'ddd DD.MM.' : 'dd';\r\n                dayItem = new DayItem(slotMomentOfDay, 1, dayFormat);\r\n                this.dayItems.push(dayItem);\r\n            }\r\n        }\r\n    }\r\n\r\n    private buildMonthItems() {\r\n        this.monthItems = [];\r\n        for (const slot of this.timeLineSlots) {\r\n            const slotMomentOfMonth = moment(slot.date).startOf('month');\r\n            const slotMonthIso = slotMomentOfMonth.toISOString();\r\n            let monthItem: MonthItem = this.monthItems.find(mitem => mitem.dateIso == slotMonthIso);\r\n            if (monthItem)\r\n                monthItem.numOfSlots++;\r\n\r\n            else {\r\n                //let dayFormat = this.timelineSlotUnitOfTime == \"hours\" ? \"ddd DD.MM.\" : \"dd\";\r\n                monthItem = new MonthItem(slotMomentOfMonth, 1);\r\n                this.monthItems.push(monthItem);\r\n            }\r\n        }\r\n    }\r\n\r\n    private buildTimelineSlotMoments(): Array<moment.Moment> {\r\n        const slotMoments: Array<moment.Moment> = [];\r\n        const numOfSlots = this.timeLineEndMoment.diff(this.timeLineStartMoment, this.timelineSlotUnitOfTime) + 1;\r\n        for (let i = 0; i < numOfSlots; i++) {\r\n            const slotMoment = this.timeLineStartMoment.clone().add(i, this.timelineSlotUnitOfTime);\r\n            if (this.isVisibleSlotMoment(slotMoment))\r\n                slotMoments.push(slotMoment);\r\n\r\n        }\r\n        return slotMoments;\r\n    }\r\n\r\n    protected isVisibleSlotMoment(slotMoment: moment.Moment): boolean {\r\n        let isVisible = true;\r\n        if (this.timelineSlotUnitOfTime == 'hours') {\r\n            if (isVisible && this.visibleHoursFrom != null)\r\n                isVisible = slotMoment.hours() >= this.visibleHoursFrom;\r\n\r\n            if (isVisible && this.visibleHoursUntil != null)\r\n                isVisible = slotMoment.hours() < this.visibleHoursUntil;\r\n\r\n        }\r\n        return isVisible;\r\n    }\r\n\r\n    public cellClick = new EventEmitter<TimeSlotCellClickEvent>();\r\n    public onCellClick(event: MouseEvent, lineId: any, slot: TimeLineSlot) {\r\n        this.logger.log(CLASS + '.onCellClick');\r\n        event.stopPropagation();\r\n        const e = new TimeSlotCellClickEvent();\r\n        e.lineId = lineId;\r\n        e.date = this.getDateOfCell(slot, lineId);\r\n        const cell = slot.getCell(lineId);\r\n        e.dataItems = cell ? cell.dataItems : [];\r\n        this.cellClick.next(e);\r\n    }\r\n\r\n    protected findTimeLineSlot(arg: Date | string): TimeLineSlot {\r\n        const date: Date = typeof (arg) === 'string' ? moment(arg).toDate() : arg;\r\n        return this.timeLineSlots.find(s => s.isSlotForDate(date, this.variant));\r\n    }\r\n\r\n    protected findTimeLineSlots(argFrom: Date | string, argTo: Date | string): TimeLineSlot[] {\r\n        const dateFrom: Date = typeof (argFrom) === 'string' ? moment(argFrom).toDate() : argFrom;\r\n        const dateTo: Date = typeof (argTo) === 'string' ? moment(argTo).toDate() : argTo;\r\n\r\n        const result = new Array<TimeLineSlot>();\r\n        return this.timeLineSlots.filter(s => s.isSlotIntersectingDateInterval(dateFrom, dateTo));\r\n    }\r\n\r\n    protected findTimeLineSlotCell(date: Date | string, lineId: string | number): TimeLineSlotCell {\r\n        let cell: TimeLineSlotCell = null;\r\n        const slot = this.findTimeLineSlot(date);\r\n        if (slot)\r\n            cell = slot.getOrCreateCell(lineId);\r\n\r\n        else {\r\n            const dateString = typeof (date) === 'string' ? date as string : (date as Date).toDateString();\r\n            this.logger.warn(CLASS + '.findTimeLineSlotCell() No slot for ' + dateString);\r\n        }\r\n        return cell;\r\n    }\r\n\r\n    //--- Cell / Line Methods  --------------------------\r\n    protected getDateOfCell(slot: TimeLineSlot, lineId: string | number): Date {\r\n        //override, if more precise date of cell possible (e.g. scheduler with time-cell)\r\n        return slot.date;\r\n    }\r\n\r\n    public cellClass(slot: TimeLineSlot, lineId: string | number): string {\r\n        const clickableClass = this.itemClick.observers.length > 0 ? ' ui-clickable' : '';\r\n        return slot.cellClass(lineId) + clickableClass;\r\n    }\r\n\r\n    protected abstract getSlotCellLineId(timelineSlotDataItem: TimelineSlotDataItem): string | number;\r\n    protected abstract getSlotCellLineId(scheduledItem: IScheduledItem): string | number;\r\n\r\n    //--- ScheduledItems --------------------------\r\n\r\n    public scheduledItemsDateFormat: TScheduledItemsDateFormat = 'dateTime';\r\n    protected formatScheduledItemsDate(src: Date | string): Date | string {\r\n        let result = src;\r\n        if (src) {\r\n            switch (this.scheduledItemsDateFormat) {\r\n                case 'dateTime':\r\n                    if (typeof (src) === 'string') result = moment(src).toDate();\r\n                    break;\r\n                case 'date':\r\n                    const isoDateLength = 10;\r\n                    if (typeof (src) !== 'string' || (src as string).length > isoDateLength) result = moment(src).format('YYYY-MM-DD');\r\n                    break;\r\n                default:\r\n                    throw ($localize`:@@SchedularBase.NotImplemented.msg.Text:formatScheduledItemsDate wurde nicht implementiert für TScheduledItemsDateFormat=` + this.scheduledItemsDateFormat);\r\n            }\r\n        }\r\n        return result;\r\n    }\r\n\r\n    public scheduledItemsAsAppointments = false;//true: scheduledItems werden nicht als overlay angezeigt sondern nur die startpunkte innerhalb der zellen\r\n    public setScheduledItems(values: Array<IScheduledItem>) {\r\n        this.logger.log(CLASS + '.setScheduledItems()');\r\n        this.items = [];\r\n        this.scheduledDataItems = values ? values : [];\r\n        this.assertFixedSlotWidth();\r\n        this.refresh();\r\n        this.logger.log(CLASS + '.setScheduledItems Done');\r\n    }\r\n    protected scheduledDataItems: Array<IScheduledItem>;\r\n    public items: Array<ScheduledItemModel> = [];\r\n\r\n    private assertFixedSlotWidth() {\r\n        if (!this.scheduledItemsAsAppointments && this.scheduledDataItems.length > 0 && !this.tableWidth) {\r\n            this.logger.warn(CLASS + '.assertFixedSlotWidth(): positioning of scheduledItems need a fixed slotWidth. SlotWidth=30 will be set as default');\r\n            this.setSlotWidth(30);\r\n        }\r\n    }\r\n\r\n    public refreshItems() {\r\n        if (!this.onInitCompleted) return;\r\n        if (this.scheduledDataItems) {\r\n            if (this.scheduledItemsAsAppointments)\r\n                this.refreshCellAppointments();\r\n\r\n            else\r\n                this.refreshScheduledItems();\r\n\r\n        }\r\n    }\r\n\r\n    //override if necessary\r\n    protected refreshScheduledItems() {\r\n        this.items = [];\r\n        for (const value of this.scheduledDataItems) {\r\n            const item = this.createScheduledItemModel(value);\r\n            if (item) this.items.push(item);\r\n        }\r\n    }\r\n\r\n    protected abstract createScheduledItemModel(value: IScheduledItem): ScheduledItemModel;\r\n\r\n    public itemClick = new EventEmitter<ScheduledItemClickEvent>();\r\n    public onItemClick(event: Event, item: ScheduledItemModel) {\r\n        event.stopPropagation();\r\n        this.logger.log(CLASS + '.onItemClick');\r\n        const e = new ScheduledItemClickEvent();\r\n        e.resourceId = item.resourceId;\r\n        e.start = item.start;\r\n        e.end = item.end;\r\n        e.text = item.text;\r\n        e.ident = item.ident;\r\n        this.setItemActive(item);\r\n        this.itemClick.next(e);\r\n    }\r\n\r\n    public setItemActive(itemIdent: any);\r\n    public setItemActive(item: ScheduledItemModel);\r\n    public setItemActive(arg: any) {\r\n        let item: ScheduledItemModel;\r\n        item = typeof (arg) === 'object' ? arg : this.items.find(it => it.ident == arg);\r\n        this.clearItemActive();\r\n        if (item && item.class && !item.class.includes('active')) item.class += ' active';\r\n    }\r\n\r\n    public removeItemActive(item: ScheduledItemModel) {\r\n        item.class = item.class.replace('active', '');\r\n    }\r\n\r\n    public clearItemActive() {\r\n        for (const item of this.items)\r\n            this.removeItemActive(item);\r\n\r\n    }\r\n\r\n    //--- ScheduledItems  drag drop ------------\r\n\r\n    public itemDrop = new EventEmitter<ScheduledItemDragDropEvent>();\r\n    public itemDragStart = new EventEmitter<ScheduledItemDragDropEvent>();\r\n    public itemDragOver = new EventEmitter<ScheduledItemDragDropEvent>();\r\n    public allowDragItems: boolean;\r\n\r\n    public onItemDragStart(event: DragEvent, item: ScheduledItemModel) {\r\n        if (!this.allowDragItems) return;\r\n        this.setItemActive(item);\r\n        this.logger.log(CLASS + '.onItemDragStart');\r\n        const dragItem = new SchedulerDataTransferItem();\r\n        dragItem.item = item;\r\n        dragItem.offsetX = event.offsetX;\r\n        dragItem.offsetY = event.offsetY;\r\n        const leftClippedSlots = Math.ceil(this.timeLineStartMoment.diff(item.start, 'days'));\r\n        const clippedOffset = leftClippedSlots > 0 ? leftClippedSlots : 0;\r\n        dragItem.slotOffset = Math.floor(event.offsetX / this.timeLineSlotOuterWidth) + clippedOffset;\r\n        event.dataTransfer.setData(DATATRANSFER_SCHEDULERITEM, dragItem.toJson());\r\n        event.dataTransfer.effectAllowed = 'move';\r\n        event.dataTransfer.dropEffect = 'move';\r\n        this.itemDragStart.emit(new ScheduledItemDragDropEvent(event, item));\r\n\r\n        this.dataTransferDragItemDummy = dragItem;\r\n    }\r\n\r\n    private dataTransferDragItemDummy: SchedulerDataTransferItem;//workaround notwendig weil in html5 nur bei dragstart und bei drop zugriff auf dataTransfer.getData besteht\r\n\r\n    public onItemDragOver(event: DragEvent) {\r\n        const nodeName = (event.target as Element).nodeName;\r\n        if (nodeName == 'TD' || nodeName == 'TH') {\r\n            event.preventDefault();\r\n            if (this.itemDragOver.observers.length > 0) {\r\n                const dragItem = this.dataTransferDragItemDummy;\r\n                const eventData = this.createScheduledItemDragDropEventData(event, dragItem);\r\n                this.itemDragOver.emit(eventData);\r\n            }\r\n        }\r\n    }\r\n\r\n    public onItemDrop(event: DragEvent) {\r\n        this.logger.log(CLASS + '.onItemDrop');\r\n        const dragItem = SchedulerDataTransferItem.fromJson(event.dataTransfer.getData(DATATRANSFER_SCHEDULERITEM));\r\n        const eventData = this.createScheduledItemDragDropEventData(event, dragItem);\r\n        this.itemDrop.emit(eventData);\r\n        this.dataTransferDragItemDummy = null;\r\n    }\r\n\r\n    private createScheduledItemDragDropEventData(event: DragEvent, dragItem: SchedulerDataTransferItem): ScheduledItemDragDropEvent {\r\n        const elementAttr = this.getDropTargetAttr(event.target as Element);\r\n\r\n        if (event.type == 'dragover')\r\n            event.dataTransfer.dropEffect = elementAttr.rowType == 'body' ? 'move' : 'none';\r\n\r\n\r\n        const slotOffset = dragItem ? dragItem.slotOffset : 0;\r\n        const destStart = elementAttr.slot ? moment(elementAttr.slot.date).add(-slotOffset, 'days').toDate() : null;\r\n\r\n        const secondsTillEnd = dragItem ? dragItem.item.diffSeconds : 0;\r\n        const destEnd = destStart ? moment(destStart).clone().add(secondsTillEnd, 'seconds').toDate() : null;\r\n\r\n        const eventData = new ScheduledItemDragDropEvent(\r\n            event,\r\n            dragItem ? dragItem.item : null,\r\n            elementAttr.rowType,\r\n            elementAttr.lineId,\r\n            this.formatScheduledItemsDate(destStart),\r\n            this.formatScheduledItemsDate(destEnd));\r\n\r\n        return eventData;\r\n    }\r\n\r\n    private getDropTargetAttr(elem: Element): { slot: TimeLineSlot; lineId: number; rowType: TDestRowType; } {\r\n        //--slot\r\n        const slotIndexAttr = elem.attributes.getNamedItem('data-slot-index');\r\n        const slotIndex: number = slotIndexAttr ? +slotIndexAttr.value : null;\r\n        const slot = slotIndex >= 0 ? this.timeLineSlots[slotIndex] : null;\r\n\r\n        //--lineId\r\n        const row = elem.parentElement;\r\n        const lineIdAttr = row.attributes.getNamedItem('data-line-id');\r\n        const lineId: number = lineIdAttr ? +lineIdAttr.value : null;\r\n\r\n        let rowType: TDestRowType = null;\r\n        if (row && row.parentElement && row.parentElement.nodeName == 'TBODY') rowType = 'body';\r\n        if (row && row.className.includes('header-month')) rowType = 'header-month';\r\n        if (row && row.className.includes('header-text')) rowType = 'header-text';\r\n        if (row && row.className.includes('header-name-of-day')) rowType = 'header-name-of-day';\r\n\r\n        return { slot, lineId, rowType };\r\n    }\r\n\r\n    //--- CellAppointments --------------------\r\n\r\n    protected refreshCellAppointments() {\r\n        this.items = [];\r\n        for (const scheduledItem of this.scheduledDataItems) {\r\n            const slot = this.findTimeLineSlot(scheduledItem.start);\r\n            if (slot) {\r\n                const lineId = this.getSlotCellLineId(scheduledItem);\r\n                const cell = this.findTimeLineSlotCell(scheduledItem.start, lineId);\r\n                if (cell)\r\n                    cell.addAppointment(scheduledItem);\r\n\r\n                else\r\n                    this.logger.warn(CLASS + '.refreshCellAppointments() No cell for lineId=' + lineId);\r\n\r\n            }\r\n        }\r\n    }\r\n\r\n}\r\n","\r\nimport 'moment/locale/de';\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild, ViewEncapsulation, Inject } from '@angular/core';\r\nimport { LoggerService } from '@sowatech/shared/logger';\r\nimport { LoadingIndicatorComponent } from '@sowatech/shared/swt-controls';\r\nimport moment from 'moment';\r\n\r\nimport { CELL_PADDING, SchedulerTimelineBase, TABLE_BORDER } from './scheduler-base';\r\nimport { IScheduledItem, ScheduledItemClickEvent, ScheduledItemModel, TimeLineSlot, TimelineSlotDataItem, TimeSlotCellClickEvent } from './scheduler-shared';\r\nimport { TSchedulerVariantType } from './types/scheduler-variant.type';\r\n\r\n\r\nconst TIMELINE_SECONDS_PER_SLOT = 60 * 60 * 24;\r\nconst ITEM_MARGIN_VERTICAL = 5;\r\nconst ITEM_MARGIN_HORIZONTAL = 0;\r\n\r\n@Component({\r\n    selector: 'scheduler-calendar',\r\n    templateUrl: './scheduler-calendar.component.html',\r\n    styleUrls: ['./scheduler.scss'],\r\n    encapsulation: ViewEncapsulation.None,\r\n    changeDetection: ChangeDetectionStrategy.Default //https://angular-2-training-book.rangle.io/handout/change-detection/change_detection_strategy_onpush.html\r\n    ,\r\n    standalone: false\r\n})\r\n\r\nexport class SchedulerCalendarComponent extends SchedulerTimelineBase implements OnInit, OnDestroy {\r\n  constructor(\r\n    logger: LoggerService,\r\n    changeDetectorRef: ChangeDetectorRef\r\n  ) {\r\n    super(logger, changeDetectorRef);\r\n  }\r\n\r\n  ngOnInit() {\r\n    this.createTimeIntervals();\r\n    super.ngOnInit();\r\n  }\r\n\r\n  ngOnDestroy() {\r\n    super.ngOnDestroy();\r\n  }\r\n\r\n  @ViewChild('loadingIndicator', { static: true }) loadingIndicator: LoadingIndicatorComponent;\r\n  @Input() headerHeight: number;\r\n  @Input() small: boolean;\r\n  @Input() rowHeight: number;\r\n  @Input() showNameOfMonth: boolean;\r\n  @Input() showNameOfDay: boolean;\r\n  @Input('variant') set _variant(value: TSchedulerVariantType) {\r\n    super.setVariant(value);\r\n  }\r\n  @Input('date') set _timeLineDate(value: Date | string) {\r\n    super.setTimeLineDate(value);\r\n  }\r\n\r\n  @Input('slotWidth') set _slotWidth(value: number) {\r\n    super.setSlotWidth(value);\r\n  }\r\n  @Input('slotItems') set _slotItems(values: Array<TimelineSlotDataItem>) {\r\n    super.setSlotDataItems(values);\r\n  }\r\n  @Output() cellClick: EventEmitter<TimeSlotCellClickEvent>;\r\n  @Output() itemClick: EventEmitter<ScheduledItemClickEvent>;\r\n  @Output() timelineSlotsRefreshed: EventEmitter<void>;\r\n\r\n  @Input('scheduledItems') set _scheduledItems(values: Array<IScheduledItem>) {\r\n    super.setScheduledItems(values);\r\n  }\r\n\r\n  @Input() scheduledItemsAsAppointments = true;\r\n\r\n\r\n  protected recalcWidthsAndHeights() {\r\n    this.timeIntervalColWidth = this.timeIntervalColOuterWidth - (CELL_PADDING * 2) - TABLE_BORDER;\r\n    this.tableCustomColumnsWidth = this.timeIntervalColOuterWidth;\r\n    super.recalcWidthsAndHeights();\r\n  }\r\n\r\n  //------------------ ScheduledItems\r\n\r\n  resourceHeaderText: string;\r\n  protected createScheduledItemModel(value: IScheduledItem): ScheduledItemModel {\r\n    const item: ScheduledItemModel = null;\r\n    //  let resourceItem = this.resourceDatasource.getDataItem(value.resourceId);\r\n    //  let rowIndexOfResourceId = this.resourceDatasource.data.indexOf(resourceItem);\r\n    //  if (rowIndexOfResourceId >= 0) {\r\n    //    item = new ScheduledItemModel();\r\n    //    item.resourceId = value.resourceId;\r\n    //    item.start = value.start;\r\n    //    item.end = value.end;\r\n    //    item.height = this.rowHeight - ITEM_MARGIN_VERTICAL * 2;\r\n    //    item.left = this.date2LeftPx(value.start);\r\n    //    item.width = this.seconds2Px(moment(value.end).diff(moment(value.start), \"seconds\"));\r\n    //    item.top = this.headerHeight + this.rowHeight * rowIndexOfResourceId + ITEM_MARGIN_VERTICAL + TABLE_MARGIN_VERTICAL + TABLE_BORDER;\r\n    //  }\r\n    return item;\r\n  }\r\n\r\n  //---\r\n\r\n  @Input() showTimeIntervalColumn = true;\r\n  @Input('timeIntervalColWidth') set _timeIntervalColOuterWidth(value: number) {\r\n    this.timeIntervalColOuterWidth = value;\r\n  }\r\n  private timeIntervalColOuterWidth = 60; //incl padding & border\r\n  public timeIntervalColWidth: number; //readonly. set in recalc(). excl padding & border\r\n\r\n  @Input('timeIntervalMinutes') set _timeIntervalMinutes(value: number) {\r\n    this.timeIntervalMinutes = value;\r\n    this.createTimeIntervals();\r\n  }\r\n  private timeIntervalMinutes = 30;\r\n\r\n  @Input('timeRangeStartHour') set _timeRangeStartHour(value: number) {\r\n    this.timeRangeStartHour = value;\r\n    this.createTimeIntervals();\r\n  }\r\n  private timeRangeStartHour = 7;\r\n\r\n  @Input('timeRangeEndHour') set _timeRangeEndHour(value: number) {\r\n    this.timeRangeEndHour = value;\r\n    this.createTimeIntervals();\r\n  }\r\n  private timeRangeEndHour = 19;\r\n\r\n  public timeIntervals = new Array<TimeInterval>();\r\n\r\n  private createTimeIntervals() {\r\n    //if (!this.onInitCompleted) return;\r\n\r\n    this.timeIntervals = [];\r\n    let currentMinute = this.timeRangeStartHour * 60;\r\n    const endMinute = this.timeRangeEndHour * 60;\r\n    while (currentMinute <= endMinute) {\r\n      const interval = new TimeInterval(currentMinute);\r\n      this.timeIntervals.push(interval);\r\n      currentMinute += this.timeIntervalMinutes;\r\n    }\r\n  }\r\n\r\n  private findTimeInterval(date: Date | string): TimeInterval {\r\n    if (this.timeIntervals.length < 1) return null;\r\n    const timeValue = this.dateTime2TimeValue(date);\r\n    const nextIndex = this.timeIntervals.findIndex(t => t.ident > timeValue);\r\n    return nextIndex > 0 ? this.timeIntervals[nextIndex - 1] : this.timeIntervals[this.timeIntervals.length - 1];\r\n  }\r\n  protected getSlotCellLineId(scheduledItem: IScheduledItem): any;\r\n  protected getSlotCellLineId(timelineSlotDataItem: TimelineSlotDataItem): any;\r\n  protected getSlotCellLineId(arg1: object): any {\r\n\r\n    let timeInterval: TimeInterval;\r\n    //@ts-ignore\r\n    if (arg1.start) {\r\n      const scheduledItem: IScheduledItem = arg1 as IScheduledItem;\r\n      timeInterval = this.findTimeInterval(scheduledItem.start);\r\n    }\r\n    else {\r\n      const timelineSlotDataItem: TimelineSlotDataItem = arg1 as TimelineSlotDataItem;\r\n      timeInterval = this.findTimeInterval(timelineSlotDataItem.date);\r\n    }\r\n    return timeInterval ? timeInterval.ident : null;\r\n  }\r\n\r\n  protected getDateOfCell(slot: TimeLineSlot, lineId: any): Date {\r\n    //super.getDateOfCell(slot, lineId);\r\n    return this.timeValue2DateTime(lineId, slot.date);\r\n  }\r\n\r\n  //Hilfsfunktion (auch für extern): Numerischer Wert für die Uhrzeit eines Datums, so wie im Scheduler verwendet (= entspricht der Minute des Tages)\r\n  public dateTime2TimeValue(date: Date | string): number {\r\n    const d = typeof (date) === 'string' ? new Date(date as string) : date;\r\n    const minuteOfDay = d.getHours() * 60 + d.getMinutes();\r\n    //let minuteOfDay = moment(date).diff(moment(date).startOf(\"day\"), \"minutes\"); //liefert am tag der Zeitumstellung eine Stunde weniger als erwartet\r\n    return minuteOfDay;\r\n  }\r\n\r\n  //Hilfsfunktion (für extern): rechnet den Numerischen Wert einer Uhrzeit in ein DateTime. Erfordert dazu das Datum auf den die Uhrzeit angewendet werden soll\r\n  public timeValue2DateTime(timeValue: number, dateOfDay: Date): Date {\r\n    const hourOfDay = Math.floor(timeValue / 60);\r\n    const minuteOfLastHour = timeValue % 60;\r\n    const dateTime = new Date(dateOfDay.getFullYear(), dateOfDay.getMonth(), dateOfDay.getDate(), hourOfDay, minuteOfLastHour);\r\n    //let dateTime = moment(dateOfDay).startOf(\"day\").add(timeValue, \"minutes\").toDate();\r\n    return dateTime;\r\n  }\r\n\r\n  //Hilfsfunktion für extern: Zeitskala des calendar auf ein übergebenes Datum abbilden. Ale letztes wird DAS ENDE des letzten Intervals geliefert.\r\n  public getTimeIntervalsForDate(date: Date): Date[] {\r\n    const intervalDates = Array<Date>();\r\n    let intervalStartDate;\r\n    for (const timeInterval of this.timeIntervals) {\r\n      intervalStartDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), timeInterval.hour, timeInterval.hourMinute);\r\n      intervalDates.push(intervalStartDate);\r\n    }\r\n    const closingDate = moment(intervalStartDate).add(this.timeIntervalMinutes, 'm').toDate();//ende des letzten intervals\r\n    intervalDates.push(closingDate);\r\n    return intervalDates;\r\n  }\r\n\r\n}\r\n\r\nexport class TimeInterval {\r\n  constructor(minute: number) {\r\n    this.ident = minute;\r\n    this.hour = Math.floor(minute / 60);\r\n    this.hourMinute = minute % 60;\r\n    this.text = this.hour.toString() + ':' + (this.hourMinute < 10 ? '0' : '') + this.hourMinute.toString();\r\n  }\r\n\r\n  hour: number;\r\n  hourMinute: number;\r\n  ident: number;\r\n  text: string;\r\n}\r\n\r\n","<div style=\"position:relative;\">\r\n  <loading-indicator #loadingIndicator>\r\n    <table class=\"table table-bordered table-striped table-fixed dataTable scheduler\" [style.width.px]=\"tableWidth\"\r\n      [ngClass]=\"{'small':small,'table-condensed':small}\">\r\n      <thead>\r\n        @if (showNameOfMonth) {\r\n          <tr [style.height.px]=\"headerRowHeight\" class=\"row-header-month\">\r\n            @if (showTimeIntervalColumn) {\r\n              <th [style.paddingLeft.px]=\"cellPadding\"\r\n              [style.paddingRight.px]=\"cellPadding\" [style.width.px]=\"timeIntervalColWidth\"></th>\r\n            }\r\n            @for (monthItem of monthItems; track monthItem) {\r\n              <th [attr.colspan]=\"monthItem.numOfSlots\"\r\n                [ngClass]=\"monthItem.class\" [style.paddingLeft.px]=\"cellPadding\"\r\n              [style.paddingRight.px]=\"cellPadding\">{{monthItem.name}}</th>\r\n            }\r\n          </tr>\r\n        }\r\n        <tr [style.height.px]=\"headerRowHeight\" class=\"row-header-text\">\r\n          @if (showTimeIntervalColumn) {\r\n            <th [style.paddingLeft.px]=\"cellPadding\"\r\n              [style.paddingRight.px]=\"cellPadding\" [style.width.px]=\"timeIntervalColWidth\">\r\n            {{resourceHeaderText}}</th>\r\n          }\r\n          @for (slot of timeLineSlots; track slot) {\r\n            <th class=\"text-center\" [ngClass]=\"slot.headerCellClass()\"\r\n              [attr.title]=\"slot.headerCellTitle()+' '+slot.nameOfDay+' '+slot.headerText\"\r\n              [style.paddingLeft.px]=\"cellPadding\" [style.paddingRight.px]=\"cellPadding\"\r\n            [style.width.px]=\"timeLineSlotWidth\">{{slot.headerText}}</th>\r\n          }\r\n        </tr>\r\n        @if (showNameOfDay) {\r\n          <tr [style.height.px]=\"headerRowHeight\" class=\"row-header-name-of-day\">\r\n            @if (showTimeIntervalColumn) {\r\n              <th [style.paddingLeft.px]=\"cellPadding\"\r\n              [style.paddingRight.px]=\"cellPadding\" [style.width.px]=\"timeIntervalColWidth\"></th>\r\n            }\r\n            @for (slot of timeLineSlots; track slot) {\r\n              <th class=\"text-center\" [ngClass]=\"slot.headerCellClass()\"\r\n                [attr.title]=\"slot.headerCellTitle()+' '+slot.nameOfDay+' '+slot.headerText\"\r\n                [style.paddingLeft.px]=\"cellPadding\" [style.paddingRight.px]=\"cellPadding\"\r\n              [style.width.px]=\"timeLineSlotWidth\">{{slot.nameOfDay}}</th>\r\n            }\r\n          </tr>\r\n        }\r\n      </thead>\r\n      <tbody>\r\n        @for (interval of timeIntervals; track interval) {\r\n          <tr [style.height.px]=\"rowHeight\"\r\n            [attr.id]=\"'time-interval-'+interval.ident\">\r\n            @if (showTimeIntervalColumn) {\r\n              <td class=\"text-right\" title=\"{{interval.text}}\">{{interval.text}}\r\n              </td>\r\n            }\r\n            @for (slot of timeLineSlots; track slot) {\r\n              <td (click)=\"onCellClick($event,interval.ident,slot)\"\r\n                class=\"text-center timeline-slot\" [ngClass]=\"cellClass(slot,interval.ident)\"\r\n                [attr.title]=\"interval.text +' '+slot.cellTitle(interval.ident)\">\r\n                <span class=\"timeline-slot-inner\">{{slot.cells[interval.ident]?.text}}</span>\r\n                @if (scheduledItemsAsAppointments) {\r\n                  @for (appointment of slot.cells[interval.ident]?.appointments; track appointment) {\r\n                    <div\r\n                      (click)=\"onItemClick($event,appointment)\" class=\"timeline-appointment badge\"\r\n                      [ngClass]=\"appointment.class\" title=\"{{appointment.title}}\">\r\n                      {{appointment.text}}\r\n                    </div>\r\n                  }\r\n                }\r\n              </td>\r\n            }\r\n          </tr>\r\n        }\r\n      </tbody>\r\n    </table>\r\n    <!--<div *ngFor=\"let item of items\" class=\"timeline-item timeline-item-open-left\" [style.backgroundColor]=\"'red'\" [style.height.px]=\"item.height\" [style.top]=\"item.top.px\" [style.left]=\"item.left\" [style.width.px]=\"item.width\" (click)=\"onItemClick(item)\">\r\n    <small>{{item.resourceId}} {{item.start}}</small>\r\n  </div>-->\r\n</loading-indicator>\r\n</div>","import 'moment/locale/de';\r\n\r\nimport { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild, ViewEncapsulation, } from '@angular/core';\r\nimport { DatasourceComponent } from '@sowatech/shared/ds-datasource';\r\nimport { LoggerService } from '@sowatech/shared/logger';\r\nimport moment from 'moment';\r\nimport { NgScrollbar } from 'ngx-scrollbar';\r\nimport { fromEvent } from 'rxjs';\r\n\r\nimport { CELL_PADDING, SchedulerTimelineBase, TABLE_BORDER, TABLE_MARGIN_VERTICAL, THeaderSlotSpan } from './scheduler-base';\r\nimport { IScheduledItem, ScheduledItemClickEvent, ScheduledItemDragDropEvent, ScheduledItemModel, TimelineSlotDataItem, TimeSlotCellClickEvent, } from './scheduler-shared';\r\nimport { TScheduledItemsDateFormat } from './types/scheduled-items-date-format.type';\r\nimport { TSchedulerVariantType } from './types/scheduler-variant.type';\r\n\r\nconst ITEM_MARGIN_VERTICAL = 5;\r\nconst SECONDS_OF_HOUR = 60 * 60;\r\nconst SECONDS_OF_DAY = SECONDS_OF_HOUR * 24;\r\n\r\nexport type UnitOfTimeWithRange = `${moment.unitOfTime.Diff}:${number}-${number}`;\r\n\r\nconst CLASS = 'SchedulerTimelineComponent';\r\n\r\n@Component({\r\n    selector: 'scheduler-timeline',\r\n    templateUrl: './scheduler-timeline.component.html',\r\n    styleUrls: ['./scheduler.scss'],\r\n    encapsulation: ViewEncapsulation.None,\r\n    changeDetection: ChangeDetectionStrategy.Default //https://angular-2-training-book.rangle.io/handout/change-detection/change_detection_strategy_onpush.html\r\n    ,\r\n    standalone: false\r\n})\r\n\r\nexport class SchedulerTimelineComponent extends SchedulerTimelineBase implements OnInit, OnDestroy, AfterViewInit {\r\n    constructor(\r\n        logger: LoggerService,\r\n        changeDetectorRef: ChangeDetectorRef\r\n    ) {\r\n        super(logger, changeDetectorRef);\r\n    }\r\n\r\n    ngOnInit() {\r\n        super.ngOnInit();\r\n    }\r\n\r\n    ngAfterViewInit(): void {\r\n        this.subscriptions.push(\r\n            fromEvent(this.scrollbar.adapter.viewportElement, 'scroll').subscribe((e: Event) => this.scroll(e))\r\n        );\r\n    }\r\n\r\n    ngOnDestroy() {\r\n        super.ngOnDestroy();\r\n    }\r\n\r\n    @Input() public headerHeight: number;\r\n    @Input() public headerSlotSpan: THeaderSlotSpan;\r\n    @Input() public small: boolean;\r\n    @Input() public rowHeight: number;\r\n    @Input() public showNameOfMonth: boolean;\r\n    @Input() public showNameOfDay: boolean;\r\n    @Input() public maxHeight: string;\r\n    @Input() public stickyHeader: boolean;\r\n\r\n    @Input('variant') public set _variant(value: TSchedulerVariantType) {\r\n        super.setVariant(value);\r\n    }\r\n    @Input('date') public set _timeLineDate(value: Date | string) {\r\n        super.setTimeLineDate(value);\r\n    }\r\n\r\n    /**standard=\"days\"; alternative: \"hours\", \"hours:9-18\" */\r\n    @Input('slotUnitOfTime') public set _slotUnitOfTime(value: moment.unitOfTime.Diff | UnitOfTimeWithRange) {\r\n        if (!value) return;\r\n        let unit: moment.unitOfTime.Diff;\r\n        let rangeFrom: string;\r\n        let rangeTo: string;\r\n        const valueParts = value ? value.split(':') : [];\r\n        if (valueParts.length <= 0) {\r\n            unit = null;\r\n            rangeFrom = null;\r\n            rangeTo = null;\r\n        } else {\r\n            unit = valueParts[0] as moment.unitOfTime.Diff;\r\n            if (valueParts.length > 1) {\r\n                const ranges = valueParts[1].split('-');\r\n                if (ranges.length > 0)\r\n                    rangeFrom = ranges[0];\r\n\r\n                if (ranges.length > 1)\r\n                    rangeTo = ranges[1];\r\n\r\n            }\r\n        }\r\n        super.setSlotUnitOfTime(unit, rangeFrom, rangeTo);\r\n    }\r\n\r\n    //legt fest auf welchen %-Faktor der Slotbreite ScheduledItems gerudnet werden sollen; default 0.2 = 20% der Slotbreite\r\n    //auf 0 setzen zum Abschalten der Rundung\r\n    @Input() public scheduledItemRoundFraction = 0.2;\r\n\r\n    protected get timelineSecondsPerSlot() {\r\n        switch (this.timelineSlotUnitOfTime) {\r\n            case 'hours':\r\n                return 60 * 60;\r\n            case 'days':\r\n                return 60 * 60 * 24;\r\n            default:\r\n                throw new Error('NotImplemented timelineSlotUnitOfTime=' + this.timelineSlotUnitOfTime);\r\n        }\r\n    }\r\n\r\n    @Input('slotWidth') public set _slotWidth(value: number) {\r\n        super.setSlotWidth(value);\r\n    }\r\n    @Input('slotItems') public set _slotItems(values: Array<TimelineSlotDataItem>) {\r\n        super.setSlotDataItems(values);\r\n    }\r\n    @Output() public cellClick: EventEmitter<TimeSlotCellClickEvent>;\r\n    @Output() public itemClick: EventEmitter<ScheduledItemClickEvent>;\r\n\r\n    @Output() public itemDrop = new EventEmitter<ScheduledItemDragDropEvent>();\r\n    @Output() public itemDragStart = new EventEmitter<ScheduledItemDragDropEvent>();\r\n    @Output() public itemDragOver = new EventEmitter<ScheduledItemDragDropEvent>();\r\n\r\n    @Input('scheduledItems') public set _scheduledItems(values: Array<IScheduledItem>) {\r\n        super.setScheduledItems(values);\r\n    }\r\n    @Input() public scheduledItemsDateFormat: TScheduledItemsDateFormat = 'date';\r\n    @Input() public scheduledItemMarginHorizontal = 3;\r\n    @Input() public scheduledItemMarginLeft = 0;\r\n\r\n    @Input() public allowDragItems = true;\r\n    @Input() public showResourceColumn = true;\r\n    @Input() public resourceHeaderText: string;\r\n    @Input('resourceColWidth') public set setResourceColWidthTotal(value: number) {\r\n        this.resourceColOuterWidth = value;\r\n    }\r\n    private resourceColOuterWidth = 100;//incl padding & border\r\n    public resourceColWidth: number;//excl padding & border\r\n\r\n    protected recalcWidthsAndHeights() {\r\n        this.resourceColWidth = this.showResourceColumn ? this.resourceColOuterWidth - (CELL_PADDING * 2) - TABLE_BORDER : 0;\r\n        this.tableCustomColumnsWidth = this.showResourceColumn ? this.resourceColOuterWidth : 0;\r\n        super.recalcWidthsAndHeights();\r\n    }\r\n\r\n    @Output() public scrolledToPosition: EventEmitter<ScrollEvent> = new EventEmitter<ScrollEvent>();\r\n    public scroll(event: any) {\r\n        if (!this.scrollEventBlocked)\r\n            this.scrolledToPosition.emit({ posX: event.srcElement.scrollLeft, posY: event.srcElement.scrollTop } as ScrollEvent);\r\n\r\n        this.scrollEventBlocked = false;\r\n    }\r\n\r\n    @ViewChild(NgScrollbar) scrollbar: NgScrollbar;\r\n    private scrollEventBlocked = false;\r\n    public scrollToPosition(posX: number, posY: number) {\r\n        this.scrollEventBlocked = true;\r\n        this.scrollbar.scrollTo({\r\n            left: posX,\r\n            top: posY,\r\n            duration: 0\r\n        });\r\n    }\r\n\r\n    @Input('idfield') public resourceIdField = 'id';\r\n    @Input() public resourceNameField = 'name';\r\n    @Input('datasource') public set setListDatasource(value: DatasourceComponent) {\r\n\r\n        this.resourceDatasource = value;\r\n        this.subscriptions.push(\r\n            this.resourceDatasource.onAfterRefresh.subscribe(\r\n                () => this.refresh()\r\n            ),\r\n        );\r\n        this.refresh();\r\n    }\r\n    public resourceDatasource: DatasourceComponent;\r\n\r\n    //--- ScheduledItems\r\n\r\n    protected refreshScheduledItems() {\r\n        this.cellRowInfos = this.getScheduledItemCellRowInfos(this.scheduledDataItems);\r\n        super.refreshScheduledItems();\r\n    }\r\n\r\n    private cellRowInfos: ScheduledItemCellRowInfo;//\"CellRow\" = \"Sub-Zeilen\" innerhalb einer Gruppe von Zellen einer regulären Zeile; benötigt wenn es überlappende Balken gibt und diese sich den verfügbaren Platz aufteilen müssen\r\n    private getScheduledItemCellRowInfos(scheduledDataItems: IScheduledItem[]): ScheduledItemCellRowInfo {\r\n        const result = new ScheduledItemCellRowInfo();\r\n        const endsOfCellRows: { [resourceId: string]: Date[]; } = {};\r\n        const sortedItems = scheduledDataItems.sort((a, b) => a.start < b.start ? -1 : a.start > b.start ? +1 : 0);\r\n        for (const sitem of sortedItems) {\r\n            const regularStart = moment(sitem.start).toDate();\r\n            const regularEnd = moment(sitem.end).toDate();\r\n\r\n            if (!endsOfCellRows[sitem.resourceId]) endsOfCellRows[sitem.resourceId] = [];\r\n\r\n            const validIndex = endsOfCellRows[sitem.resourceId].findIndex(end => end <= regularStart);\r\n            if (validIndex >= 0) {\r\n                endsOfCellRows[sitem.resourceId][validIndex] = regularEnd;\r\n                result.itemCellRowIndices[sitem.ident] = validIndex;\r\n            } else {\r\n                const lineNumOfCellRows = endsOfCellRows[sitem.resourceId].push(regularEnd);\r\n                result.itemCellRowIndices[sitem.ident] = lineNumOfCellRows - 1;\r\n                result.lineNumOfCellRows[sitem.resourceId] = lineNumOfCellRows;\r\n            }\r\n        }\r\n        return result;\r\n    }\r\n\r\n    protected createScheduledItemModel(scheduledItem: IScheduledItem): ScheduledItemModel {\r\n        let item: ScheduledItemModel = null;\r\n        const resourceItem = this.resourceDatasource.getDataItem(scheduledItem.resourceId);\r\n        if (resourceItem == undefined)\r\n            this.logger.warn(CLASS + '.createScheduledItemModel resourceItem not found for scheduledItem.resourceId = ' + scheduledItem.resourceId);\r\n\r\n        const rowIndexOfResourceId = this.resourceDatasource.data.indexOf(resourceItem);\r\n        if (rowIndexOfResourceId >= 0) {\r\n            const timeLineStart = this.timeLineStartMoment.toDate();\r\n            const timeLineEnd = this.timeLineEndMoment.toDate();\r\n\r\n            const regularStart = moment(scheduledItem.start).toDate();\r\n            const regularEnd = moment(scheduledItem.end).toDate();\r\n\r\n            if (scheduledItem.start <= timeLineEnd && scheduledItem.end >= timeLineStart) {\r\n                item = new ScheduledItemModel();\r\n                item.resourceId = scheduledItem.resourceId;\r\n                item.start = this.formatScheduledItemsDate(scheduledItem.start);\r\n                item.end = this.formatScheduledItemsDate(scheduledItem.end);\r\n                item.class = scheduledItem.class ? scheduledItem.class : 'bg-primary text-center';\r\n                item.styles = scheduledItem.styles ? scheduledItem.styles : null;\r\n                item.text = scheduledItem.text;\r\n                item.title = scheduledItem.title ? scheduledItem.title : null;\r\n                item.ident = scheduledItem.ident;\r\n                item.bgColor = scheduledItem.bgColor;\r\n                item.bgStriped = scheduledItem.bgStriped;\r\n                item.borderWidth = scheduledItem.borderWidth;\r\n                item.borderColor = scheduledItem.borderColor;\r\n\r\n                item.cellRowIndex = this.cellRowInfos.itemCellRowIndices[item.ident];\r\n\r\n                const itemLeftDate = this.calculateScheduledItemLeftEnd(regularStart, timeLineStart);\r\n                const itemRightDateEnd = this.calculateScheduledItemRightEnd(regularEnd, timeLineEnd);\r\n\r\n                const cssClassOpen = this.buildScheduledItemCssClassOpen(regularStart, regularEnd, timeLineStart, timeLineEnd);\r\n                if (cssClassOpen) item.class += ' ' + cssClassOpen;\r\n\r\n                if (this.itemClick.observers.length > 0) item.class += ' ui-clickable';\r\n                if (this.allowDragItems) item.class += ' ui-draggable';\r\n\r\n                item.left = this.date2Px(itemLeftDate);\r\n                const itemRightPx = this.date2Px(itemRightDateEnd);\r\n                item.width = itemRightPx - item.left - (2 * this.scheduledItemMarginHorizontal);\r\n\r\n                let numOfItems = this.cellRowInfos.lineNumOfCellRows[item.resourceId];\r\n                if (numOfItems == 0) {\r\n                    console.warn('unexpected numOfItems == 0 for rowIndexOfResourceId=' + rowIndexOfResourceId + ' item.name=' + item.title);\r\n                    numOfItems = 1;\r\n                }\r\n                const betweenItemMargin = numOfItems > 1 ? 2 : 0;\r\n                const calculatedHeight = (this.rowHeight - ITEM_MARGIN_VERTICAL * 2) / numOfItems - betweenItemMargin;\r\n                item.height = calculatedHeight; //Math.min(ITEM_MAX_HEIGHT - ITEM_MARGIN_VERTICAL * 2, calculatedHeight);\r\n                item.top = this.headerHeight + this.rowHeight * rowIndexOfResourceId + ITEM_MARGIN_VERTICAL + TABLE_MARGIN_VERTICAL + TABLE_BORDER + item.cellRowIndex * (item.height + betweenItemMargin);\r\n            }\r\n        }\r\n        return item;\r\n    }\r\n\r\n    private calculateScheduledItemLeftEnd(regularStart: Date, timeLineStart: Date): Date {\r\n        let result = regularStart;\r\n        if (regularStart < timeLineStart)\r\n            result = timeLineStart;\r\n\r\n        return result;\r\n    }\r\n\r\n    private calculateScheduledItemRightEnd(regularEnd: Date, timeLineEnd: Date): Date {\r\n        let result: Date = regularEnd;\r\n        if (this.scheduledItemsDateFormat == 'date') {\r\n            //itemRightDateEnd = moment(value.end).add(1, \"days\").add(-1, \"seconds\").toDate();//PK: wozu -1sec? => gibt problem bei länge in h (23h statt 24h)\r\n            result = moment(regularEnd).add(1, 'days').toDate();\r\n        }\r\n        else\r\n            result = regularEnd;\r\n\r\n        if (result > timeLineEnd)\r\n            result = timeLineEnd;\r\n\r\n        return result;\r\n    }\r\n\r\n    private buildScheduledItemCssClassOpen(regularStart: Date, regularEnd: Date, timeLineStart: Date, timeLineEnd: Date): string {\r\n        let cssClassOpen = '';\r\n        if (regularStart < timeLineStart)\r\n            cssClassOpen = 'timeline-item-open-left';\r\n\r\n        if (regularEnd > timeLineEnd)\r\n            cssClassOpen = 'timeline-item-open-right';\r\n\r\n        if (regularStart < timeLineStart && regularEnd > timeLineEnd)\r\n            cssClassOpen = 'timeline-item-open';\r\n\r\n        return cssClassOpen;\r\n    }\r\n\r\n    private date2Px(date: Date): number {\r\n        const dateMoment = moment(date);\r\n        let totalLengthInSeconds = dateMoment.diff(this.timeLineStartMoment, 'seconds');\r\n        const hiddenSeconds = this.calculateHiddenSeconds(dateMoment);\r\n        totalLengthInSeconds -= hiddenSeconds;\r\n        const leftCol = this.showResourceColumn ? this.resourceColOuterWidth : 0;\r\n        const result = leftCol + this.seconds2Px(totalLengthInSeconds) + this.scheduledItemMarginHorizontal + this.scheduledItemMarginLeft;\r\n        return result;\r\n    }\r\n\r\n    private seconds2Px(seconds: number) {\r\n        let result = seconds / this.timeLineSecondPerPx;\r\n        result = this.roundPxToSlotWidth(result);\r\n        return result;\r\n    }\r\n\r\n    private roundPxToSlotWidth(srcPx: number) {\r\n        if (this.scheduledItemRoundFraction > 0) {\r\n            const roundBase = this.timeLineSlotOuterWidth * this.scheduledItemRoundFraction;\r\n            const resultPx = Math.round(srcPx / roundBase) * roundBase;\r\n            return resultPx;\r\n        }\r\n        else\r\n            return srcPx;\r\n\r\n    }\r\n\r\n    private get timeLineSecondPerPx(): number {\r\n        return this.timeLineSlotOuterWidth > 0 ? this.timelineSecondsPerSlot / this.timeLineSlotOuterWidth : 1;\r\n    }\r\n\r\n    //berechnet die abzuziehenden Sekunden bei Einstellung von eingeschränkten Uhrzeiten (zb 8-18 Uhr)\r\n    //später noch zu erweitern so dass ggf auch tage eingeschränkt werden können (Mo-Fr)\r\n    private calculateHiddenSeconds(dateMoment: moment.Moment): number {\r\n        if (this.timelineSlotUnitOfTime != 'hours' || this.visibleHoursFrom == undefined && this.visibleHoursUntil == undefined) return 0;\r\n\r\n        const visibleSecondsFrom = this.visibleHoursFrom ? this.visibleHoursFrom * SECONDS_OF_HOUR : 0;\r\n        const visibleSecondsUntil = this.visibleHoursUntil ? this.visibleHoursUntil * SECONDS_OF_HOUR : SECONDS_OF_DAY;\r\n        const visibleSecondsOfFullDay = visibleSecondsUntil - visibleSecondsFrom;\r\n        const hiddenSecondsOfFullDay = SECONDS_OF_DAY - visibleSecondsOfFullDay;\r\n\r\n        const dateDayMoment = dateMoment.clone().startOf('day');\r\n        const dateHiddenFullDays = dateDayMoment.diff(this.timeLineStartMoment, 'days');\r\n        const dateHiddenFullDaysSeconds = dateHiddenFullDays * hiddenSecondsOfFullDay;\r\n\r\n        let dateDayHiddenSeconds = 0;\r\n\r\n        const dateMomentTotalSeconds = dateMoment.diff(dateDayMoment, 'seconds');\r\n        if (dateMomentTotalSeconds > 0)//die verborgenen Sekunden am Tag des dateMoment (nur wenn > 0:00 Uhr)\r\n        {\r\n            if (dateMomentTotalSeconds < visibleSecondsFrom)\r\n                dateDayHiddenSeconds += dateMomentTotalSeconds;//komplett ausblenden\r\n\r\n            else\r\n                dateDayHiddenSeconds += visibleSecondsFrom;\r\n\r\n            if (dateMomentTotalSeconds > visibleSecondsUntil) {\r\n                const hiddenSeconds = dateMomentTotalSeconds - visibleSecondsUntil;\r\n                dateDayHiddenSeconds += hiddenSeconds;\r\n            }\r\n        }\r\n        return dateHiddenFullDaysSeconds + dateDayHiddenSeconds;\r\n    }\r\n\r\n    protected getSlotCellLineId(scheduledItem: IScheduledItem): any;\r\n    protected getSlotCellLineId(timelineSlotDataItem: TimelineSlotDataItem): any;\r\n    protected getSlotCellLineId(arg1: any): any {\r\n        if (arg1.start) {\r\n            const scheduledItem: IScheduledItem = arg1 as IScheduledItem;\r\n            return scheduledItem.resourceId;\r\n        }\r\n        else {\r\n            const timelineSlotDataItem: TimelineSlotDataItem = arg1 as TimelineSlotDataItem;\r\n            return timelineSlotDataItem.resourceId;\r\n        }\r\n    }\r\n\r\n}\r\n\r\nclass ScheduledItemCellRowInfo {\r\n    itemCellRowIndices: { [ident: string]: number; } = {};\r\n    lineNumOfCellRows: { [resourceId: string]: number; } = {};\r\n}\r\n\r\nexport class ScrollEvent {\r\n    posX: number;\r\n    posY: number;\r\n}\r\n","<ng-scrollbar [style.max-height]=\"maxHeight\">\r\n  <div style=\"position:relative;\" class=\"scheduler-wrapper\"\r\n    [ngClass]=\"stickyHeader ? 'sticky': ''\" (dragover)=\"onItemDragOver($event)\" (drop)=\"onItemDrop($event)\">\r\n    <table class=\"table table-bordered table-striped table-fixed dataTable scheduler\" [style.width.px]=\"tableWidth\"\r\n      [ngClass]=\"{'small':small,'table-condensed':small}\">\r\n      <thead>\r\n        @if (showNameOfMonth) {\r\n          <tr [style.height.px]=\"headerRowHeight\" class=\"row-header-month\">\r\n            @if (showResourceColumn) {\r\n              <th [style.paddingLeft.px]=\"cellPadding\"\r\n              [style.paddingRight.px]=\"cellPadding\" [style.width.px]=\"resourceColWidth\"></th>\r\n            }\r\n            @for (monthItem of monthItems; track monthItem) {\r\n              <th [attr.colspan]=\"monthItem.numOfSlots\"\r\n                [ngClass]=\"monthItem.class\" [style.paddingLeft.px]=\"cellPadding\"\r\n              [style.paddingRight.px]=\"cellPadding\">{{monthItem.name}}</th>\r\n            }\r\n          </tr>\r\n        }\r\n        @if (showNameOfDay) {\r\n          <tr [style.height.px]=\"headerRowHeight\" class=\"row-header-name-of-day\">\r\n            @if (showResourceColumn) {\r\n              <th [style.paddingLeft.px]=\"cellPadding\"\r\n              [style.paddingRight.px]=\"cellPadding\" [style.width.px]=\"resourceColWidth\"></th>\r\n            }\r\n            @for (dayItem of dayItems; track dayItem) {\r\n              <th [attr.colspan]=\"dayItem.numOfSlots\"\r\n                class=\"text-center timeline-day-header\" [ngClass]=\"dayItem.class\" [attr.title]=\"dayItem.name\"\r\n              [style.paddingLeft.px]=\"cellPadding\" [style.paddingRight.px]=\"cellPadding\">{{dayItem.name}}</th>\r\n            }\r\n          </tr>\r\n        }\r\n        <tr [style.height.px]=\"headerRowHeight\" class=\"row-header-text\">\r\n          @if (showResourceColumn) {\r\n            <th [style.paddingLeft.px]=\"cellPadding\"\r\n              [style.paddingRight.px]=\"cellPadding\" [style.width.px]=\"resourceColWidth\">\r\n              {{resourceHeaderText}}\r\n            </th>\r\n          }\r\n          @for (header of timeLineSlotHeaders; track header) {\r\n            <th class=\"text-center timeline-slot-header\"\r\n              [ngClass]=\"[header.cssClass, header.isEndOfDay(visibleHoursUntil) ? 'timeline-day-border' : '']\"\r\n              [colSpan]=\"header.slotSpan\" [title]=\"header.title\" [style.paddingLeft.px]=\"cellPadding\"\r\n              [style.paddingRight.px]=\"cellPadding\" [style.width.px]=\"timeLineSlotWidth\">\r\n              {{header.text}}\r\n            </th>\r\n          }\r\n        </tr>\r\n      </thead>\r\n      <tbody>\r\n        @for (resource of resourceDatasource.data; track resource) {\r\n          <tr [style.height.px]=\"rowHeight\"\r\n            [attr.id]=\"'timeline-resource-'+resource[resourceIdField]\"\r\n            [attr.data-line-id]=\"resource[resourceIdField]\">\r\n            @if (showResourceColumn) {\r\n              <td title=\"{{resource[resourceNameField]}}\">\r\n                {{resource[resourceNameField]}}\r\n              </td>\r\n            }\r\n            @for (slot of timeLineSlots; track slot; let slotIndex = $index) {\r\n              <td\r\n                (click)=\"onCellClick($event,resource[resourceIdField],slot)\" class=\"text-center timeline-slot\"\r\n                [title]=\"resource[resourceNameField] + ' (' + slot.nameOfDay + ' '  + slot.headerText + ') ' + slot.cellTitle(resource[resourceIdField])\"\r\n                        [ngClass]=\"[cellClass(slot,resource[resourceIdField]), slot.isLastSlotCell(headerSlotSpan) && !slot.isEndOfDay(visibleHoursUntil) ? 'timeline-slot-border' : '',\r\n                        slot.isEndOfDay(visibleHoursUntil) ? 'timeline-day-border' : '']\"\r\n                [attr.data-slot-index]=\"slotIndex\">\r\n                <span class=\"timeline-slot-inner\">{{slot.cells[resource[resourceIdField]]?.text}}</span>\r\n              </td>\r\n            }\r\n          </tr>\r\n        }\r\n      </tbody>\r\n    </table>\r\n    @for (item of items; track item) {\r\n      <div [draggable]=\"allowDragItems\" (dragstart)=\"onItemDragStart($event,item)\"\r\n        class=\"timeline-item\" [ngClass]=\"[item.class, item.bgStriped ? 'timeline-item-striped' : '']\"\r\n        [ngStyle]=\"item.styles\" [attr.title]=\"item.title\" [style.height.px]=\"item.height\" [style.top.px]=\"item.top\"\r\n        [style.left.px]=\"item.left\" [style.width.px]=\"item.width\" [style.background]=\"item.bgColor\"\r\n        [style.border-width]=\"item.borderWidth\" [style.border-color]=\"item.borderColor\"\r\n        (click)=\"onItemClick($event, item)\">\r\n        <small>{{item.text}}</small>\r\n      </div>\r\n    }\r\n  </div>\r\n</ng-scrollbar>\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { SwtControlsModule } from '@sowatech/shared/swt-controls';\r\nimport { PopoverModule } from 'ngx-bootstrap/popover';\r\nimport { NgScrollbarModule } from 'ngx-scrollbar';\r\n\r\nimport { SchedulerDateSelectorComponent } from './date-selectors/scheduler-date-selector/scheduler-date-selector.component';\r\nimport { SchedulerMonthSelectorComponent } from './date-selectors/scheduler-month-selector/scheduler-month-selector.component';\r\nimport { SchedulerWeekSelectorComponent } from './date-selectors/scheduler-week-selector/scheduler-week-selector.component';\r\nimport { SchedulerCalendarComponent } from './scheduler-calendar.component';\r\nimport { SchedulerTimelineComponent } from './scheduler-timeline.component';\r\n\r\n\r\n\r\nexport const PopoverModuleForRoot = PopoverModule.forRoot();\r\n\r\n@NgModule({\r\n    imports: [\r\n        CommonModule,\r\n        FormsModule,\r\n        NgScrollbarModule,\r\n        SwtControlsModule,//loadingIndicator\r\n        PopoverModuleForRoot\r\n    ],\r\n    declarations: [\r\n        SchedulerTimelineComponent,\r\n        SchedulerCalendarComponent,\r\n        SchedulerMonthSelectorComponent,\r\n        SchedulerWeekSelectorComponent,\r\n        SchedulerDateSelectorComponent\r\n    ],\r\n    exports: [\r\n        SchedulerTimelineComponent,\r\n        SchedulerCalendarComponent,\r\n        SchedulerMonthSelectorComponent,\r\n        SchedulerWeekSelectorComponent,\r\n        SchedulerDateSelectorComponent\r\n    ]\r\n})\r\nexport class SchedulerModule { }\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["TMonth","i1","CLASS","TIsoWeekDay","i3.SchedulerMonthSelectorComponent","i4.SchedulerWeekSelectorComponent","ITEM_MARGIN_VERTICAL","i3"],"mappings":"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"}