angular-calendar-scheduler
Version:
This project provide a scheduler view component for [mattlewis92/angular-calendar](https://github.com/mattlewis92/angular-calendar).
260 lines (218 loc) • 9.13 kB
Markdown
# Angular Calendar Scheduler
This project provide a scheduler view component for [mattlewis92/angular-calendar](https://github.com/mattlewis92/angular-calendar).
<a href="https://www.npmjs.com/package/angular-calendar-scheduler">
<img src="https://badge.fury.io/js/angular-calendar-scheduler.svg" alt="npm">
</a>
<a href="https://travis-ci.org/mounthorse-slns/angular-calendar-scheduler">
<img src="https://travis-ci.org/mounthorse-slns/angular-calendar-scheduler.svg?branch=master" alt="travis">
</a>
<a href="https://codecov.io/gh/mounthorse-slns/angular-calendar-scheduler">
<img src="https://codecov.io/gh/mounthorse-slns/angular-calendar-scheduler/branch/master/graph/badge.svg" alt="codecov">
</a>
<a href="https://github.com/mounthorse-slns/angular-calendar-scheduler/issues">
<img src="https://img.shields.io/github/issues/mounthorse-slns/angular-calendar-scheduler.svg" alt="issues">
</a>
<a href="https://github.com/mounthorse-slns/angular-calendar-scheduler/network">
<img src="https://img.shields.io/github/forks/mounthorse-slns/angular-calendar-scheduler.svg" alt="forks">
</a>
<a href="https://github.com/mounthorse-slns/angular-calendar-scheduler/stargazers">
<img src="https://img.shields.io/github/stars/mounthorse-slns/angular-calendar-scheduler.svg" alt="stars">
</a>
<a href="https://github.com/mounthorse-slns/angular-calendar-scheduler/blob/master/LICENSE">
<img src="https://img.shields.io/github/license/mounthorse-slns/angular-calendar-scheduler.svg" alt="license">
</a>
___
<!-- * [About](#about) -->
* [Getting Started](#getting-started)
* [Install](#install)
* [Include Component](#include-component)
* [Usage](#usage)
<!-- * [API](#api)
* [Properties](#properties) -->
* [License](#license)
<!-- ## About -->
## Getting Started
### Install
#### NPM
```sh
npm install angular-calendar-scheduler date-fns --save
```
#### Yarn
```sh
yarn add angular-calendar-scheduler date-fns
```
### Include Component
#### Import
```ts
import { CalendarModule } from 'angular-calendar';
import { SchedulerModule } from 'angular-calendar-scheduler';
class AppModule { }
```
### Usage
#### app.component.ts
```ts
import { CalendarDateFormatter } from 'angular-calendar';
import { ... } from 'angular-calendar-scheduler';
export class AppComponent implements OnInit {
title = 'Angular Calendar Scheduler Demo';
CalendarView = CalendarView;
view: CalendarView = CalendarView.Week;
viewDate: Date = new Date();
refreshSubject: Subject<any> = new Subject();
locale: string = 'en';
weekStartsOn: number = 1;
startsWithToday: boolean = true;
activeDayIsOpen: boolean = true;
excludeDays: number[] = []; // [0];
weekendDays: number[] = [0,6];
dayStartHour: number = 6;
dayEndHour: number = 22;
minDate: Date = new Date();
maxDate: Date = endOfDay(addMonths(new Date(), 1));
dayModifier: Function;
hourModifier: Function;
segmentModifier: Function;
prevBtnDisabled: boolean = false;
nextBtnDisabled: boolean = false;
actions: CalendarSchedulerEventAction[] = [
{
when: 'enabled',
label: '<span class="valign-center"><i class="material-icons md-18 md-red-500">cancel</i></span>',
title: 'Delete',
onClick: (event: CalendarSchedulerEvent): void => {
console.log('Pressed action \'Delete\' on event ' + event.id);
}
},
{
when: 'disabled',
label: '<span class="valign-center"><i class="material-icons md-18 md-red-500">autorenew</i></span>',
title: 'Restore',
onClick: (event: CalendarSchedulerEvent): void => {
console.log('Pressed action \'Restore\' on event ' + event.id);
}
}
];
events: CalendarSchedulerEvent[];
constructor( locale: string, private appService: AppService) {
this.locale = locale;
this.dayModifier = ((day: SchedulerViewDay): void => {
if (!this.isDateValid(day.date)) {
day.cssClass = 'cal-disabled';
}
}).bind(this);
this.hourModifier = ((hour: SchedulerViewHour): void => {
if (!this.isDateValid(hour.date)) {
hour.cssClass = 'cal-disabled';
}
}).bind(this);
this.segmentModifier = ((segment: SchedulerViewHourSegment): void => {
if (!this.isDateValid(segment.date)) {
segment.isDisabled = true;
}
}).bind(this);
this.dateOrViewChanged();
}
ngOnInit(): void {
this.appService.getEvents(this.actions)
.then((events: CalendarSchedulerEvent[]) => this.events = events);
}
changeDate(date: Date): void {
console.log('changeDate', date);
this.viewDate = date;
this.dateOrViewChanged();
}
changeView(view: CalendarPeriod): void {
console.log('changeView', view);
this.view = view;
this.dateOrViewChanged();
}
dateOrViewChanged(): void {
if (this.startsWithToday) {
this.prevBtnDisabled = !this.isDateValid(subPeriod(this.view, this.viewDate, 1));
this.nextBtnDisabled = !this.isDateValid(addPeriod(this.view, this.viewDate, 1));
} else {
this.prevBtnDisabled = !this.isDateValid(endOfPeriod(this.view, subPeriod(this.view, this.viewDate, 1)));
this.nextBtnDisabled = !this.isDateValid(startOfPeriod(this.view, addPeriod(this.view, this.viewDate, 1)));
}
if (this.viewDate < this.minDate) {
this.changeDate(this.minDate);
} else if (this.viewDate > this.maxDate) {
this.changeDate(this.maxDate);
}
}
private isDateValid(date: Date): boolean {
return /*isToday(date) ||*/ date >= this.minDate && date <= this.maxDate;
}
dayHeaderClicked(day: SchedulerViewDay): void {
console.log('dayHeaderClicked Day', day);
}
hourClicked(hour: SchedulerViewHour): void {
console.log('hourClicked Hour', hour);
}
segmentClicked(action: string, segment: SchedulerViewHourSegment): void {
console.log('segmentClicked Action', action);
console.log('segmentClicked Segment', segment);
}
eventClicked(action: string, event: CalendarSchedulerEvent): void {
console.log('eventClicked Action', action);
console.log('eventClicked Event', event);
}
eventTimesChanged({ event, newStart, newEnd }: SchedulerEventTimesChangedEvent): void {
console.log('eventTimesChanged Event', event);
console.log('eventTimesChanged New Times', newStart, newEnd);
let ev = this.events.find(e => e.id === event.id);
ev.start = newStart;
ev.end = newEnd;
this.refresh.next();
}
}
```
#### app.component.html
```html
...
<calendar-scheduler-view *ngSwitchCase="'week'"
[viewDate]="viewDate"
[events]="events"
[locale]="locale"
[weekStartsOn]="weekStartsOn"
[excludeDays]="excludeDays"
[startsWithToday]="startsWithToday"
[hourSegments]="2"
[dayStartHour]="dayStartHour"
[dayEndHour]="dayEndHour"
[dayModifier]="dayModifier"
[hourModifier]="hourModifier"
[segmentModifier]="segmentModifier"
[eventModifier]="eventModifier"
[showEventActions]="true"
[showSegmentHour]="false"
(dayHeaderClicked)="dayHeaderClicked($event.day)"
(hourClicked)="hourClicked($event.hour)"
(segmentClicked)="segmentClicked('Clicked', $event.segment)"
(eventClicked)="eventClicked('Clicked', $event.event)"
(eventTimesChanged)="eventTimesChanged($event)"
[refresh]="refresh">
</calendar-scheduler-view>
...
```
### License
This software is released under the MIT license. See [LICENSE](LICENSE) for more details.