UNPKG

@clr/angular

Version:

Angular components for Clarity

84 lines 11.1 kB
/* * Copyright (c) 2016-2023 VMware, Inc. All Rights Reserved. * 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9uLXNlbGVjdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci9zcmMvZm9ybXMvY29tYm9ib3gvcHJvdmlkZXJzL29wdGlvbi1zZWxlY3Rpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFjLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdsRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQzs7QUFHaEYsTUFBTSxPQUFPLHNCQUFzQjtJQWNqQztRQWJBLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFLaEIsaUVBQWlFO1FBQ2pFLDBEQUEwRDtRQUMxRCxtQkFBYyxHQUFHLElBQUksQ0FBQztRQUVkLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ25CLGtCQUFhLEdBQUcsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEMsc0JBQWlCLEdBQUcsSUFBSSxhQUFhLENBQW1CLENBQUMsQ0FBQyxDQUFDO1FBR2pFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFDRCxJQUFJLFlBQVksQ0FBQyxLQUFLO1FBQ3BCLDREQUE0RDtRQUM1RCxJQUFJLEtBQUssS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QjtRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCwrREFBK0Q7SUFDL0QsbUNBQW1DO0lBQ25DLElBQUksZ0JBQWdCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsY0FBYyxZQUFZLHdCQUF3QixDQUFDO0lBQ2pFLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBTztRQUNaLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2pGLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxNQUFNLENBQUMsSUFBTztRQUNaLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3ZDLE9BQU87U0FDUjtRQUNELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEM7YUFBTTtZQUNMLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFPO1FBQ2QsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNsRixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsOENBQThDO0lBQzlDLGlCQUFpQixDQUFDLEtBQWM7UUFDOUIsdUVBQXVFO1FBQ3ZFLDBFQUEwRTtRQUMxRSxhQUFhO1FBRWIsdUlBQXVJO1FBQ3ZJLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN6RyxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbkQsQ0FBQzs7bUhBakZVLHNCQUFzQjt1SEFBdEIsc0JBQXNCOzJGQUF0QixzQkFBc0I7a0JBRGxDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMjMgVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBDb21ib2JveE1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvY29tYm9ib3gubW9kZWwnO1xuaW1wb3J0IHsgTXVsdGlTZWxlY3RDb21ib2JveE1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvbXVsdGktc2VsZWN0LWNvbWJvYm94Lm1vZGVsJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9wdGlvblNlbGVjdGlvblNlcnZpY2U8VD4ge1xuICBsb2FkaW5nID0gZmFsc2U7XG4gIGRpc3BsYXlGaWVsZDogc3RyaW5nO1xuICBzZWxlY3Rpb25Nb2RlbDogQ29tYm9ib3hNb2RlbDxUPjtcbiAgaW5wdXRDaGFuZ2VkOiBPYnNlcnZhYmxlPHN0cmluZz47XG5cbiAgLy8gRGlzcGxheSBhbGwgb3B0aW9ucyBvbiBmaXJzdCBvcGVuLCBldmVuIGlmIGZpbHRlciB0ZXh0IGV4aXN0cy5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Ztd2FyZS1jbGFyaXR5L25nLWNsYXJpdHkvaXNzdWVzLzM4NlxuICBzaG93QWxsT3B0aW9ucyA9IHRydWU7XG5cbiAgcHJpdmF0ZSBfY3VycmVudElucHV0ID0gJyc7XG4gIHByaXZhdGUgX2lucHV0Q2hhbmdlZCA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xuICBwcml2YXRlIF9zZWxlY3Rpb25DaGFuZ2VkID0gbmV3IFJlcGxheVN1YmplY3Q8Q29tYm9ib3hNb2RlbDxUPj4oMSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5pbnB1dENoYW5nZWQgPSB0aGlzLl9pbnB1dENoYW5nZWQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXQgY3VycmVudElucHV0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRJbnB1dDtcbiAgfVxuICBzZXQgY3VycmVudElucHV0KGlucHV0KSB7XG4gICAgLy8gY2xlYXIgdmFsdWUgaW4gc2luZ2xlIHNlbGVjdGlvbiBtb2RlbCB3aGVuIGlucHV0IGlzIGVtcHR5XG4gICAgaWYgKGlucHV0ID09PSAnJyAmJiAhdGhpcy5tdWx0aXNlbGVjdGFibGUpIHtcbiAgICAgIHRoaXMuc2V0U2VsZWN0aW9uVmFsdWUobnVsbCk7XG4gICAgfVxuICAgIHRoaXMuX2N1cnJlbnRJbnB1dCA9IGlucHV0O1xuICAgIHRoaXMuX2lucHV0Q2hhbmdlZC5uZXh0KGlucHV0KTtcbiAgfVxuXG4gIC8vIFRoaXMgb2JzZXJ2YWJsZSBpcyBmb3Igbm90aWZ5aW5nIHRoZSBDbHJPcHRpb24gdG8gdXBkYXRlIGl0c1xuICAvLyBzZWxlY3Rpb24gYnkgY29tcGFyaW5nIHRoZSB2YWx1ZVxuICBnZXQgc2VsZWN0aW9uQ2hhbmdlZCgpOiBPYnNlcnZhYmxlPENvbWJvYm94TW9kZWw8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldCBtdWx0aXNlbGVjdGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uTW9kZWwgaW5zdGFuY2VvZiBNdWx0aVNlbGVjdENvbWJvYm94TW9kZWw7XG4gIH1cblxuICBzZWxlY3QoaXRlbTogVCkge1xuICAgIGlmIChpdGVtID09PSBudWxsIHx8IGl0ZW0gPT09IHVuZGVmaW5lZCB8fCB0aGlzLnNlbGVjdGlvbk1vZGVsLmNvbnRhaW5zSXRlbShpdGVtKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdChpdGVtKTtcbiAgICB0aGlzLl9zZWxlY3Rpb25DaGFuZ2VkLm5leHQodGhpcy5zZWxlY3Rpb25Nb2RlbCk7XG4gIH1cblxuICB0b2dnbGUoaXRlbTogVCkge1xuICAgIGlmIChpdGVtID09PSBudWxsIHx8IGl0ZW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlbC5jb250YWluc0l0ZW0oaXRlbSkpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwudW5zZWxlY3QoaXRlbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0KGl0ZW0pO1xuICAgIH1cbiAgICB0aGlzLl9zZWxlY3Rpb25DaGFuZ2VkLm5leHQodGhpcy5zZWxlY3Rpb25Nb2RlbCk7XG4gIH1cblxuICB1bnNlbGVjdChpdGVtOiBUKSB7XG4gICAgaWYgKGl0ZW0gPT09IG51bGwgfHwgaXRlbSA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLnNlbGVjdGlvbk1vZGVsLmNvbnRhaW5zSXRlbShpdGVtKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLnVuc2VsZWN0KGl0ZW0pO1xuICAgIHRoaXMuX3NlbGVjdGlvbkNoYW5nZWQubmV4dCh0aGlzLnNlbGVjdGlvbk1vZGVsKTtcbiAgfVxuXG4gIC8vIFRPRE86IEFkZCBzdXBwb3J0IGZvciB0cmFja0J5IGFuZCBjb21wYXJlRm5cbiAgc2V0U2VsZWN0aW9uVmFsdWUodmFsdWU6IFQgfCBUW10pOiB2b2lkIHtcbiAgICAvLyBOT1RFOiBDdXJyZW50bHkgd2UgYXNzdW1lIHRoYXQgbm8gMiBvcHRpb25zIHdpbGwgaGF2ZSB0aGUgc2FtZSB2YWx1ZVxuICAgIC8vIGJ1dCBFdWRlcyBhbmQgSSBkaXNjdXNzZWQgdGhhdCB0aGlzIGlzIGEgcG9zc2liaWxpdHkgYnV0IHdlIHdpbGwgaGFuZGxlXG4gICAgLy8gdGhpcyBsYXRlclxuXG4gICAgLy8gaWYgc2VsZWN0aW9uIGlzIHVuZGVmaW5lZCwgb3IgaXRzIHZhbHVlIGhhc24ndCBjaGFuZ2VkLCBvciBjaGFuZ2luZyBmcm9tIG51bGwgPC0+IHVuZGVmaW5lZCwgdGhhdCdzIG5vdCByZWFsbHkgY2hhbmdpbmcgc28gd2UgcmV0dXJuXG4gICAgaWYgKCF0aGlzLnNlbGVjdGlvbk1vZGVsIHx8IHRoaXMuc2VsZWN0aW9uTW9kZWwubW9kZWwgPT09IHZhbHVlIHx8ICghdGhpcy5zZWxlY3Rpb25Nb2RlbC5tb2RlbCAmJiAhdmFsdWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5tb2RlbCA9IHZhbHVlO1xuICAgIHRoaXMuX3NlbGVjdGlvbkNoYW5nZWQubmV4dCh0aGlzLnNlbGVjdGlvbk1vZGVsKTtcbiAgfVxufVxuIl19