UNPKG

@angular/material

Version:
390 lines (382 loc) 16.4 kB
/** * @license * Copyright Google Inc. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Directive, EventEmitter, Injectable, Input, NgModule, Optional, Output, ViewEncapsulation, isDevMode } from '@angular/core'; import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { animate, keyframes, state, style, transition, trigger } from '@angular/animations'; import { CdkColumnDef } from '@angular/cdk/table'; import { merge } from 'rxjs/observable/merge'; import { Subject } from 'rxjs/Subject'; import { AnimationCurves, AnimationDurations } from '@angular/material/core'; import { CommonModule } from '@angular/common'; /** * \@docs-private * @param {?} id * @return {?} */ function getSortDuplicateSortableIdError(id) { return Error("Cannot have two MatSortables with the same id (" + id + ")."); } /** * \@docs-private * @return {?} */ function getSortHeaderNotContainedWithinSortError() { return Error("MatSortHeader must be placed within a parent element with the MatSort directive."); } /** * \@docs-private * @return {?} */ function getSortHeaderMissingIdError() { return Error("MatSortHeader must be provided with a unique id."); } /** * \@docs-private * @param {?} direction * @return {?} */ function getSortInvalidDirectionError(direction) { return Error(direction + " is not a valid sort direction ('asc' or 'desc')."); } /** * Container for MatSortables to manage the sort state and provide default sort parameters. */ var MatSort = (function () { function MatSort() { /** * Collection of all registered sortables that this directive manages. */ this.sortables = new Map(); /** * The direction to set when an MatSortable is initially sorted. * May be overriden by the MatSortable's sort start. */ this.start = 'asc'; this._direction = ''; /** * Event emitted when the user changes either the active sort or sort direction. */ this.sortChange = new EventEmitter(); } Object.defineProperty(MatSort.prototype, "direction", { /** * @return {?} */ get: function () { return this._direction; }, /** * The sort direction of the currently active MatSortable. * @param {?} direction * @return {?} */ set: function (direction) { if (isDevMode() && direction && direction !== 'asc' && direction !== 'desc') { throw getSortInvalidDirectionError(direction); } this._direction = direction; }, enumerable: true, configurable: true }); Object.defineProperty(MatSort.prototype, "disableClear", { /** * Whether to disable the user from clearing the sort by finishing the sort direction cycle. * May be overriden by the MatSortable's disable clear input. * @return {?} */ get: function () { return this._disableClear; }, /** * @param {?} v * @return {?} */ set: function (v) { this._disableClear = coerceBooleanProperty(v); }, enumerable: true, configurable: true }); /** * Register function to be used by the contained MatSortables. Adds the MatSortable to the * collection of MatSortables. * @param {?} sortable * @return {?} */ MatSort.prototype.register = function (sortable) { if (!sortable.id) { throw getSortHeaderMissingIdError(); } if (this.sortables.has(sortable.id)) { throw getSortDuplicateSortableIdError(sortable.id); } this.sortables.set(sortable.id, sortable); }; /** * Unregister function to be used by the contained MatSortables. Removes the MatSortable from the * collection of contained MatSortables. * @param {?} sortable * @return {?} */ MatSort.prototype.deregister = function (sortable) { this.sortables.delete(sortable.id); }; /** * Sets the active sort id and determines the new sort direction. * @param {?} sortable * @return {?} */ MatSort.prototype.sort = function (sortable) { if (this.active != sortable.id) { this.active = sortable.id; this.direction = sortable.start ? sortable.start : this.start; } else { this.direction = this.getNextSortDirection(sortable); } this.sortChange.next({ active: this.active, direction: this.direction }); }; /** * Returns the next sort direction of the active sortable, checking for potential overrides. * @param {?} sortable * @return {?} */ MatSort.prototype.getNextSortDirection = function (sortable) { if (!sortable) { return ''; } // Get the sort direction cycle with the potential sortable overrides. var /** @type {?} */ disableClear = sortable.disableClear != null ? sortable.disableClear : this.disableClear; var /** @type {?} */ sortDirectionCycle = getSortDirectionCycle(sortable.start || this.start, disableClear); // Get and return the next direction in the cycle var /** @type {?} */ nextDirectionIndex = sortDirectionCycle.indexOf(this.direction) + 1; if (nextDirectionIndex >= sortDirectionCycle.length) { nextDirectionIndex = 0; } return sortDirectionCycle[nextDirectionIndex]; }; MatSort.decorators = [ { type: Directive, args: [{ selector: '[matSort]', },] }, ]; /** * @nocollapse */ MatSort.ctorParameters = function () { return []; }; MatSort.propDecorators = { 'active': [{ type: Input, args: ['matSortActive',] },], 'start': [{ type: Input, args: ['matSortStart',] },], 'direction': [{ type: Input, args: ['matSortDirection',] },], 'disableClear': [{ type: Input, args: ['matSortDisableClear',] },], 'sortChange': [{ type: Output, args: ['matSortChange',] },], }; return MatSort; }()); /** * Returns the sort direction cycle to use given the provided parameters of order and clear. * @param {?} start * @param {?} disableClear * @return {?} */ function getSortDirectionCycle(start, disableClear) { var /** @type {?} */ sortOrder = ['asc', 'desc']; if (start == 'desc') { sortOrder.reverse(); } if (!disableClear) { sortOrder.push(''); } return sortOrder; } /** * To modify the labels and text displayed, create a new instance of MatSortHeaderIntl and * include it in a custom provider. */ var MatSortHeaderIntl = (function () { function MatSortHeaderIntl() { /** * Stream that emits whenever the labels here are changed. Use this to notify * components if the labels have changed after initialization. */ this.changes = new Subject(); /** * ARIA label for the sorting button. */ this.sortButtonLabel = function (id) { return "Change sorting for " + id; }; /** * A label to describe the current sort (visible only to screenreaders). */ this.sortDescriptionLabel = function (id, direction) { return "Sorted by " + id + " " + (direction == 'asc' ? 'ascending' : 'descending'); }; } MatSortHeaderIntl.decorators = [ { type: Injectable }, ]; /** * @nocollapse */ MatSortHeaderIntl.ctorParameters = function () { return []; }; return MatSortHeaderIntl; }()); var SORT_ANIMATION_TRANSITION = AnimationDurations.ENTERING + ' ' + AnimationCurves.STANDARD_CURVE; /** * Applies sorting behavior (click to change sort) and styles to an element, including an * arrow to display the current sort direction. * * Must be provided with an id and contained within a parent MatSort directive. * * If used on header cells in a CdkTable, it will automatically default its id from its containing * column definition. */ var MatSortHeader = (function () { /** * @param {?} _intl * @param {?} changeDetectorRef * @param {?} _sort * @param {?} _cdkColumnDef */ function MatSortHeader(_intl, changeDetectorRef, _sort, _cdkColumnDef) { this._intl = _intl; this._sort = _sort; this._cdkColumnDef = _cdkColumnDef; /** * Sets the position of the arrow that displays when sorted. */ this.arrowPosition = 'after'; if (!_sort) { throw getSortHeaderNotContainedWithinSortError(); } this._rerenderSubscription = merge(_sort.sortChange, _intl.changes).subscribe(function () { changeDetectorRef.markForCheck(); }); } Object.defineProperty(MatSortHeader.prototype, "disableClear", { /** * Overrides the disable clear value of the containing MatSort for this MatSortable. * @return {?} */ get: function () { return this._disableClear; }, /** * @param {?} v * @return {?} */ set: function (v) { this._disableClear = coerceBooleanProperty(v); }, enumerable: true, configurable: true }); /** * @return {?} */ MatSortHeader.prototype.ngOnInit = function () { if (!this.id && this._cdkColumnDef) { this.id = this._cdkColumnDef.name; } this._sort.register(this); }; /** * @return {?} */ MatSortHeader.prototype.ngOnDestroy = function () { this._sort.deregister(this); this._rerenderSubscription.unsubscribe(); }; /** * Whether this MatSortHeader is currently sorted in either ascending or descending order. * @return {?} */ MatSortHeader.prototype._isSorted = function () { return this._sort.active == this.id && (this._sort.direction === 'asc' || this._sort.direction === 'desc'); }; MatSortHeader.decorators = [ { type: Component, args: [{selector: '[mat-sort-header]', template: "<div class=\"mat-sort-header-container\" [class.mat-sort-header-position-before]=\"arrowPosition == 'before'\"><button class=\"mat-sort-header-button\" type=\"button\" [attr.aria-label]=\"_intl.sortButtonLabel(id)\"><ng-content></ng-content></button><div *ngIf=\"_isSorted()\" class=\"mat-sort-header-arrow\" [@indicatorToggle]=\"_sort.direction\"><div class=\"mat-sort-header-stem\"></div><div class=\"mat-sort-header-indicator\" [@indicator]=\"_sort.direction\"><div class=\"mat-sort-header-pointer-left\" [@leftPointer]=\"_sort.direction\"></div><div class=\"mat-sort-header-pointer-right\" [@rightPointer]=\"_sort.direction\"></div><div class=\"mat-sort-header-pointer-middle\"></div></div></div></div><span class=\"cdk-visually-hidden\" *ngIf=\"_isSorted()\">{{_intl.sortDescriptionLabel(id, _sort.direction)}}</span>", styles: [".mat-sort-header-container{display:flex;cursor:pointer}.mat-sort-header-position-before{flex-direction:row-reverse}.mat-sort-header-button{border:none;background:0 0;display:flex;align-items:center;padding:0;cursor:pointer;outline:0;font:inherit;color:currentColor}.mat-sort-header-arrow{height:12px;width:12px;margin:0 0 0 6px;position:relative;display:flex}.mat-sort-header-position-before .mat-sort-header-arrow{margin:0 6px 0 0}.mat-sort-header-stem{background:currentColor;height:10px;width:2px;margin:auto;display:flex;align-items:center}.mat-sort-header-indicator{width:100%;height:2px;display:flex;align-items:center;position:absolute;top:0;left:0;transition:225ms cubic-bezier(.4,0,.2,1)}.mat-sort-header-pointer-middle{margin:auto;height:2px;width:2px;background:currentColor;transform:rotate(45deg)}.mat-sort-header-pointer-left,.mat-sort-header-pointer-right{background:currentColor;width:6px;height:2px;transition:225ms cubic-bezier(.4,0,.2,1);position:absolute;top:0}.mat-sort-header-pointer-left{transform-origin:right;left:0}.mat-sort-header-pointer-right{transform-origin:left;right:0}"], host: { '(click)': '_sort.sort(this)', '[class.mat-sort-header-sorted]': '_isSorted()', }, encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, animations: [ trigger('indicator', [ state('asc', style({ transform: 'translateY(0px)' })), // 10px is the height of the sort indicator, minus the width of the pointers state('desc', style({ transform: 'translateY(10px)' })), transition('asc <=> desc', animate(SORT_ANIMATION_TRANSITION)) ]), trigger('leftPointer', [ state('asc', style({ transform: 'rotate(-45deg)' })), state('desc', style({ transform: 'rotate(45deg)' })), transition('asc <=> desc', animate(SORT_ANIMATION_TRANSITION)) ]), trigger('rightPointer', [ state('asc', style({ transform: 'rotate(45deg)' })), state('desc', style({ transform: 'rotate(-45deg)' })), transition('asc <=> desc', animate(SORT_ANIMATION_TRANSITION)) ]), trigger('indicatorToggle', [ transition('void => asc', animate(SORT_ANIMATION_TRANSITION, keyframes([ style({ transform: 'translateY(25%)', opacity: 0 }), style({ transform: 'none', opacity: 1 }) ]))), transition('asc => void', animate(SORT_ANIMATION_TRANSITION, keyframes([ style({ transform: 'none', opacity: 1 }), style({ transform: 'translateY(-25%)', opacity: 0 }) ]))), transition('void => desc', animate(SORT_ANIMATION_TRANSITION, keyframes([ style({ transform: 'translateY(-25%)', opacity: 0 }), style({ transform: 'none', opacity: 1 }) ]))), transition('desc => void', animate(SORT_ANIMATION_TRANSITION, keyframes([ style({ transform: 'none', opacity: 1 }), style({ transform: 'translateY(25%)', opacity: 0 }) ]))), ]) ] },] }, ]; /** * @nocollapse */ MatSortHeader.ctorParameters = function () { return [ { type: MatSortHeaderIntl, }, { type: ChangeDetectorRef, }, { type: MatSort, decorators: [{ type: Optional },] }, { type: CdkColumnDef, decorators: [{ type: Optional },] }, ]; }; MatSortHeader.propDecorators = { 'id': [{ type: Input, args: ['mat-sort-header',] },], 'arrowPosition': [{ type: Input },], 'start': [{ type: Input, args: ['start',] },], 'disableClear': [{ type: Input },], }; return MatSortHeader; }()); var MatSortModule = (function () { function MatSortModule() { } MatSortModule.decorators = [ { type: NgModule, args: [{ imports: [CommonModule], exports: [MatSort, MatSortHeader], declarations: [MatSort, MatSortHeader], providers: [MatSortHeaderIntl] },] }, ]; /** * @nocollapse */ MatSortModule.ctorParameters = function () { return []; }; return MatSortModule; }()); /** * Generated bundle index. Do not edit. */ export { MatSortModule, MatSortHeader, MatSortHeaderIntl, MatSort }; //# sourceMappingURL=sort.es5.js.map