Select Component v1.0.1

provides select functionality for Angular applications.

Overview

Import

Import the select directive from the angular-awesome package:

// Import the select directive
import { WaSelectDirective } from 'angular-awesome/select';

Examples

Select Examples

Basic Usage

<wa-select-wrapper label="Choose an option">
  <wa-option value="option1">Option 1</wa-option>
  <wa-option value="option2">Option 2</wa-option>
  <wa-option value="option3">Option 3</wa-option>
</wa-select-wrapper>

Different Appearances

<!-- Outlined appearance (default) -->
<wa-select-wrapper label="Outlined Select" appearance="outlined">
  <wa-option value="option1">Option 1</wa-option>
  <wa-option value="option2">Option 2</wa-option>
  <wa-option value="option3">Option 3</wa-option>
</wa-select-wrapper>

<!-- Filled appearance -->
<wa-select-wrapper label="Filled Select" appearance="filled">
  <wa-option value="option1">Option 1</wa-option>
  <wa-option value="option2">Option 2</wa-option>
  <wa-option value="option3">Option 3</wa-option>
</wa-select-wrapper>

<!-- Pill appearance -->
<wa-select-wrapper label="Pill Select" [pill]="true">
  <wa-option value="option1">Option 1</wa-option>
  <wa-option value="option2">Option 2</wa-option>
  <wa-option value="option3">Option 3</wa-option>
</wa-select-wrapper>

Different Sizes

<wa-select-wrapper label="Small Select" size="small">
  <wa-option value="option1">Option 1</wa-option>
  <wa-option value="option2">Option 2</wa-option>
</wa-select-wrapper>

<wa-select-wrapper label="Medium Select" size="medium">
  <wa-option value="option1">Option 1</wa-option>
  <wa-option value="option2">Option 2</wa-option>
</wa-select-wrapper>

<wa-select-wrapper label="Large Select" size="large">
  <wa-option value="option1">Option 1</wa-option>
  <wa-option value="option2">Option 2</wa-option>
</wa-select-wrapper>

With Placeholder and Hint

<wa-select-wrapper 
  label="Choose an option" 
  placeholder="Select an option"
  hint="This is a helpful hint">
  <wa-option value="option1">Option 1</wa-option>
  <wa-option value="option2">Option 2</wa-option>
  <wa-option value="option3">Option 3</wa-option>
</wa-select-wrapper>

<!-- Using HTML in hint -->
<wa-select-wrapper label="Choose an option">
  <div slot="hint">
    Select an option from the <strong>dropdown</strong>
  </div>
  <wa-option value="option1">Option 1</wa-option>
  <wa-option value="option2">Option 2</wa-option>
  <wa-option value="option3">Option 3</wa-option>
</wa-select-wrapper>

Clearable Select

<wa-select-wrapper 
  label="Clearable Select" 
  [clearable]="true"
  placeholder="Select an option">
  <wa-option value="option1">Option 1</wa-option>
  <wa-option value="option2">Option 2</wa-option>
  <wa-option value="option3">Option 3</wa-option>
</wa-select-wrapper>

Multiple Selection

<wa-select-wrapper 
  label="Multiple Select" 
  [multiple]="true"
  placeholder="Select multiple options">
  <wa-option value="option1">Option 1</wa-option>
  <wa-option value="option2">Option 2</wa-option>
  <wa-option value="option3">Option 3</wa-option>
  <wa-option value="option4">Option 4</wa-option>
</wa-select-wrapper>

<!-- With max visible options -->
<wa-select-wrapper 
  label="Multiple Select with Max Visible" 
  [multiple]="true"
  [maxOptionsVisible]="2"
  placeholder="Select multiple options">
  <wa-option value="option1">Option 1</wa-option>
  <wa-option value="option2">Option 2</wa-option>
  <wa-option value="option3">Option 3</wa-option>
  <wa-option value="option4">Option 4</wa-option>
</wa-select-wrapper>

Dropdown Placement

<wa-select-wrapper 
  label="Dropdown on Top" 
  placement="top"
  placeholder="Select an option">
  <wa-option value="option1">Option 1</wa-option>
  <wa-option value="option2">Option 2</wa-option>
  <wa-option value="option3">Option 3</wa-option>
</wa-select-wrapper>

<wa-select-wrapper 
  label="Dropdown on Bottom" 
  placement="bottom"
  placeholder="Select an option">
  <wa-option value="option1">Option 1</wa-option>
  <wa-option value="option2">Option 2</wa-option>
  <wa-option value="option3">Option 3</wa-option>
</wa-select-wrapper>

Disabled States

<!-- Disabled select -->
<wa-select-wrapper 
  label="Disabled Select" 
  [disabled]="true" 
  value="option1">
  <wa-option value="option1">Option 1</wa-option>
  <wa-option value="option2">Option 2</wa-option>
  <wa-option value="option3">Option 3</wa-option>
</wa-select-wrapper>

<!-- Individual disabled options -->
<wa-select-wrapper label="Select with Disabled Options">
  <wa-option value="option1">Option 1</wa-option>
  <wa-option value="option2" [disabled]="true">Option 2 (Disabled)</wa-option>
  <wa-option value="option3">Option 3</wa-option>
</wa-select-wrapper>

Required Select

<wa-select-wrapper 
  label="Required Select" 
  [required]="true"
  placeholder="Select an option">
  <wa-option value="option1">Option 1</wa-option>
  <wa-option value="option2">Option 2</wa-option>
  <wa-option value="option3">Option 3</wa-option>
</wa-select-wrapper>

Custom Styling

<!-- Select styling -->
<wa-select-wrapper 
  label="Custom Styled Select" 
  [backgroundColor]="'#f8f9fa'"
  [borderColor]="'#6c757d'"
  [borderWidth]="'2px'"
  [boxShadow]="'0 2px 4px rgba(0,0,0,0.1)'">
  <wa-option value="option1">Option 1</wa-option>
  <wa-option value="option2">Option 2</wa-option>
  <wa-option value="option3">Option 3</wa-option>
</wa-select-wrapper>

<!-- Option styling -->
<wa-select-wrapper label="Custom Styled Options">
  <wa-option 
    value="option1" 
    [backgroundColorHover]="'#e9ecef'" 
    [textColorHover]="'#007bff'">
    Option with Custom Hover
  </wa-option>
  <wa-option 
    value="option2" 
    [backgroundColorCurrent]="'#cfe2ff'" 
    [textColorCurrent]="'#0d6efd'">
    Option with Custom Selection
  </wa-option>
  <wa-option value="option3">Regular Option</wa-option>
</wa-select-wrapper>

Event Handling

<wa-select-wrapper 
  label="Interactive Select" 
  (inputEvent)="onSelectInput($event)" 
  (changeEvent)="onSelectChange($event)" 
  (focusEvent)="onSelectFocus()" 
  (blurEvent)="onSelectBlur()"
  (clearEvent)="onSelectClear()"
  (showEvent)="onDropdownShow()"
  (afterShowEvent)="onAfterDropdownShow()"
  (hideEvent)="onDropdownHide()"
  (afterHideEvent)="onAfterDropdownHide()"
  (invalidEvent)="onSelectInvalid($event)">
  <wa-option value="option1">Option 1</wa-option>
  <wa-option value="option2">Option 2</wa-option>
  <wa-option value="option3">Option 3</wa-option>
</wa-select-wrapper>
// In your component
onSelectInput(event: Event): void {
  console.log('Select input:', (event.target as HTMLSelectElement).value);
}

onSelectChange(event: Event): void {
  console.log('Select change:', (event.target as HTMLSelectElement).value);
}

onSelectFocus(): void {
  console.log('Select focused');
}

onSelectBlur(): void {
  console.log('Select blurred');
}

onSelectClear(): void {
  console.log('Select cleared');
}

onDropdownShow(): void {
  console.log('Dropdown showing');
}

onAfterDropdownShow(): void {
  console.log('Dropdown shown');
}

onDropdownHide(): void {
  console.log('Dropdown hiding');
}

onAfterDropdownHide(): void {
  console.log('Dropdown hidden');
}

onSelectInvalid(event: CustomEvent): void {
  console.log('Select invalid:', event.detail);
}

Using with Angular Bindings

import { Component } from '@angular/core';

@Component({
  selector: 'app-select-demo',
  template: `
    <wa-select-wrapper 
      [label]="selectLabel" 
      [value]="selectedValue" 
      [placeholder]="selectPlaceholder" 
      [appearance]="selectAppearance" 
      [size]="selectSize" 
      [required]="isRequired" 
      [disabled]="isDisabled"
      [multiple]="isMultiple"
      [clearable]="isClearable"
      (changeEvent)="onSelectionChange($event)">
      <wa-option *ngFor="let option of options" [value]="option.value" [disabled]="option.disabled">
        {{ option.label }}
      </wa-option>
    </wa-select-wrapper>
    
    <div>Selected value: {{ selectedValue }}</div>
  `
})
export class SelectDemoComponent {
  selectLabel = 'Select an option';
  selectedValue = 'option1';
  selectPlaceholder = 'Choose an option';
  selectAppearance = 'outlined';
  selectSize = 'medium';
  isRequired = true;
  isDisabled = false;
  isMultiple = false;
  isClearable = true;
  
  options = [
    { value: 'option1', label: 'Option 1', disabled: false },
    { value: 'option2', label: 'Option 2', disabled: false },
    { value: 'option3', label: 'Option 3', disabled: true }
  ];
  
  onSelectionChange(event: Event): void {
    this.selectedValue = (event.target as HTMLSelectElement).value;
    console.log('Selection changed:', this.selectedValue);
  }
}

Using with ngModel

<form #selectForm="ngForm">
  <wa-select-wrapper 
    label="Select your favorite color" 
    name="favoriteColor" 
    [(ngModel)]="favoriteColor" 
    required>
    <wa-option value="red">Red</wa-option>
    <wa-option value="green">Green</wa-option>
    <wa-option value="blue">Blue</wa-option>
  </wa-select-wrapper>
  
  <div>Your favorite color is: {{ favoriteColor }}</div>
  
  <button type="submit" [disabled]="selectForm.invalid">Submit</button>
</form>

Real-World Example: Country Selector

import { Component, OnInit } from '@angular/core';

interface Country {
  code: string;
  name: string;
  continent: string;
}

@Component({
  selector: 'app-country-selector',
  template: `
    <div class="country-form">
      <h2>Select Your Country</h2>
      
      <wa-select-wrapper 
        label="Country" 
        [clearable]="true"
        placeholder="Select your country"
        [(ngModel)]="selectedCountry"
        (changeEvent)="onCountryChange($event)"
        [required]="true">
        
        <wa-option *ngFor="let country of countries" [value]="country.code">
          {{ country.name }} ({{ country.code }})
        </wa-option>
      </wa-select-wrapper>
      
      <div *ngIf="selectedCountry" class="selected-country">
        <h3>Selected Country</h3>
        <p>Code: {{ getCountryByCode(selectedCountry)?.code }}</p>
        <p>Name: {{ getCountryByCode(selectedCountry)?.name }}</p>
        <p>Continent: {{ getCountryByCode(selectedCountry)?.continent }}</p>
      </div>
    </div>
  `,
  styles: [`
    .country-form {
      max-width: 500px;
      margin: 0 auto;
    }
    
    .selected-country {
      margin-top: 20px;
      padding: 15px;
      border: 1px solid #e0e0e0;
      border-radius: 4px;
      background-color: #f9f9f9;
    }
  `]
})
export class CountrySelectorComponent implements OnInit {
  countries: Country[] = [];
  selectedCountry: string = '';
  
  ngOnInit(): void {
    // In a real app, this would come from an API
    this.countries = [
      { code: 'US', name: 'United States', continent: 'North America' },
      { code: 'CA', name: 'Canada', continent: 'North America' },
      { code: 'MX', name: 'Mexico', continent: 'North America' },
      { code: 'BR', name: 'Brazil', continent: 'South America' },
      { code: 'AR', name: 'Argentina', continent: 'South America' },
      { code: 'GB', name: 'United Kingdom', continent: 'Europe' },
      { code: 'DE', name: 'Germany', continent: 'Europe' },
      { code: 'FR', name: 'France', continent: 'Europe' },
      { code: 'CN', name: 'China', continent: 'Asia' },
      { code: 'JP', name: 'Japan', continent: 'Asia' },
      { code: 'IN', name: 'India', continent: 'Asia' },
      { code: 'AU', name: 'Australia', continent: 'Oceania' },
      { code: 'NZ', name: 'New Zealand', continent: 'Oceania' },
      { code: 'ZA', name: 'South Africa', continent: 'Africa' },
      { code: 'EG', name: 'Egypt', continent: 'Africa' }
    ];
  }
  
  onCountryChange(event: Event): void {
    console.log('Country changed:', this.selectedCountry);
  }
  
  getCountryByCode(code: string): Country | undefined {
    return this.countries.find(country => country.code === code);
  }
}

Grouped Options with Custom Styling

<wa-select-wrapper 
  label="Select a Destination" 
  [clearable]="true"
  placeholder="Choose a destination"
  [backgroundColor]="'#f8f9fa'"
  [borderColor]="'#007bff'"
  [boxShadow]="'0 0 0 0.2rem rgba(0,123,255,.25)'">
  
  <!-- Europe -->
  <div style="padding: 8px 12px; font-weight: bold; color: #6c757d; background-color: #e9ecef;">Europe</div>
  <wa-option value="paris">Paris, France</wa-option>
  <wa-option value="rome">Rome, Italy</wa-option>
  <wa-option value="barcelona">Barcelona, Spain</wa-option>
  
  <!-- Asia -->
  <div style="padding: 8px 12px; font-weight: bold; color: #6c757d; background-color: #e9ecef;">Asia</div>
  <wa-option value="tokyo">Tokyo, Japan</wa-option>
  <wa-option value="bangkok">Bangkok, Thailand</wa-option>
  <wa-option value="singapore">Singapore</wa-option>
  
  <!-- Americas -->
  <div style="padding: 8px 12px; font-weight: bold; color: #6c757d; background-color: #e9ecef;">Americas</div>
  <wa-option value="newyork">New York, USA</wa-option>
  <wa-option value="rio">Rio de Janeiro, Brazil</wa-option>
  <wa-option value="cancun">Cancun, Mexico</wa-option>
</wa-select-wrapper>

API Reference

Styling