Visão geral do componente Angular Calendar
Angular Calendar é um componente de UI usado para exibir datas e dias em um aplicativo. Suportando diferentes recursos, ele permite que os usuários gerenciem facilmente funcionalidades de calendário, arrastem e criem eventos em um calendário, naveguem até uma data preferida nele e mostrem eventos em uma visualização mensal, semanal ou diária do calendário Angular com um único clique.
O componente Ignite UI for Angular Calendar, desenvolvido como um componente nativo Angular, fornece maneiras fáceis e intuitivas de exibir informações de data, habilitar datas ou aplicar o modo de desabilitação de datas do calendário Angular. Os usuários podem escolher entre três modos de seleção diferentes - seleção única, seleção múltipla ou seleção de intervalo.
Angular Calendar Example
Criamos o seguinte exemplo de Angular Calendar usando o pacote Ignite UI for Angular Calendar. Ele mostra rapidamente como um calendário básico se parece e se comporta, como os usuários podem escolher e destacar uma única data e como ir e voltar para uma data específica.
Getting Started with Ignite UI for Angular Calendar
Para começar a usar o componente Ignite UI for Angular Calendar, primeiro você precisa instalar Ignite UI for Angular. Em um aplicativo Angular existente, digite o seguinte comando:
ng add igniteui-angular
Para obter uma introdução completa ao Ignite UI for Angular, leia o tópico de introdução.
O próximo passo é importar o IgxCalendarModule
no seu arquivo app.module.ts.
Note
O IgxCalendarComponent também depende do BrowserAnimationsModule
e, opcionalmente, do HammerModule
para interações por toque, então eles precisam ser adicionados ao AppModule também:
// app.module.ts
...
import { HammerModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { IgxCalendarModule } from 'igniteui-angular';
// import { IgxCalendarModule } from '@infragistics/igniteui-angular'; for licensed package
@NgModule({
...
imports: [..., BrowserAnimationsModule, HammerModule, IgxCalendarModule],
...
})
export class AppModule {}
Como alternativa, a partir da 16.0.0
, você pode importar o IgxCalendarComponent
como uma dependência autônoma ou usar o token IGX_CALENDAR_DIRECTIVES
para importar o componente e todos os seus componentes e diretivas de suporte.
// home.component.ts
import { HammerModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { IGX_CALENDAR_DIRECTIVES } from 'igniteui-angular';
// import { IGX_CALENDAR_DIRECTIVES } from '@infragistics/igniteui-angular'; for licensed package
@Component({
selector: 'app-home',
template: '<igx-calendar></igx-calendar>',
styleUrls: ['home.component.scss'],
standalone: true,
imports: [BrowserAnimationsModule, HammerModule, IGX_CALENDAR_DIRECTIVES]
/* or imports: [BrowserAnimationsModule, HammerModule, IgxCalendarComponent] */
})
export class HomeComponent {}
Agora que você importou o módulo ou as diretivas do Ignite UI for Angular Calendar, você pode começar a usar o componente igx-calendar
.
Note
O IgxCalendarComponent
usa a Intl Web API para localização e formatação de datas. Considere usar polyfills apropriados se sua plataforma de destino não os suportar.
Using the Angular Calendar
Angular Single Selection Calendar
Instanciar o IgxCalendarComponent
é tão fácil quanto colocar seu elemento seletor no template. Isso exibirá o mês atual no modo de calendário de seleção única.
<!-- app.component.html -->
<!-- Single selection mode -->
<igx-calendar></igx-calendar>
Angular Calendar Multiselect
Podemos facilmente alterar o modo padrão usando a propriedade selection
:
<!-- app.component.html -->
<!-- Multi selection mode -->
<igx-calendar selection="multi" [showWeekNumbers]="true"></igx-calendar>
Angular Calendar Range Picker
Seguindo a mesma abordagem, podemos alternar para o modo de seleção de intervalo:
<!-- app.component.html -->
<!-- Range selection mode -->
<igx-calendar selection="range"></igx-calendar>
Note
Observe que o cabeçalho do calendário não é renderizado quando a seleção é multi
ou range
.
Localization and Formatting
Devido à sua própria natureza, localização e formatação são essenciais para qualquer calendário. No IgxCalendarComponent
, elas são controladas e personalizadas por meio das seguintes propriedades -locale
, formatOptions
, formatViews
, weekStart
.
Vamos em frente e tentar isso junto com outras personalizações da IgxCalendarComponent API
. A primeira coisa que precisamos definir é o weekStart
, que controla o dia inicial da semana. O padrão é 0, que corresponde a domingo, então definiremos um valor de 1 para segunda-feira. Na marcação abaixo, também estamos vinculando as propriedades formatOptions
e formatViews
para personalizar a formatação de exibição. Por fim, estamos vinculando a propriedade locale
a um valor, com base na escolha de localização do usuário:
<!-- app.component.html -->
<igx-select #select [(ngModel)]="locale">
<igx-select-item *ngFor="let locale of locales" [value]="locale">
{{ locale }}
</igx-select-item>
</igx-select>
<igx-calendar #calendar
[weekStart]="1"
[locale]="locale"
[formatOptions]="formatOptions"
[formatViews]="formatViews">
</igx-calendar>
Todos os valores de propriedade devem ser definidos no arquivo AppComponent:
// app.component.ts
@ViewChild('calendar', { read: IgxCalendarComponent }) public calendar: IgxCalendarComponent;
public formatOptions: any;
public formatViews: any;
public locales = ['EN', 'DE', 'FR', 'AR', 'ZH'];
public locale = 'EN';
public ngOnInit() {
this.formatOptions = { day: '2-digit', month: 'long', weekday: 'long', year: 'numeric' };
this.formatViews = { day: true, month: true, year: true };
}
Se tudo correu bem, agora devemos ter um calendário com exibição de datas personalizadas, que também altera a representação de localidade, com base na localização do usuário. Vamos dar uma olhada:
How to Disable Dates In Angular Calendar
Esta seção demonstra o uso da funcionalidade disabledDates
. Para esse propósito, diferentes datas ou intervalos únicos podem ser adicionados a um array e então passados para o descritor disabledDates
.
O DateRangeType
é usado para especificar um intervalo que será desabilitado.
Vamos criar um exemplo que desabilita as datas entre os dias 3 e 8 do mês atual:
export class CalendarSample6Component {
@ViewChild('calendar') public calendar: IgxCalendarComponent;
public today = new Date(Date.now());
public range = [
new Date(this.today.getFullYear(), this.today.getMonth(), 3),
new Date(this.today.getFullYear(), this.today.getMonth(), 8)
];
public ngOnInit() {
this.calendar.disabledDates = [{ type: DateRangeType.Between, dateRange: this.range }];
}
}
Essas configurações devem ter o seguinte resultado:
Special dates
O recurso specialDates
está usando quase os mesmos princípios de configuração que o disabledDates
. A capacidade de selecionar e focar specialDates
é o que os diferencia dos disabled
.
Vamos adicionar algumas specialDates
ao nosso igxCalendar
. Para fazer isso, temos que criar um item DateRangeDescriptor
do tipo DateRangeType.Specific
e passar um array de datas como um dateRange
:
export class CalendarSample7Component {
@ViewChild('calendar', { static: true })
public calendar: IgxCalendarComponent;
@ViewChild('alert', { static: true })
public dialog: IgxDialogComponent;
public range = [];
public selectPTOdays(dates: Date[]) {
this.range = dates;
}
public submitPTOdays(eventArgs) {
this.calendar.specialDates =
[{ type: DateRangeType.Specific, dateRange: this.range }];
this.range.forEach((item) => {
this.calendar.selectDate(item);
});
...
}
}
<igx-calendar #calendar weekStart="1"
selection="multi"
(selected)="selectPTOdays($event)">
</igx-calendar>
<igx-dialog #alert title="Request Time Off"
leftButtonLabel="OK"
(leftButtonSelect)="alert.close()">
</igx-dialog>
<button igxButton="contained" (click)="submitPTOdays($event)">Submit Request</button>
A demonstração a seguir ilustra um calendário com uma opção de solicitação de férias:
Week numbers
Agora você pode usar a entrada showWeekNumbers
para mostrar os números da semana para os componentes Calendar e DatePicker.
<!-- app.component.html -->
<igx-calendar selection="multi" [showWeekNumbers]="true"></igx-calendar>
A demonstração a seguir ilustra um calendário com números de semana habilitados:
Calendar Events
Vamos explorar os eventos emitidos pelo calendário:
selected
- emitido ao selecionar data(s) no calendário.viewDateChanged
- emitido sempre que o mês/ano apresentado é alterado - por exemplo, após navegar para o mêsnext
ouprevious
.activeViewChanged
- emitido após a visualização ativa ser alterada - por exemplo, após o usuário clicar na seção demonth
ouyear
no cabeçalho.
<!-- app.component.html -->
<igx-calendar #calendar
(selected)="onSelection($event)"
(viewDateChanged)="viewDateChanged($event)"
(activeViewChanged)="activeViewChanged($event)">
</igx-calendar>
O evento selected
é adequado para construir lógica de validação de entrada. Use o código abaixo para alertar o usuário se a seleção exceder 5 dias e, em seguida, redefina a seleção:
// app.component.ts
...
public onSelection(dates: Date[]) {
if (dates.length > 5) {
this.calendar.selectedDates = [];
// alert the user
}
}
public viewDateChanged(event: IViewDateChangeEventArgs) {
// use event.previousValue to get previous month/year that was presented.
// use event.currentValue to get current month/year that is presented.
}
public activeViewChanged(event: CalendarView) {
// use CalendarView[event] to get the current active view (DEFAULT, YEAR or DECADE)
}
Use a demonstração abaixo para brincar (alterar seleção, navegar por meses e anos) e ver os eventos registrados em tempo real:
Angular Calendar Views
Há visualizações separadas fornecidas pelo IgxCalendarModule
que podem ser usadas independentemente:
- Visualização de dias do calendário Angular-
igx-days-view
- Visualização mensal do calendário Angular-
igx-months-view
- Visualização do ano do calendário Angular-
igx-years-view
Navegação pelo teclado
Se você navegar pela página usando a tecla Tab, lembre-se de que, com base nas recomendações de acessibilidade do W3, o igxCalendarComponent agora apresenta as seguintes paradas de tabulação:
- Botão do mês anterior
- Botão de seleção de mês
- Botão de seleção de ano
- Botão do próximo mês
- Data selecionada, Data atual, Primeira data focalizável (não desabilitada) na visualização de dias
Em um Angular Calendar que contém mais de uma data selecionada, apenas a primeira data será introduzida como uma parada de tabulação. Por exemplo, quando uma seleção múltipla Angular Calendar está habilitada e você selecionou as datas: 13/10/2020, 17/10/2020 e 21/10/2020, apenas 13/10/2020 estará acessível durante a navegação por tabulação; em um Angular Calendar Range Picker, apenas a primeira data do intervalo selecionado fará parte da sequência de tabulação da página.
Note
Mudança comportamental, a partir da v10.2.0- A navegação por tecla Tab na visualização de dias não está mais disponível. Para navegar entre as datas na visualização de data, você deve usar as teclas de seta.
Quando o componente igxCalendar
estiver focado, use:
- Tecla PageUp para mover para o mês anterior,
- Tecla PageDown para mover para o próximo mês,
- Teclas Shift + PageUp para ir para o ano anterior,
- Teclas Shift + PageDown para avançar para o próximo ano,
- Tecla Home para focar o primeiro dia do mês atual ou o primeiro mês em exibição
- Tecla End para focar o último dia do mês atual ou o último mês em exibição
Quando os botões do mês prev
ou do next
mês (no subtítulo) estiverem em foco, use:
- Pressione a tecla Espaço ou Enter para rolar e visualizar o mês seguinte ou anterior.
Quando o botão months
(no subtítulo) estiver em destaque, use:
- Tecla de espaço ou Enter para abrir a visualização de meses.
Quando o botão year
(no subtítulo) estiver em foco, use:
- Tecla de espaço ou Enter para abrir a visualização de décadas.
Quando um day
dentro do mês atual é focado:
- Use as teclas de seta para navegar pelos dias. Nota: As datas desabilitadas serão puladas.
- O foco será mantido no mês atual que está na visualização, enquanto a navegação vai de / para o último dia / primeiro dia do mês.
- A navegação na base de dados seria contínua, o que significa que ela percorrerá todos os meses enquanto navega com as setas.
- Use a tecla Enter para selecionar o dia em foco no momento.
Quando um month
dentro da visualização de meses estiver em foco, use:
- Teclas de seta para navegar pelos meses.
- Tecla Home para focar o primeiro mês dentro da visualização de meses.
- Tecla End para focar o último mês dentro da visualização de meses.
- Pressione a tecla Enter para selecionar o mês em foco no momento e fechar a visualização.
Quando um year
dentro da visualização da década estiver focado, use:
- Teclas de seta para cima e seta para baixo para navegar pelos anos,
- Pressione a tecla Enter para selecionar o ano em foco no momento e fechar a visualização.
Note
Após a versão 8.2.0, a navegação pelo teclado não focará os dias fora do mês atual, mas mudará o mês em exibição.
Multi View Calendar
O calendário multivisualização suporta todos os três tipos de seleção. Use a entrada monthsViewNumber
para definir o número de meses exibidos, que serão mostrados horizontalmente em um contêiner flexível. Não há limite para o valor máximo definido. Ao usar um calendário multivisualização, você pode querer ocultar os dias que não pertencem ao mês atual. Você pode fazer isso com a propriedade hideOutsideDays
. A navegação pelo teclado move para os meses seguintes/anteriores quando eles estão em exibição.
Calendar Orientation
As configurações de orientação permitem que os usuários escolham como o cabeçalho e a visualização do calendário são exibidos.
Opções de orientação do cabeçalho:
Você pode alterar a orientação do cabeçalho para colocar o cabeçalho do calendário na horizontal (acima da visualização do calendário) ou na vertical (na lateral da visualização do calendário). Para fazer isso, use a propriedade [headerOrientation]
, definindo-a respectivamente como horizontal
ou vertical
Opções de orientação da visualização:
Você pode definir a orientação da visualização para colocar os meses no calendário horizontalmente (lado a lado) ou verticalmente (um acima do outro). Para fazer isso, use a propriedade [orientation]
, definindo-a respectivamente como horizontal
ou vertical
.
Note
Você precisa de pelo menos dois meses de calendário para ver a propriedade funcionando.
<igx-calendar [monthsViewNumber]="2" [headerOrientation]="headerOrientation" [orientation]="orientation"></igx-calendar>
const orientations = ["horizontal", "vertical"] as const;
type Orientation = (typeof orientations)[number];
export class CalendarSample9Component {
protected orientations = Array.from(orientations, (o) => o);
protected headerOrientation: Orientation = "horizontal";
protected orientation: Orientation = "horizontal";
protected setHeaderOrientation(orientation: Orientation) {
this.headerOrientation = orientation;
}
protected setOrientation(orientation: Orientation) {
this.orientation = orientation;
}
}
Estilização
Para começar a estilizar o calendário, precisamos importar o arquivo index
, onde todas as funções do tema e mixins de componentes estão localizados:
@use "igniteui-angular/theming" as *;
// IMPORTANT: Prior to Ignite UI for Angular version 13 use:
// @import '~igniteui-angular/lib/core/styles/themes/index';
Seguindo a abordagem mais simples, criamos um novo tema que estende o calendar-theme
e aceita alguns dos parâmetros do tema padrão.
$custom-calendar-theme: calendar-theme(
$header-background: #345779,
$content-background: #fdfdfd,
$header-foreground: #ffffff,
$date-current-foreground: #2dabe8,
$navigation-color: #2dabe8,
$date-selected-foreground: #fdfdfd,
$date-current-background: #fdfdfd,
$navigation-hover-color: #345779,
$ym-current-foreground: #2dabe8,
$ym-hover-foreground: #2dabe8,
$picker-foreground: #2dabe8,
$picker-hover-foreground: #345779,
);
O último passo é passar o tema do calendário personalizado:
@include css-vars($custom-calendar-theme);
API References
- Componente IgxCalendar
- Estilos de IgxCalendarComponent
- Tipo de intervalo de datas
- Descritor de intervalo de datas
Additional Resources
Nossa comunidade é ativa e sempre acolhedora para novas ideias.