@clr/angular
Version:
Angular components for Clarity
85 lines • 11.3 kB
JavaScript
/*
* Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
* This software is released under MIT license.
* The full license information can be found in LICENSE in the root directory of this project.
*/
import { Injectable } from '@angular/core';
import { BehaviorSubject, ReplaySubject } from 'rxjs';
import { MultiSelectComboboxModel } from '../model/multi-select-combobox.model';
import * as i0 from "@angular/core";
export class OptionSelectionService {
constructor() {
this.loading = false;
// Display all options on first open, even if filter text exists.
// https://github.com/vmware-clarity/ng-clarity/issues/386
this.showAllOptions = true;
this._currentInput = '';
this._inputChanged = new BehaviorSubject('');
this._selectionChanged = new ReplaySubject(1);
this.inputChanged = this._inputChanged.asObservable();
}
get currentInput() {
return this._currentInput;
}
set currentInput(input) {
// clear value in single selection model when input is empty
if (input === '' && !this.multiselectable) {
this.setSelectionValue(null);
}
this._currentInput = input;
this._inputChanged.next(input);
}
// This observable is for notifying the ClrOption to update its
// selection by comparing the value
get selectionChanged() {
return this._selectionChanged.asObservable();
}
get multiselectable() {
return this.selectionModel instanceof MultiSelectComboboxModel;
}
select(item) {
if (item === null || item === undefined || this.selectionModel.containsItem(item)) {
return;
}
this.selectionModel.select(item);
this._selectionChanged.next(this.selectionModel);
}
toggle(item) {
if (item === null || item === undefined) {
return;
}
if (this.selectionModel.containsItem(item)) {
this.selectionModel.unselect(item);
}
else {
this.selectionModel.select(item);
}
this._selectionChanged.next(this.selectionModel);
}
unselect(item) {
if (item === null || item === undefined || !this.selectionModel.containsItem(item)) {
return;
}
this.selectionModel.unselect(item);
this._selectionChanged.next(this.selectionModel);
}
// TODO: Add support for trackBy and compareFn
setSelectionValue(value) {
// NOTE: Currently we assume that no 2 options will have the same value
// but Eudes and I discussed that this is a possibility but we will handle
// this later
// if selection is undefined, or its value hasn't changed, or changing from null <-> undefined, that's not really changing so we return
if (!this.selectionModel || this.selectionModel.model === value || (!this.selectionModel.model && !value)) {
return;
}
this.selectionModel.model = value;
this._selectionChanged.next(this.selectionModel);
}
}
OptionSelectionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: OptionSelectionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
OptionSelectionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: OptionSelectionService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: OptionSelectionService, decorators: [{
type: Injectable
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9uLXNlbGVjdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci9zcmMvZm9ybXMvY29tYm9ib3gvcHJvdmlkZXJzL29wdGlvbi1zZWxlY3Rpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBYyxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHbEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7O0FBR2hGLE1BQU0sT0FBTyxzQkFBc0I7SUFjakM7UUFiQSxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBS2hCLGlFQUFpRTtRQUNqRSwwREFBMEQ7UUFDMUQsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFFZCxrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUNuQixrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLHNCQUFpQixHQUFHLElBQUksYUFBYSxDQUFtQixDQUFDLENBQUMsQ0FBQztRQUdqRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBQ0QsSUFBSSxZQUFZLENBQUMsS0FBSztRQUNwQiw0REFBNEQ7UUFDNUQsSUFBSSxLQUFLLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDOUI7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsK0RBQStEO0lBQy9ELG1DQUFtQztJQUNuQyxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGNBQWMsWUFBWSx3QkFBd0IsQ0FBQztJQUNqRSxDQUFDO0lBRUQsTUFBTSxDQUFDLElBQU87UUFDWixJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNqRixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsTUFBTSxDQUFDLElBQU87UUFDWixJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUN2QyxPQUFPO1NBQ1I7UUFDRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BDO2FBQU07WUFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNsQztRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxRQUFRLENBQUMsSUFBTztRQUNkLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDbEYsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELDhDQUE4QztJQUM5QyxpQkFBaUIsQ0FBQyxLQUFjO1FBQzlCLHVFQUF1RTtRQUN2RSwwRUFBMEU7UUFDMUUsYUFBYTtRQUViLHVJQUF1STtRQUN2SSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDekcsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7O21IQWpGVSxzQkFBc0I7dUhBQXRCLHNCQUFzQjsyRkFBdEIsc0JBQXNCO2tCQURsQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDI1IEJyb2FkY29tLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhlIHRlcm0gXCJCcm9hZGNvbVwiIHJlZmVycyB0byBCcm9hZGNvbSBJbmMuIGFuZC9vciBpdHMgc3Vic2lkaWFyaWVzLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQ29tYm9ib3hNb2RlbCB9IGZyb20gJy4uL21vZGVsL2NvbWJvYm94Lm1vZGVsJztcbmltcG9ydCB7IE11bHRpU2VsZWN0Q29tYm9ib3hNb2RlbCB9IGZyb20gJy4uL21vZGVsL211bHRpLXNlbGVjdC1jb21ib2JveC5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPcHRpb25TZWxlY3Rpb25TZXJ2aWNlPFQ+IHtcbiAgbG9hZGluZyA9IGZhbHNlO1xuICBkaXNwbGF5RmllbGQ6IHN0cmluZztcbiAgc2VsZWN0aW9uTW9kZWw6IENvbWJvYm94TW9kZWw8VD47XG4gIGlucHV0Q2hhbmdlZDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gIC8vIERpc3BsYXkgYWxsIG9wdGlvbnMgb24gZmlyc3Qgb3BlbiwgZXZlbiBpZiBmaWx0ZXIgdGV4dCBleGlzdHMuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92bXdhcmUtY2xhcml0eS9uZy1jbGFyaXR5L2lzc3Vlcy8zODZcbiAgc2hvd0FsbE9wdGlvbnMgPSB0cnVlO1xuXG4gIHByaXZhdGUgX2N1cnJlbnRJbnB1dCA9ICcnO1xuICBwcml2YXRlIF9pbnB1dENoYW5nZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KCcnKTtcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uQ2hhbmdlZCA9IG5ldyBSZXBsYXlTdWJqZWN0PENvbWJvYm94TW9kZWw8VD4+KDEpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaW5wdXRDaGFuZ2VkID0gdGhpcy5faW5wdXRDaGFuZ2VkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRJbnB1dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50SW5wdXQ7XG4gIH1cbiAgc2V0IGN1cnJlbnRJbnB1dChpbnB1dCkge1xuICAgIC8vIGNsZWFyIHZhbHVlIGluIHNpbmdsZSBzZWxlY3Rpb24gbW9kZWwgd2hlbiBpbnB1dCBpcyBlbXB0eVxuICAgIGlmIChpbnB1dCA9PT0gJycgJiYgIXRoaXMubXVsdGlzZWxlY3RhYmxlKSB7XG4gICAgICB0aGlzLnNldFNlbGVjdGlvblZhbHVlKG51bGwpO1xuICAgIH1cbiAgICB0aGlzLl9jdXJyZW50SW5wdXQgPSBpbnB1dDtcbiAgICB0aGlzLl9pbnB1dENoYW5nZWQubmV4dChpbnB1dCk7XG4gIH1cblxuICAvLyBUaGlzIG9ic2VydmFibGUgaXMgZm9yIG5vdGlmeWluZyB0aGUgQ2xyT3B0aW9uIHRvIHVwZGF0ZSBpdHNcbiAgLy8gc2VsZWN0aW9uIGJ5IGNvbXBhcmluZyB0aGUgdmFsdWVcbiAgZ2V0IHNlbGVjdGlvbkNoYW5nZWQoKTogT2JzZXJ2YWJsZTxDb21ib2JveE1vZGVsPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbkNoYW5nZWQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXQgbXVsdGlzZWxlY3RhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk1vZGVsIGluc3RhbmNlb2YgTXVsdGlTZWxlY3RDb21ib2JveE1vZGVsO1xuICB9XG5cbiAgc2VsZWN0KGl0ZW06IFQpIHtcbiAgICBpZiAoaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB1bmRlZmluZWQgfHwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5jb250YWluc0l0ZW0oaXRlbSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3QoaXRlbSk7XG4gICAgdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZC5uZXh0KHRoaXMuc2VsZWN0aW9uTW9kZWwpO1xuICB9XG5cbiAgdG9nZ2xlKGl0ZW06IFQpIHtcbiAgICBpZiAoaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZWwuY29udGFpbnNJdGVtKGl0ZW0pKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLnVuc2VsZWN0KGl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdChpdGVtKTtcbiAgICB9XG4gICAgdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZC5uZXh0KHRoaXMuc2VsZWN0aW9uTW9kZWwpO1xuICB9XG5cbiAgdW5zZWxlY3QoaXRlbTogVCkge1xuICAgIGlmIChpdGVtID09PSBudWxsIHx8IGl0ZW0gPT09IHVuZGVmaW5lZCB8fCAhdGhpcy5zZWxlY3Rpb25Nb2RlbC5jb250YWluc0l0ZW0oaXRlbSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC51bnNlbGVjdChpdGVtKTtcbiAgICB0aGlzLl9zZWxlY3Rpb25DaGFuZ2VkLm5leHQodGhpcy5zZWxlY3Rpb25Nb2RlbCk7XG4gIH1cblxuICAvLyBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgdHJhY2tCeSBhbmQgY29tcGFyZUZuXG4gIHNldFNlbGVjdGlvblZhbHVlKHZhbHVlOiBUIHwgVFtdKTogdm9pZCB7XG4gICAgLy8gTk9URTogQ3VycmVudGx5IHdlIGFzc3VtZSB0aGF0IG5vIDIgb3B0aW9ucyB3aWxsIGhhdmUgdGhlIHNhbWUgdmFsdWVcbiAgICAvLyBidXQgRXVkZXMgYW5kIEkgZGlzY3Vzc2VkIHRoYXQgdGhpcyBpcyBhIHBvc3NpYmlsaXR5IGJ1dCB3ZSB3aWxsIGhhbmRsZVxuICAgIC8vIHRoaXMgbGF0ZXJcblxuICAgIC8vIGlmIHNlbGVjdGlvbiBpcyB1bmRlZmluZWQsIG9yIGl0cyB2YWx1ZSBoYXNuJ3QgY2hhbmdlZCwgb3IgY2hhbmdpbmcgZnJvbSBudWxsIDwtPiB1bmRlZmluZWQsIHRoYXQncyBub3QgcmVhbGx5IGNoYW5naW5nIHNvIHdlIHJldHVyblxuICAgIGlmICghdGhpcy5zZWxlY3Rpb25Nb2RlbCB8fCB0aGlzLnNlbGVjdGlvbk1vZGVsLm1vZGVsID09PSB2YWx1ZSB8fCAoIXRoaXMuc2VsZWN0aW9uTW9kZWwubW9kZWwgJiYgIXZhbHVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwubW9kZWwgPSB2YWx1ZTtcbiAgICB0aGlzLl9zZWxlY3Rpb25DaGFuZ2VkLm5leHQodGhpcy5zZWxlY3Rpb25Nb2RlbCk7XG4gIH1cbn1cbiJdfQ==