UNPKG

@hxui/angular

Version:

An Angular library based on the [HXUI design system](https://hxui.io).

189 lines 58.5 kB
import { DatePipe } from '@angular/common'; import { Component, ElementRef, Input, QueryList, ViewChild, ViewChildren, } from '@angular/core'; import * as _ from 'lodash'; import { Subject, Subscription } from 'rxjs'; import { debounceTime } from 'rxjs/operators'; import { FilterType } from './filters-type.enum'; import { FiltersConfig } from './filters.config'; import { FiltersModel } from './filters.model'; import * as i0 from "@angular/core"; import * as i1 from "./filters.config"; import * as i2 from "@angular/common"; import * as i3 from "./filters-collapsed.component"; import * as i4 from "../date-range-picker/date-range-picker.component"; import * as i5 from "../dropdown/dropdown.directive"; import * as i6 from "../dropdown/dropdown-toggle.directive"; import * as i7 from "../dropdown/dropdown-menu.directive"; import * as i8 from "../dropdown/dropdown-item.directive"; import * as i9 from "@angular/forms"; import * as i10 from "ngx-mask"; export class FiltersComponent { constructor(conf, datePipe) { this.conf = conf; this.datePipe = datePipe; this.FilterType = FilterType; this.data = []; this.onFilterOptionChanged$ = new Subject(); this.searchFilter$ = new Subject(); this.subscriptions = new Subscription(); this._filters = []; this._oldFilters = []; this._collapsed = false; Object.assign(this, conf); } get collapsed() { return this._collapsed; } set collapsed(value) { this._collapsed = value; } get filters() { return this._filters; } set filters(value) { this._filters = value; this.setData(); } ngOnInit() { this.subscriptions.add(this.searchFilter$ .pipe(debounceTime(this.conf.debounce)) .subscribe(x => this.onFilterOptionChanged$.next(x))); } ngOnDestroy() { this.subscriptions.unsubscribe(); } ngDoCheck() { if (!_.isEqual(this._filters, this._oldFilters)) { this._oldFilters = _.cloneDeep(this._filters); this.setData(); } } getIntervalOptions(options) { const intervalOption = []; if (options) { for (let i = 0; i < options.length; i++) { intervalOption.push(options[i].label); } } return intervalOption; } resetFilters(silent = false) { for (const filter of this.data) { if (filter.type === FilterType.SingleSelect || filter.type === FilterType.MultiSelect) { filter.setDefaultOption(); if (!silent) { this.onFilterOptionChanged$.next(filter); } } else if (filter.type === FilterType.Search) { this.clearSearch(filter, silent); } else if (filter.type === FilterType.DateRange) { this.setDefaultDate(filter); } } } clearSearch(filter, silent = false) { filter.value = ''; if (!silent) { this.onFilterOptionChanged$.next(filter); } } setDefaultDate(filter) { filter.value = ''; filter.sourceValue = undefined; if (!this._collapsed) { for (let i = 0; i < this.dateRangePickers.toArray().length; i++) { this.dateRangePickers.toArray()[i].resetDateRange(); } } this.onFilterOptionChanged$.next(filter); } /** * Called when filter option is selected */ onFilterOptionSelected(filter, option) { option.selected = !option.selected; if (filter.type === FilterType.MultiSelect) { filter.setMultiSelectOptions(option); } else if (filter.type !== FilterType.Search) { filter.setSingleSelectOption(option); } this.onFilterOptionChanged$.next(filter); } /** * Called when character is typed in the search filter type */ onSearchFilterChange(filter) { if (filter.value.length === 0 || filter.value.length >= filter.charLimit) { this.searchFilter$.next(filter); } } /** * Called when selection is made in the date range filter type */ onDateRangeFilterChange(filter, dateRange) { const dateRangeValue = this.datePipe.transform(dateRange.fromDate, filter.dateRangePickerDisplayDateFormat) + ' - ' + this.datePipe.transform(dateRange.toDate, filter.dateRangePickerDisplayDateFormat); filter.value = dateRangeValue; filter.sourceValue = dateRange; this.searchFilter$.next(filter); } onCollapsedFilter($event) { this.onFilterOptionSelected($event.filter, $event.option); } onCollapsedSearch($event) { this.onSearchFilterChange($event.filter); } onCollapsedDateRangePicker($event) { this.onDateRangeFilterChange($event.filter, $event.dateRange); } onCollapsedFilterBack($event) { this.onMultiSelectHidden($event.filter); } onMultiSelectHidden(filter) { if (filter.selected.length === 0) { filter.setSelectAll(); this.onFilterOptionChanged$.next(filter); } } /** * Used for track by and boost performance */ trackByFn(index, action) { return index; } /** * Convert filter config objects to Filter Models */ setData() { this.data = []; if (this._filters) { this._filters.forEach((filter, index) => { this.data.push(new FiltersModel(_.cloneDeep(filter))); }); } } } FiltersComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: FiltersComponent, deps: [{ token: i1.FiltersConfig }, { token: i2.DatePipe }], target: i0.ɵɵFactoryTarget.Component }); FiltersComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: FiltersComponent, selector: "hxa-filters", inputs: { customMask: "customMask", collapsed: "collapsed", filters: "filters" }, viewQueries: [{ propertyName: "carousel", first: true, predicate: ["carousel"], descendants: true, static: true }, { propertyName: "dateRangePickers", predicate: ["dateRangePicker"], descendants: true }], ngImport: i0, template: "<div class=\"hx-flex hx-flex-align-center\">\r\n <i class=\"hx-icon icon-filter-outline mx-1\"></i>\r\n\r\n <!-- COLLAPSED STATE -->\r\n <hxa-filters-collapsed\r\n (onFilter)=\"onCollapsedFilter($event)\"\r\n (onBack)=\"onCollapsedFilterBack($event)\"\r\n (onSearchFilter)=\"onCollapsedSearch($event)\"\r\n (onDateRangePickerFilter)=\"onCollapsedDateRangePicker($event)\"\r\n [data]=\"data\"\r\n *ngIf=\"collapsed\"\r\n ></hxa-filters-collapsed>\r\n\r\n <!-- EXPANDED STATE -->\r\n <ng-container *ngIf=\"!collapsed\">\r\n <ng-container\r\n *ngFor=\"let filter of data; trackBy: trackByFn; let lastItem = last\"\r\n >\r\n <!-- SINGLE-SELECT -->\r\n <div\r\n [id]=\"filter?.id\"\r\n class=\"hx-dropdown mx-1 expandedFilter\"\r\n hxaDropdown\r\n [minWidthRelativeTo]=\"filter?.id + '-trigger'\"\r\n *ngIf=\"filter?.type === FilterType.SingleSelect && !filter?.hidden\"\r\n >\r\n <button\r\n [id]=\"filter?.id + '-trigger'\"\r\n class=\"hx-button hx-button-dropdown expandedFilter__button\"\r\n [class.is-loading]=\"filter?.isLoading\"\r\n [class.is-disabled]=\"filter?.disabled\"\r\n hxaDropdownToggle\r\n >\r\n <span class=\"is-text-weight-light\">{{ filter?.label }}:&nbsp;</span>\r\n <span class=\"hx-icon-control\" *ngIf=\"(filter?.selected)[0]?.icon\"\r\n ><i class=\"{{ (filter?.selected)[0]?.icon }} mr-1\"></i\r\n ></span>\r\n <span\r\n class=\"is-text-weight-bolder is-text-ellipsed\"\r\n title=\"{{ filter?.getSelectedLabel() }}\"\r\n >{{ filter?.getSelectedLabel() }}</span\r\n >\r\n <span class=\"hx-icon-control\">\r\n <i class=\"hx-icon icon-caret-down\"></i>\r\n </span>\r\n </button>\r\n\r\n <div\r\n [id]=\"filter?.id + '-options'\"\r\n class=\"hx-dropdown-menu has-limited-width has-limited-height expandedFilter__menu\"\r\n [class.hx-dropdown-icon]=\"filter.isIconised()\"\r\n *hxaDropdownMenu\r\n >\r\n <button\r\n hxaDropdownItem\r\n *ngFor=\"let option of filter?.options; trackBy: trackByFn\"\r\n (click)=\"onFilterOptionSelected(filter, option)\"\r\n class=\"is-text-ellipsed filter__item\"\r\n [class.selected]=\"option.selected\"\r\n title=\"{{ option?.label }}\"\r\n >\r\n <span\r\n class=\"hx-icon-control filter__itemIcon\"\r\n *ngIf=\"option?.icon\"\r\n aria-hidden=\"true\"\r\n >\r\n <i class=\"{{ option?.icon }}\"></i>\r\n </span>\r\n <span class=\"filter__itemLabel\"> {{ option?.label }} </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- MULTI-SELECT -->\r\n <div\r\n [id]=\"filter?.id\"\r\n class=\"hx-dropdown mx-1 expandedFilter\"\r\n hxaDropdown\r\n [minWidthRelativeTo]=\"filter?.id + '-trigger'\"\r\n *ngIf=\"filter?.type === FilterType.MultiSelect && !filter?.hidden\"\r\n (onHidden)=\"onMultiSelectHidden(filter)\"\r\n >\r\n <button\r\n [id]=\"filter?.id + '-trigger'\"\r\n class=\"hx-button hx-button-dropdown expandedFilter__button\"\r\n [class.is-loading]=\"filter?.isLoading\"\r\n [class.is-disabled]=\"filter?.disabled\"\r\n hxaDropdownToggle\r\n >\r\n <span class=\"is-text-weight-light\">{{ filter?.label }}:&nbsp;</span>\r\n <span\r\n class=\"is-text-weight-bolder is-text-ellipsed\"\r\n title=\"{{ filter?.getSelectedLabel() }}\"\r\n >\r\n {{ filter?.getSelectedLabel() }}\r\n </span>\r\n <span class=\"hx-icon-control\">\r\n <i class=\"hx-icon icon-caret-down\"></i>\r\n </span>\r\n </button>\r\n\r\n <div\r\n [id]=\"filter?.id + '-options'\"\r\n class=\"hx-dropdown-menu has-limited-width has-limited-height expandedFilter__menu\"\r\n *hxaDropdownMenu\r\n >\r\n <label\r\n *ngFor=\"\r\n let option of filter?.options;\r\n trackBy: trackByFn;\r\n let i = index\r\n \"\r\n class=\"is-text-ellipsed filter__item--multi\"\r\n title=\"{{ option?.label }}\"\r\n [class.is-perforated]=\"i === 0\"\r\n [class.selected]=\"option.selected && i > 0\"\r\n [class.is-select-all]=\"i === 0\"\r\n [for]=\"filter?.id + '-checkbox-' + i\"\r\n >\r\n <input\r\n [name]=\"filter?.id + '-checkbox-' + i\"\r\n type=\"checkbox\"\r\n [id]=\"filter?.id + '-checkbox-' + i\"\r\n (change)=\"onFilterOptionSelected(filter, option)\"\r\n [class.indeterminate]=\"\r\n option?.value === filter?.selectAllValue &&\r\n filter?.selectAllState.indeterminate\r\n \"\r\n [checked]=\"option.selected\"\r\n />\r\n <span\r\n class=\"hx-icon-control filter__itemIcon\"\r\n *ngIf=\"option?.icon\"\r\n aria-hidden=\"true\"\r\n >\r\n <i class=\"{{ option?.icon }}\"></i>\r\n </span>\r\n <span\r\n class=\"filter__itemLabel\"\r\n [class.is-text-weight-boldest]=\"i === 0\"\r\n >\r\n {{ option?.label }}\r\n </span>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <!-- SEARCH -->\r\n <div\r\n [id]=\"filter.id\"\r\n *ngIf=\"filter.type === FilterType.Search && !filter?.hidden\"\r\n class=\"hx-input-group ml-2 expandedFilter__search\"\r\n [class.mx-1]=\"!lastItem\"\r\n >\r\n <i class=\"hx-icon icon-search\"></i>\r\n <div class=\"hx-input-control\">\r\n <input\r\n class=\"hx-input\"\r\n type=\"search\"\r\n placeholder=\"{{ filter.label }}\"\r\n (input)=\"onSearchFilterChange(filter)\"\r\n [(ngModel)]=\"filter.value\"\r\n [style.width.rem]=\"filter.width\"\r\n [disabled]=\"filter?.disabled\"\r\n mask=\"{{ customMask }}\"\r\n />\r\n <label class=\"hx-label\"></label>\r\n <div class=\"hx-help\"></div>\r\n </div>\r\n <div class=\"hx-input-actions\" *ngIf=\"filter.value\">\r\n <div class=\"hx-button-group\">\r\n <button class=\"hx-button is-flat\" (click)=\"clearSearch(filter)\">\r\n <span class=\"hx-icon-control\">\r\n <i class=\"icon icon-close-empty\"></i>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- DATE-RANGE -->\r\n <div\r\n [id]=\"filter?.id\"\r\n class=\"hx-dropdown mx-1 expandedFilter\"\r\n hxaDropdown\r\n [minWidthRelativeTo]=\"filter?.id + '-trigger'\"\r\n *ngIf=\"filter?.type === FilterType.DateRange\"\r\n >\r\n <hxa-date-range-picker\r\n [dateFormat]=\"filter.dateRangePickerDisplayDateFormat\"\r\n [displayMode]=\"filter.dateRangePickerDisplayMode\"\r\n [intervalOptions]=\"getIntervalOptions(filter.options)\"\r\n (onDateRangeSelected)=\"onDateRangeFilterChange(filter, $event)\"\r\n [defaultDateRange]=\"filter.sourceValue\"\r\n [id]=\"filter?.id + '-dateRangePicker'\"\r\n #dateRangePicker\r\n ></hxa-date-range-picker>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n", styles: [":host .expandedFilter__button{max-width:15rem;min-width:7.2rem}.expandedFilter__menu{padding:4px 0}.expandedFilter__search .hx-icon{margin-top:-.125rem}.expandedFilter__search .hx-input-control{margin:0}.expandedFilter__search .hx-input{height:2.25em}.expandedFilter__search .hx-help{margin:0}.expandedFilter__search .hx-help:before,.expandedFilter__search .hx-help:after{top:-.15rem}.expandedFilter__search .hx-input-actions{top:0}.filter__item,.filter__item--multi{display:flex;align-items:center;padding:.2666666667rem 8px;margin:0;min-height:2.1333333333rem;gap:8px;border-radius:0;width:100%;font-weight:400;font-family:Roboto;font-size:.9333333333rem;line-height:1.3333333333rem;letter-spacing:0em;text-decoration:none;text-transform:none}.filter__item:focus,.filter__item--multi:focus,.filter__item:focus-visible,.filter__item--multi:focus-visible{outline:none}.filter__item:has(:focus-visible),.filter__item--multi:has(:focus-visible){outline-offset:2px;outline:#262626 solid 2px}.filter__item:hover,.filter__item--multi:hover{background-color:#0000000d;cursor:pointer}.filter__item.selected,.selected.filter__item--multi{background-color:#e1f5ed;color:#02694e}.filter__item:is([disabled],.is-disabled),.filter__item--multi:is([disabled],.is-disabled){border-color:#b3b3b3;background-color:#b3b3b3;cursor:not-allowed;transition:none}.filter__item:not([disabled],.is-disabled),.filter__item--multi:not([disabled],.is-disabled){cursor:pointer}.filter__item:where(button),.filter__item--multi:where(button),.filter__item :where(button),.filter__item--multi :where(button){background-color:transparent;border:0}.filter__item--multi.is-select-all{padding:.8rem 8px;min-height:3.2rem}.filter__item--multi input[type=checkbox]{-webkit-appearance:none;appearance:none;margin:0;width:1.3333333333rem;height:1.3333333333rem;border:2px solid #b3b3b3;background-color:#fff;display:inline-grid;place-content:center;border-radius:2px;transition-property:background-color,border-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.filter__item--multi input[type=checkbox]:before{content:\"\";width:1.0666666667rem;height:1.0666666667rem;transform:scale(0);transition-property:transform,clip-path;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.1s;box-shadow:inset 1rem 1rem #fff;clip-path:polygon(10.46% 53.05%,0% 65%,34.93% 95.56%,100% 15%,88.13% 5.41%,33.42% 73.14%);transform-origin:center}.filter__item--multi input[type=checkbox]:checked{background-color:#41b987;border-color:#41b987}.filter__item--multi input[type=checkbox]:checked:before{transform:scale(1)}.filter__item--multi input[type=checkbox]:indeterminate,.filter__item--multi input[type=checkbox].indeterminate{background-color:#41b987;border-color:#41b987}.filter__item--multi input[type=checkbox]:indeterminate:before,.filter__item--multi input[type=checkbox].indeterminate:before{content:\"\";clip-path:polygon(0% 43.75%,100% 43.75%,100% 56.25%,0% 56.25%);transform:scale(1)}.filter__item--multi input[type=checkbox]:is([disabled],.is-disabled):checked:before{transition:none}.filter__itemIcon{position:relative;display:inline-flex;justify-content:center;align-items:center}.filter__itemIcon .hx-icon{font-size:20px;line-height:24px;position:relative;top:unset;left:unset}.filter__itemLabel{font-weight:400;font-family:Roboto;font-size:1.0666666667rem;line-height:1.6rem;letter-spacing:0em;text-decoration:none;text-transform:none;color:inherit;flex:1;text-align:left}:where(.is-elipsed,.is-text-elipsed,.is-text-ellipsed,.is-text-ellipsis) .filter__itemLabel{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.filter__itemLabel :where(span){color:inherit;font:inherit}\n"], components: [{ type: i3.FiltersCollapsedComponent, selector: "hxa-filters-collapsed", inputs: ["data"], outputs: ["onFilter", "onSearchFilter", "onDateRangePickerFilter", "onBack"] }, { type: i4.DateRangePickerComponent, selector: "hxa-date-range-picker", inputs: ["intervalOptions", "placeholder", "disabled", "autoClose", "placement", "displayMode", "dateFormat", "defaultDateRange", "showCaretDown"], outputs: ["onDateRangeSelected"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.DropdownDirective, selector: "[hxaDropdown],[hxDropdown]", inputs: ["placement", "autoClose", "isDisabled", "showDelay", "hideDelay", "maxWidthRelativeTo", "minWidthRelativeTo", "offsetY", "offsetX", "createClipPathMask"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["hx-dropdown", "hxa-dropdown"] }, { type: i6.DropdownToggleDirective, selector: "[hxDropdownToggle],[hxaDropdownToggle]", exportAs: ["hx-dropdown-toggle"] }, { type: i7.DropdownMenuDirective, selector: "[hxDropdownMenu],[hxaDropdownMenu]", exportAs: ["hx-dropdown-menu"] }, { type: i8.DropdownItemDirective, selector: "[hxDropdownItem],[hxaDropdownItem]" }, { type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i10.MaskDirective, selector: "input[mask], textarea[mask]", inputs: ["mask", "specialCharacters", "patterns", "prefix", "suffix", "thousandSeparator", "decimalMarker", "dropSpecialCharacters", "hiddenInput", "showMaskTyped", "placeHolderCharacter", "shownMaskExpression", "showTemplate", "clearIfNotMatch", "validation", "separatorLimit", "allowNegativeNumbers", "leadZeroDateTime", "triggerOnMaskChange"], outputs: ["maskFilled"], exportAs: ["mask", "ngxMask"] }, { type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: FiltersComponent, decorators: [{ type: Component, args: [{ selector: 'hxa-filters', template: "<div class=\"hx-flex hx-flex-align-center\">\r\n <i class=\"hx-icon icon-filter-outline mx-1\"></i>\r\n\r\n <!-- COLLAPSED STATE -->\r\n <hxa-filters-collapsed\r\n (onFilter)=\"onCollapsedFilter($event)\"\r\n (onBack)=\"onCollapsedFilterBack($event)\"\r\n (onSearchFilter)=\"onCollapsedSearch($event)\"\r\n (onDateRangePickerFilter)=\"onCollapsedDateRangePicker($event)\"\r\n [data]=\"data\"\r\n *ngIf=\"collapsed\"\r\n ></hxa-filters-collapsed>\r\n\r\n <!-- EXPANDED STATE -->\r\n <ng-container *ngIf=\"!collapsed\">\r\n <ng-container\r\n *ngFor=\"let filter of data; trackBy: trackByFn; let lastItem = last\"\r\n >\r\n <!-- SINGLE-SELECT -->\r\n <div\r\n [id]=\"filter?.id\"\r\n class=\"hx-dropdown mx-1 expandedFilter\"\r\n hxaDropdown\r\n [minWidthRelativeTo]=\"filter?.id + '-trigger'\"\r\n *ngIf=\"filter?.type === FilterType.SingleSelect && !filter?.hidden\"\r\n >\r\n <button\r\n [id]=\"filter?.id + '-trigger'\"\r\n class=\"hx-button hx-button-dropdown expandedFilter__button\"\r\n [class.is-loading]=\"filter?.isLoading\"\r\n [class.is-disabled]=\"filter?.disabled\"\r\n hxaDropdownToggle\r\n >\r\n <span class=\"is-text-weight-light\">{{ filter?.label }}:&nbsp;</span>\r\n <span class=\"hx-icon-control\" *ngIf=\"(filter?.selected)[0]?.icon\"\r\n ><i class=\"{{ (filter?.selected)[0]?.icon }} mr-1\"></i\r\n ></span>\r\n <span\r\n class=\"is-text-weight-bolder is-text-ellipsed\"\r\n title=\"{{ filter?.getSelectedLabel() }}\"\r\n >{{ filter?.getSelectedLabel() }}</span\r\n >\r\n <span class=\"hx-icon-control\">\r\n <i class=\"hx-icon icon-caret-down\"></i>\r\n </span>\r\n </button>\r\n\r\n <div\r\n [id]=\"filter?.id + '-options'\"\r\n class=\"hx-dropdown-menu has-limited-width has-limited-height expandedFilter__menu\"\r\n [class.hx-dropdown-icon]=\"filter.isIconised()\"\r\n *hxaDropdownMenu\r\n >\r\n <button\r\n hxaDropdownItem\r\n *ngFor=\"let option of filter?.options; trackBy: trackByFn\"\r\n (click)=\"onFilterOptionSelected(filter, option)\"\r\n class=\"is-text-ellipsed filter__item\"\r\n [class.selected]=\"option.selected\"\r\n title=\"{{ option?.label }}\"\r\n >\r\n <span\r\n class=\"hx-icon-control filter__itemIcon\"\r\n *ngIf=\"option?.icon\"\r\n aria-hidden=\"true\"\r\n >\r\n <i class=\"{{ option?.icon }}\"></i>\r\n </span>\r\n <span class=\"filter__itemLabel\"> {{ option?.label }} </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- MULTI-SELECT -->\r\n <div\r\n [id]=\"filter?.id\"\r\n class=\"hx-dropdown mx-1 expandedFilter\"\r\n hxaDropdown\r\n [minWidthRelativeTo]=\"filter?.id + '-trigger'\"\r\n *ngIf=\"filter?.type === FilterType.MultiSelect && !filter?.hidden\"\r\n (onHidden)=\"onMultiSelectHidden(filter)\"\r\n >\r\n <button\r\n [id]=\"filter?.id + '-trigger'\"\r\n class=\"hx-button hx-button-dropdown expandedFilter__button\"\r\n [class.is-loading]=\"filter?.isLoading\"\r\n [class.is-disabled]=\"filter?.disabled\"\r\n hxaDropdownToggle\r\n >\r\n <span class=\"is-text-weight-light\">{{ filter?.label }}:&nbsp;</span>\r\n <span\r\n class=\"is-text-weight-bolder is-text-ellipsed\"\r\n title=\"{{ filter?.getSelectedLabel() }}\"\r\n >\r\n {{ filter?.getSelectedLabel() }}\r\n </span>\r\n <span class=\"hx-icon-control\">\r\n <i class=\"hx-icon icon-caret-down\"></i>\r\n </span>\r\n </button>\r\n\r\n <div\r\n [id]=\"filter?.id + '-options'\"\r\n class=\"hx-dropdown-menu has-limited-width has-limited-height expandedFilter__menu\"\r\n *hxaDropdownMenu\r\n >\r\n <label\r\n *ngFor=\"\r\n let option of filter?.options;\r\n trackBy: trackByFn;\r\n let i = index\r\n \"\r\n class=\"is-text-ellipsed filter__item--multi\"\r\n title=\"{{ option?.label }}\"\r\n [class.is-perforated]=\"i === 0\"\r\n [class.selected]=\"option.selected && i > 0\"\r\n [class.is-select-all]=\"i === 0\"\r\n [for]=\"filter?.id + '-checkbox-' + i\"\r\n >\r\n <input\r\n [name]=\"filter?.id + '-checkbox-' + i\"\r\n type=\"checkbox\"\r\n [id]=\"filter?.id + '-checkbox-' + i\"\r\n (change)=\"onFilterOptionSelected(filter, option)\"\r\n [class.indeterminate]=\"\r\n option?.value === filter?.selectAllValue &&\r\n filter?.selectAllState.indeterminate\r\n \"\r\n [checked]=\"option.selected\"\r\n />\r\n <span\r\n class=\"hx-icon-control filter__itemIcon\"\r\n *ngIf=\"option?.icon\"\r\n aria-hidden=\"true\"\r\n >\r\n <i class=\"{{ option?.icon }}\"></i>\r\n </span>\r\n <span\r\n class=\"filter__itemLabel\"\r\n [class.is-text-weight-boldest]=\"i === 0\"\r\n >\r\n {{ option?.label }}\r\n </span>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <!-- SEARCH -->\r\n <div\r\n [id]=\"filter.id\"\r\n *ngIf=\"filter.type === FilterType.Search && !filter?.hidden\"\r\n class=\"hx-input-group ml-2 expandedFilter__search\"\r\n [class.mx-1]=\"!lastItem\"\r\n >\r\n <i class=\"hx-icon icon-search\"></i>\r\n <div class=\"hx-input-control\">\r\n <input\r\n class=\"hx-input\"\r\n type=\"search\"\r\n placeholder=\"{{ filter.label }}\"\r\n (input)=\"onSearchFilterChange(filter)\"\r\n [(ngModel)]=\"filter.value\"\r\n [style.width.rem]=\"filter.width\"\r\n [disabled]=\"filter?.disabled\"\r\n mask=\"{{ customMask }}\"\r\n />\r\n <label class=\"hx-label\"></label>\r\n <div class=\"hx-help\"></div>\r\n </div>\r\n <div class=\"hx-input-actions\" *ngIf=\"filter.value\">\r\n <div class=\"hx-button-group\">\r\n <button class=\"hx-button is-flat\" (click)=\"clearSearch(filter)\">\r\n <span class=\"hx-icon-control\">\r\n <i class=\"icon icon-close-empty\"></i>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- DATE-RANGE -->\r\n <div\r\n [id]=\"filter?.id\"\r\n class=\"hx-dropdown mx-1 expandedFilter\"\r\n hxaDropdown\r\n [minWidthRelativeTo]=\"filter?.id + '-trigger'\"\r\n *ngIf=\"filter?.type === FilterType.DateRange\"\r\n >\r\n <hxa-date-range-picker\r\n [dateFormat]=\"filter.dateRangePickerDisplayDateFormat\"\r\n [displayMode]=\"filter.dateRangePickerDisplayMode\"\r\n [intervalOptions]=\"getIntervalOptions(filter.options)\"\r\n (onDateRangeSelected)=\"onDateRangeFilterChange(filter, $event)\"\r\n [defaultDateRange]=\"filter.sourceValue\"\r\n [id]=\"filter?.id + '-dateRangePicker'\"\r\n #dateRangePicker\r\n ></hxa-date-range-picker>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n", styles: [":host .expandedFilter__button{max-width:15rem;min-width:7.2rem}.expandedFilter__menu{padding:4px 0}.expandedFilter__search .hx-icon{margin-top:-.125rem}.expandedFilter__search .hx-input-control{margin:0}.expandedFilter__search .hx-input{height:2.25em}.expandedFilter__search .hx-help{margin:0}.expandedFilter__search .hx-help:before,.expandedFilter__search .hx-help:after{top:-.15rem}.expandedFilter__search .hx-input-actions{top:0}.filter__item,.filter__item--multi{display:flex;align-items:center;padding:.2666666667rem 8px;margin:0;min-height:2.1333333333rem;gap:8px;border-radius:0;width:100%;font-weight:400;font-family:Roboto;font-size:.9333333333rem;line-height:1.3333333333rem;letter-spacing:0em;text-decoration:none;text-transform:none}.filter__item:focus,.filter__item--multi:focus,.filter__item:focus-visible,.filter__item--multi:focus-visible{outline:none}.filter__item:has(:focus-visible),.filter__item--multi:has(:focus-visible){outline-offset:2px;outline:#262626 solid 2px}.filter__item:hover,.filter__item--multi:hover{background-color:#0000000d;cursor:pointer}.filter__item.selected,.selected.filter__item--multi{background-color:#e1f5ed;color:#02694e}.filter__item:is([disabled],.is-disabled),.filter__item--multi:is([disabled],.is-disabled){border-color:#b3b3b3;background-color:#b3b3b3;cursor:not-allowed;transition:none}.filter__item:not([disabled],.is-disabled),.filter__item--multi:not([disabled],.is-disabled){cursor:pointer}.filter__item:where(button),.filter__item--multi:where(button),.filter__item :where(button),.filter__item--multi :where(button){background-color:transparent;border:0}.filter__item--multi.is-select-all{padding:.8rem 8px;min-height:3.2rem}.filter__item--multi input[type=checkbox]{-webkit-appearance:none;appearance:none;margin:0;width:1.3333333333rem;height:1.3333333333rem;border:2px solid #b3b3b3;background-color:#fff;display:inline-grid;place-content:center;border-radius:2px;transition-property:background-color,border-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.filter__item--multi input[type=checkbox]:before{content:\"\";width:1.0666666667rem;height:1.0666666667rem;transform:scale(0);transition-property:transform,clip-path;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.1s;box-shadow:inset 1rem 1rem #fff;clip-path:polygon(10.46% 53.05%,0% 65%,34.93% 95.56%,100% 15%,88.13% 5.41%,33.42% 73.14%);transform-origin:center}.filter__item--multi input[type=checkbox]:checked{background-color:#41b987;border-color:#41b987}.filter__item--multi input[type=checkbox]:checked:before{transform:scale(1)}.filter__item--multi input[type=checkbox]:indeterminate,.filter__item--multi input[type=checkbox].indeterminate{background-color:#41b987;border-color:#41b987}.filter__item--multi input[type=checkbox]:indeterminate:before,.filter__item--multi input[type=checkbox].indeterminate:before{content:\"\";clip-path:polygon(0% 43.75%,100% 43.75%,100% 56.25%,0% 56.25%);transform:scale(1)}.filter__item--multi input[type=checkbox]:is([disabled],.is-disabled):checked:before{transition:none}.filter__itemIcon{position:relative;display:inline-flex;justify-content:center;align-items:center}.filter__itemIcon .hx-icon{font-size:20px;line-height:24px;position:relative;top:unset;left:unset}.filter__itemLabel{font-weight:400;font-family:Roboto;font-size:1.0666666667rem;line-height:1.6rem;letter-spacing:0em;text-decoration:none;text-transform:none;color:inherit;flex:1;text-align:left}:where(.is-elipsed,.is-text-elipsed,.is-text-ellipsed,.is-text-ellipsis) .filter__itemLabel{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.filter__itemLabel :where(span){color:inherit;font:inherit}\n"] }] }], ctorParameters: function () { return [{ type: i1.FiltersConfig }, { type: i2.DatePipe }]; }, propDecorators: { carousel: [{ type: ViewChild, args: ['carousel', { static: true }] }], dateRangePickers: [{ type: ViewChildren, args: ['dateRangePicker'] }], customMask: [{ type: Input }], collapsed: [{ type: Input }], filters: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9oeC11aS9zcmMvbGliL2ZpbHRlcnMvZmlsdGVycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9oeC11aS9zcmMvbGliL2ZpbHRlcnMvZmlsdGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNMLFNBQVMsRUFFVCxVQUFVLEVBQ1YsS0FBSyxFQUdMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7O0FBTy9DLE1BQU0sT0FBTyxnQkFBZ0I7SUFtQzNCLFlBQW9CLElBQW1CLEVBQVUsUUFBa0I7UUFBL0MsU0FBSSxHQUFKLElBQUksQ0FBZTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVU7UUEvQm5FLGVBQVUsR0FBRyxVQUFVLENBQUM7UUFDeEIsU0FBSSxHQUFtQixFQUFFLENBQUM7UUFDMUIsMkJBQXNCLEdBQUcsSUFBSSxPQUFPLEVBQWdCLENBQUM7UUFDckQsa0JBQWEsR0FBMEIsSUFBSSxPQUFPLEVBQWdCLENBQUM7UUFDbkUsa0JBQWEsR0FBaUIsSUFBSSxZQUFZ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QixDQUFDLE1BQW9CO1FBQ3RDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2hDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNO1FBQ3JCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNMLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBc0IsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEQsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7OzhHQXpMVSxnQkFBZ0I7a0dBQWhCLGdCQUFnQixrVkMxQjdCLHNwUEF5TUE7NEZEL0thLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxhQUFhOzJIQUswQixRQUFRO3NCQUF4RCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ04sZ0JBQWdCO3NCQUFoRCxZQUFZO3VCQUFDLGlCQUFpQjtnQkFZdEIsVUFBVTtzQkFBbEIsS0FBSztnQkFHRixTQUFTO3NCQURaLEtBQUs7Z0JBVUYsT0FBTztzQkFEVixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBEb0NoZWNrLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBRdWVyeUxpc3QsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdDaGlsZHJlbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBEYXRlUmFuZ2UgfSBmcm9tICcuLi9kYXRlLXJhbmdlLXBpY2tlci9kYXRlLXJhbmdlLXBpY2tlci5tb2RlbCc7XHJcbmltcG9ydCB7IElGaWx0ZXJPcHRpb24sIElGaWx0ZXJzQ29uZmlnIH0gZnJvbSAnLi9maWx0ZXJzLWNvbmZpZy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBGaWx0ZXJUeXBlIH0gZnJvbSAnLi9maWx0ZXJzLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IEZpbHRlcnNDb25maWcgfSBmcm9tICcuL2ZpbHRlcnMuY29uZmlnJztcclxuaW1wb3J0IHsgRmlsdGVyc01vZGVsIH0gZnJvbSAnLi9maWx0ZXJzLm1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaHhhLWZpbHRlcnMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9maWx0ZXJzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9maWx0ZXJzLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaWx0ZXJzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBEb0NoZWNrLCBPbkRlc3Ryb3kge1xyXG4gIEBWaWV3Q2hpbGQoJ2Nhcm91c2VsJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBjYXJvdXNlbDogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkcmVuKCdkYXRlUmFuZ2VQaWNrZXInKSBkYXRlUmFuZ2VQaWNrZXJzOiBRdWVyeUxpc3Q8YW55PjtcclxuXHJcbiAgRmlsdGVyVHlwZSA9IEZpbHRlclR5cGU7XHJcbiAgZGF0YTogRmlsdGVyc01vZGVsW10gPSBbXTtcclxuICBvbkZpbHRlck9wdGlvbkNoYW5nZWQkID0gbmV3IFN1YmplY3Q8RmlsdGVyc01vZGVsPigpO1xyXG4gIHNlYXJjaEZpbHRlciQ6IFN1YmplY3Q8RmlsdGVyc01vZGVsPiA9IG5ldyBTdWJqZWN0PEZpbHRlcnNNb2RlbD4oKTtcclxuICBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIHByaXZhdGUgX2ZpbHRlcnM6IElGaWx0ZXJzQ29uZmlnW10gPSBbXTtcclxuICBwcml2YXRlIF9vbGRGaWx0ZXJzOiBJRmlsdGVyc0NvbmZpZ1tdID0gW107XHJcbiAgcHJpdmF0ZSBfY29sbGFwc2VkID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIGN1c3RvbU1hc2s6IHN0cmluZztcclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgY29sbGFwc2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbGxhcHNlZDtcclxuICB9XHJcblxyXG4gIHNldCBjb2xsYXBzZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2NvbGxhcHNlZCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgZmlsdGVycygpOiBJRmlsdGVyc0NvbmZpZ1tdIHtcclxuICAgIHJldHVybiB0aGlzLl9maWx0ZXJzO1xyXG4gIH1cclxuXHJcbiAgc2V0IGZpbHRlcnModmFsdWU6IElGaWx0ZXJzQ29uZmlnW10pIHtcclxuICAgIHRoaXMuX2ZpbHRlcnMgPSB2YWx1ZTtcclxuICAgIHRoaXMuc2V0RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25mOiBGaWx0ZXJzQ29uZmlnLCBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSkge1xyXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBjb25mKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcclxuICAgICAgdGhpcy5zZWFyY2hGaWx0ZXIkXHJcbiAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuY29uZi5kZWJvdW5jZSkpXHJcbiAgICAgICAgLnN1YnNjcmliZSh4ID0+IHRoaXMub25GaWx0ZXJPcHRpb25DaGFuZ2VkJC5uZXh0KHgpKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBuZ0RvQ2hlY2soKSB7XHJcbiAgICBpZiAoIV8uaXNFcXVhbCh0aGlzLl9maWx0ZXJzLCB0aGlzLl9vbGRGaWx0ZXJzKSkge1xyXG4gICAgICB0aGlzLl9vbGRGaWx0ZXJzID0gXy5jbG9uZURlZXAodGhpcy5fZmlsdGVycyk7XHJcbiAgICAgIHRoaXMuc2V0RGF0YSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0SW50ZXJ2YWxPcHRpb25zKG9wdGlvbnM6IElGaWx0ZXJPcHRpb25bXSkge1xyXG4gICAgY29uc3QgaW50ZXJ2YWxPcHRpb246IHN0cmluZ1tdID0gW107XHJcbiAgICBpZiAob3B0aW9ucykge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpbnRlcnZhbE9wdGlvbi5wdXNoKG9wdGlvbnNbaV0ubGFiZWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW50ZXJ2YWxPcHRpb247XHJcbiAgfVxyXG5cclxuICByZXNldEZpbHRlcnMoc2lsZW50ID0gZmFsc2UpIHtcclxuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIHRoaXMuZGF0YSkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgZmlsdGVyLnR5cGUgPT09IEZpbHRlclR5cGUuU2luZ2xlU2VsZWN0IHx8XHJcbiAgICAgICAgZmlsdGVyLnR5cGUgPT09IEZpbHRlclR5cGUuTXVsdGlTZWxlY3RcclxuICAgICAgKSB7XHJcbiAgICAgICAgZmlsdGVyLnNldERlZmF1bHRPcHRpb24oKTtcclxuICAgICAgICBpZiAoIXNpbGVudCkge1xyXG4gICAgICAgICAgdGhpcy5vbkZpbHRlck9wdGlvbkNoYW5nZWQkLm5leHQoZmlsdGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoZmlsdGVyLnR5cGUgPT09IEZpbHRlclR5cGUuU2VhcmNoKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhclNlYXJjaChmaWx0ZXIsIHNpbGVudCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZmlsdGVyLnR5cGUgPT09IEZpbHRlclR5cGUuRGF0ZVJhbmdlKSB7XHJcbiAgICAgICAgdGhpcy5zZXREZWZhdWx0RGF0ZShmaWx0ZXIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGVhclNlYXJjaChmaWx0ZXI6IEZpbHRlcnNNb2RlbCwgc2lsZW50ID0gZmFsc2UpIHtcclxuICAgIGZpbHRlci52YWx1ZSA9ICcnO1xyXG4gICAgaWYgKCFzaWxlbnQpIHtcclxuICAgICAgdGhpcy5vbkZpbHRlck9wdGlvbkNoYW5nZWQkLm5leHQoZmlsdGVyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldERlZmF1bHREYXRlKGZpbHRlcjogRmlsdGVyc01vZGVsKSB7XHJcbiAgICBmaWx0ZXIudmFsdWUgPSAnJztcclxuICAgIGZpbHRlci5zb3VyY2VWYWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgIGlmICghdGhpcy5fY29sbGFwc2VkKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kYXRlUmFuZ2VQaWNrZXJzLnRvQXJyYXkoKS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlUGlja2Vycy50b0FycmF5KClbaV0ucmVzZXREYXRlUmFuZ2UoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5vbkZpbHRlck9wdGlvbkNoYW5nZWQkLm5leHQoZmlsdGVyKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIGZpbHRlciBvcHRpb24gaXMgc2VsZWN0ZWRcclxuICAgKi9cclxuICBvbkZpbHRlck9wdGlvblNlbGVjdGVkKGZpbHRlcjogRmlsdGVyc01vZGVsLCBvcHRpb246IElGaWx0ZXJPcHRpb24pIHtcclxuICAgIG9wdGlvbi5zZWxlY3RlZCA9ICFvcHRpb24uc2VsZWN0ZWQ7XHJcbiAgICBpZiAoZmlsdGVyLnR5cGUgPT09IEZpbHRlclR5cGUuTXVsdGlTZWxlY3QpIHtcclxuICAgICAgZmlsdGVyLnNldE11bHRpU2VsZWN0T3B0aW9ucyhvcHRpb24pO1xyXG4gICAgfSBlbHNlIGlmIChmaWx0ZXIudHlwZSAhPT0gRmlsdGVyVHlwZS5TZWFyY2gpIHtcclxuICAgICAgZmlsdGVyLnNldFNpbmdsZVNlbGVjdE9wdGlvbihvcHRpb24pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vbkZpbHRlck9wdGlvbkNoYW5nZWQkLm5leHQoZmlsdGVyKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIGNoYXJhY3RlciBpcyB0eXBlZCBpbiB0aGUgc2VhcmNoIGZpbHRlciB0eXBlXHJcbiAgICovXHJcbiAgb25TZWFyY2hGaWx0ZXJDaGFuZ2UoZmlsdGVyOiBGaWx0ZXJzTW9kZWwpIHtcclxuICAgIGlmIChmaWx0ZXIudmFsdWUubGVuZ3RoID09PSAwIHx8IGZpbHRlci52YWx1ZS5sZW5ndGggPj0gZmlsdGVyLmNoYXJMaW1pdCkge1xyXG4gICAgICB0aGlzLnNlYXJjaEZpbHRlciQubmV4dChmaWx0ZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gc2VsZWN0aW9uIGlzIG1hZGUgaW4gdGhlIGRhdGUgcmFuZ2UgZmlsdGVyIHR5cGVcclxuICAgKi9cclxuICBvbkRhdGVSYW5nZUZpbHRlckNoYW5nZShmaWx0ZXI6IEZpbHRlcnNNb2RlbCwgZGF0ZVJhbmdlOiBEYXRlUmFuZ2UpIHtcclxuICAgIGNvbnN0IGRhdGVSYW5nZVZhbHVlID1cclxuICAgICAgdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oXHJcbiAgICAgICAgZGF0ZVJhbmdlLmZyb21EYXRlLFxyXG4gICAgICAgIGZpbHRlci5kYXRlUmFuZ2VQaWNrZXJEaXNwbGF5RGF0ZUZvcm1hdFxyXG4gICAgICApICtcclxuICAgICAgJyAtICcgK1xyXG4gICAgICB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShcclxuICAgICAgICBkYXRlUmFuZ2UudG9EYXRlLFxyXG4gICAgICAgIGZpbHRlci5kYXRlUmFuZ2VQaWNrZXJEaXNwbGF5RGF0ZUZvcm1hdFxyXG4gICAgICApO1xyXG4gICAgZmlsdGVyLnZhbHVlID0gZGF0ZVJhbmdlVmFsdWU7XHJcbiAgICBmaWx0ZXIuc291cmNlVmFsdWUgPSBkYXRlUmFuZ2U7XHJcbiAgICB0aGlzLnNlYXJjaEZpbHRlciQubmV4dChmaWx0ZXIpO1xyXG4gIH1cclxuXHJcbiAgb25Db2xsYXBzZWRGaWx0ZXIoJGV2ZW50KSB7XHJcbiAgICB0aGlzLm9uRmlsdGVyT3B0aW9uU2VsZWN0ZWQoJGV2ZW50LmZpbHRlciwgJGV2ZW50Lm9wdGlvbik7XHJcbiAgfVxyXG5cclxuICBvbkNvbGxhcHNlZFNlYXJjaCgkZXZlbnQpIHtcclxuICAgIHRoaXMub25TZWFyY2hGaWx0ZXJDaGFuZ2UoJGV2ZW50LmZpbHRlcik7XHJcbiAgfVxyXG5cclxuICBvbkNvbGxhcHNlZERhdGVSYW5nZVBpY2tlcigkZXZlbnQpIHtcclxuICAgIHRoaXMub25EYXRlUmFuZ2VGaWx0ZXJDaGFuZ2UoJGV2ZW50LmZpbHRlciwgJGV2ZW50LmRhdGVSYW5nZSk7XHJcbiAgfVxyXG5cclxuICBvbkNvbGxhcHNlZEZpbHRlckJhY2soJGV2ZW50KSB7XHJcbiAgICB0aGlzLm9uTXVsdGlTZWxlY3RIaWRkZW4oJGV2ZW50LmZpbHRlcik7XHJcbiAgfVxyXG5cclxuICBvbk11bHRpU2VsZWN0SGlkZGVuKGZpbHRlcjogRmlsdGVyc01vZGVsKSB7XHJcbiAgICBpZiAoZmlsdGVyLnNlbGVjdGVkLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBmaWx0ZXIuc2V0U2VsZWN0QWxsKCk7XHJcbiAgICAgIHRoaXMub25GaWx0ZXJPcHRpb25DaGFuZ2VkJC5uZXh0KGZpbHRlcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVc2VkIGZvciB0cmFjayBieSBhbmQgYm9vc3QgcGVyZm9ybWFuY2VcclxuICAgKi9cclxuICB0cmFja0J5Rm4oaW5kZXgsIGFjdGlvbikge1xyXG4gICAgcmV0dXJuIGluZGV4O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udmVydCBmaWx0ZXIgY29uZmlnIG9iamVjdHMgdG8gRmlsdGVyIE1vZGVsc1xyXG4gICAqL1xyXG4gIHNldERhdGEoKSB7XHJcbiAgICB0aGlzLmRhdGEgPSBbXTtcclxuICAgIGlmICh0aGlzLl9maWx0ZXJzKSB7XHJcbiAgICAgIHRoaXMuX2ZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyOiBJRmlsdGVyc0NvbmZpZywgaW5kZXgpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGEucHVzaChuZXcgRmlsdGVyc01vZGVsKF8uY2xvbmVEZWVwKGZpbHRlcikpKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJoeC1mbGV4IGh4LWZsZXgtYWxpZ24tY2VudGVyXCI+XHJcbiAgPGkgY2xhc3M9XCJoeC1pY29uIGljb24tZmlsdGVyLW91dGxpbmUgbXgtMVwiPjwvaT5cclxuXHJcbiAgPCEtLSBDT0xMQVBTRUQgU1RBVEUgLS0+XHJcbiAgPGh4YS1maWx0ZXJzLWNvbGxhcHNlZFxyXG4gICAgKG9uRmlsdGVyKT1cIm9uQ29sbGFwc2VkRmlsdGVyKCRldmVudClcIlxyXG4gICAgKG9uQmFjayk9XCJvbkNvbGxhcHNlZEZpbHRlckJhY2soJGV2ZW50KVwiXHJcbiAgICAob25TZWFyY2hGaWx0ZXIpPVwib25Db2xsYXBzZWRTZWFyY2goJGV2ZW50KVwiXHJcbiAgICAob25EYXRlUmFuZ2VQaWNrZXJGaWx0ZXIpPVwib25Db2xsYXBzZWREYXRlUmFuZ2VQaWNrZXIoJGV2ZW50KVwiXHJcbiAgICBbZGF0YV09XCJkYXRhXCJcclxuICAgICpuZ0lmPVwiY29sbGFwc2VkXCJcclxuICA+PC9oeGEtZmlsdGVycy1jb2xsYXBzZWQ+XHJcblxyXG4gIDwhLS0gRVhQQU5ERUQgU1RBVEUgLS0+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2xsYXBzZWRcIj5cclxuICAgIDxuZy1jb250YWluZXJcclxuICAgICAgKm5nRm9yPVwibGV0IGZpbHRlciBvZiBkYXRhOyB0cmFja0J5OiB0cmFja0J5Rm47IGxldCBsYXN0SXRlbSA9IGxhc3RcIlxyXG4gICAgPlxyXG4gICAgICA8IS0tIFNJTkdMRS1TRUxFQ1QgLS0+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBbaWRdPVwiZmlsdGVyPy5pZFwiXHJcbiAgICAgICAgY2xhc3M9XCJoeC1kcm9wZG93biBteC0xIGV4cGFuZGVkRmlsdGVyXCJcclxuICAgICAgICBoeGFEcm9wZG93blxyXG4gICAgICAgIFttaW5XaWR0aFJlbGF0aXZlVG9dPVwiZmlsdGVyPy5pZCArICctdHJpZ2dlcidcIlxyXG4gICAgICAgICpuZ0lmPVwiZmlsdGVyPy50eXBlID09PSBGaWx0ZXJUeXBlLlNpbmdsZVNlbGVjdCAmJiAhZmlsdGVyPy5oaWRkZW5cIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgW2lkXT1cImZpbHRlcj8uaWQgKyAnLXRyaWdnZXInXCJcclxuICAgICAgICAgIGNsYXNzPVwiaHgtYnV0dG9uIGh4LWJ1dHRvbi1kcm9wZG93biBleHBhbmRlZEZpbHRlcl9fYnV0dG9uXCJcclxuICAgICAgICAgIFtjbGFzcy5pcy1sb2FkaW5nXT1cImZpbHRlcj8uaXNMb2FkaW5nXCJcclxuICAgICAgICAgIFtjbGFzcy5pcy1kaXNhYmxlZF09XCJmaWx0ZXI/LmRpc2FibGVkXCJcclxuICAgICAgICAgIGh4YURyb3Bkb3duVG9nZ2xlXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy10ZXh0LXdlaWdodC1saWdodFwiPnt7IGZpbHRlcj8ubGFiZWwgfX06Jm5ic3A7PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJoeC1pY29uLWNvbnRyb2xcIiAqbmdJZj1cIihmaWx0ZXI/LnNlbGVjdGVkKVswXT8uaWNvblwiXHJcbiAgICAgICAgICAgI