blob: f4ba1318e92d89f060b5182b65dcc9341a824c2b [file] [log] [blame]
/**
* @license
* Copyright Google LLC 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
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rxjs'), require('@angular/core')) :
typeof define === 'function' && define.amd ? define('@angular/cdk/collections', ['exports', 'rxjs', '@angular/core'], factory) :
(factory((global.ng = global.ng || {}, global.ng.cdk = global.ng.cdk || {}, global.ng.cdk.collections = {}),global.rxjs,global.ng.core));
}(this, (function (exports,rxjs,core) { 'use strict';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/* global Reflect, Promise */
var extendStatics = function(d, b) {
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 extendStatics(d, b);
};
function __extends(d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @abstract
* @template T
*/
var /**
* @abstract
* @template T
*/
DataSource = /** @class */ (function () {
function DataSource() {
}
return DataSource;
}());
/**
* Checks whether an object is a data source.
* @param {?} value
* @return {?}
*/
function isDataSource(value) {
// Check if the value is a DataSource by observing if it has a connect function. Cannot
// be checked as an `instanceof DataSource` since people could create their own sources
// that match the interface, but don't extend DataSource.
return value && typeof value.connect === 'function';
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* DataSource wrapper for a native array.
* @template T
*/
var /**
* DataSource wrapper for a native array.
* @template T
*/
ArrayDataSource = /** @class */ (function (_super) {
__extends(ArrayDataSource, _super);
function ArrayDataSource(_data) {
var _this = _super.call(this) || this;
_this._data = _data;
return _this;
}
/**
* @return {?}
*/
ArrayDataSource.prototype.connect = /**
* @return {?}
*/
function () {
return this._data instanceof rxjs.Observable ? this._data : rxjs.of(this._data);
};
/**
* @return {?}
*/
ArrayDataSource.prototype.disconnect = /**
* @return {?}
*/
function () { };
return ArrayDataSource;
}(DataSource));
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* Class to be used to power selecting one or more options from a list.
* @template T
*/
var /**
* Class to be used to power selecting one or more options from a list.
* @template T
*/
SelectionModel = /** @class */ (function () {
function SelectionModel(_multiple, initiallySelectedValues, _emitChanges) {
var _this = this;
if (_multiple === void 0) { _multiple = false; }
if (_emitChanges === void 0) { _emitChanges = true; }
this._multiple = _multiple;
this._emitChanges = _emitChanges;
/**
* Currently-selected values.
*/
this._selection = new Set();
/**
* Keeps track of the deselected options that haven't been emitted by the change event.
*/
this._deselectedToEmit = [];
/**
* Keeps track of the selected options that haven't been emitted by the change event.
*/
this._selectedToEmit = [];
/**
* Event emitted when the value has changed.
*/
this.changed = new rxjs.Subject();
/**
* Event emitted when the value has changed.
* @deprecated Use `changed` instead.
* \@breaking-change 8.0.0 To be changed to `changed`
*/
this.onChange = this.changed;
if (initiallySelectedValues && initiallySelectedValues.length) {
if (_multiple) {
initiallySelectedValues.forEach((/**
* @param {?} value
* @return {?}
*/
function (value) { return _this._markSelected(value); }));
}
else {
this._markSelected(initiallySelectedValues[0]);
}
// Clear the array in order to avoid firing the change event for preselected values.
this._selectedToEmit.length = 0;
}
}
Object.defineProperty(SelectionModel.prototype, "selected", {
/** Selected values. */
get: /**
* Selected values.
* @return {?}
*/
function () {
if (!this._selected) {
this._selected = Array.from(this._selection.values());
}
return this._selected;
},
enumerable: true,
configurable: true
});
/**
* Selects a value or an array of values.
*/
/**
* Selects a value or an array of values.
* @param {...?} values
* @return {?}
*/
SelectionModel.prototype.select = /**
* Selects a value or an array of values.
* @param {...?} values
* @return {?}
*/
function () {
var _this = this;
var values = [];
for (var _i = 0; _i < arguments.length; _i++) {
values[_i] = arguments[_i];
}
this._verifyValueAssignment(values);
values.forEach((/**
* @param {?} value
* @return {?}
*/
function (value) { return _this._markSelected(value); }));
this._emitChangeEvent();
};
/**
* Deselects a value or an array of values.
*/
/**
* Deselects a value or an array of values.
* @param {...?} values
* @return {?}
*/
SelectionModel.prototype.deselect = /**
* Deselects a value or an array of values.
* @param {...?} values
* @return {?}
*/
function () {
var _this = this;
var values = [];
for (var _i = 0; _i < arguments.length; _i++) {
values[_i] = arguments[_i];
}
this._verifyValueAssignment(values);
values.forEach((/**
* @param {?} value
* @return {?}
*/
function (value) { return _this._unmarkSelected(value); }));
this._emitChangeEvent();
};
/**
* Toggles a value between selected and deselected.
*/
/**
* Toggles a value between selected and deselected.
* @param {?} value
* @return {?}
*/
SelectionModel.prototype.toggle = /**
* Toggles a value between selected and deselected.
* @param {?} value
* @return {?}
*/
function (value) {
this.isSelected(value) ? this.deselect(value) : this.select(value);
};
/**
* Clears all of the selected values.
*/
/**
* Clears all of the selected values.
* @return {?}
*/
SelectionModel.prototype.clear = /**
* Clears all of the selected values.
* @return {?}
*/
function () {
this._unmarkAll();
this._emitChangeEvent();
};
/**
* Determines whether a value is selected.
*/
/**
* Determines whether a value is selected.
* @param {?} value
* @return {?}
*/
SelectionModel.prototype.isSelected = /**
* Determines whether a value is selected.
* @param {?} value
* @return {?}
*/
function (value) {
return this._selection.has(value);
};
/**
* Determines whether the model does not have a value.
*/
/**
* Determines whether the model does not have a value.
* @return {?}
*/
SelectionModel.prototype.isEmpty = /**
* Determines whether the model does not have a value.
* @return {?}
*/
function () {
return this._selection.size === 0;
};
/**
* Determines whether the model has a value.
*/
/**
* Determines whether the model has a value.
* @return {?}
*/
SelectionModel.prototype.hasValue = /**
* Determines whether the model has a value.
* @return {?}
*/
function () {
return !this.isEmpty();
};
/**
* Sorts the selected values based on a predicate function.
*/
/**
* Sorts the selected values based on a predicate function.
* @param {?=} predicate
* @return {?}
*/
SelectionModel.prototype.sort = /**
* Sorts the selected values based on a predicate function.
* @param {?=} predicate
* @return {?}
*/
function (predicate) {
if (this._multiple && this.selected) {
(/** @type {?} */ (this._selected)).sort(predicate);
}
};
/**
* Gets whether multiple values can be selected.
*/
/**
* Gets whether multiple values can be selected.
* @return {?}
*/
SelectionModel.prototype.isMultipleSelection = /**
* Gets whether multiple values can be selected.
* @return {?}
*/
function () {
return this._multiple;
};
/** Emits a change event and clears the records of selected and deselected values. */
/**
* Emits a change event and clears the records of selected and deselected values.
* @private
* @return {?}
*/
SelectionModel.prototype._emitChangeEvent = /**
* Emits a change event and clears the records of selected and deselected values.
* @private
* @return {?}
*/
function () {
// Clear the selected values so they can be re-cached.
this._selected = null;
if (this._selectedToEmit.length || this._deselectedToEmit.length) {
this.changed.next({
source: this,
added: this._selectedToEmit,
removed: this._deselectedToEmit
});
this._deselectedToEmit = [];
this._selectedToEmit = [];
}
};
/** Selects a value. */
/**
* Selects a value.
* @private
* @param {?} value
* @return {?}
*/
SelectionModel.prototype._markSelected = /**
* Selects a value.
* @private
* @param {?} value
* @return {?}
*/
function (value) {
if (!this.isSelected(value)) {
if (!this._multiple) {
this._unmarkAll();
}
this._selection.add(value);
if (this._emitChanges) {
this._selectedToEmit.push(value);
}
}
};
/** Deselects a value. */
/**
* Deselects a value.
* @private
* @param {?} value
* @return {?}
*/
SelectionModel.prototype._unmarkSelected = /**
* Deselects a value.
* @private
* @param {?} value
* @return {?}
*/
function (value) {
if (this.isSelected(value)) {
this._selection.delete(value);
if (this._emitChanges) {
this._deselectedToEmit.push(value);
}
}
};
/** Clears out the selected values. */
/**
* Clears out the selected values.
* @private
* @return {?}
*/
SelectionModel.prototype._unmarkAll = /**
* Clears out the selected values.
* @private
* @return {?}
*/
function () {
var _this = this;
if (!this.isEmpty()) {
this._selection.forEach((/**
* @param {?} value
* @return {?}
*/
function (value) { return _this._unmarkSelected(value); }));
}
};
/**
* Verifies the value assignment and throws an error if the specified value array is
* including multiple values while the selection model is not supporting multiple values.
*/
/**
* Verifies the value assignment and throws an error if the specified value array is
* including multiple values while the selection model is not supporting multiple values.
* @private
* @param {?} values
* @return {?}
*/
SelectionModel.prototype._verifyValueAssignment = /**
* Verifies the value assignment and throws an error if the specified value array is
* including multiple values while the selection model is not supporting multiple values.
* @private
* @param {?} values
* @return {?}
*/
function (values) {
if (values.length > 1 && !this._multiple) {
throw getMultipleValuesInSingleSelectionError();
}
};
return SelectionModel;
}());
/**
* Returns an error that reports that multiple values are passed into a selection model
* with a single value.
* \@docs-private
* @return {?}
*/
function getMultipleValuesInSingleSelectionError() {
return Error('Cannot pass multiple values into SelectionModel with single-value mode.');
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* Class to coordinate unique selection based on name.
* Intended to be consumed as an Angular service.
* This service is needed because native radio change events are only fired on the item currently
* being selected, and we still need to uncheck the previous selection.
*
* This service does not *store* any IDs and names because they may change at any time, so it is
* less error-prone if they are simply passed through when the events occur.
*/
var UniqueSelectionDispatcher = /** @class */ (function () {
function UniqueSelectionDispatcher() {
this._listeners = [];
}
/**
* Notify other items that selection for the given name has been set.
* @param id ID of the item.
* @param name Name of the item.
*/
/**
* Notify other items that selection for the given name has been set.
* @param {?} id ID of the item.
* @param {?} name Name of the item.
* @return {?}
*/
UniqueSelectionDispatcher.prototype.notify = /**
* Notify other items that selection for the given name has been set.
* @param {?} id ID of the item.
* @param {?} name Name of the item.
* @return {?}
*/
function (id, name) {
for (var _i = 0, _a = this._listeners; _i < _a.length; _i++) {
var listener = _a[_i];
listener(id, name);
}
};
/**
* Listen for future changes to item selection.
* @return Function used to deregister listener
*/
/**
* Listen for future changes to item selection.
* @param {?} listener
* @return {?} Function used to deregister listener
*/
UniqueSelectionDispatcher.prototype.listen = /**
* Listen for future changes to item selection.
* @param {?} listener
* @return {?} Function used to deregister listener
*/
function (listener) {
var _this = this;
this._listeners.push(listener);
return (/**
* @return {?}
*/
function () {
_this._listeners = _this._listeners.filter((/**
* @param {?} registered
* @return {?}
*/
function (registered) {
return listener !== registered;
}));
});
};
/**
* @return {?}
*/
UniqueSelectionDispatcher.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this._listeners = [];
};
UniqueSelectionDispatcher.decorators = [
{ type: core.Injectable, args: [{ providedIn: 'root' },] },
];
/** @nocollapse */ UniqueSelectionDispatcher.ngInjectableDef = core.ɵɵdefineInjectable({ factory: function UniqueSelectionDispatcher_Factory() { return new UniqueSelectionDispatcher(); }, token: UniqueSelectionDispatcher, providedIn: "root" });
return UniqueSelectionDispatcher;
}());
exports.UniqueSelectionDispatcher = UniqueSelectionDispatcher;
exports.ArrayDataSource = ArrayDataSource;
exports.isDataSource = isDataSource;
exports.DataSource = DataSource;
exports.getMultipleValuesInSingleSelectionError = getMultipleValuesInSingleSelectionError;
exports.SelectionModel = SelectionModel;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=cdk-collections.umd.js.map