diff --git a/demo/src/app/components/datepicker/datepicker.module.ts b/demo/src/app/components/datepicker/datepicker.module.ts index 92911bd424..ce6a34b19c 100644 --- a/demo/src/app/components/datepicker/datepicker.module.ts +++ b/demo/src/app/components/datepicker/datepicker.module.ts @@ -90,7 +90,7 @@ const DEMOS = { markup: require('!!raw-loader!./demos/disabled/datepicker-disabled.html').default }, adapter: { - title: 'Custom date adapter', + title: 'Custom date adapter and formatter', type: NgbdDatepickerAdapter, code: require('!!raw-loader!./demos/adapter/datepicker-adapter').default, markup: require('!!raw-loader!./demos/adapter/datepicker-adapter.html').default diff --git a/demo/src/app/components/datepicker/demos/adapter/datepicker-adapter.html b/demo/src/app/components/datepicker/demos/adapter/datepicker-adapter.html index d9d9c90e20..b2f7a94724 100644 --- a/demo/src/app/components/datepicker/demos/adapter/datepicker-adapter.html +++ b/demo/src/app/components/datepicker/demos/adapter/datepicker-adapter.html @@ -1,6 +1,10 @@ -

These datepickers use custom Date adapter that lets you use your own model implementation. -In this example we are converting from and to a JS native Date object

- +

These datepickers use custom date adapter and formatter. + The custom NgbDateAdapter lets you use your own model i.e. the structure of ngModel. + The custom NgbDateParserFormatter lets you use your own formatter or parser i.e. the date format in input field. +
+
+ Notice that there are two different services: the NgbDateAdapter and the NgbDateParserFormatter.

+
@@ -17,7 +21,7 @@
-
diff --git a/demo/src/app/components/datepicker/demos/adapter/datepicker-adapter.ts b/demo/src/app/components/datepicker/demos/adapter/datepicker-adapter.ts index 700301febb..f537537e58 100644 --- a/demo/src/app/components/datepicker/demos/adapter/datepicker-adapter.ts +++ b/demo/src/app/components/datepicker/demos/adapter/datepicker-adapter.ts @@ -1,5 +1,70 @@ import {Component, Injectable} from '@angular/core'; -import {NgbDateAdapter, NgbDateStruct, NgbDateNativeAdapter} from '@ng-bootstrap/ng-bootstrap'; +import { + NgbCalendar, + NgbDateAdapter, + NgbDateStruct, + NgbDateParserFormatter +} from '@ng-bootstrap/ng-bootstrap'; + +/** + * This Service handles how the date is represented in scripts i.e. ngModel. + */ +@Injectable() +export class CustomAdapter extends NgbDateAdapter { + + readonly DELIMITER = '-'; + + fromModel(value: string): NgbDateStruct { + let result: NgbDateStruct = null; + if (value) { + let date = value.split(this.DELIMITER); + result = { + day : parseInt(date[0], 10), + month : parseInt(date[1], 10), + year : parseInt(date[2], 10) + }; + } + return result; + } + + toModel(date: NgbDateStruct): string { + let result: string = null; + if (date) { + result = date.day + this.DELIMITER + date.month + this.DELIMITER + date.year; + } + return result; + } +} + +/** + * This Service handles how the date is rendered and parsed from keyboard i.e. in the bound input field. + */ +@Injectable() +export class CustomDateParserFormatter extends NgbDateParserFormatter { + + readonly DELIMITER = '/'; + + parse(value: string): NgbDateStruct { + let result: NgbDateStruct = null; + if (value) { + let date = value.split(this.DELIMITER); + result = { + day : parseInt(date[0], 10), + month : parseInt(date[1], 10), + year : parseInt(date[2], 10) + }; + } + return result; + } + + format(date: NgbDateStruct): string { + let result: string = null; + if (date) { + result = date.day + this.DELIMITER + date.month + this.DELIMITER + date.year; + } + return result; + } +} @Component({ selector: 'ngbd-datepicker-adapter', @@ -7,14 +72,19 @@ import {NgbDateAdapter, NgbDateStruct, NgbDateNativeAdapter} from '@ng-bootstrap // NOTE: For this example we are only providing current component, but probably // NOTE: you will want to provide your main App Module - providers: [{provide: NgbDateAdapter, useClass: NgbDateNativeAdapter}] + providers: [ + {provide: NgbDateAdapter, useClass: CustomAdapter}, + {provide: NgbDateParserFormatter, useClass: CustomDateParserFormatter} + ] }) export class NgbdDatepickerAdapter { - model1: Date; - model2: Date; + model1: string; + model2: string; + + constructor(private ngbCalendar: NgbCalendar, private dateAdapter: NgbDateAdapter) {} get today() { - return new Date(); + return this.dateAdapter.toModel(this.ngbCalendar.getToday()); } } diff --git a/demo/src/app/components/datepicker/overview/datepicker-overview.component.html b/demo/src/app/components/datepicker/overview/datepicker-overview.component.html index bdcea5df99..70a6b7b0ce 100644 --- a/demo/src/app/components/datepicker/overview/datepicker-overview.component.html +++ b/demo/src/app/components/datepicker/overview/datepicker-overview.component.html @@ -134,9 +134,8 @@

Handling the popup

Adapters

- You can also tell datepicker to use the native javascript date adapter (bundled with ng-bootstrap) as in the - custom date adapter example. For now - the adapter works only for the form integration, so for instance (ngModelChange) + You can also tell datepicker to use the native JavaScript date adapter (bundled with ng-bootstrap). + For now the adapter works only for the form integration, so for instance (ngModelChange) will return a native date object. All other APIs continue to use NgbDateStruct.

@@ -144,7 +143,8 @@

Adapters

You can also create your own adapters if necessary by extending and implementing the - NgbDateAdapter methods. + NgbDateAdapter methods, as in + custom date adapter example.

@@ -164,6 +164,12 @@

Input date parsing and formatting

If the entered input value is invalid, the form model will contain the entered text.

+

+ You can also create your own parser or formatter if necessary by extending and implementing the + NgbDateParserFormatter methods, as in + custom date parser formatter example. +

+