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 }}
-
-
0" mat-table [dataSource]="providers" class="mat-elevation-z4">
+ @if (injector){
+
+
+ Search by token
+
+ close
+
+
+ Search by type
+
+ None
+ @for (type of providerTypes; track type) {
+ {{providerTypeToLabel[type]}}
+ }
+
+
+
+ @if(visibleProviders().length > 0){
+
Token |
{{provider.token}} |
@@ -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 '
+ }
+
+ }
`,
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) {