UNPKG

md2

Version:

Angular2 based Material Design components, directives and services are Accordion, Autocomplete, Chips(Tags), Collapse, Colorpicker, Data Table, Datepicker, Dialog(Modal), Menu, Multiselect, Select, Tabs, Tags(Chips), Toast and Tooltip.

374 lines (373 loc) 16.3 kB
import { AfterContentInit, ElementRef, EventEmitter, OnDestroy, QueryList, Renderer2, ChangeDetectorRef, OnInit } from '@angular/core'; import { Md2Option, Md2OptionSelectionChange } from './option'; import { Md2Optgroup } from './optgroup'; import { FocusKeyManager } from '../core/a11y/focus-key-manager'; import { Dir } from '../core/rtl/dir'; import { Observable } from 'rxjs/Observable'; import { ControlValueAccessor, NgControl } from '@angular/forms'; import { ConnectedOverlayDirective } from '../core/overlay/overlay-directives'; import { ViewportRuler } from '../core/overlay/position/viewport-ruler'; import { SelectionModel } from '../core/selection/selection'; import 'rxjs/add/observable/merge'; import 'rxjs/add/operator/startWith'; import 'rxjs/add/operator/filter'; /** * The following style constants are necessary to save here in order * to properly calculate the alignment of the selected option over * the trigger element. */ /** The fixed height of every option element (option, group header etc.). */ export declare const SELECT_ITEM_HEIGHT = 48; /** The max height of the select's overlay panel */ export declare const SELECT_PANEL_MAX_HEIGHT = 256; /** The max number of options visible at once in the select panel. */ export declare const SELECT_MAX_OPTIONS_DISPLAYED: number; /** The fixed height of the select's trigger element. */ export declare const SELECT_TRIGGER_HEIGHT = 30; /** * Must adjust for the difference in height between the option and the trigger, * so the text will align on the y axis. */ export declare const SELECT_ITEM_HEIGHT_ADJUSTMENT: number; /** The panel's padding on the x-axis */ export declare const SELECT_PANEL_PADDING_X = 16; /** The panel's x axis padding if it is indented (e.g. there is an option group). */ export declare const SELECT_PANEL_INDENT_PADDING_X: number; /** * Distance between the panel edge and the option text in * multi-selection mode. * * (SELECT_PADDING * 1.75) + 20 = 48 * The padding is multiplied by 1.75 because the checkbox's margin is half the padding, and * the browser adds ~4px, because we're using inline elements. * The checkbox width is 20px. */ export declare const SELECT_MULTIPLE_PANEL_PADDING_X: number; /** * The panel's padding on the y-axis. This padding indicates there are more * options available if you scroll. */ export declare const SELECT_PANEL_PADDING_Y = 16; /** * The select panel will only "fit" inside the viewport if it is positioned at * this value or more away from the viewport boundary. */ export declare const SELECT_PANEL_VIEWPORT_PADDING = 8; /** Change event object that is emitted when the select value has changed. */ export declare class Md2SelectChange { source: Md2Select; value: any; constructor(source: Md2Select, value: any); } /** Allowed values for the floatPlaceholder option. */ export declare type Md2SelectFloatPlaceholderType = 'always' | 'never' | 'auto'; export declare class Md2Select implements AfterContentInit, OnDestroy, OnInit, ControlValueAccessor { private _element; private _renderer; private _viewportRuler; private _changeDetectorRef; private _dir; _control: NgControl; /** Whether or not the overlay panel is open. */ private _panelOpen; /** Subscriptions to option events. */ private _optionSubscription; /** Subscription to changes in the option list. */ private _changeSubscription; /** Subscription to tab events while overlay is focused. */ private _tabSubscription; /** Whether filling out the select is required in the form. */ private _required; /** Whether the select is disabled. */ private _disabled; /** The scroll position of the overlay panel, calculated to center the selected option. */ private _scrollTop; /** The placeholder displayed in the trigger of the select. */ private _placeholder; /** Whether the component is in multiple selection mode. */ private _multiple; /** Deals with the selection logic. */ _selectionModel: SelectionModel<Md2Option>; /** The animation state of the placeholder. */ private _placeholderState; /** Tab index for the element. */ private _tabIndex; /** Theme color for the component. */ private _color; /** * The width of the trigger. Must be saved to set the min width of the overlay panel * and the width of the selected value. */ _triggerWidth: number; /** Manages keyboard events for options in the panel. */ _keyManager: FocusKeyManager; /** * The width of the selected option's value. Must be set programmatically * to ensure its overflow is clipped, as it's absolutely positioned. */ _selectedValueWidth: number; /** View -> model callback called when value changes */ _onChange: (value: any) => void; /** View -> model callback called when select has been touched */ _onTouched: () => void; /** The IDs of child options to be passed to the aria-owns attribute. */ _optionIds: string; /** The value of the select panel's transform-origin property. */ _transformOrigin: string; /** Whether the panel's animation is done. */ _panelDoneAnimating: boolean; /** * The y-offset of the overlay panel in relation to the trigger's top start corner. * This must be adjusted to align the selected option text over the trigger text. * when the panel opens. Will change based on the y-position of the selected option. */ _offsetY: number; /** * This position config ensures that the top "start" corner of the overlay * is aligned with with the top "start" of the origin by default (overlapping * the trigger completely). If the panel cannot fit below the trigger, it * will fall back to a position above the trigger. */ _positions: { originX: string; originY: string; overlayX: string; overlayY: string; }[]; /** Trigger that opens the select. */ trigger: ElementRef; /** Overlay pane containing the options. */ overlayDir: ConnectedOverlayDirective; /** All of the defined select options. */ options: QueryList<Md2Option>; /** All of the defined groups of options. */ optionGroups: QueryList<Md2Optgroup>; /** Placeholder to be shown if no value has been selected. */ placeholder: string; /** Whether the component is disabled. */ disabled: any; /** Whether the component is required. */ required: any; /** Whether the user should be allowed to select multiple options. */ multiple: boolean; /** Whether to float the placeholder text. */ floatPlaceholder: Md2SelectFloatPlaceholderType; private _floatPlaceholder; /** Tab index for the select element. */ tabIndex: number; /** Aria label of the select. If not specified, the placeholder will be used as label. */ ariaLabel: string; /** Input that can be used to specify the `aria-labelledby` attribute. */ ariaLabelledby: string; /** Combined stream of all of the child options' change events. */ readonly optionSelectionChanges: Observable<Md2OptionSelectionChange>; /** Event emitted when the select has been opened. */ onOpen: EventEmitter<void>; /** Event emitted when the select has been closed. */ onClose: EventEmitter<void>; /** Event emitted when the selected value has been changed by the user. */ change: EventEmitter<Md2SelectChange>; constructor(_element: ElementRef, _renderer: Renderer2, _viewportRuler: ViewportRuler, _changeDetectorRef: ChangeDetectorRef, _dir: Dir, _control: NgControl, tabIndex: string); ngOnInit(): void; ngAfterContentInit(): void; ngOnDestroy(): void; /** Toggles the overlay panel open or closed. */ toggle(): void; /** Opens the overlay panel. */ open(): void; /** Closes the overlay panel and focuses the host element. */ close(): void; /** * Sets the select's value. Part of the ControlValueAccessor interface * required to integrate with Angular's core forms API. * * @param value New value to be written to the model. */ writeValue(value: any): void; /** * Saves a callback function to be invoked when the select's value * changes from user input. Part of the ControlValueAccessor interface * required to integrate with Angular's core forms API. * * @param fn Callback to be triggered when the value changes. */ registerOnChange(fn: (value: any) => void): void; /** * Saves a callback function to be invoked when the select is blurred * by the user. Part of the ControlValueAccessor interface required * to integrate with Angular's core forms API. * * @param fn Callback to be triggered when the component has been touched. */ registerOnTouched(fn: () => {}): void; /** * Disables the select. Part of the ControlValueAccessor interface required * to integrate with Angular's core forms API. * * @param isDisabled Sets whether the component is disabled. */ setDisabledState(isDisabled: boolean): void; /** Whether or not the overlay panel is open. */ readonly panelOpen: boolean; /** The currently selected option. */ readonly selected: Md2Option | Md2Option[]; /** The value displayed in the trigger. */ readonly triggerValue: string; /** Whether the element is in RTL mode. */ _isRtl(): boolean; /** * Sets the width of the trigger element. This is necessary to match * the overlay width to the trigger width. */ private _setTriggerWidth(); /** Handles the keyboard interactions of a closed select. */ _handleClosedKeydown(event: KeyboardEvent): void; /** Handles keypresses inside the panel. */ _handlePanelKeydown(event: KeyboardEvent): void; /** * When the panel element is finished transforming in (though not fading in), it * emits an event and focuses an option if the panel is open. */ _onPanelDone(): void; /** * When the panel content is done fading in, the _panelDoneAnimating property is * set so the proper class can be added to the panel. */ _onFadeInDone(): void; /** * Calls the touched callback only if the panel is closed. Otherwise, the trigger will * "blur" to the panel when it opens, causing a false positive. */ _onBlur(): void; /** * Callback that is invoked when the overlay panel has been attached. */ _onAttached(): void; /** * Sets the scroll position of the scroll container. This must be called after * the overlay pane is attached or the scroll container element will not yet be * present in the DOM. */ private _setScrollTop(); /** * Sets the selected option based on a value. If no option can be * found with the designated value, the select trigger is cleared. */ private _setSelectionByValue(value); /** * Finds and selects and option based on its value. * @returns Option that has the corresponding value. */ private _selectValue(value); /** * Compare two vars or objects * @param o1 compare first object * @param o2 compare second object * @return boolean comparation result */ private equals(o1, o2); /** * Clears the select trigger and deselects every option in the list. * @param skip Option that should not be deselected. */ private _clearSelection(skip?); private _getTriggerRect(); /** Sets up a key manager to listen to keyboard events on the overlay panel. */ private _initKeyManager(); /** Drops current option subscriptions and IDs and resets from scratch. */ private _resetOptions(); /** Listens to user-generated selection events on each option. */ private _listenToOptions(); /** Invoked when an option is clicked. */ private _onSelect(option); /** * Sorts the model values, ensuring that they keep the same * order that they have in the panel. */ private _sortValues(); /** Unsubscribes from all option subscriptions. */ private _dropSubscriptions(); /** Emits change event to set the model value. */ private _propagateChanges(fallbackValue?); /** Records option IDs to pass to the aria-owns property. */ private _setOptionIds(); /** * Sets the `multiple` property on each option. The promise is necessary * in order to avoid Angular errors when modifying the property after init. */ private _setOptionMultiple(); /** * Must set the width of the selected option's value programmatically * because it is absolutely positioned and otherwise will not clip * overflow. The selection arrow is 9px wide, add 4px of padding = 13 */ private _setValueWidth(); /** * Focuses the selected item. If no option is selected, it will focus * the first item instead. */ private _focusCorrectOption(); /** Focuses the host element when the panel closes. */ private _focusHost(); /** Gets the index of the provided option in the option list. */ private _getOptionIndex(option); /** Calculates the scroll position and x- and y-offsets of the overlay panel. */ private _calculateOverlayPosition(); /** * Calculates the scroll position of the select's overlay panel. * * Attempts to center the selected option in the panel. If the option is * too high or too low in the panel to be scrolled to the center, it clamps the * scroll position to the min or max scroll positions respectively. */ _calculateOverlayScroll(selectedIndex: number, scrollBuffer: number, maxScroll: number): number; /** * Figures out the appropriate animation state for the placeholder. */ _getPlaceholderAnimationState(): string; /** * Determines the CSS `opacity` of the placeholder element. */ _getPlaceholderOpacity(): string; /** Returns the aria-label of the select component. */ readonly _ariaLabel: string; /** * Sets the x-offset of the overlay panel in relation to the trigger's top start corner. * This must be adjusted to align the selected option text over the trigger text when * the panel opens. Will change based on LTR or RTL text direction. Note that the offset * can't be calculated until the panel has been attached, because we need to know the * content width in order to constrain the panel within the viewport. */ private _calculateOverlayOffsetX(); /** * Calculates the y-offset of the select's overlay panel in relation to the * top start corner of the trigger. It has to be adjusted in order for the * selected option to be aligned over the trigger when the panel opens. */ private _calculateOverlayOffsetY(selectedIndex, scrollBuffer, maxScroll); /** * Checks that the attempted overlay position will fit within the viewport. * If it will not fit, tries to adjust the scroll position and the associated * y-offset so the panel can open fully on-screen. If it still won't fit, * sets the offset back to 0 to allow the fallback position to take over. */ private _checkOverlayWithinViewport(maxScroll); /** Adjusts the overlay panel up to fit in the viewport. */ private _adjustPanelUp(panelHeightBottom, bottomSpaceAvailable); /** Adjusts the overlay panel down to fit in the viewport. */ private _adjustPanelDown(panelHeightTop, topSpaceAvailable, maxScroll); /** Sets the transform origin point based on the selected option. */ private _getOriginBasedOnOption(); /** Figures out the floating placeholder state value. */ private _floatPlaceholderState(); /** Handles the user pressing the arrow keys on a closed select. */ private _handleArrowKey(event); /** Calculates the amount of items in the select. This includes options and group labels. */ private _getItemCount(); /** * Calculates the amount of option group labels that precede the specified option. * Useful when positioning the panel, because the labels will offset the index of the * currently-selected option. */ private _getLabelCountBeforeOption(optionIndex); }