byTypesAndFilter impl
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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>> {
|
||||
|
||||
Reference in New Issue
Block a user