<!DOCTYPE html>
<html>
<head>
<title>Refreshing the view</title>
<link href="https://unpkg.com/bootstrap@4.0.0-beta.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://unpkg.com/font-awesome@4.7.0/css/font-awesome.css" rel="stylesheet">
<link href="https://unpkg.com/angular-calendar@0.23.1/css/angular-calendar.css" rel="stylesheet">
<script src="https://unpkg.com/zone.js@0.8.19"></script>
<script src="https://unpkg.com/zone.js@0.8.19/dist/long-stack-trace-zone.js"></script>
<script src="https://unpkg.com/reflect-metadata@0.1.10"></script>
<script src="https://unpkg.com/systemjs@0.19/dist/system.js"></script>
<script src="config.js"></script>
<script>
System.import('app').catch(console.error.bind(console));
</script>
</head>
<body>
<mwl-demo-component>Loading...</mwl-demo-component>
</body>
</html>
System.config({
//use typescript for compilation
transpiler: 'typescript',
//typescript compiler options
typescriptOptions: {
emitDecoratorMetadata: true
},
paths: {
'npm:': 'https://unpkg.com/'
},
//map tells the System loader where to look for things
map: {
'app': './',
'@angular/core': 'npm:@angular/core@4.4.6/bundles/core.umd.js',
'@angular/common': 'npm:@angular/common@4.4.6/bundles/common.umd.js',
'@angular/common/http': 'npm:@angular/common@4.4.6/bundles/common-http.umd.js',
'@angular/compiler': 'npm:@angular/compiler@4.4.6/bundles/compiler.umd.js',
'@angular/platform-browser': 'npm:@angular/platform-browser@4.4.6/bundles/platform-browser.umd.js',
'@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic@4.4.6/bundles/platform-browser-dynamic.umd.js',
'@angular/router': 'npm:@angular/router@4.4.6/bundles/router.umd.js',
'@angular/forms': 'npm:@angular/forms@4.4.6/bundles/forms.umd.js',
'@angular/platform-browser/animations': 'npm:@angular/platform-browser@4.4.6/bundles/platform-browser-animations.umd.js',
'@angular/animations/browser': 'npm:@angular/animations@4.4.6/bundles/animations-browser.umd.js',
'@angular/animations': 'npm:@angular/animations@4.4.6/bundles/animations.umd.js',
'@angular/cdk/platform': 'npm:@angular/cdk@2.0.0-beta.8/bundles/cdk.umd.js',
'angular-calendar': 'npm:angular-calendar@0.22.3/umd/angular-calendar.js',
'calendar-utils': 'npm:calendar-utils@0.0.60/dist/umd/calendar-utils.js',
'angular-resizable-element': 'npm:angular-resizable-element@2.0.0/bundles/angular-resizable-element.umd.js',
'angular-draggable-droppable': 'npm:angular-draggable-droppable@2.0.0/bundles/angular-draggable-droppable.umd.js',
'date-fns': 'npm:date-fns@1.29.0',
'positioning': 'npm:positioning@1.3.1/dist/umd/positioning.js',
'@ng-bootstrap/ng-bootstrap': 'npm:@ng-bootstrap/ng-bootstrap@1.0.0-beta.8',
'ngx-contextmenu': 'npm:ngx-contextmenu@4.1.1',
'rxjs': 'npm:rxjs@5.5.6',
'rrule': 'npm:rrule@2.2.0',
'typescript': 'npm:typescript@2.2.2/lib/typescript.js'
},
//packages defines our app package
packages: {
app: {
main: './bootstrap.ts',
defaultExtension: 'ts'
},
rxjs: {
defaultExtension: 'js'
},
'date-fns': {
main: './index.js',
defaultExtension: 'js'
},
'ngx-contextmenu': {
main: './lib/index.js',
defaultExtension: 'js'
}
}
});
import { Component, Input, Output, EventEmitter } from '@angular/core';
@Component({
selector: 'mwl-demo-utils-calendar-header',
template: `
<div class="row text-center">
<div class="col-md-4">
<div class="btn-group">
<div
class="btn btn-primary"
mwlCalendarPreviousView
[view]="view"
[(viewDate)]="viewDate"
(viewDateChange)="viewDateChange.next(viewDate)">
Previous
</div>
<div
class="btn btn-outline-secondary"
mwlCalendarToday
[(viewDate)]="viewDate"
(viewDateChange)="viewDateChange.next(viewDate)">
Today
</div>
<div
class="btn btn-primary"
mwlCalendarNextView
[view]="view"
[(viewDate)]="viewDate"
(viewDateChange)="viewDateChange.next(viewDate)">
Next
</div>
</div>
</div>
<div class="col-md-4">
<h3>{{ viewDate | calendarDate:(view + 'ViewTitle'):locale }}</h3>
</div>
<div class="col-md-4">
<div class="btn-group">
<div
class="btn btn-primary"
(click)="viewChange.emit('month')"
[class.active]="view === 'month'">
Month
</div>
<div
class="btn btn-primary"
(click)="viewChange.emit('week')"
[class.active]="view === 'week'">
Week
</div>
<div
class="btn btn-primary"
(click)="viewChange.emit('day')"
[class.active]="view === 'day'">
Day
</div>
</div>
</div>
</div>
<br>
`
})
export class CalendarHeaderComponent {
@Input() view: string;
@Input() viewDate: Date;
@Input() locale: string = 'en';
@Output() viewChange: EventEmitter<string> = new EventEmitter();
@Output() viewDateChange: EventEmitter<Date> = new EventEmitter();
}
export const colors: any = {
red: {
primary: '#ad2121',
secondary: '#FAE3E3'
},
blue: {
primary: '#1e90ff',
secondary: '#D1E8FF'
},
yellow: {
primary: '#e3bc08',
secondary: '#FDF1BA'
}
};
import { ChangeDetectorRef, Component, forwardRef, Input } from '@angular/core';
import {
getSeconds,
getMinutes,
getHours,
getDate,
getMonth,
getYear,
setSeconds,
setMinutes,
setHours,
setDate,
setMonth,
setYear
} from 'date-fns';
import { NgbDateStruct, NgbTimeStruct } from '@ng-bootstrap/ng-bootstrap';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
export const DATE_TIME_PICKER_CONTROL_VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DateTimePickerComponent),
multi: true
};
@Component({
selector: 'mwl-demo-utils-date-time-picker',
template: `
<form class="form-inline">
<div class="form-group">
<div class="input-group">
<input
readonly
class="form-control"
[placeholder]="placeholder"
name="date"
[(ngModel)]="dateStruct"
(ngModelChange)="updateDate()"
ngbDatepicker
#datePicker="ngbDatepicker">
<div class="input-group-addon" (click)="datePicker.toggle()" >
<i class="fa fa-calendar"></i>
</div>
</div>
</div>
</form>
<ngb-timepicker
[(ngModel)]="timeStruct"
(ngModelChange)="updateTime()"
[meridian]="true">
</ngb-timepicker>
`,
styles: [
`
.form-group {
width: 100%;
}
`
],
providers: [DATE_TIME_PICKER_CONTROL_VALUE_ACCESSOR]
})
export class DateTimePickerComponent implements ControlValueAccessor {
@Input() placeholder: string;
date: Date;
dateStruct: NgbDateStruct;
timeStruct: NgbTimeStruct;
datePicker: any;
private onChangeCallback: (date: Date) => void = () => {};
constructor(private cdr: ChangeDetectorRef) {}
writeValue(date: Date): void {
this.date = date;
this.dateStruct = {
day: getDate(date),
month: getMonth(date) + 1,
year: getYear(date)
};
this.timeStruct = {
second: getSeconds(date),
minute: getMinutes(date),
hour: getHours(date)
};
this.cdr.detectChanges();
}
registerOnChange(fn: any): void {
this.onChangeCallback = fn;
}
registerOnTouched(fn: any): void {}
updateDate(): void {
const newDate: Date = setYear(
setMonth(
setDate(this.date, this.dateStruct.day),
this.dateStruct.month - 1
),
this.dateStruct.year
);
this.writeValue(newDate);
this.onChangeCallback(newDate);
}
updateTime(): void {
const newDate: Date = setHours(
setMinutes(
setSeconds(this.date, this.timeStruct.second),
this.timeStruct.minute
),
this.timeStruct.hour
);
this.writeValue(newDate);
this.onChangeCallback(newDate);
}
}
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import {
NgbDatepickerModule,
NgbTimepickerModule
} from '@ng-bootstrap/ng-bootstrap';
import { CalendarModule } from 'angular-calendar';
import { CalendarHeaderComponent } from './calendar-header.component';
import { DateTimePickerComponent } from './date-time-picker.component';
@NgModule({
imports: [
CommonModule,
FormsModule,
NgbDatepickerModule.forRoot(),
NgbTimepickerModule.forRoot(),
CalendarModule
],
declarations: [CalendarHeaderComponent, DateTimePickerComponent],
exports: [CalendarHeaderComponent, DateTimePickerComponent]
})
export class DemoUtilsModule {}
import {
Component,
ChangeDetectionStrategy,
ViewEncapsulation
} from '@angular/core';
import { CalendarEvent, CalendarMonthViewDay } from 'angular-calendar';
import { Subject } from 'rxjs/Subject';
const RED_CELL: 'red-cell' = 'red-cell';
const BLUE_CELL: 'blue-cell' = 'blue-cell';
@Component({
moduleId: __moduleName,
selector: 'mwl-demo-component',
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,
templateUrl: 'template.html',
styles: [
`
.red-cell {
background-color: red !important;
}
.blue-cell {
background-color: #1d86c8 !important;
}
`
]
})
export class DemoComponent {
view: string = 'month';
clickedDate: string = '';
viewDate: Date = new Date();
events: CalendarEvent[] = [];
refresh: Subject<any> = new Subject();
cssClass: string = RED_CELL;
refreshView(): void {
this.cssClass = this.cssClass === RED_CELL ? BLUE_CELL : RED_CELL;
this.refresh.next();
}
beforeMonthViewRender({ body }: { body: CalendarMonthViewDay[] }): void {
body.forEach(day => {
if (day.date.getDate() % 2 === 1) {
day.cssClass = this.cssClass;
}
});
}
}
<mwl-demo-utils-calendar-header
[(view)]="view"
[(viewDate)]="viewDate">
</mwl-demo-utils-calendar-header>
<div class="text-center">
<h2>clickedDate is {{clickedDate}}</h2>
<button class="btn btn-primary" (click)="refreshView()">Refresh + re-render the current view</button>
</div>
<div [ngSwitch]="view">
<mwl-calendar-month-view
*ngSwitchCase="'month'"
[viewDate]="viewDate"
[events]="events"
[refresh]="refresh"
(beforeViewRender)="beforeMonthViewRender($event)"
(dayClicked)="clickedDate = $event.day.date">
</mwl-calendar-month-view>
<mwl-calendar-week-view
*ngSwitchCase="'week'"
[viewDate]="viewDate"
[events]="events"
[refresh]="refresh">
</mwl-calendar-week-view>
<mwl-calendar-day-view
*ngSwitchCase="'day'"
[viewDate]="viewDate"
[events]="events"
[refresh]="refresh">
</mwl-calendar-day-view>
</div>
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CalendarModule } from 'angular-calendar';
import { DemoUtilsModule } from '../demo-utils/module';
import { DemoComponent } from './component';
@NgModule({
imports: [
CommonModule,
CalendarModule.forRoot(),
DemoUtilsModule
],
declarations: [DemoComponent],
exports: [DemoComponent]
})
export class DemoModule {}
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { NgModule } from '@angular/core';
import { DemoModule } from './demo/module';
import { DemoComponent } from './demo/component';
@NgModule({
imports: [
BrowserModule,
BrowserAnimationsModule,
DemoModule
],
bootstrap: [DemoComponent]
})
export class BootstrapModule {}
platformBrowserDynamic().bootstrapModule(BootstrapModule);