diff --git a/packages/core/demos/vanilla/index.html b/packages/core/demos/vanilla/index.html index 07dc8993bf..d3e7c29f2c 100644 --- a/packages/core/demos/vanilla/index.html +++ b/packages/core/demos/vanilla/index.html @@ -120,8 +120,8 @@ Gender - Female - Male + Female + Male diff --git a/packages/core/src/components/item/item.tsx b/packages/core/src/components/item/item.tsx index cba0da386e..6cc1b5f9bd 100644 --- a/packages/core/src/components/item/item.tsx +++ b/packages/core/src/components/item/item.tsx @@ -1,4 +1,4 @@ -import { Component, Element, Prop, Listen } from '@stencil/core'; +import { Component, Element, HostElement, Method, Prop, Listen } from '@stencil/core'; import { CssClassMap } from '../../index'; import { createThemedClasses } from '../../utils/theme'; @@ -13,6 +13,7 @@ import { createThemedClasses } from '../../utils/theme'; }) export class Item { private childStyles: CssClassMap = Object.create(null); + private label: any; @Element() private el: HTMLElement; @@ -38,12 +39,28 @@ export class Item { return hasChildStyleChange; } + @Method() + getLabelText(): string { + return this.label ? this.label.getText() : ''; + } + ionViewDidLoad() { // Add item-button classes to each ion-button in the item const buttons = this.el.querySelectorAll('ion-button') as any; for (var i = 0; i < buttons.length; i++) { buttons[i].itemButton = true; } + + this.label = this.el.querySelector('ion-label') as HostElement; + + // if (label) { + // this.label = label; + // this.labelId = label.id = ('lbl-' + this.id); + // if (label.type) { + // this.setElementClass('item-label-' + label.type, true); + // } + // this.viewLabel = false; + // } } render() { @@ -168,12 +185,6 @@ export class Item { // } // } - // /** - // * @hidden - // */ - // getLabelText(): string { - // return this._label ? this._label.text : ''; - // } // /** // * @hidden diff --git a/packages/core/src/components/label/label.tsx b/packages/core/src/components/label/label.tsx index 78d118e3ab..de2d30098c 100644 --- a/packages/core/src/components/label/label.tsx +++ b/packages/core/src/components/label/label.tsx @@ -1,4 +1,4 @@ -import { Component, Event, EventEmitter, Prop } from '@stencil/core'; +import { Component, Element, Event, EventEmitter, Method, Prop } from '@stencil/core'; @Component({ @@ -15,6 +15,8 @@ import { Component, Event, EventEmitter, Prop } from '@stencil/core'; export class Label { styleTmr: any; + @Element() el: HTMLElement; + /** * @output {event} Emitted when the styles change. */ @@ -35,6 +37,14 @@ export class Label { */ @Prop() stacked: boolean = false; + /** + * @hidden + */ + @Method() + getText(): string { + return this.el.textContent || ''; + } + ionViewDidLoad() { this.emitStyle(); } diff --git a/packages/core/src/components/select-option/select-option.tsx b/packages/core/src/components/select-option/select-option.tsx new file mode 100644 index 0000000000..cf153dc753 --- /dev/null +++ b/packages/core/src/components/select-option/select-option.tsx @@ -0,0 +1,39 @@ +import { Component, Element, Event, EventEmitter, Method, Prop } from '@stencil/core'; + + +@Component({ + tag: 'ion-select-option', + host: { + theme: 'select-option' + } +}) +export class SelectOption { + @Element() el: HTMLElement; + + @Event() ionSelect: EventEmitter; + + /** + * @input {boolean} If true, the user cannot interact with this element. + */ + @Prop() disabled: boolean = false; + + /** + * @input {boolean} If true, the element is selected. + */ + @Prop() selected: boolean = false; + + /** + * @input {string} The text value of the option. + */ + @Prop() value: string; + + @Method() + getText(): string { + return this.el.textContent || ''; + } + + render() { + return ; + } + +} \ No newline at end of file diff --git a/packages/core/src/components/select/option.tsx b/packages/core/src/components/select/option.tsx deleted file mode 100644 index 19e2e544fc..0000000000 --- a/packages/core/src/components/select/option.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { Component } from '@stencil/core'; - - -@Component({ - tag: 'ion-option', - host: { - theme: 'option' - } -}) -export class option { - - render() { - return
; - } - -} \ No newline at end of file diff --git a/packages/core/src/components/select/select-popover.tsx b/packages/core/src/components/select/select-popover.tsx new file mode 100644 index 0000000000..111abc5778 --- /dev/null +++ b/packages/core/src/components/select/select-popover.tsx @@ -0,0 +1,55 @@ + +import { Component, Prop, PropDidChange } from '@stencil/core'; + +export interface SelectPopoverOption { + text: string; + value: string; + disabled: boolean; + checked: boolean; + handler?: Function; +} + +@Component({ + tag: 'ion-select-popover' +}) +export class SelectPopover { + @Prop() options: SelectPopoverOption[]; + + @Prop({ state: true }) value: string; + + @PropDidChange('value') + valueChanged(val: string) { + console.log('Select popover value', val); + } + + // public get value() { + // let checkedOption = this.options.find(option => option.checked); + + // return checkedOption ? checkedOption.value : undefined; + // } + + // public set value(value: any) { + // let checkedOption = this.options.find(option => option.value === value); + // if (checkedOption && checkedOption.handler) { + // checkedOption.handler(); + // } + // this.viewController.dismiss(value); + // } + + render() { + console.log(this.options); + + return ( + + {this.options.map(option => + + {option.text} + + + )} + + ); + } +} + + diff --git a/packages/core/src/components/select/select.scss b/packages/core/src/components/select/select.scss index dcd429f952..c85951c86b 100644 --- a/packages/core/src/components/select/select.scss +++ b/packages/core/src/components/select/select.scss @@ -17,6 +17,8 @@ $select-popover-list-margin-start: 0 !default; ion-select { + position: relative; + display: flex; overflow: hidden; @@ -51,6 +53,6 @@ ion-select { } // TODO remove -.select .option { +.select-option { display: none; } \ No newline at end of file diff --git a/packages/core/src/components/select/select.tsx b/packages/core/src/components/select/select.tsx index ab4760bd46..d8e320d8f2 100644 --- a/packages/core/src/components/select/select.tsx +++ b/packages/core/src/components/select/select.tsx @@ -1,4 +1,14 @@ -import { Component, CssClassMap, Event, EventEmitter, Prop } from '@stencil/core'; +import { Component, CssClassMap, Element, Event, EventEmitter, HostElement, Prop } from '@stencil/core'; + +import { deepCopy } from '../../utils/helpers'; + +import { ActionSheet } from '../action-sheet/action-sheet'; +import { Alert } from '../alert/alert'; +import { Popover } from '../popover/popover'; + +import { ActionSheetController } from '../action-sheet-controller/action-sheet-controller'; +// import { AlertController } from '../alert-controller/alert-controller'; +import { PopoverController } from '../popover-controller/popover-controller'; @Component({ @@ -14,8 +24,18 @@ import { Component, CssClassMap, Event, EventEmitter, Prop } from '@stencil/core }) export class Select { text: any; - id: any; - labelId: any; + texts: any; + id: string; + labelId: string; + item: any; + options: any; + overlay: ActionSheet | Alert | Popover; + + @Prop({ connect: 'ion-action-sheet-controller' }) actionSheetCtrl: ActionSheetController; + // @Prop({ connect: 'ion-alert-controller' }) alertCtrl: AlertController; + @Prop({ connect: 'ion-popover-controller' }) popoverCtrl: PopoverController; + + @Element() el: HTMLElement; /** * @input {boolean} If true, the user cannot interact with this element. Defaults to `false`. @@ -48,7 +68,7 @@ export class Select { /** * @input {string} The interface the select should use: `action-sheet`, `popover` or `alert`. Default: `alert`. */ - @Prop() interface: string = ''; + @Prop() interface: string = 'alert'; /** * @input {string} The text to display instead of the selected option's value. @@ -61,284 +81,9 @@ export class Select { @Prop() multiple: boolean; /** - * @output {EventEmitter} Emitted when the selection is cancelled. + * @input {string} the value of the select. */ - @Event() ionCancel: EventEmitter; - - - hostData() { - return { - class: { - 'select-disabled': this.disabled - } - }; - } - - render() { - let addPlaceholderClass = false - - let selectText = this.selectedText || this.text; - if (!selectText && this.placeholder) { - selectText = this.placeholder; - addPlaceholderClass = true; - } - - const selectTextClasses: CssClassMap = { - 'select-text': true, - 'select-placeholder': addPlaceholderClass - }; - - return [ - // add placeholder class -
{ selectText }
, -
-
-
, - - ]; - } - -} - -// export class Select extends BaseInput implements OnDestroy { - -// _options: QueryList