diff --git a/ionic/components.ios.scss b/ionic/components.ios.scss index e81c871ad4..88c5aa8439 100644 --- a/ionic/components.ios.scss +++ b/ionic/components.ios.scss @@ -22,6 +22,7 @@ "components/radio/radio.ios", "components/searchbar/searchbar.ios", "components/segment/segment.ios", + "components/select/select.ios", "components/tabs/tabs.ios", "components/toggle/toggle.ios", "components/toolbar/toolbar.ios"; diff --git a/ionic/components.md.scss b/ionic/components.md.scss index 344d2ff803..2f89e1d34b 100644 --- a/ionic/components.md.scss +++ b/ionic/components.md.scss @@ -23,6 +23,7 @@ "components/tap-click/ripple", "components/searchbar/searchbar.md", "components/segment/segment.md", + "components/select/select.md", "components/tabs/tabs.md", "components/toggle/toggle.md", "components/toolbar/toolbar.md"; diff --git a/ionic/components.ts b/ionic/components.ts index 6771f3dca6..a46df5062f 100644 --- a/ionic/components.ts +++ b/ionic/components.ts @@ -24,6 +24,7 @@ export * from './components/nav/view-controller' export * from './components/nav/nav-push' export * from './components/nav/nav-router' export * from './components/navbar/navbar' +export * from './components/option/option' export * from './components/overlay/overlay' export * from './components/slides/slides' export * from './components/radio/radio' @@ -31,6 +32,7 @@ export * from './components/scroll/scroll' export * from './components/scroll/pull-to-refresh' export * from './components/searchbar/searchbar' export * from './components/segment/segment' +export * from './components/select/select' export * from './components/tabs/tabs' export * from './components/tabs/tab' export * from './components/tap-click/tap-click' diff --git a/ionic/components/alert/alert.ios.scss b/ionic/components/alert/alert.ios.scss index 1b93a8fe18..7d6cd57b7f 100644 --- a/ionic/components/alert/alert.ios.scss +++ b/ionic/components/alert/alert.ios.scss @@ -48,6 +48,10 @@ ion-alert { overflow: hidden; } + +// iOS Alert Header +// -------------------------------------------------- + .alert-head { padding: $alert-ios-head-padding; text-align: $alert-ios-head-text-align; @@ -64,66 +68,62 @@ ion-alert { color: $alert-ios-sub-title-text-color; } + +// iOS Alert Message +// -------------------------------------------------- + .alert-message, -.alert-inputs { +.alert-input-group { padding: $alert-ios-message-padding; + font-size: $alert-ios-message-font-size; color: $alert-ios-message-text-color; text-align: $alert-ios-message-text-align; - font-size: $alert-ios-message-font-size; } -.alert-input { - padding: $alert-ios-input-padding; - margin-top: $alert-ios-input-margin-top; - background-color: $alert-ios-input-background-color; +// iOS Alert Input +// -------------------------------------------------- + +.alert-input { + margin-top: $alert-ios-input-margin-top; + padding: $alert-ios-input-padding; border: $alert-ios-input-border; border-radius: $alert-ios-input-border-radius; + background-color: $alert-ios-input-background-color; -webkit-appearance: none; } -.alert-radio-group { + +// iOS Alert Radio/Checkbox Group +// -------------------------------------------------- + +.alert-radio-group, +.alert-checkbox-group { + max-height: 240px; border-top: 1px solid $alert-ios-button-border-color; - max-height: 200px; overflow: scroll; } -.alert-radio { +.alert-tappable { display: flex; min-height: $alert-ios-button-min-height; border-top: 1px solid $alert-ios-button-border-color; cursor: pointer; - &[aria-checked=true] { - color: $alert-ios-button-text-color; - - .alert-radio-icon:after { - position: absolute; - border-width: 2px; - border-style: solid; - border-color: $alert-ios-button-text-color; - top: 13px; - left: 7px; - width: 4px; - height: 10px; - border-left: none; - border-top: none; - content: ''; - transform: rotate(45deg); - } - } - &:first-child { border-top: 0; } - } + +// iOS Alert Radio +// -------------------------------------------------- + .alert-radio-label { flex: 1; order: 0; - text-align: auto; padding: 13px; + text-align: auto; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; @@ -135,6 +135,43 @@ ion-alert { min-width: 30px; } +.alert-radio[aria-checked=true] { + color: $alert-ios-button-text-color; + + .alert-radio-icon:after { + position: absolute; + border-width: 2px; + border-style: solid; + border-color: $alert-ios-button-text-color; + top: 13px; + left: 7px; + width: 4px; + height: 10px; + border-left: none; + border-top: none; + content: ''; + transform: rotate(45deg); + } +} + + +// iOS Alert Checkbox +// -------------------------------------------------- + +.alert-checkbox-label { + flex: 1; + order: 0; + padding: 13px; + text-align: auto; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + + +// iOS Alert Button +// -------------------------------------------------- + .alert-button { margin: 0; flex: 1; diff --git a/ionic/components/alert/alert.md.scss b/ionic/components/alert/alert.md.scss index 097ade1abe..4d3182e59a 100644 --- a/ionic/components/alert/alert.md.scss +++ b/ionic/components/alert/alert.md.scss @@ -38,6 +38,9 @@ $alert-md-buttons-justify-content: flex-end !default; box-shadow: $alert-md-box-shadow; } +// Material Design Alert Header +// -------------------------------------------------- + .alert-head { text-align: $alert-md-head-text-align; padding: $alert-md-head-padding; @@ -51,12 +54,20 @@ $alert-md-buttons-justify-content: flex-end !default; font-size: $alert-md-sub-title-font-size; } + +// Material Design Alert Message +// -------------------------------------------------- + .alert-message, -.alert-inputs { +.alert-input-group { padding: $alert-md-message-padding; color: $alert-md-message-text-color; } + +// Material Design Alert Input +// -------------------------------------------------- + .alert-input { border-bottom: 1px solid $alert-md-input-border-color; color: $alert-md-input-text-color; @@ -68,15 +79,20 @@ $alert-md-buttons-justify-content: flex-end !default; } } -.alert-radio-group { + +// Material Design Alert Radio/Checkbox Group +// -------------------------------------------------- + +.alert-radio-group, +.alert-checkbox-group { position: relative; border-top: 1px solid $alert-md-input-border-color; border-bottom: 1px solid $alert-md-input-border-color; - max-height: 200px; - overflow: scroll; + max-height: 240px; + overflow: auto; } -.alert-radio { +.alert-tappable { position: relative; overflow: hidden; display: flex; @@ -84,24 +100,15 @@ $alert-md-buttons-justify-content: flex-end !default; border-top: 1px solid $alert-md-input-border-color; cursor: pointer; - &[aria-checked=true] { - color: $alert-md-button-text-color; - - .alert-radio-icon { - border-color: $alert-md-button-text-color; - } - - .alert-radio-icon:after { - transform: scale3d(1, 1, 1); - } - } - &:first-child { border-top: 0; } - } + +// Material Design Alert Radio +// -------------------------------------------------- + .alert-radio-label { flex: 1; text-align: auto; @@ -138,7 +145,69 @@ $alert-md-buttons-justify-content: flex-end !default; } } -.alert-buttons { +.alert-radio[aria-checked=true] { + color: $alert-md-button-text-color; + + .alert-radio-icon { + border-color: $alert-md-button-text-color; + } + + .alert-radio-icon:after { + transform: scale3d(1, 1, 1); + } +} + + +// Material Design Alert Checkbox +// -------------------------------------------------- + +.alert-checkbox-label { + flex: 1; + text-align: auto; + padding: 13px 26px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.alert-checkbox-icon { + position: relative; + top: 13px; + left: 13px; + width: 16px; + height: 16px; + border-radius: 2px; + border-width: 2px; + border-style: solid; + border-color: darken($list-md-border-color, 40%); + background-color: transparent; +} + +.alert-checkbox[aria-checked=true] .alert-checkbox-icon { + background-color: $alert-md-button-text-color; + border-color: $alert-md-button-text-color; + + &:after { + position: absolute; + border-width: 2px; + border-style: solid; + border-color: $alert-md-background-color; + top: 0; + left: 3px; + width: 4px; + height: 8px; + border-left: none; + border-top: none; + content: ''; + transform: rotate(45deg); + } +} + + +// Material Design Alert Button +// -------------------------------------------------- + +.alert-button-group { padding: $alert-md-buttons-padding; justify-content: $alert-md-buttons-justify-content; } diff --git a/ionic/components/alert/alert.scss b/ionic/components/alert/alert.scss index f10f0c5056..c1c179b956 100644 --- a/ionic/components/alert/alert.scss +++ b/ionic/components/alert/alert.scss @@ -66,7 +66,7 @@ ion-alert { padding: 10px 0; } -.alert-buttons { +.alert-button-group { display: flex; flex-direction: row; } diff --git a/ionic/components/alert/alert.ts b/ionic/components/alert/alert.ts index 67832532e8..f6f0c0ce95 100644 --- a/ionic/components/alert/alert.ts +++ b/ionic/components/alert/alert.ts @@ -171,6 +171,13 @@ export class Alert extends ViewController { this.data.buttons.push(button); } + /** + * @param {string} className CSS class name to add to the alert's outer wrapper + */ + setCssClass(className) { + this.data.cssClass = className; + } + /** * @param {Object} opts Alert options */ @@ -197,7 +204,7 @@ export class Alert extends ViewController { '' + + '' + + '' + '' + - '
' + + '
' + '' + @@ -224,7 +242,8 @@ export class Alert extends ViewController { host: { 'role': 'dialog', '[attr.aria-labelledby]': 'hdrId', - '[attr.aria-describedby]': 'descId' + '[attr.aria-describedby]': 'descId', + '[class]': 'cssClass' }, directives: [NgClass, NgSwitch, NgIf, NgFor] }) @@ -238,9 +257,7 @@ class AlertCmp { renderer: Renderer ) { this.d = params.data; - if (this.d.cssClass) { - renderer.setElementClass(_elementRef, this.d.cssClass, true); - } + this.cssClass = this.d.cssClass || ''; this.id = (++alertIds); this.descId = ''; @@ -280,13 +297,10 @@ class AlertCmp { input.checked = (checkedInput === input); }); this.activeId = checkedInput.id; + } - if (!this.d.buttons.length) { - // auto dismiss if no buttons - setTimeout(() => { - this.dismiss(); - }, this._config.get('pageTransitionDelay')); - } + cbClick(checkedInput) { + checkedInput.checked = !checkedInput.checked; } dismiss() { @@ -295,16 +309,23 @@ class AlertCmp { getValues() { if (this.inputType === 'radio') { - // this is a radio button alert - // return the one radio button value which is checked - let checkedInput = this.d.inputs.find(input => input.checked); + // this is an alert with radio buttons (single value select) + // return the one value which is checked, otherwise undefined + let checkedInput = this.d.inputs.find(i => i.checked); return checkedInput ? checkedInput.value : undefined; } - // return an object of all the values with the name as the key + if (this.inputType === 'checkbox') { + // this is an alert with checkboxes (multiple value select) + // return an array of all the checked values + return this.d.inputs.filter(i => i.checked).map(i => i.value); + } + + // this is an alert with text inputs + // return an object of all the values with the input name as the key let values = {}; - this.d.inputs.forEach(input => { - values[input.name] = input.value; + this.d.inputs.forEach(i => { + values[i.name] = i.value; }); return values; } diff --git a/ionic/components/alert/test/basic/index.ts b/ionic/components/alert/test/basic/index.ts index 7b8025caee..d1dc852685 100644 --- a/ionic/components/alert/test/basic/index.ts +++ b/ionic/components/alert/test/basic/index.ts @@ -18,7 +18,7 @@ class E2EPage { let alert = Alert.create({ title: 'Alert!', subTitle: 'Subtitle!!!', - buttons: ['Ok'] + buttons: ['OK'] }); this.nav.present(alert); diff --git a/ionic/components/checkbox/checkbox.md.scss b/ionic/components/checkbox/checkbox.md.scss index 1111ebad82..8394396f84 100644 --- a/ionic/components/checkbox/checkbox.md.scss +++ b/ionic/components/checkbox/checkbox.md.scss @@ -57,7 +57,7 @@ ion-checkbox { top: 0; left: 3px; width: 4px; - height: 9px; + height: 8px; border-left: none; border-top: none; content: ''; diff --git a/ionic/components/checkbox/checkbox.ts b/ionic/components/checkbox/checkbox.ts index 23edccb730..935d343ccf 100644 --- a/ionic/components/checkbox/checkbox.ts +++ b/ionic/components/checkbox/checkbox.ts @@ -1,7 +1,6 @@ import {Component, Directive, Optional, ElementRef, Input, Renderer, HostListener} from 'angular2/core'; import {NgControl} from 'angular2/common'; -import {Ion} from '../ion'; import {Form} from '../../util/form'; /** diff --git a/ionic/components/label/label.ts b/ionic/components/label/label.ts index 1e85845cf3..5ceaba3d38 100644 --- a/ionic/components/label/label.ts +++ b/ionic/components/label/label.ts @@ -38,15 +38,19 @@ export class Label { private _renderer: Renderer ) {} -/** - * @private - */ + /** + * @private + */ ngOnInit() { if (!this.id) { this.id = 'lbl-' + this._form.nextId(); } } + get text() { + return this._elementRef.nativeElement.textContent; + } + /** * @private */ diff --git a/ionic/components/option/option.ts b/ionic/components/option/option.ts new file mode 100644 index 0000000000..17318ce50a --- /dev/null +++ b/ionic/components/option/option.ts @@ -0,0 +1,27 @@ +import {Directive, ElementRef, Input} from 'angular2/core'; + +/** + * @name Option + */ +@Directive({ + selector: 'ion-option' +}) +export class Option { + constructor(private _elementRef: ElementRef) { + this._checked = false; + } + + @Input() value: string; + + get checked(): boolean { + return this._checked; + } + @Input() checked; + set checked(val:string) { + this._checked = (val === 'true' || val === true || val === ''); + } + + get text() { + return this._elementRef.nativeElement.textContent; + } +} diff --git a/ionic/components/select/select.ios.scss b/ionic/components/select/select.ios.scss new file mode 100644 index 0000000000..5949a0fa6c --- /dev/null +++ b/ionic/components/select/select.ios.scss @@ -0,0 +1,5 @@ +@import "../../globals.ios"; +@import "./select"; + +// iOS Select +// -------------------------------------------------- diff --git a/ionic/components/select/select.md.scss b/ionic/components/select/select.md.scss new file mode 100644 index 0000000000..4f7daf746d --- /dev/null +++ b/ionic/components/select/select.md.scss @@ -0,0 +1,5 @@ +@import "../../globals.md"; +@import "./select"; + +// Material Design Select +// -------------------------------------------------- diff --git a/ionic/components/select/select.scss b/ionic/components/select/select.scss new file mode 100644 index 0000000000..6a79b0a6fd --- /dev/null +++ b/ionic/components/select/select.scss @@ -0,0 +1,35 @@ +@import "../../globals.core"; + +// Select +// -------------------------------------------------- + +.select-icon { + position: relative; + min-width: 16px; +} + +.select-icon:after { + position: absolute; + top: 50%; + left: 50%; + margin-top: -3px; + width: 0; + height: 0; + border-top: 5px solid; + border-right: 5px solid transparent; + border-left: 5px solid transparent; + color: #999; + content: ""; + pointer-events: none; +} + +.select-text-value { + max-width: 120px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +ion-select ion-label { + margin: 0; +} diff --git a/ionic/components/select/select.ts b/ionic/components/select/select.ts new file mode 100644 index 0000000000..85ed182559 --- /dev/null +++ b/ionic/components/select/select.ts @@ -0,0 +1,249 @@ +import {Component, Directive, Optional, ElementRef, Input, Renderer, HostListener, ContentChild, ContentChildren} from 'angular2/core'; +import {NgControl} from 'angular2/common'; + +import {Alert} from '../alert/alert'; +import {Form} from '../../util/form'; +import {Label} from '../label/label'; +import {NavController} from '../nav/nav-controller'; +import {Option} from '../option/option'; +import {Form} from '../../util/form'; +import {merge} from '../../util/util'; + +/** + * @usage + * ```html + * + * Gender + * Female + * Male + * + * ``` + */ +@Component({ + selector: 'ion-select', + host: { + 'class': 'item', + 'tappable': '', + 'tabindex': 0, + '[attr.aria-disabled]': 'disabled' + }, + template: + '' + + '
' + + '' + + '' + + '' + + '
{{selectedText}}
' + + '
' + + '
' +}) +export class Select { + @Input() public value: string = ''; + @Input() public alertOptions: any = {}; + @Input() public checked: any = false; + @Input() disabled: boolean = false; + @Input() id: string = ''; + @Input() multiple: string = ''; + @ContentChild(Label) label: Label; + @ContentChildren(Option) options; + + constructor( + private _form: Form, + private _elementRef: ElementRef, + private _renderer: Renderer, + @Optional() private _navCtrl: NavController, + @Optional() ngControl: NgControl + ) { + _form.register(this); + this.selectedText = ''; + + if (ngControl) { + ngControl.valueAccessor = this; + } + + if (!_navCtrl) { + console.error('parent required for '); + } + } + + /** + * @private + */ + ngOnInit() { + if (!this.id) { + this.id = 'sel-' + this._form.nextId(); + this._renderer.setElementAttribute(this._elementRef, 'id', this.id); + } + + this.labelId = 'lbl-' + this.id; + this._renderer.setElementAttribute(this._elementRef, 'aria-labelledby', this.labelId); + } + + /** + * @private + */ + ngAfterContentInit() { + let selectedOption = this.options.toArray().find(o => o.checked); + if (selectedOption) { + this.value = selectedOption.value; + this.selectedText = selectedOption.text; + setTimeout(()=> { + this.onChange(this.value); + }); + } + } + + /** + * @private + */ + @HostListener('click') + _click() { + let cancelText = 'Cancel'; + let submitText = 'OK'; + + let isMulti = (this.multiple === true || this.multiple === 'true'); + + // the user may have assigned some options specifically for the alert + let alertOptions = merge({}, this.alertOptions); + + // user can provide buttons, but only two of them, and only as text + // index 0 becomes the cancel text, index 1 becomes the submit (ok) text + if (alertOptions.buttons && alertOptions.buttons.length === 2) { + cancelText = alertOptions.buttons[0]; + submitText = alertOptions.buttons[1]; + } + + // make sure their buttons array is removed from the options + // and we create a new array for the alert's two buttons + alertOptions.buttons = [cancelText]; + + // if the alertOptions didn't provide an title then use the label's text + if (!alertOptions.title) { + alertOptions.title = this.label.text; + } + + // user cannot provide inputs from alertOptions + // alert inputs must be created by ionic from ion-options + alertOptions.inputs = this.options.toArray().map(input => { + return { + type: (isMulti ? 'checkbox' : 'radio'), + label: input.text, + value: input.value, + checked: !!input.checked + } + }); + + // create the alert instance from our built up alertOptions + let alert = Alert.create(alertOptions); + + if (isMulti) { + // use checkboxes + alert.setCssClass('select-alert multiple-select-alert'); + + alert.addButton({ + text: submitText, + handler: selectedValues => { + // passed an array of all the values which were checked + this.value = selectedValues; + + // keep a list of all the selected texts + let selectedTexts = []; + + this.options.toArray().forEach(option => { + if (selectedValues.indexOf(option.value) > -1) { + // this option is one that was checked + option.checked = true; + selectedTexts.push(option.text); + + } else { + // this option was not checked + option.checked = false; + } + }); + + this.selectedText = selectedTexts.join(', '); + + this.onChange(selectedValues); + } + }); + + } else { + // use radio buttons + alert.setCssClass('select-alert single-select-alert'); + + alert.addButton({ + text: submitText, + handler: selectedValue => { + // passed the single value that was checked + // or undefined if nothing was checked + this.value = selectedValue; + + this.selectedText = ''; + this.options.toArray().forEach(option => { + if (option.value === selectedValue) { + // this option was the one that was checked + option.checked = true; + this.selectedText = option.text; + + } else { + // this option was not checked + option.checked = false; + } + }); + + this.onChange(selectedValue); + } + }); + } + + this._navCtrl.present(alert); + } + + /** + * @private + * Angular2 Forms API method called by the model (Control) on change to update + * the checked value. + * https://github.com/angular/angular/blob/master/modules/angular2/src/forms/directives/shared.ts#L34 + */ + writeValue(value) { + this.value = value; + } + + /** + * @private + */ + onChange(val) { + // TODO: figure the whys and the becauses + } + + /** + * @private + */ + onTouched(val) { + // TODO: figure the whys and the becauses + } + + /** + * @private + * Angular2 Forms API method called by the view (NgControl) to register the + * onChange event handler that updates the model (Control). + * https://github.com/angular/angular/blob/master/modules/angular2/src/forms/directives/shared.ts#L27 + * @param {Function} fn the onChange event handler. + */ + registerOnChange(fn) { this.onChange = fn; } + + /** + * @private + * Angular2 Forms API method called by the the view (NgControl) to register + * the onTouched event handler that marks model (Control) as touched. + * @param {Function} fn onTouched event handler. + */ + registerOnTouched(fn) { this.onTouched = fn; } + + /** + * @private + */ + ngOnDestroy() { + this._form.deregister(this); + } +} diff --git a/ionic/components/select/test/multiple-value/e2e.ts b/ionic/components/select/test/multiple-value/e2e.ts new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/ionic/components/select/test/multiple-value/e2e.ts @@ -0,0 +1 @@ + diff --git a/ionic/components/select/test/multiple-value/index.ts b/ionic/components/select/test/multiple-value/index.ts new file mode 100644 index 0000000000..8431db8c60 --- /dev/null +++ b/ionic/components/select/test/multiple-value/index.ts @@ -0,0 +1,17 @@ +import {App, Page} from 'ionic/ionic'; + + +@Page({ + templateUrl: 'main.html' +}) +class E2EPage {} + + +@App({ + template: '' +}) +class E2EApp { + constructor() { + this.root = E2EPage; + } +} diff --git a/ionic/components/select/test/multiple-value/main.html b/ionic/components/select/test/multiple-value/main.html new file mode 100644 index 0000000000..39cf8179a0 --- /dev/null +++ b/ionic/components/select/test/multiple-value/main.html @@ -0,0 +1,34 @@ +Select Item: Multiple Value + + + + + Topings + Bacon + Black Olives + Extra Cheese + Green Peppers + Mushrooms + Onions + Pepperoni + Pineapple + Sausage + Spinach + + + + Car Options + Backup Camera + Headted Seats + Keyless Entry + Navigation + Parking Assist + Sun Roof + + + + + diff --git a/ionic/components/select/test/single-value/e2e.ts b/ionic/components/select/test/single-value/e2e.ts new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/ionic/components/select/test/single-value/e2e.ts @@ -0,0 +1 @@ + diff --git a/ionic/components/select/test/single-value/index.ts b/ionic/components/select/test/single-value/index.ts new file mode 100644 index 0000000000..8431db8c60 --- /dev/null +++ b/ionic/components/select/test/single-value/index.ts @@ -0,0 +1,17 @@ +import {App, Page} from 'ionic/ionic'; + + +@Page({ + templateUrl: 'main.html' +}) +class E2EPage {} + + +@App({ + template: '' +}) +class E2EApp { + constructor() { + this.root = E2EPage; + } +} diff --git a/ionic/components/select/test/single-value/main.html b/ionic/components/select/test/single-value/main.html new file mode 100644 index 0000000000..afbfcb06f3 --- /dev/null +++ b/ionic/components/select/test/single-value/main.html @@ -0,0 +1,52 @@ +Select Item: Single Value + + + + + Gender + Female + Male + + + + Gaming + NES + Nintendo64 + PlayStation + Sega Genesis + Sega Saturn + SNES + + + + Operating System + DOS + Linux + Mac OS 7 + Mac OS 8 + Windows 3.1 + Windows 95 + Windows 98 + + + + Music + Alice in Chains + Green Day + Hole + Korn + Nirvana + Pearl Jam + Smashing Pumpkins + Soundgarden + Stone Temple Pilots + + + + + diff --git a/ionic/config/directives.ts b/ionic/config/directives.ts index 8badc85f2a..ceade4996d 100644 --- a/ionic/config/directives.ts +++ b/ionic/config/directives.ts @@ -20,6 +20,8 @@ import {ItemSliding} from '../components/item/item-sliding'; import {Toolbar, ToolbarTitle, ToolbarItem} from '../components/toolbar/toolbar'; import {Icon} from '../components/icon/icon'; import {Checkbox} from '../components/checkbox/checkbox'; +import {Select} from '../components/select/select'; +import {Option} from '../components/option/option'; import {Toggle} from '../components/toggle/toggle'; import {TextInput} from '../components/text-input/text-input'; import {Label} from '../components/label/label'; @@ -85,6 +87,8 @@ import {ShowWhen, HideWhen} from '../components/show-hide-when/show-hide-when'; * - Checkbox * - RadioGroup * - RadioButton + * - Select + * - Option * - Toggle * - ItemInput * - TextInput @@ -150,6 +154,8 @@ export const IONIC_DIRECTIVES = [ Checkbox, RadioGroup, RadioButton, + Select, + Option, Toggle, ItemInput, TextInput,