Visão geral do componente Angular Date Range Picker

    Angular Date Range Picker é um componente leve que inclui entrada de texto e um pop-up de calendário para permitir que os usuários selecionem facilmente os valores de data de início e término. Ele pode ser personalizado para corresponder aos requisitos do aplicativo com recursos como restrições de intervalo, formatos, seleção de intervalo de dados, agrupamento dos valores de início e término e muito mais. O Date Range Picker no Angular também permite que os desenvolvedores alterem a propriedade de exibição padrão e a definam como mês, ano ou multianual.

    Angular Date Range Picker Example

    Criamos este exemplo básico Angular Date Range Picker para mostrar o componente em ação. Neste caso, você vê um pop-up de calendário, permitindo que os usuários selecionem valores de data inicial e final.

    Getting Started with Ignite UI for Angular Date Range Picker

    Para começar a usar o componente Ignite UI for Angular Datepicker, 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 IgxDateRangePickerModule no seu arquivo app.module.ts.

    Como IgxDateRangePicker usa o IgxCalendarComponent, ele também tem uma dependência do BrowserAnimationsModule e, opcionalmente, do HammerModule para interações de toque, então eles precisam ser adicionados ao AppModule também:

    // app.module.ts
    
    import { IgxDateRangePickerModule } from 'igniteui-angular';
    // import { IgxDateRangePickerModule } from '@infragistics/igniteui-angular'; for licensed package
    
    import { HammerModule } from '@angular/platform-browser';
    import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
    
    @NgModule({
        ...
        imports: [..., IgxDateRangePickerModule, BrowserAnimationsModule, HammerModule],
        ...
    })
    export class AppModule {}
    

    Como alternativa, a partir da 16.0.0 você pode importar o IgxDateRangePickerComponent como uma dependência autônoma ou usar o token IGX_DATE_RANGE_PICKER_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_DATE_RANGE_PICKER_DIRECTIVES } from 'igniteui-angular';
    // import { IGX_DATE_RANGE_PICKER_DIRECTIVES } from '@infragistics/igniteui-angular'; for licensed package
    
    @Component({
        selector: 'app-home',
        template: '<igx-date-range-picker [value]="range"></igx-date-range-picker>',
        styleUrls: ['home.component.scss'],
        standalone: true,
        imports: [BrowserAnimationsModule, HammerModule, IGX_DATE_RANGE_PICKER_DIRECTIVES]
        /* or imports: [BrowserAnimationsModule, HammerModule, IgxDateRangePickerComponent] */
    })
    export class HomeComponent {}
    

    Agora que você importou o módulo Ignite UI for Angular Date Range Picker ou as diretivas, você pode começar a usar o componente igx-date-range-picker.

    Using the Angular Date Range Picker Component

    Display Date Range Picker

    Para instanciar um seletor de intervalo de datas em seu modo padrão, use o seguinte código:

    <igx-date-range-picker [value]="range"></igx-date-range-picker>
    
    public range: DateRange = { start: new Date(2020, 4, 20), end: new Date(2020, 4, 25) };
    
    Note

    O valor do Seletor de Intervalo de Datas é do tipo DateRange, que contém uma data de início e uma data de término.

    Para criar uma ligação de dados bidirecional, use ngModel:

    <igx-date-range-picker [(ngModel)]="range"></igx-date-range-picker>
    

    Projecting components

    Para enriquecer o UX do Date Range Picker padrão, o componente permite projetar componentes filhos - o mesmo que no IgxInputGroupComponent: igxLabel, igx-hint / igxHint, igx-prefix / igxPrefix, igx-suffix / igxSuffix, excluindo IgxInput. Informações mais detalhadas sobre isso podem ser encontradas no tópico Label & Input.

    Além disso, a Ignite UI for Angular Date Range Picker pode ser configurada para projetar IgxPickerToggleComponent- um componente que controla a alternância do calendário e pode ser modificado conforme mostrado na seção Alternar calendário.

    <igx-date-range-picker #dateRangePicker [(ngModel)]="range">
        <label igxLabel>Flight dates</label>
        <igx-hint *ngIf="dateRangePicker.invalid">
            Please choose start and end date!
        </igx-hint>
    </igx-date-range-picker>
    

    Display Separate Editable Inputs

    O componente Angular Date Range Picker também permite configurar duas entradas separadas para data de início e término. Isso pode ser obtido usando IgxDateRangeStartComponent e IgxDateRangeEndComponent como filhos do seletor de intervalo de datas, conforme mostrado na demonstração abaixo:

    <igx-date-range-picker [(ngModel)]="range">
        <igx-date-range-start>
            <input igxInput igxDateTimeEditor type="text">
        </igx-date-range-start>
        <igx-date-range-end>
            <input igxInput igxDateTimeEditor type="text">
        </igx-date-range-end>
    </igx-date-range-picker>
    

    User Experience

    Em uma configuração padrão, com uma única entrada somente leitura, o calendário pode ser aberto clicando em qualquer lugar na entrada, incluindo o ícone do calendário. Quando há duas entradas separadas para data de início e término, o calendário só pode ser aberto a partir do ícone do calendário, já que ambas as entradas são editáveis por padrão.

    Quando o calendário estiver visível, um intervalo pode ser selecionado escolhendo as datas de início e término. Selecionar uma data definirá a data de início e término, até que uma segunda data seja escolhida. Se houver um intervalo selecionado, clicar em qualquer outra data do calendário iniciará uma nova seleção de intervalo.

    As datas de início e término são separadas por um hífen quando mostradas na entrada somente leitura do componente. Ao definir entradas diferentes para início e fim, elas são separadas pela preposição to. Esta última pode ser localizada ou substituída por meio de um modelo. Veja o exemplo de modelo abaixo para mais detalhes.

    Examples

    Label

    Para definir o rótulo do seletor de intervalo de datas, a diretiva igxLabel deve ser usada conforme mostrado no snippet abaixo:

    <igx-date-range-picker [(ngModel)]="range">
        <label igxLabel>Flight dates</label>
    </igx-date-range-picker>
    

    Calendar toggle

    Na configuração padrão, com uma única entrada somente leitura, um ícone de calendário padrão é mostrado como um prefixo. O ícone de calendário pode ser alterado ou redefinido usando o componente IgxPickerToggleComponent. Ele pode ser decorado com igxPrefix ou igxSuffix, que definirão sua posição - no início da entrada ou no final, respectivamente. Para alterar a posição padrão e mostrar o ícone como um sufixo, você precisa fazer o seguinte:

    <igx-date-range-picker>
        <igx-picker-toggle igxSuffix>
            <igx-icon>calendar_view_day</igx-icon>
        </igx-picker-toggle>
    </igx-date-range-picker>
    

    Quando um Date Range Picker tem duas entradas separadas, para datas de início e término, ele não expõe um ícone de calendário por padrão. O IgxPickerToggleComponent deve ser adicionado manualmente como um filho do IgxDateRangeStartComponent ou IgxDateRangeEndComponent assim:

    <igx-date-range-picker>
        <igx-date-range-start>
            ...
            <igx-picker-toggle igxPrefix>
                <igx-icon>calendar_view_day</igx-icon>
            </igx-picker-toggle>
            ...
        </igx-date-range-start>
        <igx-date-range-end>
            ...
        </igx-date-range-end>
    </igx-date-range-picker>
    

    Dialog mode

    O componente IgxDateRangePickerComponent tem dois modos - dropdown (padrão) e dialog. Para alternar para o modo dialog, faça o seguinte:

    <igx-date-range-picker [mode]="'dialog'"></igx-date-range-picker>
    

    O valor do intervalo é definido quando as datas são selecionadas do calendário. Você notará que no modo suspenso, o botão Done não está disponível.

    Custom Action Buttons

    Os botões de ação do Date Range Picker podem ser modelados usando a diretiva igxPickerActions. Um cenário comum é permitir que o usuário selecione entre intervalos predefinidos, como na demonstração a seguir:

    Keyboard Navigation

    Note

    Use as demonstrações do modo de diálogo e Exibir entradas editáveis separadas para testar as combinações de teclado definidas abaixo.

    Abrir e fechar a interface do usuário do calendário IgxDateRangePickerComponent com o teclado está disponível apenas no modo dropdown e pode ser acionado por meio das combinações de teclas abaixo:

    • Alt + Seta para baixo- Abre o menu suspenso que contém a IU do calendário e o focaliza
    • Alt + Seta para cima- Fecha o menu suspenso e focaliza o campo de entrada (campo de entrada de início de intervalo quando duas entradas separadas são usadas)
    • Esc- Fecha o menu suspenso e focaliza o campo de entrada (campo de entrada de início de intervalo quando duas entradas separadas são usadas)

    A navegação pelo teclado dentro da UI do calendário do Date Range Picker está disponível em todos os modos e configurações. Quando o calendário é aberto, ele assume o foco e as seguintes combinações de teclado podem ser usadas:

    • Insira as datas de início e término selecionadas
    • PageUp, PageDown, Shift + PageUp, Shift + PageDown, Home, End, Tab- navegue pelo calendário

    A seção de navegação do teclado do calendário contém todas as combinações de teclado que podem ser usadas no calendário.

    Quando duas entradas separadas são usadas, a navegação pelo teclado para a diretiva igxDateTimeEditor também é aplicável ao componente Date Range Picker:

    • Ctrl / Cmd + Seta para a esquerda / direita- navega entre as seções de data. Em Ctrl / Cmd + Direita, ele vai para o fim da seção. Se já estiver lá, ele vai para o fim da próxima seção. Funciona da mesma forma na direção oposta.
    • Seta para cima / baixo- incrementa/diminui partes da data.
    • Ctrl / Cmd +;- define o dia e a hora atuais no editor.

    Formatting

    O componente Seletor de intervalo de datas oferece suporte a diferentes formatos de exibição e entrada.

    O formato de exibição do valor pode ser um dos formatos Angular DatePipe listados. Isso permite que ele suporte opções de formato predefinidas, como shortDate e longDate.

    A propriedade inputFormat aceita uma string de formato construída usando caracteres suportados pelo DatePipe, por exemplo, MM/dd/yyyy, mas não suporta opções de formato predefinidas, como shortDate e longDate. Se a propriedade inputFormat não for definida, o token de ID de localidade Angular será usado ao criá-la.

    <igx-date-range-picker [(ngModel)]="range" required
        inputFormat="dd/MM/yyyy" displayFormat="shortDate">
    </igx-date-range-picker>
    

    Se a propriedade inputFormat não estiver definida, o formato de entrada será inferido do displayFormat, caso possa ser analisado como contendo apenas partes numéricas de data e hora.

    Note

    O IgxDateRangePicker agora suporta entrada IME. Quando a composição termina, o controle converte os números de caracteres largos em caracteres ASCII.

    Forms and Validation

    O componente Date Range Picker suporta todas as diretivas do núcleo FormsModule, NgModel e ReactiveFormsModule (FormControl, FormGroup, etc.). Isso também inclui as funções Forms Validators. Além disso, os valores min e max do componente também atuam como validadores de formulário.

    O NgModel e os validadores podem ser definidos no IgxDateRangePickerComponent ou nas entradas individuais de data de início e término.

    Os seguintes trechos e exemplos ilustram o uso do validador required em um formulário orientado a modelo.

    Primeiro, precisamos configurar o modelo para um único componente de intervalo somente leitura, o que é feito no nível do componente:

    <igx-date-range-picker [(ngModel)]="range" required>
        <label igxLabel>Period</label>
    </igx-date-range-picker>
    

    A mesma configuração pode ser usada ao definir duas entradas separadas. Note que, neste caso, a validação também é aplicada a ambas as entradas.

    <igx-date-range-picker [(ngModel)]="range" required>
        <igx-date-range-start>
            <label igxLabel>Start Date</label>
            <input igxInput igxDateTimeEditor type="text">
            <igx-picker-toggle igxPrefix>
                <igx-icon>calendar_today</igx-icon>
            </igx-picker-toggle>
        </igx-date-range-start>
        <igx-date-range-end>
            <label igxLabel>End Date</label>
            <input igxInput igxDateTimeEditor type="text">
        </igx-date-range-end>
    </igx-date-range-picker>
    

    Ao usar duas entradas separadas, é possível definir o modelo e as propriedades necessárias em cada entrada. Observe que a validação é específica para cada entrada individual.

    <igx-date-range-picker>
        <igx-date-range-start>
            <input igxInput igxDateTimeEditor [(ngModel)]="range.start" type="text" required>
        </igx-date-range-start>
        <igx-date-range-end>
            <input igxInput igxDateTimeEditor [(ngModel)]="range.end" type="text" required>
        </igx-date-range-end>
    </igx-date-range-picker>
    

    Min and max values

    Você pode especificar as propriedades minValue e maxValue para restringir a entrada do usuário desabilitando datas do calendário que estejam fora do intervalo definido por esses valores.

    public minDate = new Date(2020, 1, 15);
    public maxDate = new Date(2020, 11, 1);
    
    <igx-date-range-picker [(ngModel)]="range" required
        [minValue]="minDate" [maxValue]="maxDate">
    </igx-date-range-picker>
    
    <igx-date-range-picker [minValue]="minDate" [maxValue]="maxDate">
        <igx-date-range-start>
            <input igxInput igxDateTimeEditor [(ngModel)]="range.start" type="text" required>
        </igx-date-range-start>
        <igx-date-range-end>
            <input igxInput igxDateTimeEditor [(ngModel)]="range.end" type="text" required>
        </igx-date-range-end>
    </igx-date-range-picker>
    

    O IgxDateRangePickerComponent também é um validador, o que significa que ele controla sua validade internamente usando minValue e maxValue. Você também pode acessar ambos por meio de ngModel:

    <igx-date-range-picker #dateRangePicker="ngModel" [(ngModel)]="range" required
        [minValue]="minDate" [maxValue]="maxDate">
        <igx-date-range-start>
            <input igxInput igxDateTimeEditor type="text">
        </igx-date-range-start>
        <igx-date-range-end>
            <input igxInput igxDateTimeEditor type="text">
        </igx-date-range-end>
    </igx-date-range-picker>
    
    <!-- minValue & maxValue will be true if the current range does not satisfy them -->
    <div *ngIf="dateRangePicker.minValue || dateRangePicker.maxValue">
        <p>Value not in range.</p>
    </div>
    

    Templating

    Quando dois editores são usados, o separador padrão pode ser substituído usando a diretiva igxDateRangeSeparator. Aqui está como alterar o separador de data para um hífen-:

    <igx-date-range-picker>
        <igx-date-range-start>
            <input igxInput igxDateTimeEditor [(ngModel)]="range.start" type="text" required>
        </igx-date-range-start>
        <ng-template igxDateRangeSeparator>-</ng-template>
        <igx-date-range-end>
            <input igxInput igxDateTimeEditor [(ngModel)]="range.end" type="text" required>
        </igx-date-range-end>
    </igx-date-range-picker>
    

    Estilização

    Para começar a estilizar o igxDateRangePicker, 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';
    

    O componente Date Range Picker expõe date-range-picker-theme e utiliza vários componentes e diretivas, incluindo igxInputGroupComponent, igxCalendar e igxOverlay. Qualquer estilo global para os componentes e diretivas mencionados acima afetará o igxDateRangeComponent. Como o componente Date Range Picker usa os temas input group e calendar , temos que criar novos temas que estendam calendar-theme e input-group-theme e usar alguns de seus parâmetros para estilizar o date range picker em conjunto com o date range picker theme. Usaremos uma única paleta de cores personalizada para definir as cores a serem usadas em todos os temas:

    // COMMON
    $purple: #9E379F;
    $blue: #61AEDB;
    $light-gray: #efefef;
    
    $custom-palette: palette(
      $primary: $blue, 
      $secondary: $purple, 
      $surface: $light-gray
    );
    
    $today-text: color($custom-palette, "primary", 500);
    $text-color: color($custom-palette, "secondary", 200);
    $color-focused: color($custom-palette, "secondary", 500);
    
    // DATE-RANGE
    $custom-date-range-theme: date-range-picker-theme(
      $label-color: $color-focused
    );
    
    // INPUT GROUP
    $custom-input-group-theme: input-group-theme(
      $filled-text-color: $text-color,
      $idle-text-color: $text-color,
      $focused-text-color: $color-focused,
      $idle-bottom-line-color: $purple,
      $hover-bottom-line-color: $color-focused,
      $interim-bottom-line-color: $color-focused
    );
    
    // CALENDAR
    $custom-calendar-theme: calendar-theme(
      $date-current-foreground: $today-text,
      $border-radius: 0.5,
      $date-border-radius: 0.5
    );
    

    O último passo é passar os temas personalizados:

    @include css-vars($custom-date-range-theme);
    @include css-vars($custom-input-group-theme);
    @include css-vars($custom-calendar-theme);
    
    Warning

    Se o componente estiver usando um Emulated ViewEncapsulation, é necessário penetrate neste encapsulamento usando::ng-deep

    :host {
      ::ng-deep {
        @include date-range-picker($custom-date-range-theme);
        @include input-group($custom-input-group-theme);
        @include calendar($custom-calendar-theme);
      }
    }
    

    Scoping Styles

    Em relação ao escopo de estilo, você deve consultar as seções de estilo [Estilos de componentes com escopo de sobreposição](overlay-styling.md#Estilos de sobreposição com escopo) e Estilos de escopo de grupo de entrada, pois elas fornecem mais informações.

    Application Demo

    A demonstração abaixo define um formulário para passagens aéreas que usa o IgxDateRangePickerComponent. Se nenhuma data for selecionada, um IgxHint é usado para exibir um erro de validação. A seleção das datas é restrita pelas propriedades minValue e maxValue do IgxDateRangePickerComponent

    API References

    Theming Dependencies

    Additional Resources

    Tópicos relacionados:

    Nossa comunidade é ativa e sempre acolhedora para novas ideias.