@elderbyte/ngx-starter 16.4.0 → 16.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4603,8 +4603,7 @@ class RequiredFilterEvaluator {
4603
4603
  }
4604
4604
  allRequiredFiltersPresent(requiredFilters, currentFilters) {
4605
4605
  if (requiredFilters) {
4606
- const validatedFilterGroups = requiredFilters.map(filterGroup => this.hasAllFilters(filterGroup, currentFilters));
4607
- return validatedFilterGroups.find(validGroup => !!validGroup);
4606
+ return requiredFilters.some(filterGroup => this.hasAllFilters(filterGroup, currentFilters));
4608
4607
  }
4609
4608
  return true;
4610
4609
  }
@@ -25935,8 +25934,9 @@ class SearchContext {
25935
25934
  this.log = LoggerFactory.getLogger(this.constructor.name);
25936
25935
  this.userFilterContext = new FilterContext();
25937
25936
  this.forcedFilterContext = new FilterContext();
25937
+ this.allFilters$ = new BehaviorSubject(undefined);
25938
25938
  this.id = id;
25939
- this._allFilters$ = this.userFilterContext.filters.pipe(combineLatestWith(this.forcedFilterContext.filters), skip(1), map(([userFilters, forcedFilters]) => FilterUtil.mergeCombine(userFilters, forcedFilters)), tap(x => this.log.debug('allFilters changed: ', x)));
25939
+ this.userFilterContext.filters.pipe(combineLatestWith(this.forcedFilterContext.filters), skip(1), map(([userFilters, forcedFilters]) => FilterUtil.mergeCombine(userFilters, forcedFilters)), tap(x => this.log.debug('allFilters changed: ', x))).subscribe(merged => this.allFilters$.next(merged));
25940
25940
  }
25941
25941
  /***************************************************************************
25942
25942
  * *
@@ -25944,7 +25944,7 @@ class SearchContext {
25944
25944
  * *
25945
25945
  **************************************************************************/
25946
25946
  get allFiltersChanged() {
25947
- return this._allFilters$;
25947
+ return this.allFilters$.pipe(filter(filters => !!filters));
25948
25948
  }
25949
25949
  get userFilters() {
25950
25950
  return this.userFilterContext;
@@ -25963,6 +25963,9 @@ class SearchContext {
25963
25963
  replaceUserFilters(filters) {
25964
25964
  this.userFilterContext.replaceFilters(filters);
25965
25965
  }
25966
+ replaceForcedFilters(filters) {
25967
+ this.forcedFilterContext.replaceFilters(filters);
25968
+ }
25966
25969
  }
25967
25970
 
25968
25971
  class SearchContextService {
@@ -26041,11 +26044,10 @@ class ElderSearchContextDirective {
26041
26044
  this.syncSearchContextToBoundFilterContext();
26042
26045
  }
26043
26046
  ngAfterContentInit() {
26047
+ const searchContext = this.searchContext;
26048
+ this.applySearchContextToInputs(searchContext);
26044
26049
  this.syncSearchInputsToSearchContext();
26045
26050
  }
26046
- ngAfterViewInit() {
26047
- this.applySearchContextToInputs();
26048
- }
26049
26051
  ngOnDestroy() {
26050
26052
  this.destroy$.next();
26051
26053
  this.destroy$.complete();
@@ -26093,7 +26095,7 @@ class ElderSearchContextDirective {
26093
26095
  * to also keep the users intent (by merging) them.
26094
26096
  */
26095
26097
  set forcedFilters(filters) {
26096
- this.searchContext.forcedFilters.replaceFilters(filters);
26098
+ this.searchContext.replaceForcedFilters(filters);
26097
26099
  }
26098
26100
  get forcedFilters() {
26099
26101
  return this.searchContext.forcedFilters.filtersSnapshot;
@@ -26146,7 +26148,8 @@ class ElderSearchContextDirective {
26146
26148
  const searchContext = this.searchContext;
26147
26149
  if (searchContext.userFilters.isEmpty) {
26148
26150
  if (!dcFilters.isEmpty) {
26149
- searchContext.updateUserFilters(dcFilters.filtersSnapshot);
26151
+ // Consider all filters in DC as defaults, expect for foced filters.
26152
+ searchContext.updateUserFilters(FilterUtil.strip(dcFilters.filtersSnapshot, this.forcedFilters));
26150
26153
  }
26151
26154
  }
26152
26155
  else {
@@ -26174,30 +26177,33 @@ class ElderSearchContextDirective {
26174
26177
  this.log.warn('Failed to apply filters since no FilterContext is available!', filters);
26175
26178
  }
26176
26179
  }
26177
- applySearchContextToInputs() {
26178
- const ctx = this.searchContext;
26179
- this.applyFiltersToInputs(ctx.userFilters.filtersSnapshot // this.filterContext.filtersSnapshot (old)
26180
- );
26180
+ applySearchContextToInputs(searchContext) {
26181
+ this.applyFiltersToInputs(searchContext.userFilters.filtersSnapshot);
26181
26182
  }
26182
26183
  applyFiltersToInputs(filters) {
26183
- this.log.warn('applyFiltersToInputs', filters);
26184
- this._searchInputs$.getValue().forEach(input => {
26185
- const filter = this.findFilterForInput(input, filters);
26186
- if (filter) {
26187
- input.applyInitialValue(filter.value);
26188
- }
26189
- });
26190
- }
26191
- findFilterForInput(input, filters) {
26192
- for (const filter of filters) {
26193
- if (filter.key === input.name) {
26194
- return filter;
26195
- }
26184
+ if (filters.length > 0) {
26185
+ const inputsByName = this.searchInputsByName();
26186
+ this.log.warn('applyFiltersToInputs [' + Array.from(inputsByName.keys()) + ']', {
26187
+ filters: filters,
26188
+ inputsByName: inputsByName
26189
+ });
26190
+ filters.forEach(f => {
26191
+ const input = inputsByName.get(f.key);
26192
+ if (input) {
26193
+ input.applyInitialValue(f.value);
26194
+ }
26195
+ });
26196
26196
  }
26197
- return null;
26197
+ }
26198
+ searchInputsByName() {
26199
+ const inputs = this._searchInputs$.getValue();
26200
+ const map = new Map();
26201
+ inputs.forEach(input => map.set(input.name, input));
26202
+ return map;
26198
26203
  }
26199
26204
  convertToFilters(states) {
26200
26205
  return states
26206
+ .filter(s => s.userEvent)
26201
26207
  .filter(s => !!s.queryKey)
26202
26208
  .map(s => new Filter(s.queryKey, s.queryValue));
26203
26209
  }
@@ -26224,7 +26230,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
26224
26230
  */
26225
26231
  class SearchInputState {
26226
26232
  static unknown() {
26227
- return new SearchInputState(null, null, null, true);
26233
+ return new SearchInputState(null, null, null, true, false);
26228
26234
  }
26229
26235
  /***************************************************************************
26230
26236
  * *
@@ -26247,11 +26253,16 @@ class SearchInputState {
26247
26253
  /**
26248
26254
  * pristine Has the user touched this?
26249
26255
  */
26250
- pristine) {
26256
+ pristine,
26257
+ /**
26258
+ * Was the input changed by a user interaction
26259
+ */
26260
+ userEvent) {
26251
26261
  this.attribute = attribute;
26252
26262
  this.queryValue = queryValue;
26253
26263
  this.queryKey = queryKey;
26254
26264
  this.pristine = pristine;
26265
+ this.userEvent = userEvent;
26255
26266
  }
26256
26267
  /***************************************************************************
26257
26268
  * *
@@ -26295,7 +26306,7 @@ class SearchInputState {
26295
26306
  pristineNow = pristine;
26296
26307
  }
26297
26308
  }
26298
- return new SearchInputState(this.attribute, value, this.queryKey, pristineNow);
26309
+ return new SearchInputState(this.attribute, value, this.queryKey, pristineNow, true);
26299
26310
  }
26300
26311
  }
26301
26312
 
@@ -26321,7 +26332,7 @@ class ElderInitialValueDirective {
26321
26332
  this.initialValue$ = new BehaviorSubject(null);
26322
26333
  this.destroy$ = new Subject();
26323
26334
  this.initialDone$ = new Subject();
26324
- const ngModelValue$ = of("dummy")
26335
+ const ngModelValue$ = of('dummy')
26325
26336
  .pipe(delay(10), map(() => this.ngModel.model));
26326
26337
  ngModelValue$
26327
26338
  .pipe(combineLatestWith$1(this.initialValue$), takeUntil(this.initialDone$), takeUntil(this.destroy$)).subscribe(([ngModelValue, initialValue]) => {
@@ -26369,6 +26380,9 @@ class ElderInitialValueDirective {
26369
26380
  .pipe(takeUntil(this.destroy$));
26370
26381
  }
26371
26382
  applyInitialValue(value) {
26383
+ if (value) {
26384
+ this.ngModel.control.setValue(value);
26385
+ }
26372
26386
  this.initialValue$.next(value);
26373
26387
  }
26374
26388
  ngOnDestroy() {
@@ -26381,8 +26395,8 @@ class ElderInitialValueDirective {
26381
26395
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderInitialValueDirective, decorators: [{
26382
26396
  type: Directive,
26383
26397
  args: [{
26384
- selector: "[elderInitialValue]",
26385
- exportAs: "elderInitialValue"
26398
+ selector: '[elderInitialValue]',
26399
+ exportAs: 'elderInitialValue'
26386
26400
  }]
26387
26401
  }], ctorParameters: function () { return [{ type: i3.NgModel, decorators: [{
26388
26402
  type: Host
@@ -26400,11 +26414,10 @@ class ElderSearchInputDirective {
26400
26414
  constructor(searchContext, ngModel) {
26401
26415
  this.searchContext = searchContext;
26402
26416
  this.ngModel = ngModel;
26403
- //TODO: In Angular 16, use standalone directives and host component to inject directive to component
26404
- this.initialValueDirective = new ElderInitialValueDirective(this.ngModel);
26405
26417
  this._state = new BehaviorSubject(SearchInputState.unknown());
26406
26418
  this.destroy$ = new Subject();
26407
26419
  this.log = LoggerFactory.getLogger(this.constructor.name);
26420
+ this.initialValueDirective = new ElderInitialValueDirective(ngModel);
26408
26421
  }
26409
26422
  /***************************************************************************
26410
26423
  * *
@@ -26418,8 +26431,9 @@ class ElderSearchInputDirective {
26418
26431
  ngAfterViewInit() {
26419
26432
  this._extractedName = this.extractName();
26420
26433
  this.log.debug(this._extractedName + "|" + this.queryKey + "|" + this.resolvePath);
26421
- const viewStabilized$ = of('stabilized$').pipe(delay(20), first());
26422
- this.stateObservable().pipe(skipUntil(viewStabilized$)).subscribe(state => {
26434
+ this.stateObservable()
26435
+ .subscribe(state => {
26436
+ // this.log.error('EMIT SEARCH INPUT STATE [' + state.queryKey + ']: ' + state.queryValue + (state.pristine ? '(pristine)' : ''), state)
26423
26437
  this.emitState(state);
26424
26438
  });
26425
26439
  }
@@ -26474,12 +26488,20 @@ class ElderSearchInputDirective {
26474
26488
  * Private methods *
26475
26489
  * *
26476
26490
  **************************************************************************/
26491
+ get valueChanges$() {
26492
+ return this.ngModel.control.valueChanges
26493
+ .pipe(takeUntil(this.destroy$));
26494
+ }
26477
26495
  stateObservable() {
26478
- return this.initialValueDirective.valueChanges$.pipe(takeUntil(this.destroy$), map(value => {
26479
- const queryValue = this.convertRawModelValueToQueryString(value);
26480
- const pristine = !this.isAttributeValuePresent(value);
26481
- return new SearchInputState(this.name, queryValue, this.queryKey || this.name, pristine);
26482
- }));
26496
+ const viewStabilized$ = of('stabilized$').pipe(delay(20), first());
26497
+ const inputStateChanges$ = this.valueChanges$.pipe(takeUntil(this.destroy$), map(value => this.buildInputState(value, true)), skipUntil(viewStabilized$), debounceTime(20));
26498
+ const startWithAsync$ = of('start').pipe(map(start => this.buildInputState(this.ngModel.control.value, false)));
26499
+ return concat(startWithAsync$, inputStateChanges$);
26500
+ }
26501
+ buildInputState(controlValue, userEvent) {
26502
+ const queryValue = this.convertRawModelValueToQueryString(controlValue);
26503
+ const pristine = !this.isAttributeValuePresent(controlValue);
26504
+ return new SearchInputState(this.name, queryValue, this.queryKey || this.name, pristine, userEvent);
26483
26505
  }
26484
26506
  convertQueryStringToRawModelValue(queryString) {
26485
26507
  if (Objects.nonNull(queryString)) {
@@ -26939,8 +26961,8 @@ class ElderSearchBoxComponent {
26939
26961
  * Constructor *
26940
26962
  * *
26941
26963
  **************************************************************************/
26942
- constructor(searchModel) {
26943
- this.searchModel = searchModel;
26964
+ constructor(searchContextDirective) {
26965
+ this.searchContextDirective = searchContextDirective;
26944
26966
  /***************************************************************************
26945
26967
  * *
26946
26968
  * Fields *
@@ -26962,16 +26984,15 @@ class ElderSearchBoxComponent {
26962
26984
  this.queryKey = 'query';
26963
26985
  this._dense = false;
26964
26986
  this.autocomplete = 'off';
26987
+ this.userFilters$ = searchContextDirective.userDefinedAttributes$.pipe(
26988
+ //switchMap(ctx => ctx.userFilters.filters)
26989
+ );
26965
26990
  }
26966
26991
  /***************************************************************************
26967
26992
  * *
26968
26993
  * Life Cycle *
26969
26994
  * *
26970
26995
  **************************************************************************/
26971
- ngOnInit() {
26972
- }
26973
- ngAfterViewInit() {
26974
- }
26975
26996
  ngAfterContentInit() {
26976
26997
  this.overlayState$.next(new OverlayState(!!this.advancedSearch));
26977
26998
  }
@@ -26998,14 +27019,14 @@ class ElderSearchBoxComponent {
26998
27019
  * Occurs when the user clicks the clear search button
26999
27020
  */
27000
27021
  clearSearch(event) {
27001
- this.searchModel.reset();
27022
+ this.searchContextDirective.reset();
27002
27023
  }
27003
27024
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchBoxComponent, deps: [{ token: ElderSearchContextDirective }], target: i0.ɵɵFactoryTarget.Component }); }
27004
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ElderSearchBoxComponent, selector: "elder-search-box", inputs: { autoPanel: "autoPanel", name: "name", queryKey: "queryKey", placeholder: "placeholder", label: "label", hint: "hint", autocomplete: "autocomplete", appearance: "appearance", dense: "dense" }, host: { classAttribute: "elder-form-field-host" }, queries: [{ propertyName: "advancedSearch", first: true, predicate: ElderSearchPanelComponent, descendants: true }], viewQueries: [{ propertyName: "search", first: true, predicate: ["search"], descendants: true }], exportAs: ["elderSearchBox"], ngImport: i0, template: "<div class=\"layout-row place-stretch-center full flex\" style=\"overflow: hidden\">\n <mat-form-field\n *ngIf=\"overlayState$ | async as overlayState\"\n [appearance]=\"appearance\"\n class=\"elder-search-box-field flex-auto\" subscriptSizing=\"dynamic\"\n [elderDense]=\"dense\">\n\n <button matPrefix mat-icon-button type=\"button\"\n [elderOverlayTrigger]=\"searchPanel\" (click)=\"blurFocus($event)\"\n >\n <mat-icon>search</mat-icon>\n </button>\n\n <input matInput type=\"text\" [name]=\"name\" [placeholder]=\"placeholder\" #search cdkFocusInitial\n ngModel\n elderSearchInput [elderSearchInputKey]=\"queryKey\" #searchInput=\"elderSearchInput\"\n [autocomplete]=\"(autoPanel && overlayState.hasOverlay) ? 'off' : autocomplete\"\n [elderOverlayOrigin]=\"searchPanel\"\n [elderOverlayTrigger]=\"searchPanel\"\n [elderOverlayTriggerType]=\"'focus'\"\n [elderOverlayTriggerEnabled]=\"autoPanel && overlayState.hasOverlay && (searchInput?.state$ | async)?.pristine\"\n >\n <mat-hint *ngIf=\"hint\">{{hint}}</mat-hint>\n\n <div class=\"layout-row\" matSuffix *ngIf=\"searchModel.userDefinedAttributes$ | async as userDefinedFilters\">\n\n <button mat-icon-button type=\"button\"\n *ngIf=\"userDefinedFilters.length > 0\"\n (click)=\"clearSearch($event)\"\n name=\"clear\" aria-label=\"Clear\">\n <mat-icon>close</mat-icon>\n </button>\n\n <button mat-icon-button type=\"button\"\n *ngIf=\"overlayState.hasOverlay\" name=\"openPanel\"\n [elderOverlayTrigger]=\"searchPanel\" (click)=\"blurFocus($event)\">\n <mat-icon\n [matBadge]=\"userDefinedFilters.length\"\n matBadgeSize=\"small\"\n [matBadgeOverlap]=\"true\"\n [matBadgeHidden]=\"userDefinedFilters.length == 0\"\n matBadgeColor=\"accent\"\n [color]=\"userDefinedFilters.length > 0 ? 'accent' : undefined\"\n >\n filter_list\n </mat-icon>\n </button>\n </div>\n </mat-form-field>\n</div>\n\n\n<!-- Overlay Panel for advanced search -->\n<elder-overlay #searchPanel=\"elderOverlay\">\n <elder-dialog-panel class=\"elder-search-panel-container\">\n\n <!-- Project the users search inputs here -->\n <ng-content select=\"elder-search-panel\"></ng-content>\n\n <div class=\"layout-row place-between-center\">\n <button mat-raised-button type=\"button\" name=\"clear\"\n (click)=\"clearSearch($event)\">{{'context.reset' | translate}}\n </button>\n\n <button mat-raised-button type=\"button\" name=\"ok\" color=\"primary\"\n (click)=\"searchPanel.closeOverlay()\">Ok\n </button>\n </div>\n </elder-dialog-panel>\n</elder-overlay>\n", styles: [".elder-search-box-field{margin-top:4px;margin-bottom:4px}.elder-search-panel-container{min-width:250px}\n"], dependencies: [{ kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4$3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i5.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i5$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5$1.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i2$3.MatBadge, selector: "[matBadge]", inputs: ["matBadgeDisabled", "matBadgeColor", "matBadgeOverlap", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: ElderOverlayComponent, selector: "elder-overlay", inputs: ["originX", "originY", "overlayX", "overlayY", "offsetY", "offsetX", "backdrop", "backdropVisible", "origin", "positionStrategy", "overlaySize"], outputs: ["keydownEvents", "attachedChange"], exportAs: ["elderOverlay"] }, { kind: "directive", type: ElderOverlayTriggerDirective, selector: "[elderOverlayTrigger]", inputs: ["elderOverlayTrigger", "elderOverlayTriggerType", "elderOverlayTriggerEnabled"] }, { kind: "directive", type: ElderOverlayOriginDirective, selector: "[elderOverlayOrigin]", inputs: ["elderOverlayOrigin"] }, { kind: "component", type: ElderDialogPanelComponent, selector: "elder-dialog-panel" }, { kind: "directive", type: ElderFormFieldDenseDirective, selector: "mat-form-field[elderDense]", inputs: ["elderDense", "subscriptSizing", "floatLabel"] }, { kind: "directive", type: ElderSearchInputDirective, selector: "[elderSearchInput]", inputs: ["elderSearchInputKey", "elderSearchInputTransform", "elderSearchInput", "dataSource", "elderSearchInputFallback", "valueAsId"], exportAs: ["elderSearchInput"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27025
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ElderSearchBoxComponent, selector: "elder-search-box", inputs: { autoPanel: "autoPanel", name: "name", queryKey: "queryKey", placeholder: "placeholder", label: "label", hint: "hint", autocomplete: "autocomplete", appearance: "appearance", dense: "dense" }, host: { classAttribute: "elder-form-field-host" }, queries: [{ propertyName: "advancedSearch", first: true, predicate: ElderSearchPanelComponent, descendants: true }], viewQueries: [{ propertyName: "search", first: true, predicate: ["search"], descendants: true }], exportAs: ["elderSearchBox"], ngImport: i0, template: "<div class=\"layout-row place-stretch-center full flex\" style=\"overflow: hidden\">\n <mat-form-field\n *ngIf=\"overlayState$ | async as overlayState\"\n [appearance]=\"appearance\"\n class=\"elder-search-box-field flex-auto\" subscriptSizing=\"dynamic\"\n [elderDense]=\"dense\">\n\n <button matPrefix mat-icon-button type=\"button\"\n [elderOverlayTrigger]=\"searchPanel\" (click)=\"blurFocus($event)\"\n >\n <mat-icon>search</mat-icon>\n </button>\n\n <input matInput type=\"text\" [name]=\"name\" [placeholder]=\"placeholder\" #search cdkFocusInitial\n ngModel\n elderSearchInput [elderSearchInputKey]=\"queryKey\" #searchInput=\"elderSearchInput\"\n [autocomplete]=\"(autoPanel && overlayState.hasOverlay) ? 'off' : autocomplete\"\n [elderOverlayOrigin]=\"searchPanel\"\n [elderOverlayTrigger]=\"searchPanel\"\n [elderOverlayTriggerType]=\"'focus'\"\n [elderOverlayTriggerEnabled]=\"autoPanel && overlayState.hasOverlay && (searchInput?.state$ | async)?.pristine\"\n >\n <mat-hint *ngIf=\"hint\">{{hint}}</mat-hint>\n\n <div class=\"layout-row\" matSuffix *ngIf=\"userFilters$ | async as userDefinedFilters\">\n\n <button mat-icon-button type=\"button\"\n *ngIf=\"userDefinedFilters.length > 0\"\n (click)=\"clearSearch($event)\"\n name=\"clear\" aria-label=\"Clear\">\n <mat-icon>close</mat-icon>\n </button>\n\n <button mat-icon-button type=\"button\"\n *ngIf=\"overlayState.hasOverlay\" name=\"openPanel\"\n [elderOverlayTrigger]=\"searchPanel\" (click)=\"blurFocus($event)\">\n <mat-icon\n [matBadge]=\"userDefinedFilters.length\"\n matBadgeSize=\"small\"\n [matBadgeOverlap]=\"true\"\n [matBadgeHidden]=\"userDefinedFilters.length === 0\"\n matBadgeColor=\"accent\"\n [color]=\"userDefinedFilters.length > 0 ? 'accent' : undefined\"\n >\n filter_list\n </mat-icon>\n </button>\n </div>\n </mat-form-field>\n</div>\n\n\n<!-- Overlay Panel for advanced search -->\n<elder-overlay #searchPanel=\"elderOverlay\">\n <elder-dialog-panel class=\"elder-search-panel-container\">\n\n <!-- Project the users search inputs here -->\n <ng-content select=\"elder-search-panel\"></ng-content>\n\n <div class=\"layout-row place-between-center\">\n <button mat-raised-button type=\"button\" name=\"clear\"\n (click)=\"clearSearch($event)\">{{'context.reset' | translate}}\n </button>\n\n <button mat-raised-button type=\"button\" name=\"ok\" color=\"primary\"\n (click)=\"searchPanel.closeOverlay()\">Ok\n </button>\n </div>\n </elder-dialog-panel>\n</elder-overlay>\n", styles: [".elder-search-box-field{margin-top:4px;margin-bottom:4px}.elder-search-panel-container{min-width:250px}\n"], dependencies: [{ kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4$3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i5.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i5$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5$1.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i2$3.MatBadge, selector: "[matBadge]", inputs: ["matBadgeDisabled", "matBadgeColor", "matBadgeOverlap", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: ElderOverlayComponent, selector: "elder-overlay", inputs: ["originX", "originY", "overlayX", "overlayY", "offsetY", "offsetX", "backdrop", "backdropVisible", "origin", "positionStrategy", "overlaySize"], outputs: ["keydownEvents", "attachedChange"], exportAs: ["elderOverlay"] }, { kind: "directive", type: ElderOverlayTriggerDirective, selector: "[elderOverlayTrigger]", inputs: ["elderOverlayTrigger", "elderOverlayTriggerType", "elderOverlayTriggerEnabled"] }, { kind: "directive", type: ElderOverlayOriginDirective, selector: "[elderOverlayOrigin]", inputs: ["elderOverlayOrigin"] }, { kind: "component", type: ElderDialogPanelComponent, selector: "elder-dialog-panel" }, { kind: "directive", type: ElderFormFieldDenseDirective, selector: "mat-form-field[elderDense]", inputs: ["elderDense", "subscriptSizing", "floatLabel"] }, { kind: "directive", type: ElderSearchInputDirective, selector: "[elderSearchInput]", inputs: ["elderSearchInputKey", "elderSearchInputTransform", "elderSearchInput", "dataSource", "elderSearchInputFallback", "valueAsId"], exportAs: ["elderSearchInput"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27005
27026
  }
27006
27027
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchBoxComponent, decorators: [{
27007
27028
  type: Component,
27008
- args: [{ selector: 'elder-search-box', exportAs: 'elderSearchBox', host: { 'class': 'elder-form-field-host' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"layout-row place-stretch-center full flex\" style=\"overflow: hidden\">\n <mat-form-field\n *ngIf=\"overlayState$ | async as overlayState\"\n [appearance]=\"appearance\"\n class=\"elder-search-box-field flex-auto\" subscriptSizing=\"dynamic\"\n [elderDense]=\"dense\">\n\n <button matPrefix mat-icon-button type=\"button\"\n [elderOverlayTrigger]=\"searchPanel\" (click)=\"blurFocus($event)\"\n >\n <mat-icon>search</mat-icon>\n </button>\n\n <input matInput type=\"text\" [name]=\"name\" [placeholder]=\"placeholder\" #search cdkFocusInitial\n ngModel\n elderSearchInput [elderSearchInputKey]=\"queryKey\" #searchInput=\"elderSearchInput\"\n [autocomplete]=\"(autoPanel && overlayState.hasOverlay) ? 'off' : autocomplete\"\n [elderOverlayOrigin]=\"searchPanel\"\n [elderOverlayTrigger]=\"searchPanel\"\n [elderOverlayTriggerType]=\"'focus'\"\n [elderOverlayTriggerEnabled]=\"autoPanel && overlayState.hasOverlay && (searchInput?.state$ | async)?.pristine\"\n >\n <mat-hint *ngIf=\"hint\">{{hint}}</mat-hint>\n\n <div class=\"layout-row\" matSuffix *ngIf=\"searchModel.userDefinedAttributes$ | async as userDefinedFilters\">\n\n <button mat-icon-button type=\"button\"\n *ngIf=\"userDefinedFilters.length > 0\"\n (click)=\"clearSearch($event)\"\n name=\"clear\" aria-label=\"Clear\">\n <mat-icon>close</mat-icon>\n </button>\n\n <button mat-icon-button type=\"button\"\n *ngIf=\"overlayState.hasOverlay\" name=\"openPanel\"\n [elderOverlayTrigger]=\"searchPanel\" (click)=\"blurFocus($event)\">\n <mat-icon\n [matBadge]=\"userDefinedFilters.length\"\n matBadgeSize=\"small\"\n [matBadgeOverlap]=\"true\"\n [matBadgeHidden]=\"userDefinedFilters.length == 0\"\n matBadgeColor=\"accent\"\n [color]=\"userDefinedFilters.length > 0 ? 'accent' : undefined\"\n >\n filter_list\n </mat-icon>\n </button>\n </div>\n </mat-form-field>\n</div>\n\n\n<!-- Overlay Panel for advanced search -->\n<elder-overlay #searchPanel=\"elderOverlay\">\n <elder-dialog-panel class=\"elder-search-panel-container\">\n\n <!-- Project the users search inputs here -->\n <ng-content select=\"elder-search-panel\"></ng-content>\n\n <div class=\"layout-row place-between-center\">\n <button mat-raised-button type=\"button\" name=\"clear\"\n (click)=\"clearSearch($event)\">{{'context.reset' | translate}}\n </button>\n\n <button mat-raised-button type=\"button\" name=\"ok\" color=\"primary\"\n (click)=\"searchPanel.closeOverlay()\">Ok\n </button>\n </div>\n </elder-dialog-panel>\n</elder-overlay>\n", styles: [".elder-search-box-field{margin-top:4px;margin-bottom:4px}.elder-search-panel-container{min-width:250px}\n"] }]
27029
+ args: [{ selector: 'elder-search-box', exportAs: 'elderSearchBox', host: { 'class': 'elder-form-field-host' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"layout-row place-stretch-center full flex\" style=\"overflow: hidden\">\n <mat-form-field\n *ngIf=\"overlayState$ | async as overlayState\"\n [appearance]=\"appearance\"\n class=\"elder-search-box-field flex-auto\" subscriptSizing=\"dynamic\"\n [elderDense]=\"dense\">\n\n <button matPrefix mat-icon-button type=\"button\"\n [elderOverlayTrigger]=\"searchPanel\" (click)=\"blurFocus($event)\"\n >\n <mat-icon>search</mat-icon>\n </button>\n\n <input matInput type=\"text\" [name]=\"name\" [placeholder]=\"placeholder\" #search cdkFocusInitial\n ngModel\n elderSearchInput [elderSearchInputKey]=\"queryKey\" #searchInput=\"elderSearchInput\"\n [autocomplete]=\"(autoPanel && overlayState.hasOverlay) ? 'off' : autocomplete\"\n [elderOverlayOrigin]=\"searchPanel\"\n [elderOverlayTrigger]=\"searchPanel\"\n [elderOverlayTriggerType]=\"'focus'\"\n [elderOverlayTriggerEnabled]=\"autoPanel && overlayState.hasOverlay && (searchInput?.state$ | async)?.pristine\"\n >\n <mat-hint *ngIf=\"hint\">{{hint}}</mat-hint>\n\n <div class=\"layout-row\" matSuffix *ngIf=\"userFilters$ | async as userDefinedFilters\">\n\n <button mat-icon-button type=\"button\"\n *ngIf=\"userDefinedFilters.length > 0\"\n (click)=\"clearSearch($event)\"\n name=\"clear\" aria-label=\"Clear\">\n <mat-icon>close</mat-icon>\n </button>\n\n <button mat-icon-button type=\"button\"\n *ngIf=\"overlayState.hasOverlay\" name=\"openPanel\"\n [elderOverlayTrigger]=\"searchPanel\" (click)=\"blurFocus($event)\">\n <mat-icon\n [matBadge]=\"userDefinedFilters.length\"\n matBadgeSize=\"small\"\n [matBadgeOverlap]=\"true\"\n [matBadgeHidden]=\"userDefinedFilters.length === 0\"\n matBadgeColor=\"accent\"\n [color]=\"userDefinedFilters.length > 0 ? 'accent' : undefined\"\n >\n filter_list\n </mat-icon>\n </button>\n </div>\n </mat-form-field>\n</div>\n\n\n<!-- Overlay Panel for advanced search -->\n<elder-overlay #searchPanel=\"elderOverlay\">\n <elder-dialog-panel class=\"elder-search-panel-container\">\n\n <!-- Project the users search inputs here -->\n <ng-content select=\"elder-search-panel\"></ng-content>\n\n <div class=\"layout-row place-between-center\">\n <button mat-raised-button type=\"button\" name=\"clear\"\n (click)=\"clearSearch($event)\">{{'context.reset' | translate}}\n </button>\n\n <button mat-raised-button type=\"button\" name=\"ok\" color=\"primary\"\n (click)=\"searchPanel.closeOverlay()\">Ok\n </button>\n </div>\n </elder-dialog-panel>\n</elder-overlay>\n", styles: [".elder-search-box-field{margin-top:4px;margin-bottom:4px}.elder-search-panel-container{min-width:250px}\n"] }]
27009
27030
  }], ctorParameters: function () { return [{ type: ElderSearchContextDirective }]; }, propDecorators: { search: [{
27010
27031
  type: ViewChild,
27011
27032
  args: ['search']