Skip to content

Commit

Permalink
feature (switch between calendar formats): keep track of currently ac…
Browse files Browse the repository at this point in the history
…tive calendar format
  • Loading branch information
Tobias Schweizer committed Apr 3, 2018
1 parent b6242ad commit 03445c9
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 19 deletions.
42 changes: 35 additions & 7 deletions src/app/app.component.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {Component, Host, Inject} from '@angular/core';
import {Component, Host, Inject, OnInit} from '@angular/core';
import {FormBuilder, FormGroup, Validators} from '@angular/forms';
import {DateAdapter, MatCalendar} from '@angular/material';
import {JDNConvertibleCalendar} from 'jdnconvertiblecalendar';
Expand Down Expand Up @@ -31,10 +31,11 @@ export class AppComponent {
@Component({
selector: 'app-calendar-header',
template: `
<select (change)="convertCalendar($event.target.value)">
<option>Gregorian</option>
<option>Julian</option>
</select>
<mat-form-field>
<mat-select [formControl]="form.controls['calendar']">
<mat-option *ngFor="let cal of supportedCalendarFormats" [value]="cal">{{cal}}</mat-option>
</mat-select>
</mat-form-field>
<div class="custom-header">
<button mat-icon-button (click)="previousClicked('year')">&lt;&lt;</button>
<button mat-icon-button (click)="previousClicked('month')">&lt;</button>
Expand All @@ -45,9 +46,36 @@ export class AppComponent {
`,
styleUrls: []
})
export class HeaderComponent<D> {
export class HeaderComponent<D> implements OnInit {
constructor(@Host() private _calendar: MatCalendar<JDNConvertibleCalendar>,
private _dateAdapter: DateAdapter<JDNConvertibleCalendar>) {
private _dateAdapter: DateAdapter<JDNConvertibleCalendar>,
@Inject(FormBuilder) private fb: FormBuilder) {
}

form: FormGroup;

supportedCalendarFormats = JDNConvertibleCalendar.supportedCalendars;

activeFormat;

ngOnInit() {

this.activeFormat = 'Gregorian';

if (this._dateAdapter instanceof JDNConvertibleCalendarDateAdapter) {
this.activeFormat = this._dateAdapter.activeCalendarFormat;
}

// build a form for the calendar format selection
this.form = this.fb.group({
calendar: [this.activeFormat, Validators.required]
});

// update the selected calendar format
this.form.valueChanges.subscribe((data) => {
this.convertCalendar(data.calendar);
});

}

convertCalendar(calendar: 'Gregorian' | 'Julian') {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ import {Injectable} from '@angular/core';
import {DateAdapter} from '@angular/material';
import {JDNConvertibleCalendar, CalendarDate, GregorianCalendarDate, JDNPeriod} from 'jdnconvertiblecalendar';
import {JDNConvertibleConversionModule} from 'jdnconvertiblecalendar';
import {JDNConvertibleCalendarModule} from 'jdnconvertiblecalendar/dist/JDNConvertibleCalendar';
import JulianCalendarDate = JDNConvertibleCalendarModule.JulianCalendarDate;


@Injectable()
Expand All @@ -44,6 +46,13 @@ export class JDNConvertibleCalendarDateAdapter extends DateAdapter<JDNConvertibl
'DD-MM-YYYY': /^(\d?\d)-(\d?\d)-(\d{4})/
};

// the currently active calendar format
private _activeCalendarFormat = 'Gregorian';

get activeCalendarFormat() {
return this._activeCalendarFormat;
}

/**
* Adds leading zeros to a given number and returns the resulting string.
*
Expand All @@ -55,7 +64,7 @@ export class JDNConvertibleCalendarDateAdapter extends DateAdapter<JDNConvertibl
const missingDigits = digits - String(num).length;

if (missingDigits > 0) {
let leadingZeros: string = '';
let leadingZeros = '';
for (let i = 0; i < missingDigits; i++) {
leadingZeros += '0';
}
Expand Down Expand Up @@ -83,9 +92,11 @@ export class JDNConvertibleCalendarDateAdapter extends DateAdapter<JDNConvertibl

switch (format) {
case 'Gregorian':
this._activeCalendarFormat = 'Gregorian';
return dateMod.convertCalendar('Gregorian');

case 'Julian':
this._activeCalendarFormat = 'Julian';
return dateMod.convertCalendar('Julian');

default:
Expand Down Expand Up @@ -156,24 +167,35 @@ export class JDNConvertibleCalendarDateAdapter extends DateAdapter<JDNConvertibl
}

clone(date: JDNConvertibleCalendar): JDNConvertibleCalendar {
// TODO: assume Gregorian date for now, make this configurable

const jdnPeriod = date.toJDNPeriod();

return new GregorianCalendarDate(jdnPeriod);
switch (this._activeCalendarFormat) {
case 'Gregorian':
return new GregorianCalendarDate(jdnPeriod);

case 'Julian':
return new JulianCalendarDate(jdnPeriod);
}

}

createDate(year: number, month: number, date: number): JDNConvertibleCalendar {

// TODO: support different calendar formats
// assume Gregorian for now

// month param is 0 indexed, but we use 1 based index for months
const calDate = new CalendarDate(year, month + 1, date);

const jdn = JDNConvertibleConversionModule.gregorianToJDN(calDate);
let jdn;

return new GregorianCalendarDate(new JDNPeriod(jdn, jdn));
switch (this._activeCalendarFormat) {
case 'Gregorian':
jdn = JDNConvertibleConversionModule.gregorianToJDN(calDate);
return new GregorianCalendarDate(new JDNPeriod(jdn, jdn));

case 'Julian':
jdn = JDNConvertibleConversionModule.julianToJDN(calDate);
return new JulianCalendarDate(new JDNPeriod(jdn, jdn));
}

}

Expand All @@ -198,7 +220,7 @@ export class JDNConvertibleCalendarDateAdapter extends DateAdapter<JDNConvertibl
parse(value: any, parseFormat: any): JDNConvertibleCalendar | null {

let date;
if (parseFormat !== undefined && typeof parseFormat == 'string' && JDNConvertibleCalendarDateAdapter.parsableDateFormats.indexOf(parseFormat) !== -1) {
if (parseFormat !== undefined && typeof parseFormat === 'string' && JDNConvertibleCalendarDateAdapter.parsableDateFormats.indexOf(parseFormat) !== -1) {

switch (parseFormat) {
case JDNConvertibleCalendarDateAdapter.DD_MM_YYYY: {
Expand Down Expand Up @@ -237,15 +259,16 @@ export class JDNConvertibleCalendarDateAdapter extends DateAdapter<JDNConvertibl

format(date: JDNConvertibleCalendar, displayFormat: any): string {
let dateString = '';
if (displayFormat !== undefined && typeof displayFormat == 'string' && JDNConvertibleCalendarDateAdapter.displayDateFormats.lastIndexOf(displayFormat) !== -1) {
if (displayFormat !== undefined && typeof displayFormat === 'string' && JDNConvertibleCalendarDateAdapter.displayDateFormats.lastIndexOf(displayFormat) !== -1) {

const calendarPeriod = date.toCalendarPeriod();

switch (displayFormat) {

case JDNConvertibleCalendarDateAdapter.DD_MM_YYYY: {

dateString = `${JDNConvertibleCalendarDateAdapter.addLeadingZeroToNumber(calendarPeriod.periodStart.day, 2)}-${JDNConvertibleCalendarDateAdapter.addLeadingZeroToNumber(calendarPeriod.periodStart.month, 2)}-${JDNConvertibleCalendarDateAdapter.addLeadingZeroToNumber(calendarPeriod.periodStart.year, 4)}`;
dateString =
`${JDNConvertibleCalendarDateAdapter.addLeadingZeroToNumber(calendarPeriod.periodStart.day, 2)}-${JDNConvertibleCalendarDateAdapter.addLeadingZeroToNumber(calendarPeriod.periodStart.month, 2)}-${JDNConvertibleCalendarDateAdapter.addLeadingZeroToNumber(calendarPeriod.periodStart.year, 4)}`;
break;

}
Expand Down Expand Up @@ -293,7 +316,7 @@ export class JDNConvertibleCalendarDateAdapter extends DateAdapter<JDNConvertibl

addCalendarDays(date: JDNConvertibleCalendar, days: number): JDNConvertibleCalendar {

// another instance has to be returned, otherwiese events do not work correctly
// another instance has to be returned, otherwise events do not work correctly

const dateMod = this.clone(date);

Expand All @@ -309,6 +332,8 @@ export class JDNConvertibleCalendarDateAdapter extends DateAdapter<JDNConvertibl

const gregorianCalPeriod = gregorianCal.toCalendarPeriod();

console.log('to iso');

return `${JDNConvertibleCalendarDateAdapter.addLeadingZeroToNumber(gregorianCalPeriod.periodStart.year, 4)}-${JDNConvertibleCalendarDateAdapter.addLeadingZeroToNumber(gregorianCalPeriod.periodStart.month, 2)}-${JDNConvertibleCalendarDateAdapter.addLeadingZeroToNumber(gregorianCalPeriod.periodStart.day, 2)}`;

}
Expand Down

0 comments on commit 03445c9

Please sign in to comment.