From bc9306e21983bddd46c09aba0d21d031b4a7bd0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Sun, 3 Mar 2024 19:24:42 +0100 Subject: [PATCH] byTypesAndFilter impl --- .../base-extensions-initializer.controller.ts | 22 ++++++++++--- .../registry/extension.registry.ts | 31 ++++++++++++++++++- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-initializer.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-initializer.controller.ts index 0769bb67c5..293a91f3d5 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-initializer.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extensions-initializer.controller.ts @@ -59,11 +59,23 @@ export abstract class UmbBaseExtensionsInitializer< this.#onChange = onChange; } protected _init() { - let source = Array.isArray(this.#type) - ? this.#extensionRegistry.byTypes(this.#type as string[]) - : this.#extensionRegistry.byType(this.#type as ManifestTypeName); - if (this.#filter) { - source = createObservablePart(source, (extensions: Array) => extensions.filter(this.#filter!)); + let source; + + if (Array.isArray(this.#type)) { + if (this.#filter) { + source = this.#extensionRegistry.byTypesAndFilter(this.#type as string[], this.#filter); + } else { + source = this.#extensionRegistry.byTypes(this.#type as string[]); + } + } else { + if (this.#filter) { + source = this.#extensionRegistry.byTypeAndFilter( + this.#type as ManifestTypeName, + this.#filter, + ); + } else { + source = this.#extensionRegistry.byType(this.#type as ManifestTypeName); + } } this.observe(source, this.#gotManifests, '_observeManifests') as any; } diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts index 4bbda726be..613000e663 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/registry/extension.registry.ts @@ -341,6 +341,35 @@ export class UmbExtensionRegistry< ) as Observable>; } + /** + * 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} - The types of the extensions to get. + * @param filter {(ext: T): void} - The filter method to use to filter the extensions + * @returns {Observable>} - An observable of the extensions that matches the type and filter method + */ + byTypesAndFilter( + types: string[], + filter: (ext: ExtensionTypes) => boolean, + ): Observable> { + 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, + ), + distinctUntilChanged(extensionArrayMemoization), + ), + this.#kindsOfTypes(types), + ]).pipe( + map(this.#mergeExtensionsWithKinds), + distinctUntilChanged(extensionAndKindMatchArrayMemoization), + ) as Observable>; + } + /** * 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} - The types of the extensions to get. + * @param types {Array} - The types of the extensions to get. * @returns {Observable} - An observable of the extensions that matches the types. */ byTypes(types: string[]): Observable> {