UNPKG

ionic-angular

Version:

A powerful framework for building mobile and progressive web apps with JavaScript and Angular

457 lines 18 kB
var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); (function (factory) { if (typeof module === "object" && typeof module.exports === "object") { var v = factory(require, exports); if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { define(["require", "exports", "@angular/core", "../button/button", "../../config/config", "../../util/form", "../icon/icon", "../ion", "../label/label", "./item-reorder"], factory); } })(function (require, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var core_1 = require("@angular/core"); var button_1 = require("../button/button"); var config_1 = require("../../config/config"); var form_1 = require("../../util/form"); var icon_1 = require("../icon/icon"); var ion_1 = require("../ion"); var label_1 = require("../label/label"); var item_reorder_1 = require("./item-reorder"); /** * @name Item * @description * An item can contain text, images, and anything else. Generally it is placed in a list with other * items. It can easily be swiped, deleted, reordered, edited, and more. An item is only required to * be in a [List](../../list/List) if manipulating the item via gestures is required. It requires an * [ItemSliding](../ItemSliding) wrapper element in order to be swiped. * * * ## Common Usage * There are a few elements that are considered items, but not all of them are styled to look the same. * The basic item can be written as an `<ion-item>` element or it can be added to any element by adding * `ion-item` as an attribute. List headers and item dividers, although styled differently, are also items * and can be written as `<ion-list-header>` and `<ion-item-divider>`, respectively. * * ### As an Element * A basic item should be written as a `<ion-item>` element when it is not clickable. * * ```html * <ion-item> * Item * </ion-item> * ``` * * A list header should be written as `<ion-list-header>`. * * ```html * <ion-list-header> * List Header * </ion-list-header> * ``` * * An item divider should be written as `<ion-item-divider>`. * * ```html * <ion-item-divider> * Item Divider * </ion-item-divider> * ``` * * ### As an Attribute * The attribute `ion-item` should be added to a `<button>` when the item can be clicked or tapped. It * should be added to an `<a>` element when the item needs to contain a `href`. It can be added as an * attribute to any element to take on the item styling. * * ```html * <button ion-item (click)="buttonClick()"> * Button Item * </button> * * <a ion-item href="https://www.ionicframework.com"> * Anchor Item * </a> * ``` * * Note: do not add `ion-item` as an attribute to an `<ion-list-header>` or `<ion-item-divider>` element * as they are already items and their styling will be changed to look like a basic item. * * ## Detail Arrows * By default, `<button>` and `<a>` elements with the `ion-item` attribute will display a right arrow icon * on `ios` mode. To hide the right arrow icon on either of these elements, add the `detail-none` attribute * to the item. To show the right arrow icon on an element that doesn't display it naturally, add the * `detail-push` attribute to the item. * * ```html * <ion-item detail-push> * Item with Detail Arrow * </ion-item> * * <button ion-item (click)="buttonClick()"> * Button Item with Detail Arrow * </button> * * <a ion-item detail-none href="https://www.ionicframework.com"> * Anchor Item with no Detail Arrow * </a> * ``` * * This feature is not enabled by default for `md` and `wp` modes, but it can be enabled by setting the * Sass variables `$item-md-detail-push-show` and `$item-wp-detail-push-show`, respectively, to `true`. * It can also be disabled for ios by setting `$item-ios-detail-push-show` to `false`. See the * [theming documentation](http://ionicframework.com/docs/theming/overriding-ionic-variables/) for * more information on overriding Sass variables. * * * ## Item Placement * Items rely heavily on content projection to position content. The item grabs content based on the * element or attribute and positions it that way. This logic makes it possible to write a complex * item with simple, understandable markup without having to worry about styling and positioning * the elements. * * The below chart details the attributes item looks for and where it will place the element with * that attribute inside of the item: * * | Attribute | Description | * |----------------|----------------------------------------------------------------------------------------------------- | * | `item-start` | Placed to the left of all other elements, outside of the inner item. | * | `item-end` | Placed to the right of all other elements, inside of the inner item, outside of the input wrapper. | * | `item-content` | Placed to the right of any `ion-label`, inside of the input wrapper. | * * ### Checkboxes, Radios and Toggles * [Checkboxes](../../checkbox/Checkbox) are positioned in the same place as the `item-start` attribute. * [Radios](../../radio/RadioButton) and [Toggles](../../toggle/Toggle) are positioned in the same place * as the `item-end` attribute. All of these components can be positioned differently by adding the * `item-start` or `item-end` attribute. * * ### Content and Inputs * A [Label](../../label/Label) is placed inside of the item to the left of all content and inputs. The * following components are all placed in the same position as the `item-content` attribute: [Select](../../select/Select), * [Input](../../input/Input), [TextArea](../../input/TextArea), [DateTime](../../datetime/DateTime), and * [Range](../../range/Range). * * Any element directly placed inside of an `<ion-item>` that does not have one of the previously mentioned * attributes and isn't one of the above elements will be placed inside of a [Label](../../label/Label). * * ### Text Alignment * By default, Items will align text to the left and add an ellipsis when the text is wider than the item. * See the [Utility Attributes Documentation](../../../../theming/css-utilities/) for attributes that can * be added to `ion-item` to transform the text. * * @usage * * ```html * <ion-list> * * <ion-list-header> * Header * </ion-list-header> * * <ion-item> * Item * </ion-item> * * <ion-item detail-push> * Item with Detail Arrow * </ion-item> * * <button ion-item (click)="buttonClick()"> * Button Item * </button> * * <ion-item-divider> * Item Divider * </ion-item-divider> * * <button ion-item detail-none (click)="buttonClick()"> * Button Item with no Detail Arrow * </button> * * <a ion-item href="https://www.ionicframework.com"> * Anchor Item * </a> * * <ion-item no-lines> * Item with no border * </ion-item> * * <ion-item text-wrap> * Multiline text that should wrap when it is too long * to fit on one line in the item. * </ion-item> * * </ion-list> * ``` * * * @advanced * * ```html * <ion-list> * * <!-- List header with buttons on each side --> * <ion-list-header> * <button ion-button item-start (click)="buttonClick()">Button</button> * List Header * <button ion-button outline item-end (click)="buttonClick()">Outline</button> * </ion-list-header> * * <!-- Loops through and creates multiple items --> * <ion-item *ngFor="let item of items"> * Item {% raw %}{{item}}{% endraw %} * </ion-item> * * <!-- Button item with an icon on the left --> * <button ion-item> * <ion-icon name="star" item-start></ion-icon> * Button Item * </button> * * <!-- Item with a label and content --> * <ion-item> * <ion-label> * Item Label * </ion-label> * <div item-content> * Item Content next to the label * </div> * </ion-item> * * <!-- Item with left and right buttons --> * <ion-item> * <button ion-button item-start (click)="buttonClick()">Button</button> * Item * <button ion-button outline item-end (click)="buttonClick()">Outline</button> * </ion-item> * * <!-- Item divider with a right button --> * <ion-item-divider> * Item Divider * <button ion-button item-end>Button</button> * </ion-item-divider> * * <!-- Disabled button item with left and right buttons --> * <button ion-item disabled> * <button ion-button item-start (click)="buttonClick()"> * <ion-icon name="home"></ion-icon> * Left Icon * </button> * Disabled Button Item * <button ion-button outline item-end (click)="buttonClick()"> * <ion-icon name="star"></ion-icon> * Left Icon * </button> * </button> * * <!-- Item with an avatar on the left and button on the right --> * <ion-item> * <ion-avatar item-start> * <img src="img/my-avatar.png"> * </ion-avatar> * Avatar Item * <button ion-button outline item-end>View</button> * </ion-item> * * <!-- Item with a thumbnail on the right --> * <ion-item> * <h2>Item</h2> * <p>Item Paragraph</p> * <ion-thumbnail item-end> * <img src="img/my-thumbnail.png"> * </ion-thumbnail> * </ion-item> * * <!-- Sliding item --> * <ion-item-sliding> * <ion-item> * Item * </ion-item> * <ion-item-options> * <button ion-button color="primary" (click)="archive()">Archive</button> * </ion-item-options> * </ion-item-sliding> * * </ion-list> * ``` * * * @demo /docs/demos/src/item/ * @see {@link /docs/components#lists List Component Docs} * @see {@link ../../list/List List API Docs} * @see {@link ../ItemSliding ItemSliding API Docs} */ var Item = (function (_super) { __extends(Item, _super); function Item(form, config, elementRef, renderer, reorder) { var _this = _super.call(this, config, elementRef, renderer, 'item') || this; _this._ids = -1; _this._inputs = []; _this._viewLabel = true; _this._name = 'item'; /** * @hidden */ _this.labelId = null; _this._setName(elementRef); _this._hasReorder = !!reorder; _this.id = form.nextId().toString(); _this.labelId = 'lbl-' + _this.id; // auto add "tappable" attribute to ion-item components that have a click listener if (!renderer.orgListen) { renderer.orgListen = renderer.listen; renderer.listen = function (renderElement, name, callback) { if (name === 'click' && renderElement.setAttribute) { renderElement.setAttribute('tappable', ''); } return renderer.orgListen(renderElement, name, callback); }; } return _this; } /** * @hidden */ Item.prototype.registerInput = function (type) { this._inputs.push(type); return this.id + '-' + (++this._ids); }; /** * @hidden */ Item.prototype.ngAfterContentInit = function () { if (this._viewLabel && this._inputs.length) { var labelText = this.getLabelText().trim(); this._viewLabel = (labelText.length > 0); } if (this._inputs.length > 1) { this.setElementClass('item-multiple-inputs', true); } }; /** * @hidden */ Item.prototype._updateColor = function (newColor, componentName) { componentName = componentName || 'item'; // item-radio this._setColor(newColor, componentName); }; /** * @hidden */ Item.prototype._setName = function (elementRef) { var nodeName = elementRef.nativeElement.nodeName.replace('ION-', ''); if (nodeName === 'LIST-HEADER' || nodeName === 'ITEM-DIVIDER') { this._name = nodeName; } }; /** * @hidden */ Item.prototype.getLabelText = function () { return this._label ? this._label.text : ''; }; Object.defineProperty(Item.prototype, "contentLabel", { /** * @hidden */ set: function (label) { if (label) { this._label = label; label.id = this.labelId; if (label.type) { this.setElementClass('item-label-' + label.type, true); } this._viewLabel = false; } }, enumerable: true, configurable: true }); Object.defineProperty(Item.prototype, "viewLabel", { /** * @hidden */ set: function (label) { if (!this._label) { this._label = label; } }, enumerable: true, configurable: true }); Object.defineProperty(Item.prototype, "_buttons", { /** * @hidden */ set: function (buttons) { buttons.forEach(function (button) { if (!button._size) { button.setElementClass('item-button', true); } }); }, enumerable: true, configurable: true }); Object.defineProperty(Item.prototype, "_icons", { /** * @hidden */ set: function (icons) { icons.forEach(function (icon) { icon.setElementClass('item-icon', true); }); }, enumerable: true, configurable: true }); Item.decorators = [ { type: core_1.Component, args: [{ selector: 'ion-list-header,ion-item,[ion-item],ion-item-divider', template: '<ng-content select="[item-start],[item-left],ion-checkbox:not([item-end]):not([item-right])"></ng-content>' + '<div class="item-inner">' + '<div class="input-wrapper">' + '<ng-content select="ion-label"></ng-content>' + '<ion-label *ngIf="_viewLabel">' + '<ng-content></ng-content>' + '</ion-label>' + '<ng-content select="ion-select,ion-input,ion-textarea,ion-datetime,ion-range,[item-content]"></ng-content>' + '</div>' + '<ng-content select="[item-end],[item-right],ion-radio,ion-toggle"></ng-content>' + '<ion-reorder *ngIf="_hasReorder"></ion-reorder>' + '</div>' + '<div class="button-effect"></div>', host: { 'class': 'item' }, changeDetection: core_1.ChangeDetectionStrategy.OnPush, encapsulation: core_1.ViewEncapsulation.None, },] }, ]; /** @nocollapse */ Item.ctorParameters = function () { return [ { type: form_1.Form, }, { type: config_1.Config, }, { type: core_1.ElementRef, }, { type: core_1.Renderer, }, { type: item_reorder_1.ItemReorder, decorators: [{ type: core_1.Optional },] }, ]; }; Item.propDecorators = { 'contentLabel': [{ type: core_1.ContentChild, args: [label_1.Label,] },], 'viewLabel': [{ type: core_1.ViewChild, args: [label_1.Label,] },], '_buttons': [{ type: core_1.ContentChildren, args: [button_1.Button,] },], '_icons': [{ type: core_1.ContentChildren, args: [icon_1.Icon,] },], }; return Item; }(ion_1.Ion)); exports.Item = Item; }); //# sourceMappingURL=item.js.map