blob: b484d1e1be04c3a703223ba87b7881099dac2eff [file] [log] [blame]
/*
******************************************************************************
* Copyright © 2018 PTA GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*
******************************************************************************
*/
import { Component, OnInit, ViewChild, TemplateRef } from '@angular/core';
import { GridMeasureService } from './../../services/grid-measure.service';
import { GridMeasure } from './../../model/grid-measure';
import {
startOfDay,
endOfDay,
subDays,
addDays,
endOfMonth,
isSameDay,
isSameMonth,
addHours
} from 'date-fns';
import {
CalendarEvent,
CalendarEventAction,
CalendarEventTimesChangedEvent,
CalendarDateFormatter
} from 'angular-calendar';
import { Subject } from 'rxjs/Subject';
import { UndoRedoStackComponent } from '../undo-redo-stack/undo-redo-stack.component';
import { CustomDateFormatter } from './custom-date-formatter-provider';
import { Router } from '@angular/router';
import { ModeValidator } from '../helpers/mode-validator';
import { SessionContext } from '../../common/session-context';
import { Globals } from '../../common/globals';
@Component({
selector: 'app-custom-calendar',
templateUrl: './calendar.component.html',
styleUrls: ['./calendar.component.css'],
providers: [
{
provide: CalendarDateFormatter,
useClass: CustomDateFormatter
}
]
})
export class CustomCalendarComponent implements OnInit {
@ViewChild('modalContent') modalContent: TemplateRef<any>;
colorsForStatus: any;
weekStartsOn = 1;
locale = 'de';
undoRedoStack = new UndoRedoStackComponent();
eventTypes = this.colorsForStatus;
activeDayIsOpen = true;
refresh: Subject<any> = new Subject();
modalData: {
action: string;
event: CalendarEvent;
};
view: any = 'week';
currDate: Date = new Date();
currentEditEventStart: Date = new Date();
currentEditEventEnd: Date = new Date();
currentEditEvent: CalendarEvent;
events = new Array<CalendarEvent>();
constructor(
private gridMeasureService: GridMeasureService,
private router: Router,
public modeValidator: ModeValidator,
private sessionContext: SessionContext) { }
ngOnInit() {
this.setColors();
this.gridMeasureService.getCalender()
.subscribe(singleGridMeasures => {
const editAction = <CalendarEventAction>{
label: '<span class="glyphicon glyphicon-pencil"></span>',
onClick: ({ event }: { event: CalendarEvent }): void => {
this.eventClicked('edit', event);
}
};
const viewAction = <CalendarEventAction>{
label: '<span class="glyphicon glyphicon-eye-open"></span>',
onClick: ({ event }: { event: CalendarEvent }): void => {
this.eventClicked('view', event);
}
};
singleGridMeasures.forEach(singleGM => {
if (!singleGM.plannedStarttimSinglemeasure || !singleGM.plannedEndtimeSinglemeasure) {
console.log('No valide date values for ' + singleGM.singleGridMeasureTitle);
console.log('Planned End Time Gridmeasure ' + singleGM.plannedEndtimeSinglemeasure);
console.log('Start Time First Sequence: ' + singleGM.plannedStarttimSinglemeasure);
} else {
this.events.push(<CalendarEvent><GridMeasure>{
id: singleGM.gridMeasureId,
title: singleGM.singleGridMeasureTitle || 'TITLE NOT DEFINED',
start: new Date(singleGM.plannedStarttimSinglemeasure),
end: new Date(singleGM.plannedEndtimeSinglemeasure),
color: this.colorsForStatus[singleGM.gridMeasureStatusId],
draggable: false,
actions: [this.modeValidator.isEditModeAllowed(singleGM.gridMeasureStatusId) ? editAction : viewAction],
resizable: {
beforeStart: false,
afterEnd: false
},
meta: singleGM
});
}
});
this.currDate = new Date();
this.showGridMeasuresIfThere();
});
}
private showGridMeasuresIfThere() {
const numberOfGMsInActualDay = this.events.filter(evt =>
(evt.start.getDate() <= this.currDate.getDate() && evt.end.getDate() >= this.currDate.getDate()));
this.activeDayIsOpen = numberOfGMsInActualDay.length > 0;
}
dayClicked({ date, events }: { date: Date; events: CalendarEvent[] }): void {
this.currentEditEvent = null;
if (isSameMonth(date, this.currDate)) {
if (
(isSameDay(this.currDate, date) && this.activeDayIsOpen === true) ||
events.length === 0
) {
this.activeDayIsOpen = false;
} else {
this.activeDayIsOpen = true;
this.currDate = date;
}
}
}
eventClicked(action: string, event: CalendarEvent<GridMeasure>): void {
const isEditModeAllowed = this.modeValidator.isEditModeAllowed(event.meta.statusId);
this.router.navigate(['/gridMeasureDetail/', event.id, isEditModeAllowed ? 'edit' : 'view']);
}
eventTimesChanged(eventchanged: CalendarEventTimesChangedEvent): void {
const event = <CalendarEvent><GridMeasure>eventchanged.event;
event.meta.plannedStarttimSinglemeasure = eventchanged.newStart;
event.meta.plannedEndtimeSinglemeasure = eventchanged.newEnd;
event.start = eventchanged.newStart;
event.end = eventchanged.newEnd;
this.refresh.next();
}
setColors() {
const newColor = this.sessionContext.getStatusById(Globals.STATUS.NEW).colorCode;
const appliedColor = this.sessionContext.getStatusById(Globals.STATUS.APPLIED).colorCode;
const canceledColor = this.sessionContext.getStatusById(Globals.STATUS.CANCELED).colorCode;
const forApprovalColor = this.sessionContext.getStatusById(Globals.STATUS.FORAPPROVAL).colorCode;
const approvedColor = this.sessionContext.getStatusById(Globals.STATUS.APPROVED).colorCode;
const requestedColor = this.sessionContext.getStatusById(Globals.STATUS.REQUESTED).colorCode;
const releasedColor = this.sessionContext.getStatusById(Globals.STATUS.RELEASED).colorCode;
const activeColor = this.sessionContext.getStatusById(Globals.STATUS.ACTIVE).colorCode;
const inWorkColor = this.sessionContext.getStatusById(Globals.STATUS.IN_WORK).colorCode;
const workFinishedColor = this.sessionContext.getStatusById(Globals.STATUS.WORK_FINISHED).colorCode;
const finishedColor = this.sessionContext.getStatusById(Globals.STATUS.FINISHED).colorCode;
const closedColor = this.sessionContext.getStatusById(Globals.STATUS.CLOSED).colorCode;
const rejectedColor = this.sessionContext.getStatusById(Globals.STATUS.REJECTED).colorCode;
this.colorsForStatus = {
0: {
primary: newColor,
secondary: this.setRGBAColorTransparency(newColor)
},
1: {
primary: appliedColor,
secondary: this.setRGBAColorTransparency(appliedColor)
},
2: {
primary: canceledColor,
secondary: this.setRGBAColorTransparency(canceledColor)
},
3: {
primary: forApprovalColor,
secondary: this.setRGBAColorTransparency(forApprovalColor)
},
4: {
primary: approvedColor,
secondary: this.setRGBAColorTransparency(approvedColor)
},
5: {
primary: requestedColor,
secondary: this.setRGBAColorTransparency(requestedColor)
},
6: {
primary: releasedColor,
secondary: this.setRGBAColorTransparency(releasedColor)
},
7: {
primary: activeColor,
secondary: this.setRGBAColorTransparency(activeColor)
},
8: {
primary: inWorkColor,
secondary: this.setRGBAColorTransparency(inWorkColor)
},
9: {
primary: workFinishedColor,
secondary: this.setRGBAColorTransparency(workFinishedColor)
},
10: {
primary: finishedColor,
secondary: this.setRGBAColorTransparency(finishedColor)
},
11: {
primary: closedColor,
secondary: this.setRGBAColorTransparency(closedColor)
},
12: {
primary: rejectedColor,
secondary: this.setRGBAColorTransparency(rejectedColor)
}
};
}
setRGBAColorTransparency(colorRGBA: string): string {
return colorRGBA.replace('1)', Globals.CALENDAR_COLOR_TRANSPARENCY_VALUE + ')');
}
}