From 055cfb67d38b3b3941ddde8387157d93510b10a9 Mon Sep 17 00:00:00 2001 From: Lorenz Hilpert Date: Thu, 12 Jun 2025 14:28:12 +0000 Subject: [PATCH] Merged PR 1861: feat(product-router-link): add shared product router link directive and builder feat(product-router-link): add shared product router link directive and builder Ref: #5111 #5169 --- ...rn-details-order-group-item.component.html | 21 ++++++------ ...turn-details-order-group-item.component.ts | 2 ++ ...rn-process-product-question.component.html | 1 + ...turn-process-product-question.component.ts | 2 ++ .../return-product-info.component.html | 1 + .../return-product-info.component.ts | 8 ++++- libs/shared/product-router-link/README.md | 7 ++++ .../product-router-link/eslint.config.mjs | 34 +++++++++++++++++++ .../shared/product-router-link/jest.config.ts | 21 ++++++++++++ libs/shared/product-router-link/project.json | 20 +++++++++++ libs/shared/product-router-link/src/index.ts | 1 + .../product-router-link/src/lib/index.ts | 6 ++++ .../src/lib/product-router-link.directive.ts | 24 +++++++++++++ .../src/lib/product-router-link.providers.ts | 29 ++++++++++++++++ .../src/lib/product-router-link.types.ts | 7 ++++ .../product-router-link/src/test-setup.ts | 6 ++++ libs/shared/product-router-link/tsconfig.json | 28 +++++++++++++++ .../product-router-link/tsconfig.lib.json | 17 ++++++++++ .../product-router-link/tsconfig.spec.json | 16 +++++++++ tsconfig.base.json | 3 ++ 20 files changed, 242 insertions(+), 12 deletions(-) create mode 100644 libs/shared/product-router-link/README.md create mode 100644 libs/shared/product-router-link/eslint.config.mjs create mode 100644 libs/shared/product-router-link/jest.config.ts create mode 100644 libs/shared/product-router-link/project.json create mode 100644 libs/shared/product-router-link/src/index.ts create mode 100644 libs/shared/product-router-link/src/lib/index.ts create mode 100644 libs/shared/product-router-link/src/lib/product-router-link.directive.ts create mode 100644 libs/shared/product-router-link/src/lib/product-router-link.providers.ts create mode 100644 libs/shared/product-router-link/src/lib/product-router-link.types.ts create mode 100644 libs/shared/product-router-link/src/test-setup.ts create mode 100644 libs/shared/product-router-link/tsconfig.json create mode 100644 libs/shared/product-router-link/tsconfig.lib.json create mode 100644 libs/shared/product-router-link/tsconfig.spec.json diff --git a/libs/oms/feature/return-details/src/lib/return-details-order-group-item/return-details-order-group-item.component.html b/libs/oms/feature/return-details/src/lib/return-details-order-group-item/return-details-order-group-item.component.html index ff58e0e4a..ac7c35842 100644 --- a/libs/oms/feature/return-details/src/lib/return-details-order-group-item/return-details-order-group-item.component.html +++ b/libs/oms/feature/return-details/src/lib/return-details-order-group-item/return-details-order-group-item.component.html @@ -5,17 +5,16 @@ [attr.data-which]="i.product.ean" >
- - - +

{{ i.product.contributors }}

diff --git a/libs/oms/feature/return-details/src/lib/return-details-order-group-item/return-details-order-group-item.component.ts b/libs/oms/feature/return-details/src/lib/return-details-order-group-item/return-details-order-group-item.component.ts index 716b7cfbc..f32d7235f 100644 --- a/libs/oms/feature/return-details/src/lib/return-details-order-group-item/return-details-order-group-item.component.ts +++ b/libs/oms/feature/return-details/src/lib/return-details-order-group-item/return-details-order-group-item.component.ts @@ -18,6 +18,7 @@ import { ProductImageDirective } from '@isa/shared/product-image'; import { ItemRowComponent } from '@isa/ui/item-rows'; import { NgIconComponent, provideIcons } from '@ng-icons/core'; import { ReturnDetailsOrderGroupItemControlsComponent } from '../return-details-order-group-item-controls/return-details-order-group-item-controls.component'; +import { ProductRouterLinkDirective } from '@isa/shared/product-router-link'; @Component({ selector: 'oms-feature-return-details-order-group-item', @@ -33,6 +34,7 @@ import { ReturnDetailsOrderGroupItemControlsComponent } from '../return-details- CurrencyPipe, LowerCasePipe, ReturnDetailsOrderGroupItemControlsComponent, + ProductRouterLinkDirective, ], providers: [provideIcons({ ...ProductFormatIconGroup, isaActionClose })], }) diff --git a/libs/oms/feature/return-process/src/lib/return-process-questions/return-process-product-question/return-process-product-question.component.html b/libs/oms/feature/return-process/src/lib/return-process-questions/return-process-product-question/return-process-product-question.component.html index dd65844c0..ad93712d4 100644 --- a/libs/oms/feature/return-process/src/lib/return-process-questions/return-process-product-question/return-process-product-question.component.html +++ b/libs/oms/feature/return-process/src/lib/return-process-questions/return-process-product-question/return-process-product-question.component.html @@ -56,6 +56,7 @@
/src/test-setup.ts'], + coverageDirectory: '../../../coverage/libs/shared/product-router-link', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/libs/shared/product-router-link/project.json b/libs/shared/product-router-link/project.json new file mode 100644 index 000000000..397683461 --- /dev/null +++ b/libs/shared/product-router-link/project.json @@ -0,0 +1,20 @@ +{ + "name": "shared-product-router-link", + "$schema": "../../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "libs/shared/product-router-link/src", + "prefix": "shared", + "projectType": "library", + "tags": [], + "targets": { + "test": { + "executor": "@nx/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "libs/shared/product-router-link/jest.config.ts" + } + }, + "lint": { + "executor": "@nx/eslint:lint" + } + } +} diff --git a/libs/shared/product-router-link/src/index.ts b/libs/shared/product-router-link/src/index.ts new file mode 100644 index 000000000..f41a696fd --- /dev/null +++ b/libs/shared/product-router-link/src/index.ts @@ -0,0 +1 @@ +export * from './lib'; diff --git a/libs/shared/product-router-link/src/lib/index.ts b/libs/shared/product-router-link/src/lib/index.ts new file mode 100644 index 000000000..542611718 --- /dev/null +++ b/libs/shared/product-router-link/src/lib/index.ts @@ -0,0 +1,6 @@ +export { ProductRouterLinkDirective } from './product-router-link.directive'; +export { ProductRouterLinkBuilder } from './product-router-link.types'; +export { + PRODUCT_ROUTER_LINK_BUILDER, + provideProductRouterLinkBuilder, +} from './product-router-link.providers'; diff --git a/libs/shared/product-router-link/src/lib/product-router-link.directive.ts b/libs/shared/product-router-link/src/lib/product-router-link.directive.ts new file mode 100644 index 000000000..9deb2b87d --- /dev/null +++ b/libs/shared/product-router-link/src/lib/product-router-link.directive.ts @@ -0,0 +1,24 @@ +import { Directive, effect, inject, input } from '@angular/core'; +import { RouterLink } from '@angular/router'; +import { PRODUCT_ROUTER_LINK_BUILDER } from './product-router-link.providers'; + +@Directive({ + selector: '[sharedProductRouterLink]', + host: { + class: 'cursor-pointer', + }, +}) +export class ProductRouterLinkDirective extends RouterLink { + #builder = inject(PRODUCT_ROUTER_LINK_BUILDER); + + ean = input.required(); + + urlEffect = effect(async () => { + const ean = this.ean(); + if (!ean) { + return; + } + const url = await this.#builder(ean); + this.routerLink = url; + }); +} diff --git a/libs/shared/product-router-link/src/lib/product-router-link.providers.ts b/libs/shared/product-router-link/src/lib/product-router-link.providers.ts new file mode 100644 index 000000000..0ddf3eca2 --- /dev/null +++ b/libs/shared/product-router-link/src/lib/product-router-link.providers.ts @@ -0,0 +1,29 @@ +import { InjectionToken, Provider } from '@angular/core'; +import { ProductRouterLinkBuilder } from './product-router-link.types'; + +/** + * Injection token for the product router link builder function. + * Provides a default implementation that builds a URL in the format: + * `/kunde/{timestamp}/product/details/{ean}/ean` + */ +export const PRODUCT_ROUTER_LINK_BUILDER = + new InjectionToken('PRODUCT_ROUTER_LINK_BUILDER', { + factory: () => (ean: string) => + `/kunde/${Date.now()}/product/details/${ean}/ean`, + }); + +/** + * Provides a custom implementation of the product router link builder. + * @param builder Custom function to build product URLs from EANs + * @returns Provider array to be included in the application's providers + */ +export function provideProductRouterLinkBuilder( + builder: ProductRouterLinkBuilder, +): Provider[] { + return [ + { + provide: PRODUCT_ROUTER_LINK_BUILDER, + useValue: builder, + }, + ]; +} diff --git a/libs/shared/product-router-link/src/lib/product-router-link.types.ts b/libs/shared/product-router-link/src/lib/product-router-link.types.ts new file mode 100644 index 000000000..a58969e6e --- /dev/null +++ b/libs/shared/product-router-link/src/lib/product-router-link.types.ts @@ -0,0 +1,7 @@ +/** + * Represents a function that builds a URL for a product based on its EAN. + * Can return either a Promise of a string or a string directly. + */ +export type ProductRouterLinkBuilder = ( + ean: string, +) => PromiseLike | string; diff --git a/libs/shared/product-router-link/src/test-setup.ts b/libs/shared/product-router-link/src/test-setup.ts new file mode 100644 index 000000000..ea414013f --- /dev/null +++ b/libs/shared/product-router-link/src/test-setup.ts @@ -0,0 +1,6 @@ +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv({ + errorOnUnknownElements: true, + errorOnUnknownProperties: true, +}); diff --git a/libs/shared/product-router-link/tsconfig.json b/libs/shared/product-router-link/tsconfig.json new file mode 100644 index 000000000..fde35eab0 --- /dev/null +++ b/libs/shared/product-router-link/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "es2022", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ], + "extends": "../../../tsconfig.base.json", + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/libs/shared/product-router-link/tsconfig.lib.json b/libs/shared/product-router-link/tsconfig.lib.json new file mode 100644 index 000000000..9b49be758 --- /dev/null +++ b/libs/shared/product-router-link/tsconfig.lib.json @@ -0,0 +1,17 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": [] + }, + "exclude": [ + "src/**/*.spec.ts", + "src/test-setup.ts", + "jest.config.ts", + "src/**/*.test.ts" + ], + "include": ["src/**/*.ts"] +} diff --git a/libs/shared/product-router-link/tsconfig.spec.json b/libs/shared/product-router-link/tsconfig.spec.json new file mode 100644 index 000000000..f858ef78c --- /dev/null +++ b/libs/shared/product-router-link/tsconfig.spec.json @@ -0,0 +1,16 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "module": "commonjs", + "target": "es2016", + "types": ["jest", "node"] + }, + "files": ["src/test-setup.ts"], + "include": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/tsconfig.base.json b/tsconfig.base.json index 38cb11cb7..ad1f2a150 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -72,6 +72,9 @@ "@isa/oms/utils/translation": ["libs/oms/utils/translation/src/index.ts"], "@isa/shared/filter": ["libs/shared/filter/src/index.ts"], "@isa/shared/product-image": ["libs/shared/product-image/src/index.ts"], + "@isa/shared/product-router-link": [ + "libs/shared/product-router-link/src/index.ts" + ], "@isa/ui/buttons": ["libs/ui/buttons/src/index.ts"], "@isa/ui/datepicker": ["libs/ui/datepicker/src/index.ts"], "@isa/ui/dialog": ["libs/ui/dialog/src/index.ts"],