Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MatDatePicker start week on monday

There is any way to configure the md-datepicker to start week on monday? By default it start on Sunday and there isn't any specification who to change this.

like image 245
Sergi Riera Sau Avatar asked Jul 10 '17 18:07

Sergi Riera Sau


People also ask

How do you use matDatepicker?

mat-datepicker exampleAdd a template reference variable mat-datepicker element. Connect mat-datepicker to input element via [matDatepicker] property. Finally add date picker toggle button to display or hide calender popup by using mat-datepicker-toggle element.

How can I get date from Mat Datepicker?

Connecting a date-picker to an inputThe date-picker is made up of text input and a calendar pop-up, which is linked via the mat-Date-picker property to the text input. It also has an optional date-picker toggle button that gives the user a simple method to open the date-picker pop-up window.


2 Answers

You have to build a custom DateAdapter. A custom DateAdapter is a class which implements the DateAdapter interface. It must have a bunch of predefined function implementations and have to be registered as a useClass for the DateAdapter provider.

providers: [{provide: DateAdapter, useClass: CustomDateAdapter }]

The date adapter tells the datepicker things like how to store dates/times internally, how to present them in the input and other things.

Material provided two classes which implement the DateAdapter interface: NativeDateAdapter and MomentDateAdapter. They tell MatDatepicker how to work with the javascript native Date object and moment object, respectively. I'll talk about the javascript native Date object, but the same principles apply to any date representation. The javascript Date object has some limitations (for example, it's not possible to tell it how do you want to present dates). The long story short: just extends the Material provided NativeDateAdapter and override the functions you need. What you want to do is shown in this stackblitz demo (basically you want to override a function of the NativeDateAdapter: getFirstDayOfWeek : () => number) and I'll give a little overview afterwards.

getFirstDayOfWeek(): number {
  return 1;
}

In the demo, you will see a custom-date-adapter.ts. This is where you should extended the NativeDateAdapter, overriding two functions:

1) parse: (value: any) => Date | null
2) getFirstDayOfWeek: ()=> number

The first function meant to a) among other things, create a Date object from what the user chose in the calendar, and b) parse what is typed in the input to a Date object.

The second function (getFirstDayOfWeek) tells the calendar to start in a specifc week day (0 - Sunday, 1 - Monday, 2 - Tuesday ...).

Also there's an interesting format: (date: Date, displayFormat: Object) => string function available to be implemented/overriden that allows you to define the format the date string must be shown in the input after being selected from the calendar popup.

In the demo, in the main.ts you must tell Angular that there is a custom date adapter to use (look at the providers array). In this case, I built this demo to work with Brazilian Portuguese (look at the main.ts constructor, for the date.setLocale('pt-BR')). Over here, we present dates as dd/MM/yyy, knowing Monday == "Segunda-Feira" in portuguese. :D

The other pre-built adapter (MomentDateAdapter, based on Moment.js instead of just the native Date object) that, in some cases, saves you from building a custom date adapter, as Moment.js already deals with locales in a more efficient way).

Hope it helps.

like image 128
julianobrasil Avatar answered Sep 20 '22 18:09

julianobrasil


In case if anyone using <ngx-mat-datetime-picker> and wanted to achieve start a week from Monday instead of Sunday.

app.module.ts

providers:[{ provide: NgxMatDateAdapter, useClass: CustomDateAdapter}]

custom.date.adapter.ts

import { NgxMatNativeDateAdapter } from '@angular-material-components/datetime-picker';
import { Injectable } from "@angular/core";


@Injectable()
export class CustomDateAdapter extends NgxMatNativeDateAdapter {
  getFirstDayOfWeek(): number {
     return 1;
   }
}
like image 29
Ezhilisai Avatar answered Sep 19 '22 18:09

Ezhilisai