byTypesAndFilter impl

This commit is contained in:
Niels Lyngsø
2024-03-03 19:24:42 +01:00
parent bc53015cd1
commit bc9306e219
2 changed files with 47 additions and 6 deletions

View File

@@ -59,11 +59,23 @@ export abstract class UmbBaseExtensionsInitializer<
this.#onChange = onChange;
}
protected _init() {
let source = Array.isArray(this.#type)
? this.#extensionRegistry.byTypes<ManifestType>(this.#type as string[])
: this.#extensionRegistry.byType<ManifestTypeName, ManifestType>(this.#type as ManifestTypeName);
if (this.#filter) {
source = createObservablePart(source, (extensions: Array<ManifestType>) => extensions.filter(this.#filter!));
let source;
if (Array.isArray(this.#type)) {
if (this.#filter) {
source = this.#extensionRegistry.byTypesAndFilter<ManifestType>(this.#type as string[], this.#filter);
} else {
source = this.#extensionRegistry.byTypes<ManifestType>(this.#type as string[]);
}
} else {
if (this.#filter) {
source = this.#extensionRegistry.byTypeAndFilter<ManifestTypeName, ManifestType>(
this.#type as ManifestTypeName,
this.#filter,
);
} else {
source = this.#extensionRegistry.byType<ManifestTypeName, ManifestType>(this.#type as ManifestTypeName);
}
}
this.observe(source, this.#gotManifests, '_observeManifests') as any;
}

View File

@@ -341,6 +341,35 @@ export class UmbExtensionRegistry<
) as Observable<Array<T>>;
}
/**
* Get an observable of extensions by types and a given filter method.
* This will return the all extensions that matches the types and which filter method returns true.
* The filter method will be called for each extension manifest of the given types, and the first argument to it is the extension manifest.
* @param types {Array<string>} - The types of the extensions to get.
* @param filter {(ext: T): void} - The filter method to use to filter the extensions
* @returns {Observable<Array<T>>} - An observable of the extensions that matches the type and filter method
*/
byTypesAndFilter<ExtensionTypes extends ManifestBase = ManifestBase>(
types: string[],
filter: (ext: ExtensionTypes) => boolean,
): Observable<Array<ExtensionTypes>> {
return combineLatest([
this.extensions.pipe(
map(
(exts) =>
exts.filter(
(ext) => types.indexOf(ext.type) !== -1 && filter(ext as unknown as ExtensionTypes),
) as unknown as Array<ExtensionTypes>,
),
distinctUntilChanged(extensionArrayMemoization),
),
this.#kindsOfTypes(types),
]).pipe(
map(this.#mergeExtensionsWithKinds),
distinctUntilChanged(extensionAndKindMatchArrayMemoization),
) as Observable<Array<ExtensionTypes>>;
}
/**
* Get an observable that provides extensions matching the given type.
* @param type {string} - The type of the extensions to get.
@@ -361,7 +390,7 @@ export class UmbExtensionRegistry<
/**
* Get an observable that provides extensions matching given types.
* @param type {Array<string>} - The types of the extensions to get.
* @param types {Array<string>} - The types of the extensions to get.
* @returns {Observable<T | undefined>} - An observable of the extensions that matches the types.
*/
byTypes<ExtensionTypes extends ManifestBase = ManifestBase>(types: string[]): Observable<Array<ExtensionTypes>> {