Merge remote-tracking branch 'origin/dev' into dev
All checks were successful
Build and Deploy / test-backend (push) Successful in 31s
PR Checks / prettier-autofix (pull_request) Successful in 10s
Build and Deploy / test-frontend (push) Successful in 1m6s
PR Checks / security-sast (pull_request) Successful in 31s
PR Checks / test-backend (pull_request) Successful in 28s
Build and Deploy / build-and-push (push) Successful in 30s
PR Checks / test-frontend (pull_request) Successful in 1m5s
Build and Deploy / deploy (push) Successful in 24s

This commit is contained in:
2026-03-13 17:41:55 +01:00
10 changed files with 53 additions and 23 deletions

View File

@@ -130,7 +130,9 @@
<div class="cart-line-copy">
<strong>{{ cartItemName(item) }}</strong>
@if (cartItemVariant(item); as variant) {
<span class="cart-line-meta">{{ variant | translate }}</span>
<span class="cart-line-meta">{{
variant | translate
}}</span>
}
@if (cartItemColor(item); as color) {
<span class="cart-line-color">

View File

@@ -59,9 +59,11 @@ export class SeoService {
applyPageSeo(override: PageSeoOverride): void {
const cleanPath = this.getCleanPath(this.router.url);
const lang = this.resolveLangFromPath(cleanPath);
const title = this.asString(override.title) ?? this.defaultTitleByLang[lang];
const title =
this.asString(override.title) ?? this.defaultTitleByLang[lang];
const description =
this.asString(override.description) ?? this.defaultDescriptionByLang[lang];
this.asString(override.description) ??
this.defaultDescriptionByLang[lang];
const robots = this.asString(override.robots) ?? 'index, follow';
const ogTitle = this.asString(override.ogTitle) ?? title;
const ogDescription = this.asString(override.ogDescription) ?? description;
@@ -135,7 +137,11 @@ export class SeoService {
): string | undefined {
const mapKey = `${key}ByLang`;
const localized = routeData[mapKey];
if (localized && typeof localized === 'object' && !Array.isArray(localized)) {
if (
localized &&
typeof localized === 'object' &&
!Array.isArray(localized)
) {
const mapped = localized as SeoMap;
const byLang = this.asString(mapped[lang]);
if (byLang) {
@@ -152,7 +158,10 @@ export class SeoService {
private resolveLangFromPath(path: string): SupportedLang {
const firstSegment = path.split('/').filter(Boolean)[0]?.toLowerCase();
if (firstSegment && this.supportedLangs.has(firstSegment as SupportedLang)) {
if (
firstSegment &&
this.supportedLangs.has(firstSegment as SupportedLang)
) {
return firstSegment as SupportedLang;
}
return 'it';

View File

@@ -1343,7 +1343,9 @@ export class AdminShopComponent implements OnInit, OnDestroy {
seoTitleEn: this.optionalValue(this.categoryForm.seoTitles['en']),
seoTitleDe: this.optionalValue(this.categoryForm.seoTitles['de']),
seoTitleFr: this.optionalValue(this.categoryForm.seoTitles['fr']),
seoDescription: this.optionalValue(this.categoryForm.seoDescriptions['it']),
seoDescription: this.optionalValue(
this.categoryForm.seoDescriptions['it'],
),
seoDescriptionIt: this.optionalValue(
this.categoryForm.seoDescriptions['it'],
),

View File

@@ -239,7 +239,8 @@
<div class="order-item-meta">
<span
>{{ "CHECKOUT.QTY" | translate }}: {{ item.quantity }}</span
>{{ "CHECKOUT.QTY" | translate }}:
{{ item.quantity }}</span
>
<span *ngIf="showItemMaterial(item)">
{{ "CHECKOUT.MATERIAL" | translate }}:

View File

@@ -20,7 +20,9 @@
}}</a>
@for (crumb of p.breadcrumbs; track crumb.id) {
<span class="breadcrumbs__separator">/</span>
<a class="breadcrumbs__item" [routerLink]="categoryLink(crumb.slug)"
<a
class="breadcrumbs__item"
[routerLink]="categoryLink(crumb.slug)"
>{{ crumb.name }}</a
>
}
@@ -143,12 +145,15 @@
<span>{{ selectedMaterial()?.label }}</span>
}
@if (
colorLabel(activeVariant) !== selectedMaterial()?.label
colorLabel(activeVariant) !==
selectedMaterial()?.label
) {
@if (selectedMaterial()?.label) {
<span aria-hidden="true">·</span>
}
<span>{{ colorLabel(activeVariant) | translate }}</span>
<span>{{
colorLabel(activeVariant) | translate
}}</span>
}
</p>
}
@@ -174,7 +179,10 @@
</div>
<div class="material-grid">
@for (material of materialOptions(); track material.key) {
@for (
material of materialOptions();
track material.key
) {
<button
type="button"
class="material-option"

View File

@@ -15,10 +15,7 @@ import { TranslateModule, TranslateService } from '@ngx-translate/core';
import { catchError, combineLatest, finalize, of, switchMap, tap } from 'rxjs';
import { SeoService } from '../../core/services/seo.service';
import { LanguageService } from '../../core/services/language.service';
import {
findColorHex,
getColorHex,
} from '../../core/constants/colors.const';
import { findColorHex, getColorHex } from '../../core/constants/colors.const';
import { AppButtonComponent } from '../../shared/components/app-button/app-button.component';
import { AppCardComponent } from '../../shared/components/app-card/app-card.component';
import { StlViewerComponent } from '../../shared/components/stl-viewer/stl-viewer.component';
@@ -381,7 +378,9 @@ export class ProductDetailComponent {
}
colorLabel(variant: ShopProductVariantOption): string {
return variant.colorLabel || variant.colorName || variant.variantLabel || '-';
return (
variant.colorLabel || variant.colorName || variant.variantLabel || '-'
);
}
colorHex(variant: ShopProductVariantOption | null | undefined): string {

View File

@@ -84,7 +84,9 @@
<div class="cart-line-copy">
<strong>{{ cartItemName(item) }}</strong>
@if (cartItemVariant(item); as variant) {
<span class="cart-line-meta">{{ variant | translate }}</span>
<span class="cart-line-meta">{{
variant | translate
}}</span>
}
@if (cartItemColor(item); as color) {
<span class="cart-line-color">

View File

@@ -1,4 +1,11 @@
import { Component, input, output, signal, computed, inject } from '@angular/core';
import {
Component,
input,
output,
signal,
computed,
inject,
} from '@angular/core';
import { CommonModule } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import {