diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers.component.ts index 04d5f464492..c8463f6bdcb 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers.component.ts @@ -6,9 +6,11 @@ * found in the LICENSE file at https://angular.io/license */ -import {NgForOf, NgIf} from '@angular/common'; -import {Component, inject, Input} from '@angular/core'; +import {Component, computed, inject, Input, signal} from '@angular/core'; +import {MatFormFieldModule} from '@angular/material/form-field'; import {MatIconModule} from '@angular/material/icon'; +import {MatInputModule} from '@angular/material/input'; +import {MatSelectModule} from '@angular/material/select'; import {MatTableModule} from '@angular/material/table'; import {MatTooltipModule} from '@angular/material/tooltip'; import {Events, MessageBus, SerializedInjector, SerializedProviderRecord} from 'protocol'; @@ -19,8 +21,32 @@ import {Events, MessageBus, SerializedInjector, SerializedProviderRecord} from '

Providers for {{ injector?.name }}

-
- + @if (injector){ +
+ + Search by token + + close + + + Search by type + + None + @for (type of providerTypes; track type) { + {{providerTypeToLabel[type]}} + } + + + + @if(visibleProviders().length > 0){ +
@@ -32,7 +58,7 @@ import {Events, MessageBus, SerializedInjector, SerializedProviderRecord} from ' @if (provider.type === 'multi') { multi (x{{ provider.index.length }}) } @else { - {{typeToLabel[provider.type]}} + {{providerTypeToLabel[provider.type]}} } @@ -50,7 +76,10 @@ import {Events, MessageBus, SerializedInjector, SerializedProviderRecord} from '

Token

{{provider.token}}
+ } +
+ } `, styles: [` .select { @@ -62,6 +91,10 @@ import {Events, MessageBus, SerializedInjector, SerializedProviderRecord} from ' padding: 16px; } + .form-field-spacer { + margin: 0 4px 0 4px; + } + table { width: 100%; } @@ -108,13 +141,31 @@ import {Events, MessageBus, SerializedInjector, SerializedProviderRecord} from ' } `], standalone: true, - imports: [NgIf, NgForOf, MatTableModule, MatIconModule, MatTooltipModule], + imports: [ + MatTableModule, MatIconModule, MatTooltipModule, MatInputModule, MatSelectModule, + MatFormFieldModule + ], }) export class InjectorProvidersComponent { @Input() injector: SerializedInjector; @Input() providers: SerializedProviderRecord[] = []; - typeToLabel = { + searchToken = signal(''); + searchType = signal(''); + visibleProviders = computed(() => { + const searchToken = this.searchToken().toLowerCase(); + const searchType = this.searchType(); + + const predicates: ((provider: SerializedProviderRecord) => boolean)[] = []; + searchToken && + predicates.push((provider) => provider.token.toLowerCase().includes(searchToken)); + searchType && predicates.push((provider) => provider.type === searchType); + + return this.providers.filter( + (provider) => predicates.every((predicate) => predicate(provider))); + }); + + providerTypeToLabel = { type: 'Type', existing: 'useExisting', factory: 'useFactory', @@ -122,6 +173,8 @@ export class InjectorProvidersComponent { value: 'useValue', }; + providerTypes = Object.keys(this.providerTypeToLabel); + messageBus = inject(MessageBus); select(row: SerializedProviderRecord) {